ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTg1YjEwLi4wMDAwMDAwCi0tLSBhL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj1cCi0JYWRkcnRvbmFtZS5jXAotCWFmLmNcCi0JY3BhY2suY1wKLQlnbXBscy5jXAotCW91aS5jXAotCWdtdDJsb2NhbC5jXAotCWlwcHJvdG8uY1wKLQlubHBpZC5jXAotCWwydnBuLmNcCi0JbWFjaGRlcC5jXAotCXBhcnNlbmZzZmguY1wKLQlwcmludC04MDJfMTEuY1wKLQlwcmludC1hcDEzOTQuY1wKLQlwcmludC1haC5jXAotCXByaW50LWFyY25ldC5jXAotCXByaW50LWFvZHYuY1wKLQlwcmludC1hcnAuY1wKLQlwcmludC1hc2NpaS5jXAotCXByaW50LWF0YWxrLmNcCi0JcHJpbnQtYXRtLmNcCi0JcHJpbnQtYmVlcC5jXAotCXByaW50LWJmZC5jXAotCXByaW50LWJncC5jXAotCXByaW50LWJvb3RwLmNcCi0JcHJpbnQtY2RwLmNcCi0JcHJpbnQtY2hkbGMuY1wKLQlwcmludC1jaXAuY1wKLQlwcmludC1jbmZwLmNcCi0JcHJpbnQtZGNjcC5jXAotCXByaW50LWRoY3A2LmNcCi0JcHJpbnQtZGVjbmV0LmNcCi0JcHJpbnQtZG9tYWluLmNcCi0JcHJpbnQtZHZtcnAuY1wKLQlwcmludC1lbmMuY1wKLQlwcmludC1lZ3AuY1wKLQlwcmludC1lYXAuY1wKLQlwcmludC1laWdycC5jXAotCXByaW50LWVzcC5jXAotCXByaW50LWV0aGVyLmNcCi0JcHJpbnQtZmRkaS5jXAotCXByaW50LWZyLmNcCi0JcHJpbnQtZnJhZzYuY1wKLQlwcmludC1ncmUuY1wKLQlwcmludC1oc3JwLmNcCi0JcHJpbnQtaWNtcC5jXAotCXByaW50LWljbXA2LmNcCi0JcHJpbnQtaWdtcC5jXAotCXByaW50LWlncnAuY1wKLQlwcmludC1pcC5jXAotCXByaW50LWlwNi5jXAotCXByaW50LWlwNm9wdHMuY1wKLQlwcmludC1pcGNvbXAuY1wKLQlwcmludC1pcGZjLmNcCi0JcHJpbnQtaXB4LmNcCi0JcHJpbnQtaXNha21wLmNcCi0JcHJpbnQtaXNvY2xucy5jXAotCXByaW50LWp1bmlwZXIuY1wKLQlwcmludC1rcmIuY1wKLQlwcmludC1sMnRwLmNcCi0JcHJpbnQtbGFuZS5jXAotCXByaW50LWxkcC5jXAotCXByaW50LWxsYy5jXAotCXByaW50LWxtcC5jXAotCXByaW50LWxzcHBpbmcuY1wKLQlwcmludC1sd3Jlcy5jXAotCXByaW50LW1vYmlsZS5jXAotCXByaW50LW1vYmlsaXR5LmNcCi0JcHJpbnQtbXBscy5jXAotCXByaW50LW1zZHAuY1wKLQlwcmludC1uZnMuY1wKLQlwcmludC1udHAuY1wKLQlwcmludC1udWxsLmNcCi0JcHJpbnQtb2xzci5jXAotCXByaW50LW9zcGYuY1wKLQlwcmludC1vc3BmNi5jXAotCXByaW50LXBnbS5jXAotCXByaW50LXBpbS5jXAotCXByaW50LXBwcC5jXAotCXByaW50LXBwcG9lLmNcCi0JcHJpbnQtcHB0cC5jXAotCXByaW50LXJhZGl1cy5jXAotCXByaW50LXJhdy5jXAotCXByaW50LXJpcC5jXAotCXByaW50LXJpcG5nLmNcCi0JcHJpbnQtcnN2cC5jXAotCXByaW50LXJ0Ni5jXAotCXByaW50LXJ4LmNcCi0JcHJpbnQtc2N0cC5jXAotCXByaW50LXNpcC5jXAotCXByaW50LXNsLmNcCi0JcHJpbnQtc2xsLmNcCi0JcHJpbnQtc2xvdy5jXAotCXByaW50LXNubXAuY1wKLQlwcmludC1zdHAuY1wKLQlwcmludC1zdW5hdG0uY1wKLQlwcmludC1zdW5ycGMuY1wKLQlwcmludC1zeW1hbnRlYy5jXAotCXByaW50LXN5c2xvZy5jXAotCXByaW50LXRjcC5jXAotCXByaW50LXRlbG5ldC5jXAotCXByaW50LXRmdHAuY1wKLQlwcmludC10aW1lZC5jXAotCXByaW50LXRva2VuLmNcCi0JcHJpbnQtdWRwLmNcCi0JcHJpbnQtdmpjLmNcCi0JcHJpbnQtdnJycC5jXAotCXByaW50LXdiLmNcCi0JcHJpbnQtemVwaHlyLmNcCi0Jc2V0c2lnbmFsLmNcCi0JdGNwZHVtcC5jXAotCXV0aWwuY1wKLQl2ZXJzaW9uLmNcCi0JcHJpbnQtc21iLmNcCi0Jc21idXRpbC5jXAotCW1pc3Npbmcvc3RybGNhdC5jXAotCW1pc3Npbmcvc3RybGNweS5jCi0KLUxPQ0FMX0NGTEFHUzo9LU8yIC1nCi1MT0NBTF9DRkxBR1MrPS1ESEFWRV9DT05GSUdfSCAtRF9VXz0iX19hdHRyaWJ1dGVfXygodW51c2VkKSkiCi0KLUxPQ0FMX0NfSU5DTFVERVMrPVwKLQkkKExPQ0FMX1BBVEgpL21pc3NpbmdcCi0JZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlXAotCWV4dGVybmFsL2xpYnBjYXAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUys9bGlic3NsCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMrPWxpYnBjYXAKLQotTE9DQUxfTU9EVUxFX1RBR1M6PXRlc3RzCi0KLUxPQ0FMX01PRFVMRTo9dGNwZHVtcAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL0NIQU5HRVMgYi9DSEFOR0VTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI5ZTMwLi4wMDAwMDAwCi0tLSBhL0NIQU5HRVMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzggKzAsMCBAQAotJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvQ0hBTkdFUyx2IDEuODcuMi4xNyAyMDA3LzA5LzEzIDEzOjM5OjQ0IGtlbiBFeHAgJAotCi1Nb24uCVNlcHRlbWJlciAxMCwgMjAwNy4gIGtlbkB4ZWxlcmFuY2UuY29tLiAgU3VtbWFyeSBmb3IgMC45LjggdGNwZHVtcCByZWxlYXNlCi0JUmV3b3JrIEFSUCBwcmludGVyCi0JUmV3b3JrIE9TUEZ2MyBwcmludGVyCi0JQWRkIHN1cHBvcnQgZm9yIEZyYW1lLVJlbGF5IEFSUAotCURlY29kZSBESENQIE9wdGlvbiAxMjEgKFJGQyAzNDQyIENsYXNzbGVzcyBTdGF0aWMgUm91dGUpCi0JRGVjb2RlIERIQ1AgT3B0aW9uIDI0OSAoTVMgQ2xhc3NsZXNzIFN0YXRpYyBSb3V0ZSkgdGhlIHNhbWUgYXMgT3B0aW9uIDEyMQotCVRMVjogQWRkIHN1cHBvcnQgZm9yIEp1bmlwZXIgLnBjYXAgZXh0ZW5zaW9ucwotCVByaW50IEVHUCBoZWFkZXIgaW4gbmV3LXdvcmxkLW9yZGVyIHN0eWxlCi0JQ29udmVydGVkIHByaW50LWlzYWttcC5jIHRvIE5FVERJU1NFQ1QKLQlNb3ZlZCBBRiBzcGVjaWZpYyBzdHVmZiBpbnRvIGFmLmgKLQlUZXN0IHN1YnN5c3RlbSBub3cgdGFibGUgZHJpdmVuLCBhbmQgc2F2ZXMgb3V0cHV0cyBhbmQgZGlmZnMgdG8gb25lIHBsYWNlCi0gICAgICAgIFJlcXVpcmUgPG5ldC9wZnZhci5oPiBmb3IgcGYgZGVmaW5pdGlvbnMgLSBhbGxvd3MgcmVhZGluZyBvZiBwZmxvZyBmb3JtYXR0ZWQgCi0gICAgICAgICBsaWJwY2FwIGZpbGVzIG9uIGFuIE9TIG90aGVyIHRoYW4gd2hlcmUgdGhlIGZpbGUgd2FzIGdlbmVyYXRlZAotCi1XZWQuCUp1bHkgMjMsIDIwMDcuICBtY3JAeGVsZXJhbmNlLmNvbS4gIFN1bW1hcnkgZm9yIDAuOS43IHRjcGR1bXAgcmVsZWFzZQotCi0gICAgCU5GUzogUHJpbnQgdW5zaWduZWQgdmFsdWVzIGFzIHN1Y2guIAotCVJYOiBwYXJzZSBzYWZlbHkuCi0JQkdQOiBmaXhlcyBmb3IgSVB2Ni1sZXNzIGJ1aWxkcy4KLQk4MDEuMWFnOiB1c2Ugc3RhbmRhcmQgY29kZXBvaW50LgotCXVzZSAvZGV2L2JwZiBvbiBzeXN0ZW1zIHdpdGggc3VjaCBhIGRldmljZS4KLQk4MDIuMTE6IHByaW50IFFvUyBkYXRhLCBhdm9pZCBkaXNzZWN0IG9mIG5vLWRhdGEgZnJhbWUsIGlnbm9yZSBwYWRkaW5nLgotCXNtYjogbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZW4ndCBnb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgY2FwdHVyZWQgZGF0YS4KLQlzbWI6IHNxdWVsY2ggYW4gdW5pbml0aWFsaXplZCBjb21wbGFpbnQgZnJvbSBjb3Zlcml0eS4KLQlORlM6IGZyb20gTmV0QlNEOyBkb24ndCBpbnRlcnByZXQgdGhlIHJlcGx5IGFzIGEgcG9zc2libGUgTkZTIHJlcGx5Ci0JCWlmIGl0IGdvdCBNU0dfREVOSUVELgotCUJHUDogZG9uJ3QgcHJpbnQgVExWIHZhbHVlcyB0aGF0IGRpZG4ndCBmaXQsIGZyb20gd3d3LmRpZ2l0LWxhYnMub3JnLiAKLQlyZXZpc2VkIElOU1RBTEwudHh0IGFib3V0IGxpYnBjYXAgZGVwZW5kYW5jeS4KLQotV2VkLglBcHJpbCAyNSwgMjAwNy4ga2VuQHhlbGVyYW5jZS5jb20uICBTdW1tYXJ5IGZvciAzLjkuNiB0Y3BkdW1wIHJlbGVhc2UKLQlVcGRhdGUgbWFuIHBhZ2UgdG8gcmVmbGVjdCBjaGFuZ2VzIHRvIGxpYnBjYXAKLQlDaGFuZ2VzIHRvIGJvdGggVENQIGFuZCBJUCBQcmludGVyIE91dHB1dAotCUZpeCBhIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIDgwMi4xMSBwcmludGVyCi0JUHJpbnQgYmFzaWMgaW5mbyBhYm91dCBhIGZldyBtb3JlIENpc2NvIExBTiBwcm90b2NvbHMuCi0JbUROUyBjbGVhbnVwCi0JSUNNUCBNUExTIHJld29yayBvZiB0aGUgZXh0ZW5zaW9uIGNvZGUKLQlidWdmaXg6IHVzZSB0aGUgY29ycmVjdCBjb2RlcG9pbnQgZm9yIHRoZSBPU1BGIHNpbXBsZSB0ZXh0IGF1dGggdG9rZW4KLQkgZW50cnksIGFuZCB1c2Ugc2FmZXB1dHMgdG8gcHJpbnQgdGhlIHBhc3N3b3JkLgotCUFkZCBzdXBwb3J0IGluIHBmbG9nIGZvciBhZGRpdGlvbmFsIHZhbHVlcwotCUFkZCBzdXBwb3J0IGZvciBPSUYgUlNWUCBFeHRlbnNpb25zIFVOSSAxLjAgUmV2LiAyIGFuZCBhZGRpdGlvbmFsIFJTVlAgb2JqZWN0cwotCUFkZCBzdXBwb3J0IGZvciB0aGUgTWVzc2FnZS1pZCBOQUNLIGMtdHlwZS4KLQlBZGQgc3VwcG9ydCBmb3IgODAyLjNhaCBsb29wYmFjayBjdHJsIG1zZwotCUFkZCBzdXBwb3J0IGZvciBNdWx0aXBsZS1TVFAgYXMgcGVyIDgwMi4xcwotCUFkZCBzdXBwb3J0IGZvciByYXBpZC1TUFQgYXMgcGVyIDgwMi4xdwotCUFkZCBzdXBwb3J0IGZvciBDRk0gTGluay10cmFjZSBtc2csIExpbmstdHJhY2UtUmVwbHkgbXNnLCAKLQkgU2VuZGVyLUlEIHRsdiwgcHJpdmF0ZSB0bHYsIHBvcnQsIGludGVyZmFjZSBzdGF0dXMKLQlBZGQgc3VwcG9ydCBmb3IgdW5pZGlyZWN0aW9uYWwgbGluayBkZXRlY3Rpb24gYXMgcGVyCi0JIGh0dHA6Ly93d3cuaWV0Zi5vcmcvaW50ZXJuZXQtZHJhZnRzL2RyYWZ0LWZvc2NoaWFuby11ZGxkLTAyLnR4dAotCUFkZCBzdXBwb3J0IGZvciB0aGUgb2xzciBwcm90b2NvbCBhcyBwZXIgUkZDIDM2MjYgcGx1cyB0aGUgTFEgCi0JIGV4dGVuc2lvbnMgZnJvbSBvbHNyLm9yZwotCUFkZCBzdXBwb3J0IGZvciB2YXJpYWJsZS1sZW5ndGggY2hlY2tzdW0gaW4gRENDUCwgYXMgcGVyIHNlY3Rpb24gOSBvZgotCSBSRkMgNDM0MC4KLQlBZGQgc3VwcG9ydCBmb3IgcGVyLVZMQU4gc3Bhbm5pbmcgdHJlZSBhbmQgcGVyLVZMQU4gcmFwaWQgc3Bhbm5pbmcgdHJlZQotCUFkZCBzdXBwb3J0IGZvciBNdWx0aXBsZS1TVFAgYXMgcGVyIDgwMi4xcwotCUFkZCBzdXBwb3J0IGZvciB0aGUgY2lzY28gcHJvcHJpYXRyeSAnZHluYW1pYyB0cnVua2luZyBwcm90b2NvbCcKLQlBZGQgc3VwcG9ydCBmb3IgdGhlIGNpc2NvIHByb3ByaWV0YXJ5IFZUUCBwcm90b2NvbAotCVVwZGF0ZSBkaGNwNiBvcHRpb25zIHRhYmxlIGFzIHBlciBJRVRGIHN0YW5kYXJkaXphdGlvbiBhY3Rpdml0aWVzCi0KLQotVHVlLglTZXB0ZW1iZXIgMTksIDIwMDYuIGtlbkB4ZWxlcmFuY2UuY29tLiBTdW1tYXJ5IGZvciAzLjkuNSB0Y3BkdW1wIHJlbGVhc2UKLQkKLQlGaXggY29tcGlsaW5nIG9uIEFJWCAoLCBhdCBlbmQgb2YgRU5VTSkKLQlVcGRhdGVkIGxpc3Qgb2YgRE5TIFJSIHR5cGVjb2RlcwotCVVzZSBsb2NhbCBFdGhlcm5ldCBkZWZzIG9uIFdJTjMyCi0JQWRkIHN1cHBvcnQgZm9yIEZyYW1lLVJlbGF5IEFSUAotCUZpeGVzIGZvciBjb21waWxpbmcgdW5kZXIgTVNWQysrCi0JQWRkIHN1cHBvcnQgZm9yIHBhcnNpbmcgSnVuaXBlciAucGNhcCBmaWxlcwotCUFkZCBzdXBwb3J0IGZvciBGUkYuMTYgTXVsdGlsaW5rIEZyYW1lLVJlbGF5IChETFRfTUZSKQotCVJld29yayB0aGUgT1NQRnYzIHByaW50ZXIKLQlGaXggcHJpbnRpbmcgZm9yIDQuNEJTRC9OZXRCU0QgTkZTIEZpbGVoYW5kbGVzCi0JQWRkIHN1cHBvcnQgZm9yIENpc2NvIHN0eWxlIE5MUElEIGVuY2Fwc3VsYXRpb24KLQlBZGQgY2lzY28gcHJvcC4gZWlncnAgcmVsYXRlZCwgZXh0ZW5kZWQgY29tbXVuaXRpZXMKLQlBZGQgc3VwcG9ydCBmb3IgQkdQIHNpZ25hbGVkIFZQTFMKLQlDbGVhbnVwIHRoZSBib290cCBwcmludGVyCi0JQWRkIHN1cHBvcnQgZm9yIFBQUCBvdmVyIEZyYW1lLVJlbGF5Ci0JQWRkIHNvbWUgYm91bmRzIGNoZWNraW5nIHRvIHRoZSBJUCBvcHRpb25zIGNvZGUsIGFuZCBjbGVhbiB1cCAKLQkgdGhlIG9wdGlvbnMgb3V0cHV0IGEgYml0LgotCUFkZCBhZGRpdGlvbmFsIG1vZHAgZ3JvdXBzIHRvIElTQUtNUCBwcmludGVyCi0JQWRkIHN1cHBvcnQgZm9yIEFkZHJlc3MtV2l0aGRyYXcgYW5kIExhYmVsLVdpdGhkcmF3IE1zZ3MKLQlBZGQgc3VwcG9ydCBmb3IgdGhlIEJGRCBEaXNjcmltaW5hdG9yIFRMVgotCUZpeGVzIGZvciA2NGJpdCBjb21waWxpbmcKLQlBZGQgc3VwcG9ydCBmb3IgUElNdjIgY2hlY2tzdW0gdmVyaWZpY2F0aW9uCi0JQWRkIHN1cHBvcnQgZm9yIGZ1cnRoZXIgZGlzc2VjdGlvbiBvZiB0aGUgSVBDUCBDb21wcmVzc2lvbiBPcHRpb24KLQlBZGQgc3VwcG9ydCBmb3IgQ2lzY28ncyBwcm9wb3NlZCBWUVAgcHJvdG9jb2wKLQlBZGQgYmFzaWMgc3VwcG9ydCBmb3Iga2V5ZWQgYXV0aGVudGljYXRpb24gVENQIG9wdGlvbgotCUxvdHMgb2YgbWlub3IgY29zbWV0aWMgY2hhbmdlcyB0byBvdXRwdXQgcHJpbnRlcnMKLQotCi1Nb24uIAlTZXB0ZW1iZXIgMTksIDIwMDUuICBrZW5AeGVsZXJhbmNlLmNvbS4gU3VtbWFyeSBmb3IgMy45LjQgdGNwZHVtcCByZWxlYXNlCi0JRGVjb2RlciBzdXBwb3J0IGZvciBtb3JlIEp1bmlwZXIgbGluay1sYXllciB0eXBlcwotCUZpeCBhIHBvdGVudGlhbCBidWZmZXIgb3ZlcmZsb3cgKGFsdGhvdWdoIGl0IGNhbid0IG9jY3VyIGluCi0JCXByYWN0aWNlKS4KLQlGaXggdGhlIGhhbmRsaW5nIG9mIHVua25vd24gbWFuYWdlbWVudCBmcmFtZSB0eXBlcyBpbiB0aGUgODAyLjExCi0JCXByaW50ZXIuCi0JQWRkIEZSRi4xNiBzdXBwb3J0LCBmaXggdmFyaW91cyBGcmFtZSBSZWxheSBidWdzLgotCUFkZCBzdXBwb3J0IGZvciBSU1ZQIGludGVncml0eSBvYmplY3RzLCB1cGRhdGUgZmFzdC1yZXJvdXRlCi0JCW9iamVjdCBwcmludGVyIHRvIGxhdGVzdCBzcGVjLgotCUNsZWFuIHVwIGRvY3VtZW50YXRpb24gb2YgdmxhbiBmaWx0ZXIgZXhwcmVzc2lvbiwgZG9jdW1lbnQgbXBscwotCQlmaWx0ZXIgZXhwcmVzc2lvbi4KLQlEb2N1bWVudCBuZXcgcHBwb2VkIGFuZCBwcHBvZXMgZmlsdGVyIGV4cHJlc3Npb25zLgotCVVwZGF0ZSBkaWZmc2VydmVyLVRFIGNvZGVwb2ludHMgYXMgcGVyIFJGQyA0MTI0LgotCVNwZWxsaW5nIGZpeGVzIGluIElDTVB2Ni4KLQlEb24ndCByZXF1aXJlIGFueSBmaWVsZHMgb3RoZXIgdGhhbiBmbGFncyB0byBiZSBwcmVzZW50IGluIElTLUlTCi0JCXJlc3RhcnQgc2lnbmFsaW5nIFRMVnMsIGFuZCBvbmx5IHByaW50IHRoZSBzeXN0ZW0gSUQgaW4KLQkJdGhvc2UgVExWcyBhcyBzeXN0ZW0gSURzLCBub3QgYXMgbm9kZSBJRHMuCi0JU3VwcG9ydCBmb3IgRENDUC4KLQotVHVlLiAJSnVseSA1LCAyMDA1LiAga2VuQHhlbGVyYW5jZS5jb20uIFN1bW1hcnkgZm9yIDMuOS4zIHRjcGR1bXAgcmVsZWFzZQotCi0JT3B0aW9uIHRvIGNocm9vdCgpIHdoZW4gZHJvcHBpbmcgcHJpdnMKLQlGaXhlcyBmb3IgY29tcGlsaW5nIG9uIG5lYXJseSBldmVyeSBwbGF0Zm9ybSwKLQkJaW5jbHVkaW5nIGltcHJvdmVkIDY0Yml0IHN1cHBvcnQKLQlNYW55IG5ldyB0ZXN0Y2FzZXMKLQlTdXBwb3J0IGZvciBzZW5kaW5nIHBhY2tldHMKLQlNYW55IGNvbXBsaWF0aW9uIGZpeGVzIG9uIG1vc3QgcGxhdGZvcm1zCi0JRml4ZXMgZm9yIHJlY2VudCB2ZXJzaW9uIG9mIEdDQyB0byBlbGltaW5hdGUgd2FybmluZ3MKLQlJbXByb3ZlZCBVbmljb2RlIHN1cHBvcnQKLQotCURlY29kZXJzICYgRExUIENoYW5nZXMsIFVwZGF0ZXMgYW5kIE5ldzoKLQkJQUVTIEVTUCBzdXBwb3J0Ci0JCUp1bmlwZXIgQVRNLCBGUkYuMTUsIEZSRi4xNiwgUFBQb0UsCi0JCQlNTC1GUiwgTUwtUElDLCBNTC1QUFAsIFBMLVBQUCwgTFMtUElDCi0JCQlHR1NOLEVTLE1PTklUT1IsU0VSVklDRVMKLQkJTDJWUE4KLQkJQXhlbnQgUmFwdG9yL1N5bWFudGVjIEZpcmV3YWxsCi0JCVRDUC1NRDUgKFJGQyAyMzg1KQotCQlFU1AtaW4tVURQIChSRkMgMzk0OCkKLQkJQVRNIE9BTQotCQlMTVAsIExNUCBTZXJ2aWNlIERpc2NvdmVyeQotCQlJUCBvdmVyIEZDCi0JCUlQIG92ZXIgSUVFRSAxMzk0Ci0JCUJBQ25ldCBNUy9UUAotCQlTUzcKLQkJTERQIG92ZXIgVENQCi0JCUxBQ1AsIE1BUktFUiBhcyBwZXIgODAyLjNhZAotCQlQR00gKFJGQyAzMjA4KQotCQlMU1AtUElORwotCQlHLjcwNDEvWS4xMzAzIEdlbmVyaWMgRnJhbWluZyBQcm9jZWR1cmUKLQkJRUlHUlAtSVAsIEVJR1JQLUlQWAotCQlJQ01QNgotCQlSYWRpbyAtIHZpYSByYWRpb3RhcAotCQlESENQdjYKLQkJSERMQyBvdmVyIFBQUAotCi1UdWUuICAgTWFyY2ggMzAsIDIwMDQuIG1jckBzYW5kZWxtYW4ub3R0YXdhLm9uLmNhLiBTdW1tYXJ5IGZvciAzLjguMyByZWxlYXNlCi0KLQlObyBjaGFuZ2VzIGZyb20gMy44LjIuIFZlcnNpb24gYnVtcGVkIG9ubHkgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kKLQl3aXRoIGxpYnBjYXAgMC44LjMuCi0KLU1vbi4gICBNYXJjaCAyOSwgMjAwNC4gbWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2EuIFN1bW1hcnkgZm9yIDMuOC4yIHJlbGVhc2UKLQotCUZpeGVzIGZvciBwcmludC1pc2FrbXAuYyAgICAgIENWRTogICAgQ0FOLTIwMDQtMDE4MywgQ0FOLTIwMDQtMDE4NAotCSAgCQkgICAgIGh0dHA6Ly93d3cucmFwaWQ3LmNvbS9hZHZpc29yaWVzL1I3LTAwMTcuaHRtbAotCUlQLW92ZXItSUVFRTEzOTQgcHJpbnRpbmcuCi0Jc29tZSBNSU5HVzMyIGNoYW5nZXMuCi0JdXBkYXRlcyBmb3IgYXV0b2NvbmYgMi41Ci0JZml4ZXMgZm9yIHByaW50LWFvZHYuYyAtIGNoZWNrIGZvciB0b28gc2hvcnQgcGFja2V0cwotCWZvcm1hdHRpbmcgY2hhbmdlcyB0byBwcmludC1hc2NpaSBmb3IgaGV4IG91dHB1dC4KLQljaGVjayBmb3IgdG9vIHNob3J0IHBhY2tldHM6IHByaW50LWJncC5jLCBwcmludC1ib290cC5jLCBwcmludC1jZHAuYywKLQkJcHJpbnQtY2hkbGMuYywgcHJpbnQtZG9tYWluLmMsIHByaW50LWljbXAuYywgcHJpbnQtaWNtcDYuYywKLQkJcHJpbnQtaXAuYywgcHJpbnQtbHdyZXMuYywgcHJpbnQtb3NwZi5jLCBwcmludC1waW0uYywKLQkJcHJpbnQtcHBwLmMscHJpbnQtcHBwb2UuYywgcHJpbnQtcnN2cC5jLCBwcmludC13Yi5jCi0JcHJpbnQtZXRoZXIuYyAtIGJldHRlciBoYW5kbGluZyBvZiB1bmtub3duIHR5cGVzLgotCXByaW50LWlzb2NsbnMuYyAtIGFkZGl0aW9uYWwgZGVjb2Rpbmcgb2YgdHlwZXMuCi0JcHJpbnQtbGxjLmMgLSBzdHJpbmdzIGZvciBMTEMgbmFtZXMgYWRkZWQuCi0JcHJpbnQtcGZsb2MuYyAtIHZhcmlvdXMgZW5oYW5jZW1lbnRzCi0JcHJpbnQtcmFkaXVzLmMgLSBiZXR0ZXIgZGVjb2RpbmcgdG8gc3RyaW5ncy4KLQotV2VkLiAgIE5vdmVtYmVyIDEyLCAyMDAzLiBtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYS4gU3VtbWFyeSBmb3IgMy44IHJlbGVhc2UKLQotCWNoYW5nZWQgc3ludGF4IG9mIC1FIGFyZ3VtZW50IHNvIHRoYXQgbXVsdGlwbGUgU0FzIGNhbiBiZSBkZWNyeXB0ZWQKLQlmaXhlcyBmb3IgRGlnaXRhbCBVbml4IGhlYWRlcnMgYW5kIERvY3VtZW50YXRpb24KLQlfX2F0dHJpYnV0ZV9fIGZpeGVzCi0JQ0RQIGNoYW5nZXMgZnJvbSBUZXJyeSBLZW5uZWR5IDx0ZXJyeUB0bWsuY29tPi4KLQlJUHY2IG1vYmlsaXR5IHVwZGF0ZXMgZnJvbSBLYXp1c2hpIFN1Z3lvIDxzdWd5b0BwYi5qcC5uZWMuY29tPgotCUZpeGVzIGZvciBBU04uMSBkZWNvZGVyIGZvciAyLjEwMC4zIGZvcm1zLgotCUFkZGVkIGEgY291bnQgb2YgcGFja2V0cyByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkIHRvIGNsYXJpZnkgbnVtYmVycy4KLQlJbmNvcnBvcmF0ZWQgV2luRFVNUCBwYXRjaGVzIGZvciBXaW4zMiBidWlsZHMuCi0JUFBQb0UgcGF5bG9hZCBsZW5ndGggaGVhZGVycy4KLQlGaXhlcyBmb3IgSFAgQyBjb21waWxlciBidWlsZHMuCi0JVXNlIG5ldyBwY2FwX2JyZWFrbG9vcCgpIGFuZCBwY2FwX2ZpbmRhbGxkZXZzKCkgaWYgd2UgY2FuLgotCUJHUCBvdXRwdXQgc3BsaXQgaW50byBtdWx0aXBsZSBsaW5lcy4KLQlGaXhlcyB0byA4MDIuMTEgZGVjb2RpbmcuCi0JRml4ZXMgdG8gUElNIGRlY29kZXIuCi0JU3VwZXJIIGlzIGEgQ1BVIHRoYXQgY2FuJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3MuIE1hbnkgZml4ZXMgZm9yCi0JCXVuYWxpZ25lZCBhY2Nlc3Mgd29yay4KLQlGaXhlcyB0byBGcmFtZS1SZWxheSBkZWNvZGVyIGZvciBRLjkzMy85MjIgZnJhbWVzLgotCUNsYXJpZmllZCB3aGVuIFNvbGFyaXMgY2FuIGRvIGNhcHR1cmVzIGFzIG5vbi1yb290LgotCUFkZGVkIHRlc3RzLyBzdWJkaXIgZm9yIGV4YW1wbGVzL3JlZ3Jlc3Npb24gdGVzdHMuCi0JTmV3IC1VIGZsYWcuCS1mbHVzaCBzdGRvdXQgYWZ0ZXIgZXZlcnkgcGFja2V0Ci0JTmV3IC1BIGZsYWcJLXByaW50IGFzY2lpIG9ubHkKLQlzdXBwb3J0IGZvciBkZWNvZGluZyBJUy1JUyBpbnNpZGUgQ2lzY28gSERMQyBGcmFtZXMKLQltb3JlIHZlcmJvc2l0eSBmb3IgdGZ0cCBkZWNvZGVyCi0JbUROUyBkZWNvZGVyCi0JbmV3IEJGRCBkZWNvZGVyCi0JY3Jvc3MgY29tcGlsYXRpb24gcGF0Y2hlcwotCVJGQyAzNTYxIEFPRFYgc3VwcG9ydC4KLQlVRFAvVENQIHBzZXVkby1jaGVja3N1bSBwcm9wZXJseSBmb3Igc291cmNlLXJvdXRlIG9wdGlvbnMuCi0Jc2FuaXRpemVkIGFsbCBmaWxlcyB0byBtb2RpZmllZCBCU0QgbGljZW5zZQotCUFkZCBzdXBwb3J0IGZvciBSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwuCi0JZml4ZXMgZm9yIERFQ25ldCBzdXBwb3J0LgotCVN1cHBvcnQgUkZDIDI2ODQgYnJpZGdpbmcgb2YgRXRoZXJuZXQsIDgwMi41IFRva2VuIFJpbmcsIGFuZCBGRERJLgotCVJGQyAyNjg0IGVuY2Fwc3VsYXRpb24gb2YgQlBEVXMuCi0KLVR1ZXNkYXksIEZlYnJ1YXJ5IDI1LCAyMDAzLiBmZW5uZXJAcmVzZWFyY2guYXR0LmNvbS4gIDMuNy4yIHJlbGVhc2UKLQotCUZpeGVkIGluZmluaXRlIGxvb3Agd2hlbiBwYXJzaW5nIG1hbGZvcm1lZCBpc2FrbXAgcGFja2V0cy4KLQkgKHJlcG9ydGVkIGJ5IGlEZWZlbnNlOyBhbHJlYWR5IGZpeGVkIGluIENWUykKLQlGaXhlZCBpbmZpbml0ZSBsb29wIHdoZW4gcGFyc2luZyBtYWxmb3JtZWQgQkdQIHBhY2tldHMuCi0JRml4ZWQgYnVmZmVyIG92ZXJmbG93IHdpdGggY2VydGFpbiBtYWxmb3JtZWQgTkZTIHBhY2tldHMuCi0JUHJldHR5LXByaW50IHVucHJpbnRhYmxlIG5ldHdvcmsgbmFtZXMgaW4gODAyLjExIHByaW50ZXIuCi0JSGFuZGxlIHRydW5jYXRlZCBuYnAgKGFwcGxldGFsaykgcGFja2V0cy4KLQlVcGRhdGVkIERIQ1B2NiBwcmludGVyIHRvIG1hdGNoIGRyYWZ0LWlldGYtZGhjLWRoY3B2Ni0yMi50eHQKLQlQcmludCBJUCBwcm90b2NvbCBuYW1lIGV2ZW4gaWYgd2UgZG9uJ3QgaGF2ZSBhIHByaW50ZXIgZm9yIGl0LgotCVByaW50IElQIHByb3RvY29sIG5hbWUgb3IgbnVtYmVyIGZvciBmcmFnbWVudHMuCi0JUHJpbnQgdGhlIHdob2xlIE1QTFMgbGFiZWwgc3RhY2ssIG5vdCBqdXN0IHRoZSB0b3AgbGFiZWwuCi0JUHJpbnQgcmVxdWVzdCBoZWFkZXIgYW5kIGZpbGUgaGFuZGxlIGZvciBORlMgdjMgRlNJTkZPIGFuZCBQQVRIQ09ORgotCSByZXF1ZXN0cy4KLQlGaXggTkZTIHBhY2tldCB0cnVuY2F0aW9uIGNoZWNrcy4KLQlIYW5kbGUgIm9sZCIgRFItUHJpb3JpdHkgYW5kIEJpZGlyLUNhcGFibGUgUElNIEhFTExPIG9wdGlvbnMuCi0JSGFuZGxlIHVua25vd24gUkFESVVTIGF0dHJpYnV0ZXMgcHJvcGVybHkuCi0JRml4IGFuIEFTTi4xIHBhcnNpbmcgZXJyb3IgdGhhdCB3b3VsZCBjYXVzZSBlLmcuIHRoZSBPSUQKLQkgMi4xMDAuMyB0byBiZSBtaXNyZXByZXNlbnRlZCBhcyA0LjIwLjMgLgotCi1Nb25kYXksIEphbnVhcnkgMjEsIDIwMDIuIG1jckBzYW5kZWxtYW4ub3R0YXdhLm9uLmNhLiBTdW1tYXJ5IGZvciAzLjcgcmVsZWFzZQotc2VlIGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvY3ZzLWxvZy8yMDAyLTAxLTIxLjEwOjE2OjQ4Lmh0bWwgZm9yIGNvbW1pdCBsb2cuCi0Ja2V5d29yZCAiaXB4IiBhZGRlZC4KLQlCZXR0ZXIgT1NJLzgwMi4yIHN1cHBvcnQgb24gTGludXguCi0JSUVFRSA4MDIuMTEgc3VwcG9ydCwgZnJvbSBjbGVuYWhhbkBmb3J0cmVzc3RlY2guY29tLCBhY2hpcmljYUB0dGQubmV0LgotCUxMQyBTQVAgc3VwcG9ydCBmb3IgRkRESS90b2tlbiByaW5nL1JGQy0xNDgzIHN0eWxlIEFUTQotCUJYWFAgcHJvdG9jb2wgd2FzIHJlcGxhY2VkIGJ5IHRoZSBCRUVQIHByb3RvY29sOwotCWltcHJvdmVtZW50cyB0byBTTkFQIGRlbXV4LgotCUNoYW5nZXMgdG8gImFueSIgaW50ZXJmYWNlIGRvY3VtZW50YXRpb24uCi0JRG9jdW1lbnRhdGlvbiBvbiBwY2FwX3N0YXRzKCkgY291bnRlcnMuCi0JRml4IGEgbWVtb3J5IGxlYWsgZm91bmQgYnkgTWlrbG9zIFN6ZXJlZGkgLSBwY2FwX2V0aGVyX2F0b24oKS4KLQlBZGRlZCBNUExTIGVuY2Fwc3VsYXRpb24gZGVjb2RpbmcgcGVyIFJGQzMwMzIuCi0JRE5TIGRpc3NlY3RvciBoYW5kbGVzIFRLRVksIFRTSUcgYW5kIElYRlIuCi0JYWRhcHRpdmUgU0xJUCBpbnRlcmZhY2UgcGF0Y2ggZnJvbSBJZ29yIEtocmlzdG9waG9yb3YgPGlnb3JAYXRkb3Qub3JnPgotCVNNQiBwcmludGluZyBoYXMgbXVjaCBpbXByb3ZlZCBib3VuZHMgY2hlY2tzCi0JT1VJIDB4MDAwMGY4IGRlY29kZWQgYXMgZW5jYXBzdWxhdGVkIGV0aGVybmV0IGZvciBDaXNjby1jdXN0b20gYnJpZGdpbmcKLQlaZXBoeXIgc3VwcG9ydCwgZnJvbSBOaWNrb2xhaSBaZWxkb3ZpY2ggPGtvbHlhQE1JVC5FRFU+LgotCVNvbGFyaXMgLSBkZXZpY2VzIHdpdGggZGlnaXRzIGluIHRoZW0uIFN0ZWZhbiBIdWRzb24gPGh1ZHNvbkBtYmF5Lm5ldD4KLQlJUFggc29ja2V0IDB4ODViZSBpcyBmb3IgQ2lzY28gRUlHUlAgb3ZlciBJUFguCi0JSW1wcm92ZW1lbnRzIHRvIGZyYWdtZW50ZWQgRVNQIGhhbmRsaW5nLgotCVNDVFAgc3VwcG9ydCBmcm9tIEFybWFuZG8gTC4gQ2FybyBKci4gPGFjYXJvQG1haWwuZWVjaXMudWRlbC5lZHU+Ci0JTGludXggQVJQSERSX0FUTSBzdXBwb3J0IGZpeGVkLgotCUFkZGVkIGEgIm5ldGJldWkiIGtleXdvcmQsIHdoaWNoIHNlbGVjdHMgTmV0QkVVSSBwYWNrZXRzLgotCUlQdjYgTkQgaW1wcm92ZW1lbnRzLCBNb2JpbGVJUCBkaXNzZWN0b3IsIDIyOTJiaXMtMDIgZm9yIFJBIG9wdGlvbi4KLQlIYW5kbGUgQVJQSERSX0hETEMgZnJvbSBNYXJjdXMgRmVsaXBlIFBlcmVpcmEgPG1hcmN1c0B0YXNrLmNvbS5icj4uCi0JSGFuZGxlIElQWCBzb2NrZXQgMHg1NTMgLT4gTmV0QklPUy1vdmVyLUlQWCBzb2NrZXQsICJud2xpbmstZGdtIgotCUJldHRlciBMaW51eCBsaWJjNSBjb21wYXQuCi0JQklORDkgbHdyZXMgZGlzc2VjdG9yIGFkZGVkLgotCU1JUFMgYW5kIFNQQVJDIGdldCBzdHJpY3QgYWxpZ25tZW50IG1hY3JvcyAoYWZmZWN0cyBwcmludC1iZ3AuYykKLQlBcHBsZSBMb2NhbFRhbGsgTElOS1RZUEVfIHJlc2VydmVkLgotCU5ldyB0aW1lIHN0YW1wIGZvcm1hdHMgZG9jdW1lbnRlZC4KLQlESENQNiB1cGRhdGVkIHRvIGRyYWZ0LTIyLnR4dCBzcGVjLgotCUlDTVAgdHlwZXMvY29kZXMgbm93IGFjY2VwdCBzeW1ib2xpYyBuYW1lcy4KLQlBZGQgU0lHSU5GTyBoYW5kbGVyIGZyb20gTEJMCi0JZW5jcnlwdGVkIENJUEUgdHVubmVscyBpbiBJUklYLCBmcm9tIEZyYW56IFNjaGFlZmVyIDxzY2hhZWZlckBtb25kLmF0Pi4KLQlub3cgd2UgYXJlIC1Xc3RyaWN0LXByb3RvdHlwZSBjbGVhbi4KLQlOZXRCU0QgRExUX1BQUF9FVEhFUjsgYWRhcHRlZCBmcm9tIE1hcnRpbiBIdXNlbWFubiA8bWFydGluQG5ldGJzZC5vcmc+LgotCVBQUG9FIGRpc3NlY3RvciBjbGVhbmVkIHVwLgotCVN1cHBvcnQgZm9yIExvY2FsVGFsayBoYXJkd2FyZSwgZnJvbSBVbnMgTGlkZXIgPHVuc2xpZGVyQG1pcmFuZGEub3JnPi4KLQlJbiBkaXNzZWN0b3IsIG5vdyB0aGUgY2FsbGVyIHByaW50cyB0aGUgSVAgYWRkcmVzc2VzIHJhdGhlciB0aGFuIHByb3RvLgotCWNqY2xhcmtAYWx1bS5taXQuZWR1OiBwcmludCB0aGUgSVAgcHJvdG8gZm9yIG5vbi1pbml0aWFsIGZyYWdtZW50cy4KLQlMTEMgZnJhbWVzIHdpdGggYSBEU0FQIGFuZCBMU0FQIG9mIDB4ZTAgYXJlIElQWCBmcmFtZXMuCi0JTGludXggY29va2VkIGZyYW1lcyB3aXRoIGEgdHlwZSB2YWx1ZSBvZiBMSU5VWF9TTExfUF84MDJfMyBhcmUgSVBYLgotCWNhcHR1cmVzIG9uIHRoZSAiYW55IiBkZXZpY2Ugd29uJ3QgYmUgZG9uZSBpbiBwcm9taXNjdW91cyBtb2RlCi0JVG9rZW4gUmluZyBzdXBwb3J0IG9uIERMUEkgLSBPbm5vIHZhbiBkZXIgTGluZGVuIDxvbm5vQHNpbXBsZXgubmw+Ci0JQVJDTmV0IHN1cHBvcnQsIGZyb20gTmV0QlNELgotCUhTUlAgZGlzc2VjdG9yLCBmcm9tIEp1bGlhbiBDb3dsZXkgPGp1bGlhbkBsYXZhLm5ldD4uCi0JSGFuZGxlIChHUkUtZW5jYXBzdWxhdGVkKSBQUFRQCi0JYWRkZWQgLUMgb3B0aW9uIHRvIHJvdGF0ZSBzYXZlIGZpbGUgZXZlcnkgb3B0YXJnICogMSwwMDAsMDAwIGJ5dGVzLgotCXN1cHBvcnQgZm9yICJ2cnJwIiBuYW1lIC0gTmV0QlNELCBieSBLbGF1cyBLbGVpbiA8a2xlaW5rQG5ldGJzZC5vcmc+LgotCVBQVFAgc3VwcG9ydCwgZnJvbSBNb3Rvbm9yaSBTaGluZG8gPG1zaGluZG9AbXNoaW5kby5uZXQ+LgotCUlTLUlTIG92ZXIgUFBQIHN1cHBvcnQsIGZyb20gSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uCi0JQ05GUCBzdXBwb3J0IGZvciBJUHY2LGZvcm1hdC4gSGFycnkgUmFheW1ha2VycyA8aGFycnlyQGNvbm5lY3QuY29tLmF1Pi4KLQlFU1AgcHJpbnRpbmcgdXBkYXRlZCB0byBSRkMyNDA2LgotCUhQLVVYIGNhbiBub3cgaGFuZGxlIGxhcmdlIG51bWJlciBvZiBQUEFzLgotCU1TRFAgcHJpbnRlciBhZGRlZC4KLQlMMlRQIGRpc3NlY3RvciBpbXByb3ZlbWVudHMgZnJvbSBNb3Rvbm9yaSBTaGluZG8uCi0KLVR1ZXNkYXkgSmFudWFyeSA5LCAyMDAxLiBtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYS4gU3VtbWFyeSBmb3IgMy42IHJlbGVhc2UKLQlDbGVhbmVkIHVwIGRvY3VtZW50YXRpb24uCi0JUHJvbWlzYyBtb2RlIGZpeGVzIGZvciBMaW51eAotCUlQc2VjIGNoYW5nZXMvY2xlYW51cHMuCi0JQWxpZ25tZW50IGZpeGVzIGZvciBwaWNreSBhcmNoaXRlY3R1cmVzCi0KLQlSZW1vdmVkIGRlcGVuZGVuY3kgb24gbmF0aXZlIGhlYWRlcnMgZm9yIHBhY2tldCBkaXNzZWN0b3JzLgotCVJlbW92ZWQgTGludXggc3BlY2lmaWMgaGVhZGVycyB0aGF0IHdlcmUgc2hpcHBlZAotCi0JbGlicGNhcCBjaGFuZ2VzIHByb3ZpZGUgZm9yIGV4Y2hhbmdpbmcgY2FwdHVyZSBmaWxlcyBiZXR3ZWVuCi0JICBzeXN0ZW1zLiBTYXZlIGZpbGVzIG5vdyBoYXZlIHdlbGwga25vd24gUEFDS0VUXyB2YWx1ZXMgaW5zdGVhZCBvZgotCSAgZGVwZW5kaW5nIHVwb24gc3lzdGVtIGRlcGVuZGFudCBtYXBwaW5ncyBvZiBETFRfKiB0eXBlcy4KLQotCVN1cHBvcnQgZm9yIGNvbXB1dGluZy9jaGVja2luZyBJUCBhbmQgVURQL1RDUCBjaGVja3N1bXMuCi0KLQlVcGRhdGVkIGF1dG9jb25mIHN0b2NrIGZpbGVzLgotCi0JSVB2NiBpbXByb3ZlbWVudHM6IGRoY3AgKGRyYWZ0LTE1KSwgbW9iaWxlLWlwNiwgcHBwLCBvc3BmNiwKLQotCUFkZGVkIGRpc3NlY3RvciBzdXBwb3J0IGZvcjogSVNPQ0xOUywgVG9rZW4gUmluZywgSUdNUHYzLCBieHhwLAotCQl0aW1lZCwgdnJycCwgcmFkaXVzLCBjaGRsYywgY25mcCwgY2RwLCBJRUVFODAyLjFkLCByYXctQXBwbGVUYWxrCi0KLQlBZGRlZCBmaWx0ZXJpbmcgc3VwcG9ydCBmb3I6IFZMQU5zLCBFU0lTLCBJU0lTCi0KLQlJbXByb3ZlbWVudHMgdG86IHByaW50LXRlbG5ldCwgSVBUYWxrLCBib290cC9kaGNwLCBFQ04sIFBQUCwKLQkJTDJUUCwgUFBQb0UKLQotCUhQLVVYIDExLjAgLS0gZmluZCB0aGUgcmlnaHQgZGxwaSBkZXZpY2UuCi0JU29sYXJpcyA4IC0gSVB2NiB3b3JrcwotCUxpbnV4IC0gQWRkZWQgc3VwcG9ydCBmb3IgYW4gImFueSIgZGV2aWNlIHRvIGNhcHR1cmUgb24gYWxsIGludGVyZmFjZXMKLQotCVNlY3VyaXR5IGZpeGVzOiBidWZmZXIgb3ZlcnJ1biBhdWRpdCBkb25lLiBTdHJjcHkgcmVwbGFjZWQgd2l0aAotCQlzdHJsY3B5LCBzcHJpbnRmIHJlcGxhY2VkIHdpdGggc25wcmludGYuCi0JTG9vayBmb3IgbGV4IHByb2JsZW1zLCBhbmQgd2FybiBhYm91dCB0aGVtLgotCi0KLXYzLjUgRnJpIEphbiAyOCAxODowMDowMCBQU1QgMjAwMAotCi1CaWxsIEZlbm5lciA8ZmVubmVyQHJlc2VhcmNoLmF0dC5jb20+Ci0tIHN3aXRjaCB0byBjb25maWcuaCBmb3IgYXV0b2NvbmYKLS0gdW5pZnkgUkNTSUQgc3RyaW5ncwotLSBVcGRhdGVkIFBJTXYxLCBQSU12MiwgRFZNUlAsIElHTVAgcGFyc2VycywgYWRkIENpc2NvIEF1dG8tUlAgcGFyc2VyCi0tIFJlYWxseSBmaXggdGhlIFJJUCBwcmludGVyCi0tIEZpeCBNQUMgYWRkcmVzcyAtPiBuYW1lIHRyYW5zbGF0aW9uLgotLSBzb21lIC1XYWxsIC1XZm9ybWF0IGZpeGVzCi0tIHVwZGF0ZSBtYWtlbWliIHRvIHBhcnNlIG11Y2ggb2YgU01JdjIKLS0gUHJpbnQgVENQIHNlcXVlbmNlICMgd2l0aCAtdnYgZXZlbiBpZiB5b3Ugbm9ybWFsbHkgd291bGRuJ3QKLS0gUHJpbnQgYXMgbXVjaCBvZiBJUC9UQ1AvVURQIGhlYWRlcnMgYXMgcG9zc2libGUgZXZlbiBpZiB0cnVuY2F0ZWQuCi0KLWl0b2p1bkBpaWpsYWIubmV0Ci0tIC1YIHdpbGwgbWFrZSBhIGFzY2lpIGR1bXAuICBmcm9tIG5ldGJzZC4KLS0gdGVsbmV0IGNvbW1hbmQgc2VxdWVuY2UgZGVjb2RlciAoZmYgeHggeHgpLiAgZnJvbSBuZXRic2QuCi0tIHByaW50LWJncC5jOiBpbXByb3ZlIG9wdGlvbnMgcHJpbnRpbmcuICB1Z2x5IGNvZGUgZXhpc3RzIGZvcgotICB1bmFsaWduZWQgb3B0aW9uIHBhcnNpbmcgKG5lZWQgc29tZSBmaXgpLgotLSBjb25zdCBwb2lzb25pbmcgaW4gU01CIGRlY29kZXIuCi0tIC1XYWxsIC1XZXJyb3IgY2xlYW4gY2hlY2tzLgotLSBicmluZyBpbiBLQU1FIElQdjYvSVBzZWMgZGVjb2RpbmcgY29kZS4KLQotQXNzYXIgV2VzdGVybHVuZCAgPGFzc2FyQHNpY3Muc2U+Ci0tIFNOTVB2MiBhbmQgU05NUHYzIHByaW50ZXIKLS0gSWYgY29tcGlsZWQgd2l0aCBsaWJzbWksIHRjcGR1bXAgY2FuIGxvYWQgTUlCcyBvbiB0aGUgZmx5IHRvIGRlY29kZQotICBTTk1QIHBhY2tldHMuCi0tIEluY29ycG9yYXRlIE5GUyBwYXJzaW5nIGNvZGUgZnJvbSBOZXRCU0QuICBBZGRzIHN1cHBvcnQgZm9yIG5mc3YzLgotLSBwb3J0YWJpbGl0eSBmaXhlcwotLSBwZXJtaXQgYnVpbGRpbmcgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLgotCi1LZW4gSG9ybnN0ZWluIDxrZW5oQGNtZi5ucmwubmF2eS5taWw+Ci0tIGJyaW5nIGluIGNvZGUgYXQKLSAgL2Fmcy90cmFuc2FyYy5jb20vcHVibGljL2Fmcy1jb250cmliL3Rvb2xzL3RjcGR1bXAgZm9yIHBhcnNpbmcKLSAgQUZTMyBwYWNrZXRzCi0KLUFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlQGxpbnV4Y2FyZS5jb20+Ci0tIFNNQiBwcmludGluZyBjb2RlCi0KLUxvdmUgPGxoYUBzdGFja2VuLmt0aC5zZT4KLS0gcHJpbnQtcnguYzogYWRkIGNvZGUgZm9yIHByaW50aW5nIE1ha2VEaXIgYW5kIFN0b3JlU3RhdHVzLiAgQWxzbwotICBjaGFuZ2UgZGF0ZSBmb3JtYXQgdG8gdGhlIHJpZ2h0IG9uZS4KLQotTWljaGFlbCBDLiBSaWNoYXJkc29uICA8bWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2E+Ci0tIENyZWF0ZWQgdGNwZHVtcC5vcmcgcmVwb3NpdG9yeQotCi12My40IFNhdCBKdWwgMjUgMTI6NDA6NTUgUERUIDE5OTgKLQotLSBIYXJkd2lyZSBMaW51eCBzbGlwIHN1cHBvcnQgc2luY2UgaXQncyB0b28gaGFyZCB0byBkZXRlY3QuCi0KLS0gUmVkbyBjb25maWd1cmF0aW9uIG9mICJuZXR3b3JrIiBsaWJyYXJpZXMgKC1sc29ja2V0IGFuZCAtbG5zbCkgdG8KLSAgZGVhbCB3aXRoIElSSVguIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkKLQotLSBBZGRlZCAtYSB3aGljaCB0cmllcyB0byB0cmFuc2xhdGUgbmV0d29yayBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyB0bwotICBuYW1lcy4gU3VnZ2VzdGVkIGJ5IFJvYiB2YW4gTmlldXdrZXJrIChyb2JuQHZlcmRpLmV0LnR1ZGVsZnQubmwpCi0KLS0gQWRkZWQgYSBjb25maWd1cmUgb3B0aW9uIHRvIGRpc2FibGUgZ2NjLgotCi0tIEFkZGVkIGEgInJhdyIgcGFja2V0IHByaW50ZXIuCi0KLS0gTm90IGhhdmluZyBhbiBpbnRlcmZhY2UgYWRkcmVzcyBpcyBubyBsb25nZXIgZmF0YWwuIFJlcXVlc3RlZCBieSBKb2huCi0gIEhhd2tpbnNvbi4KLQotLSBSZXdvcmsgc2lnbmFsIHNldHVwIHRvIGFjY29tbW9kYXRlIExpbnV4LgotCi0tIE9TUEYgdHJ1bmNhdGlvbiBjaGVjayBmaXguIEFsc28gZGlzcGxheSB0aGUgdHlwZSBvZiBPU1BGIHBhY2tldHMKLSAgdXNpbmcgTUQ1IGF1dGhlbnRpY2F0aW9uLiBUaGFua3MgdG8gQnJpYW4gV2VsbGluZ3RvbgotICAoYndlbGxpbmdAdGlzLmNvbSkKLQotLSBGaXggdHJ1bmNhdGlvbiBjaGVjayBidWdzIGluIHRoZSBLZXJiZXJvcyBwcmludGVyLiBSZXBvcnRlZCBieSBFenJhCi0gIFBlaXNhY2ggKGVwZWlzYWNoQG1pdC5lZHUpCi0KLS0gRG9uJ3QgY2F0Y2ggU0lHSFVQIHdoZW4gaW52b2tlZCB3aXRoIG5vaHVwKDEpLiBUaGFua3MgdG8gRGF2ZSBQbG9ua2EKLSAgKHBsb25rYUBtZmEuY29tKQotCi0tIFNwZWNpZnkgZnVsbCBpbnN0YWxsIHRhcmdldCBhcyBhIHdheSBvZiBkZXRlY3RpbmcgaWYgaW5zdGFsbAotICBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuIFRoYW5rcyB0byBEYXZlIFBsb25rYS4KLQotLSBCaXQtc3dhcCBGRERJIGFkZHJlc3NlcyBmb3IgQlNEL09TIHRvby4gVGhhbmtzIHRvIFBhdWwgVml4aWUKLSAgKHBhdWxAdml4LmNvbSkKLQotLSBGaXggb2ZmLWJ5LW9uZSBidWcgd2hlbiB0ZXN0aW5nIHNpemUgb2YgZXRoZXJuZXQgcGFja2V0cy4gVGhhbmtzIHRvCi0gIE1hcnR5IExlaXNuZXIgKGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20pCi0KLS0gQWRkIGEgbG9jYWwgYXV0b2NvbmYgbWFjcm8gdG8gY2hlY2sgZm9yIHJvdXRpbmVzIGluIGxpYnJhcmllczsgdGhlCi0gIGF1dG9jb25mIHZlcnNpb24gaXMgYnJva2VuIChpdCBvbmx5IHB1dHMgdGhlIGxpYnJhcnkgbmFtZSBpbiB0aGUKLSAgY2FjaGUgdmFyaWFibGUgbmFtZSkuIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbi4KLQotLSBBZGQgYSBsb2NhbCBhdXRvY29uZiBtYWNybyB0byBjaGVjayBmb3IgdHlwZXM7IHRoZSBhdXRvY29uZiB2ZXJzaW9uCi0gIGlzIGJyb2tlbiAoaXQgdXNlcyBncmVwIGluc3RlYWQgb2YgYWN0dWFsbHkgY29tcGlsaW5nIGEgY29kZSBmcmFnbWVudCkuCi0KLS0gTW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgbmV3IEJTRC9PUyAyLjEgUFBQIGFuZCBTTElQIGxpbmsgbGF5ZXIgaGVhZGVyCi0gIGZvcm1hdHMuCi0KLS0gRXh0ZW5kIE9TRiBpcCBoZWFkZXIgd29ya2Fyb3VuZCB0byB2ZXJzaW9ucyAxIGFuZCAyLgotCi0tIEZpeCBzb21lIHNpZ25lZCBwcm9ibGVtcyBpbiB0aGUgbmZzIHByaW50ZXIuIEFzIHJlcG9ydGVkIGJ5IERhdmlkCi0gIFNhY2VyZG90ZSAoZGF2aWRzQHNpbGVuY2Uuc2VjbmV0LmNvbSkKLQotLSBEZXRlY3QgZ3JvdXAgd2hlZWwgYW5kIHVzZSBpdCBhcyB0aGUgZGVmYXVsdCBzaW5jZSBCU0QvT1MnIGluc3RhbGwKLSAgY2FuJ3QgaGFjayBudW1lcmljIGdyb3Vwcy4gUmVwb3J0ZWQgYnkgRGF2aWQgU2FjZXJkb3RlLgotCi0tIEFJWCBuZWVkcyBzcGVjaWFsIGxvYWRlciBvcHRpb25zLiBUaGFua3MgdG8gSm9uYXRoYW4gSS4gS2FtZW5zCi0gIChqaWtAY2FtLm92LmNvbSkKLQotLSBGaXhlZCB0aGUgbmZzIHByaW50ZXIgdG8gcHJpbnQgcG9ydCBudW1iZXJzIGluIGRlY2ltYWwuIFRoYW5rcyB0bwotICBLZW50IFZhbmRlciBWZWxkZW4gKGdyYXBoaXhAaWFzdGF0ZS5lZHUpCi0KLS0gRmluZCBpbnN0YWxsZWQgbGlicGNhcCBpbiAvdXNyL2xvY2FsL2xpYiB3aGVuIG5vdCB1c2luZyBnY2MuCi0KLS0gRGlzYWxsb3cgbmV0d29yayBtYXNrcyB3aXRoIG5vbi1uZXR3b3JrIGJpdHMgc2V0LgotCi0tIEF0dGVtcHQgdG8gZGV0ZWN0ICJlZ2NzIiB2ZXJzaW9ucyBvZiBnY2MuCi0KLS0gQWRkIG1pc3NpbmcgY2xvc2luZyBkb3VibGUgcXVvdGVzIHdoZW4gZGlzcGxheWluZyBib290cCBzdHJpbmdzLgotICBSZXBvcnRlZCBieSBWaWV0LVRydW5nIEx1dSAodmx1dUBwaWNhcmQubWF0aC51d2F0ZXJsb28uY2EpCi0KLXYzLjMgU2F0IE5vdiAzMCAyMDo1NjoyNyBQU1QgMTk5NgotCi0tIEFkZGVkIExpbnV4IHN1cHBvcnQuCi0KLS0gR1JFIGVuY2Fwc3VsYXRlZCBwYWNrZXQgcHJpbnRlciB0aGFua3MgdG8gSm9obiBIYXdraW5zb24KLSAgKGpoYXdrQG1pdC5lZHUpCi0KLS0gUmV3cml0ZSBnbXQybG9jYWwoKSB0byBhdm9pZCBwcm9ibGVtYXRpYyBvcyBkZXBlbmRlbmNpZXMuCi0KLS0gU3VwcHJlc3MgbmZzIHRydW5jYXRpb24gbWVzc2FnZSBvbiBlcnJvcnMuCi0KLS0gQWRkIG1pc3NpbmcgbTQgcXVvdGluZyBpbiBBQ19MQkxfVU5BTElHTkVEX0FDQ0VTUyBhdXRvY29uZiBtYWNyby4KLSAgUmVwb3J0ZWQgYnkgSm9hY2hpbSBPdHQgKG90dEBhcmRhbGEuaGFuLmRlKQotCi0tIEVuYWJsZSAiaXBfaGwgdnMuIGlwX3ZobCIgd29ya2Fyb3VuZCBmb3IgT1NGNCB0b28uCi0KLS0gUHJpbnQgYXJwIGhhcmR3YXJlIHR5cGUgaW4gaG9zdCBvcmRlci4gVGhhbmtzIHRvIE9ubm8gdmFuIGRlciBMaW5kZW4KLSAgKG9ubm9Ac2ltcGxleC5ubCkKLQotLSBBdm9pZCBzb2xhcmlzIGNvbXBpbGVyIHdhcm5pbmdzLiBUaGFua3MgdG8gQnJ1Y2UgQmFybmV0dAotICAoYmFybmV0dEBncnltb2lyZS5jcmQuZ2UuY29tKQotCi0tIEZpeCByaXAgcHJpbnRlciB0byBub3QgcHJpbnQgb25lIG1vcmUgcm91dGUgdGhhbiBpcyBhY3R1YWxseSBpbiB0aGUKLSAgcGFja2V0LiBUaGFua3MgdG8gSmVhbi1MdWMgUmljaGllciAoSmVhbi1MdWMuUmljaGllckBpbWFnLmZyKSBhbmQKLSAgQmlsbCBGZW5uZXIgKGZlbm5lckBwYXJjLnhlcm94LmNvbSkKLQotLSBVc2UgYXV0b2NvbmYgZW5kaWFuIGRldGVjdGlvbiBzaW5jZSBCWVRFX09SREVSIGlzbid0IGRlZmluZWQgb24gYWxsIHN5c3RlbXMuCi0KLS0gRml4IGR2bXJwIHByaW50ZXIgdHJ1bmNhdGlvbiBjaGVja3MgYW5kIGFkZCBhIGR2bXJwIHByb2JlIHByaW50ZXIuCi0gIFRoYW5rcyB0byBEYW5ueSBKLiBNaXR6ZWwgKG1pdHplbEBpcHNpbG9uLmNvbSkKLQotLSBSZXdyaXRlIG9zcGYgcHJpbnRlciB0byBpbXByb3ZlIHRydW5jYXRpb24gY2hlY2tzLgotCi0tIERvbid0IHBhcnNlIHRjcCBvcHRpb25zIHBhc3QgdGhlIEVPTC4gQXMgbm90ZWQgYnkgRGF2aWQgU2FjZXJkb3RlCi0gIChkYXZpZHNAc2VjbmV0LmNvbSkuIEFsc28sIGNoZWNrIHRjcCBvcHRpb25zIHRvIG1ha2Ugc3VyZSB0aGV5IGFyCi0gIGFjdHVhbGx5IGluIHRoZSB0Y3AgaGVhZGVyIChpbiBhZGRpdGlvbiB0byB0aGUgbm9ybWFsIHRydW5jYXRpb24KLSAgY2hlY2tzKS4gRml4IHRoZSBTQUNLIGNvZGUgdG8gcHJpbnQgdGhlIE4gYmxvY2tzIChpbnN0ZWFkIG9mIHRoZQotICBmaXJzdCBibG9jayBOIHRpbWVzKS4KLQotLSBEb24ndCBzYXkgcmVhbGx5IHNtYWxsIFVEUCBwYWNrZXRzIGFyZSB0cnVuY2F0ZWQganVzdCBiZWNhdXNlIHRoZXkKLSAgYXJlbid0IGJpZyBlbm91Z2ggdG8gYmUgYSBSUEMuIEFzIG5vdGVkIGJ5IERhdmlkIFNhY2VyZG90ZS4KLQotdjMuMi4xIFN1biBKdWwgMTQgMDM6MDI6MjYgUERUIDE5OTYKLQotLSBBZGRlZCByZmMxNzE2IGljbXAgY29kZXMgYXMgc3VnZ2VzdGVkIGJ5IE1hcnRpbiBGcmVkcmlrc3NvbgotICAobWFydGluQG1zcC5zZSkKLQotLSBQcmludCBtdHUgZm9yIGljbXAgdW5yZWFjaCBuZWVkIGZyYWcgcGFja2V0cy4gVGhhbmtzIHRvIEpvaG4KLSAgSGF3a2luc29uIChqaGF3a0BtaXQuZWR1KQotCi0tIERlY29kZSBpY21wIHJvdXRlciBkaXNjb3ZlcnkgbWVzc2FnZXMuIFRoYW5rcyB0byBKZWZmcmV5IEhvbmlnCi0gIChqY2hAYnNkaS5jb20pCi0KLS0gQWRkZWQgYSBwcmludGVyIGVudHJ5IGZvciBETFRfSUVFRTgwMiBhcyBzdWdnZXN0ZWQgYnkgVGFrIEt1c2hpZGEKLSAgKGt1c2hpZGFAdHJsLmlibS5jby5qcCkKLQotLSBDaGVjayBpZ21wIGNoZWNrc3VtIGlmIHBvc3NpYmxlLiBUaGFua3MgdG8gSm9obiBIYXdraW5zb24uCi0KLS0gTWFkZSBjaGFuZ2VzIGZvciBTSU5JWC4gVGhhbmtzIHRvIEFuZHJlaiBCb3JzZW5rb3cKLSAgKGJvcnNlbmtvdy5tc2tAc25pLmRlKQotCi0tIFVzZSBhdXRvY29uZidzIGlkZWEgb2YgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaW4gaW5zdGFsbCB0YXJnZXRzLgotICBUaGFua3MgdG8gSm9obiBIYXdraW5zb24uCi0KLS0gQXZvaWQgaW5maW5pdGUgbG9vcCBpbiB0Y3Agb3B0aW9ucyBwcmludGluZyBjb2RlLiBUaGFua3MgdG8gSmVmZnJleQotICBNb2d1bCAobW9ndWxAcGEuZGVjLmNvbSkKLQotLSBBdm9pZCB1c2luZyAtbHNvY2tldCBpbiBJUklYIDUuMiBhbmQgZWFybGllciBzaW5jZSBpdCBicmVha3Mgc25vb3AuCi0gIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbi4KLQotLSBBZGRlZCBzb21lIG1vcmUgcGFja2V0IHRydW5jYXRpb24gY2hlY2tzLgotCi0tIE9uIHN5c3RlbXMgdGhhdCBoYXZlIGl0LCB1c2Ugc2lnc2V0KCkgaW5zdGVhZCBvZiBzaWduYWwoKSBzaW5jZQotICBzaWduYWwoKSBoYXMgZGlmZmVyZW50IHNlbWFudGljcyBvbiB0aGVzZSBzeXN0ZW1zLgotCi0tIEZpeGVkIHNvbWUgbW9yZSBhbGlnbm1lbnQgcHJvYmxlbXMgb24gdGhlIGFscGhhLgotCi0tIEFkZCBjb2RlIHRvIG1hc3NhZ2UgdW5wcmludGFibGUgY2hhcmFjdGVycyBpbiB0aGUgZG9tYWluIGFuZCBpcHgKLSAgcHJpbnRlcnMuIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbi4KLQotLSBBZGRlZCBleHBsaWNpdCBuZXRtYXNrIHN1cHBvcnQuIFRoYW5rcyB0byBTdGV2ZSBOdWNoaWEKLSAgKHN0ZXZlQHJlc2VhcmNoLm9rbmV0LmNvbSkKLQotLSBBZGQgInNjYSIga2V5d29yZCAoZm9yIERFQyBjbHVzdGVyIHNlcnZpY2VzKSBhcyBzdWdnZXN0ZWQgYnkgVGVycnkKLSAgS2VubmVkeSAodGVycnlAc3BjdnhhLnNwYy5lZHUpCi0KLS0gQWRkICJhdGFsayIga2V5d29yZCBhcyBzdWdnZXN0ZWQgYnkgSm9obiBIYXdraW5zb24uCi0KLS0gQWRkZWQgYW4gaWdycCBwcmludGVyLiBUaGFua3MgdG8gRnJhbmNpcyBEdXBvbnQKLSAgKGZyYW5jaXMuZHVwb250QGlucmlhLmZyKQotCi0tIFByaW50IElQWCBuZXQgbnVtYmVycyBpbiBoZXggYSBsYSBOb3ZlbGwgTmV0d2FyZS4gVGhhbmtzIHRvIFRlcnJ5Ci0gIEtlbm5lZHkgKHRlcnJ5QHNwY3Z4YS5zcGMuZWR1KQotCi0tIEZpeGVkIHNubXAgZXh0ZW5kZWQgdGFnIGZpZWxkIHBhcnNpbmcgYnVnLiBUaGFua3MgdG8gUGFzY2FsIEhlbm5lcXVpbgotICAocGFzY2FsLmhlbm5lcXVpbkBodWdvLmludC1ldnJ5LmZyKQotCi0tIEFkZGVkIHNvbWUgRVRIRVJUWVBFcyBtaXNzaW5nIG9uIHNvbWUgc3lzdGVtcy4KLQotLSBBZGRlZCB0cnVuY2F0ZWQgcGFja2V0IG1hY3JvcyBhbmQgdmFyaW91cyBjaGVja3MuCi0KLS0gRml4ZWQgZW5kaWFuIHByb2JsZW1zIHdpdGggdGhlIERFQ25ldCBwcmludGVyLgotCi0tIFVzZSAkQ0Mgd2hlbiBjaGVja2luZyBnY2MgdmVyc2lvbi4gVGhhbmtzIHRvIENhcmwgTGluZGJlcmcKLSAgKGNhcmxfbGluZGJlcmdAYmxhY2tzbWl0aC5jb20pCi0KLS0gRml4ZXMgZm9yIEFJWCAoYWx0aG91Z2ggdGhpcyBzeXN0ZW0gaXMgbm90IHlldCBzdXBwb3J0ZWQpLiBUaGFua3MgdG8KLSAgSm9obiBIYXdraW5zb24uCi0KLS0gRml4IGJ1Z3MgaW4gdGhlIGF1dG9jb25mIG1pc2FsaWduZWQgYWNjZXNzZXMgY29kZSBmcmFnbWVudC4KLQotLSBJbmNsdWRlIHN5cy9wYXJhbS5oIHRvIGdldCBCWVRFX09SREVSIGluIGEgZmV3IHBsYWNlcy4gVGhhbmtzIHRvCi0gIFBhdmxpbiBJdmFub3YgUmFkb3NsYXZvdiAocGF2bGluQGNzLnRpdGVjaC5hYy5qcCkKLQotdjMuMiBTdW4gSnVuIDIzIDAyOjI4OjEwIFBEVCAxOTk2Ci0KLS0gUHJpbnQgbmV3IGljbXAgdW5yZWFjaGFibGUgY29kZXMgYXMgc3VnZ2VzdGVkIGJ5IE1hcnRpbiBGcmVkcmlrc3NvbgotICAobWFydGluQG1zcC5zZSkuIEFsc28gcHJpbnQgY29kZSB2YWx1ZSB3aGVuIHVua25vd24gZm9yIGljbXAgcmVkaXJlY3QKLSAgYW5kIHRpbWUgZXhjZWVkZWQuCi0KLS0gRml4IGFuIGFsaWdubWVudCBlbmRpYW4gYnVnIGluIGdldG5hbWUoKS4gVGhhbmtzIHRvIEpvaG4gSGF3a2luc29uLgotCi0tIERlZmluZSAibmV3IiBkb21haW4gcmVjb3JkIHR5cGVzIGlmIG5vdCBmb3VuZCBpbiBhcnBhL25hbWVzZXJ2LmguCi0gIFJlc3VsdGVkIGZyb20gYSBzdWdnZXN0aW9uIGZyb20gSm9obiBIYXdraW5zb24gKGpoYXdrQG1pdC5lZHUpLiBBbHNvCi0gIGZpeGVkIGFuIGVuZGlhbiBidWcgd2hlbiBwcmludGluZyBteCByZWNvcmQgYW5kIGFkZGVkIHNvbWUgbmV3IHJlY29yZAotICB0eXBlcy4KLQotLSBBZGRlZCBSSVAgVjIgc3VwcG9ydC4gVGhhbmtzIHRvIEplZmZyZXkgSG9uaWcgKGpjaEBic2RpLmNvbSkKLQotLSBBZGRlZCBUL1RDUCBvcHRpb25zIHByaW50aW5nLiBBcyBzdWdnZXN0ZWQgYnkgUmljaGFyZCBTdGV2ZW5zCi0gIChyc3RldmVuc0Bub2FvLmVkdSkKLQotLSBVc2UgYXV0b2NvbmYgdG8gZGV0ZWN0IGFyY2hpdGVjdHVyZXMgdGhhdCBjYW4ndCBoYW5kbGUgbWlzYWxpZ25lZAotICBhY2Nlc3Nlcy4KLQotdjMuMSBUaHUgSnVuIDEzIDIwOjU5OjMyIFBEVCAxOTk2Ci0KLS0gQ2hhbmdlZCB1X2ludDMyL2ludDMyIHRvIHVfaW50MzJfdC9pbnQzMl90IHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBic2QKLSAgYW5kIGJpbmQgKGFzIHN1Z2dlc3RlZCBieSBDaGFybGVzIEhhbm51bSkuCi0KLS0gUG9ydCB0byBHTlUgYXV0b2NvbmYuCi0KLS0gQWRkIHN1cHBvcnQgZm9yIHByaW50aW5nIERWTVJQIGFuZCBQSU0gdHJhZmZpYyB0aGFua3MgdG8KLSAgSGF2YXJkIEVpZG5lcyAoSGF2YXJkLkVpZG5lc0BydW5pdC5zaW50ZWYubm8pLgotCi0tIEZpeCBBcHBsZVRhbGssIElQWCBhbmQgREVDbmV0IGJ5dGUgb3JkZXIgcHJvYmxlbXMgZHVlIHRvIHdyb25nIGVuZGlhbgotICBkZWZpbmUgYmVpbmcgcmVmZXJlbmNlZC4gUmVwb3J0ZWQgYnkgVGVycnkgS2VubmVkeS4KLQotLSBNaW5vciBmaXhlcyB0byB0aGUgbWFuIHBhZ2UgdGhhbmtzIHRvIE1hcmsgQW5kcmV3cy4KLQotLSBFbmRpYW4gZml4ZXMgdG8gUlRQIGFuZCB2YXQgcGFja2V0IGR1bXBlcnMsIHRoYW5rcyB0byBCcnVjZSBNYWgKLSAgKGJtYWhAY3MuYmVya2VsZXkuZWR1KS4KLQotLSBBZGRlZCBzdXBwb3J0IGZvciBuZXcgZG5zIHR5cGVzLCB0aGFua3MgdG8gUmFpbmVyIE9ydGguCi0KLS0gRml4ZWQgdGZ0cF9wcmludCgpIHRvIHByaW50IHRoZSBibG9jayBudW1iZXIgZm9yIEFDS3MuCi0KLS0gRG9jdW1lbnQgLWRkIGFuZCAtZGRkLiBSZXN1bHRlZCBmcm9tIGEgYnVnIHJlcG9ydCBmcm9tIENoYXJsaWUgU2xhdGVyCi0gIChjc2xhdGVyQGltYXRlay5jb20pLgotCi0tIENoZWNrIHJldHVybiBzdGF0dXMgZnJvbSBtYWxsb2MvY2FsbG9jL2V0Yy4KLQotLSBDaGVjayByZXR1cm4gc3RhdHVzIGZyb20gcGNhcF9sb29wKCkgc28gd2UgY2FuIHByaW50IGFuIGVycm9yIGFuZAotICBleGl0IHdpdGggYSBiYWQgc3RhdHVzIGlmIHRoZXJlIHdlcmUgcHJvYmxlbXMuCi0KLS0gQmFpbCBpZiBpcCBvcHRpb24gbGVuZ3RoIGlzIDw9IDAuIFJlc3VsdGVkIGZyb20gYSBidWcgcmVwb3J0IGZyb20KLSAgRGFycmVuIFJlZWQgKGRhcnJlbnJAdml0cnV2aXVzLmFyYmxkLnVuaW1lbGIuZWR1LmF1KS4KLQotLSBQcmludCBvdXQgYSBsaXR0bGUgbW9yZSBpbmZvcm1hdGlvbiBmb3Igc3VuIHJwYyBwYWNrZXRzLgotCi0tIEFkZCBzdXBvcnQgZm9yIEtlcmJlcm9zIDQgdGhhbmtzIHRvIEpvaG4gSGF3a2luc29uIChqaGF3a0BtaXQuZWR1KS4KLQotLSBGaXhlZCB0aGUgRml4IEVYVFJBQ1RfU0hPUlQoKSBhbmQgRVhUUkFDVF9MT05HKCkgbWFjcm9zICh3aGljaCB3ZXJlCi0gIHdyb25nIG9uIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMpLgotCi0tIEZpeGVkIGFsaWdubWVudCBidWcgaW4gaXB4X2RlY29kZSgpLiBUaGFua3MgdG8gTWF0dCBDcmF3Zm9yZAotICAoY3Jhd2RhZEBmbmFsLmdvdikuCi0KLS0gRml4IG50cF9wcmludCgpIHRvIG5vdCBwcmludCBnYXJiYWdlIHdoZW4gdGhlIHN0cmF0dW0gaXMKLSAgInVuc3BlY2lmaWVkLiIgVGhhbmtzIHRvIERldXMgRXggTWFjaGluYSAocm9vdEBiZWxsZS5ib3JrLmNvbSkuCi0KLS0gUmV3cm90ZSB0Y3Agb3B0aW9ucyBwcmludGVyIGNvZGUgdG8gY2hlY2sgZm9yIHRydW5jYXRpb24uIEFkZGVkCi0gIHNlbGVjdGl2ZSBhY2tub3dsZWRnbWVudCBjYXNlLgotCi0tIEZpeGVkIGFuIGVuZGlhbiBidWcgaW4gdGhlIG9zcGYgcHJpbnRlci4gVGhhbmtzIHRvIEplZmZyZXkgQyBIb25pZwotICAoamNoQGJzZGkuY29tKQotCi0tIEZpeCByaXAgcHJpbnRlciB0byBoYW5kbGUgNC40IEJTRCBzb2NrYWRkciBzdHJ1Y3Qgd2hpY2ggb25seSB1c2VzIG9uZQotICBvY3RldCBmb3IgdGhlIHNhX2ZhbWlseSBtZW1iZXIuIFRoYW5rcyB0byBZb3NoaXRha2EgVG9rdWdhd2EKLSAgKHRva3VAZGl0LmNvLmpwKQotCi0tIERvbid0IGNoZWNrc3VtIGlwIGhlYWRlciBpZiB3ZSBkb24ndCBoYXZlIGFsbCBvZiBpdC4gVGhhbmtzIHRvIEpvaG4KLSAgSGF3a2luc29uIChqaGF3a0BtaXQuZWR1KS4KLQotLSBQcmludCBvdXQgaG9zdG5hbWVzIGlmIHBvc3NpYmxlIGluIGVncCBwcmludGVyLiBUaGFua3MgdG8gSmVmZnJleQotICBIb25pZyAoamhjQGJzZGkuY29tKQotCi0KLXYzLjFhMSBXZWQgTWF5ICAzIDE5OjIxOjExIFBEVCAxOTk1Ci0KLS0gSW5jbHVkZSB0aW1lLmggd2hlbiBTVlI0IGlzIGRlZmluZWQgdG8gYXZvaWQgcHJvYmxlbXMgdW5kZXIgU29sYXJpcwotICAyLjMuCi0KLS0gRml4IGV0aGVyYWRkcl9zdHJpbmcoKSBpbiB0aGUgRVRIRVJfU0VSVklDRSB0byByZXR1cm4gdGhlIHNhdmVkCi0gIHN0cmluZ3MsIG5vdCB0aGUgbG9jYWwgYnVmZmVyLiBUaGFua3MgdG8gU3RlZmFuIFBldHJpCi0gIChwZXRyaUBpYnIuY3MudHUtYnMuZGUpLgotCi0tIERldGVjdCB3aGVuIHBjYXAgcmFpc2VzIHRoZSBzbmFwbGVuIChlLmcuIHdpdGggc25pdCkuIFByaW50IGEgd2FybmluZwotICB0aGF0IHRoZSBzZWxlY3RlZCB2YWx1ZSB3YXMgbm90IHVzZWQuIFRoYW5rcyB0byBQYXNjYWwgSGVubmVxdWluCi0gIChQYXNjYWwuSGVubmVxdWluQGh1Z28uaW50LWV2cnkuZnIpLgotCi0tIEFkZCBhIHRydW5jYXRlZCBwYWNrZXQgdGVzdCB0byBwcmludC1uZnMuYy4gVGhhbmtzIHRvIFBhc2NhbCBIZW5uZXF1aW4uCi0KLS0gQllURU9SREVSIC0+IEJZVEVfT1JERVIgVGhhbmtzIHRvIFRlcnJ5IEtlbm5lZHkgKHRlcnJ5QHNwY3Z4YS5zcGMuZWR1KS4KLQotdjMuMC4zIFN1biBPY3QgIDEgMTg6MzU6MDAgR01UIDE5OTUKLQotLSBBbHRob3VnaCB0aGVyZSBuZXZlciB3YXMgYSAzLjAuMyByZWxlYXNlLCB0aGUgbGludXggYm95cyBjbGV2ZXJseQotICAicmVsZWFzZWQiIG9uZSBpbiBsYXRlIDE5OTUuCi0KLXYzLjAuMiBUaHUgQXByIDIwIDIxOjI4OjE2IFBEVCAxOTk1Ci0KLS0gQ2hhbmdlIGNvbmZpZ3VyYXRpb24gdG8gbm90IHVzZSBnY2MgdjIgZmxhZ3Mgd2l0aCBnY2MgdjEuCi0KLS0gUmVkbyBnbXQybG9jYWwoKSBzbyB0aGF0IGl0IHdvcmtzIHVuZGVyIEJTREkgKHdoaWNoIHNlZW1zIHRvIHJldHVybgotICBhbiBlbXB0eSB0aW1lem9uZSBzdHJ1Y3QgZnJvbSBnZXR0aW1lb2ZkYXkoKSkuIEJhc2VkIG9uIHJlcG9ydCBmcm9tCi0gIFRlcnJ5IEtlbm5lZHkgKHRlcnJ5QHNwY3Z4YS5zcGMuZWR1KS4KLQotLSBDaGFuZ2UgY29uZmlndXJlIHRvIHJlY29nbml6ZSBJUFswLTldKiBhcyAibWlwcyIgU0dJIGhhcmR3YXJlLiBCYXNlZAotICBvbiByZXBvcnQgZnJvbSBNYXJrIEFuZHJld3MgKG1hbmRyZXdzQGFsaWFzLmNvbSkuCi0KLS0gRG9uJ3QgcGFzcyBjYyBmbGFncyB0byBnY2MuIFJlc3VsdGVkIGZyb20gYSBidWcgcmVwb3J0IGZyb20gUmFpbmVyCi0gIE9ydGggKHJvQHRlY2hmYWsudW5pLWJpZWxlZmVsZC5kZSkuCi0KLS0gRml4ZWQgcHJpbnRvdXQgb2YgY29ubmVjdGlvbiBpZCBmb3IgdW5jb21wcmVzc2VkIHRjcCBzbGlwIHBhY2tldHMuCi0gIFJlc3VsdGVkIGZyb20gYSBidWcgcmVwb3J0IGZyb20gUmljaGFyZCBTdGV2ZW5zIChyc3RldmVuc0Bub2FvLmVkdSkuCi0KLS0gSGFjayBhcm91bmQgZGVmaWNpZW5jeSBpbiBVbHRyaXgncyBtYWtlLgotCi0tIEFkZCBFVEhFUlRZUEVfVFJBSUwgZGVmaW5lIHdoaWNoIGlzIG1pc3NpbmcgZnJvbSBpcml4NS4KLQotdjMuMC4xIFdlZCBBdWcgMzEgMjI6NDI6MjYgUERUIDE5OTQKLQotLSBGaXggcHJvYmxlbXMgd2l0aCBnY2MyIHZzLiBtYWxsb2MoKSBhbmQgcmVhZCgpIHByb3RvdHlwZXMgdW5kZXIgU3VuT1MgNC4KLQotdjMuMCBNb24gSnVuIDIwIDE5OjIzOjI3IFBEVCAxOTk0Ci0KLS0gQWRkZWQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgdGNwIG9wdGlvbiB0aW1lc3RhbXBzIHRoYW5rcyB0bwotICBNYXJrIEFuZHJld3MgKG1hbmRyZXdzQGFsaWFzLmNvbSkuCi0KLS0gUmVvcmdhbml6ZSBwcm90b2NvbCBkdW1wZXJzIHRvIHRha2UgY29uc3QgcG9pbnRlcnMgdG8gcGFja2V0cyBzbyB0aGV5Ci0gIG5ldmVyIGNoYW5nZSB0aGUgY29udGVudHMgKGkuZS4sIHRoZXkgdXNlZCB0byBkbyBlbmRpYW4gY29udmVyc2lvbnMKLSAgaW4gcGxhY2UpLiAgUHJldmlvdXNseSwgd2hlbmV2ZXIgbW9yZSB0aGFuIG9uZSBwYXNzIHdhcyB0YWtlbiBvdmVyCi0gIHRoZSBwYWNrZXQsIHRoZSBwYWNrZXQgY29udGVudHMgd291bGQgYmUgZHVtcGVkIGluY29ycmVjdGx5IChpLmUuLAotICB0aGUgb3V0cHV0IGZvcm0gLXggd291bGQgYmUgd3Jvbmcgb24gbGl0dGxlIGVuZGlhbiBtYWNoaW5lcyBiZWNhdXNlCi0gIHRoZSBwcm90b2NvbCBkdW1wZXJzIHdvdWxkIG1vZGlmeSB0aGUgZGF0YSkuICBUaGFua3MgdG8gQ2hhcmxlcyBIYW5udW0KLSAgKG15Y3JvZnRAZ251LmFpLm1pdC5lZHUpIGZvciByZXBvcnRpbmcgdGhpcyBwcm9ibGVtLgotCi0tIEFkZGVkIHN1cHBvcnQgZm9yIGRlY25ldCBwcm90b2NvbCBkdW1waW5nIHRoYW5rcyB0byBKZWZmIE1vZ3VsCi0gIChtb2d1bEBwYS5kZWMuY29tKS4KLQotLSBGaXggYnVnIHRoYXQgY2F1c2VkIGxlbmd0aCBvZiBwYWNrZXQgdG8gYmUgaW5jb3JyZWN0bHkgcHJpbnRlZAotICAob2ZmIGJ5IGV0aGVyIGhlYWRlciBzaXplKSBmb3IgdW5rbm93biBldGhlcm5ldCB0eXBlcyB0aGFua3MKLSAgdG8gR3JlZyBNaWxsZXIgKGdtaWxsZXJAa2F5YWsubWl0cmUub3JnKS4KLQotLSBBZGRlZCBzdXBwb3J0IGZvciBJUFggcHJvdG9jb2wgZHVtcGluZyB0aGFua3MgdG8gQnJhZCBQYXJrZXIKLSAgKGJyYWRAZmNyLmNvbSkuCi0KLS0gQWRkZWQgY2hlY2sgdG8gdmVyaWZ5IElQIGhlYWRlciBjaGVja3N1bSB1bmRlciAtdiB0aGFua3MgdG8KLSAgQnJhZCBQYXJrZXIgKGJyYWRAZmNyLmNvbSkuCi0KLS0gTW92ZSBwYWNrZXQgY2FwdHVyZSBjb2RlIHRvIG5ldyBsaWJwY2FwIGxpYnJhcnkgKHdoaWNoIGlzCi0gIHBhY2thZ2VkIHNlcGFyYXRlbHkpLgotCi0tIFByb3RvdHlwZSBldmVyeXRoaW5nIGFuZCBhc3N1bWUgYW4gYW5zaSBjb21waWxlci4KLQotLSBwcmludC1hcnAuYzogUHJpbnQgaGFyZHdhcmUgZXRoZXJuZXQgYWRkcmVzc2VzIGlmIHRoZXkncmUgbm90Ci0gIHdoYXQgd2UgZXhwZWN0LgotCi0tIHByaW50LWJvb3RwLmM6IERlY29kZSB0aGUgY211IHZlbmRvciBmaWVsZC4gQWRkIFJGQzE0OTcgdGFncy4KLSAgTWFueSBoZWxwZnVsIHN1Z2dlc3Rpb25zIGZyb20gR29yZG9uIFJvc3MgKGd3ckBqZXJpY2hvLm1jLmNvbSkuCi0KLS0gcHJpbnQtZmRkaS5jOiBJbXByb3ZlbWVudHMuIFRoYW5rcyB0byBKZWZmcmV5IE1vZ3VsCi0gIChtb2d1bEBwYS5kZWMuY29tKS4KLQotLSBwcmludC1pY21wLmM6IEJ5dGUgc3dhcCBuZXRtYXNrIGJlZm9yZSBwcmludGluZy4gVGhhbmtzIHRvCi0gIFJpY2hhcmQgU3RldmVucyAocnN0ZXZlbnNAbm9hby5lZHUpLiBQcmludCBpY21wIHR5cGUgd2hlbiB1bmtub3duLgotCi0tIHByaW50LWlwLmM6IFByaW50IHRoZSBpbm5lciBpcCBkYXRhZ3JhbSBvZiBpcC1pbi1pcCBlbmNhcHN1bGF0ZWQgcGFja2V0cy4KLSAgQnkgZGVmYXVsdCwgb25seSB0aGUgaW5uZXIgcGFja2V0IGlzIGR1bXBlZCwgYXBwZW5kZWQgd2l0aCB0aGUgdG9rZW4KLSAgIihlbmNhcCkiLiAgVW5kZXIgLXYsIGJvdGggdGhlIGlubmVyIGFuZCBvdXRwdXQgcGFja2V0cyBhcmUgZHVtcGVkCi0gIChvbiB0aGUgc2FtZSBsaW5lKS4gIE5vdGUgdGhhdCB0aGUgZmlsdGVyIGFwcGxpZXMgdG8gdGhlIG9yaWdpbmFsIHBhY2tldCwKLSAgbm90IHRoZSBlbmNhcHN1bGF0ZWQgcGFja2V0LiAgU28gaWYgeW91IHJ1biB0Y3BkdW1wIG9uIGEgbmV0IHdpdGggYW4KLSAgSVAgTXVsdGljYXN0IHR1bm5lbCwgeW91IGNhbm5vdCBmaWx0ZXIgb3V0IHRoZSBkYXRhZ3JhbXMgdXNpbmcgdGhlCi0gIGNvbnZlbnRpb25hbCBzeW50YXguICAoWW91IGNhbiBmaWx0ZXIgYXdheSBhbGwgdGhlIGlwLWluLWlwIHRyYWZmaWMKLSAgd2l0aCAibm90IGlwIHByb3RvIDQiLikKLQotLSBwcmludC1uZnMuYzogS2VlcCBwZW5kaW5nIHJwYydzIGluIGNpcmN1bGFyIHRhYmxlLiBBZGQgZ2VuZXJpYwotICBuZnMgaGVhZGVyIGFuZCByZW1vdmUgb3MgZGVwZW5kZW5jZXMuIFRoYW5rcyB0byBKZWZmcmV5IE1vZ3VsLgotCi0tIHByaW50LW9zcGYuYzogSW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gSmVmZnJleSBNb2d1bC4KLQotLSB0Y3BkdW1wLmM6IEFkZCAtVCBmbGFnIGFsbG93cyBpbnRlcnByZXRhdGlvbiBvZiAidmF0IiwgIndiIiwgInJwYyIKLSAgKHN1bnJwYykgYW5kIHJ0cCBwYWNrZXRzLiBBZGRlZCAiaW5ib3VuZCIgYW5kICJvdXRib3VuZCIga2V5d29yZHMKLSAgQWRkICYmIGFuZCB8fCBvcGVyYXRvcnMKLQotdjIuMi4xIFR1ZSBKdW4gNiAxNzo1NzoyMiBQRFQgMTk5MgotCi0tIEZpeCBidWcgd2l0aCAtYyBmbGFnLgotCi12Mi4yIEZyaSBNYXkgMjIgMTc6MTk6NDEgUERUIDE5OTIKLQotLSBzYXZlZmlsZS5jOiBSZW1vdmUgaGFjayB0aGF0IHNob3VsZG4ndCBoYXZlIGJlZW4gZXhwb3J0ZWQuIEFkZAotICB0cnVuY2F0ZSBjaGVja3MuCi0KLS0gQWRkZWQgdGhlICdpY21wJyBrZXl3b3JkLiAgRm9yIGV4YW1wbGUsICdpY21wWzBdICE9IDggYW5kIGljbXBbMF0gIT0gMCcKLSAgbWF0Y2hlcyBub24tZWNoby9yZXBseSBJQ01QIHBhY2tldHMuCi0KLS0gTWFueSBpbXByb3ZlbWVudHMgdG8gZmlsdGVyIGNvZGUgb3B0aW1pemVyLgotCi0tIEFkZGVkICdtdWx0aWNhc3QnIGtleXdvcmQgYW5kIGV4dGVuZGVkIHRoZSAnYnJvYWRjYXN0JyBrZXl3b3JkIGNhbiBub3cgYmUKLSAgc28gdGhhdCBwcm90b2NvbCBxdWFsaWZpY2F0aW9ucyBhcmUgYWxsb3dlZC4gRm9yIGV4YW1wbGUsICJpcCBicm9hZGNhc3QiCi0gIGFuZCAiZXRoZXIgbXVsdGljYXN0IiBhcmUgdmFsaWQgZmlsdGVycy4KLQotLSBBZGRlZCBzdXBwb3J0IGZvciBtb25pdG9yaW5nIHRoZSBsb29wYmFjayBpbnRlcmZhY2UgKGkuZS4gJ3RjcGR1bXAgLWkgbG8nKS4KLSAgSmVmZnJleSBIb25pZyAoamNoQE1JVENIRUxMLkNJVC5DT1JORUxMLkVEVSkgY29udHJpYnV0ZWQgdGhlIGtlcm5lbAotICBwYXRjaGVzIHRvIG5ldGluZXQvaWZfbG9vcC5jLgotCi0tIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBVbmdlcm1hbm4tQmFzcyBFdGhlcm5ldCBvbiBJQk0vUEMtUlRzIHJ1bm5pbmcgQU9TLgotICBDb250YWN0IEplZmZyZXkgSG9uaWcgKGpjaEBNSVRDSEVMTC5DSVQuQ09STkVMTC5FRFUpIGZvciB0aGUgZGlmZnMuCi0KLS0gQWRkZWQgRUdQIGFuZCBPU1BGIHByaW50ZXJzLCB0aGFua3MgdG8gSmVmZnJleSBIb25pZy4KLQotdjIuMSBUdWUgSmFuIDI4IDExOjAwOjE0IFBTVCAxOTkyCi0KLS0gSW50ZXJuYWwgcmVsZWFzZSAobmV2ZXIgcHVibGljYWxseSBleHBvcnRlZCkuCi0KLXYyLjAuMSBTdW4gSmFuIDI2IDIxOjEwOjEwIFBEVAotCi0tIFZhcmlvdXMgYnl0ZSBvcmRlcmluZyBmaXhlcy4KLQotLSBBZGQgdHJ1bmNhdGlvbiBjaGVja3MuCi0KLS0gaW5ldC5jOiBTdXBwb3J0IEJTRCBzdHlsZSBTSU9DR0lGQ09ORi4KLQotLSBuYW1ldG9hZGRyLmM6IEhhbmRsZSBtdWx0aSBhZGRyZXNzZXMgZm9yIHNpbmdsZSBob3N0LgotCi0tIG9wdGltaXplLmM6IFJld3JpdHRlbi4KLQotLSBwY2FwLWJwZi5jOiBkb24ndCBjaG9rZSB3aGVuIHdlIGdldCBwdHJhY2VkLiBvbmx5IHNldCBwcm9taXNjdW91cwotICBmb3IgYnJvYWRjYXN0IG5ldHMuCi0KLS0gcHJpbnQtYXRhbC5jOiBGaXggYW4gYWxpZ25tZW50IGJ1ZyAodGhhbmtzIHRvCi0gIHN0YW5vbmlrQG5wcmRjLm5hdnkubWlsKSBBZGQgbWlzc2luZyBwcmludGYoKSBhcmd1bWVudC4KLQotLSBwcmludC1ib290cC5jOiBGaXJzdCBhdHRlbXB0IGF0IGRlY29kaW5nIHRoZSB2ZW5kb3IgYnVmZmVyLgotCi0tIHByaW50LWRvbWFpbi5jOiBGaXggdHJ1bmNhdGlvbiBjaGVja3MuCi0KLS0gcHJpbnQtaWNtcC5jOiBDYWxjdWxhdGUgbGVuZ3RoIG9mIHBhY2tldHMgZnJvbSB0aGUgaXAgaGVhZGVyLgotCi0tIHByaW50LWlwLmM6IFByaW50IGZyYWcgaWQgaW4gZGVjaW1hbCAoc28gaXQncyBlYXNpZXIgdG8gbWF0Y2ggdXAKLSAgd2l0aCBub24tZnJhZ3MpLiBBZGQgc3VwcG9ydCBmb3Igb3NwZiwgZWdwIGFuZCBpZ21wLgotCi0tIHByaW50LW5mcy5jOiBMb3RzIG9mIGNoYW5nZXMuCi0KLS0gcHJpbnQtbnRwLmM6IE1ha2Ugc29tZSB2ZXJib3NlIG91dHB1dCBkZXBlbmQgb24gLXYuCi0KLS0gcHJpbnQtc25tcC5jOiBOZXcgdmVyc2lvbiBmcm9tIEpvaG4gTG9WZXJzby4KLQotLSBwcmludC10Y3AuYzogUHJpbnQgcmZjMTA3MiB0Y3Agb3B0aW9ucy4KLQotLSB0Y3BkdW1wLmM6IFByaW50ICIweCIgcHJlZml4IGZvciAleCBmb3JtYXRzLiBBbHdheXMgcHJpbnQgNiBkaWdpdHMKLSAgKG1pY3Jvc2Vjb25kcykgd29ydGggb2YgcHJlY2lzaW9uLiBGaXggdWlkIGJ1Z3MuCi0KLS0gQSBwYWNrZXQgZHVtcGVyIGhhcyBiZWVuIGFkZGVkICh0aGFua3MgdG8gSmVmZiBNb2d1bCBvZiBERUNXUkwpLgotICBXaXRoIHRoaXMgb3B0aW9uLCB5b3UgY2FuIGNyZWF0ZSBhbiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgYmluYXJ5Ci0gIHRyYWNlIGZpbGUgaW4gcmVhbCB0aW1lLCB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiB0aGUgcGFja2V0IHByaW50ZXIuCi0gIEF0IGEgbGF0ZXIgdGltZSwgdGhlIHBhY2tldHMgY2FuIGJlIGZpbHRlcmVkIChhZ2FpbikgYW5kIHByaW50ZWQuCi0KLS0gQlNEIGlzIHN1cHBvcnRlZC4gIFlvdSBtdXN0IGhhdmUgQlBGIGluIHlvdXIga2VybmVsLgotICBTaW5jZSB0aGUgZmlsdGVyaW5nIGlzIG5vdyBkb25lIGluIHRoZSBrZXJuZWwsIGZld2VyIHBhY2tldHMgYXJlCi0gIGRyb3BwZWQuICBJbiBmYWN0LCB3aXRoIEJQRiBhbmQgdGhlIHBhY2tldCBkdW1wZXIgb3B0aW9uLCBhIG1lYXNseQotICBTdW4gMy81MCBjYW4ga2VlcCB1cCB3aXRoIGEgYnVzeSBuZXR3b3JrLgotCi0tIENvbXByZXNzZWQgU0xJUCBwYWNrZXRzIGNhbiBub3cgYmUgZHVtcGVkLCBwcm92aWRlZCB5b3UgdXNlIG91cgotICBTTElQIHNvZnR3YXJlIGFuZCBCUEYuICBUaGVzZSBwYWNrZXRzIGFyZSBkdW1wZWQgYXMgYW55IG90aGVyIElQCi0gIHBhY2tldDsgdGhlIGNvbXByZXNzZWQgaGVhZGVycyBhcmUgZHVtcGVkIHdpdGggdGhlICctZScgb3B0aW9uLgotCi0tIE1hY2hpbmVzIHdpdGggbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyaW5nIGFyZSBzdXBwb3J0ZWQgKHRoYW5rcyB0bwotICBKZWZmIE1vZ3VsKS4KLQotLSBVbHRyaXggNC4wIGlzIHN1cHBvcnRlZCAoYWxzbyB0aGFua3MgdG8gSmVmZiBNb2d1bCkuCi0KLS0gSUJNIFJUIGFuZCBTdGFuZm9yZCBFbmV0ZmlsdGVyIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgYnkKLSAgUmF5YW4gWmFjaGFyaWFzc2VuIDxyYXlhbkBjYW5ldC5jYT4uICBUY3BkdW1wIGhhcyBiZWVuIHRlc3RlZCB1bmRlcgotICBib3RoIHRoZSB2YW5pbGxhIEVuZXRmaWx0ZXIgaW50ZXJmYWNlLCBhbmQgdGhlIGV4dGVuZGVkIGludGVyZmFjZQotICAoI2lmZGVmJ2QgYnkgSUJNUlRQQykgcHJlc2VudCBpbiB0aGUgTUVSSVQgdmVyc2lvbiBvZiB0aGUgRW5ldGZpbHRlci4KLQotLSBURlRQIHBhY2tldHMgYXJlIG5vdyBwcmludGVkIChyZXF1ZXN0cyBvbmx5KS4KLQotLSBCT09UUCBwYWNrZXRzIGFyZSBub3cgcHJpbnRlZC4KLQotLSBTTk1QIHBhY2tldHMgYXJlIG5vdyBwcmludGVkLiAodGhhbmtzIHRvIEpvaG4gTG9WZXJzbyBvZiBYeWxvZ2ljcykuCi0KLS0gU3BhcmMgYXJjaGl0ZWN0dXJlcywgaW5jbHVkaW5nIHRoZSBTcGFyY3N0YXRpb24tMSwgYXJlIG5vdwotICBzdXBwb3J0ZWQgdGhhbmtzIHRvIFN0ZXZlIE1jQ2FubmUgYW5kIENyYWlnIExlcmVzLgotCi0tIFN1bk9TIDQgaXMgbm93IHN1cHBvcnRlZCB0aGFua3MgdG8gTWlja3kgTGl1IG9mIENvbHVtYmlhCi0gIFVuaXZlcnNpdHkgKG1pY2t5QGN1bml4Yy5jYy5jb2x1bWJpYS5lZHUpLgotCi0tIElQIG9wdGlvbnMgYXJlIG5vdyBwcmludGVkLgotCi0tIFJJUCBwYWNrZXRzIGFyZSBub3cgcHJpbnRlZC4KLQotLSBUaGVyZSdzIGEgLXYgZmxhZyB0aGF0IHByaW50cyBvdXQgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZQotICBkZWZhdWx0IChlLmcuLCBpdCB3aWxsIGVuYWJsZSBwcmludGluZyBvZiBJUCB0dGwsIHRvcyBhbmQgaWQpCi0gIGFuZCAtcSBmbGFnIHRoYXQgcHJpbnRzIG91dCBsZXNzIChlLmcuLCBpdCB3aWxsIGRpc2FibGUKLSAgaW50ZXJwcmV0YXRpb24gb2YgQXBwbGVUYWxrLWluLVVEUCkuCi0KLS0gVGhlIGdyYW1tYXIgaGFzIHVuZGVyZ29uZSBzdWJzdGFudGlhbCBjaGFuZ2VzIChpZiB5b3UgaGF2ZSBhbgotICBlYXJsaWVyIHZlcnNpb24gb2YgdGNwZHVtcCwgeW91IHNob3VsZCByZS1yZWFkIHRoZSBtYW51YWwKLSAgZW50cnkpLgotCi0gIFRoZSBtb3N0IHVzZWZ1bCBjaGFuZ2UgaXMgdGhlIGFkZGl0aW9uIG9mIGFuIGV4cHJlc3Npb24KLSAgc3ludGF4IHRoYXQgbGV0cyB5b3UgZmlsdGVyIG9uIGFyYml0cmFyeSBmaWVsZHMgb3IgdmFsdWVzIGluIHRoZQotICBwYWNrZXQuICBFLmcuLCAiaXBbMF0gPiAweDQ1IiB3b3VsZCBwcmludCBvbmx5IHBhY2tldHMgd2l0aCBJUAotICBvcHRpb25zLCAidGNwWzEzXSAmIDMgIT0gMCIgd291bGQgcHJpbnQgb25seSBUQ1AgU1lOIGFuZCBGSU4KLSAgcGFja2V0cy4KLQotICBUaGUgbW9zdCBwYWluZnVsIGNoYW5nZSBpcyB0aGF0IGNvbmNhdGVuYXRpb24gbm8gbG9uZ2VyIG1lYW5zCi0gICJhbmQiIC0tIGUuZy4sIHlvdSBoYXZlIHRvIHNheSAiaG9zdCBmb28gYW5kIHBvcnQgYmFyIiBpbnN0ZWFkCi0gIG9mICJob3N0IGZvbyBwb3J0IGJhciIuICBUaGUgdXAgc2lkZSB0byB0aGlzIGRvd24gaXMgdGhhdAotICByZXBlYXRlZCBxdWFsaWZpZXJzIGNhbiBiZSBvbWl0dGVkLCBtYWtpbmcgbW9zdCBmaWx0ZXIKLSAgZXhwcmVzc2lvbnMgc2hvcnRlci4gIEUuZy4sIHlvdSBjYW4gbm93IHNheSAiaXAgaG9zdCBmb28gYW5kCi0gIChiYXIgb3IgYmF6KSIgdG8gbG9vayBhdCBpcCB0cmFmZmljIGJldHdlZW4gaG9zdHMgZm9vIGFuZCBiYXIgb3IKLSAgYmV0d2VlbiBob3N0cyBmb28gYW5kIGJhei4gIFtUaGUgb2xkIHdheSBvZiBzYXlpbmcgdGhpcyB3YXMgImlwCi0gIGhvc3QgZm9vIGFuZCAoaXAgaG9zdCBiYXIgb3IgaXAgaG9zdCBiYXopIi5dCi0KLXYyLjAgU3VuIEphbiAxMyAxMjoyMDo0MCBQU1QgMTk5MQotCi0tIEluaXRpYWwgcHVibGljIHJlbGVhc2UuCmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyNzg4MC4uMDAwMDAwMAotLS0gYS9DUkVESVRTCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLVRoaXMgZmlsZSBsaXN0cyBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgdG8gdGNwZHVtcDoKLQotVGhlIGN1cnJlbnQgbWFpbnRhaW5lcnM6Ci0JQmlsbCBGZW5uZXIJCQk8ZmVubmVyQHJlc2VhcmNoLmF0dC5jb20+Ci0gICAgICAgIERhdmlkIFlvdW5nICAgICAgICAgICAgICAgICAgICAgPGR5b3VuZ0Bwb2JveC5jb20+Ci0JRnVsdmlvIFJpc3NvCQkJPHJpc3NvQHBvbGl0by5pdD4KLQlHdXkgSGFycmlzCSAJCTxndXlAYWx1bS5taXQuZWR1PgotCUhhbm5lcyBHcmVkbGVyCQkJPGhhbm5lc0BqdW5pcGVyLm5ldD4KLQlKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8JPGl0b2p1bkBpaWpsYWIubmV0PgotCU1pY2hhZWwgUmljaGFyZHNvbgkgCTxtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYT4KLQotQWRkaXRpb25hbCBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgcGF0Y2hlczoKLQotICAgICAgICBBYXJvbiBDYW1wYmVsbCAgICAgICAgICAgICAgICAgIDxhYXJvbkBhcmJvci5uZXQ+Ci0JQWxmcmVkbyBBbmRyZXMJCQk8YWFuZHJlc0BzMjFzZWMuY29tPgotCUFsYmVydCBDaGluCQkJPGNoaW5hQHRoZXdyaXR0ZW53b3JkLmNvbT4KLQlBbmRyZXcgQnJvd24JCQk8YXRhdGF0QGF0YXRkb3QubmV0PgotCUFuZHJldyBDaHVyY2gJCQk8YW5kcmV3QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlBbmRyZXcgSGludHoJCQk8YWRoaW50ekB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0JQW5kcmV3IFRyaWRnZWxsCQkJPHRyaWRnZUBsaW51eGNhcmUuY29tPgotICAgICAgICBBbmR5IEhlZmZlcm5hbiAgICAgICAgICAgICAgICAgIDxhaGhAanVuaXBlci5uZXQ+Ci0JQXJrYWRpdXN6IE1pc2tpZXdpY3ogCQk8bWlzaWVrQHBsZC5vcmcucGw+Ci0JQXJtYW5kbyBMLiBDYXJvIEpyLgkJPGFjYXJvQG1haWwuZWVjaXMudWRlbC5lZHU+Ci0JQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvCTxhY21lQGdob3N0cHJvdG9jb2xzLm5ldD4KLQlBdHN1c2hpIE9ub2UJCQk8b25vZUBuZXRic2Qub3JnPgotCUJlbiBTbWl0aHVyc3QJCQk8YmVuQHNjaWVudGlhLmRlbW9uLmNvLnVrPgotCUJyZW50IEwuIEJhdGVzCQkJPGJsYmF0ZXNAdmlneWFuLmNvbT4KLQlCcmlhbiBHaW5zYmFjaAkJCTxnaW5zYmFjaEBjcmF5LmNvbT4KLQlCcnVjZSBNLiBTaW1wc29uCQk8Ym1zQHNwYy5vcmc+Ci0JQ2FybGVzIEtpc2hpbW90byBCaXNiZSAgICAgICAgICA8Y2tpc2hpbW9AYWMudXBjLmVzPgotCUNoYXJsaWUgTGVuYWhhbgkJCTxjbGVuYWhhbkBmb3J0cmVzc3RlY2guY29tPgotCUNoYXJsZXMgTS4gSGFubnVtCQk8bXljcm9mdEBuZXRic2Qub3JnPgotCUNocmlzIENvZ2RvbgkJCTxjaHJpc0Bjb2dkb24ub3JnPgotCUNocmlzIEcuIERlbWV0cmlvdQkJPGNnZEBuZXRic2Qub3JnPgotCUNocmlzdGlhbiBTaWV2ZXJzCQk8Y19zQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlDaHJpcyBKZXBld2F5CQkJPGplcGV3YXlAYmxhc3RlZC1oZWF0aC5jb20+Ci0JQ2hyaXMgTGFyc29uCQkJPGNsYXJzb25Aa2VyZ290aC5jb20+Ci0JQ3JhaWcgUm9kcmlndWVzCQkJPHJvZHJpZ2NAbWVkaWFvbmUubmV0PgotCUNyaXN0IEouIENsYXJrCQkJPGNqY2xhcmtAYWx1bS5taXQuZWR1PgotCURhbmllbCBIYWdlcnR5IAkJCTxoYWdAYWkubWl0LmVkdT4KLQlEYXJyZW4gUmVlZAkJCTxkYXJyZW5yQHJlZWQud2F0dGxlLmlkLmF1PgotCURhdmlkIEJpbmRlcm1hbgkJCTxkLmJpbmRlcm1hbkB2aXJnaW4ubmV0PgotCURhdmlkIFNtaXRoCQkJPGRzbWl0aEByZWRoYXQuY29tPgotCURhdmlkIFlvdW5nCQkJPGR5b3VuZ0BvamN0ZWNoLmNvbT4KLQlEb24gRWJyaWdodAkJCTxEb24uRWJyaWdodEBjb21wdXdhcmUuY29tPgotCUVkZGllIEtvaGxlcgkJCTx4ZXhkQHNvdXJjZWZvcmdlLm5ldD4KLQlGcmFuY2lzIER1cG9udAkJCTxGcmFuY2lzLkR1cG9udEBlbnN0LWJyZXRhZ25lLmZyPgotCUZyYW5jaXNjbyBNYXRpYXMgQ3VlbmNhLUFjdW5hCTxtY3VlbmNhQGdlb3JnZS5ydXRnZXJzLmVkdT4KLQlGcmFuayBWb2xmCQkJPHZvbGZAb2FzaXMuSUFFaHYubmw+Ci0JRnVsdmlvIFJpc3NvCQkJPHJpc3NvQHBvbGl0by5pdD4KLQlHZW9yZ2UgQmFrb3MJCQk8Z2Jha29zQGlzdHMuZGFydG1vdXRoLmVkdT4KLQlHZXJhbGQgQ29tYnMJCQk8Z2VyYWxkQGV0aGVyZWFsLmNvbT4KLQlHZXJ0IERvZXJpbmcJCQk8Z2VydEBncmVlbmllLm11Yy5kZT4KLSAgICAgICAgR3JlZyBTdGFyayAgICAgICAgICAgICAgICAgICAgICA8Z3NzdGFya0BtaXQuZWR1PgotCUdpbGJlcnQgUmFtaXJleiBKci4JCTxncmFtQHhpZXhpZS5vcmc+Ci0JR2lzbGUgVmFuZW0JCQk8Z2l2YUBiZ25ldHQubm8+Ci0gICAgICAgIEhhbm5lcyBWaWVydGVsICAgICAgICAgICAgICAgICAgPGh2aWVydGVsQGp1bmlwZXIubmV0PgotCUhhbmsgTGVpbmluZ2VyCQkJPHRjcGR1bXAtd29ya2Vyc0Bwcm9ncmVzc2l2ZS1jb21wLmNvbT4KLQlIYXJyeSBSYWF5bWFrZXJzCQk8aGFycnlyQGNvbm5lY3QuY29tLmF1PgotCUhlaW56LUFkbyBBcm5vbGRzCQk8QWRvLkFybm9sZHNAZGhtLXN5c3RlbXMuZGU+Ci0JSGVuZHJpayBTY2hvbHoJCQk8aGVuZHJpa0BzY2hvbHoubmV0PgotCUlhbiBNY0RvbmFsZAkJCTxpbWNkbnpsQGdtYWlsLmNvbT4KLSAgICAgICAgSmFjZWsgVG9iaWFzeiAgICAgICAgICAgICAgICAgICA8SmFjZWsuVG9iaWFzekBhdG0uY29tLnBsPgotCUpha29iIFNjaGx5dGVyCQkJPGpha29iQG9wZW5ic2Qub3JnPgotCUphbiBPcmF2ZWMJCQk8d3N4QHdzeDYubmV0PgotCUphc29uIFIuIFRob3JwZQkJCTx0aG9ycGVqQG5ldGJzZC5vcmc+Ci0JSmVmZmVyc29uIE9nYXRhIAkJPGpvZ2F0YUBub2RjLm5vYWEuZ292PgotCUplZmZyZXkgSHV0emVsbWFuCQk8amh1dHpAY211LmVkdT4KLQlKZXNwZXIgUGV0ZXJzb24JCQk8amVzcGVyQGVuZGFjZS5jb20+Ci0JSmltIEh1dGNoaW5zCQkJPGppbUBjYS5zYW5kaWEuZ292PgotICAgICAgICBKb25hdGhhbiBIZXVzc2VyICAgICAgICAgICAgICAgIDxqb25ueUBkcnVncGhpc2guY2g+Ci0JVGF0dXlhIEppbm1laQkJCTxqaW5tZWlAa2FtZS5uZXQ+Ci0JSvhyZ2VuIFRob21zZW4JCQk8anRoQGp0aC5uZXQ+IAotCUp1bGlhbiBDb3dsZXkJCQk8anVsaWFuQGxhdmEubmV0PgotCUthYXJ0aGlrIFNpdmFrdW1hcgkJPGthYXJ0aGlrQHRvcnJlbnRuZXQuY29tPgotCUthenVzaGkgU3VneW8JCQk8c3VneW9AcGIuanAubmVjLmNvbT4KLQlLZWxseSBDYXJtaWNoYWVsCQk8a2Nhcm1pY2hAaXBhcHAuY29tPgotCUtlbiBIb3Juc3RlaW4JCQk8a2VuaEBjbWYubnJsLm5hdnkubWlsPgotCUtldmluIFN0ZXZlcwkJCTxzdGV2ZXNrQHBvYm94LmNvbT4KLQlLbGF1cyBLbGVpbgkJCTxrbGVpbmtAcmV6aXByb3ppdGFldC5kZT4KLSAJS3JpcyBLZW5uYXdheQkJCTxrcmlzQGZyZWVic2Qub3JnPgotCUtyenlzenRvZiBIYWxhc2EJCTxraGNAcG0ud2F3LnBsPgotCUxhcnJ5IExpbGUJCQk8bGlsZUBzdGRpby5jb20+Ci0JTGVubmVydCBCdXl0ZW5oZWsgCQk8YnV5dGVuaEBnbnUub3JnPgotCUxvcmlzIERlZ2lvYW5uaQkJCTxsb3Jpc0BuZXRncm91cC1zZXJ2LnBvbGl0by5pdD4KLQlMb3ZlIEj2cm5xdWlzdC3Fc3RyYW5kCQk8bGhhQHN0YWNrZW4ua3RoLnNlPgotCU1hY2llaiBXLiBSb3p5Y2tpCQk8bWFjcm9AZHMyLnBnLmdkYS5wbD4KLQlNYW51IFBhdGhhawkJCTxtYXBhdGhha0BjaXNjby5jb20+Ci0JTWFyYyBBLiBMZWhtYW5uCQkJPHBjZ0Bnb29mLmNvbT4KLQlNYXJrIEVsbHpleSBUaG9tYXMJCTxtYXJrQGFja2Vycy5uZXQ+Ci0JTWFya28gS2lpc2tpbGEJCQk8Y2FybmlsQGNzLnR1dC5maT4KLQlNYXJrdXMgU2No9nBmbGluCQk8c2Nob2VwZmxpbkBzb3VyY2Vmb3JnZS5uZXQ+Ci0JTWFyc2hhbGwgUm9zZQkJCTxtcm9zZUBkYmMubXR2aWV3LmNhLnVzPgotCU1hcnRpbiBIdXNlbWFubgkJCTxtYXJ0aW5AbmV0YnNkLm9yZz4KLQlNYXggTGFpZXIJCQk8bWF4QGxvdmUycGFydHkubmV0PgotCU1pY2hhZWwgTWFkb3JlCQkJPG1tYWRvcmVAdHVyYm9saW51eC5jb20+Ci0JTWljaGFlbCBTaGFsYXllZmYJCTxtaWNrZXlAb3BlbmJzZC5vcmc+Ci0JTWljaGFlbCBTaGllbGRzCQkJPHNoaWVsZHNAbXNybC5jb20+Ci0JTWljaGFlbCBULiBTdG9sYXJjaHVrCQk8bXRzQG9mZi50bz4KLQlNaWNoZWxlICJteWRlY2F5IiBNYXJjaGV0dG8JPHNtYXJjaGV0dG8xQHRpbi5pdD4KLQlNb25yb2UgV2lsbGlhbXMgCQk8bW9ucm9lQHBvYm94LmNvbT4KLQlNb3Rvbm9yaSBTaGluZG8JCQk8bXNoaW5kb0Btc2hpbmRvLm5ldD4KLQlOYXRoYW4gSi4gV2lsbGlhbXMJCTxuYXRoYW53QE1JVC5FRFU+Ci0JTmF0aGFuaWVsIENvdXBlci1Ob2xlcwkJPE5hdGhhbmllbEBpc2kxLnRjY2lzaS5jb20+Ci0JTmVpbCBULiBTcHJpbmcJCQk8Ymx1ZWhhbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ci0JTmllbHMgUHJvdm9zCQkJPHByb3Zvc0BvcGVuYnNkLm9yZz4KLQlOaWNrb2xhaSBaZWxkb3ZpY2gJCTxrb2x5YUBNSVQuRURVPgotICAgICAgICBOaWNvbGFzIEZlcnJlcm8gICAgICAgICAgICAgICAgIDx0b29yb3BAYmFieWxvLm5ldD4KLQlOb3JpdG9zaGkgRGVtaXp1CQk8ZGVtaXp1QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlPbGFmIEtpcmNoIAkJCTxva2lyQGNhbGRlcmEuZGU+Ci0JT25ubyB2YW4gZGVyIExpbmRlbgkJPG9ubm9Ac2ltcGxleC5ubD4KLQlQYXNjYWwgSGVubmVxdWluIAkJPHBhc2NhbC5oZW5uZXF1aW5AaW50LWV2cnkuZnI+Ci0JUGFzdm9ybiBCb29ubWFyawkJPGJvb25tYXJrQGp1bmlwZXIubmV0PgotCVBhdWwgTXVuZHQJCQk8bGV0aGFsQGxpbnV4LXNoLm9yZz4KLQlQYXVsIFMuIFRyYWluYQkJCTxwc3RAZnJlZWJzZC5vcmc+Ci0JUGF2bGluIFJhZG9zbGF2b3YJCTxwYXZsaW5AaWNpci5vcmc+Ci0JUGVra2EgU2F2b2xhIAkJCTxwZWtrYXNAbmV0Y29yZS5maT4JCi0JUGV0ZXIgRmFsZXMJCQk8cGV0ZXJAZmFsZXMtbG9yZW56Lm5ldD4KLQlQZXRlciBKZXJlbXkJCQk8cGV0ZXIuamVyZW15QGFsY2F0ZWwuY29tLmF1PgotCQkJCQk8cGZodW50QHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlQaGlsIFdvb2QJCQk8Y3B3QGxhbmwuZ292PgotCVJhZmFsIE1hc3prb3dza2kJCTxyem1AaWNtLmVkdS5wbD4KLQlSYXBoYWVsIFJhaW1iYXVsdAkJPHJhcGhhZWwucmFpbWJhdWx0QG5ldGFzcS5jb20+Ci0JUmljayBDaGVuZyAgICAgICAgICAgICAgICAgICAgICA8cmNoZW5nQGp1bmlwZXIubmV0PgotCVJpY2sgSm9uZXMJCQk8cmljay5qb25lczJAaHAuY29tPgotCVJpY2sgV2F0c29uCQkJPHdhdHNvbnJpY2tAdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCVJvYiBCcmF1bgkJCTxiYnJhdW5Ac3luYWNrLm5ldD4KLQlSb2RlcmljayBTY2hlcnRsZXIJCTxyb2Rlcmlja0Bhcmdvbi5vcmc+Ci0JU2FtaSBGYXJpbgkJCTxzYWZhcmlAaWtpLmZpPgotCVNjb3R0IFJvc2UJCQk8c3liZXJwdW5rQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlTZWJhc3RpYW4gS3JhaG1lcgkJPGtyYWhtZXJAY3MudW5pLXBvdHNkYW0uZGU+Ci0JU2ViYXN0aWVuIFZpbmNlbnQJCTxzdmluY2VudEBpZGVtcy5mcj4KLQlTZXRoIFdlYnN0ZXIJCQk8c3dlYnN0ZXJAc3N0LmxsLm1pdC5lZHU+Ci0JU2hpbnN1a2UgU3V6dWtpCQkJPHN1ekBrYW1lLm5ldD4KLQlTdGVpbmFyIEhhdWcJCQk8c3RoYXVnQG5ldGhlbHAubm8+Ci0gICAgICAgIFN3YW1pbmF0aGFuIENoYW5kcmFzZWthcmFuICAgICAgPGNoYW5kZXJAanVuaXBlci5uZXQ+Ci0JVGFrYXNoaSBZYW1hbW90bwkJPHlhbXRAbXdkLmJpZ2xvYmUubmUuanA+Ci0JVGVycnkgS2VubmVkeQkJCTx0ZXJyeUB0bWsuY29tPgotCVRpbW8gS29za2lhaGRlCi0JVG9ueSBMaQkJCQk8dGxpQHByb2NrZXQuY29tPgotCVVucyBMaWRlcgkJCTx1bnNsaWRlckBtaXJhbmRhLm9yZz4KLQlWaWN0b3IgT3BwbGVtYW4JCQk8b3BwbGVtYW5AdXNlcnMuc291cmNlZm9yZ2UubmV0PgotCVdlc2xleSBHcmlmZmluCQkJPHdncmlmZmluQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLQlXaWxiZXJ0IGRlIEdyYWFmCQk8d2lsYmVydGRnQGhldG5ldC5ubD4KLQlZZW4gWWVuIExpbQotCVlvc2hpZnVtaSBOaXNoaWRhCi0KLVRoZSBvcmlnaW5hbCBMQkwgY3JldzoKLQlTdGV2ZSBNY0Nhbm5lCi0JQ3JhaWcgTGVyZXMKLQlWYW4gSmFjb2Jzb24KZGlmZiAtLWdpdCBhL0ZJTEVTIGIvRklMRVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmFmYTIuLjAwMDAwMDAKLS0tIGEvRklMRVMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotQ0hBTkdFUwotQ1JFRElUUwotRklMRVMKLUlOU1RBTEwKLUxJQ0VOU0UKLU1ha2VmaWxlLmluCi1SRUFETUUKLVJlYWRtZS5XaW4zMgotVkVSU0lPTgotYWNjb25maWcuaAotYWNsb2NhbC5tNAotYWRkcnRvbmFtZS5jCi1hZGRydG9uYW1lLmgKLWFmLmMKLWFmLmgKLWFoLmgKLWFvZHYuaAotYXBwbGV0YWxrLmgKLWFyY25ldC5oCi1hdGltZS5hd2sKLWF0bS5oCi1hdG11bmkzMS5oCi1ib290cC5oCi1icGZfZHVtcC5jCi1iZ3AuaAotY2hkbGMuaAotY29uZmlnLmd1ZXNzCi1jb25maWcuaC5pbgotY29uZmlnLnN1YgotY29uZmlndXJlCi1jb25maWd1cmUuaW4KLWNwYWNrLmMKLWNwYWNrLmgKLWRjY3AuaAotZGVjbmV0LmgKLWRlY29kZV9wcmVmaXguaAotZW5jLmgKLWVzcC5oCi1ldGhlci5oCi1ldGhlcnR5cGUuaAotZXh0cmFjdC5oCi1mZGRpLmgKLWdtcGxzLmMKLWdtcGxzLmgKLWdtdDJsb2NhbC5jCi1nbXQybG9jYWwuaAotaWNtcDYuaAotaWVlZTgwMl8xMS5oCi1pZWVlODAyXzExX3JhZGlvLmgKLWlncnAuaAotaW5zdGFsbC1zaAotaW50ZXJmYWNlLmgKLWlwLmgKLWlwNi5oCi1pcGZjLmgKLWlwcHJvdG8uYwotaXBwcm90by5oCi1pcHNlY19kb2kuaAotaXB4LmgKLWlzYWttcC5oCi1sMnRwLmgKLWwydnBuLmMKLWwydnBuLmgKLWxhbmUuaAotbGJsL29zLW9zZjQuaAotbGJsL29zLXNvbGFyaXMyLmgKLWxibC9vcy1zdW5vczQuaAotbGJsL29zLXVsdHJpeDQuaAotbGxjLmgKLW1hY2hkZXAuYwotbWFjaGRlcC5oCi1tYWtlbWliCi1taWIuaAotbWlzc2luZy9hZGRyaW5mby5oCi1taXNzaW5nL2FkZHJzaXplLmgKLW1pc3NpbmcvYml0dHlwZXMuaAotbWlzc2luZy9kbG5hbWVzLmMKLW1pc3NpbmcvZGF0YWxpbmtzLmMKLW1pc3NpbmcvZ2V0YWRkcmluZm8uYwotbWlzc2luZy9nZXRuYW1laW5mby5jCi1taXNzaW5nL2luZXRfYXRvbi5jCi1taXNzaW5nL2luZXRfbnRvcC5jCi1taXNzaW5nL2luZXRfcHRvbi5jCi1taXNzaW5nL3Jlc29sdjYuaAotbWlzc2luZy9yZXNvbHZfZXh0LmgKLW1pc3Npbmcvc25wcmludGYuYwotbWlzc2luZy9zb2Nrc3RvcmFnZS5oCi1taXNzaW5nL3N0cmR1cC5jCi1taXNzaW5nL3N0cmxjYXQuYwotbWlzc2luZy9zdHJsY3B5LmMKLW1pc3Npbmcvc3Ryc2VwLmMKLW1rZGVwCi1tcGxzLmgKLW5hbWVzZXIuaAotbmV0Ymlvcy5oCi1uZXRkaXNzZWN0LmgKLW5mcy5oCi1uZnNmaC5oCi1ubHBpZC5jCi1ubHBpZC5oCi1udHAuaAotb2FrbGV5LmgKLW9zcGYuaAotb3NwZjYuaAotb3VpLmMKLW91aS5oCi1wYWNrZXRkYXQuYXdrCi1wYXJzZW5mc2ZoLmMKLXBjYXBfZHVtcF9mdGVsbC5jCi1wY2FwLW1pc3NpbmcuaAotcG1hcF9wcm90LmgKLXBwcC5oCi1wcmludC04MDJfMTEuYwotcHJpbnQtYWguYwotcHJpbnQtYW9kdi5jCi1wcmludC1hcDEzOTQuYwotcHJpbnQtYXJjbmV0LmMKLXByaW50LWFycC5jCi1wcmludC1hc2NpaS5jCi1wcmludC1hdGFsay5jCi1wcmludC1hdG0uYwotcHJpbnQtYmVlcC5jCi1wcmludC1iZmQuYwotcHJpbnQtYmdwLmMKLXByaW50LWJvb3RwLmMKLXByaW50LWNkcC5jCi1wcmludC1jaGRsYy5jCi1wcmludC1jaXAuYwotcHJpbnQtY25mcC5jCi1wcmludC1kY2NwLmMKLXByaW50LWRlY25ldC5jCi1wcmludC1kaGNwNi5jCi1wcmludC1kb21haW4uYwotcHJpbnQtZHZtcnAuYwotcHJpbnQtZWFwLmMKLXByaW50LWVncC5jCi1wcmludC1lbmMuYwotcHJpbnQtZXNwLmMKLXByaW50LWVpZ3JwLmMKLXByaW50LWV0aGVyLmMKLXByaW50LWZkZGkuYwotcHJpbnQtZnIuYwotcHJpbnQtZnJhZzYuYwotcHJpbnQtZ3JlLmMKLXByaW50LWhzcnAuYwotcHJpbnQtaWNtcC5jCi1wcmludC1pY21wNi5jCi1wcmludC1pZ21wLmMKLXByaW50LWlncnAuYwotcHJpbnQtaXAuYwotcHJpbnQtaXA2LmMKLXByaW50LWlwNm9wdHMuYwotcHJpbnQtaXBjb21wLmMKLXByaW50LWlwZmMuYwotcHJpbnQtaXB4LmMKLXByaW50LWlzYWttcC5jCi1wcmludC1pc29jbG5zLmMKLXByaW50LWp1bmlwZXIuYwotcHJpbnQta3JiLmMKLXByaW50LWwydHAuYwotcHJpbnQtbGFuZS5jCi1wcmludC1sZHAuYwotcHJpbnQtbGxjLmMKLXByaW50LWxtcC5jCi1wcmludC1sc3BwaW5nLmMKLXByaW50LWx3cmVzLmMKLXByaW50LW1vYmlsZS5jCi1wcmludC1tb2JpbGl0eS5jCi1wcmludC1tcGxzLmMKLXByaW50LW1zZHAuYwotcHJpbnQtbmV0Ymlvcy5jCi1wcmludC1uZnMuYwotcHJpbnQtbnRwLmMKLXByaW50LW51bGwuYwotcHJpbnQtb2xzci5jCi1wcmludC1vc3BmLmMKLXByaW50LW9zcGY2LmMKLXByaW50LXBmbG9nLmMKLXByaW50LXBnbS5jCi1wcmludC1waW0uYwotcHJpbnQtcHBwLmMKLXByaW50LXBwcG9lLmMKLXByaW50LXBwdHAuYwotcHJpbnQtcmFkaXVzLmMKLXByaW50LXJhdy5jCi1wcmludC1yaXAuYwotcHJpbnQtcmlwbmcuYwotcHJpbnQtcnN2cC5jCi1wcmludC1ydDYuYwotcHJpbnQtcnguYwotcHJpbnQtc2N0cC5jCi1wcmludC1zaXAuYwotcHJpbnQtc2wuYwotcHJpbnQtc2xsLmMKLXByaW50LXNsb3cuYwotcHJpbnQtc21iLmMKLXByaW50LXNubXAuYwotcHJpbnQtc3RwLmMKLXByaW50LXN1bmF0bS5jCi1wcmludC1zdW5ycGMuYwotcHJpbnQtc3ltYW50ZWMuYwotcHJpbnQtc3lzbG9nLmMKLXByaW50LXRjcC5jCi1wcmludC10ZWxuZXQuYwotcHJpbnQtdGZ0cC5jCi1wcmludC10aW1lZC5jCi1wcmludC10b2tlbi5jCi1wcmludC11ZHAuYwotcHJpbnQtdmpjLmMKLXByaW50LXZycnAuYwotcHJpbnQtd2IuYwotcHJpbnQtemVwaHlyLmMKLXJvdXRlNmQuaAotcnBjX2F1dGguaAotcnBjX21zZy5oCi1yeC5oCi1zY3RwQ29uc3RhbnRzLmgKLXNjdHBIZWFkZXIuaAotc2VuZC1hY2suYXdrCi1zZXRzaWduYWwuYwotc2V0c2lnbmFsLmgKLXNsY29tcHJlc3MuaAotc2xpcC5oCi1zbGwuaAotc21iLmgKLXNtYnV0aWwuYwotc3RpbWUuYXdrCi1zdHJjYXNlY21wLmMKLXRjcC5oCi10Y3BkdW1wLjEKLXRjcGR1bXAuYwotdGNwZHVtcC1zdGRpbmMuaAotdGVsbmV0LmgKLXRmdHAuaAotdGltZWQuaAotdG9rZW4uaAotdWRwLmgKLXV0aWwuYwotdmZwcmludGYuYwotd2luMzIvSW5jbHVkZS9BcnBhL3RmdHAuaAotd2luMzIvSW5jbHVkZS9lcnJuby5oCi13aW4zMi9JbmNsdWRlL2dldG9wdC5oCi13aW4zMi9JbmNsdWRlL2luZXRwcml2YXRlLmgKLXdpbjMyL0luY2x1ZGUvdGVsbmV0LmgKLXdpbjMyL0luY2x1ZGUvdzMyX2Z6cy5oCi13aW4zMi9JbmNsdWRlL05ldGluZXQvaW5fc3lzdG0uaAotd2luMzIvSW5jbHVkZS9OZXRpbmV0L2lwLmgKLXdpbjMyL1NyYy9nZXRvcHQuYwotd2luMzIvcHJqL0dOVW1ha2VmaWxlCi13aW4zMi9wcmovV2luRHVtcC5kc3AKLXdpbjMyL3Byai9XaW5EdW1wLmRzdwpkaWZmIC0tZ2l0IGEvSU5TVEFMTCBiL0lOU1RBTEwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NTk5N2YuLjAwMDAwMDAKLS0tIGEvSU5TVEFMTAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi1AKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL0lOU1RBTEwsdiAxLjYzLjIuNyAyMDA3LzA5LzE0IDAxOjAzOjEyIGd1eSBFeHAgJCAoTEJMKQotCi1JZiB5b3UgaGF2ZSBub3QgYnVpbHQgbGlicGNhcCwgYW5kIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgbGlicGNhcAotaW5zdGFsbGVkLCBpbnN0YWxsIGxpYnBjYXAgZmlyc3QuICBZb3VyIHN5c3RlbSBtaWdodCBwcm92aWRlIGEgdmVyc2lvbgotb2YgbGlicGNhcCB0aGF0IGNhbiBiZSBpbnN0YWxsZWQ7IGlmIHNvLCB0byBjb21waWxlIHRjcGR1bXAgeW91IG1pZ2h0Ci1uZWVkIHRvIGluc3RhbGwgYSAiZGV2ZWxvcGVyIiB2ZXJzaW9uIG9mIGxpYnBjYXAgYXMgd2VsbCBhcyB0aGUKLSJydW4tdGltZSIgdmVyc2lvbi4gIFlvdSBjYW4gYWxzbyBpbnN0YWxsIHRjcGR1bXAub3JnJ3MgdmVyc2lvbiBvZgotbGlicGNhcDsgc2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgdGhlIGZ0cCBsb2NhdGlvbi4KLQotWW91IHdpbGwgbmVlZCBhbiBBTlNJIEMgY29tcGlsZXIgdG8gYnVpbGQgdGNwZHVtcC4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQKLXdpbGwgYWJvcnQgaWYgeW91ciBjb21waWxlciBpcyBub3QgQU5TSSBjb21wbGlhbnQuIElmIHRoaXMgaGFwcGVucywgdXNlCi10aGUgR05VIEMgY29tcGlsZXIsIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIGZ0cDoKLQotCWZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvZ2NjLwotCi1BZnRlciBsaWJwY2FwIGhhcyBiZWVuIGJ1aWx0IChlaXRoZXIgaW5zdGFsbCBpdCB3aXRoICJtYWtlIGluc3RhbGwiIG9yCi1tYWtlIHN1cmUgYm90aCB0aGUgbGlicGNhcCBhbmQgdGNwZHVtcCBzb3VyY2UgdHJlZXMgYXJlIGluIHRoZSBzYW1lCi1kaXJlY3RvcnkpLCBydW4gLi9jb25maWd1cmUgKGEgc2hlbGwgc2NyaXB0KS4gICJjb25maWd1cmUiIHdpbGwKLWRldGVybWluZSB5b3VyIHN5c3RlbSBhdHRyaWJ1dGVzIGFuZCBnZW5lcmF0ZSBhbiBhcHByb3ByaWF0ZSBNYWtlZmlsZQotZnJvbSBNYWtlZmlsZS5pbi4gIE5vdyBidWlsZCB0Y3BkdW1wIGJ5IHJ1bm5pbmcgIm1ha2UiLgotCi1JZiBldmVyeXRoaW5nIGJ1aWxkcyBvaywgc3UgYW5kIHR5cGUgIm1ha2UgaW5zdGFsbCIuICBUaGlzIHdpbGwgaW5zdGFsbAotdGNwZHVtcCBhbmQgdGhlIG1hbnVhbCBlbnRyeS4gIEFueSB1c2VyIHdpbGwgYmUgYWJsZSB0byB1c2UgdGNwZHVtcCB0bwotcmVhZCBzYXZlZCBjYXB0dXJlcy4gIFdoZXRoZXIgYSB1c2VyIHdpbGwgYmUgYWJsZSB0byBjYXB0dXJlIHRyYWZmaWMKLWRlcGVuZHMgb24gdGhlIE9TIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtOyBzZWUgdGhlIHRjcGR1bXAKLW1hbiBwYWdlIGZvciBkZXRhaWxzLiAgRE8gTk9UIGdpdmUgdW50cnVzdGVkIHVzZXJzIHRoZSBhYmlsaXR5IHRvCi1jYXB0dXJlIHRyYWZmaWMuICBJZiBhIHVzZXIgY2FuIGNhcHR1cmUgdHJhZmZpYywgaGUgb3Igc2hlIGNvdWxkIHVzZQotdXRpbGl0aWVzIHN1Y2ggYXMgdGNwZHVtcCB0byBjYXB0dXJlIGFueSB0cmFmZmljIG9uIHlvdXIgbmV0LCBpbmNsdWRpbmcKLXBhc3N3b3Jkcy4KLQotTm90ZSB0aGF0IG1vc3Qgc3lzdGVtcyBzaGlwIHRjcGR1bXAsIGJ1dCB1c3VhbGx5IGFuIG9sZGVyIHZlcnNpb24uCi1SZW1lbWJlciB0byByZW1vdmUgb3IgcmVuYW1lIHRoZSBpbnN0YWxsZWQgYmluYXJ5IHdoZW4gdXBncmFkaW5nLgotCi1JZiB5b3VyIHN5c3RlbSBpcyBub3Qgb25lIHdoaWNoIHdlIGhhdmUgdGVzdGVkIHRjcGR1bXAgb24sIHlvdSBtYXkgaGF2ZQotdG8gbW9kaWZ5IHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBNYWtlZmlsZS5pbi4gUGxlYXNlIHNlbmQgdXMgcGF0Y2hlcwotZm9yIGFueSBtb2RpZmljYXRpb25zIHlvdSBuZWVkIHRvIG1ha2UuCi0KLVBsZWFzZSBzZWUgIlBMQVRGT1JNUyIgZm9yIG5vdGVzIGFib3V0IHRlc3RlZCBwbGF0Zm9ybXMuCi0KLQotRklMRVMKLS0tLS0tCi1DSEFOR0VTCQktIGRlc2NyaXB0aW9uIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gcmVsZWFzZXMKLUNSRURJVFMJCS0gcGVvcGxlIHRoYXQgaGF2ZSBoZWxwZWQgdGNwZHVtcCBhbG9uZwotRklMRVMJCS0gbGlzdCBvZiBmaWxlcyBleHBvcnRlZCBhcyBwYXJ0IG9mIHRoZSBkaXN0cmlidXRpb24KLUlOU1RBTEwJCS0gdGhpcyBmaWxlCi1MSUNFTlNFCQktIHRoZSBsaWNlbnNlIHVuZGVyIHdoaWNoIHRjcGR1bXAgaXMgZGlzdHJpYnV0ZWQKLU1ha2VmaWxlLmluCS0gY29tcGlsYXRpb24gcnVsZXMgKGlucHV0IHRvIHRoZSBjb25maWd1cmUgc2NyaXB0KQotUkVBRE1FCQktIGRlc2NyaXB0aW9uIG9mIGRpc3RyaWJ1dGlvbgotUmVhZG1lLldpbjMyCS0gbm90ZXMgb24gYnVpbGRpbmcgdGNwZHVtcCBvbiBXaW4zMiBzeXN0ZW1zICh3aXRoIFdpblBjYXApCi1WRVJTSU9OCQktIHZlcnNpb24gb2YgdGhpcyByZWxlYXNlCi1hY2NvbmZpZy5oCS0gYXV0b2NvbmYgaW5wdXQKLWFjbG9jYWwubTQJLSBhdXRvY29uZiBtYWNyb3MKLWFkZHJ0b25hbWUuYwktIGFkZHJlc3MgdG8gaG9zdG5hbWUgcm91dGluZXMKLWFkZHJ0b25hbWUuaAktIGFkZHJlc3MgdG8gaG9zdG5hbWUgZGVmaW5pdGlvbnMKLWFoLmgJCS0gSVBTRUMgQXV0aGVudGljYXRpb24gSGVhZGVyIGRlZmluaXRpb25zCi1hb2R2LmgJCS0gQU9EViBkZWZpbml0aW9ucwotYXBwbGV0YWxrLmgJLSBBcHBsZVRhbGsgZGVmaW5pdGlvbnMKLWFyY25ldC5oCS0gQVJDTkVUIGRlZmluaXRpb25zCi1hdGltZS5hd2sJLSBUQ1AgYWNrIGF3ayBzY3JpcHQKLWF0bS5oCQktIEFUTSB0cmFmZmljIHR5cGUgZGVmaW5pdGlvbnMKLWF0bXVuaTMxLmgJLSBBVE0gUS4yOTMxIGRlZmluaXRpb25zCi1iZ3AuaAkJLSBCR1AgZGVjbGFyYXRpb25zCi1ib290cC5oCQktIEJPT1RQIGRlZmluaXRpb25zCi1icGZfZHVtcC5jCS0gQlBGIHByb2dyYW0gcHJpbnRpbmcgcm91dGluZXMsIGluIGNhc2UgbGlicGNhcCBkb2Vzbid0Ci0JCSAgaGF2ZSB0aGVtCi1jaGRsYy5oCQktIENpc2NvIEhETEMgZGVmaW5pdGlvbnMKLWNwYWNrLmMJCS0gZnVuY3Rpb25zIHRvIGV4dHJhY3QgcGFja2VkIGRhdGEKLWNwYWNrLmgJCS0gZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyB0byBleHRyYWN0IHBhY2tlZCBkYXRhCi1jb25maWcuZ3Vlc3MJLSBhdXRvY29uZiBzdXBwb3J0Ci1jb25maWcuaC5pbgktIGF1dG9jb25mIGlucHV0Ci1jb25maWcuc3ViCS0gYXV0b2NvbmYgc3VwcG9ydAotY29uZmlndXJlCS0gY29uZmlndXJlIHNjcmlwdCAocnVuIHRoaXMgZmlyc3QpCi1jb25maWd1cmUuaW4JLSBjb25maWd1cmUgc2NyaXB0IHNvdXJjZQotZGNjcC5oCQktIERDQ1AgZGVmaW5pdGlvbnMKLWRlY25ldC5oCS0gREVDbmV0IGRlZmluaXRpb25zCi1kZWNvZGVfcHJlZml4LmgJLSBEZWNsYXJhdGlvbnMgb2YgImRlY29kZV9wcmVmaXh7NCw2fSgpIgotZW5jLmgJCS0gT3BlbkJTRCBJUHNlYyBlbmNhcHN1bGF0aW9uIEJQRiBsYXllciBkZWZpbml0aW9ucwotZXNwLmgJCS0gSVBTRUMgRW5jYXBzdWxhdGluZyBTZWN1cml0eSBQYXlsb2FkIGRlZmluaXRpb25zCi1ldGhlci5oCQktIEV0aGVybmV0IGRlZmluaXRpb25zCi1ldGhlcnR5cGUuaAktIEV0aGVybmV0IHR5cGUgdmFsdWUgZGVmaW5pdGlvbnMKLWV4dHJhY3QuaAktIGFsaWdubWVudCBkZWZpbml0aW9ucwotZmRkaS5oCQktIEZpYmVyIERpc3RyaWJ1dGVkIERhdGEgSW50ZXJmYWNlIGRlZmluaXRpb25zCi1nbXBscy5jCQktIEdNUExTIGRlZmluaXRpb25zCi1nbXBscy5oCQktIEdNUExTIGRlY2xhcmF0aW9ucwotZ210MmxvY2FsLmMJLSB0aW1lIGNvbnZlcnNpb24gcm91dGluZXMKLWdtdDJsb2NhbC5oCS0gdGltZSBjb252ZXJzaW9uIHByb3RvdHlwZXMKLWljbXA2LmgJCS0gSUNNUHY2IGRlZmluaXRpaW9ucwotaWVlZTgwMl8xMS5oCS0gSUVFRSA4MDIuMTEgZGVmaW5pdGlvbnMKLWllZWU4MDJfMTFfcmFkaW8uaCAtIHJhZGlvdGFwIGhlYWRlciBkZWZpbml0aW9ucwotaWdycC5oCQktIEludGVyaW9yIEdhdGV3YXkgUm91dGluZyBQcm90b2NvbCBkZWZpbml0aW9ucwotaW5zdGFsbC1zaAktIEJTRCBzdHlsZSBpbnN0YWxsIHNjcmlwdAotaW50ZXJmYWNlLmgJLSBnbG9iYWxzLCBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucwotaXAuaAkJLSBJUCBkZWZpbml0aW9ucwotaXA2LmgJCS0gSVB2NiBkZWZpbml0aW9ucwotaXBmYy5oCQktIElQLW92ZXItRmlicmUgQ2hhbm5lbCBkZWZpbml0aW9ucwotaXBwcm90by5jCS0gSVAgcHJvdG9jb2wgdHlwZSB2YWx1ZS10by1uYW1lIHRhYmxlCi1pcHByb3RvLmgJLSBJUCBwcm90b2NvbCB0eXBlIHZhbHVlIGRlZmluaXRpb25zCi1pcHNlY19kb2kuaAktIElTQUtNUCBwYWNrZXQgZGVmaW5pdGlvbnMgLSBSRkMyNDA3Ci1pcHguaAkJLSBJUFggZGVmaW5pdGlvbnMKLWlzYWttcC5oCS0gSVNBS01QIHBhY2tldCBkZWZpbml0aW9ucyAtIFJGQzI0MDgKLWwydnBuLmMJCS0gTDJWUE4gZW5jYXBzdWxhdGlvbiB2YWx1ZS10by1uYW1lIHRhYmxlCi1sMnZwbi5oCQktIEwyVlBOIGVuY2Fwc3VsYXRpb24gZGVmaW5pdGlvbnMKLWwydHAuaAkJLSBMYXllciBUd28gVHVubmVsaW5nIFByb3RvY29sIGRlZmluaXRpb25zCi1sYW5lLmgJCS0gQVRNIExBTkUgZGVmaW5pdGlvbnMKLWxibC9vcy0qLmgJLSBPUy1kZXBlbmRlbnQgZGVmaW5lcyBhbmQgcHJvdG90eXBlcwotbGxjLmgJCS0gTExDIGRlZmluaXRpb25zCi1tYWNoZGVwLmMJLSBtYWNoaW5lIGRlcGVuZGVudCByb3V0aW5lcwotbWFjaGRlcC5oCS0gbWFjaGluZSBkZXBlbmRlbnQgZGVmaW5pdGlvbnMKLW1ha2VtaWIJCS0gbWliIHRvIGhlYWRlciBzY3JpcHQKLW1pYi5oCQktIG1pYiBkZWZpbml0aW9ucwotbWlzc2luZy8qCS0gcmVwbGFjZW1lbnRzIGZvciBtaXNzaW5nIGxpYnJhcnkgZnVuY3Rpb25zCi1ta2RlcAkJLSBjb25zdHJ1Y3QgTWFrZWZpbGUgZGVwZW5kZW5jeSBsaXN0Ci1tcGxzLmgJCS0gTVBMUyBkZWZpbml0aW9ucwotbmFtZXNlci5oCS0gRE5TIGRlZmluaXRpb25zCi1uZXRiaW9zLmgJLSBORVRCSU9TIGRlZmluaXRpb25zCi1uZXRkaXNzZWN0LmgJLSBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZvciB0Y3BkdW1wLWFzLWxpYnJhcnkKLQkJICAodW5kZXIgZGV2ZWxvcG1lbnQpCi1uZnMuaAkJLSBOZXR3b3JrIEZpbGUgU3lzdGVtIFYyIGRlZmluaXRpb25zCi1uZnNmaC5oCQktIE5ldHdvcmsgRmlsZSBTeXN0ZW0gZmlsZSBoYW5kbGUgZGVmaW5pdGlvbnMKLW5scGlkLmMJCS0gT1NJIE5MUElEIHZhbHVlLXRvLW5hbWUgdGFibGUKLW5scGlkLmgJCS0gT1NJIE5MUElEIGRlZmluaXRpb25zCi1udHAuaAkJLSBOZXR3b3JrIFRpbWUgUHJvdG9jb2wgZGVmaW5pdGlvbnMKLW9ha2xleS5oCS0gSVNBS01QIHBhY2tldCBkZWZpbml0aW9ucyAtIFJGQzI0MDkKLW9zcGYuaAkJLSBPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgZGVmaW5pdGlvbnMKLW9zcGY2LmgJCS0gSVB2NiBPcGVuIFNob3J0ZXN0IFBhdGggRmlyc3QgZGVmaW5pdGlvbnMKLXBhY2tldGRhdC5hd2sJLSBUQ1AgY2h1bmsgc3VtbWFyeSBhd2sgc2NyaXB0Ci1wYXJzZW5mc2ZoLmMJLSBOZXR3b3JrIEZpbGUgU3lzdGVtIGZpbGUgcGFyc2VyIHJvdXRpbmVzCi1wY2FwX2R1bXBfZnRlbGwuYyAtIHBjYXBfZHVtcF9mdGVsbCgpIGltcGxlbWVudGF0aW9uLCBpbiBjYXNlIGxpYnBjYXAKLQkJZG9lc24ndCBoYXZlIGl0Ci1wY2FwLW1pc3NpbmcuaAktIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgcG9zc2libHkgbWlzc2luZyBmcm9tIGxpYnBjYXAKLXBtYXBfcHJvdC5oCS0gZGVmaW5pdGlvbnMgZm9yIE9OQyBSUEMgcG9ydG1hcHBlciBwcm90b2NvbAotcHBwLmgJCS0gUG9pbnQgdG8gUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMKLXByaW50LTgwMl8xMS5jCS0gSUVFRSA4MDIuMTEgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtYXAxMzk0LmMJLSBBcHBsZSBJUC1vdmVyLUlFRUUgMTM5NCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1haC5jCS0gSVBTRUMgQXV0aGVudGljYXRpb24gSGVhZGVyIHByaW50ZXIgcm91dGluZXMKLXByaW50LWFvZHYuYwktIEFPRFYgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtYXJjbmV0LmMJLSBBUkNORVQgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtYXJwLmMJLSBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtYXNjaWkuYwktIEFTQ0lJIHBhY2tldCBkdW1wIHJvdXRpbmVzCi1wcmludC1hdGFsay5jCS0gQXBwbGVUYWxrIHByaW50ZXIgcm91dGluZXMKLXByaW50LWF0bS5jCS0gQVRNIHByaW50ZXIgcm91dGluZXMKLXByaW50LWJncC5jCS0gQm9yZGVyIEdhdGV3YXkgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtYm9vdHAuYwktIEJPT1RQIGFuZCBJUHY0IERIQ1AgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtYmVlcC5jCS0gQkVFUCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1jZHAuYwktIENpc2NvIERpc2NvdmVyeSBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1jaGRsYy5jCS0gQ2lzY28gSERMQyBwcmludGVyIHJvdXRpbmVzCi1wcmludC1jaXAuYwktIENsYXNzaWNhbC1JUCBvdmVyIEFUTSByb3V0aW5lcwotcHJpbnQtY25mcC5jCS0gQ2lzY28gTmV0RmxvdyBwcmludGVyIHJvdXRpbmVzCi1wcmludC1kY2NwLmMJLSBEQ0NQIHByaW50ZXIgcm91dGluZXMKLXByaW50LWRlY25ldC5jCS0gREVDbmV0IHByaW50ZXIgcm91dGluZXMKLXByaW50LWRoY3A2LmMJLSBJUHY2IERIQ1AgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtZG9tYWluLmMJLSBEb21haW4gTmFtZSBTeXN0ZW0gcHJpbnRlciByb3V0aW5lcwotcHJpbnQtZHZtcnAuYwktIERpc3RhbmNlIFZlY3RvciBNdWx0aWNhc3QgUm91dGluZyBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1lYXAuYwktIEVBUCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1lbmMuYwktIE9wZW5CU0QgSVBzZWMgZW5jYXBzdWxhdGlvbiBCUEYgbGF5ZXIgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtZWdwLmMJLSBFeHRlcm5hbCBHYXRld2F5IFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LWVzcC5jCS0gSVBTRUMgRW5jYXBzdWxhdGluZyBTZWN1cml0eSBQYXlsb2FkIHByaW50ZXIgcm91dGluZXMKLXByaW50LWV0aGVyLmMJLSBFdGhlcm5ldCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1mZGRpLmMJLSBGaWJlciBEaXN0cmlidXRlZCBEYXRhIEludGVyZmFjZSBwcmludGVyIHJvdXRpbmVzCi1wcmludC1mci5jCS0gRnJhbWUgUmVsYXkgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtZnJhZzYuYwktIElQdjYgZnJhZ21lbnRhdGlvbiBoZWFkZXIgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtZ3JlLmMJLSBHZW5lcmljIFJvdXRpbmcgRW5jYXBzdWxhdGlvbiBwcmludGVyIHJvdXRpbmVzCi1wcmludC1oc3JwLmMJLSBDaXNjbyBIb3QgU3RhbmRieSBSb3V0ZXIgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtaWNtcC5jCS0gSW50ZXJuZXQgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LWljbXA2LmMJLSBJUHY2IEludGVybmV0IENvbnRyb2wgTWVzc2FnZSBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1pZ21wLmMJLSBJbnRlcm5ldCBHcm91cCBNYW5hZ2VtZW50IFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LWlncnAuYwktIEludGVyaW9yIEdhdGV3YXkgUm91dGluZyBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1pcC5jCS0gSVAgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtaXA2LmMJLSBJUHY2IHByaW50ZXIgcm91dGluZXMKLXByaW50LWlwNm9wdHMuYwktIElQdjYgaGVhZGVyIG9wdGlvbiBwcmludGVyIHJvdXRpbmVzCi1wcmludC1pcGNvbXAuYwktIElQIFBheWxvYWQgQ29tcHJlc3Npb24gUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtaXB4LmMJLSBJUFggcHJpbnRlciByb3V0aW5lcwotcHJpbnQtaXNha21wLmMJLSBJbnRlcm5ldCBTZWN1cml0eSBBc3NvY2lhdGlvbiBhbmQgS2V5IE1hbmFnZW1lbnQgUHJvdG9jb2wKLXByaW50LWlzb2NsbnMuYwktIElTTyBDTE5TLCBFU0lTLCBhbmQgSVNJUyBwcmludGVyIHJvdXRpbmVzCi1wcmludC1rcmIuYwktIEtlcmJlcm9zIHByaW50ZXIgcm91dGluZXMKLXByaW50LWwydHAuYwktIExheWVyIFR3byBUdW5uZWxpbmcgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtbGFuZS5jCS0gQVRNIExBTkUgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtbGxjLmMJLSBJRUVFIDgwMi4yIExMQyBwcmludGVyIHJvdXRpbmVzCi1wcmludC1sc3BwaW5nLmMJLSBMU1BQSU5HIHByaW50ZXIgcm91dGluZXMKLXByaW50LWx3cmVzLmMJLSBMaWdodHdlaWdodCBSZXNvbHZlciBwcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1tb2JpbGUuYwktIElQdjQgbW9iaWxpdHkgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtbW9iaWxpdHkuYyAtIElQdjYgbW9iaWxpdHkgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtbXBscy5jCS0gTXVsdGktUHJvdG9jb2wgTGFiZWwgU3dpdGNoaW5nIHByaW50ZXIgcm91dGluZXMKLXByaW50LW1zZHAuYwktIE11bHRpY2FzdCBTb3VyY2UgRGlzY292ZXJ5IFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LW5ldGJpb3MuYwktIE5ldEJJT1MgZnJhbWUgcHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtbmZzLmMJLSBOZXR3b3JrIEZpbGUgU3lzdGVtIHByaW50ZXIgcm91dGluZXMKLXByaW50LW50cC5jCS0gTmV0d29yayBUaW1lIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LW51bGwuYwktIEJTRCBsb29wYmFjayBkZXZpY2UgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtb3NwZi5jCS0gT3BlbiBTaG9ydGVzdCBQYXRoIEZpcnN0IHByaW50ZXIgcm91dGluZXMKLXByaW50LW9zcGY2LmMJLSBJUHY2IE9wZW4gU2hvcnRlc3QgUGF0aCBGaXJzdCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1wZmxvZy5jCS0gT3BlbkJTRCBwYWNrZXQgZmlsdGVyIGxvZyBmaWxlIHByaW50ZXIgcm91dGluZXMKLXByaW50LXBnbS5jCS0gUHJhZ21hdGljIEdlbmVyYWwgTXVsdGljYXN0IHByaW50ZXIgcm91dGluZXMKLXByaW50LXBpbS5jCS0gUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0IHByaW50ZXIgcm91dGluZXMKLXByaW50LXBwcC5jCS0gUG9pbnQgdG8gUG9pbnQgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtcHBwb2UuYwktIFBQUC1vdmVyLUV0aGVybmV0IHByaW50ZXIgcm91dGluZXMKLXByaW50LXBwdHAuYwktIFBvaW50LXRvLVBvaW50IFR1bm5lbGxpbmcgUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtcmFkaXVzLmMJLSBSYWRpdXMgcHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtcmF3LmMJLSBSYXcgSVAgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtcmlwLmMJLSBSb3V0aW5nIEluZm9ybWF0aW9uIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LXJpcG5nLmMJLSBJUHY2IFJvdXRpbmcgSW5mb3JtYXRpb24gUHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtcnN2cC5jCS0gUmVzb3VyY2UgcmVTZXJWYXRpb24gUHJvdG9jb2wgKFJTVlApIHByaW50ZXIgcm91dGluZXMKLXByaW50LXJ0Ni5jCS0gSVB2NiByb3V0aW5nIGhlYWRlciBwcmludGVyIHJvdXRpbmVzCi1wcmludC1yeC5jCS0gQUZTIFJYIHByaW50ZXIgcm91dGluZXMKLXByaW50LXNjdHAuYwktIFN0cmVhbSBDb250cm9sIFRyYW5zbWlzc2lvbiBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1zaXAuYwktIFNJUCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1zbC5jCS0gQ29tcHJlc3NlZCBTZXJpYWwgTGluZSBJbnRlcm5ldCBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1zbGwuYwktIExpbnV4ICJjb29rZWQiIGNhcHR1cmUgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtc2xvdy5jCS0gSUVFRSAic2xvdyBwcm90b2NvbCIgKDgwMi4zYWQpIHByaW50ZXIgcm91dGluZXMKLXByaW50LXNtYi5jCS0gU01CL0NJRlMgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtc25tcC5jCS0gU2ltcGxlIE5ldHdvcmsgTWFuYWdlbWVudCBQcm90b2NvbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1zdHAuYwktIElFRUUgODAyLjFkIHNwYW5uaW5nIHRyZWUgcHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtc3VuYXRtLmMJLSBTdW5BVE0gRExQSSBjYXB0dXJlIHByaW50ZXIgcm91dGluZXMKLXByaW50LXN1bnJwYy5jCS0gU3VuIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC1zeW1hbnRlYy5jIC0gU3ltYW50ZWMgRW50ZXJwcmlzZSBGaXJld2FsbCBwcmludGVyIHJvdXRpbmVzCi1wcmludC10Y3AuYwktIFRDUCBwcmludGVyIHJvdXRpbmVzCi1wcmludC10ZWxuZXQuYwktIFRlbG5ldCBvcHRpb24gcHJpbnRlciByb3V0aW5lcwotcHJpbnQtdGZ0cC5jCS0gVHJpdmlhbCBGaWxlIFRyYW5zZmVyIFByb3RvY29sIHByaW50ZXIgcm91dGluZXMKLXByaW50LXRpbWVkLmMJLSBCU0QgdGltZSBkYWVtb24gcHJvdG9jb2wgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtdG9rZW4uYwktIFRva2VuIFJpbmcgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtdWRwLmMJLSBVRFAgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtdmpjLmMJLSBQUFAgVmFuIEphY29ic29uIGNvbXByZXNzaW9uIChSRkMxMTQ0KSBwcmludGVyIHJvdXRpbmVzCi1wcmludC12cnJwLmMJLSBWaXJ0dWFsIFJvdXRlciBSZWR1bmRhbmN5IFByb3RvY29sCi1wcmludC13Yi5jCS0gV2hpdGUgQm9hcmQgcHJpbnRlciByb3V0aW5lcwotcHJpbnQtemVwaHlyLmMJLSBaZXBoeXIgcHJpbnRlciByb3V0aW5lcwotcm91dGU2ZC5oCS0gcGFja2V0IGRlZmluaXRpb24gZm9yIElQdjYgUm91dGluZyBJbmZvcm1hdGlvbiBQcm90b2NvbAotcnBjX2F1dGguaAktIGRlZmluaXRpb25zIGZvciBPTkMgUlBDIGF1dGhlbnRpY2F0aW9uCi1ycGNfbXNnLmgJLSBkZWZpbml0aW9ucyBmb3IgT05DIFJQQyBtZXNzYWdlcwotcnguaAkJLSBBRlMgUlggZGVmaW5pdGlvbnMKLXNjdHBDb25zdGFudHMuaAktIFN0cmVhbSBDb250cm9sIFRyYW5zbWlzc2lvbiBQcm90b2NvbCBjb25zdGFudCBkZWZpbml0aW9ucwotc2N0cEhlYWRlci5oCS0gU3RyZWFtIENvbnRyb2wgVHJhbnNtaXNzaW9uIFByb3RvY29sIHBhY2tldCBkZWZpbml0aW9ucwotc2VuZC1hY2suYXdrCS0gdW5pZGlyZWN0aW9uYWwgdGNwIHNlbmQvYWNrIGF3ayBzY3JpcHQKLXNldHNpZ25hbC5jCS0gT1MtaW5kZXBlbmRlbnQgc2lnbmFsIHJvdXRpbmVzCi1zZXRzaWduYWwuaAktIE9TLWluZGVwZW5kZW50IHNpZ25hbCBwcm90b3R5cGVzCi1zbGNvbXByZXNzLmgJLSBTTElQL1BQUCBWYW4gSmFjb2Jzb24gY29tcHJlc3Npb24gKFJGQzExNDQpIGRlZmluaXRpb25zCi1zbGlwLmgJCS0gU0xJUCBkZWZpbml0aW9ucwotc2xsLmgJCS0gTGludXggImNvb2tlZCIgY2FwdHVyZSBkZWZpbml0aW9ucwotc21iLmgJCS0gU01CL0NJRlMgZGVmaW5pdGlvbnMKLXNtYnV0aWwuYwktIFNNQi9DSUZTIHV0aWxpdHkgcm91dGluZXMKLXN0aW1lLmF3awktIFRDUCBzZW5kIGF3ayBzY3JpcHQKLXN0cmNhc2VjbXAuYwktIG1pc3Npbmcgcm91dGluZQotdGNwLmgJCS0gVENQIGRlZmluaXRpb25zCi10Y3BkdW1wLjEJLSBtYW51YWwgZW50cnkKLXRjcGR1bXAuYwktIG1haW4gcHJvZ3JhbQotdGVsbmV0LmgJLSBUZWxuZXQgZGVmaW5pdGlvbnMKLXRmdHAuaAkJLSBURlRQIGRlZmluaXRpb25zCi10aW1lZC5oCQktIEJTRCB0aW1lIGRhZW1vbiBwcm90b2NvbCBkZWZpbml0aW9ucwotdG9rZW4uaAkJLSBUb2tlbiBSaW5nIGRlZmluaXRpb25zCi11ZHAuaAkJLSBVRFAgZGVmaW5pdGlvbnMKLXV0aWwuYwkJLSB1dGlsaXR5IHJvdXRpbmVzCi12ZnByaW50Zi5jCS0gZW11bGF0aW9uIHJvdXRpbmUKLXdpbjMyCQktIGhlYWRlcnMgYW5kIHJvdXRpbmVzIGZvciBidWlsZGluZyBvbiBXaW4zMiBzeXN0ZW1zCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhNWY3ZC4uMDAwMDAwMAotLS0gYS9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTGljZW5zZTogQlNECi0gCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotYXJlIG1ldDoKLSAgCi0gIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAgICAgZGlzdHJpYnV0aW9uLgotICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAgCi1USElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLVdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KZGlmZiAtLWdpdCBhL01PRFVMRV9MSUNFTlNFX0JTRCBiL01PRFVMRV9MSUNFTlNFX0JTRApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9NT0RVTEVfTElDRU5TRV9CU0QKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUtZGV2ZWwtYWRkcyBiL01ha2VmaWxlLWRldmVsLWFkZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMmExMTkuLjAwMDAwMDAKLS0tIGEvTWFrZWZpbGUtZGV2ZWwtYWRkcworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMKLSMgQXV0by1yZWdlbmVyYXRlIGNvbmZpZ3VyZSBzY3JpcHQgb3IgTWFrZWZpbGUgd2hlbiB0aGluZ3MgY2hhbmdlLgotIyBGcm9tIGF1dG9jb25mLmluZm8gLiAgV29ya3MgYmVzdCB3aXRoIEdOVSBNYWtlLgotIwotJHtzcmNkaXJ9L2NvbmZpZ3VyZTogY29uZmlndXJlLmluCi0JY2QgJHtzcmNkaXJ9ICYmIGF1dG9jb25mCi0KLSMgYXV0b2hlYWRlciBtaWdodCBub3QgY2hhbmdlIGNvbmZpZy5oLmluLCBzbyB0b3VjaCBhIHN0YW1wIGZpbGUuCi0ke3NyY2Rpcn0vY29uZmlnLmguaW46ICR7c3JjZGlyfS9zdGFtcC1oLmluCi0ke3NyY2Rpcn0vc3RhbXAtaC5pbjogY29uZmlndXJlLmluIGFjY29uZmlnLmgKLQljZCAke3NyY2Rpcn0gJiYgYXV0b2hlYWRlcgotCWVjaG8gdGltZXN0YW1wID4gJHtzcmNkaXJ9L3N0YW1wLWguaW4KLQotY29uZmlnLmg6IHN0YW1wLWgKLXN0YW1wLWg6ICR7c3JjZGlyfS9jb25maWcuaC5pbiBjb25maWcuc3RhdHVzCi0JLi9jb25maWcuc3RhdHVzCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JLi9jb25maWcuc3RhdHVzCi0KLWNvbmZpZy5zdGF0dXM6ICR7c3JjZGlyfS9jb25maWd1cmUKLQkuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5pbiBiL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2M4ZjQwLi4wMDAwMDAwCi0tLSBhL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSMgIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotIyAJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotIyAgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotIyAgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSMgIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSMgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSMgIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0jICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSMgIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotIyAgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSMgIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotIyAgd3JpdHRlbiBwZXJtaXNzaW9uLgotIyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotIyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0jCi0jIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvTWFrZWZpbGUuaW4sdiAxLjI5My4yLjcgMjAwNy8wOS8xMiAxOTo0ODo1MCBndXkgRXhwICQgKExCTCkKLQotIwotIyBWYXJpb3VzIGNvbmZpZ3VyYWJsZSBwYXRocyAocmVtZW1iZXIgdG8gZWRpdCBNYWtlZmlsZS5pbiwgbm90IE1ha2VmaWxlKQotIwotCi0jIFRvcCBsZXZlbCBoaWVyYXJjaHkKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLSMgUGF0aG5hbWUgb2YgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGJpbmFyeQotc2JpbmRpciA9IEBzYmluZGlyQAotIyBQYXRobmFtZSBvZiBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbWFuIHBhZ2UKLW1hbmRpciA9IEBtYW5kaXJACi0KLSMgVlBBVEgKLXNyY2RpciA9IEBzcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLSMKLSMgWW91IHNob3VsZG4ndCBuZWVkIHRvIGVkaXQgYW55dGhpbmcgYmVsb3cgaGVyZS4KLSMKLQotQ0MgPSBAQ0NACi1QUk9HID0gdGNwZHVtcAotQ0NPUFQgPSBAVl9DQ09QVEAKLUlOQ0xTID0gLUkuIEBWX0lOQ0xTQAotREVGUyA9IEBERUZTQCBAQ1BQRkxBR1NAIEBWX0RFRlNACi0KLSMgU3RhbmRhcmQgQ0ZMQUdTCi1DRkxBR1MgPSAkKENDT1BUKSAkKERFRlMpICQoSU5DTFMpCi0KLSMgU3RhbmRhcmQgTERGTEFHUwotTERGTEFHUyA9IEBMREZMQUdTQAotCi0jIFN0YW5kYXJkIExJQlMKLUxJQlMgPSBATElCU0AKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi0KLSMgRXhwbGljaXRseSBkZWZpbmUgY29tcGlsYXRpb24gcnVsZSBzaW5jZSBTdW5PUyA0J3MgbWFrZSBkb2Vzbid0IGxpa2UgZ2NjLgotIyBBbHNvLCBnY2MgZG9lcyBub3QgcmVtb3ZlIHRoZSAubyBiZWZvcmUgZm9ya2luZyAnYXMnLCB3aGljaCBjYW4gYmUgYQotIyBwcm9ibGVtIGlmIHlvdSBkb24ndCBvd24gdGhlIGZpbGUgYnV0IGNhbiB3cml0ZSB0byB0aGUgZGlyZWN0b3J5LgotLmMubzoKLQlAcm0gLWYgJEAKLQkkKENDKSAkKENGTEFHUykgLWMgJChzcmNkaXIpLyQqLmMKLQotQ1NSQyA9CWFkZHJ0b25hbWUuYyBhZi5jIGNwYWNrLmMgZ21wbHMuYyBvdWkuYyBnbXQybG9jYWwuYyBpcHByb3RvLmMgXAotICAgICAgICBubHBpZC5jIGwydnBuLmMgbWFjaGRlcC5jIHBhcnNlbmZzZmguYyBcCi0JcHJpbnQtODAyXzExLmMgcHJpbnQtYXAxMzk0LmMgcHJpbnQtYWguYyBwcmludC1hcmNuZXQuYyBcCi0JcHJpbnQtYW9kdi5jIHByaW50LWFycC5jIHByaW50LWFzY2lpLmMgcHJpbnQtYXRhbGsuYyBwcmludC1hdG0uYyBcCi0JcHJpbnQtYmVlcC5jIHByaW50LWJmZC5jIHByaW50LWJncC5jIHByaW50LWJvb3RwLmMgcHJpbnQtY2RwLmMgXAotCXByaW50LWNoZGxjLmMgcHJpbnQtY2lwLmMgcHJpbnQtY25mcC5jIHByaW50LWRjY3AuYyBwcmludC1kZWNuZXQuYyBcCi0JcHJpbnQtZG9tYWluLmMgcHJpbnQtZHZtcnAuYyBwcmludC1lbmMuYyBwcmludC1lZ3AuYyBcCi0JcHJpbnQtZWFwLmMgcHJpbnQtZWlncnAuY1wKLQlwcmludC1lc3AuYyBwcmludC1ldGhlci5jIHByaW50LWZkZGkuYyBwcmludC1mci5jIFwKLQlwcmludC1ncmUuYyBwcmludC1oc3JwLmMgcHJpbnQtaWNtcC5jIHByaW50LWlnbXAuYyBcCi0JcHJpbnQtaWdycC5jIHByaW50LWlwLmMgcHJpbnQtaXBjb21wLmMgcHJpbnQtaXBmYy5jIFwKLQlwcmludC1pcHguYyBwcmludC1pc2FrbXAuYyBwcmludC1pc29jbG5zLmMgcHJpbnQtanVuaXBlci5jIHByaW50LWtyYi5jIFwKLQlwcmludC1sMnRwLmMgcHJpbnQtbGFuZS5jIHByaW50LWxkcC5jIHByaW50LWxsYy5jIFwKLSAgICAgICAgcHJpbnQtbG1wLmMgcHJpbnQtbHNwcGluZy5jIFwKLQlwcmludC1sd3Jlcy5jIHByaW50LW1vYmlsZS5jIHByaW50LW1wbHMuYyBwcmludC1tc2RwLmMgXAotCXByaW50LW5mcy5jIHByaW50LW50cC5jIHByaW50LW51bGwuYyBwcmludC1vbHNyLmMgcHJpbnQtb3NwZi5jIFwKLQlwcmludC1wZ20uYyBwcmludC1waW0uYyBwcmludC1wcHAuYyBwcmludC1wcHBvZS5jIFwKLQlwcmludC1wcHRwLmMgcHJpbnQtcmFkaXVzLmMgcHJpbnQtcmF3LmMgcHJpbnQtcmlwLmMgXAotCXByaW50LXJzdnAuYyBwcmludC1yeC5jIHByaW50LXNjdHAuYyBwcmludC1zaXAuYyBwcmludC1zbC5jIHByaW50LXNsbC5jIFwKLQlwcmludC1zbG93LmMgcHJpbnQtc25tcC5jIHByaW50LXN0cC5jIHByaW50LXN1bmF0bS5jIHByaW50LXN1bnJwYy5jIFwKLQlwcmludC1zeW1hbnRlYy5jIHByaW50LXN5c2xvZy5jIHByaW50LXRjcC5jIHByaW50LXRlbG5ldC5jIHByaW50LXRmdHAuYyBcCi0JcHJpbnQtdGltZWQuYyBwcmludC10b2tlbi5jIHByaW50LXVkcC5jIHByaW50LXZqYy5jIHByaW50LXZycnAuYyBcCi0JcHJpbnQtd2IuYyBwcmludC16ZXBoeXIuYyBzZXRzaWduYWwuYyB0Y3BkdW1wLmMgdXRpbC5jCi0KLUxPQ0FMU1JDID0gQExPQ0FMU1JDQAotR0VOU1JDID0gdmVyc2lvbi5jCi1MSUJPQkpTID0gQExJQk9CSlNACi0KLVNSQyA9CSQoQ1NSQykgJChHRU5TUkMpICQoTE9DQUxTUkMpCi0KLSMgV2Ugd291bGQgbGlrZSB0byBzYXkgIk9CSiA9ICQoU1JDOi5jPS5vKSIgYnV0IFVsdHJpeCdzIG1ha2UgY2Fubm90Ci0jIGhhY2sgdGhlIGV4dHJhIGluZGlyZWN0aW9uCi1PQkogPQkkKENTUkM6LmM9Lm8pICQoR0VOU1JDOi5jPS5vKSAkKExPQ0FMU1JDOi5jPS5vKSAkKExJQk9CSlMpCi1IRFIgPSAgIGFkZHJ0b25hbWUuaCBhcHBsZXRhbGsuaCBib290cC5oIGNwYWNrLmggZGNjcC5oIGRlY25ldC5oIFwKLQlldGhlcnR5cGUuaCBleHRyYWN0LmggZmRkaS5oIGdtdDJsb2NhbC5oIGlncnAuaCBpbnRlcmZhY2UuaCBcCi0JaXB4LmggbGxjLmggbWFjaGRlcC5oIG1pYi5oIG5mc2ZoLmggbmZzdjIuaCBudHAuaCBvc3BmLmggXAotCXNldHNpZ25hbC5oIFwKLQlnbnVjLmggaXBzZWNfZG9pLmggaXNha21wLmggbDJ0cC5oIG5hbWVzZXIuaCBcCi0JbmV0Ymlvcy5oIG9ha2xleS5oIG9zcGY2LmggcGYuaCBwcHAuaCByb3V0ZTZkLmgKLQotVEFHSERSID0gXAotCS91c3IvaW5jbHVkZS9hcnBhL3RmdHAuaCBcCi0JL3Vzci9pbmNsdWRlL25ldC9pZl9hcnAuaCBcCi0JL3Vzci9pbmNsdWRlL25ldC9zbGlwLmggXAotCS91c3IvaW5jbHVkZS9uZXRpbmV0L2lmX2V0aGVyLmggXAotCS91c3IvaW5jbHVkZS9uZXRpbmV0L2luLmggXAotCS91c3IvaW5jbHVkZS9uZXRpbmV0L2lwX2ljbXAuaCBcCi0JL3Vzci9pbmNsdWRlL25ldGluZXQvdGNwLmggXAotCS91c3IvaW5jbHVkZS9uZXRpbmV0L3VkcC5oIFwKLQkvdXNyL2luY2x1ZGUvcHJvdG9jb2xzL3JvdXRlZC5oCi0KLVRBR0ZJTEVTID0gJChTUkMpICQoSERSKSAkKFRBR0hEUikKLQotQ0xFQU5GSUxFUyA9ICQoUFJPRykgJChPQkopICQoR0VOU1JDKQotCi1hbGw6ICQoUFJPRykKLQotJChQUk9HKTogJChPQkopIEBWX1BDQVBERVBACi0JQHJtIC1mICRACi0JJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgJChPQkopICQoTElCUykKLQotZGF0YWxpbmtzLm86ICQoc3JjZGlyKS9taXNzaW5nL2RhdGFsaW5rcy5jCi0JJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL2RhdGFsaW5rcy5jCi1kbG5hbWVzLm86ICQoc3JjZGlyKS9taXNzaW5nL2RsbmFtZXMuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9kbG5hbWVzLmMKLWdldG5hbWVpbmZvLm86ICQoc3JjZGlyKS9taXNzaW5nL2dldG5hbWVpbmZvLmMKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3NpbmcvZ2V0bmFtZWluZm8uYwotZ2V0YWRkcmluZm8ubzogJChzcmNkaXIpL21pc3NpbmcvZ2V0YWRkcmluZm8uYwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9nZXRhZGRyaW5mby5jCi1pbmV0X3B0b24ubzogJChzcmNkaXIpL21pc3NpbmcvaW5ldF9wdG9uLmMKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3NpbmcvaW5ldF9wdG9uLmMKLWluZXRfbnRvcC5vOiAkKHNyY2RpcikvbWlzc2luZy9pbmV0X250b3AuYwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9pbmV0X250b3AuYwotaW5ldF9hdG9uLm86ICQoc3JjZGlyKS9taXNzaW5nL2luZXRfYXRvbi5jCi0JJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL2luZXRfYXRvbi5jCi1zbnByaW50Zi5vOiAkKHNyY2RpcikvbWlzc2luZy9zbnByaW50Zi5jCi0JJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL3NucHJpbnRmLmMKLXN0cmxjYXQubzogJChzcmNkaXIpL21pc3Npbmcvc3RybGNhdC5jCi0JJChDQykgJChDRkxBR1MpIC1vICRAIC1jICQoc3JjZGlyKS9taXNzaW5nL3N0cmxjYXQuYwotc3RybGNweS5vOiAkKHNyY2RpcikvbWlzc2luZy9zdHJsY3B5LmMKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3Npbmcvc3RybGNweS5jCi1zdHJzZXAubzogJChzcmNkaXIpL21pc3Npbmcvc3Ryc2VwLmMKLQkkKENDKSAkKENGTEFHUykgLW8gJEAgLWMgJChzcmNkaXIpL21pc3Npbmcvc3Ryc2VwLmMKLQotdmVyc2lvbi5vOiB2ZXJzaW9uLmMKLQkkKENDKSAkKENGTEFHUykgLWMgdmVyc2lvbi5jCi0KLXZlcnNpb24uYzogJChzcmNkaXIpL1ZFUlNJT04KLQlAcm0gLWYgJEAKLQlzZWQgLWUgJ3MvLiovY2hhciB2ZXJzaW9uW10gPSAiJiI7LycgJChzcmNkaXIpL1ZFUlNJT04gPiAkQAotCi1pbnN0YWxsOgotCVsgLWQgJChERVNURElSKSQoc2JpbmRpcikgXSB8fCBcCi0JICAgIChta2RpciAtcCAkKERFU1RESVIpJChzYmluZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKHNiaW5kaXIpKQotCSQoSU5TVEFMTF9QUk9HUkFNKSAkKFBST0cpICQoREVTVERJUikkKHNiaW5kaXIpLyQoUFJPRykKLQlbIC1kICQoREVTVERJUikkKG1hbmRpcikvbWFuMSBdIHx8IFwKLQkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKG1hbmRpcikvbWFuMTsgY2htb2QgNzU1ICQoREVTVERJUikkKG1hbmRpcikvbWFuMSkKLQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQoUFJPRykuMSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEvJChQUk9HKS4xCi0KLXVuaW5zdGFsbDoKLQlybSAtZiAkKERFU1RESVIpJChzYmluZGlyKS8kKFBST0cpCi0Jcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4xLyQoUFJPRykuMQotCi1saW50OiAkKEdFTlNSQykKLQlsaW50IC1oYnhuICQoU1JDKSB8IFwKLQkgICAgZ3JlcCAtdiAnc3RydWN0L3VuaW9uIC4qIG5ldmVyIGRlZmluZWQnIHwgXAotCSAgICBncmVwIC12ICdwb3NzaWJsZSBwb2ludGVyIGFsaWdubWVudCBwcm9ibGVtJwotCi1jbGVhbjoKLQlybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbjoKLQlybSAtZiAkKENMRUFORklMRVMpIE1ha2VmaWxlIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMgXAotCSAgICBjb25maWcuaCBnbnVjLmggb3MtcHJvdG8uaCBzdGFtcC1oIHN0YW1wLWguaW4KLQotdGFnczogJChUQUdGSUxFUykKLQljdGFncyAtd3RkICQoVEFHRklMRVMpCi0KLXJlbGVhc2V0YXI6Ci0JQGN3ZD1gcHdkYCA7IGRpcj1gYmFzZW5hbWUgJCRjd2RgIDsgbmFtZT0kKFBST0cpLWBjYXQgVkVSU0lPTmAgOyBcCi0JICAgbGlzdD0iIiA7IG1ha2UgZGlzdGNsZWFuOyBjZCAuLjsgbWtkaXIgLXAgbjsgY2QgbjsgbG4gLXMgLi4vJCRkaXIgJCRuYW1lOyBcCi0JICAgdGFyIC1jIC16IC1mICQkbmFtZS50YXIuZ3ogJCRuYW1lLy4gOwotCi1kZXBlbmQ6ICQoR0VOU1JDKQotCSR7c3JjZGlyfS9ta2RlcCAtYyAkKENDKSAkKERFRlMpICQoSU5DTFMpICQoU1JDKQpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWE1ZjdkLi4wMDAwMDAwCi0tLSBhL05PVElDRQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUxpY2Vuc2U6IEJTRAotIAotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWFyZSBtZXQ6Ci0gIAotICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICAgIGRpc3RyaWJ1dGlvbi4KLSAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0gIAotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLUlNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi1XQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCmRpZmYgLS1naXQgYS9QTEFURk9STVMgYi9QTEFURk9STVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMWFlZGYuLjAwMDAwMDAKLS0tIGEvUExBVEZPUk1TCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi09PSBUZXN0ZWQgcGxhdGZvcm1zID09Ci1OZXRCU0QgCQkxLjUvaTM4NgkobWNyIC0gMjAwMi8xLzEpCQotRGViaWFuIExpbnV4ICh3b29keS9pMzg2KQkobWNyIC0gMjAwMi8xLzEpCi0KLS0tLQotUmVkSGF0IExpbnV4IAk2LjEvaTM4NgkoYXNzYXIpCi1GcmVlQlNECQkyLjIuOC9pMzg2CShpdG9qdW4pCi0KLQpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjUxZDMwLi4wMDAwMDAwCi0tLSBhL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi1AKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL1JFQURNRSx2IDEuNjUuMi4xIDIwMDcvMDkvMTQgMDE6MDM6MTIgZ3V5IEV4cCAkIChMQkwpCi0KLVRDUERVTVAgMy45Ci1Ob3cgbWFpbnRhaW5lZCBieSAiVGhlIFRjcGR1bXAgR3JvdXAiCi1TZWUgCQl3d3cudGNwZHVtcC5vcmcKLQotUGxlYXNlIHNlbmQgaW5xdWlyaWVzL2NvbW1lbnRzL3JlcG9ydHMgdG8gCXRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZwotCi1Bbm9ueW1vdXMgQ1ZTIGlzIGF2YWlsYWJsZSB2aWE6Ci0JY3ZzIC1kIDpwc2VydmVyOmN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgbG9naW4KLQkocGFzc3dvcmQgImFub25jdnMiKQotCWN2cyAtZCA6cHNlcnZlcjpjdnMudGNwZHVtcC5vcmc6L3RjcGR1bXAvbWFzdGVyIGNoZWNrb3V0IHRjcGR1bXAKLQotVmVyc2lvbiAzLjkgb2YgVENQRFVNUCBjYW4gYmUgcmV0cmlldmVkIHdpdGggdGhlIENWUyB0YWcgInRjcGR1bXBfM185cmVsMSI6Ci0JY3ZzIC1kIDpwc2VydmVyOmN2cy50Y3BkdW1wLm9yZzovdGNwZHVtcC9tYXN0ZXIgY2hlY2tvdXQgLXIgdGNwZHVtcF8zXzlyZWwxIHRjcGR1bXAKLQotUGxlYXNlIHN1Ym1pdCBwYXRjaGVzIGFnYWluc3QgdGhlIG1hc3RlciBjb3B5IHRvIHRoZSB0Y3BkdW1wIHByb2plY3Qgb24KLXNvdXJjZWZvcmdlLm5ldC4KLQotZm9ybWVybHkgZnJvbSAJTGF3cmVuY2UgQmVya2VsZXkgTmF0aW9uYWwgTGFib3JhdG9yeQotCQlOZXR3b3JrIFJlc2VhcmNoIEdyb3VwIDx0Y3BkdW1wQGVlLmxibC5nb3Y+Ci0JCWZ0cDovL2Z0cC5lZS5sYmwuZ292L3RjcGR1bXAudGFyLlogKDMuNCkKLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgc291cmNlIGNvZGUgZm9yIHRjcGR1bXAsIGEgdG9vbCBmb3IgbmV0d29yawotbW9uaXRvcmluZyBhbmQgZGF0YSBhY3F1aXNpdGlvbi4gIFRoaXMgc29mdHdhcmUgd2FzIG9yaWdpbmFsbHkKLWRldmVsb3BlZCBieSB0aGUgTmV0d29yayBSZXNlYXJjaCBHcm91cCBhdCB0aGUgTGF3cmVuY2UgQmVya2VsZXkKLU5hdGlvbmFsIExhYm9yYXRvcnkuICBUaGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSB2aWEKLWFub255bW91cyBmdHAgdG8gZnRwLmVlLmxibC5nb3YsIGluIHRjcGR1bXAudGFyLlouICBNb3JlIHJlY2VudAotZGV2ZWxvcG1lbnQgaXMgcGVyZm9ybWVkIGF0IHRjcGR1bXAub3JnLCBodHRwOi8vd3d3LnRjcGR1bXAub3JnLwotCi1UY3BkdW1wIHVzZXMgbGlicGNhcCwgYSBzeXN0ZW0taW5kZXBlbmRlbnQgaW50ZXJmYWNlIGZvciB1c2VyLWxldmVsCi1wYWNrZXQgY2FwdHVyZS4gIEJlZm9yZSBidWlsZGluZyB0Y3BkdW1wLCB5b3UgbXVzdCBmaXJzdCByZXRyaWV2ZSBhbmQKLWJ1aWxkIGxpYnBjYXAsIGFsc28gb3JpZ2luYWxseSBmcm9tIExCTCBhbmQgbm93IGJlaW5nIG1haW50YWluZWQgYnkKLXRjcGR1bXAub3JnOyBzZWUgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy8gLgotCi1PbmNlIGxpYnBjYXAgaXMgYnVpbHQgKGVpdGhlciBpbnN0YWxsIGl0IG9yIG1ha2Ugc3VyZSBpdCdzIGluCi0uLi9saWJwY2FwKSwgeW91IGNhbiBidWlsZCB0Y3BkdW1wIHVzaW5nIHRoZSBwcm9jZWR1cmUgaW4gdGhlIElOU1RBTEwKLWZpbGUuCi0KLVRoZSBwcm9ncmFtIGlzIGxvb3NlbHkgYmFzZWQgb24gU01JJ3MgImV0aGVyZmluZCIgYWx0aG91Z2ggbm9uZSBvZiB0aGUKLWV0aGVyZmluZCBjb2RlIHJlbWFpbnMuICBJdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFZhbiBKYWNvYnNvbiBhcwotcGFydCBvZiBhbiBvbmdvaW5nIHJlc2VhcmNoIHByb2plY3QgdG8gaW52ZXN0aWdhdGUgYW5kIGltcHJvdmUgdGNwIGFuZAotaW50ZXJuZXQgZ2F0ZXdheSBwZXJmb3JtYW5jZS4gIFRoZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSBvcmlnaW5hbGx5Ci10YWtlbiBmcm9tIFN1bidzIGV0aGVyZmluZCB3ZXJlIGxhdGVyIHJlLXdyaXR0ZW4gYnkgU3RldmVuIE1jQ2FubmUgb2YKLUxCTC4gIFRvIGluc3VyZSB0aGF0IHRoZXJlIHdvdWxkIGJlIG5vIHZlc3RpZ2Ugb2YgcHJvcHJpZXRhcnkgY29kZSBpbgotdGNwZHVtcCwgU3RldmUgd3JvdGUgdGhlc2UgcGllY2VzIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZ2l2ZW4gYnkgdGhlCi1tYW51YWwgZW50cnksIHdpdGggbm8gYWNjZXNzIHRvIHRoZSBzb3VyY2Ugb2YgdGNwZHVtcCBvciBldGhlcmZpbmQuCi0KLU92ZXIgdGhlIHBhc3QgZmV3IHllYXJzLCB0Y3BkdW1wIGhhcyBiZWVuIHN0ZWFkaWx5IGltcHJvdmVkIGJ5IHRoZQotZXhjZWxsZW50IGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgSW50ZXJuZXQgY29tbXVuaXR5IChqdXN0IGJyb3dzZQotdGhyb3VnaCB0aGUgQ0hBTkdFUyBmaWxlKS4gIFdlIGFyZSBncmF0ZWZ1bCBmb3IgYWxsIHRoZSBpbnB1dC4KLQotUmljaGFyZCBTdGV2ZW5zIGdpdmVzIGFuIGV4Y2VsbGVudCB0cmVhdG1lbnQgb2YgdGhlIEludGVybmV0IHByb3RvY29scwotaW4gaGlzIGJvb2sgYGBUQ1AvSVAgSWxsdXN0cmF0ZWQsIFZvbHVtZSAxJycuIElmIHlvdSB3YW50IHRvIGxlYXJuIG1vcmUKLWFib3V0IHRjcGR1bXAgYW5kIGhvdyB0byBpbnRlcnByZXQgaXRzIG91dHB1dCwgcGljayB1cCB0aGlzIGJvb2suCi0KLVNvbWUgdG9vbHMgZm9yIHZpZXdpbmcgYW5kIGFuYWx5emluZyB0Y3BkdW1wIHRyYWNlIGZpbGVzIGFyZSBhdmFpbGFibGUKLWZyb20gdGhlIEludGVybmV0IFRyYWZmaWMgQXJjaGl2ZToKLQotCWh0dHA6Ly93d3cuYWNtLm9yZy9zaWdjb21tL0lUQS8KLQotQW5vdGhlciB0b29sIHRoYXQgdGNwZHVtcCB1c2VycyBtaWdodCBmaW5kIHVzZWZ1bCBpcyB0Y3BzbGljZToKLQotCWZ0cDovL2Z0cC5lZS5sYmwuZ292L3RjcHNsaWNlLnRhci5aCi0KLUl0IGlzIGEgcHJvZ3JhbSB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgcG9ydGlvbnMgb2YgdGNwZHVtcCBiaW5hcnkKLXRyYWNlIGZpbGVzLiBTZWUgdGhlIGFib3ZlIGRpc3RyaWJ1dGlvbiBmb3IgZnVydGhlciBkZXRhaWxzIGFuZAotZG9jdW1lbnRhdGlvbi4KLQotUHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiBzaG91bGQgYmUgc2VudAotdG8gdGhlIGFkZHJlc3MgInRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZyIuICBCdWdzLCBzdXBwb3J0IHJlcXVlc3RzLAotYW5kIGZlYXR1cmUgcmVxdWVzdHMgbWF5IGFsc28gYmUgc3VibWl0dGVkIG9uIHRoZSBTb3VyY2VGb3JnZSBzaXRlIGZvcgotdGNwZHVtcCBhdAotCi0JaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy90Y3BkdW1wLwotCi1Tb3VyY2UgY29kZSBjb250cmlidXRpb25zLCBldGMuIHNob3VsZCBiZSBzZW50IHRvIHRoZSBlbWFpbCBhZGRyZXNzCi0icGF0Y2hlc0B0Y3BkdW1wLm9yZyIsIG9yIHN1Ym1pdHRlZCBhcyBwYXRjaGVzIG9uIHRoZSBTb3VyY2VGb3JnZSBzaXRlCi1mb3IgdGNwZHVtcC4KLQotQ3VycmVudCB2ZXJzaW9ucyBjYW4gYmUgZm91bmQgYXQgd3d3LnRjcGR1bXAub3JnLCBvciB0aGUgU291cmNlRm9yZ2UKLXNpdGUgZm9yIHRjcGR1bXAuCi0KLSAtIFRoZSBUQ1BkdW1wIHRlYW0KLQotb3JpZ2luYWwgdGV4dCBieTogU3RldmUgTWNDYW5uZSwgQ3JhaWcgTGVyZXMsIFZhbiBKYWNvYnNvbgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGlzIGRpcmVjdG9yeSBhbHNvIGNvbnRhaW5zIHNvbWUgc2hvcnQgYXdrIHByb2dyYW1zIGludGVuZGVkIGFzCi1leGFtcGxlcyBvZiB3YXlzIHRvIHJlZHVjZSB0Y3BkdW1wIGRhdGEgd2hlbiB5b3UncmUgdHJhY2tpbmcKLXBhcnRpY3VsYXIgbmV0d29yayBwcm9ibGVtczoKLQotc2VuZC1hY2suYXdrCi0JU2ltcGxpZmllcyB0aGUgdGNwZHVtcCB0cmFjZSBmb3IgYW4gZnRwIChvciBvdGhlciB1bmlkaXJlY3Rpb25hbAotCXRjcCB0cmFuc2ZlcikuICBTaW5jZSB3ZSBhc3N1bWUgdGhhdCBvbmUgaG9zdCBvbmx5IHNlbmRzIGFuZAotCXRoZSBvdGhlciBvbmx5IGFja3MsIGFsbCBhZGRyZXNzIGluZm9ybWF0aW9uIGlzIGxlZnQgb2ZmIGFuZAotCXdlIGp1c3Qgbm90ZSBpZiB0aGUgcGFja2V0IGlzIGEgInNlbmQiIG9yIGFuICJhY2siLgotCi0JVGhlcmUgaXMgb25lIG91dHB1dCBsaW5lIHBlciBsaW5lIG9mIHRoZSBvcmlnaW5hbCB0cmFjZS4KLQlGaWVsZCAxIGlzIHRoZSBwYWNrZXQgdGltZSBpbiBkZWNpbWFsIHNlY29uZHMsIHJlbGF0aXZlCi0JdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb252ZXJzYXRpb24uICBGaWVsZCAyIGlzIGRlbHRhLXRpbWUKLQlmcm9tIGxhc3QgcGFja2V0LiAgRmllbGQgMyBpcyBwYWNrZXQgdHlwZS9kaXJlY3Rpb24uCi0JIlNlbmQiIG1lYW5zIGRhdGEgZ29pbmcgZnJvbSBzZW5kZXIgdG8gcmVjZWl2ZXIsICJhY2siCi0JbWVhbnMgYW4gYWNrIGdvaW5nIGZyb20gdGhlIHJlY2VpdmVyIHRvIHRoZSBzZW5kZXIuICBBCi0JcHJlY2VkaW5nICIqIiBpbmRpY2F0ZXMgdGhhdCB0aGUgZGF0YSBpcyBhIHJldHJhbnNtaXNzaW9uLgotCUEgcHJlY2VkaW5nICItIiBpbmRpY2F0ZXMgYSBob2xlIGluIHRoZSBzZXF1ZW5jZSBzcGFjZQotCShpLmUuLCBtaXNzaW5nIHBhY2tldChzKSksIGEgIiMiIG1lYW5zIGFuIG9kZC1zaXplIChub3QgbWF4Ci0Jc2VnIHNpemUpIHBhY2tldC4gIEZpZWxkIDQgaGFzIHRoZSBwYWNrZXQgZmxhZ3MKLQkoc2FtZSBmb3JtYXQgYXMgcmF3IHRyYWNlKS4gIEZpZWxkIDUgaXMgdGhlIHNlcXVlbmNlCi0JbnVtYmVyIChzdGFydCBzZXEuIG51bSBmb3Igc2VuZGVyLCBuZXh0IGV4cGVjdGVkIHNlcSBudW1iZXIKLQlmb3IgYWNrcykuICBUaGUgbnVtYmVyIGluIHBhcmVucyBmb2xsb3dpbmcgYW4gYWNrIGlzCi0JdGhlIGRlbHRhLXRpbWUgZnJvbSB0aGUgZmlyc3Qgc2VuZCBvZiB0aGUgcGFja2V0IHRvIHRoZQotCWFjay4gIEEgbnVtYmVyIGluIHBhcmVucyBmb2xsb3dpbmcgYSBzZW5kIGlzIHRoZQotCWRlbHRhLXRpbWUgZnJvbSB0aGUgZmlyc3Qgc2VuZCBvZiB0aGUgcGFja2V0IHRvIHRoZQotCWN1cnJlbnQgc2VuZCAob24gZHVwbGljYXRlIHBhY2tldHMgb25seSkuICBEdXBsaWNhdGUKLQlzZW5kcyBvciBhY2tzIGhhdmUgYSBudW1iZXIgaW4gc3F1YXJlIGJyYWNrZXRzIHNob3dpbmcKLQl0aGUgbnVtYmVyIG9mIGR1cGxpY2F0ZXMgc28gZmFyLgotCi0JSGVyZSBpcyBhIHNob3J0IHNhbXBsZSBmcm9tIG5lYXIgdGhlIHN0YXJ0IG9mIGFuIGZ0cDoKLQkJMy4wMCAgICAwLjIwICAgc2VuZCAuIDUxMgotCQkzLjIwICAgIDAuMjAgICAgYWNrIC4gMTAyNCAgKDAuMjApCi0JCTMuMjAgICAgMC4wMCAgIHNlbmQgUCAxMDI0Ci0JCTMuNDAgICAgMC4yMCAgICBhY2sgLiAxNTM2ICAoMC4yMCkKLQkJMy44MCAgICAwLjQwICogc2VuZCAuIDAgICgzLjgwKSBbMl0KLQkJMy44MiAgICAwLjAyICogIGFjayAuIDE1MzYgICgwLjYyKSBbMl0KLQlUaHJlZSBzZWNvbmRzIGludG8gdGhlIGNvbnZlcnNhdGlvbiwgYnl0ZXMgNTEyIHRocm91Z2ggMTAyMwotCXdlcmUgc2VudC4gIDIwMG1zIGxhdGVyIHRoZXkgd2VyZSBhY2tlZC4gIFNob3J0bHkgdGhlcmVhZnRlcgotCWJ5dGVzIDEwMjQtMTUzNSB3ZXJlIHNlbnQgYW5kIGFnYWluIGFja2VkIGFmdGVyIDIwMG1zLgotCVRoZW4sIGZvciBubyBhcHBhcmVudCByZWFzb24sIDAtNTExIGlzIHJldHJhbnNtaXR0ZWQsIDMuOAotCXNlY29uZHMgYWZ0ZXIgaXRzIGluaXRpYWwgc2VuZCAodGhlIHJvdW5kIHRyaXAgdGltZSBmb3IgdGhpcwotCWZ0cCB3YXMgMXNlYywgKy01MDBtcykuICBTaW5jZSB0aGUgcmVjZWl2ZXIgaXMgZXhwZWN0aW5nCi0JMTUzNiwgMTUzNiBpcyByZS1hY2tlZCB3aGVuIDAgYXJyaXZlcy4KLQotcGFja2V0ZGF0LmF3awotCUNvbXB1dGVzIGNodW5rIHN1bW1hcnkgZGF0YSBmb3IgYW4gZnRwIChvciBzaW1pbGFyCi0JdW5pZGlyZWN0aW9uYWwgdGNwIHRyYW5zZmVyKS4gW0EgImNodW5rIiByZWZlcnMgdG8KLQlhIGNodW5rIG9mIHRoZSBzZXF1ZW5jZSBzcGFjZSAtLSBlc3NlbnRpYWxseSB0aGUgcGFja2V0Ci0Jc2VxdWVuY2UgbnVtYmVyIGRpdmlkZWQgYnkgdGhlIG1heCBzZWdtZW50IHNpemUuXQotCi0JQSBzdW1tYXJ5IGxpbmUgaXMgcHJpbnRlZCBzaG93aW5nIHRoZSBudW1iZXIgb2YgY2h1bmtzLAotCXRoZSBudW1iZXIgb2YgcGFja2V0cyBpdCB0b29rIHRvIHNlbmQgdGhhdCBtYW55IGNodW5rcwotCShpZiB0aGVyZSBhcmUgbm8gbG9zdCBvciBkdXBsaWNhdGVkIHBhY2tldHMsIHRoZSBudW1iZXIKLQlvZiBwYWNrZXRzIHNob3VsZCBlcXVhbCB0aGUgbnVtYmVyIG9mIGNodW5rcykgYW5kIHRoZQotCW51bWJlciBvZiBhY2tzLgotCi0JRm9sbG93aW5nIHRoZSBzdW1tYXJ5IGxpbmUgaXMgb25lIGxpbmUgb2YgaW5mb3JtYXRpb24KLQlwZXIgY2h1bmsuICBUaGUgbGluZSBjb250YWlucyBlaWdodCBmaWVsZHM6Ci0JICAgMSAtIHRoZSBjaHVuayBudW1iZXIKLQkgICAyIC0gdGhlIHN0YXJ0IHNlcXVlbmNlIG51bWJlciBmb3IgdGhpcyBjaHVuawotCSAgIDMgLSB0aW1lIG9mIGZpcnN0IHNlbmQKLQkgICA0IC0gdGltZSBvZiBsYXN0IHNlbmQKLQkgICA1IC0gdGltZSBvZiBmaXJzdCBhY2sKLQkgICA2IC0gdGltZSBvZiBsYXN0IGFjawotCSAgIDcgLSBudW1iZXIgb2YgdGltZXMgY2h1bmsgd2FzIHNlbnQKLQkgICA4IC0gbnVtYmVyIG9mIHRpbWVzIGNodW5rIHdhcyBhY2tlZAotCShhbGwgdGltZXMgYXJlIGluIGRlY2ltYWwgc2Vjb25kcywgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0Ci0Jb2YgdGhlIGNvbnZlcnNhdGlvbi4pCi0KLQlBcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBvdXRwdXQgZm9yCi0JYW4gZnRwIHRyYWNlOgotCi0JIyAxMzQgY2h1bmtzLiAgNTM2IHBhY2tldHMgc2VudC4gIDUwOCBhY2tzLgotCTEgICAgICAgMSAgICAgICAwLjAwICAgIDUuODAgICAgMC4yMCAgICAwLjIwICAgIDQgICAgICAgMQotCTIgICAgICAgNTEzICAgICAwLjI4ICAgIDYuMjAgICAgMC40MCAgICAwLjQwICAgIDQgICAgICAgMQotCTMgICAgICAgMTAyNSAgICAxLjE2ICAgIDYuMzIgICAgMS4yMCAgICAxLjIwICAgIDQgICAgICAgMQotCTQgICAgICAgMTU2MSAgICAxLjg2ICAgIDE1LjAwICAgMi4wMCAgICAyLjAwICAgIDYgICAgICAgMQotCTUgICAgICAgMjA0OSAgICAyLjE2ICAgIDE1LjQ0ICAgMi4yMCAgICAyLjIwICAgIDUgICAgICAgMQotCTYgICAgICAgMjU4NSAgICAyLjY0ICAgIDE2LjQ0ICAgMi44MCAgICAyLjgwICAgIDUgICAgICAgMQotCTcgICAgICAgMzA3MyAgICAzLjAwICAgIDE2LjY2ICAgMy4yMCAgICAzLjIwICAgIDQgICAgICAgMQotCTggICAgICAgMzYwOSAgICAzLjIwICAgIDE3LjI0ICAgMy40MCAgICA1LjgyICAgIDQgICAgICAgMTEKLQk5ICAgICAgIDQwOTcgICAgNi4wMiAgICA2LjU4ICAgIDYuMjAgICAgNi44MCAgICAyICAgICAgIDUKLQotCVRoaXMgc2F5cyB0aGF0IDEzNCBjaHVua3Mgd2VyZSB0cmFuc2ZlcnJlZCAoYWJvdXQgNzBLCi0Jc2luY2UgdGhlIGF2ZXJhZ2UgcGFja2V0IHNpemUgd2FzIDUxMiBieXRlcykuICBJdCB0b29rCi0JNTM2IHBhY2tldHMgdG8gdHJhbnNmZXIgdGhlIGRhdGEgKGkuZS4sIG9uIHRoZSBhdmVyYWdlCi0JZWFjaCBjaHVuayB3YXMgdHJhbnNtaXR0ZWQgZm91ciB0aW1lcykuICBMb29raW5nIGF0LAotCXNheSwgY2h1bmsgNCwgd2Ugc2VlIGl0IHJlcHJlc2VudHMgdGhlIDUxMiBieXRlcyBvZgotCXNlcXVlbmNlIHNwYWNlIGZyb20gMTU2MSB0byAyMDQ4LiAgSXQgd2FzIGZpcnN0IHNlbnQKLQkxLjg2IHNlY29uZHMgaW50byB0aGUgY29udmVyc2F0aW9uLiAgSXQgd2FzIGxhc3QKLQlzZW50IDE1IHNlY29uZHMgaW50byB0aGUgY29udmVyc2F0aW9uIGFuZCB3YXMgc2VudAotCWEgdG90YWwgb2YgNiB0aW1lcyAoaS5lLiwgaXQgd2FzIHJldHJhbnNtaXR0ZWQgZXZlcnkKLQkyIHNlY29uZHMgb24gdGhlIGF2ZXJhZ2UpLiAgSXQgd2FzIGFja2VkIG9uY2UsIDE0MG1zCi0JYWZ0ZXIgaXQgZmlyc3QgYXJyaXZlZC4KLQotc3RpbWUuYXdrCi1hdGltZS5hd2sKLQlPdXRwdXQgb25lIGxpbmUgcGVyIHNlbmQgb3IgYWNrLCByZXNwZWN0aXZlbHksIGluIHRoZSBmb3JtCi0JCTx0aW1lPiA8c2VxLiBudW1iZXI+Ci0Jd2hlcmUgPHRpbWU+IGlzIHRoZSB0aW1lIGluIHNlY29uZHMgc2luY2UgdGhlIHN0YXJ0IG9mIHRoZQotCXRyYW5zZmVyIGFuZCA8c2VxLiBudW1iZXI+IGlzIHRoZSBzZXF1ZW5jZSBudW1iZXIgYmVpbmcgc2VudAotCW9yIGFja2VkLiAgSSB0eXBpY2FsbHkgcGxvdCB0aGlzIGRhdGEgbG9va2luZyBmb3Igc3VzcGljaW91cwotCXBhdHRlcm5zLgotCi0KLVRoZSBwcm9ibGVtIEkgd2FzIGxvb2tpbmcgYXQgd2FzIHRoZSBidWxrLWRhdGEtdHJhbnNmZXIKLXRocm91Z2hwdXQgb2YgbWVkaXVtIGRlbGF5IG5ldHdvcmsgcGF0aHMgKDEtNiBzZWMuICByb3VuZCB0cmlwCi10aW1lKSB1bmRlciB0eXBpY2FsIERBUlBBIEludGVybmV0IGNvbmRpdGlvbnMuICBUaGUgdHJhY2Ugb2YgdGhlCi1mdHAgdHJhbnNmZXIgb2YgYSBsYXJnZSBmaWxlIHdhcyB1c2VkIGFzIHRoZSByYXcgZGF0YSBzb3VyY2UuCi1UaGUgbWV0aG9kIHdhczoKLQotICAtIE9uIGEgbG9jYWwgaG9zdCAoYnV0IG5vdCB0aGUgU3VuIHJ1bm5pbmcgdGNwZHVtcCksIGNvbm5lY3QgdG8KLSAgICB0aGUgcmVtb3RlIGZ0cC4KLQotICAtIE9uIHRoZSBtb25pdG9yIFN1biwgc3RhcnQgdGhlIHRyYWNlIGdvaW5nLiAgRS5nLiwKLSAgICAgIHRjcGR1bXAgaG9zdCBsb2NhbC1ob3N0IGFuZCByZW1vdGUtaG9zdCBhbmQgcG9ydCBmdHAtZGF0YSA+dHJhY2VmaWxlCi0KLSAgLSBPbiBsb2NhbCwgZG8gZWl0aGVyIGEgZ2V0IG9yIHB1dCBvZiBhIGxhcmdlIGZpbGUgKH41MDBLQiksCi0gICAgcHJlZmVyYWJseSB0byB0aGUgbnVsbCBkZXZpY2UgKHRvIG1pbmltaXplIGVmZmVjdHMgbGlrZQotICAgIGNsb3NpbmcgdGhlIHJlY2VpdmUgd2luZG93IHdoaWxlIHdhaXRpbmcgZm9yIGEgZGlzayB3cml0ZSkuCi0KLSAgLSBXaGVuIHRyYW5zZmVyIGlzIGZpbmlzaGVkLCBzdG9wIHRjcGR1bXAuICBVc2UgYXdrIHRvIG1ha2UgdXAKLSAgICB0d28gZmlsZXMgb2Ygc3VtbWFyeSBkYXRhIChtYXhzaXplIGlzIHRoZSBtYXhpbXVtIHBhY2tldCBzaXplLAotICAgIHRyYWNlZGF0YSBpcyB0aGUgZmlsZSBvZiB0Y3BkdW1wIHRyYWNlZGF0YSk6Ci0gICAgICBhd2sgLWYgc2VuZC1hY2suYXdrIHBhY2tldHNpemU9YXZnc2l6ZSB0cmFjZWRhdGEgPnNhCi0gICAgICBhd2sgLWYgcGFja2V0ZGF0LmF3ayBwYWNrZXRzaXplPWF2Z3NpemUgdHJhY2VkYXRhID5wZAotCi0gIC0gV2hpbGUgdGhlIHN1bW1hcnkgZGF0YSBmaWxlcyBhcmUgcHJpbnRpbmcsIHRha2UgYSBsb29rIGF0Ci0gICAgaG93IHRoZSB0cmFuc2ZlciBiZWhhdmVkOgotICAgICAgYXdrIC1mIHN0aW1lLmF3ayB0cmFjZWRhdGEgfCB4Z3JhcGgKLSAgICAoOTAlIG9mIHdoYXQgeW91IGxlYXJuIHNlZW1zIHRvIGhhcHBlbiBpbiB0aGlzIHN0ZXApLgotCi0gIC0gRG8gYWxsIG9mIHRoZSBhYm92ZSBzdGVwcyBzZXZlcmFsIHRpbWVzLCBib3RoIGRpcmVjdGlvbnMsCi0gICAgYXQgZGlmZmVyZW50IHRpbWVzIG9mIGRheSwgd2l0aCBkaWZmZXJlbnQgcHJvdG9jb2wKLSAgICBpbXBsZW1lbnRhdGlvbnMgb24gdGhlIG90aGVyIGVuZC4KLQotICAtIFVzaW5nIG9uZSBvZiB0aGUgVW5peCBkYXRhIGFuYWx5c2lzIHBhY2thZ2VzIChpbiBteSBjYXNlLAotICAgIFMgYW5kIEdhcnkgUGVybG1hbidzIFVuaXh8U3RhdCksIHNwZW5kIGEgZmV3IG1vbnRocyBzdGFyaW5nCi0gICAgYXQgdGhlIGRhdGEuCi0KLSAgLSBDaGFuZ2Ugc29tZXRoaW5nIGluIHRoZSBsb2NhbCBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiBhbmQKLSAgICByZWRvIHRoZSBzdGVwcyBhYm92ZS4KLQotICAtIE9uY2UgYSB3ZWVrLCB0ZWxsIHlvdXIgZnVuZGluZyBhZ2VudCB0aGF0IHlvdSdyZSBkaXNjb3ZlcmluZwotICAgIHdvbmRlcmZ1bCB0aGluZ3MgYW5kIHlvdSdsbCB3cml0ZSB1cCB0aGF0IHJlc2VhcmNoIHJlcG9ydAotICAgICJyZWFsIHNvb24gbm93Ii4KZGlmZiAtLWdpdCBhL1RPRE8gYi9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmM4YjNmLi4wMDAwMDAwCi0tLSBhL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTEuIHVwZGF0ZSBjcmVkaXRzCi0yLiByZXZpZXcgIkZJTEVTIgotMy4gc2VhcmNoIGZvciB2ZXJzaW9uIGluZm8KLTQuIGdldCBQTEFURk9STVMgZmlsbGVkIGluCi01LiB1cGRhdGUgQ0hBTkdFUyBmaWxlCi02LiBkbyBzYW1lIGZvciBsaWJwY2FwCmRpZmYgLS1naXQgYS9WRVJTSU9OIGIvVkVSU0lPTgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjYjQ4NS4uMDAwMDAwMAotLS0gYS9WRVJTSU9OCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMy45LjgKZGlmZiAtLWdpdCBhL2FjY29uZmlnLmggYi9hY2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjhkNTJjLi4wMDAwMDAwCi0tLSBhL2FjY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyogImdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IiBtZWFucyBETyBOT1QgTUFLRSBDSEFOR0VTIFRPIGNvbmZpZy5oLmluIC0tCi0gKiBtYWtlIHRoZW0gdG8gYWNjb25maWcuaCBhbmQgcmVydW4gYXV0b2hlYWRlciAqLwotQFRPUEAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIFNTTGVheSAwLjkuMGIgd2l0aCB0aGUgYnVnZ3kgY2FzdDEyOC4gKi8KLSN1bmRlZiBIQVZFX0JVR0dZX0NBU1QxMjgKLQotLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgSVB2NiBzdXBwb3J0ICovCi0jdW5kZWYgSU5FVDYKLQotLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGxpYnNtaS4gKi8KLSN1bmRlZiBMSUJTTUkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c21pLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NNSV9ICi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0ICovCi0jdW5kZWYgSEFWRV9SRVNfU1RBVEVfRVhUCi0KLS8qIGRlZmluZSBpZiB5b3VyIHN0cnVjdCBfX3Jlc19zdGF0ZSBoYXMgdGhlIG5zb3J0IG1lbWJlciAqLwotI3VuZGVmIEhBVkVfTkVXX1JFU19TVEFURQotCi0vKgotICogZGVmaW5lIGlmIHN0cnVjdCBldGhlcl9oZWFkZXIuZXRoZXJfZGhvc3QgaXMgYSBzdHJ1Y3Qgd2l0aCBldGhlcl9hZGRyX29jdGV0Ci0gKi8KLSN1bmRlZiBFVEhFUl9IRUFERVJfSEFTX0VBCi0KLS8qIGRlZmluZSBpZiBzdHJ1Y3QgZXRoZXJfYXJwIGNvbnRhaW5zIGFycF94c2hhICovCi0jdW5kZWYgRVRIRVJfQVJQX0hBU19YCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWRkcmluZm8gZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9BRERSSU5GTwotCi0vKiBkZWZpbmUgaWYgeW91IG5lZWQgdG8gaW5jbHVkZSBtaXNzaW5nL2FkZHJpbmZvaC5oLiAqLwotI3VuZGVmIE5FRURfQUREUklORk9fSAotCi0vKiBkZWZpbmUgaWZ5b3UgaGF2ZSB0aGUgaF9lcnJubyB2YXJpYWJsZS4gKi8KLSN1bmRlZiBIQVZFX0hfRVJSTk8KLQotLyogZGVmaW5lIGlmIElONkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLwotI3VuZGVmIEhBVkVfSU42QUREUlNaCi0KLS8qIGRlZmluZSBpZiBJTkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLwotI3VuZGVmIEhBVkVfSU5BRERSU1oKLQotLyogZGVmaW5lIGlmIHRoaXMgaXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzLiAqLwotI3VuZGVmIEhBVkVfT1NfUFJPVE9fSAotCi0vKiBkZWZpbmUgaWYgPHVuaXN0ZC5oPiBkZWZpbmVzIF9fUCgpICovCi0jdW5kZWYgSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUKLQotLyogZGVmaW5lIGlmIFJFU19VU0VfSU5FVDYgaXMgZGVmaW5lZCAqLwotI3VuZGVmIEhBVkVfUkVTX1VTRV9JTkVUNgotCi0vKiBkZWZpbmUgaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLwotI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLwotI3VuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgYm90aCBnZXRpcG5vZGVieW5hbWUoKSBhbmQgZ2V0aXBub2RlYnlhZGRyKCkgKi8KLSN1bmRlZiBVU0VfR0VUSVBOT0RFQlkKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGV0aGVyX250b2hvc3QoKSBhbmQgaXQgd29ya3MgKi8KLSN1bmRlZiBVU0VfRVRIRVJfTlRPSE9TVAotCi0vKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF92ZXJzaW9uICovCi0jdW5kZWYgSEFWRV9QQ0FQX1ZFUlNJT04KLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGVidWcgKi8KLSN1bmRlZiBIQVZFX1BDQVBfREVCVUcKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHl5ZGVidWcgKi8KLSN1bmRlZiBIQVZFX1lZREVCVUcKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfbGlzdF9kYXRhbGlua3MoKSAqLwotI3VuZGVmIEhBVkVfUENBUF9MSVNUX0RBVEFMSU5LUwotCi0vKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9zZXRfZGF0YWxpbmsoKSAqLwotI3VuZGVmIEhBVkVfUENBUF9TRVRfREFUQUxJTksKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKSAqLwotI3VuZGVmIEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTAotCi0vKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKSAqLwotI3VuZGVmIEhBVkVfUENBUF9EQVRBTElOS19WQUxfVE9fREVTQ1JJUFRJT04KLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZHVtcF9mdGVsbCgpICovCi0jdW5kZWYgSEFWRV9QQ0FQX0RVTVBfRlRFTEwKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGdldHJwY2J5bnVtYmVyKCkgKi8KLSN1bmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSCi0KLS8qIGRlZmluZSBpZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIGZhaWwgKi8KLSN1bmRlZiBMQkxfQUxJR04KLQotLyogVGhlIHN1Y2Nlc3NmdWwgcmV0dXJuIHZhbHVlIGZyb20gc2lnbmFsICg/KVhYWCAqLwotI3VuZGVmIFJFVFNJR1ZBTAotCi0vKiBEZWZpbmUgdGhpcyBvbiBJUklYICovCi0jdW5kZWYgX0JTRF9TSUdOQUxTCi0KLS8qIEZvciBIUC9VWCBBTlNJIGNvbXBpbGVyPyAqLwotI3VuZGVmIF9IUFVYX1NPVVJDRQotCi0vKiBBSVggaGFjay4gKi8KLSN1bmRlZiBfU1VOCi0KLS8qIFdvcmthcm91bmQgZm9yIG1pc3NpbmcgNjQtYml0IGZvcm1hdHMgKi8KLSN1bmRlZiBQUklkNjQKLSN1bmRlZiBQUklvNjQKLSN1bmRlZiBQUkl4NjQKLSN1bmRlZiBQUkl1NjQKLQotLyogV2hldGhlciBvciBub3QgdG8gaW5jbHVkZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIgKi8KLSN1bmRlZiBUQ1BEVU1QX0RPX1NNQgotCi0vKiBMb25nIHN0b3J5IHNob3J0OiBhY2xvY2FsLm00IGRlcGVuZHMgb24gYXV0b2NvbmYgMi4xMwotICogaW1wbGVtZW50YXRpb24gZGV0YWlscyB3cnQgImNvbnN0IjsgbmV3ZXIgdmVyc2lvbnMKLSAqIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMgc28gZm9yIG5vdyB3ZQotICogcHV0ICJjb25zdCIgaGVyZS4gIFRoaXMgbWF5IGNhdXNlIGR1cGxpY2F0ZSBkZWZpbml0aW9ucwotICogaW4gY29uZmlnLmggYnV0IHRoYXQgc2hvdWxkIGJlIE9LIHNpbmNlIHRoZXkncmUgdGhlIHNhbWUuCi0gKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRuZXRfaHRvYSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9ETkVUX0hUT0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgZG5ldF9odG9hIGRlY2xhcmF0aW9uIGluIDxuZXRkbmV0L2RuZXRkYi5oPi4gICovCi0jdW5kZWYgSEFWRV9ORVRETkVUX0RORVREQl9IX0RORVRfSFRPQQotCi0vKiBkZWZpbmUgaWYgc2hvdWxkIGRyb3AgcHJpdmlsZWdlcyBieSBkZWZhdWx0ICovCi0jdW5kZWYgV0lUSF9VU0VSCi0KLS8qIGRlZmluZSBpZiBzaG91bGQgY2hyb290IHdoZW4gZHJvcHBpbmcgcHJpdmlsZWdlcyAqLwotI3VuZGVmIFdJVEhfQ0hST09UCmRpZmYgLS1naXQgYS9hY2xvY2FsLm00IGIvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3MDEwNS4uMDAwMDAwMAotLS0gYS9hY2xvY2FsLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTI1NiArMCwwIEBACi1kbmwgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9hY2xvY2FsLm00LHYgMS4xMDYuMi43IDIwMDUvMTEvMDggMDM6MDA6NTIgZ3V5IEV4cCAkIChMQkwpCi1kbmwKLWRubCBDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgKLWRubAlUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLWRubAotZG5sIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotZG5sIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotZG5sIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLWRubCBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotZG5sIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLWRubCBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi1kbmwgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLWRubCBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLWRubCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLWRubCB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotZG5sIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotZG5sIHdyaXR0ZW4gcGVybWlzc2lvbi4KLWRubCBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi1kbmwgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLWRubCBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotZG5sCi1kbmwgTEJMIGF1dG9jb25mIG1hY3JvcwotZG5sCi0KLWRubAotZG5sIERldGVybWluZSB3aGljaCBjb21waWxlciB3ZSdyZSB1c2luZyAoY2Mgb3IgZ2NjKQotZG5sIElmIHVzaW5nIGdjYywgZGV0ZXJtaW5lIHRoZSB2ZXJzaW9uIG51bWJlcgotZG5sIElmIHVzaW5nIGNjLCByZXF1aXJlIHRoYXQgaXQgc3VwcG9ydCBhbnNpIHByb3RvdHlwZXMKLWRubCBJZiB1c2luZyBnY2MsIHVzZSAtTzIgKG90aGVyd2lzZSB1c2UgLU8pCi1kbmwgSWYgdXNpbmcgY2MsIGV4cGxpY2l0bHkgc3BlY2lmeSAvdXNyL2xvY2FsL2luY2x1ZGUKLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX0NfSU5JVChjb3B0LCBpbmNscykKLWRubAotZG5sIHJlc3VsdHM6Ci1kbmwKLWRubAkkMSAoY29wdCBzZXQpCi1kbmwJJDIgKGluY2xzIHNldCkKLWRubAlDQwotZG5sCUxERkxBR1MKLWRubAlhY19jdl9sYmxfZ2NjX3ZlcnMKLWRubAlMQkxfQ0ZMQUdTCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9DX0lOSVQsCi0gICAgW0FDX1BSRVJFUSgyLjEyKQotICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DQ10pCi0gICAgQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfRklYSU5DTFVERVNdKQotICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfTEJMX0RFVkVMXSkKLSAgICBBQ19BUkdfV0lUSChnY2MsIFsgIC0td2l0aG91dC1nY2MgICAgICAgICAgIGRvbid0IHVzZSBnY2NdKQotICAgICQxPSItTyIKLSAgICAkMj0iIgotICAgIGlmIHRlc3QgIiR7c3JjZGlyfSIgIT0gIi4iIDsgdGhlbgotCSAgICAkMj0iLUlcJChzcmNkaXIpIgotICAgIGZpCi0gICAgaWYgdGVzdCAiJHtDRkxBR1Mrc2V0fSIgPSBzZXQ7IHRoZW4KLQkgICAgTEJMX0NGTEFHUz0iJENGTEFHUyIKLSAgICBmaQotICAgIGlmIHRlc3QgLXogIiRDQyIgOyB0aGVuCi0JICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0JICAgIGJzZGkqKQotCQkgICAgQUNfQ0hFQ0tfUFJPRyhTSExJQ0MyLCBzaGxpY2MyLCB5ZXMsIG5vKQotCQkgICAgaWYgdGVzdCAkU0hMSUNDMiA9IHllcyA7IHRoZW4KLQkJCSAgICBDQz1zaGxpY2MyCi0JCQkgICAgZXhwb3J0IENDCi0JCSAgICBmaQotCQkgICAgOzsKLQkgICAgZXNhYwotICAgIGZpCi0gICAgaWYgdGVzdCAteiAiJENDIiAtYSAiJHdpdGhfZ2NjIiA9IG5vIDsgdGhlbgotCSAgICBDQz1jYwotCSAgICBleHBvcnQgQ0MKLSAgICBmaQotICAgIEFDX1BST0dfQ0MKLSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KLQkgICAgaWYgdGVzdCAiJFNITElDQzIiID0geWVzIDsgdGhlbgotCQkgICAgYWNfY3ZfbGJsX2djY192ZXJzPTIKLQkJICAgICQxPSItTzIiCi0JICAgIGVsc2UKLQkJICAgIEFDX01TR19DSEVDS0lORyhnY2MgdmVyc2lvbikKLQkJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfZ2NjX3ZlcnMsCi0JCQlhY19jdl9sYmxfZ2NjX3ZlcnM9YCRDQyAtdiAyPiYxIHwgXAotCQkJICAgIHNlZCAtZSAnL15nY2MgdmVyc2lvbiAvIWQnIFwKLQkJCQktZSAncy9eZ2NjIHZlcnNpb24gLy8nIFwKLQkJCQktZSAncy8gLiovLycgLWUgJ3MvXltbW14wLTldXV0qLy8nIFwKLQkJCQktZSAncy9cLi4qLy8nYCkKLQkJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9nY2NfdmVycykKLQkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9nY2NfdmVycyAtZ3QgMSA7IHRoZW4KLQkJCSAgICAkMT0iLU8yIgotCQkgICAgZmkKLQkgICAgZmkKLSAgICBlbHNlCi0JICAgIEFDX01TR19DSEVDS0lORyh0aGF0ICRDQyBoYW5kbGVzIGFuc2kgcHJvdG90eXBlcykKLQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXMsCi0JCUFDX1RSWV9DT01QSUxFKAotCQkgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAotCQkgICAgW2ludCBmcm9iKGludCwgY2hhciAqKV0sCi0JCSAgICBhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzPXllcywKLQkJICAgIGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9bm8pKQotCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzKQotCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzID0gbm8gOyB0aGVuCi0JCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLQotCQkgICAgaHB1eCopCi0JCQkgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKSkKLQkJCSAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKLQkJCSAgICBDRkxBR1M9Ii1BYSAtRF9IUFVYX1NPVVJDRSAkQ0ZMQUdTIgotCQkJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfY2NfaHB1eF9jY19hYSwKLQkJCQlBQ19UUllfQ09NUElMRSgKLQkJCQkgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAotCQkJCSAgICBbaW50IGZyb2IoaW50LCBjaGFyICopXSwKLQkJCQkgICAgYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWE9eWVzLAotCQkJCSAgICBhY19jdl9sYmxfY2NfaHB1eF9jY19hYT1ubykpCi0JCQkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEpCi0JCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEgPSBubyA7IHRoZW4KLQkJCQkgICAgQUNfTVNHX0VSUk9SKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykKLQkJCSAgICBmaQotCQkJICAgIENGTEFHUz0iJHNhdmVkY2ZsYWdzIgotCQkJICAgIFZfQ0NPUFQ9Ii1BYSAkVl9DQ09QVCIKLQkJCSAgICBBQ19ERUZJTkUoX0hQVVhfU09VUkNFKQotCQkJICAgIDs7Ci0KLQkJICAgICopCi0JCQkgICAgQUNfTVNHX0VSUk9SKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykKLQkJCSAgICA7OwotCQkgICAgZXNhYwotCSAgICBmaQotCSAgICAkMj0iJCQyIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgotCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgotCi0JICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0JICAgIGlyaXgqKQotCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLXhhbnNpIC1zaWduZWQgLU8iCi0JCSAgICA7OwotCi0JICAgIG9zZiopCi0JCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtc3RkMSAtTyIKLQkJICAgIDs7Ci0KLQkgICAgdWx0cml4KikKLQkJICAgIEFDX01TR19DSEVDS0lORyh0aGF0IFVsdHJpeCAkQ0MgaGFja3MgY29uc3QgaW4gcHJvdG90eXBlcykKLQkJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfY2NfY29uc3RfcHJvdG8sCi0JCQlBQ19UUllfQ09NUElMRSgKLQkJCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sCi0JCQkgICAgW3N0cnVjdCBhIHsgaW50IGI7IH07Ci0JCQkgICAgdm9pZCBjKGNvbnN0IHN0cnVjdCBhICopXSwKLQkJCSAgICBhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89eWVzLAotCQkJICAgIGFjX2N2X2xibF9jY19jb25zdF9wcm90bz1ubykpCi0JCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfY2NfY29uc3RfcHJvdG8pCi0JCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfY29uc3RfcHJvdG8gPSBubyA7IHRoZW4KLQkJCSAgICBBQ19ERUZJTkUoY29uc3QsKQotCQkgICAgZmkKLQkJICAgIDs7Ci0JICAgIGVzYWMKLSAgICBmaQotXSkKLQotCi0jCi0jIFRyeSBjb21waWxpbmcgYSBzYW1wbGUgb2YgdGhlIHR5cGUgb2YgY29kZSB0aGF0IGFwcGVhcnMgaW4KLSMgZ2VuY29kZS5jIHdpdGggImlubGluZSIsICJfX2lubGluZV9fIiwgYW5kICJfX2lubGluZSIuCi0jCi0jIEF1dG9jb25mJ3MgQUNfQ19JTkxJTkUsIGF0IGxlYXN0IGluIGF1dG9jb25mIDIuMTMsIGlzbid0IGdvb2QgZW5vdWdoLAotIyBhcyBpdCBqdXN0IHRlc3RzIHdoZXRoZXIgYSBmdW5jdGlvbiByZXR1cm5pbmcgImludCIgY2FuIGJlIGlubGluZWQ7Ci0jIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMgb2YgSFAncyBDIGNvbXBpbGVyIGNhbiBpbmxpbmUgdGhhdCwgYnV0IGNhbid0Ci0jIGlubGluZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHN0cnVjdCBwb2ludGVyLgotIwotQUNfREVGVU4oQUNfTEJMX0NfSU5MSU5FLAotICAgIFtBQ19NU0dfQ0hFQ0tJTkcoZm9yIGlubGluZSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2lubGluZSwgWwotCWFjX2N2X2xibF9pbmxpbmU9IiIKLQlhY19sYmxfY2NfaW5saW5lPW5vCi0JZm9yIGFjX2xibF9pbmxpbmUgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmUKLQlkbwotCSAgICBBQ19UUllfQ09NUElMRSgKLQkJWyNkZWZpbmUgaW5saW5lICRhY19sYmxfaW5saW5lCi0JCXN0YXRpYyBpbmxpbmUgc3RydWN0IGlsdGVzdCAqZm9vKHZvaWQpOwotCQlzdHJ1Y3QgaWx0ZXN0IHsKLQkJICAgIGludCBpbHRlc3QxOwotCQkgICAgaW50IGlsdGVzdDI7Ci0JCX07Ci0KLQkJc3RhdGljIGlubGluZSBzdHJ1Y3QgaWx0ZXN0ICoKLQkJZm9vKCkKLQkJewotCQkgICAgc3RhdGljIHN0cnVjdCBpbHRlc3QgeHh4OwotCi0JCSAgICByZXR1cm4gJnh4eDsKLQkJfV0sLGFjX2xibF9jY19pbmxpbmU9eWVzLCkKLQkgICAgaWYgdGVzdCAiJGFjX2xibF9jY19pbmxpbmUiID0geWVzIDsgdGhlbgotCQlicmVhazsKLQkgICAgZmkKLQlkb25lCi0JaWYgdGVzdCAiJGFjX2xibF9jY19pbmxpbmUiID0geWVzIDsgdGhlbgotCSAgICBhY19jdl9sYmxfaW5saW5lPSRhY19sYmxfaW5saW5lCi0JZmldKQotICAgIGlmIHRlc3QgISAteiAiJGFjX2N2X2xibF9pbmxpbmUiIDsgdGhlbgotCUFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9pbmxpbmUpCi0gICAgZWxzZQotCUFDX01TR19SRVNVTFQobm8pCi0gICAgZmkKLSAgICBBQ19ERUZJTkVfVU5RVU9URUQoaW5saW5lLCAkYWNfY3ZfbGJsX2lubGluZSwgW0RlZmluZSBhcyB0b2tlbiBmb3IgaW5saW5lIGlmIGlubGluaW5nIHN1cHBvcnRlZF0pXSkKLQotZG5sCi1kbmwgVXNlIHBmb3Blbi5jIGlmIGF2YWlsYWJsZSBhbmQgcGZvcGVuKCkgbm90IGluIHN0YW5kYXJkIGxpYnJhcmllcwotZG5sIFJlcXVpcmUgbGlicGNhcAotZG5sIExvb2sgZm9yIGxpYnBjYXAgaW4gLi4KLWRubCBVc2UgdGhlIGluc3RhbGxlZCBsaWJwY2FwIGlmIHRoZXJlIGlzIG5vIGxvY2FsIHZlcnNpb24KLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX0xJQlBDQVAocGNhcGRlcCwgaW5jbHMpCi1kbmwKLWRubCByZXN1bHRzOgotZG5sCi1kbmwJJDEgKHBjYXBkZXAgc2V0KQotZG5sCSQyIChpbmNscyBhcHBlbmRlZCkKLWRubAlMSUJTCi1kbmwJTEJMX0xJQlMKLWRubAotQUNfREVGVU4oQUNfTEJMX0xJQlBDQVAsCi0gICAgW0FDX1JFUVVJUkUoW0FDX0xCTF9MSUJSQVJZX05FVF0pCi0gICAgZG5sCi0gICAgZG5sIHNhdmUgYSBjb3B5IGJlZm9yZSBsb2NhdGluZyBsaWJwY2FwLmEKLSAgICBkbmwKLSAgICBMQkxfTElCUz0iJExJQlMiCi0gICAgcGZvcGVuPS91c3IvZXhhbXBsZXMvcGFja2V0ZmlsdGVyL3Bmb3Blbi5jCi0gICAgaWYgdGVzdCAtZiAkcGZvcGVuIDsgdGhlbgotCSAgICBBQ19DSEVDS19GVU5DUyhwZm9wZW4pCi0JICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfcGZvcGVuID0gIm5vIiA7IHRoZW4KLQkJICAgIEFDX01TR19SRVNVTFQoVXNpbmcgJHBmb3BlbikKLQkJICAgIExJQlM9IiRMSUJTICRwZm9wZW4iCi0JICAgIGZpCi0gICAgZmkKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGxvY2FsIHBjYXAgbGlicmFyeSkKLSAgICBsaWJwY2FwPUZBSUwKLSAgICBsYXN0ZGlyPUZBSUwKLSAgICBwbGFjZXM9YGxzICRzcmNkaXIvLi4gfCBzZWQgLWUgJ3MsLyQsLCcgLWUgInMsXiwkc3JjZGlyLy4uLywiIHwgXAotCWVncmVwICcvbGlicGNhcC1bWzAtOV1dKi5bWzAtOV1dKiguW1swLTldXSopPyhbW2FiXV1bWzAtOV1dKik/JCdgCi0gICAgZm9yIGRpciBpbiAkcGxhY2VzICRzcmNkaXIvLi4vbGlicGNhcCAkc3JjZGlyL2xpYnBjYXAgOyBkbwotCSAgICBiYXNlZGlyPWBlY2hvICRkaXIgfCBzZWQgLWUgJ3MvW1thYl1dW1swLTldXSokLy8nYAotCSAgICBpZiB0ZXN0ICRsYXN0ZGlyID0gJGJhc2VkaXIgOyB0aGVuCi0JCSAgICBkbmwgc2tpcCBhbHBoYXMgd2hlbiBhbiBhY3R1YWwgcmVsZWFzZSBpcyBwcmVzZW50Ci0JCSAgICBjb250aW51ZTsKLQkgICAgZmkKLQkgICAgbGFzdGRpcj0kZGlyCi0JICAgIGlmIHRlc3QgLXIgJGRpci9saWJwY2FwLmEgOyB0aGVuCi0JCSAgICBsaWJwY2FwPSRkaXIvbGlicGNhcC5hCi0JCSAgICBkPSRkaXIKLQkJICAgIGRubCBjb250aW51ZSBhbmQgc2VsZWN0IHRoZSBsYXN0IG9uZSB0aGF0IGV4aXN0cwotCSAgICBmaQotICAgIGRvbmUKLSAgICBpZiB0ZXN0ICRsaWJwY2FwID0gRkFJTCA7IHRoZW4KLQkgICAgQUNfTVNHX1JFU1VMVChub3QgZm91bmQpCi0JICAgIEFDX0NIRUNLX0xJQihwY2FwLCBtYWluLCBsaWJwY2FwPSItbHBjYXAiKQotCSAgICBpZiB0ZXN0ICRsaWJwY2FwID0gRkFJTCA7IHRoZW4KLQkJICAgIEFDX01TR19FUlJPUihzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pCi0JICAgIGZpCi0JICAgIGRubAotCSAgICBkbmwgR29vZCBvbGQgUmVkIEhhdCBMaW51eCBwdXRzICJwY2FwLmgiIGluCi0JICAgIGRubCAiL3Vzci9pbmNsdWRlL3BjYXAiOyBoYWQgdGhlIExCTCBmb2xrcyBkb25lIHNvLAotCSAgICBkbmwgdGhhdCB3b3VsZCBoYXZlIGJlZW4gYSBnb29kIGlkZWEsIGJ1dCBmb3IKLQkgICAgZG5sIHRoZSBSZWQgSGF0IGZvbGtzIHRvIGRvIHNvIGp1c3QgYnJlYWtzIHNvdXJjZQotCSAgICBkbmwgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHN5c3RlbXMuCi0JICAgIGRubAotCSAgICBkbmwgV2Ugd29yayBhcm91bmQgdGhpcyBieSBhc3N1bWluZyB0aGF0LCBhcyB3ZSBkaWRuJ3QKLQkgICAgZG5sIGZpbmQgYSBsb2NhbCBsaWJwY2FwLCBsaWJwY2FwIGlzIGluIC91c3IvbGliIG9yCi0JICAgIGRubCAvdXNyL2xvY2FsL2xpYiBhbmQgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBoZWFkZXIKLQkgICAgZG5sIGZpbGUgaXMgdW5kZXIgb25lIG9mIHRob3NlIGRpcmVjdG9yaWVzOyBpZiB3ZSBkb24ndAotCSAgICBkbmwgZmluZCBpdCBpbiBlaXRoZXIgb2YgdGhvc2UgZGlyZWN0b3JpZXMsIHdlIGNoZWNrIHRvCi0JICAgIGRubCBzZWUgaWYgaXQncyBpbiBhICJwY2FwIiBzdWJkaXJlY3Rvcnkgb2YgdGhlbSBhbmQsCi0JICAgIGRubCBpZiBzbywgYWRkIHRoYXQgc3ViZGlyZWN0b3J5IHRvIHRoZSAiLUkiIGxpc3QuCi0JICAgIGRubAotCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGV4dHJhbmVvdXMgcGNhcCBoZWFkZXIgZGlyZWN0b3JpZXMpCi0JICAgIGlmIHRlc3QgXCggISAtciAvdXNyL2xvY2FsL2luY2x1ZGUvcGNhcC5oIFwpIC1hIFwKLQkJCVwoICEgLXIgL3Vzci9pbmNsdWRlL3BjYXAuaCBcKTsgdGhlbgotCQlpZiB0ZXN0IC1yIC91c3IvbG9jYWwvaW5jbHVkZS9wY2FwL3BjYXAuaDsgdGhlbgotCQkgICAgZD0iL3Vzci9sb2NhbC9pbmNsdWRlL3BjYXAiCi0JCWVsaWYgdGVzdCAtciAvdXNyL2luY2x1ZGUvcGNhcC9wY2FwLmg7IHRoZW4KLQkJICAgIGQ9Ii91c3IvaW5jbHVkZS9wY2FwIgotCQlmaQotCSAgICBmaQotCSAgICBpZiB0ZXN0IC16ICIkZCIgOyB0aGVuCi0JCUFDX01TR19SRVNVTFQobm90IGZvdW5kKQotCSAgICBlbHNlCi0JCSQyPSItSSRkICQkMiIKLQkJQUNfTVNHX1JFU1VMVChmb3VuZCAtLSAtSSRkIGFkZGVkKQotCSAgICBmaQotICAgIGVsc2UKLQkgICAgJDE9JGxpYnBjYXAKLQkgICAgcGxhY2VzPWBscyAkc3JjZGlyLy4uIHwgc2VkIC1lICdzLC8kLCwnIC1lICJzLF4sJHNyY2Rpci8uLi8sIiB8IFwKLSAgICAJIAkJZWdyZXAgJy9saWJwY2FwLVtbMC05XV0qLltbMC05XV0qKC5bWzAtOV1dKik/KFtbYWJdXVtbMC05XV0qKT8kJ2AKLQkgICAgaWYgdGVzdCAtciAkZC9wY2FwLmg7IHRoZW4KLQkJICAgICQyPSItSSRkICQkMiIKLQkgICAgZWxpZiB0ZXN0IC1yICRwbGFjZXMvcGNhcC5oOyB0aGVuCi0JCSAgICAkMj0iLUkkcGxhY2VzICQkMiIKLQkgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBBQ19NU0dfRVJST1IoY2Fubm90IGZpbmQgcGNhcC5oLCBzZWUgSU5TVEFMTCkKLSAJICAgIGZpCi0JICAgIEFDX01TR19SRVNVTFQoJGxpYnBjYXApCi0gICAgZmkKLSAgICBMSUJTPSIkbGlicGNhcCAkTElCUyIKLSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLQotICAgIGFpeCopCi0JICAgIHBzZWV4ZT0iL2xpYi9wc2UuZXhwIgotCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yICRwc2VleGUpCi0JICAgIGlmIHRlc3QgLWYgJHBzZWV4ZSA7IHRoZW4KLQkJICAgIEFDX01TR19SRVNVTFQoeWVzKQotCQkgICAgTElCUz0iJExJQlMgLUk6JHBzZWV4ZSIKLQkgICAgZmkKLQkgICAgIwotCSAgICAjIFdlIG5lZWQgIi1sb2RtIiBhbmQgIi1sY2ZnIiwgYXMgbGlicGNhcCByZXF1aXJlcyB0aGVtIG9uCi0JICAgICMgQUlYLCBhbmQgd2UganVzdCBidWlsZCBhIHN0YXRpYyBsaWJwY2FwLmEgYW5kIHRodXMgY2FuJ3QKLQkgICAgIyBhcnJhbmdlIHRoYXQgd2hlbiB5b3UgbGluayB3aXRoIGxpYnBjYXAgeW91IGF1dG9tYXRpY2FsbHkKLQkgICAgIyBsaW5rIHdpdGggdGhvc2UgbGlicmFyaWVzLgotCSAgICAjCi0JICAgIExJQlM9IiRMSUJTIC1sb2RtIC1sY2ZnIgotCSAgICA7OwotICAgIGVzYWMKLQotICAgIGRubAotICAgIGRubCBDaGVjayBmb3IgInBjYXBfbGlzdF9kYXRhbGlua3MoKSIsICJwY2FwX3NldF9kYXRhbGluaygpIiwKLSAgICBkbmwgYW5kICJwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKCkiLCBhbmQgdXNlIHN1YnN0aXR1dGUgdmVyc2lvbnMKLSAgICBkbmwgaWYgdGhleSdyZSBub3QgcHJlc2VudC4KLSAgICBkbmwKLSAgICBBQ19DSEVDS19GVU5DKHBjYXBfbGlzdF9kYXRhbGlua3MsCi0JQUNfREVGSU5FKEhBVkVfUENBUF9MSVNUX0RBVEFMSU5LUyksCi0JWwotCSAgICBBQ19MSUJPQkooZGF0YWxpbmtzKQotCV0pCi0gICAgQUNfQ0hFQ0tfRlVOQyhwY2FwX3NldF9kYXRhbGluaywKLQlBQ19ERUZJTkUoSEFWRV9QQ0FQX1NFVF9EQVRBTElOSykpCi0gICAgQUNfQ0hFQ0tfRlVOQyhwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLAotCVsKLQkgICAgQUNfREVGSU5FKEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTCkKLQkgICAgQUNfQ0hFQ0tfRlVOQyhwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiwKLQkJQUNfREVGSU5FKEhBVkVfUENBUF9EQVRBTElOS19WQUxfVE9fREVTQ1JJUFRJT04pLAotCQlbCi0JCSAgICBBQ19MSUJPQkooZGxuYW1lcykKLQkJXSkKLQldLAotCVsKLQkgICAgQUNfTElCT0JKKGRsbmFtZXMpCi0JXSkKLQotICAgIGRubAotICAgIGRubCBDaGVjayBmb3IgInBjYXBfYnJlYWtsb29wKCkiOyB5b3UgY2FuJ3Qgc3Vic3RpdHV0ZSBmb3IgaXQgaWYKLSAgICBkbmwgaXQncyBhYnNlbnQgKGl0IGhhcyBob29rcyBpbnRvIHRoZSBsaXZlIGNhcHR1cmUgcm91dGluZXMpLAotICAgIGRubCBzbyBqdXN0IGRlZmluZSB0aGUgSEFWRV8gdmFsdWUgaWYgaXQncyB0aGVyZS4KLSAgICBkbmwKLSAgICBBQ19DSEVDS19GVU5DUyhwY2FwX2JyZWFrbG9vcCkKLQotICAgIGRubAotICAgIGRubCBDaGVjayBmb3IgInBjYXBfZHVtcF9mdGVsbCgpIiBhbmQgdXNlIGEgc3Vic3RpdHV0ZSB2ZXJzaW9uCi0gICAgZG5sIGlmIGl0J3Mgbm90IHByZXNlbnQuCi0gICAgQUNfQ0hFQ0tfRlVOQyhwY2FwX2R1bXBfZnRlbGwsCi0JQUNfREVGSU5FKEhBVkVfUENBUF9EVU1QX0ZURUxMKSwKLQlbCi0JICAgIEFDX0xJQk9CSihwY2FwX2R1bXBfZnRlbGwpCi0JXSkKLV0pCi0KLWRubAotZG5sIERlZmluZSBSRVRTSUdUWVBFIGFuZCBSRVRTSUdWQUwKLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX1RZUEVfU0lHTkFMCi1kbmwKLWRubCByZXN1bHRzOgotZG5sCi1kbmwJUkVUU0lHVFlQRSAoZGVmaW5lZCkKLWRubAlSRVRTSUdWQUwgKGRlZmluZWQpCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9UWVBFX1NJR05BTCwKLSAgICBbQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfTElCUENBUF0pCi0gICAgQUNfVFlQRV9TSUdOQUwKLSAgICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaWduYWwiID0gdm9pZCA7IHRoZW4KLQkgICAgQUNfREVGSU5FKFJFVFNJR1ZBTCwpCi0gICAgZWxzZQotCSAgICBBQ19ERUZJTkUoUkVUU0lHVkFMLCgwKSkKLSAgICBmaQotICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0gICAgaXJpeCopCi0JICAgIEFDX0RFRklORShfQlNEX1NJR05BTFMpCi0JICAgIDs7Ci0KLSAgICAqKQotCSAgICBkbmwgcHJlZmVyIHNpZ2FjdGlvbigpIHRvIHNpZ3NldCgpCi0JICAgIEFDX0NIRUNLX0ZVTkNTKHNpZ2FjdGlvbikKLQkgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19zaWdhY3Rpb24gPSBubyA7IHRoZW4KLQkJICAgIEFDX0NIRUNLX0ZVTkNTKHNpZ3NldCkKLQkgICAgZmkKLQkgICAgOzsKLSAgICBlc2FjXSkKLQotZG5sCi1kbmwgSWYgdXNpbmcgZ2NjLCBtYWtlIHN1cmUgd2UgaGF2ZSBBTlNJIGlvY3RsIGRlZmluaXRpb25zCi1kbmwKLWRubCB1c2FnZToKLWRubAotZG5sCUFDX0xCTF9GSVhJTkNMVURFUwotZG5sCi1BQ19ERUZVTihBQ19MQkxfRklYSU5DTFVERVMsCi0gICAgW2lmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMpCi0JICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzLAotCQlBQ19UUllfQ09NUElMRSgKLQkJICAgIFsvKgotCQkgICAgICogVGhpcyBnZW5lcmF0ZXMgYSAiZHVwbGljYXRlIGNhc2UgdmFsdWUiIHdoZW4gZml4aW5jbHVkZXMKLQkJICAgICAqIGhhcyBub3QgYmUgcnVuLgotCQkgICAgICovCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJCWluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jCQlpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSMJCWlmZGVmIEhBVkVfU1lTX0lPQ0NPTV9ICi0jCQlpbmNsdWRlIDxzeXMvaW9jY29tLmg+Ci0jCQllbmRpZl0sCi0JCSAgICBbc3dpdGNoICgwKSB7Ci0JCSAgICBjYXNlIF9JTygnQScsIDEpOjsKLQkJICAgIGNhc2UgX0lPKCdCJywgMSk6OwotCQkgICAgfV0sCi0JCSAgICBhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzPXllcywKLQkJICAgIGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXM9bm8pKQotCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzKQotCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzID0gbm8gOyB0aGVuCi0JCSAgICAjIERvbid0IGNhY2hlIGZhaWx1cmUKLQkJICAgIHVuc2V0IGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMKLQkJICAgIEFDX01TR19FUlJPUihzZWUgdGhlIElOU1RBTEwgZm9yIG1vcmUgaW5mbykKLQkgICAgZmkKLSAgICBmaV0pCi0KLWRubAotZG5sIENoZWNrIGZvciBmbGV4LCBkZWZhdWx0IHRvIGxleAotZG5sIFJlcXVpcmUgZmxleCAyLjQgb3IgaGlnaGVyCi1kbmwgQ2hlY2sgZm9yIGJpc29uLCBkZWZhdWx0IHRvIHlhY2MKLWRubCBEZWZhdWx0IHRvIGxleC95YWNjIGlmIGJvdGggZmxleCBhbmQgYmlzb24gYXJlIG5vdCBhdmFpbGFibGUKLWRubCBEZWZpbmUgdGhlIHl5IHByZWZpeCBzdHJpbmcgaWYgdXNpbmcgZmxleCBhbmQgYmlzb24KLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX0xFWF9BTkRfWUFDQyhsZXgsIHlhY2MsIHl5cHJlZml4KQotZG5sCi1kbmwgcmVzdWx0czoKLWRubAotZG5sCSQxIChsZXggc2V0KQotZG5sCSQyICh5YWNjIGFwcGVuZGVkKQotZG5sCSQzIChvcHRpb25hbCBmbGV4IGFuZCBiaXNvbiAtUCBwcmVmaXgpCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9MRVhfQU5EX1lBQ0MsCi0gICAgW0FDX0FSR19XSVRIKGZsZXgsIFsgIC0td2l0aG91dC1mbGV4ICAgICAgICAgIGRvbid0IHVzZSBmbGV4XSkKLSAgICBBQ19BUkdfV0lUSChiaXNvbiwgWyAgLS13aXRob3V0LWJpc29uICAgICAgICAgZG9uJ3QgdXNlIGJpc29uXSkKLSAgICBpZiB0ZXN0ICIkd2l0aF9mbGV4IiA9IG5vIDsgdGhlbgotCSAgICAkMT1sZXgKLSAgICBlbHNlCi0JICAgIEFDX0NIRUNLX1BST0dTKCQxLCBmbGV4LCBsZXgpCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDEiID0gZmxleCA7IHRoZW4KLQkgICAgIyBUaGUgLVYgZmxhZyB3YXMgYWRkZWQgaW4gMi40Ci0JICAgIEFDX01TR19DSEVDS0lORyhmb3IgZmxleCAyLjQgb3IgaGlnaGVyKQotCSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2ZsZXhfdjI0LAotCQlpZiBmbGV4IC1WID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQkJYWNfY3ZfbGJsX2ZsZXhfdjI0PXllcwotCQllbHNlCi0JCQlhY19jdl9sYmxfZmxleF92MjQ9bm8KLQkJZmkpCi0JICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9mbGV4X3YyNCkKLQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2ZsZXhfdjI0ID0gbm8gOyB0aGVuCi0JCSAgICBzPSIyLjQgb3IgaGlnaGVyIHJlcXVpcmVkIgotCQkgICAgQUNfTVNHX1dBUk4oaWdub3Jpbmcgb2Jzb2xldGUgZmxleCBleGVjdXRhYmxlICgkcykpCi0JCSAgICAkMT1sZXgKLQkgICAgZmkKLSAgICBmaQotICAgIGlmIHRlc3QgIiR3aXRoX2Jpc29uIiA9IG5vIDsgdGhlbgotCSAgICAkMj15YWNjCi0gICAgZWxzZQotCSAgICBBQ19DSEVDS19QUk9HUygkMiwgYmlzb24sIHlhY2MpCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDIiID0gYmlzb24gOyB0aGVuCi0JICAgICQyPSIkJDIgLXkiCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDEiICE9IGxleCAtYSAiJCQyIiA9IHlhY2MgLW8gIiQkMSIgPSBsZXggLWEgIiQkMiIgIT0geWFjYyA7IHRoZW4KLQkgICAgQUNfTVNHX1dBUk4oZG9uJ3QgaGF2ZSBib3RoIGZsZXggYW5kIGJpc29uOyByZXZlcnRpbmcgdG8gbGV4L3lhY2MpCi0JICAgICQxPWxleAotCSAgICAkMj15YWNjCi0gICAgZmkKLSAgICBpZiB0ZXN0ICIkJDEiID0gZmxleCAtYSAtbiAiJDMiIDsgdGhlbgotCSAgICAkMT0iJCQxIC1QJDMiCi0JICAgICQyPSIkJDIgLXAgJDMiCi0gICAgZmldKQotCi1kbmwKLWRubCBDaGVja3MgdG8gc2VlIGlmIHVuaW9uIHdhaXQgaXMgdXNlZCB3aXRoIFdFWElUU1RBVFVTKCkKLWRubAotZG5sIHVzYWdlOgotZG5sCi1kbmwJQUNfTEJMX1VOSU9OX1dBSVQKLWRubAotZG5sIHJlc3VsdHM6Ci1kbmwKLWRubAlERUNMV0FJVFNUQVRVUyAoZGVmaW5lZCkKLWRubAotQUNfREVGVU4oQUNfTEJMX1VOSU9OX1dBSVQsCi0gICAgW0FDX01TR19DSEVDS0lORyhpZiB1bmlvbiB3YWl0IGlzIHVzZWQpCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF91bmlvbl93YWl0LAotCUFDX1RSWV9DT01QSUxFKFsKLSMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCWluY2x1ZGUgPHN5cy93YWl0Lmg+XSwKLQkgICAgW2ludCBzdGF0dXM7Ci0JICAgIHVfaW50IGkgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOwotCSAgICB1X2ludCBqID0gd2FpdHBpZCgwLCAmc3RhdHVzLCAwKTtdLAotCSAgICBhY19jdl9sYmxfdW5pb25fd2FpdD1ubywKLQkgICAgYWNfY3ZfbGJsX3VuaW9uX3dhaXQ9eWVzKSkKLSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfdW5pb25fd2FpdCkKLSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfdW5pb25fd2FpdCA9IHllcyA7IHRoZW4KLQkgICAgQUNfREVGSU5FKERFQ0xXQUlUU1RBVFVTLHVuaW9uIHdhaXQpCi0gICAgZWxzZQotCSAgICBBQ19ERUZJTkUoREVDTFdBSVRTVEFUVVMsaW50KQotICAgIGZpXSkKLQotZG5sCi1kbmwgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgc29ja2FkZHIgc3RydWN0IGhhcyB0aGUgNC40IEJTRCBzYV9sZW4gbWVtYmVyCi1kbmwKLWRubCB1c2FnZToKLWRubAotZG5sCUFDX0xCTF9TT0NLQUREUl9TQV9MRU4KLWRubAotZG5sIHJlc3VsdHM6Ci1kbmwKLWRubAlIQVZFX1NPQ0tBRERSX1NBX0xFTiAoZGVmaW5lZCkKLWRubAotQUNfREVGVU4oQUNfTEJMX1NPQ0tBRERSX1NBX0xFTiwKLSAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgc2FfbGVuIG1lbWJlcikKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4sCi0JQUNfVFJZX0NPTVBJTEUoWwotIwlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0sCi0JW3VfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHIgKikwKS0+c2FfbGVuKV0sCi0JYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW49eWVzLAotCWFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuPW5vKSkKLSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbikKLSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbiA9IHllcyA7IHRoZW4KLQkgICAgQUNfREVGSU5FKEhBVkVfU09DS0FERFJfU0FfTEVOKQotICAgIGZpXSkKLQotZG5sCi1kbmwgQ2hlY2tzIHRvIHNlZSBpZiAtUiBpcyB1c2VkCi1kbmwKLWRubCB1c2FnZToKLWRubAotZG5sCUFDX0xCTF9IQVZFX1JVTl9QQVRICi1kbmwKLWRubCByZXN1bHRzOgotZG5sCi1kbmwJYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGggKHllcyBvciBubykKLWRubAotQUNfREVGVU4oQUNfTEJMX0hBVkVfUlVOX1BBVEgsCi0gICAgW0FDX01TR19DSEVDS0lORyhmb3IgJHtDQy1jY30gLVIpCi0gICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9oYXZlX3J1bl9wYXRoLAotCVtlY2hvICdtYWluKCl7fScgPiBjb25mdGVzdC5jCi0JJHtDQy1jY30gLW8gY29uZnRlc3QgY29uZnRlc3QuYyAtUi9hMS9iMi9jMyA+Y29uZnRlc3Qub3V0IDI+JjEKLQlpZiB0ZXN0ICEgLXMgY29uZnRlc3Qub3V0IDsgdGhlbgotCQlhY19jdl9sYmxfaGF2ZV9ydW5fcGF0aD15ZXMKLQllbHNlCi0JCWFjX2N2X2xibF9oYXZlX3J1bl9wYXRoPW5vCi0JZmkKLQlybSAtZiBjb25mdGVzdCpdKQotICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9oYXZlX3J1bl9wYXRoKQotICAgIF0pCi0KLWRubAotZG5sIENoZWNrIHdoZXRoZXIgYSBnaXZlbiBmb3JtYXQgY2FuIGJlIHVzZWQgdG8gcHJpbnQgNjQtYml0IGludGVnZXJzCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9DSEVDS182NEJJVF9GT1JNQVQsCi0gIFsKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJSQxeCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzXSkKLSAgICBBQ19SVU5fSUZFTFNFKAotICAgICAgWwotCUFDX0xBTkdfU09VUkNFKAotCSAgW1sKLSMJICAgIGlmZGVmIEhBVkVfSU5UVFlQRVNfSAotCSAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSMJICAgIGVuZGlmCi0jCSAgICBpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSAgICAgICAgICAgICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotIwkgICAgZW5kaWYKLQkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCSAgICBtYWluKCkKLQkgICAgewotCSAgICAgIHVfaW50NjRfdCB0ID0gMTsKLQkgICAgICBjaGFyIHN0cmJ1ZlsxNisxXTsKLQkgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiUwMTYkMXgiLCB0IDw8IDMyKTsKLQkgICAgICBpZiAoc3RyY21wKHN0cmJ1ZiwgIjAwMDAwMDAxMDAwMDAwMDAiKSA9PSAwKQotCQlleGl0KDApOwotCSAgICAgIGVsc2UKLQkJZXhpdCgxKTsKLQkgICAgfQotCSAgXV0pCi0gICAgICBdLAotICAgICAgWwotCUFDX0RFRklORShQUklkNjQsICIkMWQiKQotCUFDX0RFRklORShQUklvNjQsICIkMW8iKQotCUFDX0RFRklORShQUkl4NjQsICIkMXgiKQotCUFDX0RFRklORShQUkl1NjQsICIkMXUiKQotCUFDX01TR19SRVNVTFQoeWVzKQotICAgICAgXSwKLSAgICAgIFsKLQlBQ19NU0dfUkVTVUxUKG5vKQotCSQyCi0gICAgICBdKQotICBdKQotCi1kbmwKLWRubCBDaGVja3MgdG8gc2VlIGlmIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgZmFpbAotZG5sCi1kbmwgdXNhZ2U6Ci1kbmwKLWRubAlBQ19MQkxfVU5BTElHTkVEX0FDQ0VTUwotZG5sCi1kbmwgcmVzdWx0czoKLWRubAotZG5sCUxCTF9BTElHTiAoREVGSU5FRCkKLWRubAotQUNfREVGVU4oQUNfTEJMX1VOQUxJR05FRF9BQ0NFU1MsCi0gICAgW0FDX01TR19DSEVDS0lORyhpZiB1bmFsaWduZWQgYWNjZXNzZXMgZmFpbCkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsLAotCVtjYXNlICIkaG9zdF9jcHUiIGluCi0KLQkjCi0JIyBUaGVzZSBhcmUgQ1BVIHR5cGVzIHdoZXJlOgotCSMKLQkjCXRoZSBDUFUgZmF1bHRzIG9uIGFuIHVuYWxpZ25lZCBhY2Nlc3MsIGJ1dCBhdCBsZWFzdCBzb21lCi0JIwlPU2VzIHRoYXQgc3VwcG9ydCB0aGF0IENQVSBjYXRjaCB0aGUgZmF1bHQgYW5kIHNpbXVsYXRlCi0JIwl0aGUgdW5hbGlnbmVkIGFjY2VzcyAoZS5nLiwgQWxwaGEve0RpZ2l0YWwsVHJ1NjR9IFVOSVgpIC0KLQkjCXRoZSBzaW11bGF0aW9uIGlzIHNsb3csIHNvIHdlIGRvbid0IHdhbnQgdG8gdXNlIGl0OwotCSMKLQkjCXRoZSBDUFUsIEkgaW5mZXIgKGZyb20gdGhlIG9sZAotCSMKLQkjIFhYWDogc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGV5IGRvbid0IGRvIHdlaXJkIHRoaW5ncyAobGlrZSBvbiBhcm0pCi0JIwotCSMJY29tbWVudCkgZG9lc24ndCBmYXVsdCBvbiB1bmFsaWduZWQgYWNjZXNzZXMsIGJ1dCBkb2Vzbid0Ci0JIwlkbyBhIG5vcm1hbCB1bmFsaWduZWQgZmV0Y2gsIGVpdGhlciAoZS5nLiwgcHJlc3VtYWJseSwgQVJNKTsKLQkjCi0JIwlmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgdGVzdCBwcm9ncmFtIGRvZXNuJ3Qgd29yawotCSMJKHRoaXMgaGFzIGJlZW4gY2xhaW1lZCB0byBiZSB0aGUgY2FzZSBmb3Igc2V2ZXJhbCBvZiB0aG9zZQotCSMJQ1BVcyAtIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBwcm9ibGVtIGlzOyB0aGUgcHJvYmxlbQotCSMJd2FzIHJlcG9ydGVkIGFzICJ0aGUgdGVzdCBwcm9ncmFtIGR1bXBzIGNvcmUiIGZvciBTdXBlckgsCi0JIwlidXQgdGhhdCdzIHdoYXQgdGhlIHRlc3QgcHJvZ3JhbSBpcyAqc3VwcG9zZWQqIHRvIGRvIC0KLQkjCWl0IGR1bXBzIGNvcmUgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gdGhlIHRlc3QKLQkjCWZvciBhbiBlbXB0eSBvdXRwdXQgZmlsZSBzaG91bGQgZmluZCBhbiBlbXB0eSBvdXRwdXQKLQkjCWZpbGUgYW5kIGNvbmNsdWRlIHRoYXQgdW5hbGlnbmVkIGFjY2Vzc2VzIGRvbid0IHdvcmspLgotCSMKLQkjIFRoaXMgcnVuLXRpbWUgdGVzdCB3b24ndCB3b3JrIGlmIHlvdSdyZSBjcm9zcy1jb21waWxpbmcsIHNvCi0JIyBpbiBvcmRlciB0byBzdXBwb3J0IGNyb3NzLWNvbXBpbGluZyBmb3IgYSBwYXJ0aWN1bGFyIENQVSwKLQkjIHdlIGhhdmUgdG8gd2lyZSBpbiB0aGUgbGlzdCBvZiBDUFUgdHlwZXMgYW55d2F5LCBhcyBmYXIgYXMKLQkjIEkga25vdywgc28gcGVyaGFwcyB3ZSBzaG91bGQganVzdCBoYXZlIGEgc2V0IG9mIENQVXMgb24KLQkjIHdoaWNoIHdlIGtub3cgaXQgZG9lc24ndCB3b3JrLCBhIHNldCBvZiBDUFVzIG9uIHdoaWNoIHdlCi0JIyBrbm93IGl0IGRvZXMgd29yaywgYW5kIGhhdmUgdGhlIHNjcmlwdCBqdXN0IGZhaWwgb24gb3RoZXIKLQkjIGNwdSB0eXBlcyBhbmQgdXBkYXRlIGl0IHdoZW4gc3VjaCBhIGZhaWx1cmUgb2NjdXJzLgotCSMKLQlhbHBoYSp8YXJtKnxocCp8bWlwcyp8c2gqfHNwYXJjKnxpYTY0fG52MSkKLQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPXllcwotCQk7OwotCi0JKikKLQkJY2F0ID5jb25mdGVzdC5jIDw8RU9GCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJCWluY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jCQlpbmNsdWRlIDxzdGRpby5oPgotCQl1bnNpZ25lZCBjaGFyIGFbWzVdXSA9IHsgMSwgMiwgMywgNCwgNSB9OwotCQltYWluKCkgewotCQl1bnNpZ25lZCBpbnQgaTsKLQkJcGlkX3QgcGlkOwotCQlpbnQgc3RhdHVzOwotCQkvKiBhdm9pZCAiY29yZSBkdW1wZWQiIG1lc3NhZ2UgKi8KLQkJcGlkID0gZm9yaygpOwotCQlpZiAocGlkIDwgIDApCi0JCQlleGl0KDIpOwotCQlpZiAocGlkID4gMCkgewotCQkJLyogcGFyZW50ICovCi0JCQlwaWQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7Ci0JCQlpZiAocGlkIDwgMCkKLQkJCQlleGl0KDMpOwotCQkJZXhpdCghV0lGRVhJVEVEKHN0YXR1cykpOwotCQl9Ci0JCS8qIGNoaWxkICovCi0JCWkgPSAqKHVuc2lnbmVkIGludCAqKSZhW1sxXV07Ci0JCXByaW50ZigiJWRcbiIsIGkpOwotCQlleGl0KDApOwotCQl9Ci1FT0YKLQkJJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgXAotCQkgICAgY29uZnRlc3QuYyAkTElCUyA+L2Rldi9udWxsIDI+JjEKLQkJaWYgdGVzdCAhIC14IGNvbmZ0ZXN0IDsgdGhlbgotCQkJZG5sIGZhaWxlZCB0byBjb21waWxlIGZvciBzb21lIHJlYXNvbgotCQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPXllcwotCQllbHNlCi0JCQkuL2NvbmZ0ZXN0ID5jb25mdGVzdC5vdXQKLQkJCWlmIHRlc3QgISAtcyBjb25mdGVzdC5vdXQgOyB0aGVuCi0JCQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPXllcwotCQkJZWxzZQotCQkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD1ubwotCQkJZmkKLQkJZmkKLQkJcm0gLWYgY29uZnRlc3QqIGNvcmUgY29yZS5jb25mdGVzdAotCQk7OwotCWVzYWNdKQotICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF91bmFsaWduZWRfZmFpbCkKLSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwgPSB5ZXMgOyB0aGVuCi0JICAgIEFDX0RFRklORShMQkxfQUxJR04pCi0gICAgZmldKQotCi1kbmwKLWRubCBJZiB1c2luZyBnY2MgYW5kIHRoZSBmaWxlIC5kZXZlbCBleGlzdHM6Ci1kbmwJQ29tcGlsZSB3aXRoIC1nIChpZiBzdXBwb3J0ZWQpIGFuZCAtV2FsbAotZG5sCUlmIHVzaW5nIGdjYyAyIG9yIGxhdGVyLCBkbyBleHRyYSBwcm90b3R5cGUgY2hlY2tpbmcgYW5kIHNvbWUgb3RoZXIKLWRubAljaGVja3MKLWRubAlJZiBhbiBvcyBwcm90b3R5cGUgaW5jbHVkZSBleGlzdHMsIHN5bWxpbmsgb3MtcHJvdG8uaCB0byBpdAotZG5sCi1kbmwgdXNhZ2U6Ci1kbmwKLWRubAlBQ19MQkxfREVWRUwoY29wdCkKLWRubAotZG5sIHJlc3VsdHM6Ci1kbmwKLWRubAkkMSAoY29wdCBhcHBlbmRlZCkKLWRubAlIQVZFX09TX1BST1RPX0ggKGRlZmluZWQpCi1kbmwJb3MtcHJvdG8uaCAoc3ltbGlua2VkKQotZG5sCi1BQ19ERUZVTihBQ19MQkxfREVWRUwsCi0gICAgW3JtIC1mIG9zLXByb3RvLmgKLSAgICBpZiB0ZXN0ICIke0xCTF9DRkxBR1Mrc2V0fSIgPSBzZXQ7IHRoZW4KLQkgICAgJDE9IiQkMSAke0xCTF9DRkxBR1N9IgotICAgIGZpCi0gICAgaWYgdGVzdCAtZiAuZGV2ZWwgOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRHQ0MiID0geWVzIDsgdGhlbgotCQkgICAgaWYgdGVzdCAiJHtMQkxfQ0ZMQUdTK3NldH0iICE9IHNldDsgdGhlbgotCQkJICAgIGlmIHRlc3QgIiRhY19jdl9wcm9nX2NjX2ciID0geWVzIDsgdGhlbgotCQkJCSAgICAkMT0iLWcgJCQxIgotCQkJICAgIGZpCi0JCQkgICAgJDE9IiQkMSAtV2FsbCIKLQkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZ2NjX3ZlcnMgLWd0IDEgOyB0aGVuCi0JCQkJICAgICQxPSIkJDEgLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdzdHJpY3QtcHJvdG90eXBlcyAtV3dyaXRlLXN0cmluZ3MgLVdwb2ludGVyLWFyaXRoIC1XIgotCQkJICAgIGZpCi0JCSAgICBmaQotCSAgICBlbHNlCi0JCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLQotCQkgICAgaXJpeDYqKQotCQkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1uMzIiCi0JCQkgICAgOzsKLQotCQkgICAgKikKLQkJCSAgICA7OwotCQkgICAgZXNhYwotCSAgICBmaQotCSAgICBvcz1gZWNobyAkaG9zdF9vcyB8IHNlZCAtZSAncy9cKFtbMC05XV1bWzAtOV1dKlwpW1teMC05XV0uKiQvXDEvJ2AKLQkgICAgbmFtZT0ibGJsL29zLSRvcy5oIgotCSAgICBpZiB0ZXN0IC1mICRuYW1lIDsgdGhlbgotCQkgICAgbG4gLXMgJG5hbWUgb3MtcHJvdG8uaAotCQkgICAgQUNfREVGSU5FKEhBVkVfT1NfUFJPVE9fSCkKLQkgICAgZWxzZQotCQkgICAgQUNfTVNHX1dBUk4oY2FuJ3QgZmluZCAkbmFtZSkKLQkgICAgZmkKLSAgICBmaV0pCi0KLWRubAotZG5sIEltcHJvdmVkIHZlcnNpb24gb2YgQUNfQ0hFQ0tfTElCCi1kbmwKLWRubCBUaGFua3MgdG8gSm9obiBIYXdraW5zb24gKGpoYXdrQG1pdC5lZHUpCi1kbmwKLWRubCB1c2FnZToKLWRubAotZG5sCUFDX0xCTF9DSEVDS19MSUIoTElCUkFSWSwgRlVOQ1RJT04gWywgQUNUSU9OLUlGLUZPVU5EIFssCi1kbmwJICAgIEFDVElPTi1JRi1OT1QtRk9VTkQgWywgT1RIRVItTElCUkFSSUVTXV1dKQotZG5sCi1kbmwgcmVzdWx0czoKLWRubAotZG5sCUxJQlMKLWRubAotZG5sIFhYWCAtICJBQ19MQkxfTElCUkFSWV9ORVQiIHdhcyByZWRvbmUgdG8gdXNlICJBQ19TRUFSQ0hfTElCUyIKLWRubCByYXRoZXIgdGhhbiAiQUNfTEJMX0NIRUNLX0xJQiIsIHNvIHRoaXMgaXNuJ3QgdXNlZCBhbnkgbW9yZS4KLWRubCBXZSBrZWVwIGl0IGFyb3VuZCBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzIGluIGNhc2UgaXQncyBldmVyCi1kbmwgdXNlZnVsIGluIHRoZSBmdXR1cmUuCi1kbmwKLQotZGVmaW5lKEFDX0xCTF9DSEVDS19MSUIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDIgaW4gLWwkMV0pCi1kbmwgVXNlIGEgY2FjaGUgdmFyaWFibGUgbmFtZSBjb250YWluaW5nIHRoZSBsaWJyYXJ5LCBmdW5jdGlvbgotZG5sIG5hbWUsIGFuZCBleHRyYSBsaWJyYXJpZXMgdG8gbGluayB3aXRoLCBiZWNhdXNlIHRoZSB0ZXN0IHJlYWxseSBpcwotZG5sIGZvciBsaWJyYXJ5ICQxIGRlZmluaW5nIGZ1bmN0aW9uICQyLCB3aGVuIGxpbmtlZCB3aXRoIHBvdGluYWwKLWRubCBsaWJyYXJ5ICQ1LCBub3QganVzdCBmb3IgbGlicmFyeSAkMS4gIFNlcGFyYXRlIHRlc3RzIHdpdGggdGhlIHNhbWUKLWRubCAkMSBhbmQgZGlmZmVyZW50ICQyJ3Mgb3IgJDUncyBtYXkgaGF2ZSBkaWZmZXJlbnQgcmVzdWx0cy4KLWFjX2xpYl92YXI9YGVjaG8gJDFbJ18nXSQyWydfJ10kNSB8IHNlZCAneSUuLystICVfX3BfXyUnYAotQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9saWJfJGFjX2xpYl92YXIsCi1bYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJDEgJDUgJExJQlMiCi1BQ19UUllfTElOSyhkbmwKLWlmZWxzZShbJDJdLCBbbWFpbl0sICwgZG5sIEF2b2lkIGNvbmZsaWN0aW5nIGRlY2wgb2YgbWFpbi4KLVsvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotXWlmZWxzZShBQ19MQU5HLCBDUExVU1BMVVMsIFsjaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotXSlkbmwKLVsvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJDIoKTsKLV0pLAotCSAgICBbJDIoKV0sCi0JICAgIGV2YWwgImFjX2N2X2xibF9saWJfJGFjX2xpYl92YXI9eWVzIiwKLQkgICAgZXZhbCAiYWNfY3ZfbGJsX2xpYl8kYWNfbGliX3Zhcj1ubyIpCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotXSlkbmwKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xibF9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKHllcykKLSAgaWZlbHNlKFskM10sICwKLVtjaGFuZ2VxdW90ZSgsIClkbmwKLSAgYWNfdHJfbGliPUhBVkVfTElCYGVjaG8gJDEgfCBzZWQgLWUgJ3MvW15hLXpBLVowLTlfXS9fL2cnIFwKLSAgICAtZSAneS9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi8nYAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLSAgQUNfREVGSU5FX1VOUVVPVEVEKCRhY190cl9saWIpCi0gIExJQlM9Ii1sJDEgJExJQlMiCi1dLCBbJDNdKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotaWZlbHNlKFskNF0sICwgLCBbJDQKLV0pZG5sCi1maQotXSkKLQotZG5sCi1kbmwgQUNfTEJMX0xJQlJBUllfTkVUCi1kbmwKLWRubCBUaGlzIHRlc3QgaXMgZm9yIG5ldHdvcmsgYXBwbGljYXRpb25zIHRoYXQgbmVlZCBzb2NrZXQoKSBhbmQKLWRubCBnZXRob3N0YnluYW1lKCkgLWlzaCBmdW5jdGlvbnMuICBVbmRlciBTb2xhcmlzLCB0aG9zZSBhcHBsaWNhdGlvbnMKLWRubCBuZWVkIHRvIGxpbmsgd2l0aCAiLWxzb2NrZXQgLWxuc2wiLiAgVW5kZXIgSVJJWCwgdGhleSBuZWVkIHRvIGxpbmsKLWRubCB3aXRoICItbG5zbCIgYnV0IHNob3VsZCAqbm90KiBsaW5rIHdpdGggIi1sc29ja2V0IiBiZWNhdXNlCi1kbmwgbGlic29ja2V0LmEgYnJlYWtzIGEgbnVtYmVyIG9mIHRoaW5ncyAoZm9yIGluc3RhbmNlOgotZG5sIGdldGhvc3RieW5hbWUoKSB1bmRlciBJUklYIDUuMiwgYW5kIHNub29wIHNvY2tldHMgdW5kZXIgbW9zdAotZG5sIHZlcnNpb25zIG9mIElSSVgpLgotZG5sCi1kbmwgVW5mb3J0dW5hdGVseSwgbWFueSBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIGFyZSBub3QgYXdhcmUgb2YgdGhpcywKLWRubCBhbmQgbWlzdGFrZW5seSB3cml0ZSB0ZXN0cyB0aGF0IGNhdXNlIC1sc29ja2V0IHRvIGJlIHVzZWQgdW5kZXIKLWRubCBJUklYLiAgSXQgaXMgYWxzbyBlYXN5IHRvIHdyaXRlIHRlc3RzIHRoYXQgY2F1c2UgLWxuc2wgdG8gYmUgdXNlZAotZG5sIHVuZGVyIG9wZXJhdGluZyBzeXN0ZW1zIHdoZXJlIG5laXRoZXIgYXJlIG5lY2Vzc2FyeSAob3IgdXNlZnVsKSwKLWRubCBzdWNoIGFzIFN1bk9TIDQuMS40LCB3aGljaCB1c2VzIC1sbnNsIGZvciBUTEkuCi1kbmwKLWRubCBUaGlzIHRlc3QgZXhpc3RzIHNvIHRoYXQgZXZlcnkgYXBwbGljYXRpb24gZGV2ZWxvcGVyIGRvZXMgbm90IHRlc3QKLWRubCB0aGlzIGluIGEgZGlmZmVyZW50LCBhbmQgc3VidGx5IGJyb2tlbiBmYXNoaW9uLgotCi1kbmwgSXQgaGFzIGJlZW4gYXJndWVkIHRoYXQgdGhpcyB0ZXN0IHNob3VsZCBiZSBicm9rZW4gdXAgaW50byB0d28KLWRubCBzZXBlcmF0ZSB0ZXN0cywgb25lIGZvciB0aGUgcmVzb2x2ZXIgbGlicmFyaWVzLCBhbmQgb25lIGZvciB0aGUKLWRubCBsaWJyYXJpZXMgbmVjZXNzYXJ5IGZvciB1c2luZyBTb2NrZXRzIEFQSS4gVW5mb3J0dW5hdGVseSwgdGhlIHR3bwotZG5sIGFyZSBjYXJlZnVsbHkgaW50ZXJ0d2luZWQgYW5kIGFsbG93aW5nIHRoZSBhdXRvY29uZiB1c2VyIHRvIHVzZQotZG5sIHRoZW0gaW5kZXBlbmRhbnRseSBwb3RlbnRpYWxseSByZXN1bHRzIGluIHVuZm9ydHVuYXRlIG9yZGVyaW5nCi1kbmwgZGVwZW5kYW5jaWVzIC0tIGFzIHN1Y2gsIHN1Y2ggY29tcG9uZW50IG1hY3JvcyB3b3VsZCBoYXZlIHRvCi1kbmwgY2FyZWZ1bGx5IHVzZSBpbmRpcmVjdGlvbiBhbmQgYmUgYXdhcmUgaWYgdGhlIG90aGVyIGNvbXBvbmVudHMgd2VyZQotZG5sIGV4ZWN1dGVkLiBTaW5jZSBvdGhlciBhdXRvY29uZiBtYWNyb3MgZG8gbm90IGdvIHRvIHRoaXMgdHJvdWJsZSwKLWRubCBhbmQgYWxtb3N0IG5vIGFwcGxpY2F0aW9ucyB1c2Ugc29ja2V0cyB3aXRob3V0IHRoZSByZXNvbHZlciwgdGhpcwotZG5sIGNvbXBsZXhpdHkgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLgotZG5sCi1kbmwgVGhlIGNoZWNrIGZvciBsaWJyZXNvbHYgaXMgaW4gY2FzZSB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gbGluawotZG5sIHN0YXRpY2FsbHkgYW5kIGhhcHBlbiB0byBoYXZlIGEgbGlicmVzb2x2LmEgbHlpbmcgYXJvdW5kIChhbmQgbm8KLWRubCBsaWJuc2wuYSkuCi1kbmwKLUFDX0RFRlVOKEFDX0xCTF9MSUJSQVJZX05FVCwgWwotICAgICMgTW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGdldGhvc3RieW5hbWUoKSBpbiB0aGUgZGVmYXVsdCBzZWFyY2hlZAotICAgICMgbGlicmFyaWVzIChpLmUuIGxpYmMpOgotICAgICMgU29tZSBPU2VzIChlZy4gU29sYXJpcykgcGxhY2UgaXQgaW4gbGlibnNsCi0gICAgIyBTb21lIHN0cmFuZ2UgT1NlcyAoU0lOSVgpIGhhdmUgaXQgaW4gbGlic29ja2V0OgotICAgIEFDX1NFQVJDSF9MSUJTKGdldGhvc3RieW5hbWUsIG5zbCBzb2NrZXQgcmVzb2x2KQotICAgICMgVW5mb3J0dW5hdGVseSBsaWJzb2NrZXQgc29tZXRpbWVzIGRlcGVuZHMgb24gbGlibnNsIGFuZAotICAgICMgQUNfU0VBUkNIX0xJQlMgaXNuJ3QgdXAgdG8gdGhlIHRhc2sgb2YgaGFuZGxpbmcgZGVwZW5kZW5jaWVzIGxpa2UgdGhpcy4KLSAgICBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUiID0gIm5vIgotICAgIHRoZW4KLQlBQ19DSEVDS19MSUIoc29ja2V0LCBnZXRob3N0YnluYW1lLAotICAgICAgICAgICAgICAgICAgICAgTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiLCAsIC1sbnNsKQotICAgIGZpCi0gICAgQUNfU0VBUkNIX0xJQlMoc29ja2V0LCBzb2NrZXQsICwKLQlBQ19DSEVDS19MSUIoc29ja2V0LCBzb2NrZXQsIExJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIiwgLCAtbG5zbCkpCi0gICAgIyBETFBJIG5lZWRzIHB1dG1zZyB1bmRlciBIUFVYIHNvIHRlc3QgZm9yIC1sc3RyIHdoaWxlIHdlJ3JlIGF0IGl0Ci0gICAgQUNfU0VBUkNIX0xJQlMocHV0bXNnLCBzdHIpCi0gICAgXSkKLQotZG5sIENvcHlyaWdodCAoYykgMTk5OSBXSURFIFByb2plY3QuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1kbmwKLWRubCBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLWRubCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLWRubCBhcmUgbWV0OgotZG5sIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci1kbmwgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotZG5sIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci1kbmwgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotZG5sICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi1kbmwgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLWRubCAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLWRubCAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLWRubCAKLWRubCBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotZG5sIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotZG5sIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi1kbmwgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi1kbmwgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLWRubCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotZG5sIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotZG5sIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi1kbmwgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotZG5sIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLWRubCBTVUNIIERBTUFHRS4KLQotZG5sCi1kbmwgQ2hlY2tzIHRvIHNlZSBpZiBBRl9JTkVUNiBpcyBkZWZpbmVkCi1BQ19ERUZVTihBQ19DSEVDS19BRl9JTkVUNiwgWwotCUFDX01TR19DSEVDS0lORyhmb3IgQUZfSU5FVDYpCi0JQUNfQ0FDSEVfVkFMKCQxLAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgotIwkJaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0sCi0JCVtpbnQgYSA9IEFGX0lORVQ2XSwKLQkJJDE9eWVzLAotCQkkMT1ubykpCi0JQUNfTVNHX1JFU1VMVCgkJDEpCi0JCWlmIHRlc3QgJCQxID0geWVzIDsgdGhlbgotCQkJQUNfREVGSU5FKEhBVkVfQUZfSU5FVDYpCi0JZmkKLV0pCi0KLWRubAotZG5sIENoZWNrcyB0byBzZWUgaWYgdGhlIHNvY2thZGRyIHN0cnVjdCBoYXMgdGhlIDQuNCBCU0Qgc2FfbGVuIG1lbWJlcgotZG5sIGJvcnJvd2VkIGZyb20gTEJMIGxpYnBjYXAKLUFDX0RFRlVOKEFDX0NIRUNLX1NBX0xFTiwgWwotCUFDX01TR19DSEVDS0lORyhpZiBzb2NrYWRkciBzdHJ1Y3QgaGFzIHNhX2xlbiBtZW1iZXIpCi0JQUNfQ0FDSEVfVkFMKCQxLAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgotIwkJaW5jbHVkZSA8c3lzL3NvY2tldC5oPl0sCi0JCVt1X2ludCBpID0gc2l6ZW9mKCgoc3RydWN0IHNvY2thZGRyICopMCktPnNhX2xlbildLAotCQkkMT15ZXMsCi0JCSQxPW5vKSkKLQlBQ19NU0dfUkVTVUxUKCQkMSkKLQkJaWYgdGVzdCAkJDEgPSB5ZXMgOyB0aGVuCi0JCQlBQ19ERUZJTkUoSEFWRV9TT0NLQUREUl9TQV9MRU4pCi0JZmkKLV0pCi0KLWRubAotZG5sIENoZWNrcyBmb3IgcG9ydGFibGUgcHJvdG90eXBlIGRlY2xhcmF0aW9uIG1hY3JvCi1BQ19ERUZVTihBQ19DSEVDS19QT1JUQUJMRV9QUk9UTywgIFsKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIF9fUCkKLQlBQ19DQUNIRV9WQUwoJDEsCi0JQUNfVFJZX0NPTVBJTEUoWwotIwkJaW5jbHVkZSA8dW5pc3RkLmg+XSwKLQkJW2ludCBmIF9fUCgoKSldLAotCQkkMT15ZXMsCi0JCSQxPW5vKSkKLQlBQ19NU0dfUkVTVUxUKCQkMSkKLQlpZiB0ZXN0ICQkMSA9IHllczsgdGhlbgotCQlBQ19ERUZJTkUoSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUpCi0JZmkKLV0pCi0KLWRubCBjaGVja3MgZm9yIHVfaW50WFhfdAotQUNfREVGVU4oQUNfQ0hFQ0tfQklUVFlQRVMsIFsKLQkkMT15ZXMKLWRubCBjaGVjayBmb3IgdV9pbnQ4X3QKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIHVfaW50OF90KQotCUFDX0NBQ0hFX1ZBTChhY19jdl91X2ludDhfdCwKLQlBQ19UUllfQ09NUElMRShbCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAotCQlbdV9pbnQ4X3QgaV0sCi0JCWFjX2N2X3VfaW50OF90PXllcywKLQkJYWNfY3ZfdV9pbnQ4X3Q9bm8pKQotCUFDX01TR19SRVNVTFQoJGFjX2N2X3VfaW50OF90KQotCWlmIHRlc3QgJGFjX2N2X3VfaW50OF90ID0geWVzOyB0aGVuCi0JCUFDX0RFRklORShIQVZFX1VfSU5UOF9UKQotCWVsc2UKLQkJJDE9bm8KLQlmaQotZG5sIGNoZWNrIGZvciB1X2ludDE2X3QKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIHVfaW50MTZfdCkKLQlBQ19DQUNIRV9WQUwoYWNfY3ZfdV9pbnQxNl90LAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPl0sCi0JCVt1X2ludDE2X3QgaV0sCi0JCWFjX2N2X3VfaW50MTZfdD15ZXMsCi0JCWFjX2N2X3VfaW50MTZfdD1ubykpCi0JQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdV9pbnQxNl90KQotCWlmIHRlc3QgJGFjX2N2X3VfaW50MTZfdCA9IHllczsgdGhlbgotCQlBQ19ERUZJTkUoSEFWRV9VX0lOVDE2X1QpCi0JZWxzZQotCQkkMT1ubwotCWZpCi1kbmwgY2hlY2sgZm9yIHVfaW50MzJfdAotCUFDX01TR19DSEVDS0lORyhmb3IgdV9pbnQzMl90KQotCUFDX0NBQ0hFX1ZBTChhY19jdl91X2ludDMyX3QsCi0JQUNfVFJZX0NPTVBJTEUoWwotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwKLQkJW3VfaW50MzJfdCBpXSwKLQkJYWNfY3ZfdV9pbnQzMl90PXllcywKLQkJYWNfY3ZfdV9pbnQzMl90PW5vKSkKLQlBQ19NU0dfUkVTVUxUKCRhY19jdl91X2ludDMyX3QpCi0JaWYgdGVzdCAkYWNfY3ZfdV9pbnQzMl90ID0geWVzOyB0aGVuCi0JCUFDX0RFRklORShIQVZFX1VfSU5UMzJfVCkKLQllbHNlCi0JCSQxPW5vCi0JZmkKLWRubCBjaGVjayBmb3IgdV9pbnQ2NF90Ci0JQUNfTVNHX0NIRUNLSU5HKGZvciB1X2ludDY0X3QpCi0JQUNfQ0FDSEVfVkFMKGFjX2N2X3VfaW50NjRfdCwKLQlBQ19UUllfQ09NUElMRShbCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAotCQlbdV9pbnQ2NF90IGldLAotCQlhY19jdl91X2ludDY0X3Q9eWVzLAotCQlhY19jdl91X2ludDY0X3Q9bm8pKQotCUFDX01TR19SRVNVTFQoJGFjX2N2X3VfaW50NjRfdCkKLQlpZiB0ZXN0ICRhY19jdl91X2ludDY0X3QgPSB5ZXM7IHRoZW4KLQkJQUNfREVGSU5FKEhBVkVfVV9JTlQ2NF9UKQotCWVsc2UKLQkJJDE9bm8KLQlmaQotXSkKLQotZG5sCi1kbmwgQ2hlY2tzIGZvciBhZGRyaW5mbyBzdHJ1Y3R1cmUKLUFDX0RFRlVOKEFDX1NUUlVDVF9BRERSSU5GTywgWwotCUFDX01TR19DSEVDS0lORyhmb3IgYWRkcmluZm8pCi0JQUNfQ0FDSEVfVkFMKCQxLAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPG5ldGRiLmg+XSwKLQkJW3N0cnVjdCBhZGRyaW5mbyBhXSwKLQkJJDE9eWVzLAotCQkkMT1ubykpCi0JQUNfTVNHX1JFU1VMVCgkJDEpCi0JaWYgdGVzdCAkJDEgPSB5ZXM7IHRoZW4KLQkJQUNfREVGSU5FKEhBVkVfQUREUklORk8pCi0JZWxzZQotCQlBQ19ERUZJTkUoTkVFRF9BRERSSU5GT19IKQotCWZpCi1dKQotCi1kbmwKLWRubCBDaGVja3MgZm9yIE5JX01BWFNFUlYKLUFDX0RFRlVOKEFDX05JX01BWFNFUlYsIFsKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIE5JX01BWFNFUlYpCi0JQUNfQ0FDSEVfVkFMKCQxLAotCUFDX0VHUkVQX0NQUCh5ZXMsIFsjaW5jbHVkZSA8bmV0ZGIuaD4KLSNpZmRlZiBOSV9NQVhTRVJWCi15ZXMKLSNlbmRpZl0sCi0JCSQxPXllcywKLQkJJDE9bm8pKQotCUFDX01TR19SRVNVTFQoJCQxKQotCWlmIHRlc3QgJCQxICE9IHllczsgdGhlbgotCQlBQ19ERUZJTkUoTkVFRF9BRERSSU5GT19IKQotCWZpCi1dKQotCi1kbmwKLWRubCBDaGVja3MgZm9yIE5JX05BTUVSRVFECi1BQ19ERUZVTihBQ19OSV9OQU1FUkVRRCwgWwotCUFDX01TR19DSEVDS0lORyhmb3IgTklfTkFNRVJFUUQpCi0JQUNfQ0FDSEVfVkFMKCQxLAotCUFDX0VHUkVQX0NQUCh5ZXMsIFsjaW5jbHVkZSA8bmV0ZGIuaD4KLSNpZmRlZiBOSV9OT0ZRRE4KLXllcwotI2VuZGlmXSwKLQkJJDE9eWVzLAotCQkkMT1ubykpCi0JQUNfTVNHX1JFU1VMVCgkJDEpCi0JaWYgdGVzdCAkJDEgIT0geWVzOyB0aGVuCi0JCUFDX0RFRklORShORUVEX0FERFJJTkZPX0gpCi0JZmkKLV0pCi0KLWRubAotZG5sIENoZWNrcyBmb3Igc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUKLUFDX0RFRlVOKEFDX1NUUlVDVF9TQV9TVE9SQUdFLCBbCi0JQUNfTVNHX0NIRUNLSU5HKGZvciBzb2NrYWRkcl9zdG9yYWdlKQotCUFDX0NBQ0hFX1ZBTCgkMSwKLQlBQ19UUllfQ09NUElMRShbCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD5dLAotCQlbc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc10sCi0JCSQxPXllcywKLQkJJDE9bm8pKQotCUFDX01TR19SRVNVTFQoJCQxKQotCWlmIHRlc3QgJCQxID0geWVzOyB0aGVuCi0JCUFDX0RFRklORShIQVZFX1NPQ0tBRERSX1NUT1JBR0UpCi0JZmkKLV0pCi0KLWRubAotZG5sIENoZWNrcyBmb3IgbWFjcm8gb2YgSVAgYWRkcmVzcyBzaXplCi1BQ19ERUZVTihBQ19DSEVDS19BRERSU1osIFsKLQkkMT15ZXMKLWRubCBjaGVjayBmb3IgSU5BRERSU1oKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIElOQUREUlNaKQotCUFDX0NBQ0hFX1ZBTChhY19jdl9pbmFkZHJzeiwKLQlBQ19UUllfQ09NUElMRShbCi0jCQlpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD5dLAotCQlbaW50IGEgPSBJTkFERFJTWl0sCi0JCWFjX2N2X2luYWRkcnN6PXllcywKLQkJYWNfY3ZfaW5hZGRyc3o9bm8pKQotCUFDX01TR19SRVNVTFQoJGFjX2N2X2luYWRkcnN6KQotCWlmIHRlc3QgJGFjX2N2X2luYWRkcnN6ID0geWVzOyB0aGVuCi0JCUFDX0RFRklORShIQVZFX0lOQUREUlNaKQotCWVsc2UKLQkJJDE9bm8KLQlmaQotZG5sIGNoZWNrIGZvciBJTjZBRERSU1oKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIElONkFERFJTWikKLQlBQ19DQUNIRV9WQUwoYWNfY3ZfaW42YWRkcnN6LAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPGFycGEvbmFtZXNlci5oPl0sCi0JCVtpbnQgYSA9IElONkFERFJTWl0sCi0JCWFjX2N2X2luNmFkZHJzej15ZXMsCi0JCWFjX2N2X2luNmFkZHJzej1ubykpCi0JQUNfTVNHX1JFU1VMVCgkYWNfY3ZfaW42YWRkcnN6KQotCWlmIHRlc3QgJGFjX2N2X2luNmFkZHJzeiA9IHllczsgdGhlbgotCQlBQ19ERUZJTkUoSEFWRV9JTjZBRERSU1opCi0JZWxzZQotCQkkMT1ubwotCWZpCi1dKQotCi1kbmwKLWRubCBjaGVjayBmb3IgUkVTX1VTRV9JTkVUNgotQUNfREVGVU4oQUNfQ0hFQ0tfUkVTX1VTRV9JTkVUNiwgWwotCUFDX01TR19DSEVDS0lORyhmb3IgUkVTX1VTRV9JTkVUNikKLQlBQ19DQUNIRV9WQUwoJDEsCi0JQUNfVFJZX0NPTVBJTEUoWwotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jCQlpbmNsdWRlIDxyZXNvbHYuaD5dLAotCQlbaW50IGEgPSBSRVNfVVNFX0lORVQ2XSwKLQkJJDE9eWVzLAotCQkkMT1ubykpCi0JQUNfTVNHX1JFU1VMVCgkJDEpCi0JaWYgdGVzdCAkJDEgPSB5ZXM7IHRoZW4KLQkJQUNfREVGSU5FKEhBVkVfUkVTX1VTRV9JTkVUNikKLQlmaQotXSkKLQotZG5sCi1kbmwgY2hlY2sgZm9yIEFBQUEKLUFDX0RFRlVOKEFDX0NIRUNLX0FBQUEsIFsKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIEFBQUEpCi0JQUNfQ0FDSEVfVkFMKCQxLAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgotIwkJaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+XSwKLQkJW2ludCBhID0gVF9BQUFBXSwKLQkJJDE9eWVzLAotCQkkMT1ubykpCi0JQUNfTVNHX1JFU1VMVCgkJDEpCi0JaWYgdGVzdCAkJDEgPSB5ZXM7IHRoZW4KLQkJQUNfREVGSU5FKEhBVkVfQUFBQSkKLQlmaQotXSkKLQotZG5sCi1kbmwgY2hlY2sgZm9yIHN0cnVjdCByZXNfc3RhdGVfZXh0Ci1BQ19ERUZVTihBQ19TVFJVQ1RfUkVTX1NUQVRFX0VYVCwgWwotCUFDX01TR19DSEVDS0lORyhmb3IgcmVzX3N0YXRlX2V4dCkKLQlBQ19DQUNIRV9WQUwoJDEsCi0JQUNfVFJZX0NPTVBJTEUoWwotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0Ni9pbjYuaD4KLSMJCWluY2x1ZGUgPHJlc29sdi5oPl0sCi0JCVtzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0IGVdLAotCQkkMT15ZXMsCi0JCSQxPW5vKSkKLQlBQ19NU0dfUkVTVUxUKCQkMSkKLQlpZiB0ZXN0ICQkMSA9IHllczsgdGhlbgotCQlBQ19ERUZJTkUoSEFWRV9SRVNfU1RBVEVfRVhUKQotCWZpCi1dKQotCi1kbmwKLWRubCBjaGVjayBmb3Igc3RydWN0IHJlc19zdGF0ZV9leHQKLUFDX0RFRlVOKEFDX1NUUlVDVF9SRVNfU1RBVEUsIFsKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIG5zb3J0IGluIHJlc19zdGF0ZSkKLQlBQ19DQUNIRV9WQUwoJDEsCi0JQUNfVFJZX0NPTVBJTEUoWwotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0Ni9pbjYuaD4KLSMJCWluY2x1ZGUgPHJlc29sdi5oPl0sCi0JCVtzdHJ1Y3QgX19yZXNfc3RhdGUgZTsgZS5uc29ydCA9IDBdLAotCQkkMT15ZXMsCi0JCSQxPW5vKSkKLQlBQ19NU0dfUkVTVUxUKCQkMSkKLQlpZiB0ZXN0ICQkMSA9IHllczsgdGhlbgotCQlBQ19ERUZJTkUoSEFWRV9ORVdfUkVTX1NUQVRFKQotCWZpCi1dKQotCi1kbmwKLWRubCBjaGVjayBmb3IgaF9lcnJubwotQUNfREVGVU4oQUNfVkFSX0hfRVJSTk8sIFsKLQlBQ19NU0dfQ0hFQ0tJTkcoZm9yIGhfZXJybm8pCi0JQUNfQ0FDSEVfVkFMKGFjX2N2X3Zhcl9oX2Vycm5vLAotCUFDX1RSWV9DT01QSUxFKFsKLSMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgotIwkJaW5jbHVkZSA8bmV0ZGIuaD5dLAotCQlbaW50IGZvbyA9IGhfZXJybm87XSwKLQkJYWNfY3ZfdmFyX2hfZXJybm89eWVzLAotCQlhY19jdl92YXJfaF9lcnJubz1ubykpCi0JQUNfTVNHX1JFU1VMVCgkYWNfY3ZfdmFyX2hfZXJybm8pCi0JaWYgdGVzdCAiJGFjX2N2X3Zhcl9oX2Vycm5vIiA9ICJ5ZXMiOyB0aGVuCi0JCUFDX0RFRklORShIQVZFX0hfRVJSTk8pCi0JZmkKLV0pCi0KLWRubAotZG5sIFRlc3QgZm9yIF9fYXR0cmlidXRlX18KLWRubAotCi1BQ19ERUZVTihBQ19DX19fQVRUUklCVVRFX18sIFsKLUFDX01TR19DSEVDS0lORyhmb3IgX19hdHRyaWJ1dGVfXykKLUFDX0NBQ0hFX1ZBTChhY19jdl9fX2F0dHJpYnV0ZV9fLCBbCi1BQ19DT01QSUxFX0lGRUxTRSgKLSAgQUNfTEFOR19TT1VSQ0UoW1sKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotc3RhdGljIHZvaWQgZm9vKHZvaWQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOwotCi1zdGF0aWMgdm9pZAotZm9vKHZvaWQpCi17Ci0gIGV4aXQoMSk7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gIGZvbygpOwotfQotICBdXSksCi1hY19jdl9fX2F0dHJpYnV0ZV9fPXllcywKLWFjX2N2X19fYXR0cmlidXRlX189bm8pXSkKLWlmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA9ICJ5ZXMiOyB0aGVuCi0gIEFDX0RFRklORShIQVZFX19fQVRUUklCVVRFX18sIDEsIFtkZWZpbmUgaWYgeW91ciBjb21waWxlciBoYXMgX19hdHRyaWJ1dGVfX10pCi0gIFZfREVGUz0iJFZfREVGUyAtRF9VXz1cIl9fYXR0cmlidXRlX18oKHVudXNlZCkpXCIiCi1lbHNlCi0gIFZfREVGUz0iJFZfREVGUyAtRF9VXz1cIlwiIgotZmkKLUFDX01TR19SRVNVTFQoJGFjX2N2X19fYXR0cmlidXRlX18pCi1dKQpkaWZmIC0tZ2l0IGEvYWRkcnRvbmFtZS5jIGIvYWRkcnRvbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Q2MTVmLi4wMDAwMDAwCi0tLSBhL2FkZHJ0b25hbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDExNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqICBJbnRlcm5ldCwgZXRoZXJuZXQsIHBvcnQsIGFuZCBwcm90b2NvbCBzdHJpbmcgdG8gYWRkcmVzcwotICogIGFuZCBhZGRyZXNzIHRvIHN0cmluZyBjb252ZXJzaW9uIHJvdXRpbmVzCi0gKi8KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2FkZHJ0b25hbWUuYyx2IDEuMTA4LjIuOSAyMDA3LzA5LzE0IDAwOjI2OjE4IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2lmZGVmIFVTRV9FVEhFUl9OVE9IT1NUCi0jaWZkZWYgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gKLXN0cnVjdCBtYnVmOwkJLyogU3F1ZWxjaCBjb21waWxlciB3YXJuaW5ncyBvbiBzb21lIHBsYXRmb3JtcyBmb3IgKi8KLXN0cnVjdCBydGVudHJ5OwkJLyogZGVjbGFyYXRpb25zIGluIDxuZXQvaWYuaD4gKi8KLSNpbmNsdWRlIDxuZXQvaWYuaD4JLyogZm9yICJzdHJ1Y3QgaWZuZXQiIGluICJzdHJ1Y3QgYXJwY29tIiBvbiBTb2xhcmlzICovCi0jaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgotI2VuZGlmIC8qIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IICovCi0jaWZkZWYgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QKLSNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+Ci0jZW5kaWYgLyogTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QgKi8KLQotI2lmICFkZWZpbmVkKEhBVkVfREVDTF9FVEhFUl9OVE9IT1NUKSB8fCAhSEFWRV9ERUNMX0VUSEVSX05UT0hPU1QKLSNpZm5kZWYgSEFWRV9TVFJVQ1RfRVRIRVJfQUREUgotc3RydWN0IGV0aGVyX2FkZHIgewotCXVuc2lnbmVkIGNoYXIgZXRoZXJfYWRkcl9vY3RldFs2XTsKLX07Ci0jZW5kaWYKLWV4dGVybiBpbnQgZXRoZXJfbnRvaG9zdChjaGFyICosIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICopOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBVU0VfRVRIRVJfTlRPSE9TVCAqLwotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHBjYXAtbmFtZWRiLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJsbGMuaCIKLSNpbmNsdWRlICJzZXRzaWduYWwuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAib3VpLmgiCi0KLSNpZm5kZWYgRVRIRVJfQUREUl9MRU4KLSNkZWZpbmUgRVRIRVJfQUREUl9MRU4JNgotI2VuZGlmCi0KLS8qCi0gKiBoYXNoIHRhYmxlcyBmb3Igd2hhdGV2ZXItdG8tbmFtZSB0cmFuc2xhdGlvbnMKLSAqCi0gKiBYWFggdGhlcmUgaGFzIHRvIGJlIGVycm9yIGNoZWNrcyBhZ2FpbnN0IHN0cmR1cCgzKSBmYWlsdXJlCi0gKi8KLQotI2RlZmluZSBIQVNITkFNRVNJWkUgNDA5NgotI2RlZmluZSBCVUZTSVpFIDEyOAotCi1zdHJ1Y3QgaG5hbWVtZW0gewotCXVfaW50MzJfdCBhZGRyOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGhuYW1lbWVtICpueHQ7Ci19OwotCi1zdHJ1Y3QgaG5hbWVtZW0gaG5hbWV0YWJsZVtIQVNITkFNRVNJWkVdOwotc3RydWN0IGhuYW1lbWVtIHRwb3J0dGFibGVbSEFTSE5BTUVTSVpFXTsKLXN0cnVjdCBobmFtZW1lbSB1cG9ydHRhYmxlW0hBU0hOQU1FU0laRV07Ci1zdHJ1Y3QgaG5hbWVtZW0gZXByb3RvdGFibGVbSEFTSE5BTUVTSVpFXTsKLXN0cnVjdCBobmFtZW1lbSBkbmFkZHJ0YWJsZVtIQVNITkFNRVNJWkVdOwotc3RydWN0IGhuYW1lbWVtIGlweHNhcHRhYmxlW0hBU0hOQU1FU0laRV07Ci0KLSNpZiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKFdJTjMyKQotLyoKLSAqIGZha2UgZ2V0aG9zdGJ5YWRkciBmb3IgV2luMmsvWFAKLSAqIGdldGhvc3RieWFkZHIoKSByZXR1cm5zIGluY29ycmVjdCB2YWx1ZSB3aGVuIEFGX0lORVQ2IGlzIHBhc3NlZAotICogdG8gM3JkIGFyZ3VtZW50LgotICoKLSAqIGhfbmFtZSBpbiBzdHJ1Y3QgaG9zdGVudCBpcyBvbmx5IHZhbGlkLgotICovCi1zdGF0aWMgc3RydWN0IGhvc3RlbnQgKgotd2luMzJfZ2V0aG9zdGJ5YWRkcihjb25zdCBjaGFyICphZGRyLCBpbnQgbGVuLCBpbnQgdHlwZSkKLXsKLQlzdGF0aWMgc3RydWN0IGhvc3RlbnQgaG9zdDsKLQlzdGF0aWMgY2hhciBob3N0YnVmW05JX01BWEhPU1RdOwotCWNoYXIgaG5hbWVbTklfTUFYSE9TVF07Ci0Jc3RydWN0IHNvY2thZGRyX2luNiBhZGRyNjsKLQotCWhvc3QuaF9uYW1lID0gaG9zdGJ1ZjsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXJldHVybiBnZXRob3N0YnlhZGRyKGFkZHIsIGxlbiwgdHlwZSk7Ci0JCWJyZWFrOwotCWNhc2UgQUZfSU5FVDY6Ci0JCW1lbXNldCgmYWRkcjYsIDAsIHNpemVvZihhZGRyNikpOwotCQlhZGRyNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQltZW1jcHkoJmFkZHI2LnNpbjZfYWRkciwgYWRkciwgbGVuKTsKLQkJaWYgKGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcjYsIHNpemVvZihhZGRyNiksCi0JCSAgICBobmFtZSwgc2l6ZW9mKGhuYW1lKSwgTlVMTCwgMCwgMCkpIHsKLQkJCXJldHVybiBOVUxMOwotCQl9IGVsc2UgewotCQkJc3RyY3B5KGhvc3QuaF9uYW1lLCBobmFtZSk7Ci0JCQlyZXR1cm4gJmhvc3Q7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotI2RlZmluZSBnZXRob3N0YnlhZGRyIHdpbjMyX2dldGhvc3RieWFkZHIKLSNlbmRpZiAvKiBJTkVUNiAmIFdJTjMyICovCi0KLSNpZmRlZiBJTkVUNgotc3RydWN0IGg2bmFtZW1lbSB7Ci0Jc3RydWN0IGluNl9hZGRyIGFkZHI7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgaDZuYW1lbWVtICpueHQ7Ci19OwotCi1zdHJ1Y3QgaDZuYW1lbWVtIGg2bmFtZXRhYmxlW0hBU0hOQU1FU0laRV07Ci0jZW5kaWYgLyogSU5FVDYgKi8KLQotc3RydWN0IGVuYW1lbWVtIHsKLQl1X3Nob3J0IGVfYWRkcjA7Ci0JdV9zaG9ydCBlX2FkZHIxOwotCXVfc2hvcnQgZV9hZGRyMjsKLQljb25zdCBjaGFyICplX25hbWU7Ci0JdV9jaGFyICplX25zYXA7CQkJLyogdXNlZCBvbmx5IGZvciBuc2FwdGFibGVbXSAqLwotI2RlZmluZSBlX2JzIGVfbnNhcAkJCS8qIGZvciBieXRlc3RyaW5ndGFibGUgKi8KLQlzdHJ1Y3QgZW5hbWVtZW0gKmVfbnh0OwotfTsKLQotc3RydWN0IGVuYW1lbWVtIGVuYW1ldGFibGVbSEFTSE5BTUVTSVpFXTsKLXN0cnVjdCBlbmFtZW1lbSBuc2FwdGFibGVbSEFTSE5BTUVTSVpFXTsKLXN0cnVjdCBlbmFtZW1lbSBieXRlc3RyaW5ndGFibGVbSEFTSE5BTUVTSVpFXTsKLQotc3RydWN0IHByb3RvaWRtZW0gewotCXVfaW50MzJfdCBwX291aTsKLQl1X3Nob3J0IHBfcHJvdG87Ci0JY29uc3QgY2hhciAqcF9uYW1lOwotCXN0cnVjdCBwcm90b2lkbWVtICpwX254dDsKLX07Ci0KLXN0cnVjdCBwcm90b2lkbWVtIHByb3RvaWR0YWJsZVtIQVNITkFNRVNJWkVdOwotCi0vKgotICogQSBmYXN0ZXIgcmVwbGFjZW1lbnQgZm9yIGluZXRfbnRvYSgpLgotICovCi1jb25zdCBjaGFyICoKLWludG9hKHVfaW50MzJfdCBhZGRyKQotewotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCXJlZ2lzdGVyIHVfaW50IGJ5dGU7Ci0JcmVnaXN0ZXIgaW50IG47Ci0Jc3RhdGljIGNoYXIgYnVmW3NpemVvZigiLnh4eC54eHgueHh4Lnh4eCIpXTsKLQotCU5UT0hMKGFkZHIpOwotCWNwID0gYnVmICsgc2l6ZW9mKGJ1Zik7Ci0JKi0tY3AgPSAnXDAnOwotCi0JbiA9IDQ7Ci0JZG8gewotCQlieXRlID0gYWRkciAmIDB4ZmY7Ci0JCSotLWNwID0gYnl0ZSAlIDEwICsgJzAnOwotCQlieXRlIC89IDEwOwotCQlpZiAoYnl0ZSA+IDApIHsKLQkJCSotLWNwID0gYnl0ZSAlIDEwICsgJzAnOwotCQkJYnl0ZSAvPSAxMDsKLQkJCWlmIChieXRlID4gMCkKLQkJCQkqLS1jcCA9IGJ5dGUgKyAnMCc7Ci0JCX0KLQkJKi0tY3AgPSAnLic7Ci0JCWFkZHIgPj49IDg7Ci0JfSB3aGlsZSAoLS1uID4gMCk7Ci0KLQlyZXR1cm4gY3AgKyAxOwotfQotCi1zdGF0aWMgdV9pbnQzMl90IGZfbmV0bWFzazsKLXN0YXRpYyB1X2ludDMyX3QgZl9sb2NhbG5ldDsKLQotLyoKLSAqIFJldHVybiBhIG5hbWUgZm9yIHRoZSBJUCBhZGRyZXNzIHBvaW50ZWQgdG8gYnkgYXAuICBUaGlzIGFkZHJlc3MKLSAqIGlzIGFzc3VtZWQgdG8gYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgotICoKLSAqIE5PVEU6IGFwIGlzICpOT1QqIG5lY2Vzc2FyaWx5IHBhcnQgb2YgdGhlIHBhY2tldCBkYXRhIChub3QgZXZlbiBpZgotICogdGhpcyBpcyBiZWluZyBjYWxsZWQgd2l0aCB0aGUgImlwYWRkcl9zdHJpbmcoKSIgbWFjcm8pLCBzbyB5b3UKLSAqICpDQU5OT1QqIHVzZSB0aGUgVENIRUNLezJ9L1RURVNUezJ9IG1hY3JvcyBvbiBpdC4gIEZ1cnRoZXJtb3JlLAotICogZXZlbiBpbiBjYXNlcyB3aGVyZSBpdCAqaXMqIHBhcnQgb2YgdGhlIHBhY2tldCBkYXRhLCB0aGUgY2FsbGVyCi0gKiB3b3VsZCBzdGlsbCBoYXZlIHRvIGNoZWNrIGZvciBhIG51bGwgcmV0dXJuIHZhbHVlLCBldmVuIGlmIGl0J3MKLSAqIGp1c3QgcHJpbnRpbmcgdGhlIHJldHVybiB2YWx1ZSB3aXRoICIlcyIgLSBub3QgYWxsIHZlcnNpb25zIG9mCi0gKiBwcmludGYgcHJpbnQgIihudWxsKSIgd2l0aCAiJXMiIGFuZCBhIG51bGwgcG9pbnRlciwgc29tZSBvZiB0aGVtCi0gKiBkb24ndCBjaGVjayBmb3IgYSBudWxsIHBvaW50ZXIgYW5kIGNyYXNoIGluIHRoYXQgY2FzZS4KLSAqCi0gKiBUaGUgY2FsbGVycyBvZiB0aGlzIHJvdXRpbmUgc2hvdWxkLCBiZWZvcmUgaGFuZGluZyB0aGlzIHJvdXRpbmUKLSAqIGEgcG9pbnRlciB0byBwYWNrZXQgZGF0YSwgYmUgc3VyZSB0aGF0IHRoZSBkYXRhIGlzIHByZXNlbnQgaW4KLSAqIHRoZSBwYWNrZXQgYnVmZmVyLiAgVGhleSBzaG91bGQgcHJvYmFibHkgZG8gdGhvc2UgY2hlY2tzIGFueXdheSwKLSAqIGFzIG90aGVyIGRhdGEgYXQgdGhhdCBsYXllciBtaWdodCBub3QgYmUgSVAgYWRkcmVzc2VzLCBhbmQgaXQKLSAqIGFsc28gbmVlZHMgdG8gY2hlY2sgd2hldGhlciB0aGV5J3JlIHByZXNlbnQgaW4gdGhlIHBhY2tldCBidWZmZXIuCi0gKi8KLWNvbnN0IGNoYXIgKgotZ2V0bmFtZShjb25zdCB1X2NoYXIgKmFwKQotewotCXJlZ2lzdGVyIHN0cnVjdCBob3N0ZW50ICpocDsKLQl1X2ludDMyX3QgYWRkcjsKLQlzdGF0aWMgc3RydWN0IGhuYW1lbWVtICpwOwkJLyogc3RhdGljIGZvciBsb25nam1wKCkgKi8KLQotCW1lbWNweSgmYWRkciwgYXAsIHNpemVvZihhZGRyKSk7Ci0JcCA9ICZobmFtZXRhYmxlW2FkZHIgJiAoSEFTSE5BTUVTSVpFLTEpXTsKLQlmb3IgKDsgcC0+bnh0OyBwID0gcC0+bnh0KSB7Ci0JCWlmIChwLT5hZGRyID09IGFkZHIpCi0JCQlyZXR1cm4gKHAtPm5hbWUpOwotCX0KLQlwLT5hZGRyID0gYWRkcjsKLQlwLT5ueHQgPSBuZXdobmFtZW1lbSgpOwotCi0JLyoKLQkgKiBQcmludCBuYW1lcyB1bmxlc3M6Ci0JICoJKDEpIC1uIHdhcyBnaXZlbi4KLQkgKiAgICAgICgyKSBBZGRyZXNzIGlzIGZvcmVpZ24gYW5kIC1mIHdhcyBnaXZlbi4gKElmIC1mIHdhcyBub3QKLQkgKgkgICAgZ2l2ZW4sIGZfbmV0bWFzayBhbmQgZl9sb2NhbG5ldCBhcmUgMCBhbmQgdGhlIHRlc3QKLQkgKgkgICAgZXZhbHVhdGVzIHRvIHRydWUpCi0JICovCi0JaWYgKCFuZmxhZyAmJgotCSAgICAoYWRkciAmIGZfbmV0bWFzaykgPT0gZl9sb2NhbG5ldCkgewotCQlocCA9IGdldGhvc3RieWFkZHIoKGNoYXIgKikmYWRkciwgNCwgQUZfSU5FVCk7Ci0JCWlmIChocCkgewotCQkJY2hhciAqZG90cDsKLQotCQkJcC0+bmFtZSA9IHN0cmR1cChocC0+aF9uYW1lKTsKLQkJCWlmIChOZmxhZykgewotCQkJCS8qIFJlbW92ZSBkb21haW4gcXVhbGlmaWNhdGlvbnMgKi8KLQkJCQlkb3RwID0gc3RyY2hyKHAtPm5hbWUsICcuJyk7Ci0JCQkJaWYgKGRvdHApCi0JCQkJCSpkb3RwID0gJ1wwJzsKLQkJCX0KLQkJCXJldHVybiAocC0+bmFtZSk7Ci0JCX0KLQl9Ci0JcC0+bmFtZSA9IHN0cmR1cChpbnRvYShhZGRyKSk7Ci0JcmV0dXJuIChwLT5uYW1lKTsKLX0KLQotI2lmZGVmIElORVQ2Ci0vKgotICogUmV0dXJuIGEgbmFtZSBmb3IgdGhlIElQNiBhZGRyZXNzIHBvaW50ZWQgdG8gYnkgYXAuICBUaGlzIGFkZHJlc3MKLSAqIGlzIGFzc3VtZWQgdG8gYmUgaW4gbmV0d29yayBieXRlIG9yZGVyLgotICovCi1jb25zdCBjaGFyICoKLWdldG5hbWU2KGNvbnN0IHVfY2hhciAqYXApCi17Ci0JcmVnaXN0ZXIgc3RydWN0IGhvc3RlbnQgKmhwOwotCXN0cnVjdCBpbjZfYWRkciBhZGRyOwotCXN0YXRpYyBzdHJ1Y3QgaDZuYW1lbWVtICpwOwkJLyogc3RhdGljIGZvciBsb25nam1wKCkgKi8KLQlyZWdpc3RlciBjb25zdCBjaGFyICpjcDsKLQljaGFyIG50b3BfYnVmW0lORVQ2X0FERFJTVFJMRU5dOwotCi0JbWVtY3B5KCZhZGRyLCBhcCwgc2l6ZW9mKGFkZHIpKTsKLQlwID0gJmg2bmFtZXRhYmxlWyoodV9pbnQxNl90ICopJmFkZHIuczZfYWRkclsxNF0gJiAoSEFTSE5BTUVTSVpFLTEpXTsKLQlmb3IgKDsgcC0+bnh0OyBwID0gcC0+bnh0KSB7Ci0JCWlmIChtZW1jbXAoJnAtPmFkZHIsICZhZGRyLCBzaXplb2YoYWRkcikpID09IDApCi0JCQlyZXR1cm4gKHAtPm5hbWUpOwotCX0KLQlwLT5hZGRyID0gYWRkcjsKLQlwLT5ueHQgPSBuZXdoNm5hbWVtZW0oKTsKLQotCS8qCi0JICogRG8gbm90IHByaW50IG5hbWVzIGlmIC1uIHdhcyBnaXZlbi4KLQkgKi8KLQlpZiAoIW5mbGFnKSB7Ci0JCWhwID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSZhZGRyLCBzaXplb2YoYWRkciksIEFGX0lORVQ2KTsKLQkJaWYgKGhwKSB7Ci0JCQljaGFyICpkb3RwOwotCi0JCQlwLT5uYW1lID0gc3RyZHVwKGhwLT5oX25hbWUpOwotCQkJaWYgKE5mbGFnKSB7Ci0JCQkJLyogUmVtb3ZlIGRvbWFpbiBxdWFsaWZpY2F0aW9ucyAqLwotCQkJCWRvdHAgPSBzdHJjaHIocC0+bmFtZSwgJy4nKTsKLQkJCQlpZiAoZG90cCkKLQkJCQkJKmRvdHAgPSAnXDAnOwotCQkJfQotCQkJcmV0dXJuIChwLT5uYW1lKTsKLQkJfQotCX0KLQljcCA9IGluZXRfbnRvcChBRl9JTkVUNiwgJmFkZHIsIG50b3BfYnVmLCBzaXplb2YobnRvcF9idWYpKTsKLQlwLT5uYW1lID0gc3RyZHVwKGNwKTsKLQlyZXR1cm4gKHAtPm5hbWUpOwotfQotI2VuZGlmIC8qIElORVQ2ICovCi0KLXN0YXRpYyBjaGFyIGhleFtdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi0KLS8qIEZpbmQgdGhlIGhhc2ggbm9kZSB0aGF0IGNvcnJlc3BvbmRzIHRoZSBldGhlciBhZGRyZXNzICdlcCcgKi8KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZW5hbWVtZW0gKgotbG9va3VwX2VtZW0oY29uc3QgdV9jaGFyICplcCkKLXsKLQlyZWdpc3RlciB1X2ludCBpLCBqLCBrOwotCXN0cnVjdCBlbmFtZW1lbSAqdHA7Ci0KLQlrID0gKGVwWzBdIDw8IDgpIHwgZXBbMV07Ci0JaiA9IChlcFsyXSA8PCA4KSB8IGVwWzNdOwotCWkgPSAoZXBbNF0gPDwgOCkgfCBlcFs1XTsKLQotCXRwID0gJmVuYW1ldGFibGVbKGkgXiBqKSAmIChIQVNITkFNRVNJWkUtMSldOwotCXdoaWxlICh0cC0+ZV9ueHQpCi0JCWlmICh0cC0+ZV9hZGRyMCA9PSBpICYmCi0JCSAgICB0cC0+ZV9hZGRyMSA9PSBqICYmCi0JCSAgICB0cC0+ZV9hZGRyMiA9PSBrKQotCQkJcmV0dXJuIHRwOwotCQllbHNlCi0JCQl0cCA9IHRwLT5lX254dDsKLQl0cC0+ZV9hZGRyMCA9IGk7Ci0JdHAtPmVfYWRkcjEgPSBqOwotCXRwLT5lX2FkZHIyID0gazsKLQl0cC0+ZV9ueHQgPSAoc3RydWN0IGVuYW1lbWVtICopY2FsbG9jKDEsIHNpemVvZigqdHApKTsKLQlpZiAodHAtPmVfbnh0ID09IE5VTEwpCi0JCWVycm9yKCJsb29rdXBfZW1lbTogY2FsbG9jIik7Ci0KLQlyZXR1cm4gdHA7Ci19Ci0KLS8qCi0gKiBGaW5kIHRoZSBoYXNoIG5vZGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYnl0ZXN0cmluZyAnYnMnCi0gKiB3aXRoIGxlbmd0aCAnbmxlbicKLSAqLwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBlbmFtZW1lbSAqCi1sb29rdXBfYnl0ZXN0cmluZyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJzLCBjb25zdCB1bnNpZ25lZCBpbnQgbmxlbikKLXsKLQlzdHJ1Y3QgZW5hbWVtZW0gKnRwOwotCXJlZ2lzdGVyIHVfaW50IGksIGosIGs7Ci0KLQlpZiAobmxlbiA+PSA2KSB7Ci0JCWsgPSAoYnNbMF0gPDwgOCkgfCBic1sxXTsKLQkJaiA9IChic1syXSA8PCA4KSB8IGJzWzNdOwotCQlpID0gKGJzWzRdIDw8IDgpIHwgYnNbNV07Ci0JfSBlbHNlIGlmIChubGVuID49IDQpIHsKLQkJayA9IChic1swXSA8PCA4KSB8IGJzWzFdOwotCQlqID0gKGJzWzJdIDw8IDgpIHwgYnNbM107Ci0JCWkgPSAwOwotCX0gZWxzZQotCQlpID0gaiA9IGsgPSAwOwotCi0JdHAgPSAmYnl0ZXN0cmluZ3RhYmxlWyhpIF4gaikgJiAoSEFTSE5BTUVTSVpFLTEpXTsKLQl3aGlsZSAodHAtPmVfbnh0KQotCQlpZiAodHAtPmVfYWRkcjAgPT0gaSAmJgotCQkgICAgdHAtPmVfYWRkcjEgPT0gaiAmJgotCQkgICAgdHAtPmVfYWRkcjIgPT0gayAmJgotCQkgICAgbWVtY21wKChjb25zdCBjaGFyICopYnMsIChjb25zdCBjaGFyICopKHRwLT5lX2JzKSwgbmxlbikgPT0gMCkKLQkJCXJldHVybiB0cDsKLQkJZWxzZQotCQkJdHAgPSB0cC0+ZV9ueHQ7Ci0KLQl0cC0+ZV9hZGRyMCA9IGk7Ci0JdHAtPmVfYWRkcjEgPSBqOwotCXRwLT5lX2FkZHIyID0gazsKLQotCXRwLT5lX2JzID0gKHVfY2hhciAqKSBjYWxsb2MoMSwgbmxlbiArIDEpOwotCW1lbWNweSh0cC0+ZV9icywgYnMsIG5sZW4pOwotCXRwLT5lX254dCA9IChzdHJ1Y3QgZW5hbWVtZW0gKiljYWxsb2MoMSwgc2l6ZW9mKCp0cCkpOwotCWlmICh0cC0+ZV9ueHQgPT0gTlVMTCkKLQkJZXJyb3IoImxvb2t1cF9ieXRlc3RyaW5nOiBjYWxsb2MiKTsKLQotCXJldHVybiB0cDsKLX0KLQotLyogRmluZCB0aGUgaGFzaCBub2RlIHRoYXQgY29ycmVzcG9uZHMgdGhlIE5TQVAgJ25zYXAnICovCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGVuYW1lbWVtICoKLWxvb2t1cF9uc2FwKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqbnNhcCkKLXsKLQlyZWdpc3RlciB1X2ludCBpLCBqLCBrOwotCXVuc2lnbmVkIGludCBubGVuID0gKm5zYXA7Ci0Jc3RydWN0IGVuYW1lbWVtICp0cDsKLQljb25zdCB1X2NoYXIgKmVuc2FwID0gbnNhcCArIG5sZW4gLSA2OwotCi0JaWYgKG5sZW4gPiA2KSB7Ci0JCWsgPSAoZW5zYXBbMF0gPDwgOCkgfCBlbnNhcFsxXTsKLQkJaiA9IChlbnNhcFsyXSA8PCA4KSB8IGVuc2FwWzNdOwotCQlpID0gKGVuc2FwWzRdIDw8IDgpIHwgZW5zYXBbNV07Ci0JfQotCWVsc2UKLQkJaSA9IGogPSBrID0gMDsKLQotCXRwID0gJm5zYXB0YWJsZVsoaSBeIGopICYgKEhBU0hOQU1FU0laRS0xKV07Ci0Jd2hpbGUgKHRwLT5lX254dCkKLQkJaWYgKHRwLT5lX2FkZHIwID09IGkgJiYKLQkJICAgIHRwLT5lX2FkZHIxID09IGogJiYKLQkJICAgIHRwLT5lX2FkZHIyID09IGsgJiYKLQkJICAgIHRwLT5lX25zYXBbMF0gPT0gbmxlbiAmJgotCQkgICAgbWVtY21wKChjb25zdCBjaGFyICopJihuc2FwWzFdKSwKLQkJCShjaGFyICopJih0cC0+ZV9uc2FwWzFdKSwgbmxlbikgPT0gMCkKLQkJCXJldHVybiB0cDsKLQkJZWxzZQotCQkJdHAgPSB0cC0+ZV9ueHQ7Ci0JdHAtPmVfYWRkcjAgPSBpOwotCXRwLT5lX2FkZHIxID0gajsKLQl0cC0+ZV9hZGRyMiA9IGs7Ci0JdHAtPmVfbnNhcCA9ICh1X2NoYXIgKiltYWxsb2MobmxlbiArIDEpOwotCWlmICh0cC0+ZV9uc2FwID09IE5VTEwpCi0JCWVycm9yKCJsb29rdXBfbnNhcDogbWFsbG9jIik7Ci0JbWVtY3B5KChjaGFyICopdHAtPmVfbnNhcCwgKGNvbnN0IGNoYXIgKiluc2FwLCBubGVuICsgMSk7Ci0JdHAtPmVfbnh0ID0gKHN0cnVjdCBlbmFtZW1lbSAqKWNhbGxvYygxLCBzaXplb2YoKnRwKSk7Ci0JaWYgKHRwLT5lX254dCA9PSBOVUxMKQotCQllcnJvcigibG9va3VwX25zYXA6IGNhbGxvYyIpOwotCi0JcmV0dXJuIHRwOwotfQotCi0vKiBGaW5kIHRoZSBoYXNoIG5vZGUgdGhhdCBjb3JyZXNwb25kcyB0aGUgcHJvdG9pZCAncGknLiAqLwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwcm90b2lkbWVtICoKLWxvb2t1cF9wcm90b2lkKGNvbnN0IHVfY2hhciAqcGkpCi17Ci0JcmVnaXN0ZXIgdV9pbnQgaSwgajsKLQlzdHJ1Y3QgcHJvdG9pZG1lbSAqdHA7Ci0KLQkvKiA1IG9jdGV0cyB3b24ndCBiZSBhbGlnbmVkICovCi0JaSA9ICgoKHBpWzBdIDw8IDgpICsgcGlbMV0pIDw8IDgpICsgcGlbMl07Ci0JaiA9ICAgKHBpWzNdIDw8IDgpICsgcGlbNF07Ci0JLyogWFhYIHNob3VsZCBiZSBlbmRpYW4taW5zZW5zaXRpdmUsIGJ1dCBkbyBiaWctZW5kaWFuIHRlc3RpbmcgIFhYWCAqLwotCi0JdHAgPSAmcHJvdG9pZHRhYmxlWyhpIF4gaikgJiAoSEFTSE5BTUVTSVpFLTEpXTsKLQl3aGlsZSAodHAtPnBfbnh0KQotCQlpZiAodHAtPnBfb3VpID09IGkgJiYgdHAtPnBfcHJvdG8gPT0gaikKLQkJCXJldHVybiB0cDsKLQkJZWxzZQotCQkJdHAgPSB0cC0+cF9ueHQ7Ci0JdHAtPnBfb3VpID0gaTsKLQl0cC0+cF9wcm90byA9IGo7Ci0JdHAtPnBfbnh0ID0gKHN0cnVjdCBwcm90b2lkbWVtICopY2FsbG9jKDEsIHNpemVvZigqdHApKTsKLQlpZiAodHAtPnBfbnh0ID09IE5VTEwpCi0JCWVycm9yKCJsb29rdXBfcHJvdG9pZDogY2FsbG9jIik7Ci0KLQlyZXR1cm4gdHA7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZXRoZXJhZGRyX3N0cmluZyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQotewotCXJlZ2lzdGVyIGludCBpOwotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCXJlZ2lzdGVyIHN0cnVjdCBlbmFtZW1lbSAqdHA7Ci0JaW50IG91aTsKLQljaGFyIGJ1ZltCVUZTSVpFXTsKLQotCXRwID0gbG9va3VwX2VtZW0oZXApOwotCWlmICh0cC0+ZV9uYW1lKQotCQlyZXR1cm4gKHRwLT5lX25hbWUpOwotI2lmZGVmIFVTRV9FVEhFUl9OVE9IT1NUCi0JaWYgKCFuZmxhZykgewotCQljaGFyIGJ1ZjJbQlVGU0laRV07Ci0KLQkJLyoKLQkJICogV2UgZG9uJ3QgY2FzdCBpdCB0byAiY29uc3Qgc3RydWN0IGV0aGVyX2FkZHIgKiIKLQkJICogYmVjYXVzZSBzb21lIHN5c3RlbXMgZmFpbCB0byBkZWNsYXJlIHRoZSBzZWNvbmQKLQkJICogYXJndW1lbnQgYXMgYSAiY29uc3QiIHBvaW50ZXIsIGV2ZW4gdGhvdWdoIHRoZXkKLQkJICogZG9uJ3QgbW9kaWZ5IHdoYXQgaXQgcG9pbnRzIHRvLgotCQkgKi8KLQkJaWYgKGV0aGVyX250b2hvc3QoYnVmMiwgKHN0cnVjdCBldGhlcl9hZGRyICopZXApID09IDApIHsKLQkJCXRwLT5lX25hbWUgPSBzdHJkdXAoYnVmMik7Ci0JCQlyZXR1cm4gKHRwLT5lX25hbWUpOwotCQl9Ci0JfQotI2VuZGlmCi0JY3AgPSBidWY7Ci0Jb3VpID0gRVhUUkFDVF8yNEJJVFMoZXApOwotCSpjcCsrID0gaGV4WyplcCA+PiA0IF07Ci0JKmNwKysgPSBoZXhbKmVwKysgJiAweGZdOwotCWZvciAoaSA9IDU7IC0taSA+PSAwOykgewotCQkqY3ArKyA9ICc6JzsKLQkJKmNwKysgPSBoZXhbKmVwID4+IDQgXTsKLQkJKmNwKysgPSBoZXhbKmVwKysgJiAweGZdOwotCX0KLQotCWlmICghbmZsYWcpIHsKLQkJc25wcmludGYoY3AsIEJVRlNJWkUgLSAoMiArIDUqMyksICIgKG91aSAlcykiLAotCQkgICAgdG9rMnN0cihvdWlfdmFsdWVzLCAiVW5rbm93biIsIG91aSkpOwotCX0gZWxzZQotCQkqY3AgPSAnXDAnOwotCXRwLT5lX25hbWUgPSBzdHJkdXAoYnVmKTsKLQlyZXR1cm4gKHRwLT5lX25hbWUpOwotfQotCi1jb25zdCBjaGFyICoKLWxpbmthZGRyX3N0cmluZyhjb25zdCB1X2NoYXIgKmVwLCBjb25zdCB1bnNpZ25lZCBpbnQgbGVuKQotewotCXJlZ2lzdGVyIHVfaW50IGk7Ci0JcmVnaXN0ZXIgY2hhciAqY3A7Ci0JcmVnaXN0ZXIgc3RydWN0IGVuYW1lbWVtICp0cDsKLQotCWlmIChsZW4gPT0gRVRIRVJfQUREUl9MRU4pCS8qIFhYWCBub3QgdG90YWxseSBjb3JyZWN0Li4uICovCi0JCXJldHVybiBldGhlcmFkZHJfc3RyaW5nKGVwKTsKLQotCXRwID0gbG9va3VwX2J5dGVzdHJpbmcoZXAsIGxlbik7Ci0JaWYgKHRwLT5lX25hbWUpCi0JCXJldHVybiAodHAtPmVfbmFtZSk7Ci0KLQl0cC0+ZV9uYW1lID0gY3AgPSAoY2hhciAqKW1hbGxvYyhsZW4qMyk7Ci0JaWYgKHRwLT5lX25hbWUgPT0gTlVMTCkKLQkJZXJyb3IoImxpbmthZGRyX3N0cmluZzogbWFsbG9jIik7Ci0JKmNwKysgPSBoZXhbKmVwID4+IDRdOwotCSpjcCsrID0gaGV4WyplcCsrICYgMHhmXTsKLQlmb3IgKGkgPSBsZW4tMTsgaSA+IDAgOyAtLWkpIHsKLQkJKmNwKysgPSAnOic7Ci0JCSpjcCsrID0gaGV4WyplcCA+PiA0XTsKLQkJKmNwKysgPSBoZXhbKmVwKysgJiAweGZdOwotCX0KLQkqY3AgPSAnXDAnOwotCXJldHVybiAodHAtPmVfbmFtZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZXRoZXJwcm90b19zdHJpbmcodV9zaG9ydCBwb3J0KQotewotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqdHA7Ci0JcmVnaXN0ZXIgdV9pbnQzMl90IGkgPSBwb3J0OwotCWNoYXIgYnVmW3NpemVvZigiMDAwMCIpXTsKLQotCWZvciAodHAgPSAmZXByb3RvdGFibGVbaSAmIChIQVNITkFNRVNJWkUtMSldOyB0cC0+bnh0OyB0cCA9IHRwLT5ueHQpCi0JCWlmICh0cC0+YWRkciA9PSBpKQotCQkJcmV0dXJuICh0cC0+bmFtZSk7Ci0KLQl0cC0+YWRkciA9IGk7Ci0JdHAtPm54dCA9IG5ld2huYW1lbWVtKCk7Ci0KLQljcCA9IGJ1ZjsKLQlOVE9IUyhwb3J0KTsKLQkqY3ArKyA9IGhleFtwb3J0ID4+IDEyICYgMHhmXTsKLQkqY3ArKyA9IGhleFtwb3J0ID4+IDggJiAweGZdOwotCSpjcCsrID0gaGV4W3BvcnQgPj4gNCAmIDB4Zl07Ci0JKmNwKysgPSBoZXhbcG9ydCAmIDB4Zl07Ci0JKmNwKysgPSAnXDAnOwotCXRwLT5uYW1lID0gc3RyZHVwKGJ1Zik7Ci0JcmV0dXJuICh0cC0+bmFtZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotcHJvdG9pZF9zdHJpbmcocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwaSkKLXsKLQlyZWdpc3RlciB1X2ludCBpLCBqOwotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCXJlZ2lzdGVyIHN0cnVjdCBwcm90b2lkbWVtICp0cDsKLQljaGFyIGJ1ZltzaXplb2YoIjAwOjAwOjAwOjAwOjAwIildOwotCi0JdHAgPSBsb29rdXBfcHJvdG9pZChwaSk7Ci0JaWYgKHRwLT5wX25hbWUpCi0JCXJldHVybiB0cC0+cF9uYW1lOwotCi0JY3AgPSBidWY7Ci0JaWYgKChqID0gKnBpID4+IDQpICE9IDApCi0JCSpjcCsrID0gaGV4W2pdOwotCSpjcCsrID0gaGV4WypwaSsrICYgMHhmXTsKLQlmb3IgKGkgPSA0OyAoaW50KS0taSA+PSAwOykgewotCQkqY3ArKyA9ICc6JzsKLQkJaWYgKChqID0gKnBpID4+IDQpICE9IDApCi0JCQkqY3ArKyA9IGhleFtqXTsKLQkJKmNwKysgPSBoZXhbKnBpKysgJiAweGZdOwotCX0KLQkqY3AgPSAnXDAnOwotCXRwLT5wX25hbWUgPSBzdHJkdXAoYnVmKTsKLQlyZXR1cm4gKHRwLT5wX25hbWUpOwotfQotCi0jZGVmaW5lIElTT05TQVBfTUFYX0xFTkdUSCAyMAotY29uc3QgY2hhciAqCi1pc29uc2FwX3N0cmluZyhjb25zdCB1X2NoYXIgKm5zYXAsIHJlZ2lzdGVyIHVfaW50IG5zYXBfbGVuZ3RoKQotewotCXJlZ2lzdGVyIHVfaW50IG5zYXBfaWR4OwotCXJlZ2lzdGVyIGNoYXIgKmNwOwotCXJlZ2lzdGVyIHN0cnVjdCBlbmFtZW1lbSAqdHA7Ci0KLQlpZiAobnNhcF9sZW5ndGggPCAxIHx8IG5zYXBfbGVuZ3RoID4gSVNPTlNBUF9NQVhfTEVOR1RIKQotCQlyZXR1cm4gKCJpc29uc2FwX3N0cmluZzogaWxsZWdhbCBsZW5ndGgiKTsKLQotCXRwID0gbG9va3VwX25zYXAobnNhcCk7Ci0JaWYgKHRwLT5lX25hbWUpCi0JCXJldHVybiB0cC0+ZV9uYW1lOwotCi0JdHAtPmVfbmFtZSA9IGNwID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKCJ4eC54eHh4Lnh4eHgueHh4eC54eHh4Lnh4eHgueHh4eC54eHh4Lnh4eHgueHh4eC54eCIpKTsKLQlpZiAoY3AgPT0gTlVMTCkKLQkJZXJyb3IoImlzb25zYXBfc3RyaW5nOiBtYWxsb2MiKTsKLQotCWZvciAobnNhcF9pZHggPSAwOyBuc2FwX2lkeCA8IG5zYXBfbGVuZ3RoOyBuc2FwX2lkeCsrKSB7Ci0JCSpjcCsrID0gaGV4Wypuc2FwID4+IDRdOwotCQkqY3ArKyA9IGhleFsqbnNhcCsrICYgMHhmXTsKLQkJaWYgKCgobnNhcF9pZHggJiAxKSA9PSAwKSAmJgotCQkgICAgIChuc2FwX2lkeCArIDEgPCBuc2FwX2xlbmd0aCkpIHsKLQkJICAgICAJKmNwKysgPSAnLic7Ci0JCX0KLQl9Ci0JKmNwID0gJ1wwJzsKLQlyZXR1cm4gKHRwLT5lX25hbWUpOwotfQotCi1jb25zdCBjaGFyICoKLXRjcHBvcnRfc3RyaW5nKHVfc2hvcnQgcG9ydCkKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRwOwotCXJlZ2lzdGVyIHVfaW50MzJfdCBpID0gcG9ydDsKLQljaGFyIGJ1ZltzaXplb2YoIjAwMDAwIildOwotCi0JZm9yICh0cCA9ICZ0cG9ydHRhYmxlW2kgJiAoSEFTSE5BTUVTSVpFLTEpXTsgdHAtPm54dDsgdHAgPSB0cC0+bnh0KQotCQlpZiAodHAtPmFkZHIgPT0gaSkKLQkJCXJldHVybiAodHAtPm5hbWUpOwotCi0JdHAtPmFkZHIgPSBpOwotCXRwLT5ueHQgPSBuZXdobmFtZW1lbSgpOwotCi0JKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1IiwgaSk7Ci0JdHAtPm5hbWUgPSBzdHJkdXAoYnVmKTsKLQlyZXR1cm4gKHRwLT5uYW1lKTsKLX0KLQotY29uc3QgY2hhciAqCi11ZHBwb3J0X3N0cmluZyhyZWdpc3RlciB1X3Nob3J0IHBvcnQpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IGhuYW1lbWVtICp0cDsKLQlyZWdpc3RlciB1X2ludDMyX3QgaSA9IHBvcnQ7Ci0JY2hhciBidWZbc2l6ZW9mKCIwMDAwMCIpXTsKLQotCWZvciAodHAgPSAmdXBvcnR0YWJsZVtpICYgKEhBU0hOQU1FU0laRS0xKV07IHRwLT5ueHQ7IHRwID0gdHAtPm54dCkKLQkJaWYgKHRwLT5hZGRyID09IGkpCi0JCQlyZXR1cm4gKHRwLT5uYW1lKTsKLQotCXRwLT5hZGRyID0gaTsKLQl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKLQotCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldSIsIGkpOwotCXRwLT5uYW1lID0gc3RyZHVwKGJ1Zik7Ci0JcmV0dXJuICh0cC0+bmFtZSk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotaXB4c2FwX3N0cmluZyh1X3Nob3J0IHBvcnQpCi17Ci0JcmVnaXN0ZXIgY2hhciAqY3A7Ci0JcmVnaXN0ZXIgc3RydWN0IGhuYW1lbWVtICp0cDsKLQlyZWdpc3RlciB1X2ludDMyX3QgaSA9IHBvcnQ7Ci0JY2hhciBidWZbc2l6ZW9mKCIwMDAwIildOwotCi0JZm9yICh0cCA9ICZpcHhzYXB0YWJsZVtpICYgKEhBU0hOQU1FU0laRS0xKV07IHRwLT5ueHQ7IHRwID0gdHAtPm54dCkKLQkJaWYgKHRwLT5hZGRyID09IGkpCi0JCQlyZXR1cm4gKHRwLT5uYW1lKTsKLQotCXRwLT5hZGRyID0gaTsKLQl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKLQotCWNwID0gYnVmOwotCU5UT0hTKHBvcnQpOwotCSpjcCsrID0gaGV4W3BvcnQgPj4gMTIgJiAweGZdOwotCSpjcCsrID0gaGV4W3BvcnQgPj4gOCAmIDB4Zl07Ci0JKmNwKysgPSBoZXhbcG9ydCA+PiA0ICYgMHhmXTsKLQkqY3ArKyA9IGhleFtwb3J0ICYgMHhmXTsKLQkqY3ArKyA9ICdcMCc7Ci0JdHAtPm5hbWUgPSBzdHJkdXAoYnVmKTsKLQlyZXR1cm4gKHRwLT5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLWluaXRfc2VydmFycmF5KHZvaWQpCi17Ci0Jc3RydWN0IHNlcnZlbnQgKnN2OwotCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqdGFibGU7Ci0JcmVnaXN0ZXIgaW50IGk7Ci0JY2hhciBidWZbc2l6ZW9mKCIwMDAwMDAwMDAwIildOwotCi0Jd2hpbGUgKChzdiA9IGdldHNlcnZlbnQoKSkgIT0gTlVMTCkgewotCQlpbnQgcG9ydCA9IG50b2hzKHN2LT5zX3BvcnQpOwotCQlpID0gcG9ydCAmIChIQVNITkFNRVNJWkUtMSk7Ci0JCWlmIChzdHJjbXAoc3YtPnNfcHJvdG8sICJ0Y3AiKSA9PSAwKQotCQkJdGFibGUgPSAmdHBvcnR0YWJsZVtpXTsKLQkJZWxzZSBpZiAoc3RyY21wKHN2LT5zX3Byb3RvLCAidWRwIikgPT0gMCkKLQkJCXRhYmxlID0gJnVwb3J0dGFibGVbaV07Ci0JCWVsc2UKLQkJCWNvbnRpbnVlOwotCi0JCXdoaWxlICh0YWJsZS0+bmFtZSkKLQkJCXRhYmxlID0gdGFibGUtPm54dDsKLQkJaWYgKG5mbGFnKSB7Ci0JCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBwb3J0KTsKLQkJCXRhYmxlLT5uYW1lID0gc3RyZHVwKGJ1Zik7Ci0JCX0gZWxzZQotCQkJdGFibGUtPm5hbWUgPSBzdHJkdXAoc3YtPnNfbmFtZSk7Ci0JCXRhYmxlLT5hZGRyID0gcG9ydDsKLQkJdGFibGUtPm54dCA9IG5ld2huYW1lbWVtKCk7Ci0JfQotCWVuZHNlcnZlbnQoKTsKLX0KLQotLyogaW4gbGlicGNhcC5hIChuYW1ldG9hZGRyLmMpICovCi0jaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoVVNFX1NUQVRJQ19MSUJQQ0FQKQotX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jZWxzZQotZXh0ZXJuCi0jZW5kaWYKLWNvbnN0IHN0cnVjdCBlcHJvdG8gewotCWNvbnN0IGNoYXIgKnM7Ci0JdV9zaG9ydCBwOwotfSBlcHJvdG9fZGJbXTsKLQotc3RhdGljIHZvaWQKLWluaXRfZXByb3RvYXJyYXkodm9pZCkKLXsKLQlyZWdpc3RlciBpbnQgaTsKLQlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRhYmxlOwotCi0JZm9yIChpID0gMDsgZXByb3RvX2RiW2ldLnM7IGkrKykgewotCQlpbnQgaiA9IGh0b25zKGVwcm90b19kYltpXS5wKSAmIChIQVNITkFNRVNJWkUtMSk7Ci0JCXRhYmxlID0gJmVwcm90b3RhYmxlW2pdOwotCQl3aGlsZSAodGFibGUtPm5hbWUpCi0JCQl0YWJsZSA9IHRhYmxlLT5ueHQ7Ci0JCXRhYmxlLT5uYW1lID0gZXByb3RvX2RiW2ldLnM7Ci0JCXRhYmxlLT5hZGRyID0gaHRvbnMoZXByb3RvX2RiW2ldLnApOwotCQl0YWJsZS0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvdG9pZGxpc3QgewotCWNvbnN0IHVfY2hhciBwcm90b2lkWzVdOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci19IHByb3RvaWRsaXN0W10gPSB7Ci0Je3sgMHgwMCwgMHgwMCwgMHgwYywgMHgwMSwgMHgwNyB9LCAiQ2lzY29NTFMiIH0sCi0Je3sgMHgwMCwgMHgwMCwgMHgwYywgMHgyMCwgMHgwMCB9LCAiQ2lzY29DRFAiIH0sCi0Je3sgMHgwMCwgMHgwMCwgMHgwYywgMHgyMCwgMHgwMSB9LCAiQ2lzY29DR01QIiB9LAotCXt7IDB4MDAsIDB4MDAsIDB4MGMsIDB4MjAsIDB4MDMgfSwgIkNpc2NvVlRQIiB9LAotCXt7IDB4MDAsIDB4ZTAsIDB4MmIsIDB4MDAsIDB4YmIgfSwgIkV4dHJlbWVFRFAiIH0sCi0Je3sgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LCBOVUxMIH0KLX07Ci0KLS8qCi0gKiBTTkFQIHByb3RvIElEcyB3aXRoIG9yZyBjb2RlIDA6MDowIGFyZSBhY3R1YWxseSBlbmNhcHN1bGF0ZWQgRXRoZXJuZXQKLSAqIHR5cGVzLgotICovCi1zdGF0aWMgdm9pZAotaW5pdF9wcm90b2lkYXJyYXkodm9pZCkKLXsKLQlyZWdpc3RlciBpbnQgaTsKLQlyZWdpc3RlciBzdHJ1Y3QgcHJvdG9pZG1lbSAqdHA7Ci0Jc3RydWN0IHByb3RvaWRsaXN0ICpwbDsKLQl1X2NoYXIgcHJvdG9pZFs1XTsKLQotCXByb3RvaWRbMF0gPSAwOwotCXByb3RvaWRbMV0gPSAwOwotCXByb3RvaWRbMl0gPSAwOwotCWZvciAoaSA9IDA7IGVwcm90b19kYltpXS5zOyBpKyspIHsKLQkJdV9zaG9ydCBldHlwZSA9IGh0b25zKGVwcm90b19kYltpXS5wKTsKLQotCQltZW1jcHkoKGNoYXIgKikmcHJvdG9pZFszXSwgKGNoYXIgKikmZXR5cGUsIDIpOwotCQl0cCA9IGxvb2t1cF9wcm90b2lkKHByb3RvaWQpOwotCQl0cC0+cF9uYW1lID0gc3RyZHVwKGVwcm90b19kYltpXS5zKTsKLQl9Ci0JLyogSGFyZHdpcmUgc29tZSBTTkFQIHByb3RvIElEIG5hbWVzICovCi0JZm9yIChwbCA9IHByb3RvaWRsaXN0OyBwbC0+bmFtZSAhPSBOVUxMOyArK3BsKSB7Ci0JCXRwID0gbG9va3VwX3Byb3RvaWQocGwtPnByb3RvaWQpOwotCQkvKiBEb24ndCBvdmVycmlkZSBleGlzdGluZyBuYW1lICovCi0JCWlmICh0cC0+cF9uYW1lICE9IE5VTEwpCi0JCQljb250aW51ZTsKLQotCQl0cC0+cF9uYW1lID0gcGwtPm5hbWU7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGV0aGVybGlzdCB7Ci0JY29uc3QgdV9jaGFyIGFkZHJbNl07Ci0JY29uc3QgY2hhciAqbmFtZTsKLX0gZXRoZXJsaXN0W10gPSB7Ci0Je3sgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9LCAiQnJvYWRjYXN0IiB9LAotCXt7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwgTlVMTCB9Ci19OwotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgZXRoZXJzIGhhc2ggdGFibGUuICBXZSB0YWtlIHR3byBkaWZmZXJlbnQgYXBwcm9hY2hlcwotICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHRoZSBzeXN0ZW0gcHJvdmlkZXMgdGhlIGV0aGVycyBuYW1lCi0gKiBzZXJ2aWNlLiAgSWYgaXQgZG9lcywgd2UganVzdCB3aXJlIGluIGEgZmV3IG5hbWVzIGF0IHN0YXJ0dXAsCi0gKiBhbmQgZXRoZXJhZGRyX3N0cmluZygpIGZpbGxzIGluIHRoZSB0YWJsZSBvbiBkZW1hbmQuICBJZiBpdCBkb2Vzbid0LAotICogdGhlbiB3ZSBzdWNrIGluIHRoZSBlbnRpcmUgL2V0Yy9ldGhlcnMgZmlsZSBhdCBzdGFydHVwLiAgVGhlIGlkZWEKLSAqIGlzIHRoYXQgcGFyc2luZyB0aGUgbG9jYWwgZmlsZSB3aWxsIGJlIGZhc3QsIGJ1dCBzcGlubmluZyB0aHJvdWdoCi0gKiBhbGwgdGhlIGV0aGVycyBlbnRyaWVzIHZpYSBOSVMgJiBuZXh0X2V0aGVyZW50IG1pZ2h0IGJlIHZlcnkgc2xvdy4KLSAqCi0gKiBYWFggcGNhcF9uZXh0X2V0aGVyZW50IGRvZXNuJ3QgYmVsb25nIGluIHRoZSBwY2FwIGludGVyZmFjZSwgYnV0Ci0gKiBzaW5jZSB0aGUgcGNhcCBtb2R1bGUgYWxyZWFkeSBkb2VzIG5hbWUtdG8tYWRkcmVzcyB0cmFuc2xhdGlvbiwKLSAqIGl0J3MgYWxyZWFkeSBkb2VzIG1vc3Qgb2YgdGhlIHdvcmsgZm9yIHRoZSBldGhlcm5ldCBhZGRyZXNzLXRvLW5hbWUKLSAqIHRyYW5zbGF0aW9uLCBzbyB3ZSBqdXN0IHBjYXBfbmV4dF9ldGhlcmVudCBhcyBhIGNvbnZlbmllbmNlLgotICovCi1zdGF0aWMgdm9pZAotaW5pdF9ldGhlcmFycmF5KHZvaWQpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IGV0aGVybGlzdCAqZWw7Ci0JcmVnaXN0ZXIgc3RydWN0IGVuYW1lbWVtICp0cDsKLSNpZmRlZiBVU0VfRVRIRVJfTlRPSE9TVAotCWNoYXIgbmFtZVsyNTZdOwotI2Vsc2UKLQlyZWdpc3RlciBzdHJ1Y3QgcGNhcF9ldGhlcmVudCAqZXA7Ci0JcmVnaXN0ZXIgRklMRSAqZnA7Ci0KLQkvKiBTdWNrIGluIGVudGlyZSBldGhlcnMgZmlsZSAqLwotCWZwID0gZm9wZW4oUENBUF9FVEhFUlNfRklMRSwgInIiKTsKLQlpZiAoZnAgIT0gTlVMTCkgewotCQl3aGlsZSAoKGVwID0gcGNhcF9uZXh0X2V0aGVyZW50KGZwKSkgIT0gTlVMTCkgewotCQkJdHAgPSBsb29rdXBfZW1lbShlcC0+YWRkcik7Ci0JCQl0cC0+ZV9uYW1lID0gc3RyZHVwKGVwLT5uYW1lKTsKLQkJfQotCQkodm9pZClmY2xvc2UoZnApOwotCX0KLSNlbmRpZgotCi0JLyogSGFyZHdpcmUgc29tZSBldGhlcm5ldCBuYW1lcyAqLwotCWZvciAoZWwgPSBldGhlcmxpc3Q7IGVsLT5uYW1lICE9IE5VTEw7ICsrZWwpIHsKLQkJdHAgPSBsb29rdXBfZW1lbShlbC0+YWRkcik7Ci0JCS8qIERvbid0IG92ZXJyaWRlIGV4aXN0aW5nIG5hbWUgKi8KLQkJaWYgKHRwLT5lX25hbWUgIT0gTlVMTCkKLQkJCWNvbnRpbnVlOwotCi0jaWZkZWYgVVNFX0VUSEVSX05UT0hPU1QKLQkJLyoKLQkJICogVXNlIFlQL05JUyB2ZXJzaW9uIG9mIG5hbWUgaWYgYXZhaWxhYmxlLgotCQkgKgotCQkgKiBXZSBkb24ndCBjYXN0IGl0IHRvICJjb25zdCBzdHJ1Y3QgZXRoZXJfYWRkciAqIgotCQkgKiBiZWNhdXNlIHNvbWUgc3lzdGVtcyBkb24ndCBtb2RpZnkgdGhlIEV0aGVybmV0Ci0JCSAqIGFkZHJlc3MgYnV0IGZhaWwgdG8gZGVjbGFyZSB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0JCSAqIGFzIGEgImNvbnN0IiBwb2ludGVyLgotCQkgKi8KLQkJaWYgKGV0aGVyX250b2hvc3QobmFtZSwgKHN0cnVjdCBldGhlcl9hZGRyICopZWwtPmFkZHIpID09IDApIHsKLQkJCXRwLT5lX25hbWUgPSBzdHJkdXAobmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotI2VuZGlmCi0JCXRwLT5lX25hbWUgPSBlbC0+bmFtZTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGlweHNhcF9kYltdID0gewotCXsgMHgwMDAwLCAiVW5rbm93biIgfSwKLQl7IDB4MDAwMSwgIlVzZXIiIH0sCi0JeyAweDAwMDIsICJVc2VyIEdyb3VwIiB9LAotCXsgMHgwMDAzLCAiUHJpbnRRdWV1ZSIgfSwKLQl7IDB4MDAwNCwgIkZpbGVTZXJ2ZXIiIH0sCi0JeyAweDAwMDUsICJKb2JTZXJ2ZXIiIH0sCi0JeyAweDAwMDYsICJHYXRld2F5IiB9LAotCXsgMHgwMDA3LCAiUHJpbnRTZXJ2ZXIiIH0sCi0JeyAweDAwMDgsICJBcmNoaXZlUXVldWUiIH0sCi0JeyAweDAwMDksICJBcmNoaXZlU2VydmVyIiB9LAotCXsgMHgwMDBhLCAiSm9iUXVldWUiIH0sCi0JeyAweDAwMGIsICJBZG1pbmlzdHJhdGlvbiIgfSwKLQl7IDB4MDAwRiwgIk5vdmVsbCBUSS1SUEMiIH0sCi0JeyAweDAwMTcsICJEaWFnbm9zdGljcyIgfSwKLQl7IDB4MDAyMCwgIk5ldEJJT1MiIH0sCi0JeyAweDAwMjEsICJOQVMgU05BIEdhdGV3YXkiIH0sCi0JeyAweDAwMjMsICJOQUNTIEFzeW5jR2F0ZXdheSIgfSwKLQl7IDB4MDAyNCwgIlJlbW90ZUJyaWRnZS9Sb3V0aW5nU2VydmljZSIgfSwKLQl7IDB4MDAyNiwgIkJyaWRnZVNlcnZlciIgfSwKLQl7IDB4MDAyNywgIlRDUC9JUCBHYXRld2F5IiB9LAotCXsgMHgwMDI4LCAiUG9pbnQtdG8tcG9pbnQgWC4yNSBCcmlkZ2VTZXJ2ZXIiIH0sCi0JeyAweDAwMjksICIzMjcwIEdhdGV3YXkiIH0sCi0JeyAweDAwMmEsICJDSEkgQ29ycCIgfSwKLQl7IDB4MDAyYywgIlBDIENoYWxrYm9hcmQiIH0sCi0JeyAweDAwMmQsICJUaW1lU3luY2hTZXJ2ZXIiIH0sCi0JeyAweDAwMmUsICJBUkNzZXJ2ZTUuMC9QYWxpbmRyb21lQmFja3VwIiB9LAotCXsgMHgwMDQ1LCAiREkzMjcwIEdhdGV3YXkiIH0sCi0JeyAweDAwNDcsICJBZHZlcnRpc2luZ1ByaW50U2VydmVyIiB9LAotCXsgMHgwMDRhLCAiTmV0QmxhemVyTW9kZW1zIiB9LAotCXsgMHgwMDRiLCAiQnRyaWV2ZVZBUCIgfSwKLQl7IDB4MDA0YywgIk5ldHdhcmVTUUwiIH0sCi0JeyAweDAwNGQsICJYdHJlZU5ldHdvcmsiIH0sCi0JeyAweDAwNTAsICJCdHJpZXZlVkFQNC4xMSIgfSwKLQl7IDB4MDA1MiwgIlF1aWNrTGluayIgfSwKLQl7IDB4MDA1MywgIlByaW50UXVldWVVc2VyIiB9LAotCXsgMHgwMDU4LCAiTXVsdGlwb2ludCBYLjI1IFJvdXRlciIgfSwKLQl7IDB4MDA2MCwgIlNUTEIvTkxNIiB9LAotCXsgMHgwMDY0LCAiQVJDc2VydmUiIH0sCi0JeyAweDAwNjYsICJBUkNzZXJ2ZTMuMCIgfSwKLQl7IDB4MDA3MiwgIldBTiBDb3B5VXRpbGl0eSIgfSwKLQl7IDB4MDA3YSwgIlRFUy1OZXR3YXJlVk1TIiB9LAotCXsgMHgwMDkyLCAiV0FUQ09NIERlYnVnZ2VyL0VtZXJhbGRUYXBlQmFja3VwU2VydmVyIiB9LAotCXsgMHgwMDk1LCAiRERBIE9CR1lOIiB9LAotCXsgMHgwMDk4LCAiTmV0d2FyZUFjY2Vzc1NlcnZlciIgfSwKLQl7IDB4MDA5YSwgIk5ldHdhcmUgZm9yIFZNUyBJSS9OYW1lZFBpcGVTZXJ2ZXIiIH0sCi0JeyAweDAwOWIsICJOZXR3YXJlQWNjZXNzU2VydmVyIiB9LAotCXsgMHgwMDllLCAiUG9ydGFibGVOZXR3YXJlU2VydmVyL1N1bkxpbmtOVlQiIH0sCi0JeyAweDAwYTEsICJQb3dlcmNodXRlQVBDIFVQUyIgfSwKLQl7IDB4MDBhYSwgIkxBV3NlcnZlIiB9LAotCXsgMHgwMGFjLCAiQ29tcGFxSURBIFN0YXR1c01vbml0b3IiIH0sCi0JeyAweDAxMDAsICJQSVBFIFNUQUlMIiB9LAotCXsgMHgwMTAyLCAiTEFOIFByb3RlY3RCaW5kZXJ5IiB9LAotCXsgMHgwMTAzLCAiT3JhY2xlRGF0YUJhc2VTZXJ2ZXIiIH0sCi0JeyAweDAxMDcsICJOZXR3YXJlMzg2L1JTUFggUmVtb3RlQ29uc29sZSIgfSwKLQl7IDB4MDEwZiwgIk5vdmVsbFNOQSBHYXRld2F5IiB9LAotCXsgMHgwMTExLCAiVGVzdFNlcnZlciIgfSwKLQl7IDB4MDExMiwgIkhQIFByaW50U2VydmVyIiB9LAotCXsgMHgwMTE0LCAiQ1NBIE1VWCIgfSwKLQl7IDB4MDExNSwgIkNTQSBMQ0EiIH0sCi0JeyAweDAxMTYsICJDU0EgQ00iIH0sCi0JeyAweDAxMTcsICJDU0EgU01BIiB9LAotCXsgMHgwMTE4LCAiQ1NBIERCQSIgfSwKLQl7IDB4MDExOSwgIkNTQSBOTUEiIH0sCi0JeyAweDAxMWEsICJDU0EgU1NBIiB9LAotCXsgMHgwMTFiLCAiQ1NBIFNUQVRVUyIgfSwKLQl7IDB4MDExZSwgIkNTQSBBUFBDIiB9LAotCXsgMHgwMTI2LCAiU05BIFRFU1QgU1NBIFByb2ZpbGUiIH0sCi0JeyAweDAxMmEsICJDU0EgVFJBQ0UiIH0sCi0JeyAweDAxMmIsICJOZXR3YXJlU0FBIiB9LAotCXsgMHgwMTJlLCAiSUtBUlVTIFZpcnVzU2NhbiIgfSwKLQl7IDB4MDEzMCwgIkNvbW11bmljYXRpb25zRXhlY3V0aXZlIiB9LAotCXsgMHgwMTMzLCAiTk5TIERvbWFpblNlcnZlci9OZXR3YXJlTmFtaW5nU2VydmljZXNEb21haW4iIH0sCi0JeyAweDAxMzUsICJOZXR3YXJlTmFtaW5nU2VydmljZXNQcm9maWxlIiB9LAotCXsgMHgwMTM3LCAiTmV0d2FyZTM4NiBQcmludFF1ZXVlL05OUyBQcmludFF1ZXVlIiB9LAotCXsgMHgwMTQxLCAiTEFOIFNwb29sU2VydmVyIiB9LAotCXsgMHgwMTUyLCAiSVJNQUxBTiBHYXRld2F5IiB9LAotCXsgMHgwMTU0LCAiTmFtZWRQaXBlU2VydmVyIiB9LAotCXsgMHgwMTY2LCAiTmV0V2FyZU1hbmFnZW1lbnQiIH0sCi0JeyAweDAxNjgsICJJbnRlbCBQSUNLSVQgQ29tbVNlcnZlci9JbnRlbCBDQVMgVGFsa1NlcnZlciIgfSwKLQl7IDB4MDE3MywgIkNvbXBhcSIgfSwKLQl7IDB4MDE3NCwgIkNvbXBhcSBTTk1QIEFnZW50IiB9LAotCXsgMHgwMTc1LCAiQ29tcGFxIiB9LAotCXsgMHgwMTgwLCAiWFRyZWVTZXJ2ZXIvWFRyZWVUb29scyIgfSwKLQl7IDB4MDE4QSwgIk5BU0kgU2VydmljZXNCcm9hZGNhc3RTZXJ2ZXIiIH0sCi0JeyAweDAxYjAsICJHQVJQIEdhdGV3YXkiIH0sCi0JeyAweDAxYjEsICJCaW5mdmlldyIgfSwKLQl7IDB4MDFiZiwgIkludGVsTGFuRGVza01hbmFnZXIiIH0sCi0JeyAweDAxY2EsICJBWFRFQyIgfSwKLQl7IDB4MDFjYiwgIlNoaXZhTmV0TW9kZW0vRSIgfSwKLQl7IDB4MDFjYywgIlNoaXZhTGFuUm92ZXIvRSIgfSwKLQl7IDB4MDFjZCwgIlNoaXZhTGFuUm92ZXIvVCIgfSwKLQl7IDB4MDFjZSwgIlNoaXZhVW5pdmVyc2FsIiB9LAotCXsgMHgwMWQ4LCAiQ2FzdGVsbGVGQVhQcmVzc1NlcnZlciIgfSwKLQl7IDB4MDFkYSwgIkNhc3RlbGxlTEFOUHJlc3NQcmludFNlcnZlciIgfSwKLQl7IDB4MDFkYywgIkNhc3RlbGxlRkFYL1hlcm94NzAzMyBGYXhTZXJ2ZXIvRXhjZWxMYW5GYXgiIH0sCi0JeyAweDAxZjAsICJMRUdBVE8iIH0sCi0JeyAweDAxZjUsICJMRUdBVE8iIH0sCi0JeyAweDAyMzMsICJOTVMgQWdlbnQvTmV0d2FyZU1hbmFnZW1lbnRBZ2VudCIgfSwKLQl7IDB4MDIzNywgIk5NUyBJUFggRGlzY292ZXJ5L0xBTnRlcm5SZWFkV3JpdGVDaGFubmVsIiB9LAotCXsgMHgwMjM4LCAiTk1TIElQIERpc2NvdmVyeS9MQU50ZXJuVHJhcEFsYXJtQ2hhbm5lbCIgfSwKLQl7IDB4MDIzYSwgIkxBTnRlcm4iIH0sCi0JeyAweDAyM2MsICJNQVZFUklDSyIgfSwKLQl7IDB4MDIzZiwgIk5vdmVsbFNNRFIiIH0sCi0JeyAweDAyNGUsICJOZXR3YXJlQ29ubmVjdCIgfSwKLQl7IDB4MDI0ZiwgIk5BU0kgU2VydmVyQnJvYWRjYXN0IENpc2NvIiB9LAotCXsgMHgwMjZhLCAiTk1TIFNlcnZpY2VDb25zb2xlIiB9LAotCXsgMHgwMjZiLCAiVGltZVN5bmNocm9uaXphdGlvblNlcnZlciBOZXR3YXJlIDQueCIgfSwKLQl7IDB4MDI3OCwgIkRpcmVjdG9yeVNlcnZlciBOZXR3YXJlIDQueCIgfSwKLQl7IDB4MDI3YiwgIk5ldHdhcmVNYW5hZ2VtZW50QWdlbnQiIH0sCi0JeyAweDAyODAsICJOb3ZlbGwgRmlsZSBhbmQgUHJpbnRlciBTaGFyaW5nIFNlcnZpY2UgZm9yIFBDIiB9LAotCXsgMHgwMzA0LCAiTm92ZWxsU0FBIEdhdGV3YXkiIH0sCi0JeyAweDAzMDgsICJDT00vVkVSTUVEIiB9LAotCXsgMHgwMzBhLCAiR2FsYWN0aWNvbW1Xb3JsZGdyb3VwU2VydmVyIiB9LAotCXsgMHgwMzBjLCAiSW50ZWxOZXRwb3J0Mi9IUCBKZXREaXJlY3QvSFAgUXVpY2tzaWx2ZXIiIH0sCi0JeyAweDAzMjAsICJBdHRhY2htYXRlR2F0ZXdheSIgfSwKLQl7IDB4MDMyNywgIk1pY3Jvc29mdERpYWdub3N0aW9jcyIgfSwKLQl7IDB4MDMyOCwgIldBVENPTSBTUUwgU2VydmVyIiB9LAotCXsgMHgwMzM1LCAiTXVsdGlUZWNoU3lzdGVtcyBNdWx0aXN5bmNoQ29tbVNlcnZlciIgfSwKLQl7IDB4MDM0MywgIlh5bG9naWNzIFJlbW90ZUFjY2Vzc1NlcnZlci9MQU5Nb2RlbSIgfSwKLQl7IDB4MDM1NSwgIkFyY2FkYUJhY2t1cEV4ZWMiIH0sCi0JeyAweDAzNTgsICJNU0xDRDEiIH0sCi0JeyAweDAzNjEsICJORVRJTkVMTyIgfSwKLQl7IDB4MDM3ZSwgIlBvd2VyY2h1dGUgVVBTIE1vbml0b3JpbmciIH0sCi0JeyAweDAzN2YsICJWaXJ1U2FmZU5vdGlmeSIgfSwKLQl7IDB4MDM4NiwgIkhQIEJyaWRnZSIgfSwKLQl7IDB4MDM4NywgIkhQIEh1YiIgfSwKLQl7IDB4MDM5NCwgIk5ldFdhcmUgU0FBIEdhdGV3YXkiIH0sCi0JeyAweDAzOWIsICJMb3R1c05vdGVzIiB9LAotCXsgMHgwM2I3LCAiQ2VydHVzQW50aVZpcnVzIiB9LAotCXsgMHgwM2M0LCAiQVJDc2VydmU0LjAiIH0sCi0JeyAweDAzYzcsICJMQU5zcG9vbDMuNSIgfSwKLQl7IDB4MDNkNywgIkxleG1hcmtQcmludGVyU2VydmVyIiB9LAotCXsgMHgwM2Q4LCAiTGV4bWFya1hMRSBQcmludGVyU2VydmVyIiB9LAotCXsgMHgwM2RkLCAiQmFueWFuRU5TIE5ldHdhcmVDbGllbnQiIH0sCi0JeyAweDAzZGUsICJHdXB0YVNlcXVlbEJhc2VTZXJ2ZXIvTmV0V2FyZVNRTCIgfSwKLQl7IDB4MDNlMSwgIlVuaXZlbFVuaXh3YXJlIiB9LAotCXsgMHgwM2U0LCAiVW5pdmVsVW5peHdhcmUiIH0sCi0JeyAweDAzZmMsICJJbnRlbE5ldHBvcnQiIH0sCi0JeyAweDAzZmQsICJQcmludFNlcnZlclF1ZXVlIiB9LAotCXsgMHgwNDBBLCAiaXBuU2VydmVyIiB9LAotCXsgMHgwNDBELCAiTFZFUlJNQU4iIH0sCi0JeyAweDA0MEUsICJMVkxJQyIgfSwKLQl7IDB4MDQxNCwgIk5FVCBTaWxpY29uIChEUEkpL0t5b2NlcmEiIH0sCi0JeyAweDA0MjksICJTaXRlTG9ja1ZpcnVzIiB9LAotCXsgMHgwNDMyLCAiVUZIRUxQUj8/PyIgfSwKLQl7IDB4MDQzMywgIlN5bm9wdGljczI4MXhBZHZhbmNlZFNOTVBBZ2VudCIgfSwKLQl7IDB4MDQ0NCwgIk1pY3Jvc29mdE5UIFNOQSBTZXJ2ZXIiIH0sCi0JeyAweDA0NDgsICJPcmFjbGUiIH0sCi0JeyAweDA0NGMsICJBUkNzZXJ2ZTUuMDEiIH0sCi0JeyAweDA0NTcsICJDYW5vbkdQNTUiIH0sCi0JeyAweDA0NWEsICJRTVMgUHJpbnRlcnMiIH0sCi0JeyAweDA0NWIsICJEZWxsU0NTSSBBcnJheSIgfSwKLQl7IDB4MDQ5MSwgIk5ldEJsYXplck1vZGVtcyIgfSwKLQl7IDB4MDRhYywgIk9uVGltZVNjaGVkdWxlciIgfSwKLQl7IDB4MDRiMCwgIkNELU5ldCIgfSwKLQl7IDB4MDUxMywgIkVtdWxleE5RQSIgfSwKLQl7IDB4MDUyMCwgIlNpdGVMb2NrQ2hlY2tzIiB9LAotCXsgMHgwNTI5LCAiU2l0ZUxvY2tDaGVja3MiIH0sCi0JeyAweDA1MmQsICJDaXRyaXhPUzIgQXBwU2VydmVyIiB9LAotCXsgMHgwNTM1LCAiVGVrdHJvbml4IiB9LAotCXsgMHgwNTM2LCAiTWlsYW4iIH0sCi0JeyAweDA1NWQsICJBdHRhY2htYXRlIFNOQSBnYXRld2F5IiB9LAotCXsgMHgwNTZiLCAiSUJNODIzNSBNb2RlbVNlcnZlciIgfSwKLQl7IDB4MDU2YywgIlNoaXZhTGFuUm92ZXIvRSBQTFVTIiB9LAotCXsgMHgwNTZkLCAiU2hpdmFMYW5Sb3Zlci9UIFBMVVMiIH0sCi0JeyAweDA1ODAsICJNY0FmZWVOZXRTaGllbGQiIH0sCi0JeyAweDA1QjgsICJOTE0gdG8gd29ya3N0YXRpb24gY29tbXVuaWNhdGlvbiAoUmV2ZWxhdGlvbiBTb2Z0d2FyZSkiIH0sCi0JeyAweDA1QkEsICJDb21wYXRpYmxlU3lzdGVtc1JvdXRlcnMiIH0sCi0JeyAweDA1QkUsICJDaGV5ZW5uZUhpZXJhcmNoaWNhbFN0b3JhZ2VNYW5hZ2VyIiB9LAotCXsgMHgwNjA2LCAiSkNXYXRlcm1hcmtJbWFnaW5nIiB9LAotCXsgMHgwNjBjLCAiQVhJU05ldHdvcmtQcmludGVyIiB9LAotCXsgMHgwNjEwLCAiQWRhcHRlY1NDU0lNYW5hZ2VtZW50IiB9LAotCXsgMHgwNjIxLCAiSUJNIEFudGlWaXJ1cyIgfSwKLQl7IDB4MDY0MCwgIldpbmRvd3M5NSBSZW1vdGVSZWdpc3RyeVNlcnZpY2UiIH0sCi0JeyAweDA2NGUsICJNaWNyb3NvZnRJSVMiIH0sCi0JeyAweDA2N2IsICJNaWNyb3NvZnQgV2luOTUvOTggRmlsZSBhbmQgUHJpbnQgU2hhcmluZyBmb3IgTmV0V2FyZSIgfSwKLQl7IDB4MDY3YywgIk1pY3Jvc29mdCBXaW45NS85OCBGaWxlIGFuZCBQcmludCBTaGFyaW5nIGZvciBOZXRXYXJlIiB9LAotCXsgMHgwNzZDLCAiWGVyb3giIH0sCi0JeyAweDA3OWIsICJTaGl2YUxhblJvdmVyL0UgMTE1IiB9LAotCXsgMHgwNzljLCAiU2hpdmFMYW5Sb3Zlci9UIDExNSIgfSwKLQl7IDB4MDdCNCwgIkN1Yml4V29ybGREZXNrIiB9LAotCXsgMHgwN2MyLCAiUXVhcnRlcmRlY2sgSVdhcmUgQ29ubmVjdCBWMi54IE5MTSIgfSwKLQl7IDB4MDdjMSwgIlF1YXJ0ZXJkZWNrIElXYXJlIENvbm5lY3QgVjMueCBOTE0iIH0sCi0JeyAweDA4MTAsICJFTEFOIExpY2Vuc2UgU2VydmVyIERlbW8iIH0sCi0JeyAweDA4MjQsICJTaGl2YUxhblJvdmVyQWNjZXNzU3dpdGNoL0UiIH0sCi0JeyAweDA4NmEsICJJU1NDIENvbGxlY3RvciIgfSwKLQl7IDB4MDg3ZiwgIklTU0MgREFTIEFnZW50QUlYIiB9LAotCXsgMHgwODgwLCAiSW50ZWwgTmV0cG9ydCBQUk8iIH0sCi0JeyAweDA4ODEsICJJbnRlbCBOZXRwb3J0IFBSTyIgfSwKLQl7IDB4MGIyOSwgIlNpdGVMb2NrIiB9LAotCXsgMHgwYzI5LCAiU2l0ZUxvY2tBcHBsaWNhdGlvbnMiIH0sCi0JeyAweDBjMmMsICJMaWNlbnNpbmdTZXJ2ZXIiIH0sCi0JeyAweDIxMDEsICJQZXJmb3JtYW5jZVRlY2hub2xvZ3lJbnN0YW50SW50ZXJuZXQiIH0sCi0JeyAweDIzODAsICJMQUkgU2l0ZUxvY2siIH0sCi0JeyAweDIzOGMsICJNZWV0aW5nTWFrZXIiIH0sCi0JeyAweDQ4MDgsICJTaXRlTG9ja1NlcnZlci9TaXRlTG9ja01ldGVyaW5nIiB9LAotCXsgMHg1NTU1LCAiU2l0ZUxvY2tVc2VyIiB9LAotCXsgMHg2MzEyLCAiVGFwZXdhcmUiIH0sCi0JeyAweDZmMDAsICJSYWJiaXRHYXRld2F5IiB9LAotCXsgMHg3NzAzLCAiTU9ERU0iIH0sCi0JeyAweDgwMDIsICJOZXRQb3J0UHJpbnRlcnMiIH0sCi0JeyAweDgwMDgsICJXb3JkUGVyZmVjdE5ldHdvcmtWZXJzaW9uIiB9LAotCXsgMHg4NUJFLCAiQ2lzY28gRUlHUlAiIH0sCi0JeyAweDg4ODgsICJXb3JkUGVyZmVjdE5ldHdvcmtWZXJzaW9uL1F1aWNrTmV0d29ya01hbmFnZW1lbnQiIH0sCi0JeyAweDkwMDAsICJNY0FmZWVOZXRTaGllbGQiIH0sCi0JeyAweDk2MDQsICJDU0EtTlRfTU9OIiB9LAotCXsgMHhiNmE4LCAiT2NlYW5Jc2xlUmVhY2hvdXRSZW1vdGVDb250cm9sIiB9LAotCXsgMHhmMTFmLCAiU2l0ZUxvY2tNZXRlcmluZyIgfSwKLQl7IDB4ZjFmZiwgIlNpdGVMb2NrIiB9LAotCXsgMHhmNTAzLCAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIiIH0sCi0JeyAweEY5MDUsICJJQk0gVGltZUFuZFBsYWNlIiB9LAotCXsgMHhmYmZiLCAiVG9wQ2FsbElJSSBGYXhTZXJ2ZXIiIH0sCi0JeyAweGZmZmYsICJBbnlTZXJ2aWNlL1dpbGRjYXJkIiB9LAotCXsgMCwgKGNoYXIgKikwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1pbml0X2lweHNhcGFycmF5KHZvaWQpCi17Ci0JcmVnaXN0ZXIgaW50IGk7Ci0JcmVnaXN0ZXIgc3RydWN0IGhuYW1lbWVtICp0YWJsZTsKLQotCWZvciAoaSA9IDA7IGlweHNhcF9kYltpXS5zICE9IE5VTEw7IGkrKykgewotCQlpbnQgaiA9IGh0b25zKGlweHNhcF9kYltpXS52KSAmIChIQVNITkFNRVNJWkUtMSk7Ci0JCXRhYmxlID0gJmlweHNhcHRhYmxlW2pdOwotCQl3aGlsZSAodGFibGUtPm5hbWUpCi0JCQl0YWJsZSA9IHRhYmxlLT5ueHQ7Ci0JCXRhYmxlLT5uYW1lID0gaXB4c2FwX2RiW2ldLnM7Ci0JCXRhYmxlLT5hZGRyID0gaHRvbnMoaXB4c2FwX2RiW2ldLnYpOwotCQl0YWJsZS0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKLQl9Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBhZGRyZXNzIHRvIG5hbWUgdHJhbnNsYXRpb24gbWFjaGluZXJ5LiAgV2UgbWFwIGFsbAotICogbm9uLWxvY2FsIElQIGFkZHJlc3NlcyB0byBudW1lcmljIGFkZHJlc3NlcyBpZiBmZmxhZyBpcyB0cnVlIChpLmUuLAotICogdG8gcHJldmVudCBibG9ja2luZyBvbiB0aGUgbmFtZXNlcnZlcikuICBsb2NhbG5ldCBpcyB0aGUgSVAgYWRkcmVzcwotICogb2YgdGhlIGxvY2FsIG5ldHdvcmsuICBtYXNrIGlzIGl0cyBzdWJuZXQgbWFzay4KLSAqLwotdm9pZAotaW5pdF9hZGRydG9uYW1lKHVfaW50MzJfdCBsb2NhbG5ldCwgdV9pbnQzMl90IG1hc2spCi17Ci0JaWYgKGZmbGFnKSB7Ci0JCWZfbG9jYWxuZXQgPSBsb2NhbG5ldDsKLQkJZl9uZXRtYXNrID0gbWFzazsKLQl9Ci0JaWYgKG5mbGFnKQotCQkvKgotCQkgKiBTaW1wbGVzdCB3YXkgdG8gc3VwcHJlc3MgbmFtZXMuCi0JCSAqLwotCQlyZXR1cm47Ci0KLQlpbml0X2V0aGVyYXJyYXkoKTsKLQlpbml0X3NlcnZhcnJheSgpOwotCWluaXRfZXByb3RvYXJyYXkoKTsKLQlpbml0X3Byb3RvaWRhcnJheSgpOwotCWluaXRfaXB4c2FwYXJyYXkoKTsKLX0KLQotY29uc3QgY2hhciAqCi1kbmFkZHJfc3RyaW5nKHVfc2hvcnQgZG5hZGRyKQotewotCXJlZ2lzdGVyIHN0cnVjdCBobmFtZW1lbSAqdHA7Ci0KLQlmb3IgKHRwID0gJmRuYWRkcnRhYmxlW2RuYWRkciAmIChIQVNITkFNRVNJWkUtMSldOyB0cC0+bnh0ICE9IDA7Ci0JICAgICB0cCA9IHRwLT5ueHQpCi0JCWlmICh0cC0+YWRkciA9PSBkbmFkZHIpCi0JCQlyZXR1cm4gKHRwLT5uYW1lKTsKLQotCXRwLT5hZGRyID0gZG5hZGRyOwotCXRwLT5ueHQgPSBuZXdobmFtZW1lbSgpOwotCWlmIChuZmxhZykKLQkJdHAtPm5hbWUgPSBkbm51bV9zdHJpbmcoZG5hZGRyKTsKLQllbHNlCi0JCXRwLT5uYW1lID0gZG5uYW1lX3N0cmluZyhkbmFkZHIpOwotCi0JcmV0dXJuKHRwLT5uYW1lKTsKLX0KLQotLyogUmV0dXJuIGEgemVybydlZCBobmFtZW1lbSBzdHJ1Y3QgYW5kIGN1dHMgZG93biBvbiBjYWxsb2MoKSBvdmVyaGVhZCAqLwotc3RydWN0IGhuYW1lbWVtICoKLW5ld2huYW1lbWVtKHZvaWQpCi17Ci0JcmVnaXN0ZXIgc3RydWN0IGhuYW1lbWVtICpwOwotCXN0YXRpYyBzdHJ1Y3QgaG5hbWVtZW0gKnB0ciA9IE5VTEw7Ci0Jc3RhdGljIHVfaW50IG51bSA9IDA7Ci0KLQlpZiAobnVtICA8PSAwKSB7Ci0JCW51bSA9IDY0OwotCQlwdHIgPSAoc3RydWN0IGhuYW1lbWVtICopY2FsbG9jKG51bSwgc2l6ZW9mICgqcHRyKSk7Ci0JCWlmIChwdHIgPT0gTlVMTCkKLQkJCWVycm9yKCJuZXdobmFtZW1lbTogY2FsbG9jIik7Ci0JfQotCS0tbnVtOwotCXAgPSBwdHIrKzsKLQlyZXR1cm4gKHApOwotfQotCi0jaWZkZWYgSU5FVDYKLS8qIFJldHVybiBhIHplcm8nZWQgaDZuYW1lbWVtIHN0cnVjdCBhbmQgY3V0cyBkb3duIG9uIGNhbGxvYygpIG92ZXJoZWFkICovCi1zdHJ1Y3QgaDZuYW1lbWVtICoKLW5ld2g2bmFtZW1lbSh2b2lkKQotewotCXJlZ2lzdGVyIHN0cnVjdCBoNm5hbWVtZW0gKnA7Ci0Jc3RhdGljIHN0cnVjdCBoNm5hbWVtZW0gKnB0ciA9IE5VTEw7Ci0Jc3RhdGljIHVfaW50IG51bSA9IDA7Ci0KLQlpZiAobnVtICA8PSAwKSB7Ci0JCW51bSA9IDY0OwotCQlwdHIgPSAoc3RydWN0IGg2bmFtZW1lbSAqKWNhbGxvYyhudW0sIHNpemVvZiAoKnB0cikpOwotCQlpZiAocHRyID09IE5VTEwpCi0JCQllcnJvcigibmV3aDZuYW1lbWVtOiBjYWxsb2MiKTsKLQl9Ci0JLS1udW07Ci0JcCA9IHB0cisrOwotCXJldHVybiAocCk7Ci19Ci0jZW5kaWYgLyogSU5FVDYgKi8KZGlmZiAtLWdpdCBhL2FkZHJ0b25hbWUuaCBiL2FkZHJ0b25hbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdkZWQ2ZS4uMDAwMDAwMAotLS0gYS9hZGRydG9uYW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9hZGRydG9uYW1lLmgsdiAxLjE4IDIwMDEvMDkvMTcgMjE6NTc6NTEgZmVubmVyIEV4cCAkIChMQkwpCi0gKi8KLQotLyogTmFtZSB0byBhZGRyZXNzIHRyYW5zbGF0aW9uIHJvdXRpbmVzLiAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqbGlua2FkZHJfc3RyaW5nKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmV0aGVyYWRkcl9zdHJpbmcoY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmV0aGVycHJvdG9fc3RyaW5nKHVfc2hvcnQpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnRjcHBvcnRfc3RyaW5nKHVfc2hvcnQpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnVkcHBvcnRfc3RyaW5nKHVfc2hvcnQpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmdldG5hbWUoY29uc3QgdV9jaGFyICopOwotI2lmZGVmIElORVQ2Ci1leHRlcm4gY29uc3QgY2hhciAqZ2V0bmFtZTYoY29uc3QgdV9jaGFyICopOwotI2VuZGlmCi1leHRlcm4gY29uc3QgY2hhciAqaW50b2EodV9pbnQzMl90KTsKLQotZXh0ZXJuIHZvaWQgaW5pdF9hZGRydG9uYW1lKHVfaW50MzJfdCwgdV9pbnQzMl90KTsKLWV4dGVybiBzdHJ1Y3QgaG5hbWVtZW0gKm5ld2huYW1lbWVtKHZvaWQpOwotI2lmZGVmIElORVQ2Ci1leHRlcm4gc3RydWN0IGg2bmFtZW1lbSAqbmV3aDZuYW1lbWVtKHZvaWQpOwotI2VuZGlmCi0KLSNkZWZpbmUgaXBhZGRyX3N0cmluZyhwKSBnZXRuYW1lKChjb25zdCB1X2NoYXIgKikocCkpCi0jaWZkZWYgSU5FVDYKLSNkZWZpbmUgaXA2YWRkcl9zdHJpbmcocCkgZ2V0bmFtZTYoKGNvbnN0IHVfY2hhciAqKShwKSkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYWYuYyBiL2FmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDYxNzguLjAwMDAwMDAKLS0tIGEvYWYuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgVENQRFVNUCBwcm9qZWN0Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCi0gKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9hZi5jLHYgMS4zLjIuMSAyMDA3LzAyLzI2IDEzOjMzOjE3IGhhbm5lcyBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZi5oIgotCi1zdHJ1Y3QgdG9rIGFmX3ZhbHVlc1tdID0gewotICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIn0sCi0gICAgeyBBRk5VTV9JTkVULCAgICAgICAgICAgICAiSVB2NCJ9LAotICAgIHsgQUZOVU1fSU5FVDYsICAgICAgICAgICAgIklQdjYifSwKLSAgICB7IEFGTlVNX05TQVAsICAgICAgICAgICAgICJOU0FQIn0sCi0gICAgeyBBRk5VTV9IRExDLCAgICAgICAgICAgICAiSERMQyJ9LAotICAgIHsgQUZOVU1fQkJOMTgyMiwgICAgICAgICAgIkJCTiAxODIyIn0sCi0gICAgeyBBRk5VTV84MDIsICAgICAgICAgICAgICAiODAyIn0sCi0gICAgeyBBRk5VTV9FMTYzLCAgICAgICAgICAgICAiRS4xNjMifSwKLSAgICB7IEFGTlVNX0UxNjQsICAgICAgICAgICAgICJFLjE2NCJ9LAotICAgIHsgQUZOVU1fRjY5LCAgICAgICAgICAgICAgIkYuNjkifSwKLSAgICB7IEFGTlVNX1gxMjEsICAgICAgICAgICAgICJYLjEyMSJ9LAotICAgIHsgQUZOVU1fSVBYLCAgICAgICAgICAgICAgIk5vdmVsbCBJUFgifSwKLSAgICB7IEFGTlVNX0FUQUxLLCAgICAgICAgICAgICJBcHBsZXRhbGsifSwKLSAgICB7IEFGTlVNX0RFQ05FVCwgICAgICAgICAgICJEZWNuZXQgSVYifSwKLSAgICB7IEFGTlVNX0JBTllBTiwgICAgICAgICAgICJCYW55YW4gVmluZXMifSwKLSAgICB7IEFGTlVNX0UxNjROU0FQLCAgICAgICAgICJFLjE2NCB3aXRoIE5TQVAgc3ViYWRkcmVzcyJ9LAotICAgIHsgQUZOVU1fTDJWUE4sICAgICAgICAgICAgIkxheWVyLTIgVlBOIn0sCi0gICAgeyBBRk5VTV9WUExTLCAgICAgICAgICAgICAiVlBMUyJ9LAotICAgIHsgMCwgTlVMTH0sCi19OwotCi1zdHJ1Y3QgdG9rIGJzZF9hZl92YWx1ZXNbXSA9IHsKLSAgICB7IEJTRF9BRk5VTV9JTkVULCAiSVB2NCIgfSwKLSAgICB7IEJTRF9BRk5VTV9OUywgIk5TIiB9LAotICAgIHsgQlNEX0FGTlVNX0lTTywgIklTTyIgfSwKLSAgICB7IEJTRF9BRk5VTV9BUFBMRVRBTEssICJBcHBsZXRhbGsiIH0sCi0gICAgeyBCU0RfQUZOVU1fSVBYLCAiSVBYIiB9LAotICAgIHsgQlNEX0FGTlVNX0lORVQ2X0JTRCwgIklQdjYiIH0sCi0gICAgeyBCU0RfQUZOVU1fSU5FVDZfRlJFRUJTRCwgIklQdjYiIH0sCi0gICAgeyBCU0RfQUZOVU1fSU5FVDZfREFSV0lOLCAiSVB2NiIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwpkaWZmIC0tZ2l0IGEvYWYuaCBiL2FmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYTc2NjIuLjAwMDAwMDAKLS0tIGEvYWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYWYuaCx2IDEuMy4yLjEgMjAwNy8wMi8yNiAxMzozMzoxNyBoYW5uZXMgRXhwICQgKExCTCkgKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBUQ1BEVU1QIHByb2plY3QKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICovCi0KLWV4dGVybiBzdHJ1Y3QgdG9rIGFmX3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgYnNkX2FmX3ZhbHVlc1tdOwotCi0vKiBSRkMxNzAwIGFkZHJlc3MgZmFtaWx5IG51bWJlcnMgKi8KLSNkZWZpbmUgQUZOVU1fSU5FVAkxCi0jZGVmaW5lIEFGTlVNX0lORVQ2CTIKLSNkZWZpbmUgQUZOVU1fTlNBUAkzCi0jZGVmaW5lIEFGTlVNX0hETEMJNAotI2RlZmluZSBBRk5VTV9CQk4xODIyCTUKLSNkZWZpbmUgQUZOVU1fODAyCTYKLSNkZWZpbmUgQUZOVU1fRTE2Mwk3Ci0jZGVmaW5lIEFGTlVNX0UxNjQJOAotI2RlZmluZSBBRk5VTV9GNjkJOQotI2RlZmluZSBBRk5VTV9YMTIxCTEwCi0jZGVmaW5lIEFGTlVNX0lQWAkxMQotI2RlZmluZSBBRk5VTV9BVEFMSwkxMgotI2RlZmluZSBBRk5VTV9ERUNORVQJMTMKLSNkZWZpbmUgQUZOVU1fQkFOWUFOCTE0Ci0jZGVmaW5lIEFGTlVNX0UxNjROU0FQCTE1Ci0jZGVmaW5lIEFGTlVNX1ZQTFMgICAgICAyNQotLyogZHJhZnQta29tcGVsbGEtcHB2cG4tbDJ2cG4gKi8KLSNkZWZpbmUgQUZOVU1fTDJWUE4gICAgIDE5NiAvKiBzdGlsbCB0byBiZSBhcHByb3ZlZCBieSBJQU5BICovCi0KLS8qCi0gKiBCU0QgQUZfIHZhbHVlcy4KLSAqCi0gKiBVbmZvcnR1bmF0ZWx5LCB0aGUgQlNEcyBkb24ndCBhbGwgdXNlIHRoZSBzYW1lIHZhbHVlIGZvciBBRl9JTkVUNiwKLSAqIHNvLCBiZWNhdXNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byByZWFkIGNhcHR1cmVzIGZyb20gYWxsIG9mIHRoZSBCU0RzLAotICogd2UgY2hlY2sgZm9yIGFsbCBvZiB0aGVtLgotICovCi0jZGVmaW5lIEJTRF9BRk5VTV9JTkVUCQkyCi0jZGVmaW5lIEJTRF9BRk5VTV9OUwkJNgkJLyogWEVST1ggTlMgcHJvdG9jb2xzICovCi0jZGVmaW5lIEJTRF9BRk5VTV9JU08JCTcKLSNkZWZpbmUgQlNEX0FGTlVNX0FQUExFVEFMSwkxNgotI2RlZmluZSBCU0RfQUZOVU1fSVBYCQkyMwotI2RlZmluZSBCU0RfQUZOVU1fSU5FVDZfQlNECTI0CS8qIE9wZW5CU0QgKGFuZCBwcm9iYWJseSBOZXRCU0QpLCBCU0QvT1MgKi8KLSNkZWZpbmUgQlNEX0FGTlVNX0lORVQ2X0ZSRUVCU0QJMjgKLSNkZWZpbmUgQlNEX0FGTlVNX0lORVQ2X0RBUldJTgkzMApkaWZmIC0tZ2l0IGEvYWguaCBiL2FoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMjgwNmEuLjAwMDAwMDAKLS0tIGEvYWguaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCSROZXRCU0Q6IGFoLmgsdiAxLjEyIDIwMDAvMDcvMjMgMDU6MjM6MDQgaXRvanVuIEV4cCAkCSovCi0vKgkkS0FNRTogYWguaCx2IDEuMTIgMjAwMC8wNy8yMCAxNzo0MTowMSBpdG9qdW4gRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyoKLSAqIFJGQzE4MjYvMjQwMiBhdXRoZW50aWNhdGlvbiBoZWFkZXIuCi0gKi8KLQotI2lmbmRlZiBfTkVUSU5FVDZfQUhfSF8KLSNkZWZpbmUgX05FVElORVQ2X0FIX0hfCi0KLXN0cnVjdCBhaCB7Ci0JdV9pbnQ4X3QJYWhfbnh0OwkJLyogTmV4dCBIZWFkZXIgKi8KLQl1X2ludDhfdAlhaF9sZW47CQkvKiBMZW5ndGggb2YgZGF0YSwgaW4gMzJiaXQgKi8KLQl1X2ludDE2X3QJYWhfcmVzZXJ2ZTsJLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLQl1X2ludDMyX3QJYWhfc3BpOwkJLyogU2VjdXJpdHkgcGFyYW1ldGVyIGluZGV4ICovCi0JLyogdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhICovCi19OwotCi1zdHJ1Y3QgbmV3YWggewotCXVfaW50OF90CWFoX254dDsJCS8qIE5leHQgSGVhZGVyICovCi0JdV9pbnQ4X3QJYWhfbGVuOwkJLyogTGVuZ3RoIG9mIGRhdGEgKyAxLCBpbiAzMmJpdCAqLwotCXVfaW50MTZfdAlhaF9yZXNlcnZlOwkvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCXVfaW50MzJfdAlhaF9zcGk7CQkvKiBTZWN1cml0eSBwYXJhbWV0ZXIgaW5kZXggKi8KLQl1X2ludDMyX3QJYWhfc2VxOwkJLyogU2VxdWVuY2UgbnVtYmVyIGZpZWxkICovCi0JLyogdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhICovCi19OwotCi0jZW5kaWYgLypfTkVUSU5FVDZfQUhfSF8qLwpkaWZmIC0tZ2l0IGEvYW9kdi5oIGIvYW9kdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzVjMTc1Li4wMDAwMDAwCi0tLSBhL2FvZHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2FvZHYuaCx2IDEuMyAyMDAzLzA5LzEzIDAxOjM0OjQyIGd1eSBFeHAgJCAoTEJMKSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBCcnVjZSBNLiBTaW1wc29uIDxibXNAc3BjLm9yZz4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEJydWNlIE0uIFNpbXBzb24uCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIEJydWNlIE0uIFNpbXBzb24gbm9yIHRoZSBuYW1lcyBvZiBjby0KLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQnJ1Y2UgTS4gU2ltcHNvbiBBTkQgQ09OVFJJQlVUT1JTCi0gKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQnJ1Y2UgTS4gU2ltcHNvbiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIF9BT0RWX0hfCi0jZGVmaW5lIF9BT0RWX0hfCi0KLXN0cnVjdCBhb2R2X3JyZXEgewotCXVfaW50OF90CXJyZXFfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDEpICovCi0JdV9pbnQ4X3QJcnJlcV9mbGFnczsJLyogdmFyaW91cyBmbGFncyAqLwotCXVfaW50OF90CXJyZXFfemVybzA7CS8qIHJlc2VydmVkLCBzZXQgdG8gemVybyAqLwotCXVfaW50OF90CXJyZXFfaG9wczsJLyogbnVtYmVyIG9mIGhvcHMgZnJvbSBvcmlnaW5hdG9yICovCi0JdV9pbnQzMl90CXJyZXFfaWQ7CS8qIHJlcXVlc3QgSUQgKi8KLQl1X2ludDMyX3QJcnJlcV9kYTsJLyogZGVzdGluYXRpb24gSVB2NCBhZGRyZXNzICovCi0JdV9pbnQzMl90CXJyZXFfZHM7CS8qIGRlc3RpbmF0aW9uIHNlcXVlbmNlIG51bWJlciAqLwotCXVfaW50MzJfdAlycmVxX29hOwkvKiBvcmlnaW5hdG9yIElQdjQgYWRkcmVzcyAqLwotCXVfaW50MzJfdAlycmVxX29zOwkvKiBvcmlnaW5hdG9yIHNlcXVlbmNlIG51bWJlciAqLwotfTsKLSNpZmRlZiBJTkVUNgotc3RydWN0IGFvZHZfcnJlcTYgewotCXVfaW50OF90CXJyZXFfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDEpICovCi0JdV9pbnQ4X3QJcnJlcV9mbGFnczsJLyogdmFyaW91cyBmbGFncyAqLwotCXVfaW50OF90CXJyZXFfemVybzA7CS8qIHJlc2VydmVkLCBzZXQgdG8gemVybyAqLwotCXVfaW50OF90CXJyZXFfaG9wczsJLyogbnVtYmVyIG9mIGhvcHMgZnJvbSBvcmlnaW5hdG9yICovCi0JdV9pbnQzMl90CXJyZXFfaWQ7CS8qIHJlcXVlc3QgSUQgKi8KLQlzdHJ1Y3QgaW42X2FkZHIJcnJlcV9kYTsJLyogZGVzdGluYXRpb24gSVB2NiBhZGRyZXNzICovCi0JdV9pbnQzMl90CXJyZXFfZHM7CS8qIGRlc3RpbmF0aW9uIHNlcXVlbmNlIG51bWJlciAqLwotCXN0cnVjdCBpbjZfYWRkcglycmVxX29hOwkvKiBvcmlnaW5hdG9yIElQdjYgYWRkcmVzcyAqLwotCXVfaW50MzJfdAlycmVxX29zOwkvKiBvcmlnaW5hdG9yIHNlcXVlbmNlIG51bWJlciAqLwotfTsKLXN0cnVjdCBhb2R2X3JyZXE2X2RyYWZ0XzAxIHsKLQl1X2ludDhfdAlycmVxX3R5cGU7CS8qIEFPRFYgbWVzc2FnZSB0eXBlICgxNikgKi8KLQl1X2ludDhfdAlycmVxX2ZsYWdzOwkvKiB2YXJpb3VzIGZsYWdzICovCi0JdV9pbnQ4X3QJcnJlcV96ZXJvMDsJLyogcmVzZXJ2ZWQsIHNldCB0byB6ZXJvICovCi0JdV9pbnQ4X3QJcnJlcV9ob3BzOwkvKiBudW1iZXIgb2YgaG9wcyBmcm9tIG9yaWdpbmF0b3IgKi8KLQl1X2ludDMyX3QJcnJlcV9pZDsJLyogcmVxdWVzdCBJRCAqLwotCXVfaW50MzJfdAlycmVxX2RzOwkvKiBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1X2ludDMyX3QJcnJlcV9vczsJLyogb3JpZ2luYXRvciBzZXF1ZW5jZSBudW1iZXIgKi8KLQlzdHJ1Y3QgaW42X2FkZHIJcnJlcV9kYTsJLyogZGVzdGluYXRpb24gSVB2NiBhZGRyZXNzICovCi0Jc3RydWN0IGluNl9hZGRyCXJyZXFfb2E7CS8qIG9yaWdpbmF0b3IgSVB2NiBhZGRyZXNzICovCi19OwotI2VuZGlmCi0KLSNkZWZpbmUJUlJFUV9KT0lOCTB4ODAJCS8qIGpvaW4gKHJlc2VydmVkIGZvciBtdWx0aWNhc3QgKi8KLSNkZWZpbmUJUlJFUV9SRVBBSVIJMHg0MAkJLyogcmVwYWlyIChyZXNlcnZlZCBmb3IgbXVsdGljYXN0ICovCi0jZGVmaW5lCVJSRVFfR1JBVAkweDIwCQkvKiBncmF0dWl0b3VzIFJSRVAgKi8KLSNkZWZpbmUJUlJFUV9ERVNUCTB4MTAJCS8qIGRlc3RpbmF0aW9uIG9ubHkgKi8KLSNkZWZpbmUJUlJFUV9VTktOT1dOCTB4MDgJCS8qIHVua25vd24gZGVzdGluYXRpb24gc2VxdWVuY2UgbnVtICovCi0jZGVmaW5lCVJSRVFfRkxBR1NfTUFTSwkweEY4CQkvKiBtYXNrIGZvciBycmVxX2ZsYWdzICovCi0KLXN0cnVjdCBhb2R2X3JyZXAgewotCXVfaW50OF90CXJyZXBfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDIpICovCi0JdV9pbnQ4X3QJcnJlcF9mbGFnczsJLyogdmFyaW91cyBmbGFncyAqLwotCXVfaW50OF90CXJyZXBfcHM7CS8qIHByZWZpeCBzaXplICovCi0JdV9pbnQ4X3QJcnJlcF9ob3BzOwkvKiBudW1iZXIgb2YgaG9wcyBmcm9tIG8gdG8gZCAqLwotCXVfaW50MzJfdAlycmVwX2RhOwkvKiBkZXN0aW5hdGlvbiBJUHY0IGFkZHJlc3MgKi8KLQl1X2ludDMyX3QJcnJlcF9kczsJLyogZGVzdGluYXRpb24gc2VxdWVuY2UgbnVtYmVyICovCi0JdV9pbnQzMl90CXJyZXBfb2E7CS8qIG9yaWdpbmF0b3IgSVB2NCBhZGRyZXNzICovCi0JdV9pbnQzMl90CXJyZXBfbGlmZTsJLyogbGlmZXRpbWUgb2YgdGhpcyByb3V0ZSAqLwotfTsKLSNpZmRlZiBJTkVUNgotc3RydWN0IGFvZHZfcnJlcDYgewotCXVfaW50OF90CXJyZXBfdHlwZTsJLyogQU9EViBtZXNzYWdlIHR5cGUgKDIpICovCi0JdV9pbnQ4X3QJcnJlcF9mbGFnczsJLyogdmFyaW91cyBmbGFncyAqLwotCXVfaW50OF90CXJyZXBfcHM7CS8qIHByZWZpeCBzaXplICovCi0JdV9pbnQ4X3QJcnJlcF9ob3BzOwkvKiBudW1iZXIgb2YgaG9wcyBmcm9tIG8gdG8gZCAqLwotCXN0cnVjdCBpbjZfYWRkcglycmVwX2RhOwkvKiBkZXN0aW5hdGlvbiBJUHY2IGFkZHJlc3MgKi8KLQl1X2ludDMyX3QJcnJlcF9kczsJLyogZGVzdGluYXRpb24gc2VxdWVuY2UgbnVtYmVyICovCi0Jc3RydWN0IGluNl9hZGRyCXJyZXBfb2E7CS8qIG9yaWdpbmF0b3IgSVB2NiBhZGRyZXNzICovCi0JdV9pbnQzMl90CXJyZXBfbGlmZTsJLyogbGlmZXRpbWUgb2YgdGhpcyByb3V0ZSAqLwotfTsKLXN0cnVjdCBhb2R2X3JyZXA2X2RyYWZ0XzAxIHsKLQl1X2ludDhfdAlycmVwX3R5cGU7CS8qIEFPRFYgbWVzc2FnZSB0eXBlICgxNykgKi8KLQl1X2ludDhfdAlycmVwX2ZsYWdzOwkvKiB2YXJpb3VzIGZsYWdzICovCi0JdV9pbnQ4X3QJcnJlcF9wczsJLyogcHJlZml4IHNpemUgKi8KLQl1X2ludDhfdAlycmVwX2hvcHM7CS8qIG51bWJlciBvZiBob3BzIGZyb20gbyB0byBkICovCi0JdV9pbnQzMl90CXJyZXBfZHM7CS8qIGRlc3RpbmF0aW9uIHNlcXVlbmNlIG51bWJlciAqLwotCXN0cnVjdCBpbjZfYWRkcglycmVwX2RhOwkvKiBkZXN0aW5hdGlvbiBJUHY2IGFkZHJlc3MgKi8KLQlzdHJ1Y3QgaW42X2FkZHIJcnJlcF9vYTsJLyogb3JpZ2luYXRvciBJUHY2IGFkZHJlc3MgKi8KLQl1X2ludDMyX3QJcnJlcF9saWZlOwkvKiBsaWZldGltZSBvZiB0aGlzIHJvdXRlICovCi19OwotI2VuZGlmCi0KLSNkZWZpbmUJUlJFUF9SRVBBSVIJCTB4ODAJLyogcmVwYWlyIChyZXNlcnZlZCBmb3IgbXVsdGljYXN0ICovCi0jZGVmaW5lCVJSRVBfQUNLCQkweDQwCS8qIGFja25vd2xlZGdlbWVudCByZXF1aXJlZCAqLwotI2RlZmluZQlSUkVQX0ZMQUdTX01BU0sJCTB4QzAJLyogbWFzayBmb3IgcnJlcF9mbGFncyAqLwotI2RlZmluZQlSUkVQX1BSRUZJWF9NQVNLCTB4MUYJLyogbWFzayBmb3IgcHJlZml4IHNpemUgKi8KLQotc3RydWN0IHJlcnJfdW5yZWFjaCB7Ci0JdV9pbnQzMl90CXVfZGE7CS8qIElQdjQgYWRkcmVzcyAqLwotCXVfaW50MzJfdAl1X2RzOwkvKiBzZXF1ZW5jZSBudW1iZXIgKi8KLX07Ci0jaWZkZWYgSU5FVDYKLXN0cnVjdCByZXJyX3VucmVhY2g2IHsKLQlzdHJ1Y3QgaW42X2FkZHIJdV9kYTsJLyogSVB2NiBhZGRyZXNzICovCi0JdV9pbnQzMl90CXVfZHM7CS8qIHNlcXVlbmNlIG51bWJlciAqLwotfTsKLXN0cnVjdCByZXJyX3VucmVhY2g2X2RyYWZ0XzAxIHsKLQlzdHJ1Y3QgaW42X2FkZHIJdV9kYTsJLyogSVB2NiBhZGRyZXNzICovCi0JdV9pbnQzMl90CXVfZHM7CS8qIHNlcXVlbmNlIG51bWJlciAqLwotfTsKLSNlbmRpZgotCi1zdHJ1Y3QgYW9kdl9yZXJyIHsKLQl1X2ludDhfdAlyZXJyX3R5cGU7CS8qIEFPRFYgbWVzc2FnZSB0eXBlICgzIG9yIDE4KSAqLwotCXVfaW50OF90CXJlcnJfZmxhZ3M7CS8qIHZhcmlvdXMgZmxhZ3MgKi8KLQl1X2ludDhfdAlyZXJyX3plcm8wOwkvKiByZXNlcnZlZCwgc2V0IHRvIHplcm8gKi8KLQl1X2ludDhfdAlyZXJyX2RjOwkvKiBkZXN0aW5hdGlvbiBjb3VudCAqLwotCXVuaW9uIHsKLQkJc3RydWN0CXJlcnJfdW5yZWFjaCBkZXN0WzFdOwotI2lmZGVmIElORVQ2Ci0JCXN0cnVjdAlyZXJyX3VucmVhY2g2IGRlc3Q2WzFdOwotCQlzdHJ1Y3QJcmVycl91bnJlYWNoNl9kcmFmdF8wMSBkZXN0Nl9kcmFmdF8wMVsxXTsKLSNlbmRpZgotCX0gcjsKLX07Ci0KLSNkZWZpbmUgUkVSUl9OT0RFTEVURQkJMHg4MAkvKiBkb24ndCBkZWxldGUgdGhlIGxpbmsgKi8KLSNkZWZpbmUgUkVSUl9GTEFHU19NQVNLCQkweDgwCS8qIG1hc2sgZm9yIHJlcnJfZmxhZ3MgKi8KLQotc3RydWN0IGFvZHZfcnJlcF9hY2sgewotCXVfaW50OF90CXJhX3R5cGU7Ci0JdV9pbnQ4X3QJcmFfemVybzA7Ci19OwotCi11bmlvbiBhb2R2IHsKLQlzdHJ1Y3QgYW9kdl9ycmVxIHJyZXE7Ci0Jc3RydWN0IGFvZHZfcnJlcCBycmVwOwotCXN0cnVjdCBhb2R2X3JlcnIgcmVycjsKLQlzdHJ1Y3QgYW9kdl9ycmVwX2FjayBycmVwX2FjazsKLSNpZmRlZiBJTkVUNgotCXN0cnVjdCBhb2R2X3JyZXE2IHJyZXE2OwotCXN0cnVjdCBhb2R2X3JyZXE2X2RyYWZ0XzAxIHJyZXE2X2RyYWZ0XzAxOwotCXN0cnVjdCBhb2R2X3JyZXA2IHJyZXA2OwotCXN0cnVjdCBhb2R2X3JyZXA2X2RyYWZ0XzAxIHJyZXA2X2RyYWZ0XzAxOwotI2VuZGlmCi19OwotCi0jZGVmaW5lCUFPRFZfUlJFUQkJMQkvKiByb3V0ZSByZXF1ZXN0ICovCi0jZGVmaW5lCUFPRFZfUlJFUAkJMgkvKiByb3V0ZSByZXNwb25zZSAqLwotI2RlZmluZQlBT0RWX1JFUlIJCTMJLyogZXJyb3IgcmVwb3J0ICovCi0jZGVmaW5lCUFPRFZfUlJFUF9BQ0sJCTQJLyogcm91dGUgcmVzcG9uc2UgYWNrbm93bGVkZ2VtZW50ICovCi0KLSNkZWZpbmUgQU9EVl9WNl9EUkFGVF8wMV9SUkVRCQkxNgkvKiBJUHY2IHJvdXRlIHJlcXVlc3QgKi8KLSNkZWZpbmUgQU9EVl9WNl9EUkFGVF8wMV9SUkVQCQkxNwkvKiBJUHY2IHJvdXRlIHJlc3BvbnNlICovCi0jZGVmaW5lIEFPRFZfVjZfRFJBRlRfMDFfUkVSUgkJMTgJLyogSVB2NiBlcnJvciByZXBvcnQgKi8KLSNkZWZpbmUgQU9EVl9WNl9EUkFGVF8wMV9SUkVQX0FDSwkxOQkvKiBJUFY2IHJvdXRlIHJlc3BvbnNlIGFja25vd2xlZGdtZW50ICovCi0KLXN0cnVjdCBhb2R2X2V4dCB7Ci0JdV9pbnQ4X3QJdHlwZTsJCS8qIGV4dGVuc2lvbiB0eXBlICovCi0JdV9pbnQ4X3QJbGVuZ3RoOwkJLyogZXh0ZW5zaW9uIGxlbmd0aCAqLwotfTsKLQotc3RydWN0IGFvZHZfaGVsbG8gewotCXN0cnVjdAlhb2R2X2V4dAllaDsJCS8qIGV4dGVuc2lvbiBoZWFkZXIgKi8KLQl1X2ludDMyX3QJCWludGVydmFsOwkvKiBleHBlY3QgbXkgbmV4dCBoZWxsbyBpbgotCQkJCQkJICogKG4pIG1zICovCi19OwotCi0jZGVmaW5lCUFPRFZfRVhUX0hFTExPCTEKLQotI2VuZGlmIC8qIF9BT0RWX0hfICovCmRpZmYgLS1naXQgYS9hcHBsZXRhbGsuaCBiL2FwcGxldGFsay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2U2MmVmLi4wMDAwMDAwCi0tLSBhL2FwcGxldGFsay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBBcHBsZVRhbGsgcHJvdG9jb2wgZm9ybWF0cyAoY291cnRlc3kgQmlsbCBDcm9mdCBvZiBTdGFuZm9yZC9TVU1FWCkuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9hcHBsZXRhbGsuaCx2IDEuMTYgMjAwNC8wNS8wMSAwOTo0MTo1MCBoYW5uZXMgRXhwICQgKExCTCkKLSAqLwotCi1zdHJ1Y3QgTEFQIHsKLQl1X2ludDhfdAlkc3Q7Ci0JdV9pbnQ4X3QJc3JjOwotCXVfaW50OF90CXR5cGU7Ci19OwotI2RlZmluZSBsYXBTaG9ydEREUAkxCS8qIHNob3J0IEREUCB0eXBlICovCi0jZGVmaW5lIGxhcEREUAkJMgkvKiBERFAgdHlwZSAqLwotI2RlZmluZSBsYXBLTEFQCQknSycJLyogS2luZXRpY3MgS0xBUCB0eXBlICovCi0KLS8qIERhdGFncmFtIERlbGl2ZXJ5IFByb3RvY29sICovCi0KLXN0cnVjdCBhdEREUCB7Ci0JdV9pbnQxNl90CWxlbmd0aDsKLQl1X2ludDE2X3QJY2hlY2tzdW07Ci0JdV9pbnQxNl90CWRzdE5ldDsKLQl1X2ludDE2X3QJc3JjTmV0OwotCXVfaW50OF90CWRzdE5vZGU7Ci0JdV9pbnQ4X3QJc3JjTm9kZTsKLQl1X2ludDhfdAlkc3RTa3Q7Ci0JdV9pbnQ4X3QJc3JjU2t0OwotCXVfaW50OF90CXR5cGU7Ci19OwotCi1zdHJ1Y3QgYXRTaG9ydEREUCB7Ci0JdV9pbnQxNl90CWxlbmd0aDsKLQl1X2ludDhfdAlkc3RTa3Q7Ci0JdV9pbnQ4X3QJc3JjU2t0OwotCXVfaW50OF90CXR5cGU7Ci19OwotCi0jZGVmaW5lCWRkcE1heFdLUwkweDdGCi0jZGVmaW5lCWRkcE1heERhdGEJNTg2Ci0jZGVmaW5lCWRkcExlbmd0aE1hc2sJMHgzRkYKLSNkZWZpbmUJZGRwSG9wU2hpZnQJMTAKLSNkZWZpbmUJZGRwU2l6ZQkJMTMJLyogc2l6ZSBvZiBERFAgaGVhZGVyIChhdm9pZCBzdHJ1Y3QgcGFkZGluZykgKi8KLSNkZWZpbmUJZGRwU1NpemUJNQotI2RlZmluZQlkZHBXS1MJCTEyOAkvKiBib3VuZGFyeSBvZiBERFAgd2VsbCBrbm93biBzb2NrZXRzICovCi0jZGVmaW5lCWRkcFJUTVAJCTEJLyogUlRNUCB0eXBlICovCi0jZGVmaW5lCWRkcFJUTVByZXF1ZXN0CTUJLyogUlRNUCByZXF1ZXN0IHR5cGUgKi8KLSNkZWZpbmUJZGRwTkJQCQkyCS8qIE5CUCB0eXBlICovCi0jZGVmaW5lCWRkcEFUUAkJMwkvKiBBVFAgdHlwZSAqLwotI2RlZmluZQlkZHBFQ0hPCQk0CS8qIEVDSE8gdHlwZSAqLwotI2RlZmluZQlkZHBJUAkJMjIJLyogSVAgdHlwZSAqLwotI2RlZmluZQlkZHBBUlAJCTIzCS8qIEFSUCB0eXBlICovCi0jZGVmaW5lIGRkcEVJR1JQICAgICAgICA4OCAgICAgIC8qIEVJR1JQIG92ZXIgQXBwbGV0YWxrICovCi0jZGVmaW5lCWRkcEtMQVAJCTB4NGIJLyogS2luZXRpY3MgS0xBUCB0eXBlICovCi0KLQotLyogQXBwbGVUYWxrIFRyYW5zYWN0aW9uIFByb3RvY29sICovCi0KLXN0cnVjdCBhdEFUUCB7Ci0JdV9pbnQ4X3QJY29udHJvbDsKLQl1X2ludDhfdAliaXRtYXA7Ci0JdV9pbnQxNl90CXRyYW5zSUQ7Ci0JaW50MzJfdCB1c2VyRGF0YTsKLX07Ci0KLSNkZWZpbmUJYXRwUmVxQ29kZQkweDQwCi0jZGVmaW5lCWF0cFJzcENvZGUJMHg4MAotI2RlZmluZQlhdHBSZWxDb2RlCTB4QzAKLSNkZWZpbmUJYXRwWE8JCTB4MjAKLSNkZWZpbmUJYXRwRU9NCQkweDEwCi0jZGVmaW5lCWF0cFNUUwkJMHgwOAotI2RlZmluZQlhdHBGbGFnTWFzawkweDNGCi0jZGVmaW5lCWF0cENvbnRyb2xNYXNrCTB4RjgKLSNkZWZpbmUJYXRwTWF4TnVtCTgKLSNkZWZpbmUJYXRwTWF4RGF0YQk1NzgKLQotCi0vKiBBcHBsZVRhbGsgRWNobyBQcm90b2NvbCAqLwotCi1zdHJ1Y3QgYXRFY2hvIHsKLQl1X2ludDhfdAllY2hvRnVuY3Rpb247Ci0JdV9pbnQ4X3QJKmVjaG9EYXRhOwotfTsKLQotI2RlZmluZSBlY2hvU2t0CQk0CQkvKiB0aGUgZWNob2VyIHNvY2tldCAqLwotI2RlZmluZSBlY2hvU2l6ZQkxCQkvKiBzaXplIG9mIGVjaG8gaGVhZGVyICovCi0jZGVmaW5lIGVjaG9SZXF1ZXN0CTEJCS8qIGVjaG8gcmVxdWVzdCAqLwotI2RlZmluZSBlY2hvUmVwbHkJMgkJLyogZWNobyByZXF1ZXN0ICovCi0KLQotLyogTmFtZSBCaW5kaW5nIFByb3RvY29sICovCi0KLXN0cnVjdCBhdE5CUCB7Ci0JdV9pbnQ4X3QJY29udHJvbDsKLQl1X2ludDhfdAlpZDsKLX07Ci0KLXN0cnVjdCBhdE5CUHR1cGxlIHsKLQl1X2ludDE2X3QJbmV0OwotCXVfaW50OF90CW5vZGU7Ci0JdV9pbnQ4X3QJc2t0OwotCXVfaW50OF90CWVudW1lcmF0b3I7Ci19OwotCi0jZGVmaW5lCW5icEJyUnEJCTB4MTAKLSNkZWZpbmUJbmJwTGtVcAkJMHgyMAotI2RlZmluZQluYnBMa1VwUmVwbHkJMHgzMAotCi0jZGVmaW5lCW5icE5JUwkJMgotI2RlZmluZQluYnBUdXBsZU1heAkxNQotCi0jZGVmaW5lCW5icEhlYWRlclNpemUJMgotI2RlZmluZSBuYnBUdXBsZVNpemUJNQotCi0jZGVmaW5lIG5icFNrdAkJMgkJLyogTklTICovCi0KLQotLyogUm91dGluZyBUYWJsZSBNYWludC4gUHJvdG9jb2wgKi8KLQotI2RlZmluZQlydG1wU2t0CQkxCS8qIG51bWJlciBvZiBSVE1QIHNvY2tldCAqLwotI2RlZmluZQlydG1wU2l6ZQk0CS8qIG1pbmltdW0gc2l6ZSAqLwotI2RlZmluZQlydG1wVHVwbGVTaXplCTMKLQotCi0vKiBab25lIEluZm9ybWF0aW9uIFByb3RvY29sICovCi0KLXN0cnVjdCB6aXBIZWFkZXIgewotCXVfaW50OF90CWNvbW1hbmQ7Ci0JdV9pbnQ4X3QJbmV0Y291bnQ7Ci19OwotCi0jZGVmaW5lCXppcEhlYWRlclNpemUJMgotI2RlZmluZQl6aXBRdWVyeQkxCi0jZGVmaW5lCXppcFJlcGx5CTIKLSNkZWZpbmUJemlwVGFrZWRvd24JMwotI2RlZmluZQl6aXBCcmluZ3VwCTQKLSNkZWZpbmUJZGRwWklQCQk2Ci0jZGVmaW5lCXppcFNrdAkJNgotI2RlZmluZQlHZXRNeVpvbmUJNwotI2RlZmluZQlHZXRab25lTGlzdAk4Ci0KLS8qCi0gKiBVRFAgcG9ydCByYW5nZSB1c2VkIGZvciBkZHAtaW4tdWRwIGVuY2Fwc3VsYXRpb24gaXMgMTY1MTItMTY2MzkKLSAqIGZvciBjbGllbnQgc29ja2V0cyAoMTI4LTI1NSkgYW5kIDIwMC0zMjcgZm9yIHNlcnZlciBzb2NrZXRzCi0gKiAoMC0xMjcpLiAgV2UgYWxzbyB0cnkgdG8gcmVjb2duaXplIHRoZSBwcmUtQXByaWwgODggc2VydmVyCi0gKiBzb2NrZXQgcmFuZ2Ugb2YgNzY4LTg5NS4KLSAqLwotI2RlZmluZSBhdGFsa19wb3J0KHApIFwKLQkoKCh1bnNpZ25lZCkoKHApIC0gMTY1MTIpIDwgMTI4KSB8fCBcCi0JICgodW5zaWduZWQpKChwKSAtIDIwMCkgPCAxMjgpIHx8IFwKLQkgKCh1bnNpZ25lZCkoKHApIC0gNzY4KSA8IDEyOCkpCmRpZmYgLS1naXQgYS9hcmNuZXQuaCBiL2FyY25ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY0OWY2Li4wMDAwMDAwCi0tLSBhL2FyY25ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogQCgjKSAkSWQ6IGFyY25ldC5oLHYgMS4zIDIwMDMvMDEvMjMgMDk6MDU6MzcgZ3V5IEV4cCAkIChMQkwpCi0gKgotICogZnJvbTogTmV0QlNEOiBpZl9hcmMuaCx2IDEuMTMgMTk5OS8xMS8xOSAyMDo0MToxOSB0aG9ycGVqIEV4cAotICovCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYSAyLjVNQi9zIEFyY25ldCBoZWFkZXIgb24gdGhlIEJTRHMsCi0gKiBhcyBnaXZlbiB0byBpbnRlcmZhY2UgY29kZS4KLSAqLwotc3RydWN0CWFyY19oZWFkZXIgewotCXVfaW50OF90ICBhcmNfc2hvc3Q7Ci0JdV9pbnQ4X3QgIGFyY19kaG9zdDsKLQl1X2ludDhfdCAgYXJjX3R5cGU7Ci0JLyoKLQkgKiBvbmx5IHByZXNlbnQgZm9yIG5ld3N0eWxlIGVuY29kaW5nIHdpdGggTEwgZnJhZ21lbnRhdGlvbi4KLQkgKiBEb24ndCB1c2Ugc2l6ZW9mKGFueXRoaW5nKSwgdXNlIEFSQ19IRFJ7LE5FV31MRU4gaW5zdGVhZC4KLQkgKi8KLQl1X2ludDhfdCAgYXJjX2ZsYWc7Ci0JdV9pbnQxNl90IGFyY19zZXFpZDsKLQotCS8qCi0JICogb25seSBwcmVzZW50IGluIGV4Y2VwdGlvbiBwYWNrZXRzIChhcmNfZmxhZyA9PSAweGZmKQotCSAqLwotCXVfaW50OF90ICBhcmNfdHlwZTI7CS8qIHNhbWUgYXMgYXJjX3R5cGUgKi8KLQl1X2ludDhfdCAgYXJjX2ZsYWcyOwkvKiByZWFsIGZsYWcgdmFsdWUgKi8KLQl1X2ludDE2X3QgYXJjX3NlcWlkMjsJLyogcmVhbCBzZXFpZCB2YWx1ZSAqLwotfTsKLQotI2RlZmluZQlBUkNfSERSTEVOCQkzCi0jZGVmaW5lCUFSQ19IRFJORVdMRU4JCTYKLSNkZWZpbmUJQVJDX0hEUk5FV0xFTl9FWEMJMTAKLQotLyogUkZDIDEwNTEgKi8KLSNkZWZpbmUJQVJDVFlQRV9JUF9PTEQJCTI0MAkvKiBJUCBwcm90b2NvbCAqLwotI2RlZmluZQlBUkNUWVBFX0FSUF9PTEQJCTI0MQkvKiBhZGRyZXNzIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KLQotLyogUkZDIDEyMDEgKi8KLSNkZWZpbmUJQVJDVFlQRV9JUAkJMjEyCS8qIElQIHByb3RvY29sICovCi0jZGVmaW5lCUFSQ1RZUEVfQVJQCQkyMTMJLyogYWRkcmVzcyByZXNvbHV0aW9uIHByb3RvY29sICovCi0jZGVmaW5lCUFSQ1RZUEVfUkVWQVJQCQkyMTQJLyogcmV2ZXJzZSBhZGRyIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KLQotI2RlZmluZQlBUkNUWVBFX0FUQUxLCQkyMjEJLyogQXBwbGV0YWxrICovCi0jZGVmaW5lCUFSQ1RZUEVfQkFOSUFOCQkyNDcJLyogQmFueWFuIFZpbmVzICovCi0jZGVmaW5lCUFSQ1RZUEVfSVBYCQkyNTAJLyogTm92ZWxsIElQWCAqLwotCi0jZGVmaW5lIEFSQ1RZUEVfSU5FVDYJCTB4YzQJLyogSVBuZyAqLwotI2RlZmluZSBBUkNUWVBFX0RJQUdOT1NFCTB4ODAJLyogYXMgcGVyIEFOU0kvQVRBIDg3OC4xICovCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYSAyLjVNQi9zIEFyY25ldCBoZWFkZXIgb24gTGludXguICBMaW51eCBoYXMKLSAqIGFuIGV4dHJhICJvZmZzZXQiIGZpZWxkIHdoZW4gZ2l2ZW4gdG8gaW50ZXJmYWNlIGNvZGUsIGFuZAotICogbmV2ZXIgcHJlc2VudHMgcGFja2V0cyB0aGF0IGxvb2sgbGlrZSBleGNlcHRpb24gZnJhbWVzLgotICovCi1zdHJ1Y3QJYXJjX2xpbnV4X2hlYWRlciB7Ci0JdV9pbnQ4X3QgIGFyY19zaG9zdDsKLQl1X2ludDhfdCAgYXJjX2Rob3N0OwotCXVfaW50MTZfdCBhcmNfb2Zmc2V0OwotCXVfaW50OF90ICBhcmNfdHlwZTsKLQkvKgotCSAqIG9ubHkgcHJlc2VudCBmb3IgbmV3c3R5bGUgZW5jb2Rpbmcgd2l0aCBMTCBmcmFnbWVudGF0aW9uLgotCSAqIERvbid0IHVzZSBzaXplb2YoYW55dGhpbmcpLCB1c2UgQVJDX0xJTlVYX0hEUnssTkVXfUxFTgotCSAqIGluc3RlYWQuCi0JICovCi0JdV9pbnQ4X3QgIGFyY19mbGFnOwotCXVfaW50MTZfdCBhcmNfc2VxaWQ7Ci19OwotCi0jZGVmaW5lCUFSQ19MSU5VWF9IRFJMRU4JNQotI2RlZmluZQlBUkNfTElOVVhfSERSTkVXTEVOCTgKZGlmZiAtLWdpdCBhL2F0aW1lLmF3ayBiL2F0aW1lLmF3awpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQyZGVjMi4uMDAwMDAwMAotLS0gYS9hdGltZS5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0kNiB+IC9eYWNrLyAmJiAkNSAhfiAvW1NGUl0vIAl7Ci0JIyBnaXZlbiBhIHRjcGR1bXAgZnRwIHRyYWNlLCBvdXRwdXQgb25lIGxpbmUgZm9yIGVhY2ggYWNrCi0JIyBpbiB0aGUgZm9ybQotCSMgICA8YWNrIHRpbWU+IDxzZXEgbm8+Ci0JIyB3aGVyZSA8YWNrIHRpbWU+IGlzIHRoZSB0aW1lIHBhY2tldCB3YXMgYWNrZWQgKGluIHNlY29uZHMgd2l0aAotCSMgemVybyBhdCB0aW1lIG9mIGZpcnN0IHBhY2tldCkgYW5kIDxzZXEgbm8+IGlzIHRoZSB0Y3Agc2VxdWVuY2UKLQkjIG51bWJlciBvZiB0aGUgYWNrIGRpdmlkZWQgYnkgMTAyNCAoaS5lLiwgS2J5dGVzIGFja2VkKS4KLQkjCi0JIyBjb252ZXJ0IHRpbWUgdG8gc2Vjb25kcwotCW4gPSBzcGxpdCAoJDEsdCwiOiIpCi0JdGltID0gdFsxXSozNjAwICsgdFsyXSo2MCArIHRbM10KLQlpZiAoISB0emVybykgewotCQl0emVybyA9IHRpbQotCQlPRlMgPSAiXHQiCi0JfQotCSMgZ2V0IHBhY2tldCBzZXF1ZW5jZSBudW1iZXIKLQlwcmludGYgIiU3LjJmXHQlZ1xuIiwgdGltLXR6ZXJvLCAkNy8xMDI0Ci0JfQpkaWZmIC0tZ2l0IGEvYXRtLmggYi9hdG0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhYzUzZS4uMDAwMDAwMAotLS0gYS9hdG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgR3V5IEhhcnJpcy4KLSAqICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVGhlIG5hbWUgb2YgR3V5IEhhcnJpcyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYXRtLmgsdiAxLjEuNC4xIDIwMDUvMDYvMjAgMDc6NDU6MDUgaGFubmVzIEV4cCAkCi0gKi8KLQotLyoKLSAqIFRyYWZmaWMgdHlwZXMgZm9yIEFUTS4KLSAqLwotI2RlZmluZSBBVE1fVU5LTk9XTgkwCS8qIFVua25vd24gKi8KLSNkZWZpbmUgQVRNX0xBTkUJMQkvKiBMQU5FICovCi0jZGVmaW5lIEFUTV9MTEMJCTIJLyogTExDIGVuY2Fwc3VsYXRpb24gKi8KLQotLyoKLSAqIHNvbWUgT0FNIGNlbGwgY2FwdHVyZXMgKG1vc3Qgbm90YWJseSBKdW5pcGVyJ3MpCi0gKiBkbyBub3QgZGVsaXZlciBhIGhlYWRpbmcgSEVDIGJ5dGUKLSAqLwotI2RlZmluZSBBVE1fT0FNX05PSEVDICAgMAotI2RlZmluZSBBVE1fT0FNX0hFQyAgICAgMQpkaWZmIC0tZ2l0IGEvYXRtdW5pMzEuaCBiL2F0bXVuaTMxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDg1OWEuLjAwMDAwMDAKLS0tIGEvYXRtdW5pMzEuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcgWWVuIFllbiBMaW0gYW5kIE5vcnRoIERha290YSBTdGF0ZSBVbml2ZXJzaXR5Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgWWVuIFllbiBMaW0gYW5kCi0gICAgICAgIE5vcnRoIERha290YSBTdGF0ZSBVbml2ZXJzaXR5Ci0gKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCi0gKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYXRtdW5pMzEuaCx2IDEuMiAyMDAyLzA4LzA1IDA3OjQ3OjIzIGd1eSBFeHAgJCAoTEJMKQotICovCi0KLS8qIEJhc2VkIG9uIFVOSTMuMSBzdGFuZGFyZCBieSBBVE0gRm9ydW0gKi8KLQotLyogQVRNIHRyYWZmaWMgdHlwZXMgYmFzZWQgb24gVlBJPTAgYW5kICh0aGUgZm9sbG93aW5nIFZDSSAqLwotI2RlZmluZSBQUEMJCQkweDA1CS8qIFBvaW50LXRvLXBvaW50IHNpZ25hbCBtc2cgKi8KLSNkZWZpbmUgQkNDCQkJMHgwMgkvKiBCcm9hZGNhc3Qgc2lnbmFsIG1zZyAqLwotI2RlZmluZSBPQU1GNFNDCQkJMHgwMwkvKiBTZWdtZW50IE9BTSBGNCBmbG93IGNlbGwgKi8KLSNkZWZpbmUgT0FNRjRFQwkJCTB4MDQJLyogRW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsICovCi0jZGVmaW5lIE1FVEFDCQkJMHgwMQkvKiBNZXRhIHNpZ25hbCBtc2cgKi8KLSNkZWZpbmUgSUxNSUMJCQkweDEwCS8qIElMTUkgbXNnICovCi0KLS8qIFEuMjkzMSBzaWduYWxsaW5nIG1lc3NhZ2VzICovCi0jZGVmaW5lIENBTExfUFJPQ0VFRAkJMHgwMgkvKiBjYWxsIHByb2NlZWRpbmcgKi8KLSNkZWZpbmUgQ09OTkVDVAkJCTB4MDcJLyogY29ubmVjdCAqLwotI2RlZmluZSBDT05ORUNUX0FDSwkJMHgwZgkvKiBjb25uZWN0X2FjayAqLwotI2RlZmluZSBTRVRVUAkJCTB4MDUJLyogc2V0dXAgKi8KLSNkZWZpbmUgUkVMRUFTRQkJCTB4NGQJLyogcmVsZWFzZSAqLwotI2RlZmluZSBSRUxFQVNFX0RPTkUJCTB4NWEJLyogcmVsZWFzZV9kb25lICovCi0jZGVmaW5lIFJFU1RBUlQJCQkweDQ2CS8qIHJlc3RhcnQgKi8KLSNkZWZpbmUgUkVTVEFSVF9BQ0sJCTB4NGUJLyogcmVzdGFydCBhY2sgKi8KLSNkZWZpbmUgU1RBVFVTCQkJMHg3ZAkvKiBzdGF0dXMgKi8KLSNkZWZpbmUgU1RBVFVTX0VOUQkJMHg3NQkvKiBzdGF0dXMgYWNrICovCi0jZGVmaW5lIEFERF9QQVJUWQkJMHg4MAkvKiBhZGQgcGFydHkgKi8KLSNkZWZpbmUgQUREX1BBUlRZX0FDSwkJMHg4MQkvKiBhZGQgcGFydHkgYWNrICovCi0jZGVmaW5lIEFERF9QQVJUWV9SRUoJCTB4ODIJLyogYWRkIHBhcnR5IHJlaiAqLwotI2RlZmluZSBEUk9QX1BBUlRZCQkweDgzCS8qIGRyb3AgcGFydHkgKi8KLSNkZWZpbmUgRFJPUF9QQVJUWV9BQ0sJCTB4ODQJLyogZHJvcCBwYXJ0eSBhY2sgKi8KLQotLyogSW5mb3JtYXRpb24gRWxlbWVudCBQYXJhbWV0ZXJzIGluIHRoZSBzaWduYWxsaW5nIG1lc3NhZ2VzICovCi0jZGVmaW5lIENBVVNFCQkJMHgwOAkvKiBjYXVzZSAqLwotI2RlZmluZSBFTkRQVF9SRUYJCTB4NTQJLyogZW5kcG9pbnQgcmVmZXJlbmNlICovCi0jZGVmaW5lIEFBTF9QQVJBCQkweDU4CS8qIEFUTSBhZGFwdGF0aW9uIGxheWVyIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgVFJBRkZfREVTQ1JJUAkJMHg1OQkvKiBhdG0gdHJhZmZpYyBkZXNjcmlwdG9ycyAqLwotI2RlZmluZSBDT05ORUNUX0lECQkweDVhCS8qIGNvbm5lY3Rpb24gaWRlbnRpZmllciAqLwotI2RlZmluZSBRT1NfUEFSQQkJMHg1YwkvKiBxdWFsaXR5IG9mIHNlcnZpY2UgcGFyYW1ldGVycyAqLwotI2RlZmluZSBCX0hJR0hFUgkJMHg1ZAkvKiBicm9hZGJhbmQgaGlnaGVyIGxheWVyIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIEJfQkVBUkVSCQkweDVlCS8qIGJyb2FkYmFuZCBiZWFyZXIgY2FwYWJpbGl0eSAqLwotI2RlZmluZSBCX0xPV0VSCQkJMHg1ZgkvKiBicm9hZGJhbmQgbG93ZXIgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgQ0FMTElOR19QQVJUWQkJMHg2YwkvKiBjYWxsaW5nIHBhcnR5IG51bWJlciAqLwotI2RlZmluZSBDQUxMRURfUEFSVFkJCTB4NzAJLyogY2FsbGVkIHBhcnR5IG5tYmVyICovCi0KLSNkZWZpbmUgUTI5MzEJCQkweDA5Ci0KLS8qIFEuMjkzMSBzaWduYWxsaW5nIGdlbmVyYWwgbWVzc2FnZXMgZm9ybWF0ICovCi0jZGVmaW5lIFBST1RPX1BPUyAgICAgICAwCS8qIG9mZnNldCBvZiBwcm90b2NvbCBkaXNjcmltaW5hdG9yICovCi0jZGVmaW5lIENBTExfUkVGX1BPUyAgICAyCS8qIG9mZnNldCBvZiBjYWxsIHJlZmVyZW5jZSB2YWx1ZSAqLwotI2RlZmluZSBNU0dfVFlQRV9QT1MgICAgNQkvKiBvZmZzZXQgb2YgbWVzc2FnZSB0eXBlICovCi0jZGVmaW5lIE1TR19MRU5fUE9TICAgICA3CS8qIG9mZnNldCBvZiBtZXNhZ2UgbGVuZ3RoICovCi0jZGVmaW5lIElFX0JFR0lOX1BPUyAgICA5CS8qIG9mZnNldCBvZiBmaXJzdCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCi0KLS8qIGZvcm1hdCBvZiBzaWduYWxsaW5nIG1lc3NhZ2VzICovCi0jZGVmaW5lIFRZUEVfUE9TCTAKLSNkZWZpbmUgTEVOX1BPUwkJMgotI2RlZmluZSBGSUVMRF9CRUdJTl9QT1MgNApkaWZmIC0tZ2l0IGEvYmdwLmggYi9iZ3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDZiZTNlYS4uMDAwMDAwMAotLS0gYS9iZ3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvYmdwLmgsdiAxLjMgMjAwNC8wNi8xNiAwODo0NToxNSBoYW5uZXMgRXhwICQgKExCTCkgKi8KLS8qIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCi0gKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKLSAqLwotCi1leHRlcm4gY2hhciAqYmdwX3Zwbl9yZF9wcmludCAoY29uc3QgdV9jaGFyICopOwpkaWZmIC0tZ2l0IGEvYm9vdHAuaCBiL2Jvb3RwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjNkMGMuLjAwMDAwMDAKLS0tIGEvYm9vdHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2Jvb3RwLmgsdiAxLjE1LjQuMyAyMDA3LzA4LzIxIDIyOjAyOjA4IGd1eSBFeHAgJCAoTEJMKSAqLwotLyoKLSAqIEJvb3RzdHJhcCBQcm90b2NvbCAoQk9PVFApLiAgUkZDOTUxIGFuZCBSRkMxMDQ4LgotICoKLSAqIFRoaXMgZmlsZSBzcGVjaWZpZXMgdGhlICJpbXBsZW1lbnRhdGlvbi1pbmRlcGVuZGVudCIgQk9PVFAgcHJvdG9jb2wKLSAqIGluZm9ybWF0aW9uIHdoaWNoIGlzIGNvbW1vbiB0byBib3RoIGNsaWVudCBhbmQgc2VydmVyLgotICoKLSAqIENvcHlyaWdodCAxOTg4IGJ5IENhcm5lZ2llIE1lbGxvbi4KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHByb2dyYW0gZm9yIGFueQotICogcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQKLSAqIGFuZCBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgb24gYWxsIGNvcGllcyBhbmQgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLAotICogdGhlIG5hbWUgb2YgQ2FybmVnaWUgTWVsbG9uIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQotICogcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHByb2dyYW0gd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogcGVybWlzc2lvbiwgYW5kIG5vdGljZSBiZSBnaXZlbiBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gdGhhdCBjb3B5aW5nCi0gKiBhbmQgZGlzdHJpYnV0aW9uIGlzIGJ5IHBlcm1pc3Npb24gb2YgQ2FybmVnaWUgTWVsbG9uIGFuZCBTdGFuZm9yZAotICogVW5pdmVyc2l0eS4gIENhcm5lZ2llIE1lbGxvbiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCi0gKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotICovCi0KLQotc3RydWN0IGJvb3RwIHsKLQl1X2ludDhfdAlicF9vcDsJCS8qIHBhY2tldCBvcGNvZGUgdHlwZSAqLwotCXVfaW50OF90CWJwX2h0eXBlOwkvKiBoYXJkd2FyZSBhZGRyIHR5cGUgKi8KLQl1X2ludDhfdAlicF9obGVuOwkvKiBoYXJkd2FyZSBhZGRyIGxlbmd0aCAqLwotCXVfaW50OF90CWJwX2hvcHM7CS8qIGdhdGV3YXkgaG9wcyAqLwotCXVfaW50MzJfdAlicF94aWQ7CQkvKiB0cmFuc2FjdGlvbiBJRCAqLwotCXVfaW50MTZfdAlicF9zZWNzOwkvKiBzZWNvbmRzIHNpbmNlIGJvb3QgYmVnYW4gKi8KLQl1X2ludDE2X3QJYnBfZmxhZ3M7CS8qIGZsYWdzIC0gc2VlIGJvb3RwX2ZsYWdfdmFsdWVzW10gaW4gcHJpbnQtYm9vdHAuYyAqLwotCXN0cnVjdCBpbl9hZGRyCWJwX2NpYWRkcjsJLyogY2xpZW50IElQIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgaW5fYWRkcglicF95aWFkZHI7CS8qICd5b3VyJyBJUCBhZGRyZXNzICovCi0Jc3RydWN0IGluX2FkZHIJYnBfc2lhZGRyOwkvKiBzZXJ2ZXIgSVAgYWRkcmVzcyAqLwotCXN0cnVjdCBpbl9hZGRyCWJwX2dpYWRkcjsJLyogZ2F0ZXdheSBJUCBhZGRyZXNzICovCi0JdV9pbnQ4X3QJYnBfY2hhZGRyWzE2XTsJLyogY2xpZW50IGhhcmR3YXJlIGFkZHJlc3MgKi8KLQl1X2ludDhfdAlicF9zbmFtZVs2NF07CS8qIHNlcnZlciBob3N0IG5hbWUgKi8KLQl1X2ludDhfdAlicF9maWxlWzEyOF07CS8qIGJvb3QgZmlsZSBuYW1lICovCi0JdV9pbnQ4X3QJYnBfdmVuZFs2NF07CS8qIHZlbmRvci1zcGVjaWZpYyBhcmVhICovCi19OwotCi0vKgotICogVURQIHBvcnQgbnVtYmVycywgc2VydmVyIGFuZCBjbGllbnQuCi0gKi8KLSNkZWZpbmUJSVBQT1JUX0JPT1RQUwkJNjcKLSNkZWZpbmUJSVBQT1JUX0JPT1RQQwkJNjgKLQotI2RlZmluZSBCT09UUFJFUExZCQkyCi0jZGVmaW5lIEJPT1RQUkVRVUVTVAkJMQotCi0vKgotICogVmVuZG9yIG1hZ2ljIGNvb2tpZSAodl9tYWdpYykgZm9yIENNVQotICovCi0jZGVmaW5lIFZNX0NNVQkJIkNNVSIKLQotLyoKLSAqIFZlbmRvciBtYWdpYyBjb29raWUgKHZfbWFnaWMpIGZvciBSRkMxMDQ4Ci0gKi8KLSNkZWZpbmUgVk1fUkZDMTA0OAl7IDk5LCAxMzAsIDgzLCA5OSB9Ci0KLQwKLQotLyoKLSAqIFJGQzEwNDggdGFnIHZhbHVlcyB1c2VkIHRvIHNwZWNpZnkgd2hhdCBpbmZvcm1hdGlvbiBpcyBiZWluZyBzdXBwbGllZCBpbgotICogdGhlIHZlbmRvciBmaWVsZCBvZiB0aGUgcGFja2V0LgotICovCi0KLSNkZWZpbmUgVEFHX1BBRAkJCSgodV9pbnQ4X3QpICAgMCkKLSNkZWZpbmUgVEFHX1NVQk5FVF9NQVNLCQkoKHVfaW50OF90KSAgIDEpCi0jZGVmaW5lIFRBR19USU1FX09GRlNFVAkJKCh1X2ludDhfdCkgICAyKQotI2RlZmluZSBUQUdfR0FURVdBWQkJKCh1X2ludDhfdCkgICAzKQotI2RlZmluZSBUQUdfVElNRV9TRVJWRVIJCSgodV9pbnQ4X3QpICAgNCkKLSNkZWZpbmUgVEFHX05BTUVfU0VSVkVSCQkoKHVfaW50OF90KSAgIDUpCi0jZGVmaW5lIFRBR19ET01BSU5fU0VSVkVSCSgodV9pbnQ4X3QpICAgNikKLSNkZWZpbmUgVEFHX0xPR19TRVJWRVIJCSgodV9pbnQ4X3QpICAgNykKLSNkZWZpbmUgVEFHX0NPT0tJRV9TRVJWRVIJKCh1X2ludDhfdCkgICA4KQotI2RlZmluZSBUQUdfTFBSX1NFUlZFUgkJKCh1X2ludDhfdCkgICA5KQotI2RlZmluZSBUQUdfSU1QUkVTU19TRVJWRVIJKCh1X2ludDhfdCkgIDEwKQotI2RlZmluZSBUQUdfUkxQX1NFUlZFUgkJKCh1X2ludDhfdCkgIDExKQotI2RlZmluZSBUQUdfSE9TVE5BTUUJCSgodV9pbnQ4X3QpICAxMikKLSNkZWZpbmUgVEFHX0JPT1RTSVpFCQkoKHVfaW50OF90KSAgMTMpCi0jZGVmaW5lIFRBR19FTkQJCQkoKHVfaW50OF90KSAyNTUpCi0vKiBSRkMxNDk3IHRhZ3MgKi8KLSNkZWZpbmUJVEFHX0RVTVBQQVRICQkoKHVfaW50OF90KSAgMTQpCi0jZGVmaW5lCVRBR19ET01BSU5OQU1FCQkoKHVfaW50OF90KSAgMTUpCi0jZGVmaW5lCVRBR19TV0FQX1NFUlZFUgkJKCh1X2ludDhfdCkgIDE2KQotI2RlZmluZQlUQUdfUk9PVFBBVEgJCSgodV9pbnQ4X3QpICAxNykKLSNkZWZpbmUJVEFHX0VYVFBBVEgJCSgodV9pbnQ4X3QpICAxOCkKLS8qIFJGQzIxMzIgKi8KLSNkZWZpbmUJVEFHX0lQX0ZPUldBUkQJCSgodV9pbnQ4X3QpICAxOSkKLSNkZWZpbmUJVEFHX05MX1NSQ1JUCQkoKHVfaW50OF90KSAgMjApCi0jZGVmaW5lCVRBR19QRklMVEVSUwkJKCh1X2ludDhfdCkgIDIxKQotI2RlZmluZQlUQUdfUkVBU1NfU0laRQkJKCh1X2ludDhfdCkgIDIyKQotI2RlZmluZQlUQUdfREVGX1RUTAkJKCh1X2ludDhfdCkgIDIzKQotI2RlZmluZQlUQUdfTVRVX1RJTUVPVVQJCSgodV9pbnQ4X3QpICAyNCkKLSNkZWZpbmUJVEFHX01UVV9UQUJMRQkJKCh1X2ludDhfdCkgIDI1KQotI2RlZmluZQlUQUdfSU5UX01UVQkJKCh1X2ludDhfdCkgIDI2KQotI2RlZmluZQlUQUdfTE9DQUxfU1VCTkVUUwkoKHVfaW50OF90KSAgMjcpCi0jZGVmaW5lCVRBR19CUk9BRF9BRERSCQkoKHVfaW50OF90KSAgMjgpCi0jZGVmaW5lCVRBR19ET19NQVNLX0RJU0MJKCh1X2ludDhfdCkgIDI5KQotI2RlZmluZQlUQUdfU1VQUExZX01BU0sJCSgodV9pbnQ4X3QpICAzMCkKLSNkZWZpbmUJVEFHX0RPX1JESVNDCQkoKHVfaW50OF90KSAgMzEpCi0jZGVmaW5lCVRBR19SVFJfU09MX0FERFIJKCh1X2ludDhfdCkgIDMyKQotI2RlZmluZQlUQUdfU1RBVElDX1JPVVRFCSgodV9pbnQ4X3QpICAzMykKLSNkZWZpbmUJVEFHX1VTRV9UUkFJTEVSUwkoKHVfaW50OF90KSAgMzQpCi0jZGVmaW5lCVRBR19BUlBfVElNRU9VVAkJKCh1X2ludDhfdCkgIDM1KQotI2RlZmluZQlUQUdfRVRIX0VOQ0FQCQkoKHVfaW50OF90KSAgMzYpCi0jZGVmaW5lCVRBR19UQ1BfVFRMCQkoKHVfaW50OF90KSAgMzcpCi0jZGVmaW5lCVRBR19UQ1BfS0VFUEFMSVZFCSgodV9pbnQ4X3QpICAzOCkKLSNkZWZpbmUJVEFHX0tFRVBBTElWRV9HTwkoKHVfaW50OF90KSAgMzkpCi0jZGVmaW5lCVRBR19OSVNfRE9NQUlOCQkoKHVfaW50OF90KSAgNDApCi0jZGVmaW5lCVRBR19OSVNfU0VSVkVSUwkJKCh1X2ludDhfdCkgIDQxKQotI2RlZmluZQlUQUdfTlRQX1NFUlZFUlMJCSgodV9pbnQ4X3QpICA0MikKLSNkZWZpbmUJVEFHX1ZFTkRPUl9PUFRTCQkoKHVfaW50OF90KSAgNDMpCi0jZGVmaW5lCVRBR19ORVRCSU9TX05TCQkoKHVfaW50OF90KSAgNDQpCi0jZGVmaW5lCVRBR19ORVRCSU9TX0REUwkJKCh1X2ludDhfdCkgIDQ1KQotI2RlZmluZQlUQUdfTkVUQklPU19OT0RFCSgodV9pbnQ4X3QpICA0NikKLSNkZWZpbmUJVEFHX05FVEJJT1NfU0NPUEUJKCh1X2ludDhfdCkgIDQ3KQotI2RlZmluZQlUQUdfWFdJTl9GUwkJKCh1X2ludDhfdCkgIDQ4KQotI2RlZmluZQlUQUdfWFdJTl9ETQkJKCh1X2ludDhfdCkgIDQ5KQotI2RlZmluZQlUQUdfTklTX1BfRE9NQUlOCSgodV9pbnQ4X3QpICA2NCkKLSNkZWZpbmUJVEFHX05JU19QX1NFUlZFUlMJKCh1X2ludDhfdCkgIDY1KQotI2RlZmluZQlUQUdfTU9CSUxFX0hPTUUJCSgodV9pbnQ4X3QpICA2OCkKLSNkZWZpbmUJVEFHX1NNUFRfU0VSVkVSCQkoKHVfaW50OF90KSAgNjkpCi0jZGVmaW5lCVRBR19QT1AzX1NFUlZFUgkJKCh1X2ludDhfdCkgIDcwKQotI2RlZmluZQlUQUdfTk5UUF9TRVJWRVIJCSgodV9pbnQ4X3QpICA3MSkKLSNkZWZpbmUJVEFHX1dXV19TRVJWRVIJCSgodV9pbnQ4X3QpICA3MikKLSNkZWZpbmUJVEFHX0ZJTkdFUl9TRVJWRVIJKCh1X2ludDhfdCkgIDczKQotI2RlZmluZQlUQUdfSVJDX1NFUlZFUgkJKCh1X2ludDhfdCkgIDc0KQotI2RlZmluZQlUQUdfU1RSRUVUVEFMS19TUlZSCSgodV9pbnQ4X3QpICA3NSkKLSNkZWZpbmUJVEFHX1NUUkVFVFRBTEtfU1REQQkoKHVfaW50OF90KSAgNzYpCi0vKiBESENQIG9wdGlvbnMgKi8KLSNkZWZpbmUJVEFHX1JFUVVFU1RFRF9JUAkoKHVfaW50OF90KSAgNTApCi0jZGVmaW5lCVRBR19JUF9MRUFTRQkJKCh1X2ludDhfdCkgIDUxKQotI2RlZmluZQlUQUdfT1BUX09WRVJMT0FECSgodV9pbnQ4X3QpICA1MikKLSNkZWZpbmUJVEFHX1RGVFBfU0VSVkVSCQkoKHVfaW50OF90KSAgNjYpCi0jZGVmaW5lCVRBR19CT09URklMRU5BTUUJKCh1X2ludDhfdCkgIDY3KQotI2RlZmluZQlUQUdfREhDUF9NRVNTQUdFCSgodV9pbnQ4X3QpICA1MykKLSNkZWZpbmUJVEFHX1NFUlZFUl9JRAkJKCh1X2ludDhfdCkgIDU0KQotI2RlZmluZQlUQUdfUEFSTV9SRVFVRVNUCSgodV9pbnQ4X3QpICA1NSkKLSNkZWZpbmUJVEFHX01FU1NBR0UJCSgodV9pbnQ4X3QpICA1NikKLSNkZWZpbmUJVEFHX01BWF9NU0dfU0laRQkoKHVfaW50OF90KSAgNTcpCi0jZGVmaW5lCVRBR19SRU5FV0FMX1RJTUUJKCh1X2ludDhfdCkgIDU4KQotI2RlZmluZQlUQUdfUkVCSU5EX1RJTUUJCSgodV9pbnQ4X3QpICA1OSkKLSNkZWZpbmUJVEFHX1ZFTkRPUl9DTEFTUwkoKHVfaW50OF90KSAgNjApCi0jZGVmaW5lCVRBR19DTElFTlRfSUQJCSgodV9pbnQ4X3QpICA2MSkKLS8qIFJGQyAyMjQxICovCi0jZGVmaW5lCVRBR19ORFNfU0VSVkVSUwkJKCh1X2ludDhfdCkgIDg1KQotI2RlZmluZQlUQUdfTkRTX1RSRUVfTkFNRQkoKHVfaW50OF90KSAgODYpCi0jZGVmaW5lCVRBR19ORFNfQ09OVEVYVAkJKCh1X2ludDhfdCkgIDg3KQotLyogUkZDIDIyNDIgKi8KLSNkZWZpbmUJVEFHX05EU19JUERPTUFJTgkoKHVfaW50OF90KSAgNjIpCi0jZGVmaW5lCVRBR19ORFNfSVBJTkZPCQkoKHVfaW50OF90KSAgNjMpCi0vKiBSRkMgMjQ4NSAqLwotI2RlZmluZQlUQUdfT1BFTl9HUk9VUF9VQVAJKCh1X2ludDhfdCkgIDk4KQotLyogUkZDIDI1NjMgKi8KLSNkZWZpbmUJVEFHX0RJU0FCTEVfQVVUT0NPTkYJKCh1X2ludDhfdCkgMTE2KQotLyogUkZDIDI2MTAgKi8KLSNkZWZpbmUJVEFHX1NMUF9EQQkJKCh1X2ludDhfdCkgIDc4KQotI2RlZmluZQlUQUdfU0xQX1NDT1BFCQkoKHVfaW50OF90KSAgNzkpCi0vKiBSRkMgMjkzNyAqLwotI2RlZmluZQlUQUdfTlNfU0VBUkNICQkoKHVfaW50OF90KSAxMTcpCi0vKiBSRkMgMzAxMSAqLwotI2RlZmluZQlUQUdfSVA0X1NVQk5FVF9TRUxFQ1QJKCh1X2ludDhfdCkgMTE4KQotLyogUkZDIDM0NDIgKi8KLSNkZWZpbmUgVEFHX0NMQVNTTEVTU19TVEFUSUNfUlQJKCh1X2ludDhfdCkgMTIxKQotI2RlZmluZSBUQUdfQ0xBU1NMRVNTX1NUQV9SVF9NUwkoKHVfaW50OF90KSAyNDkpCi0vKiBmdHA6Ly9mdHAuaXNpLmVkdS8uLi4vYXNzaWdubWVudHMvYm9vdHAtZGhjcC1leHRlbnNpb25zICovCi0jZGVmaW5lCVRBR19VU0VSX0NMQVNTCQkoKHVfaW50OF90KSAgNzcpCi0jZGVmaW5lCVRBR19TTFBfTkFNSU5HX0FVVEgJKCh1X2ludDhfdCkgIDgwKQotI2RlZmluZQlUQUdfQ0xJRU5UX0ZRRE4JCSgodV9pbnQ4X3QpICA4MSkKLSNkZWZpbmUJVEFHX0FHRU5UX0NJUkNVSVQJKCh1X2ludDhfdCkgIDgyKQotI2RlZmluZQlUQUdfQUdFTlRfUkVNT1RFCSgodV9pbnQ4X3QpICA4MykKLSNkZWZpbmUJVEFHX0FHRU5UX01BU0sJCSgodV9pbnQ4X3QpICA4NCkKLSNkZWZpbmUJVEFHX1RaX1NUUklORwkJKCh1X2ludDhfdCkgIDg4KQotI2RlZmluZQlUQUdfRlFETl9PUFRJT04JCSgodV9pbnQ4X3QpICA4OSkKLSNkZWZpbmUJVEFHX0FVVEgJCSgodV9pbnQ4X3QpICA5MCkKLSNkZWZpbmUJVEFHX1ZJTkVTX1NFUlZFUlMJKCh1X2ludDhfdCkgIDkxKQotI2RlZmluZQlUQUdfU0VSVkVSX1JBTksJCSgodV9pbnQ4X3QpICA5MikKLSNkZWZpbmUJVEFHX0NMSUVOVF9BUkNICQkoKHVfaW50OF90KSAgOTMpCi0jZGVmaW5lCVRBR19DTElFTlRfTkRJCQkoKHVfaW50OF90KSAgOTQpCi0jZGVmaW5lCVRBR19DTElFTlRfR1VJRAkJKCh1X2ludDhfdCkgIDk3KQotI2RlZmluZQlUQUdfTERBUF9VUkwJCSgodV9pbnQ4X3QpICA5NSkKLSNkZWZpbmUJVEFHXzZPVkVSNAkJKCh1X2ludDhfdCkgIDk2KQotI2RlZmluZQlUQUdfUFJJTlRFUl9OQU1FCSgodV9pbnQ4X3QpIDEwMCkKLSNkZWZpbmUJVEFHX01ESENQX1NFUlZFUgkoKHVfaW50OF90KSAxMDEpCi0jZGVmaW5lCVRBR19JUFhfQ09NUEFUCQkoKHVfaW50OF90KSAxMTApCi0jZGVmaW5lCVRBR19ORVRJTkZPX1BBUkVOVAkoKHVfaW50OF90KSAxMTIpCi0jZGVmaW5lCVRBR19ORVRJTkZPX1BBUkVOVF9UQUcJKCh1X2ludDhfdCkgMTEzKQotI2RlZmluZQlUQUdfVVJMCQkJKCh1X2ludDhfdCkgMTE0KQotI2RlZmluZQlUQUdfRkFJTE9WRVIJCSgodV9pbnQ4X3QpIDExNSkKLSNkZWZpbmUJVEFHX0VYVEVOREVEX1JFUVVFU1QJKCh1X2ludDhfdCkgMTI2KQotI2RlZmluZQlUQUdfRVhURU5ERURfT1BUSU9OCSgodV9pbnQ4X3QpIDEyNykKLQotCi0vKiBESENQIE1lc3NhZ2UgdHlwZXMgKHZhbHVlcyBmb3IgVEFHX0RIQ1BfTUVTU0FHRSBvcHRpb24pICovCi0jZGVmaW5lCQlESENQRElTQ09WRVIJMQotI2RlZmluZQkJREhDUE9GRkVSCTIKLSNkZWZpbmUJCURIQ1BSRVFVRVNUCTMKLSNkZWZpbmUJCURIQ1BERUNMSU5FCTQKLSNkZWZpbmUJCURIQ1BBQ0sJCTUKLSNkZWZpbmUJCURIQ1BOQUsJCTYKLSNkZWZpbmUJCURIQ1BSRUxFQVNFCTcKLSNkZWZpbmUJCURIQ1BJTkZPUk0JOAotCi0KLS8qCi0gKiAidmVuZG9yIiBkYXRhIHBlcm1pdHRlZCBmb3IgQ01VIGJvb3RwIGNsaWVudHMuCi0gKi8KLQotc3RydWN0IGNtdV92ZW5kIHsKLQl1X2ludDhfdAl2X21hZ2ljWzRdOwkvKiBtYWdpYyBudW1iZXIgKi8KLQl1X2ludDMyX3QJdl9mbGFnczsJLyogZmxhZ3Mvb3Bjb2RlcywgZXRjLiAqLwotCXN0cnVjdCBpbl9hZGRyCXZfc21hc2s7CS8qIFN1Ym5ldCBtYXNrICovCi0Jc3RydWN0IGluX2FkZHIJdl9kZ2F0ZTsJLyogRGVmYXVsdCBnYXRld2F5ICovCi0Jc3RydWN0IGluX2FkZHIJdl9kbnMxLCB2X2RuczI7IC8qIERvbWFpbiBuYW1lIHNlcnZlcnMgKi8KLQlzdHJ1Y3QgaW5fYWRkcgl2X2luczEsIHZfaW5zMjsgLyogSUVOLTExNiBuYW1lIHNlcnZlcnMgKi8KLQlzdHJ1Y3QgaW5fYWRkcgl2X3RzMSwgdl90czI7CS8qIFRpbWUgc2VydmVycyAqLwotCXVfaW50OF90CXZfdW51c2VkWzI0XTsJLyogY3VycmVudGx5IHVudXNlZCAqLwotfTsKLQotCi0vKiB2X2ZsYWdzIHZhbHVlcyAqLwotI2RlZmluZSBWRl9TTUFTSwkxCS8qIFN1Ym5ldCBtYXNrIGZpZWxkIGNvbnRhaW5zIHZhbGlkIGRhdGEgKi8KLQotLyogUkZDIDQ3MDIgREhDUCBDbGllbnQgRlFETiBPcHRpb24gKi8KLQotI2RlZmluZSBDTElFTlRfRlFETl9GTEFHU19TCTB4MDEKLSNkZWZpbmUgQ0xJRU5UX0ZRRE5fRkxBR1NfTwkweDAyCi0jZGVmaW5lIENMSUVOVF9GUUROX0ZMQUdTX0UJMHgwNAotI2RlZmluZSBDTElFTlRfRlFETl9GTEFHU19OCTB4MDgKZGlmZiAtLWdpdCBhL2JwZl9kdW1wLmMgYi9icGZfZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2FkNGQ5Li4wMDAwMDAwCi0tLSBhL2JwZl9kdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2JwZl9kdW1wLmMsdiAxLjE2IDIwMDMvMTEvMTYgMDk6MzY6MDggZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotdm9pZAotYnBmX2R1bXAoc3RydWN0IGJwZl9wcm9ncmFtICpwLCBpbnQgb3B0aW9uKQotewotCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKLQlpbnQgaTsKLQlpbnQgbiA9IHAtPmJmX2xlbjsKLQotCWluc24gPSBwLT5iZl9pbnNuczsKLQlpZiAob3B0aW9uID4gMikgewotCQlwcmludGYoIiVkXG4iLCBuKTsKLQkJZm9yIChpID0gMDsgaSA8IG47ICsraW5zbiwgKytpKSB7Ci0JCQlwcmludGYoIiV1ICV1ICV1ICV1XG4iLCBpbnNuLT5jb2RlLAotCQkJICAgICAgIGluc24tPmp0LCBpbnNuLT5qZiwgaW5zbi0+ayk7Ci0JCX0KLQkJcmV0dXJuIDsKLQl9Ci0JaWYgKG9wdGlvbiA+IDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IG47ICsraW5zbiwgKytpKQotCQkJcHJpbnRmKCJ7IDB4JXgsICVkLCAlZCwgMHglMDh4IH0sXG4iLAotCQkJICAgICAgIGluc24tPmNvZGUsIGluc24tPmp0LCBpbnNuLT5qZiwgaW5zbi0+ayk7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG47ICsraW5zbiwgKytpKSB7Ci0jaWZkZWYgQkRFQlVHCi0JCWV4dGVybiBpbnQgYmlkc1tdOwotCQlwcmludGYoYmlkc1tpXSA+IDAgPyAiWyUwMmRdIiA6ICIgLS0gIiwgYmlkc1tpXSAtIDEpOwotI2VuZGlmCi0JCXB1dHMoYnBmX2ltYWdlKGluc24sIGkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jaGRsYy5oIGIvY2hkbGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiNmUxZC4uMDAwMDAwMAotLS0gYS9jaGRsYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9jaGRsYy5oLHYgMS4xIDIwMDAvMDkvMTggMDU6MTE6NDMgZ3V5IEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2RlZmluZSBDSERMQ19IRFJMRU4gCQk0Ci0jZGVmaW5lIENIRExDX1VOSUNBU1QJCTB4MGYKLSNkZWZpbmUgQ0hETENfQkNBU1QJCTB4OGYKLSNkZWZpbmUgQ0hETENfVFlQRV9TTEFSUAkweDgwMzUKLSNkZWZpbmUgQ0hETENfVFlQRV9DRFAJCTB4MjAwMApkaWZmIC0tZ2l0IGEvY29uZmlnLmd1ZXNzIGIvY29uZmlnLmd1ZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0YzViZGU4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5ndWVzcworKysgL2Rldi9udWxsCkBAIC0xLDE0MjkgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDMtMTAtMTYnCi0KLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lciA8cGVyQGJvdGhuZXIuY29tPi4KLSMgUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uICBTdWJtaXQgYSBjb250ZXh0Ci0jIGRpZmYgYW5kIGEgcHJvcGVybHkgZm9ybWF0dGVkIENoYW5nZUxvZyBlbnRyeS4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IGJ1aWxkIHN5c3RlbSB0eXBlLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXQotCi1PdXRwdXQgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgc3lzdGVtIFxgJG1lJyBpcyBydW4gb24uCi0KLU9wZXJhdGlvbiBtb2RlczoKLSAgLWgsIC0taGVscCAgICAgICAgIHByaW50IHRoaXMgaGVscCwgdGhlbiBleGl0Ci0gIC10LCAtLXRpbWUtc3RhbXAgICBwcmludCBkYXRlIG9mIGxhc3QgbW9kaWZpY2F0aW9uLCB0aGVuIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgICAgIHByaW50IHZlcnNpb24gbnVtYmVyLCB0aGVuIGV4aXQKLQotUmVwb3J0IGJ1Z3MgYW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiIKLQotdmVyc2lvbj0iXAotR05VIGNvbmZpZy5ndWVzcyAoJHRpbWVzdGFtcCkKLQotT3JpZ2luYWxseSB3cml0dGVuIGJ5IFBlciBCb3RobmVyLgotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KLXdhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiIKLQotaGVscD0iCi1UcnkgXGAkbWUgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iCi0KLSMgUGFyc2UgY29tbWFuZCBsaW5lCi13aGlsZSB0ZXN0ICQjIC1ndCAwIDsgZG8KLSAgY2FzZSAkMSBpbgotICAgIC0tdGltZS1zdGFtcCB8IC0tdGltZSogfCAtdCApCi0gICAgICAgZWNobyAiJHRpbWVzdGFtcCIgOyBleGl0IDAgOzsKLSAgICAtLXZlcnNpb24gfCAtdiApCi0gICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCAwIDs7Ci0gICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKLSAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDAgOzsKLSAgICAtLSApICAgICAjIFN0b3Agb3B0aW9uIHByb2Nlc3NpbmcKLSAgICAgICBzaGlmdDsgYnJlYWsgOzsKLSAgICAtICkJIyBVc2Ugc3RkaW4gYXMgaW5wdXQuCi0gICAgICAgYnJlYWsgOzsKLSAgICAtKiApCi0gICAgICAgZWNobyAiJG1lOiBpbnZhbGlkIG9wdGlvbiAkMSRoZWxwIiA+JjIKLSAgICAgICBleGl0IDEgOzsKLSAgICAqICkKLSAgICAgICBicmVhayA7OwotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgJCMgIT0gMDsgdGhlbgotICBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgZXhpdCAxCi1maQotCi10cmFwICdleGl0IDEnIDEgMiAxNQotCi0jIENDX0ZPUl9CVUlMRCAtLSBjb21waWxlciB1c2VkIGJ5IHRoaXMgc2NyaXB0LiBOb3RlIHRoYXQgdGhlIHVzZSBvZiBhCi0jIGNvbXBpbGVyIHRvIGFpZCBpbiBzeXN0ZW0gZGV0ZWN0aW9uIGlzIGRpc2NvdXJhZ2VkIGFzIGl0IHJlcXVpcmVzCi0jIHRlbXBvcmFyeSBmaWxlcyB0byBiZSBjcmVhdGVkIGFuZCwgYXMgeW91IGNhbiBzZWUgYmVsb3csIGl0IGlzIGEKLSMgaGVhZGFjaGUgdG8gZGVhbCB3aXRoIGluIGEgcG9ydGFibGUgZmFzaGlvbi4KLQotIyBIaXN0b3JpY2FsbHksIGBDQ19GT1JfQlVJTEQnIHVzZWQgdG8gYmUgbmFtZWQgYEhPU1RfQ0MnLiBXZSBzdGlsbAotIyB1c2UgYEhPU1RfQ0MnIGlmIGRlZmluZWQsIGJ1dCBpdCBpcyBkZXByZWNhdGVkLgotCi0jIFBvcnRhYmxlIHRtcCBkaXJlY3RvcnkgY3JlYXRpb24gaW5zcGlyZWQgYnkgdGhlIEF1dG9jb25mIHRlYW0uCi0KLXNldF9jY19mb3JfYnVpbGQ9JwotdHJhcCAiZXhpdGNvZGU9XCQ/OyAocm0gLWYgXCR0bXBmaWxlcyAyPi9kZXYvbnVsbDsgcm1kaXIgXCR0bXAgMj4vZGV2L251bGwpICYmIGV4aXQgXCRleGl0Y29kZSIgMCA7Ci10cmFwICJybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbDsgZXhpdCAxIiAxIDIgMTMgMTUgOwotOiAke1RNUERJUj0vdG1wfSA7Ci0geyB0bXA9YCh1bWFzayAwNzcgJiYgbWt0ZW1wIC1kIC1xICIkVE1QRElSL2NnWFhYWFhYIikgMj4vZGV2L251bGxgICYmIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiIDsgfSB8fAotIHsgdGVzdCAtbiAiJFJBTkRPTSIgJiYgdG1wPSRUTVBESVIvY2ckJC0kUkFORE9NICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgOyB9IHx8Ci0geyB0bXA9JFRNUERJUi9jZy0kJCAmJiAodW1hc2sgMDc3ICYmIG1rZGlyICR0bXApICYmIGVjaG8gIldhcm5pbmc6IGNyZWF0aW5nIGluc2VjdXJlIHRlbXAgZGlyZWN0b3J5IiA+JjIgOyB9IHx8Ci0geyBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluICRUTVBESVIiID4mMiA7IGV4aXQgMSA7IH0gOwotZHVtbXk9JHRtcC9kdW1teSA7Ci10bXBmaWxlcz0iJGR1bW15LmMgJGR1bW15Lm8gJGR1bW15LnJlbCAkZHVtbXkiIDsKLWNhc2UgJENDX0ZPUl9CVUlMRCwkSE9TVF9DQywkQ0MgaW4KLSAsLCkgICAgZWNobyAiaW50IHg7IiA+ICRkdW1teS5jIDsKLQlmb3IgYyBpbiBjYyBnY2MgYzg5IGM5OSA7IGRvCi0JICBpZiAoJGMgLWMgLW8gJGR1bW15Lm8gJGR1bW15LmMpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgICAgIENDX0ZPUl9CVUlMRD0iJGMiOyBicmVhayA7Ci0JICBmaSA7Ci0JZG9uZSA7Ci0JaWYgdGVzdCB4IiRDQ19GT1JfQlVJTEQiID0geCA7IHRoZW4KLQkgIENDX0ZPUl9CVUlMRD1ub19jb21waWxlcl9mb3VuZCA7Ci0JZmkKLQk7OwotICwsKikgICBDQ19GT1JfQlVJTEQ9JENDIDs7Ci0gLCosKikgIENDX0ZPUl9CVUlMRD0kSE9TVF9DQyA7OwotZXNhYyA7JwotCi0jIFRoaXMgaXMgbmVlZGVkIHRvIGZpbmQgdW5hbWUgb24gYSBQeXJhbWlkIE9TeCB3aGVuIHJ1biBpbiB0aGUgQlNEIHVuaXZlcnNlLgotIyAoZ2hhemlAbm9jLnJ1dGdlcnMuZWR1IDE5OTQtMDgtMjQpCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgIHx8IFVOQU1FX1NZU1RFTT11bmtub3duCi1VTkFNRV9WRVJTSU9OPWAodW5hbWUgLXYpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9WRVJTSU9OPXVua25vd24KLQotIyBOb3RlOiBvcmRlciBpcyBzaWduaWZpY2FudCAtIHRoZSBjYXNlIGJyYW5jaGVzIGFyZSBub3QgZXhjbHVzaXZlLgotCi1jYXNlICIke1VOQU1FX01BQ0hJTkV9OiR7VU5BTUVfU1lTVEVNfToke1VOQU1FX1JFTEVBU0V9OiR7VU5BTUVfVkVSU0lPTn0iIGluCi0gICAgKjpOZXRCU0Q6KjoqKQotCSMgTmV0QlNEIChuYnNkKSB0YXJnZXRzIHNob3VsZCAod2hlcmUgYXBwbGljYWJsZSkgbWF0Y2ggb25lIG9yCi0JIyBtb3JlIG9mIHRoZSB0dXBwbGVzOiAqLSotbmV0YnNkZWxmKiwgKi0qLW5ldGJzZGFvdXQqLAotCSMgKi0qLW5ldGJzZGVjb2ZmKiBhbmQgKi0qLW5ldGJzZCouICBGb3IgdGFyZ2V0cyB0aGF0IHJlY2VudGx5Ci0JIyBzd2l0Y2hlZCB0byBFTEYsICotKi1uZXRic2QqIHdvdWxkIHNlbGVjdCB0aGUgb2xkCi0JIyBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGlzIHByb3ZpZGVzIGJvdGggZm9yd2FyZAotCSMgY29tcGF0aWJpbGl0eSBhbmQgYSBjb25zaXN0ZW50IG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIHRoZQotCSMgb2JqZWN0IGZpbGUgZm9ybWF0LgotCSMKLQkjIE5vdGU6IE5ldEJTRCBkb2Vzbid0IHBhcnRpY3VsYXJseSBjYXJlIGFib3V0IHRoZSB2ZW5kb3IKLQkjIHBvcnRpb24gb2YgdGhlIG5hbWUuICBXZSBhbHdheXMgc2V0IGl0IHRvICJ1bmtub3duIi4KLQlzeXNjdGw9InN5c2N0bCAtbiBody5tYWNoaW5lX2FyY2giCi0JVU5BTUVfTUFDSElORV9BUkNIPWAoL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgIC91c3Ivc2Jpbi8kc3lzY3RsIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bilgCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm1lYikgbWFjaGluZT1hcm1lYi11bmtub3duIDs7Ci0JICAgIGFybSopIG1hY2hpbmU9YXJtLXVua25vd24gOzsKLQkgICAgc2gzZWwpIG1hY2hpbmU9c2hsLXVua25vd24gOzsKLQkgICAgc2gzZWIpIG1hY2hpbmU9c2gtdW5rbm93biA7OwotCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7Ci0JZXNhYwotCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAotCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgotCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAotCQkJfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbAotCQl0aGVuCi0JCSAgICAjIE9uY2UgYWxsIHV0aWxpdGllcyBjYW4gYmUgRUNPRkYgKG5ldGJzZGVjb2ZmKSBvciBhLm91dCAobmV0YnNkYW91dCkuCi0JCSAgICAjIFJldHVybiBuZXRic2QgZm9yIGVpdGhlci4gIEZJWD8KLQkJICAgIG9zPW5ldGJzZAotCQllbHNlCi0JCSAgICBvcz1uZXRic2RlbGYKLQkJZmkKLQkJOzsKLQkgICAgKikKLQkgICAgICAgIG9zPW5ldGJzZAotCQk7OwotCWVzYWMKLQkjIFRoZSBPUyByZWxlYXNlCi0JIyBEZWJpYW4gR05VL05ldEJTRCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IHVzZXJsYW5kLCBhbmQKLQkjIHRodXMsIG5lZWQgYSBkaXN0aW5jdCB0cmlwbGV0LiBIb3dldmVyLCB0aGV5IGRvIG5vdCBuZWVkCi0JIyBrZXJuZWwgdmVyc2lvbiBpbmZvcm1hdGlvbiwgc28gaXQgY2FuIGJlIHJlcGxhY2VkIHdpdGggYQotCSMgc3VpdGFibGUgdGFnLCBpbiB0aGUgc3R5bGUgb2YgbGludXgtZ251LgotCWNhc2UgIiR7VU5BTUVfVkVSU0lPTn0iIGluCi0JICAgIERlYmlhbiopCi0JCXJlbGVhc2U9Jy1nbnUnCi0JCTs7Ci0JICAgICopCi0JCXJlbGVhc2U9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JCTs7Ci0JZXNhYwotCSMgU2luY2UgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNOgotCSMgY29udGFpbnMgcmVkdW5kYW50IGluZm9ybWF0aW9uLCB0aGUgc2hvcnRlciBmb3JtOgotCSMgQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0gaXMgdXNlZC4KLQllY2hvICIke21hY2hpbmV9LSR7b3N9JHtyZWxlYXNlfSIKLQlleGl0IDAgOzsKLSAgICBhbWlnYTpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFyYzpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWNwcGM6T3BlbkJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTg4azpPcGVuQlNEOio6KikKLQllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG12bWVwcGM6T3BlbkJTRDoqOiopCi0JZWNobyBwb3dlcnBjLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwZWdhc29zOk9wZW5CU0Q6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgcG1heDpPcGVuQlNEOio6KikKLQllY2hvIG1pcHNlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgc2dpOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2ViLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgd2dyaXNjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOk9wZW5CU0Q6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYWxwaGE6T1NGMToqOiopCi0JaWYgdGVzdCAkVU5BTUVfUkVMRUFTRSA9ICJWNC4wIjsgdGhlbgotCQlVTkFNRV9SRUxFQVNFPWAvdXNyL3NiaW4vc2l6ZXIgLXYgfCBhd2sgJ3twcmludCAkM30nYAotCWZpCi0JIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KLQkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAotCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKLQkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KLQlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCi0JY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgotCSAgICAiRVY0ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkVWNC41ICgyMTA2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKLQkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OwotCSAgICAiRVY1ICgyMTE2NCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKLQkgICAgIkVWNS42ICgyMTE2NEEpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OwotCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKLQkgICAgIkVWNS43ICgyMTE2NFBDKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7Ci0JICAgICJFVjYgKDIxMjY0KSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OwotCSAgICAiRVY2LjcgKDIxMjY0QSkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7Ci0JICAgICJFVjYuOENCICgyMTI2NEMpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OwotCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKLQkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQotCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7Ci0JICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKLQkgICAgIkVWNyAoMjEzNjQpIikKLQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7Ci0JICAgICJFVjcuOSAoMjEzNjRBKSIpCi0JCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKLQllc2FjCi0JIyBBIFZuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIHZlcnNpb24uCi0JIyBBIFRuLm4gdmVyc2lvbiBpcyBhIHJlbGVhc2VkIGZpZWxkIHRlc3QgdmVyc2lvbi4KLQkjIEEgWG4ubiB2ZXJzaW9uIGlzIGFuIHVucmVsZWFzZWQgZXhwZXJpbWVudGFsIGJhc2VsZXZlbC4KLQkjIDEuMiB1c2VzICIxLjIiIGZvciB1bmFtZSAtci4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCWV4aXQgMCA7OwotICAgIEFscGhhKjpPcGVuVk1TOio6KikKLQllY2hvIGFscGhhLWhwLXZtcwotCWV4aXQgMCA7OwotICAgIEFscGhhXCAqOldpbmRvd3NfTlQqOiopCi0JIyBIb3cgZG8gd2Uga25vdyBpdCdzIEludGVyaXggcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMgUE9TSVggc3Vic3lzdGVtPwotCSMgU2hvdWxkIHdlIGNoYW5nZSBVTkFNRV9NQUNISU5FIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgdW5hbWUgaW5zdGVhZAotCSMgb2YgdGhlIHNwZWNpZmljIEFscGhhIG1vZGVsPwotCWVjaG8gYWxwaGEtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgMCA7OwotICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQotCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0Ci0JZXhpdCAwOzsKLSAgICAqOltBYV1taWdhW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWFtaWdhb3MKLQlleGl0IDAgOzsKLSAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKLQlleGl0IDAgOzsKLSAgICAqOk9TLzM5MDoqOiopCi0JZWNobyBpMzcwLWlibS1vcGVuZWRpdGlvbgotCWV4aXQgMCA7OwotICAgICo6T1M0MDA6KjoqKQotICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCi0JZXhpdCAwIDs7Ci0gICAgYXJtOlJJU0MqOjEuWzAxMl0qOip8YXJtOnJpc2NpeDoxLlswMTJdKjoqKQotCWVjaG8gYXJtLWFjb3JuLXJpc2NpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDA7OwotICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgMDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOiogfCBNSVMqOk9TeCo6KjoqIHwgTUlTKjpTTVBfREMtT1N4KjoqOiopCi0JIyBha2VlQHdwZGlzMDMud3BhZmIuYWYubWlsIChFYXJsZSBGLiBBa2UpIGNvbnRyaWJ1dGVkIE1JUyBhbmQgTklMRS4KLQlpZiB0ZXN0ICJgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsYCIgPSBhdHQgOyB0aGVuCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLXN5c3YzCi0JZWxzZQotCQllY2hvIHB5cmFtaWQtcHlyYW1pZC1ic2QKLQlmaQotCWV4aXQgMCA7OwotICAgIE5JTEUqOio6KjpkY29zeCkKLQllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0Ci0JZXhpdCAwIDs7Ci0gICAgRFJTPzYwMDA6dW5peDo0LjA6NiopCi0JZWNobyBzcGFyYy1pY2wtbng2Ci0JZXhpdCAwIDs7Ci0gICAgRFJTPzYwMDA6VU5JWF9TVjo0LjIqOjcqKQotCWNhc2UgYC91c3IvYmluL3VuYW1lIC1wYCBpbgotCSAgICBzcGFyYykgZWNobyBzcGFyYy1pY2wtbng3ICYmIGV4aXQgMCA7OwotCWVzYWMgOzsKLSAgICBzdW40SDpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLWhhbC1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjUuKjoqIHwgdGFkcG9sZSo6U3VuT1M6NS4qOiopCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBpODZwYzpTdW5PUzo1Lio6KikKLQllY2hvIGkzODYtcGMtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzo2KjoqKQotCSMgQWNjb3JkaW5nIHRvIGNvbmZpZy5zdWIsIHRoaXMgaXMgdGhlIHByb3BlciB3YXkgdG8gY2Fub25pY2FsaXplCi0JIyBTdW5PUzYuICBIYXJkIHRvIGd1ZXNzIGV4YWN0bHkgd2hhdCBTdW5PUzYgd2lsbCBiZSBsaWtlLCBidXQKLQkjIGl0J3MgbGlrZWx5IHRvIGJlIG1vcmUgbGlrZSBTb2xhcmlzIHRoYW4gU3VuT1M0LgotCWVjaG8gc3BhcmMtc3VuLXNvbGFyaXMzYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6KjoqKQotCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KLQkgICAgU2VyaWVzKnxTNCopCi0JCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAotCQk7OwotCWVzYWMKLQkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCi0JZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW4zKjpTdW5PUzoqOiopCi0JZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4qOio6NC4yQlNEOiopCi0JVU5BTUVfUkVMRUFTRT1gKHNlZCAxcSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgIyBUaGUgc2l0dWF0aW9uIGZvciBNaU5UIGlzIGEgbGl0dGxlIGNvbmZ1c2luZy4gIFRoZSBtYWNoaW5lIG5hbWUKLSAgICAjIGNhbiBiZSB2aXJ0dWFsbHkgZXZlcnl0aGluZyAoZXZlcnl0aGluZyB3aGljaCBpcyBub3QKLSAgICAjICJhdGFyaXN0IiBvciAiYXRhcmlzdGUiIGF0IGxlYXN0IHNob3VsZCBoYXZlIGEgcHJvY2Vzc29yCi0gICAgIyA+IG02ODAwMCkuICBUaGUgc3lzdGVtIG5hbWUgcmFuZ2VzIGZyb20gIk1pTlQiIG92ZXIgIkZyZWVNaU5UIgotICAgICMgdG8gdGhlIGxvd2VyY2FzZSB2ZXJzaW9uICJtaW50IiAob3IgImZyZWVtaW50IikuICBGaW5hbGx5Ci0gICAgIyB0aGUgc3lzdGVtIG5hbWUgIlRPUyIgZGVub3RlcyBhIHN5c3RlbSB3aGljaCBpcyBhY3R1YWxseSBub3QKLSAgICAjIE1pTlQuICBCdXQgTWlOVCBpcyBkb3dud2FyZCBjb21wYXRpYmxlIHRvIFRPUywgc28gdGhpcyBzaG91bGQKLSAgICAjIGJlIG5vIHByb2JsZW0uCi0gICAgYXRhcmlzdFtlXToqTWlOVDoqOiogfCBhdGFyaXN0W2VdOiptaW50Oio6KiB8IGF0YXJpc3RbZV06KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGF0YXJpKjoqTWlOVDoqOiogfCBhdGFyaSo6Km1pbnQ6KjoqIHwgYXRhcmlzdFtlXToqVE9TOio6KikKLQllY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCi0gICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pbGFuKjoqTWlOVDoqOiogfCBtaWxhbio6Km1pbnQ6KjoqIHwgKm1pbGFuKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLW1pbGFuLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgIGhhZGVzKjoqTWlOVDoqOiogfCBoYWRlcyo6Km1pbnQ6KjoqIHwgKmhhZGVzKjoqVE9TOio6KikKLSAgICAgICAgZWNobyBtNjhrLWhhZGVzLW1pbnQke1VOQU1FX1JFTEVBU0V9Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQotICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQotICAgICAgICBleGl0IDAgOzsKLSAgICBwb3dlcnBjOm1hY2h0ZW46KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1tYWNodGVuJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFJJU0MqOk1hY2g6KjoqKQotCWVjaG8gbWlwcy1kZWMtbWFjaF9ic2Q0LjMKLQlleGl0IDAgOzsKLSAgICBSSVNDKjpVTFRSSVg6KjoqKQotCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFZBWCo6VUxUUklYKjoqOiopCi0JZWNobyB2YXgtZGVjLXVsdHJpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAyMDIwOkNMSVg6KjoqIHwgMjQzMDpDTElYOio6KikKLQllY2hvIGNsaXBwZXItaW50ZXJncmFwaC1jbGl4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KLQlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewotI2Vsc2UKLQlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgewotI2VuZGlmCi0JI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKLQkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNlbmRpZgotCSAgZXhpdCAoLTEpOwotCX0KLUVPRgotCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIFwKLQkgICYmICRkdW1teSBgZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCBcCi0JICAmJiBleGl0IDAKLQllY2hvIG1pcHMtbWlwcy1yaXNjb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAotCWV4aXQgMCA7OwotICAgIE1vdG9yb2xhOio6NC4zOlBMOC0qKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOio6KjpQb3dlck1BWF9PUyB8IFN5bmVyZ3k6UG93ZXJNQVhfT1M6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJtYXgKLQlleGl0IDAgOzsKLSAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQotCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azpDWC9VWDo3KjoqKQotCWVjaG8gbTg4ay1oYXJyaXMtY3h1eDcKLQlleGl0IDAgOzsKLSAgICBtODhrOio6NCo6UjQqKQotCWVjaG8gbTg4ay1tb3Rvcm9sYS1zeXN2NAotCWV4aXQgMCA7OwotICAgIG04OGs6KjozKjpSMyopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgQVZpaU9OOmRndXg6KjoqKQotICAgICAgICAjIERHL1VYIHJldHVybnMgQVZpaU9OIGZvciBhbGwgYXJjaGl0ZWN0dXJlcwotICAgICAgICBVTkFNRV9QUk9DRVNTT1I9YC91c3IvYmluL3VuYW1lIC1wYAotCWlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgXSB8fCBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTEwIF0KLQl0aGVuCi0JICAgIGlmIFsgJHtUQVJHRVRfQklOQVJZX0lOVEVSRkFDRX14ID0gbTg4a2RndXhlbGZ4IF0gfHwgXAotCSAgICAgICBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IHggXQotCSAgICB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCSAgICBlbHNlCi0JCWVjaG8gbTg4ay1kZy1kZ3V4YmNzJHtVTkFNRV9SRUxFQVNFfQotCSAgICBmaQotCWVsc2UKLQkgICAgZWNobyBpNTg2LWRnLWRndXgke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaSo4NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWE2NDpBSVg6KjoqKQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOjI6MykKLQlpZiBncmVwIGJvczMyNSAvdXNyL2luY2x1ZGUvc3RkaW8uaCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkJI2luY2x1ZGUgPHN5cy9zeXN0ZW1jZmcuaD4KLQotCQltYWluKCkKLQkJCXsKLQkJCWlmICghX19wb3dlcl9wYygpKQotCQkJCWV4aXQoMSk7Ci0JCQlwdXRzKCJwb3dlcnBjLWlibS1haXgzLjIuNSIpOwotCQkJZXhpdCgwKTsKLQkJCX0KLUVPRgotCQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6KjpbNDVdKQotCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlJQk1fQVJDSD1yczYwMDAKLQllbHNlCi0JCUlCTV9BUkNIPXBvd2VycGMKLQlmaQotCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgotCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAotCWVsc2UKLQkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KLQlleGl0IDAgOzsKLSAgICAqOkFJWDoqOiopCi0JZWNobyByczYwMDAtaWJtLWFpeAotCWV4aXQgMCA7OwotICAgIGlibXJ0OjQuNEJTRDoqfHJvbXAtaWJtOkJTRDoqKQotCWVjaG8gcm9tcC1pYm0tYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKLQllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCi0JZXhpdCAwIDs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKLSAgICAqOkJPU1g6KjoqKQotCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAotCWV4aXQgMCA7OwotICAgIERQWC8yPzAwOkIuTy5TLjoqOiopCi0JZWNobyBtNjhrLWJ1bGwtc3lzdjMKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNF0/Pzo0LjNic2Q6MS4qOiopCi0JZWNobyBtNjhrLWhwLWJzZAotCWV4aXQgMCA7OwotICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCi0JZWNobyBtNjhrLWhwLWJzZDQuNAotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0Njc4XT8/OkhQLVVYOio6KikKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgotCSAgICA5MDAwLzMxPyApICAgICAgICAgICAgSFBfQVJDSD1tNjgwMDAgOzsKLQkgICAgOTAwMC9bMzRdPz8gKSAgICAgICAgIEhQX0FSQ0g9bTY4ayA7OwotCSAgICA5MDAwL1s2NzhdWzAtOV1bMC05XSkKLQkJaWYgWyAteCAvdXNyL2Jpbi9nZXRjb25mIF07IHRoZW4KLQkJICAgIHNjX2NwdV92ZXJzaW9uPWAvdXNyL2Jpbi9nZXRjb25mIFNDX0NQVV9WRVJTSU9OIDI+L2Rldi9udWxsYAotICAgICAgICAgICAgICAgICAgICBzY19rZXJuZWxfYml0cz1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19LRVJORUxfQklUUyAyPi9kZXYvbnVsbGAKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19jcHVfdmVyc2lvbn0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgNTIzKSBIUF9BUkNIPSJocHBhMS4wIiA7OyAjIENQVV9QQV9SSVNDMV8wCi0gICAgICAgICAgICAgICAgICAgICAgNTI4KSBIUF9BUkNIPSJocHBhMS4xIiA7OyAjIENQVV9QQV9SSVNDMV8xCi0gICAgICAgICAgICAgICAgICAgICAgNTMyKSAgICAgICAgICAgICAgICAgICAgICAjIENQVV9QQV9SSVNDMl8wCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIke3NjX2tlcm5lbF9iaXRzfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgMzIpIEhQX0FSQ0g9ImhwcGEyLjBuIiA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICA2NCkgSFBfQVJDSD0iaHBwYTIuMHciIDs7Ci0JCQkgICcnKSBIUF9BUkNIPSJocHBhMi4wIiA7OyAgICMgSFAtVVggMTAuMjAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMgOzsKLSAgICAgICAgICAgICAgICAgICAgZXNhYwotCQlmaQotCQlpZiBbICIke0hQX0FSQ0h9IiA9ICIiIF07IHRoZW4KLQkJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQkJICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID4kZHVtbXkuYwotCi0gICAgICAgICAgICAgICNkZWZpbmUgX0hQVVhfU09VUkNFCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0gICAgICAgICAgICAgIGludCBtYWluICgpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgI2lmIGRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKQotICAgICAgICAgICAgICAgICAgbG9uZyBiaXRzID0gc3lzY29uZihfU0NfS0VSTkVMX0JJVFMpOwotICAgICAgICAgICAgICAjZW5kaWYKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0KLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY3B1KQotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6Ci0gICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKLSAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGJpdHMpCi0gICAgICAgICAgICAgIAkJewotICAgICAgICAgICAgICAJCWNhc2UgNjQ6IHB1dHMgKCJocHBhMi4wdyIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQljYXNlIDMyOiBwdXRzICgiaHBwYTIuMG4iKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJZGVmYXVsdDogcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAkJfSBicmVhazsKLSAgICAgICAgICAgICAgI2Vsc2UgIC8qICFkZWZpbmVkKF9TQ19LRVJORUxfQklUUykgKi8KLSAgICAgICAgICAgICAgCSAgICBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgI2VuZGlmCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkJICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jIDI+L2Rldi9udWxsKSAmJiBIUF9BUkNIPWAkZHVtbXlgCi0JCSAgICB0ZXN0IC16ICIkSFBfQVJDSCIgJiYgSFBfQVJDSD1ocHBhCi0JCWZpIDs7Ci0JZXNhYwotCWlmIFsgJHtIUF9BUkNIfSA9ICJocHBhMi4wdyIgXQotCXRoZW4KLQkgICAgIyBhdm9pZCBkb3VibGUgZXZhbHVhdGlvbiBvZiAkc2V0X2NjX2Zvcl9idWlsZAotCSAgICB0ZXN0IC1uICIkQ0NfRk9SX0JVSUxEIiB8fCBldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0JICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0pIHwgZ3JlcCBfX0xQNjRfXyA+L2Rldi9udWxsCi0JICAgIHRoZW4KLQkJSFBfQVJDSD0iaHBwYTIuMHciCi0JICAgIGVsc2UKLQkJSFBfQVJDSD0iaHBwYTY0IgotCSAgICBmaQotCWZpCi0JZWNobyAke0hQX0FSQ0h9LWhwLWhwdXgke0hQVVhfUkVWfQotCWV4aXQgMCA7OwotICAgIGlhNjQ6SFAtVVg6KjoqKQotCUhQVVhfUkVWPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLlswQl0qLy8nYAotCWVjaG8gaWE2NC1ocC1ocHV4JHtIUFVYX1JFVn0KLQlleGl0IDAgOzsKLSAgICAzMDUwKjpISS1VWDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI2luY2x1ZGUgPHVuaXN0ZC5oPgotCWludAotCW1haW4gKCkKLQl7Ci0JICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0JICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucwotCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKLQkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLwotCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChjcHUpCi0JCXsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQotCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7Ci0JICBleGl0ICgwKTsKLQl9Ci1FT0YKLQkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiAkZHVtbXkgJiYgZXhpdCAwCi0JZWNobyB1bmtub3duLWhpdGFjaGktaGl1eHdlMgotCWV4aXQgMCA7OwotICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC84Pz86NC4zYnNkOio6KikKLQllY2hvIGhwcGExLjAtaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KiB8ICozMDAwKjpNUEUvaVg6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1tcGVpeAotCWV4aXQgMCA7OwotICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1vc2YKLQlleGl0IDAgOzsKLSAgICBocDg/PzpPU0YxOio6KikKLQllY2hvIGhwcGExLjAtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaSo4NjpPU0YxOio6KikKLQlpZiBbIC14IC91c3Ivc2Jpbi9zeXN2ZXJzaW9uIF0gOyB0aGVuCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjFtawotCWVsc2UKLQkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMQotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGFyaXNjKjpMaXRlcyo6KjoqKQotCWVjaG8gaHBwYTEuMS1ocC1saXRlcwotCWV4aXQgMCA7OwotICAgIEMxKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzEqOiopCi0JZWNobyBjMS1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMyKjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzIqOiopCi0JaWYgZ2V0c3lzaW5mbyAtZiBzY2FsYXJfYWNjCi0JdGhlbiBlY2hvIGMzMi1jb252ZXgtYnNkCi0JZWxzZSBlY2hvIGMyLWNvbnZleC1ic2QKLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCi0JZWNobyBjMzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDMzgqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzgqOiopCi0JZWNobyBjMzgtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkM0KjoqKQotCWVjaG8gYzQtY29udmV4LWJzZAotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKltBLVpdOTA6KjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSBcCi0JfCBzZWQgLWUgJ3MvQ1JBWS4qXChbQS1aXTkwXCkvXDEvJyBcCi0JICAgICAgLWUgeS9BQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi9hYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei8gXAotCSAgICAgIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICBDUkFZKlRTOio6KjoqKQotCWVjaG8gdDkwLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUM0U6KjoqOiopCi0JZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpTVjE6KjoqOiopCi0JZWNobyBzdjEtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKLQlleGl0IDAgOzsKLSAgICAqOlVOSUNPUy9tcDoqOiopCi0JZWNobyBudjEtY3JheS11bmljb3NtcCR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXC5bXi5dKiQvLlgvJwotCWV4aXQgMCA7OwotICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCi0gICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKLSAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKLSAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgNTAwMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gInNwYXJjLWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKLQlleGl0IDAgOzsKLSAgICBpKjg2OkJTRC8zODY6KjoqIHwgaSo4NjpCU0QvT1M6KjoqIHwgKjpBc2NlbmRcIEVtYmVkZGVkL09TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzcGFyYyo6QlNEL09TOio6KikKLQllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOkZyZWVCU0Q6KjoqKQotCSMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgdXNlcyBnbGliYy4KLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQkjaWYgX19HTElCQ19fID49IDIKLQlMSUJDPWdudQotCSNlbHNlCi0JTElCQz0KLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKLQkjIEdOVS9LRnJlZUJTRCBzeXN0ZW1zIGhhdmUgYSAiayIgcHJlZml4IHRvIGluZGljYXRlIHdlIGFyZSB1c2luZwotCSMgRnJlZUJTRCdzIGtlcm5lbCwgYnV0IG5vdCB0aGUgY29tcGxldGUgT1MuCi0JY2FzZSAke0xJQkN9IGluIGdudSkga2VybmVsX29ubHk9J2snIDs7IGVzYWMKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi0ke2tlcm5lbF9vbmx5fWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgJHtMSUJDOistJExJQkN9Ci0JZXhpdCAwIDs7Ci0gICAgaSo6Q1lHV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBpKjpNSU5HVyo6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluZ3czMgotCWV4aXQgMCA7OwotICAgIGkqOlBXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1wdzMyCi0JZXhpdCAwIDs7Ci0gICAgeDg2OkludGVyaXgqOlszNF0qKQotCWVjaG8gaTU4Ni1wYy1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvXC4uKi8vJwotCWV4aXQgMCA7OwotICAgIFszNDVdODY6V2luZG93c185NToqIHwgWzM0NV04NjpXaW5kb3dzXzk4OiogfCBbMzQ1XTg2OldpbmRvd3NfTlQ6KikKLQllY2hvIGkke1VOQU1FX01BQ0hJTkV9LXBjLW1rcwotCWV4aXQgMCA7OwotICAgIGkqOldpbmRvd3NfTlQqOiogfCBQZW50aXVtKjpXaW5kb3dzX05UKjoqKQotCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KLQkjIEl0IGFsc28gY29uZmxpY3RzIHdpdGggcHJlLTIuMCB2ZXJzaW9ucyBvZiBBVCZUIFVXSU4uIFNob3VsZCB3ZQotCSMgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YgaTM4Nj8KLQllY2hvIGk1ODYtcGMtaW50ZXJpeAotCWV4aXQgMCA7OwotICAgIGkqOlVXSU4qOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXV3aW4KLQlleGl0IDAgOzsKLSAgICBwKjpDWUdXSU4qOiopCi0JZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCSMgdGhlIEdOVSBzeXN0ZW0KLQllY2hvIGBlY2hvICR7VU5BTUVfTUFDSElORX18c2VkIC1lICdzLFstL10uKiQsLCdgLXVua25vd24tZ251YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MsLy4qJCwsJ2AKLQlleGl0IDAgOzsKLSAgICAqOkdOVS8qOio6KikKLQkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQotCWV4aXQgMCA7OwotICAgIGkqODY6TWluaXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5peAotCWV4aXQgMCA7OwotICAgIGFybSo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGNyaXM6TGludXg6KjoqKQotCWVjaG8gY3Jpcy1heGlzLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGlhNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIG02OCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIG1pcHM6TGludXg6KjoqKQotCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYwotCSN1bmRlZiBDUFUKLQkjdW5kZWYgbWlwcwotCSN1bmRlZiBtaXBzZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzZWwKLQkjZWxzZQotCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCi0JQ1BVPW1pcHMKLQkjZWxzZQotCUNQVT0KLQkjZW5kaWYKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5DUFU9YAotCXRlc3QgeCIke0NQVX0iICE9IHggJiYgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IiAmJiBleGl0IDAKLQk7OwotICAgIG1pcHM2NDpMaW51eDoqOiopCi0JZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAotCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCi0JI3VuZGVmIENQVQotCSN1bmRlZiBtaXBzNjQKLQkjdW5kZWYgbWlwczY0ZWwKLQkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQotCUNQVT1taXBzNjRlbAotCSNlbHNlCi0JI2lmIGRlZmluZWQoX19NSVBTRUJfXykgfHwgZGVmaW5lZChfX01JUFNFQikgfHwgZGVmaW5lZChfTUlQU0VCKSB8fCBkZWZpbmVkKE1JUFNFQikKLQlDUFU9bWlwczY0Ci0JI2Vsc2UKLQlDUFU9Ci0JI2VuZGlmCi0JI2VuZGlmCi1FT0YKLQlldmFsIGAkQ0NfRk9SX0JVSUxEIC1FICRkdW1teS5jIDI+L2Rldi9udWxsIHwgZ3JlcCBeQ1BVPWAKLQl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIGVjaG8gIiR7Q1BVfS11bmtub3duLWxpbnV4LWdudSIgJiYgZXhpdCAwCi0JOzsKLSAgICBwcGM6TGludXg6KjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHBwYzY0OkxpbnV4Oio6KikKLQllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIGFscGhhOkxpbnV4Oio6KikKLQljYXNlIGBzZWQgLW4gJy9eY3B1IG1vZGVsL3MvXi4qOiBcKC4qXCkvXDEvcCcgPCAvcHJvYy9jcHVpbmZvYCBpbgotCSAgRVY1KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjUgOzsKLQkgIEVWNTYpICBVTkFNRV9NQUNISU5FPWFscGhhZXY1NiA7OwotCSAgUENBNTYpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgUENBNTcpIFVOQU1FX01BQ0hJTkU9YWxwaGFwY2E1NiA7OwotCSAgRVY2KSAgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjYgOzsKLQkgIEVWNjcpICBVTkFNRV9NQUNISU5FPWFscGhhZXY2NyA7OwotCSAgRVY2OCopIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY4IDs7Ci0gICAgICAgIGVzYWMKLQlvYmpkdW1wIC0tcHJpdmF0ZS1oZWFkZXJzIC9iaW4vc2ggfCBncmVwIGxkLnNvLjEgPi9kZXYvbnVsbAotCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQotCWV4aXQgMCA7OwotICAgIHBhcmlzYzpMaW51eDoqOiogfCBocHBhOkxpbnV4Oio6KikKLQkjIExvb2sgZm9yIENQVSBsZXZlbAotCWNhc2UgYGdyZXAgJ15jcHVbXmEtel0qOicgL3Byb2MvY3B1aW5mbyAyPi9kZXYvbnVsbCB8IGN1dCAtZCcgJyAtZjJgIGluCi0JICBQQTcqKSBlY2hvIGhwcGExLjEtdW5rbm93bi1saW51eC1nbnUgOzsKLQkgIFBBOCopIGVjaG8gaHBwYTIuMC11bmtub3duLWxpbnV4LWdudSA7OwotCSAgKikgICAgZWNobyBocHBhLXVua25vd24tbGludXgtZ251IDs7Ci0JZXNhYwotCWV4aXQgMCA7OwotICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCi0JZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4Ci0JZXhpdCAwIDs7Ci0gICAgc2g2NCo6TGludXg6KjoqKQotICAgIAllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBzaCo6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQotCWV4aXQgMCA7OwotICAgIHg4Nl82NDpMaW51eDoqOiopCi0JZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKLQlleGl0IDAgOzsKLSAgICBpKjg2OkxpbnV4Oio6KikKLQkjIFRoZSBCRkQgbGlua2VyIGtub3dzIHdoYXQgdGhlIGRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0IGlzLCBzbwotCSMgZmlyc3Qgc2VlIGlmIGl0IHdpbGwgdGVsbCB1cy4gY2QgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHRvIHByZXZlbnQKLQkjIHByb2JsZW1zIHdpdGggb3RoZXIgcHJvZ3JhbXMgb3IgZGlyZWN0b3JpZXMgY2FsbGVkIGBsZCcgaW4gdGhlIHBhdGguCi0JIyBTZXQgTENfQUxMPUMgdG8gZW5zdXJlIGxkIG91dHB1dHMgbWVzc2FnZXMgaW4gRW5nbGlzaC4KLQlsZF9zdXBwb3J0ZWRfdGFyZ2V0cz1gY2QgLzsgTENfQUxMPUMgbGQgLS1oZWxwIDI+JjEgXAotCQkJIHwgc2VkIC1uZSAnL3N1cHBvcnRlZCB0YXJnZXRzOi8hZAotCQkJCSAgICBzL1sgCV1bIAldKi8gL2cKLQkJCQkgICAgcy8uKnN1cHBvcnRlZCB0YXJnZXRzOiAqLy8KLQkJCQkgICAgcy8gLiovLwotCQkJCSAgICBwJ2AKLSAgICAgICAgY2FzZSAiJGxkX3N1cHBvcnRlZF90YXJnZXRzIiBpbgotCSAgZWxmMzItaTM4NikKLQkJVEVOVEFUSVZFPSIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudSIKLQkJOzsKLQkgIGEub3V0LWkzODYtbGludXgpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251YW91dCIKLQkJZXhpdCAwIDs7Ci0JICBjb2ZmLWkzODYpCi0JCWVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIKLQkJZXhpdCAwIDs7Ci0JICAiIikKLQkJIyBFaXRoZXIgYSBwcmUtQkZEIGEub3V0IGxpbmtlciAobGludXgtZ251b2xkbGQpIG9yCi0JCSMgb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCQllY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudW9sZGxkIgotCQlleGl0IDAgOzsKLQllc2FjCi0JIyBEZXRlcm1pbmUgd2hldGhlciB0aGUgZGVmYXVsdCBjb21waWxlciBpcyBhLm91dCBvciBlbGYKLQlldmFsICRzZXRfY2NfZm9yX2J1aWxkCi0Jc2VkICdzL14JLy8nIDw8IEVPRiA+JGR1bW15LmMKLQkjaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQkjaWZkZWYgX19FTEZfXwotCSMgaWZkZWYgX19HTElCQ19fCi0JIyAgaWYgX19HTElCQ19fID49IDIKLQlMSUJDPWdudQotCSMgIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyAgZW5kaWYKLQkjIGVsc2UKLQlMSUJDPWdudWxpYmMxCi0JIyBlbmRpZgotCSNlbHNlCi0JI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKLQlMSUJDPWdudQotCSNlbHNlCi0JTElCQz1nbnVhb3V0Ci0JI2VuZGlmCi0JI2VuZGlmCi0JI2lmZGVmIF9fZGlldGxpYmNfXwotCUxJQkM9ZGlldGxpYmMKLQkjZW5kaWYKLUVPRgotCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwIF5MSUJDPWAKLQl0ZXN0IHgiJHtMSUJDfSIgIT0geCAmJiBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LSR7TElCQ30iICYmIGV4aXQgMAotCXRlc3QgeCIke1RFTlRBVElWRX0iICE9IHggJiYgZWNobyAiJHtURU5UQVRJVkV9IiAmJiBleGl0IDAKLQk7OwotICAgIGkqODY6RFlOSVgvcHR4OjQqOiopCi0JIyBwdHggNC4wIGRvZXMgdW5hbWUgLXMgY29ycmVjdGx5LCB3aXRoIERZTklYL3B0eCBpbiB0aGVyZS4KLQkjIGVhcmxpZXIgdmVyc2lvbnMgYXJlIG1lc3NlZCB1cCBhbmQgcHV0IHRoZSBub2RlbmFtZSBpbiBib3RoCi0JIyBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLQllY2hvIGkzODYtc2VxdWVudC1zeXN2NAotCWV4aXQgMCA7OwotICAgIGkqODY6VU5JWF9TVjo0LjJNUDoyLiopCi0gICAgICAgICMgVW5peHdhcmUgaXMgYW4gb2Zmc2hvb3Qgb2YgU1ZSNCwgYnV0IGl0IGhhcyBpdHMgb3duIHZlcnNpb24KLSAgICAgICAgIyBudW1iZXIgc2VyaWVzIHN0YXJ0aW5nIHdpdGggMi4uLgotICAgICAgICAjIEkgYW0gbm90IHBvc2l0aXZlIHRoYXQgb3RoZXIgU1ZSNCBzeXN0ZW1zIHdvbid0IG1hdGNoIHRoaXMsCi0JIyBJIGp1c3QgaGF2ZSB0byBob3BlLiAgLS0gcm1zLgotICAgICAgICAjIFVzZSBzeXN2NC4ydXcuLi4gc28gdGhhdCBzeXN2NCogbWF0Y2hlcyBpdC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjQuMnV3JHtVTkFNRV9WRVJTSU9OfQotCWV4aXQgMCA7OwotICAgIGkqODY6T1MvMjoqOiopCi0JIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKLQkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAotCWV4aXQgMCA7OwotICAgIGkqODY6WFRTLTMwMDoqOlNUT1ApCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3RvcAotCWV4aXQgMCA7OwotICAgIGkqODY6YXRoZW9zOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hdGhlb3MKLQlleGl0IDAgOzsKLSAgICBpKjg2Okx5bnhPUzoyLio6KiB8IGkqODY6THlueE9TOjMuWzAxXSo6KiB8IGkqODY6THlueE9TOjQuMCo6KikKLQllY2hvIGkzODYtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqRE9TOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbXNkb3NkamdwcAotCWV4aXQgMCA7OwotICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCi0JVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCi0JaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KLQlmaQotCWV4aXQgMCA7OwotICAgIGkqODY6Kjo1Ols3OF0qKQotCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCi0JICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OwotCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKLQkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKLQllc2FjCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaSo4NjoqOjMuMjoqKQotCWlmIHRlc3QgLWYgL3Vzci9vcHRpb25zL2NiLm5hbWU7IHRoZW4KLQkJVU5BTUVfUkVMPWBzZWQgLW4gJ3MvLipWZXJzaW9uIC8vcCcgPC91c3Ivb3B0aW9ucy9jYi5uYW1lYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtaXNjJFVOQU1FX1JFTAotCWVsaWYgL2Jpbi91bmFtZSAtWCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9SRUw9YCgvYmluL3VuYW1lIC1YfGdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50ICpJSScgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCSgvYmluL3VuYW1lIC1YfGdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotCQkJJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zY28kVU5BTUVfUkVMCi0JZWxzZQotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lzdjMyCi0JZmkKLQlleGl0IDAgOzsKLSAgICBwYzoqOio6KikKLQkjIExlZnQgaGVyZSBmb3IgY29tcGF0aWJpbGl0eToKLSAgICAgICAgIyB1bmFtZSAtbSBwcmludHMgZm9yIERKR1BQIGFsd2F5cyAncGMnLCBidXQgaXQgcHJpbnRzIG5vdGhpbmcgYWJvdXQKLSAgICAgICAgIyB0aGUgcHJvY2Vzc29yLCBzbyB3ZSBwbGF5IHNhZmUgYnkgYXNzdW1pbmcgaTM4Ni4KLQllY2hvIGkzODYtcGMtbXNkb3NkamdwcAotICAgICAgICBleGl0IDAgOzsKLSAgICBJbnRlbDpNYWNoOjMqOiopCi0JZWNobyBpMzg2LXBjLW1hY2gzCi0JZXhpdCAwIDs7Ci0gICAgcGFyYWdvbjoqOio6KikKLQllY2hvIGk4NjAtaW50ZWwtb3NmMQotCWV4aXQgMCA7OwotICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKLQlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAotCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KLQkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBtaW5pKjpDVElYOlNZUyo1OiopCi0JIyAibWluaWZyYW1lIgotCWVjaG8gbTY4MDEwLWNvbnZlcmdlbnQtc3lzdgotCWV4aXQgMCA7OwotICAgIG1jNjhrOlVOSVg6U1lTVEVNNTozLjUxbSkKLQllY2hvIG02OGstY29udmVyZ2VudC1zeXN2Ci0JZXhpdCAwIDs7Ci0gICAgTTY4MD8wOkQtTklYOjUuMzoqKQotCWVjaG8gbTY4ay1kaWFiLWRuaXgKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCkKLQlPU19SRUw9JycKLQl0ZXN0IC1yIC9ldGMvLnJlbGlkIFwKLQkmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMAotCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAotCSAgJiYgZWNobyBpNTg2LW5jci1zeXN2NC4zJHtPU19SRUx9ICYmIGV4aXQgMCA7OwotICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQotICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLSAgICAgICAgICAmJiBlY2hvIGk0ODYtbmNyLXN5c3Y0ICYmIGV4aXQgMCA7OwotICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQotCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYzY4MDMwOlVOSVhfU3lzdGVtX1Y6NC4qOiopCi0JZWNobyBtNjhrLWF0YXJpLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgVFNVTkFNSTpMeW54T1M6Mi4qOiopCi0JZWNobyBzcGFyYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICByczYwMDA6THlueE9TOjIuKjoqKQotCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIFBvd2VyUEM6THlueE9TOjIuKjoqIHwgUG93ZXJQQzpMeW54T1M6My5bMDFdKjoqIHwgUG93ZXJQQzpMeW54T1M6NC4wKjoqKQotCWVjaG8gcG93ZXJwYy11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIFJNKjpTSU5JWC0qOio6KikKLQllY2hvIG1pcHMtc25pLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpTSU5JWC0qOio6KikKLQlpZiB1bmFtZSAtcCAyPi9kZXYvbnVsbCA+L2Rldi9udWxsIDsgdGhlbgotCQlVTkFNRV9NQUNISU5FPWAodW5hbWUgLXApIDI+L2Rldi9udWxsYAotCQllY2hvICR7VU5BTUVfTUFDSElORX0tc25pLXN5c3Y0Ci0JZWxzZQotCQllY2hvIG5zMzJrLXNuaS1zeXN2Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KLSAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAotICAgICAgICBleGl0IDAgOzsKLSAgICAqOlVOSVhfU3lzdGVtX1Y6NCo6RlRYKikKLQkjIEZyb20gR2VyYWxkIEhld2VzIDxoZXdlc0BvcGVubWFya2V0LmNvbT4uCi0JIyBIb3cgYWJvdXQgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gc3RyYXR1cyBhcmNoaXRlY3R1cmVzPyAtZGptCi0JZWNobyBocHBhMS4xLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICAqOio6KjpGVFgqKQotCSMgRnJvbSBzZWFuZkBzd2RjLnN0cmF0dXMuY29tLgotCWVjaG8gaTg2MC1zdHJhdHVzLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgKjpWT1M6KjoqKQotCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgotCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXZvcwotCWV4aXQgMCA7OwotICAgIG1jNjgqOkEvVVg6KjoqKQotCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbmV3cyo6TkVXUy1PUzo2KjoqKQotCWVjaG8gbWlwcy1zb255LW5ld3NvczYKLQlleGl0IDAgOzsKLSAgICBSWzM0XTAwMDoqU3lzdGVtX1YqOio6KiB8IFI0MDAwOlVOSVhfU1lTVjoqOiogfCBSKjAwMDpVTklYX1NWOio6KikKLQlpZiBbIC1kIC91c3IvbmVjIF07IHRoZW4KLQkgICAgICAgIGVjaG8gbWlwcy1uZWMtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQllbHNlCi0JICAgICAgICBlY2hvIG1pcHMtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYmUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlTWFjOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBNYWMgb3IgTWFjIGNsb25lLCBQUEMgb25seS4KLQllY2hvIHBvd2VycGMtYXBwbGUtYmVvcwotCWV4aXQgMCA7OwotICAgIEJlUEM6QmVPUzoqOiopCSMgQmVPUyBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCi0JZWNobyBpNTg2LXBjLWJlb3MKLQlleGl0IDAgOzsKLSAgICBTWC00OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC01OlNVUEVSLVVYOio6KikKLQllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTWC02OlNVUEVSLVVYOio6KikKLQllY2hvIHN4Ni1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBQb3dlcio6UmhhcHNvZHk6KjoqKQotCWVjaG8gcG93ZXJwYy1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOlJoYXBzb2R5Oio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEYXJ3aW46KjoqKQotCWNhc2UgYHVuYW1lIC1wYCBpbgotCSAgICAqODYpIFVOQU1FX1BST0NFU1NPUj1pNjg2IDs7Ci0JICAgIHBvd2VycGMpIFVOQU1FX1BST0NFU1NPUj1wb3dlcnBjIDs7Ci0JZXNhYwotCWVjaG8gJHtVTkFNRV9QUk9DRVNTT1J9LWFwcGxlLWRhcndpbiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICAqOnByb2NudG8qOio6KiB8ICo6UU5YOlswMTIzNDU2Nzg5XSo6KikKLQlVTkFNRV9QUk9DRVNTT1I9YHVuYW1lIC1wYAotCWlmIHRlc3QgIiRVTkFNRV9QUk9DRVNTT1IiID0gIng4NiI7IHRoZW4KLQkJVU5BTUVfUFJPQ0VTU09SPWkzODYKLQkJVU5BTUVfTUFDSElORT1wYwotCWZpCi0JZWNobyAke1VOQU1FX1BST0NFU1NPUn0tJHtVTkFNRV9NQUNISU5FfS1udG8tcW54JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgICo6UU5YOio6NCopCi0JZWNobyBpMzg2LXBjLXFueAotCWV4aXQgMCA7OwotICAgIE5TUi1bREdLTE5QVFZXWV06Tk9OU1RPUF9LRVJORUw6KjoqKQotCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpOb25TdG9wLVVYOio6KikKLQllY2hvIG1pcHMtY29tcGFxLW5vbnN0b3B1eAotCWV4aXQgMCA7OwotICAgIEJTMjAwMDpQT1NJWCo6KjoqKQotCWVjaG8gYnMyMDAwLXNpZW1lbnMtc3lzdgotCWV4aXQgMCA7OwotICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpQbGFuOToqOiopCi0JIyAidW5hbWUgLW0iIGlzIG5vdCBjb25zaXN0ZW50LCBzbyB1c2UgJGNwdXR5cGUgaW5zdGVhZC4gMzg2Ci0JIyBpcyBjb252ZXJ0ZWQgdG8gaTM4NiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciB4ODYKLQkjIG9wZXJhdGluZyBzeXN0ZW1zLgotCWlmIHRlc3QgIiRjcHV0eXBlIiA9ICIzODYiOyB0aGVuCi0JICAgIFVOQU1FX01BQ0hJTkU9aTM4NgotCWVsc2UKLQkgICAgVU5BTUVfTUFDSElORT0iJGNwdXR5cGUiCi0JZmkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1wbGFuOQotCWV4aXQgMCA7OwotICAgICo6VE9QUy0xMDoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLXRvcHMxMAotCWV4aXQgMCA7OwotICAgICo6VEVORVg6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAotCWV4aXQgMCA7OwotICAgIEtTMTA6VE9QUy0yMDoqOiogfCBLTDEwOlRPUFMtMjA6KjoqIHwgVFlQRTQ6VE9QUy0yMDoqOiopCi0JZWNobyBwZHAxMC1kZWMtdG9wczIwCi0JZXhpdCAwIDs7Ci0gICAgWEtMLTE6VE9QUy0yMDoqOiogfCBUWVBFNTpUT1BTLTIwOio6KikKLQllY2hvIHBkcDEwLXhrbC10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOlRPUFMtMjA6KjoqKQotCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKLQlleGl0IDAgOzsKLSAgICAqOklUUzoqOiopCi0JZWNobyBwZHAxMC11bmtub3duLWl0cwotCWV4aXQgMCA7OwotICAgIFNFSToqOio6U0VJVVgpCi0gICAgICAgIGVjaG8gbWlwcy1zZWktc2VpdXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpEUkFHT05GTFk6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseSR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLWVzYWMKLQotI2VjaG8gJyhObyB1bmFtZSBjb21tYW5kIG9yIHVuYW1lIG91dHB1dCBub3QgcmVjb2duaXplZC4pJyAxPiYyCi0jZWNobyAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiAxPiYyCi0KLWV2YWwgJHNldF9jY19mb3JfYnVpbGQKLWNhdCA+JGR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgaWYgKHZlcnNpb24gPCA0KQotICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOwotICBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKLSNpZiBkZWZpbmVkIChVTUFYVikKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoQ01VKQotICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX18zODZCU0RfXykKLSAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoc2VxdWVudCkKLSNpZiBkZWZpbmVkIChpMzg2KQotICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2lmIGRlZmluZWQgKG5zMzIwMDApCi0gIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCi0gICAgc3RydWN0IHV0c25hbWUgdW47Ci0KLSAgICB1bmFtZSgmdW4pOwotCi0gICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgewotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCi0JcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKLSAgICB9Ci0gICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOwotCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHZheCkKLSMgaWYgIWRlZmluZWQgKHVsdHJpeCkKLSMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgaWYgZGVmaW5lZCAoQlNEKQotIyAgIGlmIEJTRCA9PSA0MwotICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKLSMgICBlbHNlCi0jICAgIGlmIEJTRCA9PSAxOTkwMDYKLSAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOwotIyAgICBlbHNlCi0gICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbHNlCi0gICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSMgIGVuZGlmCi0jIGVsc2UKLSAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQotICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotICBleGl0ICgxKTsKLX0KLUVPRgotCi0kQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiAkZHVtbXkgJiYgZXhpdCAwCi0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KLQotIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQotCi1pZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQotdGhlbgotICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCi0gICAgYzEqKQotCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMyKikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzM4KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzQqKQotCWVjaG8gYzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGVzYWMKLWZpCi0KLWNhdCA+JjIgPDxFT0YKLSQwOiB1bmFibGUgdG8gZ3Vlc3Mgc3lzdGVtIHR5cGUKLQotVGhpcyBzY3JpcHQsIGxhc3QgbW9kaWZpZWQgJHRpbWVzdGFtcCwgaGFzIGZhaWxlZCB0byByZWNvZ25pemUKLXRoZSBvcGVyYXRpbmcgc3lzdGVtIHlvdSBhcmUgdXNpbmcuIEl0IGlzIGFkdmlzZWQgdGhhdCB5b3UKLWRvd25sb2FkIHRoZSBtb3N0IHVwIHRvIGRhdGUgdmVyc2lvbiBvZiB0aGUgY29uZmlnIHNjcmlwdHMgZnJvbQotCi0gICAgZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9jb25maWcvCi0KLUlmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQotc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKLXBlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCi1pbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCi0KLWNvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCi0KLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAotL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAotCi1ob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAotL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKLS91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAotL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCi0KLVVOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9Ci1VTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQotVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQotVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KLUVPRgotCi1leGl0IDEKLQotIyBMb2NhbCB2YXJpYWJsZXM6Ci0jIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKLSMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgotIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCi0jIHRpbWUtc3RhbXAtZW5kOiAiJyIKLSMgRW5kOgpkaWZmIC0tZ2l0IGEvY29uZmlnLmggYi9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiYTUzYi4uMDAwMDAwMAotLS0gYS9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1MSArMCwwIEBACi0vKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCi0vKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLS8qICJnZW5lcmF0ZWQgYXV0b21hdGljYWxseSIgbWVhbnMgRE8gTk9UIE1BS0UgQ0hBTkdFUyBUTyBjb25maWcuaC5pbiAtLQotICogbWFrZSB0aGVtIHRvIGFjY29uZmlnLmggYW5kIHJlcnVuIGF1dG9oZWFkZXIgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIFNTTGVheSAwLjkuMGIgd2l0aCB0aGUgYnVnZ3kgY2FzdDEyOC4gKi8KLS8qICN1bmRlZiBIQVZFX0JVR0dZX0NBU1QxMjggKi8KLQotLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgSVB2NiBzdXBwb3J0ICovCi0jZGVmaW5lIElORVQ2IDEKLQotLyogRGVmaW5lIGlmIHlvdSBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGxpYnNtaS4gKi8KLS8qICN1bmRlZiBMSUJTTUkgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c21pLmg+IGhlYWRlciBmaWxlLiAgKi8KLS8qICN1bmRlZiBIQVZFX1NNSV9IICovCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3QgX19yZXNfc3RhdGVfZXh0ICovCi0vKiAjdW5kZWYgSEFWRV9SRVNfU1RBVEVfRVhUICovCi0KLS8qIGRlZmluZSBpZiB5b3VyIHN0cnVjdCBfX3Jlc19zdGF0ZSBoYXMgdGhlIG5zb3J0IG1lbWJlciAqLwotLyogI3VuZGVmIEhBVkVfTkVXX1JFU19TVEFURSAqLwotCi0vKgotICogZGVmaW5lIGlmIHN0cnVjdCBldGhlcl9oZWFkZXIuZXRoZXJfZGhvc3QgaXMgYSBzdHJ1Y3Qgd2l0aCBldGhlcl9hZGRyX29jdGV0Ci0gKi8KLS8qICN1bmRlZiBFVEhFUl9IRUFERVJfSEFTX0VBICovCi0KLS8qIGRlZmluZSBpZiBzdHJ1Y3QgZXRoZXJfYXJwIGNvbnRhaW5zIGFycF94c2hhICovCi0vKiAjdW5kZWYgRVRIRVJfQVJQX0hBU19YICovCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWRkcmluZm8gZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfQUREUklORk8gMQotCi0vKiBkZWZpbmUgaWYgeW91IG5lZWQgdG8gaW5jbHVkZSBtaXNzaW5nL2FkZHJpbmZvaC5oLiAqLwotLyogI3VuZGVmIE5FRURfQUREUklORk9fSCAqLwotCi0vKiBkZWZpbmUgaWZ5b3UgaGF2ZSB0aGUgaF9lcnJubyB2YXJpYWJsZS4gKi8KLSNkZWZpbmUgSEFWRV9IX0VSUk5PIDEKLQotLyogZGVmaW5lIGlmIElONkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLwotI2RlZmluZSBIQVZFX0lONkFERFJTWiAxCi0KLS8qIGRlZmluZSBpZiBJTkFERFJTWiBpcyBkZWZpbmVkIChYWFggbm90IHVzZWQhKSAqLwotI2RlZmluZSBIQVZFX0lOQUREUlNaIDEKLQotLyogZGVmaW5lIGlmIHRoaXMgaXMgYSBkZXZlbG9wbWVudCB2ZXJzaW9uLCB0byB1c2UgYWRkaXRpb25hbCBwcm90b3R5cGVzLiAqLwotLyogI3VuZGVmIEhBVkVfT1NfUFJPVE9fSCAqLwotCi0vKiBkZWZpbmUgaWYgPHVuaXN0ZC5oPiBkZWZpbmVzIF9fUCgpICovCi0vKiAjdW5kZWYgSEFWRV9QT1JUQUJMRV9QUk9UT1RZUEUgKi8KLQotLyogZGVmaW5lIGlmIFJFU19VU0VfSU5FVDYgaXMgZGVmaW5lZCAqLwotI2RlZmluZSBIQVZFX1JFU19VU0VfSU5FVDYgMQotCi0vKiBkZWZpbmUgaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLwotLyogI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOICovCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqLwotI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMQotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgYm90aCBnZXRpcG5vZGVieW5hbWUoKSBhbmQgZ2V0aXBub2RlYnlhZGRyKCkgKi8KLS8qICN1bmRlZiBVU0VfR0VUSVBOT0RFQlkgKi8KLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGV0aGVyX250b2hvc3QoKSBhbmQgaXQgd29ya3MgKi8KLS8qICN1bmRlZiBVU0VfRVRIRVJfTlRPSE9TVCAqLwotCi0vKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF92ZXJzaW9uICovCi0vKiAjdW5kZWYgSEFWRV9QQ0FQX1ZFUlNJT04gKi8KLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGVidWcgKi8KLS8qICN1bmRlZiBIQVZFX1BDQVBfREVCVUcgKi8KLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHl5ZGVidWcgKi8KLS8qICN1bmRlZiBIQVZFX1lZREVCVUcgKi8KLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfbGlzdF9kYXRhbGlua3MoKSAqLwotI2RlZmluZSBIQVZFX1BDQVBfTElTVF9EQVRBTElOS1MgMQotCi0vKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9zZXRfZGF0YWxpbmsoKSAqLwotI2RlZmluZSBIQVZFX1BDQVBfU0VUX0RBVEFMSU5LIDEKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKSAqLwotI2RlZmluZSBIQVZFX1BDQVBfREFUQUxJTktfTkFNRV9UT19WQUwgMQotCi0vKiBkZWZpbmUgaWYgbGlicGNhcCBoYXMgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oKSAqLwotI2RlZmluZSBIQVZFX1BDQVBfREFUQUxJTktfVkFMX1RPX0RFU0NSSVBUSU9OIDEKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZHVtcF9mdGVsbCgpICovCi0jZGVmaW5lIEhBVkVfUENBUF9EVU1QX0ZURUxMIDEKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGdldHJwY2J5bnVtYmVyKCkgKi8KLS8qICN1bmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSICovCi0KLS8qIGRlZmluZSBpZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIGZhaWwgKi8KLSNkZWZpbmUgTEJMX0FMSUdOIDEKLQotLyogVGhlIHN1Y2Nlc3NmdWwgcmV0dXJuIHZhbHVlIGZyb20gc2lnbmFsICg/KVhYWCAqLwotI2RlZmluZSBSRVRTSUdWQUwgCi0KLS8qIERlZmluZSB0aGlzIG9uIElSSVggKi8KLS8qICN1bmRlZiBfQlNEX1NJR05BTFMgKi8KLQotLyogRm9yIEhQL1VYIEFOU0kgY29tcGlsZXI/ICovCi0vKiAjdW5kZWYgX0hQVVhfU09VUkNFICovCi0KLS8qIEFJWCBoYWNrLiAqLwotLyogI3VuZGVmIF9TVU4gKi8KLQotLyogV29ya2Fyb3VuZCBmb3IgbWlzc2luZyA2NC1iaXQgZm9ybWF0cyAqLwotLyogI3VuZGVmIFBSSWQ2NCAqLwotLyogI3VuZGVmIFBSSW82NCAqLwotLyogI3VuZGVmIFBSSXg2NCAqLwotLyogI3VuZGVmIFBSSXU2NCAqLwotCi0vKiBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlciAqLwotI2RlZmluZSBUQ1BEVU1QX0RPX1NNQiAxCi0KLS8qIExvbmcgc3Rvcnkgc2hvcnQ6IGFjbG9jYWwubTQgZGVwZW5kcyBvbiBhdXRvY29uZiAyLjEzCi0gKiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHdydCAiY29uc3QiOyBuZXdlciB2ZXJzaW9ucwotICogaGF2ZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscyBzbyBmb3Igbm93IHdlCi0gKiBwdXQgImNvbnN0IiBoZXJlLiAgVGhpcyBtYXkgY2F1c2UgZHVwbGljYXRlIGRlZmluaXRpb25zCi0gKiBpbiBjb25maWcuaCBidXQgdGhhdCBzaG91bGQgYmUgT0sgc2luY2UgdGhleSdyZSB0aGUgc2FtZS4KLSAqLwotLyogI3VuZGVmIGNvbnN0ICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZG5ldF9odG9hIGZ1bmN0aW9uLiAgKi8KLS8qICN1bmRlZiBIQVZFX0RORVRfSFRPQSAqLwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gPG5ldGRuZXQvZG5ldGRiLmg+LiAgKi8KLS8qICN1bmRlZiBIQVZFX05FVERORVRfRE5FVERCX0hfRE5FVF9IVE9BICovCi0KLS8qIGRlZmluZSBpZiBzaG91bGQgZHJvcCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQgKi8KLS8qICN1bmRlZiBXSVRIX1VTRVIgKi8KLQotLyogZGVmaW5lIGlmIHNob3VsZCBjaHJvb3Qgd2hlbiBkcm9wcGluZyBwcml2aWxlZ2VzICovCi0vKiAjdW5kZWYgV0lUSF9DSFJPT1QgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhbGFybScgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfQUxBUk0gMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJwZl9kdW1wJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9CUEZfRFVNUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfbnRvaG9zdCcsIGFuZCB0byAwIGlmIHlvdQotICAgZG9uJ3QuICovCi0jZGVmaW5lIEhBVkVfREVDTF9FVEhFUl9OVE9IT1NUIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBldGhlcl9udG9ob3N0JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9FVEhFUl9OVE9IT1NUIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRhZGRyaW5mbycgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9HRVRBRERSSU5GTyAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG5hbWVpbmZvJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX0dFVE5BTUVJTkZPICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY3J5cHRvJyBsaWJyYXJ5ICgtbGNyeXB0bykuICovCi0jZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBycGMnIGxpYnJhcnkgKC1scnBjKS4gKi8KLS8qICN1bmRlZiBIQVZFX0xJQlJQQyAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNtaScgbGlicmFyeSAoLWxzbWkpLiAqLwotLyogI3VuZGVmIEhBVkVfTElCU01JICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRkbmV0L2RuZXRkYi5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX05FVERORVRfRE5FVERCX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2V0aGVyLmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX05FVElORVRfRVRIRVJfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0aW5ldC9pZl9ldGhlci5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9wZnZhci5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX05FVF9QRlZBUl9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8b3BlbnNzbC9ldnAuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfT1BFTlNTTF9FVlBfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9icmVha2xvb3AnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1BDQVBfQlJFQUtMT09QIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwY2FwX2R1bXBfZmx1c2gnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1BDQVBfRFVNUF9GTFVTSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9maW5kYWxsZGV2cycgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfUENBUF9GSU5EQUxMREVWUyAxCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBwY2FwX2lmX3QnLiAqLwotI2RlZmluZSBIQVZFX1BDQVBfSUZfVCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGNhcF9saWJfdmVyc2lvbicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfUENBUF9MSUJfVkVSU0lPTiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGZvcGVuJyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1BGT1BFTiAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHJwYy9ycGNlbnQuaD4gaGVhZGVyIGZpbGUuICovCi0vKiAjdW5kZWYgSEFWRV9SUENfUlBDRU5UX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRsaW5lYnVmJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TRVRMSU5FQlVGIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdhY3Rpb24nIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NJR0FDVElPTiAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnc2V0JyBmdW5jdGlvbi4gKi8KLS8qICN1bmRlZiBIQVZFX1NJR1NFVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNtaS5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NNSV9IICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RESU5UX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJEVVAgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmZ0aW1lJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJGVElNRSAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNhdCcgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TVFJMQ0FUICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNweScgZnVuY3Rpb24uICovCi0vKiAjdW5kZWYgSEFWRV9TVFJMQ1BZICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3Ryc2VwJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9TVFJTRVAgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgc3RydWN0IGV0aGVyX2FkZHInLiAqLwotLyogI3VuZGVmIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIgKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYml0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qICN1bmRlZiBIQVZFX1NZU19CSVRZUEVTX0ggKi8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdmZwcmludGYnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1ZGUFJJTlRGIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2c25wcmludGYnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX1ZTTlBSSU5URiAxCi0KLS8qIGRlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBfX2F0dHJpYnV0ZV9fICovCi0jZGVmaW5lIEhBVkVfX19BVFRSSUJVVEVfXyAxCi0KLS8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfbnRvaG9zdCcgKi8KLS8qICN1bmRlZiBORVRJTkVUX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfTlRPSE9TVCAqLwotCi0vKiBEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2lmX2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX250b2hvc3QnICovCi0vKiAjZGVmaW5lIE5FVElORVRfSUZfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9OVE9IT1NUICovCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfTkFNRSAiIgotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICIiCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICIiCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiIgotCi0vKiBEZWZpbmUgYXMgdGhlIHJldHVybiB0eXBlIG9mIHNpZ25hbCBoYW5kbGVycyAoYGludCcgb3IgYHZvaWQnKS4gKi8KLSNkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCi0KLS8qIFRoZSBzaXplIG9mIGBjaGFyJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI2RlZmluZSBTSVpFT0ZfQ0hBUiAxCi0KLS8qIFRoZSBzaXplIG9mIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0jZGVmaW5lIFNJWkVPRl9JTlQgNAotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSNkZWZpbmUgU0laRU9GX0xPTkcgNAotCi0vKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HIDgKLQotLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI2RlZmluZSBTSVpFT0ZfU0hPUlQgMgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICovCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi0KLS8qIERlZmluZSBhcyB0b2tlbiBmb3IgaW5saW5lIGlmIGlubGluaW5nIHN1cHBvcnRlZCAqLwotI2RlZmluZSBpbmxpbmUgaW5saW5lCi0KLS8qIERlZmluZSB0byBgc2hvcnQnIGlmIGludDE2X3Qgbm90IGRlZmluZWQuICovCi0vKiAjdW5kZWYgaW50MTZfdCAqLwotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgaW50MzJfdCBub3QgZGVmaW5lZC4gKi8KLS8qICN1bmRlZiBpbnQzMl90ICovCi0KLS8qIERlZmluZSB0byBgbG9uZyBsb25nJyBpZiBpbnQ2NF90IG5vdCBkZWZpbmVkLiAqLwotLyogI3VuZGVmIGludDY0X3QgKi8KLQotLyogRGVmaW5lIHRvIGBzaWduZWQgY2hhcicgaWYgaW50OF90IG5vdCBkZWZpbmVkLiAqLwotLyogI3VuZGVmIGludDhfdCAqLwotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkIHNob3J0JyBpZiB1X2ludDE2X3Qgbm90IGRlZmluZWQuICovCi0vKiAjdW5kZWYgdV9pbnQxNl90ICovCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiB1X2ludDMyX3Qgbm90IGRlZmluZWQuICovCi0vKiAjdW5kZWYgdV9pbnQzMl90ICovCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuICovCi0vKiAjdW5kZWYgdV9pbnQ2NF90ICovCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgY2hhcicgaWYgdV9pbnQ4X3Qgbm90IGRlZmluZWQuICovCi0vKiAjdW5kZWYgdV9pbnQ4X3QgKi8KZGlmZiAtLWdpdCBhL2NvbmZpZy5oLmluIGIvY29uZmlnLmguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZmZlMDYuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmguaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0vKiAiZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkiIG1lYW5zIERPIE5PVCBNQUtFIENIQU5HRVMgVE8gY29uZmlnLmguaW4gLS0KLSAqIG1ha2UgdGhlbSB0byBhY2NvbmZpZy5oIGFuZCByZXJ1biBhdXRvaGVhZGVyICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBTU0xlYXkgMC45LjBiIHdpdGggdGhlIGJ1Z2d5IGNhc3QxMjguICovCi0jdW5kZWYgSEFWRV9CVUdHWV9DQVNUMTI4Ci0KLS8qIERlZmluZSBpZiB5b3UgZW5hYmxlIElQdjYgc3VwcG9ydCAqLwotI3VuZGVmIElORVQ2Ci0KLS8qIERlZmluZSBpZiB5b3UgZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBsaWJzbWkuICovCi0jdW5kZWYgTElCU01JCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHNtaS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TTUlfSAotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IF9fcmVzX3N0YXRlX2V4dCAqLwotI3VuZGVmIEhBVkVfUkVTX1NUQVRFX0VYVAotCi0vKiBkZWZpbmUgaWYgeW91ciBzdHJ1Y3QgX19yZXNfc3RhdGUgaGFzIHRoZSBuc29ydCBtZW1iZXIgKi8KLSN1bmRlZiBIQVZFX05FV19SRVNfU1RBVEUKLQotLyoKLSAqIGRlZmluZSBpZiBzdHJ1Y3QgZXRoZXJfaGVhZGVyLmV0aGVyX2Rob3N0IGlzIGEgc3RydWN0IHdpdGggZXRoZXJfYWRkcl9vY3RldAotICovCi0jdW5kZWYgRVRIRVJfSEVBREVSX0hBU19FQQotCi0vKiBkZWZpbmUgaWYgc3RydWN0IGV0aGVyX2FycCBjb250YWlucyBhcnBfeHNoYSAqLwotI3VuZGVmIEVUSEVSX0FSUF9IQVNfWAotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgdGhlIGFkZHJpbmZvIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQUREUklORk8KLQotLyogZGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluY2x1ZGUgbWlzc2luZy9hZGRyaW5mb2guaC4gKi8KLSN1bmRlZiBORUVEX0FERFJJTkZPX0gKLQotLyogZGVmaW5lIGlmeW91IGhhdmUgdGhlIGhfZXJybm8gdmFyaWFibGUuICovCi0jdW5kZWYgSEFWRV9IX0VSUk5PCi0KLS8qIGRlZmluZSBpZiBJTjZBRERSU1ogaXMgZGVmaW5lZCAoWFhYIG5vdCB1c2VkISkgKi8KLSN1bmRlZiBIQVZFX0lONkFERFJTWgotCi0vKiBkZWZpbmUgaWYgSU5BRERSU1ogaXMgZGVmaW5lZCAoWFhYIG5vdCB1c2VkISkgKi8KLSN1bmRlZiBIQVZFX0lOQUREUlNaCi0KLS8qIGRlZmluZSBpZiB0aGlzIGlzIGEgZGV2ZWxvcG1lbnQgdmVyc2lvbiwgdG8gdXNlIGFkZGl0aW9uYWwgcHJvdG90eXBlcy4gKi8KLSN1bmRlZiBIQVZFX09TX1BST1RPX0gKLQotLyogZGVmaW5lIGlmIDx1bmlzdGQuaD4gZGVmaW5lcyBfX1AoKSAqLwotI3VuZGVmIEhBVkVfUE9SVEFCTEVfUFJPVE9UWVBFCi0KLS8qIGRlZmluZSBpZiBSRVNfVVNFX0lORVQ2IGlzIGRlZmluZWQgKi8KLSN1bmRlZiBIQVZFX1JFU19VU0VfSU5FVDYKLQotLyogZGVmaW5lIGlmIHN0cnVjdCBzb2NrYWRkciBoYXMgdGhlIHNhX2xlbiBtZW1iZXIgKi8KLSN1bmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCi0vKiBkZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKi8KLSN1bmRlZiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UKLQotLyogZGVmaW5lIGlmIHlvdSBoYXZlIGJvdGggZ2V0aXBub2RlYnluYW1lKCkgYW5kIGdldGlwbm9kZWJ5YWRkcigpICovCi0jdW5kZWYgVVNFX0dFVElQTk9ERUJZCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBldGhlcl9udG9ob3N0KCkgYW5kIGl0IHdvcmtzICovCi0jdW5kZWYgVVNFX0VUSEVSX05UT0hPU1QKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfdmVyc2lvbiAqLwotI3VuZGVmIEhBVkVfUENBUF9WRVJTSU9OCi0KLS8qIGRlZmluZSBpZiBsaWJwY2FwIGhhcyBwY2FwX2RlYnVnICovCi0jdW5kZWYgSEFWRV9QQ0FQX0RFQlVHCi0KLS8qIGRlZmluZSBpZiBsaWJwY2FwIGhhcyB5eWRlYnVnICovCi0jdW5kZWYgSEFWRV9ZWURFQlVHCi0KLS8qIGRlZmluZSBpZiBsaWJwY2FwIGhhcyBwY2FwX2xpc3RfZGF0YWxpbmtzKCkgKi8KLSN1bmRlZiBIQVZFX1BDQVBfTElTVF9EQVRBTElOS1MKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfc2V0X2RhdGFsaW5rKCkgKi8KLSN1bmRlZiBIQVZFX1BDQVBfU0VUX0RBVEFMSU5LCi0KLS8qIGRlZmluZSBpZiBsaWJwY2FwIGhhcyBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKCkgKi8KLSN1bmRlZiBIQVZFX1BDQVBfREFUQUxJTktfTkFNRV9UT19WQUwKLQotLyogZGVmaW5lIGlmIGxpYnBjYXAgaGFzIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKCkgKi8KLSN1bmRlZiBIQVZFX1BDQVBfREFUQUxJTktfVkFMX1RPX0RFU0NSSVBUSU9OCi0KLS8qIGRlZmluZSBpZiBsaWJwY2FwIGhhcyBwY2FwX2R1bXBfZnRlbGwoKSAqLwotI3VuZGVmIEhBVkVfUENBUF9EVU1QX0ZURUxMCi0KLS8qIGRlZmluZSBpZiB5b3UgaGF2ZSBnZXRycGNieW51bWJlcigpICovCi0jdW5kZWYgSEFWRV9HRVRSUENCWU5VTUJFUgotCi0vKiBkZWZpbmUgaWYgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyBmYWlsICovCi0jdW5kZWYgTEJMX0FMSUdOCi0KLS8qIFRoZSBzdWNjZXNzZnVsIHJldHVybiB2YWx1ZSBmcm9tIHNpZ25hbCAoPylYWFggKi8KLSN1bmRlZiBSRVRTSUdWQUwKLQotLyogRGVmaW5lIHRoaXMgb24gSVJJWCAqLwotI3VuZGVmIF9CU0RfU0lHTkFMUwotCi0vKiBGb3IgSFAvVVggQU5TSSBjb21waWxlcj8gKi8KLSN1bmRlZiBfSFBVWF9TT1VSQ0UKLQotLyogQUlYIGhhY2suICovCi0jdW5kZWYgX1NVTgotCi0vKiBXb3JrYXJvdW5kIGZvciBtaXNzaW5nIDY0LWJpdCBmb3JtYXRzICovCi0jdW5kZWYgUFJJZDY0Ci0jdW5kZWYgUFJJbzY0Ci0jdW5kZWYgUFJJeDY0Ci0jdW5kZWYgUFJJdTY0Ci0KLS8qIFdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgdGhlIHBvc3NpYmx5LWJ1Z2d5IFNNQiBwcmludGVyICovCi0jdW5kZWYgVENQRFVNUF9ET19TTUIKLQotLyogTG9uZyBzdG9yeSBzaG9ydDogYWNsb2NhbC5tNCBkZXBlbmRzIG9uIGF1dG9jb25mIDIuMTMKLSAqIGltcGxlbWVudGF0aW9uIGRldGFpbHMgd3J0ICJjb25zdCI7IG5ld2VyIHZlcnNpb25zCi0gKiBoYXZlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHNvIGZvciBub3cgd2UKLSAqIHB1dCAiY29uc3QiIGhlcmUuICBUaGlzIG1heSBjYXVzZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMKLSAqIGluIGNvbmZpZy5oIGJ1dCB0aGF0IHNob3VsZCBiZSBPSyBzaW5jZSB0aGV5J3JlIHRoZSBzYW1lLgotICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkbmV0X2h0b2EgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRE5FVF9IVE9BCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIGRuZXRfaHRvYSBkZWNsYXJhdGlvbiBpbiA8bmV0ZG5ldC9kbmV0ZGIuaD4uICAqLwotI3VuZGVmIEhBVkVfTkVURE5FVF9ETkVUREJfSF9ETkVUX0hUT0EKLQotLyogZGVmaW5lIGlmIHNob3VsZCBkcm9wIHByaXZpbGVnZXMgYnkgZGVmYXVsdCAqLwotI3VuZGVmIFdJVEhfVVNFUgotCi0vKiBkZWZpbmUgaWYgc2hvdWxkIGNocm9vdCB3aGVuIGRyb3BwaW5nIHByaXZpbGVnZXMgKi8KLSN1bmRlZiBXSVRIX0NIUk9PVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFsYXJtJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0FMQVJNCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYnBmX2R1bXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfQlBGX0RVTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBldGhlcl9udG9ob3N0JywgYW5kIHRvIDAgaWYgeW91Ci0gICBkb24ndC4gKi8KLSN1bmRlZiBIQVZFX0RFQ0xfRVRIRVJfTlRPSE9TVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGV0aGVyX250b2hvc3QnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfRVRIRVJfTlRPSE9TVAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGFkZHJpbmZvJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX0dFVEFERFJJTkZPCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0bmFtZWluZm8nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfR0VUTkFNRUlORk8KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX0lOVFRZUEVTX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjcnlwdG8nIGxpYnJhcnkgKC1sY3J5cHRvKS4gKi8KLSN1bmRlZiBIQVZFX0xJQkNSWVBUTwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJwYycgbGlicmFyeSAoLWxycGMpLiAqLwotI3VuZGVmIEhBVkVfTElCUlBDCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc21pJyBsaWJyYXJ5ICgtbHNtaSkuICovCi0jdW5kZWYgSEFWRV9MSUJTTUkKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGRuZXQvZG5ldGRiLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkVURE5FVF9ETkVUREJfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvZXRoZXIuaD4gaGVhZGVyIGZpbGUuICovCi0jdW5kZWYgSEFWRV9ORVRJTkVUX0VUSEVSX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2lmX2V0aGVyLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0L3BmdmFyLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfTkVUX1BGVkFSX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxvcGVuc3NsL2V2cC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX09QRU5TU0xfRVZQX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwY2FwX2JyZWFrbG9vcCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9QQ0FQX0JSRUFLTE9PUAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBjYXBfZHVtcF9mbHVzaCcgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9QQ0FQX0RVTVBfRkxVU0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwY2FwX2ZpbmRhbGxkZXZzJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1BDQVBfRklOREFMTERFVlMKLQotLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHBjYXBfaWZfdCcuICovCi0jdW5kZWYgSEFWRV9QQ0FQX0lGX1QKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwY2FwX2xpYl92ZXJzaW9uJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1BDQVBfTElCX1ZFUlNJT04KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwZm9wZW4nIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfUEZPUEVOCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cnBjL3JwY2VudC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1JQQ19SUENFTlRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGxpbmVidWYnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0VUTElORUJVRgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ2FjdGlvbicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TSUdBQ1RJT04KLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdzZXQnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU0lHU0VUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c21pLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU01JX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9TTlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NURElOVF9ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjYXNlY21wJyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJkdXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRFVQCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZnRpbWUnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSRlRJTUUKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJsY2F0JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUUkxDQVQKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJsY3B5JyBmdW5jdGlvbi4gKi8KLSN1bmRlZiBIQVZFX1NUUkxDUFkKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzZXAnIGZ1bmN0aW9uLiAqLwotI3VuZGVmIEhBVkVfU1RSU0VQCi0KLS8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgZXRoZXJfYWRkcicuICovCi0jdW5kZWYgSEFWRV9TVFJVQ1RfRVRIRVJfQUREUgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9iaXR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfU1lTX1NUQVRfSAotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSN1bmRlZiBIQVZFX1NZU19UWVBFU19ICi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2ZnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9WRlBSSU5URgotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCi0jdW5kZWYgSEFWRV9WU05QUklOVEYKLQotLyogZGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgaGFzIF9fYXR0cmlidXRlX18gKi8KLSN1bmRlZiBIQVZFX19fQVRUUklCVVRFX18KLQotLyogRGVmaW5lIHRvIDEgaWYgbmV0aW5ldC9ldGhlci5oIGRlY2xhcmVzIGBldGhlcl9udG9ob3N0JyAqLwotI3VuZGVmIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9OVE9IT1NUCi0KLS8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvaWZfZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfbnRvaG9zdCcgKi8KLSN1bmRlZiBORVRJTkVUX0lGX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfTlRPSE9TVAotCi0vKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KLSN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVAotCi0vKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9OQU1FCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSN1bmRlZiBQQUNLQUdFX1NUUklORwotCi0vKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9UQVJOQU1FCi0KLS8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCi0jdW5kZWYgUEFDS0FHRV9WRVJTSU9OCi0KLS8qIERlZmluZSBhcyB0aGUgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIChgaW50JyBvciBgdm9pZCcpLiAqLwotI3VuZGVmIFJFVFNJR1RZUEUKLQotLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0jdW5kZWYgU0laRU9GX0NIQVIKLQotLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSN1bmRlZiBTSVpFT0ZfSU5UCi0KLS8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwotI3VuZGVmIFNJWkVPRl9MT05HCi0KLS8qIFRoZSBzaXplIG9mIGBsb25nIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0jdW5kZWYgU0laRU9GX0xPTkdfTE9ORwotCi0vKiBUaGUgc2l6ZSBvZiBgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0jdW5kZWYgU0laRU9GX1NIT1JUCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8KLSN1bmRlZiBUSU1FX1dJVEhfU1lTX1RJTUUKLQotLyogRGVmaW5lIGFzIHRva2VuIGZvciBpbmxpbmUgaWYgaW5saW5pbmcgc3VwcG9ydGVkICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgc2hvcnQnIGlmIGludDE2X3Qgbm90IGRlZmluZWQuICovCi0jdW5kZWYgaW50MTZfdAotCi0vKiBEZWZpbmUgdG8gYGludCcgaWYgaW50MzJfdCBub3QgZGVmaW5lZC4gKi8KLSN1bmRlZiBpbnQzMl90Ci0KLS8qIERlZmluZSB0byBgbG9uZyBsb25nJyBpZiBpbnQ2NF90IG5vdCBkZWZpbmVkLiAqLwotI3VuZGVmIGludDY0X3QKLQotLyogRGVmaW5lIHRvIGBzaWduZWQgY2hhcicgaWYgaW50OF90IG5vdCBkZWZpbmVkLiAqLwotI3VuZGVmIGludDhfdAotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkIHNob3J0JyBpZiB1X2ludDE2X3Qgbm90IGRlZmluZWQuICovCi0jdW5kZWYgdV9pbnQxNl90Ci0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiB1X2ludDMyX3Qgbm90IGRlZmluZWQuICovCi0jdW5kZWYgdV9pbnQzMl90Ci0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgbG9uZyBsb25nJyBpZiB1X2ludDY0X3Qgbm90IGRlZmluZWQuICovCi0jdW5kZWYgdV9pbnQ2NF90Ci0KLS8qIERlZmluZSB0byBgdW5zaWduZWQgY2hhcicgaWYgdV9pbnQ4X3Qgbm90IGRlZmluZWQuICovCi0jdW5kZWYgdV9pbnQ4X3QKZGlmZiAtLWdpdCBhL2NvbmZpZy5zdWIgYi9jb25maWcuc3ViCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1Njk4MTc0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy5zdWIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMxICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKLSMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi10aW1lc3RhbXA9JzIwMDMtMTEtMDMnCi0KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFBsZWFzZSBzZW5kIHBhdGNoZXMgdG8gPGNvbmZpZy1wYXRjaGVzQGdudS5vcmc+LiAgU3VibWl0IGEgY29udGV4dAotIyBkaWZmIGFuZCBhIHByb3Blcmx5IGZvcm1hdHRlZCBDaGFuZ2VMb2cgZW50cnkuCi0jCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1tZT1gZWNobyAiJDAiIHwgc2VkIC1lICdzLC4qLywsJ2AKLQotdXNhZ2U9IlwKLVVzYWdlOiAkMCBbT1BUSU9OXSBDUFUtTUZSLU9QU1lTCi0gICAgICAgJDAgW09QVElPTl0gQUxJQVMKLQotQ2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiBuYW1lLgotCi1PcGVyYXRpb24gbW9kZXM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0Ci0gIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0Ci0KLVJlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCi0KLXZlcnNpb249IlwKLUdOVSBjb25maWcuc3ViICgkdGltZXN0YW1wKQotCi1Db3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTwotd2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgotCi1oZWxwPSIKLVRyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotIyBQYXJzZSBjb21tYW5kIGxpbmUKLXdoaWxlIHRlc3QgJCMgLWd0IDAgOyBkbwotICBjYXNlICQxIGluCi0gICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKLSAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgMCA7OwotICAgIC0tdmVyc2lvbiB8IC12ICkKLSAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDAgOzsKLSAgICAtLWhlbHAgfCAtLWgqIHwgLWggKQotICAgICAgIGVjaG8gIiR1c2FnZSI7IGV4aXQgMCA7OwotICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZwotICAgICAgIHNoaWZ0OyBicmVhayA7OwotICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KLSAgICAgICBicmVhayA7OwotICAgIC0qICkKLSAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiCi0gICAgICAgZXhpdCAxIDs7Ci0KLSAgICAqbG9jYWwqKQotICAgICAgICMgRmlyc3QgcGFzcyB0aHJvdWdoIGFueSBsb2NhbCBtYWNoaW5lIHR5cGVzLgotICAgICAgIGVjaG8gJDEKLSAgICAgICBleGl0IDA7OwotCi0gICAgKiApCi0gICAgICAgYnJlYWsgOzsKLSAgZXNhYwotZG9uZQotCi1jYXNlICQjIGluCi0gMCkgZWNobyAiJG1lOiBtaXNzaW5nIGFyZ3VtZW50JGhlbHAiID4mMgotICAgIGV4aXQgMTs7Ci0gMSkgOzsKLSAqKSBlY2hvICIkbWU6IHRvbyBtYW55IGFyZ3VtZW50cyRoZWxwIiA+JjIKLSAgICBleGl0IDE7OwotZXNhYwotCi0jIFNlcGFyYXRlIHdoYXQgdGhlIHVzZXIgZ2F2ZSBpbnRvIENQVS1DT01QQU5ZIGFuZCBPUyBvciBLRVJORUwtT1MgKGlmIGFueSkuCi0jIEhlcmUgd2UgbXVzdCByZWNvZ25pemUgYWxsIHRoZSB2YWxpZCBLRVJORUwtT1MgY29tYmluYXRpb25zLgotbWF5YmVfb3M9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wyLydgCi1jYXNlICRtYXliZV9vcyBpbgotICBudG8tcW54KiB8IGxpbnV4LWdudSogfCBsaW51eC1kaWV0bGliYyB8IGxpbnV4LXVjbGliYyogfCB1Y2xpbnV4LXVjbGliYyogfCB1Y2xpbnV4LWdudSogfCBcCi0gIGtmcmVlYnNkKi1nbnUqIHwga25ldGJzZCotZ251KiB8IG5ldGJzZCotZ251KiB8IHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKLSAgICBvcz0tJG1heWJlX29zCi0gICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKLSAgICA7OwotICAqKQotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKLSAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KLSAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCi0gICAgZWxzZSBvcz07IGZpCi0gICAgOzsKLWVzYWMKLQotIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCi0jIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbwotIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQotIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCi1jYXNlICRvcyBpbgotCS1zdW4qb3MqKQotCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KLQkJOzsKLQktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAotCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAotCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCi0JLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKLQktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAotCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAotCS1hcHBsZSB8IC1heGlzKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zaW0gfCAtY2lzY28gfCAtb2tpIHwgLXdlYyB8IC13aW5ib25kKQotCQlvcz0KLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1zY291dCkKLQkJOzsKLQktd3JzKQotCQlvcz0tdnh3b3JrcwotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLWNob3J1c29zKikKLQkJb3M9LWNob3J1c29zCi0JCWJhc2ljX21hY2hpbmU9JDEKLQkJOzsKLSAJLWNob3J1c3JkYikKLSAJCW9zPS1jaG9ydXNyZGIKLQkJYmFzaWNfbWFjaGluZT0kMQotIAkJOzsKLQktaGl1eCopCi0JCW9zPS1oaXV4d2UyCi0JCTs7Ci0JLXNjbzUpCi0JCW9zPS1zY28zLjJ2NQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzQpCi0JCW9zPS1zY28zLjJ2NAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMi5bNC05XSopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy9zY28zLjIuL3NjbzMuMnYvJ2AKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1zY28zLjJ2WzQtOV0qKQotCQkjIERvbid0IGZvcmdldCB2ZXJzaW9uIGlmIGl0IGlzIDMuMnY0IG9yIG5ld2VyLgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbyopCi0JCW9zPS1zY28zLjJ2MgotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXVkayopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktaXNjKQotCQlvcz0taXNjMi4yCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktY2xpeCopCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1pbnRlcmdyYXBoCi0JCTs7Ci0JLWlzYyopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktbHlueCopCi0JCW9zPS1seW54b3MKLQkJOzsKLQktcHR4KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1zZXF1ZW50LydgCi0JCTs7Ci0JLXdpbmRvd3NudCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAncy93aW5kb3dzbnQvd2lubnQvJ2AKLQkJOzsKLQktcHNvcyopCi0JCW9zPS1wc29zCi0JCTs7Ci0JLW1pbnQgfCAtbWludFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIGFsaWFzZXMgZm9yIGNlcnRhaW4gQ1BVLUNPTVBBTlkgY29tYmluYXRpb25zLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUuCi0JIyBTb21lIGFyZSBvbWl0dGVkIGhlcmUgYmVjYXVzZSB0aGV5IGhhdmUgc3BlY2lhbCBtZWFuaW5ncyBiZWxvdy4KLQkxNzUwYSB8IDU4MCBcCi0JfCBhMjlrIFwKLQl8IGFscGhhIHwgYWxwaGFldls0LThdIHwgYWxwaGFldjU2IHwgYWxwaGFldjZbNzhdIHwgYWxwaGFwY2E1WzY3XSBcCi0JfCBhbHBoYTY0IHwgYWxwaGE2NGV2WzQtOF0gfCBhbHBoYTY0ZXY1NiB8IGFscGhhNjRldjZbNzhdIHwgYWxwaGE2NHBjYTVbNjddIFwKLQl8IGFtMzNfMi4wIFwKLQl8IGFyYyB8IGFybSB8IGFybVtibF1lIHwgYXJtZVtsYl0gfCBhcm12WzIzNDVdIHwgYXJtdlszNDVdW2xiXSB8IGF2ciBcCi0JfCBjNHggfCBjbGlwcGVyIFwKLQl8IGQxMHYgfCBkMzB2IHwgZGx4IHwgZHNwMTZ4eCBcCi0JfCBmcjMwIHwgZnJ2IFwKLQl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCi0JfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKLQl8IGlwMmsgfCBpcTIwMDAgXAotCXwgbTMyciB8IG02ODAwMCB8IG02OGsgfCBtODhrIHwgbWNvcmUgXAotCXwgbWlwcyB8IG1pcHNiZSB8IG1pcHNlYiB8IG1pcHNlbCB8IG1pcHNsZSBcCi0JfCBtaXBzMTYgXAotCXwgbWlwczY0IHwgbWlwczY0ZWwgXAotCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKLQl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCi0JfCBtaXBzNjR2cjQxMDAgfCBtaXBzNjR2cjQxMDBlbCBcCi0JfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCBcCi0JfCBtaXBzNjR2cjUwMDAgfCBtaXBzNjR2cjUwMDBlbCBcCi0JfCBtaXBzaXNhMzIgfCBtaXBzaXNhMzJlbCBcCi0JfCBtaXBzaXNhMzJyMiB8IG1pcHNpc2EzMnIyZWwgXAotCXwgbWlwc2lzYTY0IHwgbWlwc2lzYTY0ZWwgXAotCXwgbWlwc2lzYTY0cjIgfCBtaXBzaXNhNjRyMmVsIFwKLQl8IG1pcHNpc2E2NHNiMSB8IG1pcHNpc2E2NHNiMWVsIFwKLQl8IG1pcHNpc2E2NHNyNzFrIHwgbWlwc2lzYTY0c3I3MWtlbCBcCi0JfCBtaXBzdHgzOSB8IG1pcHN0eDM5ZWwgXAotCXwgbW4xMDIwMCB8IG1uMTAzMDAgXAotCXwgbXNwNDMwIFwKLQl8IG5zMTZrIHwgbnMzMmsgXAotCXwgb3BlbnJpc2MgfCBvcjMyIFwKLQl8IHBkcDEwIHwgcGRwMTEgfCBwaiB8IHBqbCBcCi0JfCBwb3dlcnBjIHwgcG93ZXJwYzY0IHwgcG93ZXJwYzY0bGUgfCBwb3dlcnBjbGUgfCBwcGNiZSBcCi0JfCBweXJhbWlkIFwKLQl8IHNoIHwgc2hbMTIzNF0gfCBzaFsyM11lIHwgc2hbMzRdZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAotCXwgc2g2NCB8IHNoNjRsZSBcCi0JfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzg2eCB8IHNwYXJjbGV0IHwgc3BhcmNsaXRlIHwgc3BhcmN2OSB8IHNwYXJjdjliIFwKLQl8IHN0cm9uZ2FybSBcCi0JfCB0YWhvZSB8IHRodW1iIHwgdGljNHggfCB0aWM4MCB8IHRyb24gXAotCXwgdjg1MCB8IHY4NTBlIFwKLQl8IHdlMzJrIFwKLQl8IHg4NiB8IHhzY2FsZSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCi0JfCB6OGspCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQk7OwotCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMikKLQkJIyBNb3Rvcm9sYSA2OEhDMTEvMTIuCi0JCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgotCQlvcz0tbm9uZQotCQk7OwotCW04ODExMCB8IG02ODBbMTIzNDZdMCB8IG02ODM/MiB8IG02ODM2MCB8IG01MjAwIHwgdjcwIHwgdzY1IHwgejhrKQotCQk7OwotCi0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaSo4NiB8IHg4Nl82NCkKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JNTgwLSogXAotCXwgYTI5ay0qIFwKLQl8IGFscGhhLSogfCBhbHBoYWV2WzQtOF0tKiB8IGFscGhhZXY1Ni0qIHwgYWxwaGFldjZbNzhdLSogXAotCXwgYWxwaGE2NC0qIHwgYWxwaGE2NGV2WzQtOF0tKiB8IGFscGhhNjRldjU2LSogfCBhbHBoYTY0ZXY2Wzc4XS0qIFwKLQl8IGFscGhhcGNhNVs2N10tKiB8IGFscGhhNjRwY2E1WzY3XS0qIHwgYXJjLSogXAotCXwgYXJtLSogIHwgYXJtYmUtKiB8IGFybWxlLSogfCBhcm1lYi0qIHwgYXJtdiotKiBcCi0JfCBhdnItKiBcCi0JfCBiczIwMDAtKiBcCi0JfCBjWzEyM10qIHwgYzMwLSogfCBbY2p0XTkwLSogfCBjNHgtKiB8IGM1NHgtKiB8IGM1NXgtKiB8IGM2eC0qIFwKLQl8IGNsaXBwZXItKiB8IGN5ZHJhLSogXAotCXwgZDEwdi0qIHwgZDMwdi0qIHwgZGx4LSogXAotCXwgZWx4c2ktKiBcCi0JfCBmMzBbMDFdLSogfCBmNzAwLSogfCBmcjMwLSogfCBmcnYtKiB8IGZ4ODAtKiBcCi0JfCBoODMwMC0qIHwgaDg1MDAtKiBcCi0JfCBocHBhLSogfCBocHBhMS5bMDFdLSogfCBocHBhMi4wLSogfCBocHBhMi4wW253XS0qIHwgaHBwYTY0LSogXAotCXwgaSo4Ni0qIHwgaTg2MC0qIHwgaTk2MC0qIHwgaWE2NC0qIFwKLQl8IGlwMmstKiB8IGlxMjAwMC0qIFwKLQl8IG0zMnItKiBcCi0JfCBtNjgwMDAtKiB8IG02ODBbMDEyMzQ2XTAtKiB8IG02ODM2MC0qIHwgbTY4Mz8yLSogfCBtNjhrLSogXAotCXwgbTg4MTEwLSogfCBtODhrLSogfCBtY29yZS0qIFwKLQl8IG1pcHMtKiB8IG1pcHNiZS0qIHwgbWlwc2ViLSogfCBtaXBzZWwtKiB8IG1pcHNsZS0qIFwKLQl8IG1pcHMxNi0qIFwKLQl8IG1pcHM2NC0qIHwgbWlwczY0ZWwtKiBcCi0JfCBtaXBzNjR2ci0qIHwgbWlwczY0dnJlbC0qIFwKLQl8IG1pcHM2NG9yaW9uLSogfCBtaXBzNjRvcmlvbmVsLSogXAotCXwgbWlwczY0dnI0MTAwLSogfCBtaXBzNjR2cjQxMDBlbC0qIFwKLQl8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCi0JfCBtaXBzNjR2cjUwMDAtKiB8IG1pcHM2NHZyNTAwMGVsLSogXAotCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKLQl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAotCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKLQl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAotCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKLQl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAotCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCi0JfCBtc3A0MzAtKiBcCi0JfCBub25lLSogfCBucDEtKiB8IG52MS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAotCXwgb3Jpb24tKiBcCi0JfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKLQl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCi0JfCBweXJhbWlkLSogXAotCXwgcm9tcC0qIHwgcnM2MDAwLSogXAotCXwgc2gtKiB8IHNoWzEyMzRdLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hiZS0qIFwKLQl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAotCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjODZ4LSogfCBzcGFyY2xldC0qIHwgc3BhcmNsaXRlLSogXAotCXwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHN0cm9uZ2FybS0qIHwgc3YxLSogfCBzeD8tKiBcCi0JfCB0YWhvZS0qIHwgdGh1bWItKiBcCi0JfCB0aWMzMC0qIHwgdGljNHgtKiB8IHRpYzU0eC0qIHwgdGljNTV4LSogfCB0aWM2eC0qIHwgdGljODAtKiBcCi0JfCB0cm9uLSogXAotCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKLQl8IHdlMzJrLSogXAotCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhwczEwMC0qIHwgeHNjYWxlLSogfCB4c3Rvcm15MTYtKiBcCi0JfCB4dGVuc2EtKiBcCi0JfCB5bXAtKiBcCi0JfCB6OGstKikKLQkJOzsKLQkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCi0JIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KLQkzODZic2QpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1ic2QKLQkJOzsKLQkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0Ci0JCTs7Ci0JM2IqKQotCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAotCQk7OwotCWEyOWtoaWYpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCWFkb2JlNjhrKQotCQliYXNpY19tYWNoaW5lPW02ODAxMC1hZG9iZQotCQlvcz0tc2NvdXQKLQkJOzsKLQlhbGxpYW50IHwgZng4MCkKLQkJYmFzaWNfbWFjaGluZT1meDgwLWFsbGlhbnQKLQkJOzsKLQlhbHRvcyB8IGFsdG9zMzA2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFsdG9zCi0JCTs7Ci0JYW0yOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ub25lCi0JCW9zPS1ic2QKLQkJOzsKLQlhbWQ2NCkKLQkJYmFzaWNfbWFjaGluZT14ODZfNjQtcGMKLQkJOzsKLQlhbWRhaGwpCi0JCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAotCQlvcz0tc3lzdgotCQk7OwotCWFtaWdhIHwgYW1pZ2EtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJOzsKLQlhbWlnYW9zIHwgYW1pZ2Fkb3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JYXBvbGxvNjgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KLQkJb3M9LXN5c3YKLQkJOzsKLQlhcG9sbG82OGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tYnNkCi0JCTs7Ci0JYXV4KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJb3M9LWF1eAotCQk7OwotCWJhbGFuY2UpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQljOTApCi0JCWJhc2ljX21hY2hpbmU9YzkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCBqOTApCi0JCWJhc2ljX21hY2hpbmU9ajkwLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyZHMgfCB1bm9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY3JkcwotCQk7OwotCWNyaXMgfCBjcmlzLSogfCBldHJheCopCi0JCWJhc2ljX21hY2hpbmU9Y3Jpcy1heGlzCi0JCTs7Ci0JZGEzMCB8IGRhMzAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKLQkJOzsKLQlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKLQkJOzsKLQlkZWNzeXN0ZW0xMCogfCBkZWMxMCopCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCi0JCW9zPS10b3BzMTAKLQkJOzsKLQlkZWNzeXN0ZW0yMCogfCBkZWMyMCopCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAtZGVjCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAotCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQotCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKLQkJOzsKLQlkZWx0YTg4KQotCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWdvMzIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1wYwotCQlvcz0tZ28zMgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCTs7Ci0jIEknbSBub3Qgc3VyZSB3aGF0ICJTeXN2MzIiIG1lYW5zLiAgU2hvdWxkIHRoaXMgYmUgc3lzdjMuMj8KLQlpKjg2djMyKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YzMgotCQk7OwotCWkqODZ2NCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjQKLQkJOzsKLQlpKjg2dikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JaSo4NnNvbDIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc29sYXJpczIKLQkJOzsKLQlpMzg2bWFjaCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LW1hY2gKLQkJb3M9LW1hY2gKLQkJOzsKLQlpMzg2LXZzdGEgfCB2c3RhKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tdnN0YQotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCi0JCTs7Ci0JbWFnbnVtIHwgbTMyMzApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWVybGluKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKLQkJb3M9LXN5c3YKLQkJOzsKLQltaW5ndzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtcGMKLQkJb3M9LW1pbmd3MzIKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCi0JCW9zPS1taW50Ci0JCTs7Ci0JbWlwczMqLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCi0JCTs7Ci0JbWlwczMqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCi0JCTs7Ci0JbW1peCopCi0JCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAotCQlvcz0tbW1peHdhcmUKLQkJOzsKLQltb25pdG9yKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JbW9ycGhvcykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJb3M9LW1vcnBob3MKLQkJOzsKLQltc2RvcykKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCi0JCW9zPS1tc2RvcwotCQk7OwotCW12cykKLQkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQotCQlvcz0tbXZzCi0JCTs7Ci0JbmNyMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgotCQlvcz0tc3lzdjQKLQkJOzsKLQluZXRic2QzODYpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS1uZXRic2QKLQkJOzsKLQluZXR3aW5kZXIpCi0JCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCi0JCW9zPS1saW51eAotCQk7OwotCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzMTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQotCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQotCQlvcz0tbmV3c29zCi0JCTs7Ci0JbmVjdjcwKQotCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQluZXh0IHwgbSotbmV4dCApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0Ci0JCWNhc2UgJG9zIGluCi0JCSAgICAtbmV4dHN0ZXAqICkKLQkJCTs7Ci0JCSAgICAtbnMyKikKLQkJICAgICAgb3M9LW5leHRzdGVwMgotCQkJOzsKLQkJICAgICopCi0JCSAgICAgIG9zPS1uZXh0c3RlcDMKLQkJCTs7Ci0JCWVzYWMKLQkJOzsKLQluaDMwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaFs0NV0wMDApCi0JCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKLQkJb3M9LWN4dXgKLQkJOzsKLQluaW5keTk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1uaW5keQotCQk7OwotCW1vbjk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCi0JCW9zPS1tb245NjAKLQkJOzsKLQlub25zdG9wdXgpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKLQkJb3M9LW5vbnN0b3B1eAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQludjEpCi0JCWJhc2ljX21hY2hpbmU9bnYxLWNyYXkKLQkJb3M9LXVuaWNvc21wCi0JCTs7Ci0JbnNyLXRhbmRlbSkKLQkJYmFzaWNfbWFjaGluZT1uc3ItdGFuZGVtCi0JCTs7Ci0Jb3A1MG4tKiB8IG9wNjBjLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJb3M9LXByb2VsZgotCQk7OwotCW9yMzIgfCBvcjMyLSopCi0JCWJhc2ljX21hY2hpbmU9b3IzMi11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jb3M0MDApCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1pYm0KLQkJb3M9LW9zNDAwCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotCXBjNTMyIHwgcGM1MzItKikKLQkJYmFzaWNfbWFjaGluZT1uczMyay1wYzUzMgotCQk7OwotCXBlbnRpdW0gfCBwNSB8IGs1IHwgazYgfCBuZXhnZW4gfCB2aWFjMykKLQkJYmFzaWNfbWFjaGluZT1pNTg2LXBjCi0JCTs7Ci0JcGVudGl1bXBybyB8IHA2IHwgNng4NiB8IGF0aGxvbiB8IGF0aGxvbl8qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKLQkJOzsKLQlwZW50aXVtaWkgfCBwZW50aXVtMiB8IHBlbnRpdW1paWkgfCBwZW50aXVtMykKLQkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCi0JCTs7Ci0JcGVudGl1bTQpCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1wYwotCQk7OwotCXBlbnRpdW0tKiB8IHA1LSogfCBrNS0qIHwgazYtKiB8IG5leGdlbi0qIHwgdmlhYzMtKikKLQkJYmFzaWNfbWFjaGluZT1pNTg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcGVudGl1bXByby0qIHwgcDYtKiB8IDZ4ODYtKiB8IGF0aGxvbi0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSogfCBwZW50aXVtaWlpLSogfCBwZW50aXVtMy0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtNC0qKQotCQliYXNpY19tYWNoaW5lPWk3ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwbikKLQkJYmFzaWNfbWFjaGluZT1wbi1nb3VsZAotCQk7OwotCXBvd2VyKQliYXNpY19tYWNoaW5lPXBvd2VyLWlibQotCQk7OwotCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkJOzsKLQlwcGMtKikJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHBjbGUgfCBwb3dlcnBjbGl0dGxlIHwgcHBjLWxlIHwgcG93ZXJwYy1saXR0bGUpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLXVua25vd24KLQkJOzsKLQlwcGNsZS0qIHwgcG93ZXJwY2xpdHRsZS0qKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwYzY0KQliYXNpY19tYWNoaW5lPXBvd2VycGM2NC11bmtub3duCi0JCTs7Ci0JcHBjNjQtKikgYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwcGM2NGxlIHwgcG93ZXJwYzY0bGl0dGxlIHwgcHBjNjQtbGUgfCBwb3dlcnBjNjQtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGM2NGxlLXVua25vd24KLQkJOzsKLQlwcGM2NGxlLSogfCBwb3dlcnBjNjRsaXR0bGUtKikKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBzMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LWlibQotCQk7OwotCXB3MzIpCi0JCWJhc2ljX21hY2hpbmU9aTU4Ni11bmtub3duCi0JCW9zPS1wdzMyCi0JCTs7Ci0Jcm9tNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jcm1bNDZdMDApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCi0JCTs7Ci0JcnRwYyB8IHJ0cGMtKikKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXMzOTAgfCBzMzkwLSopCi0JCWJhc2ljX21hY2hpbmU9czM5MC1pYm0KLQkJOzsKLQlzMzkweCB8IHMzOTB4LSopCi0JCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCi0JCTs7Ci0Jc2EyOTIwMCkKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0Jc2IxKQotCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMS11bmtub3duCi0JCTs7Ci0Jc2IxZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc2lzYTY0c2IxZWwtdW5rbm93bgotCQk7OwotCXNlaSkKLQkJYmFzaWNfbWFjaGluZT1taXBzLXNlaQotCQlvcz0tc2VpdXgKLQkJOzsKLQlzZXF1ZW50KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQk7OwotCXNoKQotCQliYXNpY19tYWNoaW5lPXNoLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCXNoNjQpCi0JCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzdjEpCi0JCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCXN5bW1ldHJ5KQotCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAotCQlvcz0tZHluaXgKLQkJOzsKLQl0M2UpCi0JCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JdDkwKQotCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0aWM1NHggfCBjNTR4KikKLQkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgotCQlvcz0tY29mZgotCQk7OwotCXRpYzU1eCB8IGM1NXgqKQotCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JdGljNnggfCBjNngqKQotCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KLQkJb3M9LWNvZmYKLQkJOzsKLQl0eDM5KQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KLQkJOzsKLQl0eDM5ZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCi0JCTs7Ci0JdG9hZDEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTAteGtsCi0JCW9zPS10b3BzMjAKLQkJOzsKLQl0b3dlciB8IHRvd2VyLTMyKQotCQliYXNpY19tYWNoaW5lPW02OGstbmNyCi0JCTs7Ci0JdHBmKQotCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQotCQlvcz0tdHBmCi0JCTs7Ci0JdWRpMjlrKQotCQliYXNpY19tYWNoaW5lPWEyOWstYW1kCi0JCW9zPS11ZGkKLQkJOzsKLQl1bHRyYTMpCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1ueXUKLQkJb3M9LXN5bTEKLQkJOzsKLQl2ODEwIHwgbmVjdjgxMCkKLQkJYmFzaWNfbWFjaGluZT12ODEwLW5lYwotCQlvcz0tbm9uZQotCQk7OwotCXZheHYpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tc3lzdgotCQk7OwotCXZtcykKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCW9zPS12bXMKLQkJOzsKLQl2cHAqfHZ4fHZ4LSopCi0JCWJhc2ljX21hY2hpbmU9ZjMwMS1mdWppdHN1Ci0JCTs7Ci0Jdnh3b3Jrczk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3M2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3MyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl3NjUqKQotCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKLQkJb3M9LW5vbmUKLQkJOzsKLQl3ODlrLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQl4cHMgfCB4cHMxMDApCi0JCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAotCQk7OwotCXltcCkKLQkJYmFzaWNfbWFjaGluZT15bXAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JejhrLSotY29mZikKLQkJYmFzaWNfbWFjaGluZT16OGstdW5rbm93bgotCQlvcz0tc2ltCi0JCTs7Ci0Jbm9uZSkKLQkJYmFzaWNfbWFjaGluZT1ub25lLW5vbmUKLQkJb3M9LW5vbmUKLQkJOzsKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgZGVmYXVsdCBtYW51ZmFjdHVyZXIgb2YgY2VydGFpbiBDUFUgdHlwZXMuICBJdCBpcyBpbgotIyBzb21lIGNhc2VzIHRoZSBvbmx5IG1hbnVmYWN0dXJlciwgaW4gb3RoZXJzLCBpdCBpcyB0aGUgbW9zdCBwb3B1bGFyLgotCXc4OWspCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCTs7Ci0Jb3A1MG4pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQlvcDYwYykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQk7OwotCXJvbXApCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlyczYwMDApCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXZheCkKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCTs7Ci0JcGRwMTApCi0JCSMgdGhlcmUgYXJlIG1hbnkgY2xvbmVzLCBzbyBERUMgaXMgbm90IGEgc2FmZSBiZXQKLQkJYmFzaWNfbWFjaGluZT1wZHAxMC11bmtub3duCi0JCTs7Ci0JcGRwMTEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCi0JCTs7Ci0Jd2UzMmspCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0Jc2gzIHwgc2g0IHwgc2hbMzRdZWIgfCBzaFsxMjM0XWxlIHwgc2hbMjNdZWxlKQotCQliYXNpY19tYWNoaW5lPXNoLXVua25vd24KLQkJOzsKLQlzaDY0KQotCQliYXNpY19tYWNoaW5lPXNoNjQtdW5rbm93bgotCQk7OwotCXNwYXJjIHwgc3BhcmN2OSB8IHNwYXJjdjliKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotCWN5ZHJhKQotCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKLQkJOzsKLQlvcmlvbikKLQkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKLQkJOzsKLQlvcmlvbjEwNSkKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAotCQk7OwotCW1hYyB8IG1wdyB8IG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQk7OwotCXBtYWMgfCBwbWFjLW1wdykKLQkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCi0JCTs7Ci0JKi11bmtub3duKQotCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgotCQk7OwotCSopCi0JCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgotCQlleGl0IDEKLQkJOzsKLWVzYWMKLQotIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1kaWdpdGFsKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCi0JCTs7Ci0JKi1jb21tb2RvcmUqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAotCQk7OwotCSopCi0JCTs7Ci1lc2FjCi0KLSMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgotCi1pZiBbIHgiJG9zIiAhPSB4IiIgXQotdGhlbgotY2FzZSAkb3MgaW4KLSAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKLSAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KLQkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KLQktc29sYXJpczEgfCAtc29sYXJpczEuKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHNvbGFyaXMxfHN1bm9zNHwnYAotCQk7OwotCS1zb2xhcmlzKQotCQlvcz0tc29sYXJpczIKLQkJOzsKLQktc3ZyNCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS11bml4d2FyZSopCi0JCW9zPS1zeXN2NC4ydXcKLQkJOzsKLQktZ251L2xpbnV4KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfGdudS9saW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQkjIEZpcnN0IGFjY2VwdCB0aGUgYmFzaWMgc3lzdGVtIHR5cGVzLgotCSMgVGhlIHBvcnRhYmxlIHN5c3RlbXMgY29tZXMgZmlyc3QuCi0JIyBFYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOIEEgKiwgdG8gbWF0Y2ggYSB2ZXJzaW9uIG51bWJlci4KLQkjIC1zeXN2KiBpcyBub3QgaGVyZSBiZWNhdXNlIGl0IGNvbWVzIGxhdGVyLCBhZnRlciBzeXN2cjQuCi0JLWdudSogfCAtYnNkKiB8IC1tYWNoKiB8IC1taW5peCogfCAtZ2VuaXgqIHwgLXVsdHJpeCogfCAtaXJpeCogXAotCSAgICAgIHwgLSp2bXMqIHwgLXNjbyogfCAtZXNpeCogfCAtaXNjKiB8IC1haXgqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCi0JICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1zb2xhcmlzKiB8IC1zeW0qIFwKLQkgICAgICB8IC1hbWlnYW9zKiB8IC1hbWlnYWRvcyogfCAtbXNkb3MqIHwgLW5ld3NvcyogfCAtdW5pY29zKiB8IC1hb2YqIFwKLQkgICAgICB8IC1hb3MqIFwKLQkgICAgICB8IC1uaW5keSogfCAtdnhzaW0qIHwgLXZ4d29ya3MqIHwgLWVibW9uKiB8IC1obXMqIHwgLW12cyogXAotCSAgICAgIHwgLWNsaXgqIHwgLXJpc2NvcyogfCAtdW5pcGx1cyogfCAtaXJpcyogfCAtcnR1KiB8IC14ZW5peCogXAotCSAgICAgIHwgLWhpdXgqIHwgLTM4NmJzZCogfCAta25ldGJzZCogfCAtbmV0YnNkKiB8IC1vcGVuYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIFwKLQkgICAgICB8IC1jeWd3aW4qIHwgLXBlKiB8IC1wc29zKiB8IC1tb3NzKiB8IC1wcm9lbGYqIHwgLXJ0ZW1zKiBcCi0JICAgICAgfCAtbWluZ3czMiogfCAtbGludXgtZ251KiB8IC1saW51eC11Y2xpYmMqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1ta3MqIHwgLXJoYXBzb2R5KiB8IC1kYXJ3aW4qIHwgLW9wZW5lZCogXAotCSAgICAgIHwgLW9wZW5zdGVwKiB8IC1vc2tpdCogfCAtY29uaXgqIHwgLXB3MzIqIHwgLW5vbnN0b3B1eCogXAotCSAgICAgIHwgLXN0b3JtLWNoYW9zKiB8IC10b3BzMTAqIHwgLXRlbmV4KiB8IC10b3BzMjAqIHwgLWl0cyogXAotCSAgICAgIHwgLW9zMiogfCAtdm9zKiB8IC1wYWxtb3MqIHwgLXVjbGludXgqIHwgLW51Y2xldXMqIFwKLQkgICAgICB8IC1tb3JwaG9zKiB8IC1zdXBlcnV4KiB8IC1ydG1rKiB8IC1ydG1rLW5vdmEqIHwgLXdpbmRpc3MqIFwKLQkgICAgICB8IC1wb3dlcm1heCogfCAtZG5peCogfCAtbng2IHwgLW54NyB8IC1zZWkqIHwgLWRyYWdvbmZseSopCi0JIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgotCQk7OwotCS1xbngqKQotCQljYXNlICRiYXNpY19tYWNoaW5lIGluCi0JCSAgICB4ODYtKiB8IGkqODYtKikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LW50byRvcwotCQkJOzsKLQkJZXNhYwotCQk7OwotCS1udG8tcW54KikKLQkJOzsKLQktbnRvKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogXAotCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tbWl4d2FyZSogfCAtbW9uOTYwKiB8IC1sbmV3cyopCi0JCTs7Ci0JLW1hYyopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xtYWN8bWFjb3N8J2AKLQkJOzsKLQktbGludXgtZGlldGxpYmMpCi0JCW9zPS1saW51eC1kaWV0bGliYwotCQk7OwotCS1saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQktc3Vub3M1KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAotCQk7OwotCS1zdW5vczYqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCi0JCTs7Ci0JLW9wZW5lZCopCi0JCW9zPS1vcGVuZWRpdGlvbgotCQk7OwotICAgICAgICAtb3M0MDAqKQotCQlvcz0tb3M0MDAKLQkJOzsKLQktd2luY2UqKQotCQlvcz0td2luY2UKLQkJOzsKLQktb3Nmcm9zZSopCi0JCW9zPS1vc2Zyb3NlCi0JCTs7Ci0JLW9zZiopCi0JCW9zPS1vc2YKLQkJOzsKLQktdXRlayopCi0JCW9zPS1ic2QKLQkJOzsKLQktZHluaXgqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWFjaXMqKQotCQlvcz0tYW9zCi0JCTs7Ci0JLWF0aGVvcyopCi0JCW9zPS1hdGhlb3MKLQkJOzsKLQktMzg2YnNkKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWN0aXgqIHwgLXV0cyopCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JLW5vdmEqKQotCQlvcz0tcnRtay1ub3ZhCi0JCTs7Ci0JLW5zMiApCi0JCW9zPS1uZXh0c3RlcDIKLQkJOzsKLQktbnNrKikKLQkJb3M9LW5zawotCQk7OwotCSMgUHJlc2VydmUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHNpbml4NS4KLQktc2luaXg1LiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzaW5peHxzeXN2fCdgCi0JCTs7Ci0JLXNpbml4KikKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0gICAgICAgIC10cGYqKQotCQlvcz0tdHBmCi0JCTs7Ci0JLXRyaXRvbiopCi0JCW9zPS1zeXN2MwotCQk7OwotCS1vc3MqKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3ZyNCkKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JLXN2cjMpCi0JCW9zPS1zeXN2MwotCQk7OwotCS1zeXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCSMgVGhpcyBtdXN0IGNvbWUgYWZ0ZXIgLXN5c3ZyNC4KLQktc3lzdiopCi0JCTs7Ci0JLW9zZSopCi0JCW9zPS1vc2UKLQkJOzsKLQktZXMxODAwKikKLQkJb3M9LW9zZQotCQk7OwotCS14ZW5peCkKLQkJb3M9LXhlbml4Ci0JCTs7Ci0JLSptaW50IHwgLW1pbnRbMC05XSogfCAtKk1pTlQgfCAtTWlOVFswLTldKikKLQkJb3M9LW1pbnQKLQkJOzsKLQktYXJvcyopCi0JCW9zPS1hcm9zCi0JCTs7Ci0JLWthb3MqKQotCQlvcz0ta2FvcwotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotcmViZWwpCi0JCW9zPS1saW51eAotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICBjNHgtKiB8IHRpYzR4LSopCi0gICAgICAgIG9zPS1jb2ZmCi0gICAgICAgIDs7Ci0JIyBUaGlzIG11c3QgY29tZSBiZWZvcmUgdGhlICotZGVjIGVudHJ5LgotCXBkcDEwLSopCi0JCW9zPS10b3BzMjAKLQkJOzsKLQlwZHAxMS0qKQotCQlvcz0tbm9uZQotCQk7OwotCSotZGVjIHwgdmF4LSopCi0JCW9zPS11bHRyaXg0LjIKLQkJOzsKLQltNjgqLWFwb2xsbykKLQkJb3M9LWRvbWFpbgotCQk7OwotCWkzODYtc3VuKQotCQlvcz0tc3Vub3M0LjAuMgotCQk7OwotCW02ODAwMC1zdW4pCi0JCW9zPS1zdW5vczMKLQkJIyBUaGlzIGFsc28gZXhpc3RzIGluIHRoZSBjb25maWd1cmUgcHJvZ3JhbSwgYnV0IHdhcyBub3QgdGhlCi0JCSMgZGVmYXVsdC4KLQkJIyBvcz0tc3Vub3M0Ci0JCTs7Ci0JbTY4Ki1jaXNjbykKLQkJb3M9LWFvdXQKLQkJOzsKLQltaXBzKi1jaXNjbykKLQkJb3M9LWVsZgotCQk7OwotCW1pcHMqLSopCi0JCW9zPS1lbGYKLQkJOzsKLQlvcjMyLSopCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLQkqLXdlYykKLQkJb3M9LXByb2VsZgotCQk7OwotCSotd2luYm9uZCkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotb2tpKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1ocCkKLQkJb3M9LWhwdXgKLQkJOzsKLQkqLWhpdGFjaGkpCi0JCW9zPS1oaXV4Ci0JCTs7Ci0JaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQotCQlvcz0tc3lzdgotCQk7OwotCSotY2JtKQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCSotZGcpCi0JCW9zPS1kZ3V4Ci0JCTs7Ci0JKi1kb2xwaGluKQotCQlvcz0tc3lzdjMKLQkJOzsKLQltNjhrLWNjdXIpCi0JCW9zPS1ydHUKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJb3M9LWx1bmEKLQkJOzsKLQkqLW5leHQgKQotCQlvcz0tbmV4dHN0ZXAKLQkJOzsKLQkqLXNlcXVlbnQpCi0JCW9zPS1wdHgKLQkJOzsKLQkqLWNyZHMpCi0JCW9zPS11bm9zCi0JCTs7Ci0JKi1ucykKLQkJb3M9LWdlbml4Ci0JCTs7Ci0JaTM3MC0qKQotCQlvcz0tbXZzCi0JCTs7Ci0JKi1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JKi1nb3VsZCkKLQkJb3M9LXN5c3YKLQkJOzsKLQkqLWhpZ2hsZXZlbCkKLQkJb3M9LWJzZAotCQk7OwotCSotZW5jb3JlKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1zZ2kpCi0JCW9zPS1pcml4Ci0JCTs7Ci0JKi1zaWVtZW5zKQotCQlvcz0tc3lzdjQKLQkJOzsKLQkqLW1hc3Njb21wKQotCQlvcz0tcnR1Ci0JCTs7Ci0JZjMwWzAxXS1mdWppdHN1IHwgZjcwMC1mdWppdHN1KQotCQlvcz0tdXhwdgotCQk7OwotCSotcm9tNjhrKQotCQlvcz0tY29mZgotCQk7OwotCSotKmJ1ZykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLWFwcGxlKQotCQlvcz0tbWFjb3MKLQkJOzsKLQkqLWF0YXJpKikKLQkJb3M9LW1pbnQKLQkJOzsKLQkqKQotCQlvcz0tbm9uZQotCQk7OwotZXNhYwotZmkKLQotIyBIZXJlIHdlIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoZSBvcywgYW5kIHRoZSBDUFUgdHlwZSwgYnV0IG5vdCB0aGUKLSMgbWFudWZhY3R1cmVyLiAgV2UgcGljayB0aGUgbG9naWNhbCBtYW51ZmFjdHVyZXIuCi12ZW5kb3I9dW5rbm93bgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotdW5rbm93bikKLQkJY2FzZSAkb3MgaW4KLQkJCS1yaXNjaXgqKQotCQkJCXZlbmRvcj1hY29ybgotCQkJCTs7Ci0JCQktc3Vub3MqKQotCQkJCXZlbmRvcj1zdW4KLQkJCQk7OwotCQkJLWFpeCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktYmVvcyopCi0JCQkJdmVuZG9yPWJlCi0JCQkJOzsKLQkJCS1ocHV4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLW1wZWl4KikKLQkJCQl2ZW5kb3I9aHAKLQkJCQk7OwotCQkJLWhpdXgqKQotCQkJCXZlbmRvcj1oaXRhY2hpCi0JCQkJOzsKLQkJCS11bm9zKikKLQkJCQl2ZW5kb3I9Y3JkcwotCQkJCTs7Ci0JCQktZGd1eCopCi0JCQkJdmVuZG9yPWRnCi0JCQkJOzsKLQkJCS1sdW5hKikKLQkJCQl2ZW5kb3I9b21yb24KLQkJCQk7OwotCQkJLWdlbml4KikKLQkJCQl2ZW5kb3I9bnMKLQkJCQk7OwotCQkJLW12cyogfCAtb3BlbmVkKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS1vczQwMCopCi0JCQkJdmVuZG9yPWlibQotCQkJCTs7Ci0JCQktcHR4KikKLQkJCQl2ZW5kb3I9c2VxdWVudAotCQkJCTs7Ci0JCQktdHBmKikKLQkJCQl2ZW5kb3I9aWJtCi0JCQkJOzsKLQkJCS12eHNpbSogfCAtdnh3b3JrcyogfCAtd2luZGlzcyopCi0JCQkJdmVuZG9yPXdycwotCQkJCTs7Ci0JCQktYXV4KikKLQkJCQl2ZW5kb3I9YXBwbGUKLQkJCQk7OwotCQkJLWhtcyopCi0JCQkJdmVuZG9yPWhpdGFjaGkKLQkJCQk7OwotCQkJLW1wdyogfCAtbWFjb3MqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktKm1pbnQgfCAtbWludFswLTldKiB8IC0qTWlOVCB8IC1NaU5UWzAtOV0qKQotCQkJCXZlbmRvcj1hdGFyaQotCQkJCTs7Ci0JCQktdm9zKikKLQkJCQl2ZW5kb3I9c3RyYXR1cwotCQkJCTs7Ci0JCWVzYWMKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAicy91bmtub3duLyR2ZW5kb3IvImAKLQkJOzsKLWVzYWMKLQotZWNobyAkYmFzaWNfbWFjaGluZSRvcwotZXhpdCAwCi0KLSMgTG9jYWwgdmFyaWFibGVzOgotIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCi0jIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKLSMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgotIyB0aW1lLXN0YW1wLWVuZDogIiciCi0jIEVuZDoKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjQ5NGRmNS4uMDAwMDAwMAotLS0gYS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDM1MyArMCwwIEBACi0jISAvYmluL3NoCi0jIEZyb20gY29uZmlndXJlLmluIFJldmlzaW9uOiAxLjE4OC4yLjggLgotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuCi0jCi0jIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLSMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBNNHNoIEluaXRpYWxpemF0aW9uLiAgIyMKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotCi0jIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKLURVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotCi0KLSMgUEFUSCBuZWVkcyBDUgotIyBBdm9pZCBkZXBlbmRpbmcgdXBvbiBDaGFyYWN0ZXIgUmFuZ2VzLgotYXNfY3JfbGV0dGVycz0nYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCi1hc19jcl9MRVRURVJTPSdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKLWFzX2NyX0xldHRlcnM9JGFzX2NyX2xldHRlcnMkYXNfY3JfTEVUVEVSUwotYXNfY3JfZGlnaXRzPScwMTIzNDU2Nzg5JwotYXNfY3JfYWxudW09JGFzX2NyX0xldHRlcnMkYXNfY3JfZGlnaXRzCi0KLSMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgotaWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KLSAgZWNobyAiIyEgL2Jpbi9zaCIgPmNvbmYkJC5zaAotICBlY2hvICAiZXhpdCAwIiAgID4+Y29uZiQkLnNoCi0gIGNobW9kICt4IGNvbmYkJC5zaAotICBpZiAoUEFUSD0iL25vbmV4aXN0ZW50Oy4iOyBjb25mJCQuc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIFBBVEhfU0VQQVJBVE9SPSc7JwotICBlbHNlCi0gICAgUEFUSF9TRVBBUkFUT1I9OgotICBmaQotICBybSAtZiBjb25mJCQuc2gKLWZpCi0KLSMgU3VwcG9ydCB1bnNldCB3aGVuIHBvc3NpYmxlLgotaWYgKCAoTUFJTD02MDsgdW5zZXQgTUFJTCkgfHwgZXhpdCkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Vuc2V0PXVuc2V0Ci1lbHNlCi0gIGFzX3Vuc2V0PWZhbHNlCi1maQotCi0KLSMgSUZTCi0jIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcwotIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCi0jIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKLSMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKLWFzX25sPScKLScKLUlGUz0iICIiCSRhc19ubCIKLQotIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KLWNhc2UgJDAgaW4KLSAgKltcXC9dKiApIGFzX215c2VsZj0kMCA7OwotICAqKSBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgICAgOzsKLWVzYWMKLSMgV2UgZGlkIG5vdCBmaW5kIG91cnNlbHZlcywgbW9zdCBwcm9iYWJseSB3ZSB3ZXJlIHJ1biBhcyBgc2ggQ09NTUFORCcKLSMgaW4gd2hpY2ggY2FzZSB3ZSBhcmUgbm90IHRvIGJlIGZvdW5kIGluIHRoZSBwYXRoLgotaWYgdGVzdCAieCRhc19teXNlbGYiID0geDsgdGhlbgotICBhc19teXNlbGY9JDAKLWZpCi1pZiB0ZXN0ICEgLWYgIiRhc19teXNlbGYiOyB0aGVuCi0gIGVjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKLSAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci1maQotCi0jIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gcHJlLTMuMCBVV0lOIGtzaC4KLWZvciBhc192YXIgaW4gRU5WIE1BSUwgTUFJTFBBVEgKLWRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi1kb25lCi1QUzE9JyQgJwotUFMyPSc+ICcKLVBTND0nKyAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLWZvciBhc192YXIgaW4gXAotICBMQU5HIExBTkdVQUdFIExDX0FERFJFU1MgTENfQUxMIExDX0NPTExBVEUgTENfQ1RZUEUgTENfSURFTlRJRklDQVRJT04gXAotICBMQ19NRUFTVVJFTUVOVCBMQ19NRVNTQUdFUyBMQ19NT05FVEFSWSBMQ19OQU1FIExDX05VTUVSSUMgTENfUEFQRVIgXAotICBMQ19URUxFUEhPTkUgTENfVElNRQotZG8KLSAgaWYgKHNldCAreDsgdGVzdCAteiAiYChldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIpIDI+JjFgIik7IHRoZW4KLSAgICBldmFsICRhc192YXI9QzsgZXhwb3J0ICRhc192YXIKLSAgZWxzZQotICAgICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gIGZpCi1kb25lCi0KLSMgUmVxdWlyZWQgdG8gdXNlIGJhc2VuYW1lLgotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1pZiAoYmFzZW5hbWUgLS0gLykgPi9kZXYvbnVsbCAyPiYxICYmIHRlc3QgIlhgYmFzZW5hbWUgLS0gLyAyPiYxYCIgPSAiWC8iOyB0aGVuCi0gIGFzX2Jhc2VuYW1lPWJhc2VuYW1lCi1lbHNlCi0gIGFzX2Jhc2VuYW1lPWZhbHNlCi1maQotCi0KLSMgTmFtZSBvZiB0aGUgZXhlY3V0YWJsZS4KLWFzX21lPWAkYXNfYmFzZW5hbWUgLS0gIiQwIiB8fAotJGFzX2V4cHIgWC8iJDAiIDogJy4qL1woW14vXVteL10qXCkvKiQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoLy9cKSQnIFx8IFwKLQkgWCIkMCIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgvIiQwIiB8Ci0gICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcL1woXC9cKS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIHMvLiovLi87IHEnYAotCi0jIENEUEFUSC4KLSRhc191bnNldCBDRFBBVEgKLQotCi1pZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgPSB4OyB0aGVuCi0gIGlmIChldmFsICI6IikgMj4vZGV2L251bGw7IHRoZW4KLSAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLWVsc2UKLSAgYXNfaGF2ZV9yZXF1aXJlZD1ubwotZmkKLQotICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0geWVzICYmIAkgKGV2YWwgIjoKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotKAotICBhc19saW5lbm9fMT1cJExJTkVOTwotICBhc19saW5lbm9fMj1cJExJTkVOTwotICB0ZXN0IFwieFwkYXNfbGluZW5vXzFcIiAhPSBcInhcJGFzX2xpbmVub18yXCIgJiYKLSAgdGVzdCBcInhcYGV4cHIgXCRhc19saW5lbm9fMSArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMlwiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLSIpIDI+IC9kZXYvbnVsbDsgdGhlbgotICA6Ci1lbHNlCi0gIGFzX2NhbmRpZGF0ZV9zaGVsbHM9Ci0gICAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAvYmluJFBBVEhfU0VQQVJBVE9SL3Vzci9iaW4kUEFUSF9TRVBBUkFUT1IkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBjYXNlICRhc19kaXIgaW4KLQkgLyopCi0JICAgZm9yIGFzX2Jhc2UgaW4gc2ggYmFzaCBrc2ggc2g1OyBkbwotCSAgICAgYXNfY2FuZGlkYXRlX3NoZWxscz0iJGFzX2NhbmRpZGF0ZV9zaGVsbHMgJGFzX2Rpci8kYXNfYmFzZSIKLQkgICBkb25lOzsKLSAgICAgICBlc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotICAgICAgZm9yIGFzX3NoZWxsIGluICRhc19jYW5kaWRhdGVfc2hlbGxzICRTSEVMTDsgZG8KLQkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgotCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKLQkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKLWlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBlbXVsYXRlIHNoCi0gIE5VTExDTUQ9OgotICAjIFpzaCAzLnggYW5kIDQueCBwZXJmb3JtcyB3b3JkIHNwbGl0dGluZyBvbiAkezErIiRAIn0sIHdoaWNoCi0gICMgaXMgY29udHJhcnkgdG8gb3VyIHVzYWdlLiAgRGlzYWJsZSB0aGlzIGZlYXR1cmUuCi0gIGFsaWFzIC1nICckezErIiRAIn0nPSciJEAiJwotICBzZXRvcHQgTk9fR0xPQl9TVUJTVAotZWxzZQotICBjYXNlIGAoc2V0IC1vKSAyPi9kZXYvbnVsbGAgaW4KLSAgKnBvc2l4Kikgc2V0IC1vIHBvc2l4IDs7Ci1lc2FjCi0KLWZpCi0KLQotOgotX0FTRU9GCi19OyB0aGVuCi0gIENPTkZJR19TSEVMTD0kYXNfc2hlbGwKLQkgICAgICAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKLQkgICAgICAgaWYgeyAiJGFzX3NoZWxsIiAyPiAvZGV2L251bGwgPDxcX0FTRU9GCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLToKLShhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0ICQxKQotfQotYXNfZnVuY19zdWNjZXNzICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMAotfQotYXNfZnVuY19mYWlsdXJlICgpIHsKLSAgYXNfZnVuY19yZXR1cm4gMQotfQotYXNfZnVuY19yZXRfc3VjY2VzcyAoKSB7Ci0gIHJldHVybiAwCi19Ci1hc19mdW5jX3JldF9mYWlsdXJlICgpIHsKLSAgcmV0dXJuIDEKLX0KLQotZXhpdGNvZGU9MAotaWYgYXNfZnVuY19zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfc3VjY2VzcyBmYWlsZWQuCi1maQotCi1pZiBhc19mdW5jX2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiBhc19mdW5jX3JldF9zdWNjZXNzOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfZmFpbHVyZTsgdGhlbgotICBleGl0Y29kZT0xCi0gIGVjaG8gYXNfZnVuY19yZXRfZmFpbHVyZSBzdWNjZWVkZWQuCi1maQotCi1pZiAoIHNldCB4OyBhc19mdW5jX3JldF9zdWNjZXNzIHkgJiYgdGVzdCB4ID0gIiQxIiApOyB0aGVuCi0gIDoKLWVsc2UKLSAgZXhpdGNvZGU9MQotICBlY2hvIHBvc2l0aW9uYWwgcGFyYW1ldGVycyB3ZXJlIG5vdCBzYXZlZC4KLWZpCi0KLXRlc3QgJGV4aXRjb2RlID0gMCkgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci0KLSgKLSAgYXNfbGluZW5vXzE9JExJTkVOTwotICBhc19saW5lbm9fMj0kTElORU5PCi0gIHRlc3QgIngkYXNfbGluZW5vXzEiICE9ICJ4JGFzX2xpbmVub18yIiAmJgotICB0ZXN0ICJ4YGV4cHIgJGFzX2xpbmVub18xICsgMWAiID0gIngkYXNfbGluZW5vXzIiKSB8fCB7IChleGl0IDEpOyBleGl0IDE7IH0KLQotX0FTRU9GCi19OyB0aGVuCi0gIGJyZWFrCi1maQotCi1maQotCi0gICAgICBkb25lCi0KLSAgICAgIGlmIHRlc3QgIngkQ09ORklHX1NIRUxMIiAhPSB4OyB0aGVuCi0gIGZvciBhc192YXIgaW4gQkFTSF9FTlYgRU5WCi0gICAgICAgIGRvICgkYXNfdW5zZXQgJGFzX3ZhcikgPi9kZXYvbnVsbCAyPiYxICYmICRhc191bnNldCAkYXNfdmFyCi0gICAgICAgIGRvbmUKLSAgICAgICAgZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgICBleGVjICIkQ09ORklHX1NIRUxMIiAiJGFzX215c2VsZiIgJHsxKyIkQCJ9Ci1maQotCi0KLSAgICBpZiB0ZXN0ICRhc19oYXZlX3JlcXVpcmVkID0gbm87IHRoZW4KLSAgZWNobyBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIHRoZQotICAgICAgZWNobyBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiAgUGxlYXNlIGluc3RhbGwgYQotICAgICAgZWNobyBtb2Rlcm4gc2hlbGwsIG9yIG1hbnVhbGx5IHJ1biB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYQotICAgICAgZWNobyBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuCi0gICAgICB7IChleGl0IDEpOyBleGl0IDE7IH0KLWZpCi0KLQotZmkKLQotZmkKLQotCi0KLShldmFsICJhc19mdW5jX3JldHVybiAoKSB7Ci0gIChleGl0IFwkMSkKLX0KLWFzX2Z1bmNfc3VjY2VzcyAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDAKLX0KLWFzX2Z1bmNfZmFpbHVyZSAoKSB7Ci0gIGFzX2Z1bmNfcmV0dXJuIDEKLX0KLWFzX2Z1bmNfcmV0X3N1Y2Nlc3MgKCkgewotICByZXR1cm4gMAotfQotYXNfZnVuY19yZXRfZmFpbHVyZSAoKSB7Ci0gIHJldHVybiAxCi19Ci0KLWV4aXRjb2RlPTAKLWlmIGFzX2Z1bmNfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3N1Y2Nlc3MgZmFpbGVkLgotZmkKLQotaWYgYXNfZnVuY19mYWlsdXJlOyB0aGVuCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgYXNfZnVuY19yZXRfc3VjY2VzczsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBhc19mdW5jX3JldF9zdWNjZXNzIGZhaWxlZC4KLWZpCi0KLWlmIGFzX2Z1bmNfcmV0X2ZhaWx1cmU7IHRoZW4KLSAgZXhpdGNvZGU9MQotICBlY2hvIGFzX2Z1bmNfcmV0X2ZhaWx1cmUgc3VjY2VlZGVkLgotZmkKLQotaWYgKCBzZXQgeDsgYXNfZnVuY19yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbgotICA6Ci1lbHNlCi0gIGV4aXRjb2RlPTEKLSAgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCi1maQotCi10ZXN0IFwkZXhpdGNvZGUgPSAwIikgfHwgewotICBlY2hvIE5vIHNoZWxsIGZvdW5kIHRoYXQgc3VwcG9ydHMgc2hlbGwgZnVuY3Rpb25zLgotICBlY2hvIFBsZWFzZSB0ZWxsIGF1dG9jb25mQGdudS5vcmcgYWJvdXQgeW91ciBzeXN0ZW0sCi0gIGVjaG8gaW5jbHVkaW5nIGFueSBlcnJvciBwb3NzaWJseSBvdXRwdXQgYmVmb3JlIHRoaXMKLSAgZWNobyBtZXNzYWdlCi19Ci0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KLS1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gICopICAgRUNIT19DPSdcYyc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyCi1maQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi0KLWV4ZWMgNzwmMCA8L2Rldi9udWxsIDY+JjEKLQotIyBOYW1lIG9mIHRoZSBob3N0LgotIyBob3N0bmFtZSBvbiBzb21lIHN5c3RlbXMgKFNWUjMuMiwgTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKLSMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgotYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCi0KLSMKLSMgSW5pdGlhbGl6YXRpb25zLgotIwotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotYWNfY2xlYW5fZmlsZXM9Ci1hY19jb25maWdfbGlib2JqX2Rpcj0uCi1MSUJPQkpTPQotY3Jvc3NfY29tcGlsaW5nPW5vCi1zdWJkaXJzPQotTUZMQUdTPQotTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLQotIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCi1QQUNLQUdFX05BTUU9Ci1QQUNLQUdFX1RBUk5BTUU9Ci1QQUNLQUdFX1ZFUlNJT049Ci1QQUNLQUdFX1NUUklORz0KLVBBQ0tBR0VfQlVHUkVQT1JUPQotCi1hY191bmlxdWVfZmlsZT0idGNwZHVtcC5jIgotIyBGYWN0b3JpbmcgZGVmYXVsdCBoZWFkZXJzIGZvciBtb3N0IHRlc3RzLgotYWNfaW5jbHVkZXNfZGVmYXVsdD0iXAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAotIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAotIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2VuZGlmCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1RETElCX0gKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotIyBpZiAhZGVmaW5lZCBTVERDX0hFQURFUlMgJiYgZGVmaW5lZCBIQVZFX01FTU9SWV9ICi0jICBpbmNsdWRlIDxtZW1vcnkuaD4KLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLSMgaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RESU5UX0gKLSMgaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmIgotCi1hY19zdWJzdF92YXJzPSdTSEVMTAotUEFUSF9TRVBBUkFUT1IKLVBBQ0tBR0VfTkFNRQotUEFDS0FHRV9UQVJOQU1FCi1QQUNLQUdFX1ZFUlNJT04KLVBBQ0tBR0VfU1RSSU5HCi1QQUNLQUdFX0JVR1JFUE9SVAotZXhlY19wcmVmaXgKLXByZWZpeAotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotYmluZGlyCi1zYmluZGlyCi1saWJleGVjZGlyCi1kYXRhcm9vdGRpcgotZGF0YWRpcgotc3lzY29uZmRpcgotc2hhcmVkc3RhdGVkaXIKLWxvY2Fsc3RhdGVkaXIKLWluY2x1ZGVkaXIKLW9sZGluY2x1ZGVkaXIKLWRvY2RpcgotaW5mb2RpcgotaHRtbGRpcgotZHZpZGlyCi1wZGZkaXIKLXBzZGlyCi1saWJkaXIKLWxvY2FsZWRpcgotbWFuZGlyCi1ERUZTCi1FQ0hPX0MKLUVDSE9fTgotRUNIT19UCi1MSUJTCi1idWlsZF9hbGlhcwotaG9zdF9hbGlhcwotdGFyZ2V0X2FsaWFzCi1idWlsZAotYnVpbGRfY3B1Ci1idWlsZF92ZW5kb3IKLWJ1aWxkX29zCi1ob3N0Ci1ob3N0X2NwdQotaG9zdF92ZW5kb3IKLWhvc3Rfb3MKLVNITElDQzIKLUNDCi1DRkxBR1MKLUxERkxBR1MKLUNQUEZMQUdTCi1hY19jdF9DQwotRVhFRVhUCi1PQkpFWFQKLUNQUAotR1JFUAotRUdSRVAKLUxJQk9CSlMKLVZfQ0NPUFQKLVZfREVGUwotVl9HUk9VUAotVl9JTkNMUwotVl9QQ0FQREVQCi1MT0NBTFNSQwotSU5TVEFMTF9QUk9HUkFNCi1JTlNUQUxMX1NDUklQVAotSU5TVEFMTF9EQVRBCi1MVExJQk9CSlMnCi1hY19zdWJzdF9maWxlcz0nJwotICAgICAgYWNfcHJlY2lvdXNfdmFycz0nYnVpbGRfYWxpYXMKLWhvc3RfYWxpYXMKLXRhcmdldF9hbGlhcwotQ0MKLUNGTEFHUwotTERGTEFHUwotTElCUwotQ1BQRkxBR1MKLUNQUCcKLQotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi1hY19pbml0X2hlbHA9Ci1hY19pbml0X3ZlcnNpb249ZmFsc2UKLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1jYWNoZV9maWxlPS9kZXYvbnVsbAotZXhlY19wcmVmaXg9Tk9ORQotbm9fY3JlYXRlPQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotCi0jIEluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucy4KLSMgVGhlc2UgYXJlIGxlZnQgdW5leHBhbmRlZCBzbyB1c2VycyBjYW4gIm1ha2UgaW5zdGFsbCBleGVjX3ByZWZpeD0vZm9vIgotIyBhbmQgYWxsIHRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgYmFzZWQgb24gZXhlY19wcmVmaXgKLSMgYnkgZGVmYXVsdCB3aWxsIGFjdHVhbGx5IGNoYW5nZS4KLSMgVXNlIGJyYWNlcyBpbnN0ZWFkIG9mIHBhcmVucyBiZWNhdXNlIHNoLCBwZXJsLCBldGMuIGFsc28gYWNjZXB0IHRoZW0uCi0jIChUaGUgbGlzdCBmb2xsb3dzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcy4pCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YXJvb3RkaXI9JyR7cHJlZml4fS9zaGFyZScKLWRhdGFkaXI9JyR7ZGF0YXJvb3RkaXJ9Jwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotZG9jZGlyPScke2RhdGFyb290ZGlyfS9kb2MvJHtQQUNLQUdFfScKLWluZm9kaXI9JyR7ZGF0YXJvb3RkaXJ9L2luZm8nCi1odG1sZGlyPScke2RvY2Rpcn0nCi1kdmlkaXI9JyR7ZG9jZGlyfScKLXBkZmRpcj0nJHtkb2NkaXJ9JwotcHNkaXI9JyR7ZG9jZGlyfScKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotbG9jYWxlZGlyPScke2RhdGFyb290ZGlyfS9sb2NhbGUnCi1tYW5kaXI9JyR7ZGF0YXJvb3RkaXJ9L21hbicKLQotYWNfcHJldj0KLWFjX2Rhc2hkYXNoPQotZm9yIGFjX29wdGlvbgotZG8KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgJGFjX3ByZXY9XCRhY19vcHRpb24KLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICo9KikJYWNfb3B0YXJnPWBleHByICJYJGFjX29wdGlvbiIgOiAnW149XSo9XCguKlwpJ2AgOzsKLSAgKikJYWNfb3B0YXJnPXllcyA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICRhY19kYXNoZGFzaCRhY19vcHRpb24gaW4KLSAgLS0pCi0gICAgYWNfZGFzaGRhc2g9eWVzIDs7Ci0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkX2FsaWFzIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkX2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSRhY19vcHRhcmcgOzsKLQotICAtLWNvbmZpZy1jYWNoZSB8IC1DKQotICAgIGNhY2hlX2ZpbGU9Y29uZmlnLmNhY2hlIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSopCi0gICAgZGF0YWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRhdGFyb290ZGlyIHwgLS1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaSB8IC0tZGF0YXJvb3RkIHwgLS1kYXRhcm9vdCBcCi0gIHwgLS1kYXRhcm9vIHwgLS1kYXRhcm8gfCAtLWRhdGFyKQotICAgIGFjX3ByZXY9ZGF0YXJvb3RkaXIgOzsKLSAgLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGlyPSogfCAtLWRhdGFyb290ZGk9KiB8IC0tZGF0YXJvb3RkPSogXAotICB8IC0tZGF0YXJvb3Q9KiB8IC0tZGF0YXJvbz0qIHwgLS1kYXRhcm89KiB8IC0tZGF0YXI9KikKLSAgICBkYXRhcm9vdGRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSpkaXNhYmxlLVwoLipcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfZmVhdHVyZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBmZWF0dXJlIG5hbWU6ICRhY19mZWF0dXJlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmUgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgZW5hYmxlXyRhY19mZWF0dXJlPW5vIDs7Ci0KLSAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKLSAgICBhY19wcmV2PWRvY2RpciA7OwotICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKLSAgICBkb2NkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCi0gICAgYWNfcHJldj1kdmlkaXIgOzsKLSAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKLSAgICBkdmlkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX2ZlYXR1cmUiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfZmVhdHVyZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIGVuYWJsZV8kYWNfZmVhdHVyZT1cJGFjX29wdGFyZyA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSB8IC1oKQotICAgIGFjX2luaXRfaGVscD1sb25nIDs7Ci0gIC1oZWxwPXIqIHwgLS1oZWxwPXIqIHwgLS1oZWw9ciogfCAtLWhlPXIqIHwgLWhyKikKLSAgICBhY19pbml0X2hlbHA9cmVjdXJzaXZlIDs7Ci0gIC1oZWxwPXMqIHwgLS1oZWxwPXMqIHwgLS1oZWw9cyogfCAtLWhlPXMqIHwgLWhzKikKLSAgICBhY19pbml0X2hlbHA9c2hvcnQgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3RfYWxpYXMgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0X2FsaWFzPSRhY19vcHRhcmcgOzsKLQotICAtaHRtbGRpciB8IC0taHRtbGRpciB8IC0taHRtbGRpIHwgLS1odG1sZCB8IC0taHRtbCB8IC0taHRtIHwgLS1odCkKLSAgICBhY19wcmV2PWh0bWxkaXIgOzsKLSAgLWh0bWxkaXI9KiB8IC0taHRtbGRpcj0qIHwgLS1odG1sZGk9KiB8IC0taHRtbGQ9KiB8IC0taHRtbD0qIHwgLS1odG09KiBcCi0gIHwgLS1odD0qKQotICAgIGh0bWxkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSRhY19vcHRhcmcgOzsKLQotICAtbG9jYWxlZGlyIHwgLS1sb2NhbGVkaXIgfCAtLWxvY2FsZWRpIHwgLS1sb2NhbGVkIHwgLS1sb2NhbGUpCi0gICAgYWNfcHJldj1sb2NhbGVkaXIgOzsKLSAgLWxvY2FsZWRpcj0qIHwgLS1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGk9KiB8IC0tbG9jYWxlZD0qIHwgLS1sb2NhbGU9KikKLSAgICBsb2NhbGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgfCAtLWxvY2FscykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogfCAtLWxvY2Fscz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMgfCAtbikKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSRhY19vcHRhcmcgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9JGFjX29wdGFyZyA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0kYWNfb3B0YXJnIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9JGFjX29wdGFyZyA7OwotCi0gIC1wZGZkaXIgfCAtLXBkZmRpciB8IC0tcGRmZGkgfCAtLXBkZmQgfCAtLXBkZiB8IC0tcGQpCi0gICAgYWNfcHJldj1wZGZkaXIgOzsKLSAgLXBkZmRpcj0qIHwgLS1wZGZkaXI9KiB8IC0tcGRmZGk9KiB8IC0tcGRmZD0qIHwgLS1wZGY9KiB8IC0tcGQ9KikKLSAgICBwZGZkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1wc2RpciB8IC0tcHNkaXIgfCAtLXBzZGkgfCAtLXBzZCB8IC0tcHMpCi0gICAgYWNfcHJldj1wc2RpciA7OwotICAtcHNkaXI9KiB8IC0tcHNkaXI9KiB8IC0tcHNkaT0qIHwgLS1wc2Q9KiB8IC0tcHM9KikKLSAgICBwc2Rpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0kYWNfb3B0YXJnIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9JGFjX29wdGFyZyA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9JGFjX29wdGFyZyA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSRhY19vcHRhcmcgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0X2FsaWFzIDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXRfYWxpYXM9JGFjX29wdGFyZyA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC1WKQotICAgIGFjX2luaXRfdmVyc2lvbj06IDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGV4cHIgIngkYWNfb3B0aW9uIiA6ICd4LSp3aXRoLVwoW149XSpcKSdgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGV4cHIgIngkYWNfcGFja2FnZSIgOiAiLipbXi0uXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKLSAgICAgIHsgZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCBwYWNrYWdlIG5hbWU6ICRhY19wYWNrYWdlIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2UgfCBzZWQgJ3MvWy0uXS9fL2cnYAotICAgIGV2YWwgd2l0aF8kYWNfcGFja2FnZT1cJGFjX29wdGFyZyA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aG91dC1cKC4qXCknYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBleHByICJ4JGFjX3BhY2thZ2UiIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCi0gICAgICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IGludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfcGFja2FnZSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlIHwgc2VkICdzL1stLl0vXy9nJ2AKLSAgICBldmFsIHdpdGhfJGFjX3BhY2thZ2U9bm8gOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSRhY19vcHRhcmcgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9JGFjX29wdGFyZyA7OwotCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICRhY19vcHRpb24KLVRyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiA+JjIKLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotICAgIDs7Ci0KLSAgKj0qKQotICAgIGFjX2VudnZhcj1gZXhwciAieCRhY19vcHRpb24iIDogJ3hcKFtePV0qXCk9J2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgZXhwciAieCRhY19lbnZ2YXIiIDogIi4qW15fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhcmlhYmxlIG5hbWU6ICRhY19lbnZ2YXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gICAgZXZhbCAkYWNfZW52dmFyPVwkYWNfb3B0YXJnCi0gICAgZXhwb3J0ICRhY19lbnZ2YXIgOzsKLQotICAqKQotICAgICMgRklYTUU6IHNob3VsZCBiZSByZW1vdmVkIGluIGF1dG9jb25mIDMuMC4KLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IHlvdSBzaG91bGQgdXNlIC0tYnVpbGQsIC0taG9zdCwgLS10YXJnZXQiID4mMgotICAgIGV4cHIgIngkYWNfb3B0aW9uIiA6ICIuKlteLS5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgotICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCi0gICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gJGFjX29wdGlvbiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLSMgQmUgc3VyZSB0byBoYXZlIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lcy4KLWZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAotCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKLQkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAotCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgotZG8KLSAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gIGNhc2UgJGFjX3ZhbCBpbgotICAgIFtcXC8kXSogfCA/OltcXC9dKiApICBjb250aW51ZTs7Ci0gICAgTk9ORSB8ICcnICkgY2FzZSAkYWNfdmFyIGluICpwcmVmaXggKSBjb250aW51ZTs7IGVzYWM7OwotICBlc2FjCi0gIHsgZWNobyAiJGFzX21lOiBlcnJvcjogZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWRvbmUKLQotIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JwotIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCi0jIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCi1idWlsZD0kYnVpbGRfYWxpYXMKLWhvc3Q9JGhvc3RfYWxpYXMKLXRhcmdldD0kdGFyZ2V0X2FsaWFzCi0KLSMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KLWlmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgotICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KLSAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKLSAgICBlY2hvICIkYXNfbWU6IFdBUk5JTkc6IElmIHlvdSB3YW50ZWQgdG8gc2V0IHRoZSAtLWJ1aWxkIHR5cGUsIGRvbid0IHVzZSAtLWhvc3QuCi0gICAgSWYgYSBjcm9zcyBjb21waWxlciBpcyBkZXRlY3RlZCB0aGVuIGNyb3NzIGNvbXBpbGUgbW9kZSB3aWxsIGJlIHVzZWQuIiA+JjIKLSAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgotICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKLSAgZmkKLWZpCi0KLWFjX3Rvb2xfcHJlZml4PQotdGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQotCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCi0KLQotYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCi1hY19sc19kaT1gbHMgLWRpIC5gICYmCi1hY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBXb3JraW5nIGRpcmVjdG9yeSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLXRlc3QgIlgkYWNfbHNfZGkiID0gIlgkYWNfcHdkX2xzX2RpIiB8fAotICB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHB3ZCBkb2VzIG5vdCByZXBvcnQgbmFtZSBvZiB3b3JraW5nIGRpcmVjdG9yeSIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gdGhlIHBhcmVudCBkaXJlY3RvcnkuCi0gIGFjX2NvbmZkaXI9YCRhc19kaXJuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgiJDAiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXClbXi9dJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYIiQwIiB8Ci0gICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpW14vXS4qL3sKLQkgICAgcy8vXDEvCi0JICAgIHEKLQkgIH0KLQkgIC9eWFwoXC9cL1wpJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgIiRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlIjsgdGhlbgotICB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXMgJiYgc3JjZGlyPSIkYWNfY29uZmRpciBvciAuLiIKLSAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgZmluZCBzb3VyY2VzICgkYWNfdW5pcXVlX2ZpbGUpIGluICRzcmNkaXIiID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotYWNfbXNnPSJzb3VyY2VzIGFyZSBpbiAkc3JjZGlyLCBidXQgXGBjZCAkc3JjZGlyJyBkb2VzIG5vdCB3b3JrIgotYWNfYWJzX2NvbmZkaXI9YCgKLQljZCAiJHNyY2RpciIgJiYgdGVzdCAtciAiLi8kYWNfdW5pcXVlX2ZpbGUiIHx8IHsgZWNobyAiJGFzX21lOiBlcnJvcjogJGFjX21zZyIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQlwd2QpYAotIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KLWlmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KLSAgc3JjZGlyPS4KLWZpCi0jIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgotIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCi0jIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KLWNhc2UgJHNyY2RpciBpbgotKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Ci1lc2FjCi1mb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbwotICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0gIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9Ci0gIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQotZG9uZQotCi0jCi0jIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCi0jCi1pZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgotICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICBjYXQgPDxfQUNFT0YKLVxgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCi0KLVVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgotCi1UbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCi1WQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgotCi1EZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KLQotQ29uZmlndXJhdGlvbjoKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQotICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKLSAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0gIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAgICAgLS1jYWNoZS1maWxlPUZJTEUgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRSBbZGlzYWJsZWRdCi0gIC1DLCAtLWNvbmZpZy1jYWNoZSAgICAgIGFsaWFzIGZvciBcYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnCi0gIC1uLCAtLW5vLWNyZWF0ZSAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gICAgICAtLXNyY2Rpcj1ESVIgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIFxgLi4nXQotCi1JbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotCQkJICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotCQkJICBbUFJFRklYXQotCi1CeSBkZWZhdWx0LCBcYG1ha2UgaW5zdGFsbCcgd2lsbCBpbnN0YWxsIGFsbCB0aGUgZmlsZXMgaW4KLVxgJGFjX2RlZmF1bHRfcHJlZml4L2JpbicsIFxgJGFjX2RlZmF1bHRfcHJlZml4L2xpYicgZXRjLiAgWW91IGNhbiBzcGVjaWZ5Ci1hbiBpbnN0YWxsYXRpb24gcHJlZml4IG90aGVyIHRoYW4gXGAkYWNfZGVmYXVsdF9wcmVmaXgnIHVzaW5nIFxgLS1wcmVmaXgnLAotZm9yIGluc3RhbmNlIFxgLS1wcmVmaXg9XCRIT01FJy4KLQotRm9yIGJldHRlciBjb250cm9sLCB1c2UgdGhlIG9wdGlvbnMgYmVsb3cuCi0KLUZpbmUgdHVuaW5nIG9mIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXM6Ci0gIC0tYmluZGlyPURJUiAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBbRVBSRUZJWC9saWJleGVjXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCi0gIC0tZGF0YXJvb3RkaXI9RElSICAgICAgcmVhZC1vbmx5IGFyY2guLWluZGVwZW5kZW50IGRhdGEgcm9vdCBbUFJFRklYL3NoYXJlXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9pbmZvXQotICAtLWxvY2FsZWRpcj1ESVIgICAgICAgIGxvY2FsZS1kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVIvbG9jYWxlXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCi0gIC0tZG9jZGlyPURJUiAgICAgICAgICAgZG9jdW1lbnRhdGlvbiByb290IFtEQVRBUk9PVERJUi9kb2MvUEFDS0FHRV0KLSAgLS1odG1sZGlyPURJUiAgICAgICAgICBodG1sIGRvY3VtZW50YXRpb24gW0RPQ0RJUl0KLSAgLS1kdmlkaXI9RElSICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotICAtLXBkZmRpcj1ESVIgICAgICAgICAgIHBkZiBkb2N1bWVudGF0aW9uIFtET0NESVJdCi0gIC0tcHNkaXI9RElSICAgICAgICAgICAgcHMgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQotX0FDRU9GCi0KLSAgY2F0IDw8XF9BQ0VPRgotCi1TeXN0ZW0gdHlwZXM6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW2d1ZXNzZWRdCi0gIC0taG9zdD1IT1NUICAgICAgIGNyb3NzLWNvbXBpbGUgdG8gYnVpbGQgcHJvZ3JhbXMgdG8gcnVuIG9uIEhPU1QgW0JVSUxEXQotX0FDRU9GCi1maQotCi1pZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgotCi0gIGNhdCA8PFxfQUNFT0YKLQotT3B0aW9uYWwgRmVhdHVyZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLWVuYWJsZS1zbWIgICAgICAgICAgICBlbmFibGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIgZGVmYXVsdD15ZXMKLSAgLS1kaXNhYmxlLXNtYiAgICAgICAgICAgZGlzYWJsZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlcgotICAtLWVuYWJsZS1pcHY2ICAgICAgICAgICBlbmFibGUgaXB2NiAod2l0aCBpcHY0KSBzdXBwb3J0Ci0gIC0tZGlzYWJsZS1pcHY2ICAgICAgICAgIGRpc2FibGUgaXB2NiBzdXBwb3J0Ci0KLU9wdGlvbmFsIFBhY2thZ2VzOgotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXdpdGhvdXQtZ2NjICAgICAgICAgICBkb24ndCB1c2UgZ2NjCi0gIC0td2l0aC11c2VyPVVTRVJOQU1FICAgIGRyb3AgcHJpdmlsZWdlcyBieSBkZWZhdWx0IHRvIFVTRVJOQU1FCi0gIC0td2l0aC1jaHJvb3Q9RElSRUNUT1JZIHdoZW4gZHJvcHBpbmcgcHJpdmlsZWdlcywgY2hyb290IHRvIERJUkVDVE9SWQotICAtLXdpdGhvdXQtY3J5cHRvICAgICAgICBkaXNhYmxlIGNyeXB0byBzdXBwb3J0Ci0KLVNvbWUgaW5mbHVlbnRpYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzOgotICBDQyAgICAgICAgICBDIGNvbXBpbGVyIGNvbW1hbmQKLSAgQ0ZMQUdTICAgICAgQyBjb21waWxlciBmbGFncwotICBMREZMQUdTICAgICBsaW5rZXIgZmxhZ3MsIGUuZy4gLUw8bGliIGRpcj4gaWYgeW91IGhhdmUgbGlicmFyaWVzIGluIGEKLSAgICAgICAgICAgICAgbm9uc3RhbmRhcmQgZGlyZWN0b3J5IDxsaWIgZGlyPgotICBMSUJTICAgICAgICBsaWJyYXJpZXMgdG8gcGFzcyB0byB0aGUgbGlua2VyLCBlLmcuIC1sPGxpYnJhcnk+Ci0gIENQUEZMQUdTICAgIEMvQysrL09iamVjdGl2ZSBDIHByZXByb2Nlc3NvciBmbGFncywgZS5nLiAtSTxpbmNsdWRlIGRpcj4gaWYKLSAgICAgICAgICAgICAgeW91IGhhdmUgaGVhZGVycyBpbiBhIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8aW5jbHVkZSBkaXI+Ci0gIENQUCAgICAgICAgIEMgcHJlcHJvY2Vzc29yCi0KLVVzZSB0aGVzZSB2YXJpYWJsZXMgdG8gb3ZlcnJpZGUgdGhlIGNob2ljZXMgbWFkZSBieSBgY29uZmlndXJlJyBvciB0byBoZWxwCi1pdCB0byBmaW5kIGxpYnJhcmllcyBhbmQgcHJvZ3JhbXMgd2l0aCBub25zdGFuZGFyZCBuYW1lcy9sb2NhdGlvbnMuCi0KLV9BQ0VPRgotYWNfc3RhdHVzPSQ/Ci1maQotCi1pZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCi0gICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCi0gIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCi0gICAgdGVzdCAtZCAiJGFjX2RpciIgfHwgY29udGludWUKLSAgICBhY19idWlsZGRpcj0uCi0KLWNhc2UgIiRhY19kaXIiIGluCi0uKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSopCi0gIGFjX2Rpcl9zdWZmaXg9L2BlY2hvICIkYWNfZGlyIiB8IHNlZCAncyxeXC5bXFwvXSwsJ2AKLSAgIyBBICIuLiIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICBhY190b3BfYnVpbGRkaXJfc3ViPWBlY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3MsL1teXFwvXSosLy4uLGc7cywvLCwnYAotICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCi0gICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKLSAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7Ci0gIGVzYWMgOzsKLWVzYWMKLWFjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAotYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAotIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLWFjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAotCi1jYXNlICRzcmNkaXIgaW4KLSAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgIGFjX3NyY2Rpcj0uCi0gICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKLSAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgotICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7Ci0gICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OwotICAqKSAjIFJlbGF0aXZlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4Ci0gICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKLWVzYWMKLWFjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLQotICAgIGNkICIkYWNfZGlyIiB8fCB7IGFjX3N0YXR1cz0kPzsgY29udGludWU7IH0KLSAgICAjIENoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZS5nbnUiOyB0aGVuCi0gICAgICBlY2hvICYmCi0gICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSIgLS1oZWxwPXJlY3Vyc2l2ZQotICAgIGVsaWYgdGVzdCAtZiAiJGFjX3NyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0gICAgICBlY2hvICYmCi0gICAgICAkU0hFTEwgIiRhY19zcmNkaXIvY29uZmlndXJlIiAtLWhlbHA9cmVjdXJzaXZlCi0gICAgZWxzZQotICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgotICAgIGZpIHx8IGFjX3N0YXR1cz0kPwotICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KLSAgZG9uZQotZmkKLQotdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCi1pZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCi0gIGNhdCA8PFxfQUNFT0YKLWNvbmZpZ3VyZQotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKLTIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotX0FDRU9GCi0gIGV4aXQKLWZpCi1jYXQgPmNvbmZpZy5sb2cgPDxfQUNFT0YKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotCi1JdCB3YXMgY3JlYXRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYxLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCi0KLSAgJCAkMCAkQAotCi1fQUNFT0YKLWV4ZWMgNT4+Y29uZmlnLmxvZwotewotY2F0IDw8X0FTVU5BTUUKLSMjIC0tLS0tLS0tLSAjIwotIyMgUGxhdGZvcm0uICMjCi0jIyAtLS0tLS0tLS0gIyMKLQotaG9zdG5hbWUgPSBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLXVuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotdW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi11bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLXVuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAotCi0vdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKLS9iaW4vdW5hbWUgLVggICAgID0gYCgvYmluL3VuYW1lIC1YKSAyPi9kZXYvbnVsbCAgICAgfHwgZWNobyB1bmtub3duYAotCi0vYmluL2FyY2ggICAgICAgICAgICAgID0gYCgvYmluL2FyY2gpIDI+L2Rldi9udWxsICAgICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9hcmNoIC1rICAgICAgID0gYCgvdXNyL2Jpbi9hcmNoIC1rKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2NvbnZleC9nZXRzeXNpbmZvID0gYCgvdXNyL2NvbnZleC9nZXRzeXNpbmZvKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9ob3N0aW5mbyAgICAgID0gYCgvdXNyL2Jpbi9ob3N0aW5mbykgMj4vZGV2L251bGwgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL21hY2hpbmUgICAgICAgICAgID0gYCgvYmluL21hY2hpbmUpIDI+L2Rldi9udWxsICAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0vdXNyL2Jpbi9vc2xldmVsICAgICAgID0gYCgvdXNyL2Jpbi9vc2xldmVsKSAyPi9kZXYvbnVsbCAgICAgICB8fCBlY2hvIHVua25vd25gCi0vYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbCAgICAgICAgICB8fCBlY2hvIHVua25vd25gCi0KLV9BU1VOQU1FCi0KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZWNobyAiUEFUSDogJGFzX2RpciIKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotfSA+JjUKLQotY2F0ID4mNSA8PF9BQ0VPRgotCi0KLSMjIC0tLS0tLS0tLS0tICMjCi0jIyBDb3JlIHRlc3RzLiAjIwotIyMgLS0tLS0tLS0tLS0gIyMKLQotX0FDRU9GCi0KLQotIyBLZWVwIGEgdHJhY2Ugb2YgdGhlIGNvbW1hbmQgbGluZS4KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBTdHJpcCBvdXQgLS1zaWxlbnQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHJlY29yZCBpdCBmb3IgZnV0dXJlIHJ1bnMuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhLWNoYXJhY3RlcnMuCi0jIE1ha2UgdHdvIHBhc3NlcyB0byBhbGxvdyBmb3IgcHJvcGVyIGR1cGxpY2F0ZS1hcmd1bWVudCBzdXBwcmVzc2lvbi4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotYWNfY29uZmlndXJlX2FyZ3MwPQotYWNfY29uZmlndXJlX2FyZ3MxPQotYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UKLWZvciBhY19wYXNzIGluIDEgMgotZG8KLSAgZm9yIGFjX2FyZwotICBkbwotICAgIGNhc2UgJGFjX2FyZyBpbgotICAgIC1uby1jcmVhdGUgfCAtLW5vLWMqIHwgLW4gfCAtbm8tcmVjdXJzaW9uIHwgLS1uby1yKikgY29udGludWUgOzsKLSAgICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICAgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgICAgY29udGludWUgOzsKLSAgICAqXCcqKQotICAgICAgYWNfYXJnPWBlY2hvICIkYWNfYXJnIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYCA7OwotICAgIGVzYWMKLSAgICBjYXNlICRhY19wYXNzIGluCi0gICAgMSkgYWNfY29uZmlndXJlX2FyZ3MwPSIkYWNfY29uZmlndXJlX2FyZ3MwICckYWNfYXJnJyIgOzsKLSAgICAyKQotICAgICAgYWNfY29uZmlndXJlX2FyZ3MxPSIkYWNfY29uZmlndXJlX2FyZ3MxICckYWNfYXJnJyIKLSAgICAgIGlmIHRlc3QgJGFjX211c3Rfa2VlcF9uZXh0ID0gdHJ1ZTsgdGhlbgotCWFjX211c3Rfa2VlcF9uZXh0PWZhbHNlICMgR290IHZhbHVlLCBiYWNrIHRvIG5vcm1hbC4KLSAgICAgIGVsc2UKLQljYXNlICRhY19hcmcgaW4KLQkgICo9KiB8IC0tY29uZmlnLWNhY2hlIHwgLUMgfCAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSogXAotCSAgfCAtZW5hYmxlLSogfCAtLWVuYWJsZS0qIHwgLWdhcyB8IC0tZyogfCAtbmZwIHwgLS1uZiogXAotCSAgfCAtcSB8IC1xdWlldCB8IC0tcSogfCAtc2lsZW50IHwgLS1zaWwqIHwgLXYgfCAtdmVyYiogXAotCSAgfCAtd2l0aC0qIHwgLS13aXRoLSogfCAtd2l0aG91dC0qIHwgLS13aXRob3V0LSogfCAtLXgpCi0JICAgIGNhc2UgIiRhY19jb25maWd1cmVfYXJnczAgIiBpbgotCSAgICAgICIkYWNfY29uZmlndXJlX2FyZ3MxIioiICckYWNfYXJnJyAiKiApIGNvbnRpbnVlIDs7Ci0JICAgIGVzYWMKLQkgICAgOzsKLQkgIC0qICkgYWNfbXVzdF9rZWVwX25leHQ9dHJ1ZSA7OwotCWVzYWMKLSAgICAgIGZpCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi1kb25lCi0kYXNfdW5zZXQgYWNfY29uZmlndXJlX2FyZ3MwIHx8IHRlc3QgIiR7YWNfY29uZmlndXJlX2FyZ3MwK3NldH0iICE9IHNldCB8fCB7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IGV4cG9ydCBhY19jb25maWd1cmVfYXJnczA7IH0KLSRhc191bnNldCBhY19jb25maWd1cmVfYXJnczEgfHwgdGVzdCAiJHthY19jb25maWd1cmVfYXJnczErc2V0fSIgIT0gc2V0IHx8IHsgYWNfY29uZmlndXJlX2FyZ3MxPTsgZXhwb3J0IGFjX2NvbmZpZ3VyZV9hcmdzMTsgfQotCi0jIFdoZW4gaW50ZXJydXB0ZWQgb3IgZXhpdCdkLCBjbGVhbnVwIHRlbXBvcmFyeSBmaWxlcywgYW5kIGNvbXBsZXRlCi0jIGNvbmZpZy5sb2cuICBXZSByZW1vdmUgY29tbWVudHMgYmVjYXVzZSBhbnl3YXkgdGhlIHF1b3RlcyBpbiB0aGVyZQotIyB3b3VsZCBjYXVzZSBwcm9ibGVtcyBvciBsb29rIHVnbHkuCi0jIFdBUk5JTkc6IFVzZSAnXCcnIHRvIHJlcHJlc2VudCBhbiBhcG9zdHJvcGhlIHdpdGhpbiB0aGUgdHJhcC4KLSMgV0FSTklORzogRG8gbm90IHN0YXJ0IHRoZSB0cmFwIGNvZGUgd2l0aCBhIG5ld2xpbmUsIGR1ZSB0byBhIEZyZWVCU0QgNC4wIGJ1Zy4KLXRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gICMgU2F2ZSBpbnRvIGNvbmZpZy5sb2cgc29tZSBpbmZvcm1hdGlvbiB0aGF0IG1pZ2h0IGhlbHAgaW4gZGVidWdnaW5nLgotICB7Ci0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgQ2FjaGUgdmFyaWFibGVzLiAjIwotIyMgLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgICMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0oCi0gIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ1wnJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnXCcnYDsgZG8KLSAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKLSAgICBjYXNlICRhY192YWwgaW4gIygKLSAgICAqJHthc19ubH0qKQotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICAqX2N2XyopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IENhY2hlIHZhcmlhYmxlICRhY192YXIgY29udGFpbnMgYSBuZXdsaW5lLiIgPiYyO30gOzsKLSAgICAgIGVzYWMKLSAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAotICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAotICAgICAgKikgJGFzX3Vuc2V0ICRhY192YXIgOzsKLSAgICAgIGVzYWMgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgKHNldCkgMj4mMSB8Ci0gICAgY2FzZSAkYXNfbmxgKGFjX3NwYWNlPSdcJycgJ1wnJzsgc2V0KSAyPiYxYCBpbiAjKAotICAgICoke2FzX25sfWFjX3NwYWNlPVwgKikKLSAgICAgIHNlZCAtbiBcCi0JInMvJ1wnJy8nXCcnXFxcXCdcJycnXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcJydcXDInXCcnL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgotICAgICAgOzsKLSAgICBlc2FjIHwKLSAgICBzb3J0Ci0pCi0gICAgZWNobwotCi0gICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0tLS0tLS0gIyMKLSMjIE91dHB1dCB2YXJpYWJsZXMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgZWNobwotICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X3ZhcnMKLSAgICBkbwotICAgICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCi0gICAgICBjYXNlICRhY192YWwgaW4KLSAgICAgICpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotICAgICAgZXNhYwotICAgICAgZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCi0gICAgZG9uZSB8IHNvcnQKLSAgICBlY2hvCi0KLSAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCi0gICAgICBjYXQgPDxcX0FTQk9YCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi0jIyBGaWxlIHN1YnN0aXR1dGlvbnMuICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tICMjCi1fQVNCT1gKLSAgICAgIGVjaG8KLSAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCi0gICAgICBkbwotCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotCWNhc2UgJGFjX3ZhbCBpbgotCSpcJ1wnJyopIGFjX3ZhbD1gZWNobyAiJGFjX3ZhbCIgfCBzZWQgInMvJ1wnJy8nXCcnXFxcXFxcXFwnXCcnJ1wnJy9nImA7OwotCWVzYWMKLQllY2hvICIkYWNfdmFyPSdcJyckYWNfdmFsJ1wnJyIKLSAgICAgIGRvbmUgfCBzb3J0Ci0gICAgICBlY2hvCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLXMgY29uZmRlZnMuaDsgdGhlbgotICAgICAgY2F0IDw8XF9BU0JPWAotIyMgLS0tLS0tLS0tLS0gIyMKLSMjIGNvbmZkZWZzLmguICMjCi0jIyAtLS0tLS0tLS0tLSAjIwotX0FTQk9YCi0gICAgICBlY2hvCi0gICAgICBjYXQgY29uZmRlZnMuaAotICAgICAgZWNobwotICAgIGZpCi0gICAgdGVzdCAiJGFjX3NpZ25hbCIgIT0gMCAmJgotICAgICAgZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCi0gICAgZWNobyAiJGFzX21lOiBleGl0ICRleGl0X3N0YXR1cyIKLSAgfSA+JjUKLSAgcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qICYmCi0gICAgcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb25mJCQqICRhY19jbGVhbl9maWxlcyAmJgotICAgIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLWZvciBhY19zaWduYWwgaW4gMSAyIDEzIDE1OyBkbwotICB0cmFwICdhY19zaWduYWw9JyRhY19zaWduYWwnOyB7IChleGl0IDEpOyBleGl0IDE7IH0nICRhY19zaWduYWwKLWRvbmUKLWFjX3NpZ25hbD0wCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtZiAtciBjb25mdGVzdCogY29uZmRlZnMuaAotCi0jIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCi1fQUNFT0YKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFBBQ0tBR0VfVEFSTkFNRSAiJFBBQ0tBR0VfVEFSTkFNRSIKLV9BQ0VPRgotCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIkUEFDS0FHRV9WRVJTSU9OIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgotX0FDRU9GCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiJFBBQ0tBR0VfQlVHUkVQT1JUIgotX0FDRU9GCi0KLQotIyBMZXQgdGhlIHNpdGUgZmlsZSBzZWxlY3QgYW4gYWx0ZXJuYXRlIGNhY2hlIGZpbGUgaWYgaXQgd2FudHMgdG8uCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBzZXQgeCAiJENPTkZJR19TSVRFIgotZWxpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgc2V0IHggIiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUiICIkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLWVsc2UKLSAgc2V0IHggIiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSIgXAotCSIkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotZmkKLXNoaWZ0Ci1mb3IgYWNfc2l0ZV9maWxlCi1kbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY2O30KLSAgICBzZWQgJ3MvXi98IC8nICIkYWNfc2l0ZV9maWxlIiA+JjUKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgIyBTb21lIHZlcnNpb25zIG9mIGJhc2ggd2lsbCBmYWlsIHRvIHNvdXJjZSAvZGV2L251bGwgKHNwZWNpYWwKLSAgIyBmaWxlcyBhY3R1YWxseSksIHNvIHdlIGF2b2lkIGRvaW5nIHRoYXQuCi0gIGlmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQotICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KLSAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKLSAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKLSAgICBlc2FjCi0gIGZpCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKLWVjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9Ci0gID4kY2FjaGVfZmlsZQotZmkKLQotIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQotIyB2YWx1ZS4KLWFjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQotZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KLSAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKLSAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQotICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCi0gIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KLSAgICBzZXQsKQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQotICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKLSAgICAsc2V0KQotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIG5vdCBzZXQgaW4gdGhlIHByZXZpb3VzIHJ1biIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9Ci0gICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OwotICAgICwpOzsKLSAgICAqKQotICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBcYCRhY192YXInIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBwcmV2aW91cyBydW46IiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3ZhcicgaGFzIGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzIHJ1bjoiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBmb3JtZXIgdmFsdWU6ICAkYWNfb2xkX3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgZm9ybWVyIHZhbHVlOiAgJGFjX29sZF92YWwiID4mMjt9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogICBjdXJyZW50IHZhbHVlOiAkYWNfbmV3X3ZhbCIgPiY1Ci1lY2hvICIkYXNfbWU6ICAgY3VycmVudCB2YWx1ZTogJGFjX25ld192YWwiID4mMjt9Ci0JYWNfY2FjaGVfY29ycnVwdGVkPToKLSAgICAgIGZpOzsKLSAgZXNhYwotICAjIFBhc3MgcHJlY2lvdXMgdmFyaWFibGVzIHRvIGNvbmZpZy5zdGF0dXMuCi0gIGlmIHRlc3QgIiRhY19uZXdfc2V0IiA9IHNldDsgdGhlbgotICAgIGNhc2UgJGFjX25ld192YWwgaW4KLSAgICAqXCcqKSBhY19hcmc9JGFjX3Zhcj1gZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7Ci0gICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKLSAgICBlc2FjCi0gICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCi0gICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KLSAgICAgICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAgIGVzYWMKLSAgZmkKLWRvbmUKLWlmICRhY19jYWNoZV9jb3JydXB0ZWQ7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNoYW5nZXMgaW4gdGhlIGVudmlyb25tZW50IGNhbiBjb21wcm9taXNlIHRoZSBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9Ci0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHJ1biBcYG1ha2UgZGlzdGNsZWFuJyBhbmQvb3IgXGBybSAkY2FjaGVfZmlsZScgYW5kIHN0YXJ0IG92ZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogcnVuIFxgbWFrZSBkaXN0Y2xlYW4nIGFuZC9vciBcYHJtICRjYWNoZV9maWxlJyBhbmQgc3RhcnQgb3ZlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi1hY19leHQ9YwotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKLWFjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCi1hY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Ci0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAiJHNyY2RpciIgIiRzcmNkaXIvLi4iICIkc3JjZGlyLy4uLy4uIjsgZG8KLSAgaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLXNoIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL2luc3RhbGwuc2giOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgIiRhY19kaXIvc2h0b29sIjsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL3NodG9vbCBpbnN0YWxsIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluIFwiJHNyY2RpclwiIFwiJHNyY2Rpci8uLlwiIFwiJHNyY2Rpci8uLi8uLlwiIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiBcIiRzcmNkaXJcIiBcIiRzcmNkaXIvLi5cIiBcIiRzcmNkaXIvLi4vLi5cIiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZmkKLQotIyBUaGVzZSB0aHJlZSB2YXJpYWJsZXMgYXJlIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0jIGFuZCBhcmUgaW50ZW5kZWQgdG8gYmUgd2l0aGRyYXduIGluIGEgZnV0dXJlIEF1dG9jb25mIHJlbGVhc2UuCi0jIFRoZXkgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMgaWYgYSBidWlsZGVyJ3Mgc291cmNlIHRyZWUgaXMgaW4gYSBkaXJlY3RvcnkKLSMgd2hvc2UgZnVsbCBuYW1lIGNvbnRhaW5zIHVudXN1YWwgY2hhcmFjdGVycy4KLWFjX2NvbmZpZ19ndWVzcz0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyIgICMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIHZhci4KLWFjX2NvbmZpZ19zdWI9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotYWNfY29uZmlndXJlPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlndXJlIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLSRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgc3VuNCA+L2Rldi9udWxsIDI+JjEgfHwKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2J1aWxkK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwotdGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCi0gIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCi10ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGd1ZXNzIGJ1aWxkIHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotYWNfY3ZfYnVpbGQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJGFjX2J1aWxkX2FsaWFzYCB8fAotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkYWNfYnVpbGRfYWxpYXMgZmFpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6ICRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9idWlsZCIgPiY2OyB9Ci1jYXNlICRhY19jdl9idWlsZCBpbgotKi0qLSopIDs7Ci0qKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBidWlsZCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci1lc2FjCi1idWlsZD0kYWNfY3ZfYnVpbGQKLWFjX3NhdmVfSUZTPSRJRlM7IElGUz0nLScKLXNldCB4ICRhY19jdl9idWlsZAotc2hpZnQKLWJ1aWxkX2NwdT0kMQotYnVpbGRfdmVuZG9yPSQyCi1zaGlmdDsgc2hpZnQKLSMgUmVtZW1iZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgSUZTIGlzIHVzZWQgdG8gY3JlYXRlICQqLAotIyBleGNlcHQgd2l0aCBvbGQgc2hlbGxzOgotYnVpbGRfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGJ1aWxkX29zIGluICpcICopIGJ1aWxkX29zPWBlY2hvICIkYnVpbGRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAieCRob3N0X2FsaWFzIiA9IHg7IHRoZW4KLSAgYWNfY3ZfaG9zdD0kYWNfY3ZfYnVpbGQKLWVsc2UKLSAgYWNfY3ZfaG9zdD1gJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiAkaG9zdF9hbGlhc2AgfHwKLSAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJGhvc3RfYWxpYXMgZmFpbGVkIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaG9zdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaG9zdCIgPiY2OyB9Ci1jYXNlICRhY19jdl9ob3N0IGluCi0qLSotKikgOzsKLSopIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGhvc3QiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogaW52YWxpZCB2YWx1ZSBvZiBjYW5vbmljYWwgaG9zdCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci1lc2FjCi1ob3N0PSRhY19jdl9ob3N0Ci1hY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCi1zZXQgeCAkYWNfY3ZfaG9zdAotc2hpZnQKLWhvc3RfY3B1PSQxCi1ob3N0X3ZlbmRvcj0kMgotc2hpZnQ7IHNoaWZ0Ci0jIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKLSMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKLWhvc3Rfb3M9JCoKLUlGUz0kYWNfc2F2ZV9JRlMKLWNhc2UgJGhvc3Rfb3MgaW4gKlwgKikgaG9zdF9vcz1gZWNobyAiJGhvc3Rfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCi0KLQotCi0KLQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nY2Mgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2djYytzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSR3aXRoX2djYzsKLWZpCi0KLSAgICBWX0NDT1BUPSItTyIKLSAgICBWX0lOQ0xTPSIiCi0gICAgaWYgdGVzdCAiJHtzcmNkaXJ9IiAhPSAiLiIgOyB0aGVuCi0JICAgIFZfSU5DTFM9Ii1JXCQoc3JjZGlyKSIKLSAgICBmaQotICAgIGlmIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0OyB0aGVuCi0JICAgIExCTF9DRkxBR1M9IiRDRkxBR1MiCi0gICAgZmkKLSAgICBpZiB0ZXN0IC16ICIkQ0MiIDsgdGhlbgotCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KLQotCSAgICBic2RpKikKLQkJICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAic2hsaWNjMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgc2hsaWNjMjsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX1NITElDQzIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFNITElDQzIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfU0hMSUNDMj0iJFNITElDQzIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfU0hMSUNDMj0ieWVzIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfU0hMSUNDMiIgJiYgYWNfY3ZfcHJvZ19TSExJQ0MyPSJubyIKLWZpCi1maQotU0hMSUNDMj0kYWNfY3ZfcHJvZ19TSExJQ0MyCi1pZiB0ZXN0IC1uICIkU0hMSUNDMiI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkU0hMSUNDMiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kU0hMSUNDMiIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi0JCSAgICBpZiB0ZXN0ICRTSExJQ0MyID0geWVzIDsgdGhlbgotCQkJICAgIENDPXNobGljYzIKLQkJCSAgICBleHBvcnQgQ0MKLQkJICAgIGZpCi0JCSAgICA7OwotCSAgICBlc2FjCi0gICAgZmkKLSAgICBpZiB0ZXN0IC16ICIkQ0MiIC1hICIkd2l0aF9nY2MiID0gbm8gOyB0aGVuCi0JICAgIENDPWNjCi0JICAgIGV4cG9ydCBDQwotICAgIGZpCi0gICAgYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9ImdjYyIKLSAgICBlY2hvICIkYXNfbWU6JExJTkVOTzogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1Ci0gICAgYnJlYWsgMgotICBmaQotZG9uZQotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi1maQotZmkKLWFjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCi1pZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N0X0NDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdF9DQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KLSAgICBDQz0iIgotICBlbHNlCi0gICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoteWVzOikKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBJbiB0aGUgZnV0dXJlLCBBdXRvY29uZiB3aWxsIG5vdCBkZXRlY3QgY3Jvc3MtdG9vbHMKLXdob3NlIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgaG9zdCB0cmlwbGV0LiAgSWYgeW91IHRoaW5rIHRoaXMKLWNvbmZpZ3VyYXRpb24gaXMgdXNlZnVsIHRvIHlvdSwgcGxlYXNlIHdyaXRlIHRvIGF1dG9jb25mQGdudS5vcmcuIiA+JjI7fQotYWNfdG9vbF93YXJuZWQ9eWVzIDs7Ci1lc2FjCi0gICAgQ0M9JGFjX2N0X0NDCi0gIGZpCi1lbHNlCi0gIENDPSIkYWNfY3ZfcHJvZ19DQyIKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotZmkKLWZpCi1DQz0kYWNfY3ZfcHJvZ19DQwotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRDQyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ0MiID4mNjsgfQotZWxzZQotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLQotICBmaQotZmkKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgKLWRvCi0gIElGUz0kYXNfc2F2ZV9JRlMKLSAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KLSAgICBpZiB0ZXN0ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotICAgICAgIGNvbnRpbnVlCi0gICAgIGZpCi0gICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgZWNobyAiJGFzX21lOiRMSU5FTk86IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQotICAgIGJyZWFrIDIKLSAgZmkKLWRvbmUKLWRvbmUKLUlGUz0kYXNfc2F2ZV9JRlMKLQotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjICE9IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkYXNfZGlyLyRhY193b3JkJHsxKycgJ30kQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSRhY19jdl9wcm9nX0NDCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENDIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRDQyIgPiY2OyB9Ci1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotZmkKLQotCi1maQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gIGZvciBhY19wcm9nIGluIGNsLmV4ZQotICBkbwotICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY190b29sX3ByZWZpeCRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfQ0M9IiRhY190b29sX3ByZWZpeCRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotQ0M9JGFjX2N2X3Byb2dfQ0MKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JENDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCi0gIGRvbmUKLWZpCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gIGFjX2N0X0NDPSRDQwotICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKLWRvCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJGFjX2N0X0NDIjsgdGhlbgotICBhY19jdl9wcm9nX2FjX2N0X0NDPSIkYWNfY3RfQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KLSAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgotICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgotICAgIGVjaG8gIiRhc19tZTokTElORU5POiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKLSAgICBicmVhayAyCi0gIGZpCi1kb25lCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLWZpCi1maQotYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKLWlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N0X0NDIiA+JjY7IH0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSAgdGVzdCAtbiAiJGFjX2N0X0NDIiAmJiBicmVhawotZG9uZQotCi0gIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgotICAgIENDPSIiCi0gIGVsc2UKLSAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCi15ZXM6KQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogSW4gdGhlIGZ1dHVyZSwgQXV0b2NvbmYgd2lsbCBub3QgZGV0ZWN0IGNyb3NzLXRvb2xzCi13aG9zZSBuYW1lIGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGhvc3QgdHJpcGxldC4gIElmIHlvdSB0aGluayB0aGlzCi1jb25maWd1cmF0aW9uIGlzIHVzZWZ1bCB0byB5b3UsIHBsZWFzZSB3cml0ZSB0byBhdXRvY29uZkBnbnUub3JnLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IEluIHRoZSBmdXR1cmUsIEF1dG9jb25mIHdpbGwgbm90IGRldGVjdCBjcm9zcy10b29scwotd2hvc2UgbmFtZSBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSBob3N0IHRyaXBsZXQuICBJZiB5b3UgdGhpbmsgdGhpcwotY29uZmlndXJhdGlvbiBpcyB1c2VmdWwgdG8geW91LCBwbGVhc2Ugd3JpdGUgdG8gYXV0b2NvbmZAZ251Lm9yZy4iID4mMjt9Ci1hY190b29sX3dhcm5lZD15ZXMgOzsKLWVzYWMKLSAgICBDQz0kYWNfY3RfQ0MKLSAgZmkKLWZpCi0KLWZpCi0KLQotdGVzdCAteiAiJENDIiAmJiB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIEMgY29tcGlsZXIgZm91bmQgaW4gXCRQQVRICi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0jIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCi1lY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgdmVyc2lvbiIgPiY1Ci1hY19jb21waWxlcj1gc2V0IFggJGFjX2NvbXBpbGU7IGVjaG8gJDJgCi17IChhY190cnk9IiRhY19jb21waWxlciAtLXZlcnNpb24gPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC0tdmVyc2lvbiA+JjUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9Ci17IChhY190cnk9IiRhY19jb21waWxlciAtdiA+JjUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZXIgLXYgPiY1IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfQoteyAoYWNfdHJ5PSIkYWNfY29tcGlsZXIgLVYgPiY1IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGVyIC1WID4mNSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0KLQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWFjX2NsZWFuX2ZpbGVzX3NhdmU9JGFjX2NsZWFuX2ZpbGVzCi1hY19jbGVhbl9maWxlcz0iJGFjX2NsZWFuX2ZpbGVzIGEub3V0IGEuZXhlIGIub3V0IgotIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgotIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgotIyBvZiBleGVleHQuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQyBjb21waWxlciBkZWZhdWx0IG91dHB1dCBmaWxlIG5hbWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1hY19saW5rX2RlZmF1bHQ9YGVjaG8gIiRhY19saW5rIiB8IHNlZCAncy8gLW8gKmNvbmZ0ZXN0W14gXSovLydgCi0jCi0jIExpc3Qgb2YgcG9zc2libGUgb3V0cHV0IGZpbGVzLCBzdGFydGluZyBmcm9tIHRoZSBtb3N0IGxpa2VseS4KLSMgVGhlIGFsZ29yaXRobSBpcyBub3Qgcm9idXN0IHRvIGp1bmsgaW4gYC4nLCBoZW5jZSBnbyB0byB3aWxkY2FyZHMgKGEuKikKLSMgb25seSBhcyBhIGxhc3QgcmVzb3J0LiAgYi5vdXQgaXMgY3JlYXRlZCBieSBpOTYwIGNvbXBpbGVycy4KLWFjX2ZpbGVzPSdhX291dC5leGUgYS5leGUgY29uZnRlc3QuZXhlIGEub3V0IGNvbmZ0ZXN0IGEuKiBjb25mdGVzdC4qIGIub3V0JwotIwotIyBUaGUgSVJJWCA2IGxpbmtlciB3cml0ZXMgaW50byBleGlzdGluZyBmaWxlcyB3aGljaCBtYXkgbm90IGJlCi0jIGV4ZWN1dGFibGUsIHJldGFpbmluZyB0aGVpciBwZXJtaXNzaW9ucy4gIFJlbW92ZSB0aGVtIGZpcnN0IHNvIGEKLSMgc3Vic2VxdWVudCBleGVjdXRpb24gdGVzdCB3b3Jrcy4KLWFjX3JtZmlsZXM9Ci1mb3IgYWNfZmlsZSBpbiAkYWNfZmlsZXMKLWRvCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApIDs7Ci0gICAgKiApIGFjX3JtZmlsZXM9IiRhY19ybWZpbGVzICRhY19maWxlIjs7Ci0gIGVzYWMKLWRvbmUKLXJtIC1mICRhY19ybWZpbGVzCi0KLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rX2RlZmF1bHQiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gICMgQXV0b2NvbmYtMi4xMyBjb3VsZCBzZXQgdGhlIGFjX2N2X2V4ZWV4dCB2YXJpYWJsZSB0byBgbm8nLgotIyBTbyBpZ25vcmUgYSB2YWx1ZSBvZiBgbm8nLCBvdGhlcndpc2UgdGhpcyB3b3VsZCBsZWFkIHRvIGBFWEVFWFQgPSBubycKLSMgaW4gYSBNYWtlZmlsZS4gIFdlIHNob3VsZCBub3Qgb3ZlcnJpZGUgYWNfY3ZfZXhlZXh0IGlmIGl0IHdhcyBjYWNoZWQsCi0jIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHNob3J0LWNpcmN1aXQgdGhpcyB0ZXN0IGZvciBjb21waWxlcnMgdW5rbm93biB0bwotIyBBdXRvY29uZi4KLWZvciBhY19maWxlIGluICRhY19maWxlcyAnJwotZG8KLSAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlCi0gIGNhc2UgJGFjX2ZpbGUgaW4KLSAgICAqLiRhY19leHQgfCAqLnhjb2ZmIHwgKi50ZHMgfCAqLmQgfCAqLnBkYiB8ICoueFNZTSB8ICouYmIgfCAqLmJiZyB8ICoubWFwIHwgKi5pbmYgfCAqLm8gfCAqLm9iaiApCi0JOzsKLSAgICBbYWJdLm91dCApCi0JIyBXZSBmb3VuZCB0aGUgZGVmYXVsdCBleGVjdXRhYmxlLCBidXQgZXhlZXh0PScnIGlzIG1vc3QKLQkjIGNlcnRhaW5seSByaWdodC4KLQlicmVhazs7Ci0gICAgKi4qICkKLSAgICAgICAgaWYgdGVzdCAiJHthY19jdl9leGVleHQrc2V0fSIgPSBzZXQgJiYgdGVzdCAiJGFjX2N2X2V4ZWV4dCIgIT0gbm87Ci0JdGhlbiA6OyBlbHNlCi0JICAgYWNfY3ZfZXhlZXh0PWBleHByICIkYWNfZmlsZSIgOiAnW14uXSpcKFwuLipcKSdgCi0JZmkKLQkjIFdlIHNldCBhY19jdl9leGVleHQgaGVyZSBiZWNhdXNlIHRoZSBsYXRlciB0ZXN0IGZvciBpdCBpcyBub3QKLQkjIHNhZmU6IGNyb3NzIGNvbXBpbGVycyBtYXkgbm90IGFkZCB0aGUgc3VmZml4IGlmIGdpdmVuIGFuIGAtbycKLQkjIGFyZ3VtZW50LCBzbyB3ZSBtYXkgbmVlZCB0byBrbm93IGl0IGF0IHRoYXQgcG9pbnQgYWxyZWFkeS4KLQkjIEV2ZW4gaWYgdGhpcyBzZWN0aW9uIGxvb2tzIGNydWZ0eTogaXQgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKLQkjIGFjdHVhbGx5IHdvcmtpbmcuCi0JYnJlYWs7OwotICAgICogKQotCWJyZWFrOzsKLSAgZXNhYwotZG9uZQotdGVzdCAiJGFjX2N2X2V4ZWV4dCIgPSBubyAmJiBhY19jdl9leGVleHQ9Ci0KLWVsc2UKLSAgYWNfZmlsZT0nJwotZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfZmlsZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfZmlsZSIgPiY2OyB9Ci1pZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4KLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQoteyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLWZpCi0KLWFjX2V4ZWV4dD0kYWNfY3ZfZXhlZXh0Ci0KLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIHdvcmtzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAkRUNIT19DIiA+JjY7IH0KLSMgRklYTUU6IFRoZXNlIGNyb3NzIGNvbXBpbGVyIGhhY2tzIHNob3VsZCBiZSByZW1vdmVkIGZvciBBdXRvY29uZiAzLjAKLSMgSWYgbm90IGNyb3NzIGNvbXBpbGluZywgY2hlY2sgdGhhdCB3ZSBjYW4gcnVuIGEgc2ltcGxlIHByb2dyYW0uCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiAhPSB5ZXM7IHRoZW4KLSAgaWYgeyBhY190cnk9Jy4vJGFjX2ZpbGUnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICAgY3Jvc3NfY29tcGlsaW5nPW5vCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCi0JY3Jvc3NfY29tcGlsaW5nPXllcwotICAgIGVsc2UKLQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCi1JZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gQyBjb21waWxlZCBwcm9ncmFtcy4KLUlmIHlvdSBtZWFudCB0byBjcm9zcyBjb21waWxlLCB1c2UgXGAtLWhvc3QnLgotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLSAgICBmaQotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0KLXJtIC1mIGEub3V0IGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAotYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKLSMgQ2hlY2sgdGhhdCB0aGUgY29tcGlsZXIgcHJvZHVjZXMgZXhlY3V0YWJsZXMgd2UgY2FuIHJ1bi4gIElmIG5vdCwgZWl0aGVyCi0jIHRoZSBjb21waWxlciBpcyBicm9rZW4sIG9yIHdlIGNyb3NzIGNvbXBpbGUuCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSBjcm9zcyBjb21waWxpbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQotZWNobyAiJHtFQ0hPX1R9JGNyb3NzX2NvbXBpbGluZyIgPiY2OyB9Ci0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzdWZmaXggb2YgZXhlY3V0YWJsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgdGhlbgotICAjIElmIGJvdGggYGNvbmZ0ZXN0LmV4ZScgYW5kIGBjb25mdGVzdCcgYXJlIGBwcmVzZW50JyAod2VsbCwgb2JzZXJ2YWJsZSkKLSMgY2F0Y2ggYGNvbmZ0ZXN0LmV4ZScuICBGb3IgaW5zdGFuY2Ugd2l0aCBDeWd3aW4sIGBscyBjb25mdGVzdCcgd2lsbAotIyB3b3JrIHByb3Blcmx5IChpLmUuLCByZWZlciB0byBgY29uZnRlc3QuZXhlJyksIHdoaWxlIGl0IHdvbid0IHdpdGgKLSMgYHJtJy4KLWZvciBhY19maWxlIGluIGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBjb25mdGVzdC4qOyBkbwotICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICoubyB8ICoub2JqICkgOzsKLSAgICAqLiogKSBhY19jdl9leGVleHQ9YGV4cHIgIiRhY19maWxlIiA6ICdbXi5dKlwoXC4uKlwpJ2AKLQkgIGJyZWFrOzsKLSAgICAqICkgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBleGVjdXRhYmxlczogY2Fubm90IGNvbXBpbGUgYW5kIGxpbmsKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1maQotCi1ybSAtZiBjb25mdGVzdCRhY19jdl9leGVleHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZXhlZXh0IiA+JjY7IH0KLQotcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotRVhFRVhUPSRhY19jdl9leGVleHQKLWFjX2V4ZWV4dD0kRVhFRVhUCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3VmZml4IG9mIG9iamVjdCBmaWxlcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9vYmpleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqCi1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB0aGVuCi0gIGZvciBhY19maWxlIGluIGNvbmZ0ZXN0Lm8gY29uZnRlc3Qub2JqIGNvbmZ0ZXN0Lio7IGRvCi0gIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZTsKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiApIDs7Ci0gICAgKikgYWNfY3Zfb2JqZXh0PWBleHByICIkYWNfZmlsZSIgOiAnLipcLlwoLipcKSdgCi0gICAgICAgYnJlYWs7OwotICBlc2FjCi1kb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLXsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzOiBjYW5ub3QgY29tcGlsZQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LiRhY19jdl9vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfb2JqZXh0IiA+JjY7IH0KLU9CSkVYVD0kYWNfY3Zfb2JqZXh0Ci1hY19vYmpleHQ9JE9CSkVYVAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0jaWZuZGVmIF9fR05VQ19fCi0gICAgICAgY2hva2UgbWUKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY29tcGlsZXJfZ251PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY29tcGlsZXJfZ251PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWFjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKLQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY29tcGlsZXJfZ251IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9Ci1HQ0M9YHRlc3QgJGFjX2NvbXBpbGVyX2dudSA9IHllcyAmJiBlY2hvIHllc2AKLWFjX3Rlc3RfQ0ZMQUdTPSR7Q0ZMQUdTK3NldH0KLWFjX3NhdmVfQ0ZMQUdTPSRDRkxBR1MKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCi0gICBhY19jX3dlcnJvcl9mbGFnPXllcwotICAgYWNfY3ZfcHJvZ19jY19nPW5vCi0gICBDRkxBR1M9Ii1nIgotICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JQ0ZMQUdTPSIiCi0gICAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKLQkgQ0ZMQUdTPSItZyIKLQkgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUwotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRDQyBvcHRpb24gdG8gYWNjZXB0IElTTyBDODkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19jODkrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19jODk9bm8KLWFjX3NhdmVfQ0M9JENDCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0vKiBNb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXJlIHN0b2xlbiBmcm9tIFJDUyA1LjcncyBzcmMvY29uZi5zaC4gICovCi1zdHJ1Y3QgYnVmIHsgaW50IHg7IH07Ci1GSUxFICogKCpyY3NvcGVuKSAoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKmUgKHAsIGkpCi0gICAgIGNoYXIgKipwOwotICAgICBpbnQgaTsKLXsKLSAgcmV0dXJuIHBbaV07Ci19Ci1zdGF0aWMgY2hhciAqZiAoY2hhciAqICgqZykgKGNoYXIgKiosIGludCksIGNoYXIgKipwLCAuLi4pCi17Ci0gIGNoYXIgKnM7Ci0gIHZhX2xpc3QgdjsKLSAgdmFfc3RhcnQgKHYscCk7Ci0gIHMgPSBnIChwLCB2YV9hcmcgKHYsaW50KSk7Ci0gIHZhX2VuZCAodik7Ci0gIHJldHVybiBzOwotfQotCi0vKiBPU0YgNC4wIENvbXBhcSBjYyBpcyBzb21lIHNvcnQgb2YgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdC4gIEl0IGhhcwotICAgZnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgc3R1ZmYsIGJ1dCBub3QgJ1x4SEgnIGhleCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotICAgVGhlc2UgZG9uJ3QgcHJvdm9rZSBhbiBlcnJvciB1bmZvcnR1bmF0ZWx5LCBpbnN0ZWFkIGFyZSBzaWxlbnRseSB0cmVhdGVkCi0gICBhcyAneCcuICBUaGUgZm9sbG93aW5nIGluZHVjZXMgYW4gZXJyb3IsIHVudGlsIC1zdGQgaXMgYWRkZWQgdG8gZ2V0Ci0gICBwcm9wZXIgQU5TSSBtb2RlLiAgQ3VyaW91c2x5ICdceDAwJyE9J3gnIGFsd2F5cyBjb21lcyBvdXQgdHJ1ZSwgZm9yIGFuCi0gICBhcnJheSBzaXplIGF0IGxlYXN0LiAgSXQncyBuZWNlc3NhcnkgdG8gd3JpdGUgJ1x4MDAnPT0wIHRvIGdldCBzb21ldGhpbmcKLSAgIHRoYXQncyB0cnVlIG9ubHkgd2l0aCAtc3RkLiAgKi8KLWludCBvc2Y0X2NjX2FycmF5IFsnXHgwMCcgPT0gMCA/IDEgOiAtMV07Ci0KLS8qIElCTSBDIDYgZm9yIEFJWCBpcyBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LCBidXQgaXQgcmVwbGFjZXMgbWFjcm8gcGFyYW1ldGVycwotICAgaW5zaWRlIHN0cmluZ3MgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICAqLwotI2RlZmluZSBGT08oeCkgJ3gnCi1pbnQgeGxjNl9jY19hcnJheVtGT08oYSkgPT0gJ3gnID8gMSA6IC0xXTsKLQotaW50IHRlc3QgKGludCBpLCBkb3VibGUgeCk7Ci1zdHJ1Y3QgczEge2ludCAoKmYpIChpbnQgYSk7fTsKLXN0cnVjdCBzMiB7aW50ICgqZikgKGRvdWJsZSBhKTt9OwotaW50IHBhaXJuYW1lcyAoaW50LCBjaGFyICoqLCBGSUxFICooKikoc3RydWN0IGJ1ZiAqLCBzdHJ1Y3Qgc3RhdCAqLCBpbnQpLCBpbnQsIGludCk7Ci1pbnQgYXJnYzsKLWNoYXIgKiphcmd2OwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZiAoZSwgYXJndiwgMCkgIT0gYXJndlswXSAgfHwgIGYgKGUsIGFyZ3YsIDEpICE9IGFyZ3ZbMV07Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19hcmcgaW4gJycgLXFsYW5nbHZsPWV4dGM4OSAtcWxhbmdsdmw9YW5zaSAtc3RkIFwKLQktQWUgIi1BYSAtRF9IUFVYX1NPVVJDRSIgIi1YYyAtRF9fRVhURU5TSU9OU19fIgotZG8KLSAgQ0M9IiRhY19zYXZlX0NDICRhY19hcmciCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19jODk9JGFjX2FyZwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKLSAgdGVzdCAieCRhY19jdl9wcm9nX2NjX2M4OSIgIT0gInhubyIgJiYgYnJlYWsKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLUNDPSRhY19zYXZlX0NDCi0KLWZpCi0jIEFDX0NBQ0hFX1ZBTAotY2FzZSAieCRhY19jdl9wcm9nX2NjX2M4OSIgaW4KLSAgeCkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vbmUgbmVlZGVkIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vbmUgbmVlZGVkIiA+JjY7IH0gOzsKLSAgeG5vKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdW5zdXBwb3J0ZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9dW5zdXBwb3J0ZWQiID4mNjsgfSA7OwotICAqKQotICAgIENDPSIkQ0MgJGFjX2N2X3Byb2dfY2NfYzg5IgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wcm9nX2NjX2M4OSIgPiY2OyB9IDs7Ci1lc2FjCi0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQotCi0gICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0JICAgIGlmIHRlc3QgIiRTSExJQ0MyIiA9IHllcyA7IHRoZW4KLQkJICAgIGFjX2N2X2xibF9nY2NfdmVycz0yCi0JCSAgICBWX0NDT1BUPSItTzIiCi0JICAgIGVsc2UKLQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdjYyB2ZXJzaW9uIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZ2NjIHZlcnNpb24uLi4gJEVDSE9fQyIgPiY2OyB9Ci0JCSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9nY2NfdmVycytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9sYmxfZ2NjX3ZlcnM9YCRDQyAtdiAyPiYxIHwgXAotCQkJICAgIHNlZCAtZSAnL15nY2MgdmVyc2lvbiAvIWQnIFwKLQkJCQktZSAncy9eZ2NjIHZlcnNpb24gLy8nIFwKLQkJCQktZSAncy8gLiovLycgLWUgJ3MvXlteMC05XSovLycgXAotCQkJCS1lICdzL1wuLiovLydgCi1maQotCi0JCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfZ2NjX3ZlcnMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9nY2NfdmVycyIgPiY2OyB9Ci0JCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfZ2NjX3ZlcnMgLWd0IDEgOyB0aGVuCi0JCQkgICAgVl9DQ09QVD0iLU8yIgotCQkgICAgZmkKLQkgICAgZmkKLSAgICBlbHNlCi0JICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRoYXQgJENDIGhhbmRsZXMgYW5zaSBwcm90b3R5cGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhhdCAkQ0MgaGFuZGxlcyBhbnNpIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotaW50IGZyb2IoaW50LCBjaGFyICopCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjY7IH0KLQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcyA9IG5vIDsgdGhlbgotCQkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCi0KLQkJICAgIGhwdXgqKQotCQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKS4uLiAkRUNIT19DIiA+JjY7IH0KLQkJCSAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKLQkJCSAgICBDRkxBR1M9Ii1BYSAtRF9IUFVYX1NPVVJDRSAkQ0ZMQUdTIgotCQkJICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWErc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci1pbnQKLW1haW4gKCkKLXsKLWludCBmcm9iKGludCwgY2hhciAqKQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2xibF9jY19ocHV4X2NjX2FhPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWE9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xibF9jY19ocHV4X2NjX2FhIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSIgPiY2OyB9Ci0JCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEgPSBubyA7IHRoZW4KLQkJCQkgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCQkJICAgIGZpCi0JCQkgICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCi0JCQkgICAgVl9DQ09QVD0iLUFhICRWX0NDT1BUIgotCQkJICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIF9IUFVYX1NPVVJDRSAxCi1fQUNFT0YKLQotCQkJICAgIDs7Ci0KLQkJICAgICopCi0JCQkgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCQkJICAgIDs7Ci0JCSAgICBlc2FjCi0JICAgIGZpCi0JICAgIFZfSU5DTFM9IiRWX0lOQ0xTIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgotCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgotCi0JICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0JICAgIGlyaXgqKQotCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLXhhbnNpIC1zaWduZWQgLU8iCi0JCSAgICA7OwotCi0JICAgIG9zZiopCi0JCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtc3RkMSAtTyIKLQkJICAgIDs7Ci0KLQkgICAgdWx0cml4KikKLQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHRoYXQgVWx0cml4ICRDQyBoYWNrcyBjb25zdCBpbiBwcm90b3R5cGVzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgdGhhdCBVbHRyaXggJENDIGhhY2tzIGNvbnN0IGluIHByb3RvdHlwZXMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JCSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9jY19jb25zdF9wcm90bytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLWludAotbWFpbiAoKQotewotc3RydWN0IGEgeyBpbnQgYjsgfTsKLQkJCSAgICB2b2lkIGMoY29uc3Qgc3RydWN0IGEgKikKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfY2NfY29uc3RfcHJvdG8iID4mNjsgfQotCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvID0gbm8gOyB0aGVuCi0JCQkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgY29uc3QKLV9BQ0VPRgotCi0JCSAgICBmaQotCQkgICAgOzsKLQkgICAgZXNhYwotICAgIGZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5saW5lLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2lubGluZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotCi0JYWNfY3ZfbGJsX2lubGluZT0iIgotCWFjX2xibF9jY19pbmxpbmU9bm8KLQlmb3IgYWNfbGJsX2lubGluZSBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZQotCWRvCi0JICAgIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2RlZmluZSBpbmxpbmUgJGFjX2xibF9pbmxpbmUKLQkJc3RhdGljIGlubGluZSBzdHJ1Y3QgaWx0ZXN0ICpmb28odm9pZCk7Ci0JCXN0cnVjdCBpbHRlc3QgewotCQkgICAgaW50IGlsdGVzdDE7Ci0JCSAgICBpbnQgaWx0ZXN0MjsKLQkJfTsKLQotCQlzdGF0aWMgaW5saW5lIHN0cnVjdCBpbHRlc3QgKgotCQlmb28oKQotCQl7Ci0JCSAgICBzdGF0aWMgc3RydWN0IGlsdGVzdCB4eHg7Ci0KLQkJICAgIHJldHVybiAmeHh4OwotCQl9Ci1pbnQKLW1haW4gKCkKLXsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xibF9jY19pbmxpbmU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0JICAgIGlmIHRlc3QgIiRhY19sYmxfY2NfaW5saW5lIiA9IHllcyA7IHRoZW4KLQkJYnJlYWs7Ci0JICAgIGZpCi0JZG9uZQotCWlmIHRlc3QgIiRhY19sYmxfY2NfaW5saW5lIiA9IHllcyA7IHRoZW4KLQkgICAgYWNfY3ZfbGJsX2lubGluZT0kYWNfbGJsX2lubGluZQotCWZpCi1maQotCi0gICAgaWYgdGVzdCAhIC16ICIkYWNfY3ZfbGJsX2lubGluZSIgOyB0aGVuCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX2lubGluZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfbGJsX2lubGluZSIgPiY2OyB9Ci0gICAgZWxzZQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotICAgIGZpCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9sYmxfaW5saW5lCi1fQUNFT0YKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBfX2F0dHJpYnV0ZV9fLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9fX2F0dHJpYnV0ZV9fK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLXN0YXRpYyB2b2lkIGZvbyh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKLQotc3RhdGljIHZvaWQKLWZvbyh2b2lkKQotewotICBleGl0KDEpOwotfQotCi1pbnQKLW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICBmb28oKTsKLX0KLQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X19fYXR0cmlidXRlX189eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9fX2F0dHJpYnV0ZV9fPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLWlmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA9ICJ5ZXMiOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfX19BVFRSSUJVVEVfXyAxCi1fQUNFT0YKLQotICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKVwiIgotZWxzZQotICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJcIiIKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjY7IH0KLQotYWNfZXh0PWMKLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCi1hY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JwotYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiAkRUNIT19DIiA+JjY7IH0KLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLSAgaWYgdGVzdCAiJHthY19jdl9wcm9nX0NQUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCi0gICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKLSAgICBkbwotICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQotZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCi1kbwotICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCi0gICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgotICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0JCSAgICAgU3ludGF4IGVycm9yCi1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgIyBCcm9rZW46IGZhaWxzIG9uIHZhbGlkIGlucHV0LgotY29udGludWUKLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci0KLSAgIyBPSywgd29ya3Mgb24gc2FuZSBjYXNlcy4gIE5vdyBjaGVjayB3aGV0aGVyIG5vbmV4aXN0ZW50IGhlYWRlcnMKLSAgIyBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGhvdy4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCi1jb250aW51ZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgUGFzc2VzIGJvdGggdGVzdHMuCi1hY19wcmVwcm9jX29rPToKLWJyZWFrCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi1kb25lCi0jIEJlY2F1c2Ugb2YgYGJyZWFrJywgX0FDX1BSRVBST0NfSUZFTFNFJ3MgY2xlYW5pbmcgY29kZSB3YXMgc2tpcHBlZC4KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci1pZiAkYWNfcHJlcHJvY19vazsgdGhlbgotICBicmVhawotZmkKLQotICAgIGRvbmUKLSAgICBhY19jdl9wcm9nX0NQUD0kQ1BQCi0KLWZpCi0gIENQUD0kYWNfY3ZfcHJvZ19DUFAKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9JENQUAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJENQUCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kQ1BQIiA+JjY7IH0KLWFjX3ByZXByb2Nfb2s9ZmFsc2UKLWZvciBhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICcnIHllcwotZG8KLSAgIyBVc2UgYSBoZWFkZXIgZmlsZSB0aGF0IGNvbWVzIHdpdGggZ2NjLCBzbyBjb25maWd1cmluZyBnbGliYwotICAjIHdpdGggYSBmcmVzaCBjcm9zcy1jb21waWxlciB3b3Jrcy4KLSAgIyBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICMgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLiAiU3ludGF4IGVycm9yIiBpcyBoZXJlIHRvIGNhdGNoIHRoaXMgY2FzZS4KLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCQkgICAgIFN5bnRheCBlcnJvcgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gICMgQnJva2VuOiBmYWlscyBvbiB2YWxpZCBpbnB1dC4KLWNvbnRpbnVlCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotCi0gICMgT0ssIHdvcmtzIG9uIHNhbmUgY2FzZXMuICBOb3cgY2hlY2sgd2hldGhlciBub25leGlzdGVudCBoZWFkZXJzCi0gICMgY2FuIGJlIGRldGVjdGVkIGFuZCBob3cuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPGFjX25vbmV4aXN0ZW50Lmg+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICAjIEJyb2tlbjogc3VjY2VzcyBvbiBpbnZhbGlkIGlucHV0LgotY29udGludWUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICAjIFBhc3NlcyBib3RoIHRlc3RzLgotYWNfcHJlcHJvY19vaz06Ci1icmVhawotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLQotZG9uZQotIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAotaWYgJGFjX3ByZXByb2Nfb2s7IHRoZW4KLSAgOgotZWxzZQotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBDIHByZXByb2Nlc3NvciBcIiRDUFBcIiBmYWlscyBzYW5pdHkgY2hlY2sKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IEMgcHJlcHJvY2Vzc29yIFwiJENQUFwiIGZhaWxzIHNhbml0eSBjaGVjawotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLWFjX2V4dD1jCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JwotYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKLWFjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfR1JFUCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdyZXAgZ2dyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0Ci1pZiB0ZXN0IC16ICIkR1JFUCI7IHRoZW4KLXNldCBkdW1teSBncmVwIGdncmVwOyBhY19wcm9nX25hbWU9JDIKLWlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQotIyBMb29wIHRocm91Z2ggdGhlIHVzZXIncyBwYXRoIGFuZCB0ZXN0IGZvciBlYWNoIG9mIFBST0dOQU1FLUxJU1QKLWFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKLWZvciBhc19kaXIgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluCi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCi0gIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotICAgIGFjX3BhdGhfR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCi0gICAgIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfR1JFUAotY2FzZSBgIiRhY19wYXRoX0dSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgotKkdOVSopCi0gIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIgYWNfcGF0aF9HUkVQX2ZvdW5kPTo7OwotKikKLSAgYWNfY291bnQ9MAotICBlY2hvICRFQ0hPX04gIjAxMjM0NTY3ODkkRUNIT19DIiA+ImNvbmZ0ZXN0LmluIgotICB3aGlsZSA6Ci0gIGRvCi0gICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKLSAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCi0gICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCi0gICAgZWNobyAnR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9HUkVQIiAtZSAnR1JFUCQnIC1lICctKGNhbm5vdCBtYXRjaCktJyA8ICJjb25mdGVzdC5ubCIgPiJjb25mdGVzdC5vdXQiIDI+L2Rldi9udWxsIHx8IGJyZWFrCi0gICAgZGlmZiAiY29uZnRlc3Qub3V0IiAiY29uZnRlc3QubmwiID4vZGV2L251bGwgMj4mMSB8fCBicmVhawotICAgIGFjX2NvdW50PWBleHByICRhY19jb3VudCArIDFgCi0gICAgaWYgdGVzdCAkYWNfY291bnQgLWd0ICR7YWNfcGF0aF9HUkVQX21heC0wfTsgdGhlbgotICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCi0gICAgICBhY19jdl9wYXRoX0dSRVA9IiRhY19wYXRoX0dSRVAiCi0gICAgICBhY19wYXRoX0dSRVBfbWF4PSRhY19jb3VudAotICAgIGZpCi0gICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAotICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhawotICBkb25lCi0gIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OwotZXNhYwotCi0KLSAgICAkYWNfcGF0aF9HUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgZG9uZQotZG9uZQotCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLQotR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLWlmIHRlc3QgLXogIiRHUkVQIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLWVsc2UKLSAgYWNfY3ZfcGF0aF9HUkVQPSRHUkVQCi1maQotCi0KLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0dSRVAiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3BhdGhfR1JFUCIgPiY2OyB9Ci0gR1JFUD0iJGFjX2N2X3BhdGhfR1JFUCIKLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgZWdyZXAiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZWdyZXAuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfRUdSRVArc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKLSAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCi0gICBlbHNlCi0gICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZWdyZXAiIHRvIHVzZSBpbiBtc2cgb3V0cHV0Ci1pZiB0ZXN0IC16ICIkRUdSRVAiOyB0aGVuCi1zZXQgZHVtbXkgZWdyZXA7IGFjX3Byb2dfbmFtZT0kMgotaWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX3BhdGhfRUdSRVBfZm91bmQ9ZmFsc2UKLSMgTG9vcCB0aHJvdWdoIHRoZSB1c2VyJ3MgcGF0aCBhbmQgdGVzdCBmb3IgZWFjaCBvZiBQUk9HTkFNRS1MSVNUCi1hc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICBmb3IgYWNfcHJvZyBpbiBlZ3JlcDsgZG8KLSAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCi0gICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKLSAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0VHUkVQIiAmJiAkYXNfdGVzdF94ICIkYWNfcGF0aF9FR1JFUCI7IH0gfHwgY29udGludWUKLSAgICAjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9FR1JFUCBhbmQgc2VsZWN0IGl0IGlmIGl0IGlzIGZvdW5kLgotICAjIENoZWNrIGZvciBHTlUgJGFjX3BhdGhfRUdSRVAKLWNhc2UgYCIkYWNfcGF0aF9FR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCi0qR05VKikKLSAgYWNfY3ZfcGF0aF9FR1JFUD0iJGFjX3BhdGhfRUdSRVAiIGFjX3BhdGhfRUdSRVBfZm91bmQ9Ojs7Ci0qKQotICBhY19jb3VudD0wCi0gIGVjaG8gJEVDSE9fTiAiMDEyMzQ1Njc4OSRFQ0hPX0MiID4iY29uZnRlc3QuaW4iCi0gIHdoaWxlIDoKLSAgZG8KLSAgICBjYXQgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QuaW4iID4iY29uZnRlc3QudG1wIgotICAgIG12ICJjb25mdGVzdC50bXAiICJjb25mdGVzdC5pbiIKLSAgICBjcCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5ubCIKLSAgICBlY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgotICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhawotICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKLSAgICBhY19jb3VudD1gZXhwciAkYWNfY291bnQgKyAxYAotICAgIGlmIHRlc3QgJGFjX2NvdW50IC1ndCAke2FjX3BhdGhfRUdSRVBfbWF4LTB9OyB0aGVuCi0gICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKLSAgICAgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIgotICAgICAgYWNfcGF0aF9FR1JFUF9tYXg9JGFjX2NvdW50Ci0gICAgZmkKLSAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCi0gICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCi0gIGRvbmUKLSAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Ci1lc2FjCi0KLQotICAgICRhY19wYXRoX0VHUkVQX2ZvdW5kICYmIGJyZWFrIDMKLSAgZG9uZQotZG9uZQotCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLQotRUdSRVA9IiRhY19jdl9wYXRoX0VHUkVQIgotaWYgdGVzdCAteiAiJEVHUkVQIjsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBubyBhY2NlcHRhYmxlICRhY19wcm9nX25hbWUgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgJGFjX3Byb2dfbmFtZSBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWZpCi0KLWVsc2UKLSAgYWNfY3ZfcGF0aF9FR1JFUD0kRUdSRVAKLWZpCi0KLQotICAgZmkKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wYXRoX0VHUkVQIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KLSBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfaGVhZGVyX3N0ZGMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLQotaW50Ci1tYWluICgpCi17Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpZiAoKCcgJyAmIDB4MEZGKSA9PSAweDAyMCkKLSMgZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNlbHNlCi0jIGRlZmluZSBJU0xPV0VSKGMpIFwKLQkJICAgKCgnYScgPD0gKGMpICYmIChjKSA8PSAnaScpIFwKLQkJICAgICB8fCAoJ2onIDw9IChjKSAmJiAoYykgPD0gJ3InKSBcCi0JCSAgICAgfHwgKCdzJyA8PSAoYykgJiYgKGMpIDw9ICd6JykpCi0jIGRlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gKChjKSB8IDB4NDApIDogKGMpKQotI2VuZGlmCi0KLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBpZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpCi0JfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpCi0gICAgICByZXR1cm4gMjsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWZpCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl9zdGRjIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1fQUNFT0YKLQotZmkKLQotIyBPbiBJUklYIDUuMywgc3lzL3R5cGVzIGFuZCBpbnR0eXBlcy5oIGFyZSBjb25mbGljdGluZy4KLQotCi0KLQotCi0KLQotCi0KLWZvciBhY19oZWFkZXIgaW4gc3lzL3R5cGVzLmggc3lzL3N0YXQuaCBzdGRsaWIuaCBzdHJpbmcuaCBtZW1vcnkuaCBzdHJpbmdzLmggXAotCQkgIGludHR5cGVzLmggc3RkaW50LmggdW5pc3RkLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLQotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotCi0KLQotZm9yIGFjX2hlYWRlciBpbiBmY250bC5oIHJwYy9ycGNlbnQuaCBuZXRkbmV0L2RuZXRkYi5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWVsc2UKLSAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotICB5ZXM6bm86ICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQotZm9yIGFjX2hlYWRlciBpbiBuZXQvcGZ2YXIuaAotZG8KLWFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPgotCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfSGVhZGVyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY19IZWFkZXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPT0geWVzOyB0aGVuCi0JTE9DQUxTUkM9InByaW50LXBmbG9nLmMgJExPQ0FMU1JDIgotZmkKLQotZm9yIGFjX2hlYWRlciBpbiBuZXRpbmV0L2lmX2V0aGVyLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAhPSB5ZXM7IHRoZW4KLQkjCi0JIyBUaGUgc2ltcGxlIHRlc3QgZGlkbid0IHdvcmsuCi0JIyBEbyB3ZSBuZWVkIHRvIGluY2x1ZGUgPG5ldC9pZi5oPiBmaXJzdD8KLQkjIFVuc2V0IGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2ggc28gd2UgZG9uJ3QKLQkjIHRyZWF0IHRoZSBwcmV2aW91cyBmYWlsdXJlIGFzIGEgY2FjaGVkIHZhbHVlIGFuZAotCSMgc3VwcHJlc3MgdGhlIG5leHQgdGVzdC4KLQkjCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogUmVjaGVja2luZyB3aXRoIHNvbWUgYWRkaXRpb25hbCBpbmNsdWRlcyIgPiY1Ci1lY2hvICIkYXNfbWU6IFJlY2hlY2tpbmcgd2l0aCBzb21lIGFkZGl0aW9uYWwgaW5jbHVkZXMiID4mNjt9Ci0JdW5zZXQgYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaAotCi1mb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvaWZfZXRoZXIuaAotZG8KLWFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLXN0cnVjdCBtYnVmOwotc3RydWN0IHJ0ZW50cnk7Ci0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oZWFkZXJfdGltZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotaW50Ci1tYWluICgpCi17Ci1pZiAoKHN0cnVjdCB0bSAqKSAwKQotcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oZWFkZXJfdGltZT1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl90aW1lID0geWVzOyB0aGVuCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFRJTUVfV0lUSF9TWVNfVElNRSAxCi1fQUNFT0YKLQotZmkKLQotCi1jYXNlICIkaG9zdF9vcyIgaW4KLQotbGludXgqKQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIExpbnV4IGtlcm5lbCB2ZXJzaW9uIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgTGludXgga2VybmVsIHZlcnNpb24uLi4gJEVDSE9fQyIgPiY2OyB9Ci0gCWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gCQlpZiB0ZXN0ICIke2FjX2N2X2xpbnV4X3ZlcnMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY3ZfbGludXhfdmVycz11bmtub3duCi1maQotCi0gCWVsc2UKLSAJCWlmIHRlc3QgIiR7YWNfY3ZfbGludXhfdmVycytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jdl9saW51eF92ZXJzPWB1bmFtZSAtciAyPiYxIHwgXAotIAkJCXNlZCAtbiAtZSAnJHMvLiogLy8nIC1lICckcy9cLi4qLy9wJ2AKLWZpCi0KLSAJZmkKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saW51eF92ZXJzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saW51eF92ZXJzIiA+JjY7IH0KLSAJaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyA9IHVua25vd24gOyB0aGVuCi0gCQl7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgZGV0ZXJtaW5lIGxpbnV4IHZlcnNpb24gd2hlbiBjcm9zcy1jb21waWxpbmciID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGRldGVybWluZSBsaW51eCB2ZXJzaW9uIHdoZW4gY3Jvc3MtY29tcGlsaW5nIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gCWZpCi0JaWYgdGVzdCAkYWNfY3ZfbGludXhfdmVycyAtbHQgMiA7IHRoZW4KLQkJeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogdmVyc2lvbiAyIG9yIGhpZ2hlciByZXF1aXJlZDsgc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IHZlcnNpb24gMiBvciBoaWdoZXIgcmVxdWlyZWQ7IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCWZpCi0JOzsKLQotKikKLQk7OwotZXNhYwotCi0KLQotZm9yIGFjX2hlYWRlciBpbiBzbWkuaAotZG8KLWFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hlYWRlcl9jb21waWxlcj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQotCi0jIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLWNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KLSAgeWVzOm5vOiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0gICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gICAgOzsKLSAgbm86eWVzOiogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0KLSAgICA7OwotZXNhYwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci0KLWZpCi1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzbWlJbml0IGluIC1sc21pIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNtaUluaXQgaW4gLWxzbWkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9zbWlfc21pSW5pdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNtaSAgJExJQlMiCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBzbWlJbml0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc21pSW5pdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl9zbWlfc21pSW5pdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9zbWlfc21pSW5pdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3NtaV9zbWlJbml0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfc21pX3NtaUluaXQiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX3NtaV9zbWlJbml0ID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJTTUkgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxzbWkgJExJQlMiCi0KLWZpCi0KLWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfc21pX2giID0geWVzIC1hICIkYWNfY3ZfbGliX3NtaV9zbWlJbml0IiA9IHllcwotdGhlbgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbGlic21pIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbGlic21pLi4uICRFQ0hPX0MiID4mNjsgfQotICAgICAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub3Qgd2hlbiBjcm9zcy1jb21waWxpbmciID4mNQotZWNobyAiJHtFQ0hPX1R9bm90IHdoZW4gY3Jvc3MtY29tcGlsaW5nIiA+JjY7IH0KLSAgbGlic21pPW5vCi0KLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0gLyogbGlic21pIGF2YWlsYWJsZSBjaGVjayAqLwotI2luY2x1ZGUgPHNtaS5oPgotbWFpbigpCi17Ci0gIGludCBjdXJyZW50LCByZXZpc2lvbiwgYWdlLCBuOwotICBjb25zdCBpbnQgcmVxdWlyZWQgPSAyOwotICBpZiAoc21pSW5pdCgiIikpCi0gICAgZXhpdCgxKTsKLSAgaWYgKHN0cmNtcChTTUlfTElCUkFSWV9WRVJTSU9OLCBzbWlfbGlicmFyeV92ZXJzaW9uKSkKLSAgICBleGl0KDIpOwotICBuID0gc3NjYW5mKHNtaV9saWJyYXJ5X3ZlcnNpb24sICIlZDolZDolZCIsICZjdXJyZW50LCAmcmV2aXNpb24sICZhZ2UpOwotICBpZiAobiAhPSAzKQotICAgIGV4aXQoMyk7Ci0gIGlmIChyZXF1aXJlZCA8IGN1cnJlbnQgLSBhZ2UgfHwgcmVxdWlyZWQgPiBjdXJyZW50KQotICAgIGV4aXQoNCk7Ci0gIGV4aXQoMCk7Ci19Ci0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLSAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0gIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIExJQlNNSSAxCi1fQUNFT0YKLQotICBsaWJzbWk9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci1lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0oIGV4aXQgJGFjX3N0YXR1cyApCi0gY2FzZSAkPyBpbgotICAxKSB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIC0gc21pSW5pdCBmYWlsZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm8gLSBzbWlJbml0IGZhaWxlZCIgPiY2OyB9IDs7Ci0gIDIpIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8gLSBoZWFkZXIvbGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIC0gaGVhZGVyL2xpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCIgPiY2OyB9IDs7Ci0gIDMpIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8gLSBjYW4ndCBkZXRlcm1pbmUgbGlicmFyeSB2ZXJzaW9uIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIC0gY2FuJ3QgZGV0ZXJtaW5lIGxpYnJhcnkgdmVyc2lvbiIgPiY2OyB9IDs7Ci0gIDQpIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8gLSB0b28gb2xkIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIC0gdG9vIG9sZCIgPiY2OyB9IDs7Ci0gICopIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfSA7OwotICBlc2FjCi0gIGxpYnNtaT1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc21iIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NtYitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9JGVuYWJsZV9zbWI7Ci1lbHNlCi0gIGVuYWJsZXZhbD15ZXMKLWZpCi0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogVGhlIFNNQiBwcmludGVyIG1heSBoYXZlIGV4cGxvaXRhYmxlIGJ1ZmZlciBvdmVyZmxvd3MhISEiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiBUaGUgU01CIHByaW50ZXIgbWF5IGhhdmUgZXhwbG9pdGFibGUgYnVmZmVyIG92ZXJmbG93cyEhISIgPiYyO30KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBUQ1BEVU1QX0RPX1NNQiAxCi1fQUNFT0YKLQotCUxPQ0FMU1JDPSJwcmludC1zbWIuYyBzbWJ1dGlsLmMgJExPQ0FMU1JDIgotCTs7Ci0qKQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQk7OwotZXNhYwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtdXNlciB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfdXNlcitzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSR3aXRoX3VzZXI7Ci1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGJ5IGRlZmF1bHQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICEgLXogIiR3aXRoX3VzZXIiIDsgdGhlbgotICAgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFdJVEhfVVNFUiAiJHdpdGh2YWwiCi1fQUNFT0YKLQotICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogdG8gXCIkd2l0aHZhbFwiIiA+JjUKLWVjaG8gIiR7RUNIT19UfXRvIFwiJHdpdGh2YWxcIiIgPiY2OyB9Ci1lbHNlCi0gICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY2hyb290IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9jaHJvb3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0kd2l0aF9jaHJvb3Q7Ci1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHRvIGNocm9vdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgdG8gY2hyb290Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAhIC16ICIkd2l0aF9jaHJvb3QiIDsgdGhlbgotICAgICAgICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFdJVEhfQ0hST09UICIkd2l0aHZhbCIKLV9BQ0VPRgotCi0gICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB0byBcIiR3aXRodmFsXCIiID4mNQotZWNobyAiJHtFQ0hPX1R9dG8gXCIkd2l0aHZhbFwiIiA+JjY7IH0KLWVsc2UKLSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIGlwdjYiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBpcHY2Li4uICRFQ0hPX0MiID4mNjsgfQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWlwdjYgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfaXB2NitzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9JGVuYWJsZV9pcHY2OyAgY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotICAgICAgIExPQ0FMU1JDPSJwcmludC1pcDYuYyBwcmludC1pcDZvcHRzLmMgcHJpbnQtbW9iaWxpdHkuYyBwcmludC1yaXBuZy5jIHByaW50LWljbXA2LmMgcHJpbnQtZnJhZzYuYyBwcmludC1ydDYuYyBwcmludC1vc3BmNi5jIHByaW50LWRoY3A2LmMgJExPQ0FMU1JDIgotICAgICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIElORVQ2IDEKLV9BQ0VPRgotCi0gICAgICAgaXB2Nj15ZXMKLSAgICAgICA7OwotKikKLSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSAgICAgICBpcHY2PW5vCi0gICAgICAgOzsKLSAgZXNhYwotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0gIGlwdjY9bm8KLQotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSAvKiBBRl9JTkVUNiBhdmFpbGFibGUgY2hlY2sgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci1tYWluKCkKLXsKLSBpZiAoc29ja2V0KEFGX0lORVQ2LCBTT0NLX1NUUkVBTSwgMCkgPCAwKQotICAgZXhpdCgxKTsKLSBlbHNlCi0gICBleGl0KDApOwotfQotCi1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotICBMT0NBTFNSQz0icHJpbnQtaXA2LmMgcHJpbnQtaXA2b3B0cy5jIHByaW50LW1vYmlsaXR5LmMgcHJpbnQtcmlwbmcuYyBwcmludC1pY21wNi5jIHByaW50LWZyYWc2LmMgcHJpbnQtcnQ2LmMgcHJpbnQtb3NwZjYuYyBwcmludC1kaGNwNi5jICRMT0NBTFNSQyIKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSU5FVDYgMQotX0FDRU9GCi0KLSAgaXB2Nj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLSB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSAgaXB2Nj1ubwotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi1maQotCi0KLWlwdjZ0eXBlPXVua25vd24KLWlwdjZsaWI9bm9uZQotaXB2NnRyeWxpYmM9bm8KLQotaWYgdGVzdCAiJGlwdjYiID0gInllcyI7IHRoZW4KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpcHY2IHN0YWNrIHR5cGUiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBpcHY2IHN0YWNrIHR5cGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JZm9yIGkgaW4gaW5yaWEga2FtZSBsaW51eC1nbGliYyBsaW51eC1saWJpbmV0NiB0b3NoaWJhIHY2ZCB6ZXRhOyBkbwotCQljYXNlICRpIGluCi0JCWlucmlhKQotCQkJCQkJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2lmZGVmIElQVjZfSU5SSUFfVkVSU0lPTgoteWVzCi0jZW5kaWYKLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGlwdjZ0eXBlPSRpOwotCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0JCQk7OwotCQlrYW1lKQotCQkJCQkJY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2lmZGVmIF9fS0FNRV9fCi15ZXMKLSNlbmRpZgotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAieWVzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgaXB2NnR5cGU9JGk7Ci0JCQkJaXB2NmxpYj1pbmV0NjsKLQkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwotCQkJCWlwdjZ0cnlsaWJjPXllczsKLQkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotCQkJOzsKLQkJbGludXgtZ2xpYmMpCi0JCQkJCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotI2lmIGRlZmluZWQoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMiAmJiBfX0dMSUJDX01JTk9SX18gPj0gMQoteWVzCi0jZW5kaWYKLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGlwdjZ0eXBlPSRpOwotCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0JCQk7OwotCQlsaW51eC1saWJpbmV0NikKLQkJCQkJCQkJCQkJCQkJCQkJCWlmIHRlc3QgLWQgL3Vzci9pbmV0NiAtbyAtZiAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pcDYuaDsgdGhlbgotCQkJCWlwdjZ0eXBlPSRpCi0JCQkJaXB2NmxpYj1pbmV0NgotCQkJCWlwdjZsaWJkaXI9L3Vzci9pbmV0Ni9saWIKLQkJCQlpcHY2dHJ5bGliYz15ZXM7Ci0JCQkJQ0ZMQUdTPSItRElORVQ2IC1JL3Vzci9pbmV0Ni9pbmNsdWRlICRDRkxBR1MiCi0JCQlmaQotCQkJOzsKLQkJdG9zaGliYSkKLQkJCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIF9UT1NISUJBX0lORVQ2Ci15ZXMKLSNlbmRpZgotX0FDRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gICRFR1JFUCAieWVzIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgaXB2NnR5cGU9JGk7Ci0JCQkJaXB2NmxpYj1pbmV0NjsKLQkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwotCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0JCQk7OwotCQl2NmQpCi0JCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDwvdXNyL2xvY2FsL3Y2L2luY2x1ZGUvc3lzL3Y2Y29uZmlnLmg+Ci0jaWZkZWYgX19WNkRfXwoteWVzCi0jZW5kaWYKLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGlwdjZ0eXBlPSRpOwotCQkJCWlwdjZsaWI9djY7Ci0JCQkJaXB2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKLQkJCQlDRkxBR1M9Ii1JL3Vzci9sb2NhbC92Ni9pbmNsdWRlICRDRkxBR1MiCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLQkJCTs7Ci0JCXpldGEpCi0JCQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBfWkVUQV9NSU5BTUlfSU5FVDYKLXllcwotI2VuZGlmCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBpcHY2dHlwZT0kaTsKLQkJCQlpcHY2bGliPWluZXQ2OwotCQkJCWlwdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7Ci0JCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLQkJCTs7Ci0JCWVzYWMKLQkJaWYgdGVzdCAiJGlwdjZ0eXBlIiAhPSAidW5rbm93biI7IHRoZW4KLQkJCWJyZWFrCi0JCWZpCi0JZG9uZQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGlwdjZ0eXBlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRpcHY2dHlwZSIgPiY2OyB9Ci1maQotCi1pZiB0ZXN0ICIkaXB2NiIgPSAieWVzIiAtYSAiJGlwdjZsaWIiICE9ICJub25lIjsgdGhlbgotCWlmIHRlc3QgLWQgJGlwdjZsaWJkaXIgLWEgLWYgJGlwdjZsaWJkaXIvbGliJGlwdjZsaWIuYTsgdGhlbgotCQlMSUJTPSItTCRpcHY2bGliZGlyIC1sJGlwdjZsaWIgJExJQlMiCi0JCWVjaG8gIllvdSBoYXZlICRpcHY2bGliIGxpYnJhcnksIHVzaW5nIGl0IgotCWVsc2UKLQkJaWYgdGVzdCAiJGlwdjZ0cnlsaWJjIiA9ICJ5ZXMiOyB0aGVuCi0JCQllY2hvICJZb3UgZG8gbm90IGhhdmUgJGlwdjZsaWIgbGlicmFyeSwgdXNpbmcgbGliYyIKLQkJZWxzZQotCQkJZWNobyAnRmF0YWw6IG5vICRpcHY2bGliIGxpYnJhcnkgZm91bmQuICBjYW5ub3QgY29udGludWUuJwotCQkJZWNobyAiWW91IG5lZWQgdG8gZmV0Y2ggbGliJGlwdjZsaWIuYSBmcm9tIGFwcHJvcHJpYXRlIgotCQkJZWNobyAnaXB2NiBraXQgYW5kIGNvbXBpbGUgYmVmb3JlaGFuZC4nCi0JCQlleGl0IDEKLQkJZmkKLQlmaQotZmkKLQotCi1pZiB0ZXN0ICIkaXB2NiIgPSAieWVzIjsgdGhlbgotCSMKLQkjIFhYWCAtIG9uIFRydTY0IFVOSVggNS4xLCB0aGVyZSBpcyBubyAiZ2V0YWRkcmluZm8oKSIKLQkjIGZ1bmN0aW9uIGluIGxpYmM7IHRoZXJlIGFyZSAibmdldGFkZHJpbmZvKCkiIGFuZAotCSMgIm9nZXRhZGRyaW5mbygpIiBmdW5jdGlvbnMsIGFuZCA8bmV0ZGIuaD4gI2RlZmluZXMKLQkjICJnZXRhZGRyaW5mbyIgdG8gYmUgZWl0aGVyICJuZ2V0YWRkcmluZm8iIG9yCi0JIyAib2dldGFkZHJpbmZvIiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgX1NPQ0tBRERSX0xFTgotCSMgb3IgX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCBhcmUgZGVmaW5lZCBvciBub3QuCi0JIwotCSMgU28gdGhpcyB0ZXN0IGRvZXNuJ3Qgd29yayBvbiBUcnU2NCA1LjEsIGFuZCBwb3NzaWJseQotCSMgb24gb3RoZXIgNS54IHJlbGVhc2VzLiAgVGhpcyBjYXVzZXMgdGhlIGNvbmZpZ3VyZQotCSMgc2NyaXB0IHRvIGJlY29tZSBjb25mdXNlZCwgYW5kIHJlc3VsdHMgaW4gbGlicGNhcAotCSMgYmVpbmcgdW5idWlsZGFibGUuCi0JIwotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0YWRkcmluZm8iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldGFkZHJpbmZvLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRhZGRyaW5mbyAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldGFkZHJpbmZvICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfbGliIGluICcnIHNvY2tldDsgZG8KLSAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KLSAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCi0gIGVsc2UKLSAgICBhY19yZXM9LWwkYWNfbGliCi0gICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgotICBmaQotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX2dldGFkZHJpbmZvPSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGFkZHJpbmZvK3NldH0iID0gc2V0OyB0aGVuCi0gIGJyZWFrCi1maQotZG9uZQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9zZWFyY2hfZ2V0YWRkcmluZm89bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZ2V0YWRkcmluZm8iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9nZXRhZGRyaW5mbyIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRhZGRyaW5mbwotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLSAgCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGdldGFkZHJpbmZvIGJ1ZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGdldGFkZHJpbmZvIGJ1Zy4uLiAkRUNIT19DIiA+JjY7IH0KLQlpZiB0ZXN0ICIke3RkX2N2X2J1Z2d5Z2V0YWRkcmluZm8rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbz15ZXMKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLW1haW4oKQotewotICBpbnQgcGFzc2l2ZSwgZ2FpZXJyLCBpbmV0NCA9IDAsIGluZXQ2ID0gMDsKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKLSAgY2hhciBzdHJhZGRyW0lORVQ2X0FERFJTVFJMRU5dLCBzdHJwb3J0WzE2XTsKLQotICBmb3IgKHBhc3NpdmUgPSAwOyBwYXNzaXZlIDw9IDE7IHBhc3NpdmUrKykgewotICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKLSAgICBoaW50cy5haV9mbGFncyA9IHBhc3NpdmUgPyBBSV9QQVNTSVZFIDogMDsKLSAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICAgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7Ci0gICAgaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhOVUxMLCAiNTQzMjEiLCAmaGludHMsICZhaXRvcCkpICE9IDApIHsKLSAgICAgICh2b2lkKWdhaV9zdHJlcnJvcihnYWllcnIpOwotICAgICAgZ290byBiYWQ7Ci0gICAgfQotICAgIGZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKLSAgICAgIGlmIChhaS0+YWlfYWRkciA9PSBOVUxMIHx8Ci0gICAgICAgICAgYWktPmFpX2FkZHJsZW4gPT0gMCB8fAotICAgICAgICAgIGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJhZGRyLCBzaXplb2Yoc3RyYWRkciksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgewotICAgICAgICBnb3RvIGJhZDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoYWktPmFpX2ZhbWlseSkgewotICAgICAgY2FzZSBBRl9JTkVUOgotICAgICAgICBpZiAoc3RyY21wKHN0cnBvcnQsICI1NDMyMSIpICE9IDApIHsKLSAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFzc2l2ZSkgewotICAgICAgICAgIGlmIChzdHJjbXAoc3RyYWRkciwgIjAuMC4wLjAiKSAhPSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHN0cmNtcChzdHJhZGRyLCAiMTI3LjAuMC4xIikgIT0gMCkgewotICAgICAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluZXQ0Kys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBRl9JTkVUNjoKLSAgICAgICAgaWYgKHN0cmNtcChzdHJwb3J0LCAiNTQzMjEiKSAhPSAwKSB7Ci0gICAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhc3NpdmUpIHsKLSAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICI6OiIpICE9IDApIHsKLSAgICAgICAgICAgIGdvdG8gYmFkOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICI6OjEiKSAhPSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5ldDYrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFGX1VOU1BFQzoKLSAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgIGJyZWFrOwotI2lmZGVmIEFGX1VOSVgKLSAgICAgIGNhc2UgQUZfVU5JWDoKLSNlbHNlCi0jaWZkZWYgQUZfTE9DQUwKLSAgICAgIGNhc2UgQUZfTE9DQUw6Ci0jZW5kaWYKLSNlbmRpZgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogYW5vdGhlciBmYW1pbHkgc3VwcG9ydD8gKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc3VwcG9ydGVkIGZhbWlseSBzaG91bGQgYmUgMiwgdW5zdXBwb3J0ZWQgZmFtaWx5IHNob3VsZCBiZSAwICovCi0gIGlmICghKGluZXQ0ID09IDAgfHwgaW5ldDQgPT0gMikpCi0gICAgZ290byBiYWQ7Ci0gIGlmICghKGluZXQ2ID09IDAgfHwgaW5ldDYgPT0gMikpCi0gICAgZ290byBiYWQ7Ci0KLSAgaWYgKGFpdG9wKQotICAgIGZyZWVhZGRyaW5mbyhhaXRvcCk7Ci0gIGV4aXQoMCk7Ci0KLSBiYWQ6Ci0gIGlmIChhaXRvcCkKLSAgICBmcmVlYWRkcmluZm8oYWl0b3ApOwotICBleGl0KDEpOwotfQotCi1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm89bm8KLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLXRkX2N2X2J1Z2d5Z2V0YWRkcmluZm89eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWZpCi0KLQlpZiB0ZXN0ICIkdGRfY3ZfYnVnZ3lnZXRhZGRyaW5mbyIgPSBubzsgdGhlbgotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGdvb2QiID4mNQotZWNobyAiJHtFQ0hPX1R9Z29vZCIgPiY2OyB9Ci0JZWxzZQotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGJ1Z2d5IiA+JjUKLWVjaG8gIiR7RUNIT19UfWJ1Z2d5IiA+JjY7IH0KLQlmaQotCi0JaWYgdGVzdCAiJHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm8iID0gInllcyI7IHRoZW4KLQkJIwotCQkjIFhYWCAtIGl0IGRvZXNuJ3QgYXBwZWFyIHRoYXQgImlwdjZ0eXBlIiBjYW4gZXZlciBiZQotCQkjIHNldCB0byAibGludXgiLiAgU2hvdWxkIHRoaXMgYmUgdGVzdGluZyBmb3IKLQkJIyAibGludXgtZ2xpYmMiLCBvciBmb3IgdGhhdCAqb3IqICJsaW51eC1saWJpbmV0NiI/Ci0JCSMgSWYgdGhlIGxhdHRlciwgbm90ZSB0aGF0ICJsaW51eC1saWJpbmV0NiIgaXMgYWxzbwotCQkjIHRoZSB0eXBlIGdpdmVuIHRvIHNvbWUgbm9uLUxpbnV4IE9TZXMuCi0JCSMKLQkJaWYgdGVzdCAiJGlwdjZ0eXBlIiAhPSAibGludXgiOyB0aGVuCi0JCQllY2hvICdGYXRhbDogWW91IG11c3QgZ2V0IHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4nCi0JCQllY2hvICcgICAgICAgb3IgeW91IGNhbiBzcGVjaWZ5ICItLWRpc2FibGUtaXB2NiInLgotCQkJZXhpdCAxCi0JCWVsc2UKLQkJCWVjaG8gJ1dhcm5pbmc6IGdldGFkZHJpbmZvKCkgaW1wbGVtZW50YXRpb24gb24geW91ciBzeXN0ZW0gc2VlbXMgYmUgYnVnZ3kuJwotCQkJZWNobyAnICAgICAgICAgQmV0dGVyIHVwZ3JhZGUgeW91ciBzeXN0ZW0gbGlicmFyeSB0byBuZXdlc3QgdmVyc2lvbicKLQkJCWVjaG8gJyAgICAgICAgIG9mIEdOVSBDIGxpYnJhcnkgKGFrYSBnbGliYykuJwotCQlmaQotCWZpCi0KLWZpCi0KLQotCi1mb3IgYWNfZnVuYyBpbiBnZXRhZGRyaW5mbyBnZXRuYW1laW5mbwotZG8KLWFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVmICRhY19mdW5jCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgJGFjX2Z1bmMgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuICRhY19mdW5jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfdmFyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZWxzZQotICBjYXNlICIgJExJQk9CSlMgIiBpbgotICAqIiAkYWNfZnVuYy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgJGFjX2Z1bmMuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1maQotZG9uZQotCi0KLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gbmV0ZG5ldC9kbmV0ZGIuaCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gbmV0ZG5ldC9kbmV0ZGIuaC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7dGRfY3ZfZGVjbF9uZXRkbmV0X2RuZXRkYl9oX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxuZXRkbmV0L2RuZXRkYi5oPgotCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJkbmV0X2h0b2EiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICB0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hPXllcwotZWxzZQotICB0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA+JjUKLWVjaG8gIiR7RUNIT19UfSR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA+JjY7IH0KLWlmIHRlc3QgIiR0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hIiA9IHllczsgdGhlbgotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfTkVURE5FVF9ETkVUREJfSF9ETkVUX0hUT0EgMQotX0FDRU9GCi0KLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBjaGFyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGNoYXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfY2hhcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci10eXBlZGVmIGNoYXIgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfY2hhcj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfY2hhcj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9jaGFyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2NoYXIiID4mNjsgfQotCi0jIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0jIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBjaGFyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBjaGFyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfY2hhcitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBjaGFyIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19sbz0wIGFjX21pZD0wCi0gIHdoaWxlIDo7IGRvCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBjaGFyIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkOyBicmVhawotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgY2hhciBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0tMSBhY19taWQ9LTEKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGNoYXIgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPSRhY19taWQ7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAotCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KLQkJCSAgYWNfbG89IGFjX2hpPQotCQkJICBicmVhawotCQkJZmkKLQkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPSBhY19oaT0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0jIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgotd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwotICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGNoYXIgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPSRhY19taWQKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLWNhc2UgJGFjX2xvIGluCi0/KikgYWNfY3Zfc2l6ZW9mX2NoYXI9JGFjX2xvOzsKLScnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9jaGFyIiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGNoYXIpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGNoYXIpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9jaGFyPTAKLSAgIGZpIDs7Ci1lc2FjCi1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgY2hhciBhY19fdHlwZV9zaXplb2ZfOwotc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotICBpZiAoISBmKQotICAgIHJldHVybiAxOwotICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0gICAgewotICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotICAgIH0KLSAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NpemVvZl9jaGFyPWBjYXQgY29uZnRlc3QudmFsYAotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfY2hhciIgPSB5ZXM7IHRoZW4KLSAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChjaGFyKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChjaGFyKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfY2hhcj0wCi0gICBmaQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvbmZ0ZXN0LnZhbAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9jaGFyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfY2hhciIgPiY2OyB9Ci0KLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9DSEFSICRhY19jdl9zaXplb2ZfY2hhcgotX0FDRU9GCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNob3J0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX3Nob3J0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLXR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfc2hvcnQ9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX3Nob3J0PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3Nob3J0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Nob3J0IiA+JjY7IH0KLQotIyBUaGUgY2FzdCB0byBsb25nIGludCB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIEhQIEMgQ29tcGlsZXIKLSMgdmVyc2lvbiBIUDkyNDUzLTAxIEIuMTEuMTEuMjM3MDkuR1AsIHdoaWNoIGluY29ycmVjdGx5IHJlamVjdHMKLSMgZGVjbGFyYXRpb25zIGxpa2UgYGludCBhM1tbKHNpemVvZiAodW5zaWduZWQgY2hhcikpID49IDBdXTsnLgotIyBUaGlzIGJ1ZyBpcyBIUCBTUiBudW1iZXIgODYwNjIyMzM2NC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHNpemUgb2Ygc2hvcnQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIHNob3J0Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2Zfc2hvcnQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgIyBEZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSwgY29tcHV0ZSB0aGUgbG8gYW5kIGhpIGJvdW5kcy4KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPTAgYWNfbWlkPTAKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIHNob3J0IGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkOyBicmVhawotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGk9LTEgYWNfbWlkPS0xCi0gIHdoaWxlIDo7IGRvCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfbG89JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89IGFjX2hpPQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi13aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCi0gIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgc2hvcnQgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPSRhY19taWQKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLWNhc2UgJGFjX2xvIGluCi0/KikgYWNfY3Zfc2l6ZW9mX3Nob3J0PSRhY19sbzs7Ci0nJykgaWYgdGVzdCAiJGFjX2N2X3R5cGVfc2hvcnQiID0geWVzOyB0aGVuCi0gICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoc2hvcnQpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2Zfc2hvcnQ9MAotICAgZmkgOzsKLWVzYWMKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBzaG9ydCBhY19fdHlwZV9zaXplb2ZfOwotc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotICBpZiAoISBmKQotICAgIHJldHVybiAxOwotICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0gICAgewotICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotICAgIH0KLSAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NpemVvZl9zaG9ydD1gY2F0IGNvbmZ0ZXN0LnZhbGAKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWlmIHRlc3QgIiRhY19jdl90eXBlX3Nob3J0IiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKHNob3J0KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChzaG9ydCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCA3Nyk7IGV4aXQgNzc7IH07IH0KLSAgIGVsc2UKLSAgICAgYWNfY3Zfc2l6ZW9mX3Nob3J0PTAKLSAgIGZpCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29uZnRlc3QudmFsCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX3Nob3J0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2Zfc2hvcnQiID4mNjsgfQotCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBTSVpFT0ZfU0hPUlQgJGFjX2N2X3NpemVvZl9zaG9ydAotX0FDRU9GCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLXR5cGVkZWYgaW50IGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX2ludD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfaW50PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQiID4mNjsgfQotCi0jIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0jIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBpbnQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGludC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2ludCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPTAgYWNfbWlkPTAKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGk9JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICRhY19taWQgKyAxYAotCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KLQkJCSAgYWNfbG89IGFjX2hpPQotCQkJICBicmVhawotCQkJZmkKLQkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBkb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0tMSBhY19taWQ9LTEKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGludCBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfbG89JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89IGFjX2hpPQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi13aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCi0gIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgaW50IGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1kb25lCi1jYXNlICRhY19sbyBpbgotPyopIGFjX2N2X3NpemVvZl9pbnQ9JGFjX2xvOzsKLScnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9pbnQiID0geWVzOyB0aGVuCi0gICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChpbnQpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9pbnQ9MAotICAgZmkgOzsKLWVzYWMKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBpbnQgYWNfX3R5cGVfc2l6ZW9mXzsKLXN0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotaW50Ci1tYWluICgpCi17Ci0KLSAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKLSAgaWYgKCEgZikKLSAgICByZXR1cm4gMTsKLSAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQotICAgIHsKLSAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCi0JcmV0dXJuIDE7Ci0gICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKLSAgICB9Ci0gIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICBhY19jdl9zaXplb2ZfaW50PWBjYXQgY29uZnRlc3QudmFsYAotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfaW50IiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGludCkKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAoaW50KQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfaW50PTAKLSAgIGZpCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29uZnRlc3QudmFsCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2ludCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2ludCIgPiY2OyB9Ci0KLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9JTlQgJGFjX2N2X3NpemVvZl9pbnQKLV9BQ0VPRgotCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb25nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci10eXBlZGVmIGxvbmcgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfbG9uZz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfbG9uZz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9sb25nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2xvbmciID4mNjsgfQotCi0jIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0jIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgc2l6ZSBvZiBsb25nLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zaXplb2ZfbG9uZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPj0gMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19sbz0wIGFjX21pZD0wCi0gIHdoaWxlIDo7IGRvCi0gICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkOyBicmVhawotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89YGV4cHIgJGFjX21pZCArIDFgCi0JCQlpZiB0ZXN0ICRhY19sbyAtbGUgJGFjX21pZDsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0tMSBhY19taWQ9LTEKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPSRhY19taWQ7IGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oaT1gZXhwciAnKCcgJGFjX21pZCAnKScgLSAxYAotCQkJaWYgdGVzdCAkYWNfbWlkIC1sZSAkYWNfaGk7IHRoZW4KLQkJCSAgYWNfbG89IGFjX2hpPQotCQkJICBicmVhawotCQkJZmkKLQkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0gIGRvbmUKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPSBhY19oaT0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0jIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgotd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwotICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYAotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8PSAkYWNfbWlkKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hpPSRhY19taWQKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWRvbmUKLWNhc2UgJGFjX2xvIGluCi0/KikgYWNfY3Zfc2l6ZW9mX2xvbmc9JGFjX2xvOzsKLScnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nIiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9sb25nPTAKLSAgIGZpIDs7Ci1lc2FjCi1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotc3RhdGljIGxvbmcgaW50IGxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludCB1bG9uZ3ZhbCAoKSB7IHJldHVybiAobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKTsgfQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci1pbnQKLW1haW4gKCkKLXsKLQotICBGSUxFICpmID0gZm9wZW4gKCJjb25mdGVzdC52YWwiLCAidyIpOwotICBpZiAoISBmKQotICAgIHJldHVybiAxOwotICBpZiAoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA8IDApCi0gICAgewotICAgICAgbG9uZyBpbnQgaSA9IGxvbmd2YWwgKCk7Ci0gICAgICBpZiAoaSAhPSAoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpKQotCXJldHVybiAxOwotICAgICAgZnByaW50ZiAoZiwgIiVsZFxuIiwgaSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgaSA9IHVsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbHVcbiIsIGkpOwotICAgIH0KLSAgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOwotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X3NpemVvZl9sb25nPWBjYXQgY29uZnRlc3QudmFsYAotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZyIgPSB5ZXM7IHRoZW4KLSAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfbG9uZz0wCi0gICBmaQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXJtIC1mIGNvbmZ0ZXN0LnZhbAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NpemVvZl9sb25nIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zaXplb2ZfbG9uZyIgPiY2OyB9Ci0KLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9MT05HICRhY19jdl9zaXplb2ZfbG9uZwotX0FDRU9GCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxvbmcgbG9uZyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsb25nIGxvbmcuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfbG9uZ19sb25nK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLXR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX2xvbmdfbG9uZz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfbG9uZ19sb25nPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmdfbG9uZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNjsgfQotCi0jIFRoZSBjYXN0IHRvIGxvbmcgaW50IHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgSFAgQyBDb21waWxlcgotIyB2ZXJzaW9uIEhQOTI0NTMtMDEgQi4xMS4xMS4yMzcwOS5HUCwgd2hpY2ggaW5jb3JyZWN0bHkgcmVqZWN0cwotIyBkZWNsYXJhdGlvbnMgbGlrZSBgaW50IGEzW1soc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSkgPj0gMF1dOycuCi0jIFRoaXMgYnVnIGlzIEhQIFNSIG51bWJlciA4NjA2MjIzMzY0LgoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgc2l6ZSBvZiBsb25nIGxvbmciID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBzaXplIG9mIGxvbmcgbG9uZy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICAjIERlcGVuZGluZyB1cG9uIHRoZSBzaXplLCBjb21wdXRlIHRoZSBsbyBhbmQgaGkgYm91bmRzLgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLWludAotbWFpbiAoKQotewotc3RhdGljIGludCB0ZXN0X2FycmF5IFsxIC0gMiAqICEoKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSA+PSAwKV07Ci10ZXN0X2FycmF5IFswXSA9IDAKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2xvPTAgYWNfbWlkPTAKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDw9ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGk9JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xvPWBleHByICRhY19taWQgKyAxYAotCQkJaWYgdGVzdCAkYWNfbG8gLWxlICRhY19taWQ7IHRoZW4KLQkJCSAgYWNfbG89IGFjX2hpPQotCQkJICBicmVhawotCQkJZmkKLQkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotICBkb25lCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQljYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpIDwgMCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0tMSBhY19taWQ9LTEKLSAgd2hpbGUgOjsgZG8KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0gICB0eXBlZGVmIGxvbmcgbG9uZyBhY19fdHlwZV9zaXplb2ZfOwotaW50Ci1tYWluICgpCi17Ci1zdGF0aWMgaW50IHRlc3RfYXJyYXkgWzEgLSAyICogISgoKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSkpID49ICRhY19taWQpXTsKLXRlc3RfYXJyYXkgWzBdID0gMAotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfbG89JGFjX21pZDsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hpPWBleHByICcoJyAkYWNfbWlkICcpJyAtIDFgCi0JCQlpZiB0ZXN0ICRhY19taWQgLWxlICRhY19oaTsgdGhlbgotCQkJICBhY19sbz0gYWNfaGk9Ci0JCQkgIGJyZWFrCi0JCQlmaQotCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgZG9uZQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbG89IGFjX2hpPQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCi13aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCi0gIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSAgIHR5cGVkZWYgbG9uZyBsb25nIGFjX190eXBlX3NpemVvZl87Ci1pbnQKLW1haW4gKCkKLXsKLXN0YXRpYyBpbnQgdGVzdF9hcnJheSBbMSAtIDIgKiAhKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPD0gJGFjX21pZCldOwotdGVzdF9hcnJheSBbMF0gPSAwCi0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oaT0kYWNfbWlkCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1kb25lCi1jYXNlICRhY19sbyBpbgotPyopIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9JGFjX2xvOzsKLScnKSBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9sb25nX2xvbmciID0geWVzOyB0aGVuCi0gICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IGNvbXB1dGUgc2l6ZW9mIChsb25nIGxvbmcpCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgNzcpOyBleGl0IDc3OyB9OyB9Ci0gICBlbHNlCi0gICAgIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9MAotICAgZmkgOzsKLWVzYWMKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotICAgdHlwZWRlZiBsb25nIGxvbmcgYWNfX3R5cGVfc2l6ZW9mXzsKLXN0YXRpYyBsb25nIGludCBsb25ndmFsICgpIHsgcmV0dXJuIChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpOyB9Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgdWxvbmd2YWwgKCkgeyByZXR1cm4gKGxvbmcgaW50KSAoc2l6ZW9mIChhY19fdHlwZV9zaXplb2ZfKSk7IH0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotaW50Ci1tYWluICgpCi17Ci0KLSAgRklMRSAqZiA9IGZvcGVuICgiY29uZnRlc3QudmFsIiwgInciKTsKLSAgaWYgKCEgZikKLSAgICByZXR1cm4gMTsKLSAgaWYgKCgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkgPCAwKQotICAgIHsKLSAgICAgIGxvbmcgaW50IGkgPSBsb25ndmFsICgpOwotICAgICAgaWYgKGkgIT0gKChsb25nIGludCkgKHNpemVvZiAoYWNfX3R5cGVfc2l6ZW9mXykpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGZwcmludGYgKGYsICIlbGRcbiIsIGkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW50IGkgPSB1bG9uZ3ZhbCAoKTsKLSAgICAgIGlmIChpICE9ICgobG9uZyBpbnQpIChzaXplb2YgKGFjX190eXBlX3NpemVvZl8pKSkpCi0JcmV0dXJuIDE7Ci0gICAgICBmcHJpbnRmIChmLCAiJWx1XG4iLCBpKTsKLSAgICB9Ci0gIHJldHVybiBmZXJyb3IgKGYpIHx8IGZjbG9zZSAoZikgIT0gMDsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPWBjYXQgY29uZnRlc3QudmFsYAotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotaWYgdGVzdCAiJGFjX2N2X3R5cGVfbG9uZ19sb25nIiA9IHllczsgdGhlbgotICAgICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY29tcHV0ZSBzaXplb2YgKGxvbmcgbG9uZykKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjb21wdXRlIHNpemVvZiAobG9uZyBsb25nKQotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDc3KTsgZXhpdCA3NzsgfTsgfQotICAgZWxzZQotICAgICBhY19jdl9zaXplb2ZfbG9uZ19sb25nPTAKLSAgIGZpCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotcm0gLWYgY29uZnRlc3QudmFsCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2l6ZW9mX2xvbmdfbG9uZyIgPiY2OyB9Ci0KLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIFNJWkVPRl9MT05HX0xPTkcgJGFjX2N2X3NpemVvZl9sb25nX2xvbmcKLV9BQ0VPRgotCi0KLQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYWRkcmluZm8iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYWRkcmluZm8uLi4gJEVDSE9fQyIgPiY2OyB9Ci0JaWYgdGVzdCAiJHthY19jdl9hZGRyaW5mbytzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwkJaW5jbHVkZSA8bmV0ZGIuaD4KLWludAotbWFpbiAoKQotewotc3RydWN0IGFkZHJpbmZvIGEKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9hZGRyaW5mbz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2FkZHJpbmZvPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9hZGRyaW5mbyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfYWRkcmluZm8iID4mNjsgfQotCWlmIHRlc3QgJGFjX2N2X2FkZHJpbmZvID0geWVzOyB0aGVuCi0JCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfQUREUklORk8gMQotX0FDRU9GCi0KLQllbHNlCi0JCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIE5FRURfQUREUklORk9fSCAxCi1fQUNFT0YKLQotCWZpCi0KLWlmIHRlc3QgIiRhY19jdl9hZGRyaW5mbyIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgTklfTUFYU0VSViIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBOSV9NQVhTRVJWLi4uICRFQ0hPX0MiID4mNjsgfQotCWlmIHRlc3QgIiR7YWNfY3ZfbWF4c2VyditzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2lmZGVmIE5JX01BWFNFUlYKLXllcwotI2VuZGlmCi1fQUNFT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgJEVHUkVQICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9tYXhzZXJ2PXllcwotZWxzZQotICBhY19jdl9tYXhzZXJ2PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tYXhzZXJ2IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9tYXhzZXJ2IiA+JjY7IH0KLQlpZiB0ZXN0ICRhY19jdl9tYXhzZXJ2ICE9IHllczsgdGhlbgotCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBORUVEX0FERFJJTkZPX0ggMQotX0FDRU9GCi0KLQlmaQotCi1pZiB0ZXN0ICIkYWNfY3ZfbWF4c2VydiIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgTklfTkFNRVJFUUQiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgTklfTkFNRVJFUUQuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JaWYgdGVzdCAiJHthY19jdl9uYW1lcmVxZCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2lmZGVmIE5JX05PRlFETgoteWVzCi0jZW5kaWYKLV9BQ0VPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICAkRUdSRVAgInllcyIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X25hbWVyZXFkPXllcwotZWxzZQotICBhY19jdl9uYW1lcmVxZD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbmFtZXJlcWQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X25hbWVyZXFkIiA+JjY7IH0KLQlpZiB0ZXN0ICRhY19jdl9uYW1lcmVxZCAhPSB5ZXM7IHRoZW4KLQkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTkVFRF9BRERSSU5GT19IIDEKLV9BQ0VPRgotCi0JZmkKLQotaWYgdGVzdCAiJGFjX2N2X25hbWVyZXFkIiA9IG5vOyB0aGVuCi0JbWlzc2luZ19pbmNsdWRlcz15ZXMKLWZpCi0KLQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBzb2NrYWRkcl9zdG9yYWdlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHNvY2thZGRyX3N0b3JhZ2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JaWYgdGVzdCAiJHthY19jdl9zYV9zdG9yYWdlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLWludAotbWFpbiAoKQotewotc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgcwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3NhX3N0b3JhZ2U9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9zYV9zdG9yYWdlPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zYV9zdG9yYWdlIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zYV9zdG9yYWdlIiA+JjY7IH0KLQlpZiB0ZXN0ICRhY19jdl9zYV9zdG9yYWdlID0geWVzOyB0aGVuCi0JCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfU09DS0FERFJfU1RPUkFHRSAxCi1fQUNFT0YKLQotCWZpCi0KLWlmIHRlc3QgIiRhY19jdl9zYV9zdG9yYWdlIiA9IG5vOyB0aGVuCi0JbWlzc2luZ19pbmNsdWRlcz15ZXMKLWZpCi0KLQotCWFjX2N2X2FkZHJzej15ZXMKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgSU5BRERSU1oiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgSU5BRERSU1ouLi4gJEVDSE9fQyIgPiY2OyB9Ci0JaWYgdGVzdCAiJHthY19jdl9pbmFkZHJzeitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwkJaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci1pbnQKLW1haW4gKCkKLXsKLWludCBhID0gSU5BRERSU1oKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9pbmFkZHJzej15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2luYWRkcnN6PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9pbmFkZHJzeiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfaW5hZGRyc3oiID4mNjsgfQotCWlmIHRlc3QgJGFjX2N2X2luYWRkcnN6ID0geWVzOyB0aGVuCi0JCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfSU5BRERSU1ogMQotX0FDRU9GCi0KLQllbHNlCi0JCWFjX2N2X2FkZHJzej1ubwotCWZpCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIElONkFERFJTWiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBJTjZBRERSU1ouLi4gJEVDSE9fQyIgPiY2OyB9Ci0JaWYgdGVzdCAiJHthY19jdl9pbjZhZGRyc3orc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSMJCWluY2x1ZGUgPGFycGEvbmFtZXNlci5oPgotaW50Ci1tYWluICgpCi17Ci1pbnQgYSA9IElONkFERFJTWgotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X2luNmFkZHJzej15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2luNmFkZHJzej1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaW42YWRkcnN6IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9pbjZhZGRyc3oiID4mNjsgfQotCWlmIHRlc3QgJGFjX2N2X2luNmFkZHJzeiA9IHllczsgdGhlbgotCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX0lONkFERFJTWiAxCi1fQUNFT0YKLQotCWVsc2UKLQkJYWNfY3ZfYWRkcnN6PW5vCi0JZmkKLQotaWYgdGVzdCAiJGFjX2N2X2FkZHJzeiIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgUkVTX1VTRV9JTkVUNiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBSRVNfVVNFX0lORVQ2Li4uICRFQ0hPX0MiID4mNjsgfQotCWlmIHRlc3QgIiR7YWNfY3ZfcmVzX2luZXQ2K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJCWluY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSMJCWluY2x1ZGUgPHJlc29sdi5oPgotaW50Ci1tYWluICgpCi17Ci1pbnQgYSA9IFJFU19VU0VfSU5FVDYKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9yZXNfaW5ldDY9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9yZXNfaW5ldDY9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Jlc19pbmV0NiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcmVzX2luZXQ2IiA+JjY7IH0KLQlpZiB0ZXN0ICRhY19jdl9yZXNfaW5ldDYgPSB5ZXM7IHRoZW4KLQkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9SRVNfVVNFX0lORVQ2IDEKLV9BQ0VPRgotCi0JZmkKLQotaWYgdGVzdCAiJGFjX2N2X3Jlc19pbmV0NiIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmVzX3N0YXRlX2V4dCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZXNfc3RhdGVfZXh0Li4uICRFQ0hPX0MiID4mNjsgfQotCWlmIHRlc3QgIiR7YWNfY3ZfcmVzX3N0YXRlX2V4dCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0Ni9pbjYuaD4KLSMJCWluY2x1ZGUgPHJlc29sdi5oPgotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3QgX19yZXNfc3RhdGVfZXh0IGUKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9yZXNfc3RhdGVfZXh0PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfcmVzX3N0YXRlX2V4dD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPiY2OyB9Ci0JaWYgdGVzdCAkYWNfY3ZfcmVzX3N0YXRlX2V4dCA9IHllczsgdGhlbgotCQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1JFU19TVEFURV9FWFQgMQotX0FDRU9GCi0KLQlmaQotCi1pZiB0ZXN0ICIkYWNfY3ZfcmVzX3N0YXRlX2V4dCIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbnNvcnQgaW4gcmVzX3N0YXRlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIG5zb3J0IGluIHJlc19zdGF0ZS4uLiAkRUNIT19DIiA+JjY7IH0KLQlpZiB0ZXN0ICIke2FjX2N2X3Jlc19zdGF0ZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jCQlpbmNsdWRlIDxuZXRpbmV0Ni9pbjYuaD4KLSMJCWluY2x1ZGUgPHJlc29sdi5oPgotaW50Ci1tYWluICgpCi17Ci1zdHJ1Y3QgX19yZXNfc3RhdGUgZTsgZS5uc29ydCA9IDAKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl9yZXNfc3RhdGU9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9yZXNfc3RhdGU9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Jlc19zdGF0ZSIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfcmVzX3N0YXRlIiA+JjY7IH0KLQlpZiB0ZXN0ICRhY19jdl9yZXNfc3RhdGUgPSB5ZXM7IHRoZW4KLQkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ORVdfUkVTX1NUQVRFIDEKLV9BQ0VPRgotCi0JZmkKLQotCi0KLQotCi0KLQotCi0KLWZvciBhY19mdW5jIGluIHZmcHJpbnRmIHN0cmNhc2VjbXAgc3RybGNhdCBzdHJsY3B5IHN0cmR1cCBzdHJzZXAKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWVsc2UKLSAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgJGFjX2Z1bmMuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTICRhY19mdW5jLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotZmkKLWRvbmUKLQotCi0KLWZvciBhY19mdW5jIGluIHN0cmZ0aW1lCi1kbwotYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJGFjX2Z1bmMKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkYWNfZnVuYyAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gJGFjX2Z1bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY192YXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi0KLQotZm9yIGFjX2Z1bmMgaW4gc2V0bGluZWJ1ZiBhbGFybQotZG8KLWFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVmICRhY19mdW5jCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgJGFjX2Z1bmMgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuICRhY19mdW5jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfdmFyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotCi1uZWVkc25wcmludGY9bm8KLQotCi1mb3IgYWNfZnVuYyBpbiB2c25wcmludGYgc25wcmludGYKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWVsc2UKLSAgbmVlZHNucHJpbnRmPXllcwotZmkKLWRvbmUKLQotaWYgdGVzdCAkbmVlZHNucHJpbnRmID0geWVzOyB0aGVuCi0JY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgc25wcmludGYuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIHNucHJpbnRmLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotZmkKLQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgcmV0dXJuIHR5cGUgb2Ygc2lnbmFsIGhhbmRsZXJzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX3NpZ25hbCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gKihzaWduYWwgKDAsIDApKSAoMCkgPT0gMTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX3NpZ25hbD1pbnQKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfc2lnbmFsPXZvaWQKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc2lnbmFsIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NpZ25hbCIgPiY2OyB9Ci0KLWNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgUkVUU0lHVFlQRSAkYWNfY3ZfdHlwZV9zaWduYWwKLV9BQ0VPRgotCi0KLSAgICBpZiB0ZXN0ICIkYWNfY3ZfdHlwZV9zaWduYWwiID0gdm9pZCA7IHRoZW4KLQkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUkVUU0lHVkFMCi1fQUNFT0YKLQotICAgIGVsc2UKLQkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUkVUU0lHVkFMICgwKQotX0FDRU9GCi0KLSAgICBmaQotICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0gICAgaXJpeCopCi0JICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIF9CU0RfU0lHTkFMUyAxCi1fQUNFT0YKLQotCSAgICA7OwotCi0gICAgKikKLQotZm9yIGFjX2Z1bmMgaW4gc2lnYWN0aW9uCi1kbwotYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJGFjX2Z1bmMKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkYWNfZnVuYyAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gJGFjX2Z1bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY192YXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi0JICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2lnYWN0aW9uID0gbm8gOyB0aGVuCi0KLWZvciBhY19mdW5jIGluIHNpZ3NldAotZG8KLWFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVmICRhY19mdW5jCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgJGFjX2Z1bmMgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuICRhY19mdW5jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfdmFyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotCSAgICBmaQotCSAgICA7OwotICAgIGVzYWMKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBkbmV0X2h0b2EiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGRuZXRfaHRvYS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlM9JExJQlMKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGRuZXRfaHRvYSAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGRuZXRfaHRvYSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyBkbmV0OyBkbwotICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgotICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKLSAgZWxzZQotICAgIGFjX3Jlcz0tbCRhY19saWIKLSAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9zZWFyY2hfZG5ldF9odG9hPSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgotICBicmVhawotZmkKLWRvbmUKLWlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2RuZXRfaHRvYStzZXR9IiA9IHNldDsgdGhlbgotICA6Ci1lbHNlCi0gIGFjX2N2X3NlYXJjaF9kbmV0X2h0b2E9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZG5ldF9odG9hIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfZG5ldF9odG9hIiA+JjY7IH0KLWFjX3Jlcz0kYWNfY3Zfc2VhcmNoX2RuZXRfaHRvYQotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ETkVUX0hUT0EgMQotX0FDRU9GCi0KLWZpCi0KLQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbWFpbiBpbiAtbHJwYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWluIGluIC1scnBjLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9saWJfcnBjX21haW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUwotTElCUz0iLWxycGMgICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gbWFpbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl9ycGNfbWFpbj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2xpYl9ycGNfbWFpbj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3JwY19tYWluIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcnBjX21haW4iID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfbGliX3JwY19tYWluID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgSEFWRV9MSUJSUEMgMQotX0FDRU9GCi0KLSAgTElCUz0iLWxycGMgJExJQlMiCi0KLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0cnBjYnludW1iZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldHJwY2J5bnVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRycGNieW51bWJlciAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIGdldHJwY2J5bnVtYmVyICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfbGliIGluICcnIG5zbDsgZG8KLSAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KLSAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCi0gIGVsc2UKLSAgICBhY19yZXM9LWwkYWNfbGliCi0gICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgotICBmaQotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX2dldHJwY2J5bnVtYmVyPSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldHJwY2J5bnVtYmVyK3NldH0iID0gc2V0OyB0aGVuCi0gIGJyZWFrCi1maQotZG9uZQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXI9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZ2V0cnBjYnludW1iZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NlYXJjaF9nZXRycGNieW51bWJlciIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRycGNieW51bWJlcgotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLSAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9HRVRSUENCWU5VTUJFUiAxCi1fQUNFT0YKLQotZmkKLQotCi0KLQotICAgICMgTW9zdCBvcGVyYXRpbmcgc3lzdGVtcyBoYXZlIGdldGhvc3RieW5hbWUoKSBpbiB0aGUgZGVmYXVsdCBzZWFyY2hlZAotICAgICMgbGlicmFyaWVzIChpLmUuIGxpYmMpOgotICAgICMgU29tZSBPU2VzIChlZy4gU29sYXJpcykgcGxhY2UgaXQgaW4gbGlibnNsCi0gICAgIyBTb21lIHN0cmFuZ2UgT1NlcyAoU0lOSVgpIGhhdmUgaXQgaW4gbGlic29ja2V0OgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0aG9zdGJ5bmFtZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZ2V0aG9zdGJ5bmFtZS4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBnZXRob3N0YnluYW1lICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gZ2V0aG9zdGJ5bmFtZSAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotZm9yIGFjX2xpYiBpbiAnJyBuc2wgc29ja2V0IHJlc29sdjsgZG8KLSAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KLSAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCi0gIGVsc2UKLSAgICBhY19yZXM9LWwkYWNfbGliCi0gICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgotICBmaQotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWU9JGFjX3JlcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQKLSAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgotICBicmVhawotZmkKLWRvbmUKLWlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZT1ubwotZmkKLXJtIGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lCi1pZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbgotICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgotCi1maQotCi0gICAgIyBVbmZvcnR1bmF0ZWx5IGxpYnNvY2tldCBzb21ldGltZXMgZGVwZW5kcyBvbiBsaWJuc2wgYW5kCi0gICAgIyBBQ19TRUFSQ0hfTElCUyBpc24ndCB1cCB0byB0aGUgdGFzayBvZiBoYW5kbGluZyBkZXBlbmRlbmNpZXMgbGlrZSB0aGlzLgotICAgIGlmIHRlc3QgIiRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPSAibm8iCi0gICAgdGhlbgotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIGdldGhvc3RieW5hbWUgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBnZXRob3N0YnluYW1lICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfc29ja2V0X2dldGhvc3RieW5hbWUgPSB5ZXM7IHRoZW4KLSAgTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiCi1maQotCi0gICAgZmkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHNvY2tldCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgc29ja2V0Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUwotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc29ja2V0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc29ja2V0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1mb3IgYWNfbGliIGluICcnIHNvY2tldDsgZG8KLSAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KLSAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCi0gIGVsc2UKLSAgICBhY19yZXM9LWwkYWNfbGliCi0gICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgotICBmaQotICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3Zfc2VhcmNoX3NvY2tldD0kYWNfcmVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgYnJlYWsKLWZpCi1kb25lCi1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgOgotZWxzZQotICBhY19jdl9zZWFyY2hfc29ja2V0PW5vCi1maQotcm0gY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3Zfc2VhcmNoX3NvY2tldCIgPiY2OyB9Ci1hY19yZXM9JGFjX2N2X3NlYXJjaF9zb2NrZXQKLWlmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuCi0gIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCi0KLWVsc2UKLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBzb2NrZXQgaW4gLWxzb2NrZXQuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgc29ja2V0ICgpOwotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gc29ja2V0ICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCi1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0ID0geWVzOyB0aGVuCi0gIExJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgotZmkKLQotZmkKLQotICAgICMgRExQSSBuZWVkcyBwdXRtc2cgdW5kZXIgSFBVWCBzbyB0ZXN0IGZvciAtbHN0ciB3aGlsZSB3ZSdyZSBhdCBpdAotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgcHV0bXNnIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBwdXRtc2cuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9wdXRtc2crc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCi1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwdXRtc2cgKCk7Ci1pbnQKLW1haW4gKCkKLXsKLXJldHVybiBwdXRtc2cgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLWZvciBhY19saWIgaW4gJycgc3RyOyBkbwotICBpZiB0ZXN0IC16ICIkYWNfbGliIjsgdGhlbgotICAgIGFjX3Jlcz0ibm9uZSByZXF1aXJlZCIKLSAgZWxzZQotICAgIGFjX3Jlcz0tbCRhY19saWIKLSAgICBMSUJTPSItbCRhY19saWIgICRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9zZWFyY2hfcHV0bXNnPSRhY19yZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0Ci0gIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3B1dG1zZytzZXR9IiA9IHNldDsgdGhlbgotICBicmVhawotZmkKLWRvbmUKLWlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3B1dG1zZytzZXR9IiA9IHNldDsgdGhlbgotICA6Ci1lbHNlCi0gIGFjX2N2X3NlYXJjaF9wdXRtc2c9bm8KLWZpCi1ybSBjb25mdGVzdC4kYWNfZXh0Ci1MSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfcHV0bXNnIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zZWFyY2hfcHV0bXNnIiA+JjY7IH0KLWFjX3Jlcz0kYWNfY3Zfc2VhcmNoX3B1dG1zZwotaWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4KLSAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKLQotZmkKLQotCi0KLSAgICAgICAgICAgICAgICBMQkxfTElCUz0iJExJQlMiCi0gICAgcGZvcGVuPS91c3IvZXhhbXBsZXMvcGFja2V0ZmlsdGVyL3Bmb3Blbi5jCi0gICAgaWYgdGVzdCAtZiAkcGZvcGVuIDsgdGhlbgotCi1mb3IgYWNfZnVuYyBpbiBwZm9wZW4KLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi1kb25lCi0KLQkgICAgaWYgdGVzdCAkYWNfY3ZfZnVuY19wZm9wZW4gPSAibm8iIDsgdGhlbgotCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBVc2luZyAkcGZvcGVuIiA+JjUKLWVjaG8gIiR7RUNIT19UfVVzaW5nICRwZm9wZW4iID4mNjsgfQotCQkgICAgTElCUz0iJExJQlMgJHBmb3BlbiIKLQkgICAgZmkKLSAgICBmaQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBsb2NhbCBwY2FwIGxpYnJhcnkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgbG9jYWwgcGNhcCBsaWJyYXJ5Li4uICRFQ0hPX0MiID4mNjsgfQotICAgIGxpYnBjYXA9RkFJTAotICAgIGxhc3RkaXI9RkFJTAotICAgIHBsYWNlcz1gbHMgJHNyY2Rpci8uLiB8IHNlZCAtZSAncywvJCwsJyAtZSAicyxeLCRzcmNkaXIvLi4vLCIgfCBcCi0JZWdyZXAgJy9saWJwY2FwLVswLTldKi5bMC05XSooLlswLTldKik/KFthYl1bMC05XSopPyQnYAotICAgIGZvciBkaXIgaW4gJHBsYWNlcyAkc3JjZGlyLy4uL2xpYnBjYXAgJHNyY2Rpci9saWJwY2FwIDsgZG8KLQkgICAgYmFzZWRpcj1gZWNobyAkZGlyIHwgc2VkIC1lICdzL1thYl1bMC05XSokLy8nYAotCSAgICBpZiB0ZXN0ICRsYXN0ZGlyID0gJGJhc2VkaXIgOyB0aGVuCi0JCSAgICAJCSAgICBjb250aW51ZTsKLQkgICAgZmkKLQkgICAgbGFzdGRpcj0kZGlyCi0JICAgIGlmIHRlc3QgLXIgJGRpci9saWJwY2FwLmEgOyB0aGVuCi0JCSAgICBsaWJwY2FwPSRkaXIvbGlicGNhcC5hCi0JCSAgICBkPSRkaXIKLQkJICAgIAkgICAgZmkKLSAgICBkb25lCi0gICAgaWYgdGVzdCAkbGlicGNhcCA9IEZBSUwgOyB0aGVuCi0JICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm90IGZvdW5kIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vdCBmb3VuZCIgPiY2OyB9Ci0JICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBtYWluIGluIC1scGNhcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBtYWluIGluIC1scGNhcC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfbGliX3BjYXBfbWFpbitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhY19jaGVja19saWJfc2F2ZV9MSUJTPSRMSUJTCi1MSUJTPSItbHBjYXAgICRMSUJTIgotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gbWFpbiAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl9wY2FwX21haW49eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9saWJfcGNhcF9tYWluPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLUxJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfcGNhcF9tYWluIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfcGNhcF9tYWluIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2xpYl9wY2FwX21haW4gPSB5ZXM7IHRoZW4KLSAgbGlicGNhcD0iLWxwY2FwIgotZmkKLQotCSAgICBpZiB0ZXN0ICRsaWJwY2FwID0gRkFJTCA7IHRoZW4KLQkJICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQkgICAgZmkKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGV4dHJhbmVvdXMgcGNhcCBoZWFkZXIgZGlyZWN0b3JpZXMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZXh0cmFuZW91cyBwY2FwIGhlYWRlciBkaXJlY3Rvcmllcy4uLiAkRUNIT19DIiA+JjY7IH0KLQkgICAgaWYgdGVzdCBcKCAhIC1yIC91c3IvbG9jYWwvaW5jbHVkZS9wY2FwLmggXCkgLWEgXAotCQkJXCggISAtciAvdXNyL2luY2x1ZGUvcGNhcC5oIFwpOyB0aGVuCi0JCWlmIHRlc3QgLXIgL3Vzci9sb2NhbC9pbmNsdWRlL3BjYXAvcGNhcC5oOyB0aGVuCi0JCSAgICBkPSIvdXNyL2xvY2FsL2luY2x1ZGUvcGNhcCIKLQkJZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9wY2FwL3BjYXAuaDsgdGhlbgotCQkgICAgZD0iL3Vzci9pbmNsdWRlL3BjYXAiCi0JCWZpCi0JICAgIGZpCi0JICAgIGlmIHRlc3QgLXogIiRkIiA7IHRoZW4KLQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBub3QgZm91bmQiID4mNQotZWNobyAiJHtFQ0hPX1R9bm90IGZvdW5kIiA+JjY7IH0KLQkgICAgZWxzZQotCQlWX0lOQ0xTPSItSSRkICRWX0lOQ0xTIgotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IGZvdW5kIC0tIC1JJGQgYWRkZWQiID4mNQotZWNobyAiJHtFQ0hPX1R9Zm91bmQgLS0gLUkkZCBhZGRlZCIgPiY2OyB9Ci0JICAgIGZpCi0gICAgZWxzZQotCSAgICBWX1BDQVBERVA9JGxpYnBjYXAKLQkgICAgcGxhY2VzPWBscyAkc3JjZGlyLy4uIHwgc2VkIC1lICdzLC8kLCwnIC1lICJzLF4sJHNyY2Rpci8uLi8sIiB8IFwKLSAgICAJIAkJZWdyZXAgJy9saWJwY2FwLVswLTldKi5bMC05XSooLlswLTldKik/KFthYl1bMC05XSopPyQnYAotCSAgICBpZiB0ZXN0IC1yICRkL3BjYXAuaDsgdGhlbgotCQkgICAgVl9JTkNMUz0iLUkkZCAkVl9JTkNMUyIKLQkgICAgZWxpZiB0ZXN0IC1yICRwbGFjZXMvcGNhcC5oOyB0aGVuCi0JCSAgICBWX0lOQ0xTPSItSSRwbGFjZXMgJFZfSU5DTFMiCi0JICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGZpbmQgcGNhcC5oIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIHBjYXAuaCIgPiYyO30KLSAgIHsgKGV4aXQgc2VlIElOU1RBTEwpOyBleGl0IHNlZSBJTlNUQUxMOyB9OyB9Ci0gCSAgICBmaQotCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRsaWJwY2FwIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRsaWJwY2FwIiA+JjY7IH0KLSAgICBmaQotICAgIExJQlM9IiRsaWJwY2FwICRMSUJTIgotICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0gICAgYWl4KikKLQkgICAgcHNlZXhlPSIvbGliL3BzZS5leHAiCi0JICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkcHNlZXhlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRwc2VleGUuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JICAgIGlmIHRlc3QgLWYgJHBzZWV4ZSA7IHRoZW4KLQkJICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0JCSAgICBMSUJTPSIkTElCUyAtSTokcHNlZXhlIgotCSAgICBmaQotCSAgICAjCi0JICAgICMgV2UgbmVlZCAiLWxvZG0iIGFuZCAiLWxjZmciLCBhcyBsaWJwY2FwIHJlcXVpcmVzIHRoZW0gb24KLQkgICAgIyBBSVgsIGFuZCB3ZSBqdXN0IGJ1aWxkIGEgc3RhdGljIGxpYnBjYXAuYSBhbmQgdGh1cyBjYW4ndAotCSAgICAjIGFycmFuZ2UgdGhhdCB3aGVuIHlvdSBsaW5rIHdpdGggbGlicGNhcCB5b3UgYXV0b21hdGljYWxseQotCSAgICAjIGxpbmsgd2l0aCB0aG9zZSBsaWJyYXJpZXMuCi0JICAgICMKLQkgICAgTElCUz0iJExJQlMgLWxvZG0gLWxjZmciCi0JICAgIDs7Ci0gICAgZXNhYwotCi0gICAgICAgICAgICAgICAgICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGNhcF9saXN0X2RhdGFsaW5rcyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBwY2FwX2xpc3RfZGF0YWxpbmtzLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9mdW5jX3BjYXBfbGlzdF9kYXRhbGlua3Mrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgcGNhcF9saXN0X2RhdGFsaW5rcyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzIHBjYXBfbGlzdF9kYXRhbGlua3MuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgcGNhcF9saXN0X2RhdGFsaW5rcyBpbm5vY3VvdXNfcGNhcF9saXN0X2RhdGFsaW5rcwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBwY2FwX2xpc3RfZGF0YWxpbmtzICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVmIHBjYXBfbGlzdF9kYXRhbGlua3MKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwY2FwX2xpc3RfZGF0YWxpbmtzICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfcGNhcF9saXN0X2RhdGFsaW5rcyB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BjYXBfbGlzdF9kYXRhbGlua3MKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcGNhcF9saXN0X2RhdGFsaW5rcyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2Z1bmNfcGNhcF9saXN0X2RhdGFsaW5rcz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2Z1bmNfcGNhcF9saXN0X2RhdGFsaW5rcz1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wY2FwX2xpc3RfZGF0YWxpbmtzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9mdW5jX3BjYXBfbGlzdF9kYXRhbGlua3MiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY19wY2FwX2xpc3RfZGF0YWxpbmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfUENBUF9MSVNUX0RBVEFMSU5LUyAxCi1fQUNFT0YKLQotZWxzZQotCi0JICAgIGNhc2UgIiAkTElCT0JKUyAiIGluCi0gICoiIGRhdGFsaW5rcy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgZGF0YWxpbmtzLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotCi1maQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBjYXBfc2V0X2RhdGFsaW5rIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBjYXBfc2V0X2RhdGFsaW5rLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9mdW5jX3BjYXBfc2V0X2RhdGFsaW5rK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lIHBjYXBfc2V0X2RhdGFsaW5rIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcGNhcF9zZXRfZGF0YWxpbmsuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgcGNhcF9zZXRfZGF0YWxpbmsgaW5ub2N1b3VzX3BjYXBfc2V0X2RhdGFsaW5rCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHBjYXBfc2V0X2RhdGFsaW5rICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVmIHBjYXBfc2V0X2RhdGFsaW5rCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcGNhcF9zZXRfZGF0YWxpbmsgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl9wY2FwX3NldF9kYXRhbGluayB8fCBkZWZpbmVkIF9fc3R1Yl9fX3BjYXBfc2V0X2RhdGFsaW5rCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuIHBjYXBfc2V0X2RhdGFsaW5rICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfZnVuY19wY2FwX3NldF9kYXRhbGluaz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X2Z1bmNfcGNhcF9zZXRfZGF0YWxpbms9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcGNhcF9zZXRfZGF0YWxpbmsiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfcGNhcF9zZXRfZGF0YWxpbmsiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfZnVuY19wY2FwX3NldF9kYXRhbGluayA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1BDQVBfU0VUX0RBVEFMSU5LIDEKLV9BQ0VPRgotCi1maQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgaW5ub2N1b3VzX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgfHwgZGVmaW5lZCBfX3N0dWJfX19wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWw9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWw9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbCA9IHllczsgdGhlbgotCi0JICAgIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfUENBUF9EQVRBTElOS19OQU1FX1RPX1ZBTCAxCi1fQUNFT0YKLQotCSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24uLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2Z1bmNfcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbi4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiBpbm5vY3VvdXNfcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24KLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24KLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViX3BjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uIHx8IGRlZmluZWQgX19zdHViX19fcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24KLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfZnVuY19wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbiIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3BjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfUENBUF9EQVRBTElOS19WQUxfVE9fREVTQ1JJUFRJT04gMQotX0FDRU9GCi0KLWVsc2UKLQotCQkgICAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgZGxuYW1lcy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgZGxuYW1lcy4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLQotZmkKLQotCi1lbHNlCi0KLQkgICAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgZGxuYW1lcy4kYWNfb2JqZXh0ICIqICkgOzsKLSAgKikgTElCT0JKUz0iJExJQk9CSlMgZGxuYW1lcy4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLQotZmkKLQotCi0KLWZvciBhY19mdW5jIGluIHBjYXBfYnJlYWtsb29wCi1kbwotYXNfYWNfdmFyPWBlY2hvICJhY19jdl9mdW5jXyRhY19mdW5jIiB8ICRhc190cl9zaGAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfZnVuYy4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY192YXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgJGFjX2Z1bmMgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkYWNfZnVuYy4KLSAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLwotI2RlZmluZSAkYWNfZnVuYyBpbm5vY3VvdXNfJGFjX2Z1bmMKLQotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMgKCk7IGJlbG93LgotICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKLSAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSMgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jdW5kZWYgJGFjX2Z1bmMKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciAkYWNfZnVuYyAoKTsKLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgX19zdHViXyRhY19mdW5jIHx8IGRlZmluZWQgX19zdHViX19fJGFjX2Z1bmMKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gJGFjX2Z1bmMgKCk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICBldmFsICIkYXNfYWNfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWV2YWwgIiRhc19hY192YXI9bm8iCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotZG9uZQotCi0KLSAgICAgICAgICAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcGNhcF9kdW1wX2Z0ZWxsIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHBjYXBfZHVtcF9mdGVsbC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfZnVuY19wY2FwX2R1bXBfZnRlbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0vKiBEZWZpbmUgcGNhcF9kdW1wX2Z0ZWxsIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgcGNhcF9kdW1wX2Z0ZWxsLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lIHBjYXBfZHVtcF9mdGVsbCBpbm5vY3VvdXNfcGNhcF9kdW1wX2Z0ZWxsCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHBjYXBfZHVtcF9mdGVsbCAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiBwY2FwX2R1bXBfZnRlbGwKLQotLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCi0gICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKLSAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLSNlbmRpZgotY2hhciBwY2FwX2R1bXBfZnRlbGwgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl9wY2FwX2R1bXBfZnRlbGwgfHwgZGVmaW5lZCBfX3N0dWJfX19wY2FwX2R1bXBfZnRlbGwKLWNob2tlIG1lCi0jZW5kaWYKLQotaW50Ci1tYWluICgpCi17Ci1yZXR1cm4gcGNhcF9kdW1wX2Z0ZWxsICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfY3ZfZnVuY19wY2FwX2R1bXBfZnRlbGw9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9mdW5jX3BjYXBfZHVtcF9mdGVsbD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wY2FwX2R1bXBfZnRlbGwiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2Z1bmNfcGNhcF9kdW1wX2Z0ZWxsIiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfcGNhcF9kdW1wX2Z0ZWxsID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfUENBUF9EVU1QX0ZURUxMIDEKLV9BQ0VPRgotCi1lbHNlCi0KLQkgICAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgcGNhcF9kdW1wX2Z0ZWxsLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBwY2FwX2R1bXBfZnRlbGwuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi0KLWZpCi0KLQotCi0jCi0jIENoZWNrIGZvciB0aGVzZSBhZnRlciBBQ19MQkxfTElCUENBUCwgc28gd2UgbGluayB3aXRoIHRoZSBhcHByb3ByaWF0ZQotIyBsaWJyYXJpZXMgKGUuZy4sICItbHNvY2tldCAtbG5zbCIgb24gU29sYXJpcykuCi0jCi0jIFdlIGRvbid0IHVzZSBBQ19SRVBMQUNFX0ZVTkNTIGJlY2F1c2UgdGhhdCB1c2VzIEFDX0NIRUNLX0ZVTkNTIHdoaWNoCi0jIHVzZSBBQ19DSEVDS19GVU5DIHdoaWNoIGRvZXNuJ3QgbGV0IHVzIHNwZWNpZnkgdGhlIHJpZ2h0ICNpbmNsdWRlcwotIyB0byBtYWtlIHRoaXMgd29yayBvbiBCU0QvT1MgNC54LiAgQlNEL09TIDQueCBzaGlwcyB3aXRoIHRoZSBCSU5EOAotIyByZXNvbHZlciwgYW5kIHRoZSB3YXkgaXQgZGVmaW5lcyBpbmV0X3tudG9wLHB0b259IGlzIHJhdGhlciBzdHJhbmdlOwotIyBpdCBkb2VzIG5vdCBzaGlwIHdpdGggYSBsaWJjIHN5bWJvbCAiaW5ldF9udG9wKCkiLCBpdCBzaGlwcyB3aXRoCi0jICJfaW5ldF9udG9wKCkiLCBhbmQgaGFzIGEgI2RlZmluZSBtYWNybyBpbiBvbmUgb2YgdGhlIHN5c3RlbSBoZWFkZXJzCi0jIHRvIHJlbmFtZSBpdC4KLSMKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X250b3AiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9udG9wLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLWludAotbWFpbiAoKQotewotY2hhciBzcmNbNF0sIGRzdFsxMjhdOwotaW5ldF9udG9wKEFGX0lORVQsIHNyYywgZHN0LCBzaXplb2YoZHN0KSk7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYKLSAgICAgICAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dDsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0JY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgaW5ldF9udG9wLiRhY19vYmpleHQgIiogKSA7OwotICAqKSBMSUJPQkpTPSIkTElCT0JKUyBpbmV0X250b3AuJGFjX29iamV4dCIKLSA7OwotZXNhYwotCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbmV0X3B0b24iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaW5ldF9wdG9uLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLWludAotbWFpbiAoKQotewotY2hhciBzcmNbMTI4XSwgZHN0WzRdOwotaW5ldF9wdG9uKEFGX0lORVQsIHNyYywgZHN0KTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQljYXNlICIgJExJQk9CSlMgIiBpbgotICAqIiBpbmV0X3B0b24uJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIGluZXRfcHRvbi4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfYXRvbiIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbmV0X2F0b24uLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci1pbnQKLW1haW4gKCkKLXsKLWNoYXIgc3JjWzEyOF07Ci1zdHJ1Y3QgaW5fYWRkciBkc3Q7Ci1pbmV0X2F0b24oc3JjLCAmZHN0KTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQljYXNlICIgJExJQk9CSlMgIiBpbgotICAqIiBpbmV0X2F0b24uJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTIGluZXRfYXRvbi4kYWNfb2JqZXh0IgotIDs7Ci1lc2FjCi0KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCi0jCi0jIENoZWNrIGZvciB0aGVzZSBhZnRlciBBQ19MQkxfTElCUENBUCwgZm9yIHRoZSBzYW1lIHJlYXNvbi4KLSMKLSMgWW91IGFyZSBpbiBhIHR3aXN0eSBsaXR0bGUgbWF6ZSBvZiBVTipYZXMsIGFsbCBkaWZmZXJlbnQuCi0jIFNvbWUgbWlnaHQgbm90IGhhdmUgZXRoZXJfbnRvaG9zdCgpLgotIyBTb21lIG1pZ2h0IGhhdmUgaXQsIGJ1dCBub3QgZGVjbGFyZSBpdCBpbiBhbnkgaGVhZGVyIGZpbGUuCi0jIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IGRlY2xhcmUgaXQgaW4gPG5ldGluZXQvaWZfZXRoZXIuaD4uCi0jIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IGRlY2xhcmUgaXQgaW4gPG5ldGluZXQvZXRoZXIuaD4KLSMgKEFuZCBzb21lIG1pZ2h0IGhhdmUgaXQgYnV0IGRvY3VtZW50IGl0IGFzIHNvbWV0aGluZyBkZWNsYXJlZCBpbgotIyA8bmV0aW5ldC9ldGhlcm5ldC5oPiwgYWx0aG91Z2ggPG5ldGluZXQvaWZfZXRoZXIuaD4gYXBwZWFycyB0byB3b3JrLikKLSMKLSMgQmVmb3JlIHlvdSBpcyBhIEMgY29tcGlsZXIuCi0jCi0KLWZvciBhY19mdW5jIGluIGV0aGVyX250b2hvc3QKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgYnVnZ3kgZXRoZXJfbnRvaG9zdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBidWdneSBldGhlcl9udG9ob3N0Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9idWdneV9ldGhlcl9udG9ob3N0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0KLQlpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9idWdneV9ldGhlcl9udG9ob3N0PSJub3Qgd2hpbGUgY3Jvc3MtY29tcGlsaW5nIgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotCQkjaW5jbHVkZSA8bmV0ZGIuaD4KLQkJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCQkjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0JCSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0KLQkJaW50Ci0JCW1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotCQl7Ci0JCQl1X2NoYXIgZWFbNl0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKLQkJCWNoYXIgbmFtZVtNQVhIT1NUTkFNRUxFTl07Ci0KLQkJCWV0aGVyX250b2hvc3QobmFtZSwgKHN0cnVjdCBldGhlcl9hZGRyICopZWEpOwotCQkJZXhpdCgwKTsKLQkJfQotCi1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0gIGFjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3Q9bm8KLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLWFjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3Q9eWVzCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9idWdneV9ldGhlcl9udG9ob3N0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9idWdneV9ldGhlcl9udG9ob3N0IiA+JjY7IH0KLSAgICBpZiB0ZXN0ICIkYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdCIgPSAibm8iOyB0aGVuCi0JY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgVVNFX0VUSEVSX05UT0hPU1QgMQotX0FDRU9GCi0KLSAgICBmaQotCi1maQotZG9uZQotCi1pZiB0ZXN0ICIkYWNfY3ZfZnVuY19ldGhlcl9udG9ob3N0IiA9IHllcyAtYSBcCi0gICAgIiRhY19jdl9idWdneV9ldGhlcl9udG9ob3N0IiA9ICJubyI7IHRoZW4KLQkjCi0JIyBPSywgd2UgaGF2ZSBldGhlcl9udG9ob3N0KCkuICBEbyB3ZSBoYXZlIDxuZXRpbmV0L2lmX2V0aGVyLmg+PwotCSMKLQlpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgPSB5ZXM7IHRoZW4KLQkJIwotCQkjIFllcy4gIERvZXMgaXQgZGVjbGFyZSBldGhlcl9udG9ob3N0KCk/Ci0JCSMKLQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci1zdHJ1Y3QgbWJ1ZjsKLXN0cnVjdCBydGVudHJ5OwotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KLQotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgZXRoZXJfbnRvaG9zdAotICAodm9pZCkgZXRoZXJfbnRvaG9zdDsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Q9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0ID0geWVzOyB0aGVuCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTkVUSU5FVF9JRl9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QKLV9BQ0VPRgotCi0KLWZpCi0KLQlmaQotCSMKLQkjIERpZCB0aGF0IHN1Y2NlZWQ/Ci0JIwotCWlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCIgIT0geWVzOyB0aGVuCi0JCSMKLQkJIyBObywgaG93IGFib3V0IDxuZXRpbmV0L2V0aGVyLmg+LCBhcyBvbiBMaW51eD8KLQkJIwotCi1mb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvZXRoZXIuaAotZG8KLWFzX2FjX0hlYWRlcj1gZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1lbHNlCi0gICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2hlYWRlcl9jb21waWxlcj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9Ci0KLSMgSXMgdGhlIGhlYWRlciBwcmVzZW50PwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDwkYWNfaGVhZGVyPgotX0FDRU9GCi1pZiB7IChhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSA+L2Rldi9udWxsICYmIHsKLQkgdGVzdCAteiAiJGFjX2NfcHJlcHJvY193YXJuX2ZsYWckYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH07IHRoZW4KLSAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSAgYWNfaGVhZGVyX3ByZXByb2M9bm8KLWZpCi0KLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0Ci17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX3ByZXByb2MiID4mNjsgfQotCi0jIFNvPyAgV2hhdCBhYm91dCB0aGlzIGhlYWRlcj8KLWNhc2UgJGFjX2hlYWRlcl9jb21waWxlcjokYWNfaGVhZGVyX3ByZXByb2M6JGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4KLSAgeWVzOm5vOiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9Ci0gICAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCi0gICAgOzsKLSAgbm86eWVzOiogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBpbiB0aGUgZnV0dXJlLCB0aGUgY29tcGlsZXIgd2lsbCB0YWtlIHByZWNlZGVuY2UiID4mMjt9Ci0KLSAgICA7OwotZXNhYwoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgZXZhbCAiJGFzX2FjX0hlYWRlcj1cJGFjX2hlYWRlcl9wcmVwcm9jIgotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci0KLWZpCi1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLQotZG9uZQotCi0JCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9ldGhlcl9oIiA9IHllczsgdGhlbgotCQkJIwotCQkJIyBXZSBoYXZlIGl0IC0gZG9lcyBpdCBkZWNsYXJlIGV0aGVyX250b2hvc3QoKT8KLQkJCSMgVW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Qgc28gd2UgZG9uJ3QKLQkJCSMgdHJlYXQgdGhlIHByZXZpb3VzIGZhaWx1cmUgYXMgYSBjYWNoZWQgdmFsdWUgYW5kCi0JCQkjIHN1cHByZXNzIHRoZSBuZXh0IHRlc3QuCi0JCQkjCi0JCQl1bnNldCBhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdAotCQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBldGhlcl9udG9ob3N0IGlzIGRlY2xhcmVkLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KLQotCi1pbnQKLW1haW4gKCkKLXsKLSNpZm5kZWYgZXRoZXJfbnRvaG9zdAotICAodm9pZCkgZXRoZXJfbnRvaG9zdDsKLSNlbmRpZgotCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Q9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0ID0geWVzOyB0aGVuCi0KLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QKLV9BQ0VPRgotCi0KLWZpCi0KLQkJZmkKLQlmaQotCSMKLQkjIElzIGV0aGVyX250b2hvc3QoKSBkZWNsYXJlZD8KLQkjCi0JaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9udG9ob3N0IiAhPSB5ZXM7IHRoZW4KLQkJIwotCQkjIE5vLCB3ZSdsbCBoYXZlIHRvIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLgotCQkjIERvIHdlIGhhdmUgInN0cnVjdCBldGhlcl9hZGRyIj8KLQkJIwotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc3RydWN0IGV0aGVyX2FkZHIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3RydWN0IGV0aGVyX2FkZHIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotc3RydWN0IG1idWY7Ci1zdHJ1Y3QgcnRlbnRyeTsKLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgZXRoZXJfYWRkciBhY19fdHlwZV9uZXdfOwotaW50Ci1tYWluICgpCi17Ci1pZiAoKGFjX190eXBlX25ld18gKikgMCkKLSAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSAgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkcj15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHI9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkciA9IHllczsgdGhlbgotCi1jYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIgMQotX0FDRU9GCi0KLQotZmkKLQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX0RFQ0xfRVRIRVJfTlRPSE9TVCAwCi1fQUNFT0YKLQotCWVsc2UKLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ERUNMX0VUSEVSX05UT0hPU1QgMQotX0FDRU9GCi0KLQlmaQotZmkKLQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQotCWlmIHRlc3QgIiR7YWNfY3Zfc29ja2FkZHJfaGFzX3NhX2xlbitzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCQlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci1pbnQKLW1haW4gKCkKLXsKLXVfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHIgKikwKS0+c2FfbGVuKQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3NvY2thZGRyX2hhc19zYV9sZW49eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjY7IH0KLQkJaWYgdGVzdCAkYWNfY3Zfc29ja2FkZHJfaGFzX3NhX2xlbiA9IHllcyA7IHRoZW4KLQkJCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfU09DS0FERFJfU0FfTEVOIDEKLV9BQ0VPRgotCi0JZmkKLQotaWYgdGVzdCAiJGFjX2N2X3NvY2thZGRyX2hhc19zYV9sZW4iID0gbm87IHRoZW4KLQltaXNzaW5nX2luY2x1ZGVzPXllcwotZmkKLQotCi0KLQotZm9yIGFjX2Z1bmMgaW4gcGNhcF9maW5kYWxsZGV2cyBwY2FwX2R1bXBfZmx1c2ggcGNhcF9saWJfdmVyc2lvbgotZG8KLWFzX2FjX3Zhcj1gZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2Z1bmMuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfdmFyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotLyogRGVmaW5lICRhY19mdW5jIHRvIGFuIGlubm9jdW91cyB2YXJpYW50LCBpbiBjYXNlIDxsaW1pdHMuaD4gZGVjbGFyZXMgJGFjX2Z1bmMuCi0gICBGb3IgZXhhbXBsZSwgSFAtVVggMTFpIDxsaW1pdHMuaD4gZGVjbGFyZXMgZ2V0dGltZW9mZGF5LiAgKi8KLSNkZWZpbmUgJGFjX2Z1bmMgaW5ub2N1b3VzXyRhY19mdW5jCi0KLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jICgpOyBiZWxvdy4KLSAgICBQcmVmZXIgPGxpbWl0cy5oPiB0byA8YXNzZXJ0Lmg+IGlmIF9fU1REQ19fIGlzIGRlZmluZWQsIHNpbmNlCi0gICAgPGxpbWl0cy5oPiBleGlzdHMgZXZlbiBvbiBmcmVlc3RhbmRpbmcgY29tcGlsZXJzLiAgKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKLQotI3VuZGVmICRhY19mdW5jCi0KLS8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgotICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCi0gICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiCi0jZW5kaWYKLWNoYXIgJGFjX2Z1bmMgKCk7Ci0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIF9fc3R1Yl8kYWNfZnVuYyB8fCBkZWZpbmVkIF9fc3R1Yl9fXyRhY19mdW5jCi1jaG9rZSBtZQotI2VuZGlmCi0KLWludAotbWFpbiAoKQotewotcmV0dXJuICRhY19mdW5jICgpOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgZXZhbCAiJGFzX2FjX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlldmFsICIkYXNfYWNfdmFyPW5vIgotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vIFwKLSAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCi1fQUNFT0YKLQotZmkKLWRvbmUKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19wY2FwX2ZpbmRhbGxkZXZzID0gInllcyIgOyB0aGVuCi0gICAgc2F2ZWRjZmxhZ3M9IiRDRkxBR1MiCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTICRWX0lOQ0xTIgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBwY2FwX2lmX3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcGNhcF9pZl90Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX3BjYXBfaWZfdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLXR5cGVkZWYgcGNhcF9pZl90IGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX3BjYXBfaWZfdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfcGNhcF9pZl90PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3BjYXBfaWZfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9wY2FwX2lmX3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV9wY2FwX2lmX3QgPSB5ZXM7IHRoZW4KLQotY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBIQVZFX1BDQVBfSUZfVCAxCi1fQUNFT0YKLQotCi1maQotCi0gICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX3BjYXBfbGliX3ZlcnNpb24gPSAibm8iIDsgdGhlbgotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgcGNhcF92ZXJzaW9uIGlzIGRlZmluZWQgYnkgbGlicGNhcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgcGNhcF92ZXJzaW9uIGlzIGRlZmluZWQgYnkgbGlicGNhcC4uLiAkRUNIT19DIiA+JjY7IH0KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotaW50Ci1tYWluICgpCi17Ci0KLQlleHRlcm4gY2hhciBwY2FwX3ZlcnNpb25bXTsKLQotCXJldHVybiAoaW50KXBjYXBfdmVyc2lvbjsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLSAgICBpZiB0ZXN0ICIkYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkIiA9IHllcyA7IHRoZW4KLSAgICAJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX1BDQVBfVkVSU0lPTiAxCi1fQUNFT0YKLQotICAgIGVsc2UKLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLSAgICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgcGNhcF9kZWJ1ZyBpcyBkZWZpbmVkIGJ5IGxpYnBjYXAiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyIHBjYXBfZGVidWcgaXMgZGVmaW5lZCBieSBsaWJwY2FwLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0JZXh0ZXJuIGludCBwY2FwX2RlYnVnOwotCi0JcmV0dXJuIHBjYXBfZGVidWc7Ci0KLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2xibF9jdl9wY2FwX2RlYnVnX2RlZmluZWQ9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19sYmxfY3ZfcGNhcF9kZWJ1Z19kZWZpbmVkPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0X2lwYThfY29uZnRlc3Qub28gXAotICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWlmIHRlc3QgIiRhY19sYmxfY3ZfcGNhcF9kZWJ1Z19kZWZpbmVkIiA9IHllcyA7IHRoZW4KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfUENBUF9ERUJVRyAxCi1fQUNFT0YKLQotZWxzZQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotCSMKLQkjIE9LLCB3aGF0IGFib3V0ICJ5eWRlYnVnIj8KLQkjCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciB5eWRlYnVnIGlzIGRlZmluZWQgYnkgbGlicGNhcCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgeXlkZWJ1ZyBpcyBkZWZpbmVkIGJ5IGxpYnBjYXAuLi4gJEVDSE9fQyIgPiY2OyB9Ci0JY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLWludAotbWFpbiAoKQotewotCi0JCWV4dGVybiBpbnQgeXlkZWJ1ZzsKLQotCQlyZXR1cm4geXlkZWJ1ZzsKLQotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QkYWNfZXhlZXh0ICYmCi0gICAgICAgJGFzX3Rlc3RfeCBjb25mdGVzdCRhY19leGVleHQ7IHRoZW4KLSAgYWNfbGJsX2N2X3l5ZGVidWdfZGVmaW5lZD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2xibF9jdl95eWRlYnVnX2RlZmluZWQ9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotCWlmIHRlc3QgIiRhY19sYmxfY3ZfeXlkZWJ1Z19kZWZpbmVkIiA9IHllcyA7IHRoZW4KLQkJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9ZWURFQlVHIDEKLV9BQ0VPRgotCi0JZWxzZQotCQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQlmaQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gYnBmX2R1bXAKLWRvCi1hc19hY192YXI9YGVjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19mdW5jLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX3ZhcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLS8qIERlZmluZSAkYWNfZnVuYyB0byBhbiBpbm5vY3VvdXMgdmFyaWFudCwgaW4gY2FzZSA8bGltaXRzLmg+IGRlY2xhcmVzICRhY19mdW5jLgotICAgRm9yIGV4YW1wbGUsIEhQLVVYIDExaSA8bGltaXRzLmg+IGRlY2xhcmVzIGdldHRpbWVvZmRheS4gICovCi0jZGVmaW5lICRhY19mdW5jIGlubm9jdW91c18kYWNfZnVuYwotCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYyAoKTsgYmVsb3cuCi0gICAgUHJlZmVyIDxsaW1pdHMuaD4gdG8gPGFzc2VydC5oPiBpZiBfX1NURENfXyBpcyBkZWZpbmVkLCBzaW5jZQotICAgIDxsaW1pdHMuaD4gZXhpc3RzIGV2ZW4gb24gZnJlZXN0YW5kaW5nIGNvbXBpbGVycy4gICovCi0KLSNpZmRlZiBfX1NURENfXwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0KLSN1bmRlZiAkYWNfZnVuYwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyICRhY19mdW5jICgpOwotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCBfX3N0dWJfJGFjX2Z1bmMgfHwgZGVmaW5lZCBfX3N0dWJfX18kYWNfZnVuYwotY2hva2UgbWUKLSNlbmRpZgotCi1pbnQKLW1haW4gKCkKLXsKLXJldHVybiAkYWNfZnVuYyAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGV2YWwgIiRhc19hY192YXI9eWVzIgotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JZXZhbCAiJGFzX2FjX3Zhcj1ubyIKLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLWFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYAotCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX3JlcyIgPiY2OyB9Ci1pZiB0ZXN0IGBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgID0geWVzOyB0aGVuCi0gIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKLSNkZWZpbmUgYGVjaG8gIkhBVkVfJGFjX2Z1bmMiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWVsc2UKLSAgY2FzZSAiICRMSUJPQkpTICIgaW4KLSAgKiIgJGFjX2Z1bmMuJGFjX29iamV4dCAiKiApIDs7Ci0gICopIExJQk9CSlM9IiRMSUJPQkpTICRhY19mdW5jLiRhY19vYmpleHQiCi0gOzsKLWVzYWMKLQotZmkKLWRvbmUKLQotCi1WX0dST1VQPTAKLWlmIHRlc3QgLWYgL2V0Yy9ncm91cCAtYSAhIC16ICJgZ3JlcCAnXndoZWVsOicgL2V0Yy9ncm91cGAiIDsgdGhlbgotCVZfR1JPVVA9d2hlZWwKLWZpCi1jYXNlICIkaG9zdF9vcyIgaW4KLQotYWl4KikKLQkJY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgX1NVTiAxCi1fQUNFT0YKLQotCTs7Ci0KLWlyaXgqKQotCVZfR1JPVVA9c3lzCi0JOzsKLQotb3NmKikKLQlWX0dST1VQPXN5c3RlbQotCTs7Ci0KLXNvbGFyaXMqKQotCVZfR1JPVVA9c3lzCi0JOzsKLWVzYWMKLQotaWYgdGVzdCAtZiAvZGV2L2JwZjAgOyB0aGVuCi0JVl9HUk9VUD1icGYKLWZpCi0KLQotZm9yIGFjX2hlYWRlciBpbiBzeXMvYml0eXBlcy5oCi1kbwotYXNfYWNfSGVhZGVyPWBlY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCi1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLWVsc2UKLSAgIyBJcyB0aGUgaGVhZGVyIGNvbXBpbGFibGU/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHVzYWJpbGl0eSIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5Li4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfaGVhZGVyX2NvbXBpbGVyPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfaGVhZGVyX2NvbXBpbGVyPW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KLQotIyBJcyB0aGUgaGVhZGVyIHByZXNlbnQ/Ci17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciBwcmVzZW5jZS4uLiAkRUNIT19DIiA+JjY7IH0KLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotI2luY2x1ZGUgPCRhY19oZWFkZXI+Ci1fQUNFT0YKLWlmIHsgKGFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ID4vZGV2L251bGwgJiYgewotCSB0ZXN0IC16ICIkYWNfY19wcmVwcm9jX3dhcm5fZmxhZyRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfTsgdGhlbgotICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotICBhY19oZWFkZXJfcHJlcHJvYz1ubwotZmkKLQotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19leHQKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfcHJlcHJvYyIgPiY2OyB9Ci0KLSMgU28/ICBXaGF0IGFib3V0IHRoaXMgaGVhZGVyPwotY2FzZSAkYWNfaGVhZGVyX2NvbXBpbGVyOiRhY19oZWFkZXJfcHJlcHJvYzokYWNfY19wcmVwcm9jX3dhcm5fZmxhZyBpbgotICB5ZXM6bm86ICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogYWNjZXB0ZWQgYnkgdGhlIGNvbXBpbGVyLCByZWplY3RlZCBieSB0aGUgcHJlcHJvY2Vzc29yISIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBjb21waWxlcidzIHJlc3VsdCIgPiYyO30KLSAgICBhY19oZWFkZXJfcHJlcHJvYz15ZXMKLSAgICA7OwotICBubzp5ZXM6KiApCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgY2hlY2sgZm9yIG1pc3NpbmcgcHJlcmVxdWlzaXRlIGhlYWRlcnM/IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHNlZSB0aGUgQXV0b2NvbmYgZG9jdW1lbnRhdGlvbiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIHByZXByb2Nlc3NvcidzIHJlc3VsdCIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6IGluIHRoZSBmdXR1cmUsIHRoZSBjb21waWxlciB3aWxsIHRha2UgcHJlY2VkZW5jZSIgPiYyO30KLQotICAgIDs7Ci1lc2FjCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJGFjX2hlYWRlciIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciAkYWNfaGVhZGVyLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgeyBhc192YXI9JGFzX2FjX0hlYWRlcjsgZXZhbCAidGVzdCBcIlwkeyRhc192YXIrc2V0fVwiID0gc2V0IjsgfTsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBldmFsICIkYXNfYWNfSGVhZGVyPVwkYWNfaGVhZGVyX3ByZXByb2MiCi1maQotYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCi0JICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfcmVzIiA+JjY7IH0KLQotZmkKLWlmIHRlc3QgYGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgotI2RlZmluZSBgZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKLV9BQ0VPRgotCi1maQotCi1kb25lCi0KLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGludDhfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQ4X3QuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50OF90K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLXR5cGVkZWYgaW50OF90IGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX2ludDhfdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfaW50OF90PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludDhfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQ4X3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQ4X3QgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBpbnQ4X3Qgc2lnbmVkIGNoYXIKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQ4X3QiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgdV9pbnQ4X3QuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfdV9pbnQ4X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiB1X2ludDhfdCBhY19fdHlwZV9uZXdfOwotaW50Ci1tYWluICgpCi17Ci1pZiAoKGFjX190eXBlX25ld18gKikgMCkKLSAgcmV0dXJuIDA7Ci1pZiAoc2l6ZW9mIChhY19fdHlwZV9uZXdfKSkKLSAgcmV0dXJuIDA7Ci0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfdHlwZV91X2ludDhfdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfdV9pbnQ4X3Q9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdV9pbnQ4X3QiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdV9pbnQ4X3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV91X2ludDhfdCA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIHVfaW50OF90IHVuc2lnbmVkIGNoYXIKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50MTZfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQxNl90Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX2ludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotdHlwZWRlZiBpbnQxNl90IGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX2ludDE2X3Q9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX2ludDE2X3Q9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50MTZfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQxNl90IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X3R5cGVfaW50MTZfdCA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIGludDE2X3Qgc2hvcnQKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQxNl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVfaW50MTZfdC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV91X2ludDE2X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiB1X2ludDE2X3QgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfdV9pbnQxNl90PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfdHlwZV91X2ludDE2X3Q9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdV9pbnQxNl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VfaW50MTZfdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3VfaW50MTZfdCA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIHVfaW50MTZfdCB1bnNpZ25lZCBzaG9ydAotX0FDRU9GCi0KLWZpCi0KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBpbnQzMl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGludDMyX3QuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfaW50MzJfdCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci10eXBlZGVmIGludDMyX3QgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfaW50MzJfdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfaW50MzJfdD1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9pbnQzMl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX2ludDMyX3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV9pbnQzMl90ID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLQotY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgaW50MzJfdCBpbnQKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgdV9pbnQzMl90IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIHVfaW50MzJfdC4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHRlc3QgIiR7YWNfY3ZfdHlwZV91X2ludDMyX3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWYKLQotdHlwZWRlZiB1X2ludDMyX3QgYWNfX3R5cGVfbmV3XzsKLWludAotbWFpbiAoKQotewotaWYgKChhY19fdHlwZV9uZXdfICopIDApCi0gIHJldHVybiAwOwotaWYgKHNpemVvZiAoYWNfX3R5cGVfbmV3XykpCi0gIHJldHVybiAwOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3R5cGVfdV9pbnQzMl90PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfdHlwZV91X2ludDMyX3Q9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdV9pbnQzMl90IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3VfaW50MzJfdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3VfaW50MzJfdCA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIHVfaW50MzJfdCB1bnNpZ25lZCBpbnQKLV9BQ0VPRgotCi1maQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW50NjRfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpbnQ2NF90Li4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAiJHthY19jdl90eXBlX2ludDY0X3Qrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0kYWNfaW5jbHVkZXNfZGVmYXVsdAotdHlwZWRlZiBpbnQ2NF90IGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX2ludDY0X3Q9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl90eXBlX2ludDY0X3Q9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfaW50NjRfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQ2NF90IiA+JjY7IH0KLWlmIHRlc3QgJGFjX2N2X3R5cGVfaW50NjRfdCA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0KLWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIGludDY0X3QgbG9uZyBsb25nCi1fQUNFT0YKLQotZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHVfaW50NjRfdCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciB1X2ludDY0X3QuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X3R5cGVfdV9pbnQ2NF90K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotJGFjX2luY2x1ZGVzX2RlZmF1bHQKLSNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotI2VuZGlmCi0KLXR5cGVkZWYgdV9pbnQ2NF90IGFjX190eXBlX25ld187Ci1pbnQKLW1haW4gKCkKLXsKLWlmICgoYWNfX3R5cGVfbmV3XyAqKSAwKQotICByZXR1cm4gMDsKLWlmIChzaXplb2YgKGFjX190eXBlX25ld18pKQotICByZXR1cm4gMDsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19jdl90eXBlX3VfaW50NjRfdD15ZXMKLWVsc2UKLSAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotCWFjX2N2X3R5cGVfdV9pbnQ2NF90PW5vCi1maQotCi1ybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi17IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3VfaW50NjRfdCIgPiY1Ci1lY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV91X2ludDY0X3QiID4mNjsgfQotaWYgdGVzdCAkYWNfY3ZfdHlwZV91X2ludDY0X3QgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotCi1jYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSB1X2ludDY0X3QgdW5zaWduZWQgbG9uZyBsb25nCi1fQUNFT0YKLQotZmkKLQotCi0jCi0jIFdlIGNhbid0IGp1c3QgY2hlY2sgZm9yIDxpbnR0eXBlcy5oPiAtIHNvbWUgc3lzdGVtcyBoYXZlIG9uZSB0aGF0Ci0jIGRvZXNuJ3QgZGVmaW5lIGFsbCB0aGUgUFJJW2RveHVdNjQgbWFjcm9zLgotIwotCi1mb3IgYWNfaGVhZGVyIGluIGludHR5cGVzLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oZWFkZXJfY29tcGlsZXI9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0gIHllczpubzogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotCi0gICAgOzsKLWVzYWMKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotCi1maQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLSAgICAjCi0gICAgIyBPSywgd2UgaGF2ZSBpbnR0eXBlcy5oLCBidXQgZG9lcyBpdCBkZWZpbmUgdGhvc2UgbWFjcm9zPwotICAgICMKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIGludHR5cGVzLmggZGVmaW5lcyB0aGUgUFJJW2RveHVdNjQgbWFjcm9zIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciBpbnR0eXBlcy5oIGRlZmluZXMgdGhlIFBSSVtkb3h1XTY0IG1hY3Jvcy4uLiAkRUNIT19DIiA+JjY7IH0KLSAgICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLQotCS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotCSAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLQkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkgICAgI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotCSAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLQkgICAgI2VuZGlmCi0KLQkgICAgbWFpbigpCi0JICAgIHsKLQkgICAgICBwcmludGYoIiUiIFBSSWQ2NCAiXG4iLCAodV9pbnQ2NF90KTEpOwotCSAgICAgIHByaW50ZigiJSIgUFJJbzY0ICJcbiIsICh1X2ludDY0X3QpMSk7Ci0JICAgICAgcHJpbnRmKCIlIiBQUkl4NjQgIlxuIiwgKHVfaW50NjRfdCkxKTsKLQkgICAgICBwcmludGYoIiUiIFBSSXU2NCAiXG4iLCAodV9pbnQ2NF90KTEpOwotCSAgICB9Ci0KLQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotCWFjX2xibF9pbnR0eXBlc19oX2RlZmluZXNfZm9ybWF0cz15ZXMKLQotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQlhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHM9bm8KLQotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci0KLWVsc2UKLQotICAgICMKLSAgICAjIFdlIGRvbid0IGhhdmUgaW50dHlwZXMuaCwgc28gaXQgb2J2aW91c2x5IGNhbid0IGRlZmluZSB0aG9zZQotICAgICMgbWFjcm9zLgotICAgICMKLSAgICBhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHM9bm8KLQotZmkKLQotZG9uZQotCi1pZiB0ZXN0ICIkYWNfbGJsX2ludHR5cGVzX2hfZGVmaW5lc19mb3JtYXRzIiA9IG5vOyB0aGVuCi0KLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyICVseCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAlbHggY2FuIGJlIHVzZWQgdG8gZm9ybWF0IDY0LWJpdCBpbnRlZ2Vycy4uLiAkRUNIT19DIiA+JjY7IH0KLSAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0KLQkvKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSMJICAgIGlmZGVmIEhBVkVfSU5UVFlQRVNfSAotCSAgICAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSMJICAgIGVuZGlmCi0jCSAgICBpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSAgICAgICAgICAgICNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotIwkgICAgZW5kaWYKLQkgICAgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0JICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotCSAgICBtYWluKCkKLQkgICAgewotCSAgICAgIHVfaW50NjRfdCB0ID0gMTsKLQkgICAgICBjaGFyIHN0cmJ1ZlsxNisxXTsKLQkgICAgICBzcHJpbnRmKHN0cmJ1ZiwgIiUwMTZseCIsIHQgPDwgMzIpOwotCSAgICAgIGlmIChzdHJjbXAoc3RyYnVmLCAiMDAwMDAwMDEwMDAwMDAwMCIpID09IDApCi0JCWV4aXQoMCk7Ci0JICAgICAgZWxzZQotCQlleGl0KDEpOwotCSAgICB9Ci0KLQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgeyBhY190cnk9Jy4vY29uZnRlc3QkYWNfZXhlZXh0JwotICB7IChjYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfdHJ5IikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgotCi0JY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUFJJZDY0ICJsZCIKLV9BQ0VPRgotCi0JY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUFJJbzY0ICJsbyIKLV9BQ0VPRgotCi0JY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUFJJeDY0ICJseCIKLV9BQ0VPRgotCi0JY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUFJJdTY0ICJsdSIKLV9BQ0VPRgotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0KLQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJWxseCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgd2hldGhlciAlbGx4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotCi0JLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jCSAgICBpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLQkgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jCSAgICBlbmRpZgotIwkgICAgaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0gICAgICAgICAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLSMJICAgIGVuZGlmCi0JICAgICNpbmNsdWRlIDxzdGRpby5oPgotCSAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQkgICAgbWFpbigpCi0JICAgIHsKLQkgICAgICB1X2ludDY0X3QgdCA9IDE7Ci0JICAgICAgY2hhciBzdHJidWZbMTYrMV07Ci0JICAgICAgc3ByaW50ZihzdHJidWYsICIlMDE2bGx4IiwgdCA8PCAzMik7Ci0JICAgICAgaWYgKHN0cmNtcChzdHJidWYsICIwMDAwMDAwMTAwMDAwMDAwIikgPT0gMCkKLQkJZXhpdCgwKTsKLQkgICAgICBlbHNlCi0JCWV4aXQoMSk7Ci0JICAgIH0KLQotCi1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBQUklkNjQgImxsZCIKLV9BQ0VPRgotCi0JY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgUFJJbzY0ICJsbG8iCi1fQUNFT0YKLQotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFBSSXg2NCAibGx4IgotX0FDRU9GCi0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBQUkl1NjQgImxsdSIKLV9BQ0VPRgotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiB5ZXMiID4mNQotZWNobyAiJHtFQ0hPX1R9eWVzIiA+JjY7IH0KLQotZWxzZQotICBlY2hvICIkYXNfbWU6IHByb2dyYW0gZXhpdGVkIHdpdGggc3RhdHVzICRhY19zdGF0dXMiID4mNQotZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLXNlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKLQotKCBleGl0ICRhY19zdGF0dXMgKQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1Ci1lY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9Ci0KLQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIHdoZXRoZXIgJUx4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnMiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyB3aGV0aGVyICVMeCBjYW4gYmUgdXNlZCB0byBmb3JtYXQgNjQtYml0IGludGVnZXJzLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotZWxzZQotICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLQotCS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLQotIwkgICAgaWZkZWYgSEFWRV9JTlRUWVBFU19ICi0JICAgICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotIwkgICAgZW5kaWYKLSMJICAgIGlmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotICAgICAgICAgICAgI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jCSAgICBlbmRpZgotCSAgICAjaW5jbHVkZSA8c3RkaW8uaD4KLQkgICAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0JICAgIG1haW4oKQotCSAgICB7Ci0JICAgICAgdV9pbnQ2NF90IHQgPSAxOwotCSAgICAgIGNoYXIgc3RyYnVmWzE2KzFdOwotCSAgICAgIHNwcmludGYoc3RyYnVmLCAiJTAxNkx4IiwgdCA8PCAzMik7Ci0JICAgICAgaWYgKHN0cmNtcChzdHJidWYsICIwMDAwMDAwMTAwMDAwMDAwIikgPT0gMCkKLQkJZXhpdCgwKTsKLQkgICAgICBlbHNlCi0JCWV4aXQoMSk7Ci0JICAgIH0KLQotCi1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0JGFjX2V4ZWV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfbGluayIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19saW5rIikgMj4mNQotICBhY19zdGF0dXM9JD8KLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7IGFjX3RyeT0nLi9jb25mdGVzdCRhY19leGVleHQnCi0gIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY190cnkiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCi0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBQUklkNjQgIkxkIgotX0FDRU9GCi0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBQUklvNjQgIkxvIgotX0FDRU9GCi0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBQUkl4NjQgIkx4IgotX0FDRU9GCi0KLQljYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBQUkl1NjQgIkx1IgotX0FDRU9GCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1Ci1lY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQotCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1Ci1lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0oIGV4aXQgJGFjX3N0YXR1cyApCi0KLQl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KLQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgd2hldGhlciAlcXggY2FuIGJlIHVzZWQgdG8gZm9ybWF0IDY0LWJpdCBpbnRlZ2VycyIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIHdoZXRoZXIgJXF4IGNhbiBiZSB1c2VkIHRvIGZvcm1hdCA2NC1iaXQgaW50ZWdlcnMuLi4gJEVDSE9fQyIgPiY2OyB9Ci0gICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotCi0JLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jCSAgICBpZmRlZiBIQVZFX0lOVFRZUEVTX0gKLQkgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jCSAgICBlbmRpZgotIwkgICAgaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0gICAgICAgICAgICAjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLSMJICAgIGVuZGlmCi0JICAgICNpbmNsdWRlIDxzdGRpby5oPgotCSAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLQkgICAgbWFpbigpCi0JICAgIHsKLQkgICAgICB1X2ludDY0X3QgdCA9IDE7Ci0JICAgICAgY2hhciBzdHJidWZbMTYrMV07Ci0JICAgICAgc3ByaW50ZihzdHJidWYsICIlMDE2cXgiLCB0IDw8IDMyKTsKLQkgICAgICBpZiAoc3RyY21wKHN0cmJ1ZiwgIjAwMDAwMDAxMDAwMDAwMDAiKSA9PSAwKQotCQlleGl0KDApOwotCSAgICAgIGVsc2UKLQkJZXhpdCgxKTsKLQkgICAgfQotCi0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QkYWNfZXhlZXh0Ci1pZiB7IChhY190cnk9IiRhY19saW5rIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1Ci0gIGFjX3N0YXR1cz0kPwotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKLSAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKLSAgYWNfc3RhdHVzPSQ/Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KLQotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFBSSWQ2NCAicWQiCi1fQUNFT0YKLQotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFBSSW82NCAicW8iCi1fQUNFT0YKLQotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFBSSXg2NCAicXgiCi1fQUNFT0YKLQotCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIFBSSXU2NCAicXUiCi1fQUNFT0YKLQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9Ci0KLWVsc2UKLSAgZWNobyAiJGFzX21lOiBwcm9ncmFtIGV4aXRlZCB3aXRoIHN0YXR1cyAkYWNfc3RhdHVzIiA+JjUKLWVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLSggZXhpdCAkYWNfc3RhdHVzICkKLQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQotCi0JICAgICAgICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IG5laXRoZXIgJWxseCBub3IgJUx4IG5vciAlcXggd29ya2VkIG9uIGEgNjQtYml0IGludGVnZXIiID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogbmVpdGhlciAlbGx4IG5vciAlTHggbm9yICVxeCB3b3JrZWQgb24gYSA2NC1iaXQgaW50ZWdlciIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQotCi0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotCi0KLQotZmkKLXJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiBnbW9uLm91dCBiYi5vdXQgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCi0KLQotCi1maQotcm0gLWYgY29yZSAqLmNvcmUgY29yZS5jb25mdGVzdC4qIGdtb24ub3V0IGJiLm91dCBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0KLQotCi0KLWZpCi1ybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKLWZpCi0KLQotCi1maQotCi1ybSAtZiBvcy1wcm90by5oCi0gICAgaWYgdGVzdCAiJHtMQkxfQ0ZMQUdTK3NldH0iID0gc2V0OyB0aGVuCi0JICAgIFZfQ0NPUFQ9IiRWX0NDT1BUICR7TEJMX0NGTEFHU30iCi0gICAgZmkKLSAgICBpZiB0ZXN0IC1mIC5kZXZlbCA7IHRoZW4KLQkgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCi0JCSAgICBpZiB0ZXN0ICIke0xCTF9DRkxBR1Mrc2V0fSIgIT0gc2V0OyB0aGVuCi0JCQkgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfY2NfZyIgPSB5ZXMgOyB0aGVuCi0JCQkJICAgIFZfQ0NPUFQ9Ii1nICRWX0NDT1BUIgotCQkJICAgIGZpCi0JCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLVdhbGwiCi0JCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgotCQkJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGggLVciCi0JCQkgICAgZmkKLQkJICAgIGZpCi0JICAgIGVsc2UKLQkJICAgIGNhc2UgIiRob3N0X29zIiBpbgotCi0JCSAgICBpcml4NiopCi0JCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLW4zMiIKLQkJCSAgICA7OwotCi0JCSAgICAqKQotCQkJICAgIDs7Ci0JCSAgICBlc2FjCi0JICAgIGZpCi0JICAgIG9zPWBlY2hvICRob3N0X29zIHwgc2VkIC1lICdzL1woWzAtOV1bMC05XSpcKVteMC05XS4qJC9cMS8nYAotCSAgICBuYW1lPSJsYmwvb3MtJG9zLmgiCi0JICAgIGlmIHRlc3QgLWYgJG5hbWUgOyB0aGVuCi0JCSAgICBsbiAtcyAkbmFtZSBvcy1wcm90by5oCi0JCSAgICBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgotI2RlZmluZSBIQVZFX09TX1BST1RPX0ggMQotX0FDRU9GCi0KLQkgICAgZWxzZQotCQkgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogY2FuJ3QgZmluZCAkbmFtZSIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbid0IGZpbmQgJG5hbWUiID4mMjt9Ci0JICAgIGZpCi0gICAgZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgaWYgc29ja2FkZHIgc3RydWN0IGhhcyBzYV9sZW4gbWVtYmVyLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4rc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWVsc2UKLSAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0KLSMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLWludAotbWFpbiAoKQotewotdV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCBzb2NrYWRkciAqKTApLT5zYV9sZW4pCi0gIDsKLSAgcmV0dXJuIDA7Ci19Ci1fQUNFT0YKLXJtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2NvbXBpbGUiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0LiRhY19vYmpleHQ7IHRoZW4KLSAgYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW49eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubwotZmkKLQotcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Ci1maQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4iID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuIiA+JjY7IH0KLSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbiA9IHllcyA7IHRoZW4KLQkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgSEFWRV9TT0NLQUREUl9TQV9MRU4gMQotX0FDRU9GCi0KLSAgICBmaQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBpZiB1bmFsaWduZWQgYWNjZXNzZXMgZmFpbCIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsLi4uICRFQ0hPX0MiID4mNjsgfQotICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhc2UgIiRob3N0X2NwdSIgaW4KLQotCSMKLQkjIFRoZXNlIGFyZSBDUFUgdHlwZXMgd2hlcmU6Ci0JIwotCSMJdGhlIENQVSBmYXVsdHMgb24gYW4gdW5hbGlnbmVkIGFjY2VzcywgYnV0IGF0IGxlYXN0IHNvbWUKLQkjCU9TZXMgdGhhdCBzdXBwb3J0IHRoYXQgQ1BVIGNhdGNoIHRoZSBmYXVsdCBhbmQgc2ltdWxhdGUKLQkjCXRoZSB1bmFsaWduZWQgYWNjZXNzIChlLmcuLCBBbHBoYS97RGlnaXRhbCxUcnU2NH0gVU5JWCkgLQotCSMJdGhlIHNpbXVsYXRpb24gaXMgc2xvdywgc28gd2UgZG9uJ3Qgd2FudCB0byB1c2UgaXQ7Ci0JIwotCSMJdGhlIENQVSwgSSBpbmZlciAoZnJvbSB0aGUgb2xkCi0JIwotCSMgWFhYOiBzaG91bGQgYWxzbyBjaGVjayB0aGF0IHRoZXkgZG9uJ3QgZG8gd2VpcmQgdGhpbmdzIChsaWtlIG9uIGFybSkKLQkjCi0JIwljb21tZW50KSBkb2Vzbid0IGZhdWx0IG9uIHVuYWxpZ25lZCBhY2Nlc3NlcywgYnV0IGRvZXNuJ3QKLQkjCWRvIGEgbm9ybWFsIHVuYWxpZ25lZCBmZXRjaCwgZWl0aGVyIChlLmcuLCBwcmVzdW1hYmx5LCBBUk0pOwotCSMKLQkjCWZvciB3aGF0ZXZlciByZWFzb24sIHRoZSB0ZXN0IHByb2dyYW0gZG9lc24ndCB3b3JrCi0JIwkodGhpcyBoYXMgYmVlbiBjbGFpbWVkIHRvIGJlIHRoZSBjYXNlIGZvciBzZXZlcmFsIG9mIHRob3NlCi0JIwlDUFVzIC0gSSBkb24ndCBrbm93IHdoYXQgdGhlIHByb2JsZW0gaXM7IHRoZSBwcm9ibGVtCi0JIwl3YXMgcmVwb3J0ZWQgYXMgInRoZSB0ZXN0IHByb2dyYW0gZHVtcHMgY29yZSIgZm9yIFN1cGVySCwKLQkjCWJ1dCB0aGF0J3Mgd2hhdCB0aGUgdGVzdCBwcm9ncmFtIGlzICpzdXBwb3NlZCogdG8gZG8gLQotCSMJaXQgZHVtcHMgY29yZSBiZWZvcmUgaXQgd3JpdGVzIGFueXRoaW5nLCBzbyB0aGUgdGVzdAotCSMJZm9yIGFuIGVtcHR5IG91dHB1dCBmaWxlIHNob3VsZCBmaW5kIGFuIGVtcHR5IG91dHB1dAotCSMJZmlsZSBhbmQgY29uY2x1ZGUgdGhhdCB1bmFsaWduZWQgYWNjZXNzZXMgZG9uJ3Qgd29yaykuCi0JIwotCSMgVGhpcyBydW4tdGltZSB0ZXN0IHdvbid0IHdvcmsgaWYgeW91J3JlIGNyb3NzLWNvbXBpbGluZywgc28KLQkjIGluIG9yZGVyIHRvIHN1cHBvcnQgY3Jvc3MtY29tcGlsaW5nIGZvciBhIHBhcnRpY3VsYXIgQ1BVLAotCSMgd2UgaGF2ZSB0byB3aXJlIGluIHRoZSBsaXN0IG9mIENQVSB0eXBlcyBhbnl3YXksIGFzIGZhciBhcwotCSMgSSBrbm93LCBzbyBwZXJoYXBzIHdlIHNob3VsZCBqdXN0IGhhdmUgYSBzZXQgb2YgQ1BVcyBvbgotCSMgd2hpY2ggd2Uga25vdyBpdCBkb2Vzbid0IHdvcmssIGEgc2V0IG9mIENQVXMgb24gd2hpY2ggd2UKLQkjIGtub3cgaXQgZG9lcyB3b3JrLCBhbmQgaGF2ZSB0aGUgc2NyaXB0IGp1c3QgZmFpbCBvbiBvdGhlcgotCSMgY3B1IHR5cGVzIGFuZCB1cGRhdGUgaXQgd2hlbiBzdWNoIGEgZmFpbHVyZSBvY2N1cnMuCi0JIwotCWFscGhhKnxhcm0qfGhwKnxtaXBzKnxzaCp8c3BhcmMqfGlhNjR8bnYxKQotCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCi0JCTs7Ci0KLQkqKQotCQljYXQgPmNvbmZ0ZXN0LmMgPDxFT0YKLSMJCWluY2x1ZGUgPHN5cy90eXBlcy5oPgotIwkJaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSMJCWluY2x1ZGUgPHN0ZGlvLmg+Ci0JCXVuc2lnbmVkIGNoYXIgYVs1XSA9IHsgMSwgMiwgMywgNCwgNSB9OwotCQltYWluKCkgewotCQl1bnNpZ25lZCBpbnQgaTsKLQkJcGlkX3QgcGlkOwotCQlpbnQgc3RhdHVzOwotCQkvKiBhdm9pZCAiY29yZSBkdW1wZWQiIG1lc3NhZ2UgKi8KLQkJcGlkID0gZm9yaygpOwotCQlpZiAocGlkIDwgIDApCi0JCQlleGl0KDIpOwotCQlpZiAocGlkID4gMCkgewotCQkJLyogcGFyZW50ICovCi0JCQlwaWQgPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7Ci0JCQlpZiAocGlkIDwgMCkKLQkJCQlleGl0KDMpOwotCQkJZXhpdCghV0lGRVhJVEVEKHN0YXR1cykpOwotCQl9Ci0JCS8qIGNoaWxkICovCi0JCWkgPSAqKHVuc2lnbmVkIGludCAqKSZhWzFdOwotCQlwcmludGYoIiVkXG4iLCBpKTsKLQkJZXhpdCgwKTsKLQkJfQotRU9GCi0JCSR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIFwKLQkJICAgIGNvbmZ0ZXN0LmMgJExJQlMgPi9kZXYvbnVsbCAyPiYxCi0JCWlmIHRlc3QgISAteCBjb25mdGVzdCA7IHRoZW4KLQkJCQkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKLQkJZWxzZQotCQkJLi9jb25mdGVzdCA+Y29uZnRlc3Qub3V0Ci0JCQlpZiB0ZXN0ICEgLXMgY29uZnRlc3Qub3V0IDsgdGhlbgotCQkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKLQkJCWVsc2UKLQkJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9bm8KLQkJCWZpCi0JCWZpCi0JCXJtIC1mIGNvbmZ0ZXN0KiBjb3JlIGNvcmUuY29uZnRlc3QKLQkJOzsKLQllc2FjCi1maQotCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwiID4mNjsgfQotICAgIGlmIHRlc3QgJGFjX2N2X2xibF91bmFsaWduZWRfZmFpbCA9IHllcyA7IHRoZW4KLQkgICAgY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKLSNkZWZpbmUgTEJMX0FMSUdOIDEKLV9BQ0VPRgotCi0gICAgZmkKLQotCi0JeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGhfZXJybm8iID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaF9lcnJuby4uLiAkRUNIT19DIiA+JjY7IH0KLQlpZiB0ZXN0ICIke2FjX2N2X3Zhcl9oX2Vycm5vK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0jCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSMJCWluY2x1ZGUgPG5ldGRiLmg+Ci1pbnQKLW1haW4gKCkKLXsKLWludCBmb28gPSBoX2Vycm5vOwotICA7Ci0gIHJldHVybiAwOwotfQotX0FDRU9GCi1ybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0Ci1pZiB7IChhY190cnk9IiRhY19jb21waWxlIgotY2FzZSAiKCgkYWNfdHJ5IiBpbgotICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKLSAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Ci1lc2FjCi1ldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQotICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYgewotCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKLQkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgotICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0OyB0aGVuCi0gIGFjX2N2X3Zhcl9oX2Vycm5vPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfdmFyX2hfZXJybm89bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAotZmkKLQotCXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3Zhcl9oX2Vycm5vIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl92YXJfaF9lcnJubyIgPiY2OyB9Ci0JaWYgdGVzdCAiJGFjX2N2X3Zhcl9oX2Vycm5vIiA9ICJ5ZXMiOyB0aGVuCi0JCWNhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCi0jZGVmaW5lIEhBVkVfSF9FUlJOTyAxCi1fQUNFT0YKLQotCWZpCi0KLQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWNyeXB0byB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY3J5cHRvK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9JHdpdGhfY3J5cHRvOwotZWxzZQotCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgU1NMZWF5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIFNTTGVheS4uLiAkRUNIT19DIiA+JjY7IH0KLWFjX2N2X3NzbGVheV9wYXRoPW5vCi1pbmNkaXI9bm8KLQotIwotIyBJZiBYcHJlZml4IGlzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIHVzZSB0aGF0IHZhbHVlLgotIyBYWFggLSB0aGlzIHNob3VsZCBhcmd1YWJseSBiZSBkb25lIGJ5IGhhdmluZyAtLXdpdGgtY3J5cHRvIHRha2UgYW4KLSMgb3B0aW9uYWwgYXJndW1lbnQsIGFuZCBoYXZlIHRoYXQgYXJndW1lbnQgYmUgdXNlZCB0byBzZXQgWHByZWZpeAotIyBpZiBwcmVzZW50LgotIwotaWYgdGVzdCAteiAiJFhwcmVmaXgiOyB0aGVuCi0JWHByZWZpeD1gZXZhbCBlY2hvICRwcmVmaXhgCi1maQotCi1mb3IgZGlyIGluICRYcHJlZml4IC91c3IvJHtob3N0X2FsaWFzfSAvdXNyIC91c3IvbG9jYWwgL3Vzci9sb2NhbC9zc2wgL3Vzci9wa2c7IGRvCi0JIwotCSMgWFhYIC0gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGNoZWNrIGlmIGEgZ2l2ZW4gbGlicmFyeSBpcwotCSMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgdGhhbiBjaGVja2luZyBlYWNoIG9mIHRoZSBwb3NzaWJsZQotCSMgc2hhcmVkIGxpYnJhcnkgc3VmZml4ZXM/Ci0JIwotCSMgQXJlIHRoZXJlIGFueSBvdGhlciBzdWZmaXhlcyB3ZSBuZWVkIHRvIGxvb2sgZm9yPyAgRG8gd2UgaGF2ZSB0bwotCSMgd29ycnkgYWJvdXQgIi5zby57dmVyc2lvbn0iPwotCSMKLQkjIE9yIHNob3VsZCB3ZSBqdXN0IGxvb2sgZm9yICJsaWJjcnlwdG8uKiI/Ci0JIwotCWlmIHRlc3QgLWQgJGRpci9saWIgLWEgXCggLWYgJGRpci9saWIvbGliY3J5cHRvLmEgLW8gXAotCQkJICAgICAgICAgIC1mICRkaXIvbGliL2xpYmNyeXB0by5zbyAtbyBcCi0JCQkgICAgICAgICAgLWYgJGRpci9saWIvbGliY3J5cHRvLnNsIC1vIFwKLQkJCQkgIC1mICRkaXIvbGliL2xpYmNyeXB0by5keWxpYiBcKTsgdGhlbgotCQlhY19jdl9zc2xlYXlfcGF0aD0kZGlyCi0JZmkKLQlpZiB0ZXN0IC1kICRkaXIvaW5jbHVkZS9vcGVuc3NsIC1hIC1mICRkaXIvaW5jbHVkZS9vcGVuc3NsL2Rlcy5oOyB0aGVuCi0JCWluY2Rpcj0iLUkkZGlyL2luY2x1ZGUiCi0JZmkKLQlpZiB0ZXN0ICIkYWNfY3Zfc3NsZWF5X3BhdGgiICE9ICJubyIgLWEgIiRpbmNkaXIiICE9ICJubyI7IHRoZW4KLQkJYnJlYWs7Ci0JZWxzZQotCQlhY19jdl9zc2xlYXlfcGF0aD1ubwotCQlpbmNkaXI9bm8KLQlmaQotZG9uZQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3NsZWF5X3BhdGgiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3NzbGVheV9wYXRoIiA+JjY7IH0KLWlmIHRlc3QgIiRhY19jdl9zc2xlYXlfcGF0aCIgIT0gbm87IHRoZW4KLQlWX0lOQ0xTPSIkVl9JTkNMUyAkaW5jZGlyIgotCUxERkxBR1M9Ii1MJGRpci9saWIgJExERkxBR1MiCi0JaWYgdGVzdCAtZiAkYWNfY3Zfc3NsZWF5X3BhdGgvbGliL2xpYlJTQWdsdWUuYTsgdGhlbgotCQlMSUJTPSIkTElCUyAtbFJTQWdsdWUiCi0JZmkKLQlpZiB0ZXN0IC1mICRhY19jdl9zc2xlYXlfcGF0aC9saWIvbGlicnNhcmVmLmE7IHRoZW4KLQkJTElCUz0iJExJQlMgLWxyc2FyZWYiCi0JZmkKLQoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIERFU19jYmNfZW5jcnlwdCBpbiAtbGNyeXB0byIgPiY1Ci1lY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBERVNfY2JjX2VuY3J5cHQgaW4gLWxjcnlwdG8uLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB0ZXN0ICIke2FjX2N2X2xpYl9jcnlwdG9fREVTX2NiY19lbmNyeXB0K3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKLUxJQlM9Ii1sY3J5cHRvICAkTElCUyIKLWNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogY29uZmRlZnMuaC4gICovCi1fQUNFT0YKLWNhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAotY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgotLyogZW5kIGNvbmZkZWZzLmguICAqLwotCi0vKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KLSAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQwotICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotI2VuZGlmCi1jaGFyIERFU19jYmNfZW5jcnlwdCAoKTsKLWludAotbWFpbiAoKQotewotcmV0dXJuIERFU19jYmNfZW5jcnlwdCAoKTsKLSAgOwotICByZXR1cm4gMDsKLX0KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKLWlmIHsgKGFjX3RyeT0iJGFjX2xpbmsiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfbGluayIpIDI+Y29uZnRlc3QuZXIxCi0gIGFjX3N0YXR1cz0kPwotICBncmVwIC12ICdeICorJyBjb25mdGVzdC5lcjEgPmNvbmZ0ZXN0LmVycgotICBybSAtZiBjb25mdGVzdC5lcjEKLSAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKLSAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQotICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fAotCSB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyCi0gICAgICAgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAmJgotICAgICAgICRhc190ZXN0X3ggY29uZnRlc3QkYWNfZXhlZXh0OyB0aGVuCi0gIGFjX2N2X2xpYl9jcnlwdG9fREVTX2NiY19lbmNyeXB0PXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0JYWNfY3ZfbGliX2NyeXB0b19ERVNfY2JjX2VuY3J5cHQ9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbyBcCi0gICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAotTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2xpYl9jcnlwdG9fREVTX2NiY19lbmNyeXB0IiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19jdl9saWJfY3J5cHRvX0RFU19jYmNfZW5jcnlwdCIgPiY2OyB9Ci1pZiB0ZXN0ICRhY19jdl9saWJfY3J5cHRvX0RFU19jYmNfZW5jcnlwdCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIEhBVkVfTElCQ1JZUFRPIDEKLV9BQ0VPRgotCi0gIExJQlM9Ii1sY3J5cHRvICRMSUJTIgotCi1maQotCi0KLQlDUFBGTEFHUz0iJENQUEZMQUdTICRWX0lOQ0xTIgotCi1mb3IgYWNfaGVhZGVyIGluIG9wZW5zc2wvZXZwLmgKLWRvCi1hc19hY19IZWFkZXI9YGVjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yICRhY19oZWFkZXIiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgJGFjX2hlYWRlci4uLiAkRUNIT19DIiA+JjY7IH0KLWlmIHsgYXNfdmFyPSRhc19hY19IZWFkZXI7IGV2YWwgInRlc3QgXCJcJHskYXNfdmFyK3NldH1cIiA9IHNldCI7IH07IHRoZW4KLSAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotZWxzZQotICAjIElzIHRoZSBoZWFkZXIgY29tcGlsYWJsZT8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgdXNhYmlsaXR5IiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgJGFjX2hlYWRlciB1c2FiaWxpdHkuLi4gJEVDSE9fQyIgPiY2OyB9Ci1jYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGNvbmZkZWZzLmguICAqLwotX0FDRU9GCi1jYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKLWNhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKLS8qIGVuZCBjb25mZGVmcy5oLiAgKi8KLSRhY19pbmNsdWRlc19kZWZhdWx0Ci0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAotaWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKLWNhc2UgIigoJGFjX3RyeSIgaW4KLSAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7Ci0gICopIGFjX3RyeV9lY2hvPSRhY190cnk7OwotZXNhYwotZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKLSAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKLSAgYWNfc3RhdHVzPSQ/Ci0gIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCi0gIHJtIC1mIGNvbmZ0ZXN0LmVyMQotICBjYXQgY29uZnRlc3QuZXJyID4mNQotICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1Ci0gIChleGl0ICRhY19zdGF0dXMpOyB9ICYmIHsKLQkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbgotICBhY19oZWFkZXJfY29tcGlsZXI9eWVzCi1lbHNlCi0gIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci1zZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0KLQlhY19oZWFkZXJfY29tcGlsZXI9bm8KLWZpCi0KLXJtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQotCi0jIElzIHRoZSBoZWFkZXIgcHJlc2VudD8KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nICRhY19oZWFkZXIgcHJlc2VuY2UiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyAkYWNfaGVhZGVyIHByZXNlbmNlLi4uICRFQ0hPX0MiID4mNjsgfQotY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBjb25mZGVmcy5oLiAgKi8KLV9BQ0VPRgotY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0Ci1jYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCi0vKiBlbmQgY29uZmRlZnMuaC4gICovCi0jaW5jbHVkZSA8JGFjX2hlYWRlcj4KLV9BQ0VPRgotaWYgeyAoYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCi1jYXNlICIoKCRhY190cnkiIGluCi0gICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OwotICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKLWVzYWMKLWV2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1Ci0gIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPmNvbmZ0ZXN0LmVyMQotICBhY19zdGF0dXM9JD8KLSAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKLSAgcm0gLWYgY29uZnRlc3QuZXIxCi0gIGNhdCBjb25mdGVzdC5lcnIgPiY1Ci0gIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKLSAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gPi9kZXYvbnVsbCAmJiB7Ci0JIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8Ci0JIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKLSAgICAgICB9OyB0aGVuCi0gIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotZWxzZQotICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQotCi0gIGFjX2hlYWRlcl9wcmVwcm9jPW5vCi1maQotCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX2V4dAoteyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX3ByZXByb2MiID4mNQotZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KLQotIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/Ci1jYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluCi0gIHllczpubzogKQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IGFjY2VwdGVkIGJ5IHRoZSBjb21waWxlciwgcmVqZWN0ZWQgYnkgdGhlIHByZXByb2Nlc3NvciEiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQotICAgIGFjX2hlYWRlcl9wcmVwcm9jPXllcwotICAgIDs7Ci0gIG5vOnllczoqICkKLSAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiBwcmVzZW50IGJ1dCBjYW5ub3QgYmUgY29tcGlsZWQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogICAgIGNoZWNrIGZvciBtaXNzaW5nIHByZXJlcXVpc2l0ZSBoZWFkZXJzPyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6ICAgICBzZWN0aW9uIFwiUHJlc2VudCBCdXQgQ2Fubm90IEJlIENvbXBpbGVkXCIiID4mNQotZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfaGVhZGVyOiAgICAgc2VjdGlvbiBcIlByZXNlbnQgQnV0IENhbm5vdCBCZSBDb21waWxlZFwiIiA+JjI7fQotICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19oZWFkZXI6IHByb2NlZWRpbmcgd2l0aCB0aGUgcHJlcHJvY2Vzc29yJ3MgcmVzdWx0IiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogcHJvY2VlZGluZyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IncyByZXN1bHQiID4mMjt9Ci0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogJGFjX2hlYWRlcjogaW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBpbGVyIHdpbGwgdGFrZSBwcmVjZWRlbmNlIiA+JjI7fQotCi0gICAgOzsKLWVzYWMKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAkYWNfaGVhZGVyIiA+JjUKLWVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICRhY19oZWFkZXIuLi4gJEVDSE9fQyIgPiY2OyB9Ci1pZiB7IGFzX3Zhcj0kYXNfYWNfSGVhZGVyOyBldmFsICJ0ZXN0IFwiXCR7JGFzX3ZhcitzZXR9XCIgPSBzZXQiOyB9OyB0aGVuCi0gIGVjaG8gJEVDSE9fTiAiKGNhY2hlZCkgJEVDSE9fQyIgPiY2Ci1lbHNlCi0gIGV2YWwgIiRhc19hY19IZWFkZXI9XCRhY19oZWFkZXJfcHJlcHJvYyIKLWZpCi1hY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX0hlYWRlcid9J2AKLQkgICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfcmVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfSRhY19yZXMiID4mNjsgfQotCi1maQotaWYgdGVzdCBgZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYCA9IHllczsgdGhlbgotICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCi0jZGVmaW5lIGBlY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQotX0FDRU9GCi0KLWZpCi0KLWRvbmUKLQotZmkKLQotZmkKLQotCi1pZiB0ZXN0ICIkbWlzc2luZ19pbmNsdWRlcyIgPSAieWVzIjsgdGhlbgotCUNQUEZMQUdTPSIkQ1BQRkxBR1MgLUlcJChzcmNkaXIpL21pc3NpbmciCi0JVl9JTkNMUz0iJFZfSU5DTFMgLUlcJChzcmNkaXIpL21pc3NpbmciCi1maQotCi0KLQotCi0KLQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcwotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBhIEJTRC1jb21wYXRpYmxlIGluc3RhbGwiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICRFQ0hPX0MiID4mNjsgfQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgotZWxzZQotICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCi1mb3IgYXNfZGlyIGluICRQQVRICi1kbwotICBJRlM9JGFzX3NhdmVfSUZTCi0gIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCi0gICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotY2FzZSAkYXNfZGlyLyBpbgotICAuLyB8IC4vLyB8IC9jQy8qIHwgXAotICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKLSAgPzpcXC9vczJcXC9pbnN0YWxsXFwvKiB8ID86XFwvT1MyXFwvSU5TVEFMTFxcLyogfCBcCi0gIC91c3IvdWNiLyogKSA7OwotICAqKQotICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgIyBieSBkZWZhdWx0LgotICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbwotCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0JICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IC1jIgotCSAgICBicmVhayAzCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgZG9uZQotICAgIDs7Ci1lc2FjCi1kb25lCi1JRlM9JGFzX3NhdmVfSUZTCi0KLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSRhY19jdl9wYXRoX2luc3RhbGwKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIERvbid0IGNhY2hlIGEKLSAgICAjIHZhbHVlIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSB2YWx1ZSBpcyBhIHJlbGF0aXZlIG5hbWUuCi0gICAgSU5TVEFMTD0kYWNfaW5zdGFsbF9zaAotICBmaQotZmkKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJElOU1RBTEwiID4mNQotZWNobyAiJHtFQ0hPX1R9JElOU1RBTEwiID4mNjsgfQotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLWFjX2NvbmZpZ19oZWFkZXJzPSIkYWNfY29uZmlnX2hlYWRlcnMgY29uZmlnLmgiCi0KLQotYWNfY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIGRlZmF1bHQtMSIKLQotYWNfY29uZmlnX2ZpbGVzPSIkYWNfY29uZmlnX2ZpbGVzIE1ha2VmaWxlIgotCi1jYXQgPmNvbmZjYWNoZSA8PFxfQUNFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLCBzZWUgY29uZmlndXJlJ3Mgb3B0aW9uIC0tY29uZmlnLWNhY2hlLgotIyBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuICBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndAotIyB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdAotIyB0aGUgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi0jIGBhY19jdl9lbnZfZm9vJyB2YXJpYWJsZXMgKHNldCBvciB1bnNldCkgd2lsbCBiZSBvdmVycmlkZGVuIHdoZW4KLSMgbG9hZGluZyB0aGlzIGZpbGUsIG90aGVyICp1bnNldCogYGFjX2N2X2Zvbycgd2lsbCBiZSBhc3NpZ25lZCB0aGUKLSMgZm9sbG93aW5nIHZhbHVlcy4KLQotX0FDRU9GCi0KLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgd2Uga2lsbCB2YXJpYWJsZXMgY29udGFpbmluZyBuZXdsaW5lcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLSgKLSAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdgOyBkbwotICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgotICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAotICAgICoke2FzX25sfSopCi0gICAgICBjYXNlICRhY192YXIgaW4gIygKLSAgICAgICpfY3ZfKikgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjUKLWVjaG8gIiRhc19tZTogV0FSTklORzogQ2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUuIiA+JjI7fSA7OwotICAgICAgZXNhYwotICAgICAgY2FzZSAkYWNfdmFyIGluICMoCi0gICAgICBfIHwgSUZTIHwgYXNfbmwpIDs7ICMoCi0gICAgICAqKSAkYXNfdW5zZXQgJGFjX3ZhciA7OwotICAgICAgZXNhYyA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIChzZXQpIDI+JjEgfAotICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKLSAgICAqJHthc19ubH1hY19zcGFjZT1cICopCi0gICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlCi0gICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICAgIHNlZCAtbiBcCi0JInMvJy8nXFxcXCcnL2c7Ci0JICBzL15cXChbXyRhc19jcl9hbG51bV0qX2N2X1tfJGFzX2NyX2FsbnVtXSpcXCk9XFwoLipcXCkvXFwxPSdcXDInL3AiCi0gICAgICA7OyAjKAotICAgICopCi0gICAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKLSAgICAgIDs7Ci0gICAgZXNhYyB8Ci0gICAgc29ydAotKSB8Ci0gIHNlZCAnCi0gICAgIC9eYWNfY3ZfZW52Xy9iIGVuZAotICAgICB0IGNsZWFyCi0gICAgIDpjbGVhcgotICAgICBzL15cKFtePV0qXCk9XCguKlt7fV0uKlwpJC90ZXN0ICIke1wxK3NldH0iID0gc2V0IHx8ICYvCi0gICAgIHQgZW5kCi0gICAgIHMvXlwoW149XSpcKT1cKC4qXCkkL1wxPSR7XDE9XDJ9LwotICAgICA6ZW5kJyA+PmNvbmZjYWNoZQotaWYgZGlmZiAiJGNhY2hlX2ZpbGUiIGNvbmZjYWNoZSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOjsgZWxzZQotICBpZiB0ZXN0IC13ICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgICB0ZXN0ICJ4JGNhY2hlX2ZpbGUiICE9ICJ4L2Rldi9udWxsIiAmJgotICAgICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogdXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiB1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgICBjYXQgY29uZmNhY2hlID4kY2FjaGVfZmlsZQotICBlbHNlCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogbm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIgPiY2O30KLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLWFjX2xpYm9ianM9Ci1hY19sdGxpYm9ianM9Ci1mb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKLSAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgotICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKLSAgYWNfaT1gZWNobyAiJGFjX2kiIHwgc2VkICIkYWNfc2NyaXB0ImAKLSAgIyAyLiBQcmVwZW5kIExJQk9CSkRJUi4gIFdoZW4gdXNlZCB3aXRoIGF1dG9tYWtlPj0xLjEwIExJQk9CSkRJUgotICAjICAgIHdpbGwgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgTElCT0JKUyBvYmplY3RzIGFyZSBidWlsdC4KLSAgYWNfbGlib2Jqcz0iJGFjX2xpYm9ianMgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCi0gIGFjX2x0bGlib2Jqcz0iJGFjX2x0bGlib2JqcyBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJwotZG9uZQotTElCT0JKUz0kYWNfbGlib2JqcwotCi1MVExJQk9CSlM9JGFjX2x0bGlib2JqcwotCi0KLQotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotYWNfY2xlYW5fZmlsZXNfc2F2ZT0kYWNfY2xlYW5fZmlsZXMKLWFjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgJENPTkZJR19TVEFUVVMiCi17IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkQ09ORklHX1NUQVRVUyIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiA+JjY7fQotY2F0ID4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotIyEgJFNIRUxMCi0jIEdlbmVyYXRlZCBieSAkYXNfbWUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiBjb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotZGVidWc9ZmFsc2UKLWFjX2NzX3JlY2hlY2s9ZmFsc2UKLWFjX2NzX3NpbGVudD1mYWxzZQotU0hFTEw9XCR7Q09ORklHX1NIRUxMLSRTSEVMTH0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIwotIyMgTTRzaCBJbml0aWFsaXphdGlvbi4gICMjCi0jIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKLQotIyBCZSBtb3JlIEJvdXJuZSBjb21wYXRpYmxlCi1EVUFMQ0FTRT0xOyBleHBvcnQgRFVBTENBU0UgIyBmb3IgTUtTIHNoCi1pZiB0ZXN0IC1uICIke1pTSF9WRVJTSU9OK3NldH0iICYmIChlbXVsYXRlIHNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgZW11bGF0ZSBzaAotICBOVUxMQ01EPToKLSAgIyBac2ggMy54IGFuZCA0LnggcGVyZm9ybXMgd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAotICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgotICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKLSAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKLWVsc2UKLSAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluCi0gICpwb3NpeCopIHNldCAtbyBwb3NpeCA7OwotZXNhYwotCi1maQotCi0KLQotCi0jIFBBVEggbmVlZHMgQ1IKLSMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KLWFzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwotYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCi1hc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKLWFzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKLWFzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cwotCi0jIFRoZSB1c2VyIGlzIGFsd2F5cyByaWdodC4KLWlmIHRlc3QgIiR7UEFUSF9TRVBBUkFUT1Irc2V0fSIgIT0gc2V0OyB0aGVuCi0gIGVjaG8gIiMhIC9iaW4vc2giID5jb25mJCQuc2gKLSAgZWNobyAgImV4aXQgMCIgICA+PmNvbmYkJC5zaAotICBjaG1vZCAreCBjb25mJCQuc2gKLSAgaWYgKFBBVEg9Ii9ub25leGlzdGVudDsuIjsgY29uZiQkLnNoKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBQQVRIX1NFUEFSQVRPUj0nOycKLSAgZWxzZQotICAgIFBBVEhfU0VQQVJBVE9SPToKLSAgZmkKLSAgcm0gLWYgY29uZiQkLnNoCi1maQotCi0jIFN1cHBvcnQgdW5zZXQgd2hlbiBwb3NzaWJsZS4KLWlmICggKE1BSUw9NjA7IHVuc2V0IE1BSUwpIHx8IGV4aXQpID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc191bnNldD11bnNldAotZWxzZQotICBhc191bnNldD1mYWxzZQotZmkKLQotCi0jIElGUwotIyBXZSBuZWVkIHNwYWNlLCB0YWIgYW5kIG5ldyBsaW5lLCBpbiBwcmVjaXNlbHkgdGhhdCBvcmRlci4gIFF1b3RpbmcgaXMKLSMgdGhlcmUgdG8gcHJldmVudCBlZGl0b3JzIGZyb20gY29tcGxhaW5pbmcgYWJvdXQgc3BhY2UtdGFiLgotIyAoSWYgX0FTX1BBVEhfV0FMSyB3ZXJlIGNhbGxlZCB3aXRoIElGUyB1bnNldCwgaXQgd291bGQgZGlzYWJsZSB3b3JkCi0jIHNwbGl0dGluZyBieSBzZXR0aW5nIElGUyB0byBlbXB0eSB2YWx1ZS4pCi1hc19ubD0nCi0nCi1JRlM9IiAiIgkkYXNfbmwiCi0KLSMgRmluZCB3aG8gd2UgYXJlLiAgTG9vayBpbiB0aGUgcGF0aCBpZiB3ZSBjb250YWluIG5vIGRpcmVjdG9yeSBzZXBhcmF0b3IuCi1jYXNlICQwIGluCi0gICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKLSAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgotZm9yIGFzX2RpciBpbiAkUEFUSAotZG8KLSAgSUZTPSRhc19zYXZlX0lGUwotICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgotICB0ZXN0IC1yICIkYXNfZGlyLyQwIiAmJiBhc19teXNlbGY9JGFzX2Rpci8kMCAmJiBicmVhawotZG9uZQotSUZTPSRhc19zYXZlX0lGUwotCi0gICAgIDs7Ci1lc2FjCi0jIFdlIGRpZCBub3QgZmluZCBvdXJzZWx2ZXMsIG1vc3QgcHJvYmFibHkgd2Ugd2VyZSBydW4gYXMgYHNoIENPTU1BTkQnCi0jIGluIHdoaWNoIGNhc2Ugd2UgYXJlIG5vdCB0byBiZSBmb3VuZCBpbiB0aGUgcGF0aC4KLWlmIHRlc3QgIngkYXNfbXlzZWxmIiA9IHg7IHRoZW4KLSAgYXNfbXlzZWxmPSQwCi1maQotaWYgdGVzdCAhIC1mICIkYXNfbXlzZWxmIjsgdGhlbgotICBlY2hvICIkYXNfbXlzZWxmOiBlcnJvcjogY2Fubm90IGZpbmQgbXlzZWxmOyByZXJ1biB3aXRoIGFuIGFic29sdXRlIGZpbGUgbmFtZSIgPiYyCi0gIHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotIyBXb3JrIGFyb3VuZCBidWdzIGluIHByZS0zLjAgVVdJTiBrc2guCi1mb3IgYXNfdmFyIGluIEVOViBNQUlMIE1BSUxQQVRICi1kbyAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotZG9uZQotUFMxPSckICcKLVBTMj0nPiAnCi1QUzQ9JysgJwotCi0jIE5MUyBudWlzYW5jZXMuCi1mb3IgYXNfdmFyIGluIFwKLSAgTEFORyBMQU5HVUFHRSBMQ19BRERSRVNTIExDX0FMTCBMQ19DT0xMQVRFIExDX0NUWVBFIExDX0lERU5USUZJQ0FUSU9OIFwKLSAgTENfTUVBU1VSRU1FTlQgTENfTUVTU0FHRVMgTENfTU9ORVRBUlkgTENfTkFNRSBMQ19OVU1FUklDIExDX1BBUEVSIFwKLSAgTENfVEVMRVBIT05FIExDX1RJTUUKLWRvCi0gIGlmIChzZXQgK3g7IHRlc3QgLXogImAoZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyKSAyPiYxYCIpOyB0aGVuCi0gICAgZXZhbCAkYXNfdmFyPUM7IGV4cG9ydCAkYXNfdmFyCi0gIGVsc2UKLSAgICAoJGFzX3Vuc2V0ICRhc192YXIpID4vZGV2L251bGwgMj4mMSAmJiAkYXNfdW5zZXQgJGFzX3ZhcgotICBmaQotZG9uZQotCi0jIFJlcXVpcmVkIHRvIHVzZSBiYXNlbmFtZS4KLWlmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCi0gICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgotICBhc19leHByPWV4cHIKLWVsc2UKLSAgYXNfZXhwcj1mYWxzZQotZmkKLQotaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgotICBhc19iYXNlbmFtZT1iYXNlbmFtZQotZWxzZQotICBhc19iYXNlbmFtZT1mYWxzZQotZmkKLQotCi0jIE5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi1hc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKLSRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAotZWNobyBYLyIkMCIgfAotICAgIHNlZCAnL14uKlwvXChbXi9dW14vXSpcKVwvKiQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXC9cKFwvXCkuKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICBzLy4qLy4vOyBxJ2AKLQotIyBDRFBBVEguCi0kYXNfdW5zZXQgQ0RQQVRICi0KLQotCi0gIGFzX2xpbmVub18xPSRMSU5FTk8KLSAgYXNfbGluZW5vXzI9JExJTkVOTwotICB0ZXN0ICJ4JGFzX2xpbmVub18xIiAhPSAieCRhc19saW5lbm9fMiIgJiYKLSAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSArIDFgIiA9ICJ4JGFzX2xpbmVub18yIiB8fCB7Ci0KLSAgIyBDcmVhdGUgJGFzX21lLmxpbmVubyBhcyBhIGNvcHkgb2YgJGFzX215c2VsZiwgYnV0IHdpdGggJExJTkVOTwotICAjIHVuaWZvcm1seSByZXBsYWNlZCBieSB0aGUgbGluZSBudW1iZXIuICBUaGUgZmlyc3QgJ3NlZCcgaW5zZXJ0cyBhCi0gICMgbGluZS1udW1iZXIgbGluZSBhZnRlciBlYWNoIGxpbmUgdXNpbmcgJExJTkVOTzsgdGhlIHNlY29uZCAnc2VkJwotICAjIGRvZXMgdGhlIHJlYWwgd29yay4gIFRoZSBzZWNvbmQgc2NyaXB0IHVzZXMgJ04nIHRvIHBhaXIgZWFjaAotICAjIGxpbmUtbnVtYmVyIGxpbmUgd2l0aCB0aGUgbGluZSBjb250YWluaW5nICRMSU5FTk8sIGFuZCBhcHBlbmRzCi0gICMgdHJhaWxpbmcgJy0nIGR1cmluZyBzdWJzdGl0dXRpb24gc28gdGhhdCAkTElORU5PIGlzIG5vdCBhIHNwZWNpYWwKLSAgIyBjYXNlIGF0IGxpbmUgZW5kLgotICAjIChSYWphIFIgSGFyaW5hdGggc3VnZ2VzdGVkIHNlZCAnPScsIGFuZCBQYXVsIEVnZ2VydCB3cm90ZSB0aGUKLSAgIyBzY3JpcHRzIHdpdGggb3B0aW1pemF0aW9uIGhlbHAgZnJvbSBQYW9sbyBCb256aW5pLiAgQmxhbWUgTGVlCi0gICMgRS4gTWNNYWhvbiAoMTkzMS0xOTg5KSBmb3Igc2VkJ3Mgc3ludGF4LiAgOi0pCi0gIHNlZCAtbiAnCi0gICAgcAotICAgIC9bJF1MSU5FTk8vPQotICAnIDwkYXNfbXlzZWxmIHwKLSAgICBzZWQgJwotICAgICAgcy9bJF1MSU5FTk8uKi8mLS8KLSAgICAgIHQgbGluZW5vCi0gICAgICBiCi0gICAgICA6bGluZW5vCi0gICAgICBOCi0gICAgICA6bG9vcAotICAgICAgcy9bJF1MSU5FTk9cKFteJyRhc19jcl9hbG51bSdfXS4qXG5cKVwoLipcKS9cMlwxXDIvCi0gICAgICB0IGxvb3AKLSAgICAgIHMvLVxuLiovLwotICAgICcgPiRhc19tZS5saW5lbm8gJiYKLSAgY2htb2QgK3ggIiRhc19tZS5saW5lbm8iIHx8Ci0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KLQotICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcwotICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKLSAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KLSAgLiAiLi8kYXNfbWUubGluZW5vIgotICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KLSAgZXhpdAotfQotCi0KLWlmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhc19kaXJuYW1lPWRpcm5hbWUKLWVsc2UKLSAgYXNfZGlybmFtZT1mYWxzZQotZmkKLQotRUNIT19DPSBFQ0hPX049IEVDSE9fVD0KLWNhc2UgYGVjaG8gLW4geGAgaW4KLS1uKikKLSAgY2FzZSBgZWNobyAneFxjJ2AgaW4KLSAgKmMqKSBFQ0hPX1Q9JwknOzsJIyBFQ0hPX1QgaXMgc2luZ2xlIHRhYiBjaGFyYWN0ZXIuCi0gICopICAgRUNIT19DPSdcYyc7OwotICBlc2FjOzsKLSopCi0gIEVDSE9fTj0nLW4nOzsKLWVzYWMKLQotaWYgZXhwciBhIDogJ1woYVwpJyA+L2Rldi9udWxsIDI+JjEgJiYKLSAgIHRlc3QgIlhgZXhwciAwMDAwMSA6ICcuKlwoLi4uXCknYCIgPSBYMDAxOyB0aGVuCi0gIGFzX2V4cHI9ZXhwcgotZWxzZQotICBhc19leHByPWZhbHNlCi1maQotCi1ybSAtZiBjb25mJCQgY29uZiQkLmV4ZSBjb25mJCQuZmlsZQotaWYgdGVzdCAtZCBjb25mJCQuZGlyOyB0aGVuCi0gIHJtIC1mIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUKLWVsc2UKLSAgcm0gLWYgY29uZiQkLmRpcgotICBta2RpciBjb25mJCQuZGlyCi1maQotZWNobyA+Y29uZiQkLmZpbGUKLWlmIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJCAyPi9kZXYvbnVsbDsgdGhlbgotICBhc19sbl9zPSdsbiAtcycKLSAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKLSAgIyAxKSBPbiBNU1lTLCBib3RoIGBsbiAtcyBmaWxlIGRpcicgYW5kIGBsbiBmaWxlIGRpcicgZmFpbC4KLSAgIyAyKSBESkdQUCA8IDIuMDQgaGFzIG5vIHN5bWxpbmtzOyBgbG4gLXMnIGNyZWF0ZXMgYSB3cmFwcGVyIGV4ZWN1dGFibGUuCi0gICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCi0gIGxuIC1zIGNvbmYkJC5maWxlIGNvbmYkJC5kaXIgMj4vZGV2L251bGwgJiYgdGVzdCAhIC1mIGNvbmYkJC5leGUgfHwKLSAgICBhc19sbl9zPSdjcCAtcCcKLWVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX2xuX3M9bG4KLWVsc2UKLSAgYXNfbG5fcz0nY3AgLXAnCi1maQotcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmRpci9jb25mJCQuZmlsZSBjb25mJCQuZmlsZQotcm1kaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAotCi1pZiBta2RpciAtcCAuIDI+L2Rldi9udWxsOyB0aGVuCi0gIGFzX21rZGlyX3A9OgotZWxzZQotICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAotICBhc19ta2Rpcl9wPWZhbHNlCi1maQotCi1pZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFzX3Rlc3RfeD0ndGVzdCAteCcKLWVsc2UKLSAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgYXNfbHNfTF9vcHRpb249TAotICBlbHNlCi0gICAgYXNfbHNfTF9vcHRpb249Ci0gIGZpCi0gIGFzX3Rlc3RfeD0nCi0gICAgZXZhbCBzaCAtYyAnXCcnCi0gICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KLSAgICAgICAgdGVzdCAtZCAiJDEvLiI7Ci0gICAgICBlbHNlCi0JY2FzZSAkMSBpbgotICAgICAgICAtKilzZXQgIi4vJDEiOzsKLQllc2FjOwotCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluCi0JPz8/W3N4XSopOjs7KilmYWxzZTs7ZXNhYztmaQotICAgICdcJycgc2gKLSAgJwotZmkKLWFzX2V4ZWN1dGFibGVfcD0kYXNfdGVzdF94Ci0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCBDUFAgbmFtZS4KLWFzX3RyX2NwcD0iZXZhbCBzZWQgJ3klKiRhc19jcl9sZXR0ZXJzJVAkYXNfY3JfTEVUVEVSUyU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCi0KLSMgU2VkIGV4cHJlc3Npb24gdG8gbWFwIGEgc3RyaW5nIG9udG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lLgotYXNfdHJfc2g9ImV2YWwgc2VkICd5JSorJXBwJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKLQotCi1leGVjIDY+JjEKLQotIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkWzBdIGFuZCBzbyBvbiBtZWFuaW5nZnVsLCBhbmQgdG8KLSMgcmVwb3J0IGFjdHVhbCBpbnB1dCB2YWx1ZXMgb2YgQ09ORklHX0ZJTEVTIGV0Yy4gaW5zdGVhZCBvZiB0aGVpcgotIyB2YWx1ZXMgYWZ0ZXIgb3B0aW9ucyBoYW5kbGluZy4KLWFjX2xvZz0iCi1UaGlzIGZpbGUgd2FzIGV4dGVuZGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCi1nZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjEuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKLQotICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCi0gIENPTkZJR19IRUFERVJTICA9ICRDT05GSUdfSEVBREVSUwotICBDT05GSUdfTElOS1MgICAgPSAkQ09ORklHX0xJTktTCi0gIENPTkZJR19DT01NQU5EUyA9ICRDT05GSUdfQ09NTUFORFMKLSAgJCAkMCAkQAotCi1vbiBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWAKLSIKLQotX0FDRU9GCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi0jIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCi1jb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCi1jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgotY29uZmlnX2NvbW1hbmRzPSIkYWNfY29uZmlnX2NvbW1hbmRzIgotCi1fQUNFT0YKLQotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1hY19jc191c2FnZT0iXAotXGAkYXNfbWUnIGluc3RhbnRpYXRlcyBmaWxlcyBmcm9tIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gdGhlCi1jdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0KLVVzYWdlOiAkMCBbT1BUSU9OU10gW0ZJTEVdLi4uCi0KLSAgLWgsIC0taGVscCAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAotICAtViwgLS12ZXJzaW9uICAgIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBjb25maWd1cmF0aW9uIHNldHRpbmdzLCB0aGVuIGV4aXQKLSAgLXEsIC0tcXVpZXQgICAgICBkbyBub3QgcHJpbnQgcHJvZ3Jlc3MgbWVzc2FnZXMKLSAgLWQsIC0tZGVidWcgICAgICBkb24ndCByZW1vdmUgdGVtcG9yYXJ5IGZpbGVzCi0gICAgICAtLXJlY2hlY2sgICAgdXBkYXRlICRhc19tZSBieSByZWNvbmZpZ3VyaW5nIGluIHRoZSBzYW1lIGNvbmRpdGlvbnMKLSAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQotCQkgICBpbnN0YW50aWF0ZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlIEZJTEUKLSAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCi0JCSAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGhlYWRlciBGSUxFCi0KLUNvbmZpZ3VyYXRpb24gZmlsZXM6Ci0kY29uZmlnX2ZpbGVzCi0KLUNvbmZpZ3VyYXRpb24gaGVhZGVyczoKLSRjb25maWdfaGVhZGVycwotCi1Db25maWd1cmF0aW9uIGNvbW1hbmRzOgotJGNvbmZpZ19jb21tYW5kcwotCi1SZXBvcnQgYnVncyB0byA8YnVnLWF1dG9jb25mQGdudS5vcmc+LiIKLQotX0FDRU9GCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotYWNfY3NfdmVyc2lvbj0iXFwKLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MSwKLSAgd2l0aCBvcHRpb25zIFxcImBlY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2BcXCIKLQotQ29weXJpZ2h0IChDKSAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1naXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgotCi1hY19wd2Q9JyRhY19wd2QnCi1zcmNkaXI9JyRzcmNkaXInCi1JTlNUQUxMPSckSU5TVEFMTCcKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgbm8gZmlsZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHdlIG5lZWQgdG8gcHJvdmlkZSBkZWZhdWx0Ci0jIHZhbHVlLiAgQnkgd2UgbmVlZCB0byBrbm93IGlmIGZpbGVzIHdlcmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgotYWNfbmVlZF9kZWZhdWx0cz06Ci13aGlsZSB0ZXN0ICQjICE9IDAKLWRvCi0gIGNhc2UgJDEgaW4KLSAgLS0qPSopCi0gICAgYWNfb3B0aW9uPWBleHByICJYJDEiIDogJ1hcKFtePV0qXCk9J2AKLSAgICBhY19vcHRhcmc9YGV4cHIgIlgkMSIgOiAnWFtePV0qPVwoLipcKSdgCi0gICAgYWNfc2hpZnQ9OgotICAgIDs7Ci0gICopCi0gICAgYWNfb3B0aW9uPSQxCi0gICAgYWNfb3B0YXJnPSQyCi0gICAgYWNfc2hpZnQ9c2hpZnQKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAkYWNfb3B0aW9uIGluCi0gICMgSGFuZGxpbmcgb2YgdGhlIG9wdGlvbnMuCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGFjX2NzX3JlY2hlY2s9OiA7OwotICAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYgfCAtViApCi0gICAgZWNobyAiJGFjX2NzX3ZlcnNpb24iOyBleGl0IDs7Ci0gIC0tZGVidWcgfCAtLWRlYnUgfCAtLWRlYiB8IC0tZGUgfCAtLWQgfCAtZCApCi0gICAgZGVidWc9OiA7OwotICAtLWZpbGUgfCAtLWZpbCB8IC0tZmkgfCAtLWYgKQotICAgICRhY19zaGlmdAotICAgIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlYWRlciB8IC0taGVhZGUgfCAtLWhlYWQgfCAtLWhlYSApCi0gICAgJGFjX3NoaWZ0Ci0gICAgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyAkYWNfb3B0YXJnIgotICAgIGFjX25lZWRfZGVmYXVsdHM9ZmFsc2U7OwotICAtLWhlIHwgLS1oKQotICAgICMgQ29uZmxpY3QgYmV0d2VlbiAtLWhlbHAgYW5kIC0taGVhZGVyCi0gICAgeyBlY2hvICIkYXNfbWU6IGVycm9yOiBhbWJpZ3VvdXMgb3B0aW9uOiAkMQotVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCi0gICAgZWNobyAiJGFjX2NzX3VzYWdlIjsgZXhpdCA7OwotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCB8IC0tc2kgfCAtLXMpCi0gICAgYWNfY3Nfc2lsZW50PTogOzsKLQotICAjIFRoaXMgaXMgYW4gZXJyb3IuCi0gIC0qKSB7IGVjaG8gIiRhc19tZTogZXJyb3I6IHVucmVjb2duaXplZCBvcHRpb246ICQxCi1UcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgPiYyCi0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0gOzsKLQotICAqKSBhY19jb25maWdfdGFyZ2V0cz0iJGFjX2NvbmZpZ190YXJnZXRzICQxIgotICAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlIDs7Ci0KLSAgZXNhYwotICBzaGlmdAotZG9uZQotCi1hY19jb25maWd1cmVfZXh0cmFfYXJncz0KLQotaWYgJGFjX2NzX3NpbGVudDsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi0gIGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzPSIkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1zaWxlbnQiCi1maQotCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1pZiBcJGFjX2NzX3JlY2hlY2s7IHRoZW4KLSAgZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMICRTSEVMTCAkMCAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgIiAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIgPiY2Ci0gIENPTkZJR19TSEVMTD0kU0hFTEwKLSAgZXhwb3J0IENPTkZJR19TSEVMTAotICBleGVjICRTSEVMTCAiJDAiJGFjX2NvbmZpZ3VyZV9hcmdzIFwkYWNfY29uZmlndXJlX2V4dHJhX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24KLWZpCi0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi1leGVjIDU+PmNvbmZpZy5sb2cKLXsKLSAgZWNobwotICBzZWQgJ2g7cy8uLy0vZztzL14uLi4vIyMgLztzLy4uLiQvICMjLztwO3g7cDt4JyA8PF9BU0JPWAotIyMgUnVubmluZyAkYXNfbWUuICMjCi1fQVNCT1gKLSAgZWNobyAiJGFjX2xvZyIKLX0gPiY1Ci0KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSMKLSMgSU5JVC1DT01NQU5EUwotIwotCi0KLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLQotIyBIYW5kbGluZyBvZiBhcmd1bWVudHMuCi1mb3IgYWNfY29uZmlnX3RhcmdldCBpbiAkYWNfY29uZmlnX3RhcmdldHMKLWRvCi0gIGNhc2UgJGFjX2NvbmZpZ190YXJnZXQgaW4KLSAgICAiY29uZmlnLmgiKSBDT05GSUdfSEVBREVSUz0iJENPTkZJR19IRUFERVJTIGNvbmZpZy5oIiA7OwotICAgICJkZWZhdWx0LTEiKSBDT05GSUdfQ09NTUFORFM9IiRDT05GSUdfQ09NTUFORFMgZGVmYXVsdC0xIiA7OwotICAgICJNYWtlZmlsZSIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBNYWtlZmlsZSIgOzsKLQotICAqKSB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBpbnZhbGlkIGFyZ3VtZW50OiAkYWNfY29uZmlnX3RhcmdldCIgPiYyO30KLSAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfTs7Ci0gIGVzYWMKLWRvbmUKLQotCi0jIElmIHRoZSB1c2VyIGRpZCBub3QgdXNlIHRoZSBhcmd1bWVudHMgdG8gc3BlY2lmeSB0aGUgaXRlbXMgdG8gaW5zdGFudGlhdGUsCi0jIHRoZW4gdGhlIGVudnZhciBpbnRlcmZhY2UgaXMgdXNlZC4gIFNldCBvbmx5IHRob3NlIHRoYXQgYXJlIG5vdC4KLSMgV2UgdXNlIHRoZSBsb25nIGZvcm0gZm9yIHRoZSBkZWZhdWx0IGFzc2lnbm1lbnQgYmVjYXVzZSBvZiBhbiBleHRyZW1lbHkKLSMgYml6YXJyZSBidWcgb24gU3VuT1MgNC4xLjMuCi1pZiAkYWNfbmVlZF9kZWZhdWx0czsgdGhlbgotICB0ZXN0ICIke0NPTkZJR19GSUxFUytzZXR9IiA9IHNldCB8fCBDT05GSUdfRklMRVM9JGNvbmZpZ19maWxlcwotICB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iID0gc2V0IHx8IENPTkZJR19IRUFERVJTPSRjb25maWdfaGVhZGVycwotICB0ZXN0ICIke0NPTkZJR19DT01NQU5EUytzZXR9IiA9IHNldCB8fCBDT05GSUdfQ09NTUFORFM9JGNvbmZpZ19jb21tYW5kcwotZmkKLQotIyBIYXZlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29udmVuaWVuY2UuICBNYWtlIGl0IGluIHRoZSBidWlsZCB0cmVlCi0jIHNpbXBseSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYXNvbiBhZ2FpbnN0IGhhdmluZyBpdCBoZXJlLCBhbmQgaW4gYWRkaXRpb24sCi0jIGNyZWF0aW5nIGFuZCBtb3ZpbmcgZmlsZXMgZnJvbSAvdG1wIGNhbiBzb21ldGltZXMgY2F1c2UgcHJvYmxlbXMuCi0jIEhvb2sgZm9yIGl0cyByZW1vdmFsIHVubGVzcyBkZWJ1Z2dpbmcuCi0jIE5vdGUgdGhhdCB0aGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBpbiB3aGljaCB0aGUgZGlyZWN0b3J5IHdpbGwgbm90IGJlIGNsZWFuZWQ6Ci0jIGFmdGVyIGl0cyBjcmVhdGlvbiBidXQgYmVmb3JlIGl0cyBuYW1lIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGAkdG1wJy4KLSRkZWJ1ZyB8fAotewotICB0bXA9Ci0gIHRyYXAgJ2V4aXRfc3RhdHVzPSQ/Ci0gIHsgdGVzdCAteiAiJHRtcCIgfHwgdGVzdCAhIC1kICIkdG1wIiB8fCBybSAtZnIgIiR0bXAiOyB9ICYmIGV4aXQgJGV4aXRfc3RhdHVzCi0nIDAKLSAgdHJhcCAneyAoZXhpdCAxKTsgZXhpdCAxOyB9JyAxIDIgMTMgMTUKLX0KLSMgQ3JlYXRlIGEgKHNlY3VyZSkgdG1wIGRpcmVjdG9yeSBmb3IgdG1wIGZpbGVzLgotCi17Ci0gIHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIi4vY29uZlhYWFhYWCIpIDI+L2Rldi9udWxsYCAmJgotICB0ZXN0IC1uICIkdG1wIiAmJiB0ZXN0IC1kICIkdG1wIgotfSAgfHwKLXsKLSAgdG1wPS4vY29uZiQkLSRSQU5ET00KLSAgKHVtYXNrIDA3NyAmJiBta2RpciAiJHRtcCIpCi19IHx8Ci17Ci0gICBlY2hvICIkbWU6IGNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iID4mMgotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9Ci19Ci0KLSMKLSMgU2V0IHVwIHRoZSBzZWQgc2NyaXB0cyBmb3IgQ09ORklHX0ZJTEVTIHNlY3Rpb24uCi0jCi0KLSMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgc2NyaXB0cyBpZiB0aGVyZSBhcmUgbm8gQ09ORklHX0ZJTEVTLgotIyBUaGlzIGhhcHBlbnMgZm9yIGluc3RhbmNlIHdoZW4gLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oCi1pZiB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIjsgdGhlbgotCi1fQUNFT0YKLQotCi0KLWFjX2RlbGltPSclIV8hIyAnCi1mb3IgYWNfbGFzdF90cnkgaW4gZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgZmFsc2UgOjsgZG8KLSAgY2F0ID5jb25mJCRzdWJzLnNlZCA8PF9BQ0VPRgotU0hFTEwhJFNIRUxMJGFjX2RlbGltCi1QQVRIX1NFUEFSQVRPUiEkUEFUSF9TRVBBUkFUT1IkYWNfZGVsaW0KLVBBQ0tBR0VfTkFNRSEkUEFDS0FHRV9OQU1FJGFjX2RlbGltCi1QQUNLQUdFX1RBUk5BTUUhJFBBQ0tBR0VfVEFSTkFNRSRhY19kZWxpbQotUEFDS0FHRV9WRVJTSU9OISRQQUNLQUdFX1ZFUlNJT04kYWNfZGVsaW0KLVBBQ0tBR0VfU1RSSU5HISRQQUNLQUdFX1NUUklORyRhY19kZWxpbQotUEFDS0FHRV9CVUdSRVBPUlQhJFBBQ0tBR0VfQlVHUkVQT1JUJGFjX2RlbGltCi1leGVjX3ByZWZpeCEkZXhlY19wcmVmaXgkYWNfZGVsaW0KLXByZWZpeCEkcHJlZml4JGFjX2RlbGltCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lISRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJGFjX2RlbGltCi1iaW5kaXIhJGJpbmRpciRhY19kZWxpbQotc2JpbmRpciEkc2JpbmRpciRhY19kZWxpbQotbGliZXhlY2RpciEkbGliZXhlY2RpciRhY19kZWxpbQotZGF0YXJvb3RkaXIhJGRhdGFyb290ZGlyJGFjX2RlbGltCi1kYXRhZGlyISRkYXRhZGlyJGFjX2RlbGltCi1zeXNjb25mZGlyISRzeXNjb25mZGlyJGFjX2RlbGltCi1zaGFyZWRzdGF0ZWRpciEkc2hhcmVkc3RhdGVkaXIkYWNfZGVsaW0KLWxvY2Fsc3RhdGVkaXIhJGxvY2Fsc3RhdGVkaXIkYWNfZGVsaW0KLWluY2x1ZGVkaXIhJGluY2x1ZGVkaXIkYWNfZGVsaW0KLW9sZGluY2x1ZGVkaXIhJG9sZGluY2x1ZGVkaXIkYWNfZGVsaW0KLWRvY2RpciEkZG9jZGlyJGFjX2RlbGltCi1pbmZvZGlyISRpbmZvZGlyJGFjX2RlbGltCi1odG1sZGlyISRodG1sZGlyJGFjX2RlbGltCi1kdmlkaXIhJGR2aWRpciRhY19kZWxpbQotcGRmZGlyISRwZGZkaXIkYWNfZGVsaW0KLXBzZGlyISRwc2RpciRhY19kZWxpbQotbGliZGlyISRsaWJkaXIkYWNfZGVsaW0KLWxvY2FsZWRpciEkbG9jYWxlZGlyJGFjX2RlbGltCi1tYW5kaXIhJG1hbmRpciRhY19kZWxpbQotREVGUyEkREVGUyRhY19kZWxpbQotRUNIT19DISRFQ0hPX0MkYWNfZGVsaW0KLUVDSE9fTiEkRUNIT19OJGFjX2RlbGltCi1FQ0hPX1QhJEVDSE9fVCRhY19kZWxpbQotTElCUyEkTElCUyRhY19kZWxpbQotYnVpbGRfYWxpYXMhJGJ1aWxkX2FsaWFzJGFjX2RlbGltCi1ob3N0X2FsaWFzISRob3N0X2FsaWFzJGFjX2RlbGltCi10YXJnZXRfYWxpYXMhJHRhcmdldF9hbGlhcyRhY19kZWxpbQotYnVpbGQhJGJ1aWxkJGFjX2RlbGltCi1idWlsZF9jcHUhJGJ1aWxkX2NwdSRhY19kZWxpbQotYnVpbGRfdmVuZG9yISRidWlsZF92ZW5kb3IkYWNfZGVsaW0KLWJ1aWxkX29zISRidWlsZF9vcyRhY19kZWxpbQotaG9zdCEkaG9zdCRhY19kZWxpbQotaG9zdF9jcHUhJGhvc3RfY3B1JGFjX2RlbGltCi1ob3N0X3ZlbmRvciEkaG9zdF92ZW5kb3IkYWNfZGVsaW0KLWhvc3Rfb3MhJGhvc3Rfb3MkYWNfZGVsaW0KLVNITElDQzIhJFNITElDQzIkYWNfZGVsaW0KLUNDISRDQyRhY19kZWxpbQotQ0ZMQUdTISRDRkxBR1MkYWNfZGVsaW0KLUxERkxBR1MhJExERkxBR1MkYWNfZGVsaW0KLUNQUEZMQUdTISRDUFBGTEFHUyRhY19kZWxpbQotYWNfY3RfQ0MhJGFjX2N0X0NDJGFjX2RlbGltCi1FWEVFWFQhJEVYRUVYVCRhY19kZWxpbQotT0JKRVhUISRPQkpFWFQkYWNfZGVsaW0KLUNQUCEkQ1BQJGFjX2RlbGltCi1HUkVQISRHUkVQJGFjX2RlbGltCi1FR1JFUCEkRUdSRVAkYWNfZGVsaW0KLUxJQk9CSlMhJExJQk9CSlMkYWNfZGVsaW0KLVZfQ0NPUFQhJFZfQ0NPUFQkYWNfZGVsaW0KLVZfREVGUyEkVl9ERUZTJGFjX2RlbGltCi1WX0dST1VQISRWX0dST1VQJGFjX2RlbGltCi1WX0lOQ0xTISRWX0lOQ0xTJGFjX2RlbGltCi1WX1BDQVBERVAhJFZfUENBUERFUCRhY19kZWxpbQotTE9DQUxTUkMhJExPQ0FMU1JDJGFjX2RlbGltCi1JTlNUQUxMX1BST0dSQU0hJElOU1RBTExfUFJPR1JBTSRhY19kZWxpbQotSU5TVEFMTF9TQ1JJUFQhJElOU1RBTExfU0NSSVBUJGFjX2RlbGltCi1JTlNUQUxMX0RBVEEhJElOU1RBTExfREFUQSRhY19kZWxpbQotTFRMSUJPQkpTISRMVExJQk9CSlMkYWNfZGVsaW0KLV9BQ0VPRgotCi0gIGlmIHRlc3QgYHNlZCAtbiAicy8uKiRhY19kZWxpbVwkL1gvcCIgY29uZiQkc3Vicy5zZWQgfCBncmVwIC1jIFhgID0gNjc7IHRoZW4KLSAgICBicmVhawotICBlbGlmICRhY19sYXN0X3RyeTsgdGhlbgotICAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9Ci0gIGVsc2UKLSAgICBhY19kZWxpbT0iJGFjX2RlbGltISRhY19kZWxpbSBfJGFjX2RlbGltISEgIgotICBmaQotZG9uZQotCi1hY19lb2Y9YHNlZCAtbiAnL15DRU9GWzAtOV0qJC9zL0NFT0YvMC9wJyBjb25mJCRzdWJzLnNlZGAKLWlmIHRlc3QgLW4gIiRhY19lb2YiOyB0aGVuCi0gIGFjX2VvZj1gZWNobyAiJGFjX2VvZiIgfCBzb3J0IC1ucnUgfCBzZWQgMXFgCi0gIGFjX2VvZj1gZXhwciAkYWNfZW9mICsgMWAKLWZpCi0KLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi1jYXQgPiJcJHRtcC9zdWJzLTEuc2VkIiA8PFxDRU9GJGFjX2VvZgotL0BbYS16QS1aX11bYS16QS1aXzAtOV0qQC8hYiBlbmQKLV9BQ0VPRgotc2VkICcKLXMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2cKLXMvXi9zLEAvOyBzLyEvQCx8I18hIV8jfC8KLTpuCi10IG4KLXMvJyIkYWNfZGVsaW0iJyQvLGcvOyB0Ci1zLyQvXFwvOyBwCi1OOyBzL14uKlxuLy87IHMvWyxcXCZdL1xcJi9nOyBzL0AvQHwjXyEhXyN8L2c7IGIgbgotJyA+PiRDT05GSUdfU1RBVFVTIDxjb25mJCRzdWJzLnNlZAotcm0gLWYgY29uZiQkc3Vicy5zZWQKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCi06ZW5kCi1zL3wjXyEhXyN8Ly9nCi1DRU9GJGFjX2VvZgotX0FDRU9GCi0KLQotIyBWUEFUSCBtYXkgY2F1c2UgdHJvdWJsZSB3aXRoIHNvbWUgbWFrZXMsIHNvIHdlIHJlbW92ZSAkKHNyY2RpciksCi0jICR7c3JjZGlyfSBhbmQgQHNyY2RpckAgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAotIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKLSMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj0vewotcy86KlwkKHNyY2Rpcik6Ki86Lwotcy86Klwke3NyY2Rpcn06Ki86Lwotcy86KkBzcmNkaXJAOiovOi8KLXMvXlwoW149XSo9WwkgXSpcKToqL1wxLwotcy86KiQvLwotcy9eW149XSo9WwkgXSokLy8KLX0nCi1maQotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLWZpICMgdGVzdCAtbiAiJENPTkZJR19GSUxFUyIKLQotCi1mb3IgYWNfdGFnIGluICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgOkMgJENPTkZJR19DT01NQU5EUwotZG8KLSAgY2FzZSAkYWNfdGFnIGluCi0gIDpbRkhMQ10pIGFjX21vZGU9JGFjX3RhZzsgY29udGludWU7OwotICBlc2FjCi0gIGNhc2UgJGFjX21vZGUkYWNfdGFnIGluCi0gIDpbRkhMXSo6Kik7OwotICA6TCogfCA6Qyo6KikgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogSW52YWxpZCB0YWcgJGFjX3RhZy4iID4mMjt9Ci0gICB7IChleGl0IDEpOyBleGl0IDE7IH07IH07OwotICA6W0ZIXS0pIGFjX3RhZz0tOi07OwotICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OwotICBlc2FjCi0gIGFjX3NhdmVfSUZTPSRJRlMKLSAgSUZTPToKLSAgc2V0IHggJGFjX3RhZwotICBJRlM9JGFjX3NhdmVfSUZTCi0gIHNoaWZ0Ci0gIGFjX2ZpbGU9JDEKLSAgc2hpZnQKLQotICBjYXNlICRhY19tb2RlIGluCi0gIDpMKSBhY19zb3VyY2U9JDE7OwotICA6W0ZIXSkKLSAgICBhY19maWxlX2lucHV0cz0KLSAgICBmb3IgYWNfZgotICAgIGRvCi0gICAgICBjYXNlICRhY19mIGluCi0gICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7Ci0gICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQotCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKLQkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KLQkgdGVzdCAtZiAiJGFjX2YiIHx8Ci0JICAgY2FzZSAkYWNfZiBpbgotCSAgIFtcXC8kXSopIGZhbHNlOzsKLQkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7Ci0JICAgZXNhYyB8fAotCSAgIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjUKLWVjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBmaW5kIGlucHV0IGZpbGU6ICRhY19mIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OzsKLSAgICAgIGVzYWMKLSAgICAgIGFjX2ZpbGVfaW5wdXRzPSIkYWNfZmlsZV9pbnB1dHMgJGFjX2YiCi0gICAgZG9uZQotCi0gICAgIyBMZXQncyBzdGlsbCBwcmV0ZW5kIGl0IGlzIGBjb25maWd1cmUnIHdoaWNoIGluc3RhbnRpYXRlcyAoaS5lLiwgZG9uJ3QKLSAgICAjIHVzZSAkYXNfbWUpLCBwZW9wbGUgd291bGQgYmUgc3VycHJpc2VkIHRvIHJlYWQ6Ci0gICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KLSAgICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBmcm9tICJgSUZTPToKLQkgIGVjaG8gJCogfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJ2AiIGJ5IGNvbmZpZ3VyZS4iCi0gICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgotICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCi0gICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiBjcmVhdGluZyAkYWNfZmlsZSIgPiY1Ci1lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQotICAgIGZpCi0KLSAgICBjYXNlICRhY190YWcgaW4KLSAgICAqOi06KiB8ICo6LSkgY2F0ID4iJHRtcC9zdGRpbiI7OwotICAgIGVzYWMKLSAgICA7OwotICBlc2FjCi0KLSAgYWNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFjX2ZpbGUiIHx8Ci0kYXNfZXhwciBYIiRhY19maWxlIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvL1wpJCcgXHwgXAotCSBYIiRhY19maWxlIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKLWVjaG8gWCIkYWNfZmlsZSIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gIHsgYXNfZGlyPSIkYWNfZGlyIgotICBjYXNlICRhc19kaXIgaW4gIygKLSAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OwotICBlc2FjCi0gIHRlc3QgLWQgIiRhc19kaXIiIHx8IHsgJGFzX21rZGlyX3AgJiYgbWtkaXIgLXAgIiRhc19kaXIiOyB9IHx8IHsKLSAgICBhc19kaXJzPQotICAgIHdoaWxlIDo7IGRvCi0gICAgICBjYXNlICRhc19kaXIgaW4gIygKLSAgICAgICpcJyopIGFzX3FkaXI9YGVjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIygKLSAgICAgICopIGFzX3FkaXI9JGFzX2Rpcjs7Ci0gICAgICBlc2FjCi0gICAgICBhc19kaXJzPSInJGFzX3FkaXInICRhc19kaXJzIgotICAgICAgYXNfZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX2RpciIgfHwKLSRhc19leHByIFgiJGFzX2RpciIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKLQkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpW14vXScgXHwgXAotCSBYIiRhc19kaXIiIDogJ1hcKC8vXCkkJyBcfCBcCi0JIFgiJGFzX2RpciIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8Ci1lY2hvIFgiJGFzX2RpciIgfAotICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKVteL10uKi97Ci0JICAgIHMvL1wxLwotCSAgICBxCi0JICB9Ci0JICAvXlhcKFwvXC9cKSQvewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgL15YXChcL1wpLiovewotCSAgICBzLy9cMS8KLQkgICAgcQotCSAgfQotCSAgcy8uKi8uLzsgcSdgCi0gICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhawotICAgIGRvbmUKLSAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCi0gIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSAkYXNfZGlyIiA+JjI7fQotICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9OyB9Ci0gIGFjX2J1aWxkZGlyPS4KLQotY2FzZSAiJGFjX2RpciIgaW4KLS4pIGFjX2Rpcl9zdWZmaXg9IGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotKikKLSAgYWNfZGlyX3N1ZmZpeD0vYGVjaG8gIiRhY19kaXIiIHwgc2VkICdzLF5cLltcXC9dLCwnYAotICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gIGFjX3RvcF9idWlsZGRpcl9zdWI9YGVjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAncywvW15cXC9dKiwvLi4sZztzLC8sLCdgCi0gIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KLSAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OwotICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKLSAgZXNhYyA7OwotZXNhYwotYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCi1hY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4Ci0jIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgotYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4Ci0KLWNhc2UgJHNyY2RpciBpbgotICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgYWNfc3JjZGlyPS4KLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCi0gICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OwotICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCi0gICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKLSAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKLSAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7Ci0gICopICMgUmVsYXRpdmUgbmFtZS4KLSAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKLSAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgotICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OwotZXNhYwotYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAotCi0KLSAgY2FzZSAkYWNfbW9kZSBpbgotICA6RikKLSAgIwotICAjIENPTkZJR19GSUxFCi0gICMKLQotICBjYXNlICRJTlNUQUxMIGluCi0gIFtcXC8kXSogfCA/OltcXC9dKiApIGFjX0lOU1RBTEw9JElOU1RBTEwgOzsKLSAgKikgYWNfSU5TVEFMTD0kYWNfdG9wX2J1aWxkX3ByZWZpeCRJTlNUQUxMIDs7Ci0gIGVzYWMKLV9BQ0VPRgotCi1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YKLSMgSWYgdGhlIHRlbXBsYXRlIGRvZXMgbm90IGtub3cgYWJvdXQgZGF0YXJvb3RkaXIsIGV4cGFuZCBpdC4KLSMgRklYTUU6IFRoaXMgaGFjayBzaG91bGQgYmUgcmVtb3ZlZCBhIGZldyB5ZWFycyBhZnRlciAyLjYwLgotYWNfZGF0YXJvb3RkaXJfaGFjaz07IGFjX2RhdGFyb290ZGlyX3NlZW49Ci0KLWNhc2UgYHNlZCAtbiAnL2RhdGFyb290ZGlyLyB7Ci0gIHAKLSAgcQotfQotL0BkYXRhZGlyQC9wCi0vQGRvY2RpckAvcAotL0BpbmZvZGlyQC9wCi0vQGxvY2FsZWRpckAvcAotL0BtYW5kaXJAL3AKLScgJGFjX2ZpbGVfaW5wdXRzYCBpbgotKmRhdGFyb290ZGlyKikgYWNfZGF0YXJvb3RkaXJfc2Vlbj15ZXM7OwotKkBkYXRhZGlyQCp8KkBkb2NkaXJAKnwqQGluZm9kaXJAKnwqQGxvY2FsZWRpckAqfCpAbWFuZGlyQCopCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiYyO30KLV9BQ0VPRgotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgYWNfZGF0YXJvb3RkaXJfaGFjaz0nCi0gIHMmQGRhdGFkaXJAJiRkYXRhZGlyJmcKLSAgcyZAZG9jZGlyQCYkZG9jZGlyJmcKLSAgcyZAaW5mb2RpckAmJGluZm9kaXImZwotICBzJkBsb2NhbGVkaXJAJiRsb2NhbGVkaXImZwotICBzJkBtYW5kaXJAJiRtYW5kaXImZwotICAgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Ci1lc2FjCi1fQUNFT0YKLQotIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgotIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCi0jIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/Ci1jYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgotICBzZWQgIiRhY192cHN1YgotJGV4dHJhc3ViCi1fQUNFT0YKLWNhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRgotOnQKLS9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKLXMmQGNvbmZpZ3VyZV9pbnB1dEAmJGNvbmZpZ3VyZV9pbnB1dCY7dCB0Ci1zJkB0b3BfYnVpbGRkaXJAJiRhY190b3BfYnVpbGRkaXJfc3ViJjt0IHQKLXMmQHNyY2RpckAmJGFjX3NyY2RpciY7dCB0Ci1zJkBhYnNfc3JjZGlyQCYkYWNfYWJzX3NyY2RpciY7dCB0Ci1zJkB0b3Bfc3JjZGlyQCYkYWNfdG9wX3NyY2RpciY7dCB0Ci1zJkBhYnNfdG9wX3NyY2RpckAmJGFjX2Fic190b3Bfc3JjZGlyJjt0IHQKLXMmQGJ1aWxkZGlyQCYkYWNfYnVpbGRkaXImO3QgdAotcyZAYWJzX2J1aWxkZGlyQCYkYWNfYWJzX2J1aWxkZGlyJjt0IHQKLXMmQGFic190b3BfYnVpbGRkaXJAJiRhY19hYnNfdG9wX2J1aWxkZGlyJjt0IHQKLXMmQElOU1RBTExAJiRhY19JTlNUQUxMJjt0IHQKLSRhY19kYXRhcm9vdGRpcl9oYWNrCi0iICRhY19maWxlX2lucHV0cyB8IHNlZCAtZiAiJHRtcC9zdWJzLTEuc2VkIiA+JHRtcC9vdXQKLQotdGVzdCAteiAiJGFjX2RhdGFyb290ZGlyX2hhY2skYWNfZGF0YXJvb3RkaXJfc2VlbiIgJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL1wke2RhdGFyb290ZGlyfS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAtbiAiJGFjX291dCI7IH0gJiYKLSAgeyBhY19vdXQ9YHNlZCAtbiAnL15bCSBdKmRhdGFyb290ZGlyWwkgXSo6Kj0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLXogIiRhY19vdXQiOyB9ICYmCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiY1Ci1lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICRhY19maWxlIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSB2YXJpYWJsZSBcYGRhdGFyb290ZGlyJwotd2hpY2ggc2VlbXMgdG8gYmUgdW5kZWZpbmVkLiAgUGxlYXNlIG1ha2Ugc3VyZSBpdCBpcyBkZWZpbmVkLiIgPiYyO30KLQotICBybSAtZiAiJHRtcC9zdGRpbiIKLSAgY2FzZSAkYWNfZmlsZSBpbgotICAtKSBjYXQgIiR0bXAvb3V0Ijsgcm0gLWYgIiR0bXAvb3V0Ijs7Ci0gICopIHJtIC1mICIkYWNfZmlsZSI7IG12ICIkdG1wL291dCIgJGFjX2ZpbGU7OwotICBlc2FjCi0gOzsKLSAgOkgpCi0gICMKLSAgIyBDT05GSUdfSEVBREVSCi0gICMKLV9BQ0VPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGBjb25mdGVzdC5kZWZpbmVzJywgdGhhdAotIyBzdWJzdGl0dXRlcyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLSMgRmlyc3QsIGFwcGVuZCBhIHNwYWNlIHRvIGV2ZXJ5IHVuZGVmL2RlZmluZSBsaW5lLCB0byBlYXNlIG1hdGNoaW5nLgotZWNobyAncy8kLyAvJyA+Y29uZnRlc3QuZGVmaW5lcwotIyBUaGVuLCBwcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QsIG9yIGluCi0jIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQsIGluIGNvbmZpZy5zdGF0dXMuICBJZiBzb21lIG1hY3JvcyB3ZXJlCi0jIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwgI2RlZmluZXMgZm9yIHRoZSBzYW1lCi0jIHN5bWJvbCwgd2hpY2ggaXMgdXNlbGVzcy4gIEJ1dCBkbyBub3Qgc29ydCB0aGVtLCBzaW5jZSB0aGUgbGFzdAotIyBBQ19ERUZJTkUgbXVzdCBiZSBob25vcmVkLgotYWNfd29yZF9yZT1bXyRhc19jcl9MZXR0ZXJzXVtfJGFzX2NyX2FsbnVtXSoKLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBQQVJBTVMgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQsIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMgUEFSQU1TIGlzIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbi0taW4gbW9zdCBjYXNlcywgaXQncwotIyBqdXN0IGFuIGVtcHR5IHN0cmluZy4KLWFjX2RBPSdzLF5cXChbCSAjXSpcXClbXgkgXSpcXChbCSBdKicKLWFjX2RCPSdcXClbCSAoXS4qLFxcMWRlZmluZVxcMicKLWFjX2RDPScgJwotYWNfZEQ9JyAsJwotCi11bmlxIGNvbmZkZWZzLmggfAotICBzZWQgLW4gJwotCXQgcnNldAotCTpyc2V0Ci0Jcy9eWwkgXSojWwkgXSpkZWZpbmVbCSBdWwkgXSovLwotCXQgb2sKLQlkCi0JOm9rCi0Jcy9bXFwmLF0vXFwmL2cKLQlzL15cKCciJGFjX3dvcmRfcmUiJ1wpXCgoW14oKV0qKVwpWwkgXSpcKC4qXCkvICciJGFjX2RBIidcMSciJGFjX2RCIidcMiciJHthY19kQ30iJ1wzJyIkYWNfZEQiJy9wCi0Jcy9eXCgnIiRhY193b3JkX3JlIidcKVsJIF0qXCguKlwpLyciJGFjX2RBIidcMSciJGFjX2RCJGFjX2RDIidcMiciJGFjX2REIicvcAotICAnID4+Y29uZnRlc3QuZGVmaW5lcwotCi0jIFJlbW92ZSB0aGUgc3BhY2UgdGhhdCB3YXMgYXBwZW5kZWQgdG8gZWFzZSBtYXRjaGluZy4KLSMgVGhlbiByZXBsYWNlICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi0jIChUaGUgcmVnZXhwIGNhbiBiZSBzaG9ydCwgc2luY2UgdGhlIGxpbmUgY29udGFpbnMgZWl0aGVyICNkZWZpbmUgb3IgI3VuZGVmLikKLWVjaG8gJ3MvICQvLwotcyxeWwkgI10qdS4qLC8qICYgKi8sJyA+PmNvbmZ0ZXN0LmRlZmluZXMKLQotIyBCcmVhayB1cCBjb25mdGVzdC5kZWZpbmVzOgotYWNfbWF4X3NlZF9saW5lcz01MAotCi0jIEZpcnN0IHNlZCBjb21tYW5kIGlzOgkgc2VkIC1mIGRlZmluZXMuc2VkICRhY19maWxlX2lucHV0cyA+IiR0bXAvb3V0MSIKLSMgU2Vjb25kIG9uZSBpczoJIHNlZCAtZiBkZWZpbmVzLnNlZCAiJHRtcC9vdXQxIiA+IiR0bXAvb3V0MiIKLSMgVGhpcmQgb25lIHdpbGwgYmU6CSBzZWQgLWYgZGVmaW5lcy5zZWQgIiR0bXAvb3V0MiIgPiIkdG1wL291dDEiCi0jIGV0IGNldGVyYS4KLWFjX2luPSckYWNfZmlsZV9pbnB1dHMnCi1hY19vdXQ9JyIkdG1wL291dDEiJwotYWNfbnh0PSciJHRtcC9vdXQyIicKLQotd2hpbGUgOgotZG8KLSAgIyBXcml0ZSBhIGhlcmUgZG9jdW1lbnQ6Ci0gICAgY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YKLSAgICAjIEZpcnN0LCBjaGVjayB0aGUgZm9ybWF0IG9mIHRoZSBsaW5lOgotICAgIGNhdCA+IlwkdG1wL2RlZmluZXMuc2VkIiA8PFxcQ0VPRgotL15bCSBdKiNbCSBdKnVuZGVmWwkgXVsJIF0qJGFjX3dvcmRfcmVbCSBdKlwkL2IgZGVmCi0vXlsJIF0qI1sJIF0qZGVmaW5lWwkgXVsJIF0qJGFjX3dvcmRfcmVbKAkgXS9iIGRlZgotYgotOmRlZgotX0FDRU9GCi0gIHNlZCAke2FjX21heF9zZWRfbGluZXN9cSBjb25mdGVzdC5kZWZpbmVzID4+JENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICAgIHNlZCAtZiAiJHRtcC9kZWZpbmVzLnNlZCInICIkYWNfaW4gPiRhY19vdXQiID4+JENPTkZJR19TVEFUVVMKLSAgYWNfaW49JGFjX291dDsgYWNfb3V0PSRhY19ueHQ7IGFjX254dD0kYWNfaW4KLSAgc2VkIDEsJHthY19tYXhfc2VkX2xpbmVzfWQgY29uZnRlc3QuZGVmaW5lcyA+Y29uZnRlc3QudGFpbAotICBncmVwIC4gY29uZnRlc3QudGFpbCA+L2Rldi9udWxsIHx8IGJyZWFrCi0gIHJtIC1mIGNvbmZ0ZXN0LmRlZmluZXMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC5kZWZpbmVzCi1kb25lCi1ybSAtZiBjb25mdGVzdC5kZWZpbmVzIGNvbmZ0ZXN0LnRhaWwKLQotZWNobyAiYWNfcmVzdWx0PSRhY19pbiIgPj4kQ09ORklHX1NUQVRVUwotY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GCi0gIGlmIHRlc3QgeCIkYWNfZmlsZSIgIT0geC07IHRoZW4KLSAgICBlY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgPiIkdG1wL2NvbmZpZy5oIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIgPj4iJHRtcC9jb25maWcuaCIKLSAgICBpZiBkaWZmICRhY19maWxlICIkdG1wL2NvbmZpZy5oIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1Ci1lY2hvICIkYXNfbWU6ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY2O30KLSAgICBlbHNlCi0gICAgICBybSAtZiAkYWNfZmlsZQotICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICRhY19maWxlCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIi8qICRjb25maWd1cmVfaW5wdXQgICovIgotICAgIGNhdCAiJGFjX3Jlc3VsdCIKLSAgZmkKLSAgcm0gLWYgIiR0bXAvb3V0MTIiCi0gOzsKLQotICA6QykgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY1Ci1lY2hvICIkYXNfbWU6IGV4ZWN1dGluZyAkYWNfZmlsZSBjb21tYW5kcyIgPiY2O30KLSA7OwotICBlc2FjCi0KLQotICBjYXNlICRhY19maWxlJGFjX21vZGUgaW4KLSAgICAiZGVmYXVsdC0xIjpDKSBpZiB0ZXN0IC1mIC5kZXZlbDsgdGhlbgotCWVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotCWNhdCBNYWtlZmlsZS1kZXZlbC1hZGRzID4+IE1ha2VmaWxlCi0JbWFrZSBkZXBlbmQKLWZpIDs7Ci0KLSAgZXNhYwotZG9uZSAjIGZvciBhY190YWcKLQotCi17IChleGl0IDApOyBleGl0IDA7IH0KLV9BQ0VPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLWFjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCi0KLQotIyBjb25maWd1cmUgaXMgd3JpdGluZyB0byBjb25maWcubG9nLCBhbmQgdGhlbiBjYWxscyBjb25maWcuc3RhdHVzLgotIyBjb25maWcuc3RhdHVzIGRvZXMgaXRzIG93biByZWRpcmVjdGlvbiwgYXBwZW5kaW5nIHRvIGNvbmZpZy5sb2cuCi0jIFVuZm9ydHVuYXRlbHksIG9uIERPUyB0aGlzIGZhaWxzLCBhcyBjb25maWcubG9nIGlzIHN0aWxsIGtlcHQgb3BlbgotIyBieSBjb25maWd1cmUsIHNvIGNvbmZpZy5zdGF0dXMgd29uJ3QgYmUgYWJsZSB0byB3cml0ZSB0byBpdDsgaXRzCi0jIG91dHB1dCBpcyBzaW1wbHkgZGlzY2FyZGVkLiAgU28gd2UgZXhlYyB0aGUgRkQgdG8gL2Rldi9udWxsLAotIyBlZmZlY3RpdmVseSBjbG9zaW5nIGNvbmZpZy5sb2csIHNvIGl0IGNhbiBiZSBwcm9wZXJseSAocmUpb3BlbmVkIGFuZAotIyBhcHBlbmRlZCB0byBieSBjb25maWcuc3RhdHVzLiAgV2hlbiBjb21pbmcgYmFjayB0byBjb25maWd1cmUsIHdlCi0jIG5lZWQgdG8gbWFrZSB0aGUgRkQgYXZhaWxhYmxlIGFnYWluLgotaWYgdGVzdCAiJG5vX2NyZWF0ZSIgIT0geWVzOyB0aGVuCi0gIGFjX2NzX3N1Y2Nlc3M9OgotICBhY19jb25maWdfc3RhdHVzX2FyZ3M9Ci0gIHRlc3QgIiRzaWxlbnQiID0geWVzICYmCi0gICAgYWNfY29uZmlnX3N0YXR1c19hcmdzPSIkYWNfY29uZmlnX3N0YXR1c19hcmdzIC0tcXVpZXQiCi0gIGV4ZWMgNT4vZGV2L251bGwKLSAgJFNIRUxMICRDT05GSUdfU1RBVFVTICRhY19jb25maWdfc3RhdHVzX2FyZ3MgfHwgYWNfY3Nfc3VjY2Vzcz1mYWxzZQotICBleGVjIDU+PmNvbmZpZy5sb2cKLSAgIyBVc2UgfHwsIG5vdCAmJiwgdG8gYXZvaWQgZXhpdGluZyBmcm9tIHRoZSBpZiB3aXRoICQ/ID0gMSwgd2hpY2gKLSAgIyB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBmYWlsIGlmIHRoaXMgaXMgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24uCi0gICRhY19jc19zdWNjZXNzIHx8IHsgKGV4aXQgMSk7IGV4aXQgMTsgfQotZmkKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDEwZTcuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsOTk1ICswLDAgQEAKLWRubCBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2NvbmZpZ3VyZS5pbix2IDEuMTg4LjIuOCAyMDA3LzA5LzEyIDE5OjQ4OjUwIGd1eSBFeHAgJCAoTEJMKQotZG5sCi1kbmwgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci1kbmwJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1kbmwKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotZG5sCi0KLUFDX1JFVklTSU9OKCRSZXZpc2lvbjogMS4xODguMi44ICQpCi1BQ19QUkVSRVEoMi41MCkKLUFDX0lOSVQodGNwZHVtcC5jKQotCi1BQ19DQU5PTklDQUxfSE9TVAotCi1BQ19MQkxfQ19JTklUKFZfQ0NPUFQsIFZfSU5DTFMpCi1BQ19MQkxfQ19JTkxJTkUKLUFDX0NfX19BVFRSSUJVVEVfXwotQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIHJwYy9ycGNlbnQuaCBuZXRkbmV0L2RuZXRkYi5oKQotQUNfQ0hFQ0tfSEVBREVSUyhuZXQvcGZ2YXIuaCwgLCAsIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPl0pCi1pZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX25ldF9wZnZhcl9oIiA9PSB5ZXM7IHRoZW4KLQlMT0NBTFNSQz0icHJpbnQtcGZsb2cuYyAkTE9DQUxTUkMiCi1maQotQUNfQ0hFQ0tfSEVBREVSUyhuZXRpbmV0L2lmX2V0aGVyLmgsICwgLCBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5dKQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2giICE9IHllczsgdGhlbgotCSMKLQkjIFRoZSBzaW1wbGUgdGVzdCBkaWRuJ3Qgd29yay4KLQkjIERvIHdlIG5lZWQgdG8gaW5jbHVkZSA8bmV0L2lmLmg+IGZpcnN0PwotCSMgVW5zZXQgYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCBzbyB3ZSBkb24ndAotCSMgdHJlYXQgdGhlIHByZXZpb3VzIGZhaWx1cmUgYXMgYSBjYWNoZWQgdmFsdWUgYW5kCi0JIyBzdXBwcmVzcyB0aGUgbmV4dCB0ZXN0LgotCSMKLQlBQ19NU0dfTk9USUNFKFtSZWNoZWNraW5nIHdpdGggc29tZSBhZGRpdGlvbmFsIGluY2x1ZGVzXSkKLQl1bnNldCBhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oCi0JQUNfQ0hFQ0tfSEVBREVSUyhuZXRpbmV0L2lmX2V0aGVyLmgsICwgLCBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci1zdHJ1Y3QgbWJ1ZjsKLXN0cnVjdCBydGVudHJ5OwotI2luY2x1ZGUgPG5ldC9pZi5oPl0pCi1maQotCi1BQ19IRUFERVJfVElNRQotCi1jYXNlICIkaG9zdF9vcyIgaW4KLQotbGludXgqKQotCUFDX01TR19DSEVDS0lORyhMaW51eCBrZXJuZWwgdmVyc2lvbikKLSAJaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAJCUFDX0NBQ0hFX1ZBTChhY19jdl9saW51eF92ZXJzLAotIAkJICAgIGFjX2N2X2xpbnV4X3ZlcnM9dW5rbm93bikKLSAJZWxzZQotIAkJQUNfQ0FDSEVfVkFMKGFjX2N2X2xpbnV4X3ZlcnMsCi0gCQkgICAgYWNfY3ZfbGludXhfdmVycz1gdW5hbWUgLXIgMj4mMSB8IFwKLSAJCQlzZWQgLW4gLWUgJyRzLy4qIC8vJyAtZSAnJHMvXC4uKi8vcCdgKQotIAlmaQotCUFDX01TR19SRVNVTFQoJGFjX2N2X2xpbnV4X3ZlcnMpCi0gCWlmIHRlc3QgJGFjX2N2X2xpbnV4X3ZlcnMgPSB1bmtub3duIDsgdGhlbgotIAkJQUNfTVNHX0VSUk9SKGNhbm5vdCBkZXRlcm1pbmUgbGludXggdmVyc2lvbiB3aGVuIGNyb3NzLWNvbXBpbGluZykKLSAJZmkKLQlpZiB0ZXN0ICRhY19jdl9saW51eF92ZXJzIC1sdCAyIDsgdGhlbgotCQlBQ19NU0dfRVJST1IodmVyc2lvbiAyIG9yIGhpZ2hlciByZXF1aXJlZDsgc2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvKQotCWZpCi0JOzsKLQotKikKLQk7OwotZXNhYwotCi0KLUFDX0NIRUNLX0hFQURFUlMoc21pLmgpCi1BQ19DSEVDS19MSUIoc21pLCBzbWlJbml0KQotaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zbWlfaCIgPSB5ZXMgLWEgIiRhY19jdl9saWJfc21pX3NtaUluaXQiID0geWVzCi10aGVuCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIGxpYnNtaV0pCi0gICAgICAgIEFDX1RSWV9SVU4oWyAvKiBsaWJzbWkgYXZhaWxhYmxlIGNoZWNrICovCi0jaW5jbHVkZSA8c21pLmg+Ci1tYWluKCkKLXsKLSAgaW50IGN1cnJlbnQsIHJldmlzaW9uLCBhZ2UsIG47Ci0gIGNvbnN0IGludCByZXF1aXJlZCA9IDI7Ci0gIGlmIChzbWlJbml0KCIiKSkgCi0gICAgZXhpdCgxKTsKLSAgaWYgKHN0cmNtcChTTUlfTElCUkFSWV9WRVJTSU9OLCBzbWlfbGlicmFyeV92ZXJzaW9uKSkKLSAgICBleGl0KDIpOwotICBuID0gc3NjYW5mKHNtaV9saWJyYXJ5X3ZlcnNpb24sICIlZDolZDolZCIsICZjdXJyZW50LCAmcmV2aXNpb24sICZhZ2UpOwotICBpZiAobiAhPSAzKQotICAgIGV4aXQoMyk7Ci0gIGlmIChyZXF1aXJlZCA8IGN1cnJlbnQgLSBhZ2UgfHwgcmVxdWlyZWQgPiBjdXJyZW50KQotICAgIGV4aXQoNCk7Ci0gIGV4aXQoMCk7Ci19Ci1dLAotWyBBQ19NU0dfUkVTVUxUKHllcykKLSAgQUNfREVGSU5FKExJQlNNSSkKLSAgbGlic21pPXllc10sCi1kbmwgYXV0b2NvbmYgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgJD8gY29udGFpbnMgdGhlIGV4aXQgdmFsdWUuCi1kbmwgcmVhbGl0eSBpcyB0aGF0IGl0IGRvZXMgbm90LiAgV2UgbGVhdmUgdGhpcyBpbiBqdXN0IGluIGNhc2UKLWRubCBhdXRvY29uZiBldmVyIGNvbWVzIGJhY2sgdG8gbWF0Y2ggdGhlIGRvY3VtZW50YXRpb24uCi1bIGNhc2UgJD8gaW4KLSAgMSkgQUNfTVNHX1JFU1VMVChubyAtIHNtaUluaXQgZmFpbGVkKSA7OwotICAyKSBBQ19NU0dfUkVTVUxUKG5vIC0gaGVhZGVyL2xpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCkgOzsKLSAgMykgQUNfTVNHX1JFU1VMVChubyAtIGNhbid0IGRldGVybWluZSBsaWJyYXJ5IHZlcnNpb24pIDs7Ci0gIDQpIEFDX01TR19SRVNVTFQobm8gLSB0b28gb2xkKSA7OwotICAqKSBBQ19NU0dfUkVTVUxUKG5vKSA7OwotICBlc2FjCi0gIGxpYnNtaT1ub10sCi1bIEFDX01TR19SRVNVTFQobm90IHdoZW4gY3Jvc3MtY29tcGlsaW5nKQotICBsaWJzbWk9bm9dCi0pCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIHRoZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlcl0pCi1BQ19BUkdfRU5BQkxFKHNtYiwKLVsgIC0tZW5hYmxlLXNtYiAgICAgICAgICAgIGVuYWJsZSBwb3NzaWJseS1idWdneSBTTUIgcHJpbnRlciBbZGVmYXVsdD15ZXNdCi0gIC0tZGlzYWJsZS1zbWIgICAgICAgICAgIGRpc2FibGUgcG9zc2libHktYnVnZ3kgU01CIHByaW50ZXJdLCwKLSAgIGVuYWJsZXZhbD15ZXMpCi1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKQlBQ19NU0dfUkVTVUxUKHllcykKLQlBQ19XQVJOKFtUaGUgU01CIHByaW50ZXIgbWF5IGhhdmUgZXhwbG9pdGFibGUgYnVmZmVyIG92ZXJmbG93cyEhIV0pCi0JQUNfREVGSU5FKFRDUERVTVBfRE9fU01CKQotCUxPQ0FMU1JDPSJwcmludC1zbWIuYyBzbWJ1dGlsLmMgJExPQ0FMU1JDIgotCTs7Ci0qKQlBQ19NU0dfUkVTVUxUKG5vKQotCTs7Ci1lc2FjCi0KLUFDX0FSR19XSVRIKHVzZXIsIFsgIC0td2l0aC11c2VyPVVTRVJOQU1FICAgIGRyb3AgcHJpdmlsZWdlcyBieSBkZWZhdWx0IHRvIFVTRVJOQU1FXSkKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBkcm9wIHJvb3QgcHJpdmlsZWdlcyBieSBkZWZhdWx0XSkKLWlmIHRlc3QgISAteiAiJHdpdGhfdXNlciIgOyB0aGVuCi0gICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChXSVRIX1VTRVIsICIkd2l0aHZhbCIpCi0gICAgICAgQUNfTVNHX1JFU1VMVCh0byBcIiR3aXRodmFsXCIpCi1lbHNlCi0gICAgICAgQUNfTVNHX1JFU1VMVChubykKLWZpCi0KLUFDX0FSR19XSVRIKGNocm9vdCwgWyAgLS13aXRoLWNocm9vdD1ESVJFQ1RPUlkgd2hlbiBkcm9wcGluZyBwcml2aWxlZ2VzLCBjaHJvb3QgdG8gRElSRUNUT1JZXSkKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBjaHJvb3RdKQotaWYgdGVzdCAhIC16ICIkd2l0aF9jaHJvb3QiIDsgdGhlbgotICAgICAgICBBQ19ERUZJTkVfVU5RVU9URUQoV0lUSF9DSFJPT1QsICIkd2l0aHZhbCIpCi0gICAgICAgQUNfTVNHX1JFU1VMVCh0byBcIiR3aXRodmFsXCIpCi1lbHNlCi0gICAgICAgQUNfTVNHX1JFU1VMVChubykKLWZpCi0KLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgaXB2Nl0pCi1BQ19BUkdfRU5BQkxFKGlwdjYsCi1bICAtLWVuYWJsZS1pcHY2ICAgICAgICAgICBlbmFibGUgaXB2NiAod2l0aCBpcHY0KSBzdXBwb3J0Ci0gIC0tZGlzYWJsZS1pcHY2ICAgICAgICAgIGRpc2FibGUgaXB2NiBzdXBwb3J0XSwKLVsgY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgICBBQ19NU0dfUkVTVUxUKHllcykKLSAgICAgICBMT0NBTFNSQz0icHJpbnQtaXA2LmMgcHJpbnQtaXA2b3B0cy5jIHByaW50LW1vYmlsaXR5LmMgcHJpbnQtcmlwbmcuYyBwcmludC1pY21wNi5jIHByaW50LWZyYWc2LmMgcHJpbnQtcnQ2LmMgcHJpbnQtb3NwZjYuYyBwcmludC1kaGNwNi5jICRMT0NBTFNSQyIKLSAgICAgICBBQ19ERUZJTkUoSU5FVDYpCi0gICAgICAgaXB2Nj15ZXMKLSAgICAgICA7OwotKikKLSAgICAgICBBQ19NU0dfUkVTVUxUKG5vKQotICAgICAgIGlwdjY9bm8KLSAgICAgICA7OwotICBlc2FjIF0sCi0KLSAgQUNfVFJZX1JVTihbIC8qIEFGX0lORVQ2IGF2YWlsYWJsZSBjaGVjayAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLW1haW4oKQotewotIGlmIChzb2NrZXQoQUZfSU5FVDYsIFNPQ0tfU1RSRUFNLCAwKSA8IDApCi0gICBleGl0KDEpOwotIGVsc2UKLSAgIGV4aXQoMCk7Ci19Ci1dLAotWyBBQ19NU0dfUkVTVUxUKHllcykKLSAgTE9DQUxTUkM9InByaW50LWlwNi5jIHByaW50LWlwNm9wdHMuYyBwcmludC1tb2JpbGl0eS5jIHByaW50LXJpcG5nLmMgcHJpbnQtaWNtcDYuYyBwcmludC1mcmFnNi5jIHByaW50LXJ0Ni5jIHByaW50LW9zcGY2LmMgcHJpbnQtZGhjcDYuYyAkTE9DQUxTUkMiCi0gIEFDX0RFRklORShJTkVUNikKLSAgaXB2Nj15ZXNdLAotWyBBQ19NU0dfUkVTVUxUKG5vKQotICBpcHY2PW5vXSwKLVsgQUNfTVNHX1JFU1VMVChubykKLSAgaXB2Nj1ub10KLSkpCi0KLWlwdjZ0eXBlPXVua25vd24KLWlwdjZsaWI9bm9uZQotaXB2NnRyeWxpYmM9bm8KLQotaWYgdGVzdCAiJGlwdjYiID0gInllcyI7IHRoZW4KLQlBQ19NU0dfQ0hFQ0tJTkcoW2lwdjYgc3RhY2sgdHlwZV0pCi0JZm9yIGkgaW4gaW5yaWEga2FtZSBsaW51eC1nbGliYyBsaW51eC1saWJpbmV0NiB0b3NoaWJhIHY2ZCB6ZXRhOyBkbwotCQljYXNlICRpIGluCi0JCWlucmlhKQotCQkJZG5sIGh0dHA6Ly93d3cua2FtZS5uZXQvCi0JCQlBQ19FR1JFUF9DUFAoeWVzLAotWyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaWZkZWYgSVBWNl9JTlJJQV9WRVJTSU9OCi15ZXMKLSNlbmRpZl0sCi0JCQkJW2lwdjZ0eXBlPSRpOwotCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIl0pCi0JCQk7OwotCQlrYW1lKQotCQkJZG5sIGh0dHA6Ly93d3cua2FtZS5uZXQvCi0JCQlBQ19FR1JFUF9DUFAoeWVzLAotWyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaWZkZWYgX19LQU1FX18KLXllcwotI2VuZGlmXSwKLQkJCQlbaXB2NnR5cGU9JGk7Ci0JCQkJaXB2NmxpYj1pbmV0NjsKLQkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwotCQkJCWlwdjZ0cnlsaWJjPXllczsKLQkJCQlDRkxBR1M9Ii1ESU5FVDYgJENGTEFHUyJdKQotCQkJOzsKLQkJbGludXgtZ2xpYmMpCi0JCQlkbmwgaHR0cDovL3d3dy52Ni5saW51eC5vci5qcC8KLQkJCUFDX0VHUkVQX0NQUCh5ZXMsCi1bI2luY2x1ZGUgPGZlYXR1cmVzLmg+Ci0jaWYgZGVmaW5lZChfX0dMSUJDX18pICYmIF9fR0xJQkNfXyA+PSAyICYmIF9fR0xJQkNfTUlOT1JfXyA+PSAxCi15ZXMKLSNlbmRpZl0sCi0JCQkJW2lwdjZ0eXBlPSRpOwotCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIl0pCi0JCQk7OwotCQlsaW51eC1saWJpbmV0NikKLQkJCWRubCBodHRwOi8vd3d3LnY2LmxpbnV4Lm9yLmpwLwotCQkJZG5sCi0JCQlkbmwgVGhpcyBhbHNvIG1hdGNoZXMgU29sYXJpcyA4IGFuZCBUcnU2NCBVTklYIDUuMSwKLQkJCWRubCBhbmQgcG9zc2libHkgb3RoZXIgdmVyc2lvbnMgb2YgdGhvc2UgT1NlcwotCQkJZG5sCi0JCQlpZiB0ZXN0IC1kIC91c3IvaW5ldDYgLW8gLWYgL3Vzci9pbmNsdWRlL25ldGluZXQvaXA2Lmg7IHRoZW4KLQkJCQlpcHY2dHlwZT0kaQotCQkJCWlwdjZsaWI9aW5ldDYKLQkJCQlpcHY2bGliZGlyPS91c3IvaW5ldDYvbGliCi0JCQkJaXB2NnRyeWxpYmM9eWVzOwotCQkJCUNGTEFHUz0iLURJTkVUNiAtSS91c3IvaW5ldDYvaW5jbHVkZSAkQ0ZMQUdTIgotCQkJZmkKLQkJCTs7Ci0JCXRvc2hpYmEpCi0JCQlBQ19FR1JFUF9DUFAoeWVzLAotWyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBfVE9TSElCQV9JTkVUNgoteWVzCi0jZW5kaWZdLAotCQkJCVtpcHY2dHlwZT0kaTsKLQkJCQlpcHY2bGliPWluZXQ2OwotCQkJCWlwdjZsaWJkaXI9L3Vzci9sb2NhbC92Ni9saWI7Ci0JCQkJQ0ZMQUdTPSItRElORVQ2ICRDRkxBR1MiXSkKLQkJCTs7Ci0JCXY2ZCkKLQkJCUFDX0VHUkVQX0NQUCh5ZXMsCi1bI2luY2x1ZGUgPC91c3IvbG9jYWwvdjYvaW5jbHVkZS9zeXMvdjZjb25maWcuaD4KLSNpZmRlZiBfX1Y2RF9fCi15ZXMKLSNlbmRpZl0sCi0JCQkJW2lwdjZ0eXBlPSRpOwotCQkJCWlwdjZsaWI9djY7Ci0JCQkJaXB2NmxpYmRpcj0vdXNyL2xvY2FsL3Y2L2xpYjsKLQkJCQlDRkxBR1M9Ii1JL3Vzci9sb2NhbC92Ni9pbmNsdWRlICRDRkxBR1MiXSkKLQkJCTs7Ci0JCXpldGEpCi0JCQlBQ19FR1JFUF9DUFAoeWVzLAotWyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZmRlZiBfWkVUQV9NSU5BTUlfSU5FVDYKLXllcwotI2VuZGlmXSwKLQkJCQlbaXB2NnR5cGU9JGk7Ci0JCQkJaXB2NmxpYj1pbmV0NjsKLQkJCQlpcHY2bGliZGlyPS91c3IvbG9jYWwvdjYvbGliOwotCQkJCUNGTEFHUz0iLURJTkVUNiAkQ0ZMQUdTIl0pCi0JCQk7OwotCQllc2FjCi0JCWlmIHRlc3QgIiRpcHY2dHlwZSIgIT0gInVua25vd24iOyB0aGVuCi0JCQlicmVhawotCQlmaQotCWRvbmUKLQlBQ19NU0dfUkVTVUxUKCRpcHY2dHlwZSkKLWZpCi0KLWlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiIC1hICIkaXB2NmxpYiIgIT0gIm5vbmUiOyB0aGVuCi0JaWYgdGVzdCAtZCAkaXB2NmxpYmRpciAtYSAtZiAkaXB2NmxpYmRpci9saWIkaXB2NmxpYi5hOyB0aGVuCi0JCUxJQlM9Ii1MJGlwdjZsaWJkaXIgLWwkaXB2NmxpYiAkTElCUyIKLQkJZWNobyAiWW91IGhhdmUgJGlwdjZsaWIgbGlicmFyeSwgdXNpbmcgaXQiCi0JZWxzZQotCQlpZiB0ZXN0ICIkaXB2NnRyeWxpYmMiID0gInllcyI7IHRoZW4KLQkJCWVjaG8gIllvdSBkbyBub3QgaGF2ZSAkaXB2NmxpYiBsaWJyYXJ5LCB1c2luZyBsaWJjIgotCQllbHNlCi0JCQllY2hvICdGYXRhbDogbm8gJGlwdjZsaWIgbGlicmFyeSBmb3VuZC4gIGNhbm5vdCBjb250aW51ZS4nCi0JCQllY2hvICJZb3UgbmVlZCB0byBmZXRjaCBsaWIkaXB2NmxpYi5hIGZyb20gYXBwcm9wcmlhdGUiCi0JCQllY2hvICdpcHY2IGtpdCBhbmQgY29tcGlsZSBiZWZvcmVoYW5kLicKLQkJCWV4aXQgMQotCQlmaQotCWZpCi1maQotCi0KLWlmIHRlc3QgIiRpcHY2IiA9ICJ5ZXMiOyB0aGVuCi0JIwotCSMgWFhYIC0gb24gVHJ1NjQgVU5JWCA1LjEsIHRoZXJlIGlzIG5vICJnZXRhZGRyaW5mbygpIgotCSMgZnVuY3Rpb24gaW4gbGliYzsgdGhlcmUgYXJlICJuZ2V0YWRkcmluZm8oKSIgYW5kCi0JIyAib2dldGFkZHJpbmZvKCkiIGZ1bmN0aW9ucywgYW5kIDxuZXRkYi5oPiAjZGVmaW5lcwotCSMgImdldGFkZHJpbmZvIiB0byBiZSBlaXRoZXIgIm5nZXRhZGRyaW5mbyIgb3IKLQkjICJvZ2V0YWRkcmluZm8iLCBkZXBlbmRpbmcgb24gd2hldGhlciBfU09DS0FERFJfTEVOCi0JIyBvciBfWE9QRU5fU09VUkNFX0VYVEVOREVEIGFyZSBkZWZpbmVkIG9yIG5vdC4KLQkjCi0JIyBTbyB0aGlzIHRlc3QgZG9lc24ndCB3b3JrIG9uIFRydTY0IDUuMSwgYW5kIHBvc3NpYmx5Ci0JIyBvbiBvdGhlciA1LnggcmVsZWFzZXMuICBUaGlzIGNhdXNlcyB0aGUgY29uZmlndXJlCi0JIyBzY3JpcHQgdG8gYmVjb21lIGNvbmZ1c2VkLCBhbmQgcmVzdWx0cyBpbiBsaWJwY2FwCi0JIyBiZWluZyB1bmJ1aWxkYWJsZS4KLQkjCi0JQUNfU0VBUkNIX0xJQlMoZ2V0YWRkcmluZm8sIHNvY2tldCwgW2RubAotCUFDX01TR19DSEVDS0lORyhnZXRhZGRyaW5mbyBidWcpCi0JQUNfQ0FDSEVfVkFMKHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm8sIFtBQ19UUllfUlVOKFsKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLW1haW4oKQotewotICBpbnQgcGFzc2l2ZSwgZ2FpZXJyLCBpbmV0NCA9IDAsIGluZXQ2ID0gMDsKLSAgc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqYWksICphaXRvcDsKLSAgY2hhciBzdHJhZGRyW0lORVQ2X0FERFJTVFJMRU5dLCBzdHJwb3J0WzE2XTsKLQotICBmb3IgKHBhc3NpdmUgPSAwOyBwYXNzaXZlIDw9IDE7IHBhc3NpdmUrKykgewotICAgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwotICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsKLSAgICBoaW50cy5haV9mbGFncyA9IHBhc3NpdmUgPyBBSV9QQVNTSVZFIDogMDsKLSAgICBoaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwotICAgIGhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7Ci0gICAgaWYgKChnYWllcnIgPSBnZXRhZGRyaW5mbyhOVUxMLCAiNTQzMjEiLCAmaGludHMsICZhaXRvcCkpICE9IDApIHsKLSAgICAgICh2b2lkKWdhaV9zdHJlcnJvcihnYWllcnIpOwotICAgICAgZ290byBiYWQ7Ci0gICAgfQotICAgIGZvciAoYWkgPSBhaXRvcDsgYWk7IGFpID0gYWktPmFpX25leHQpIHsKLSAgICAgIGlmIChhaS0+YWlfYWRkciA9PSBOVUxMIHx8Ci0gICAgICAgICAgYWktPmFpX2FkZHJsZW4gPT0gMCB8fAotICAgICAgICAgIGdldG5hbWVpbmZvKGFpLT5haV9hZGRyLCBhaS0+YWlfYWRkcmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJhZGRyLCBzaXplb2Yoc3RyYWRkciksIHN0cnBvcnQsIHNpemVvZihzdHJwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICBOSV9OVU1FUklDSE9TVHxOSV9OVU1FUklDU0VSVikgIT0gMCkgewotICAgICAgICBnb3RvIGJhZDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoYWktPmFpX2ZhbWlseSkgewotICAgICAgY2FzZSBBRl9JTkVUOgotICAgICAgICBpZiAoc3RyY21wKHN0cnBvcnQsICI1NDMyMSIpICE9IDApIHsKLSAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFzc2l2ZSkgewotICAgICAgICAgIGlmIChzdHJjbXAoc3RyYWRkciwgIjAuMC4wLjAiKSAhPSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHN0cmNtcChzdHJhZGRyLCAiMTI3LjAuMC4xIikgIT0gMCkgewotICAgICAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGluZXQ0Kys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBRl9JTkVUNjoKLSAgICAgICAgaWYgKHN0cmNtcChzdHJwb3J0LCAiNTQzMjEiKSAhPSAwKSB7Ci0gICAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhc3NpdmUpIHsKLSAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICI6OiIpICE9IDApIHsKLSAgICAgICAgICAgIGdvdG8gYmFkOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoc3RyY21wKHN0cmFkZHIsICI6OjEiKSAhPSAwKSB7Ci0gICAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW5ldDYrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEFGX1VOU1BFQzoKLSAgICAgICAgZ290byBiYWQ7Ci0gICAgICAgIGJyZWFrOwotI2lmZGVmIEFGX1VOSVgKLSAgICAgIGNhc2UgQUZfVU5JWDoKLSNlbHNlCi0jaWZkZWYgQUZfTE9DQUwKLSAgICAgIGNhc2UgQUZfTE9DQUw6Ci0jZW5kaWYKLSNlbmRpZgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogYW5vdGhlciBmYW1pbHkgc3VwcG9ydD8gKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogc3VwcG9ydGVkIGZhbWlseSBzaG91bGQgYmUgMiwgdW5zdXBwb3J0ZWQgZmFtaWx5IHNob3VsZCBiZSAwICovCi0gIGlmICghKGluZXQ0ID09IDAgfHwgaW5ldDQgPT0gMikpCi0gICAgZ290byBiYWQ7Ci0gIGlmICghKGluZXQ2ID09IDAgfHwgaW5ldDYgPT0gMikpCi0gICAgZ290byBiYWQ7Ci0KLSAgaWYgKGFpdG9wKQotICAgIGZyZWVhZGRyaW5mbyhhaXRvcCk7Ci0gIGV4aXQoMCk7Ci0KLSBiYWQ6Ci0gIGlmIChhaXRvcCkKLSAgICBmcmVlYWRkcmluZm8oYWl0b3ApOwotICBleGl0KDEpOwotfQotXSwKLQl0ZF9jdl9idWdneWdldGFkZHJpbmZvPW5vLAotCXRkX2N2X2J1Z2d5Z2V0YWRkcmluZm89eWVzLAotCXRkX2N2X2J1Z2d5Z2V0YWRkcmluZm89eWVzKV0pCi0JaWYgdGVzdCAiJHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm8iID0gbm87IHRoZW4KLQkJQUNfTVNHX1JFU1VMVChnb29kKQotCWVsc2UKLQkJQUNfTVNHX1JFU1VMVChidWdneSkKLQlmaQotCi0JaWYgdGVzdCAiJHRkX2N2X2J1Z2d5Z2V0YWRkcmluZm8iID0gInllcyI7IHRoZW4KLQkJIwotCQkjIFhYWCAtIGl0IGRvZXNuJ3QgYXBwZWFyIHRoYXQgImlwdjZ0eXBlIiBjYW4gZXZlciBiZQotCQkjIHNldCB0byAibGludXgiLiAgU2hvdWxkIHRoaXMgYmUgdGVzdGluZyBmb3IKLQkJIyAibGludXgtZ2xpYmMiLCBvciBmb3IgdGhhdCAqb3IqICJsaW51eC1saWJpbmV0NiI/Ci0JCSMgSWYgdGhlIGxhdHRlciwgbm90ZSB0aGF0ICJsaW51eC1saWJpbmV0NiIgaXMgYWxzbwotCQkjIHRoZSB0eXBlIGdpdmVuIHRvIHNvbWUgbm9uLUxpbnV4IE9TZXMuCi0JCSMKLQkJaWYgdGVzdCAiJGlwdjZ0eXBlIiAhPSAibGludXgiOyB0aGVuCi0JCQllY2hvICdGYXRhbDogWW91IG11c3QgZ2V0IHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4nCi0JCQllY2hvICcgICAgICAgb3IgeW91IGNhbiBzcGVjaWZ5ICItLWRpc2FibGUtaXB2NiInLgotCQkJZXhpdCAxCi0JCWVsc2UKLQkJCWVjaG8gJ1dhcm5pbmc6IGdldGFkZHJpbmZvKCkgaW1wbGVtZW50YXRpb24gb24geW91ciBzeXN0ZW0gc2VlbXMgYmUgYnVnZ3kuJwotCQkJZWNobyAnICAgICAgICAgQmV0dGVyIHVwZ3JhZGUgeW91ciBzeXN0ZW0gbGlicmFyeSB0byBuZXdlc3QgdmVyc2lvbicKLQkJCWVjaG8gJyAgICAgICAgIG9mIEdOVSBDIGxpYnJhcnkgKGFrYSBnbGliYykuJwotCQlmaQotCWZpCi0JXSkKLQlBQ19SRVBMQUNFX0ZVTkNTKGdldGFkZHJpbmZvIGdldG5hbWVpbmZvKQotZmkKLQotQUNfQ0FDSEVfQ0hFQ0soW2ZvciBkbmV0X2h0b2EgZGVjbGFyYXRpb24gaW4gbmV0ZG5ldC9kbmV0ZGIuaF0sCi1bdGRfY3ZfZGVjbF9uZXRkbmV0X2RuZXRkYl9oX2RuZXRfaHRvYV0sCi1bQUNfRUdSRVBfSEVBREVSKGRuZXRfaHRvYSwgbmV0ZG5ldC9kbmV0ZGIuaCwKLQl0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hPXllcywKLQl0ZF9jdl9kZWNsX25ldGRuZXRfZG5ldGRiX2hfZG5ldF9odG9hPW5vKV0pCi1pZiB0ZXN0ICIkdGRfY3ZfZGVjbF9uZXRkbmV0X2RuZXRkYl9oX2RuZXRfaHRvYSIgPSB5ZXM7IHRoZW4KLQlBQ19ERUZJTkUoSEFWRV9ORVRETkVUX0RORVREQl9IX0RORVRfSFRPQSkKLWZpCi0KLWRubAotZG5sIGNoZWNrIHNpemVvZiBiYXNpYyB0eXBlcy4KLWRubCBUaGV5J3JlIHZlcnkgbGlrZWx5IHRvIGJlIHdyb25nIGZvciBjcm9zcy1jb21waWxpbmcuCi1BQ19DSEVDS19TSVpFT0YoY2hhciwgMSkKLUFDX0NIRUNLX1NJWkVPRihzaG9ydCwgMikKLUFDX0NIRUNLX1NJWkVPRihpbnQsIDQpCi1BQ19DSEVDS19TSVpFT0YobG9uZywgNCkKLUFDX0NIRUNLX1NJWkVPRihsb25nIGxvbmcsIDgpCi0KLWRubAotZG5sIENoZWNrcyBmb3IgdV9pbnRYWF90Ci1kbmwgQUNfQ0hFQ0tfQklUVFlQRVMoYWNfY3ZfYml0dHlwZXMpCi1kbmwgaWYgdGVzdCAiJGFjX2N2X2JpdHR5cGVzIiA9IG5vOyB0aGVuCi1kbmwgCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1kbmwgZmkKLQotZG5sCi1kbmwgQ2hlY2tzIGZvciBhZGRyaW5mbyBzdHJ1Y3R1cmUKLUFDX1NUUlVDVF9BRERSSU5GTyhhY19jdl9hZGRyaW5mbykKLWlmIHRlc3QgIiRhY19jdl9hZGRyaW5mbyIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi1kbmwKLWRubCBDaGVja3MgZm9yIE5JX01BWFNFUlYKLUFDX05JX01BWFNFUlYoYWNfY3ZfbWF4c2VydikKLWlmIHRlc3QgIiRhY19jdl9tYXhzZXJ2IiA9IG5vOyB0aGVuCi0JbWlzc2luZ19pbmNsdWRlcz15ZXMKLWZpCi0KLWRubAotZG5sIENoZWNrcyBmb3IgTklfTkFNRVJFUUQKLUFDX05JX05BTUVSRVFEKGFjX2N2X25hbWVyZXFkKQotaWYgdGVzdCAiJGFjX2N2X25hbWVyZXFkIiA9IG5vOyB0aGVuCi0JbWlzc2luZ19pbmNsdWRlcz15ZXMKLWZpCi0KLWRubAotZG5sIENoZWNrcyBmb3Igc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3R1cmUKLUFDX1NUUlVDVF9TQV9TVE9SQUdFKGFjX2N2X3NhX3N0b3JhZ2UpCi1pZiB0ZXN0ICIkYWNfY3Zfc2Ffc3RvcmFnZSIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi1kbmwKLWRubCBDaGVja3MgZm9yIElOWzZdQUREUlNaCi1BQ19DSEVDS19BRERSU1ooYWNfY3ZfYWRkcnN6KQotaWYgdGVzdCAiJGFjX2N2X2FkZHJzeiIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi1kbmwKLWRubCBDaGVja3MgZm9yIFJFU19VU0VfSU5FVDYKLUFDX0NIRUNLX1JFU19VU0VfSU5FVDYoYWNfY3ZfcmVzX2luZXQ2KQotaWYgdGVzdCAiJGFjX2N2X3Jlc19pbmV0NiIgPSBubzsgdGhlbgotCW1pc3NpbmdfaW5jbHVkZXM9eWVzCi1maQotCi1kbmwKLWRubCBDaGVja3MgZm9yIHJlc19zdGF0ZV9leHQgc3RydWN0dXJlCi1BQ19TVFJVQ1RfUkVTX1NUQVRFX0VYVChhY19jdl9yZXNfc3RhdGVfZXh0KQotaWYgdGVzdCAiJGFjX2N2X3Jlc19zdGF0ZV9leHQiID0gbm87IHRoZW4KLQltaXNzaW5nX2luY2x1ZGVzPXllcwotZmkKLQotZG5sCi1kbmwgQ2hlY2tzIGlmIHJlc19zdGF0ZSBzdHJ1Y3R1cmUgaGFzIG5zb3J0IG1lbWJlci4KLUFDX1NUUlVDVF9SRVNfU1RBVEUoYWNfY3ZfcmVzX3N0YXRlKQotCi0KLUFDX1JFUExBQ0VfRlVOQ1ModmZwcmludGYgc3RyY2FzZWNtcCBzdHJsY2F0IHN0cmxjcHkgc3RyZHVwIHN0cnNlcCkKLUFDX0NIRUNLX0ZVTkNTKHN0cmZ0aW1lKQotQUNfQ0hFQ0tfRlVOQ1Moc2V0bGluZWJ1ZiBhbGFybSkKLQotbmVlZHNucHJpbnRmPW5vCi1BQ19DSEVDS19GVU5DUyh2c25wcmludGYgc25wcmludGYsLAotCVtuZWVkc25wcmludGY9eWVzXSkKLWlmIHRlc3QgJG5lZWRzbnByaW50ZiA9IHllczsgdGhlbgotCUFDX0xJQk9CSihzbnByaW50ZikKLWZpCi0KLUFDX0xCTF9UWVBFX1NJR05BTAotCi1BQ19TRUFSQ0hfTElCUyhkbmV0X2h0b2EsIGRuZXQsIEFDX0RFRklORShIQVZFX0RORVRfSFRPQSkpCi0KLUFDX0NIRUNLX0xJQihycGMsIG1haW4pCQlkbmwgSXQncyB1bmNsZWFyIHdoeSB3ZSBtaWdodCBuZWVkIC1scnBjCi0KLWRubCBTb21lIHBsYXRmb3JtcyBtYXkgbmVlZCAtbG5zbCBmb3IgZ2V0cnBjYnludW1iZXIuCi1BQ19TRUFSQ0hfTElCUyhnZXRycGNieW51bWJlciwgbnNsLCBBQ19ERUZJTkUoSEFWRV9HRVRSUENCWU5VTUJFUikpCi0KLWRubCBBQ19DSEVDS19MSUIoeiwgdW5jb21wcmVzcykKLWRubCBBQ19DSEVDS19IRUFERVJTKHpsaWIuaCkKLQotQUNfTEJMX0xJQlBDQVAoVl9QQ0FQREVQLCBWX0lOQ0xTKQotCi0jCi0jIENoZWNrIGZvciB0aGVzZSBhZnRlciBBQ19MQkxfTElCUENBUCwgc28gd2UgbGluayB3aXRoIHRoZSBhcHByb3ByaWF0ZQotIyBsaWJyYXJpZXMgKGUuZy4sICItbHNvY2tldCAtbG5zbCIgb24gU29sYXJpcykuCi0jCi0jIFdlIGRvbid0IHVzZSBBQ19SRVBMQUNFX0ZVTkNTIGJlY2F1c2UgdGhhdCB1c2VzIEFDX0NIRUNLX0ZVTkNTIHdoaWNoCi0jIHVzZSBBQ19DSEVDS19GVU5DIHdoaWNoIGRvZXNuJ3QgbGV0IHVzIHNwZWNpZnkgdGhlIHJpZ2h0ICNpbmNsdWRlcwotIyB0byBtYWtlIHRoaXMgd29yayBvbiBCU0QvT1MgNC54LiAgQlNEL09TIDQueCBzaGlwcyB3aXRoIHRoZSBCSU5EOAotIyByZXNvbHZlciwgYW5kIHRoZSB3YXkgaXQgZGVmaW5lcyBpbmV0X3tudG9wLHB0b259IGlzIHJhdGhlciBzdHJhbmdlOwotIyBpdCBkb2VzIG5vdCBzaGlwIHdpdGggYSBsaWJjIHN5bWJvbCAiaW5ldF9udG9wKCkiLCBpdCBzaGlwcyB3aXRoCi0jICJfaW5ldF9udG9wKCkiLCBhbmQgaGFzIGEgI2RlZmluZSBtYWNybyBpbiBvbmUgb2YgdGhlIHN5c3RlbSBoZWFkZXJzCi0jIHRvIHJlbmFtZSBpdC4KLSMKLWRubCBBQ19UUllfQ09NUElMRShpbmV0X250b3AgaW5ldF9wdG9uIGluZXRfYXRvbikKLUFDX01TR19DSEVDS0lORyhmb3IgaW5ldF9udG9wKQotQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPl0sIFtjaGFyIHNyY1s0XSwgZHN0WzEyOF07Ci1pbmV0X250b3AoQUZfSU5FVCwgc3JjLCBkc3QsIHNpemVvZihkc3QpKTtdLAotCVtBQ19NU0dfUkVTVUxUKHllcyldLCBbQUNfTVNHX1JFU1VMVChubykKLQlBQ19MSUJPQkooaW5ldF9udG9wKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGluZXRfcHRvbikKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD5dLCBbY2hhciBzcmNbMTI4XSwgZHN0WzRdOwotaW5ldF9wdG9uKEFGX0lORVQsIHNyYywgZHN0KTtdLAotCVtBQ19NU0dfUkVTVUxUKHllcyldLCBbQUNfTVNHX1JFU1VMVChubykKLQlBQ19MSUJPQkooaW5ldF9wdG9uKV0pCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGluZXRfYXRvbikKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotI2luY2x1ZGUgPGFycGEvaW5ldC5oPl0sIFtjaGFyIHNyY1sxMjhdOwotc3RydWN0IGluX2FkZHIgZHN0OwotaW5ldF9hdG9uKHNyYywgJmRzdCk7XSwKLQlbQUNfTVNHX1JFU1VMVCh5ZXMpXSwgW0FDX01TR19SRVNVTFQobm8pCi0JQUNfTElCT0JKKGluZXRfYXRvbildKQotCi0jCi0jIENoZWNrIGZvciB0aGVzZSBhZnRlciBBQ19MQkxfTElCUENBUCwgZm9yIHRoZSBzYW1lIHJlYXNvbi4KLSMKLSMgWW91IGFyZSBpbiBhIHR3aXN0eSBsaXR0bGUgbWF6ZSBvZiBVTipYZXMsIGFsbCBkaWZmZXJlbnQuCi0jIFNvbWUgbWlnaHQgbm90IGhhdmUgZXRoZXJfbnRvaG9zdCgpLgotIyBTb21lIG1pZ2h0IGhhdmUgaXQsIGJ1dCBub3QgZGVjbGFyZSBpdCBpbiBhbnkgaGVhZGVyIGZpbGUuCi0jIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IGRlY2xhcmUgaXQgaW4gPG5ldGluZXQvaWZfZXRoZXIuaD4uCi0jIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IGRlY2xhcmUgaXQgaW4gPG5ldGluZXQvZXRoZXIuaD4KLSMgKEFuZCBzb21lIG1pZ2h0IGhhdmUgaXQgYnV0IGRvY3VtZW50IGl0IGFzIHNvbWV0aGluZyBkZWNsYXJlZCBpbgotIyA8bmV0aW5ldC9ldGhlcm5ldC5oPiwgYWx0aG91Z2ggPG5ldGluZXQvaWZfZXRoZXIuaD4gYXBwZWFycyB0byB3b3JrLikKLSMKLSMgQmVmb3JlIHlvdSBpcyBhIEMgY29tcGlsZXIuCi0jCi1BQ19DSEVDS19GVU5DUyhldGhlcl9udG9ob3N0LCBbCi0gICAgQUNfQ0FDSEVfQ0hFQ0soZm9yIGJ1Z2d5IGV0aGVyX250b2hvc3QsIGFjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3QsIFsKLQlBQ19UUllfUlVOKFsKLQkJI2luY2x1ZGUgPG5ldGRiLmg+Ci0JCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQkJI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCQkjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0JCWludAotCQltYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLQkJewotCQkJdV9jaGFyIGVhWzZdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07Ci0JCQljaGFyIG5hbWVbTUFYSE9TVE5BTUVMRU5dOwotCi0JCQlldGhlcl9udG9ob3N0KG5hbWUsIChzdHJ1Y3QgZXRoZXJfYWRkciAqKWVhKTsKLQkJCWV4aXQoMCk7Ci0JCX0KLQldLCBbYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdD1ub10sCi0JICAgW2FjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3Q9eWVzXSwKLQkgICBbYWNfY3ZfYnVnZ3lfZXRoZXJfbnRvaG9zdD0ibm90IHdoaWxlIGNyb3NzLWNvbXBpbGluZyJdKV0pCi0gICAgaWYgdGVzdCAiJGFjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3QiID0gIm5vIjsgdGhlbgotCUFDX0RFRklORShVU0VfRVRIRVJfTlRPSE9TVCkKLSAgICBmaQotXSkKLWlmIHRlc3QgIiRhY19jdl9mdW5jX2V0aGVyX250b2hvc3QiID0geWVzIC1hIFwKLSAgICAiJGFjX2N2X2J1Z2d5X2V0aGVyX250b2hvc3QiID0gIm5vIjsgdGhlbgotCSMKLQkjIE9LLCB3ZSBoYXZlIGV0aGVyX250b2hvc3QoKS4gIERvIHdlIGhhdmUgPG5ldGluZXQvaWZfZXRoZXIuaD4/Ci0JIwotCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiA9IHllczsgdGhlbgotCQkjCi0JCSMgWWVzLiAgRG9lcyBpdCBkZWNsYXJlIGV0aGVyX250b2hvc3QoKT8KLQkJIwotCQlBQ19DSEVDS19ERUNMKGV0aGVyX250b2hvc3QsCi0JCSAgICBbCi0JCQlBQ19ERUZJTkUoTkVUSU5FVF9JRl9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QsLAotCQkJICAgIFtEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2lmX2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX250b2hvc3QnXSkKLQkJICAgIF0sLAotCQkgICAgWwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci1zdHJ1Y3QgbWJ1ZjsKLXN0cnVjdCBydGVudHJ5OwotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KLQkJICAgIF0pCi0JZmkKLQkjCi0JIyBEaWQgdGhhdCBzdWNjZWVkPwotCSMKLQlpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3QiICE9IHllczsgdGhlbgotCQkjCi0JCSMgTm8sIGhvdyBhYm91dCA8bmV0aW5ldC9ldGhlci5oPiwgYXMgb24gTGludXg/Ci0JCSMKLQkJQUNfQ0hFQ0tfSEVBREVSUyhuZXRpbmV0L2V0aGVyLmgpCi0JCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9ldGhlcl9oIiA9IHllczsgdGhlbgotCQkJIwotCQkJIyBXZSBoYXZlIGl0IC0gZG9lcyBpdCBkZWNsYXJlIGV0aGVyX250b2hvc3QoKT8KLQkJCSMgVW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3Qgc28gd2UgZG9uJ3QKLQkJCSMgdHJlYXQgdGhlIHByZXZpb3VzIGZhaWx1cmUgYXMgYSBjYWNoZWQgdmFsdWUgYW5kCi0JCQkjIHN1cHByZXNzIHRoZSBuZXh0IHRlc3QuCi0JCQkjCi0JCQl1bnNldCBhY19jdl9oYXZlX2RlY2xfZXRoZXJfbnRvaG9zdAotCQkJQUNfQ0hFQ0tfREVDTChldGhlcl9udG9ob3N0LAotCQkJICAgIFsKLQkJCQlBQ19ERUZJTkUoTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX05UT0hPU1QsLAotCQkJCSAgICBbRGVmaW5lIHRvIDEgaWYgbmV0aW5ldC9ldGhlci5oIGRlY2xhcmVzIGBldGhlcl9udG9ob3N0J10pCi0JCQkgICAgXSwsCi0JCQkgICAgWwotI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KLQkJCSAgICBdKQotCQlmaQotCWZpCi0JIwotCSMgSXMgZXRoZXJfbnRvaG9zdCgpIGRlY2xhcmVkPwotCSMKLQlpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX250b2hvc3QiICE9IHllczsgdGhlbgotCQkjCi0JCSMgTm8sIHdlJ2xsIGhhdmUgdG8gZGVjbGFyZSBpdCBvdXJzZWx2ZXMuCi0JCSMgRG8gd2UgaGF2ZSAic3RydWN0IGV0aGVyX2FkZHIiPwotCQkjCi0JCUFDX0NIRUNLX1RZUEVTKHN0cnVjdCBldGhlcl9hZGRyLCwsCi0JCSAgICBbCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLXN0cnVjdCBtYnVmOwotc3RydWN0IHJ0ZW50cnk7Ci0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgotCQkgICAgXSkKLQkJQUNfREVGSU5FKEhBVkVfREVDTF9FVEhFUl9OVE9IT1NULCAwLAotCQkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfbnRvaG9zdCcsIGFuZCB0byAwIGlmIHlvdQotZG9uJ3QuXSkKLQllbHNlCi0JCUFDX0RFRklORShIQVZFX0RFQ0xfRVRIRVJfTlRPSE9TVCwgMSwKLQkJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGV0aGVyX250b2hvc3QnLCBhbmQgdG8gMCBpZiB5b3UKLWRvbid0Ll0pCi0JZmkKLWZpCi0KLWRubCBwb3J0YWJpbGl0eSBtYWNyb3MgZm9yIGdldGFkZHJpbmZvL2dldG5hbWVpbmZvCi1kbmwKLWRubCBDaGVjayBmb3Igc2FfbGVuCi1BQ19DSEVDS19TQV9MRU4oYWNfY3Zfc29ja2FkZHJfaGFzX3NhX2xlbikKLWlmIHRlc3QgIiRhY19jdl9zb2NrYWRkcl9oYXNfc2FfbGVuIiA9IG5vOyB0aGVuCi0JbWlzc2luZ19pbmNsdWRlcz15ZXMKLWZpCi0KLUFDX0NIRUNLX0ZVTkNTKHBjYXBfZmluZGFsbGRldnMgcGNhcF9kdW1wX2ZsdXNoIHBjYXBfbGliX3ZlcnNpb24pCi1pZiB0ZXN0ICRhY19jdl9mdW5jX3BjYXBfZmluZGFsbGRldnMgPSAieWVzIiA7IHRoZW4KLWRubCBDaGVjayBmb3IgTWFjIE9TIFgsIHdoaWNoIG1heSBzaGlwIHBjYXAuaCBmcm9tIDAuNiBidXQgbGlicGNhcCBtYXkKLWRubCBiZSAwLjg7IHRoaXMgbWVhbnMgdGhhdCBsaWIgaGFzIHBjYXBfZmluZGFsbGRldnMgYnV0IGhlYWRlciBkb2Vzbid0Ci1kbmwgaGF2ZSBwY2FwX2lmX3QuCi0gICAgc2F2ZWRjZmxhZ3M9IiRDRkxBR1MiCi0gICAgQ0ZMQUdTPSIkQ0ZMQUdTICRWX0lOQ0xTIgotICAgIEFDX0NIRUNLX1RZUEVTKHBjYXBfaWZfdCwgLCAsIFsjaW5jbHVkZSA8cGNhcC5oPl0pCi0gICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX3BjYXBfbGliX3ZlcnNpb24gPSAibm8iIDsgdGhlbgotICAgIEFDX01TR19DSEVDS0lORyh3aGV0aGVyIHBjYXBfdmVyc2lvbiBpcyBkZWZpbmVkIGJ5IGxpYnBjYXApCi0gICAgQUNfVFJZX0xJTksoW10sCi0gICAgICAgWwotCWV4dGVybiBjaGFyIHBjYXBfdmVyc2lvbltdOwotCi0JcmV0dXJuIChpbnQpcGNhcF92ZXJzaW9uOwotICAgICAgIF0sCi0gICAgICAgYWNfbGJsX2N2X3BjYXBfdmVyc2lvbl9kZWZpbmVkPXllcywKLSAgICAgICBhY19sYmxfY3ZfcGNhcF92ZXJzaW9uX2RlZmluZWQ9bm8pCi0gICAgaWYgdGVzdCAiJGFjX2xibF9jdl9wY2FwX3ZlcnNpb25fZGVmaW5lZCIgPSB5ZXMgOyB0aGVuCi0gICAgCUFDX01TR19SRVNVTFQoeWVzKQotCUFDX0RFRklORShIQVZFX1BDQVBfVkVSU0lPTikKLSAgICBlbHNlCi0JQUNfTVNHX1JFU1VMVChubykKLSAgICBmaQotZmkKLUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHBjYXBfZGVidWcgaXMgZGVmaW5lZCBieSBsaWJwY2FwKQotQUNfVFJZX0xJTksoW10sCi0gICBbCi0JZXh0ZXJuIGludCBwY2FwX2RlYnVnOwotCi0JcmV0dXJuIHBjYXBfZGVidWc7Ci0gICBdLAotICAgYWNfbGJsX2N2X3BjYXBfZGVidWdfZGVmaW5lZD15ZXMsCi0gICBhY19sYmxfY3ZfcGNhcF9kZWJ1Z19kZWZpbmVkPW5vKQotaWYgdGVzdCAiJGFjX2xibF9jdl9wY2FwX2RlYnVnX2RlZmluZWQiID0geWVzIDsgdGhlbgotCUFDX01TR19SRVNVTFQoeWVzKQotCUFDX0RFRklORShIQVZFX1BDQVBfREVCVUcpCi1lbHNlCi0JQUNfTVNHX1JFU1VMVChubykKLQkjCi0JIyBPSywgd2hhdCBhYm91dCAieXlkZWJ1ZyI/Ci0JIwotCUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHl5ZGVidWcgaXMgZGVmaW5lZCBieSBsaWJwY2FwKQotCUFDX1RSWV9MSU5LKFtdLAotCSAgIFsKLQkJZXh0ZXJuIGludCB5eWRlYnVnOwotCi0JCXJldHVybiB5eWRlYnVnOwotCSAgIF0sCi0JICAgYWNfbGJsX2N2X3l5ZGVidWdfZGVmaW5lZD15ZXMsCi0JICAgYWNfbGJsX2N2X3l5ZGVidWdfZGVmaW5lZD1ubykKLQlpZiB0ZXN0ICIkYWNfbGJsX2N2X3l5ZGVidWdfZGVmaW5lZCIgPSB5ZXMgOyB0aGVuCi0JCUFDX01TR19SRVNVTFQoeWVzKQotCQlBQ19ERUZJTkUoSEFWRV9ZWURFQlVHKQotCWVsc2UKLQkJQUNfTVNHX1JFU1VMVChubykKLQlmaQotZmkKLUFDX1JFUExBQ0VfRlVOQ1MoYnBmX2R1bXApCWRubCBtb3ZlZCB0byBsaWJwY2FwIGluIDAuNgotCi1WX0dST1VQPTAKLWlmIHRlc3QgLWYgL2V0Yy9ncm91cCAtYSAhIC16ICJgZ3JlcCAnXndoZWVsOicgL2V0Yy9ncm91cGAiIDsgdGhlbgotCVZfR1JPVVA9d2hlZWwKLWZpCi1jYXNlICIkaG9zdF9vcyIgaW4KLQotYWl4KikKLQlkbmwgV29ya2Fyb3VuZCB0byBlbmFibGUgY2VydGFpbiBmZWF0dXJlcwotCUFDX0RFRklORShfU1VOKQotCTs7Ci0KLWlyaXgqKQotCVZfR1JPVVA9c3lzCi0JOzsKLQotb3NmKikKLQlWX0dST1VQPXN5c3RlbQotCTs7Ci0KLXNvbGFyaXMqKQotCVZfR1JPVVA9c3lzCi0JOzsKLWVzYWMKLQotaWYgdGVzdCAtZiAvZGV2L2JwZjAgOyB0aGVuCi0JVl9HUk9VUD1icGYKLWZpCi0KLUFDX0NIRUNLX0hFQURFUlMoc3lzL2JpdHlwZXMuaCkKLQotQUNfQ0hFQ0tfVFlQRShbaW50OF90XSwgLAotCVtBQ19ERUZJTkUoW2ludDhfdF0sIFtzaWduZWQgY2hhcl0sCi0JW0RlZmluZSB0byBgc2lnbmVkIGNoYXInIGlmIGludDhfdCBub3QgZGVmaW5lZC5dKV0pCi1BQ19DSEVDS19UWVBFKFt1X2ludDhfdF0sICwKLQlbQUNfREVGSU5FKFt1X2ludDhfdF0sIFt1bnNpZ25lZCBjaGFyXSwKLQlbRGVmaW5lIHRvIGB1bnNpZ25lZCBjaGFyJyBpZiB1X2ludDhfdCBub3QgZGVmaW5lZC5dKV0sCi0JW0FDX0lOQ0xVREVTX0RFRkFVTFQKLSNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotI2VuZGlmXSkKLUFDX0NIRUNLX1RZUEUoW2ludDE2X3RdLCAsCi0JW0FDX0RFRklORShbaW50MTZfdF0sIFtzaG9ydF0sCi0JW0RlZmluZSB0byBgc2hvcnQnIGlmIGludDE2X3Qgbm90IGRlZmluZWQuXSldKQotQUNfQ0hFQ0tfVFlQRShbdV9pbnQxNl90XSwgLAotCVtBQ19ERUZJTkUoW3VfaW50MTZfdF0sIFt1bnNpZ25lZCBzaG9ydF0sCi0JW0RlZmluZSB0byBgdW5zaWduZWQgc2hvcnQnIGlmIHVfaW50MTZfdCBub3QgZGVmaW5lZC5dKV0sCi0JW0FDX0lOQ0xVREVTX0RFRkFVTFQKLSNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLSNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgotI2VuZGlmXSkKLUFDX0NIRUNLX1RZUEUoW2ludDMyX3RdLCAsCi0JW0FDX0RFRklORShbaW50MzJfdF0sIFtpbnRdLAotCVtEZWZpbmUgdG8gYGludCcgaWYgaW50MzJfdCBub3QgZGVmaW5lZC5dKV0pCi1BQ19DSEVDS19UWVBFKFt1X2ludDMyX3RdLCAsCi0JW0FDX0RFRklORShbdV9pbnQzMl90XSwgW3Vuc2lnbmVkIGludF0sCi0JW0RlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiB1X2ludDMyX3Qgbm90IGRlZmluZWQuXSldLAotCVtBQ19JTkNMVURFU19ERUZBVUxUCi0jaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0jaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLSNlbmRpZl0pCi1BQ19DSEVDS19UWVBFKFtpbnQ2NF90XSwgLAotCVtBQ19ERUZJTkUoW2ludDY0X3RdLCBbbG9uZyBsb25nXSwKLQlbRGVmaW5lIHRvIGBsb25nIGxvbmcnIGlmIGludDY0X3Qgbm90IGRlZmluZWQuXSldKQotQUNfQ0hFQ0tfVFlQRShbdV9pbnQ2NF90XSwgLAotCVtBQ19ERUZJTkUoW3VfaW50NjRfdF0sIFt1bnNpZ25lZCBsb25nIGxvbmddLAotCVtEZWZpbmUgdG8gYHVuc2lnbmVkIGxvbmcgbG9uZycgaWYgdV9pbnQ2NF90IG5vdCBkZWZpbmVkLl0pXSwKLQlbQUNfSU5DTFVERVNfREVGQVVMVAotI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAotI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0jZW5kaWZdKQotCi0jCi0jIFdlIGNhbid0IGp1c3QgY2hlY2sgZm9yIDxpbnR0eXBlcy5oPiAtIHNvbWUgc3lzdGVtcyBoYXZlIG9uZSB0aGF0Ci0jIGRvZXNuJ3QgZGVmaW5lIGFsbCB0aGUgUFJJW2RveHVdNjQgbWFjcm9zLgotIwotQUNfQ0hFQ0tfSEVBREVSUyhpbnR0eXBlcy5oLAotICBbCi0gICAgIwotICAgICMgT0ssIHdlIGhhdmUgaW50dHlwZXMuaCwgYnV0IGRvZXMgaXQgZGVmaW5lIHRob3NlIG1hY3Jvcz8KLSAgICAjCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtbd2hldGhlciBpbnR0eXBlcy5oIGRlZmluZXMgdGhlIFBSSVtkb3h1XTY0IG1hY3Jvc11dKQotICAgIEFDX0NPTVBJTEVfSUZFTFNFKAotICAgICAgWwotCUFDX0xBTkdfU09VUkNFKAotCSAgW1sKLQkgICAgI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0JICAgICNpbmNsdWRlIDxzdGRpby5oPgotCSAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0JICAgICNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKLQkgICAgI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+Ci0JICAgICNlbmRpZgotCi0JICAgIG1haW4oKQotCSAgICB7Ci0JICAgICAgcHJpbnRmKCIlIiBQUklkNjQgIlxuIiwgKHVfaW50NjRfdCkxKTsKLQkgICAgICBwcmludGYoIiUiIFBSSW82NCAiXG4iLCAodV9pbnQ2NF90KTEpOwotCSAgICAgIHByaW50ZigiJSIgUFJJeDY0ICJcbiIsICh1X2ludDY0X3QpMSk7Ci0JICAgICAgcHJpbnRmKCIlIiBQUkl1NjQgIlxuIiwgKHVfaW50NjRfdCkxKTsKLQkgICAgfQotCSAgXV0pCi0gICAgICBdLAotICAgICAgWwotCUFDX01TR19SRVNVTFQoeWVzKQotCWFjX2xibF9pbnR0eXBlc19oX2RlZmluZXNfZm9ybWF0cz15ZXMKLSAgICAgIF0sCi0gICAgICBbCi0JQUNfTVNHX1JFU1VMVChubykKLQlhY19sYmxfaW50dHlwZXNfaF9kZWZpbmVzX2Zvcm1hdHM9bm8KLSAgICAgIF0pCi0gIF0sCi0gIFsKLSAgICAjCi0gICAgIyBXZSBkb24ndCBoYXZlIGludHR5cGVzLmgsIHNvIGl0IG9idmlvdXNseSBjYW4ndCBkZWZpbmUgdGhvc2UKLSAgICAjIG1hY3Jvcy4KLSAgICAjCi0gICAgYWNfbGJsX2ludHR5cGVzX2hfZGVmaW5lc19mb3JtYXRzPW5vCi0gIF0pCi1pZiB0ZXN0ICIkYWNfbGJsX2ludHR5cGVzX2hfZGVmaW5lc19mb3JtYXRzIiA9IG5vOyB0aGVuCi0gIEFDX0xCTF9DSEVDS182NEJJVF9GT1JNQVQobCwKLSAgICBbCi0gICAgICBBQ19MQkxfQ0hFQ0tfNjRCSVRfRk9STUFUKGxsLAotICAgICAgICBbCi0gICAgICAgICAgQUNfTEJMX0NIRUNLXzY0QklUX0ZPUk1BVChMLAotCSAgICBbCi0JICAgICAgQUNfTEJMX0NIRUNLXzY0QklUX0ZPUk1BVChxLAotCSAgICAgICAgWwotCSAgICAgICAgICBBQ19NU0dfRVJST1IoW25laXRoZXIgJWxseCBub3IgJUx4IG5vciAlcXggd29ya2VkIG9uIGEgNjQtYml0IGludGVnZXJdKQotCSAgICAgICAgXSkKLQkgICAgXSkKLQldKQotICAgIF0pCi1maQotCi1BQ19MQkxfREVWRUwoVl9DQ09QVCkKLQotQUNfTEJMX1NPQ0tBRERSX1NBX0xFTgotCi1BQ19MQkxfVU5BTElHTkVEX0FDQ0VTUwotCi1BQ19WQVJfSF9FUlJOTwotCi1BQ19BUkdfV0lUSChjcnlwdG8sIFsgIC0td2l0aG91dC1jcnlwdG8gICAgICAgIGRpc2FibGUgY3J5cHRvIHN1cHBvcnRdLAotCVtdLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFNTTGVheSkKLWFjX2N2X3NzbGVheV9wYXRoPW5vCi1pbmNkaXI9bm8KLQotIwotIyBJZiBYcHJlZml4IGlzIHNldCBpbiB0aGUgZW52aXJvbm1lbnQsIHVzZSB0aGF0IHZhbHVlLgotIyBYWFggLSB0aGlzIHNob3VsZCBhcmd1YWJseSBiZSBkb25lIGJ5IGhhdmluZyAtLXdpdGgtY3J5cHRvIHRha2UgYW4KLSMgb3B0aW9uYWwgYXJndW1lbnQsIGFuZCBoYXZlIHRoYXQgYXJndW1lbnQgYmUgdXNlZCB0byBzZXQgWHByZWZpeAotIyBpZiBwcmVzZW50LgotIwotaWYgdGVzdCAteiAiJFhwcmVmaXgiOyB0aGVuCi0JWHByZWZpeD1gZXZhbCBlY2hvICRwcmVmaXhgCi1maQotCi1mb3IgZGlyIGluICRYcHJlZml4IC91c3IvJHtob3N0X2FsaWFzfSAvdXNyIC91c3IvbG9jYWwgL3Vzci9sb2NhbC9zc2wgL3Vzci9wa2c7IGRvCi0JIwotCSMgWFhYIC0gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGNoZWNrIGlmIGEgZ2l2ZW4gbGlicmFyeSBpcwotCSMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgdGhhbiBjaGVja2luZyBlYWNoIG9mIHRoZSBwb3NzaWJsZQotCSMgc2hhcmVkIGxpYnJhcnkgc3VmZml4ZXM/Ci0JIwotCSMgQXJlIHRoZXJlIGFueSBvdGhlciBzdWZmaXhlcyB3ZSBuZWVkIHRvIGxvb2sgZm9yPyAgRG8gd2UgaGF2ZSB0bwotCSMgd29ycnkgYWJvdXQgIi5zby57dmVyc2lvbn0iPwotCSMKLQkjIE9yIHNob3VsZCB3ZSBqdXN0IGxvb2sgZm9yICJsaWJjcnlwdG8uKiI/Ci0JIwotCWlmIHRlc3QgLWQgJGRpci9saWIgLWEgXCggLWYgJGRpci9saWIvbGliY3J5cHRvLmEgLW8gXAotCQkJICAgICAgICAgIC1mICRkaXIvbGliL2xpYmNyeXB0by5zbyAtbyBcCi0JCQkgICAgICAgICAgLWYgJGRpci9saWIvbGliY3J5cHRvLnNsIC1vIFwKLQkJCQkgIC1mICRkaXIvbGliL2xpYmNyeXB0by5keWxpYiBcKTsgdGhlbgotCQlhY19jdl9zc2xlYXlfcGF0aD0kZGlyCi0JZmkKLQlpZiB0ZXN0IC1kICRkaXIvaW5jbHVkZS9vcGVuc3NsIC1hIC1mICRkaXIvaW5jbHVkZS9vcGVuc3NsL2Rlcy5oOyB0aGVuCi0JCWluY2Rpcj0iLUkkZGlyL2luY2x1ZGUiCi0JZmkKLQlpZiB0ZXN0ICIkYWNfY3Zfc3NsZWF5X3BhdGgiICE9ICJubyIgLWEgIiRpbmNkaXIiICE9ICJubyI7IHRoZW4KLQkJYnJlYWs7Ci0JZWxzZQotCQlhY19jdl9zc2xlYXlfcGF0aD1ubwotCQlpbmNkaXI9bm8KLQlmaQotZG9uZQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3NsZWF5X3BhdGgpCi1pZiB0ZXN0ICIkYWNfY3Zfc3NsZWF5X3BhdGgiICE9IG5vOyB0aGVuCi0JVl9JTkNMUz0iJFZfSU5DTFMgJGluY2RpciIKLQlMREZMQUdTPSItTCRkaXIvbGliICRMREZMQUdTIgotCWlmIHRlc3QgLWYgJGFjX2N2X3NzbGVheV9wYXRoL2xpYi9saWJSU0FnbHVlLmE7IHRoZW4KLQkJTElCUz0iJExJQlMgLWxSU0FnbHVlIgotCWZpCi0JaWYgdGVzdCAtZiAkYWNfY3Zfc3NsZWF5X3BhdGgvbGliL2xpYnJzYXJlZi5hOyB0aGVuCi0JCUxJQlM9IiRMSUJTIC1scnNhcmVmIgotCWZpCi0JQUNfQ0hFQ0tfTElCKGNyeXB0bywgREVTX2NiY19lbmNyeXB0KQotCi0JQ1BQRkxBR1M9IiRDUFBGTEFHUyAkVl9JTkNMUyIKLQlBQ19DSEVDS19IRUFERVJTKG9wZW5zc2wvZXZwLmgpCi1maQotXSkKLQotZG5sCi1kbmwgc2V0IGFkZGl0aW9uYWwgaW5jbHVkZSBwYXRoIGlmIG5lY2Vzc2FyeQotaWYgdGVzdCAiJG1pc3NpbmdfaW5jbHVkZXMiID0gInllcyI7IHRoZW4KLQlDUFBGTEFHUz0iJENQUEZMQUdTIC1JXCQoc3JjZGlyKS9taXNzaW5nIgotCVZfSU5DTFM9IiRWX0lOQ0xTIC1JXCQoc3JjZGlyKS9taXNzaW5nIgotZmkKLQotQUNfU1VCU1QoVl9DQ09QVCkKLUFDX1NVQlNUKFZfREVGUykKLUFDX1NVQlNUKFZfR1JPVVApCi1BQ19TVUJTVChWX0lOQ0xTKQotQUNfU1VCU1QoVl9QQ0FQREVQKQotQUNfU1VCU1QoTE9DQUxTUkMpCi0KLUFDX1BST0dfSU5TVEFMTAotCi1BQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oKQotCi1BQ19PVVRQVVRfQ09NTUFORFMoW2lmIHRlc3QgLWYgLmRldmVsOyB0aGVuCi0JZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0JY2F0IE1ha2VmaWxlLWRldmVsLWFkZHMgPj4gTWFrZWZpbGUKLQltYWtlIGRlcGVuZAotZmldKQotQUNfT1VUUFVUKE1ha2VmaWxlKQotZXhpdCAwCmRpZmYgLS1naXQgYS9jcGFjay5jIGIvY3BhY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjMGE5ZS4uMDAwMDAwMAotLS0gYS9jcGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IERhdmlkIFlvdW5nLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIFRoZSBuYW1lIG9mIERhdmlkIFlvdW5nIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIERBVklEIFlPVU5HIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQotICogUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgREFWSUQKLSAqIFlPVU5HIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZCi0gKiBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSAiY3BhY2suaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLXN0YXRpYyB1X2ludDhfdCAqCi1jcGFja19uZXh0X2JvdW5kYXJ5KHVfaW50OF90ICpidWYsIHVfaW50OF90ICpwLCBzaXplX3QgYWxpZ25tZW50KQotewotCXNpemVfdCBtaXNhbGlnbm1lbnQgPSAoc2l6ZV90KShwIC0gYnVmKSAlIGFsaWdubWVudDsKLQotCWlmIChtaXNhbGlnbm1lbnQgPT0gMCkKLQkJcmV0dXJuIHA7Ci0KLQlyZXR1cm4gcCArIChhbGlnbm1lbnQgLSBtaXNhbGlnbm1lbnQpOwotfQotCi0vKiBBZHZhbmNlIHRvIHRoZSBuZXh0IHdvcmRzaXplIGJvdW5kYXJ5LiBSZXR1cm4gTlVMTCBpZiBmZXdlciB0aGFuCi0gKiB3b3Jkc2l6ZSBieXRlcyByZW1haW4gaW4gdGhlIGJ1ZmZlciBhZnRlciB0aGUgYm91bmRhcnkuICBPdGhlcndpc2UsCi0gKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBib3VuZGFyeS4KLSAqLwotc3RhdGljIHVfaW50OF90ICoKLWNwYWNrX2FsaWduX2FuZF9yZXNlcnZlKHN0cnVjdCBjcGFja19zdGF0ZSAqY3MsIHNpemVfdCB3b3Jkc2l6ZSkKLXsKLQl1X2ludDhfdCAqbmV4dDsKLQotCS8qIEVuc3VyZSBhbGlnbm1lbnQuICovCi0JbmV4dCA9IGNwYWNrX25leHRfYm91bmRhcnkoY3MtPmNfYnVmLCBjcy0+Y19uZXh0LCB3b3Jkc2l6ZSk7Ci0KLQkvKiBUb28gbGl0dGxlIHNwYWNlIGZvciB3b3Jkc2l6ZSBieXRlcz8gKi8KLQlpZiAobmV4dCAtIGNzLT5jX2J1ZiArIHdvcmRzaXplID4gY3MtPmNfbGVuKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBuZXh0OwotfQotCi1pbnQKLWNwYWNrX2luaXQoc3RydWN0IGNwYWNrX3N0YXRlICpjcywgdV9pbnQ4X3QgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKLXsKLQltZW1zZXQoY3MsIDAsIHNpemVvZigqY3MpKTsKLQotCWNzLT5jX2J1ZiA9IGJ1ZjsKLQljcy0+Y19sZW4gPSBidWZsZW47Ci0JY3MtPmNfbmV4dCA9IGNzLT5jX2J1ZjsKLQotCXJldHVybiAwOwotfQotCi0vKiBVbnBhY2sgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KLWludAotY3BhY2tfdWludDY0KHN0cnVjdCBjcGFja19zdGF0ZSAqY3MsIHVfaW50NjRfdCAqdSkKLXsKLQl1X2ludDhfdCAqbmV4dDsKLQotCWlmICgobmV4dCA9IGNwYWNrX2FsaWduX2FuZF9yZXNlcnZlKGNzLCBzaXplb2YoKnUpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JKnUgPSBFWFRSQUNUX0xFXzY0QklUUyhuZXh0KTsKLQotCS8qIE1vdmUgcG9pbnRlciBwYXN0IHRoZSB1X2ludDY0X3QuICovCi0JY3MtPmNfbmV4dCA9IG5leHQgKyBzaXplb2YoKnUpOwotCXJldHVybiAwOwotfQotCi0vKiBVbnBhY2sgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KLWludAotY3BhY2tfdWludDMyKHN0cnVjdCBjcGFja19zdGF0ZSAqY3MsIHVfaW50MzJfdCAqdSkKLXsKLQl1X2ludDhfdCAqbmV4dDsKLQotCWlmICgobmV4dCA9IGNwYWNrX2FsaWduX2FuZF9yZXNlcnZlKGNzLCBzaXplb2YoKnUpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JKnUgPSBFWFRSQUNUX0xFXzMyQklUUyhuZXh0KTsKLQotCS8qIE1vdmUgcG9pbnRlciBwYXN0IHRoZSB1X2ludDMyX3QuICovCi0JY3MtPmNfbmV4dCA9IG5leHQgKyBzaXplb2YoKnUpOwotCXJldHVybiAwOwotfQotCi0vKiBVbnBhY2sgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KLWludAotY3BhY2tfdWludDE2KHN0cnVjdCBjcGFja19zdGF0ZSAqY3MsIHVfaW50MTZfdCAqdSkKLXsKLQl1X2ludDhfdCAqbmV4dDsKLQotCWlmICgobmV4dCA9IGNwYWNrX2FsaWduX2FuZF9yZXNlcnZlKGNzLCBzaXplb2YoKnUpKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCi0JKnUgPSBFWFRSQUNUX0xFXzE2QklUUyhuZXh0KTsKLQotCS8qIE1vdmUgcG9pbnRlciBwYXN0IHRoZSB1X2ludDE2X3QuICovCi0JY3MtPmNfbmV4dCA9IG5leHQgKyBzaXplb2YoKnUpOwotCXJldHVybiAwOwotfQotCi0vKiBVbnBhY2sgYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlci4gKi8KLWludAotY3BhY2tfdWludDgoc3RydWN0IGNwYWNrX3N0YXRlICpjcywgdV9pbnQ4X3QgKnUpCi17Ci0JLyogTm8gc3BhY2UgbGVmdD8gKi8KLQlpZiAoKHNpemVfdCkoY3MtPmNfbmV4dCAtIGNzLT5jX2J1ZikgPj0gY3MtPmNfbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQkqdSA9ICpjcy0+Y19uZXh0OwotCi0JLyogTW92ZSBwb2ludGVyIHBhc3QgdGhlIHVfaW50OF90LiAqLwotCWNzLT5jX25leHQrKzsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2NwYWNrLmggYi9jcGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGVkMzc2Li4wMDAwMDAwCi0tLSBhL2NwYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBEYXZpZCBZb3VuZy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBUaGUgbmFtZSBvZiBEYXZpZCBZb3VuZyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBEQVZJRCBZT1VORyBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKLSAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIERBVklECi0gKiBZT1VORyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECi0gKiBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWQotICogT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBfQ1BBQ0tfSAotI2RlZmluZSBfQ1BBQ0tfSAotCi1zdHJ1Y3QgY3BhY2tfc3RhdGUgewotCXVfaW50OF90CQkJCQkqY19idWY7Ci0JdV9pbnQ4X3QJCQkJCSpjX25leHQ7Ci0Jc2l6ZV90CQkJCQkJIGNfbGVuOwotfTsKLQotaW50IGNwYWNrX2luaXQoc3RydWN0IGNwYWNrX3N0YXRlICosIHVfaW50OF90ICosIHNpemVfdCk7Ci0KLWludCBjcGFja191aW50OChzdHJ1Y3QgY3BhY2tfc3RhdGUgKiwgdV9pbnQ4X3QgKik7Ci1pbnQgY3BhY2tfdWludDE2KHN0cnVjdCBjcGFja19zdGF0ZSAqLCB1X2ludDE2X3QgKik7Ci1pbnQgY3BhY2tfdWludDMyKHN0cnVjdCBjcGFja19zdGF0ZSAqLCB1X2ludDMyX3QgKik7Ci1pbnQgY3BhY2tfdWludDY0KHN0cnVjdCBjcGFja19zdGF0ZSAqLCB1X2ludDY0X3QgKik7Ci0KLSNkZWZpbmUgY3BhY2tfaW50OChfX3MsIF9fcCkJY3BhY2tfdWludDgoKF9fcyksICAodV9pbnQ4X3QqKShfX3ApKQotI2RlZmluZSBjcGFja19pbnQxNihfX3MsIF9fcCkJY3BhY2tfdWludDE2KChfX3MpLCAodV9pbnQxNl90KikoX19wKSkKLSNkZWZpbmUgY3BhY2tfaW50MzIoX19zLCBfX3ApCWNwYWNrX3VpbnQzMigoX19zKSwgKHVfaW50MzJfdCopKF9fcCkpCi0jZGVmaW5lIGNwYWNrX2ludDY0KF9fcywgX19wKQljcGFja191aW50NjQoKF9fcyksICh1X2ludDY0X3QqKShfX3ApKQotCi0jZW5kaWYgLyogX0NQQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2RjY3AuaCBiL2RjY3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmYThjMC4uMDAwMDAwMAotLS0gYS9kY2NwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9kY2NwLmgsdiAxLjEuMi40IDIwMDYvMDUvMTIgMDE6NDY6MTcgZ3V5IEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChDKSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gMjAwNAotICogQ29weXJpZ2h0IChDKSBJYW4gTWNEb25hbGQgMjAwNSA8aWFtNEBjcy53YWlrYXRvLmFjLm56PgotICogQ29weXJpZ2h0IChDKSBZb3NoaWZ1bWkgTmlzaGlkYSAyMDA1Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgYWNjb21wYW5pZXMgdGNwZHVtcCBvciB0aGUgR05VIEdQTCB2ZXJzaW9uIDIKLSAqLwotCi0jaWZuZGVmIF9fRENDUF9IRFJfXwotI2RlZmluZSBfX0RDQ1BfSERSX18KLQotLyoqCi0gKiBzdHJ1Y3QgZGNjcF9oZHIgLSBnZW5lcmljIHBhcnQgb2YgRENDUCBwYWNrZXQgaGVhZGVyCi0gKgotICogQGRjY3BoX3Nwb3J0IC0gUmVsZXZhbnQgcG9ydCBvbiB0aGUgZW5kcG9pbnQgdGhhdCBzZW50IHRoaXMgcGFja2V0Ci0gKiBAZGNjcGhfZHBvcnQgLSBSZWxldmFudCBwb3J0IG9uIHRoZSBvdGhlciBlbmRwb2ludAotICogQGRjY3BoX2RvZmYgLSBEYXRhIE9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgRENDUCBoZWFkZXIsIGluIDMyLWJpdCB3b3JkcwotICogQGRjY3BoX2NjdmFsIC0gVXNlZCBieSB0aGUgSEMtU2VuZGVyIENDSUQKLSAqIEBkY2NwaF9jc2NvdiAtIFBhcnRzIG9mIHRoZSBwYWNrZXQgdGhhdCBhcmUgY292ZXJlZCBieSB0aGUgQ2hlY2tzdW0gZmllbGQKLSAqIEBkY2NwaF9jaGVja3N1bSAtIEludGVybmV0IGNoZWNrc3VtLCBkZXBlbmRzIG9uIGRjY3BoX2NzY292Ci0gKiBAZGNjcGhfeCAtIDAgPSAyNCBiaXQgc2VxdWVuY2UgbnVtYmVyLCAxID0gNDgKLSAqIEBkY2NwaF90eXBlIC0gcGFja2V0IHR5cGUsIHNlZSBEQ0NQX1BLVF8gcHJlZml4ZWQgbWFjcm9zCi0gKiBAZGNjcGhfc2VxIC0gc2VxdWVuY2UgbnVtYmVyIGhpZ2ggb3IgbG93IG9yZGVyIDI0IGJpdHMsIGRlcGVuZHMgb24gZGNjcGhfeAotICovCi1zdHJ1Y3QgZGNjcF9oZHIgewotCXVfaW50MTZfdAlkY2NwaF9zcG9ydCwKLQkJCWRjY3BoX2Rwb3J0OwotCXVfaW50OF90CWRjY3BoX2RvZmY7Ci0JdV9pbnQ4X3QJZGNjcGhfY2N2YWxfY3Njb3Y7Ci0JdV9pbnQxNl90CWRjY3BoX2NoZWNrc3VtOwotCXVuaW9uIHsKLQl1X2ludDhfdAlkY2NwaF94dHI7Ci0JdV9pbnQzMl90CWRjY3BoX3NlcTsKLQl9CQlkY2NwaF94dHJzOwotfTsKLQotI2RlZmluZSBEQ0NQSF9DQ1ZBTChkaCkJKCgoZGgpLT5kY2NwaF9jY3ZhbF9jc2NvdikgJiAweDBGKQotI2RlZmluZSBEQ0NQSF9DU0NPVihkaCkJKCgoZGgpLT5kY2NwaF9jY3ZhbF9jc2NvdiA+PiA0KSAmIDB4MEYpCi0KLSNkZWZpbmUgRENDUEhfWChkaCkJKChkaCktPmRjY3BoX3h0cnMuZGNjcGhfeHRyICYgMSkKLSNkZWZpbmUgRENDUEhfVFlQRShkaCkJKCgoZGgpLT5kY2NwaF94dHJzLmRjY3BoX3h0ciA+PiAxKSAmIDB4RikKLSNkZWZpbmUgRENDUEhfU0VRKGRoKSAgICgoKGRoKS0+ZGNjcGhfeHRycy5kY2NwaF9zZXEpID4+IDgpCi0KLS8qKgotICogc3RydWN0IGRjY3BfaGRyX2V4dCAtIHRoZSBsb3cgYml0cyBvZiBhIDQ4IGJpdCBzZXEgcGFja2V0Ci0gKgotICogQGRjY3BoX3NlcV9sb3cgLSBsb3cgMjQgYml0cyBvZiBhIDQ4IGJpdCBzZXEgcGFja2V0Ci0gKi8KLXN0cnVjdCBkY2NwX2hkcl9leHQgewotCXVfaW50MzJfdAlkY2NwaF9zZXFfbG93OwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCAtIENvbmVjdGlvbiBpbml0aWF0aW9uIHJlcXVlc3QgaGVhZGVyCi0gKgotICogQGRjY3BoX3JlcV9zZXJ2aWNlIC0gU2VydmljZSB0byB3aGljaCB0aGUgY2xpZW50IGFwcCB3YW50cyB0byBjb25uZWN0Ci0gKi8KLXN0cnVjdCBkY2NwX2hkcl9yZXF1ZXN0IHsKLQl1X2ludDMyX3QJZGNjcGhfcmVxX3NlcnZpY2U7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBkY2NwX2hkcl9hY2tfYml0cyAtIGFja25vd2xlZGdtZW50IGJpdHMgY29tbW9uIHRvIG1vc3QgcGFja2V0cwotICoKLSAqIEBkY2NwaF9yZXNwX2Fja19ucl9oaWdoIC0gNDggYml0IGFjayBudW1iZXIgaGlnaCBvcmRlciBiaXRzLCBjb250YWlucyBHU1IKLSAqIEBkY2NwaF9yZXNwX2Fja19ucl9sb3cgLSA0OCBiaXQgYWNrIG51bWJlciBsb3cgb3JkZXIgYml0cywgY29udGFpbnMgR1NSCi0gKi8KLXN0cnVjdCBkY2NwX2hkcl9hY2tfYml0cyB7Ci0JdV9pbnQzMl90CWRjY3BoX3JhOwotCXVfaW50MzJfdAlkY2NwaF9hY2tfbnJfbG93OwotfTsKLQotI2RlZmluZSBEQ0NQSF9BQ0soZGhfYWNrKSAgICgoZGhfYWNrKS0+ZGNjcGhfcmEgPj4gOCkKLQotLyoqCi0gKiBzdHJ1Y3QgZGNjcF9oZHJfcmVzcG9uc2UgLSBDb25lY3Rpb24gaW5pdGlhdGlvbiByZXNwb25zZSBoZWFkZXIKLSAqCi0gKiBAZGNjcGhfcmVzcF9hY2tfbnJfaGlnaCAtIDQ4IGJpdCBhY2sgbnVtYmVyIGhpZ2ggb3JkZXIgYml0cywgY29udGFpbnMgR1NSCi0gKiBAZGNjcGhfcmVzcF9hY2tfbnJfbG93IC0gNDggYml0IGFjayBudW1iZXIgbG93IG9yZGVyIGJpdHMsIGNvbnRhaW5zIEdTUgotICogQGRjY3BoX3Jlc3Bfc2VydmljZSAtIEVjaG9lcyB0aGUgU2VydmljZSBDb2RlIG9uIGEgcmVjZWl2ZWQgRENDUC1SZXF1ZXN0Ci0gKi8KLXN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSB7Ci0Jc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzCWRjY3BoX3Jlc3BfYWNrOwotCXVfaW50MzJfdAkJCWRjY3BoX3Jlc3Bfc2VydmljZTsKLX07Ci0KLSNpZiAwCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkY2NwX2hkcl9kYXRhICpkY2NwX2hkcl9kYXRhKHN0cnVjdCBkY2NwX2hkciAqaGRyZykKLXsKLQljb25zdCBpbnQgZXh0ID0gRENDUEhfWChoZHJnKSA/IHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfZXh0KSA6IDA7Ci0KLQlyZXR1cm4gKHN0cnVjdCBkY2NwX2hkcl9kYXRhICopKCgodV9jaGFyICopaGRyZykgKyBzaXplb2YoaGRyZykgKyBleHQpOwotfQotI2VuZGlmCi0KLS8qKgotICogc3RydWN0IGRjY3BfaGRyX3Jlc2V0IC0gVW5jb25kaXRpb25hbGx5IHNodXQgZG93biBhIGNvbm5lY3Rpb24KLSAqCi0gKiBAZGNjcGhfcmVzZXRfc2VydmljZSAtIEVjaG9lcyB0aGUgU2VydmljZSBDb2RlIG9uIGEgcmVjZWl2ZWQgRENDUC1SZXF1ZXN0Ci0gKi8KLXN0cnVjdCBkY2NwX2hkcl9yZXNldCB7Ci0Jc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzCWRjY3BoX3Jlc2V0X2FjazsKLQl1X2ludDhfdAkJCWRjY3BoX3Jlc2V0X2NvZGUsCi0JCQkJCWRjY3BoX3Jlc2V0X2RhdGFbM107Ci19OwotCi1lbnVtIGRjY3BfcGt0X3R5cGUgewotCURDQ1BfUEtUX1JFUVVFU1QgPSAwLAotCURDQ1BfUEtUX1JFU1BPTlNFLAotCURDQ1BfUEtUX0RBVEEsCi0JRENDUF9QS1RfQUNLLAotCURDQ1BfUEtUX0RBVEFBQ0ssCi0JRENDUF9QS1RfQ0xPU0VSRVEsCi0JRENDUF9QS1RfQ0xPU0UsCi0JRENDUF9QS1RfUkVTRVQsCi0JRENDUF9QS1RfU1lOQywKLQlEQ0NQX1BLVF9TWU5DQUNLLAotCURDQ1BfUEtUX0lOVkFMSUQKLX07Ci0KLWVudW0gZGNjcF9yZXNldF9jb2RlcyB7Ci0JRENDUF9SRVNFVF9DT0RFX1VOU1BFQ0lGSUVEID0gMCwKLQlEQ0NQX1JFU0VUX0NPREVfQ0xPU0VELAotCURDQ1BfUkVTRVRfQ09ERV9BQk9SVEVELAotCURDQ1BfUkVTRVRfQ09ERV9OT19DT05ORUNUSU9OLAotCURDQ1BfUkVTRVRfQ09ERV9QQUNLRVRfRVJST1IsCi0JRENDUF9SRVNFVF9DT0RFX09QVElPTl9FUlJPUiwKLQlEQ0NQX1JFU0VUX0NPREVfTUFOREFUT1JZX0VSUk9SLAotCURDQ1BfUkVTRVRfQ09ERV9DT05ORUNUSU9OX1JFRlVTRUQsCi0JRENDUF9SRVNFVF9DT0RFX0JBRF9TRVJWSUNFX0NPREUsCi0JRENDUF9SRVNFVF9DT0RFX1RPT19CVVNZLAotCURDQ1BfUkVTRVRfQ09ERV9CQURfSU5JVF9DT09LSUUsCi0JRENDUF9SRVNFVF9DT0RFX0FHR1JFU1NJT05fUEVOQUxUWSwKLQlfX0RDQ1BfUkVTRVRfQ09ERV9MQVNUCi19OwotCi0jZW5kaWYgLyogX19EQ0NQX0hEUl9fICovCmRpZmYgLS1naXQgYS9kZWNuZXQuaCBiL2RlY25ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTVjMTQ3Li4wMDAwMDAwCi0tLSBhL2RlY25ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTQsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2RlY25ldC5oLHYgMS4xMSAyMDAyLzEyLzExIDA3OjEzOjUwIGd1eSBFeHAgJCAoTEJMKQotICovCi0KLSNpZm5kZWYgV0lOMzIKLXR5cGVkZWYgdV9pbnQ4X3QgYnl0ZVsxXTsJCS8qIHNpbmdsZSBieXRlIGZpZWxkICovCi0jZWxzZQotLyoKLSAqIHRoZSBrZXl3b3JkICdieXRlJyBnZW5lcmF0ZXMgY29uZmxpY3RzIGluIFdpbmRvd3MKLSAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEJ5dGVbMV07CQkvKiBzaW5nbGUgYnl0ZSBmaWVsZCAqLwotI2RlZmluZSBieXRlIEJ5dGUKLSNlbmRpZiAvKiBXSU4zMiAqLwotdHlwZWRlZiB1X2ludDhfdCB3b3JkWzJdOwkJLyogMiBieXRlIGZpZWxkICovCi10eXBlZGVmIHVfaW50OF90IGxvbmd3b3JkWzRdOwkJLyogNCBieXRlcyBmaWVsZCAqLwotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIERFQ05FVCBQaGFzZSBJViBwcm90b2NvbCBoZWFkZXJzCi0gKi8KLXVuaW9uIGV0aGVyYWRkcmVzcyB7Ci0JdV9pbnQ4X3QgICBkbmVfYWRkcls2XTsJCS8qIGZ1bGwgZXRoZXJuZXQgYWRkcmVzcyAqLwotCXN0cnVjdCB7Ci0JCXVfaW50OF90IGRuZV9oaW9yZFs0XTsJLyogREVDbmV0IEhJT1JEIHByZWZpeCAqLwotCQl1X2ludDhfdCBkbmVfbm9kZWFkZHJbMl07IC8qIERFQ25ldCBub2RlIGFkZHJlc3MgKi8KLQl9IGRuZV9yZW1vdGU7Ci19OwotCi10eXBlZGVmIHVuaW9uIGV0aGVyYWRkcmVzcyBldGhlcmFkZHI7CS8qIEV0aGVybmV0IGFkZHJlc3MgKi8KLQotI2RlZmluZSBISU9SRCAweDAwMDQwMGFhCQkvKiBoaWdoIDMyLWJpdHMgb2YgYWRkcmVzcyAoc3dhcHBlZCkgKi8KLQotI2RlZmluZSBBUkVBTUFTSwkwMTc2MDAwCQkvKiBtYXNrIGZvciBhcmVhIGZpZWxkICovCi0jZGVmaW5lCUFSRUFTSElGVAkxMAkJLyogYml0LW9mZnNldCBmb3IgYXJlYSBmaWVsZCAqLwotI2RlZmluZSBOT0RFTUFTSwkwMTc3NwkJLyogbWFzayBmb3Igbm9kZSBhZGRyZXNzIGZpZWxkICovCi0KLSNkZWZpbmUgRE5fTUFYQURETAkyMAkJLyogbWF4IHNpemUgb2YgREVDbmV0IGFkZHJlc3MgKi8KLXN0cnVjdCBkbl9uYWRkciB7Ci0JdV9pbnQxNl90CWFfbGVuOwkJLyogbGVuZ3RoIG9mIGFkZHJlc3MgKi8KLQl1X2ludDhfdCBhX2FkZHJbRE5fTUFYQURETF07IC8qIGFkZHJlc3MgYXMgYnl0ZXMgKi8KLX07Ci0KLS8qCi0gKiBEZWZpbmUgbG9uZyBhbmQgc2hvcnQgaGVhZGVyIGZvcm1hdHMuCi0gKi8KLXN0cnVjdCBzaG9ydGhkcgotICB7Ci0gICAgYnl0ZQlzaF9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgd29yZAlzaF9kc3Q7CQkJLyogZGVzdGluYXRpb24gbm9kZSBhZGRyZXNzICovCi0gICAgd29yZAlzaF9zcmM7CQkJLyogc291cmNlIG5vZGUgYWRkcmVzcyAqLwotICAgIGJ5dGUJc2hfdmlzaXRzOwkJLyogdmlzaXQgY291bnQgKi8KLSAgfTsKLQotc3RydWN0IGxvbmdoZHIKLSAgewotICAgIGJ5dGUJbGdfZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLwotICAgIGJ5dGUJbGdfZGFyZWE7CQkvKiBkZXN0aW5hdGlvbiBhcmVhIChyZXNlcnZlZCkgKi8KLSAgICBieXRlCWxnX2RzYXJlYTsJCS8qIGRlc3RpbmF0aW9uIHN1YmFyZWEgKHJlc2VydmVkKSAqLwotICAgIGV0aGVyYWRkcglsZ19kc3Q7CQkJLyogZGVzdGluYXRpb24gaWQgKi8KLSAgICBieXRlCWxnX3NhcmVhOwkJLyogc291cmNlIGFyZWEgKHJlc2VydmVkKSAqLwotICAgIGJ5dGUJbGdfc3NhcmVhOwkJLyogc291cmNlIHN1YmFyZWEgKHJlc2VydmVkKSAqLwotICAgIGV0aGVyYWRkcglsZ19zcmM7CQkJLyogc291cmNlIGlkICovCi0gICAgYnl0ZQlsZ19uZXh0bDI7CQkvKiBuZXh0IGxldmVsIDIgcm91dGVyIChyZXNlcnZlZCkgKi8KLSAgICBieXRlCWxnX3Zpc2l0czsJCS8qIHZpc2l0IGNvdW50ICovCi0gICAgYnl0ZQlsZ19zZXJ2aWNlOwkJLyogc2VydmljZSBjbGFzcyAocmVzZXJ2ZWQpICovCi0gICAgYnl0ZQlsZ19wdDsJCQkvKiBwcm90b2NvbCB0eXBlIChyZXNlcnZlZCkgKi8KLSAgfTsKLQotdW5pb24gcm91dGVoZHIKLSAgewotICAgIHN0cnVjdCBzaG9ydGhkciByaF9zaG9ydDsJCS8qIHNob3J0IHJvdXRlIGhlYWRlciAqLwotICAgIHN0cnVjdCBsb25naGRyIHJoX2xvbmc7CQkvKiBsb25nIHJvdXRlIGhlYWRlciAqLwotICB9OwotCi0vKgotICogRGVmaW5lIHRoZSB2YWx1ZXMgb2YgdmFyaW91cyBmaWVsZHMgaW4gdGhlIHByb3RvY29sIG1lc3NhZ2VzLgotICoKLSAqIDEuIERhdGEgcGFja2V0IGZvcm1hdHMuCi0gKi8KLSNkZWZpbmUgUk1GX01BU0sJNwkJLyogbWFzayBmb3IgbWVzc2FnZSB0eXBlICovCi0jZGVmaW5lIFJNRl9TSE9SVAkyCQkvKiBzaG9ydCBtZXNzYWdlIGZvcm1hdCAqLwotI2RlZmluZSBSTUZfTE9ORwk2CQkvKiBsb25nIG1lc3NhZ2UgZm9ybWF0ICovCi0jaWZuZGVmIFJNRl9SUVIKLSNkZWZpbmUgUk1GX1JRUgkJMDEwCQkvKiByZXF1ZXN0IHJldHVybiB0byBzZW5kZXIgKi8KLSNkZWZpbmUgUk1GX1JUUwkJMDIwCQkvKiByZXR1cm5pbmcgdG8gc2VuZGVyICovCi0jZGVmaW5lIFJNRl9JRQkJMDQwCQkvKiBpbnRyYS1ldGhlcm5ldCBwYWNrZXQgKi8KLSNlbmRpZiAvKiBSTVJfUlFSICovCi0jZGVmaW5lIFJNRl9GVkVSCTAxMDAJCS8qIGZ1dHVyZSB2ZXJzaW9uIGZsYWcgKi8KLSNkZWZpbmUgUk1GX1BBRAkJMDIwMAkJLyogcGFkIGZpZWxkICovCi0jZGVmaW5lIFJNRl9QQURNQVNLCTAxNzcJCS8qIHBhZCBmaWVsZCBtYXNrICovCi0KLSNkZWZpbmUgVklTX01BU0sJMDc3CQkvKiB2aXNpdCBmaWVsZCBtYXNrICovCi0KLS8qCi0gKiAyLiBDb250cm9sIHBhY2tldCBmb3JtYXRzLgotICovCi0jZGVmaW5lIFJNRl9DVExNQVNLCTAxNwkJLyogbWFzayBmb3IgbWVzc2FnZSB0eXBlICovCi0jZGVmaW5lIFJNRl9DVExNU0cJMDEJCS8qIGNvbnRyb2wgbWVzc2FnZSBpbmRpY2F0b3IgKi8KLSNkZWZpbmUgUk1GX0lOSVQJMDEJCS8qIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgKi8KLSNkZWZpbmUgUk1GX1ZFUgkJMDMJCS8qIHZlcmlmaWNhdGlvbiBtZXNzYWdlICovCi0jZGVmaW5lIFJNRl9URVNUCTA1CQkvKiBoZWxsbyBhbmQgdGVzdCBtZXNzYWdlICovCi0jZGVmaW5lIFJNRl9MMVJPVVQJMDcJCS8qIGxldmVsIDEgcm91dGluZyBtZXNzYWdlICovCi0jZGVmaW5lIFJNRl9MMlJPVVQJMDExCQkvKiBsZXZlbCAyIHJvdXRpbmcgbWVzc2FnZSAqLwotI2RlZmluZSBSTUZfUkhFTExPCTAxMwkJLyogcm91dGVyIGhlbGxvIG1lc3NhZ2UgKi8KLSNkZWZpbmUgUk1GX0VIRUxMTwkwMTUJCS8qIGVuZG5vZGUgaGVsbG8gbWVzc2FnZSAqLwotCi0jZGVmaW5lIFRJX0wyUk9VVAkwMQkJLyogbGV2ZWwgMiByb3V0ZXIgKi8KLSNkZWZpbmUgVElfTDFST1VUCTAyCQkvKiBsZXZlbCAxIHJvdXRlciAqLwotI2RlZmluZSBUSV9FTkROT0RFCTAzCQkvKiBlbmRub2RlICovCi0jZGVmaW5lIFRJX1ZFUklGCTA0CQkvKiB2ZXJpZmljYXRpb24gcmVxdWlyZWQgKi8KLSNkZWZpbmUgVElfQkxPQ0sJMDEwCQkvKiBibG9ja2luZyByZXF1ZXN0ZWQgKi8KLQotI2RlZmluZSBWRV9WRVJTCQkyCQkvKiB2ZXJzaW9uIG51bWJlciAoMikgKi8KLSNkZWZpbmUgVkVfRUNPCQkwCQkvKiBFQ08gbnVtYmVyICovCi0jZGVmaW5lIFZFX1VFQ08JCTAJCS8qIHVzZXIgRUNPIG51bWJlciAoMCkgKi8KLQotI2RlZmluZSBQM19WRVJTCQkxCQkvKiBwaGFzZSBJSUkgdmVyc2lvbiBudW1iZXIgKDEpICovCi0jZGVmaW5lIFAzX0VDTwkJMwkJLyogRUNPIG51bWJlciAoMykgKi8KLSNkZWZpbmUgUDNfVUVDTwkJMAkJLyogdXNlciBFQ08gbnVtYmVyICgwKSAqLwotCi0jZGVmaW5lIElJX0wyUk9VVAkwMQkJLyogbGV2ZWwgMiByb3V0ZXIgKi8KLSNkZWZpbmUgSUlfTDFST1VUCTAyCQkvKiBsZXZlbCAxIHJvdXRlciAqLwotI2RlZmluZSBJSV9FTkROT0RFCTAzCQkvKiBlbmRub2RlICovCi0jZGVmaW5lIElJX1ZFUklGCTA0CQkvKiB2ZXJpZmljYXRpb24gcmVxdWlyZWQgKi8KLSNkZWZpbmUgSUlfTk9NQ0FTVAkwNDAJCS8qIG5vIG11bHRpY2FzdCB0cmFmZmljIGFjY2VwdGVkICovCi0jZGVmaW5lIElJX0JMT0NLCTAxMDAJCS8qIGJsb2NraW5nIHJlcXVlc3RlZCAqLwotI2RlZmluZSBJSV9UWVBFTUFTSwkwMwkJLyogbWFzayBmb3Igbm9kZSB0eXBlICovCi0KLSNkZWZpbmUgVEVTVERBVEEJMDI1MgkJLyogdGVzdCBkYXRhIGJ5dGVzICovCi0jZGVmaW5lIFRFU1RMRU4JCTEJCS8qIGxlbmd0aCBvZiB0cmFuc21pdHRlZCB0ZXN0IGRhdGEgKi8KLQotLyoKLSAqIERlZmluZSBjb250cm9sIG1lc3NhZ2UgZm9ybWF0cy4KLSAqLwotc3RydWN0IGluaXRtc2dJSUkJCQkvKiBwaGFzZSBJSUkgaW5pdGlhbGl6YXRpb24gbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQlpbklJSV9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgd29yZAlpbklJSV9zcmM7CQkvKiBzb3VyY2Ugbm9kZSBhZGRyZXNzICovCi0gICAgYnl0ZQlpbklJSV9pbmZvOwkJLyogcm91dGluZyBsYXllciBpbmZvcm1hdGlvbiAqLwotICAgIHdvcmQJaW5JSUlfYmxrc2l6ZTsJCS8qIG1heGltdW0gZGF0YSBsaW5rIGJsb2NrIHNpemUgKi8KLSAgICBieXRlCWluSUlJX3ZlcnM7CQkvKiB2ZXJzaW9uIG51bWJlciAqLwotICAgIGJ5dGUJaW5JSUlfZWNvOwkJLyogRUNPIG51bWJlciAqLwotICAgIGJ5dGUJaW5JSUlfdWVjbzsJCS8qIHVzZXIgRUNPIG51bWJlciAqLwotICAgIGJ5dGUJaW5JSUlfcnN2ZDsJCS8qIHJlc2VydmVkIGltYWdlIGZpZWxkICovCi0gIH07Ci0KLXN0cnVjdCBpbml0bXNnCQkJCS8qIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgKi8KLSAgewotICAgIGJ5dGUJaW5fZmxhZ3M7CQkvKiByb3V0ZSBmbGFncyAqLwotICAgIHdvcmQJaW5fc3JjOwkJCS8qIHNvdXJjZSBub2RlIGFkZHJlc3MgKi8KLSAgICBieXRlCWluX2luZm87CQkvKiByb3V0aW5nIGxheWVyIGluZm9ybWF0aW9uICovCi0gICAgd29yZAlpbl9ibGtzaXplOwkJLyogbWF4aW11bSBkYXRhIGxpbmsgYmxvY2sgc2l6ZSAqLwotICAgIGJ5dGUJaW5fdmVyczsJCS8qIHZlcnNpb24gbnVtYmVyICovCi0gICAgYnl0ZQlpbl9lY287CQkJLyogRUNPIG51bWJlciAqLwotICAgIGJ5dGUJaW5fdWVjbzsJCS8qIHVzZXIgRUNPIG51bWJlciAqLwotICAgIHdvcmQJaW5faGVsbG87CQkvKiBoZWxsbyB0aW1lciAqLwotICAgIGJ5dGUJaW5fcnN2ZDsJCS8qIHJlc2VydmVkIGltYWdlIGZpZWxkICovCi0gIH07Ci0KLXN0cnVjdCB2ZXJpZm1zZwkJCQkvKiB2ZXJpZmljYXRpb24gbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQl2ZV9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgd29yZAl2ZV9zcmM7CQkJLyogc291cmNlIG5vZGUgYWRkcmVzcyAqLwotICAgIGJ5dGUJdmVfZmNudmFsOwkJLyogZnVuY3Rpb24gdmFsdWUgaW1hZ2UgZmllbGQgKi8KLSAgfTsKLQotc3RydWN0IHRlc3Rtc2cJCQkJLyogaGVsbG8gYW5kIHRlc3QgbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQl0ZV9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgd29yZAl0ZV9zcmM7CQkJLyogc291cmNlIG5vZGUgYWRkcmVzcyAqLwotICAgIGJ5dGUJdGVfZGF0YTsJCS8qIHRlc3QgZGF0YSBpbWFnZSBmaWVsZCAqLwotICB9OwotCi1zdHJ1Y3QgbDFyb3V0CQkJCS8qIGxldmVsIDEgcm91dGluZyBtZXNzYWdlICovCi0gIHsKLSAgICBieXRlCXIxX2ZsYWdzOwkJLyogcm91dGUgZmxhZ3MgKi8KLSAgICB3b3JkCXIxX3NyYzsJCQkvKiBzb3VyY2Ugbm9kZSBhZGRyZXNzICovCi0gICAgYnl0ZQlyMV9yc3ZkOwkJLyogcmVzZXJ2ZWQgZmllbGQgKi8KLSAgfTsKLQotc3RydWN0IGwycm91dAkJCQkvKiBsZXZlbCAyIHJvdXRpbmcgbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQlyMl9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgd29yZAlyMl9zcmM7CQkJLyogc291cmNlIG5vZGUgYWRkcmVzcyAqLwotICAgIGJ5dGUJcjJfcnN2ZDsJCS8qIHJlc2VydmVkIGZpZWxkICovCi0gIH07Ci0KLXN0cnVjdCByaGVsbG9tc2cJCQkvKiByb3V0ZXIgaGVsbG8gbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQlyaF9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgYnl0ZQlyaF92ZXJzOwkJLyogdmVyc2lvbiBudW1iZXIgKi8KLSAgICBieXRlCXJoX2VjbzsJCQkvKiBFQ08gbnVtYmVyICovCi0gICAgYnl0ZQlyaF91ZWNvOwkJLyogdXNlciBFQ08gbnVtYmVyICovCi0gICAgZXRoZXJhZGRyCXJoX3NyYzsJCQkvKiBzb3VyY2UgaWQgKi8KLSAgICBieXRlCXJoX2luZm87CQkvKiByb3V0aW5nIGxheWVyIGluZm9ybWF0aW9uICovCi0gICAgd29yZAlyaF9ibGtzaXplOwkJLyogbWF4aW11bSBkYXRhIGxpbmsgYmxvY2sgc2l6ZSAqLwotICAgIGJ5dGUJcmhfcHJpb3JpdHk7CQkvKiByb3V0ZXIncyBwcmlvcml0eSAqLwotICAgIGJ5dGUJcmhfYXJlYTsJCS8qIHJlc2VydmVkICovCi0gICAgd29yZAlyaF9oZWxsbzsJCS8qIGhlbGxvIHRpbWVyICovCi0gICAgYnl0ZQlyaF9tcGQ7CQkJLyogcmVzZXJ2ZWQgKi8KLSAgfTsKLQotc3RydWN0IGVoZWxsb21zZwkJCS8qIGVuZG5vZGUgaGVsbG8gbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQllaF9mbGFnczsJCS8qIHJvdXRlIGZsYWdzICovCi0gICAgYnl0ZQllaF92ZXJzOwkJLyogdmVyc2lvbiBudW1iZXIgKi8KLSAgICBieXRlCWVoX2VjbzsJCQkvKiBFQ08gbnVtYmVyICovCi0gICAgYnl0ZQllaF91ZWNvOwkJLyogdXNlciBFQ08gbnVtYmVyICovCi0gICAgZXRoZXJhZGRyCWVoX3NyYzsJCQkvKiBzb3VyY2UgaWQgKi8KLSAgICBieXRlCWVoX2luZm87CQkvKiByb3V0aW5nIGxheWVyIGluZm9ybWF0aW9uICovCi0gICAgd29yZAllaF9ibGtzaXplOwkJLyogbWF4aW11bSBkYXRhIGxpbmsgYmxvY2sgc2l6ZSAqLwotICAgIGJ5dGUJZWhfYXJlYTsJCS8qIGFyZWEgKHJlc2VydmVkKSAqLwotICAgIGJ5dGUJZWhfc2VlZFs4XTsJCS8qIHZlcmlmaWNhdGlvbiBzZWVkICovCi0gICAgZXRoZXJhZGRyCWVoX3JvdXRlcjsJCS8qIGRlc2lnbmF0ZWQgcm91dGVyICovCi0gICAgd29yZAllaF9oZWxsbzsJCS8qIGhlbGxvIHRpbWVyICovCi0gICAgYnl0ZQllaF9tcGQ7CQkJLyogKHJlc2VydmVkKSAqLwotICAgIGJ5dGUJZWhfZGF0YTsJCS8qIHRlc3QgZGF0YSBpbWFnZSBmaWVsZCAqLwotICB9OwotCi11bmlvbiBjb250cm9sbXNnCi0gIHsKLSAgICBzdHJ1Y3QgaW5pdG1zZwljbV9pbml0OwkvKiBpbml0aWFsaXphdGlvbiBtZXNzYWdlICovCi0gICAgc3RydWN0IHZlcmlmbXNnCWNtX3ZlcjsJCS8qIHZlcmlmaWNhdGlvbiBtZXNzYWdlICovCi0gICAgc3RydWN0IHRlc3Rtc2cJY21fdGVzdDsJLyogaGVsbG8gYW5kIHRlc3QgbWVzc2FnZSAqLwotICAgIHN0cnVjdCBsMXJvdXQJY21fbDFyb3U7CS8qIGxldmVsIDEgcm91dGluZyBtZXNzYWdlICovCi0gICAgc3RydWN0IGwycm91dAljbV9sMnJvdXQ7CS8qIGxldmVsIDIgcm91dGluZyBtZXNzYWdlICovCi0gICAgc3RydWN0IHJoZWxsb21zZwljbV9yaGVsbG87CS8qIHJvdXRlciBoZWxsbyBtZXNzYWdlICovCi0gICAgc3RydWN0IGVoZWxsb21zZwljbV9laGVsbG87CS8qIGVuZG5vZGUgaGVsbG8gbWVzc2FnZSAqLwotICB9OwotCi0vKiBNYWNyb3MgZm9yIGRlY29kaW5nIHJvdXRpbmctaW5mbyBmaWVsZHMgKi8KLSNkZWZpbmUJUklfQ09TVCh4KQkoKHgpJjA3NzcpCi0jZGVmaW5lCVJJX0hPUFMoeCkJKCgoeCk+PjEwKSYwMzcpCi0MCi0vKgotICogTlNQIHByb3RvY29sIGZpZWxkcyBhbmQgdmFsdWVzLgotICovCi0KLSNkZWZpbmUgTlNQX1RZUEVNQVNLIDAxNAkJLyogbWFzayB0byBpc29sYXRlIHR5cGUgY29kZSAqLwotI2RlZmluZSBOU1BfU1VCTUFTSyAwMTYwCQkvKiBtYXNrIHRvIGlzb2xhdGUgc3VidHlwZSBjb2RlICovCi0jZGVmaW5lIE5TUF9TVUJTSEZUIDQJCQkvKiBzaGlmdCB0byBtb3ZlIHN1YnR5cGUgY29kZSAqLwotCi0jZGVmaW5lIE1GVF9EQVRBIDAJCQkvKiBkYXRhIG1lc3NhZ2UgKi8KLSNkZWZpbmUgTUZUX0FDSyAgMDQJCQkvKiBhY2tub3dsZWRnZW1lbnQgbWVzc2FnZSAqLwotI2RlZmluZSBNRlRfQ1RMICAwMTAJCQkvKiBjb250cm9sIG1lc3NhZ2UgKi8KLQotI2RlZmluZSBNRlNfSUxTICAwMjAJCQkvKiBkYXRhIG9yIEkvTFMgaW5kaWNhdG9yICovCi0jZGVmaW5lIE1GU19CT00gIDA0MAkJCS8qIGJlZ2lubmluZyBvZiBtZXNzYWdlIChkYXRhKSAqLwotI2RlZmluZSBNRlNfTU9NICAwCQkJLyogbWlkZGxlIG9mIG1lc3NhZ2UgKGRhdGEpICovCi0jZGVmaW5lIE1GU19FT00gIDAxMDAJCQkvKiBlbmQgb2YgbWVzc2FnZSAoZGF0YSkgKi8KLSNkZWZpbmUgTUZTX0lOVCAgMDQwCQkJLyogaW50ZXJydXB0IG1lc3NhZ2UgKi8KLQotI2RlZmluZSBNRlNfREFDSyAwCQkJLyogZGF0YSBhY2tub3dsZWRnZW1lbnQgKi8KLSNkZWZpbmUgTUZTX0lBQ0sgMDIwCQkJLyogSS9MUyBhY2tub3dsZWRnZW1lbnQgKi8KLSNkZWZpbmUgTUZTX0NBQ0sgMDQwCQkJLyogY29ubmVjdCBhY2tub3dsZWRnZW1lbnQgKi8KLQotI2RlZmluZSBNRlNfTk9QICAwCQkJLyogbm8gb3BlcmF0aW9uICovCi0jZGVmaW5lIE1GU19DSSAgIDAyMAkJCS8qIGNvbm5lY3QgaW5pdGlhdGUgKi8KLSNkZWZpbmUgTUZTX0NDICAgMDQwCQkJLyogY29ubmVjdCBjb25maXJtICovCi0jZGVmaW5lIE1GU19ESSAgIDA2MAkJCS8qIGRpc2Nvbm5lY3QgaW5pdGlhdGUgKi8KLSNkZWZpbmUgTUZTX0RDICAgMDEwMAkJCS8qIGRpc2Nvbm5lY3QgY29uZmlybSAqLwotI2RlZmluZSBNRlNfUkNJICAwMTQwCQkJLyogcmV0cmFuc21pdHRlZCBjb25uZWN0IGluaXRpYXRlICovCi0KLSNkZWZpbmUgU0dRX0FDSyAgMDEwMDAwMAkJLyogYWNrICovCi0jZGVmaW5lIFNHUV9OQUsgIDAxMTAwMDAJCS8qIG5lZ2F0aXZlIGFjayAqLwotI2RlZmluZSBTR1FfT0FDSyAwMTIwMDAwCQkvKiBvdGhlciBjaGFubmVsIGFjayAqLwotI2RlZmluZSBTR1FfT05BSyAwMTMwMDAwCQkvKiBvdGhlciBjaGFubmVsIG5lZ2F0aXZlIGFjayAqLwotI2RlZmluZSBTR1FfTUFTSyAwNzc3NwkJCS8qIG1hc2sgdG8gaXNvbGF0ZSBzZXEgIyAqLwotI2RlZmluZSBTR1FfT1RIRVIgMDIwMDAwCQkvKiBvdGhlciBjaGFubmVsIHF1YWxpZmllciAqLwotI2RlZmluZSBTR1FfREVMQVkgMDEwMDAwCQkvKiBhY2sgZGVsYXkgZmxhZyAqLwotCi0jZGVmaW5lIFNHUV9FT00gIDAxMDAwMDAJCS8qIHBzZXVkbyBmbGFnIGZvciBlbmQtb2YtbWVzc2FnZSAqLwotCi0jZGVmaW5lIExTTV9NQVNLIDAzCQkJLyogbWFzayBmb3IgbW9kaWZpZXIgZmllbGQgKi8KLSNkZWZpbmUgTFNNX05PQ0hBTkdFIDAJCQkvKiBubyBjaGFuZ2UgKi8KLSNkZWZpbmUgTFNNX0RPTk9UU0VORCAxCQkJLyogZG8gbm90IHNlbmQgZGF0YSAqLwotI2RlZmluZSBMU01fU0VORCAyCQkJLyogc2VuZCBkYXRhICovCi0KLSNkZWZpbmUgTFNJX01BU0sgMDE0CQkJLyogbWFzayBmb3IgaW50ZXJwcmV0YXRpb24gZmllbGQgKi8KLSNkZWZpbmUgTFNJX0RBVEEgMAkJCS8qIGRhdGEgc2VnbWVudCBvciBtZXNzYWdlIGNvdW50ICovCi0jZGVmaW5lIExTSV9JTlRSIDQJCQkvKiBpbnRlcnJ1cHQgcmVxdWVzdCBjb3VudCAqLwotI2RlZmluZSBMU0lfSU5UTSAwMzc3CQkJLyogZnVubnkgbWFya2VyIGZvciBpbnQuIG1lc3NhZ2UgKi8KLQotI2RlZmluZSBDT1NfTUFTSyAwMTQJCQkvKiBtYXNrIGZvciBmbG93IGNvbnRyb2wgZmllbGQgKi8KLSNkZWZpbmUgQ09TX05PTkUgMAkJCS8qIG5vIGZsb3cgY29udHJvbCAqLwotI2RlZmluZSBDT1NfU0VHTUVOVCAwNAkJCS8qIHNlZ21lbnQgZmxvdyBjb250cm9sICovCi0jZGVmaW5lIENPU19NRVNTQUdFIDAxMAkJCS8qIG1lc3NhZ2UgZmxvdyBjb250cm9sICovCi0jZGVmaW5lIENPU19DUllQVFNFUiAwMjAJCS8qIGNyeXB0b2dyYXBoaWMgc2VydmljZXMgcmVxdWVzdGVkICovCi0jZGVmaW5lIENPU19ERUZBVUxUIDEJCQkvKiBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZCAqLwotCi0jZGVmaW5lIENPSV9NQVNLIDMJCQkvKiBtYXNrIGZvciB2ZXJzaW9uIGZpZWxkICovCi0jZGVmaW5lIENPSV8zMiAwCQkJLyogdmVyc2lvbiAzLjIgKi8KLSNkZWZpbmUgQ09JXzMxIDEJCQkvKiB2ZXJzaW9uIDMuMSAqLwotI2RlZmluZSBDT0lfNDAgMgkJCS8qIHZlcnNpb24gNC4wICovCi0jZGVmaW5lIENPSV80MSAzCQkJLyogdmVyc2lvbiA0LjEgKi8KLQotI2RlZmluZSBNTlVfTUFTSyAxNDAJCQkvKiBtYXNrIGZvciBzZXNzaW9uIGNvbnRyb2wgdmVyc2lvbiAqLwotI2RlZmluZSBNTlVfMTAgMDAwCQkJCS8qIHNlc3Npb24gVjEuMCAqLwotI2RlZmluZSBNTlVfMjAgMDQwCQkJCS8qIHNlc3Npb24gVjIuMCAqLwotI2RlZmluZSBNTlVfQUNDRVNTIDEJCQkvKiBhY2Nlc3MgY29udHJvbCBwcmVzZW50ICovCi0jZGVmaW5lIE1OVV9VU1JEQVRBIDIJCQkvKiB1c2VyIGRhdGEgZmllbGQgcHJlc2VudCAqLwotI2RlZmluZSBNTlVfSU5WS1BST1hZIDQJCQkvKiBpbnZva2UgcHJveHkgZmllbGQgcHJlc2VudCAqLwotI2RlZmluZSBNTlVfVUlDUFJPWFkgOAkJCS8qIHVzZSB1aWMtYmFzZWQgcHJveHkgKi8KLQotI2RlZmluZSBEQ19OT1JFU09VUkNFUyAxCQkvKiBubyByZXNvdXJjZSByZWFzb24gY29kZSAqLwotI2RlZmluZSBEQ19OT0xJTksgNDEJCQkvKiBubyBsaW5rIHRlcm1pbmF0ZSByZWFzb24gY29kZSAqLwotI2RlZmluZSBEQ19DT01QTEVURSA0MgkJCS8qIGRpc2Nvbm5lY3QgY29tcGxldGUgcmVhc29uIGNvZGUgKi8KLQotI2RlZmluZSBESV9OT0VSUk9SIDAJCQkvKiB1c2VyIGRpc2Nvbm5lY3QgKi8KLSNkZWZpbmUgRElfU0hVVCAzCQkJLyogbm9kZSBpcyBzaHV0dGluZyBkb3duICovCi0jZGVmaW5lIERJX05PVVNFUiA0CQkJLyogZGVzdGluYXRpb24gZW5kIHVzZXIgZG9lcyBub3QgZXhpc3QgKi8KLSNkZWZpbmUgRElfSU5WREVTVCA1CQkJLyogaW52YWxpZCBlbmQgdXNlciBkZXN0aW5hdGlvbiAqLwotI2RlZmluZSBESV9SRU1SRVNSQyA2CQkJLyogaW5zdWZmaWNpZW50IHJlbW90ZSByZXNvdXJjZXMgKi8KLSNkZWZpbmUgRElfVFBBIDgJCQkvKiB0aGlyZCBwYXJ0eSBhYm9ydCAqLwotI2RlZmluZSBESV9QUk9UT0NPTCA3CQkJLyogcHJvdG9jb2wgZXJyb3IgZGlzY292ZXJlZCAqLwotI2RlZmluZSBESV9BQk9SVCA5CQkJLyogdXNlciBhYm9ydCAqLwotI2RlZmluZSBESV9MT0NBTFJFU1JDIDMyCQkvKiBpbnN1ZmZpY2llbnQgbG9jYWwgcmVzb3VyY2VzICovCi0jZGVmaW5lIERJX1JFTVVTRVJSRVNSQyAzMwkJLyogaW5zdWZmaWNpZW50IHJlbW90ZSB1c2VyIHJlc291cmNlcyAqLwotI2RlZmluZSBESV9CQURBQ0NFU1MgMzQJCQkvKiBiYWQgYWNjZXNzIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgRElfQkFEQUNDTlQgMzYJCQkvKiBiYWQgQUNDT1VOVCBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBESV9DT05ORUNUQUJPUlQgMzgJCS8qIGNvbm5lY3QgcmVxdWVzdCBjYW5jZWxsZWQgKi8KLSNkZWZpbmUgRElfVElNRURPVVQgMzgJCQkvKiByZW1vdGUgbm9kZSBvciB1c2VyIGNyYXNoZWQgKi8KLSNkZWZpbmUgRElfVU5SRUFDSEFCTEUgMzkJCS8qIGxvY2FsIHRpbWVycyBleHBpcmVkIGR1ZSB0byAuLi4gKi8KLSNkZWZpbmUgRElfQkFESU1BR0UgNDMJCQkvKiBiYWQgaW1hZ2UgZGF0YSBpbiBjb25uZWN0ICovCi0jZGVmaW5lIERJX1NFUlZNSVNNQVRDSCA1NAkJLyogY3J5cHRvZ3JhcGhpYyBzZXJ2aWNlIG1pc21hdGNoICovCi0KLSNkZWZpbmUgVUNfT0JKUkVKRUNUIDAJCQkvKiBvYmplY3QgcmVqZWN0ZWQgY29ubmVjdCAqLwotI2RlZmluZSBVQ19VU0VSRElTQ09OTkVDVCAwCQkvKiB1c2VyIGRpc2Nvbm5lY3QgKi8KLSNkZWZpbmUgVUNfUkVTT1VSQ0VTIDEJCQkvKiBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIChsb2NhbCBvciByZW1vdGUpICovCi0jZGVmaW5lIFVDX05PU1VDSE5PREUgMgkJCS8qIHVucmVjb2duaXplZCBub2RlIG5hbWUgKi8KLSNkZWZpbmUgVUNfUkVNT1RFU0hVVCAzCQkJLyogcmVtb3RlIG5vZGUgc2h1dHRpbmcgZG93biAqLwotI2RlZmluZSBVQ19OT1NVQ0hPQkogNAkJCS8qIHVucmVjb2duaXplZCBvYmplY3QgKi8KLSNkZWZpbmUgVUNfSU5WT0JKRk9STUFUIDUJCS8qIGludmFsaWQgb2JqZWN0IG5hbWUgZm9ybWF0ICovCi0jZGVmaW5lIFVDX09CSlRPT0JVU1kgNgkJCS8qIG9iamVjdCB0b28gYnVzeSAqLwotI2RlZmluZSBVQ19ORVRXT1JLQUJPUlQgOAkJLyogbmV0d29yayBhYm9ydCAqLwotI2RlZmluZSBVQ19VU0VSQUJPUlQgOQkJCS8qIHVzZXIgYWJvcnQgKi8KLSNkZWZpbmUgVUNfSU5WTk9ERUZPUk1BVCAxMAkJLyogaW52YWxpZCBub2RlIG5hbWUgZm9ybWF0ICovCi0jZGVmaW5lIFVDX0xPQ0FMU0hVVCAxMQkJCS8qIGxvY2FsIG5vZGUgc2h1dHRpbmcgZG93biAqLwotI2RlZmluZSBVQ19BQ0NFU1NSRUpFQ1QgMzQJCS8qIGludmFsaWQgYWNjZXNzIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVUNfTk9SRVNQT05TRSAzOAkJLyogbm8gcmVzcG9uc2UgZnJvbSBvYmplY3QgKi8KLSNkZWZpbmUgVUNfVU5SRUFDSEFCTEUgMzkJCS8qIG5vZGUgdW5yZWFjaGFibGUgKi8KLQotLyoKLSAqIE5TUCBtZXNzYWdlIGZvcm1hdHMuCi0gKi8KLXN0cnVjdCBuc3BoZHIJCQkJLyogZ2VuZXJhbCBuc3AgaGVhZGVyICovCi0gIHsKLSAgICBieXRlCW5oX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLwotICAgIHdvcmQJbmhfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLwotICAgIHdvcmQJbmhfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KLSAgfTsKLQotc3RydWN0IHNlZ2hkcgkJCQkvKiBkYXRhIHNlZ21lbnQgaGVhZGVyICovCi0gIHsKLSAgICBieXRlCXNoX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLwotICAgIHdvcmQJc2hfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLwotICAgIHdvcmQJc2hfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KLSAgICB3b3JkCXNoX3NlcVszXTsJCS8qIHNlcXVlbmNlIG51bWJlcnMgKi8KLSAgfTsKLQotc3RydWN0IG1pbnNlZ2hkcgkJCS8qIG1pbmltdW0gZGF0YSBzZWdtZW50IGhlYWRlciAqLwotICB7Ci0gICAgYnl0ZQltc19mbGFnczsJCS8qIG1lc3NhZ2UgZmxhZ3MgKi8KLSAgICB3b3JkCW1zX2RzdDsJCQkvKiBkZXN0aW5hdGlvbiBsaW5rIGFkZHJlc3MgKi8KLSAgICB3b3JkCW1zX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCi0gICAgd29yZAltc19zZXE7CQkJLyogc2VxdWVuY2UgbnVtYmVyICovCi0gIH07Ci0KLXN0cnVjdCBsc21zZwkJCQkvKiBsaW5rIHNlcnZpY2UgbWVzc2FnZSAoYWZ0ZXIgaGRyKSAqLwotICB7Ci0gICAgYnl0ZQlsc19sc2ZsYWdzOwkJLyogbGluayBzZXJ2aWNlIGZsYWdzICovCi0gICAgYnl0ZQlsc19mY3ZhbDsJCS8qIGZsb3cgY29udHJvbCB2YWx1ZSAqLwotICB9OwotCi1zdHJ1Y3QgYWNrbXNnCQkJCS8qIGFja25vd2xlZGdlbWVudCBtZXNzYWdlICovCi0gIHsKLSAgICBieXRlCWFrX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLwotICAgIHdvcmQJYWtfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLwotICAgIHdvcmQJYWtfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KLSAgICB3b3JkCWFrX2Fja251bVsyXTsJCS8qIGFja25vd2xlZGdlbWVudCBudW1iZXJzICovCi0gIH07Ci0KLXN0cnVjdCBtaW5hY2ttc2cJCQkvKiBtaW5pbXVtIGFja25vd2xlZGdlbWVudCBtZXNzYWdlICovCi0gIHsKLSAgICBieXRlCW1rX2ZsYWdzOwkJLyogbWVzc2FnZSBmbGFncyAqLwotICAgIHdvcmQJbWtfZHN0OwkJCS8qIGRlc3RpbmF0aW9uIGxpbmsgYWRkcmVzcyAqLwotICAgIHdvcmQJbWtfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KLSAgICB3b3JkCW1rX2Fja251bTsJCS8qIGFja25vd2xlZGdlbWVudCBudW1iZXIgKi8KLSAgfTsKLQotc3RydWN0IGNpYWNrbXNnCQkJCS8qIGNvbm5lY3QgYWNrbm93bGVkZ2VtZW50IG1lc3NhZ2UgKi8KLSAgewotICAgIGJ5dGUJY2tfZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCi0gICAgd29yZAlja19kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICovCi0gIH07Ci0KLXN0cnVjdCBjaW1zZwkJCQkvKiBjb25uZWN0IGluaXRpYXRlIG1lc3NhZ2UgKi8KLSAgewotICAgIGJ5dGUJY2lfZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCi0gICAgd29yZAljaV9kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICgwKSAqLwotICAgIHdvcmQJY2lfc3JjOwkJCS8qIHNvdXJjZSBsaW5rIGFkZHJlc3MgKi8KLSAgICBieXRlCWNpX3NlcnZpY2VzOwkJLyogcmVxdWVzdGVkIHNlcnZpY2VzICovCi0gICAgYnl0ZQljaV9pbmZvOwkJLyogaW5mb3JtYXRpb24gKi8KLSAgICB3b3JkCWNpX3NlZ3NpemU7CQkvKiBtYXhpbXVtIHNlZ21lbnQgc2l6ZSAqLwotICB9OwotCi1zdHJ1Y3QgY2Ntc2cJCQkJLyogY29ubmVjdCBjb25maXJtIG1lc3NhZ2UgKi8KLSAgewotICAgIGJ5dGUJY2NfZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCi0gICAgd29yZAljY19kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICovCi0gICAgd29yZAljY19zcmM7CQkJLyogc291cmNlIGxpbmsgYWRkcmVzcyAqLwotICAgIGJ5dGUJY2Nfc2VydmljZXM7CQkvKiByZXF1ZXN0ZWQgc2VydmljZXMgKi8KLSAgICBieXRlCWNjX2luZm87CQkvKiBpbmZvcm1hdGlvbiAqLwotICAgIHdvcmQJY2Nfc2Vnc2l6ZTsJCS8qIG1heGltdW0gc2VnbWVudCBzaXplICovCi0gICAgYnl0ZQljY19vcHRsZW47CQkvKiBvcHRpb25hbCBkYXRhIGxlbmd0aCAqLwotICB9OwotCi1zdHJ1Y3QgY25tc2cJCQkJLyogZ2VuZXJpYyBjb25uZWN0IG1lc3NhZ2UgKi8KLSAgewotICAgIGJ5dGUJY25fZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCi0gICAgd29yZAljbl9kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICovCi0gICAgd29yZAljbl9zcmM7CQkJLyogc291cmNlIGxpbmsgYWRkcmVzcyAqLwotICAgIGJ5dGUJY25fc2VydmljZXM7CQkvKiByZXF1ZXN0ZWQgc2VydmljZXMgKi8KLSAgICBieXRlCWNuX2luZm87CQkvKiBpbmZvcm1hdGlvbiAqLwotICAgIHdvcmQJY25fc2Vnc2l6ZTsJCS8qIG1heGltdW0gc2VnbWVudCBzaXplICovCi0gIH07Ci0KLXN0cnVjdCBkaW1zZwkJCQkvKiBkaXNjb25uZWN0IGluaXRpYXRlIG1lc3NhZ2UgKi8KLSAgewotICAgIGJ5dGUJZGlfZmxhZ3M7CQkvKiBtZXNzYWdlIGZsYWdzICovCi0gICAgd29yZAlkaV9kc3Q7CQkJLyogZGVzdGluYXRpb24gbGluayBhZGRyZXNzICovCi0gICAgd29yZAlkaV9zcmM7CQkJLyogc291cmNlIGxpbmsgYWRkcmVzcyAqLwotICAgIHdvcmQJZGlfcmVhc29uOwkJLyogcmVhc29uIGNvZGUgKi8KLSAgICBieXRlCWRpX29wdGxlbjsJCS8qIG9wdGlvbmFsIGRhdGEgbGVuZ3RoICovCi0gIH07Ci0KLXN0cnVjdCBkY21zZwkJCQkvKiBkaXNjb25uZWN0IGNvbmZpcm0gbWVzc2FnZSAqLwotICB7Ci0gICAgYnl0ZQlkY19mbGFnczsJCS8qIG1lc3NhZ2UgZmxhZ3MgKi8KLSAgICB3b3JkCWRjX2RzdDsJCQkvKiBkZXN0aW5hdGlvbiBsaW5rIGFkZHJlc3MgKi8KLSAgICB3b3JkCWRjX3NyYzsJCQkvKiBzb3VyY2UgbGluayBhZGRyZXNzICovCi0gICAgd29yZAlkY19yZWFzb247CQkvKiByZWFzb24gY29kZSAqLwotICB9OwpkaWZmIC0tZ2l0IGEvZGVjb2RlX3ByZWZpeC5oIGIvZGVjb2RlX3ByZWZpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM4NDcxLi4wMDAwMDAwCi0tLSBhL2RlY29kZV9wcmVmaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogRXh0ZW5zaXZlbHkgbW9kaWZpZWQgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkgZm9yIG1vcmUKLSAqIGNvbXBsZXRlIEJHUCBzdXBwb3J0LgotICovCi0KLSNpZm5kZWYgdGNwZHVtcF9kZWNvZGVfcHJlZml4X2gKLSNkZWZpbmUgdGNwZHVtcF9kZWNvZGVfcHJlZml4X2gKLQotZXh0ZXJuIGludCBkZWNvZGVfcHJlZml4NChjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKTsKLSNpZmRlZiBJTkVUNgotZXh0ZXJuIGludCBkZWNvZGVfcHJlZml4Nihjb25zdCB1X2NoYXIgKnBkLCBjaGFyICpidWYsIHVfaW50IGJ1Zmxlbik7Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9lbmMuaCBiL2VuYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTRiNGViLi4wMDAwMDAwCi0tLSBhL2VuYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9lbmMuaCx2IDEuMSAyMDAzLzAzLzA4IDA4OjU1OjMzIGd1eSBFeHAgJCAoTEJMKSAqLwotLyogRnJvbSAkT3BlbkJTRDogaWZfZW5jLmgsdiAxLjggMjAwMS8wNi8yNSAwNToxNDowMCBhbmdlbG9zIEV4cCAkICovCi0vKgotICogVGhlIGF1dGhvcnMgb2YgdGhpcyBjb2RlIGFyZSBKb2huIElvYW5uaWRpcyAoamlAdGxhLm9yZyksCi0gKiBBbmdlbG9zIEQuIEtlcm9teXRpcyAoa2VybWl0QGNzZC51Y2guZ3IpIGFuZCAKLSAqIE5pZWxzIFByb3ZvcyAocHJvdm9zQHBoeXNuZXQudW5pLWhhbWJ1cmcuZGUpLgotICoKLSAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiBieSBKb2huIElvYW5uaWRpcyBmb3IgQlNEL09TIGluIEF0aGVucywgR3JlZWNlLCAKLSAqIGluIE5vdmVtYmVyIDE5OTUuCi0gKgotICogUG9ydGVkIHRvIE9wZW5CU0QgYW5kIE5ldEJTRCwgd2l0aCBhZGRpdGlvbmFsIHRyYW5zZm9ybXMsIGluIERlY2VtYmVyIDE5OTYsCi0gKiBieSBBbmdlbG9zIEQuIEtlcm9teXRpcy4KLSAqCi0gKiBBZGRpdGlvbmFsIHRyYW5zZm9ybXMgYW5kIGZlYXR1cmVzIGluIDE5OTcgYW5kIDE5OTggYnkgQW5nZWxvcyBELiBLZXJvbXl0aXMKLSAqIGFuZCBOaWVscyBQcm92b3MuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IGJ5IEpvaG4gSW9hbm5pZGlzLCBBbmdlbG9zIEQuIEtlcm9teXRpcwotICogYW5kIE5pZWxzIFByb3Zvcy4KLSAqIENvcHlyaWdodCAoYykgMjAwMSwgQW5nZWxvcyBELiBLZXJvbXl0aXMuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGFuZCBtb2RpZnkgdGhpcyBzb2Z0d2FyZSB3aXRoIG9yIHdpdGhvdXQgZmVlCi0gKiBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGVudGlyZSBub3RpY2UgaXMgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb2YgYW55IHNvZnR3YXJlIHdoaWNoIGlzIG9yIGluY2x1ZGVzIGEgY29weSBvcgotICogbW9kaWZpY2F0aW9uIG9mIHRoaXMgc29mdHdhcmUuIAotICogWW91IG1heSB1c2UgdGhpcyBjb2RlIHVuZGVyIHRoZSBHTlUgcHVibGljIGxpY2Vuc2UgaWYgeW91IHNvIHdpc2guIFBsZWFzZQotICogY29udHJpYnV0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGF1dGhvcnMgdW5kZXIgdGhpcyBmcmVlciB0aGFuIEdQTCBsaWNlbnNlCi0gKiBzbyB0aGF0IHdlIG1heSBmdXJ0aGVyIHRoZSB1c2Ugb2Ygc3Ryb25nIGVuY3J5cHRpb24gd2l0aG91dCBsaW1pdGF0aW9ucyB0bwotICogYWxsLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgQkVJTkcgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5UWS4gSU4gUEFSVElDVUxBUiwgTk9ORSBPRiBUSEUgQVVUSE9SUyBNQUtFUyBBTlkKLSAqIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIEFOWSBLSU5EIENPTkNFUk5JTkcgVEhFCi0gKiBNRVJDSEFOVEFCSUxJVFkgT0YgVEhJUyBTT0ZUV0FSRSBPUiBJVFMgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKi8KLQotI2RlZmluZSBFTkNfSERSTEVOCTEyCi0KLS8qIEZyb20gJE9wZW5CU0Q6IG1idWYuaCx2IDEuNTYgMjAwMi8wMS8yNSAxNTo1MDoyMyBhcnQgRXhwICQJKi8KLSNkZWZpbmUgTV9DT05GCQkweDA0MDAgIC8qIHBhY2tldCB3YXMgZW5jcnlwdGVkIChFU1AtdHJhbnNwb3J0KSAqLwotI2RlZmluZSBNX0FVVEgJCTB4MDgwMCAgLyogcGFja2V0IHdhcyBhdXRoZW50aWNhdGVkIChBSCkgKi8KLQotc3RydWN0IGVuY2hkciB7Ci0JdV9pbnQzMl90IGFmOwotCXVfaW50MzJfdCBzcGk7Ci0JdV9pbnQzMl90IGZsYWdzOwotfTsKZGlmZiAtLWdpdCBhL2VzcC5oIGIvZXNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Y2RhZGEuLjAwMDAwMDAKLS0tIGEvZXNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgkkTmV0QlNEOiBlc3AuaCx2IDEuMTMgMjAwMC8wOS8yNiAwODozNzozOCBpdG9qdW4gRXhwICQJKi8KLS8qCSRLQU1FOiBlc3AuaCx2IDEuMTUgMjAwMC8wOS8yMCAxODoxNToyMiBpdG9qdW4gRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyoKLSAqIFJGQzE4MjcvMjQwNiBFbmNhcHN1bGF0ZWQgU2VjdXJpdHkgUGF5bG9hZC4KLSAqLwotCi0jaWZuZGVmIF9ORVRJTkVUNl9FU1BfSF8KLSNkZWZpbmUgX05FVElORVQ2X0VTUF9IXwotCi1zdHJ1Y3QgZXNwIHsKLQl1X2ludDMyX3QJZXNwX3NwaTsJLyogRVNQICovCi0JLyp2YXJpYWJsZSBzaXplLCAzMmJpdCBib3VuZCovCS8qIEluaXRpYWxpemF0aW9uIFZlY3RvciAqLwotCS8qdmFyaWFibGUgc2l6ZSovCQkvKiBQYXlsb2FkIGRhdGEgKi8KLQkvKnZhcmlhYmxlIHNpemUqLwkJLyogcGFkZGluZyAqLwotCS8qOGJpdCovCQkJLyogcGFkIHNpemUgKi8KLQkvKjhiaXQqLwkJCS8qIG5leHQgaGVhZGVyICovCi0JLyo4Yml0Ki8JCQkvKiBuZXh0IGhlYWRlciAqLwotCS8qdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhIChuZXcgSVBzZWMpICovCi19OwotCi1zdHJ1Y3QgbmV3ZXNwIHsKLQl1X2ludDMyX3QJZXNwX3NwaTsJLyogRVNQICovCi0JdV9pbnQzMl90CWVzcF9zZXE7CS8qIFNlcXVlbmNlIG51bWJlciAqLwotCS8qdmFyaWFibGUgc2l6ZSovCQkvKiAoSVYgYW5kKSBQYXlsb2FkIGRhdGEgKi8KLQkvKnZhcmlhYmxlIHNpemUqLwkJLyogcGFkZGluZyAqLwotCS8qOGJpdCovCQkJLyogcGFkIHNpemUgKi8KLQkvKjhiaXQqLwkJCS8qIG5leHQgaGVhZGVyICovCi0JLyo4Yml0Ki8JCQkvKiBuZXh0IGhlYWRlciAqLwotCS8qdmFyaWFibGUgc2l6ZSwgMzJiaXQgYm91bmQqLwkvKiBBdXRoZW50aWNhdGlvbiBkYXRhICovCi19OwotCi1zdHJ1Y3QgZXNwdGFpbCB7Ci0JdV9pbnQ4X3QJZXNwX3BhZGxlbjsJLyogcGFkIGxlbmd0aCAqLwotCXVfaW50OF90CWVzcF9ueHQ7CS8qIE5leHQgaGVhZGVyICovCi0JLyp2YXJpYWJsZSBzaXplLCAzMmJpdCBib3VuZCovCS8qIEF1dGhlbnRpY2F0aW9uIGRhdGEgKG5ldyBJUHNlYykqLwotfTsKLQotI2VuZGlmIC8qX05FVElORVQ2X0VTUF9IXyovCmRpZmYgLS1naXQgYS9ldGhlci5oIGIvZXRoZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QzZjNiZS4uMDAwMDAwMAotLS0gYS9ldGhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9ldGhlci5oLHYgMS44IDIwMDIvMTIvMTEgMDc6MTM6NTEgZ3V5IEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIylpZl9ldGhlci5oCTguMyAoQmVya2VsZXkpIDUvMi85NQotICovCi0KLSNkZWZpbmUJRVRIRVJNVFUJMTUwMAotCi0vKgotICogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhbiBldGhlcm5ldCAoTUFDKSBhZGRyZXNzLgotICovCi0jZGVmaW5lCUVUSEVSX0FERFJfTEVOCQk2Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYSBERUMvSW50ZWwvWGVyb3ggb3IgODAyLjMgRXRoZXJuZXQgaGVhZGVyLgotICovCi1zdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKLQl1X2ludDhfdAlldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07Ci0JdV9pbnQ4X3QJZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOwotCXVfaW50MTZfdAlldGhlcl90eXBlOwotfTsKLQotLyoKLSAqIExlbmd0aCBvZiBhIERFQy9JbnRlbC9YZXJveCBvciA4MDIuMyBFdGhlcm5ldCBoZWFkZXI7IG5vdGUgdGhhdCBzb21lCi0gKiBjb21waWxlcnMgbWF5IHBhZCAic3RydWN0IGV0aGVyX2hlYWRlciIgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLAotICogZm9yIGV4YW1wbGUsIHNvICJzaXplb2YgKHN0cnVjdCBldGhlcl9oZWFkZXIpIiBtYXkgbm90IGdpdmUgdGhlIHJpZ2h0Ci0gKiBhbnN3ZXIuCi0gKi8KLSNkZWZpbmUgRVRIRVJfSERSTEVOCQkxNApkaWZmIC0tZ2l0IGEvZXRoZXJ0eXBlLmggYi9ldGhlcnR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkYzhlMi4uMDAwMDAwMAotLS0gYS9ldGhlcnR5cGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9ldGhlcnR5cGUuaCx2IDEuMjQuMi4xIDIwMDUvMDcvMTAgMTQ6NTE6MTAgaGFubmVzIEV4cCAkIChMQkwpCi0gKi8KLQotLyoKLSAqIEV0aGVybmV0IHR5cGVzLgotICoKLSAqIFdlIHdyYXAgdGhlIGRlY2xhcmF0aW9ucyB3aXRoICNpZmRlZiwgc28gdGhhdCBpZiBhIGZpbGUgaW5jbHVkZXMKLSAqIDxuZXRpbmV0L2lmX2V0aGVyLmg+LCB3aGljaCBtYXkgZGVjbGFyZSBzb21lIG9mIHRoZXNlLCB3ZSBkb24ndAotICogZ2V0IGEgYnVuY2ggb2YgY29tcGxhaW50cyBmcm9tIHRoZSBDIGNvbXBpbGVyIGFib3V0IHJlZGVmaW5pdGlvbnMKLSAqIG9mIHRoZXNlIHZhbHVlcy4KLSAqCi0gKiBXZSBkZWNsYXJlIGFsbCBvZiB0aGVtIGhlcmUgc28gdGhhdCBubyBmaWxlIGhhcyB0byBpbmNsdWRlCi0gKiA8bmV0aW5ldC9pZl9ldGhlci5oPiBpZiBhbGwgaXQgbmVlZHMgYXJlIEVUSEVSVFlQRV8gdmFsdWVzLgotICovCi0KLSNpZm5kZWYgRVRIRVJUWVBFX0xFTgotI2RlZmluZSBFVEhFUlRZUEVfTEVOICAgICAgICAgICAyCi0jZW5kaWYKLQotI2lmbmRlZiBFVEhFUlRZUEVfR1JFX0lTTwotI2RlZmluZSBFVEhFUlRZUEVfR1JFX0lTTyAgICAgICAweDAwRkUgIC8qIG5vdCByZWFsbHkgYW4gZXRoZXJ0eXBlIG9ubHkgdXNlZCBpbiBHUkUgKi8KLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfUFVQCi0jZGVmaW5lCUVUSEVSVFlQRV9QVVAJCTB4MDIwMAkvKiBQVVAgcHJvdG9jb2wgKi8KLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfSVAKLSNkZWZpbmUJRVRIRVJUWVBFX0lQCQkweDA4MDAJLyogSVAgcHJvdG9jb2wgKi8KLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfQVJQCi0jZGVmaW5lIEVUSEVSVFlQRV9BUlAJCTB4MDgwNgkvKiBBZGRyLiByZXNvbHV0aW9uIHByb3RvY29sICovCi0jZW5kaWYKLSNpZm5kZWYgRVRIRVJUWVBFX1JFVkFSUAotI2RlZmluZSBFVEhFUlRZUEVfUkVWQVJQCTB4ODAzNQkvKiByZXZlcnNlIEFkZHIuIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfTlMKLSNkZWZpbmUgRVRIRVJUWVBFX05TCQkweDA2MDAKLSNlbmRpZgotI2lmbmRlZglFVEhFUlRZUEVfU1BSSVRFCi0jZGVmaW5lCUVUSEVSVFlQRV9TUFJJVEUJMHgwNTAwCi0jZW5kaWYKLSNpZm5kZWYgRVRIRVJUWVBFX1RSQUlMCi0jZGVmaW5lIEVUSEVSVFlQRV9UUkFJTAkJMHgxMDAwCi0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFX01PUERMCi0jZGVmaW5lCUVUSEVSVFlQRV9NT1BETAkJMHg2MDAxCi0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFX01PUFJDCi0jZGVmaW5lCUVUSEVSVFlQRV9NT1BSQwkJMHg2MDAyCi0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFX0ROCi0jZGVmaW5lCUVUSEVSVFlQRV9ETgkJMHg2MDAzCi0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFX0xBVAotI2RlZmluZQlFVEhFUlRZUEVfTEFUCQkweDYwMDQKLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfU0NBCi0jZGVmaW5lIEVUSEVSVFlQRV9TQ0EJCTB4NjAwNwotI2VuZGlmCi0jaWZuZGVmCUVUSEVSVFlQRV9MQU5CUklER0UKLSNkZWZpbmUJRVRIRVJUWVBFX0xBTkJSSURHRQkweDgwMzgKLSNlbmRpZgotI2lmbmRlZglFVEhFUlRZUEVfREVDRE5TCi0jZGVmaW5lCUVUSEVSVFlQRV9ERUNETlMJMHg4MDNjCi0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFX0RFQ0RUUwotI2RlZmluZQlFVEhFUlRZUEVfREVDRFRTCTB4ODAzZQotI2VuZGlmCi0jaWZuZGVmCUVUSEVSVFlQRV9WRVhQCi0jZGVmaW5lCUVUSEVSVFlQRV9WRVhQCQkweDgwNWIKLSNlbmRpZgotI2lmbmRlZglFVEhFUlRZUEVfVlBST0QKLSNkZWZpbmUJRVRIRVJUWVBFX1ZQUk9ECQkweDgwNWMKLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfQVRBTEsKLSNkZWZpbmUgRVRIRVJUWVBFX0FUQUxLCQkweDgwOWIKLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfQUFSUAotI2RlZmluZSBFVEhFUlRZUEVfQUFSUAkJMHg4MGYzCi0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFXzgwMjFRCi0jZGVmaW5lCUVUSEVSVFlQRV84MDIxUQkJMHg4MTAwCi0jZW5kaWYKLSNpZm5kZWYgRVRIRVJUWVBFX0lQWAotI2RlZmluZSBFVEhFUlRZUEVfSVBYCQkweDgxMzcKLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfSVBWNgotI2RlZmluZSBFVEhFUlRZUEVfSVBWNgkJMHg4NmRkCi0jZW5kaWYKLSNpZm5kZWYgRVRIRVJUWVBFX1BQUAotI2RlZmluZQlFVEhFUlRZUEVfUFBQCQkweDg4MGIKLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfU0xPVwotI2RlZmluZQlFVEhFUlRZUEVfU0xPVwkJMHg4ODA5Ci0jZW5kaWYKLSNpZm5kZWYJRVRIRVJUWVBFX01QTFMKLSNkZWZpbmUJRVRIRVJUWVBFX01QTFMJCTB4ODg0NwotI2VuZGlmCi0jaWZuZGVmCUVUSEVSVFlQRV9NUExTX01VTFRJCi0jZGVmaW5lCUVUSEVSVFlQRV9NUExTX01VTFRJCTB4ODg0OAotI2VuZGlmCi0jaWZuZGVmIEVUSEVSVFlQRV9QUFBPRUQKLSNkZWZpbmUgRVRIRVJUWVBFX1BQUE9FRAkweDg4NjMKLSNlbmRpZgotI2lmbmRlZiBFVEhFUlRZUEVfUFBQT0VTCi0jZGVmaW5lIEVUSEVSVFlQRV9QUFBPRVMJMHg4ODY0Ci0jZW5kaWYKLSNpZm5kZWYgRVRIRVJUWVBFX0pVTUJPCi0jZGVmaW5lIEVUSEVSVFlQRV9KVU1CTyAgICAgICAgIDB4ODg3MAotI2VuZGlmCi0jaWZuZGVmIEVUSEVSVFlQRV9FQVBPTAotI2RlZmluZSBFVEhFUlRZUEVfRUFQT0wgIAkweDg4OGUKLSNlbmRpZgotI2lmbmRlZglFVEhFUlRZUEVfTE9PUEJBQ0sKLSNkZWZpbmUJRVRIRVJUWVBFX0xPT1BCQUNLCTB4OTAwMAotI2VuZGlmCi0jaWZuZGVmCUVUSEVSVFlQRV9WTUFOCi0jZGVmaW5lCUVUSEVSVFlQRV9WTUFOCSAgICAgICAgMHg5MTAwIC8qIEV4dHJlbWUgVk1BTiBQcm90b2NvbCAqLyAKLSNlbmRpZgotI2lmbmRlZglFVEhFUlRZUEVfSVNPCi0jZGVmaW5lCUVUSEVSVFlQRV9JU08gICAgICAgICAgIDB4ZmVmZSAgLyogbm9uc3RhbmRhcmQgLSB1c2VkIGluIENpc2NvIEhETEMgZW5jYXBzdWxhdGlvbiAqLwotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdG9rIGV0aGVydHlwZV92YWx1ZXNbXTsKZGlmZiAtLWdpdCBhL2V4dHJhY3QuaCBiL2V4dHJhY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNkYjI1MC4uMDAwMDAwMAotLS0gYS9leHRyYWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvZXh0cmFjdC5oLHYgMS4yNCAyMDA1LzAxLzE1IDAyOjA2OjUwIGd1eSBFeHAgJCAoTEJMKQotICovCi0KLS8qCi0gKiBNYWNyb3MgdG8gZXh0cmFjdCBwb3NzaWJseS11bmFsaWduZWQgYmlnLWVuZGlhbiBpbnRlZ3JhbCB2YWx1ZXMuCi0gKi8KLSNpZmRlZiBMQkxfQUxJR04KLS8qCi0gKiBUaGUgcHJvY2Vzc29yIGRvZXNuJ3QgbmF0aXZlbHkgaGFuZGxlIHVuYWxpZ25lZCBsb2Fkcy4KLSAqLwotI2lmZGVmIEhBVkVfX19BVFRSSUJVVEVfXwotLyoKLSAqIFdlIGhhdmUgX19hdHRyaWJ1dGVfXzsgd2UgYXNzdW1lIHRoYXQgbWVhbnMgd2UgaGF2ZSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKS4KLSAqIERlY2xhcmUgcGFja2VkIHN0cnVjdHVyZXMgY29udGFpbmluZyBhIHVfaW50MTZfdCBhbmQgYSB1X2ludDMyX3QsCi0gKiBjYXN0IHRoZSBwb2ludGVyIHRvIHBvaW50IHRvIG9uZSBvZiB0aG9zZSwgYW5kIGZldGNoIHRocm91Z2ggaXQ7Ci0gKiB0aGUgR0NDIG1hbnVhbCBkb2Vzbid0IGFwcGVhciB0byBleHBsaWNpdGx5IHNheSB0aGF0Ci0gKiBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBjYXVzZXMgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIHVuYWxpZ25lZC1zYWZlCi0gKiBjb2RlLCBidXQgaXQgYXBwcGVhcnMgdG8gZG8gc28uCi0gKgotICogV2UgZG8gdGhpcyBpbiBjYXNlIHRoZSBjb21waWxlciBjYW4gZ2VuZXJhdGUsIGZvciB0aGlzIGluc3RydWN0aW9uIHNldCwKLSAqIGJldHRlciBjb2RlIHRvIGRvIGFuIHVuYWxpZ25lZCBsb2FkIGFuZCBwYXNzIHN0dWZmIHRvICJudG9ocygpIiBvcgotICogIm50b2hsKCkiIHRoYW4gdGhlIGNvZGUgdG8gZmV0Y2ggdGhlIGJ5dGVzIG9uZSBhdCBhIHRpbWUgYW5kCi0gKiBhc3NlbWJsZSB0aGVtLiAgKFRoYXQgbWlnaHQgbm90IGJlIHRoZSBjYXNlIG9uIGEgbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybSwKLSAqIHdoZXJlICJudG9ocygpIiBhbmQgIm50b2hsKCkiIG1pZ2h0IG5vdCBiZSBkb25lIGlubGluZS4pCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1X2ludDE2X3QJdmFsOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB1bmFsaWduZWRfdV9pbnQxNl90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdV9pbnQzMl90CXZhbDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgdW5hbGlnbmVkX3VfaW50MzJfdDsKLQotI2RlZmluZSBFWFRSQUNUXzE2QklUUyhwKSBcCi0JKCh1X2ludDE2X3QpbnRvaHMoKChjb25zdCB1bmFsaWduZWRfdV9pbnQxNl90ICopKHApKS0+dmFsKSkKLSNkZWZpbmUgRVhUUkFDVF8zMkJJVFMocCkgXAotCSgodV9pbnQzMl90KW50b2hsKCgoY29uc3QgdW5hbGlnbmVkX3VfaW50MzJfdCAqKShwKSktPnZhbCkpCi0jZGVmaW5lIEVYVFJBQ1RfNjRCSVRTKHApIFwKLQkoKHVfaW50NjRfdCkoKCh1X2ludDY0X3QpbnRvaGwoKChjb25zdCB1bmFsaWduZWRfdV9pbnQzMl90ICopKHApICsgMCktPnZhbCkpIDw8IDMyIHwgXAotCQkgICAgICgodV9pbnQ2NF90KW50b2hsKCgoY29uc3QgdW5hbGlnbmVkX3VfaW50MzJfdCAqKShwKSArIDEpLT52YWwpKSA8PCAwKSkKLQotI2Vsc2UgLyogSEFWRV9fX0FUVFJJQlVURV9fICovCi0vKgotICogV2UgZG9uJ3QgaGF2ZSBfX2F0dHJpYnV0ZV9fLCBzbyBkbyB1bmFsaWduZWQgbG9hZHMgb2YgYmlnLWVuZGlhbgotICogcXVhbnRpdGllcyB0aGUgaGFyZCB3YXkgLSBmZXRjaCB0aGUgYnl0ZXMgb25lIGF0IGEgdGltZSBhbmQKLSAqIGFzc2VtYmxlIHRoZW0uCi0gKi8KLSNkZWZpbmUgRVhUUkFDVF8xNkJJVFMocCkgXAotCSgodV9pbnQxNl90KSgodV9pbnQxNl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMCkgPDwgOCB8IFwKLQkJICAgICAodV9pbnQxNl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMSkpKQotI2RlZmluZSBFWFRSQUNUXzMyQklUUyhwKSBcCi0JKCh1X2ludDMyX3QpKCh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAwKSA8PCAyNCB8IFwKLQkJICAgICAodV9pbnQzMl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMSkgPDwgMTYgfCBcCi0JCSAgICAgKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDIpIDw8IDggfCBcCi0JCSAgICAgKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDMpKSkKLSNkZWZpbmUgRVhUUkFDVF82NEJJVFMocCkgXAotCSgodV9pbnQ2NF90KSgodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMCkgPDwgNTYgfCBcCi0JCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDEpIDw8IDQ4IHwgXAotCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAyKSA8PCA0MCB8IFwKLQkJICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMykgPDwgMzIgfCBcCi0JICAgICAgICAgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyA0KSA8PCAyNCB8IFwKLQkJICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgNSkgPDwgMTYgfCBcCi0JCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDYpIDw8IDggfCBcCi0JCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDcpKSkKLSNlbmRpZiAvKiBIQVZFX19fQVRUUklCVVRFX18gKi8KLSNlbHNlIC8qIExCTF9BTElHTiAqLwotLyoKLSAqIFRoZSBwcm9jZXNzb3IgbmF0aXZlbHkgaGFuZGxlcyB1bmFsaWduZWQgbG9hZHMsIHNvIHdlIGNhbiBqdXN0Ci0gKiBjYXN0IHRoZSBwb2ludGVyIGFuZCBmZXRjaCB0aHJvdWdoIGl0LgotICovCi0jZGVmaW5lIEVYVFJBQ1RfMTZCSVRTKHApIFwKLQkoKHVfaW50MTZfdCludG9ocygqKGNvbnN0IHVfaW50MTZfdCAqKShwKSkpCi0jZGVmaW5lIEVYVFJBQ1RfMzJCSVRTKHApIFwKLQkoKHVfaW50MzJfdCludG9obCgqKGNvbnN0IHVfaW50MzJfdCAqKShwKSkpCi0jZGVmaW5lIEVYVFJBQ1RfNjRCSVRTKHApIFwKLQkoKHVfaW50NjRfdCkoKCh1X2ludDY0X3QpbnRvaGwoKigoY29uc3QgdV9pbnQzMl90ICopKHApICsgMCkpKSA8PCAzMiB8IFwKLQkJICAgICAoKHVfaW50NjRfdCludG9obCgqKChjb25zdCB1X2ludDMyX3QgKikocCkgKyAxKSkpIDw8IDApKQotI2VuZGlmIC8qIExCTF9BTElHTiAqLwotCi0jZGVmaW5lIEVYVFJBQ1RfMjRCSVRTKHApIFwKLQkoKHVfaW50MzJfdCkoKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDApIDw8IDE2IHwgXAotCQkgICAgICh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAxKSA8PCA4IHwgXAotCQkgICAgICh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAyKSkpCi0KLS8qCi0gKiBNYWNyb3MgdG8gZXh0cmFjdCBwb3NzaWJseS11bmFsaWduZWQgbGl0dGxlLWVuZGlhbiBpbnRlZ3JhbCB2YWx1ZXMuCi0gKiBYWFggLSBkbyBsb2FkcyBvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzIHRoYXQgc3VwcG9ydCB1bmFsaWduZWQgbG9hZHM/Ci0gKi8KLSNkZWZpbmUgRVhUUkFDVF9MRV84QklUUyhwKSAoKihwKSkKLSNkZWZpbmUgRVhUUkFDVF9MRV8xNkJJVFMocCkgXAotCSgodV9pbnQxNl90KSgodV9pbnQxNl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMSkgPDwgOCB8IFwKLQkJICAgICAodV9pbnQxNl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMCkpKQotI2RlZmluZSBFWFRSQUNUX0xFXzMyQklUUyhwKSBcCi0JKCh1X2ludDMyX3QpKCh1X2ludDMyX3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAzKSA8PCAyNCB8IFwKLQkJICAgICAodV9pbnQzMl90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMikgPDwgMTYgfCBcCi0JCSAgICAgKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDEpIDw8IDggfCBcCi0JCSAgICAgKHVfaW50MzJfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDApKSkKLSNkZWZpbmUgRVhUUkFDVF9MRV82NEJJVFMocCkgXAotCSgodV9pbnQ2NF90KSgodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgNykgPDwgNTYgfCBcCi0JCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDYpIDw8IDQ4IHwgXAotCQkgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyA1KSA8PCA0MCB8IFwKLQkJICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgNCkgPDwgMzIgfCBcCi0JICAgICAgICAgICAgICh1X2ludDY0X3QpKigoY29uc3QgdV9pbnQ4X3QgKikocCkgKyAzKSA8PCAyNCB8IFwKLQkJICAgICAodV9pbnQ2NF90KSooKGNvbnN0IHVfaW50OF90ICopKHApICsgMikgPDwgMTYgfCBcCi0JCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDEpIDw8IDggfCBcCi0JCSAgICAgKHVfaW50NjRfdCkqKChjb25zdCB1X2ludDhfdCAqKShwKSArIDApKSkKZGlmZiAtLWdpdCBhL2ZkZGkuaCBiL2ZkZGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkwYWY0OC4uMDAwMDAwMAotLS0gYS9mZGRpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9mZGRpLmgsdiAxLjExIDIwMDIvMTIvMTEgMDc6MTM6NTEgZ3V5IEV4cCAkIChMQkwpCi0gKi8KLQotLyoKLSAqIEJhc2VkIG9uIFVsdHJpeCBpZl9mZGRpLmgKLSAqLwotCi0vKgotICogVGhpcyBzdHVmZiBzaG91bGQgY29tZSBmcm9tIGEgc3lzdGVtIGhlYWRlciBmaWxlLCBidXQgdGhlcmUncyBubwotICogb2J2aW91c2x5IHBvcnRhYmxlIHdheSB0byBkbyB0aGF0IGFuZCBpdCdzIG5vdCByZWFsbHkgZ29pbmcKLSAqIHRvIGNoYW5nZSBmcm9tIHN5c3RlbSB0byBzeXN0ZW0gKGV4Y2VwdCBmb3IgdGhlIHBhZGRpbmcgYnVzaW5lc3MpLgotICovCi0KLXN0cnVjdCBmZGRpX2hlYWRlciB7Ci0JdV9jaGFyICBmZGRpX2ZjOwkJLyogZnJhbWUgY29udHJvbCAqLwotCXVfY2hhciAgZmRkaV9kaG9zdFs2XTsKLQl1X2NoYXIgIGZkZGlfc2hvc3RbNl07Ci19OwotCi0vKgotICogTGVuZ3RoIG9mIGFuIEZEREkgaGVhZGVyOyBub3RlIHRoYXQgc29tZSBjb21waWxlcnMgbWF5IHBhZAotICogInN0cnVjdCBmZGRpX2hlYWRlciIgdG8gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzLCBmb3IgZXhhbXBsZSwgc28KLSAqICJzaXplb2YgKHN0cnVjdCBmZGRpX2hlYWRlcikiIG1heSBub3QgZ2l2ZSB0aGUgcmlnaHQKLSAqIGFuc3dlci4KLSAqLwotI2RlZmluZSBGRERJX0hEUkxFTiAxMwotCi0vKiBVc2VmdWwgdmFsdWVzIGZvciBmZGRpX2ZjIChmcmFtZSBjb250cm9sKSBmaWVsZCAqLwotCi0vKgotICogRkRESSBGcmFtZSBDb250cm9sIGJpdHMKLSAqLwotI2RlZmluZQlGRERJRkNfQwkJMHg4MAkJLyogQ2xhc3MgYml0ICovCi0jZGVmaW5lCUZERElGQ19MCQkweDQwCQkvKiBBZGRyZXNzIGxlbmd0aCBiaXQgKi8KLSNkZWZpbmUJRkRESUZDX0YJCTB4MzAJCS8qIEZyYW1lIGZvcm1hdCBiaXRzICovCi0jZGVmaW5lCUZERElGQ19aCQkweDBmCQkvKiBDb250cm9sIGJpdHMgKi8KLQotLyoKLSAqIEZEREkgRnJhbWUgQ29udHJvbCB2YWx1ZXMuICg0OC1iaXQgYWRkcmVzc2luZyBvbmx5KS4KLSAqLwotI2RlZmluZQlGRERJRkNfVk9JRAkJMHg0MAkJLyogVm9pZCBmcmFtZSAqLwotI2RlZmluZQlGRERJRkNfTlJUCQkweDgwCQkvKiBOb25yZXN0cmljdGVkIHRva2VuICovCi0jZGVmaW5lCUZERElGQ19SVAkJMHhjMAkJLyogUmVzdHJpY3RlZCB0b2tlbiAqLwotI2RlZmluZQlGRERJRkNfU01UX0lORk8JCTB4NDEJCS8qIFNNVCBJbmZvICovCi0jZGVmaW5lCUZERElGQ19TTVRfTlNBCQkweDRGCQkvKiBTTVQgTmV4dCBzdGF0aW9uIGFkcnMgKi8KLSNkZWZpbmUJRkRESUZDX01BQ19CRUFDT04JMHhjMgkJLyogTUFDIEJlYWNvbiBmcmFtZSAqLwotI2RlZmluZQlGRERJRkNfTUFDX0NMQUlNCTB4YzMJCS8qIE1BQyBDbGFpbSBmcmFtZSAqLwotI2RlZmluZQlGRERJRkNfTExDX0FTWU5DCTB4NTAJCS8qIEFzeW5jLiBMTEMgZnJhbWUgKi8KLSNkZWZpbmUJRkRESUZDX0xMQ19TWU5DCQkweGQwCQkvKiBTeW5jLiBMTEMgZnJhbWUgKi8KLSNkZWZpbmUJRkRESUZDX0lNUF9BU1lOQwkweDYwCQkvKiBJbXBsZW1lbnRvciBBc3luYy4gKi8KLSNkZWZpbmUJRkRESUZDX0lNUF9TWU5DCQkweGUwCQkvKiBJbXBsZW1lbnRvciBTeW5jaC4gKi8KLSNkZWZpbmUgRkRESUZDX1NNVAkJMHg0MAkJLyogU01UIGZyYW1lICovCi0jZGVmaW5lIEZERElGQ19NQUMJCTB4YzAJCS8qIE1BQyBmcmFtZSAqLwotCi0jZGVmaW5lCUZERElGQ19DTEZGCQkweEYwCQkvKiBDbGFzcy9MZW5ndGgvRm9ybWF0IGJpdHMgKi8KLSNkZWZpbmUJRkRESUZDX1paWloJCTB4MEYJCS8qIENvbnRyb2wgYml0cyAqLwpkaWZmIC0tZ2l0IGEvZ21wbHMuYyBiL2dtcGxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNGI5YWUuLjAwMDAwMDAKLS0tIGEvZ21wbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvZ21wbHMuYyx2IDEuNS4yLjEgMjAwNS8wNS8xOSAwNjo0NDowMiBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotLyogcmZjMzQ3MSAqLwotc3RydWN0IHRvayBnbXBsc19saW5rX3Byb3RfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiRXh0cmEgVHJhZmZpYyJ9LAotICAgIHsgMHgwMiwgIlVucHJvdGVjdGVkIn0sCi0gICAgeyAweDA0LCAiU2hhcmVkIn0sCi0gICAgeyAweDA4LCAiRGVkaWNhdGVkIDE6MSJ9LAotICAgIHsgMHgxMCwgIkRlZGljYXRlZCAxKzEifSwKLSAgICB7IDB4MjAsICJFbmhhbmNlZCJ9LAotICAgIHsgMHg0MCwgIlJlc2VydmVkIn0sCi0gICAgeyAweDgwLCAiUmVzZXJ2ZWQifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotLyogcmZjMzQ3MSAqLwotc3RydWN0IHRvayBnbXBsc19zd2l0Y2hfY2FwX3ZhbHVlc1tdID0gewotICAgIHsgMSwJIlBhY2tldC1Td2l0Y2ggQ2FwYWJsZS0xIn0sCi0gICAgeyAyLAkiUGFja2V0LVN3aXRjaCBDYXBhYmxlLTIifSwKLSAgICB7IDMsCSJQYWNrZXQtU3dpdGNoIENhcGFibGUtMyJ9LAotICAgIHsgNCwJIlBhY2tldC1Td2l0Y2ggQ2FwYWJsZS00In0sCi0gICAgeyA1MSwJIkxheWVyLTIgU3dpdGNoIENhcGFibGUifSwKLSAgICB7IDEwMCwJIlRpbWUtRGl2aXNpb24tTXVsdGlwbGV4In0sCi0gICAgeyAxNTAsCSJMYW1iZGEtU3dpdGNoIENhcGFibGUifSwKLSAgICB7IDIwMCwJIkZpYmVyLVN3aXRjaCBDYXBhYmxlIn0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLS8qIHJmYzM0NzEgKi8KLXN0cnVjdCB0b2sgZ21wbHNfZW5jb2RpbmdfdmFsdWVzW10gPSB7Ci0gICAgeyAxLCAgICAiUGFja2V0In0sCi0gICAgeyAyLCAgICAiRXRoZXJuZXQgVjIvRElYIn0sCi0gICAgeyAzLCAgICAiQU5TSS9FVFNJIFBESCJ9LAotICAgIHsgNCwgICAgIlJlc2VydmVkIn0sCi0gICAgeyA1LCAgICAiU0RIIElUVS1UIEcuNzA3L1NPTkVUIEFOU0kgVDEuMTA1In0sCi0gICAgeyA2LCAgICAiUmVzZXJ2ZWQifSwKLSAgICB7IDcsICAgICJEaWdpdGFsIFdyYXBwZXIifSwKLSAgICB7IDgsICAgICJMYW1iZGEgKHBob3RvbmljKSJ9LAotICAgIHsgOSwgICAgIkZpYmVyIn0sCi0gICAgeyAxMCwgICAiUmVzZXJ2ZWQifSwKLSAgICB7IDExLCAgICJGaWJlckNoYW5uZWwifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotLyogcmZjMzQ3MSAqLwotc3RydWN0IHRvayBnbXBsc19wYXlsb2FkX3ZhbHVlc1tdID0gewotICAgIHsgIDAsICAgIlVua25vd24ifSwKLSAgICB7ICAxLCAgICJSZXNlcnZlZCJ9LAotICAgIHsgIDIsICAgIlJlc2VydmVkIn0sCi0gICAgeyAgMywgICAiUmVzZXJ2ZWQifSwKLSAgICB7ICA0LCAgICJSZXNlcnZlZCJ9LAotICAgIHsgIDUsICAgIkFzeW5jaHJvbm91cyBtYXBwaW5nIG9mIEU0In0sCi0gICAgeyAgNiwgICAiQXN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRFMzL1QzIn0sCi0gICAgeyAgNywgICAiQXN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRTMifSwKLSAgICB7ICA4LCAgICJCaXQgc3luY2hyb25vdXMgbWFwcGluZyBvZiBFMyJ9LAotICAgIHsgIDksICAgIkJ5dGUgc3luY2hyb25vdXMgbWFwcGluZyBvZiBFMyJ9LAotICAgIHsgMTAsICAgIkFzeW5jaHJvbm91cyBtYXBwaW5nIG9mIERTMi9UMiJ9LAotICAgIHsgMTEsICAgIkJpdCBzeW5jaHJvbm91cyBtYXBwaW5nIG9mIERTMi9UMiJ9LAotICAgIHsgMTIsICAgIlJlc2VydmVkIn0sCi0gICAgeyAxMywgICAiQXN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRTEifSwKLSAgICB7IDE0LCAgICJCeXRlIHN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRTEifSwKLSAgICB7IDE1LCAgICJCeXRlIHN5bmNocm9ub3VzIG1hcHBpbmcgb2YgMzEgKiBEUzAifSwKLSAgICB7IDE2LCAgICJBc3luY2hyb25vdXMgbWFwcGluZyBvZiBEUzEvVDEifSwKLSAgICB7IDE3LCAgICJCaXQgc3luY2hyb25vdXMgbWFwcGluZyBvZiBEUzEvVDEifSwKLSAgICB7IDE4LCAgICJCeXRlIHN5bmNocm9ub3VzIG1hcHBpbmcgb2YgRFMxL1QxIn0sCi0gICAgeyAxOSwgICAiVkMtMTEgaW4gVkMtMTIifSwKLSAgICB7IDIwLCAgICJSZXNlcnZlZCJ9LAotICAgIHsgMjEsICAgIlJlc2VydmVkIn0sCi0gICAgeyAyMiwgICAiRFMxIFNGIEFzeW5jaHJvbm91cyJ9LAotICAgIHsgMjMsICAgIkRTMSBFU0YgQXN5bmNocm9ub3VzIn0sCi0gICAgeyAyNCwgICAiRFMzIE0yMyBBc3luY2hyb25vdXMifSwKLSAgICB7IDI1LCAgICJEUzMgQy1CaXQgUGFyaXR5IEFzeW5jaHJvbm91cyJ9LAotICAgIHsgMjYsICAgIlZUL0xPVkMifSwKLSAgICB7IDI3LCAgICJTVFMgU1BFL0hPVkMifSwKLSAgICB7IDI4LCAgICJQT1MgLSBObyBTY3JhbWJsaW5nLCAxNiBiaXQgQ1JDIn0sCi0gICAgeyAyOSwgICAiUE9TIC0gTm8gU2NyYW1ibGluZywgMzIgYml0IENSQyJ9LAotICAgIHsgMzAsICAgIlBPUyAtIFNjcmFtYmxpbmcsIDE2IGJpdCBDUkMifSwKLSAgICB7IDMxLCAgICJQT1MgLSBTY3JhbWJsaW5nLCAzMiBiaXQgQ1JDIn0sCi0gICAgeyAzMiwgICAiQVRNIG1hcHBpbmcifSwKLSAgICB7IDMzLCAgICJFdGhlcm5ldCBQSFkifSwKLSAgICB7IDM0LCAgICJTT05FVC9TREgifSwKLSAgICB7IDM1LCAgICJSZXNlcnZlZCAoU09ORVQgZGVwcmVjYXRlZCkifSwKLSAgICB7IDM2LCAgICJEaWdpdGFsIFdyYXBwZXIifSwKLSAgICB7IDM3LCAgICJMYW1iZGEifSwKLSAgICB7IDM4LCAgICJBTlNJL0VUU0kgUERIIn0sCi0gICAgeyAzOSwgICAiUmVzZXJ2ZWQifSwKLSAgICB7IDQwLCAgICJMaW5rIEFjY2VzcyBQcm90b2NvbCBTREggKFguODUgYW5kIFguODYpIn0sCi0gICAgeyA0MSwgICAiRkRESSJ9LAotICAgIHsgNDIsICAgIkRRREIgKEVUU0kgRVRTIDMwMCAyMTYpIn0sCi0gICAgeyA0MywgICAiRmliZXJDaGFubmVsLTMgKFNlcnZpY2VzKSJ9LAotICAgIHsgNDQsICAgIkhETEMifSwKLSAgICB7IDQ1LCAgICJFdGhlcm5ldCBWMi9ESVggKG9ubHkpIn0sCi0gICAgeyA0NiwgICAiRXRoZXJuZXQgODAyLjMgKG9ubHkpIn0sCi0vKiBkcmFmdC1pZXRmLWNjYW1wLWdtcGxzLWc3MDktMDQudHh0ICovCi0gICAgeyA0NywgICAiRy43MDkgT0RVaiJ9LAotICAgIHsgNDgsICAgIkcuNzA5IE9UVWsodikifSwKLSAgICB7IDQ5LCAgICJDQlIvQ0JSYSJ9LAotICAgIHsgNTAsICAgIkNCUmIifSwKLSAgICB7IDUxLCAgICJCU09UIn0sCi0gICAgeyA1MiwgICAiQlNOVCJ9LAotICAgIHsgNTMsICAgIklQL1BQUCAoR0ZQKSJ9LAotICAgIHsgNTQsICAgIkV0aGVybmV0IE1BQyAoZnJhbWVkIEdGUCkifSwKLSAgICB7IDU1LCAgICJFdGhlcm5ldCBQSFkgKHRyYW5zcGFyZW50IEdGUCkifSwKLSAgICB7IDU2LCAgICJFU0NPTiJ9LAotICAgIHsgNTcsICAgIkZJQ09OIn0sCi0gICAgeyA1OCwgICAiRmliZXIgQ2hhbm5lbCJ9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0vKiAKLSAqIExpbmsgVHlwZSB2YWx1ZXMgdXNlZCBieSBMTVAgU2VydmljZSBEaXNjb3ZlcnkgKHNwZWNpZmljYWxseSwgdGhlIENsaWVudCAKLSAqIFBvcnQgU2VydmljZSBBdHRyaWJ1dGVzIE9iamVjdCkuIFNlZSBVTkkgMS4wIHNlY3Rpb24gOS40LjIgZm9yIGRldGFpbHMuCi0gKi8KLXN0cnVjdCB0b2sgbG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2FfbGlua190eXBlX3ZhbHVlc1tdID0gewotICAgIHsgNSwgIlNESCBJVFUtVCBHLjcwNyJ9LAotICAgIHsgNiwgIlNPTkVUIEFOU0kgVDEuMTA1In0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotLyogCi0gKiBTaWduYWwgVHlwZSB2YWx1ZXMgZm9yIFNESCBsaW5rcyB1c2VkIGJ5IExNUCBTZXJ2aWNlIERpc2NvdmVyeSAoc3BlY2lmaWNhbGx5LCAKLSAqIHRoZSBDbGllbnQgUG9ydCBTZXJ2aWNlIEF0dHJpYnV0ZXMgT2JqZWN0KS4gU2VlIFVOSSAxLjAgc2VjdGlvbiA5LjQuMiBmb3IgCi0gKiBkZXRhaWxzLgotICovCi1zdHJ1Y3QgdG9rIGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX3NpZ25hbF90eXBlX3NkaF92YWx1ZXNbXSA9IHsKLSAgICB7IDUsICAiVkMtMyJ9LAotICAgIHsgNiwgICJWQy00In0sCi0gICAgeyA3LCAgIlNUTS0wIn0sCi0gICAgeyA4LCAgIlNUTS0xIn0sCi0gICAgeyA5LCAgIlNUTS00In0sCi0gICAgeyAxMCwgIlNUTS0xNiJ9LAotICAgIHsgMTEsICJTVE0tNjQifSwKLSAgICB7IDEyLCAiU1RNLTI1NiJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIAotICogU2lnbmFsIFR5cGUgdmFsdWVzIGZvciBTT05FVCBsaW5rcyB1c2VkIGJ5IExNUCBTZXJ2aWNlIERpc2NvdmVyeSAoc3BlY2lmaWNhbGx5LCAKLSAqIHRoZSBDbGllbnQgUG9ydCBTZXJ2aWNlIEF0dHJpYnV0ZXMgT2JqZWN0KS4gU2VlIFVOSSAxLjAgc2VjdGlvbiA5LjQuMiBmb3IgCi0gKiBkZXRhaWxzLgotICovCi1zdHJ1Y3QgdG9rIGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX3NpZ25hbF90eXBlX3NvbmV0X3ZhbHVlc1tdID0gewotICAgIHsgNSwgICJTVFMtMSBTUEUifSwKLSAgICB7IDYsICAiU1RTLTNjIFNQRSJ9LAotICAgIHsgNywgICJTVFMtMSJ9LAotICAgIHsgOCwgICJTVE0tMyJ9LAotICAgIHsgOSwgICJTVE0tMTIifSwKLSAgICB7IDEwLCAiU1RNLTQ4In0sCi0gICAgeyAxMSwgIlNUTS0xOTIifSwKLSAgICB7IDEyLCAiU1RNLTc2OCJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgRElGRlNFUlZfQkNfTU9ERUxfUkRNICAgICAgICAgICAwICAgLyogZHJhZnQtaWV0Zi10ZXdnLWRpZmYtdGUtcHJvdG8tMDcgKi8KLSNkZWZpbmUgRElGRlNFUlZfQkNfTU9ERUxfTUFNICAgICAgICAgICAxICAgLyogZHJhZnQtaWV0Zi10ZXdnLWRpZmYtdGUtcHJvdG8tMDcgKi8gCi0jZGVmaW5lIERJRkZTRVJWX0JDX01PREVMX0VYVERfTUFNICAgICAgMjU0IC8qIGV4cGVyaW1lbnRhbCAqLwotCi1zdHJ1Y3QgdG9rIGRpZmZzZXJ2X3RlX2JjX3ZhbHVlc1tdID0gewotICAgIHsgIERJRkZTRVJWX0JDX01PREVMX1JETSwgIlJ1c3NpYW4gZG9sbHMifSwKLSAgICB7ICBESUZGU0VSVl9CQ19NT0RFTF9NQU0sICJNYXhpbXVtIGFsbG9jYXRpb24ifSwKLSAgICB7ICBESUZGU0VSVl9CQ19NT0RFTF9FWFREX01BTSwgIk1heGltdW0gYWxsb2NhdGlvbiB3aXRoIEUtTFNQIHN1cHBvcnQifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKZGlmZiAtLWdpdCBhL2dtcGxzLmggYi9nbXBscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNmMDUxLi4wMDAwMDAwCi0tLSBhL2dtcGxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2dtcGxzLmgsdiAxLjMuMi4xIDIwMDUvMDUvMTkgMDY6NDQ6MDMgZ3V5IEV4cCAkIChMQkwpICovCi0vKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKi8KLQotZXh0ZXJuIHN0cnVjdCB0b2sgZ21wbHNfbGlua19wcm90X3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgZ21wbHNfc3dpdGNoX2NhcF92YWx1ZXNbXTsKLWV4dGVybiBzdHJ1Y3QgdG9rIGdtcGxzX2VuY29kaW5nX3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgZ21wbHNfcGF5bG9hZF92YWx1ZXNbXTsKLWV4dGVybiBzdHJ1Y3QgdG9rIGRpZmZzZXJ2X3RlX2JjX3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgbG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2FfbGlua190eXBlX3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgbG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2Ffc2lnbmFsX3R5cGVfc2RoX3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgbG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2Ffc2lnbmFsX3R5cGVfc29uZXRfdmFsdWVzW107CmRpZmYgLS1naXQgYS9nbXQybG9jYWwuYyBiL2dtdDJsb2NhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjZlODZjLi4wMDAwMDAwCi0tLSBhL2dtdDJsb2NhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2dtdDJsb2NhbC5jLHYgMS45IDIwMDMvMTEvMTYgMDk6MzY6MDkgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAotI2luY2x1ZGUgIm9zLXByb3RvLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImdtdDJsb2NhbC5oIgotCi0vKgotICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGdtdCBhbmQgbG9jYWwgdGltZSBpbiBzZWNvbmRzLgotICogVXNlIGdtdGltZSgpIGFuZCBsb2NhbHRpbWUoKSB0byBrZWVwIHRoaW5ncyBzaW1wbGUuCi0gKi8KLWludDMyX3QKLWdtdDJsb2NhbCh0aW1lX3QgdCkKLXsKLQlyZWdpc3RlciBpbnQgZHQsIGRpcjsKLQlyZWdpc3RlciBzdHJ1Y3QgdG0gKmdtdCwgKmxvYzsKLQlzdHJ1Y3QgdG0gc2dtdDsKLQotCWlmICh0ID09IDApCi0JCXQgPSB0aW1lKE5VTEwpOwotCWdtdCA9ICZzZ210OwotCSpnbXQgPSAqZ210aW1lKCZ0KTsKLQlsb2MgPSBsb2NhbHRpbWUoJnQpOwotCWR0ID0gKGxvYy0+dG1faG91ciAtIGdtdC0+dG1faG91cikgKiA2MCAqIDYwICsKLQkgICAgKGxvYy0+dG1fbWluIC0gZ210LT50bV9taW4pICogNjA7Ci0KLQkvKgotCSAqIElmIHRoZSB5ZWFyIG9yIGp1bGlhbiBkYXkgaXMgZGlmZmVyZW50LCB3ZSBzcGFuIDAwOjAwIEdNVAotCSAqIGFuZCBtdXN0IGFkZCBvciBzdWJ0cmFjdCBhIGRheS4gQ2hlY2sgdGhlIHllYXIgZmlyc3QgdG8KLQkgKiBhdm9pZCBwcm9ibGVtcyB3aGVuIHRoZSBqdWxpYW4gZGF5IHdyYXBzLgotCSAqLwotCWRpciA9IGxvYy0+dG1feWVhciAtIGdtdC0+dG1feWVhcjsKLQlpZiAoZGlyID09IDApCi0JCWRpciA9IGxvYy0+dG1feWRheSAtIGdtdC0+dG1feWRheTsKLQlkdCArPSBkaXIgKiAyNCAqIDYwICogNjA7Ci0KLQlyZXR1cm4gKGR0KTsKLX0KZGlmZiAtLWdpdCBhL2dtdDJsb2NhbC5oIGIvZ210MmxvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjBlOTYuLjAwMDAwMDAKLS0tIGEvZ210MmxvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9nbXQybG9jYWwuaCx2IDEuMi4xLjEgMTk5OS8xMC8wNyAyMzo0NzoxMCBtY3IgRXhwICQgKExCTCkKLSAqLwotI2lmbmRlZiBnbXQybG9jYWxfaAotI2RlZmluZSBnbXQybG9jYWxfaAotCi1pbnQzMl90IGdtdDJsb2NhbCh0aW1lX3QpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pY21wNi5oIGIvaWNtcDYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhNTFlMy4uMDAwMDAwMAotLS0gYS9pY21wNi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaWNtcDYuaCx2IDEuMTYuMi4xIDIwMDUvMDkvMDUgMDk6Mjk6MjggZ3V5IEV4cCAkIChMQkwpICovCi0vKgkkTmV0QlNEOiBpY21wNi5oLHYgMS4xMyAyMDAwLzA4LzAzIDE2OjMwOjM3IGl0b2p1biBFeHAgJAkqLwotLyoJJEtBTUU6IGljbXA2LmgsdiAxLjIyIDIwMDAvMDgvMDMgMTU6MjU6MTYgamlubWVpIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKWlwX2ljbXAuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCi0gKi8KLQotI2lmbmRlZiBfTkVUSU5FVF9JQ01QNl9IXwotI2RlZmluZSBfTkVUSU5FVF9JQ01QNl9IXwotCi1zdHJ1Y3QgaWNtcDZfaGRyIHsKLQl1X2ludDhfdAlpY21wNl90eXBlOwkvKiB0eXBlIGZpZWxkICovCi0JdV9pbnQ4X3QJaWNtcDZfY29kZTsJLyogY29kZSBmaWVsZCAqLwotCXVfaW50MTZfdAlpY21wNl9ja3N1bTsJLyogY2hlY2tzdW0gZmllbGQgKi8KLQl1bmlvbiB7Ci0JCXVfaW50MzJfdAlpY21wNl91bl9kYXRhMzJbMV07IC8qIHR5cGUtc3BlY2lmaWMgZmllbGQgKi8KLQkJdV9pbnQxNl90CWljbXA2X3VuX2RhdGExNlsyXTsgLyogdHlwZS1zcGVjaWZpYyBmaWVsZCAqLwotCQl1X2ludDhfdAlpY21wNl91bl9kYXRhOFs0XTsgIC8qIHR5cGUtc3BlY2lmaWMgZmllbGQgKi8KLQl9IGljbXA2X2RhdGF1bjsKLX07Ci0KLSNkZWZpbmUgaWNtcDZfZGF0YTMyCWljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhMzIKLSNkZWZpbmUgaWNtcDZfZGF0YTE2CWljbXA2X2RhdGF1bi5pY21wNl91bl9kYXRhMTYKLSNkZWZpbmUgaWNtcDZfZGF0YTgJaWNtcDZfZGF0YXVuLmljbXA2X3VuX2RhdGE4Ci0jZGVmaW5lIGljbXA2X3BwdHIJaWNtcDZfZGF0YTMyWzBdCQkvKiBwYXJhbWV0ZXIgcHJvYiAqLwotI2RlZmluZSBpY21wNl9tdHUJaWNtcDZfZGF0YTMyWzBdCQkvKiBwYWNrZXQgdG9vIGJpZyAqLwotI2RlZmluZSBpY21wNl9pZAlpY21wNl9kYXRhMTZbMF0JCS8qIGVjaG8gcmVxdWVzdC9yZXBseSAqLwotI2RlZmluZSBpY21wNl9zZXEJaWNtcDZfZGF0YTE2WzFdCQkvKiBlY2hvIHJlcXVlc3QvcmVwbHkgKi8KLSNkZWZpbmUgaWNtcDZfbWF4ZGVsYXkJaWNtcDZfZGF0YTE2WzBdCQkvKiBtY2FzdCBncm91cCBtZW1iZXJzaGlwICovCi0KLSNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0gJCTEJLyogZGVzdCB1bnJlYWNoYWJsZSwgY29kZXM6ICovCi0jZGVmaW5lIElDTVA2X1BBQ0tFVF9UT09fQklHCQkyCS8qIHBhY2tldCB0b28gYmlnICovCi0jZGVmaW5lIElDTVA2X1RJTUVfRVhDRUVERUQJCTMJLyogdGltZSBleGNlZWRlZCwgY29kZTogKi8KLSNkZWZpbmUgSUNNUDZfUEFSQU1fUFJPQgkJNAkvKiBpcDYgaGVhZGVyIGJhZCAqLwotCi0jZGVmaW5lIElDTVA2X0VDSE9fUkVRVUVTVAkJMTI4CS8qIGVjaG8gc2VydmljZSAqLwotI2RlZmluZSBJQ01QNl9FQ0hPX1JFUExZCQkxMjkJLyogZWNobyByZXBseSAqLwotI2RlZmluZSBJQ01QNl9NRU1CRVJTSElQX1FVRVJZCQkxMzAJLyogZ3JvdXAgbWVtYmVyc2hpcCBxdWVyeSAqLwotI2RlZmluZSBNTEQ2X0xJU1RFTkVSX1FVRVJZCQkxMzAgCS8qIG11bHRpY2FzdCBsaXN0ZW5lciBxdWVyeSAqLwotI2RlZmluZSBJQ01QNl9NRU1CRVJTSElQX1JFUE9SVAkJMTMxCS8qIGdyb3VwIG1lbWJlcnNoaXAgcmVwb3J0ICovCi0jZGVmaW5lIE1MRDZfTElTVEVORVJfUkVQT1JUCQkxMzEJLyogbXVsdGljYXN0IGxpc3RlbmVyIHJlcG9ydCAqLwotI2RlZmluZSBJQ01QNl9NRU1CRVJTSElQX1JFRFVDVElPTgkxMzIJLyogZ3JvdXAgbWVtYmVyc2hpcCB0ZXJtaW5hdGlvbiAqLwotI2RlZmluZSBNTEQ2X0xJU1RFTkVSX0RPTkUJCTEzMgkvKiBtdWx0aWNhc3QgbGlzdGVuZXIgZG9uZSAqLwotCi0jZGVmaW5lIE5EX1JPVVRFUl9TT0xJQ0lUCQkxMzMJLyogcm91dGVyIHNvbGljaXRhdGlvbiAqLwotI2RlZmluZSBORF9ST1VURVJfQURWRVJUCQkxMzQJLyogcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KLSNkZWZpbmUgTkRfTkVJR0hCT1JfU09MSUNJVAkJMTM1CS8qIG5laWdoYm9yIHNvbGljaXRhdGlvbiAqLwotI2RlZmluZSBORF9ORUlHSEJPUl9BRFZFUlQJCTEzNgkvKiBuZWlnaGJvciBhZHZlcnRpc2VtZW50ICovCi0jZGVmaW5lIE5EX1JFRElSRUNUCQkJMTM3CS8qIHJlZGlyZWN0ICovCi0KLSNkZWZpbmUgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HCTEzOAkvKiByb3V0ZXIgcmVudW1iZXJpbmcgKi8KLQotI2RlZmluZSBJQ01QNl9XUlVSRVFVRVNUCQkxMzkJLyogd2hvIGFyZSB5b3UgcmVxdWVzdCAqLwotI2RlZmluZSBJQ01QNl9XUlVSRVBMWQkJCTE0MAkvKiB3aG8gYXJlIHlvdSByZXBseSAqLwotI2RlZmluZSBJQ01QNl9GUUROX1FVRVJZCQkxMzkJLyogRlFETiBxdWVyeSAqLwotI2RlZmluZSBJQ01QNl9GUUROX1JFUExZCQkxNDAJLyogRlFETiByZXBseSAqLwotI2RlZmluZSBJQ01QNl9OSV9RVUVSWQkJCTEzOQkvKiBub2RlIGluZm9ybWF0aW9uIHJlcXVlc3QgKi8KLSNkZWZpbmUgSUNNUDZfTklfUkVQTFkJCQkxNDAJLyogbm9kZSBpbmZvcm1hdGlvbiByZXBseSAqLwotI2RlZmluZSBJTkRfU09MSUNJVAkJCTE0MQkvKiBpbnZlcnNlIG5laWdoYm9yIHNvbGljaXRhdGlvbiAqLwotI2RlZmluZSBJTkRfQURWRVJUCQkJMTQyCS8qIGludmVyc2UgbmVpZ2hib3IgYWR2ZXJ0aXNlbWVudCAqLwotCi0jZGVmaW5lIElDTVA2X1YyX01FTUJFUlNISVBfUkVQT1JUCTE0MwkvKiB2MiBtZW1iZXJzaGlwIHJlcG9ydCAqLwotI2RlZmluZSBNTERWMl9MSVNURU5FUl9SRVBPUlQJCTE0MwkvKiB2MiBtdWx0aWNhc3QgbGlzdGVuZXIgcmVwb3J0ICovCi0jZGVmaW5lIElDTVA2X0hBRElTQ09WX1JFUVVFU1QJCTE0NAotI2RlZmluZSBJQ01QNl9IQURJU0NPVl9SRVBMWQkJMTQ1Ci0jZGVmaW5lIElDTVA2X01PQklMRVBSRUZJWF9TT0xJQ0lUCTE0NgotI2RlZmluZSBJQ01QNl9NT0JJTEVQUkVGSVhfQURWRVJUCTE0NwotCi0jZGVmaW5lIE1MRDZfTVRSQUNFX1JFU1AJCTIwMAkvKiBtdHJhY2UgcmVzcG9uc2UodG8gc2VuZGVyKSAqLwotI2RlZmluZSBNTEQ2X01UUkFDRQkJCTIwMQkvKiBtdHJhY2UgbWVzc2FnZXMgKi8KLQotI2RlZmluZSBJQ01QNl9NQVhUWVBFCQkJMjAxCi0KLSNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURQkwCS8qIG5vIHJvdXRlIHRvIGRlc3RpbmF0aW9uICovCi0jZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX0FETUlOCSAJMQkvKiBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWQgKi8KLSNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfTk9UTkVJR0hCT1IJMgkvKiBub3QgYSBuZWlnaGJvcihvYnNvbGV0ZSkgKi8KLSNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfQkVZT05EU0NPUEUJMgkvKiBiZXlvbmQgc2NvcGUgb2Ygc291cmNlIGFkZHJlc3MgKi8KLSNkZWZpbmUgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUgkJMwkvKiBhZGRyZXNzIHVucmVhY2hhYmxlICovCi0jZGVmaW5lIElDTVA2X0RTVF9VTlJFQUNIX05PUE9SVAk0CS8qIHBvcnQgdW5yZWFjaGFibGUgKi8KLQotI2RlZmluZSBJQ01QNl9USU1FX0VYQ0VFRF9UUkFOU0lUIAkwCS8qIHR0bD09MCBpbiB0cmFuc2l0ICovCi0jZGVmaW5lIElDTVA2X1RJTUVfRVhDRUVEX1JFQVNTRU1CTFkJMQkvKiB0dGw9PTAgaW4gcmVhc3MgKi8KLQotI2RlZmluZSBJQ01QNl9QQVJBTVBST0JfSEVBREVSIAkgCTAJLyogZXJyb25lb3VzIGhlYWRlciBmaWVsZCAqLwotI2RlZmluZSBJQ01QNl9QQVJBTVBST0JfTkVYVEhFQURFUgkxCS8qIHVucmVjb2duaXplZCBuZXh0IGhlYWRlciAqLwotI2RlZmluZSBJQ01QNl9QQVJBTVBST0JfT1BUSU9OCQkyCS8qIHVucmVjb2duaXplZCBvcHRpb24gKi8KLQotI2RlZmluZSBJQ01QNl9JTkZPTVNHX01BU0sJCTB4ODAJLyogYWxsIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMgKi8KLQotI2RlZmluZSBJQ01QNl9OSV9TVUJKX0lQVjYJMAkvKiBRdWVyeSBTdWJqZWN0IGlzIGFuIElQdjYgYWRkcmVzcyAqLwotI2RlZmluZSBJQ01QNl9OSV9TVUJKX0ZRRE4JMQkvKiBRdWVyeSBTdWJqZWN0IGlzIGEgRG9tYWluIG5hbWUgKi8KLSNkZWZpbmUgSUNNUDZfTklfU1VCSl9JUFY0CTIJLyogUXVlcnkgU3ViamVjdCBpcyBhbiBJUHY0IGFkZHJlc3MgKi8KLQotI2RlZmluZSBJQ01QNl9OSV9TVUNDRVNTCTAJLyogbm9kZSBpbmZvcm1hdGlvbiBzdWNjZXNzZnVsIHJlcGx5ICovCi0jZGVmaW5lIElDTVA2X05JX1JFRlVTRUQJMQkvKiBub2RlIGluZm9ybWF0aW9uIHJlcXVlc3QgaXMgcmVmdXNlZCAqLwotI2RlZmluZSBJQ01QNl9OSV9VTktOT1dOCTIJLyogdW5rbm93biBRdHlwZSAqLwotCi0jZGVmaW5lIElDTVA2X1JPVVRFUl9SRU5VTUJFUklOR19DT01NQU5EICAwCS8qIHJyIGNvbW1hbmQgKi8KLSNkZWZpbmUgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HX1JFU1VMVCAgIDEJLyogcnIgcmVzdWx0ICovCi0jZGVmaW5lIElDTVA2X1JPVVRFUl9SRU5VTUJFUklOR19TRVFOVU1fUkVTRVQgICAyNTUJLyogcnIgc2VxIG51bSByZXNldCAqLwotCi0vKiBVc2VkIGluIGtlcm5lbCBvbmx5ICovCi0jZGVmaW5lIE5EX1JFRElSRUNUX09OTElOSwkwCS8qIHJlZGlyZWN0IHRvIGFuIG9uLWxpbmsgbm9kZSAqLwotI2RlZmluZSBORF9SRURJUkVDVF9ST1VURVIJMQkvKiByZWRpcmVjdCB0byBhIGJldHRlciByb3V0ZXIgKi8KLQotLyoKLSAqIE11bHRpY2FzdCBMaXN0ZW5lciBEaXNjb3ZlcnkKLSAqLwotc3RydWN0IG1sZDZfaGRyIHsKLQlzdHJ1Y3QgaWNtcDZfaGRyCW1sZDZfaGRyOwotCXN0cnVjdCBpbjZfYWRkcgkJbWxkNl9hZGRyOyAvKiBtdWx0aWNhc3QgYWRkcmVzcyAqLwotfTsKLQotI2RlZmluZSBtbGQ2X3R5cGUJbWxkNl9oZHIuaWNtcDZfdHlwZQotI2RlZmluZSBtbGQ2X2NvZGUJbWxkNl9oZHIuaWNtcDZfY29kZQotI2RlZmluZSBtbGQ2X2Nrc3VtCW1sZDZfaGRyLmljbXA2X2Nrc3VtCi0jZGVmaW5lIG1sZDZfbWF4ZGVsYXkJbWxkNl9oZHIuaWNtcDZfZGF0YTE2WzBdCi0jZGVmaW5lIG1sZDZfcmVzZXJ2ZWQJbWxkNl9oZHIuaWNtcDZfZGF0YTE2WzFdCi0KLSNkZWZpbmUgTUxEX01JTkxFTgkyNAotI2RlZmluZSBNTERWMl9NSU5MRU4JMjgKLQotLyoKLSAqIE5laWdoYm9yIERpc2NvdmVyeQotICovCi0KLXN0cnVjdCBuZF9yb3V0ZXJfc29saWNpdCB7CS8qIHJvdXRlciBzb2xpY2l0YXRpb24gKi8KLQlzdHJ1Y3QgaWNtcDZfaGRyIAluZF9yc19oZHI7Ci0JLyogY291bGQgYmUgZm9sbG93ZWQgYnkgb3B0aW9ucyAqLwotfTsKLQotI2RlZmluZSBuZF9yc190eXBlCW5kX3JzX2hkci5pY21wNl90eXBlCi0jZGVmaW5lIG5kX3JzX2NvZGUJbmRfcnNfaGRyLmljbXA2X2NvZGUKLSNkZWZpbmUgbmRfcnNfY2tzdW0JbmRfcnNfaGRyLmljbXA2X2Nrc3VtCi0jZGVmaW5lIG5kX3JzX3Jlc2VydmVkCW5kX3JzX2hkci5pY21wNl9kYXRhMzJbMF0KLQotc3RydWN0IG5kX3JvdXRlcl9hZHZlcnQgewkvKiByb3V0ZXIgYWR2ZXJ0aXNlbWVudCAqLwotCXN0cnVjdCBpY21wNl9oZHIJbmRfcmFfaGRyOwotCXVfaW50MzJfdAkJbmRfcmFfcmVhY2hhYmxlOwkvKiByZWFjaGFibGUgdGltZSAqLwotCXVfaW50MzJfdAkJbmRfcmFfcmV0cmFuc21pdDsJLyogcmV0cmFuc21pdCB0aW1lciAqLwotCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KLX07Ci0KLSNkZWZpbmUgbmRfcmFfdHlwZQkJbmRfcmFfaGRyLmljbXA2X3R5cGUKLSNkZWZpbmUgbmRfcmFfY29kZQkJbmRfcmFfaGRyLmljbXA2X2NvZGUKLSNkZWZpbmUgbmRfcmFfY2tzdW0JCW5kX3JhX2hkci5pY21wNl9ja3N1bQotI2RlZmluZSBuZF9yYV9jdXJob3BsaW1pdAluZF9yYV9oZHIuaWNtcDZfZGF0YThbMF0KLSNkZWZpbmUgbmRfcmFfZmxhZ3NfcmVzZXJ2ZWQJbmRfcmFfaGRyLmljbXA2X2RhdGE4WzFdCi0jZGVmaW5lIE5EX1JBX0ZMQUdfTUFOQUdFRAkweDgwCi0jZGVmaW5lIE5EX1JBX0ZMQUdfT1RIRVIJMHg0MAotI2RlZmluZSBORF9SQV9GTEFHX0hPTUVfQUdFTlQJMHgyMAotCi0vKgotICogUm91dGVyIHByZWZlcmVuY2UgdmFsdWVzIGJhc2VkIG9uIGRyYWZ0LWRyYXZlcy1pcG5nd2ctcm91dGVyLXNlbGVjdGlvbi0wMS4KLSAqIFRoZXNlIGFyZSBub24tc3RhbmRhcmQgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgTkRfUkFfRkxBR19SVFBSRUZfTUFTSwkweDE4IC8qIDAwMDExMDAwICovCi0KLSNkZWZpbmUgTkRfUkFfRkxBR19SVFBSRUZfSElHSAkweDA4IC8qIDAwMDAxMDAwICovCi0jZGVmaW5lIE5EX1JBX0ZMQUdfUlRQUkVGX01FRElVTQkweDAwIC8qIDAwMDAwMDAwICovCi0jZGVmaW5lIE5EX1JBX0ZMQUdfUlRQUkVGX0xPVwkweDE4IC8qIDAwMDExMDAwICovCi0jZGVmaW5lIE5EX1JBX0ZMQUdfUlRQUkVGX1JTVgkweDEwIC8qIDAwMDEwMDAwICovCi0KLSNkZWZpbmUgbmRfcmFfcm91dGVyX2xpZmV0aW1lCW5kX3JhX2hkci5pY21wNl9kYXRhMTZbMV0KLQotc3RydWN0IG5kX25laWdoYm9yX3NvbGljaXQgewkvKiBuZWlnaGJvciBzb2xpY2l0YXRpb24gKi8KLQlzdHJ1Y3QgaWNtcDZfaGRyCW5kX25zX2hkcjsKLQlzdHJ1Y3QgaW42X2FkZHIJCW5kX25zX3RhcmdldDsJLyp0YXJnZXQgYWRkcmVzcyAqLwotCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KLX07Ci0KLSNkZWZpbmUgbmRfbnNfdHlwZQkJbmRfbnNfaGRyLmljbXA2X3R5cGUKLSNkZWZpbmUgbmRfbnNfY29kZQkJbmRfbnNfaGRyLmljbXA2X2NvZGUKLSNkZWZpbmUgbmRfbnNfY2tzdW0JCW5kX25zX2hkci5pY21wNl9ja3N1bQotI2RlZmluZSBuZF9uc19yZXNlcnZlZAkJbmRfbnNfaGRyLmljbXA2X2RhdGEzMlswXQotCi1zdHJ1Y3QgbmRfbmVpZ2hib3JfYWR2ZXJ0IHsJLyogbmVpZ2hib3IgYWR2ZXJ0aXNlbWVudCAqLwotCXN0cnVjdCBpY21wNl9oZHIJbmRfbmFfaGRyOwotCXN0cnVjdCBpbjZfYWRkcgkJbmRfbmFfdGFyZ2V0OwkvKiB0YXJnZXQgYWRkcmVzcyAqLwotCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KLX07Ci0KLSNkZWZpbmUgbmRfbmFfdHlwZQkJbmRfbmFfaGRyLmljbXA2X3R5cGUKLSNkZWZpbmUgbmRfbmFfY29kZQkJbmRfbmFfaGRyLmljbXA2X2NvZGUKLSNkZWZpbmUgbmRfbmFfY2tzdW0JCW5kX25hX2hkci5pY21wNl9ja3N1bQotI2RlZmluZSBuZF9uYV9mbGFnc19yZXNlcnZlZAluZF9uYV9oZHIuaWNtcDZfZGF0YTMyWzBdCi0KLSNkZWZpbmUgTkRfTkFfRkxBR19ST1VURVIJCTB4ODAwMDAwMDAKLSNkZWZpbmUgTkRfTkFfRkxBR19TT0xJQ0lURUQJCTB4NDAwMDAwMDAKLSNkZWZpbmUgTkRfTkFfRkxBR19PVkVSUklERQkJMHgyMDAwMDAwMAotCi1zdHJ1Y3QgbmRfcmVkaXJlY3QgewkJLyogcmVkaXJlY3QgKi8KLQlzdHJ1Y3QgaWNtcDZfaGRyCW5kX3JkX2hkcjsKLQlzdHJ1Y3QgaW42X2FkZHIJCW5kX3JkX3RhcmdldDsJLyogdGFyZ2V0IGFkZHJlc3MgKi8KLQlzdHJ1Y3QgaW42X2FkZHIJCW5kX3JkX2RzdDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLwotCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KLX07Ci0KLSNkZWZpbmUgbmRfcmRfdHlwZQkJbmRfcmRfaGRyLmljbXA2X3R5cGUKLSNkZWZpbmUgbmRfcmRfY29kZQkJbmRfcmRfaGRyLmljbXA2X2NvZGUKLSNkZWZpbmUgbmRfcmRfY2tzdW0JCW5kX3JkX2hkci5pY21wNl9ja3N1bQotI2RlZmluZSBuZF9yZF9yZXNlcnZlZAkJbmRfcmRfaGRyLmljbXA2X2RhdGEzMlswXQotCi1zdHJ1Y3QgbmRfb3B0X2hkciB7CQkvKiBOZWlnaGJvciBkaXNjb3Zlcnkgb3B0aW9uIGhlYWRlciAqLwotCXVfaW50OF90CW5kX29wdF90eXBlOwotCXVfaW50OF90CW5kX29wdF9sZW47Ci0JLyogZm9sbG93ZWQgYnkgb3B0aW9uIHNwZWNpZmljIGRhdGEqLwotfTsKLQotI2RlZmluZSBORF9PUFRfU09VUkNFX0xJTktBRERSCQkxCi0jZGVmaW5lIE5EX09QVF9UQVJHRVRfTElOS0FERFIJCTIKLSNkZWZpbmUgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTgkzCi0jZGVmaW5lIE5EX09QVF9SRURJUkVDVEVEX0hFQURFUgk0Ci0jZGVmaW5lIE5EX09QVF9NVFUJCQk1Ci0jZGVmaW5lIE5EX09QVF9BRFZJTlRFUlZBTAkJNwotI2RlZmluZSBORF9PUFRfSE9NRUFHRU5UX0lORk8JCTgKLSNkZWZpbmUgTkRfT1BUX1JPVVRFX0lORk8JCTkJLyogZHJhZnQtaWV0Zi1pcG5nd2ctcm91dGVyLXByZWZlcmVuY2UsIG5vdCBvZmZpY2lhbGx5IGFzc2lnbmVkIHlldCAqLwotCi0KLXN0cnVjdCBuZF9vcHRfcHJlZml4X2luZm8gewkvKiBwcmVmaXggaW5mb3JtYXRpb24gKi8KLQl1X2ludDhfdAluZF9vcHRfcGlfdHlwZTsKLQl1X2ludDhfdAluZF9vcHRfcGlfbGVuOwotCXVfaW50OF90CW5kX29wdF9waV9wcmVmaXhfbGVuOwotCXVfaW50OF90CW5kX29wdF9waV9mbGFnc19yZXNlcnZlZDsKLQl1X2ludDhfdAluZF9vcHRfcGlfdmFsaWRfdGltZVs0XTsKLQl1X2ludDhfdAluZF9vcHRfcGlfcHJlZmVycmVkX3RpbWVbNF07Ci0JdV9pbnQ4X3QJbmRfb3B0X3BpX3Jlc2VydmVkMls0XTsKLQlzdHJ1Y3QgaW42X2FkZHIJbmRfb3B0X3BpX3ByZWZpeDsKLX07Ci0KLSNkZWZpbmUgTkRfT1BUX1BJX0ZMQUdfT05MSU5LCQkweDgwCi0jZGVmaW5lIE5EX09QVF9QSV9GTEFHX0FVVE8JCTB4NDAKLSNkZWZpbmUgTkRfT1BUX1BJX0ZMQUdfUk9VVEVSCQkweDIwCS8qMjI5MmJpcyovCi0KLXN0cnVjdCBuZF9vcHRfcmRfaGRyIHsgICAgICAgICAvKiByZWRpcmVjdGVkIGhlYWRlciAqLwotCXVfaW50OF90CW5kX29wdF9yaF90eXBlOwotCXVfaW50OF90CW5kX29wdF9yaF9sZW47Ci0JdV9pbnQxNl90CW5kX29wdF9yaF9yZXNlcnZlZDE7Ci0JdV9pbnQzMl90CW5kX29wdF9yaF9yZXNlcnZlZDI7Ci0JLyogZm9sbG93ZWQgYnkgSVAgaGVhZGVyIGFuZCBkYXRhICovCi19OwotCi1zdHJ1Y3QgbmRfb3B0X210dSB7CQkvKiBNVFUgb3B0aW9uICovCi0JdV9pbnQ4X3QJbmRfb3B0X210dV90eXBlOwotCXVfaW50OF90CW5kX29wdF9tdHVfbGVuOwotCXVfaW50MTZfdAluZF9vcHRfbXR1X3Jlc2VydmVkOwotCXVfaW50MzJfdAluZF9vcHRfbXR1X210dTsKLX07Ci0KLXN0cnVjdCBuZF9vcHRfYWR2aW50ZXJ2YWwgewkvKiBBZHZlcnRpc2VtZW50IGludGVydmFsIG9wdGlvbiAqLwotCXVfaW50OF90CW5kX29wdF9hZHZfdHlwZTsKLQl1X2ludDhfdAluZF9vcHRfYWR2X2xlbjsKLQl1X2ludDE2X3QJbmRfb3B0X2Fkdl9yZXNlcnZlZDsKLQl1X2ludDMyX3QJbmRfb3B0X2Fkdl9pbnRlcnZhbDsKLX07Ci0KLXN0cnVjdCBuZF9vcHRfaG9tZWFnZW50X2luZm8gewkvKiBIb21lIEFnZW50IGluZm8gKi8KLQl1X2ludDhfdAluZF9vcHRfaGFpX3R5cGU7Ci0JdV9pbnQ4X3QJbmRfb3B0X2hhaV9sZW47Ci0JdV9pbnQxNl90CW5kX29wdF9oYWlfcmVzZXJ2ZWQ7Ci0JaW50MTZfdAkJbmRfb3B0X2hhaV9wcmVmZXJlbmNlOwotCXVfaW50MTZfdAluZF9vcHRfaGFpX2xpZmV0aW1lOwotfTsKLQotc3RydWN0IG5kX29wdF9yb3V0ZV9pbmZvIHsJLyogcm91dGUgaW5mbyAqLwotCXVfaW50OF90CW5kX29wdF9ydGlfdHlwZTsKLQl1X2ludDhfdAluZF9vcHRfcnRpX2xlbjsKLQl1X2ludDhfdAluZF9vcHRfcnRpX3ByZWZpeGxlbjsKLQl1X2ludDhfdAluZF9vcHRfcnRpX2ZsYWdzOwotCXVfaW50MzJfdAluZF9vcHRfcnRpX2xpZmV0aW1lOwotCS8qIHByZWZpeCBmb2xsb3dzICovCi19OwotCi0vKgotICogaWNtcDYgbmFtZWxvb2t1cAotICovCi0KLXN0cnVjdCBpY21wNl9uYW1lbG9va3VwIHsKLQlzdHJ1Y3QgaWNtcDZfaGRyIAlpY21wNl9ubF9oZHI7Ci0JdV9pbnQ4X3QJaWNtcDZfbmxfbm9uY2VbOF07Ci0JaW50MzJfdAkJaWNtcDZfbmxfdHRsOwotI2lmIDAKLQl1X2ludDhfdAlpY21wNl9ubF9sZW47Ci0JdV9pbnQ4X3QJaWNtcDZfbmxfbmFtZVszXTsKLSNlbmRpZgotCS8qIGNvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KLX07Ci0KLS8qCi0gKiBpY21wNiBub2RlIGluZm9ybWF0aW9uCi0gKi8KLXN0cnVjdCBpY21wNl9ub2RlaW5mbyB7Ci0Jc3RydWN0IGljbXA2X2hkciBpY21wNl9uaV9oZHI7Ci0JdV9pbnQ4X3QgaWNtcDZfbmlfbm9uY2VbOF07Ci0JLyogY291bGQgYmUgZm9sbG93ZWQgYnkgcmVwbHkgZGF0YSAqLwotfTsKLQotI2RlZmluZSBuaV90eXBlCQlpY21wNl9uaV9oZHIuaWNtcDZfdHlwZQotI2RlZmluZSBuaV9jb2RlCQlpY21wNl9uaV9oZHIuaWNtcDZfY29kZQotI2RlZmluZSBuaV9ja3N1bQlpY21wNl9uaV9oZHIuaWNtcDZfY2tzdW0KLSNkZWZpbmUgbmlfcXR5cGUJaWNtcDZfbmlfaGRyLmljbXA2X2RhdGExNlswXQotI2RlZmluZSBuaV9mbGFncwlpY21wNl9uaV9oZHIuaWNtcDZfZGF0YTE2WzFdCi0KLSNkZWZpbmUgTklfUVRZUEVfTk9PUAkJMCAvKiBOT09QICAqLwotI2RlZmluZSBOSV9RVFlQRV9TVVBUWVBFUwkxIC8qIFN1cHBvcnRlZCBRdHlwZXMgKi8KLSNkZWZpbmUgTklfUVRZUEVfRlFETgkJMiAvKiBGUUROIChkcmFmdCAwNCkgKi8KLSNkZWZpbmUgTklfUVRZUEVfRE5TTkFNRQkyIC8qIEROUyBOYW1lICovCi0jZGVmaW5lIE5JX1FUWVBFX05PREVBRERSCTMgLyogTm9kZSBBZGRyZXNzZXMgKi8KLSNkZWZpbmUgTklfUVRZUEVfSVBWNEFERFIJNCAvKiBJUHY0IEFkZHJlc3NlcyAqLwotCi0vKiBuZXR3b3JrIGVuZGlhbiAqLwotI2RlZmluZSBOSV9TVVBUWVBFX0ZMQUdfQ09NUFJFU1MJKCh1X2ludDE2X3QpaHRvbnMoMHgxKSkKLSNkZWZpbmUgTklfRlFETl9GTEFHX1ZBTElEVFRMCQkoKHVfaW50MTZfdClodG9ucygweDEpKQotCi0vKiBuZXR3b3JrIGVuZGlhbiAqLwotI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFCSgodV9pbnQxNl90KWh0b25zKDB4MSkpCi0jZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfQUxMCQkoKHVfaW50MTZfdClodG9ucygweDIpKQotI2RlZmluZSBOSV9OT0RFQUREUl9GTEFHX0NPTVBBVAkJKCh1X2ludDE2X3QpaHRvbnMoMHg0KSkKLSNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19MSU5LTE9DQUwJKCh1X2ludDE2X3QpaHRvbnMoMHg4KSkKLSNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19TSVRFTE9DQUwJKCh1X2ludDE2X3QpaHRvbnMoMHgxMCkpCi0jZGVmaW5lIE5JX05PREVBRERSX0ZMQUdfR0xPQkFMCQkoKHVfaW50MTZfdClodG9ucygweDIwKSkKLSNkZWZpbmUgTklfTk9ERUFERFJfRkxBR19BTllDQVNUCSgodV9pbnQxNl90KWh0b25zKDB4NDApKSAvKiBqdXN0IGV4cGVyaW1lbnRhbC4gbm90IGluIHNwZWMgKi8KLQotc3RydWN0IG5pX3JlcGx5X2ZxZG4gewotCXVfaW50MzJfdCBuaV9mcWRuX3R0bDsJLyogVFRMICovCi0JdV9pbnQ4X3QgbmlfZnFkbl9uYW1lbGVuOyAvKiBsZW5ndGggaW4gb2N0ZXRzIG9mIHRoZSBGUUROICovCi0JdV9pbnQ4X3QgbmlfZnFkbl9uYW1lWzNdOyAvKiBYWFg6IGFsaWdubWVudCAqLwotfTsKLQotLyoKLSAqIFJvdXRlciBSZW51bWJlcmluZy4gYXMgcm91dGVyLXJlbnVtLTA4LnR4dAotICovCi1zdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtIHsJLyogcm91dGVyIHJlbnVtYmVyaW5nIGhlYWRlciAqLwotCXN0cnVjdCBpY21wNl9oZHIJcnJfaGRyOwotCXVfaW50OF90CXJyX3NlZ251bTsKLQl1X2ludDhfdAlycl9mbGFnczsKLQl1X2ludDE2X3QJcnJfbWF4ZGVsYXk7Ci0JdV9pbnQzMl90CXJyX3Jlc2VydmVkOwotfTsKLSNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfVEVTVAkJMHg4MAotI2RlZmluZSBJQ01QNl9SUl9GTEFHU19SRVFSRVNVTFQJMHg0MAotI2RlZmluZSBJQ01QNl9SUl9GTEFHU19GT1JDRUFQUExZCTB4MjAKLSNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfU1BFQ1NJVEUJCTB4MTAKLSNkZWZpbmUgSUNNUDZfUlJfRkxBR1NfUFJFVkRPTkUJCTB4MDgKLQotI2RlZmluZSBycl90eXBlCQlycl9oZHIuaWNtcDZfdHlwZQotI2RlZmluZSBycl9jb2RlCQlycl9oZHIuaWNtcDZfY29kZQotI2RlZmluZSBycl9ja3N1bQlycl9oZHIuaWNtcDZfY2tzdW0KLSNkZWZpbmUgcnJfc2VxbnVtIAlycl9oZHIuaWNtcDZfZGF0YTMyWzBdCi0KLXN0cnVjdCBycl9wY29fbWF0Y2ggewkJLyogbWF0Y2ggcHJlZml4IHBhcnQgKi8KLQl1X2ludDhfdAlycG1fY29kZTsKLQl1X2ludDhfdAlycG1fbGVuOwotCXVfaW50OF90CXJwbV9vcmRpbmFsOwotCXVfaW50OF90CXJwbV9tYXRjaGxlbjsKLQl1X2ludDhfdAlycG1fbWlubGVuOwotCXVfaW50OF90CXJwbV9tYXhsZW47Ci0JdV9pbnQxNl90CXJwbV9yZXNlcnZlZDsKLQlzdHJ1Y3QJaW42X2FkZHIJcnBtX3ByZWZpeDsKLX07Ci0KLSNkZWZpbmUgUlBNX1BDT19BREQJCTEKLSNkZWZpbmUgUlBNX1BDT19DSEFOR0UJCTIKLSNkZWZpbmUgUlBNX1BDT19TRVRHTE9CQUwJMwotI2RlZmluZSBSUE1fUENPX01BWAkJNAotCi1zdHJ1Y3QgcnJfcGNvX3VzZSB7CQkvKiB1c2UgcHJlZml4IHBhcnQgKi8KLQl1X2ludDhfdAlycHVfdXNlbGVuOwotCXVfaW50OF90CXJwdV9rZWVwbGVuOwotCXVfaW50OF90CXJwdV9yYW1hc2s7Ci0JdV9pbnQ4X3QJcnB1X3JhZmxhZ3M7Ci0JdV9pbnQzMl90CXJwdV92bHRpbWU7Ci0JdV9pbnQzMl90CXJwdV9wbHRpbWU7Ci0JdV9pbnQzMl90CXJwdV9mbGFnczsKLQlzdHJ1Y3QJaW42X2FkZHIgcnB1X3ByZWZpeDsKLX07Ci0jZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9SQUZMQUdTX09OTElOSwkweDgwCi0jZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9SQUZMQUdTX0FVVE8JMHg0MAotCi0vKiBuZXR3b3JrIGVuZGlhbiAqLwotI2RlZmluZSBJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlZMVElNRSAgICAgKCh1X2ludDMyX3QpaHRvbmwoMHg4MDAwMDAwMCkpCi0jZGVmaW5lIElDTVA2X1JSX1BDT1VTRV9GTEFHU19ERUNSUExUSU1FICAgICAoKHVfaW50MzJfdClodG9ubCgweDQwMDAwMDAwKSkKLQotc3RydWN0IHJyX3Jlc3VsdCB7CQkvKiByb3V0ZXIgcmVudW1iZXJpbmcgcmVzdWx0IG1lc3NhZ2UgKi8KLQl1X2ludDE2X3QJcnJyX2ZsYWdzOwotCXVfaW50OF90CXJycl9vcmRpbmFsOwotCXVfaW50OF90CXJycl9tYXRjaGVkbGVuOwotCXVfaW50MzJfdAlycnJfaWZpZDsKLQlzdHJ1Y3QJaW42X2FkZHIgcnJyX3ByZWZpeDsKLX07Ci0vKiBuZXR3b3JrIGVuZGlhbiAqLwotI2RlZmluZSBJQ01QNl9SUl9SRVNVTFRfRkxBR1NfT09CCQkoKHVfaW50MTZfdClodG9ucygweDAwMDIpKQotI2RlZmluZSBJQ01QNl9SUl9SRVNVTFRfRkxBR1NfRk9SQklEREVOCQkoKHVfaW50MTZfdClodG9ucygweDAwMDEpKQotCi0jZW5kaWYgLyogbm90IF9ORVRJTkVUX0lDTVA2X0hfICovCmRpZmYgLS1naXQgYS9pZWVlODAyXzExLmggYi9pZWVlODAyXzExLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NzhhNDMuLjAwMDAwMDAKLS0tIGEvaWVlZTgwMl8xMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaWVlZTgwMl8xMS5oLHYgMS45LjQuMyAyMDA3LzA3LzIyIDIwOjAxOjE2IGd1eSBFeHAgJCAoTEJMKSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMQotICoJRm9ydHJlc3MgVGVjaG5vbG9naWVzCi0gKiAgICAgIENoYXJsaWUgTGVuYWhhbiAoIGNsZW5haGFuQGZvcnRyZXNzdGVjaC5jb20gKQotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0vKiBMZW5ndGhzIG9mIDgwMi4xMSBoZWFkZXIgY29tcG9uZW50cy4gKi8KLSNkZWZpbmUJSUVFRTgwMl8xMV9GQ19MRU4JCTIKLSNkZWZpbmUJSUVFRTgwMl8xMV9EVVJfTEVOCQkyCi0jZGVmaW5lCUlFRUU4MDJfMTFfREFfTEVOCQk2Ci0jZGVmaW5lCUlFRUU4MDJfMTFfU0FfTEVOCQk2Ci0jZGVmaW5lCUlFRUU4MDJfMTFfQlNTSURfTEVOCQk2Ci0jZGVmaW5lCUlFRUU4MDJfMTFfUkFfTEVOCQk2Ci0jZGVmaW5lCUlFRUU4MDJfMTFfVEFfTEVOCQk2Ci0jZGVmaW5lCUlFRUU4MDJfMTFfU0VRX0xFTgkJMgotI2RlZmluZQlJRUVFODAyXzExX0lWX0xFTgkJMwotI2RlZmluZQlJRUVFODAyXzExX0tJRF9MRU4JCTEKLQotLyogRnJhbWUgY2hlY2sgc2VxdWVuY2UgbGVuZ3RoLiAqLwotI2RlZmluZQlJRUVFODAyXzExX0ZDU19MRU4JCTQKLQotLyogTGVuZ3RocyBvZiBiZWFjb24gY29tcG9uZW50cy4gKi8KLSNkZWZpbmUJSUVFRTgwMl8xMV9UU1RBTVBfTEVOCQk4Ci0jZGVmaW5lCUlFRUU4MDJfMTFfQkNOSU5UX0xFTgkJMgotI2RlZmluZQlJRUVFODAyXzExX0NBUElORk9fTEVOCQkyCi0jZGVmaW5lCUlFRUU4MDJfMTFfTElTVEVOSU5UX0xFTgkyCi0KLSNkZWZpbmUJSUVFRTgwMl8xMV9BSURfTEVOCQkyCi0jZGVmaW5lCUlFRUU4MDJfMTFfU1RBVFVTX0xFTgkJMgotI2RlZmluZQlJRUVFODAyXzExX1JFQVNPTl9MRU4JCTIKLQotLyogTGVuZ3RoIG9mIHByZXZpb3VzIEFQIGluIHJlYXNzb2NhdGlvbiBmcmFtZSAqLwotI2RlZmluZQlJRUVFODAyXzExX0FQX0xFTgkJNgotCi0jZGVmaW5lCVRfTUdNVCAweDAgIC8qIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUJVF9DVFJMIDB4MSAgLyogY29udHJvbCAqLwotI2RlZmluZQlUX0RBVEEgMHgyIC8qIGRhdGEgKi8KLSNkZWZpbmUJVF9SRVNWIDB4MyAgLyogcmVzZXJ2ZWQgKi8KLQotI2RlZmluZQlTVF9BU1NPQ19SRVFVRVNUICAgCTB4MAotI2RlZmluZQlTVF9BU1NPQ19SRVNQT05TRSAJMHgxCi0jZGVmaW5lCVNUX1JFQVNTT0NfUkVRVUVTVCAgIAkweDIKLSNkZWZpbmUJU1RfUkVBU1NPQ19SRVNQT05TRSAgCTB4MwotI2RlZmluZQlTVF9QUk9CRV9SRVFVRVNUICAgCTB4NAotI2RlZmluZQlTVF9QUk9CRV9SRVNQT05TRSAgIAkweDUKLS8qIFJFU0VSVkVEIAkJCTB4NiAgKi8KLS8qIFJFU0VSVkVEIAkJCTB4NyAgKi8KLSNkZWZpbmUJU1RfQkVBQ09OICAgCQkweDgKLSNkZWZpbmUJU1RfQVRJTQkJCTB4OQotI2RlZmluZQlTVF9ESVNBU1NPQwkJMHhBCi0jZGVmaW5lCVNUX0FVVEgJCQkweEIKLSNkZWZpbmUJU1RfREVBVVRICQkweEMKLS8qIFJFU0VSVkVEIAkJCTB4RCAgKi8KLS8qIFJFU0VSVkVEIAkJCTB4RSAgKi8KLS8qIFJFU0VSVkVEIAkJCTB4RiAgKi8KLQotCi0jZGVmaW5lCUNUUkxfUFNfUE9MTAkweEEKLSNkZWZpbmUJQ1RSTF9SVFMJMHhCCi0jZGVmaW5lCUNUUkxfQ1RTCTB4QwotI2RlZmluZQlDVFJMX0FDSwkweEQKLSNkZWZpbmUJQ1RSTF9DRl9FTkQJMHhFCi0jZGVmaW5lCUNUUkxfRU5EX0FDSwkweEYKLQotI2RlZmluZQlEQVRBX0RBVEEJCQkweDAKLSNkZWZpbmUJREFUQV9EQVRBX0NGX0FDSwkJMHgxCi0jZGVmaW5lCURBVEFfREFUQV9DRl9QT0xMCQkweDIKLSNkZWZpbmUJREFUQV9EQVRBX0NGX0FDS19QT0xMCQkweDMKLSNkZWZpbmUJREFUQV9OT0RBVEEJCQkweDQKLSNkZWZpbmUJREFUQV9OT0RBVEFfQ0ZfQUNLCQkweDUKLSNkZWZpbmUJREFUQV9OT0RBVEFfQ0ZfUE9MTAkJMHg2Ci0jZGVmaW5lCURBVEFfTk9EQVRBX0NGX0FDS19QT0xMCQkweDcKLQotI2RlZmluZSBEQVRBX1FPU19EQVRBCQkJMHg4Ci0jZGVmaW5lIERBVEFfUU9TX0RBVEFfQ0ZfQUNLCQkweDkKLSNkZWZpbmUgREFUQV9RT1NfREFUQV9DRl9QT0xMCQkweEEKLSNkZWZpbmUgREFUQV9RT1NfREFUQV9DRl9BQ0tfUE9MTAkweEIKLSNkZWZpbmUgREFUQV9RT1NfTk9EQVRBCQkJMHhDCi0jZGVmaW5lIERBVEFfUU9TX0NGX1BPTExfTk9EQVRBCQkweEUKLSNkZWZpbmUgREFUQV9RT1NfQ0ZfQUNLX1BPTExfTk9EQVRBCTB4RgotCi0vKgotICogVGhlIHN1YnR5cGUgZmllbGQgb2YgYSBkYXRhIGZyYW1lIGlzLCBpbiBlZmZlY3QsIGNvbXBvc2VkIG9mIDQgZmxhZwotICogYml0cyAtIENGLUFjaywgQ0YtUG9sbCwgTnVsbCAobWVhbnMgdGhlIGZyYW1lIGRvZXNuJ3QgYWN0dWFsbHkgaGF2ZQotICogYW55IGRhdGEpLCBhbmQgUW9TLgotICovCi0jZGVmaW5lIERBVEFfRlJBTUVfSVNfQ0ZfQUNLKHgpCQkoKHgpICYgMHgwMSkKLSNkZWZpbmUgREFUQV9GUkFNRV9JU19DRl9QT0xMKHgpCSgoeCkgJiAweDAyKQotI2RlZmluZSBEQVRBX0ZSQU1FX0lTX05VTEwoeCkJCSgoeCkgJiAweDA0KQotI2RlZmluZSBEQVRBX0ZSQU1FX0lTX1FPUyh4KQkJKCh4KSAmIDB4MDgpCi0KLS8qCi0gKiBCaXRzIGluIHRoZSBmcmFtZSBjb250cm9sIGZpZWxkLgotICovCi0jZGVmaW5lCUZDX1ZFUlNJT04oZmMpCQkoKGZjKSAmIDB4MykKLSNkZWZpbmUJRkNfVFlQRShmYykJCSgoKGZjKSA+PiAyKSAmIDB4MykKLSNkZWZpbmUJRkNfU1VCVFlQRShmYykJCSgoKGZjKSA+PiA0KSAmIDB4RikKLSNkZWZpbmUJRkNfVE9fRFMoZmMpCQkoKGZjKSAmIDB4MDEwMCkKLSNkZWZpbmUJRkNfRlJPTV9EUyhmYykJCSgoZmMpICYgMHgwMjAwKQotI2RlZmluZQlGQ19NT1JFX0ZMQUcoZmMpCSgoZmMpICYgMHgwNDAwKQotI2RlZmluZQlGQ19SRVRSWShmYykJCSgoZmMpICYgMHgwODAwKQotI2RlZmluZQlGQ19QT1dFUl9NR01UKGZjKQkoKGZjKSAmIDB4MTAwMCkKLSNkZWZpbmUJRkNfTU9SRV9EQVRBKGZjKQkoKGZjKSAmIDB4MjAwMCkKLSNkZWZpbmUJRkNfV0VQKGZjKQkJKChmYykgJiAweDQwMDApCi0jZGVmaW5lCUZDX09SREVSKGZjKQkJKChmYykgJiAweDgwMDApCi0KLXN0cnVjdCBtZ210X2hlYWRlcl90IHsKLQl1X2ludDE2X3QJZmM7Ci0JdV9pbnQxNl90IAlkdXJhdGlvbjsKLQl1X2ludDhfdAlkYVs2XTsKLQl1X2ludDhfdAlzYVs2XTsKLQl1X2ludDhfdAlic3NpZFs2XTsKLQl1X2ludDE2X3QJc2VxX2N0cmw7Ci19OwotCi0jZGVmaW5lCU1HTVRfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0RVUl9MRU4rXAotCQkJIElFRUU4MDJfMTFfREFfTEVOK0lFRUU4MDJfMTFfU0FfTEVOK1wKLQkJCSBJRUVFODAyXzExX0JTU0lEX0xFTitJRUVFODAyXzExX1NFUV9MRU4pCi0KLSNkZWZpbmUJQ0FQQUJJTElUWV9FU1MoY2FwKQkoKGNhcCkgJiAweDAwMDEpCi0jZGVmaW5lCUNBUEFCSUxJVFlfSUJTUyhjYXApCSgoY2FwKSAmIDB4MDAwMikKLSNkZWZpbmUJQ0FQQUJJTElUWV9DRlAoY2FwKQkoKGNhcCkgJiAweDAwMDQpCi0jZGVmaW5lCUNBUEFCSUxJVFlfQ0ZQX1JFUShjYXApCSgoY2FwKSAmIDB4MDAwOCkKLSNkZWZpbmUJQ0FQQUJJTElUWV9QUklWQUNZKGNhcCkJKChjYXApICYgMHgwMDEwKQotCi10eXBlZGVmIGVudW0gewotCU5PVF9QUkVTRU5ULAotCVBSRVNFTlQsCi0JVFJVTkNBVEVECi19IGVsZW1fc3RhdHVzX3Q7Ci0KLXN0cnVjdCBzc2lkX3QgewotCXVfaW50OF90CWVsZW1lbnRfaWQ7Ci0JdV9pbnQ4X3QJbGVuZ3RoOwotCXVfY2hhcgkJc3NpZFszM107ICAvKiAzMiArIDEgZm9yIG51bGwgKi8KLX07Ci0KLXN0cnVjdCByYXRlc190IHsKLQl1X2ludDhfdAllbGVtZW50X2lkOwotCXVfaW50OF90CWxlbmd0aDsKLQl1X2ludDhfdAlyYXRlWzE2XTsKLX07Ci0KLXN0cnVjdCBjaGFsbGVuZ2VfdCB7Ci0JdV9pbnQ4X3QJZWxlbWVudF9pZDsKLQl1X2ludDhfdAlsZW5ndGg7Ci0JdV9pbnQ4X3QJdGV4dFsyNTRdOyAvKiAxLTI1MyArIDEgZm9yIG51bGwgKi8KLX07Ci0KLXN0cnVjdCBmaF90IHsKLQl1X2ludDhfdAllbGVtZW50X2lkOwotCXVfaW50OF90CWxlbmd0aDsKLQl1X2ludDE2X3QJZHdlbGxfdGltZTsKLQl1X2ludDhfdAlob3Bfc2V0OwotCXVfaW50OF90IAlob3BfcGF0dGVybjsKLQl1X2ludDhfdAlob3BfaW5kZXg7Ci19OwotCi1zdHJ1Y3QgZHNfdCB7Ci0JdV9pbnQ4X3QJZWxlbWVudF9pZDsKLQl1X2ludDhfdAlsZW5ndGg7Ci0JdV9pbnQ4X3QJY2hhbm5lbDsKLX07Ci0KLXN0cnVjdCBjZl90IHsKLQl1X2ludDhfdAllbGVtZW50X2lkOwotCXVfaW50OF90CWxlbmd0aDsKLQl1X2ludDhfdAljb3VudDsKLQl1X2ludDhfdAlwZXJpb2Q7Ci0JdV9pbnQxNl90CW1heF9kdXJhdGlvbjsKLQl1X2ludDE2X3QJZHVyX3JlbWFpbmc7Ci19OwotCi1zdHJ1Y3QgdGltX3QgewotCXVfaW50OF90CWVsZW1lbnRfaWQ7Ci0JdV9pbnQ4X3QJbGVuZ3RoOwotCXVfaW50OF90CWNvdW50OwotCXVfaW50OF90CXBlcmlvZDsKLQl1X2ludDhfdAliaXRtYXBfY29udHJvbDsKLQl1X2ludDhfdAliaXRtYXBbMjUxXTsKLX07Ci0KLSNkZWZpbmUJRV9TU0lEIAkJMAotI2RlZmluZQlFX1JBVEVTIAkxCi0jZGVmaW5lCUVfRkgJIAkyCi0jZGVmaW5lCUVfRFMgCQkzCi0jZGVmaW5lCUVfQ0YJIAk0Ci0jZGVmaW5lCUVfVElNCSAJNQotI2RlZmluZQlFX0lCU1MgCQk2Ci0vKiByZXNlcnZlZCAJCTcgKi8KLS8qIHJlc2VydmVkIAkJOCAqLwotLyogcmVzZXJ2ZWQgCQk5ICovCi0vKiByZXNlcnZlZCAJCTEwICovCi0vKiByZXNlcnZlZCAJCTExICovCi0vKiByZXNlcnZlZCAJCTEyICovCi0vKiByZXNlcnZlZCAJCTEzICovCi0vKiByZXNlcnZlZCAJCTE0ICovCi0vKiByZXNlcnZlZCAJCTE1ICovCi0vKiByZXNlcnZlZCAJCTE2ICovCi0KLSNkZWZpbmUJRV9DSEFMTEVOR0UgCTE2Ci0vKiByZXNlcnZlZCAJCTE3ICovCi0vKiByZXNlcnZlZCAJCTE4ICovCi0vKiByZXNlcnZlZCAJCTE5ICovCi0vKiByZXNlcnZlZCAJCTE2ICovCi0vKiByZXNlcnZlZCAJCTE2ICovCi0KLQotc3RydWN0IG1nbXRfYm9keV90IHsKLQl1X2ludDhfdCAgIAl0aW1lc3RhbXBbSUVFRTgwMl8xMV9UU1RBTVBfTEVOXTsKLQl1X2ludDE2X3QgIAliZWFjb25faW50ZXJ2YWw7Ci0JdV9pbnQxNl90IAlsaXN0ZW5faW50ZXJ2YWw7Ci0JdV9pbnQxNl90IAlzdGF0dXNfY29kZTsKLQl1X2ludDE2X3QgCWFpZDsKLQl1X2NoYXIJCWFwW0lFRUU4MDJfMTFfQVBfTEVOXTsKLQl1X2ludDE2X3QJcmVhc29uX2NvZGU7Ci0JdV9pbnQxNl90CWF1dGhfYWxnOwotCXVfaW50MTZfdAlhdXRoX3RyYW5zX3NlcV9udW07Ci0JZWxlbV9zdGF0dXNfdAljaGFsbGVuZ2Vfc3RhdHVzOwotCXN0cnVjdCBjaGFsbGVuZ2VfdCAgY2hhbGxlbmdlOwotCXVfaW50MTZfdAljYXBhYmlsaXR5X2luZm87Ci0JZWxlbV9zdGF0dXNfdAlzc2lkX3N0YXR1czsKLQlzdHJ1Y3Qgc3NpZF90CXNzaWQ7Ci0JZWxlbV9zdGF0dXNfdAlyYXRlc19zdGF0dXM7Ci0Jc3RydWN0IHJhdGVzX3QgCXJhdGVzOwotCWVsZW1fc3RhdHVzX3QJZHNfc3RhdHVzOwotCXN0cnVjdCBkc190CWRzOwotCWVsZW1fc3RhdHVzX3QJY2Zfc3RhdHVzOwotCXN0cnVjdCBjZl90CWNmOwotCWVsZW1fc3RhdHVzX3QJZmhfc3RhdHVzOwotCXN0cnVjdCBmaF90CWZoOwotCWVsZW1fc3RhdHVzX3QJdGltX3N0YXR1czsKLQlzdHJ1Y3QgdGltX3QJdGltOwotfTsKLQotc3RydWN0IGN0cmxfcnRzX3QgewotCXVfaW50MTZfdAlmYzsKLQl1X2ludDE2X3QJZHVyYXRpb247Ci0JdV9pbnQ4X3QJcmFbNl07Ci0JdV9pbnQ4X3QJdGFbNl07Ci0JdV9pbnQ4X3QJZmNzWzRdOwotfTsKLQotI2RlZmluZQlDVFJMX1JUU19IRFJMRU4JKElFRUU4MDJfMTFfRkNfTEVOK0lFRUU4MDJfMTFfRFVSX0xFTitcCi0JCQkgSUVFRTgwMl8xMV9SQV9MRU4rSUVFRTgwMl8xMV9UQV9MRU4pCi0KLXN0cnVjdCBjdHJsX2N0c190IHsKLQl1X2ludDE2X3QJZmM7Ci0JdV9pbnQxNl90CWR1cmF0aW9uOwotCXVfaW50OF90CXJhWzZdOwotCXVfaW50OF90CWZjc1s0XTsKLX07Ci0KLSNkZWZpbmUJQ1RSTF9DVFNfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0RVUl9MRU4rSUVFRTgwMl8xMV9SQV9MRU4pCi0KLXN0cnVjdCBjdHJsX2Fja190IHsKLQl1X2ludDE2X3QJZmM7Ci0JdV9pbnQxNl90CWR1cmF0aW9uOwotCXVfaW50OF90CXJhWzZdOwotCXVfaW50OF90CWZjc1s0XTsKLX07Ci0KLSNkZWZpbmUJQ1RSTF9BQ0tfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0RVUl9MRU4rSUVFRTgwMl8xMV9SQV9MRU4pCi0KLXN0cnVjdCBjdHJsX3BzX3BvbGxfdCB7Ci0JdV9pbnQxNl90CWZjOwotCXVfaW50MTZfdAlhaWQ7Ci0JdV9pbnQ4X3QJYnNzaWRbNl07Ci0JdV9pbnQ4X3QJdGFbNl07Ci0JdV9pbnQ4X3QJZmNzWzRdOwotfTsKLQotI2RlZmluZQlDVFJMX1BTX1BPTExfSERSTEVOCShJRUVFODAyXzExX0ZDX0xFTitJRUVFODAyXzExX0FJRF9MRU4rXAotCQkJCSBJRUVFODAyXzExX0JTU0lEX0xFTitJRUVFODAyXzExX1RBX0xFTikKLQotc3RydWN0IGN0cmxfZW5kX3QgewotCXVfaW50MTZfdAlmYzsKLQl1X2ludDE2X3QJZHVyYXRpb247Ci0JdV9pbnQ4X3QJcmFbNl07Ci0JdV9pbnQ4X3QJYnNzaWRbNl07Ci0JdV9pbnQ4X3QJZmNzWzRdOwotfTsKLQotI2RlZmluZQlDVFJMX0VORF9IRFJMRU4JKElFRUU4MDJfMTFfRkNfTEVOK0lFRUU4MDJfMTFfRFVSX0xFTitcCi0JCQkgSUVFRTgwMl8xMV9SQV9MRU4rSUVFRTgwMl8xMV9CU1NJRF9MRU4pCi0KLXN0cnVjdCBjdHJsX2VuZF9hY2tfdCB7Ci0JdV9pbnQxNl90CWZjOwotCXVfaW50MTZfdAlkdXJhdGlvbjsKLQl1X2ludDhfdAlyYVs2XTsKLQl1X2ludDhfdAlic3NpZFs2XTsKLQl1X2ludDhfdAlmY3NbNF07Ci19OwotCi0jZGVmaW5lCUNUUkxfRU5EX0FDS19IRFJMRU4JKElFRUU4MDJfMTFfRkNfTEVOK0lFRUU4MDJfMTFfRFVSX0xFTitcCi0JCQkJIElFRUU4MDJfMTFfUkFfTEVOK0lFRUU4MDJfMTFfQlNTSURfTEVOKQotCi0jZGVmaW5lCUlWX0lWKGl2KQkoKGl2KSAmIDB4RkZGRkZGKQotI2RlZmluZQlJVl9QQUQoaXYpCSgoKGl2KSA+PiAyNCkgJiAweDNGKQotI2RlZmluZQlJVl9LRVlJRChpdikJKCgoaXYpID4+IDMwKSAmIDB4MDMpCmRpZmYgLS1naXQgYS9pZWVlODAyXzExX3JhZGlvLmggYi9pZWVlODAyXzExX3JhZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmEzNWUuLjAwMDAwMDAKLS0tIGEvaWVlZTgwMl8xMV9yYWRpby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qICRGcmVlQlNEOiBzcmMvc3lzL25ldDgwMjExL2llZWU4MDIxMV9yYWRpb3RhcC5oLHYgMS41IDIwMDUvMDEvMjIgMjA6MTI6MDUgc2FtIEV4cCAkICovCi0vKiAkTmV0QlNEOiBpZWVlODAyXzExX3JhZGlvLmgsdiAxLjIgMjAwNi8wMi8yNiAwMzowNDowMyBkeW91bmcgRXhwICQgKi8KLS8qICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2llZWU4MDJfMTFfcmFkaW8uaCx2IDEuMS4yLjEgMjAwNi8wNi8xMyAyMjoyNDo0NSBndXkgRXhwICQgKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgRGF2aWQgWW91bmcuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWUgb2YgRGF2aWQgWW91bmcgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgREFWSUQgWU9VTkcgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCi0gKiBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBEQVZJRAotICogWU9VTkcgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAotICogVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKLSAqIE9GIFNVQ0ggREFNQUdFLgotICovCi0jaWZuZGVmIF9ORVRfSUZfSUVFRTgwMjExUkFESU9UQVBfSF8KLSNkZWZpbmUgX05FVF9JRl9JRUVFODAyMTFSQURJT1RBUF9IXwotCi0vKiBBIGdlbmVyaWMgcmFkaW8gY2FwdHVyZSBmb3JtYXQgaXMgZGVzaXJhYmxlLiBUaGVyZSBpcyBvbmUgZm9yCi0gKiBMaW51eCwgYnV0IGl0IGlzIG5laXRoZXIgcmlnaWRseSBkZWZpbmVkICh0aGVyZSB3ZXJlIG5vdCBldmVuCi0gKiB1bml0cyBnaXZlbiBmb3Igc29tZSBmaWVsZHMpIG5vciBlYXNpbHkgZXh0ZW5zaWJsZS4KLSAqCi0gKiBJIHN1Z2dlc3QgdGhlIGZvbGxvd2luZyBleHRlbnNpYmxlIHJhZGlvIGNhcHR1cmUgZm9ybWF0LiBJdCBpcwotICogYmFzZWQgb24gYSBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQuCi0gKgotICogSSBhbSB0cnlpbmcgdG8gZGVzY3JpYmUgcHJlY2lzZWx5IHdoYXQgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIKLSAqIHNob3VsZCBleHBlY3QgaW4gdGhlIGZvbGxvd2luZywgYW5kIGZvciB0aGF0IHJlYXNvbiBJIHRlbGwgdGhlCi0gKiB1bml0cyBhbmQgb3JpZ2luIG9mIGVhY2ggbWVhc3VyZW1lbnQgKHdoZXJlIGl0IGFwcGxpZXMpLCBvciBlbHNlIEkKLSAqIHVzZSBzdWZmaWNpZW50bHkgd2Vhc2VsbHkgbGFuZ3VhZ2UgKCJpcyBhIG1vbm90b25pY2FsbHkgbm9uZGVjcmVhc2luZwotICogZnVuY3Rpb24gb2YuLi4iKSB0aGF0IEkgY2Fubm90IHNldCBmYWxzZSBleHBlY3RhdGlvbnMgZm9yIGxhd3llcmx5Ci0gKiByZWFkZXJzLgotICovCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9LRVJORUwpCi0jaWZuZGVmIERMVF9JRUVFODAyXzExX1JBRElPCi0jZGVmaW5lCURMVF9JRUVFODAyXzExX1JBRElPCTEyNwkvKiA4MDIuMTEgcGx1cyBXTEFOIGhlYWRlciAqLwotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9LRVJORUwpICovCi0KLS8qIFRoZSByYWRpbyBjYXB0dXJlIGhlYWRlciBwcmVjZWRlcyB0aGUgODAyLjExIGhlYWRlci4gKi8KLXN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyIHsKLQl1X2ludDhfdAlpdF92ZXJzaW9uOwkvKiBWZXJzaW9uIDAuIE9ubHkgaW5jcmVhc2VzCi0JCQkJCSAqIGZvciBkcmFzdGljIGNoYW5nZXMsCi0JCQkJCSAqIGludHJvZHVjdGlvbiBvZiBjb21wYXRpYmxlCi0JCQkJCSAqIG5ldyBmaWVsZHMgZG9lcyBub3QgY291bnQuCi0JCQkJCSAqLwotCXVfaW50OF90CWl0X3BhZDsKLQl1X2ludDE2X3QgICAgICAgaXRfbGVuOyAgICAgICAgIC8qIGxlbmd0aCBvZiB0aGUgd2hvbGUKLQkJCQkJICogaGVhZGVyIGluIGJ5dGVzLCBpbmNsdWRpbmcKLQkJCQkJICogaXRfdmVyc2lvbiwgaXRfcGFkLAotCQkJCQkgKiBpdF9sZW4sIGFuZCBkYXRhIGZpZWxkcy4KLQkJCQkJICovCi0JdV9pbnQzMl90ICAgICAgIGl0X3ByZXNlbnQ7ICAgICAvKiBBIGJpdG1hcCB0ZWxsaW5nIHdoaWNoCi0JCQkJCSAqIGZpZWxkcyBhcmUgcHJlc2VudC4gU2V0IGJpdCAzMQotCQkJCQkgKiAoMHg4MDAwMDAwMCkgdG8gZXh0ZW5kIHRoZQotCQkJCQkgKiBiaXRtYXAgYnkgYW5vdGhlciAzMiBiaXRzLgotCQkJCQkgKiBBZGRpdGlvbmFsIGV4dGVuc2lvbnMgYXJlIG1hZGUKLQkJCQkJICogYnkgc2V0dGluZyBiaXQgMzEuCi0JCQkJCSAqLwotfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7Ci0KLS8qIE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhIHR5cGUgICAgICAgVW5pdHMKLSAqIC0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KLSAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCAgICAgICAgICAgICAgdV9pbnQ2NF90ICAgICAgIG1pY3Jvc2Vjb25kcwotICoKLSAqICAgICAgVmFsdWUgaW4gbWljcm9zZWNvbmRzIG9mIHRoZSBNQUMncyA2NC1iaXQgODAyLjExIFRpbWUKLSAqICAgICAgU3luY2hyb25pemF0aW9uIEZ1bmN0aW9uIHRpbWVyIHdoZW4gdGhlIGZpcnN0IGJpdCBvZiB0aGUKLSAqICAgICAgTVBEVSBhcnJpdmVkIGF0IHRoZSBNQUMuIEZvciByZWNlaXZlZCBmcmFtZXMsIG9ubHkuCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUwgICAgICAgICAgIDIgeCB1X2ludDE2X3QgICBNSHosIGJpdG1hcAotICoKLSAqICAgICAgVHgvUnggZnJlcXVlbmN5IGluIE1IeiwgZm9sbG93ZWQgYnkgZmxhZ3MgKHNlZSBiZWxvdykuCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgICAgICAgICAgICAgIHVfaW50MTZfdCAgICAgICBzZWUgYmVsb3cKLSAqCi0gKiAgICAgIEZvciBmcmVxdWVuY3ktaG9wcGluZyByYWRpb3MsIHRoZSBob3Agc2V0IChmaXJzdCBieXRlKQotICogICAgICBhbmQgcGF0dGVybiAoc2Vjb25kIGJ5dGUpLgotICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFICAgICAgICAgICAgICB1X2ludDhfdCAgICAgICAgNTAwa2IvcwotICoKLSAqICAgICAgVHgvUnggZGF0YSByYXRlCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX0RCTV9BTlRTSUdOQUwgICAgIGludDhfdCAgICAgICAgICBkZWNpYmVscyBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWxsaXdhdHQgKGRCbSkKLSAqCi0gKiAgICAgIFJGIHNpZ25hbCBwb3dlciBhdCB0aGUgYW50ZW5uYSwgZGVjaWJlbCBkaWZmZXJlbmNlIGZyb20KLSAqICAgICAgb25lIG1pbGxpd2F0dC4KLSAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFICAgICAgaW50OF90ICAgICAgICAgIGRlY2liZWxzIGZyb20KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG1pbGxpd2F0dCAoZEJtKQotICoKLSAqICAgICAgUkYgbm9pc2UgcG93ZXIgYXQgdGhlIGFudGVubmEsIGRlY2liZWwgZGlmZmVyZW5jZSBmcm9tIG9uZQotICogICAgICBtaWxsaXdhdHQuCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCAgICAgIHVfaW50OF90ICAgICAgICBkZWNpYmVsIChkQikKLSAqCi0gKiAgICAgIFJGIHNpZ25hbCBwb3dlciBhdCB0aGUgYW50ZW5uYSwgZGVjaWJlbCBkaWZmZXJlbmNlIGZyb20gYW4KLSAqICAgICAgYXJiaXRyYXJ5LCBmaXhlZCByZWZlcmVuY2UuCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVE5PSVNFICAgICAgIHVfaW50OF90ICAgICAgICBkZWNpYmVsIChkQikKLSAqCi0gKiAgICAgIFJGIG5vaXNlIHBvd2VyIGF0IHRoZSBhbnRlbm5hLCBkZWNpYmVsIGRpZmZlcmVuY2UgZnJvbSBhbgotICogICAgICBhcmJpdHJhcnksIGZpeGVkIHJlZmVyZW5jZSBwb2ludC4KLSAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZICAgICAgdV9pbnQxNl90ICAgICAgIHVuaXRsZXNzCi0gKgotICogICAgICBRdWFsaXR5IG9mIEJhcmtlciBjb2RlIGxvY2suIFVuaXRsZXNzLiBNb25vdG9uaWNhbGx5Ci0gKiAgICAgIG5vbmRlY3JlYXNpbmcgd2l0aCAiYmV0dGVyIiBsb2NrIHN0cmVuZ3RoLiBDYWxsZWQgIlNpZ25hbAotICogICAgICBRdWFsaXR5IiBpbiBkYXRhc2hlZXRzLiAgKElzIHRoZXJlIGEgc3RhbmRhcmQgd2F5IHRvIG1lYXN1cmUKLSAqICAgICAgdGhpcz8pCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX1RYX0FUVEVOVUFUSU9OICAgIHVfaW50MTZfdCAgICAgICB1bml0bGVzcwotICoKLSAqICAgICAgVHJhbnNtaXQgcG93ZXIgZXhwcmVzc2VkIGFzIHVuaXRsZXNzIGRpc3RhbmNlIGZyb20gbWF4Ci0gKiAgICAgIHBvd2VyIHNldCBhdCBmYWN0b3J5IGNhbGlicmF0aW9uLiAgMCBpcyBtYXggcG93ZXIuCi0gKiAgICAgIE1vbm90b25pY2FsbHkgbm9uZGVjcmVhc2luZyB3aXRoIGxvd2VyIHBvd2VyIGxldmVscy4KLSAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT04gdV9pbnQxNl90ICAgICAgIGRlY2liZWxzIChkQikKLSAqCi0gKiAgICAgIFRyYW5zbWl0IHBvd2VyIGV4cHJlc3NlZCBhcyBkZWNpYmVsIGRpc3RhbmNlIGZyb20gbWF4IHBvd2VyCi0gKiAgICAgIHNldCBhdCBmYWN0b3J5IGNhbGlicmF0aW9uLiAgMCBpcyBtYXggcG93ZXIuICBNb25vdG9uaWNhbGx5Ci0gKiAgICAgIG5vbmRlY3JlYXNpbmcgd2l0aCBsb3dlciBwb3dlciBsZXZlbHMuCi0gKgotICogSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiAgICAgIGludDhfdCAgICAgICAgICBkZWNpYmVscyBmcm9tCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWxsaXdhdHQgKGRCbSkKLSAqCi0gKiAgICAgIFRyYW5zbWl0IHBvd2VyIGV4cHJlc3NlZCBhcyBkQm0gKGRlY2liZWxzIGZyb20gYSAxIG1pbGxpd2F0dAotICogICAgICByZWZlcmVuY2UpLiBUaGlzIGlzIHRoZSBhYnNvbHV0ZSBwb3dlciBsZXZlbCBtZWFzdXJlZCBhdAotICogICAgICB0aGUgYW50ZW5uYSBwb3J0LgotICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUyAgICAgICAgICAgICB1X2ludDhfdCAgICAgICAgYml0bWFwCi0gKgotICogICAgICBQcm9wZXJ0aWVzIG9mIHRyYW5zbWl0dGVkIGFuZCByZWNlaXZlZCBmcmFtZXMuIFNlZSBmbGFncwotICogICAgICBkZWZpbmVkIGJlbG93LgotICoKLSAqIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BICAgICAgICAgICB1X2ludDhfdCAgICAgICAgYW50ZW5uYSBpbmRleAotICoKLSAqICAgICAgVW5pdGxlc3MgaW5kaWNhdGlvbiBvZiB0aGUgUngvVHggYW50ZW5uYSBmb3IgdGhpcyBwYWNrZXQuCi0gKiAgICAgIFRoZSBmaXJzdCBhbnRlbm5hIGlzIGFudGVubmEgMC4KLSAqCi0gKiBJRUVFODAyMTFfUkFESU9UQVBfRkNTICAgICAgICAgICAJdV9pbnQzMl90ICAgICAgIGRhdGEKLSAqCi0gKglGQ1MgZnJvbSBmcmFtZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKi8KLWVudW0gaWVlZTgwMjExX3JhZGlvdGFwX3R5cGUgewotCUlFRUU4MDIxMV9SQURJT1RBUF9UU0ZUID0gMCwKLQlJRUVFODAyMTFfUkFESU9UQVBfRkxBR1MgPSAxLAotCUlFRUU4MDIxMV9SQURJT1RBUF9SQVRFID0gMiwKLQlJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTCA9IDMsCi0JSUVFRTgwMjExX1JBRElPVEFQX0ZIU1MgPSA0LAotCUlFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMID0gNSwKLQlJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVE5PSVNFID0gNiwKLQlJRUVFODAyMTFfUkFESU9UQVBfTE9DS19RVUFMSVRZID0gNywKLQlJRUVFODAyMTFfUkFESU9UQVBfVFhfQVRURU5VQVRJT04gPSA4LAotCUlFRUU4MDIxMV9SQURJT1RBUF9EQl9UWF9BVFRFTlVBVElPTiA9IDksCi0JSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUiA9IDEwLAotCUlFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BID0gMTEsCi0JSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTCA9IDEyLAotCUlFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRSA9IDEzLAotCUlFRUU4MDIxMV9SQURJT1RBUF9FWFQgPSAzMQotfTsKLQotI2lmbmRlZiBfS0VSTkVMCi0vKiBDaGFubmVsIGZsYWdzLiAqLwotI2RlZmluZQlJRUVFODAyMTFfQ0hBTl9UVVJCTwkweDAwMTAJLyogVHVyYm8gY2hhbm5lbCAqLwotI2RlZmluZQlJRUVFODAyMTFfQ0hBTl9DQ0sJMHgwMDIwCS8qIENDSyBjaGFubmVsICovCi0jZGVmaW5lCUlFRUU4MDIxMV9DSEFOX09GRE0JMHgwMDQwCS8qIE9GRE0gY2hhbm5lbCAqLwotI2RlZmluZQlJRUVFODAyMTFfQ0hBTl8yR0haCTB4MDA4MAkvKiAyIEdIeiBzcGVjdHJ1bSBjaGFubmVsLiAqLwotI2RlZmluZQlJRUVFODAyMTFfQ0hBTl81R0haCTB4MDEwMAkvKiA1IEdIeiBzcGVjdHJ1bSBjaGFubmVsICovCi0jZGVmaW5lCUlFRUU4MDIxMV9DSEFOX1BBU1NJVkUJMHgwMjAwCS8qIE9ubHkgcGFzc2l2ZSBzY2FuIGFsbG93ZWQgKi8KLSNkZWZpbmUJSUVFRTgwMjExX0NIQU5fRFlOCTB4MDQwMAkvKiBEeW5hbWljIENDSy1PRkRNIGNoYW5uZWwgKi8KLSNkZWZpbmUJSUVFRTgwMjExX0NIQU5fR0ZTSwkweDA4MDAJLyogR0ZTSyBjaGFubmVsIChGSFNTIFBIWSkgKi8KLSNlbmRpZiAvKiAhX0tFUk5FTCAqLwotCi0vKiBGb3IgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTICovCi0jZGVmaW5lCUlFRUU4MDIxMV9SQURJT1RBUF9GX0NGUAkweDAxCS8qIHNlbnQvcmVjZWl2ZWQKLQkJCQkJCSAqIGR1cmluZyBDRlAKLQkJCQkJCSAqLwotI2RlZmluZQlJRUVFODAyMTFfUkFESU9UQVBfRl9TSE9SVFBSRQkweDAyCS8qIHNlbnQvcmVjZWl2ZWQKLQkJCQkJCSAqIHdpdGggc2hvcnQKLQkJCQkJCSAqIHByZWFtYmxlCi0JCQkJCQkgKi8KLSNkZWZpbmUJSUVFRTgwMjExX1JBRElPVEFQX0ZfV0VQCTB4MDQJLyogc2VudC9yZWNlaXZlZAotCQkJCQkJICogd2l0aCBXRVAgZW5jcnlwdGlvbgotCQkJCQkJICovCi0jZGVmaW5lCUlFRUU4MDIxMV9SQURJT1RBUF9GX0ZSQUcJMHgwOAkvKiBzZW50L3JlY2VpdmVkCi0JCQkJCQkgKiB3aXRoIGZyYWdtZW50YXRpb24KLQkJCQkJCSAqLwotI2RlZmluZQlJRUVFODAyMTFfUkFESU9UQVBfRl9GQ1MJMHgxMAkvKiBmcmFtZSBpbmNsdWRlcyBGQ1MgKi8KLSNkZWZpbmUJSUVFRTgwMjExX1JBRElPVEFQX0ZfREFUQVBBRAkweDIwCS8qIGZyYW1lIGhhcyBwYWRkaW5nIGJldHdlZW4KLQkJCQkJCSAqIDgwMi4xMSBoZWFkZXIgYW5kIHBheWxvYWQKLQkJCQkJCSAqICh0byAzMi1iaXQgYm91bmRhcnkpCi0JCQkJCQkgKi8KLSNkZWZpbmUJSUVFRTgwMjExX1JBRElPVEFQX0ZfQkFERkNTCTB4NDAJLyogZG9lcyBub3QgcGFzcyBGQ1MgY2hlY2sgKi8KLQotI2VuZGlmIC8qIF9ORVRfSUZfSUVFRTgwMjExUkFESU9UQVBfSF8gKi8KZGlmZiAtLWdpdCBhL2lncnAuaCBiL2lncnAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4NzZkMy4uMDAwMDAwMAotLS0gYS9pZ3JwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2lncnAuaCx2IDEuNiAyMDAyLzEyLzExIDA3OjEzOjUyIGd1eSBFeHAgJCAoTEJMKSAqLwotLyogQ2lzY28gSUdSUCBkZWZpbml0aW9ucyAqLwotCi0vKiBJR1JQIEhlYWRlciAqLwotCi1zdHJ1Y3QgaWdycGhkciB7Ci0JdV9pbnQ4X3QgaWdfdm9wOwkvKiBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciAvIG9wY29kZSAqLwotI2RlZmluZSBJR1JQX1YoeCkJKCgoeCkgJiAweGYwKSA+PiA0KQotI2RlZmluZSBJR1JQX09QKHgpCSgoeCkgJiAweDBmKQotCXVfaW50OF90IGlnX2VkOwkJLyogZWRpdGlvbiBudW1iZXIgKi8KLQl1X2ludDE2X3QgaWdfYXM7CS8qIGF1dG9ub21vdXMgc3lzdGVtIG51bWJlciAqLwotCXVfaW50MTZfdCBpZ19uaTsJLyogbnVtYmVyIG9mIHN1Ym5ldCBpbiBsb2NhbCBuZXQgKi8KLQl1X2ludDE2X3QgaWdfbnM7CS8qIG51bWJlciBvZiBuZXR3b3JrcyBpbiBBUyAqLwotCXVfaW50MTZfdCBpZ19ueDsJLyogbnVtYmVyIG9mIG5ldHdvcmtzIG91c2lkZSBBUyAqLwotCXVfaW50MTZfdCBpZ19zdW07CS8qIGNoZWNrc3VtIG9mIElHUlAgaGVhZGVyICYgZGF0YSAqLwotfTsKLQotI2RlZmluZSBJR1JQX1VQREFURQkxCi0jZGVmaW5lIElHUlBfUkVRVUVTVAkyCi0KLS8qIElHUlAgcm91dGluZyBlbnRyeSAqLwotCi1zdHJ1Y3QgaWdycHJ0ZSB7Ci0JdV9pbnQ4X3QgaWdyX25ldFszXTsJLyogMyBzaWduaWZpY2FudCBvY3RldHMgb2YgSVAgYWRkcmVzcyAqLwotCXVfaW50OF90IGlncl9kbHlbM107CS8qIGRlbGF5IGluIHRlbnMgb2YgbWljcm9zZWNvbmRzICovCi0JdV9pbnQ4X3QgaWdyX2J3WzNdOwkvKiBiYW5kd2lkdGggaW4gdW5pdHMgb2YgMSBrYi9zICovCi0JdV9pbnQ4X3QgaWdyX210dVsyXTsJLyogTVRVIGluIG9jdGV0cyAqLwotCXVfaW50OF90IGlncl9yZWw7CS8qIHBlcmNlbnQgcGFja2V0cyBzdWNjZXNzZnVsbHkgdHgvcnggKi8KLQl1X2ludDhfdCBpZ3JfbGQ7CS8qIHBlcmNlbnQgb2YgY2hhbm5lbCBvY2N1cGllZCAqLwotCXVfaW50OF90IGlncl9oY3Q7CS8qIGhvcCBjb3VudCAqLwotfTsKLQotI2RlZmluZSBJR1JQX1JURV9TSVpFCTE0CS8qIGRvbid0IGJlbGlldmUgc2l6ZW9mICEgKi8KZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYmM2NjkxLi4wMDAwMDAwCi0tLSBhL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIwotIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKLSMgVGhpcyBjb21lcyBmcm9tIFgxMVI1IChtaXQvdXRpbC9zY3JpcHRzL2luc3RhbGwuc2gpLgotIwotIyBDb3B5cmlnaHQgMTk5MSBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQotIwotIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKLSMgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0Ci0jIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKLSMgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTS5JLlQuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0jIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKLSMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKLSMgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCi0jIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAotIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAotIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgotIwotIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCi0jIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCi0jIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgotCi0KLSMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAotCi0jIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCi1kb2l0PSIke0RPSVRQUk9HLX0iCi0KLQotIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCi0KLW12cHJvZz0iJHtNVlBST0ctbXZ9IgotY3Bwcm9nPSIke0NQUFJPRy1jcH0iCi1jaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKLWNob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgotY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCi1zdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKLXJtcHJvZz0iJHtSTVBST0ctcm19IgotbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCi0KLXRyYW5zZm9ybWJhc2VuYW1lPSIiCi10cmFuc2Zvcm1fYXJnPSIiCi1pbnN0Y21kPSIkbXZwcm9nIgotY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKLWNob3duY21kPSIiCi1jaGdycGNtZD0iIgotc3RyaXBjbWQ9IiIKLXJtY21kPSIkcm1wcm9nIC1mIgotbXZjbWQ9IiRtdnByb2ciCi1zcmM9IiIKLWRzdD0iIgotZGlyX2FyZz0iIgotCi13aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KLSAgICBjYXNlICQxIGluCi0JLWMpIGluc3RjbWQ9IiRjcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1kKSBkaXJfYXJnPXRydWUKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLXMpIHN0cmlwY21kPSIkc3RyaXBwcm9nIgotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktdD0qKSB0cmFuc2Zvcm1hcmc9YGVjaG8gJDEgfCBzZWQgJ3MvLXQ9Ly8nYAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktYj0qKSB0cmFuc2Zvcm1iYXNlbmFtZT1gZWNobyAkMSB8IHNlZCAncy8tYj0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCSopICBpZiBbIHgiJHNyYyIgPSB4IF0KLQkgICAgdGhlbgotCQlzcmM9JDEKLQkgICAgZWxzZQotCQkjIHRoaXMgY29sb24gaXMgdG8gd29yayBhcm91bmQgYSAzODZCU0QgL2Jpbi9zaCBidWcKLQkJOgotCQlkc3Q9JDEKLQkgICAgZmkKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotICAgIGVzYWMKLWRvbmUKLQotaWYgWyB4IiRzcmMiID0geCBdCi10aGVuCi0JZWNobyAiaW5zdGFsbDoJbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiCi0JZXhpdCAxCi1lbHNlCi0JdHJ1ZQotZmkKLQotaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KLQlkc3Q9JHNyYwotCXNyYz0iIgotCQotCWlmIFsgLWQgJGRzdCBdOyB0aGVuCi0JCWluc3RjbWQ9OgotCWVsc2UKLQkJaW5zdGNtZD1ta2RpcgotCWZpCi1lbHNlCi0KLSMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAotIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZCAKLSMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgotCi0JaWYgWyAtZiAkc3JjIC1vIC1kICRzcmMgXQotCXRoZW4KLQkJdHJ1ZQotCWVsc2UKLQkJZWNobyAiaW5zdGFsbDogICRzcmMgZG9lcyBub3QgZXhpc3QiCi0JCWV4aXQgMQotCWZpCi0JCi0JaWYgWyB4IiRkc3QiID0geCBdCi0JdGhlbgotCQllY2hvICJpbnN0YWxsOglubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiCi0JCWV4aXQgMQotCWVsc2UKLQkJdHJ1ZQotCWZpCi0KLSMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCi0jIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKLQotCWlmIFsgLWQgJGRzdCBdCi0JdGhlbgotCQlkc3Q9IiRkc3QiL2BiYXNlbmFtZSAkc3JjYAotCWVsc2UKLQkJdHJ1ZQotCWZpCi1maQotCi0jIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKLWRzdGRpcj1gZWNobyAkZHN0IHwgc2VkIC1lICdzLFteL10qJCwsO3MsLyQsLDtzLF4kLC4sJ2AKLQotIyBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGV4aXN0cy4KLSMgIHRoaXMgcGFydCBpcyB0YWtlbiBmcm9tIE5vYWggRnJpZWRtYW4ncyBta2luc3RhbGxkaXJzIHNjcmlwdAotCi0jIFNraXAgbG90cyBvZiBzdGF0IGNhbGxzIGluIHRoZSB1c3VhbCBjYXNlLgotaWYgWyAhIC1kICIkZHN0ZGlyIiBdOyB0aGVuCi1kZWZhdWx0SUZTPScJCi0nCi1JRlM9IiR7SUZTLSR7ZGVmYXVsdElGU319IgotCi1vSUZTPSIke0lGU30iCi0jIFNvbWUgc2gncyBjYW4ndCBoYW5kbGUgSUZTPS8gZm9yIHNvbWUgcmVhc29uLgotSUZTPSclJwotc2V0IC0gYGVjaG8gJHtkc3RkaXJ9IHwgc2VkIC1lICdzQC9AJUBnJyAtZSAnc0BeJUAvQCdgCi1JRlM9IiR7b0lGU30iCi0KLXBhdGhjb21wPScnCi0KLXdoaWxlIFsgJCMgLW5lIDAgXSA7IGRvCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9JHsxfSIKLQlzaGlmdAotCi0JaWYgWyAhIC1kICIke3BhdGhjb21wfSIgXSA7Ci0gICAgICAgIHRoZW4KLQkJJG1rZGlycHJvZyAiJHtwYXRoY29tcH0iCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotCXBhdGhjb21wPSIke3BhdGhjb21wfS8iCi1kb25lCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXQotdGhlbgotCSRkb2l0ICRpbnN0Y21kICRkc3QgJiYKLQotCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkKLWVsc2UKLQotIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCi0KLQlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0gCi0JdGhlbgotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAotCWVsc2UKLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdCAkdHJhbnNmb3JtYmFzZW5hbWUgfCAKLQkJCXNlZCAkdHJhbnNmb3JtYXJnYCR0cmFuc2Zvcm1iYXNlbmFtZQotCWZpCi0KLSMgZG9uJ3QgYWxsb3cgdGhlIHNlZCBjb21tYW5kIHRvIGNvbXBsZXRlbHkgZWxpbWluYXRlIHRoZSBmaWxlbmFtZQotCi0JaWYgWyB4IiRkc3RmaWxlIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBNYWtlIGEgdGVtcCBmaWxlIG5hbWUgaW4gdGhlIHByb3BlciBkaXJlY3RvcnkuCi0KLQlkc3R0bXA9JGRzdGRpci8jaW5zdC4kJCMKLQotIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCi0KLQkkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAgJiYKLQotCXRyYXAgInJtIC1mICR7ZHN0dG1wfSIgMCAmJgotCi0jIGFuZCBzZXQgYW55IG9wdGlvbnM7IGRvIGNobW9kIGxhc3QgdG8gcHJlc2VydmUgc2V0dWlkIGJpdHMKLQotIyBJZiBhbnkgb2YgdGhlc2UgZmFpbCwgd2UgYWJvcnQgdGhlIHdob2xlIHRoaW5nLiAgSWYgd2Ugd2FudCB0bwotIyBpZ25vcmUgZXJyb3JzIGZyb20gYW55IG9mIHRoZXNlLCBqdXN0IG1ha2Ugc3VyZSBub3QgdG8gaWdub3JlCi0jIGVycm9ycyBmcm9tIHRoZSBhYm92ZSAiJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kLgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQotIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgotCi0JJGRvaXQgJHJtY21kIC1mICRkc3RkaXIvJGRzdGZpbGUgJiYKLQkkZG9pdCAkbXZjbWQgJGRzdHRtcCAkZHN0ZGlyLyRkc3RmaWxlIAotCi1maSAmJgotCi0KLWV4aXQgMApkaWZmIC0tZ2l0IGEvaW50ZXJmYWNlLmggYi9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDliYTg3ZC4uMDAwMDAwMAotLS0gYS9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LTIwMDIKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2ludGVyZmFjZS5oLHYgMS4yNDQuMi4yMSAyMDA3LzAzLzI4IDA3OjQ1OjQ2IGhhbm5lcyBFeHAgJCAoTEJMKQotICovCi0KLSNpZm5kZWYgdGNwZHVtcF9pbnRlcmZhY2VfaAotI2RlZmluZSB0Y3BkdW1wX2ludGVyZmFjZV9oCi0KLSNpZmRlZiBIQVZFX09TX1BST1RPX0gKLSNpbmNsdWRlICJvcy1wcm90by5oIgotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9fX0FUVFJJQlVURV9fCi0jZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKLSNlbmRpZgotCi0vKiBzbnByaW50ZiBldCBhbCAqLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpZiBIQVZFX1NURElOVF9ICi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEhBVkVfU05QUklOVEYpCi1pbnQgc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKQotICAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChIQVZFX1ZTTlBSSU5URikKLWludCB2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkKLSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgMCkpKTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSTENBVAotZXh0ZXJuIHNpemVfdCBzdHJsY2F0KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotI2VuZGlmCi0jaWZuZGVmIEhBVkVfU1RSTENQWQotZXh0ZXJuIHNpemVfdCBzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVFJEVVAKLWV4dGVybiBjaGFyICpzdHJkdXAoY29uc3QgY2hhciAqKTsKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU1RSU0VQCi1leHRlcm4gY2hhciAqc3Ryc2VwKGNoYXIgKiosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotI2RlZmluZSBQVF9WQVQJCTEJLyogVmlzdWFsIEF1ZGlvIFRvb2wgKi8KLSNkZWZpbmUgUFRfV0IJCTIJLyogZGlzdHJpYnV0ZWQgV2hpdGUgQm9hcmQgKi8KLSNkZWZpbmUgUFRfUlBDCQkzCS8qIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCAqLwotI2RlZmluZSBQVF9SVFAJCTQJLyogUmVhbC1UaW1lIEFwcGxpY2F0aW9ucyBwcm90b2NvbCAqLwotI2RlZmluZSBQVF9SVENQCQk1CS8qIFJlYWwtVGltZSBBcHBsaWNhdGlvbnMgY29udHJvbCBwcm90b2NvbCAqLwotI2RlZmluZSBQVF9TTk1QCQk2CS8qIFNpbXBsZSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFRfQ05GUAkJNwkvKiBDaXNjbyBOZXRGbG93IHByb3RvY29sICovCi0jZGVmaW5lIFBUX1RGVFAJCTgJLyogdHJpdmlhbCBmaWxlIHRyYW5zZmVyIHByb3RvY29sICovCi0jZGVmaW5lIFBUX0FPRFYJCTkJLyogQWQtaG9jIE9uLWRlbWFuZCBEaXN0YW5jZSBWZWN0b3IgUHJvdG9jb2wgKi8KLQotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKT4oYik/KGIpOihhKSkKLSNlbmRpZgotI2lmbmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChiKT4oYSk/KGIpOihhKSkKLSNlbmRpZgotCi0vKgotICogVGhlIGRlZmF1bHQgc25hcHNob3QgbGVuZ3RoLiAgVGhpcyB2YWx1ZSBhbGxvd3MgbW9zdCBwcmludGVycyB0byBwcmludAotICogdXNlZnVsIGluZm9ybWF0aW9uIHdoaWxlIGtlZXBpbmcgdGhlIGFtb3VudCBvZiB1bndhbnRlZCBkYXRhIGRvd24uCi0gKi8KLSNpZm5kZWYgSU5FVDYKLSNkZWZpbmUgREVGQVVMVF9TTkFQTEVOIDY4CS8qIGV0aGVyICsgSVB2NCArIFRDUCArIDE0ICovCi0jZWxzZQotI2RlZmluZSBERUZBVUxUX1NOQVBMRU4gOTYJLyogZXRoZXIgKyBJUHY2ICsgVENQICsgMjIgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEJJR19FTkRJQU4KLSNkZWZpbmUgQklHX0VORElBTiA0MzIxCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAotI2VuZGlmCi0KLSNkZWZpbmUgRVNSQyhlcCkgKChlcCktPmV0aGVyX3Nob3N0KQotI2RlZmluZSBFRFNUKGVwKSAoKGVwKS0+ZXRoZXJfZGhvc3QpCi0KLSNpZm5kZWYgTlRPSEwKLSNkZWZpbmUgTlRPSEwoeCkJKHgpID0gbnRvaGwoeCkKLSNkZWZpbmUgTlRPSFMoeCkJKHgpID0gbnRvaHMoeCkKLSNkZWZpbmUgSFRPTkwoeCkJKHgpID0gaHRvbmwoeCkKLSNkZWZpbmUgSFRPTlMoeCkJKHgpID0gaHRvbnMoeCkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTUlOCi0jZGVmaW5lIE1JTihhLGIpICgoYSk8KGIpPyhhKTooYikpCi0jZW5kaWYKLQotZXh0ZXJuIGNoYXIgKnByb2dyYW1fbmFtZTsJLyogdXNlZCB0byBnZW5lcmF0ZSBzZWxmLWlkZW50aWZ5aW5nIG1lc3NhZ2VzICovCi0KLWV4dGVybiBpbnQzMl90IHRoaXN6b25lOwkvKiBzZWNvbmRzIG9mZnNldCBmcm9tIGdtdCB0byBsb2NhbCB0aW1lICovCi0KLS8qCi0gKiBUcnVlIGlmICAibCIgYnl0ZXMgb2YgInZhciIgd2VyZSBjYXB0dXJlZC4KLSAqCi0gKiBUaGUgInNuYXBlbmQgLSAobCkgPD0gc25hcGVuZCIgY2hlY2tzIHRvIG1ha2Ugc3VyZSAibCIgaXNuJ3Qgc28gbGFyZ2UKLSAqIHRoYXQgInNuYXBlbmQgLSAobCkiIHVuZGVyZmxvd3MuCi0gKgotICogVGhlIGNoZWNrIGlzIGZvciA8PSByYXRoZXIgdGhhbiA8IGJlY2F1c2UgImwiIG1pZ2h0IGJlIDAuCi0gKi8KLSNkZWZpbmUgVFRFU1QyKHZhciwgbCkgKHNuYXBlbmQgLSAobCkgPD0gc25hcGVuZCAmJiBcCi0JCQkoY29uc3QgdV9jaGFyICopJih2YXIpIDw9IHNuYXBlbmQgLSAobCkpCi0KLS8qIFRydWUgaWYgInZhciIgd2FzIGNhcHR1cmVkICovCi0jZGVmaW5lIFRURVNUKHZhcikgVFRFU1QyKHZhciwgc2l6ZW9mKHZhcikpCi0KLS8qIEJhaWwgaWYgImwiIGJ5dGVzIG9mICJ2YXIiIHdlcmUgbm90IGNhcHR1cmVkICovCi0jZGVmaW5lIFRDSEVDSzIodmFyLCBsKSBpZiAoIVRURVNUMih2YXIsIGwpKSBnb3RvIHRydW5jCi0KLS8qIEJhaWwgaWYgInZhciIgd2FzIG5vdCBjYXB0dXJlZCAqLwotI2RlZmluZSBUQ0hFQ0sodmFyKSBUQ0hFQ0syKHZhciwgc2l6ZW9mKHZhcikpCi0KLWV4dGVybiB2b2lkIHRzX3ByaW50KGNvbnN0IHN0cnVjdCB0aW1ldmFsICopOwotZXh0ZXJuIHZvaWQgcmVsdHNfcHJpbnQoaW50KTsKLQotZXh0ZXJuIGludCBmbl9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGludCBmbl9wcmludG4oY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gaW50IGZuX3ByaW50enAoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gaW50IG1hc2sycGxlbih1X2ludDMyX3QpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnRvazJzdHJhcnlfaW50ZXJuYWwoY29uc3QgY2hhciAqKiwgaW50LCBjb25zdCBjaGFyICosIGludCk7Ci0jZGVmaW5lCXRvazJzdHJhcnkoYSxmLGkpIHRvazJzdHJhcnlfaW50ZXJuYWwoYSwgc2l6ZW9mKGEpL3NpemVvZihhWzBdKSxmLGkpCi0KLWV4dGVybiBjb25zdCBjaGFyICpkbmFkZHJfc3RyaW5nKHVfc2hvcnQpOwotCi1leHRlcm4gdm9pZCBlcnJvcihjb25zdCBjaGFyICosIC4uLikKLSAgICBfX2F0dHJpYnV0ZV9fKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci1leHRlcm4gdm9pZCB3YXJuaW5nKGNvbnN0IGNoYXIgKiwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7Ci0KLWV4dGVybiBjaGFyICpyZWFkX2luZmlsZShjaGFyICopOwotZXh0ZXJuIGNoYXIgKmNvcHlfYXJndihjaGFyICoqKTsKLQotZXh0ZXJuIHZvaWQgc2FmZXB1dGNoYXIoaW50KTsKLWV4dGVybiB2b2lkIHNhZmVwdXRzKGNvbnN0IGNoYXIgKiwgaW50KTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmlzb25zYXBfc3RyaW5nKGNvbnN0IHVfY2hhciAqLCByZWdpc3RlciB1X2ludCk7Ci1leHRlcm4gY29uc3QgY2hhciAqcHJvdG9pZF9zdHJpbmcoY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmlweHNhcF9zdHJpbmcodV9zaG9ydCk7Ci1leHRlcm4gY29uc3QgY2hhciAqZG5uYW1lX3N0cmluZyh1X3Nob3J0KTsKLWV4dGVybiBjb25zdCBjaGFyICpkbm51bV9zdHJpbmcodV9zaG9ydCk7Ci0KLS8qIFRoZSBwcmludGVyIHJvdXRpbmVzLiAqLwotCi0jaW5jbHVkZSA8cGNhcC5oPgotCi1leHRlcm4gaW50IHByaW50X3Vua25vd25fZGF0YShjb25zdCB1X2NoYXIgKiwgY29uc3QgY2hhciAqLGludCk7Ci1leHRlcm4gdm9pZCBhc2NpaV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaGV4X2FuZF9hc2NpaV9wcmludF93aXRoX29mZnNldChjb25zdCBjaGFyICosIGNvbnN0IHVfY2hhciAqLAotCXVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBoZXhfYW5kX2FzY2lpX3ByaW50KGNvbnN0IGNoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGhleF9wcmludF93aXRoX29mZnNldChjb25zdCBjaGFyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaGV4X3ByaW50KGNvbnN0IGNoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHRlbG5ldF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIGludCBldGhlcl9lbmNhcF9wcmludCh1X3Nob3J0LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50LCB1X3Nob3J0ICopOwotZXh0ZXJuIGludCBsbGNfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCwgY29uc3QgdV9jaGFyICosCi0JY29uc3QgdV9jaGFyICosIHVfc2hvcnQgKik7Ci1leHRlcm4gaW50IHNuYXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCwgdV9zaG9ydCAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBhYXJwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBhb2R2X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgaW50KTsKLWV4dGVybiB2b2lkIGF0YWxrX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBhdG1fcHJpbnQodV9pbnQsIHVfaW50LCB1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdV9pbnQgYXRtX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgc3VuYXRtX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gaW50IG9hbV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKLWV4dGVybiB2b2lkIGJvb3RwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBiZ3BfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBiZWVwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBjbmZwX3ByaW50KGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBkZWNuZXRfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBkZWZhdWx0X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBkdm1ycF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgZWdwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdV9pbnQgZW5jX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgcGZsb2dfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBhcmNuZXRfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBhcmNuZXRfbGludXhfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIGV0aGVyX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOwotZXh0ZXJuIHVfaW50IGV0aGVyX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgdG9rZW5fcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdV9pbnQgdG9rZW5faWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIGZkZGlfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdV9pbnQgZmRkaV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGZyX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgbWZyX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgZnJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBtZnJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBpZWVlODAyXzExX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgaWVlZTgwMl8xMV9yYWRpb19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwKLQljb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgYXAxMzk0X2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBncmVfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGljbXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKiwgaW50KTsKLWV4dGVybiB2b2lkIGlnbXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGlncnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBpcE5fcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBpcGZjX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBpcHhfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGlzb2NsbnNfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBrcmJfcHJpbnQoY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGxsYXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBsdGFsa19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgbXNkcF9wcmludChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIG5mc3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgbmZzcmVxX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgbnNfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQpOwotZXh0ZXJuIHZvaWQgbnRwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdV9pbnQgbnVsbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgb3NwZl9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIG9sc3JfcHJpbnQgKGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBwaW12MV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgY2lzY29fYXV0b3JwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCByc3ZwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBsZHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGxtcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgbHNwcGluZ19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgZWlncnBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIG1vYmlsZV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgcGltX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdV9pbnQgcHBwb2VfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBwcHBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBwcHBfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBwcHBfaGRsY19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IHBwcF9ic2Rvc19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IHBwcG9lX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgcHJpc21faWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHE5MzNfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiBpbnQgdmpjX3ByaW50KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKiwgdV9zaG9ydCk7Ci1leHRlcm4gdV9pbnQgcmF3X2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCByaXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB1X2ludCBzbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgbGFuZV9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKLWV4dGVybiB1X2ludCBsYW5lX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgY2lwX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgc2xfYnNkb3NfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBjaGRsY19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGNoZGxjX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9hdG0xX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9hdG0yX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9tZnJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBqdW5pcGVyX21sZnJfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBqdW5pcGVyX21scHBwX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9wcHBvZV9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGp1bmlwZXJfcHBwb2VfYXRtX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9nZ3NuX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9lc19wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGp1bmlwZXJfbW9uaXRvcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGp1bmlwZXJfc2VydmljZXNfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBqdW5pcGVyX2V0aGVyX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQganVuaXBlcl9wcHBfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBqdW5pcGVyX2ZyZWxheV9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHVfaW50IGp1bmlwZXJfY2hkbGNfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB1X2ludCBzbGxfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHNubXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHN1bnJwY3JlcXVlc3RfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdV9pbnQgc3ltYW50ZWNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHRjcF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgdGZ0cF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgdGltZWRfcHJpbnQoY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgdWRwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCB3Yl9wcmludChjb25zdCB2b2lkICosIHVfaW50KTsKLWV4dGVybiBpbnQgYWhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGludCBpcGNvbXBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIGludCAqKTsKLWV4dGVybiB2b2lkIHJ4X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLCBpbnQsIGludCwgaW50LCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBuZXRiZXVpX3ByaW50KHVfc2hvcnQsIGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgaXB4X25ldGJpb3NfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIG5idF90Y3BfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBuYnRfdWRwMTM3X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgbmJ0X3VkcDEzOF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKLWV4dGVybiBjaGFyICpzbWJfZXJyc3RyKGludCwgaW50KTsKLWV4dGVybiBjb25zdCBjaGFyICpudF9lcnJzdHIodV9pbnQzMl90KTsKLWV4dGVybiB2b2lkIHByaW50X2RhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgbDJ0cF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgdnJycF9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQsIGludCk7Ci1leHRlcm4gdm9pZCBzbG93X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBwZ21fcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBjZHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBzdHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHJhZGl1c19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgbHdyZXNfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHBwdHBfcHJpbnQoY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgZGNjcF9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHNjdHBfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBtcGxzX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBtcGxzX2xzcF9waW5nX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCB6ZXBoeXJfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBoc3JwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBiZmRfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBzaXBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHN5c2xvZ19wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotCi0jaWZkZWYgSU5FVDYKLWV4dGVybiB2b2lkIGlwNl9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaXA2X29wdF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKLWV4dGVybiBpbnQgaGJob3B0X3ByaW50KGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiBpbnQgZHN0b3B0X3ByaW50KGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiBpbnQgZnJhZzZfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiBpbnQgbW9iaWxpdHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIGljbXA2X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCByaXBuZ19wcmludChjb25zdCB1X2NoYXIgKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiBpbnQgcnQ2X3ByaW50KGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBvc3BmNl9wcmludChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgZGhjcDZfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLSNlbmRpZiAvKklORVQ2Ki8KLWV4dGVybiB1X3Nob3J0IGluX2Nrc3VtKGNvbnN0IHVfc2hvcnQgKiwgcmVnaXN0ZXIgdV9pbnQsIGludCk7Ci1leHRlcm4gdV9pbnQxNl90IGluX2Nrc3VtX3Nob3VsZGJlKHVfaW50MTZfdCwgdV9pbnQxNl90KTsKLQotI2lmbmRlZiBIQVZFX0JQRl9EVU1QCi1zdHJ1Y3QgYnBmX3Byb2dyYW07Ci0KLWV4dGVybiB2b2lkIGJwZl9kdW1wKHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBpbnQpOwotCi0jZW5kaWYKLQotI2luY2x1ZGUgIm5ldGRpc3NlY3QuaCIKLQotLyogZm9yd2FyZCBjb21wYXRpYmlsaXR5ICovCi0KLWV4dGVybiBuZXRkaXNzZWN0X29wdGlvbnMgKmduZG87Ci0KLSNkZWZpbmUgZWZsYWcgZ25kby0+bmRvX2VmbGFnIAotI2RlZmluZSBmZmxhZyBnbmRvLT5uZG9fZmZsYWcgCi0jZGVmaW5lIG5mbGFnIGduZG8tPm5kb19uZmxhZyAKLSNkZWZpbmUgTmZsYWcgZ25kby0+bmRvX05mbGFnIAotI2RlZmluZSBPZmxhZyBnbmRvLT5uZG9fT2ZsYWcgCi0jZGVmaW5lIHBmbGFnIGduZG8tPm5kb19wZmxhZyAKLSNkZWZpbmUgcWZsYWcgZ25kby0+bmRvX3FmbGFnIAotI2RlZmluZSBSZmxhZyBnbmRvLT5uZG9fUmZsYWcgCi0jZGVmaW5lIHNmbGFnIGduZG8tPm5kb19zZmxhZyAKLSNkZWZpbmUgU2ZsYWcgZ25kby0+bmRvX1NmbGFnIAotI2RlZmluZSB0ZmxhZyBnbmRvLT5uZG9fdGZsYWcgCi0jZGVmaW5lIFVmbGFnIGduZG8tPm5kb19VZmxhZyAKLSNkZWZpbmUgdWZsYWcgZ25kby0+bmRvX3VmbGFnIAotI2RlZmluZSB2ZmxhZyBnbmRvLT5uZG9fdmZsYWcgCi0jZGVmaW5lIHhmbGFnIGduZG8tPm5kb194ZmxhZyAKLSNkZWZpbmUgWGZsYWcgZ25kby0+bmRvX1hmbGFnIAotI2RlZmluZSBDZmxhZyBnbmRvLT5uZG9fQ2ZsYWcgCi0jZGVmaW5lIEFmbGFnIGduZG8tPm5kb19BZmxhZyAKLSNkZWZpbmUgc3VwcHJlc3NfZGVmYXVsdF9wcmludCBnbmRvLT5uZG9fc3VwcHJlc3NfZGVmYXVsdF9wcmludAotI2RlZmluZSBwYWNrZXR0eXBlIGduZG8tPm5kb19wYWNrZXR0eXBlCi0jZGVmaW5lIHRjcG1kNXNlY3JldCBnbmRvLT5uZG9fdGNwbWQ1c2VjcmV0Ci0jZGVmaW5lIFdmbGFnIGduZG8tPm5kb19XZmxhZwotI2RlZmluZSBXZmxhZ0NoYXJzIGduZG8tPm5kb19XZmxhZ0NoYXJzCi0jZGVmaW5lIENmbGFnX2NvdW50IGduZG8tPm5kb19DZmxhZ19jb3VudAotI2RlZmluZSBzbmFwbGVuICAgICBnbmRvLT5uZG9fc25hcGxlbgotI2RlZmluZSBzbmFwZW5kICAgICBnbmRvLT5uZG9fc25hcGVuZAotCmRpZmYgLS1naXQgYS9pcC5oIGIvaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzMmFlMC4uMDAwMDAwMAotLS0gYS9pcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaXAuaCx2IDEuMTEuMi4xIDIwMDcvMDkvMTQgMDE6MzA6MDIgZ3V5IEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIylpcC5oCTguMiAoQmVya2VsZXkpIDYvMS85NAotICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgaW50ZXJuZXQgcHJvdG9jb2wgdmVyc2lvbiA0LgotICogUGVyIFJGQyA3OTEsIFNlcHRlbWJlciAxOTgxLgotICovCi0jZGVmaW5lCUlQVkVSU0lPTgk0Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gaW50ZXJuZXQgaGVhZGVyLCBuYWtlZCBvZiBvcHRpb25zLgotICoKLSAqIFdlIGRlY2xhcmUgaXBfbGVuIGFuZCBpcF9vZmYgdG8gYmUgc2hvcnQsIHJhdGhlciB0aGFuIHVfc2hvcnQKLSAqIHByYWdtYXRpY2FsbHkgc2luY2Ugb3RoZXJ3aXNlIHVuc2lnbmVkIGNvbXBhcmlzb25zIGNhbiByZXN1bHQKLSAqIGFnYWluc3QgbmVnYXRpdmUgaW50ZWdlcnMgcXVpdGUgZWFzaWx5LCBhbmQgZmFpbCBpbiBzdWJ0bGUgd2F5cy4KLSAqLwotc3RydWN0IGlwIHsKLQl1X2ludDhfdAlpcF92aGw7CQkvKiBoZWFkZXIgbGVuZ3RoLCB2ZXJzaW9uICovCi0jZGVmaW5lIElQX1YoaXApCSgoKGlwKS0+aXBfdmhsICYgMHhmMCkgPj4gNCkKLSNkZWZpbmUgSVBfSEwoaXApCSgoaXApLT5pcF92aGwgJiAweDBmKQotCXVfaW50OF90CWlwX3RvczsJCS8qIHR5cGUgb2Ygc2VydmljZSAqLwotCXVfaW50MTZfdAlpcF9sZW47CQkvKiB0b3RhbCBsZW5ndGggKi8KLQl1X2ludDE2X3QJaXBfaWQ7CQkvKiBpZGVudGlmaWNhdGlvbiAqLwotCXVfaW50MTZfdAlpcF9vZmY7CQkvKiBmcmFnbWVudCBvZmZzZXQgZmllbGQgKi8KLSNkZWZpbmUJSVBfREYgMHg0MDAwCQkJLyogZG9udCBmcmFnbWVudCBmbGFnICovCi0jZGVmaW5lCUlQX01GIDB4MjAwMAkJCS8qIG1vcmUgZnJhZ21lbnRzIGZsYWcgKi8KLSNkZWZpbmUJSVBfT0ZGTUFTSyAweDFmZmYJCS8qIG1hc2sgZm9yIGZyYWdtZW50aW5nIGJpdHMgKi8KLQl1X2ludDhfdAlpcF90dGw7CQkvKiB0aW1lIHRvIGxpdmUgKi8KLQl1X2ludDhfdAlpcF9wOwkJLyogcHJvdG9jb2wgKi8KLQl1X2ludDE2X3QJaXBfc3VtOwkJLyogY2hlY2tzdW0gKi8KLQlzdHJ1Y3QJaW5fYWRkciBpcF9zcmMsaXBfZHN0OwkvKiBzb3VyY2UgYW5kIGRlc3QgYWRkcmVzcyAqLwotfTsKLQotI2RlZmluZQlJUF9NQVhQQUNLRVQJNjU1MzUJCS8qIG1heGltdW0gcGFja2V0IHNpemUgKi8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciBJUCB0eXBlIG9mIHNlcnZpY2UgKGlwX3RvcykKLSAqLwotI2RlZmluZQlJUFRPU19MT1dERUxBWQkJMHgxMAotI2RlZmluZQlJUFRPU19USFJPVUdIUFVUCTB4MDgKLSNkZWZpbmUJSVBUT1NfUkVMSUFCSUxJVFkJMHgwNAotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIElQIHByZWNlZGVuY2UgKGFsc28gaW4gaXBfdG9zKSAoaG9wZWZ1bGx5IHVudXNlZCkKLSAqLwotI2RlZmluZQlJUFRPU19QUkVDX05FVENPTlRST0wJCTB4ZTAKLSNkZWZpbmUJSVBUT1NfUFJFQ19JTlRFUk5FVENPTlRST0wJMHhjMAotI2RlZmluZQlJUFRPU19QUkVDX0NSSVRJQ19FQ1AJCTB4YTAKLSNkZWZpbmUJSVBUT1NfUFJFQ19GTEFTSE9WRVJSSURFCTB4ODAKLSNkZWZpbmUJSVBUT1NfUFJFQ19GTEFTSAkJMHg2MAotI2RlZmluZQlJUFRPU19QUkVDX0lNTUVESUFURQkJMHg0MAotI2RlZmluZQlJUFRPU19QUkVDX1BSSU9SSVRZCQkweDIwCi0jZGVmaW5lCUlQVE9TX1BSRUNfUk9VVElORQkJMHgwMAotCi0vKgotICogRGVmaW5pdGlvbnMgZm9yIG9wdGlvbnMuCi0gKi8KLSNkZWZpbmUJSVBPUFRfQ09QSUVEKG8pCQkoKG8pJjB4ODApCi0jZGVmaW5lCUlQT1BUX0NMQVNTKG8pCQkoKG8pJjB4NjApCi0jZGVmaW5lCUlQT1BUX05VTUJFUihvKQkJKChvKSYweDFmKQotCi0jZGVmaW5lCUlQT1BUX0NPTlRST0wJCTB4MDAKLSNkZWZpbmUJSVBPUFRfUkVTRVJWRUQxCQkweDIwCi0jZGVmaW5lCUlQT1BUX0RFQk1FQVMJCTB4NDAKLSNkZWZpbmUJSVBPUFRfUkVTRVJWRUQyCQkweDYwCi0KLSNkZWZpbmUJSVBPUFRfRU9MCQkwCQkvKiBlbmQgb2Ygb3B0aW9uIGxpc3QgKi8KLSNkZWZpbmUJSVBPUFRfTk9QCQkxCQkvKiBubyBvcGVyYXRpb24gKi8KLQotI2RlZmluZQlJUE9QVF9SUgkJNwkJLyogcmVjb3JkIHBhY2tldCByb3V0ZSAqLwotI2RlZmluZQlJUE9QVF9UUwkJNjgJCS8qIHRpbWVzdGFtcCAqLwotI2RlZmluZQlJUE9QVF9SRkMxMzkzICAgICAgICAgICA4MiAgICAgICAgICAgICAgLyogdHJhY2Vyb3V0ZSBSRkMgMTM5MyAqLwotI2RlZmluZQlJUE9QVF9TRUNVUklUWQkJMTMwCQkvKiBwcm92aWRlIHMsYyxoLHRjYyAqLwotI2RlZmluZQlJUE9QVF9MU1JSCQkxMzEJCS8qIGxvb3NlIHNvdXJjZSByb3V0ZSAqLwotI2RlZmluZQlJUE9QVF9TQVRJRAkJMTM2CQkvKiBzYXRuZXQgaWQgKi8KLSNkZWZpbmUJSVBPUFRfU1NSUgkJMTM3CQkvKiBzdHJpY3Qgc291cmNlIHJvdXRlICovCi0jZGVmaW5lIElQT1BUX1JBICAgICAgICAgICAgICAgIDE0OCAgICAgICAgICAgICAvKiByb3V0ZXItYWxlcnQsIHJmYzIxMTMgKi8KLQotLyoKLSAqIE9mZnNldHMgdG8gZmllbGRzIGluIG9wdGlvbnMgb3RoZXIgdGhhbiBFT0wgYW5kIE5PUC4KLSAqLwotI2RlZmluZQlJUE9QVF9PUFRWQUwJCTAJCS8qIG9wdGlvbiBJRCAqLwotI2RlZmluZQlJUE9QVF9PTEVOCQkxCQkvKiBvcHRpb24gbGVuZ3RoICovCi0jZGVmaW5lIElQT1BUX09GRlNFVAkJMgkJLyogb2Zmc2V0IHdpdGhpbiBvcHRpb24gKi8KLSNkZWZpbmUJSVBPUFRfTUlOT0ZGCQk0CQkvKiBtaW4gdmFsdWUgb2YgYWJvdmUgKi8KLQotLyoKLSAqIFRpbWUgc3RhbXAgb3B0aW9uIHN0cnVjdHVyZS4KLSAqLwotc3RydWN0CWlwX3RpbWVzdGFtcCB7Ci0JdV9pbnQ4X3QJaXB0X2NvZGU7CS8qIElQT1BUX1RTICovCi0JdV9pbnQ4X3QJaXB0X2xlbjsJLyogc2l6ZSBvZiBzdHJ1Y3R1cmUgKHZhcmlhYmxlKSAqLwotCXVfaW50OF90CWlwdF9wdHI7CS8qIGluZGV4IG9mIGN1cnJlbnQgZW50cnkgKi8KLQl1X2ludDhfdAlpcHRfb2Zsd2ZsZzsJLyogZmxhZ3MsIG92ZXJmbG93IGNvdW50ZXIgKi8KLSNkZWZpbmUgSVBUU19PRkxXKGlwKQkoKChpcHQpLT5pcHRfb2Zsd2ZsZyAmIDB4ZjApID4+IDQpCi0jZGVmaW5lIElQVFNfRkxHKGlwKQkoKGlwdCktPmlwdF9vZmx3ZmxnICYgMHgwZikKLQl1bmlvbiBpcHRfdGltZXN0YW1wIHsKLQkJdV9pbnQzMl90IGlwdF90aW1lWzFdOwotCQlzdHJ1Y3QJaXB0X3RhIHsKLQkJCXN0cnVjdCBpbl9hZGRyIGlwdF9hZGRyOwotCQkJdV9pbnQzMl90IGlwdF90aW1lOwotCQl9IGlwdF90YVsxXTsKLQl9IGlwdF90aW1lc3RhbXA7Ci19OwotCi0vKiBmbGFnIGJpdHMgZm9yIGlwdF9mbGcgKi8KLSNkZWZpbmUJSVBPUFRfVFNfVFNPTkxZCQkwCQkvKiB0aW1lc3RhbXBzIG9ubHkgKi8KLSNkZWZpbmUJSVBPUFRfVFNfVFNBTkRBRERSCTEJCS8qIHRpbWVzdGFtcHMgYW5kIGFkZHJlc3NlcyAqLwotI2RlZmluZQlJUE9QVF9UU19QUkVTUEVDCTMJCS8qIHNwZWNpZmllZCBtb2R1bGVzIG9ubHkgKi8KLQotLyogYml0cyBmb3Igc2VjdXJpdHkgKG5vdCBieXRlIHN3YXBwZWQpICovCi0jZGVmaW5lCUlQT1BUX1NFQ1VSX1VOQ0xBU1MJMHgwMDAwCi0jZGVmaW5lCUlQT1BUX1NFQ1VSX0NPTkZJRAkweGYxMzUKLSNkZWZpbmUJSVBPUFRfU0VDVVJfRUZUTwkweDc4OWEKLSNkZWZpbmUJSVBPUFRfU0VDVVJfTU1NTQkweGJjNGQKLSNkZWZpbmUJSVBPUFRfU0VDVVJfUkVTVFIJMHhhZjEzCi0jZGVmaW5lCUlQT1BUX1NFQ1VSX1NFQ1JFVAkweGQ3ODgKLSNkZWZpbmUJSVBPUFRfU0VDVVJfVE9QU0VDUkVUCTB4NmJjNQotCi0vKgotICogSW50ZXJuZXQgaW1wbGVtZW50YXRpb24gcGFyYW1ldGVycy4KLSAqLwotI2RlZmluZQlNQVhUVEwJCTI1NQkJLyogbWF4aW11bSB0aW1lIHRvIGxpdmUgKHNlY29uZHMpICovCi0jZGVmaW5lCUlQREVGVFRMCTY0CQkvKiBkZWZhdWx0IHR0bCwgZnJvbSBSRkMgMTM0MCAqLwotI2RlZmluZQlJUEZSQUdUVEwJNjAJCS8qIHRpbWUgdG8gbGl2ZSBmb3IgZnJhZ3MsIHNsb3doeiAqLwotI2RlZmluZQlJUFRUTERFQwkxCQkvKiBzdWJ0cmFjdGVkIHdoZW4gZm9yd2FyZGluZyAqLwotCi0jZGVmaW5lCUlQX01TUwkJNTc2CQkvKiBkZWZhdWx0IG1heGltdW0gc2VnbWVudCBzaXplICovCi0KLS8qIGluIHByaW50LWlwLmMgKi8KLWV4dGVybiB1X2ludDMyX3QgaXBfZmluZGRzdChjb25zdCBzdHJ1Y3QgaXAgKik7CmRpZmYgLS1naXQgYS9pcDYuaCBiL2lwNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y0NjVjLi4wMDAwMDAwCi0tLSBhL2lwNi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvaXA2LmgsdiAxLjYuNC4xIDIwMDUvMDQvMjAgMTA6MDQ6MzcgZ3V5IEV4cCAkIChMQkwpICovCi0vKgkkTmV0QlNEOiBpcDYuaCx2IDEuOSAyMDAwLzA3LzEzIDA1OjM0OjIxIGl0b2p1biBFeHAgJAkqLwotLyoJJEtBTUU6IGlwNi5oLHYgMS45IDIwMDAvMDcvMDIgMjE6MDE6MzIgaXRvanVuIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKWlwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MwotICovCi0KLSNpZm5kZWYgX05FVElORVRfSVA2X0hfCi0jZGVmaW5lIF9ORVRJTkVUX0lQNl9IXwotCi0vKgotICogRGVmaW5pdGlvbiBmb3IgaW50ZXJuZXQgcHJvdG9jb2wgdmVyc2lvbiA2LgotICogUkZDIDI0NjAKLSAqLwotCi1zdHJ1Y3QgaXA2X2hkciB7Ci0JdW5pb24gewotCQlzdHJ1Y3QgaXA2X2hkcmN0bCB7Ci0JCQl1X2ludDMyX3QgaXA2X3VuMV9mbG93OwkvKiAyMCBiaXRzIG9mIGZsb3ctSUQgKi8KLQkJCXVfaW50MTZfdCBpcDZfdW4xX3BsZW47CS8qIHBheWxvYWQgbGVuZ3RoICovCi0JCQl1X2ludDhfdCAgaXA2X3VuMV9ueHQ7CS8qIG5leHQgaGVhZGVyICovCi0JCQl1X2ludDhfdCAgaXA2X3VuMV9obGltOwkvKiBob3AgbGltaXQgKi8KLQkJfSBpcDZfdW4xOwotCQl1X2ludDhfdCBpcDZfdW4yX3ZmYzsJLyogNCBiaXRzIHZlcnNpb24sIHRvcCA0IGJpdHMgY2xhc3MgKi8KLQl9IGlwNl9jdGx1bjsKLQlzdHJ1Y3QgaW42X2FkZHIgaXA2X3NyYzsJLyogc291cmNlIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgaW42X2FkZHIgaXA2X2RzdDsJLyogZGVzdGluYXRpb24gYWRkcmVzcyAqLwotfTsKLQotI2RlZmluZSBpcDZfdmZjCQlpcDZfY3RsdW4uaXA2X3VuMl92ZmMKLSNkZWZpbmUgaXA2X2Zsb3cJaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9mbG93Ci0jZGVmaW5lIGlwNl9wbGVuCWlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfcGxlbgotI2RlZmluZSBpcDZfbnh0CQlpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX254dAotI2RlZmluZSBpcDZfaGxpbQlpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2hsaW0KLSNkZWZpbmUgaXA2X2hvcHMJaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9obGltCi0KLS8qIGluIG5ldHdvcmsgZW5kaWFuICovCi0jZGVmaW5lIElQVjZfRkxPV0lORk9fTUFTSwkoKHVfaW50MzJfdClodG9ubCgweDBmZmZmZmZmKSkJLyogZmxvdyBpbmZvICgyOCBiaXRzKSAqLwotI2RlZmluZSBJUFY2X0ZMT1dMQUJFTF9NQVNLCSgodV9pbnQzMl90KWh0b25sKDB4MDAwZmZmZmYpKQkvKiBmbG93IGxhYmVsICgyMCBiaXRzKSAqLwotI2lmIDEKLS8qIEVDTiBiaXRzIHByb3Bvc2VkIGJ5IFNhbGx5IEZsb3lkICovCi0jZGVmaW5lIElQNlRPU19DRQkJMHgwMQkvKiBjb25nZXN0aW9uIGV4cGVyaWVuY2VkICovCi0jZGVmaW5lIElQNlRPU19FQ1QJCTB4MDIJLyogRUNOLWNhcGFibGUgdHJhbnNwb3J0ICovCi0jZW5kaWYKLQotLyoKLSAqIEV4dGVuc2lvbiBIZWFkZXJzCi0gKi8KLQotc3RydWN0CWlwNl9leHQgewotCXVfY2hhcglpcDZlX254dDsKLQl1X2NoYXIJaXA2ZV9sZW47Ci19OwotCi0vKiBIb3AtYnktSG9wIG9wdGlvbnMgaGVhZGVyICovCi0vKiBYWFggc2hvdWxkIHdlIHBhZCBpdCB0byBmb3JjZSBhbGlnbm1lbnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5PyAqLwotc3RydWN0IGlwNl9oYmggewotCXVfaW50OF90IGlwNmhfbnh0OwkvKiBuZXh0IGhlYWRlciAqLwotCXVfaW50OF90IGlwNmhfbGVuOwkvKiBsZW5ndGggaW4gdW5pdHMgb2YgOCBvY3RldHMgKi8KLQkvKiBmb2xsb3dlZCBieSBvcHRpb25zICovCi19OwotCi0vKiBEZXN0aW5hdGlvbiBvcHRpb25zIGhlYWRlciAqLwotLyogWFhYIHNob3VsZCB3ZSBwYWQgaXQgdG8gZm9yY2UgYWxpZ25tZW50IG9uIGFuIDgtYnl0ZSBib3VuZGFyeT8gKi8KLXN0cnVjdCBpcDZfZGVzdCB7Ci0JdV9pbnQ4X3QgaXA2ZF9ueHQ7CS8qIG5leHQgaGVhZGVyICovCi0JdV9pbnQ4X3QgaXA2ZF9sZW47CS8qIGxlbmd0aCBpbiB1bml0cyBvZiA4IG9jdGV0cyAqLwotCS8qIGZvbGxvd2VkIGJ5IG9wdGlvbnMgKi8KLX07Ci0KLS8qIE9wdGlvbiB0eXBlcyBhbmQgcmVsYXRlZCBtYWNyb3MgKi8KLSNkZWZpbmUgSVA2T1BUX1BBRDEJCTB4MDAJLyogMDAgMCAwMDAwMCAqLwotI2RlZmluZSBJUDZPUFRfUEFETgkJMHgwMQkvKiAwMCAwIDAwMDAxICovCi0jZGVmaW5lIElQNk9QVF9KVU1CTwkJMHhDMgkvKiAxMSAwIDAwMDEwID0gMTk0ICovCi0jZGVmaW5lIElQNk9QVF9KVU1CT19MRU4JNgotI2RlZmluZSBJUDZPUFRfUk9VVEVSX0FMRVJUCTB4MDUJLyogMDAgMCAwMDEwMSAqLwotCi0jZGVmaW5lIElQNk9QVF9SVEFMRVJUX0xFTgk0Ci0jZGVmaW5lIElQNk9QVF9SVEFMRVJUX01MRAkwCS8qIERhdGFncmFtIGNvbnRhaW5zIGFuIE1MRCBtZXNzYWdlICovCi0jZGVmaW5lIElQNk9QVF9SVEFMRVJUX1JTVlAJMQkvKiBEYXRhZ3JhbSBjb250YWlucyBhbiBSU1ZQIG1lc3NhZ2UgKi8KLSNkZWZpbmUgSVA2T1BUX1JUQUxFUlRfQUNUTkVUCTIgCS8qIGNvbnRhaW5zIGFuIEFjdGl2ZSBOZXR3b3JrcyBtc2cgKi8KLSNkZWZpbmUgSVA2T1BUX01JTkxFTgkJMgotCi0jZGVmaW5lIElQNk9QVF9CSU5ESU5HX1VQREFURQkweGM2CS8qIDExIDAgMDAxMTAgKi8KLSNkZWZpbmUgSVA2T1BUX0JJTkRJTkdfQUNLCTB4MDcJLyogMDAgMCAwMDExMSAqLwotI2RlZmluZSBJUDZPUFRfQklORElOR19SRVEJMHgwOAkvKiAwMCAwIDAxMDAwICovCi0jZGVmaW5lIElQNk9QVF9IT01FX0FERFJFU1MJMHhjOQkvKiAxMSAwIDAxMDAxICovCi0jZGVmaW5lIElQNk9QVF9FSUQJCTB4OGEJLyogMTAgMCAwMTAxMCAqLwotCi0jZGVmaW5lIElQNk9QVF9UWVBFKG8pCQkoKG8pICYgMHhDMCkKLSNkZWZpbmUgSVA2T1BUX1RZUEVfU0tJUAkweDAwCi0jZGVmaW5lIElQNk9QVF9UWVBFX0RJU0NBUkQJMHg0MAotI2RlZmluZSBJUDZPUFRfVFlQRV9GT1JDRUlDTVAJMHg4MAotI2RlZmluZSBJUDZPUFRfVFlQRV9JQ01QCTB4QzAKLQotI2RlZmluZSBJUDZPUFRfTVVUQUJMRQkJMHgyMAotCi0vKiBSb3V0aW5nIGhlYWRlciAqLwotc3RydWN0IGlwNl9ydGhkciB7Ci0JdV9pbnQ4X3QgIGlwNnJfbnh0OwkvKiBuZXh0IGhlYWRlciAqLwotCXVfaW50OF90ICBpcDZyX2xlbjsJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCi0JdV9pbnQ4X3QgIGlwNnJfdHlwZTsJLyogcm91dGluZyB0eXBlICovCi0JdV9pbnQ4X3QgIGlwNnJfc2VnbGVmdDsJLyogc2VnbWVudHMgbGVmdCAqLwotCS8qIGZvbGxvd2VkIGJ5IHJvdXRpbmcgdHlwZSBzcGVjaWZpYyBkYXRhICovCi19OwotCi0vKiBUeXBlIDAgUm91dGluZyBoZWFkZXIgKi8KLXN0cnVjdCBpcDZfcnRoZHIwIHsKLQl1X2ludDhfdCAgaXA2cjBfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KLQl1X2ludDhfdCAgaXA2cjBfbGVuOwkJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCi0JdV9pbnQ4X3QgIGlwNnIwX3R5cGU7CQkvKiBhbHdheXMgemVybyAqLwotCXVfaW50OF90ICBpcDZyMF9zZWdsZWZ0OwkvKiBzZWdtZW50cyBsZWZ0ICovCi0JdV9pbnQ4X3QgIGlwNnIwX3Jlc2VydmVkOwkvKiByZXNlcnZlZCBmaWVsZCAqLwotCXVfaW50OF90ICBpcDZyMF9zbG1hcFszXTsJLyogc3RyaWN0L2xvb3NlIGJpdCBtYXAgKi8KLQlzdHJ1Y3QgaW42X2FkZHIgaXA2cjBfYWRkclsxXTsJLyogdXAgdG8gMjMgYWRkcmVzc2VzICovCi19OwotCi0vKiBGcmFnbWVudCBoZWFkZXIgKi8KLXN0cnVjdCBpcDZfZnJhZyB7Ci0JdV9pbnQ4X3QgIGlwNmZfbnh0OwkJLyogbmV4dCBoZWFkZXIgKi8KLQl1X2ludDhfdCAgaXA2Zl9yZXNlcnZlZDsJLyogcmVzZXJ2ZWQgZmllbGQgKi8KLQl1X2ludDE2X3QgaXA2Zl9vZmZsZzsJCS8qIG9mZnNldCwgcmVzZXJ2ZWQsIGFuZCBmbGFnICovCi0JdV9pbnQzMl90IGlwNmZfaWRlbnQ7CQkvKiBpZGVudGlmaWNhdGlvbiAqLwotfTsKLQotI2RlZmluZSBJUDZGX09GRl9NQVNLCQkweGZmZjgJLyogbWFzayBvdXQgb2Zmc2V0IGZyb20gaXA2Zl9vZmZsZyAqLwotI2RlZmluZSBJUDZGX1JFU0VSVkVEX01BU0sJMHgwMDA2CS8qIHJlc2VydmVkIGJpdHMgaW4gaXA2Zl9vZmZsZyAqLwotI2RlZmluZSBJUDZGX01PUkVfRlJBRwkJMHgwMDAxCS8qIG1vcmUtZnJhZ21lbnRzIGZsYWcgKi8KLQotI2VuZGlmIC8qIG5vdCBfTkVUSU5FVF9JUDZfSF8gKi8KZGlmZiAtLWdpdCBhL2lwZmMuaCBiL2lwZmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgyMmQ0YS4uMDAwMDAwMAotLS0gYS9pcGZjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9pcGZjLmgsdiAxLjQgMjAwMi8xMi8xMSAwNzoxMzo1MyBndXkgRXhwICQgKExCTCkKLSAqLwotCi1zdHJ1Y3QgaXBmY19oZWFkZXIgewotCXVfY2hhciAgaXBmY19kaG9zdFs4XTsKLQl1X2NoYXIgIGlwZmNfc2hvc3RbOF07Ci19OwotCi0jZGVmaW5lIElQRkNfSERSTEVOIDE2CmRpZmYgLS1naXQgYS9pcHByb3RvLmMgYi9pcHByb3RvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY2ZWEzNTYuLjAwMDAwMDAKLS0tIGEvaXBwcm90by5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2lwcHJvdG8uYyx2IDEuMy4yLjMgMjAwNS8wOS8yMCAwNjowNTozNyBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJpcHByb3RvLmgiCi0KLXN0cnVjdCB0b2sgaXBwcm90b192YWx1ZXNbXSA9IHsKLSAgICB7IElQUFJPVE9fSE9QT1BUUywgIk9wdGlvbnMiIH0sCi0gICAgeyBJUFBST1RPX0lDTVAsICJJQ01QIiB9LAotICAgIHsgSVBQUk9UT19JR01QLCAiSUdNUCIgfSwKLSAgICB7IElQUFJPVE9fSVBWNCwgIklQSVAiIH0sCi0gICAgeyBJUFBST1RPX1RDUCwgIlRDUCIgfSwKLSAgICB7IElQUFJPVE9fRUdQLCAiRUdQIiB9LAotICAgIHsgSVBQUk9UT19QSUdQLCAiSUdSUCIgfSwKLSAgICB7IElQUFJPVE9fVURQLCAiVURQIiB9LAotICAgIHsgSVBQUk9UT19EQ0NQLCAiRENDUCIgfSwKLSAgICB7IElQUFJPVE9fSVBWNiwgIklQdjYiIH0sCi0gICAgeyBJUFBST1RPX1JPVVRJTkcsICJSb3V0aW5nIiB9LAotICAgIHsgSVBQUk9UT19GUkFHTUVOVCwgIkZyYWdtZW50IiB9LAotICAgIHsgSVBQUk9UT19SU1ZQLCAiUlNWUCIgfSwKLSAgICB7IElQUFJPVE9fR1JFLCAiR1JFIiB9LAotICAgIHsgSVBQUk9UT19FU1AsICJFU1AiIH0sCi0gICAgeyBJUFBST1RPX0FILCAiQUgiIH0sCi0gICAgeyBJUFBST1RPX01PQklMRSwgIk1vYmlsZSBJUCIgfSwKLSAgICB7IElQUFJPVE9fSUNNUFY2LCAiSUNNUHY2IiB9LAotICAgIHsgSVBQUk9UT19NT0JJTElUWV9PTEQsICJNb2JpbGUgSVAgKG9sZCkiIH0sCi0gICAgeyBJUFBST1RPX0VJR1JQLCAiRUlHUlAiIH0sCi0gICAgeyBJUFBST1RPX09TUEYsICJPU1BGIiB9LAotICAgIHsgSVBQUk9UT19QSU0sICJQSU0iIH0sCi0gICAgeyBJUFBST1RPX0lQQ09NUCwgIkNvbXByZXNzZWQgSVAiIH0sCi0gICAgeyBJUFBST1RPX1ZSUlAsICJWUlJQIiB9LAotICAgIHsgSVBQUk9UT19QR00sICJQR00iIH0sCi0gICAgeyBJUFBST1RPX1NDVFAsICJTQ1RQIiB9LAotICAgIHsgSVBQUk9UT19NT0JJTElUWSwgIk1vYmlsaXR5IiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCmRpZmYgLS1naXQgYS9pcHByb3RvLmggYi9pcHByb3RvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGY3ODUuLjAwMDAwMDAKLS0tIGEvaXBwcm90by5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTAsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9pcHByb3RvLmgsdiAxLjQuMi4yIDIwMDUvMDkvMjAgMDY6MDU6MzcgZ3V5IEV4cCAkIChMQkwpCi0gKgotICogRnJvbToKLSAqCUAoIylpbi5oCTguMyAoQmVya2VsZXkpIDEvMy85NAotICogJEZyZWVCU0Q6IHNyYy9zeXMvbmV0aW5ldC9pbi5oLHYgMS4zOC4yLjMgMTk5OS8wOC8yOSAxNjoyOTozNCBwZXRlciBFeHAgJAotICovCi0KLWV4dGVybiBzdHJ1Y3QgdG9rIGlwcHJvdG9fdmFsdWVzW107Ci0KLSNpZm5kZWYgSVBQUk9UT19JUAotI2RlZmluZQlJUFBST1RPX0lQCQkwCQkvKiBkdW1teSBmb3IgSVAgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX0hPUE9QVFMKLSNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCQkvKiBJUHY2IGhvcC1ieS1ob3Agb3B0aW9ucyAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fSUNNUAotI2RlZmluZQlJUFBST1RPX0lDTVAJCTEJCS8qIGNvbnRyb2wgbWVzc2FnZSBwcm90b2NvbCAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fSUdNUAotI2RlZmluZQlJUFBST1RPX0lHTVAJCTIJCS8qIGdyb3VwIG1nbXQgcHJvdG9jb2wgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX0lQVjQKLSNkZWZpbmUgSVBQUk9UT19JUFY0CQk0Ci0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19UQ1AKLSNkZWZpbmUJSVBQUk9UT19UQ1AJCTYJCS8qIHRjcCAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fRUdQCi0jZGVmaW5lCUlQUFJPVE9fRUdQCQk4CQkvKiBleHRlcmlvciBnYXRld2F5IHByb3RvY29sICovCi0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19QSUdQCi0jZGVmaW5lIElQUFJPVE9fUElHUAkJOQotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fVURQCi0jZGVmaW5lCUlQUFJPVE9fVURQCQkxNwkJLyogdXNlciBkYXRhZ3JhbSBwcm90b2NvbCAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fRENDUAotI2RlZmluZQlJUFBST1RPX0RDQ1AJCTMzCQkvKiBkYXRhZ3JhbSBjb25nZXN0aW9uIGNvbnRyb2wgcHJvdG9jb2wgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX0lQVjYKLSNkZWZpbmUgSVBQUk9UT19JUFY2CQk0MQotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fUk9VVElORwotI2RlZmluZSBJUFBST1RPX1JPVVRJTkcJCTQzCQkvKiBJUHY2IHJvdXRpbmcgaGVhZGVyICovCi0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19GUkFHTUVOVAotI2RlZmluZSBJUFBST1RPX0ZSQUdNRU5UCTQ0CQkvKiBJUHY2IGZyYWdtZW50YXRpb24gaGVhZGVyICovCi0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19SU1ZQCi0jZGVmaW5lIElQUFJPVE9fUlNWUAkJNDYgCQkvKiByZXNvdXJjZSByZXNlcnZhdGlvbiAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fR1JFCi0jZGVmaW5lCUlQUFJPVE9fR1JFCQk0NwkJLyogR2VuZXJhbCBSb3V0aW5nIEVuY2FwLiAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fRVNQCi0jZGVmaW5lCUlQUFJPVE9fRVNQCQk1MAkJLyogU0lQUCBFbmNhcCBTZWMuIFBheWxvYWQgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX0FICi0jZGVmaW5lCUlQUFJPVE9fQUgJCTUxCQkvKiBTSVBQIEF1dGggSGVhZGVyICovCi0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19NT0JJTEUKLSNkZWZpbmUgSVBQUk9UT19NT0JJTEUJCTU1Ci0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19JQ01QVjYKLSNkZWZpbmUgSVBQUk9UT19JQ01QVjYJCTU4CQkvKiBJQ01QdjYgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX05PTkUKLSNkZWZpbmUgSVBQUk9UT19OT05FCQk1OQkJLyogSVB2NiBubyBuZXh0IGhlYWRlciAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fRFNUT1BUUwotI2RlZmluZSBJUFBST1RPX0RTVE9QVFMJCTYwCQkvKiBJUHY2IGRlc3RpbmF0aW9uIG9wdGlvbnMgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX01PQklMSVRZX09MRAotLyoKLSAqIFRoZSBjdXJyZW50IFByb3RvY29sIE51bWJlcnMgbGlzdCBzYXlzIHRoYXQgdGhlIElQIHByb3RvY29sIG51bWJlciBmb3IKLSAqIG1vYmlsaXR5IGhlYWRlcnMgaXMgMTM1OyBpdCBjaXRlcyBkcmFmdC1pZXRmLW1vYmlsZWlwLWlwdjYtMjQsIGJ1dAotICogdGhhdCBkcmFmdCBkb2Vzbid0IGFjdHVhbGx5IGdpdmUgYSBudW1iZXIuCi0gKgotICogSXQgYXBwZWFycyB0aGF0IDYyIHVzZWQgdG8gYmUgdXNlZCwgZXZlbiB0aG91Z2ggdGhhdCdzIGFzc2lnbmVkIHRvCi0gKiBhIHByb3RvY29sIGNhbGxlZCBDRlRQOyBob3dldmVyLCB0aGUgb25seSByZWZlcmVuY2UgZm9yIENGVFAgaXMgYQotICogTmV0d29yayBNZXNzYWdlIGZyb20gQkJOIGJhY2sgaW4gMTk4Miwgc28sIGZvciBub3csIHdlIHN1cHBvcnQgNjIsCi0gKiBhYXMgd2VsbCBhcyAxMzUsIGFzIGEgcHJvdG9jb2wgbnVtYmVyIGZvciBtb2JpbGl0eSBoZWFkZXJzLgotICovCi0jZGVmaW5lIElQUFJPVE9fTU9CSUxJVFlfT0xECTYyCi0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19ORAotI2RlZmluZQlJUFBST1RPX05ECQk3NwkJLyogU3VuIG5ldCBkaXNrIHByb3RvICh0ZW1wLikgKi8KLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX0VJR1JQCi0jZGVmaW5lCUlQUFJPVE9fRUlHUlAJCTg4CQkvKiBDaXNjby9HWFMgSUdSUCAqLwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fT1NQRgotI2RlZmluZSBJUFBST1RPX09TUEYJCTg5Ci0jZW5kaWYKLSNpZm5kZWYgSVBQUk9UT19QSU0KLSNkZWZpbmUgSVBQUk9UT19QSU0JCTEwMwotI2VuZGlmCi0jaWZuZGVmIElQUFJPVE9fSVBDT01QCi0jZGVmaW5lIElQUFJPVE9fSVBDT01QCQkxMDgKLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX1ZSUlAKLSNkZWZpbmUgSVBQUk9UT19WUlJQCQkxMTIKLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX1BHTQotI2RlZmluZSBJUFBST1RPX1BHTSAgICAgICAgICAgICAxMTMKLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX1NDVFAKLSNkZWZpbmUgSVBQUk9UT19TQ1RQCQkxMzIKLSNlbmRpZgotI2lmbmRlZiBJUFBST1RPX01PQklMSVRZCi0jZGVmaW5lIElQUFJPVE9fTU9CSUxJVFkJMTM1Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2lwc2VjX2RvaS5oIGIvaXBzZWNfZG9pLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDA1ZWEuLjAwMDAwMDAKLS0tIGEvaXBzZWNfZG9pLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLS8qIFlJUFMgQCgjKSRJZDogaXBzZWNfZG9pLmgsdiAxLjcgMjAwMi8xMi8xMSAwNzoxMzo1MyBndXkgRXhwICQgKi8KLQotLyogcmVmZXIgdG8gUkZDIDI0MDcgKi8KLQotI2lmICFkZWZpbmVkKF9JUFNFQ19ET0lfSF8pCi0jZGVmaW5lIF9JUFNFQ19ET0lfSF8KLQotI2RlZmluZSBJUFNFQ19ET0kgMQotCi0vKiA0LjIgSVBTRUMgU2l0dWF0aW9uIERlZmluaXRpb24gKi8KLSNkZWZpbmUgSVBTRUNET0lfU0lUX0lERU5USVRZX09OTFkgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgSVBTRUNET0lfU0lUX1NFQ1JFQ1kgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSVBTRUNET0lfU0lUX0lOVEVHUklUWSAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKLQotLyogNC40LjEgSVBTRUMgU2VjdXJpdHkgUHJvdG9jb2wgSWRlbnRpZmllcnMgKi8KLSAgLyogNC40LjIgSVBTRUMgSVNBS01QIFRyYW5zZm9ybSBWYWx1ZXMgKi8KLSNkZWZpbmUgSVBTRUNET0lfUFJPVE9fSVNBS01QICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSAgIElQU0VDRE9JX0tFWV9JS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLQotLyogNC40LjEgSVBTRUMgU2VjdXJpdHkgUHJvdG9jb2wgSWRlbnRpZmllcnMgKi8KLSNkZWZpbmUgSVBTRUNET0lfUFJPVE9fSVBTRUNfQUggICAgICAgICAgICAgICAgICAgICAgMgotICAvKiA0LjQuMyBJUFNFQyBBSCBUcmFuc2Zvcm0gVmFsdWVzICovCi0jZGVmaW5lICAgSVBTRUNET0lfQUhfTUQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSAgIElQU0VDRE9JX0FIX1NIQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgICBJUFNFQ0RPSV9BSF9ERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lICAgSVBTRUNET0lfQUhfU0hBMl8yNTYgICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSAgIElQU0VDRE9JX0FIX1NIQTJfMzg0ICAgICAgICAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgICBJUFNFQ0RPSV9BSF9TSEEyXzUxMiAgICAgICAgICAgICAgICAgICAgICAgICA3Ci0KLS8qIDQuNC4xIElQU0VDIFNlY3VyaXR5IFByb3RvY29sIElkZW50aWZpZXJzICovCi0jZGVmaW5lIElQU0VDRE9JX1BST1RPX0lQU0VDX0VTUCAgICAgICAgICAgICAgICAgICAgIDMKLSAgLyogNC40LjQgSVBTRUMgRVNQIFRyYW5zZm9ybSBJZGVudGlmaWVycyAqLwotI2RlZmluZSAgIElQU0VDRE9JX0VTUF9ERVNfSVY2NCAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfREVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lICAgSVBTRUNET0lfRVNQXzNERVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSAgIElQU0VDRE9JX0VTUF9SQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfSURFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lICAgSVBTRUNET0lfRVNQX0NBU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSAgIElQU0VDRE9JX0VTUF9CTE9XRklTSCAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfM0lERUEgICAgICAgICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lICAgSVBTRUNET0lfRVNQX0RFU19JVjMyICAgICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSAgIElQU0VDRE9JX0VTUF9SQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgICBJUFNFQ0RPSV9FU1BfTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lICAgSVBTRUNET0lfRVNQX1JJSk5EQUVMCQkJCTEyCi0jZGVmaW5lICAgSVBTRUNET0lfRVNQX0FFUwkJCQkxMgotCi0vKiA0LjQuMSBJUFNFQyBTZWN1cml0eSBQcm90b2NvbCBJZGVudGlmaWVycyAqLwotI2RlZmluZSBJUFNFQ0RPSV9QUk9UT19JUENPTVAgICAgICAgICAgICAgICAgICAgICAgICA0Ci0gIC8qIDQuNC41IElQU0VDIElQQ09NUCBUcmFuc2Zvcm0gSWRlbnRpZmllcnMgKi8KLSNkZWZpbmUgICBJUFNFQ0RPSV9JUENPTVBfT1VJICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lICAgSVBTRUNET0lfSVBDT01QX0RFRkxBVEUgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSAgIElQU0VDRE9JX0lQQ09NUF9MWlMgICAgICAgICAgICAgICAgICAgICAgICAgIDMKLQotLyogNC41IElQU0VDIFNlY3VyaXR5IEFzc29jaWF0aW9uIEF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgSVBTRUNET0lfQVRUUl9TQV9MVFlQRSAgICAgICAgICAgICAgICAxIC8qIEIgKi8KLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX1NBX0xUWVBFX0RFRkFVTFQgICAgICAgIDEKLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX1NBX0xUWVBFX1NFQyAgICAgICAgICAgIDEKLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX1NBX0xUWVBFX0tCICAgICAgICAgICAgIDIKLSNkZWZpbmUgSVBTRUNET0lfQVRUUl9TQV9MRFVSICAgICAgICAgICAgICAgICAyIC8qIFYgKi8KLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX1NBX0xEVVJfREVGQVVMVCAgICAgICAgIDI4ODAwIC8qIDggaG91cnMgKi8KLSNkZWZpbmUgSVBTRUNET0lfQVRUUl9HUlBfREVTQyAgICAgICAgICAgICAgICAzIC8qIEIgKi8KLSNkZWZpbmUgSVBTRUNET0lfQVRUUl9FTkNfTU9ERSAgICAgICAgICAgICAgICA0IC8qIEIgKi8KLQkvKiBkZWZhdWx0IHZhbHVlOiBob3N0IGRlcGVuZGVudCAqLwotI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfRU5DX01PREVfVFVOTkVMICAgICAgICAgMQotI2RlZmluZSAgIElQU0VDRE9JX0FUVFJfRU5DX01PREVfVFJOUyAgICAgICAgICAgMgotI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0FVVEggICAgICAgICAgICAgICAgICAgIDUgLyogQiAqLwotCS8qIDAgbWVhbnMgbm90IHRvIHVzZSBhdXRoZW50aWNhdGlvbi4gKi8KLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX0FVVEhfSE1BQ19NRDUgICAgICAgICAgIDEKLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX0FVVEhfSE1BQ19TSEExICAgICAgICAgIDIKLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX0FVVEhfREVTX01BQyAgICAgICAgICAgIDMKLSNkZWZpbmUgICBJUFNFQ0RPSV9BVFRSX0FVVEhfS1BESyAgICAgICAgICAgICAgIDQgLypSRkMtMTgyNihLZXkvUGFkL0RhdGEvS2V5KSovCi0JLyoKLQkgKiBXaGVuIG5lZ290aWF0aW5nIEVTUCB3aXRob3V0IGF1dGhlbnRpY2F0aW9uLCB0aGUgQXV0aAotCSAqIEFsZ29yaXRobSBhdHRyaWJ1dGUgTVVTVCBOT1QgYmUgaW5jbHVkZWQgaW4gdGhlIHByb3Bvc2FsLgotCSAqIFdoZW4gbmVnb3RpYXRpbmcgRVNQIHdpdGhvdXQgY29uZmlkZW50aWFsaXR5LCB0aGUgQXV0aAotCSAqIEFsZ29yaXRobSBhdHRyaWJ1dGUgTVVTVCBiZSBpbmNsdWRlZCBpbiB0aGUgcHJvcG9zYWwgYW5kCi0JICogdGhlIEVTUCB0cmFuc2Zvcm0gSUQgbXVzdCBiZSBFU1BfTlVMTC4KLQkqLwotI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0tFWV9MRU5HVEggICAgICAgICAgICAgIDYgLyogQiAqLwotI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0tFWV9ST1VORFMgICAgICAgICAgICAgIDcgLyogQiAqLwotI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0NPTVBfRElDVF9TSVpFICAgICAgICAgIDggLyogQiAqLwotI2RlZmluZSBJUFNFQ0RPSV9BVFRSX0NPTVBfUFJJVkFMRyAgICAgICAgICAgIDkgLyogViAqLwotCi0vKiA0LjYuMSBTZWN1cml0eSBBc3NvY2lhdGlvbiBQYXlsb2FkICovCi1zdHJ1Y3QgaXBzZWNkb2lfc2EgewotCXN0cnVjdCBpc2FrbXBfZ2VuIGg7Ci0JdV9pbnQzMl90IGRvaTsgLyogRG9tYWluIG9mIEludGVycHJldGF0aW9uICovCi0JdV9pbnQzMl90IHNpdDsgLyogU2l0dWF0aW9uICovCi19OwotCi1zdHJ1Y3QgaXBzZWNkb2lfc2VjcmVjeV9oIHsKLQl1X2ludDE2X3QgbGVuOwotCXVfaW50MTZfdCByZXNlcnZlZDsKLX07Ci0KLS8qIDQuNi4yLjEgSWRlbnRpZmljYXRpb24gVHlwZSBWYWx1ZXMgKi8KLXN0cnVjdCBpcHNlY2RvaV9pZCB7Ci0Jc3RydWN0IGlzYWttcF9nZW4gaDsKLQl1X2ludDhfdCAgdHlwZTsJCS8qIElEIFR5cGUgKi8KLQl1X2ludDhfdCAgcHJvdG9faWQ7CS8qIFByb3RvY29sIElEICovCi0JdV9pbnQxNl90IHBvcnQ7CQkvKiBQb3J0ICovCi0JLyogSWRlbnRpZmljYXRpb24gRGF0YSAqLwotfTsKLQotI2RlZmluZSBJUFNFQ0RPSV9JRF9JUFY0X0FERFIgICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIElQU0VDRE9JX0lEX0ZRRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgSVBTRUNET0lfSURfVVNFUl9GUUROICAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBJUFNFQ0RPSV9JRF9JUFY0X0FERFJfU1VCTkVUICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIElQU0VDRE9JX0lEX0lQVjZfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgSVBTRUNET0lfSURfSVBWNl9BRERSX1NVQk5FVCAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBJUFNFQ0RPSV9JRF9JUFY0X0FERFJfUkFOR0UgICAgICAgICAgICAgICAgICA3Ci0jZGVmaW5lIElQU0VDRE9JX0lEX0lQVjZfQUREUl9SQU5HRSAgICAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgSVBTRUNET0lfSURfREVSX0FTTjFfRE4gICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBJUFNFQ0RPSV9JRF9ERVJfQVNOMV9HTiAgICAgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBJUFNFQ0RPSV9JRF9LRVlfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMQotCi0vKiA0LjYuMyBJUFNFQyBET0kgTm90aWZ5IE1lc3NhZ2UgVHlwZXMgKi8KLS8qIE5vdGlmeSBNZXNzYWdlcyAtIFN0YXR1cyBUeXBlcyAqLwotI2RlZmluZSBJUFNFQ0RPSV9OVFlQRV9SRVNQT05ERVJfTElGRVRJTUUgICAgICAgICAgICAgICAgICAyNDU3NgotI2RlZmluZSBJUFNFQ0RPSV9OVFlQRV9SRVBMQVlfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAyNDU3NwotI2RlZmluZSBJUFNFQ0RPSV9OVFlQRV9JTklUSUFMX0NPTlRBQ1QgICAgICAgICAgICAgICAgICAgICAyNDU3OAotCi0jZW5kaWYgLyogIWRlZmluZWQoX0lQU0VDX0RPSV9IXykgKi8KZGlmZiAtLWdpdCBhL2lweC5oIGIvaXB4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzFjZDUuLjAwMDAwMDAKLS0tIGEvaXB4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogSVBYIHByb3RvY29sIGZvcm1hdHMKLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2lweC5oLHYgMS44IDIwMDIvMTIvMTEgMDc6MTM6NTQgZ3V5IEV4cCAkCi0gKi8KLQotLyogd2VsbC1rbm93biBzb2NrZXRzICovCi0jZGVmaW5lCUlQWF9TS1RfTkNQCQkweDA0NTEKLSNkZWZpbmUJSVBYX1NLVF9TQVAJCTB4MDQ1MgotI2RlZmluZQlJUFhfU0tUX1JJUAkJMHgwNDUzCi0jZGVmaW5lCUlQWF9TS1RfTkVUQklPUwkJMHgwNDU1Ci0jZGVmaW5lCUlQWF9TS1RfRElBR05PU1RJQ1MJMHgwNDU2Ci0jZGVmaW5lCUlQWF9TS1RfTldMSU5LX0RHTQkweDA1NTMJLyogTldMaW5rIGRhdGFncmFtLCBtYXkgY29udGFpbiBTTUIgKi8KLSNkZWZpbmUJSVBYX1NLVF9FSUdSUAkJMHg4NWJlCS8qIENpc2NvIEVJR1JQIG92ZXIgSVBYICovCi0KLS8qIElQWCB0cmFuc3BvcnQgaGVhZGVyICovCi1zdHJ1Y3QgaXB4SGRyIHsKLSAgICB1X2ludDE2X3QJY2tzdW07CQkvKiBDaGVja3N1bSAqLwotICAgIHVfaW50MTZfdAlsZW5ndGg7CQkvKiBMZW5ndGgsIGluIGJ5dGVzLCBpbmNsdWRpbmcgaGVhZGVyICovCi0gICAgdV9pbnQ4X3QJdEN0bDsJCS8qIFRyYW5zcG9ydCBDb250cm9sIChpLmUuIGhvcCBjb3VudCkgKi8KLSAgICB1X2ludDhfdAlwVHlwZTsJCS8qIFBhY2tldCBUeXBlIChpLmUuIGxldmVsIDIgcHJvdG9jb2wpICovCi0gICAgdV9pbnQxNl90CWRzdE5ldFsyXTsJLyogZGVzdGluYXRpb24gbmV0ICovCi0gICAgdV9pbnQ4X3QJZHN0Tm9kZVs2XTsJLyogZGVzdGluYXRpb24gbm9kZSAqLwotICAgIHVfaW50MTZfdAlkc3RTa3Q7CQkvKiBkZXN0aW5hdGlvbiBzb2NrZXQgKi8KLSAgICB1X2ludDE2X3QJc3JjTmV0WzJdOwkvKiBzb3VyY2UgbmV0ICovCi0gICAgdV9pbnQ4X3QJc3JjTm9kZVs2XTsJLyogc291cmNlIG5vZGUgKi8KLSAgICB1X2ludDE2X3QJc3JjU2t0OwkJLyogc291cmNlIHNvY2tldCAqLwotfTsKLQotI2RlZmluZSBpcHhTaXplCTMwCi0KZGlmZiAtLWdpdCBhL2lzYWttcC5oIGIvaXNha21wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZmFjNDAuLjAwMDAwMDAKLS0tIGEvaXNha21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgYW5kIDE5OTggV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLS8qIFlJUFMgQCgjKSRJZDogaXNha21wLmgsdiAxLjEwIDIwMDIvMTIvMTEgMDc6MTM6NTQgZ3V5IEV4cCAkICovCi0KLS8qIHJlZmVyIHRvIFJGQyAyNDA4ICovCi0KLS8qIG11c3QgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAqLwotCi0jaWYgIWRlZmluZWQoX0lTQUtNUF9IXykKLSNkZWZpbmUgX0lTQUtNUF9IXwotCi10eXBlZGVmIHVfY2hhciBjb29raWVfdFs4XTsKLXR5cGVkZWYgdV9jaGFyIG1zZ2lkX3RbNF07Ci0KLXR5cGVkZWYgc3RydWN0IHsgLyogaV9jb29raWUgKyByX2Nvb2tpZSAqLwotCWNvb2tpZV90IGlfY2s7Ci0JY29va2llX3Qgcl9jazsKLX0gaXNha21wX2luZGV4OwotCi0jZGVmaW5lIElOSVRJQVRPUiAgICAgICAxCi0jZGVmaW5lIFJFU1BPTkRFUiAgICAgICAyCi0KLSNkZWZpbmUgUE9SVF9JU0FLTVAgNTAwCi0KLSNkZWZpbmUgR0VORVJBVEUgIDEKLSNkZWZpbmUgVkFMSURBVEUgIDAKLQotLyogUGhhc2Ugb2Ygb2FrbGV5IGRlZmluaXRpb24gKi8KLS8qCi0gIDAwMDAgMDAwMCAwMDAwIDAwMDAKLSAgICAgICB8ICAgIHx8fHwgfHx8fAotICAgICAgIHwgICAgfHx8fCArKysrLS0+IG5lZ29zaWF0aW9uIG51bWJlciBpbiBwaGFzZQotICAgICAgIHwgICAgKysrKy0tLS0tLS0+IHBoYXNlIG51bWJlcgotICAgICAgICstLS0tLS0tLS0tLS0tLS0+IGV4cGlyZSA/Ci0gKi8KLSNkZWZpbmUgSVNBS01QX1BIMSAgICAgIDB4MDAxMAotI2RlZmluZSBJU0FLTVBfUEgyICAgICAgMHgwMDIwCi0jZGVmaW5lIElTQUtNUF9FWFBJUkVEICAweDAxMDAKLQotI2RlZmluZSBJU0FLTVBfTkdQXzAgICAgMHgwMDAwCi0jZGVmaW5lIElTQUtNUF9OR1BfMSAgICAweDAwMDEKLSNkZWZpbmUgSVNBS01QX05HUF8yICAgIDB4MDAwMgotI2RlZmluZSBJU0FLTVBfTkdQXzMgICAgMHgwMDAzCi0jZGVmaW5lIElTQUtNUF9OR1BfNCAgICAweDAwMDQKLQotI2RlZmluZSBJU0FLTVBfUEgxX04gICAgKElTQUtNUF9QSDEgfCBJU0FLTVBfTkdQXzApICAvKiBpLmUuIHNwYXduICovCi0jZGVmaW5lIElTQUtNUF9QSDFfMSAgICAoSVNBS01QX1BIMSB8IElTQUtNUF9OR1BfMSkKLSNkZWZpbmUgSVNBS01QX1BIMV8yICAgIChJU0FLTVBfUEgxIHwgSVNBS01QX05HUF8yKQotI2RlZmluZSBJU0FLTVBfUEgxXzMgICAgKElTQUtNUF9QSDEgfCBJU0FLTVBfTkdQXzMpCi0jZGVmaW5lIElTQUtNUF9QSDJfTiAgICAoSVNBS01QX1BIMiB8IElTQUtNUF9OR1BfMCkKLSNkZWZpbmUgSVNBS01QX1BIMl8xICAgIChJU0FLTVBfUEgyIHwgSVNBS01QX05HUF8xKQotI2RlZmluZSBJU0FLTVBfUEgyXzIgICAgKElTQUtNUF9QSDIgfCBJU0FLTVBfTkdQXzIpCi0jZGVmaW5lIElTQUtNUF9QSDJfMyAgICAoSVNBS01QX1BIMiB8IElTQUtNUF9OR1BfMykKLQotI2RlZmluZSBJU0FLTVBfVElNRVJfREVGQVVMVCAgICAgMTAgLyogc2Vjb25kcyAqLwotI2RlZmluZSBJU0FLTVBfVFJZX0RFRkFVTFQgICAgICAgIDMgLyogdGltZXMgKi8KLQotLyogMy4xIElTQUtNUCBIZWFkZXIgRm9ybWF0Ci0gICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKLSAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKLSAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgISAgTmV4dCBQYXlsb2FkICEgTWpWZXIgISBNblZlciAhIEV4Y2hhbmdlIFR5cGUgISAgICAgRmxhZ3MgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi1zdHJ1Y3QgaXNha21wIHsKLQljb29raWVfdCBpX2NrOwkJLyogSW5pdGlhdG9yIENvb2tpZSAqLwotCWNvb2tpZV90IHJfY2s7CQkvKiBSZXNwb25kZXIgQ29va2llICovCi0JdV9pbnQ4X3QgbnA7CQkvKiBOZXh0IFBheWxvYWQgVHlwZSAqLwotCXVfaW50OF90IHZlcnM7Ci0jZGVmaW5lIElTQUtNUF9WRVJTX01BSk9SCTB4ZjAKLSNkZWZpbmUgSVNBS01QX1ZFUlNfTUFKT1JfU0hJRlQJNAotI2RlZmluZSBJU0FLTVBfVkVSU19NSU5PUgkweDBmCi0jZGVmaW5lIElTQUtNUF9WRVJTX01JTk9SX1NISUZUCTAKLQl1X2ludDhfdCBldHlwZTsJCS8qIEV4Y2hhbmdlIFR5cGUgKi8KLQl1X2ludDhfdCBmbGFnczsJCS8qIEZsYWdzICovCi0JbXNnaWRfdCBtc2dpZDsKLQl1X2ludDMyX3QgbGVuOwkJLyogTGVuZ3RoICovCi19OwotCi0vKiBOZXh0IFBheWxvYWQgVHlwZSAqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX05PTkUgICAwIC8qIE5PTkUqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX1NBICAgICAxIC8qIFNlY3VyaXR5IEFzc29jaWF0aW9uICovCi0jZGVmaW5lIElTQUtNUF9OUFRZUEVfUCAgICAgIDIgLyogUHJvcG9zYWwgKi8KLSNkZWZpbmUgSVNBS01QX05QVFlQRV9UICAgICAgMyAvKiBUcmFuc2Zvcm0gKi8KLSNkZWZpbmUgSVNBS01QX05QVFlQRV9LRSAgICAgNCAvKiBLZXkgRXhjaGFuZ2UgKi8KLSNkZWZpbmUgSVNBS01QX05QVFlQRV9JRCAgICAgNSAvKiBJZGVudGlmaWNhdGlvbiAqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX0NFUlQgICA2IC8qIENlcnRpZmljYXRlICovCi0jZGVmaW5lIElTQUtNUF9OUFRZUEVfQ1IgICAgIDcgLyogQ2VydGlmaWNhdGUgUmVxdWVzdCAqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX0hBU0ggICA4IC8qIEhhc2ggKi8KLSNkZWZpbmUgSVNBS01QX05QVFlQRV9TSUcgICAgOSAvKiBTaWduYXR1cmUgKi8KLSNkZWZpbmUgSVNBS01QX05QVFlQRV9OT05DRSAxMCAvKiBOb25jZSAqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX04gICAgIDExIC8qIE5vdGlmaWNhdGlvbiAqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX0QgICAgIDEyIC8qIERlbGV0ZSAqLwotI2RlZmluZSBJU0FLTVBfTlBUWVBFX1ZJRCAgIDEzIC8qIFZlbmRvciBJRCAqLwotCi0jZGVmaW5lIElTQUtNUF9NQUpPUl9WRVJTSU9OICAxCi0jZGVmaW5lIElTQUtNUF9NSU5PUl9WRVJTSU9OICAwCi0KLS8qIEV4Y2hhbmdlIFR5cGUgKi8KLSNkZWZpbmUgSVNBS01QX0VUWVBFX05PTkUgICAwIC8qIE5PTkUgKi8KLSNkZWZpbmUgSVNBS01QX0VUWVBFX0JBU0UgICAxIC8qIEJhc2UgKi8KLSNkZWZpbmUgSVNBS01QX0VUWVBFX0lERU5UICAyIC8qIElkZW50aXR5IFByb3RlY2l0b24gKi8KLSNkZWZpbmUgSVNBS01QX0VUWVBFX0FVVEggICAzIC8qIEF1dGhlbnRpY2F0aW9uIE9ubHkgKi8KLSNkZWZpbmUgSVNBS01QX0VUWVBFX0FHRyAgICA0IC8qIEFnZ3Jlc3NpdmUgKi8KLSNkZWZpbmUgSVNBS01QX0VUWVBFX0lORiAgICA1IC8qIEluZm9ybWF0aW9uYWwgKi8KLQotLyogRmxhZ3MgKi8KLSNkZWZpbmUgSVNBS01QX0ZMQUdfRSAweDAxIC8qIEVuY3J5cHRpb24gQml0ICovCi0jZGVmaW5lIElTQUtNUF9GTEFHX0MgMHgwMiAvKiBDb21taXQgQml0ICovCi0KLS8qIDMuMiBQYXlsb2FkIEdlbmVyaWMgSGVhZGVyCi0gICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgISBOZXh0IFBheWxvYWQgICEgICBSRVNFUlZFRCAgICAhICAgICAgICAgUGF5bG9hZCBMZW5ndGggICAgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi1zdHJ1Y3QgaXNha21wX2dlbiB7Ci0JdV9pbnQ4X3QgIG5wOyAgICAgICAvKiBOZXh0IFBheWxvYWQgKi8KLQl1X2ludDhfdCAgcmVzZXJ2ZWQ7IC8qIFJFU0VSVkVELCB1bnVzZWQsIG11c3Qgc2V0IHRvIDAgKi8KLQl1X2ludDE2X3QgbGVuOyAgICAgIC8qIFBheWxvYWQgTGVuZ3RoICovCi19OwotCi0vKiAzLjMgRGF0YSBBdHRyaWJ1dGVzCi0gICAgICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgIUEhICAgICAgIEF0dHJpYnV0ZSBUeXBlICAgICAgICAhICAgIEFGPTAgIEF0dHJpYnV0ZSBMZW5ndGggICAgICEKLSAgICAgICAgIUYhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgIEFGPTEgIEF0dHJpYnV0ZSBWYWx1ZSAgICAgICEKLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgLiAgICAgICAgICAgICAgICAgICBBRj0wICBBdHRyaWJ1dGUgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICAgICAgLiAgICAgICAgICAgICAgICAgICBBRj0xICBOb3QgVHJhbnNtaXR0ZWQgICAgICAgICAgICAgICAgICAgICAgIC4KLSAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSovCi1zdHJ1Y3QgaXNha21wX2RhdGEgewotCXVfaW50MTZfdCB0eXBlOyAgICAgLyogZGVmaW5lZCBieSBET0ktc3BlYywgYW5kIEF0dHJpYnV0ZSBGb3JtYXQgKi8KLQl1X2ludDE2X3QgbG9ydjsgICAgIC8qIGlmIGYgZXF1YWwgMSwgQXR0cmlidXRlIExlbmd0aCAqLwotCSAgICAgICAgICAgICAgICAgIC8qIGlmIGYgZXF1YWwgMCwgQXR0cmlidXRlIFZhbHVlICovCi0JLyogaWYgZiBlcXVhbCAxLCBBdHRyaWJ1dGUgVmFsdWUgKi8KLX07Ci0jZGVmaW5lIElTQUtNUF9HRU5fVExWIDB4MDAwMAotI2RlZmluZSBJU0FLTVBfR0VOX1RWICAweDgwMDAKLQkvKiBtYXNrIGZvciB0eXBlIG9mIGF0dHJpYnV0ZSBmb3JtYXQgKi8KLSNkZWZpbmUgSVNBS01QX0dFTl9NQVNLIDB4ODAwMAotCi0vKiAzLjQgU2VjdXJpdHkgQXNzb2NpYXRpb24gUGF5bG9hZCAqLwotCS8qIE1BWSBOT1QgYmUgdXNlZCwgYmVjYXVzZSBvZiBiZWluZyBkZWZpbmVkIGluIGlwc2VjLWRvaS4gKi8KLQkvKgotCUlmIHRoZSBjdXJyZW50IHBheWxvYWQgaXMgdGhlIGxhc3QgaW4gdGhlIG1lc3NhZ2UsCi0JdGhlbiB0aGUgdmFsdWUgb2YgdGhlIG5leHQgcGF5bG9hZCBmaWVsZCB3aWxsIGJlIDAuCi0JVGhpcyBmaWVsZCBNVVNUIE5PVCBjb250YWluIHRoZQotCXZhbHVlcyBmb3IgdGhlIFByb3Bvc2FsIG9yIFRyYW5zZm9ybSBwYXlsb2FkcyBhcyB0aGV5IGFyZSBjb25zaWRlcmVkCi0JcGFydCBvZiB0aGUgc2VjdXJpdHkgYXNzb2NpYXRpb24gbmVnb3RpYXRpb24uICBGb3IgZXhhbXBsZSwgdGhpcwotCWZpZWxkIHdvdWxkIGNvbnRhaW4gdGhlIHZhbHVlICIxMCIgKE5vbmNlIHBheWxvYWQpIGluIHRoZSBmaXJzdAotCW1lc3NhZ2Ugb2YgYSBCYXNlIEV4Y2hhbmdlIChzZWUgU2VjdGlvbiA0LjQpIGFuZCB0aGUgdmFsdWUgIjAiIGluIHRoZQotCWZpcnN0IG1lc3NhZ2Ugb2YgYW4gSWRlbnRpdHkgUHJvdGVjdCBFeGNoYW5nZSAoc2VlIFNlY3Rpb24gNC41KS4KLQkqLwotc3RydWN0IGlzYWttcF9wbF9zYSB7Ci0Jc3RydWN0IGlzYWttcF9nZW4gaDsKLQl1X2ludDMyX3QgZG9pOyAvKiBEb21haW4gb2YgSW50ZXJwcmV0YXRpb24gKi8KLQl1X2ludDMyX3Qgc2l0OyAvKiBTaXR1YXRpb24gKi8KLX07Ci0KLS8qIDMuNSBQcm9wb3NhbCBQYXlsb2FkICovCi0JLyoKLQlUaGUgdmFsdWUgb2YgdGhlIG5leHQgcGF5bG9hZCBmaWVsZCBNVVNUIG9ubHkgY29udGFpbiB0aGUgdmFsdWUgIjIiCi0Jb3IgIjAiLiAgSWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgUHJvcG9zYWwgcGF5bG9hZHMgaW4gdGhlIG1lc3NhZ2UsCi0JdGhlbiB0aGlzIGZpZWxkIHdpbGwgYmUgMi4gIElmIHRoZSBjdXJyZW50IFByb3Bvc2FsIHBheWxvYWQgaXMgdGhlCi0JbGFzdCB3aXRoaW4gdGhlIHNlY3VyaXR5IGFzc29jaWF0aW9uIHByb3Bvc2FsLCB0aGVuIHRoaXMgZmllbGQgd2lsbAotCWJlIDAuCi0JKi8KLXN0cnVjdCBpc2FrbXBfcGxfcCB7Ci0Jc3RydWN0IGlzYWttcF9nZW4gaDsKLQl1X2ludDhfdCBwX25vOyAgICAgIC8qIFByb3Bvc2FsICMgKi8KLQl1X2ludDhfdCBwcm90X2lkOyAgIC8qIFByb3RvY29sICovCi0JdV9pbnQ4X3Qgc3BpX3NpemU7ICAvKiBTUEkgU2l6ZSAqLwotCXVfaW50OF90IG51bV90OyAgICAgLyogTnVtYmVyIG9mIFRyYW5zZm9ybXMgKi8KLQkvKiBTUEkgKi8KLX07Ci0KLS8qIDMuNiBUcmFuc2Zvcm0gUGF5bG9hZCAqLwotCS8qCi0JVGhlIHZhbHVlIG9mIHRoZSBuZXh0IHBheWxvYWQgZmllbGQgTVVTVCBvbmx5IGNvbnRhaW4gdGhlIHZhbHVlICIzIgotCW9yICIwIi4gIElmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIFRyYW5zZm9ybSBwYXlsb2FkcyBpbiB0aGUgcHJvcG9zYWwsCi0JdGhlbiB0aGlzIGZpZWxkIHdpbGwgYmUgMy4gIElmIHRoZSBjdXJyZW50IFRyYW5zZm9ybSBwYXlsb2FkIGlzIHRoZQotCWxhc3Qgd2l0aGluIHRoZSBwcm9wb3NhbCwgdGhlbiB0aGlzIGZpZWxkIHdpbGwgYmUgMC4KLQkqLwotc3RydWN0IGlzYWttcF9wbF90IHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCXVfaW50OF90ICB0X25vOyAgICAgLyogVHJhbnNmb3JtICMgKi8KLQl1X2ludDhfdCAgdF9pZDsgICAgIC8qIFRyYW5zZm9ybS1JZCAqLwotCXVfaW50MTZfdCByZXNlcnZlZDsgLyogUkVTRVJWRUQyICovCi0JLyogU0EgQXR0cmlidXRlcyAqLwotfTsKLQotLyogMy43IEtleSBFeGNoYW5nZSBQYXlsb2FkICovCi1zdHJ1Y3QgaXNha21wX3BsX2tlIHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCS8qIEtleSBFeGNoYW5nZSBEYXRhICovCi19OwotCi0vKiAzLjggSWRlbnRpZmljYXRpb24gUGF5bG9hZCAqLwotCS8qIE1VU1QgTk9UIHRvIGJlIHVzZWQsIGJlY2F1c2Ugb2YgYmVpbmcgZGVmaW5lZCBpbiBpcHNlYy1kb2kuICovCi1zdHJ1Y3QgaXNha21wX3BsX2lkIHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCXVuaW9uIHsKLQkJdV9pbnQ4X3QgIGlkX3R5cGU7ICAgLyogSUQgVHlwZSAqLwotCQl1X2ludDMyX3QgZG9pX2RhdGE7ICAvKiBET0kgU3BlY2lmaWMgSUQgRGF0YSAqLwotCX0gZDsKLQkvKiBJZGVudGlmaWNhdGlvbiBEYXRhICovCi19OwotCi0vKiAzLjkgQ2VydGlmaWNhdGUgUGF5bG9hZCAqLwotc3RydWN0IGlzYWttcF9wbF9jZXJ0IHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCXVfaW50OF90IGVuY29kZTsgLyogQ2VydCBFbmNvZGluZyAqLwotCWNoYXIgICBjZXJ0OyAgIC8qIENlcnRpZmljYXRlIERhdGEgKi8KLQkJLyoKLQkJVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YKLQkJY2VydGlmaWNhdGUgb3IgY2VydGlmaWNhdGUtcmVsYXRlZCBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlCi0JCUNlcnRpZmljYXRlIERhdGEgZmllbGQuCi0JCSovCi19OwotCi0vKiBDZXJ0aWZpY2F0ZSBUeXBlICovCi0jZGVmaW5lIElTQUtNUF9DRVJUX05PTkUgICAwCi0jZGVmaW5lIElTQUtNUF9DRVJUX1BLQ1MgICAxCi0jZGVmaW5lIElTQUtNUF9DRVJUX1BHUCAgICAyCi0jZGVmaW5lIElTQUtNUF9DRVJUX0ROUyAgICAzCi0jZGVmaW5lIElTQUtNUF9DRVJUX1NJR04gICA0Ci0jZGVmaW5lIElTQUtNUF9DRVJUX0tFICAgICA1Ci0jZGVmaW5lIElTQUtNUF9DRVJUX0tUICAgICA2Ci0jZGVmaW5lIElTQUtNUF9DRVJUX0NSTCAgICA3Ci0jZGVmaW5lIElTQUtNUF9DRVJUX0FSTCAgICA4Ci0jZGVmaW5lIElTQUtNUF9DRVJUX1NQS0kgICA5Ci0KLS8qIDMuMTAgQ2VydGlmaWNhdGUgUmVxdWVzdCBQYXlsb2FkICovCi1zdHJ1Y3QgaXNha21wX3BsX2NyIHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCXVfaW50OF90IG51bV9jZXJ0OyAvKiAjIENlcnQuIFR5cGVzICovCi0JLyoKLQlDZXJ0aWZpY2F0ZSBUeXBlcyAodmFyaWFibGUgbGVuZ3RoKQotCSAgLS0gQ29udGFpbnMgYSBsaXN0IG9mIHRoZSB0eXBlcyBvZiBjZXJ0aWZpY2F0ZXMgcmVxdWVzdGVkLAotCSAgc29ydGVkIGluIG9yZGVyIG9mIHByZWZlcmVuY2UuICBFYWNoIGluZGl2aWR1YWwgY2VydGlmaWNhdGUKLQkgIHR5cGUgaXMgMSBvY3RldC4gIFRoaXMgZmllbGQgaXMgTk9UIHJlcXVpcmVkbwotCSovCi0JLyogIyBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyAoMSBvY3RldCkgKi8KLQkvKiBDZXJ0aWZpY2F0ZSBBdXRob3JpdGllcyAodmFyaWFibGUgbGVuZ3RoKSAqLwotfTsKLQotLyogMy4xMSBIYXNoIFBheWxvYWQgKi8KLQkvKiBtYXkgbm90IGJlIHVzZWQsIGJlY2F1c2Ugb2YgaGF2aW5nIG9ubHkgZGF0YS4gKi8KLXN0cnVjdCBpc2FrbXBfcGxfaGFzaCB7Ci0Jc3RydWN0IGlzYWttcF9nZW4gaDsKLQkvKiBIYXNoIERhdGEgKi8KLX07Ci0KLS8qIDMuMTIgU2lnbmF0dXJlIFBheWxvYWQgKi8KLQkvKiBtYXkgbm90IGJlIHVzZWQsIGJlY2F1c2Ugb2YgaGF2aW5nIG9ubHkgZGF0YS4gKi8KLXN0cnVjdCBpc2FrbXBfcGxfc2lnIHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCS8qIFNpZ25hdHVyZSBEYXRhICovCi19OwotCi0vKiAzLjEzIE5vbmNlIFBheWxvYWQgKi8KLQkvKiBtYXkgbm90IGJlIHVzZWQsIGJlY2F1c2Ugb2YgaGF2aW5nIG9ubHkgZGF0YS4gKi8KLXN0cnVjdCBpc2FrbXBfcGxfbm9uY2UgewotCXN0cnVjdCBpc2FrbXBfZ2VuIGg7Ci0JLyogTm9uY2UgRGF0YSAqLwotfTsKLQotLyogMy4xNCBOb3RpZmljYXRpb24gUGF5bG9hZCAqLwotc3RydWN0IGlzYWttcF9wbF9uIHsKLQlzdHJ1Y3QgaXNha21wX2dlbiBoOwotCXVfaW50MzJfdCBkb2k7ICAgICAgLyogRG9tYWluIG9mIEludGVycHJldGF0aW9uICovCi0JdV9pbnQ4X3QgIHByb3RfaWQ7ICAvKiBQcm90b2NvbC1JRCAqLwotCXVfaW50OF90ICBzcGlfc2l6ZTsgLyogU1BJIFNpemUgKi8KLQl1X2ludDE2X3QgdHlwZTsgICAgIC8qIE5vdGlmeSBNZXNzYWdlIFR5cGUgKi8KLQkvKiBTUEkgKi8KLQkvKiBOb3RpZmljYXRpb24gRGF0YSAqLwotfTsKLQotLyogMy4xNC4xIE5vdGlmeSBNZXNzYWdlIFR5cGVzICovCi0vKiBOT1RJRlkgTUVTU0FHRVMgLSBFUlJPUiBUWVBFUyAqLwotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9QQVlMT0FEX1RZUEUgICAgICAgICAgIDEKLSNkZWZpbmUgSVNBS01QX05UWVBFX0RPSV9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAyCi0jZGVmaW5lIElTQUtNUF9OVFlQRV9TSVRVQVRJT05fTk9UX1NVUFBPUlRFRCAgICAgICAgMwotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9DT09LSUUgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfTUFKT1JfVkVSU0lPTiAgICAgICAgICA1Ci0jZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX01JTk9SX1ZFUlNJT04gICAgICAgICAgNgotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9FWENIQU5HRV9UWVBFICAgICAgICAgIDcKLSNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfRkxBR1MgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX01FU1NBR0VfSUQgICAgICAgICAgICAgOQotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9QUk9UT0NPTF9JRCAgICAgICAgICAgIDEwCi0jZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX1NQSSAgICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfVFJBTlNGT1JNX0lEICAgICAgICAgICAxMgotI2RlZmluZSBJU0FLTVBfTlRZUEVfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEICAgICAgIDEzCi0jZGVmaW5lIElTQUtNUF9OVFlQRV9OT19QUk9QT1NBTF9DSE9TRU4gICAgICAgICAgICAgMTQKLSNkZWZpbmUgSVNBS01QX05UWVBFX0JBRF9QUk9QT1NBTF9TWU5UQVggICAgICAgICAgICAxNQotI2RlZmluZSBJU0FLTVBfTlRZUEVfUEFZTE9BRF9NQUxGT1JNRUQgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX0tFWV9JTkZPUk1BVElPTiAgICAgICAgMTcKLSNkZWZpbmUgSVNBS01QX05UWVBFX0lOVkFMSURfSURfSU5GT1JNQVRJT04gICAgICAgICAxOAotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9DRVJUX0VOQ09ESU5HICAgICAgICAgIDE5Ci0jZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX0NFUlRJRklDQVRFICAgICAgICAgICAgMjAKLSNkZWZpbmUgSVNBS01QX05UWVBFX0JBRF9DRVJUX1JFUVVFU1RfU1lOVEFYICAgICAgICAyMQotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9DRVJUX0FVVEhPUklUWSAgICAgICAgIDIyCi0jZGVmaW5lIElTQUtNUF9OVFlQRV9JTlZBTElEX0hBU0hfSU5GT1JNQVRJT04gICAgICAgMjMKLSNkZWZpbmUgSVNBS01QX05UWVBFX0FVVEhFTlRJQ0FUSU9OX0ZBSUxFRCAgICAgICAgICAyNAotI2RlZmluZSBJU0FLTVBfTlRZUEVfSU5WQUxJRF9TSUdOQVRVUkUgICAgICAgICAgICAgIDI1Ci0jZGVmaW5lIElTQUtNUF9OVFlQRV9BRERSRVNTX05PVElGSUNBVElPTiAgICAgICAgICAgMjYKLS8qIE5PVElGWSBNRVNTQUdFUyAtIFNUQVRVUyBUWVBFUyAqLwotI2RlZmluZSBJU0FLTVBfTlRZUEVfQ09OTkVDVEVEICAgICAgICAgICAgICAgICAgIDE2Mzg0Ci0vKiB1c2luZyBvbmx5IHRvIGxvZyAqLwotI2RlZmluZSBJU0FLTVBfTE9HX1JFVFJZX0xJTUlUX1JFQUNIRUQgICAgICAgICAgIDY1NTMwCi0KLS8qIDMuMTUgRGVsZXRlIFBheWxvYWQgKi8KLXN0cnVjdCBpc2FrbXBfcGxfZCB7Ci0Jc3RydWN0IGlzYWttcF9nZW4gaDsKLQl1X2ludDMyX3QgZG9pOyAgICAgIC8qIERvbWFpbiBvZiBJbnRlcnByZXRhdGlvbiAqLwotCXVfaW50OF90ICBwcm90X2lkOyAgLyogUHJvdG9jb2wtSWQgKi8KLQl1X2ludDhfdCAgc3BpX3NpemU7IC8qIFNQSSBTaXplICovCi0JdV9pbnQxNl90IG51bV9zcGk7ICAvKiAjIG9mIFNQSXMgKi8KLQkvKiBTUEkoZXMpICovCi19OwotCi0MCi1zdHJ1Y3QgaXNha21wX3BoMXRhYiB7Ci0Jc3RydWN0IGlzYWttcF9waDEgKmhlYWQ7Ci0Jc3RydWN0IGlzYWttcF9waDEgKnRhaWw7Ci0JaW50IGxlbjsKLX07Ci0KLXN0cnVjdCBpc2FrbXBfcGgydGFiIHsKLQlzdHJ1Y3QgaXNha21wX3BoMiAqaGVhZDsKLQlzdHJ1Y3QgaXNha21wX3BoMiAqdGFpbDsKLQlpbnQgbGVuOwotfTsKLQotI2RlZmluZSBFWENIQU5HRV9QUk9YWSAgIDEKLSNkZWZpbmUgRVhDSEFOR0VfTVlTRUxGICAwCi0KLSNkZWZpbmUgUEZTX05FRUQJMQotI2RlZmluZSBQRlNfTk9ORUVECTAKLQotI2VuZGlmIC8qICFkZWZpbmVkKF9JU0FLTVBfSF8pICovCmRpZmYgLS1naXQgYS9sMnRwLmggYi9sMnRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Njg4ODMuLjAwMDAwMDAKLS0tIGEvbDJ0cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9sMnRwLmgsdiAxLjUgMjAwMS8xMS8wNSAxMDowMzoyNyBndXkgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEwyVFAgc3VwcG9ydCBjb250cmlidXRlZCBieSBNb3Rvbm9yaSBTaGluZG8gKG1zaGluZG9AbXNoaW5kby5uZXQpCi0gKi8KLQotCi0jZGVmaW5lIEwyVFBfRkxBR19UWVBFCQkweDgwMDAJLyogVHlwZSAoMD1EYXRhLCAxPUNvbnRyb2wpICovCi0jZGVmaW5lIEwyVFBfRkxBR19MRU5HVEgJMHg0MDAwCS8qIExlbmd0aCAqLwotI2RlZmluZSBMMlRQX0ZMQUdfU0VRVUVOQ0UJMHgwODAwCS8qIFNlcXVlbmNlICovCi0jZGVmaW5lIEwyVFBfRkxBR19PRkZTRVQJMHgwMjAwCS8qIE9mZnNldCAqLwotI2RlZmluZSBMMlRQX0ZMQUdfUFJJT1JJVFkJMHgwMTAwCS8qIFByaW9yaXR5ICovCi0KLSNkZWZpbmUgTDJUUF9WRVJTSU9OX01BU0sJMHgwMDBmCS8qIFZlcnNpb24gTWFzayAqLwotI2RlZmluZSBMMlRQX1ZFUlNJT05fTDJGCTB4MDAwMQkvKiBMMkYgKi8KLSNkZWZpbmUgTDJUUF9WRVJTSU9OX0wyVFAJMHgwMDAyCS8qIEwyVFAgKi8KLQotI2RlZmluZSBMMlRQX0FWUF9IRFJfRkxBR19NQU5EQVRPUlkJMHg4MDAwCS8qIE1hbmRhdG9yeSBGbGFnICovCi0jZGVmaW5lIEwyVFBfQVZQX0hEUl9GTEFHX0hJRERFTgkweDQwMDAJLyogSGlkZGVuIEZsYWcgKi8KLSNkZWZpbmUgTDJUUF9BVlBfSERSX0xFTl9NQVNLCQkweDAzZmYJLyogTGVuZ3RoIE1hc2sgKi8KLQotI2RlZmluZSBMMlRQX0ZSQU1JTkdfQ0FQX1NZTkNfTUFTSwkweDAwMDAwMDAxCS8qIFN5bmNocm9ub3VzICovCi0jZGVmaW5lIEwyVFBfRlJBTUlOR19DQVBfQVNZTkNfTUFTSwkweDAwMDAwMDAyCS8qIEFzeW5jaHJvbm91cyAqLwotCi0jZGVmaW5lIEwyVFBfRlJBTUlOR19UWVBFX1NZTkNfTUFTSwkweDAwMDAwMDAxCS8qIFN5bmNocm9ub3VzICovCi0jZGVmaW5lIEwyVFBfRlJBTUlOR19UWVBFX0FTWU5DX01BU0sJMHgwMDAwMDAwMgkvKiBBc3luY2hyb25vdXMgKi8KLQotI2RlZmluZSBMMlRQX0JFQVJFUl9DQVBfRElHSVRBTF9NQVNLCTB4MDAwMDAwMDEJLyogRGlnaXRhbCAqLwotI2RlZmluZSBMMlRQX0JFQVJFUl9DQVBfQU5BTE9HX01BU0sJMHgwMDAwMDAwMgkvKiBBbmFsb2cgKi8KLQotI2RlZmluZSBMMlRQX0JFQVJFUl9UWVBFX0RJR0lUQUxfTUFTSwkweDAwMDAwMDAxCS8qIERpZ2l0YWwgKi8KLSNkZWZpbmUgTDJUUF9CRUFSRVJfVFlQRV9BTkFMT0dfTUFTSwkweDAwMDAwMDAyCS8qIEFuYWxvZyAqLwotCi0vKiBBdXRoZW4gVHlwZSAqLwotI2RlZmluZSBMMlRQX0FVVEhFTl9UWVBFX1JFU0VSVkVECTB4MDAwMAkvKiBSZXNlcnZlZCAqLwotI2RlZmluZSBMMlRQX0FVVEhFTl9UWVBFX1RFWFRVQUwJMHgwMDAxCS8qIFRleHR1YWwgdXNlcm5hbWUvcGFzc3dvcmQgZXhjaGFuZ2UgKi8KLSNkZWZpbmUgTDJUUF9BVVRIRU5fVFlQRV9DSEFQCQkweDAwMDIJLyogUFBQIENIQVAgKi8KLSNkZWZpbmUgTDJUUF9BVVRIRU5fVFlQRV9QQVAJCTB4MDAwMwkvKiBQUFAgUEFQICovCi0jZGVmaW5lIEwyVFBfQVVUSEVOX1RZUEVfTk9fQVVUSAkweDAwMDQJLyogTm8gQXV0aGVudGljYXRpb24gKi8KLSNkZWZpbmUgTDJUUF9BVVRIRU5fVFlQRV9NU0NIQVB2MQkweDAwMDUJLyogTVNDSEFQdjEgKi8KLQotI2RlZmluZSBMMlRQX1BST1hZX0FVVEhfSURfTUFTSwkJMHgwMGZmCi0KLQpkaWZmIC0tZ2l0IGEvbDJ2cG4uYyBiL2wydnBuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ5OGU2OWEuLjAwMDAwMDAKLS0tIGEvbDJ2cG4uYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCi0gKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9sMnZwbi5jLHYgMS4xIDIwMDQvMDYvMTUgMDk6NDI6NDAgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImwydnBuLmgiCi0KLS8qIGRyYWZ0LWlldGYtcHdlMy1pYW5hLWFsbG9jYXRpb24tMDQgKi8KLXN0cnVjdCB0b2sgbDJ2cG5fZW5jYXBzX3ZhbHVlc1tdID0gewotICAgIHsgMHgwMCwgIlJlc2VydmVkIn0sCi0gICAgeyAweDAxLCAiRnJhbWUgUmVsYXkifSwKLSAgICB7IDB4MDIsICJBVE0gQUFMNSBWQ0MgdHJhbnNwb3J0In0sCi0gICAgeyAweDAzLCAiQVRNIHRyYW5zcGFyZW50IGNlbGwgdHJhbnNwb3J0In0sIAotICAgIHsgMHgwNCwgIkV0aGVybmV0IFZMQU4ifSwgCi0gICAgeyAweDA1LCAiRXRoZXJuZXQifSwgCi0gICAgeyAweDA2LCAiQ2lzY28tSERMQyJ9LCAKLSAgICB7IDB4MDcsICJQUFAifSwgCi0gICAgeyAweDA4LCAiU09ORVQvU0RIIENpcmN1aXQgRW11bGF0aW9uIFNlcnZpY2Ugb3ZlciBNUExTIn0sIAotICAgIHsgMHgwOSwgIkFUTSBuLXRvLW9uZSBWQ0MgY2VsbCB0cmFuc3BvcnQifSwgCi0gICAgeyAweDBhLCAiQVRNIG4tdG8tb25lIFZQQyBjZWxsIHRyYW5zcG9ydCJ9LCAKLSAgICB7IDB4MGIsICJJUCBMYXllcjIgVHJhbnNwb3J0In0sIAotICAgIHsgMHgwYywgIkFUTSBvbmUtdG8tb25lIFZDQyBDZWxsIE1vZGUifSwgCi0gICAgeyAweDBkLCAiQVRNIG9uZS10by1vbmUgVlBDIENlbGwgTW9kZSJ9LAotICAgIHsgMHgwZSwgIkFUTSBBQUw1IFBEVSBWQ0MgdHJhbnNwb3J0In0sCi0gICAgeyAweDBmLCAiRnJhbWUtUmVsYXkgUG9ydCBtb2RlIn0sCi0gICAgeyAweDEwLCAiU09ORVQvU0RIIENpcmN1aXQgRW11bGF0aW9uIG92ZXIgUGFja2V0In0sCi0gICAgeyAweDExLCAiU3RydWN0dXJlLWFnbm9zdGljIEUxIG92ZXIgUGFja2V0In0sCi0gICAgeyAweDEyLCAiU3RydWN0dXJlLWFnbm9zdGljIFQxIChEUzEpIG92ZXIgUGFja2V0In0sCi0gICAgeyAweDEzLCAiU3RydWN0dXJlLWFnbm9zdGljIEUzIG92ZXIgUGFja2V0In0sCi0gICAgeyAweDE0LCAiU3RydWN0dXJlLWFnbm9zdGljIFQzIChEUzMpIG92ZXIgUGFja2V0In0sCi0gICAgeyAweDE1LCAiQ0VTb1BTTiBiYXNpYyBtb2RlIn0sCi0gICAgeyAweDE2LCAiVERNb0lQIGJhc2ljIG1vZGUifSwKLSAgICB7IDB4MTcsICJDRVNvUFNOIFRETSB3aXRoIENBUyJ9LAotICAgIHsgMHgxOCwgIlRETW9JUCBURE0gd2l0aCBDQVMifSwKLSAgICB7IDB4NDAsICJJUC1pbnRlcndvcmtpbmcifSwgCi0gICAgeyAwLCBOVUxMfQotfTsKZGlmZiAtLWdpdCBhL2wydnBuLmggYi9sMnZwbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2NGViMDI0Li4wMDAwMDAwCi0tLSBhL2wydnBuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL2wydnBuLmgsdiAxLjEgMjAwNC8wNi8xNSAwOTo0Mjo0MSBoYW5uZXMgRXhwICQgKExCTCkgKi8KLS8qIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCi0gKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKLSAqLwotCi1leHRlcm4gc3RydWN0IHRvayBsMnZwbl9lbmNhcHNfdmFsdWVzW107CmRpZmYgLS1naXQgYS9sYW5lLmggYi9sYW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjZlMTkuLjAwMDAwMDAKLS0tIGEvbGFuZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIE1hcmtvIEtpaXNraWxhIGNhcm5pbEBjcy50dXQuZmkKLSAqCi0gKiBUYW1wZXJlIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSAtIFRlbGVjb21tdW5pY2F0aW9ucyBMYWJvcmF0b3J5Ci0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzCi0gKiBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsCi0gKiBwcm92aWRlZCB0aGF0IGJvdGggdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMKLSAqIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwKLSAqIGRlcml2YXRpdmUgd29ya3Mgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMKLSAqIHRoZXJlb2YsIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nCi0gKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgaXMKLSAqIGFja25vd2xlZGdlZCBpbiBhbnkgcHVibGljYXRpb25zIHJlc3VsdGluZyBmcm9tIHVzaW5nCi0gKiB0aGUgc29mdHdhcmUuCi0gKgotICogVFVUIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUyAiQVMgSVMiCi0gKiBDT05ESVRJT04gQU5EIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgotICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLgotICoKLSAqLwotCi0vKiAkSWQ6IGxhbmUuaCx2IDEuNyAyMDAyLzEyLzExIDA3OjEzOjU0IGd1eSBFeHAgJCAqLwotCi0jaWZuZGVmIEVUSEVSX0FERFJfTEVOCi0jZGVmaW5lIEVUSEVSX0FERFJfTEVOIDYKLSNlbmRpZgotCi1zdHJ1Y3QgbGVjZGF0YWhkcl84MDIzIHsKLSAgdV9pbnQxNl90IGxlX2hlYWRlcjsKLSAgdV9pbnQ4X3QgaF9kZXN0W0VUSEVSX0FERFJfTEVOXTsKLSAgdV9pbnQ4X3QgaF9zb3VyY2VbRVRIRVJfQUREUl9MRU5dOwotICB1X2ludDE2X3QgaF90eXBlOwotfTsKLQotc3RydWN0IGxhbmVfY29udHJvbGhkciB7Ci0gIHVfaW50MTZfdCBsZWNfaGVhZGVyOwotICB1X2ludDhfdCBsZWNfcHJvdG87Ci0gIHVfaW50OF90IGxlY192ZXJzOwotICB1X2ludDE2X3QgbGVjX29wY29kZTsKLX07CmRpZmYgLS1naXQgYS9sYmwvb3Mtb3NmNC5oIGIvbGJsL29zLW9zZjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI4NjZlZC4uMDAwMDAwMAotLS0gYS9sYmwvb3Mtb3NmNC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGJsL29zLW9zZjQuaCx2IDEuMSAyMDAyLzEyLzExIDA1OjAzOjEzIGd1eSBFeHAgJCAoTEJMKQotICovCi0KLS8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBEaWdpdGFsIFVOSVggNC54ICovCi1pbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWludAl2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CmRpZmYgLS1naXQgYS9sYmwvb3Mtc29sYXJpczIuaCBiL2xibC9vcy1zb2xhcmlzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQ4MWMyLi4wMDAwMDAwCi0tLSBhL2xibC9vcy1zb2xhcmlzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGJsL29zLXNvbGFyaXMyLmgsdiAxLjE5IDIwMDAvMTAvMTEgMDQ6MDI6MTUgZ3V5IEV4cCAkIChMQkwpCi0gKi8KLQotLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFN1bk9TIDUgKi8KLSNpZiBkZWZpbmVkKF9TVERJT19IKSAmJiBkZWZpbmVkKEhBVkVfU0VUTElORUJVRikKLWludAlzZXRsaW5lYnVmKEZJTEUgKik7Ci0jZW5kaWYKLWNoYXIgICAgKnN0cmVycm9yKGludCk7Ci1pbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWludAlzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2xibC9vcy1zdW5vczQuaCBiL2xibC9vcy1zdW5vczQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwZjI1Zi4uMDAwMDAwMAotLS0gYS9sYmwvb3Mtc3Vub3M0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGJsL29zLXN1bm9zNC5oLHYgMS4zMi4xLjEgMTk5OS8xMC8wNyAyMzo0NzoxMyBtY3IgRXhwICQgKExCTCkKLSAqLwotCi0vKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gU3VuT1MgNCAqLwotI2lmZGVmIEZJTEUKLWludAlfZmlsYnVmKEZJTEUgKik7Ci1pbnQJX2Zsc2J1Zih1X2NoYXIsIEZJTEUgKik7Ci1pbnQJZmNsb3NlKEZJTEUgKik7Ci1pbnQJZmZsdXNoKEZJTEUgKik7Ci1pbnQJZmdldGMoRklMRSAqKTsKLWludAlmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotaW50CWZwdXRjKGludCwgRklMRSAqKTsKLWludAlmcHV0cyhjb25zdCBjaGFyICosIEZJTEUgKik7Ci11X2ludAlmcmVhZCh2b2lkICosIHVfaW50LCB1X2ludCwgRklMRSAqKTsKLWludAlmc2VlayhGSUxFICosIGxvbmcsIGludCk7Ci11X2ludAlmd3JpdGUoY29uc3Qgdm9pZCAqLCB1X2ludCwgdV9pbnQsIEZJTEUgKik7Ci1pbnQJcGNsb3NlKEZJTEUgKik7Ci12b2lkCXJld2luZChGSUxFICopOwotdm9pZAlzZXRidWYoRklMRSAqLCBjaGFyICopOwotaW50CXNldGxpbmVidWYoRklMRSAqKTsKLWludAl1bmdldGMoaW50LCBGSUxFICopOwotaW50CXZmcHJpbnRmKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pOwotaW50CXZwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOwotI2VuZGlmCi0KLSNpZiBfX0dOVUNfXyA8PSAxCi1pbnQJcmVhZChpbnQsIGNoYXIgKiwgdV9pbnQpOwotaW50CXdyaXRlKGludCwgY2hhciAqLCB1X2ludCk7Ci0jZW5kaWYKLQotbG9uZwlhNjRsKGNvbnN0IGNoYXIgKik7Ci0jaWZkZWYgX19TVERDX18KLXN0cnVjdAlzb2NrYWRkcjsKLSNlbmRpZgotaW50CWFjY2VwdChpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQgKik7Ci1pbnQJYmluZChpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQpOwotaW50CWJjbXAoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICosIHVfaW50KTsKLXZvaWQJYmNvcHkoY29uc3Qgdm9pZCAqLCB2b2lkICosIHVfaW50KTsKLXZvaWQJYnplcm8odm9pZCAqLCBpbnQpOwotaW50CWNocm9vdChjb25zdCBjaGFyICopOwotaW50CWNsb3NlKGludCk7Ci12b2lkCWNsb3NlbG9nKHZvaWQpOwotaW50CWNvbm5lY3QoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKLWNoYXIJKmNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWludAlkYWVtb24oaW50LCBpbnQpOwotaW50CWZjaG1vZChpbnQsIGludCk7Ci1pbnQJZmNob3duKGludCwgaW50LCBpbnQpOwotdm9pZAllbmRncmVudCh2b2lkKTsKLXZvaWQJZW5kcHdlbnQodm9pZCk7Ci12b2lkCWVuZHNlcnZlbnQodm9pZCk7Ci0jaWZkZWYgX19TVERDX18KLXN0cnVjdAlldGhlcl9hZGRyOwotI2VuZGlmCi1zdHJ1Y3QJZXRoZXJfYWRkciAqZXRoZXJfYXRvbihjb25zdCBjaGFyICopOwotaW50CWZsb2NrKGludCwgaW50KTsKLSNpZmRlZiBfX1NURENfXwotc3RydWN0CXN0YXQ7Ci0jZW5kaWYKLWludAlmc3RhdChpbnQsIHN0cnVjdCBzdGF0ICopOwotI2lmZGVmIF9fU1REQ19fCi1zdHJ1Y3Qgc3RhdGZzOwotI2VuZGlmCi1pbnQJZnN0YXRmcyhpbnQsIHN0cnVjdCBzdGF0ZnMgKik7Ci1pbnQJZnN5bmMoaW50KTsKLSNpZmRlZiBfX1NURENfXwotc3RydWN0IHRpbWViOwotI2VuZGlmCi1pbnQJZnRpbWUoc3RydWN0IHRpbWViICopOwotaW50CWZ0cnVuY2F0ZShpbnQsIG9mZl90KTsKLWludAlnZXRkdGFibGVzaXplKHZvaWQpOwotbG9uZwlnZXRob3N0aWQodm9pZCk7Ci1pbnQJZ2V0aG9zdG5hbWUoY2hhciAqLCBpbnQpOwotaW50CWdldG9wdChpbnQsIGNoYXIgKiBjb25zdCAqLCBjb25zdCBjaGFyICopOwotaW50CWdldHBhZ2VzaXplKHZvaWQpOwotY2hhcgkqZ2V0cGFzcyhjaGFyICopOwotaW50CWdldHBlZXJuYW1lKGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKLWludAlnZXRwcmlvcml0eShpbnQsIGludCk7Ci0jaWZkZWYgX19TVERDX18KLXN0cnVjdAlybGltaXQ7Ci0jZW5kaWYKLWludAlnZXRybGltaXQoaW50LCBzdHJ1Y3QgcmxpbWl0ICopOwotaW50CWdldHNvY2tuYW1lKGludCwgc3RydWN0IHNvY2thZGRyICosIGludCAqKTsKLWludAlnZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNoYXIgKiwgaW50ICopOwotI2lmZGVmIF9fU1REQ19fCi1zdHJ1Y3QJdGltZXZhbDsKLXN0cnVjdAl0aW1lem9uZTsKLSNlbmRpZgotaW50CWdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqLCBzdHJ1Y3QgdGltZXpvbmUgKik7Ci1jaGFyCSpnZXR1c2Vyc2hlbGwodm9pZCk7Ci1jaGFyCSpnZXR3ZChjaGFyICopOwotaW50CWluaXRncm91cHMoY29uc3QgY2hhciAqLCBpbnQpOwotaW50CWlvY3RsKGludCwgaW50LCBjYWRkcl90KTsKLWludAlpcnVzZXJvayh1X2xvbmcsIGludCwgY2hhciAqLCBjaGFyICopOwotaW50CWlzYXR0eShpbnQpOwotaW50CWtpbGxwZyhpbnQsIGludCk7Ci1pbnQJbGlzdGVuKGludCwgaW50KTsKLSNpZmRlZiBfX1NURENfXwotc3RydWN0CXV0bXA7Ci0jZW5kaWYKLXZvaWQJbG9naW4oc3RydWN0IHV0bXAgKik7Ci1pbnQJbG9nb3V0KGNvbnN0IGNoYXIgKik7Ci1vZmZfdAlsc2VlayhpbnQsIG9mZl90LCBpbnQpOwotaW50CWxzdGF0KGNvbnN0IGNoYXIgKiwgc3RydWN0IHN0YXQgKik7Ci1pbnQJbWtzdGVtcChjaGFyICopOwotY2hhcgkqbWt0ZW1wKGNoYXIgKik7Ci1pbnQJbXVubWFwKGNhZGRyX3QsIGludCk7Ci12b2lkCW9wZW5sb2coY29uc3QgY2hhciAqLCBpbnQsIGludCk7Ci12b2lkCXBlcnJvcihjb25zdCBjaGFyICopOwotaW50CXByaW50Zihjb25zdCBjaGFyICosIC4uLik7Ci1pbnQJcHV0cyhjb25zdCBjaGFyICopOwotbG9uZwlyYW5kb20odm9pZCk7Ci1pbnQJcmVhZGxpbmsoY29uc3QgY2hhciAqLCBjaGFyICosIGludCk7Ci0jaWZkZWYgX19TVERDX18KLXN0cnVjdAlpb3ZlYzsKLSNlbmRpZgotaW50CXJlYWR2KGludCwgc3RydWN0IGlvdmVjICosIGludCk7Ci1pbnQJcmVjdihpbnQsIGNoYXIgKiwgdV9pbnQsIGludCk7Ci1pbnQJcmVjdmZyb20oaW50LCBjaGFyICosIHVfaW50LCBpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQgKik7Ci1pbnQJcmVuYW1lKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLWludAlyY21kKGNoYXIgKiosIHVfc2hvcnQsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqKTsKLWludAlycmVzdnBvcnQoaW50ICopOwotaW50CXNlbmQoaW50LCBjaGFyICosIHVfaW50LCBpbnQpOwotaW50CXNlbmR0byhpbnQsIGNoYXIgKiwgdV9pbnQsIGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7Ci1pbnQJc2V0ZW52KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotaW50CXNldGV1aWQoaW50KTsKLWludAlzZXRwcmlvcml0eShpbnQsIGludCwgaW50KTsKLWludAlzZWxlY3QoaW50LCBmZF9zZXQgKiwgZmRfc2V0ICosIGZkX3NldCAqLCBzdHJ1Y3QgdGltZXZhbCAqKTsKLWludAlzZXRwZ3JwKGludCwgaW50KTsKLXZvaWQJc2V0cHdlbnQodm9pZCk7Ci1pbnQJc2V0cmxpbWl0KGludCwgc3RydWN0IHJsaW1pdCAqKTsKLXZvaWQJc2V0c2VydmVudChpbnQpOwotaW50CXNldHNvY2tvcHQoaW50LCBpbnQsIGludCwgY2hhciAqLCBpbnQpOwotaW50CXNodXRkb3duKGludCwgaW50KTsKLWludAlzaWdibG9jayhpbnQpOwotdm9pZAkoKnNpZ25hbCAoaW50LCB2b2lkICgqKSAoaW50KSkpIChpbnQpOwotaW50CXNpZ3BhdXNlKGludCk7Ci1pbnQJc2lnc2V0bWFzayhpbnQpOwotI2lmZGVmIF9fU1REQ19fCi1zdHJ1Y3QJc2lndmVjOwotI2VuZGlmCi1pbnQJc2lndmVjKGludCwgc3RydWN0IHNpZ3ZlYyAqLCBzdHJ1Y3Qgc2lndmVjKik7Ci1pbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWludAlzb2NrZXQoaW50LCBpbnQsIGludCk7Ci1pbnQJc29ja2V0cGFpcihpbnQsIGludCwgaW50LCBpbnQgKik7Ci1pbnQJc3ltbGluayhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci12b2lkCXNyYW5kb20oaW50KTsKLWludAlzc2NhbmYoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7Ci1pbnQJc3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOwotaW50CXN0YXRmcyhjaGFyICosIHN0cnVjdCBzdGF0ZnMgKik7Ci1jaGFyCSpzdHJlcnJvcihpbnQpOwotaW50CXN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotI2lmZGVmIF9fU1REQ19fCi1zdHJ1Y3QJdG07Ci0jZW5kaWYKLWludAlzdHJmdGltZShjaGFyICosIGludCwgY2hhciAqLCBzdHJ1Y3QgdG0gKik7Ci1pbnQJc3RybmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7Ci1sb25nCXN0cnRvbChjb25zdCBjaGFyICosIGNoYXIgKiosIGludCk7Ci12b2lkCXN5bmModm9pZCk7Ci12b2lkCXN5c2xvZyhpbnQsIGNvbnN0IGNoYXIgKiwgLi4uKTsKLWludAlzeXN0ZW0oY29uc3QgY2hhciAqKTsKLWxvbmcJdGVsbChpbnQpOwotdGltZV90CXRpbWUodGltZV90ICopOwotY2hhcgkqdGltZXpvbmUoaW50LCBpbnQpOwotaW50CXRvbG93ZXIoaW50KTsKLWludAl0b3VwcGVyKGludCk7Ci1pbnQJdHJ1bmNhdGUoY2hhciAqLCBvZmZfdCk7Ci12b2lkCXVuc2V0ZW52KGNvbnN0IGNoYXIgKik7Ci1pbnQJdmZvcmsodm9pZCk7Ci1pbnQJdnNwcmludGYoY2hhciAqLCBjb25zdCBjaGFyICosIC4uLik7Ci1pbnQJd3JpdGV2KGludCwgc3RydWN0IGlvdmVjICosIGludCk7Ci0jaWZkZWYgX19TVERDX18KLXN0cnVjdAlydXNhZ2U7Ci0jZW5kaWYKLWludAl1dGltZXMoY29uc3QgY2hhciAqLCBzdHJ1Y3QgdGltZXZhbCAqKTsKLSNpZiBfX0dOVUNfXyA8PSAxCi1pbnQJd2FpdChpbnQgKik7Ci1waWRfdAl3YWl0MyhpbnQgKiwgaW50LCBzdHJ1Y3QgcnVzYWdlICopOwotI2VuZGlmCi0KLS8qIFVnbHkgc2lnbmFsIGhhY2tpbmcgKi8KLSNpZmRlZiBTSUdfRVJSCi0jdW5kZWYgU0lHX0VSUgotI2RlZmluZSBTSUdfRVJSCQkodm9pZCAoKikoaW50KSktMQotI3VuZGVmIFNJR19ERkwKLSNkZWZpbmUgU0lHX0RGTAkJKHZvaWQgKCopKGludCkpMAotI3VuZGVmIFNJR19JR04KLSNkZWZpbmUgU0lHX0lHTgkJKHZvaWQgKCopKGludCkpMQotCi0jaWZkZWYgS0VSTkVMCi0jdW5kZWYgU0lHX0NBVENICi0jZGVmaW5lIFNJR19DQVRDSAkodm9pZCAoKikoaW50KSkyCi0jZW5kaWYKLSN1bmRlZiBTSUdfSE9MRAotI2RlZmluZSBTSUdfSE9MRAkodm9pZCAoKikoaW50KSkzCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xibC9vcy11bHRyaXg0LmggYi9sYmwvb3MtdWx0cml4NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzZiM2JkLi4wMDAwMDAwCi0tLSBhL2xibC9vcy11bHRyaXg0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9sYmwvb3MtdWx0cml4NC5oLHYgMS4xOS4xLjEgMTk5OS8xMC8wNyAyMzo0NzoxMyBtY3IgRXhwICQgKExCTCkKLSAqLwotCi0vKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gVWx0cml4IDQgKi8KLWludAliY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB1X2ludCk7Ci12b2lkCWJjb3B5KGNvbnN0IHZvaWQgKiwgdm9pZCAqLCB1X2ludCk7Ci12b2lkCWJ6ZXJvKHZvaWQgKiwgdV9pbnQpOwotdm9pZAllbmRzZXJ2ZW50KHZvaWQpOwotaW50CWdldG9wdChpbnQsIGNoYXIgKiBjb25zdCAqLCBjb25zdCBjaGFyICopOwotI2lmZGVmIF9fU1REQ19fCi1zdHJ1Y3QgdGltZXZhbDsKLXN0cnVjdCB0aW1lem9uZTsKLSNlbmRpZgotaW50CWdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqLCBzdHJ1Y3QgdGltZXpvbmUgKik7Ci1pbnQJaW9jdGwoaW50LCBpbnQsIGNhZGRyX3QpOwotaW50CXBmb3BlbihjaGFyICosIGludCk7Ci1pbnQJc2V0bGluZWJ1ZihGSUxFICopOwotaW50CXNvY2tldChpbnQsIGludCwgaW50KTsKLWludAlzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2xsYy5oIGIvbGxjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMDRjNjcuLjAwMDAwMDAKLS0tIGEvbGxjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbGxjLmgsdiAxLjE3LjIuNCAyMDA3LzAyLzA4IDA3OjA3OjUxIGd1eSBFeHAgJCAoTEJMKQotICovCi0KLS8qCi0gKiBEZWZpbml0aW9ucyBmb3IgaW5mb3JtYXRpb24gaW4gdGhlIExMQyBoZWFkZXIuCi0gKi8KLQotI2RlZmluZQlMTENfVV9GTVQJMwotI2RlZmluZQlMTENfR1NBUAkxCi0jZGVmaW5lCUxMQ19JRwkgICAgICAgIDEgLyogSW5kaXZpZHVhbCAvIEdyb3VwICovCi0jZGVmaW5lIExMQ19TX0ZNVAkxCi0KLSNkZWZpbmUJTExDX1VfUE9MTAkweDEwCi0jZGVmaW5lCUxMQ19JU19QT0xMCTB4MDEwMAotI2RlZmluZQlMTENfWElEX0ZJCTB4ODEKLQotI2RlZmluZQlMTENfVV9DTUQodSkJKCh1KSAmIDB4ZWYpCi0jZGVmaW5lCUxMQ19VSQkJMHgwMwotI2RlZmluZQlMTENfVUEJCTB4NjMKLSNkZWZpbmUJTExDX0RJU0MJMHg0MwotI2RlZmluZQlMTENfRE0JCTB4MGYKLSNkZWZpbmUJTExDX1NBQk1FCTB4NmYKLSNkZWZpbmUJTExDX1RFU1QJMHhlMwotI2RlZmluZQlMTENfWElECQkweGFmCi0jZGVmaW5lCUxMQ19GUk1SCTB4ODcKLQotI2RlZmluZQlMTENfU19DTUQoaXMpCSgoKGlzKSA+PiAyKSAmIDB4MDMpCi0jZGVmaW5lCUxMQ19SUgkJMHgwMDAxCi0jZGVmaW5lCUxMQ19STlIJCTB4MDAwNQotI2RlZmluZQlMTENfUkVKCQkweDAwMDkKLQotI2RlZmluZSBMTENfSVNfTlIoaXMpCSgoKGlzKSA+PiA5KSAmIDB4N2YpCi0jZGVmaW5lIExMQ19JX05TKGlzKQkoKChpcykgPj4gMSkgJiAweDdmKQotCi0jaWZuZGVmIExMQ1NBUF9OVUxMCi0jZGVmaW5lCUxMQ1NBUF9OVUxMCQkweDAwCi0jZW5kaWYKLSNpZm5kZWYgTExDU0FQX0dMT0JBTAotI2RlZmluZQlMTENTQVBfR0xPQkFMCQkweGZmCi0jZW5kaWYKLSNpZm5kZWYgTExDU0FQXzgwMjFCX0kKLSNkZWZpbmUJTExDU0FQXzgwMjFCX0kJCTB4MDIKLSNlbmRpZgotI2lmbmRlZiBMTENTQVBfODAyMUJfRwotI2RlZmluZQlMTENTQVBfODAyMUJfRwkJMHgwMwotI2VuZGlmCi0jaWZuZGVmIExMQ1NBUF9TTkEKLSNkZWZpbmUJTExDU0FQX1NOQQkJMHgwNAotI2VuZGlmCi0jaWZuZGVmIExMQ1NBUF9JUAotI2RlZmluZQlMTENTQVBfSVAJCTB4MDYKLSNlbmRpZgotI2lmbmRlZiBMTENTQVBfUFJPV0FZTk0KLSNkZWZpbmUJTExDU0FQX1BST1dBWU5NCQkweDBlCi0jZW5kaWYKLSNpZm5kZWYgTExDU0FQXzgwMjFECi0jZGVmaW5lCUxMQ1NBUF84MDIxRAkJMHg0MgotI2VuZGlmCi0jaWZuZGVmIExMQ1NBUF9SUzUxMQotI2RlZmluZQlMTENTQVBfUlM1MTEJCTB4NGUKLSNlbmRpZgotI2lmbmRlZiBMTENTQVBfSVNPODIwOAotI2RlZmluZQlMTENTQVBfSVNPODIwOAkJMHg3ZQotI2VuZGlmCi0jaWZuZGVmIExMQ1NBUF9QUk9XQVkKLSNkZWZpbmUJTExDU0FQX1BST1dBWQkJMHg4ZQotI2VuZGlmCi0jaWZuZGVmIExMQ1NBUF9TTkFQCi0jZGVmaW5lCUxMQ1NBUF9TTkFQCQkweGFhCi0jZW5kaWYKLSNpZm5kZWYgTExDU0FQX0lQWAotI2RlZmluZSBMTENTQVBfSVBYCQkweGUwCi0jZW5kaWYKLSNpZm5kZWYgTExDU0FQX05FVEJFVUkKLSNkZWZpbmUgTExDU0FQX05FVEJFVUkJCTB4ZjAKLSNlbmRpZgotI2lmbmRlZiBMTENTQVBfSVNPTlMKLSNkZWZpbmUJTExDU0FQX0lTT05TCQkweGZlCi0jZW5kaWYKLQotLyoKLSAqIFBJRHMgZm9yIHVzZSB3aXRoIE9VSV9DSVNDTy4KLSAqLwotI2RlZmluZQlQSURfQ0lTQ09fQ0RQCQkweDIwMDAJLyogQ2lzY28gRGlzY292ZXJ5IFByb3RvY29sICovCi0jZGVmaW5lCVBJRF9DSVNDT19WVFAJCTB4MjAwMwkvKiBDaXNjbyBWTEFOIFRydW5rIFByb3RvY29sICovCi0jZGVmaW5lCVBJRF9DSVNDT19EVFAJCTB4MjAwNAkvKiBDaXNjbyBEeW5hbWljIFRydW5rIFByb3RvY29sICovCi0KLS8qCi0gKiBQSURzIGZvciB1c2Ugd2l0aCBPVUlfUkZDMjY4NC4KLSAqLwotI2RlZmluZSBQSURfUkZDMjY4NF9FVEhfRkNTCTB4MDAwMQkvKiBFdGhlcm5ldCwgd2l0aCBGQ1MgKi8KLSNkZWZpbmUgUElEX1JGQzI2ODRfRVRIX05PRkNTCTB4MDAwNwkvKiBFdGhlcm5ldCwgd2l0aG91dCBGQ1MgKi8KLSNkZWZpbmUgUElEX1JGQzI2ODRfODAyXzRfRkNTCTB4MDAwMgkvKiA4MDIuNCwgd2l0aCBGQ1MgKi8KLSNkZWZpbmUgUElEX1JGQzI2ODRfODAyXzRfTk9GQ1MJMHgwMDA4CS8qIDgwMi40LCB3aXRob3V0IEZDUyAqLwotI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNV9GQ1MJMHgwMDAzCS8qIDgwMi41LCB3aXRoIEZDUyAqLwotI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNV9OT0ZDUwkweDAwMDkJLyogODAyLjUsIHdpdGhvdXQgRkNTICovCi0jZGVmaW5lIFBJRF9SRkMyNjg0X0ZERElfRkNTCTB4MDAwNAkvKiBGRERJLCB3aXRoIEZDUyAqLwotI2RlZmluZSBQSURfUkZDMjY4NF9GRERJX05PRkNTCTB4MDAwYQkvKiBGRERJLCB3aXRob3V0IEZDUyAqLwotI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNl9GQ1MJMHgwMDA1CS8qIDgwMi42LCB3aXRoIEZDUyAqLwotI2RlZmluZSBQSURfUkZDMjY4NF84MDJfNl9OT0ZDUwkweDAwMGIJLyogODAyLjYsIHdpdGhvdXQgRkNTICovCi0jZGVmaW5lIFBJRF9SRkMyNjg0X0JQRFUJMHgwMDBlCS8qIEJQRFVzICovCmRpZmYgLS1naXQgYS9tYWNoZGVwLmMgYi9tYWNoZGVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDQ1MDMuLjAwMDAwMDAKLS0tIGEvbWFjaGRlcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21hY2hkZXAuYyx2IDEuMTMgMjAwMy8xMi8xNSAwMzo1MzoyMSBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotLyoKLSAqIFhYWCAtIGFsbCB3ZSBuZWVkLCBvbiBwbGF0Zm9ybXMgb3RoZXIgdGhhbiBERUMgT1NGLzEgKGEvay9hIERpZ2l0YWwgVU5JWCwKLSAqIGEvay9hIFRydTY0IFVOSVgpLCBpcyAic2l6ZV90Iiwgd2hpY2ggaXMgYSBzdGFuZGFyZCBDIHR5cGU7IHdoYXQgZG8gd2UKLSAqIG5lZWQgdG8gZG8gdG8gZ2V0IGl0IGRlZmluZWQ/ICBUaGlzIGlzIGNsZWFybHkgd3JvbmcsIGFzIHdlIHNob3VsZG4ndAotICogaGF2ZSB0byBpbmNsdWRlIFVOSVggb3IgV2luZG93cyBzeXN0ZW0gaGVhZGVyIGZpbGVzIHRvIGdldCBpdC4KLSAqLwotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpZm5kZWYgSEFWRV9fX0FUVFJJQlVURV9fCi0jZGVmaW5lIF9fYXR0cmlidXRlX18oeCkKLSNlbmRpZiAvKiBIQVZFX19fQVRUUklCVVRFX18gKi8KLQotI2lmZGVmIF9fb3NmX18KLSNpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgotI2luY2x1ZGUgPHN5cy9wcm9jLmg+Ci0KLSNpZiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKQotaW50IHNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLikKLSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKLSNlbmRpZiAvKiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKSAqLwotI2VuZGlmIC8qIF9fb3NmX18gKi8KLQotI2luY2x1ZGUgIm1hY2hkZXAuaCIKLQotaW50Ci1hYm9ydF9vbl9taXNhbGlnbm1lbnQoY2hhciAqZWJ1ZiBfVV8sIHNpemVfdCBlYnVmc2l6IF9VXykKLXsKLSNpZmRlZiBfX29zZl9fCi0Jc3RhdGljIGludCBidWZbMl0gPSB7IFNTSU5fVUFDUFJPQywgVUFDX1NJR0JVUyB9OwotCi0JaWYgKHNldHN5c2luZm8oU1NJX05WUEFJUlMsIChjYWRkcl90KWJ1ZiwgMSwgMCwgMCkgPCAwKSB7Ci0JCSh2b2lkKXNucHJpbnRmKGVidWYsIGVidWZzaXosICJzZXRzeXNpbmZvOiBlcnJubyAlZCIsIGVycm5vKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL21hY2hkZXAuaCBiL21hY2hkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0OWE3YS4uMDAwMDAwMAotLS0gYS9tYWNoZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9tYWNoZGVwLmgsdiAxLjIgMjAwMC8wMS8xNyAwNjoyNDoyNCBpdG9qdW4gRXhwICQgKExCTCkKLSAqLwotI2lmbmRlZiB0Y3BkdW1wX21hY2hkZXBfaAotI2RlZmluZSB0Y3BkdW1wX21hY2hkZXBfaAotCi1pbnQgYWJvcnRfb25fbWlzYWxpZ25tZW50KGNoYXIgKiwgc2l6ZV90KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWFrZW1pYiBiL21ha2VtaWIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJjODBiZWYuLjAwMDAwMDAKLS0tIGEvbWFrZW1pYgorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgQ29weXJpZ2h0IChjKSAxOTkwLCAxOTk2Ci0jCUpvaG4gUm9iZXJ0IExvVmVyc28uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFNNSXYyIHBhcnNpbmcgY29weXJpZ2h0IChjKSAxOTk5Ci0jCVdpbGxpYW0gQy4gRmVubmVyLgotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0jIGFyZSBtZXQ6Ci0jCi0jIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZXMsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jCi0jIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgIG5vdGljZXMsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotIyBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0jIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0jIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0jIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotIyBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotIyBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyBAKCMpICRJZDogbWFrZW1pYix2IDEuMyAyMDAxLzA5LzE3IDIyOjE2OjUyIGZlbm5lciBFeHAgJCAoamx2KQotCi0jCi0jIFRoaXMgc2NyaXB0IHdpbGwgcmVhZCBlaXRoZXIgQVNOLjEtc3R5bGUgTUlCIGZpbGVzIG9yIHRoZSAiLmRlZnMiIGZpbGVzCi0jIGNyZWF0ZWQgYnkgdGhlIElTT0RFICJtb3N5IiBwcm9ncmFtIG9uIHN1Y2ggZmlsZXMuCi0jCi0jIFRoZSBvdXRwdXQgb2YgdGhpcyBzY3JpcHQgaXMgdGhlICJtaWIuaCIgZmlsZSB1c2VkIGJ5IHRjcGR1bXBzJyBBU04uMS9TTk1QCi0jIGRlY29kaW5nIGNvZGUuCi0jCi0jIFRoaXMgc2NyaXB0IG5lZWRzIHRvIGJlIHJ1biBieSAiZ2F3ayIgKEdOVSBhd2spLiAgIm5hd2siIHdpbGwgd29yaywgYnV0Ci0jIGR1bXAgd2lsbCBnZXQgYSByZWN1cnNpb24gZXJyb3IgaWYgeW91IHByb2Nlc3MgTEFSR0UgbWlicy4gIFdoaWxlIGl0IHdvdWxkCi0jIGJ5IGZhcmlseSBlYXN5IHRvIHJld3JpdGUgdGhpcyBub3QgdG8gdXNlIHJlY3Vyc2lvbiAoYW5kIGFsc28gZWFzeSB0bwotIyBlbGltaW5hdGUgdXNlIG9mIGdzdWIgYW5kIGZ1bmN0aW9ucyB0byB1c2UgY2xhc3NpYyAiYXdrIiksIHlvdSBoYXZlIHRvIAotIyBvcmRlciB0aGUgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBpbiBkZWZpbmVkLWZpcnN0IG9yZGVyIGZvciB0aGUgY29tcGlsZXIKLSMgbm90IHRvIGJhcmY7IHRvbyBiYWQgdHNvcnQgZG9lc24ndCB0YWtlIGFyZ3VtZW50cy4KLSMKLQotY2F0IDw8IEVPRgotLyoKLSAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRjcGR1bXAvbWFrZW1pYiBvbiBgZGF0ZWAKLSAqIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGVkaXQgdGhpcyBieSBoYW5kIQotICoKLSAqIHN0cnVjdCBtaWIgc29tZW5hbWUgPSB7IGRlc2MsIG9pZC1vY3RldCwgdHlwZSwgY2hpbGQtcG9pbnRlciwgbmV4dC1wb2ludGVyIAotfTsKLSAqLwotCi1FT0YKLQotYXdrICcKLUJFR0lOIHsKLQlkZWJ1Zz0wOwotCSMgZm9yIHNhbml0eSwgd2UgcHJlcCB0aGUgbmFtZXNwYWNlIHdpdGggb2JqZWN0cyBmcm9tIFJGQy0xMTU1Ci0JIyAod2UgbWFudWFsbHkgZXN0YWJsaXNoIHRoZSByb290KQotCW9pZFsiaXNvIl09MQotCW9pZGFkZCgib3JnIiwgImlzbyIsIDMpCi0Jb2lkYWRkKCJkb2QiLCAib3JnIiwgNikKLQlvaWRhZGQoImludGVybmV0IiwgImRvZCIsIDEpCi0Jb2lkYWRkKCJkaXJlY3RvcnkiLCAiaW50ZXJuZXQiLCAxKQotCW9pZGFkZCgibWdtdCIsICJpbnRlcm5ldCIsIDIpCi0jWFhYCW9pZGFkZCgibWliIiwgIm1nbXQiLCAxKQotCW9pZGFkZCgibWliLTIiLCAibWdtdCIsIDEpCi0Jb2lkYWRkKCJleHBlcmltZW50YWwiLCAiaW50ZXJuZXQiLCAzKQotCW9pZGFkZCgicHJpdmF0ZSIsICJpbnRlcm5ldCIsIDQpCi0Jb2lkYWRkKCJlbnRlcnByaXNlcyIsICJwcml2YXRlIiwgMSkKLQlvaWRhZGQoImlwIiwgIm1pYi0yIiwgNCkKLQlvaWRhZGQoInRyYW5zbWlzc2lvbiIsICJtaWItMiIsIDEwKQotCi0JaG9sZGRlc2M9Im5vbmUiCi19Ci0KLSMKLSMgUmVhZCBtb3N5ICIqLmRlZnMiIGZpbGUuICBtb3N5IGRvZXMgYWxsIHRoZSBwYXJzaW5nIHdvcms7IHdlIGp1c3QgcmVhZAotIyBpdHMgc2ltcGxlIGFuZCBzdHJhaWdodGZvcndhcmQgb3V0cHV0LiAgSXQgd291bGQgbm90IGJlIHRvbyBoYXJkIHRvIG1ha2UKLSMgdGNwZHVtcCBkaXJlY3RseSByZWFkIG1vc3kgb3V0cHV0LCBidXQuLi4KLSMKLSMgSWdub3JlIHRoZXNlIHVubGVzcyB0aGUgY3VycmVudCBmaWxlIGlzIGNhbGxlZCBzb21ldGhpbmcuZGVmczsgZmFsc2UKLSMgcG9zaXRpdmVzIGFyZSB0b28gY29tbW9uIGluIERFU0NSSVBUSU9Ocy4KLQotTkYgPiAxICYmIGluZGV4KCQyLCIuIik+MCAmJiBGSUxFTkFNRSB+IC9cLmRlZnMvIHsKLQkjIGN1cnJlbnRseSBpZ25vcmUgaXRlbXMgb2YgdGhlIGZvcm0gInsgaXNvLjMuNi4xIH0iCi0JaWYgKHNwbGl0KCQyLCBwLCAiLiIpID09IDIpIHsKLQkJb2lkYWRkKCQxLCBwWzFdLCBwWzJdKQotCX0KLQluZXh0Ci19Ci0KLSMKLSMgTXVzdCBiZSBhIE1JQiBmaWxlCi0jIE1ha2UgaXQgZWFzaWVyIHRvIHBhcnNlIC0gdXNlZCB0byBiZSBkb25lIGJ5IHNlZAoteyBzdWIoLy0tXCouKlwqLS0vLCAiIik7IHN1YigvLS0uKi8sICIiKTsgZ3N1YigvW3t9XS8sICIgJiAiKTsgfQotCi0jCi0jIHRoaXMgbmV4dCBzZWN0aW9uIGlzIHNpbXBsZSBhbmQgbmFpdmUsIGJ1dCBkb2VzIHRoZSBqb2Igb2sKLSMKLQotIyBmb28gT0JKRUNUIElERU5USUZJRVIgOjo9IHsgYmF6IDE3IH0KLSMgb3IKLSMgZm9vIE9CSkVDVCBJREVOVElGSUVSIDo6PQotIyB7IGJheiAxNyB9Ci0kMiQzJDQgPT0gIk9CSkVDVElERU5USUZJRVI6Oj0iIHsKLQlob2xkZGVzYz0ibm9uZSIKLQlpZiAoTkYgPT0gOCkKLQkJb2lkYWRkKCQxLCAkNiwgJDcpCi0JaWYgKE5GID09IDQpCi0JCWhvbGRkZXNjPSQxCi0JbmV4dAotfQotJDEgPT0gInsiICYmIGhvbGRkZXNjICE9ICJub25lIiAmJiBORiA9PSA0IHsKLQlvaWRhZGQoaG9sZGRlc2MsICQyLCAkMykKLQlob2xkZGVzYz0ibm9uZSIKLX0KLSMKLSMgZm9vIE9CSkVDVCBJREVOVElGSUVSCi0jICA6Oj0geyBiYXIgMSB9Ci0kMiQzID09ICJPQkpFQ1RJREVOVElGSUVSIiAmJiAkMSAhPSAiU1lOVEFYIiAmJiBORiA9PSAzIHsKLQlob2xkZGVzYz0kMQotfQotIwotIyBmb28KLSMgT0JKRUNUIElERU5USUZJRVIgOjo9IHsgYmFyIDEgfQotIyBhIGNvdXBsZSBvZiBoZXVyaXN0aWNzIHRvIGV4Y2x1ZGUgc2luZ2xlIHdvcmRzIGluIGUuZy4gbG9uZwotIyAgREVTQ1JJUFRJT04gY2xhdXNlcwotTkYgPT0gMSAmJiAkMSB+ICJbYS16XVthLXpdKltBLVpdIiAmJiAkMSAhfiAvWygpe30uLF0vICYmIGhvbGRkZXNjID09ICJub25lIiB7Ci0JaG9sZGRlc2M9JDEKLX0KLSQxJDIkMyA9PSAiT0JKRUNUSURFTlRJRklFUjo6PSIgJiYgaG9sZGRlc2MgIT0gIm5vbmUiIHsKLQlvaWRhZGQoaG9sZGRlc2MsICQ1LCAkNikKLQlob2xkZGVzYz0ibm9uZSIKLX0KLSMKLSMgIm5vcm1hbCIgc3R5bGUKLSMgZm9vIE9CSkVDVC1UWVBFIC4uLgotIyAuLi4KLSMgICA6Oj0geyBiYXogNSB9Ci0kMiA9PSAiTU9EVUxFLUlERU5USVRZIiB8fCAkMiA9PSAiTU9EVUxFLUNPTVBMSUFOQ0UiIHx8Ci0JJDIgPT0gIk9CSkVDVC1JREVOVElUWSIgfHwgJDIgPT0gIk9CSkVDVC1UWVBFIiB8fAotCSQyID09ICJPQkpFQ1QtR1JPVVAiIHx8Ci0JJDIgPT0gIk5PVElGSUNBVElPTi1UWVBFIiB8fCAkMiA9PSAiTk9USUZJQ0FUSU9OLUdST1VQIiB7Ci0JaG9sZGRlc2M9JDEKLX0KLSQxID09ICI6Oj0iICYmIGhvbGRkZXNjICE9ICJub25lIiAmJiBORiA9PSA1IHsKLQlvaWRhZGQoaG9sZGRlc2MsICQzLCAkNCkKLQlob2xkZGVzYz0ibm9uZSIKLX0KLSMKLSMgZm9vIDo6PSB7IGJheiAxNyB9Ci0kMiQzID09ICI6Oj17IiB7Ci0Jb2lkYWRkKCQxLCQ0LCQ1KQotCWhvbGRkZXNjPSJub25lIgotfQotCi0KLSMgCi0jIEVuZCBvZiB0aGUgcm9hZCAtIG91dHB1dCB0aGUgZGF0YS4KLSMKLQotRU5EIHsKLQlwcmludCAic3RydWN0IG9iaiIKLQlkdW1wKCJpc28iKQotCXByaW50ICIqbWlicm9vdCA9ICZfaXNvX29iajsiCi19Ci0KLWZ1bmN0aW9uIGlubihmaWxlKSB7Ci0JaWYgKGZpbGUgPT0gIiIgfHwgZmlsZSA9PSAiLSIpCi0JCXJldHVybiAiIgotCXJldHVybiAiIGluICIgZmlsZQotfQotCi0jCi0jIGFkZCBhIG5ldyBvYmplY3QgdG8gdGhlIHRyZWUKLSMKLSMJCW5ldyBPQkpFQ1QgSURFTlRJRklFUiA6Oj0geyBwYXJlbnQgdmFsdWUgfQotIwotCi1mdW5jdGlvbiBvaWRhZGQobmV3LCBwYXJlbnQsIHZhbHVlKSB7Ci0JIyBJZ25vcmUgMC4wCi0JaWYgKHBhcmVudCA9PSAiMCIgJiYgdmFsdWUgPT0gMCkKLQkJcmV0dXJuCi0JaWYgKGRlYnVnKQotCQlwcmludCAiLyogb2lkYWRkIiBpbm4oRklMRU5BTUUpICI6IiwgbmV3LCAiaW4iLCBwYXJlbnQsICJhcyIsIHZhbHVlLCAibGluZSIsICQwLCAiKi8iCi0JIyB1c2Ugc2FmZSBDIGlkZW50aWZpZXJzCi0JZ3N1YigvWy0mXC9dLywiIixuZXcpCi0JZ3N1YigvWy0mXC9dLywiIixwYXJlbnQpCi0JIyBjaGVjayBpZiBwYXJlbnQgbWlzc2luZwotCWlmIChvaWRbcGFyZW50XSA9PSAiIikgewotCQlwcmludGYgIi8qIHBhcnNlIHByb2JsZW0lczogbm8gcGFyZW50IGZvciAlcy4lcyglZCkgKi9cbiIsIFwKLQkJCWlubihGSUxFTkFNRSksIHBhcmVudCwgbmV3LCB2YWx1ZQotCQlyZXR1cm4KLQl9Ci0JIyBjaGVjayBpZiBwYXJlbnQudmFsdWUgYWxyZWFkeSBleGlzdHMKLQlpZiAob2lkW25ld10gPiAwICYmIG9pZFtuZXddICE9IHZhbHVlKSB7Ci0JCXByaW50ZiAiLyogcGFyc2UgcHJvYmxlbSVzOiBkdXAgJXMuJXMoJWQpICE9IG9sZCAoJWQpICovXG4iLCBcCi0JCQlpbm4oRklMRU5BTUUpLCBwYXJlbnQsIG5ldywgdmFsdWUsIG9pZFtuZXddCi0JCXJldHVybgotCX0KLQkjIGNoZWNrIGZvciBuZXcgbmFtZSBmb3IgcGFyZW50LnZhbHVlCi0JaWYgKGNoaWxkW3BhcmVudF0gIT0gIiIpIHsKLQkJZm9yIChzaWIgPSBjaGlsZFtwYXJlbnRdOyBzaWIgIT0gIiI7IHNpYiA9IHNpYmxpbmdbc2liXSkKLQkJCWlmIChvaWRbc2liXSA9PSB2YWx1ZSkgewotCQkJCWlmIChuZXcgIT0gc2liKQotCQkJCQlwcmludGYgIi8qIHBhcnNlIHByb2JsZW0lczogbmV3IG5hbWUiIFwKLQkJCQkJCSIgXCIlc1wiIiBcCi0JCQkJCQkiIGZvciAlcy4lcyglZCkgaWdub3JlZCAqL1xuIiwgXAotCQkJCQkJaW5uKEZJTEVOQU1FKSwgbmV3LCBwYXJlbnQsIFwKLQkJCQkJCXNpYiwgdmFsdWUKLQkJCQlyZXR1cm4KLQkJCX0KLQl9Ci0KLQlvaWRbbmV3XT12YWx1ZQotCWlmIChjaGlsZFtwYXJlbnRdID09ICIiKSB7Ci0JCWNoaWxkW3BhcmVudF0gPSBuZXcKLQl9IGVsc2UgewotCQlzaWJsaW5nW25ld10gPSBjaGlsZFtwYXJlbnRdCi0JCWNoaWxkW3BhcmVudF0gPSBuZXcKLQl9Ci19Ci0KLSMKLSMgb2xkKD8pIHJvdXRpbmUgdG8gcmVjdXJzZSBkb3duIHRoZSB0cmVlIChpbiBwb3N0Zml4IG9yZGVyIGZvciBjb252ZW5pZW5jZSkKLSMKLQotZnVuY3Rpb24gZHVtcChpdGVtLCBjLCBzKSB7Ci0jCW5ld2l0ZW09c29mYXIiLiJpdGVtIigib2lkW2l0ZW1dIikiCi0jCXByaW50ZiAiLyogJXMgYz0lcyBzPSVzICovXG4iLCBuZXdpdGVtLCBjaGlsZFtpdGVtXSwgc2libGluZ1tpdGVtXQotCWM9Ik5VTEwiCi0JaWYgKGNoaWxkW2l0ZW1dICE9ICIiKSB7Ci0JCWR1bXAoY2hpbGRbaXRlbV0pCi0JCWMgPSAiJl8iY2hpbGRbaXRlbV0iX29iaiIKLQl9Ci0Jcz0iTlVMTCIKLQlpZiAoc2libGluZ1tpdGVtXSAhPSAiIikgewotCQlkdW1wKHNpYmxpbmdbaXRlbV0pCi0JCXMgPSAiJl8ic2libGluZ1tpdGVtXSJfb2JqIgotCX0KLQlwcmludGYgIl8lc19vYmogPSB7XG5cdFwiJXNcIiwgJWQsIDAsXG5cdCVzLCAlc1xufSxcbiIsIFwKLQkJaXRlbSwgaXRlbSwgb2lkW2l0ZW1dLCBjLCBzCi19Ci0nICRACi1leGl0IDAKZGlmZiAtLWdpdCBhL21pYi5oIGIvbWliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzZjMmMuLjAwMDAwMDAKLS0tIGEvbWliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYwICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0Y3BkdW1wL21ha2VtaWIgb24gV2VkIFNlcCAyNiAxMjoxMjozMSBFRFQgMTk5MAotICogWW91IHByb2JhYmx5IGRvbid0IHdhbnQgdG8gZWRpdCB0aGlzIGJ5IGhhbmQhCi0gKgotICogc3RydWN0IG1pYiBzb21lbmFtZSA9IHsgZGVzYywgb2lkLW9jdGV0LCB0eXBlLCBjaGlsZC1wb2ludGVyLCBuZXh0LXBvaW50ZXIKLX07Ci0gKi8KLQotLyogcGFyc2UgcHJvYmxlbTogbmV3IG5hbWUgIm1pYiIgZm9yIG1nbXQubWliKDEpIGlnbm9yZWQgKi8KLS8qIHBhcnNlIHByb2JsZW06IG5vIHBhcmVudCBmb3IgMC5udWxsU3BlY2lmaWMoMCkgKi8KLXN0cnVjdCBvYmoKLV9wcm90ZW9uX29iaiA9IHsKLQkicHJvdGVvbiIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9pYm1fb2JqID0gewotCSJpYm0iLCAyLCAwLAotCU5VTEwsICZfcHJvdGVvbl9vYmoKLX0sCi1fY211X29iaiA9IHsKLQkiY211IiwgMywgMCwKLQlOVUxMLCAmX2libV9vYmoKLX0sCi1fdW5peF9vYmogPSB7Ci0JInVuaXgiLCA0LCAwLAotCU5VTEwsICZfY211X29iagotfSwKLV9hY2Nfb2JqID0gewotCSJhY2MiLCA1LCAwLAotCU5VTEwsICZfdW5peF9vYmoKLX0sCi1fdHdnX29iaiA9IHsKLQkidHdnIiwgNiwgMCwKLQlOVUxMLCAmX2FjY19vYmoKLX0sCi1fY2F5bWFuX29iaiA9IHsKLQkiY2F5bWFuIiwgNywgMCwKLQlOVUxMLCAmX3R3Z19vYmoKLX0sCi1fbnlzZXJuZXRfb2JqID0gewotCSJueXNlcm5ldCIsIDgsIDAsCi0JTlVMTCwgJl9jYXltYW5fb2JqCi19LAotX2Npc2NvX29iaiA9IHsKLQkiY2lzY28iLCA5LCAwLAotCU5VTEwsICZfbnlzZXJuZXRfb2JqCi19LAotX25zY19vYmogPSB7Ci0JIm5zYyIsIDEwLCAwLAotCU5VTEwsICZfY2lzY29fb2JqCi19LAotX2hwX29iaiA9IHsKLQkiaHAiLCAxMSwgMCwKLQlOVUxMLCAmX25zY19vYmoKLX0sCi1fZXBpbG9ndWVfb2JqID0gewotCSJlcGlsb2d1ZSIsIDEyLCAwLAotCU5VTEwsICZfaHBfb2JqCi19LAotX3V0ZW5uZXNzZWVfb2JqID0gewotCSJ1dGVubmVzc2VlIiwgMTMsIDAsCi0JTlVMTCwgJl9lcGlsb2d1ZV9vYmoKLX0sCi1fYmJuX29iaiA9IHsKLQkiYmJuIiwgMTQsIDAsCi0JTlVMTCwgJl91dGVubmVzc2VlX29iagotfSwKLV94eWxvZ2ljc19vYmogPSB7Ci0JInh5bG9naWNzIiwgMTUsIDAsCi0JTlVMTCwgJl9iYm5fb2JqCi19LAotX3VuaXN5c19vYmogPSB7Ci0JInVuaXN5cyIsIDE2LCAwLAotCU5VTEwsICZfeHlsb2dpY3Nfb2JqCi19LAotX2NhbnN0YXJfb2JqID0gewotCSJjYW5zdGFyIiwgMTcsIDAsCi0JTlVMTCwgJl91bmlzeXNfb2JqCi19LAotX3dlbGxmbGVldF9vYmogPSB7Ci0JIndlbGxmbGVldCIsIDE4LCAwLAotCU5VTEwsICZfY2Fuc3Rhcl9vYmoKLX0sCi1fdHJ3X29iaiA9IHsKLQkidHJ3IiwgMTksIDAsCi0JTlVMTCwgJl93ZWxsZmxlZXRfb2JqCi19LAotX21pdF9vYmogPSB7Ci0JIm1pdCIsIDIwLCAwLAotCU5VTEwsICZfdHJ3X29iagotfSwKLV9lb25fb2JqID0gewotCSJlb24iLCAyMSwgMCwKLQlOVUxMLCAmX21pdF9vYmoKLX0sCi1fc3BhcnRhY3VzX29iaiA9IHsKLQkic3BhcnRhY3VzIiwgMjIsIDAsCi0JTlVMTCwgJl9lb25fb2JqCi19LAotX2V4Y2VsYW5fb2JqID0gewotCSJleGNlbGFuIiwgMjMsIDAsCi0JTlVMTCwgJl9zcGFydGFjdXNfb2JqCi19LAotX3NwaWRlcl9vYmogPSB7Ci0JInNwaWRlciIsIDI0LCAwLAotCU5VTEwsICZfZXhjZWxhbl9vYmoKLX0sCi1fbnNmbmV0X29iaiA9IHsKLQkibnNmbmV0IiwgMjUsIDAsCi0JTlVMTCwgJl9zcGlkZXJfb2JqCi19LAotX3N5dGVrX29iaiA9IHsKLQkic3l0ZWsiLCAyNiwgMCwKLQlOVUxMLCAmX25zZm5ldF9vYmoKLX0sCi1faW50ZXJncmFwaF9vYmogPSB7Ci0JImludGVyZ3JhcGgiLCAyNywgMCwKLQlOVUxMLCAmX3N5dGVrX29iagotfSwKLV9pbnRlcmxhbl9vYmogPSB7Ci0JImludGVybGFuIiwgMjgsIDAsCi0JTlVMTCwgJl9pbnRlcmdyYXBoX29iagotfSwKLV92aXRhbGlua19vYmogPSB7Ci0JInZpdGFsaW5rIiwgMjksIDAsCi0JTlVMTCwgJl9pbnRlcmxhbl9vYmoKLX0sCi1fdWxhbmFfb2JqID0gewotCSJ1bGFuYSIsIDMwLCAwLAotCU5VTEwsICZfdml0YWxpbmtfb2JqCi19LAotX25zd2Nfb2JqID0gewotCSJuc3djIiwgMzEsIDAsCi0JTlVMTCwgJl91bGFuYV9vYmoKLX0sCi1fc2FudGFjcnV6b3BlcmF0aW9uX29iaiA9IHsKLQkic2FudGFjcnV6b3BlcmF0aW9uIiwgMzIsIDAsCi0JTlVMTCwgJl9uc3djX29iagotfSwKLV94eXBsZXhfb2JqID0gewotCSJ4eXBsZXgiLCAzMywgMCwKLQlOVUxMLCAmX3NhbnRhY3J1em9wZXJhdGlvbl9vYmoKLX0sCi1fY3JheV9vYmogPSB7Ci0JImNyYXkiLCAzNCwgMCwKLQlOVUxMLCAmX3h5cGxleF9vYmoKLX0sCi1fYmVsbG5vcnRoZXJucmVzZWFyY2hfb2JqID0gewotCSJiZWxsbm9ydGhlcm5yZXNlYXJjaCIsIDM1LCAwLAotCU5VTEwsICZfY3JheV9vYmoKLX0sCi1fZGVjX29iaiA9IHsKLQkiZGVjIiwgMzYsIDAsCi0JTlVMTCwgJl9iZWxsbm9ydGhlcm5yZXNlYXJjaF9vYmoKLX0sCi1fdG91Y2hfb2JqID0gewotCSJ0b3VjaCIsIDM3LCAwLAotCU5VTEwsICZfZGVjX29iagotfSwKLV9uZXR3b3JrcmVzZWFyY2hjb3JwX29iaiA9IHsKLQkibmV0d29ya3Jlc2VhcmNoY29ycCIsIDM4LCAwLAotCU5VTEwsICZfdG91Y2hfb2JqCi19LAotX2JheWxvcl9vYmogPSB7Ci0JImJheWxvciIsIDM5LCAwLAotCU5VTEwsICZfbmV0d29ya3Jlc2VhcmNoY29ycF9vYmoKLX0sCi1fbm1mZWNjbGxubF9vYmogPSB7Ci0JIm5tZmVjY2xsbmwiLCA0MCwgMCwKLQlOVUxMLCAmX2JheWxvcl9vYmoKLX0sCi1fc3JpX29iaiA9IHsKLQkic3JpIiwgNDEsIDAsCi0JTlVMTCwgJl9ubWZlY2NsbG5sX29iagotfSwKLV9zdW5fb2JqID0gewotCSJzdW4iLCA0MiwgMCwKLQlOVUxMLCAmX3NyaV9vYmoKLX0sCi1fM2NvbV9vYmogPSB7Ci0JIjNjb20iLCA0MywgMCwKLQlOVUxMLCAmX3N1bl9vYmoKLX0sCi1fY21jX29iaiA9IHsKLQkiY21jIiwgNDQsIDAsCi0JTlVMTCwgJl8zY29tX29iagotfSwKLV9zeW5vcHRpY3Nfb2JqID0gewotCSJzeW5vcHRpY3MiLCA0NSwgMCwKLQlOVUxMLCAmX2NtY19vYmoKLX0sCi1fY2hleWVubmVfb2JqID0gewotCSJjaGV5ZW5uZSIsIDQ2LCAwLAotCU5VTEwsICZfc3lub3B0aWNzX29iagotfSwKLV9wcmltZV9vYmogPSB7Ci0JInByaW1lIiwgNDcsIDAsCi0JTlVMTCwgJl9jaGV5ZW5uZV9vYmoKLX0sCi1fbWNuY19vYmogPSB7Ci0JIm1jbmMiLCA0OCwgMCwKLQlOVUxMLCAmX3ByaW1lX29iagotfSwKLV9jaGlwY29tX29iaiA9IHsKLQkiY2hpcGNvbSIsIDQ5LCAwLAotCU5VTEwsICZfbWNuY19vYmoKLX0sCi1fb3B0aWNhbGRhdGFzeXN0ZW1zX29iaiA9IHsKLQkib3B0aWNhbGRhdGFzeXN0ZW1zIiwgNTAsIDAsCi0JTlVMTCwgJl9jaGlwY29tX29iagotfSwKLV9nYXRlZF9vYmogPSB7Ci0JImdhdGVkIiwgNTEsIDAsCi0JTlVMTCwgJl9vcHRpY2FsZGF0YXN5c3RlbXNfb2JqCi19LAotX2NhYmxldHJvbl9vYmogPSB7Ci0JImNhYmxldHJvbiIsIDUyLCAwLAotCU5VTEwsICZfZ2F0ZWRfb2JqCi19LAotX2Fwb2xsb19vYmogPSB7Ci0JImFwb2xsbyIsIDUzLCAwLAotCU5VTEwsICZfY2FibGV0cm9uX29iagotfSwKLV9kZXNrdGFsa3N5c3RlbXNfb2JqID0gewotCSJkZXNrdGFsa3N5c3RlbXMiLCA1NCwgMCwKLQlOVUxMLCAmX2Fwb2xsb19vYmoKLX0sCi1fc3Nkc19vYmogPSB7Ci0JInNzZHMiLCA1NSwgMCwKLQlOVUxMLCAmX2Rlc2t0YWxrc3lzdGVtc19vYmoKLX0sCi1fY2FzdGxlcm9ja19vYmogPSB7Ci0JImNhc3RsZXJvY2siLCA1NiwgMCwKLQlOVUxMLCAmX3NzZHNfb2JqCi19LAotX21pcHNfb2JqID0gewotCSJtaXBzIiwgNTcsIDAsCi0JTlVMTCwgJl9jYXN0bGVyb2NrX29iagotfSwKLV90Z3Zfb2JqID0gewotCSJ0Z3YiLCA1OCwgMCwKLQlOVUxMLCAmX21pcHNfb2JqCi19LAotX3NpbGljb25ncmFwaGljc19vYmogPSB7Ci0JInNpbGljb25ncmFwaGljcyIsIDU5LCAwLAotCU5VTEwsICZfdGd2X29iagotfSwKLV91YmNfb2JqID0gewotCSJ1YmMiLCA2MCwgMCwKLQlOVUxMLCAmX3NpbGljb25ncmFwaGljc19vYmoKLX0sCi1fbWVyaXRfb2JqID0gewotCSJtZXJpdCIsIDYxLCAwLAotCU5VTEwsICZfdWJjX29iagotfSwKLV9maWJlcmNvbV9vYmogPSB7Ci0JImZpYmVyY29tIiwgNjIsIDAsCi0JTlVMTCwgJl9tZXJpdF9vYmoKLX0sCi1fYXBwbGVfb2JqID0gewotCSJhcHBsZSIsIDYzLCAwLAotCU5VTEwsICZfZmliZXJjb21fb2JqCi19LAotX2dhbmRhbGZfb2JqID0gewotCSJnYW5kYWxmIiwgNjQsIDAsCi0JTlVMTCwgJl9hcHBsZV9vYmoKLX0sCi1fZGFydG1vdXRoX29iaiA9IHsKLQkiZGFydG1vdXRoIiwgNjUsIDAsCi0JTlVMTCwgJl9nYW5kYWxmX29iagotfSwKLV9kYXZpZHN5c3RlbXNfb2JqID0gewotCSJkYXZpZHN5c3RlbXMiLCA2NiwgMCwKLQlOVUxMLCAmX2RhcnRtb3V0aF9vYmoKLX0sCi1fcmV1dGVyX29iaiA9IHsKLQkicmV1dGVyIiwgNjcsIDAsCi0JTlVMTCwgJl9kYXZpZHN5c3RlbXNfb2JqCi19LAotX2Nvcm5lbGxfb2JqID0gewotCSJjb3JuZWxsIiwgNjgsIDAsCi0JTlVMTCwgJl9yZXV0ZXJfb2JqCi19LAotX3RtYWNfb2JqID0gewotCSJ0bWFjIiwgNjksIDAsCi0JTlVMTCwgJl9jb3JuZWxsX29iagotfSwKLV9sb2N1c19vYmogPSB7Ci0JImxvY3VzIiwgNzAsIDAsCi0JTlVMTCwgJl90bWFjX29iagotfSwKLV9uYXNhX29iaiA9IHsKLQkibmFzYSIsIDcxLCAwLAotCU5VTEwsICZfbG9jdXNfb2JqCi19LAotX3JldGl4X29iaiA9IHsKLQkicmV0aXgiLCA3MiwgMCwKLQlOVUxMLCAmX25hc2Ffb2JqCi19LAotX2JvZWluZ19vYmogPSB7Ci0JImJvZWluZyIsIDczLCAwLAotCU5VTEwsICZfcmV0aXhfb2JqCi19LAotX2F0dF9vYmogPSB7Ci0JImF0dCIsIDc0LCAwLAotCU5VTEwsICZfYm9laW5nX29iagotfSwKLV91bmdlcm1hbm5iYXNzX29iaiA9IHsKLQkidW5nZXJtYW5uYmFzcyIsIDc1LCAwLAotCU5VTEwsICZfYXR0X29iagotfSwKLV9kaWdpdGFsYW5hbHlzaXNfb2JqID0gewotCSJkaWdpdGFsYW5hbHlzaXMiLCA3NiwgMCwKLQlOVUxMLCAmX3VuZ2VybWFubmJhc3Nfb2JqCi19LAotX2hwbGFubWFuX29iaiA9IHsKLQkiaHBsYW5tYW4iLCA3NywgMCwKLQlOVUxMLCAmX2RpZ2l0YWxhbmFseXNpc19vYmoKLX0sCi1fbmV0bGFic19vYmogPSB7Ci0JIm5ldGxhYnMiLCA3OCwgMCwKLQlOVUxMLCAmX2hwbGFubWFuX29iagotfSwKLV9pY2xfb2JqID0gewotCSJpY2wiLCA3OSwgMCwKLQlOVUxMLCAmX25ldGxhYnNfb2JqCi19LAotX2F1c3BleF9vYmogPSB7Ci0JImF1c3BleCIsIDgwLCAwLAotCU5VTEwsICZfaWNsX29iagotfSwKLV9sYW5uZXRfb2JqID0gewotCSJsYW5uZXQiLCA4MSwgMCwKLQlOVUxMLCAmX2F1c3BleF9vYmoKLX0sCi1fbmNkX29iaiA9IHsKLQkibmNkIiwgODIsIDAsCi0JTlVMTCwgJl9sYW5uZXRfb2JqCi19LAotX3JheWNvbV9vYmogPSB7Ci0JInJheWNvbSIsIDgzLCAwLAotCU5VTEwsICZfbmNkX29iagotfSwKLV9waXJlbGxpZm9jb21fb2JqID0gewotCSJwaXJlbGxpZm9jb20iLCA4NCwgMCwKLQlOVUxMLCAmX3JheWNvbV9vYmoKLX0sCi1fZGF0YWJpbGl0eV9vYmogPSB7Ci0JImRhdGFiaWxpdHkiLCA4NSwgMCwKLQlOVUxMLCAmX3BpcmVsbGlmb2NvbV9vYmoKLX0sCi1fbmV0d29ya2FwcGx0ZWNoX29iaiA9IHsKLQkibmV0d29ya2FwcGx0ZWNoIiwgODYsIDAsCi0JTlVMTCwgJl9kYXRhYmlsaXR5X29iagotfSwKLV9saW5rX29iaiA9IHsKLQkibGluayIsIDg3LCAwLAotCU5VTEwsICZfbmV0d29ya2FwcGx0ZWNoX29iagotfSwKLV9ueXVfb2JqID0gewotCSJueXUiLCA4OCwgMCwKLQlOVUxMLCAmX2xpbmtfb2JqCi19LAotX3JuZF9vYmogPSB7Ci0JInJuZCIsIDg5LCAwLAotCU5VTEwsICZfbnl1X29iagotfSwKLV9pbnRlcmNvbl9vYmogPSB7Ci0JImludGVyY29uIiwgOTAsIDAsCi0JTlVMTCwgJl9ybmRfb2JqCi19LAotX2xlYXJuaW5ndHJlZV9vYmogPSB7Ci0JImxlYXJuaW5ndHJlZSIsIDkxLCAwLAotCU5VTEwsICZfaW50ZXJjb25fb2JqCi19LAotX3dlYnN0ZXJjb21wdXRlcl9vYmogPSB7Ci0JIndlYnN0ZXJjb21wdXRlciIsIDkyLCAwLAotCU5VTEwsICZfbGVhcm5pbmd0cmVlX29iagotfSwKLV9mcm9udGllcl9vYmogPSB7Ci0JImZyb250aWVyIiwgOTMsIDAsCi0JTlVMTCwgJl93ZWJzdGVyY29tcHV0ZXJfb2JqCi19LAotX25va2lhX29iaiA9IHsKLQkibm9raWEiLCA5NCwgMCwKLQlOVUxMLCAmX2Zyb250aWVyX29iagotfSwKLV9hbGxlbmJyYWRsZXlfb2JqID0gewotCSJhbGxlbmJyYWRsZXkiLCA5NSwgMCwKLQlOVUxMLCAmX25va2lhX29iagotfSwKLV9jZXJuX29iaiA9IHsKLQkiY2VybiIsIDk2LCAwLAotCU5VTEwsICZfYWxsZW5icmFkbGV5X29iagotfSwKLV9zaWdtYV9vYmogPSB7Ci0JInNpZ21hIiwgOTcsIDAsCi0JTlVMTCwgJl9jZXJuX29iagotfSwKLV9lbWVyZ2luZ3RlY2hfb2JqID0gewotCSJlbWVyZ2luZ3RlY2giLCA5OCwgMCwKLQlOVUxMLCAmX3NpZ21hX29iagotfSwKLV9zbm1wcmVzZWFyY2hfb2JqID0gewotCSJzbm1wcmVzZWFyY2giLCA5OSwgMCwKLQlOVUxMLCAmX2VtZXJnaW5ndGVjaF9vYmoKLX0sCi1fb2hpb3N0YXRlX29iaiA9IHsKLQkib2hpb3N0YXRlIiwgMTAwLCAwLAotCU5VTEwsICZfc25tcHJlc2VhcmNoX29iagotfSwKLV91bHRyYV9vYmogPSB7Ci0JInVsdHJhIiwgMTAxLCAwLAotCU5VTEwsICZfb2hpb3N0YXRlX29iagotfSwKLV9jY3VyX29iaiA9IHsKLQkiY2N1ciIsIDEzNiwgMCwKLQlOVUxMLCAmX3VsdHJhX29iagotfSwKLV9lbnRlcnByaXNlc19vYmogPSB7Ci0JImVudGVycHJpc2VzIiwgMSwgMCwKLQkmX2NjdXJfb2JqLCBOVUxMCi19LAotX3NubXBJblBrdHNfb2JqID0gewotCSJzbm1wSW5Qa3RzIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX3NubXBPdXRQa3RzX29iaiA9IHsKLQkic25tcE91dFBrdHMiLCAyLCAwLAotCU5VTEwsICZfc25tcEluUGt0c19vYmoKLX0sCi1fc25tcEluQmFkVmVyc2lvbnNfb2JqID0gewotCSJzbm1wSW5CYWRWZXJzaW9ucyIsIDMsIDAsCi0JTlVMTCwgJl9zbm1wT3V0UGt0c19vYmoKLX0sCi1fc25tcEluQmFkQ29tbXVuaXR5TmFtZXNfb2JqID0gewotCSJzbm1wSW5CYWRDb21tdW5pdHlOYW1lcyIsIDQsIDAsCi0JTlVMTCwgJl9zbm1wSW5CYWRWZXJzaW9uc19vYmoKLX0sCi1fc25tcEluQmFkQ29tbXVuaXR5VXNlc19vYmogPSB7Ci0JInNubXBJbkJhZENvbW11bml0eVVzZXMiLCA1LCAwLAotCU5VTEwsICZfc25tcEluQmFkQ29tbXVuaXR5TmFtZXNfb2JqCi19LAotX3NubXBJbkFTTlBhcnNlRXJyc19vYmogPSB7Ci0JInNubXBJbkFTTlBhcnNlRXJycyIsIDYsIDAsCi0JTlVMTCwgJl9zbm1wSW5CYWRDb21tdW5pdHlVc2VzX29iagotfSwKLV9zbm1wSW5CYWRUeXBlc19vYmogPSB7Ci0JInNubXBJbkJhZFR5cGVzIiwgNywgMCwKLQlOVUxMLCAmX3NubXBJbkFTTlBhcnNlRXJyc19vYmoKLX0sCi1fc25tcEluVG9vQmlnc19vYmogPSB7Ci0JInNubXBJblRvb0JpZ3MiLCA4LCAwLAotCU5VTEwsICZfc25tcEluQmFkVHlwZXNfb2JqCi19LAotX3NubXBJbk5vU3VjaE5hbWVzX29iaiA9IHsKLQkic25tcEluTm9TdWNoTmFtZXMiLCA5LCAwLAotCU5VTEwsICZfc25tcEluVG9vQmlnc19vYmoKLX0sCi1fc25tcEluQmFkVmFsdWVzX29iaiA9IHsKLQkic25tcEluQmFkVmFsdWVzIiwgMTAsIDAsCi0JTlVMTCwgJl9zbm1wSW5Ob1N1Y2hOYW1lc19vYmoKLX0sCi1fc25tcEluUmVhZE9ubHlzX29iaiA9IHsKLQkic25tcEluUmVhZE9ubHlzIiwgMTEsIDAsCi0JTlVMTCwgJl9zbm1wSW5CYWRWYWx1ZXNfb2JqCi19LAotX3NubXBJbkdlbkVycnNfb2JqID0gewotCSJzbm1wSW5HZW5FcnJzIiwgMTIsIDAsCi0JTlVMTCwgJl9zbm1wSW5SZWFkT25seXNfb2JqCi19LAotX3NubXBJblRvdGFsUmVxVmFyc19vYmogPSB7Ci0JInNubXBJblRvdGFsUmVxVmFycyIsIDEzLCAwLAotCU5VTEwsICZfc25tcEluR2VuRXJyc19vYmoKLX0sCi1fc25tcEluVG90YWxTZXRWYXJzX29iaiA9IHsKLQkic25tcEluVG90YWxTZXRWYXJzIiwgMTQsIDAsCi0JTlVMTCwgJl9zbm1wSW5Ub3RhbFJlcVZhcnNfb2JqCi19LAotX3NubXBJbkdldFJlcXVlc3RzX29iaiA9IHsKLQkic25tcEluR2V0UmVxdWVzdHMiLCAxNSwgMCwKLQlOVUxMLCAmX3NubXBJblRvdGFsU2V0VmFyc19vYmoKLX0sCi1fc25tcEluR2V0TmV4dHNfb2JqID0gewotCSJzbm1wSW5HZXROZXh0cyIsIDE2LCAwLAotCU5VTEwsICZfc25tcEluR2V0UmVxdWVzdHNfb2JqCi19LAotX3NubXBJblNldFJlcXVlc3RzX29iaiA9IHsKLQkic25tcEluU2V0UmVxdWVzdHMiLCAxNywgMCwKLQlOVUxMLCAmX3NubXBJbkdldE5leHRzX29iagotfSwKLV9zbm1wSW5HZXRSZXNwb25zZXNfb2JqID0gewotCSJzbm1wSW5HZXRSZXNwb25zZXMiLCAxOCwgMCwKLQlOVUxMLCAmX3NubXBJblNldFJlcXVlc3RzX29iagotfSwKLV9zbm1wSW5UcmFwc19vYmogPSB7Ci0JInNubXBJblRyYXBzIiwgMTksIDAsCi0JTlVMTCwgJl9zbm1wSW5HZXRSZXNwb25zZXNfb2JqCi19LAotX3NubXBPdXRUb29CaWdzX29iaiA9IHsKLQkic25tcE91dFRvb0JpZ3MiLCAyMCwgMCwKLQlOVUxMLCAmX3NubXBJblRyYXBzX29iagotfSwKLV9zbm1wT3V0Tm9TdWNoTmFtZXNfb2JqID0gewotCSJzbm1wT3V0Tm9TdWNoTmFtZXMiLCAyMSwgMCwKLQlOVUxMLCAmX3NubXBPdXRUb29CaWdzX29iagotfSwKLV9zbm1wT3V0QmFkVmFsdWVzX29iaiA9IHsKLQkic25tcE91dEJhZFZhbHVlcyIsIDIyLCAwLAotCU5VTEwsICZfc25tcE91dE5vU3VjaE5hbWVzX29iagotfSwKLV9zbm1wT3V0UmVhZE9ubHlzX29iaiA9IHsKLQkic25tcE91dFJlYWRPbmx5cyIsIDIzLCAwLAotCU5VTEwsICZfc25tcE91dEJhZFZhbHVlc19vYmoKLX0sCi1fc25tcE91dEdlbkVycnNfb2JqID0gewotCSJzbm1wT3V0R2VuRXJycyIsIDI0LCAwLAotCU5VTEwsICZfc25tcE91dFJlYWRPbmx5c19vYmoKLX0sCi1fc25tcE91dEdldFJlcXVlc3RzX29iaiA9IHsKLQkic25tcE91dEdldFJlcXVlc3RzIiwgMjUsIDAsCi0JTlVMTCwgJl9zbm1wT3V0R2VuRXJyc19vYmoKLX0sCi1fc25tcE91dEdldE5leHRzX29iaiA9IHsKLQkic25tcE91dEdldE5leHRzIiwgMjYsIDAsCi0JTlVMTCwgJl9zbm1wT3V0R2V0UmVxdWVzdHNfb2JqCi19LAotX3NubXBPdXRTZXRSZXF1ZXN0c19vYmogPSB7Ci0JInNubXBPdXRTZXRSZXF1ZXN0cyIsIDI3LCAwLAotCU5VTEwsICZfc25tcE91dEdldE5leHRzX29iagotfSwKLV9zbm1wT3V0R2V0UmVzcG9uc2VzX29iaiA9IHsKLQkic25tcE91dEdldFJlc3BvbnNlcyIsIDI4LCAwLAotCU5VTEwsICZfc25tcE91dFNldFJlcXVlc3RzX29iagotfSwKLV9zbm1wT3V0VHJhcHNfb2JqID0gewotCSJzbm1wT3V0VHJhcHMiLCAyOSwgMCwKLQlOVUxMLCAmX3NubXBPdXRHZXRSZXNwb25zZXNfb2JqCi19LAotX3NubXBFbmFibGVBdXRoVHJhcHNfb2JqID0gewotCSJzbm1wRW5hYmxlQXV0aFRyYXBzIiwgMzAsIDAsCi0JTlVMTCwgJl9zbm1wT3V0VHJhcHNfb2JqCi19LAotX2VncE5laWdoU3RhdGVfb2JqID0gewotCSJlZ3BOZWlnaFN0YXRlIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX2VncE5laWdoQWRkcl9vYmogPSB7Ci0JImVncE5laWdoQWRkciIsIDIsIDAsCi0JTlVMTCwgJl9lZ3BOZWlnaFN0YXRlX29iagotfSwKLV9lZ3BOZWlnaEFzX29iaiA9IHsKLQkiZWdwTmVpZ2hBcyIsIDMsIDAsCi0JTlVMTCwgJl9lZ3BOZWlnaEFkZHJfb2JqCi19LAotX2VncE5laWdoSW5Nc2dzX29iaiA9IHsKLQkiZWdwTmVpZ2hJbk1zZ3MiLCA0LCAwLAotCU5VTEwsICZfZWdwTmVpZ2hBc19vYmoKLX0sCi1fZWdwTmVpZ2hJbkVycnNfb2JqID0gewotCSJlZ3BOZWlnaEluRXJycyIsIDUsIDAsCi0JTlVMTCwgJl9lZ3BOZWlnaEluTXNnc19vYmoKLX0sCi1fZWdwTmVpZ2hPdXRNc2dzX29iaiA9IHsKLQkiZWdwTmVpZ2hPdXRNc2dzIiwgNiwgMCwKLQlOVUxMLCAmX2VncE5laWdoSW5FcnJzX29iagotfSwKLV9lZ3BOZWlnaE91dEVycnNfb2JqID0gewotCSJlZ3BOZWlnaE91dEVycnMiLCA3LCAwLAotCU5VTEwsICZfZWdwTmVpZ2hPdXRNc2dzX29iagotfSwKLV9lZ3BOZWlnaEluRXJyTXNnc19vYmogPSB7Ci0JImVncE5laWdoSW5FcnJNc2dzIiwgOCwgMCwKLQlOVUxMLCAmX2VncE5laWdoT3V0RXJyc19vYmoKLX0sCi1fZWdwTmVpZ2hPdXRFcnJNc2dzX29iaiA9IHsKLQkiZWdwTmVpZ2hPdXRFcnJNc2dzIiwgOSwgMCwKLQlOVUxMLCAmX2VncE5laWdoSW5FcnJNc2dzX29iagotfSwKLV9lZ3BOZWlnaFN0YXRlVXBzX29iaiA9IHsKLQkiZWdwTmVpZ2hTdGF0ZVVwcyIsIDEwLCAwLAotCU5VTEwsICZfZWdwTmVpZ2hPdXRFcnJNc2dzX29iagotfSwKLV9lZ3BOZWlnaFN0YXRlRG93bnNfb2JqID0gewotCSJlZ3BOZWlnaFN0YXRlRG93bnMiLCAxMSwgMCwKLQlOVUxMLCAmX2VncE5laWdoU3RhdGVVcHNfb2JqCi19LAotX2VncE5laWdoSW50ZXJ2YWxIZWxsb19vYmogPSB7Ci0JImVncE5laWdoSW50ZXJ2YWxIZWxsbyIsIDEyLCAwLAotCU5VTEwsICZfZWdwTmVpZ2hTdGF0ZURvd25zX29iagotfSwKLV9lZ3BOZWlnaEludGVydmFsUG9sbF9vYmogPSB7Ci0JImVncE5laWdoSW50ZXJ2YWxQb2xsIiwgMTMsIDAsCi0JTlVMTCwgJl9lZ3BOZWlnaEludGVydmFsSGVsbG9fb2JqCi19LAotX2VncE5laWdoTW9kZV9vYmogPSB7Ci0JImVncE5laWdoTW9kZSIsIDE0LCAwLAotCU5VTEwsICZfZWdwTmVpZ2hJbnRlcnZhbFBvbGxfb2JqCi19LAotX2VncE5laWdoRXZlbnRUcmlnZ2VyX29iaiA9IHsKLQkiZWdwTmVpZ2hFdmVudFRyaWdnZXIiLCAxNSwgMCwKLQlOVUxMLCAmX2VncE5laWdoTW9kZV9vYmoKLX0sCi1fZWdwTmVpZ2hFbnRyeV9vYmogPSB7Ci0JImVncE5laWdoRW50cnkiLCAxLCAwLAotCSZfZWdwTmVpZ2hFdmVudFRyaWdnZXJfb2JqLCBOVUxMCi19LAotX2VncEluTXNnc19vYmogPSB7Ci0JImVncEluTXNncyIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9lZ3BJbkVycm9yc19vYmogPSB7Ci0JImVncEluRXJyb3JzIiwgMiwgMCwKLQlOVUxMLCAmX2VncEluTXNnc19vYmoKLX0sCi1fZWdwT3V0TXNnc19vYmogPSB7Ci0JImVncE91dE1zZ3MiLCAzLCAwLAotCU5VTEwsICZfZWdwSW5FcnJvcnNfb2JqCi19LAotX2VncE91dEVycm9yc19vYmogPSB7Ci0JImVncE91dEVycm9ycyIsIDQsIDAsCi0JTlVMTCwgJl9lZ3BPdXRNc2dzX29iagotfSwKLV9lZ3BOZWlnaFRhYmxlX29iaiA9IHsKLQkiZWdwTmVpZ2hUYWJsZSIsIDUsIDAsCi0JJl9lZ3BOZWlnaEVudHJ5X29iaiwgJl9lZ3BPdXRFcnJvcnNfb2JqCi19LAotX2VncEFzX29iaiA9IHsKLQkiZWdwQXMiLCA2LCAwLAotCU5VTEwsICZfZWdwTmVpZ2hUYWJsZV9vYmoKLX0sCi1fdWRwTG9jYWxBZGRyZXNzX29iaiA9IHsKLQkidWRwTG9jYWxBZGRyZXNzIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX3VkcExvY2FsUG9ydF9vYmogPSB7Ci0JInVkcExvY2FsUG9ydCIsIDIsIDAsCi0JTlVMTCwgJl91ZHBMb2NhbEFkZHJlc3Nfb2JqCi19LAotX3VkcEVudHJ5X29iaiA9IHsKLQkidWRwRW50cnkiLCAxLCAwLAotCSZfdWRwTG9jYWxQb3J0X29iaiwgTlVMTAotfSwKLV91ZHBJbkRhdGFncmFtc19vYmogPSB7Ci0JInVkcEluRGF0YWdyYW1zIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX3VkcE5vUG9ydHNfb2JqID0gewotCSJ1ZHBOb1BvcnRzIiwgMiwgMCwKLQlOVUxMLCAmX3VkcEluRGF0YWdyYW1zX29iagotfSwKLV91ZHBJbkVycm9yc19vYmogPSB7Ci0JInVkcEluRXJyb3JzIiwgMywgMCwKLQlOVUxMLCAmX3VkcE5vUG9ydHNfb2JqCi19LAotX3VkcE91dERhdGFncmFtc19vYmogPSB7Ci0JInVkcE91dERhdGFncmFtcyIsIDQsIDAsCi0JTlVMTCwgJl91ZHBJbkVycm9yc19vYmoKLX0sCi1fdWRwVGFibGVfb2JqID0gewotCSJ1ZHBUYWJsZSIsIDUsIDAsCi0JJl91ZHBFbnRyeV9vYmosICZfdWRwT3V0RGF0YWdyYW1zX29iagotfSwKLV90Y3BDb25uU3RhdGVfb2JqID0gewotCSJ0Y3BDb25uU3RhdGUiLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1fdGNwQ29ubkxvY2FsQWRkcmVzc19vYmogPSB7Ci0JInRjcENvbm5Mb2NhbEFkZHJlc3MiLCAyLCAwLAotCU5VTEwsICZfdGNwQ29ublN0YXRlX29iagotfSwKLV90Y3BDb25uTG9jYWxQb3J0X29iaiA9IHsKLQkidGNwQ29ubkxvY2FsUG9ydCIsIDMsIDAsCi0JTlVMTCwgJl90Y3BDb25uTG9jYWxBZGRyZXNzX29iagotfSwKLV90Y3BDb25uUmVtQWRkcmVzc19vYmogPSB7Ci0JInRjcENvbm5SZW1BZGRyZXNzIiwgNCwgMCwKLQlOVUxMLCAmX3RjcENvbm5Mb2NhbFBvcnRfb2JqCi19LAotX3RjcENvbm5SZW1Qb3J0X29iaiA9IHsKLQkidGNwQ29ublJlbVBvcnQiLCA1LCAwLAotCU5VTEwsICZfdGNwQ29ublJlbUFkZHJlc3Nfb2JqCi19LAotX3RjcENvbm5FbnRyeV9vYmogPSB7Ci0JInRjcENvbm5FbnRyeSIsIDEsIDAsCi0JJl90Y3BDb25uUmVtUG9ydF9vYmosIE5VTEwKLX0sCi1fdGNwUnRvQWxnb3JpdGhtX29iaiA9IHsKLQkidGNwUnRvQWxnb3JpdGhtIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX3RjcFJ0b01pbl9vYmogPSB7Ci0JInRjcFJ0b01pbiIsIDIsIDAsCi0JTlVMTCwgJl90Y3BSdG9BbGdvcml0aG1fb2JqCi19LAotX3RjcFJ0b01heF9vYmogPSB7Ci0JInRjcFJ0b01heCIsIDMsIDAsCi0JTlVMTCwgJl90Y3BSdG9NaW5fb2JqCi19LAotX3RjcE1heENvbm5fb2JqID0gewotCSJ0Y3BNYXhDb25uIiwgNCwgMCwKLQlOVUxMLCAmX3RjcFJ0b01heF9vYmoKLX0sCi1fdGNwQWN0aXZlT3BlbnNfb2JqID0gewotCSJ0Y3BBY3RpdmVPcGVucyIsIDUsIDAsCi0JTlVMTCwgJl90Y3BNYXhDb25uX29iagotfSwKLV90Y3BQYXNzaXZlT3BlbnNfb2JqID0gewotCSJ0Y3BQYXNzaXZlT3BlbnMiLCA2LCAwLAotCU5VTEwsICZfdGNwQWN0aXZlT3BlbnNfb2JqCi19LAotX3RjcEF0dGVtcHRGYWlsc19vYmogPSB7Ci0JInRjcEF0dGVtcHRGYWlscyIsIDcsIDAsCi0JTlVMTCwgJl90Y3BQYXNzaXZlT3BlbnNfb2JqCi19LAotX3RjcEVzdGFiUmVzZXRzX29iaiA9IHsKLQkidGNwRXN0YWJSZXNldHMiLCA4LCAwLAotCU5VTEwsICZfdGNwQXR0ZW1wdEZhaWxzX29iagotfSwKLV90Y3BDdXJyRXN0YWJfb2JqID0gewotCSJ0Y3BDdXJyRXN0YWIiLCA5LCAwLAotCU5VTEwsICZfdGNwRXN0YWJSZXNldHNfb2JqCi19LAotX3RjcEluU2Vnc19vYmogPSB7Ci0JInRjcEluU2VncyIsIDEwLCAwLAotCU5VTEwsICZfdGNwQ3VyckVzdGFiX29iagotfSwKLV90Y3BPdXRTZWdzX29iaiA9IHsKLQkidGNwT3V0U2VncyIsIDExLCAwLAotCU5VTEwsICZfdGNwSW5TZWdzX29iagotfSwKLV90Y3BSZXRyYW5zU2Vnc19vYmogPSB7Ci0JInRjcFJldHJhbnNTZWdzIiwgMTIsIDAsCi0JTlVMTCwgJl90Y3BPdXRTZWdzX29iagotfSwKLV90Y3BDb25uVGFibGVfb2JqID0gewotCSJ0Y3BDb25uVGFibGUiLCAxMywgMCwKLQkmX3RjcENvbm5FbnRyeV9vYmosICZfdGNwUmV0cmFuc1NlZ3Nfb2JqCi19LAotX3RjcEluRXJyc19vYmogPSB7Ci0JInRjcEluRXJycyIsIDE0LCAwLAotCU5VTEwsICZfdGNwQ29ublRhYmxlX29iagotfSwKLV90Y3BPdXRSc3RzX29iaiA9IHsKLQkidGNwT3V0UnN0cyIsIDE1LCAwLAotCU5VTEwsICZfdGNwSW5FcnJzX29iagotfSwKLV9pY21wSW5Nc2dzX29iaiA9IHsKLQkiaWNtcEluTXNncyIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9pY21wSW5FcnJvcnNfb2JqID0gewotCSJpY21wSW5FcnJvcnMiLCAyLCAwLAotCU5VTEwsICZfaWNtcEluTXNnc19vYmoKLX0sCi1faWNtcEluRGVzdFVucmVhY2hzX29iaiA9IHsKLQkiaWNtcEluRGVzdFVucmVhY2hzIiwgMywgMCwKLQlOVUxMLCAmX2ljbXBJbkVycm9yc19vYmoKLX0sCi1faWNtcEluVGltZUV4Y2RzX29iaiA9IHsKLQkiaWNtcEluVGltZUV4Y2RzIiwgNCwgMCwKLQlOVUxMLCAmX2ljbXBJbkRlc3RVbnJlYWNoc19vYmoKLX0sCi1faWNtcEluUGFybVByb2JzX29iaiA9IHsKLQkiaWNtcEluUGFybVByb2JzIiwgNSwgMCwKLQlOVUxMLCAmX2ljbXBJblRpbWVFeGNkc19vYmoKLX0sCi1faWNtcEluU3JjUXVlbmNoc19vYmogPSB7Ci0JImljbXBJblNyY1F1ZW5jaHMiLCA2LCAwLAotCU5VTEwsICZfaWNtcEluUGFybVByb2JzX29iagotfSwKLV9pY21wSW5SZWRpcmVjdHNfb2JqID0gewotCSJpY21wSW5SZWRpcmVjdHMiLCA3LCAwLAotCU5VTEwsICZfaWNtcEluU3JjUXVlbmNoc19vYmoKLX0sCi1faWNtcEluRWNob3Nfb2JqID0gewotCSJpY21wSW5FY2hvcyIsIDgsIDAsCi0JTlVMTCwgJl9pY21wSW5SZWRpcmVjdHNfb2JqCi19LAotX2ljbXBJbkVjaG9SZXBzX29iaiA9IHsKLQkiaWNtcEluRWNob1JlcHMiLCA5LCAwLAotCU5VTEwsICZfaWNtcEluRWNob3Nfb2JqCi19LAotX2ljbXBJblRpbWVzdGFtcHNfb2JqID0gewotCSJpY21wSW5UaW1lc3RhbXBzIiwgMTAsIDAsCi0JTlVMTCwgJl9pY21wSW5FY2hvUmVwc19vYmoKLX0sCi1faWNtcEluVGltZXN0YW1wUmVwc19vYmogPSB7Ci0JImljbXBJblRpbWVzdGFtcFJlcHMiLCAxMSwgMCwKLQlOVUxMLCAmX2ljbXBJblRpbWVzdGFtcHNfb2JqCi19LAotX2ljbXBJbkFkZHJNYXNrc19vYmogPSB7Ci0JImljbXBJbkFkZHJNYXNrcyIsIDEyLCAwLAotCU5VTEwsICZfaWNtcEluVGltZXN0YW1wUmVwc19vYmoKLX0sCi1faWNtcEluQWRkck1hc2tSZXBzX29iaiA9IHsKLQkiaWNtcEluQWRkck1hc2tSZXBzIiwgMTMsIDAsCi0JTlVMTCwgJl9pY21wSW5BZGRyTWFza3Nfb2JqCi19LAotX2ljbXBPdXRNc2dzX29iaiA9IHsKLQkiaWNtcE91dE1zZ3MiLCAxNCwgMCwKLQlOVUxMLCAmX2ljbXBJbkFkZHJNYXNrUmVwc19vYmoKLX0sCi1faWNtcE91dEVycm9yc19vYmogPSB7Ci0JImljbXBPdXRFcnJvcnMiLCAxNSwgMCwKLQlOVUxMLCAmX2ljbXBPdXRNc2dzX29iagotfSwKLV9pY21wT3V0RGVzdFVucmVhY2hzX29iaiA9IHsKLQkiaWNtcE91dERlc3RVbnJlYWNocyIsIDE2LCAwLAotCU5VTEwsICZfaWNtcE91dEVycm9yc19vYmoKLX0sCi1faWNtcE91dFRpbWVFeGNkc19vYmogPSB7Ci0JImljbXBPdXRUaW1lRXhjZHMiLCAxNywgMCwKLQlOVUxMLCAmX2ljbXBPdXREZXN0VW5yZWFjaHNfb2JqCi19LAotX2ljbXBPdXRQYXJtUHJvYnNfb2JqID0gewotCSJpY21wT3V0UGFybVByb2JzIiwgMTgsIDAsCi0JTlVMTCwgJl9pY21wT3V0VGltZUV4Y2RzX29iagotfSwKLV9pY21wT3V0U3JjUXVlbmNoc19vYmogPSB7Ci0JImljbXBPdXRTcmNRdWVuY2hzIiwgMTksIDAsCi0JTlVMTCwgJl9pY21wT3V0UGFybVByb2JzX29iagotfSwKLV9pY21wT3V0UmVkaXJlY3RzX29iaiA9IHsKLQkiaWNtcE91dFJlZGlyZWN0cyIsIDIwLCAwLAotCU5VTEwsICZfaWNtcE91dFNyY1F1ZW5jaHNfb2JqCi19LAotX2ljbXBPdXRFY2hvc19vYmogPSB7Ci0JImljbXBPdXRFY2hvcyIsIDIxLCAwLAotCU5VTEwsICZfaWNtcE91dFJlZGlyZWN0c19vYmoKLX0sCi1faWNtcE91dEVjaG9SZXBzX29iaiA9IHsKLQkiaWNtcE91dEVjaG9SZXBzIiwgMjIsIDAsCi0JTlVMTCwgJl9pY21wT3V0RWNob3Nfb2JqCi19LAotX2ljbXBPdXRUaW1lc3RhbXBzX29iaiA9IHsKLQkiaWNtcE91dFRpbWVzdGFtcHMiLCAyMywgMCwKLQlOVUxMLCAmX2ljbXBPdXRFY2hvUmVwc19vYmoKLX0sCi1faWNtcE91dFRpbWVzdGFtcFJlcHNfb2JqID0gewotCSJpY21wT3V0VGltZXN0YW1wUmVwcyIsIDI0LCAwLAotCU5VTEwsICZfaWNtcE91dFRpbWVzdGFtcHNfb2JqCi19LAotX2ljbXBPdXRBZGRyTWFza3Nfb2JqID0gewotCSJpY21wT3V0QWRkck1hc2tzIiwgMjUsIDAsCi0JTlVMTCwgJl9pY21wT3V0VGltZXN0YW1wUmVwc19vYmoKLX0sCi1faWNtcE91dEFkZHJNYXNrUmVwc19vYmogPSB7Ci0JImljbXBPdXRBZGRyTWFza1JlcHMiLCAyNiwgMCwKLQlOVUxMLCAmX2ljbXBPdXRBZGRyTWFza3Nfb2JqCi19LAotX2lwTmV0VG9NZWRpYUlmSW5kZXhfb2JqID0gewotCSJpcE5ldFRvTWVkaWFJZkluZGV4IiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX2lwTmV0VG9NZWRpYVBoeXNBZGRyZXNzX29iaiA9IHsKLQkiaXBOZXRUb01lZGlhUGh5c0FkZHJlc3MiLCAyLCAwLAotCU5VTEwsICZfaXBOZXRUb01lZGlhSWZJbmRleF9vYmoKLX0sCi1faXBOZXRUb01lZGlhTmV0QWRkcmVzc19vYmogPSB7Ci0JImlwTmV0VG9NZWRpYU5ldEFkZHJlc3MiLCAzLCAwLAotCU5VTEwsICZfaXBOZXRUb01lZGlhUGh5c0FkZHJlc3Nfb2JqCi19LAotX2lwTmV0VG9NZWRpYVR5cGVfb2JqID0gewotCSJpcE5ldFRvTWVkaWFUeXBlIiwgNCwgMCwKLQlOVUxMLCAmX2lwTmV0VG9NZWRpYU5ldEFkZHJlc3Nfb2JqCi19LAotX2lwTmV0VG9NZWRpYUVudHJ5X29iaiA9IHsKLQkiaXBOZXRUb01lZGlhRW50cnkiLCAxLCAwLAotCSZfaXBOZXRUb01lZGlhVHlwZV9vYmosIE5VTEwKLX0sCi1faXBSb3V0ZURlc3Rfb2JqID0gewotCSJpcFJvdXRlRGVzdCIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9pcFJvdXRlSWZJbmRleF9vYmogPSB7Ci0JImlwUm91dGVJZkluZGV4IiwgMiwgMCwKLQlOVUxMLCAmX2lwUm91dGVEZXN0X29iagotfSwKLV9pcFJvdXRlTWV0cmljMV9vYmogPSB7Ci0JImlwUm91dGVNZXRyaWMxIiwgMywgMCwKLQlOVUxMLCAmX2lwUm91dGVJZkluZGV4X29iagotfSwKLV9pcFJvdXRlTWV0cmljMl9vYmogPSB7Ci0JImlwUm91dGVNZXRyaWMyIiwgNCwgMCwKLQlOVUxMLCAmX2lwUm91dGVNZXRyaWMxX29iagotfSwKLV9pcFJvdXRlTWV0cmljM19vYmogPSB7Ci0JImlwUm91dGVNZXRyaWMzIiwgNSwgMCwKLQlOVUxMLCAmX2lwUm91dGVNZXRyaWMyX29iagotfSwKLV9pcFJvdXRlTWV0cmljNF9vYmogPSB7Ci0JImlwUm91dGVNZXRyaWM0IiwgNiwgMCwKLQlOVUxMLCAmX2lwUm91dGVNZXRyaWMzX29iagotfSwKLV9pcFJvdXRlTmV4dEhvcF9vYmogPSB7Ci0JImlwUm91dGVOZXh0SG9wIiwgNywgMCwKLQlOVUxMLCAmX2lwUm91dGVNZXRyaWM0X29iagotfSwKLV9pcFJvdXRlVHlwZV9vYmogPSB7Ci0JImlwUm91dGVUeXBlIiwgOCwgMCwKLQlOVUxMLCAmX2lwUm91dGVOZXh0SG9wX29iagotfSwKLV9pcFJvdXRlUHJvdG9fb2JqID0gewotCSJpcFJvdXRlUHJvdG8iLCA5LCAwLAotCU5VTEwsICZfaXBSb3V0ZVR5cGVfb2JqCi19LAotX2lwUm91dGVBZ2Vfb2JqID0gewotCSJpcFJvdXRlQWdlIiwgMTAsIDAsCi0JTlVMTCwgJl9pcFJvdXRlUHJvdG9fb2JqCi19LAotX2lwUm91dGVNYXNrX29iaiA9IHsKLQkiaXBSb3V0ZU1hc2siLCAxMSwgMCwKLQlOVUxMLCAmX2lwUm91dGVBZ2Vfb2JqCi19LAotX2lwUm91dGVFbnRyeV9vYmogPSB7Ci0JImlwUm91dGVFbnRyeSIsIDEsIDAsCi0JJl9pcFJvdXRlTWFza19vYmosIE5VTEwKLX0sCi1faXBBZEVudEFkZHJfb2JqID0gewotCSJpcEFkRW50QWRkciIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9pcEFkRW50SWZJbmRleF9vYmogPSB7Ci0JImlwQWRFbnRJZkluZGV4IiwgMiwgMCwKLQlOVUxMLCAmX2lwQWRFbnRBZGRyX29iagotfSwKLV9pcEFkRW50TmV0TWFza19vYmogPSB7Ci0JImlwQWRFbnROZXRNYXNrIiwgMywgMCwKLQlOVUxMLCAmX2lwQWRFbnRJZkluZGV4X29iagotfSwKLV9pcEFkRW50QmNhc3RBZGRyX29iaiA9IHsKLQkiaXBBZEVudEJjYXN0QWRkciIsIDQsIDAsCi0JTlVMTCwgJl9pcEFkRW50TmV0TWFza19vYmoKLX0sCi1faXBBZEVudFJlYXNtTWF4U2l6ZV9vYmogPSB7Ci0JImlwQWRFbnRSZWFzbU1heFNpemUiLCA1LCAwLAotCU5VTEwsICZfaXBBZEVudEJjYXN0QWRkcl9vYmoKLX0sCi1faXBBZGRyRW50cnlfb2JqID0gewotCSJpcEFkZHJFbnRyeSIsIDEsIDAsCi0JJl9pcEFkRW50UmVhc21NYXhTaXplX29iaiwgTlVMTAotfSwKLV9pcEZvcndhcmRpbmdfb2JqID0gewotCSJpcEZvcndhcmRpbmciLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1faXBEZWZhdWx0VFRMX29iaiA9IHsKLQkiaXBEZWZhdWx0VFRMIiwgMiwgMCwKLQlOVUxMLCAmX2lwRm9yd2FyZGluZ19vYmoKLX0sCi1faXBJblJlY2VpdmVzX29iaiA9IHsKLQkiaXBJblJlY2VpdmVzIiwgMywgMCwKLQlOVUxMLCAmX2lwRGVmYXVsdFRUTF9vYmoKLX0sCi1faXBJbkhkckVycm9yc19vYmogPSB7Ci0JImlwSW5IZHJFcnJvcnMiLCA0LCAwLAotCU5VTEwsICZfaXBJblJlY2VpdmVzX29iagotfSwKLV9pcEluQWRkckVycm9yc19vYmogPSB7Ci0JImlwSW5BZGRyRXJyb3JzIiwgNSwgMCwKLQlOVUxMLCAmX2lwSW5IZHJFcnJvcnNfb2JqCi19LAotX2lwRm9yd0RhdGFncmFtc19vYmogPSB7Ci0JImlwRm9yd0RhdGFncmFtcyIsIDYsIDAsCi0JTlVMTCwgJl9pcEluQWRkckVycm9yc19vYmoKLX0sCi1faXBJblVua25vd25Qcm90b3Nfb2JqID0gewotCSJpcEluVW5rbm93blByb3RvcyIsIDcsIDAsCi0JTlVMTCwgJl9pcEZvcndEYXRhZ3JhbXNfb2JqCi19LAotX2lwSW5EaXNjYXJkc19vYmogPSB7Ci0JImlwSW5EaXNjYXJkcyIsIDgsIDAsCi0JTlVMTCwgJl9pcEluVW5rbm93blByb3Rvc19vYmoKLX0sCi1faXBJbkRlbGl2ZXJzX29iaiA9IHsKLQkiaXBJbkRlbGl2ZXJzIiwgOSwgMCwKLQlOVUxMLCAmX2lwSW5EaXNjYXJkc19vYmoKLX0sCi1faXBPdXRSZXF1ZXN0c19vYmogPSB7Ci0JImlwT3V0UmVxdWVzdHMiLCAxMCwgMCwKLQlOVUxMLCAmX2lwSW5EZWxpdmVyc19vYmoKLX0sCi1faXBPdXREaXNjYXJkc19vYmogPSB7Ci0JImlwT3V0RGlzY2FyZHMiLCAxMSwgMCwKLQlOVUxMLCAmX2lwT3V0UmVxdWVzdHNfb2JqCi19LAotX2lwT3V0Tm9Sb3V0ZXNfb2JqID0gewotCSJpcE91dE5vUm91dGVzIiwgMTIsIDAsCi0JTlVMTCwgJl9pcE91dERpc2NhcmRzX29iagotfSwKLV9pcFJlYXNtVGltZW91dF9vYmogPSB7Ci0JImlwUmVhc21UaW1lb3V0IiwgMTMsIDAsCi0JTlVMTCwgJl9pcE91dE5vUm91dGVzX29iagotfSwKLV9pcFJlYXNtUmVxZHNfb2JqID0gewotCSJpcFJlYXNtUmVxZHMiLCAxNCwgMCwKLQlOVUxMLCAmX2lwUmVhc21UaW1lb3V0X29iagotfSwKLV9pcFJlYXNtT0tzX29iaiA9IHsKLQkiaXBSZWFzbU9LcyIsIDE1LCAwLAotCU5VTEwsICZfaXBSZWFzbVJlcWRzX29iagotfSwKLV9pcFJlYXNtRmFpbHNfb2JqID0gewotCSJpcFJlYXNtRmFpbHMiLCAxNiwgMCwKLQlOVUxMLCAmX2lwUmVhc21PS3Nfb2JqCi19LAotX2lwRnJhZ09Lc19vYmogPSB7Ci0JImlwRnJhZ09LcyIsIDE3LCAwLAotCU5VTEwsICZfaXBSZWFzbUZhaWxzX29iagotfSwKLV9pcEZyYWdGYWlsc19vYmogPSB7Ci0JImlwRnJhZ0ZhaWxzIiwgMTgsIDAsCi0JTlVMTCwgJl9pcEZyYWdPS3Nfb2JqCi19LAotX2lwRnJhZ0NyZWF0ZXNfb2JqID0gewotCSJpcEZyYWdDcmVhdGVzIiwgMTksIDAsCi0JTlVMTCwgJl9pcEZyYWdGYWlsc19vYmoKLX0sCi1faXBBZGRyVGFibGVfb2JqID0gewotCSJpcEFkZHJUYWJsZSIsIDIwLCAwLAotCSZfaXBBZGRyRW50cnlfb2JqLCAmX2lwRnJhZ0NyZWF0ZXNfb2JqCi19LAotX2lwUm91dGluZ1RhYmxlX29iaiA9IHsKLQkiaXBSb3V0aW5nVGFibGUiLCAyMSwgMCwKLQkmX2lwUm91dGVFbnRyeV9vYmosICZfaXBBZGRyVGFibGVfb2JqCi19LAotX2lwTmV0VG9NZWRpYVRhYmxlX29iaiA9IHsKLQkiaXBOZXRUb01lZGlhVGFibGUiLCAyMiwgMCwKLQkmX2lwTmV0VG9NZWRpYUVudHJ5X29iaiwgJl9pcFJvdXRpbmdUYWJsZV9vYmoKLX0sCi1fYXRJZkluZGV4X29iaiA9IHsKLQkiYXRJZkluZGV4IiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX2F0UGh5c0FkZHJlc3Nfb2JqID0gewotCSJhdFBoeXNBZGRyZXNzIiwgMiwgMCwKLQlOVUxMLCAmX2F0SWZJbmRleF9vYmoKLX0sCi1fYXROZXRBZGRyZXNzX29iaiA9IHsKLQkiYXROZXRBZGRyZXNzIiwgMywgMCwKLQlOVUxMLCAmX2F0UGh5c0FkZHJlc3Nfb2JqCi19LAotX2F0RW50cnlfb2JqID0gewotCSJhdEVudHJ5IiwgMSwgMCwKLQkmX2F0TmV0QWRkcmVzc19vYmosIE5VTEwKLX0sCi1fYXRUYWJsZV9vYmogPSB7Ci0JImF0VGFibGUiLCAxLCAwLAotCSZfYXRFbnRyeV9vYmosIE5VTEwKLX0sCi1faWZJbmRleF9vYmogPSB7Ci0JImlmSW5kZXgiLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1faWZEZXNjcl9vYmogPSB7Ci0JImlmRGVzY3IiLCAyLCAwLAotCU5VTEwsICZfaWZJbmRleF9vYmoKLX0sCi1faWZUeXBlX29iaiA9IHsKLQkiaWZUeXBlIiwgMywgMCwKLQlOVUxMLCAmX2lmRGVzY3Jfb2JqCi19LAotX2lmTXR1X29iaiA9IHsKLQkiaWZNdHUiLCA0LCAwLAotCU5VTEwsICZfaWZUeXBlX29iagotfSwKLV9pZlNwZWVkX29iaiA9IHsKLQkiaWZTcGVlZCIsIDUsIDAsCi0JTlVMTCwgJl9pZk10dV9vYmoKLX0sCi1faWZQaHlzQWRkcmVzc19vYmogPSB7Ci0JImlmUGh5c0FkZHJlc3MiLCA2LCAwLAotCU5VTEwsICZfaWZTcGVlZF9vYmoKLX0sCi1faWZBZG1pblN0YXR1c19vYmogPSB7Ci0JImlmQWRtaW5TdGF0dXMiLCA3LCAwLAotCU5VTEwsICZfaWZQaHlzQWRkcmVzc19vYmoKLX0sCi1faWZPcGVyU3RhdHVzX29iaiA9IHsKLQkiaWZPcGVyU3RhdHVzIiwgOCwgMCwKLQlOVUxMLCAmX2lmQWRtaW5TdGF0dXNfb2JqCi19LAotX2lmTGFzdENoYW5nZV9vYmogPSB7Ci0JImlmTGFzdENoYW5nZSIsIDksIDAsCi0JTlVMTCwgJl9pZk9wZXJTdGF0dXNfb2JqCi19LAotX2lmSW5PY3RldHNfb2JqID0gewotCSJpZkluT2N0ZXRzIiwgMTAsIDAsCi0JTlVMTCwgJl9pZkxhc3RDaGFuZ2Vfb2JqCi19LAotX2lmSW5VY2FzdFBrdHNfb2JqID0gewotCSJpZkluVWNhc3RQa3RzIiwgMTEsIDAsCi0JTlVMTCwgJl9pZkluT2N0ZXRzX29iagotfSwKLV9pZkluTlVjYXN0UGt0c19vYmogPSB7Ci0JImlmSW5OVWNhc3RQa3RzIiwgMTIsIDAsCi0JTlVMTCwgJl9pZkluVWNhc3RQa3RzX29iagotfSwKLV9pZkluRGlzY2FyZHNfb2JqID0gewotCSJpZkluRGlzY2FyZHMiLCAxMywgMCwKLQlOVUxMLCAmX2lmSW5OVWNhc3RQa3RzX29iagotfSwKLV9pZkluRXJyb3JzX29iaiA9IHsKLQkiaWZJbkVycm9ycyIsIDE0LCAwLAotCU5VTEwsICZfaWZJbkRpc2NhcmRzX29iagotfSwKLV9pZkluVW5rbm93blByb3Rvc19vYmogPSB7Ci0JImlmSW5Vbmtub3duUHJvdG9zIiwgMTUsIDAsCi0JTlVMTCwgJl9pZkluRXJyb3JzX29iagotfSwKLV9pZk91dE9jdGV0c19vYmogPSB7Ci0JImlmT3V0T2N0ZXRzIiwgMTYsIDAsCi0JTlVMTCwgJl9pZkluVW5rbm93blByb3Rvc19vYmoKLX0sCi1faWZPdXRVY2FzdFBrdHNfb2JqID0gewotCSJpZk91dFVjYXN0UGt0cyIsIDE3LCAwLAotCU5VTEwsICZfaWZPdXRPY3RldHNfb2JqCi19LAotX2lmT3V0TlVjYXN0UGt0c19vYmogPSB7Ci0JImlmT3V0TlVjYXN0UGt0cyIsIDE4LCAwLAotCU5VTEwsICZfaWZPdXRVY2FzdFBrdHNfb2JqCi19LAotX2lmT3V0RGlzY2FyZHNfb2JqID0gewotCSJpZk91dERpc2NhcmRzIiwgMTksIDAsCi0JTlVMTCwgJl9pZk91dE5VY2FzdFBrdHNfb2JqCi19LAotX2lmT3V0RXJyb3JzX29iaiA9IHsKLQkiaWZPdXRFcnJvcnMiLCAyMCwgMCwKLQlOVUxMLCAmX2lmT3V0RGlzY2FyZHNfb2JqCi19LAotX2lmT3V0UUxlbl9vYmogPSB7Ci0JImlmT3V0UUxlbiIsIDIxLCAwLAotCU5VTEwsICZfaWZPdXRFcnJvcnNfb2JqCi19LAotX2lmU3BlY2lmaWNfb2JqID0gewotCSJpZlNwZWNpZmljIiwgMjIsIDAsCi0JTlVMTCwgJl9pZk91dFFMZW5fb2JqCi19LAotX2lmRW50cnlfb2JqID0gewotCSJpZkVudHJ5IiwgMSwgMCwKLQkmX2lmU3BlY2lmaWNfb2JqLCBOVUxMCi19LAotX2lmTnVtYmVyX29iaiA9IHsKLQkiaWZOdW1iZXIiLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1faWZUYWJsZV9vYmogPSB7Ci0JImlmVGFibGUiLCAyLCAwLAotCSZfaWZFbnRyeV9vYmosICZfaWZOdW1iZXJfb2JqCi19LAotX3N5c0Rlc2NyX29iaiA9IHsKLQkic3lzRGVzY3IiLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1fc3lzT2JqZWN0SURfb2JqID0gewotCSJzeXNPYmplY3RJRCIsIDIsIDAsCi0JTlVMTCwgJl9zeXNEZXNjcl9vYmoKLX0sCi1fc3lzVXBUaW1lX29iaiA9IHsKLQkic3lzVXBUaW1lIiwgMywgMCwKLQlOVUxMLCAmX3N5c09iamVjdElEX29iagotfSwKLV9zeXNDb250YWN0X29iaiA9IHsKLQkic3lzQ29udGFjdCIsIDQsIDAsCi0JTlVMTCwgJl9zeXNVcFRpbWVfb2JqCi19LAotX3N5c05hbWVfb2JqID0gewotCSJzeXNOYW1lIiwgNSwgMCwKLQlOVUxMLCAmX3N5c0NvbnRhY3Rfb2JqCi19LAotX3N5c0xvY2F0aW9uX29iaiA9IHsKLQkic3lzTG9jYXRpb24iLCA2LCAwLAotCU5VTEwsICZfc3lzTmFtZV9vYmoKLX0sCi1fc3lzU2VydmljZXNfb2JqID0gewotCSJzeXNTZXJ2aWNlcyIsIDcsIDAsCi0JTlVMTCwgJl9zeXNMb2NhdGlvbl9vYmoKLX0sCi1fc3lzdGVtX29iaiA9IHsKLQkic3lzdGVtIiwgMSwgMCwKLQkmX3N5c1NlcnZpY2VzX29iaiwgTlVMTAotfSwKLV9pbnRlcmZhY2VzX29iaiA9IHsKLQkiaW50ZXJmYWNlcyIsIDIsIDAsCi0JJl9pZlRhYmxlX29iaiwgJl9zeXN0ZW1fb2JqCi19LAotX2F0X29iaiA9IHsKLQkiYXQiLCAzLCAwLAotCSZfYXRUYWJsZV9vYmosICZfaW50ZXJmYWNlc19vYmoKLX0sCi1faXBfb2JqID0gewotCSJpcCIsIDQsIDAsCi0JJl9pcE5ldFRvTWVkaWFUYWJsZV9vYmosICZfYXRfb2JqCi19LAotX2ljbXBfb2JqID0gewotCSJpY21wIiwgNSwgMCwKLQkmX2ljbXBPdXRBZGRyTWFza1JlcHNfb2JqLCAmX2lwX29iagotfSwKLV90Y3Bfb2JqID0gewotCSJ0Y3AiLCA2LCAwLAotCSZfdGNwT3V0UnN0c19vYmosICZfaWNtcF9vYmoKLX0sCi1fdWRwX29iaiA9IHsKLQkidWRwIiwgNywgMCwKLQkmX3VkcFRhYmxlX29iaiwgJl90Y3Bfb2JqCi19LAotX2VncF9vYmogPSB7Ci0JImVncCIsIDgsIDAsCi0JJl9lZ3BBc19vYmosICZfdWRwX29iagotfSwKLV90cmFuc21pc3Npb25fb2JqID0gewotCSJ0cmFuc21pc3Npb24iLCAxMCwgMCwKLQlOVUxMLCAmX2VncF9vYmoKLX0sCi1fc25tcF9vYmogPSB7Ci0JInNubXAiLCAxMSwgMCwKLQkmX3NubXBFbmFibGVBdXRoVHJhcHNfb2JqLCAmX3RyYW5zbWlzc2lvbl9vYmoKLX0sCi1fdXNtTUlCQ29tcGxpYW5jZXNfb2JqID0gewotCSJ1c21NSUJDb21wbGlhbmNlcyIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV91c21NSUJHcm91cHNfb2JqID0gewotCSJ1c21NSUJHcm91cHMiLCAyLCAwLAotCU5VTEwsICZfdXNtTUlCQ29tcGxpYW5jZXNfb2JqCi19LAotX3VzbVVzZXJFbmdpbmVJRF9vYmogPSB7Ci0JInVzbVVzZXJFbmdpbmVJRCIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV91c21Vc2VyTmFtZV9vYmogPSB7Ci0JInVzbVVzZXJOYW1lIiwgMiwgMCwKLQlOVUxMLCAmX3VzbVVzZXJFbmdpbmVJRF9vYmoKLX0sCi1fdXNtVXNlclNlY3VyaXR5TmFtZV9vYmogPSB7Ci0JInVzbVVzZXJTZWN1cml0eU5hbWUiLCAzLCAwLAotCU5VTEwsICZfdXNtVXNlck5hbWVfb2JqCi19LAotX3VzbVVzZXJDbG9uZUZyb21fb2JqID0gewotCSJ1c21Vc2VyQ2xvbmVGcm9tIiwgNCwgMCwKLQlOVUxMLCAmX3VzbVVzZXJTZWN1cml0eU5hbWVfb2JqCi19LAotX3VzbVVzZXJBdXRoUHJvdG9jb2xfb2JqID0gewotCSJ1c21Vc2VyQXV0aFByb3RvY29sIiwgNSwgMCwKLQlOVUxMLCAmX3VzbVVzZXJDbG9uZUZyb21fb2JqCi19LAotX3VzbVVzZXJBdXRoS2V5Q2hhbmdlX29iaiA9IHsKLQkidXNtVXNlckF1dGhLZXlDaGFuZ2UiLCA2LCAwLAotCU5VTEwsICZfdXNtVXNlckF1dGhQcm90b2NvbF9vYmoKLX0sCi1fdXNtVXNlck93bkF1dGhLZXlDaGFuZ2Vfb2JqID0gewotCSJ1c21Vc2VyT3duQXV0aEtleUNoYW5nZSIsIDcsIDAsCi0JTlVMTCwgJl91c21Vc2VyQXV0aEtleUNoYW5nZV9vYmoKLX0sCi1fdXNtVXNlclByaXZQcm90b2NvbF9vYmogPSB7Ci0JInVzbVVzZXJQcml2UHJvdG9jb2wiLCA4LCAwLAotCU5VTEwsICZfdXNtVXNlck93bkF1dGhLZXlDaGFuZ2Vfb2JqCi19LAotX3VzbVVzZXJQcml2S2V5Q2hhbmdlX29iaiA9IHsKLQkidXNtVXNlclByaXZLZXlDaGFuZ2UiLCA5LCAwLAotCU5VTEwsICZfdXNtVXNlclByaXZQcm90b2NvbF9vYmoKLX0sCi1fdXNtVXNlck93blByaXZLZXlDaGFuZ2Vfb2JqID0gewotCSJ1c21Vc2VyT3duUHJpdktleUNoYW5nZSIsIDEwLCAwLAotCU5VTEwsICZfdXNtVXNlclByaXZLZXlDaGFuZ2Vfb2JqCi19LAotX3VzbVVzZXJQdWJsaWNfb2JqID0gewotCSJ1c21Vc2VyUHVibGljIiwgMTEsIDAsCi0JTlVMTCwgJl91c21Vc2VyT3duUHJpdktleUNoYW5nZV9vYmoKLX0sCi1fdXNtVXNlclN0b3JhZ2VUeXBlX29iaiA9IHsKLQkidXNtVXNlclN0b3JhZ2VUeXBlIiwgMTIsIDAsCi0JTlVMTCwgJl91c21Vc2VyUHVibGljX29iagotfSwKLV91c21Vc2VyU3RhdHVzX29iaiA9IHsKLQkidXNtVXNlclN0YXR1cyIsIDEzLCAwLAotCU5VTEwsICZfdXNtVXNlclN0b3JhZ2VUeXBlX29iagotfSwKLV91c21Vc2VyRW50cnlfb2JqID0gewotCSJ1c21Vc2VyRW50cnkiLCAxLCAwLAotCSZfdXNtVXNlclN0YXR1c19vYmosIE5VTEwKLX0sCi1fdXNtVXNlclNwaW5Mb2NrX29iaiA9IHsKLQkidXNtVXNlclNwaW5Mb2NrIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX3VzbVVzZXJUYWJsZV9vYmogPSB7Ci0JInVzbVVzZXJUYWJsZSIsIDIsIDAsCi0JJl91c21Vc2VyRW50cnlfb2JqLCAmX3VzbVVzZXJTcGluTG9ja19vYmoKLX0sCi1fdXNtU3RhdHNVbnN1cHBvcnRlZFNlY0xldmVsc19vYmogPSB7Ci0JInVzbVN0YXRzVW5zdXBwb3J0ZWRTZWNMZXZlbHMiLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1fdXNtU3RhdHNOb3RJblRpbWVXaW5kb3dzX29iaiA9IHsKLQkidXNtU3RhdHNOb3RJblRpbWVXaW5kb3dzIiwgMiwgMCwKLQlOVUxMLCAmX3VzbVN0YXRzVW5zdXBwb3J0ZWRTZWNMZXZlbHNfb2JqCi19LAotX3VzbVN0YXRzVW5rbm93blVzZXJOYW1lc19vYmogPSB7Ci0JInVzbVN0YXRzVW5rbm93blVzZXJOYW1lcyIsIDMsIDAsCi0JTlVMTCwgJl91c21TdGF0c05vdEluVGltZVdpbmRvd3Nfb2JqCi19LAotX3VzbVN0YXRzVW5rbm93bkVuZ2luZUlEc19vYmogPSB7Ci0JInVzbVN0YXRzVW5rbm93bkVuZ2luZUlEcyIsIDQsIDAsCi0JTlVMTCwgJl91c21TdGF0c1Vua25vd25Vc2VyTmFtZXNfb2JqCi19LAotX3VzbVN0YXRzV3JvbmdEaWdlc3RzX29iaiA9IHsKLQkidXNtU3RhdHNXcm9uZ0RpZ2VzdHMiLCA1LCAwLAotCU5VTEwsICZfdXNtU3RhdHNVbmtub3duRW5naW5lSURzX29iagotfSwKLV91c21TdGF0c0RlY3J5cHRpb25FcnJvcnNfb2JqID0gewotCSJ1c21TdGF0c0RlY3J5cHRpb25FcnJvcnMiLCA2LCAwLAotCU5VTEwsICZfdXNtU3RhdHNXcm9uZ0RpZ2VzdHNfb2JqCi19LAotX3VzbVN0YXRzX29iaiA9IHsKLQkidXNtU3RhdHMiLCAxLCAwLAotCSZfdXNtU3RhdHNEZWNyeXB0aW9uRXJyb3JzX29iaiwgTlVMTAotfSwKLV91c21Vc2VyX29iaiA9IHsKLQkidXNtVXNlciIsIDIsIDAsCi0JJl91c21Vc2VyVGFibGVfb2JqLCAmX3VzbVN0YXRzX29iagotfSwKLV91c21NSUJPYmplY3RzX29iaiA9IHsKLQkidXNtTUlCT2JqZWN0cyIsIDEsIDAsCi0JJl91c21Vc2VyX29iaiwgTlVMTAotfSwKLV91c21NSUJDb25mb3JtYW5jZV9vYmogPSB7Ci0JInVzbU1JQkNvbmZvcm1hbmNlIiwgMiwgMCwKLQkmX3VzbU1JQkdyb3Vwc19vYmosICZfdXNtTUlCT2JqZWN0c19vYmoKLX0sCi1fc25tcE1QRE1JQkNvbXBsaWFuY2VzX29iaiA9IHsKLQkic25tcE1QRE1JQkNvbXBsaWFuY2VzIiwgMSwgMCwKLQlOVUxMLCBOVUxMCi19LAotX3NubXBNUERNSUJHcm91cHNfb2JqID0gewotCSJzbm1wTVBETUlCR3JvdXBzIiwgMiwgMCwKLQlOVUxMLCAmX3NubXBNUERNSUJDb21wbGlhbmNlc19vYmoKLX0sCi1fc25tcFVua25vd25TZWN1cml0eU1vZGVsc19vYmogPSB7Ci0JInNubXBVbmtub3duU2VjdXJpdHlNb2RlbHMiLCAxLCAwLAotCU5VTEwsIE5VTEwKLX0sCi1fc25tcEludmFsaWRNc2dzX29iaiA9IHsKLQkic25tcEludmFsaWRNc2dzIiwgMiwgMCwKLQlOVUxMLCAmX3NubXBVbmtub3duU2VjdXJpdHlNb2RlbHNfb2JqCi19LAotX3NubXBVbmtub3duUERVSGFuZGxlcnNfb2JqID0gewotCSJzbm1wVW5rbm93blBEVUhhbmRsZXJzIiwgMywgMCwKLQlOVUxMLCAmX3NubXBJbnZhbGlkTXNnc19vYmoKLX0sCi1fc25tcE1QRFN0YXRzX29iaiA9IHsKLQkic25tcE1QRFN0YXRzIiwgMSwgMCwKLQkmX3NubXBVbmtub3duUERVSGFuZGxlcnNfb2JqLCBOVUxMCi19LAotX3NubXBNUERBZG1pbl9vYmogPSB7Ci0JInNubXBNUERBZG1pbiIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9zbm1wTVBETUlCT2JqZWN0c19vYmogPSB7Ci0JInNubXBNUERNSUJPYmplY3RzIiwgMiwgMCwKLQkmX3NubXBNUERTdGF0c19vYmosICZfc25tcE1QREFkbWluX29iagotfSwKLV9zbm1wTVBETUlCQ29uZm9ybWFuY2Vfb2JqID0gewotCSJzbm1wTVBETUlCQ29uZm9ybWFuY2UiLCAzLCAwLAotCSZfc25tcE1QRE1JQkdyb3Vwc19vYmosICZfc25tcE1QRE1JQk9iamVjdHNfb2JqCi19LAotX3NubXBFbmdpbmVJRF9vYmogPSB7Ci0JInNubXBFbmdpbmVJRCIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9zbm1wRW5naW5lQm9vdHNfb2JqID0gewotCSJzbm1wRW5naW5lQm9vdHMiLCAyLCAwLAotCU5VTEwsICZfc25tcEVuZ2luZUlEX29iagotfSwKLV9zbm1wRW5naW5lVGltZV9vYmogPSB7Ci0JInNubXBFbmdpbmVUaW1lIiwgMywgMCwKLQlOVUxMLCAmX3NubXBFbmdpbmVCb290c19vYmoKLX0sCi1fc25tcEVuZ2luZU1heE1lc3NhZ2VTaXplX29iaiA9IHsKLQkic25tcEVuZ2luZU1heE1lc3NhZ2VTaXplIiwgNCwgMCwKLQlOVUxMLCAmX3NubXBFbmdpbmVUaW1lX29iagotfSwKLV9zbm1wRW5naW5lX29iaiA9IHsKLQkic25tcEVuZ2luZSIsIDEsIDAsCi0JJl9zbm1wRW5naW5lTWF4TWVzc2FnZVNpemVfb2JqLCBOVUxMCi19LAotX3NubXBGcmFtZXdvcmtBZG1pbl9vYmogPSB7Ci0JInNubXBGcmFtZXdvcmtBZG1pbiIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9zbm1wRnJhbWV3b3JrTUlCT2JqZWN0c19vYmogPSB7Ci0JInNubXBGcmFtZXdvcmtNSUJPYmplY3RzIiwgMiwgMCwKLQkmX3NubXBFbmdpbmVfb2JqLCAmX3NubXBGcmFtZXdvcmtBZG1pbl9vYmoKLX0sCi1fc25tcEZyYW1ld29ya01JQkNvbmZvcm1hbmNlX29iaiA9IHsKLQkic25tcEZyYW1ld29ya01JQkNvbmZvcm1hbmNlIiwgMywgMCwKLQlOVUxMLCAmX3NubXBGcmFtZXdvcmtNSUJPYmplY3RzX29iagotfSwKLV9zbm1wRnJhbWV3b3JrTUlCX29iaiA9IHsKLQkic25tcEZyYW1ld29ya01JQiIsIDEwLCAwLAotCSZfc25tcEZyYW1ld29ya01JQkNvbmZvcm1hbmNlX29iaiwgTlVMTAotfSwKLV9zbm1wTVBETUlCX29iaiA9IHsKLQkic25tcE1QRE1JQiIsIDExLCAwLAotCSZfc25tcE1QRE1JQkNvbmZvcm1hbmNlX29iaiwgJl9zbm1wRnJhbWV3b3JrTUlCX29iagotfSwKLV9zbm1wVXNtTUlCX29iaiA9IHsKLQkic25tcFVzbU1JQiIsIDE1LCAwLAotCSZfdXNtTUlCQ29uZm9ybWFuY2Vfb2JqLCAmX3NubXBNUERNSUJfb2JqCi19LAotX3NubXBNb2R1bGVzX29iaiA9IHsKLQkic25tcE1vZHVsZXMiLCAzLCAwLAotCSZfc25tcFVzbU1JQl9vYmosIE5VTEwKLX0sCi1fbWliX29iaiA9IHsKLQkibWliIiwgMSwgMCwKLQkmX3NubXBfb2JqLCBOVUxMCi19LAotX2RpcmVjdG9yeV9vYmogPSB7Ci0JImRpcmVjdG9yeSIsIDEsIDAsCi0JTlVMTCwgTlVMTAotfSwKLV9tZ210X29iaiA9IHsKLQkibWdtdCIsIDIsIDAsCi0JJl9taWJfb2JqLCAmX2RpcmVjdG9yeV9vYmoKLX0sCi1fZXhwZXJpbWVudGFsX29iaiA9IHsKLQkiZXhwZXJpbWVudGFsIiwgMywgMCwKLQlOVUxMLCAmX21nbXRfb2JqCi19LAotX3ByaXZhdGVfb2JqID0gewotCSJwcml2YXRlIiwgNCwgMCwKLQkmX2VudGVycHJpc2VzX29iaiwgJl9leHBlcmltZW50YWxfb2JqCi19LAotX3NlY3VyaXR5X29iaiA9IHsKLQkic2VjdXJpdHkiLCA1LCAwLAotCU5VTEwsICZfcHJpdmF0ZV9vYmoKLX0sCi1fc25tcFYyX29iaiA9IHsKLQkic25tcFYyIiwgNiwgMCwKLQkmX3NubXBNb2R1bGVzX29iaiwgJl9zZWN1cml0eV9vYmoKLX0sCi1faW50ZXJuZXRfb2JqID0gewotCSJpbnRlcm5ldCIsIDEsIDAsCi0JJl9zbm1wVjJfb2JqLCBOVUxMCi19LAotX2RvZF9vYmogPSB7Ci0JImRvZCIsIDYsIDAsCi0JJl9pbnRlcm5ldF9vYmosIE5VTEwKLX0sCi1fb3JnX29iaiA9IHsKLQkib3JnIiwgMywgMCwKLQkmX2RvZF9vYmosIE5VTEwKLX0sCi1faXNvX29iaiA9IHsKLQkiaXNvIiwgMSwgMCwKLQkmX29yZ19vYmosIE5VTEwKLX0sCi0qbWlicm9vdCA9ICZfaXNvX29iajsKZGlmZiAtLWdpdCBhL21pc3NpbmcvYWRkcmluZm8uaCBiL21pc3NpbmcvYWRkcmluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlmNmE0Mi4uMDAwMDAwMAotLS0gYS9taXNzaW5nL2FkZHJpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgYW5kIDE5OTkgV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogJElkOiBhZGRyaW5mby5oLHYgMS40IDIwMDIvMDYvMTEgMTc6MTM6MzYgaXRvanVuIEV4cCAkICovCi0KLSNpZm5kZWYgSEFWRV9BRERSSU5GTwotCi0vKgotICogRXJyb3IgcmV0dXJuIGNvZGVzIGZyb20gZ2V0YWRkcmluZm8oKQotICovCi0jZGVmaW5lCUVBSV9BRERSRkFNSUxZCSAxCS8qIGFkZHJlc3MgZmFtaWx5IGZvciBob3N0bmFtZSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVBSV9BR0FJTgkgMgkvKiB0ZW1wb3JhcnkgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KLSNkZWZpbmUJRUFJX0JBREZMQUdTCSAzCS8qIGludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzICovCi0jZGVmaW5lCUVBSV9GQUlMCSA0CS8qIG5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiAqLwotI2RlZmluZQlFQUlfRkFNSUxZCSA1CS8qIGFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkICovCi0jZGVmaW5lCUVBSV9NRU1PUlkJIDYJLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSAqLwotI2RlZmluZQlFQUlfTk9EQVRBCSA3CS8qIG5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lICovCi0jZGVmaW5lCUVBSV9OT05BTUUJIDgJLyogaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24gKi8KLSNkZWZpbmUJRUFJX1NFUlZJQ0UJIDkJLyogc2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUgKi8KLSNkZWZpbmUJRUFJX1NPQ0tUWVBFCTEwCS8qIGFpX3NvY2t0eXBlIG5vdCBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUJRUFJX1NZU1RFTQkxMQkvKiBzeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8gKi8KLSNkZWZpbmUgRUFJX0JBREhJTlRTCTEyCi0jZGVmaW5lIEVBSV9QUk9UT0NPTAkxMwotI2RlZmluZSBFQUlfTUFYCQkxNAotCi0vKiBpbnRlcm5hbCBlcnJvciAqLwotI2RlZmluZQlORVREQl9JTlRFUk5BTAktMQkvKiBzZWUgZXJybm8gKi8KLQotLyoKLSAqIEZsYWcgdmFsdWVzIGZvciBnZXRhZGRyaW5mbygpCi0gKi8KLSNkZWZpbmUJQUlfUEFTU0lWRQkweDAwMDAwMDAxIC8qIGdldCBhZGRyZXNzIHRvIHVzZSBiaW5kKCkgKi8KLSNkZWZpbmUJQUlfQ0FOT05OQU1FCTB4MDAwMDAwMDIgLyogZmlsbCBhaV9jYW5vbm5hbWUgKi8KLSNkZWZpbmUJQUlfTlVNRVJJQ0hPU1QJMHgwMDAwMDAwNCAvKiBwcmV2ZW50IG5hbWUgcmVzb2x1dGlvbiAqLwotLyogdmFsaWQgZmxhZ3MgZm9yIGFkZHJpbmZvICovCi0jZGVmaW5lCUFJX01BU0sJCShBSV9QQVNTSVZFIHwgQUlfQ0FOT05OQU1FIHwgQUlfTlVNRVJJQ0hPU1QpCi0KLSNkZWZpbmUJQUlfQUxMCQkweDAwMDAwMTAwIC8qIElQdjYgYW5kIElQdjQtbWFwcGVkICh3aXRoIEFJX1Y0TUFQUEVEKSAqLwotI2RlZmluZQlBSV9WNE1BUFBFRF9DRkcJMHgwMDAwMDIwMCAvKiBhY2NlcHQgSVB2NC1tYXBwZWQgaWYga2VybmVsIHN1cHBvcnRzICovCi0jZGVmaW5lCUFJX0FERFJDT05GSUcJMHgwMDAwMDQwMCAvKiBvbmx5IGlmIGFueSBhZGRyZXNzIGlzIGFzc2lnbmVkICovCi0jZGVmaW5lCUFJX1Y0TUFQUEVECTB4MDAwMDA4MDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIElQdjYgYWRkcmVzcyAqLwotLyogc3BlY2lhbCByZWNvbW1lbmRlZCBmbGFncyBmb3IgZ2V0aXBub2RlYnluYW1lICovCi0jZGVmaW5lCUFJX0RFRkFVTFQJKEFJX1Y0TUFQUEVEX0NGRyB8IEFJX0FERFJDT05GSUcpCi0KLXN0cnVjdCBhZGRyaW5mbyB7Ci0JaW50CWFpX2ZsYWdzOwkvKiBBSV9QQVNTSVZFLCBBSV9DQU5PTk5BTUUgKi8KLQlpbnQJYWlfZmFtaWx5OwkvKiBQRl94eHggKi8KLQlpbnQJYWlfc29ja3R5cGU7CS8qIFNPQ0tfeHh4ICovCi0JaW50CWFpX3Byb3RvY29sOwkvKiAwIG9yIElQUFJPVE9feHh4IGZvciBJUHY0IGFuZCBJUHY2ICovCi0Jc2l6ZV90CWFpX2FkZHJsZW47CS8qIGxlbmd0aCBvZiBhaV9hZGRyICovCi0JY2hhcgkqYWlfY2Fub25uYW1lOwkvKiBjYW5vbmljYWwgbmFtZSBmb3IgaG9zdG5hbWUgKi8KLQlzdHJ1Y3Qgc29ja2FkZHIgKmFpX2FkZHI7CS8qIGJpbmFyeSBhZGRyZXNzICovCi0Jc3RydWN0IGFkZHJpbmZvICphaV9uZXh0OwkvKiBuZXh0IHN0cnVjdHVyZSBpbiBsaW5rZWQgbGlzdCAqLwotfTsKLQotZXh0ZXJuIHZvaWQgZnJlZWFkZHJpbmZvIChzdHJ1Y3QgYWRkcmluZm8gKik7Ci1leHRlcm4gdm9pZCBmcmVlaG9zdGVudCAoc3RydWN0IGhvc3RlbnQgKik7Ci1leHRlcm4gY2hhciAqZ2FpX3N0cmVycm9yIChpbnQpOwotZXh0ZXJuIGludCBnZXRhZGRyaW5mbyAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIHN0cnVjdCBhZGRyaW5mbyAqKik7Ci1leHRlcm4gaW50IGdldG5hbWVpbmZvIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKiwgc2l6ZV90LCBjaGFyICosCi0JCQkgICAgc2l6ZV90LCBjaGFyICosIHNpemVfdCwgaW50KTsKLWV4dGVybiBzdHJ1Y3QgaG9zdGVudCAqZ2V0aXBub2RlYnlhZGRyIChjb25zdCB2b2lkICosIHNpemVfdCwgaW50LCBpbnQgKik7Ci1leHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGlwbm9kZWJ5bmFtZSAoY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50ICopOwotZXh0ZXJuIGludCBpbmV0X3B0b24gKGludCwgY29uc3QgY2hhciAqLCB2b2lkICopOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmluZXRfbnRvcCAoaW50LCBjb25zdCB2b2lkICosIGNoYXIgKiwgc2l6ZV90KTsKLSNlbmRpZiAvKiBIQVZFX0FERFJJTkZPICovCi0KLS8qCi0gKiBDb25zdGFudHMgZm9yIGdldG5hbWVpbmZvKCkKLSAqLwotI2lmbmRlZiBOSV9NQVhIT1NUCi0jZGVmaW5lCU5JX01BWEhPU1QJMTAyNQotI2VuZGlmCi0jaWZuZGVmIE5JX01BWFNFUlYKLSNkZWZpbmUJTklfTUFYU0VSVgkzMgotI2VuZGlmCi0KLS8qCi0gKiBGbGFnIHZhbHVlcyBmb3IgZ2V0bmFtZWluZm8oKQotICovCi0jaWZuZGVmIE5JX05PRlFETgotI2RlZmluZQlOSV9OT0ZRRE4JMHgwMDAwMDAwMQotI2VuZGlmCi0jaWZuZGVmIE5JX05VTUVSSUNIT1NUCi0jZGVmaW5lCU5JX05VTUVSSUNIT1NUCTB4MDAwMDAwMDIKLSNlbmRpZgotI2lmbmRlZiBOSV9OQU1FUkVRRAotI2RlZmluZQlOSV9OQU1FUkVRRAkweDAwMDAwMDA0Ci0jZW5kaWYKLSNpZm5kZWYgTklfTlVNRVJJQ1NFUlYKLSNkZWZpbmUJTklfTlVNRVJJQ1NFUlYJMHgwMDAwMDAwOAotI2VuZGlmCi0jaWZuZGVmIE5JX0RHUkFNCi0jZGVmaW5lCU5JX0RHUkFNCTB4MDAwMDAwMTAKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWlzc2luZy9hZGRyc2l6ZS5oIGIvbWlzc2luZy9hZGRyc2l6ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2RiNGRhLi4wMDAwMDAwCi0tLSBhL21pc3NpbmcvYWRkcnNpemUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgSU5BRERSU1oKLSNkZWZpbmUgSU5BRERSU1ogNAkJLyogSVB2NCBUX0EgKi8KLSNlbmRpZgotCi0jaWZuZGVmIElONkFERFJTWgotI2RlZmluZSBJTjZBRERSU1oJMTYJLyogSVB2NiBUX0FBQUEgKi8KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9taXNzaW5nL2JpdHR5cGVzLmggYi9taXNzaW5nL2JpdHR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDEzYWUuLjAwMDAwMDAKLS0tIGEvbWlzc2luZy9iaXR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgSEFWRV9VX0lOVDhfVAotCi0jaWYgU0laRU9GX0NIQVIgPT0gMQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVfaW50OF90OwotI2VsaWYgU0laRU9GX0lOVCA9PSAxCi10eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDhfdDsKLSNlbHNlICAvKiBYWFggKi8KLSNlcnJvciAidGhlcmUncyBubyBhcHByb3ByaWF0ZSB0eXBlIGZvciB1X2ludDhfdCIKLSNlbmRpZgotCi0jZW5kaWYgLyogSEFWRV9VX0lOVDhfVCAqLwotCi0jaWZuZGVmIEhBVkVfVV9JTlQxNl9UCi0KLSNpZiBTSVpFT0ZfU0hPUlQgPT0gMgotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDE2X3Q7Ci0jZWxpZiBTSVpFT0ZfSU5UID09IDIKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MTZfdDsKLSNlbGlmIFNJWkVPRl9DSEFSID09IDIKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB1X2ludDE2X3Q7Ci0jZWxzZSAgLyogWFhYICovCi0jZXJyb3IgInRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdV9pbnQxNl90IgotI2VuZGlmCi0KLSNlbmRpZiAvKiBIQVZFX1VfSU5UMTZfVCAqLwotCi0jaWZuZGVmIEhBVkVfVV9JTlQzMl9UCi0KLSNpZiBTSVpFT0ZfSU5UID09IDQKLXR5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MzJfdDsKLSNlbGlmIFNJWkVPRl9MT05HID09IDQKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyB1X2ludDMyX3Q7Ci0jZWxpZiBTSVpFT0ZfU0hPUlQgPT0gNAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDMyX3Q7Ci0jZWxzZSAgLyogWFhYICovCi0jZXJyb3IgInRoZXJlJ3Mgbm8gYXBwcm9wcmlhdGUgdHlwZSBmb3IgdV9pbnQzMl90IgotI2VuZGlmCi0KLSNlbmRpZiAvKiBIQVZFX1VfSU5UMzJfVCAqLwotCi0jaWZuZGVmIEhBVkVfVV9JTlQ2NF9UCi0KLSNpZiBTSVpFT0ZfTE9OR19MT05HID09IDgKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfaW50NjRfdDsKLSNlbGlmIGRlZmluZWQoX01TQ19FWFRFTlNJT05TKQotdHlwZWRlZiB1bnNpZ25lZCBfaW50NjQgdV9pbnQ2NF90OwotI2VsaWYgU0laRU9GX0lOVCA9PSA4Ci10eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDY0X3Q7Ci0jZWxpZiBTSVpFT0ZfTE9ORyA9PSA4Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgdV9pbnQ2NF90OwotI2VsaWYgU0laRU9GX1NIT1JUID09IDgKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdV9pbnQ2NF90OwotI2Vsc2UgIC8qIFhYWCAqLwotI2Vycm9yICJ0aGVyZSdzIG5vIGFwcHJvcHJpYXRlIHR5cGUgZm9yIHVfaW50NjRfdCIKLSNlbmRpZgotCi0jZW5kaWYgLyogSEFWRV9VX0lOVDY0X1QgKi8KLQotI2lmbmRlZiBQUklkNjQKLSNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKLSNkZWZpbmUgUFJJZDY0CSJJNjRkIgotI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCi0jZGVmaW5lIFBSSWQ2NAkibGxkIgotI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLwotI2VuZGlmIC8qIFBSSWQ2NCAqLwotCi0jaWZuZGVmIFBSSW82NAotI2lmZGVmIF9NU0NfRVhURU5TSU9OUwotI2RlZmluZSBQUklvNjQJIkk2NG8iCi0jZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KLSNkZWZpbmUgUFJJbzY0CSJsbG8iCi0jZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCi0jZW5kaWYgLyogUFJJbzY0ICovCi0KLSNpZm5kZWYgUFJJeDY0Ci0jaWZkZWYgX01TQ19FWFRFTlNJT05TCi0jZGVmaW5lIFBSSXg2NAkiSTY0eCIKLSNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLwotI2RlZmluZSBQUkl4NjQJImxseCIKLSNlbmRpZiAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KLSNlbmRpZiAvKiBQUkl4NjQgKi8KLQotI2lmbmRlZiBQUkl1NjQKLSNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKLSNkZWZpbmUgUFJJdTY0CSJJNjR1IgotI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCi0jZGVmaW5lIFBSSXU2NAkibGx1IgotI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLwotI2VuZGlmIC8qIFBSSXU2NCAqLwpkaWZmIC0tZ2l0IGEvbWlzc2luZy9kYXRhbGlua3MuYyBiL21pc3NpbmcvZGF0YWxpbmtzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzEyNjcuLjAwMDAwMDAKLS0tIGEvbWlzc2luZy9kYXRhbGlua3MuYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCi0gKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKLSAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL2RhdGFsaW5rcy5jLHYgMS4zIDIwMDMvMTEvMTYgMDk6MzY6NDcgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJwY2FwLW1pc3NpbmcuaCIKLQotLyoKLSAqIFN0dWIgdmVyc2lvbnMgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KLSAqLwotaW50Ci1wY2FwX2xpc3RfZGF0YWxpbmtzKHBjYXBfdCAqcCwgaW50ICoqZGx0X2J1ZmZlcikKLXsKLQkvKgotCSAqIFRoaXMgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IGNoYW5naW5nIHRoZSBETFQgZm9yIGFuCi0JICogaW50ZXJmYWNlLiAgUmV0dXJuIGEgbGlzdCBvZiBETFRzIGNvbnRhaW5pbmcgb25seSB0aGUKLQkgKiBETFQgdGhpcyBkZXZpY2Ugc3VwcG9ydHMuCi0JICovCi0JKmRsdF9idWZmZXIgPSAoaW50KiltYWxsb2Moc2l6ZW9mKCoqZGx0X2J1ZmZlcikpOwotCWlmICgqZGx0X2J1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gKC0xKTsKLQkqKmRsdF9idWZmZXIgPSBwY2FwX2RhdGFsaW5rKHApOwotCXJldHVybiAoMSk7Ci19CmRpZmYgLS1naXQgYS9taXNzaW5nL2RsbmFtZXMuYyBiL21pc3NpbmcvZGxuYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY1ODNlLi4wMDAwMDAwCi0tLSBhL21pc3NpbmcvZGxuYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCi0gKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKLSAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL2RsbmFtZXMuYyx2IDEuNSAyMDAzLzExLzE4IDIzOjA5OjQzIGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHBjYXAuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgInBjYXAtbWlzc2luZy5oIgotCi1zdHJ1Y3QgZGx0X2Nob2ljZSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKLQlpbnQJZGx0OwotfTsKLQotI2RlZmluZSBETFRfQ0hPSUNFKGNvZGUsIGRlc2NyaXB0aW9uKSB7ICNjb2RlLCBkZXNjcmlwdGlvbiwgY29kZSB9Ci0jZGVmaW5lIERMVF9DSE9JQ0VfU0VOVElORUwgeyBOVUxMLCBOVUxMLCAwIH0KLQotc3RhdGljIHN0cnVjdCBkbHRfY2hvaWNlIGRsdF9jaG9pY2VzW10gPSB7Ci0JRExUX0NIT0lDRShETFRfTlVMTCwgIkJTRCBsb29wYmFjayIpLAotCURMVF9DSE9JQ0UoRExUX0VOMTBNQiwgIkV0aGVybmV0IiksCi0JRExUX0NIT0lDRShETFRfSUVFRTgwMiwgIlRva2VuIHJpbmciKSwKLQlETFRfQ0hPSUNFKERMVF9BUkNORVQsICJBUkNORVQiKSwKLQlETFRfQ0hPSUNFKERMVF9TTElQLCAiU0xJUCIpLAotCURMVF9DSE9JQ0UoRExUX1BQUCwgIlBQUCIpLAotCURMVF9DSE9JQ0UoRExUX0ZEREksICJGRERJIiksCi0JRExUX0NIT0lDRShETFRfQVRNX1JGQzE0ODMsICJSRkMgMTQ4MyBJUC1vdmVyLUFUTSIpLAotCURMVF9DSE9JQ0UoRExUX1JBVywgIlJhdyBJUCIpLAotI2lmZGVmIERMVF9TTElQX0JTRE9TCi0JRExUX0NIT0lDRShETFRfU0xJUF9CU0RPUywgIkJTRC9PUyBTTElQIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfUFBQX0JTRE9TCi0JRExUX0NIT0lDRShETFRfUFBQX0JTRE9TLCAiQlNEL09TIFBQUCIpLAotI2VuZGlmCi0jaWZkZWYgRExUX0FUTV9DTElQCi0JRExUX0NIT0lDRShETFRfQVRNX0NMSVAsICJMaW51eCBDbGFzc2ljYWwgSVAtb3Zlci1BVE0iKSwKLSNlbmRpZgotI2lmZGVmIERMVF9QUFBfU0VSSUFMCi0JRExUX0NIT0lDRShETFRfUFBQX1NFUklBTCwgIlBQUCBvdmVyIHNlcmlhbCIpLAotI2VuZGlmCi0jaWZkZWYgRExUX1BQUF9FVEhFUgotCURMVF9DSE9JQ0UoRExUX1BQUF9FVEhFUiwgIlBQUG9FIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfQ19IRExDCi0JRExUX0NIT0lDRShETFRfQ19IRExDLCAiQ2lzY28gSERMQyIpLAotI2VuZGlmCi0jaWZkZWYgRExUX0lFRUU4MDJfMTEKLQlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExLCAiODAyLjExIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfRlJFTEFZCi0JRExUX0NIT0lDRShETFRfRlJFTEFZLCAiRnJhbWUgUmVsYXkiKSwKLSNlbmRpZgotI2lmZGVmIERMVF9MT09QCi0JRExUX0NIT0lDRShETFRfTE9PUCwgIk9wZW5CU0QgbG9vcGJhY2siKSwKLSNlbmRpZgotI2lmZGVmIERMVF9FTkMKLQlETFRfQ0hPSUNFKERMVF9FTkMsICJPcGVuQlNEIGVuY2Fwc3VsYXRlZCBJUCIpLAotI2VuZGlmCi0jaWZkZWYgRExUX0xJTlVYX1NMTAotCURMVF9DSE9JQ0UoRExUX0xJTlVYX1NMTCwgIkxpbnV4IGNvb2tlZCIpLAotI2VuZGlmCi0jaWZkZWYgRExUX0xUQUxLCi0JRExUX0NIT0lDRShETFRfTFRBTEssICJMb2NhbHRhbGsiKSwKLSNlbmRpZgotI2lmZGVmIERMVF9QRkxPRwotCURMVF9DSE9JQ0UoRExUX1BGTE9HLCAiT3BlbkJTRCBwZmxvZyBmaWxlIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfUFJJU01fSEVBREVSCi0JRExUX0NIT0lDRShETFRfUFJJU01fSEVBREVSLCAiODAyLjExIHBsdXMgUHJpc20gaGVhZGVyIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfSVBfT1ZFUl9GQwotCURMVF9DSE9JQ0UoRExUX0lQX09WRVJfRkMsICJSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwiKSwKLSNlbmRpZgotI2lmZGVmIERMVF9TVU5BVE0KLQlETFRfQ0hPSUNFKERMVF9TVU5BVE0sICJTdW4gcmF3IEFUTSIpLAotI2VuZGlmCi0jaWZkZWYgRExUX0lFRUU4MDJfMTFfUkFESU8KLQlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExX1JBRElPLCAiODAyLjExIHBsdXMgcmFkaW8gaW5mb3JtYXRpb24gaGVhZGVyIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfQVJDTkVUX0xJTlVYCi0JRExUX0NIT0lDRShETFRfQVJDTkVUX0xJTlVYLCAiTGludXggQVJDTkVUIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfTElOVVhfSVJEQQotCURMVF9DSE9JQ0UoRExUX0xJTlVYX0lSREEsICJMaW51eCBJckRBIiksCi0jZW5kaWYKLSNpZmRlZiBETFRfTEFORTgwMjMKLQlETFRfQ0hPSUNFKERMVF9MQU5FODAyMywgIkxpbnV4IDgwMi4zIExBTkUiKSwKLSNlbmRpZgotI2lmZGVmIERMVF9DSVAKLQlETFRfQ0hPSUNFKERMVF9DSVAsICJMaW51eCBDbGFzc2ljYWwgSVAtb3Zlci1BVE0iKSwKLSNlbmRpZgotI2lmZGVmIERMVF9IRExDCi0JRExUX0NIT0lDRShETFRfSERMQywgIkNpc2NvIEhETEMiKSwKLSNlbmRpZgotCURMVF9DSE9JQ0VfU0VOVElORUwKLX07Ci0KLSNpZm5kZWYgSEFWRV9QQ0FQX0RBVEFMSU5LX05BTUVfVE9fVkFMCi1pbnQKLXBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGRsdF9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCWlmIChzdHJjYXNlY21wKGRsdF9jaG9pY2VzW2ldLm5hbWUgKyBzaXplb2YoIkRMVF8iKSAtIDEsCi0JCSAgICBuYW1lKSA9PSAwKQotCQkJcmV0dXJuIChkbHRfY2hvaWNlc1tpXS5kbHQpOwotCX0KLQlyZXR1cm4gKC0xKTsKLX0KLQotY29uc3QgY2hhciAqCi1wY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKGludCBkbHQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBkbHRfY2hvaWNlc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgewotCQlpZiAoZGx0X2Nob2ljZXNbaV0uZGx0ID09IGRsdCkKLQkJCXJldHVybiAoZGx0X2Nob2ljZXNbaV0ubmFtZSArIHNpemVvZigiRExUXyIpIC0gMSk7Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0jZW5kaWYKLQotY29uc3QgY2hhciAqCi1wY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihpbnQgZGx0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgZGx0X2Nob2ljZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLQkJaWYgKGRsdF9jaG9pY2VzW2ldLmRsdCA9PSBkbHQpCi0JCQlyZXR1cm4gKGRsdF9jaG9pY2VzW2ldLmRlc2NyaXB0aW9uKTsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL21pc3NpbmcvZ2V0YWRkcmluZm8uYyBiL21pc3NpbmcvZ2V0YWRkcmluZm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzMDMyMi4uMDAwMDAwMAotLS0gYS9taXNzaW5nL2dldGFkZHJpbmZvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiAiI2lmZGVmIEZBSVRIIiBwYXJ0IGlzIGxvY2FsIGhhY2sgZm9yIHN1cHBvcnRpbmcgSVB2NC12NiB0cmFuc2xhdG9yLgotICoKLSAqIElzc3VlcyB0byBiZSBkaXNjdXNzZWQ6Ci0gKiAtIFRocmVhZCBzYWZlLW5lc3MgbXVzdCBiZSBjaGVja2VkLgotICogLSBSZXR1cm4gdmFsdWVzLiAgVGhlcmUgYXJlIG5vbnN0YW5kYXJkIHJldHVybiB2YWx1ZXMgZGVmaW5lZCBhbmQgdXNlZAotICogICBpbiB0aGUgc291cmNlIGNvZGUuICBUaGlzIGlzIGJlY2F1c2UgUkZDMjU1MyBpcyBzaWxlbnQgYWJvdXQgd2hpY2ggZXJyb3IKLSAqICAgY29kZSBtdXN0IGJlIHJldHVybmVkIGZvciB3aGljaCBzaXR1YXRpb24uCi0gKiBOb3RlOgotICogLSBXZSB1c2UgZ2V0aXBub2RlYnluYW1lKCkganVzdCBmb3IgdGhyZWFkLXNhZmVuZXNzLiAgVGhlcmUncyBubyBpbnRlbnQKLSAqICAgdG8gbGV0IGl0IGRvIFBGX1VOU1BFQyAoYWN0dWFsbHkgd2UgbmV2ZXIgcGFzcyBQRl9VTlNQRUMgdG8KLSAqICAgZ2V0aXBub2RlYnluYW1lKCkuCi0gKiAtIFRoZSBjb2RlIGZpbHRlcnMgb3V0IEFGcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwsCi0gKiAgIHdoZW4gZ2xvYmJpbmcgTlVMTCBob3N0bmFtZSAodG8gbG9vcGJhY2ssIG9yIHdpbGRjYXJkKS4gIElzIGl0IHRoZSByaWdodAotICogICB0aGluZyB0byBkbz8gIFdoYXQgaXMgdGhlIHJlbGF0aW9uc2hpcCB3aXRoIHBvc3QtUkZDMjU1MyBBSV9BRERSQ09ORklHCi0gKiAgIGluIGFpX2ZsYWdzPwotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3NpbmcvZ2V0YWRkcmluZm8uYyx2IDEuMTMgMjAwMy8xMS8xNiAwOTozNjo0OCBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpZiAwCi0jaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLSNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2luY2x1ZGUgPHJlc29sdi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZuZGVmIEhBVkVfVV9JTlQzMl9UCi0jaW5jbHVkZSAiYml0dHlwZXMuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQotI2luY2x1ZGUgInNvY2tzdG9yYWdlLmgiCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfQUREUklORk9fSAotI2luY2x1ZGUgImFkZHJpbmZvLmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19LQU1FX18pICYmIGRlZmluZWQoSU5FVDYpCi0jIGRlZmluZSBGQUlUSAotI2VuZGlmCi0KLSNkZWZpbmUgU1VDQ0VTUyAwCi0jZGVmaW5lIEFOWSAwCi0jZGVmaW5lIFlFUyAxCi0jZGVmaW5lIE5PICAwCi0KLSNpZmRlZiBGQUlUSAotc3RhdGljIGludCB0cmFuc2xhdGUgPSBOTzsKLXN0YXRpYyBzdHJ1Y3QgaW42X2FkZHIgZmFpdGhfcHJlZml4ID0gSU42QUREUl9BTllfSU5JVDsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciBpbl9hZGRyYW55W10gPSB7IDAsIDAsIDAsIDAgfTsKLXN0YXRpYyBjb25zdCBjaGFyIGluNl9hZGRyYW55W10gPSB7Ci0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLXN0YXRpYyBjb25zdCBjaGFyIGluX2xvb3BiYWNrW10gPSB7IDEyNywgMCwgMCwgMSB9Owotc3RhdGljIGNvbnN0IGNoYXIgaW42X2xvb3BiYWNrW10gPSB7Ci0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMQotfTsKLQotc3RydWN0IHNvY2tpbmV0IHsKLQl1X2NoYXIJc2lfbGVuOwotCXVfY2hhcglzaV9mYW1pbHk7Ci0JdV9zaG9ydAlzaV9wb3J0OwotCXVfaW50MzJfdCBzaV9zY29wZV9pZDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWZkIHsKLQlpbnQgYV9hZjsKLQlpbnQgYV9hZGRybGVuOwotCWludCBhX3NvY2tsZW47Ci0JaW50IGFfb2ZmOwotCWNvbnN0IGNoYXIgKmFfYWRkcmFueTsKLQljb25zdCBjaGFyICphX2xvb3BiYWNrOwotCWludCBhX3Njb3BlZDsKLX0gYWZkbCBbXSA9IHsKLSNpZmRlZiBJTkVUNgotCXtQRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKLQkgb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luNiwgc2luNl9hZGRyKSwKLQkgaW42X2FkZHJhbnksIGluNl9sb29wYmFjaywgMX0sCi0jZW5kaWYKLQl7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKLQkgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCi0JIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpLAotCSBpbl9hZGRyYW55LCBpbl9sb29wYmFjaywgMH0sCi0JezAsIDAsIDAsIDAsIE5VTEwsIE5VTEwsIDB9LAotfTsKLQotc3RydWN0IGV4cGxvcmUgewotCWludCBlX2FmOwotCWludCBlX3NvY2t0eXBlOwotCWludCBlX3Byb3RvY29sOwotCWNvbnN0IGNoYXIgKmVfcHJvdG9zdHI7Ci0JaW50IGVfd2lsZDsKLSNkZWZpbmUgV0lMRF9BRihleCkJCSgoZXgpLT5lX3dpbGQgJiAweDAxKQotI2RlZmluZSBXSUxEX1NPQ0tUWVBFKGV4KQkoKGV4KS0+ZV93aWxkICYgMHgwMikKLSNkZWZpbmUgV0lMRF9QUk9UT0NPTChleCkJKChleCktPmVfd2lsZCAmIDB4MDQpCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGV4cGxvcmUgZXhwbG9yZVtdID0gewotI2lmIDAKLQl7IFBGX0xPQ0FMLCAwLCBBTlksIEFOWSwgTlVMTCwgMHgwMSB9LAotI2VuZGlmCi0jaWZkZWYgSU5FVDYKLQl7IFBGX0lORVQ2LCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgInVkcCIsIDB4MDcgfSwKLQl7IFBGX0lORVQ2LCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsICJ0Y3AiLCAweDA3IH0sCi0JeyBQRl9JTkVUNiwgU09DS19SQVcsIEFOWSwgTlVMTCwgMHgwNSB9LAotI2VuZGlmCi0JeyBQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCwgInVkcCIsIDB4MDcgfSwKLQl7IFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgInRjcCIsIDB4MDcgfSwKLQl7IFBGX0lORVQsIFNPQ0tfUkFXLCBBTlksIE5VTEwsIDB4MDUgfSwKLQl7IC0xLCAwLCAwLCBOVUxMLCAwIH0sCi19OwotCi0jaWZkZWYgSU5FVDYKLSNkZWZpbmUgUFRPTl9NQVgJMTYKLSNlbHNlCi0jZGVmaW5lIFBUT05fTUFYCTQKLSNlbmRpZgotCi0KLXN0YXRpYyBpbnQgc3RyX2lzbnVtYmVyIChjb25zdCBjaGFyICopOwotc3RhdGljIGludCBleHBsb3JlX2ZxZG4gKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCi0JY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOwotc3RhdGljIGludCBleHBsb3JlX251bGwgKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCi0JY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOwotc3RhdGljIGludCBleHBsb3JlX251bWVyaWMgKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCi0JY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOwotc3RhdGljIGludCBleHBsb3JlX251bWVyaWNfc2NvcGUgKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCi0JY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOwotc3RhdGljIGludCBnZXRfbmFtZSAoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgYWZkICosIHN0cnVjdCBhZGRyaW5mbyAqKiwKLQljaGFyICosIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGludCBnZXRfY2Fub25uYW1lIChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwKLQlzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKmdldF9haSAoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosCi0JY29uc3Qgc3RydWN0IGFmZCAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGludCBnZXRfcG9ydG1hdGNoIChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbnQgZ2V0X3BvcnQgKHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosIGludCk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGFmZCAqZmluZF9hZmQgKGludCk7Ci0KLXN0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7Ci0JIlN1Y2Nlc3MiLAotCSJBZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCIsCS8qIEVBSV9BRERSRkFNSUxZICovCi0JIlRlbXBvcmFyeSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsCQkvKiBFQUlfQUdBSU4gICAgICAqLwotCSJJbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyIsCQkgICAgICAgCS8qIEVBSV9CQURGTEFHUyAgICovCi0JIk5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsIAkvKiBFQUlfRkFJTCAgICAgICAqLwotCSJhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCIsCQkJLyogRUFJX0ZBTUlMWSAgICAgKi8KLQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIsIAkJCS8qIEVBSV9NRU1PUlkgICAgICovCi0JIk5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lIiwgCQkvKiBFQUlfTk9EQVRBICAgICAqLwotCSJob3N0bmFtZSBub3Igc2Vydm5hbWUgcHJvdmlkZWQsIG9yIG5vdCBrbm93biIsCS8qIEVBSV9OT05BTUUgICAgICovCi0JInNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlIiwJLyogRUFJX1NFUlZJQ0UgICAgKi8KLQkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCIsIAkJCS8qIEVBSV9TT0NLVFlQRSAgICovCi0JIlN5c3RlbSBlcnJvciByZXR1cm5lZCBpbiBlcnJubyIsIAkJLyogRUFJX1NZU1RFTSAgICAgKi8KLQkiSW52YWxpZCB2YWx1ZSBmb3IgaGludHMiLAkJCS8qIEVBSV9CQURISU5UUwkgICovCi0JIlJlc29sdmVkIHByb3RvY29sIGlzIHVua25vd24iLAkJCS8qIEVBSV9QUk9UT0NPTCAgICovCi0JIlVua25vd24gZXJyb3IiLCAJCQkJLyogRUFJX01BWCAgICAgICAgKi8KLX07Ci0KLS8qIFhYWCBtYWNyb3MgdGhhdCBtYWtlIGV4dGVybmFsIHJlZmVyZW5jZSBpcyBCQUQuICovCi0KLSNkZWZpbmUgR0VUX0FJKGFpLCBhZmQsIGFkZHIpIFwKLWRvIHsgXAotCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogcGFpLCBlcnJvciwgYW5kIGxhYmVsIGZyZWUgKi8gXAotCShhaSkgPSBnZXRfYWkocGFpLCAoYWZkKSwgKGFkZHIpKTsgXAotCWlmICgoYWkpID09IE5VTEwpIHsgXAotCQllcnJvciA9IEVBSV9NRU1PUlk7IFwKLQkJZ290byBmcmVlOyBcCi0JfSBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEdFVF9QT1JUKGFpLCBzZXJ2KSBcCi1kbyB7IFwKLQkvKiBleHRlcm5hbCByZWZlcmVuY2U6IGVycm9yIGFuZCBsYWJlbCBmcmVlICovIFwKLQllcnJvciA9IGdldF9wb3J0KChhaSksIChzZXJ2KSwgMCk7IFwKLQlpZiAoZXJyb3IgIT0gMCkgXAotCQlnb3RvIGZyZWU7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgR0VUX0NBTk9OTkFNRShhaSwgc3RyKSBcCi1kbyB7IFwKLQkvKiBleHRlcm5hbCByZWZlcmVuY2U6IHBhaSwgZXJyb3IgYW5kIGxhYmVsIGZyZWUgKi8gXAotCWVycm9yID0gZ2V0X2Nhbm9ubmFtZShwYWksIChhaSksIChzdHIpKTsgXAotCWlmIChlcnJvciAhPSAwKSBcCi0JCWdvdG8gZnJlZTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBFUlIoZXJyKSBcCi1kbyB7IFwKLQkvKiBleHRlcm5hbCByZWZlcmVuY2U6IGVycm9yLCBhbmQgbGFiZWwgYmFkICovIFwKLQllcnJvciA9IChlcnIpOyBcCi0JZ290byBiYWQ7IFwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTUFUQ0hfRkFNSUxZKHgsIHksIHcpIFwKLQkoKHgpID09ICh5KSB8fCAoKHcpICYmICgoeCkgPT0gUEZfVU5TUEVDIHx8ICh5KSA9PSBQRl9VTlNQRUMpKSkKLSNkZWZpbmUgTUFUQ0goeCwgeSwgdykgXAotCSgoeCkgPT0gKHkpIHx8ICgodykgJiYgKCh4KSA9PSBBTlkgfHwgKHkpID09IEFOWSkpKQotCi1jaGFyICoKLWdhaV9zdHJlcnJvcihlY29kZSkKLQlpbnQgZWNvZGU7Ci17Ci0JaWYgKGVjb2RlIDwgMCB8fCBlY29kZSA+IEVBSV9NQVgpCi0JCWVjb2RlID0gRUFJX01BWDsKLQlyZXR1cm4gYWlfZXJybGlzdFtlY29kZV07Ci19Ci0KLXZvaWQKLWZyZWVhZGRyaW5mbyhhaSkKLQlzdHJ1Y3QgYWRkcmluZm8gKmFpOwotewotCXN0cnVjdCBhZGRyaW5mbyAqbmV4dDsKLQotCWRvIHsKLQkJbmV4dCA9IGFpLT5haV9uZXh0OwotCQlpZiAoYWktPmFpX2Nhbm9ubmFtZSkKLQkJCWZyZWUoYWktPmFpX2Nhbm9ubmFtZSk7Ci0JCS8qIG5vIG5lZWQgdG8gZnJlZShhaS0+YWlfYWRkcikgKi8KLQkJZnJlZShhaSk7Ci0JfSB3aGlsZSAoKGFpID0gbmV4dCkgIT0gTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0cl9pc251bWJlcihwKQotCWNvbnN0IGNoYXIgKnA7Ci17Ci0JY2hhciAqcSA9IChjaGFyICopcDsKLQl3aGlsZSAoKnEpIHsKLQkJaWYgKCEgaXNkaWdpdCgqcSkpCi0JCQlyZXR1cm4gTk87Ci0JCXErKzsKLQl9Ci0JcmV0dXJuIFlFUzsKLX0KLQotaW50Ci1nZXRhZGRyaW5mbyhob3N0bmFtZSwgc2Vydm5hbWUsIGhpbnRzLCByZXMpCi0JY29uc3QgY2hhciAqaG9zdG5hbWUsICpzZXJ2bmFtZTsKLQljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLXsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7Ci0Jc3RydWN0IGFkZHJpbmZvICpjdXI7Ci0JaW50IGVycm9yID0gMDsKLQlzdHJ1Y3QgYWRkcmluZm8gYWk7Ci0Jc3RydWN0IGFkZHJpbmZvIGFpMDsKLQlzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKLQljb25zdCBzdHJ1Y3QgYWZkICphZmQ7Ci0JY29uc3Qgc3RydWN0IGV4cGxvcmUgKmV4OwotCi0jaWZkZWYgRkFJVEgKLQlzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7Ci0KLQlpZiAoZmlyc3R0aW1lKSB7Ci0JCS8qIHRyYW5zbGF0b3IgaGFjayAqLwotCQljaGFyICpxID0gZ2V0ZW52KCJHQUkiKTsKLQkJaWYgKHEgJiYgaW5ldF9wdG9uKEFGX0lORVQ2LCBxLCAmZmFpdGhfcHJlZml4KSA9PSAxKQotCQkJdHJhbnNsYXRlID0gWUVTOwotCQlmaXJzdHRpbWUgPSAwOwotCX0KLSNlbmRpZgotCi0Jc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7Ci0JY3VyID0gJnNlbnRpbmVsOwotCXBhaSA9ICZhaTsKLQlwYWktPmFpX2ZsYWdzID0gMDsKLQlwYWktPmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKLQlwYWktPmFpX3NvY2t0eXBlID0gQU5ZOwotCXBhaS0+YWlfcHJvdG9jb2wgPSBBTlk7Ci0JcGFpLT5haV9hZGRybGVuID0gMDsKLQlwYWktPmFpX2Nhbm9ubmFtZSA9IE5VTEw7Ci0JcGFpLT5haV9hZGRyID0gTlVMTDsKLQlwYWktPmFpX25leHQgPSBOVUxMOwotCi0JaWYgKGhvc3RuYW1lID09IE5VTEwgJiYgc2Vydm5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIEVBSV9OT05BTUU7Ci0JaWYgKGhpbnRzKSB7Ci0JCS8qIGVycm9yIGNoZWNrIGZvciBoaW50cyAqLwotCQlpZiAoaGludHMtPmFpX2FkZHJsZW4gfHwgaGludHMtPmFpX2Nhbm9ubmFtZSB8fAotCQkgICAgaGludHMtPmFpX2FkZHIgfHwgaGludHMtPmFpX25leHQpCi0JCQlFUlIoRUFJX0JBREhJTlRTKTsgLyogeHh4ICovCi0JCWlmIChoaW50cy0+YWlfZmxhZ3MgJiB+QUlfTUFTSykKLQkJCUVSUihFQUlfQkFERkxBR1MpOwotCQlzd2l0Y2ggKGhpbnRzLT5haV9mYW1pbHkpIHsKLQkJY2FzZSBQRl9VTlNQRUM6Ci0JCWNhc2UgUEZfSU5FVDoKLSNpZmRlZiBJTkVUNgotCQljYXNlIFBGX0lORVQ2OgotI2VuZGlmCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCUVSUihFQUlfRkFNSUxZKTsKLQkJfQotCQltZW1jcHkocGFpLCBoaW50cywgc2l6ZW9mKCpwYWkpKTsKLQotCQkvKgotCQkgKiBpZiBib3RoIHNvY2t0eXBlL3Byb3RvY29sIGFyZSBzcGVjaWZpZWQsIGNoZWNrIGlmIHRoZXkKLQkJICogYXJlIG1lYW5pbmdmdWwgY29tYmluYXRpb24uCi0JCSAqLwotCQlpZiAocGFpLT5haV9zb2NrdHlwZSAhPSBBTlkgJiYgcGFpLT5haV9wcm90b2NvbCAhPSBBTlkpIHsKLQkJCWZvciAoZXggPSBleHBsb3JlOyBleC0+ZV9hZiA+PSAwOyBleCsrKSB7Ci0JCQkJaWYgKHBhaS0+YWlfZmFtaWx5ICE9IGV4LT5lX2FmKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZXgtPmVfc29ja3R5cGUgPT0gQU5ZKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZXgtPmVfcHJvdG9jb2wgPT0gQU5ZKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBleC0+ZV9zb2NrdHlwZQotCQkJCSAmJiBwYWktPmFpX3Byb3RvY29sICE9IGV4LT5lX3Byb3RvY29sKSB7Ci0JCQkJCUVSUihFQUlfQkFESElOVFMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogY2hlY2sgZm9yIHNwZWNpYWwgY2FzZXMuICAoMSkgbnVtZXJpYyBzZXJ2bmFtZSBpcyBkaXNhbGxvd2VkIGlmCi0JICogc29ja3R5cGUvcHJvdG9jb2wgYXJlIGxlZnQgdW5zcGVjaWZpZWQuICgyKSBzZXJ2bmFtZSBpcyBkaXNhbGxvd2VkCi0JICogZm9yIHJhdyBhbmQgb3RoZXIgaW5ldHssNn0gc29ja2V0cy4KLQkgKi8KLQlpZiAoTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBQRl9JTkVULCAxKQotI2lmZGVmIFBGX0lORVQ2Ci0JIHx8IE1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgUEZfSU5FVDYsIDEpCi0jZW5kaWYKLQkgICAgKSB7Ci0JCWFpMCA9ICpwYWk7Ci0KLQkJaWYgKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykgewotI2lmZGVmIFBGX0lORVQ2Ci0JCQlwYWktPmFpX2ZhbWlseSA9IFBGX0lORVQ2OwotI2Vsc2UKLQkJCXBhaS0+YWlfZmFtaWx5ID0gUEZfSU5FVDsKLSNlbmRpZgotCQl9Ci0JCWVycm9yID0gZ2V0X3BvcnRtYXRjaChwYWksIHNlcnZuYW1lKTsKLQkJaWYgKGVycm9yKQotCQkJRVJSKGVycm9yKTsKLQotCQkqcGFpID0gYWkwOwotCX0KLQotCWFpMCA9ICpwYWk7Ci0KLQkvKiBOVUxMIGhvc3RuYW1lLCBvciBudW1lcmljIGhvc3RuYW1lICovCi0JZm9yIChleCA9IGV4cGxvcmU7IGV4LT5lX2FmID49IDA7IGV4KyspIHsKLQkJKnBhaSA9IGFpMDsKLQotCQlpZiAoIU1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgZXgtPmVfYWYsIFdJTERfQUYoZXgpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIU1BVENIKHBhaS0+YWlfc29ja3R5cGUsIGV4LT5lX3NvY2t0eXBlLCBXSUxEX1NPQ0tUWVBFKGV4KSkpCi0JCQljb250aW51ZTsKLQkJaWYgKCFNQVRDSChwYWktPmFpX3Byb3RvY29sLCBleC0+ZV9wcm90b2NvbCwgV0lMRF9QUk9UT0NPTChleCkpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykKLQkJCXBhaS0+YWlfZmFtaWx5ID0gZXgtPmVfYWY7Ci0JCWlmIChwYWktPmFpX3NvY2t0eXBlID09IEFOWSAmJiBleC0+ZV9zb2NrdHlwZSAhPSBBTlkpCi0JCQlwYWktPmFpX3NvY2t0eXBlID0gZXgtPmVfc29ja3R5cGU7Ci0JCWlmIChwYWktPmFpX3Byb3RvY29sID09IEFOWSAmJiBleC0+ZV9wcm90b2NvbCAhPSBBTlkpCi0JCQlwYWktPmFpX3Byb3RvY29sID0gZXgtPmVfcHJvdG9jb2w7Ci0KLQkJaWYgKGhvc3RuYW1lID09IE5VTEwpCi0JCQllcnJvciA9IGV4cGxvcmVfbnVsbChwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgJmN1ci0+YWlfbmV4dCk7Ci0JCWVsc2UKLQkJCWVycm9yID0gZXhwbG9yZV9udW1lcmljX3Njb3BlKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCAmY3VyLT5haV9uZXh0KTsKLQotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGZyZWU7Ci0KLQkJd2hpbGUgKGN1ciAmJiBjdXItPmFpX25leHQpCi0JCQljdXIgPSBjdXItPmFpX25leHQ7Ci0JfQotCi0JLyoKLQkgKiBYWFgKLQkgKiBJZiBudW1yZWljIHJlcHJlc2VudGF0aW9uIG9mIEFGMSBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgRlFETgotCSAqIHJlcHJlc2VudGF0aW9uIG9mIEFGMiwgd2UgbmVlZCB0byB0aGluayBhZ2FpbiBhYm91dCB0aGUgY29kZSBiZWxvdy4KLQkgKi8KLQlpZiAoc2VudGluZWwuYWlfbmV4dCkKLQkJZ290byBnb29kOwotCi0JaWYgKHBhaS0+YWlfZmxhZ3MgJiBBSV9OVU1FUklDSE9TVCkKLQkJRVJSKEVBSV9OT05BTUUpOwotCWlmIChob3N0bmFtZSA9PSBOVUxMKQotCQlFUlIoRUFJX05PTkFNRSk7Ci0KLQkvKgotCSAqIGhvc3RuYW1lIGFzIGFscGhhYmV0aWNhbCBuYW1lLgotCSAqIHdlIHdvdWxkIGxpa2UgdG8gcHJlZmVyIEFGX0lORVQ2IHRoYW4gQUZfSU5FVCwgc28gd2UnbGwgbWFrZSBhCi0JICogb3V0ZXIgbG9vcCBieSBBRnMuCi0JICovCi0JZm9yIChhZmQgPSBhZmRsOyBhZmQtPmFfYWY7IGFmZCsrKSB7Ci0JCSpwYWkgPSBhaTA7Ci0KLQkJaWYgKCFNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIGFmZC0+YV9hZiwgMSkpCi0JCQljb250aW51ZTsKLQotCQlmb3IgKGV4ID0gZXhwbG9yZTsgZXgtPmVfYWYgPj0gMDsgZXgrKykgewotCQkJKnBhaSA9IGFpMDsKLQotCQkJaWYgKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykKLQkJCQlwYWktPmFpX2ZhbWlseSA9IGFmZC0+YV9hZjsKLQotCQkJaWYgKCFNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIGV4LT5lX2FmLCBXSUxEX0FGKGV4KSkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIU1BVENIKHBhaS0+YWlfc29ja3R5cGUsIGV4LT5lX3NvY2t0eXBlLAotCQkJCQlXSUxEX1NPQ0tUWVBFKGV4KSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghTUFUQ0gocGFpLT5haV9wcm90b2NvbCwgZXgtPmVfcHJvdG9jb2wsCi0JCQkJCVdJTERfUFJPVE9DT0woZXgpKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAocGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDKQotCQkJCXBhaS0+YWlfZmFtaWx5ID0gZXgtPmVfYWY7Ci0JCQlpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBBTlkgJiYgZXgtPmVfc29ja3R5cGUgIT0gQU5ZKQotCQkJCXBhaS0+YWlfc29ja3R5cGUgPSBleC0+ZV9zb2NrdHlwZTsKLQkJCWlmIChwYWktPmFpX3Byb3RvY29sID09IEFOWSAmJiBleC0+ZV9wcm90b2NvbCAhPSBBTlkpCi0JCQkJcGFpLT5haV9wcm90b2NvbCA9IGV4LT5lX3Byb3RvY29sOwotCi0JCQllcnJvciA9IGV4cGxvcmVfZnFkbihwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwKLQkJCQkmY3VyLT5haV9uZXh0KTsKLQotCQkJd2hpbGUgKGN1ciAmJiBjdXItPmFpX25leHQpCi0JCQkJY3VyID0gY3VyLT5haV9uZXh0OwotCQl9Ci0JfQotCi0JLyogWFhYICovCi0JaWYgKHNlbnRpbmVsLmFpX25leHQpCi0JCWVycm9yID0gMDsKLQotCWlmIChlcnJvcikKLQkJZ290byBmcmVlOwotCWlmIChlcnJvciA9PSAwKSB7Ci0JCWlmIChzZW50aW5lbC5haV9uZXh0KSB7Ci0gZ29vZDoKLQkJCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OwotCQkJcmV0dXJuIFNVQ0NFU1M7Ci0JCX0gZWxzZQotCQkJZXJyb3IgPSBFQUlfRkFJTDsKLQl9Ci0gZnJlZToKLSBiYWQ6Ci0JaWYgKHNlbnRpbmVsLmFpX25leHQpCi0JCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKLQkqcmVzID0gTlVMTDsKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBGUUROIGhvc3RuYW1lLCBETlMgbG9va3VwCi0gKi8KLXN0YXRpYyBpbnQKLWV4cGxvcmVfZnFkbihwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWNvbnN0IGNoYXIgKmhvc3RuYW1lOwotCWNvbnN0IGNoYXIgKnNlcnZuYW1lOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLXsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0JaW50IGhfZXJyb3I7Ci0JaW50IGFmOwotCWNoYXIgKiphcGxpc3QgPSBOVUxMLCAqYXBidWYgPSBOVUxMOwotCWNoYXIgKmFwOwotCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbCwgKmN1cjsKLQlpbnQgaTsKLSNpZm5kZWYgVVNFX0dFVElQTk9ERUJZCi0JaW50IG5hZGRyczsKLSNlbmRpZgotCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKLQlpbnQgZXJyb3I7Ci0KLQkqcmVzID0gTlVMTDsKLQlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKLQljdXIgPSAmc2VudGluZWw7Ci0KLQkvKgotCSAqIERvIG5vdCBmaWx0ZXIgdW5zdXBwb3J0ZWQgQUZzIGhlcmUuICBXZSBuZWVkIHRvIGhvbm9yIGNvbnRlbnQgb2YKLQkgKiBkYXRhYmFzZXMgKC9ldGMvaG9zdHMsIEROUyBhbmQgb3RoZXJzKS4gIE90aGVyd2lzZSB3ZSBjYW5ub3QKLQkgKiByZXBsYWNlIGdldGhvc3RieW5hbWUoKSBieSBnZXRhZGRyaW5mbygpLgotCSAqLwotCi0JLyoKLQkgKiBpZiB0aGUgc2Vydm5hbWUgZG9lcyBub3QgbWF0Y2ggc29ja3R5cGUvcHJvdG9jb2wsIGlnbm9yZSBpdC4KLQkgKi8KLQlpZiAoZ2V0X3BvcnRtYXRjaChwYWksIHNlcnZuYW1lKSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCWFmZCA9IGZpbmRfYWZkKHBhaS0+YWlfZmFtaWx5KTsKLQotCS8qCi0JICogcG9zdC1SRkMyNTUzOiBzaG91bGQgbG9vayBhdCAocGFpLT5haV9mbGFncyAmIEFJX0FERFJDT05GSUcpCi0JICogcmF0aGVyIHRoYW4gaGFyZGNvZGluZyBpdC4gIHdlIG1heSBuZWVkIHRvIGFkZCBBSV9BRERSQ09ORklHCi0JICogaGFuZGxpbmcgY29kZSBieSBvdXJzZWx2ZXMgaW4gY2FzZSB3ZSBkb24ndCBoYXZlIGdldGlwbm9kZWJ5bmFtZSgpLgotCSAqLwotI2lmZGVmIFVTRV9HRVRJUE5PREVCWQotCWhwID0gZ2V0aXBub2RlYnluYW1lKGhvc3RuYW1lLCBwYWktPmFpX2ZhbWlseSwgQUlfQUREUkNPTkZJRywgJmhfZXJyb3IpOwotI2Vsc2UKLSNpZmRlZiBIQVZFX0dFVEhPU1RCWU5BTUUyCi0JaHAgPSBnZXRob3N0YnluYW1lMihob3N0bmFtZSwgcGFpLT5haV9mYW1pbHkpOwotI2Vsc2UKLQlpZiAocGFpLT5haV9mYW1pbHkgIT0gQUZfSU5FVCkKLQkJcmV0dXJuIDA7Ci0JaHAgPSBnZXRob3N0YnluYW1lKGhvc3RuYW1lKTsKLSNpZmRlZiBIQVZFX0hfRVJSTk8KLQloX2Vycm9yID0gaF9lcnJubzsKLSNlbHNlCi0JaF9lcnJvciA9IEVJTlZBTDsKLSNlbmRpZgotI2VuZGlmIC8qSEFWRV9HRVRIT1NUQllOQU1FMiovCi0jZW5kaWYgLypVU0VfR0VUSVBOT0RFQlkqLwotCi0JaWYgKGhwID09IE5VTEwpIHsKLQkJc3dpdGNoIChoX2Vycm9yKSB7Ci0JCWNhc2UgSE9TVF9OT1RfRk9VTkQ6Ci0JCWNhc2UgTk9fREFUQToKLQkJCWVycm9yID0gRUFJX05PREFUQTsKLQkJCWJyZWFrOwotCQljYXNlIFRSWV9BR0FJTjoKLQkJCWVycm9yID0gRUFJX0FHQUlOOwotCQkJYnJlYWs7Ci0JCWNhc2UgTk9fUkVDT1ZFUlk6Ci0JCWNhc2UgTkVUREJfSU5URVJOQUw6Ci0JCWRlZmF1bHQ6Ci0JCQllcnJvciA9IEVBSV9GQUlMOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKChocC0+aF9uYW1lID09IE5VTEwpIHx8IChocC0+aF9uYW1lWzBdID09IDApCi0JCQl8fCAoaHAtPmhfYWRkcl9saXN0WzBdID09IE5VTEwpKSB7Ci0jaWZkZWYgVVNFX0dFVElQTk9ERUJZCi0JCWZyZWVob3N0ZW50KGhwKTsKLSNlbmRpZgotCQlocCA9IE5VTEw7Ci0JCWVycm9yID0gRUFJX0ZBSUw7Ci0JfQotCi0JaWYgKGhwID09IE5VTEwpCi0JCWdvdG8gZnJlZTsKLQotI2lmZGVmIFVTRV9HRVRJUE5PREVCWQotCWFwbGlzdCA9IGhwLT5oX2FkZHJfbGlzdDsKLSNlbHNlCi0JLyoKLQkgKiBocCB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHdlIHVzZSBnZXRob3N0YnluYW1lMigpLgotCSAqIGFsd2F5cyBkZWVwIGNvcHkgZm9yIHNpbXBsaWZpY2F0aW9uLgotCSAqLwotCWZvciAobmFkZHJzID0gMDsgaHAtPmhfYWRkcl9saXN0W25hZGRyc10gIT0gTlVMTDsgbmFkZHJzKyspCi0JCTsKLQluYWRkcnMrKzsKLQlhcGxpc3QgPSAoY2hhciAqKiltYWxsb2Moc2l6ZW9mKGFwbGlzdFswXSkgKiBuYWRkcnMpOwotCWFwYnVmID0gKGNoYXIgKiltYWxsb2MoaHAtPmhfbGVuZ3RoICogbmFkZHJzKTsKLQlpZiAoYXBsaXN0ID09IE5VTEwgfHwgYXBidWYgPT0gTlVMTCkgewotCQllcnJvciA9IEVBSV9NRU1PUlk7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0JbWVtc2V0KGFwbGlzdCwgMCwgc2l6ZW9mKGFwbGlzdFswXSkgKiBuYWRkcnMpOwotCWZvciAoaSA9IDA7IGkgPCBuYWRkcnM7IGkrKykgewotCQlpZiAoaHAtPmhfYWRkcl9saXN0W2ldID09IE5VTEwpIHsKLQkJCWFwbGlzdFtpXSA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfQotCQltZW1jcHkoJmFwYnVmW2kgKiBocC0+aF9sZW5ndGhdLCBocC0+aF9hZGRyX2xpc3RbaV0sCi0JCQlocC0+aF9sZW5ndGgpOwotCQlhcGxpc3RbaV0gPSAmYXBidWZbaSAqIGhwLT5oX2xlbmd0aF07Ci0JfQotI2VuZGlmCi0KLQlmb3IgKGkgPSAwOyBhcGxpc3RbaV0gIT0gTlVMTDsgaSsrKSB7Ci0JCWFmID0gaHAtPmhfYWRkcnR5cGU7Ci0JCWFwID0gYXBsaXN0W2ldOwotI2lmZGVmIEFGX0lORVQ2Ci0JCWlmIChhZiA9PSBBRl9JTkVUNgotCQkgJiYgSU42X0lTX0FERFJfVjRNQVBQRUQoKHN0cnVjdCBpbjZfYWRkciAqKWFwKSkgewotCQkJYWYgPSBBRl9JTkVUOwotCQkJYXAgPSBhcCArIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpCi0JCQkJLSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwotCQl9Ci0jZW5kaWYKLQotCQlpZiAoYWYgIT0gcGFpLT5haV9mYW1pbHkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoKHBhaS0+YWlfZmxhZ3MgJiBBSV9DQU5PTk5BTUUpID09IDApIHsKLQkJCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgYXApOwotCQkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogaWYgQUlfQ0FOT05OQU1FIGFuZCBpZiByZXZlcnNlIGxvb2t1cAotCQkJICogZmFpbCwgcmV0dXJuIGFpIGFueXdheSB0byBwYWNpZnkKLQkJCSAqIGNhbGxpbmcgYXBwbGljYXRpb24uCi0JCQkgKgotCQkJICogWFhYIGdldGFkZHJpbmZvKCkgaXMgYSBuYW1lLT5hZGRyZXNzCi0JCQkgKiB0cmFuc2xhdGlvbiBmdW5jdGlvbiwgYW5kIGl0IGxvb2tzCi0JCQkgKiBzdHJhbmdlIHRoYXQgd2UgZG8gYWRkci0+bmFtZQotCQkJICogdHJhbnNsYXRpb24gaGVyZS4KLQkJCSAqLwotCQkJZ2V0X25hbWUoYXAsIGFmZCwgJmN1ci0+YWlfbmV4dCwKLQkJCQlhcCwgcGFpLCBzZXJ2bmFtZSk7Ci0JCX0KLQotCQl3aGlsZSAoY3VyICYmIGN1ci0+YWlfbmV4dCkKLQkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKLQl9Ci0KLQkqcmVzID0gc2VudGluZWwuYWlfbmV4dDsKLQlyZXR1cm4gMDsKLQotZnJlZToKLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQlpZiAoaHApCi0JCWZyZWVob3N0ZW50KGhwKTsKLSNlbmRpZgotCWlmIChhcGxpc3QpCi0JCWZyZWUoYXBsaXN0KTsKLQlpZiAoYXBidWYpCi0JCWZyZWUoYXBidWYpOwotCWlmIChzZW50aW5lbC5haV9uZXh0KQotCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogaG9zdG5hbWUgPT0gTlVMTC4KLSAqIHBhc3NpdmUgc29ja2V0IC0+IGFueWFkZHIgKDAuMC4wLjAgb3IgOjopCi0gKiBub24tcGFzc2l2ZSBzb2NrZXQgLT4gbG9jYWxob3N0ICgxMjcuMC4wLjEgb3IgOjoxKQotICovCi1zdGF0aWMgaW50Ci1leHBsb3JlX251bGwocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcykKLQljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKLQljb25zdCBjaGFyICpob3N0bmFtZTsKLQljb25zdCBjaGFyICpzZXJ2bmFtZTsKLQlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Ci17Ci0JaW50IHM7Ci0JY29uc3Qgc3RydWN0IGFmZCAqYWZkOwotCXN0cnVjdCBhZGRyaW5mbyAqY3VyOwotCXN0cnVjdCBhZGRyaW5mbyBzZW50aW5lbDsKLQlpbnQgZXJyb3I7Ci0KLQkqcmVzID0gTlVMTDsKLQlzZW50aW5lbC5haV9uZXh0ID0gTlVMTDsKLQljdXIgPSAmc2VudGluZWw7Ci0KLQkvKgotCSAqIGZpbHRlciBvdXQgQUZzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbAotCSAqIFhYWCBlcnJubz8KLQkgKi8KLQlzID0gc29ja2V0KHBhaS0+YWlfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKLQlpZiAocyA8IDApIHsKLQkJaWYgKGVycm5vICE9IEVNRklMRSkKLQkJCXJldHVybiAwOwotCX0gZWxzZQotCQljbG9zZShzKTsKLQotCS8qCi0JICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCi0JICovCi0JaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7Ci0KLQlpZiAocGFpLT5haV9mbGFncyAmIEFJX1BBU1NJVkUpIHsKLQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgYWZkLCBhZmQtPmFfYWRkcmFueSk7Ci0JCS8qIHh4eCBtZWFuaW5nbGVzcz8KLQkJICogR0VUX0NBTk9OTkFNRShjdXItPmFpX25leHQsICJhbnlhZGRyIik7Ci0JCSAqLwotCQlHRVRfUE9SVChjdXItPmFpX25leHQsIHNlcnZuYW1lKTsKLQl9IGVsc2UgewotCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIGFmZC0+YV9sb29wYmFjayk7Ci0JCS8qIHh4eCBtZWFuaW5nbGVzcz8KLQkJICogR0VUX0NBTk9OTkFNRShjdXItPmFpX25leHQsICJsb2NhbGhvc3QiKTsKLQkJICovCi0JCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOwotCX0KLQljdXIgPSBjdXItPmFpX25leHQ7Ci0KLQkqcmVzID0gc2VudGluZWwuYWlfbmV4dDsKLQlyZXR1cm4gMDsKLQotZnJlZToKLQlpZiAoc2VudGluZWwuYWlfbmV4dCkKLQkJZnJlZWFkZHJpbmZvKHNlbnRpbmVsLmFpX25leHQpOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoKLSAqIG51bWVyaWMgaG9zdG5hbWUKLSAqLwotc3RhdGljIGludAotZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCi0JY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JY29uc3QgY2hhciAqaG9zdG5hbWU7Ci0JY29uc3QgY2hhciAqc2Vydm5hbWU7Ci0Jc3RydWN0IGFkZHJpbmZvICoqcmVzOwotewotCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmN1cjsKLQlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7Ci0JaW50IGVycm9yOwotCWNoYXIgcHRvbltQVE9OX01BWF07Ci0JaW50IGZsYWdzOwotCi0JKnJlcyA9IE5VTEw7Ci0Jc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7Ci0JY3VyID0gJnNlbnRpbmVsOwotCi0JLyoKLQkgKiBpZiB0aGUgc2Vydm5hbWUgZG9lcyBub3QgbWF0Y2ggc29ja3R5cGUvcHJvdG9jb2wsIGlnbm9yZSBpdC4KLQkgKi8KLQlpZiAoZ2V0X3BvcnRtYXRjaChwYWksIHNlcnZuYW1lKSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCWFmZCA9IGZpbmRfYWZkKHBhaS0+YWlfZmFtaWx5KTsKLQlmbGFncyA9IHBhaS0+YWlfZmxhZ3M7Ci0KLQlpZiAoaW5ldF9wdG9uKGFmZC0+YV9hZiwgaG9zdG5hbWUsIHB0b24pID09IDEpIHsKLQkJdV9pbnQzMl90IHY0YTsKLSNpZmRlZiBJTkVUNgotCQl1X2NoYXIgcGZ4OwotI2VuZGlmCi0KLQkJc3dpdGNoIChhZmQtPmFfYWYpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJdjRhID0gKHVfaW50MzJfdCludG9obCgoKHN0cnVjdCBpbl9hZGRyICopcHRvbiktPnNfYWRkcik7Ci0JCQlpZiAoSU5fTVVMVElDQVNUKHY0YSkgfHwgSU5fRVhQRVJJTUVOVEFMKHY0YSkpCi0JCQkJZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKLQkJCXY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKLQkJCWlmICh2NGEgPT0gMCB8fCB2NGEgPT0gSU5fTE9PUEJBQ0tORVQpCi0JCQkJZmxhZ3MgJj0gfkFJX0NBTk9OTkFNRTsKLQkJCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCQlwZnggPSAoKHN0cnVjdCBpbjZfYWRkciAqKXB0b24pLT5zNl9hZGRyWzBdOwotCQkJaWYgKHBmeCA9PSAwIHx8IHBmeCA9PSAweGZlIHx8IHBmeCA9PSAweGZmKQotCQkJCWZsYWdzICY9IH5BSV9DQU5PTk5BTUU7Ci0JCQlicmVhazsKLSNlbmRpZgotCQl9Ci0KLQkJaWYgKHBhaS0+YWlfZmFtaWx5ID09IGFmZC0+YV9hZiB8fAotCQkgICAgcGFpLT5haV9mYW1pbHkgPT0gUEZfVU5TUEVDIC8qPyovKSB7Ci0JCQlpZiAoKGZsYWdzICYgQUlfQ0FOT05OQU1FKSA9PSAwKSB7Ci0JCQkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgYWZkLCBwdG9uKTsKLQkJCQlHRVRfUE9SVChjdXItPmFpX25leHQsIHNlcnZuYW1lKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBpZiBBSV9DQU5PTk5BTUUgYW5kIGlmIHJldmVyc2UgbG9va3VwCi0JCQkJICogZmFpbCwgcmV0dXJuIGFpIGFueXdheSB0byBwYWNpZnkKLQkJCQkgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgotCQkJCSAqCi0JCQkJICogWFhYIGdldGFkZHJpbmZvKCkgaXMgYSBuYW1lLT5hZGRyZXNzCi0JCQkJICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcwotCQkJCSAqIHN0cmFuZ2UgdGhhdCB3ZSBkbyBhZGRyLT5uYW1lCi0JCQkJICogdHJhbnNsYXRpb24gaGVyZS4KLQkJCQkgKi8KLQkJCQlnZXRfbmFtZShwdG9uLCBhZmQsICZjdXItPmFpX25leHQsCi0JCQkJCXB0b24sIHBhaSwgc2Vydm5hbWUpOwotCQkJfQotCQkJd2hpbGUgKGN1ciAmJiBjdXItPmFpX25leHQpCi0JCQkJY3VyID0gY3VyLT5haV9uZXh0OwotCQl9IGVsc2UKLQkJCUVSUihFQUlfRkFNSUxZKTsJLyp4eHgqLwotCX0KLQotCSpyZXMgPSBzZW50aW5lbC5haV9uZXh0OwotCXJldHVybiAwOwotCi1mcmVlOgotYmFkOgotCWlmIChzZW50aW5lbC5haV9uZXh0KQotCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogbnVtZXJpYyBob3N0bmFtZSB3aXRoIHNjb3BlCi0gKi8KLXN0YXRpYyBpbnQKLWV4cGxvcmVfbnVtZXJpY19zY29wZShwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOwotCWNvbnN0IGNoYXIgKmhvc3RuYW1lOwotCWNvbnN0IGNoYXIgKnNlcnZuYW1lOwotCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKLXsKLSNpZm5kZWYgU0NPUEVfREVMSU1JVEVSCi0JcmV0dXJuIGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKTsKLSNlbHNlCi0JY29uc3Qgc3RydWN0IGFmZCAqYWZkOwotCXN0cnVjdCBhZGRyaW5mbyAqY3VyOwotCWludCBlcnJvcjsKLQljaGFyICpjcCwgKmhvc3RuYW1lMiA9IE5VTEw7Ci0JaW50IHNjb3BlOwotCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7Ci0KLQkvKgotCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgotCSAqLwotCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCi0JCXJldHVybiAwOwotCi0JYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOwotCWlmICghYWZkLT5hX3Njb3BlZCkKLQkJcmV0dXJuIGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKTsKLQotCWNwID0gc3RyY2hyKGhvc3RuYW1lLCBTQ09QRV9ERUxJTUlURVIpOwotCWlmIChjcCA9PSBOVUxMKQotCQlyZXR1cm4gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpOwotCi0JLyoKLQkgKiBIYW5kbGUgc3BlY2lhbCBjYXNlIG9mIDxzY29wZWRfYWRkcmVzcz48ZGVsaW1pdGVyPjxzY29wZSBpZD4KLQkgKi8KLQlob3N0bmFtZTIgPSBzdHJkdXAoaG9zdG5hbWUpOwotCWlmIChob3N0bmFtZTIgPT0gTlVMTCkKLQkJcmV0dXJuIEVBSV9NRU1PUlk7Ci0JLyogdGVybWluYXRlIGF0IHRoZSBkZWxpbWl0ZXIgKi8KLQlob3N0bmFtZTJbY3AgLSBob3N0bmFtZV0gPSAnXDAnOwotCi0JY3ArKzsKLQlzd2l0Y2ggKHBhaS0+YWlfZmFtaWx5KSB7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIEFGX0lORVQ2OgotCQlzY29wZSA9IGlmX25hbWV0b2luZGV4KGNwKTsKLQkJaWYgKHNjb3BlID09IDApIHsKLQkJCWZyZWUoaG9zdG5hbWUyKTsKLQkJCXJldHVybiAoRUFJX05PTkFNRSk7Ci0JCX0KLQkJYnJlYWs7Ci0jZW5kaWYKLQl9Ci0KLQllcnJvciA9IGV4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lMiwgc2Vydm5hbWUsIHJlcyk7Ci0JaWYgKGVycm9yID09IDApIHsKLQkJZm9yIChjdXIgPSAqcmVzOyBjdXI7IGN1ciA9IGN1ci0+YWlfbmV4dCkgewotCQkJaWYgKGN1ci0+YWlfZmFtaWx5ICE9IEFGX0lORVQ2KQotCQkJCWNvbnRpbnVlOwotCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopY3VyLT5haV9hZGRyOwotCQkJaWYgKElONl9JU19BRERSX0xJTktMT0NBTCgmc2luNi0+c2luNl9hZGRyKSB8fAotCQkJICAgIElONl9JU19BRERSX01DX0xJTktMT0NBTCgmc2luNi0+c2luNl9hZGRyKSkKLQkJCQlzaW42LT5zaW42X3Njb3BlX2lkID0gc2NvcGU7Ci0JCX0KLQl9Ci0KLQlmcmVlKGhvc3RuYW1lMik7Ci0KLQlyZXR1cm4gZXJyb3I7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludAotZ2V0X25hbWUoYWRkciwgYWZkLCByZXMsIG51bWFkZHIsIHBhaSwgc2Vydm5hbWUpCi0JY29uc3QgY2hhciAqYWRkcjsKLQljb25zdCBzdHJ1Y3QgYWZkICphZmQ7Ci0Jc3RydWN0IGFkZHJpbmZvICoqcmVzOwotCWNoYXIgKm51bWFkZHI7Ci0JY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JY29uc3QgY2hhciAqc2Vydm5hbWU7Ci17Ci0Jc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmN1ciA9IE5VTEw7Ci0JaW50IGVycm9yID0gMDsKLQljaGFyICphcCA9IE5VTEwsICpjbiA9IE5VTEw7Ci0jaWZkZWYgVVNFX0dFVElQTk9ERUJZCi0JaW50IGhfZXJyb3I7Ci0KLQlocCA9IGdldGlwbm9kZWJ5YWRkcihhZGRyLCBhZmQtPmFfYWRkcmxlbiwgYWZkLT5hX2FmLCAmaF9lcnJvcik7Ci0jZWxzZQotCWhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBhZmQtPmFfYWRkcmxlbiwgYWZkLT5hX2FmKTsKLSNlbmRpZgotCWlmIChocCAmJiBocC0+aF9uYW1lICYmIGhwLT5oX25hbWVbMF0gJiYgaHAtPmhfYWRkcl9saXN0WzBdKSB7Ci0jaWZkZWYgVVNFX0dFVElQTk9ERUJZCi0JCUdFVF9BSShjdXIsIGFmZCwgaHAtPmhfYWRkcl9saXN0WzBdKTsKLQkJR0VUX1BPUlQoY3VyLCBzZXJ2bmFtZSk7Ci0JCUdFVF9DQU5PTk5BTUUoY3VyLCBocC0+aF9uYW1lKTsKLSNlbHNlCi0JCS8qIGhwIHdpbGwgYmUgZGFtYWdlZCBpZiB3ZSB1c2UgZ2V0aG9zdGJ5YWRkcigpICovCi0JCWlmICgoYXAgPSAoY2hhciAqKW1hbGxvYyhocC0+aF9sZW5ndGgpKSA9PSBOVUxMKSB7Ci0JCQllcnJvciA9IEVBSV9NRU1PUlk7Ci0JCQlnb3RvIGZyZWU7Ci0JCX0KLQkJbWVtY3B5KGFwLCBocC0+aF9hZGRyX2xpc3RbMF0sIGhwLT5oX2xlbmd0aCk7Ci0JCWlmICgoY24gPSBzdHJkdXAoaHAtPmhfbmFtZSkpID09IE5VTEwpIHsKLQkJCWVycm9yID0gRUFJX01FTU9SWTsKLQkJCWdvdG8gZnJlZTsKLQkJfQotCi0JCUdFVF9BSShjdXIsIGFmZCwgYXApOwotCQlHRVRfUE9SVChjdXIsIHNlcnZuYW1lKTsKLQkJR0VUX0NBTk9OTkFNRShjdXIsIGNuKTsKLQkJZnJlZShhcCk7IGFwID0gTlVMTDsKLQkJZnJlZShjbik7IGNuID0gTlVMTDsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCUdFVF9BSShjdXIsIGFmZCwgbnVtYWRkcik7Ci0JCUdFVF9QT1JUKGN1ciwgc2Vydm5hbWUpOwotCX0KLQotI2lmZGVmIFVTRV9HRVRJUE5PREVCWQotCWlmIChocCkKLQkJZnJlZWhvc3RlbnQoaHApOwotI2VuZGlmCi0JKnJlcyA9IGN1cjsKLQlyZXR1cm4gU1VDQ0VTUzsKLSBmcmVlOgotCWlmIChjdXIpCi0JCWZyZWVhZGRyaW5mbyhjdXIpOwotCWlmIChhcCkKLQkJZnJlZShhcCk7Ci0JaWYgKGNuKQotCQlmcmVlKGNuKTsKLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQlpZiAoaHApCi0JCWZyZWVob3N0ZW50KGhwKTsKLSNlbmRpZgotCSpyZXMgPSBOVUxMOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludAotZ2V0X2Nhbm9ubmFtZShwYWksIGFpLCBzdHIpCi0JY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0Jc3RydWN0IGFkZHJpbmZvICphaTsKLQljb25zdCBjaGFyICpzdHI7Ci17Ci0JaWYgKChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSAhPSAwKSB7Ci0JCWFpLT5haV9jYW5vbm5hbWUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oc3RyKSArIDEpOwotCQlpZiAoYWktPmFpX2Nhbm9ubmFtZSA9PSBOVUxMKQotCQkJcmV0dXJuIEVBSV9NRU1PUlk7Ci0JCXN0cmNweShhaS0+YWlfY2Fub25uYW1lLCBzdHIpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBhZGRyaW5mbyAqCi1nZXRfYWkocGFpLCBhZmQsIGFkZHIpCi0JY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7Ci0JY29uc3Qgc3RydWN0IGFmZCAqYWZkOwotCWNvbnN0IGNoYXIgKmFkZHI7Ci17Ci0JY2hhciAqcDsKLQlzdHJ1Y3QgYWRkcmluZm8gKmFpOwotCi0JYWkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pCi0JCSsgKGFmZC0+YV9zb2NrbGVuKSk7Ci0JaWYgKGFpID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JbWVtY3B5KGFpLCBwYWksIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKLQlhaS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoYWkgKyAxKTsKLQltZW1zZXQoYWktPmFpX2FkZHIsIDAsIGFmZC0+YV9zb2NrbGVuKTsKLSNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCWFpLT5haV9hZGRyLT5zYV9sZW4gPSBhZmQtPmFfc29ja2xlbjsKLSNlbmRpZgotCWFpLT5haV9hZGRybGVuID0gYWZkLT5hX3NvY2tsZW47Ci0JYWktPmFpX2FkZHItPnNhX2ZhbWlseSA9IGFpLT5haV9mYW1pbHkgPSBhZmQtPmFfYWY7Ci0JcCA9IChjaGFyICopKGFpLT5haV9hZGRyKTsKLQltZW1jcHkocCArIGFmZC0+YV9vZmYsIGFkZHIsIGFmZC0+YV9hZGRybGVuKTsKLQlyZXR1cm4gYWk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9wb3J0bWF0Y2goYWksIHNlcnZuYW1lKQotCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqYWk7Ci0JY29uc3QgY2hhciAqc2Vydm5hbWU7Ci17Ci0KLQkvKiBnZXRfcG9ydCBkb2VzIG5vdCB0b3VjaCBmaXJzdCBhcmd1bWVudC4gd2hlbiBtYXRjaG9ubHkgPT0gMS4gKi8KLQlyZXR1cm4gZ2V0X3BvcnQoKHN0cnVjdCBhZGRyaW5mbyAqKWFpLCBzZXJ2bmFtZSwgMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9wb3J0KGFpLCBzZXJ2bmFtZSwgbWF0Y2hvbmx5KQotCXN0cnVjdCBhZGRyaW5mbyAqYWk7Ci0JY29uc3QgY2hhciAqc2Vydm5hbWU7Ci0JaW50IG1hdGNob25seTsKLXsKLQljb25zdCBjaGFyICpwcm90bzsKLQlzdHJ1Y3Qgc2VydmVudCAqc3A7Ci0JaW50IHBvcnQ7Ci0JaW50IGFsbG93bnVtZXJpYzsKLQotCWlmIChzZXJ2bmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0jaWZkZWYgQUZfSU5FVDYKLQljYXNlIEFGX0lORVQ2OgotI2VuZGlmCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoYWktPmFpX3NvY2t0eXBlKSB7Ci0JY2FzZSBTT0NLX1JBVzoKLQkJcmV0dXJuIEVBSV9TRVJWSUNFOwotCWNhc2UgU09DS19ER1JBTToKLQljYXNlIFNPQ0tfU1RSRUFNOgotCQlhbGxvd251bWVyaWMgPSAxOwotCQlicmVhazsKLQljYXNlIEFOWToKLQkJYWxsb3dudW1lcmljID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIEVBSV9TT0NLVFlQRTsKLQl9Ci0KLQlpZiAoc3RyX2lzbnVtYmVyKHNlcnZuYW1lKSkgewotCQlpZiAoIWFsbG93bnVtZXJpYykKLQkJCXJldHVybiBFQUlfU0VSVklDRTsKLQkJcG9ydCA9IGh0b25zKGF0b2koc2Vydm5hbWUpKTsKLQkJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkKLQkJCXJldHVybiBFQUlfU0VSVklDRTsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKGFpLT5haV9zb2NrdHlwZSkgewotCQljYXNlIFNPQ0tfREdSQU06Ci0JCQlwcm90byA9ICJ1ZHAiOwotCQkJYnJlYWs7Ci0JCWNhc2UgU09DS19TVFJFQU06Ci0JCQlwcm90byA9ICJ0Y3AiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcm90byA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICgoc3AgPSBnZXRzZXJ2YnluYW1lKHNlcnZuYW1lLCBwcm90bykpID09IE5VTEwpCi0JCQlyZXR1cm4gRUFJX1NFUlZJQ0U7Ci0JCXBvcnQgPSBzcC0+c19wb3J0OwotCX0KLQotCWlmICghbWF0Y2hvbmx5KSB7Ci0JCXN3aXRjaCAoYWktPmFpX2ZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyKS0+c2luX3BvcnQgPSBwb3J0OwotCQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQkJY2FzZSBBRl9JTkVUNjoKLQkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKWFpLT5haV9hZGRyKS0+c2luNl9wb3J0ID0gcG9ydDsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhZmQgKgotZmluZF9hZmQoYWYpCi0JaW50IGFmOwotewotCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKLQotCWlmIChhZiA9PSBQRl9VTlNQRUMpCi0JCXJldHVybiBOVUxMOwotCWZvciAoYWZkID0gYWZkbDsgYWZkLT5hX2FmOyBhZmQrKykgewotCQlpZiAoYWZkLT5hX2FmID09IGFmKQotCQkJcmV0dXJuIGFmZDsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9taXNzaW5nL2dldG5hbWVpbmZvLmMgYi9taXNzaW5nL2dldG5hbWVpbmZvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDViNDcuLjAwMDAwMDAKLS0tIGEvbWlzc2luZy9nZXRuYW1laW5mby5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBJc3N1ZXMgdG8gYmUgZGlzY3Vzc2VkOgotICogLSBUaHJlYWQgc2FmZS1uZXNzIG11c3QgYmUgY2hlY2tlZAotICogLSBSZXR1cm4gdmFsdWVzLiAgVGhlcmUgc2VlbXMgdG8gYmUgbm8gc3RhbmRhcmQgZm9yIHJldHVybiB2YWx1ZSAoUkZDMjU1MykKLSAqICAgYnV0IElOUklBIGltcGxlbWVudGF0aW9uIHJldHVybnMgRUFJX3h4eCBkZWZpbmVkIGZvciBnZXRhZGRyaW5mbygpLgotICogLSBSRkMyNTUzIHNheXMgdGhhdCB3ZSBzaG91bGQgcmFpc2UgZXJyb3Igb24gc2hvcnQgYnVmZmVyLiAgWC9PcGVuIHNheXMKLSAqICAgd2UgbmVlZCB0byB0cnVuY2F0ZSB0aGUgcmVzdWx0LiAgV2Ugb2JleSBSRkMyNTUzIChhbmQgWC9PcGVuIHNob3VsZCBiZQotICogICBtb2RpZmllZCkuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9nZXRuYW1laW5mby5jLHYgMS4xMSAyMDAzLzExLzE2IDA5OjM2OjQ5IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNpbmNsdWRlIDxuZXQvaWYuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxyZXNvbHYuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0jaWZkZWYgTkVFRF9BRERSSU5GT19ICi0jaW5jbHVkZSAiYWRkcmluZm8uaCIKLSNlbmRpZgotCi0jZGVmaW5lIFNVQ0NFU1MgMAotI2RlZmluZSBBTlkgMAotI2RlZmluZSBZRVMgMQotI2RlZmluZSBOTyAgMAotCi1zdGF0aWMgc3RydWN0IGFmZCB7Ci0JaW50IGFfYWY7Ci0JaW50IGFfYWRkcmxlbjsKLQlpbnQgYV9zb2NrbGVuOwotCWludCBhX29mZjsKLX0gYWZkbCBbXSA9IHsKLSNpZmRlZiBJTkVUNgotCXtQRl9JTkVUNiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSwKLQkJb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2luNiwgc2luNl9hZGRyKX0sCi0jZW5kaWYKLQl7UEZfSU5FVCwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbiksCi0JCW9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbiwgc2luX2FkZHIpfSwKLQl7MCwgMCwgMH0sCi19OwotCi1zdHJ1Y3Qgc29ja2luZXQgewotCXVfY2hhcglzaV9sZW47Ci0JdV9jaGFyCXNpX2ZhbWlseTsKLQl1X3Nob3J0CXNpX3BvcnQ7Ci19OwotCi0jZGVmaW5lIEVOSV9OT1NPQ0tFVCAJMAotI2RlZmluZSBFTklfTk9TRVJWTkFNRQkxCi0jZGVmaW5lIEVOSV9OT0hPU1ROQU1FCTIKLSNkZWZpbmUgRU5JX01FTU9SWQkzCi0jZGVmaW5lIEVOSV9TWVNURU0JNAotI2RlZmluZSBFTklfRkFNSUxZCTUKLSNkZWZpbmUgRU5JX1NBTEVOCTYKLQotaW50Ci1nZXRuYW1laW5mbyhzYSwgc2FsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzKQotCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2E7Ci0Jc2l6ZV90IHNhbGVuOwotCWNoYXIgKmhvc3Q7Ci0Jc2l6ZV90IGhvc3RsZW47Ci0JY2hhciAqc2VydjsKLQlzaXplX3Qgc2VydmxlbjsKLQlpbnQgZmxhZ3M7Ci17Ci0Jc3RydWN0IGFmZCAqYWZkOwotCXN0cnVjdCBzZXJ2ZW50ICpzcDsKLQlzdHJ1Y3QgaG9zdGVudCAqaHA7Ci0JdV9zaG9ydCBwb3J0OwotCWludCBmYW1pbHksIGk7Ci0JY2hhciAqYWRkciwgKnA7Ci0JdV9pbnQzMl90IHY0YTsKLQlpbnQgaF9lcnJvcjsKLQljaGFyIG51bXNlcnZbNTEyXTsKLQljaGFyIG51bWFkZHJbNTEyXTsKLQotCWlmIChzYSA9PSBOVUxMKQotCQlyZXR1cm4gRU5JX05PU09DS0VUOwotCi0jaWZkZWYgSEFWRV9TQV9MRU4JLypYWFgqLwotCWlmIChzYS0+c2FfbGVuICE9IHNhbGVuKQotCQlyZXR1cm4gRU5JX1NBTEVOOwotI2VuZGlmCi0KLQlmYW1pbHkgPSBzYS0+c2FfZmFtaWx5OwotCWZvciAoaSA9IDA7IGFmZGxbaV0uYV9hZjsgaSsrKQotCQlpZiAoYWZkbFtpXS5hX2FmID09IGZhbWlseSkgewotCQkJYWZkID0gJmFmZGxbaV07Ci0JCQlnb3RvIGZvdW5kOwotCQl9Ci0JcmV0dXJuIEVOSV9GQU1JTFk7Ci0KLSBmb3VuZDoKLQlpZiAoc2FsZW4gIT0gYWZkLT5hX3NvY2tsZW4pCi0JCXJldHVybiBFTklfU0FMRU47Ci0KLQlwb3J0ID0gKChzdHJ1Y3Qgc29ja2luZXQgKilzYSktPnNpX3BvcnQ7IC8qIG5ldHdvcmsgYnl0ZSBvcmRlciAqLwotCWFkZHIgPSAoY2hhciAqKXNhICsgYWZkLT5hX29mZjsKLQotCWlmIChzZXJ2ID09IE5VTEwgfHwgc2VydmxlbiA9PSAwKSB7Ci0JCS8qCi0JCSAqIGRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgotCQkgKiBpbiBjYXNlIHlvdSBhcmUgd29uZGVyaW5nIGlmICImJiIgaXMgbW9yZSBjb3JyZWN0IHRoYW4KLQkJICogInx8IiBoZXJlOiBSRkMyNTUzIHNheXMgdGhhdCBzZXJ2ID09IE5VTEwgT1Igc2VydmxlbiA9PSAwCi0JCSAqIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSByZXN1bHQuCi0JCSAqLwotCX0gZWxzZSB7Ci0JCWlmIChmbGFncyAmIE5JX05VTUVSSUNTRVJWKQotCQkJc3AgPSBOVUxMOwotCQllbHNlIHsKLQkJCXNwID0gZ2V0c2VydmJ5cG9ydChwb3J0LAotCQkJCShmbGFncyAmIE5JX0RHUkFNKSA/ICJ1ZHAiIDogInRjcCIpOwotCQl9Ci0JCWlmIChzcCkgewotCQkJaWYgKHN0cmxlbihzcC0+c19uYW1lKSArIDEgPiBzZXJ2bGVuKQotCQkJCXJldHVybiBFTklfTUVNT1JZOwotCQkJc3RyY3B5KHNlcnYsIHNwLT5zX25hbWUpOwotCQl9IGVsc2UgewotCQkJc25wcmludGYobnVtc2Vydiwgc2l6ZW9mKG51bXNlcnYpLCAiJWQiLCBudG9ocyhwb3J0KSk7Ci0JCQlpZiAoc3RybGVuKG51bXNlcnYpICsgMSA+IHNlcnZsZW4pCi0JCQkJcmV0dXJuIEVOSV9NRU1PUlk7Ci0JCQlzdHJjcHkoc2VydiwgbnVtc2Vydik7Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKHNhLT5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCXY0YSA9ICh1X2ludDMyX3QpCi0JCQludG9obCgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIuc19hZGRyKTsKLQkJaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQotCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCXY0YSA+Pj0gSU5fQ0xBU1NBX05TSElGVDsKLQkJaWYgKHY0YSA9PSAwKQotCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JY2FzZSBBRl9JTkVUNjoKLQkgICAgewotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OwotCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTsKLQkJc3dpdGNoIChzaW42LT5zaW42X2FkZHIuczZfYWRkclswXSkgewotCQljYXNlIDB4MDA6Ci0JCQlpZiAoSU42X0lTX0FERFJfVjRNQVBQRUQoJnNpbjYtPnNpbjZfYWRkcikpCi0JCQkJOwotCQkJZWxzZSBpZiAoSU42X0lTX0FERFJfTE9PUEJBQ0soJnNpbjYtPnNpbjZfYWRkcikpCi0JCQkJOwotCQkJZWxzZQotCQkJCWZsYWdzIHw9IE5JX05VTUVSSUNIT1NUOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoSU42X0lTX0FERFJfTElOS0xPQ0FMKCZzaW42LT5zaW42X2FkZHIpKSB7Ci0JCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCQl9Ci0JCQllbHNlIGlmIChJTjZfSVNfQUREUl9NVUxUSUNBU1QoJnNpbjYtPnNpbjZfYWRkcikpCi0JCQkJZmxhZ3MgfD0gTklfTlVNRVJJQ0hPU1Q7Ci0JCQlicmVhazsKLQkJfQotCSAgICB9Ci0JCWJyZWFrOwotI2VuZGlmCi0JfQotCWlmIChob3N0ID09IE5VTEwgfHwgaG9zdGxlbiA9PSAwKSB7Ci0JCS8qCi0JCSAqIGRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgotCQkgKiBpbiBjYXNlIHlvdSBhcmUgd29uZGVyaW5nIGlmICImJiIgaXMgbW9yZSBjb3JyZWN0IHRoYW4KLQkJICogInx8IiBoZXJlOiBSRkMyNTUzIHNheXMgdGhhdCBob3N0ID09IE5VTEwgT1IgaG9zdGxlbiA9PSAwCi0JCSAqIG1lYW5zIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSByZXN1bHQuCi0JCSAqLwotCX0gZWxzZSBpZiAoZmxhZ3MgJiBOSV9OVU1FUklDSE9TVCkgewotCQkvKiBOVU1FUklDSE9TVCBhbmQgTkFNRVJFUUQgY29uZmxpY3RzIHdpdGggZWFjaCBvdGhlciAqLwotCQlpZiAoZmxhZ3MgJiBOSV9OQU1FUkVRRCkKLQkJCXJldHVybiBFTklfTk9IT1NUTkFNRTsKLQkJaWYgKGluZXRfbnRvcChhZmQtPmFfYWYsIGFkZHIsIG51bWFkZHIsIHNpemVvZihudW1hZGRyKSkKLQkJICAgID09IE5VTEwpCi0JCQlyZXR1cm4gRU5JX1NZU1RFTTsKLQkJaWYgKHN0cmxlbihudW1hZGRyKSArIDEgPiBob3N0bGVuKQotCQkJcmV0dXJuIEVOSV9NRU1PUlk7Ci0JCXN0cmNweShob3N0LCBudW1hZGRyKTsKLSNpZiBkZWZpbmVkKElORVQ2KSAmJiBkZWZpbmVkKE5JX1dJVEhTQ09QRUlEKQotCQlpZiAoYWZkLT5hX2FmID09IEFGX0lORVQ2ICYmCi0JCSAgICAoSU42X0lTX0FERFJfTElOS0xPQ0FMKChzdHJ1Y3QgaW42X2FkZHIgKilhZGRyKSB8fAotCQkgICAgIElONl9JU19BRERSX01VTFRJQ0FTVCgoc3RydWN0IGluNl9hZGRyICopYWRkcikpICYmCi0JCSAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYSktPnNpbjZfc2NvcGVfaWQpIHsKLSNpZm5kZWYgQUxXQVlTX1dJVEhTQ09QRQotCQkJaWYgKGZsYWdzICYgTklfV0lUSFNDT1BFSUQpCi0jZW5kaWYgLyogIUFMV0FZU19XSVRIU0NPUEUgKi8KLQkJCXsKLQkJCQljaGFyICplcCA9IHN0cmNocihob3N0LCAnXDAnKTsKLQkJCQl1bnNpZ25lZCBpbnQgaWZpbmRleCA9Ci0JCQkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhKS0+c2luNl9zY29wZV9pZDsKLQotCQkJCSplcCA9IFNDT1BFX0RFTElNSVRFUjsKLQkJCQlpZiAoKGlmX2luZGV4dG9uYW1lKGlmaW5kZXgsIGVwICsgMSkpID09IE5VTEwpCi0JCQkJCS8qIFhYWCB3aGF0IHNob3VsZCB3ZSBkbz8gKi8KLQkJCQkJc3RybmNweShlcCArIDEsICI/Pz8iLCAzKTsKLQkJCX0KLQkJfQotI2VuZGlmIC8qIElORVQ2ICovCi0JfSBlbHNlIHsKLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQkJaHAgPSBnZXRpcG5vZGVieWFkZHIoYWRkciwgYWZkLT5hX2FkZHJsZW4sIGFmZC0+YV9hZiwgJmhfZXJyb3IpOwotI2Vsc2UKLQkJaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGFmZC0+YV9hZGRybGVuLCBhZmQtPmFfYWYpOwotI2lmZGVmIEhBVkVfSF9FUlJOTwotCQloX2Vycm9yID0gaF9lcnJubzsKLSNlbHNlCi0JCWhfZXJyb3IgPSBFSU5WQUw7Ci0jZW5kaWYKLSNlbmRpZgotCi0JCWlmIChocCkgewotCQkJaWYgKGZsYWdzICYgTklfTk9GUUROKSB7Ci0JCQkJcCA9IHN0cmNocihocC0+aF9uYW1lLCAnLicpOwotCQkJCWlmIChwKSAqcCA9ICdcMCc7Ci0JCQl9Ci0JCQlpZiAoc3RybGVuKGhwLT5oX25hbWUpICsgMSA+IGhvc3RsZW4pIHsKLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQkJCQlmcmVlaG9zdGVudChocCk7Ci0jZW5kaWYKLQkJCQlyZXR1cm4gRU5JX01FTU9SWTsKLQkJCX0KLQkJCXN0cmNweShob3N0LCBocC0+aF9uYW1lKTsKLSNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKLQkJCWZyZWVob3N0ZW50KGhwKTsKLSNlbmRpZgotCQl9IGVsc2UgewotCQkJaWYgKGZsYWdzICYgTklfTkFNRVJFUUQpCi0JCQkJcmV0dXJuIEVOSV9OT0hPU1ROQU1FOwotCQkJaWYgKGluZXRfbnRvcChhZmQtPmFfYWYsIGFkZHIsIG51bWFkZHIsIHNpemVvZihudW1hZGRyKSkKLQkJCSAgICA9PSBOVUxMKQotCQkJCXJldHVybiBFTklfTk9IT1NUTkFNRTsKLQkJCWlmIChzdHJsZW4obnVtYWRkcikgKyAxID4gaG9zdGxlbikKLQkJCQlyZXR1cm4gRU5JX01FTU9SWTsKLQkJCXN0cmNweShob3N0LCBudW1hZGRyKTsKLQkJfQotCX0KLQlyZXR1cm4gU1VDQ0VTUzsKLX0KZGlmZiAtLWdpdCBhL21pc3NpbmcvaW5ldF9hdG9uLmMgYi9taXNzaW5nL2luZXRfYXRvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGIyZWViLi4wMDAwMDAwCi0tLSBhL21pc3NpbmcvaW5ldF9hdG9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEt1bmdsaWdhIFRla25pc2thCi0gKiAgICAgIEj2Z3Nrb2xhbiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qICRJZDogaW5ldF9hdG9uLmMsdiAxLjYgMjAwMy8xMS8xNiAwOTozNjo0OSBndXkgRXhwICQgKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3NpbmcvaW5ldF9hdG9uLmMsdiAxLjYgMjAwMy8xMS8xNiAwOTozNjo0OSBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0vKiBNaW5pbWFsIGltcGxlbWVudGF0aW9uIG9mIGluZXRfYXRvbi4KLSAqIENhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhaWx1cmUgYW5kIGEgbG9jYWwgYnJvYWRjYXN0IGFkZHJlc3MuICovCi0KLSNpZm5kZWYgSU5BRERSX05PTkUKLSNkZWZpbmUgSU5BRERSX05PTkUgMHhmZmZmZmZmZgotI2VuZGlmCi0KLWludAotaW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqYWRkcikKLXsKLSAgYWRkci0+c19hZGRyID0gaW5ldF9hZGRyKGNwKTsKLSAgcmV0dXJuIChhZGRyLT5zX2FkZHIgPT0gSU5BRERSX05PTkUpID8gMCA6IDE7Ci19CmRpZmYgLS1naXQgYS9taXNzaW5nL2luZXRfbnRvcC5jIGIvbWlzc2luZy9pbmV0X250b3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiYmFkNi4uMDAwMDAwMAotLS0gYS9taXNzaW5nL2luZXRfbnRvcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCi0gKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgS3VuZ2xpZ2EgVGVrbmlza2EKLSAqICAgICAgSPZnc2tvbGFuIGFuZCBpdHMgY29udHJpYnV0b3JzLgotICoKLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogJElkOiBpbmV0X250b3AuYyx2IDEuOCAyMDA1LzAyLzA5IDAyOjI1OjQ2IGd1eSBFeHAgJCAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9pbmV0X250b3AuYyx2IDEuOCAyMDA1LzAyLzA5IDAyOjI1OjQ2IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLS8qCi0gKgotICovCi0KLSNpZm5kZWYgSU42QUREUlNaCi0jZGVmaW5lIElONkFERFJTWiAgIDE2ICAgLyogSVB2NiBUX0FBQUEgKi8KLSNlbmRpZgotCi0jaWZuZGVmIElOVDE2U1oKLSNkZWZpbmUgSU5UMTZTWiAgICAgMiAgICAvKiB3b3JkIHNpemUgKi8KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbmV0X250b3BfdjQgKGNvbnN0IHZvaWQgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBjb25zdCBjaGFyIGRpZ2l0c1tdID0gIjAxMjM0NTY3ODkiOwotICAgIGludCBpOwotICAgIHN0cnVjdCBpbl9hZGRyICphZGRyID0gKHN0cnVjdCBpbl9hZGRyICopc3JjOwotICAgIHVfbG9uZyBhID0gbnRvaGwoYWRkci0+c19hZGRyKTsKLSAgICBjb25zdCBjaGFyICpvcmlnX2RzdCA9IGRzdDsKLQotICAgIGlmIChzaXplIDwgSU5FVF9BRERSU1RSTEVOKSB7Ci0JZXJybm8gPSBFTk9TUEM7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLQlpbnQgbiA9IChhID4+ICgyNCAtIGkgKiA4KSkgJiAweEZGOwotCWludCBub25femVyb3AgPSAwOwotCi0JaWYgKG5vbl96ZXJvcCB8fCBuIC8gMTAwID4gMCkgewotCSAgICAqZHN0KysgPSBkaWdpdHNbbiAvIDEwMF07Ci0JICAgIG4gJT0gMTAwOwotCSAgICBub25femVyb3AgPSAxOwotCX0KLQlpZiAobm9uX3plcm9wIHx8IG4gLyAxMCA+IDApIHsKLQkgICAgKmRzdCsrID0gZGlnaXRzW24gLyAxMF07Ci0JICAgIG4gJT0gMTA7Ci0JICAgIG5vbl96ZXJvcCA9IDE7Ci0JfQotCSpkc3QrKyA9IGRpZ2l0c1tuXTsKLQlpZiAoaSAhPSAzKQotCSAgICAqZHN0KysgPSAnLic7Ci0gICAgfQotICAgICpkc3QrKyA9ICdcMCc7Ci0gICAgcmV0dXJuIG9yaWdfZHN0OwotfQotCi0jaWZkZWYgSU5FVDYKLS8qCi0gKiBDb252ZXJ0IElQdjYgYmluYXJ5IGFkZHJlc3MgaW50byBwcmVzZW50YXRpb24gKHByaW50YWJsZSkgZm9ybWF0LgotICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbmV0X250b3BfdjYgKGNvbnN0IHVfY2hhciAqc3JjLCBjaGFyICpkc3QsIHNpemVfdCBzaXplKQotewotICAvKgotICAgKiBOb3RlIHRoYXQgaW50MzJfdCBhbmQgaW50MTZfdCBuZWVkIG9ubHkgYmUgImF0IGxlYXN0IiBsYXJnZSBlbm91Z2gKLSAgICogdG8gY29udGFpbiBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZS4gIE9uIHNvbWUgc3lzdGVtcywgbGlrZQotICAgKiBDcmF5cywgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnRlZ2VyIHZhcmlhYmxlIHdpdGggMTYgYml0cy4KLSAgICogS2VlcCB0aGlzIGluIG1pbmQgaWYgeW91IHRoaW5rIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiBjb2RlZAotICAgKiB0byB1c2UgcG9pbnRlciBvdmVybGF5cy4gIEFsbCB0aGUgd29ybGQncyBub3QgYSBWQVguCi0gICAqLwotICBjaGFyICB0bXAgW0lORVQ2X0FERFJTVFJMRU4rMV07Ci0gIGNoYXIgKnRwOwotICBzdHJ1Y3QgewotICAgIGxvbmcgYmFzZTsKLSAgICBsb25nIGxlbjsKLSAgfSBiZXN0LCBjdXI7Ci0gIHVfbG9uZyB3b3JkcyBbSU42QUREUlNaIC8gSU5UMTZTWl07Ci0gIGludCAgICBpOwotCi0gIC8qIFByZXByb2Nlc3M6Ci0gICAqICBDb3B5IHRoZSBpbnB1dCAoYnl0ZXdpc2UpIGFycmF5IGludG8gYSB3b3Jkd2lzZSBhcnJheS4KLSAgICogIEZpbmQgdGhlIGxvbmdlc3QgcnVuIG9mIDB4MDAncyBpbiBzcmNbXSBmb3IgOjogc2hvcnRoYW5kaW5nLgotICAgKi8KLSAgbWVtc2V0ICh3b3JkcywgMCwgc2l6ZW9mKHdvcmRzKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBJTjZBRERSU1o7IGkrKykKLSAgICAgIHdvcmRzW2kvMl0gfD0gKHNyY1tpXSA8PCAoKDEgLSAoaSAlIDIpKSA8PCAzKSk7Ci0KLSAgYmVzdC5iYXNlID0gLTE7Ci0gIGN1ci5iYXNlICA9IC0xOwotICBmb3IgKGkgPSAwOyBpIDwgKElONkFERFJTWiAvIElOVDE2U1opOyBpKyspCi0gIHsKLSAgICBpZiAod29yZHNbaV0gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoY3VyLmJhc2UgPT0gLTEpCi0gICAgICAgICAgIGN1ci5iYXNlID0gaSwgY3VyLmxlbiA9IDE7Ci0gICAgICBlbHNlIGN1ci5sZW4rKzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY3VyLmJhc2UgIT0gLTEpCi0gICAgewotICAgICAgaWYgKGJlc3QuYmFzZSA9PSAtMSB8fCBjdXIubGVuID4gYmVzdC5sZW4pCi0gICAgICAgICBiZXN0ID0gY3VyOwotICAgICAgY3VyLmJhc2UgPSAtMTsKLSAgICB9Ci0gIH0KLSAgaWYgKChjdXIuYmFzZSAhPSAtMSkgJiYgKGJlc3QuYmFzZSA9PSAtMSB8fCBjdXIubGVuID4gYmVzdC5sZW4pKQotICAgICBiZXN0ID0gY3VyOwotICBpZiAoYmVzdC5iYXNlICE9IC0xICYmIGJlc3QubGVuIDwgMikKLSAgICAgYmVzdC5iYXNlID0gLTE7Ci0KLSAgLyogRm9ybWF0IHRoZSByZXN1bHQuCi0gICAqLwotICB0cCA9IHRtcDsKLSAgZm9yIChpID0gMDsgaSA8IChJTjZBRERSU1ogLyBJTlQxNlNaKTsgaSsrKQotICB7Ci0gICAgLyogQXJlIHdlIGluc2lkZSB0aGUgYmVzdCBydW4gb2YgMHgwMCdzPwotICAgICAqLwotICAgIGlmIChiZXN0LmJhc2UgIT0gLTEgJiYgaSA+PSBiZXN0LmJhc2UgJiYgaSA8IChiZXN0LmJhc2UgKyBiZXN0LmxlbikpCi0gICAgewotICAgICAgaWYgKGkgPT0gYmVzdC5iYXNlKQotICAgICAgICAgKnRwKysgPSAnOic7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvKiBBcmUgd2UgZm9sbG93aW5nIGFuIGluaXRpYWwgcnVuIG9mIDB4MDBzIG9yIGFueSByZWFsIGhleD8KLSAgICAgKi8KLSAgICBpZiAoaSAhPSAwKQotICAgICAgICp0cCsrID0gJzonOwotCi0gICAgLyogSXMgdGhpcyBhZGRyZXNzIGFuIGVuY2Fwc3VsYXRlZCBJUHY0PwotICAgICAqLwotICAgIGlmIChpID09IDYgJiYgYmVzdC5iYXNlID09IDAgJiYKLSAgICAgICAgKGJlc3QubGVuID09IDYgfHwgKGJlc3QubGVuID09IDUgJiYgd29yZHNbNV0gPT0gMHhmZmZmKSkpCi0gICAgewotICAgICAgaWYgKCFpbmV0X250b3BfdjQoc3JjKzEyLCB0cCwgc2l6ZW9mKHRtcCkgLSAodHAgLSB0bXApKSkKLSAgICAgIHsKLSAgICAgICAgZXJybm8gPSBFTk9TUEM7Ci0gICAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgICB9Ci0gICAgICB0cCArPSBzdHJsZW4odHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHRwICs9IHNwcmludGYgKHRwLCAiJWxYIiwgd29yZHNbaV0pOwotICB9Ci0KLSAgLyogV2FzIGl0IGEgdHJhaWxpbmcgcnVuIG9mIDB4MDAncz8KLSAgICovCi0gIGlmIChiZXN0LmJhc2UgIT0gLTEgJiYgKGJlc3QuYmFzZSArIGJlc3QubGVuKSA9PSAoSU42QUREUlNaIC8gSU5UMTZTWikpCi0gICAgICp0cCsrID0gJzonOwotICAqdHArKyA9ICdcMCc7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LCBjb3B5LCBhbmQgd2UncmUgZG9uZS4KLSAgICovCi0gIGlmICgoc2l6ZV90KSh0cCAtIHRtcCkgPiBzaXplKQotICB7Ci0gICAgZXJybm8gPSBFTk9TUEM7Ci0gICAgcmV0dXJuIChOVUxMKTsKLSAgfQotICByZXR1cm4gc3RyY3B5IChkc3QsIHRtcCk7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0jZW5kaWYgICAvKiBJTkVUNiAqLwotCi0KLWNvbnN0IGNoYXIgKgotaW5ldF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqc3JjLCBjaGFyICpkc3QsIHNpemVfdCBzaXplKQotewotICAgIHN3aXRjaCAoYWYpIHsKLSAgICBjYXNlIEFGX0lORVQgOgotCXJldHVybiBpbmV0X250b3BfdjQgKHNyYywgZHN0LCBzaXplKTsKLSNpZmRlZiBJTkVUNgotICAgIGNhc2UgQUZfSU5FVDY6Ci0gICAgICAgICByZXR1cm4gaW5ldF9udG9wX3Y2ICgoY29uc3QgdV9jaGFyKilzcmMsIGRzdCwgc2l6ZSk7Ci0jZW5kaWYKLSAgICBkZWZhdWx0IDoKLQllcnJubyA9IEVBRk5PU1VQUE9SVDsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9taXNzaW5nL2luZXRfcHRvbi5jIGIvbWlzc2luZy9pbmV0X3B0b24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4YWJkMi4uMDAwMDAwMAotLS0gYS9taXNzaW5nL2luZXRfcHRvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KLSAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdW5nbGlnYSBUZWtuaXNrYQotICogICAgICBI9mdza29sYW4gYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiAkSWQ6IGluZXRfcHRvbi5jLHYgMS42IDIwMDMvMTEvMTYgMDk6MzY6NTEgZ3V5IEV4cCAkICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL2luZXRfcHRvbi5jLHYgMS42IDIwMDMvMTEvMTYgMDk6MzY6NTEgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLWludAotaW5ldF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICpkc3QpCi17Ci0gICAgaWYgKGFmICE9IEFGX0lORVQpIHsKLQllcnJubyA9IEVBRk5PU1VQUE9SVDsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBpbmV0X2F0b24gKHNyYywgZHN0KTsKLX0KZGlmZiAtLWdpdCBhL21pc3NpbmcvcmVzb2x2Ni5oIGIvbWlzc2luZy9yZXNvbHY2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZWUwM2UuLjAwMDAwMDAKLS0tIGEvbWlzc2luZy9yZXNvbHY2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiBSZXNvbHZlciBvcHRpb25zIGZvciBJUHY2LgotICogWFhYOiB0aGlzIHNob3VsZCBiZSBpbiBhbiBvZmZpY2FsIGluY2x1ZGUgZmlsZS4gVGhlcmUgbWF5IGJlIGNvbmZsaWN0cy4uLgotICovCi0jaWZuZGVmIEhBVkVfUkVTX1VTRV9JTkVUNgotI2RlZmluZQlSRVNfVVNFX0lORVQ2CTB4ODAwMDAwMDAJLyogdXNlL21hcCBJUHY2IGluIGdldGhvc3RieW5hbWUoKSAqLwotI2VuZGlmCmRpZmYgLS1naXQgYS9taXNzaW5nL3Jlc29sdl9leHQuaCBiL21pc3NpbmcvcmVzb2x2X2V4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmM1MzFkLi4wMDAwMDAwCi0tLSBhL21pc3NpbmcvcmVzb2x2X2V4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIE1BWFJFU09MVlNPUlQJCS8qIFhYWCAqLwotI2RlZmluZQlNQVhSRVNPTFZTT1JUCQkxMAkvKiBudW1iZXIgb2YgbmV0IHRvIHNvcnQgb24gKi8KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfUkVTX1NUQVRFX0VYVAotc3RydWN0IF9fcmVzX3N0YXRlX2V4dCB7Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgbnNhZGRyX2xpc3RbTUFYTlNdOwotCXN0cnVjdCB7Ci0JCWludCBhZjsJCS8qIGFkZHJlc3MgZmFtaWx5IGZvciBhZGRyLCBtYXNrICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCBpbl9hZGRyIGluYTsKLSNpZmRlZiBJTkVUNgotCQkJc3RydWN0IGluNl9hZGRyIGluNmE7Ci0jZW5kaWYKLQkJfSBhZGRyLCBtYXNrOwotCX0gc29ydF9saXN0W01BWFJFU09MVlNPUlRdOwotfTsKLSNlbmRpZgotCi1leHRlcm4gc3RydWN0IF9fcmVzX3N0YXRlX2V4dCBfcmVzX2V4dDsKZGlmZiAtLWdpdCBhL21pc3Npbmcvc25wcmludGYuYyBiL21pc3Npbmcvc25wcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYyYmIzMi4uMDAwMDAwMAotLS0gYS9taXNzaW5nL3NucHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NS0xOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0vKiAkSWQ6IHNucHJpbnRmLmMsdiAxLjggMjAwMy8xMS8xNiAwOTozNjo1MSBndXkgRXhwICQgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvbWlzc2luZy9zbnByaW50Zi5jLHYgMS44IDIwMDMvMTEvMTYgMDk6MzY6NTEgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8aW50ZXJmYWNlLmg+Ci0KLWVudW0gZm9ybWF0X2ZsYWdzIHsKLSAgICBtaW51c19mbGFnICAgICA9ICAxLAotICAgIHBsdXNfZmxhZyAgICAgID0gIDIsCi0gICAgc3BhY2VfZmxhZyAgICAgPSAgNCwKLSAgICBhbHRlcm5hdGVfZmxhZyA9ICA4LAotICAgIHplcm9fZmxhZyAgICAgID0gMTYKLX07Ci0KLS8qCi0gKiBDb21tb24gc3RhdGUKLSAqLwotCi1zdHJ1Y3Qgc3RhdGUgewotICB1bnNpZ25lZCBjaGFyICpzdHI7Ci0gIHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHVuc2lnbmVkIGNoYXIgKnRoZWVuZDsKLSAgc2l6ZV90IHN6OwotICBzaXplX3QgbWF4X3N6OwotICBpbnQgKCphcHBlbmRfY2hhcikoc3RydWN0IHN0YXRlICosIHVuc2lnbmVkIGNoYXIpOwotICBpbnQgKCpyZXNlcnZlKShzdHJ1Y3Qgc3RhdGUgKiwgc2l6ZV90KTsKLSAgLyogWFhYIC0gbWV0aG9kcyAqLwotfTsKLQotI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgotc3RhdGljIGludAotc25fcmVzZXJ2ZSAoc3RydWN0IHN0YXRlICpzdGF0ZSwgc2l6ZV90IG4pCi17Ci0gIHJldHVybiBzdGF0ZS0+cyArIG4gPiBzdGF0ZS0+dGhlZW5kOwotfQotCi1zdGF0aWMgaW50Ci1zbl9hcHBlbmRfY2hhciAoc3RydWN0IHN0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciBjKQotewotICBpZiAoc25fcmVzZXJ2ZSAoc3RhdGUsIDEpKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgKnN0YXRlLT5zKysgPSBjOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0jZW5kaWYKLQotI2lmIDAKLXN0YXRpYyBpbnQKLWFzX3Jlc2VydmUgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHNpemVfdCBuKQotewotICBpZiAoc3RhdGUtPnMgKyBuID4gc3RhdGUtPnRoZWVuZCkgewotICAgIGludCBvZmYgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7Ci0gICAgdW5zaWduZWQgY2hhciAqdG1wOwotCi0gICAgaWYgKHN0YXRlLT5tYXhfc3ogJiYgc3RhdGUtPnN6ID49IHN0YXRlLT5tYXhfc3opCi0gICAgICByZXR1cm4gMTsKLQotICAgIHN0YXRlLT5zeiA9IG1heChzdGF0ZS0+c3ogKiAyLCBzdGF0ZS0+c3ogKyBuKTsKLSAgICBpZiAoc3RhdGUtPm1heF9zeikKLSAgICAgIHN0YXRlLT5zeiA9IG1pbihzdGF0ZS0+c3osIHN0YXRlLT5tYXhfc3opOwotICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLT5zdHIsIHN0YXRlLT5zeik7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgcmV0dXJuIDE7Ci0gICAgc3RhdGUtPnN0ciA9IHRtcDsKLSAgICBzdGF0ZS0+cyA9IHN0YXRlLT5zdHIgKyBvZmY7Ci0gICAgc3RhdGUtPnRoZWVuZCA9IHN0YXRlLT5zdHIgKyBzdGF0ZS0+c3ogLSAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1hc19hcHBlbmRfY2hhciAoc3RydWN0IHN0YXRlICpzdGF0ZSwgdW5zaWduZWQgY2hhciBjKQotewotICBpZihhc19yZXNlcnZlIChzdGF0ZSwgMSkpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgewotICAgICpzdGF0ZS0+cysrID0gYzsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWFwcGVuZF9udW1iZXIoc3RydWN0IHN0YXRlICpzdGF0ZSwKLQkgICAgICB1bnNpZ25lZCBsb25nIG51bSwgdW5zaWduZWQgYmFzZSwgY2hhciAqcmVwLAotCSAgICAgIGludCB3aWR0aCwgaW50IHByZWMsIGludCBmbGFncywgaW50IG1pbnVzcCkKLXsKLSAgaW50IGxlbiA9IDA7Ci0gIGludCBpOwotCi0gIC8qIGdpdmVuIHByZWNpc2lvbiwgaWdub3JlIHplcm8gZmxhZyAqLwotICBpZihwcmVjICE9IC0xKQotICAgIGZsYWdzICY9IH56ZXJvX2ZsYWc7Ci0gIGVsc2UKLSAgICBwcmVjID0gMTsKLSAgLyogemVybyB2YWx1ZSB3aXRoIHplcm8gcHJlY2lzaW9uIC0+ICIiICovCi0gIGlmKHByZWMgPT0gMCAmJiBudW0gPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgZG97Ci0gICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCByZXBbbnVtICUgYmFzZV0pKQotICAgICAgcmV0dXJuIDE7Ci0gICAgbGVuKys7Ci0gICAgbnVtIC89IGJhc2U7Ci0gIH13aGlsZShudW0pOwotICBwcmVjIC09IGxlbjsKLSAgLyogcGFkIHdpdGggcHJlYyB6ZXJvcyAqLwotICB3aGlsZShwcmVjLS0gPiAwKXsKLSAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcwJykpCi0gICAgICByZXR1cm4gMTsKLSAgICBsZW4rKzsKLSAgfQotICAvKiBhZGQgbGVuZ3RoIG9mIGFsdGVybmF0ZSBwcmVmaXggKGFkZGVkIGxhdGVyKSB0byBsZW4gKi8KLSAgaWYoZmxhZ3MgJiBhbHRlcm5hdGVfZmxhZyAmJiAoYmFzZSA9PSAxNiB8fCBiYXNlID09IDgpKQotICAgIGxlbiArPSBiYXNlIC8gODsKLSAgLyogcGFkIHdpdGggemVyb3MgKi8KLSAgaWYoZmxhZ3MgJiB6ZXJvX2ZsYWcpewotICAgIHdpZHRoIC09IGxlbjsKLSAgICBpZihtaW51c3AgfHwgKGZsYWdzICYgc3BhY2VfZmxhZykgfHwgKGZsYWdzICYgcGx1c19mbGFnKSkKLSAgICAgIHdpZHRoLS07Ci0gICAgd2hpbGUod2lkdGgtLSA+IDApewotICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQotCXJldHVybiAxOwotICAgICAgbGVuKys7Ci0gICAgfQotICB9Ci0gIC8qIGFkZCBhbHRlcm5hdGUgcHJlZml4ICovCi0gIGlmKGZsYWdzICYgYWx0ZXJuYXRlX2ZsYWcgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSA4KSl7Ci0gICAgaWYoYmFzZSA9PSAxNikKLSAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgcmVwWzEwXSArIDIzKSkgLyogWFhYICovCi0JcmV0dXJuIDE7Ci0gICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQotICAgICAgcmV0dXJuIDE7Ci0gIH0KLSAgLyogYWRkIHNpZ24gKi8KLSAgaWYobWludXNwKXsKLSAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICctJykpCi0gICAgICByZXR1cm4gMTsKLSAgICBsZW4rKzsKLSAgfSBlbHNlIGlmKGZsYWdzICYgcGx1c19mbGFnKSB7Ci0gICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnKycpKQotICAgICAgcmV0dXJuIDE7Ci0gICAgbGVuKys7Ci0gIH0gZWxzZSBpZihmbGFncyAmIHNwYWNlX2ZsYWcpIHsKLSAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICcgJykpCi0gICAgICByZXR1cm4gMTsKLSAgICBsZW4rKzsKLSAgfQotICBpZihmbGFncyAmIG1pbnVzX2ZsYWcpCi0gICAgLyogc3dhcCBiZWZvcmUgcGFkZGluZyB3aXRoIHNwYWNlcyAqLwotICAgIGZvcihpID0gMDsgaSA8IGxlbiAvIDI7IGkrKyl7Ci0gICAgICBjaGFyIGMgPSBzdGF0ZS0+c1staS0xXTsKLSAgICAgIHN0YXRlLT5zWy1pLTFdID0gc3RhdGUtPnNbLWxlbitpXTsKLSAgICAgIHN0YXRlLT5zWy1sZW4raV0gPSBjOwotICAgIH0KLSAgd2lkdGggLT0gbGVuOwotICB3aGlsZSh3aWR0aC0tID4gMCl7Ci0gICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAgJyAnKSkKLSAgICAgIHJldHVybiAxOwotICAgIGxlbisrOwotICB9Ci0gIGlmKCEoZmxhZ3MgJiBtaW51c19mbGFnKSkKLSAgICAvKiBzd2FwIGFmdGVyIHBhZGRpbmcgd2l0aCBzcGFjZXMgKi8KLSAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspewotICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07Ci0gICAgICBzdGF0ZS0+c1staS0xXSA9IHN0YXRlLT5zWy1sZW4raV07Ci0gICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWFwcGVuZF9zdHJpbmcgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCi0JICAgICAgIHVuc2lnbmVkIGNoYXIgKmFyZywKLQkgICAgICAgaW50IHdpZHRoLAotCSAgICAgICBpbnQgcHJlYywKLQkgICAgICAgaW50IGZsYWdzKQotewotICBpZihwcmVjICE9IC0xKQotICAgIHdpZHRoIC09IHByZWM7Ci0gIGVsc2UKLSAgICB3aWR0aCAtPSBzdHJsZW4oKGNoYXIgKilhcmcpOwotICBpZighKGZsYWdzICYgbWludXNfZmxhZykpCi0gICAgd2hpbGUod2lkdGgtLSA+IDApCi0gICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQotCXJldHVybiAxOwotICBpZiAocHJlYyAhPSAtMSkgewotICAgIHdoaWxlICgqYXJnICYmIHByZWMtLSkKLSAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAqYXJnKyspKQotCXJldHVybiAxOwotICB9IGVsc2UgewotICAgIHdoaWxlICgqYXJnKQotICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICphcmcrKykpCi0JcmV0dXJuIDE7Ci0gIH0KLSAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQotICAgIHdoaWxlKHdpZHRoLS0gPiAwKQotICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKLQlyZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWFwcGVuZF9jaGFyKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCi0JICAgIHVuc2lnbmVkIGNoYXIgYXJnLAotCSAgICBpbnQgd2lkdGgsCi0JICAgIGludCBmbGFncykKLXsKLSAgd2hpbGUoIShmbGFncyAmIG1pbnVzX2ZsYWcpICYmIC0td2lkdGggPiAwKQotICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCi0gICAgICByZXR1cm4gMTsKLQotICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBhcmcpKQotICAgIHJldHVybiAxOwotICB3aGlsZSgoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAtLXdpZHRoID4gMCkKLSAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIGNhbid0IGJlIG1hZGUgaW50byBhIGZ1bmN0aW9uLi4uCi0gKi8KLQotI2RlZmluZSBQQVJTRV9JTlRfRk9STUFUKHJlcywgYXJnLCB1bnNpZykgXAotaWYgKGxvbmdfZmxhZykgXAotICAgICByZXMgPSAodW5zaWcgbG9uZyl2YV9hcmcoYXJnLCB1bnNpZyBsb25nKTsgXAotZWxzZSBpZiAoc2hvcnRfZmxhZykgXAotICAgICByZXMgPSAodW5zaWcgc2hvcnQpdmFfYXJnKGFyZywgdW5zaWcgaW50KTsgXAotZWxzZSBcCi0gICAgIHJlcyA9ICh1bnNpZyBpbnQpdmFfYXJnKGFyZywgdW5zaWcgaW50KQotCi0vKgotICogenl4cHJpbnRmIC0gcmV0dXJuIDAgb3IgLTEKLSAqLwotCi1zdGF0aWMgaW50Ci14eXpwcmludGYgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgKmNoYXJfZm9ybWF0LCB2YV9saXN0IGFwKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpmb3JtYXQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWNoYXJfZm9ybWF0OwotICB1bnNpZ25lZCBjaGFyIGM7Ci0KLSAgd2hpbGUoKGMgPSAqZm9ybWF0KyspKSB7Ci0gICAgaWYgKGMgPT0gJyUnKSB7Ci0gICAgICBpbnQgZmxhZ3MgICAgICA9IDA7Ci0gICAgICBpbnQgd2lkdGggICAgICA9IDA7Ci0gICAgICBpbnQgcHJlYyAgICAgICA9IC0xOwotICAgICAgaW50IGxvbmdfZmxhZyAgPSAwOwotICAgICAgaW50IHNob3J0X2ZsYWcgPSAwOwotCi0gICAgICAvKiBmbGFncyAqLwotICAgICAgd2hpbGUoKGMgPSAqZm9ybWF0KyspKXsKLQlpZihjID09ICctJykKLQkgIGZsYWdzIHw9IG1pbnVzX2ZsYWc7Ci0JZWxzZSBpZihjID09ICcrJykKLQkgIGZsYWdzIHw9IHBsdXNfZmxhZzsKLQllbHNlIGlmKGMgPT0gJyAnKQotCSAgZmxhZ3MgfD0gc3BhY2VfZmxhZzsKLQllbHNlIGlmKGMgPT0gJyMnKQotCSAgZmxhZ3MgfD0gYWx0ZXJuYXRlX2ZsYWc7Ci0JZWxzZSBpZihjID09ICcwJykKLQkgIGZsYWdzIHw9IHplcm9fZmxhZzsKLQllbHNlCi0JICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYoKGZsYWdzICYgc3BhY2VfZmxhZykgJiYgKGZsYWdzICYgcGx1c19mbGFnKSkKLQlmbGFncyBePSBzcGFjZV9mbGFnOwotCi0gICAgICBpZigoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAoZmxhZ3MgJiB6ZXJvX2ZsYWcpKQotCWZsYWdzIF49IHplcm9fZmxhZzsKLQotICAgICAgLyogd2lkdGggKi8KLSAgICAgIGlmIChpc2RpZ2l0KGMpKQotCWRvIHsKLQkgIHdpZHRoID0gd2lkdGggKiAxMCArIGMgLSAnMCc7Ci0JICBjID0gKmZvcm1hdCsrOwotCX0gd2hpbGUoaXNkaWdpdChjKSk7Ci0gICAgICBlbHNlIGlmKGMgPT0gJyonKSB7Ci0Jd2lkdGggPSB2YV9hcmcoYXAsIGludCk7Ci0JYyA9ICpmb3JtYXQrKzsKLSAgICAgIH0KLQotICAgICAgLyogcHJlY2lzaW9uICovCi0gICAgICBpZiAoYyA9PSAnLicpIHsKLQlwcmVjID0gMDsKLQljID0gKmZvcm1hdCsrOwotCWlmIChpc2RpZ2l0KGMpKQotCSAgZG8gewotCSAgICBwcmVjID0gcHJlYyAqIDEwICsgYyAtICcwJzsKLQkgICAgYyA9ICpmb3JtYXQrKzsKLQkgIH0gd2hpbGUoaXNkaWdpdChjKSk7Ci0JZWxzZSBpZiAoYyA9PSAnKicpIHsKLQkgIHByZWMgPSB2YV9hcmcoYXAsIGludCk7Ci0JICBjID0gKmZvcm1hdCsrOwotCX0KLSAgICAgIH0KLQotICAgICAgLyogc2l6ZSAqLwotCi0gICAgICBpZiAoYyA9PSAnaCcpIHsKLQlzaG9ydF9mbGFnID0gMTsKLQljID0gKmZvcm1hdCsrOwotICAgICAgfSBlbHNlIGlmIChjID09ICdsJykgewotCWxvbmdfZmxhZyA9IDE7Ci0JYyA9ICpmb3JtYXQrKzsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICBjYXNlICdjJyA6Ci0JaWYoYXBwZW5kX2NoYXIoc3RhdGUsIHZhX2FyZyhhcCwgaW50KSwgd2lkdGgsIGZsYWdzKSkKLQkgIHJldHVybiAtMTsKLQlicmVhazsKLSAgICAgIGNhc2UgJ3MnIDoKLQlpZiAoYXBwZW5kX3N0cmluZyhzdGF0ZSwKLQkJCSAgdmFfYXJnKGFwLCB1bnNpZ25lZCBjaGFyKiksCi0JCQkgIHdpZHRoLAotCQkJICBwcmVjLAotCQkJICBmbGFncykpCi0JICByZXR1cm4gLTE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdkJyA6Ci0gICAgICBjYXNlICdpJyA6IHsKLQlsb25nIGFyZzsKLQl1bnNpZ25lZCBsb25nIG51bTsKLQlpbnQgbWludXNwID0gMDsKLQotCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgc2lnbmVkKTsKLQotCWlmIChhcmcgPCAwKSB7Ci0JICBtaW51c3AgPSAxOwotCSAgbnVtID0gLWFyZzsKLQl9IGVsc2UKLQkgIG51bSA9IGFyZzsKLQotCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgbnVtLCAxMCwgIjAxMjM0NTY3ODkiLAotCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCBtaW51c3ApKQotCSAgcmV0dXJuIC0xOwotCWJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAndScgOiB7Ci0JdW5zaWduZWQgbG9uZyBhcmc7Ci0KLQlQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKLQotCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAxMCwgIjAxMjM0NTY3ODkiLAotCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKLQkgIHJldHVybiAtMTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJ28nIDogewotCXVuc2lnbmVkIGxvbmcgYXJnOwotCi0JUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7Ci0KLQlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMDEwLCAiMDEyMzQ1NjciLAotCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKLQkgIHJldHVybiAtMTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJ3gnIDogewotCXVuc2lnbmVkIGxvbmcgYXJnOwotCi0JUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7Ci0KLQlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlhYmNkZWYiLAotCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKLQkgIHJldHVybiAtMTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJ1gnIDp7Ci0JdW5zaWduZWQgbG9uZyBhcmc7Ci0KLQlQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHVuc2lnbmVkKTsKLQotCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OUFCQ0RFRiIsCi0JCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQotCSAgcmV0dXJuIC0xOwotCWJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAncCcgOiB7Ci0JdW5zaWduZWQgbG9uZyBhcmcgPSAodW5zaWduZWQgbG9uZyl2YV9hcmcoYXAsIHZvaWQqKTsKLQotCWlmIChhcHBlbmRfbnVtYmVyIChzdGF0ZSwgYXJnLCAweDEwLCAiMDEyMzQ1Njc4OUFCQ0RFRiIsCi0JCQkgICB3aWR0aCwgcHJlYywgZmxhZ3MsIDApKQotCSAgcmV0dXJuIC0xOwotCWJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAnbicgOiB7Ci0JaW50ICphcmcgPSB2YV9hcmcoYXAsIGludCopOwotCSphcmcgPSBzdGF0ZS0+cyAtIHN0YXRlLT5zdHI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlICdcMCcgOgotCSAgLS1mb3JtYXQ7Ci0JICAvKiBGQUxMVEhST1VHSCAqLwotICAgICAgY2FzZSAnJScgOgotCWlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIGMpKQotCSAgcmV0dXJuIC0xOwotCWJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0JaWYgKCAgICgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJyUnKQotCSAgICB8fCAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIGMpKQotCSAgcmV0dXJuIC0xOwotCWJyZWFrOwotICAgICAgfQotICAgIH0gZWxzZQotICAgICAgaWYgKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsIGMpKQotCXJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBIQVZFX1NOUFJJTlRGCi1pbnQKLXNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgaW50IHJldDsKLQotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICByZXQgPSB2c25wcmludGYgKHN0ciwgc3osIGZvcm1hdCwgYXJncyk7Ci0KLSNpZmRlZiBQQVJBTk9JQQotICB7Ci0gICAgaW50IHJldDI7Ci0gICAgY2hhciAqdG1wOwotCi0gICAgdG1wID0gbWFsbG9jIChzeik7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKQotICAgICAgYWJvcnQgKCk7Ci0KLSAgICByZXQyID0gdnNwcmludGYgKHRtcCwgZm9ybWF0LCBhcmdzKTsKLSAgICBpZiAocmV0ICE9IHJldDIgfHwgc3RyY21wKHN0ciwgdG1wKSkKLSAgICAgIGFib3J0ICgpOwotICAgIGZyZWUgKHRtcCk7Ci0gIH0KLSNlbmRpZgotCi0gIHZhX2VuZChhcmdzKTsKLSAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0jaWYgMAotI2lmbmRlZiBIQVZFX0FTUFJJTlRGCi1pbnQKLWFzcHJpbnRmIChjaGFyICoqcmV0LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgdmFsOwotCi0gIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIHZhbCA9IHZhc3ByaW50ZiAocmV0LCBmb3JtYXQsIGFyZ3MpOwotCi0jaWZkZWYgUEFSQU5PSUEKLSAgewotICAgIGludCByZXQyOwotICAgIGNoYXIgKnRtcDsKLSAgICB0bXAgPSBtYWxsb2MgKHZhbCArIDEpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotCi0gICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7Ci0gICAgaWYgKHZhbCAhPSByZXQyIHx8IHN0cmNtcCgqcmV0LCB0bXApKQotICAgICAgYWJvcnQgKCk7Ci0gICAgZnJlZSAodG1wKTsKLSAgfQotI2VuZGlmCi0KLSAgdmFfZW5kKGFyZ3MpOwotICByZXR1cm4gdmFsOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9BU05QUklOVEYKLWludAotYXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgdmFsOwotCi0gIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7Ci0gIHZhbCA9IHZhc25wcmludGYgKHJldCwgbWF4X3N6LCBmb3JtYXQsIGFyZ3MpOwotCi0jaWZkZWYgUEFSQU5PSUEKLSAgewotICAgIGludCByZXQyOwotICAgIGNoYXIgKnRtcDsKLSAgICB0bXAgPSBtYWxsb2MgKHZhbCArIDEpOwotICAgIGlmICh0bXAgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotCi0gICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7Ci0gICAgaWYgKHZhbCAhPSByZXQyIHx8IHN0cmNtcCgqcmV0LCB0bXApKQotICAgICAgYWJvcnQgKCk7Ci0gICAgZnJlZSAodG1wKTsKLSAgfQotI2VuZGlmCi0KLSAgdmFfZW5kKGFyZ3MpOwotICByZXR1cm4gdmFsOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9WQVNQUklOVEYKLWludAotdmFzcHJpbnRmIChjaGFyICoqcmV0LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgcmV0dXJuIHZhc25wcmludGYgKHJldCwgMCwgZm9ybWF0LCBhcmdzKTsKLX0KLSNlbmRpZgotCi0KLSNpZm5kZWYgSEFWRV9WQVNOUFJJTlRGCi1pbnQKLXZhc25wcmludGYgKGNoYXIgKipyZXQsIHNpemVfdCBtYXhfc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQotewotICBpbnQgc3Q7Ci0gIHNpemVfdCBsZW47Ci0gIHN0cnVjdCBzdGF0ZSBzdGF0ZTsKLQotICBzdGF0ZS5tYXhfc3ogPSBtYXhfc3o7Ci0gIHN0YXRlLnN6ICAgICA9IDE7Ci0gIHN0YXRlLnN0ciAgICA9IG1hbGxvYyhzdGF0ZS5zeik7Ci0gIGlmIChzdGF0ZS5zdHIgPT0gTlVMTCkgewotICAgICpyZXQgPSBOVUxMOwotICAgIHJldHVybiAtMTsKLSAgfQotICBzdGF0ZS5zID0gc3RhdGUuc3RyOwotICBzdGF0ZS50aGVlbmQgPSBzdGF0ZS5zICsgc3RhdGUuc3ogLSAxOwotICBzdGF0ZS5hcHBlbmRfY2hhciA9IGFzX2FwcGVuZF9jaGFyOwotICBzdGF0ZS5yZXNlcnZlICAgICA9IGFzX3Jlc2VydmU7Ci0KLSAgc3QgPSB4eXpwcmludGYgKCZzdGF0ZSwgZm9ybWF0LCBhcmdzKTsKLSAgaWYgKHN0KSB7Ci0gICAgZnJlZSAoc3RhdGUuc3RyKTsKLSAgICAqcmV0ID0gTlVMTDsKLSAgICByZXR1cm4gLTE7Ci0gIH0gZWxzZSB7Ci0gICAgY2hhciAqdG1wOwotCi0gICAgKnN0YXRlLnMgPSAnXDAnOwotICAgIGxlbiA9IHN0YXRlLnMgLSBzdGF0ZS5zdHI7Ci0gICAgdG1wID0gcmVhbGxvYyAoc3RhdGUuc3RyLCBsZW4rMSk7Ci0gICAgaWYgKHRtcCA9PSBOVUxMKSB7Ci0gICAgICBmcmVlIChzdGF0ZS5zdHIpOwotICAgICAgKnJldCA9IE5VTEw7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgICpyZXQgPSB0bXA7Ci0gICAgcmV0dXJuIGxlbjsKLSAgfQotfQotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1ZTTlBSSU5URgotaW50Ci12c25wcmludGYgKGNoYXIgKnN0ciwgc2l6ZV90IHN6LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKLXsKLSAgc3RydWN0IHN0YXRlIHN0YXRlOwotICBpbnQgcmV0OwotICB1bnNpZ25lZCBjaGFyICp1c3RyID0gKHVuc2lnbmVkIGNoYXIgKilzdHI7Ci0KLSAgc3RhdGUubWF4X3N6ID0gMDsKLSAgc3RhdGUuc3ogICAgID0gc3o7Ci0gIHN0YXRlLnN0ciAgICA9IHVzdHI7Ci0gIHN0YXRlLnMgICAgICA9IHVzdHI7Ci0gIHN0YXRlLnRoZWVuZCA9IHVzdHIgKyBzeiAtIDE7Ci0gIHN0YXRlLmFwcGVuZF9jaGFyID0gc25fYXBwZW5kX2NoYXI7Ci0gIHN0YXRlLnJlc2VydmUgICAgID0gc25fcmVzZXJ2ZTsKLQotICByZXQgPSB4eXpwcmludGYgKCZzdGF0ZSwgZm9ybWF0LCBhcmdzKTsKLSAgKnN0YXRlLnMgPSAnXDAnOwotICBpZiAocmV0KQotICAgIHJldHVybiBzejsKLSAgZWxzZQotICAgIHJldHVybiBzdGF0ZS5zIC0gc3RhdGUuc3RyOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL21pc3Npbmcvc29ja3N0b3JhZ2UuaCBiL21pc3Npbmcvc29ja3N0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTczMzMyOC4uMDAwMDAwMAotLS0gYS9taXNzaW5nL3NvY2tzdG9yYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi1zdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7Ci0jaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQl1X2ludDhfdCBzc19sZW47Ci0JdV9pbnQ4X3Qgc3NfZmFtaWx5OwotCXVfaW50OF90IGZpbGxbMTI2XTsKLSNlbHNlCi0JdV9pbnQ4X3Qgc3NfZmFtaWx5OwotCXVfaW50OF90IGZpbGxbMTI3XTsKLSNlbmRpZiAvKiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLwotfTsKZGlmZiAtLWdpdCBhL21pc3Npbmcvc3RyZHVwLmMgYi9taXNzaW5nL3N0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDNjM2IyLi4wMDAwMDAwCi0tLSBhL21pc3Npbmcvc3RyZHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3Npbmcvc3RyZHVwLmMsdiAxLjEgMjAwMS8wMS8yMCAwNzoyNjowOCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLWNoYXIgKgotc3RyZHVwKHN0cikKLQljb25zdCBjaGFyICpzdHI7Ci17Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpjb3B5OwotCi0JbGVuID0gc3RybGVuKHN0cikgKyAxOwotCWlmICgoY29weSA9IG1hbGxvYyhsZW4pKSA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCW1lbWNweShjb3B5LCBzdHIsIGxlbik7Ci0JcmV0dXJuIChjb3B5KTsKLX0KZGlmZiAtLWdpdCBhL21pc3Npbmcvc3RybGNhdC5jIGIvbWlzc2luZy9zdHJsY2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTJlOGEuLjAwMDAwMDAKLS0tIGEvbWlzc2luZy9zdHJsY2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgkkTmV0QlNEOiBzdHJsY2F0LmMsdiAxLjUgMTk5OS8wOS8yMCAwNDozOTo0NyBsdWtlbSBFeHAgJAkqLwotLyoJZnJvbSBPcGVuQlNEOiBzdHJsY2F0LmMsdiAxLjIgMTk5OS8wNi8xNyAxNjoyODo1OCBtaWxsZXJ0IEV4cCAJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKLSAqIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKLSAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAotICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3Npbmcvc3RybGNhdC5jLHYgMS41IDIwMDMvMTEvMTYgMDk6MzY6NTEgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSCAKLSNpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKgotICogQXBwZW5kcyBzcmMgdG8gc3RyaW5nIGRzdCBvZiBzaXplIHNpeiAodW5saWtlIHN0cm5jYXQsIHNpeiBpcyB0aGUKLSAqIGZ1bGwgc2l6ZSBvZiBkc3QsIG5vdCBzcGFjZSBsZWZ0KS4gIEF0IG1vc3Qgc2l6LTEgY2hhcmFjdGVycwotICogd2lsbCBiZSBjb3BpZWQuICBBbHdheXMgTlVMIHRlcm1pbmF0ZXMgKHVubGVzcyBzaXogPT0gMCkuCi0gKiBSZXR1cm5zIHN0cmxlbihzcmMpOyBpZiByZXR2YWwgPj0gc2l6LCB0cnVuY2F0aW9uIG9jY3VycmVkLgotICovCi1zaXplX3QKLXN0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXopCi17Ci0JcmVnaXN0ZXIgY2hhciAqZCA9IGRzdDsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpzID0gc3JjOwotCXJlZ2lzdGVyIHNpemVfdCBuID0gc2l6OwotCXNpemVfdCBkbGVuOwotCi0JLyogRmluZCB0aGUgZW5kIG9mIGRzdCBhbmQgYWRqdXN0IGJ5dGVzIGxlZnQgYnV0IGRvbid0IGdvIHBhc3QgZW5kICovCi0Jd2hpbGUgKCpkICE9ICdcMCcgJiYgbi0tICE9IDApCi0JCWQrKzsKLQlkbGVuID0gZCAtIGRzdDsKLQluID0gc2l6IC0gZGxlbjsKLQotCWlmIChuID09IDApCi0JCXJldHVybihkbGVuICsgc3RybGVuKHMpKTsKLQl3aGlsZSAoKnMgIT0gJ1wwJykgewotCQlpZiAobiAhPSAxKSB7Ci0JCQkqZCsrID0gKnM7Ci0JCQluLS07Ci0JCX0KLQkJcysrOwotCX0KLQkqZCA9ICdcMCc7Ci0KLQlyZXR1cm4oZGxlbiArIChzIC0gc3JjKSk7CS8qIGNvdW50IGRvZXMgbm90IGluY2x1ZGUgTlVMICovCi19CmRpZmYgLS1naXQgYS9taXNzaW5nL3N0cmxjcHkuYyBiL21pc3Npbmcvc3RybGNweS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE4MDlhLi4wMDAwMDAwCi0tLSBhL21pc3Npbmcvc3RybGNweS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoJJE5ldEJTRDogc3RybGNweS5jLHYgMS41IDE5OTkvMDkvMjAgMDQ6Mzk6NDcgbHVrZW0gRXhwICQJKi8KLS8qCWZyb20gT3BlbkJTRDogc3RybGNweS5jLHYgMS40IDE5OTkvMDUvMDEgMTg6NTY6NDEgbWlsbGVydCBFeHAgCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTggVG9kZCBDLiBNaWxsZXIgPFRvZGQuTWlsbGVyQGNvdXJ0ZXNhbi5jb20+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCi0gKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7Ci0gKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCi0gKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9taXNzaW5nL3N0cmxjcHkuYyx2IDEuNSAyMDAzLzExLzE2IDA5OjM2OjUyIGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0ggCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyoKLSAqIENvcHkgc3JjIHRvIHN0cmluZyBkc3Qgb2Ygc2l6ZSBzaXouICBBdCBtb3N0IHNpei0xIGNoYXJhY3RlcnMKLSAqIHdpbGwgYmUgY29waWVkLiAgQWx3YXlzIE5VTCB0ZXJtaW5hdGVzICh1bmxlc3Mgc2l6ID09IDApLgotICogUmV0dXJucyBzdHJsZW4oc3JjKTsgaWYgcmV0dmFsID49IHNpeiwgdHJ1bmNhdGlvbiBvY2N1cnJlZC4KLSAqLwotc2l6ZV90Ci1zdHJsY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6KQotewotCXJlZ2lzdGVyIGNoYXIgKmQgPSBkc3Q7Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHNyYzsKLQlyZWdpc3RlciBzaXplX3QgbiA9IHNpejsKLQotCS8qIENvcHkgYXMgbWFueSBieXRlcyBhcyB3aWxsIGZpdCAqLwotCWlmIChuICE9IDAgJiYgLS1uICE9IDApIHsKLQkJZG8gewotCQkJaWYgKCgqZCsrID0gKnMrKykgPT0gMCkKLQkJCQlicmVhazsKLQkJfSB3aGlsZSAoLS1uICE9IDApOwotCX0KLQotCS8qIE5vdCBlbm91Z2ggcm9vbSBpbiBkc3QsIGFkZCBOVUwgYW5kIHRyYXZlcnNlIHJlc3Qgb2Ygc3JjICovCi0JaWYgKG4gPT0gMCkgewotCQlpZiAoc2l6ICE9IDApCi0JCQkqZCA9ICdcMCc7CQkvKiBOVUwtdGVybWluYXRlIGRzdCAqLwotCQl3aGlsZSAoKnMrKykKLQkJCTsKLQl9Ci0KLQlyZXR1cm4ocyAtIHNyYyAtIDEpOwkvKiBjb3VudCBkb2VzIG5vdCBpbmNsdWRlIE5VTCAqLwotfQpkaWZmIC0tZ2l0IGEvbWlzc2luZy9zdHJzZXAuYyBiL21pc3Npbmcvc3Ryc2VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZmI2YjIuLjAwMDAwMDAKLS0tIGEvbWlzc2luZy9zdHJzZXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21pc3Npbmcvc3Ryc2VwLmMsdiAxLjMgMjAwMy8wMy8yNSAwODozMzo0OCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0ggCi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotLyoKLSAqIEdldCBuZXh0IHRva2VuIGZyb20gc3RyaW5nICpzdHJpbmdwLCB3aGVyZSB0b2tlbnMgYXJlIHBvc3NpYmx5LWVtcHR5Ci0gKiBzdHJpbmdzIHNlcGFyYXRlZCBieSBjaGFyYWN0ZXJzIGZyb20gZGVsaW0uCi0gKgotICogV3JpdGVzIE5VTHMgaW50byB0aGUgc3RyaW5nIGF0ICpzdHJpbmdwIHRvIGVuZCB0b2tlbnMuCi0gKiBkZWxpbSBuZWVkIG5vdCByZW1haW4gY29uc3RhbnQgZnJvbSBjYWxsIHRvIGNhbGwuCi0gKiBPbiByZXR1cm4sICpzdHJpbmdwIHBvaW50cyBwYXN0IHRoZSBsYXN0IE5VTCB3cml0dGVuIChpZiB0aGVyZSBtaWdodAotICogYmUgZnVydGhlciB0b2tlbnMpLCBvciBpcyBOVUxMIChpZiB0aGVyZSBhcmUgZGVmaW5pdGVseSBubyBtb3JlIHRva2VucykuCi0gKgotICogSWYgKnN0cmluZ3AgaXMgTlVMTCwgc3Ryc2VwIHJldHVybnMgTlVMTC4KLSAqLwotY2hhciAqCi1zdHJzZXAoY2hhciAqKnN0cmluZ3AsIGNvbnN0IGNoYXIgKmRlbGltKQotewotCXJlZ2lzdGVyIGNoYXIgKnM7Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqc3BhbnA7Ci0JcmVnaXN0ZXIgaW50IGMsIHNjOwotCWNoYXIgKnRvazsKLQotCWlmICgocyA9ICpzdHJpbmdwKSA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCWZvciAodG9rID0gczs7KSB7Ci0JCWMgPSAqcysrOwotCQlzcGFucCA9IGRlbGltOwotCQlkbyB7Ci0JCQlpZiAoKHNjID0gKnNwYW5wKyspID09IGMpIHsKLQkJCQlpZiAoYyA9PSAwKQotCQkJCQlzID0gTlVMTDsKLQkJCQllbHNlCi0JCQkJCXNbLTFdID0gMDsKLQkJCQkqc3RyaW5ncCA9IHM7Ci0JCQkJcmV0dXJuICh0b2spOwotCQkJfQotCQl9IHdoaWxlIChzYyAhPSAwKTsKLQl9Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQpkaWZmIC0tZ2l0IGEvbWtkZXAgYi9ta2RlcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmE5YzIyMS4uMDAwMDAwMAotLS0gYS9ta2RlcAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jIS9iaW4vc2ggLQotIwotIyBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYKLSMJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotIyBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCi0jIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgYXQgQmVya2VsZXkuIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5Ci0jIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKLSMgaXMgcHJvdmlkZWQgYGBhcyBpcycnIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgotIwotIwlAKCMpbWtkZXAuc2gJNS4xMSAoQmVya2VsZXkpIDUvNS84OAotIwotCi1QQVRIPS9iaW46L3Vzci9iaW46L3Vzci91Y2I6L3Vzci9sb2NhbDovdXNyL2xvY2FsL2JpbgotZXhwb3J0IFBBVEgKLQotTUFLRT1NYWtlZmlsZQkJCSMgZGVmYXVsdCBtYWtlZmlsZSBuYW1lIGlzICJNYWtlZmlsZSIKLUNDPWNjCQkJCSMgZGVmYXVsdCBDIGNvbXBpbGVyIGlzICJjYyIKLQotd2hpbGUgOgotCWRvIGNhc2UgIiQxIiBpbgotCQkjIC1jIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgQyBjb21waWxlcgotCQktYykKLQkJCUNDPSQyCi0JCQlzaGlmdDsgc2hpZnQgOzsKLQotCQkjIC1mIGFsbG93cyB5b3UgdG8gc2VsZWN0IGEgbWFrZWZpbGUgbmFtZQotCQktZikKLQkJCU1BS0U9JDIKLQkJCXNoaWZ0OyBzaGlmdCA7OwotCi0JCSMgdGhlIC1wIGZsYWcgcHJvZHVjZXMgInByb2dyYW06IHByb2dyYW0uYyIgc3R5bGUgZGVwZW5kZW5jaWVzCi0JCSMgc28gLm8ncyBkb24ndCBnZXQgcHJvZHVjZWQKLQkJLXApCi0JCQlTRUQ9J3M7XC5vOzsnCi0JCQlzaGlmdCA7OwotCQkqKQotCQkJYnJlYWsgOzsKLQllc2FjCi1kb25lCi0KLWlmIFsgJCMgPSAwIF0gOyB0aGVuCi0JZWNobyAndXNhZ2U6IG1rZGVwIFstcF0gWy1jIGNjXSBbLWYgbWFrZWZpbGVdIFtmbGFnc10gZmlsZSAuLi4nCi0JZXhpdCAxCi1maQotCi1pZiBbICEgLXcgJE1BS0UgXTsgdGhlbgotCWVjaG8gIm1rZGVwOiBubyB3cml0ZWFibGUgZmlsZSBcIiRNQUtFXCIiCi0JZXhpdCAxCi1maQotCi1UTVA9L3RtcC9ta2RlcCQkCi0KLXRyYXAgJ3JtIC1mICRUTVAgOyBleGl0IDEnIDEgMiAzIDEzIDE1Ci0KLWNwICRNQUtFICR7TUFLRX0uYmFrCi0KLXNlZCAtZSAnL0RPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkZCcgPCAkTUFLRSA+ICRUTVAKLQotY2F0IDw8IF9FT0ZfID4+ICRUTVAKLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotX0VPRl8KLQotIyBJZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3QgaGF2ZSAtTSwgYWRkIGl0LiAgSWYgeW91IGNhbid0LCB0aGUgbmV4dCB0d28KLSMgbGluZXMgd2lsbCB0cnkgYW5kIHJlcGxhY2UgdGhlICJjYyAtTSIuICBUaGUgcmVhbCBwcm9ibGVtIGlzIHRoYXQgdGhpcwotIyBoYWNrIGNhbid0IGRlYWwgd2l0aCBhbnl0aGluZyB0aGF0IHJlcXVpcmVzIGEgc2VhcmNoIHBhdGgsIGFuZCBkb2Vzbid0Ci0jIGV2ZW4gdHJ5IGZvciBhbnl0aGluZyB1c2luZyBicmFja2V0ICg8Pikgc3ludGF4LgotIwotIyBlZ3JlcCAnXiNpbmNsdWRlWyAJXSoiLioiJyAvZGV2L251bGwgJCogfAotIyBzZWQgLWUgJ3MvOlteIl0qIlwoW14iXSpcKSIuKi86IFwxLycgLWUgJ3MvXC5jLy5vLycgfAotCi0jIFhYWCB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIHRoaW5ncyBsaWtlICItRERFQ0xXQUlUU1RBVFVTPXVuaW9uXCB3YWl0IgotJENDIC1NICQqIHwKLXNlZCAiCi0JczsgXC4vOyA7ZwotCSRTRUQiIHwKLWF3ayAnewotCWlmICgkMSAhPSBwcmV2KSB7Ci0JCWlmIChyZWMgIT0gIiIpCi0JCQlwcmludCByZWM7Ci0JCXJlYyA9ICQwOwotCQlwcmV2ID0gJDE7Ci0JfQotCWVsc2UgewotCQlpZiAobGVuZ3RoKHJlYyAkMikgPiA3OCkgewotCQkJcHJpbnQgcmVjOwotCQkJcmVjID0gJDA7Ci0JCX0KLQkJZWxzZQotCQkJcmVjID0gcmVjICIgIiAkMgotCX0KLX0KLUVORCB7Ci0JcHJpbnQgcmVjCi19JyA+PiAkVE1QCi0KLWNhdCA8PCBfRU9GXyA+PiAkVE1QCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotX0VPRl8KLQotIyBjb3B5IHRvIHByZXNlcnZlIHBlcm1pc3Npb25zCi1jcCAkVE1QICRNQUtFCi1ybSAtZiAke01BS0V9LmJhayAkVE1QCi1leGl0IDAKZGlmZiAtLWdpdCBhL21wbHMuaCBiL21wbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjlmYzljOS4uMDAwMDAwMAotLS0gYS9tcGxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL21wbHMuaCx2IDEuMSAyMDA0LzA2LzE0IDE0OjQ3OjU4IGhhbm5lcyBFeHAgJCAoTEJMKQotICogQ29weXJpZ2h0IChDKSAyMDAxIFdJREUgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNkZWZpbmUgTEFCRUxfTUFTSwkweGZmZmZmMDAwCi0jZGVmaW5lIExBQkVMX1NISUZUCTEyCi0jZGVmaW5lCUVYUF9NQVNLCTB4MDAwMDBlMDAKLSNkZWZpbmUgRVhQX1NISUZUCTkKLSNkZWZpbmUJU1RBQ0tfTUFTSwkweDAwMDAwMTAwCi0jZGVmaW5lIFNUQUNLX1NISUZUCTgKLSNkZWZpbmUgVFRMX01BU0sJMHgwMDAwMDBmZgotI2RlZmluZSBUVExfU0hJRlQJMAotCi0jZGVmaW5lIE1QTFNfTEFCRUwoeCkJKCgoeCkgJiBMQUJFTF9NQVNLKSA+PiBMQUJFTF9TSElGVCkKLSNkZWZpbmUgTVBMU19FWFAoeCkJKCgoeCkgJiBFWFBfTUFTSykgPj4gRVhQX1NISUZUKQotI2RlZmluZSBNUExTX1NUQUNLKHgpCSgoKHgpICYgU1RBQ0tfTUFTSykgPj4gU1RBQ0tfU0hJRlQpCi0jZGVmaW5lIE1QTFNfVFRMKHgpCSgoKHgpICYgVFRMX01BU0spID4+IFRUTF9TSElGVCkKZGlmZiAtLWdpdCBhL25hbWVzZXIuaCBiL25hbWVzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYzOTFmNC4uMDAwMDAwMAotLS0gYS9uYW1lc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTUgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9uYW1lc2VyLmgsdiAxLjE0LjQuMiAyMDA2LzExLzEwIDAzOjE1OjM1IGd1eSBFeHAgJCAoTEJMKSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk4OSwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKiAgICAgIEAoIyluYW1lc2VyLmgJOC4yIChCZXJrZWxleSkgMi8xNi85NAotICogLQotICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQKLSAqIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCi0gKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIGRvY3VtZW50IG9yIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIERJR0lUQUwgRVFVSVBNRU5UIENPUlAuIERJU0NMQUlNUyBBTEwKLSAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gICBJTiBOTyBFVkVOVCBTSEFMTCBESUdJVEFMIEVRVUlQTUVOVAotICogQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCi0gKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUwotICogQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCi0gKiBTT0ZUV0FSRS4KLSAqIC0KLSAqIC0tQ29weXJpZ2h0LS0KLSAqLwotCi0jaWZuZGVmIF9OQU1FU0VSX0hfCi0jZGVmaW5lCV9OQU1FU0VSX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotLyoKLSAqIERlZmluZSBjb25zdGFudHMgYmFzZWQgb24gcmZjODgzCi0gKi8KLSNkZWZpbmUgUEFDS0VUU1oJNTEyCQkvKiBtYXhpbXVtIHBhY2tldCBzaXplICovCi0jZGVmaW5lIE1BWEROQU1FCTI1NgkJLyogbWF4aW11bSBkb21haW4gbmFtZSAqLwotI2RlZmluZSBNQVhDRE5BTUUJMjU1CQkvKiBtYXhpbXVtIGNvbXByZXNzZWQgZG9tYWluIG5hbWUgKi8KLSNkZWZpbmUgTUFYTEFCRUwJNjMJCS8qIG1heGltdW0gbGVuZ3RoIG9mIGRvbWFpbiBsYWJlbCAqLwotCS8qIE51bWJlciBvZiBieXRlcyBvZiBmaXhlZCBzaXplIGRhdGEgaW4gcXVlcnkgc3RydWN0dXJlICovCi0jZGVmaW5lIFFGSVhFRFNaCTQKLQkvKiBudW1iZXIgb2YgYnl0ZXMgb2YgZml4ZWQgc2l6ZSBkYXRhIGluIHJlc291cmNlIHJlY29yZCAqLwotI2RlZmluZSBSUkZJWEVEU1oJMTAKLQotLyoKLSAqIEludGVybmV0IG5hbWVzZXJ2ZXIgcG9ydCBudW1iZXIKLSAqLwotI2RlZmluZSBOQU1FU0VSVkVSX1BPUlQJNTMKLQotLyoKLSAqIFBvcnQgZm9yIG11bHRpY2FzdCBETlM7IHNlZQotICoKLSAqCWh0dHA6Ly9maWxlcy5tdWx0aWNhc3RkbnMub3JnL2RyYWZ0LWNoZXNoaXJlLWRuc2V4dC1tdWx0aWNhc3RkbnMudHh0Ci0gKgotICogZm9yIHRoZSBjdXJyZW50IG1ETlMgc3BlYy4KLSAqLwotI2RlZmluZSBNVUxUSUNBU1RETlNfUE9SVAk1MzUzCi0KLS8qCi0gKiBDdXJyZW50bHkgZGVmaW5lZCBvcGNvZGVzCi0gKi8KLSNkZWZpbmUgUVVFUlkJCTB4MAkJLyogc3RhbmRhcmQgcXVlcnkgKi8KLSNkZWZpbmUgSVFVRVJZCQkweDEJCS8qIGludmVyc2UgcXVlcnkgKi8KLSNkZWZpbmUgU1RBVFVTCQkweDIJCS8qIG5hbWVzZXJ2ZXIgc3RhdHVzIHF1ZXJ5ICovCi0jaWYgMAotI2RlZmluZSB4eHgJCTB4MwkJLyogMHgzIHJlc2VydmVkICovCi0jZW5kaWYKLQkvKiBub24gc3RhbmRhcmQgLSBzdXBwb3J0cyBBTExPV19VUERBVEVTIHN0dWZmIGZyb20gTWlrZSBTY2h3YXJ0eiAqLwotI2RlZmluZSBVUERBVEVBCQkweDkJCS8qIGFkZCByZXNvdXJjZSByZWNvcmQgKi8KLSNkZWZpbmUgVVBEQVRFRAkJMHhhCQkvKiBkZWxldGUgYSBzcGVjaWZpYyByZXNvdXJjZSByZWNvcmQgKi8KLSNkZWZpbmUgVVBEQVRFREEJMHhiCQkvKiBkZWxldGUgYWxsIG5hbWVkIHJlc291cmNlIHJlY29yZCAqLwotI2RlZmluZSBVUERBVEVNCQkweGMJCS8qIG1vZGlmeSBhIHNwZWNpZmljIHJlc291cmNlIHJlY29yZCAqLwotI2RlZmluZSBVUERBVEVNQQkweGQJCS8qIG1vZGlmeSBhbGwgbmFtZWQgcmVzb3VyY2UgcmVjb3JkICovCi0KLSNkZWZpbmUgWk9ORUlOSVQJMHhlCQkvKiBpbml0aWFsIHpvbmUgdHJhbnNmZXIgKi8KLSNkZWZpbmUgWk9ORVJFRgkJMHhmCQkvKiBpbmNyZW1lbnRhbCB6b25lIHJlZmVyZXNoICovCi0KLS8qCi0gKiBVbmRlZmluZSB2YXJpb3VzICNkZWZpbmVzIGZyb20gdmFyaW91cyBTeXN0ZW0gVi1mbGF2b3JlZCBPU2VzIChTb2xhcmlzLAotICogU0lOSVgsIEhQLVVYKSBzbyB0aGUgY29tcGlsZXIgZG9lc24ndCB3aGluZSB0aGF0IHdlIHJlZGVmaW5lIHRoZW0uCi0gKi8KLSNpZmRlZiBUX05VTEwKLSN1bmRlZiBUX05VTEwKLSNlbmRpZgotI2lmZGVmIFRfT1BUCi0jdW5kZWYgVF9PUFQKLSNlbmRpZgotI2lmZGVmIFRfVU5TUEVDCi0jdW5kZWYgVF9VTlNQRUMKLSNlbmRpZgotI2lmZGVmIE5PRVJST1IKLSN1bmRlZiBOT0VSUk9SCi0jZW5kaWYKLQotLyoKLSAqIEN1cnJlbnRseSBkZWZpbmVkIHJlc3BvbnNlIGNvZGVzCi0gKi8KLSNkZWZpbmUgTk9FUlJPUgkJMAkJLyogbm8gZXJyb3IgKi8KLSNkZWZpbmUgRk9STUVSUgkJMQkJLyogZm9ybWF0IGVycm9yICovCi0jZGVmaW5lIFNFUlZGQUlMCTIJCS8qIHNlcnZlciBmYWlsdXJlICovCi0jZGVmaW5lIE5YRE9NQUlOCTMJCS8qIG5vbiBleGlzdGVudCBkb21haW4gKi8KLSNkZWZpbmUgTk9USU1QCQk0CQkvKiBub3QgaW1wbGVtZW50ZWQgKi8KLSNkZWZpbmUgUkVGVVNFRAkJNQkJLyogcXVlcnkgcmVmdXNlZCAqLwotCS8qIG5vbiBzdGFuZGFyZCAqLwotI2RlZmluZSBOT0NIQU5HRQkweGYJCS8qIHVwZGF0ZSBmYWlsZWQgdG8gY2hhbmdlIGRiICovCi0KLS8qCi0gKiBUeXBlIHZhbHVlcyBmb3IgcmVzb3VyY2VzIGFuZCBxdWVyaWVzCi0gKi8KLSNkZWZpbmUgVF9BCQkxCQkvKiBob3N0IGFkZHJlc3MgKi8KLSNkZWZpbmUgVF9OUwkJMgkJLyogYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgKi8KLSNkZWZpbmUgVF9NRAkJMwkJLyogbWFpbCBkZXN0aW5hdGlvbiAqLwotI2RlZmluZSBUX01GCQk0CQkvKiBtYWlsIGZvcndhcmRlciAqLwotI2RlZmluZSBUX0NOQU1FCQk1CQkvKiBjb25ub25pY2FsIG5hbWUgKi8KLSNkZWZpbmUgVF9TT0EJCTYJCS8qIHN0YXJ0IG9mIGF1dGhvcml0eSB6b25lICovCi0jZGVmaW5lIFRfTUIJCTcJCS8qIG1haWxib3ggZG9tYWluIG5hbWUgKi8KLSNkZWZpbmUgVF9NRwkJOAkJLyogbWFpbCBncm91cCBtZW1iZXIgKi8KLSNkZWZpbmUgVF9NUgkJOQkJLyogbWFpbCByZW5hbWUgbmFtZSAqLwotI2RlZmluZSBUX05VTEwJCTEwCQkvKiBudWxsIHJlc291cmNlIHJlY29yZCAqLwotI2RlZmluZSBUX1dLUwkJMTEJCS8qIHdlbGwga25vd24gc2VydmljZSAqLwotI2RlZmluZSBUX1BUUgkJMTIJCS8qIGRvbWFpbiBuYW1lIHBvaW50ZXIgKi8KLSNkZWZpbmUgVF9ISU5GTwkJMTMJCS8qIGhvc3QgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVF9NSU5GTwkJMTQJCS8qIG1haWxib3ggaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVF9NWAkJMTUJCS8qIG1haWwgcm91dGluZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBUX1RYVAkJMTYJCS8qIHRleHQgc3RyaW5ncyAqLwotI2RlZmluZQlUX1JQCQkxNwkJLyogcmVzcG9uc2libGUgcGVyc29uICovCi0jZGVmaW5lCVRfQUZTREIJCTE4CQkvKiBBRlMgY2VsbCBkYXRhYmFzZSAqLwotI2RlZmluZSBUX1gyNQkJMTkJCS8qIFhfMjUgY2FsbGluZyBhZGRyZXNzICovCi0jZGVmaW5lIFRfSVNETgkJMjAJCS8qIElTRE4gY2FsbGluZyBhZGRyZXNzICovCi0jZGVmaW5lIFRfUlQJCTIxCQkvKiByb3V0ZXIgKi8KLSNkZWZpbmUJVF9OU0FQCQkyMgkJLyogTlNBUCBhZGRyZXNzICovCi0jZGVmaW5lCVRfTlNBUF9QVFIJMjMJCS8qIHJldmVyc2UgbG9va3VwIGZvciBOU0FQICovCi0jZGVmaW5lIFRfU0lHCQkyNAkJLyogc2VjdXJpdHkgc2lnbmF0dXJlICovCi0jZGVmaW5lIFRfS0VZCQkyNQkJLyogc2VjdXJpdHkga2V5ICovCi0jZGVmaW5lIFRfUFgJCTI2CQkvKiBYLjQwMCBtYWlsIG1hcHBpbmcgKi8KLSNkZWZpbmUgVF9HUE9TCQkyNwkJLyogZ2VvZ3JhcGhpY2FsIHBvc2l0aW9uICh3aXRoZHJhd24pICovCi0jZGVmaW5lIFRfQUFBQQkJMjgJCS8qIElQNiBBZGRyZXNzICovCi0jZGVmaW5lIFRfTE9DCQkyOQkJLyogTG9jYXRpb24gSW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVF9OWFQJCTMwCQkvKiBOZXh0IFZhbGlkIE5hbWUgaW4gWm9uZSAqLwotI2RlZmluZSBUX0VJRAkJMzEJCS8qIEVuZHBvaW50IGlkZW50aWZpZXIgKi8KLSNkZWZpbmUgVF9OSU1MT0MJMzIJCS8qIE5pbXJvZCBsb2NhdG9yICovCi0jZGVmaW5lIFRfU1JWCQkzMwkJLyogU2VydmVyIHNlbGVjdGlvbiAqLwotI2RlZmluZSBUX0FUTUEJCTM0CQkvKiBBVE0gQWRkcmVzcyAqLwotI2RlZmluZSBUX05BUFRSCQkzNQkJLyogTmFtaW5nIEF1dGhvcml0eSBQb2luVGVSICovCi0jZGVmaW5lIFRfS1gJCTM2CQkvKiBLZXkgRXhjaGFuZ2VyICovCi0jZGVmaW5lIFRfQ0VSVAkJMzcJCS8qIENlcnRpZmljYXRlcyBpbiB0aGUgRE5TICovCi0jZGVmaW5lIFRfQTYJCTM4CQkvKiBJUDYgYWRkcmVzcyAqLwotI2RlZmluZSBUX0ROQU1FCQkzOQkJLyogbm9uLXRlcm1pbmFsIHJlZGlyZWN0aW9uICovCi0jZGVmaW5lIFRfU0lOSwkJNDAJCS8qIHVua25vd24gKi8KLSNkZWZpbmUgVF9PUFQJCTQxCQkvKiBFRE5TMCBvcHRpb24gKG1ldGEtUlIpICovCi0jZGVmaW5lIFRfQVBMCQk0MgkJLyogbGlzdHMgb2YgYWRkcmVzcyBwcmVmaXhlcyAqLwotI2RlZmluZSBUX0RTCQk0MwkJLyogRGVsZWdhdGlvbiBTaWduZXIgKi8KLSNkZWZpbmUgVF9TU0hGUAkJNDQJCS8qIFNTSCBGaW5nZXJwcmludCAqLwotI2RlZmluZSBUX0lQU0VDS0VZCTQ1CQkvKiBJUHNlYyBrZXlpbmcgbWF0ZXJpYWwgKi8KLSNkZWZpbmUgVF9SUlNJRwkJNDYJCS8qIG5ldyBzZWN1cml0eSBzaWduYXR1cmUgKi8KLSNkZWZpbmUgVF9OU0VDCQk0NwkJLyogcHJvdmFibGUgaW5zZWN1cmUgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVF9ETlNLRVkJNDgJCS8qIG5ldyBzZWN1cml0eSBrZXkgKi8KLQkvKiBub24gc3RhbmRhcmQgKi8KLSNkZWZpbmUgVF9TUEYJCTk5CQkvKiBzZW5kZXIgcG9saWN5IGZyYW1ld29yayAqLwotI2RlZmluZSBUX1VJTkZPCQkxMDAJCS8qIHVzZXIgKGZpbmdlcikgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgVF9VSUQJCTEwMQkJLyogdXNlciBJRCAqLwotI2RlZmluZSBUX0dJRAkJMTAyCQkvKiBncm91cCBJRCAqLwotI2RlZmluZSBUX1VOU1BFQwkxMDMJCS8qIFVuc3BlY2lmaWVkIGZvcm1hdCAoYmluYXJ5IGRhdGEpICovCi0jZGVmaW5lIFRfVU5TUEVDQQkxMDQJCS8qICJ1bnNwZWNpZmllZCBhc2NpaSIuIFVnbHkgTUlUIGhhY2sgKi8KLQkvKiBRdWVyeSB0eXBlIHZhbHVlcyB3aGljaCBkbyBub3QgYXBwZWFyIGluIHJlc291cmNlIHJlY29yZHMgKi8KLSNkZWZpbmUgVF9US0VZCQkyNDkJCS8qIFRyYW5zYWN0aW9uIEtleSBbUkZDMjkzMF0gKi8KLSNkZWZpbmUgVF9UU0lHCQkyNTAJCS8qIFRyYW5zYWN0aW9uIFNpZ25hdHVyZSBbUkZDMjg0NV0gKi8KLSNkZWZpbmUgVF9JWEZSCQkyNTEJCS8qIGluY3JlbWVudGFsIHRyYW5zZmVyIFtSRkMxOTk1XSAqLwotI2RlZmluZSBUX0FYRlIJCTI1MgkJLyogdHJhbnNmZXIgem9uZSBvZiBhdXRob3JpdHkgKi8KLSNkZWZpbmUgVF9NQUlMQgkJMjUzCQkvKiB0cmFuc2ZlciBtYWlsYm94IHJlY29yZHMgKi8KLSNkZWZpbmUgVF9NQUlMQQkJMjU0CQkvKiB0cmFuc2ZlciBtYWlsIGFnZW50IHJlY29yZHMgKi8KLSNkZWZpbmUgVF9BTlkJCTI1NQkJLyogd2lsZGNhcmQgbWF0Y2ggKi8KLQotLyoKLSAqIFZhbHVlcyBmb3IgY2xhc3MgZmllbGQKLSAqLwotCi0jZGVmaW5lIENfSU4JCTEJCS8qIHRoZSBhcnBhIGludGVybmV0ICovCi0jZGVmaW5lIENfQ0hBT1MJCTMJCS8qIGZvciBjaGFvcyBuZXQgKE1JVCkgKi8KLSNkZWZpbmUgQ19IUwkJNAkJLyogZm9yIEhlc2lvZCBuYW1lIHNlcnZlciAoTUlUKSAoWFhYKSAqLwotCS8qIFF1ZXJ5IGNsYXNzIHZhbHVlcyB3aGljaCBkbyBub3QgYXBwZWFyIGluIHJlc291cmNlIHJlY29yZHMgKi8KLSNkZWZpbmUgQ19BTlkJCTI1NQkJLyogd2lsZGNhcmQgbWF0Y2ggKi8KLSNkZWZpbmUgQ19RVQkJMHg4MDAwCQkvKiBtRE5TIFFVIGZsYWcgaW4gcXVlcmllcyAqLwotI2RlZmluZSBDX0NBQ0hFX0ZMVVNICTB4ODAwMAkJLyogbUROUyBjYWNoZSBmbHVzaCBmbGFnIGluIHJlcGxpZXMgKi8KLQotLyoKLSAqIFN0YXR1cyByZXR1cm4gY29kZXMgZm9yIFRfVU5TUEVDIGNvbnZlcnNpb24gcm91dGluZXMKLSAqLwotI2RlZmluZSBDT05WX1NVQ0NFU1MgMAotI2RlZmluZSBDT05WX09WRVJGTE9XIC0xCi0jZGVmaW5lIENPTlZfQkFERk1UIC0yCi0jZGVmaW5lIENPTlZfQkFEQ0tTVU0gLTMKLSNkZWZpbmUgQ09OVl9CQURCVUZMRU4gLTQKLQotLyoKLSAqIFN0cnVjdHVyZSBmb3IgcXVlcnkgaGVhZGVyLgotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdV9pbnQxNl90IGlkOwkJLyogcXVlcnkgaWRlbnRpZmljYXRpb24gbnVtYmVyICovCi0JdV9pbnQ4X3QgIGZsYWdzMTsJLyogZmlyc3QgYnl0ZSBvZiBmbGFncyAqLwotCXVfaW50OF90ICBmbGFnczI7CS8qIHNlY29uZCBieXRlIG9mIGZsYWdzICovCi0JdV9pbnQxNl90IHFkY291bnQ7CS8qIG51bWJlciBvZiBxdWVzdGlvbiBlbnRyaWVzICovCi0JdV9pbnQxNl90IGFuY291bnQ7CS8qIG51bWJlciBvZiBhbnN3ZXIgZW50cmllcyAqLwotCXVfaW50MTZfdCBuc2NvdW50OwkvKiBudW1iZXIgb2YgYXV0aG9yaXR5IGVudHJpZXMgKi8KLQl1X2ludDE2X3QgYXJjb3VudDsJLyogbnVtYmVyIG9mIHJlc291cmNlIGVudHJpZXMgKi8KLX0gSEVBREVSOwotCi0vKgotICogTWFjcm9zIGZvciBzdWJmaWVsZHMgb2YgZmxhZyBmaWVsZHMuCi0gKi8KLSNkZWZpbmUgRE5TX1FSKG5wKQkoKG5wKS0+ZmxhZ3MxICYgMHg4MCkJCS8qIHJlc3BvbnNlIGZsYWcgKi8KLSNkZWZpbmUgRE5TX09QQ09ERShucCkJKCgoKG5wKS0+ZmxhZ3MxKSA+PiAzKSAmIDB4RikJLyogcHVycG9zZSBvZiBtZXNzYWdlICovCi0jZGVmaW5lIEROU19BQShucCkJKChucCktPmZsYWdzMSAmIDB4MDQpCQkvKiBhdXRob3JpdGF0aXZlIGFuc3dlciAqLwotI2RlZmluZSBETlNfVEMobnApCSgobnApLT5mbGFnczEgJiAweDAyKQkJLyogdHJ1bmNhdGVkIG1lc3NhZ2UgKi8KLSNkZWZpbmUgRE5TX1JEKG5wKQkoKG5wKS0+ZmxhZ3MxICYgMHgwMSkJCS8qIHJlY3Vyc2lvbiBkZXNpcmVkICovCi0KLSNkZWZpbmUgRE5TX1JBKG5wKQkoKG5wKS0+ZmxhZ3MyICYgMHg4MCkJLyogcmVjdXJzaW9uIGF2YWlsYWJsZSAqLwotI2RlZmluZSBETlNfQUQobnApCSgobnApLT5mbGFnczIgJiAweDIwKQkvKiBhdXRoZW50aWMgZGF0YSBmcm9tIG5hbWVkICovCi0jZGVmaW5lIEROU19DRChucCkJKChucCktPmZsYWdzMiAmIDB4MTApCS8qIGNoZWNraW5nIGRpc2FibGVkIGJ5IHJlc29sdmVyICovCi0jZGVmaW5lIEROU19SQ09ERShucCkJKChucCktPmZsYWdzMiAmIDB4RikJLyogcmVzcG9uc2UgY29kZSAqLwotCi0vKgotICogRGVmaW5lcyBmb3IgaGFuZGxpbmcgY29tcHJlc3NlZCBkb21haW4gbmFtZXMsIEVETlMwIGxhYmVscywgZXRjLgotICovCi0jZGVmaW5lIElORElSX01BU0sJMHhjMAkvKiAxMS4uLi4gKi8KLSNkZWZpbmUgRUROUzBfTUFTSwkweDQwCS8qIDAxLi4uLiAqLwotIyAgZGVmaW5lIEVETlMwX0VMVF9CSVRMQUJFTCAweDAxCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgZm9yIHBhc3NpbmcgcmVzb3VyY2UgcmVjb3JkcyBhcm91bmQuCi0gKi8KLXN0cnVjdCBycmVjIHsKLQlpbnQxNl90CXJfem9uZTsJCQkvKiB6b25lIG51bWJlciAqLwotCWludDE2X3QJcl9jbGFzczsJCS8qIGNsYXNzIG51bWJlciAqLwotCWludDE2X3QJcl90eXBlOwkJCS8qIHR5cGUgbnVtYmVyICovCi0JdV9pbnQzMl90CXJfdHRsOwkJCS8qIHRpbWUgdG8gbGl2ZSAqLwotCWludAlyX3NpemU7CQkJLyogc2l6ZSBvZiBkYXRhIGFyZWEgKi8KLQljaGFyCSpyX2RhdGE7CQkvKiBwb2ludGVyIHRvIGRhdGEgKi8KLX07Ci0KLS8qCi0gKiBJbmxpbmUgdmVyc2lvbnMgb2YgZ2V0L3B1dCBzaG9ydC9sb25nLiAgUG9pbnRlciBpcyBhZHZhbmNlZC4KLSAqIFdlIGFsc28gYXNzdW1lIHRoYXQgYSAidV9pbnQxNl90IiBob2xkcyAyICJjaGFycyIKLSAqIGFuZCB0aGF0IGEgInVfaW50MzJfdCIgaG9sZHMgNCAiY2hhcnMiLgotICoKLSAqIFRoZXNlIG1hY3JvcyBkZW1vbnN0cmF0ZSB0aGUgcHJvcGVydHkgb2YgQyB3aGVyZWJ5IGl0IGNhbiBiZQotICogcG9ydGFibGUgb3IgaXQgY2FuIGJlIGVsZWdhbnQgYnV0IG5ldmVyIGJvdGguCi0gKi8KLSNkZWZpbmUgR0VUU0hPUlQocywgY3ApIHsgXAotCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCi0JKHMpID0gKCh1X2ludDE2X3QpdF9jcFswXSA8PCA4KSB8ICh1X2ludDE2X3QpdF9jcFsxXTsgXAotCShjcCkgKz0gMjsgXAotfQotCi0jZGVmaW5lIEdFVExPTkcobCwgY3ApIHsgXAotCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCi0JKGwpID0gKCgodV9pbnQzMl90KXRfY3BbMF0pIDw8IDI0KSBcCi0JICAgIHwgKCgodV9pbnQzMl90KXRfY3BbMV0pIDw8IDE2KSBcCi0JICAgIHwgKCgodV9pbnQzMl90KXRfY3BbMl0pIDw8IDgpIFwKLQkgICAgfCAoKCh1X2ludDMyX3QpdF9jcFszXSkpOyBcCi0JKGNwKSArPSA0OyBcCi19Ci0KLSNkZWZpbmUgUFVUU0hPUlQocywgY3ApIHsgXAotCXJlZ2lzdGVyIHVfaW50MTZfdCB0X3MgPSAodV9pbnQxNl90KShzKTsgXAotCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCi0JKnRfY3ArKyA9IHRfcyA+PiA4OyBcCi0JKnRfY3AgICA9IHRfczsgXAotCShjcCkgKz0gMjsgXAotfQotCi0vKgotICogV2FybmluZzogUFVUTE9ORyAtLW5vLWxvbmdlci0tIGRlc3Ryb3lzIGl0cyBmaXJzdCBhcmd1bWVudC4gIGlmIHlvdQotICogd2VyZSBkZXBlbmRpbmcgb24gdGhpcyAiZmVhdHVyZSIsIHlvdSB3aWxsIGxvc2UuCi0gKi8KLSNkZWZpbmUgUFVUTE9ORyhsLCBjcCkgeyBcCi0JcmVnaXN0ZXIgdV9pbnQzMl90IHRfbCA9ICh1X2ludDMyX3QpKGwpOyBcCi0JcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKLQkqdF9jcCsrID0gdF9sID4+IDI0OyBcCi0JKnRfY3ArKyA9IHRfbCA+PiAxNjsgXAotCSp0X2NwKysgPSB0X2wgPj4gODsgXAotCSp0X2NwICAgPSB0X2w7IFwKLQkoY3ApICs9IDQ7IFwKLX0KLQotI2VuZGlmIC8qICFfTkFNRVNFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0Ymlvcy5oIGIvbmV0Ymlvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFiZWJhLi4wMDAwMDAwCi0tLSBhL25ldGJpb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBORVRCSU9TIHByb3RvY29sIGZvcm1hdHMKLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL25ldGJpb3MuaCx2IDEuMyAyMDAyLzEyLzExIDA3OjEzOjU1IGd1eSBFeHAgJAotICovCi0KLXN0cnVjdCBwODAyMkhkciB7Ci0gICAgdV9jaGFyCWRzYXA7Ci0gICAgdV9jaGFyCXNzYXA7Ci0gICAgdV9jaGFyCWZsYWdzOwotfTsKLQotI2RlZmluZQlwODAyMlNpemUJMwkJLyogbWluIDgwMi4yIGhlYWRlciBzaXplICovCi0KLSNkZWZpbmUgVUkJCTB4MDMJCS8qIDgwMi4yIGZsYWdzICovCi0KZGlmZiAtLWdpdCBhL25ldGRpc3NlY3QuaCBiL25ldGRpc3NlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwOTQ1NS4uMDAwMDAwMAotLS0gYS9uZXRkaXNzZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCAgTWljaGFlbCBSaWNoYXJkc29uIDxtY3JAdGNwZHVtcC5vcmc+Ci0gKiAgICAgIFRoZSBUQ1BEVU1QIHByb2plY3QKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9uZXRkaXNzZWN0LmgsdiAxLjE2LjIuNCAyMDA2LzAyLzA4IDAxOjQwOjA5IGhhbm5lcyBFeHAgJCAoTEJMKQotICovCi0KLSNpZm5kZWYgbmV0ZGlzc2VjdF9oCi0jZGVmaW5lIG5ldGRpc3NlY3RfaAotCi0jaWZkZWYgSEFWRV9PU19QUk9UT19ICi0jaW5jbHVkZSAib3MtcHJvdG8uaCIKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZuZGVmIEhBVkVfX19BVFRSSUJVVEVfXwotI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCi0jZW5kaWYKLQotLyogc25wcmludGYgZXQgYWwgKi8KLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaWYgIWRlZmluZWQoSEFWRV9TTlBSSU5URikKLWludCBzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotICAgICBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEhBVkVfVlNOUFJJTlRGKQotaW50IHZzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCkKLSAgICAgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDMsIDApKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUkxDQVQKLWV4dGVybiBzaXplX3Qgc3RybGNhdCAoY2hhciAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci0jZW5kaWYKLSNpZm5kZWYgSEFWRV9TVFJMQ1BZCi1leHRlcm4gc2l6ZV90IHN0cmxjcHkgKGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9TVFJEVVAKLWV4dGVybiBjaGFyICpzdHJkdXAgKGNvbnN0IGNoYXIgKnN0cik7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NUUlNFUAotZXh0ZXJuIGNoYXIgKnN0cnNlcChjaGFyICoqLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLXN0cnVjdCB0b2sgewotCWludCB2OwkJCS8qIHZhbHVlICovCi0JY29uc3QgY2hhciAqczsJCS8qIHN0cmluZyAqLwotfTsKLQotI2RlZmluZSBUT0tCVUZTSVpFIDEyOAotZXh0ZXJuIGNvbnN0IGNoYXIgKnRvazJzdHJidWYoY29uc3Qgc3RydWN0IHRvayAqLCBjb25zdCBjaGFyICosIGludCwKLQkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOwotCi0vKiB0b2syc3RyIGlzIGRlcHJlY2F0ZWQgKi8KLWV4dGVybiBjb25zdCBjaGFyICp0b2syc3RyKGNvbnN0IHN0cnVjdCB0b2sgKiwgY29uc3QgY2hhciAqLCBpbnQpOwotZXh0ZXJuIGNoYXIgKmJpdHRvazJzdHIoY29uc3Qgc3RydWN0IHRvayAqLCBjb25zdCBjaGFyICosIGludCk7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbmV0ZGlzc2VjdF9vcHRpb25zIG5ldGRpc3NlY3Rfb3B0aW9uczsKLQotc3RydWN0IG5ldGRpc3NlY3Rfb3B0aW9ucyB7Ci0gIGludCBuZG9fYWZsYWc7CQkvKiB0cmFuc2xhdGUgbmV0d29yayBhbmQgYnJvYWRjYXN0IGFkZHJlc3NlcyAqLwotICBpbnQgbmRvX2VmbGFnOwkJLyogcHJpbnQgZXRoZXJuZXQgaGVhZGVyICovCi0gIGludCBuZG9fZmZsYWc7CQkvKiBkb24ndCB0cmFuc2xhdGUgImZvcmVpZ24iIElQIGFkZHJlc3MgKi8KLSAgaW50IG5kb19uZmxhZzsJCS8qIGxlYXZlIGFkZHJlc3NlcyBhcyBudW1iZXJzICovCi0gIGludCBuZG9fTmZsYWc7CQkvKiByZW1vdmUgZG9tYWlucyBmcm9tIHByaW50ZWQgaG9zdCBuYW1lcyAqLwotICBpbnQgbmRvX3FmbGFnOwkJLyogcXVpY2sgKHNob3J0ZXIpIG91dHB1dCAqLwotICBpbnQgbmRvX1JmbGFnOwkJLyogcHJpbnQgc2VxdWVuY2UgIyBmaWVsZCBpbiBBSC9FU1AqLwotICBpbnQgbmRvX3NmbGFnOwkJLyogdXNlIHRoZSBsaWJzbWkgdG8gdHJhbnNsYXRlIE9JRHMgKi8KLSAgaW50IG5kb19TZmxhZzsJCS8qIHByaW50IHJhdyBUQ1Agc2VxdWVuY2UgbnVtYmVycyAqLwotICBpbnQgbmRvX3RmbGFnOwkJLyogcHJpbnQgcGFja2V0IGFycml2YWwgdGltZSAqLwotICBpbnQgbmRvX1VmbGFnOwkJLyogInVuYnVmZmVyZWQiIG91dHB1dCBvZiBkdW1wIGZpbGVzICovCi0gIGludCBuZG9fdWZsYWc7CQkvKiBQcmludCB1bmRlY29kZWQgTkZTIGhhbmRsZXMgKi8KLSAgaW50IG5kb192ZmxhZzsJCS8qIHZlcmJvc2UgKi8KLSAgaW50IG5kb194ZmxhZzsJCS8qIHByaW50IHBhY2tldCBpbiBoZXggKi8KLSAgaW50IG5kb19YZmxhZzsJCS8qIHByaW50IHBhY2tldCBpbiBoZXgvYXNjaWkgKi8KLSAgaW50IG5kb19BZmxhZzsJCS8qIHByaW50IHBhY2tldCBvbmx5IGluIGFzY2lpIG9ic2VydmluZyBUQUIsCi0JCQkJICogTEYsIENSIGFuZCBTUEFDRSBhcyBncmFwaGljYWwgY2hhcnMKLQkJCQkgKi8KLSAgaW50IG5kb19PZmxhZzsgICAgICAgICAgICAgICAgLyogcnVuIGZpbHRlciBjb2RlIG9wdGltaXplciAqLwotICBpbnQgbmRvX2RsdDsgICAgICAgICAgICAgICAgICAvKiBpZiAhPSAtMSwgYXNrIGxpYnBjYXAgZm9yIHRoZSBETFQgaXQgbmFtZXMqLwotICBpbnQgbmRvX3BmbGFnOyAgICAgICAgICAgICAgICAvKiBkb24ndCBnbyBwcm9taXNjdW91cyAqLwotCi0gIGludCBuZG9fQ2ZsYWc7ICAgICAgICAgICAgICAgIC8qIHJvdGF0ZSBkdW1wIGZpbGVzIGFmdGVyIHRoaXMgbWFueSBieXRlcyAqLyAKLSAgaW50IG5kb19DZmxhZ19jb3VudDsgICAgICAvKiBLZWVwIHRyYWNrIG9mIHdoaWNoIGZpbGUgbnVtYmVyIHdlJ3JlIHdyaXRpbmcgKi8KLSAgaW50IG5kb19XZmxhZzsgICAgICAgICAgLyogcmVjeWNsZSBvdXRwdXQgZmlsZXMgYWZ0ZXIgdGhpcyBudW1iZXIgb2YgZmlsZXMgKi8KLSAgaW50IG5kb19XZmxhZ0NoYXJzOwotICBpbnQgbmRvX3N1cHByZXNzX2RlZmF1bHRfcHJpbnQ7IC8qIGRvbid0IHVzZSBkZWZhdWx0X3ByaW50KCkgZm9yIHVua25vd24gcGFja2V0IHR5cGVzICovCi0gIGNvbnN0IGNoYXIgKm5kb19kbHRuYW1lOwotCi0gIGNoYXIgKm5kb19lc3BzZWNyZXQ7Ci0gIHN0cnVjdCBzYV9saXN0ICpuZG9fc2FfbGlzdF9oZWFkOyAgLyogdXNlZCBieSBwcmludC1lc3AuYyAqLwotICBzdHJ1Y3Qgc2FfbGlzdCAqbmRvX3NhX2RlZmF1bHQ7Ci0KLSAgY2hhciAqbmRvX3RjcG1kNXNlY3JldDsgICAgIAkvKiBUQ1AtTUQ1IHNlY3JldCBrZXkgKi8KLQotICBzdHJ1Y3QgZXNwX2FsZ29yaXRobSAqbmRvX2VzcHNlY3JldF94Zm9ybTsgICAvKiBjYWNoZSBvZiBkZWNvZGVkICAqLwotICBjaGFyICAgICAgICAgICAgICAgICAqbmRvX2VzcHNlY3JldF9rZXk7Ci0KLSAgaW50ICAgbmRvX3BhY2tldHR5cGU7CS8qIGFzIHNwZWNpZmllZCBieSAtVCAqLwotCi0gIGNoYXIgKm5kb19wcm9ncmFtX25hbWU7CS8qdXNlZCB0byBnZW5lcmF0ZSBzZWxmLWlkZW50aWZ5aW5nIG1lc3NhZ2VzICovCi0KLSAgaW50MzJfdCBuZG9fdGhpc3pvbmU7CS8qIHNlY29uZHMgb2Zmc2V0IGZyb20gZ210IHRvIGxvY2FsIHRpbWUgKi8KLQotICBpbnQgICBuZG9fc25hcGxlbjsKLQotICAvKmdsb2JhbCBwb2ludGVycyB0byBiZWdpbm5pbmcgYW5kIGVuZCBvZiBjdXJyZW50IHBhY2tldCAoZHVyaW5nIHByaW50aW5nKSAqLwotICBjb25zdCB1X2NoYXIgKm5kb19wYWNrZXRwOwotICBjb25zdCB1X2NoYXIgKm5kb19zbmFwZW5kOwotCi0gIC8qIGJvb2trZWVwaW5nIGZvciBeVCBvdXRwdXQgKi8KLSAgaW50IG5kb19pbmZvZGVsYXk7Ci0KLSAgLyogcG9pbnRlciB0byB2b2lkIGZ1bmN0aW9uIHRvIG91dHB1dCBzdHVmZiAqLwotICB2b2lkICgqbmRvX2RlZmF1bHRfcHJpbnQpKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAotICAJCSAgICAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCk7Ci0gIHZvaWQgKCpuZG9faW5mbykobmV0ZGlzc2VjdF9vcHRpb25zICosIGludCB2ZXJib3NlKTsKLQotICBpbnQgICgqbmRvX3ByaW50ZikobmV0ZGlzc2VjdF9vcHRpb25zICosCi0JCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwotICB2b2lkICgqbmRvX2Vycm9yKShuZXRkaXNzZWN0X29wdGlvbnMgKiwKLQkJICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLSAgdm9pZCAoKm5kb193YXJuaW5nKShuZXRkaXNzZWN0X29wdGlvbnMgKiwKLQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pOwotfTsKLQotI2RlZmluZSBQVF9WQVQJCTEJLyogVmlzdWFsIEF1ZGlvIFRvb2wgKi8KLSNkZWZpbmUgUFRfV0IJCTIJLyogZGlzdHJpYnV0ZWQgV2hpdGUgQm9hcmQgKi8KLSNkZWZpbmUgUFRfUlBDCQkzCS8qIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCAqLwotI2RlZmluZSBQVF9SVFAJCTQJLyogUmVhbC1UaW1lIEFwcGxpY2F0aW9ucyBwcm90b2NvbCAqLwotI2RlZmluZSBQVF9SVENQCQk1CS8qIFJlYWwtVGltZSBBcHBsaWNhdGlvbnMgY29udHJvbCBwcm90b2NvbCAqLwotI2RlZmluZSBQVF9TTk1QCQk2CS8qIFNpbXBsZSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFRfQ05GUAkJNwkvKiBDaXNjbyBOZXRGbG93IHByb3RvY29sICovCi0KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSk+KGIpPyhiKTooYSkpCi0jZW5kaWYKLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYik+KGEpPyhiKTooYSkpCi0jZW5kaWYKLQotI2lmbmRlZiBJTkVUNgotLyoKLSAqIFRoZSBkZWZhdWx0IHNuYXBzaG90IGxlbmd0aC4gIFRoaXMgdmFsdWUgYWxsb3dzIG1vc3QgcHJpbnRlcnMgdG8gcHJpbnQKLSAqIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aGlsZSBrZWVwaW5nIHRoZSBhbW91bnQgb2YgdW53YW50ZWQgZGF0YSBkb3duLgotICogSW4gcGFydGljdWxhciwgaXQgYWxsb3dzIGZvciBhbiBldGhlcm5ldCBoZWFkZXIsIHRjcC9pcCBoZWFkZXIsIGFuZAotICogMTQgYnl0ZXMgb2YgZGF0YSAoYXNzdW1pbmcgbm8gaXAgb3B0aW9ucykuCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9TTkFQTEVOIDY4Ci0jZWxzZQotI2RlZmluZSBERUZBVUxUX1NOQVBMRU4gOTYKLSNlbmRpZgotCi0jaWZuZGVmIEJJR19FTkRJQU4KLSNkZWZpbmUgQklHX0VORElBTiA0MzIxCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4gMTIzNAotI2VuZGlmCi0KLSNkZWZpbmUgRVNSQyhlcCkgKChlcCktPmV0aGVyX3Nob3N0KQotI2RlZmluZSBFRFNUKGVwKSAoKGVwKS0+ZXRoZXJfZGhvc3QpCi0KLSNpZm5kZWYgTlRPSEwKLSNkZWZpbmUgTlRPSEwoeCkJKHgpID0gbnRvaGwoeCkKLSNkZWZpbmUgTlRPSFMoeCkJKHgpID0gbnRvaHMoeCkKLSNkZWZpbmUgSFRPTkwoeCkJKHgpID0gaHRvbmwoeCkKLSNkZWZpbmUgSFRPTlMoeCkJKHgpID0gaHRvbnMoeCkKLSNlbmRpZgotCi0vKgotICogVHJ1ZSBpZiAibCIgYnl0ZXMgb2YgInZhciIgd2VyZSBjYXB0dXJlZC4KLSAqCi0gKiBUaGUgIm5kby0+bmRvX3NuYXBlbmQgLSAobCkgPD0gbmRvLT5uZG9fc25hcGVuZCIgY2hlY2tzIHRvIG1ha2Ugc3VyZQotICogImwiIGlzbid0IHNvIGxhcmdlIHRoYXQgIm5kby0+bmRvX3NuYXBlbmQgLSAobCkiIHVuZGVyZmxvd3MuCi0gKgotICogVGhlIGNoZWNrIGlzIGZvciA8PSByYXRoZXIgdGhhbiA8IGJlY2F1c2UgImwiIG1pZ2h0IGJlIDAuCi0gKi8KLSNkZWZpbmUgTkRfVFRFU1QyKHZhciwgbCkgKG5kby0+bmRvX3NuYXBlbmQgLSAobCkgPD0gbmRvLT5uZG9fc25hcGVuZCAmJiBcCi0JCQkoY29uc3QgdV9jaGFyICopJih2YXIpIDw9IG5kby0+bmRvX3NuYXBlbmQgLSAobCkpCi0KLS8qIFRydWUgaWYgInZhciIgd2FzIGNhcHR1cmVkICovCi0jZGVmaW5lIE5EX1RURVNUKHZhcikgTkRfVFRFU1QyKHZhciwgc2l6ZW9mKHZhcikpCi0KLS8qIEJhaWwgaWYgImwiIGJ5dGVzIG9mICJ2YXIiIHdlcmUgbm90IGNhcHR1cmVkICovCi0jZGVmaW5lIE5EX1RDSEVDSzIodmFyLCBsKSBpZiAoIU5EX1RURVNUMih2YXIsIGwpKSBnb3RvIHRydW5jCi0KLS8qIEJhaWwgaWYgInZhciIgd2FzIG5vdCBjYXB0dXJlZCAqLwotI2RlZmluZSBORF9UQ0hFQ0sodmFyKSBORF9UQ0hFQ0syKHZhciwgc2l6ZW9mKHZhcikpCi0KLSNkZWZpbmUgTkRfUFJJTlQoU1RVRkYpICgqbmRvLT5uZG9fcHJpbnRmKVNUVUZGCi0jZGVmaW5lIE5EX0RFRkFVTFRQUklOVChhcCwgbGVuZ3RoKSAoKm5kby0+bmRvX2RlZmF1bHRfcHJpbnQpKG5kbywgYXAsIGxlbmd0aCkKLQotI2lmIDAJCi1leHRlcm4gdm9pZCB0c19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKmlwZG8sCi0JCSAgICAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKik7Ci1leHRlcm4gdm9pZCByZWx0c19wcmludChpbnQpOwotI2VuZGlmCi0KLWV4dGVybiBpbnQgZm5fcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiBpbnQgZm5fcHJpbnRuKGNvbnN0IHVfY2hhciAqLCB1X2ludCwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnRvazJzdHIoY29uc3Qgc3RydWN0IHRvayAqLCBjb25zdCBjaGFyICosIGludCk7Ci0KLWV4dGVybiB2b2lkIHdyYXB1cChpbnQpOwotCi0jaWYgMAotZXh0ZXJuIGNoYXIgKnJlYWRfaW5maWxlKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCBjaGFyICopOwotZXh0ZXJuIGNoYXIgKmNvcHlfYXJndihuZXRkaXNzZWN0X29wdGlvbnMgKiwgY2hhciAqKik7Ci0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgc2FmZXB1dGNoYXIoaW50KTsKLWV4dGVybiB2b2lkIHNhZmVwdXRzKGNvbnN0IGNoYXIgKiwgaW50KTsKLQotI2lmIDAKLWV4dGVybiBjb25zdCBjaGFyICppc29uc2FwX3N0cmluZyhuZXRkaXNzZWN0X29wdGlvbnMgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnByb3RvaWRfc3RyaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gY29uc3QgY2hhciAqZG5uYW1lX3N0cmluZyhuZXRkaXNzZWN0X29wdGlvbnMgKiwgdV9zaG9ydCk7Ci1leHRlcm4gY29uc3QgY2hhciAqZG5udW1fc3RyaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCB1X3Nob3J0KTsKLSNlbmRpZgotCi0vKiBUaGUgcHJpbnRlciByb3V0aW5lcy4gKi8KLQotI2luY2x1ZGUgPHBjYXAuaD4KLQotCi1leHRlcm4gdm9pZCBlYXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsgICAgCi1leHRlcm4gaW50IGVzcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKiwKLQkJICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMiwKLQkJICAgICBpbnQgKm5oZHIsIGludCAqcGFkbGVuKTsKLWV4dGVybiB2b2lkIGFycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsIHVfaW50KTsKLWV4dGVybiB2b2lkIGlzYWttcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKLQkJCSB1X2ludCwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgaXNha21wX3JmYzM5NDhfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCi0JCQkJIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBpcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaXBfcHJpbnRfaW5uZXIobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JCQkgICBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsIHVfaW50IG5oLAotCQkJICAgY29uc3QgdV9jaGFyICpicDIpOwotCi0vKiBzdHVmZiB0aGF0IGhhcyBub3QgeWV0IGJlZW4gcm90b3RpbGVkICovCi0jaWYgMAotZXh0ZXJuIHZvaWQgYXNjaWlfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosdV9pbnQpOwotZXh0ZXJuIHZvaWQgaGV4X2FuZF9hc2NpaV9wcmludF93aXRoX29mZnNldChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCBjaGFyICosCi0JCQkJICAgIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBoZXhfYW5kX2FzY2lpX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IGNoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaGV4X3ByaW50X3dpdGhfb2Zmc2V0KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IGNoYXIgKiwKLQkJCQkgIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBoZXhfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCB0ZWxuZXRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiBpbnQgZXRoZXJfZW5jYXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosdV9zaG9ydCwgY29uc3QgdV9jaGFyICosCi0JCQkgICAgIHVfaW50LCB1X2ludCwgdV9zaG9ydCAqKTsKLWV4dGVybiBpbnQgbGxjX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAotCQkgICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQsIGNvbnN0IHVfY2hhciAqLAotCQkgICAgIGNvbnN0IHVfY2hhciAqLCB1X3Nob3J0ICopOwotZXh0ZXJuIHZvaWQgYWFycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgYXRhbGtfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGF0bV9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgYm9vdHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCi0JCQl1X2ludCwgdV9zaG9ydCwgdV9zaG9ydCk7Ci1leHRlcm4gdm9pZCBiZ3BfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBieHhwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBjaGRsY19pZl9wcmludCh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKLQkJCSAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCk7Ci1leHRlcm4gdm9pZCBjaGRsY19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywKLQkJCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pOwotZXh0ZXJuIHZvaWQgY2lzY29fYXV0b3JwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAotCQkJICAgICAgIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBjbmZwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqY3AsCi0JCSAgICAgICB1X2ludCBsZW4sIGNvbnN0IHVfY2hhciAqYnApOwotZXh0ZXJuIHZvaWQgZGVjbmV0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAotCQkJIHVfaW50LCB1X2ludCk7Ci1leHRlcm4gdm9pZCBkZWZhdWx0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBkdm1ycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgZWdwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCwKLQkJICAgICAgY29uc3QgdV9jaGFyICopOwotCi1leHRlcm4gdm9pZCBhcmNuZXRfaWZfcHJpbnQodV9jaGFyKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBldGhlcl9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCB0b2tlbl9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBmZGRpX2lmX3ByaW50KHVfY2hhciAqLGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci0KLWV4dGVybiB2b2lkIGdyZV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaWNtcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCi0JCSAgICAgICBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBoc3JwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCQkgICAgICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKTsKLWV4dGVybiB2b2lkIGllZWU4MDJfMTFfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIGlnbXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosCi0JCSAgICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaWdycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCi0JCSAgICAgICBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBpcE5fcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGlweF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgaXNvY2xuc19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKLQkJCSAgdV9pbnQsIHVfaW50LCBjb25zdCB1X2NoYXIgKiwJY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQga3JiX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBsbGFwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gY29uc3QgY2hhciAqbGlua2FkZHJfc3RyaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCQkJCSAgIGNvbnN0IHVfY2hhciAqZXAsIGNvbnN0IHVuc2lnbmVkIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgbHRhbGtfaWZfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JCQkgICB1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKLQkJCSAgIGNvbnN0IHVfY2hhciAqcCk7Ci1leHRlcm4gdm9pZCBtcGxzX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCQkgICAgICAgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKTsKLWV4dGVybiB2b2lkIG1zZHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcCwgdV9pbnQgbGVuZ3RoKTsKLWV4dGVybiB2b2lkIG5mc3JlcGx5X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAotCQkJICAgdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIG5mc3JlcV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKLQkJCSB1X2ludCwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgbnNfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIG50cF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgbnVsbF9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgb3NwZl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKLQkJICAgICAgIHVfaW50LCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBwaW12MV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgbW9iaWxlX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBwaW1fcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHBwcG9lX2lmX3ByaW50KHVfY2hhciAqLGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBwcHBvZV9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgcHBwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAotCQkgICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotCi1leHRlcm4gdm9pZCBwcHBfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHBwcF9oZGxjX2lmX3ByaW50KHVfY2hhciAqLAotCQkJICAgICAgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHBwcF9ic2Rvc19pZl9wcmludCh1X2NoYXIgKiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotCi1leHRlcm4gaW50IHZqY19wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixyZWdpc3RlciBjb25zdCBjaGFyICosCi0JCSAgICAgcmVnaXN0ZXIgdV9pbnQsIHVfc2hvcnQpOwotCi1leHRlcm4gdm9pZCByYXdfaWZfcHJpbnQodV9jaGFyICosCi0JCQkgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLQotZXh0ZXJuIHZvaWQgcmlwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci0KLWV4dGVybiB2b2lkIHNjdHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JCSAgICAgICBjb25zdCB1X2NoYXIgKmJwLCBjb25zdCB1X2NoYXIgKmJwMiwgICAgICAgCi0JCSAgICAgICB1X2ludCBzY3RwUGFja2V0TGVuZ3RoKTsKLQotZXh0ZXJuIHZvaWQgc2xfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLQotZXh0ZXJuIHZvaWQgbGFuZV9pZl9wcmludCh1X2NoYXIgKixjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKixjb25zdCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBjaXBfaWZfcHJpbnQodV9jaGFyICosY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgc2xfYnNkb3NfaWZfcHJpbnQodV9jaGFyICosCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgc2xsX2lmX3ByaW50KHVfY2hhciAqLAotCQkJIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci0KLWV4dGVybiB2b2lkIHNubXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHN1bnJwY3JlcXVlc3RfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCi0JCQkJdV9pbnQsIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHRjcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCi0JCSAgICAgIGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgdGZ0cF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotZXh0ZXJuIHZvaWQgdGltZWRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHVkcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgdV9pbnQsCi0JCSAgICAgIGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgd2JfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3Qgdm9pZCAqLCB1X2ludCk7Ci1leHRlcm4gaW50IGFoX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLAotCQkgICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgZXNwX3ByaW50X2RlY29kZXNlY3JldChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbyk7Ci1leHRlcm4gaW50IGlwY29tcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwKLQkJCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZCByeF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixyZWdpc3RlciBjb25zdCB1X2NoYXIgKiwKLQkJICAgICBpbnQsIGludCwgaW50LCB1X2NoYXIgKik7Ci1leHRlcm4gdm9pZCBuZXRiZXVpX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLHVfc2hvcnQsCi0JCQkgIGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgaXB4X25ldGJpb3NfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIG5idF90Y3BfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBuYnRfdWRwMTM3X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAotCQkJICAgICBjb25zdCB1X2NoYXIgKmRhdGEsIGludCk7Ci1leHRlcm4gdm9pZCBuYnRfdWRwMTM4X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLAotCQkJICAgICBjb25zdCB1X2NoYXIgKmRhdGEsIGludCk7Ci1leHRlcm4gY2hhciAqc21iX2VycnN0cihuZXRkaXNzZWN0X29wdGlvbnMgKixpbnQsIGludCk7Ci1leHRlcm4gY29uc3QgY2hhciAqbnRfZXJyc3RyKG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCB1X2ludDMyX3QpOwotZXh0ZXJuIHZvaWQgcHJpbnRfZGF0YShuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1bnNpZ25lZCBjaGFyICosIGludCk7Ci1leHRlcm4gdm9pZCBsMnRwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBsY3BfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIHZycnBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICpicCwKLQkJICAgICAgIHVfaW50IGxlbiwgaW50IHR0bCk7Ci1leHRlcm4gdm9pZCBjZHBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosCi0JCSAgICAgIHVfaW50LCB1X2ludCwgY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIHN0cF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCk7Ci1leHRlcm4gdm9pZCByYWRpdXNfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGx3cmVzX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBwcHRwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci0KLSNpZmRlZiBJTkVUNgotZXh0ZXJuIHZvaWQgaXA2X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1leHRlcm4gdm9pZCBpcDZfb3B0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLCBpbnQpOwotZXh0ZXJuIGludCBoYmhvcHRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGludCBkc3RvcHRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIGludCBmcmFnNl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwKLQkJICAgICAgIGNvbnN0IHVfY2hhciAqKTsKLWV4dGVybiB2b2lkIGljbXA2X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAotCQkJY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgcmlwbmdfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIGludCk7Ci1leHRlcm4gaW50IHJ0Nl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKixjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOwotZXh0ZXJuIHZvaWQgb3NwZjZfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICosY29uc3QgdV9jaGFyICosIHVfaW50KTsKLWV4dGVybiB2b2lkIGRoY3A2X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLGNvbnN0IHVfY2hhciAqLAotCQkJdV9pbnQsIHVfaW50MTZfdCwgdV9pbnQxNl90KTsKLQotZXh0ZXJuIHZvaWQgemVwaHlyX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqIG5kbywKLQkJCSBjb25zdCB1X2NoYXIgKmNwLCBpbnQgbGVuZ3RoKTsKLQotI2VuZGlmIC8qSU5FVDYqLwotZXh0ZXJuIHVfc2hvcnQgaW5fY2tzdW0oY29uc3QgdV9zaG9ydCAqLAotCQkJcmVnaXN0ZXIgdV9pbnQsIGludCk7Ci0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIG5ldGRpc3NlY3RfaCAqLwpkaWZmIC0tZ2l0IGEvbmZzLmggYi9uZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q0N2M3ZC4uMDAwMDAwMAotLS0gYS9uZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL25mcy5oLHYgMS43IDIwMDIvMTIvMTEgMDc6MTM6NTUgZ3V5IEV4cCAkIChMQkwpICovCi0vKgkkTmV0QlNEOiBuZnMuaCx2IDEuMSAxOTk2LzA1LzIzIDIyOjQ5OjUzIGZ2ZGwgRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQotICogUmljayBNYWNrbGVtIGF0IFRoZSBVbml2ZXJzaXR5IG9mIEd1ZWxwaC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIyluZnNwcm90by5oCTguMiAoQmVya2VsZXkpIDMvMzAvOTUKLSAqLwotCi0vKgotICogbmZzIGRlZmluaXRpb25zIGFzIHBlciB0aGUgVmVyc2lvbiAyIGFuZCAzIHNwZWNzCi0gKi8KLQotLyoKLSAqIENvbnN0YW50cyBhcyBkZWZpbmVkIGluIHRoZSBTdW4gTkZTIFZlcnNpb24gMiBhbmQgMyBzcGVjcy4KLSAqICJORlM6IE5ldHdvcmsgRmlsZSBTeXN0ZW0gUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiIgUkZDMTA5NAotICogYW5kIGluIHRoZSAiTkZTOiBOZXR3b3JrIEZpbGUgU3lzdGVtIFZlcnNpb24gMyBQcm90b2NvbAotICogU3BlY2lmaWNhdGlvbiIKLSAqLwotCi0jZGVmaW5lIE5GU19QT1JUCTIwNDkKLSNkZWZpbmUJTkZTX1BST0cJMTAwMDAzCi0jZGVmaW5lIE5GU19WRVIyCTIKLSNkZWZpbmUJTkZTX1ZFUjMJMwotI2RlZmluZSBORlNfVjJNQVhEQVRBCTgxOTIKLSNkZWZpbmUJTkZTX01BWERHUkFNREFUQSAxNjM4NAotI2RlZmluZQlORlNfTUFYREFUQQkzMjc2OAotI2RlZmluZQlORlNfTUFYUEFUSExFTgkxMDI0Ci0jZGVmaW5lCU5GU19NQVhOQU1MRU4JMjU1Ci0jZGVmaW5lCU5GU19NQVhQS1RIRFIJNDA0Ci0jZGVmaW5lIE5GU19NQVhQQUNLRVQJKE5GU19NQVhQS1RIRFIgKyBORlNfTUFYREFUQSkKLSNkZWZpbmUJTkZTX01JTlBBQ0tFVAkyMAotI2RlZmluZQlORlNfRkFCTEtTSVpFCTUxMgkvKiBTaXplIGluIGJ5dGVzIG9mIGEgYmxvY2sgd3J0IGZhX2Jsb2NrcyAqLwotCi0vKiBTdGF0IG51bWJlcnMgZm9yIHJwYyByZXR1cm5zICh2ZXJzaW9uIDIgYW5kIDMpICovCi0jZGVmaW5lCU5GU19PSwkJCTAKLSNkZWZpbmUJTkZTRVJSX1BFUk0JCTEKLSNkZWZpbmUJTkZTRVJSX05PRU5UCQkyCi0jZGVmaW5lCU5GU0VSUl9JTwkJNQotI2RlZmluZQlORlNFUlJfTlhJTwkJNgotI2RlZmluZQlORlNFUlJfQUNDRVMJCTEzCi0jZGVmaW5lCU5GU0VSUl9FWElTVAkJMTcKLSNkZWZpbmUJTkZTRVJSX1hERVYJCTE4CS8qIFZlcnNpb24gMyBvbmx5ICovCi0jZGVmaW5lCU5GU0VSUl9OT0RFVgkJMTkKLSNkZWZpbmUJTkZTRVJSX05PVERJUgkJMjAKLSNkZWZpbmUJTkZTRVJSX0lTRElSCQkyMQotI2RlZmluZQlORlNFUlJfSU5WQUwJCTIyCS8qIFZlcnNpb24gMyBvbmx5ICovCi0jZGVmaW5lCU5GU0VSUl9GQklHCQkyNwotI2RlZmluZQlORlNFUlJfTk9TUEMJCTI4Ci0jZGVmaW5lCU5GU0VSUl9ST0ZTCQkzMAotI2RlZmluZQlORlNFUlJfTUxJTksJCTMxCS8qIFZlcnNpb24gMyBvbmx5ICovCi0jZGVmaW5lCU5GU0VSUl9OQU1FVE9MCQk2MwotI2RlZmluZQlORlNFUlJfTk9URU1QVFkJCTY2Ci0jZGVmaW5lCU5GU0VSUl9EUVVPVAkJNjkKLSNkZWZpbmUJTkZTRVJSX1NUQUxFCQk3MAotI2RlZmluZQlORlNFUlJfUkVNT1RFCQk3MQkvKiBWZXJzaW9uIDMgb25seSAqLwotI2RlZmluZQlORlNFUlJfV0ZMVVNICQk5OQkvKiBWZXJzaW9uIDIgb25seSAqLwotI2RlZmluZQlORlNFUlJfQkFESEFORExFCTEwMDAxCS8qIFRoZSByZXN0IFZlcnNpb24gMyBvbmx5ICovCi0jZGVmaW5lCU5GU0VSUl9OT1RfU1lOQwkJMTAwMDIKLSNkZWZpbmUJTkZTRVJSX0JBRF9DT09LSUUJMTAwMDMKLSNkZWZpbmUJTkZTRVJSX05PVFNVUFAJCTEwMDA0Ci0jZGVmaW5lCU5GU0VSUl9UT09TTUFMTAkJMTAwMDUKLSNkZWZpbmUJTkZTRVJSX1NFUlZFUkZBVUxUCTEwMDA2Ci0jZGVmaW5lCU5GU0VSUl9CQURUWVBFCQkxMDAwNwotI2RlZmluZQlORlNFUlJfSlVLRUJPWAkJMTAwMDgKLSNkZWZpbmUgTkZTRVJSX1RSWUxBVEVSCQlORlNFUlJfSlVLRUJPWAotI2RlZmluZQlORlNFUlJfU1RBTEVXUklURVZFUkYJMzAwMDEJLyogRmFrZSByZXR1cm4gZm9yIG5mc19jb21taXQoKSAqLwotCi0jZGVmaW5lIE5GU0VSUl9SRVRWT0lECQkweDIwMDAwMDAwIC8qIFJldHVybiB2b2lkLCBub3QgZXJyb3IgKi8KLSNkZWZpbmUgTkZTRVJSX0FVVEhFUlIJCTB4NDAwMDAwMDAgLyogTWFyayBhbiBhdXRoZW50aWNhdGlvbiBlcnJvciAqLwotI2RlZmluZSBORlNFUlJfUkVURVJSCQkweDgwMDAwMDAwIC8qIE1hcmsgYW4gZXJyb3IgcmV0dXJuIGZvciBWMyAqLwotCi0vKiBTaXplcyBpbiBieXRlcyBvZiB2YXJpb3VzIG5mcyBycGMgY29tcG9uZW50cyAqLwotI2RlZmluZQlORlNYX1VOU0lHTkVECTQKLQotLyogc3BlY2lmaWMgdG8gTkZTIFZlcnNpb24gMiAqLwotI2RlZmluZQlORlNYX1YyRkgJMzIKLSNkZWZpbmUJTkZTWF9WMkZBVFRSCTY4Ci0jZGVmaW5lCU5GU1hfVjJTQVRUUgkzMgotI2RlZmluZQlORlNYX1YyQ09PS0lFCTQKLSNkZWZpbmUgTkZTWF9WMlNUQVRGUwkyMAotCi0vKiBzcGVjaWZpYyB0byBORlMgVmVyc2lvbiAzICovCi0jaWYgMAotI2RlZmluZSBORlNYX1YzRkgJCShzaXplb2YgKGZoYW5kbGVfdCkpIC8qIHNpemUgdGhpcyBzZXJ2ZXIgdXNlcyAqLwotI2VuZGlmCi0jZGVmaW5lCU5GU1hfVjNGSE1BWAkJNjQJLyogbWF4LiBhbGxvd2VkIGJ5IHByb3RvY29sICovCi0jZGVmaW5lIE5GU1hfVjNGQVRUUgkJODQKLSNkZWZpbmUgTkZTWF9WM1NBVFRSCQk2MAkvKiBtYXguIGFsbCBmaWVsZHMgZmlsbGVkIGluICovCi0jZGVmaW5lIE5GU1hfVjNTUlZTQVRUUgkJKHNpemVvZiAoc3RydWN0IG5mc3YzX3NhdHRyKSkKLSNkZWZpbmUgTkZTWF9WM1BPU1RPUEFUVFIJKE5GU1hfVjNGQVRUUiArIE5GU1hfVU5TSUdORUQpCi0jZGVmaW5lIE5GU1hfVjNXQ0NEQVRBCQkoTkZTWF9WM1BPU1RPUEFUVFIgKyA4ICogTkZTWF9VTlNJR05FRCkKLSNkZWZpbmUgTkZTWF9WM0NPT0tJRVZFUkYgCTgKLSNkZWZpbmUgTkZTWF9WM1dSSVRFVkVSRiAJOAotI2RlZmluZSBORlNYX1YzQ1JFQVRFVkVSRgk4Ci0jZGVmaW5lIE5GU1hfVjNTVEFURlMJCTUyCi0jZGVmaW5lIE5GU1hfVjNGU0lORk8JCTQ4Ci0jZGVmaW5lIE5GU1hfVjNQQVRIQ09ORgkJMjQKLQotLyogdmFyaWFudHMgZm9yIGJvdGggdmVyc2lvbnMgKi8KLSNkZWZpbmUgTkZTWF9GSCh2MykJCSgodjMpID8gKE5GU1hfVjNGSE1BWCArIE5GU1hfVU5TSUdORUQpIDogXAotCQkJCQlORlNYX1YyRkgpCi0jZGVmaW5lIE5GU1hfU1JWRkgodjMpCQkoKHYzKSA/IE5GU1hfVjNGSCA6IE5GU1hfVjJGSCkKLSNkZWZpbmUJTkZTWF9GQVRUUih2MykJCSgodjMpID8gTkZTWF9WM0ZBVFRSIDogTkZTWF9WMkZBVFRSKQotI2RlZmluZSBORlNYX1BSRU9QQVRUUih2MykJKCh2MykgPyAoNyAqIE5GU1hfVU5TSUdORUQpIDogMCkKLSNkZWZpbmUgTkZTWF9QT1NUT1BBVFRSKHYzKQkoKHYzKSA/IChORlNYX1YzRkFUVFIgKyBORlNYX1VOU0lHTkVEKSA6IDApCi0jZGVmaW5lIE5GU1hfUE9TVE9QT1JGQVRUUih2MykJKCh2MykgPyAoTkZTWF9WM0ZBVFRSICsgTkZTWF9VTlNJR05FRCkgOiBcCi0JCQkJCU5GU1hfVjJGQVRUUikKLSNkZWZpbmUgTkZTWF9XQ0NEQVRBKHYzKQkoKHYzKSA/IE5GU1hfVjNXQ0NEQVRBIDogMCkKLSNkZWZpbmUgTkZTWF9XQ0NPUkZBVFRSKHYzKQkoKHYzKSA/IE5GU1hfVjNXQ0NEQVRBIDogTkZTWF9WMkZBVFRSKQotI2RlZmluZQlORlNYX1NBVFRSKHYzKQkJKCh2MykgPyBORlNYX1YzU0FUVFIgOiBORlNYX1YyU0FUVFIpCi0jZGVmaW5lCU5GU1hfQ09PS0lFVkVSRih2MykJKCh2MykgPyBORlNYX1YzQ09PS0lFVkVSRiA6IDApCi0jZGVmaW5lCU5GU1hfV1JJVEVWRVJGKHYzKQkoKHYzKSA/IE5GU1hfVjNXUklURVZFUkYgOiAwKQotI2RlZmluZSBORlNYX1JFQURESVIodjMpCSgodjMpID8gKDUgKiBORlNYX1VOU0lHTkVEKSA6IFwKLQkJCQkJKDIgKiBORlNYX1VOU0lHTkVEKSkKLSNkZWZpbmUJTkZTWF9TVEFURlModjMpCQkoKHYzKSA/IE5GU1hfVjNTVEFURlMgOiBORlNYX1YyU1RBVEZTKQotCi0vKiBuZnMgcnBjIHByb2NlZHVyZSBudW1iZXJzIChiZWZvcmUgdmVyc2lvbiBtYXBwaW5nKSAqLwotI2RlZmluZQlORlNQUk9DX05VTEwJCTAKLSNkZWZpbmUJTkZTUFJPQ19HRVRBVFRSCQkxCi0jZGVmaW5lCU5GU1BST0NfU0VUQVRUUgkJMgotI2RlZmluZQlORlNQUk9DX0xPT0tVUAkJMwotI2RlZmluZQlORlNQUk9DX0FDQ0VTUwkJNAotI2RlZmluZQlORlNQUk9DX1JFQURMSU5LCTUKLSNkZWZpbmUJTkZTUFJPQ19SRUFECQk2Ci0jZGVmaW5lCU5GU1BST0NfV1JJVEUJCTcKLSNkZWZpbmUJTkZTUFJPQ19DUkVBVEUJCTgKLSNkZWZpbmUJTkZTUFJPQ19NS0RJUgkJOQotI2RlZmluZQlORlNQUk9DX1NZTUxJTksJCTEwCi0jZGVmaW5lCU5GU1BST0NfTUtOT0QJCTExCi0jZGVmaW5lCU5GU1BST0NfUkVNT1ZFCQkxMgotI2RlZmluZQlORlNQUk9DX1JNRElSCQkxMwotI2RlZmluZQlORlNQUk9DX1JFTkFNRQkJMTQKLSNkZWZpbmUJTkZTUFJPQ19MSU5LCQkxNQotI2RlZmluZQlORlNQUk9DX1JFQURESVIJCTE2Ci0jZGVmaW5lCU5GU1BST0NfUkVBRERJUlBMVVMJMTcKLSNkZWZpbmUJTkZTUFJPQ19GU1NUQVQJCTE4Ci0jZGVmaW5lCU5GU1BST0NfRlNJTkZPCQkxOQotI2RlZmluZQlORlNQUk9DX1BBVEhDT05GCTIwCi0jZGVmaW5lCU5GU1BST0NfQ09NTUlUCQkyMQotCi0vKiBBbmQgbGVhc2luZyAobnFuZnMpIHByb2NlZHVyZSBudW1iZXJzIChtdXN0IGJlIGxhc3QpICovCi0jZGVmaW5lCU5RTkZTUFJPQ19HRVRMRUFTRQkyMgotI2RlZmluZQlOUU5GU1BST0NfVkFDQVRFRAkyMwotI2RlZmluZQlOUU5GU1BST0NfRVZJQ1RFRAkyNAotCi0jZGVmaW5lIE5GU1BST0NfTk9PUAkJMjUKLSNkZWZpbmUJTkZTX05QUk9DUwkJMjYKLQotLyogQWN0dWFsIFZlcnNpb24gMiBwcm9jZWR1cmUgbnVtYmVycyAqLwotI2RlZmluZQlORlNWMlBST0NfTlVMTAkJMAotI2RlZmluZQlORlNWMlBST0NfR0VUQVRUUgkxCi0jZGVmaW5lCU5GU1YyUFJPQ19TRVRBVFRSCTIKLSNkZWZpbmUJTkZTVjJQUk9DX05PT1AJCTMKLSNkZWZpbmUJTkZTVjJQUk9DX1JPT1QJCU5GU1YyUFJPQ19OT09QCS8qIE9ic29sZXRlICovCi0jZGVmaW5lCU5GU1YyUFJPQ19MT09LVVAJNAotI2RlZmluZQlORlNWMlBST0NfUkVBRExJTksJNQotI2RlZmluZQlORlNWMlBST0NfUkVBRAkJNgotI2RlZmluZQlORlNWMlBST0NfV1JJVEVDQUNIRQlORlNWMlBST0NfTk9PUAkvKiBPYnNvbGV0ZSAqLwotI2RlZmluZQlORlNWMlBST0NfV1JJVEUJCTgKLSNkZWZpbmUJTkZTVjJQUk9DX0NSRUFURQk5Ci0jZGVmaW5lCU5GU1YyUFJPQ19SRU1PVkUJMTAKLSNkZWZpbmUJTkZTVjJQUk9DX1JFTkFNRQkxMQotI2RlZmluZQlORlNWMlBST0NfTElOSwkJMTIKLSNkZWZpbmUJTkZTVjJQUk9DX1NZTUxJTksJMTMKLSNkZWZpbmUJTkZTVjJQUk9DX01LRElSCQkxNAotI2RlZmluZQlORlNWMlBST0NfUk1ESVIJCTE1Ci0jZGVmaW5lCU5GU1YyUFJPQ19SRUFERElSCTE2Ci0jZGVmaW5lCU5GU1YyUFJPQ19TVEFURlMJMTcKLQotLyoKLSAqIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBWZXJzaW9uIDMgcHJvdG9jb2wgZm9yIHZhcmlvdXMgUlBDcwotICovCi0jZGVmaW5lIE5GU1YzU0FUVFJUSU1FX0RPTlRDSEFOR0UJMAotI2RlZmluZSBORlNWM1NBVFRSVElNRV9UT1NFUlZFUgkJMQotI2RlZmluZSBORlNWM1NBVFRSVElNRV9UT0NMSUVOVAkJMgotCi0jZGVmaW5lIE5GU1YzQVRUUlRJTUVfTk1PREVTCQkzCi0KLSNkZWZpbmUgTkZTVjNBQ0NFU1NfUkVBRAkJMHgwMQotI2RlZmluZSBORlNWM0FDQ0VTU19MT09LVVAJCTB4MDIKLSNkZWZpbmUgTkZTVjNBQ0NFU1NfTU9ESUZZCQkweDA0Ci0jZGVmaW5lIE5GU1YzQUNDRVNTX0VYVEVORAkJMHgwOAotI2RlZmluZSBORlNWM0FDQ0VTU19ERUxFVEUJCTB4MTAKLSNkZWZpbmUgTkZTVjNBQ0NFU1NfRVhFQ1VURQkJMHgyMAotCi0jZGVmaW5lIE5GU1YzV1JJVEVfVU5TVEFCTEUJCTAKLSNkZWZpbmUgTkZTVjNXUklURV9EQVRBU1lOQwkJMQotI2RlZmluZSBORlNWM1dSSVRFX0ZJTEVTWU5DCQkyCi0KLSNkZWZpbmUgTkZTVjNXUklURV9OTU9ERVMJCTMKLQotI2RlZmluZSBORlNWM0NSRUFURV9VTkNIRUNLRUQJCTAKLSNkZWZpbmUgTkZTVjNDUkVBVEVfR1VBUkRFRAkJMQotI2RlZmluZSBORlNWM0NSRUFURV9FWENMVVNJVkUJCTIKLQotI2RlZmluZSBORlNWM0NSRUFURV9OTU9ERVMJCTMKLQotI2RlZmluZSBORlNWM0ZTSU5GT19MSU5LCQkweDAxCi0jZGVmaW5lIE5GU1YzRlNJTkZPX1NZTUxJTksJCTB4MDIKLSNkZWZpbmUgTkZTVjNGU0lORk9fSE9NT0dFTkVPVVMJCTB4MDgKLSNkZWZpbmUgTkZTVjNGU0lORk9fQ0FOU0VUVElNRQkJMHgxMAotCi0vKiBDb252ZXJzaW9uIG1hY3JvcyAqLwotI2RlZmluZQl2dG9uZnN2Ml9tb2RlKHQsbSkgXAotCQl0eGRyX3Vuc2lnbmVkKCgodCkgPT0gVkZJRk8pID8gTUFLRUlNT0RFKFZDSFIsIChtKSkgOiBcCi0JCQkJTUFLRUlNT0RFKCh0KSwgKG0pKSkKLSNkZWZpbmUgdnRvbmZzdjNfbW9kZShtKQl0eGRyX3Vuc2lnbmVkKChtKSAmIDA3Nzc3KQotI2RlZmluZQluZnN0b3ZfbW9kZShhKQkJKGZ4ZHJfdW5zaWduZWQodV9pbnQxNl90LCAoYSkpJjA3Nzc3KQotI2RlZmluZQl2dG9uZnN2Ml90eXBlKGEpCXR4ZHJfdW5zaWduZWQobmZzdjJfdHlwZVsoKGludDMyX3QpKGEpKV0pCi0jZGVmaW5lCXZ0b25mc3YzX3R5cGUoYSkJdHhkcl91bnNpZ25lZChuZnN2M190eXBlWygoaW50MzJfdCkoYSkpXSkKLSNkZWZpbmUJbmZzdjJ0b3ZfdHlwZShhKQludjJ0b3ZfdHlwZVtmeGRyX3Vuc2lnbmVkKHVfaW50MzJfdCwoYSkpJjB4N10KLSNkZWZpbmUJbmZzdjN0b3ZfdHlwZShhKQludjN0b3ZfdHlwZVtmeGRyX3Vuc2lnbmVkKHVfaW50MzJfdCwoYSkpJjB4N10KLQotLyogRmlsZSB0eXBlcyAqLwotdHlwZWRlZiBlbnVtIHsgTkZOT049MCwgTkZSRUc9MSwgTkZESVI9MiwgTkZCTEs9MywgTkZDSFI9NCwgTkZMTks9NSwKLQlORlNPQ0s9NiwgTkZGSUZPPTcgfSBuZnNfdHlwZTsKLQotLyogU3RydWN0cyBmb3IgY29tbW9uIHBhcnRzIG9mIHRoZSBycGMncyAqLwotLyoKLSAqIEZpbGUgSGFuZGxlICgzMiBieXRlcyBmb3IgdmVyc2lvbiAyKSwgdmFyaWFibGUgdXAgdG8gNjQgZm9yIHZlcnNpb24gMy4KLSAqIEZpbGUgSGFuZGxlcyBvZiB1cCB0byBORlNfU01BTExGSCBpbiBzaXplIGFyZSBzdG9yZWQgZGlyZWN0bHkgaW4gdGhlCi0gKiBuZnMgbm9kZSwgd2hlcmVhcyBsYXJnZXIgb25lcyBhcmUgbWFsbG9jJ2QuIChUaGlzIG5ldmVyIGhhcHBlbnMgd2hlbgotICogTkZTX1NNQUxMRkggaXMgc2V0IHRvIDY0LikKLSAqIE5GU19TTUFMTEZIIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMzIgdG8gNjQgYW5kIGJlIGRpdmlzaWJsZSBieSA0LgotICovCi0jaWZuZGVmIE5GU19TTUFMTEZICi0jZGVmaW5lIE5GU19TTUFMTEZICTY0Ci0jZW5kaWYKLXVuaW9uIG5mc2ZoIHsKLS8qCWZoYW5kbGVfdCBmaF9nZW5lcmljOyAqLwotCXVfY2hhciAgICBmaF9ieXRlc1tORlNfU01BTExGSF07Ci19OwotdHlwZWRlZiB1bmlvbiBuZnNmaCBuZnNmaF90OwotCi1zdHJ1Y3QgbmZzdjJfdGltZSB7Ci0JdV9pbnQzMl90IG5mc3YyX3NlYzsKLQl1X2ludDMyX3QgbmZzdjJfdXNlYzsKLX07Ci10eXBlZGVmIHN0cnVjdCBuZnN2Ml90aW1lCW5mc3RpbWUyOwotCi1zdHJ1Y3QgbmZzdjNfdGltZSB7Ci0JdV9pbnQzMl90IG5mc3YzX3NlYzsKLQl1X2ludDMyX3QgbmZzdjNfbnNlYzsKLX07Ci10eXBlZGVmIHN0cnVjdCBuZnN2M190aW1lCW5mc3RpbWUzOwotCi0vKgotICogUXVhZHMgYXJlIGRlZmluZWQgYXMgYXJyYXlzIG9mIDIgbG9uZ3MgdG8gZW5zdXJlIGRlbnNlIHBhY2tpbmcgZm9yIHRoZQotICogcHJvdG9jb2wgYW5kIHRvIGZhY2lsaXRhdGUgeGRyIGNvbnZlcnNpb24uCi0gKi8KLXN0cnVjdCBuZnNfdXF1YWQgewotCXVfaW50MzJfdCBuZnN1cXVhZFsyXTsKLX07Ci10eXBlZGVmCXN0cnVjdCBuZnNfdXF1YWQJbmZzdWludDY0OwotCi0jaWYgMCAvKiBYWFggLSB0aGlzIGRvZXNuJ3Qgc2VlbWVkIHRvIGJlIHVzZWQgYW5kIGl0IGRvZXNuJ3Qgd29yawotICAgICAgICogd2l0aCBub24tZ2NjLCBzbyBjb21tZW50IGl0IG91dCBmb3Igbm93LgotICAgICAgICovCi0KLS8qCi0gKiBVc2VkIHRvIGNvbnZlcnQgYmV0d2VlbiB0d28gdV9sb25ncyBhbmQgYSB1X3F1YWRfdC4KLSAqLwotdW5pb24gbmZzX3F1YWRjb252ZXJ0IHsKLQl1X2ludDMyX3QgbHZhbFsyXTsKLQl1X2ludDY0X3QgcXZhbDsKLX07Ci10eXBlZGVmIHVuaW9uIG5mc19xdWFkY29udmVydAluZnNxdWFkX3Q7Ci0KLSNlbmRpZgotCi0vKgotICogTkZTIFZlcnNpb24gMyBzcGVjaWFsIGZpbGUgbnVtYmVyLgotICovCi1zdHJ1Y3QgbmZzdjNfc3BlYyB7Ci0JdV9pbnQzMl90IHNwZWNkYXRhMTsKLQl1X2ludDMyX3Qgc3BlY2RhdGEyOwotfTsKLXR5cGVkZWYJc3RydWN0IG5mc3YzX3NwZWMJbmZzdjNzcGVjOwotCi0vKgotICogRmlsZSBhdHRyaWJ1dGVzIGFuZCBzZXRhYmxlIGF0dHJpYnV0ZXMuIFRoZXNlIHN0cnVjdHVyZXMgY292ZXIgYm90aAotICogTkZTIHZlcnNpb24gMiBhbmQgdGhlIHZlcnNpb24gMyBwcm90b2NvbC4gTm90ZSB0aGF0IHRoZSB1bmlvbiBpcyBvbmx5Ci0gKiB1c2VkIHNvIHRoYXQgb25lIHBvaW50ZXIgY2FuIHJlZmVyIHRvIGJvdGggdmFyaWFudHMuIFRoZXNlIHN0cnVjdHVyZXMKLSAqIGdvIG91dCBvbiB0aGUgd2lyZSBhbmQgbXVzdCBiZSBkZW5zZWx5IHBhY2tlZCwgc28gbm8gcXVhZCBkYXRhIHR5cGVzCi0gKiBhcmUgdXNlZC4gKGFsbCBmaWVsZHMgYXJlIGxvbmdzIG9yIHVfbG9uZ3Mgb3Igc3RydWN0dXJlcyBvZiBzYW1lKQotICogTkI6IFlvdSBjYW4ndCBkbyBzaXplb2Yoc3RydWN0IG5mc19mYXR0ciksIHlvdSBtdXN0IHVzZSB0aGUKLSAqICAgICBORlNYX0ZBVFRSKHYzKSBtYWNyby4KLSAqLwotc3RydWN0IG5mc19mYXR0ciB7Ci0JdV9pbnQzMl90IGZhX3R5cGU7Ci0JdV9pbnQzMl90IGZhX21vZGU7Ci0JdV9pbnQzMl90IGZhX25saW5rOwotCXVfaW50MzJfdCBmYV91aWQ7Ci0JdV9pbnQzMl90IGZhX2dpZDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQl1X2ludDMyX3QgbmZzdjJmYV9zaXplOwotCQkJdV9pbnQzMl90IG5mc3YyZmFfYmxvY2tzaXplOwotCQkJdV9pbnQzMl90IG5mc3YyZmFfcmRldjsKLQkJCXVfaW50MzJfdCBuZnN2MmZhX2Jsb2NrczsKLQkJCXVfaW50MzJfdCBuZnN2MmZhX2ZzaWQ7Ci0JCQl1X2ludDMyX3QgbmZzdjJmYV9maWxlaWQ7Ci0JCQluZnN0aW1lMiAgbmZzdjJmYV9hdGltZTsKLQkJCW5mc3RpbWUyICBuZnN2MmZhX210aW1lOwotCQkJbmZzdGltZTIgIG5mc3YyZmFfY3RpbWU7Ci0JCX0gZmFfbmZzdjI7Ci0JCXN0cnVjdCB7Ci0JCQluZnN1aW50NjQgbmZzdjNmYV9zaXplOwotCQkJbmZzdWludDY0IG5mc3YzZmFfdXNlZDsKLQkJCW5mc3Yzc3BlYyBuZnN2M2ZhX3JkZXY7Ci0JCQluZnN1aW50NjQgbmZzdjNmYV9mc2lkOwotCQkJbmZzdWludDY0IG5mc3YzZmFfZmlsZWlkOwotCQkJbmZzdGltZTMgIG5mc3YzZmFfYXRpbWU7Ci0JCQluZnN0aW1lMyAgbmZzdjNmYV9tdGltZTsKLQkJCW5mc3RpbWUzICBuZnN2M2ZhX2N0aW1lOwotCQl9IGZhX25mc3YzOwotCX0gZmFfdW47Ci19OwotCi0vKiBhbmQgc29tZSB1Z2x5IGRlZmluZXMgZm9yIGFjY2Vzc2luZyB1bmlvbiBjb21wb25lbnRzICovCi0jZGVmaW5lCWZhMl9zaXplCQlmYV91bi5mYV9uZnN2Mi5uZnN2MmZhX3NpemUKLSNkZWZpbmUJZmEyX2Jsb2Nrc2l6ZQkJZmFfdW4uZmFfbmZzdjIubmZzdjJmYV9ibG9ja3NpemUKLSNkZWZpbmUJZmEyX3JkZXYJCWZhX3VuLmZhX25mc3YyLm5mc3YyZmFfcmRldgotI2RlZmluZQlmYTJfYmxvY2tzCQlmYV91bi5mYV9uZnN2Mi5uZnN2MmZhX2Jsb2NrcwotI2RlZmluZQlmYTJfZnNpZAkJZmFfdW4uZmFfbmZzdjIubmZzdjJmYV9mc2lkCi0jZGVmaW5lCWZhMl9maWxlaWQJCWZhX3VuLmZhX25mc3YyLm5mc3YyZmFfZmlsZWlkCi0jZGVmaW5lCWZhMl9hdGltZQkJZmFfdW4uZmFfbmZzdjIubmZzdjJmYV9hdGltZQotI2RlZmluZQlmYTJfbXRpbWUJCWZhX3VuLmZhX25mc3YyLm5mc3YyZmFfbXRpbWUKLSNkZWZpbmUJZmEyX2N0aW1lCQlmYV91bi5mYV9uZnN2Mi5uZnN2MmZhX2N0aW1lCi0jZGVmaW5lCWZhM19zaXplCQlmYV91bi5mYV9uZnN2My5uZnN2M2ZhX3NpemUKLSNkZWZpbmUJZmEzX3VzZWQJCWZhX3VuLmZhX25mc3YzLm5mc3YzZmFfdXNlZAotI2RlZmluZQlmYTNfcmRldgkJZmFfdW4uZmFfbmZzdjMubmZzdjNmYV9yZGV2Ci0jZGVmaW5lCWZhM19mc2lkCQlmYV91bi5mYV9uZnN2My5uZnN2M2ZhX2ZzaWQKLSNkZWZpbmUJZmEzX2ZpbGVpZAkJZmFfdW4uZmFfbmZzdjMubmZzdjNmYV9maWxlaWQKLSNkZWZpbmUJZmEzX2F0aW1lCQlmYV91bi5mYV9uZnN2My5uZnN2M2ZhX2F0aW1lCi0jZGVmaW5lCWZhM19tdGltZQkJZmFfdW4uZmFfbmZzdjMubmZzdjNmYV9tdGltZQotI2RlZmluZQlmYTNfY3RpbWUJCWZhX3VuLmZhX25mc3YzLm5mc3YzZmFfY3RpbWUKLQotc3RydWN0IG5mc3YyX3NhdHRyIHsKLQl1X2ludDMyX3Qgc2FfbW9kZTsKLQl1X2ludDMyX3Qgc2FfdWlkOwotCXVfaW50MzJfdCBzYV9naWQ7Ci0JdV9pbnQzMl90IHNhX3NpemU7Ci0JbmZzdGltZTIgIHNhX2F0aW1lOwotCW5mc3RpbWUyICBzYV9tdGltZTsKLX07Ci0KLS8qCi0gKiBORlMgVmVyc2lvbiAzIHNhdHRyIHN0cnVjdHVyZSBmb3IgdGhlIG5ldyBub2RlIGNyZWF0aW9uIGNhc2UuCi0gKi8KLXN0cnVjdCBuZnN2M19zYXR0ciB7Ci0JdV9pbnQzMl90ICAgc2FfbW9kZXNldDsKLQl1X2ludDMyX3QgICBzYV9tb2RlOwotCXVfaW50MzJfdCAgIHNhX3VpZHNldDsKLQl1X2ludDMyX3QgICBzYV91aWQ7Ci0JdV9pbnQzMl90ICAgc2FfZ2lkc2V0OwotCXVfaW50MzJfdCAgIHNhX2dpZDsKLQl1X2ludDMyX3QgICBzYV9zaXplc2V0OwotCXVfaW50MzJfdCAgIHNhX3NpemU7Ci0JdV9pbnQzMl90ICAgc2FfYXRpbWV0eXBlOwotCW5mc3RpbWUzICBzYV9hdGltZTsKLQl1X2ludDMyX3QgICBzYV9tdGltZXR5cGU7Ci0JbmZzdGltZTMgIHNhX210aW1lOwotfTsKLQotc3RydWN0IG5mc19zdGF0ZnMgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXVfaW50MzJfdCBuZnN2MnNmX3RzaXplOwotCQkJdV9pbnQzMl90IG5mc3Yyc2ZfYnNpemU7Ci0JCQl1X2ludDMyX3QgbmZzdjJzZl9ibG9ja3M7Ci0JCQl1X2ludDMyX3QgbmZzdjJzZl9iZnJlZTsKLQkJCXVfaW50MzJfdCBuZnN2MnNmX2JhdmFpbDsKLQkJfSBzZl9uZnN2MjsKLQkJc3RydWN0IHsKLQkJCW5mc3VpbnQ2NCBuZnN2M3NmX3RieXRlczsKLQkJCW5mc3VpbnQ2NCBuZnN2M3NmX2ZieXRlczsKLQkJCW5mc3VpbnQ2NCBuZnN2M3NmX2FieXRlczsKLQkJCW5mc3VpbnQ2NCBuZnN2M3NmX3RmaWxlczsKLQkJCW5mc3VpbnQ2NCBuZnN2M3NmX2ZmaWxlczsKLQkJCW5mc3VpbnQ2NCBuZnN2M3NmX2FmaWxlczsKLQkJCXVfaW50MzJfdCBuZnN2M3NmX2ludmFyc2VjOwotCQl9IHNmX25mc3YzOwotCX0gc2ZfdW47Ci19OwotCi0jZGVmaW5lIHNmX3RzaXplCXNmX3VuLnNmX25mc3YyLm5mc3Yyc2ZfdHNpemUKLSNkZWZpbmUgc2ZfYnNpemUJc2ZfdW4uc2ZfbmZzdjIubmZzdjJzZl9ic2l6ZQotI2RlZmluZSBzZl9ibG9ja3MJc2ZfdW4uc2ZfbmZzdjIubmZzdjJzZl9ibG9ja3MKLSNkZWZpbmUgc2ZfYmZyZWUJc2ZfdW4uc2ZfbmZzdjIubmZzdjJzZl9iZnJlZQotI2RlZmluZSBzZl9iYXZhaWwJc2ZfdW4uc2ZfbmZzdjIubmZzdjJzZl9iYXZhaWwKLSNkZWZpbmUgc2ZfdGJ5dGVzCXNmX3VuLnNmX25mc3YzLm5mc3Yzc2ZfdGJ5dGVzCi0jZGVmaW5lIHNmX2ZieXRlcwlzZl91bi5zZl9uZnN2My5uZnN2M3NmX2ZieXRlcwotI2RlZmluZSBzZl9hYnl0ZXMJc2ZfdW4uc2ZfbmZzdjMubmZzdjNzZl9hYnl0ZXMKLSNkZWZpbmUgc2ZfdGZpbGVzCXNmX3VuLnNmX25mc3YzLm5mc3Yzc2ZfdGZpbGVzCi0jZGVmaW5lIHNmX2ZmaWxlcwlzZl91bi5zZl9uZnN2My5uZnN2M3NmX2ZmaWxlcwotI2RlZmluZSBzZl9hZmlsZXMJc2ZfdW4uc2ZfbmZzdjMubmZzdjNzZl9hZmlsZXMKLSNkZWZpbmUgc2ZfaW52YXJzZWMJc2ZfdW4uc2ZfbmZzdjMubmZzdjNzZl9pbnZhcnNlYwotCi1zdHJ1Y3QgbmZzdjNfZnNpbmZvIHsKLQl1X2ludDMyX3QgZnNfcnRtYXg7Ci0JdV9pbnQzMl90IGZzX3J0cHJlZjsKLQl1X2ludDMyX3QgZnNfcnRtdWx0OwotCXVfaW50MzJfdCBmc193dG1heDsKLQl1X2ludDMyX3QgZnNfd3RwcmVmOwotCXVfaW50MzJfdCBmc193dG11bHQ7Ci0JdV9pbnQzMl90IGZzX2R0cHJlZjsKLQluZnN1aW50NjQgZnNfbWF4ZmlsZXNpemU7Ci0JbmZzdGltZTMgIGZzX3RpbWVkZWx0YTsKLQl1X2ludDMyX3QgZnNfcHJvcGVydGllczsKLX07Ci0KLXN0cnVjdCBuZnN2M19wYXRoY29uZiB7Ci0JdV9pbnQzMl90IHBjX2xpbmttYXg7Ci0JdV9pbnQzMl90IHBjX25hbWVtYXg7Ci0JdV9pbnQzMl90IHBjX25vdHJ1bmM7Ci0JdV9pbnQzMl90IHBjX2Nob3ducmVzdHJpY3RlZDsKLQl1X2ludDMyX3QgcGNfY2FzZWluc2Vuc2l0aXZlOwotCXVfaW50MzJfdCBwY19jYXNlcHJlc2VydmluZzsKLX07CmRpZmYgLS1naXQgYS9uZnNmaC5oIGIvbmZzZmguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhODJlNC4uMDAwMDAwMAotLS0gYS9uZnNmaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9uZnNmaC5oLHYgMS4xMyAyMDAyLzA0LzI0IDA2OjI3OjA1IGd1eSBFeHAgJCAoTEJMKSAqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0IEplZmZyZXkgQy4gTW9ndWwsIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLAotICogV2VzdGVybiBSZXNlYXJjaCBMYWJvcmF0b3J5LiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDAxIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIGFuZCBtb2RpZnkgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCi0gKiAgZG9jdW1lbnRhdGlvbiBpcyBoZXJlYnkgZ3JhbnRlZCBvbmx5IHVuZGVyIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kCi0gKiAgY29uZGl0aW9ucy4gIEJvdGggdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgotICogIG5vdGljZSBtdXN0IGFwcGVhciBpbiBhbGwgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcwotICogIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zIHRoZXJlb2YsIGFuZCBib3RoIG5vdGljZXMKLSAqICBtdXN0IGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCi0gKgotICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogIGFyZSBtZXQ6Ci0gKiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQ09NUEFRIENPTVBVVEVSIENPUlBPUkFUSU9OCi0gKiAgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwotICogIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgIElOIE5PCi0gKiAgRVZFTlQgU0hBTEwgQ09NUEFRIENPTVBVVEVSIENPUlBPUkFUSU9OIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiAgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOCi0gKiAgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORwotICogIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCi0gKiAgU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIG5mc2ZoLmggLSBORlMgZmlsZSBoYW5kbGUgZGVmaW5pdGlvbnMgKGZvciBwb3J0YWJsZSB1c2UpCi0gKgotICogSmVmZnJleSBDLiBNb2d1bAotICogRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24KLSAqIFdlc3Rlcm4gUmVzZWFyY2ggTGFib3JhdG9yeQotICovCi0KLS8qCi0gKiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBkZXZfdCwgYmVjYXVzZSBkaWZmZXJlbnQgTkZTIHNlcnZlcnMKLSAqIHRoYXQgd2UgbWlnaHQgYmUgc3B5aW5nIHVwb24gdXNlIGRpZmZlcmVudCBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQl1X2ludDMyX3QgTWlub3I7CS8qIHVwcGVyIGNhc2UgdG8gYXZvaWQgY2xhc2hpbmcgd2l0aCBtYWNybyBuYW1lcyAqLwotCXVfaW50MzJfdCBNYWpvcjsKLX0gbXlfZGV2dDsKLQotI2RlZmluZQlkZXZfZXEoYSxiKQkoKGEuTWlub3IgPT0gYi5NaW5vcikgJiYgKGEuTWFqb3IgPT0gYi5NYWpvcikpCi0KLS8qCi0gKiBNYW55IGZpbGUgc2VydmVycyBub3cgdXNlIGEgbGFyZ2UgZmlsZSBzeXN0ZW0gSUQuICBUaGlzIGlzCi0gKiBvdXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhhdC4KLSAqLwotdHlwZWRlZglzdHJ1Y3QgewotCW15X2RldnQJRnNpZF9kZXY7CQkvKiBYWFggYXZvaWQgbmFtZSBjb25mbGljdCB3aXRoIEFJWCAqLwotCWNoYXIgT3BhcXVlX0hhbmRsZVsyICogMzIgKyAxXTsKLQl1X2ludDMyX3QgZnNpZF9jb2RlOwotfSBteV9mc2lkOwotCi0jZGVmaW5lCWZzaWRfZXEoYSxiKQkoKGEuZnNpZF9jb2RlID09IGIuZnNpZF9jb2RlKSAmJlwKLQkJCSBkZXZfZXEoYS5Gc2lkX2RldiwgYi5Gc2lkX2RldikpCi0KLWV4dGVybiB2b2lkIFBhcnNlX2ZoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgaW50LCBteV9mc2lkICosIGlub190ICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIGludCk7CmRpZmYgLS1naXQgYS9ubHBpZC5jIGIvbmxwaWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2RmZDZhNi4uMDAwMDAwMAotLS0gYS9ubHBpZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL25scGlkLmMsdiAxLjQgMjAwNC8xMC8xOSAxNToyNzo1NSBoYW5uZXMgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibmxwaWQuaCIKLQotc3RydWN0IHRvayBubHBpZF92YWx1ZXNbXSA9IHsKLSAgICB7IE5MUElEX05VTExOUywgIk5VTEwiIH0sCi0gICAgeyBOTFBJRF9ROTMzLCAiUS45MzMiIH0sCi0gICAgeyBOTFBJRF9MTUksICJMTUkiIH0sCi0gICAgeyBOTFBJRF9TTkFQLCAiU05BUCIgfSwKLSAgICB7IE5MUElEX0NMTlAsICJDTE5QIiB9LAotICAgIHsgTkxQSURfRVNJUywgIkVTLUlTIiB9LAotICAgIHsgTkxQSURfSVNJUywgIklTLUlTIiB9LAotICAgIHsgTkxQSURfQ09OUywgIkNPTlMiIH0sCi0gICAgeyBOTFBJRF9JRFJQLCAiSURSUCIgfSwKLSAgICB7IE5MUElEX01GUiwgIkZSRi4xNSIgfSwKLSAgICB7IE5MUElEX0lQLCAiSVB2NCIgfSwKLSAgICB7IE5MUElEX1BQUCwgIlBQUCIgfSwKLSAgICB7IE5MUElEX1gyNV9FU0lTLCAiWDI1IEVTLUlTIiB9LAotICAgIHsgTkxQSURfSVA2LCAiSVB2NiIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKZGlmZiAtLWdpdCBhL25scGlkLmggYi9ubHBpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGNhNDQ2Li4wMDAwMDAwCi0tLSBhL25scGlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL25scGlkLmgsdiAxLjQgMjAwNC8xMC8xOSAxNToyNzo1NSBoYW5uZXMgRXhwICQgKExCTCkgKi8KLS8qIAotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCi0gKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKLSAqLwotCi1leHRlcm4gc3RydWN0IHRvayBubHBpZF92YWx1ZXNbXTsKLQotI2RlZmluZQlOTFBJRF9OVUxMTlMJMHgwMAotI2RlZmluZSBOTFBJRF9ROTMzICAgICAgMHgwOCAvKiBBTlNJIFQxLjYxNyBBbm5leCBEIG9yIElUVS1UIFEuOTMzIEFubmV4IEEgKi8KLSNkZWZpbmUgTkxQSURfTE1JICAgICAgIDB4MDkgLyogVGhlIG9yaWdpbmFsLCBha2EgQ2lzY28sIGFrYSBHYW5nIG9mIEZvdXIgKi8KLSNkZWZpbmUgTkxQSURfU05BUCAgICAgIDB4ODAKLSNkZWZpbmUJTkxQSURfQ0xOUAkweDgxIC8qIGlzbzk1NzcgKi8KLSNkZWZpbmUJTkxQSURfRVNJUwkweDgyIC8qIGlzbzk1NzcgKi8KLSNkZWZpbmUJTkxQSURfSVNJUwkweDgzIC8qIGlzbzk1NzcgKi8KLSNkZWZpbmUgTkxQSURfQ09OUyAgICAgIDB4ODQKLSNkZWZpbmUgTkxQSURfSURSUCAgICAgIDB4ODUKLSNkZWZpbmUgTkxQSURfTUZSICAgICAgIDB4YjEgLyogRlJGLjE1ICovCi0jZGVmaW5lIE5MUElEX0lQICAgICAgICAweGNjCi0jZGVmaW5lIE5MUElEX1BQUCAgICAgICAweGNmCi0jZGVmaW5lIE5MUElEX1gyNV9FU0lTICAweDhhCi0jZGVmaW5lIE5MUElEX0lQNiAgICAgICAweDhlCmRpZmYgLS1naXQgYS9udHAuaCBiL250cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjg1NjY5Li4wMDAwMDAwCi0tLSBhL250cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL250cC5oLHYgMS44IDIwMDQvMDEvMjggMTQ6MzQ6NTAgaGFubmVzIEV4cCAkICovCi0KLS8qCi0gKiBCYXNlZCBvbiBudHAuaCBmcm9tIHRoZSBVIG9mIE1EIGltcGxlbWVudGF0aW9uCi0gKglUaGlzIGZpbGUgaXMgYmFzZWQgb24gVmVyc2lvbiAyIG9mIHRoZSBOVFAgc3BlYyAoUkZDMTExOSkuCi0gKi8KLQotLyoKLSAqICBEZWZpbml0aW9ucyBmb3IgdGhlIG1hc3NlcwotICovCi0jZGVmaW5lCUpBTl8xOTcwCTIyMDg5ODg4MDBVCS8qIDE5NzAgLSAxOTAwIGluIHNlY29uZHMgKi8KLQotLyoKLSAqIFN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgTlRQIGZpeGVkIHBvaW50IHZhbHVlcwotICoKLSAqICAgIDAJCQkgIDEJCSAgICAgIDIJCQkgIDMKLSAqICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICB8CQkJICAgICAgIEludGVnZXIgUGFydAkJCSAgICAgfAotICogICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICB8CQkJICAgICAgIEZyYWN0aW9uIFBhcnQJCQkgICAgIHwKLSAqICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqCi0gKiAgICAwCQkJICAxCQkgICAgICAyCQkJICAzCi0gKiAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgfAkJICBJbnRlZ2VyIFBhcnQJICAgICB8CSAgIEZyYWN0aW9uIFBhcnQJICAgICB8Ci0gKiAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0qLwotc3RydWN0IGxfZml4ZWRwdCB7Ci0JdV9pbnQzMl90IGludF9wYXJ0OwotCXVfaW50MzJfdCBmcmFjdGlvbjsKLX07Ci0KLXN0cnVjdCBzX2ZpeGVkcHQgewotCXVfaW50MTZfdCBpbnRfcGFydDsKLQl1X2ludDE2X3QgZnJhY3Rpb247Ci19OwotCi0vKiByZmMyMDMwCi0gKiAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHxMSSB8IFZOICB8TW9kZSB8ICAgIFN0cmF0dW0gICAgfCAgICAgUG9sbCAgICAgIHwgICBQcmVjaXNpb24gICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdCBEZWxheSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICBSb290IERpc3BlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2UgSWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIFRpbWVzdGFtcCAoNjQpICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgIE9yaWdpbmF0ZSBUaW1lc3RhbXAgKDY0KSAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgUmVjZWl2ZSBUaW1lc3RhbXAgKDY0KSAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgIFRyYW5zbWl0IFRpbWVzdGFtcCAoNjQpICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgIEtleSBJZGVudGlmaWVyIChvcHRpb25hbCkgKDMyKSAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICBNZXNzYWdlIERpZ2VzdCAob3B0aW9uYWwpICgxMjgpICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICovCi0KLXN0cnVjdCBudHBkYXRhIHsKLQl1X2NoYXIgc3RhdHVzOwkJLyogc3RhdHVzIG9mIGxvY2FsIGNsb2NrIGFuZCBsZWFwIGluZm8gKi8KLQl1X2NoYXIgc3RyYXR1bTsJCS8qIFN0cmF0dW0gbGV2ZWwgKi8KLQl1X2NoYXIgcHBvbGw7CQkvKiBwb2xsIHZhbHVlICovCi0JaW50IHByZWNpc2lvbjo4OwotCXN0cnVjdCBzX2ZpeGVkcHQgcm9vdF9kZWxheTsKLQlzdHJ1Y3Qgc19maXhlZHB0IHJvb3RfZGlzcGVyc2lvbjsKLQl1X2ludDMyX3QgcmVmaWQ7Ci0Jc3RydWN0IGxfZml4ZWRwdCByZWZfdGltZXN0YW1wOwotCXN0cnVjdCBsX2ZpeGVkcHQgb3JnX3RpbWVzdGFtcDsKLQlzdHJ1Y3QgbF9maXhlZHB0IHJlY190aW1lc3RhbXA7Ci0Jc3RydWN0IGxfZml4ZWRwdCB4bXRfdGltZXN0YW1wOwotICAgICAgICB1X2ludDMyX3Qga2V5X2lkOwotICAgICAgICB1X2ludDhfdCAgbWVzc2FnZV9kaWdlc3RbMTZdOwotfTsKLS8qCi0gKglMZWFwIFNlY29uZCBDb2RlcyAoaGlnaCBvcmRlciB0d28gYml0cykKLSAqLwotI2RlZmluZQlOT19XQVJOSU5HCTB4MDAJLyogbm8gd2FybmluZyAqLwotI2RlZmluZQlQTFVTX1NFQwkweDQwCS8qIGFkZCBhIHNlY29uZCAoNjEgc2Vjb25kcykgKi8KLSNkZWZpbmUJTUlOVVNfU0VDCTB4ODAJLyogbWludXMgYSBzZWNvbmQgKDU5IHNlY29uZHMpICovCi0jZGVmaW5lCUFMQVJNCQkweGMwCS8qIGFsYXJtIGNvbmRpdGlvbiAoY2xvY2sgdW5zeW5jaHJvbml6ZWQpICovCi0KLS8qCi0gKglDbG9jayBTdGF0dXMgQml0cyB0aGF0IEVuY29kZSBWZXJzaW9uCi0gKi8KLSNkZWZpbmUJTlRQVkVSU0lPTl8xCTB4MDgKLSNkZWZpbmUJVkVSU0lPTk1BU0sJMHgzOAotI2RlZmluZSBMRUFQTUFTSwkweGMwCi0jZGVmaW5lCU1PREVNQVNLCTB4MDcKLQotLyoKLSAqCUNvZGUgdmFsdWVzCi0gKi8KLSNkZWZpbmUJTU9ERV9VTlNQRUMJMAkvKiB1bnNwZWNpZmllZCAqLwotI2RlZmluZQlNT0RFX1NZTV9BQ1QJMQkvKiBzeW1tZXRyaWMgYWN0aXZlICovCi0jZGVmaW5lCU1PREVfU1lNX1BBUwkyCS8qIHN5bW1ldHJpYyBwYXNzaXZlICovCi0jZGVmaW5lCU1PREVfQ0xJRU5UCTMJLyogY2xpZW50ICovCi0jZGVmaW5lCU1PREVfU0VSVkVSCTQJLyogc2VydmVyICovCi0jZGVmaW5lCU1PREVfQlJPQURDQVNUCTUJLyogYnJvYWRjYXN0ICovCi0jZGVmaW5lCU1PREVfUkVTMQk2CS8qIHJlc2VydmVkICovCi0jZGVmaW5lCU1PREVfUkVTMgk3CS8qIHJlc2VydmVkICovCi0KLS8qCi0gKglTdHJhdHVtIERlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUJVU5TUEVDSUZJRUQJMAotI2RlZmluZQlQUklNX1JFRgkxCS8qIHJhZGlvIGNsb2NrICovCi0jZGVmaW5lCUlORk9fUVVFUlkJNjIJLyogKioqKiBUSElTIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCAqKioqICovCi0jZGVmaW5lCUlORk9fUkVQTFkJNjMJLyogKioqKiBUSElTIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudCAqKioqICovCmRpZmYgLS1naXQgYS9vYWtsZXkuaCBiL29ha2xleS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBkNjA3Li4wMDAwMDAwCi0tLSBhL29ha2xleS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0vKiBZSVBTIEAoIykkSWQ6IG9ha2xleS5oLHYgMS40IDIwMDIvMTIvMTEgMDc6MTM6NTYgZ3V5IEV4cCAkICovCi0KLS8qIHJlZmVyIHRvIFJGQyAyNDA5ICovCi0KLSNpZiAhZGVmaW5lZChfSVNBS01QX09BS0xFWV9IXykKLSNkZWZpbmUgX0lTQUtNUF9PQUtMRVlfSF8KLQotLyogQXR0cmlidXRlIENsYXNzZXMgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfRU5DX0FMRyAgICAgICAgICAgICAgICAgICAxIC8qIEIgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0RFUyAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0lERUEgICAgICAgICAgICAgIDIKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0JMICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX1JDNSAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHXzNERVMgICAgICAgICAgICAgIDUKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9FTkNfQUxHX0NBU1QgICAgICAgICAgICAgIDYKLSNkZWZpbmUgT0FLTEVZX0FUVFJfSEFTSF9BTEcgICAgICAgICAgICAgICAgICAyIC8qIEIgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9IQVNIX0FMR19NRDUgICAgICAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9IQVNIX0FMR19TSEEgICAgICAgICAgICAgIDIKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9IQVNIX0FMR19USUdFUiAgICAgICAgICAgIDMKLSNkZWZpbmUgT0FLTEVZX0FUVFJfQVVUSF9NRVRIT0QgICAgICAgICAgICAgICAzIC8qIEIgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9QU0tFWSAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9EU1MgICAgICAgICAgIDIKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9SU0EgICAgICAgICAgIDMKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9SU0FFTkMgICAgICAgIDQKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9BVVRIX01FVEhPRF9SU0FSRVYgICAgICAgIDUKLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0RFU0MgICAgICAgICAgICAgICAgICA0IC8qIEIgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19NT0RQNzY4ICAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19NT0RQMTAyNCAgICAgICAgIDIKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19FQzJOMTU1ICAgICAgICAgIDMKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfREVTQ19FQzJOMTg1ICAgICAgICAgIDQKLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX1RZUEUgICAgICAgICAgICAgICAgICA1IC8qIEIgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfVFlQRV9NT0RQICAgICAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfVFlQRV9FQ1AgICAgICAgICAgICAgIDIKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9HUlBfVFlQRV9FQzJOICAgICAgICAgICAgIDMKLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX1BJICAgICAgICAgICAgICAgICAgICA2IC8qIFYgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0dFTl9PTkUgICAgICAgICAgICAgICA3IC8qIFYgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0dFTl9UV08gICAgICAgICAgICAgICA4IC8qIFYgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0NVUlZFX0EgICAgICAgICAgICAgICA5IC8qIFYgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX0NVUlZFX0IgICAgICAgICAgICAgIDEwIC8qIFYgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfU0FfTFRZUEUgICAgICAgICAgICAgICAgIDExIC8qIEIgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MVFlQRV9ERUZBVUxUICAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MVFlQRV9TRUMgICAgICAgICAgICAgIDEKLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MVFlQRV9LQiAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgT0FLTEVZX0FUVFJfU0FfTERVUiAgICAgICAgICAgICAgICAgIDEyIC8qIFYgKi8KLSNkZWZpbmUgICBPQUtMRVlfQVRUUl9TQV9MRFVSX0RFRkFVTFQgICAgICAgICAgIDI4ODAwIC8qIDggaG91cnMgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfUFJGICAgICAgICAgICAgICAgICAgICAgIDEzIC8qIEIgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfS0VZX0xFTiAgICAgICAgICAgICAgICAgIDE0IC8qIEIgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfRklFTERfU0laRSAgICAgICAgICAgICAgIDE1IC8qIEIgKi8KLSNkZWZpbmUgT0FLTEVZX0FUVFJfR1JQX09SREVSICAgICAgICAgICAgICAgIDE2IC8qIFYgKi8KLQotI2RlZmluZSBPQUtMRVlfSURfSVBWNF9BRERSICAgICAgICAgIDAKLSNkZWZpbmUgT0FLTEVZX0lEX0lQVjRfQUREUl9TVUJORVQgICAxCi0jZGVmaW5lIE9BS0xFWV9JRF9JUFY2X0FERFIgICAgICAgICAgMgotI2RlZmluZSBPQUtMRVlfSURfSVBWNl9BRERSX1NVQk5FVCAgIDMKLQotLyogQWRkaXRpb25hbCBFeGNoYW5nZSBUeXBlICovCi0jZGVmaW5lIElTQUtNUF9FVFlQRV9RVUlDSyAgICAzMgotI2RlZmluZSBJU0FLTVBfRVRZUEVfTkVXR1JQICAgMzMKLQotLyogVGhlIHVzZSBmb3IgY2hlY2tpbmcgcHJvcG9zYWwgcGF5bG9hZC4gVGhpcyBpcyBub3QgZXhjaGFuZ2UgdHlwZS4gKi8KLSNkZWZpbmUgT0FLTEVZX01BSU5fTU9ERSAgICAwCi0jZGVmaW5lIE9BS0xFWV9RVUlDS19NT0RFICAgMQotCi0jZGVmaW5lIE9BS0xFWV9QUklNRV9NT0RQNzY4ICJcCi0JRkZGRkZGRkYgRkZGRkZGRkYgQzkwRkRBQTIgMjE2OEMyMzQgQzRDNjYyOEIgODBEQzFDRDEgXAotCTI5MDI0RTA4IDhBNjdDQzc0IDAyMEJCRUE2IDNCMTM5QjIyIDUxNEEwODc5IDhFMzQwNEREIFwKLQlFRjk1MTlCMyBDRDNBNDMxQiAzMDJCMEE2RCBGMjVGMTQzNyA0RkUxMzU2RCA2RDUxQzI0NSBcCi0JRTQ4NUI1NzYgNjI1RTdFQzYgRjQ0QzQyRTkgQTYzQTM2MjAgRkZGRkZGRkYgRkZGRkZGRkYiCi0KLSNkZWZpbmUgT0FLTEVZX1BSSU1FX01PRFAxMDI0ICJcCi0JRkZGRkZGRkYgRkZGRkZGRkYgQzkwRkRBQTIgMjE2OEMyMzQgQzRDNjYyOEIgODBEQzFDRDEgXAotCTI5MDI0RTA4IDhBNjdDQzc0IDAyMEJCRUE2IDNCMTM5QjIyIDUxNEEwODc5IDhFMzQwNEREIFwKLQlFRjk1MTlCMyBDRDNBNDMxQiAzMDJCMEE2RCBGMjVGMTQzNyA0RkUxMzU2RCA2RDUxQzI0NSBcCi0JRTQ4NUI1NzYgNjI1RTdFQzYgRjQ0QzQyRTkgQTYzN0VENkIgMEJGRjVDQjYgRjQwNkI3RUQgXAotCUVFMzg2QkZCIDVBODk5RkE1IEFFOUYyNDExIDdDNEIxRkU2IDQ5Mjg2NjUxIEVDRTY1MzgxIFwKLQlGRkZGRkZGRiBGRkZGRkZGRiIKLQotI2RlZmluZSBERUZBVUxUU0VDUkVUU0laRSAoIDEyOCAvIDggKSAvKiAxMjggYml0cyAqLwotI2RlZmluZSBERUZBVUxUTk9OQ0VTSVpFICAoIDEyOCAvIDggKSAvKiAxMjggYml0cyAqLwotCi0jZGVmaW5lIE1BWFBBRExXT1JEIDIwCi0KLSNpZiAwCi0vKiBpc2FrbXAgc2Egc3RydWN0dXJlICovCi1zdHJ1Y3Qgb2FrbGV5X3NhIHsKLQl1X2ludDhfdCAgcHJvdG9faWQ7ICAgICAgICAgICAgLyogT0FLTEVZICovCi0JdmNoYXJfdCAgICpzcGk7ICAgICAgICAgICAgICAgIC8qIHNwaSAqLwotCXVfaW50OF90ICBkaGdycDsgICAgICAgICAgICAgICAvKiBESDsgZ3JvdXAgKi8KLQl1X2ludDhfdCAgYXV0aF90OyAgICAgICAgICAgICAgLyogbWV0aG9kIG9mIGF1dGhlbnRpY2F0aW9uICovCi0JdV9pbnQ4X3QgIHByZl90OyAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgcHJmICovCi0JdV9pbnQ4X3QgIGhhc2hfdDsgICAgICAgICAgICAgIC8qIHR5cGUgb2YgaGFzaCAqLwotCXVfaW50OF90ICBlbmNfdDsgICAgICAgICAgICAgICAvKiB0eXBlIG9mIGNpcGhlciAqLwotCXVfaW50OF90ICBsaWZlX3Q7ICAgICAgICAgICAgICAvKiB0eXBlIG9mIGR1cmF0aW9uIG9mIGxpZmV0aW1lICovCi0JdV9pbnQzMl90IGxkdXI7ICAgICAgICAgICAgICAgIC8qIGxpZmUgZHVyYXRpb24gKi8KLX07Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFkZWZpbmVkKF9JU0FLTVBfT0FLTEVZX0hfKSAqLwpkaWZmIC0tZ2l0IGEvb3NwZi5oIGIvb3NwZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE5MDRmLi4wMDAwMDAwCi0tLSBhL29zcGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL29zcGYuaCx2IDEuMTYuMi4yIDIwMDYvMTIvMTMgMDg6MjQ6MjcgaGFubmVzIEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT1NQRiBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IEplZmZyZXkgSG9uaWcgKGpjaEBtaXRjaGVsbC5jaXQuY29ybmVsbC5lZHUpCi0gKi8KLSNkZWZpbmUJT1NQRl9UWVBFX1VNRCAgICAgICAgICAgMAkvKiBVTWQncyBzcGVjaWFsIG1vbml0b3JpbmcgcGFja2V0cyAqLwotI2RlZmluZQlPU1BGX1RZUEVfSEVMTE8gICAgICAgICAxCS8qIEhlbGxvICovCi0jZGVmaW5lCU9TUEZfVFlQRV9ERCAgICAgICAgICAgIDIJLyogRGF0YWJhc2UgRGVzY3JpcHRpb24gKi8KLSNkZWZpbmUJT1NQRl9UWVBFX0xTX1JFUSAgICAgICAgMwkvKiBMaW5rIFN0YXRlIFJlcXVlc3QgKi8KLSNkZWZpbmUJT1NQRl9UWVBFX0xTX1VQREFURSAgICAgNAkvKiBMaW5rIFN0YXRlIFVwZGF0ZSAqLwotI2RlZmluZQlPU1BGX1RZUEVfTFNfQUNLICAgICAgICA1CS8qIExpbmsgU3RhdGUgQWNrICovCi0KLS8qIE9wdGlvbnMgZmllbGQKLSAqCi0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogfCAqIHwgTyB8IERDIHwgRUEgfCBOL1AgfCBNQyB8IEUgfCBUIHwKLSAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgotICovCi0gICAgICAgICAgICAgICAgCi0jZGVmaW5lIE9TUEZfT1BUSU9OX1QJMHgwMQkvKiBUIGJpdDogVE9TIHN1cHBvcnQJKi8KLSNkZWZpbmUgT1NQRl9PUFRJT05fRQkweDAyCS8qIEUgYml0OiBFeHRlcm5hbCByb3V0ZXMgYWR2ZXJ0aXNlZAkqLwotI2RlZmluZQlPU1BGX09QVElPTl9NQwkweDA0CS8qIE1DIGJpdDogTXVsdGljYXN0IGNhcGFibGUgKi8KLSNkZWZpbmUJT1NQRl9PUFRJT05fTlAJMHgwOAkvKiBOL1AgYml0OiBOU1NBIGNhcGFibGUgKi8KLSNkZWZpbmUJT1NQRl9PUFRJT05fRUEJMHgxMAkvKiBFQSBiaXQ6IEV4dGVybmFsIEF0dHJpYnV0ZSBjYXBhYmxlICovCi0jZGVmaW5lCU9TUEZfT1BUSU9OX0RDCTB4MjAJLyogREMgYml0OiBEZW1hbmQgY2lyY3VpdCBjYXBhYmxlICovCi0jZGVmaW5lCU9TUEZfT1BUSU9OX08JMHg0MAkvKiBPIGJpdDogT3BhcXVlIExTQSBjYXBhYmxlICovCi0jZGVmaW5lCU9TUEZfT1BUSU9OX0ROCTB4ODAJLyogRE4gYml0OiBVcC9Eb3duIEJpdCBjYXBhYmxlIC0gZHJhZnQtaWV0Zi1vc3BmLTI1NDctZG5iaXQtMDQgKi8KLQotLyogb3NwZl9hdXRodHlwZQkqLwotI2RlZmluZQlPU1BGX0FVVEhfTk9ORQkJMAkvKiBObyBhdXRoLWRhdGEgKi8KLSNkZWZpbmUJT1NQRl9BVVRIX1NJTVBMRQkxCS8qIFNpbXBsZSBwYXNzd29yZCAqLwotI2RlZmluZSBPU1BGX0FVVEhfU0lNUExFX0xFTgk4CS8qIG1heCBsZW5ndGggb2Ygc2ltcGxlIGF1dGhlbnRpY2F0aW9uICovCi0jZGVmaW5lIE9TUEZfQVVUSF9NRDUJCTIJLyogTUQ1IGF1dGhlbnRpY2F0aW9uICovCi0jZGVmaW5lIE9TUEZfQVVUSF9NRDVfTEVOCTE2CS8qIGxlbmd0aCBvZiBNRDUgYXV0aGVudGljYXRpb24gKi8KLQotLyogZGJfZmxhZ3MJKi8KLSNkZWZpbmUJT1NQRl9EQl9JTklUCQkweDA0CSAgICAvKgkqLwotI2RlZmluZQlPU1BGX0RCX01PUkUJCTB4MDIKLSNkZWZpbmUJT1NQRl9EQl9NQVNURVIJCTB4MDEKLQotLyogbHNfdHlwZQkqLwotI2RlZmluZQlMU19UWVBFX1JPVVRFUgkJMSAgIC8qIHJvdXRlciBsaW5rICovCi0jZGVmaW5lCUxTX1RZUEVfTkVUV09SSwkJMiAgIC8qIG5ldHdvcmsgbGluayAqLwotI2RlZmluZQlMU19UWVBFX1NVTV9JUAkJMyAgIC8qIHN1bW1hcnkgbGluayAqLwotI2RlZmluZQlMU19UWVBFX1NVTV9BQlIJCTQgICAvKiBzdW1tYXJ5IGFyZWEgbGluayAqLwotI2RlZmluZQlMU19UWVBFX0FTRQkJNSAgIC8qIEFTRSAgKi8KLSNkZWZpbmUJTFNfVFlQRV9HUk9VUAkJNiAgIC8qIEdyb3VwIG1lbWJlcnNoaXAgKG11bHRpY2FzdCAqLwotCQkJCSAgICAvKiBleHRlbnNpb25zIDIzIEp1bHkgMTk5MSkgKi8KLSNkZWZpbmUJTFNfVFlQRV9OU1NBICAgICAgICAgICAgNyAgIC8qIHJmYzMxMDEgLSBOb3Qgc28gU3R1YmJ5IEFyZWFzICovCi0jZGVmaW5lCUxTX1RZUEVfT1BBUVVFX0xMICAgICAgIDkgICAvKiByZmMyMzcwIC0gT3BhcXVlIExpbmsgTG9jYWwgKi8KLSNkZWZpbmUJTFNfVFlQRV9PUEFRVUVfQUwgICAgICAxMCAgIC8qIHJmYzIzNzAgLSBPcGFxdWUgTGluayBMb2NhbCAqLwotI2RlZmluZQlMU19UWVBFX09QQVFVRV9EVyAgICAgIDExICAgLyogcmZjMjM3MCAtIE9wYXF1ZSBEb21haW4gV2lkZSAqLwotCi0jZGVmaW5lIExTX09QQVFVRV9UWVBFX1RFICAgICAgIDEgICAvKiByZmMzNjMwICovCi0jZGVmaW5lIExTX09QQVFVRV9UWVBFX0dSQUNFICAgIDMgICAvKiByZmMzNjIzICovCi0jZGVmaW5lIExTX09QQVFVRV9UWVBFX1JJICAgICAgIDQgICAvKiBkcmFmdC1pZXRmLW9zcGYtY2FwLTAzICovCi0KLSNkZWZpbmUgTFNfT1BBUVVFX1RFX1RMVl9ST1VURVIgMSAgIC8qIHJmYzM2MzAgKi8KLSNkZWZpbmUgTFNfT1BBUVVFX1RFX1RMVl9MSU5LICAgMiAgIC8qIHJmYzM2MzAgKi8KLQotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19UWVBFICAgICAgICAgICAgIDEgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19JRCAgICAgICAgICAgICAgIDIgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTE9DQUxfSVAgICAgICAgICAgICAgIDMgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfUkVNT1RFX0lQICAgICAgICAgICAgIDQgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfVEVfTUVUUklDICAgICAgICAgICAgIDUgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTUFYX0JXICAgICAgICAgICAgICAgIDYgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTUFYX1JFU19CVyAgICAgICAgICAgIDcgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfVU5SRVNfQlcgICAgICAgICAgICAgIDggLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfQURNSU5fR1JPVVAgICAgICAgICAgIDkgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19MT0NBTF9SRU1PVEVfSUQgMTEgLyogZHJhZnQtaWV0Zi1jY2FtcC1vc3BmLWdtcGxzLWV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xJTktfUFJPVEVDVElPTl9UWVBFIDE0IC8qIGRyYWZ0LWlldGYtY2NhbXAtb3NwZi1nbXBscy1leHRlbnNpb25zICovCi0jZGVmaW5lIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9JTlRGX1NXX0NBUF9ERVNDUiAgICAxNSAvKiBkcmFmdC1pZXRmLWNjYW1wLW9zcGYtZ21wbHMtZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfU0hBUkVEX1JJU0tfR1JPVVAgICAgMTYgLyogZHJhZnQtaWV0Zi1jY2FtcC1vc3BmLWdtcGxzLWV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0JXX0NPTlNUUkFJTlRTICAgICAgIDE3IC8qIHJmYzQxMjQgKi8KLQotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19UWVBFX1BUUCAgICAgICAgMSAgLyogcmZjMzYzMCAqLwotI2RlZmluZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19UWVBFX01BICAgICAgICAgMiAgLyogcmZjMzYzMCAqLwotCi0jZGVmaW5lIExTX09QQVFVRV9HUkFDRV9UTFZfUEVSSU9EICAgICAgIDEgLyogcmZjMzYyMyAqLwotI2RlZmluZSBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTiAgICAgICAyIC8qIHJmYzM2MjMgKi8KLSNkZWZpbmUgTFNfT1BBUVVFX0dSQUNFX1RMVl9JTlRfQUREUkVTUyAgMyAvKiByZmMzNjIzICovCi0KLSNkZWZpbmUgTFNfT1BBUVVFX0dSQUNFX1RMVl9SRUFTT05fVU5LTk9XTiAgICAgMCAvKiByZmMzNjIzICovCi0jZGVmaW5lIExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OX1NXX1JFU1RBUlQgIDEgLyogcmZjMzYyMyAqLwotI2RlZmluZSBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9TV19VUEdSQURFICAyIC8qIHJmYzM2MjMgKi8KLSNkZWZpbmUgTFNfT1BBUVVFX0dSQUNFX1RMVl9SRUFTT05fQ1BfU1dJVENIICAgMyAvKiByZmMzNjIzICovCi0KLSNkZWZpbmUgTFNfT1BBUVVFX1JJX1RMVl9DQVAgICAgICAgICAgICAgMSAvKiBkcmFmdC1pZXRmLW9zcGYtY2FwLTAzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogaXMgdGhlIGFib3ZlIGEgYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uPwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLS8qIHJsYV9saW5rLmxpbmtfdHlwZQkqLwotI2RlZmluZQlSTEFfVFlQRV9ST1VURVIJCTEgICAvKiBwb2ludC10by1wb2ludCB0byBhbm90aGVyIHJvdXRlcgkqLwotI2RlZmluZQlSTEFfVFlQRV9UUkFOU0lUCTIgICAvKiBjb25uZWN0aW9uIHRvIHRyYW5zaXQgbmV0d29yawkqLwotI2RlZmluZQlSTEFfVFlQRV9TVFVCCQkzICAgLyogY29ubmVjdGlvbiB0byBzdHViIG5ldHdvcmsJKi8KLSNkZWZpbmUgUkxBX1RZUEVfVklSVFVBTAk0ICAgLyogdmlydHVhbCBsaW5rCQkJKi8KLQotLyogcmxhX2ZsYWdzCSovCi0jZGVmaW5lCVJMQV9GTEFHX0IJMHgwMQotI2RlZmluZQlSTEFfRkxBR19FCTB4MDIKLSNkZWZpbmUJUkxBX0ZMQUdfVzEJMHgwNAotI2RlZmluZQlSTEFfRkxBR19XMgkweDA4Ci0KLS8qIHNsYV90b3NtZXRyaWMgYnJlYWtkb3duCSovCi0jZGVmaW5lCVNMQV9NQVNLX1RPUwkJMHg3ZjAwMDAwMAotI2RlZmluZQlTTEFfTUFTS19NRVRSSUMJCTB4MDBmZmZmZmYKLSNkZWZpbmUgU0xBX1NISUZUX1RPUwkJMjQKLQotLyogYXNsYV90b3NtZXRyaWMgYnJlYWtkb3duCSovCi0jZGVmaW5lCUFTTEFfRkxBR19FWFRFUk5BTAkweDgwMDAwMDAwCi0jZGVmaW5lCUFTTEFfTUFTS19UT1MJCTB4N2YwMDAwMDAKLSNkZWZpbmUJQVNMQV9TSElGVF9UT1MJCTI0Ci0jZGVmaW5lCUFTTEFfTUFTS19NRVRSSUMJMHgwMGZmZmZmZgotCi0vKiBtdWx0aWNhc3QgdmVydGV4IHR5cGUgKi8KLSNkZWZpbmUJTUNMQV9WRVJURVhfUk9VVEVSCTEKLSNkZWZpbmUJTUNMQV9WRVJURVhfTkVUV09SSwkyCi0KLS8qIGxpbmsgc3RhdGUgYWR2ZXJ0aXNlbWVudCBoZWFkZXIgKi8KLXN0cnVjdCBsc2FfaGRyIHsKLSAgICB1X2ludDE2X3QgbHNfYWdlOwotICAgIHVfaW50OF90IGxzX29wdGlvbnM7Ci0gICAgdV9pbnQ4X3QgbHNfdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHN0cnVjdCBpbl9hZGRyIGxzYV9pZDsKLSAgICAgICAgc3RydWN0IHsgLyogb3BhcXVlIExTQXMgY2hhbmdlIHRoZSBMU0EtSUQgZmllbGQgKi8KLSAgICAgICAgICAgIHVfaW50OF90IG9wYXF1ZV90eXBlOwotICAgICAgICAgICAgdV9pbnQ4X3Qgb3BhcXVlX2lkWzNdOwotCX0gb3BhcXVlX2ZpZWxkOwotICAgIH0gdW5fbHNhX2lkOwotICAgIHN0cnVjdCBpbl9hZGRyIGxzX3JvdXRlcjsKLSAgICB1X2ludDMyX3QgbHNfc2VxOwotICAgIHVfaW50MTZfdCBsc19jaGtzdW07Ci0gICAgdV9pbnQxNl90IGxzX2xlbmd0aDsKLX07Ci0KLS8qIGxpbmsgc3RhdGUgYWR2ZXJ0aXNlbWVudCAqLwotc3RydWN0IGxzYSB7Ci0gICAgc3RydWN0IGxzYV9oZHIgbHNfaGRyOwotCi0gICAgLyogTGluayBzdGF0ZSB0eXBlcyAqLwotICAgIHVuaW9uIHsKLQkvKiBSb3V0ZXIgbGlua3MgYWR2ZXJ0aXNlbWVudHMgKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDhfdCBybGFfZmxhZ3M7Ci0JICAgIHVfaW50OF90IHJsYV96ZXJvWzFdOwotCSAgICB1X2ludDE2X3QgcmxhX2NvdW50OwotCSAgICBzdHJ1Y3QgcmxhbGluayB7Ci0JCXN0cnVjdCBpbl9hZGRyIGxpbmtfaWQ7Ci0JCXN0cnVjdCBpbl9hZGRyIGxpbmtfZGF0YTsKLQkJdV9pbnQ4X3QgbGlua190eXBlOwotCQl1X2ludDhfdCBsaW5rX3Rvc2NvdW50OwotCQl1X2ludDE2X3QgbGlua190b3MwbWV0cmljOwotCSAgICB9IHJsYV9saW5rWzFdOwkJLyogbWF5IHJlcGVhdAkqLwotCX0gdW5fcmxhOwotCi0JLyogTmV0d29yayBsaW5rcyBhZHZlcnRpc2VtZW50cyAqLwotCXN0cnVjdCB7Ci0JICAgIHN0cnVjdCBpbl9hZGRyIG5sYV9tYXNrOwotCSAgICBzdHJ1Y3QgaW5fYWRkciBubGFfcm91dGVyWzFdOwkvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9ubGE7Ci0KLQkvKiBTdW1tYXJ5IGxpbmtzIGFkdmVydGlzZW1lbnRzICovCi0Jc3RydWN0IHsKLQkgICAgc3RydWN0IGluX2FkZHIgc2xhX21hc2s7Ci0JICAgIHVfaW50MzJfdCBzbGFfdG9zbWV0cmljWzFdOwkvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9zbGE7Ci0KLQkvKiBBUyBleHRlcm5hbCBsaW5rcyBhZHZlcnRpc2VtZW50cyAqLwotCXN0cnVjdCB7Ci0JICAgIHN0cnVjdCBpbl9hZGRyIGFzbGFfbWFzazsKLQkgICAgc3RydWN0IGFzbGFtZXRyaWMgewotCQl1X2ludDMyX3QgYXNsYV90b3NtZXRyaWM7Ci0JCXN0cnVjdCBpbl9hZGRyIGFzbGFfZm9yd2FyZDsKLQkJc3RydWN0IGluX2FkZHIgYXNsYV90YWc7Ci0JICAgIH0gYXNsYV9tZXRyaWNbMV07CQkvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9hc2xhOwotCi0JLyogTXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgKi8KLQlzdHJ1Y3QgbWNsYSB7Ci0JICAgIHVfaW50MzJfdCBtY2xhX3Z0eXBlOwotCSAgICBzdHJ1Y3QgaW5fYWRkciBtY2xhX3ZpZDsKLQl9IHVuX21jbGFbMV07Ci0KLSAgICAgICAgLyogT3BhcXVlIFRFIExTQSAqLwotICAgICAgICBzdHJ1Y3QgewotCSAgICB1X2ludDE2X3QgdHlwZTsKLQkgICAgdV9pbnQxNl90IGxlbmd0aDsKLQkgICAgdV9pbnQ4X3QgZGF0YVsxXTsgLyogbWF5IHJlcGVhdCAgICovCi0JfSB1bl90ZV9sc2FfdGx2OwotCi0gICAgICAgIC8qIE9wYXF1ZSBHcmFjZSBMU0EgKi8KLSAgICAgICAgc3RydWN0IHsKLQkgICAgdV9pbnQxNl90IHR5cGU7Ci0JICAgIHVfaW50MTZfdCBsZW5ndGg7Ci0JICAgIHVfaW50OF90IGRhdGFbMV07IC8qIG1heSByZXBlYXQgICAqLwotCX0gdW5fZ3JhY2VfdGx2OwotCi0gICAgICAgIC8qIE9wYXF1ZSBSb3V0ZXIgaW5mb3JtYXRpb24gTFNBICovCi0gICAgICAgIHN0cnVjdCB7Ci0JICAgIHVfaW50MTZfdCB0eXBlOwotCSAgICB1X2ludDE2X3QgbGVuZ3RoOwotCSAgICB1X2ludDhfdCBkYXRhWzFdOyAvKiBtYXkgcmVwZWF0ICAgKi8KLQl9IHVuX3JpX3RsdjsKLQotICAgICAgICAvKiBVbmtub3duIExTQSAqLwotICAgICAgICBzdHJ1Y3QgdW5rbm93biB7Ci0JICAgIHVfaW50OF90IGRhdGFbMV07IC8qIG1heSByZXBlYXQgICAqLwotCX0gdW5fdW5rbm93blsxXTsKLQotICAgIH0gbHNhX3VuOwotfTsKLQotCi0vKgotICogVE9TIG1ldHJpYyBzdHJ1Y3QgKHdpbGwgYmUgMCBvciBtb3JlIGluIHJvdXRlciBsaW5rcyB1cGRhdGUpCi0gKi8KLXN0cnVjdCB0b3NfbWV0cmljIHsKLSAgICB1X2ludDhfdCB0b3NfdHlwZTsKLSAgICB1X2ludDhfdCB0b3NfemVybzsKLSAgICB1X2ludDE2X3QgdG9zX21ldHJpYzsKLX07Ci0KLSNkZWZpbmUJT1NQRl9BVVRIX1NJWkUJOAotCi0vKgotICogdGhlIG1haW4gaGVhZGVyCi0gKi8KLXN0cnVjdCBvc3BmaGRyIHsKLSAgICB1X2ludDhfdCBvc3BmX3ZlcnNpb247Ci0gICAgdV9pbnQ4X3Qgb3NwZl90eXBlOwotICAgIHVfaW50MTZfdCBvc3BmX2xlbjsKLSAgICBzdHJ1Y3QgaW5fYWRkciBvc3BmX3JvdXRlcmlkOwotICAgIHN0cnVjdCBpbl9hZGRyIG9zcGZfYXJlYWlkOwotICAgIHVfaW50MTZfdCBvc3BmX2Noa3N1bTsKLSAgICB1X2ludDE2X3Qgb3NwZl9hdXRodHlwZTsKLSAgICB1X2ludDhfdCBvc3BmX2F1dGhkYXRhW09TUEZfQVVUSF9TSVpFXTsKLSAgICB1bmlvbiB7Ci0KLQkvKiBIZWxsbyBwYWNrZXQgKi8KLQlzdHJ1Y3QgewotCSAgICBzdHJ1Y3QgaW5fYWRkciBoZWxsb19tYXNrOwotCSAgICB1X2ludDE2X3QgaGVsbG9faGVsbG9pbnQ7Ci0JICAgIHVfaW50OF90IGhlbGxvX29wdGlvbnM7Ci0JICAgIHVfaW50OF90IGhlbGxvX3ByaW9yaXR5OwotCSAgICB1X2ludDMyX3QgaGVsbG9fZGVhZGludDsKLQkgICAgc3RydWN0IGluX2FkZHIgaGVsbG9fZHI7Ci0JICAgIHN0cnVjdCBpbl9hZGRyIGhlbGxvX2JkcjsKLQkgICAgc3RydWN0IGluX2FkZHIgaGVsbG9fbmVpZ2hib3JbMV07IC8qIG1heSByZXBlYXQJKi8KLQl9IHVuX2hlbGxvOwotCi0JLyogRGF0YWJhc2UgRGVzY3JpcHRpb24gcGFja2V0ICovCi0Jc3RydWN0IHsKLQkgICAgdV9pbnQ4X3QgZGJfemVyb1syXTsKLQkgICAgdV9pbnQ4X3QgZGJfb3B0aW9uczsKLQkgICAgdV9pbnQ4X3QgZGJfZmxhZ3M7Ci0JICAgIHVfaW50MzJfdCBkYl9zZXE7Ci0JICAgIHN0cnVjdCBsc2FfaGRyIGRiX2xzaGRyWzFdOyAvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9kYjsKLQotCS8qIExpbmsgU3RhdGUgUmVxdWVzdCAqLwotCXN0cnVjdCBsc3IgewotCSAgICB1X2ludDhfdCBsc190eXBlWzRdOwotICAgICAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyIGxzX3N0YXRlaWQ7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHsgLyogb3BhcXVlIExTQXMgY2hhbmdlIHRoZSBMU0EtSUQgZmllbGQgKi8KLSAgICAgICAgICAgICAgICAgICAgdV9pbnQ4X3Qgb3BhcXVlX3R5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHVfaW50OF90IG9wYXF1ZV9pZFszXTsKLSAgICAgICAgICAgICAgICB9IG9wYXF1ZV9maWVsZDsKLSAgICAgICAgICAgIH0gdW5fbHNfc3RhdGVpZDsKLQkgICAgc3RydWN0IGluX2FkZHIgbHNfcm91dGVyOwotCX0gdW5fbHNyWzFdOwkJLyogbWF5IHJlcGVhdAkqLwotCi0JLyogTGluayBTdGF0ZSBVcGRhdGUgKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDMyX3QgbHN1X2NvdW50OwotCSAgICBzdHJ1Y3QgbHNhIGxzdV9sc2FbMV07IC8qIG1heSByZXBlYXQJKi8KLQl9IHVuX2xzdTsKLQotCS8qIExpbmsgU3RhdGUgQWNrbm93bGVkZ2VtZW50ICovCi0Jc3RydWN0IHsKLQkgICAgc3RydWN0IGxzYV9oZHIgbHNhX2xzaGRyWzFdOyAvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9sc2EgOwotICAgIH0gb3NwZl91biA7Ci19OwotCi0jZGVmaW5lCW9zcGZfaGVsbG8Jb3NwZl91bi51bl9oZWxsbwotI2RlZmluZQlvc3BmX2RiCQlvc3BmX3VuLnVuX2RiCi0jZGVmaW5lCW9zcGZfbHNyCW9zcGZfdW4udW5fbHNyCi0jZGVmaW5lCW9zcGZfbHN1CW9zcGZfdW4udW5fbHN1Ci0jZGVmaW5lCW9zcGZfbHNhCW9zcGZfdW4udW5fbHNhCi0KZGlmZiAtLWdpdCBhL29zcGY2LmggYi9vc3BmNi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI5OGVhLi4wMDAwMDAwCi0tLSBhL29zcGY2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9vc3BmNi5oLHYgMS42IDIwMDIvMTIvMTEgMDc6MTM6NTYgZ3V5IEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT1NQRiBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IEplZmZyZXkgSG9uaWcgKGpjaEBtaXRjaGVsbC5jaXQuY29ybmVsbC5lZHUpCi0gKi8KLSNkZWZpbmUJT1NQRl9UWVBFX1VNRAkwCS8qIFVNZCdzIHNwZWNpYWwgbW9uaXRvcmluZyBwYWNrZXRzICovCi0jZGVmaW5lCU9TUEZfVFlQRV9IRUxMTwkxCS8qIEhlbGxvICovCi0jZGVmaW5lCU9TUEZfVFlQRV9EQgkyCS8qIERhdGFiYXNlIERlc2NyaXB0aW9uICovCi0jZGVmaW5lCU9TUEZfVFlQRV9MU1IJMwkvKiBMaW5rIFN0YXRlIFJlcXVlc3QgKi8KLSNkZWZpbmUJT1NQRl9UWVBFX0xTVQk0CS8qIExpbmsgU3RhdGUgVXBkYXRlICovCi0jZGVmaW5lCU9TUEZfVFlQRV9MU0EJNQkvKiBMaW5rIFN0YXRlIEFjayAqLwotI2RlZmluZQlPU1BGX1RZUEVfTUFYCTYKLQotLyogT3B0aW9ucyAqX29wdGlvbnMJKi8KLSNkZWZpbmUgT1NQRjZfT1BUSU9OX1Y2CTB4MDEJLyogVjYgYml0OiBBIGJpdCBmb3IgcGVlcGluZyB0b20gKi8KLSNkZWZpbmUgT1NQRjZfT1BUSU9OX0UJMHgwMgkvKiBFIGJpdDogRXh0ZXJuYWwgcm91dGVzIGFkdmVydGlzZWQJKi8KLSNkZWZpbmUgT1NQRjZfT1BUSU9OX01DCTB4MDQJLyogTUMgYml0OiBNdWx0aWNhc3QgY2FwYWJsZSAqLwotI2RlZmluZSBPU1BGNl9PUFRJT05fTgkweDA4CS8qIE4gYml0OiBGb3IgdHlwZS03IExTQSAqLwotI2RlZmluZSBPU1BGNl9PUFRJT05fUgkweDEwCS8qIFIgYml0OiBSb3V0ZXIgYml0ICovCi0jZGVmaW5lIE9TUEY2X09QVElPTl9EQwkweDIwCS8qIERDIGJpdDogRGVtYW5kIGNpcmN1aXRzICovCi0KLQotLyogZGJfZmxhZ3MJKi8KLSNkZWZpbmUJT1NQRjZfREJfSU5JVAkJMHgwNAkgICAgLyoJKi8KLSNkZWZpbmUJT1NQRjZfREJfTU9SRQkJMHgwMgotI2RlZmluZQlPU1BGNl9EQl9NQVNURVIJCTB4MDEKLQotLyogbHNfdHlwZQkqLwotI2RlZmluZQlMU19UWVBFX1JPVVRFUgkJMSAgIC8qIHJvdXRlciBsaW5rICovCi0jZGVmaW5lCUxTX1RZUEVfTkVUV09SSwkJMiAgIC8qIG5ldHdvcmsgbGluayAqLwotI2RlZmluZQlMU19UWVBFX0lOVEVSX0FQCTMgICAvKiBJbnRlci1BcmVhLVByZWZpeCAqLwotI2RlZmluZQlMU19UWVBFX0lOVEVSX0FSCTQgICAvKiBJbnRlci1BcmVhLVJvdXRlciAqLwotI2RlZmluZQlMU19UWVBFX0FTRQkJNSAgIC8qIEFTRSAqLwotI2RlZmluZQlMU19UWVBFX0dST1VQCQk2ICAgLyogR3JvdXAgbWVtYmVyc2hpcCAqLwotI2RlZmluZQlMU19UWVBFX1RZUEU3CQk3ICAgLyogVHlwZSA3IExTQSAqLwotI2RlZmluZQlMU19UWVBFX0xJTksJCTggICAvKiBMaW5rIExTQSAqLwotI2RlZmluZQlMU19UWVBFX0lOVFJBX0FQCTkgICAvKiBJbnRyYS1BcmVhLVByZWZpeCAqLwotI2RlZmluZQlMU19UWVBFX01BWAkJMTAKLSNkZWZpbmUgTFNfVFlQRV9NQVNLCQkweDFmZmYKLQotI2RlZmluZSBMU19TQ09QRV9MSU5LTE9DQUwJMHgwMDAwCi0jZGVmaW5lIExTX1NDT1BFX0FSRUEJCTB4MjAwMAotI2RlZmluZSBMU19TQ09QRV9BUwkJMHg0MDAwCi0jZGVmaW5lIExTX1NDT1BFX01BU0sJCTB4NjAwMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIGlzIHRoZSBhYm92ZSBhIGJ1ZyBpbiB0aGUgZG9jdW1lbnRhdGlvbj8KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBybGFfbGluay5saW5rX3R5cGUJKi8KLSNkZWZpbmUJUkxBX1RZUEVfUk9VVEVSCQkxICAgLyogcG9pbnQtdG8tcG9pbnQgdG8gYW5vdGhlciByb3V0ZXIJKi8KLSNkZWZpbmUJUkxBX1RZUEVfVFJBTlNJVAkyICAgLyogY29ubmVjdGlvbiB0byB0cmFuc2l0IG5ldHdvcmsJKi8KLSNkZWZpbmUgUkxBX1RZUEVfVklSVFVBTAk0ICAgLyogdmlydHVhbCBsaW5rCQkJKi8KLQotLyogcmxhX2ZsYWdzCSovCi0jZGVmaW5lCVJMQV9GTEFHX0IJMHgwMQotI2RlZmluZQlSTEFfRkxBR19FCTB4MDIKLSNkZWZpbmUJUkxBX0ZMQUdfVgkweDA0Ci0jZGVmaW5lCVJMQV9GTEFHX1cJMHgwOAotCi0vKiBzbGFfdG9zbWV0cmljIGJyZWFrZG93bgkqLwotI2RlZmluZQlTTEFfTUFTS19UT1MJCTB4N2YwMDAwMDAKLSNkZWZpbmUJU0xBX01BU0tfTUVUUklDCQkweDAwZmZmZmZmCi0jZGVmaW5lIFNMQV9TSElGVF9UT1MJCTI0Ci0KLS8qIGFzbGFfbWV0cmljICovCi0jZGVmaW5lIEFTTEFfRkxBR19FWFRFUk5BTAkweDA0MDAwMDAwCi0jZGVmaW5lIEFTTEFfRkxBR19GV0RBRERSCTB4MDIwMDAwMDAKLSNkZWZpbmUgQVNMQV9GTEFHX1JPVVRFVEFHCTB4MDEwMDAwMDAKLSNkZWZpbmUJQVNMQV9NQVNLX01FVFJJQwkweDAwZmZmZmZmCi0KLS8qIG11bHRpY2FzdCB2ZXJ0ZXggdHlwZSAqLwotI2RlZmluZQlNQ0xBX1ZFUlRFWF9ST1VURVIJMQotI2RlZmluZQlNQ0xBX1ZFUlRFWF9ORVRXT1JLCTIKLQotdHlwZWRlZiB1X2ludDMyX3QgcnRyaWRfdDsKLQotLyogbGluayBzdGF0ZSBhZHZlcnRpc2VtZW50IGhlYWRlciAqLwotc3RydWN0IGxzYV9oZHIgewotICAgIHVfaW50MTZfdCBsc19hZ2U7Ci0gICAgdV9pbnQxNl90IGxzX3R5cGU7Ci0gICAgcnRyaWRfdCBsc19zdGF0ZWlkOwotICAgIHJ0cmlkX3QgbHNfcm91dGVyOwotICAgIHVfaW50MzJfdCBsc19zZXE7Ci0gICAgdV9pbnQxNl90IGxzX2Noa3N1bTsKLSAgICB1X2ludDE2X3QgbHNfbGVuZ3RoOwotfTsKLQotc3RydWN0IGxzYV9wcmVmaXggewotICAgIHVfaW50OF90IGxzYV9wX2xlbjsKLSAgICB1X2ludDhfdCBsc2FfcF9vcHQ7Ci0gICAgdV9pbnQxNl90IGxzYV9wX21iejsKLSAgICB1X2ludDhfdCBsc2FfcF9wcmVmaXhbNF07Ci19OwotCi0vKiBsaW5rIHN0YXRlIGFkdmVydGlzZW1lbnQgKi8KLXN0cnVjdCBsc2EgewotICAgIHN0cnVjdCBsc2FfaGRyIGxzX2hkcjsKLQotICAgIC8qIExpbmsgc3RhdGUgdHlwZXMgKi8KLSAgICB1bmlvbiB7Ci0JLyogUm91dGVyIGxpbmtzIGFkdmVydGlzZW1lbnRzICovCi0Jc3RydWN0IHsKLQkgICAgdW5pb24gewotCQl1X2ludDhfdCBmbGc7Ci0JCXVfaW50MzJfdCBvcHQ7Ci0JICAgIH0gcmxhX2ZsZ2FuZG9wdDsKLSNkZWZpbmUgcmxhX2ZsYWdzCXJsYV9mbGdhbmRvcHQuZmxnCi0jZGVmaW5lIHJsYV9vcHRpb25zCXJsYV9mbGdhbmRvcHQub3B0Ci0JICAgIHN0cnVjdCBybGFsaW5rIHsKLQkJdV9pbnQ4X3QgbGlua190eXBlOwotCQl1X2ludDhfdCBsaW5rX3plcm9bMV07Ci0JCXVfaW50MTZfdCBsaW5rX21ldHJpYzsKLQkJdV9pbnQzMl90IGxpbmtfaWZpZDsKLQkJdV9pbnQzMl90IGxpbmtfbmlmaWQ7Ci0JCXJ0cmlkX3QgbGlua19ucnRpZDsKLQkgICAgfSBybGFfbGlua1sxXTsJCS8qIG1heSByZXBlYXQJKi8KLQl9IHVuX3JsYTsKLQotCS8qIE5ldHdvcmsgbGlua3MgYWR2ZXJ0aXNlbWVudHMgKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDMyX3QgbmxhX29wdGlvbnM7Ci0JICAgIHJ0cmlkX3QgbmxhX3JvdXRlclsxXTsJLyogbWF5IHJlcGVhdAkqLwotCX0gdW5fbmxhOwotCi0JLyogSW50ZXIgQXJlYSBQcmVmaXggTFNBICovCi0Jc3RydWN0IHsKLQkgICAgdV9pbnQzMl90IGludGVyX2FwX21ldHJpYzsKLQkgICAgc3RydWN0IGxzYV9wcmVmaXggaW50ZXJfYXBfcHJlZml4WzFdOwotCX0gdW5faW50ZXJfYXA7Ci0KLQkvKiBBUyBleHRlcm5hbCBsaW5rcyBhZHZlcnRpc2VtZW50cyAqLwotCXN0cnVjdCB7Ci0JICAgIHVfaW50MzJfdCBhc2xhX21ldHJpYzsKLQkgICAgc3RydWN0IGxzYV9wcmVmaXggYXNsYV9wcmVmaXhbMV07Ci0JICAgIC8qIHNvbWUgb3B0aW9uYWwgZmllbGRzIGZvbGxvdyAqLwotCX0gdW5fYXNsYTsKLQotI2lmIDAKLQkvKiBTdW1tYXJ5IGxpbmtzIGFkdmVydGlzZW1lbnRzICovCi0Jc3RydWN0IHsKLQkgICAgc3RydWN0IGluX2FkZHIgc2xhX21hc2s7Ci0JICAgIHVfaW50MzJfdCBzbGFfdG9zbWV0cmljWzFdOwkvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9zbGE7Ci0KLQkvKiBNdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCAqLwotCXN0cnVjdCBtY2xhIHsKLQkgICAgdV9pbnQzMl90IG1jbGFfdnR5cGU7Ci0JICAgIHN0cnVjdCBpbl9hZGRyIG1jbGFfdmlkOwotCX0gdW5fbWNsYVsxXTsKLSNlbmRpZgotCi0JLyogVHlwZSA3IExTQSAqLwotCi0JLyogTGluayBMU0EgKi8KLQlzdHJ1Y3QgbGxzYSB7Ci0JICAgIHVuaW9uIHsKLQkJdV9pbnQ4X3QgcHJpOwotCQl1X2ludDMyX3Qgb3B0OwotCSAgICB9IGxsc2FfcHJpYW5kb3B0OwotI2RlZmluZSBsbHNhX3ByaW9yaXR5CWxsc2FfcHJpYW5kb3B0LnByaQotI2RlZmluZSBsbHNhX29wdGlvbnMJbGxzYV9wcmlhbmRvcHQub3B0Ci0JICAgIHN0cnVjdCBpbjZfYWRkciBsbHNhX2xsYWRkcjsKLQkgICAgdV9pbnQzMl90IGxsc2FfbnByZWZpeDsKLQkgICAgc3RydWN0IGxzYV9wcmVmaXggbGxzYV9wcmVmaXhbMV07Ci0JfSB1bl9sbHNhOwotCi0JLyogSW50cmEtQXJlYS1QcmVmaXggKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDE2X3QgaW50cmFfYXBfbnByZWZpeDsKLQkgICAgdV9pbnQxNl90IGludHJhX2FwX2xzdHlwZTsKLQkgICAgcnRyaWRfdCBpbnRyYV9hcF9sc2lkOwotCSAgICBydHJpZF90IGludHJhX2FwX3J0aWQ7Ci0JICAgIHN0cnVjdCBsc2FfcHJlZml4IGludHJhX2FwX3ByZWZpeFsxXTsKLQl9IHVuX2ludHJhX2FwOwotICAgIH0gbHNhX3VuOwotfTsKLQotCi0vKgotICogVE9TIG1ldHJpYyBzdHJ1Y3QgKHdpbGwgYmUgMCBvciBtb3JlIGluIHJvdXRlciBsaW5rcyB1cGRhdGUpCi0gKi8KLXN0cnVjdCB0b3NfbWV0cmljIHsKLSAgICB1X2ludDhfdCB0b3NfdHlwZTsKLSAgICB1X2ludDhfdCB0b3NfemVybzsKLSAgICB1X2ludDE2X3QgdG9zX21ldHJpYzsKLX07Ci0KLSNkZWZpbmUJT1NQRl9BVVRIX1NJWkUJOAotCi0vKgotICogdGhlIG1haW4gaGVhZGVyCi0gKi8KLXN0cnVjdCBvc3BmNmhkciB7Ci0gICAgdV9pbnQ4X3Qgb3NwZjZfdmVyc2lvbjsKLSAgICB1X2ludDhfdCBvc3BmNl90eXBlOwotICAgIHVfaW50MTZfdCBvc3BmNl9sZW47Ci0gICAgcnRyaWRfdCBvc3BmNl9yb3V0ZXJpZDsKLSAgICBydHJpZF90IG9zcGY2X2FyZWFpZDsKLSAgICB1X2ludDE2X3Qgb3NwZjZfY2hrc3VtOwotICAgIHVfaW50OF90IG9zcGY2X2luc3RhbmNlaWQ7Ci0gICAgdV9pbnQ4X3Qgb3NwZjZfcnN2ZDsKLSAgICB1bmlvbiB7Ci0KLQkvKiBIZWxsbyBwYWNrZXQgKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDMyX3QgaGVsbG9faWZpZDsKLQkgICAgdW5pb24gewotCQl1X2ludDhfdCBwcmk7Ci0JCXVfaW50MzJfdCBvcHQ7Ci0JICAgIH0gaGVsbG9fcHJpYW5kb3B0OwotI2RlZmluZSBoZWxsb19wcmlvcml0eQloZWxsb19wcmlhbmRvcHQucHJpCi0jZGVmaW5lIGhlbGxvX29wdGlvbnMJaGVsbG9fcHJpYW5kb3B0Lm9wdAotCSAgICB1X2ludDE2X3QgaGVsbG9faGVsbG9pbnQ7Ci0JICAgIHVfaW50MTZfdCBoZWxsb19kZWFkaW50OwotCSAgICBydHJpZF90IGhlbGxvX2RyOwotCSAgICBydHJpZF90IGhlbGxvX2JkcjsKLQkgICAgcnRyaWRfdCBoZWxsb19uZWlnaGJvclsxXTsgLyogbWF5IHJlcGVhdAkqLwotCX0gdW5faGVsbG87Ci0KLQkvKiBEYXRhYmFzZSBEZXNjcmlwdGlvbiBwYWNrZXQgKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDMyX3QgZGJfb3B0aW9uczsKLQkgICAgdV9pbnQxNl90IGRiX210dTsKLQkgICAgdV9pbnQ4X3QgZGJfbWJ6OwotCSAgICB1X2ludDhfdCBkYl9mbGFnczsKLQkgICAgdV9pbnQzMl90IGRiX3NlcTsKLQkgICAgc3RydWN0IGxzYV9oZHIgZGJfbHNoZHJbMV07IC8qIG1heSByZXBlYXQJKi8KLQl9IHVuX2RiOwotCi0JLyogTGluayBTdGF0ZSBSZXF1ZXN0ICovCi0Jc3RydWN0IGxzciB7Ci0JICAgIHVfaW50MTZfdCBsc19tYno7Ci0JICAgIHVfaW50MTZfdCBsc190eXBlOwotCSAgICBydHJpZF90IGxzX3N0YXRlaWQ7Ci0JICAgIHJ0cmlkX3QgbHNfcm91dGVyOwotCX0gdW5fbHNyWzFdOwkJLyogbWF5IHJlcGVhdAkqLwotCi0JLyogTGluayBTdGF0ZSBVcGRhdGUgKi8KLQlzdHJ1Y3QgewotCSAgICB1X2ludDMyX3QgbHN1X2NvdW50OwotCSAgICBzdHJ1Y3QgbHNhIGxzdV9sc2FbMV07IC8qIG1heSByZXBlYXQJKi8KLQl9IHVuX2xzdTsKLQotCS8qIExpbmsgU3RhdGUgQWNrbm93bGVkZ2VtZW50ICovCi0Jc3RydWN0IHsKLQkgICAgc3RydWN0IGxzYV9oZHIgbHNhX2xzaGRyWzFdOyAvKiBtYXkgcmVwZWF0CSovCi0JfSB1bl9sc2EgOwotICAgIH0gb3NwZjZfdW4gOwotfTsKLQotI2RlZmluZQlvc3BmNl9oZWxsbwlvc3BmNl91bi51bl9oZWxsbwotI2RlZmluZQlvc3BmNl9kYglvc3BmNl91bi51bl9kYgotI2RlZmluZQlvc3BmNl9sc3IJb3NwZjZfdW4udW5fbHNyCi0jZGVmaW5lCW9zcGY2X2xzdQlvc3BmNl91bi51bl9sc3UKLSNkZWZpbmUJb3NwZjZfbHNhCW9zcGY2X3VuLnVuX2xzYQotCmRpZmYgLS1naXQgYS9vdWkuYyBiL291aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RjZDQwLi4wMDAwMDAwCi0tLSBhL291aS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL291aS5jLHYgMS40LjIuMSAyMDA1LzA0LzE3IDAxOjIwOjU2IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJvdWkuaCIKLQotLyogRklYTUUgY29tcGxldGUgT1VJIGxpc3QgdXNpbmcgYSBzY3JpcHQgKi8KLQotc3RydWN0IHRvayBvdWlfdmFsdWVzW10gPSB7Ci0gICAgeyBPVUlfRU5DQVBfRVRIRVIsICJFdGhlcm5ldCIgfSwKLSAgICB7IE9VSV9DSVNDTywgIkNpc2NvIiB9LAotICAgIHsgT1VJX05PUlRFTCwgIk5vcnRlbCBOZXR3b3JrcyBTT05NUCIgfSwKLSAgICB7IE9VSV9DSVNDT185MCwgIkNpc2NvIGJyaWRnZWQiIH0sCi0gICAgeyBPVUlfUkZDMjY4NCwgIkV0aGVybmV0IGJyaWRnZWQiIH0sCi0gICAgeyBPVUlfQVRNX0ZPUlVNLCAiQVRNIEZvcnVtIiB9LAotICAgIHsgT1VJX0NBQkxFX0JQRFUsICJET0NTSVMgU3Bhbm5pbmcgVHJlZSIgfSwKLSAgICB7IE9VSV9BUFBMRVRBTEssICJBcHBsZXRhbGsiIH0sCi0gICAgeyBPVUlfSlVOSVBFUiwgIkp1bmlwZXIiIH0sCi0gICAgeyBPVUlfSFAsICJIZXdsZXR0LVBhY2thcmQiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLS8qCi0gKiBTTUkgTmV0d29yayBNYW5hZ2VtZW50IFByaXZhdGUgRW50ZXJwcmlzZSBDb2RlcyBmb3Igb3JnYW5pemF0aW9ucy4KLSAqCi0gKiBYWFggLSB0aGVzZSBhbHNvIGFwcGVhciBpbiBGcmVlUmFkaXVzIGRpY3Rpb25hcnkgZmlsZXMsIHdpdGggaXRlbXMgc3VjaAotICogYXMKLSAqCi0gKglWRU5ET1IgICAgICAgICAgQ2lzY28gICAgICAgICAgIDkKLSAqCi0gKiBMaXN0IHRha2VuIGZyb20gRXRoZXJlYWwncyBlcGFuL3NtaW5tcGVjLmMuCi0gKi8KLXN0cnVjdCB0b2sgc21pX3ZhbHVlc1tdID0gewotICAgIHsgU01JX0lFVEYsICAgICAgICAgICAgICAgICAiSUVURiAocmVzZXJ2ZWQpIn0sCi0gICAgeyBTTUlfQUNDLCAgICAgICAgICAgICAgICAgICJBQ0MifSwKLSAgICB7IFNNSV9DSVNDTywgICAgICAgICAgICAgICAgIkNpc2NvIn0sCi0gICAgeyBTTUlfSEVXTEVUVF9QQUNLQVJELCAgICAgICJIZXdsZXR0IFBhY2thcmQifSwKLSAgICB7IFNNSV9TVU5fTUlDUk9TWVNURU1TLCAgICAgIlN1biBNaWNyb3N5c3RlbXMifSwKLSAgICB7IFNNSV9NRVJJVCwgICAgICAgICAgICAgICAgIk1lcml0In0sCi0gICAgeyBTTUlfU0hJVkEsICAgICAgICAgICAgICAgICJTaGl2YSJ9LAotICAgIHsgU01JX0VSSUNTU09OLCAgICAgICAgICAgICAiRXJpY3Nzb24gQUIifSwKLSAgICB7IFNNSV9DSVNDT19WUE41MDAwLCAgICAgICAgIkNpc2NvIFZQTiA1MDAwIn0sCi0gICAgeyBTTUlfTElWSU5HU1RPTiwgICAgICAgICAgICJMaXZpbmdzdG9uIn0sCi0gICAgeyBTTUlfTUlDUk9TT0ZULCAgICAgICAgICAgICJNaWNyb3NvZnQifSwKLSAgICB7IFNNSV8zQ09NLCAgICAgICAgICAgICAgICAgIjNDb20ifSwKLSAgICB7IFNNSV9BU0NFTkQsICAgICAgICAgICAgICAgIkFzY2VuZCJ9LAotICAgIHsgU01JX0JBWSwgICAgICAgICAgICAgICAgICAiQmF5IE5ldHdvcmtzIn0sCi0gICAgeyBTTUlfRk9VTkRSWSwgICAgICAgICAgICAgICJGb3VuZHJ5In0sCi0gICAgeyBTTUlfVkVSU0FORVQsICAgICAgICAgICAgICJWZXJzYW5ldCJ9LAotICAgIHsgU01JX1JFREJBQ0ssICAgICAgICAgICAgICAiUmVkYmFjayJ9LAotICAgIHsgU01JX0pVTklQRVIsICAgICAgICAgICAgICAiSnVuaXBlciBOZXR3b3JrcyJ9LAotICAgIHsgU01JX0FQVElTLCAgICAgICAgICAgICAgICAiQXB0aXMifSwKLSAgICB7IFNNSV9DSVNDT19WUE4zMDAwLCAgICAgICAgIkNpc2NvIFZQTiAzMDAwIn0sCi0gICAgeyBTTUlfQ09TSU5FLCAgICAgICAgICAgICAgICJDb1NpbmUgQ29tbXVuaWNhdGlvbnMifSwKLSAgICB7IFNNSV9ORVRTQ1JFRU4sICAgICAgICAgICAgIk5ldHNjcmVlbiJ9LAotICAgIHsgU01JX1NIQVNUQSwgICAgICAgICAgICAgICAiU2hhc3RhIn0sCi0gICAgeyBTTUlfTk9NQURJWCwgICAgICAgICAgICAgICJOb21hZGl4In0sCi0gICAgeyBTTUlfU0lFTUVOUywgICAgICAgICAgICAgICJTaWVtZW5zIn0sCi0gICAgeyBTTUlfQ0FCTEVMQUJTLCAgICAgICAgICAgICJDYWJsZUxhYnMifSwKLSAgICB7IFNNSV9VTklTUEhFUkUsICAgICAgICAgICAgIlVuaXNwaGVyZSBOZXR3b3JrcyJ9LAotICAgIHsgU01JX0NJU0NPX0JCU00sICAgICAgICAgICAiQ2lzY28gQkJTTSJ9LAotICAgIHsgU01JX1RIRTNHUFAyLCAgICAgICAgICAgICAiM3JkIEdlbmVyYXRpb24gUGFydG5lcnNoaXAgUHJvamVjdCAyICgzR1BQMikifSwKLSAgICB7IFNNSV9JUF9VTlBMVUdHRUQsICAgICAgICAgImlwVW5wbHVnZ2VkIn0sCi0gICAgeyBTTUlfSVNTQU5OSSwgICAgICAgICAgICAgICJJc3Nhbm5pIENvbW11bmljYXRpb25zIn0sCi0gICAgeyBTTUlfUVVJTlRVTSwgICAgICAgICAgICAgICJRdWludHVtIn0sCi0gICAgeyBTTUlfSU5URVJMSU5LLCAgICAgICAgICAgICJJbnRlcmxpbmsifSwKLSAgICB7IFNNSV9DT0xVQlJJUywgICAgICAgICAgICAgIkNvbHVicmlzIn0sCi0gICAgeyBTTUlfQ09MVU1CSUFfVU5JVkVSU0lUWSwgICJDb2x1bWJpYSBVbml2ZXJzaXR5In0sCi0gICAgeyBTTUlfVEhFM0dQUCwgICAgICAgICAgICAgICIzR1BQIn0sCi0gICAgeyBTTUlfR0VNVEVLX1NZU1RFTVMsICAgICAgICJHZW10ZWstU3lzdGVtcyJ9LAotICAgIHsgU01JX1dJRklfQUxMSUFOQ0UsICAgICAgICAiV2ktRmkgQWxsaWFuY2UifSwKLSAgICB7IDAsIE5VTEx9Ci19OwpkaWZmIC0tZ2l0IGEvb3VpLmggYi9vdWkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3OWUxOS4uMDAwMDAwMAotLS0gYS9vdWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvb3VpLmgsdiAxLjMuMi4xIDIwMDUvMDQvMTcgMDE6MjA6NTYgZ3V5IEV4cCAkIChMQkwpICovCi0vKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKi8KLQotZXh0ZXJuIHN0cnVjdCB0b2sgb3VpX3ZhbHVlc1tdOwotZXh0ZXJuIHN0cnVjdCB0b2sgc21pX3ZhbHVlc1tdOwotCi0jZGVmaW5lIE9VSV9FTkNBUF9FVEhFUiAweDAwMDAwMCAgICAgICAgLyogZW5jYXBzdWxhdGVkIEV0aGVybmV0ICovCi0jZGVmaW5lIE9VSV9DSVNDTyAgICAgICAweDAwMDAwYyAgICAgICAgLyogQ2lzY28gcHJvdG9jb2xzICovCi0jZGVmaW5lIE9VSV9OT1JURUwgICAgICAweDAwMDA4MSAgICAgICAgLyogTm9ydGVsIFNPTk1QICovCi0jZGVmaW5lIE9VSV9DSVNDT185MCAgICAweDAwMDBmOCAgICAgICAgLyogQ2lzY28gYnJpZGdpbmcgKi8KLSNkZWZpbmUgT1VJX1JGQzI2ODQgICAgIDB4MDA4MGMyICAgICAgICAvKiBSRkMgMjQyNy8yNjg0IGJyaWRnZWQgRXRoZXJuZXQgKi8KLSNkZWZpbmUgT1VJX0FUTV9GT1JVTSAgIDB4MDBBMDNFICAgICAgICAvKiBBVE0gRm9ydW0gKi8KLSNkZWZpbmUgT1VJX0NBQkxFX0JQRFUgIDB4MDBFMDJGICAgICAgICAvKiBET0NTSVMgc3Bhbm5pbmcgdHJlZSBCUERVICovCi0jZGVmaW5lIE9VSV9BUFBMRVRBTEsgICAweDA4MDAwNyAgICAgICAgLyogQXBwbGV0YWxrICovCi0jZGVmaW5lIE9VSV9KVU5JUEVSICAgICAweDAwOTA2OSAgICAgICAgLyogSnVuaXBlciAqLwotI2RlZmluZSBPVUlfSFAgICAgICAgICAgMHgwODAwMDkgICAgICAgIC8qIEhld2xldHQtUGFja2FyZCAqLwotCi0vKgotICogVGhlc2UgYXJlIFNNSSBOZXR3b3JrIE1hbmFnZW1lbnQgUHJpdmF0ZSBFbnRlcnByaXNlIENvZGVzIGZvcgotICogb3JnYW5pemF0aW9uczsgc2VlCi0gKgotICoJaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9lbnRlcnByaXNlLW51bWJlcnMKLSAqCi0gKiBmb3IgYSBsaXN0LgotICoKLSAqIExpc3QgdGFrZW4gZnJvbSBFdGhlcmVhbCdzIGVwYW4vc21pbm1wZWMuaC4KLSAqLwotI2RlZmluZSBTTUlfSUVURiAgICAgICAgICAgICAgICAgICAgIDAgLyogcmVzZXJ2ZWQgLSB1c2VkIGJ5IHRoZSBJRVRGIGluIEwyVFA/ICovCi0jZGVmaW5lIFNNSV9BQ0MgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBTTUlfQ0lTQ08gICAgICAgICAgICAgICAgICAgIDkKLSNkZWZpbmUgU01JX0hFV0xFVFRfUEFDS0FSRCAgICAgICAgICAxMQotI2RlZmluZSBTTUlfU1VOX01JQ1JPU1lTVEVNUyAgICAgICAgIDQyCi0jZGVmaW5lIFNNSV9NRVJJVCAgICAgICAgICAgICAgICAgICAgNjEKLSNkZWZpbmUgU01JX1NISVZBICAgICAgICAgICAgICAgICAgICAxNjYKLSNkZWZpbmUgU01JX0VSSUNTU09OICAgICAgICAgICAgICAgICAxOTMKLSNkZWZpbmUgU01JX0NJU0NPX1ZQTjUwMDAgICAgICAgICAgICAyNTUKLSNkZWZpbmUgU01JX0xJVklOR1NUT04gICAgICAgICAgICAgICAzMDcKLSNkZWZpbmUgU01JX01JQ1JPU09GVCAgICAgICAgICAgICAgICAzMTEKLSNkZWZpbmUgU01JXzNDT00gICAgICAgICAgICAgICAgICAgICA0MjkKLSNkZWZpbmUgU01JX0FTQ0VORCAgICAgICAgICAgICAgICAgICA1MjkKLSNkZWZpbmUgU01JX0JBWSAgICAgICAgICAgICAgICAgICAgICAxNTg0Ci0jZGVmaW5lIFNNSV9GT1VORFJZICAgICAgICAgICAgICAgICAgMTk5MQotI2RlZmluZSBTTUlfVkVSU0FORVQgICAgICAgICAgICAgICAgIDIxODAKLSNkZWZpbmUgU01JX1JFREJBQ0sgICAgICAgICAgICAgICAgICAyMzUyCi0jZGVmaW5lIFNNSV9KVU5JUEVSICAgICAgICAgICAgICAgICAgMjYzNgotI2RlZmluZSBTTUlfQVBUSVMgICAgICAgICAgICAgICAgICAgIDI2MzcKLSNkZWZpbmUgU01JX0NJU0NPX1ZQTjMwMDAgICAgICAgICAgICAzMDc2Ci0jZGVmaW5lIFNNSV9DT1NJTkUgICAgICAgICAgICAgICAgICAgMzA4NQotI2RlZmluZSBTTUlfU0hBU1RBICAgICAgICAgICAgICAgICAgIDMxOTkKLSNkZWZpbmUgU01JX05FVFNDUkVFTiAgICAgICAgICAgICAgICAzMjI0Ci0jZGVmaW5lIFNNSV9OT01BRElYICAgICAgICAgICAgICAgICAgMzMwOQotI2RlZmluZSBTTUlfU0lFTUVOUyAgICAgICAgICAgICAgICAgIDQzMjkKLSNkZWZpbmUgU01JX0NBQkxFTEFCUyAgICAgICAgICAgICAgICA0NDkxCi0jZGVmaW5lIFNNSV9VTklTUEhFUkUgICAgICAgICAgICAgICAgNDg3NAotI2RlZmluZSBTTUlfQ0lTQ09fQkJTTSAgICAgICAgICAgICAgIDUyNjMKLSNkZWZpbmUgU01JX1RIRTNHUFAyICAgICAgICAgICAgICAgICA1NTM1Ci0jZGVmaW5lIFNNSV9JUF9VTlBMVUdHRUQgICAgICAgICAgICAgNTkyNQotI2RlZmluZSBTTUlfSVNTQU5OSSAgICAgICAgICAgICAgICAgIDU5NDgKLSNkZWZpbmUgU01JX1FVSU5UVU0gICAgICAgICAgICAgICAgICA2NjE4Ci0jZGVmaW5lIFNNSV9JTlRFUkxJTksgICAgICAgICAgICAgICAgNjcyOAotI2RlZmluZSBTTUlfQ09MVUJSSVMgICAgICAgICAgICAgICAgIDg3NDQKLSNkZWZpbmUgU01JX0NPTFVNQklBX1VOSVZFUlNJVFkgICAgICAxMTg2MgotI2RlZmluZSBTTUlfVEhFM0dQUCAgICAgICAgICAgICAgICAgIDEwNDE1Ci0jZGVmaW5lIFNNSV9HRU1URUtfU1lTVEVNUyAgICAgICAgICAgMTA1MjkKLSNkZWZpbmUgU01JX1dJRklfQUxMSUFOQ0UgICAgICAgICAgICAxNDEyMgpkaWZmIC0tZ2l0IGEvcGFja2V0ZGF0LmF3ayBiL3BhY2tldGRhdC5hd2sKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmUyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2V0ZGF0LmF3aworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLUJFR0lOCXsKLQkjIHdlIG5lZWQgdG8ga25vdyAodXN1YWwpIHBhY2tldCBzaXplIHRvIGNvbnZlcnQgYnl0ZSBudW1iZXJzCi0JIyB0byBwYWNrZXQgbnVtYmVycwotCWlmIChwYWNrZXRzaXplIDw9IDApCi0JCXBhY2tldHNpemUgPSA1MTIKLQl9Ci0kNSAhfiAvW1NSXS8JewotCSMgcHJpbnQgb3V0IHBlci1wYWNrZXQgZGF0YSBpbiB0aGUgZm9ybToKLQkjICA8cGFja2V0ICM+Ci0JIyAgPHN0YXJ0IHNlcXVlbmNlICM+Ci0JIyAgPDFzdCBzZW5kIHRpbWU+Ci0JIyAgPGxhc3Qgc2VuZCB0aW1lPgotCSMgIDwxc3QgYWNrIHRpbWU+Ci0JIyAgPGxhc3QgYWNrIHRpbWU+Ci0JIyAgPCMgc2VuZHM+Ci0JIyAgPCMgYWNrcz4KLQotCW4gPSBzcGxpdCAoJDEsdCwiOiIpCi0JdGltID0gdFsxXSozNjAwICsgdFsyXSo2MCArIHRbM10KLQlpZiAoJDYgIT0gImFjayIpIHsKLQkJaSA9IGluZGV4KCQ2LCI6IikKLQkJc3RydFNlcSA9IHN1YnN0cigkNiwxLGktMSkKLQkJaWQgPSAxLjUgKyAoc3RydFNlcSAtIDEpIC8gcGFja2V0c2l6ZQotCQlpZCAtPSBpZCAlIDEKLQkJaWYgKG1heElkIDwgaWQpCi0JCQltYXhJZCA9IGlkCi0JCWlmIChmaXJzdFNlbmRbaWRdID09IDApIHsKLQkJCWZpcnN0U2VuZFtpZF0gPSB0aW0KLQkJCXNlcU5vW2lkXSA9IHN0cnRTZXEKLQkJfQotCQlsYXN0U2VuZFtpZF0gPSB0aW0KLQkJdGltZXNTZW50W2lkXSsrCi0JCXRvdGFsUGFja2V0cysrCi0JfSBlbHNlIHsKLQkJaWQgPSAxICsgKCQ3IC0gMikgLyBwYWNrZXRzaXplCi0JCWlkIC09IGlkICUgMQotCQl0aW1lc0Fja2VkW2lkXSsrCi0JCWlmIChmaXJzdEFja1tpZF0gPT0gMCkKLQkJCWZpcnN0QWNrW2lkXSA9IHRpbQotCQlsYXN0QWNrW2lkXSA9IHRpbQotCQl0b3RhbEFja3MrKwotCX0KLQl9Ci1FTkQJewotCXByaW50ICIjICIgbWF4SWQgIiBjaHVua3MuICAiIHRvdGFsUGFja2V0cyAiIHBhY2tldHMgc2VudC4gICIgXAotCQl0b3RhbEFja3MgIiBhY2tzLiIKLQkjIGZvciBwYWNrZXRzIHRoYXQgd2VyZSBpbXBsaWNpdGx5IGFja2VkLCBtYWtlIHRoZSBhY2sgdGltZQotCSMgYmUgdGhlIGFjayB0aW1lIG9mIG5leHQgZXhwbGljaXRseSBhY2tlZCBwYWNrZXQuCi0JZm9yIChpID0gbWF4SWQtMTsgaSA+IDA7IC0taSkKLQkJd2hpbGUgKGkgPiAwICYmIGZpcnN0QWNrW2ldID09IDApIHsKLQkJCWxhc3RBY2tbaV0gPSBmaXJzdEFja1tpXSA9IGZpcnN0QWNrW2krMV0KLQkJCS0taQotCQl9Ci0JdHplcm8gPSBmaXJzdFNlbmRbMV0KLQlmb3IgKGkgPSAxOyBpIDw9IG1heElkOyBpKyspCi0JCXByaW50ZiAiJWRcdCVkXHQlLjJmXHQlLjJmXHQlLjJmXHQlLjJmXHQlZFx0JWRcbiIsXAotCQkJaSwgc2VxTm9baV0sIFwKLQkJCWZpcnN0U2VuZFtpXSAtIHR6ZXJvLCBsYXN0U2VuZFtpXSAtIHR6ZXJvLFwKLQkJCWZpcnN0QWNrW2ldIC0gdHplcm8sIGxhc3RBY2tbaV0gLSB0emVybyxcCi0JCQl0aW1lc1NlbnRbaV0sIHRpbWVzQWNrZWRbaV0KLQl9CmRpZmYgLS1naXQgYS9wYXJzZW5mc2ZoLmMgYi9wYXJzZW5mc2ZoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMWUwYmEuLjAwMDAwMDAKLS0tIGEvcGFyc2VuZnNmaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQgSmVmZnJleSBDLiBNb2d1bCwgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24sCi0gKiBXZXN0ZXJuIFJlc2VhcmNoIExhYm9yYXRvcnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgQ29tcGFxIENvbXB1dGVyIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgYW5kIG1vZGlmeSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqICBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkIG9ubHkgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQKLSAqICBjb25kaXRpb25zLiAgQm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCi0gKiAgbm90aWNlIG11c3QgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBkZXJpdmF0aXZlIHdvcmtzCi0gKiAgb3IgbW9kaWZpZWQgdmVyc2lvbnMsIGFuZCBhbnkgcG9ydGlvbnMgdGhlcmVvZiwgYW5kIGJvdGggbm90aWNlcwotICogIG11c3QgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KLSAqCi0gKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiAgYXJlIG1ldDoKLSAqICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04KLSAqICBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCi0gKiAgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICAgSU4gTk8KLSAqICBFVkVOVCBTSEFMTCBDT01QQVEgQ09NUFVURVIgQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkKLSAqICBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4KLSAqICBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCi0gKiAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKLSAqICBTT0ZUV0FSRS4KLSAqLwotCi0vKgotICogcGFyc2VuZnNmaC5jIC0gcG9ydGFibGUgcGFyc2VyIGZvciBORlMgZmlsZSBoYW5kbGVzCi0gKgkJCXVzZXMgYWxsIHNvcnRzIG9mIGhldXJpc3RpY3MKLSAqCi0gKiBKZWZmcmV5IEMuIE1vZ3VsCi0gKiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgotICogV2VzdGVybiBSZXNlYXJjaCBMYWJvcmF0b3J5Ci0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcGFyc2VuZnNmaC5jLHYgMS4yOC4yLjEgMjAwNy8wNi8xNSAxOToxNTowNCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibmZzZmguaCIKLQotLyoKLSAqIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBwYXJzZSBhIGZpbGUgaGFuZGxlIChpbiBuZXR3b3JrIGJ5dGUgb3JkZXIpLAotICogdXNpbmcgaGV1cmlzdGljcyB0byBndWVzcyB3aGF0IGtpbmQgb2YgZm9ybWF0IGl0IGlzIGluLiAgU2VlIHRoZQotICogZmlsZSAiZmhhbmRsZV9sYXlvdXRzIiBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91cwotICogcGF0dGVybnMgd2Uga25vdyBhYm91dC4KLSAqCi0gKiBUaGUgZmlsZSBoYW5kbGUgaXMgcGFyc2VkIGludG8gb3VyIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGEKLSAqIGZpbGUtc3lzdGVtIGlkLCBhbmQgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW5vZGUtbnVtYmVyLgotICovCi0KLSNkZWZpbmUJRkhUX1VOS05PV04JMAotI2RlZmluZQlGSFRfQVVTUEVYCTEKLSNkZWZpbmUJRkhUX0RFQ09TRgkyCi0jZGVmaW5lCUZIVF9JUklYNAkzCi0jZGVmaW5lCUZIVF9JUklYNQk0Ci0jZGVmaW5lCUZIVF9TVU5PUzMJNQotI2RlZmluZQlGSFRfU1VOT1M0CTYKLSNkZWZpbmUJRkhUX1VMVFJJWAk3Ci0jZGVmaW5lCUZIVF9WTVNVQ1gJOAotI2RlZmluZQlGSFRfU1VOT1M1CTkKLSNkZWZpbmUJRkhUX0FJWDMyCTEwCi0jZGVmaW5lCUZIVF9IUFVYOQkxMQotI2RlZmluZQlGSFRfQlNENDQJMTIKLQotI2lmZGVmCXVsdHJpeAotLyogTmFzdHkgaGFjayB0byBrZWVwIHRoZSBVbHRyaXggQyBjb21waWxlciBmcm9tIGVtaXR0aW5nIGJvZ3VzIHdhcm5pbmdzICovCi0jZGVmaW5lCVhGRih4KQkoKHVfaW50MzJfdCkoeCkpCi0jZWxzZQotI2RlZmluZQlYRkYoeCkJKHgpCi0jZW5kaWYKLQotI2RlZmluZQltYWtlX3VpbnQzMihtc2IsYixjLGxzYilcCi0JKFhGRihsc2IpICsgKFhGRihjKTw8OCkgKyAoWEZGKGIpPDwxNikgKyAoWEZGKG1zYik8PDI0KSkKLQotI2RlZmluZQltYWtlX3VpbnQyNChtc2IsYiwgbHNiKVwKLQkoWEZGKGxzYikgKyAoWEZGKGIpPDw4KSArIChYRkYobXNiKTw8MTYpKQotCi0jZGVmaW5lCW1ha2VfdWludDE2KG1zYixsc2IpXAotCShYRkYobHNiKSArIChYRkYobXNiKTw8OCkpCi0KLSNpZmRlZglfX2FscGhhCi0JLyogb3Igb3RoZXIgNjQtYml0IHN5c3RlbXMgKi8KLSNkZWZpbmUJbWFrZV91aW50NDgobXNiLGIsYyxkLGUsbHNiKVwKLQkoKGxzYikgKyAoKGUpPDw4KSArICgoZCk8PDE2KSArICgoYyk8PDI0KSArICgoYik8PDMyKSArICgobXNiKTw8NDApKQotI2Vsc2UKLQkvKiBvbiAzMi1iaXQgc3lzdGVtcyBpZ25vcmUgaGlnaC1vcmRlciBiaXRzICovCi0jZGVmaW5lCW1ha2VfdWludDQ4KG1zYixiLGMsZCxlLGxzYilcCi0JKChsc2IpICsgKChlKTw8OCkgKyAoKGQpPDwxNikgKyAoKGMpPDwyNCkpCi0jZW5kaWYKLQotc3RhdGljIGludCBpc19VQ1goY29uc3QgdW5zaWduZWQgY2hhciAqKTsKLQotdm9pZAotUGFyc2VfZmgoZmgsIGxlbiwgZnNpZHAsIGlub3AsIG9zbmFtZXAsIGZzbmFtZXAsIG91cnNlbGYpCi1yZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpmaDsKLWludCBsZW4gX1VfOwotbXlfZnNpZCAqZnNpZHA7Ci1pbm9fdCAqaW5vcDsKLWNvbnN0IGNoYXIgKipvc25hbWVwOwkJLyogaWYgbm9uLU5VTEwsIHJldHVybiBPUyBuYW1lIGhlcmUgKi8KLWNvbnN0IGNoYXIgKipmc25hbWVwOwkJLyogaWYgbm9uLU5VTEwsIHJldHVybiBzZXJ2ZXIgZnMgbmFtZSBoZXJlIChmb3IgVk1TKSAqLwotaW50IG91cnNlbGY7CQkvKiB0cnVlIGlmIGZpbGUgaGFuZGxlIHdhcyBnZW5lcmF0ZWQgb24gdGhpcyBob3N0ICovCi17Ci0JcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZmhwID0gZmg7Ci0JdV9pbnQzMl90IHRlbXA7Ci0JaW50IGZodHlwZSA9IEZIVF9VTktOT1dOOwotCWludCBpOwotCi0JaWYgKG91cnNlbGYpIHsKLQkgICAgLyogRmlsZSBoYW5kbGUgZ2VuZXJhdGVkIG9uIHRoaXMgaG9zdCwgbm8gbmVlZCBmb3IgZ3Vlc3NpbmcgKi8KLSNpZglkZWZpbmVkKElSSVg0MCkKLQkgICAgZmh0eXBlID0gRkhUX0lSSVg0OwotI2VuZGlmCi0jaWYJZGVmaW5lZChJUklYNTApCi0JICAgIGZodHlwZSA9IEZIVF9JUklYNTsKLSNlbmRpZgotI2lmCWRlZmluZWQoSVJJWDUxKQotCSAgICBmaHR5cGUgPSBGSFRfSVJJWDU7Ci0jZW5kaWYKLSNpZglkZWZpbmVkKFNVTk9TNCkKLQkgICAgZmh0eXBlID0gRkhUX1NVTk9TNDsKLSNlbmRpZgotI2lmCWRlZmluZWQoU1VOT1M1KQotCSAgICBmaHR5cGUgPSBGSFRfU1VOT1M1OwotI2VuZGlmCi0jaWYJZGVmaW5lZCh1bHRyaXgpCi0JICAgIGZodHlwZSA9IEZIVF9VTFRSSVg7Ci0jZW5kaWYKLSNpZglkZWZpbmVkKF9fb3NmX18pCi0JICAgIGZodHlwZSA9IEZIVF9ERUNPU0Y7Ci0jZW5kaWYKLSNpZglkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykgXAotICAgICB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQotCSAgICBmaHR5cGUgPSBGSFRfQlNENDQ7Ci0jZW5kaWYKLQl9Ci0JLyoKLQkgKiBUaGlzIGlzIGJhc2ljYWxseSBhIGJpZyBkZWNpc2lvbiB0cmVlCi0JICovCi0JZWxzZSBpZiAoKGZocFswXSA9PSAwKSAmJiAoZmhwWzFdID09IDApKSB7Ci0JICAgIC8qIGJ5dGVzWzAsMV0gPT0gKDAsMCk7IHJ1bGVzIG91dCBVbHRyaXgsIElSSVg1LCBTVU5PUzUgKi8KLQkgICAgLyogcHJvYmFibHkgcnVsZXMgb3V0IEhQLVVYLCBBSVggdW5sZXNzIHRoZXkgYWxsb3cgbWFqb3I9MCAqLwotCSAgICBpZiAoKGZocFsyXSA9PSAwKSAmJiAoZmhwWzNdID09IDApKSB7Ci0JCS8qIGJ5dGVzWzIsM10gPT0gKDAsMCk7IG11c3QgYmUgQXVzcGV4ICovCi0JCS8qIFhYWCBvciBjb3VsZCBiZSBVbHRyaXgrTUFTU0JVUyAiaHAiIGRpc2s/ICovCi0JCWZodHlwZSA9IEZIVF9BVVNQRVg7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCS8qCi0JCSAqIGJ5dGVzWzIsM10gIT0gKDAsMCk7IHJ1bGVzIG91dCBBdXNwZXgsIGNvdWxkIGJlCi0JCSAqIERFQ09TRiwgU1VOT1M0LCBvciBJUklYNAotCQkgKi8KLQkJaWYgKChmaHBbNF0gIT0gMCkgJiYgKGZocFs1XSA9PSAwKSAmJgotCQkJKGZocFs4XSA9PSAxMikgJiYgKGZocFs5XSA9PSAwKSkgewotCQkgICAgLyogc2VlbXMgdG8gYmUgREVDT1NGLCB3aXRoIG1pbm9yID09IDAgKi8KLQkJICAgIGZodHlwZSA9IEZIVF9ERUNPU0Y7Ci0JCX0KLQkJZWxzZSB7Ci0JCSAgICAvKiBjb3VsZCBiZSBTVU5PUzQgb3IgSVJJWDQgKi8KLQkJICAgIC8qIFhYWCB0aGUgdGVzdCBvZiBmaHBbNV0gPT0gOCBjb3VsZCBiZSB3cm9uZyAqLwotCQkgICAgaWYgKChmaHBbNF0gPT0gMCkgJiYgKGZocFs1XSA9PSA4KSAmJiAoZmhwWzZdID09IDApICYmCi0JCQkoZmhwWzddID09IDApKSB7Ci0JCQkvKiBsb29rcyBsaWtlIGEgbGVuZ3RoLCBub3QgYSBmaWxlIHN5c3RlbSB0eXBlY29kZSAqLwotCQkJZmh0eXBlID0gRkhUX0lSSVg0OwotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCQkvKiBieSBlbGltaW5hdGlvbiAqLwotCQkJZmh0eXBlID0gRkhUX1NVTk9TNDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCWVsc2UgewotCSAgICAvKgotCSAgICAgKiBieXRlc1swLDFdICE9ICgwLDApOyBydWxlcyBvdXQgQXVzcGV4LCBJUklYNCwgU1VOT1M0Ci0JICAgICAqIGNvdWxkIGJlIElSSVg1LCBERUNPU0YsIFVDWCwgVWx0cml4LCBTVU5PUzUKLQkgICAgICogY291bGQgYmUgQUlYLCBIUC1VWAotCSAgICAgKi8KLQkgICAgaWYgKChmaHBbMl0gPT0gMCkgJiYgKGZocFszXSA9PSAwKSkgewotCQkvKgotCQkgKiBieXRlc1syLDNdID09ICgwLDApOyBydWxlcyBvdXQgT1NGLCBwcm9iYWJseSBub3QgVUNYCi0JCSAqICh1bmxlc3MgdGhlIGV4cG9ydGVkIGRldmljZSBuYW1lIGlzIGp1c3Qgb25lIGxldHRlciEpLAotCQkgKiBjb3VsZCBiZSBVbHRyaXgsIElSSVg1LCBBSVgsIG9yIFNVTk9TNQotCQkgKiBtaWdodCBiZSBIUC1VWCAoZGVwZW5kcyBvbiB0aGVpciB2YWx1ZXMgZm9yIG1pbm9yIGRldnMpCi0JCSAqLwotCQlpZiAoKGZocFs2XSA9PSAwKSAmJiAoZmhwWzddID09IDApKSB7Ci0JCSAgICBmaHR5cGUgPSBGSFRfQlNENDQ7Ci0JCX0KLQkJLypYWFggd2UgcHJvYmFibHkgb25seSBuZWVkIHRvIHRlc3Qgb2YgdGhlc2UgdHdvIGJ5dGVzICovCi0JCWVsc2UgaWYgKChmaHBbMjFdID09IDApICYmIChmaHBbMjNdID09IDApKSB7Ci0JCSAgICBmaHR5cGUgPSBGSFRfVUxUUklYOwotCQl9Ci0JCWVsc2UgewotCQkgICAgLyogQ291bGQgYmUgU1VOT1M1L0lSSVg1LCBtYXliZSBBSVggKi8KLQkJICAgIC8qIFhYWCBubyBvYnZpb3VzIGRpZmZlcmVuY2UgYmV0d2VlbiBTVU5PUzUgYW5kIElSSVg1ICovCi0JCSAgICBpZiAoZmhwWzldID09IDEwKQotCQkJZmh0eXBlID0gRkhUX1NVTk9TNTsKLQkJICAgIC8qIFhYWCB3aGF0IGFib3V0IEFJWD8gKi8KLQkJfQotCSAgICB9Ci0JICAgIGVsc2UgewotCQkvKgotCQkgKiBieXRlc1syLDNdICE9ICgwLDApOyBydWxlcyBvdXQgVWx0cml4LCBjb3VsZCBiZQotCQkgKiBERUNPU0YsIFNVTk9TNSwgSVJJWDUsIEFJWCwgSFAtVVgsIG9yIFVDWAotCQkgKi8KLQkJaWYgKChmaHBbOF0gPT0gMTIpICYmIChmaHBbOV0gPT0gMCkpIHsKLQkJICAgIGZodHlwZSA9IEZIVF9ERUNPU0Y7Ci0JCX0KLQkJZWxzZSBpZiAoKGZocFs4XSA9PSAwKSAmJiAoZmhwWzldID09IDEwKSkgewotCQkgICAgLyogY291bGQgYmUgU1VOT1M1L0lSSVg1LCBBSVgsIEhQLVVYICovCi0JCSAgICBpZiAoKGZocFs3XSA9PSAwKSAmJiAoZmhwWzZdID09IDApICYmCi0JCQkoZmhwWzVdID09IDApICYmIChmaHBbNF0gPT0gMCkpIHsKLQkJCS8qIFhYWCBpcyB0aGlzIGFsd2F5cyB0cnVlIG9mIEhQLVVYPyAqLwotCQkJZmh0eXBlID0gRkhUX0hQVVg5OwotCQkgICAgfQotCQkgICAgZWxzZSBpZiAoZmhwWzddID09IDIpIHsKLQkJCS8qIFRoaXMgd291bGQgYmUgTU5UX05GUyBvbiBBSVgsIHdoaWNoIGlzIGltcG9zc2libGUgKi8KLQkJCWZodHlwZSA9IEZIVF9TVU5PUzU7CS8qIG9yIG1heWJlIElSSVg1ICovCi0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCS8qCi0JCQkgKiBYWFggQ291bGQgYmUgU1VOT1M1L0lSSVg1IG9yIEFJWC4gIEkgZG9uJ3QKLQkJCSAqIFhYWCBzZWUgYW55IHdheSB0byBkaXNhbWJpZ3VhdGUgdGhlc2UsIHNvCi0JCQkgKiBYWFggSSdtIGdvaW5nIHdpdGggdGhlIG1vcmUgbGlrZWx5IGd1ZXNzLgotCQkJICogWFhYIFNvcnJ5LCBCaWcgQmx1ZS4KLQkJCSAqLwotCQkJZmh0eXBlID0gRkhUX1NVTk9TNTsJLyogb3IgbWF5YmUgSVJJWDUgKi8KLQkJICAgIH0KLQkgICAgICAgIH0KLQkJZWxzZSB7Ci0JCSAgICBpZiAoaXNfVUNYKGZocCkpIHsKLQkJCWZodHlwZSA9IEZIVF9WTVNVQ1g7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIHsKLQkJCWZodHlwZSA9IEZIVF9VTktOT1dOOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0KLQkvKiBYWFggc3RpbGwgbmVlZHMgdG8gaGFuZGxlIFNVTk9TMyAqLwotCi0Jc3dpdGNoIChmaHR5cGUpIHsKLQljYXNlIEZIVF9BVVNQRVg6Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFs3XTsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzZdOwotCSAgICBmc2lkcC0+ZnNpZF9jb2RlID0gMDsKLQotCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzEyXSwgZmhwWzEzXSwgZmhwWzE0XSwgZmhwWzE1XSk7Ci0JICAgICppbm9wID0gdGVtcDsKLQotCSAgICBpZiAob3NuYW1lcCkKLQkJKm9zbmFtZXAgPSAiQXVzcGV4IjsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIEZIVF9CU0Q0NDoKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gZmhwWzBdOwotCSAgICBmc2lkcC0+RnNpZF9kZXYuTWFqb3IgPSBmaHBbMV07Ci0JICAgIGZzaWRwLT5mc2lkX2NvZGUgPSAwOwotCi0JICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTVdLCBmaHBbMTRdLCBmaHBbMTNdLCBmaHBbMTJdKTsKLQkgICAgKmlub3AgPSB0ZW1wOwotCi0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJCU0QgNC40IjsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIEZIVF9ERUNPU0Y6Ci0JICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbN10sIGZocFs2XSwgZmhwWzVdLCBmaHBbNF0pOwotCQkJLyogWFhYIGNvdWxkIGlnbm9yZSAzIGhpZ2gtb3JkZXIgYnl0ZXMgKi8KLQotCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzNdLCBmaHBbMl0sIGZocFsxXSwgZmhwWzBdKTsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gdGVtcCAmIDB4RkZGRkY7Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NYWpvciA9ICh0ZW1wPj4yMCkgJiAweEZGRjsKLQotCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzE1XSwgZmhwWzE0XSwgZmhwWzEzXSwgZmhwWzEyXSk7Ci0JICAgICppbm9wID0gdGVtcDsKLQkgICAgaWYgKG9zbmFtZXApCi0JCSpvc25hbWVwID0gIk9TRiI7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBGSFRfSVJJWDQ6Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFszXTsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzJdOwotCSAgICBmc2lkcC0+ZnNpZF9jb2RlID0gMDsKLQotCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzhdLCBmaHBbOV0sIGZocFsxMF0sIGZocFsxMV0pOwotCSAgICAqaW5vcCA9IHRlbXA7Ci0KLQkgICAgaWYgKG9zbmFtZXApCi0JCSpvc25hbWVwID0gIklSSVg0IjsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIEZIVF9JUklYNToKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gbWFrZV91aW50MTYoZmhwWzJdLCBmaHBbM10pOwotCSAgICBmc2lkcC0+RnNpZF9kZXYuTWFqb3IgPSBtYWtlX3VpbnQxNihmaHBbMF0sIGZocFsxXSk7Ci0JICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbNF0sIGZocFs1XSwgZmhwWzZdLCBmaHBbN10pOwotCi0JICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTJdLCBmaHBbMTNdLCBmaHBbMTRdLCBmaHBbMTVdKTsKLQkgICAgKmlub3AgPSB0ZW1wOwotCi0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJJUklYNSI7Ci0JICAgIGJyZWFrOwotCi0jaWZkZWYgbm90ZGVmCi0JY2FzZSBGSFRfU1VOT1MzOgotCSAgICAvKgotCSAgICAgKiBYWFggLSBub25lIG9mIHRoZSBoZXVyaXN0aWNzIGFib3ZlIHJldHVybiB0aGlzLgotCSAgICAgKiBBcmUgdGhlcmUgYW55IFN1bk9TIDMueCBzeXN0ZW1zIGFyb3VuZCB0byBjYXJlIGFib3V0PwotCSAgICAgKi8KLQkgICAgaWYgKG9zbmFtZXApCi0JCSpvc25hbWVwID0gIlNVTk9TMyI7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIEZIVF9TVU5PUzQ6Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFszXTsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzJdOwotCSAgICBmc2lkcC0+ZnNpZF9jb2RlID0gbWFrZV91aW50MzIoZmhwWzRdLCBmaHBbNV0sIGZocFs2XSwgZmhwWzddKTsKLQotCSAgICB0ZW1wID0gbWFrZV91aW50MzIoZmhwWzEyXSwgZmhwWzEzXSwgZmhwWzE0XSwgZmhwWzE1XSk7Ci0JICAgICppbm9wID0gdGVtcDsKLQotCSAgICBpZiAob3NuYW1lcCkKLQkJKm9zbmFtZXAgPSAiU1VOT1M0IjsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIEZIVF9TVU5PUzU6Ci0JICAgIHRlbXAgPSBtYWtlX3VpbnQxNihmaHBbMF0sIGZocFsxXSk7Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NYWpvciA9ICh0ZW1wPj4yKSAmICAweDNGRkY7Ci0JICAgIHRlbXAgPSBtYWtlX3VpbnQyNChmaHBbMV0sIGZocFsyXSwgZmhwWzNdKTsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gdGVtcCAmIDB4M0ZGRkY7Ci0JICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbNF0sIGZocFs1XSwgZmhwWzZdLCBmaHBbN10pOwotCi0JICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTJdLCBmaHBbMTNdLCBmaHBbMTRdLCBmaHBbMTVdKTsKLQkgICAgKmlub3AgPSB0ZW1wOwotCi0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJTVU5PUzUiOwotCSAgICBicmVhazsKLQotCWNhc2UgRkhUX1VMVFJJWDoKLQkgICAgZnNpZHAtPmZzaWRfY29kZSA9IDA7Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IGZocFswXTsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzFdOwotCi0JICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbN10sIGZocFs2XSwgZmhwWzVdLCBmaHBbNF0pOwotCSAgICAqaW5vcCA9IHRlbXA7Ci0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJVbHRyaXgiOwotCSAgICBicmVhazsKLQotCWNhc2UgRkhUX1ZNU1VDWDoKLQkgICAgLyogTm8gbnVtZXJpYyBmaWxlIHN5c3RlbSBJRCwgc28gaGFzaCBvbiB0aGUgZGV2aWNlLW5hbWUgKi8KLQkgICAgaWYgKHNpemVvZigqZnNpZHApID49IDE0KSB7Ci0JCWlmIChzaXplb2YoKmZzaWRwKSA+IDE0KQotCQkgICAgbWVtc2V0KChjaGFyICopZnNpZHAsIDAsIHNpemVvZigqZnNpZHApKTsKLQkJLyoganVzdCB1c2UgdGhlIHdob2xlIHRoaW5nICovCi0JCW1lbWNweSgoY2hhciAqKWZzaWRwLCAoY2hhciAqKWZoLCAxNCk7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCXVfaW50MzJfdCB0ZW1wYVs0XTsJLyogYXQgbGVhc3QgMTYgYnl0ZXMsIG1heWJlIG1vcmUgKi8KLQotCQltZW1zZXQoKGNoYXIgKil0ZW1wYSwgMCwgc2l6ZW9mKHRlbXBhKSk7Ci0JCW1lbWNweSgoY2hhciAqKXRlbXBhLCAoY2hhciAqKWZoLCAxNCk7IC8qIGVuc3VyZSBhbGlnbm1lbnQgKi8KLQkJZnNpZHAtPkZzaWRfZGV2Lk1pbm9yID0gdGVtcGFbMF0gKyAodGVtcGFbMV08PDEpOwotCQlmc2lkcC0+RnNpZF9kZXYuTWFqb3IgPSB0ZW1wYVsyXSArICh0ZW1wYVszXTw8MSk7Ci0JCWZzaWRwLT5mc2lkX2NvZGUgPSAwOwotCSAgICB9Ci0KLQkgICAgLyogVk1TIGZpbGUgSUQgaXM6IChSVk4sIEZpZEhpLCBGaWRMbykgKi8KLQkgICAgKmlub3AgPSBtYWtlX3VpbnQzMihmaHBbMjZdLCBmaHBbMjddLCBmaHBbMjNdLCBmaHBbMjJdKTsKLQotCSAgICAvKiBDYWxsZXIgbXVzdCBzYXZlIChhbmQgbnVsbC10ZXJtaW5hdGU/KSB0aGlzIHZhbHVlICovCi0JICAgIGlmIChmc25hbWVwKQotCQkqZnNuYW1lcCA9IChjaGFyICopJihmaHBbMV0pOwotCi0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJWTVMiOwotCSAgICBicmVhazsKLQotCWNhc2UgRkhUX0FJWDMyOgotCSAgICBmc2lkcC0+RnNpZF9kZXYuTWlub3IgPSBtYWtlX3VpbnQxNihmaHBbMl0sIGZocFszXSk7Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NYWpvciA9IG1ha2VfdWludDE2KGZocFswXSwgZmhwWzFdKTsKLQkgICAgZnNpZHAtPmZzaWRfY29kZSA9IG1ha2VfdWludDMyKGZocFs0XSwgZmhwWzVdLCBmaHBbNl0sIGZocFs3XSk7Ci0KLQkgICAgdGVtcCA9IG1ha2VfdWludDMyKGZocFsxMl0sIGZocFsxM10sIGZocFsxNF0sIGZocFsxNV0pOwotCSAgICAqaW5vcCA9IHRlbXA7Ci0KLQkgICAgaWYgKG9zbmFtZXApCi0JCSpvc25hbWVwID0gIkFJWDMyIjsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIEZIVF9IUFVYOToKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gZmhwWzBdOwotCSAgICB0ZW1wID0gbWFrZV91aW50MjQoZmhwWzFdLCBmaHBbMl0sIGZocFszXSk7Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IHRlbXA7Ci0JICAgIGZzaWRwLT5mc2lkX2NvZGUgPSBtYWtlX3VpbnQzMihmaHBbNF0sIGZocFs1XSwgZmhwWzZdLCBmaHBbN10pOwotCi0JICAgIHRlbXAgPSBtYWtlX3VpbnQzMihmaHBbMTJdLCBmaHBbMTNdLCBmaHBbMTRdLCBmaHBbMTVdKTsKLQkgICAgKmlub3AgPSB0ZW1wOwotCi0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJIUFVYOSI7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBGSFRfVU5LTk9XTjoKLSNpZmRlZiBERUJVRwotCSAgICAvKiBYWFggZGVidWdnaW5nICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiV4LiIsIGZocFtpXSk7Ci0JICAgICh2b2lkKWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSNlbmRpZgotCSAgICAvKiBTYXZlIHRoZSBhY3R1YWwgaGFuZGxlLCBzbyBpdCBjYW4gYmUgZGlzcGxheSB3aXRoIC11ICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCSAgICAJKHZvaWQpc25wcmludGYoJihmc2lkcC0+T3BhcXVlX0hhbmRsZVtpKjJdKSwgMywgIiUuMlgiLCBmaHBbaV0pOwotCi0JICAgIC8qIFhYWCBmb3Igbm93LCBnaXZlICJib2d1cyIgdmFsdWVzIHRvIGFpZCBkZWJ1Z2dpbmcgKi8KLQkgICAgZnNpZHAtPmZzaWRfY29kZSA9IDA7Ci0JICAgIGZzaWRwLT5Gc2lkX2Rldi5NaW5vciA9IDI1NzsKLQkgICAgZnNpZHAtPkZzaWRfZGV2Lk1ham9yID0gMjU3OwotCSAgICAqaW5vcCA9IDE7Ci0KLQkgICAgLyogZGlzcGxheSB3aWxsIHNob3cgdGhpcyBzdHJpbmcgaW5zdGVhZCBvZiAoMjU3LDI1NykgKi8KLQkgICAgaWYgKGZzbmFtZXApCi0JCSpmc25hbWVwID0gIlVua25vd24iOwotCi0JICAgIGlmIChvc25hbWVwKQotCQkqb3NuYW1lcCA9ICJVbmtub3duIjsKLQkgICAgYnJlYWs7Ci0KLQl9Ci19Ci0KLS8qCi0gKiBJcyB0aGlzIGEgVk1TIFVDWCBmaWxlIGhhbmRsZT8KLSAqCUNoZWNrIGZvcjoKLSAqCSgxKSBsZWFkaW5nIGNvZGUgYnl0ZQlbWFhYIG5vdCB5ZXRdCi0gKgkoMikgZm9sbG93ZWQgYnkgc3RyaW5nIG9mIHByaW50aW5nIGNoYXJzICYgc3BhY2VzCi0gKgkoMykgZm9sbG93ZWQgYnkgc3RyaW5nIG9mIG51bGxzCi0gKi8KLXN0YXRpYyBpbnQKLWlzX1VDWChmaHApCi1jb25zdCB1bnNpZ25lZCBjaGFyICpmaHA7Ci17Ci0JcmVnaXN0ZXIgaW50IGk7Ci0JaW50IHNlZW5fbnVsbCA9IDA7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgMTQ7IGkrKykgewotCSAgICBpZiAoaXNwcmludChmaHBbaV0pKSB7Ci0JCWlmIChzZWVuX251bGwpCi0JCSAgIHJldHVybigwKTsKLQkJZWxzZQotCQkgICBjb250aW51ZTsKLQkgICAgfQotCSAgICBlbHNlIGlmIChmaHBbaV0gPT0gMCkgewotCQlzZWVuX251bGwgPSAxOwotCQljb250aW51ZTsKLQkgICAgfQotCSAgICBlbHNlCi0JCXJldHVybigwKTsKLQl9Ci0KLQlyZXR1cm4oMSk7Ci19CmRpZmYgLS1naXQgYS9wY2FwLW1pc3NpbmcuaCBiL3BjYXAtbWlzc2luZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjJmY2I0Li4wMDAwMDAwCi0tLSBhL3BjYXAtbWlzc2luZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OC0yMDAyCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wY2FwLW1pc3NpbmcuaCx2IDEuMi4yLjEgMjAwNS8wNi8wMyAyMjoxMDoxNiBndXkgRXhwICQgKExCTCkKLSAqLwotCi0jaWZuZGVmIHRjcGR1bXBfcGNhcF9taXNzaW5nX2gKLSNkZWZpbmUgdGNwZHVtcF9wY2FwX21pc3NpbmdfaAotCi0vKgotICogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IGJlIG1pc3NpbmcgZnJvbSBsaWJwY2FwLgotICovCi0KLSNpZm5kZWYgSEFWRV9QQ0FQX0xJU1RfREFUQUxJTktTCi1leHRlcm4gaW50IHBjYXBfbGlzdF9kYXRhbGlua3MocGNhcF90ICosIGludCAqKik7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1BDQVBfREFUQUxJTktfTkFNRV9UT19WQUwKLS8qCi0gKiBXZSBhc3N1bWUgbm8gcGxhdGZvcm0gaGFzIG9uZSBidXQgbm90IHRoZSBvdGhlci4KLSAqLwotZXh0ZXJuIGludCBwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKGNvbnN0IGNoYXIgKik7Ci1leHRlcm4gY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShpbnQpOwotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9QQ0FQX0RBVEFMSU5LX1ZBTF9UT19ERVNDUklQVElPTgotZXh0ZXJuIGNvbnN0IGNoYXIgKnBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKGludCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1BDQVBfRFVNUF9GVEVMTAotZXh0ZXJuIGxvbmcgcGNhcF9kdW1wX2Z0ZWxsKHBjYXBfZHVtcGVyX3QgKik7Ci0jZW5kaWYKLQotI2VuZGlmCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9wY2FwX2R1bXBfZnRlbGwuYyBiL3BjYXBfZHVtcF9mdGVsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzhjZDI5Li4wMDAwMDAwCi0tLSBhL3BjYXBfZHVtcF9mdGVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3BjYXBfZHVtcF9mdGVsbC5jLHYgMS4xLjIuMSAyMDA1LzA2LzAzIDIyOjEwOjE3IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8cGNhcC5oPgotCi0jaW5jbHVkZSAicGNhcC1taXNzaW5nLmgiCi0KLWxvbmcKLXBjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICpwKQotewotCXJldHVybiAoZnRlbGwoKEZJTEUgKilwKSk7Ci19CmRpZmYgLS1naXQgYS9wbWFwX3Byb3QuaCBiL3BtYXBfcHJvdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTNlODQxLi4wMDAwMDAwCi0tLSBhL3BtYXBfcHJvdC5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wbWFwX3Byb3QuaCx2IDEuMS4yLjIgMjAwNS8wNC8yNyAyMTo0NDowNiBndXkgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKLSAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQotICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKLSAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCi0gKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCi0gKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KLSAqCi0gKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCi0gKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KLSAqCi0gKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKLSAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKLSAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KLSAqCi0gKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKLSAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKLSAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCi0gKgotICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQotICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCi0gKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDI1NTAgR2FyY2lhIEF2ZW51ZQotICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKLSAqCi0gKglmcm9tOiBAKCMpcG1hcF9wcm90LmggMS4xNCA4OC8wMi8wOCBTTUkKLSAqCWZyb206IEAoIylwbWFwX3Byb3QuaAkyLjEgODgvMDcvMjkgNC4wIFJQQ1NSQwotICogJEZyZWVCU0Q6IHNyYy9pbmNsdWRlL3JwYy9wbWFwX3Byb3QuaCx2IDEuOS4yLjEgMTk5OS8wOC8yOSAxNDozOTowNSBwZXRlciBFeHAgJAotICovCi0KLS8qCi0gKiBwbWFwX3Byb3QuaAotICogUHJvdG9jb2wgZm9yIHRoZSBsb2NhbCBiaW5kZXIgc2VydmljZSwgb3IgcG1hcC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgcHJvdG9jb2w6Ci0gKgotICogUE1BUFBST0NfTlVMTCgpIHJldHVybnMgKCkKLSAqIAl0YWtlcyBub3RoaW5nLCByZXR1cm5zIG5vdGhpbmcKLSAqCi0gKiBQTUFQUFJPQ19TRVQoc3RydWN0IHBtYXApIHJldHVybnMgKGJvb2xfdCkKLSAqIAlUUlVFIGlzIHN1Y2Nlc3MsIEZBTFNFIGlzIGZhaWx1cmUuICBSZWdpc3RlcnMgdGhlIHR1cGxlCi0gKglbcHJvZywgdmVycywgcHJvdCwgcG9ydF0uCi0gKgotICogUE1BUFBST0NfVU5TRVQoc3RydWN0IHBtYXApIHJldHVybnMgKGJvb2xfdCkKLSAqCVRSVUUgaXMgc3VjY2VzcywgRkFMU0UgaXMgZmFpbHVyZS4gIFVuLXJlZ2lzdGVycyBwYWlyCi0gKglbcHJvZywgdmVyc10uICBwcm90IGFuZCBwb3J0IGFyZSBpZ25vcmVkLgotICoKLSAqIFBNQVBQUk9DX0dFVFBPUlQoc3RydWN0IHBtYXApIHJldHVybnMgKGxvbmcgdW5zaWduZWQpLgotICoJMCBpcyBmYWlsdXJlLiAgT3RoZXJ3aXNlIHJldHVybnMgdGhlIHBvcnQgbnVtYmVyIHdoZXJlIHRoZSBwYWlyCi0gKglbcHJvZywgdmVyc10gaXMgcmVnaXN0ZXJlZC4gIEl0IG1heSBsaWUhCi0gKgotICogUE1BUFBST0NfRFVNUCgpIFJFVFVSTlMgKHN0cnVjdCBwbWFwbGlzdCAqKQotICoKLSAqIFBNQVBQUk9DX0NBTExJVCh1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCBzdHJpbmc8PikKLSAqIAlSRVRVUk5TIChwb3J0LCBzdHJpbmc8Pik7Ci0gKiB1c2FnZTogZW5jYXBzdWxhdGVkcmVzdWx0cyA9IFBNQVBQUk9DX0NBTExJVChwcm9nLCB2ZXJzLCBwcm9jLCBlbmNhcHN1bGF0ZWRhcmdzKTsKLSAqIAlDYWxscyB0aGUgcHJvY2VkdXJlIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgSWYgaXQgaXMgbm90IHJlZ2lzdGVyZWQsCi0gKgl0aGlzIHByb2NlZHVyZSBpcyBxdWl0ZTsgaWUgaXQgZG9lcyBub3QgcmV0dXJuIGVycm9yIGluZm9ybWF0aW9uISEhCi0gKglUaGlzIHByb2NlZHVyZSBvbmx5IGlzIHN1cHBvcnRlZCBvbiBycGMvdWRwIGFuZCBjYWxscyB2aWEKLSAqCXJwYy91ZHAuICBUaGlzIHJvdXRpbmUgb25seSBwYXNzZXMgbnVsbCBhdXRoZW50aWNhdGlvbiBwYXJhbWV0ZXJzLgotICoJVGhpcyBmaWxlIGhhcyBubyBpbnRlcmZhY2UgdG8geGRyIHJvdXRpbmVzIGZvciBQTUFQUFJPQ19DQUxMSVQuCi0gKgotICogVGhlIHNlcnZpY2Ugc3VwcG9ydHMgcmVtb3RlIHByb2NlZHVyZSBjYWxscyBvbiB1ZHAvaXAgb3IgdGNwL2lwIHNvY2tldCAxMTEuCi0gKi8KLQotI2RlZmluZSBTVU5SUENfUE1BUFBPUlQJCSgodV9pbnQxNl90KTExMSkKLSNkZWZpbmUgU1VOUlBDX1BNQVBQUk9HCQkoKHVfaW50MzJfdCkxMDAwMDApCi0jZGVmaW5lIFNVTlJQQ19QTUFQVkVSUwkJKCh1X2ludDMyX3QpMikKLSNkZWZpbmUgU1VOUlBDX1BNQVBWRVJTX1BST1RPCSgodV9pbnQzMl90KTIpCi0jZGVmaW5lIFNVTlJQQ19QTUFQVkVSU19PUklHCSgodV9pbnQzMl90KTEpCi0jZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19OVUxMCSgodV9pbnQzMl90KTApCi0jZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19TRVQJKCh1X2ludDMyX3QpMSkKLSNkZWZpbmUgU1VOUlBDX1BNQVBQUk9DX1VOU0VUCSgodV9pbnQzMl90KTIpCi0jZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19HRVRQT1JUCSgodV9pbnQzMl90KTMpCi0jZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19EVU1QCSgodV9pbnQzMl90KTQpCi0jZGVmaW5lIFNVTlJQQ19QTUFQUFJPQ19DQUxMSVQJKCh1X2ludDMyX3QpNSkKLQotc3RydWN0IHN1bnJwY19wbWFwIHsKLQl1X2ludDMyX3QgcG1fcHJvZzsKLQl1X2ludDMyX3QgcG1fdmVyczsKLQl1X2ludDMyX3QgcG1fcHJvdDsKLQl1X2ludDMyX3QgcG1fcG9ydDsKLX07CmRpZmYgLS1naXQgYS9wcHAuaCBiL3BwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYyMWNhLi4wMDAwMDAwCi0tLSBhL3BwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcHAuaCx2IDEuMTYgMjAwNC8xMC8yMCAxNjoxNDoxNiBoYW5uZXMgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBQb2ludCB0byBQb2ludCBQcm90b2NvbCAoUFBQKSBSRkMxMzMxCi0gKgotICogQ29weXJpZ2h0IDE5ODkgYnkgQ2FybmVnaWUgTWVsbG9uLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgcHJvZ3JhbSBmb3IgYW55Ci0gKiBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodAotICogYW5kIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBvbiBhbGwgY29waWVzIGFuZCBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sCi0gKiB0aGUgbmFtZSBvZiBDYXJuZWdpZSBNZWxsb24gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5Ci0gKiBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcHJvZ3JhbSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiBwZXJtaXNzaW9uLCBhbmQgbm90aWNlIGJlIGdpdmVuIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiB0aGF0IGNvcHlpbmcKLSAqIGFuZCBkaXN0cmlidXRpb24gaXMgYnkgcGVybWlzc2lvbiBvZiBDYXJuZWdpZSBNZWxsb24gYW5kIFN0YW5mb3JkCi0gKiBVbml2ZXJzaXR5LiAgQ2FybmVnaWUgTWVsbG9uIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUKLSAqIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgotICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLSNkZWZpbmUgUFBQX0hEUkxFTgk0CS8qIGxlbmd0aCBvZiBQUFAgaGVhZGVyICovCi0KLSNkZWZpbmUgUFBQX0FERFJFU1MJMHhmZgkvKiBUaGUgYWRkcmVzcyBieXRlIHZhbHVlICovCi0jZGVmaW5lIFBQUF9DT05UUk9MCTB4MDMJLyogVGhlIGNvbnRyb2wgYnl0ZSB2YWx1ZSAqLwotCi0jZGVmaW5lIFBQUF9XSVRIRElSRUNUSU9OX0lOICAweDAwIC8qIG5vbi1zdGFuZGFyZCBmb3IgRExUX1BQUF9XSVRIRElSRUNUSU9OICovCi0jZGVmaW5lIFBQUF9XSVRIRElSRUNUSU9OX09VVCAweDAxIC8qIG5vbi1zdGFuZGFyZCBmb3IgRExUX1BQUF9XSVRIRElSRUNUSU9OICovCi0KLS8qIFByb3RvY29sIG51bWJlcnMgKi8KLSNkZWZpbmUgUFBQX0lQCQkweDAwMjEJLyogUmF3IElQICovCi0jZGVmaW5lIFBQUF9PU0kJCTB4MDAyMwkvKiBPU0kgTmV0d29yayBMYXllciAqLwotI2RlZmluZSBQUFBfTlMJCTB4MDAyNQkvKiBYZXJveCBOUyBJRFAgKi8KLSNkZWZpbmUgUFBQX0RFQ05FVAkweDAwMjcJLyogREVDbmV0IFBoYXNlIElWICovCi0jZGVmaW5lIFBQUF9BUFBMRQkweDAwMjkJLyogQXBwbGV0YWxrICovCi0jZGVmaW5lIFBQUF9JUFgJCTB4MDAyYgkvKiBOb3ZlbGwgSVBYICovCi0jZGVmaW5lIFBQUF9WSkMJCTB4MDAyZAkvKiBWYW4gSmFjb2Jzb24gQ29tcHJlc3NlZCBUQ1AvSVAgKi8KLSNkZWZpbmUgUFBQX1ZKTkMJMHgwMDJmCS8qIFZhbiBKYWNvYnNvbiBVbmNvbXByZXNzZWQgVENQL0lQICovCi0jZGVmaW5lIFBQUF9CUlBEVQkweDAwMzEJLyogQnJpZGdpbmcgUERVICovCi0jZGVmaW5lIFBQUF9TVElJCTB4MDAzMwkvKiBTdHJlYW0gUHJvdG9jb2wgKFNULUlJKSAqLwotI2RlZmluZSBQUFBfVklORVMJMHgwMDM1CS8qIEJhbnlhbiBWaW5lcyAqLwotI2RlZmluZSBQUFBfTUwgICAgICAgICAgMHgwMDNkICAvKiBNdWx0aS1MaW5rIFBQUCAqLwotI2RlZmluZSBQUFBfSVBWNgkweDAwNTcJLyogSVB2NiAqLwotI2RlZmluZQlQUFBfQ09NUAkweDAwZmQJLyogQ29tcHJlc3NlZCBEYXRhZ3JhbSAqLwotCi0jZGVmaW5lIFBQUF9IRUxMTwkweDAyMDEJLyogODAyLjFkIEhlbGxvIFBhY2tldHMgKi8KLSNkZWZpbmUgUFBQX0xVWENPTQkweDAyMzEJLyogTHV4Y29tICovCi0jZGVmaW5lIFBQUF9TTlMJCTB4MDIzMwkvKiBTaWdtYSBOZXR3b3JrIFN5c3RlbXMgKi8KLSNkZWZpbmUgUFBQX01QTFNfVUNBU1QgIDB4MDI4MSAgLyogcmZjIDMwMzIgKi8KLSNkZWZpbmUgUFBQX01QTFNfTUNBU1QgIDB4MDI4MyAgLyogcmZjIDMwMjIgKi8KLQotI2RlZmluZSBQUFBfSVBDUAkweDgwMjEJLyogSVAgQ29udHJvbCBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfT1NJQ1AJMHg4MDIzCS8qIE9TSSBOZXR3b3JrIExheWVyIENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX05TQ1AJMHg4MDI1CS8qIFhlcm94IE5TIElEUCBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lIFBQUF9ERUNORVRDUAkweDgwMjcJLyogREVDbmV0IENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0FQUExFQ1AJMHg4MDI5CS8qIEFwcGxldGFsayBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lIFBQUF9JUFhDUAkweDgwMmIJLyogTm92ZWxsIElQWCBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lIFBQUF9TVElJQ1AJMHg4MDMzCS8qIFN0cmVhbiBQcm90b2NvbCBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lIFBQUF9WSU5FU0NQCTB4ODAzNQkvKiBCYW55YW4gVmluZXMgQ29udHJvbCBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfSVBWNkNQCTB4ODA1NwkvKiBJUHY2IENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX0NDUAkJMHg4MGZkCS8qIENvbXByZXNzIENvbnRyb2wgUHJvdG9jb2wgKi8KLSNkZWZpbmUgUFBQX01QTFNDUCAgICAgIDB4ODI4MSAgLyogcmZjIDMwMjIgKi8KLQotI2RlZmluZSBQUFBfTENQCQkweGMwMjEJLyogTGluayBDb250cm9sIFByb3RvY29sICovCi0jZGVmaW5lIFBQUF9QQVAJCTB4YzAyMwkvKiBQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfTFFNCQkweGMwMjUJLyogTGluayBRdWFsaXR5IE1vbml0b3JpbmcgKi8KLSNkZWZpbmUgUFBQX1NQQVAgICAgICAgIDB4YzAyNwotI2RlZmluZSBQUFBfQ0hBUAkweGMyMjMJLyogQ2hhbGxlbmdlIEhhbmRzaGFrZSBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfQkFDUAkweGMwMmIJLyogQmFuZHdpZHRoIEFsbG9jYXRpb24gQ29udHJvbCBQcm90b2NvbCAqLwotI2RlZmluZSBQUFBfQkFQCQkweGMwMmQJLyogQkFQICovCi0jZGVmaW5lIFBQUF9NUENQCQkweGMwM2QJLyogTXVsdGktTGluayAqLwotI2RlZmluZSBQUFBfU1BBUF9PTEQgICAgMHhjMTIzCi0jZGVmaW5lIFBQUF9FQVAgICAgICAgICAweGMyMjcKLQotZXh0ZXJuIHN0cnVjdCB0b2sgcHBwdHlwZTJzdHJbXTsKZGlmZiAtLWdpdCBhL3ByaW50LTgwMl8xMS5jIGIvcHJpbnQtODAyXzExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTMxNmQuLjAwMDAwMDAKLS0tIGEvcHJpbnQtODAyXzExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEKLSAqCUZvcnRyZXNzIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgICAgQ2hhcmxpZSBMZW5haGFuIChjbGVuYWhhbkBmb3J0cmVzc3RlY2guY29tKQotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC04MDJfMTEuYyx2IDEuMzEuMi4xNSAyMDA3LzA3LzIyIDIzOjE0OjE0IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaW5jbHVkZSAiY3BhY2suaCIKLQotI2luY2x1ZGUgImllZWU4MDJfMTEuaCIKLSNpbmNsdWRlICJpZWVlODAyXzExX3JhZGlvLmgiCi0KLSNkZWZpbmUgUFJJTlRfU1NJRChwKSBcCi0Jc3dpdGNoIChwLnNzaWRfc3RhdHVzKSB7IFwKLQljYXNlIFRSVU5DQVRFRDogXAotCQlyZXR1cm4gMDsgXAotCWNhc2UgUFJFU0VOVDogXAotCQlwcmludGYoIiAoIik7IFwKLQkJZm5fcHJpbnQocC5zc2lkLnNzaWQsIE5VTEwpOyBcCi0JCXByaW50ZigiKSIpOyBcCi0JCWJyZWFrOyBcCi0JY2FzZSBOT1RfUFJFU0VOVDogXAotCQlicmVhazsgXAotCX0KLQotI2RlZmluZSBQUklOVF9SQVRFKF9zZXAsIF9yLCBfc3VmKSBcCi0JcHJpbnRmKCIlcyUyLjFmJXMiLCBfc2VwLCAoLjUgKiAoKF9yKSAmIDB4N2YpKSwgX3N1ZikKLSNkZWZpbmUgUFJJTlRfUkFURVMocCkgXAotCXN3aXRjaCAocC5yYXRlc19zdGF0dXMpIHsgXAotCWNhc2UgVFJVTkNBVEVEOiBcCi0JCXJldHVybiAwOyBcCi0JY2FzZSBQUkVTRU5UOiBcCi0JCWRvIHsgXAotCQkJaW50IHo7IFwKLQkJCWNvbnN0IGNoYXIgKnNlcCA9ICIgWyI7IFwKLQkJCWZvciAoeiA9IDA7IHogPCBwLnJhdGVzLmxlbmd0aCA7IHorKykgeyBcCi0JCQkJUFJJTlRfUkFURShzZXAsIHAucmF0ZXMucmF0ZVt6XSwgXAotCQkJCQkocC5yYXRlcy5yYXRlW3pdICYgMHg4MCA/ICIqIiA6ICIiKSk7IFwKLQkJCQlzZXAgPSAiICI7IFwKLQkJCX0gXAotCQkJaWYgKHAucmF0ZXMubGVuZ3RoICE9IDApIFwKLQkJCQlwcmludGYoIiBNYml0XSIpOyBcCi0JCX0gd2hpbGUgKDApOyBcCi0JCWJyZWFrOyBcCi0JY2FzZSBOT1RfUFJFU0VOVDogXAotCQlicmVhazsgXAotCX0KLQotI2RlZmluZSBQUklOVF9EU19DSEFOTkVMKHApIFwKLQlzd2l0Y2ggKHAuZHNfc3RhdHVzKSB7IFwKLQljYXNlIFRSVU5DQVRFRDogXAotCQlyZXR1cm4gMDsgXAotCWNhc2UgUFJFU0VOVDogXAotCQlwcmludGYoIiBDSDogJXUiLCBwLmRzLmNoYW5uZWwpOyBcCi0JCWJyZWFrOyBcCi0JY2FzZSBOT1RfUFJFU0VOVDogXAotCQlicmVhazsgXAotCX0gXAotCXByaW50ZigiJXMiLCBcCi0JICAgIENBUEFCSUxJVFlfUFJJVkFDWShwLmNhcGFiaWxpdHlfaW5mbykgPyAiLCBQUklWQUNZIiA6ICIiICk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphdXRoX2FsZ190ZXh0W109eyJPcGVuIFN5c3RlbSIsIlNoYXJlZCBLZXkiLCJFQVAifTsKLSNkZWZpbmUgTlVNX0FVVEhfQUxHUwkoc2l6ZW9mIGF1dGhfYWxnX3RleHQgLyBzaXplb2YgYXV0aF9hbGdfdGV4dFswXSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKnN0YXR1c190ZXh0W10gPSB7Ci0JIlN1Y2Nlc2Z1bCIsICAvKiAgMCAgKi8KLQkiVW5zcGVjaWZpZWQgZmFpbHVyZSIsICAvKiAgMSAgKi8KLQkiUmVzZXJ2ZWQiLAkgIC8qICAyICAqLwotCSJSZXNlcnZlZCIsCSAgLyogIDMgICovCi0JIlJlc2VydmVkIiwJICAvKiAgNCAgKi8KLQkiUmVzZXJ2ZWQiLAkgIC8qICA1ICAqLwotCSJSZXNlcnZlZCIsCSAgLyogIDYgICovCi0JIlJlc2VydmVkIiwJICAvKiAgNyAgKi8KLQkiUmVzZXJ2ZWQiLAkgIC8qICA4ICAqLwotCSJSZXNlcnZlZCIsCSAgLyogIDkgICovCi0JIkNhbm5vdCBTdXBwb3J0IGFsbCByZXF1ZXN0ZWQgY2FwYWJpbGl0aWVzIGluIHRoZSBDYXBhYmlsaXR5IEluZm9ybWF0aW9uIGZpZWxkIiwJICAvKiAgMTAgICovCi0JIlJlYXNzb2NpYXRpb24gZGVuaWVkIGR1ZSB0byBpbmFiaWxpdHkgdG8gY29uZmlybSB0aGF0IGFzc29jaWF0aW9uIGV4aXN0cyIsCSAgLyogIDExICAqLwotCSJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlYXNvbiBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGUgc3RhbmRhcmQiLAkgIC8qICAxMiAgKi8KLQkiUmVzcG9uZGluZyBzdGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gIiwJICAvKiAgMTMgICovCi0JIlJlY2VpdmVkIGFuIEF1dGhlbnRpY2F0aW9uIGZyYW1lIHdpdGggYXV0aGVudGljYXRpb24gdHJhbnNhY3Rpb24gIiBcCi0JCSJzZXF1ZW5jZSBudW1iZXIgb3V0IG9mIGV4cGVjdGVkIHNlcXVlbmNlIiwJICAvKiAgMTQgICovCi0JIkF1dGhlbnRpY2F0aW9uIHJlamVjdGVkIGJlY2F1c2Ugb2YgY2hhbGxlbmdlIGZhaWx1cmUiLAkgIC8qICAxNSAqLwotCSJBdXRoZW50aWNhdGlvbiByZWplY3RlZCBkdWUgdG8gdGltZW91dCB3YWl0aW5nIGZvciBuZXh0IGZyYW1lIGluIHNlcXVlbmNlIiwJICAvKiAgMTYgKi8KLQkiQXNzb2NpYXRpb24gZGVuaWVkIGJlY2F1c2UgQVAgaXMgdW5hYmxlIHRvIGhhbmRsZSBhZGRpdGlvbmFsIGFzc29jaWF0ZWQgc3RhdGlvbnMiLAkgIC8qICAxNyAqLwotCSJBc3NvY2lhdGlvbiBkZW5pZWQgZHVlIHRvIHJlcXVlc3Rpbmcgc3RhdGlvbiBub3Qgc3VwcG9ydGluZyBhbGwgb2YgdGhlICIgXAotCQkiZGF0YSByYXRlcyBpbiBCU1NCYXNpY1JhdGVTZXQgcGFyYW1ldGVyIiwJICAvKiAgMTggKi8KLX07Ci0jZGVmaW5lIE5VTV9TVEFUVVNFUwkoc2l6ZW9mIHN0YXR1c190ZXh0IC8gc2l6ZW9mIHN0YXR1c190ZXh0WzBdKQotCi1zdGF0aWMgY29uc3QgY2hhciAqcmVhc29uX3RleHRbXSA9IHsKLQkiUmVzZXJ2ZWQiLCAvKiAwICovCi0JIlVuc3BlY2lmaWVkIHJlYXNvbiIsIC8qIDEgKi8KLQkiUHJldmlvdXMgYXV0aGVudGljYXRpb24gbm8gbG9uZ2VyIHZhbGlkIiwgIC8qIDIgKi8KLQkiRGVhdXRoZW50aWNhdGVkIGJlY2F1c2Ugc2VuZGluZyBzdGF0aW9uIGlzIGxlYXZpbmcgKG9yIGhhcyBsZWZ0KSBJQlNTIG9yIEVTUyIsIC8qIDMgKi8KLQkiRGlzYXNzb2NpYXRlZCBkdWUgdG8gaW5hY3Rpdml0eSIsIC8qIDQgKi8KLQkiRGlzYXNzb2NpYXRlZCBiZWNhdXNlIEFQIGlzIHVuYWJsZSB0byBoYW5kbGUgYWxsIGN1cnJlbnRseSBhc3NvY2lhdGVkIHN0YXRpb25zIiwgLyogNSAqLwotCSJDbGFzcyAyIGZyYW1lIHJlY2VpdmVkIGZyb20gbm9uYXV0aGVudGljYXRlZCBzdGF0aW9uIiwgLyogNiAqLwotCSJDbGFzcyAzIGZyYW1lIHJlY2VpdmVkIGZyb20gbm9uYXNzb2NpYXRlZCBzdGF0aW9uIiwgLyogNyAqLwotCSJEaXNhc3NvY2lhdGVkIGJlY2F1c2Ugc2VuZGluZyBzdGF0aW9uIGlzIGxlYXZpbmcgKG9yIGhhcyBsZWZ0KSBCU1MiLCAvKiA4ICovCi0JIlN0YXRpb24gcmVxdWVzdGluZyAocmUpYXNzb2NpYXRpb24gaXMgbm90IGF1dGhlbnRpY2F0ZWQgd2l0aCByZXNwb25kaW5nIHN0YXRpb24iLCAvKiA5ICovCi19OwotI2RlZmluZSBOVU1fUkVBU09OUwkoc2l6ZW9mIHJlYXNvbl90ZXh0IC8gc2l6ZW9mIHJlYXNvbl90ZXh0WzBdKQotCi1zdGF0aWMgaW50Ci13ZXBfcHJpbnQoY29uc3QgdV9jaGFyICpwKQotewotCXVfaW50MzJfdCBpdjsKLQotCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX0lWX0xFTiArIElFRUU4MDJfMTFfS0lEX0xFTikpCi0JCXJldHVybiAwOwotCWl2ID0gRVhUUkFDVF9MRV8zMkJJVFMocCk7Ci0KLQlwcmludGYoIkRhdGEgSVY6JTN4IFBhZCAleCBLZXlJRCAleCIsIElWX0lWKGl2KSwgSVZfUEFEKGl2KSwKLQkgICAgSVZfS0VZSUQoaXYpKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcGFyc2VfZWxlbWVudHMoc3RydWN0IG1nbXRfYm9keV90ICpwYm9keSwgY29uc3QgdV9jaGFyICpwLCBpbnQgb2Zmc2V0KQotewotCS8qCi0JICogV2UgaGF2ZW4ndCBzZWVuIGFueSBlbGVtZW50cyB5ZXQuCi0JICovCi0JcGJvZHktPmNoYWxsZW5nZV9zdGF0dXMgPSBOT1RfUFJFU0VOVDsKLQlwYm9keS0+c3NpZF9zdGF0dXMgPSBOT1RfUFJFU0VOVDsKLQlwYm9keS0+cmF0ZXNfc3RhdHVzID0gTk9UX1BSRVNFTlQ7Ci0JcGJvZHktPmRzX3N0YXR1cyA9IE5PVF9QUkVTRU5UOwotCXBib2R5LT5jZl9zdGF0dXMgPSBOT1RfUFJFU0VOVDsKLQlwYm9keS0+dGltX3N0YXR1cyA9IE5PVF9QUkVTRU5UOwotCi0JZm9yICg7OykgewotCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAxKSkKLQkJCXJldHVybjsKLQkJc3dpdGNoICgqKHAgKyBvZmZzZXQpKSB7Ci0JCWNhc2UgRV9TU0lEOgotCQkJLyogUHJlc2VudCwgcG9zc2libHkgdHJ1bmNhdGVkICovCi0JCQlwYm9keS0+c3NpZF9zdGF0dXMgPSBUUlVOQ0FURUQ7Ci0JCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAyKSkKLQkJCQlyZXR1cm47Ci0JCQltZW1jcHkoJnBib2R5LT5zc2lkLCBwICsgb2Zmc2V0LCAyKTsKLQkJCW9mZnNldCArPSAyOwotCQkJaWYgKHBib2R5LT5zc2lkLmxlbmd0aCAhPSAwKSB7Ci0JCQkJaWYgKHBib2R5LT5zc2lkLmxlbmd0aCA+Ci0JCQkJICAgIHNpemVvZihwYm9keS0+c3NpZC5zc2lkKSAtIDEpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCBwYm9keS0+c3NpZC5sZW5ndGgpKQotCQkJCQlyZXR1cm47Ci0JCQkJbWVtY3B5KCZwYm9keS0+c3NpZC5zc2lkLCBwICsgb2Zmc2V0LAotCQkJCSAgICBwYm9keS0+c3NpZC5sZW5ndGgpOwotCQkJCW9mZnNldCArPSBwYm9keS0+c3NpZC5sZW5ndGg7Ci0JCQl9Ci0JCQlwYm9keS0+c3NpZC5zc2lkW3Bib2R5LT5zc2lkLmxlbmd0aF0gPSAnXDAnOwotCQkJLyogUHJlc2VudCBhbmQgbm90IHRydW5jYXRlZCAqLwotCQkJcGJvZHktPnNzaWRfc3RhdHVzID0gUFJFU0VOVDsKLQkJCWJyZWFrOwotCQljYXNlIEVfQ0hBTExFTkdFOgotCQkJLyogUHJlc2VudCwgcG9zc2libHkgdHJ1bmNhdGVkICovCi0JCQlwYm9keS0+Y2hhbGxlbmdlX3N0YXR1cyA9IFRSVU5DQVRFRDsKLQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIDIpKQotCQkJCXJldHVybjsKLQkJCW1lbWNweSgmcGJvZHktPmNoYWxsZW5nZSwgcCArIG9mZnNldCwgMik7Ci0JCQlvZmZzZXQgKz0gMjsKLQkJCWlmIChwYm9keS0+Y2hhbGxlbmdlLmxlbmd0aCAhPSAwKSB7Ci0JCQkJaWYgKHBib2R5LT5jaGFsbGVuZ2UubGVuZ3RoID4KLQkJCQkgICAgc2l6ZW9mKHBib2R5LT5jaGFsbGVuZ2UudGV4dCkgLSAxKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgcGJvZHktPmNoYWxsZW5nZS5sZW5ndGgpKQotCQkJCQlyZXR1cm47Ci0JCQkJbWVtY3B5KCZwYm9keS0+Y2hhbGxlbmdlLnRleHQsIHAgKyBvZmZzZXQsCi0JCQkJICAgIHBib2R5LT5jaGFsbGVuZ2UubGVuZ3RoKTsKLQkJCQlvZmZzZXQgKz0gcGJvZHktPmNoYWxsZW5nZS5sZW5ndGg7Ci0JCQl9Ci0JCQlwYm9keS0+Y2hhbGxlbmdlLnRleHRbcGJvZHktPmNoYWxsZW5nZS5sZW5ndGhdID0gJ1wwJzsKLQkJCS8qIFByZXNlbnQgYW5kIG5vdCB0cnVuY2F0ZWQgKi8KLQkJCXBib2R5LT5jaGFsbGVuZ2Vfc3RhdHVzID0gUFJFU0VOVDsKLQkJCWJyZWFrOwotCQljYXNlIEVfUkFURVM6Ci0JCQkvKiBQcmVzZW50LCBwb3NzaWJseSB0cnVuY2F0ZWQgKi8KLQkJCXBib2R5LT5yYXRlc19zdGF0dXMgPSBUUlVOQ0FURUQ7Ci0JCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAyKSkKLQkJCQlyZXR1cm47Ci0JCQltZW1jcHkoJihwYm9keS0+cmF0ZXMpLCBwICsgb2Zmc2V0LCAyKTsKLQkJCW9mZnNldCArPSAyOwotCQkJaWYgKHBib2R5LT5yYXRlcy5sZW5ndGggIT0gMCkgewotCQkJCWlmIChwYm9keS0+cmF0ZXMubGVuZ3RoID4gc2l6ZW9mIHBib2R5LT5yYXRlcy5yYXRlKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgcGJvZHktPnJhdGVzLmxlbmd0aCkpCi0JCQkJCXJldHVybjsKLQkJCQltZW1jcHkoJnBib2R5LT5yYXRlcy5yYXRlLCBwICsgb2Zmc2V0LAotCQkJCSAgICBwYm9keS0+cmF0ZXMubGVuZ3RoKTsKLQkJCQlvZmZzZXQgKz0gcGJvZHktPnJhdGVzLmxlbmd0aDsKLQkJCX0KLQkJCS8qIFByZXNlbnQgYW5kIG5vdCB0cnVuY2F0ZWQgKi8KLQkJCXBib2R5LT5yYXRlc19zdGF0dXMgPSBQUkVTRU5UOwotCQkJYnJlYWs7Ci0JCWNhc2UgRV9EUzoKLQkJCS8qIFByZXNlbnQsIHBvc3NpYmx5IHRydW5jYXRlZCAqLwotCQkJcGJvZHktPmRzX3N0YXR1cyA9IFRSVU5DQVRFRDsKLQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIDMpKQotCQkJCXJldHVybjsKLQkJCW1lbWNweSgmcGJvZHktPmRzLCBwICsgb2Zmc2V0LCAzKTsKLQkJCW9mZnNldCArPSAzOwotCQkJLyogUHJlc2VudCBhbmQgbm90IHRydW5jYXRlZCAqLwotCQkJcGJvZHktPmRzX3N0YXR1cyA9IFBSRVNFTlQ7Ci0JCQlicmVhazsKLQkJY2FzZSBFX0NGOgotCQkJLyogUHJlc2VudCwgcG9zc2libHkgdHJ1bmNhdGVkICovCi0JCQlwYm9keS0+Y2Zfc3RhdHVzID0gVFJVTkNBVEVEOwotCQkJaWYgKCFUVEVTVDIoKihwICsgb2Zmc2V0KSwgOCkpCi0JCQkJcmV0dXJuOwotCQkJbWVtY3B5KCZwYm9keS0+Y2YsIHAgKyBvZmZzZXQsIDgpOwotCQkJb2Zmc2V0ICs9IDg7Ci0JCQkvKiBQcmVzZW50IGFuZCBub3QgdHJ1bmNhdGVkICovCi0JCQlwYm9keS0+Y2Zfc3RhdHVzID0gUFJFU0VOVDsKLQkJCWJyZWFrOwotCQljYXNlIEVfVElNOgotCQkJLyogUHJlc2VudCwgcG9zc2libHkgdHJ1bmNhdGVkICovCi0JCQlwYm9keS0+dGltX3N0YXR1cyA9IFRSVU5DQVRFRDsKLQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIDIpKQotCQkJCXJldHVybjsKLQkJCW1lbWNweSgmcGJvZHktPnRpbSwgcCArIG9mZnNldCwgMik7Ci0JCQlvZmZzZXQgKz0gMjsKLQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIDMpKQotCQkJCXJldHVybjsKLQkJCW1lbWNweSgmcGJvZHktPnRpbS5jb3VudCwgcCArIG9mZnNldCwgMyk7Ci0JCQlvZmZzZXQgKz0gMzsKLQotCQkJaWYgKHBib2R5LT50aW0ubGVuZ3RoIDw9IDMpCi0JCQkJYnJlYWs7Ci0JCQlpZiAocGJvZHktPnRpbS5sZW5ndGggLSAzID4gc2l6ZW9mIHBib2R5LT50aW0uYml0bWFwKQotCQkJCXJldHVybjsKLQkJCWlmICghVFRFU1QyKCoocCArIG9mZnNldCksIHBib2R5LT50aW0ubGVuZ3RoIC0gMykpCi0JCQkJcmV0dXJuOwotCQkJbWVtY3B5KHBib2R5LT50aW0uYml0bWFwLCBwICsgKHBib2R5LT50aW0ubGVuZ3RoIC0gMyksCi0JCQkgICAgKHBib2R5LT50aW0ubGVuZ3RoIC0gMykpOwotCQkJb2Zmc2V0ICs9IHBib2R5LT50aW0ubGVuZ3RoIC0gMzsKLQkJCS8qIFByZXNlbnQgYW5kIG5vdCB0cnVuY2F0ZWQgKi8KLQkJCXBib2R5LT50aW1fc3RhdHVzID0gUFJFU0VOVDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotI2lmIDAKLQkJCXByaW50ZigiKDEpIHVuaGFuZGxlZCBlbGVtZW50X2lkICglZCkgICIsCi0JCQkgICAgKihwICsgb2Zmc2V0KSApOwotI2VuZGlmCi0JCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQpLCAyKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIVRURVNUMigqKHAgKyBvZmZzZXQgKyAyKSwgKihwICsgb2Zmc2V0ICsgMSkpKQotCQkJCXJldHVybjsKLQkJCW9mZnNldCArPSAqKHAgKyBvZmZzZXQgKyAxKSArIDI7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUHJpbnQgSGFuZGxlIGZ1bmN0aW9ucyBmb3IgdGhlIG1hbmFnZW1lbnQgZnJhbWUgdHlwZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQKLWhhbmRsZV9iZWFjb24oY29uc3QgdV9jaGFyICpwKQotewotCXN0cnVjdCBtZ210X2JvZHlfdCBwYm9keTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQotCW1lbXNldCgmcGJvZHksIDAsIHNpemVvZihwYm9keSkpOwotCi0JaWYgKCFUVEVTVDIoKnAsIElFRUU4MDJfMTFfVFNUQU1QX0xFTiArIElFRUU4MDJfMTFfQkNOSU5UX0xFTiArCi0JICAgIElFRUU4MDJfMTFfQ0FQSU5GT19MRU4pKQotCQlyZXR1cm4gMDsKLQltZW1jcHkoJnBib2R5LnRpbWVzdGFtcCwgcCwgSUVFRTgwMl8xMV9UU1RBTVBfTEVOKTsKLQlvZmZzZXQgKz0gSUVFRTgwMl8xMV9UU1RBTVBfTEVOOwotCXBib2R5LmJlYWNvbl9pbnRlcnZhbCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHArb2Zmc2V0KTsKLQlvZmZzZXQgKz0gSUVFRTgwMl8xMV9CQ05JTlRfTEVOOwotCXBib2R5LmNhcGFiaWxpdHlfaW5mbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHArb2Zmc2V0KTsKLQlvZmZzZXQgKz0gSUVFRTgwMl8xMV9DQVBJTkZPX0xFTjsKLQotCXBhcnNlX2VsZW1lbnRzKCZwYm9keSwgcCwgb2Zmc2V0KTsKLQotCVBSSU5UX1NTSUQocGJvZHkpOwotCVBSSU5UX1JBVEVTKHBib2R5KTsKLQlwcmludGYoIiAlcyIsCi0JICAgIENBUEFCSUxJVFlfRVNTKHBib2R5LmNhcGFiaWxpdHlfaW5mbykgPyAiRVNTIiA6ICJJQlNTIik7Ci0JUFJJTlRfRFNfQ0hBTk5FTChwYm9keSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2Fzc29jX3JlcXVlc3QoY29uc3QgdV9jaGFyICpwKQotewotCXN0cnVjdCBtZ210X2JvZHlfdCBwYm9keTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQotCW1lbXNldCgmcGJvZHksIDAsIHNpemVvZihwYm9keSkpOwotCi0JaWYgKCFUVEVTVDIoKnAsIElFRUU4MDJfMTFfQ0FQSU5GT19MRU4gKyBJRUVFODAyXzExX0xJU1RFTklOVF9MRU4pKQotCQlyZXR1cm4gMDsKLQlwYm9keS5jYXBhYmlsaXR5X2luZm8gPSBFWFRSQUNUX0xFXzE2QklUUyhwKTsKLQlvZmZzZXQgKz0gSUVFRTgwMl8xMV9DQVBJTkZPX0xFTjsKLQlwYm9keS5saXN0ZW5faW50ZXJ2YWwgPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfTElTVEVOSU5UX0xFTjsKLQotCXBhcnNlX2VsZW1lbnRzKCZwYm9keSwgcCwgb2Zmc2V0KTsKLQotCVBSSU5UX1NTSUQocGJvZHkpOwotCVBSSU5UX1JBVEVTKHBib2R5KTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKGNvbnN0IHVfY2hhciAqcCkKLXsKLQlzdHJ1Y3QgbWdtdF9ib2R5X3QgcGJvZHk7Ci0JaW50IG9mZnNldCA9IDA7Ci0KLQltZW1zZXQoJnBib2R5LCAwLCBzaXplb2YocGJvZHkpKTsKLQotCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX0NBUElORk9fTEVOICsgSUVFRTgwMl8xMV9TVEFUVVNfTEVOICsKLQkgICAgSUVFRTgwMl8xMV9BSURfTEVOKSkKLQkJcmV0dXJuIDA7Ci0JcGJvZHkuY2FwYWJpbGl0eV9pbmZvID0gRVhUUkFDVF9MRV8xNkJJVFMocCk7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfQ0FQSU5GT19MRU47Ci0JcGJvZHkuc3RhdHVzX2NvZGUgPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfU1RBVFVTX0xFTjsKLQlwYm9keS5haWQgPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfQUlEX0xFTjsKLQotCXBhcnNlX2VsZW1lbnRzKCZwYm9keSwgcCwgb2Zmc2V0KTsKLQotCXByaW50ZigiIEFJRCgleCkgOiVzOiAlcyIsICgodV9pbnQxNl90KShwYm9keS5haWQgPDwgMiApKSA+PiAyICwKLQkgICAgQ0FQQUJJTElUWV9QUklWQUNZKHBib2R5LmNhcGFiaWxpdHlfaW5mbykgPyAiIFBSSVZBQ1kgIiA6ICIiLAotCSAgICAocGJvZHkuc3RhdHVzX2NvZGUgPCBOVU1fU1RBVFVTRVMKLQkJPyBzdGF0dXNfdGV4dFtwYm9keS5zdGF0dXNfY29kZV0KLQkJOiAibi9hIikpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9yZWFzc29jX3JlcXVlc3QoY29uc3QgdV9jaGFyICpwKQotewotCXN0cnVjdCBtZ210X2JvZHlfdCBwYm9keTsKLQlpbnQgb2Zmc2V0ID0gMDsKLQotCW1lbXNldCgmcGJvZHksIDAsIHNpemVvZihwYm9keSkpOwotCi0JaWYgKCFUVEVTVDIoKnAsIElFRUU4MDJfMTFfQ0FQSU5GT19MRU4gKyBJRUVFODAyXzExX0xJU1RFTklOVF9MRU4gKwotCSAgICBJRUVFODAyXzExX0FQX0xFTikpCi0JCXJldHVybiAwOwotCXBib2R5LmNhcGFiaWxpdHlfaW5mbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHApOwotCW9mZnNldCArPSBJRUVFODAyXzExX0NBUElORk9fTEVOOwotCXBib2R5Lmxpc3Rlbl9pbnRlcnZhbCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHArb2Zmc2V0KTsKLQlvZmZzZXQgKz0gSUVFRTgwMl8xMV9MSVNURU5JTlRfTEVOOwotCW1lbWNweSgmcGJvZHkuYXAsIHArb2Zmc2V0LCBJRUVFODAyXzExX0FQX0xFTik7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfQVBfTEVOOwotCi0JcGFyc2VfZWxlbWVudHMoJnBib2R5LCBwLCBvZmZzZXQpOwotCi0JUFJJTlRfU1NJRChwYm9keSk7Ci0JcHJpbnRmKCIgQVAgOiAlcyIsIGV0aGVyYWRkcl9zdHJpbmcoIHBib2R5LmFwICkpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9yZWFzc29jX3Jlc3BvbnNlKGNvbnN0IHVfY2hhciAqcCkKLXsKLQkvKiBTYW1lIGFzIGEgQXNzb2NpYXRpb24gUmVwb25zZSAqLwotCXJldHVybiBoYW5kbGVfYXNzb2NfcmVzcG9uc2UocCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9wcm9iZV9yZXF1ZXN0KGNvbnN0IHVfY2hhciAqcCkKLXsKLQlzdHJ1Y3QgbWdtdF9ib2R5X3QgIHBib2R5OwotCWludCBvZmZzZXQgPSAwOwotCi0JbWVtc2V0KCZwYm9keSwgMCwgc2l6ZW9mKHBib2R5KSk7Ci0KLQlwYXJzZV9lbGVtZW50cygmcGJvZHksIHAsIG9mZnNldCk7Ci0KLQlQUklOVF9TU0lEKHBib2R5KTsKLQlQUklOVF9SQVRFUyhwYm9keSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKGNvbnN0IHVfY2hhciAqcCkKLXsKLQlzdHJ1Y3QgbWdtdF9ib2R5X3QgIHBib2R5OwotCWludCBvZmZzZXQgPSAwOwotCi0JbWVtc2V0KCZwYm9keSwgMCwgc2l6ZW9mKHBib2R5KSk7Ci0KLQlpZiAoIVRURVNUMigqcCwgSUVFRTgwMl8xMV9UU1RBTVBfTEVOICsgSUVFRTgwMl8xMV9CQ05JTlRfTEVOICsKLQkgICAgSUVFRTgwMl8xMV9DQVBJTkZPX0xFTikpCi0JCXJldHVybiAwOwotCi0JbWVtY3B5KCZwYm9keS50aW1lc3RhbXAsIHAsIElFRUU4MDJfMTFfVFNUQU1QX0xFTik7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfVFNUQU1QX0xFTjsKLQlwYm9keS5iZWFjb25faW50ZXJ2YWwgPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfQkNOSU5UX0xFTjsKLQlwYm9keS5jYXBhYmlsaXR5X2luZm8gPSBFWFRSQUNUX0xFXzE2QklUUyhwK29mZnNldCk7Ci0Jb2Zmc2V0ICs9IElFRUU4MDJfMTFfQ0FQSU5GT19MRU47Ci0KLQlwYXJzZV9lbGVtZW50cygmcGJvZHksIHAsIG9mZnNldCk7Ci0KLQlQUklOVF9TU0lEKHBib2R5KTsKLQlQUklOVF9SQVRFUyhwYm9keSk7Ci0JUFJJTlRfRFNfQ0hBTk5FTChwYm9keSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2F0aW0odm9pZCkKLXsKLQkvKiB0aGUgZnJhbWUgYm9keSBmb3IgQVRJTSBpcyBudWxsLiAqLwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZGlzYXNzb2MoY29uc3QgdV9jaGFyICpwKQotewotCXN0cnVjdCBtZ210X2JvZHlfdCAgcGJvZHk7Ci0KLQltZW1zZXQoJnBib2R5LCAwLCBzaXplb2YocGJvZHkpKTsKLQotCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX1JFQVNPTl9MRU4pKQotCQlyZXR1cm4gMDsKLQlwYm9keS5yZWFzb25fY29kZSA9IEVYVFJBQ1RfTEVfMTZCSVRTKHApOwotCi0JcHJpbnRmKCI6ICVzIiwKLQkgICAgKHBib2R5LnJlYXNvbl9jb2RlIDwgTlVNX1JFQVNPTlMpCi0JCT8gcmVhc29uX3RleHRbcGJvZHkucmVhc29uX2NvZGVdCi0JCTogIlJlc2VydmVkIiApOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWhhbmRsZV9hdXRoKGNvbnN0IHVfY2hhciAqcCkKLXsKLQlzdHJ1Y3QgbWdtdF9ib2R5X3QgIHBib2R5OwotCWludCBvZmZzZXQgPSAwOwotCi0JbWVtc2V0KCZwYm9keSwgMCwgc2l6ZW9mKHBib2R5KSk7Ci0KLQlpZiAoIVRURVNUMigqcCwgNikpCi0JCXJldHVybiAwOwotCXBib2R5LmF1dGhfYWxnID0gRVhUUkFDVF9MRV8xNkJJVFMocCk7Ci0Jb2Zmc2V0ICs9IDI7Ci0JcGJvZHkuYXV0aF90cmFuc19zZXFfbnVtID0gRVhUUkFDVF9MRV8xNkJJVFMocCArIG9mZnNldCk7Ci0Jb2Zmc2V0ICs9IDI7Ci0JcGJvZHkuc3RhdHVzX2NvZGUgPSBFWFRSQUNUX0xFXzE2QklUUyhwICsgb2Zmc2V0KTsKLQlvZmZzZXQgKz0gMjsKLQotCXBhcnNlX2VsZW1lbnRzKCZwYm9keSwgcCwgb2Zmc2V0KTsKLQotCWlmICgocGJvZHkuYXV0aF9hbGcgPT0gMSkgJiYKLQkgICAgKChwYm9keS5hdXRoX3RyYW5zX3NlcV9udW0gPT0gMikgfHwKLQkgICAgIChwYm9keS5hdXRoX3RyYW5zX3NlcV9udW0gPT0gMykpKSB7Ci0JCXByaW50ZigiICglcyktJXggW0NoYWxsZW5nZSBUZXh0XSAlcyIsCi0JCSAgICAocGJvZHkuYXV0aF9hbGcgPCBOVU1fQVVUSF9BTEdTKQotCQkJPyBhdXRoX2FsZ190ZXh0W3Bib2R5LmF1dGhfYWxnXQotCQkJOiAiUmVzZXJ2ZWQiLAotCQkgICAgcGJvZHkuYXV0aF90cmFuc19zZXFfbnVtLAotCQkgICAgKChwYm9keS5hdXRoX3RyYW5zX3NlcV9udW0gJSAyKQotCQkgICAgICAgID8gKChwYm9keS5zdGF0dXNfY29kZSA8IE5VTV9TVEFUVVNFUykKLQkJCSAgICAgICA/IHN0YXR1c190ZXh0W3Bib2R5LnN0YXR1c19jb2RlXQotCQkJICAgICAgIDogIm4vYSIpIDogIiIpKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXByaW50ZigiICglcyktJXg6ICVzIiwKLQkgICAgKHBib2R5LmF1dGhfYWxnIDwgTlVNX0FVVEhfQUxHUykKLQkJPyBhdXRoX2FsZ190ZXh0W3Bib2R5LmF1dGhfYWxnXQotCQk6ICJSZXNlcnZlZCIsCi0JICAgIHBib2R5LmF1dGhfdHJhbnNfc2VxX251bSwKLQkgICAgKHBib2R5LmF1dGhfdHJhbnNfc2VxX251bSAlIDIpCi0JICAgICAgICA/ICgocGJvZHkuc3RhdHVzX2NvZGUgPCBOVU1fU1RBVFVTRVMpCi0JCSAgICA/IHN0YXR1c190ZXh0W3Bib2R5LnN0YXR1c19jb2RlXQotCSAgICAgICAgICAgIDogIm4vYSIpCi0JICAgICAgICA6ICIiKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1oYW5kbGVfZGVhdXRoKGNvbnN0IHN0cnVjdCBtZ210X2hlYWRlcl90ICpwbWgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlzdHJ1Y3QgbWdtdF9ib2R5X3QgIHBib2R5OwotCWludCBvZmZzZXQgPSAwOwotCWNvbnN0IGNoYXIgKnJlYXNvbiA9IE5VTEw7Ci0KLQltZW1zZXQoJnBib2R5LCAwLCBzaXplb2YocGJvZHkpKTsKLQotCWlmICghVFRFU1QyKCpwLCBJRUVFODAyXzExX1JFQVNPTl9MRU4pKQotCQlyZXR1cm4gMDsKLQlwYm9keS5yZWFzb25fY29kZSA9IEVYVFJBQ1RfTEVfMTZCSVRTKHApOwotCW9mZnNldCArPSBJRUVFODAyXzExX1JFQVNPTl9MRU47Ci0KLQlyZWFzb24gPSAocGJvZHkucmVhc29uX2NvZGUgPCBOVU1fUkVBU09OUykKLQkJCT8gcmVhc29uX3RleHRbcGJvZHkucmVhc29uX2NvZGVdCi0JCQk6ICJSZXNlcnZlZCI7Ci0KLQlpZiAoZWZsYWcpIHsKLQkJcHJpbnRmKCI6ICVzIiwgcmVhc29uKTsKLQl9IGVsc2UgewotCQlwcmludGYoIiAoJXMpOiAlcyIsIGV0aGVyYWRkcl9zdHJpbmcocG1oLT5zYSksIHJlYXNvbik7Ci0JfQotCXJldHVybiAxOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFByaW50IEJvZHkgZnVuY3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RhdGljIGludAotbWdtdF9ib2R5X3ByaW50KHVfaW50MTZfdCBmYywgY29uc3Qgc3RydWN0IG1nbXRfaGVhZGVyX3QgKnBtaCwKLSAgICBjb25zdCB1X2NoYXIgKnApCi17Ci0Jc3dpdGNoIChGQ19TVUJUWVBFKGZjKSkgewotCWNhc2UgU1RfQVNTT0NfUkVRVUVTVDoKLQkJcHJpbnRmKCJBc3NvYyBSZXF1ZXN0Iik7Ci0JCXJldHVybiBoYW5kbGVfYXNzb2NfcmVxdWVzdChwKTsKLQljYXNlIFNUX0FTU09DX1JFU1BPTlNFOgotCQlwcmludGYoIkFzc29jIFJlc3BvbnNlIik7Ci0JCXJldHVybiBoYW5kbGVfYXNzb2NfcmVzcG9uc2UocCk7Ci0JY2FzZSBTVF9SRUFTU09DX1JFUVVFU1Q6Ci0JCXByaW50ZigiUmVBc3NvYyBSZXF1ZXN0Iik7Ci0JCXJldHVybiBoYW5kbGVfcmVhc3NvY19yZXF1ZXN0KHApOwotCWNhc2UgU1RfUkVBU1NPQ19SRVNQT05TRToKLQkJcHJpbnRmKCJSZUFzc29jIFJlc3BvbnNlIik7Ci0JCXJldHVybiBoYW5kbGVfcmVhc3NvY19yZXNwb25zZShwKTsKLQljYXNlIFNUX1BST0JFX1JFUVVFU1Q6Ci0JCXByaW50ZigiUHJvYmUgUmVxdWVzdCIpOwotCQlyZXR1cm4gaGFuZGxlX3Byb2JlX3JlcXVlc3QocCk7Ci0JY2FzZSBTVF9QUk9CRV9SRVNQT05TRToKLQkJcHJpbnRmKCJQcm9iZSBSZXNwb25zZSIpOwotCQlyZXR1cm4gaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKHApOwotCWNhc2UgU1RfQkVBQ09OOgotCQlwcmludGYoIkJlYWNvbiIpOwotCQlyZXR1cm4gaGFuZGxlX2JlYWNvbihwKTsKLQljYXNlIFNUX0FUSU06Ci0JCXByaW50ZigiQVRJTSIpOwotCQlyZXR1cm4gaGFuZGxlX2F0aW0oKTsKLQljYXNlIFNUX0RJU0FTU09DOgotCQlwcmludGYoIkRpc2Fzc29jaWF0aW9uIik7Ci0JCXJldHVybiBoYW5kbGVfZGlzYXNzb2MocCk7Ci0JY2FzZSBTVF9BVVRIOgotCQlwcmludGYoIkF1dGhlbnRpY2F0aW9uIik7Ci0JCWlmICghVFRFU1QyKCpwLCAzKSkKLQkJCXJldHVybiAwOwotCQlpZiAoKHBbMF0gPT0gMCApICYmIChwWzFdID09IDApICYmIChwWzJdID09IDApKSB7Ci0JCQlwcmludGYoIkF1dGhlbnRpY2F0aW9uIChTaGFyZWQtS2V5KS0zICIpOwotCQkJcmV0dXJuIHdlcF9wcmludChwKTsKLQkJfQotCQlyZXR1cm4gaGFuZGxlX2F1dGgocCk7Ci0JY2FzZSBTVF9ERUFVVEg6Ci0JCXByaW50ZigiRGVBdXRoZW50aWNhdGlvbiIpOwotCQlyZXR1cm4gaGFuZGxlX2RlYXV0aChwbWgsIHApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIlVuaGFuZGxlZCBNYW5hZ2VtZW50IHN1YnR5cGUoJXgpIiwKLQkJICAgIEZDX1NVQlRZUEUoZmMpKTsKLQkJcmV0dXJuIDE7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEhhbmRsZXMgcHJpbnRpbmcgYWxsIHRoZSBjb250cm9sIGZyYW1lIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1jdHJsX2JvZHlfcHJpbnQodV9pbnQxNl90IGZjLCBjb25zdCB1X2NoYXIgKnApCi17Ci0Jc3dpdGNoIChGQ19TVUJUWVBFKGZjKSkgewotCWNhc2UgQ1RSTF9QU19QT0xMOgotCQlwcmludGYoIlBvd2VyIFNhdmUtUG9sbCIpOwotCQlpZiAoIVRURVNUMigqcCwgQ1RSTF9QU19QT0xMX0hEUkxFTikpCi0JCQlyZXR1cm4gMDsKLQkJcHJpbnRmKCIgQUlEKCV4KSIsCi0JCSAgICBFWFRSQUNUX0xFXzE2QklUUygmKCgoY29uc3Qgc3RydWN0IGN0cmxfcHNfcG9sbF90ICopcCktPmFpZCkpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVFJMX1JUUzoKLQkJcHJpbnRmKCJSZXF1ZXN0LVRvLVNlbmQiKTsKLQkJaWYgKCFUVEVTVDIoKnAsIENUUkxfUlRTX0hEUkxFTikpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKCFlZmxhZykKLQkJCXByaW50ZigiIFRBOiVzICIsCi0JCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX3J0c190ICopcCktPnRhKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1RSTF9DVFM6Ci0JCXByaW50ZigiQ2xlYXItVG8tU2VuZCIpOwotCQlpZiAoIVRURVNUMigqcCwgQ1RSTF9DVFNfSERSTEVOKSkKLQkJCXJldHVybiAwOwotCQlpZiAoIWVmbGFnKQotCQkJcHJpbnRmKCIgUkE6JXMgIiwKLQkJCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfY3RzX3QgKilwKS0+cmEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVFJMX0FDSzoKLQkJcHJpbnRmKCJBY2tub3dsZWRnbWVudCIpOwotCQlpZiAoIVRURVNUMigqcCwgQ1RSTF9BQ0tfSERSTEVOKSkKLQkJCXJldHVybiAwOwotCQlpZiAoIWVmbGFnKQotCQkJcHJpbnRmKCIgUkE6JXMgIiwKLQkJCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfYWNrX3QgKilwKS0+cmEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVFJMX0NGX0VORDoKLQkJcHJpbnRmKCJDRi1FbmQiKTsKLQkJaWYgKCFUVEVTVDIoKnAsIENUUkxfRU5EX0hEUkxFTikpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKCFlZmxhZykKLQkJCXByaW50ZigiIFJBOiVzICIsCi0JCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2VuZF90ICopcCktPnJhKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1RSTF9FTkRfQUNLOgotCQlwcmludGYoIkNGLUVuZCtDRi1BY2siKTsKLQkJaWYgKCFUVEVTVDIoKnAsIENUUkxfRU5EX0FDS19IRFJMRU4pKQotCQkJcmV0dXJuIDA7Ci0JCWlmICghZWZsYWcpCi0JCQlwcmludGYoIiBSQTolcyAiLAotCQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9lbmRfYWNrX3QgKilwKS0+cmEpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRmKCJVbmtub3duIEN0cmwgU3VidHlwZSIpOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyoKLSAqIFByaW50IEhlYWRlciBmdW5jcwotICovCi0KLS8qCi0gKiAgRGF0YSBGcmFtZSAtIEFkZHJlc3MgZmllbGQgY29udGVudHMKLSAqCi0gKiAgVG8gRHMgIHwgRnJvbSBEUyB8IEFkZHIgMSB8IEFkZHIgMiB8IEFkZHIgMyB8IEFkZHIgNAotICogICAgMCAgICB8ICAwICAgICAgfCAgREEgICAgfCBTQSAgICAgfCBCU1NJRCAgfCBuL2EKLSAqICAgIDAgICAgfCAgMSAgICAgIHwgIERBICAgIHwgQlNTSUQgIHwgU0EgICAgIHwgbi9hCi0gKiAgICAxICAgIHwgIDAgICAgICB8ICBCU1NJRCB8IFNBICAgICB8IERBICAgICB8IG4vYQotICogICAgMSAgICB8ICAxICAgICAgfCAgUkEgICAgfCBUQSAgICAgfCBEQSAgICAgfCBTQQotICovCi0KLXN0YXRpYyB2b2lkCi1kYXRhX2hlYWRlcl9wcmludCh1X2ludDE2X3QgZmMsIGNvbnN0IHVfY2hhciAqcCwgY29uc3QgdV9pbnQ4X3QgKipzcmNwLAotICAgIGNvbnN0IHVfaW50OF90ICoqZHN0cCkKLXsKLQl1X2ludCBzdWJ0eXBlID0gRkNfU1VCVFlQRShmYyk7Ci0KLQlpZiAoREFUQV9GUkFNRV9JU19DRl9BQ0soc3VidHlwZSkgfHwgREFUQV9GUkFNRV9JU19DRl9QT0xMKHN1YnR5cGUpIHx8Ci0JICAgIERBVEFfRlJBTUVfSVNfUU9TKHN1YnR5cGUpKSB7Ci0JCXByaW50ZigiQ0YgIik7Ci0JCWlmIChEQVRBX0ZSQU1FX0lTX0NGX0FDSyhzdWJ0eXBlKSkgewotCQkJaWYgKERBVEFfRlJBTUVfSVNfQ0ZfUE9MTChzdWJ0eXBlKSkKLQkJCQlwcmludGYoIkFjay9Qb2xsIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCJBY2siKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChEQVRBX0ZSQU1FX0lTX0NGX1BPTEwoc3VidHlwZSkpCi0JCQkJcHJpbnRmKCJQb2xsIik7Ci0JCX0KLQkJaWYgKERBVEFfRlJBTUVfSVNfUU9TKHN1YnR5cGUpKQotCQkJcHJpbnRmKCIrUW9TIik7Ci0JCXByaW50ZigiICIpOwotCX0KLQotI2RlZmluZSBBRERSMSAgKHAgKyA0KQotI2RlZmluZSBBRERSMiAgKHAgKyAxMCkKLSNkZWZpbmUgQUREUjMgIChwICsgMTYpCi0jZGVmaW5lIEFERFI0ICAocCArIDI0KQotCi0JaWYgKCFGQ19UT19EUyhmYykgJiYgIUZDX0ZST01fRFMoZmMpKSB7Ci0JCWlmIChzcmNwICE9IE5VTEwpCi0JCQkqc3JjcCA9IEFERFIyOwotCQlpZiAoZHN0cCAhPSBOVUxMKQotCQkJKmRzdHAgPSBBRERSMTsKLQkJaWYgKCFlZmxhZykKLQkJCXJldHVybjsKLQkJcHJpbnRmKCJEQTolcyBTQTolcyBCU1NJRDolcyAiLAotCQkgICAgZXRoZXJhZGRyX3N0cmluZyhBRERSMSksIGV0aGVyYWRkcl9zdHJpbmcoQUREUjIpLAotCQkgICAgZXRoZXJhZGRyX3N0cmluZyhBRERSMykpOwotCX0gZWxzZSBpZiAoIUZDX1RPX0RTKGZjKSAmJiBGQ19GUk9NX0RTKGZjKSkgewotCQlpZiAoc3JjcCAhPSBOVUxMKQotCQkJKnNyY3AgPSBBRERSMzsKLQkJaWYgKGRzdHAgIT0gTlVMTCkKLQkJCSpkc3RwID0gQUREUjE7Ci0JCWlmICghZWZsYWcpCi0JCQlyZXR1cm47Ci0JCXByaW50ZigiREE6JXMgQlNTSUQ6JXMgU0E6JXMgIiwKLQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoQUREUjEpLCBldGhlcmFkZHJfc3RyaW5nKEFERFIyKSwKLQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoQUREUjMpKTsKLQl9IGVsc2UgaWYgKEZDX1RPX0RTKGZjKSAmJiAhRkNfRlJPTV9EUyhmYykpIHsKLQkJaWYgKHNyY3AgIT0gTlVMTCkKLQkJCSpzcmNwID0gQUREUjI7Ci0JCWlmIChkc3RwICE9IE5VTEwpCi0JCQkqZHN0cCA9IEFERFIzOwotCQlpZiAoIWVmbGFnKQotCQkJcmV0dXJuOwotCQlwcmludGYoIkJTU0lEOiVzIFNBOiVzIERBOiVzICIsCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKEFERFIxKSwgZXRoZXJhZGRyX3N0cmluZyhBRERSMiksCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKEFERFIzKSk7Ci0JfSBlbHNlIGlmIChGQ19UT19EUyhmYykgJiYgRkNfRlJPTV9EUyhmYykpIHsKLQkJaWYgKHNyY3AgIT0gTlVMTCkKLQkJCSpzcmNwID0gQUREUjQ7Ci0JCWlmIChkc3RwICE9IE5VTEwpCi0JCQkqZHN0cCA9IEFERFIzOwotCQlpZiAoIWVmbGFnKQotCQkJcmV0dXJuOwotCQlwcmludGYoIlJBOiVzIFRBOiVzIERBOiVzIFNBOiVzICIsCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKEFERFIxKSwgZXRoZXJhZGRyX3N0cmluZyhBRERSMiksCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKEFERFIzKSwgZXRoZXJhZGRyX3N0cmluZyhBRERSNCkpOwotCX0KLQotI3VuZGVmIEFERFIxCi0jdW5kZWYgQUREUjIKLSN1bmRlZiBBRERSMwotI3VuZGVmIEFERFI0Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZ210X2hlYWRlcl9wcmludChjb25zdCB1X2NoYXIgKnAsIGNvbnN0IHVfaW50OF90ICoqc3JjcCwKLSAgICBjb25zdCB1X2ludDhfdCAqKmRzdHApCi17Ci0JY29uc3Qgc3RydWN0IG1nbXRfaGVhZGVyX3QgKmhwID0gKGNvbnN0IHN0cnVjdCBtZ210X2hlYWRlcl90ICopIHA7Ci0KLQlpZiAoc3JjcCAhPSBOVUxMKQotCQkqc3JjcCA9IGhwLT5zYTsKLQlpZiAoZHN0cCAhPSBOVUxMKQotCQkqZHN0cCA9IGhwLT5kYTsKLQlpZiAoIWVmbGFnKQotCQlyZXR1cm47Ci0KLQlwcmludGYoIkJTU0lEOiVzIERBOiVzIFNBOiVzICIsCi0JICAgIGV0aGVyYWRkcl9zdHJpbmcoKGhwKS0+YnNzaWQpLCBldGhlcmFkZHJfc3RyaW5nKChocCktPmRhKSwKLQkgICAgZXRoZXJhZGRyX3N0cmluZygoaHApLT5zYSkpOwotfQotCi1zdGF0aWMgdm9pZAotY3RybF9oZWFkZXJfcHJpbnQodV9pbnQxNl90IGZjLCBjb25zdCB1X2NoYXIgKnAsIGNvbnN0IHVfaW50OF90ICoqc3JjcCwKLSAgICBjb25zdCB1X2ludDhfdCAqKmRzdHApCi17Ci0JaWYgKHNyY3AgIT0gTlVMTCkKLQkJKnNyY3AgPSBOVUxMOwotCWlmIChkc3RwICE9IE5VTEwpCi0JCSpkc3RwID0gTlVMTDsKLQlpZiAoIWVmbGFnKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKEZDX1NVQlRZUEUoZmMpKSB7Ci0JY2FzZSBDVFJMX1BTX1BPTEw6Ci0JCXByaW50ZigiQlNTSUQ6JXMgVEE6JXMgIiwKLQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9wc19wb2xsX3QgKilwKS0+YnNzaWQpLAotCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX3BzX3BvbGxfdCAqKXApLT50YSkpOwotCQlicmVhazsKLQljYXNlIENUUkxfUlRTOgotCQlwcmludGYoIlJBOiVzIFRBOiVzICIsCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfcnRzX3QgKilwKS0+cmEpLAotCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX3J0c190ICopcCktPnRhKSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1RSTF9DVFM6Ci0JCXByaW50ZigiUkE6JXMgIiwKLQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9jdHNfdCAqKXApLT5yYSkpOwotCQlicmVhazsKLQljYXNlIENUUkxfQUNLOgotCQlwcmludGYoIlJBOiVzICIsCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfYWNrX3QgKilwKS0+cmEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVFJMX0NGX0VORDoKLQkJcHJpbnRmKCJSQTolcyBCU1NJRDolcyAiLAotCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2VuZF90ICopcCktPnJhKSwKLQkJICAgIGV0aGVyYWRkcl9zdHJpbmcoKChjb25zdCBzdHJ1Y3QgY3RybF9lbmRfdCAqKXApLT5ic3NpZCkpOwotCQlicmVhazsKLQljYXNlIENUUkxfRU5EX0FDSzoKLQkJcHJpbnRmKCJSQTolcyBCU1NJRDolcyAiLAotCQkgICAgZXRoZXJhZGRyX3N0cmluZygoKGNvbnN0IHN0cnVjdCBjdHJsX2VuZF9hY2tfdCAqKXApLT5yYSksCi0JCSAgICBldGhlcmFkZHJfc3RyaW5nKCgoY29uc3Qgc3RydWN0IGN0cmxfZW5kX2Fja190ICopcCktPmJzc2lkKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiKEgpIFVua25vd24gQ3RybCBTdWJ0eXBlIik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludAotZXh0cmFjdF9oZWFkZXJfbGVuZ3RoKHVfaW50MTZfdCBmYykKLXsKLQlpbnQgbGVuOwotCi0Jc3dpdGNoIChGQ19UWVBFKGZjKSkgewotCWNhc2UgVF9NR01UOgotCQlyZXR1cm4gTUdNVF9IRFJMRU47Ci0JY2FzZSBUX0NUUkw6Ci0JCXN3aXRjaCAoRkNfU1VCVFlQRShmYykpIHsKLQkJY2FzZSBDVFJMX1BTX1BPTEw6Ci0JCQlyZXR1cm4gQ1RSTF9QU19QT0xMX0hEUkxFTjsKLQkJY2FzZSBDVFJMX1JUUzoKLQkJCXJldHVybiBDVFJMX1JUU19IRFJMRU47Ci0JCWNhc2UgQ1RSTF9DVFM6Ci0JCQlyZXR1cm4gQ1RSTF9DVFNfSERSTEVOOwotCQljYXNlIENUUkxfQUNLOgotCQkJcmV0dXJuIENUUkxfQUNLX0hEUkxFTjsKLQkJY2FzZSBDVFJMX0NGX0VORDoKLQkJCXJldHVybiBDVFJMX0VORF9IRFJMRU47Ci0JCWNhc2UgQ1RSTF9FTkRfQUNLOgotCQkJcmV0dXJuIENUUkxfRU5EX0FDS19IRFJMRU47Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQkJfQotCWNhc2UgVF9EQVRBOgotCQlsZW4gPSAoRkNfVE9fRFMoZmMpICYmIEZDX0ZST01fRFMoZmMpKSA/IDMwIDogMjQ7Ci0JCWlmIChEQVRBX0ZSQU1FX0lTX1FPUyhGQ19TVUJUWVBFKGZjKSkpCi0JCQlsZW4gKz0gMjsKLQkJcmV0dXJuIGxlbjsKLQlkZWZhdWx0OgotCQlwcmludGYoInVua25vd24gSUVFRTgwMi4xMSBmcmFtZSB0eXBlICglZCkiLCBGQ19UWVBFKGZjKSk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotLyoKLSAqIFByaW50IHRoZSA4MDIuMTEgTUFDIGhlYWRlciBpZiBlZmxhZyBpcyBzZXQsIGFuZCBzZXQgIipzcmNwIiBhbmQgIipkc3RwIgotICogdG8gcG9pbnQgdG8gdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gTUFDIGFkZHJlc3NlcyBpbiBhbnkgY2FzZSBpZgotICogInNyY3AiIGFuZCAiZHN0cCIgYXJlbid0IG51bGwuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaWVlZV84MDJfMTFfaGRyX3ByaW50KHVfaW50MTZfdCBmYywgY29uc3QgdV9jaGFyICpwLCBjb25zdCB1X2ludDhfdCAqKnNyY3AsCi0gICAgY29uc3QgdV9pbnQ4X3QgKipkc3RwKQotewotCWlmICh2ZmxhZykgewotCQlpZiAoRkNfTU9SRV9EQVRBKGZjKSkKLQkJCXByaW50ZigiTW9yZSBEYXRhICIpOwotCQlpZiAoRkNfTU9SRV9GTEFHKGZjKSkKLQkJCXByaW50ZigiTW9yZSBGcmFnbWVudHMgIik7Ci0JCWlmIChGQ19QT1dFUl9NR01UKGZjKSkKLQkJCXByaW50ZigiUHdyIE1nbXQgIik7Ci0JCWlmIChGQ19SRVRSWShmYykpCi0JCQlwcmludGYoIlJldHJ5ICIpOwotCQlpZiAoRkNfT1JERVIoZmMpKQotCQkJcHJpbnRmKCJTdHJpY3RseSBPcmRlcmVkICIpOwotCQlpZiAoRkNfV0VQKGZjKSkKLQkJCXByaW50ZigiV0VQIEVuY3J5cHRlZCAiKTsKLQkJaWYgKEZDX1RZUEUoZmMpICE9IFRfQ1RSTCB8fCBGQ19TVUJUWVBFKGZjKSAhPSBDVFJMX1BTX1BPTEwpCi0JCQlwcmludGYoIiVkdXMgIiwKLQkJCSAgICBFWFRSQUNUX0xFXzE2QklUUygKLQkJCSAgICAgICAgJigoY29uc3Qgc3RydWN0IG1nbXRfaGVhZGVyX3QgKilwKS0+ZHVyYXRpb24pKTsKLQl9Ci0KLQlzd2l0Y2ggKEZDX1RZUEUoZmMpKSB7Ci0JY2FzZSBUX01HTVQ6Ci0JCW1nbXRfaGVhZGVyX3ByaW50KHAsIHNyY3AsIGRzdHApOwotCQlicmVhazsKLQljYXNlIFRfQ1RSTDoKLQkJY3RybF9oZWFkZXJfcHJpbnQoZmMsIHAsIHNyY3AsIGRzdHApOwotCQlicmVhazsKLQljYXNlIFRfREFUQToKLQkJZGF0YV9oZWFkZXJfcHJpbnQoZmMsIHAsIHNyY3AsIGRzdHApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIihoZWFkZXIpIHVua25vd24gSUVFRTgwMi4xMSBmcmFtZSB0eXBlICglZCkiLAotCQkgICAgRkNfVFlQRShmYykpOwotCQkqc3JjcCA9IE5VTEw7Ci0JCSpkc3RwID0gTlVMTDsKLQkJYnJlYWs7Ci0JfQotfQotCi0jaWZuZGVmIHJvdW5kdXAyCi0jZGVmaW5lCXJvdW5kdXAyKHgsIHkpCSgoKHgpKygoeSktMSkpJih+KCh5KS0xKSkpIC8qIGlmIHkgaXMgcG93ZXJzIG9mIHR3byAqLwotI2VuZGlmCi0KLXN0YXRpYyB1X2ludAotaWVlZTgwMl8xMV9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuLCBpbnQgcGFkKQotewotCXVfaW50MTZfdCBmYzsKLQl1X2ludCBoZHJsZW47Ci0JY29uc3QgdV9pbnQ4X3QgKnNyYywgKmRzdDsKLQl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcnR5cGU7Ci0KLQlpZiAoY2FwbGVuIDwgSUVFRTgwMl8xMV9GQ19MRU4pIHsKLQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJcmV0dXJuIGNhcGxlbjsKLQl9Ci0KLQlmYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHApOwotCWhkcmxlbiA9IGV4dHJhY3RfaGVhZGVyX2xlbmd0aChmYyk7Ci0JaWYgKHBhZCkKLQkJaGRybGVuID0gcm91bmR1cDIoaGRybGVuLCA0KTsKLQotCWlmIChjYXBsZW4gPCBoZHJsZW4pIHsKLQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJcmV0dXJuIGhkcmxlbjsKLQl9Ci0KLQlpZWVlXzgwMl8xMV9oZHJfcHJpbnQoZmMsIHAsICZzcmMsICZkc3QpOwotCi0JLyoKLQkgKiBHbyBwYXN0IHRoZSA4MDIuMTEgaGVhZGVyLgotCSAqLwotCWxlbmd0aCAtPSBoZHJsZW47Ci0JY2FwbGVuIC09IGhkcmxlbjsKLQlwICs9IGhkcmxlbjsKLQotCXN3aXRjaCAoRkNfVFlQRShmYykpIHsKLQljYXNlIFRfTUdNVDoKLQkJaWYgKCFtZ210X2JvZHlfcHJpbnQoZmMsCi0JCSAgICAoY29uc3Qgc3RydWN0IG1nbXRfaGVhZGVyX3QgKikocCAtIGhkcmxlbiksIHApKSB7Ci0JCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQkJcmV0dXJuIGhkcmxlbjsKLQkJfQotCQlicmVhazsKLQljYXNlIFRfQ1RSTDoKLQkJaWYgKCFjdHJsX2JvZHlfcHJpbnQoZmMsIHAgLSBoZHJsZW4pKSB7Ci0JCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQkJcmV0dXJuIGhkcmxlbjsKLQkJfQotCQlicmVhazsKLQljYXNlIFRfREFUQToKLQkJaWYgKERBVEFfRlJBTUVfSVNfTlVMTChGQ19TVUJUWVBFKGZjKSkpCi0JCQlyZXR1cm4gaGRybGVuOwkvKiBuby1kYXRhIGZyYW1lICovCi0JCS8qIFRoZXJlIG1heSBiZSBhIHByb2JsZW0gdy8gQVAgbm90IGhhdmluZyB0aGlzIGJpdCBzZXQgKi8KLQkJaWYgKEZDX1dFUChmYykpIHsKLQkJCWlmICghd2VwX3ByaW50KHApKSB7Ci0JCQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJCQlyZXR1cm4gaGRybGVuOwotCQkJfQotCQl9IGVsc2UgaWYgKGxsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbiwgZHN0LCBzcmMsCi0JCSAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkgPT0gMCkgewotCQkJLyoKLQkJCSAqIFNvbWUga2luZHMgb2YgTExDIHBhY2tldCB3ZSBjYW5ub3QKLQkJCSAqIGhhbmRsZSBpbnRlbGxpZ2VudGx5Ci0JCQkgKi8KLQkJCWlmICghZWZsYWcpCi0JCQkJaWVlZV84MDJfMTFfaGRyX3ByaW50KGZjLCBwIC0gaGRybGVuLCBOVUxMLAotCQkJCSAgICBOVUxMKTsKLQkJCWlmIChleHRyYWN0ZWRfZXRoZXJ0eXBlKQotCQkJCXByaW50ZigiKExMQyAlcykgIiwKLQkJCQkgICAgZXRoZXJwcm90b19zdHJpbmcoCi0JCQkJICAgICAgICBodG9ucyhleHRyYWN0ZWRfZXRoZXJ0eXBlKSkpOwotCQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoInVua25vd24gODAyLjExIGZyYW1lIHR5cGUgKCVkKSIsIEZDX1RZUEUoZmMpKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGhkcmxlbjsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cwotICogdG8gdGhlIDgwMi4xMSBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotaWVlZTgwMl8xMV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlyZXR1cm4gaWVlZTgwMl8xMV9wcmludChwLCBoLT5sZW4sIGgtPmNhcGxlbiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X3JhZGlvdGFwX2ZpZWxkKHN0cnVjdCBjcGFja19zdGF0ZSAqcywgdV9pbnQzMl90IGJpdCwgaW50ICpwYWQpCi17Ci0JdW5pb24gewotCQlpbnQ4X3QJCWk4OwotCQl1X2ludDhfdAl1ODsKLQkJaW50MTZfdAkJaTE2OwotCQl1X2ludDE2X3QJdTE2OwotCQl1X2ludDMyX3QJdTMyOwotCQl1X2ludDY0X3QJdTY0OwotCX0gdSwgdTI7Ci0JaW50IHJjOwotCi0Jc3dpdGNoIChiaXQpIHsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9GTEFHUzoKLQkJcmMgPSBjcGFja191aW50OChzLCAmdS51OCk7Ci0JCWlmICh1LnU4ICYgSUVFRTgwMjExX1JBRElPVEFQX0ZfREFUQVBBRCkKLQkJCSpwYWQgPSAxOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9SQVRFOgotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0RCX0FOVFNJR05BTDoKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRToKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BOgotCQlyYyA9IGNwYWNrX3VpbnQ4KHMsICZ1LnU4KTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJNX0FOVFNJR05BTDoKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0U6Ci0JCXJjID0gY3BhY2tfaW50OChzLCAmdS5pOCk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0NIQU5ORUw6Ci0JCXJjID0gY3BhY2tfdWludDE2KHMsICZ1LnUxNik7Ci0JCWlmIChyYyAhPSAwKQotCQkJYnJlYWs7Ci0JCXJjID0gY3BhY2tfdWludDE2KHMsICZ1Mi51MTYpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9GSFNTOgotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0xPQ0tfUVVBTElUWToKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTjoKLQkJcmMgPSBjcGFja191aW50MTYocywgJnUudTE2KTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJfVFhfQVRURU5VQVRJT046Ci0JCXJjID0gY3BhY2tfdWludDgocywgJnUudTgpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fVFhfUE9XRVI6Ci0JCXJjID0gY3BhY2tfaW50OChzLCAmdS5pOCk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQ6Ci0JCXJjID0gY3BhY2tfdWludDY0KHMsICZ1LnU2NCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIHRoaXMgYml0IGluZGljYXRlcyBhIGZpZWxkIHdob3NlCi0JCSAqIHNpemUgd2UgZG8gbm90IGtub3csIHNvIHdlIGNhbm5vdAotCQkgKiBwcm9jZWVkLgotCQkgKi8KLQkJcHJpbnRmKCJbMHglMDh4XSAiLCBiaXQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKHJjICE9IDApIHsKLQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCXN3aXRjaCAoYml0KSB7Ci0JY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfQ0hBTk5FTDoKLQkJcHJpbnRmKCIldSBNSHogIiwgdS51MTYpOwotCQlpZiAodTIudTE2ICE9IDApCi0JCQlwcmludGYoIigweCUwNHgpICIsIHUyLnUxNik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0ZIU1M6Ci0JCXByaW50ZigiZmhzZXQgJWQgZmhwYXQgJWQgIiwgdS51MTYgJiAweGZmLCAodS51MTYgPj4gOCkgJiAweGZmKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfUkFURToKLQkJUFJJTlRfUkFURSgiIiwgdS51OCwgIiBNYi9zICIpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UU0lHTkFMOgotCQlwcmludGYoIiVkZEIgc2lnbmFsICIsIHUuaTgpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQk1fQU5UTk9JU0U6Ci0JCXByaW50ZigiJWRkQiBub2lzZSAiLCB1Lmk4KTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfREJfQU5UU0lHTkFMOgotCQlwcmludGYoIiVkZEIgc2lnbmFsICIsIHUudTgpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9EQl9BTlROT0lTRToKLQkJcHJpbnRmKCIlZGRCIG5vaXNlICIsIHUudTgpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9MT0NLX1FVQUxJVFk6Ci0JCXByaW50ZigiJXUgc3EgIiwgdS51MTYpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9UWF9BVFRFTlVBVElPTjoKLQkJcHJpbnRmKCIlZCB0eCBwb3dlciAiLCAtKGludCl1LnUxNik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0RCX1RYX0FUVEVOVUFUSU9OOgotCQlwcmludGYoIiVkZEIgdHggcG93ZXIgIiwgLShpbnQpdS51OCk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX0RCTV9UWF9QT1dFUjoKLQkJcHJpbnRmKCIlZGRCbSB0eCBwb3dlciAiLCB1Lmk4KTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfUkFESU9UQVBfRkxBR1M6Ci0JCWlmICh1LnU4ICYgSUVFRTgwMjExX1JBRElPVEFQX0ZfQ0ZQKQotCQkJcHJpbnRmKCJjZnAgIik7Ci0JCWlmICh1LnU4ICYgSUVFRTgwMjExX1JBRElPVEFQX0ZfU0hPUlRQUkUpCi0JCQlwcmludGYoInNob3J0IHByZWFtYmxlICIpOwotCQlpZiAodS51OCAmIElFRUU4MDIxMV9SQURJT1RBUF9GX1dFUCkKLQkJCXByaW50Zigid2VwICIpOwotCQlpZiAodS51OCAmIElFRUU4MDIxMV9SQURJT1RBUF9GX0ZSQUcpCi0JCQlwcmludGYoImZyYWdtZW50ZWQgIik7Ci0JCWlmICh1LnU4ICYgSUVFRTgwMjExX1JBRElPVEFQX0ZfQkFERkNTKQotCQkJcHJpbnRmKCJiYWQtZmNzICIpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9SQURJT1RBUF9BTlRFTk5BOgotCQlwcmludGYoImFudGVubmEgJWQgIiwgdS51OCk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1JBRElPVEFQX1RTRlQ6Ci0JCXByaW50ZigiJSIgUFJJdTY0ICJ1cyB0c2Z0ICIsIHUudTY0KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdV9pbnQKLWllZWU4MDJfMTFfcmFkaW9fcHJpbnQoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbikKLXsKLSNkZWZpbmUJQklUTk9fMzIoeCkgKCgoeCkgPj4gMTYpID8gMTYgKyBCSVROT18xNigoeCkgPj4gMTYpIDogQklUTk9fMTYoKHgpKSkKLSNkZWZpbmUJQklUTk9fMTYoeCkgKCgoeCkgPj4gOCkgPyA4ICsgQklUTk9fOCgoeCkgPj4gOCkgOiBCSVROT184KCh4KSkpCi0jZGVmaW5lCUJJVE5PXzgoeCkgKCgoeCkgPj4gNCkgPyA0ICsgQklUTk9fNCgoeCkgPj4gNCkgOiBCSVROT180KCh4KSkpCi0jZGVmaW5lCUJJVE5PXzQoeCkgKCgoeCkgPj4gMikgPyAyICsgQklUTk9fMigoeCkgPj4gMikgOiBCSVROT18yKCh4KSkpCi0jZGVmaW5lCUJJVE5PXzIoeCkgKCgoeCkgJiAyKSA/IDEgOiAwKQotI2RlZmluZQlCSVQobikJKDEgPDwgbikKLSNkZWZpbmUJSVNfRVhURU5ERUQoX19wKQlcCi0JICAgIChFWFRSQUNUX0xFXzMyQklUUyhfX3ApICYgQklUKElFRUU4MDIxMV9SQURJT1RBUF9FWFQpKSAhPSAwCi0KLQlzdHJ1Y3QgY3BhY2tfc3RhdGUgY3BhY2tlcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqaGRyOwotCXVfaW50MzJfdCBwcmVzZW50LCBuZXh0X3ByZXNlbnQ7Ci0JdV9pbnQzMl90ICpwcmVzZW50cCwgKmxhc3RfcHJlc2VudHA7Ci0JZW51bSBpZWVlODAyMTFfcmFkaW90YXBfdHlwZSBiaXQ7Ci0JaW50IGJpdDA7Ci0JY29uc3QgdV9jaGFyICppdGVyOwotCXVfaW50IGxlbjsKLQlpbnQgcGFkOwotCi0JaWYgKGNhcGxlbiA8IHNpemVvZigqaGRyKSkgewotCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQlyZXR1cm4gY2FwbGVuOwotCX0KLQotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqKXA7Ci0KLQlsZW4gPSBFWFRSQUNUX0xFXzE2QklUUygmaGRyLT5pdF9sZW4pOwotCi0JaWYgKGNhcGxlbiA8IGxlbikgewotCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQlyZXR1cm4gY2FwbGVuOwotCX0KLQlmb3IgKGxhc3RfcHJlc2VudHAgPSAmaGRyLT5pdF9wcmVzZW50OwotCSAgICAgSVNfRVhURU5ERUQobGFzdF9wcmVzZW50cCkgJiYKLQkgICAgICh1X2NoYXIqKShsYXN0X3ByZXNlbnRwICsgMSkgPD0gcCArIGxlbjsKLQkgICAgIGxhc3RfcHJlc2VudHArKyk7Ci0KLQkvKiBhcmUgdGhlcmUgbW9yZSBiaXRtYXAgZXh0ZW5zaW9ucyB0aGFuIGJ5dGVzIGluIGhlYWRlcj8gKi8KLQlpZiAoSVNfRVhURU5ERUQobGFzdF9wcmVzZW50cCkpIHsKLQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJcmV0dXJuIGNhcGxlbjsKLQl9Ci0KLQlpdGVyID0gKHVfY2hhciopKGxhc3RfcHJlc2VudHAgKyAxKTsKLQotCWlmIChjcGFja19pbml0KCZjcGFja2VyLCAodV9pbnQ4X3QqKWl0ZXIsIGxlbiAtIChpdGVyIC0gcCkpICE9IDApIHsKLQkJLyogWFhYICovCi0JCXByaW50ZigiW3w4MDIuMTFdIik7Ci0JCXJldHVybiBjYXBsZW47Ci0JfQotCi0JLyogQXNzdW1lIG5vIEF0aGVyb3MgcGFkZGluZyBiZXR3ZWVuIDgwMi4xMSBoZWFkZXIgYW5kIGJvZHkgKi8KLQlwYWQgPSAwOwotCWZvciAoYml0MCA9IDAsIHByZXNlbnRwID0gJmhkci0+aXRfcHJlc2VudDsgcHJlc2VudHAgPD0gbGFzdF9wcmVzZW50cDsKLQkgICAgIHByZXNlbnRwKyssIGJpdDAgKz0gMzIpIHsKLQkJZm9yIChwcmVzZW50ID0gRVhUUkFDVF9MRV8zMkJJVFMocHJlc2VudHApOyBwcmVzZW50OwotCQkgICAgIHByZXNlbnQgPSBuZXh0X3ByZXNlbnQpIHsKLQkJCS8qIGNsZWFyIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgKi8KLQkJCW5leHRfcHJlc2VudCA9IHByZXNlbnQgJiAocHJlc2VudCAtIDEpOwotCi0JCQkvKiBleHRyYWN0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdGhhdCBpcyBzZXQgKi8KLQkJCWJpdCA9IChlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlKQotCQkJICAgIChiaXQwICsgQklUTk9fMzIocHJlc2VudCBeIG5leHRfcHJlc2VudCkpOwotCi0JCQlpZiAocHJpbnRfcmFkaW90YXBfZmllbGQoJmNwYWNrZXIsIGJpdCwgJnBhZCkgIT0gMCkKLQkJCQlnb3RvIG91dDsKLQkJfQotCX0KLW91dDoKLQlyZXR1cm4gbGVuICsgaWVlZTgwMl8xMV9wcmludChwICsgbGVuLCBsZW5ndGggLSBsZW4sIGNhcGxlbiAtIGxlbiwgcGFkKTsKLSN1bmRlZiBCSVROT18zMgotI3VuZGVmIEJJVE5PXzE2Ci0jdW5kZWYgQklUTk9fOAotI3VuZGVmIEJJVE5PXzQKLSN1bmRlZiBCSVROT18yCi0jdW5kZWYgQklUCi19Ci0KLXN0YXRpYyB1X2ludAotaWVlZTgwMl8xMV9hdnNfcmFkaW9fcHJpbnQoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbikKLXsKLQl1X2ludDMyX3QgY2FwaGRyX2xlbjsKLQotCWNhcGhkcl9sZW4gPSBFWFRSQUNUXzMyQklUUyhwICsgNCk7Ci0JaWYgKGNhcGhkcl9sZW4gPCA4KSB7Ci0JCS8qCi0JCSAqIFlvdyEgIFRoZSBjYXB0dXJlIGhlYWRlciBsZW5ndGggaXMgY2xhaW1lZCBub3QKLQkJICogdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGluY2x1ZGUgZXZlbiB0aGUgdmVyc2lvbgotCQkgKiBjb29raWUgb3IgY2FwdHVyZSBoZWFkZXIgbGVuZ3RoIQotCQkgKi8KLQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJcmV0dXJuIGNhcGxlbjsKLQl9Ci0KLQlpZiAoY2FwbGVuIDwgY2FwaGRyX2xlbikgewotCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQlyZXR1cm4gY2FwbGVuOwotCX0KLQotCXJldHVybiBjYXBoZHJfbGVuICsgaWVlZTgwMl8xMV9wcmludChwICsgY2FwaGRyX2xlbiwKLQkgICAgbGVuZ3RoIC0gY2FwaGRyX2xlbiwgY2FwbGVuIC0gY2FwaGRyX2xlbiwgMCk7Ci19Ci0KLSNkZWZpbmUgUFJJU01fSERSX0xFTgkJMTQ0Ci0KLSNkZWZpbmUgV0xBTkNBUF9NQUdJQ19DT09LSUVfVjEJMHg4MDIxMTAwMQotCi0vKgotICogRm9yIERMVF9QUklTTV9IRUFERVI7IGxpa2UgRExUX0lFRUU4MDJfMTEsIGJ1dCB3aXRoIGFuIGV4dHJhIGhlYWRlciwKLSAqIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gc3VjaCBhcyByYWRpbyBpbmZvcm1hdGlvbiwgd2hpY2ggd2UKLSAqIGN1cnJlbnRseSBpZ25vcmUuCi0gKgotICogSWYsIGhvd2V2ZXIsIHRoZSBwYWNrZXQgYmVnaW5zIHdpdGggV0xBTkNBUF9NQUdJQ19DT09LSUVfVjEsIGl0J3MKLSAqIHJlYWxseSBETFRfSUVFRTgwMl8xMV9SQURJTyAoY3VycmVudGx5LCBvbiBMaW51eCwgdGhlcmUncyBubwotICogQVJQSFJEXyB0eXBlIGZvciBETFRfSUVFRTgwMl8xMV9SQURJTywgYXMgdGhlcmUgaXMgYQotICogQVJQSFJEX0lFRUU4MDIxMV9QUklTTSBmb3IgRExUX1BSSVNNX0hFQURFUiwgc28KLSAqIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gaXMgdXNlZCBmb3IgRExUX0lFRUU4MDJfMTFfUkFESU8sIGFuZAotICogdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGhlYWRlciBhcmUgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBpdCBpcykuCi0gKi8KLXVfaW50Ci1wcmlzbV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCi0JaWYgKGNhcGxlbiA8IDQpIHsKLQkJcHJpbnRmKCJbfDgwMi4xMV0iKTsKLQkJcmV0dXJuIGNhcGxlbjsKLQl9Ci0KLQlpZiAoRVhUUkFDVF8zMkJJVFMocCkgPT0gV0xBTkNBUF9NQUdJQ19DT09LSUVfVjEpCi0JCXJldHVybiBpZWVlODAyXzExX2F2c19yYWRpb19wcmludChwLCBsZW5ndGgsIGNhcGxlbik7Ci0KLQlpZiAoY2FwbGVuIDwgUFJJU01fSERSX0xFTikgewotCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQlyZXR1cm4gY2FwbGVuOwotCX0KLQotCXJldHVybiBQUklTTV9IRFJfTEVOICsgaWVlZTgwMl8xMV9wcmludChwICsgUFJJU01fSERSX0xFTiwKLQkgICAgbGVuZ3RoIC0gUFJJU01fSERSX0xFTiwgY2FwbGVuIC0gUFJJU01fSERSX0xFTiwgMCk7Ci19Ci0KLS8qCi0gKiBGb3IgRExUX0lFRUU4MDJfMTFfUkFESU87IGxpa2UgRExUX0lFRUU4MDJfMTEsIGJ1dCB3aXRoIGFuIGV4dHJhCi0gKiBoZWFkZXIsIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gc3VjaCBhcyByYWRpbyBpbmZvcm1hdGlvbiwgd2hpY2ggd2UKLSAqIGN1cnJlbnRseSBpZ25vcmUuCi0gKi8KLXVfaW50Ci1pZWVlODAyXzExX3JhZGlvX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQotewotCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQl1X2ludCBsZW5ndGggPSBoLT5sZW47Ci0KLQlpZiAoY2FwbGVuIDwgOCkgewotCQlwcmludGYoIlt8ODAyLjExXSIpOwotCQlyZXR1cm4gY2FwbGVuOwotCX0KLQotCXJldHVybiBpZWVlODAyXzExX3JhZGlvX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWFoLmMgYi9wcmludC1haC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmVkOTA5Li4wMDAwMDAwCi0tLSBhL3ByaW50LWFoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgkkTmV0QlNEOiBwcmludC1haC5jLHYgMS40IDE5OTYvMDUvMjAgMDA6NDE6MTYgZnZkbCBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYWguYyx2IDEuMjIgMjAwMy8xMS8xOSAwMDozNjowNiBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYWguaCIKLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLWludAotYWhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYWggKmFoOwotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7Ci0JaW50IHN1bWxlbjsKLQl1X2ludDMyX3Qgc3BpOwotCi0JYWggPSAoY29uc3Qgc3RydWN0IGFoICopYnA7Ci0JZXAgPSBzbmFwZW5kOwkJLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KLQotCVRDSEVDSygqYWgpOwotCi0Jc3VtbGVuID0gYWgtPmFoX2xlbiA8PCAyOwotCXNwaSA9IEVYVFJBQ1RfMzJCSVRTKCZhaC0+YWhfc3BpKTsKLQotCXByaW50ZigiQUgoc3BpPTB4JTA4eCIsIHNwaSk7Ci0JaWYgKHZmbGFnKQotCQlwcmludGYoIixzdW1sZW49JWQiLCBzdW1sZW4pOwotCXByaW50ZigiLHNlcT0weCV4IiwgRVhUUkFDVF8zMkJJVFMoYWggKyAxKSk7Ci0JaWYgKGJwICsgc2l6ZW9mKHN0cnVjdCBhaCkgKyBzdW1sZW4gPiBlcCkKLQkJZnB1dHMoIlt0cnVuY2F0ZWRdIiwgc3Rkb3V0KTsKLQlmcHV0cygiKTogIiwgc3Rkb3V0KTsKLQotCXJldHVybiBzaXplb2Yoc3RydWN0IGFoKSArIHN1bWxlbjsKLSB0cnVuYzoKLQlmcHV0cygiW3xBSF0iLCBzdGRvdXQpOwotCXJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWFvZHYuYyBiL3ByaW50LWFvZHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhNTQ3ZC4uMDAwMDAwMAotLS0gYS9wcmludC1hb2R2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBCcnVjZSBNLiBTaW1wc29uIDxibXNAc3BjLm9yZz4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEJydWNlIE0uIFNpbXBzb24uCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIEJydWNlIE0uIFNpbXBzb24gbm9yIHRoZSBuYW1lcyBvZiBjby0KLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQnJ1Y2UgTS4gU2ltcHNvbiBBTkQgQ09OVFJJQlVUT1JTCi0gKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQnJ1Y2UgTS4gU2ltcHNvbiBPUiBDT05UUklCVVRPUlMKLSAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWFvZHYuYyx2IDEuMTEgMjAwNC8wMy8yNCAwMDozMDoxOSBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi0jaW5jbHVkZSAiYW9kdi5oIgotCi1zdGF0aWMgdm9pZAotYW9kdl9leHRlbnNpb24oY29uc3Qgc3RydWN0IGFvZHZfZXh0ICplcCwgdV9pbnQgbGVuZ3RoKQotewotCXVfaW50IGk7Ci0JY29uc3Qgc3RydWN0IGFvZHZfaGVsbG8gKmFoOwotCi0Jc3dpdGNoIChlcC0+dHlwZSkgewotCWNhc2UgQU9EVl9FWFRfSEVMTE86Ci0JCWlmIChzbmFwZW5kIDwgKHVfY2hhciAqKSBlcCkgewotCQkJcHJpbnRmKCIgW3xoZWxsb10iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpID0gbWluKGxlbmd0aCwgKHVfaW50KShzbmFwZW5kIC0gKHVfY2hhciAqKWVwKSk7Ci0JCWlmIChpIDwgc2l6ZW9mKHN0cnVjdCBhb2R2X2hlbGxvKSkgewotCQkJcHJpbnRmKCIgW3xoZWxsb10iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpIC09IHNpemVvZihzdHJ1Y3QgYW9kdl9oZWxsbyk7Ci0JCWFoID0gKHZvaWQgKillcDsKLQkJcHJpbnRmKCJcblx0ZXh0IEhFTExPICVsZCBtcyIsCi0JCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYWgtPmludGVydmFsKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCJcblx0ZXh0ICV1ICV1IiwgZXAtPnR5cGUsIGVwLT5sZW5ndGgpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb2R2X3JyZXEoY29uc3QgdW5pb24gYW9kdiAqYXAsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQgaTsKLQotCWlmIChzbmFwZW5kIDwgZGF0KSB7Ci0JCXByaW50ZigiIFt8YW9kdl0iKTsKLQkJcmV0dXJuOwotCX0KLQlpID0gbWluKGxlbmd0aCwgKHVfaW50KShzbmFwZW5kIC0gZGF0KSk7Ci0JaWYgKGkgPCBzaXplb2YoYXAtPnJyZXEpKSB7Ci0JCXByaW50ZigiIFt8cnJlcV0iKTsKLQkJcmV0dXJuOwotCX0KLQlpIC09IHNpemVvZihhcC0+cnJlcSk7Ci0JcHJpbnRmKCIgcnJlcSAldSAlcyVzJXMlcyVzaG9wcyAldSBpZCAweCUwOGx4XG4iCi0JICAgICJcdGRzdCAlcyBzZXEgJWx1IHNyYyAlcyBzZXEgJWx1IiwgbGVuZ3RoLAotCSAgICBhcC0+cnJlcS5ycmVxX3R5cGUgJiBSUkVRX0pPSU4gPyAiW0pdIiA6ICIiLAotCSAgICBhcC0+cnJlcS5ycmVxX3R5cGUgJiBSUkVRX1JFUEFJUiA/ICJbUl0iIDogIiIsCi0JICAgIGFwLT5ycmVxLnJyZXFfdHlwZSAmIFJSRVFfR1JBVCA/ICJbR10iIDogIiIsCi0JICAgIGFwLT5ycmVxLnJyZXFfdHlwZSAmIFJSRVFfREVTVCA/ICJbRF0iIDogIiIsCi0JICAgIGFwLT5ycmVxLnJyZXFfdHlwZSAmIFJSRVFfVU5LTk9XTiA/ICJbVV0gIiA6ICIgIiwKLQkgICAgYXAtPnJyZXEucnJlcV9ob3BzLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXEucnJlcV9pZCksCi0JICAgIGlwYWRkcl9zdHJpbmcoJmFwLT5ycmVxLnJyZXFfZGEpLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXEucnJlcV9kcyksCi0JICAgIGlwYWRkcl9zdHJpbmcoJmFwLT5ycmVxLnJyZXFfb2EpLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXEucnJlcV9vcykpOwotCWlmIChpID49IHNpemVvZihzdHJ1Y3QgYW9kdl9leHQpKQotCQlhb2R2X2V4dGVuc2lvbigodm9pZCAqKSgmYXAtPnJyZXEgKyAxKSwgaSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb2R2X3JyZXAoY29uc3QgdW5pb24gYW9kdiAqYXAsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQgaTsKLQotCWlmIChzbmFwZW5kIDwgZGF0KSB7Ci0JCXByaW50ZigiIFt8YW9kdl0iKTsKLQkJcmV0dXJuOwotCX0KLQlpID0gbWluKGxlbmd0aCwgKHVfaW50KShzbmFwZW5kIC0gZGF0KSk7Ci0JaWYgKGkgPCBzaXplb2YoYXAtPnJyZXApKSB7Ci0JCXByaW50ZigiIFt8cnJlcF0iKTsKLQkJcmV0dXJuOwotCX0KLQlpIC09IHNpemVvZihhcC0+cnJlcCk7Ci0JcHJpbnRmKCIgcnJlcCAldSAlcyVzcHJlZml4ICV1IGhvcHMgJXVcbiIKLQkgICAgIlx0ZHN0ICVzIGRzZXEgJWx1IHNyYyAlcyAlbHUgbXMiLCBsZW5ndGgsCi0JICAgIGFwLT5ycmVwLnJyZXBfdHlwZSAmIFJSRVBfUkVQQUlSID8gIltSXSIgOiAiIiwKLQkgICAgYXAtPnJyZXAucnJlcF90eXBlICYgUlJFUF9BQ0sgPyAiW0FdICIgOiAiICIsCi0JICAgIGFwLT5ycmVwLnJyZXBfcHMgJiBSUkVQX1BSRUZJWF9NQVNLLAotCSAgICBhcC0+cnJlcC5ycmVwX2hvcHMsCi0JICAgIGlwYWRkcl9zdHJpbmcoJmFwLT5ycmVwLnJyZXBfZGEpLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXAucnJlcF9kcyksCi0JICAgIGlwYWRkcl9zdHJpbmcoJmFwLT5ycmVwLnJyZXBfb2EpLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXAucnJlcF9saWZlKSk7Ci0JaWYgKGkgPj0gc2l6ZW9mKHN0cnVjdCBhb2R2X2V4dCkpCi0JCWFvZHZfZXh0ZW5zaW9uKCh2b2lkICopKCZhcC0+cnJlcCArIDEpLCBpKTsKLX0KLQotc3RhdGljIHZvaWQKLWFvZHZfcmVycihjb25zdCB1bmlvbiBhb2R2ICphcCwgY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKLXsKLQl1X2ludCBpOwotCWNvbnN0IHN0cnVjdCByZXJyX3VucmVhY2ggKmRwID0gTlVMTDsKLQlpbnQgbiwgdHJ1bmM7Ci0KLQlpZiAoc25hcGVuZCA8IGRhdCkgewotCQlwcmludGYoIiBbfGFvZHZdIik7Ci0JCXJldHVybjsKLQl9Ci0JaSA9IG1pbihsZW5ndGgsICh1X2ludCkoc25hcGVuZCAtIGRhdCkpOwotCWlmIChpIDwgb2Zmc2V0b2Yoc3RydWN0IGFvZHZfcmVyciwgcikpIHsKLQkJcHJpbnRmKCIgW3xyZXJyXSIpOwotCQlyZXR1cm47Ci0JfQotCWkgLT0gb2Zmc2V0b2Yoc3RydWN0IGFvZHZfcmVyciwgcik7Ci0JZHAgPSAmYXAtPnJlcnIuci5kZXN0WzBdOwotCW4gPSBhcC0+cmVyci5yZXJyX2RjICogc2l6ZW9mKGFwLT5yZXJyLnIuZGVzdFswXSk7Ci0JcHJpbnRmKCIgcmVyciAlcyBbaXRlbXMgJXVdIFsldV06IiwKLQkgICAgYXAtPnJlcnIucmVycl9mbGFncyAmIFJFUlJfTk9ERUxFVEUgPyAiW0RdIiA6ICIiLAotCSAgICBhcC0+cmVyci5yZXJyX2RjLCBsZW5ndGgpOwotCXRydW5jID0gbiAtIChpL3NpemVvZihhcC0+cmVyci5yLmRlc3RbMF0pKTsKLQlmb3IgKDsgaSA+PSBzaXplb2YoYXAtPnJlcnIuci5kZXN0WzBdKTsKLQkgICAgKytkcCwgaSAtPSBzaXplb2YoYXAtPnJlcnIuci5kZXN0WzBdKSkgewotCQlwcmludGYoIiB7JXN9KCVsZCkiLCBpcGFkZHJfc3RyaW5nKCZkcC0+dV9kYSksCi0JCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmZHAtPnVfZHMpKTsKLQl9Ci0JaWYgKHRydW5jKQotCQlwcmludGYoIlt8cmVycl0iKTsKLX0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBJTkVUNgotYW9kdl92Nl9ycmVxKGNvbnN0IHVuaW9uIGFvZHYgKmFwLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQotI2Vsc2UKLWFvZHZfdjZfcnJlcShjb25zdCB1bmlvbiBhb2R2ICphcCBfVV8sIGNvbnN0IHVfY2hhciAqZGF0IF9VXywgdV9pbnQgbGVuZ3RoKQotI2VuZGlmCi17Ci0jaWZkZWYgSU5FVDYKLQl1X2ludCBpOwotCi0JaWYgKHNuYXBlbmQgPCBkYXQpIHsKLQkJcHJpbnRmKCIgW3xhb2R2XSIpOwotCQlyZXR1cm47Ci0JfQotCWkgPSBtaW4obGVuZ3RoLCAodV9pbnQpKHNuYXBlbmQgLSBkYXQpKTsKLQlpZiAoaSA8IHNpemVvZihhcC0+cnJlcTYpKSB7Ci0JCXByaW50ZigiIFt8cnJlcTZdIik7Ci0JCXJldHVybjsKLQl9Ci0JaSAtPSBzaXplb2YoYXAtPnJyZXE2KTsKLQlwcmludGYoIiB2NiBycmVxICV1ICVzJXMlcyVzJXNob3BzICV1IGlkIDB4JTA4bHhcbiIKLQkgICAgIlx0ZHN0ICVzIHNlcSAlbHUgc3JjICVzIHNlcSAlbHUiLCBsZW5ndGgsCi0JICAgIGFwLT5ycmVxNi5ycmVxX3R5cGUgJiBSUkVRX0pPSU4gPyAiW0pdIiA6ICIiLAotCSAgICBhcC0+cnJlcTYucnJlcV90eXBlICYgUlJFUV9SRVBBSVIgPyAiW1JdIiA6ICIiLAotCSAgICBhcC0+cnJlcTYucnJlcV90eXBlICYgUlJFUV9HUkFUID8gIltHXSIgOiAiIiwKLQkgICAgYXAtPnJyZXE2LnJyZXFfdHlwZSAmIFJSRVFfREVTVCA/ICJbRF0iIDogIiIsCi0JICAgIGFwLT5ycmVxNi5ycmVxX3R5cGUgJiBSUkVRX1VOS05PV04gPyAiW1VdICIgOiAiICIsCi0JICAgIGFwLT5ycmVxNi5ycmVxX2hvcHMsCi0JICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcTYucnJlcV9pZCksCi0JICAgIGlwNmFkZHJfc3RyaW5nKCZhcC0+cnJlcTYucnJlcV9kYSksCi0JICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcTYucnJlcV9kcyksCi0JICAgIGlwNmFkZHJfc3RyaW5nKCZhcC0+cnJlcTYucnJlcV9vYSksCi0JICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZhcC0+cnJlcTYucnJlcV9vcykpOwotCWlmIChpID49IHNpemVvZihzdHJ1Y3QgYW9kdl9leHQpKQotCQlhb2R2X2V4dGVuc2lvbigodm9pZCAqKSgmYXAtPnJyZXE2ICsgMSksIGkpOwotI2Vsc2UKLQlwcmludGYoIiB2NiBycmVxICV1IiwgbGVuZ3RoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIElORVQ2Ci1hb2R2X3Y2X3JyZXAoY29uc3QgdW5pb24gYW9kdiAqYXAsIGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCi0jZWxzZQotYW9kdl92Nl9ycmVwKGNvbnN0IHVuaW9uIGFvZHYgKmFwIF9VXywgY29uc3QgdV9jaGFyICpkYXQgX1VfLCB1X2ludCBsZW5ndGgpCi0jZW5kaWYKLXsKLSNpZmRlZiBJTkVUNgotCXVfaW50IGk7Ci0KLQlpZiAoc25hcGVuZCA8IGRhdCkgewotCQlwcmludGYoIiBbfGFvZHZdIik7Ci0JCXJldHVybjsKLQl9Ci0JaSA9IG1pbihsZW5ndGgsICh1X2ludCkoc25hcGVuZCAtIGRhdCkpOwotCWlmIChpIDwgc2l6ZW9mKGFwLT5ycmVwNikpIHsKLQkJcHJpbnRmKCIgW3xycmVwNl0iKTsKLQkJcmV0dXJuOwotCX0KLQlpIC09IHNpemVvZihhcC0+cnJlcDYpOwotCXByaW50ZigiIHJyZXAgJXUgJXMlc3ByZWZpeCAldSBob3BzICV1XG4iCi0JICAgIlx0ZHN0ICVzIGRzZXEgJWx1IHNyYyAlcyAlbHUgbXMiLCBsZW5ndGgsCi0JICAgIGFwLT5ycmVwNi5ycmVwX3R5cGUgJiBSUkVQX1JFUEFJUiA/ICJbUl0iIDogIiIsCi0JICAgIGFwLT5ycmVwNi5ycmVwX3R5cGUgJiBSUkVQX0FDSyA/ICJbQV0gIiA6ICIgIiwKLQkgICAgYXAtPnJyZXA2LnJyZXBfcHMgJiBSUkVQX1BSRUZJWF9NQVNLLAotCSAgICBhcC0+cnJlcDYucnJlcF9ob3BzLAotCSAgICBpcDZhZGRyX3N0cmluZygmYXAtPnJyZXA2LnJyZXBfZGEpLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXA2LnJyZXBfZHMpLAotCSAgICBpcDZhZGRyX3N0cmluZygmYXAtPnJyZXA2LnJyZXBfb2EpLAotCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmYXAtPnJyZXA2LnJyZXBfbGlmZSkpOwotCWlmIChpID49IHNpemVvZihzdHJ1Y3QgYW9kdl9leHQpKQotCQlhb2R2X2V4dGVuc2lvbigodm9pZCAqKSgmYXAtPnJyZXA2ICsgMSksIGkpOwotI2Vsc2UKLQlwcmludGYoIiBycmVwICV1IiwgbGVuZ3RoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIElORVQ2Ci1hb2R2X3Y2X3JlcnIoY29uc3QgdW5pb24gYW9kdiAqYXAsIHVfaW50IGxlbmd0aCkKLSNlbHNlCi1hb2R2X3Y2X3JlcnIoY29uc3QgdW5pb24gYW9kdiAqYXAgX1VfLCB1X2ludCBsZW5ndGgpCi0jZW5kaWYKLXsKLSNpZmRlZiBJTkVUNgotCWNvbnN0IHN0cnVjdCByZXJyX3VucmVhY2g2ICpkcDYgPSBOVUxMOwotCWludCBpLCBqLCBuLCB0cnVuYzsKLQotCWkgPSBsZW5ndGggLSBvZmZzZXRvZihzdHJ1Y3QgYW9kdl9yZXJyLCByKTsKLQlqID0gc2l6ZW9mKGFwLT5yZXJyLnIuZGVzdDZbMF0pOwotCWRwNiA9ICZhcC0+cmVyci5yLmRlc3Q2WzBdOwotCW4gPSBhcC0+cmVyci5yZXJyX2RjICogajsKLQlwcmludGYoIiByZXJyICVzIFtpdGVtcyAldV0gWyV1XToiLAotCSAgICBhcC0+cmVyci5yZXJyX2ZsYWdzICYgUkVSUl9OT0RFTEVURSA/ICJbRF0iIDogIiIsCi0JICAgIGFwLT5yZXJyLnJlcnJfZGMsIGxlbmd0aCk7Ci0JdHJ1bmMgPSBuIC0gKGkvaik7Ci0JZm9yICg7IGkgLT0gaiA+PSAwOyArK2RwNikgewotCQlwcmludGYoIiB7JXN9KCVsZCkiLCBpcDZhZGRyX3N0cmluZygmZHA2LT51X2RhKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKUVYVFJBQ1RfMzJCSVRTKCZkcDYtPnVfZHMpKTsKLQl9Ci0JaWYgKHRydW5jKQotCQlwcmludGYoIlt8cmVycl0iKTsKLSNlbHNlCi0JcHJpbnRmKCIgcmVyciAldSIsIGxlbmd0aCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBJTkVUNgotYW9kdl92Nl9kcmFmdF8wMV9ycmVxKGNvbnN0IHVuaW9uIGFvZHYgKmFwLCBjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQotI2Vsc2UKLWFvZHZfdjZfZHJhZnRfMDFfcnJlcShjb25zdCB1bmlvbiBhb2R2ICphcCBfVV8sIGNvbnN0IHVfY2hhciAqZGF0IF9VXywKLSAgICB1X2ludCBsZW5ndGgpCi0jZW5kaWYKLXsKLSNpZmRlZiBJTkVUNgotCXVfaW50IGk7Ci0KLQlpZiAoc25hcGVuZCA8IGRhdCkgewotCQlwcmludGYoIiBbfGFvZHZdIik7Ci0JCXJldHVybjsKLQl9Ci0JaSA9IG1pbihsZW5ndGgsICh1X2ludCkoc25hcGVuZCAtIGRhdCkpOwotCWlmIChpIDwgc2l6ZW9mKGFwLT5ycmVxNl9kcmFmdF8wMSkpIHsKLQkJcHJpbnRmKCIgW3xycmVxNl0iKTsKLQkJcmV0dXJuOwotCX0KLQlpIC09IHNpemVvZihhcC0+cnJlcTZfZHJhZnRfMDEpOwotCXByaW50ZigiIHJyZXEgJXUgJXMlcyVzJXMlc2hvcHMgJXUgaWQgMHglMDhseFxuIgotCSAgICAiXHRkc3QgJXMgc2VxICVsdSBzcmMgJXMgc2VxICVsdSIsIGxlbmd0aCwKLQkgICAgYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfdHlwZSAmIFJSRVFfSk9JTiA/ICJbSl0iIDogIiIsCi0JICAgIGFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX3R5cGUgJiBSUkVRX1JFUEFJUiA/ICJbUl0iIDogIiIsCi0JICAgIGFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX3R5cGUgJiBSUkVRX0dSQVQgPyAiW0ddIiA6ICIiLAotCSAgICBhcC0+cnJlcTZfZHJhZnRfMDEucnJlcV90eXBlICYgUlJFUV9ERVNUID8gIltEXSIgOiAiIiwKLQkgICAgYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfdHlwZSAmIFJSRVFfVU5LTk9XTiA/ICJbVV0gIiA6ICIgIiwKLQkgICAgYXAtPnJyZXE2X2RyYWZ0XzAxLnJyZXFfaG9wcywKLQkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX2lkKSwKLQkgICAgaXA2YWRkcl9zdHJpbmcoJmFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX2RhKSwKLQkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX2RzKSwKLQkgICAgaXA2YWRkcl9zdHJpbmcoJmFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX29hKSwKLQkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVxNl9kcmFmdF8wMS5ycmVxX29zKSk7Ci0JaWYgKGkgPj0gc2l6ZW9mKHN0cnVjdCBhb2R2X2V4dCkpCi0JCWFvZHZfZXh0ZW5zaW9uKCh2b2lkICopKCZhcC0+cnJlcTZfZHJhZnRfMDEgKyAxKSwgaSk7Ci0jZWxzZQotCXByaW50ZigiIHJyZXEgJXUiLCBsZW5ndGgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgSU5FVDYKLWFvZHZfdjZfZHJhZnRfMDFfcnJlcChjb25zdCB1bmlvbiBhb2R2ICphcCwgY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKLSNlbHNlCi1hb2R2X3Y2X2RyYWZ0XzAxX3JyZXAoY29uc3QgdW5pb24gYW9kdiAqYXAgX1VfLCBjb25zdCB1X2NoYXIgKmRhdCBfVV8sCi0gICAgdV9pbnQgbGVuZ3RoKQotI2VuZGlmCi17Ci0jaWZkZWYgSU5FVDYKLQl1X2ludCBpOwotCi0JaWYgKHNuYXBlbmQgPCBkYXQpIHsKLQkJcHJpbnRmKCIgW3xhb2R2XSIpOwotCQlyZXR1cm47Ci0JfQotCWkgPSBtaW4obGVuZ3RoLCAodV9pbnQpKHNuYXBlbmQgLSBkYXQpKTsKLQlpZiAoaSA8IHNpemVvZihhcC0+cnJlcDZfZHJhZnRfMDEpKSB7Ci0JCXByaW50ZigiIFt8cnJlcDZdIik7Ci0JCXJldHVybjsKLQl9Ci0JaSAtPSBzaXplb2YoYXAtPnJyZXA2X2RyYWZ0XzAxKTsKLQlwcmludGYoIiBycmVwICV1ICVzJXNwcmVmaXggJXUgaG9wcyAldVxuIgotCSAgICJcdGRzdCAlcyBkc2VxICVsdSBzcmMgJXMgJWx1IG1zIiwgbGVuZ3RoLAotCSAgICBhcC0+cnJlcDZfZHJhZnRfMDEucnJlcF90eXBlICYgUlJFUF9SRVBBSVIgPyAiW1JdIiA6ICIiLAotCSAgICBhcC0+cnJlcDZfZHJhZnRfMDEucnJlcF90eXBlICYgUlJFUF9BQ0sgPyAiW0FdICIgOiAiICIsCi0JICAgIGFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX3BzICYgUlJFUF9QUkVGSVhfTUFTSywKLQkgICAgYXAtPnJyZXA2X2RyYWZ0XzAxLnJyZXBfaG9wcywKLQkgICAgaXA2YWRkcl9zdHJpbmcoJmFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX2RhKSwKLQkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX2RzKSwKLQkgICAgaXA2YWRkcl9zdHJpbmcoJmFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX29hKSwKLQkgICAgKHVuc2lnbmVkIGxvbmcpRVhUUkFDVF8zMkJJVFMoJmFwLT5ycmVwNl9kcmFmdF8wMS5ycmVwX2xpZmUpKTsKLQlpZiAoaSA+PSBzaXplb2Yoc3RydWN0IGFvZHZfZXh0KSkKLQkJYW9kdl9leHRlbnNpb24oKHZvaWQgKikoJmFwLT5ycmVwNl9kcmFmdF8wMSArIDEpLCBpKTsKLSNlbHNlCi0JcHJpbnRmKCIgcnJlcCAldSIsIGxlbmd0aCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLSNpZmRlZiBJTkVUNgotYW9kdl92Nl9kcmFmdF8wMV9yZXJyKGNvbnN0IHVuaW9uIGFvZHYgKmFwLCB1X2ludCBsZW5ndGgpCi0jZWxzZQotYW9kdl92Nl9kcmFmdF8wMV9yZXJyKGNvbnN0IHVuaW9uIGFvZHYgKmFwIF9VXywgdV9pbnQgbGVuZ3RoKQotI2VuZGlmCi17Ci0jaWZkZWYgSU5FVDYKLQljb25zdCBzdHJ1Y3QgcmVycl91bnJlYWNoNl9kcmFmdF8wMSAqZHA2ID0gTlVMTDsKLQlpbnQgaSwgaiwgbiwgdHJ1bmM7Ci0KLQlpID0gbGVuZ3RoIC0gb2Zmc2V0b2Yoc3RydWN0IGFvZHZfcmVyciwgcik7Ci0JaiA9IHNpemVvZihhcC0+cmVyci5yLmRlc3Q2X2RyYWZ0XzAxWzBdKTsKLQlkcDYgPSAmYXAtPnJlcnIuci5kZXN0Nl9kcmFmdF8wMVswXTsKLQluID0gYXAtPnJlcnIucmVycl9kYyAqIGo7Ci0JcHJpbnRmKCIgcmVyciAlcyBbaXRlbXMgJXVdIFsldV06IiwKLQkgICAgYXAtPnJlcnIucmVycl9mbGFncyAmIFJFUlJfTk9ERUxFVEUgPyAiW0RdIiA6ICIiLAotCSAgICBhcC0+cmVyci5yZXJyX2RjLCBsZW5ndGgpOwotCXRydW5jID0gbiAtIChpL2opOwotCWZvciAoOyBpIC09IGogPj0gMDsgKytkcDYpIHsKLQkJcHJpbnRmKCIgeyVzfSglbGQpIiwgaXA2YWRkcl9zdHJpbmcoJmRwNi0+dV9kYSksCi0JCSAgICAodW5zaWduZWQgbG9uZylFWFRSQUNUXzMyQklUUygmZHA2LT51X2RzKSk7Ci0JfQotCWlmICh0cnVuYykKLQkJcHJpbnRmKCJbfHJlcnJdIik7Ci0jZWxzZQotCXByaW50ZigiIHJlcnIgJXUiLCBsZW5ndGgpOwotI2VuZGlmCi19Ci0KLXZvaWQKLWFvZHZfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCwgaW50IGlzX2lwNikKLXsKLQljb25zdCB1bmlvbiBhb2R2ICphcDsKLQotCWFwID0gKHVuaW9uIGFvZHYgKilkYXQ7Ci0JaWYgKHNuYXBlbmQgPCBkYXQpIHsKLQkJcHJpbnRmKCIgW3xhb2R2XSIpOwotCQlyZXR1cm47Ci0JfQotCWlmIChtaW4obGVuZ3RoLCAodV9pbnQpKHNuYXBlbmQgLSBkYXQpKSA8IHNpemVvZihhcC0+cnJlcF9hY2spKSB7Ci0JCXByaW50ZigiIFt8YW9kdl0iKTsKLQkJcmV0dXJuOwotCX0KLQlwcmludGYoIiBhb2R2Iik7Ci0KLQlzd2l0Y2ggKGFwLT5yZXJyLnJlcnJfdHlwZSkgewotCi0JY2FzZSBBT0RWX1JSRVE6Ci0JCWlmIChpc19pcDYpCi0JCQlhb2R2X3Y2X3JyZXEoYXAsIGRhdCwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJYW9kdl9ycmVxKGFwLCBkYXQsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBT0RWX1JSRVA6Ci0JCWlmIChpc19pcDYpCi0JCQlhb2R2X3Y2X3JyZXAoYXAsIGRhdCwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJYW9kdl9ycmVwKGFwLCBkYXQsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBT0RWX1JFUlI6Ci0JCWlmIChpc19pcDYpCi0JCQlhb2R2X3Y2X3JlcnIoYXAsIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCWFvZHZfcmVycihhcCwgZGF0LCBsZW5ndGgpOwotCQlicmVhazsKLQotCWNhc2UgQU9EVl9SUkVQX0FDSzoKLQkJcHJpbnRmKCIgcnJlcC1hY2sgJXUiLCBsZW5ndGgpOwotCQlicmVhazsKLQotCWNhc2UgQU9EVl9WNl9EUkFGVF8wMV9SUkVROgotCQlhb2R2X3Y2X2RyYWZ0XzAxX3JyZXEoYXAsIGRhdCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFPRFZfVjZfRFJBRlRfMDFfUlJFUDoKLQkJYW9kdl92Nl9kcmFmdF8wMV9ycmVwKGFwLCBkYXQsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBT0RWX1Y2X0RSQUZUXzAxX1JFUlI6Ci0JCWFvZHZfdjZfZHJhZnRfMDFfcmVycihhcCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFPRFZfVjZfRFJBRlRfMDFfUlJFUF9BQ0s6Ci0JCXByaW50ZigiIHJyZXAtYWNrICV1IiwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIiAldSAldSIsIGFwLT5ycmVxLnJyZXFfdHlwZSwgbGVuZ3RoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wcmludC1hcDEzOTQuYyBiL3ByaW50LWFwMTM5NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFjZTM0Li4wMDAwMDAwCi0tLSBhL3ByaW50LWFwMTM5NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYXAxMzk0LmMsdiAxLjMuMi4xIDIwMDUvMDcvMDcgMDE6MjQ6MzMgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYSBoZWFkZXIgZm9yIEFwcGxlJ3MgSVAtb3Zlci1JRUVFIDEzODQgQlBGIGhlYWRlci4KLSAqLwotI2RlZmluZSBGSVJFV0lSRV9FVUk2NF9MRU4JOAotc3RydWN0IGZpcmV3aXJlX2hlYWRlciB7Ci0JdV9jaGFyICBmaXJld2lyZV9kaG9zdFtGSVJFV0lSRV9FVUk2NF9MRU5dOwotCXVfY2hhciAgZmlyZXdpcmVfc2hvc3RbRklSRVdJUkVfRVVJNjRfTEVOXTsKLQl1X3Nob3J0IGZpcmV3aXJlX3R5cGU7Ci19OwotCi0vKgotICogTGVuZ3RoIG9mIHRoYXQgaGVhZGVyOyBub3RlIHRoYXQgc29tZSBjb21waWxlcnMgbWF5IHBhZAotICogInN0cnVjdCBmaXJld2lyZV9oZWFkZXIiIHRvIGEgbXVsdGlwbGUgb2YgNCBieXRlcywgZm9yIGV4YW1wbGUsIHNvCi0gKiAic2l6ZW9mIChzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyKSIgbWF5IG5vdCBnaXZlIHRoZSByaWdodCBhbnN3ZXIuCi0gKi8KLSNkZWZpbmUgRklSRVdJUkVfSERSTEVOCQkxOAotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWFwMTM5NF9oZHJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBmaXJld2lyZV9oZWFkZXIgKmZwOwotCWZwID0gKGNvbnN0IHN0cnVjdCBmaXJld2lyZV9oZWFkZXIgKilicDsKLQotCSh2b2lkKXByaW50ZigiJXMgPiAlcyIsCi0JCSAgICAgbGlua2FkZHJfc3RyaW5nKGZwLT5maXJld2lyZV9kaG9zdCwgRklSRVdJUkVfRVVJNjRfTEVOKSwKLQkJICAgICBsaW5rYWRkcl9zdHJpbmcoZnAtPmZpcmV3aXJlX3Nob3N0LCBGSVJFV0lSRV9FVUk2NF9MRU4pKTsKLQotCWlmICghcWZsYWcpIHsKLQkJKHZvaWQpcHJpbnRmKCIsIGV0aGVydHlwZSAlcyAoMHglMDR4KSIsCi0JCQkgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCJVbmtub3duIiwgbnRvaHMoZnAtPmZpcmV3aXJlX3R5cGUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhmcC0+ZmlyZXdpcmVfdHlwZSkpOwkgICAgICAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiwgJXMiLCB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsIlVua25vd24gRXRoZXJ0eXBlICgweCUwNHgpIiwgbnRvaHMoZnAtPmZpcmV3aXJlX3R5cGUpKSk7ICAKLSAgICAgICAgfQotCi0JKHZvaWQpcHJpbnRmKCIsIGxlbmd0aCAldTogIiwgbGVuZ3RoKTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cwotICogdG8gdGhlIGV0aGVyIGhlYWRlciBvZiB0aGUgcGFja2V0LCAnaC0+dHMnIGlzIHRoZSB0aW1lc3RhbXAsCi0gKiAnaC0+bGVuJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb2ZmIHRoZSB3aXJlLCBhbmQgJ2gtPmNhcGxlbicKLSAqIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgY2FwdHVyZWQuCi0gKi8KLXVfaW50Ci1hcDEzOTRfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCi17Ci0JdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQlzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyICpmcDsKLQl1X3Nob3J0IGV0aGVyX3R5cGU7Ci0JdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJfdHlwZTsKLQotCWlmIChjYXBsZW4gPCBGSVJFV0lSRV9IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfGFwMTM5NF0iKTsKLQkJcmV0dXJuIEZJUkVXSVJFX0hEUkxFTjsKLQl9Ci0KLQlpZiAoZWZsYWcpCi0JCWFwMTM5NF9oZHJfcHJpbnQocCwgbGVuZ3RoKTsKLQotCWxlbmd0aCAtPSBGSVJFV0lSRV9IRFJMRU47Ci0JY2FwbGVuIC09IEZJUkVXSVJFX0hEUkxFTjsKLQlmcCA9IChzdHJ1Y3QgZmlyZXdpcmVfaGVhZGVyICopcDsKLQlwICs9IEZJUkVXSVJFX0hEUkxFTjsKLQotCWV0aGVyX3R5cGUgPSBudG9ocyhmcC0+ZmlyZXdpcmVfdHlwZSk7Ci0KLQlleHRyYWN0ZWRfZXRoZXJfdHlwZSA9IDA7Ci0JaWYgKGV0aGVyX2VuY2FwX3ByaW50KGV0aGVyX3R5cGUsIHAsIGxlbmd0aCwgY2FwbGVuLAotCSAgICAmZXh0cmFjdGVkX2V0aGVyX3R5cGUpID09IDApIHsKLQkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KLQkJaWYgKCFlZmxhZykKLQkJCWFwMTM5NF9oZHJfcHJpbnQoKHVfY2hhciAqKWZwLCBsZW5ndGggKyBGSVJFV0lSRV9IRFJMRU4pOwotCi0JCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKLQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKLQl9IAotCi0JcmV0dXJuIEZJUkVXSVJFX0hEUkxFTjsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWFyY25ldC5jIGIvcHJpbnQtYXJjbmV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjljMjEuLjAwMDAwMDAKLS0tIGEvcHJpbnQtYXJjbmV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZyb206IE5ldEJTRDogcHJpbnQtYXJjbmV0LmMsdiAxLjIgMjAwMC8wNC8yNCAxMzowMjoyOCBpdG9qdW4gRXhwCi0gKi8KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWFyY25ldC5jLHYgMS4yMCAyMDA1LzA0LzA2IDIxOjMyOjM4IG1jciBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8cGNhcC5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYXJjbmV0LmgiCi0KLXN0YXRpYyBpbnQgYXJjbmV0X2VuY2FwX3ByaW50KHVfY2hhciBhcmN0eXBlLCBjb25zdCB1X2NoYXIgKnAsCi0gICAgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pOwotCi1zdHJ1Y3QgdG9rIGFyY3R5cGVtYXBbXSA9IHsKLQl7IEFSQ1RZUEVfSVBfT0xELAkib2xkaXAiIH0sCi0JeyBBUkNUWVBFX0FSUF9PTEQsCSJvbGRhcnAiIH0sCi0JeyBBUkNUWVBFX0lQLAkJImlwIiB9LAotCXsgQVJDVFlQRV9BUlAsCQkiYXJwIiB9LAotCXsgQVJDVFlQRV9SRVZBUlAsCSJyYXJwIiB9LAotCXsgQVJDVFlQRV9BVEFMSywJImF0YWxrIiB9LAotCXsgQVJDVFlQRV9CQU5JQU4sCSJiYW55YW4iIH0sCi0JeyBBUkNUWVBFX0lQWCwJCSJpcHgiIH0sCi0JeyBBUkNUWVBFX0lORVQ2LAkiaXB2NiIgfSwKLQl7IEFSQ1RZUEVfRElBR05PU0UsCSJkaWFnIiB9LAotCXsgMCwgMCB9Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWFyY25ldF9wcmludChjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsIGludCBwaGRzLCBpbnQgZmxhZywgdV9pbnQgc2VxaWQpCi17Ci0JY29uc3Qgc3RydWN0IGFyY19oZWFkZXIgKmFwOwotCWNvbnN0IGNoYXIgKmFyY3R5cGVuYW1lOwotCi0KLQlhcCA9IChjb25zdCBzdHJ1Y3QgYXJjX2hlYWRlciAqKWJwOwotCi0KLQlpZiAocWZsYWcpIHsKLQkJKHZvaWQpcHJpbnRmKCIlMDJ4ICUwMnggJWQ6ICIsCi0JCQkgICAgIGFwLT5hcmNfc2hvc3QsCi0JCQkgICAgIGFwLT5hcmNfZGhvc3QsCi0JCQkgICAgIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhcmN0eXBlbmFtZSA9IHRvazJzdHIoYXJjdHlwZW1hcCwgIiUwMngiLCBhcC0+YXJjX3R5cGUpOwotCi0JaWYgKCFwaGRzKSB7Ci0JCSh2b2lkKXByaW50ZigiJTAyeCAlMDJ4ICVzICVkOiAiLAotCQkJICAgICBhcC0+YXJjX3Nob3N0LCBhcC0+YXJjX2Rob3N0LCBhcmN0eXBlbmFtZSwKLQkJCSAgICAgbGVuZ3RoKTsKLQkJCSAgICAgcmV0dXJuOwotCX0KLQotCWlmIChmbGFnID09IDApIHsKLQkJKHZvaWQpcHJpbnRmKCIlMDJ4ICUwMnggJXMgc2VxaWQgJTA0eCAlZDogIiwKLQkJCWFwLT5hcmNfc2hvc3QsIGFwLT5hcmNfZGhvc3QsIGFyY3R5cGVuYW1lLCBzZXFpZCwKLQkJCWxlbmd0aCk7Ci0JCQlyZXR1cm47Ci0JfQotCi0JaWYgKGZsYWcgJiAxKQotCQkodm9pZClwcmludGYoIiUwMnggJTAyeCAlcyBzZXFpZCAlMDR4ICIKLQkJCSIoZmlyc3Qgb2YgJWQgZnJhZ21lbnRzKSAlZDogIiwKLQkJCWFwLT5hcmNfc2hvc3QsIGFwLT5hcmNfZGhvc3QsIGFyY3R5cGVuYW1lLCBzZXFpZCwKLQkJCShmbGFnICsgMykgLyAyLCBsZW5ndGgpOwotCWVsc2UKLQkJKHZvaWQpcHJpbnRmKCIlMDJ4ICUwMnggJXMgc2VxaWQgJTA0eCAiCi0JCQkiKGZyYWdtZW50ICVkKSAlZDogIiwKLQkJCWFwLT5hcmNfc2hvc3QsIGFwLT5hcmNfZGhvc3QsIGFyY3R5cGVuYW1lLCBzZXFpZCwKLQkJCWZsYWcvMiArIDEsIGxlbmd0aCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKLSAqIHRvIHRoZSBBUkNORVQgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKLSAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJwotICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KLSAqLwotdV9pbnQKLWFyY25ldF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCWNvbnN0IHN0cnVjdCBhcmNfaGVhZGVyICphcDsKLQotCWludCBwaGRzLCBmbGFnID0gMCwgYXJjaGRybGVuID0gMDsKLQl1X2ludCBzZXFpZCA9IDA7Ci0JdV9jaGFyIGFyY190eXBlOwotCi0JaWYgKGNhcGxlbiA8IEFSQ19IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfGFyY25ldF0iKTsKLQkJcmV0dXJuIChjYXBsZW4pOwotCX0KLQotCWFwID0gKGNvbnN0IHN0cnVjdCBhcmNfaGVhZGVyICopcDsKLQlhcmNfdHlwZSA9IGFwLT5hcmNfdHlwZTsKLQotCXN3aXRjaCAoYXJjX3R5cGUpIHsKLQlkZWZhdWx0OgotCQlwaGRzID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBBUkNUWVBFX0lQX09MRDoKLQljYXNlIEFSQ1RZUEVfQVJQX09MRDoKLQljYXNlIEFSQ1RZUEVfRElBR05PU0U6Ci0JCXBoZHMgPSAwOwotCQlhcmNoZHJsZW4gPSBBUkNfSERSTEVOOwotCQlicmVhazsKLQl9Ci0KLQlpZiAocGhkcykgewotCQlpZiAoY2FwbGVuIDwgQVJDX0hEUk5FV0xFTikgewotCQkJYXJjbmV0X3ByaW50KHAsIGxlbmd0aCwgMCwgMCwgMCk7Ci0JCQlwcmludGYoIlt8cGhkc10iKTsKLQkJCXJldHVybiAoY2FwbGVuKTsKLQkJfQotCi0JCWlmIChhcC0+YXJjX2ZsYWcgPT0gMHhmZikgewotCQkJaWYgKGNhcGxlbiA8IEFSQ19IRFJORVdMRU5fRVhDKSB7Ci0JCQkJYXJjbmV0X3ByaW50KHAsIGxlbmd0aCwgMCwgMCwgMCk7Ci0JCQkJcHJpbnRmKCJbfHBoZHMgZXh0ZW5kZWRdIik7Ci0JCQkJcmV0dXJuIChjYXBsZW4pOwotCQkJfQotCQkJZmxhZyA9IGFwLT5hcmNfZmxhZzI7Ci0JCQlzZXFpZCA9IG50b2hzKGFwLT5hcmNfc2VxaWQyKTsKLQkJCWFyY2hkcmxlbiA9IEFSQ19IRFJORVdMRU5fRVhDOwotCQl9IGVsc2UgewotCQkJZmxhZyA9IGFwLT5hcmNfZmxhZzsKLQkJCXNlcWlkID0gbnRvaHMoYXAtPmFyY19zZXFpZCk7Ci0JCQlhcmNoZHJsZW4gPSBBUkNfSERSTkVXTEVOOwotCQl9Ci0JfQotCi0KLQlpZiAoZWZsYWcpCi0JCWFyY25ldF9wcmludChwLCBsZW5ndGgsIHBoZHMsIGZsYWcsIHNlcWlkKTsKLQotCS8qCi0JICogR28gcGFzdCB0aGUgQVJDTkVUIGhlYWRlci4KLQkgKi8KLQlsZW5ndGggLT0gYXJjaGRybGVuOwotCWNhcGxlbiAtPSBhcmNoZHJsZW47Ci0JcCArPSBhcmNoZHJsZW47Ci0KLQlpZiAocGhkcyAmJiBmbGFnICYmIChmbGFnICYgMSkgPT0gMCkgewotCQkvKgotCQkgKiBUaGlzIGlzIGEgbWlkZGxlIGZyYWdtZW50LgotCQkgKi8KLQkJcmV0dXJuIChhcmNoZHJsZW4pOwotCX0KLQotCWlmICghYXJjbmV0X2VuY2FwX3ByaW50KGFyY190eXBlLCBwLCBsZW5ndGgsIGNhcGxlbikpCi0JCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKLQotCXJldHVybiAoYXJjaGRybGVuKTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cwotICogdG8gdGhlIEFSQ05FVCBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLiAgSXQgaXMgcXVpdGUgc2ltaWxhcgotICogdG8gdGhlIG5vbi1MaW51eCBzdHlsZSBwcmludGVyIGV4Y2VwdCB0aGF0IExpbnV4IGRvZXNuJ3QgZXZlcgotICogc3VwcGx5IHBhY2tldHMgdGhhdCBsb29rIGxpa2UgZXhjZXB0aW9uIGZyYW1lcywgaXQgYWx3YXlzIHN1cHBsaWVzCi0gKiByZWFzc2VtYmxlZCBwYWNrZXRzIHJhdGhlciB0aGFuIHJhdyBmcmFtZXMsIGFuZCBoZWFkZXJzIGhhdmUgYW4KLSAqIGV4dHJhICJvZmZzZXQiIGZpZWxkIGJldHdlZW4gdGhlIHNyYy9kZXN0IGFuZCBwYWNrZXQgdHlwZS4KLSAqLwotdV9pbnQKLWFyY25ldF9saW51eF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCWNvbnN0IHN0cnVjdCBhcmNfbGludXhfaGVhZGVyICphcDsKLQotCWludCBhcmNoZHJsZW4gPSAwOwotCXVfY2hhciBhcmNfdHlwZTsKLQotCWlmIChjYXBsZW4gPCBBUkNfTElOVVhfSERSTEVOKSB7Ci0JCXByaW50ZigiW3xhcmNuZXRdIik7Ci0JCXJldHVybiAoY2FwbGVuKTsKLQl9Ci0KLQlhcCA9IChjb25zdCBzdHJ1Y3QgYXJjX2xpbnV4X2hlYWRlciAqKXA7Ci0JYXJjX3R5cGUgPSBhcC0+YXJjX3R5cGU7Ci0KLQlzd2l0Y2ggKGFyY190eXBlKSB7Ci0JZGVmYXVsdDoKLQkJYXJjaGRybGVuID0gQVJDX0xJTlVYX0hEUk5FV0xFTjsKLQkJaWYgKGNhcGxlbiA8IEFSQ19MSU5VWF9IRFJORVdMRU4pIHsKLQkJCXByaW50ZigiW3xhcmNuZXRdIik7Ci0JCQlyZXR1cm4gKGNhcGxlbik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBBUkNUWVBFX0lQX09MRDoKLQljYXNlIEFSQ1RZUEVfQVJQX09MRDoKLQljYXNlIEFSQ1RZUEVfRElBR05PU0U6Ci0JCWFyY2hkcmxlbiA9IEFSQ19MSU5VWF9IRFJMRU47Ci0JCWJyZWFrOwotCX0KLQotCWlmIChlZmxhZykKLQkJYXJjbmV0X3ByaW50KHAsIGxlbmd0aCwgMCwgMCwgMCk7Ci0KLQkvKgotCSAqIEdvIHBhc3QgdGhlIEFSQ05FVCBoZWFkZXIuCi0JICovCi0JbGVuZ3RoIC09IGFyY2hkcmxlbjsKLQljYXBsZW4gLT0gYXJjaGRybGVuOwotCXAgKz0gYXJjaGRybGVuOwotCi0JaWYgKCFhcmNuZXRfZW5jYXBfcHJpbnQoYXJjX3R5cGUsIHAsIGxlbmd0aCwgY2FwbGVuKSkKLQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCi0JcmV0dXJuIChhcmNoZHJsZW4pOwotfQotCi0vKgotICogUHJpbnRzIHRoZSBwYWNrZXQgZW5jYXBzdWxhdGVkIGluIGFuIEFSQ25ldCBkYXRhIGZpZWxkLAotICogZ2l2ZW4gdGhlIEFSQ25ldCBzeXN0ZW0gY29kZS4KLSAqCi0gKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGl0IGNhbiBkbyBzbywgemVybyBpZiB0aGUgc3lzdGVtIGNvZGUgaXMgdW5rbm93bi4KLSAqLwotCi0KLXN0YXRpYyBpbnQKLWFyY25ldF9lbmNhcF9wcmludCh1X2NoYXIgYXJjdHlwZSwgY29uc3QgdV9jaGFyICpwLAotICAgIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQotewotCXN3aXRjaCAoYXJjdHlwZSkgewotCi0JY2FzZSBBUkNUWVBFX0lQX09MRDoKLQljYXNlIEFSQ1RZUEVfSVA6Ci0JICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOwotCQlyZXR1cm4gKDEpOwotCi0jaWZkZWYgSU5FVDYKLQljYXNlIEFSQ1RZUEVfSU5FVDY6Ci0JCWlwNl9wcmludChwLCBsZW5ndGgpOwotCQlyZXR1cm4gKDEpOwotI2VuZGlmIC8qSU5FVDYqLwotCi0JY2FzZSBBUkNUWVBFX0FSUF9PTEQ6Ci0JY2FzZSBBUkNUWVBFX0FSUDoKLQljYXNlIEFSQ1RZUEVfUkVWQVJQOgotCSAgYXJwX3ByaW50KGduZG8sIHAsIGxlbmd0aCwgY2FwbGVuKTsKLQkJcmV0dXJuICgxKTsKLQotCWNhc2UgQVJDVFlQRV9BVEFMSzoJLyogWFhYIHdhcyB0aGlzIGV2ZXIgdXNlZD8gKi8KLQkJaWYgKHZmbGFnKQotCQkJZnB1dHMoImV0MSAiLCBzdGRvdXQpOwotCQlhdGFsa19wcmludChwLCBsZW5ndGgpOwotCQlyZXR1cm4gKDEpOwotCi0JY2FzZSBBUkNUWVBFX0lQWDoKLQkJaXB4X3ByaW50KHAsIGxlbmd0aCk7Ci0JCXJldHVybiAoMSk7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gKDApOwotCX0KLX0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGMtc3R5bGU6IGJzZAotICogRW5kOgotICovCi0KZGlmZiAtLWdpdCBhL3ByaW50LWFycC5jIGIvcHJpbnQtYXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTlkYzYuLjAwMDAwMDAKLS0tIGEvcHJpbnQtYXJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWFycC5jLHYgMS42NCAyMDA0LzA0LzMwIDE2OjQyOjE0IG1jciBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJuZXRkaXNzZWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVyLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi0vKgotICogQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sLgotICoKLSAqIFNlZSBSRkMgODI2IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4gIEFSUCBwYWNrZXRzIGFyZSB2YXJpYWJsZQotICogaW4gc2l6ZTsgdGhlIGFycGhkciBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24uCi0gKiBQcm90b2NvbCB0eXBlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgZm9yIDEwIE1iL3MgRXRoZXJuZXQuCi0gKiBJdCBpcyBmb2xsb3dlZCBieSB0aGUgdmFyaWFibGUtc2l6ZWQgZmllbGRzIGFyX3NoYSwgYXJwX3NwYSwKLSAqIGFycF90aGEgYW5kIGFycF90cGEgaW4gdGhhdCBvcmRlciwgYWNjb3JkaW5nIHRvIHRoZSBsZW5ndGhzCi0gKiBzcGVjaWZpZWQuICBGaWVsZCBuYW1lcyB1c2VkIGNvcnJlc3BvbmQgdG8gUkZDIDgyNi4KLSAqLwotc3RydWN0CWFycF9wa3RoZHIgewotCXVfc2hvcnQJYXJfaHJkOwkJLyogZm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MgKi8KLSNkZWZpbmUgQVJQSFJEX0VUSEVSIAkxCS8qIGV0aGVybmV0IGhhcmR3YXJlIGZvcm1hdCAqLwotI2RlZmluZSBBUlBIUkRfSUVFRTgwMgk2CS8qIHRva2VuLXJpbmcgaGFyZHdhcmUgZm9ybWF0ICovCi0jZGVmaW5lIEFSUEhSRF9BUkNORVQJNwkvKiBhcmNuZXQgaGFyZHdhcmUgZm9ybWF0ICovCi0jZGVmaW5lIEFSUEhSRF9GUkVMQVkgCTE1CS8qIGZyYW1lIHJlbGF5IGhhcmR3YXJlIGZvcm1hdCAqLwotI2RlZmluZSBBUlBIUkRfU1RSSVAgCTIzCS8qIFJpY29jaGV0IFN0YXJtb2RlIFJhZGlvIGhhcmR3YXJlIGZvcm1hdCAqLwotI2RlZmluZSBBUlBIUkRfSUVFRTEzOTQJMjQJLyogSUVFRSAxMzk0IChGaXJlV2lyZSkgaGFyZHdhcmUgZm9ybWF0ICovCi0JdV9zaG9ydAlhcl9wcm87CQkvKiBmb3JtYXQgb2YgcHJvdG9jb2wgYWRkcmVzcyAqLwotCXVfY2hhcglhcl9obG47CQkvKiBsZW5ndGggb2YgaGFyZHdhcmUgYWRkcmVzcyAqLwotCXVfY2hhcglhcl9wbG47CQkvKiBsZW5ndGggb2YgcHJvdG9jb2wgYWRkcmVzcyAqLwotCXVfc2hvcnQJYXJfb3A7CQkvKiBvbmUgb2Y6ICovCi0jZGVmaW5lCUFSUE9QX1JFUVVFU1QJMQkvKiByZXF1ZXN0IHRvIHJlc29sdmUgYWRkcmVzcyAqLwotI2RlZmluZQlBUlBPUF9SRVBMWQkyCS8qIHJlc3BvbnNlIHRvIHByZXZpb3VzIHJlcXVlc3QgKi8KLSNkZWZpbmUJQVJQT1BfUkVWUkVRVUVTVCAzCS8qIHJlcXVlc3QgcHJvdG9jb2wgYWRkcmVzcyBnaXZlbiBoYXJkd2FyZSAqLwotI2RlZmluZQlBUlBPUF9SRVZSRVBMWQk0CS8qIHJlc3BvbnNlIGdpdmluZyBwcm90b2NvbCBhZGRyZXNzICovCi0jZGVmaW5lIEFSUE9QX0lOVlJFUVVFU1QgOCAJLyogcmVxdWVzdCB0byBpZGVudGlmeSBwZWVyICovCi0jZGVmaW5lIEFSUE9QX0lOVlJFUExZCTkJLyogcmVzcG9uc2UgaWRlbnRpZnlpbmcgcGVlciAqLwotLyoKLSAqIFRoZSByZW1haW5pbmcgZmllbGRzIGFyZSB2YXJpYWJsZSBpbiBzaXplLAotICogYWNjb3JkaW5nIHRvIHRoZSBzaXplcyBhYm92ZS4KLSAqLwotI2lmZGVmIENPTU1FTlRfT05MWQotCXVfY2hhcglhcl9zaGFbXTsJLyogc2VuZGVyIGhhcmR3YXJlIGFkZHJlc3MgKi8KLQl1X2NoYXIJYXJfc3BhW107CS8qIHNlbmRlciBwcm90b2NvbCBhZGRyZXNzICovCi0JdV9jaGFyCWFyX3RoYVtdOwkvKiB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcyAqLwotCXVfY2hhcglhcl90cGFbXTsJLyogdGFyZ2V0IHByb3RvY29sIGFkZHJlc3MgKi8KLSNlbmRpZgotI2RlZmluZSBhcl9zaGEoYXApCSgoKGNvbnN0IHVfY2hhciAqKSgoYXApKzEpKSswKQotI2RlZmluZSBhcl9zcGEoYXApCSgoKGNvbnN0IHVfY2hhciAqKSgoYXApKzEpKSsgIChhcCktPmFyX2hsbikKLSNkZWZpbmUgYXJfdGhhKGFwKQkoKChjb25zdCB1X2NoYXIgKikoKGFwKSsxKSkrICAoYXApLT5hcl9obG4rKGFwKS0+YXJfcGxuKQotI2RlZmluZSBhcl90cGEoYXApCSgoKGNvbnN0IHVfY2hhciAqKSgoYXApKzEpKSsyKihhcCktPmFyX2hsbisoYXApLT5hcl9wbG4pCi19OwotCi0jZGVmaW5lIEFSUF9IRFJMRU4JOAotCi0jZGVmaW5lIEhSRChhcCkgRVhUUkFDVF8xNkJJVFMoJihhcCktPmFyX2hyZCkKLSNkZWZpbmUgSExOKGFwKSAoKGFwKS0+YXJfaGxuKQotI2RlZmluZSBQTE4oYXApICgoYXApLT5hcl9wbG4pCi0jZGVmaW5lIE9QKGFwKSAgRVhUUkFDVF8xNkJJVFMoJihhcCktPmFyX29wKQotI2RlZmluZSBQUk8oYXApIEVYVFJBQ1RfMTZCSVRTKCYoYXApLT5hcl9wcm8pCi0jZGVmaW5lIFNIQShhcCkgKGFyX3NoYShhcCkpCi0jZGVmaW5lIFNQQShhcCkgKGFyX3NwYShhcCkpCi0jZGVmaW5lIFRIQShhcCkgKGFyX3RoYShhcCkpCi0jZGVmaW5lIFRQQShhcCkgKGFyX3RwYShhcCkpCi0KLS8qCi0gKiBBVE0gQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sLgotICoKLSAqIFNlZSBSRkMgMjIyNSBmb3IgcHJvdG9jb2wgZGVzY3JpcHRpb24uICBBVE1BUlAgcGFja2V0cyBhcmUgc2ltaWxhcgotICogdG8gQVJQIHBhY2tldHMsIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBubyBsZW5ndGggZmllbGRzIGZvciB0aGUKLSAqIHByb3RvY29sIGFkZHJlc3MgLSBpbnN0ZWFkLCB0aGVyZSBhcmUgdHlwZS9sZW5ndGggZmllbGRzIGZvcgotICogdGhlIEFUTSBudW1iZXIgYW5kIHN1YmFkZHJlc3MgLSBhbmQgdGhlIGhhcmR3YXJlIGFkZHJlc3NlcyBjb25zaXN0Ci0gKiBvZiBhbiBBVE0gbnVtYmVyIGFuZCBhbiBBVE0gc3ViYWRkcmVzcy4KLSAqLwotc3RydWN0CWF0bWFycF9wa3RoZHIgewotCXVfc2hvcnQJYWFyX2hyZDsJLyogZm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MgKi8KLSNkZWZpbmUgQVJQSFJEX0FUTTIyMjUJMTkJLyogQVRNIChSRkMgMjIyNSkgKi8KLQl1X3Nob3J0CWFhcl9wcm87CS8qIGZvcm1hdCBvZiBwcm90b2NvbCBhZGRyZXNzICovCi0JdV9jaGFyCWFhcl9zaHRsOwkvKiBsZW5ndGggb2Ygc291cmNlIEFUTSBudW1iZXIgKi8KLQl1X2NoYXIJYWFyX3NzdGw7CS8qIGxlbmd0aCBvZiBzb3VyY2UgQVRNIHN1YmFkZHJlc3MgKi8KLSNkZWZpbmUgQVRNQVJQX0lTX0UxNjQJMHg0MAkvKiBiaXQgaW4gdHlwZS9sZW5ndGggZm9yIEUuMTY0IGZvcm1hdCAqLwotI2RlZmluZSBBVE1BUlBfTEVOX01BU0sJMHgzRgkvKiBsZW5ndGggb2Yge3N1Yn1hZGRyZXNzIGluIHR5cGUvbGVuZ3RoICovCi0JdV9zaG9ydAlhYXJfb3A7CQkvKiBzYW1lIGFzIHJlZ3VsYXIgQVJQICovCi0jZGVmaW5lIEFUTUFSUE9QX05BSwkxMAkvKiBOQUsgKi8KLQl1X2NoYXIJYWFyX3NwbG47CS8qIGxlbmd0aCBvZiBzb3VyY2UgcHJvdG9jb2wgYWRkcmVzcyAqLwotCXVfY2hhcglhYXJfdGh0bDsJLyogbGVuZ3RoIG9mIHRhcmdldCBBVE0gbnVtYmVyICovCi0JdV9jaGFyCWFhcl90c3RsOwkvKiBsZW5ndGggb2YgdGFyZ2V0IEFUTSBzdWJhZGRyZXNzICovCi0JdV9jaGFyCWFhcl90cGxuOwkvKiBsZW5ndGggb2YgdGFyZ2V0IHByb3RvY29sIGFkZHJlc3MgKi8KLS8qCi0gKiBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdmFyaWFibGUgaW4gc2l6ZSwKLSAqIGFjY29yZGluZyB0byB0aGUgc2l6ZXMgYWJvdmUuCi0gKi8KLSNpZmRlZiBDT01NRU5UX09OTFkKLQl1X2NoYXIJYWFyX3NoYVtdOwkvKiBzb3VyY2UgQVRNIG51bWJlciAqLwotCXVfY2hhcglhYXJfc3NhW107CS8qIHNvdXJjZSBBVE0gc3ViYWRkcmVzcyAqLwotCXVfY2hhcglhYXJfc3BhW107CS8qIHNlbmRlciBwcm90b2NvbCBhZGRyZXNzICovCi0JdV9jaGFyCWFhcl90aGFbXTsJLyogdGFyZ2V0IEFUTSBudW1iZXIgKi8KLQl1X2NoYXIJYWFyX3RzYVtdOwkvKiB0YXJnZXQgQVRNIHN1YmFkZHJlc3MgKi8KLQl1X2NoYXIJYWFyX3RwYVtdOwkvKiB0YXJnZXQgcHJvdG9jb2wgYWRkcmVzcyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgQVRNSFJEKGFwKSAgRVhUUkFDVF8xNkJJVFMoJihhcCktPmFhcl9ocmQpCi0jZGVmaW5lIEFUTVNITE4oYXApICgoYXApLT5hYXJfc2h0bCAmIEFUTUFSUF9MRU5fTUFTSykKLSNkZWZpbmUgQVRNU1NMTihhcCkgKChhcCktPmFhcl9zc3RsICYgQVRNQVJQX0xFTl9NQVNLKQotI2RlZmluZSBBVE1TUExOKGFwKSAoKGFwKS0+YWFyX3NwbG4pCi0jZGVmaW5lIEFUTU9QKGFwKSAgIEVYVFJBQ1RfMTZCSVRTKCYoYXApLT5hYXJfb3ApCi0jZGVmaW5lIEFUTVBSTyhhcCkgIEVYVFJBQ1RfMTZCSVRTKCYoYXApLT5hYXJfcHJvKQotI2RlZmluZSBBVE1USExOKGFwKSAoKGFwKS0+YWFyX3RodGwgJiBBVE1BUlBfTEVOX01BU0spCi0jZGVmaW5lIEFUTVRTTE4oYXApICgoYXApLT5hYXJfdHN0bCAmIEFUTUFSUF9MRU5fTUFTSykKLSNkZWZpbmUgQVRNVFBMTihhcCkgKChhcCktPmFhcl90cGxuKQotI2RlZmluZSBhYXJfc2hhKGFwKQkoKGNvbnN0IHVfY2hhciAqKSgoYXApKzEpKQotI2RlZmluZSBhYXJfc3NhKGFwKQkoYWFyX3NoYShhcCkgKyBBVE1TSExOKGFwKSkKLSNkZWZpbmUgYWFyX3NwYShhcCkJKGFhcl9zc2EoYXApICsgQVRNU1NMTihhcCkpCi0jZGVmaW5lIGFhcl90aGEoYXApCShhYXJfc3BhKGFwKSArIEFUTVNQTE4oYXApKQotI2RlZmluZSBhYXJfdHNhKGFwKQkoYWFyX3RoYShhcCkgKyBBVE1USExOKGFwKSkKLSNkZWZpbmUgYWFyX3RwYShhcCkJKGFhcl90c2EoYXApICsgQVRNVFNMTihhcCkpCi19OwotCi0jZGVmaW5lIEFUTVNIQShhcCkgKGFhcl9zaGEoYXApKQotI2RlZmluZSBBVE1TU0EoYXApIChhYXJfc3NhKGFwKSkKLSNkZWZpbmUgQVRNU1BBKGFwKSAoYWFyX3NwYShhcCkpCi0jZGVmaW5lIEFUTVRIQShhcCkgKGFhcl90aGEoYXApKQotI2RlZmluZSBBVE1UU0EoYXApIChhYXJfdHNhKGFwKSkKLSNkZWZpbmUgQVRNVFBBKGFwKSAoYWFyX3RwYShhcCkpCi0KLXN0YXRpYyB1X2NoYXIgZXplcm9bNl07Ci0KLXN0YXRpYyB2b2lkCi1hdG1hcnBfYWRkcl9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywKLQkJICBjb25zdCB1X2NoYXIgKmhhLCB1X2ludCBoYV9sZW4sIGNvbnN0IHVfY2hhciAqc3JjYSwKLSAgICB1X2ludCBzcmNhX2xlbikKLXsKLQlpZiAoaGFfbGVuID09IDApCi0JCU5EX1BSSU5UKChuZG8sICI8Tm8gYWRkcmVzcz4iKSk7Ci0JZWxzZSB7Ci0JCU5EX1BSSU5UKChuZG8sICIlcyIsIGxpbmthZGRyX3N0cmluZyhoYSwgaGFfbGVuKSkpOwotCQlpZiAoc3JjYV9sZW4gIT0gMCkgCi0JCQlORF9QUklOVCgobmRvLCAiLCVzIiwKLQkJCQkgIGxpbmthZGRyX3N0cmluZyhzcmNhLCBzcmNhX2xlbikpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hdG1hcnBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JICAgICBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbikKLXsKLQljb25zdCBzdHJ1Y3QgYXRtYXJwX3BrdGhkciAqYXA7Ci0JdV9zaG9ydCBwcm8sIGhyZCwgb3A7Ci0KLQlhcCA9IChjb25zdCBzdHJ1Y3QgYXRtYXJwX3BrdGhkciAqKWJwOwotCU5EX1RDSEVDSygqYXApOwotCi0JaHJkID0gQVRNSFJEKGFwKTsKLQlwcm8gPSBBVE1QUk8oYXApOwotCW9wID0gQVRNT1AoYXApOwotCi0JaWYgKCFORF9UVEVTVDIoKmFhcl90cGEoYXApLCBBVE1UUExOKGFwKSkpIHsKLQkJTkRfUFJJTlQoKG5kbywgInRydW5jYXRlZC1hdG1hcnAiKSk7Ci0JCU5EX0RFRkFVTFRQUklOVCgoY29uc3QgdV9jaGFyICopYXAsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKHBybyAhPSBFVEhFUlRZUEVfSVAgJiYgcHJvICE9IEVUSEVSVFlQRV9UUkFJTCkgfHwKLQkgICAgQVRNU1BMTihhcCkgIT0gNCB8fCBBVE1UUExOKGFwKSAhPSA0KSB7Ci0JCU5EX1BSSU5UKChuZG8sICJhdG1hcnAtIyVkIGZvciBwcm90byAjJWQgKCVkLyVkKSBoYXJkd2FyZSAjJWQiLAotCQkJICBvcCwgcHJvLCBBVE1TUExOKGFwKSwgQVRNVFBMTihhcCksIGhyZCkpOwotCQlyZXR1cm47Ci0JfQotCWlmIChwcm8gPT0gRVRIRVJUWVBFX1RSQUlMKQotCQlORF9QUklOVCgobmRvLCAidHJhaWxlci0iKSk7Ci0Jc3dpdGNoIChvcCkgewotCi0JY2FzZSBBUlBPUF9SRVFVRVNUOgotCQlORF9QUklOVCgobmRvLCAiYXJwIHdoby1oYXMgJXMiLCBpcGFkZHJfc3RyaW5nKEFUTVRQQShhcCkpKSk7Ci0JCWlmIChBVE1USExOKGFwKSAhPSAwKSB7Ci0JCQlORF9QUklOVCgobmRvLCAiICgiKSk7Ci0JCQlhdG1hcnBfYWRkcl9wcmludChuZG8sIEFUTVRIQShhcCksIEFUTVRITE4oYXApLAotCQkJICAgIEFUTVRTQShhcCksIEFUTVRTTE4oYXApKTsKLQkJCU5EX1BSSU5UKChuZG8sICIpIikpOwotCQl9Ci0JCU5EX1BSSU5UKChuZG8sICIgdGVsbCAlcyIsIGlwYWRkcl9zdHJpbmcoQVRNU1BBKGFwKSkpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSUE9QX1JFUExZOgotCQlORF9QUklOVCgobmRvLCAiYXJwIHJlcGx5ICVzIiwgaXBhZGRyX3N0cmluZyhBVE1TUEEoYXApKSkpOwotCQlORF9QUklOVCgobmRvLCAiIGlzLWF0ICIpKTsKLQkJYXRtYXJwX2FkZHJfcHJpbnQobmRvLCBBVE1TSEEoYXApLCBBVE1TSExOKGFwKSwgQVRNU1NBKGFwKSwKLQkJICAgIEFUTVNTTE4oYXApKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSUE9QX0lOVlJFUVVFU1Q6Ci0JCU5EX1BSSU5UKChuZG8sICJpbnZhcnAgd2hvLWlzICIpKTsKLQkJYXRtYXJwX2FkZHJfcHJpbnQobmRvLCBBVE1USEEoYXApLCBBVE1USExOKGFwKSwgQVRNVFNBKGFwKSwKLQkJICAgIEFUTVRTTE4oYXApKTsKLQkJTkRfUFJJTlQoKG5kbywgIiB0ZWxsICIpKTsKLQkJYXRtYXJwX2FkZHJfcHJpbnQobmRvLCBBVE1TSEEoYXApLCBBVE1TSExOKGFwKSwgQVRNU1NBKGFwKSwKLQkJICAgIEFUTVNTTE4oYXApKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSUE9QX0lOVlJFUExZOgotCQlORF9QUklOVCgobmRvLCAiaW52YXJwIHJlcGx5ICIpKTsKLQkJYXRtYXJwX2FkZHJfcHJpbnQobmRvLCBBVE1TSEEoYXApLCBBVE1TSExOKGFwKSwgQVRNU1NBKGFwKSwKLQkJICAgIEFUTVNTTE4oYXApKTsKLQkJTkRfUFJJTlQoKG5kbywgIiBhdCAlcyIsIGlwYWRkcl9zdHJpbmcoQVRNU1BBKGFwKSkpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFUTUFSUE9QX05BSzoKLQkJTkRfUFJJTlQoKG5kbywgIm5hayByZXBseSBmb3IgJXMiLAotCQkJICBpcGFkZHJfc3RyaW5nKEFUTVNQQShhcCkpKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTkRfUFJJTlQoKG5kbywgImF0bWFycC0jJWQiLCBvcCkpOwotCQlORF9ERUZBVUxUUFJJTlQoKGNvbnN0IHVfY2hhciAqKWFwLCBjYXBsZW4pOwotCQlyZXR1cm47Ci0JfQotCXJldHVybjsKLXRydW5jOgotCU5EX1BSSU5UKChuZG8sICJbfGF0bWFycF0iKSk7Ci19Ci0KLXZvaWQKLWFycF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywKLQkgIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQotewotCWNvbnN0IHN0cnVjdCBhcnBfcGt0aGRyICphcDsKLQl1X3Nob3J0IHBybywgaHJkLCBvcDsKLQotCWFwID0gKGNvbnN0IHN0cnVjdCBhcnBfcGt0aGRyICopYnA7Ci0JTkRfVENIRUNLKCphcCk7Ci0JaHJkID0gSFJEKGFwKTsKLQlpZiAoaHJkID09IEFSUEhSRF9BVE0yMjI1KSB7Ci0JICAgICAgICBhdG1hcnBfcHJpbnQobmRvLCBicCwgbGVuZ3RoLCBjYXBsZW4pOwotCQlyZXR1cm47Ci0JfQotCXBybyA9IFBSTyhhcCk7Ci0Jb3AgPSBPUChhcCk7Ci0KLQlpZiAoIU5EX1RURVNUMigqYXJfdHBhKGFwKSwgUExOKGFwKSkpIHsKLQkJTkRfUFJJTlQoKG5kbywgInRydW5jYXRlZC1hcnAiKSk7Ci0JCU5EX0RFRkFVTFRQUklOVCgoY29uc3QgdV9jaGFyICopYXAsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoKHBybyAhPSBFVEhFUlRZUEVfSVAgJiYgcHJvICE9IEVUSEVSVFlQRV9UUkFJTCkgfHwKLQkgICAgUExOKGFwKSAhPSA0IHx8IEhMTihhcCkgPT0gMCkgewotCQlORF9QUklOVCgobmRvLCAiYXJwLSMlZCBmb3IgcHJvdG8gIyVkICglZCkgaGFyZHdhcmUgIyVkICglZCkiLAotCQkJICBvcCwgcHJvLCBQTE4oYXApLCBocmQsIEhMTihhcCkpKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocHJvID09IEVUSEVSVFlQRV9UUkFJTCkKLQkJTkRfUFJJTlQoKG5kbywgInRyYWlsZXItIikpOwotCXN3aXRjaCAob3ApIHsKLQotCWNhc2UgQVJQT1BfUkVRVUVTVDoKLQkJTkRfUFJJTlQoKG5kbywgImFycCB3aG8taGFzICVzIiwgaXBhZGRyX3N0cmluZyhUUEEoYXApKSkpOwotCQlpZiAobWVtY21wKChjb25zdCBjaGFyICopZXplcm8sIChjb25zdCBjaGFyICopVEhBKGFwKSwgSExOKGFwKSkgIT0gMCkKLQkJCU5EX1BSSU5UKChuZG8sICIgKCVzKSIsCi0JCQkJICBsaW5rYWRkcl9zdHJpbmcoVEhBKGFwKSwgSExOKGFwKSkpKTsKLQkJTkRfUFJJTlQoKG5kbywgIiB0ZWxsICVzIiwgaXBhZGRyX3N0cmluZyhTUEEoYXApKSkpOwotCQlicmVhazsKLQotCWNhc2UgQVJQT1BfUkVQTFk6Ci0JCU5EX1BSSU5UKChuZG8sICJhcnAgcmVwbHkgJXMiLCBpcGFkZHJfc3RyaW5nKFNQQShhcCkpKSk7Ci0JCU5EX1BSSU5UKChuZG8sICIgaXMtYXQgJXMiLCBsaW5rYWRkcl9zdHJpbmcoU0hBKGFwKSwgSExOKGFwKSkpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSUE9QX1JFVlJFUVVFU1Q6Ci0JCU5EX1BSSU5UKChuZG8sICJyYXJwIHdoby1pcyAlcyB0ZWxsICVzIiwKLQkJCSAgbGlua2FkZHJfc3RyaW5nKFRIQShhcCksIEhMTihhcCkpLAotCQkJICBsaW5rYWRkcl9zdHJpbmcoU0hBKGFwKSwgSExOKGFwKSkpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFSUE9QX1JFVlJFUExZOgotCQlORF9QUklOVCgobmRvLCAicmFycCByZXBseSAlcyBhdCAlcyIsCi0JCQkgIGxpbmthZGRyX3N0cmluZyhUSEEoYXApLCBITE4oYXApKSwKLQkJCSAgaXBhZGRyX3N0cmluZyhUUEEoYXApKSkpOwotCQlicmVhazsKLQotCWNhc2UgQVJQT1BfSU5WUkVRVUVTVDoKLQkJTkRfUFJJTlQoKG5kbywgImludmFycCB3aG8taXMgJXMgdGVsbCAlcyIsCi0JCQkgIGxpbmthZGRyX3N0cmluZyhUSEEoYXApLCBITE4oYXApKSwKLQkJCSAgbGlua2FkZHJfc3RyaW5nKFNIQShhcCksIEhMTihhcCkpKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBUlBPUF9JTlZSRVBMWToKLQkJTkRfUFJJTlQoKG5kbywiaW52YXJwIHJlcGx5ICVzIGF0ICVzIiwKLQkJCSAgbGlua2FkZHJfc3RyaW5nKFRIQShhcCksIEhMTihhcCkpLAotCQkJICBpcGFkZHJfc3RyaW5nKFRQQShhcCkpKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJTkRfUFJJTlQoKG5kbywgImFycC0jJWQiLCBvcCkpOwotCQlORF9ERUZBVUxUUFJJTlQoKGNvbnN0IHVfY2hhciAqKWFwLCBjYXBsZW4pOwotCQlyZXR1cm47Ci0JfQotCWlmIChocmQgIT0gQVJQSFJEX0VUSEVSKQotCQlORF9QUklOVCgobmRvLCAiIGhhcmR3YXJlICMlZCIsIGhyZCkpOwotCXJldHVybjsKLXRydW5jOgotCU5EX1BSSU5UKChuZG8sICJbfGFycF0iKSk7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiBic2QKLSAqIEVuZDoKLSAqLwotCmRpZmYgLS1naXQgYS9wcmludC1hc2NpaS5jIGIvcHJpbnQtYXNjaWkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q0OGVkZC4uMDAwMDAwMAotLS0gYS9wcmludC1hc2NpaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qCSROZXRCU0Q6IHByaW50LWFzY2lpLmMsdiAxLjEgMTk5OS8wOS8zMCAxNDo0OToxMiBzamcgRXhwICQgCSovCi0KLS8qLQotICogQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk4IFRoZSBOZXRCU0QgRm91bmRhdGlvbiwgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIFRoZSBOZXRCU0QgRm91bmRhdGlvbgotICogYnkgQWxhbiBCYXJyZXR0IGFuZCBTaW1vbiBKLiBHZXJyYXR5LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECi0gKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCi0gKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1hc2NpaS5jLHYgMS4xNi4yLjEgMjAwNS8wNy8wNiAyMDo1NDo0OSBndXkgRXhwICQiOwotI2VuZGlmCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLSNkZWZpbmUgQVNDSUlfTElORUxFTkdUSCAzMDAKLSNkZWZpbmUgSEVYRFVNUF9CWVRFU19QRVJfTElORSAxNgotI2RlZmluZSBIRVhEVU1QX1NIT1JUU19QRVJfTElORSAoSEVYRFVNUF9CWVRFU19QRVJfTElORSAvIDIpCi0jZGVmaW5lIEhFWERVTVBfSEVYU1RVRkZfUEVSX1NIT1JUIDUgLyogNCBoZXggZGlnaXRzIGFuZCBhIHNwYWNlICovCi0jZGVmaW5lIEhFWERVTVBfSEVYU1RVRkZfUEVSX0xJTkUgXAotCQkoSEVYRFVNUF9IRVhTVFVGRl9QRVJfU0hPUlQgKiBIRVhEVU1QX1NIT1JUU19QRVJfTElORSkKLQotdm9pZAotYXNjaWlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGludCBzOwotCi0JcHV0Y2hhcignXG4nKTsKLQl3aGlsZSAobGVuZ3RoID4gMCkgewotCQlzID0gKmNwKys7Ci0JCWxlbmd0aC0tOwotCQlpZiAoIWlzZ3JhcGgocykgJiYKLQkJICAgIChzICE9ICdcdCcgJiYgcyAhPSAnICcgJiYgcyAhPSAnXG4nICYmIHMgIT0gJ1xyJykpCi0JCQlwdXRjaGFyKCcuJyk7Ci0JCWVsc2UKLQkJCXB1dGNoYXIocyk7Ci0JfQotfQotCi12b2lkCi1oZXhfYW5kX2FzY2lpX3ByaW50X3dpdGhfb2Zmc2V0KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmlkZW50LAotICAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCwgcmVnaXN0ZXIgdV9pbnQgb3NldCkKLXsKLQlyZWdpc3RlciB1X2ludCBpOwotCXJlZ2lzdGVyIGludCBzMSwgczI7Ci0JcmVnaXN0ZXIgaW50IG5zaG9ydHM7Ci0JY2hhciBoZXhzdHVmZltIRVhEVU1QX1NIT1JUU19QRVJfTElORSpIRVhEVU1QX0hFWFNUVUZGX1BFUl9TSE9SVCsxXSwgKmhzcDsKLQljaGFyIGFzY2lpc3R1ZmZbQVNDSUlfTElORUxFTkdUSCsxXSwgKmFzcDsKLQotCW5zaG9ydHMgPSBsZW5ndGggLyBzaXplb2YodV9zaG9ydCk7Ci0JaSA9IDA7Ci0JaHNwID0gaGV4c3R1ZmY7IGFzcCA9IGFzY2lpc3R1ZmY7Ci0Jd2hpbGUgKC0tbnNob3J0cyA+PSAwKSB7Ci0JCXMxID0gKmNwKys7Ci0JCXMyID0gKmNwKys7Ci0JCSh2b2lkKXNucHJpbnRmKGhzcCwgc2l6ZW9mKGhleHN0dWZmKSAtIChoc3AgLSBoZXhzdHVmZiksCi0JCSAgICAiICUwMnglMDJ4IiwgczEsIHMyKTsKLQkJaHNwICs9IEhFWERVTVBfSEVYU1RVRkZfUEVSX1NIT1JUOwotCQkqKGFzcCsrKSA9IChpc2dyYXBoKHMxKSA/IHMxIDogJy4nKTsKLQkJKihhc3ArKykgPSAoaXNncmFwaChzMikgPyBzMiA6ICcuJyk7Ci0JCWkrKzsKLQkJaWYgKGkgPj0gSEVYRFVNUF9TSE9SVFNfUEVSX0xJTkUpIHsKLQkJCSpoc3AgPSAqYXNwID0gJ1wwJzsKLQkJCSh2b2lkKXByaW50ZigiJXMweCUwNHg6ICUtKnMgICVzIiwKLQkJCSAgICBpZGVudCwgb3NldCwgSEVYRFVNUF9IRVhTVFVGRl9QRVJfTElORSwKLQkJCSAgICBoZXhzdHVmZiwgYXNjaWlzdHVmZik7Ci0JCQlpID0gMDsgaHNwID0gaGV4c3R1ZmY7IGFzcCA9IGFzY2lpc3R1ZmY7Ci0JCQlvc2V0ICs9IEhFWERVTVBfQllURVNfUEVSX0xJTkU7Ci0JCX0KLQl9Ci0JaWYgKGxlbmd0aCAmIDEpIHsKLQkJczEgPSAqY3ArKzsKLQkJKHZvaWQpc25wcmludGYoaHNwLCBzaXplb2YoaGV4c3R1ZmYpIC0gKGhzcCAtIGhleHN0dWZmKSwKLQkJICAgICIgJTAyeCIsIHMxKTsKLQkJaHNwICs9IDM7Ci0JCSooYXNwKyspID0gKGlzZ3JhcGgoczEpID8gczEgOiAnLicpOwotCQkrK2k7Ci0JfQotCWlmIChpID4gMCkgewotCQkqaHNwID0gKmFzcCA9ICdcMCc7Ci0JCSh2b2lkKXByaW50ZigiJXMweCUwNHg6ICUtKnMgICVzIiwKLQkJICAgICBpZGVudCwgb3NldCwgSEVYRFVNUF9IRVhTVFVGRl9QRVJfTElORSwKLQkJICAgICBoZXhzdHVmZiwgYXNjaWlzdHVmZik7Ci0JfQotfQotCi12b2lkCi1oZXhfYW5kX2FzY2lpX3ByaW50KHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmlkZW50LCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLAotICAgIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKLXsKLQloZXhfYW5kX2FzY2lpX3ByaW50X3dpdGhfb2Zmc2V0KGlkZW50LCBjcCwgbGVuZ3RoLCAwKTsKLX0KLQotLyoKLSAqIHRlbG5ldF9wcmludCgpIHdhbnRzIHRoaXMuICBJdCBpcyBlc3NlbnRpYWxseSBkZWZhdWx0X3ByaW50X3VuYWxpZ25lZCgpCi0gKi8KLXZvaWQKLWhleF9wcmludF93aXRoX29mZnNldChyZWdpc3RlciBjb25zdCBjaGFyICppZGVudCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLAotCQkgICAgICByZWdpc3RlciB1X2ludCBvc2V0KQotewotCXJlZ2lzdGVyIHVfaW50IGksIHM7Ci0JcmVnaXN0ZXIgaW50IG5zaG9ydHM7Ci0KLQluc2hvcnRzID0gKHVfaW50KSBsZW5ndGggLyBzaXplb2YodV9zaG9ydCk7Ci0JaSA9IDA7Ci0Jd2hpbGUgKC0tbnNob3J0cyA+PSAwKSB7Ci0JCWlmICgoaSsrICUgOCkgPT0gMCkgewotCQkJKHZvaWQpcHJpbnRmKCIlczB4JTA0eDogIiwgaWRlbnQsIG9zZXQpOwotCQkJb3NldCArPSBIRVhEVU1QX0JZVEVTX1BFUl9MSU5FOwotCQl9Ci0JCXMgPSAqY3ArKzsKLQkJKHZvaWQpcHJpbnRmKCIgJTAyeCUwMngiLCBzLCAqY3ArKyk7Ci0JfQotCWlmIChsZW5ndGggJiAxKSB7Ci0JCWlmICgoaSAlIDgpID09IDApCi0JCQkodm9pZClwcmludGYoIiVzMHglMDR4OiAiLCBpZGVudCwgb3NldCk7Ci0JCSh2b2lkKXByaW50ZigiICUwMngiLCAqY3ApOwotCX0KLX0KLQotLyoKLSAqIGp1c3QgZm9yIGNvbXBsZXRlbmVzcwotICovCi12b2lkCi1oZXhfcHJpbnQocmVnaXN0ZXIgY29uc3QgY2hhciAqaWRlbnQsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKLXsKLQloZXhfcHJpbnRfd2l0aF9vZmZzZXQoaWRlbnQsIGNwLCBsZW5ndGgsIDApOwotfQotCi0jaWZkZWYgTUFJTgotaW50Ci1tYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0JaGV4X3ByaW50KCJcblx0IiwgIkhlbGxvLCBXb3JsZCFcbiIsIDE0KTsKLQlwcmludGYoIlxuIik7Ci0JaGV4X2FuZF9hc2NpaV9wcmludCgiXG5cdCIsICJIZWxsbywgV29ybGQhXG4iLCAxNCk7Ci0JcHJpbnRmKCJcbiIpOwotCWFzY2lpX3ByaW50KCJIZWxsbywgV29ybGQhXG4iLCAxNCk7Ci0JcHJpbnRmKCJcbiIpOwotI2RlZmluZSBUTVNHICJOb3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudC4uLlxuIgotCWhleF9wcmludF93aXRoX29mZnNldCgiXG5cdCIsIFRNU0csIHNpemVvZihUTVNHKSAtIDEsIDB4MTAwKTsKLQlwcmludGYoIlxuIik7Ci0JaGV4X2FuZF9hc2NpaV9wcmludF93aXRoX29mZnNldCgiXG5cdCIsIFRNU0csIHNpemVvZihUTVNHKSAtIDEsIDB4MTAwKTsKLQlwcmludGYoIlxuIik7Ci0JZXhpdCgwKTsKLX0KLSNlbmRpZiAvKiBNQUlOICovCmRpZmYgLS1naXQgYS9wcmludC1hdGFsay5jIGIvcHJpbnQtYXRhbGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmNDVhMy4uMDAwMDAwMAotLS0gYS9wcmludC1hdGFsay5jCisrKyAvZGV2L251bGwKQEAgLTEsNjI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBGb3JtYXQgYW5kIHByaW50IEFwcGxlVGFsayBwYWNrZXRzLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWF0YWxrLmMsdiAxLjgxIDIwMDQvMDUvMDEgMDk6NDE6NTAgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotI2luY2x1ZGUgImFwcGxldGFsay5oIgotCi1zdGF0aWMgc3RydWN0IHRvayB0eXBlMnN0cltdID0gewotCXsgZGRwUlRNUCwJCSJydG1wIiB9LAotCXsgZGRwUlRNUHJlcXVlc3QsCSJydG1wUmVxIiB9LAotCXsgZGRwRUNITywJCSJlY2hvIiB9LAotCXsgZGRwSVAsCQkiSVAiIH0sCi0JeyBkZHBBUlAsCQkiQVJQIiB9LAotCXsgZGRwS0xBUCwJCSJLTEFQIiB9LAotCXsgMCwJCQlOVUxMIH0KLX07Ci0KLXN0cnVjdCBhYXJwIHsKLQl1X2ludDE2X3QJaHR5cGUsIHB0eXBlOwotCXVfaW50OF90CWhhbGVuLCBwYWxlbjsKLQl1X2ludDE2X3QJb3A7Ci0JdV9pbnQ4X3QJaHNhZGRyWzZdOwotCXVfaW50OF90CXBzYWRkcls0XTsKLQl1X2ludDhfdAloZGFkZHJbNl07Ci0JdV9pbnQ4X3QJcGRhZGRyWzRdOwotfTsKLQotc3RhdGljIGNoYXIgdHN0cltdID0gIlt8YXRhbGtdIjsKLQotc3RhdGljIHZvaWQgYXRwX3ByaW50KGNvbnN0IHN0cnVjdCBhdEFUUCAqLCB1X2ludCk7Ci1zdGF0aWMgdm9pZCBhdHBfYml0bWFwX3ByaW50KHVfY2hhcik7Ci1zdGF0aWMgdm9pZCBuYnBfcHJpbnQoY29uc3Qgc3RydWN0IGF0TkJQICosIHVfaW50LCB1X3Nob3J0LCB1X2NoYXIsIHVfY2hhcik7Ci1zdGF0aWMgY29uc3QgY2hhciAqcHJpbnRfY3N0cmluZyhjb25zdCBjaGFyICosIGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqbmJwX3R1cGxlX3ByaW50KGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICosCi0JCQkJCQljb25zdCB1X2NoYXIgKiwKLQkJCQkJCXVfc2hvcnQsIHVfY2hhciwgdV9jaGFyKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqbmJwX25hbWVfcHJpbnQoY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKiwKLQkJCQkJICAgICAgIGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyBjb25zdCBjaGFyICphdGFkZHJfc3RyaW5nKHVfc2hvcnQsIHVfY2hhcik7Ci1zdGF0aWMgdm9pZCBkZHBfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50LCBpbnQsIHVfc2hvcnQsIHVfY2hhciwgdV9jaGFyKTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZHBza3Rfc3RyaW5nKGludCk7Ci0KLS8qCi0gKiBQcmludCBMTEFQIHBhY2tldHMgcmVjZWl2ZWQgb24gYSBwaHlzaWNhbCBMb2NhbFRhbGsgaW50ZXJmYWNlLgotICovCi11X2ludAotbHRhbGtfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCi17Ci0JcmV0dXJuIChsbGFwX3ByaW50KHAsIGgtPmNhcGxlbikpOwotfQotCi0vKgotICogUHJpbnQgQXBwbGVUYWxrIExMQVAgcGFja2V0cy4KLSAqLwotdV9pbnQKLWxsYXBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBMQVAgKmxwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhdEREUCAqZHA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0U2hvcnRERFAgKnNkcDsKLQl1X3Nob3J0IHNuZXQ7Ci0JdV9pbnQgaGRybGVuOwotCi0JLyoKLQkgKiBPdXIgcGFja2V0IGlzIG9uIGEgNC1ieXRlIGJvdW5kYXJ5LCBhcyB3ZSdyZSBlaXRoZXIgY2FsbGVkCi0JICogZGlyZWN0bHkgZnJvbSBhIHRvcC1sZXZlbCBsaW5rLWxheWVyIHByaW50ZXIgKGx0YWxrX2lmX3ByaW50KQotCSAqIG9yIGZyb20gdGhlIFVEUCBwcmludGVyLiAgVGhlIExMQVArRERQIGhlYWRlciBpcyBhIG11bHRpcGxlCi0JICogb2YgNCBieXRlcyBpbiBsZW5ndGgsIHNvIHRoZSBERFAgcGF5bG9hZCBpcyBhbHNvIG9uIGEgNC1ieXRlCi0JICogYm91bmRhcnksIGFuZCB3ZSBkb24ndCBuZWVkIHRvIGFsaWduIGl0IGJlZm9yZSBjYWxsaW5nCi0JICogImRkcF9wcmludCgpIi4KLQkgKi8KLQlscCA9IChjb25zdCBzdHJ1Y3QgTEFQICopYnA7Ci0JYnAgKz0gc2l6ZW9mKCpscCk7Ci0JbGVuZ3RoIC09IHNpemVvZigqbHApOwotCWhkcmxlbiA9IHNpemVvZigqbHApOwotCXN3aXRjaCAobHAtPnR5cGUpIHsKLQotCWNhc2UgbGFwU2hvcnRERFA6Ci0JCWlmIChsZW5ndGggPCBkZHBTU2l6ZSkgewotCQkJKHZvaWQpcHJpbnRmKCIgW3xzZGRwICVkXSIsIGxlbmd0aCk7Ci0JCQlyZXR1cm4gKGxlbmd0aCk7Ci0JCX0KLQkJc2RwID0gKGNvbnN0IHN0cnVjdCBhdFNob3J0RERQICopYnA7Ci0JCXByaW50ZigiJXMuJXMiLAotCQkgICAgYXRhZGRyX3N0cmluZygwLCBscC0+c3JjKSwgZGRwc2t0X3N0cmluZyhzZHAtPnNyY1NrdCkpOwotCQlwcmludGYoIiA+ICVzLiVzOiIsCi0JCSAgICBhdGFkZHJfc3RyaW5nKDAsIGxwLT5kc3QpLCBkZHBza3Rfc3RyaW5nKHNkcC0+ZHN0U2t0KSk7Ci0JCWJwICs9IGRkcFNTaXplOwotCQlsZW5ndGggLT0gZGRwU1NpemU7Ci0JCWhkcmxlbiArPSBkZHBTU2l6ZTsKLQkJZGRwX3ByaW50KGJwLCBsZW5ndGgsIHNkcC0+dHlwZSwgMCwgbHAtPnNyYywgc2RwLT5zcmNTa3QpOwotCQlicmVhazsKLQotCWNhc2UgbGFwRERQOgotCQlpZiAobGVuZ3RoIDwgZGRwU2l6ZSkgewotCQkJKHZvaWQpcHJpbnRmKCIgW3xkZHAgJWRdIiwgbGVuZ3RoKTsKLQkJCXJldHVybiAobGVuZ3RoKTsKLQkJfQotCQlkcCA9IChjb25zdCBzdHJ1Y3QgYXRERFAgKilicDsKLQkJc25ldCA9IEVYVFJBQ1RfMTZCSVRTKCZkcC0+c3JjTmV0KTsKLQkJcHJpbnRmKCIlcy4lcyIsIGF0YWRkcl9zdHJpbmcoc25ldCwgZHAtPnNyY05vZGUpLAotCQkgICAgZGRwc2t0X3N0cmluZyhkcC0+c3JjU2t0KSk7Ci0JCXByaW50ZigiID4gJXMuJXM6IiwKLQkJICAgIGF0YWRkcl9zdHJpbmcoRVhUUkFDVF8xNkJJVFMoJmRwLT5kc3ROZXQpLCBkcC0+ZHN0Tm9kZSksCi0JCSAgICBkZHBza3Rfc3RyaW5nKGRwLT5kc3RTa3QpKTsKLQkJYnAgKz0gZGRwU2l6ZTsKLQkJbGVuZ3RoIC09IGRkcFNpemU7Ci0JCWhkcmxlbiArPSBkZHBTaXplOwotCQlkZHBfcHJpbnQoYnAsIGxlbmd0aCwgZHAtPnR5cGUsIHNuZXQsIGRwLT5zcmNOb2RlLCBkcC0+c3JjU2t0KTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBub3RkZWYKLQljYXNlIGxhcEtMQVA6Ci0JCWtsYXBfcHJpbnQoYnAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0KLQlkZWZhdWx0OgotCQlwcmludGYoIiVkID4gJWQgYXQtbGFwIyVkICVkIiwKLQkJICAgIGxwLT5zcmMsIGxwLT5kc3QsIGxwLT50eXBlLCBsZW5ndGgpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIChoZHJsZW4pOwotfQotCi0vKgotICogUHJpbnQgRXRoZXJUYWxrL1Rva2VuVGFsayBwYWNrZXRzIChvciBGRERJVGFsaywgb3Igd2hhdGV2ZXIgaXQncyBjYWxsZWQKLSAqIHdoZW4gaXQgcnVucyBvdmVyIEZEREk7IHllcywgSSd2ZSBzZWVuIEZEREkgY2FwdHVyZXMgd2l0aCBBcHBsZVRhbGsKLSAqIHBhY2tldHMgaW4gdGhlbSkuCi0gKi8KLXZvaWQKLWF0YWxrX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXRERFAgKmRwOwotCXVfc2hvcnQgc25ldDsKLQotICAgICAgICBpZighZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIkFUICIpOwotCi0JaWYgKGxlbmd0aCA8IGRkcFNpemUpIHsKLQkJKHZvaWQpcHJpbnRmKCIgW3xkZHAgJWRdIiwgbGVuZ3RoKTsKLQkJcmV0dXJuOwotCX0KLQlkcCA9IChjb25zdCBzdHJ1Y3QgYXRERFAgKilicDsKLQlzbmV0ID0gRVhUUkFDVF8xNkJJVFMoJmRwLT5zcmNOZXQpOwotCXByaW50ZigiJXMuJXMiLCBhdGFkZHJfc3RyaW5nKHNuZXQsIGRwLT5zcmNOb2RlKSwKLQkgICAgICAgZGRwc2t0X3N0cmluZyhkcC0+c3JjU2t0KSk7Ci0JcHJpbnRmKCIgPiAlcy4lczogIiwKLQkgICAgICAgYXRhZGRyX3N0cmluZyhFWFRSQUNUXzE2QklUUygmZHAtPmRzdE5ldCksIGRwLT5kc3ROb2RlKSwKLQkgICAgICAgZGRwc2t0X3N0cmluZyhkcC0+ZHN0U2t0KSk7Ci0JYnAgKz0gZGRwU2l6ZTsKLQlsZW5ndGggLT0gZGRwU2l6ZTsKLQlkZHBfcHJpbnQoYnAsIGxlbmd0aCwgZHAtPnR5cGUsIHNuZXQsIGRwLT5zcmNOb2RlLCBkcC0+c3JjU2t0KTsKLX0KLQotLyogWFhYIHNob3VsZCBwcm9iYWJseSBwYXNzIGluIHRoZSBzbmFwIGhlYWRlciBhbmQgZG8gY2hlY2tzIGxpa2UgYXJwX3ByaW50KCkgKi8KLXZvaWQKLWFhcnBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhYXJwICphcDsKLQotI2RlZmluZSBBVChtZW1iZXIpIGF0YWRkcl9zdHJpbmcoKGFwLT5tZW1iZXJbMV08PDgpfGFwLT5tZW1iZXJbMl0sYXAtPm1lbWJlclszXSkKLQotCXByaW50ZigiYWFycCAiKTsKLQlhcCA9IChjb25zdCBzdHJ1Y3QgYWFycCAqKWJwOwotCWlmIChFWFRSQUNUXzE2QklUUygmYXAtPmh0eXBlKSA9PSAxICYmCi0JICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+cHR5cGUpID09IEVUSEVSVFlQRV9BVEFMSyAmJgotCSAgICBhcC0+aGFsZW4gPT0gNiAmJiBhcC0+cGFsZW4gPT0gNCApCi0JCXN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJmFwLT5vcCkpIHsKLQotCQljYXNlIDE6CQkJCS8qIHJlcXVlc3QgKi8KLQkJCSh2b2lkKXByaW50Zigid2hvLWhhcyAlcyB0ZWxsICVzIiwKLQkJCSAgICBBVChwZGFkZHIpLCBBVChwc2FkZHIpKTsKLQkJCXJldHVybjsKLQotCQljYXNlIDI6CQkJCS8qIHJlc3BvbnNlICovCi0JCQkodm9pZClwcmludGYoInJlcGx5ICVzIGlzLWF0ICVzIiwKLQkJCSAgICBBVChwZGFkZHIpLCBldGhlcmFkZHJfc3RyaW5nKGFwLT5oZGFkZHIpKTsKLQkJCXJldHVybjsKLQotCQljYXNlIDM6CQkJCS8qIHByb2JlIChveSEpICovCi0JCQkodm9pZClwcmludGYoInByb2JlICVzIHRlbGwgJXMiLAotCQkJICAgIEFUKHBkYWRkciksIEFUKHBzYWRkcikpOwotCQkJcmV0dXJuOwotCQl9Ci0JKHZvaWQpcHJpbnRmKCJsZW4gJXUgb3AgJXUgaHR5cGUgJXUgcHR5cGUgJSN4IGhhbGVuICV1IHBhbGVuICV1IiwKLQkgICAgbGVuZ3RoLCBFWFRSQUNUXzE2QklUUygmYXAtPm9wKSwgRVhUUkFDVF8xNkJJVFMoJmFwLT5odHlwZSksCi0JICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+cHR5cGUpLCBhcC0+aGFsZW4sIGFwLT5wYWxlbik7Ci19Ci0KLS8qCi0gKiBQcmludCBBcHBsZVRhbGsgRGF0YWdyYW0gRGVsaXZlcnkgUHJvdG9jb2wgcGFja2V0cy4KLSAqLwotc3RhdGljIHZvaWQKLWRkcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsIHJlZ2lzdGVyIGludCB0LAotCSAgcmVnaXN0ZXIgdV9zaG9ydCBzbmV0LCByZWdpc3RlciB1X2NoYXIgc25vZGUsIHVfY2hhciBza3QpCi17Ci0KLQlzd2l0Y2ggKHQpIHsKLQotCWNhc2UgZGRwTkJQOgotCQluYnBfcHJpbnQoKGNvbnN0IHN0cnVjdCBhdE5CUCAqKWJwLCBsZW5ndGgsIHNuZXQsIHNub2RlLCBza3QpOwotCQlicmVhazsKLQotCWNhc2UgZGRwQVRQOgotCQlhdHBfcHJpbnQoKGNvbnN0IHN0cnVjdCBhdEFUUCAqKWJwLCBsZW5ndGgpOwotCQlicmVhazsKLQotCWNhc2UgZGRwRUlHUlA6Ci0JCWVpZ3JwX3ByaW50KGJwLCBsZW5ndGgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCSh2b2lkKXByaW50ZigiIGF0LSVzICVkIiwgdG9rMnN0cih0eXBlMnN0ciwgTlVMTCwgdCksIGxlbmd0aCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWF0cF9wcmludChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXRBVFAgKmFwLCB1X2ludCBsZW5ndGgpCi17Ci0JY2hhciBjOwotCXVfaW50MzJfdCBkYXRhOwotCi0JaWYgKChjb25zdCB1X2NoYXIgKikoYXAgKyAxKSA+IHNuYXBlbmQpIHsKLQkJLyogSnVzdCBiYWlsIGlmIHdlIGRvbid0IGhhdmUgdGhlIHdob2xlIGNodW5rLiAqLwotCQlmcHV0cyh0c3RyLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCWxlbmd0aCAtPSBzaXplb2YoKmFwKTsKLQlzd2l0Y2ggKGFwLT5jb250cm9sICYgMHhjMCkgewotCi0JY2FzZSBhdHBSZXFDb2RlOgotCQkodm9pZClwcmludGYoIiBhdHAtcmVxJXMgJWQiLAotCQkJICAgICBhcC0+Y29udHJvbCAmIGF0cFhPPyAiICIgOiAiKiIsCi0JCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+dHJhbnNJRCkpOwotCi0JCWF0cF9iaXRtYXBfcHJpbnQoYXAtPmJpdG1hcCk7Ci0KLQkJaWYgKGxlbmd0aCAhPSAwKQotCQkJKHZvaWQpcHJpbnRmKCIgW2xlbj0lZF0iLCBsZW5ndGgpOwotCi0JCXN3aXRjaCAoYXAtPmNvbnRyb2wgJiAoYXRwRU9NfGF0cFNUUykpIHsKLQkJY2FzZSBhdHBFT006Ci0JCQkodm9pZClwcmludGYoIiBbRU9NXSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgYXRwU1RTOgotCQkJKHZvaWQpcHJpbnRmKCIgW1NUU10iKTsKLQkJCWJyZWFrOwotCQljYXNlIGF0cEVPTXxhdHBTVFM6Ci0JCQkodm9pZClwcmludGYoIiBbRU9NLFNUU10iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBhdHBSc3BDb2RlOgotCQkodm9pZClwcmludGYoIiBhdHAtcmVzcCVzJWQ6JWQgKCVkKSIsCi0JCQkgICAgIGFwLT5jb250cm9sICYgYXRwRU9NPyAiKiIgOiAiICIsCi0JCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZhcC0+dHJhbnNJRCksIGFwLT5iaXRtYXAsIGxlbmd0aCk7Ci0JCXN3aXRjaCAoYXAtPmNvbnRyb2wgJiAoYXRwWE98YXRwU1RTKSkgewotCQljYXNlIGF0cFhPOgotCQkJKHZvaWQpcHJpbnRmKCIgW1hPXSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgYXRwU1RTOgotCQkJKHZvaWQpcHJpbnRmKCIgW1NUU10iKTsKLQkJCWJyZWFrOwotCQljYXNlIGF0cFhPfGF0cFNUUzoKLQkJCSh2b2lkKXByaW50ZigiIFtYTyxTVFNdIik7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgYXRwUmVsQ29kZToKLQkJKHZvaWQpcHJpbnRmKCIgYXRwLXJlbCAgJWQiLCBFWFRSQUNUXzE2QklUUygmYXAtPnRyYW5zSUQpKTsKLQotCQlhdHBfYml0bWFwX3ByaW50KGFwLT5iaXRtYXApOwotCi0JCS8qIGxlbmd0aCBzaG91bGQgYmUgemVybyAqLwotCQlpZiAobGVuZ3RoKQotCQkJKHZvaWQpcHJpbnRmKCIgW2xlbj0lZF0iLCBsZW5ndGgpOwotCi0JCS8qIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgY29udHJvbCBmbGFncyAqLwotCQlpZiAoYXAtPmNvbnRyb2wgJiAoYXRwWE98YXRwRU9NfGF0cFNUUykpIHsKLQkJCWMgPSAnWyc7Ci0JCQlpZiAoYXAtPmNvbnRyb2wgJiBhdHBYTykgewotCQkJCSh2b2lkKXByaW50ZigiJWNYTyIsIGMpOwotCQkJCWMgPSAnLCc7Ci0JCQl9Ci0JCQlpZiAoYXAtPmNvbnRyb2wgJiBhdHBFT00pIHsKLQkJCQkodm9pZClwcmludGYoIiVjRU9NIiwgYyk7Ci0JCQkJYyA9ICcsJzsKLQkJCX0KLQkJCWlmIChhcC0+Y29udHJvbCAmIGF0cFNUUykgewotCQkJCSh2b2lkKXByaW50ZigiJWNTVFMiLCBjKTsKLQkJCQljID0gJywnOwotCQkJfQotCQkJKHZvaWQpcHJpbnRmKCJdIik7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkodm9pZClwcmludGYoIiBhdHAtMHgleCAgJWQgKCVkKSIsIGFwLT5jb250cm9sLAotCQkJICAgICBFWFRSQUNUXzE2QklUUygmYXAtPnRyYW5zSUQpLCBsZW5ndGgpOwotCQlicmVhazsKLQl9Ci0JZGF0YSA9IEVYVFJBQ1RfMzJCSVRTKCZhcC0+dXNlckRhdGEpOwotCWlmIChkYXRhICE9IDApCi0JCSh2b2lkKXByaW50ZigiIDB4JXgiLCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQKLWF0cF9iaXRtYXBfcHJpbnQocmVnaXN0ZXIgdV9jaGFyIGJtKQotewotCXJlZ2lzdGVyIGNoYXIgYzsKLQlyZWdpc3RlciBpbnQgaTsKLQotCS8qCi0JICogVGhlICcmIDB4ZmYnIGJlbG93IGlzIG5lZWRlZCBmb3IgY29tcGlsZXJzIHRoYXQgd2FudCB0byBzaWduCi0JICogZXh0ZW5kIGEgdV9jaGFyLCB3aGljaCBpcyB0aGUgY2FzZSB3aXRoIHRoZSBVbHRyaXggY29tcGlsZXIuCi0JICogKGdjYyBpcyBzbWFydCBlbm91Z2ggdG8gZWxpbWluYXRlIGl0LCBhdCBsZWFzdCBvbiB0aGUgU3BhcmMpLgotCSAqLwotCWlmICgoYm0gKyAxKSAmIChibSAmIDB4ZmYpKSB7Ci0JCWMgPSAnPCc7Ci0JCWZvciAoaSA9IDA7IGJtOyArK2kpIHsKLQkJCWlmIChibSAmIDEpIHsKLQkJCQkodm9pZClwcmludGYoIiVjJWQiLCBjLCBpKTsKLQkJCQljID0gJywnOwotCQkJfQotCQkJYm0gPj49IDE7Ci0JCX0KLQkJKHZvaWQpcHJpbnRmKCI+Iik7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgYm07ICsraSkKLQkJCWJtID4+PSAxOwotCQlpZiAoaSA+IDEpCi0JCQkodm9pZClwcmludGYoIjwwLSVkPiIsIGkgLSAxKTsKLQkJZWxzZQotCQkJKHZvaWQpcHJpbnRmKCI8MD4iKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1uYnBfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0TkJQICpucCwgdV9pbnQgbGVuZ3RoLCByZWdpc3RlciB1X3Nob3J0IHNuZXQsCi0JICByZWdpc3RlciB1X2NoYXIgc25vZGUsIHJlZ2lzdGVyIHVfY2hhciBza3QpCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKnRwID0KLQkJKGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICopKCh1X2NoYXIgKilucCArIG5icEhlYWRlclNpemUpOwotCWludCBpOwotCWNvbnN0IHVfY2hhciAqZXA7Ci0KLQlpZiAobGVuZ3RoIDwgbmJwSGVhZGVyU2l6ZSkgewotCQkodm9pZClwcmludGYoIiB0cnVuY2F0ZWQtbmJwICVkIiwgbGVuZ3RoKTsKLQkJcmV0dXJuOwotCX0KLQotCWxlbmd0aCAtPSBuYnBIZWFkZXJTaXplOwotCWlmIChsZW5ndGggPCA4KSB7Ci0JCS8qIG11c3QgYmUgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHR1cGxlICovCi0JCSh2b2lkKXByaW50ZigiIHRydW5jYXRlZC1uYnAgJWQiLCBsZW5ndGggKyBuYnBIZWFkZXJTaXplKTsKLQkJcmV0dXJuOwotCX0KLQkvKiBlcCBwb2ludHMgdG8gZW5kIG9mIGF2YWlsYWJsZSBkYXRhICovCi0JZXAgPSBzbmFwZW5kOwotCWlmICgoY29uc3QgdV9jaGFyICopdHAgPiBlcCkgewotCQlmcHV0cyh0c3RyLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCXN3aXRjaCAoaSA9IG5wLT5jb250cm9sICYgMHhmMCkgewotCi0JY2FzZSBuYnBCclJxOgotCWNhc2UgbmJwTGtVcDoKLQkJKHZvaWQpcHJpbnRmKGkgPT0gbmJwTGtVcD8gIiBuYnAtbGt1cCAlZDoiOiIgbmJwLWJyUnEgJWQ6IiwKLQkJCSAgICAgbnAtPmlkKTsKLQkJaWYgKChjb25zdCB1X2NoYXIgKikodHAgKyAxKSA+IGVwKSB7Ci0JCQlmcHV0cyh0c3RyLCBzdGRvdXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCSh2b2lkKW5icF9uYW1lX3ByaW50KHRwLCBlcCk7Ci0JCS8qCi0JCSAqIGxvb2sgZm9yIGFub21hbGllczogdGhlIHNwZWMgc2F5cyB0aGVyZSBjYW4gb25seQotCQkgKiBiZSBvbmUgdHVwbGUsIHRoZSBhZGRyZXNzIG11c3QgbWF0Y2ggdGhlIHNvdXJjZQotCQkgKiBhZGRyZXNzIGFuZCB0aGUgZW51bWVyYXRvciBzaG91bGQgYmUgemVyby4KLQkJICovCi0JCWlmICgobnAtPmNvbnRyb2wgJiAweGYpICE9IDEpCi0JCQkodm9pZClwcmludGYoIiBbbnR1cD0lZF0iLCBucC0+Y29udHJvbCAmIDB4Zik7Ci0JCWlmICh0cC0+ZW51bWVyYXRvcikKLQkJCSh2b2lkKXByaW50ZigiIFtlbnVtPSVkXSIsIHRwLT5lbnVtZXJhdG9yKTsKLQkJaWYgKEVYVFJBQ1RfMTZCSVRTKCZ0cC0+bmV0KSAhPSBzbmV0IHx8Ci0JCSAgICB0cC0+bm9kZSAhPSBzbm9kZSB8fCB0cC0+c2t0ICE9IHNrdCkKLQkJCSh2b2lkKXByaW50ZigiIFthZGRyPSVzLiVkXSIsCi0JCQkgICAgYXRhZGRyX3N0cmluZyhFWFRSQUNUXzE2QklUUygmdHAtPm5ldCksCi0JCQkgICAgdHAtPm5vZGUpLCB0cC0+c2t0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIG5icExrVXBSZXBseToKLQkJKHZvaWQpcHJpbnRmKCIgbmJwLXJlcGx5ICVkOiIsIG5wLT5pZCk7Ci0KLQkJLyogcHJpbnQgZWFjaCBvZiB0aGUgdHVwbGVzIGluIHRoZSByZXBseSAqLwotCQlmb3IgKGkgPSBucC0+Y29udHJvbCAmIDB4ZjsgLS1pID49IDAgJiYgdHA7ICkKLQkJCXRwID0gbmJwX3R1cGxlX3ByaW50KHRwLCBlcCwgc25ldCwgc25vZGUsIHNrdCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJKHZvaWQpcHJpbnRmKCIgbmJwLTB4JXggICVkICglZCkiLCBucC0+Y29udHJvbCwgbnAtPmlkLAotCQkJCWxlbmd0aCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogcHJpbnQgYSBjb3VudGVkIHN0cmluZyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotcHJpbnRfY3N0cmluZyhyZWdpc3RlciBjb25zdCBjaGFyICpjcCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCkKLXsKLQlyZWdpc3RlciB1X2ludCBsZW5ndGg7Ci0KLQlpZiAoY3AgPj0gKGNvbnN0IGNoYXIgKillcCkgewotCQlmcHV0cyh0c3RyLCBzdGRvdXQpOwotCQlyZXR1cm4gKDApOwotCX0KLQlsZW5ndGggPSAqY3ArKzsKLQotCS8qIFNwZWMgc2F5cyBzdHJpbmcgY2FuIGJlIGF0IG1vc3QgMzIgYnl0ZXMgbG9uZyAqLwotCWlmIChsZW5ndGggPiAzMikgewotCQkodm9pZClwcmludGYoIltsZW49JXVdIiwgbGVuZ3RoKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0Jd2hpbGUgKChpbnQpLS1sZW5ndGggPj0gMCkgewotCQlpZiAoY3AgPj0gKGNvbnN0IGNoYXIgKillcCkgewotCQkJZnB1dHModHN0ciwgc3Rkb3V0KTsKLQkJCXJldHVybiAoMCk7Ci0JCX0KLQkJcHV0Y2hhcigqY3ArKyk7Ci0JfQotCXJldHVybiAoY3ApOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKgotbmJwX3R1cGxlX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICp0cCwKLQkJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCwKLQkJcmVnaXN0ZXIgdV9zaG9ydCBzbmV0LCByZWdpc3RlciB1X2NoYXIgc25vZGUsCi0JCXJlZ2lzdGVyIHVfY2hhciBza3QpCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGF0TkJQdHVwbGUgKnRwbjsKLQotCWlmICgoY29uc3QgdV9jaGFyICopKHRwICsgMSkgPiBlcCkgewotCQlmcHV0cyh0c3RyLCBzdGRvdXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JdHBuID0gbmJwX25hbWVfcHJpbnQodHAsIGVwKTsKLQotCS8qIGlmIHRoZSBlbnVtZXJhdG9yIGlzbid0IDEsIHByaW50IGl0ICovCi0JaWYgKHRwLT5lbnVtZXJhdG9yICE9IDEpCi0JCSh2b2lkKXByaW50ZigiKCVkKSIsIHRwLT5lbnVtZXJhdG9yKTsKLQotCS8qIGlmIHRoZSBzb2NrZXQgZG9lc24ndCBtYXRjaCB0aGUgc3JjIHNvY2tldCwgcHJpbnQgaXQgKi8KLQlpZiAodHAtPnNrdCAhPSBza3QpCi0JCSh2b2lkKXByaW50ZigiICVkIiwgdHAtPnNrdCk7Ci0KLQkvKiBpZiB0aGUgYWRkcmVzcyBkb2Vzbid0IG1hdGNoIHRoZSBzcmMgYWRkcmVzcywgaXQncyBhbiBhbm9tYWx5ICovCi0JaWYgKEVYVFJBQ1RfMTZCSVRTKCZ0cC0+bmV0KSAhPSBzbmV0IHx8IHRwLT5ub2RlICE9IHNub2RlKQotCQkodm9pZClwcmludGYoIiBbYWRkcj0lc10iLAotCQkgICAgYXRhZGRyX3N0cmluZyhFWFRSQUNUXzE2QklUUygmdHAtPm5ldCksIHRwLT5ub2RlKSk7Ci0KLQlyZXR1cm4gKHRwbik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqCi1uYnBfbmFtZV9wcmludChjb25zdCBzdHJ1Y3QgYXROQlB0dXBsZSAqdHAsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXApCi17Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqY3AgPSAoY29uc3QgY2hhciAqKXRwICsgbmJwVHVwbGVTaXplOwotCi0JcHV0Y2hhcignICcpOwotCi0JLyogT2JqZWN0ICovCi0JcHV0Y2hhcignIicpOwotCWlmICgoY3AgPSBwcmludF9jc3RyaW5nKGNwLCBlcCkpICE9IE5VTEwpIHsKLQkJLyogVHlwZSAqLwotCQlwdXRjaGFyKCc6Jyk7Ci0JCWlmICgoY3AgPSBwcmludF9jc3RyaW5nKGNwLCBlcCkpICE9IE5VTEwpIHsKLQkJCS8qIFpvbmUgKi8KLQkJCXB1dGNoYXIoJ0AnKTsKLQkJCWlmICgoY3AgPSBwcmludF9jc3RyaW5nKGNwLCBlcCkpICE9IE5VTEwpCi0JCQkJcHV0Y2hhcignIicpOwotCQl9Ci0JfQotCXJldHVybiAoKGNvbnN0IHN0cnVjdCBhdE5CUHR1cGxlICopY3ApOwotfQotCi0KLSNkZWZpbmUgSEFTSE5BTUVTSVpFIDQwOTYKLQotc3RydWN0IGhuYW1lbWVtIHsKLQlpbnQgYWRkcjsKLQljaGFyICpuYW1lOwotCXN0cnVjdCBobmFtZW1lbSAqbnh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBobmFtZW1lbSBobmFtZXRhYmxlW0hBU0hOQU1FU0laRV07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWF0YWRkcl9zdHJpbmcodV9zaG9ydCBhdG5ldCwgdV9jaGFyIGF0aG9zdCkKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgaG5hbWVtZW0gKnRwLCAqdHAyOwotCXJlZ2lzdGVyIGludCBpID0gKGF0bmV0IDw8IDgpIHwgYXRob3N0OwotCWNoYXIgbmFtYnVmW01BWEhPU1ROQU1FTEVOICsgMjBdOwotCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwotCUZJTEUgKmZwOwotCi0JLyoKLQkgKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsLCBzZWUgaWYgdGhlcmUncyBhbiBBcHBsZVRhbGsKLQkgKiBudW1iZXIgdG8gbmFtZSBtYXAgZmlsZS4KLQkgKi8KLQlpZiAoZmlyc3QgJiYgKGZpcnN0ID0gMCwgIW5mbGFnKQotCSAgICAmJiAoZnAgPSBmb3BlbigiL2V0Yy9hdGFsay5uYW1lcyIsICJyIikpKSB7Ci0JCWNoYXIgbGluZVsyNTZdOwotCQlpbnQgaTEsIGkyLCBpMzsKLQotCQl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHsKLQkJCWlmIChsaW5lWzBdID09ICdcbicgfHwgbGluZVswXSA9PSAwIHx8IGxpbmVbMF0gPT0gJyMnKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHNzY2FuZihsaW5lLCAiJWQuJWQuJWQgJTI1NnMiLCAmaTEsICZpMiwgJmkzLAotCQkJCSAgICAgbmFtYnVmKSA9PSA0KQotCQkJCS8qIGdvdCBhIGhvc3RuYW1lLiAqLwotCQkJCWkzIHw9ICgoaTEgPDwgOCkgfCBpMikgPDwgODsKLQkJCWVsc2UgaWYgKHNzY2FuZihsaW5lLCAiJWQuJWQgJTI1NnMiLCAmaTEsICZpMiwKLQkJCQkJbmFtYnVmKSA9PSAzKQotCQkJCS8qIGdvdCBhIG5ldCBuYW1lICovCi0JCQkJaTMgPSAoKChpMSA8PCA4KSB8IGkyKSA8PCA4KSB8IDI1NTsKLQkJCWVsc2UKLQkJCQljb250aW51ZTsKLQotCQkJZm9yICh0cCA9ICZobmFtZXRhYmxlW2kzICYgKEhBU0hOQU1FU0laRS0xKV07Ci0JCQkgICAgIHRwLT5ueHQ7IHRwID0gdHAtPm54dCkKLQkJCQk7Ci0JCQl0cC0+YWRkciA9IGkzOwotCQkJdHAtPm54dCA9IG5ld2huYW1lbWVtKCk7Ci0JCQl0cC0+bmFtZSA9IHN0cmR1cChuYW1idWYpOwotCQl9Ci0JCWZjbG9zZShmcCk7Ci0JfQotCi0JZm9yICh0cCA9ICZobmFtZXRhYmxlW2kgJiAoSEFTSE5BTUVTSVpFLTEpXTsgdHAtPm54dDsgdHAgPSB0cC0+bnh0KQotCQlpZiAodHAtPmFkZHIgPT0gaSkKLQkJCXJldHVybiAodHAtPm5hbWUpOwotCi0JLyogZGlkbid0IGhhdmUgdGhlIG5vZGUgbmFtZSAtLSBzZWUgaWYgd2UndmUgZ290IHRoZSBuZXQgbmFtZSAqLwotCWkgfD0gMjU1OwotCWZvciAodHAyID0gJmhuYW1ldGFibGVbaSAmIChIQVNITkFNRVNJWkUtMSldOyB0cDItPm54dDsgdHAyID0gdHAyLT5ueHQpCi0JCWlmICh0cDItPmFkZHIgPT0gaSkgewotCQkJdHAtPmFkZHIgPSAoYXRuZXQgPDwgOCkgfCBhdGhvc3Q7Ci0JCQl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKLQkJCSh2b2lkKXNucHJpbnRmKG5hbWJ1Ziwgc2l6ZW9mKG5hbWJ1ZiksICIlcy4lZCIsCi0JCQkgICAgdHAyLT5uYW1lLCBhdGhvc3QpOwotCQkJdHAtPm5hbWUgPSBzdHJkdXAobmFtYnVmKTsKLQkJCXJldHVybiAodHAtPm5hbWUpOwotCQl9Ci0KLQl0cC0+YWRkciA9IChhdG5ldCA8PCA4KSB8IGF0aG9zdDsKLQl0cC0+bnh0ID0gbmV3aG5hbWVtZW0oKTsKLQlpZiAoYXRob3N0ICE9IDI1NSkKLQkJKHZvaWQpc25wcmludGYobmFtYnVmLCBzaXplb2YobmFtYnVmKSwgIiVkLiVkLiVkIiwKLQkJICAgIGF0bmV0ID4+IDgsIGF0bmV0ICYgMHhmZiwgYXRob3N0KTsKLQllbHNlCi0JCSh2b2lkKXNucHJpbnRmKG5hbWJ1Ziwgc2l6ZW9mKG5hbWJ1ZiksICIlZC4lZCIsIGF0bmV0ID4+IDgsCi0JCSAgICBhdG5ldCAmIDB4ZmYpOwotCXRwLT5uYW1lID0gc3RyZHVwKG5hbWJ1Zik7Ci0KLQlyZXR1cm4gKHRwLT5uYW1lKTsKLX0KLQotc3RhdGljIHN0cnVjdCB0b2sgc2t0MnN0cltdID0gewotCXsgcnRtcFNrdCwJInJ0bXAiIH0sCS8qIHJvdXRpbmcgdGFibGUgbWFpbnRlbmFuY2UgKi8KLQl7IG5icFNrdCwJIm5pcyIgfSwJLyogbmFtZSBpbmZvIHNvY2tldCAqLwotCXsgZWNob1NrdCwJImVjaG8iIH0sCS8qIEFwcGxlVGFsayBlY2hvIHByb3RvY29sICovCi0JeyB6aXBTa3QsCSJ6aXAiIH0sCS8qIHpvbmUgaW5mbyBwcm90b2NvbCAqLwotCXsgMCwJCU5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGRwc2t0X3N0cmluZyhyZWdpc3RlciBpbnQgc2t0KQotewotCXN0YXRpYyBjaGFyIGJ1Zls4XTsKLQotCWlmIChuZmxhZykgewotCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBza3QpOwotCQlyZXR1cm4gKGJ1Zik7Ci0JfQotCXJldHVybiAodG9rMnN0cihza3Qyc3RyLCAiJWQiLCBza3QpKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWF0bS5jIGIvcHJpbnQtYXRtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NjRkNmUuLjAwMDAwMDAKLS0tIGEvcHJpbnQtYXRtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1hdG0uYyx2IDEuMzguMi42IDIwMDYvMDEvMjUgMTM6Mjc6MjQgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotI2luY2x1ZGUgImF0bS5oIgotI2luY2x1ZGUgImF0bXVuaTMxLmgiCi0jaW5jbHVkZSAibGxjLmgiCi0KLSNpbmNsdWRlICJldGhlci5oIgotCi1zdHJ1Y3QgdG9rIG9hbV9mX3ZhbHVlc1tdID0gewotICAgIHsgT0FNRjRTQywgIk9BTSBGNCAoc2VnbWVudCkiIH0sCi0gICAgeyBPQU1GNEVDLCAiT0FNIEY0IChlbmQpIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdHJ1Y3QgdG9rIG9hbV9jZWxsdHlwZV92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MSwgIkZhdWx0IE1hbmFnZW1lbnQiIH0sCi0gICAgeyAweDIsICJQZXJmb3JtYW5jZSBNYW5hZ2VtZW50IiB9LAotICAgIHsgMHg4LCAiYWN0aXZhdGUvZGVhY3RpdmF0ZSIgfSwKLSAgICB7IDB4ZiwgIlN5c3RlbSBNYW5hZ2VtZW50IiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdHJ1Y3QgdG9rIG9hbV9mbV9mdW5jdHlwZV92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MCwgIkFJUyIgfSwKLSAgICB7IDB4MSwgIlJESSIgfSwKLSAgICB7IDB4NCwgIkNvbnRpbnVpdHkgQ2hlY2siIH0sCi0gICAgeyAweDgsICJMb29wYmFjayIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RydWN0IHRvayBvYW1fcG1fZnVuY3R5cGVfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAsICJGb3J3YXJkIE1vbml0b3JpbmciIH0sCi0gICAgeyAweDEsICJCYWNrd2FyZCBSZXBvcnRpbmciIH0sCi0gICAgeyAweDIsICJNb25pdG9yaW5nIGFuZCBSZXBvcnRpbmciIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0cnVjdCB0b2sgb2FtX2FkX2Z1bmN0eXBlX3ZhbHVlc1tdID0gewotICAgIHsgMHgwLCAiUGVyZm9ybWFuY2UgTW9uaXRvcmluZyIgfSwKLSAgICB7IDB4MSwgIkNvbnRpbnVpdHkgQ2hlY2siIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rICpvYW1fZnVuY3R5cGVfdmFsdWVzWzE2XSA9IHsKLSAgICBOVUxMLAotICAgIG9hbV9mbV9mdW5jdHlwZV92YWx1ZXMsIC8qIDEgKi8KLSAgICBvYW1fcG1fZnVuY3R5cGVfdmFsdWVzLCAvKiAyICovCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIG9hbV9hZF9mdW5jdHlwZV92YWx1ZXMsIC8qIDggKi8KLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMCi19OwotCi0vKgotICogUHJpbnQgYW4gUkZDIDE0ODMgTExDLWVuY2Fwc3VsYXRlZCBBVE0gZnJhbWUuCi0gKi8KLXN0YXRpYyB2b2lkCi1hdG1fbGxjX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCwgaW50IGNhcGxlbikKLXsKLQl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcnR5cGU7Ci0KLQlpZiAoIWxsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbiwgTlVMTCwgTlVMTCwKLQkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpKSB7Ci0JCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCi0JCWlmIChleHRyYWN0ZWRfZXRoZXJ0eXBlKSB7Ci0JCQlwcmludGYoIihMTEMgJXMpICIsCi0JCWV0aGVycHJvdG9fc3RyaW5nKGh0b25zKGV4dHJhY3RlZF9ldGhlcnR5cGUpKSk7Ci0JCX0KLQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCX0KLX0KLQotLyoKLSAqIEdpdmVuIGEgU0FQIHZhbHVlLCBnZW5lcmF0ZSB0aGUgTExDIGhlYWRlciB2YWx1ZSBmb3IgYSBVSSBwYWNrZXQKLSAqIHdpdGggdGhhdCBTQVAgYXMgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gU0FQLgotICovCi0jZGVmaW5lIExMQ19VSV9IRFIoc2FwKQkoKHNhcCk8PDE2IHwgKHNhcDw8OCkgfCAweDAzKQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCi0gKiB0byB0aGUgTExDL1NOQVAgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKLSAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJwotICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KLSAqLwotdV9pbnQKLWF0bV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQl1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXVfaW50MzJfdCBsbGNoZHI7Ci0JdV9pbnQgaGRybGVuID0gMDsKLQotCWlmIChjYXBsZW4gPCA4KSB7Ci0JCXByaW50ZigiW3xhdG1dIik7Ci0JCXJldHVybiAoY2FwbGVuKTsKLQl9Ci0KLSAgICAgICAgLyogQ2lzY28gU3R5bGUgTkxQSUQgPyAqLwotICAgICAgICBpZiAoKnAgPT0gTExDX1VJKSB7Ci0gICAgICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJDTkxQSUQgIik7Ci0gICAgICAgICAgICBpc29jbG5zX3ByaW50KHArMSwgbGVuZ3RoLTEsIGNhcGxlbi0xKTsKLSAgICAgICAgICAgIHJldHVybiBoZHJsZW47Ci0gICAgICAgIH0KLQotCS8qCi0JICogRXh0cmFjdCB0aGUgcHJlc3VtZWQgTExDIGhlYWRlciBpbnRvIGEgdmFyaWFibGUsIGZvciBxdWljawotCSAqIHRlc3RpbmcuCi0JICogVGhlbiBjaGVjayBmb3IgYSBoZWFkZXIgdGhhdCdzIG5laXRoZXIgYSBoZWFkZXIgZm9yIGEgU05BUAotCSAqIHBhY2tldCBub3IgYW4gUkZDIDI2ODQgcm91dGVkIE5MUElELWZvcm1hdHRlZCBQRFUgbm9yCi0JICogYW4gODAyLjItYnV0LW5vLVNOQVAgSVAgcGFja2V0LgotCSAqLwotCWxsY2hkciA9IEVYVFJBQ1RfMjRCSVRTKHApOwotCWlmIChsbGNoZHIgIT0gTExDX1VJX0hEUihMTENTQVBfU05BUCkgJiYKLQkgICAgbGxjaGRyICE9IExMQ19VSV9IRFIoTExDU0FQX0lTT05TKSAmJgotCSAgICBsbGNoZHIgIT0gTExDX1VJX0hEUihMTENTQVBfSVApKSB7Ci0JCS8qCi0JCSAqIFhYWCAtIGFzc3VtZSA4MDIuNiBNQUMgaGVhZGVyIGZyb20gRm9yZSBkcml2ZXIuCi0JCSAqCi0JCSAqIFVuZm9ydHVuYXRlbHksIHRoZSBhYm92ZSBsaXN0IGRvZXNuJ3QgY2hlY2sgZm9yCi0JCSAqIGFsbCBrbm93biBTQVBzLCBkb2Vzbid0IGNoZWNrIGZvciBoZWFkZXJzIHdoZXJlCi0JCSAqIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIFNBUCBhcmVuJ3QgdGhlIHNhbWUsCi0JCSAqIGFuZCBkb2Vzbid0IGNoZWNrIGZvciBub24tVUkgZnJhbWVzLiAgSXQgYWxzbwotCQkgKiBydW5zIHRoZSByaXNrIG9mIGFuIDgwMi42IE1BQyBoZWFkZXIgdGhhdCBoYXBwZW5zCi0JCSAqIHRvIGJlZ2luIHdpdGggb25lIG9mIHRob3NlIHZhbHVlcyBiZWluZwotCQkgKiBpbmNvcnJlY3RseSB0cmVhdGVkIGFzIGFuIDgwMi4yIGhlYWRlci4KLQkJICoKLQkJICogU28gaXMgdGhhdCBGb3JlIGRyaXZlciBzdGlsbCBhcm91bmQ/ICBBbmQsIGlmIHNvLAotCQkgKiBpcyBpdCBzdGlsbCBwdXR0aW5nIDgwMi42IE1BQyBoZWFkZXJzIG9uIEFUTQotCQkgKiBwYWNrZXRzPyAgSWYgc28sIGNvdWxkIGl0IGJlIGNoYW5nZWQgdG8gdXNlIGEKLQkJICogbmV3IERMVF9JRUVFODAyXzYgdmFsdWUgaWYgd2UgYWRkZWQgaXQ/Ci0JCSAqLwotCQlpZiAoZWZsYWcpCi0JCQlwcmludGYoIiUwOHglMDh4ICUwOHglMDh4ICIsCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMocCksCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMocCs0KSwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUyhwKzgpLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKHArMTIpKTsKLQkJcCArPSAyMDsKLQkJbGVuZ3RoIC09IDIwOwotCQljYXBsZW4gLT0gMjA7Ci0JCWhkcmxlbiArPSAyMDsKLQl9Ci0JYXRtX2xsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbik7Ci0JcmV0dXJuIChoZHJsZW4pOwotfQotCi0vKgotICogQVRNIHNpZ25hbGxpbmcuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdG9rIG1zZ3R5cGUyc3RyW10gPSB7Ci0JeyBDQUxMX1BST0NFRUQsCQkiQ2FsbF9wcm9jZWVkaW5nIiB9LAotCXsgQ09OTkVDVCwJCSJDb25uZWN0IiB9LAotCXsgQ09OTkVDVF9BQ0ssCQkiQ29ubmVjdF9hY2siIH0sCi0JeyBTRVRVUCwJCSJTZXR1cCIgfSwKLQl7IFJFTEVBU0UsCQkiUmVsZWFzZSIgfSwKLQl7IFJFTEVBU0VfRE9ORSwJCSJSZWxlYXNlX2NvbXBsZXRlIiB9LAotCXsgUkVTVEFSVCwJCSJSZXN0YXJ0IiB9LAotCXsgUkVTVEFSVF9BQ0ssCQkiUmVzdGFydF9hY2siIH0sCi0JeyBTVEFUVVMsCQkiU3RhdHVzIiB9LAotCXsgU1RBVFVTX0VOUSwJCSJTdGF0dXNfZW5xdWlyeSIgfSwKLQl7IEFERF9QQVJUWSwJCSJBZGRfcGFydHkiIH0sCi0JeyBBRERfUEFSVFlfQUNLLAkiQWRkX3BhcnR5X2FjayIgfSwKLQl7IEFERF9QQVJUWV9SRUosCSJBZGRfcGFydHlfcmVqZWN0IiB9LAotCXsgRFJPUF9QQVJUWSwJCSJEcm9wX3BhcnR5IiB9LAotCXsgRFJPUF9QQVJUWV9BQ0ssCSJEcm9wX3BhcnR5X2FjayIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi1zdGF0aWMgdm9pZAotc2lnX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgaW50IGNhcGxlbikKLXsKLQlicGZfdV9pbnQzMiBjYWxsX3JlZjsKLQotCWlmIChjYXBsZW4gPCBQUk9UT19QT1MpIHsKLQkJcHJpbnRmKCJbfGF0bV0iKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAocFtQUk9UT19QT1NdID09IFEyOTMxKSB7Ci0JCS8qCi0JCSAqIHByb3RvY29sOlEuMjkzMSBmb3IgVXNlciB0byBOZXR3b3JrIEludGVyZmFjZSAKLQkJICogKFVOSSAzLjEpIHNpZ25hbGxpbmcKLQkJICovCi0JCXByaW50ZigiUS4yOTMxIik7Ci0JCWlmIChjYXBsZW4gPCBNU0dfVFlQRV9QT1MpIHsKLQkJCXByaW50ZigiIFt8YXRtXSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByaW50ZigiOiVzICIsCi0JCSAgICB0b2syc3RyKG1zZ3R5cGUyc3RyLCAibXNndHlwZSMlZCIsIHBbTVNHX1RZUEVfUE9TXSkpOwotCi0JCWlmIChjYXBsZW4gPCBDQUxMX1JFRl9QT1MrMykgewotCQkJcHJpbnRmKCJbfGF0bV0iKTsKLQkJCXJldHVybjsKLQkJfQotCQljYWxsX3JlZiA9IEVYVFJBQ1RfMjRCSVRTKCZwW0NBTExfUkVGX1BPU10pOwotCQlwcmludGYoIkNBTExfUkVGOjB4JTA2eCIsIGNhbGxfcmVmKTsKLQl9IGVsc2UgewotCQkvKiBTQ0NPUCB3aXRoIHNvbWUgdW5rbm93biBwcm90b2NvbCBhdG9wIGl0ICovCi0JCXByaW50ZigiU1NDT1AsIHByb3RvICVkICIsIHBbUFJPVE9fUE9TXSk7Ci0JfQotfQotCi0vKgotICogUHJpbnQgYW4gQVRNIFBEVSAoc3VjaCBhcyBhbiBBQUw1IFBEVSkuCi0gKi8KLXZvaWQKLWF0bV9wcmludCh1X2ludCB2cGksIHVfaW50IHZjaSwgdV9pbnQgdHJhZnR5cGUsIGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLAotICAgIHVfaW50IGNhcGxlbikKLXsKLQlpZiAoZWZsYWcpCi0JCXByaW50ZigiVlBJOiV1IFZDSToldSAiLCB2cGksIHZjaSk7Ci0KLQlpZiAodnBpID09IDApIHsKLQkJc3dpdGNoICh2Y2kpIHsKLQotCQljYXNlIFBQQzoKLQkJCXNpZ19wcmludChwLCBjYXBsZW4pOwotCQkJcmV0dXJuOwotCi0JCWNhc2UgQkNDOgotCQkJcHJpbnRmKCJicm9hZGNhc3Qgc2lnOiAiKTsKLQkJCXJldHVybjsKLQotCQljYXNlIE9BTUY0U0M6IC8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIE9BTUY0RUM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvYW1fcHJpbnQocCwgbGVuZ3RoLCBBVE1fT0FNX0hFQyk7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBNRVRBQzoKLQkJCXByaW50ZigibWV0YTogIik7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBJTE1JQzoKLQkJCXByaW50ZigiaWxtaTogIik7Ci0JCQlzbm1wX3ByaW50KHAsIGxlbmd0aCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlzd2l0Y2ggKHRyYWZ0eXBlKSB7Ci0KLQljYXNlIEFUTV9MTEM6Ci0JZGVmYXVsdDoKLQkJLyoKLQkJICogQXNzdW1lcyB0cmFmZmljIGlzIExMQyBpZiB1bmtub3duLgotCQkgKi8KLQkJYXRtX2xsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVE1fTEFORToKLQkJbGFuZV9wcmludChwLCBsZW5ndGgsIGNhcGxlbik7Ci0JCWJyZWFrOwotCX0KLX0KLQotaW50IAotb2FtX3ByaW50IChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgaGVjKSB7Ci0KLSAgICB1X2ludDMyX3QgY2VsbF9oZWFkZXI7Ci0gICAgdV9pbnQxNl90IGNlbGxfdHlwZSwgZnVuY190eXBlLHZwaSx2Y2kscGF5bG9hZCxjbHA7Ci0KLSAgICBjZWxsX2hlYWRlciA9IEVYVFJBQ1RfMzJCSVRTKHAraGVjKTsKLSAgICBjZWxsX3R5cGUgPSAoKCoocCs0K2hlYykpPj40KSAmIDB4MGY7Ci0gICAgZnVuY190eXBlID0gKihwKzQraGVjKSAmIDB4MGY7Ci0KLSAgICB2cGkgPSAoY2VsbF9oZWFkZXI+PjIwKSYweGZmOwotICAgIHZjaSA9IChjZWxsX2hlYWRlcj4+NCkmMHhmZmZmOwotICAgIHBheWxvYWQgPSAoY2VsbF9oZWFkZXI+PjEpJjB4NzsKLSAgICBjbHAgPSBjZWxsX2hlYWRlciYweDE7Ci0KLSAgICBwcmludGYoIiVzLCB2cGkgJXUsIHZjaSAldSwgcGF5bG9hZCAldSwgY2xwICV1LCAiLAotICAgICAgICAgICB0b2syc3RyKG9hbV9mX3ZhbHVlcywgIk9BTSBGNSIsIHZjaSksCi0gICAgICAgICAgIHZwaSwgdmNpLCBwYXlsb2FkLCBjbHApOwotCi0gICAgcHJpbnRmKCJjZWxsLXR5cGUgJXMgKCV1KSIsCi0gICAgICAgICAgIHRvazJzdHIob2FtX2NlbGx0eXBlX3ZhbHVlcywgInVua25vd24iLCBjZWxsX3R5cGUpLAotICAgICAgICAgICBjZWxsX3R5cGUpOwotCi0gICAgaWYgKG9hbV9mdW5jdHlwZV92YWx1ZXNbY2VsbF90eXBlXSA9PSBOVUxMKQotICAgICAgICBwcmludGYoIiwgZnVuYy10eXBlIHVua25vd24gKCV1KSIsIGZ1bmNfdHlwZSk7Ci0gICAgZWxzZQotICAgICAgICBwcmludGYoIiwgZnVuYy10eXBlICVzICgldSkiLAotICAgICAgICAgICAgICAgYml0dG9rMnN0cihvYW1fZnVuY3R5cGVfdmFsdWVzW2NlbGxfdHlwZV0sIm5vbmUiLGZ1bmNfdHlwZSksCi0gICAgICAgICAgICAgICBmdW5jX3R5cGUpOwotCi0gICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsbGVuZ3RoKTsKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWJlZXAuYyBiL3ByaW50LWJlZXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0MGQ2MS4uMDAwMDAwMAotLS0gYS9wcmludC1iZWVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwLCBSaWNoYXJkIFNoYXJwZQotICoKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBCU0Qtc3R5bGUgbGljZW5jZSB0aGF0IGFjY29tcGFuaWVzIHRjcGR1bXAgb3IgdW5kZXIgdGhlIEdOVSBHUEwKLSAqIHZlcnNpb24gMiBvciBsYXRlci4KLSAqCi0gKiBwcmludC1iZWVwLmMKLSAqCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWJlZXAuYyx2IDEuNiAyMDAzLzExLzE2IDA5OjM2OjEzIGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2lmZGVmIEhBVkVfTUVNT1JZX0gKLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLS8qIENoZWNrIGZvciBhIHN0cmluZyBidXQgbm90IGdvIGJleW9uZCBsZW5ndGgKLSAqIFJldHVybiBUUlVFIG9uIG1hdGNoLCBGQUxTRSBvdGhlcndpc2UKLSAqCi0gKiBMb29rcyBhdCB0aGUgZmlyc3QgZmV3IGNoYXJzIHVwIHRvIHRsMSAuLi4KLSAqLwotCi1zdGF0aWMgaW50IGxfc3RybnN0YXJ0KGNvbnN0IGNoYXIgKiwgdV9pbnQsIGNvbnN0IGNoYXIgKiwgdV9pbnQpOwotCi1zdGF0aWMgaW50Ci1sX3N0cm5zdGFydChjb25zdCBjaGFyICp0c3RyMSwgdV9pbnQgdGwxLCBjb25zdCBjaGFyICpzdHIyLCB1X2ludCBsMikKLXsKLQotCWlmICh0bDEgPiBsMikKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gKHN0cm5jbXAodHN0cjEsIHN0cjIsIHRsMSkgPT0gMCA/IDEgOiAwKTsKLX0KLQotdm9pZAotYmVlcF9wcmludChjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCi17Ci0KLQlpZiAobF9zdHJuc3RhcnQoIk1TRyIsIDQsIChjb25zdCBjaGFyICopYnAsIGxlbmd0aCkpIC8qIEEgUkVRdWVzdCAqLwotCQlwcmludGYoIiBCRUVQIE1TRyIpOwotCWVsc2UgaWYgKGxfc3RybnN0YXJ0KCJSUFkgIiwgNCwgKGNvbnN0IGNoYXIgKilicCwgbGVuZ3RoKSkKLQkJcHJpbnRmKCIgQkVFUCBSUFkiKTsKLQllbHNlIGlmIChsX3N0cm5zdGFydCgiRVJSICIsIDQsIChjb25zdCBjaGFyICopYnAsIGxlbmd0aCkpCi0JCXByaW50ZigiIEJFRVAgRVJSIik7Ci0JZWxzZSBpZiAobF9zdHJuc3RhcnQoIkFOUyAiLCA0LCAoY29uc3QgY2hhciAqKWJwLCBsZW5ndGgpKQotCQlwcmludGYoIiBCRUVQIEFOUyIpOwotCWVsc2UgaWYgKGxfc3RybnN0YXJ0KCJOVUwgIiwgNCwgKGNvbnN0IGNoYXIgKilicCwgbGVuZ3RoKSkKLQkJcHJpbnRmKCIgQkVFUCBOVUwiKTsKLQllbHNlIGlmIChsX3N0cm5zdGFydCgiU0VRICIsIDQsIChjb25zdCBjaGFyICopYnAsIGxlbmd0aCkpCi0JCXByaW50ZigiIEJFRVAgU0VRIik7Ci0JZWxzZSBpZiAobF9zdHJuc3RhcnQoIkVORCIsIDQsIChjb25zdCBjaGFyICopYnAsIGxlbmd0aCkpCi0JCXByaW50ZigiIEJFRVAgRU5EIik7Ci0JZWxzZQotCQlwcmludGYoIiBCRUVQIChwYXlsb2FkIG9yIHVuZGVjb2RlZCkiKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWJmZC5jIGIvcHJpbnQtYmZkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTU5ZGMuLjAwMDAwMDAKLS0tIGEvcHJpbnQtYmZkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYmZkLmMsdiAxLjUuMi41IDIwMDYvMDIvMDIgMDY6MzY6MzcgaGFubmVzIEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLSNpbmNsdWRlICJ1ZHAuaCIKLQotLyoKLSAqIENvbnRyb2wgcGFja2V0LCBCRkR2MCwgZHJhZnQta2F0ei13YXJkLWJmZC0wMS50eHQKLSAqCi0gKiAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHxWZXJzIHwgIERpYWcgICB8SHxEfFB8RnwgUnN2ZCAgfCAgRGV0ZWN0IE11bHQgIHwgICAgTGVuZ3RoICAgICB8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgTXkgRGlzY3JpbWluYXRvciAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgICB8ICAgICAgICAgICAgICAgICAgICAgIFlvdXIgRGlzY3JpbWluYXRvciAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHwgICAgICAgICAgICAgICAgICAgIERlc2lyZWQgTWluIFRYIEludGVydmFsICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICAgfCAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBNaW4gUlggSW50ZXJ2YWwgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgICB8ICAgICAgICAgICAgICAgICBSZXF1aXJlZCBNaW4gRWNobyBSWCBJbnRlcnZhbCAgICAgICAgICAgICAgICAgfAotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotCi0vKiAKLSAqICBDb250cm9sIHBhY2tldCwgQkZEdjEsIGRyYWZ0LWlldGYtYmZkLWJhc2UtMDIudHh0Ci0gKgotICogICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgICB8VmVycyB8ICBEaWFnICAgfFN0YXxQfEZ8Q3xBfER8UnwgIERldGVjdCBNdWx0ICB8ICAgIExlbmd0aCAgICAgfAotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgIE15IERpc2NyaW1pbmF0b3IgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICAgfCAgICAgICAgICAgICAgICAgICAgICBZb3VyIERpc2NyaW1pbmF0b3IgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgICB8ICAgICAgICAgICAgICAgICAgICBEZXNpcmVkIE1pbiBUWCBJbnRlcnZhbCAgICAgICAgICAgICAgICAgICAgfAotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHwgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgTWluIFJYIEludGVydmFsICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICAgfCAgICAgICAgICAgICAgICAgUmVxdWlyZWQgTWluIEVjaG8gUlggSW50ZXJ2YWwgICAgICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLQotc3RydWN0IGJmZF9oZWFkZXJfdCB7Ci0gICAgdV9pbnQ4X3QgdmVyc2lvbl9kaWFnOwotICAgIHVfaW50OF90IGZsYWdzOwotICAgIHVfaW50OF90IGRldGVjdF90aW1lX211bHRpcGxpZXI7Ci0gICAgdV9pbnQ4X3QgbGVuZ3RoOwotICAgIHVfaW50OF90IG15X2Rpc2NyaW1pbmF0b3JbNF07Ci0gICAgdV9pbnQ4X3QgeW91cl9kaXNjcmltaW5hdG9yWzRdOwotICAgIHVfaW50OF90IGRlc2lyZWRfbWluX3R4X2ludGVydmFsWzRdOwotICAgIHVfaW50OF90IHJlcXVpcmVkX21pbl9yeF9pbnRlcnZhbFs0XTsKLSAgICB1X2ludDhfdCByZXF1aXJlZF9taW5fZWNob19pbnRlcnZhbFs0XTsKLX07Ci0KLS8qCi0gKiAgICBBbiBvcHRpb25hbCBBdXRoZW50aWNhdGlvbiBIZWFkZXIgbWF5IGJlIHByZXNlbnQKLSAqCi0gKiAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHwgICBBdXRoIFR5cGUgICB8ICAgQXV0aCBMZW4gICAgfCAgICBBdXRoZW50aWNhdGlvbiBEYXRhLi4uICAgICB8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICovCi0KLXN0cnVjdCBiZmRfYXV0aF9oZWFkZXJfdCB7Ci0gICAgdV9pbnQ4X3QgYXV0aF90eXBlOwotICAgIHVfaW50OF90IGF1dGhfbGVuOwotICAgIHVfaW50OF90IGF1dGhfZGF0YTsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF92MV9hdXRoZW50aWNhdGlvbl92YWx1ZXNbXSA9IHsKLSAgICB7IDAsICAgICAgICAiUmVzZXJ2ZWQiIH0sCi0gICAgeyAxLCAgICAgICAgIlNpbXBsZSBQYXNzd29yZCIgfSwKLSAgICB7IDIsICAgICAgICAiS2V5ZWQgTUQ1IiB9LAotICAgIHsgMywgICAgICAgICJNZXRpY3Vsb3VzIEtleWVkIE1ENSIgfSwKLSAgICB7IDQsICAgICAgICAiS2V5ZWQgU0hBMSIgfSwKLSAgICB7IDUsICAgICAgICAiTWV0aWN1bG91cyBLZXllZCBTSEExIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0jZGVmaW5lCUJGRF9FWFRSQUNUX1ZFUlNJT04oeCkgKCgoeCkmMHhlMCk+PjUpCi0jZGVmaW5lCUJGRF9FWFRSQUNUX0RJQUcoeCkgICAgICgoeCkmMHgxZikKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgYmZkX3BvcnRfdmFsdWVzW10gPSB7Ci0gICAgeyBCRkRfQ09OVFJPTF9QT1JULCAiQ29udHJvbCIgfSwKLSAgICB7IEJGRF9FQ0hPX1BPUlQsICAgICJFY2hvIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF9kaWFnX3ZhbHVlc1tdID0gewotICAgIHsgMCwgIk5vIERpYWdub3N0aWMiIH0sCi0gICAgeyAxLCAiQ29udHJvbCBEZXRlY3Rpb24gVGltZSBFeHBpcmVkIiB9LAotICAgIHsgMiwgIkVjaG8gRnVuY3Rpb24gRmFpbGVkIiB9LAotICAgIHsgMywgIk5laWdoYm9yIFNpZ25hbGVkIFNlc3Npb24gRG93biIgfSwKLSAgICB7IDQsICJGb3J3YXJkaW5nIFBsYW5lIFJlc2V0IiB9LAotICAgIHsgNSwgIlBhdGggRG93biIgfSwKLSAgICB7IDYsICJDb25jYXRlbmF0ZWQgUGF0aCBEb3duIiB9LAotICAgIHsgNywgIkFkbWluaXN0cmF0aXZlbHkgRG93biIgfSwKLSAgICB7IDgsICJSZXZlcnNlIENvbmNhdGVuYXRlZCBQYXRoIERvd24iIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF92MF9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHg4MCwJIkkgSGVhciBZb3UiIH0sCi0gICAgeyAweDQwLAkiRGVtYW5kIiB9LAotICAgIHsgMHgyMCwJIlBvbGwiIH0sCi0gICAgeyAweDEwLAkiRmluYWwiIH0sCi0gICAgeyAweDA4LAkiUmVzZXJ2ZWQiIH0sCi0gICAgeyAweDA0LAkiUmVzZXJ2ZWQiIH0sCi0gICAgeyAweDAyLAkiUmVzZXJ2ZWQiIH0sCi0gICAgeyAweDAxLAkiUmVzZXJ2ZWQiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLSNkZWZpbmUgQkZEX0ZMQUdfQVVUSCAweDA0Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJmZF92MV9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHgyMCwgIlBvbGwiIH0sCi0gICAgeyAweDEwLCAiRmluYWwiIH0sCi0gICAgeyAweDA4LCAiQ29udHJvbCBQbGFuZSBJbmRlcGVuZGVudCIgfSwKLSAgICB7IEJGRF9GTEFHX0FVVEgsICJBdXRoZW50aWNhdGlvbiBQcmVzZW50IiB9LAotICAgIHsgMHgwMiwgIkRlbWFuZCIgfSwKLSAgICB7IDB4MDEsICJSZXNlcnZlZCIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgYmZkX3YxX3N0YXRlX3ZhbHVlc1tdID0gewotICAgIHsgMCwgIkFkbWluRG93biIgfSwKLSAgICB7IDEsICJEb3duIiB9LAotICAgIHsgMiwgIkluaXQiIH0sCi0gICAgeyAzLCAiVXAiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXZvaWQKLWJmZF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbiwgcmVnaXN0ZXIgdV9pbnQgcG9ydCkKLXsKLSAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9oZWFkZXJfdCAqYmZkX2hlYWRlcjsKLSAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hdXRoX2hlYWRlcl90ICpiZmRfYXV0aF9oZWFkZXI7Ci0gICAgICAgIHVfaW50OF90IHZlcnNpb247Ci0KLSAgICAgICAgYmZkX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgYmZkX2hlYWRlcl90ICopcHB0cjsKLSAgICAgICAgVENIRUNLKCpiZmRfaGVhZGVyKTsKLSAgICAgICAgdmVyc2lvbiA9IEJGRF9FWFRSQUNUX1ZFUlNJT04oYmZkX2hlYWRlci0+dmVyc2lvbl9kaWFnKTsKLQotICAgICAgICBzd2l0Y2ggKHBvcnQgPDwgOCB8IHZlcnNpb24pIHsKLQotICAgICAgICAgICAgLyogQkZEdjAgKi8KLSAgICAgICAgY2FzZSAoQkZEX0NPTlRST0xfUE9SVCA8PCA4KToKLSAgICAgICAgICAgIGlmICh2ZmxhZyA8IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ZigiQkZEdiV1LCAlcywgRmxhZ3M6IFslc10sIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGJmZF92MF9mbGFnX3ZhbHVlcywgIm5vbmUiLCBiZmRfaGVhZGVyLT5mbGFncyksCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmludGYoIkJGRHYldSwgbGVuZ3RoOiAldVxuXHQlcywgRmxhZ3M6IFslc10sIERpYWdub3N0aWM6ICVzICgweCUwMngpIiwKLSAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgIGxlbiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoYmZkX3YwX2ZsYWdfdmFsdWVzLCAibm9uZSIsIGJmZF9oZWFkZXItPmZsYWdzKSwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9kaWFnX3ZhbHVlcywidW5rbm93biIsQkZEX0VYVFJBQ1RfRElBRyhiZmRfaGVhZGVyLT52ZXJzaW9uX2RpYWcpKSwKLSAgICAgICAgICAgICAgICAgICBCRkRfRVhUUkFDVF9ESUFHKGJmZF9oZWFkZXItPnZlcnNpb25fZGlhZykpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmludGYoIlxuXHREZXRlY3Rpb24gVGltZXIgTXVsdGlwbGllcjogJXUgKCV1IG1zIERldGVjdGlvbiB0aW1lKSwgQkZEIExlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgIGJmZF9oZWFkZXItPmRldGVjdF90aW1lX211bHRpcGxpZXIsCi0gICAgICAgICAgICAgICAgICAgYmZkX2hlYWRlci0+ZGV0ZWN0X3RpbWVfbXVsdGlwbGllciAqIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPmRlc2lyZWRfbWluX3R4X2ludGVydmFsKS8xMDAwLAotICAgICAgICAgICAgICAgICAgIGJmZF9oZWFkZXItPmxlbmd0aCk7Ci0KLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0TXkgRGlzY3JpbWluYXRvcjogMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+bXlfZGlzY3JpbWluYXRvcikpOwotICAgICAgICAgICAgcHJpbnRmKCIsIFlvdXIgRGlzY3JpbWluYXRvcjogMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+eW91cl9kaXNjcmltaW5hdG9yKSk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgIERlc2lyZWQgbWluIFR4IEludGVydmFsOiAgICAlNHUgbXMiLCBFWFRSQUNUXzMyQklUUyhiZmRfaGVhZGVyLT5kZXNpcmVkX21pbl90eF9pbnRlcnZhbCkvMTAwMCk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgIFJlcXVpcmVkIG1pbiBSeCBJbnRlcnZhbDogICAlNHUgbXMiLCBFWFRSQUNUXzMyQklUUyhiZmRfaGVhZGVyLT5yZXF1aXJlZF9taW5fcnhfaW50ZXJ2YWwpLzEwMDApOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBSZXF1aXJlZCBtaW4gRWNobyBJbnRlcnZhbDogJTR1IG1zIiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+cmVxdWlyZWRfbWluX2VjaG9faW50ZXJ2YWwpLzEwMDApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qIEJGRHYxICovCi0gICAgICAgIGNhc2UgKEJGRF9DT05UUk9MX1BPUlQgPDwgOCB8IDEpOgotICAgICAgICAgICAgaWYgKHZmbGFnIDwgMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJCRkR2JXUsICVzLCBTdGF0ZSAlcywgRmxhZ3M6IFslc10sIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF92MV9zdGF0ZV92YWx1ZXMsICJ1bmtub3duICgldSkiLCAoYmZkX2hlYWRlci0+ZmxhZ3MgJiAweGMwKSA+PiA2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihiZmRfdjFfZmxhZ192YWx1ZXMsICJub25lIiwgYmZkX2hlYWRlci0+ZmxhZ3MgJiAweDNmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaW50ZigiQkZEdiV1LCBsZW5ndGg6ICV1XG5cdCVzLCBTdGF0ZSAlcywgRmxhZ3M6IFslc10sIERpYWdub3N0aWM6ICVzICgweCUwMngpIiwKLSAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgIGxlbiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGJmZF9wb3J0X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYmZkX3YxX3N0YXRlX3ZhbHVlcywgInVua25vd24gKCV1KSIsIChiZmRfaGVhZGVyLT5mbGFncyAmIDB4YzApID4+IDYpLAotICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoYmZkX3YxX2ZsYWdfdmFsdWVzLCAibm9uZSIsIGJmZF9oZWFkZXItPmZsYWdzICYgMHgzZiksCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihiZmRfZGlhZ192YWx1ZXMsInVua25vd24iLEJGRF9FWFRSQUNUX0RJQUcoYmZkX2hlYWRlci0+dmVyc2lvbl9kaWFnKSksCi0gICAgICAgICAgICAgICAgICAgQkZEX0VYVFJBQ1RfRElBRyhiZmRfaGVhZGVyLT52ZXJzaW9uX2RpYWcpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJpbnRmKCJcblx0RGV0ZWN0aW9uIFRpbWVyIE11bHRpcGxpZXI6ICV1ICgldSBtcyBEZXRlY3Rpb24gdGltZSksIEJGRCBMZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgICAgICBiZmRfaGVhZGVyLT5kZXRlY3RfdGltZV9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgIGJmZF9oZWFkZXItPmRldGVjdF90aW1lX211bHRpcGxpZXIgKiBFWFRSQUNUXzMyQklUUyhiZmRfaGVhZGVyLT5kZXNpcmVkX21pbl90eF9pbnRlcnZhbCkvMTAwMCwKLSAgICAgICAgICAgICAgICAgICBiZmRfaGVhZGVyLT5sZW5ndGgpOwotCi0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdE15IERpc2NyaW1pbmF0b3I6IDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPm15X2Rpc2NyaW1pbmF0b3IpKTsKLSAgICAgICAgICAgIHByaW50ZigiLCBZb3VyIERpc2NyaW1pbmF0b3I6IDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPnlvdXJfZGlzY3JpbWluYXRvcikpOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBEZXNpcmVkIG1pbiBUeCBJbnRlcnZhbDogICAgJTR1IG1zIiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+ZGVzaXJlZF9taW5fdHhfaW50ZXJ2YWwpLzEwMDApOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBSZXF1aXJlZCBtaW4gUnggSW50ZXJ2YWw6ICAgJTR1IG1zIiwgRVhUUkFDVF8zMkJJVFMoYmZkX2hlYWRlci0+cmVxdWlyZWRfbWluX3J4X2ludGVydmFsKS8xMDAwKTsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgUmVxdWlyZWQgbWluIEVjaG8gSW50ZXJ2YWw6ICU0dSBtcyIsIEVYVFJBQ1RfMzJCSVRTKGJmZF9oZWFkZXItPnJlcXVpcmVkX21pbl9lY2hvX2ludGVydmFsKS8xMDAwKTsKLQotICAgICAgICAgICAgaWYgKGJmZF9oZWFkZXItPmZsYWdzICYgQkZEX0ZMQUdfQVVUSCkgewotICAgICAgICAgICAgICAgIHBwdHIgKz0gc2l6ZW9mIChjb25zdCBzdHJ1Y3QgYmZkX2hlYWRlcl90KTsKLSAgICAgICAgICAgICAgICBiZmRfYXV0aF9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGJmZF9hdXRoX2hlYWRlcl90ICopcHB0cjsKLSAgICAgICAgICAgICAgICBUQ0hFQ0syKCpiZmRfYXV0aF9oZWFkZXIsIHNpemVvZihjb25zdCBzdHJ1Y3QgYmZkX2F1dGhfaGVhZGVyX3QpKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQlcyAoJXUpIEF1dGhlbnRpY2F0aW9uLCBsZW5ndGggJXUgcHJlc2VudCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYmZkX3YxX2F1dGhlbnRpY2F0aW9uX3ZhbHVlcywiVW5rbm93biIsYmZkX2F1dGhfaGVhZGVyLT5hdXRoX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICBiZmRfYXV0aF9oZWFkZXItPmF1dGhfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmZkX2F1dGhfaGVhZGVyLT5hdXRoX2xlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogQkZEdjAgKi8KLSAgICAgICAgY2FzZSAoQkZEX0VDSE9fUE9SVCA8PCA4KTogLyogbm90IHlldCBzdXBwb3J0ZWQgLSBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIC8qIEJGRHYxICovCi0gICAgICAgIGNhc2UgKEJGRF9FQ0hPX1BPUlQgPDwgOCB8IDEpOgotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBwcmludGYoIkJGRCwgJXMsIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoYmZkX3BvcnRfdmFsdWVzLCAidW5rbm93biAoJXUpIiwgcG9ydCksCi0gICAgICAgICAgICAgICAgICAgbGVuKTsKLSAgICAgICAgICAgIGlmICh2ZmxhZyA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0IixsZW4pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0KLXRydW5jOgotICAgICAgICBwcmludGYoIlt8QkZEXSIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtYmdwLmMgYi9wcmludC1iZ3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhYTc5OC4uMDAwMDAwMAotLS0gYS9wcmludC1iZ3AuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5OSBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKiBFeHRlbnNpdmVseSBtb2RpZmllZCBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KSBmb3IgbW9yZQotICogY29tcGxldGUgQkdQIHN1cHBvcnQuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtYmdwLmMsdiAxLjkxLjIuMTIgMjAwNy8wNy8xNCAyMjoyNjozNSBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImRlY29kZV9wcmVmaXguaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotI2luY2x1ZGUgImJncC5oIgotI2luY2x1ZGUgImwydnBuLmgiCi0jaW5jbHVkZSAiYWYuaCIKLQotc3RydWN0IGJncCB7Ci0JdV9pbnQ4X3QgYmdwX21hcmtlclsxNl07Ci0JdV9pbnQxNl90IGJncF9sZW47Ci0JdV9pbnQ4X3QgYmdwX3R5cGU7Ci19OwotI2RlZmluZSBCR1BfU0laRQkJMTkJLyogdW5hbGlnbmVkICovCi0KLSNkZWZpbmUgQkdQX09QRU4JCTEKLSNkZWZpbmUgQkdQX1VQREFURQkJMgotI2RlZmluZSBCR1BfTk9USUZJQ0FUSU9OCTMKLSNkZWZpbmUgQkdQX0tFRVBBTElWRQkJNAotI2RlZmluZSBCR1BfUk9VVEVfUkVGUkVTSCAgICAgICA1Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9tc2dfdmFsdWVzW10gPSB7Ci0gICAgeyBCR1BfT1BFTiwgICAgICAgICAgICAgICAgICJPcGVuIn0sCi0gICAgeyBCR1BfVVBEQVRFLCAgICAgICAgICAgICAgICJVcGRhdGUifSwKLSAgICB7IEJHUF9OT1RJRklDQVRJT04sICAgICAgICAgIk5vdGlmaWNhdGlvbiJ9LAotICAgIHsgQkdQX0tFRVBBTElWRSwgICAgICAgICAgICAiS2VlcGFsaXZlIn0sCi0gICAgeyBCR1BfUk9VVEVfUkVGUkVTSCwgICAgICAgICJSb3V0ZSBSZWZyZXNoIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RydWN0IGJncF9vcGVuIHsKLQl1X2ludDhfdCBiZ3BvX21hcmtlclsxNl07Ci0JdV9pbnQxNl90IGJncG9fbGVuOwotCXVfaW50OF90IGJncG9fdHlwZTsKLQl1X2ludDhfdCBiZ3BvX3ZlcnNpb247Ci0JdV9pbnQxNl90IGJncG9fbXlhczsKLQl1X2ludDE2X3QgYmdwb19ob2xkdGltZTsKLQl1X2ludDMyX3QgYmdwb19pZDsKLQl1X2ludDhfdCBiZ3BvX29wdGxlbjsKLQkvKiBvcHRpb25zIHNob3VsZCBmb2xsb3cgKi8KLX07Ci0jZGVmaW5lIEJHUF9PUEVOX1NJWkUJCTI5CS8qIHVuYWxpZ25lZCAqLwotCi1zdHJ1Y3QgYmdwX29wdCB7Ci0JdV9pbnQ4X3QgYmdwb3B0X3R5cGU7Ci0JdV9pbnQ4X3QgYmdwb3B0X2xlbjsKLQkvKiB2YXJpYWJsZSBsZW5ndGggKi8KLX07Ci0jZGVmaW5lIEJHUF9PUFRfU0laRQkJMgkvKiBzb21lIGNvbXBpbGVycyBtYXkgcGFkIHRvIDQgYnl0ZXMgKi8KLQotI2RlZmluZSBCR1BfVVBEQVRFX01JTlNJWkUgICAgICAyMwotCi1zdHJ1Y3QgYmdwX25vdGlmaWNhdGlvbiB7Ci0JdV9pbnQ4X3QgYmdwbl9tYXJrZXJbMTZdOwotCXVfaW50MTZfdCBiZ3BuX2xlbjsKLQl1X2ludDhfdCBiZ3BuX3R5cGU7Ci0JdV9pbnQ4X3QgYmdwbl9tYWpvcjsKLQl1X2ludDhfdCBiZ3BuX21pbm9yOwotfTsKLSNkZWZpbmUgQkdQX05PVElGSUNBVElPTl9TSVpFCQkyMQkvKiB1bmFsaWduZWQgKi8KLQotc3RydWN0IGJncF9yb3V0ZV9yZWZyZXNoIHsKLSAgICB1X2ludDhfdCAgYmdwX21hcmtlclsxNl07Ci0gICAgdV9pbnQxNl90IGxlbjsKLSAgICB1X2ludDhfdCAgdHlwZTsKLSAgICB1X2ludDhfdCAgYWZpWzJdOyAvKiB0aGUgY29tcGlsZXIgbWVzc2VzIHRoaXMgc3RydWN0dXJlIHVwICAgICAgICAgICAgICAgKi8KLSAgICB1X2ludDhfdCAgcmVzOyAgICAvKiB3aGVuIGRvaW5nIG1pc2FsaWduZWQgc2VxdWVuY2VzIG9mIGludDggYW5kIGludDE2ICAgKi8KLSAgICB1X2ludDhfdCAgc2FmaTsgICAvKiBhZmkgc2hvdWxkIGJlIGludDE2IC0gc28gd2UgaGF2ZSB0byBhY2Nlc3MgaXQgdXNpbmcgKi8KLX07ICAgICAgICAgICAgICAgICAgICAvKiBFWFRSQUNUXzE2QklUUygmYmdwX3JvdXRlX3JlZnJlc2gtPmFmaSkgKHNpZ2gpICAgICAgKi8gCi0jZGVmaW5lIEJHUF9ST1VURV9SRUZSRVNIX1NJWkUgICAgICAgICAgMjMKLQotc3RydWN0IGJncF9hdHRyIHsKLQl1X2ludDhfdCBiZ3BhX2ZsYWdzOwotCXVfaW50OF90IGJncGFfdHlwZTsKLQl1bmlvbiB7Ci0JCXVfaW50OF90IGxlbjsKLQkJdV9pbnQxNl90IGVsZW47Ci0JfSBiZ3BhX2xlbjsKLSNkZWZpbmUgYmdwX2F0dHJfbGVuKHApIFwKLQkoKChwKS0+YmdwYV9mbGFncyAmIDB4MTApID8gXAotCQlFWFRSQUNUXzE2QklUUygmKHApLT5iZ3BhX2xlbi5lbGVuKSA6IChwKS0+YmdwYV9sZW4ubGVuKQotI2RlZmluZSBiZ3BfYXR0cl9vZmYocCkgXAotCSgoKHApLT5iZ3BhX2ZsYWdzICYgMHgxMCkgPyA0IDogMykKLX07Ci0KLSNkZWZpbmUgQkdQVFlQRV9PUklHSU4JCQkxCi0jZGVmaW5lIEJHUFRZUEVfQVNfUEFUSAkJCTIKLSNkZWZpbmUgQkdQVFlQRV9ORVhUX0hPUAkJMwotI2RlZmluZSBCR1BUWVBFX01VTFRJX0VYSVRfRElTQwkJNAotI2RlZmluZSBCR1BUWVBFX0xPQ0FMX1BSRUYJCTUKLSNkZWZpbmUgQkdQVFlQRV9BVE9NSUNfQUdHUkVHQVRFCTYKLSNkZWZpbmUgQkdQVFlQRV9BR0dSRUdBVE9SCQk3Ci0jZGVmaW5lCUJHUFRZUEVfQ09NTVVOSVRJRVMJCTgJLyogUkZDMTk5NyAqLwotI2RlZmluZQlCR1BUWVBFX09SSUdJTkFUT1JfSUQJCTkJLyogUkZDMTk5OCAqLwotI2RlZmluZQlCR1BUWVBFX0NMVVNURVJfTElTVAkJMTAJLyogUkZDMTk5OCAqLwotI2RlZmluZQlCR1BUWVBFX0RQQQkJCTExCS8qIGRyYWZ0LWlldGYtaWRyLWJncC1kcGEgKi8KLSNkZWZpbmUJQkdQVFlQRV9BRFZFUlRJU0VSUwkJMTIJLyogUkZDMTg2MyAqLwotI2RlZmluZQlCR1BUWVBFX1JDSURfUEFUSAkJMTMJLyogUkZDMTg2MyAqLwotI2RlZmluZSBCR1BUWVBFX01QX1JFQUNIX05MUkkJCTE0CS8qIFJGQzIyODMgKi8KLSNkZWZpbmUgQkdQVFlQRV9NUF9VTlJFQUNIX05MUkkJCTE1CS8qIFJGQzIyODMgKi8KLSNkZWZpbmUgQkdQVFlQRV9FWFREX0NPTU1VTklUSUVTICAgICAgICAxNiAgICAgIC8qIGRyYWZ0LWlldGYtaWRyLWJncC1leHQtY29tbXVuaXRpZXMgKi8KLSNkZWZpbmUgQkdQVFlQRV9BVFRSX1NFVCAgICAgICAgICAgICAgIDEyOCAgICAgIC8qIGRyYWZ0LW1hcnF1ZXMtcHB2cG4taWJncCAqLwotCi0jZGVmaW5lIEJHUF9NUF9OTFJJX01JTlNJWkUgICAgICAgICAgICAgIDMgICAgICAgLyogRW5kIG9mIFJJQiBNYXJrZXIgZGV0ZWN0aW9uICovCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9hdHRyX3ZhbHVlc1tdID0gewotICAgIHsgQkdQVFlQRV9PUklHSU4sICAgICAgICAgICAiT3JpZ2luIn0sCi0gICAgeyBCR1BUWVBFX0FTX1BBVEgsICAgICAgICAgICJBUyBQYXRoIn0sCi0gICAgeyBCR1BUWVBFX05FWFRfSE9QLCAgICAgICAgICJOZXh0IEhvcCJ9LAotICAgIHsgQkdQVFlQRV9NVUxUSV9FWElUX0RJU0MsICAiTXVsdGkgRXhpdCBEaXNjcmltaW5hdG9yIn0sCi0gICAgeyBCR1BUWVBFX0xPQ0FMX1BSRUYsICAgICAgICJMb2NhbCBQcmVmZXJlbmNlIn0sCi0gICAgeyBCR1BUWVBFX0FUT01JQ19BR0dSRUdBVEUsICJBdG9taWMgQWdncmVnYXRlIn0sCi0gICAgeyBCR1BUWVBFX0FHR1JFR0FUT1IsICAgICAgICJBZ2dyZWdhdG9yIn0sCi0gICAgeyBCR1BUWVBFX0NPTU1VTklUSUVTLCAgICAgICJDb21tdW5pdHkifSwKLSAgICB7IEJHUFRZUEVfT1JJR0lOQVRPUl9JRCwgICAgIk9yaWdpbmF0b3IgSUQifSwKLSAgICB7IEJHUFRZUEVfQ0xVU1RFUl9MSVNULCAgICAgIkNsdXN0ZXIgTGlzdCJ9LAotICAgIHsgQkdQVFlQRV9EUEEsICAgICAgICAgICAgICAiRFBBIn0sCi0gICAgeyBCR1BUWVBFX0FEVkVSVElTRVJTLCAgICAgICJBZHZlcnRpc2VycyJ9LAotICAgIHsgQkdQVFlQRV9SQ0lEX1BBVEgsICAgICAgICAiUkNJRCBQYXRoIC8gQ2x1c3RlciBJRCJ9LAotICAgIHsgQkdQVFlQRV9NUF9SRUFDSF9OTFJJLCAgICAiTXVsdGktUHJvdG9jb2wgUmVhY2ggTkxSSSJ9LAotICAgIHsgQkdQVFlQRV9NUF9VTlJFQUNIX05MUkksICAiTXVsdGktUHJvdG9jb2wgVW5yZWFjaCBOTFJJIn0sCi0gICAgeyBCR1BUWVBFX0VYVERfQ09NTVVOSVRJRVMsICJFeHRlbmRlZCBDb21tdW5pdHkifSwKLSAgICB7IEJHUFRZUEVfQVRUUl9TRVQsICAgICAgICAgIkF0dHJpYnV0ZSBTZXQifSwKLSAgICB7IDI1NSwgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIGZvciBkZXZlbG9wbWVudCJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgQkdQX0FTX1NFVCAgICAgICAgICAgICAxCi0jZGVmaW5lIEJHUF9BU19TRVFVRU5DRSAgICAgICAgMgotI2RlZmluZSBCR1BfQ09ORkVEX0FTX1NFUVVFTkNFIDMgLyogZHJhZnQtaWV0Zi1pZHItcmZjMzA2NWJpcy0wMSAqLwotI2RlZmluZSBCR1BfQ09ORkVEX0FTX1NFVCAgICAgIDQgLyogZHJhZnQtaWV0Zi1pZHItcmZjMzA2NWJpcy0wMSAgKi8KLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX2FzX3BhdGhfc2VnbWVudF9vcGVuX3ZhbHVlc1tdID0gewotICAgIHsgQkdQX0FTX1NFUVVFTkNFLCAgICAgICAgICIifSwKLSAgICB7IEJHUF9BU19TRVQsICAgICAgICAgICAgICAieyAifSwKLSAgICB7IEJHUF9DT05GRURfQVNfU0VRVUVOQ0UsICAiKCAifSwKLSAgICB7IEJHUF9DT05GRURfQVNfU0VULCAgICAgICAiKHsgIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX2FzX3BhdGhfc2VnbWVudF9jbG9zZV92YWx1ZXNbXSA9IHsKLSAgICB7IEJHUF9BU19TRVFVRU5DRSwgICAgICAgICAiIn0sCi0gICAgeyBCR1BfQVNfU0VULCAgICAgICAgICAgICAgIn0ifSwKLSAgICB7IEJHUF9DT05GRURfQVNfU0VRVUVOQ0UsICAiKSJ9LAotICAgIHsgQkdQX0NPTkZFRF9BU19TRVQsICAgICAgICJ9KSJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgQkdQX09QVF9BVVRIICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEJHUF9PUFRfQ0FQICAgICAgICAgICAgICAgICAgICAgMgotCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9vcHRfdmFsdWVzW10gPSB7Ci0gICAgeyBCR1BfT1BUX0FVVEgsICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBJbmZvcm1hdGlvbiJ9LAotICAgIHsgQkdQX09QVF9DQVAsICAgICAgICAgICAgICAiQ2FwYWJpbGl0aWVzIEFkdmVydGlzZW1lbnQifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIEJHUF9DQVBDT0RFX01QICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBCR1BfQ0FQQ09ERV9SUiAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQkdQX0NBUENPREVfT1JGICAgICAgICAgICAgICAgICAzIC8qIFhYWCAqLwotI2RlZmluZSBCR1BfQ0FQQ09ERV9SRVNUQVJUICAgICAgICAgICAgNjQgLyogZHJhZnQtaWV0Zi1pZHItcmVzdGFydC0wNSAgKi8KLSNkZWZpbmUgQkdQX0NBUENPREVfQVNfTkVXICAgICAgICAgICAgIDY1IC8qIFhYWCAqLwotI2RlZmluZSBCR1BfQ0FQQ09ERV9EWU5fQ0FQICAgICAgICAgICAgNjcgLyogWFhYICovCi0jZGVmaW5lIEJHUF9DQVBDT0RFX1JSX0NJU0NPICAgICAgICAgIDEyOAotCi1zdGF0aWMgc3RydWN0IHRvayBiZ3BfY2FwY29kZV92YWx1ZXNbXSA9IHsKLSAgICB7IEJHUF9DQVBDT0RFX01QLCAgICAgICAgICAgIk11bHRpcHJvdG9jb2wgRXh0ZW5zaW9ucyJ9LAotICAgIHsgQkdQX0NBUENPREVfUlIsICAgICAgICAgICAiUm91dGUgUmVmcmVzaCJ9LAotICAgIHsgQkdQX0NBUENPREVfT1JGLCAgICAgICAgICAiQ29vcGVyYXRpdmUgUm91dGUgRmlsdGVyaW5nIn0sCi0gICAgeyBCR1BfQ0FQQ09ERV9SRVNUQVJULCAgICAgICJHcmFjZWZ1bCBSZXN0YXJ0In0sCi0gICAgeyBCR1BfQ0FQQ09ERV9BU19ORVcsICAgICAgICIzMi1CaXQgQVMgTnVtYmVyIn0sCi0gICAgeyBCR1BfQ0FQQ09ERV9EWU5fQ0FQLCAgICAgICJEeW5hbWljIENhcGFiaWxpdHkifSwKLSAgICB7IEJHUF9DQVBDT0RFX1JSX0NJU0NPLCAgICAgIlJvdXRlIFJlZnJlc2ggKENpc2NvKSJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgQkdQX05PVElGWV9NQUpPUl9NU0cgICAgICAgICAgICAxCi0jZGVmaW5lIEJHUF9OT1RJRllfTUFKT1JfT1BFTiAgICAgICAgICAgMgotI2RlZmluZSBCR1BfTk9USUZZX01BSk9SX1VQREFURSAgICAgICAgIDMKLSNkZWZpbmUgQkdQX05PVElGWV9NQUpPUl9IT0xEVElNRSAgICAgICA0Ci0jZGVmaW5lIEJHUF9OT1RJRllfTUFKT1JfRlNNICAgICAgICAgICAgNQotI2RlZmluZSBCR1BfTk9USUZZX01BSk9SX0NFQVNFICAgICAgICAgIDYKLSNkZWZpbmUgQkdQX05PVElGWV9NQUpPUl9DQVAgICAgICAgICAgICA3Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9ub3RpZnlfbWFqb3JfdmFsdWVzW10gPSB7Ci0gICAgeyBCR1BfTk9USUZZX01BSk9SX01TRywgICAgICJNZXNzYWdlIEhlYWRlciBFcnJvciJ9LAotICAgIHsgQkdQX05PVElGWV9NQUpPUl9PUEVOLCAgICAiT1BFTiBNZXNzYWdlIEVycm9yIn0sCi0gICAgeyBCR1BfTk9USUZZX01BSk9SX1VQREFURSwgICJVUERBVEUgTWVzc2FnZSBFcnJvciJ9LAotICAgIHsgQkdQX05PVElGWV9NQUpPUl9IT0xEVElNRSwiSG9sZCBUaW1lciBFeHBpcmVkIn0sCi0gICAgeyBCR1BfTk9USUZZX01BSk9SX0ZTTSwgICAgICJGaW5pdGUgU3RhdGUgTWFjaGluZSBFcnJvciJ9LAotICAgIHsgQkdQX05PVElGWV9NQUpPUl9DRUFTRSwgICAiQ2Vhc2UifSwKLSAgICB7IEJHUF9OT1RJRllfTUFKT1JfQ0FQLCAgICAgIkNhcGFiaWxpdHkgTWVzc2FnZSBFcnJvciJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIGRyYWZ0LWlldGYtaWRyLWNlYXNlLXN1YmNvZGUtMDIgKi8KLSNkZWZpbmUgQkdQX05PVElGWV9NSU5PUl9DRUFTRV9NQVhQUkZYICAxCi1zdGF0aWMgc3RydWN0IHRvayBiZ3Bfbm90aWZ5X21pbm9yX2NlYXNlX3ZhbHVlc1tdID0gewotICAgIHsgQkdQX05PVElGWV9NSU5PUl9DRUFTRV9NQVhQUkZYLCAiTWF4aW11bSBOdW1iZXIgb2YgUHJlZml4ZXMgUmVhY2hlZCJ9LAotICAgIHsgMiwgICAgICAgICAgICAgICAgICAgICAgICAiQWRtaW5pc3RyYXRpdmVseSBTaHV0ZG93biJ9LAotICAgIHsgMywgICAgICAgICAgICAgICAgICAgICAgICAiUGVlciBVbmNvbmZpZ3VyZWQifSwKLSAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgICAgIkFkbWluaXN0cmF0aXZlbHkgUmVzZXQifSwKLSAgICB7IDUsICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gUmVqZWN0ZWQifSwKLSAgICB7IDYsICAgICAgICAgICAgICAgICAgICAgICAgIk90aGVyIENvbmZpZ3VyYXRpb24gQ2hhbmdlIn0sCi0gICAgeyA3LCAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIENvbGxpc2lvbiBSZXNvbHV0aW9uIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX25vdGlmeV9taW5vcl9tc2dfdmFsdWVzW10gPSB7Ci0gICAgeyAxLCAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIE5vdCBTeW5jaHJvbml6ZWQifSwKLSAgICB7IDIsICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBNZXNzYWdlIExlbmd0aCJ9LAotICAgIHsgMywgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIE1lc3NhZ2UgVHlwZSJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9ub3RpZnlfbWlub3Jfb3Blbl92YWx1ZXNbXSA9IHsKLSAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIFZlcnNpb24gTnVtYmVyIn0sCi0gICAgeyAyLCAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgUGVlciBBUyJ9LAotICAgIHsgMywgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIEJHUCBJZGVudGlmaWVyIn0sCi0gICAgeyA0LCAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBPcHRpb25hbCBQYXJhbWV0ZXIifSwKLSAgICB7IDUsICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0aW9uIEZhaWx1cmUifSwKLSAgICB7IDYsICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWNjZXB0YWJsZSBIb2xkIFRpbWUifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBiZ3Bfbm90aWZ5X21pbm9yX3VwZGF0ZV92YWx1ZXNbXSA9IHsKLSAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCBBdHRyaWJ1dGUgTGlzdCJ9LAotICAgIHsgMiwgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIFdlbGwta25vd24gQXR0cmlidXRlIn0sCi0gICAgeyAzLCAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIFdlbGwta25vd24gQXR0cmlidXRlIn0sCi0gICAgeyA0LCAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGUgRmxhZ3MgRXJyb3IifSwKLSAgICB7IDUsICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSBMZW5ndGggRXJyb3IifSwKLSAgICB7IDYsICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgT1JJR0lOIEF0dHJpYnV0ZSJ9LAotICAgIHsgNywgICAgICAgICAgICAgICAgICAgICAgICAiQVMgUm91dGluZyBMb29wIn0sCi0gICAgeyA4LCAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE5FWFRfSE9QIEF0dHJpYnV0ZSJ9LAotICAgIHsgOSwgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9uYWwgQXR0cmlidXRlIEVycm9yIn0sCi0gICAgeyAxMCwgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIE5ldHdvcmsgRmllbGQifSwKLSAgICB7IDExLCAgICAgICAgICAgICAgICAgICAgICAgIk1hbGZvcm1lZCBBU19QQVRIIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX25vdGlmeV9taW5vcl9jYXBfdmFsdWVzW10gPSB7Ci0gICAgeyAxLCAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEFjdGlvbiBWYWx1ZSIgfSwKLSAgICB7IDIsICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgQ2FwYWJpbGl0eSBMZW5ndGgiIH0sCi0gICAgeyAzLCAgICAgICAgICAgICAgICAgICAgICAgICJNYWxmb3JtZWQgQ2FwYWJpbGl0eSBWYWx1ZSIgfSwKLSAgICB7IDQsICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIENhcGFiaWxpdHkgQ29kZSIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX29yaWdpbl92YWx1ZXNbXSA9IHsKLSAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgICAgIklHUCJ9LAotICAgIHsgMSwgICAgICAgICAgICAgICAgICAgICAgICAiRUdQIn0sCi0gICAgeyAyLCAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBsZXRlIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotLyogU3Vic2VxdWVudCBhZGRyZXNzIGZhbWlseSBpZGVudGlmaWVyLCBSRkMyMjgzIHNlY3Rpb24gNyAqLwotI2RlZmluZSBTQUZOVU1fUkVTICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgU0FGTlVNX1VOSUNBU1QgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFNBRk5VTV9NVUxUSUNBU1QgICAgICAgICAgICAgICAgMgotI2RlZmluZSBTQUZOVU1fVU5JTVVMVElDQVNUICAgICAgICAgICAgIDMKLS8qIGxhYmVsZWQgQkdQIFJGQzMxMDcgKi8KLSNkZWZpbmUgU0FGTlVNX0xBQlVOSUNBU1QgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFNBRk5VTV9UVU5ORUwgICAgICAgICAgICAgICAgICAgNjQgLyogWFhYICovCi0jZGVmaW5lIFNBRk5VTV9WUExTICAgICAgICAgICAgICAgICAgICAgNjUgLyogWFhYICovCi0jZGVmaW5lIFNBRk5VTV9NRFQgICAgICAgICAgICAgICAgICAgICAgNjYgLyogWFhYICovCi0vKiBTZWN0aW9uIDQuMy40IG9mIGRyYWZ0LXJvc2VuLXJmYzI1NDdiaXMtMDMudHh0ICAqLwotI2RlZmluZSBTQUZOVU1fVlBOVU5JQ0FTVCAgICAgICAgICAgICAgIDEyOAotI2RlZmluZSBTQUZOVU1fVlBOTVVMVElDQVNUICAgICAgICAgICAgIDEyOQotI2RlZmluZSBTQUZOVU1fVlBOVU5JTVVMVElDQVNUICAgICAgICAgIDEzMAotLyogZHJhZnQtbWFycXVlcy1wcHZwbi1ydC1jb25zdHJhaW4tMDEudHh0ICovCi0jZGVmaW5lIFNBRk5VTV9SVF9ST1VUSU5HX0lORk8gICAgICAgICAgMTMyCi0KLSNkZWZpbmUgQkdQX1ZQTl9SRF9MRU4gICAgICAgICAgICAgICAgICA4Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9zYWZpX3ZhbHVlc1tdID0gewotICAgIHsgU0FGTlVNX1JFUywgICAgICAgICAgICAgICAiUmVzZXJ2ZWQifSwKLSAgICB7IFNBRk5VTV9VTklDQVNULCAgICAgICAgICAgIlVuaWNhc3QifSwKLSAgICB7IFNBRk5VTV9NVUxUSUNBU1QsICAgICAgICAgIk11bHRpY2FzdCJ9LAotICAgIHsgU0FGTlVNX1VOSU1VTFRJQ0FTVCwgICAgICAiVW5pY2FzdCtNdWx0aWNhc3QifSwKLSAgICB7IFNBRk5VTV9MQUJVTklDQVNULCAgICAgICAgImxhYmVsZWQgVW5pY2FzdCJ9LAotICAgIHsgU0FGTlVNX1RVTk5FTCwgICAgICAgICAgICAiVHVubmVsIn0sCi0gICAgeyBTQUZOVU1fVlBMUywgICAgICAgICAgICAgICJWUExTIn0sCi0gICAgeyBTQUZOVU1fTURULCAgICAgICAgICAgICAgICJNRFQifSwKLSAgICB7IFNBRk5VTV9WUE5VTklDQVNULCAgICAgICAgImxhYmVsZWQgVlBOIFVuaWNhc3QifSwKLSAgICB7IFNBRk5VTV9WUE5NVUxUSUNBU1QsICAgICAgImxhYmVsZWQgVlBOIE11bHRpY2FzdCJ9LAotICAgIHsgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCwgICAibGFiZWxlZCBWUE4gVW5pY2FzdCtNdWx0aWNhc3QifSwKLSAgICB7IFNBRk5VTV9SVF9ST1VUSU5HX0lORk8sICAgIlJvdXRlIFRhcmdldCBSb3V0aW5nIEluZm9ybWF0aW9uIn0sIC8qIGRyYWZ0LW1hcnF1ZXMtcHB2cG4tcnQtY29uc3RyYWluLTAxLnR4dCAqLwotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0vKiB3ZWxsLWtub3duIGNvbW11bml0eSAqLwotI2RlZmluZSBCR1BfQ09NTVVOSVRZX05PX0VYUE9SVAkJCTB4ZmZmZmZmMDEKLSNkZWZpbmUgQkdQX0NPTU1VTklUWV9OT19BRFZFUlQJCQkweGZmZmZmZjAyCi0jZGVmaW5lIEJHUF9DT01NVU5JVFlfTk9fRVhQT1JUX1NVQkNPTkZFRAkweGZmZmZmZjAzCi0KLS8qIEV4dGVuZGVkIGNvbW11bml0eSB0eXBlIC0gZHJhZnQtaWV0Zi1pZHItYmdwLWV4dC1jb21tdW5pdGllcy0wNSAqLwotI2RlZmluZSBCR1BfRVhUX0NPTV9SVF8wICAgICAgICAweDAwMDIgIC8qIFJvdXRlIFRhcmdldCxGb3JtYXQgQVMoMmJ5dGVzKTpBTig0Ynl0ZXMpICovCi0jZGVmaW5lIEJHUF9FWFRfQ09NX1JUXzEgICAgICAgIDB4MDEwMiAgLyogUm91dGUgVGFyZ2V0LEZvcm1hdCBJUCBhZGRyZXNzOkFOKDJieXRlcykgKi8KLSNkZWZpbmUgQkdQX0VYVF9DT01fUlRfMiAgICAgICAgMHgwMjAyICAvKiBSb3V0ZSBUYXJnZXQsRm9ybWF0IEFOKDRieXRlcyk6bG9jYWwoMmJ5dGVzKSAqLwotI2RlZmluZSBCR1BfRVhUX0NPTV9ST18wICAgICAgICAweDAwMDMgIC8qIFJvdXRlIE9yaWdpbixGb3JtYXQgQVMoMmJ5dGVzKTpBTig0Ynl0ZXMpICovCi0jZGVmaW5lIEJHUF9FWFRfQ09NX1JPXzEgICAgICAgIDB4MDEwMyAgLyogUm91dGUgT3JpZ2luLEZvcm1hdCBJUCBhZGRyZXNzOkFOKDJieXRlcykgKi8KLSNkZWZpbmUgQkdQX0VYVF9DT01fUk9fMiAgICAgICAgMHgwMjAzICAvKiBSb3V0ZSBPcmlnaW4sRm9ybWF0IEFOKDRieXRlcyk6bG9jYWwoMmJ5dGVzKSAqLwotI2RlZmluZSBCR1BfRVhUX0NPTV9MSU5LQkFORCAgICAweDQwMDQgIC8qIExpbmsgQmFuZHdpZHRoLEZvcm1hdCBBUygyQik6QmFuZHdpZHRoKDRCKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJmYzI1NDcgYmdwLW1wbHMtdnBucyAqLwotI2RlZmluZSBCR1BfRVhUX0NPTV9DSVNDT19NQ0FTVCAweDAwMDkgIC8qIGNpc2NvIHByb3ByaWV0YXJ5ICovCi0KLSNkZWZpbmUgQkdQX0VYVF9DT01fVlBOX09SSUdJTiAgMHgwMDA1ICAvKiBPU1BGIERvbWFpbiBJRCAvIFZQTiBvZiBPcmlnaW4gIC0gZHJhZnQtcm9zZW4tdnBucy1vc3BmLWJncC1tcGxzICovCi0jZGVmaW5lIEJHUF9FWFRfQ09NX1ZQTl9PUklHSU4yIDB4MDEwNSAgLyogZHVwbGljYXRlIC0ga2VlcCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgKi8KLSNkZWZpbmUgQkdQX0VYVF9DT01fVlBOX09SSUdJTjMgMHgwMjA1ICAvKiBkdXBsaWNhdGUgLSBrZWVwIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSAqLwotI2RlZmluZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lONCAweDgwMDUgIC8qIGR1cGxpY2F0ZSAtIGtlZXAgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5ICovCi0KLSNkZWZpbmUgQkdQX0VYVF9DT01fT1NQRl9SVFlQRSAgMHgwMzA2ICAvKiBPU1BGIFJvdXRlIFR5cGUsRm9ybWF0IEFyZWEoNEIpOlJvdXRlVHlwZSgxQik6T3B0aW9ucygxQikgKi8KLSNkZWZpbmUgQkdQX0VYVF9DT01fT1NQRl9SVFlQRTIgMHg4MDAwICAvKiBkdXBsaWNhdGUgLSBrZWVwIGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSAqLwotCi0jZGVmaW5lIEJHUF9FWFRfQ09NX09TUEZfUklEICAgIDB4MDEwNyAgLyogT1NQRiBSb3V0ZXIgSUQsRm9ybWF0IFJvdXRlcklEKDRCKTpVbnVzZWQoMkIpICovCi0jZGVmaW5lIEJHUF9FWFRfQ09NX09TUEZfUklEMiAgIDB4ODAwMSAgLyogZHVwbGljYXRlIC0ga2VlcCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgKi8gCi0KLSNkZWZpbmUgQkdQX0VYVF9DT01fTDJJTkZPICAgICAgMHg4MDBhICAvKiBkcmFmdC1rb21wZWxsYS1wcHZwbi1sMnZwbiAqLwotCi0vKiBodHRwOi8vd3d3LmNpc2NvLmNvbS9lbi9VUy90ZWNoL3RrNDM2L3RrNDI4L3RlY2hub2xvZ2llc190ZWNoX25vdGUwOTE4NmEwMDgwMWViMDlhLnNodG1sICAqLwotI2RlZmluZSBCR1BfRVhUX0NPTV9FSUdSUF9HRU4gICAweDg4MDAKLSNkZWZpbmUgQkdQX0VYVF9DT01fRUlHUlBfTUVUUklDX0FTX0RFTEFZICAweDg4MDEKLSNkZWZpbmUgQkdQX0VYVF9DT01fRUlHUlBfTUVUUklDX1JFTF9OSF9CVyAweDg4MDIKLSNkZWZpbmUgQkdQX0VYVF9DT01fRUlHUlBfTUVUUklDX0xPQURfTVRVICAweDg4MDMKLSNkZWZpbmUgQkdQX0VYVF9DT01fRUlHUlBfRVhUX1JFTUFTX1JFTUlEICAweDg4MDQKLSNkZWZpbmUgQkdQX0VYVF9DT01fRUlHUlBfRVhUX1JFTVBST1RPX1JFTU1FVFJJQyAweDg4MDUKLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX2V4dGRfY29tbV9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHg4MDAwLCAgICAgICAgICAgICAgICAgICJ2ZW5kb3Itc3BlY2lmaWMifSwKLSAgICB7IDB4NDAwMCwgICAgICAgICAgICAgICAgICAibm9uLXRyYW5zaXRpdmUifSwKLSAgICB7IDAsIE5VTEx9LAotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgYmdwX2V4dGRfY29tbV9zdWJ0eXBlX3ZhbHVlc1tdID0gewotICAgIHsgQkdQX0VYVF9DT01fUlRfMCwgICAgICAgICJ0YXJnZXQifSwKLSAgICB7IEJHUF9FWFRfQ09NX1JUXzEsICAgICAgICAidGFyZ2V0In0sCi0gICAgeyBCR1BfRVhUX0NPTV9SVF8yLCAgICAgICAgInRhcmdldCJ9LAotICAgIHsgQkdQX0VYVF9DT01fUk9fMCwgICAgICAgICJvcmlnaW4ifSwKLSAgICB7IEJHUF9FWFRfQ09NX1JPXzEsICAgICAgICAib3JpZ2luIn0sCi0gICAgeyBCR1BfRVhUX0NPTV9ST18yLCAgICAgICAgIm9yaWdpbiJ9LAotICAgIHsgQkdQX0VYVF9DT01fTElOS0JBTkQsICAgICJsaW5rLUJXIn0sCi0gICAgeyBCR1BfRVhUX0NPTV9DSVNDT19NQ0FTVCwgIm1kdC1ncm91cCJ9LAotICAgIHsgQkdQX0VYVF9DT01fVlBOX09SSUdJTiwgICJvc3BmLWRvbWFpbiJ9LAotICAgIHsgQkdQX0VYVF9DT01fVlBOX09SSUdJTjIsICJvc3BmLWRvbWFpbiJ9LAotICAgIHsgQkdQX0VYVF9DT01fVlBOX09SSUdJTjMsICJvc3BmLWRvbWFpbiJ9LAotICAgIHsgQkdQX0VYVF9DT01fVlBOX09SSUdJTjQsICJvc3BmLWRvbWFpbiJ9LAotICAgIHsgQkdQX0VYVF9DT01fT1NQRl9SVFlQRSwgICJvc3BmLXJvdXRlLXR5cGUifSwKLSAgICB7IEJHUF9FWFRfQ09NX09TUEZfUlRZUEUyLCAib3NwZi1yb3V0ZS10eXBlIn0sCi0gICAgeyBCR1BfRVhUX0NPTV9PU1BGX1JJRCwgICAgIm9zcGYtcm91dGVyLWlkIn0sCi0gICAgeyBCR1BfRVhUX0NPTV9PU1BGX1JJRDIsICAgIm9zcGYtcm91dGVyLWlkIn0sCi0gICAgeyBCR1BfRVhUX0NPTV9MMklORk8sICAgICAgImxheWVyMi1pbmZvIn0sIAotICAgIHsgQkdQX0VYVF9DT01fRUlHUlBfR0VOICwgImVpZ3JwLWdlbmVyYWwtcm91dGUgKGZsYWcsIHRhZykiIH0sCi0gICAgeyBCR1BfRVhUX0NPTV9FSUdSUF9NRVRSSUNfQVNfREVMQVkgLCAiZWlncnAtcm91dGUtbWV0cmljIChBUywgZGVsYXkpIiB9LAotICAgIHsgQkdQX0VYVF9DT01fRUlHUlBfTUVUUklDX1JFTF9OSF9CVyAsICJlaWdycC1yb3V0ZS1tZXRyaWMgKHJlbGlhYmlsaXR5LCBuZXh0aG9wLCBiYW5kd2lkdGgpIiB9LAotICAgIHsgQkdQX0VYVF9DT01fRUlHUlBfTUVUUklDX0xPQURfTVRVICwgImVpZ3JwLXJvdXRlLW1ldHJpYyAobG9hZCwgTVRVKSIgfSwKLSAgICB7IEJHUF9FWFRfQ09NX0VJR1JQX0VYVF9SRU1BU19SRU1JRCAsICJlaWdycC1leHRlcm5hbC1yb3V0ZSAocmVtb3RlLUFTLCByZW1vdGUtSUQpIiB9LAotICAgIHsgQkdQX0VYVF9DT01fRUlHUlBfRVhUX1JFTVBST1RPX1JFTU1FVFJJQyAsICJlaWdycC1leHRlcm5hbC1yb3V0ZSAocmVtb3RlLXByb3RvLCByZW1vdGUtbWV0cmljKSIgfSwKLSAgICB7IDAsIE5VTEx9LAotfTsKLQotLyogT1NQRiBjb2RlcyBmb3IgIEJHUF9FWFRfQ09NX09TUEZfUlRZUEUgZHJhZnQtcm9zZW4tdnBucy1vc3BmLWJncC1tcGxzICAqLwotI2RlZmluZSBCR1BfT1NQRl9SVFlQRV9SVFIgICAgICAxIC8qIE9TUEYgUm91dGVyIExTQSAqLwotI2RlZmluZSBCR1BfT1NQRl9SVFlQRV9ORVQgICAgICAyIC8qIE9TUEYgTmV0d29yayBMU0EgKi8KLSNkZWZpbmUgQkdQX09TUEZfUlRZUEVfU1VNICAgICAgMyAvKiBPU1BGIFN1bW1hcnkgTFNBICovCi0jZGVmaW5lIEJHUF9PU1BGX1JUWVBFX0VYVCAgICAgIDUgLyogT1NQRiBFeHRlcm5hbCBMU0EsIG5vdGUgdGhhdCBBU0JSIGRvZXNuJ3QgYXBwbHkgdG8gTVBMUy1WUE4gKi8KLSNkZWZpbmUgQkdQX09TUEZfUlRZUEVfTlNTQSAgICAgNyAvKiBPU1BGIE5TU0EgRXh0ZXJuYWwqLwotI2RlZmluZSBCR1BfT1NQRl9SVFlQRV9TSEFNICAgICAxMjkgLyogT1NQRi1NUExTLVZQTiBTaGFtIGxpbmsgKi8KLSNkZWZpbmUgQkdQX09TUEZfUlRZUEVfTUVUUklDX1RZUEUgMHgxIC8qIExTQiBvZiBSVFlQRSBPcHRpb25zIEZpZWxkICovCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJncF9leHRkX2NvbW1fb3NwZl9ydHlwZV92YWx1ZXNbXSA9IHsKLSAgeyBCR1BfT1NQRl9SVFlQRV9SVFIsICJSb3V0ZXIiIH0sICAKLSAgeyBCR1BfT1NQRl9SVFlQRV9ORVQsICJOZXR3b3JrIiB9LCAgCi0gIHsgQkdQX09TUEZfUlRZUEVfU1VNLCAiU3VtbWFyeSIgfSwgIAotICB7IEJHUF9PU1BGX1JUWVBFX0VYVCwgIkV4dGVybmFsIiB9LCAgCi0gIHsgQkdQX09TUEZfUlRZUEVfTlNTQSwiTlNTQSBFeHRlcm5hbCIgfSwKLSAgeyBCR1BfT1NQRl9SVFlQRV9TSEFNLCJNUExTLVZQTiBTaGFtIiB9LCAgCi0gIHsgMCwgTlVMTCB9LAotfTsKLQotaW50Ci1kZWNvZGVfcHJlZml4NChjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQotewotCXN0cnVjdCBpbl9hZGRyIGFkZHI7Ci0JdV9pbnQgcGxlbjsKLQotCVRDSEVDSyhwcHRyWzBdKTsKLQlwbGVuID0gcHB0clswXTsKLQlpZiAoMzIgPCBwbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0JVENIRUNLMihwcHRyWzFdLCAocGxlbiArIDcpIC8gOCk7Ci0JbWVtY3B5KCZhZGRyLCAmcHB0clsxXSwgKHBsZW4gKyA3KSAvIDgpOwotCWlmIChwbGVuICUgOCkgewotCQkoKHVfY2hhciAqKSZhZGRyKVsocGxlbiArIDcpIC8gOCAtIDFdICY9Ci0JCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOwotCX0KLQlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzLyVkIiwgZ2V0bmFtZSgodV9jaGFyICopJmFkZHIpLCBwbGVuKTsKLQlyZXR1cm4gMSArIChwbGVuICsgNykgLyA4OwotCi10cnVuYzoKLQlyZXR1cm4gLTI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlY29kZV9sYWJlbGVkX3ByZWZpeDQoY29uc3QgdV9jaGFyICpwcHRyLCBjaGFyICpidWYsIHVfaW50IGJ1ZmxlbikKLXsKLQlzdHJ1Y3QgaW5fYWRkciBhZGRyOwotCXVfaW50IHBsZW47Ci0KLQlUQ0hFQ0socHB0clswXSk7Ci0JcGxlbiA9IHBwdHJbMF07ICAgLyogZ2V0IHByZWZpeCBsZW5ndGggKi8KLQotICAgICAgICAvKiB0aGlzIGlzIG9uZSBvZiB0aGUgd2VpcmRuZXNzZXMgb2YgcmZjMzEwNwotICAgICAgICAgICB0aGUgbGFiZWwgbGVuZ3RoIChhY3R1YWxseSB0aGUgbGFiZWwgKyBDT1MgYml0cykKLSAgICAgICAgICAgaXMgYWRkZWQgdG8gdGhlIHByZWZpeCBsZW5ndGg7Ci0gICAgICAgICAgIHdlIGFsc28gZG8gb25seSByZWFkIG91dCBqdXN0IG9uZSBsYWJlbCAtCi0gICAgICAgICAgIHRoZXJlIGlzIG5vIHJlYWwgYXBwbGljYXRpb24gZm9yIGFkdmVydGlzZW1lbnQgb2YKLSAgICAgICAgICAgc3RhY2tlZCBsYWJlbHMgaW4gYSBhIHNpbmdsZSBCR1AgbWVzc2FnZQotICAgICAgICAqLwotCi0JaWYgKDI0ID4gcGxlbikKLQkJcmV0dXJuIC0xOwotCi0gICAgICAgIHBsZW4tPTI0OyAvKiBhZGp1c3QgcHJlZml4bGVuIC0gbGFiZWxsZW5ndGggKi8KLQotCWlmICgzMiA8IHBsZW4pCi0JCXJldHVybiAtMTsKLQotCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLQlUQ0hFQ0syKHBwdHJbNF0sIChwbGVuICsgNykgLyA4KTsKLQltZW1jcHkoJmFkZHIsICZwcHRyWzRdLCAocGxlbiArIDcpIC8gOCk7Ci0JaWYgKHBsZW4gJSA4KSB7Ci0JCSgodV9jaGFyICopJmFkZHIpWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KLQkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7Ci0JfQotICAgICAgICAvKiB0aGUgbGFiZWwgbWF5IGdldCBvZmZzZXR0ZWQgYnkgNCBiaXRzIHNvIGxldHMgc2hpZnQgaXQgcmlnaHQgKi8KLQlzbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzLyVkLCBsYWJlbDoldSAlcyIsCi0gICAgICAgICAgICAgICAgIGdldG5hbWUoKHVfY2hhciAqKSZhZGRyKSwKLSAgICAgICAgICAgICAgICAgcGxlbiwKLSAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocHB0cisxKT4+NCwKLSAgICAgICAgICAgICAgICAgKChwcHRyWzNdJjEpPT0wKSA/ICIoQk9HVVM6IEJvdHRvbSBvZiBTdGFjayBOT1Qgc2V0ISkiIDogIihib3R0b20pIiApOwotCi0JcmV0dXJuIDQgKyAocGxlbiArIDcpIC8gODsKLQotdHJ1bmM6Ci0JcmV0dXJuIC0yOwotfQotCi0vKiBSRHMgYW5kIFJUcyBzaGFyZSB0aGUgc2FtZSBzZW1hbnRpY3MKLSAqIHdlIHVzZSBiZ3BfdnBuX3JkX3ByaW50IGZvcgotICogcHJpbnRpbmcgcm91dGUgdGFyZ2V0cyBpbnNpZGUgYSBOTFJJICovCi1jaGFyICoKLWJncF92cG5fcmRfcHJpbnQgKGNvbnN0IHVfY2hhciAqcHB0cikgewotCi0gICAvKiBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgcG9zc2libGUgc3RyaW5nICovCi0gICAgc3RhdGljIGNoYXIgcmRbc2l6ZW9mKCJ4eHh4eHh4eHh4Onh4eHh4ICh4eHgueHh4Lnh4eC54eHg6eHh4eHgpIildOwotICAgIGNoYXIgKnBvcyA9IHJkOwotCi0gICAgLyogb2sgbGV0cyBsb2FkIHRoZSBSRCBmb3JtYXQgKi8KLSAgICBzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKHBwdHIpKSB7Ci0KLSAgICAgICAgLyogQVM6SVAtYWRkcmVzcyBmbXQqLwotICAgIGNhc2UgMDoKLSAgICAgICAgc25wcmludGYocG9zLCBzaXplb2YocmQpIC0gKHBvcyAtIHJkKSwgIiV1OiV1LiV1LiV1LiV1IiwKLSAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHBwdHIrMiksICoocHB0cis0KSwgKihwcHRyKzUpLCAqKHBwdHIrNiksICoocHB0cis3KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgICAvKiBJUC1hZGRyZXNzOkFTIGZtdCovCi0KLSAgICBjYXNlIDE6Ci0gICAgICAgIHNucHJpbnRmKHBvcywgc2l6ZW9mKHJkKSAtIChwb3MgLSByZCksICIldS4ldS4ldS4ldToldSIsCi0gICAgICAgICAgICAqKHBwdHIrMiksICoocHB0ciszKSwgKihwcHRyKzQpLCAqKHBwdHIrNSksIEVYVFJBQ1RfMTZCSVRTKHBwdHIrNikpOwotICAgICAgICBicmVhazsKLQotICAgICAgICAvKiA0LWJ5dGUtQVM6bnVtYmVyIGZtdCovCi0gICAgY2FzZSAyOgotICAgICAgICBzbnByaW50Zihwb3MsIHNpemVvZihyZCkgLSAocG9zIC0gcmQpLCAiJXU6JXUgKCV1LiV1LiV1LiV1OiV1KSIsCi0gICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhwcHRyKzIpLCBFWFRSQUNUXzE2QklUUyhwcHRyKzYpLAotICAgICAgICAgICAgKihwcHRyKzIpLCAqKHBwdHIrMyksICoocHB0cis0KSwgKihwcHRyKzUpLCBFWFRSQUNUXzE2QklUUyhwcHRyKzYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc25wcmludGYocG9zLCBzaXplb2YocmQpIC0gKHBvcyAtIHJkKSwgInVua25vd24gUkQgZm9ybWF0Iik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwb3MgKz0gc3RybGVuKHBvcyk7Ci0gICAgKihwb3MpID0gJ1wwJzsKLSAgICByZXR1cm4gKHJkKTsKLX0KLQotc3RhdGljIGludAotZGVjb2RlX3J0X3JvdXRpbmdfaW5mbyhjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQotewotCXVfaW50OF90IHJvdXRlX3RhcmdldFs4XTsKLQl1X2ludCBwbGVuOwotCi0JVENIRUNLKHBwdHJbMF0pOwotCXBsZW4gPSBwcHRyWzBdOyAgIC8qIGdldCBwcmVmaXggbGVuZ3RoICovCi0KLQlpZiAoMCA9PSBwbGVuKQotCQlyZXR1cm4gMTsgLyogZGVmYXVsdCByb3V0ZSB0YXJnZXQgKi8KLQotCWlmICgzMiA+IHBsZW4pCi0JCXJldHVybiAtMTsKLQotICAgICAgICBwbGVuLT0zMjsgLyogYWRqdXN0IHByZWZpeCBsZW5ndGggKi8KLQotCWlmICg2NCA8IHBsZW4pCi0JCXJldHVybiAtMTsKLQotCW1lbXNldCgmcm91dGVfdGFyZ2V0LCAwLCBzaXplb2Yocm91dGVfdGFyZ2V0KSk7Ci0JVENIRUNLMihwcHRyWzFdLCAocGxlbiArIDcpIC8gOCk7Ci0JbWVtY3B5KCZyb3V0ZV90YXJnZXQsICZwcHRyWzFdLCAocGxlbiArIDcpIC8gOCk7Ci0JaWYgKHBsZW4gJSA4KSB7Ci0JCSgodV9jaGFyICopJnJvdXRlX3RhcmdldClbKHBsZW4gKyA3KSAvIDggLSAxXSAmPQotCQkJKCgweGZmMDAgPj4gKHBsZW4gJSA4KSkgJiAweGZmKTsKLQl9Ci0Jc25wcmludGYoYnVmLCBidWZsZW4sICJvcmlnaW4gQVM6ICV1LCByb3V0ZSB0YXJnZXQgJXMiLAotICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhwcHRyKzEpLAotICAgICAgICAgICAgICAgICBiZ3BfdnBuX3JkX3ByaW50KCh1X2NoYXIgKikmcm91dGVfdGFyZ2V0KSk7Ci0KLQlyZXR1cm4gNSArIChwbGVuICsgNykgLyA4OwotCi10cnVuYzoKLQlyZXR1cm4gLTI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlY29kZV9sYWJlbGVkX3Zwbl9wcmVmaXg0KGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCi17Ci0Jc3RydWN0IGluX2FkZHIgYWRkcjsKLQl1X2ludCBwbGVuOwotCi0JVENIRUNLKHBwdHJbMF0pOwotCXBsZW4gPSBwcHRyWzBdOyAgIC8qIGdldCBwcmVmaXggbGVuZ3RoICovCi0KLQlpZiAoKDI0KzY0KSA+IHBsZW4pCi0JCXJldHVybiAtMTsKLQotICAgICAgICBwbGVuLT0oMjQrNjQpOyAvKiBhZGp1c3QgcHJlZml4bGVuIC0gbGFiZWxsZW5ndGggLSBSRCBsZW4qLwotCi0JaWYgKDMyIDwgcGxlbikKLQkJcmV0dXJuIC0xOwotCi0JbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotCVRDSEVDSzIocHB0clsxMl0sIChwbGVuICsgNykgLyA4KTsKLQltZW1jcHkoJmFkZHIsICZwcHRyWzEyXSwgKHBsZW4gKyA3KSAvIDgpOwotCWlmIChwbGVuICUgOCkgewotCQkoKHVfY2hhciAqKSZhZGRyKVsocGxlbiArIDcpIC8gOCAtIDFdICY9Ci0JCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOwotCX0KLSAgICAgICAgLyogdGhlIGxhYmVsIG1heSBnZXQgb2Zmc2V0dGVkIGJ5IDQgYml0cyBzbyBsZXRzIHNoaWZ0IGl0IHJpZ2h0ICovCi0Jc25wcmludGYoYnVmLCBidWZsZW4sICJSRDogJXMsICVzLyVkLCBsYWJlbDoldSAlcyIsCi0gICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQocHB0cis0KSwKLSAgICAgICAgICAgICAgICAgZ2V0bmFtZSgodV9jaGFyICopJmFkZHIpLAotICAgICAgICAgICAgICAgICBwbGVuLAotICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwcHRyKzEpPj40LAotICAgICAgICAgICAgICAgICAoKHBwdHJbM10mMSk9PTApID8gIihCT0dVUzogQm90dG9tIG9mIFN0YWNrIE5PVCBzZXQhKSIgOiAiKGJvdHRvbSkiICk7Ci0KLQlyZXR1cm4gMTIgKyAocGxlbiArIDcpIC8gODsKLQotdHJ1bmM6Ci0JcmV0dXJuIC0yOwotfQotCi0vKgotICogQXMgSSByZW1lbWJlciwgc29tZSB2ZXJzaW9ucyBvZiBzeXN0ZW1zIGhhdmUgYW4gc25wcmludGYoKSB0aGF0Ci0gKiByZXR1cm5zIC0xIGlmIHRoZSBidWZmZXIgd291bGQgaGF2ZSBvdmVyZmxvd2VkLiAgSWYgdGhlIHJldHVybgotICogdmFsdWUgaXMgbmVnYXRpdmUsIHNldCBidWZsZW4gdG8gMCwgdG8gaW5kaWNhdGUgdGhhdCB3ZSd2ZSBmaWxsZWQKLSAqIHRoZSBidWZmZXIgdXAuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gYnVmbGVuLCB0aGF0IG1lYW5zIHRoYXQKLSAqIHRoZSBidWZmZXIgd291bGQgaGF2ZSBvdmVyZmxvd2VkOyBhZ2Fpbiwgc2V0IGJ1ZmxlbiB0byAwIGluCi0gKiB0aGF0IGNhc2UuCi0gKi8KLSNkZWZpbmUgVVBEQVRFX0JVRl9CVUZMRU4oYnVmLCBidWZsZW4sIHN0cmxlbikgXAotICAgIGlmIChzdHJsZW48MCkgXAotICAgICAgIAlidWZsZW49MDsgXAotICAgIGVsc2UgaWYgKCh1X2ludClzdHJsZW4+YnVmbGVuKSBcCi0gICAgICAgIGJ1Zmxlbj0wOyBcCi0gICAgZWxzZSB7IFwKLSAgICAgICAgYnVmbGVuLT1zdHJsZW47IFwKLQlidWYrPXN0cmxlbjsgXAotICAgIH0KLQotc3RhdGljIGludAotZGVjb2RlX2xhYmVsZWRfdnBuX2wyKGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCi17Ci0gICAgICAgIGludCBwbGVuLHRsZW4sc3RybGVuLHRsdl90eXBlLHRsdl9sZW4sdHRsdl9sZW47Ci0KLQlUQ0hFQ0syKHBwdHJbMF0sIDIpOwotICAgICAgICBwbGVuPUVYVFJBQ1RfMTZCSVRTKHBwdHIpOwotICAgICAgICB0bGVuPXBsZW47Ci0gICAgICAgIHBwdHIrPTI7Ci0JVENIRUNLMihwcHRyWzBdLDE1KTsKLQlidWZbMF09J1wwJzsKLSAgICAgICAgc3RybGVuPXNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiUkQ6ICVzLCBDRS1JRDogJXUsIExhYmVsLUJsb2NrIE9mZnNldDogJXUsIExhYmVsIEJhc2UgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludChwcHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHBwdHIrOCksCi0gICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhwcHRyKzEwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKHBwdHIrMTIpPj40KTsgLyogdGhlIGxhYmVsIGlzIG9mZnNldHRlZCBieSA0IGJpdHMgc28gbGV0cyBzaGlmdCBpdCByaWdodCAqLwotICAgICAgICBVUERBVEVfQlVGX0JVRkxFTihidWYsIGJ1Zmxlbiwgc3RybGVuKTsKLSAgICAgICAgcHB0cis9MTU7Ci0gICAgICAgIHRsZW4tPTE1OwotCi0gICAgICAgIC8qIG9rIG5vdyB0aGUgdmFyaWFibGUgcGFydCAtIGxldHMgcmVhZCBvdXQgVExWcyovCi0gICAgICAgIHdoaWxlICh0bGVuPjApIHsKLSAgICAgICAgICAgIGlmICh0bGVuIDwgMykKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBUQ0hFQ0syKHBwdHJbMF0sIDMpOwotICAgICAgICAgICAgdGx2X3R5cGU9KnBwdHIrKzsKLSAgICAgICAgICAgIHRsdl9sZW49RVhUUkFDVF8xNkJJVFMocHB0cik7Ci0gICAgICAgICAgICB0dGx2X2xlbj10bHZfbGVuOwotICAgICAgICAgICAgcHB0cis9MjsKLQotICAgICAgICAgICAgc3dpdGNoKHRsdl90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYgKGJ1ZmxlbiE9MCkgewotICAgICAgICAgICAgICAgICAgICBzdHJsZW49c25wcmludGYoYnVmLGJ1ZmxlbiwgIlxuXHRcdGNpcmN1aXQgc3RhdHVzIHZlY3RvciAoJXUpIGxlbmd0aDogJXU6IDB4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X2xlbik7Ci0gICAgICAgICAgICAgICAgICAgIFVQREFURV9CVUZfQlVGTEVOKGJ1ZiwgYnVmbGVuLCBzdHJsZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0dGx2X2xlbj10dGx2X2xlbi84KzE7IC8qIGhvdyBtYW55IGJ5dGVzIGRvIHdlIG5lZWQgdG8gcmVhZCA/ICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKHR0bHZfbGVuPjApIHsKLSAgICAgICAgICAgICAgICAgICAgVENIRUNLKHBwdHJbMF0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmbGVuIT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW49c25wcmludGYoYnVmLGJ1ZmxlbiwgIiUwMngiLCpwcHRyKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0JVRl9CVUZMRU4oYnVmLCBidWZsZW4sIHN0cmxlbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdHRsdl9sZW4tLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmIChidWZsZW4hPTApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybGVuPXNucHJpbnRmKGJ1ZixidWZsZW4sICJcblx0XHR1bmtub3duIFRMViAjJXUsIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0JVRl9CVUZMRU4oYnVmLCBidWZsZW4sIHN0cmxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGxlbi09KHRsdl9sZW48PDMpOyAvKiB0aGUgdGx2LWxlbmd0aCBpcyBleHByZXNzZWQgaW4gYml0cyBzbyBsZXRzIHNoaWZ0IGl0IHJpZ2h0ICovCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBsZW4rMjsKLQotdHJ1bmM6Ci0gICAgICAgIHJldHVybiAtMjsKLX0KLQotI2lmZGVmIElORVQ2Ci1pbnQKLWRlY29kZV9wcmVmaXg2KGNvbnN0IHVfY2hhciAqcGQsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQotewotCXN0cnVjdCBpbjZfYWRkciBhZGRyOwotCXVfaW50IHBsZW47Ci0KLQlUQ0hFQ0socGRbMF0pOwotCXBsZW4gPSBwZFswXTsKLQlpZiAoMTI4IDwgcGxlbikKLQkJcmV0dXJuIC0xOwotCi0JbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwotCVRDSEVDSzIocGRbMV0sIChwbGVuICsgNykgLyA4KTsKLQltZW1jcHkoJmFkZHIsICZwZFsxXSwgKHBsZW4gKyA3KSAvIDgpOwotCWlmIChwbGVuICUgOCkgewotCQlhZGRyLnM2X2FkZHJbKHBsZW4gKyA3KSAvIDggLSAxXSAmPQotCQkJKCgweGZmMDAgPj4gKHBsZW4gJSA4KSkgJiAweGZmKTsKLQl9Ci0Jc25wcmludGYoYnVmLCBidWZsZW4sICIlcy8lZCIsIGdldG5hbWU2KCh1X2NoYXIgKikmYWRkciksIHBsZW4pOwotCXJldHVybiAxICsgKHBsZW4gKyA3KSAvIDg7Ci0KLXRydW5jOgotCXJldHVybiAtMjsKLX0KLQotc3RhdGljIGludAotZGVjb2RlX2xhYmVsZWRfcHJlZml4Nihjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQotewotCXN0cnVjdCBpbjZfYWRkciBhZGRyOwotCXVfaW50IHBsZW47Ci0KLQlUQ0hFQ0socHB0clswXSk7Ci0JcGxlbiA9IHBwdHJbMF07IC8qIGdldCBwcmVmaXggbGVuZ3RoICovCi0KLQlpZiAoMjQgPiBwbGVuKQotCQlyZXR1cm4gLTE7Ci0KLSAgICAgICAgcGxlbi09MjQ7IC8qIGFkanVzdCBwcmVmaXhsZW4gLSBsYWJlbGxlbmd0aCAqLwotCi0JaWYgKDEyOCA8IHBsZW4pCi0JCXJldHVybiAtMTsKLQotCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLQlUQ0hFQ0syKHBwdHJbNF0sIChwbGVuICsgNykgLyA4KTsKLQltZW1jcHkoJmFkZHIsICZwcHRyWzRdLCAocGxlbiArIDcpIC8gOCk7Ci0JaWYgKHBsZW4gJSA4KSB7Ci0JCWFkZHIuczZfYWRkclsocGxlbiArIDcpIC8gOCAtIDFdICY9Ci0JCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOwotCX0KLSAgICAgICAgLyogdGhlIGxhYmVsIG1heSBnZXQgb2Zmc2V0dGVkIGJ5IDQgYml0cyBzbyBsZXRzIHNoaWZ0IGl0IHJpZ2h0ICovCi0Jc25wcmludGYoYnVmLCBidWZsZW4sICIlcy8lZCwgbGFiZWw6JXUgJXMiLAotICAgICAgICAgICAgICAgICBnZXRuYW1lNigodV9jaGFyICopJmFkZHIpLAotICAgICAgICAgICAgICAgICBwbGVuLAotICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwcHRyKzEpPj40LAotICAgICAgICAgICAgICAgICAoKHBwdHJbM10mMSk9PTApID8gIihCT0dVUzogQm90dG9tIG9mIFN0YWNrIE5PVCBzZXQhKSIgOiAiKGJvdHRvbSkiICk7Ci0KLQlyZXR1cm4gNCArIChwbGVuICsgNykgLyA4OwotCi10cnVuYzoKLQlyZXR1cm4gLTI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlY29kZV9sYWJlbGVkX3Zwbl9wcmVmaXg2KGNvbnN0IHVfY2hhciAqcHB0ciwgY2hhciAqYnVmLCB1X2ludCBidWZsZW4pCi17Ci0Jc3RydWN0IGluNl9hZGRyIGFkZHI7Ci0JdV9pbnQgcGxlbjsKLQotCVRDSEVDSyhwcHRyWzBdKTsKLQlwbGVuID0gcHB0clswXTsgICAvKiBnZXQgcHJlZml4IGxlbmd0aCAqLwotCi0JaWYgKCgyNCs2NCkgPiBwbGVuKQotCQlyZXR1cm4gLTE7Ci0KLSAgICAgICAgcGxlbi09KDI0KzY0KTsgLyogYWRqdXN0IHByZWZpeGxlbiAtIGxhYmVsbGVuZ3RoIC0gUkQgbGVuKi8KLQotCWlmICgxMjggPCBwbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0JVENIRUNLMihwcHRyWzEyXSwgKHBsZW4gKyA3KSAvIDgpOwotCW1lbWNweSgmYWRkciwgJnBwdHJbMTJdLCAocGxlbiArIDcpIC8gOCk7Ci0JaWYgKHBsZW4gJSA4KSB7Ci0JCWFkZHIuczZfYWRkclsocGxlbiArIDcpIC8gOCAtIDFdICY9Ci0JCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOwotCX0KLSAgICAgICAgLyogdGhlIGxhYmVsIG1heSBnZXQgb2Zmc2V0dGVkIGJ5IDQgYml0cyBzbyBsZXRzIHNoaWZ0IGl0IHJpZ2h0ICovCi0Jc25wcmludGYoYnVmLCBidWZsZW4sICJSRDogJXMsICVzLyVkLCBsYWJlbDoldSAlcyIsCi0gICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQocHB0cis0KSwKLSAgICAgICAgICAgICAgICAgZ2V0bmFtZTYoKHVfY2hhciAqKSZhZGRyKSwKLSAgICAgICAgICAgICAgICAgcGxlbiwKLSAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocHB0cisxKT4+NCwKLSAgICAgICAgICAgICAgICAgKChwcHRyWzNdJjEpPT0wKSA/ICIoQk9HVVM6IEJvdHRvbSBvZiBTdGFjayBOT1Qgc2V0ISkiIDogIihib3R0b20pIiApOwotCi0JcmV0dXJuIDEyICsgKHBsZW4gKyA3KSAvIDg7Ci0KLXRydW5jOgotCXJldHVybiAtMjsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1kZWNvZGVfY2xucF9wcmVmaXgoY29uc3QgdV9jaGFyICpwcHRyLCBjaGFyICpidWYsIHVfaW50IGJ1ZmxlbikKLXsKLSAgICAgICAgdV9pbnQ4X3QgYWRkclsxOV07Ci0JdV9pbnQgcGxlbjsKLQotCVRDSEVDSyhwcHRyWzBdKTsKLQlwbGVuID0gcHB0clswXTsgLyogZ2V0IHByZWZpeCBsZW5ndGggKi8KLQotCWlmICgxNTIgPCBwbGVuKQotCQlyZXR1cm4gLTE7Ci0KLQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7Ci0JVENIRUNLMihwcHRyWzRdLCAocGxlbiArIDcpIC8gOCk7Ci0JbWVtY3B5KCZhZGRyLCAmcHB0cls0XSwgKHBsZW4gKyA3KSAvIDgpOwotCWlmIChwbGVuICUgOCkgewotCQlhZGRyWyhwbGVuICsgNykgLyA4IC0gMV0gJj0KLQkJCSgoMHhmZjAwID4+IChwbGVuICUgOCkpICYgMHhmZik7Ci0JfQotCXNucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMvJWQiLAotICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyhhZGRyLChwbGVuICsgNykgLyA4KSwKLSAgICAgICAgICAgICAgICAgcGxlbik7Ci0KLQlyZXR1cm4gMSArIChwbGVuICsgNykgLyA4OwotCi10cnVuYzoKLQlyZXR1cm4gLTI7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlY29kZV9sYWJlbGVkX3Zwbl9jbG5wX3ByZWZpeChjb25zdCB1X2NoYXIgKnBwdHIsIGNoYXIgKmJ1ZiwgdV9pbnQgYnVmbGVuKQotewotICAgICAgICB1X2ludDhfdCBhZGRyWzE5XTsKLQl1X2ludCBwbGVuOwotCi0JVENIRUNLKHBwdHJbMF0pOwotCXBsZW4gPSBwcHRyWzBdOyAgIC8qIGdldCBwcmVmaXggbGVuZ3RoICovCi0KLQlpZiAoKDI0KzY0KSA+IHBsZW4pCi0JCXJldHVybiAtMTsKLQotICAgICAgICBwbGVuLT0oMjQrNjQpOyAvKiBhZGp1c3QgcHJlZml4bGVuIC0gbGFiZWxsZW5ndGggLSBSRCBsZW4qLwotCi0JaWYgKDE1MiA8IHBsZW4pCi0JCXJldHVybiAtMTsKLQotCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKLQlUQ0hFQ0syKHBwdHJbMTJdLCAocGxlbiArIDcpIC8gOCk7Ci0JbWVtY3B5KCZhZGRyLCAmcHB0clsxMl0sIChwbGVuICsgNykgLyA4KTsKLQlpZiAocGxlbiAlIDgpIHsKLQkJYWRkclsocGxlbiArIDcpIC8gOCAtIDFdICY9Ci0JCQkoKDB4ZmYwMCA+PiAocGxlbiAlIDgpKSAmIDB4ZmYpOwotCX0KLSAgICAgICAgLyogdGhlIGxhYmVsIG1heSBnZXQgb2Zmc2V0dGVkIGJ5IDQgYml0cyBzbyBsZXRzIHNoaWZ0IGl0IHJpZ2h0ICovCi0Jc25wcmludGYoYnVmLCBidWZsZW4sICJSRDogJXMsICVzLyVkLCBsYWJlbDoldSAlcyIsCi0gICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQocHB0cis0KSwKLSAgICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcoYWRkciwocGxlbiArIDcpIC8gOCksCi0gICAgICAgICAgICAgICAgIHBsZW4sCi0gICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKHBwdHIrMSk+PjQsCi0gICAgICAgICAgICAgICAgICgocHB0clszXSYxKT09MCkgPyAiKEJPR1VTOiBCb3R0b20gb2YgU3RhY2sgTk9UIHNldCEpIiA6ICIoYm90dG9tKSIgKTsKLQotCXJldHVybiAxMiArIChwbGVuICsgNykgLyA4OwotCi10cnVuYzoKLQlyZXR1cm4gLTI7Ci19Ci0KLXN0YXRpYyBpbnQKLWJncF9hdHRyX3ByaW50KGNvbnN0IHN0cnVjdCBiZ3BfYXR0ciAqYXR0ciwgY29uc3QgdV9jaGFyICpwcHRyLCBpbnQgbGVuKQotewotCWludCBpOwotCXVfaW50MTZfdCBhZjsKLQl1X2ludDhfdCBzYWZpLCBzbnBhLCBuaGxlbjsKLSAgICAgICAgdW5pb24geyAvKiBjb3B5IGJ1ZmZlciBmb3IgYmFuZHdpZHRoIHZhbHVlcyAqLwotICAgICAgICAgICAgZmxvYXQgZjsgCi0gICAgICAgICAgICB1X2ludDMyX3QgaTsKLSAgICAgICAgfSBidzsKLQlpbnQgYWR2YW5jZTsKLQlpbnQgdGxlbjsKLQljb25zdCB1X2NoYXIgKnRwdHI7Ci0JY2hhciBidWZbTUFYSE9TVE5BTUVMRU4gKyAxMDBdOwotCWNoYXIgdG9rYnVmW1RPS0JVRlNJWkVdOwotCi0gICAgICAgIHRwdHIgPSBwcHRyOwotICAgICAgICB0bGVuPWxlbjsKLQotCXN3aXRjaCAoYXR0ci0+YmdwYV90eXBlKSB7Ci0JY2FzZSBCR1BUWVBFX09SSUdJTjoKLQkJaWYgKGxlbiAhPSAxKQotCQkJcHJpbnRmKCJpbnZhbGlkIGxlbiIpOwotCQllbHNlIHsKLQkJCVRDSEVDSygqdHB0cik7Ci0JCQlwcmludGYoIiVzIiwgdG9rMnN0cmJ1ZihiZ3Bfb3JpZ2luX3ZhbHVlcywKLQkJCQkJCSJVbmtub3duIE9yaWdpbiBUeXBlY29kZSIsCi0JCQkJCQl0cHRyWzBdLAotCQkJCQkJdG9rYnVmLCBzaXplb2YodG9rYnVmKSkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBCR1BUWVBFX0FTX1BBVEg6Ci0JCWlmIChsZW4gJSAyKSB7Ci0JCQlwcmludGYoImludmFsaWQgbGVuIik7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICAgICAgICAgIGlmICghbGVuKSB7Ci0JCQlwcmludGYoImVtcHR5Iik7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLQkJd2hpbGUgKHRwdHIgPCBwcHRyICsgbGVuKSB7Ci0JCQlUQ0hFQ0sodHB0clswXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwgdG9rMnN0cmJ1ZihiZ3BfYXNfcGF0aF9zZWdtZW50X29wZW5fdmFsdWVzLAotCQkJCQkJIj8iLCB0cHRyWzBdLAotCQkJCQkJdG9rYnVmLCBzaXplb2YodG9rYnVmKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRwdHJbMV0gKiAyOyBpICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMiArIGldLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiV1ICIsIEVYVFJBQ1RfMTZCSVRTKCZ0cHRyWzIgKyBpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJVENIRUNLKHRwdHJbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsIHRvazJzdHJidWYoYmdwX2FzX3BhdGhfc2VnbWVudF9jbG9zZV92YWx1ZXMsCi0JCQkJCQkiPyIsIHRwdHJbMF0sCi0JCQkJCQl0b2tidWYsIHNpemVvZih0b2tidWYpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0sodHB0clsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IDIgKyB0cHRyWzFdICogMjsKLQkJfQotCQlicmVhazsKLQljYXNlIEJHUFRZUEVfTkVYVF9IT1A6Ci0JCWlmIChsZW4gIT0gNCkKLQkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKLQkJZWxzZSB7Ci0JCQlUQ0hFQ0syKHRwdHJbMF0sIDQpOwotCQkJcHJpbnRmKCIlcyIsIGdldG5hbWUodHB0cikpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQkdQVFlQRV9NVUxUSV9FWElUX0RJU0M6Ci0JY2FzZSBCR1BUWVBFX0xPQ0FMX1BSRUY6Ci0JCWlmIChsZW4gIT0gNCkKLQkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKLQkJZWxzZSB7Ci0JCQlUQ0hFQ0syKHRwdHJbMF0sIDQpOwotCQkJcHJpbnRmKCIldSIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIEJHUFRZUEVfQVRPTUlDX0FHR1JFR0FURToKLQkJaWYgKGxlbiAhPSAwKQotCQkJcHJpbnRmKCJpbnZhbGlkIGxlbiIpOwotCQlicmVhazsKLQljYXNlIEJHUFRZUEVfQUdHUkVHQVRPUjoKLQkJaWYgKGxlbiAhPSA2KSB7Ci0JCQlwcmludGYoImludmFsaWQgbGVuIik7Ci0JCQlicmVhazsKLQkJfQotCQlUQ0hFQ0syKHRwdHJbMF0sIDYpOwotCQlwcmludGYoIiBBUyAjJXUsIG9yaWdpbiAlcyIsIEVYVFJBQ1RfMTZCSVRTKHRwdHIpLAotCQkJZ2V0bmFtZSh0cHRyICsgMikpOwotCQlicmVhazsKLQljYXNlIEJHUFRZUEVfQ09NTVVOSVRJRVM6Ci0JCWlmIChsZW4gJSA0KSB7Ci0JCQlwcmludGYoImludmFsaWQgbGVuIik7Ci0JCQlicmVhazsKLQkJfQotCQl3aGlsZSAodGxlbj4wKSB7Ci0JCQl1X2ludDMyX3QgY29tbTsKLQkJCVRDSEVDSzIodHB0clswXSwgNCk7Ci0JCQljb21tID0gRVhUUkFDVF8zMkJJVFModHB0cik7Ci0JCQlzd2l0Y2ggKGNvbW0pIHsKLQkJCWNhc2UgQkdQX0NPTU1VTklUWV9OT19FWFBPUlQ6Ci0JCQkJcHJpbnRmKCIgTk9fRVhQT1JUIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJHUF9DT01NVU5JVFlfTk9fQURWRVJUOgotCQkJCXByaW50ZigiIE5PX0FEVkVSVElTRSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCR1BfQ09NTVVOSVRZX05PX0VYUE9SVF9TVUJDT05GRUQ6Ci0JCQkJcHJpbnRmKCIgTk9fRVhQT1JUX1NVQkNPTkZFRCIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGYoIiV1OiV1JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbW0gPj4gMTYpICYgMHhmZmZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbSAmIDB4ZmZmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bGVuPjQpID8gIiwgIiA6ICIiKTsKLQkJCQlicmVhazsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gLT00OwotICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciArPTQ7Ci0JCX0KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgQkdQVFlQRV9PUklHSU5BVE9SX0lEOgotCQlpZiAobGVuICE9IDQpIHsKLQkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCVRDSEVDSzIodHB0clswXSwgNCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsZ2V0bmFtZSh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkdQVFlQRV9DTFVTVEVSX0xJU1Q6Ci0JCWlmIChsZW4gJSA0KSB7Ci0JCQlwcmludGYoImludmFsaWQgbGVuIik7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICAgICAgICAgIHdoaWxlICh0bGVuPjApIHsKLQkJCVRDSEVDSzIodHB0clswXSwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldG5hbWUodHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bGVuPjQpID8gIiwgIiA6ICIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gLT00OwotICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciArPTQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCWNhc2UgQkdQVFlQRV9NUF9SRUFDSF9OTFJJOgotCQlUQ0hFQ0syKHRwdHJbMF0sIDMpOwotCQlhZiA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIpOwotCQlzYWZpID0gdHB0clsyXTsKLQkKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQUZJOiAlcyAoJXUpLCAlc1NBRkk6ICVzICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGFmX3ZhbHVlcywgIlVua25vd24gQUZJIiwgYWYsCi0JCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgYWYsCi0gICAgICAgICAgICAgICAgICAgICAgIChzYWZpPjEyOCkgPyAidmVuZG9yIHNwZWNpZmljICIgOiAiIiwgLyogMTI4IGlzIG1lYW53aGlsZSB3ZWxsa25vd24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3Bfc2FmaV92YWx1ZXMsICJVbmtub3duIFNBRkkiLCBzYWZpLAotCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCi0gICAgICAgICAgICAgICAgICAgICAgIHNhZmkpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKGFmPDw4IHwgc2FmaSkgewotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX0xBQlVOSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fUlRfUk9VVElOR19JTkZPKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9VTklDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fUlRfUk9VVElOR19JTkZPKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1VOSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0wyVlBOPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgotICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0wyVlBOPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9WUExTPDw4IHwgU0FGTlVNX1ZQTFMpOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMF0sIHRsZW4pOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgbm8gQUZJICV1IC8gU0FGSSAldSBkZWNvZGVyIixhZixzYWZpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAiLHRsZW4pOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRwdHIgKz0zOwotCi0JCVRDSEVDSyh0cHRyWzBdKTsKLQkJbmhsZW4gPSB0cHRyWzBdOwotICAgICAgICAgICAgICAgIHRsZW4gPSBuaGxlbjsKLSAgICAgICAgICAgICAgICB0cHRyKys7Ci0KLQkJaWYgKHRsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIG5leHRob3A6ICIpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGxlbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChhZjw8OCB8IHNhZmkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX0xBQlVOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9SVF9ST1VUSU5HX0lORk8pOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bGVuIDwgKGludClzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBsZW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsZ2V0bmFtZSh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciArPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsZW4gPCAoaW50KShzaXplb2Yoc3RydWN0IGluX2FkZHIpK0JHUF9WUE5fUkRfTEVOKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImludmFsaWQgbGVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKStCR1BfVlBOX1JEX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUkQ6ICVzLCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BfdnBuX3JkX3ByaW50KHRwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0bmFtZSh0cHRyK0JHUF9WUE5fUkRfTEVOKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gLT0gKHNpemVvZihzdHJ1Y3QgaW5fYWRkcikrQkdQX1ZQTl9SRF9MRU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IChzaXplb2Yoc3RydWN0IGluX2FkZHIpK0JHUF9WUE5fUkRfTEVOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9MQUJVTklDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1JUX1JPVVRJTkdfSU5GTyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsZW4gPCAoaW50KXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBsZW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCBnZXRuYW1lNih0cHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGxlbiA8IChpbnQpKHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpK0JHUF9WUE5fUkRfTEVOKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImludmFsaWQgbGVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikrQkdQX1ZQTl9SRF9MRU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJEOiAlcywgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludCh0cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldG5hbWU2KHRwdHIrQkdQX1ZQTl9SRF9MRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPSAoc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikrQkdQX1ZQTl9SRF9MRU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IChzaXplb2Yoc3RydWN0IGluNl9hZGRyKStCR1BfVlBOX1JEX0xFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9WUExTPDw4IHwgU0FGTlVNX1ZQTFMpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGxlbiA8IChpbnQpc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImludmFsaWQgbGVuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLCBnZXRuYW1lKHRwdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiAtPSAoc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gKHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCB0bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIixpc29uc2FwX3N0cmluZyh0cHRyLHRsZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IHRsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsZW4gPCBCR1BfVlBOX1JEX0xFTisxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW52YWxpZCBsZW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMih0cHRyWzBdLCB0bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSRDogJXMsICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQodHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyh0cHRyK0JHUF9WUE5fUkRfTEVOLHRsZW4tQkdQX1ZQTl9SRF9MRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmZjOTg2IG1hcHBlZCBJUHY0IGFkZHJlc3MgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFModHB0citCR1BfVlBOX1JEX0xFTikgPT0gIDB4NDcwMDA2MDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiA9ICVzIiwgZ2V0bmFtZSh0cHRyK0JHUF9WUE5fUkRfTEVOKzQpKTsKLSNpZmRlZiBJTkVUNgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZmMxODg4IG1hcHBlZCBJUHY2IGFkZHJlc3MgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChFWFRSQUNUXzI0QklUUyh0cHRyK0JHUF9WUE5fUkRfTEVOKSA9PSAgMHgzNTAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiA9ICVzIiwgZ2V0bmFtZTYodHB0citCR1BfVlBOX1JEX0xFTiszKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciArPSB0bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgdGxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJubyBBRkkgJXUvU0FGSSAldSBkZWNvZGVyIixhZixzYWZpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICAgIix0bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyICs9IHRsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgICAgICAgICBwcmludGYoIiwgbmgtbGVuZ3RoOiAldSIsIG5obGVuKTsKLQkJdHB0ciArPSB0bGVuOwotCi0JCVRDSEVDSyh0cHRyWzBdKTsKLQkJc25wYSA9IHRwdHJbMF07Ci0JCXRwdHIrKzsKLQotCQlpZiAoc25wYSkgewotCQkJcHJpbnRmKCJcblx0ICAgICV1IFNOUEEiLCBzbnBhKTsKLQkJCWZvciAoLypub3RoaW5nKi87IHNucGEgPiAwOyBzbnBhLS0pIHsKLQkJCQlUQ0hFQ0sodHB0clswXSk7Ci0JCQkJcHJpbnRmKCJcblx0ICAgICAgJWQgYnl0ZXMiLCB0cHRyWzBdKTsKLQkJCQl0cHRyICs9IHRwdHJbMF0gKyAxOwotCQkJfQotCQl9IGVsc2UgewotCQkJcHJpbnRmKCIsIG5vIFNOUEEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLQkJd2hpbGUgKGxlbiAtICh0cHRyIC0gcHB0cikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWY8PDggfCBzYWZpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklNVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9wcmVmaXg0KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfcHJlZml4NCh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fcHJlZml4NCh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1JUX1JPVVRJTkdfSU5GTyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX3J0X3JvdXRpbmdfaW5mbyh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9VTklNVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9wcmVmaXg2KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX0xBQlVOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9sYWJlbGVkX3ByZWZpeDYodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfdnBuX3ByZWZpeDYodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fUlRfUk9VVElOR19JTkZPKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfcnRfcm91dGluZ19pbmZvKHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fVlBMUzw8OCB8IFNBRk5VTV9WUExTKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0wyVlBOPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0wyVlBOPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfdnBuX2wyKHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIGxlbmd0aCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7ICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9VTklDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1VOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2NsbnBfcHJlZml4KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5VTklNVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9sYWJlbGVkX3Zwbl9jbG5wX3ByZWZpeCh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLHRsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIG5vIEFGSSAldSAvIFNBRkkgJXUgZGVjb2RlciIsYWYsc2FmaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAiLHRsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cHRyID0gcHB0ciArIGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB0cHRyICs9IGFkdmFuY2U7Ci0JCX0KLSAgICAgICAgZG9uZToKLQkJYnJlYWs7Ci0KLQljYXNlIEJHUFRZUEVfTVBfVU5SRUFDSF9OTFJJOgotCQlUQ0hFQ0syKHRwdHJbMF0sIEJHUF9NUF9OTFJJX01JTlNJWkUpOwotCQlhZiA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIpOwotCQlzYWZpID0gdHB0clsyXTsKLQotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBBRkk6ICVzICgldSksICVzU0FGSTogJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYWZfdmFsdWVzLCAiVW5rbm93biBBRkkiLCBhZiwKLQkJCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgICAgICAgICBhZiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHNhZmk+MTI4KSA/ICJ2ZW5kb3Igc3BlY2lmaWMgIiA6ICIiLCAvKiAxMjggaXMgbWVhbndoaWxlIHdlbGxrbm93biAqLwotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9zYWZpX3ZhbHVlcywgIlVua25vd24gU0FGSSIsIHNhZmksCi0JCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2FmaSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGVuID09IEJHUF9NUF9OTFJJX01JTlNJWkUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIEVuZC1vZi1SaWIgTWFya2VyIChlbXB0eSBOTFJJKSIpOwotCi0JCXRwdHIgKz0gMzsKLSAgICAgICAgICAgICAgICAKLQkJd2hpbGUgKGxlbiAtICh0cHRyIC0gcHB0cikgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWY8PDggfCBzYWZpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDw8OCB8IFNBRk5VTV9VTklNVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9wcmVmaXg0KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fTEFCVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfcHJlZml4NCh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTlVOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUPDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ8PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fcHJlZml4NCh0cHRyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlID09IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAoaWxsZWdhbCBwcmVmaXggbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1VOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9JTkVUNjw8OCB8IFNBRk5VTV9VTklNVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9wcmVmaXg2KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX0xBQlVOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IGRlY29kZV9sYWJlbGVkX3ByZWZpeDYodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fSU5FVDY8PDggfCBTQUZOVU1fVlBOVU5JQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTk1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX0lORVQ2PDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfdnBuX3ByZWZpeDYodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9WUExTPDw4IHwgU0FGTlVNX1ZQTFMpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9MMlZQTjw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTDJWUE48PDggfCBTQUZOVU1fVlBOVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfbGFiZWxlZF92cG5fbDIodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgbGVuZ3RoKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWR2YW5jZSA9PSAtMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzIiwgYnVmKTsgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1VOSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX01VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgKEFGTlVNX05TQVA8PDggfCBTQUZOVU1fVU5JTVVMVElDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBkZWNvZGVfY2xucF9wcmVmaXgodHB0ciwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgKGlsbGVnYWwgcHJlZml4IGxlbmd0aCkiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkdmFuY2UgPT0gLTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5VTklDQVNUKToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAoQUZOVU1fTlNBUDw8OCB8IFNBRk5VTV9WUE5NVUxUSUNBU1QpOgotICAgICAgICAgICAgICAgICAgICBjYXNlIChBRk5VTV9OU0FQPDw4IHwgU0FGTlVNX1ZQTlVOSU1VTFRJQ0FTVCk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZGVjb2RlX2xhYmVsZWRfdnBuX2NsbnBfcHJlZml4KHRwdHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2UgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZHZhbmNlID09IC0yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKih0cHRyLTMpLHRsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJubyBBRkkgJXUgLyBTQUZJICV1IGRlY29kZXIiLGFmLHNhZmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHItMywiXG5cdCAgICAiLHRsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgdHB0ciA9IHBwdHIgKyBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgdHB0ciArPSBhZHZhbmNlOwotCQl9Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEJHUFRZUEVfRVhURF9DT01NVU5JVElFUzoKLQkJaWYgKGxlbiAlIDgpIHsKLQkJCXByaW50ZigiaW52YWxpZCBsZW4iKTsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHRsZW4+MCkgewotICAgICAgICAgICAgICAgICAgICB1X2ludDE2X3QgZXh0ZF9jb21tOwotCi0gICAgICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgMik7Ci0gICAgICAgICAgICAgICAgICAgIGV4dGRfY29tbT1FWFRSQUNUXzE2QklUUyh0cHRyKTsKLQotCQkgICAgcHJpbnRmKCJcblx0ICAgICVzICgweCUwNHgpLCBGbGFncyBbJXNdIiwKLQkJCSAgIHRvazJzdHJidWYoYmdwX2V4dGRfY29tbV9zdWJ0eXBlX3ZhbHVlcywKLQkJCQkgICAgICAidW5rbm93biBleHRkIGNvbW11bml0eSB0eXBlY29kZSIsCi0JCQkJICAgICAgZXh0ZF9jb21tLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLQkJCSAgIGV4dGRfY29tbSwKLQkJCSAgIGJpdHRvazJzdHIoYmdwX2V4dGRfY29tbV9mbGFnX3ZhbHVlcywgIm5vbmUiLCBleHRkX2NvbW0pKTsKLQotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCoodHB0cisyKSwgNik7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChleHRkX2NvbW0pIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9SVF8wOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1JPXzA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogJXU6JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIrMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0bmFtZSh0cHRyKzQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX1JUXzE6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fUk9fMToKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiOiAlczoldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0bmFtZSh0cHRyKzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIrNikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fUlRfMjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9ST18yOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI6ICV1OiV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0cHRyKzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIrNikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fTElOS0JBTkQ6Ci0JCSAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogYmFuZHdpZHRoOiAlLjNmIE1icHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX0NJU0NPX01DQVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI6IEFTICV1LCBncm91cCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModHB0cisyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRuYW1lKHRwdHIrNCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fVlBOX09SSUdJTjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOMjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lOMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9WUE5fT1JJR0lONDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9PU1BGX1JJRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9PU1BGX1JJRDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwgZ2V0bmFtZSh0cHRyKzIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEJHUF9FWFRfQ09NX09TUEZfUlRZUEU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQkdQX0VYVF9DT01fT1NQRl9SVFlQRTI6IAotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCI6IGFyZWE6JXMsIHJvdXRlci10eXBlOiVzLCBtZXRyaWMtdHlwZTolcyVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRuYW1lKHRwdHIrMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3BfZXh0ZF9jb21tX29zcGZfcnR5cGVfdmFsdWVzLAotCQkJCQkgICJ1bmtub3duICgweCUwMngpIiwKLQkJCQkJICAqKHRwdHIrNiksCi0JCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCoodHB0cis3KSAmICBCR1BfT1NQRl9SVFlQRV9NRVRSSUNfVFlQRSkgPyAiRTIiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqKHRwdHIrNikgPT0gQkdQX09TUEZfUlRZUEVfRVhUKSB8fCAoKih0cHRyKzYpID09IEJHUF9PU1BGX1JUWVBFX05TU0EpKSA/ICJFMSIgOiAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfRVhUX0NPTV9MMklORk86Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogJXMgQ29udHJvbCBGbGFncyBbMHglMDJ4XTpNVFUgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYobDJ2cG5fZW5jYXBzX3ZhbHVlcywKLQkJCQkJICAidW5rbm93biBlbmNhcHMiLAotCQkJCQkgICoodHB0cisyKSwKLQkJCQkJICB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodHB0ciszKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0cHRyKzQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciw4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAgICAgIiw4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRsZW4gLT04OwotICAgICAgICAgICAgICAgICAgICB0cHRyICs9ODsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCR1BUWVBFX0FUVFJfU0VUOgotICAgICAgICAgICAgICAgIFRDSEVDSzIodHB0clswXSwgNCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIE9yaWdpbiBBUzogJXUiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgdHB0cis9NDsKLSAgICAgICAgICAgICAgICBsZW4gLT00OwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+PSAyICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgYWxlbjsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJncF9hdHRyIGJncGE7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbMF0sIHNpemVvZihiZ3BhKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmYmdwYSwgdHB0ciwgc2l6ZW9mKGJncGEpKTsKLSAgICAgICAgICAgICAgICAgICAgYWxlbiA9IGJncF9hdHRyX2xlbigmYmdwYSk7Ci0gICAgICAgICAgICAgICAgICAgIHRwdHIgKz0gYmdwX2F0dHJfb2ZmKCZiZ3BhKTsKLSAgICAgICAgICAgICAgICAgICAgbGVuIC09IGJncF9hdHRyX29mZigmYmdwYSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyAoJXUpLCBsZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYmdwX2F0dHJfdmFsdWVzLAotCQkJCSAgICAgICJVbmtub3duIEF0dHJpYnV0ZSIsIGJncGEuYmdwYV90eXBlLAotCQkJCSAgICAgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwYS5iZ3BhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChiZ3BhLmJncGFfZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBGbGFncyBbJXMlcyVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncGEuYmdwYV9mbGFncyAmIDB4ODAgPyAiTyIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BhLmJncGFfZmxhZ3MgJiAweDQwID8gIlQiIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwYS5iZ3BhX2ZsYWdzICYgMHgyMCA/ICJQIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncGEuYmdwYV9mbGFncyAmIDB4MTAgPyAiRSIgOiAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmdwYS5iZ3BhX2ZsYWdzICYgMHhmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiKyV4IiwgYmdwYS5iZ3BhX2ZsYWdzICYgMHhmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXTogIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgY2hlY2sgZm9yIHJlY3Vyc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoIWJncF9hdHRyX3ByaW50KCZiZ3BhLCB0cHRyLCBhbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB0cHRyICs9IGFsZW47Ci0gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBhbGVuOwotCQl9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIAotCi0JZGVmYXVsdDoKLQkgICAgVENIRUNLMigqcHB0cixsZW4pOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIG5vIEF0dHJpYnV0ZSAldSBkZWNvZGVyIixhdHRyLT5iZ3BhX3R5cGUpOyAvKiB3ZSBoYXZlIG5vIGRlY29kZXIgZm9yIHRoZSBhdHRyaWJ1dGUgKi8KLSAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAgICIsbGVuKTsKLSAgICAgICAgICAgIGJyZWFrOwotCX0KLSAgICAgICAgaWYgKHZmbGFnID4gMSAmJiBsZW4pIHsgLyogb21pdCB6ZXJvIGxlbmd0aCBhdHRyaWJ1dGVzKi8KLSAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsbGVuKTsKLSAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAgICIsbGVuKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLQotdHJ1bmM6Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotYmdwX29wZW5fcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGJncF9vcGVuIGJncG87Ci0Jc3RydWN0IGJncF9vcHQgYmdwb3B0OwotCWNvbnN0IHVfY2hhciAqb3B0OwotCWludCBpLGNhcF90eXBlLGNhcF9sZW4sdGNhcF9sZW4sY2FwX29mZnNldDsKLQljaGFyIHRva2J1ZltUT0tCVUZTSVpFXTsKLQljaGFyIHRva2J1ZjJbVE9LQlVGU0laRV07Ci0KLQlUQ0hFQ0syKGRhdFswXSwgQkdQX09QRU5fU0laRSk7Ci0JbWVtY3B5KCZiZ3BvLCBkYXQsIEJHUF9PUEVOX1NJWkUpOwotCi0JcHJpbnRmKCJcblx0ICBWZXJzaW9uICVkLCAiLCBiZ3BvLmJncG9fdmVyc2lvbik7Ci0JcHJpbnRmKCJteSBBUyAldSwgIiwgbnRvaHMoYmdwby5iZ3BvX215YXMpKTsKLQlwcmludGYoIkhvbGR0aW1lICV1cywgIiwgbnRvaHMoYmdwby5iZ3BvX2hvbGR0aW1lKSk7Ci0JcHJpbnRmKCJJRCAlcyIsIGdldG5hbWUoKHVfY2hhciAqKSZiZ3BvLmJncG9faWQpKTsKLQlwcmludGYoIlxuXHQgIE9wdGlvbmFsIHBhcmFtZXRlcnMsIGxlbmd0aDogJXUiLCBiZ3BvLmJncG9fb3B0bGVuKTsKLQotICAgICAgICAvKiBzb21lIGxpdHRsZSBzYW5pdHkgY2hlY2tpbmcgKi8KLSAgICAgICAgaWYgKGxlbmd0aCA8IGJncG8uYmdwb19vcHRsZW4rQkdQX09QRU5fU0laRSkgCi0gICAgICAgICAgICByZXR1cm47Ci0KLQkvKiB1Z2x5ISAqLwotCW9wdCA9ICYoKGNvbnN0IHN0cnVjdCBiZ3Bfb3BlbiAqKWRhdCktPmJncG9fb3B0bGVuOwotCW9wdCsrOwotCi0JaSA9IDA7Ci0Jd2hpbGUgKGkgPCBiZ3BvLmJncG9fb3B0bGVuKSB7Ci0JCVRDSEVDSzIob3B0W2ldLCBCR1BfT1BUX1NJWkUpOwotCQltZW1jcHkoJmJncG9wdCwgJm9wdFtpXSwgQkdQX09QVF9TSVpFKTsKLQkJaWYgKGkgKyAyICsgYmdwb3B0LmJncG9wdF9sZW4gPiBiZ3BvLmJncG9fb3B0bGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgIE9wdGlvbiAlZCwgbGVuZ3RoOiAldSIsIGJncG9wdC5iZ3BvcHRfdHlwZSwgYmdwb3B0LmJncG9wdF9sZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwcmludGYoIlxuXHQgICAgT3B0aW9uICVzICgldSksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyYnVmKGJncF9vcHRfdmFsdWVzLCJVbmtub3duIiwKLQkJCQkgIGJncG9wdC5iZ3BvcHRfdHlwZSwKLQkJCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgICAgICAgICBiZ3BvcHQuYmdwb3B0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJncG9wdC5iZ3BvcHRfbGVuKTsKLQotICAgICAgICAgICAgICAgIC8qIG5vdyBsZXRzIGRlY29kZSB0aGUgb3B0aW9ucyB3ZSBrbm93Ki8KLSAgICAgICAgICAgICAgICBzd2l0Y2goYmdwb3B0LmJncG9wdF90eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBCR1BfT1BUX0NBUDoKLSAgICAgICAgICAgICAgICAgICAgY2FwX3R5cGU9b3B0W2krQkdQX09QVF9TSVpFXTsKLSAgICAgICAgICAgICAgICAgICAgY2FwX2xlbj1vcHRbaStCR1BfT1BUX1NJWkUrMV07Ci0gICAgICAgICAgICAgICAgICAgIHRjYXBfbGVuPWNhcF9sZW47Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzICgldSksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3BfY2FwY29kZV92YWx1ZXMsICJVbmtub3duIiwKLQkJCQkgICAgICBjYXBfdHlwZSwgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcF9sZW4pOwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2goY2FwX3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfQ0FQQ09ERV9NUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0QUZJICVzICgldSksIFNBRkkgJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihhZl92YWx1ZXMsICJVbmtub3duIiwKLQkJCQkJICBFWFRSQUNUXzE2QklUUyhvcHQraStCR1BfT1BUX1NJWkUrMiksCi0JCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob3B0K2krQkdQX09QVF9TSVpFKzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYmdwX3NhZmlfdmFsdWVzLCAiVW5rbm93biIsCi0JCQkJCSAgb3B0W2krQkdQX09QVF9TSVpFKzVdLAotCQkJCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdFtpK0JHUF9PUFRfU0laRSs1XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfQ0FQQ09ERV9SRVNUQVJUOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRSZXN0YXJ0IEZsYWdzOiBbJXNdLCBSZXN0YXJ0IFRpbWUgJXVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdFtpK0JHUF9PUFRfU0laRSsyXSkmMHg4MCkgPyAiUiIgOiAibm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob3B0K2krQkdQX09QVF9TSVpFKzIpJjB4ZmZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjYXBfbGVuLT0yOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FwX29mZnNldD00OwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUodGNhcF9sZW4+PTQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdCAgQUZJICVzICgldSksIFNBRkkgJXMgKCV1KSwgRm9yd2FyZGluZyBzdGF0ZSBwcmVzZXJ2ZWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihhZl92YWx1ZXMsIlVua25vd24iLAotCQkJCQkgICAgICBFWFRSQUNUXzE2QklUUyhvcHQraStCR1BfT1BUX1NJWkUrY2FwX29mZnNldCksCi0JCQkJCSAgICAgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvcHQraStCR1BfT1BUX1NJWkUrY2FwX29mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHJidWYoYmdwX3NhZmlfdmFsdWVzLCJVbmtub3duIiwKLQkJCQkJICAgICAgb3B0W2krQkdQX09QVF9TSVpFK2NhcF9vZmZzZXQrMl0sCi0JCQkJCSAgICAgIHRva2J1ZjIsIHNpemVvZih0b2tidWYyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdFtpK0JHUF9PUFRfU0laRStjYXBfb2Zmc2V0KzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG9wdFtpK0JHUF9PUFRfU0laRStjYXBfb2Zmc2V0KzNdKSYweDgwKSA/ICJ5ZXMiIDogIm5vIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjYXBfbGVuLT00OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcF9vZmZzZXQrPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfQ0FQQ09ERV9SUjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBCR1BfQ0FQQ09ERV9SUl9DSVNDTzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMihvcHRbaStCR1BfT1BUX1NJWkUrMl0sY2FwX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdG5vIGRlY29kZXIgZm9yIENhcGFiaWxpdHkgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcF90eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmb3B0W2krQkdQX09QVF9TSVpFKzJdLCJcblx0XHQiLGNhcF9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMihvcHRbaStCR1BfT1BUX1NJWkUrMl0sY2FwX2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJm9wdFtpK0JHUF9PUFRfU0laRSsyXSwiXG5cdFx0IixjYXBfbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEJHUF9PUFRfQVVUSDoKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBubyBkZWNvZGVyIGZvciBvcHRpb24gJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwb3B0LmJncG9wdF90eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0JCWkgKz0gQkdQX09QVF9TSVpFICsgYmdwb3B0LmJncG9wdF9sZW47Ci0JfQotCXJldHVybjsKLXRydW5jOgotCXByaW50ZigiW3xCR1BdIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZ3BfdXBkYXRlX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBiZ3AgYmdwOwotCXN0cnVjdCBiZ3BfYXR0ciBiZ3BhOwotCWNvbnN0IHVfY2hhciAqcDsKLQlpbnQgbGVuOwotCWludCBpOwotCWNoYXIgdG9rYnVmW1RPS0JVRlNJWkVdOwotCi0JVENIRUNLMihkYXRbMF0sIEJHUF9TSVpFKTsKLQltZW1jcHkoJmJncCwgZGF0LCBCR1BfU0laRSk7Ci0JcCA9IGRhdCArIEJHUF9TSVpFOwkvKlhYWCovCi0KLQkvKiBVbmZlYXNpYmxlIHJvdXRlcyAqLwotCWxlbiA9IEVYVFJBQ1RfMTZCSVRTKHApOwotCWlmIChsZW4pIHsKLQkJLyoKLQkJICogV2l0aG91dCBrZWVwaW5nIHN0YXRlIGZyb20gdGhlIG9yaWdpbmFsIE5MUkkgbWVzc2FnZSwKLQkJICogaXQncyBub3QgcG9zc2libGUgdG8gdGVsbCBpZiB0aGlzIGEgdjQgb3IgdjYgcm91dGUsCi0JCSAqIHNvIG9ubHkgdHJ5IHRvIGRlY29kZSBpdCBpZiB3ZSdyZSBub3QgdjYgZW5hYmxlZC4KLQkgICAgICAgICAqLwotI2lmZGVmIElORVQ2Ci0JCXByaW50ZigiXG5cdCAgV2l0aGRyYXduIHJvdXRlczogJWQgYnl0ZXMiLCBsZW4pOwotI2Vsc2UKLQkJY2hhciBidWZbTUFYSE9TVE5BTUVMRU4gKyAxMDBdOwotCQlpbnQgd3BmeDsKLQotCQlUQ0hFQ0syKHBbMl0sIGxlbik7Ci0JCWkgPSAyOwotCi0JCXByaW50ZigiXG5cdCAgV2l0aGRyYXduIHJvdXRlczoiKTsKLQotCQl3aGlsZShpIDwgMiArIGxlbikgewotCQkJd3BmeCA9IGRlY29kZV9wcmVmaXg0KCZwW2ldLCBidWYsIHNpemVvZihidWYpKTsKLQkJCWlmICh3cGZ4ID09IC0xKSB7Ci0JCQkJcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHdwZnggPT0gLTIpCi0JCQkJZ290byB0cnVuYzsKLQkJCWVsc2UgewotCQkJCWkgKz0gd3BmeDsKLQkJCQlwcmludGYoIlxuXHQgICAgJXMiLCBidWYpOwotCQkJfQotCQl9Ci0jZW5kaWYKLQl9Ci0JcCArPSAyICsgbGVuOwotCi0JVENIRUNLMihwWzBdLCAyKTsKLQlsZW4gPSBFWFRSQUNUXzE2QklUUyhwKTsKLQotICAgICAgICBpZiAobGVuID09IDAgJiYgbGVuZ3RoID09IEJHUF9VUERBVEVfTUlOU0laRSkgewotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBFbmQtb2YtUmliIE1hcmtlciAoZW1wdHkgTkxSSSkiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0JaWYgKGxlbikgewotCQkvKiBkbyBzb21ldGhpbmcgbW9yZSB1c2VmdWwhKi8KLQkJaSA9IDI7Ci0JCXdoaWxlIChpIDwgMiArIGxlbikgewotCQkJaW50IGFsZW4sIGFvZmY7Ci0KLQkJCVRDSEVDSzIocFtpXSwgc2l6ZW9mKGJncGEpKTsKLQkJCW1lbWNweSgmYmdwYSwgJnBbaV0sIHNpemVvZihiZ3BhKSk7Ci0JCQlhbGVuID0gYmdwX2F0dHJfbGVuKCZiZ3BhKTsKLQkJCWFvZmYgPSBiZ3BfYXR0cl9vZmYoJmJncGEpOwotCi0JCSAgICAgICBwcmludGYoIlxuXHQgICVzICgldSksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3BfYXR0cl92YWx1ZXMsICJVbmtub3duIEF0dHJpYnV0ZSIsCi0JCQkJCSBiZ3BhLmJncGFfdHlwZSwKLQkJCQkJIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwYS5iZ3BhX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVuKTsKLQotCQkJaWYgKGJncGEuYmdwYV9mbGFncykgewotCQkJCXByaW50ZigiLCBGbGFncyBbJXMlcyVzJXMiLAotCQkJCQliZ3BhLmJncGFfZmxhZ3MgJiAweDgwID8gIk8iIDogIiIsCi0JCQkJCWJncGEuYmdwYV9mbGFncyAmIDB4NDAgPyAiVCIgOiAiIiwKLQkJCQkJYmdwYS5iZ3BhX2ZsYWdzICYgMHgyMCA/ICJQIiA6ICIiLAotCQkJCQliZ3BhLmJncGFfZmxhZ3MgJiAweDEwID8gIkUiIDogIiIpOwotCQkJCWlmIChiZ3BhLmJncGFfZmxhZ3MgJiAweGYpCi0JCQkJCXByaW50ZigiKyV4IiwgYmdwYS5iZ3BhX2ZsYWdzICYgMHhmKTsKLQkJCQlwcmludGYoIl06ICIpOwotCQkJfQotCQkJaWYgKCFiZ3BfYXR0cl9wcmludCgmYmdwYSwgJnBbaSArIGFvZmZdLCBhbGVuKSkKLQkJCQlnb3RvIHRydW5jOwotCQkJaSArPSBhb2ZmICsgYWxlbjsKLQkJfQotCX0gCi0JcCArPSAyICsgbGVuOwotCi0JaWYgKGRhdCArIGxlbmd0aCA+IHApIHsKLQkJcHJpbnRmKCJcblx0ICBVcGRhdGVkIHJvdXRlczoiKTsKLQkJd2hpbGUgKGRhdCArIGxlbmd0aCA+IHApIHsKLQkJCWNoYXIgYnVmW01BWEhPU1ROQU1FTEVOICsgMTAwXTsKLQkJCWkgPSBkZWNvZGVfcHJlZml4NChwLCBidWYsIHNpemVvZihidWYpKTsKLQkJCWlmIChpID09IC0xKSB7Ci0JCQkJcHJpbnRmKCJcblx0ICAgIChpbGxlZ2FsIHByZWZpeCBsZW5ndGgpIik7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKGkgPT0gLTIpCi0JCQkJZ290byB0cnVuYzsKLQkJCWVsc2UgewotCQkJCXByaW50ZigiXG5cdCAgICAlcyIsIGJ1Zik7Ci0JCQkJcCArPSBpOwotCQkJfQotCQl9Ci0JfQotCXJldHVybjsKLXRydW5jOgotCXByaW50ZigiW3xCR1BdIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZ3Bfbm90aWZpY2F0aW9uX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCBiZ3Bfbm90aWZpY2F0aW9uIGJncG47Ci0JY29uc3QgdV9jaGFyICp0cHRyOwotCWNoYXIgdG9rYnVmW1RPS0JVRlNJWkVdOwotCWNoYXIgdG9rYnVmMltUT0tCVUZTSVpFXTsKLQotCVRDSEVDSzIoZGF0WzBdLCBCR1BfTk9USUZJQ0FUSU9OX1NJWkUpOwotCW1lbWNweSgmYmdwbiwgZGF0LCBCR1BfTk9USUZJQ0FUSU9OX1NJWkUpOwotCi0gICAgICAgIC8qIHNvbWUgbGl0dGxlIHNhbml0eSBjaGVja2luZyAqLwotICAgICAgICBpZiAobGVuZ3RoPEJHUF9OT1RJRklDQVRJT05fU0laRSkKLSAgICAgICAgICAgIHJldHVybjsKLQotCXByaW50ZigiLCAlcyAoJXUpIiwKLQkgICAgICAgdG9rMnN0cmJ1ZihiZ3Bfbm90aWZ5X21ham9yX3ZhbHVlcywgIlVua25vd24gRXJyb3IiLAotCQkJICBiZ3BuLmJncG5fbWFqb3IsIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotCSAgICAgICBiZ3BuLmJncG5fbWFqb3IpOwotCi0gICAgICAgIHN3aXRjaCAoYmdwbi5iZ3BuX21ham9yKSB7Ci0KLSAgICAgICAgY2FzZSBCR1BfTk9USUZZX01BSk9SX01TRzoKLSAgICAgICAgICAgIHByaW50ZigiLCBzdWJjb2RlICVzICgldSkiLAotCQkgICB0b2syc3RyYnVmKGJncF9ub3RpZnlfbWlub3JfbXNnX3ZhbHVlcywgIlVua25vd24iLAotCQkJICAgICAgYmdwbi5iZ3BuX21pbm9yLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLQkJICAgYmdwbi5iZ3BuX21pbm9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJHUF9OT1RJRllfTUFKT1JfT1BFTjoKLSAgICAgICAgICAgIHByaW50ZigiLCBzdWJjb2RlICVzICgldSkiLAotCQkgICB0b2syc3RyYnVmKGJncF9ub3RpZnlfbWlub3Jfb3Blbl92YWx1ZXMsICJVbmtub3duIiwKLQkJCSAgICAgIGJncG4uYmdwbl9taW5vciwgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCi0JCSAgIGJncG4uYmdwbl9taW5vcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCR1BfTk9USUZZX01BSk9SX1VQREFURToKLSAgICAgICAgICAgIHByaW50ZigiLCBzdWJjb2RlICVzICgldSkiLAotCQkgICB0b2syc3RyYnVmKGJncF9ub3RpZnlfbWlub3JfdXBkYXRlX3ZhbHVlcywgIlVua25vd24iLAotCQkJICAgICAgYmdwbi5iZ3BuX21pbm9yLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLQkJICAgYmdwbi5iZ3BuX21pbm9yKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJHUF9OT1RJRllfTUFKT1JfQ0FQOgotICAgICAgICAgICAgcHJpbnRmKCIgc3ViY29kZSAlcyAoJXUpIiwKLQkJICAgdG9rMnN0cmJ1ZihiZ3Bfbm90aWZ5X21pbm9yX2NhcF92YWx1ZXMsICJVbmtub3duIiwKLQkJCSAgICAgIGJncG4uYmdwbl9taW5vciwgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksCi0JCSAgIGJncG4uYmdwbl9taW5vcik7Ci0gICAgICAgIGNhc2UgQkdQX05PVElGWV9NQUpPUl9DRUFTRToKLSAgICAgICAgICAgIHByaW50ZigiLCBzdWJjb2RlICVzICgldSkiLAotCQkgICB0b2syc3RyYnVmKGJncF9ub3RpZnlfbWlub3JfY2Vhc2VfdmFsdWVzLCAiVW5rbm93biIsCi0JCQkgICAgICBiZ3BuLmJncG5fbWlub3IsIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotCQkgICBiZ3BuLmJncG5fbWlub3IpOwotCi0JICAgIC8qIGRyYWZ0LWlldGYtaWRyLWNlYXNlLXN1YmNvZGUtMDIgbWVudGlvbnMgb3B0aW9uYWxseSA3IGJ5dGVzCi0gICAgICAgICAgICAgKiBmb3IgdGhlIG1heHByZWZpeCBzdWJ0eXBlLCB3aGljaCBtYXkgY29udGFpbiBBRkksIFNBRkkgYW5kIE1BWFBSRUZJWEVTCi0gICAgICAgICAgICAgKi8KLQkgICAgaWYoYmdwbi5iZ3BuX21pbm9yID09IEJHUF9OT1RJRllfTUlOT1JfQ0VBU0VfTUFYUFJGWCAmJiBsZW5ndGggPj0gQkdQX05PVElGSUNBVElPTl9TSVpFICsgNykgewotCQl0cHRyID0gZGF0ICsgQkdQX05PVElGSUNBVElPTl9TSVpFOwotCQlUQ0hFQ0syKCp0cHRyLCA3KTsKLQkJcHJpbnRmKCIsIEFGSSAlcyAoJXUpLCBTQUZJICVzICgldSksIE1heCBQcmVmaXhlczogJXUiLAotCQkgICAgICAgdG9rMnN0cmJ1ZihhZl92YWx1ZXMsICJVbmtub3duIiwKLQkJCQkgIEVYVFJBQ1RfMTZCSVRTKHRwdHIpLCB0b2tidWYsIHNpemVvZih0b2tidWYpKSwKLQkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIpLAotCQkgICAgICAgdG9rMnN0cmJ1ZihiZ3Bfc2FmaV92YWx1ZXMsICJVbmtub3duIiwgKih0cHRyKzIpLAotCQkJCSAgdG9rYnVmMiwgc2l6ZW9mKHRva2J1ZikpLAotCQkgICAgICAgKih0cHRyKzIpLAotCQkgICAgICAgRVhUUkFDVF8zMkJJVFModHB0ciszKSk7Ci0JICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCXJldHVybjsKLXRydW5jOgotCXByaW50ZigiW3xCR1BdIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZ3Bfcm91dGVfcmVmcmVzaF9wcmludChjb25zdCB1X2NoYXIgKnBwdHIsIGludCBsZW4pIHsKLQotICAgICAgICBjb25zdCBzdHJ1Y3QgYmdwX3JvdXRlX3JlZnJlc2ggKmJncF9yb3V0ZV9yZWZyZXNoX2hlYWRlcjsKLQljaGFyIHRva2J1ZltUT0tCVUZTSVpFXTsKLQljaGFyIHRva2J1ZjJbVE9LQlVGU0laRV07Ci0KLQlUQ0hFQ0syKHBwdHJbMF0sIEJHUF9ST1VURV9SRUZSRVNIX1NJWkUpOwotCi0gICAgICAgIC8qIHNvbWUgbGl0dGxlIHNhbml0eSBjaGVja2luZyAqLwotICAgICAgICBpZiAobGVuPEJHUF9ST1VURV9SRUZSRVNIX1NJWkUpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgYmdwX3JvdXRlX3JlZnJlc2hfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBiZ3Bfcm91dGVfcmVmcmVzaCAqKXBwdHI7Ci0KLSAgICAgICAgcHJpbnRmKCJcblx0ICBBRkkgJXMgKCV1KSwgU0FGSSAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgIHRvazJzdHJidWYoYWZfdmFsdWVzLCJVbmtub3duIiwKLQkJCSAgLyogdGhpcyBzdGlua3MgYnV0IHRoZSBjb21waWxlciBwYWRzIHRoZSBzdHJ1Y3R1cmUKLQkJCSAgICogd2VpcmQgKi8KLQkJCSAgRVhUUkFDVF8xNkJJVFMoJmJncF9yb3V0ZV9yZWZyZXNoX2hlYWRlci0+YWZpKSwKLQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSksIAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmJncF9yb3V0ZV9yZWZyZXNoX2hlYWRlci0+YWZpKSwKLSAgICAgICAgICAgICAgIHRvazJzdHJidWYoYmdwX3NhZmlfdmFsdWVzLCJVbmtub3duIiwKLQkJCSAgYmdwX3JvdXRlX3JlZnJlc2hfaGVhZGVyLT5zYWZpLAotCQkJICB0b2tidWYyLCBzaXplb2YodG9rYnVmMikpLAotICAgICAgICAgICAgICAgYmdwX3JvdXRlX3JlZnJlc2hfaGVhZGVyLT5zYWZpKTsKLQotICAgICAgICBpZiAodmZsYWcgPiAxKSB7Ci0gICAgICAgICAgICBUQ0hFQ0syKCpwcHRyLCBsZW4pOwotICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICIsIGxlbik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybjsKLXRydW5jOgotCXByaW50ZigiW3xCR1BdIik7Ci19Ci0KLXN0YXRpYyBpbnQKLWJncF9oZWFkZXJfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIGludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGJncCBiZ3A7Ci0JY2hhciB0b2tidWZbVE9LQlVGU0laRV07Ci0KLQlUQ0hFQ0syKGRhdFswXSwgQkdQX1NJWkUpOwotCW1lbWNweSgmYmdwLCBkYXQsIEJHUF9TSVpFKTsKLQlwcmludGYoIlxuXHQlcyBNZXNzYWdlICgldSksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgdG9rMnN0cmJ1ZihiZ3BfbXNnX3ZhbHVlcywgIlVua25vd24iLCBiZ3AuYmdwX3R5cGUsCi0JCQkgIHRva2J1Ziwgc2l6ZW9mKHRva2J1ZikpLAotICAgICAgICAgICAgICAgYmdwLmJncF90eXBlLAotICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQotCXN3aXRjaCAoYmdwLmJncF90eXBlKSB7Ci0JY2FzZSBCR1BfT1BFTjoKLQkJYmdwX29wZW5fcHJpbnQoZGF0LCBsZW5ndGgpOwotCQlicmVhazsKLQljYXNlIEJHUF9VUERBVEU6Ci0JCWJncF91cGRhdGVfcHJpbnQoZGF0LCBsZW5ndGgpOwotCQlicmVhazsKLQljYXNlIEJHUF9OT1RJRklDQVRJT046Ci0JCWJncF9ub3RpZmljYXRpb25fcHJpbnQoZGF0LCBsZW5ndGgpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSBCR1BfS0VFUEFMSVZFOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJHUF9ST1VURV9SRUZSRVNIOgotICAgICAgICAgICAgICAgIGJncF9yb3V0ZV9yZWZyZXNoX3ByaW50KGRhdCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIG5vIGRlY29kZXIgZm9yIHRoZSBCR1AgbWVzc2FnZSAqLwotICAgICAgICAgICAgICAgIFRDSEVDSzIoKmRhdCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIG5vIE1lc3NhZ2UgJXUgZGVjb2RlciIsYmdwLmJncF90eXBlKTsKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoZGF0LCJcblx0ICAiLGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JfQotCXJldHVybiAxOwotdHJ1bmM6Ci0JcHJpbnRmKCJbfEJHUF0iKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotYmdwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCBpbnQgbGVuZ3RoKQotewotCWNvbnN0IHVfY2hhciAqcDsKLQljb25zdCB1X2NoYXIgKmVwOwotCWNvbnN0IHVfY2hhciAqc3RhcnQ7Ci0JY29uc3QgdV9jaGFyIG1hcmtlcltdID0gewotCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotCQkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAotCX07Ci0Jc3RydWN0IGJncCBiZ3A7Ci0JdV9pbnQxNl90IGhsZW47Ci0JY2hhciB0b2tidWZbVE9LQlVGU0laRV07Ci0KLQllcCA9IGRhdCArIGxlbmd0aDsKLQlpZiAoc25hcGVuZCA8IGRhdCArIGxlbmd0aCkKLQkJZXAgPSBzbmFwZW5kOwotCi0JcHJpbnRmKCI6IEJHUCwgbGVuZ3RoOiAldSIsbGVuZ3RoKTsKLQotICAgICAgICBpZiAodmZsYWcgPCAxKSAvKiBsZXRzIGJlIGxlc3MgY2hhdHR5ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JcCA9IGRhdDsKLQlzdGFydCA9IHA7Ci0Jd2hpbGUgKHAgPCBlcCkgewotCQlpZiAoIVRURVNUMihwWzBdLCAxKSkKLQkJCWJyZWFrOwotCQlpZiAocFswXSAhPSAweGZmKSB7Ci0JCQlwKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghVFRFU1QyKHBbMF0sIHNpemVvZihtYXJrZXIpKSkKLQkJCWJyZWFrOwotCQlpZiAobWVtY21wKHAsIG1hcmtlciwgc2l6ZW9mKG1hcmtlcikpICE9IDApIHsKLQkJCXArKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZm91bmQgQkdQIGhlYWRlciAqLwotCQlUQ0hFQ0syKHBbMF0sIEJHUF9TSVpFKTsJLypYWFgqLwotCQltZW1jcHkoJmJncCwgcCwgQkdQX1NJWkUpOwotCi0JCWlmIChzdGFydCAhPSBwKQotCQkJcHJpbnRmKCIgW3xCR1BdIik7Ci0KLQkJaGxlbiA9IG50b2hzKGJncC5iZ3BfbGVuKTsKLQkJaWYgKGhsZW4gPCBCR1BfU0laRSkgewotCQkJcHJpbnRmKCJcblt8QkdQIEJvZ3VzIGhlYWRlciBsZW5ndGggJXUgPCAldV0iLCBobGVuLAotCQkJICAgIEJHUF9TSVpFKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKFRURVNUMihwWzBdLCBobGVuKSkgewotCQkJaWYgKCFiZ3BfaGVhZGVyX3ByaW50KHAsIGhsZW4pKQotCQkJCXJldHVybjsKLQkJCXAgKz0gaGxlbjsKLQkJCXN0YXJ0ID0gcDsKLQkJfSBlbHNlIHsKLQkJCXByaW50ZigiXG5bfEJHUCAlc10iLAotCQkJICAgICAgIHRvazJzdHJidWYoYmdwX21zZ192YWx1ZXMsCi0JCQkJCSAgIlVua25vd24gTWVzc2FnZSBUeXBlIiwKLQkJCQkJICBiZ3AuYmdwX3R5cGUsCi0JCQkJCSAgdG9rYnVmLCBzaXplb2YodG9rYnVmKSkpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8QkdQXSIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtYm9vdHAuYyBiL3ByaW50LWJvb3RwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDg2ZTQuLjAwMDAwMDAKLS0tIGEvcHJpbnQtYm9vdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRm9ybWF0IGFuZCBwcmludCBib290cCBwYWNrZXRzLgotICovCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1ib290cC5jLHYgMS43OC4yLjkgMjAwNy8wOC8yMSAyMjowMjowOCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJldGhlci5oIgotI2luY2x1ZGUgImJvb3RwLmgiCi0KLXN0YXRpYyB2b2lkIHJmYzEwNDhfcHJpbnQoY29uc3QgdV9jaGFyICopOwotc3RhdGljIHZvaWQgY211X3ByaW50KGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyBjaGFyICpjbGllbnRfZnFkbl9mbGFncyh1X2ludCBmbGFncyk7Ci0KLXN0YXRpYyBjaGFyIHRzdHJbXSA9ICIgW3xib290cF0iOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBib290cF9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHg4MDAwLCAgICAgICAgICAgICAgICAgICAiQnJvYWRjYXN0IiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJvb3RwX29wX3ZhbHVlc1tdID0gewotICAgIHsgQk9PVFBSRVFVRVNULCAgICAgICAgICAgICAiUmVxdWVzdCIgfSwKLSAgICB7IEJPT1RQUkVQTFksICAgICAgICAgICAgICAgIlJlcGx5IiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qCi0gKiBQcmludCBib290cCByZXF1ZXN0cwotICovCi12b2lkCi1ib290cF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLCB1X2ludCBsZW5ndGgpCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGJvb3RwICpicDsKLQlzdGF0aWMgY29uc3QgdV9jaGFyIHZtX2NtdVs0XSA9IFZNX0NNVTsKLQlzdGF0aWMgY29uc3QgdV9jaGFyIHZtX3JmYzEwNDhbNF0gPSBWTV9SRkMxMDQ4OwotCi0JYnAgPSAoY29uc3Qgc3RydWN0IGJvb3RwICopY3A7Ci0JVENIRUNLKGJwLT5icF9vcCk7Ci0KLSAgICAgICAgcHJpbnRmKCJCT09UUC9ESENQLCAlcyIsCi0JICAgICAgIHRvazJzdHIoYm9vdHBfb3BfdmFsdWVzLCAidW5rbm93biAoMHglMDJ4KSIsIGJwLT5icF9vcCkpOwotCi0JaWYgKGJwLT5icF9odHlwZSA9PSAxICYmIGJwLT5icF9obGVuID09IDYgJiYgYnAtPmJwX29wID09IEJPT1RQUkVRVUVTVCkgewotCQlUQ0hFQ0syKGJwLT5icF9jaGFkZHJbMF0sIDYpOwotCQlwcmludGYoIiBmcm9tICVzIiwgZXRoZXJhZGRyX3N0cmluZyhicC0+YnBfY2hhZGRyKSk7Ci0JfQotCi0gICAgICAgIHByaW50ZigiLCBsZW5ndGggJXUiLCBsZW5ndGgpOwotCi0gICAgICAgIGlmICghdmZsYWcpCi0gICAgICAgICAgICByZXR1cm47Ci0KLQlUQ0hFQ0soYnAtPmJwX3NlY3MpOwotCi0JLyogVGhlIHVzdWFsIGhhcmR3YXJlIGFkZHJlc3MgdHlwZSBpcyAxICgxME1iIEV0aGVybmV0KSAqLwotCWlmIChicC0+YnBfaHR5cGUgIT0gMSkKLQkJcHJpbnRmKCIsIGh0eXBlICVkIiwgYnAtPmJwX2h0eXBlKTsKLQotCS8qIFRoZSB1c3VhbCBsZW5ndGggZm9yIDEwTWIgRXRoZXJuZXQgYWRkcmVzcyBpcyA2IGJ5dGVzICovCi0JaWYgKGJwLT5icF9odHlwZSAhPSAxIHx8IGJwLT5icF9obGVuICE9IDYpCi0JCXByaW50ZigiLCBobGVuICVkIiwgYnAtPmJwX2hsZW4pOwotCi0JLyogT25seSBwcmludCBpbnRlcmVzdGluZyBmaWVsZHMgKi8KLQlpZiAoYnAtPmJwX2hvcHMpCi0JCXByaW50ZigiLCBob3BzICVkIiwgYnAtPmJwX2hvcHMpOwotCWlmIChicC0+YnBfeGlkKQotCQlwcmludGYoIiwgeGlkIDB4JXgiLCBFWFRSQUNUXzMyQklUUygmYnAtPmJwX3hpZCkpOwotCWlmIChicC0+YnBfc2VjcykKLQkJcHJpbnRmKCIsIHNlY3MgJWQiLCBFWFRSQUNUXzE2QklUUygmYnAtPmJwX3NlY3MpKTsKLQotCXByaW50ZigiLCBGbGFncyBbJXNdIiwKLQkJYml0dG9rMnN0cihib290cF9mbGFnX3ZhbHVlcywgIm5vbmUiLCBFWFRSQUNUXzE2QklUUygmYnAtPmJwX2ZsYWdzKSkpOwotCWlmICh2ZmxhZyA+IDEpCi0JCXByaW50ZigiICgweCUwNHgpIiwgRVhUUkFDVF8xNkJJVFMoJmJwLT5icF9mbGFncykpOwotCi0JLyogQ2xpZW50J3MgaXAgYWRkcmVzcyAqLwotCVRDSEVDSyhicC0+YnBfY2lhZGRyKTsKLQlpZiAoYnAtPmJwX2NpYWRkci5zX2FkZHIpCi0JCXByaW50ZigiXG5cdCAgQ2xpZW50LUlQICVzIiwgaXBhZGRyX3N0cmluZygmYnAtPmJwX2NpYWRkcikpOwotCi0JLyogJ3lvdXInIGlwIGFkZHJlc3MgKGJvb3RwIGNsaWVudCkgKi8KLQlUQ0hFQ0soYnAtPmJwX3lpYWRkcik7Ci0JaWYgKGJwLT5icF95aWFkZHIuc19hZGRyKQotCQlwcmludGYoIlxuXHQgIFlvdXItSVAgJXMiLCBpcGFkZHJfc3RyaW5nKCZicC0+YnBfeWlhZGRyKSk7Ci0KLQkvKiBTZXJ2ZXIncyBpcCBhZGRyZXNzICovCi0JVENIRUNLKGJwLT5icF9zaWFkZHIpOwotCWlmIChicC0+YnBfc2lhZGRyLnNfYWRkcikKLQkJcHJpbnRmKCJcblx0ICBTZXJ2ZXItSVAgJXMiLCBpcGFkZHJfc3RyaW5nKCZicC0+YnBfc2lhZGRyKSk7Ci0KLQkvKiBHYXRld2F5J3MgaXAgYWRkcmVzcyAqLwotCVRDSEVDSyhicC0+YnBfZ2lhZGRyKTsKLQlpZiAoYnAtPmJwX2dpYWRkci5zX2FkZHIpCi0JCXByaW50ZigiXG5cdCAgR2F0ZXdheS1JUCAlcyIsIGlwYWRkcl9zdHJpbmcoJmJwLT5icF9naWFkZHIpKTsKLQotCS8qIENsaWVudCdzIEV0aGVybmV0IGFkZHJlc3MgKi8KLQlpZiAoYnAtPmJwX2h0eXBlID09IDEgJiYgYnAtPmJwX2hsZW4gPT0gNikgewotCQlUQ0hFQ0syKGJwLT5icF9jaGFkZHJbMF0sIDYpOwotCQlwcmludGYoIlxuXHQgIENsaWVudC1FdGhlcm5ldC1BZGRyZXNzICVzIiwgZXRoZXJhZGRyX3N0cmluZyhicC0+YnBfY2hhZGRyKSk7Ci0JfQotCi0JVENIRUNLMihicC0+YnBfc25hbWVbMF0sIDEpOwkJLyogY2hlY2sgZmlyc3QgY2hhciBvbmx5ICovCi0JaWYgKCpicC0+YnBfc25hbWUpIHsKLQkJcHJpbnRmKCJcblx0ICBzbmFtZSBcIiIpOwotCQlpZiAoZm5fcHJpbnQoYnAtPmJwX3NuYW1lLCBzbmFwZW5kKSkgewotCQkJcHV0Y2hhcignIicpOwotCQkJZnB1dHModHN0ciArIDEsIHN0ZG91dCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJcHV0Y2hhcignIicpOwotCX0KLQlUQ0hFQ0syKGJwLT5icF9maWxlWzBdLCAxKTsJCS8qIGNoZWNrIGZpcnN0IGNoYXIgb25seSAqLwotCWlmICgqYnAtPmJwX2ZpbGUpIHsKLQkJcHJpbnRmKCJcblx0ICBmaWxlIFwiIik7Ci0JCWlmIChmbl9wcmludChicC0+YnBfZmlsZSwgc25hcGVuZCkpIHsKLQkJCXB1dGNoYXIoJyInKTsKLQkJCWZwdXRzKHRzdHIgKyAxLCBzdGRvdXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXB1dGNoYXIoJyInKTsKLQl9Ci0KLQkvKiBEZWNvZGUgdGhlIHZlbmRvciBidWZmZXIgKi8KLQlUQ0hFQ0soYnAtPmJwX3ZlbmRbMF0pOwotCWlmIChtZW1jbXAoKGNvbnN0IGNoYXIgKilicC0+YnBfdmVuZCwgdm1fcmZjMTA0OCwKLQkJIHNpemVvZih1X2ludDMyX3QpKSA9PSAwKQotCQlyZmMxMDQ4X3ByaW50KGJwLT5icF92ZW5kKTsKLQllbHNlIGlmIChtZW1jbXAoKGNvbnN0IGNoYXIgKilicC0+YnBfdmVuZCwgdm1fY211LAotCQkgICAgICBzaXplb2YodV9pbnQzMl90KSkgPT0gMCkKLQkJY211X3ByaW50KGJwLT5icF92ZW5kKTsKLQllbHNlIHsKLQkJdV9pbnQzMl90IHVsOwotCi0JCXVsID0gRVhUUkFDVF8zMkJJVFMoJmJwLT5icF92ZW5kKTsKLQkJaWYgKHVsICE9IDApCi0JCQlwcmludGYoIlxuXHQgIFZlbmRvci0jMHgleCIsIHVsKTsKLQl9Ci0KLQlyZXR1cm47Ci10cnVuYzoKLQlmcHV0cyh0c3RyLCBzdGRvdXQpOwotfQotCi0vKgotICogVGhlIGZpcnN0IGNoYXJhY3RlciBzcGVjaWZpZXMgdGhlIGZvcm1hdCB0byBwcmludDoKLSAqICAgICBpIC0gaXAgYWRkcmVzcyAoMzIgYml0cykKLSAqICAgICBwIC0gaXAgYWRkcmVzcyBwYWlycyAoMzIgYml0cyArIDMyIGJpdHMpCi0gKiAgICAgbCAtIGxvbmcgKDMyIGJpdHMpCi0gKiAgICAgTCAtIHVuc2lnbmVkIGxvbmcgKDMyIGJpdHMpCi0gKiAgICAgcyAtIHNob3J0ICgxNiBiaXRzKQotICogICAgIGIgLSBwZXJpb2Qtc2VwZXJhdGVkIGRlY2ltYWwgYnl0ZXMgKHZhcmlhYmxlIGxlbmd0aCkKLSAqICAgICB4IC0gY29sb24tc2VwZXJhdGVkIGhleCBieXRlcyAodmFyaWFibGUgbGVuZ3RoKQotICogICAgIGEgLSBhc2NpaSBzdHJpbmcgKHZhcmlhYmxlIGxlbmd0aCkKLSAqICAgICBCIC0gb24vb2ZmICg4IGJpdHMpCi0gKiAgICAgJCAtIHNwZWNpYWwgKGV4cGxpY2l0IGNvZGUgdG8gaGFuZGxlKQotICovCi1zdGF0aWMgc3RydWN0IHRvayB0YWcyc3RyW10gPSB7Ci0vKiBSRkMxMDQ4IHRhZ3MgKi8KLQl7IFRBR19QQUQsCQkiIFBBRCIgfSwKLQl7IFRBR19TVUJORVRfTUFTSywJImlTdWJuZXQtTWFzayIgfSwJLyogc3VibmV0IG1hc2sgKFJGQzk1MCkgKi8KLQl7IFRBR19USU1FX09GRlNFVCwJIkxUaW1lLVpvbmUiIH0sCS8qIHNlY29uZHMgZnJvbSBVVEMgKi8KLQl7IFRBR19HQVRFV0FZLAkJImlEZWZhdWx0LUdhdGV3YXkiIH0sCS8qIGRlZmF1bHQgZ2F0ZXdheSAqLwotCXsgVEFHX1RJTUVfU0VSVkVSLAkiaVRpbWUtU2VydmVyIiB9LAkvKiB0aW1lIHNlcnZlcnMgKFJGQzg2OCkgKi8KLQl7IFRBR19OQU1FX1NFUlZFUiwJImlJRU4tTmFtZS1TZXJ2ZXIiIH0sCS8qIElFTiBuYW1lIHNlcnZlcnMgKElFTjExNikgKi8KLQl7IFRBR19ET01BSU5fU0VSVkVSLAkiaURvbWFpbi1OYW1lLVNlcnZlciIgfSwJLyogZG9tYWluIG5hbWUgKFJGQzEwMzUpICovCi0JeyBUQUdfTE9HX1NFUlZFUiwJImlMT0ciIH0sCS8qIE1JVCBsb2cgc2VydmVycyAqLwotCXsgVEFHX0NPT0tJRV9TRVJWRVIsCSJpQ1MiIH0sCS8qIGNvb2tpZSBzZXJ2ZXJzIChSRkM4NjUpICovCi0JeyBUQUdfTFBSX1NFUlZFUiwJImlMUFItU2VydmVyIiB9LAkvKiBscHIgc2VydmVyIChSRkMxMTc5KSAqLwotCXsgVEFHX0lNUFJFU1NfU0VSVkVSLAkiaUlNIiB9LAkvKiBpbXByZXNzIHNlcnZlcnMgKEltYWdlbikgKi8KLQl7IFRBR19STFBfU0VSVkVSLAkiaVJMIiB9LAkvKiByZXNvdXJjZSBsb2NhdGlvbiAoUkZDODg3KSAqLwotCXsgVEFHX0hPU1ROQU1FLAkJImFIb3N0bmFtZSIgfSwJLyogYXNjaWkgaG9zdG5hbWUgKi8KLQl7IFRBR19CT09UU0laRSwJCSJzQlMiIH0sCS8qIDUxMiBieXRlIGJsb2NrcyAqLwotCXsgVEFHX0VORCwJCSIgRU5EIiB9LAotLyogUkZDMTQ5NyB0YWdzICovCi0JeyBUQUdfRFVNUFBBVEgsCQkiYURQIiB9LAotCXsgVEFHX0RPTUFJTk5BTUUsCSJhRG9tYWluLU5hbWUiIH0sCi0JeyBUQUdfU1dBUF9TRVJWRVIsCSJpU1MiIH0sCi0JeyBUQUdfUk9PVFBBVEgsCQkiYVJQIiB9LAotCXsgVEFHX0VYVFBBVEgsCQkiYUVQIiB9LAotLyogUkZDMjEzMiB0YWdzICovCi0JeyBUQUdfSVBfRk9SV0FSRCwJIkJJUEYiIH0sCi0JeyBUQUdfTkxfU1JDUlQsCQkiQlNSVCIgfSwKLQl7IFRBR19QRklMVEVSUywJCSJwUEYiIH0sCi0JeyBUQUdfUkVBU1NfU0laRSwJInNSU1oiIH0sCi0JeyBUQUdfREVGX1RUTCwJCSJiVFRMIiB9LAotCXsgVEFHX01UVV9USU1FT1VULAkibE1UVS1UaW1lb3V0IiB9LAotCXsgVEFHX01UVV9UQUJMRSwJInNNVFUtVGFibGUiIH0sCi0JeyBUQUdfSU5UX01UVSwJCSJzTVRVIiB9LAotCXsgVEFHX0xPQ0FMX1NVQk5FVFMsCSJCTFNOIiB9LAotCXsgVEFHX0JST0FEX0FERFIsCSJpQlIiIH0sCi0JeyBUQUdfRE9fTUFTS19ESVNDLAkiQk1EIiB9LAotCXsgVEFHX1NVUFBMWV9NQVNLLAkiQk1TIiB9LAotCXsgVEFHX0RPX1JESVNDLAkJIkJSb3V0ZXItRGlzY292ZXJ5IiB9LAotCXsgVEFHX1JUUl9TT0xfQUREUiwJImlSU0EiIH0sCi0JeyBUQUdfU1RBVElDX1JPVVRFLAkicFN0YXRpYy1Sb3V0ZSIgfSwKLQl7IFRBR19VU0VfVFJBSUxFUlMsCSJCVVQiIH0sCi0JeyBUQUdfQVJQX1RJTUVPVVQsCSJsQVQiIH0sCi0JeyBUQUdfRVRIX0VOQ0FQLAkiQklFIiB9LAotCXsgVEFHX1RDUF9UVEwsCQkiYlRUIiB9LAotCXsgVEFHX1RDUF9LRUVQQUxJVkUsCSJsS0kiIH0sCi0JeyBUQUdfS0VFUEFMSVZFX0dPLAkiQktHIiB9LAotCXsgVEFHX05JU19ET01BSU4sCSJhWUQiIH0sCi0JeyBUQUdfTklTX1NFUlZFUlMsCSJpWVMiIH0sCi0JeyBUQUdfTlRQX1NFUlZFUlMsCSJpTlRQIiB9LAotCXsgVEFHX1ZFTkRPUl9PUFRTLAkiYlZlbmRvci1PcHRpb24iIH0sCi0JeyBUQUdfTkVUQklPU19OUywJImlOZXRiaW9zLU5hbWUtU2VydmVyIiB9LAotCXsgVEFHX05FVEJJT1NfRERTLAkiaVdERCIgfSwKLQl7IFRBR19ORVRCSU9TX05PREUsCSIkTmV0Ymlvcy1Ob2RlIiB9LAotCXsgVEFHX05FVEJJT1NfU0NPUEUsCSJhTmV0Ymlvcy1TY29wZSIgfSwKLQl7IFRBR19YV0lOX0ZTLAkJImlYRlMiIH0sCi0JeyBUQUdfWFdJTl9ETSwJCSJpWERNIiB9LAotCXsgVEFHX05JU19QX0RPTUFJTiwJInNOK0QiIH0sCi0JeyBUQUdfTklTX1BfU0VSVkVSUywJImlOK1MiIH0sCi0JeyBUQUdfTU9CSUxFX0hPTUUsCSJpTUgiIH0sCi0JeyBUQUdfU01QVF9TRVJWRVIsCSJpU01UUCIgfSwKLQl7IFRBR19QT1AzX1NFUlZFUiwJImlQT1AzIiB9LAotCXsgVEFHX05OVFBfU0VSVkVSLAkiaU5OVFAiIH0sCi0JeyBUQUdfV1dXX1NFUlZFUiwJImlXV1ciIH0sCi0JeyBUQUdfRklOR0VSX1NFUlZFUiwJImlGRyIgfSwKLQl7IFRBR19JUkNfU0VSVkVSLAkiaUlSQyIgfSwKLQl7IFRBR19TVFJFRVRUQUxLX1NSVlIsCSJpU1RTIiB9LAotCXsgVEFHX1NUUkVFVFRBTEtfU1REQSwJImlTVERBIiB9LAotCXsgVEFHX1JFUVVFU1RFRF9JUCwJImlSZXF1ZXN0ZWQtSVAiIH0sCi0JeyBUQUdfSVBfTEVBU0UsCQkibExlYXNlLVRpbWUiIH0sCi0JeyBUQUdfT1BUX09WRVJMT0FELAkiJE9PIiB9LAotCXsgVEFHX1RGVFBfU0VSVkVSLAkiYVRGVFAiIH0sCi0JeyBUQUdfQk9PVEZJTEVOQU1FLAkiYUJGIiB9LAotCXsgVEFHX0RIQ1BfTUVTU0FHRSwJIiBESENQLU1lc3NhZ2UiIH0sCi0JeyBUQUdfU0VSVkVSX0lELAkiaVNlcnZlci1JRCIgfSwKLQl7IFRBR19QQVJNX1JFUVVFU1QsCSJiUGFyYW1ldGVyLVJlcXVlc3QiIH0sCi0JeyBUQUdfTUVTU0FHRSwJCSJhTVNHIiB9LAotCXsgVEFHX01BWF9NU0dfU0laRSwJInNNU1oiIH0sCi0JeyBUQUdfUkVORVdBTF9USU1FLAkibFJOIiB9LAotCXsgVEFHX1JFQklORF9USU1FLAkibFJCIiB9LAotCXsgVEFHX1ZFTkRPUl9DTEFTUywJImFWZW5kb3ItQ2xhc3MiIH0sCi0JeyBUQUdfQ0xJRU5UX0lELAkiJENsaWVudC1JRCIgfSwKLS8qIFJGQyAyNDg1ICovCi0JeyBUQUdfT1BFTl9HUk9VUF9VQVAsCSJhVUFQIiB9LAotLyogUkZDIDI1NjMgKi8KLQl7IFRBR19ESVNBQkxFX0FVVE9DT05GLAkiQk5PQVVUTyIgfSwKLS8qIFJGQyAyNjEwICovCi0JeyBUQUdfU0xQX0RBLAkJImJTTFAtREEiIH0sCS8qImIiIGlzIGEgbGl0dGxlIHdyb25nICovCi0JeyBUQUdfU0xQX1NDT1BFLAkiYlNMUC1TQ09QRSIgfSwJLyoiYiIgaXMgYSBsaXR0bGUgd3JvbmcgKi8KLS8qIFJGQyAyOTM3ICovCi0JeyBUQUdfTlNfU0VBUkNILAkic05TU0VBUkNIIiB9LAkvKiBYWFggJ3MnICovCi0vKiBSRkMgMzAxMSAqLwotCXsgVEFHX0lQNF9TVUJORVRfU0VMRUNULCAiaVNVQk5FVCIgfSwKLS8qIFJGQyAzNDQyICovCi0JeyBUQUdfQ0xBU1NMRVNTX1NUQVRJQ19SVCwgIiRDbGFzc2xlc3MtU3RhdGljLVJvdXRlIiB9LAotCXsgVEFHX0NMQVNTTEVTU19TVEFfUlRfTVMsICIkQ2xhc3NsZXNzLVN0YXRpYy1Sb3V0ZS1NaWNyb3NvZnQiIH0sCi0vKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2Jvb3RwLWRoY3AtZXh0ZW5zaW9ucy9pbmRleC5odG0gKi8KLQl7IFRBR19VU0VSX0NMQVNTLAkiYUNMQVNTIiB9LAotCXsgVEFHX1NMUF9OQU1JTkdfQVVUSCwJImFTTFAtTkEiIH0sCi0JeyBUQUdfQ0xJRU5UX0ZRRE4sCSIkRlFETiIgfSwKLQl7IFRBR19BR0VOVF9DSVJDVUlULAkiJEFnZW50LUluZm9ybWF0aW9uIiB9LAotCXsgVEFHX0FHRU5UX1JFTU9URSwJImJBUk1UIiB9LAotCXsgVEFHX0FHRU5UX01BU0ssCSJiQU1TSyIgfSwKLQl7IFRBR19UWl9TVFJJTkcsCSJhVFpTVFIiIH0sCi0JeyBUQUdfRlFETl9PUFRJT04sCSJiRlFETlMiIH0sCS8qIFhYWCAnYicgKi8KLQl7IFRBR19BVVRILAkJImJBVVRIIiB9LAkvKiBYWFggJ2InICovCi0JeyBUQUdfVklORVNfU0VSVkVSUywJImlWSU5FUyIgfSwKLQl7IFRBR19TRVJWRVJfUkFOSywJInNSQU5LIiB9LAotCXsgVEFHX0NMSUVOVF9BUkNILAkic0FSQ0giIH0sCi0JeyBUQUdfQ0xJRU5UX05ESSwJImJOREkiIH0sCS8qIFhYWCAnYicgKi8KLQl7IFRBR19DTElFTlRfR1VJRCwJImJHVUlEIiB9LAkvKiBYWFggJ2InICovCi0JeyBUQUdfTERBUF9VUkwsCQkiYUxEQVAiIH0sCi0JeyBUQUdfNk9WRVI0LAkJImk2bzQiIH0sCi0JeyBUQUdfUFJJTlRFUl9OQU1FLAkiYVBSVFIiIH0sCi0JeyBUQUdfTURIQ1BfU0VSVkVSLAkiYk1ESENQIiB9LAkvKiBYWFggJ2InICovCi0JeyBUQUdfSVBYX0NPTVBBVCwJImJJUFgiIH0sCS8qIFhYWCAnYicgKi8KLQl7IFRBR19ORVRJTkZPX1BBUkVOVCwJImlOSSIgfSwKLQl7IFRBR19ORVRJTkZPX1BBUkVOVF9UQUcsICJhTklUQUciIH0sCi0JeyBUQUdfVVJMLAkJImFVUkwiIH0sCi0JeyBUQUdfRkFJTE9WRVIsCQkiYkZBSUwiIH0sCS8qIFhYWCAnYicgKi8KLQl7IDAsCQkJTlVMTCB9Ci19OwotLyogMi1ieXRlIGV4dGVuZGVkIHRhZ3MgKi8KLXN0YXRpYyBzdHJ1Y3QgdG9rIHh0YWcyc3RyW10gPSB7Ci0JeyAwLAkJCU5VTEwgfQotfTsKLQotLyogREhDUCAib3B0aW9ucyBvdmVybG9hZCIgdHlwZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgdG9rIG9vMnN0cltdID0gewotCXsgMSwJCQkiZmlsZSIgfSwKLQl7IDIsCQkJInNuYW1lIiB9LAotCXsgMywJCQkiZmlsZStzbmFtZSIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi0vKiBORVRCSU9TIG92ZXIgVENQL0lQIG5vZGUgdHlwZSBvcHRpb25zICovCi1zdGF0aWMgc3RydWN0IHRvayBuYm8yc3RyW10gPSB7Ci0JeyAweDEsCQkJImItbm9kZSIgfSwKLQl7IDB4MiwJCQkicC1ub2RlIiB9LAotCXsgMHg0LAkJCSJtLW5vZGUiIH0sCi0JeyAweDgsCQkJImgtbm9kZSIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi0vKiBBUlAgSGFyZHdhcmUgdHlwZXMsIGZvciBDbGllbnQtSUQgb3B0aW9uICovCi1zdGF0aWMgc3RydWN0IHRvayBhcnAyc3RyW10gPSB7Ci0JeyAweDEsCQkJImV0aGVyIiB9LAotCXsgMHg2LAkJCSJpZWVlODAyIiB9LAotCXsgMHg3LAkJCSJhcmNuZXQiIH0sCi0JeyAweGYsCQkJImZyZWxheSIgfSwKLQl7IDB4MTcsCQkJInN0cmlwIiB9LAotCXsgMHgxOCwJCQkiaWVlZTEzOTQiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgZGhjcF9tc2dfdmFsdWVzW10gPSB7Ci0gICAgICAgIHsgREhDUERJU0NPVkVSLCAiRGlzY292ZXIiIH0sCi0gICAgICAgIHsgREhDUE9GRkVSLCAiT2ZmZXIiIH0sCi0gICAgICAgIHsgREhDUFJFUVVFU1QsICJSZXF1ZXN0IiB9LAotICAgICAgICB7IERIQ1BERUNMSU5FLCAiRGVjbGluZSIgfSwKLSAgICAgICAgeyBESENQQUNLLCAiQUNLIiB9LAotICAgICAgICB7IERIQ1BOQUssICJOQUNLIiB9LAotICAgICAgICB7IERIQ1BSRUxFQVNFLCAiUmVsZWFzZSIgfSwKLSAgICAgICAgeyBESENQSU5GT1JNLCAiSW5mb3JtIiB9LAotICAgICAgICB7IDAsCQkJTlVMTCB9Ci19OwotCi0jZGVmaW5lIEFHRU5UX1NVQk9QVElPTl9DSVJDVUlUX0lEIDEKLXN0YXRpYyBzdHJ1Y3QgdG9rIGFnZW50X3N1Ym9wdGlvbl92YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBBR0VOVF9TVUJPUFRJT05fQ0lSQ1VJVF9JRCwgIkNpcmN1aXQtSUQiIH0sCi0gICAgICAgIHsgMCwJCQlOVUxMIH0KLX07Ci0KLQotc3RhdGljIHZvaWQKLXJmYzEwNDhfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKLXsKLQlyZWdpc3RlciB1X2ludDE2X3QgdGFnOwotCXJlZ2lzdGVyIHVfaW50IGxlbjsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpjcDsKLQlyZWdpc3RlciBjaGFyIGM7Ci0JaW50IGZpcnN0LCBpZHg7Ci0JdV9pbnQzMl90IHVsOwotCXVfaW50MTZfdCB1czsKLQl1X2ludDhfdCB1Yywgc3Vib3B0LCBzdWJvcHRsZW47Ci0KLQlwcmludGYoIlxuXHQgIFZlbmRvci1yZmMxMDQ4IEV4dGVuc2lvbnMiKTsKLQotCS8qIFN0ZXAgb3ZlciBtYWdpYyBjb29raWUgKi8KLSAgICAgICAgcHJpbnRmKCJcblx0ICAgIE1hZ2ljIENvb2tpZSAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyhicCkpOwotCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQotCS8qIExvb3Agd2hpbGUgd2UgdGhlcmUgaXMgYSB0YWcgbGVmdCBpbiB0aGUgYnVmZmVyICovCi0Jd2hpbGUgKFRURVNUMigqYnAsIDEpKSB7Ci0JCXRhZyA9ICpicCsrOwotCQlpZiAodGFnID09IFRBR19QQUQgJiYgdmZsYWcgPCAzKQotCQkJY29udGludWU7Ci0JCWlmICh0YWcgPT0gVEFHX0VORCAmJiB2ZmxhZyA8IDMpCi0JCQlyZXR1cm47Ci0JCWlmICh0YWcgPT0gVEFHX0VYVEVOREVEX09QVElPTikgewotCQkJVENIRUNLMigqKGJwICsgMSksIDIpOwotCQkJdGFnID0gRVhUUkFDVF8xNkJJVFMoYnAgKyAxKTsKLQkJCS8qIFhYWCB3ZSBkb24ndCBrbm93IHlldCBpZiB0aGUgSUFOQSB3aWxsCi0JCQkgKiBwcmVjbHVkZSBvdmVybGFwIG9mIDEtYnl0ZSBhbmQgMi1ieXRlIHNwYWNlcy4KLQkJCSAqIElmIG5vdCwgd2UgbmVlZCB0byBvZmZzZXQgdGFnIGFmdGVyIHRoaXMgc3RlcC4KLQkJCSAqLwotCQkJY3AgPSB0b2syc3RyKHh0YWcyc3RyLCAiP3hUJXUiLCB0YWcpOwotCQl9IGVsc2UKLQkJCWNwID0gdG9rMnN0cih0YWcyc3RyLCAiP1QldSIsIHRhZyk7Ci0JCWMgPSAqY3ArKzsKLQotCQlpZiAodGFnID09IFRBR19QQUQgfHwgdGFnID09IFRBR19FTkQpCi0JCQlsZW4gPSAwOwotCQllbHNlIHsKLQkJCS8qIEdldCB0aGUgbGVuZ3RoOyBjaGVjayBmb3IgdHJ1bmNhdGlvbiAqLwotCQkJVENIRUNLMigqYnAsIDEpOwotCQkJbGVuID0gKmJwKys7Ci0JCX0KLQotCQlwcmludGYoIlxuXHQgICAgJXMgT3B0aW9uICV1LCBsZW5ndGggJXUlcyIsIGNwLCB0YWcsIGxlbiwKLQkJICAgIGxlbiA+IDAgPyAiOiAiIDogIiIpOwotCi0JCWlmICh0YWcgPT0gVEFHX1BBRCAmJiB2ZmxhZyA+IDIpIHsKLQkJCXVfaW50IG50YWcgPSAxOwotCQkJd2hpbGUgKFRURVNUMigqYnAsIDEpICYmICpicCA9PSBUQUdfUEFEKSB7Ci0JCQkJYnArKzsKLQkJCQludGFnKys7Ci0JCQl9Ci0JCQlpZiAobnRhZyA+IDEpCi0JCQkJcHJpbnRmKCIsIG9jY3VycyAldSIsIG50YWcpOwotCQl9Ci0KLQkJaWYgKCFUVEVTVDIoKmJwLCBsZW4pKSB7Ci0JCQlwcmludGYoIlt8cmZjMTA0OCAldV0iLCBsZW4pOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHRhZyA9PSBUQUdfREhDUF9NRVNTQUdFICYmIGxlbiA9PSAxKSB7Ci0JCQl1YyA9ICpicCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsIHRvazJzdHIoZGhjcF9tc2dfdmFsdWVzLCAiVW5rbm93biAoJXUpIiwgdWMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKHRhZyA9PSBUQUdfUEFSTV9SRVFVRVNUKSB7Ci0JCQlpZHggPSAwOwotCQkJd2hpbGUgKGxlbi0tID4gMCkgewotCQkJCXVjID0gKmJwKys7Ci0JCQkJY3AgPSB0b2syc3RyKHRhZzJzdHIsICI/T3B0aW9uICV1IiwgdWMpOwotCQkJCWlmIChpZHggJSA0ID09IDApCi0JCQkJCXByaW50ZigiXG5cdCAgICAgICIpOwotCQkJCWVsc2UKLQkJCQkJcHJpbnRmKCIsICIpOwotCQkJCXByaW50ZigiJXMiLCBjcCArIDEpOwotCQkJCWlkeCsrOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAodGFnID09IFRBR19FWFRFTkRFRF9SRVFVRVNUKSB7Ci0JCQlmaXJzdCA9IDE7Ci0JCQl3aGlsZSAobGVuID4gMSkgewotCQkJCWxlbiAtPSAyOwotCQkJCXVzID0gRVhUUkFDVF8xNkJJVFMoYnApOwotCQkJCWJwICs9IDI7Ci0JCQkJY3AgPSB0b2syc3RyKHh0YWcyc3RyLCAiP3hUJXUiLCB1cyk7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJcHV0Y2hhcignKycpOwotCQkJCXByaW50ZigiJXMiLCBjcCArIDEpOwotCQkJCWZpcnN0ID0gMDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogUHJpbnQgZGF0YSAqLwotCQlpZiAoYyA9PSAnPycpIHsKLQkJCS8qIEJhc2UgZGVmYXVsdCBmb3JtYXRzIGZvciB1bmtub3duIHRhZ3Mgb24gZGF0YSBzaXplICovCi0JCQlpZiAobGVuICYgMSkKLQkJCQljID0gJ2InOwotCQkJZWxzZSBpZiAobGVuICYgMikKLQkJCQljID0gJ3MnOwotCQkJZWxzZQotCQkJCWMgPSAnbCc7Ci0JCX0KLQkJZmlyc3QgPSAxOwotCQlzd2l0Y2ggKGMpIHsKLQotCQljYXNlICdhJzoKLQkJCS8qIGFzY2lpIHN0cmluZ3MgKi8KLQkJCXB1dGNoYXIoJyInKTsKLQkJCWlmIChmbl9wcmludG4oYnAsIGxlbiwgc25hcGVuZCkpIHsKLQkJCQlwdXRjaGFyKCciJyk7Ci0JCQkJZ290byB0cnVuYzsKLQkJCX0KLQkJCXB1dGNoYXIoJyInKTsKLQkJCWJwICs9IGxlbjsKLQkJCWxlbiA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlICdpJzoKLQkJY2FzZSAnbCc6Ci0JCWNhc2UgJ0wnOgotCQkJLyogaXAgYWRkcmVzc2VzLzMyLWJpdCB3b3JkcyAqLwotCQkJd2hpbGUgKGxlbiA+PSBzaXplb2YodWwpKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJcHV0Y2hhcignLCcpOwotCQkJCXVsID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkJCWlmIChjID09ICdpJykgewotCQkJCQl1bCA9IGh0b25sKHVsKTsKLQkJCQkJcHJpbnRmKCIlcyIsIGlwYWRkcl9zdHJpbmcoJnVsKSk7Ci0JCQkJfSBlbHNlIGlmIChjID09ICdMJykKLQkJCQkJcHJpbnRmKCIlZCIsIHVsKTsKLQkJCQllbHNlCi0JCQkJCXByaW50ZigiJXUiLCB1bCk7Ci0JCQkJYnAgKz0gc2l6ZW9mKHVsKTsKLQkJCQlsZW4gLT0gc2l6ZW9mKHVsKTsKLQkJCQlmaXJzdCA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICdwJzoKLQkJCS8qIElQIGFkZHJlc3MgcGFpcnMgKi8KLQkJCXdoaWxlIChsZW4gPj0gMipzaXplb2YodWwpKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJcHV0Y2hhcignLCcpOwotCQkJCW1lbWNweSgoY2hhciAqKSZ1bCwgKGNvbnN0IGNoYXIgKilicCwgc2l6ZW9mKHVsKSk7Ci0JCQkJcHJpbnRmKCIoJXM6IiwgaXBhZGRyX3N0cmluZygmdWwpKTsKLQkJCQlicCArPSBzaXplb2YodWwpOwotCQkJCW1lbWNweSgoY2hhciAqKSZ1bCwgKGNvbnN0IGNoYXIgKilicCwgc2l6ZW9mKHVsKSk7Ci0JCQkJcHJpbnRmKCIlcykiLCBpcGFkZHJfc3RyaW5nKCZ1bCkpOwotCQkJCWJwICs9IHNpemVvZih1bCk7Ci0JCQkJbGVuIC09IDIqc2l6ZW9mKHVsKTsKLQkJCQlmaXJzdCA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICdzJzoKLQkJCS8qIHNob3J0cyAqLwotCQkJd2hpbGUgKGxlbiA+PSBzaXplb2YodXMpKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJcHV0Y2hhcignLCcpOwotCQkJCXVzID0gRVhUUkFDVF8xNkJJVFMoYnApOwotCQkJCXByaW50ZigiJXUiLCB1cyk7Ci0JCQkJYnAgKz0gc2l6ZW9mKHVzKTsKLQkJCQlsZW4gLT0gc2l6ZW9mKHVzKTsKLQkJCQlmaXJzdCA9IDA7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlICdCJzoKLQkJCS8qIGJvb2xlYW4gKi8KLQkJCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQkJaWYgKCFmaXJzdCkKLQkJCQkJcHV0Y2hhcignLCcpOwotCQkJCXN3aXRjaCAoKmJwKSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlwdXRjaGFyKCdOJyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJcHV0Y2hhcignWScpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwcmludGYoIiV1PyIsICpicCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkrK2JwOwotCQkJCS0tbGVuOwotCQkJCWZpcnN0ID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2InOgotCQljYXNlICd4JzoKLQkJZGVmYXVsdDoKLQkJCS8qIEJ5dGVzICovCi0JCQl3aGlsZSAobGVuID4gMCkgewotCQkJCWlmICghZmlyc3QpCi0JCQkJCXB1dGNoYXIoYyA9PSAneCcgPyAnOicgOiAnLicpOwotCQkJCWlmIChjID09ICd4JykKLQkJCQkJcHJpbnRmKCIlMDJ4IiwgKmJwKTsKLQkJCQllbHNlCi0JCQkJCXByaW50ZigiJXUiLCAqYnApOwotCQkJCSsrYnA7Ci0JCQkJLS1sZW47Ci0JCQkJZmlyc3QgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnJCc6Ci0JCQkvKiBHdXlzIHdlIGNhbid0IGhhbmRsZSB3aXRoIG9uZSBvZiB0aGUgdXN1YWwgY2FzZXMgKi8KLQkJCXN3aXRjaCAodGFnKSB7Ci0KLQkJCWNhc2UgVEFHX05FVEJJT1NfTk9ERToKLQkJCQkvKiB0aGlzIG9wdGlvbiBzaG91bGQgYmUgYXQgbGVhc3QgMSBieXRlIGxvbmcgKi8KLQkJCQlpZiAobGVuIDwgMSkgIHsKLQkJCQkJcHJpbnRmKCJFUlJPUjogb3B0aW9uICV1IGxlbiAldSA8IDEgYnl0ZXMiLAotCQkJCQkgICAgVEFHX05FVEJJT1NfTk9ERSwgbGVuKTsKLQkJCQkJYnAgKz0gbGVuOwotCQkJCQlsZW4gPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJdGFnID0gKmJwKys7Ci0JCQkJLS1sZW47Ci0JCQkJZnB1dHModG9rMnN0cihuYm8yc3RyLCBOVUxMLCB0YWcpLCBzdGRvdXQpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRBR19PUFRfT1ZFUkxPQUQ6Ci0JCQkJLyogdGhpcyBvcHRpb24gc2hvdWxkIGJlIGF0IGxlYXN0IDEgYnl0ZSBsb25nICovCi0JCQkJaWYgKGxlbiA8IDEpICB7Ci0JCQkJCXByaW50ZigiRVJST1I6IG9wdGlvbiAldSBsZW4gJXUgPCAxIGJ5dGVzIiwKLQkJCQkJICAgIFRBR19PUFRfT1ZFUkxPQUQsIGxlbik7Ci0JCQkJCWJwICs9IGxlbjsKLQkJCQkJbGVuID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXRhZyA9ICpicCsrOwotCQkJCS0tbGVuOwotCQkJCWZwdXRzKHRvazJzdHIob28yc3RyLCBOVUxMLCB0YWcpLCBzdGRvdXQpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRBR19DTElFTlRfRlFETjoKLQkJCQkvKiB0aGlzIG9wdGlvbiBzaG91bGQgYmUgYXQgbGVhc3QgMyBieXRlcyBsb25nICovCi0JCQkJaWYgKGxlbiA8IDMpICB7Ci0JCQkJCXByaW50ZigiRVJST1I6IG9wdGlvbiAldSBsZW4gJXUgPCAzIGJ5dGVzIiwKLQkJCQkJICAgIFRBR19DTElFTlRfRlFETiwgbGVuKTsKLQkJCQkJYnAgKz0gbGVuOwotCQkJCQlsZW4gPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKCpicCkKLQkJCQkJcHJpbnRmKCJbJXNdICIsIGNsaWVudF9mcWRuX2ZsYWdzKCpicCkpOwotCQkJCWJwKys7Ci0JCQkJaWYgKCpicCB8fCAqKGJwKzEpKQotCQkJCQlwcmludGYoIiV1LyV1ICIsICpicCwgKihicCsxKSk7Ci0JCQkJYnAgKz0gMjsKLQkJCQlwdXRjaGFyKCciJyk7Ci0JCQkJaWYgKGZuX3ByaW50bihicCwgbGVuIC0gMywgc25hcGVuZCkpIHsKLQkJCQkJcHV0Y2hhcignIicpOwotCQkJCQlnb3RvIHRydW5jOwotCQkJCX0KLQkJCQlwdXRjaGFyKCciJyk7Ci0JCQkJYnAgKz0gbGVuIC0gMzsKLQkJCQlsZW4gPSAwOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRBR19DTElFTlRfSUQ6Ci0JCQkgICAgewlpbnQgdHlwZTsKLQotCQkJCS8qIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBhdCBsZWFzdCAxIGJ5dGUgbG9uZyAqLwotCQkJCWlmIChsZW4gPCAxKSAgewotCQkJCQlwcmludGYoIkVSUk9SOiBvcHRpb24gJXUgbGVuICV1IDwgMSBieXRlcyIsCi0JCQkJCSAgICBUQUdfQ0xJRU5UX0lELCBsZW4pOwotCQkJCQlicCArPSBsZW47Ci0JCQkJCWxlbiA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQl0eXBlID0gKmJwKys7Ci0JCQkJbGVuLS07Ci0JCQkJaWYgKHR5cGUgPT0gMCkgewotCQkJCQlwdXRjaGFyKCciJyk7Ci0JCQkJCWlmIChmbl9wcmludG4oYnAsIGxlbiwgc25hcGVuZCkpIHsKLQkJCQkJCXB1dGNoYXIoJyInKTsKLQkJCQkJCWdvdG8gdHJ1bmM7Ci0JCQkJCX0KLQkJCQkJcHV0Y2hhcignIicpOwotCQkJCQlicCArPSBsZW47Ci0JCQkJCWxlbiA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ZigiJXMgIiwgdG9rMnN0cihhcnAyc3RyLCAiaGFyZHdhcmUtdHlwZSAldSwiLCB0eXBlKSk7Ci0JCQkJCXdoaWxlIChsZW4gPiAwKSB7Ci0JCQkJCQlpZiAoIWZpcnN0KQotCQkJCQkJCXB1dGNoYXIoJzonKTsKLQkJCQkJCXByaW50ZigiJTAyeCIsICpicCk7Ci0JCQkJCQkrK2JwOwotCQkJCQkJLS1sZW47Ci0JCQkJCQlmaXJzdCA9IDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQkgICAgfQotCi0JCQljYXNlIFRBR19BR0VOVF9DSVJDVUlUOgotCQkJCXdoaWxlIChsZW4gPj0gMikgewotCQkJCQlzdWJvcHQgPSAqYnArKzsKLQkJCQkJc3Vib3B0bGVuID0gKmJwKys7Ci0JCQkJCWxlbiAtPSAyOwotCQkJCQlpZiAoc3Vib3B0bGVuID4gbGVuKSB7Ci0JCQkJCQlwcmludGYoIlxuXHQgICAgICAlcyBTdWJPcHRpb24gJXUsIGxlbmd0aCAldTogbGVuZ3RoIGdvZXMgcGFzdCBlbmQgb2Ygb3B0aW9uIiwKLQkJCQkJCSAgIHRvazJzdHIoYWdlbnRfc3Vib3B0aW9uX3ZhbHVlcywgIlVua25vd24iLCBzdWJvcHQpLAotCQkJCQkJICAgc3Vib3B0LAotCQkJCQkJICAgc3Vib3B0bGVuKTsKLQkJCQkJCWJwICs9IGxlbjsKLQkJCQkJCWxlbiA9IDA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwcmludGYoIlxuXHQgICAgICAlcyBTdWJPcHRpb24gJXUsIGxlbmd0aCAldTogIiwKLQkJCQkJICAgdG9rMnN0cihhZ2VudF9zdWJvcHRpb25fdmFsdWVzLCAiVW5rbm93biIsIHN1Ym9wdCksCi0JCQkJCSAgIHN1Ym9wdCwKLQkJCQkJICAgc3Vib3B0bGVuKTsKLQkJCQkJc3dpdGNoIChzdWJvcHQpIHsKLQotCQkJCQljYXNlIEFHRU5UX1NVQk9QVElPTl9DSVJDVUlUX0lEOgotCQkJCQkJZm5fcHJpbnRuKGJwLCBzdWJvcHRsZW4sIE5VTEwpOwotCQkJCQkJYnJlYWs7Ci0KLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXByaW50X3Vua25vd25fZGF0YShicCwgIlxuXHRcdCIsIHN1Ym9wdGxlbik7Ci0JCQkJCX0KLQotCQkJCQlsZW4gLT0gc3Vib3B0bGVuOwotCQkJCQlicCArPSBzdWJvcHRsZW47Ci0JCQkgICAgfQotCQkJICAgIGJyZWFrOwotCi0JCQljYXNlIFRBR19DTEFTU0xFU1NfU1RBVElDX1JUOgotCQkJY2FzZSBUQUdfQ0xBU1NMRVNTX1NUQV9SVF9NUzoKLQkJCXsJCi0JCQkJdV9pbnQgbWFza193aWR0aCwgc2lnbmlmaWNhbnRfb2N0ZXRzLCBpOwotCi0JCQkJLyogdGhpcyBvcHRpb24gc2hvdWxkIGJlIGF0IGxlYXN0IDUgYnl0ZXMgbG9uZyAqLwotCQkJCWlmIChsZW4gPCA1KSAgewotCQkJCQlwcmludGYoIkVSUk9SOiBvcHRpb24gJXUgbGVuICV1IDwgNSBieXRlcyIsCi0JCQkJCSAgICBUQUdfQ0xBU1NMRVNTX1NUQVRJQ19SVCwgbGVuKTsKLQkJCQkJYnAgKz0gbGVuOwotCQkJCQlsZW4gPSAwOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJd2hpbGUgKGxlbiA+IDApIHsKLQkJCQkJaWYgKCFmaXJzdCkKLQkJCQkJCXB1dGNoYXIoJywnKTsKLQkJCQkJbWFza193aWR0aCA9ICpicCsrOwotCQkJCQlsZW4tLTsKLQkJCQkJLyogbWFza193aWR0aCA8PSAzMiAqLwotCQkJCQlpZiAobWFza193aWR0aCA+IDMyKSB7Ci0JCQkJCQlwcmludGYoIltFUlJPUjogTWFzayB3aWR0aCAoJWQpID4gMzJdIiwgIG1hc2tfd2lkdGgpOwotCQkJCQkJYnAgKz0gbGVuOwotCQkJCQkJbGVuID0gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXNpZ25pZmljYW50X29jdGV0cyA9IChtYXNrX3dpZHRoICsgNykgLyA4OwotCQkJCQkvKiBzaWduaWZpY2FudCBvY3RldHMgKyByb3V0ZXIoNCkgKi8KLQkJCQkJaWYgKGxlbiA8IHNpZ25pZmljYW50X29jdGV0cyArIDQpIHsKLQkJCQkJCXByaW50ZigiW0VSUk9SOiBSZW1haW5pbmcgbGVuZ3RoICgldSkgPCAldSBieXRlc10iLCAgbGVuLCBzaWduaWZpY2FudF9vY3RldHMgKyA0KTsKLQkJCQkJCWJwICs9IGxlbjsKLQkJCQkJCWxlbiA9IDA7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlwdXRjaGFyKCcoJyk7Ci0JCQkJCWlmIChtYXNrX3dpZHRoID09IDApCi0JCQkJCQlwcmludGYoImRlZmF1bHQiKTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKGkgPSAwOyBpIDwgc2lnbmlmaWNhbnRfb2N0ZXRzIDsgaSsrKSB7Ci0JCQkJCQkJaWYgKGkgPiAwKQotCQkJCQkJCQlwdXRjaGFyKCcuJyk7Ci0JCQkJCQkJcHJpbnRmKCIlZCIsICpicCsrKTsKLQkJCQkJCX0KLQkJCQkJCWZvciAoaSA9IHNpZ25pZmljYW50X29jdGV0cyA7IGkgPCA0IDsgaSsrKQotCQkJCQkJCXByaW50ZigiLjAiKTsKLQkJCQkJCXByaW50ZigiLyVkIiwgbWFza193aWR0aCk7Ci0JCQkJCX0KLQkJCQkJbWVtY3B5KChjaGFyICopJnVsLCAoY29uc3QgY2hhciAqKWJwLCBzaXplb2YodWwpKTsKLQkJCQkJcHJpbnRmKCI6JXMpIiwgaXBhZGRyX3N0cmluZygmdWwpKTsKLQkJCQkJYnAgKz0gc2l6ZW9mKHVsKTsKLQkJCQkJbGVuIC09IChzaWduaWZpY2FudF9vY3RldHMgKyA0KTsKLQkJCQkJZmlyc3QgPSAwOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiW3Vua25vd24gc3BlY2lhbCB0YWcgJXUsIHNpemUgJXVdIiwKLQkJCQkgICAgdGFnLCBsZW4pOwotCQkJCWJwICs9IGxlbjsKLQkJCQlsZW4gPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRGF0YSBsZWZ0IG92ZXI/ICovCi0JCWlmIChsZW4pIHsKLQkJCXByaW50ZigiXG5cdCAgdHJhaWxpbmcgZGF0YSBsZW5ndGggJXUiLCBsZW4pOwotCQkJYnAgKz0gbGVuOwotCQl9Ci0JfQotCXJldHVybjsKLXRydW5jOgotCXByaW50ZigifFtyZmMxMDQ4XSIpOwotfQotCi1zdGF0aWMgdm9pZAotY211X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGNtdV92ZW5kICpjbXU7Ci0KLSNkZWZpbmUgUFJJTlRDTVVBRERSKG0sIHMpIHsgVENIRUNLKGNtdS0+bSk7IFwKLSAgICBpZiAoY211LT5tLnNfYWRkciAhPSAwKSBcCi0JcHJpbnRmKCIgJXM6JXMiLCBzLCBpcGFkZHJfc3RyaW5nKCZjbXUtPm0uc19hZGRyKSk7IH0KLQotCXByaW50ZigiIHZlbmQtY211Iik7Ci0JY211ID0gKGNvbnN0IHN0cnVjdCBjbXVfdmVuZCAqKWJwOwotCi0JLyogT25seSBwcmludCBpZiB0aGVyZSBhcmUgdW5rbm93biBiaXRzICovCi0JVENIRUNLKGNtdS0+dl9mbGFncyk7Ci0JaWYgKChjbXUtPnZfZmxhZ3MgJiB+KFZGX1NNQVNLKSkgIT0gMCkKLQkJcHJpbnRmKCIgRjoweCV4IiwgY211LT52X2ZsYWdzKTsKLQlQUklOVENNVUFERFIodl9kZ2F0ZSwgIkRHIik7Ci0JUFJJTlRDTVVBRERSKHZfc21hc2ssIGNtdS0+dl9mbGFncyAmIFZGX1NNQVNLID8gIlNNIiA6ICJTTSoiKTsKLQlQUklOVENNVUFERFIodl9kbnMxLCAiTlMxIik7Ci0JUFJJTlRDTVVBRERSKHZfZG5zMiwgIk5TMiIpOwotCVBSSU5UQ01VQUREUih2X2luczEsICJJRU4xIik7Ci0JUFJJTlRDTVVBRERSKHZfaW5zMiwgIklFTjIiKTsKLQlQUklOVENNVUFERFIodl90czEsICJUUzEiKTsKLQlQUklOVENNVUFERFIodl90czIsICJUUzIiKTsKLQlyZXR1cm47Ci0KLXRydW5jOgotCWZwdXRzKHRzdHIsIHN0ZG91dCk7Ci0jdW5kZWYgUFJJTlRDTVVBRERSCi19Ci0KLXN0YXRpYyBjaGFyICoKLWNsaWVudF9mcWRuX2ZsYWdzKHVfaW50IGZsYWdzKQotewotCXN0YXRpYyBjaGFyIGJ1Zls4KzFdOwotCWludCBpID0gMDsKLQotCWlmIChmbGFncyAmIENMSUVOVF9GUUROX0ZMQUdTX1MpCi0JCWJ1ZltpKytdID0gJ1MnOwotCWlmIChmbGFncyAmIENMSUVOVF9GUUROX0ZMQUdTX08pCi0JCWJ1ZltpKytdID0gJ08nOwotCWlmIChmbGFncyAmIENMSUVOVF9GUUROX0ZMQUdTX0UpCi0JCWJ1ZltpKytdID0gJ0UnOwotCWlmIChmbGFncyAmIENMSUVOVF9GUUROX0ZMQUdTX04pCi0JCWJ1ZltpKytdID0gJ04nOwotCWJ1ZltpXSA9ICdcMCc7Ci0KLQlyZXR1cm4gYnVmOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtY2RwLmMgYi9wcmludC1jZHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5OGZiZS4uMDAwMDAwMAotLS0gYS9wcmludC1jZHAuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQ29kZSBieSBHZXJ0IERvZXJpbmcsIFNwYWNlTmV0IEdtYkgsIGdlcnRAc3BhY2UubmV0Ci0gKgotICogUmVmZXJlbmNlIGRvY3VtZW50YXRpb246Ci0gKiAgICBodHRwOi8vd3d3LmNpc2NvLmNvbS91bml2ZXJjZC9jYy90ZC9kb2MvcHJvZHVjdC9sYW4vdHJzcmIvZnJhbWVzLmh0bQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWNkcC5jLHYgMS4yNSAyMDA0LzEwLzA3IDE0OjUzOjExIGhhbm5lcyBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotI2luY2x1ZGUgIm5scGlkLmgiCi0KLSNkZWZpbmUgQ0RQX0hFQURFUl9MRU4gIDQKLQotc3RhdGljIHN0cnVjdCB0b2sgY2RwX3Rsdl92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICAgICAgICAgICAgICJEZXZpY2UtSUQifSwKLSAgICB7IDB4MDIsICAgICAgICAgICAgICJBZGRyZXNzIn0sCi0gICAgeyAweDAzLCAgICAgICAgICAgICAiUG9ydC1JRCJ9LAotICAgIHsgMHgwNCwgICAgICAgICAgICAgIkNhcGFiaWxpdHkifSwKLSAgICB7IDB4MDUsICAgICAgICAgICAgICJWZXJzaW9uIFN0cmluZyJ9LAotICAgIHsgMHgwNiwgICAgICAgICAgICAgIlBsYXRmb3JtIn0sCi0gICAgeyAweDA3LCAgICAgICAgICAgICAiUHJlZml4ZXMifSwKLSAgICB7IDB4MDgsICAgICAgICAgICAgICJQcm90b2NvbC1IZWxsbyBvcHRpb24ifSwKLSAgICB7IDB4MDksICAgICAgICAgICAgICJWVFAgTWFuYWdlbWVudCBEb21haW4ifSwKLSAgICB7IDB4MGEsICAgICAgICAgICAgICJOYXRpdmUgVkxBTiBJRCJ9LAotICAgIHsgMHgwYiwgICAgICAgICAgICAgIkR1cGxleCJ9LAotICAgIHsgMHgwZSwgICAgICAgICAgICAgIkFUQS0xODYgVm9JUCBWTEFOIHJlcXVlc3QifSwKLSAgICB7IDB4MGYsICAgICAgICAgICAgICJBVEEtMTg2IFZvSVAgVkxBTiBhc3NpZ25tZW50In0sCi0gICAgeyAweDEwLCAgICAgICAgICAgICAicG93ZXIgY29uc3VtcHRpb24ifSwKLSAgICB7IDB4MTEsICAgICAgICAgICAgICJNVFUifSwKLSAgICB7IDB4MTIsICAgICAgICAgICAgICJBVlZJRCB0cnVzdCBiaXRtYXAifSwKLSAgICB7IDB4MTMsICAgICAgICAgICAgICJBVlZJRCB1bnRydXN0ZWQgcG9ydHMgQ29TIn0sCi0gICAgeyAweDE0LCAgICAgICAgICAgICAiU3lzdGVtIE5hbWUifSwKLSAgICB7IDB4MTUsICAgICAgICAgICAgICJTeXN0ZW0gT2JqZWN0IElEIChub3QgZGVjb2RlZCkifSwKLSAgICB7IDB4MTYsICAgICAgICAgICAgICJNYW5hZ2VtZW50IEFkZHJlc3NlcyJ9LAotICAgIHsgMHgxNywgICAgICAgICAgICAgIlBoeXNpY2FsIExvY2F0aW9uIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgY2RwX2NhcGFiaWxpdHlfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAgICAgICAgICAgICAiUm91dGVyIiB9LAotICAgIHsgMHgwMiwgICAgICAgICAgICAgIlRyYW5zcGFyZW50IEJyaWRnZSIgfSwKLSAgICB7IDB4MDQsICAgICAgICAgICAgICJTb3VyY2UgUm91dGUgQnJpZGdlIiB9LAotICAgIHsgMHgwOCwgICAgICAgICAgICAgIkwyIFN3aXRjaCIgfSwKLSAgICB7IDB4MTAsICAgICAgICAgICAgICJMMyBjYXBhYmxlIiB9LAotICAgIHsgMHgyMCwgICAgICAgICAgICAgIklHTVAgc25vb3BpbmciIH0sCi0gICAgeyAweDQwLCAgICAgICAgICAgICAiTDEgY2FwYWJsZSIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIGludCBjZHBfcHJpbnRfYWRkcihjb25zdCB1X2NoYXIgKiwgaW50KTsKLXN0YXRpYyBpbnQgY2RwX3ByaW50X3ByZWZpeGVzKGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2RwX2dldF9udW1iZXIoY29uc3QgdV9jaGFyICosIGludCk7Ci0KLXZvaWQKLWNkcF9wcmludChjb25zdCB1X2NoYXIgKnBwdHIsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQotewotCWludCB0eXBlLCBsZW4sIGksIGo7Ci0gICAgICAgIGNvbnN0IHVfY2hhciAqdHB0cjsKLQotCWlmIChjYXBsZW4gPCBDRFBfSEVBREVSX0xFTikgewotCQkodm9pZClwcmludGYoIlt8Y2RwXSIpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgICAgIHRwdHIgPSBwcHRyOyAvKiB0ZW1wb3JhcnkgcG9pbnRlciAqLwotCi0gICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBDRFBfSEVBREVSX0xFTikpCi0gICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLQlwcmludGYoIkNEUHYldSwgdHRsOiAldXMiLCAqdHB0ciwgKih0cHRyKzEpKTsKLSAgICAgICAgaWYgKHZmbGFnKQotICAgICAgICAgICAgICAgIHByaW50ZigiLCBjaGVja3N1bTogJXUgKHVudmVyaWZpZWQpLCBsZW5ndGggJXUiLCBFWFRSQUNUXzE2QklUUyh0cHRyKSwgbGVuZ3RoKTsKLQl0cHRyICs9IENEUF9IRUFERVJfTEVOOwotCi0Jd2hpbGUgKHRwdHIgPCAocHB0citsZW5ndGgpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgNCkpIC8qIHJlYWQgb3V0IFR5cGUgYW5kIExlbmd0aCAqLwotICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotCQl0eXBlID0gRVhUUkFDVF8xNkJJVFModHB0cik7Ci0JCWxlbiAgPSBFWFRSQUNUXzE2QklUUyh0cHRyKzIpOyAvKiBvYmplY3QgbGVuZ3RoIGluY2x1ZGVzIHRoZSA0IGJ5dGVzIGhlYWRlciBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICB0cHRyICs9IDQ7Ci0gICAgICAgICAgICAgICAgbGVuIC09IDQ7Ci0KLQkJaWYgKCFUVEVTVDIoKnRwdHIsIGxlbikpCi0JCQlnb3RvIHRydW5jOwotCi0gICAgICAgICAgICAgICAgaWYgKHZmbGFnIHx8IHR5cGUgPT0gMSkgeyAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgcHJpbnQgRGV2aWNlLUlEICovCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0JXMgKDB4JTAyeCksIGxlbmd0aDogJXUgYnl0ZSVzOiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2RwX3Rsdl92YWx1ZXMsInVua25vd24gZmllbGQgdHlwZSIsIHR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbj4xID8gInMiIDogIiIpOyAvKiBwbHVyYWwgKi8KLQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDE6IC8qIERldmljZS1JRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZmxhZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgRGV2aWNlLUlEICclLipzJyIsIGxlbiwgdHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCInJS4qcyciLCBsZW4sIHRwdHIpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwMjogLyogQWRkcmVzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNkcF9wcmludF9hZGRyKHRwdHIsIGxlbikgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAzOiAvKiBQb3J0LUlEICovCi0JCQlwcmludGYoIiclLipzJyIsIGxlbiwgdHB0cik7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA0OiAvKiBDYXBhYmlsaXRpZXMgKi8KLQkJCXByaW50ZigiKDB4JTA4eCk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGNkcF9jYXBhYmlsaXR5X3ZhbHVlcywgIm5vbmUiLEVYVFJBQ1RfMzJCSVRTKHRwdHIpKSk7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA1OiAvKiBWZXJzaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsZW47aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9ICoodHB0citpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRjaGFyKGopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDB4MGEpIC8qIGxldHMgcmV3b3JrIHRoZSB2ZXJzaW9uIHN0cmluZyB0byBnZXQgYSBuaWNlIGlkZW50YXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcdCAgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA2OiAvKiBQbGF0Zm9ybSAqLwotCQkJcHJpbnRmKCInJS4qcyciLCBsZW4sIHRwdHIpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNzogLyogUHJlZml4ZXMgKi8KLQkJCWlmIChjZHBfcHJpbnRfcHJlZml4ZXModHB0ciwgbGVuKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDg6IC8qIFByb3RvY29sIEhlbGxvIE9wdGlvbiAtIG5vdCBkb2N1bWVudGVkICovCi0JCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDA5OiAvKiBWVFAgTWdtdCBEb21haW4gIC0gbm90IGRvY3VtZW50ZWQgKi8KLQkJCXByaW50ZigiJyUuKnMnIiwgbGVuLHRwdHIpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwYTogLyogTmF0aXZlIFZMQU4gSUQgLSBub3QgZG9jdW1lbnRlZCAqLwotCQkJcHJpbnRmKCIlZCIsRVhUUkFDVF8xNkJJVFModHB0cikpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwYjogLyogRHVwbGV4IC0gbm90IGRvY3VtZW50ZWQgKi8KLQkJCXByaW50ZigiJXMiLCAqKHRwdHIpID8gImZ1bGwiOiAiaGFsZiIpOwotCQkJYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogaHR0cDovL3d3dy5jaXNjby5jb20vdW5pdmVyY2QvY2MvdGQvZG9jL3Byb2R1Y3Qvdm9pY2UvYXRhL2F0YXJuLzE4NnJuMjFtLmh0bQotICAgICAgICAgICAgICAgICAgICAgKiBwbHVzIG1vcmUgZGV0YWlscyBmcm9tIG90aGVyIHNvdXJjZXMKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwZTogLyogQVRBLTE4NiBWb0lQIFZMQU4gcmVxdWVzdCAtIGluY29tcGxldGUgZG9jLiAqLwotCQkJcHJpbnRmKCJhcHAgJWQsIHZsYW4gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodHB0ciksIEVYVFJBQ1RfMTZCSVRTKHRwdHIrMSkpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxMDogLyogQVRBLTE4NiBWb0lQIFZMQU4gYXNzaWdubWVudCAtIGluY29tcGxldGUgZG9jLiAqLwotCQkJcHJpbnRmKCIlMS4yZlciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkcF9nZXRfbnVtYmVyKHRwdHIsIGxlbikvMTAwMC4wICk7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDExOiAvKiBNVFUgLSBub3QgZG9jdW1lbnRlZCAqLwotCQkJcHJpbnRmKCIldSBieXRlcyIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTI6IC8qIEFWVklEIHRydXN0IGJpdG1hcCAtIG5vdCBkb2N1bWVudGVkICovCi0JCQlwcmludGYoIjB4JTAyeCIsICoodHB0cikgKTsKLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTM6IC8qIEFWVklEIHVudHJ1c3RlZCBwb3J0IENvUyAtIG5vdCBkb2N1bWVudGVkICovCi0JCQlwcmludGYoIjB4JTAyeCIsICoodHB0cikpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNDogLyogU3lzdGVtIE5hbWUgLSBub3QgZG9jdW1lbnRlZCAqLwotCQkJcHJpbnRmKCInJS4qcyciLCBsZW4sIHRwdHIpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxNjogLyogU3lzdGVtIE9iamVjdCBJRCAtIG5vdCBkb2N1bWVudGVkICovCi0JCQlpZiAoY2RwX3ByaW50X2FkZHIodHB0ciwgbGVuKSA8IDApCi0JCQkJZ290byB0cnVuYzsKLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTc6IC8qIFBoeXNpY2FsIExvY2F0aW9uIC0gbm90IGRvY3VtZW50ZWQgKi8KLQkJCXByaW50ZigiMHglMDJ4LyUuKnMiLCAqKHRwdHIpLCBsZW4gLSAxLCB0cHRyICsgMSApOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgIixsZW4pOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCS8qIGF2b2lkIGluZmluaXRlIGxvb3AgKi8KLQkJaWYgKGxlbiA9PSAwKQotCQkJYnJlYWs7Ci0JCXRwdHIgPSB0cHRyK2xlbjsKLQl9Ci0gICAgICAgIGlmICh2ZmxhZyA8IDEpCi0gICAgICAgICAgICBwcmludGYoIiwgbGVuZ3RoICV1IixjYXBsZW4pOwotCi0JcmV0dXJuOwotdHJ1bmM6Ci0JcHJpbnRmKCJbfGNkcF0iKTsKLX0KLQotLyoKLSAqIFByb3RvY29sIHR5cGUgdmFsdWVzLgotICoKLSAqIFBUX05MUElEIG1lYW5zIHRoYXQgdGhlIHByb3RvY29sIHR5cGUgZmllbGQgY29udGFpbnMgYW4gT1NJIE5MUElELgotICoKLSAqIFBUX0lFRUVfODAyXzIgbWVhbnMgdGhhdCB0aGUgcHJvdG9jb2wgdHlwZSBmaWVsZCBjb250YWlucyBhbiBJRUVFIDgwMi4yCi0gKiBMTEMgaGVhZGVyIHRoYXQgc3BlY2lmaWVzIHRoYXQgdGhlIHBheWxvYWQgaXMgZm9yIHRoYXQgcHJvdG9jb2wuCi0gKi8KLSNkZWZpbmUgUFRfTkxQSUQJCTEJLyogT1NJIE5MUElEICovCi0jZGVmaW5lIFBUX0lFRUVfODAyXzIJCTIJLyogSUVFRSA4MDIuMiBMTEMgaGVhZGVyICovCi0KLXN0YXRpYyBpbnQKLWNkcF9wcmludF9hZGRyKGNvbnN0IHVfY2hhciAqIHAsIGludCBsKQotewotCWludCBwdCwgcGwsIGFsLCBudW07Ci0JY29uc3QgdV9jaGFyICplbmRwID0gcCArIGw7Ci0jaWZkZWYgSU5FVDYKLQlzdGF0aWMgdV9jaGFyIHByb3RfaXB2NltdID0gewotCQkweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDg2LCAweGRkCi0JfTsKLSNlbmRpZgotCi0JVENIRUNLMigqcCwgMik7Ci0JbnVtID0gRVhUUkFDVF8zMkJJVFMocCk7Ci0JcCArPSA0OwotCi0Jd2hpbGUgKHAgPCBlbmRwICYmIG51bSA+PSAwKSB7Ci0JCVRDSEVDSzIoKnAsIDIpOwotCQlpZiAocCArIDIgPiBlbmRwKQotCQkJZ290byB0cnVuYzsKLQkJcHQgPSBwWzBdOwkJLyogdHlwZSBvZiAicHJvdG9jb2wiIGZpZWxkICovCi0JCXBsID0gcFsxXTsJCS8qIGxlbmd0aCBvZiAicHJvdG9jb2wiIGZpZWxkICovCi0JCXAgKz0gMjsKLQotCQlUQ0hFQ0syKHBbcGxdLCAyKTsKLQkJaWYgKHAgKyBwbCArIDIgPiBlbmRwKQotCQkJZ290byB0cnVuYzsKLQkJYWwgPSBFWFRSQUNUXzE2QklUUygmcFtwbF0pOwkvKiBhZGRyZXNzIGxlbmd0aCAqLwotCi0JCWlmIChwdCA9PSBQVF9OTFBJRCAmJiBwbCA9PSAxICYmICpwID09IE5MUElEX0lQICYmIGFsID09IDQpIHsKLQkJCS8qCi0JCQkgKiBJUHY0OiBwcm90b2NvbCB0eXBlID0gTkxQSUQsIHByb3RvY29sIGxlbmd0aCA9IDEKLQkJCSAqICgxLWJ5dGUgTkxQSUQpLCBwcm90b2NvbCA9IDB4Y2MgKE5MUElEIGZvciBJUHY0KSwKLQkJCSAqIGFkZHJlc3MgbGVuZ3RoID0gNAotCQkJICovCi0JCQlwICs9IDM7Ci0KLQkJCVRDSEVDSzIoKnAsIDQpOwotCQkJaWYgKHAgKyA0ID4gZW5kcCkKLQkJCQlnb3RvIHRydW5jOwotCQkJcHJpbnRmKCJJUHY0ICgldSkgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHApKTsKLQkJCXAgKz0gNDsKLQkJfQotI2lmZGVmIElORVQ2Ci0JCWVsc2UgaWYgKHB0ID09IFBUX0lFRUVfODAyXzIgJiYgcGwgPT0gOCAmJgotCQkgICAgbWVtY21wKHAsIHByb3RfaXB2NiwgOCkgPT0gMCAmJiBhbCA9PSAxNikgewotCQkJLyoKLQkJCSAqIElQdjY6IHByb3RvY29sIHR5cGUgPSBJRUVFIDgwMi4yIGhlYWRlciwKLQkJCSAqIHByb3RvY29sIGxlbmd0aCA9IDggKHNpemUgb2YgTExDK1NOQVAgaGVhZGVyKSwKLQkJCSAqIHByb3RvY29sID0gTExDK1NOQVAgaGVhZGVyIHdpdGggdGhlIElQdjYKLQkJCSAqIEV0aGVydHlwZSwgYWRkcmVzcyBsZW5ndGggPSAxNgotCQkJICovCi0JCQlwICs9IDEwOwotCQkJVENIRUNLMigqcCwgYWwpOwotCQkJaWYgKHAgKyBhbCA+IGVuZHApCi0JCQkJZ290byB0cnVuYzsKLQotCQkJcHJpbnRmKCJJUHY2ICgldSkgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhwKSk7Ci0JCQlwICs9IGFsOwotCQl9Ci0jZW5kaWYKLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogR2VuZXJpYyBjYXNlOiBqdXN0IHByaW50IHJhdyBkYXRhCi0JCQkgKi8KLQkJCVRDSEVDSzIoKnAsIHBsKTsKLQkJCWlmIChwICsgcGwgPiBlbmRwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCQlwcmludGYoInB0PTB4JTAyeCwgcGw9JWQsIHBiPSIsICoocCAtIDIpLCBwbCk7Ci0JCQl3aGlsZSAocGwtLSA+IDApCi0JCQkJcHJpbnRmKCIgJTAyeCIsICpwKyspOwotCQkJVENIRUNLMigqcCwgMik7Ci0JCQlpZiAocCArIDIgPiBlbmRwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCQlhbCA9ICgqcCA8PCA4KSArICoocCArIDEpOwotCQkJcHJpbnRmKCIsIGFsPSVkLCBhPSIsIGFsKTsKLQkJCXAgKz0gMjsKLQkJCVRDSEVDSzIoKnAsIGFsKTsKLQkJCWlmIChwICsgYWwgPiBlbmRwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCQl3aGlsZSAoYWwtLSA+IDApCi0JCQkJcHJpbnRmKCIgJTAyeCIsICpwKyspOwotCQl9Ci0JCW51bS0tOwotCQlpZiAobnVtKQotCQkJcHJpbnRmKCIgIik7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLXRydW5jOgotCXJldHVybiAtMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1jZHBfcHJpbnRfcHJlZml4ZXMoY29uc3QgdV9jaGFyICogcCwgaW50IGwpCi17Ci0JaWYgKGwgJSA1KQotCQlnb3RvIHRydW5jOwotCi0JcHJpbnRmKCIgSVB2NCBQcmVmaXhlcyAoJWQpOiIsIGwgLyA1KTsKLQotCXdoaWxlIChsID4gMCkgewotCQlwcmludGYoIiAldS4ldS4ldS4ldS8ldSIsIHBbMF0sIHBbMV0sIHBbMl0sIHBbM10sIHBbNF0pOwotCQlsIC09IDU7Ci0JCXAgKz0gNTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotdHJ1bmM6Ci0JcmV0dXJuIC0xOwotfQotCi0vKiByZWFkIGluIGEgPG4+LWJ5dGUgbnVtYmVyLCBNU0IgZmlyc3QKLSAqIChvZiBjb3Vyc2UgdGhpcyBjYW4gaGFuZGxlIG1heCBzaXplb2YobG9uZykpCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNkcF9nZXRfbnVtYmVyKGNvbnN0IHVfY2hhciAqIHAsIGludCBsKQotewotICAgIHVuc2lnbmVkIGxvbmcgcmVzPTA7Ci0gICAgd2hpbGUoIGw+MCApCi0gICAgewotCXJlcyA9IChyZXM8PDgpICsgKnA7Ci0JcCsrOyBsLS07Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS9wcmludC1jaGRsYy5jIGIvcHJpbnQtY2hkbGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2NTRmNS4uMDAwMDAwMAotLS0gYS9wcmludC1jaGRsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1jaGRsYy5jLHYgMS4zMi4yLjExIDIwMDUvMTEvMjkgMDg6NTc6MTAgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotI2luY2x1ZGUgInBwcC5oIgotI2luY2x1ZGUgImNoZGxjLmgiCi0KLXN0YXRpYyB2b2lkIGNoZGxjX3NsYXJwX3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci0KLWNvbnN0IHN0cnVjdCB0b2sgY2hkbGNfY2FzdF92YWx1ZXNbXSA9IHsgCi0gICAgeyBDSERMQ19VTklDQVNULCAidW5pY2FzdCIgfSwKLSAgICB7IENIRExDX0JDQVNULCAiYmNhc3QiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotCi0vKiBTdGFuZGFyZCBDSERMQyBwcmludGVyICovCi11X2ludAotY2hkbGNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQotCWlmIChjYXBsZW4gPCBDSERMQ19IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfGNoZGxjXSIpOwotCQlyZXR1cm4gKGNhcGxlbik7Ci0JfQotICAgICAgICByZXR1cm4gKGNoZGxjX3ByaW50KHAsbGVuZ3RoKSk7Ci19Ci0KLXVfaW50Ci1jaGRsY19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkgewotCXVfaW50IHByb3RvOwotCi0JcHJvdG8gPSBFWFRSQUNUXzE2QklUUygmcFsyXSk7Ci0JaWYgKGVmbGFnKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcywgZXRoZXJ0eXBlICVzICgweCUwNHgpLCBsZW5ndGggJXU6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2hkbGNfY2FzdF92YWx1ZXMsICIweCUwMngiLCBwWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCAiVW5rbm93biIsIHByb3RvKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0JfQotCi0JbGVuZ3RoIC09IENIRExDX0hEUkxFTjsKLQlwICs9IENIRExDX0hEUkxFTjsKLQotCXN3aXRjaCAocHJvdG8pIHsKLQljYXNlIEVUSEVSVFlQRV9JUDoKLQkJaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIEVUSEVSVFlQRV9JUFY2OgotCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIENIRExDX1RZUEVfU0xBUlA6Ci0JCWNoZGxjX3NsYXJwX3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotI2lmIDAKLQljYXNlIENIRExDX1RZUEVfQ0RQOgotCQljaGRsY19jZHBfcHJpbnQocCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgY2FzZSBFVEhFUlRZUEVfTVBMUzoKLSAgICAgICAgY2FzZSBFVEhFUlRZUEVfTVBMU19NVUxUSToKLSAgICAgICAgICAgICAgICBtcGxzX3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIEVUSEVSVFlQRV9JU086Ci0gICAgICAgICAgICAgICAgLyogaXMgdGhlIGZ1ZGdlIGJ5dGUgc2V0ID8gbGV0cyB2ZXJpZnkgYnkgc3BvdHRpbmcgSVNPIGhlYWRlcnMgKi8KLSAgICAgICAgICAgICAgICBpZiAoKihwKzEpID09IDB4ODEgfHwKLSAgICAgICAgICAgICAgICAgICAgKihwKzEpID09IDB4ODIgfHwKLSAgICAgICAgICAgICAgICAgICAgKihwKzEpID09IDB4ODMpCi0gICAgICAgICAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCsxLCBsZW5ndGgtMSwgbGVuZ3RoLTEpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaXNvY2xuc19wcmludChwLCBsZW5ndGgsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoIWVmbGFnKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJ1bmtub3duIENIRExDIHByb3RvY29sICgweCUwNHgpIiwgcHJvdG8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCX0KLQotCXJldHVybiAoQ0hETENfSERSTEVOKTsKLX0KLQotLyoKLSAqIFRoZSBmaXhlZC1sZW5ndGggcG9ydGlvbiBvZiBhIFNMQVJQIHBhY2tldC4KLSAqLwotc3RydWN0IGNpc2NvX3NsYXJwIHsKLQl1X2ludDhfdCBjb2RlWzRdOwotI2RlZmluZSBTTEFSUF9SRVFVRVNUCTAKLSNkZWZpbmUgU0xBUlBfUkVQTFkJMQotI2RlZmluZSBTTEFSUF9LRUVQQUxJVkUJMgotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXVfaW50OF90IGFkZHJbNF07Ci0JCQl1X2ludDhfdCBtYXNrWzRdOwotCQl9IGFkZHI7Ci0JCXN0cnVjdCB7Ci0JCQl1X2ludDhfdCBteXNlcVs0XTsKLQkJCXVfaW50OF90IHlvdXJzZXFbNF07Ci0JCQl1X2ludDhfdCByZWxbMl07Ci0JCX0ga2VlcDsKLQl9IHVuOwotfTsKLQotI2RlZmluZSBTTEFSUF9NSU5fTEVOCTE0Ci0jZGVmaW5lIFNMQVJQX01BWF9MRU4JMTgKLQotc3RhdGljIHZvaWQKLWNoZGxjX3NsYXJwX3ByaW50KGNvbnN0IHVfY2hhciAqY3AsIHVfaW50IGxlbmd0aCkKLXsKLQljb25zdCBzdHJ1Y3QgY2lzY29fc2xhcnAgKnNsYXJwOwotICAgICAgICB1X2ludCBzZWMsbWluLGhycyxkYXlzOwotCi0gICAgICAgIHByaW50ZigiU0xBUlAgKGxlbmd0aDogJXUpLCAiLGxlbmd0aCk7Ci0JaWYgKGxlbmd0aCA8IFNMQVJQX01JTl9MRU4pCi0JCWdvdG8gdHJ1bmM7Ci0KLQlzbGFycCA9IChjb25zdCBzdHJ1Y3QgY2lzY29fc2xhcnAgKiljcDsKLQlUQ0hFQ0syKCpzbGFycCwgU0xBUlBfTUlOX0xFTik7Ci0Jc3dpdGNoIChFWFRSQUNUXzMyQklUUygmc2xhcnAtPmNvZGUpKSB7Ci0JY2FzZSBTTEFSUF9SRVFVRVNUOgotCQlwcmludGYoInJlcXVlc3QiKTsKLQkJLyoKLQkJICogQXQgbGVhc3QgYWNjb3JkaW5nIHRvIFdpbGxpYW0gIkNob3BzIiBXZXN0ZmllbGQncwotCQkgKiBtZXNzYWdlIGluCi0JCSAqCi0JCSAqCWh0dHA6Ly93d3cubmV0aGVscC5uby9uZXQvY2lzY28taGRsYy50eHQKLQkJICoKLQkJICogdGhlIGFkZHJlc3MgYW5kIG1hc2sgYXJlbid0IHVzZWQgaW4gcmVxdWVzdHMgLQotCQkgKiB0aGV5J3JlIGp1c3QgemVyby4KLQkJICovCi0JCWJyZWFrOwotCWNhc2UgU0xBUlBfUkVQTFk6Ci0JCXByaW50ZigicmVwbHkgJXMvJXMiLAotCQkJaXBhZGRyX3N0cmluZygmc2xhcnAtPnVuLmFkZHIuYWRkciksCi0JCQlpcGFkZHJfc3RyaW5nKCZzbGFycC0+dW4uYWRkci5tYXNrKSk7Ci0JCWJyZWFrOwotCWNhc2UgU0xBUlBfS0VFUEFMSVZFOgotCQlwcmludGYoImtlZXBhbGl2ZTogbWluZXNlZW49MHglMDh4LCB5b3Vyc2Vlbj0weCUwOHgsIHJlbGlhYmlsaXR5PTB4JTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzbGFycC0+dW4ua2VlcC5teXNlcSksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzbGFycC0+dW4ua2VlcC55b3Vyc2VxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnNsYXJwLT51bi5rZWVwLnJlbCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA+PSBTTEFSUF9NQVhfTEVOKSB7IC8qIHVwdGltZS1zdGFtcCBpcyBvcHRpb25hbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgY3AgKz0gU0xBUlBfTUlOX0xFTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCpjcCwgNCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWMgPSBFWFRSQUNUXzMyQklUUyhjcCkgLyAxMDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gc2VjIC8gNjA7IHNlYyAtPSBtaW4gKiA2MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhycyA9IG1pbiAvIDYwOyBtaW4gLT0gaHJzICogNjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXlzID0gaHJzIC8gMjQ7IGhycyAtPSBkYXlzICogMjQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgbGluayB1cHRpbWU9JXVkJXVoJXVtJXVzIixkYXlzLGhycyxtaW4sc2VjKTsKLSAgICAgICAgICAgICAgICB9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiMHglMDJ4IHVua25vd24iLCBFWFRSQUNUXzMyQklUUygmc2xhcnAtPmNvZGUpKTsKLSAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGNwKzQsIlxuXHQiLGxlbmd0aC00KTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKFNMQVJQX01BWF9MRU4gPCBsZW5ndGggJiYgdmZsYWcpCi0JCXByaW50ZigiLCAodHJhaWxpbmcganVuazogJWQgYnl0ZXMpIiwgbGVuZ3RoIC0gU0xBUlBfTUFYX0xFTik7Ci0gICAgICAgIGlmICh2ZmxhZyA+IDEpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoY3ArNCwiXG5cdCIsbGVuZ3RoLTQpOwotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfHNsYXJwXSIpOwotfQotCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1jaXAuYyBiL3ByaW50LWNpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzRiNzAwLi4wMDAwMDAwCi0tLSBhL3ByaW50LWNpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qCi0gKiBNYXJrbyBLaWlza2lsYSBjYXJuaWxAY3MudHV0LmZpCi0gKgotICogVGFtcGVyZSBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kgLSBUZWxlY29tbXVuaWNhdGlvbnMgTGFib3JhdG9yeQotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcwotICogc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLAotICogcHJvdmlkZWQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzCi0gKiBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsCi0gKiBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCi0gKiB0aGVyZW9mLCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzCi0gKiBhY2tub3dsZWRnZWQgaW4gYW55IHB1YmxpY2F0aW9ucyByZXN1bHRpbmcgZnJvbSB1c2luZwotICogdGhlIHNvZnR3YXJlLgotICoKLSAqIFRVVCBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIgotICogQ09ORElUSU9OIEFORCBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBPRiBBTlkgS0lORCBGT1IKLSAqIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtY2lwLmMsdiAxLjI1LjIuMSAyMDA1LzA3LzA3IDAxOjI0OjM0IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAiZXRoZXIuaCIKLQotI2RlZmluZSBSRkMxNDgzTExDX0xFTgk4Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHJmY2xsY1tdID0gewotCTB4YWEsCS8qIERTQVA6IG5vbi1JU08gKi8KLQkweGFhLAkvKiBTU0FQOiBub24tSVNPICovCi0JMHgwMywJLyogQ3RybDogVW5udW1iZXJlZCBJbmZvcm1hdGlvbiBDb21tYW5kIFBEVSAqLwotCTB4MDAsCS8qIE9VSTogRXRoZXJUeXBlICovCi0JMHgwMCwKLQkweDAwIH07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2lwX3ByaW50KGludCBsZW5ndGgpCi17Ci0JLyoKLQkgKiBUaGVyZSBpcyBubyBNQUMtbGF5ZXIgaGVhZGVyLCBzbyBqdXN0IHByaW50IHRoZSBsZW5ndGguCi0JICovCi0JcHJpbnRmKCIlZDogIiwgbGVuZ3RoKTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHRvcCBsZXZlbCByb3V0aW5lIG9mIHRoZSBwcmludGVyLiAgJ3AnIHBvaW50cwotICogdG8gdGhlIExMQy9TTkFQIG9yIHJhdyBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotY2lwX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQotewotCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQl1X2ludCBsZW5ndGggPSBoLT5sZW47Ci0JdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJ0eXBlOwotCi0JaWYgKG1lbWNtcChyZmNsbGMsIHAsIHNpemVvZihyZmNsbGMpKT09MCAmJiBjYXBsZW4gPCBSRkMxNDgzTExDX0xFTikgewotCQlwcmludGYoIlt8Y2lwXSIpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCWlmIChlZmxhZykKLQkJY2lwX3ByaW50KGxlbmd0aCk7Ci0KLQlpZiAobWVtY21wKHJmY2xsYywgcCwgc2l6ZW9mKHJmY2xsYykpID09IDApIHsKLQkJLyoKLQkJICogTExDIGhlYWRlciBpcyBwcmVzZW50LiAgVHJ5IHRvIHByaW50IGl0ICYgaGlnaGVyIGxheWVycy4KLQkJICovCi0JCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIE5VTEwsIE5VTEwsCi0JCSAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkgPT0gMCkgewotCQkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KLQkJCWlmICghZWZsYWcpCi0JCQkJY2lwX3ByaW50KGxlbmd0aCk7Ci0JCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgewotCQkJCXByaW50ZigiKExMQyAlcykgIiwKLQkJCSAgICAgICBldGhlcnByb3RvX3N0cmluZyhodG9ucyhleHRyYWN0ZWRfZXRoZXJ0eXBlKSkpOwotCQkJfQotCQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIExMQyBoZWFkZXIgaXMgYWJzZW50OyB0cmVhdCBpdCBhcyBqdXN0IElQLgotCQkgKi8KLQkJaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKLQl9Ci0KLQlyZXR1cm4gKDApOwotfQotCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1jbmZwLmMgYi9wcmludC1jbmZwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGZiZDQuLjAwMDAwMDAKLS0tIGEvcHJpbnQtY25mcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qCSRPcGVuQlNEOiBwcmludC1jbmZwLmMsdiAxLjIgMTk5OC8wNi8yNSAyMDoyNjo1OSBtaWNrZXkgRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OCBNaWNoYWVsIFNoYWxheWVmZgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBNaWNoYWVsIFNoYWxheWVmZi4KLSAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCi0gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCi0gKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qIENpc2NvIE5ldEZsb3cgcHJvdG9jb2wgKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtY25mcC5jLHYgMS4xNi4yLjEgMjAwNS8wNC8yMCAyMDo1MzozOSBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotI2luY2x1ZGUgInRjcC5oIgotI2luY2x1ZGUgImlwcHJvdG8uaCIKLQotc3RydWN0IG5maGRyIHsKLQl1X2ludDMyX3QJdmVyX2NudDsJLyogdmVyc2lvbiBbMTVdLCBhbmQgIyBvZiByZWNvcmRzICovCi0JdV9pbnQzMl90CW1zeXNfdXB0aW1lOwotCXVfaW50MzJfdAl1dGNfc2VjOwotCXVfaW50MzJfdAl1dGNfbnNlYzsKLQl1X2ludDMyX3QJc2VxdWVuY2U7CS8qIHY1IGZsb3cgc2VxdWVuY2UgbnVtYmVyICovCi0JdV9pbnQzMl90CXJlc2VydmVkOwkvKiB2NSBvbmx5ICovCi19OwotCi1zdHJ1Y3QgbmZyZWMgewotCXN0cnVjdCBpbl9hZGRyCXNyY19pbmE7Ci0Jc3RydWN0IGluX2FkZHIJZHN0X2luYTsKLQlzdHJ1Y3QgaW5fYWRkcgluaG9wX2luYTsKLQl1X2ludDMyX3QJaWZhY2VzOwkJLyogc3JjLGRzdCBpZmFjZXMgKi8KLQl1X2ludDMyX3QJcGFja2V0czsKLQl1X2ludDMyX3QJb2N0ZXRzOwotCXVfaW50MzJfdAlzdGFydF90aW1lOwkvKiBzeXNfdXB0aW1lIHZhbHVlICovCi0JdV9pbnQzMl90CWxhc3RfdGltZTsJLyogc3lzX3VwdGltZSB2YWx1ZSAqLwotCXVfaW50MzJfdAlwb3J0czsJCS8qIHNyYyxkc3QgcG9ydHMgKi8KLQl1X2ludDMyX3QJcHJvdG9fdG9zOwkvKiBwcm90bywgdG9zLCBwYWQsIGZsYWdzKHY1KSAqLwotCXVfaW50MzJfdAlhc3NlczsJCS8qIHYxOiBmbGFnczsgdjU6IHNyYyxkc3QgQVMgKi8KLQl1X2ludDMyX3QJbWFza3M7CQkvKiBzcmMsZHN0IGFkZHIgcHJlZml4OyB2NjogZW5jYXBzICovCi0Jc3RydWN0IGluX2FkZHIJcGVlcl9uZXh0aG9wOwkvKiB2NjogSVAgYWRkcmVzcyBvZiB0aGUgbmV4dGhvcCB3aXRoaW4gdGhlIHBlZXIgKEZJQikqLwotfTsKLQotdm9pZAotY25mcF9wcmludChjb25zdCB1X2NoYXIgKmNwLCBjb25zdCB1X2NoYXIgKmJwIF9VXykKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbmZoZHIgKm5oOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBuZnJlYyAqbnI7Ci0Jc3RydWN0IHByb3RvZW50ICpwZW50OwotCWludCBucmVjcywgdmVyOwotI2lmIDAKLQl0aW1lX3QgdDsKLSNlbmRpZgotCi0JbmggPSAoY29uc3Qgc3RydWN0IG5maGRyICopY3A7Ci0KLQlpZiAoKGNvbnN0IHVfY2hhciAqKShuaCArIDEpID4gc25hcGVuZCkKLQkJcmV0dXJuOwotCi0JbnJlY3MgPSBFWFRSQUNUXzMyQklUUygmbmgtPnZlcl9jbnQpICYgMHhmZmZmOwotCXZlciA9IChFWFRSQUNUXzMyQklUUygmbmgtPnZlcl9jbnQpICYgMHhmZmZmMDAwMCkgPj4gMTY7Ci0jaWYgMAotCS8qCi0JICogVGhpcyBpcyBzZWNvbmRzIHNpbmNlIHRoZSBVTipYIGVwb2NoLCBhbmQgaXMgZm9sbG93ZWQgYnkKLQkgKiBuYW5vc2Vjb25kcy4gIFhYWCAtIGZvcm1hdCBpdCwgcmF0aGVyIHRoYW4ganVzdCBkdW1waW5nIHRoZQotCSAqIHJhdyBzZWNvbmRzLXNpbmNlLXRoZS1FcG9jaC4KLQkgKi8KLQl0ID0gRVhUUkFDVF8zMkJJVFMoJm5oLT51dGNfc2VjKTsKLSNlbmRpZgotCi0JcHJpbnRmKCJOZXRGbG93IHYleCwgJXUuJTAzdSB1cHRpbWUsICV1LiUwOXUsICIsIHZlciwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5oLT5tc3lzX3VwdGltZSkvMTAwMCwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5oLT5tc3lzX3VwdGltZSklMTAwMCwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5oLT51dGNfc2VjKSwgRVhUUkFDVF8zMkJJVFMoJm5oLT51dGNfbnNlYykpOwotCi0JaWYgKHZlciA9PSA1IHx8IHZlciA9PSA2KSB7Ci0JCXByaW50ZigiIyV1LCAiLCBFWFRSQUNUXzMyQklUUygmbmgtPnNlcXVlbmNlKSk7Ci0JCW5yID0gKGNvbnN0IHN0cnVjdCBuZnJlYyAqKSZuaFsxXTsKLQkJc25hcGxlbiAtPSAyNDsKLQl9IGVsc2UgewotCQluciA9IChjb25zdCBzdHJ1Y3QgbmZyZWMgKikmbmgtPnNlcXVlbmNlOwotCQlzbmFwbGVuIC09IDE2OwotCX0KLQotCXByaW50ZigiJTJ1IHJlY3MiLCBucmVjcyk7Ci0KLQlmb3IgKDsgbnJlY3MtLSAmJiAoY29uc3QgdV9jaGFyICopKG5yICsgMSkgPD0gc25hcGVuZDsgbnIrKykgewotCQljaGFyIGJ1ZlsyMF07Ci0JCWNoYXIgYXNidWZbMjBdOwotCi0JCXByaW50ZigiXG4gIHN0YXJ0ZWQgJXUuJTAzdSwgbGFzdCAldS4lMDN1IiwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+c3RhcnRfdGltZSkvMTAwMCwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+c3RhcnRfdGltZSklMTAwMCwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+bGFzdF90aW1lKS8xMDAwLAotCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5yLT5sYXN0X3RpbWUpJTEwMDApOwotCi0JCWFzYnVmWzBdID0gYnVmWzBdID0gJ1wwJzsKLQkJaWYgKHZlciA9PSA1IHx8IHZlciA9PSA2KSB7Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiLyV1IiwKLQkJCQkgKEVYVFJBQ1RfMzJCSVRTKCZuci0+bWFza3MpID4+IDI0KSAmIDB4ZmYpOwotCQkJc25wcmludGYoYXNidWYsIHNpemVvZihhc2J1ZiksICI6JXUiLAotCQkJCSAoRVhUUkFDVF8zMkJJVFMoJm5yLT5hc3NlcykgPj4gMTYpICYgMHhmZmZmKTsKLQkJfQotCQlwcmludGYoIlxuICAgICVzJXMlczoldSAiLCBpbnRvYShuci0+c3JjX2luYS5zX2FkZHIpLCBidWYsIGFzYnVmLAotCQkJRVhUUkFDVF8zMkJJVFMoJm5yLT5wb3J0cykgPj4gMTYpOwotCi0JCWlmICh2ZXIgPT0gNSB8fCB2ZXIgPT02KSB7Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiLyVkIiwKLQkJCQkgKEVYVFJBQ1RfMzJCSVRTKCZuci0+bWFza3MpID4+IDE2KSAmIDB4ZmYpOwotCQkJc25wcmludGYoYXNidWYsIHNpemVvZihhc2J1ZiksICI6JXUiLAotCQkJCSBFWFRSQUNUXzMyQklUUygmbnItPmFzc2VzKSAmIDB4ZmZmZik7Ci0JCX0KLQkJcHJpbnRmKCI+ICVzJXMlczoldSAiLCBpbnRvYShuci0+ZHN0X2luYS5zX2FkZHIpLCBidWYsIGFzYnVmLAotCQkJRVhUUkFDVF8zMkJJVFMoJm5yLT5wb3J0cykgJiAweGZmZmYpOwotCi0JCXByaW50ZigiPj4gJXNcbiAgICAiLCBpbnRvYShuci0+bmhvcF9pbmEuc19hZGRyKSk7Ci0KLQkJcGVudCA9IGdldHByb3RvYnludW1iZXIoKEVYVFJBQ1RfMzJCSVRTKCZuci0+cHJvdG9fdG9zKSA+PiA4KSAmIDB4ZmYpOwotCQlpZiAoIXBlbnQgfHwgbmZsYWcpCi0JCQlwcmludGYoIiV1ICIsCi0JCQkgICAgICAgKEVYVFJBQ1RfMzJCSVRTKCZuci0+cHJvdG9fdG9zKSA+PiA4KSAmIDB4ZmYpOwotCQllbHNlCi0JCQlwcmludGYoIiVzICIsIHBlbnQtPnBfbmFtZSk7Ci0KLQkJLyogdGNwIGZsYWdzIGZvciB0Y3Agb25seSAqLwotCQlpZiAocGVudCAmJiBwZW50LT5wX3Byb3RvID09IElQUFJPVE9fVENQKSB7Ci0JCQlpbnQgZmxhZ3M7Ci0JCQlpZiAodmVyID09IDEpCi0JCQkJZmxhZ3MgPSAoRVhUUkFDVF8zMkJJVFMoJm5yLT5hc3NlcykgPj4gMjQpICYgMHhmZjsKLQkJCWVsc2UKLQkJCQlmbGFncyA9IChFWFRSQUNUXzMyQklUUygmbnItPnByb3RvX3RvcykgPj4gMTYpICYgMHhmZjsKLQkJCWlmIChmbGFncyAmIFRIX0ZJTikJcHV0Y2hhcignRicpOwotCQkJaWYgKGZsYWdzICYgVEhfU1lOKQlwdXRjaGFyKCdTJyk7Ci0JCQlpZiAoZmxhZ3MgJiBUSF9SU1QpCXB1dGNoYXIoJ1InKTsKLQkJCWlmIChmbGFncyAmIFRIX1BVU0gpCXB1dGNoYXIoJ1AnKTsKLQkJCWlmIChmbGFncyAmIFRIX0FDSykJcHV0Y2hhcignQScpOwotCQkJaWYgKGZsYWdzICYgVEhfVVJHKQlwdXRjaGFyKCdVJyk7Ci0JCQlpZiAoZmxhZ3MpCi0JCQkJcHV0Y2hhcignICcpOwotCQl9Ci0KLQkJYnVmWzBdPSdcMCc7Ci0JCWlmICh2ZXIgPT0gNikgewotCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIigldTw+JXUgZW5jYXBzKSIsCi0JCQkJIChFWFRSQUNUXzMyQklUUygmbnItPm1hc2tzKSA+PiA4KSAmIDB4ZmYsCi0JCQkJIChFWFRSQUNUXzMyQklUUygmbnItPm1hc2tzKSkgJiAweGZmKTsKLQkJfQotCQlwcmludGYoInRvcyAldSwgJXUgKCV1IG9jdGV0cykgJXMiLAotCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5yLT5wcm90b190b3MpICYgMHhmZiwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZuci0+cGFja2V0cyksCi0JCSAgICAgICBFWFRSQUNUXzMyQklUUygmbnItPm9jdGV0cyksIGJ1Zik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZGNjcC5jIGIvcHJpbnQtZGNjcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmJmY2E2Li4wMDAwMDAwCi0tLSBhL3ByaW50LWRjY3AuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gMjAwNAotICogQ29weXJpZ2h0IChDKSBJYW4gTWNEb25hbGQgMjAwNQotICogQ29weXJpZ2h0IChDKSBZb3NoaWZ1bWkgTmlzaGlkYSAyMDA1Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgYWNjb21wYW5pZXMgdGNwZHVtcCBvciB0aGUgR05VIEdQTCB2ZXJzaW9uIDIKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1kY2NwLmMsdiAxLjEuMi42IDIwMDYvMDIvMTkgMDU6MDg6NDQgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSAiZGNjcC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCi0jaW5jbHVkZSAiaXAuaCIKLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwNi5oIgotI2VuZGlmCi0jaW5jbHVkZSAiaXBwcm90by5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqZGNjcF9yZXNldF9jb2Rlc1tdID0gewotCSJ1bnNwZWNpZmllZCIsCi0JImNsb3NlZCIsCi0JImFib3J0ZWQiLAotCSJub19jb25uZWN0aW9uIiwKLQkicGFja2V0X2Vycm9yIiwKLQkib3B0aW9uX2Vycm9yIiwKLQkibWFuZGF0b3J5X2Vycm9yIiwKLQkiY29ubmVjdGlvbl9yZWZ1c2VkIiwKLQkiYmFkX3NlcnZpY2VfY29kZSIsCi0JInRvb19idXN5IiwKLQkiYmFkX2luaXRfY29va2llIiwKLQkiYWdncmVzc2lvbl9wZW5hbHR5IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpkY2NwX2ZlYXR1cmVfbnVtc1tdID0gewotCSJyZXNlcnZlZCIsIAotCSJjY2lkIiwKLQkiYWxsb3dfc2hvcnRfc2Vxbm8iLAotCSJzZXF1ZW5jZV93aW5kb3ciLAotCSJlY25faW5jYXBhYmxlIiwgCi0JImFja19yYXRpbyIsICAgICAKLQkic2VuZF9hY2tfdmVjdG9yIiwKLQkic2VuZF9uZHBfY291bnQiLCAKLQkibWluaW11bSBjaGVja3N1bSBjb3ZlcmFnZSIsIAotCSJjaGVjayBkYXRhIGNoZWNrc3VtIiwKLX07Ci0KLXN0YXRpYyBpbnQgZGNjcF9ja3N1bShjb25zdCBzdHJ1Y3QgaXAgKmlwLAotCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGgsIHVfaW50IGxlbikKLXsKLQl1bmlvbiBwaHUgewotCQlzdHJ1Y3QgcGhkciB7Ci0JCQl1X2ludDMyX3Qgc3JjOwotCQkJdV9pbnQzMl90IGRzdDsKLQkJCXVfY2hhciBtYno7Ci0JCQl1X2NoYXIgcHJvdG87Ci0JCQl1X2ludDE2X3QgbGVuOwotCQl9IHBoOwotCQl1X2ludDE2X3QgcGFbNl07Ci0JfSBwaHU7Ci0JY29uc3QgdV9pbnQxNl90ICpzcDsKLQotCS8qIHBzZXVkby1oZWFkZXIuLiAqLwotCXBodS5waC5tYnogPSAwOwotCXBodS5waC5sZW4gPSBodG9ucyhsZW4pOwotCXBodS5waC5wcm90byA9IElQUFJPVE9fRENDUDsKLQltZW1jcHkoJnBodS5waC5zcmMsICZpcC0+aXBfc3JjLnNfYWRkciwgc2l6ZW9mKHVfaW50MzJfdCkpOwotCWlmIChJUF9ITChpcCkgPT0gNSkKLQkJbWVtY3B5KCZwaHUucGguZHN0LCAmaXAtPmlwX2RzdC5zX2FkZHIsIHNpemVvZih1X2ludDMyX3QpKTsKLQllbHNlCi0JCXBodS5waC5kc3QgPSBpcF9maW5kZHN0KGlwKTsKLQotCXNwID0gJnBodS5wYVswXTsKLQlyZXR1cm4gaW5fY2tzdW0oKHVfc2hvcnQgKilkaCwgbGVuLCBzcFswXStzcFsxXStzcFsyXStzcFszXStzcFs0XStzcFs1XSk7Ci19Ci0KLSNpZmRlZiBJTkVUNgotc3RhdGljIGludCBkY2NwNl9ja3N1bShjb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2LCBjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoLCB1X2ludCBsZW4pCi17Ci0Jc2l6ZV90IGk7Ci0JY29uc3QgdV9pbnQxNl90ICpzcDsKLQl1X2ludDMyX3Qgc3VtOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpbjZfYWRkciBwaF9zcmM7Ci0JCQlzdHJ1Y3QgaW42X2FkZHIgcGhfZHN0OwotCQkJdV9pbnQzMl90ICAgcGhfbGVuOwotCQkJdV9pbnQ4X3QgICAgcGhfemVyb1szXTsKLQkJCXVfaW50OF90ICAgIHBoX254dDsKLQkJfSBwaDsKLQkJdV9pbnQxNl90IHBhWzIwXTsKLQl9IHBodTsKLQotCS8qIHBzZXVkby1oZWFkZXIgKi8KLQltZW1zZXQoJnBodSwgMCwgc2l6ZW9mKHBodSkpOwotCXBodS5waC5waF9zcmMgPSBpcDYtPmlwNl9zcmM7Ci0JcGh1LnBoLnBoX2RzdCA9IGlwNi0+aXA2X2RzdDsKLQlwaHUucGgucGhfbGVuID0gaHRvbmwobGVuKTsKLQlwaHUucGgucGhfbnh0ID0gSVBQUk9UT19EQ0NQOwotCi0Jc3VtID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBodS5wYSkgLyBzaXplb2YocGh1LnBhWzBdKTsgaSsrKQotCQlzdW0gKz0gcGh1LnBhW2ldOwotCi0Jc3AgPSAoY29uc3QgdV9pbnQxNl90ICopZGg7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIH4xKTsgaSArPSAyKQotCQlzdW0gKz0gKnNwKys7Ci0KLQlpZiAobGVuICYgMSkKLQkJc3VtICs9IGh0b25zKCgqKGNvbnN0IHVfaW50OF90ICopc3ApIDw8IDgpOwotCi0Jd2hpbGUgKHN1bSA+IDB4ZmZmZikKLQkJc3VtID0gKHN1bSAmIDB4ZmZmZikgKyAoc3VtID4+IDE2KTsKLQlzdW0gPSB+c3VtICYgMHhmZmZmOwotCi0JcmV0dXJuIChzdW0pOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBjaGFyICpkY2NwX3Jlc2V0X2NvZGUodV9pbnQ4X3QgY29kZSkKLXsKLQlpZiAoY29kZSA+PSBfX0RDQ1BfUkVTRVRfQ09ERV9MQVNUKQotCQlyZXR1cm4gImludmFsaWQiOwotCXJldHVybiBkY2NwX3Jlc2V0X2NvZGVzW2NvZGVdOwotfQotCi1zdGF0aWMgdV9pbnQ2NF90IGRjY3Bfc2Vxbm8oY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCkKLXsKLQl1X2ludDMyX3Qgc2VxX2hpZ2ggPSBEQ0NQSF9TRVEoZGgpOwotCXVfaW50NjRfdCBzZXFubyA9IEVYVFJBQ1RfMjRCSVRTKCZzZXFfaGlnaCkgJiAweEZGRkZGRjsKLQotCWlmIChEQ0NQSF9YKGRoKSAhPSAwKSB7Ci0JCWNvbnN0IHN0cnVjdCBkY2NwX2hkcl9leHQgKmRoeCA9ICh2b2lkICopKGRoICsgMSk7Ci0JCXVfaW50MzJfdCBzZXFfbG93ID0gZGh4LT5kY2NwaF9zZXFfbG93OwotCQlzZXFubyAmPSAweDAwRkZGRjsgIC8qIGNsZWFyIHJlc2VydmVkIGZpZWxkICovCi0JCXNlcW5vID0gKHNlcW5vIDw8IDMyKSArIEVYVFJBQ1RfMzJCSVRTKCZzZXFfbG93KTsKLQl9Ci0KLQlyZXR1cm4gc2Vxbm87Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRjY3BfYmFzaWNfaGRyX2xlbihjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoKQotewotCXJldHVybiBzaXplb2YoKmRoKSArIChEQ0NQSF9YKGRoKSA/IHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfZXh0KSA6IDApOwotfQotCi1zdGF0aWMgdm9pZCBkY2NwX3ByaW50X2Fja19ubyhjb25zdCB1X2NoYXIgKmJwKQotewotCWNvbnN0IHN0cnVjdCBkY2NwX2hkciAqZGggPSAoY29uc3Qgc3RydWN0IGRjY3BfaGRyICopYnA7Ci0JY29uc3Qgc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzICpkaF9hY2sgPQotCQkoc3RydWN0IGRjY3BfaGRyX2Fja19iaXRzICopKGJwICsgZGNjcF9iYXNpY19oZHJfbGVuKGRoKSk7Ci0JdV9pbnQzMl90IGFja19oaWdoOwotCXVfaW50NjRfdCBhY2tubzsKLQotCVRDSEVDSzIoKmRoX2Fjayw0KTsKLQlhY2tfaGlnaCA9IERDQ1BIX0FDSyhkaF9hY2spOwotCWFja25vID0gRVhUUkFDVF8yNEJJVFMoJmFja19oaWdoKSAmIDB4RkZGRkZGOwotCi0JaWYgKERDQ1BIX1goZGgpICE9IDApIHsKLQkJdV9pbnQzMl90IGFja19sb3c7Ci0KLQkJVENIRUNLMigqZGhfYWNrLDgpOwotCQlhY2tfbG93ID0gZGhfYWNrLT5kY2NwaF9hY2tfbnJfbG93OwotCi0JCWFja25vICY9IDB4MDBGRkZGOyAgLyogY2xlYXIgcmVzZXJ2ZWQgZmllbGQgKi8KLQkJYWNrbm8gPSAoYWNrbm8gPDwgMzIpICsgRVhUUkFDVF8zMkJJVFMoJmFja19sb3cpOwotCX0KLQotCSh2b2lkKXByaW50ZigiKGFjaz0lIiBQUkl1NjQgIikgIiwgYWNrbm8pOwotdHJ1bmM6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkY2NwX3BhY2tldF9oZHJfbGVuKGNvbnN0IHVfaW50OF90IHR5cGUpCi17Ci0JaWYgKHR5cGUgPT0gRENDUF9QS1RfREFUQSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHR5cGUgPT0gRENDUF9QS1RfREFUQUFDSwl8fAotCSAgICB0eXBlID09IERDQ1BfUEtUX0FDSwl8fAotCSAgICB0eXBlID09IERDQ1BfUEtUX1NZTkMJfHwKLQkgICAgdHlwZSA9PSBEQ0NQX1BLVF9TWU5DQUNLCXx8Ci0JICAgIHR5cGUgPT0gRENDUF9QS1RfQ0xPU0UJfHwKLQkgICAgdHlwZSA9PSBEQ0NQX1BLVF9DTE9TRVJFUSkKLQkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfYWNrX2JpdHMpOwotCWlmICh0eXBlID09IERDQ1BfUEtUX1JFUVVFU1QpCi0JCXJldHVybiBzaXplb2Yoc3RydWN0IGRjY3BfaGRyX3JlcXVlc3QpOwotCWlmICh0eXBlID09IERDQ1BfUEtUX1JFU1BPTlNFKQotCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSk7Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQpOwotfQotCi1zdGF0aWMgaW50IGRjY3BfcHJpbnRfb3B0aW9uKGNvbnN0IHVfY2hhciAqb3B0aW9uKTsKLQotLyoqCi0gKiBkY2NwX3ByaW50IC0gc2hvdyBkY2NwIHBhY2tldAotICogQGJwIC0gYmVnaW5uaW5nIG9mIGRjY3AgcGFja2V0Ci0gKiBAZGF0YTIgLSBiZWdpbm5pbmcgb2YgZW5jbG9zaW5nIAotICogQGxlbiAtIGxlbmdodCBvZiBpcCBwYWNrZXQKLSAqLwotdm9pZCBkY2NwX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IHVfY2hhciAqZGF0YTIsIHVfaW50IGxlbikKLXsKLQljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoOwotCWNvbnN0IHN0cnVjdCBpcCAqaXA7Ci0jaWZkZWYgSU5FVDYKLQljb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2OwotI2VuZGlmCi0JY29uc3QgdV9jaGFyICpjcDsKLQl1X3Nob3J0IHNwb3J0LCBkcG9ydDsKLQl1X2ludCBobGVuOwotCXVfaW50IGV4dGxlbiA9IDA7Ci0KLQlkaCA9IChjb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKilicDsKLQotCWlwID0gKHN0cnVjdCBpcCAqKWRhdGEyOwotI2lmZGVmIElORVQ2Ci0JaWYgKElQX1YoaXApID09IDYpCi0JCWlwNiA9IChjb25zdCBzdHJ1Y3QgaXA2X2hkciAqKWRhdGEyOwotCWVsc2UKLQkJaXA2ID0gTlVMTDsKLSNlbmRpZiAvKklORVQ2Ki8KLQljcCA9IChjb25zdCB1X2NoYXIgKikoZGggKyAxKTsKLQlpZiAoY3AgPiBzbmFwZW5kKSB7Ci0JCXByaW50ZigiW0ludmFsaWQgcGFja2V0fGRjY3BdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCBkY2NwX2hkcikpIHsKLQkJcHJpbnRmKCJ0cnVuY2F0ZWQtZGNjcCAtICVsZCBieXRlcyBtaXNzaW5nISIsCi0JCQkgICAgIChsb25nKWxlbiAtIHNpemVvZihzdHJ1Y3QgZGNjcF9oZHIpKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwb3J0ID0gRVhUUkFDVF8xNkJJVFMoJmRoLT5kY2NwaF9zcG9ydCk7Ci0JZHBvcnQgPSBFWFRSQUNUXzE2QklUUygmZGgtPmRjY3BoX2Rwb3J0KTsKLQlobGVuID0gZGgtPmRjY3BoX2RvZmYgKiA0OwotCi0jaWZkZWYgSU5FVDYKLQlpZiAoaXA2KSB7Ci0JCSh2b2lkKXByaW50ZigiJXMuJWQgPiAlcy4lZDogIiwKLQkJCSAgICAgaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksIHNwb3J0LAotCQkJICAgICBpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSwgZHBvcnQpOwotCX0gZWxzZQotI2VuZGlmIC8qSU5FVDYqLwotCXsKLQkJKHZvaWQpcHJpbnRmKCIlcy4lZCA+ICVzLiVkOiAiLAotCQkJICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwgc3BvcnQsCi0JCQkgICAgIGlwYWRkcl9zdHJpbmcoJmlwLT5pcF9kc3QpLCBkcG9ydCk7Ci0JfQotCWZmbHVzaChzdGRvdXQpOwotCi0JaWYgKHFmbGFnKSB7Ci0JCSh2b2lkKXByaW50ZigiICVkIiwgbGVuIC0gaGxlbik7Ci0JCWlmIChobGVuID4gbGVuKSB7Ci0JCQkodm9pZClwcmludGYoImRjY3AgW2JhZCBoZHIgbGVuZ3RoICV1IC0gdG9vIGxvbmcsID4gJXVdIiwKLQkJCSAgICBobGVuLCBsZW4pOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBvdGhlciB2YXJpYWJsZXMgaW4gZ2VuZXJpYyBoZWFkZXIgKi8KLQlpZiAodmZsYWcpIHsKLQkJKHZvaWQpcHJpbnRmKCJDQ1ZhbCAlZCwgQ3NDb3YgJWQsICIsIERDQ1BIX0NDVkFMKGRoKSwgRENDUEhfQ1NDT1YoZGgpKTsKLQl9Ci0KLQkvKiBjaGVja3N1bSBjYWxjdWxhdGlvbiAqLwotI2lmZGVmIElORVQ2Ci0JaWYgKGlwNikgewotCQlpZiAoaXA2LT5pcDZfcGxlbiAmJiB2ZmxhZykgewotCQkJdV9pbnQxNl90IHN1bSwgZGNjcF9zdW07Ci0KLQkJCXN1bSA9IGRjY3A2X2Nrc3VtKGlwNiwgZGgsIGxlbik7Ci0JCQlkY2NwX3N1bSA9IEVYVFJBQ1RfMTZCSVRTKCZkaC0+ZGNjcGhfY2hlY2tzdW0pOwkJCi0JCQlwcmludGYoImNrc3VtIDB4JTA0eCIsIGRjY3Bfc3VtKTsJCQotCQkJaWYgKHN1bSAhPSAwKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgKGluY29ycmVjdCAoLT4gMHglMDR4KSwgIixpbl9ja3N1bV9zaG91bGRiZShkY2NwX3N1bSwgc3VtKSk7Ci0JCQl9IGVsc2UKLQkJCQkodm9pZClwcmludGYoIiAoY29ycmVjdCksICIpOwotCQl9CQkJCQkKLQl9IGVsc2UgCi0jZW5kaWYgLyogSU5FVDYgKi8KLQlpZiAodmZsYWcpCi0JewotCQl1X2ludDE2X3Qgc3VtLCBkY2NwX3N1bTsKLQotCQlzdW0gPSBkY2NwX2Nrc3VtKGlwLCBkaCwgbGVuKTsKLQkJZGNjcF9zdW0gPSBFWFRSQUNUXzE2QklUUygmZGgtPmRjY3BoX2NoZWNrc3VtKTsJCQotCQlwcmludGYoImNrc3VtIDB4JTA0eCIsIGRjY3Bfc3VtKTsJCQotCQlpZiAoc3VtICE9IDApIHsKLQkJCSh2b2lkKXByaW50ZigiIChpbmNvcnJlY3QgKC0+IDB4JTA0eCksICIsaW5fY2tzdW1fc2hvdWxkYmUoZGNjcF9zdW0sIHN1bSkpOwotCQl9IGVsc2UKLQkJCSh2b2lkKXByaW50ZigiIChjb3JyZWN0KSwgIik7Ci0JfQotCi0Jc3dpdGNoIChEQ0NQSF9UWVBFKGRoKSkgewotCWNhc2UgRENDUF9QS1RfUkVRVUVTVDogewotCQlzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCAqZGhyID0KLQkJCShzdHJ1Y3QgZGNjcF9oZHJfcmVxdWVzdCAqKShicCArIGRjY3BfYmFzaWNfaGRyX2xlbihkaCkpOwotCQlUQ0hFQ0soKmRocik7Ci0JCSh2b2lkKXByaW50ZigicmVxdWVzdCAoc2VydmljZT0lZCkgIiwKLQkJCSAgICAgRVhUUkFDVF8zMkJJVFMoJmRoci0+ZGNjcGhfcmVxX3NlcnZpY2UpKTsKLQkJZXh0bGVuICs9IDQ7Ci0JCWJyZWFrOwotCX0KLQljYXNlIERDQ1BfUEtUX1JFU1BPTlNFOiB7Ci0JCXN0cnVjdCBkY2NwX2hkcl9yZXNwb25zZSAqZGhyID0KLQkJCShzdHJ1Y3QgZGNjcF9oZHJfcmVzcG9uc2UgKikoYnAgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oZGgpKTsKLQkJVENIRUNLKCpkaHIpOwotCQkodm9pZClwcmludGYoInJlc3BvbnNlIChzZXJ2aWNlPSVkKSAiLAotCQkJICAgICBFWFRSQUNUXzMyQklUUygmZGhyLT5kY2NwaF9yZXNwX3NlcnZpY2UpKTsKLQkJZXh0bGVuICs9IDEyOwotCQlicmVhazsKLQl9Ci0JY2FzZSBEQ0NQX1BLVF9EQVRBOgotCQkodm9pZClwcmludGYoImRhdGEgIik7Ci0JCWJyZWFrOwotCWNhc2UgRENDUF9QS1RfQUNLOiB7Ci0JCSh2b2lkKXByaW50ZigiYWNrICIpOwotCQlleHRsZW4gKz0gODsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgRENDUF9QS1RfREFUQUFDSzogewotCQkodm9pZClwcmludGYoImRhdGFhY2sgIik7Ci0JCWV4dGxlbiArPSA4OwotCQlicmVhazsKLQl9Ci0JY2FzZSBEQ0NQX1BLVF9DTE9TRVJFUToKLQkJKHZvaWQpcHJpbnRmKCJjbG9zZXJlcSAiKTsKLQkJZXh0bGVuICs9IDg7Ci0JCWJyZWFrOwotCWNhc2UgRENDUF9QS1RfQ0xPU0U6Ci0JCSh2b2lkKXByaW50ZigiY2xvc2UgIik7Ci0JCWV4dGxlbiArPSA4OwotCQlicmVhazsKLQljYXNlIERDQ1BfUEtUX1JFU0VUOiB7Ci0JCXN0cnVjdCBkY2NwX2hkcl9yZXNldCAqZGhyID0KLQkJCShzdHJ1Y3QgZGNjcF9oZHJfcmVzZXQgKikoYnAgKyBkY2NwX2Jhc2ljX2hkcl9sZW4oZGgpKTsKLQkJVENIRUNLKCpkaHIpOwotCQkodm9pZClwcmludGYoInJlc2V0IChjb2RlPSVzKSAiLAotCQkJICAgICBkY2NwX3Jlc2V0X2NvZGUoZGhyLT5kY2NwaF9yZXNldF9jb2RlKSk7Ci0JCWV4dGxlbiArPSAxMjsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgRENDUF9QS1RfU1lOQzoKLQkJKHZvaWQpcHJpbnRmKCJzeW5jICIpOwotCQlleHRsZW4gKz0gODsKLQkJYnJlYWs7Ci0JY2FzZSBEQ0NQX1BLVF9TWU5DQUNLOgotCQkodm9pZClwcmludGYoInN5bmNhY2sgIik7Ci0JCWV4dGxlbiArPSA4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkodm9pZClwcmludGYoImludmFsaWQgIik7Ci0JCWJyZWFrOwotCX0KLQotCWlmICgoRENDUEhfVFlQRShkaCkgIT0gRENDUF9QS1RfREFUQSkgJiYgCi0JCQkoRENDUEhfVFlQRShkaCkgIT0gRENDUF9QS1RfUkVRVUVTVCkpCi0JCWRjY3BfcHJpbnRfYWNrX25vKGJwKTsKLQotCWlmICh2ZmxhZyA8IDIpCi0JCXJldHVybjsKLQotCSh2b2lkKXByaW50Zigic2VxICUiIFBSSXU2NCwgZGNjcF9zZXFubyhkaCkpOwotCi0JLyogcHJvY2VzcyBvcHRpb25zICovCi0JaWYgKGhsZW4gPiBkY2NwX2Jhc2ljX2hkcl9sZW4oZGgpICsgZXh0bGVuKXsKLQkJY29uc3QgdV9jaGFyICpjcDsKLQkJdV9pbnQgb3B0bGVuOwotCQljcCA9IGJwICsgZGNjcF9iYXNpY19oZHJfbGVuKGRoKSArIGV4dGxlbjsKLQkJcHJpbnRmKCIgPCIpOwkKLQotCQlobGVuIC09IGRjY3BfYmFzaWNfaGRyX2xlbihkaCkgKyBleHRsZW47Ci0JCXdoaWxlKDEpewotCQkJVENIRUNLKCpjcCk7Ci0JCQlvcHRsZW4gPSBkY2NwX3ByaW50X29wdGlvbihjcCk7Ci0JCQlpZiAoIW9wdGxlbikgZ290byB0cnVuYzI7Ci0JCQlpZiAoaGxlbiA8PSBvcHRsZW4pIGJyZWFrOyAKLQkJCWhsZW4gLT0gb3B0bGVuOwotCQkJY3AgKz0gb3B0bGVuOwotCQkJcHJpbnRmKCIsICIpOwotCQl9Ci0JCXByaW50ZigiPiIpOwkKLQl9Ci0JcmV0dXJuOwotdHJ1bmM6Ci0JcHJpbnRmKCJbfGRjY3BdIik7Ci10cnVuYzI6Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGRjY3BfcHJpbnRfb3B0aW9uKGNvbnN0IHVfY2hhciAqb3B0aW9uKQotewkKLQl1X2ludDhfdCBvcHRsZW4sIGk7Ci0JdV9pbnQzMl90ICp0czsKLQl1X2ludDE2X3QgKnZhcjE2OwotCXVfaW50MzJfdCAqdmFyMzI7Ci0KLQlUQ0hFQ0soKm9wdGlvbik7Ci0KLQlpZiAoKm9wdGlvbiA+PSAzMikgewotCQlUQ0hFQ0soKihvcHRpb24rMSkpOwotCQlvcHRsZW4gPSAqKG9wdGlvbiArMSk7Ci0JCWlmIChvcHRsZW4gPCAyKSB7Ci0JCQlwcmludGYoIk9wdGlvbiAlZCBvcHRsZW4gdG9vIHNob3J0Iiwqb3B0aW9uKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JfSBlbHNlIG9wdGxlbiA9IDE7Ci0KLQlUQ0hFQ0syKCpvcHRpb24sb3B0bGVuKTsKLQotCXN3aXRjaCAoKm9wdGlvbil7Ci0JY2FzZSAwOgotCQlwcmludGYoIm5vcCIpOwotCQlicmVhazsJCi0JY2FzZSAxOgotCQlwcmludGYoIm1hbmRhdG9yeSIpOwotCQlicmVhazsJCi0JY2FzZSAyOgotCQlwcmludGYoInNsb3dyZWNlaXZlciIpOwotCQlicmVhazsJCi0JY2FzZSAzMjoKLQkJcHJpbnRmKCJjaGFuZ2VfbCIpOwotCQlpZiAoKihvcHRpb24gKzIpIDwgMTApewotCQkJcHJpbnRmKCIgJXMiLCBkY2NwX2ZlYXR1cmVfbnVtc1sqKG9wdGlvbiArMildKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTM7IGkgKyspIHByaW50ZigiICVkIiwgKihvcHRpb24gKzMgKyBpKSk7CQotCQl9Ci0JCWJyZWFrOwkKLQljYXNlIDMzOgotCQlwcmludGYoImNvbmZpcm1fbCIpOwotCQlpZiAoKihvcHRpb24gKzIpIDwgMTApewotCQkJcHJpbnRmKCIgJXMiLCBkY2NwX2ZlYXR1cmVfbnVtc1sqKG9wdGlvbiArMildKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTM7IGkgKyspIHByaW50ZigiICVkIiwgKihvcHRpb24gKzMgKyBpKSk7CQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMzQ6Ci0JICAgICAgICBwcmludGYoImNoYW5nZV9yIik7Ci0JCWlmICgqKG9wdGlvbiArMikgPCAxMCl7Ci0JCQlwcmludGYoIiAlcyIsIGRjY3BfZmVhdHVyZV9udW1zWyoob3B0aW9uICsyKV0pOwotCQkJZm9yIChpID0gMDsgaSA8IG9wdGxlbiAtMzsgaSArKykgcHJpbnRmKCIgJWQiLCAqKG9wdGlvbiArMyArIGkpKTsJCi0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAzNToKLQkJcHJpbnRmKCJjb25maXJtX3IiKTsKLQkJaWYgKCoob3B0aW9uICsyKSA8IDEwKXsKLQkJCXByaW50ZigiICVzIiwgZGNjcF9mZWF0dXJlX251bXNbKihvcHRpb24gKzIpXSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0zOyBpICsrKSBwcmludGYoIiAlZCIsICoob3B0aW9uICszICsgaSkpOwkKLQkJfQotCQlicmVhazsKLQljYXNlIDM2OgotCQlwcmludGYoImluaXRjb29raWUgMHgiKTsKLQkJZm9yIChpID0gMDsgaSA8IG9wdGxlbiAtMjsgaSArKykgcHJpbnRmKCIlMDJ4IiwgKihvcHRpb24gKzIgKyBpKSk7CQotCQlicmVhazsKLQljYXNlIDM3OgotCQlwcmludGYoIm5kcF9jb3VudCIpOwotCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0yOyBpICsrKSBwcmludGYoIiAlZCIsICoob3B0aW9uICsyICsgaSkpOwkKLQkJYnJlYWs7Ci0JY2FzZSAzODoKLQkJcHJpbnRmKCJhY2tfdmVjdG9yMCAweCIpOwotCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0yOyBpICsrKSBwcmludGYoIiUwMngiLCAqKG9wdGlvbiArMiArIGkpKTsJCi0JCWJyZWFrOwotCWNhc2UgMzk6Ci0JCXByaW50ZigiYWNrX3ZlY3RvcjEgMHgiKTsKLQkJZm9yIChpID0gMDsgaSA8IG9wdGxlbiAtMjsgaSArKykgcHJpbnRmKCIlMDJ4IiwgKihvcHRpb24gKzIgKyBpKSk7CQotCQlicmVhazsKLQljYXNlIDQwOgotCQlwcmludGYoImRhdGFfZHJvcHBlZCAweCIpOwotCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuIC0yOyBpICsrKSBwcmludGYoIiUwMngiLCAqKG9wdGlvbiArMiArIGkpKTsJCi0JCWJyZWFrOwotCWNhc2UgNDE6Ci0JCXRzID0gKHVfaW50MzJfdCAqKShvcHRpb24gKyAyKTsKLQkJcHJpbnRmKCJ0aW1lc3RhbXAgJXUiLCAodV9pbnQzMl90KW50b2hsKCp0cykpOwotCQlicmVhazsKLQljYXNlIDQyOgotCQl0cyA9ICh1X2ludDMyX3QgKikob3B0aW9uICsgMik7Ci0JCXByaW50ZigidGltZXN0YW1wX2VjaG8gJXUiLCAodV9pbnQzMl90KW50b2hsKCp0cykpOwotCQlicmVhazsKLQljYXNlIDQzOgotCQlwcmludGYoImVsYXBzZWRfdGltZSAiKTsKLQkJaWYgKG9wdGxlbiA9PSA2KXsKLQkJCXRzID0gKHVfaW50MzJfdCAqKShvcHRpb24gKyAyKTsKLQkJCXByaW50ZigiJXUiLCAodV9pbnQzMl90KW50b2hsKCp0cykpOwotCQl9IGVsc2UgewotCQkJdmFyMTYgPSAodV9pbnQxNl90ICopKG9wdGlvbiArIDIpOwotCQkJcHJpbnRmKCIldSIsIG50b2hzKCp2YXIxNikpOwotCQl9CQotCQlicmVhazsKLQljYXNlIDQ0OgotCQlwcmludGYoImRhdGFfY2hlY2tzdW0gIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gLTI7IGkgKyspIHByaW50ZigiJTAyeCIsICoob3B0aW9uICsyICsgaSkpOwkKLQkJYnJlYWs7Ci0JZGVmYXVsdCA6Ci0JCWlmICgqb3B0aW9uID49IDEyOCkgewotCQkJcHJpbnRmKCJDQ0lEIG9wdGlvbiAlZCIsKm9wdGlvbik7Ci0JCQlzd2l0Y2ggKG9wdGxlbikgewotCQkJCWNhc2UgNDoKLQkJCQkJdmFyMTYgPSAodV9pbnQxNl90ICopKG9wdGlvbiArIDIpOwotCQkJCQlwcmludGYoIiAldSIsbnRvaHMoKnZhcjE2KSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjoKLQkJCQkJdmFyMzIgPSAodV9pbnQzMl90ICopKG9wdGlvbiArIDIpOwotCQkJCQlwcmludGYoIiAldSIsKHVfaW50MzJfdCludG9obCgqdmFyMzIpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQkJCi0JCXByaW50ZigidW5rbm93bl9vcHQgJWQiLCAqb3B0aW9uKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIG9wdGxlbjsKLXRydW5jOgotCXByaW50ZigiW3xkY2NwXSIpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZGVjbmV0LmMgYi9wcmludC1kZWNuZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3YmE1Yy4uMDAwMDAwMAotLS0gYS9wcmludC1kZWNuZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZGVjbmV0LmMsdiAxLjM4LjIuMSAyMDA1LzA1LzA2IDAyOjE2OjUzIGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotc3RydWN0IG1idWY7Ci1zdHJ1Y3QgcnRlbnRyeTsKLQotI2lmZGVmIEhBVkVfTkVURE5FVF9ETkVUREJfSAotI2luY2x1ZGUgPG5ldGRuZXQvZG5ldGRiLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJkZWNuZXQuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotCi0vKiBGb3J3YXJkcyAqLwotc3RhdGljIGludCBwcmludF9kZWNuZXRfY3RsbXNnKGNvbnN0IHVuaW9uIHJvdXRlaGRyICosIHVfaW50LCB1X2ludCk7Ci1zdGF0aWMgdm9pZCBwcmludF90X2luZm8oaW50KTsKLXN0YXRpYyBpbnQgcHJpbnRfbDFfcm91dGVzKGNvbnN0IGNoYXIgKiwgdV9pbnQpOwotc3RhdGljIGludCBwcmludF9sMl9yb3V0ZXMoY29uc3QgY2hhciAqLCB1X2ludCk7Ci1zdGF0aWMgdm9pZCBwcmludF9pX2luZm8oaW50KTsKLXN0YXRpYyBpbnQgcHJpbnRfZWxpc3QoY29uc3QgY2hhciAqLCB1X2ludCk7Ci1zdGF0aWMgaW50IHByaW50X25zcChjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotc3RhdGljIHZvaWQgcHJpbnRfcmVhc29uKGludCk7Ci0jaWZkZWYJUFJJTlRfTlNQREFUQQotc3RhdGljIHZvaWQgcGRhdGEodV9jaGFyICosIGludCk7Ci0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX05FVERORVRfRE5FVERCX0hfRE5FVF9IVE9BCi1leHRlcm4gY2hhciAqZG5ldF9odG9hKHN0cnVjdCBkbl9uYWRkciAqKTsKLSNlbmRpZgotCi12b2lkCi1kZWNuZXRfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICphcCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLAotCSAgICAgcmVnaXN0ZXIgdV9pbnQgY2FwbGVuKQotewotCXJlZ2lzdGVyIGNvbnN0IHVuaW9uIHJvdXRlaGRyICpyaHA7Ci0JcmVnaXN0ZXIgaW50IG1mbGFnczsKLQlpbnQgZHN0LCBzcmMsIGhvcHM7Ci0JdV9pbnQgbnNwbGVuLCBwa3RsZW47Ci0JY29uc3QgdV9jaGFyICpuc3BwOwotCi0JaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc2hvcnRoZHIpKSB7Ci0JCSh2b2lkKXByaW50ZigiW3xkZWNuZXRdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlUQ0hFQ0syKCphcCwgc2l6ZW9mKHNob3J0KSk7Ci0JcGt0bGVuID0gRVhUUkFDVF9MRV8xNkJJVFMoYXApOwotCWlmIChwa3RsZW4gPCBzaXplb2Yoc3RydWN0IHNob3J0aGRyKSkgewotCQkodm9pZClwcmludGYoIlt8ZGVjbmV0XSIpOwotCQlyZXR1cm47Ci0JfQotCWlmIChwa3RsZW4gPiBsZW5ndGgpIHsKLQkJKHZvaWQpcHJpbnRmKCJbfGRlY25ldF0iKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggPSBwa3RsZW47Ci0KLQlyaHAgPSAoY29uc3QgdW5pb24gcm91dGVoZHIgKikmKGFwW3NpemVvZihzaG9ydCldKTsKLQlUQ0hFQ0socmhwLT5yaF9zaG9ydC5zaF9mbGFncyk7Ci0JbWZsYWdzID0gRVhUUkFDVF9MRV84QklUUyhyaHAtPnJoX3Nob3J0LnNoX2ZsYWdzKTsKLQotCWlmIChtZmxhZ3MgJiBSTUZfUEFEKSB7Ci0JICAgIC8qIHBhZCBieXRlcyBvZiBzb21lIHNvcnQgaW4gZnJvbnQgb2YgbWVzc2FnZSAqLwotCSAgICB1X2ludCBwYWRsZW4gPSBtZmxhZ3MgJiBSTUZfUEFETUFTSzsKLQkgICAgaWYgKHZmbGFnKQotCQkodm9pZCkgcHJpbnRmKCJbcGFkOiVkXSAiLCBwYWRsZW4pOwotCSAgICBpZiAobGVuZ3RoIDwgcGFkbGVuICsgMikgewotCQkodm9pZClwcmludGYoIlt8ZGVjbmV0XSIpOwotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgVENIRUNLMihhcFtzaXplb2Yoc2hvcnQpXSwgcGFkbGVuKTsKLQkgICAgYXAgKz0gcGFkbGVuOwotCSAgICBsZW5ndGggLT0gcGFkbGVuOwotCSAgICBjYXBsZW4gLT0gcGFkbGVuOwotCSAgICByaHAgPSAoY29uc3QgdW5pb24gcm91dGVoZHIgKikmKGFwW3NpemVvZihzaG9ydCldKTsKLQkgICAgbWZsYWdzID0gRVhUUkFDVF9MRV84QklUUyhyaHAtPnJoX3Nob3J0LnNoX2ZsYWdzKTsKLQl9Ci0KLQlpZiAobWZsYWdzICYgUk1GX0ZWRVIpIHsKLQkJKHZvaWQpIHByaW50ZigiZnV0dXJlLXZlcnNpb24tZGVjbmV0Iik7Ci0JCWRlZmF1bHRfcHJpbnQoYXAsIG1pbihsZW5ndGgsIGNhcGxlbikpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogaXMgaXQgYSBjb250cm9sIG1lc3NhZ2U/ICovCi0JaWYgKG1mbGFncyAmIFJNRl9DVExNU0cpIHsKLQkJaWYgKCFwcmludF9kZWNuZXRfY3RsbXNnKHJocCwgbGVuZ3RoLCBjYXBsZW4pKQotCQkJZ290byB0cnVuYzsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAobWZsYWdzICYgUk1GX01BU0spIHsKLQljYXNlIFJNRl9MT05HOgotCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBsb25naGRyKSkgewotCQkodm9pZClwcmludGYoIlt8ZGVjbmV0XSIpOwotCQlyZXR1cm47Ci0JICAgIH0KLQkgICAgVENIRUNLKHJocC0+cmhfbG9uZyk7Ci0JICAgIGRzdCA9Ci0JCUVYVFJBQ1RfTEVfMTZCSVRTKHJocC0+cmhfbG9uZy5sZ19kc3QuZG5lX3JlbW90ZS5kbmVfbm9kZWFkZHIpOwotCSAgICBzcmMgPQotCQlFWFRSQUNUX0xFXzE2QklUUyhyaHAtPnJoX2xvbmcubGdfc3JjLmRuZV9yZW1vdGUuZG5lX25vZGVhZGRyKTsKLQkgICAgaG9wcyA9IEVYVFJBQ1RfTEVfOEJJVFMocmhwLT5yaF9sb25nLmxnX3Zpc2l0cyk7Ci0JICAgIG5zcHAgPSAmKGFwW3NpemVvZihzaG9ydCkgKyBzaXplb2Yoc3RydWN0IGxvbmdoZHIpXSk7Ci0JICAgIG5zcGxlbiA9IGxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgbG9uZ2hkcik7Ci0JICAgIGJyZWFrOwotCWNhc2UgUk1GX1NIT1JUOgotCSAgICBUQ0hFQ0socmhwLT5yaF9zaG9ydCk7Ci0JICAgIGRzdCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJocC0+cmhfc2hvcnQuc2hfZHN0KTsKLQkgICAgc3JjID0gRVhUUkFDVF9MRV8xNkJJVFMocmhwLT5yaF9zaG9ydC5zaF9zcmMpOwotCSAgICBob3BzID0gKEVYVFJBQ1RfTEVfOEJJVFMocmhwLT5yaF9zaG9ydC5zaF92aXNpdHMpICYgVklTX01BU0spKzE7Ci0JICAgIG5zcHAgPSAmKGFwW3NpemVvZihzaG9ydCkgKyBzaXplb2Yoc3RydWN0IHNob3J0aGRyKV0pOwotCSAgICBuc3BsZW4gPSBsZW5ndGggLSBzaXplb2Yoc3RydWN0IHNob3J0aGRyKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgKHZvaWQpIHByaW50ZigidW5rbm93biBtZXNzYWdlIGZsYWdzIHVuZGVyIG1hc2siKTsKLQkgICAgZGVmYXVsdF9wcmludCgodV9jaGFyICopYXAsIG1pbihsZW5ndGgsIGNhcGxlbikpOwotCSAgICByZXR1cm47Ci0JfQotCi0JKHZvaWQpcHJpbnRmKCIlcyA+ICVzICVkICIsCi0JCQlkbmFkZHJfc3RyaW5nKHNyYyksIGRuYWRkcl9zdHJpbmcoZHN0KSwgcGt0bGVuKTsKLQlpZiAodmZsYWcpIHsKLQkgICAgaWYgKG1mbGFncyAmIFJNRl9SUVIpCi0JCSh2b2lkKXByaW50ZigiUlFSICIpOwotCSAgICBpZiAobWZsYWdzICYgUk1GX1JUUykKLQkJKHZvaWQpcHJpbnRmKCJSVFMgIik7Ci0JICAgIGlmIChtZmxhZ3MgJiBSTUZfSUUpCi0JCSh2b2lkKXByaW50ZigiSUUgIik7Ci0JICAgICh2b2lkKXByaW50ZigiJWQgaG9wcyAiLCBob3BzKTsKLQl9Ci0KLQlpZiAoIXByaW50X25zcChuc3BwLCBuc3BsZW4pKQotCQlnb3RvIHRydW5jOwotCXJldHVybjsKLQotdHJ1bmM6Ci0JKHZvaWQpcHJpbnRmKCJbfGRlY25ldF0iKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2RlY25ldF9jdGxtc2cocmVnaXN0ZXIgY29uc3QgdW5pb24gcm91dGVoZHIgKnJocCwgdV9pbnQgbGVuZ3RoLAotICAgIHVfaW50IGNhcGxlbikKLXsKLQlpbnQgbWZsYWdzID0gRVhUUkFDVF9MRV84QklUUyhyaHAtPnJoX3Nob3J0LnNoX2ZsYWdzKTsKLQlyZWdpc3RlciB1bmlvbiBjb250cm9sbXNnICpjbXAgPSAodW5pb24gY29udHJvbG1zZyAqKXJocDsKLQlpbnQgc3JjLCBkc3QsIGluZm8sIGJsa3NpemUsIGVjbywgdWVjbywgaGVsbG8sIG90aGVyLCB2ZXJzOwotCWV0aGVyYWRkciBzcmNlYSwgcnRlYTsKLQlpbnQgcHJpb3JpdHk7Ci0JY2hhciAqcmhweCA9IChjaGFyICopcmhwOwotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKG1mbGFncyAmIFJNRl9DVExNQVNLKSB7Ci0JY2FzZSBSTUZfSU5JVDoKLQkgICAgKHZvaWQpcHJpbnRmKCJpbml0ICIpOwotCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpbml0bXNnKSkKLQkJZ290byB0cnVuYzsKLQkgICAgVENIRUNLKGNtcC0+Y21faW5pdCk7Ci0JICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21faW5pdC5pbl9zcmMpOwotCSAgICBpbmZvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2luaXQuaW5faW5mbyk7Ci0JICAgIGJsa3NpemUgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX2luaXQuaW5fYmxrc2l6ZSk7Ci0JICAgIHZlcnMgPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21faW5pdC5pbl92ZXJzKTsKLQkgICAgZWNvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2luaXQuaW5fZWNvKTsKLQkgICAgdWVjbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9pbml0LmluX3VlY28pOwotCSAgICBoZWxsbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21faW5pdC5pbl9oZWxsbyk7Ci0JICAgIHByaW50X3RfaW5mbyhpbmZvKTsKLQkgICAgKHZvaWQpcHJpbnRmKAotCQkic3JjICVzYmxrc2l6ZSAlZCB2ZXJzICVkIGVjbyAlZCB1ZWNvICVkIGhlbGxvICVkIiwKLQkJCWRuYWRkcl9zdHJpbmcoc3JjKSwgYmxrc2l6ZSwgdmVycywgZWNvLCB1ZWNvLAotCQkJaGVsbG8pOwotCSAgICByZXQgPSAxOwotCSAgICBicmVhazsKLQljYXNlIFJNRl9WRVI6Ci0JICAgICh2b2lkKXByaW50ZigidmVyaWZpY2F0aW9uICIpOwotCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCB2ZXJpZm1zZykpCi0JCWdvdG8gdHJ1bmM7Ci0JICAgIFRDSEVDSyhjbXAtPmNtX3Zlcik7Ci0JICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21fdmVyLnZlX3NyYyk7Ci0JICAgIG90aGVyID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX3Zlci52ZV9mY252YWwpOwotCSAgICAodm9pZClwcmludGYoInNyYyAlcyBmY252YWwgJW8iLCBkbmFkZHJfc3RyaW5nKHNyYyksIG90aGVyKTsKLQkgICAgcmV0ID0gMTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBSTUZfVEVTVDoKLQkgICAgKHZvaWQpcHJpbnRmKCJ0ZXN0ICIpOwotCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCB0ZXN0bXNnKSkKLQkJZ290byB0cnVuYzsKLQkgICAgVENIRUNLKGNtcC0+Y21fdGVzdCk7Ci0JICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21fdGVzdC50ZV9zcmMpOwotCSAgICBvdGhlciA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV90ZXN0LnRlX2RhdGEpOwotCSAgICAodm9pZClwcmludGYoInNyYyAlcyBkYXRhICVvIiwgZG5hZGRyX3N0cmluZyhzcmMpLCBvdGhlcik7Ci0JICAgIHJldCA9IDE7Ci0JICAgIGJyZWFrOwotCWNhc2UgUk1GX0wxUk9VVDoKLQkgICAgKHZvaWQpcHJpbnRmKCJsZXYtMS1yb3V0aW5nICIpOwotCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBsMXJvdXQpKQotCQlnb3RvIHRydW5jOwotCSAgICBUQ0hFQ0soY21wLT5jbV9sMXJvdSk7Ci0JICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21fbDFyb3UucjFfc3JjKTsKLQkgICAgKHZvaWQpcHJpbnRmKCJzcmMgJXMgIiwgZG5hZGRyX3N0cmluZyhzcmMpKTsKLQkgICAgcmV0ID0gcHJpbnRfbDFfcm91dGVzKCYocmhweFtzaXplb2Yoc3RydWN0IGwxcm91dCldKSwKLQkJCQlsZW5ndGggLSBzaXplb2Yoc3RydWN0IGwxcm91dCkpOwotCSAgICBicmVhazsKLQljYXNlIFJNRl9MMlJPVVQ6Ci0JICAgICh2b2lkKXByaW50ZigibGV2LTItcm91dGluZyAiKTsKLQkgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbDJyb3V0KSkKLQkJZ290byB0cnVuYzsKLQkgICAgVENIRUNLKGNtcC0+Y21fbDJyb3V0KTsKLQkgICAgc3JjID0gRVhUUkFDVF9MRV8xNkJJVFMoY21wLT5jbV9sMnJvdXQucjJfc3JjKTsKLQkgICAgKHZvaWQpcHJpbnRmKCJzcmMgJXMgIiwgZG5hZGRyX3N0cmluZyhzcmMpKTsKLQkgICAgcmV0ID0gcHJpbnRfbDJfcm91dGVzKCYocmhweFtzaXplb2Yoc3RydWN0IGwycm91dCldKSwKLQkJCQlsZW5ndGggLSBzaXplb2Yoc3RydWN0IGwycm91dCkpOwotCSAgICBicmVhazsKLQljYXNlIFJNRl9SSEVMTE86Ci0JICAgICh2b2lkKXByaW50Zigicm91dGVyLWhlbGxvICIpOwotCSAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCByaGVsbG9tc2cpKQotCQlnb3RvIHRydW5jOwotCSAgICBUQ0hFQ0soY21wLT5jbV9yaGVsbG8pOwotCSAgICB2ZXJzID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX3JoZWxsby5yaF92ZXJzKTsKLQkgICAgZWNvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX3JoZWxsby5yaF9lY28pOwotCSAgICB1ZWNvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX3JoZWxsby5yaF91ZWNvKTsKLQkgICAgbWVtY3B5KChjaGFyICopJnNyY2VhLCAoY2hhciAqKSYoY21wLT5jbV9yaGVsbG8ucmhfc3JjKSwKLQkJc2l6ZW9mKHNyY2VhKSk7Ci0JICAgIHNyYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNyY2VhLmRuZV9yZW1vdGUuZG5lX25vZGVhZGRyKTsKLQkgICAgaW5mbyA9IEVYVFJBQ1RfTEVfOEJJVFMoY21wLT5jbV9yaGVsbG8ucmhfaW5mbyk7Ci0JICAgIGJsa3NpemUgPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX3JoZWxsby5yaF9ibGtzaXplKTsKLQkgICAgcHJpb3JpdHkgPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fcmhlbGxvLnJoX3ByaW9yaXR5KTsKLQkgICAgaGVsbG8gPSBFWFRSQUNUX0xFXzE2QklUUyhjbXAtPmNtX3JoZWxsby5yaF9oZWxsbyk7Ci0JICAgIHByaW50X2lfaW5mbyhpbmZvKTsKLQkgICAgKHZvaWQpcHJpbnRmKAotCSAgICAidmVycyAlZCBlY28gJWQgdWVjbyAlZCBzcmMgJXMgYmxrc2l6ZSAlZCBwcmkgJWQgaGVsbG8gJWQiLAotCQkJdmVycywgZWNvLCB1ZWNvLCBkbmFkZHJfc3RyaW5nKHNyYyksCi0JCQlibGtzaXplLCBwcmlvcml0eSwgaGVsbG8pOwotCSAgICByZXQgPSBwcmludF9lbGlzdCgmKHJocHhbc2l6ZW9mKHN0cnVjdCByaGVsbG9tc2cpXSksCi0JCQkJbGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCByaGVsbG9tc2cpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBSTUZfRUhFTExPOgotCSAgICAodm9pZClwcmludGYoImVuZG5vZGUtaGVsbG8gIik7Ci0JICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IGVoZWxsb21zZykpCi0JCWdvdG8gdHJ1bmM7Ci0JICAgIFRDSEVDSyhjbXAtPmNtX2VoZWxsbyk7Ci0JICAgIHZlcnMgPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fZWhlbGxvLmVoX3ZlcnMpOwotCSAgICBlY28gPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fZWhlbGxvLmVoX2Vjbyk7Ci0JICAgIHVlY28gPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fZWhlbGxvLmVoX3VlY28pOwotCSAgICBtZW1jcHkoKGNoYXIgKikmc3JjZWEsIChjaGFyICopJihjbXAtPmNtX2VoZWxsby5laF9zcmMpLAotCQlzaXplb2Yoc3JjZWEpKTsKLQkgICAgc3JjID0gRVhUUkFDVF9MRV8xNkJJVFMoc3JjZWEuZG5lX3JlbW90ZS5kbmVfbm9kZWFkZHIpOwotCSAgICBpbmZvID0gRVhUUkFDVF9MRV84QklUUyhjbXAtPmNtX2VoZWxsby5laF9pbmZvKTsKLQkgICAgYmxrc2l6ZSA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21fZWhlbGxvLmVoX2Jsa3NpemUpOwotCSAgICAvKnNlZWQqLwotCSAgICBtZW1jcHkoKGNoYXIgKikmcnRlYSwgKGNoYXIgKikmKGNtcC0+Y21fZWhlbGxvLmVoX3JvdXRlciksCi0JCXNpemVvZihydGVhKSk7Ci0JICAgIGRzdCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJ0ZWEuZG5lX3JlbW90ZS5kbmVfbm9kZWFkZHIpOwotCSAgICBoZWxsbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNtcC0+Y21fZWhlbGxvLmVoX2hlbGxvKTsKLQkgICAgb3RoZXIgPSBFWFRSQUNUX0xFXzhCSVRTKGNtcC0+Y21fZWhlbGxvLmVoX2RhdGEpOwotCSAgICBwcmludF9pX2luZm8oaW5mbyk7Ci0JICAgICh2b2lkKXByaW50ZigKLQkidmVycyAlZCBlY28gJWQgdWVjbyAlZCBzcmMgJXMgYmxrc2l6ZSAlZCBydHIgJXMgaGVsbG8gJWQgZGF0YSAlbyIsCi0JCQl2ZXJzLCBlY28sIHVlY28sIGRuYWRkcl9zdHJpbmcoc3JjKSwKLQkJCWJsa3NpemUsIGRuYWRkcl9zdHJpbmcoZHN0KSwgaGVsbG8sIG90aGVyKTsKLQkgICAgcmV0ID0gMTsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICAodm9pZClwcmludGYoInVua25vd24gY29udHJvbCBtZXNzYWdlIik7Ci0JICAgIGRlZmF1bHRfcHJpbnQoKHVfY2hhciAqKXJocCwgbWluKGxlbmd0aCwgY2FwbGVuKSk7Ci0JICAgIHJldCA9IDE7Ci0JICAgIGJyZWFrOwotCX0KLQlyZXR1cm4gKHJldCk7Ci0KLXRydW5jOgotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF90X2luZm8oaW50IGluZm8pCi17Ci0JaW50IG50eXBlID0gaW5mbyAmIDM7Ci0Jc3dpdGNoIChudHlwZSkgewotCWNhc2UgMDogKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1udHlwZT8gIik7IGJyZWFrOwotCWNhc2UgVElfTDJST1VUOiAodm9pZClwcmludGYoImwycm91dCAiKTsgYnJlYWs7Ci0JY2FzZSBUSV9MMVJPVVQ6ICh2b2lkKXByaW50ZigibDFyb3V0ICIpOyBicmVhazsKLQljYXNlIFRJX0VORE5PREU6ICh2b2lkKXByaW50ZigiZW5kbm9kZSAiKTsgYnJlYWs7Ci0JfQotCWlmIChpbmZvICYgVElfVkVSSUYpCi0JICAgICh2b2lkKXByaW50ZigidmVyaWYgIik7Ci0JaWYgKGluZm8gJiBUSV9CTE9DSykKLQkgICAgKHZvaWQpcHJpbnRmKCJibG8gIik7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2wxX3JvdXRlcyhjb25zdCBjaGFyICpycCwgdV9pbnQgbGVuKQotewotCWludCBjb3VudDsKLQlpbnQgaWQ7Ci0JaW50IGluZm87Ci0KLQkvKiBUaGUgbGFzdCBzaG9ydCBpcyBhIGNoZWNrc3VtICovCi0Jd2hpbGUgKGxlbiA+ICgzICogc2l6ZW9mKHNob3J0KSkpIHsKLQkgICAgVENIRUNLMigqcnAsIDMgKiBzaXplb2Yoc2hvcnQpKTsKLQkgICAgY291bnQgPSBFWFRSQUNUX0xFXzE2QklUUyhycCk7Ci0JICAgIGlmIChjb3VudCA+IDEwMjQpCi0JCXJldHVybiAoMSk7CS8qIHNlZW1zIHRvIGJlIGJvZ3VzIGZyb20gaGVyZSBvbiAqLwotCSAgICBycCArPSBzaXplb2Yoc2hvcnQpOwotCSAgICBsZW4gLT0gc2l6ZW9mKHNob3J0KTsKLQkgICAgaWQgPSBFWFRSQUNUX0xFXzE2QklUUyhycCk7Ci0JICAgIHJwICs9IHNpemVvZihzaG9ydCk7Ci0JICAgIGxlbiAtPSBzaXplb2Yoc2hvcnQpOwotCSAgICBpbmZvID0gRVhUUkFDVF9MRV8xNkJJVFMocnApOwotCSAgICBycCArPSBzaXplb2Yoc2hvcnQpOwotCSAgICBsZW4gLT0gc2l6ZW9mKHNob3J0KTsKLQkgICAgKHZvaWQpcHJpbnRmKCJ7aWRzICVkLSVkIGNvc3QgJWQgaG9wcyAlZH0gIiwgaWQsIGlkICsgY291bnQsCi0JCQkgICAgUklfQ09TVChpbmZvKSwgUklfSE9QUyhpbmZvKSk7Ci0JfQotCXJldHVybiAoMSk7Ci0KLXRydW5jOgotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2wyX3JvdXRlcyhjb25zdCBjaGFyICpycCwgdV9pbnQgbGVuKQotewotCWludCBjb3VudDsKLQlpbnQgYXJlYTsKLQlpbnQgaW5mbzsKLQotCS8qIFRoZSBsYXN0IHNob3J0IGlzIGEgY2hlY2tzdW0gKi8KLQl3aGlsZSAobGVuID4gKDMgKiBzaXplb2Yoc2hvcnQpKSkgewotCSAgICBUQ0hFQ0syKCpycCwgMyAqIHNpemVvZihzaG9ydCkpOwotCSAgICBjb3VudCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJwKTsKLQkgICAgaWYgKGNvdW50ID4gMTAyNCkKLQkJcmV0dXJuICgxKTsJLyogc2VlbXMgdG8gYmUgYm9ndXMgZnJvbSBoZXJlIG9uICovCi0JICAgIHJwICs9IHNpemVvZihzaG9ydCk7Ci0JICAgIGxlbiAtPSBzaXplb2Yoc2hvcnQpOwotCSAgICBhcmVhID0gRVhUUkFDVF9MRV8xNkJJVFMocnApOwotCSAgICBycCArPSBzaXplb2Yoc2hvcnQpOwotCSAgICBsZW4gLT0gc2l6ZW9mKHNob3J0KTsKLQkgICAgaW5mbyA9IEVYVFJBQ1RfTEVfMTZCSVRTKHJwKTsKLQkgICAgcnAgKz0gc2l6ZW9mKHNob3J0KTsKLQkgICAgbGVuIC09IHNpemVvZihzaG9ydCk7Ci0JICAgICh2b2lkKXByaW50Zigie2FyZWFzICVkLSVkIGNvc3QgJWQgaG9wcyAlZH0gIiwgYXJlYSwgYXJlYSArIGNvdW50LAotCQkJICAgIFJJX0NPU1QoaW5mbyksIFJJX0hPUFMoaW5mbykpOwotCX0KLQlyZXR1cm4gKDEpOwotCi10cnVuYzoKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaV9pbmZvKGludCBpbmZvKQotewotCWludCBudHlwZSA9IGluZm8gJiBJSV9UWVBFTUFTSzsKLQlzd2l0Y2ggKG50eXBlKSB7Ci0JY2FzZSAwOiAodm9pZClwcmludGYoInJlc2VydmVkLW50eXBlPyAiKTsgYnJlYWs7Ci0JY2FzZSBJSV9MMlJPVVQ6ICh2b2lkKXByaW50ZigibDJyb3V0ICIpOyBicmVhazsKLQljYXNlIElJX0wxUk9VVDogKHZvaWQpcHJpbnRmKCJsMXJvdXQgIik7IGJyZWFrOwotCWNhc2UgSUlfRU5ETk9ERTogKHZvaWQpcHJpbnRmKCJlbmRub2RlICIpOyBicmVhazsKLQl9Ci0JaWYgKGluZm8gJiBJSV9WRVJJRikKLQkgICAgKHZvaWQpcHJpbnRmKCJ2ZXJpZiAiKTsKLQlpZiAoaW5mbyAmIElJX05PTUNBU1QpCi0JICAgICh2b2lkKXByaW50Zigibm9tY2FzdCAiKTsKLQlpZiAoaW5mbyAmIElJX0JMT0NLKQotCSAgICAodm9pZClwcmludGYoImJsbyAiKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfZWxpc3QoY29uc3QgY2hhciAqZWxwIF9VXywgdV9pbnQgbGVuIF9VXykKLXsKLQkvKiBOb3QgZW5vdWdoIGV4YW1wbGVzIGF2YWlsYWJsZSBmb3IgbWUgdG8gZGVidWcgdGhpcyAqLwotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X25zcChjb25zdCB1X2NoYXIgKm5zcHAsIHVfaW50IG5zcGxlbikKLXsKLQljb25zdCBzdHJ1Y3QgbnNwaGRyICpuc3BocCA9IChzdHJ1Y3QgbnNwaGRyICopbnNwcDsKLQlpbnQgZHN0LCBzcmMsIGZsYWdzOwotCi0JaWYgKG5zcGxlbiA8IHNpemVvZihzdHJ1Y3QgbnNwaGRyKSkKLQkJZ290byB0cnVuYzsKLQlUQ0hFQ0soKm5zcGhwKTsKLQlmbGFncyA9IEVYVFJBQ1RfTEVfOEJJVFMobnNwaHAtPm5oX2ZsYWdzKTsKLQlkc3QgPSBFWFRSQUNUX0xFXzE2QklUUyhuc3BocC0+bmhfZHN0KTsKLQlzcmMgPSBFWFRSQUNUX0xFXzE2QklUUyhuc3BocC0+bmhfc3JjKTsKLQotCXN3aXRjaCAoZmxhZ3MgJiBOU1BfVFlQRU1BU0spIHsKLQljYXNlIE1GVF9EQVRBOgotCSAgICBzd2l0Y2ggKGZsYWdzICYgTlNQX1NVQk1BU0spIHsKLQkgICAgY2FzZSBNRlNfQk9NOgotCSAgICBjYXNlIE1GU19NT006Ci0JICAgIGNhc2UgTUZTX0VPTToKLQkgICAgY2FzZSBNRlNfQk9NK01GU19FT006Ci0JCXByaW50ZigiZGF0YSAlZD4lZCAiLCBzcmMsIGRzdCk7Ci0JCXsKLQkJICAgIHN0cnVjdCBzZWdoZHIgKnNocCA9IChzdHJ1Y3Qgc2VnaGRyICopbnNwcDsKLQkJICAgIGludCBhY2s7Ci0jaWZkZWYJUFJJTlRfTlNQREFUQQotCQkgICAgdV9jaGFyICpkcDsKLSNlbmRpZgotCQkgICAgdV9pbnQgZGF0YV9vZmYgPSBzaXplb2Yoc3RydWN0IG1pbnNlZ2hkcik7Ci0KLQkJICAgIGlmIChuc3BsZW4gPCBkYXRhX29mZikKLQkJCWdvdG8gdHJ1bmM7Ci0JCSAgICBUQ0hFQ0soc2hwLT5zaF9zZXFbMF0pOwotCQkgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoc2hwLT5zaF9zZXFbMF0pOwotCQkgICAgaWYgKGFjayAmIFNHUV9BQ0spIHsJLyogYWNrbnVtIGZpZWxkICovCi0JCQlpZiAoKGFjayAmIFNHUV9OQUspID09IFNHUV9OQUspCi0JCQkgICAgKHZvaWQpcHJpbnRmKCJuYWsgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkJZWxzZQotCQkJICAgICh2b2lkKXByaW50ZigiYWNrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCWRhdGFfb2ZmICs9IHNpemVvZihzaG9ydCk7Ci0JCQlpZiAobnNwbGVuIDwgZGF0YV9vZmYpCi0JCQkgICAgZ290byB0cnVuYzsKLQkJCVRDSEVDSyhzaHAtPnNoX3NlcVsxXSk7Ci0JCSAgICAgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoc2hwLT5zaF9zZXFbMV0pOwotCQkJaWYgKGFjayAmIFNHUV9PQUNLKSB7CS8qIGFja290aCBmaWVsZCAqLwotCQkJICAgIGlmICgoYWNrICYgU0dRX09OQUspID09IFNHUV9PTkFLKQotCQkJCSh2b2lkKXByaW50Zigib25hayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7Ci0JCQkgICAgZWxzZQotCQkJCSh2b2lkKXByaW50Zigib2FjayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7Ci0JCQkgICAgZGF0YV9vZmYgKz0gc2l6ZW9mKHNob3J0KTsKLQkJCSAgICBpZiAobnNwbGVuIDwgZGF0YV9vZmYpCi0JCQkJZ290byB0cnVuYzsKLQkJCSAgICBUQ0hFQ0soc2hwLT5zaF9zZXFbMl0pOwotCQkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzJdKTsKLQkJCX0KLQkJICAgIH0KLQkJICAgICh2b2lkKXByaW50Zigic2VnICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLSNpZmRlZglQUklOVF9OU1BEQVRBCi0JCSAgICBpZiAobnNwbGVuID4gZGF0YV9vZmYpIHsKLQkJCWRwID0gJihuc3BwW2RhdGFfb2ZmXSk7Ci0JCQlUQ0hFQ0syKCpkcCwgbnNwbGVuIC0gZGF0YV9vZmYpOwotCQkJcGRhdGEoZHAsIG5zcGxlbiAtIGRhdGFfb2ZmKTsKLQkJICAgIH0KLSNlbmRpZgotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIE1GU19JTFMrTUZTX0lOVDoKLQkJcHJpbnRmKCJpbnRyICIpOwotCQl7Ci0JCSAgICBzdHJ1Y3Qgc2VnaGRyICpzaHAgPSAoc3RydWN0IHNlZ2hkciAqKW5zcHA7Ci0JCSAgICBpbnQgYWNrOwotI2lmZGVmCVBSSU5UX05TUERBVEEKLQkJICAgIHVfY2hhciAqZHA7Ci0jZW5kaWYKLQkJICAgIHVfaW50IGRhdGFfb2ZmID0gc2l6ZW9mKHN0cnVjdCBtaW5zZWdoZHIpOwotCi0JCSAgICBpZiAobnNwbGVuIDwgZGF0YV9vZmYpCi0JCQlnb3RvIHRydW5jOwotCQkgICAgVENIRUNLKHNocC0+c2hfc2VxWzBdKTsKLQkJICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzBdKTsKLQkJICAgIGlmIChhY2sgJiBTR1FfQUNLKSB7CS8qIGFja251bSBmaWVsZCAqLwotCQkJaWYgKChhY2sgJiBTR1FfTkFLKSA9PSBTR1FfTkFLKQotCQkJICAgICh2b2lkKXByaW50ZigibmFrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCWVsc2UKLQkJCSAgICAodm9pZClwcmludGYoImFjayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7Ci0JCQlkYXRhX29mZiArPSBzaXplb2Yoc2hvcnQpOwotCQkJaWYgKG5zcGxlbiA8IGRhdGFfb2ZmKQotCQkJICAgIGdvdG8gdHJ1bmM7Ci0JCQlUQ0hFQ0soc2hwLT5zaF9zZXFbMV0pOwotCQkgICAgICAgIGFjayA9IEVYVFJBQ1RfTEVfMTZCSVRTKHNocC0+c2hfc2VxWzFdKTsKLQkJCWlmIChhY2sgJiBTR1FfT0FDSykgewkvKiBhY2tkYXQgZmllbGQgKi8KLQkJCSAgICBpZiAoKGFjayAmIFNHUV9PTkFLKSA9PSBTR1FfT05BSykKLQkJCQkodm9pZClwcmludGYoIm5ha2RhdCAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7Ci0JCQkgICAgZWxzZQotCQkJCSh2b2lkKXByaW50ZigiYWNrZGF0ICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCSAgICBkYXRhX29mZiArPSBzaXplb2Yoc2hvcnQpOwotCQkJICAgIGlmIChuc3BsZW4gPCBkYXRhX29mZikKLQkJCQlnb3RvIHRydW5jOwotCQkJICAgIFRDSEVDSyhzaHAtPnNoX3NlcVsyXSk7Ci0JCQkgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoc2hwLT5zaF9zZXFbMl0pOwotCQkJfQotCQkgICAgfQotCQkgICAgKHZvaWQpcHJpbnRmKCJzZWcgJWQgIiwgYWNrICYgU0dRX01BU0spOwotI2lmZGVmCVBSSU5UX05TUERBVEEKLQkJICAgIGlmIChuc3BsZW4gPiBkYXRhX29mZikgewotCQkJZHAgPSAmKG5zcHBbZGF0YV9vZmZdKTsKLQkJCVRDSEVDSzIoKmRwLCBuc3BsZW4gLSBkYXRhX29mZik7Ci0JCQlwZGF0YShkcCwgbnNwbGVuIC0gZGF0YV9vZmYpOwotCQkgICAgfQotI2VuZGlmCi0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgTUZTX0lMUzoKLQkJKHZvaWQpcHJpbnRmKCJsaW5rLXNlcnZpY2UgJWQ+JWQgIiwgc3JjLCBkc3QpOwotCQl7Ci0JCSAgICBzdHJ1Y3Qgc2VnaGRyICpzaHAgPSAoc3RydWN0IHNlZ2hkciAqKW5zcHA7Ci0JCSAgICBzdHJ1Y3QgbHNtc2cgKmxzbXAgPQotCQkJKHN0cnVjdCBsc21zZyAqKSYobnNwcFtzaXplb2Yoc3RydWN0IHNlZ2hkcildKTsKLQkJICAgIGludCBhY2s7Ci0JCSAgICBpbnQgbHNmbGFncywgZmN2YWw7Ci0KLQkJICAgIGlmIChuc3BsZW4gPCBzaXplb2Yoc3RydWN0IHNlZ2hkcikgKyBzaXplb2Yoc3RydWN0IGxzbXNnKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCSAgICBUQ0hFQ0soc2hwLT5zaF9zZXFbMF0pOwotCQkgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoc2hwLT5zaF9zZXFbMF0pOwotCQkgICAgaWYgKGFjayAmIFNHUV9BQ0spIHsJLyogYWNrbnVtIGZpZWxkICovCi0JCQlpZiAoKGFjayAmIFNHUV9OQUspID09IFNHUV9OQUspCi0JCQkgICAgKHZvaWQpcHJpbnRmKCJuYWsgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkJZWxzZQotCQkJICAgICh2b2lkKXByaW50ZigiYWNrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCVRDSEVDSyhzaHAtPnNoX3NlcVsxXSk7Ci0JCSAgICAgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoc2hwLT5zaF9zZXFbMV0pOwotCQkJaWYgKGFjayAmIFNHUV9PQUNLKSB7CS8qIGFja2RhdCBmaWVsZCAqLwotCQkJICAgIGlmICgoYWNrICYgU0dRX09OQUspID09IFNHUV9PTkFLKQotCQkJCSh2b2lkKXByaW50ZigibmFrZGF0ICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCSAgICBlbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCJhY2tkYXQgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkJICAgIFRDSEVDSyhzaHAtPnNoX3NlcVsyXSk7Ci0JCQkgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoc2hwLT5zaF9zZXFbMl0pOwotCQkJfQotCQkgICAgfQotCQkgICAgKHZvaWQpcHJpbnRmKCJzZWcgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkgICAgVENIRUNLKCpsc21wKTsKLQkJICAgIGxzZmxhZ3MgPSBFWFRSQUNUX0xFXzhCSVRTKGxzbXAtPmxzX2xzZmxhZ3MpOwotCQkgICAgZmN2YWwgPSBFWFRSQUNUX0xFXzhCSVRTKGxzbXAtPmxzX2ZjdmFsKTsKLQkJICAgIHN3aXRjaCAobHNmbGFncyAmIExTSV9NQVNLKSB7Ci0JCSAgICBjYXNlIExTSV9EQVRBOgotCQkJKHZvaWQpcHJpbnRmKCJkYXQgc2VnIGNvdW50ICVkICIsIGZjdmFsKTsKLQkJCXN3aXRjaCAobHNmbGFncyAmIExTTV9NQVNLKSB7Ci0JCQljYXNlIExTTV9OT0NIQU5HRToKLQkJCSAgICBicmVhazsKLQkJCWNhc2UgTFNNX0RPTk9UU0VORDoKLQkJCSAgICAodm9pZClwcmludGYoImRvbm90c2VuZC1kYXRhICIpOwotCQkJICAgIGJyZWFrOwotCQkJY2FzZSBMU01fU0VORDoKLQkJCSAgICAodm9pZClwcmludGYoInNlbmQtZGF0YSAiKTsKLQkJCSAgICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgICAgKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1mY21vZD8gJXgiLCBsc2ZsYWdzKTsKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQkgICAgY2FzZSBMU0lfSU5UUjoKLQkJCSh2b2lkKXByaW50ZigiaW50ciByZXEgY291bnQgJWQgIiwgZmN2YWwpOwotCQkJYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkJKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1mY3ZhbC1pbnQ/ICV4IiwgbHNmbGFncyk7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJfQotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1zdWJ0eXBlPyAleCAlZCA+ICVkIiwgZmxhZ3MsIHNyYywgZHN0KTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBNRlRfQUNLOgotCSAgICBzd2l0Y2ggKGZsYWdzICYgTlNQX1NVQk1BU0spIHsKLQkgICAgY2FzZSBNRlNfREFDSzoKLQkJKHZvaWQpcHJpbnRmKCJkYXRhLWFjayAlZD4lZCAiLCBzcmMsIGRzdCk7Ci0JCXsKLQkJICAgIHN0cnVjdCBhY2ttc2cgKmFtcCA9IChzdHJ1Y3QgYWNrbXNnICopbnNwcDsKLQkJICAgIGludCBhY2s7Ci0KLQkJICAgIGlmIChuc3BsZW4gPCBzaXplb2Yoc3RydWN0IGFja21zZykpCi0JCQlnb3RvIHRydW5jOwotCQkgICAgVENIRUNLKCphbXApOwotCQkgICAgYWNrID0gRVhUUkFDVF9MRV8xNkJJVFMoYW1wLT5ha19hY2tudW1bMF0pOwotCQkgICAgaWYgKGFjayAmIFNHUV9BQ0spIHsJLyogYWNrbnVtIGZpZWxkICovCi0JCQlpZiAoKGFjayAmIFNHUV9OQUspID09IFNHUV9OQUspCi0JCQkgICAgKHZvaWQpcHJpbnRmKCJuYWsgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkJZWxzZQotCQkJICAgICh2b2lkKXByaW50ZigiYWNrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJICAgICAgICBhY2sgPSBFWFRSQUNUX0xFXzE2QklUUyhhbXAtPmFrX2Fja251bVsxXSk7Ci0JCQlpZiAoYWNrICYgU0dRX09BQ0spIHsJLyogYWNrb3RoIGZpZWxkICovCi0JCQkgICAgaWYgKChhY2sgJiBTR1FfT05BSykgPT0gU0dRX09OQUspCi0JCQkJKHZvaWQpcHJpbnRmKCJvbmFrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCSAgICBlbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCJvYWNrICVkICIsIGFjayAmIFNHUV9NQVNLKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBNRlNfSUFDSzoKLQkJKHZvaWQpcHJpbnRmKCJpbHMtYWNrICVkPiVkICIsIHNyYywgZHN0KTsKLQkJewotCQkgICAgc3RydWN0IGFja21zZyAqYW1wID0gKHN0cnVjdCBhY2ttc2cgKiluc3BwOwotCQkgICAgaW50IGFjazsKLQotCQkgICAgaWYgKG5zcGxlbiA8IHNpemVvZihzdHJ1Y3QgYWNrbXNnKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCSAgICBUQ0hFQ0soKmFtcCk7Ci0JCSAgICBhY2sgPSBFWFRSQUNUX0xFXzE2QklUUyhhbXAtPmFrX2Fja251bVswXSk7Ci0JCSAgICBpZiAoYWNrICYgU0dRX0FDSykgewkvKiBhY2tudW0gZmllbGQgKi8KLQkJCWlmICgoYWNrICYgU0dRX05BSykgPT0gU0dRX05BSykKLQkJCSAgICAodm9pZClwcmludGYoIm5hayAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7Ci0JCQllbHNlCi0JCQkgICAgKHZvaWQpcHJpbnRmKCJhY2sgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkJVENIRUNLKGFtcC0+YWtfYWNrbnVtWzFdKTsKLQkJICAgICAgICBhY2sgPSBFWFRSQUNUX0xFXzE2QklUUyhhbXAtPmFrX2Fja251bVsxXSk7Ci0JCQlpZiAoYWNrICYgU0dRX09BQ0spIHsJLyogYWNrZGF0IGZpZWxkICovCi0JCQkgICAgaWYgKChhY2sgJiBTR1FfT05BSykgPT0gU0dRX09OQUspCi0JCQkJKHZvaWQpcHJpbnRmKCJuYWtkYXQgJWQgIiwgYWNrICYgU0dRX01BU0spOwotCQkJICAgIGVsc2UKLQkJCQkodm9pZClwcmludGYoImFja2RhdCAlZCAiLCBhY2sgJiBTR1FfTUFTSyk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgTUZTX0NBQ0s6Ci0JCSh2b2lkKXByaW50ZigiY29ubi1hY2sgJWQiLCBkc3QpOwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJKHZvaWQpcHJpbnRmKCJyZXNlcnZlZC1hY2t0eXBlPyAleCAlZCA+ICVkIiwgZmxhZ3MsIHNyYywgZHN0KTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBNRlRfQ1RMOgotCSAgICBzd2l0Y2ggKGZsYWdzICYgTlNQX1NVQk1BU0spIHsKLQkgICAgY2FzZSBNRlNfQ0k6Ci0JICAgIGNhc2UgTUZTX1JDSToKLQkJaWYgKChmbGFncyAmIE5TUF9TVUJNQVNLKSA9PSBNRlNfQ0kpCi0JCSAgICAodm9pZClwcmludGYoImNvbm4taW5pdGlhdGUgIik7Ci0JCWVsc2UKLQkJICAgICh2b2lkKXByaW50ZigicmV0cmFucy1jb25uLWluaXRpYXRlICIpOwotCQkodm9pZClwcmludGYoIiVkPiVkICIsIHNyYywgZHN0KTsKLQkJewotCQkgICAgc3RydWN0IGNpbXNnICpjaW1wID0gKHN0cnVjdCBjaW1zZyAqKW5zcHA7Ci0JCSAgICBpbnQgc2VydmljZXMsIGluZm8sIHNlZ3NpemU7Ci0jaWZkZWYJUFJJTlRfTlNQREFUQQotCQkgICAgdV9jaGFyICpkcDsKLSNlbmRpZgotCi0JCSAgICBpZiAobnNwbGVuIDwgc2l6ZW9mKHN0cnVjdCBjaW1zZykpCi0JCQlnb3RvIHRydW5jOwotCQkgICAgVENIRUNLKCpjaW1wKTsKLQkJICAgIHNlcnZpY2VzID0gRVhUUkFDVF9MRV84QklUUyhjaW1wLT5jaV9zZXJ2aWNlcyk7Ci0JCSAgICBpbmZvID0gRVhUUkFDVF9MRV84QklUUyhjaW1wLT5jaV9pbmZvKTsKLQkJICAgIHNlZ3NpemUgPSBFWFRSQUNUX0xFXzE2QklUUyhjaW1wLT5jaV9zZWdzaXplKTsKLQotCQkgICAgc3dpdGNoIChzZXJ2aWNlcyAmIENPU19NQVNLKSB7Ci0JCSAgICBjYXNlIENPU19OT05FOgotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIENPU19TRUdNRU5UOgotCQkJKHZvaWQpcHJpbnRmKCJzZWcgIik7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgQ09TX01FU1NBR0U6Ci0JCQkodm9pZClwcmludGYoIm1zZyAiKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBDT1NfQ1JZUFRTRVI6Ci0JCQkodm9pZClwcmludGYoImNyeXB0ICIpOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICBzd2l0Y2ggKGluZm8gJiBDT0lfTUFTSykgewotCQkgICAgY2FzZSBDT0lfMzI6Ci0JCQkodm9pZClwcmludGYoInZlciAzLjIgIik7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgQ09JXzMxOgotCQkJKHZvaWQpcHJpbnRmKCJ2ZXIgMy4xICIpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIENPSV80MDoKLQkJCSh2b2lkKXByaW50ZigidmVyIDQuMCAiKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBDT0lfNDE6Ci0JCQkodm9pZClwcmludGYoInZlciA0LjEgIik7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgICh2b2lkKXByaW50Zigic2Vnc2l6ZSAlZCAiLCBzZWdzaXplKTsKLSNpZmRlZglQUklOVF9OU1BEQVRBCi0JCSAgICBpZiAobnNwbGVuID4gc2l6ZW9mKHN0cnVjdCBjaW1zZykpIHsKLQkJCWRwID0gJihuc3BwW3NpemVvZihzdHJ1Y3QgY2ltc2cpXSk7Ci0JCQlUQ0hFQ0syKCpkcCwgbnNwbGVuIC0gc2l6ZW9mKHN0cnVjdCBjaW1zZykpOwotCQkJcGRhdGEoZHAsIG5zcGxlbiAtIHNpemVvZihzdHJ1Y3QgY2ltc2cpKTsKLQkJICAgIH0KLSNlbmRpZgotCQl9Ci0JCWJyZWFrOwotCSAgICBjYXNlIE1GU19DQzoKLQkJKHZvaWQpcHJpbnRmKCJjb25uLWNvbmZpcm0gJWQ+JWQgIiwgc3JjLCBkc3QpOwotCQl7Ci0JCSAgICBzdHJ1Y3QgY2Ntc2cgKmNjbXAgPSAoc3RydWN0IGNjbXNnICopbnNwcDsKLQkJICAgIGludCBzZXJ2aWNlcywgaW5mbzsKLQkJICAgIHVfaW50IHNlZ3NpemUsIG9wdGxlbjsKLSNpZmRlZglQUklOVF9OU1BEQVRBCi0JCSAgICB1X2NoYXIgKmRwOwotI2VuZGlmCi0KLQkJICAgIGlmIChuc3BsZW4gPCBzaXplb2Yoc3RydWN0IGNjbXNnKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCSAgICBUQ0hFQ0soKmNjbXApOwotCQkgICAgc2VydmljZXMgPSBFWFRSQUNUX0xFXzhCSVRTKGNjbXAtPmNjX3NlcnZpY2VzKTsKLQkJICAgIGluZm8gPSBFWFRSQUNUX0xFXzhCSVRTKGNjbXAtPmNjX2luZm8pOwotCQkgICAgc2Vnc2l6ZSA9IEVYVFJBQ1RfTEVfMTZCSVRTKGNjbXAtPmNjX3NlZ3NpemUpOwotCQkgICAgb3B0bGVuID0gRVhUUkFDVF9MRV84QklUUyhjY21wLT5jY19vcHRsZW4pOwotCi0JCSAgICBzd2l0Y2ggKHNlcnZpY2VzICYgQ09TX01BU0spIHsKLQkJICAgIGNhc2UgQ09TX05PTkU6Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgQ09TX1NFR01FTlQ6Ci0JCQkodm9pZClwcmludGYoInNlZyAiKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBDT1NfTUVTU0FHRToKLQkJCSh2b2lkKXByaW50ZigibXNnICIpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIENPU19DUllQVFNFUjoKLQkJCSh2b2lkKXByaW50ZigiY3J5cHQgIik7Ci0JCQlicmVhazsKLQkJICAgIH0KLQkJICAgIHN3aXRjaCAoaW5mbyAmIENPSV9NQVNLKSB7Ci0JCSAgICBjYXNlIENPSV8zMjoKLQkJCSh2b2lkKXByaW50ZigidmVyIDMuMiAiKTsKLQkJCWJyZWFrOwotCQkgICAgY2FzZSBDT0lfMzE6Ci0JCQkodm9pZClwcmludGYoInZlciAzLjEgIik7Ci0JCQlicmVhazsKLQkJICAgIGNhc2UgQ09JXzQwOgotCQkJKHZvaWQpcHJpbnRmKCJ2ZXIgNC4wICIpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIENPSV80MToKLQkJCSh2b2lkKXByaW50ZigidmVyIDQuMSAiKTsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgKHZvaWQpcHJpbnRmKCJzZWdzaXplICVkICIsIHNlZ3NpemUpOwotCQkgICAgaWYgKG9wdGxlbikgewotCQkJKHZvaWQpcHJpbnRmKCJvcHRsZW4gJWQgIiwgb3B0bGVuKTsKLSNpZmRlZglQUklOVF9OU1BEQVRBCi0JCQlpZiAob3B0bGVuID4gbnNwbGVuIC0gc2l6ZW9mKHN0cnVjdCBjY21zZykpCi0JCQkgICAgZ290byB0cnVuYzsKLQkJCWRwID0gJihuc3BwW3NpemVvZihzdHJ1Y3QgY2Ntc2cpXSk7Ci0JCQlUQ0hFQ0syKCpkcCwgb3B0bGVuKTsKLQkJCXBkYXRhKGRwLCBvcHRsZW4pOwotI2VuZGlmCi0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgTUZTX0RJOgotCQkodm9pZClwcmludGYoImRpc2Nvbm4taW5pdGlhdGUgJWQ+JWQgIiwgc3JjLCBkc3QpOwotCQl7Ci0JCSAgICBzdHJ1Y3QgZGltc2cgKmRpbXAgPSAoc3RydWN0IGRpbXNnICopbnNwcDsKLQkJICAgIGludCByZWFzb247Ci0JCSAgICB1X2ludCBvcHRsZW47Ci0jaWZkZWYJUFJJTlRfTlNQREFUQQotCQkgICAgdV9jaGFyICpkcDsKLSNlbmRpZgotCi0JCSAgICBpZiAobnNwbGVuIDwgc2l6ZW9mKHN0cnVjdCBkaW1zZykpCi0JCQlnb3RvIHRydW5jOwotCQkgICAgVENIRUNLKCpkaW1wKTsKLQkJICAgIHJlYXNvbiA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRpbXAtPmRpX3JlYXNvbik7Ci0JCSAgICBvcHRsZW4gPSBFWFRSQUNUX0xFXzhCSVRTKGRpbXAtPmRpX29wdGxlbik7Ci0KLQkJICAgIHByaW50X3JlYXNvbihyZWFzb24pOwotCQkgICAgaWYgKG9wdGxlbikgewotCQkJKHZvaWQpcHJpbnRmKCJvcHRsZW4gJWQgIiwgb3B0bGVuKTsKLSNpZmRlZglQUklOVF9OU1BEQVRBCi0JCQlpZiAob3B0bGVuID4gbnNwbGVuIC0gc2l6ZW9mKHN0cnVjdCBkaW1zZykpCi0JCQkgICAgZ290byB0cnVuYzsKLQkJCWRwID0gJihuc3BwW3NpemVvZihzdHJ1Y3QgZGltc2cpXSk7Ci0JCQlUQ0hFQ0syKCpkcCwgb3B0bGVuKTsKLQkJCXBkYXRhKGRwLCBvcHRsZW4pOwotI2VuZGlmCi0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIGNhc2UgTUZTX0RDOgotCQkodm9pZClwcmludGYoImRpc2Nvbm4tY29uZmlybSAlZD4lZCAiLCBzcmMsIGRzdCk7Ci0JCXsKLQkJICAgIHN0cnVjdCBkY21zZyAqZGNtcCA9IChzdHJ1Y3QgZGNtc2cgKiluc3BwOwotCQkgICAgaW50IHJlYXNvbjsKLQotCQkgICAgVENIRUNLKCpkY21wKTsKLQkJICAgIHJlYXNvbiA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRjbXAtPmRjX3JlYXNvbik7Ci0KLQkJICAgIHByaW50X3JlYXNvbihyZWFzb24pOwotCQl9Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQkodm9pZClwcmludGYoInJlc2VydmVkLWN0bHR5cGU/ICV4ICVkID4gJWQiLCBmbGFncywgc3JjLCBkc3QpOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicmVhazsKLQlkZWZhdWx0OgotCSAgICAodm9pZClwcmludGYoInJlc2VydmVkLXR5cGU/ICV4ICVkID4gJWQiLCBmbGFncywgc3JjLCBkc3QpOwotCSAgICBicmVhazsKLQl9Ci0JcmV0dXJuICgxKTsKLQotdHJ1bmM6Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHN0cnVjdCB0b2sgcmVhc29uMnN0cltdID0gewotCXsgVUNfT0JKUkVKRUNULAkJIm9iamVjdCByZWplY3RlZCBjb25uZWN0IiB9LAotCXsgVUNfUkVTT1VSQ0VTLAkJImluc3VmZmljaWVudCByZXNvdXJjZXMiIH0sCi0JeyBVQ19OT1NVQ0hOT0RFLAkidW5yZWNvZ25pemVkIG5vZGUgbmFtZSIgfSwKLQl7IERJX1NIVVQsCQkibm9kZSBpcyBzaHV0dGluZyBkb3duIiB9LAotCXsgVUNfTk9TVUNIT0JKLAkJInVucmVjb2duaXplZCBvYmplY3QiIH0sCi0JeyBVQ19JTlZPQkpGT1JNQVQsCSJpbnZhbGlkIG9iamVjdCBuYW1lIGZvcm1hdCIgfSwKLQl7IFVDX09CSlRPT0JVU1ksCSJvYmplY3QgdG9vIGJ1c3kiIH0sCi0JeyBESV9QUk9UT0NPTCwJCSJwcm90b2NvbCBlcnJvciBkaXNjb3ZlcmVkIiB9LAotCXsgRElfVFBBLAkJInRoaXJkIHBhcnR5IGFib3J0IiB9LAotCXsgVUNfVVNFUkFCT1JULAkJInVzZXIgYWJvcnQiIH0sCi0JeyBVQ19JTlZOT0RFRk9STUFULAkiaW52YWxpZCBub2RlIG5hbWUgZm9ybWF0IiB9LAotCXsgVUNfTE9DQUxTSFVULAkJImxvY2FsIG5vZGUgc2h1dHRpbmcgZG93biIgfSwKLQl7IERJX0xPQ0FMUkVTUkMsCSJpbnN1ZmZpY2llbnQgbG9jYWwgcmVzb3VyY2VzIiB9LAotCXsgRElfUkVNVVNFUlJFU1JDLAkiaW5zdWZmaWNpZW50IHJlbW90ZSB1c2VyIHJlc291cmNlcyIgfSwKLQl7IFVDX0FDQ0VTU1JFSkVDVCwJImludmFsaWQgYWNjZXNzIGNvbnRyb2wgaW5mb3JtYXRpb24iIH0sCi0JeyBESV9CQURBQ0NOVCwJCSJiYWQgQUNDT1VOVCBpbmZvcm1hdGlvbiIgfSwKLQl7IFVDX05PUkVTUE9OU0UsCSJubyByZXNwb25zZSBmcm9tIG9iamVjdCIgfSwKLQl7IFVDX1VOUkVBQ0hBQkxFLAkibm9kZSB1bnJlYWNoYWJsZSIgfSwKLQl7IERDX05PTElOSywJCSJubyBsaW5rIHRlcm1pbmF0ZSIgfSwKLQl7IERDX0NPTVBMRVRFLAkJImRpc2Nvbm5lY3QgY29tcGxldGUiIH0sCi0JeyBESV9CQURJTUFHRSwJCSJiYWQgaW1hZ2UgZGF0YSBpbiBjb25uZWN0IiB9LAotCXsgRElfU0VSVk1JU01BVENILAkiY3J5cHRvZ3JhcGhpYyBzZXJ2aWNlIG1pc21hdGNoIiB9LAotCXsgMCwJCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9yZWFzb24ocmVnaXN0ZXIgaW50IHJlYXNvbikKLXsKLQlwcmludGYoIiVzICIsIHRvazJzdHIocmVhc29uMnN0ciwgInJlYXNvbi0lZCIsIHJlYXNvbikpOwotfQotCi1jb25zdCBjaGFyICoKLWRubnVtX3N0cmluZyh1X3Nob3J0IGRuYWRkcikKLXsKLQljaGFyICpzdHI7Ci0Jc2l6ZV90IHNpejsKLQlpbnQgYXJlYSA9ICh1X3Nob3J0KShkbmFkZHIgJiBBUkVBTUFTSykgPj4gQVJFQVNISUZUOwotCWludCBub2RlID0gZG5hZGRyICYgTk9ERU1BU0s7Ci0KLQlzdHIgPSAoY2hhciAqKW1hbGxvYyhzaXogPSBzaXplb2YoIjAwLjAwMDAiKSk7Ci0JaWYgKHN0ciA9PSBOVUxMKQotCQllcnJvcigiZG5udW1fc3RyaW5nOiBtYWxsb2MiKTsKLQlzbnByaW50ZihzdHIsIHNpeiwgIiVkLiVkIiwgYXJlYSwgbm9kZSk7Ci0JcmV0dXJuKHN0cik7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZG5uYW1lX3N0cmluZyh1X3Nob3J0IGRuYWRkcikKLXsKLSNpZmRlZiBIQVZFX0RORVRfSFRPQQotCXN0cnVjdCBkbl9uYWRkciBkbmE7Ci0KLQlkbmEuYV9sZW4gPSBzaXplb2Yoc2hvcnQpOwotCW1lbWNweSgoY2hhciAqKWRuYS5hX2FkZHIsIChjaGFyICopJmRuYWRkciwgc2l6ZW9mKHNob3J0KSk7Ci0JcmV0dXJuIChzdHJkdXAoZG5ldF9odG9hKCZkbmEpKSk7Ci0jZWxzZQotCXJldHVybihkbm51bV9zdHJpbmcoZG5hZGRyKSk7CS8qIHB1bnQgKi8KLSNlbmRpZgotfQotCi0jaWZkZWYJUFJJTlRfTlNQREFUQQotc3RhdGljIHZvaWQKLXBkYXRhKHVfY2hhciAqZHAsIHVfaW50IG1heGxlbikKLXsKLQljaGFyIGM7Ci0JdV9pbnQgeCA9IG1heGxlbjsKLQotCXdoaWxlICh4LS0gPiAwKSB7Ci0JICAgIGMgPSAqZHArKzsKLQkgICAgc2FmZXB1dGNoYXIoYyk7Ci0JfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9wcmludC1kaGNwNi5jIGIvcHJpbnQtZGhjcDYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0OTk5ZC4uMDAwMDAwMAotLS0gYS9wcmludC1kaGNwNi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTggYW5kIDE5OTkgV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLS8qCi0gKiBSRkMzMzE1OiBESENQdjYKLSAqIHN1cHBvcnRlZCBESENQdjYgb3B0aW9uczogCi0gKiAgUkZDMzMxOSwKLSAqICBSRkMzNjMzLAotICogIFJGQzM2NDYsCi0gKiAgUkZDMzg5OCwKLSAqICBSRkM0MDc1LAotICogIFJGQzQyNDIsCi0gKiAgUkZDNDI4MCwKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1kaGNwNi5jLHYgMS4zNS4yLjEgMjAwNi8xMC8yNSAyMjowNDozNiBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotLyogbGVhc2UgZHVyYXRpb24gKi8KLSNkZWZpbmUgREhDUDZfRFVSQVRJVElPTl9JTkZJTklURSAweGZmZmZmZmZmCi0KLS8qIEVycm9yIFZhbHVlcyAqLwotI2RlZmluZSBESDZFUlJfRkFJTFVSRQkJMTYKLSNkZWZpbmUgREg2RVJSX0FVVEhGQUlMCQkxNwotI2RlZmluZSBESDZFUlJfUE9PUkxZRk9STUVECTE4Ci0jZGVmaW5lIERINkVSUl9VTkFWQUlMCQkxOQotI2RlZmluZSBESDZFUlJfT1BUVU5BVkFJTAkyMAotCi0vKiBNZXNzYWdlIHR5cGUgKi8KLSNkZWZpbmUgREg2X1NPTElDSVQJMQotI2RlZmluZSBESDZfQURWRVJUSVNFCTIKLSNkZWZpbmUgREg2X1JFUVVFU1QJMwotI2RlZmluZSBESDZfQ09ORklSTQk0Ci0jZGVmaW5lIERINl9SRU5FVwk1Ci0jZGVmaW5lIERINl9SRUJJTkQJNgotI2RlZmluZSBESDZfUkVQTFkJNwotI2RlZmluZSBESDZfUkVMRUFTRQk4Ci0jZGVmaW5lIERINl9ERUNMSU5FCTkKLSNkZWZpbmUgREg2X1JFQ09ORklHVVJFCTEwCi0jZGVmaW5lIERINl9JTkZPUk1fUkVRCTExCi0jZGVmaW5lIERINl9SRUxBWV9GT1JXCTEyCi0jZGVmaW5lIERINl9SRUxBWV9SRVBMWQkxMwotCi0vKiBESENQNiBiYXNlIHBhY2tldCBmb3JtYXQgKi8KLXN0cnVjdCBkaGNwNiB7Ci0JdW5pb24gewotCQl1X2ludDhfdCBtOwotCQl1X2ludDMyX3QgeDsKLQl9IGRoNl9tc2d0eXBleGlkOwotCS8qIG9wdGlvbnMgZm9sbG93ICovCi19OwotI2RlZmluZSBkaDZfbXNndHlwZQlkaDZfbXNndHlwZXhpZC5tCi0jZGVmaW5lIGRoNl94aWQJCWRoNl9tc2d0eXBleGlkLngKLSNkZWZpbmUgREg2X1hJRE1BU0sJMHgwMGZmZmZmZgotCi0vKiBESENQdjYgcmVsYXkgbWVzc2FnZXMgKi8KLXN0cnVjdCBkaGNwNl9yZWxheSB7Ci0JdV9pbnQ4X3QgZGg2cmVsYXlfbXNndHlwZTsKLQl1X2ludDhfdCBkaDZyZWxheV9oY250OwotCXVfaW50OF90IGRoNnJlbGF5X2xpbmthZGRyWzE2XTsJLyogWFhYOiBiYWRseSBhbGlnbmVkICovCi0JdV9pbnQ4X3QgZGg2cmVsYXlfcGVlcmFkZHJbMTZdOwotCS8qIG9wdGlvbnMgZm9sbG93ICovCi19OwotCi0vKiBvcHRpb25zICovCi0jZGVmaW5lIERINk9QVF9DTElFTlRJRAkxCi0jZGVmaW5lIERINk9QVF9TRVJWRVJJRAkyCi0jZGVmaW5lIERINk9QVF9JQV9OQSAzCi0jZGVmaW5lIERINk9QVF9JQV9UQSA0Ci0jZGVmaW5lIERINk9QVF9JQV9BRERSIDUKLSNkZWZpbmUgREg2T1BUX09STyA2Ci0jZGVmaW5lIERINk9QVF9QUkVGRVJFTkNFIDcKLSMgIGRlZmluZSBESDZPUFRfUFJFRl9NQVggMjU1Ci0jZGVmaW5lIERINk9QVF9FTEFQU0VEX1RJTUUgOAotI2RlZmluZSBESDZPUFRfUkVMQVlfTVNHIDkKLS8qI2RlZmluZSBESDZPUFRfU0VSVkVSX01TRyAxMCBkZXByZWNhdGVkICovCi0jZGVmaW5lIERINk9QVF9BVVRIIDExCi0jICBkZWZpbmUgREg2T1BUX0FVVEhQUk9UT19ERUxBWUVEIDIKLSMgIGRlZmluZSBESDZPUFRfQVVUSFBST1RPX1JFQ09ORklHIDMKLSMgIGRlZmluZSBESDZPUFRfQVVUSEFMR19ITUFDTUQ1IDEKLSMgIGRlZmluZSBESDZPUFRfQVVUSFJETV9NT05PQ09VTlRFUiAwCi0jICBkZWZpbmUgREg2T1BUX0FVVEhSRUNPTkZJR19LRVkgMQotIyAgZGVmaW5lIERINk9QVF9BVVRIUkVDT05GSUdfSE1BQ01ENSAyCi0jZGVmaW5lIERINk9QVF9VTklDQVNUIDEyCi0jZGVmaW5lIERINk9QVF9TVEFUVVNfQ09ERSAxMwotIyAgZGVmaW5lIERINk9QVF9TVENPREVfU1VDQ0VTUyAwCi0jICBkZWZpbmUgREg2T1BUX1NUQ09ERV9VTlNQRUNGQUlMIDEKLSMgIGRlZmluZSBESDZPUFRfU1RDT0RFX05PQUREUkFWQUlMIDIKLSMgIGRlZmluZSBESDZPUFRfU1RDT0RFX05PQklORElORyAzCi0jICBkZWZpbmUgREg2T1BUX1NUQ09ERV9OT1RPTkxJTksgNAotIyAgZGVmaW5lIERINk9QVF9TVENPREVfVVNFTVVMVElDQVNUIDUKLSMgIGRlZmluZSBESDZPUFRfU1RDT0RFX05PUFJFRklYQVZBSUwgNgotI2RlZmluZSBESDZPUFRfUkFQSURfQ09NTUlUIDE0Ci0jZGVmaW5lIERINk9QVF9VU0VSX0NMQVNTIDE1Ci0jZGVmaW5lIERINk9QVF9WRU5ET1JfQ0xBU1MgMTYKLSNkZWZpbmUgREg2T1BUX1ZFTkRPUl9PUFRTIDE3Ci0jZGVmaW5lIERINk9QVF9JTlRFUkZBQ0VfSUQgMTgKLSNkZWZpbmUgREg2T1BUX1JFQ09ORl9NU0cgMTkKLSNkZWZpbmUgREg2T1BUX1JFQ09ORl9BQ0NFUFQgMjAKLSNkZWZpbmUgREg2T1BUX1NJUF9TRVJWRVJfRCAyMQotI2RlZmluZSBESDZPUFRfU0lQX1NFUlZFUl9BIDIyCi0jZGVmaW5lIERINk9QVF9ETlMgMjMKLSNkZWZpbmUgREg2T1BUX0ROU05BTUUgMjQKLSNkZWZpbmUgREg2T1BUX0lBX1BEIDI1Ci0jZGVmaW5lIERINk9QVF9JQV9QRF9QUkVGSVggMjYKLSNkZWZpbmUgREg2T1BUX05JU19TRVJWRVJTIDI3Ci0jZGVmaW5lIERINk9QVF9OSVNQX1NFUlZFUlMgMjgKLSNkZWZpbmUgREg2T1BUX05JU19OQU1FIDI5Ci0jZGVmaW5lIERINk9QVF9OSVNQX05BTUUgMzAKLSNkZWZpbmUgREg2T1BUX05UUF9TRVJWRVJTIDMxCi0jZGVmaW5lIERINk9QVF9MSUZFVElNRSAzMgotI2RlZmluZSBESDZPUFRfQkNNQ1NfU0VSVkVSX0QgMzMKLSNkZWZpbmUgREg2T1BUX0JDTUNTX1NFUlZFUl9BIDM0Ci0jZGVmaW5lIERINk9QVF9HRU9DT05GX0NJVklDIDM2Ci0jZGVmaW5lIERINk9QVF9SRU1PVEVfSUQgMzcKLSNkZWZpbmUgREg2T1BUX1NVQlNDUklCRVJfSUQgMzgKLSNkZWZpbmUgREg2T1BUX0NMSUVOVF9GUUROIDM5Ci0KLXN0cnVjdCBkaGNwNm9wdCB7Ci0JdV9pbnQxNl90IGRoNm9wdF90eXBlOwotCXVfaW50MTZfdCBkaDZvcHRfbGVuOwotCS8qIHR5cGUtZGVwZW5kZW50IGRhdGEgZm9sbG93cyAqLwotfTsKLQotc3RydWN0IGRoY3A2X2lhIHsKLQl1X2ludDE2X3QgZGg2b3B0X2lhX3R5cGU7Ci0JdV9pbnQxNl90IGRoNm9wdF9pYV9sZW47Ci0JdV9pbnQzMl90IGRoNm9wdF9pYV9pYWlkOwotCXVfaW50MzJfdCBkaDZvcHRfaWFfdDE7Ci0JdV9pbnQzMl90IGRoNm9wdF9pYV90MjsKLX07Ci0KLXN0cnVjdCBkaGNwNl9pYV9hZGRyIHsKLQl1X2ludDE2X3QgZGg2b3B0X2lhX2FkZHJfdHlwZTsKLQl1X2ludDE2X3QgZGg2b3B0X2lhX2FkZHJfbGVuOwotCXN0cnVjdCBpbjZfYWRkciBkaDZvcHRfaWFfYWRkcl9hZGRyOwotCXVfaW50MzJfdCBkaDZvcHRfaWFfYWRkcl9wbHRpbWU7Ci0JdV9pbnQzMl90IGRoNm9wdF9pYV9hZGRyX3ZsdGltZTsKLX0gIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Ci0KLXN0cnVjdCBkaGNwNl9pYV9wcmVmaXggewotCXVfaW50MTZfdCBkaDZvcHRfaWFfcHJlZml4X3R5cGU7Ci0JdV9pbnQxNl90IGRoNm9wdF9pYV9wcmVmaXhfbGVuOwotCXVfaW50MzJfdCBkaDZvcHRfaWFfcHJlZml4X3BsdGltZTsKLQl1X2ludDMyX3QgZGg2b3B0X2lhX3ByZWZpeF92bHRpbWU7Ci0JdV9pbnQ4X3QgZGg2b3B0X2lhX3ByZWZpeF9wbGVuOwotCXN0cnVjdCBpbjZfYWRkciBkaDZvcHRfaWFfcHJlZml4X2FkZHI7Ci19ICBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOwotCi1zdHJ1Y3QgZGhjcDZfYXV0aCB7Ci0JdV9pbnQxNl90IGRoNm9wdF9hdXRoX3R5cGU7Ci0JdV9pbnQxNl90IGRoNm9wdF9hdXRoX2xlbjsKLQl1X2ludDhfdCBkaDZvcHRfYXV0aF9wcm90bzsKLQl1X2ludDhfdCBkaDZvcHRfYXV0aF9hbGc7Ci0JdV9pbnQ4X3QgZGg2b3B0X2F1dGhfcmRtOwotCXVfaW50OF90IGRoNm9wdF9hdXRoX3JkaW5mb1s4XTsKLQkvKiBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBmb2xsb3dzICovCi19IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWRoY3A2b3B0X25hbWUoaW50IHR5cGUpCi17Ci0Jc3RhdGljIGNoYXIgZ2Vuc3RyW3NpemVvZigib3B0XzY1NTM1IikgKyAxXTsgLyogWFhYIHRocmVhZCB1bnNhZmUgKi8KLQotCWlmICh0eXBlID4gNjU1MzUpCi0JCXJldHVybiAiSU5WQUxJRCBvcHRpb24iOwotCi0Jc3dpdGNoKHR5cGUpIHsKLQljYXNlIERINk9QVF9DTElFTlRJRDoKLQkJcmV0dXJuICJjbGllbnQgSUQiOwotCWNhc2UgREg2T1BUX1NFUlZFUklEOgotCQlyZXR1cm4gInNlcnZlciBJRCI7Ci0JY2FzZSBESDZPUFRfSUFfTkE6Ci0JCXJldHVybiAiSUFfTkEiOwotCWNhc2UgREg2T1BUX0lBX1RBOgotCQlyZXR1cm4gIklBX1RBIjsKLQljYXNlIERINk9QVF9JQV9BRERSOgotCQlyZXR1cm4gIklBX0FERFIiOwotCWNhc2UgREg2T1BUX09STzoKLQkJcmV0dXJuICJvcHRpb24gcmVxdWVzdCI7Ci0JY2FzZSBESDZPUFRfUFJFRkVSRU5DRToKLQkJcmV0dXJuICJwcmVmZXJlbmNlIjsKLQljYXNlIERINk9QVF9FTEFQU0VEX1RJTUU6Ci0JCXJldHVybiAiZWxhcHNlZCB0aW1lIjsKLQljYXNlIERINk9QVF9SRUxBWV9NU0c6Ci0JCXJldHVybiAicmVsYXkgbWVzc2FnZSI7Ci0JY2FzZSBESDZPUFRfQVVUSDoKLQkJcmV0dXJuICJhdXRoZW50aWNhdGlvbiI7Ci0JY2FzZSBESDZPUFRfVU5JQ0FTVDoKLQkJcmV0dXJuICJzZXJ2ZXIgdW5pY2FzdCI7Ci0JY2FzZSBESDZPUFRfU1RBVFVTX0NPREU6Ci0JCXJldHVybiAic3RhdHVzIGNvZGUiOwotCWNhc2UgREg2T1BUX1JBUElEX0NPTU1JVDoKLQkJcmV0dXJuICJyYXBpZCBjb21taXQiOwotCWNhc2UgREg2T1BUX1VTRVJfQ0xBU1M6Ci0JCXJldHVybiAidXNlciBjbGFzcyI7Ci0JY2FzZSBESDZPUFRfVkVORE9SX0NMQVNTOgotCQlyZXR1cm4gInZlbmRvciBjbGFzcyI7Ci0JY2FzZSBESDZPUFRfVkVORE9SX09QVFM6Ci0JCXJldHVybiAidmVuZG9yLXNwZWNpZmljIGluZm8iOwotCWNhc2UgREg2T1BUX0lOVEVSRkFDRV9JRDoKLQkJcmV0dXJuICJpbnRlcmZhY2UgSUQiOwotCWNhc2UgREg2T1BUX1JFQ09ORl9NU0c6Ci0JCXJldHVybiAicmVjb25maWd1cmUgbWVzc2FnZSI7Ci0JY2FzZSBESDZPUFRfUkVDT05GX0FDQ0VQVDoKLQkJcmV0dXJuICJyZWNvbmZpZ3VyZSBhY2NlcHQiOwotCWNhc2UgREg2T1BUX1NJUF9TRVJWRVJfRDoKLQkJcmV0dXJuICJTSVAgc2VydmVycyBkb21haW4iOwotCWNhc2UgREg2T1BUX1NJUF9TRVJWRVJfQToKLQkJcmV0dXJuICJTSVAgc2VydmVycyBhZGRyZXNzIjsKLQljYXNlIERINk9QVF9ETlM6Ci0JCXJldHVybiAiRE5TIjsKLQljYXNlIERINk9QVF9ETlNOQU1FOgotCQlyZXR1cm4gIkROUyBuYW1lIjsKLQljYXNlIERINk9QVF9JQV9QRDoKLQkJcmV0dXJuICJJQV9QRCI7Ci0JY2FzZSBESDZPUFRfSUFfUERfUFJFRklYOgotCQlyZXR1cm4gIklBX1BEIHByZWZpeCI7Ci0JY2FzZSBESDZPUFRfTlRQX1NFUlZFUlM6Ci0JCXJldHVybiAiTlRQIFNlcnZlciI7Ci0JY2FzZSBESDZPUFRfTElGRVRJTUU6Ci0JCXJldHVybiAibGlmZXRpbWUiOwotCWNhc2UgREg2T1BUX05JU19TRVJWRVJTOgotCQlyZXR1cm4gIk5JUyBzZXJ2ZXIiOwotCWNhc2UgREg2T1BUX05JU1BfU0VSVkVSUzoKLQkJcmV0dXJuICJOSVMrIHNlcnZlciI7Ci0JY2FzZSBESDZPUFRfTklTX05BTUU6Ci0JCXJldHVybiAiTklTIGRvbWFpbiBuYW1lIjsKLQljYXNlIERINk9QVF9OSVNQX05BTUU6Ci0JCXJldHVybiAiTklTKyBkb21haW4gbmFtZSI7Ci0JY2FzZSBESDZPUFRfQkNNQ1NfU0VSVkVSX0Q6Ci0JCXJldHVybiAiQkNNQ1MgZG9tYWluIG5hbWUiOwotCWNhc2UgREg2T1BUX0JDTUNTX1NFUlZFUl9BOgotCQlyZXR1cm4gIkJDTUNTIHNlcnZlciI7Ci0JY2FzZSBESDZPUFRfR0VPQ09ORl9DSVZJQzoKLQkJcmV0dXJuICJHZW9jb25mIENpdmljIjsKLQljYXNlIERINk9QVF9SRU1PVEVfSUQ6Ci0JCXJldHVybiAiUmVtb3RlIElEIjsKLQljYXNlIERINk9QVF9TVUJTQ1JJQkVSX0lEOgotCQlyZXR1cm4gIlN1YnNjcmliZXIgSUQiOwotCWNhc2UgREg2T1BUX0NMSUVOVF9GUUROOgotCQlyZXR1cm4gIkNsaWVudCBGUUROIjsKLQlkZWZhdWx0OgotCQlzbnByaW50ZihnZW5zdHIsIHNpemVvZihnZW5zdHIpLCAib3B0XyVkIiwgdHlwZSk7Ci0JCXJldHVybihnZW5zdHIpOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZGhjcDZzdGNvZGUoaW50IGNvZGUpCi17Ci0Jc3RhdGljIGNoYXIgZ2Vuc3RyW3NpemVvZigiY29kZTI1NSIpICsgMV07IC8qIFhYWCB0aHJlYWQgdW5zYWZlICovCi0KLQlpZiAoY29kZSA+IDI1NSkKLQkJcmV0dXJuICJJTlZBTElEIGNvZGUiOwotCi0Jc3dpdGNoKGNvZGUpIHsKLQljYXNlIERINk9QVF9TVENPREVfU1VDQ0VTUzoKLQkJcmV0dXJuICJzdWNjZXNzIjsKLQljYXNlIERINk9QVF9TVENPREVfVU5TUEVDRkFJTDoKLQkJcmV0dXJuICJ1bnNwZWMgZmFpbHVyZSI7Ci0JY2FzZSBESDZPUFRfU1RDT0RFX05PQUREUkFWQUlMOgotCQlyZXR1cm4gIm5vIGFkZHJlc3NlcyI7Ci0JY2FzZSBESDZPUFRfU1RDT0RFX05PQklORElORzoKLQkJcmV0dXJuICJubyBiaW5kaW5nIjsKLQljYXNlIERINk9QVF9TVENPREVfTk9UT05MSU5LOgotCQlyZXR1cm4gIm5vdCBvbi1saW5rIjsKLQljYXNlIERINk9QVF9TVENPREVfVVNFTVVMVElDQVNUOgotCQlyZXR1cm4gInVzZSBtdWx0aWNhc3QiOwotCWNhc2UgREg2T1BUX1NUQ09ERV9OT1BSRUZJWEFWQUlMOgotCQlyZXR1cm4gIm5vIHByZWZpeGVzIjsKLQlkZWZhdWx0OgotCQlzbnByaW50ZihnZW5zdHIsIHNpemVvZihnZW5zdHIpLCAiY29kZSVkIiwgY29kZSk7Ci0JCXJldHVybihnZW5zdHIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWRoY3A2b3B0X3ByaW50KGNvbnN0IHVfY2hhciAqY3AsIGNvbnN0IHVfY2hhciAqZXApCi17Ci0Jc3RydWN0IGRoY3A2b3B0ICpkaDZvOwotCXVfY2hhciAqdHA7Ci0Jc2l6ZV90IGk7Ci0JdV9pbnQxNl90IG9wdHR5cGU7Ci0Jc2l6ZV90IG9wdGxlbjsKLQl1X2ludDE2X3QgdmFsMTY7Ci0JdV9pbnQzMl90IHZhbDMyOwotCXN0cnVjdCBkaGNwNl9pYSBpYTsKLQlzdHJ1Y3QgZGhjcDZfaWFfcHJlZml4IGlhX3ByZWZpeDsKLQlzdHJ1Y3QgZGhjcDZfaWFfYWRkciBpYV9hZGRyOwotCXN0cnVjdCBkaGNwNl9hdXRoIGF1dGhvcHQ7Ci0JdV9pbnQgYXV0aGluZm9sZW4sIGF1dGhyZWFsbWxlbjsKLQotCWlmIChjcCA9PSBlcCkKLQkJcmV0dXJuOwotCXdoaWxlIChjcCA8IGVwKSB7Ci0JCWlmIChlcCA8IGNwICsgc2l6ZW9mKCpkaDZvKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWRoNm8gPSAoc3RydWN0IGRoY3A2b3B0ICopY3A7Ci0JCW9wdGxlbiA9IEVYVFJBQ1RfMTZCSVRTKCZkaDZvLT5kaDZvcHRfbGVuKTsKLQkJaWYgKGVwIDwgY3AgKyBzaXplb2YoKmRoNm8pICsgb3B0bGVuKQotCQkJZ290byB0cnVuYzsKLQkJb3B0dHlwZSA9IEVYVFJBQ1RfMTZCSVRTKCZkaDZvLT5kaDZvcHRfdHlwZSk7Ci0JCXByaW50ZigiICglcyIsIGRoY3A2b3B0X25hbWUob3B0dHlwZSkpOwotCQlzd2l0Y2ggKG9wdHR5cGUpIHsKLQkJY2FzZSBESDZPUFRfQ0xJRU5USUQ6Ci0JCWNhc2UgREg2T1BUX1NFUlZFUklEOgotCQkJaWYgKG9wdGxlbiA8IDIpIHsKLQkJCQkvKigqLwotCQkJCXByaW50ZigiID8pIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl0cCA9ICh1X2NoYXIgKikoZGg2byArIDEpOwotCQkJc3dpdGNoIChFWFRSQUNUXzE2QklUUyh0cCkpIHsKLQkJCWNhc2UgMToKLQkJCQlpZiAob3B0bGVuID49IDIgKyA2KSB7Ci0JCQkJCXByaW50ZigiIGh3YWRkci90aW1lIHR5cGUgJXUgdGltZSAldSAiLAotCQkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJnRwWzJdKSwKLQkJCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZ0cFs0XSkpOwotCQkJCQlmb3IgKGkgPSA4OyBpIDwgb3B0bGVuOyBpKyspCi0JCQkJCQlwcmludGYoIiUwMngiLCB0cFtpXSk7Ci0JCQkJCS8qKCovCi0JCQkJCXByaW50ZigiKSIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qKCovCi0JCQkJCXByaW50ZigiID8pIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCWlmIChvcHRsZW4gPj0gMiArIDgpIHsKLQkJCQkJcHJpbnRmKCIgdmlkICIpOwotCQkJCQlmb3IgKGkgPSAyOyBpIDwgMiArIDg7IGkrKykKLQkJCQkJCXByaW50ZigiJTAyeCIsIHRwW2ldKTsKLQkJCQkJLyooKi8KLQkJCQkJcHJpbnRmKCIpIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyooKi8KLQkJCQkJcHJpbnRmKCIgPykiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJaWYgKG9wdGxlbiA+PSAyICsgMikgewotCQkJCQlwcmludGYoIiBod2FkZHIgdHlwZSAldSAiLAotCQkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJnRwWzJdKSk7Ci0JCQkJCWZvciAoaSA9IDQ7IGkgPCBvcHRsZW47IGkrKykKLQkJCQkJCXByaW50ZigiJTAyeCIsIHRwW2ldKTsKLQkJCQkJLyooKi8KLQkJCQkJcHJpbnRmKCIpIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyooKi8KLQkJCQkJcHJpbnRmKCIgPykiKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiIHR5cGUgJWQpIiwgRVhUUkFDVF8xNkJJVFModHApKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9JQV9BRERSOgotCQkJaWYgKG9wdGxlbiA8IHNpemVvZihpYV9hZGRyKSAtIDQpIHsKLQkJCQlwcmludGYoIiA/KSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbWVtY3B5KCZpYV9hZGRyLCAodV9jaGFyICopZGg2bywgc2l6ZW9mKGlhX2FkZHIpKTsKLQkJCXByaW50ZigiICVzIiwKLQkJCSAgICBpcDZhZGRyX3N0cmluZygmaWFfYWRkci5kaDZvcHRfaWFfYWRkcl9hZGRyKSk7Ci0JCQlpYV9hZGRyLmRoNm9wdF9pYV9hZGRyX3BsdGltZSA9Ci0JCQkgICAgbnRvaGwoaWFfYWRkci5kaDZvcHRfaWFfYWRkcl9wbHRpbWUpOwotCQkJaWFfYWRkci5kaDZvcHRfaWFfYWRkcl92bHRpbWUgPQotCQkJICAgIG50b2hsKGlhX2FkZHIuZGg2b3B0X2lhX2FkZHJfdmx0aW1lKTsKLQkJCXByaW50ZigiIHBsdGltZTolbHUgdmx0aW1lOiVsdSIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpaWFfYWRkci5kaDZvcHRfaWFfYWRkcl9wbHRpbWUsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpaWFfYWRkci5kaDZvcHRfaWFfYWRkcl92bHRpbWUpOwotCQkJaWYgKG9wdGxlbiA+IHNpemVvZihpYV9hZGRyKSAtIDQpIHsKLQkJCQkvKiB0aGVyZSBhcmUgc3ViLW9wdGlvbnMgKi8KLQkJCQlkaGNwNm9wdF9wcmludCgodV9jaGFyICopZGg2byArCi0JCQkJICAgIHNpemVvZihpYV9hZGRyKSwKLQkJCQkgICAgKHVfY2hhciAqKShkaDZvICsgMSkgKyBvcHRsZW4pOwotCQkJfQotCQkJcHJpbnRmKCIpIik7Ci0JCQlicmVhazsKLQkJY2FzZSBESDZPUFRfT1JPOgotCQkJaWYgKG9wdGxlbiAlIDIpIHsKLQkJCQlwcmludGYoIiA/KSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdHAgPSAodV9jaGFyICopKGRoNm8gKyAxKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW47IGkgKz0gMikgewotCQkJCXVfaW50MTZfdCBvcHQ7Ci0KLQkJCQltZW1jcHkoJm9wdCwgJnRwW2ldLCBzaXplb2Yob3B0KSk7Ci0JCQkJcHJpbnRmKCIgJXMiLCBkaGNwNm9wdF9uYW1lKG50b2hzKG9wdCkpKTsKLQkJCX0KLQkJCXByaW50ZigiKSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgREg2T1BUX1BSRUZFUkVOQ0U6Ci0JCQlpZiAob3B0bGVuICE9IDEpIHsKLQkJCQlwcmludGYoIiA/KSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcHJpbnRmKCIgJWQpIiwgKigodV9jaGFyICopKGRoNm8gKyAxKSArIDEpKTsKLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9FTEFQU0VEX1RJTUU6Ci0JCQlpZiAob3B0bGVuICE9IDIpIHsKLQkJCQlwcmludGYoIiA/KSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbWVtY3B5KCZ2YWwxNiwgZGg2byArIDEsIHNpemVvZih2YWwxNikpOwotCQkJdmFsMTYgPSBudG9ocyh2YWwxNik7Ci0JCQlwcmludGYoIiAlZCkiLCAoaW50KXZhbDE2KTsKLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9SRUxBWV9NU0c6Ci0JCQlwcmludGYoIiAoIik7Ci0JCQlkaGNwNl9wcmludCgoY29uc3QgdV9jaGFyICopKGRoNm8gKyAxKSwgb3B0bGVuKTsKLQkJCXByaW50ZigiKSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgREg2T1BUX0FVVEg6Ci0JCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGF1dGhvcHQpIC0gc2l6ZW9mKCpkaDZvKSkgewotCQkJCXByaW50ZigiID8pIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQltZW1jcHkoJmF1dGhvcHQsIGRoNm8sIHNpemVvZihhdXRob3B0KSk7Ci0JCQlzd2l0Y2ggKGF1dGhvcHQuZGg2b3B0X2F1dGhfcHJvdG8pIHsKLQkJCWNhc2UgREg2T1BUX0FVVEhQUk9UT19ERUxBWUVEOgotCQkJCXByaW50ZigiIHByb3RvOiBkZWxheWVkIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERINk9QVF9BVVRIUFJPVE9fUkVDT05GSUc6Ci0JCQkJcHJpbnRmKCIgcHJvdG86IHJlY29uZmlndXJlIik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiIHByb3RvOiAlZCIsCi0JCQkJICAgIGF1dGhvcHQuZGg2b3B0X2F1dGhfcHJvdG8pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJc3dpdGNoIChhdXRob3B0LmRoNm9wdF9hdXRoX2FsZykgewotCQkJY2FzZSBESDZPUFRfQVVUSEFMR19ITUFDTUQ1OgotCQkJCS8qIFhYWDogbWF5IGRlcGVuZCBvbiB0aGUgcHJvdG9jb2wgKi8KLQkJCQlwcmludGYoIiwgYWxnOiBITUFDLU1ENSIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGYoIiwgYWxnOiAlZCIsIGF1dGhvcHQuZGg2b3B0X2F1dGhfYWxnKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXN3aXRjaCAoYXV0aG9wdC5kaDZvcHRfYXV0aF9yZG0pIHsKLQkJCWNhc2UgREg2T1BUX0FVVEhSRE1fTU9OT0NPVU5URVI6Ci0JCQkJcHJpbnRmKCIsIFJETTogbW9ubyIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGYoIiwgUkRNOiAlZCIsIGF1dGhvcHQuZGg2b3B0X2F1dGhfcmRtKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRwID0gKHVfY2hhciAqKSZhdXRob3B0LmRoNm9wdF9hdXRoX3JkaW5mbzsKLQkJCXByaW50ZigiLCBSRDoiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHRwICs9IHNpemVvZih2YWwxNikpCi0JCQkJcHJpbnRmKCIgJTA0eCIsIEVYVFJBQ1RfMTZCSVRTKHRwKSk7Ci0KLQkJCS8qIHByb3RvY29sIGRlcGVuZGVudCBwYXJ0ICovCi0JCQl0cCA9ICh1X2NoYXIgKilkaDZvICsgc2l6ZW9mKGF1dGhvcHQpOwotCQkJYXV0aGluZm9sZW4gPQotCQkJICAgIG9wdGxlbiArIHNpemVvZigqZGg2bykgLSBzaXplb2YoYXV0aG9wdCk7IAotCQkJc3dpdGNoIChhdXRob3B0LmRoNm9wdF9hdXRoX3Byb3RvKSB7Ci0JCQljYXNlIERINk9QVF9BVVRIUFJPVE9fREVMQVlFRDoKLQkJCQlpZiAoYXV0aGluZm9sZW4gPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKGF1dGhpbmZvbGVuIDwgMjApIHsKLQkJCQkJcHJpbnRmKCIgPz8iKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWF1dGhyZWFsbWxlbiA9IGF1dGhpbmZvbGVuIC0gMjA7Ci0JCQkJaWYgKGF1dGhyZWFsbWxlbiA+IDApIHsKLQkJCQkJcHJpbnRmKCIsIHJlYWxtOiAiKTsKLQkJCQl9Ci0JCQkJZm9yIChpID0gMDsgaSA8IGF1dGhyZWFsbWxlbjsgaSsrLCB0cCsrKQotCQkJCQlwcmludGYoIiUwMngiLCAqdHApOwotCQkJCXByaW50ZigiLCBrZXkgSUQ6ICUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cCkpOwotCQkJCXRwICs9IDQ7Ci0JCQkJcHJpbnRmKCIsIEhNQUMtTUQ1OiIpOwotCQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIHRwKz0gNCkKLQkJCQkJcHJpbnRmKCIgJTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHRwKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERINk9QVF9BVVRIUFJPVE9fUkVDT05GSUc6Ci0JCQkJaWYgKGF1dGhpbmZvbGVuICE9IDE3KSB7Ci0JCQkJCXByaW50ZigiID8/Iik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlzd2l0Y2ggKCp0cCsrKSB7Ci0JCQkJY2FzZSBESDZPUFRfQVVUSFJFQ09ORklHX0tFWToKLQkJCQkJcHJpbnRmKCIgcmVjb25maWcta2V5Iik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgREg2T1BUX0FVVEhSRUNPTkZJR19ITUFDTUQ1OgotCQkJCQlwcmludGYoIiB0eXBlOiBITUFDLU1ENSIpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwcmludGYoIiB0eXBlOiA/PyIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcHJpbnRmKCIgdmFsdWU6Iik7Ci0JCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgdHArPSA0KQotCQkJCQlwcmludGYoIiAlMDh4IiwgRVhUUkFDVF8zMkJJVFModHApKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRmKCIgPz8iKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcHJpbnRmKCIpIik7Ci0JCQlicmVhazsKLQkJY2FzZSBESDZPUFRfUkFQSURfQ09NTUlUOiAvKiBub3RoaW5nIHRvZG8gKi8KLQkJCXByaW50ZigiKSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgREg2T1BUX0lOVEVSRkFDRV9JRDoKLQkJCS8qCi0JCQkgKiBTaW5jZSB3ZSBjYW5ub3QgcHJlZGljdCB0aGUgZW5jb2RpbmcsIHByaW50IGhleCBkdW1wCi0JCQkgKiBhdCBtb3N0IDEwIGNoYXJhY3RlcnMuCi0JCQkgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBvcHRsZW4gJiYgaSA8IDEwOyBpKyspCi0JCQkJcHJpbnRmKCIlMDJ4IiwgKCh1X2NoYXIgKikoZGg2byArIDEpKVtpXSk7Ci0JCQlicmVhazsKLQkJY2FzZSBESDZPUFRfUkVDT05GX01TRzoKLQkJCXRwID0gKHVfY2hhciAqKShkaDZvICsgMSk7Ci0JCQlzd2l0Y2ggKCp0cCkgewotCQkJY2FzZSBESDZfUkVORVc6Ci0JCQkJcHJpbnRmKCIgZm9yIHJlbmV3KSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBESDZfSU5GT1JNX1JFUToKLQkJCQlwcmludGYoIiBmb3IgaW5mLXJlcSkiKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRmKCIgZm9yID9cP1w/KCUwMngpKSIsICp0cCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBESDZPUFRfUkVDT05GX0FDQ0VQVDogLyogbm90aGluZyB0b2RvICovCi0JCQlwcmludGYoIikiKTsKLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9TSVBfU0VSVkVSX0E6Ci0JCWNhc2UgREg2T1BUX0ROUzoKLQkJY2FzZSBESDZPUFRfTlRQX1NFUlZFUlM6Ci0JCWNhc2UgREg2T1BUX05JU19TRVJWRVJTOgotCQljYXNlIERINk9QVF9OSVNQX1NFUlZFUlM6Ci0JCWNhc2UgREg2T1BUX0JDTUNTX1NFUlZFUl9BOgotCQkJaWYgKG9wdGxlbiAlIDE2KSB7Ci0JCQkJcHJpbnRmKCIgPykiKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXRwID0gKHVfY2hhciAqKShkaDZvICsgMSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgb3B0bGVuOyBpICs9IDE2KQotCQkJCXByaW50ZigiICVzIiwgaXA2YWRkcl9zdHJpbmcoJnRwW2ldKSk7Ci0JCQlwcmludGYoIikiKTsKLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9TVEFUVVNfQ09ERToKLQkJCWlmIChvcHRsZW4gPCAyKSB7Ci0JCQkJcHJpbnRmKCIgPykiKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1lbWNweSgmdmFsMTYsICh1X2NoYXIgKikoZGg2byArIDEpLCBzaXplb2YodmFsMTYpKTsKLQkJCXZhbDE2ID0gbnRvaHModmFsMTYpOwotCQkJcHJpbnRmKCIgJXMpIiwgZGhjcDZzdGNvZGUodmFsMTYpKTsKLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9JQV9OQToKLQkJY2FzZSBESDZPUFRfSUFfUEQ6Ci0JCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGlhKSAtIDQpIHsKLQkJCQlwcmludGYoIiA/KSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbWVtY3B5KCZpYSwgKHVfY2hhciAqKWRoNm8sIHNpemVvZihpYSkpOwotCQkJaWEuZGg2b3B0X2lhX2lhaWQgPSBudG9obChpYS5kaDZvcHRfaWFfaWFpZCk7Ci0JCQlpYS5kaDZvcHRfaWFfdDEgPSBudG9obChpYS5kaDZvcHRfaWFfdDEpOwotCQkJaWEuZGg2b3B0X2lhX3QyID0gbnRvaGwoaWEuZGg2b3B0X2lhX3QyKTsKLQkJCXByaW50ZigiIElBSUQ6JWx1IFQxOiVsdSBUMjolbHUiLAotCQkJICAgICh1bnNpZ25lZCBsb25nKWlhLmRoNm9wdF9pYV9pYWlkLAotCQkJICAgICh1bnNpZ25lZCBsb25nKWlhLmRoNm9wdF9pYV90MSwKLQkJCSAgICAodW5zaWduZWQgbG9uZylpYS5kaDZvcHRfaWFfdDIpOwotCQkJaWYgKG9wdGxlbiA+IHNpemVvZihpYSkgLSA0KSB7Ci0JCQkJLyogdGhlcmUgYXJlIHN1Yi1vcHRpb25zICovCi0JCQkJZGhjcDZvcHRfcHJpbnQoKHVfY2hhciAqKWRoNm8gKyBzaXplb2YoaWEpLAotCQkJCSAgICAodV9jaGFyICopKGRoNm8gKyAxKSArIG9wdGxlbik7Ci0JCQl9Ci0JCQlwcmludGYoIikiKTsKLQkJCWJyZWFrOwotCQljYXNlIERINk9QVF9JQV9QRF9QUkVGSVg6Ci0JCQlpZiAob3B0bGVuIDwgc2l6ZW9mKGlhX3ByZWZpeCkgLSA0KSB7Ci0JCQkJcHJpbnRmKCIgPykiKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCW1lbWNweSgmaWFfcHJlZml4LCAodV9jaGFyICopZGg2bywgc2l6ZW9mKGlhX3ByZWZpeCkpOwotCQkJcHJpbnRmKCIgJXMvJWQiLAotCQkJICAgIGlwNmFkZHJfc3RyaW5nKCZpYV9wcmVmaXguZGg2b3B0X2lhX3ByZWZpeF9hZGRyKSwKLQkJCSAgICBpYV9wcmVmaXguZGg2b3B0X2lhX3ByZWZpeF9wbGVuKTsKLQkJCWlhX3ByZWZpeC5kaDZvcHRfaWFfcHJlZml4X3BsdGltZSA9Ci0JCQkgICAgbnRvaGwoaWFfcHJlZml4LmRoNm9wdF9pYV9wcmVmaXhfcGx0aW1lKTsKLQkJCWlhX3ByZWZpeC5kaDZvcHRfaWFfcHJlZml4X3ZsdGltZSA9Ci0JCQkgICAgbnRvaGwoaWFfcHJlZml4LmRoNm9wdF9pYV9wcmVmaXhfdmx0aW1lKTsKLQkJCXByaW50ZigiIHBsdGltZTolbHUgdmx0aW1lOiVsdSIsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpaWFfcHJlZml4LmRoNm9wdF9pYV9wcmVmaXhfcGx0aW1lLAotCQkJICAgICh1bnNpZ25lZCBsb25nKWlhX3ByZWZpeC5kaDZvcHRfaWFfcHJlZml4X3ZsdGltZSk7Ci0JCQlpZiAob3B0bGVuID4gc2l6ZW9mKGlhX3ByZWZpeCkgLSA0KSB7Ci0JCQkJLyogdGhlcmUgYXJlIHN1Yi1vcHRpb25zICovCi0JCQkJZGhjcDZvcHRfcHJpbnQoKHVfY2hhciAqKWRoNm8gKwotCQkJCSAgICBzaXplb2YoaWFfcHJlZml4KSwKLQkJCQkgICAgKHVfY2hhciAqKShkaDZvICsgMSkgKyBvcHRsZW4pOwotCQkJfQotCQkJcHJpbnRmKCIpIik7Ci0JCQlicmVhazsKLQkJY2FzZSBESDZPUFRfTElGRVRJTUU6Ci0JCQlpZiAob3B0bGVuICE9IDQpIHsKLQkJCQlwcmludGYoIiA/KSIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbWVtY3B5KCZ2YWwzMiwgZGg2byArIDEsIHNpemVvZih2YWwzMikpOwotCQkJdmFsMzIgPSBudG9obCh2YWwzMik7Ci0JCQlwcmludGYoIiAlZCkiLCAoaW50KXZhbDMyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRmKCIpIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNwICs9IHNpemVvZigqZGg2bykgKyBvcHRsZW47Ci0JfQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfGRoY3A2ZXh0XSIpOwotfQotCi0vKgotICogUHJpbnQgZGhjcDYgcGFja2V0cwotICovCi12b2lkCi1kaGNwNl9wcmludChjb25zdCB1X2NoYXIgKmNwLCB1X2ludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGRoY3A2ICpkaDY7Ci0Jc3RydWN0IGRoY3A2X3JlbGF5ICpkaDZyZWxheTsKLQljb25zdCB1X2NoYXIgKmVwOwotCXVfY2hhciAqZXh0cDsKLQljb25zdCBjaGFyICpuYW1lOwotCi0JcHJpbnRmKCJkaGNwNiIpOwotCi0JZXAgPSAodV9jaGFyICopc25hcGVuZDsKLQlpZiAoY3AgKyBsZW5ndGggPCBlcCkKLQkJZXAgPSBjcCArIGxlbmd0aDsKLQotCWRoNiA9IChzdHJ1Y3QgZGhjcDYgKiljcDsKLQlkaDZyZWxheSA9IChzdHJ1Y3QgZGhjcDZfcmVsYXkgKiljcDsKLQlUQ0hFQ0soZGg2LT5kaDZfeGlkKTsKLQlzd2l0Y2ggKGRoNi0+ZGg2X21zZ3R5cGUpIHsKLQljYXNlIERINl9TT0xJQ0lUOgotCQluYW1lID0gInNvbGljaXQiOwotCQlicmVhazsKLQljYXNlIERINl9BRFZFUlRJU0U6Ci0JCW5hbWUgPSAiYWR2ZXJ0aXNlIjsKLQkJYnJlYWs7Ci0JY2FzZSBESDZfUkVRVUVTVDoKLQkJbmFtZSA9ICJyZXF1ZXN0IjsKLQkJYnJlYWs7Ci0JY2FzZSBESDZfQ09ORklSTToKLQkJbmFtZSA9ICJjb25maXJtIjsKLQkJYnJlYWs7Ci0JY2FzZSBESDZfUkVORVc6Ci0JCW5hbWUgPSAicmVuZXciOwotCQlicmVhazsKLQljYXNlIERINl9SRUJJTkQ6Ci0JCW5hbWUgPSAicmViaW5kIjsKLQkJYnJlYWs7Ci0JY2FzZSBESDZfUkVQTFk6Ci0JCW5hbWUgPSAicmVwbHkiOwotCQlicmVhazsKLQljYXNlIERINl9SRUxFQVNFOgotCQluYW1lID0gInJlbGVhc2UiOwotCQlicmVhazsKLQljYXNlIERINl9ERUNMSU5FOgotCQluYW1lID0gImRlY2xpbmUiOwotCQlicmVhazsKLQljYXNlIERINl9SRUNPTkZJR1VSRToKLQkJbmFtZSA9ICJyZWNvbmZpZ3VyZSI7Ci0JCWJyZWFrOwotCWNhc2UgREg2X0lORk9STV9SRVE6Ci0JCW5hbWU9ICJpbmYtcmVxIjsKLQkJYnJlYWs7Ci0JY2FzZSBESDZfUkVMQVlfRk9SVzoKLQkJbmFtZT0gInJlbGF5LWZ3ZCI7Ci0JCWJyZWFrOwotCWNhc2UgREg2X1JFTEFZX1JFUExZOgotCQluYW1lPSAicmVsYXktcmVwbHkiOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQluYW1lID0gTlVMTDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCF2ZmxhZykgewotCQlpZiAobmFtZSkKLQkJCXByaW50ZigiICVzIiwgbmFtZSk7Ci0JCWVsc2UgaWYgKGRoNi0+ZGg2X21zZ3R5cGUgIT0gREg2X1JFTEFZX0ZPUlcgJiYKLQkJICAgIGRoNi0+ZGg2X21zZ3R5cGUgIT0gREg2X1JFTEFZX1JFUExZKSB7Ci0JCQlwcmludGYoIiBtc2d0eXBlLSV1IiwgZGg2LT5kaDZfbXNndHlwZSk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCS8qIFhYWCByZWxheSBhZ2VudCBtZXNzYWdlcyBoYXZlIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgKi8KLQotCWlmIChuYW1lKQotCQlwcmludGYoIiAlcyAoIiwgbmFtZSk7CS8qKSovCi0JZWxzZQotCQlwcmludGYoIiBtc2d0eXBlLSV1ICgiLCBkaDYtPmRoNl9tc2d0eXBlKTsJLyopKi8KLQlpZiAoZGg2LT5kaDZfbXNndHlwZSAhPSBESDZfUkVMQVlfRk9SVyAmJgotCSAgICBkaDYtPmRoNl9tc2d0eXBlICE9IERINl9SRUxBWV9SRVBMWSkgewotCQlwcmludGYoInhpZD0leCIsIEVYVFJBQ1RfMzJCSVRTKCZkaDYtPmRoNl94aWQpICYgREg2X1hJRE1BU0spOwotCQlleHRwID0gKHVfY2hhciAqKShkaDYgKyAxKTsKLQkJZGhjcDZvcHRfcHJpbnQoZXh0cCwgZXApOwotCX0gZWxzZSB7CQkvKiByZWxheSBtZXNzYWdlcyAqLwotCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjY7Ci0KLQkJVENIRUNLKGRoNnJlbGF5LT5kaDZyZWxheV9wZWVyYWRkcik7Ci0KLQkJbWVtY3B5KCZhZGRyNiwgZGg2cmVsYXktPmRoNnJlbGF5X2xpbmthZGRyLCBzaXplb2YgKGFkZHI2KSk7Ci0JCXByaW50ZigibGlua2FkZHI9JXMiLCBpcDZhZGRyX3N0cmluZygmYWRkcjYpKTsKLQotCQltZW1jcHkoJmFkZHI2LCBkaDZyZWxheS0+ZGg2cmVsYXlfcGVlcmFkZHIsIHNpemVvZiAoYWRkcjYpKTsKLQkJcHJpbnRmKCIgcGVlcmFkZHI9JXMiLCBpcDZhZGRyX3N0cmluZygmYWRkcjYpKTsKLQotCQlkaGNwNm9wdF9wcmludCgodV9jaGFyICopKGRoNnJlbGF5ICsgMSksIGVwKTsKLQl9Ci0JLyooKi8KLQlwcmludGYoIikiKTsKLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiW3xkaGNwNl0iKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWRvbWFpbi5jIGIvcHJpbnQtZG9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTM1ZDguLjAwMDAwMDAKLS0tIGEvcHJpbnQtZG9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWRvbWFpbi5jLHYgMS44OS4yLjggMjAwNy8wMi8xMyAxOToxOToyNyBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlICJuYW1lc2VyLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqbnNfb3BzW10gPSB7Ci0JIiIsICIgaW52X3EiLCAiIHN0YXQiLCAiIG9wMyIsICIgbm90aWZ5IiwgIiB1cGRhdGUiLCAiIG9wNiIsICIgb3A3IiwKLQkiIG9wOCIsICIgdXBkYXRhQSIsICIgdXBkYXRlRCIsICIgdXBkYXRlREEiLAotCSIgdXBkYXRlTSIsICIgdXBkYXRlTUEiLCAiIHpvbmVJbml0IiwgIiB6b25lUmVmIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuc19yZXNwW10gPSB7Ci0JIiIsICIgRm9ybUVyciIsICIgU2VydkZhaWwiLCAiIE5YRG9tYWluIiwKLQkiIE5vdEltcCIsICIgUmVmdXNlZCIsICIgWVhEb21haW4iLCAiIFlYUlJTZXQiLAotCSIgTlhSUlNldCIsICIgTm90QXV0aCIsICIgTm90Wm9uZSIsICIgUmVzcDExIiwKLQkiIFJlc3AxMiIsICIgUmVzcDEzIiwgIiBSZXNwMTQiLCAiIE5vQ2hhbmdlIiwKLX07Ci0KLS8qIHNraXAgb3ZlciBhIGRvbWFpbiBuYW1lICovCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLW5zX25za2lwKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3ApCi17Ci0JcmVnaXN0ZXIgdV9jaGFyIGk7Ci0KLQlpZiAoIVRURVNUMigqY3AsIDEpKQotCQlyZXR1cm4gKE5VTEwpOwotCWkgPSAqY3ArKzsKLQl3aGlsZSAoaSkgewotCQlpZiAoKGkgJiBJTkRJUl9NQVNLKSA9PSBJTkRJUl9NQVNLKQotCQkJcmV0dXJuIChjcCArIDEpOwotCQlpZiAoKGkgJiBJTkRJUl9NQVNLKSA9PSBFRE5TMF9NQVNLKSB7Ci0JCQlpbnQgYml0bGVuLCBieXRlbGVuOwotCi0JCQlpZiAoKGkgJiB+SU5ESVJfTUFTSykgIT0gRUROUzBfRUxUX0JJVExBQkVMKQotCQkJCXJldHVybihOVUxMKTsgLyogdW5rbm93biBFTFQgKi8KLQkJCWlmICghVFRFU1QyKCpjcCwgMSkpCi0JCQkJcmV0dXJuIChOVUxMKTsKLQkJCWlmICgoYml0bGVuID0gKmNwKyspID09IDApCi0JCQkJYml0bGVuID0gMjU2OwotCQkJYnl0ZWxlbiA9IChiaXRsZW4gKyA3KSAvIDg7Ci0JCQljcCArPSBieXRlbGVuOwotCQl9IGVsc2UKLQkJCWNwICs9IGk7Ci0JCWlmICghVFRFU1QyKCpjcCwgMSkpCi0JCQlyZXR1cm4gKE5VTEwpOwotCQlpID0gKmNwKys7Ci0JfQotCXJldHVybiAoY3ApOwotfQotCi0vKiBwcmludCBhIDxkb21haW4tbmFtZT4gKi8KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotYmxhYmVsX3ByaW50KGNvbnN0IHVfY2hhciAqY3ApCi17Ci0JaW50IGJpdGxlbiwgc2xlbiwgYjsKLQljb25zdCB1X2NoYXIgKmJpdHAsICpsaW07Ci0JY2hhciB0YzsKLQotCWlmICghVFRFU1QyKCpjcCwgMSkpCi0JCXJldHVybihOVUxMKTsKLQlpZiAoKGJpdGxlbiA9ICpjcCkgPT0gMCkKLQkJYml0bGVuID0gMjU2OwotCXNsZW4gPSAoYml0bGVuICsgMykgLyA0OwotCWxpbSA9IGNwICsgMSArIHNsZW47Ci0KLQkvKiBwcmludCB0aGUgYml0IHN0cmluZyBhcyBhIGhleCBzdHJpbmcgKi8KLQlwcmludGYoIlxcW3giKTsKLQlmb3IgKGJpdHAgPSBjcCArIDEsIGIgPSBiaXRsZW47IGJpdHAgPCBsaW0gJiYgYiA+IDc7IGIgLT0gOCwgYml0cCsrKSB7Ci0JCVRDSEVDSygqYml0cCk7Ci0JCXByaW50ZigiJTAyeCIsICpiaXRwKTsKLQl9Ci0JaWYgKGIgPiA0KSB7Ci0JCVRDSEVDSygqYml0cCk7Ci0JCXRjID0gKmJpdHArKzsKLQkJcHJpbnRmKCIlMDJ4IiwgdGMgJiAoMHhmZiA8PCAoOCAtIGIpKSk7Ci0JfSBlbHNlIGlmIChiID4gMCkgewotCQlUQ0hFQ0soKmJpdHApOwotCQl0YyA9ICpiaXRwKys7Ci0JCXByaW50ZigiJTF4IiwgKCh0YyA+PiA0KSAmIDB4MGYpICYgKDB4MGYgPDwgKDQgLSBiKSkpOwotCX0KLQlwcmludGYoIi8lZF0iLCBiaXRsZW4pOwotCXJldHVybiBsaW07Ci10cnVuYzoKLQlwcmludGYoIi4uLi8lZF0iLCBiaXRsZW4pOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50Ci1sYWJlbGxlbihjb25zdCB1X2NoYXIgKmNwKQotewotCXJlZ2lzdGVyIHVfaW50IGk7Ci0KLQlpZiAoIVRURVNUMigqY3AsIDEpKQotCQlyZXR1cm4oLTEpOwotCWkgPSAqY3A7Ci0JaWYgKChpICYgSU5ESVJfTUFTSykgPT0gRUROUzBfTUFTSykgewotCQlpbnQgYml0bGVuLCBlbHQ7Ci0JCWlmICgoZWx0ID0gKGkgJiB+SU5ESVJfTUFTSykpICE9IEVETlMwX0VMVF9CSVRMQUJFTCkgewotCQkJcHJpbnRmKCI8RUxUICVkPiIsIGVsdCk7Ci0JCQlyZXR1cm4oLTEpOwotCQl9Ci0JCWlmICghVFRFU1QyKCooY3AgKyAxKSwgMSkpCi0JCQlyZXR1cm4oLTEpOwotCQlpZiAoKGJpdGxlbiA9ICooY3AgKyAxKSkgPT0gMCkKLQkJCWJpdGxlbiA9IDI1NjsKLQkJcmV0dXJuKCgoYml0bGVuICsgNykgLyA4KSArIDEpOwotCX0gZWxzZQotCQlyZXR1cm4oaSk7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotbnNfbnByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCi17Ci0JcmVnaXN0ZXIgdV9pbnQgaSwgbDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKnJwID0gTlVMTDsKLQlyZWdpc3RlciBpbnQgY29tcHJlc3MgPSAwOwotCWludCBjaGFyc19wcm9jZXNzZWQ7Ci0JaW50IGVsdDsKLQlpbnQgZGF0YV9zaXplID0gc25hcGVuZCAtIGJwOwotCi0JaWYgKChsID0gbGFiZWxsZW4oY3ApKSA9PSAodV9pbnQpLTEpCi0JCXJldHVybihOVUxMKTsKLQlpZiAoIVRURVNUMigqY3AsIDEpKQotCQlyZXR1cm4oTlVMTCk7Ci0JY2hhcnNfcHJvY2Vzc2VkID0gMTsKLQlpZiAoKChpID0gKmNwKyspICYgSU5ESVJfTUFTSykgIT0gSU5ESVJfTUFTSykgewotCQljb21wcmVzcyA9IDA7Ci0JCXJwID0gY3AgKyBsOwotCX0KLQotCWlmIChpICE9IDApCi0JCXdoaWxlIChpICYmIGNwIDwgc25hcGVuZCkgewotCQkJaWYgKChpICYgSU5ESVJfTUFTSykgPT0gSU5ESVJfTUFTSykgewotCQkJCWlmICghY29tcHJlc3MpIHsKLQkJCQkJcnAgPSBjcCArIDE7Ci0JCQkJCWNvbXByZXNzID0gMTsKLQkJCQl9Ci0JCQkJaWYgKCFUVEVTVDIoKmNwLCAxKSkKLQkJCQkJcmV0dXJuKE5VTEwpOwotCQkJCWNwID0gYnAgKyAoKChpIDw8IDgpIHwgKmNwKSAmIDB4M2ZmZik7Ci0JCQkJaWYgKChsID0gbGFiZWxsZW4oY3ApKSA9PSAodV9pbnQpLTEpCi0JCQkJCXJldHVybihOVUxMKTsKLQkJCQlpZiAoIVRURVNUMigqY3AsIDEpKQotCQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQkJaSA9ICpjcCsrOwotCQkJCWNoYXJzX3Byb2Nlc3NlZCsrOwotCi0JCQkJLyoKLQkJCQkgKiBJZiB3ZSd2ZSBsb29rZWQgYXQgZXZlcnkgY2hhcmFjdGVyIGluCi0JCQkJICogdGhlIG1lc3NhZ2UsIHRoaXMgcG9pbnRlciB3aWxsIG1ha2UKLQkJCQkgKiB1cyBsb29rIGF0IHNvbWUgY2hhcmFjdGVyIGFnYWluLAotCQkJCSAqIHdoaWNoIG1lYW5zIHdlJ3JlIGxvb3BpbmcuCi0JCQkJICovCi0JCQkJaWYgKGNoYXJzX3Byb2Nlc3NlZCA+PSBkYXRhX3NpemUpIHsKLQkJCQkJcHJpbnRmKCI8TE9PUD4iKTsKLQkJCQkJcmV0dXJuIChOVUxMKTsKLQkJCQl9Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoKGkgJiBJTkRJUl9NQVNLKSA9PSBFRE5TMF9NQVNLKSB7Ci0JCQkJZWx0ID0gKGkgJiB+SU5ESVJfTUFTSyk7Ci0JCQkJc3dpdGNoKGVsdCkgewotCQkJCWNhc2UgRUROUzBfRUxUX0JJVExBQkVMOgotCQkJCQlpZiAoYmxhYmVsX3ByaW50KGNwKSA9PSBOVUxMKQotCQkJCQkJcmV0dXJuIChOVUxMKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJLyogdW5rbm93biBFTFQgKi8KLQkJCQkJcHJpbnRmKCI8RUxUICVkPiIsIGVsdCk7Ci0JCQkJCXJldHVybihOVUxMKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmbl9wcmludG4oY3AsIGwsIHNuYXBlbmQpKQotCQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQl9Ci0KLQkJCWNwICs9IGw7Ci0JCQljaGFyc19wcm9jZXNzZWQgKz0gbDsKLQkJCXB1dGNoYXIoJy4nKTsKLQkJCWlmICgobCA9IGxhYmVsbGVuKGNwKSkgPT0gKHVfaW50KS0xKQotCQkJCXJldHVybihOVUxMKTsKLQkJCWlmICghVFRFU1QyKCpjcCwgMSkpCi0JCQkJcmV0dXJuKE5VTEwpOwotCQkJaSA9ICpjcCsrOwotCQkJY2hhcnNfcHJvY2Vzc2VkKys7Ci0JCQlpZiAoIWNvbXByZXNzKQotCQkJCXJwICs9IGwgKyAxOwotCQl9Ci0JZWxzZQotCQlwdXRjaGFyKCcuJyk7Ci0JcmV0dXJuIChycCk7Ci19Ci0KLS8qIHByaW50IGEgPGNoYXJhY3Rlci1zdHJpbmc+ICovCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLW5zX2NwcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwKQotewotCXJlZ2lzdGVyIHVfaW50IGk7Ci0KLQlpZiAoIVRURVNUMigqY3AsIDEpKQotCQlyZXR1cm4gKE5VTEwpOwotCWkgPSAqY3ArKzsKLQlpZiAoZm5fcHJpbnRuKGNwLCBpLCBzbmFwZW5kKSkKLQkJcmV0dXJuIChOVUxMKTsKLQlyZXR1cm4gKGNwICsgaSk7Ci19Ci0KLS8qIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvZG5zLXBhcmFtZXRlcnMgKi8KLXN0cnVjdCB0b2sgbnNfdHlwZTJzdHJbXSA9IHsKLQl7IFRfQSwJCSJBIiB9LAkJCS8qIFJGQyAxMDM1ICovCi0JeyBUX05TLAkJIk5TIiB9LAkJCS8qIFJGQyAxMDM1ICovCi0JeyBUX01ELAkJIk1EIiB9LAkJCS8qIFJGQyAxMDM1ICovCi0JeyBUX01GLAkJIk1GIiB9LAkJCS8qIFJGQyAxMDM1ICovCi0JeyBUX0NOQU1FLAkiQ05BTUUiIH0sCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9TT0EsCSJTT0EiIH0sCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9NQiwJCSJNQiIgfSwJCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9NRywJCSJNRyIgfSwJCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9NUiwJCSJNUiIgfSwJCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9OVUxMLAkiTlVMTCIgfSwJCS8qIFJGQyAxMDM1ICovCi0JeyBUX1dLUywJIldLUyIgfSwJCS8qIFJGQyAxMDM1ICovCi0JeyBUX1BUUiwJIlBUUiIgfSwJCS8qIFJGQyAxMDM1ICovCi0JeyBUX0hJTkZPLAkiSElORk8iIH0sCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9NSU5GTywJIk1JTkZPIiB9LAkJLyogUkZDIDEwMzUgKi8KLQl7IFRfTVgsCQkiTVgiIH0sCQkJLyogUkZDIDEwMzUgKi8KLQl7IFRfVFhULAkiVFhUIiB9LAkJLyogUkZDIDEwMzUgKi8KLQl7IFRfUlAsCQkiUlAiIH0sCQkJLyogUkZDIDExODMgKi8KLQl7IFRfQUZTREIsCSJBRlNEQiIgfSwJCS8qIFJGQyAxMTgzICovCi0JeyBUX1gyNSwJIlgyNSIgfSwJCS8qIFJGQyAxMTgzICovCi0JeyBUX0lTRE4sCSJJU0ROIiB9LAkJLyogUkZDIDExODMgKi8KLQl7IFRfUlQsCQkiUlQiIH0sCQkJLyogUkZDIDExODMgKi8KLQl7IFRfTlNBUCwJIk5TQVAiIH0sCQkvKiBSRkMgMTcwNiAqLwotCXsgVF9OU0FQX1BUUiwJIk5TQVBfUFRSIiB9LAotCXsgVF9TSUcsCSJTSUciIH0sCQkvKiBSRkMgMjUzNSAqLwotCXsgVF9LRVksCSJLRVkiIH0sCQkvKiBSRkMgMjUzNSAqLwotCXsgVF9QWCwJCSJQWCIgfSwJCQkvKiBSRkMgMjE2MyAqLwotCXsgVF9HUE9TLAkiR1BPUyIgfSwJCS8qIFJGQyAxNzEyICovCi0JeyBUX0FBQUEsCSJBQUFBIiB9LAkJLyogUkZDIDE4ODYgKi8KLQl7IFRfTE9DLAkiTE9DIiB9LAkJLyogUkZDIDE4NzYgKi8KLQl7IFRfTlhULAkiTlhUIiB9LAkJLyogUkZDIDI1MzUgKi8KLQl7IFRfRUlELAkiRUlEIiB9LAkJLyogTmltcm9kICovCi0JeyBUX05JTUxPQywJIk5JTUxPQyIgfSwJCS8qIE5pbXJvZCAqLwotCXsgVF9TUlYsCSJTUlYiIH0sCQkvKiBSRkMgMjc4MiAqLwotCXsgVF9BVE1BLAkiQVRNQSIgfSwJCS8qIEFUTSBGb3J1bSAqLwotCXsgVF9OQVBUUiwJIk5BUFRSIiB9LAkJLyogUkZDIDIxNjgsIFJGQyAyOTE1ICovCi0JeyBUX0tYLAkJIktYIiB9LAkJCS8qIFJGQyAyMjMwICovCi0JeyBUX0NFUlQsCSJDRVJUIiB9LAkJLyogUkZDIDI1MzggKi8KLQl7IFRfQTYsCQkiQTYiIH0sCQkJLyogUkZDIDI4NzQgKi8KLQl7IFRfRE5BTUUsCSJETkFNRSIgfSwJCS8qIFJGQyAyNjcyICovCi0JeyBUX1NJTkssIAkiU0lOSyIgfSwKLQl7IFRfT1BULAkiT1BUIiB9LAkJLyogUkZDIDI2NzEgKi8KLQl7IFRfQVBMLCAJIkFQTCIgfSwJCS8qIFJGQyAzMTIzICovCi0JeyBUX0RTLAkJIkRTIiB9LAkJCS8qIFJGQyA0MDM0ICovCi0JeyBUX1NTSEZQLAkiU1NIRlAiIH0sCQkvKiBSRkMgNDI1NSAqLwotCXsgVF9JUFNFQ0tFWSwJIklQU0VDS0VZIiB9LAkJLyogUkZDIDQwMjUgKi8KLQl7IFRfUlJTSUcsIAkiUlJTSUciIH0sCQkvKiBSRkMgNDAzNCAqLwotCXsgVF9OU0VDLAkiTlNFQyIgfSwJCS8qIFJGQyA0MDM0ICovCi0JeyBUX0ROU0tFWSwJIkROU0tFWSIgfSwJCS8qIFJGQyA0MDM0ICovCi0JeyBUX1NQRiwJIlNQRiIgfSwJCS8qIFJGQy1zY2hsaXR0LXNwZi1jbGFzc2ljLTAyLnR4dCAqLwotCXsgVF9VSU5GTywJIlVJTkZPIiB9LAotCXsgVF9VSUQsCSJVSUQiIH0sCi0JeyBUX0dJRCwJIkdJRCIgfSwKLQl7IFRfVU5TUEVDLAkiVU5TUEVDIiB9LAotCXsgVF9VTlNQRUNBLAkiVU5TUEVDQSIgfSwKLQl7IFRfVEtFWSwJIlRLRVkiIH0sCQkvKiBSRkMgMjkzMCAqLwotCXsgVF9UU0lHLAkiVFNJRyIgfSwJCS8qIFJGQyAyODQ1ICovCi0JeyBUX0lYRlIsCSJJWEZSIiB9LAkJLyogUkZDIDE5OTUgKi8KLQl7IFRfQVhGUiwJIkFYRlIiIH0sCQkvKiBSRkMgMTAzNSAqLwotCXsgVF9NQUlMQiwJIk1BSUxCIiB9LAkJLyogUkZDIDEwMzUgKi8KLQl7IFRfTUFJTEEsCSJNQUlMQSIgfSwJCS8qIFJGQyAxMDM1ICovCi0JeyBUX0FOWSwJIkFOWSIgfSwKLQl7IDAsCQlOVUxMIH0KLX07Ci0KLXN0cnVjdCB0b2sgbnNfY2xhc3Myc3RyW10gPSB7Ci0JeyBDX0lOLAkJIklOIiB9LAkJLyogTm90IHVzZWQgKi8KLQl7IENfQ0hBT1MsCSJDSEFPUyIgfSwKLQl7IENfSFMsCQkiSFMiIH0sCi0JeyBDX0FOWSwJIkFOWSIgfSwKLQl7IDAsCQlOVUxMIH0KLX07Ci0KLS8qIHByaW50IGEgcXVlcnkgKi8KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotbnNfcXByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBpc19tZG5zKQotewotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqbnAgPSBjcDsKLQlyZWdpc3RlciB1X2ludCBpLCBjbGFzczsKLQotCWNwID0gbnNfbnNraXAoY3ApOwotCi0JaWYgKGNwID09IE5VTEwgfHwgIVRURVNUMigqY3AsIDQpKQotCQlyZXR1cm4oTlVMTCk7Ci0KLQkvKiBwcmludCB0aGUgcXR5cGUgKi8KLQlpID0gRVhUUkFDVF8xNkJJVFMoY3ApOwotCWNwICs9IDI7Ci0JcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX3R5cGUyc3RyLCAiVHlwZSVkIiwgaSkpOwotCS8qIHByaW50IHRoZSBxY2xhc3MgKGlmIGl0J3Mgbm90IElOKSAqLwotCWkgPSBFWFRSQUNUXzE2QklUUyhjcCk7Ci0JY3AgKz0gMjsKLQlpZiAoaXNfbWRucykKLQkJY2xhc3MgPSAoaSAmIH5DX1FVKTsKLQllbHNlCi0JCWNsYXNzID0gaTsKLQlpZiAoY2xhc3MgIT0gQ19JTikKLQkJcHJpbnRmKCIgJXMiLCB0b2syc3RyKG5zX2NsYXNzMnN0ciwgIihDbGFzcyAlZCkiLCBjbGFzcykpOwotCWlmIChpc19tZG5zKSB7Ci0JCWlmIChpICYgQ19RVSkKLQkJCXByaW50ZigiIChRVSkiKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIgKFFNKSIpOwotCX0KLQotCWZwdXRzKCI/ICIsIHN0ZG91dCk7Ci0JY3AgPSBuc19ucHJpbnQobnAsIGJwKTsKLQlyZXR1cm4oY3AgPyBjcCArIDQgOiBOVUxMKTsKLX0KLQotLyogcHJpbnQgYSByZXBseSAqLwotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1uc19ycHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGlzX21kbnMpCi17Ci0JcmVnaXN0ZXIgdV9pbnQgaSwgY2xhc3MsIG9wdF9mbGFncyA9IDA7Ci0JcmVnaXN0ZXIgdV9zaG9ydCB0eXAsIGxlbjsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKnJwOwotCi0JaWYgKHZmbGFnKSB7Ci0JCXB1dGNoYXIoJyAnKTsKLQkJaWYgKChjcCA9IG5zX25wcmludChjcCwgYnApKSA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCWNwID0gbnNfbnNraXAoY3ApOwotCi0JaWYgKGNwID09IE5VTEwgfHwgIVRURVNUMigqY3AsIDEwKSkKLQkJcmV0dXJuIChzbmFwZW5kKTsKLQotCS8qIHByaW50IHRoZSB0eXBlL3F0eXBlICovCi0JdHlwID0gRVhUUkFDVF8xNkJJVFMoY3ApOwotCWNwICs9IDI7Ci0JLyogcHJpbnQgdGhlIGNsYXNzIChpZiBpdCdzIG5vdCBJTiBhbmQgdGhlIHR5cGUgaXNuJ3QgT1BUKSAqLwotCWkgPSBFWFRSQUNUXzE2QklUUyhjcCk7Ci0JY3AgKz0gMjsKLQlpZiAoaXNfbWRucykKLQkJY2xhc3MgPSAoaSAmIH5DX0NBQ0hFX0ZMVVNIKTsKLQllbHNlCi0JCWNsYXNzID0gaTsKLQlpZiAoY2xhc3MgIT0gQ19JTiAmJiB0eXAgIT0gVF9PUFQpCi0JCXByaW50ZigiICVzIiwgdG9rMnN0cihuc19jbGFzczJzdHIsICIoQ2xhc3MgJWQpIiwgY2xhc3MpKTsKLQlpZiAoaXNfbWRucykgewotCQlpZiAoaSAmIENfQ0FDSEVfRkxVU0gpCi0JCQlwcmludGYoIiAoQ2FjaGUgZmx1c2gpIik7Ci0JfQotCi0JLyogaWdub3JlIHR0bCAqLwotCWNwICs9IDI7Ci0JLyogaWYgVF9PUFQsIHNhdmUgb3B0X2ZsYWdzICovCi0JaWYgKHR5cCA9PSBUX09QVCkKLQkJb3B0X2ZsYWdzID0gRVhUUkFDVF8xNkJJVFMoY3ApOwotCS8qIGlnbm9yZSByZXN0IG9mIHR0bCAqLwotCWNwICs9IDI7Ci0KLQlsZW4gPSBFWFRSQUNUXzE2QklUUyhjcCk7Ci0JY3AgKz0gMjsKLQotCXJwID0gY3AgKyBsZW47Ci0KLQlwcmludGYoIiAlcyIsIHRvazJzdHIobnNfdHlwZTJzdHIsICJUeXBlJWQiLCB0eXApKTsKLQlpZiAocnAgPiBzbmFwZW5kKQotCQlyZXR1cm4oTlVMTCk7Ci0KLQlzd2l0Y2ggKHR5cCkgewotCWNhc2UgVF9BOgotCQlpZiAoIVRURVNUMigqY3AsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQotCQkJcmV0dXJuKE5VTEwpOwotCQlwcmludGYoIiAlcyIsIGlwYWRkcl9zdHJpbmcoY3ApKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRfTlM6Ci0JY2FzZSBUX0NOQU1FOgotCWNhc2UgVF9QVFI6Ci0jaWZkZWYgVF9ETkFNRQotCWNhc2UgVF9ETkFNRToKLSNlbmRpZgotCQlwdXRjaGFyKCcgJyk7Ci0JCWlmIChuc19ucHJpbnQoY3AsIGJwKSA9PSBOVUxMKQotCQkJcmV0dXJuKE5VTEwpOwotCQlicmVhazsKLQotCWNhc2UgVF9TT0E6Ci0JCWlmICghdmZsYWcpCi0JCQlicmVhazsKLQkJcHV0Y2hhcignICcpOwotCQlpZiAoKGNwID0gbnNfbnByaW50KGNwLCBicCkpID09IE5VTEwpCi0JCQlyZXR1cm4oTlVMTCk7Ci0JCXB1dGNoYXIoJyAnKTsKLQkJaWYgKChjcCA9IG5zX25wcmludChjcCwgYnApKSA9PSBOVUxMKQotCQkJcmV0dXJuKE5VTEwpOwotCQlpZiAoIVRURVNUMigqY3AsIDUgKiA0KSkKLQkJCXJldHVybihOVUxMKTsKLQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCkpOwotCQljcCArPSA0OwotCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7Ci0JCWNwICs9IDQ7Ci0JCXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKLQkJY3AgKz0gNDsKLQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCkpOwotCQljcCArPSA0OwotCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7Ci0JCWNwICs9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgVF9NWDoKLQkJcHV0Y2hhcignICcpOwotCQlpZiAoIVRURVNUMigqY3AsIDIpKQotCQkJcmV0dXJuKE5VTEwpOwotCQlpZiAobnNfbnByaW50KGNwICsgMiwgYnApID09IE5VTEwpCi0JCQlyZXR1cm4oTlVMTCk7Ci0JCXByaW50ZigiICVkIiwgRVhUUkFDVF8xNkJJVFMoY3ApKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRfVFhUOgotCQl3aGlsZSAoY3AgPCBycCkgewotCQkJcHJpbnRmKCIgXCIiKTsKLQkJCWNwID0gbnNfY3ByaW50KGNwKTsKLQkJCWlmIChjcCA9PSBOVUxMKQotCQkJCXJldHVybihOVUxMKTsKLQkJCXB1dGNoYXIoJyInKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgVF9TUlY6Ci0JCXB1dGNoYXIoJyAnKTsKLQkJaWYgKCFUVEVTVDIoKmNwLCA2KSkKLQkJCXJldHVybihOVUxMKTsKLQkJaWYgKG5zX25wcmludChjcCArIDYsIGJwKSA9PSBOVUxMKQotCQkJcmV0dXJuKE5VTEwpOwotCQlwcmludGYoIjolZCAlZCAlZCIsIEVYVFJBQ1RfMTZCSVRTKGNwICsgNCksCi0JCQlFWFRSQUNUXzE2QklUUyhjcCksIEVYVFJBQ1RfMTZCSVRTKGNwICsgMikpOwotCQlicmVhazsKLQotI2lmZGVmIElORVQ2Ci0JY2FzZSBUX0FBQUE6Ci0JCWlmICghVFRFU1QyKCpjcCwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQotCQkJcmV0dXJuKE5VTEwpOwotCQlwcmludGYoIiAlcyIsIGlwNmFkZHJfc3RyaW5nKGNwKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUX0E2OgotCSAgICB7Ci0JCXN0cnVjdCBpbjZfYWRkciBhOwotCQlpbnQgcGJpdCwgcGJ5dGU7Ci0KLQkJaWYgKCFUVEVTVDIoKmNwLCAxKSkKLQkJCXJldHVybihOVUxMKTsKLQkJcGJpdCA9ICpjcDsKLQkJcGJ5dGUgPSAocGJpdCAmIH43KSAvIDg7Ci0JCWlmIChwYml0ID4gMTI4KSB7Ci0JCQlwcmludGYoIiAldShiYWQgcGxlbikiLCBwYml0KTsKLQkJCWJyZWFrOwotCQl9IGVsc2UgaWYgKHBiaXQgPCAxMjgpIHsKLQkJCWlmICghVFRFU1QyKCooY3AgKyAxKSwgc2l6ZW9mKGEpIC0gcGJ5dGUpKQotCQkJCXJldHVybihOVUxMKTsKLQkJCW1lbXNldCgmYSwgMCwgc2l6ZW9mKGEpKTsKLQkJCW1lbWNweSgmYS5zNl9hZGRyW3BieXRlXSwgY3AgKyAxLCBzaXplb2YoYSkgLSBwYnl0ZSk7Ci0JCQlwcmludGYoIiAldSAlcyIsIHBiaXQsIGlwNmFkZHJfc3RyaW5nKCZhKSk7Ci0JCX0KLQkJaWYgKHBiaXQgPiAwKSB7Ci0JCQlwdXRjaGFyKCcgJyk7Ci0JCQlpZiAobnNfbnByaW50KGNwICsgMSArIHNpemVvZihhKSAtIHBieXRlLCBicCkgPT0gTlVMTCkKLQkJCQlyZXR1cm4oTlVMTCk7Ci0JCX0KLQkJYnJlYWs7Ci0JICAgIH0KLSNlbmRpZiAvKklORVQ2Ki8KLQotCWNhc2UgVF9PUFQ6Ci0JCXByaW50ZigiIFVEUHNpemU9JXUiLCBjbGFzcyk7Ci0JCWlmIChvcHRfZmxhZ3MgJiAweDgwMDApCi0JCQlwcmludGYoIiBPSyIpOwotCQlicmVhazsKLQotCWNhc2UgVF9VTlNQRUNBOgkJLyogT25lIGxvbmcgc3RyaW5nICovCi0JCWlmICghVFRFU1QyKCpjcCwgbGVuKSkKLQkJCXJldHVybihOVUxMKTsKLQkJaWYgKGZuX3ByaW50bihjcCwgbGVuLCBzbmFwZW5kKSkKLQkJCXJldHVybihOVUxMKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRfVFNJRzoKLQkgICAgewotCQlpZiAoY3AgKyBsZW4gPiBzbmFwZW5kKQotCQkJcmV0dXJuKE5VTEwpOwotCQlpZiAoIXZmbGFnKQotCQkJYnJlYWs7Ci0JCXB1dGNoYXIoJyAnKTsKLQkJaWYgKChjcCA9IG5zX25wcmludChjcCwgYnApKSA9PSBOVUxMKQotCQkJcmV0dXJuKE5VTEwpOwotCQljcCArPSA2OwotCQlpZiAoIVRURVNUMigqY3AsIDIpKQotCQkJcmV0dXJuKE5VTEwpOwotCQlwcmludGYoIiBmdWRnZT0ldSIsIEVYVFJBQ1RfMTZCSVRTKGNwKSk7Ci0JCWNwICs9IDI7Ci0JCWlmICghVFRFU1QyKCpjcCwgMikpCi0JCQlyZXR1cm4oTlVMTCk7Ci0JCXByaW50ZigiIG1hY2xlbj0ldSIsIEVYVFJBQ1RfMTZCSVRTKGNwKSk7Ci0JCWNwICs9IDIgKyBFWFRSQUNUXzE2QklUUyhjcCk7Ci0JCWlmICghVFRFU1QyKCpjcCwgMikpCi0JCQlyZXR1cm4oTlVMTCk7Ci0JCXByaW50ZigiIG9yaWdpZD0ldSIsIEVYVFJBQ1RfMTZCSVRTKGNwKSk7Ci0JCWNwICs9IDI7Ci0JCWlmICghVFRFU1QyKCpjcCwgMikpCi0JCQlyZXR1cm4oTlVMTCk7Ci0JCXByaW50ZigiIGVycm9yPSV1IiwgRVhUUkFDVF8xNkJJVFMoY3ApKTsKLQkJY3AgKz0gMjsKLQkJaWYgKCFUVEVTVDIoKmNwLCAyKSkKLQkJCXJldHVybihOVUxMKTsKLQkJcHJpbnRmKCIgb3RoZXJsZW49JXUiLCBFWFRSQUNUXzE2QklUUyhjcCkpOwotCQljcCArPSAyOwotCSAgICB9Ci0JfQotCXJldHVybiAocnApOwkJLyogWFhYIFRoaXMgaXNuJ3QgYWx3YXlzIHJpZ2h0ICovCi19Ci0KLXZvaWQKLW5zX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCwgaW50IGlzX21kbnMpCi17Ci0JcmVnaXN0ZXIgY29uc3QgSEVBREVSICpucDsKLQlyZWdpc3RlciBpbnQgcWRjb3VudCwgYW5jb3VudCwgbnNjb3VudCwgYXJjb3VudDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwOwotCXVfaW50MTZfdCBiMjsKLQotCW5wID0gKGNvbnN0IEhFQURFUiAqKWJwOwotCVRDSEVDSygqbnApOwotCS8qIGdldCB0aGUgYnl0ZS1vcmRlciByaWdodCAqLwotCXFkY291bnQgPSBFWFRSQUNUXzE2QklUUygmbnAtPnFkY291bnQpOwotCWFuY291bnQgPSBFWFRSQUNUXzE2QklUUygmbnAtPmFuY291bnQpOwotCW5zY291bnQgPSBFWFRSQUNUXzE2QklUUygmbnAtPm5zY291bnQpOwotCWFyY291bnQgPSBFWFRSQUNUXzE2QklUUygmbnAtPmFyY291bnQpOwotCi0JaWYgKEROU19RUihucCkpIHsKLQkJLyogdGhpcyBpcyBhIHJlc3BvbnNlICovCi0JCXByaW50ZigiJWQlcyVzJXMlcyVzJXMiLAotCQkJRVhUUkFDVF8xNkJJVFMoJm5wLT5pZCksCi0JCQluc19vcHNbRE5TX09QQ09ERShucCldLAotCQkJbnNfcmVzcFtETlNfUkNPREUobnApXSwKLQkJCUROU19BQShucCk/ICIqIiA6ICIiLAotCQkJRE5TX1JBKG5wKT8gIiIgOiAiLSIsCi0JCQlETlNfVEMobnApPyAifCIgOiAiIiwKLQkJCUROU19BRChucCk/ICIkIiA6ICIiKTsKLQotCQlpZiAocWRjb3VudCAhPSAxKQotCQkJcHJpbnRmKCIgWyVkcV0iLCBxZGNvdW50KTsKLQkJLyogUHJpbnQgUVVFU1RJT04gc2VjdGlvbiBvbiAtdnYgKi8KLQkJY3AgPSAoY29uc3QgdV9jaGFyICopKG5wICsgMSk7Ci0JCXdoaWxlIChxZGNvdW50LS0pIHsKLQkJCWlmIChxZGNvdW50IDwgRVhUUkFDVF8xNkJJVFMoJm5wLT5xZGNvdW50KSAtIDEpCi0JCQkJcHV0Y2hhcignLCcpOwotCQkJaWYgKHZmbGFnID4gMSkgewotCQkJCWZwdXRzKCIgcToiLCBzdGRvdXQpOwotCQkJCWlmICgoY3AgPSBuc19xcHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKChjcCA9IG5zX25za2lwKGNwKSkgPT0gTlVMTCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCQljcCArPSA0OwkvKiBza2lwIFFUWVBFIGFuZCBRQ0xBU1MgKi8KLQkJCX0KLQkJfQotCQlwcmludGYoIiAlZC8lZC8lZCIsIGFuY291bnQsIG5zY291bnQsIGFyY291bnQpOwotCQlpZiAoYW5jb3VudC0tKSB7Ci0JCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCi0JCQkJZ290byB0cnVuYzsKLQkJCXdoaWxlIChjcCA8IHNuYXBlbmQgJiYgYW5jb3VudC0tKSB7Ci0JCQkJcHV0Y2hhcignLCcpOwotCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCX0KLQkJfQotCQlpZiAoYW5jb3VudCA+IDApCi0JCQlnb3RvIHRydW5jOwotCQkvKiBQcmludCBOUyBhbmQgQVIgc2VjdGlvbnMgb24gLXZ2ICovCi0JCWlmICh2ZmxhZyA+IDEpIHsKLQkJCWlmIChjcCA8IHNuYXBlbmQgJiYgbnNjb3VudC0tKSB7Ci0JCQkJZnB1dHMoIiBuczoiLCBzdGRvdXQpOwotCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCQl3aGlsZSAoY3AgPCBzbmFwZW5kICYmIG5zY291bnQtLSkgewotCQkJCQlwdXRjaGFyKCcsJyk7Ci0JCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKLQkJCQkJCWdvdG8gdHJ1bmM7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5zY291bnQgPiAwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCQlpZiAoY3AgPCBzbmFwZW5kICYmIGFyY291bnQtLSkgewotCQkJCWZwdXRzKCIgYXI6Iiwgc3Rkb3V0KTsKLQkJCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCi0JCQkJCWdvdG8gdHJ1bmM7Ci0JCQkJd2hpbGUgKGNwIDwgc25hcGVuZCAmJiBhcmNvdW50LS0pIHsKLQkJCQkJcHV0Y2hhcignLCcpOwotCQkJCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCi0JCQkJCQlnb3RvIHRydW5jOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhcmNvdW50ID4gMCkKLQkJCQlnb3RvIHRydW5jOwotCQl9Ci0JfQotCWVsc2UgewotCQkvKiB0aGlzIGlzIGEgcmVxdWVzdCAqLwotCQlwcmludGYoIiVkJXMlcyVzIiwgRVhUUkFDVF8xNkJJVFMoJm5wLT5pZCksIG5zX29wc1tETlNfT1BDT0RFKG5wKV0sCi0JCSAgICBETlNfUkQobnApID8gIisiIDogIiIsCi0JCSAgICBETlNfQ0QobnApID8gIiUiIDogIiIpOwotCi0JCS8qIGFueSB3ZWlyZG5lc3M/ICovCi0JCWIyID0gRVhUUkFDVF8xNkJJVFMoKCh1X3Nob3J0ICopbnApKzEpOwotCQlpZiAoYjIgJiAweDZjZikKLQkJCXByaW50ZigiIFtiMiYzPTB4JXhdIiwgYjIpOwotCi0JCWlmIChETlNfT1BDT0RFKG5wKSA9PSBJUVVFUlkpIHsKLQkJCWlmIChxZGNvdW50KQotCQkJCXByaW50ZigiIFslZHFdIiwgcWRjb3VudCk7Ci0JCQlpZiAoYW5jb3VudCAhPSAxKQotCQkJCXByaW50ZigiIFslZGFdIiwgYW5jb3VudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoYW5jb3VudCkKLQkJCQlwcmludGYoIiBbJWRhXSIsIGFuY291bnQpOwotCQkJaWYgKHFkY291bnQgIT0gMSkKLQkJCQlwcmludGYoIiBbJWRxXSIsIHFkY291bnQpOwotCQl9Ci0JCWlmIChuc2NvdW50KQotCQkJcHJpbnRmKCIgWyVkbl0iLCBuc2NvdW50KTsKLQkJaWYgKGFyY291bnQpCi0JCQlwcmludGYoIiBbJWRhdV0iLCBhcmNvdW50KTsKLQotCQljcCA9IChjb25zdCB1X2NoYXIgKikobnAgKyAxKTsKLQkJaWYgKHFkY291bnQtLSkgewotCQkJY3AgPSBuc19xcHJpbnQoY3AsIChjb25zdCB1X2NoYXIgKilucCwgaXNfbWRucyk7Ci0JCQlpZiAoIWNwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCQl3aGlsZSAoY3AgPCBzbmFwZW5kICYmIHFkY291bnQtLSkgewotCQkJCWNwID0gbnNfcXByaW50KChjb25zdCB1X2NoYXIgKiljcCwKLQkJCQkJICAgICAgIChjb25zdCB1X2NoYXIgKilucCwKLQkJCQkJICAgICAgIGlzX21kbnMpOwotCQkJCWlmICghY3ApCi0JCQkJCWdvdG8gdHJ1bmM7Ci0JCQl9Ci0JCX0KLQkJaWYgKHFkY291bnQgPiAwKQotCQkJZ290byB0cnVuYzsKLQotCQkvKiBQcmludCByZW1haW5pbmcgc2VjdGlvbnMgb24gLXZ2ICovCi0JCWlmICh2ZmxhZyA+IDEpIHsKLQkJCWlmIChhbmNvdW50LS0pIHsKLQkJCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCi0JCQkJCWdvdG8gdHJ1bmM7Ci0JCQkJd2hpbGUgKGNwIDwgc25hcGVuZCAmJiBhbmNvdW50LS0pIHsKLQkJCQkJcHV0Y2hhcignLCcpOwotCQkJCQlpZiAoKGNwID0gbnNfcnByaW50KGNwLCBicCwgaXNfbWRucykpID09IE5VTEwpCi0JCQkJCQlnb3RvIHRydW5jOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbmNvdW50ID4gMCkKLQkJCQlnb3RvIHRydW5jOwotCQkJaWYgKGNwIDwgc25hcGVuZCAmJiBuc2NvdW50LS0pIHsKLQkJCQlmcHV0cygiIG5zOiIsIHN0ZG91dCk7Ci0JCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQotCQkJCQlnb3RvIHRydW5jOwotCQkJCXdoaWxlIChuc2NvdW50LS0gJiYgY3AgPCBzbmFwZW5kKSB7Ci0JCQkJCXB1dGNoYXIoJywnKTsKLQkJCQkJaWYgKChjcCA9IG5zX3JwcmludChjcCwgYnAsIGlzX21kbnMpKSA9PSBOVUxMKQotCQkJCQkJZ290byB0cnVuYzsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobnNjb3VudCA+IDApCi0JCQkJZ290byB0cnVuYzsKLQkJCWlmIChjcCA8IHNuYXBlbmQgJiYgYXJjb3VudC0tKSB7Ci0JCQkJZnB1dHMoIiBhcjoiLCBzdGRvdXQpOwotCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCQl3aGlsZSAoY3AgPCBzbmFwZW5kICYmIGFyY291bnQtLSkgewotCQkJCQlwdXRjaGFyKCcsJyk7Ci0JCQkJCWlmICgoY3AgPSBuc19ycHJpbnQoY3AsIGJwLCBpc19tZG5zKSkgPT0gTlVMTCkKLQkJCQkJCWdvdG8gdHJ1bmM7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFyY291bnQgPiAwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCX0KLQl9Ci0JcHJpbnRmKCIgKCVkKSIsIGxlbmd0aCk7Ci0JcmV0dXJuOwotCi0gIHRydW5jOgotCXByaW50ZigiW3xkb21haW5dIik7Ci0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZHZtcnAuYyBiL3ByaW50LWR2bXJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTU5YmYuLjAwMDAwMDAKLS0tIGEvcHJpbnQtZHZtcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZHZtcnAuYyx2IDEuMjcgMjAwMy8xMS8xOSAwOTo0MjowNCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLQotLyoKLSAqIERWTVJQIG1lc3NhZ2UgdHlwZXMgYW5kIGZsYWcgdmFsdWVzIHNoYW1lbGVzc2x5IHN0b2xlbiBmcm9tCi0gKiBtcm91dGVkL2R2bXJwLmguCi0gKi8KLSNkZWZpbmUgRFZNUlBfUFJPQkUJCTEJLyogZm9yIGZpbmRpbmcgbmVpZ2hib3JzICovCi0jZGVmaW5lIERWTVJQX1JFUE9SVAkJMgkvKiBmb3IgcmVwb3J0aW5nIHNvbWUgb3IgYWxsIHJvdXRlcyAqLwotI2RlZmluZSBEVk1SUF9BU0tfTkVJR0hCT1JTCTMJLyogc2VudCBieSBtYXBwZXIsIGFza2luZyBmb3IgYSBsaXN0ICovCi0JCQkJCS8qIG9mIHRoaXMgcm91dGVyJ3MgbmVpZ2hib3JzICovCi0jZGVmaW5lIERWTVJQX05FSUdIQk9SUwkJNAkvKiByZXNwb25zZSB0byBzdWNoIGEgcmVxdWVzdCAqLwotI2RlZmluZSBEVk1SUF9BU0tfTkVJR0hCT1JTMgk1CS8qIGFzIGFib3ZlLCB3YW50IG5ldyBmb3JtYXQgcmVwbHkgKi8KLSNkZWZpbmUgRFZNUlBfTkVJR0hCT1JTMgk2Ci0jZGVmaW5lIERWTVJQX1BSVU5FCQk3CS8qIHBydW5lIG1lc3NhZ2UgKi8KLSNkZWZpbmUgRFZNUlBfR1JBRlQJCTgJLyogZ3JhZnQgbWVzc2FnZSAqLwotI2RlZmluZSBEVk1SUF9HUkFGVF9BQ0sJCTkJLyogZ3JhZnQgYWNrbm93bGVkZ2VtZW50ICovCi0KLS8qCi0gKiAnZmxhZ3MnIGJ5dGUgdmFsdWVzIGluIERWTVJQX05FSUdIQk9SUzIgcmVwbHkuCi0gKi8KLSNkZWZpbmUgRFZNUlBfTkZfVFVOTkVMCQkweDAxCS8qIG5laWdoYm9ycyByZWFjaGVkIHZpYSB0dW5uZWwgKi8KLSNkZWZpbmUgRFZNUlBfTkZfU1JDUlQJCTB4MDIJLyogdHVubmVsIHVzZXMgSVAgc291cmNlIHJvdXRpbmcgKi8KLSNkZWZpbmUgRFZNUlBfTkZfRE9XTgkJMHgxMAkvKiBrZXJuZWwgc3RhdGUgb2YgaW50ZXJmYWNlICovCi0jZGVmaW5lIERWTVJQX05GX0RJU0FCTEVECTB4MjAJLyogYWRtaW5pc3RyYXRpdmVseSBkaXNhYmxlZCAqLwotI2RlZmluZSBEVk1SUF9ORl9RVUVSSUVSCTB4NDAJLyogSSBhbSB0aGUgc3VibmV0J3MgcXVlcmllciAqLwotCi1zdGF0aWMgaW50IHByaW50X3Byb2JlKGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotc3RhdGljIGludCBwcmludF9yZXBvcnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1zdGF0aWMgaW50IHByaW50X25laWdoYm9ycyhjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXN0YXRpYyBpbnQgcHJpbnRfbmVpZ2hib3JzMihjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXN0YXRpYyBpbnQgcHJpbnRfcHJ1bmUoY29uc3QgdV9jaGFyICopOwotc3RhdGljIGludCBwcmludF9ncmFmdChjb25zdCB1X2NoYXIgKik7Ci1zdGF0aWMgaW50IHByaW50X2dyYWZ0X2Fjayhjb25zdCB1X2NoYXIgKik7Ci0KLXN0YXRpYyB1X2ludDMyX3QgdGFyZ2V0X2xldmVsOwotCi12b2lkCi1kdm1ycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCi17Ci0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcDsKLQlyZWdpc3RlciB1X2NoYXIgdHlwZTsKLQotCWVwID0gKGNvbnN0IHVfY2hhciAqKXNuYXBlbmQ7Ci0JaWYgKGJwID49IGVwKQotCQlyZXR1cm47Ci0KLQlUQ0hFQ0soYnBbMV0pOwotCXR5cGUgPSBicFsxXTsKLQotCS8qIFNraXAgSUdNUCBoZWFkZXIgKi8KLQlicCArPSA4OwotCWxlbiAtPSA4OwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0KLQljYXNlIERWTVJQX1BST0JFOgotCQlwcmludGYoIiBQcm9iZSIpOwotCQlpZiAodmZsYWcpIHsKLQkJCWlmIChwcmludF9wcm9iZShicCwgZXAsIGxlbikgPCAwKQotCQkJCWdvdG8gdHJ1bmM7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIERWTVJQX1JFUE9SVDoKLQkJcHJpbnRmKCIgUmVwb3J0Iik7Ci0JCWlmICh2ZmxhZyA+IDEpIHsKLQkJCWlmIChwcmludF9yZXBvcnQoYnAsIGVwLCBsZW4pIDwgMCkKLQkJCQlnb3RvIHRydW5jOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBEVk1SUF9BU0tfTkVJR0hCT1JTOgotCQlwcmludGYoIiBBc2stbmVpZ2hib3JzKG9sZCkiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIERWTVJQX05FSUdIQk9SUzoKLQkJcHJpbnRmKCIgTmVpZ2hib3JzKG9sZCkiKTsKLQkJaWYgKHByaW50X25laWdoYm9ycyhicCwgZXAsIGxlbikgPCAwKQotCQkJZ290byB0cnVuYzsKLQkJYnJlYWs7Ci0KLQljYXNlIERWTVJQX0FTS19ORUlHSEJPUlMyOgotCQlwcmludGYoIiBBc2stbmVpZ2hib3JzMiIpOwotCQlicmVhazsKLQotCWNhc2UgRFZNUlBfTkVJR0hCT1JTMjoKLQkJcHJpbnRmKCIgTmVpZ2hib3JzMiIpOwotCQkvKgotCQkgKiBleHRyYWN0IHZlcnNpb24gYW5kIGNhcGFiaWxpdGllcyBmcm9tIElHTVAgZ3JvdXAKLQkJICogYWRkcmVzcyBmaWVsZAotCQkgKi8KLQkJYnAgLT0gNDsKLQkJVENIRUNLMihicFswXSwgNCk7Ci0JCXRhcmdldF9sZXZlbCA9IChicFswXSA8PCAyNCkgfCAoYnBbMV0gPDwgMTYpIHwKLQkJICAgIChicFsyXSA8PCA4KSB8IGJwWzNdOwotCQlicCArPSA0OwotCQlpZiAocHJpbnRfbmVpZ2hib3JzMihicCwgZXAsIGxlbikgPCAwKQotCQkJZ290byB0cnVuYzsKLQkJYnJlYWs7Ci0KLQljYXNlIERWTVJQX1BSVU5FOgotCQlwcmludGYoIiBQcnVuZSIpOwotCQlpZiAocHJpbnRfcHJ1bmUoYnApIDwgMCkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWJyZWFrOwotCi0JY2FzZSBEVk1SUF9HUkFGVDoKLQkJcHJpbnRmKCIgR3JhZnQiKTsKLQkJaWYgKHByaW50X2dyYWZ0KGJwKSA8IDApCi0JCQlnb3RvIHRydW5jOwotCQlicmVhazsKLQotCWNhc2UgRFZNUlBfR1JBRlRfQUNLOgotCQlwcmludGYoIiBHcmFmdC1BQ0siKTsKLQkJaWYgKHByaW50X2dyYWZ0X2FjayhicCkgPCAwKQotCQkJZ290byB0cnVuYzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIiBbdHlwZSAlZF0iLCB0eXBlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfGR2bXJwXSIpOwotCXJldHVybjsKLX0KLQotc3RhdGljIGludCAKLXByaW50X3JlcG9ydChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwLAotICAgIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLQlyZWdpc3RlciB1X2ludDMyX3QgbWFzaywgb3JpZ2luOwotCXJlZ2lzdGVyIGludCBtZXRyaWMsIGRvbmU7Ci0JcmVnaXN0ZXIgdV9pbnQgaSwgd2lkdGg7Ci0KLQl3aGlsZSAobGVuID4gMCkgewotCQlpZiAobGVuIDwgMykgewotCQkJcHJpbnRmKCIgW3xdIik7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0JCVRDSEVDSzIoYnBbMF0sIDMpOwotCQltYXNrID0gKHVfaW50MzJfdCkweGZmIDw8IDI0IHwgYnBbMF0gPDwgMTYgfCBicFsxXSA8PCA4IHwgYnBbMl07Ci0JCXdpZHRoID0gMTsKLQkJaWYgKGJwWzBdKQotCQkJd2lkdGggPSAyOwotCQlpZiAoYnBbMV0pCi0JCQl3aWR0aCA9IDM7Ci0JCWlmIChicFsyXSkKLQkJCXdpZHRoID0gNDsKLQotCQlwcmludGYoIlxuXHRNYXNrICVzIiwgaW50b2EoaHRvbmwobWFzaykpKTsKLQkJYnAgKz0gMzsKLQkJbGVuIC09IDM7Ci0JCWRvIHsKLQkJCWlmIChicCArIHdpZHRoICsgMSA+IGVwKSB7Ci0JCQkJcHJpbnRmKCIgW3xdIik7Ci0JCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCWlmIChsZW4gPCB3aWR0aCArIDEpIHsKLQkJCQlwcmludGYoIlxuXHQgIFtUcnVuY2F0ZWQgUmVwb3J0XSIpOwotCQkJCXJldHVybiAoMCk7Ci0JCQl9Ci0JCQlvcmlnaW4gPSAwOwotCQkJZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKLQkJCQlUQ0hFQ0soKmJwKTsKLQkJCQlvcmlnaW4gPSBvcmlnaW4gPDwgOCB8ICpicCsrOwotCQkJfQotCQkJZm9yICggOyBpIDwgNDsgKytpKQotCQkJCW9yaWdpbiA8PD0gODsKLQotCQkJVENIRUNLKCpicCk7Ci0JCQltZXRyaWMgPSAqYnArKzsKLQkJCWRvbmUgPSBtZXRyaWMgJiAweDgwOwotCQkJbWV0cmljICY9IDB4N2Y7Ci0JCQlwcmludGYoIlxuXHQgICVzIG1ldHJpYyAlZCIsIGludG9hKGh0b25sKG9yaWdpbikpLAotCQkJCW1ldHJpYyk7Ci0JCQlsZW4gLT0gd2lkdGggKyAxOwotCQl9IHdoaWxlICghZG9uZSk7Ci0JfQotCXJldHVybiAoMCk7Ci10cnVuYzoKLQlyZXR1cm4gKC0xKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfcHJvYmUocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcCwKLSAgICByZWdpc3RlciB1X2ludCBsZW4pCi17Ci0JcmVnaXN0ZXIgdV9pbnQzMl90IGdlbmlkOwotCi0JVENIRUNLMihicFswXSwgNCk7Ci0JaWYgKChsZW4gPCA0KSB8fCAoKGJwICsgNCkgPiBlcCkpIHsKLQkJLyogeyAoY3RhZ3MpICovCi0JCXByaW50ZigiIFt8fSIpOwotCQlyZXR1cm4gKDApOwotCX0KLQlnZW5pZCA9IChicFswXSA8PCAyNCkgfCAoYnBbMV0gPDwgMTYpIHwgKGJwWzJdIDw8IDgpIHwgYnBbM107Ci0JYnAgKz0gNDsKLQlsZW4gLT0gNDsKLQlpZiAodmZsYWcgPiAxKQotCQlwcmludGYoIlxuXHQiKTsKLQllbHNlCi0JCXByaW50ZigiICIpOwotCXByaW50ZigiZ2VuaWQgJXUiLCBnZW5pZCk7Ci0JaWYgKHZmbGFnIDwgMikKLQkJcmV0dXJuICgwKTsKLQotCXdoaWxlICgobGVuID4gMCkgJiYgKGJwIDwgZXApKSB7Ci0JCVRDSEVDSzIoYnBbMF0sIDQpOwotCQlwcmludGYoIlxuXHRuZWlnaGJvciAlcyIsIGlwYWRkcl9zdHJpbmcoYnApKTsKLQkJYnAgKz0gNDsgbGVuIC09IDQ7Ci0JfQotCXJldHVybiAoMCk7Ci10cnVuYzoKLQlyZXR1cm4gKC0xKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfbmVpZ2hib3JzKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXAsCi0gICAgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotCWNvbnN0IHVfY2hhciAqbGFkZHI7Ci0JcmVnaXN0ZXIgdV9jaGFyIG1ldHJpYzsKLQlyZWdpc3RlciB1X2NoYXIgdGhyZXNoOwotCXJlZ2lzdGVyIGludCBuY291bnQ7Ci0KLQl3aGlsZSAobGVuID4gMCAmJiBicCA8IGVwKSB7Ci0JCVRDSEVDSzIoYnBbMF0sIDcpOwotCQlsYWRkciA9IGJwOwotCQlicCArPSA0OwotCQltZXRyaWMgPSAqYnArKzsKLQkJdGhyZXNoID0gKmJwKys7Ci0JCW5jb3VudCA9ICpicCsrOwotCQlsZW4gLT0gNzsKLQkJd2hpbGUgKC0tbmNvdW50ID49IDApIHsKLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJcHJpbnRmKCIgWyVzIC0+IiwgaXBhZGRyX3N0cmluZyhsYWRkcikpOwotCQkJcHJpbnRmKCIgJXMsICglZC8lZCldIiwKLQkJCQkgICBpcGFkZHJfc3RyaW5nKGJwKSwgbWV0cmljLCB0aHJlc2gpOwotCQkJYnAgKz0gNDsKLQkJCWxlbiAtPSA0OwotCQl9Ci0JfQotCXJldHVybiAoMCk7Ci10cnVuYzoKLQlyZXR1cm4gKC0xKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfbmVpZ2hib3JzMihyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwLAotICAgIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLQljb25zdCB1X2NoYXIgKmxhZGRyOwotCXJlZ2lzdGVyIHVfY2hhciBtZXRyaWMsIHRocmVzaCwgZmxhZ3M7Ci0JcmVnaXN0ZXIgaW50IG5jb3VudDsKLQotCXByaW50ZigiICh2ICVkLiVkKToiLAotCSAgICAgICAoaW50KXRhcmdldF9sZXZlbCAmIDB4ZmYsCi0JICAgICAgIChpbnQpKHRhcmdldF9sZXZlbCA+PiA4KSAmIDB4ZmYpOwotCi0Jd2hpbGUgKGxlbiA+IDAgJiYgYnAgPCBlcCkgewotCQlUQ0hFQ0syKGJwWzBdLCA4KTsKLQkJbGFkZHIgPSBicDsKLQkJYnAgKz0gNDsKLQkJbWV0cmljID0gKmJwKys7Ci0JCXRocmVzaCA9ICpicCsrOwotCQlmbGFncyA9ICpicCsrOwotCQluY291bnQgPSAqYnArKzsKLQkJbGVuIC09IDg7Ci0JCXdoaWxlICgtLW5jb3VudCA+PSAwICYmIChsZW4gPj0gNCkgJiYgKGJwICsgNCkgPD0gZXApIHsKLQkJCXByaW50ZigiIFslcyAtPiAiLCBpcGFkZHJfc3RyaW5nKGxhZGRyKSk7Ci0JCQlwcmludGYoIiVzICglZC8lZCIsIGlwYWRkcl9zdHJpbmcoYnApLAotCQkJCSAgICAgbWV0cmljLCB0aHJlc2gpOwotCQkJaWYgKGZsYWdzICYgRFZNUlBfTkZfVFVOTkVMKQotCQkJCXByaW50ZigiL3R1bm5lbCIpOwotCQkJaWYgKGZsYWdzICYgRFZNUlBfTkZfU1JDUlQpCi0JCQkJcHJpbnRmKCIvc3JjcnQiKTsKLQkJCWlmIChmbGFncyAmIERWTVJQX05GX1FVRVJJRVIpCi0JCQkJcHJpbnRmKCIvcXVlcmllciIpOwotCQkJaWYgKGZsYWdzICYgRFZNUlBfTkZfRElTQUJMRUQpCi0JCQkJcHJpbnRmKCIvZGlzYWJsZWQiKTsKLQkJCWlmIChmbGFncyAmIERWTVJQX05GX0RPV04pCi0JCQkJcHJpbnRmKCIvZG93biIpOwotCQkJcHJpbnRmKCIpXSIpOwotCQkJYnAgKz0gNDsKLQkJCWxlbiAtPSA0OwotCQl9Ci0JCWlmIChuY291bnQgIT0gLTEpIHsKLQkJCXByaW50ZigiIFt8XSIpOwotCQkJcmV0dXJuICgwKTsKLQkJfQotCX0KLQlyZXR1cm4gKDApOwotdHJ1bmM6Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X3BydW5lKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnApCi17Ci0JVENIRUNLMihicFswXSwgMTIpOwotCXByaW50ZigiIHNyYyAlcyBncnAgJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSwgaXBhZGRyX3N0cmluZyhicCArIDQpKTsKLQlicCArPSA4OwotCSh2b2lkKXByaW50ZigiIHRpbWVyICIpOwotCXJlbHRzX3ByaW50KEVYVFJBQ1RfMzJCSVRTKGJwKSk7Ci0JcmV0dXJuICgwKTsKLXRydW5jOgotCXJldHVybiAoLTEpOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9ncmFmdChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwKQotewotCVRDSEVDSzIoYnBbMF0sIDgpOwotCXByaW50ZigiIHNyYyAlcyBncnAgJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSwgaXBhZGRyX3N0cmluZyhicCArIDQpKTsKLQlyZXR1cm4gKDApOwotdHJ1bmM6Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaW50X2dyYWZ0X2FjayhyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwKQotewotCVRDSEVDSzIoYnBbMF0sIDgpOwotCXByaW50ZigiIHNyYyAlcyBncnAgJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSwgaXBhZGRyX3N0cmluZyhicCArIDQpKTsKLQlyZXR1cm4gKDApOwotdHJ1bmM6Ci0JcmV0dXJuICgtMSk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1lYXAuYyBiL3ByaW50LWVhcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjM5ZTc2Li4wMDAwMDAwCi0tLSBhL3ByaW50LWVhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCAtIE1pY2hhZWwgUmljaGFyZHNvbiA8bWNyQHhlbGVyYW5jZS5jb20+Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZvcm1hdCBhbmQgcHJpbnQgYm9vdHAgcGFja2V0cy4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1lYXAuYyx2IDEuMyAyMDA0LzA0LzIzIDE5OjAzOjM5IG1jciBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJuZXRkaXNzZWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJldGhlci5oIgotCi1zdHJ1Y3QgZWFwX3BhY2tldF90IHsKLQl1bnNpZ25lZCBjaGFyCWNvZGU7Ci0JdW5zaWduZWQgY2hhcglpZDsKLQl1bnNpZ25lZCBjaGFyCWxlbmd0aFsyXTsKLQl1bnNpZ25lZCBjaGFyCWRhdGFbMV07Ci19OwotCi0vKgotICogUHJpbnQgYm9vdHAgcmVxdWVzdHMKLSAqLwotdm9pZAotZWFwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCSAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwKLQkgIHVfaW50IGxlbmd0aCBfVV8pCi17Ci0JY29uc3Qgc3RydWN0IGVhcF9wYWNrZXRfdCAqZWFwOwotCi0JZWFwID0gKGNvbnN0IHN0cnVjdCBlYXBfcGFja2V0X3QgKiljcDsKLQlORF9UQ0hFQ0soZWFwLT5kYXRhKTsKLQotICAgICAgICBORF9QUklOVCgobmRvLCAiRUFQIGNvZGU9JXUgaWQ9JXUgbGVuZ3RoPSV1ICIsIAotCQkgIGVhcC0+Y29kZSwgZWFwLT5pZCwgKGVhcC0+bGVuZ3RoWzBdPDw4KSArIGVhcC0+bGVuZ3RoWzFdKSk7Ci0KLSAgICAgICAgaWYgKCFuZG8tPm5kb192ZmxhZykKLSAgICAgICAgICAgIHJldHVybjsKLQotdHJ1bmM6Ci0JOwotfQotCmRpZmYgLS1naXQgYS9wcmludC1lZ3AuYyBiL3ByaW50LWVncC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWE4MTFkLi4wMDAwMDAwCi0tLSBhL3ByaW50LWVncC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0gKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSwKLSAqIEJlcmtlbGV5LCBDQS4gIFRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0bwotICogZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKLSAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEluaXRpYWwgY29udHJpYnV0aW9uIGZyb20gSmVmZiBIb25pZyAoamNoQE1JVENIRUxMLkNJVC5DT1JORUxMLkVEVSkuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZWdwLmMsdiAxLjM3IDIwMDUvMDEvMTIgMTE6MTk6MDkgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLSNpbmNsdWRlICJpcC5oIgotCi1zdHJ1Y3QgZWdwX3BhY2tldCB7Ci0JdV9pbnQ4X3QgIGVncF92ZXJzaW9uOwotI2RlZmluZQlFR1BfVkVSU0lPTgkyCi0JdV9pbnQ4X3QgIGVncF90eXBlOwotI2RlZmluZSAgRUdQVF9BQ1FVSVJFCTMKLSNkZWZpbmUgIEVHUFRfUkVBQ0gJNQotI2RlZmluZSAgRUdQVF9QT0xMCTIKLSNkZWZpbmUgIEVHUFRfVVBEQVRFCTEKLSNkZWZpbmUgIEVHUFRfRVJST1IJOAotCXVfaW50OF90ICBlZ3BfY29kZTsKLSNkZWZpbmUgIEVHUENfUkVRVUVTVAkwCi0jZGVmaW5lICBFR1BDX0NPTkZJUk0JMQotI2RlZmluZSAgRUdQQ19SRUZVU0UJMgotI2RlZmluZSAgRUdQQ19DRUFTRQkzCi0jZGVmaW5lICBFR1BDX0NFQVNFQUNLCTQKLSNkZWZpbmUgIEVHUENfSEVMTE8JMAotI2RlZmluZSAgRUdQQ19IRUFSRFUJMQotCXVfaW50OF90ICBlZ3Bfc3RhdHVzOwotI2RlZmluZSAgRUdQU19VTlNQRUMJMAotI2RlZmluZSAgRUdQU19BQ1RJVkUJMQotI2RlZmluZSAgRUdQU19QQVNTSVZFCTIKLSNkZWZpbmUgIEVHUFNfTk9SRVMJMwotI2RlZmluZSAgRUdQU19BRE1JTgk0Ci0jZGVmaW5lICBFR1BTX0dPRE9XTgk1Ci0jZGVmaW5lICBFR1BTX1BBUkFNCTYKLSNkZWZpbmUgIEVHUFNfUFJPVE8JNwotI2RlZmluZSAgRUdQU19JTkRFVAkwCi0jZGVmaW5lICBFR1BTX1VQCTEKLSNkZWZpbmUgIEVHUFNfRE9XTgkyCi0jZGVmaW5lICBFR1BTX1VOU09MCTB4ODAKLQl1X2ludDE2X3QgIGVncF9jaGVja3N1bTsKLQl1X2ludDE2X3QgIGVncF9hczsKLQl1X2ludDE2X3QgIGVncF9zZXF1ZW5jZTsKLQl1bmlvbiB7Ci0JCXVfaW50MTZfdCAgZWdwdV9oZWxsbzsKLQkJdV9pbnQ4X3QgZWdwdV9nd3NbMl07Ci0JCXVfaW50MTZfdCAgZWdwdV9yZWFzb247Ci0jZGVmaW5lICBFR1BSX1VOU1BFQwkwCi0jZGVmaW5lICBFR1BSX0JBREhFQUQJMQotI2RlZmluZSAgRUdQUl9CQUREQVRBCTIKLSNkZWZpbmUgIEVHUFJfTk9SRUFDSAkzCi0jZGVmaW5lICBFR1BSX1hTUE9MTAk0Ci0jZGVmaW5lICBFR1BSX05PUkVTUAk1Ci0jZGVmaW5lICBFR1BSX1VWRVJTSU9OCTYKLQl9IGVncF9oYW5kZzsKLSNkZWZpbmUgIGVncF9oZWxsbyAgZWdwX2hhbmRnLmVncHVfaGVsbG8KLSNkZWZpbmUgIGVncF9pbnRndyAgZWdwX2hhbmRnLmVncHVfZ3dzWzBdCi0jZGVmaW5lICBlZ3BfZXh0Z3cgIGVncF9oYW5kZy5lZ3B1X2d3c1sxXQotI2RlZmluZSAgZWdwX3JlYXNvbiAgZWdwX2hhbmRnLmVncHVfcmVhc29uCi0JdW5pb24gewotCQl1X2ludDE2X3QgIGVncHVfcG9sbDsKLQkJdV9pbnQzMl90IGVncHVfc291cmNlbmV0OwotCX0gZWdwX3BhbmRzOwotI2RlZmluZSAgZWdwX3BvbGwgIGVncF9wYW5kcy5lZ3B1X3BvbGwKLSNkZWZpbmUgIGVncF9zb3VyY2VuZXQgIGVncF9wYW5kcy5lZ3B1X3NvdXJjZW5ldAotfTsKLQotY29uc3QgY2hhciAqZWdwX2FjcXVpcmVfY29kZXNbXSA9IHsKLQkicmVxdWVzdCIsCi0JImNvbmZpcm0iLAotCSJyZWZ1c2UiLAotCSJjZWFzZSIsCi0JImNlYXNlX2FjayIKLX07Ci0KLWNvbnN0IGNoYXIgKmVncF9hY3F1aXJlX3N0YXR1c1tdID0gewotCSJ1bnNwZWNpZmllZCIsCi0JImFjdGl2ZV9tb2RlIiwKLQkicGFzc2l2ZV9tb2RlIiwKLQkiaW5zdWZmaWNpZW50X3Jlc291cmNlcyIsCi0JImFkbWluaXN0cmF0aXZlbHlfcHJvaGliaXRlZCIsCi0JImdvaW5nX2Rvd24iLAotCSJwYXJhbWV0ZXJfdmlvbGF0aW9uIiwKLQkicHJvdG9jb2xfdmlvbGF0aW9uIgotfTsKLQotY29uc3QgY2hhciAqZWdwX3JlYWNoX2NvZGVzW10gPSB7Ci0JImhlbGxvIiwKLQkiaS1oLXUiCi19OwotCi1jb25zdCBjaGFyICplZ3Bfc3RhdHVzX3VwZG93bltdID0gewotCSJpbmRldGVybWluYXRlIiwKLQkidXAiLAotCSJkb3duIgotfTsKLQotY29uc3QgY2hhciAqZWdwX3JlYXNvbnNbXSA9IHsKLQkidW5zcGVjaWZpZWQiLAotCSJiYWRfRUdQX2hlYWRlcl9mb3JtYXQiLAotCSJiYWRfRUdQX2RhdGFfZmllbGRfZm9ybWF0IiwKLQkicmVhY2hhYmlsaXR5X2luZm9fdW5hdmFpbGFibGUiLAotCSJleGNlc3NpdmVfcG9sbGluZ19yYXRlIiwKLQkibm9fcmVzcG9uc2UiLAotCSJ1bnN1cHBvcnRlZF92ZXJzaW9uIgotfTsKLQotc3RhdGljIHZvaWQKLWVncG5ycHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGVncF9wYWNrZXQgKmVncCkKLXsKLQlyZWdpc3RlciBjb25zdCB1X2ludDhfdCAqY3A7Ci0JdV9pbnQzMl90IGFkZHI7Ci0JcmVnaXN0ZXIgdV9pbnQzMl90IG5ldDsKLQlyZWdpc3RlciB1X2ludCBuZXRsZW47Ci0JaW50IGdhdGV3YXlzLCBkaXN0YW5jZXMsIG5ldHdvcmtzOwotCWludCB0X2dhdGV3YXlzOwotCWNvbnN0IGNoYXIgKmNvbW1hOwotCi0JYWRkciA9IGVncC0+ZWdwX3NvdXJjZW5ldDsKLQlpZiAoSU5fQ0xBU1NBKGFkZHIpKSB7Ci0JCW5ldCA9IGFkZHIgJiBJTl9DTEFTU0FfTkVUOwotCQluZXRsZW4gPSAxOwotCX0gZWxzZSBpZiAoSU5fQ0xBU1NCKGFkZHIpKSB7Ci0JCW5ldCA9IGFkZHIgJiBJTl9DTEFTU0JfTkVUOwotCQluZXRsZW4gPSAyOwotCX0gZWxzZSBpZiAoSU5fQ0xBU1NDKGFkZHIpKSB7Ci0JCW5ldCA9IGFkZHIgJiBJTl9DTEFTU0NfTkVUOwotCQluZXRsZW4gPSAzOwotCX0gZWxzZSB7Ci0JCW5ldCA9IDA7Ci0JCW5ldGxlbiA9IDA7Ci0JfQotCWNwID0gKHVfaW50OF90ICopKGVncCArIDEpOwotCi0JdF9nYXRld2F5cyA9IGVncC0+ZWdwX2ludGd3ICsgZWdwLT5lZ3BfZXh0Z3c7Ci0JZm9yIChnYXRld2F5cyA9IDA7IGdhdGV3YXlzIDwgdF9nYXRld2F5czsgKytnYXRld2F5cykgewotCQkvKiBQaWNrdXAgaG9zdCBwYXJ0IG9mIGdhdGV3YXkgYWRkcmVzcyAqLwotCQlhZGRyID0gMDsKLQkJVENIRUNLMihjcFswXSwgNCAtIG5ldGxlbik7Ci0JCXN3aXRjaCAobmV0bGVuKSB7Ci0KLQkJY2FzZSAxOgotCQkJYWRkciA9ICpjcCsrOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgMjoKLQkJCWFkZHIgPSAoYWRkciA8PCA4KSB8ICpjcCsrOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgMzoKLQkJCWFkZHIgPSAoYWRkciA8PCA4KSB8ICpjcCsrOwotCQl9Ci0JCWFkZHIgfD0gbmV0OwotCQlUQ0hFQ0syKGNwWzBdLCAxKTsKLQkJZGlzdGFuY2VzID0gKmNwKys7Ci0JCXByaW50ZigiICVzICVzICIsCi0JCSAgICAgICBnYXRld2F5cyA8IChpbnQpZWdwLT5lZ3BfaW50Z3cgPyAiaW50IiA6ICJleHQiLAotCQkgICAgICAgaXBhZGRyX3N0cmluZygmYWRkcikpOwotCi0JCWNvbW1hID0gIiI7Ci0JCXB1dGNoYXIoJygnKTsKLQkJd2hpbGUgKC0tZGlzdGFuY2VzID49IDApIHsKLQkJCVRDSEVDSzIoY3BbMF0sIDIpOwotCQkJcHJpbnRmKCIlc2QlZDoiLCBjb21tYSwgKGludCkqY3ArKyk7Ci0JCQljb21tYSA9ICIsICI7Ci0JCQluZXR3b3JrcyA9ICpjcCsrOwotCQkJd2hpbGUgKC0tbmV0d29ya3MgPj0gMCkgewotCQkJCS8qIFBpY2t1cCBuZXR3b3JrIG51bWJlciAqLwotCQkJCVRDSEVDSzIoY3BbMF0sIDEpOwotCQkJCWFkZHIgPSAodV9pbnQzMl90KSpjcCsrIDw8IDI0OwotCQkJCWlmIChJTl9DTEFTU0IoYWRkcikpIHsKLQkJCQkJVENIRUNLMihjcFswXSwgMSk7Ci0JCQkJCWFkZHIgfD0gKHVfaW50MzJfdCkqY3ArKyA8PCAxNjsKLQkJCQl9IGVsc2UgaWYgKCFJTl9DTEFTU0EoYWRkcikpIHsKLQkJCQkJVENIRUNLMihjcFswXSwgMik7Ci0JCQkJCWFkZHIgfD0gKHVfaW50MzJfdCkqY3ArKyA8PCAxNjsKLQkJCQkJYWRkciB8PSAodV9pbnQzMl90KSpjcCsrIDw8IDg7Ci0JCQkJfQotCQkJCXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZygmYWRkcikpOwotCQkJfQotCQl9Ci0JCXB1dGNoYXIoJyknKTsKLQl9Ci0JcmV0dXJuOwotdHJ1bmM6Ci0JZnB1dHMoIlt8XSIsIHN0ZG91dCk7Ci19Ci0KLXZvaWQKLWVncF9wcmludChyZWdpc3RlciBjb25zdCB1X2ludDhfdCAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgZWdwX3BhY2tldCAqZWdwOwotCXJlZ2lzdGVyIGludCBzdGF0dXM7Ci0JcmVnaXN0ZXIgaW50IGNvZGU7Ci0JcmVnaXN0ZXIgaW50IHR5cGU7Ci0KLQllZ3AgPSAoc3RydWN0IGVncF9wYWNrZXQgKilicDsKLSAgICAgICAgaWYgKCFUVEVTVDIoKmVncCwgbGVuZ3RoKSkgewotCQlwcmludGYoIlt8ZWdwXSIpOwotCQlyZXR1cm47Ci0JfQotCSh2b2lkKXByaW50ZigiZWdwOiAiKTsKLQotCWlmIChlZ3AtPmVncF92ZXJzaW9uICE9IEVHUF9WRVJTSU9OKSB7Ci0JCXByaW50ZigiW3ZlcnNpb24gJWRdIiwgZWdwLT5lZ3BfdmVyc2lvbik7Ci0JCXJldHVybjsKLQl9Ci0JcHJpbnRmKCJhczolZCBzZXE6JWQiLCBFWFRSQUNUXzE2QklUUygmZWdwLT5lZ3BfYXMpLCBFWFRSQUNUXzE2QklUUygmZWdwLT5lZ3Bfc2VxdWVuY2UpKTsKLQotCXR5cGUgPSBlZ3AtPmVncF90eXBlOwotCWNvZGUgPSBlZ3AtPmVncF9jb2RlOwotCXN0YXR1cyA9IGVncC0+ZWdwX3N0YXR1czsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgRUdQVF9BQ1FVSVJFOgotCQlwcmludGYoIiBhY3F1aXJlIik7Ci0JCXN3aXRjaCAoY29kZSkgewotCQljYXNlIEVHUENfUkVRVUVTVDoKLQkJY2FzZSBFR1BDX0NPTkZJUk06Ci0JCQlwcmludGYoIiAlcyIsIGVncF9hY3F1aXJlX2NvZGVzW2NvZGVdKTsKLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQljYXNlIEVHUFNfVU5TUEVDOgotCQkJY2FzZSBFR1BTX0FDVElWRToKLQkJCWNhc2UgRUdQU19QQVNTSVZFOgotCQkJCXByaW50ZigiICVzIiwgZWdwX2FjcXVpcmVfc3RhdHVzW3N0YXR1c10pOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiIFtzdGF0dXMgJWRdIiwgc3RhdHVzKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXByaW50ZigiIGhlbGxvOiVkIHBvbGw6JWQiLAotCQkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZlZ3AtPmVncF9oZWxsbyksCi0JCQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJmVncC0+ZWdwX3BvbGwpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRUdQQ19SRUZVU0U6Ci0JCWNhc2UgRUdQQ19DRUFTRToKLQkJY2FzZSBFR1BDX0NFQVNFQUNLOgotCQkJcHJpbnRmKCIgJXMiLCBlZ3BfYWNxdWlyZV9jb2Rlc1tjb2RlXSk7Ci0JCQlzd2l0Y2ggKHN0YXR1cyApIHsKLQkJCWNhc2UgRUdQU19VTlNQRUM6Ci0JCQljYXNlIEVHUFNfTk9SRVM6Ci0JCQljYXNlIEVHUFNfQURNSU46Ci0JCQljYXNlIEVHUFNfR09ET1dOOgotCQkJY2FzZSBFR1BTX1BBUkFNOgotCQkJY2FzZSBFR1BTX1BST1RPOgotCQkJCXByaW50ZigiICVzIiwgZWdwX2FjcXVpcmVfc3RhdHVzW3N0YXR1c10pOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiW3N0YXR1cyAlZF0iLCBzdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByaW50ZigiW2NvZGUgJWRdIiwgY29kZSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgRUdQVF9SRUFDSDoKLQkJc3dpdGNoIChjb2RlKSB7Ci0KLQkJY2FzZSBFR1BDX0hFTExPOgotCQljYXNlIEVHUENfSEVBUkRVOgotCQkJcHJpbnRmKCIgJXMiLCBlZ3BfcmVhY2hfY29kZXNbY29kZV0pOwotCQkJaWYgKHN0YXR1cyA8PSBFR1BTX0RPV04pCi0JCQkJcHJpbnRmKCIgc3RhdGU6JXMiLCBlZ3Bfc3RhdHVzX3VwZG93bltzdGF0dXNdKTsKLQkJCWVsc2UKLQkJCQlwcmludGYoIiBbc3RhdHVzICVkXSIsIHN0YXR1cyk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRmKCJbcmVhY2ggY29kZSAlZF0iLCBjb2RlKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBFR1BUX1BPTEw6Ci0JCXByaW50ZigiIHBvbGwiKTsKLQkJaWYgKGVncC0+ZWdwX3N0YXR1cyA8PSBFR1BTX0RPV04pCi0JCQlwcmludGYoIiBzdGF0ZTolcyIsIGVncF9zdGF0dXNfdXBkb3duW3N0YXR1c10pOwotCQllbHNlCi0JCQlwcmludGYoIiBbc3RhdHVzICVkXSIsIHN0YXR1cyk7Ci0JCXByaW50ZigiIG5ldDolcyIsIGlwYWRkcl9zdHJpbmcoJmVncC0+ZWdwX3NvdXJjZW5ldCkpOwotCQlicmVhazsKLQotCWNhc2UgRUdQVF9VUERBVEU6Ci0JCXByaW50ZigiIHVwZGF0ZSIpOwotCQlpZiAoc3RhdHVzICYgRUdQU19VTlNPTCkgewotCQkJc3RhdHVzICY9IH5FR1BTX1VOU09MOwotCQkJcHJpbnRmKCIgdW5zb2xpY2l0ZWQiKTsKLQkJfQotCQlpZiAoc3RhdHVzIDw9IEVHUFNfRE9XTikKLQkJCXByaW50ZigiIHN0YXRlOiVzIiwgZWdwX3N0YXR1c191cGRvd25bc3RhdHVzXSk7Ci0JCWVsc2UKLQkJCXByaW50ZigiIFtzdGF0dXMgJWRdIiwgc3RhdHVzKTsKLQkJcHJpbnRmKCIgJXMgaW50ICVkIGV4dCAlZCIsCi0JCSAgICAgICBpcGFkZHJfc3RyaW5nKCZlZ3AtPmVncF9zb3VyY2VuZXQpLAotCQkgICAgICAgZWdwLT5lZ3BfaW50Z3csCi0JCSAgICAgICBlZ3AtPmVncF9leHRndyk7Ci0JCWlmICh2ZmxhZykKLQkJCWVncG5ycHJpbnQoZWdwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEVHUFRfRVJST1I6Ci0JCXByaW50ZigiIGVycm9yIik7Ci0JCWlmIChzdGF0dXMgPD0gRUdQU19ET1dOKQotCQkJcHJpbnRmKCIgc3RhdGU6JXMiLCBlZ3Bfc3RhdHVzX3VwZG93bltzdGF0dXNdKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIgW3N0YXR1cyAlZF0iLCBzdGF0dXMpOwotCi0JCWlmIChFWFRSQUNUXzE2QklUUygmZWdwLT5lZ3BfcmVhc29uKSA8PSBFR1BSX1VWRVJTSU9OKQotCQkJcHJpbnRmKCIgJXMiLCBlZ3BfcmVhc29uc1tFWFRSQUNUXzE2QklUUygmZWdwLT5lZ3BfcmVhc29uKV0pOwotCQllbHNlCi0JCQlwcmludGYoIiBbcmVhc29uICVkXSIsIEVYVFJBQ1RfMTZCSVRTKCZlZ3AtPmVncF9yZWFzb24pKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIlt0eXBlICVkXSIsIHR5cGUpOwotCQlicmVhazsKLQl9Ci19CmRpZmYgLS1naXQgYS9wcmludC1laWdycC5jIGIvcHJpbnQtZWlncnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2OGIzYy4uMDAwMDAwMAotLS0gYS9wcmludC1laWdycC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCAgSGFubmVzIEdyZWRsZXIgPGhhbm5lc0B0Y3BkdW1wLm9yZz4KLSAqICAgICAgVGhlIFRDUERVTVAgcHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1laWdycC5jLHYgMS41LjIuMiAyMDA1LzA1LzA2IDAyOjUzOjQxIGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotCi0vKgotICogcGFja2V0IGZvcm1hdCBkb2N1bWVudGVkIGF0Ci0gKiBodHRwOi8vd3d3LnJoeXNoYWRlbi5jb20vZWlncnAuaHRtCi0gKi8KLQotc3RydWN0IGVpZ3JwX2NvbW1vbl9oZWFkZXIgewotICAgIHVfaW50OF90IHZlcnNpb247Ci0gICAgdV9pbnQ4X3Qgb3Bjb2RlOwotICAgIHVfaW50OF90IGNoZWNrc3VtWzJdOwotICAgIHVfaW50OF90IGZsYWdzWzRdOwotICAgIHVfaW50OF90IHNlcVs0XTsKLSAgICB1X2ludDhfdCBhY2tbNF07Ci0gICAgdV9pbnQ4X3QgYXNuWzRdOwotfTsKLQotI2RlZmluZQlFSUdSUF9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgMgotCi0jZGVmaW5lCUVJR1JQX09QQ09ERV9VUERBVEUgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCUVJR1JQX09QQ09ERV9RVUVSWSAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lCUVJR1JQX09QQ09ERV9SRVBMWSAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lCUVJR1JQX09QQ09ERV9IRUxMTyAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lCUVJR1JQX09QQ09ERV9JUFhTQVAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lCUVJR1JQX09QQ09ERV9QUk9CRSAgICAgICAgICAgICAgICAgICA3Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGVpZ3JwX29wY29kZV92YWx1ZXNbXSA9IHsKLSAgICB7IEVJR1JQX09QQ09ERV9VUERBVEUsICJVcGRhdGUiIH0sCi0gICAgeyBFSUdSUF9PUENPREVfUVVFUlksICJRdWVyeSIgfSwKLSAgICB7IEVJR1JQX09QQ09ERV9SRVBMWSwgIlJlcGx5IiB9LAotICAgIHsgRUlHUlBfT1BDT0RFX0hFTExPLCAiSGVsbG8iIH0sCi0gICAgeyBFSUdSUF9PUENPREVfSVBYU0FQLCAiSVBYIFNBUCIgfSwKLSAgICB7IEVJR1JQX09QQ09ERV9QUk9CRSwgIlByb2JlIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGVpZ3JwX2NvbW1vbl9oZWFkZXJfZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICJJbml0IiB9LAotICAgIHsgMHgwMiwgIkNvbmRpdGlvbmFsbHkgUmVjZWl2ZWQiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIgewotICAgIHVfaW50OF90IHR5cGVbMl07Ci0gICAgdV9pbnQ4X3QgbGVuZ3RoWzJdOwotfTsKLQotI2RlZmluZSBFSUdSUF9UTFZfR0VORVJBTF9QQVJNICAgMHgwMDAxCi0jZGVmaW5lIEVJR1JQX1RMVl9BVVRIICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgRUlHUlBfVExWX1NFUSAgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBFSUdSUF9UTFZfU1dfVkVSU0lPTiAgICAgMHgwMDA0Ci0jZGVmaW5lIEVJR1JQX1RMVl9NQ0FTVF9TRVEgICAgICAweDAwMDUKLSNkZWZpbmUgRUlHUlBfVExWX0lQX0lOVCAgICAgICAgIDB4MDEwMgotI2RlZmluZSBFSUdSUF9UTFZfSVBfRVhUICAgICAgICAgMHgwMTAzCi0jZGVmaW5lIEVJR1JQX1RMVl9BVF9JTlQgICAgICAgICAweDAyMDIKLSNkZWZpbmUgRUlHUlBfVExWX0FUX0VYVCAgICAgICAgIDB4MDIwMwotI2RlZmluZSBFSUdSUF9UTFZfQVRfQ0FCTEVfU0VUVVAgMHgwMjA0Ci0jZGVmaW5lIEVJR1JQX1RMVl9JUFhfSU5UICAgICAgICAweDAzMDIKLSNkZWZpbmUgRUlHUlBfVExWX0lQWF9FWFQgICAgICAgIDB4MDMwMwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBlaWdycF90bHZfdmFsdWVzW10gPSB7Ci0gICAgeyBFSUdSUF9UTFZfR0VORVJBTF9QQVJNLCAiR2VuZXJhbCBQYXJhbWV0ZXJzIn0sCi0gICAgeyBFSUdSUF9UTFZfQVVUSCwgIkF1dGhlbnRpY2F0aW9uIn0sCi0gICAgeyBFSUdSUF9UTFZfU0VRLCAiU2VxdWVuY2UifSwKLSAgICB7IEVJR1JQX1RMVl9TV19WRVJTSU9OLCAiU29mdHdhcmUgVmVyc2lvbiJ9LAotICAgIHsgRUlHUlBfVExWX01DQVNUX1NFUSwgIk5leHQgTXVsdGljYXN0IFNlcXVlbmNlIn0sCi0gICAgeyBFSUdSUF9UTFZfSVBfSU5ULCAiSVAgSW50ZXJuYWwgcm91dGVzIn0sCi0gICAgeyBFSUdSUF9UTFZfSVBfRVhULCAiSVAgRXh0ZXJuYWwgcm91dGVzIn0sCi0gICAgeyBFSUdSUF9UTFZfQVRfSU5ULCAiQXBwbGVUYWxrIEludGVybmFsIHJvdXRlcyJ9LAotICAgIHsgRUlHUlBfVExWX0FUX0VYVCwgIkFwcGxlVGFsayBFeHRlcm5hbCByb3V0ZXMifSwKLSAgICB7IEVJR1JQX1RMVl9BVF9DQUJMRV9TRVRVUCwgIkFwcGxlVGFsayBDYWJsZSBzZXR1cCJ9LAotICAgIHsgRUlHUlBfVExWX0lQWF9JTlQsICJJUFggSW50ZXJuYWwgcm91dGVzIn0sCi0gICAgeyBFSUdSUF9UTFZfSVBYX0VYVCwgIklQWCBFeHRlcm5hbCByb3V0ZXMifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgZWlncnBfdGx2X2dlbmVyYWxfcGFybV90IHsKLSAgICB1X2ludDhfdCBrMTsKLSAgICB1X2ludDhfdCBrMjsKLSAgICB1X2ludDhfdCBrMzsKLSAgICB1X2ludDhfdCBrNDsKLSAgICB1X2ludDhfdCBrNTsKLSAgICB1X2ludDhfdCByZXM7Ci0gICAgdV9pbnQ4X3QgaG9sZHRpbWVbMl07Ci19OyAgICAgICAgICAKLQotc3RydWN0IGVpZ3JwX3Rsdl9zd192ZXJzaW9uX3QgewotICAgIHVfaW50OF90IGlvc19tYWpvcjsKLSAgICB1X2ludDhfdCBpb3NfbWlub3I7Ci0gICAgdV9pbnQ4X3QgZWlncnBfbWFqb3I7Ci0gICAgdV9pbnQ4X3QgZWlncnBfbWlub3I7Ci19OyAKLQotc3RydWN0IGVpZ3JwX3Rsdl9pcF9pbnRfdCB7Ci0gICAgdV9pbnQ4X3QgbmV4dGhvcFs0XTsKLSAgICB1X2ludDhfdCBkZWxheVs0XTsKLSAgICB1X2ludDhfdCBiYW5kd2lkdGhbNF07Ci0gICAgdV9pbnQ4X3QgbXR1WzNdOwotICAgIHVfaW50OF90IGhvcGNvdW50OwotICAgIHVfaW50OF90IHJlbGlhYmlsaXR5OwotICAgIHVfaW50OF90IGxvYWQ7Ci0gICAgdV9pbnQ4X3QgcmVzZXJ2ZWRbMl07Ci0gICAgdV9pbnQ4X3QgcGxlbjsKLSAgICB1X2ludDhfdCBkZXN0aW5hdGlvbjsgLyogdmFyaWFibGUgbGVuZ3RoIFsxLTRdIGJ5dGVzIGVuY29kaW5nICovCi19OyAKLQotc3RydWN0IGVpZ3JwX3Rsdl9pcF9leHRfdCB7Ci0gICAgdV9pbnQ4X3QgbmV4dGhvcFs0XTsKLSAgICB1X2ludDhfdCBvcmlnaW5fcm91dGVyWzRdOwotICAgIHVfaW50OF90IG9yaWdpbl9hc1s0XTsKLSAgICB1X2ludDhfdCB0YWdbNF07Ci0gICAgdV9pbnQ4X3QgbWV0cmljWzRdOwotICAgIHVfaW50OF90IHJlc2VydmVkWzJdOwotICAgIHVfaW50OF90IHByb3RvX2lkOwotICAgIHVfaW50OF90IGZsYWdzOwotICAgIHVfaW50OF90IGRlbGF5WzRdOwotICAgIHVfaW50OF90IGJhbmR3aWR0aFs0XTsKLSAgICB1X2ludDhfdCBtdHVbM107Ci0gICAgdV9pbnQ4X3QgaG9wY291bnQ7Ci0gICAgdV9pbnQ4X3QgcmVsaWFiaWxpdHk7Ci0gICAgdV9pbnQ4X3QgbG9hZDsKLSAgICB1X2ludDhfdCByZXNlcnZlZDJbMl07Ci0gICAgdV9pbnQ4X3QgcGxlbjsKLSAgICB1X2ludDhfdCBkZXN0aW5hdGlvbjsgLyogdmFyaWFibGUgbGVuZ3RoIFsxLTRdIGJ5dGVzIGVuY29kaW5nICovCi19OyAKLQotc3RydWN0IGVpZ3JwX3Rsdl9hdF9jYWJsZV9zZXR1cF90IHsKLSAgICB1X2ludDhfdCBjYWJsZV9zdGFydFsyXTsKLSAgICB1X2ludDhfdCBjYWJsZV9lbmRbMl07Ci0gICAgdV9pbnQ4X3Qgcm91dGVyX2lkWzRdOwotfTsKLQotc3RydWN0IGVpZ3JwX3Rsdl9hdF9pbnRfdCB7Ci0gICAgdV9pbnQ4X3QgbmV4dGhvcFs0XTsKLSAgICB1X2ludDhfdCBkZWxheVs0XTsKLSAgICB1X2ludDhfdCBiYW5kd2lkdGhbNF07Ci0gICAgdV9pbnQ4X3QgbXR1WzNdOwotICAgIHVfaW50OF90IGhvcGNvdW50OwotICAgIHVfaW50OF90IHJlbGlhYmlsaXR5OwotICAgIHVfaW50OF90IGxvYWQ7Ci0gICAgdV9pbnQ4X3QgcmVzZXJ2ZWRbMl07Ci0gICAgdV9pbnQ4X3QgY2FibGVfc3RhcnRbMl07Ci0gICAgdV9pbnQ4X3QgY2FibGVfZW5kWzJdOwotfTsgCi0KLXN0cnVjdCBlaWdycF90bHZfYXRfZXh0X3QgewotICAgIHVfaW50OF90IG5leHRob3BbNF07Ci0gICAgdV9pbnQ4X3Qgb3JpZ2luX3JvdXRlcls0XTsKLSAgICB1X2ludDhfdCBvcmlnaW5fYXNbNF07Ci0gICAgdV9pbnQ4X3QgdGFnWzRdOwotICAgIHVfaW50OF90IHByb3RvX2lkOwotICAgIHVfaW50OF90IGZsYWdzOwotICAgIHVfaW50OF90IG1ldHJpY1syXTsKLSAgICB1X2ludDhfdCBkZWxheVs0XTsKLSAgICB1X2ludDhfdCBiYW5kd2lkdGhbNF07Ci0gICAgdV9pbnQ4X3QgbXR1WzNdOwotICAgIHVfaW50OF90IGhvcGNvdW50OwotICAgIHVfaW50OF90IHJlbGlhYmlsaXR5OwotICAgIHVfaW50OF90IGxvYWQ7Ci0gICAgdV9pbnQ4X3QgcmVzZXJ2ZWQyWzJdOwotICAgIHVfaW50OF90IGNhYmxlX3N0YXJ0WzJdOwotICAgIHVfaW50OF90IGNhYmxlX2VuZFsyXTsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGVpZ3JwX2V4dF9wcm90b19pZF92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICJJR1JQIiB9LAotICAgIHsgMHgwMiwgIkVJR1JQIiB9LAotICAgIHsgMHgwMywgIlN0YXRpYyIgfSwKLSAgICB7IDB4MDQsICJSSVAiIH0sCi0gICAgeyAweDA1LCAiSGVsbG8iIH0sCi0gICAgeyAweDA2LCAiT1NQRiIgfSwKLSAgICB7IDB4MDcsICJJUy1JUyIgfSwKLSAgICB7IDB4MDgsICJFR1AiIH0sCi0gICAgeyAweDA5LCAiQkdQIiB9LAotICAgIHsgMHgwYSwgIklEUlAiIH0sCi0gICAgeyAweDBiLCAiQ29ubmVjdGVkIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXZvaWQKLWVpZ3JwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcHB0ciwgcmVnaXN0ZXIgdV9pbnQgbGVuKSB7Ci0KLSAgICBjb25zdCBzdHJ1Y3QgZWlncnBfY29tbW9uX2hlYWRlciAqZWlncnBfY29tX2hlYWRlcjsKLSAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2hlYWRlciAqZWlncnBfdGx2X2hlYWRlcjsKLSAgICBjb25zdCB1X2NoYXIgKnRwdHIsKnRsdl90cHRyOwotICAgIHVfaW50IHRsZW4sZWlncnBfdGx2X2xlbixlaWdycF90bHZfdHlwZSx0bHZfdGxlbiwgYnl0ZV9sZW5ndGgsIGJpdF9sZW5ndGg7Ci0gICAgdV9pbnQ4X3QgcHJlZml4WzRdOwotCi0gICAgdW5pb24gewotICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2dlbmVyYWxfcGFybV90ICplaWdycF90bHZfZ2VuZXJhbF9wYXJtOwotICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X3N3X3ZlcnNpb25fdCAqZWlncnBfdGx2X3N3X3ZlcnNpb247Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBlaWdycF90bHZfaXBfaW50X3QgKmVpZ3JwX3Rsdl9pcF9pbnQ7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBlaWdycF90bHZfaXBfZXh0X3QgKmVpZ3JwX3Rsdl9pcF9leHQ7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBlaWdycF90bHZfYXRfY2FibGVfc2V0dXBfdCAqZWlncnBfdGx2X2F0X2NhYmxlX3NldHVwOwotICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2F0X2ludF90ICplaWdycF90bHZfYXRfaW50OwotICAgICAgICBjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2F0X2V4dF90ICplaWdycF90bHZfYXRfZXh0OwotICAgIH0gdGx2X3B0cjsKLQotICAgIHRwdHI9cHB0cjsKLSAgICBlaWdycF9jb21faGVhZGVyID0gKGNvbnN0IHN0cnVjdCBlaWdycF9jb21tb25faGVhZGVyICopcHB0cjsKLSAgICBUQ0hFQ0soKmVpZ3JwX2NvbV9oZWFkZXIpOwotCi0gICAgLyoKLSAgICAgKiBTYW5pdHkgY2hlY2tpbmcgb2YgdGhlIGhlYWRlci4KLSAgICAgKi8KLSAgICBpZiAoZWlncnBfY29tX2hlYWRlci0+dmVyc2lvbiAhPSBFSUdSUF9WRVJTSU9OKSB7Ci0JcHJpbnRmKCJFSUdSUCB2ZXJzaW9uICV1IHBhY2tldCBub3Qgc3VwcG9ydGVkIixlaWdycF9jb21faGVhZGVyLT52ZXJzaW9uKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogaW4gbm9uLXZlcmJvc2UgbW9kZSBqdXN0IGxldHMgcHJpbnQgdGhlIGJhc2ljIE1lc3NhZ2UgVHlwZSovCi0gICAgaWYgKHZmbGFnIDwgMSkgewotICAgICAgICBwcmludGYoIkVJR1JQICVzLCBsZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgIHRvazJzdHIoZWlncnBfb3Bjb2RlX3ZhbHVlcywgInVua25vd24gKCV1KSIsZWlncnBfY29tX2hlYWRlci0+b3Bjb2RlKSwKLSAgICAgICAgICAgICAgIGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvayB0aGV5IHNlZW0gdG8gd2FudCB0byBrbm93IGV2ZXJ5dGhpbmcgLSBsZXRzIGZ1bGx5IGRlY29kZSBpdCAqLwotCi0gICAgdGxlbj1sZW4tc2l6ZW9mKHN0cnVjdCBlaWdycF9jb21tb25faGVhZGVyKTsKLQotICAgIC8qIEZJWE1FIHByaW50IG90aGVyIGhlYWRlciBpbmZvICovCi0gICAgcHJpbnRmKCJcblx0RUlHUlAgdiV1LCBvcGNvZGU6ICVzICgldSksIGNoa3N1bTogMHglMDR4LCBGbGFnczogWyVzXVxuXHRzZXE6IDB4JTA4eCwgYWNrOiAweCUwOHgsIEFTOiAldSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgIGVpZ3JwX2NvbV9oZWFkZXItPnZlcnNpb24sCi0gICAgICAgICAgIHRvazJzdHIoZWlncnBfb3Bjb2RlX3ZhbHVlcywgInVua25vd24sIHR5cGU6ICV1IixlaWdycF9jb21faGVhZGVyLT5vcGNvZGUpLAotICAgICAgICAgICBlaWdycF9jb21faGVhZGVyLT5vcGNvZGUsCi0gICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZlaWdycF9jb21faGVhZGVyLT5jaGVja3N1bSksCi0gICAgICAgICAgIHRvazJzdHIoZWlncnBfY29tbW9uX2hlYWRlcl9mbGFnX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAibm9uZSIsCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJmVpZ3JwX2NvbV9oZWFkZXItPmZsYWdzKSksCi0gICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZlaWdycF9jb21faGVhZGVyLT5zZXEpLAotICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmZWlncnBfY29tX2hlYWRlci0+YWNrKSwKLSAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJmVpZ3JwX2NvbV9oZWFkZXItPmFzbiksCi0gICAgICAgICAgIHRsZW4pOwotCi0gICAgdHB0cis9c2l6ZW9mKGNvbnN0IHN0cnVjdCBlaWdycF9jb21tb25faGVhZGVyKTsKLQotICAgIHdoaWxlKHRsZW4+MCkgewotICAgICAgICAvKiBkaWQgd2UgY2FwdHVyZSBlbm91Z2ggZm9yIGZ1bGx5IGRlY29kaW5nIHRoZSBvYmplY3QgaGVhZGVyID8gKi8KLSAgICAgICAgVENIRUNLMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBlaWdycF90bHZfaGVhZGVyKSk7Ci0KLSAgICAgICAgZWlncnBfdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2hlYWRlciAqKXRwdHI7Ci0gICAgICAgIGVpZ3JwX3Rsdl9sZW49RVhUUkFDVF8xNkJJVFMoJmVpZ3JwX3Rsdl9oZWFkZXItPmxlbmd0aCk7Ci0gICAgICAgIGVpZ3JwX3Rsdl90eXBlPUVYVFJBQ1RfMTZCSVRTKCZlaWdycF90bHZfaGVhZGVyLT50eXBlKTsKLQotCi0gICAgICAgIGlmIChlaWdycF90bHZfbGVuIDwgc2l6ZW9mKHN0cnVjdCBlaWdycF90bHZfaGVhZGVyKSB8fAotICAgICAgICAgICAgZWlncnBfdGx2X2xlbiA+IHRsZW4pIHsKLSAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyK3NpemVvZihzaXplb2Yoc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIpKSwiXG5cdCAgICAiLHRsZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBUTFYgKDB4JTA0eCksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgdG9rMnN0cihlaWdycF90bHZfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgIGVpZ3JwX3Rsdl90eXBlKSwKLSAgICAgICAgICAgICAgIGVpZ3JwX3Rsdl90eXBlLAotICAgICAgICAgICAgICAgZWlncnBfdGx2X2xlbik7Ci0KLSAgICAgICAgdGx2X3RwdHI9dHB0citzaXplb2Yoc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIpOwotICAgICAgICB0bHZfdGxlbj1laWdycF90bHZfbGVuLXNpemVvZihzdHJ1Y3QgZWlncnBfdGx2X2hlYWRlcik7Ci0KLSAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgb2JqZWN0ID8gKi8KLSAgICAgICAgVENIRUNLMigqdHB0ciwgZWlncnBfdGx2X2xlbik7Ci0KLSAgICAgICAgc3dpdGNoKGVpZ3JwX3Rsdl90eXBlKSB7Ci0KLSAgICAgICAgY2FzZSBFSUdSUF9UTFZfR0VORVJBTF9QQVJNOgotICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfZ2VuZXJhbF9wYXJtID0gKGNvbnN0IHN0cnVjdCBlaWdycF90bHZfZ2VuZXJhbF9wYXJtX3QgKil0bHZfdHB0cjsKLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIGhvbGR0aW1lOiAldXMsIGsxICV1LCBrMiAldSwgazMgJXUsIGs0ICV1LCBrNSAldSIsCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModGx2X3B0ci5laWdycF90bHZfZ2VuZXJhbF9wYXJtLT5ob2xkdGltZSksCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfZ2VuZXJhbF9wYXJtLT5rMSwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9nZW5lcmFsX3Bhcm0tPmsyLAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2dlbmVyYWxfcGFybS0+azMsCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfZ2VuZXJhbF9wYXJtLT5rNCwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9nZW5lcmFsX3Bhcm0tPms1KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRUlHUlBfVExWX1NXX1ZFUlNJT046Ci0gICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9zd192ZXJzaW9uID0gKGNvbnN0IHN0cnVjdCBlaWdycF90bHZfc3dfdmVyc2lvbl90ICopdGx2X3RwdHI7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBJT1MgdmVyc2lvbjogJXUuJXUsIEVJR1JQIHZlcnNpb24gJXUuJXUiLAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X3N3X3ZlcnNpb24tPmlvc19tYWpvciwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9zd192ZXJzaW9uLT5pb3NfbWlub3IsCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfc3dfdmVyc2lvbi0+ZWlncnBfbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfc3dfdmVyc2lvbi0+ZWlncnBfbWlub3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBFSUdSUF9UTFZfSVBfSU5UOgotICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfaXBfaW50ID0gKGNvbnN0IHN0cnVjdCBlaWdycF90bHZfaXBfaW50X3QgKil0bHZfdHB0cjsKLQotICAgICAgICAgICAgYml0X2xlbmd0aCA9IHRsdl9wdHIuZWlncnBfdGx2X2lwX2ludC0+cGxlbjsKLSAgICAgICAgICAgIGlmIChiaXRfbGVuZ3RoID4gMzIpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgaWxsZWdhbCBwcmVmaXggbGVuZ3RoICV1IixiaXRfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVfbGVuZ3RoID0gKGJpdF9sZW5ndGggKyA3KSAvIDg7IC8qIHZhcmlhYmxlIGxlbmd0aCBlbmNvZGluZyAqLwotICAgICAgICAgICAgbWVtc2V0KHByZWZpeCwgMCwgNCk7Ci0gICAgICAgICAgICBtZW1jcHkocHJlZml4LCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPmRlc3RpbmF0aW9uLGJ5dGVfbGVuZ3RoKTsKLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIElQdjQgcHJlZml4OiAlMTVzLyV1LCBuZXh0aG9wOiAiLAotICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcocHJlZml4KSwKLSAgICAgICAgICAgICAgICAgICBiaXRfbGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfaXBfaW50LT5uZXh0aG9wKSA9PSAwKQotICAgICAgICAgICAgICAgIHByaW50Zigic2VsZiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZigiJXMiLGlwYWRkcl9zdHJpbmcoJnRsdl9wdHIuZWlncnBfdGx2X2lwX2ludC0+bmV4dGhvcCkpOwotCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBkZWxheSAldSBtcywgYmFuZHdpZHRoICV1IEticHMsIG10dSAldSwgaG9wICV1LCByZWxpYWJpbGl0eSAldSwgbG9hZCAldSIsCi0gICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPmRlbGF5KS8xMDApLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2lwX2ludC0+bXR1KSwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9pbnQtPmhvcGNvdW50LAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2lwX2ludC0+cmVsaWFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfaXBfaW50LT5sb2FkKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRUlHUlBfVExWX0lQX0VYVDoKLSAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dCA9IChjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2lwX2V4dF90ICopdGx2X3RwdHI7Ci0KLSAgICAgICAgICAgIGJpdF9sZW5ndGggPSB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPnBsZW47Ci0gICAgICAgICAgICBpZiAoYml0X2xlbmd0aCA+IDMyKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIGlsbGVnYWwgcHJlZml4IGxlbmd0aCAldSIsYml0X2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBieXRlX2xlbmd0aCA9IChiaXRfbGVuZ3RoICsgNykgLyA4OyAvKiB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcgKi8KLSAgICAgICAgICAgIG1lbXNldChwcmVmaXgsIDAsIDQpOwotICAgICAgICAgICAgbWVtY3B5KHByZWZpeCwmdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5kZXN0aW5hdGlvbixieXRlX2xlbmd0aCk7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBJUHY0IHByZWZpeDogJTE1cy8ldSwgbmV4dGhvcDogIiwKLSAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHByZWZpeCksCi0gICAgICAgICAgICAgICAgICAgYml0X2xlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+bmV4dGhvcCkgPT0gMCkKLSAgICAgICAgICAgICAgICBwcmludGYoInNlbGYiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzIixpcGFkZHJfc3RyaW5nKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPm5leHRob3ApKTsKLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgb3JpZ2luLXJvdXRlciAlcywgb3JpZ2luLWFzICV1LCBvcmlnaW4tcHJvdG8gJXMsIGZsYWdzIFsweCUwMnhdLCB0YWcgMHglMDh4LCBtZXRyaWMgJXUiLAotICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcodGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5vcmlnaW5fcm91dGVyKSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPm9yaWdpbl9hcyksCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihlaWdycF9leHRfcHJvdG9faWRfdmFsdWVzLCJ1bmtub3duIix0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPnByb3RvX2lkKSwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPmZsYWdzLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+dGFnKSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPm1ldHJpYykpOwotCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBkZWxheSAldSBtcywgYmFuZHdpZHRoICV1IEticHMsIG10dSAldSwgaG9wICV1LCByZWxpYWJpbGl0eSAldSwgbG9hZCAldSIsCi0gICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPmRlbGF5KS8xMDApLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+bXR1KSwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9pcF9leHQtPmhvcGNvdW50LAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2lwX2V4dC0+cmVsaWFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfaXBfZXh0LT5sb2FkKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRUlHUlBfVExWX0FUX0NBQkxFX1NFVFVQOgotICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfYXRfY2FibGVfc2V0dXAgPSAoY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9hdF9jYWJsZV9zZXR1cF90ICopdGx2X3RwdHI7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBDYWJsZS1yYW5nZTogJXUtJXUsIFJvdXRlci1JRCAldSIsCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2NhYmxlX3NldHVwLT5jYWJsZV9zdGFydCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2NhYmxlX3NldHVwLT5jYWJsZV9lbmQpLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9jYWJsZV9zZXR1cC0+cm91dGVyX2lkKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEVJR1JQX1RMVl9BVF9JTlQ6Ci0gICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQgPSAoY29uc3Qgc3RydWN0IGVpZ3JwX3Rsdl9hdF9pbnRfdCAqKXRsdl90cHRyOwotCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgIENhYmxlLVJhbmdlOiAldS0ldSwgbmV4dGhvcDogIiwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5jYWJsZV9zdGFydCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+Y2FibGVfZW5kKSk7Ci0KLSAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5uZXh0aG9wKSA9PSAwKQotICAgICAgICAgICAgICAgIHByaW50Zigic2VsZiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZigiJXUuJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5uZXh0aG9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+bmV4dGhvcFsyXSkpOwotCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBkZWxheSAldSBtcywgYmFuZHdpZHRoICV1IEticHMsIG10dSAldSwgaG9wICV1LCByZWxpYWJpbGl0eSAldSwgbG9hZCAldSIsCi0gICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPmRlbGF5KS8xMDApLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPmJhbmR3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+bXR1KSwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9pbnQtPmhvcGNvdW50LAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2ludC0+cmVsaWFiaWxpdHksCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfYXRfaW50LT5sb2FkKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRUlHUlBfVExWX0FUX0VYVDoKLSAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dCA9IChjb25zdCBzdHJ1Y3QgZWlncnBfdGx2X2F0X2V4dF90ICopdGx2X3RwdHI7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgQ2FibGUtUmFuZ2U6ICV1LSV1LCBuZXh0aG9wOiAiLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPmNhYmxlX3N0YXJ0KSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5jYWJsZV9lbmQpKTsKLQotICAgICAgICAgICAgaWYgKEVYVFJBQ1RfMzJCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPm5leHRob3ApID09IDApCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJzZWxmIik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIldS4ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZ0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPm5leHRob3ApLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5uZXh0aG9wWzJdKSk7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIG9yaWdpbi1yb3V0ZXIgJXUsIG9yaWdpbi1hcyAldSwgb3JpZ2luLXByb3RvICVzLCBmbGFncyBbMHglMDJ4XSwgdGFnIDB4JTA4eCwgbWV0cmljICV1IiwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPm9yaWdpbl9yb3V0ZXIpLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+b3JpZ2luX2FzKSwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGVpZ3JwX2V4dF9wcm90b19pZF92YWx1ZXMsInVua25vd24iLHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+cHJvdG9faWQpLAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT50YWcpLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+bWV0cmljKSk7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIGRlbGF5ICV1IG1zLCBiYW5kd2lkdGggJXUgS2JwcywgbXR1ICV1LCBob3AgJXUsIHJlbGlhYmlsaXR5ICV1LCBsb2FkICV1IiwKLSAgICAgICAgICAgICAgICAgICAoRVhUUkFDVF8zMkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+ZGVsYXkpLzEwMCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+YmFuZHdpZHRoKSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUygmdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5tdHUpLAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIuZWlncnBfdGx2X2F0X2V4dC0+aG9wY291bnQsCi0gICAgICAgICAgICAgICAgICAgdGx2X3B0ci5laWdycF90bHZfYXRfZXh0LT5yZWxpYWJpbGl0eSwKLSAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmVpZ3JwX3Rsdl9hdF9leHQtPmxvYWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgVExWcyB0aGF0IGxhY2sgYSBkZWNvZGVyCi0gICAgICAgICAgICAgKiB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQotICAgICAgICAgICAgICovCi0KLSAgICAgICAgY2FzZSBFSUdSUF9UTFZfQVVUSDoKLSAgICAgICAgY2FzZSBFSUdSUF9UTFZfU0VROgotICAgICAgICBjYXNlIEVJR1JQX1RMVl9NQ0FTVF9TRVE6Ci0gICAgICAgIGNhc2UgRUlHUlBfVExWX0lQWF9JTlQ6Ci0gICAgICAgIGNhc2UgRUlHUlBfVExWX0lQWF9FWFQ6Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0ciwiXG5cdCAgICAiLHRsdl90bGVuKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSBoZXhkdW1wID8gKi8KLSAgICAgICAgaWYgKHZmbGFnID4gMSkKLSAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyK3NpemVvZihzaXplb2Yoc3RydWN0IGVpZ3JwX3Rsdl9oZWFkZXIpKSwiXG5cdCAgICAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpZ3JwX3Rsdl9sZW4tc2l6ZW9mKHN0cnVjdCBlaWdycF90bHZfaGVhZGVyKSk7Ci0KLSAgICAgICAgdHB0cis9ZWlncnBfdGx2X2xlbjsKLSAgICAgICAgdGxlbi09ZWlncnBfdGx2X2xlbjsKLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Ci19CmRpZmYgLS1naXQgYS9wcmludC1lbmMuYyBiL3ByaW50LWVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWI4NzFiLi4wMDAwMDAwCi0tLSBhL3ByaW50LWVuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoJJE9wZW5CU0Q6IHByaW50LWVuYy5jLHYgMS43IDIwMDIvMDIvMTkgMTk6Mzk6NDAgbWlsbGVydCBFeHAgJAkqLwotCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZW5jLmMsdiAxLjQgMjAwNS8wNC8wNiAyMTozMjozOSBtY3IgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLSNpbmNsdWRlICJlbmMuaCIKLQotI2RlZmluZSBFTkNfUFJJTlRfVFlQRSh3aCwgeGYsIG5hbSkgXAotCWlmICgod2gpICYgKHhmKSkgeyBcCi0JCXByaW50ZigiJXMlcyIsIG5hbSwgKHdoKSA9PSAoeGYpID8gIik6ICIgOiAiLCIpOyBcCi0JCSh3aCkgJj0gfih4Zik7IFwKLQl9Ci0KLXVfaW50Ci1lbmNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQlpbnQgZmxhZ3M7Ci0JY29uc3Qgc3RydWN0IGVuY2hkciAqaGRyOwotCi0JaWYgKGNhcGxlbiA8IEVOQ19IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfGVuY10iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaGRyID0gKHN0cnVjdCBlbmNoZHIgKilwOwotCWZsYWdzID0gaGRyLT5mbGFnczsKLQlpZiAoZmxhZ3MgPT0gMCkKLQkJcHJpbnRmKCIodW5wcm90ZWN0ZWQpOiAiKTsKLQllbHNlCi0JCXByaW50ZigiKCIpOwotCUVOQ19QUklOVF9UWVBFKGZsYWdzLCBNX0FVVEgsICJhdXRoZW50aWMiKTsKLQlFTkNfUFJJTlRfVFlQRShmbGFncywgTV9DT05GLCAiY29uZmlkZW50aWFsIik7Ci0JLyogRU5DX1BSSU5UX1RZUEUoZmxhZ3MsIE1fVFVOTkVMLCAidHVubmVsIik7ICovCi0JcHJpbnRmKCJTUEkgMHglMDh4OiAiLCAodV9pbnQzMl90KW50b2hsKGhkci0+c3BpKSk7Ci0KLQlsZW5ndGggLT0gRU5DX0hEUkxFTjsKLQkvKiBYWFggLSB1c2UgdGhlIGFkZHJlc3MgZmFtaWx5ICovCi0JaXBfcHJpbnQoZ25kbywgcCArIEVOQ19IRFJMRU4sIGxlbmd0aCk7Ci0KLW91dDoKLQlyZXR1cm4gKEVOQ19IRFJMRU4pOwotfQotCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1lc3AuYyBiL3ByaW50LWVzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2NjODk5Li4wMDAwMDAwCi0tLSBhL3ByaW50LWVzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qCSROZXRCU0Q6IHByaW50LWFoLmMsdiAxLjQgMTk5Ni8wNS8yMCAwMDo0MToxNiBmdmRsIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1lc3AuYyx2IDEuNTUuMi4xIDIwMDUvMDQvMjEgMDY6NDQ6NTcgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmZGVmIEhBVkVfTElCQ1JZUFRPCi0jaWZkZWYgSEFWRV9PUEVOU1NMX0VWUF9ICi0jaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaXAuaCIKLSNpbmNsdWRlICJlc3AuaCIKLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwNi5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJuZXRkaXNzZWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotI2lmbmRlZiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UKLSNpZmRlZiBJTkVUNgotc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgewotCXVuaW9uIHsKLQkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKLQkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OwotCX0gdW47Ci19OwotI2Vsc2UKLSNkZWZpbmUgc29ja2FkZHJfc3RvcmFnZSBzb2NrYWRkcgotI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9TT0NLQUREUl9TVE9SQUdFICovCi0KLSNpZmRlZiBIQVZFX0xJQkNSWVBUTwotc3RydWN0IHNhX2xpc3QgewotCXN0cnVjdCBzYV9saXN0CSpuZXh0OwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGRhZGRyOwotCXVfaW50MzJfdAlzcGk7Ci0JY29uc3QgRVZQX0NJUEhFUiAqZXZwOwotCWludAkJaXZsZW47Ci0JaW50CQlhdXRobGVuOwotCXVfY2hhcgkJc2VjcmV0WzI1Nl07ICAvKiBpcyB0aGF0IGJpZyBlbm91Z2ggZm9yIGFsbCBzZWNyZXRzPyAqLwotCWludAkJc2VjcmV0bGVuOwotfTsKLQotc3RhdGljIHZvaWQgZXNwX3ByaW50X2FkZHNhKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCQkJICAgIHN0cnVjdCBzYV9saXN0ICpzYSwgaW50IHNhX2RlZikKLXsKLQkvKiBjb3B5IHRoZSAic2EiICovCi0KLQlzdHJ1Y3Qgc2FfbGlzdCAqbnNhOwotCi0JbnNhID0gKHN0cnVjdCBzYV9saXN0ICopbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2FfbGlzdCkpOwotCWlmIChuc2EgPT0gTlVMTCkKLQkJKCpuZG8tPm5kb19lcnJvcikobmRvLCAicmFuIG91dCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgc2Egc3RydWN0dXJlIik7Ci0KLQkqbnNhID0gKnNhOwotCi0JaWYgKHNhX2RlZikKLQkJbmRvLT5uZG9fc2FfZGVmYXVsdCA9IG5zYTsKLQotCW5zYS0+bmV4dCA9IG5kby0+bmRvX3NhX2xpc3RfaGVhZDsKLQluZG8tPm5kb19zYV9saXN0X2hlYWQgPSBuc2E7Ci19Ci0KLQotc3RhdGljIHVfaW50IGhleGRpZ2l0KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLCBjaGFyIGhleCkKLXsKLQlpZiAoaGV4ID49ICcwJyAmJiBoZXggPD0gJzknKQotCQlyZXR1cm4gKGhleCAtICcwJyk7Ci0JZWxzZSBpZiAoaGV4ID49ICdBJyAmJiBoZXggPD0gJ0YnKQotCQlyZXR1cm4gKGhleCAtICdBJyArIDEwKTsKLQllbHNlIGlmIChoZXggPj0gJ2EnICYmIGhleCA8PSAnZicpCi0JCXJldHVybiAoaGV4IC0gJ2EnICsgMTApOwotCWVsc2UgewotCQkoKm5kby0+bmRvX2Vycm9yKShuZG8sICJpbnZhbGlkIGhleCBkaWdpdCAlYyBpbiBlc3BzZWNyZXRcbiIsIGhleCk7Ci0JCXJldHVybiAwOwotCX0KLX0KLQotc3RhdGljIHVfaW50IGhleDJieXRlKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLCBjaGFyICpoZXhzdHJpbmcpCi17Ci0JdV9pbnQgYnl0ZTsKLQotCWJ5dGUgPSAoaGV4ZGlnaXQobmRvLCBoZXhzdHJpbmdbMF0pIDw8IDQpICsgaGV4ZGlnaXQobmRvLCBoZXhzdHJpbmdbMV0pOwotCXJldHVybiBieXRlOwotfQotCi0vKgotICogZGVjb2RlIHRoZSBmb3JtOiAgICBTUElOVU1ASVAgPHRhYj4gQUxHT05BTUU6MHhzZWNyZXQKLSAqCi0gKiBzcGVjaWFsIGZvcm06IGZpbGUgL25hbWUKLSAqIGNhdXNlcyB1cyB0byBnbyByZWFkIGZyb20gdGhpcyBmaWxlIGluc3RlYWQuCi0gKgotICovCi1zdGF0aWMgdm9pZCBlc3BfcHJpbnRfZGVjb2RlX29uZXNlY3JldChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywgY2hhciAqbGluZSkKLXsKLQlzdHJ1Y3Qgc2FfbGlzdCBzYTE7Ci0JaW50IHNhX2RlZjsKLQotCWNoYXIgKnNwaWtleTsKLQljaGFyICpkZWNvZGU7Ci0KLQlzcGlrZXkgPSBzdHJzZXAoJmxpbmUsICIgXHQiKTsKLQlzYV9kZWYgPSAwOwotCW1lbXNldCgmc2ExLCAwLCBzaXplb2Yoc3RydWN0IHNhX2xpc3QpKTsKLQotCS8qIGlmIHRoZXJlIGlzIG9ubHkgb25lIHRva2VuLCB0aGVuIGl0IGlzIGFuIGFsZ286a2V5IHRva2VuICovCi0JaWYgKGxpbmUgPT0gTlVMTCkgewotCQlkZWNvZGUgPSBzcGlrZXk7Ci0JCXNwaWtleSA9IE5VTEw7Ci0JCS8qIG1lbXNldCgmc2ExLmRhZGRyLCAwLCBzaXplb2Yoc2ExLmRhZGRyKSk7ICovCi0JCS8qIHNhMS5zcGkgPSAwOyAqLwotCQlzYV9kZWYgICAgPSAxOwotCX0gZWxzZQotCQlkZWNvZGUgPSBsaW5lOwotCi0JaWYgKHNwaWtleSAmJiBzdHJjYXNlY21wKHNwaWtleSwgImZpbGUiKSA9PSAwKSB7Ci0JCS8qIG9wZW4gZmlsZSBhbmQgcmVhZCBpdCAqLwotCQlGSUxFICpzZWNyZXRmaWxlOwotCQljaGFyICBmaWxlbGluZVsxMDI0XTsKLQkJY2hhciAgKm5sOwotCi0JCXNlY3JldGZpbGUgPSBmb3BlbihsaW5lLCBGT1BFTl9SRUFEX1RYVCk7Ci0JCWlmIChzZWNyZXRmaWxlID09IE5VTEwpIHsKLQkJCXBlcnJvcihsaW5lKTsKLQkJCWV4aXQoMyk7Ci0JCX0KLQotCQl3aGlsZSAoZmdldHMoZmlsZWxpbmUsIHNpemVvZihmaWxlbGluZSktMSwgc2VjcmV0ZmlsZSkgIT0gTlVMTCkgewotCQkJLyogcmVtb3ZlIG5ld2xpbmUgZnJvbSB0aGUgbGluZSAqLwotCQkJbmwgPSBzdHJjaHIoZmlsZWxpbmUsICdcbicpOwotCQkJaWYgKG5sKQotCQkJCSpubCA9ICdcMCc7Ci0JCQlpZiAoZmlsZWxpbmVbMF0gPT0gJyMnKSBjb250aW51ZTsKLQkJCWlmIChmaWxlbGluZVswXSA9PSAnXDAnKSBjb250aW51ZTsKLQotCQkJZXNwX3ByaW50X2RlY29kZV9vbmVzZWNyZXQobmRvLCBmaWxlbGluZSk7Ci0JCX0KLQkJZmNsb3NlKHNlY3JldGZpbGUpOwotCi0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc3Bpa2V5KSB7Ci0JCWNoYXIgKnNwaXN0ciwgKmZvbzsKLQkJdV9pbnQzMl90IHNwaW5vOwotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLSNpZmRlZiBJTkVUNgotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OwotI2VuZGlmCi0KLQkJc3Bpc3RyID0gc3Ryc2VwKCZzcGlrZXksICJAIik7Ci0KLQkJc3Bpbm8gPSBzdHJ0b3VsKHNwaXN0ciwgJmZvbywgMCk7Ci0JCWlmIChzcGlzdHIgPT0gZm9vIHx8ICFzcGlrZXkpIHsKLQkJCSgqbmRvLT5uZG9fd2FybmluZykobmRvLCAicHJpbnRfZXNwOiBmYWlsZWQgdG8gZGVjb2RlIHNwaSMgJXNcbiIsIGZvbyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzYTEuc3BpID0gc3Bpbm87Ci0KLQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYTEuZGFkZHI7Ci0jaWZkZWYgSU5FVDYKLQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNhMS5kYWRkcjsKLQkJaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgc3Bpa2V5LCAmc2luNi0+c2luNl9hZGRyKSA9PSAxKSB7Ci0jaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJCXNpbjYtPnNpbjZfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwotI2VuZGlmCi0JCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQl9IGVsc2UKLSNlbmRpZgotCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQsIHNwaWtleSwgJnNpbi0+c2luX2FkZHIpID09IDEpIHsKLSNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQkJc2luLT5zaW5fbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0jZW5kaWYKLQkJCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCX0gZWxzZSB7Ci0JCQkoKm5kby0+bmRvX3dhcm5pbmcpKG5kbywgInByaW50X2VzcDogY2FuIG5vdCBkZWNvZGUgSVAjICVzXG4iLCBzcGlrZXkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JaWYgKGRlY29kZSkgewotCQljaGFyICpjb2xvbiwgKnA7Ci0JCXVfY2hhciBlc3BzZWNyZXRfa2V5WzI1Nl07Ci0JCWludCBsZW47Ci0JCXNpemVfdCBpOwotCQljb25zdCBFVlBfQ0lQSEVSICpldnA7Ci0JCWludCBhdXRobGVuID0gMDsKLQotCQkvKiBza2lwIGFueSBibGFuayBzcGFjZXMgKi8KLQkJd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmRlY29kZSkpCi0JCQlkZWNvZGUrKzsKLQotCQljb2xvbiA9IHN0cmNocihkZWNvZGUsICc6Jyk7Ci0JCWlmIChjb2xvbiA9PSBOVUxMKSB7Ci0JCQkoKm5kby0+bmRvX3dhcm5pbmcpKG5kbywgImZhaWxlZCB0byBkZWNvZGUgZXNwc2VjcmV0OiAlc1xuIiwgZGVjb2RlKTsKLQkJCXJldHVybjsKLQkJfQotCQkqY29sb24gPSAnXDAnOwotCi0JCWxlbiA9IGNvbG9uIC0gZGVjb2RlOwotCQlpZiAoc3RybGVuKGRlY29kZSkgPiBzdHJsZW4oIi1obWFjOTYiKSAmJgotCQkgICAgIXN0cmNtcChkZWNvZGUgKyBzdHJsZW4oZGVjb2RlKSAtIHN0cmxlbigiLWhtYWM5NiIpLAotCQkgICAgIi1obWFjOTYiKSkgewotCQkJcCA9IHN0cnN0cihkZWNvZGUsICItaG1hYzk2Iik7Ci0JCQkqcCA9ICdcMCc7Ci0JCQlhdXRobGVuID0gMTI7Ci0JCX0KLQkJaWYgKHN0cmxlbihkZWNvZGUpID4gc3RybGVuKCItY2JjIikgJiYKLQkJICAgICFzdHJjbXAoZGVjb2RlICsgc3RybGVuKGRlY29kZSkgLSBzdHJsZW4oIi1jYmMiKSwgIi1jYmMiKSkgewotCQkJcCA9IHN0cnN0cihkZWNvZGUsICItY2JjIik7Ci0JCQkqcCA9ICdcMCc7Ci0JCX0KLQkJZXZwID0gRVZQX2dldF9jaXBoZXJieW5hbWUoZGVjb2RlKTsKLQkJaWYgKCFldnApIHsKLQkJCSgqbmRvLT5uZG9fd2FybmluZykobmRvLCAiZmFpbGVkIHRvIGZpbmQgY2lwaGVyIGFsZ28gJXNcbiIsIGRlY29kZSk7Ci0JCQlzYTEuZXZwID0gTlVMTDsKLQkJCXNhMS5hdXRobGVuID0gMDsKLQkJCXNhMS5pdmxlbiA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlzYTEuZXZwID0gZXZwOwotCQlzYTEuYXV0aGxlbiA9IGF1dGhsZW47Ci0JCXNhMS5pdmxlbiA9IEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGV2cCk7Ci0KLQkJY29sb24rKzsKLQkJaWYgKGNvbG9uWzBdID09ICcwJyAmJiBjb2xvblsxXSA9PSAneCcpIHsKLQkJCS8qIGRlY29kZSBzb21lIGhleCEgKi8KLQkJCWNvbG9uICs9IDI7Ci0JCQlsZW4gPSBzdHJsZW4oY29sb24pIC8gMjsKLQotCQkJaWYgKGxlbiA+IDI1NikgewotCQkJCSgqbmRvLT5uZG9fd2FybmluZykobmRvLCAic2VjcmV0IGlzIHRvbyBiaWc6ICVkXG4iLCBsZW4pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaSA9IDA7Ci0JCQl3aGlsZSAoY29sb25bMF0gIT0gJ1wwJyAmJiBjb2xvblsxXSE9J1wwJykgewotCQkJCWVzcHNlY3JldF9rZXlbaV0gPSBoZXgyYnl0ZShuZG8sIGNvbG9uKTsKLQkJCQljb2xvbiArPSAyOwotCQkJCWkrKzsKLQkJCX0KLQotCQkJbWVtY3B5KHNhMS5zZWNyZXQsIGVzcHNlY3JldF9rZXksIGkpOwotCQkJc2ExLnNlY3JldGxlbiA9IGk7Ci0JCX0gZWxzZSB7Ci0JCQlpID0gc3RybGVuKGNvbG9uKTsKLQotCQkJaWYgKGkgPCBzaXplb2Yoc2ExLnNlY3JldCkpIHsKLQkJCQltZW1jcHkoc2ExLnNlY3JldCwgY29sb24sIGkpOwotCQkJCXNhMS5zZWNyZXRsZW4gPSBpOwotCQkJfSBlbHNlIHsKLQkJCQltZW1jcHkoc2ExLnNlY3JldCwgY29sb24sIHNpemVvZihzYTEuc2VjcmV0KSk7Ci0JCQkJc2ExLnNlY3JldGxlbiA9IHNpemVvZihzYTEuc2VjcmV0KTsKLQkJCX0KLQkJfQotCX0KLQotCWVzcF9wcmludF9hZGRzYShuZG8sICZzYTEsIHNhX2RlZik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVzcF9wcmludF9kZWNvZGVzZWNyZXQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8pCi17Ci0JY2hhciAqbGluZTsKLQljaGFyICpwOwotCi0JcCA9IG5kby0+bmRvX2VzcHNlY3JldDsKLQotCXdoaWxlIChuZG8tPm5kb19lc3BzZWNyZXQgJiYgbmRvLT5uZG9fZXNwc2VjcmV0WzBdICE9ICdcMCcpIHsKLQkJLyogcGljayBvdXQgdGhlIGZpcnN0IGxpbmUgb3IgZmlyc3QgdGhpbmcgdW50aWwgYSBjb21tYSAqLwotCQlpZiAoKGxpbmUgPSBzdHJzZXAoJm5kby0+bmRvX2VzcHNlY3JldCwgIlxuLCIpKSA9PSBOVUxMKSB7Ci0JCQlsaW5lID0gbmRvLT5uZG9fZXNwc2VjcmV0OwotCQkJbmRvLT5uZG9fZXNwc2VjcmV0ID0gTlVMTDsKLQkJfQotCi0JCWVzcF9wcmludF9kZWNvZGVfb25lc2VjcmV0KG5kbywgbGluZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBlc3BfaW5pdChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbyBfVV8pCi17Ci0KLQlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOwotCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Rlc19lZGUzX2NiYywgIjNkZXMiKTsKLX0KLSNlbmRpZgotCi1pbnQKLWVzcF9wcmludChuZXRkaXNzZWN0X29wdGlvbnMgKm5kbywKLQkgIGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IGludCBsZW5ndGgsIGNvbnN0IHVfY2hhciAqYnAyCi0jaWZuZGVmIEhBVkVfTElCQ1JZUFRPCi0JX1VfCi0jZW5kaWYKLQksCi0JaW50ICpuaGRyCi0jaWZuZGVmIEhBVkVfTElCQ1JZUFRPCi0JX1VfCi0jZW5kaWYKLQksCi0JaW50ICpwYWRsZW4KLSNpZm5kZWYgSEFWRV9MSUJDUllQVE8KLQlfVV8KLSNlbmRpZgotCSkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbmV3ZXNwICplc3A7Ci0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcDsKLSNpZmRlZiBIQVZFX0xJQkNSWVBUTwotCXN0cnVjdCBpcCAqaXA7Ci0Jc3RydWN0IHNhX2xpc3QgKnNhID0gTlVMTDsKLQlpbnQgZXNwc2VjcmV0X2tleWxlbjsKLSNpZmRlZiBJTkVUNgotCXN0cnVjdCBpcDZfaGRyICppcDYgPSBOVUxMOwotI2VuZGlmCi0JaW50IGFkdmFuY2U7Ci0JaW50IGxlbjsKLQl1X2NoYXIgKnNlY3JldDsKLQlpbnQgaXZsZW4gPSAwOwotCXVfY2hhciAqaXZvZmY7Ci0JdV9jaGFyICpwOwotCUVWUF9DSVBIRVJfQ1RYIGN0eDsKLQlpbnQgYmxvY2tzejsKLQlzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLSNlbmRpZgotCi0JZXNwID0gKHN0cnVjdCBuZXdlc3AgKilicDsKLQotI2lmZGVmIEhBVkVfTElCQ1JZUFRPCi0Jc2VjcmV0ID0gTlVMTDsKLQlhZHZhbmNlID0gMDsKLQotCWlmICghaW5pdGlhbGl6ZWQpIHsKLQkJZXNwX2luaXQobmRvKTsKLQkJaW5pdGlhbGl6ZWQgPSAxOwotCX0KLSNlbmRpZgotCi0jaWYgMAotCS8qIGtlZXAgc2VjcmV0IG91dCBvZiBhIHJlZ2lzdGVyICovCi0JcCA9ICh1X2NoYXIgKikmc2VjcmV0OwotI2VuZGlmCi0KLQkvKiAnZXAnIHBvaW50cyB0byB0aGUgZW5kIG9mIGF2YWlsYWJsZSBkYXRhLiAqLwotCWVwID0gbmRvLT5uZG9fc25hcGVuZDsKLQotCWlmICgodV9jaGFyICopKGVzcCArIDEpID49IGVwKSB7Ci0JCWZwdXRzKCJbfEVTUF0iLCBzdGRvdXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCSgqbmRvLT5uZG9fcHJpbnRmKShuZG8sICJFU1Aoc3BpPTB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKCZlc3AtPmVzcF9zcGkpKTsKLQkoKm5kby0+bmRvX3ByaW50ZikobmRvLCAiLHNlcT0weCV4KSIsIEVYVFJBQ1RfMzJCSVRTKCZlc3AtPmVzcF9zZXEpKTsKLSAgICAgICAgKCpuZG8tPm5kb19wcmludGYpKG5kbywgIiwgbGVuZ3RoICV1IiwgbGVuZ3RoKTsKLQotI2lmbmRlZiBIQVZFX0xJQkNSWVBUTwotCWdvdG8gZmFpbDsKLSNlbHNlCi0JLyogaW5pdGlhaWxpemUgU0FzICovCi0JaWYgKG5kby0+bmRvX3NhX2xpc3RfaGVhZCA9PSBOVUxMKSB7Ci0JCWlmICghbmRvLT5uZG9fZXNwc2VjcmV0KQotCQkJZ290byBmYWlsOwotCi0JCWVzcF9wcmludF9kZWNvZGVzZWNyZXQobmRvKTsKLQl9Ci0KLQlpZiAobmRvLT5uZG9fc2FfbGlzdF9oZWFkID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQotCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKLQlzd2l0Y2ggKElQX1YoaXApKSB7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIDY6Ci0JCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKLQkJLyogd2UgZG8gbm90IGF0dGVtcHQgdG8gZGVjcnlwdCBqdW1ib2dyYW1zICovCi0JCWlmICghRVhUUkFDVF8xNkJJVFMoJmlwNi0+aXA2X3BsZW4pKQotCQkJZ290byBmYWlsOwotCQkvKiBpZiB3ZSBjYW4ndCBnZXQgbmV4dGhkciwgd2UgZG8gbm90IG5lZWQgdG8gZGVjcnlwdCBpdCAqLwotCQlsZW4gPSBzaXplb2Yoc3RydWN0IGlwNl9oZHIpICsgRVhUUkFDVF8xNkJJVFMoJmlwNi0+aXA2X3BsZW4pOwotCi0JCS8qIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgU0EsIGFuZCBpZiBzbywgZGVjb2RlIGl0ICovCi0JCWZvciAoc2EgPSBuZG8tPm5kb19zYV9saXN0X2hlYWQ7IHNhICE9IE5VTEw7IHNhID0gc2EtPm5leHQpIHsKLQkJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzYS0+ZGFkZHI7Ci0JCQlpZiAoc2EtPnNwaSA9PSBudG9obChlc3AtPmVzcF9zcGkpICYmCi0JCQkgICAgc2luNi0+c2luNl9mYW1pbHkgPT0gQUZfSU5FVDYgJiYKLQkJCSAgICBtZW1jbXAoJnNpbjYtPnNpbjZfYWRkciwgJmlwNi0+aXA2X2RzdCwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgPT0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotI2VuZGlmIC8qSU5FVDYqLwotCWNhc2UgNDoKLQkJLyogbmV4dGhkciAmIHBhZGRpbmcgYXJlIGluIHRoZSBsYXN0IGZyYWdtZW50ICovCi0JCWlmIChFWFRSQUNUXzE2QklUUygmaXAtPmlwX29mZikgJiBJUF9NRikKLQkJCWdvdG8gZmFpbDsKLQkJbGVuID0gRVhUUkFDVF8xNkJJVFMoJmlwLT5pcF9sZW4pOwotCi0JCS8qIHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgU0EsIGFuZCBpZiBzbywgZGVjb2RlIGl0ICovCi0JCWZvciAoc2EgPSBuZG8tPm5kb19zYV9saXN0X2hlYWQ7IHNhICE9IE5VTEw7IHNhID0gc2EtPm5leHQpIHsKLQkJCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzYS0+ZGFkZHI7Ci0JCQlpZiAoc2EtPnNwaSA9PSBudG9obChlc3AtPmVzcF9zcGkpICYmCi0JCQkgICAgc2luLT5zaW5fZmFtaWx5ID09IEFGX0lORVQgJiYKLQkJCSAgICBzaW4tPnNpbl9hZGRyLnNfYWRkciA9PSBpcC0+aXBfZHN0LnNfYWRkcikgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBpZiB3ZSBkaWRuJ3QgZmluZCB0aGUgc3BlY2lmaWMgb25lLCB0aGVuIGxvb2sgZm9yCi0JICogYW4gdW5zcGVjaWZpZWQgb25lLgotCSAqLwotCWlmIChzYSA9PSBOVUxMKQotCQlzYSA9IG5kby0+bmRvX3NhX2RlZmF1bHQ7Ci0JCi0JLyogaWYgbm90IGZvdW5kIGZhaWwgKi8KLQlpZiAoc2EgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCi0JLyogaWYgd2UgY2FuJ3QgZ2V0IG5leHRoZHIsIHdlIGRvIG5vdCBuZWVkIHRvIGRlY3J5cHQgaXQgKi8KLQlpZiAoZXAgLSBicDIgPCBsZW4pCi0JCWdvdG8gZmFpbDsKLQlpZiAoZXAgLSBicDIgPiBsZW4pIHsKLQkJLyogRkNTIGluY2x1ZGVkIGF0IGVuZCBvZiBmcmFtZSAoTmV0QlNEIDEuNiBvciBsYXRlcikgKi8KLQkJZXAgPSBicDIgKyBsZW47Ci0JfQotCi0JaXZvZmYgPSAodV9jaGFyICopKGVzcCArIDEpICsgMDsKLQlpdmxlbiA9IHNhLT5pdmxlbjsKLQlzZWNyZXQgPSBzYS0+c2VjcmV0OwotCWVzcHNlY3JldF9rZXlsZW4gPSBzYS0+c2VjcmV0bGVuOwotCWVwID0gZXAgLSBzYS0+YXV0aGxlbjsKLQotCWlmIChzYS0+ZXZwKSB7Ci0JCW1lbXNldCgmY3R4LCAwLCBzaXplb2YoY3R4KSk7Ci0JCWlmIChFVlBfQ2lwaGVySW5pdCgmY3R4LCBzYS0+ZXZwLCBzZWNyZXQsIE5VTEwsIDApIDwgMCkKLQkJCSgqbmRvLT5uZG9fd2FybmluZykobmRvLCAiZXNwa2V5IGluaXQgZmFpbGVkIik7Ci0KLQkJYmxvY2tzeiA9IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoJmN0eCk7Ci0KLQkJcCA9IGl2b2ZmOwotCQlFVlBfQ2lwaGVySW5pdCgmY3R4LCBOVUxMLCBOVUxMLCBwLCAwKTsKLQkJRVZQX0NpcGhlcigmY3R4LCBwICsgaXZsZW4sIHAgKyBpdmxlbiwgZXAgLSAocCArIGl2bGVuKSk7Ci0JCWFkdmFuY2UgPSBpdm9mZiAtICh1X2NoYXIgKillc3AgKyBpdmxlbjsKLQl9IGVsc2UKLQkJYWR2YW5jZSA9IHNpemVvZihzdHJ1Y3QgbmV3ZXNwKTsKLQotCS8qIHNhbml0eSBjaGVjayBmb3IgcGFkIGxlbmd0aCAqLwotCWlmIChlcCAtIGJwIDwgKihlcCAtIDIpKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAocGFkbGVuKQotCQkqcGFkbGVuID0gKihlcCAtIDIpICsgMjsKLQotCWlmIChuaGRyKQotCQkqbmhkciA9ICooZXAgLSAxKTsKLQotCShuZG8tPm5kb19wcmludGYpKG5kbywgIjogIik7Ci0JcmV0dXJuIGFkdmFuY2U7Ci0jZW5kaWYKLQotZmFpbDoKLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1ldGhlci5jIGIvcHJpbnQtZXRoZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxYTdjYy4uMDAwMDAwMAotLS0gYS9wcmludC1ldGhlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtZXRoZXIuYyx2IDEuOTUuMi42IDIwMDYvMDIvMjAgMTg6MTU6MDMgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0KLSNpbmNsdWRlICJldGhlci5oIgotCi1jb25zdCBzdHJ1Y3QgdG9rIGV0aGVydHlwZV92YWx1ZXNbXSA9IHsgCi0gICAgeyBFVEhFUlRZUEVfSVAsCQkiSVB2NCIgfSwKLSAgICB7IEVUSEVSVFlQRV9NUExTLAkJIk1QTFMgdW5pY2FzdCIgfSwKLSAgICB7IEVUSEVSVFlQRV9NUExTX01VTFRJLAkiTVBMUyBtdWx0aWNhc3QiIH0sCi0gICAgeyBFVEhFUlRZUEVfSVBWNiwJCSJJUHY2IiB9LAotICAgIHsgRVRIRVJUWVBFXzgwMjFRLAkJIjgwMi4xUSIgfSwKLSAgICB7IEVUSEVSVFlQRV9WTUFOLAkJIlZNQU4iIH0sCi0gICAgeyBFVEhFUlRZUEVfUFVQLCAgICAgICAgICAgICJQVVAiIH0sCi0gICAgeyBFVEhFUlRZUEVfQVJQLCAgICAgICAgICAgICJBUlAifSwKLSAgICB7IEVUSEVSVFlQRV9SRVZBUlAsICAgICAgICAgIlJldmVyc2UgQVJQIn0sCi0gICAgeyBFVEhFUlRZUEVfTlMsICAgICAgICAgICAgICJOUyIgfSwKLSAgICB7IEVUSEVSVFlQRV9TUFJJVEUsICAgICAgICAgIlNwcml0ZSIgfSwKLSAgICB7IEVUSEVSVFlQRV9UUkFJTCwgICAgICAgICAgIlRyYWlsIiB9LAotICAgIHsgRVRIRVJUWVBFX01PUERMLCAgICAgICAgICAiTU9QIERMIiB9LAotICAgIHsgRVRIRVJUWVBFX01PUFJDLCAgICAgICAgICAiTU9QIFJDIiB9LAotICAgIHsgRVRIRVJUWVBFX0ROLCAgICAgICAgICAgICAiRE4iIH0sCi0gICAgeyBFVEhFUlRZUEVfTEFULCAgICAgICAgICAgICJMQVQiIH0sCi0gICAgeyBFVEhFUlRZUEVfU0NBLCAgICAgICAgICAgICJTQ0EiIH0sCi0gICAgeyBFVEhFUlRZUEVfTEFOQlJJREdFLCAgICAgICJMYW5icmlkZ2UiIH0sCi0gICAgeyBFVEhFUlRZUEVfREVDRE5TLCAgICAgICAgICJERUMgRE5TIiB9LAotICAgIHsgRVRIRVJUWVBFX0RFQ0RUUywgICAgICAgICAiREVDIERUUyIgfSwKLSAgICB7IEVUSEVSVFlQRV9WRVhQLCAgICAgICAgICAgIlZFWFAiIH0sCi0gICAgeyBFVEhFUlRZUEVfVlBST0QsICAgICAgICAgICJWUFJPRCIgfSwKLSAgICB7IEVUSEVSVFlQRV9BVEFMSywgICAgICAgICAgIkFwcGxldGFsayIgfSwKLSAgICB7IEVUSEVSVFlQRV9BQVJQLCAgICAgICAgICAgIkFwcGxldGFsayBBUlAiIH0sCi0gICAgeyBFVEhFUlRZUEVfSVBYLCAgICAgICAgICAgICJJUFgiIH0sCi0gICAgeyBFVEhFUlRZUEVfUFBQLCAgICAgICAgICAgICJQUFAiIH0sCi0gICAgeyBFVEhFUlRZUEVfU0xPVywgICAgICAgICAgICJTbG93IFByb3RvY29scyIgfSwKLSAgICB7IEVUSEVSVFlQRV9QUFBPRUQsICAgICAgICAgIlBQUG9FIEQiIH0sCi0gICAgeyBFVEhFUlRZUEVfUFBQT0VTLCAgICAgICAgICJQUFBvRSBTIiB9LAotICAgIHsgRVRIRVJUWVBFX0VBUE9MLCAgICAgICAgICAiRUFQT0wiIH0sCi0gICAgeyBFVEhFUlRZUEVfSlVNQk8sICAgICAgICAgICJKdW1ibyIgfSwKLSAgICB7IEVUSEVSVFlQRV9MT09QQkFDSywgICAgICAgIkxvb3BiYWNrIiB9LAotICAgIHsgRVRIRVJUWVBFX0lTTywgICAgICAgICAgICAiT1NJIiB9LAotICAgIHsgRVRIRVJUWVBFX0dSRV9JU08sICAgICAgICAiR1JFLU9TSSIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWV0aGVyX2hkcl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGV0aGVyX2hlYWRlciAqZXA7Ci0JZXAgPSAoY29uc3Qgc3RydWN0IGV0aGVyX2hlYWRlciAqKWJwOwotCi0JKHZvaWQpcHJpbnRmKCIlcyA+ICVzIiwKLQkJICAgICBldGhlcmFkZHJfc3RyaW5nKEVTUkMoZXApKSwKLQkJICAgICBldGhlcmFkZHJfc3RyaW5nKEVEU1QoZXApKSk7Ci0KLQlpZiAoIXFmbGFnKSB7Ci0JICAgICAgICBpZiAobnRvaHMoZXAtPmV0aGVyX3R5cGUpIDw9IEVUSEVSTVRVKQotCQkgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIDgwMi4zIik7Ci0gICAgICAgICAgICAgICAgZWxzZSAKLQkJICAgICAgICAgICh2b2lkKXByaW50ZigiLCBldGhlcnR5cGUgJXMgKDB4JTA0eCkiLAotCQkJCSAgICAgICB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsIlVua25vd24iLCBudG9ocyhlcC0+ZXRoZXJfdHlwZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRvaHMoZXAtPmV0aGVyX3R5cGUpKTsJICAgICAgCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKG50b2hzKGVwLT5ldGhlcl90eXBlKSA8PSBFVEhFUk1UVSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIDgwMi4zIik7Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsICVzIiwgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCJVbmtub3duIEV0aGVydHlwZSAoMHglMDR4KSIsIG50b2hzKGVwLT5ldGhlcl90eXBlKSkpOyAgCi0gICAgICAgIH0KLQotCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQKLWV0aGVyX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pCi17Ci0Jc3RydWN0IGV0aGVyX2hlYWRlciAqZXA7Ci0JdV9zaG9ydCBldGhlcl90eXBlOwotCXVfc2hvcnQgZXh0cmFjdGVkX2V0aGVyX3R5cGU7Ci0KLQlpZiAoY2FwbGVuIDwgRVRIRVJfSERSTEVOKSB7Ci0JCXByaW50ZigiW3xldGhlcl0iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChlZmxhZykKLQkJZXRoZXJfaGRyX3ByaW50KHAsIGxlbmd0aCk7Ci0KLQlsZW5ndGggLT0gRVRIRVJfSERSTEVOOwotCWNhcGxlbiAtPSBFVEhFUl9IRFJMRU47Ci0JZXAgPSAoc3RydWN0IGV0aGVyX2hlYWRlciAqKXA7Ci0JcCArPSBFVEhFUl9IRFJMRU47Ci0KLQlldGhlcl90eXBlID0gbnRvaHMoZXAtPmV0aGVyX3R5cGUpOwotCi0JLyoKLQkgKiBJcyBpdCAoZ2FnKSBhbiA4MDIuMyBlbmNhcHN1bGF0aW9uPwotCSAqLwotCWlmIChldGhlcl90eXBlIDw9IEVUSEVSTVRVKSB7Ci0JCS8qIFRyeSB0byBwcmludCB0aGUgTExDLWxheWVyIGhlYWRlciAmIGhpZ2hlciBsYXllcnMgKi8KLQkJaWYgKGxsY19wcmludChwLCBsZW5ndGgsIGNhcGxlbiwgRVNSQyhlcCksIEVEU1QoZXApLAotCQkgICAgJmV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7Ci0JCQkvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJpbnQgcmF3IHBhY2tldCAqLwotCQkJaWYgKCFlZmxhZykKLQkJCQlldGhlcl9oZHJfcHJpbnQoKHVfY2hhciAqKWVwLCBsZW5ndGggKyBFVEhFUl9IRFJMRU4pOwotCi0JCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCQl9Ci0JfSBlbHNlIGlmIChldGhlcl9lbmNhcF9wcmludChldGhlcl90eXBlLCBwLCBsZW5ndGgsIGNhcGxlbiwKLQkgICAgJmV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7Ci0JCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCi0JCWlmICghZWZsYWcpCi0JCQlldGhlcl9oZHJfcHJpbnQoKHVfY2hhciAqKWVwLCBsZW5ndGggKyBFVEhFUl9IRFJMRU4pOwotCi0JCWlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkKLQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKLQl9IAotfQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCi0gKiB0byB0aGUgZXRoZXIgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKLSAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJwotICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KLSAqLwotdV9pbnQKLWV0aGVyX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQotewotCWV0aGVyX3ByaW50KHAsIGgtPmxlbiwgaC0+Y2FwbGVuKTsKLQotCXJldHVybiAoRVRIRVJfSERSTEVOKTsKLX0KLQotLyoKLSAqIFByaW50cyB0aGUgcGFja2V0IGVuY2Fwc3VsYXRlZCBpbiBhbiBFdGhlcm5ldCBkYXRhIHNlZ21lbnQKLSAqIChvciBhbiBlcXVpdmFsZW50IGVuY2Fwc3VsYXRpb24pLCBnaXZlbiB0aGUgRXRoZXJuZXQgdHlwZSBjb2RlLgotICoKLSAqIFJldHVybnMgbm9uLXplcm8gaWYgaXQgY2FuIGRvIHNvLCB6ZXJvIGlmIHRoZSBldGhlcnR5cGUgaXMgdW5rbm93bi4KLSAqCi0gKiBUaGUgRXRoZXJuZXQgdHlwZSBjb2RlIGlzIHBhc3NlZCB0aHJvdWdoIGEgcG9pbnRlcjsgaWYgaXQgd2FzCi0gKiBFVEhFUlRZUEVfODAyMVEsIGl0IGdldHMgdXBkYXRlZCB0byBiZSB0aGUgRXRoZXJuZXQgdHlwZSBvZgotICogdGhlIDgwMi4xUSBwYXlsb2FkLCBmb3IgdGhlIGJlbmVmaXQgb2YgbG93ZXIgbGF5ZXJzIHRoYXQgbWlnaHQKLSAqIHdhbnQgdG8ga25vdyB3aGF0IGl0IGlzLgotICovCi0KLWludAotZXRoZXJfZW5jYXBfcHJpbnQodV9zaG9ydCBldGhlcl90eXBlLCBjb25zdCB1X2NoYXIgKnAsCi0gICAgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4sIHVfc2hvcnQgKmV4dHJhY3RlZF9ldGhlcl90eXBlKQotewotIHJlY3Vyc2U6Ci0JKmV4dHJhY3RlZF9ldGhlcl90eXBlID0gZXRoZXJfdHlwZTsKLQotCXN3aXRjaCAoZXRoZXJfdHlwZSkgewotCi0JY2FzZSBFVEhFUlRZUEVfSVA6Ci0JICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOwotCQlyZXR1cm4gKDEpOwotCi0jaWZkZWYgSU5FVDYKLQljYXNlIEVUSEVSVFlQRV9JUFY2OgotCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKLQkJcmV0dXJuICgxKTsKLSNlbmRpZiAvKklORVQ2Ki8KLQotCWNhc2UgRVRIRVJUWVBFX0FSUDoKLQljYXNlIEVUSEVSVFlQRV9SRVZBUlA6Ci0gIAkgICAgICAgIGFycF9wcmludChnbmRvLCBwLCBsZW5ndGgsIGNhcGxlbik7Ci0JCXJldHVybiAoMSk7Ci0KLQljYXNlIEVUSEVSVFlQRV9ETjoKLQkJZGVjbmV0X3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuKTsKLQkJcmV0dXJuICgxKTsKLQotCWNhc2UgRVRIRVJUWVBFX0FUQUxLOgotCQlpZiAodmZsYWcpCi0JCQlmcHV0cygiZXQxICIsIHN0ZG91dCk7Ci0JCWF0YWxrX3ByaW50KHAsIGxlbmd0aCk7Ci0JCXJldHVybiAoMSk7Ci0KLQljYXNlIEVUSEVSVFlQRV9BQVJQOgotCQlhYXJwX3ByaW50KHAsIGxlbmd0aCk7Ci0JCXJldHVybiAoMSk7Ci0KLQljYXNlIEVUSEVSVFlQRV9JUFg6Ci0JCXByaW50ZigiKE5PVi1FVEhJSSkgIik7Ci0JCWlweF9wcmludChwLCBsZW5ndGgpOwotCQlyZXR1cm4gKDEpOwotCi0JY2FzZSBFVEhFUlRZUEVfODAyMVE6Ci0JICAgICAgICBpZiAoZWZsYWcpCi0JCSAgICBwcmludGYoInZsYW4gJXUsIHAgJXUlcywgIiwKLQkJCSAgIG50b2hzKCoodV9pbnQxNl90ICopcCkgJiAweGZmZiwKLQkJCSAgIG50b2hzKCoodV9pbnQxNl90ICopcCkgPj4gMTMsCi0JCQkgICAobnRvaHMoKih1X2ludDE2X3QgKilwKSAmIDB4MTAwMCkgPyAiLCBDRkkiIDogIiIpOwotCi0JCWV0aGVyX3R5cGUgPSBudG9ocygqKHVfaW50MTZfdCAqKShwICsgMikpOwotCQlwICs9IDQ7Ci0JCWxlbmd0aCAtPSA0OwotCQljYXBsZW4gLT0gNDsKLQotCQlpZiAoZXRoZXJfdHlwZSA+IEVUSEVSTVRVKSB7Ci0JCSAgICAgICAgaWYgKGVmbGFnKQotCQkJICAgICAgICBwcmludGYoImV0aGVydHlwZSAlcywgIiwKLQkJCQkgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCIweCUwNHgiLCBldGhlcl90eXBlKSk7Ci0JCQlnb3RvIHJlY3Vyc2U7Ci0JCX0KLQotCQkqZXh0cmFjdGVkX2V0aGVyX3R5cGUgPSAwOwotCi0JCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIHAgLSAxOCwgcCAtIDEyLAotCQkgICAgZXh0cmFjdGVkX2V0aGVyX3R5cGUpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV0aGVyX2hkcl9wcmludChwIC0gMTgsIGxlbmd0aCArIDQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9wcmludChwIC0gMTgsIGNhcGxlbiArIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCQl9Ci0KLQotCQlyZXR1cm4gKDEpOwotCi0gICAgICAgIGNhc2UgRVRIRVJUWVBFX0pVTUJPOgotICAgICAgICAgICAgICAgIGV0aGVyX3R5cGUgPSBudG9ocygqKHVfaW50MTZfdCAqKShwKSk7Ci0gICAgICAgICAgICAgICAgcCArPSAyOwotICAgICAgICAgICAgICAgIGxlbmd0aCAtPSAyOyAgICAgIAotICAgICAgICAgICAgICAgIGNhcGxlbiAtPSAyOwotCi0gICAgICAgICAgICAgICAgaWYgKGV0aGVyX3R5cGUgPiBFVEhFUk1UVSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImV0aGVydHlwZSAlcywgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsIjB4JTA0eCIsIGV0aGVyX3R5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byByZWN1cnNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICpleHRyYWN0ZWRfZXRoZXJfdHlwZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAobGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBwIC0gMTYsIHAgLSAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV0aGVyX2hkcl9wcmludChwIC0gMTYsIGxlbmd0aCArIDIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3VwcHJlc3NfZGVmYXVsdF9wcmludCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJpbnQocCAtIDE2LCBjYXBsZW4gKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiAoMSk7Ci0KLSAgICAgICAgY2FzZSBFVEhFUlRZUEVfSVNPOgotICAgICAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCsxLCBsZW5ndGgtMSwgbGVuZ3RoLTEpOwotICAgICAgICAgICAgICAgIHJldHVybigxKTsKLQotCWNhc2UgRVRIRVJUWVBFX1BQUE9FRDoKLQljYXNlIEVUSEVSVFlQRV9QUFBPRVM6Ci0JCXBwcG9lX3ByaW50KHAsIGxlbmd0aCk7Ci0JCXJldHVybiAoMSk7Ci0KLQljYXNlIEVUSEVSVFlQRV9FQVBPTDoKLQkgICAgICAgIGVhcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOwotCQlyZXR1cm4gKDEpOwotCi0JY2FzZSBFVEhFUlRZUEVfUFBQOgotCQlpZiAobGVuZ3RoKSB7Ci0JCQlwcmludGYoIjogIik7Ci0JCQlwcHBfcHJpbnQocCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gKDEpOwotCi0JY2FzZSBFVEhFUlRZUEVfU0xPVzoKLQkgICAgICAgIHNsb3dfcHJpbnQocCwgbGVuZ3RoKTsKLQkJcmV0dXJuICgxKTsKLQotICAgICAgICBjYXNlIEVUSEVSVFlQRV9MT09QQkFDSzoKLSAgICAgICAgICAgICAgICByZXR1cm4gKDEpOwotCi0JY2FzZSBFVEhFUlRZUEVfTVBMUzoKLQljYXNlIEVUSEVSVFlQRV9NUExTX01VTFRJOgotCQltcGxzX3ByaW50KHAsIGxlbmd0aCk7Ci0JCXJldHVybiAoMSk7Ci0KLQljYXNlIEVUSEVSVFlQRV9MQVQ6Ci0JY2FzZSBFVEhFUlRZUEVfU0NBOgotCWNhc2UgRVRIRVJUWVBFX01PUFJDOgotCWNhc2UgRVRIRVJUWVBFX01PUERMOgotCQkvKiBkZWZhdWx0X3ByaW50IGZvciBub3cgKi8KLQlkZWZhdWx0OgotCQlyZXR1cm4gKDApOwotCX0KLX0KLQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogYy1zdHlsZTogd2hpdGVzbWl0aAotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwotCmRpZmYgLS1naXQgYS9wcmludC1mZGRpLmMgYi9wcmludC1mZGRpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjcxOTEuLjAwMDAwMDAKLS0tIGEvcHJpbnQtZmRkaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1mZGRpLmMsdiAxLjY0LjIuMiAyMDA1LzExLzEzIDEyOjEyOjU5IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHBjYXAuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotCi0jaW5jbHVkZSAiZXRoZXIuaCIKLSNpbmNsdWRlICJmZGRpLmgiCi0KLS8qCi0gKiBTb21lIEZEREkgaW50ZXJmYWNlcyB1c2UgYml0LXN3YXBwZWQgYWRkcmVzc2VzLgotICovCi0jaWYgZGVmaW5lZCh1bHRyaXgpIHx8IGRlZmluZWQoX19hbHBoYSkgfHwgZGVmaW5lZChfX2JzZGkpIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX2xpbnV4X18pCi1pbnQJZmRkaV9iaXRzd2FwID0gMDsKLSNlbHNlCi1pbnQJZmRkaV9iaXRzd2FwID0gMTsKLSNlbmRpZgotCi0vKgotICogRkRESSBzdXBwb3J0IGZvciB0Y3BkdW1wLCBieSBKZWZmcmV5IE1vZ3VsIFtERUNXUkxdLCBKdW5lIDE5OTIKLSAqCi0gKiBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgYnkgVmFuIEphY29ic29uLCB3aGljaCBiZWFycyB0aGlzIG5vdGU6Ci0gKgotICogTk9URTogIFRoaXMgaXMgYSB2ZXJ5IHByZWxpbWluYXJ5IGhhY2sgZm9yIEZEREkgc3VwcG9ydC4KLSAqIFRoZXJlIGFyZSBhbGwgc29ydHMgb2Ygd2lyZWQgaW4gY29uc3RhbnRzICYgbm90aGluZyAoeWV0KQotICogdG8gcHJpbnQgU01UIHBhY2tldHMgYXMgYW55dGhpbmcgb3RoZXIgdGhhbiBoZXggZHVtcHMuCi0gKiBNb3N0IG9mIHRoZSBuZWNlc3NhcnkgY2hhbmdlcyBhcmUgd2FpdGluZyBvbiBteSByZWRvaW5nCi0gKiB0aGUgImhlYWRlciIgdGhhdCBhIGtlcm5lbCBmZGRpIGRyaXZlciBzdXBwbGllcyB0byBicGY6ICBJCi0gKiB3YW50IGl0IHRvIGxvb2sgbGlrZSBvbmUgYnl0ZSBvZiAnZGlyZWN0aW9uJyAoMCBvciAxCi0gKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcGFja2V0IHdhcyBpbmJvdW5kIG9yIG91dGJvdW5kKSwKLSAqIHR3byBieXRlcyBvZiBzeXN0ZW0vZHJpdmVyIGRlcGVuZGVudCBkYXRhIChhbnl0aGluZyBhbgotICogaW1wbGVtZW50b3IgdGhpbmtzIHdvdWxkIGJlIHVzZWZ1bCB0byBmaWx0ZXIgb24gYW5kL29yCi0gKiBzYXZlIHBlci1wYWNrZXQsIHRoZW4gdGhlIHJlYWwgMjEtYnl0ZSBGRERJIGhlYWRlci4KLSAqIFN0ZXZlIE1jQ2FubmUgJiBJIGhhdmUgYWxzbyB0YWxrZWQgYWJvdXQgYWRkaW5nIHRoZQotICogJ2RpcmVjdGlvbicgYnl0ZSB0byBhbGwgYnBmIGhlYWRlcnMgKGUuZy4sIGluIHRoZSB0d28KLSAqIGJ5dGVzIG9mIHBhZGRpbmcgb24gYW4gZXRoZXJuZXQgaGVhZGVyKS4gIEl0J3Mgbm90IGNsZWFyCi0gKiB3ZSBjb3VsZCBkbyB0aGlzIGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUgd2F5ICYgd2UgaGF0ZQotICogdGhlIGlkZWEgb2YgYW4gaW5jb21wYXRpYmxlIGJwZiBjaGFuZ2UuICBEaXNjdXNzaW9ucyBhcmUKLSAqIHByb2NlZWRpbmcuCi0gKgotICogQWxzbywgdG8gcmVhbGx5IHN1cHBvcnQgRkRESSAoYW5kIGJldHRlciBzdXBwb3J0IDgwMi4yCi0gKiBvdmVyIGV0aGVybmV0KSB3ZSByZWFsbHkgbmVlZCB0byByZS10aGluayB0aGUgcmF0aGVyIHNpbXBsZQotICogbWluZGVkIGFzc3VtcHRpb25zIGFib3V0IGZpeGVkIGxlbmd0aCAmIGZpeGVkIGZvcm1hdCBsaW5rCi0gKiBsZXZlbCBoZWFkZXJzIG1hZGUgaW4gZ2VuY29kZS5jLiAgT25lIGRheS4uLgotICoKLSAqICAtIHZqCi0gKi8KLQotc3RhdGljIHVfY2hhciBmZGRpX2JpdF9zd2FwW10gPSB7Ci0JMHgwMCwgMHg4MCwgMHg0MCwgMHhjMCwgMHgyMCwgMHhhMCwgMHg2MCwgMHhlMCwKLQkweDEwLCAweDkwLCAweDUwLCAweGQwLCAweDMwLCAweGIwLCAweDcwLCAweGYwLAotCTB4MDgsIDB4ODgsIDB4NDgsIDB4YzgsIDB4MjgsIDB4YTgsIDB4NjgsIDB4ZTgsCi0JMHgxOCwgMHg5OCwgMHg1OCwgMHhkOCwgMHgzOCwgMHhiOCwgMHg3OCwgMHhmOCwKLQkweDA0LCAweDg0LCAweDQ0LCAweGM0LCAweDI0LCAweGE0LCAweDY0LCAweGU0LAotCTB4MTQsIDB4OTQsIDB4NTQsIDB4ZDQsIDB4MzQsIDB4YjQsIDB4NzQsIDB4ZjQsCi0JMHgwYywgMHg4YywgMHg0YywgMHhjYywgMHgyYywgMHhhYywgMHg2YywgMHhlYywKLQkweDFjLCAweDljLCAweDVjLCAweGRjLCAweDNjLCAweGJjLCAweDdjLCAweGZjLAotCTB4MDIsIDB4ODIsIDB4NDIsIDB4YzIsIDB4MjIsIDB4YTIsIDB4NjIsIDB4ZTIsCi0JMHgxMiwgMHg5MiwgMHg1MiwgMHhkMiwgMHgzMiwgMHhiMiwgMHg3MiwgMHhmMiwKLQkweDBhLCAweDhhLCAweDRhLCAweGNhLCAweDJhLCAweGFhLCAweDZhLCAweGVhLAotCTB4MWEsIDB4OWEsIDB4NWEsIDB4ZGEsIDB4M2EsIDB4YmEsIDB4N2EsIDB4ZmEsCi0JMHgwNiwgMHg4NiwgMHg0NiwgMHhjNiwgMHgyNiwgMHhhNiwgMHg2NiwgMHhlNiwKLQkweDE2LCAweDk2LCAweDU2LCAweGQ2LCAweDM2LCAweGI2LCAweDc2LCAweGY2LAotCTB4MGUsIDB4OGUsIDB4NGUsIDB4Y2UsIDB4MmUsIDB4YWUsIDB4NmUsIDB4ZWUsCi0JMHgxZSwgMHg5ZSwgMHg1ZSwgMHhkZSwgMHgzZSwgMHhiZSwgMHg3ZSwgMHhmZSwKLQkweDAxLCAweDgxLCAweDQxLCAweGMxLCAweDIxLCAweGExLCAweDYxLCAweGUxLAotCTB4MTEsIDB4OTEsIDB4NTEsIDB4ZDEsIDB4MzEsIDB4YjEsIDB4NzEsIDB4ZjEsCi0JMHgwOSwgMHg4OSwgMHg0OSwgMHhjOSwgMHgyOSwgMHhhOSwgMHg2OSwgMHhlOSwKLQkweDE5LCAweDk5LCAweDU5LCAweGQ5LCAweDM5LCAweGI5LCAweDc5LCAweGY5LAotCTB4MDUsIDB4ODUsIDB4NDUsIDB4YzUsIDB4MjUsIDB4YTUsIDB4NjUsIDB4ZTUsCi0JMHgxNSwgMHg5NSwgMHg1NSwgMHhkNSwgMHgzNSwgMHhiNSwgMHg3NSwgMHhmNSwKLQkweDBkLCAweDhkLCAweDRkLCAweGNkLCAweDJkLCAweGFkLCAweDZkLCAweGVkLAotCTB4MWQsIDB4OWQsIDB4NWQsIDB4ZGQsIDB4M2QsIDB4YmQsIDB4N2QsIDB4ZmQsCi0JMHgwMywgMHg4MywgMHg0MywgMHhjMywgMHgyMywgMHhhMywgMHg2MywgMHhlMywKLQkweDEzLCAweDkzLCAweDUzLCAweGQzLCAweDMzLCAweGIzLCAweDczLCAweGYzLAotCTB4MGIsIDB4OGIsIDB4NGIsIDB4Y2IsIDB4MmIsIDB4YWIsIDB4NmIsIDB4ZWIsCi0JMHgxYiwgMHg5YiwgMHg1YiwgMHhkYiwgMHgzYiwgMHhiYiwgMHg3YiwgMHhmYiwKLQkweDA3LCAweDg3LCAweDQ3LCAweGM3LCAweDI3LCAweGE3LCAweDY3LCAweGU3LAotCTB4MTcsIDB4OTcsIDB4NTcsIDB4ZDcsIDB4MzcsIDB4YjcsIDB4NzcsIDB4ZjcsCi0JMHgwZiwgMHg4ZiwgMHg0ZiwgMHhjZiwgMHgyZiwgMHhhZiwgMHg2ZiwgMHhlZiwKLQkweDFmLCAweDlmLCAweDVmLCAweGRmLCAweDNmLCAweGJmLCAweDdmLCAweGZmLAotfTsKLQotLyoKLSAqIFByaW50IEZEREkgZnJhbWUtY29udHJvbCBiaXRzCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotcHJpbnRfZmRkaV9mYyh1X2NoYXIgZmMpCi17Ci0Jc3dpdGNoIChmYykgewotCi0JY2FzZSBGRERJRkNfVk9JRDogICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9pZCBmcmFtZSAqLwotCQlwcmludGYoInZvaWQgIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRERJRkNfTlJUOiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm9ucmVzdHJpY3RlZCB0b2tlbiAqLwotCQlwcmludGYoIm5ydCAiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEZERElGQ19SVDogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0cmljdGVkIHRva2VuICovCi0JCXByaW50ZigicnQgIik7Ci0JCWJyZWFrOwotCi0JY2FzZSBGRERJRkNfU01UX0lORk86ICAgICAgICAgICAgICAgICAgICAgLyogU01UIEluZm8gKi8KLQkJcHJpbnRmKCJpbmZvICIpOwotCQlicmVhazsKLQotCWNhc2UgRkRESUZDX1NNVF9OU0E6ICAgICAgICAgICAgICAgICAgICAgIC8qIFNNVCBOZXh0IHN0YXRpb24gYWRycyAqLwotCQlwcmludGYoIm5zYSAiKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEZERElGQ19NQUNfQkVBQ09OOiAgICAgICAgICAgICAgICAgICAvKiBNQUMgQmVhY29uIGZyYW1lICovCi0JCXByaW50ZigiYmVhY29uICIpOwotCQlicmVhazsKLQotCWNhc2UgRkRESUZDX01BQ19DTEFJTTogICAgICAgICAgICAgICAgICAgIC8qIE1BQyBDbGFpbSBmcmFtZSAqLwotCQlwcmludGYoImNsYWltICIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXN3aXRjaCAoZmMgJiBGRERJRkNfQ0xGRikgewotCi0JCWNhc2UgRkRESUZDX01BQzoKLQkJCXByaW50ZigibWFjJTF4ICIsIGZjICYgRkRESUZDX1paWlopOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGRERJRkNfU01UOgotCQkJcHJpbnRmKCJzbXQlMXggIiwgZmMgJiBGRERJRkNfWlpaWik7Ci0JCQlicmVhazsKLQotCQljYXNlIEZERElGQ19MTENfQVNZTkM6Ci0JCQlwcmludGYoImFzeW5jJTF4ICIsIGZjICYgRkRESUZDX1paWlopOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBGRERJRkNfTExDX1NZTkM6Ci0JCQlwcmludGYoInN5bmMlMXggIiwgZmMgJiBGRERJRkNfWlpaWik7Ci0JCQlicmVhazsKLQotCQljYXNlIEZERElGQ19JTVBfQVNZTkM6Ci0JCQlwcmludGYoImltcF9hc3luYyUxeCAiLCBmYyAmIEZERElGQ19aWlpaKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRkRESUZDX0lNUF9TWU5DOgotCQkJcHJpbnRmKCJpbXBfc3luYyUxeCAiLCBmYyAmIEZERElGQ19aWlpaKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoIiUwMnggIiwgZmMpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLS8qIEV4dHJhY3Qgc3JjLCBkc3QgYWRkcmVzc2VzICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWV4dHJhY3RfZmRkaV9hZGRycyhjb25zdCBzdHJ1Y3QgZmRkaV9oZWFkZXIgKmZkZGlwLCBjaGFyICpmc3JjLCBjaGFyICpmZHN0KQotewotCXJlZ2lzdGVyIGludCBpOwotCi0JaWYgKGZkZGlfYml0c3dhcCkgewotCQkvKgotCQkgKiBiaXQtc3dhcCB0aGUgZmRkaSBhZGRyZXNzZXMgKGlzbid0IHRoZSBJRUVFIHN0YW5kYXJkcwotCQkgKiBwcm9jZXNzIHdvbmRlcmZ1bCEpIHRoZW4gY29udmVydCB0aGVtIHRvIG5hbWVzLgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKLQkJCWZkc3RbaV0gPSBmZGRpX2JpdF9zd2FwW2ZkZGlwLT5mZGRpX2Rob3N0W2ldXTsKLQkJZm9yIChpID0gMDsgaSA8IDY7ICsraSkKLQkJCWZzcmNbaV0gPSBmZGRpX2JpdF9zd2FwW2ZkZGlwLT5mZGRpX3Nob3N0W2ldXTsKLQl9Ci0JZWxzZSB7Ci0JCW1lbWNweShmZHN0LCAoY29uc3QgY2hhciAqKWZkZGlwLT5mZGRpX2Rob3N0LCA2KTsKLQkJbWVtY3B5KGZzcmMsIChjb25zdCBjaGFyICopZmRkaXAtPmZkZGlfc2hvc3QsIDYpOwotCX0KLX0KLQotLyoKLSAqIFByaW50IHRoZSBGRERJIE1BQyBoZWFkZXIKLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1mZGRpX2hkcl9wcmludChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgZmRkaV9oZWFkZXIgKmZkZGlwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCi0JICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpmc3JjLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmZkc3QpCi17Ci0JY29uc3QgY2hhciAqc3JjbmFtZSwgKmRzdG5hbWU7Ci0KLQlzcmNuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmc3JjKTsKLQlkc3RuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmZHN0KTsKLQotCWlmICh2ZmxhZykKLQkJKHZvaWQpIHByaW50ZigiJTAyeCAlcyAlcyAlZDogIiwKLQkJICAgICAgIGZkZGlwLT5mZGRpX2ZjLAotCQkgICAgICAgc3JjbmFtZSwgZHN0bmFtZSwKLQkJICAgICAgIGxlbmd0aCk7Ci0JZWxzZSBpZiAocWZsYWcpCi0JCXByaW50ZigiJXMgJXMgJWQ6ICIsIHNyY25hbWUsIGRzdG5hbWUsIGxlbmd0aCk7Ci0JZWxzZSB7Ci0JCSh2b2lkKSBwcmludF9mZGRpX2ZjKGZkZGlwLT5mZGRpX2ZjKTsKLQkJKHZvaWQpIHByaW50ZigiJXMgJXMgJWQ6ICIsIHNyY25hbWUsIGRzdG5hbWUsIGxlbmd0aCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWZkZGlfc210X3ByaW50KGNvbnN0IHVfY2hhciAqcCBfVV8sIHVfaW50IGxlbmd0aCBfVV8pCi17Ci0JcHJpbnRmKCI8U01UIHByaW50ZXIgbm90IHlldCBpbXBsZW1lbnRlZD4iKTsKLX0KLQotdm9pZAotZmRkaV9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQotewotCWNvbnN0IHN0cnVjdCBmZGRpX2hlYWRlciAqZmRkaXAgPSAoY29uc3Qgc3RydWN0IGZkZGlfaGVhZGVyICopcDsKLQlzdHJ1Y3QgZXRoZXJfaGVhZGVyIGVoZHI7Ci0JdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJ0eXBlOwotCi0JaWYgKGNhcGxlbiA8IEZERElfSERSTEVOKSB7Ci0JCXByaW50ZigiW3xmZGRpXSIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBHZXQgdGhlIEZEREkgYWRkcmVzc2VzIGludG8gYSBjYW5vbmljYWwgZm9ybQotCSAqLwotCWV4dHJhY3RfZmRkaV9hZGRycyhmZGRpcCwgKGNoYXIgKilFU1JDKCZlaGRyKSwgKGNoYXIgKilFRFNUKCZlaGRyKSk7Ci0KLQlpZiAoZWZsYWcpCi0JCWZkZGlfaGRyX3ByaW50KGZkZGlwLCBsZW5ndGgsIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7Ci0KLQkvKiBTa2lwIG92ZXIgRkRESSBNQUMgaGVhZGVyICovCi0JbGVuZ3RoIC09IEZERElfSERSTEVOOwotCXAgKz0gRkRESV9IRFJMRU47Ci0JY2FwbGVuIC09IEZERElfSERSTEVOOwotCi0JLyogRnJhbWUgQ29udHJvbCBmaWVsZCBkZXRlcm1pbmVzIGludGVycHJldGF0aW9uIG9mIHBhY2tldCAqLwotCWlmICgoZmRkaXAtPmZkZGlfZmMgJiBGRERJRkNfQ0xGRikgPT0gRkRESUZDX0xMQ19BU1lOQykgewotCQkvKiBUcnkgdG8gcHJpbnQgdGhlIExMQy1sYXllciBoZWFkZXIgJiBoaWdoZXIgbGF5ZXJzICovCi0JCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSwKLQkJICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKSB7Ci0JCQkvKgotCQkJICogU29tZSBraW5kcyBvZiBMTEMgcGFja2V0IHdlIGNhbm5vdAotCQkJICogaGFuZGxlIGludGVsbGlnZW50bHkKLQkJCSAqLwotCQkJaWYgKCFlZmxhZykKLQkJCQlmZGRpX2hkcl9wcmludChmZGRpcCwgbGVuZ3RoICsgRkRESV9IRFJMRU4sCi0JCQkJICAgIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7Ci0JCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgewotCQkJCXByaW50ZigiKExMQyAlcykgIiwKLQkJCWV0aGVycHJvdG9fc3RyaW5nKGh0b25zKGV4dHJhY3RlZF9ldGhlcnR5cGUpKSk7Ci0JCQl9Ci0JCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCQl9Ci0JfSBlbHNlIGlmICgoZmRkaXAtPmZkZGlfZmMgJiBGRERJRkNfQ0xGRikgPT0gRkRESUZDX1NNVCkKLQkJZmRkaV9zbXRfcHJpbnQocCwgY2FwbGVuKTsKLQllbHNlIHsKLQkJLyogU29tZSBraW5kcyBvZiBGRERJIHBhY2tldCB3ZSBjYW5ub3QgaGFuZGxlIGludGVsbGlnZW50bHkgKi8KLQkJaWYgKCFlZmxhZykKLQkJCWZkZGlfaGRyX3ByaW50KGZkZGlwLCBsZW5ndGggKyBGRERJX0hEUkxFTiwgRVNSQygmZWhkciksCi0JCQkgICAgRURTVCgmZWhkcikpOwotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7Ci0JfQotfQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCi0gKiB0byB0aGUgRkRESSBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotZmRkaV9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlmZGRpX3ByaW50KHAsIGgtPmxlbiwgaC0+Y2FwbGVuKTsKLQotCXJldHVybiAoRkRESV9IRFJMRU4pOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtZnIuYyBiL3ByaW50LWZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1M2E4OGIuLjAwMDAwMDAKLS0tIGEvcHJpbnQtZnIuYworKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0JIkAoIykkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1mci5jLHYgMS4zMi4yLjE1IDIwMDYvMDIvMDEgMTQ6Mzk6NTYgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAibmxwaWQuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAib3VpLmgiCi0KLXN0YXRpYyB2b2lkIGZyZjE1X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci0KLS8qCi0gKiB0aGUgZnJhbWUgcmVsYXkgaGVhZGVyIGhhcyBhIHZhcmlhYmxlIGxlbmd0aAotICoKLSAqIHRoZSBFQSBiaXQgZGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbm90aGVyIGJ5dGUKLSAqIGluIHRoZSBoZWFkZXIKLSAqCi0gKiBtaW5pbXVtIGhlYWRlciBsZW5ndGggaXMgMiBieXRlcwotICogbWF4aW11bSBoZWFkZXIgbGVuZ3RoIGlzIDQgYnl0ZXMKLSAqCi0gKiAgICAgIDcgICAgNiAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMAotICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKLSAqICAgIHwgICAgICAgIERMQ0kgKDYgYml0cykgICAgICAgIHwgQ1IgfCBFQSB8Ci0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICogICAgfCAgIERMQ0kgKDQgYml0cykgICB8RkVDTnxCRUNOfCBERSB8IEVBIHwKLSAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCi0gKiAgICB8ICAgICAgICAgICBETENJICg3IGJpdHMpICAgICAgICAgIHwgRUEgfAotICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKLSAqICAgIHwgICAgICAgIERMQ0kgKDYgYml0cykgICAgICAgIHxTRExDfCBFQSB8Ci0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICovCi0KLSNkZWZpbmUgRlJfRUFfQklUCTB4MDEKLQotI2RlZmluZSBGUl9DUl9CSVQgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBGUl9ERV9CSVQJMHgwMDAyMDAwMAotI2RlZmluZSBGUl9CRUNOX0JJVAkweDAwMDQwMDAwCi0jZGVmaW5lIEZSX0ZFQ05fQklUCTB4MDAwODAwMDAKLSNkZWZpbmUgRlJfU0RMQ19CSVQJMHgwMDAwMDAwMgotCi0KLXN0cnVjdCB0b2sgZnJfaGVhZGVyX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyBGUl9DUl9CSVQsICJDISIgfSwKLSAgICB7IEZSX0RFX0JJVCwgIkRFIiB9LAotICAgIHsgRlJfQkVDTl9CSVQsICJCRUNOIiB9LAotICAgIHsgRlJfRkVDTl9CSVQsICJGRUNOIiB9LAotICAgIHsgRlJfU0RMQ19CSVQsICJzZGxjb3JlIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0vKiBGUkYuMTUgLyBGUkYuMTYgKi8KLSNkZWZpbmUgTUZSX0JfQklUIDB4ODAKLSNkZWZpbmUgTUZSX0VfQklUIDB4NDAKLSNkZWZpbmUgTUZSX0NfQklUIDB4MjAKLSNkZWZpbmUgTUZSX0JFQ19NQVNLICAgIChNRlJfQl9CSVQgfCBNRlJfRV9CSVQgfCBNRlJfQ19CSVQpCi0jZGVmaW5lIE1GUl9DVFJMX0ZSQU1FICAoTUZSX0JfQklUIHwgTUZSX0VfQklUIHwgTUZSX0NfQklUKQotI2RlZmluZSBNRlJfRlJBR19GUkFNRSAgKE1GUl9CX0JJVCB8IE1GUl9FX0JJVCApCi0KLXN0cnVjdCB0b2sgZnJmX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyBNRlJfQl9CSVQsICJCZWdpbiIgfSwKLSAgICB7IE1GUl9FX0JJVCwgIkVuZCIgfSwKLSAgICB7IE1GUl9DX0JJVCwgIkNvbnRyb2wiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLS8qIEZpbmRzIG91dCBRLjkyMiBhZGRyZXNzIGxlbmd0aCwgRExDSSBhbmQgZmxhZ3MuIFJldHVybnMgMCBvbiBzdWNjZXNzCi0gKiBzYXZlIHRoZSBmbGFncyBkZXAuIG9uIGFkZHJlc3MgbGVuZ3RoCi0gKi8KLXN0YXRpYyBpbnQgcGFyc2VfcTkyMl9hZGRyKGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgKmRsY2ksIHVfaW50ICpzZGxjb3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9pbnQgKmFkZHJfbGVuLCB1X2ludDhfdCAqZmxhZ3MpCi17Ci0JaWYgKChwWzBdICYgRlJfRUFfQklUKSkKLQkJcmV0dXJuIC0xOwotCi0JKmFkZHJfbGVuID0gMjsKLQkqZGxjaSA9ICgocFswXSAmIDB4RkMpIDw8IDIpIHwgKChwWzFdICYgMHhGMCkgPj4gNCk7Ci0KLSAgICAgICAgZmxhZ3NbMF0gPSBwWzBdICYgMHgwMjsgLyogcG9wdWxhdGUgdGhlIGZpcnN0IGZsYWcgZmllbGRzICovCi0gICAgICAgIGZsYWdzWzFdID0gcFsxXSAmIDB4MGM7Ci0gICAgICAgIGZsYWdzWzJdID0gMDsgICAgICAgICAgIC8qIGNsZWFyIHRoZSByZXN0IG9mIHRoZSBmbGFncyAqLwotICAgICAgICBmbGFnc1szXSA9IDA7Ci0KLQlpZiAocFsxXSAmIEZSX0VBX0JJVCkKLQkJcmV0dXJuIDA7CS8qIDItYnl0ZSBRLjkyMiBhZGRyZXNzICovCi0KLQlwICs9IDI7Ci0JKCphZGRyX2xlbikrKzsJCS8qIDMtIG9yIDQtYnl0ZSBRLjkyMiBhZGRyZXNzICovCi0JaWYgKChwWzBdICYgRlJfRUFfQklUKSA9PSAwKSB7Ci0JCSpkbGNpID0gKCpkbGNpIDw8IDcpIHwgKHBbMF0gPj4gMSk7Ci0JCSgqYWRkcl9sZW4pKys7CS8qIDQtYnl0ZSBRLjkyMiBhZGRyZXNzICovCi0JCXArKzsKLQl9Ci0KLQlpZiAoKHBbMF0gJiBGUl9FQV9CSVQpID09IDApCi0JCXJldHVybiAtMTsgLyogbW9yZSB0aGFuIDQgYnl0ZXMgb2YgUS45MjIgYWRkcmVzcz8gKi8KLQotICAgICAgICBmbGFnc1szXSA9IHBbMF0gJiAweDAyOwotCi0JaWYgKHBbMF0gJiAweDAyKQotICAgICAgICAgICAgICAgICpzZGxjb3JlID0gIHBbMF0gPj4gMjsKLQllbHNlCi0JCSpkbGNpID0gKCpkbGNpIDw8IDYpIHwgKHBbMF0gPj4gMik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRnJhbWUgUmVsYXkgcGFja2V0IHN0cnVjdHVyZSwgd2l0aCBmbGFncyBhbmQgQ1JDIHJlbW92ZWQKLQotICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgUS45MjIgQWRkcmVzcyogICAgICB8Ci0gICAgICAgICAgICAgICAgICArLS0gICAgICAgICAgICAgICAgICAgICAgIC0tKwotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICB8IENvbnRyb2wgKFVJID0gMHgwMykgICAgICAgfAotICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgIHwgT3B0aW9uYWwgUGFkICAgICAgKDB4MDApICB8Ci0gICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgfCBOTFBJRCAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIC4gICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgLiAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBEYXRhICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAuICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgLiAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotCi0gICAgICAgICAgICogUS45MjIgYWRkcmVzc2VzLCBhcyBwcmVzZW50bHkgZGVmaW5lZCwgYXJlIHR3byBvY3RldHMgYW5kCi0gICAgICAgICAgICAgY29udGFpbiBhIDEwLWJpdCBETENJLiAgSW4gc29tZSBuZXR3b3JrcyBRLjkyMiBhZGRyZXNzZXMKLSAgICAgICAgICAgICBtYXkgb3B0aW9uYWxseSBiZSBpbmNyZWFzZWQgdG8gdGhyZWUgb3IgZm91ciBvY3RldHMuCi0qLwotCi1zdGF0aWMgdV9pbnQKLWZyX2hkcmxlbihjb25zdCB1X2NoYXIgKnAsIHVfaW50IGFkZHJfbGVuKQotewotCWlmICghcFthZGRyX2xlbiArIDFdIC8qIHBhZCBleGlzdCAqLykKLQkJcmV0dXJuIGFkZHJfbGVuICsgMSAvKiBVSSAqLyArIDEgLyogcGFkICovICsgMSAvKiBOTFBJRCAqLzsKLQllbHNlIAotCQlyZXR1cm4gYWRkcl9sZW4gKyAxIC8qIFVJICovICsgMSAvKiBOTFBJRCAqLzsKLX0KLQotc3RhdGljIHZvaWQKLWZyX2hkcl9wcmludChpbnQgbGVuZ3RoLCB1X2ludCBhZGRyX2xlbiwgdV9pbnQgZGxjaSwgdV9pbnQ4X3QgKmZsYWdzLCB1X2ludDE2X3QgbmxwaWQpCi17Ci0gICAgaWYgKHFmbGFnKSB7Ci0gICAgICAgICh2b2lkKXByaW50ZigiUS45MjIsIERMQ0kgJXUsIGxlbmd0aCAldTogIiwKLSAgICAgICAgICAgICAgICAgICAgIGRsY2ksCi0gICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChubHBpZCA8PSAweGZmKSAvKiBpZiBpdHMgc21hbGxlciB0aGFuIDI1NiB0aGVuIGl0cyBhIE5MUElEICovCi0gICAgICAgICAgICAodm9pZClwcmludGYoIlEuOTIyLCBoZHItbGVuICV1LCBETENJICV1LCBGbGFncyBbJXNdLCBOTFBJRCAlcyAoMHglMDJ4KSwgbGVuZ3RoICV1OiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRsY2ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihmcl9oZWFkZXJfZmxhZ192YWx1ZXMsICJub25lIiwgRVhUUkFDVF8zMkJJVFMoZmxhZ3MpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKG5scGlkX3ZhbHVlcywidW5rbm93biIsIG5scGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBubHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICBlbHNlIC8qIG11c3QgYmUgYW4gZXRoZXJ0eXBlICovCi0gICAgICAgICAgICAodm9pZClwcmludGYoIlEuOTIyLCBoZHItbGVuICV1LCBETENJICV1LCBGbGFncyBbJXNdLCBjaXNjby1ldGhlcnR5cGUgJXMgKDB4JTA0eCksIGxlbmd0aCAldTogIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkbGNpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoZnJfaGVhZGVyX2ZsYWdfdmFsdWVzLCAibm9uZSIsIEVYVFJBQ1RfMzJCSVRTKGZsYWdzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCAidW5rbm93biIsIG5scGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBubHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOyAgICAgICAgCi0gICAgfQotfQotCi11X2ludAotZnJfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQotICAgICAgICBUQ0hFQ0syKCpwLCA0KTsgLyogbWluaW11bSBmcmFtZSBoZWFkZXIgbGVuZ3RoICovCi0KLSAgICAgICAgaWYgKChsZW5ndGggPSBmcl9wcmludChwLCBsZW5ndGgpKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKLSB0cnVuYzoKLSAgICAgICAgcHJpbnRmKCJbfGZyXSIpOwotICAgICAgICByZXR1cm4gY2FwbGVuOwotfQotCi11X2ludAotZnJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQxNl90IGV4dHJhY3RlZF9ldGhlcnR5cGU7Ci0JdV9pbnQgZGxjaTsKLSAgICAgICAgdV9pbnQgc2RsY29yZTsKLQl1X2ludCBhZGRyX2xlbjsKLQl1X2ludDE2X3QgbmxwaWQ7Ci0JdV9pbnQgaGRyX2xlbjsKLQl1X2ludDhfdCBmbGFnc1s0XTsKLQotCWlmIChwYXJzZV9xOTIyX2FkZHIocCwgJmRsY2ksICZzZGxjb3JlLCAmYWRkcl9sZW4sIGZsYWdzKSkgewotCQlwcmludGYoIlEuOTIyLCBpbnZhbGlkIGFkZHJlc3MiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0gICAgICAgIFRDSEVDSzIoKnAsYWRkcl9sZW4rMSsxKTsKLQloZHJfbGVuID0gZnJfaGRybGVuKHAsIGFkZHJfbGVuKTsKLSAgICAgICAgVENIRUNLMigqcCxoZHJfbGVuKTsKLQotCWlmIChwW2FkZHJfbGVuXSAhPSAweDAzICYmIGRsY2kgIT0gMCkgewotCi0gICAgICAgICAgICAgICAgLyogbGV0cyBmaWd1cmUgb3V0IGlmIHdlIGhhdmUgY2lzY28gc3R5bGUgZW5jYXBzdWxhdGlvbjogKi8KLSAgICAgICAgICAgICAgICBleHRyYWN0ZWRfZXRoZXJ0eXBlID0gRVhUUkFDVF8xNkJJVFMocCthZGRyX2xlbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICAgICAgICAgIGZyX2hkcl9wcmludChsZW5ndGgsIGFkZHJfbGVuLCBkbGNpLCBmbGFncywgZXh0cmFjdGVkX2V0aGVydHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoZXRoZXJfZW5jYXBfcHJpbnQoZXh0cmFjdGVkX2V0aGVydHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCthZGRyX2xlbitFVEhFUlRZUEVfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgtYWRkcl9sZW4tRVRIRVJUWVBFX0xFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLWFkZHJfbGVuLUVUSEVSVFlQRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJvYmFibHkgaXQgd2Fzbid0IG9uZSAqLwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlVJICUwMnghICIsIHBbYWRkcl9sZW5dKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBoZHJfbGVuOwotICAgICAgICB9Ci0KLQlpZiAoIXBbYWRkcl9sZW4gKyAxXSkgewkvKiBwYWQgYnl0ZSBzaG91bGQgYmUgdXNlZCB3aXRoIDMtYnl0ZSBRLjkyMiAqLwotCQlpZiAoYWRkcl9sZW4gIT0gMykKLQkJCXByaW50ZigiUGFkISAiKTsKLQl9IGVsc2UgaWYgKGFkZHJfbGVuID09IDMpCi0JCXByaW50ZigiTm8gcGFkISAiKTsKLQotCW5scGlkID0gcFtoZHJfbGVuIC0gMV07Ci0KLQlpZiAoZWZsYWcpCi0JCWZyX2hkcl9wcmludChsZW5ndGgsIGFkZHJfbGVuLCBkbGNpLCBmbGFncywgbmxwaWQpOwotCXAgKz0gaGRyX2xlbjsKLQlsZW5ndGggLT0gaGRyX2xlbjsKLQotCXN3aXRjaCAobmxwaWQpIHsKLQljYXNlIE5MUElEX0lQOgotCSAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBJTkVUNgotCWNhc2UgTkxQSURfSVA2OgotCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIE5MUElEX0NMTlA6Ci0JY2FzZSBOTFBJRF9FU0lTOgotCWNhc2UgTkxQSURfSVNJUzoKLSAgICAgICAgICAgICAgICBpc29jbG5zX3ByaW50KHAtMSwgbGVuZ3RoKzEsIGxlbmd0aCsxKTsgLyogT1NJIHByaW50ZXJzIG5lZWQgdGhlIE5MUElEIGZpZWxkICovCi0JCWJyZWFrOwotCi0JY2FzZSBOTFBJRF9TTkFQOgotCQlpZiAoc25hcF9wcmludChwLCBsZW5ndGgsIGxlbmd0aCwgJmV4dHJhY3RlZF9ldGhlcnR5cGUsIDApID09IDApIHsKLQkJCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVmbGFnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyX2hkcl9wcmludChsZW5ndGggKyBoZHJfbGVuLCBoZHJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGNpLCBmbGFncywgbmxwaWQpOwotCQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJpbnQocCAtIGhkcl9sZW4sIGxlbmd0aCArIGhkcl9sZW4pOwotCQl9Ci0JCWJyZWFrOwotCi0gICAgICAgIGNhc2UgTkxQSURfUTkzMzoKLQkJcTkzM19wcmludChwLCBsZW5ndGgpOwotCQlicmVhazsKLQotICAgICAgICBjYXNlIE5MUElEX01GUjoKLSAgICAgICAgICAgICAgICBmcmYxNV9wcmludChwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTkxQSURfUFBQOgotICAgICAgICAgICAgICAgIHBwcF9wcmludChwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkJaWYgKCFlZmxhZykKLSAgICAgICAgICAgICAgICAgICAgZnJfaGRyX3ByaW50KGxlbmd0aCArIGhkcl9sZW4sIGFkZHJfbGVuLAotCQkJCSAgICAgZGxjaSwgZmxhZ3MsIG5scGlkKTsKLQkJaWYgKCF4ZmxhZykKLQkJCWRlZmF1bHRfcHJpbnQocCwgbGVuZ3RoKTsKLQl9Ci0KLQlyZXR1cm4gaGRyX2xlbjsKLQotIHRydW5jOgotICAgICAgICBwcmludGYoIlt8ZnJdIik7Ci0gICAgICAgIHJldHVybiAwOwotCi19Ci0KLXVfaW50Ci1tZnJfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXJlZ2lzdGVyIHVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQotICAgICAgICBUQ0hFQ0syKCpwLCAyKTsgLyogbWluaW11bSBmcmFtZSBoZWFkZXIgbGVuZ3RoICovCi0KLSAgICAgICAgaWYgKChsZW5ndGggPSBtZnJfcHJpbnQocCwgbGVuZ3RoKSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBsZW5ndGg7Ci0gdHJ1bmM6Ci0gICAgICAgIHByaW50ZigiW3xtZnJdIik7Ci0gICAgICAgIHJldHVybiBjYXBsZW47Ci19Ci0KLQotI2RlZmluZSBNRlJfQ1RSTF9NU0dfQUREX0xJTksgICAgICAgIDEKLSNkZWZpbmUgTUZSX0NUUkxfTVNHX0FERF9MSU5LX0FDSyAgICAyCi0jZGVmaW5lIE1GUl9DVFJMX01TR19BRERfTElOS19SRUogICAgMwotI2RlZmluZSBNRlJfQ1RSTF9NU0dfSEVMTE8gICAgICAgICAgIDQKLSNkZWZpbmUgTUZSX0NUUkxfTVNHX0hFTExPX0FDSyAgICAgICA1Ci0jZGVmaW5lIE1GUl9DVFJMX01TR19SRU1PVkVfTElOSyAgICAgNgotI2RlZmluZSBNRlJfQ1RSTF9NU0dfUkVNT1ZFX0xJTktfQUNLIDcKLQotc3RydWN0IHRvayBtZnJfY3RybF9tc2dfdmFsdWVzW10gPSB7Ci0gICAgeyBNRlJfQ1RSTF9NU0dfQUREX0xJTkssICJBZGQgTGluayIgfSwKLSAgICB7IE1GUl9DVFJMX01TR19BRERfTElOS19BQ0ssICJBZGQgTGluayBBQ0siIH0sCi0gICAgeyBNRlJfQ1RSTF9NU0dfQUREX0xJTktfUkVKLCAiQWRkIExpbmsgUmVqZWN0IiB9LAotICAgIHsgTUZSX0NUUkxfTVNHX0hFTExPLCAiSGVsbG8iIH0sCi0gICAgeyBNRlJfQ1RSTF9NU0dfSEVMTE9fQUNLLCAiSGVsbG8gQUNLIiB9LAotICAgIHsgTUZSX0NUUkxfTVNHX1JFTU9WRV9MSU5LLCAiUmVtb3ZlIExpbmsiIH0sCi0gICAgeyBNRlJfQ1RSTF9NU0dfUkVNT1ZFX0xJTktfQUNLLCAiUmVtb3ZlIExpbmsgQUNLIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0jZGVmaW5lIE1GUl9DVFJMX0lFX0JVTkRMRV9JRCAgMQotI2RlZmluZSBNRlJfQ1RSTF9JRV9MSU5LX0lEICAgIDIKLSNkZWZpbmUgTUZSX0NUUkxfSUVfTUFHSUNfTlVNICAzCi0jZGVmaW5lIE1GUl9DVFJMX0lFX1RJTUVTVEFNUCAgNQotI2RlZmluZSBNRlJfQ1RSTF9JRV9WRU5ET1JfRVhUIDYKLSNkZWZpbmUgTUZSX0NUUkxfSUVfQ0FVU0UgICAgICA3Ci0KLXN0cnVjdCB0b2sgbWZyX2N0cmxfaWVfdmFsdWVzW10gPSB7Ci0gICAgeyBNRlJfQ1RSTF9JRV9CVU5ETEVfSUQsICJCdW5kbGUgSUQifSwKLSAgICB7IE1GUl9DVFJMX0lFX0xJTktfSUQsICJMaW5rIElEIn0sCi0gICAgeyBNRlJfQ1RSTF9JRV9NQUdJQ19OVU0sICJNYWdpYyBOdW1iZXIifSwKLSAgICB7IE1GUl9DVFJMX0lFX1RJTUVTVEFNUCwgIlRpbWVzdGFtcCJ9LAotICAgIHsgTUZSX0NUUkxfSUVfVkVORE9SX0VYVCwgIlZlbmRvciBFeHRlbnNpb24ifSwKLSAgICB7IE1GUl9DVFJMX0lFX0NBVVNFLCAiQ2F1c2UifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotI2RlZmluZSBNRlJfSURfU1RSSU5HX01BWExFTiA1MAotCi1zdHJ1Y3QgaWVfdGx2X2hlYWRlcl90IHsKLSAgICB1X2ludDhfdCBpZV90eXBlOwotICAgIHVfaW50OF90IGllX2xlbjsKLX07Ci0KLXVfaW50Ci1tZnJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpCi17Ci0gICAgdV9pbnQgdGxlbixpZHgsaGRyX2xlbiA9IDA7Ci0gICAgdV9pbnQxNl90IHNlcXVlbmNlX251bTsKLSAgICB1X2ludDhfdCBpZV90eXBlLGllX2xlbjsKLSAgICBjb25zdCB1X2ludDhfdCAqdHB0cjsKLQotCi0vKgotICogRlJGLjE2IExpbmsgSW50ZWdyaXR5IENvbnRyb2wgRnJhbWUKLSAqIAotICogICAgICA3ICAgIDYgICAgNSAgICA0ICAgIDMgICAgMiAgICAxICAgIDAKLSAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCi0gKiAgICB8IEIgIHwgRSAgfCBDPTF8IDAgICAgMCAgICAwICAgIDAgIHwgRUEgfAotICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKLSAqICAgIHwgMCAgICAwICAgIDAgICAgMCAgICAwICAgIDAgICAgMCAgICAwICB8Ci0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICogICAgfCAgICAgICAgICAgICAgbWVzc2FnZSB0eXBlICAgICAgICAgICAgIHwKLSAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCi0gKi8KLQotICAgIFRDSEVDSzIoKnAsIDQpOyAvKiBtaW5pbXVtIGZyYW1lIGhlYWRlciBsZW5ndGggKi8KLQotICAgIGlmICgocFswXSAmIE1GUl9CRUNfTUFTSykgPT0gTUZSX0NUUkxfRlJBTUUgJiYgcFsxXSA9PSAwKSB7Ci0gICAgICAgIHByaW50ZigiRlJGLjE2IENvbnRyb2wsIEZsYWdzIFslc10sICVzLCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgYml0dG9rMnN0cihmcmZfZmxhZ192YWx1ZXMsIm5vbmUiLChwWzBdICYgTUZSX0JFQ19NQVNLKSksCi0gICAgICAgICAgICAgICB0b2syc3RyKG1mcl9jdHJsX21zZ192YWx1ZXMsIlVua25vd24gTWVzc2FnZSAoMHglMDJ4KSIscFsyXSksCi0gICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICB0cHRyID0gcCArIDM7Ci0gICAgICAgIHRsZW4gPSBsZW5ndGggLTM7Ci0gICAgICAgIGhkcl9sZW4gPSAzOwotCi0gICAgICAgIGlmICghdmZsYWcpCi0gICAgICAgICAgICByZXR1cm4gaGRyX2xlbjsKLQotICAgICAgICB3aGlsZSAodGxlbj5zaXplb2Yoc3RydWN0IGllX3Rsdl9oZWFkZXJfdCkpIHsKLSAgICAgICAgICAgIFRDSEVDSzIoKnRwdHIsIHNpemVvZihzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90KSk7Ci0gICAgICAgICAgICBpZV90eXBlPXRwdHJbMF07Ci0gICAgICAgICAgICBpZV9sZW49dHB0clsxXTsKLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0SUUgJXMgKCV1KSwgbGVuZ3RoICV1OiAiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIobWZyX2N0cmxfaWVfdmFsdWVzLCJVbmtub3duIixpZV90eXBlKSwKLSAgICAgICAgICAgICAgICAgICBpZV90eXBlLAotICAgICAgICAgICAgICAgICAgIGllX2xlbik7Ci0KLSAgICAgICAgICAgIC8qIGluZmluaXRlIGxvb3AgY2hlY2sgKi8KLSAgICAgICAgICAgIGlmIChpZV90eXBlID09IDAgfHwgaWVfbGVuIDw9IHNpemVvZihzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaGRyX2xlbjsKLQotICAgICAgICAgICAgVENIRUNLMigqdHB0cixpZV9sZW4pOwotICAgICAgICAgICAgdHB0cis9c2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QpOwotICAgICAgICAgICAgLyogdGx2IGxlbiBpbmNsdWRlcyBoZWFkZXIgKi8KLSAgICAgICAgICAgIGllX2xlbi09c2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QpOwotICAgICAgICAgICAgdGxlbi09c2l6ZW9mKHN0cnVjdCBpZV90bHZfaGVhZGVyX3QpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGllX3R5cGUpIHsKLQotICAgICAgICAgICAgY2FzZSBNRlJfQ1RSTF9JRV9NQUdJQ19OVU06Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgiLEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBNRlJfQ1RSTF9JRV9CVU5ETEVfSUQ6IC8qIHNhbWUgbWVzc2FnZSBmb3JtYXQgKi8KLSAgICAgICAgICAgIGNhc2UgTUZSX0NUUkxfSUVfTElOS19JRDoKLSAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGllX2xlbiAmJiBpZHggPCBNRlJfSURfU1RSSU5HX01BWExFTjsgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCoodHB0citpZHgpICE9IDApIC8qIGRvbid0IHByaW50IG51bGwgdGVybWluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVwdXRjaGFyKCoodHB0citpZHgpKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIE1GUl9DVFJMX0lFX1RJTUVTVEFNUDoKLSAgICAgICAgICAgICAgICBpZiAoaWVfbGVuID09IHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHNfcHJpbnQoKGNvbnN0IHN0cnVjdCB0aW1ldmFsICopdHB0cik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggYW5kIGhleGR1bXAgaWYgbm8gdW5peCB0aW1lc3RhbXAgKi8KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRklYTUUgdGhvc2UgYXJlIHRoZSBkZWZpbmVkIElFcyB0aGF0IGxhY2sgYSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgICogeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKLSAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgY2FzZSBNRlJfQ1RSTF9JRV9WRU5ET1JfRVhUOgotICAgICAgICAgICAgY2FzZSBNRlJfQ1RSTF9JRV9DQVVTRToKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICIsaWVfbGVuKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYSBoZXhkdW1wIG9mIHRoZSBJRSA/ICovCi0gICAgICAgICAgICBpZiAodmZsYWcgPiAxICkKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgIixpZV9sZW4pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICB0bGVuLT1pZV9sZW47Ci0gICAgICAgICAgICB0cHRyKz1pZV9sZW47Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhkcl9sZW47Ci0gICAgfQotLyoKLSAqIEZSRi4xNiBGcmFnbWVudGF0aW9uIEZyYW1lCi0gKiAKLSAqICAgICAgNyAgICA2ICAgIDUgICAgNCAgICAzICAgIDIgICAgMSAgICAwCi0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICogICAgfCBCICB8IEUgIHwgQz0wfHNlcS4gKGhpZ2ggNCBiaXRzKSB8IEVBICB8Ci0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICogICAgfCAgICAgICAgc2VxdWVuY2UgIChsb3cgOCBiaXRzKSAgICAgICAgIHwKLSAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCi0gKiAgICB8ICAgICAgICBETENJICg2IGJpdHMpICAgICAgICB8IENSIHwgRUEgIHwKLSAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCi0gKiAgICB8ICAgRExDSSAoNCBiaXRzKSAgIHxGRUNOfEJFQ058IERFIHwgRUEgfAotICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKLSAqLwotCi0gICAgc2VxdWVuY2VfbnVtID0gKHBbMF0mMHgxZSk8PDcgfCBwWzFdOwotICAgIC8qIHdob2xlIHBhY2tldCBvciBmaXJzdCBmcmFnbWVudCA/ICovCi0gICAgaWYgKChwWzBdICYgTUZSX0JFQ19NQVNLKSA9PSBNRlJfRlJBR19GUkFNRSB8fAotICAgICAgICAocFswXSAmIE1GUl9CRUNfTUFTSykgPT0gTUZSX0JfQklUKSB7Ci0gICAgICAgIHByaW50ZigiRlJGLjE2IEZyYWcsIHNlcSAldSwgRmxhZ3MgWyVzXSwgIiwKLSAgICAgICAgICAgICAgIHNlcXVlbmNlX251bSwKLSAgICAgICAgICAgICAgIGJpdHRvazJzdHIoZnJmX2ZsYWdfdmFsdWVzLCJub25lIiwocFswXSAmIE1GUl9CRUNfTUFTSykpKTsKLSAgICAgICAgaGRyX2xlbiA9IDI7Ci0gICAgICAgIGZyX3ByaW50KHAraGRyX2xlbixsZW5ndGgtaGRyX2xlbik7Ci0gICAgICAgIHJldHVybiBoZHJfbGVuOwotICAgIH0KLQotICAgIC8qIG11c3QgYmUgYSBtaWRkbGUgb3IgdGhlIGxhc3QgZnJhZ21lbnQgKi8KLSAgICBwcmludGYoIkZSRi4xNiBGcmFnLCBzZXEgJXUsIEZsYWdzIFslc10iLAotICAgICAgICAgICBzZXF1ZW5jZV9udW0sCi0gICAgICAgICAgIGJpdHRvazJzdHIoZnJmX2ZsYWdfdmFsdWVzLCJub25lIiwocFswXSAmIE1GUl9CRUNfTUFTSykpKTsKLSAgICBwcmludF91bmtub3duX2RhdGEocCwiXG5cdCIsbGVuZ3RoKTsKLQotICAgIHJldHVybiBoZHJfbGVuOwotCi0gdHJ1bmM6Ci0gICAgcHJpbnRmKCJbfG1mcl0iKTsKLSAgICByZXR1cm4gbGVuZ3RoOwotfQotCi0vKiBhbiBOTFBJRCBvZiAweGIxIGluZGljYXRlcyBhIDItYnl0ZQotICogRlJGLjE1IGhlYWRlcgotICogCi0gKiAgICAgIDcgICAgNiAgICA1ICAgIDQgICAgMyAgICAyICAgIDEgICAgMAotICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKLSAqICAgIH4gICAgICAgICAgICAgIFEuOTIyIGhlYWRlciAgICAgICAgICAgICB+Ci0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICogICAgfCAgICAgICAgICAgICBOTFBJRCAoOCBiaXRzKSAgICAgICAgICAgIHwgTkxQSUQ9MHhiMQotICogICAgKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSsKLSAqICAgIHwgQiAgfCBFICB8IEMgIHxzZXEuIChoaWdoIDQgYml0cykgfCBSICB8Ci0gKiAgICArLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKwotICogICAgfCAgICAgICAgc2VxdWVuY2UgIChsb3cgOCBiaXRzKSAgICAgICAgIHwKLSAqICAgICstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rLS0tLSstLS0tKy0tLS0rCi0gKi8KLQotI2RlZmluZSBGUl9GUkYxNV9GUkFHVFlQRSAweDAxCi0KLXN0YXRpYyB2b2lkCi1mcmYxNV9wcmludCAoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpIHsKLSAgICAKLSAgICB1X2ludDE2X3Qgc2VxdWVuY2VfbnVtLCBmbGFnczsKLQotICAgIGZsYWdzID0gcFswXSZNRlJfQkVDX01BU0s7Ci0gICAgc2VxdWVuY2VfbnVtID0gKHBbMF0mMHgxZSk8PDcgfCBwWzFdOwotCi0gICAgcHJpbnRmKCJGUkYuMTUsIHNlcSAweCUwM3gsIEZsYWdzIFslc10sJXMgRnJhZ21lbnRhdGlvbiwgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgc2VxdWVuY2VfbnVtLAotICAgICAgICAgICBiaXR0b2syc3RyKGZyZl9mbGFnX3ZhbHVlcywibm9uZSIsZmxhZ3MpLAotICAgICAgICAgICBwWzBdJkZSX0ZSRjE1X0ZSQUdUWVBFID8gIkludGVyZmFjZSIgOiAiRW5kLXRvLUVuZCIsCi0gICAgICAgICAgIGxlbmd0aCk7Ci0KLS8qIFRPRE86Ci0gKiBkZXBlbmRpbmcgb24gYWxsIHBlcm11dGF0aW9ucyBvZiB0aGUgQiwgRSBhbmQgQyBiaXQKLSAqIGRpZyBhcyBkZWVwIGFzIHdlIGNhbiAtIGUuZy4gb24gdGhlIGZpcnN0IChCKSBmcmFnbWVudAotICogdGhlcmUgaXMgZW5vdWdoIHBheWxvYWQgdG8gcHJpbnQgdGhlIElQIGhlYWRlcgotICogb24gbm9uIChCKSBmcmFnbWVudHMgaXQgZGVwZW5kcyBpZiB0aGUgZnJhZ21lbnRhdGlvbgotICogbW9kZWwgaXMgZW5kLXRvLWVuZCBvciBpbnRlcmZhY2UgYmFzZWQgd2V0aGVyIHdlIHdhbnQgdG8gcHJpbnQKLSAqIGFub3RoZXIgUS45MjIgaGVhZGVyCi0gKi8KLQotfQotCi0vKgotICogUS45MzMgZGVjb2RpbmcgcG9ydGlvbiBmb3IgZnJhbWVyZWxheSBzcGVjaWZpYy4KLSAqLwotCi0vKiBRLjkzMyBwYWNrZXQgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IG9mIE90aGVyIFByb3RvY29scyAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBRLjkzMyBOTFBJRAotICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICB8ICAgICAgICBRLjkyMiBBZGRyZXNzICAgICAgICAgIHwgCi0gICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgIHxDb250cm9sICAweDAzICB8IE5MUElEICAgMHgwOCAgfCAgICAgICAgCi0gICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgIAotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICBMMiBQcm90b2NvbCBJRCAgICAgICB8Ci0gICAgICAgICAgICAgICAgICB8IG9jdGV0IDEgICAgICAgfCAgb2N0ZXQgMiAgICAgIHwKLSAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgfCAgICAgICAgICBMMyBQcm90b2NvbCBJRCAgICAgICB8Ci0gICAgICAgICAgICAgICAgICB8IG9jdGV0IDIgICAgICAgfCAgb2N0ZXQgMiAgICAgIHwKLSAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICAgICAgICAgICAgICAgICAgfCAgICAgICAgIFByb3RvY29sIERhdGEgICAgICAgICB8Ci0gICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgICAgICAgICAgICAgIHwgRkNTICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKi8KLQotLyogTDIgKE9jdGV0IDEpLSBDYWxsIFJlZmVyZW5jZSBVc3VhbGx5IGlzIDB4MCAqLwotCi0vKgotICogTDIgKE9jdGV0IDIpLSBNZXNzYWdlIFR5cGVzIGRlZmluaXRpb24gMSBieXRlIGxvbmcuCi0gKi8KLS8qIENhbGwgRXN0YWJsaXNoICovCi0jZGVmaW5lIE1TR19UWVBFX0VTQ19UT19OQVRJT05BTCAgMHgwMAotI2RlZmluZSBNU0dfVFlQRV9BTEVSVCAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgTVNHX1RZUEVfQ0FMTF9QUk9DRUVESU5HICAweDAyCi0jZGVmaW5lIE1TR19UWVBFX0NPTk5FQ1QgICAgICAgICAgMHgwNwotI2RlZmluZSBNU0dfVFlQRV9DT05ORUNUX0FDSyAgICAgIDB4MEYKLSNkZWZpbmUgTVNHX1RZUEVfUFJPR1JFU1MgICAgICAgICAweDAzCi0jZGVmaW5lIE1TR19UWVBFX1NFVFVQICAgICAgICAgICAgMHgwNQotLyogQ2FsbCBDbGVhciAqLwotI2RlZmluZSBNU0dfVFlQRV9ESVNDT05ORUNUICAgICAgIDB4NDUKLSNkZWZpbmUgTVNHX1RZUEVfUkVMRUFTRSAgICAgICAgICAweDRECi0jZGVmaW5lIE1TR19UWVBFX1JFTEVBU0VfQ09NUExFVEUgMHg1QQotI2RlZmluZSBNU0dfVFlQRV9SRVNUQVJUICAgICAgICAgIDB4NDYKLSNkZWZpbmUgTVNHX1RZUEVfUkVTVEFSVF9BQ0sgICAgICAweDRFCi0vKiBTdGF0dXMgKi8KLSNkZWZpbmUgTVNHX1RZUEVfU1RBVFVTICAgICAgICAgICAweDdECi0jZGVmaW5lIE1TR19UWVBFX1NUQVRVU19FTlEgICAgICAgMHg3NQotCi1zdHJ1Y3QgdG9rIGZyX3E5MzNfbXNnX3ZhbHVlc1tdID0gewotICAgIHsgTVNHX1RZUEVfRVNDX1RPX05BVElPTkFMLCAiRVNDIHRvIE5hdGlvbmFsIiB9LAotICAgIHsgTVNHX1RZUEVfQUxFUlQsICJBbGVydCIgfSwKLSAgICB7IE1TR19UWVBFX0NBTExfUFJPQ0VFRElORywgIkNhbGwgcHJvY2VlZGluZyIgfSwKLSAgICB7IE1TR19UWVBFX0NPTk5FQ1QsICJDb25uZWN0IiB9LAotICAgIHsgTVNHX1RZUEVfQ09OTkVDVF9BQ0ssICJDb25uZWN0IEFDSyIgfSwKLSAgICB7IE1TR19UWVBFX1BST0dSRVNTLCAiUHJvZ3Jlc3MiIH0sCi0gICAgeyBNU0dfVFlQRV9TRVRVUCwgIlNldHVwIiB9LAotICAgIHsgTVNHX1RZUEVfRElTQ09OTkVDVCwgIkRpc2Nvbm5lY3QiIH0sCi0gICAgeyBNU0dfVFlQRV9SRUxFQVNFLCAiUmVsZWFzZSIgfSwKLSAgICB7IE1TR19UWVBFX1JFTEVBU0VfQ09NUExFVEUsICJSZWxlYXNlIENvbXBsZXRlIiB9LAotICAgIHsgTVNHX1RZUEVfUkVTVEFSVCwgIlJlc3RhcnQiIH0sCi0gICAgeyBNU0dfVFlQRV9SRVNUQVJUX0FDSywgIlJlc3RhcnQgQUNLIiB9LAotICAgIHsgTVNHX1RZUEVfU1RBVFVTLCAiU3RhdHVzIFJlcGx5IiB9LAotICAgIHsgTVNHX1RZUEVfU1RBVFVTX0VOUSwgIlN0YXR1cyBFbnF1aXJ5IiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0jZGVmaW5lIE1TR19BTlNJX0xPQ0tJTkdfU0hJRlQJMHg5NQotCi0jZGVmaW5lIEZSX0xNSV9BTlNJX1JFUE9SVF9UWVBFX0lFCTB4MDEKLSNkZWZpbmUgRlJfTE1JX0FOU0lfTElOS19WRVJJRllfSUVfOTEJMHgxOSAvKiBkZXRhaWxzPyAqLwotI2RlZmluZSBGUl9MTUlfQU5TSV9MSU5LX1ZFUklGWV9JRQkweDAzCi0jZGVmaW5lIEZSX0xNSV9BTlNJX1BWQ19TVEFUVVNfSUUJMHgwNwotCi0jZGVmaW5lIEZSX0xNSV9DQ0lUVF9SRVBPUlRfVFlQRV9JRQkweDUxCi0jZGVmaW5lIEZSX0xNSV9DQ0lUVF9MSU5LX1ZFUklGWV9JRQkweDUzCi0jZGVmaW5lIEZSX0xNSV9DQ0lUVF9QVkNfU1RBVFVTX0lFCTB4NTcKLQotc3RydWN0IHRvayBmcl9xOTMzX2llX3ZhbHVlc19jb2Rlc2V0NVtdID0gewotICAgIHsgRlJfTE1JX0FOU0lfUkVQT1JUX1RZUEVfSUUsICJBTlNJIFJlcG9ydCBUeXBlIiB9LAotICAgIHsgRlJfTE1JX0FOU0lfTElOS19WRVJJRllfSUVfOTEsICJBTlNJIExpbmsgVmVyaWZ5IiB9LAotICAgIHsgRlJfTE1JX0FOU0lfTElOS19WRVJJRllfSUUsICJBTlNJIExpbmsgVmVyaWZ5IiB9LAotICAgIHsgRlJfTE1JX0FOU0lfUFZDX1NUQVRVU19JRSwgIkFOU0kgUFZDIFN0YXR1cyIgfSwKLSAgICB7IEZSX0xNSV9DQ0lUVF9SRVBPUlRfVFlQRV9JRSwgIkNDSVRUIFJlcG9ydCBUeXBlIiB9LAotICAgIHsgRlJfTE1JX0NDSVRUX0xJTktfVkVSSUZZX0lFLCAiQ0NJVFQgTGluayBWZXJpZnkiIH0sCi0gICAgeyBGUl9MTUlfQ0NJVFRfUFZDX1NUQVRVU19JRSwgIkNDSVRUIFBWQyBTdGF0dXMiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLSNkZWZpbmUgRlJfTE1JX1JFUE9SVF9UWVBFX0lFX0ZVTExfU1RBVFVTIDAKLSNkZWZpbmUgRlJfTE1JX1JFUE9SVF9UWVBFX0lFX0xJTktfVkVSSUZZIDEKLSNkZWZpbmUgRlJfTE1JX1JFUE9SVF9UWVBFX0lFX0FTWU5DX1BWQyAgIDIKLQotc3RydWN0IHRvayBmcl9sbWlfcmVwb3J0X3R5cGVfaWVfdmFsdWVzW10gPSB7Ci0gICAgeyBGUl9MTUlfUkVQT1JUX1RZUEVfSUVfRlVMTF9TVEFUVVMsICJGdWxsIFN0YXR1cyIgfSwKLSAgICB7IEZSX0xNSV9SRVBPUlRfVFlQRV9JRV9MSU5LX1ZFUklGWSwgIkxpbmsgdmVyaWZ5IiB9LAotICAgIHsgRlJfTE1JX1JFUE9SVF9UWVBFX0lFX0FTWU5DX1BWQywgIkFzeW5jIFBWQyBTdGF0dXMiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLS8qIGFycmF5IG9mIDE2IGNvZGVwYWdlcyAtIGN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgY29kZXBhZ2UgMSw1ICovCi1zdGF0aWMgc3RydWN0IHRvayAqZnJfcTkzM19pZV9jb2Rlc2V0c1tdID0gewotICAgIE5VTEwsCi0gICAgZnJfcTkzM19pZV92YWx1ZXNfY29kZXNldDUsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgZnJfcTkzM19pZV92YWx1ZXNfY29kZXNldDUsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTAotfTsKLQotc3RhdGljIGludCBmcl9xOTMzX3ByaW50X2llX2NvZGVzZXQ1KGNvbnN0IHN0cnVjdCBpZV90bHZfaGVhZGVyX3QgICppZV9wLAotICAgIGNvbnN0IHVfY2hhciAqcCk7Ci0KLXR5cGVkZWYgaW50ICgqY29kZXNldF9wcl9mdW5jX3QpKGNvbnN0IHN0cnVjdCBpZV90bHZfaGVhZGVyX3QgICppZV9wLAotICAgIGNvbnN0IHVfY2hhciAqcCk7Ci0KLS8qIGFycmF5IG9mIDE2IGNvZGVwYWdlcyAtIGN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgY29kZXBhZ2UgMSw1ICovCi1zdGF0aWMgY29kZXNldF9wcl9mdW5jX3QgZnJfcTkzM19wcmludF9pZV9jb2Rlc2V0W10gPSB7Ci0gICAgTlVMTCwKLSAgICBmcl9xOTMzX3ByaW50X2llX2NvZGVzZXQ1LAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIGZyX3E5MzNfcHJpbnRfaWVfY29kZXNldDUsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTAotfTsKLQotdm9pZAotcTkzM19wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkKLXsKLQljb25zdCB1X2NoYXIgKnB0ZW1wID0gcDsKLQlzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90ICAqaWVfcDsKLSAgICAgICAgaW50IG9sZW47Ci0JaW50IGlzX2Fuc2kgPSAwOwotICAgICAgICB1X2ludCBjb2Rlc2V0OwotICAgICAgICB1X2ludCBpZV9pc19rbm93biA9IDA7Ci0KLQlpZiAobGVuZ3RoIDwgOSkgewkvKiBzaG9ydGVzdDogUS45MzNhIExJTksgVkVSSUZZICovCi0JCXByaW50ZigiW3xxLjkzM10iKTsKLQkJcmV0dXJuOwotCX0KLQotICAgICAgICBjb2Rlc2V0ID0gcFsyXSYweDBmOyAgIC8qIGV4dHJhY3QgdGhlIGNvZGVzZXQgKi8KLQotCWlmIChwWzJdID09IE1TR19BTlNJX0xPQ0tJTkdfU0hJRlQpCi0JCWlzX2Fuc2kgPSAxOwotICAgIAotICAgICAgICBwcmludGYoIiVzIiwgZWZsYWcgPyAiIiA6ICJRLjkzMywgIik7Ci0KLQkvKiBwcmludGluZyBvdXQgaGVhZGVyIHBhcnQgKi8KLQlwcmludGYoIiVzLCBjb2Rlc2V0ICV1IiwgaXNfYW5zaSA/ICJBTlNJIiA6ICJDQ0lUVCIsIGNvZGVzZXQpOwotCi0JaWYgKHBbMF0pCi0JCXByaW50ZigiLCBDYWxsIFJlZjogMHglMDJ4IiwgcFswXSk7Ci0KLSAgICAgICAgaWYgKHZmbGFnKQotICAgICAgICAgICAgcHJpbnRmKCIsICVzICgweCUwMngpLCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZnJfcTkzM19tc2dfdmFsdWVzLCJ1bmtub3duIG1lc3NhZ2UiLHBbMV0pLAotICAgICAgICAgICAgICAgICAgIHBbMV0sCi0gICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmKCIsICVzIiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGZyX3E5MzNfbXNnX3ZhbHVlcywidW5rbm93biBtZXNzYWdlIDB4JTAyeCIscFsxXSkpOyAgICAgICAgICAgIAotCi0gICAgICAgIG9sZW4gPSBsZW5ndGg7IC8qIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBsZW5ndGggZm9yIG5vbiB2ZXJib3NlIG1vZGUgKi8KLQotCWlmIChsZW5ndGggPCAodV9pbnQpKDIgLSBpc19hbnNpKSkgewotCQlwcmludGYoIlt8cS45MzNdIik7Ci0JCXJldHVybjsKLQl9Ci0JbGVuZ3RoIC09IDIgLSBpc19hbnNpOwotCXB0ZW1wICs9IDIgKyBpc19hbnNpOwotCQotCS8qIExvb3AgdGhyb3VnaCB0aGUgcmVzdCBvZiBJRSAqLwotCXdoaWxlIChsZW5ndGggPiBzaXplb2Yoc3RydWN0IGllX3Rsdl9oZWFkZXJfdCApKSB7Ci0JCWllX3AgPSAoc3RydWN0IGllX3Rsdl9oZWFkZXJfdCAgKilwdGVtcDsKLQkJaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90ICkgfHwKLQkJICAgIGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVfdGx2X2hlYWRlcl90ICkgKyBpZV9wLT5pZV9sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnKSAvKiBub3QgYmFyayBpZiB0aGVyZSBpcyBqdXN0IGEgdHJhaWxlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblt8cS45MzNdIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBsZW5ndGggJXUiLG9sZW4pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0JCX0KLQotICAgICAgICAgICAgICAgIC8qIGxldHMgZG8gdGhlIGZ1bGwgSUUgcGFyc2luZyBvbmx5IGluIHZlcmJvc2UgbW9kZQotICAgICAgICAgICAgICAgICAqIGhvd2V2ZXIgc29tZSBJRXMgKERMQ0kgU3RhdHVzLCBMaW5rIFZlcmlmeSkKLSAgICAgICAgICAgICAgICAgKiBhcmUgYWxzbyBpbnRlcmVzdHN0aW5nIGluIG5vbi12ZXJib3NlIG1vZGUgKi8KLSAgICAgICAgICAgICAgICBpZiAodmZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCVzIElFICgweCUwMngpLCBsZW5ndGggJXU6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGZyX3E5MzNfaWVfY29kZXNldHNbY29kZXNldF0sInVua25vd24iLGllX3AtPmllX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWVfcC0+aWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGllX3AtPmllX2xlbik7Ci0gCi0gICAgICAgICAgICAgICAgLyogc2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgaWYgKGllX3AtPmllX3R5cGUgPT0gMCB8fCBpZV9wLT5pZV9sZW4gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgaWYgKGZyX3E5MzNfcHJpbnRfaWVfY29kZXNldFtjb2Rlc2V0XSAhPSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBpZV9pc19rbm93biA9IGZyX3E5MzNfcHJpbnRfaWVfY29kZXNldFtjb2Rlc2V0XShpZV9wLCBwdGVtcCk7Ci0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodmZsYWcgPj0gMSAmJiAhaWVfaXNfa25vd24pCi0gICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwdGVtcCsyLCJcblx0IixpZV9wLT5pZV9sZW4pOwotCi0gICAgICAgICAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYSBoZXhkdW1wIG9mIHRoZSBJRSA/ICovCi0gICAgICAgICAgICAgICAgaWYgKHZmbGFnPiAxICYmIGllX2lzX2tub3duKQotICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocHRlbXArMiwiXG5cdCAgIixpZV9wLT5pZV9sZW4pOwotCi0JCWxlbmd0aCA9IGxlbmd0aCAtIGllX3AtPmllX2xlbiAtIDI7Ci0JCXB0ZW1wID0gcHRlbXAgKyBpZV9wLT5pZV9sZW4gKyAyOwotCX0KLSAgICAgICAgaWYgKCF2ZmxhZykKLSAgICAgICAgICAgIHByaW50ZigiLCBsZW5ndGggJXUiLG9sZW4pOwotfQotCi1zdGF0aWMgaW50Ci1mcl9xOTMzX3ByaW50X2llX2NvZGVzZXQ1KGNvbnN0IHN0cnVjdCBpZV90bHZfaGVhZGVyX3QgICppZV9wLCBjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgICAgIHVfaW50IGRsY2k7Ci0KLSAgICAgICAgc3dpdGNoIChpZV9wLT5pZV90eXBlKSB7Ci0KLSAgICAgICAgY2FzZSBGUl9MTUlfQU5TSV9SRVBPUlRfVFlQRV9JRTogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGNhc2UgRlJfTE1JX0NDSVRUX1JFUE9SVF9UWVBFX0lFOgotICAgICAgICAgICAgaWYgKHZmbGFnKQotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZnJfbG1pX3JlcG9ydF90eXBlX2llX3ZhbHVlcywidW5rbm93biIscFsyXSksCi0gICAgICAgICAgICAgICAgICAgICAgIHBbMl0pOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgY2FzZSBGUl9MTUlfQU5TSV9MSU5LX1ZFUklGWV9JRTogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGNhc2UgRlJfTE1JX0NDSVRUX0xJTktfVkVSSUZZX0lFOgotICAgICAgICBjYXNlIEZSX0xNSV9BTlNJX0xJTktfVkVSSUZZX0lFXzkxOgotICAgICAgICAgICAgaWYgKCF2ZmxhZykKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgIik7Ci0gICAgICAgICAgICBwcmludGYoIlRYIFNlcTogJTNkLCBSWCBTZXE6ICUzZCIsIHBbMl0sIHBbM10pOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgY2FzZSBGUl9MTUlfQU5TSV9QVkNfU1RBVFVTX0lFOiAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgY2FzZSBGUl9MTUlfQ0NJVFRfUFZDX1NUQVRVU19JRToKLSAgICAgICAgICAgIGlmICghdmZsYWcpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIsICIpOwotICAgICAgICAgICAgLyogbm93IHBhcnNlIHRoZSBETENJIGluZm9ybWF0aW9uIGVsZW1lbnQuICovICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgoaWVfcC0+aWVfbGVuIDwgMykgfHwKLSAgICAgICAgICAgICAgICAocFsyXSAmIDB4ODApIHx8Ci0gICAgICAgICAgICAgICAgKChpZV9wLT5pZV9sZW4gPT0gMykgJiYgIShwWzNdICYgMHg4MCkpIHx8Ci0gICAgICAgICAgICAgICAgKChpZV9wLT5pZV9sZW4gPT0gNCkgJiYgKChwWzNdICYgMHg4MCkgfHwgIShwWzRdICYgMHg4MCkpKSB8fAotICAgICAgICAgICAgICAgICgoaWVfcC0+aWVfbGVuID09IDUpICYmICgocFszXSAmIDB4ODApIHx8IChwWzRdICYgMHg4MCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShwWzVdICYgMHg4MCkpKSB8fAotICAgICAgICAgICAgICAgIChpZV9wLT5pZV9sZW4gPiA1KSB8fAotICAgICAgICAgICAgICAgICEocFtpZV9wLT5pZV9sZW4gKyAxXSAmIDB4ODApKQotICAgICAgICAgICAgICAgIHByaW50ZigiSW52YWxpZCBETENJIElFIik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgZGxjaSA9ICgocFsyXSAmIDB4M0YpIDw8IDQpIHwgKChwWzNdICYgMHg3OCkgPj4gMyk7Ci0gICAgICAgICAgICBpZiAoaWVfcC0+aWVfbGVuID09IDQpCi0gICAgICAgICAgICAgICAgZGxjaSA9IChkbGNpIDw8IDYpIHwgKChwWzRdICYgMHg3RSkgPj4gMSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChpZV9wLT5pZV9sZW4gPT0gNSkKLSAgICAgICAgICAgICAgICBkbGNpID0gKGRsY2kgPDwgMTMpIHwgKHBbNF0gJiAweDdGKSB8ICgocFs1XSAmIDB4N0UpID4+IDEpOwotCi0gICAgICAgICAgICBwcmludGYoIkRMQ0kgJXU6IHN0YXR1cyAlcyVzIiwgZGxjaSwKLSAgICAgICAgICAgICAgICAgICAgcFtpZV9wLT5pZV9sZW4gKyAxXSAmIDB4OCA/ICJOZXcsICIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgcFtpZV9wLT5pZV9sZW4gKyAxXSAmIDB4MiA/ICJBY3RpdmUiIDogIkluYWN0aXZlIik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9wcmludC1mcmFnNi5jIGIvcHJpbnQtZnJhZzYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3Nzg4Yi4uMDAwMDAwMAotLS0gYS9wcmludC1mcmFnNi5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NAotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWZyYWc2LmMsdiAxLjE5LjIuMSAyMDA1LzA0LzIwIDIyOjMzOjIxIGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSU5FVDYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaXA2LmgiCi0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi1pbnQKLWZyYWc2X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAyKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcDZfZnJhZyAqZHA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKLQotCWRwID0gKGNvbnN0IHN0cnVjdCBpcDZfZnJhZyAqKWJwOwotCWlwNiA9IChjb25zdCBzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKLQotCVRDSEVDSyhkcC0+aXA2Zl9vZmZsZyk7Ci0KLQlpZiAodmZsYWcpIHsKLQkJcHJpbnRmKCJmcmFnICgweCUwOHg6JWR8JWxkKSIsCi0JCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHAtPmlwNmZfaWRlbnQpLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJmRwLT5pcDZmX29mZmxnKSAmIElQNkZfT0ZGX01BU0ssCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGlwNl9oZHIpICsgRVhUUkFDVF8xNkJJVFMoJmlwNi0+aXA2X3BsZW4pIC0KLQkJCSAgICAgICAobG9uZykoYnAgLSBicDIpIC0gc2l6ZW9mKHN0cnVjdCBpcDZfZnJhZykpOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiZnJhZyAoJWR8JWxkKSIsCi0JCSAgICAgICBFWFRSQUNUXzE2QklUUygmZHAtPmlwNmZfb2ZmbGcpICYgSVA2Rl9PRkZfTUFTSywKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXA2X2hkcikgKyBFWFRSQUNUXzE2QklUUygmaXA2LT5pcDZfcGxlbikgLQotCQkJICAgICAgIChsb25nKShicCAtIGJwMikgLSBzaXplb2Yoc3RydWN0IGlwNl9mcmFnKSk7Ci0JfQotCi0jaWYgMQotCS8qIGl0IGlzIG1lYW5pbmdsZXNzIHRvIGRlY29kZSBub24tZmlyc3QgZnJhZ21lbnQgKi8KLQlpZiAoKEVYVFJBQ1RfMTZCSVRTKCZkcC0+aXA2Zl9vZmZsZykgJiBJUDZGX09GRl9NQVNLKSAhPSAwKQotCQlyZXR1cm4gLTE7Ci0JZWxzZQotI2VuZGlmCi0JewotCQlmcHV0cygiICIsIHN0ZG91dCk7Ci0JCXJldHVybiBzaXplb2Yoc3RydWN0IGlwNl9mcmFnKTsKLQl9Ci10cnVuYzoKLQlmcHV0cygiW3xmcmFnXSIsIHN0ZG91dCk7Ci0JcmV0dXJuIC0xOwotI3VuZGVmIFRDSEVDSwotfQotI2VuZGlmIC8qIElORVQ2ICovCmRpZmYgLS1naXQgYS9wcmludC1ncmUuYyBiL3ByaW50LWdyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM5MzU2Li4wMDAwMDAwCi0tLSBhL3ByaW50LWdyZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qCSRPcGVuQlNEOiBwcmludC1ncmUuYyx2IDEuNiAyMDAyLzEwLzMwIDAzOjA0OjA0IGZnc2NoIEV4cCAkCSovCi0KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFzb24gTC4gV3JpZ2h0IChqYXNvbkB0aG91Z2h0Lm5ldCkKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSmFzb24gTC4gV3JpZ2h0Ci0gKiA0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULAotICogSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKLSAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOCi0gKiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS8qCi0gKiB0Y3BkdW1wIGZpbHRlciBmb3IgR1JFIC0gR2VuZXJpYyBSb3V0aW5nIEVuY2Fwc3VsYXRpb24KLSAqIFJGQzE3MDEgKEdSRSksIFJGQzE3MDIgKEdSRSBJUHY0KSwgYW5kIFJGQzI2MzcgKEVuaGFuY2VkIEdSRSkKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1ncmUuYyx2IDEuMjggMjAwNS8wNC8wNiAyMTozMjozOSBtY3IgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotI2luY2x1ZGUgImlwLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0KLSNkZWZpbmUJR1JFX0NQCQkweDgwMDAJCS8qIGNoZWNrc3VtIHByZXNlbnQgKi8KLSNkZWZpbmUJR1JFX1JQCQkweDQwMDAJCS8qIHJvdXRpbmcgcHJlc2VudCAqLwotI2RlZmluZQlHUkVfS1AJCTB4MjAwMAkJLyoga2V5IHByZXNlbnQgKi8KLSNkZWZpbmUJR1JFX1NQCQkweDEwMDAJCS8qIHNlcXVlbmNlIyBwcmVzZW50ICovCi0jZGVmaW5lCUdSRV9zUAkJMHgwODAwCQkvKiBzb3VyY2Ugcm91dGluZyAqLwotI2RlZmluZQlHUkVfUkVDUlMJMHgwNzAwCQkvKiByZWN1cnNpb24gY291bnQgKi8KLSNkZWZpbmUJR1JFX0FQCQkweDAwODAJCS8qIGFja25vd2xlZGdtZW50IyBwcmVzZW50ICovCi0KLXN0cnVjdCB0b2sgZ3JlX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyBHUkVfQ1AsICJjaGVja3N1bSBwcmVzZW50In0sCi0gICAgeyBHUkVfUlAsICJyb3V0aW5nIHByZXNlbnQifSwgCi0gICAgeyBHUkVfS1AsICJrZXkgcHJlc2VudCJ9LCAKLSAgICB7IEdSRV9TUCwgInNlcXVlbmNlIyBwcmVzZW50In0sIAotICAgIHsgR1JFX3NQLCAic291cmNlIHJvdXRpbmcgcHJlc2VudCJ9LAotICAgIHsgR1JFX1JFQ1JTLCAicmVjdXJzaW9uIGNvdW50In0sCi0gICAgeyBHUkVfQVAsICJhY2sgcHJlc2VudCJ9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0jZGVmaW5lCUdSRV9WRVJTX01BU0sJMHgwMDA3CQkvKiBwcm90b2NvbCB2ZXJzaW9uICovCi0KLS8qIHNvdXJjZSByb3V0ZSBlbnRyeSB0eXBlcyAqLwotI2RlZmluZQlHUkVTUkVfSVAJMHgwODAwCQkvKiBJUCAqLwotI2RlZmluZQlHUkVTUkVfQVNOCTB4ZmZmZQkJLyogQVNOICovCi0KLXZvaWQgZ3JlX3ByaW50XzAoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXZvaWQgZ3JlX3ByaW50XzEoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXZvaWQgZ3JlX3NyZV9wcmludCh1X2ludDE2X3QsIHVfaW50OF90LCB1X2ludDhfdCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXZvaWQgZ3JlX3NyZV9pcF9wcmludCh1X2ludDhfdCwgdV9pbnQ4X3QsIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci12b2lkIGdyZV9zcmVfYXNuX3ByaW50KHVfaW50OF90LCB1X2ludDhfdCwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLQotdm9pZAotZ3JlX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKLXsKLQl1X2ludCBsZW4gPSBsZW5ndGgsIHZlcnM7Ci0KLQlpZiAobGVuIDwgMikgewotCQlwcmludGYoIlt8Z3JlXSIpOwotCQlyZXR1cm47Ci0JfQotCXZlcnMgPSBFWFRSQUNUXzE2QklUUyhicCkgJiBHUkVfVkVSU19NQVNLOwotICAgICAgICBwcmludGYoIkdSRXYldSIsdmVycyk7Ci0KLSAgICAgICAgc3dpdGNoKHZlcnMpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgZ3JlX3ByaW50XzAoYnAsIGxlbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgZ3JlX3ByaW50XzEoYnAsIGxlbik7Ci0gICAgICAgICAgICBicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICAgcHJpbnRmKCIgRVJST1I6IHVua25vd24tdmVyc2lvbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQlyZXR1cm47Ci0KLX0KLQotdm9pZAotZ3JlX3ByaW50XzAoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQotewotCXVfaW50IGxlbiA9IGxlbmd0aDsKLQl1X2ludDE2X3QgZmxhZ3MsIHByb3Q7Ci0KLQlmbGFncyA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKLSAgICAgICAgaWYgKHZmbGFnKQotICAgICAgICAgICAgcHJpbnRmKCIsIEZsYWdzIFslc10iLAotICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoZ3JlX2ZsYWdfdmFsdWVzLCJub25lIixmbGFncykpOwotCi0JbGVuIC09IDI7Ci0JYnAgKz0gMjsKLQotCWlmIChsZW4gPCAyKQotCQlnb3RvIHRydW5jOwotCXByb3QgPSBFWFRSQUNUXzE2QklUUyhicCk7Ci0JbGVuIC09IDI7Ci0JYnAgKz0gMjsKLQotCWlmICgoZmxhZ3MgJiBHUkVfQ1ApIHwgKGZsYWdzICYgR1JFX1JQKSkgewotCQlpZiAobGVuIDwgMikKLQkJCWdvdG8gdHJ1bmM7Ci0JCWlmICh2ZmxhZykKLQkJCXByaW50ZigiLCBzdW0gMHgleCIsIEVYVFJBQ1RfMTZCSVRTKGJwKSk7Ci0JCWJwICs9IDI7Ci0JCWxlbiAtPSAyOwotCi0JCWlmIChsZW4gPCAyKQotCQkJZ290byB0cnVuYzsKLQkJcHJpbnRmKCIsIG9mZiAweCV4IiwgRVhUUkFDVF8xNkJJVFMoYnApKTsKLQkJYnAgKz0gMjsKLQkJbGVuIC09IDI7Ci0JfQotCi0JaWYgKGZsYWdzICYgR1JFX0tQKSB7Ci0JCWlmIChsZW4gPCA0KQotCQkJZ290byB0cnVuYzsKLQkJcHJpbnRmKCIsIGtleT0weCV4IiwgRVhUUkFDVF8zMkJJVFMoYnApKTsKLQkJYnAgKz0gNDsKLQkJbGVuIC09IDQ7Ci0JfQotCi0JaWYgKGZsYWdzICYgR1JFX1NQKSB7Ci0JCWlmIChsZW4gPCA0KQotCQkJZ290byB0cnVuYzsKLQkJcHJpbnRmKCIsIHNlcSAldSIsIEVYVFJBQ1RfMzJCSVRTKGJwKSk7Ci0JCWJwICs9IDQ7Ci0JCWxlbiAtPSA0OwotCX0KLQotCWlmIChmbGFncyAmIEdSRV9SUCkgewotCQlmb3IgKDs7KSB7Ci0JCQl1X2ludDE2X3QgYWY7Ci0JCQl1X2ludDhfdCBzcmVvZmY7Ci0JCQl1X2ludDhfdCBzcmVsZW47Ci0KLQkJCWlmIChsZW4gPCA0KQotCQkJCWdvdG8gdHJ1bmM7Ci0JCQlhZiA9IEVYVFJBQ1RfMTZCSVRTKGJwKTsKLQkJCXNyZW9mZiA9ICooYnAgKyAyKTsKLQkJCXNyZWxlbiA9ICooYnAgKyAzKTsKLQkJCWJwICs9IDQ7Ci0JCQlsZW4gLT0gNDsKLQotCQkJaWYgKGFmID09IDAgJiYgc3JlbGVuID09IDApCi0JCQkJYnJlYWs7Ci0KLQkJCWdyZV9zcmVfcHJpbnQoYWYsIHNyZW9mZiwgc3JlbGVuLCBicCwgbGVuKTsKLQotCQkJaWYgKGxlbiA8IHNyZWxlbikKLQkJCQlnb3RvIHRydW5jOwotCQkJYnAgKz0gc3JlbGVuOwotCQkJbGVuIC09IHNyZWxlbjsKLQkJfQotCX0KLQotICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIiwgcHJvdG8gJXMgKDB4JTA0eCkiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywidW5rbm93biIscHJvdCksCi0gICAgICAgICAgICAgICAgICAgcHJvdCk7Ci0KLSAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsbGVuZ3RoKTsKLQotICAgICAgICBpZiAodmZsYWcgPCAxKQotICAgICAgICAgICAgcHJpbnRmKCI6ICIpOyAvKiBwdXQgaW4gYSBjb2xvbiBhcyBwcm90b2NvbCBkZW1hcmMgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmKCJcblx0Iik7IC8qIGlmIHZlcmJvc2UgZ28gbXVsdGlsaW5lICovCi0KLQlzd2l0Y2ggKHByb3QpIHsKLQljYXNlIEVUSEVSVFlQRV9JUDoKLQkgICAgICAgIGlwX3ByaW50KGduZG8sIGJwLCBsZW4pOwotCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCWNhc2UgRVRIRVJUWVBFX0lQVjY6Ci0JCWlwNl9wcmludChicCwgbGVuKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEVUSEVSVFlQRV9NUExTOgotCQltcGxzX3ByaW50KGJwLCBsZW4pOwotCQlicmVhazsKLQljYXNlIEVUSEVSVFlQRV9JUFg6Ci0JCWlweF9wcmludChicCwgbGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBFVEhFUlRZUEVfQVRBTEs6Ci0JCWF0YWxrX3ByaW50KGJwLCBsZW4pOwotCQlicmVhazsKLQljYXNlIEVUSEVSVFlQRV9HUkVfSVNPOgotCQlpc29jbG5zX3ByaW50KGJwLCBsZW4sIGxlbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiZ3JlLXByb3RvLTB4JXgiLCBwcm90KTsKLQl9Ci0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIlt8Z3JlXSIpOwotfQotCi12b2lkCi1ncmVfcHJpbnRfMShjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQgbGVuID0gbGVuZ3RoOwotCXVfaW50MTZfdCBmbGFncywgcHJvdDsKLQotCWZsYWdzID0gRVhUUkFDVF8xNkJJVFMoYnApOwotCWxlbiAtPSAyOwotCWJwICs9IDI7Ci0KLQlpZiAodmZsYWcpCi0gICAgICAgICAgICBwcmludGYoIiwgRmxhZ3MgWyVzXSIsCi0gICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihncmVfZmxhZ192YWx1ZXMsIm5vbmUiLGZsYWdzKSk7Ci0KLQlpZiAobGVuIDwgMikKLQkJZ290byB0cnVuYzsKLQlwcm90ID0gRVhUUkFDVF8xNkJJVFMoYnApOwotCWxlbiAtPSAyOwotCWJwICs9IDI7Ci0KLQotCWlmIChmbGFncyAmIEdSRV9LUCkgewotCQl1X2ludDMyX3QgazsKLQotCQlpZiAobGVuIDwgNCkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWsgPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCXByaW50ZigiLCBjYWxsICVkIiwgayAmIDB4ZmZmZik7Ci0JCWxlbiAtPSA0OwotCQlicCArPSA0OwotCX0KLQotCWlmIChmbGFncyAmIEdSRV9TUCkgewotCQlpZiAobGVuIDwgNCkKLQkJCWdvdG8gdHJ1bmM7Ci0JCXByaW50ZigiLCBzZXEgJXUiLCBFWFRSQUNUXzMyQklUUyhicCkpOwotCQlicCArPSA0OwotCQlsZW4gLT0gNDsKLQl9Ci0KLQlpZiAoZmxhZ3MgJiBHUkVfQVApIHsKLQkJaWYgKGxlbiA8IDQpCi0JCQlnb3RvIHRydW5jOwotCQlwcmludGYoIiwgYWNrICV1IiwgRVhUUkFDVF8zMkJJVFMoYnApKTsKLQkJYnAgKz0gNDsKLQkJbGVuIC09IDQ7Ci0JfQotCi0JaWYgKChmbGFncyAmIEdSRV9TUCkgPT0gMCkKLQkJcHJpbnRmKCIsIG5vLXBheWxvYWQiKTsKLQotICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIiwgcHJvdG8gJXMgKDB4JTA0eCkiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywidW5rbm93biIscHJvdCksCi0gICAgICAgICAgICAgICAgICAgcHJvdCk7Ci0KLSAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsbGVuZ3RoKTsKLQotICAgICAgICBpZiAoKGZsYWdzICYgR1JFX1NQKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmICh2ZmxhZyA8IDEpCi0gICAgICAgICAgICBwcmludGYoIjogIik7IC8qIHB1dCBpbiBhIGNvbG9uIGFzIHByb3RvY29sIGRlbWFyYyAqLwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoIlxuXHQiKTsgLyogaWYgdmVyYm9zZSBnbyBtdWx0aWxpbmUgKi8KLQotCXN3aXRjaCAocHJvdCkgewotCWNhc2UgRVRIRVJUWVBFX1BQUDoKLSAgICAgICAgICAgICAgICBwcHBfcHJpbnQoYnAsIGxlbik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiZ3JlLXByb3RvLTB4JXgiLCBwcm90KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfGdyZV0iKTsKLX0KLQotdm9pZAotZ3JlX3NyZV9wcmludCh1X2ludDE2X3QgYWYsIHVfaW50OF90IHNyZW9mZiwgdV9pbnQ4X3Qgc3JlbGVuLAotICAgIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbikKLXsKLQlzd2l0Y2ggKGFmKSB7Ci0JY2FzZSBHUkVTUkVfSVA6Ci0JCXByaW50ZigiLCAocnRhZj1pcCIpOwotCQlncmVfc3JlX2lwX3ByaW50KHNyZW9mZiwgc3JlbGVuLCBicCwgbGVuKTsKLQkJcHJpbnRmKCIpICIpOwotCQlicmVhazsKLQljYXNlIEdSRVNSRV9BU046Ci0JCXByaW50ZigiLCAocnRhZj1hc24iKTsKLQkJZ3JlX3NyZV9hc25fcHJpbnQoc3Jlb2ZmLCBzcmVsZW4sIGJwLCBsZW4pOwotCQlwcmludGYoIikgIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiLCAocnRhZj0weCV4KSAiLCBhZik7Ci0JfQotfQotdm9pZAotZ3JlX3NyZV9pcF9wcmludCh1X2ludDhfdCBzcmVvZmYsIHVfaW50OF90IHNyZWxlbiwgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuKQotewotCXN0cnVjdCBpbl9hZGRyIGE7Ci0JY29uc3QgdV9jaGFyICp1cCA9IGJwOwotCi0JaWYgKHNyZW9mZiAmIDMpIHsKLQkJcHJpbnRmKCIsIGJhZG9mZnNldD0ldSIsIHNyZW9mZik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHNyZWxlbiAmIDMpIHsKLQkJcHJpbnRmKCIsIGJhZGxlbmd0aD0ldSIsIHNyZWxlbik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHNyZW9mZiA+PSBzcmVsZW4pIHsKLQkJcHJpbnRmKCIsIGJhZG9mZi9sZW49JXUvJXUiLCBzcmVvZmYsIHNyZWxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChsZW4gPCA0IHx8IHNyZWxlbiA9PSAwKQotCQkJcmV0dXJuOwotCi0JCW1lbWNweSgmYSwgYnAsIHNpemVvZihhKSk7Ci0JCXByaW50ZigiICVzJXMiLAotCQkgICAgKChicCAtIHVwKSA9PSBzcmVvZmYpID8gIioiIDogIiIsCi0JCSAgICBpbmV0X250b2EoYSkpOwotCi0JCWJwICs9IDQ7Ci0JCWxlbiAtPSA0OwotCQlzcmVsZW4gLT0gNDsKLQl9Ci19Ci0KLXZvaWQKLWdyZV9zcmVfYXNuX3ByaW50KHVfaW50OF90IHNyZW9mZiwgdV9pbnQ4X3Qgc3JlbGVuLCBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW4pCi17Ci0JY29uc3QgdV9jaGFyICp1cCA9IGJwOwotCi0JaWYgKHNyZW9mZiAmIDEpIHsKLQkJcHJpbnRmKCIsIGJhZG9mZnNldD0ldSIsIHNyZW9mZik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHNyZWxlbiAmIDEpIHsKLQkJcHJpbnRmKCIsIGJhZGxlbmd0aD0ldSIsIHNyZWxlbik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHNyZW9mZiA+PSBzcmVsZW4pIHsKLQkJcHJpbnRmKCIsIGJhZG9mZi9sZW49JXUvJXUiLCBzcmVvZmYsIHNyZWxlbik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChsZW4gPCAyIHx8IHNyZWxlbiA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXByaW50ZigiICVzJXgiLAotCQkgICAgKChicCAtIHVwKSA9PSBzcmVvZmYpID8gIioiIDogIiIsCi0JCSAgICBFWFRSQUNUXzE2QklUUyhicCkpOwotCi0JCWJwICs9IDI7Ci0JCWxlbiAtPSAyOwotCQlzcmVsZW4gLT0gMjsKLQl9Ci19CmRpZmYgLS1naXQgYS9wcmludC1oc3JwLmMgYi9wcmludC1oc3JwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjIyNDcuLjAwMDAwMDAKLS0tIGEvcHJpbnQtaHNycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgSnVsaWFuIENvd2xleQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotLyogQ2lzY28gSG90IFN0YW5kYnkgUm91dGVyIFByb3RvY29sIChIU1JQKS4gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaHNycC5jLHYgMS45LjIuMSAyMDA1LzA1LzA2IDA3OjU3OjE3IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLS8qIEhTUlAgb3AgY29kZSB0eXBlcy4gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpvcF9jb2RlX3N0cltdID0gewotCSJoZWxsbyIsCi0JImNvdXAiLAotCSJyZXNpZ24iCi19OwotCi0vKiBIU1JQIHN0YXRlcyBhbmQgYXNzb2NpYXRlZCBuYW1lcy4gKi8KLXN0YXRpYyBzdHJ1Y3QgdG9rIHN0YXRlc1tdID0gewotCXsgIDAsICJpbml0aWFsIiB9LAotCXsgIDEsICJsZWFybiIgfSwKLQl7ICAyLCAibGlzdGVuIiB9LAotCXsgIDQsICJzcGVhayIgfSwKLQl7ICA4LCAic3RhbmRieSIgfSwKLQl7IDE2LCAiYWN0aXZlIiB9LAotCXsgIDAsIE5VTEwgfQotfTsKLQotLyoKLSAqIFJGQyAyMjgxOgotICoKLSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgIFZlcnNpb24gICAgIHwgICBPcCBDb2RlICAgICB8ICAgICBTdGF0ZSAgICAgfCAgIEhlbGxvdGltZSAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgSG9sZHRpbWUgICAgfCAgIFByaW9yaXR5ICAgIHwgICAgIEdyb3VwICAgICB8ICAgUmVzZXJ2ZWQgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgQXV0aGVudGljYXRpb24gIERhdGEgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiAgRGF0YSAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWwgSVAgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotCi0jZGVmaW5lIEhTUlBfQVVUSF9TSVpFCTgKLQotLyogSFNSUCBwcm90b2NvbCBoZWFkZXIuICovCi1zdHJ1Y3QgaHNycCB7Ci0JdV9pbnQ4X3QJaHNycF92ZXJzaW9uOwotCXVfaW50OF90CWhzcnBfb3BfY29kZTsKLQl1X2ludDhfdAloc3JwX3N0YXRlOwotCXVfaW50OF90CWhzcnBfaGVsbG90aW1lOwotCXVfaW50OF90CWhzcnBfaG9sZHRpbWU7Ci0JdV9pbnQ4X3QJaHNycF9wcmlvcml0eTsKLQl1X2ludDhfdAloc3JwX2dyb3VwOwotCXVfaW50OF90CWhzcnBfcmVzZXJ2ZWQ7Ci0JdV9pbnQ4X3QJaHNycF9hdXRoZGF0YVtIU1JQX0FVVEhfU0laRV07Ci0Jc3RydWN0IGluX2FkZHIJaHNycF92aXJ0YWRkcjsKLX07Ci0KLXZvaWQKLWhzcnBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9pbnQ4X3QgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCi17Ci0Jc3RydWN0IGhzcnAgKmhwID0gKHN0cnVjdCBoc3JwICopIGJwOwotCi0JVENIRUNLKGhwLT5oc3JwX3ZlcnNpb24pOwotCXByaW50ZigiSFNSUHYlZCIsIGhwLT5oc3JwX3ZlcnNpb24pOwotCWlmIChocC0+aHNycF92ZXJzaW9uICE9IDApCi0JCXJldHVybjsKLQlUQ0hFQ0soaHAtPmhzcnBfb3BfY29kZSk7Ci0JcHJpbnRmKCItIik7Ci0JcHJpbnRmKCIlcyAiLCB0b2syc3RyYXJ5KG9wX2NvZGVfc3RyLCAidW5rbm93biAoJWQpIiwgaHAtPmhzcnBfb3BfY29kZSkpOwotCXByaW50ZigiJWQ6ICIsIGxlbik7Ci0JVENIRUNLKGhwLT5oc3JwX3N0YXRlKTsKLQlwcmludGYoInN0YXRlPSVzICIsIHRvazJzdHIoc3RhdGVzLCAiVW5rbm93biAoJWQpIiwgaHAtPmhzcnBfc3RhdGUpKTsKLQlUQ0hFQ0soaHAtPmhzcnBfZ3JvdXApOwotCXByaW50ZigiZ3JvdXA9JWQgIiwgaHAtPmhzcnBfZ3JvdXApOwotCVRDSEVDSyhocC0+aHNycF9yZXNlcnZlZCk7Ci0JaWYgKGhwLT5oc3JwX3Jlc2VydmVkICE9IDApIHsKLQkJcHJpbnRmKCJbcmVzZXJ2ZWQ9JWQhXSAiLCBocC0+aHNycF9yZXNlcnZlZCk7Ci0JfQotCVRDSEVDSyhocC0+aHNycF92aXJ0YWRkcik7Ci0JcHJpbnRmKCJhZGRyPSVzIiwgaXBhZGRyX3N0cmluZygmaHAtPmhzcnBfdmlydGFkZHIpKTsKLQlpZiAodmZsYWcpIHsKLQkJcHJpbnRmKCIgaGVsbG90aW1lPSIpOwotCQlyZWx0c19wcmludChocC0+aHNycF9oZWxsb3RpbWUpOwotCQlwcmludGYoIiBob2xkdGltZT0iKTsKLQkJcmVsdHNfcHJpbnQoaHAtPmhzcnBfaG9sZHRpbWUpOwotCQlwcmludGYoIiBwcmlvcml0eT0lZCIsIGhwLT5oc3JwX3ByaW9yaXR5KTsKLQkJcHJpbnRmKCIgYXV0aD1cIiIpOwotCQlpZiAoZm5fcHJpbnRuKGhwLT5oc3JwX2F1dGhkYXRhLCBzaXplb2YoaHAtPmhzcnBfYXV0aGRhdGEpLAotCQkgICAgc25hcGVuZCkpIHsKLQkJCXByaW50ZigiXCIiKTsKLQkJCWdvdG8gdHJ1bmM7Ci0JCX0KLQkJcHJpbnRmKCJcIiIpOwotCX0KLQlyZXR1cm47Ci10cnVuYzoKLQlwcmludGYoIlt8aHNycF0iKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWljbXAuYyBiL3ByaW50LWljbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTllODQ1OS4uMDAwMDAwMAotLS0gYS9wcmludC1pY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWljbXAuYyx2IDEuODEuMi42IDIwMDcvMDkvMTMgMTc6NDA6MTggZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCi0KLSNpbmNsdWRlICJpcC5oIgotI2luY2x1ZGUgInVkcC5oIgotI2luY2x1ZGUgImlwcHJvdG8uaCIKLSNpbmNsdWRlICJtcGxzLmgiCi0KLS8qCi0gKiBJbnRlcmZhY2UgQ29udHJvbCBNZXNzYWdlIFByb3RvY29sIERlZmluaXRpb25zLgotICogUGVyIFJGQyA3OTIsIFNlcHRlbWJlciAxOTgxLgotICovCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gaWNtcCBoZWFkZXIuCi0gKi8KLXN0cnVjdCBpY21wIHsKLQl1X2ludDhfdCAgaWNtcF90eXBlOwkJLyogdHlwZSBvZiBtZXNzYWdlLCBzZWUgYmVsb3cgKi8KLQl1X2ludDhfdCAgaWNtcF9jb2RlOwkJLyogdHlwZSBzdWIgY29kZSAqLwotCXVfaW50MTZfdCBpY21wX2Nrc3VtOwkJLyogb25lcyBjb21wbGVtZW50IGNrc3VtIG9mIHN0cnVjdCAqLwotCXVuaW9uIHsKLQkJdV9pbnQ4X3QgaWhfcHB0cjsJCQkvKiBJQ01QX1BBUkFNUFJPQiAqLwotCQlzdHJ1Y3QgaW5fYWRkciBpaF9nd2FkZHI7CS8qIElDTVBfUkVESVJFQ1QgKi8KLQkJc3RydWN0IGloX2lkc2VxIHsKLQkJCXVfaW50MTZfdCBpY2RfaWQ7Ci0JCQl1X2ludDE2X3QgaWNkX3NlcTsKLQkJfSBpaF9pZHNlcTsKLQkJdV9pbnQzMl90IGloX3ZvaWQ7Ci0JfSBpY21wX2h1bjsKLSNkZWZpbmUJaWNtcF9wcHRyCWljbXBfaHVuLmloX3BwdHIKLSNkZWZpbmUJaWNtcF9nd2FkZHIJaWNtcF9odW4uaWhfZ3dhZGRyCi0jZGVmaW5lCWljbXBfaWQJCWljbXBfaHVuLmloX2lkc2VxLmljZF9pZAotI2RlZmluZQlpY21wX3NlcQlpY21wX2h1bi5paF9pZHNlcS5pY2Rfc2VxCi0jZGVmaW5lCWljbXBfdm9pZAlpY21wX2h1bi5paF92b2lkCi0JdW5pb24gewotCQlzdHJ1Y3QgaWRfdHMgewotCQkJdV9pbnQzMl90IGl0c19vdGltZTsKLQkJCXVfaW50MzJfdCBpdHNfcnRpbWU7Ci0JCQl1X2ludDMyX3QgaXRzX3R0aW1lOwotCQl9IGlkX3RzOwotCQlzdHJ1Y3QgaWRfaXAgIHsKLQkJCXN0cnVjdCBpcCBpZGlfaXA7Ci0JCQkvKiBvcHRpb25zIGFuZCB0aGVuIDY0IGJpdHMgb2YgZGF0YSAqLwotCQl9IGlkX2lwOwotCQl1X2ludDMyX3QgaWRfbWFzazsKLQkJdV9pbnQ4X3QgaWRfZGF0YVsxXTsKLQl9IGljbXBfZHVuOwotI2RlZmluZQlpY21wX290aW1lCWljbXBfZHVuLmlkX3RzLml0c19vdGltZQotI2RlZmluZQlpY21wX3J0aW1lCWljbXBfZHVuLmlkX3RzLml0c19ydGltZQotI2RlZmluZQlpY21wX3R0aW1lCWljbXBfZHVuLmlkX3RzLml0c190dGltZQotI2RlZmluZQlpY21wX2lwCQlpY21wX2R1bi5pZF9pcC5pZGlfaXAKLSNkZWZpbmUJaWNtcF9tYXNrCWljbXBfZHVuLmlkX21hc2sKLSNkZWZpbmUJaWNtcF9kYXRhCWljbXBfZHVuLmlkX2RhdGEKLX07Ci0KLSNkZWZpbmUgSUNNUF9NUExTX0VYVF9FWFRSQUNUX1ZFUlNJT04oeCkgKCgoeCkmMHhmMCk+PjQpIAotI2RlZmluZSBJQ01QX01QTFNfRVhUX1ZFUlNJT04gMgotCi0vKgotICogTG93ZXIgYm91bmRzIG9uIHBhY2tldCBsZW5ndGhzIGZvciB2YXJpb3VzIHR5cGVzLgotICogRm9yIHRoZSBlcnJvciBhZHZpY2UgcGFja2V0cyBtdXN0IGZpcnN0IGluc3VyZSB0aGF0IHRoZQotICogcGFja2V0IGlzIGxhcmdlIGVub3VnaHQgdG8gY29udGFpbiB0aGUgcmV0dXJuZWQgaXAgaGVhZGVyLgotICogT25seSB0aGVuIGNhbiB3ZSBkbyB0aGUgY2hlY2sgdG8gc2VlIGlmIDY0IGJpdHMgb2YgcGFja2V0Ci0gKiBkYXRhIGhhdmUgYmVlbiByZXR1cm5lZCwgc2luY2Ugd2UgbmVlZCB0byBjaGVjayB0aGUgcmV0dXJuZWQKLSAqIGlwIGhlYWRlciBsZW5ndGguCi0gKi8KLSNkZWZpbmUJSUNNUF9NSU5MRU4JOAkJCQkvKiBhYnMgbWluaW11bSAqLwotI2RlZmluZSBJQ01QX0VYVERfTUlOTEVOICgxNTYgLSBzaXplb2YgKHN0cnVjdCBpcCkpICAgICAvKiBkcmFmdC1ib25pY2EtaW50ZXJuZXQtaWNtcC0wOCAqLwotI2RlZmluZQlJQ01QX1RTTEVOCSg4ICsgMyAqIHNpemVvZiAodV9pbnQzMl90KSkJLyogdGltZXN0YW1wICovCi0jZGVmaW5lCUlDTVBfTUFTS0xFTgkxMgkJCQkvKiBhZGRyZXNzIG1hc2sgKi8KLSNkZWZpbmUJSUNNUF9BRFZMRU5NSU4JKDggKyBzaXplb2YgKHN0cnVjdCBpcCkgKyA4KQkvKiBtaW4gKi8KLSNkZWZpbmUJSUNNUF9BRFZMRU4ocCkJKDggKyAoSVBfSEwoJihwKS0+aWNtcF9pcCkgPDwgMikgKyA4KQotCS8qIE4uQi46IG11c3Qgc2VwYXJhdGVseSBjaGVjayB0aGF0IGlwX2hsID49IDUgKi8KLQotLyoKLSAqIERlZmluaXRpb24gb2YgdHlwZSBhbmQgY29kZSBmaWVsZCB2YWx1ZXMuCi0gKi8KLSNkZWZpbmUJSUNNUF9FQ0hPUkVQTFkJCTAJCS8qIGVjaG8gcmVwbHkgKi8KLSNkZWZpbmUJSUNNUF9VTlJFQUNICQkzCQkvKiBkZXN0IHVucmVhY2hhYmxlLCBjb2RlczogKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVQJMAkJLyogYmFkIG5ldCAqLwotI2RlZmluZQkJSUNNUF9VTlJFQUNIX0hPU1QJMQkJLyogYmFkIGhvc3QgKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9QUk9UT0NPTAkyCQkvKiBiYWQgcHJvdG9jb2wgKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9QT1JUCTMJCS8qIGJhZCBwb3J0ICovCi0jZGVmaW5lCQlJQ01QX1VOUkVBQ0hfTkVFREZSQUcJNAkJLyogSVBfREYgY2F1c2VkIGRyb3AgKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9TUkNGQUlMCTUJCS8qIHNyYyByb3V0ZSBmYWlsZWQgKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9ORVRfVU5LTk9XTiA2CQkvKiB1bmtub3duIG5ldCAqLwotI2RlZmluZQkJSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTiA3CQkvKiB1bmtub3duIGhvc3QgKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9JU09MQVRFRAk4CQkvKiBzcmMgaG9zdCBpc29sYXRlZCAqLwotI2RlZmluZQkJSUNNUF9VTlJFQUNIX05FVF9QUk9ISUIJOQkJLyogcHJvaGliaXRlZCBhY2Nlc3MgKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9IT1NUX1BST0hJQiAxMAkJLyogZGl0dG8gKi8KLSNkZWZpbmUJCUlDTVBfVU5SRUFDSF9UT1NORVQJMTEJCS8qIGJhZCB0b3MgZm9yIG5ldCAqLwotI2RlZmluZQkJSUNNUF9VTlJFQUNIX1RPU0hPU1QJMTIJCS8qIGJhZCB0b3MgZm9yIGhvc3QgKi8KLSNkZWZpbmUJSUNNUF9TT1VSQ0VRVUVOQ0gJNAkJLyogcGFja2V0IGxvc3QsIHNsb3cgZG93biAqLwotI2RlZmluZQlJQ01QX1JFRElSRUNUCQk1CQkvKiBzaG9ydGVyIHJvdXRlLCBjb2RlczogKi8KLSNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfTkVUCTAJCS8qIGZvciBuZXR3b3JrICovCi0jZGVmaW5lCQlJQ01QX1JFRElSRUNUX0hPU1QJMQkJLyogZm9yIGhvc3QgKi8KLSNkZWZpbmUJCUlDTVBfUkVESVJFQ1RfVE9TTkVUCTIJCS8qIGZvciB0b3MgYW5kIG5ldCAqLwotI2RlZmluZQkJSUNNUF9SRURJUkVDVF9UT1NIT1NUCTMJCS8qIGZvciB0b3MgYW5kIGhvc3QgKi8KLSNkZWZpbmUJSUNNUF9FQ0hPCQk4CQkvKiBlY2hvIHNlcnZpY2UgKi8KLSNkZWZpbmUJSUNNUF9ST1VURVJBRFZFUlQJOQkJLyogcm91dGVyIGFkdmVydGlzZW1lbnQgKi8KLSNkZWZpbmUJSUNNUF9ST1VURVJTT0xJQ0lUCTEwCQkvKiByb3V0ZXIgc29saWNpdGF0aW9uICovCi0jZGVmaW5lCUlDTVBfVElNWENFRUQJCTExCQkvKiB0aW1lIGV4Y2VlZGVkLCBjb2RlOiAqLwotI2RlZmluZQkJSUNNUF9USU1YQ0VFRF9JTlRSQU5TCTAJCS8qIHR0bD09MCBpbiB0cmFuc2l0ICovCi0jZGVmaW5lCQlJQ01QX1RJTVhDRUVEX1JFQVNTCTEJCS8qIHR0bD09MCBpbiByZWFzcyAqLwotI2RlZmluZQlJQ01QX1BBUkFNUFJPQgkJMTIJCS8qIGlwIGhlYWRlciBiYWQgKi8KLSNkZWZpbmUJCUlDTVBfUEFSQU1QUk9CX09QVEFCU0VOVCAxCQkvKiByZXEuIG9wdC4gYWJzZW50ICovCi0jZGVmaW5lCUlDTVBfVFNUQU1QCQkxMwkJLyogdGltZXN0YW1wIHJlcXVlc3QgKi8KLSNkZWZpbmUJSUNNUF9UU1RBTVBSRVBMWQkxNAkJLyogdGltZXN0YW1wIHJlcGx5ICovCi0jZGVmaW5lCUlDTVBfSVJFUQkJMTUJCS8qIGluZm9ybWF0aW9uIHJlcXVlc3QgKi8KLSNkZWZpbmUJSUNNUF9JUkVRUkVQTFkJCTE2CQkvKiBpbmZvcm1hdGlvbiByZXBseSAqLwotI2RlZmluZQlJQ01QX01BU0tSRVEJCTE3CQkvKiBhZGRyZXNzIG1hc2sgcmVxdWVzdCAqLwotI2RlZmluZQlJQ01QX01BU0tSRVBMWQkJMTgJCS8qIGFkZHJlc3MgbWFzayByZXBseSAqLwotCi0jZGVmaW5lCUlDTVBfTUFYVFlQRQkJMTgKLQotI2RlZmluZQlJQ01QX0lORk9UWVBFKHR5cGUpIFwKLQkoKHR5cGUpID09IElDTVBfRUNIT1JFUExZIHx8ICh0eXBlKSA9PSBJQ01QX0VDSE8gfHwgXAotCSh0eXBlKSA9PSBJQ01QX1JPVVRFUkFEVkVSVCB8fCAodHlwZSkgPT0gSUNNUF9ST1VURVJTT0xJQ0lUIHx8IFwKLQkodHlwZSkgPT0gSUNNUF9UU1RBTVAgfHwgKHR5cGUpID09IElDTVBfVFNUQU1QUkVQTFkgfHwgXAotCSh0eXBlKSA9PSBJQ01QX0lSRVEgfHwgKHR5cGUpID09IElDTVBfSVJFUVJFUExZIHx8IFwKLQkodHlwZSkgPT0gSUNNUF9NQVNLUkVRIHx8ICh0eXBlKSA9PSBJQ01QX01BU0tSRVBMWSkKLSNkZWZpbmUJSUNNUF9NUExTX0VYVF9UWVBFKHR5cGUpIFwKLQkoKHR5cGUpID09IElDTVBfVU5SRUFDSCB8fCBcCi0gICAgICAgICAodHlwZSkgPT0gSUNNUF9USU1YQ0VFRCB8fCBcCi0gICAgICAgICAodHlwZSkgPT0gSUNNUF9QQVJBTVBST0IpCi0vKiByZmMxNzAwICovCi0jaWZuZGVmIElDTVBfVU5SRUFDSF9ORVRfVU5LTk9XTgotI2RlZmluZSBJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV04JNgkvKiBkZXN0aW5hdGlvbiBuZXQgdW5rbm93biAqLwotI2VuZGlmCi0jaWZuZGVmIElDTVBfVU5SRUFDSF9IT1NUX1VOS05PV04KLSNkZWZpbmUgSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTgk3CS8qIGRlc3RpbmF0aW9uIGhvc3QgdW5rbm93biAqLwotI2VuZGlmCi0jaWZuZGVmIElDTVBfVU5SRUFDSF9JU09MQVRFRAotI2RlZmluZSBJQ01QX1VOUkVBQ0hfSVNPTEFURUQJCTgJLyogc291cmNlIGhvc3QgaXNvbGF0ZWQgKi8KLSNlbmRpZgotI2lmbmRlZiBJQ01QX1VOUkVBQ0hfTkVUX1BST0hJQgotI2RlZmluZSBJQ01QX1VOUkVBQ0hfTkVUX1BST0hJQgkJOQkvKiBhZG1pbiBwcm9oaWJpdGVkIG5ldCAqLwotI2VuZGlmCi0jaWZuZGVmIElDTVBfVU5SRUFDSF9IT1NUX1BST0hJQgotI2RlZmluZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUk9ISUIJMTAJLyogYWRtaW4gcHJvaGliaXRlZCBob3N0ICovCi0jZW5kaWYKLSNpZm5kZWYgSUNNUF9VTlJFQUNIX1RPU05FVAotI2RlZmluZSBJQ01QX1VOUkVBQ0hfVE9TTkVUCQkxMQkvKiB0b3MgcHJvaGliaXRlZCBuZXQgKi8KLSNlbmRpZgotI2lmbmRlZiBJQ01QX1VOUkVBQ0hfVE9TSE9TVAotI2RlZmluZSBJQ01QX1VOUkVBQ0hfVE9TSE9TVAkJMTIJLyogdG9zIHByb2hpYml0ZWQgaG9zdCAqLwotI2VuZGlmCi0KLS8qIHJmYzE3MTYgKi8KLSNpZm5kZWYgSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUIKLSNkZWZpbmUgSUNNUF9VTlJFQUNIX0ZJTFRFUl9QUk9ISUIJMTMJLyogYWRtaW4gcHJvaGliaXRlZCBmaWx0ZXIgKi8KLSNlbmRpZgotI2lmbmRlZiBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFCi0jZGVmaW5lIElDTVBfVU5SRUFDSF9IT1NUX1BSRUNFREVOQ0UJMTQJLyogaG9zdCBwcmVjZWRlbmNlIHZpb2xhdGlvbiAqLwotI2VuZGlmCi0jaWZuZGVmIElDTVBfVU5SRUFDSF9QUkVDRURFTkNFX0NVVE9GRgotI2RlZmluZSBJQ01QX1VOUkVBQ0hfUFJFQ0VERU5DRV9DVVRPRkYJMTUJLyogcHJlY2VkZW5jZSBjdXRvZmYgKi8KLSNlbmRpZgotCi0vKiBNb3N0IG9mIHRoZSBpY21wIHR5cGVzICovCi1zdGF0aWMgc3RydWN0IHRvayBpY21wMnN0cltdID0gewotCXsgSUNNUF9FQ0hPUkVQTFksCQkiZWNobyByZXBseSIgfSwKLQl7IElDTVBfU09VUkNFUVVFTkNILAkJInNvdXJjZSBxdWVuY2giIH0sCi0JeyBJQ01QX0VDSE8sCQkJImVjaG8gcmVxdWVzdCIgfSwKLQl7IElDTVBfUk9VVEVSU09MSUNJVCwJCSJyb3V0ZXIgc29saWNpdGF0aW9uIiB9LAotCXsgSUNNUF9UU1RBTVAsCQkJInRpbWUgc3RhbXAgcmVxdWVzdCIgfSwKLQl7IElDTVBfVFNUQU1QUkVQTFksCQkidGltZSBzdGFtcCByZXBseSIgfSwKLQl7IElDTVBfSVJFUSwJCQkiaW5mb3JtYXRpb24gcmVxdWVzdCIgfSwKLQl7IElDTVBfSVJFUVJFUExZLAkJImluZm9ybWF0aW9uIHJlcGx5IiB9LAotCXsgSUNNUF9NQVNLUkVRLAkJCSJhZGRyZXNzIG1hc2sgcmVxdWVzdCIgfSwKLQl7IDAsCQkJCU5VTEwgfQotfTsKLQotLyogRm9ybWF0cyBmb3IgbW9zdCBvZiB0aGUgSUNNUF9VTlJFQUNIIGNvZGVzICovCi1zdGF0aWMgc3RydWN0IHRvayB1bnJlYWNoMnN0cltdID0gewotCXsgSUNNUF9VTlJFQUNIX05FVCwJCSJuZXQgJXMgdW5yZWFjaGFibGUiIH0sCi0JeyBJQ01QX1VOUkVBQ0hfSE9TVCwJCSJob3N0ICVzIHVucmVhY2hhYmxlIiB9LAotCXsgSUNNUF9VTlJFQUNIX1NSQ0ZBSUwsCi0JICAgICIlcyB1bnJlYWNoYWJsZSAtIHNvdXJjZSByb3V0ZSBmYWlsZWQiIH0sCi0JeyBJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV04sCSJuZXQgJXMgdW5yZWFjaGFibGUgLSB1bmtub3duIiB9LAotCXsgSUNNUF9VTlJFQUNIX0hPU1RfVU5LTk9XTiwJImhvc3QgJXMgdW5yZWFjaGFibGUgLSB1bmtub3duIiB9LAotCXsgSUNNUF9VTlJFQUNIX0lTT0xBVEVELAotCSAgICAiJXMgdW5yZWFjaGFibGUgLSBzb3VyY2UgaG9zdCBpc29sYXRlZCIgfSwKLQl7IElDTVBfVU5SRUFDSF9ORVRfUFJPSElCLAotCSAgICAibmV0ICVzIHVucmVhY2hhYmxlIC0gYWRtaW4gcHJvaGliaXRlZCIgfSwKLQl7IElDTVBfVU5SRUFDSF9IT1NUX1BST0hJQiwKLQkgICAgImhvc3QgJXMgdW5yZWFjaGFibGUgLSBhZG1pbiBwcm9oaWJpdGVkIiB9LAotCXsgSUNNUF9VTlJFQUNIX1RPU05FVCwKLQkgICAgIm5ldCAlcyB1bnJlYWNoYWJsZSAtIHRvcyBwcm9oaWJpdGVkIiB9LAotCXsgSUNNUF9VTlJFQUNIX1RPU0hPU1QsCi0JICAgICJob3N0ICVzIHVucmVhY2hhYmxlIC0gdG9zIHByb2hpYml0ZWQiIH0sCi0JeyBJQ01QX1VOUkVBQ0hfRklMVEVSX1BST0hJQiwKLQkgICAgImhvc3QgJXMgdW5yZWFjaGFibGUgLSBhZG1pbiBwcm9oaWJpdGVkIGZpbHRlciIgfSwKLQl7IElDTVBfVU5SRUFDSF9IT1NUX1BSRUNFREVOQ0UsCi0JICAgICJob3N0ICVzIHVucmVhY2hhYmxlIC0gaG9zdCBwcmVjZWRlbmNlIHZpb2xhdGlvbiIgfSwKLQl7IElDTVBfVU5SRUFDSF9QUkVDRURFTkNFX0NVVE9GRiwKLQkgICAgImhvc3QgJXMgdW5yZWFjaGFibGUgLSBwcmVjZWRlbmNlIGN1dG9mZiIgfSwKLQl7IDAsCQkJCU5VTEwgfQotfTsKLQotLyogRm9ybWF0cyBmb3IgdGhlIElDTVBfUkVESVJFQ1QgY29kZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7Ci0JeyBJQ01QX1JFRElSRUNUX05FVCwJCSJyZWRpcmVjdCAlcyB0byBuZXQgJXMiIH0sCi0JeyBJQ01QX1JFRElSRUNUX0hPU1QsCQkicmVkaXJlY3QgJXMgdG8gaG9zdCAlcyIgfSwKLQl7IElDTVBfUkVESVJFQ1RfVE9TTkVULAkJInJlZGlyZWN0LXRvcyAlcyB0byBuZXQgJXMiIH0sCi0JeyBJQ01QX1JFRElSRUNUX1RPU0hPU1QsCSJyZWRpcmVjdC10b3MgJXMgdG8gaG9zdCAlcyIgfSwKLQl7IDAsCQkJCU5VTEwgfQotfTsKLQotLyogcmZjMTE5MSAqLwotc3RydWN0IG10dV9kaXNjb3ZlcnkgewotCXVfaW50MTZfdCB1bnVzZWQ7Ci0JdV9pbnQxNl90IG5leHRob3BtdHU7Ci19OwotCi0vKiByZmMxMjU2ICovCi1zdHJ1Y3QgaWhfcmRpc2NvdmVyeSB7Ci0JdV9pbnQ4X3QgaXJkX2FkZHJudW07Ci0JdV9pbnQ4X3QgaXJkX2FkZHJzaXo7Ci0JdV9pbnQxNl90IGlyZF9saWZldGltZTsKLX07Ci0KLXN0cnVjdCBpZF9yZGlzY292ZXJ5IHsKLQl1X2ludDMyX3QgaXJkX2FkZHI7Ci0JdV9pbnQzMl90IGlyZF9wcmVmOwotfTsKLQotLyoKLSAqIGRyYWZ0LWJvbmljYS1pbnRlcm5ldC1pY21wLTA4Ci0gKgotICogVGhlIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlLCBUaW1lIEV4Y2VlZGVkCi0gKiBhbmQgUGFyYW1ldGVyIFByb2JsZW0gbWVzc2FnZXMgYXJlIHNsaWdobHkgY2hhbmdlZCBhcyBwZXIKLSAqIHRoZSBhYm92ZSBkcmFmdC4gQSBuZXcgTGVuZ3RoIGZpZWxkIGdldHMgYWRkZWQgdG8gZ2l2ZQotICogdGhlIGNhbGxlciBhbiBpZGVhIGFib3V0IHRoZSBsZW5ndGggb2YgdGhlIHBpZ2d5cGFja2VkCi0gKiBJUCBwYWNrZXQgYmVmb3JlIHRoZSBNUExTIGV4dGVuc2lvbiBoZWFkZXIgc3RhcnRzLgotICoKLSAqIFRoZSBMZW5ndGggZmllbGQgcmVwcmVzZW50cyBsZW5ndGggb2YgdGhlIHBhZGRlZCAib3JpZ2luYWwgZGF0YWdyYW0iCi0gKiBmaWVsZCAgbWVhc3VyZWQgaW4gMzItYml0IHdvcmRzLgotICoKLSAqIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgIFR5cGUgICAgICB8ICAgICBDb2RlICAgICAgfCAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgdW51c2VkICAgIHwgICAgTGVuZ3RoICAgICB8ICAgICAgICAgIHVudXNlZCAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgSW50ZXJuZXQgSGVhZGVyICsgbGVhZGluZyBvY3RldHMgb2Ygb3JpZ2luYWwgZGF0YWdyYW0gICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotCi1zdHJ1Y3QgaWNtcF9leHRfdCB7Ci0gICAgdV9pbnQ4X3QgaWNtcF90eXBlOwotICAgIHVfaW50OF90IGljbXBfY29kZTsKLSAgICB1X2ludDhfdCBpY21wX2NoZWNrc3VtWzJdOwotICAgIHVfaW50OF90IGljbXBfcmVzZXJ2ZWQ7Ci0gICAgdV9pbnQ4X3QgaWNtcF9sZW5ndGg7Ci0gICAgdV9pbnQ4X3QgaWNtcF9yZXNlcnZlZDJbMl07Ci0gICAgdV9pbnQ4X3QgaWNtcF9leHRfbGVnYWN5X2hlYWRlclsxMjhdOyAvKiBleHRlbnNpb24gaGVhZGVyIHN0YXJ0cyAxMjggYnl0ZXMgYWZ0ZXIgSUNNUCBoZWFkZXIgKi8KLSAgICB1X2ludDhfdCBpY21wX2V4dF92ZXJzaW9uX3Jlc1syXTsKLSAgICB1X2ludDhfdCBpY21wX2V4dF9jaGVja3N1bVsyXTsKLSAgICB1X2ludDhfdCBpY21wX2V4dF9kYXRhWzFdOwotfTsKLQotc3RydWN0IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlcl90IHsKLSAgICB1X2ludDhfdCBsZW5ndGhbMl07Ci0gICAgdV9pbnQ4X3QgY2xhc3NfbnVtOwotICAgIHVfaW50OF90IGN0eXBlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgaWNtcF9tcGxzX2V4dF9vYmpfdmFsdWVzW10gPSB7Ci0gICAgeyAxLCAiTVBMUyBTdGFjayBFbnRyeSIgfSwKLSAgICB7IDIsICJFeHRlbmRlZCBQYXlsb2FkIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIHByb3RvdHlwZXMgKi8KLWNvbnN0IGNoYXIgKmljbXBfdHN0YW1wX3ByaW50KHVfaW50KTsKLQotLyogcHJpbnQgdGhlIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBVVEMgKi8KLWNvbnN0IGNoYXIgKgotaWNtcF90c3RhbXBfcHJpbnQodV9pbnQgdHN0YW1wKSB7Ci0gICAgdV9pbnQgbXNlYyxzZWMsbWluLGhyczsKLQotICAgIHN0YXRpYyBjaGFyIGJ1Zls2NF07Ci0KLSAgICBtc2VjID0gdHN0YW1wICUgMTAwMDsKLSAgICBzZWMgPSB0c3RhbXAgLyAxMDAwOwotICAgIG1pbiA9IHNlYyAvIDYwOyBzZWMgLT0gbWluICogNjA7Ci0gICAgaHJzID0gbWluIC8gNjA7IG1pbiAtPSBocnMgKiA2MDsKLSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJTAydTolMDJ1OiUwMnUuJTAzdSIsaHJzLG1pbixzZWMsbXNlYyk7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLSAKLXZvaWQKLWljbXBfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgcGxlbiwgY29uc3QgdV9jaGFyICpicDIsIGludCBmcmFnbWVudGVkKQotewotCWNoYXIgKmNwOwotCWNvbnN0IHN0cnVjdCBpY21wICpkcDsKLSAgICAgICAgY29uc3Qgc3RydWN0IGljbXBfZXh0X3QgKmV4dF9kcDsKLQljb25zdCBzdHJ1Y3QgaXAgKmlwOwotCWNvbnN0IGNoYXIgKnN0ciwgKmZtdDsKLQljb25zdCBzdHJ1Y3QgaXAgKm9pcDsKLQljb25zdCBzdHJ1Y3QgdWRwaGRyICpvdWg7Ci0gICAgICAgIGNvbnN0IHVfaW50OF90ICpvYmpfdHB0cjsKLSAgICAgICAgdV9pbnQzMl90IHJhd19sYWJlbDsKLSAgICAgICAgY29uc3QgdV9jaGFyICpzbmFwZW5kX3NhdmU7Ci0JY29uc3Qgc3RydWN0IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlcl90ICppY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXI7Ci0JdV9pbnQgaGxlbiwgZHBvcnQsIG10dSwgb2JqX3RsZW4sIG9ial9jbGFzc19udW0sIG9ial9jdHlwZTsKLQljaGFyIGJ1ZltNQVhIT1NUTkFNRUxFTiArIDEwMF07Ci0KLQlkcCA9IChzdHJ1Y3QgaWNtcCAqKWJwOwotICAgICAgICBleHRfZHAgPSAoc3RydWN0IGljbXBfZXh0X3QgKilicDsKLQlpcCA9IChzdHJ1Y3QgaXAgKilicDI7Ci0Jc3RyID0gYnVmOwotCi0JVENIRUNLKGRwLT5pY21wX2NvZGUpOwotCXN3aXRjaCAoZHAtPmljbXBfdHlwZSkgewotCi0JY2FzZSBJQ01QX0VDSE86Ci0JY2FzZSBJQ01QX0VDSE9SRVBMWToKLQkJVENIRUNLKGRwLT5pY21wX3NlcSk7Ci0JCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJlY2hvICVzLCBpZCAldSwgc2VxICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcC0+aWNtcF90eXBlID09IElDTVBfRUNITyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QiIDogInJlcGx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmZHAtPmljbXBfaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcF9zZXEpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElDTVBfVU5SRUFDSDoKLQkJVENIRUNLKGRwLT5pY21wX2lwLmlwX2RzdCk7Ci0JCXN3aXRjaCAoZHAtPmljbXBfY29kZSkgewotCi0JCWNhc2UgSUNNUF9VTlJFQUNIX1BST1RPQ09MOgotCQkJVENIRUNLKGRwLT5pY21wX2lwLmlwX3ApOwotCQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAiJXMgcHJvdG9jb2wgJWQgdW5yZWFjaGFibGUiLAotCQkJICAgIGlwYWRkcl9zdHJpbmcoJmRwLT5pY21wX2lwLmlwX2RzdCksCi0JCQkgICAgZHAtPmljbXBfaXAuaXBfcCk7Ci0JCQlicmVhazsKLQotCQljYXNlIElDTVBfVU5SRUFDSF9QT1JUOgotCQkJVENIRUNLKGRwLT5pY21wX2lwLmlwX3ApOwotCQkJb2lwID0gJmRwLT5pY21wX2lwOwotCQkJaGxlbiA9IElQX0hMKG9pcCkgKiA0OwotCQkJb3VoID0gKHN0cnVjdCB1ZHBoZHIgKikoKCh1X2NoYXIgKilvaXApICsgaGxlbik7Ci0JCQlUQ0hFQ0sob3VoLT51aF9kcG9ydCk7Ci0JCQlkcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZvdWgtPnVoX2Rwb3J0KTsKLQkJCXN3aXRjaCAob2lwLT5pcF9wKSB7Ci0KLQkJCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCQkJIiVzIHRjcCBwb3J0ICVzIHVucmVhY2hhYmxlIiwKLQkJCQkJaXBhZGRyX3N0cmluZygmb2lwLT5pcF9kc3QpLAotCQkJCQl0Y3Bwb3J0X3N0cmluZyhkcG9ydCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElQUFJPVE9fVURQOgotCQkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkJCSIlcyB1ZHAgcG9ydCAlcyB1bnJlYWNoYWJsZSIsCi0JCQkJCWlwYWRkcl9zdHJpbmcoJm9pcC0+aXBfZHN0KSwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJCQkiJXMgcHJvdG9jb2wgJWQgcG9ydCAlZCB1bnJlYWNoYWJsZSIsCi0JCQkJCWlwYWRkcl9zdHJpbmcoJm9pcC0+aXBfZHN0KSwKLQkJCQkJb2lwLT5pcF9wLCBkcG9ydCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIElDTVBfVU5SRUFDSF9ORUVERlJBRzoKLQkJICAgIHsKLQkJCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtdHVfZGlzY292ZXJ5ICptcDsKLQkJCW1wID0gKHN0cnVjdCBtdHVfZGlzY292ZXJ5ICopJmRwLT5pY21wX3ZvaWQ7Ci0JCQltdHUgPSBFWFRSQUNUXzE2QklUUygmbXAtPm5leHRob3BtdHUpOwotCQkJaWYgKG10dSkgewotCQkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkJICAgICIlcyB1bnJlYWNoYWJsZSAtIG5lZWQgdG8gZnJhZyAobXR1ICVkKSIsCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJmRwLT5pY21wX2lwLmlwX2RzdCksIG10dSk7Ci0JCQl9IGVsc2UgewotCQkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkJICAgICIlcyB1bnJlYWNoYWJsZSAtIG5lZWQgdG8gZnJhZyIsCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJmRwLT5pY21wX2lwLmlwX2RzdCkpOwotCQkJfQotCQkgICAgfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWZtdCA9IHRvazJzdHIodW5yZWFjaDJzdHIsICIjJWQgJSVzIHVucmVhY2hhYmxlIiwKLQkJCSAgICBkcC0+aWNtcF9jb2RlKTsKLQkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwKLQkJCSAgICBpcGFkZHJfc3RyaW5nKCZkcC0+aWNtcF9pcC5pcF9kc3QpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJQ01QX1JFRElSRUNUOgotCQlUQ0hFQ0soZHAtPmljbXBfaXAuaXBfZHN0KTsKLQkJZm10ID0gdG9rMnN0cih0eXBlMnN0ciwgInJlZGlyZWN0LSMlZCAlJXMgdG8gbmV0ICUlcyIsCi0JCSAgICBkcC0+aWNtcF9jb2RlKTsKLQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LAotCQkgICAgaXBhZGRyX3N0cmluZygmZHAtPmljbXBfaXAuaXBfZHN0KSwKLQkJICAgIGlwYWRkcl9zdHJpbmcoJmRwLT5pY21wX2d3YWRkcikpOwotCQlicmVhazsKLQotCWNhc2UgSUNNUF9ST1VURVJBRFZFUlQ6Ci0JICAgIHsKLQkJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGloX3JkaXNjb3ZlcnkgKmlocDsKLQkJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlkX3JkaXNjb3ZlcnkgKmlkcDsKLQkJdV9pbnQgbGlmZXRpbWUsIG51bSwgc2l6ZTsKLQotCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAicm91dGVyIGFkdmVydGlzZW1lbnQiKTsKLQkJY3AgPSBidWYgKyBzdHJsZW4oYnVmKTsKLQotCQlpaHAgPSAoc3RydWN0IGloX3JkaXNjb3ZlcnkgKikmZHAtPmljbXBfdm9pZDsKLQkJVENIRUNLKCppaHApOwotCQkodm9pZClzdHJuY3B5KGNwLCAiIGxpZmV0aW1lICIsIHNpemVvZihidWYpIC0gKGNwIC0gYnVmKSk7Ci0JCWNwID0gYnVmICsgc3RybGVuKGJ1Zik7Ci0JCWxpZmV0aW1lID0gRVhUUkFDVF8xNkJJVFMoJmlocC0+aXJkX2xpZmV0aW1lKTsKLQkJaWYgKGxpZmV0aW1lIDwgNjApIHsKLQkJCSh2b2lkKXNucHJpbnRmKGNwLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZiksICIldSIsCi0JCQkgICAgbGlmZXRpbWUpOwotCQl9IGVsc2UgaWYgKGxpZmV0aW1lIDwgNjAgKiA2MCkgewotCQkJKHZvaWQpc25wcmludGYoY3AsIHNpemVvZihidWYpIC0gKGNwIC0gYnVmKSwgIiV1OiUwMnUiLAotCQkJICAgIGxpZmV0aW1lIC8gNjAsIGxpZmV0aW1lICUgNjApOwotCQl9IGVsc2UgewotCQkJKHZvaWQpc25wcmludGYoY3AsIHNpemVvZihidWYpIC0gKGNwIC0gYnVmKSwKLQkJCSAgICAiJXU6JTAydTolMDJ1IiwKLQkJCSAgICBsaWZldGltZSAvIDM2MDAsCi0JCQkgICAgKGxpZmV0aW1lICUgMzYwMCkgLyA2MCwKLQkJCSAgICBsaWZldGltZSAlIDYwKTsKLQkJfQotCQljcCA9IGJ1ZiArIHN0cmxlbihidWYpOwotCi0JCW51bSA9IGlocC0+aXJkX2FkZHJudW07Ci0JCSh2b2lkKXNucHJpbnRmKGNwLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZiksICIgJWQ6IiwgbnVtKTsKLQkJY3AgPSBidWYgKyBzdHJsZW4oYnVmKTsKLQotCQlzaXplID0gaWhwLT5pcmRfYWRkcnNpejsKLQkJaWYgKHNpemUgIT0gMikgewotCQkJKHZvaWQpc25wcmludGYoY3AsIHNpemVvZihidWYpIC0gKGNwIC0gYnVmKSwKLQkJCSAgICAiIFtzaXplICVkXSIsIHNpemUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWRwID0gKHN0cnVjdCBpZF9yZGlzY292ZXJ5ICopJmRwLT5pY21wX2RhdGE7Ci0JCXdoaWxlIChudW0tLSA+IDApIHsKLQkJCVRDSEVDSygqaWRwKTsKLQkJCSh2b2lkKXNucHJpbnRmKGNwLCBzaXplb2YoYnVmKSAtIChjcCAtIGJ1ZiksICIgeyVzICV1fSIsCi0JCQkgICAgaXBhZGRyX3N0cmluZygmaWRwLT5pcmRfYWRkciksCi0JCQkgICAgRVhUUkFDVF8zMkJJVFMoJmlkcC0+aXJkX3ByZWYpKTsKLQkJCWNwID0gYnVmICsgc3RybGVuKGJ1Zik7Ci0JCQkrK2lkcDsKLQkJfQotCSAgICB9Ci0JCWJyZWFrOwotCi0JY2FzZSBJQ01QX1RJTVhDRUVEOgotCQlUQ0hFQ0soZHAtPmljbXBfaXAuaXBfZHN0KTsKLQkJc3dpdGNoIChkcC0+aWNtcF9jb2RlKSB7Ci0KLQkJY2FzZSBJQ01QX1RJTVhDRUVEX0lOVFJBTlM6Ci0JCQlzdHIgPSAidGltZSBleGNlZWRlZCBpbi10cmFuc2l0IjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUNNUF9USU1YQ0VFRF9SRUFTUzoKLQkJCXN0ciA9ICJpcCByZWFzc2VtYmx5IHRpbWUgZXhjZWVkZWQiOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCSh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0aW1lIGV4Y2VlZGVkLSMlZCIsCi0JCQkgICAgZHAtPmljbXBfY29kZSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgSUNNUF9QQVJBTVBST0I6Ci0JCWlmIChkcC0+aWNtcF9jb2RlKQotCQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAicGFyYW1ldGVyIHByb2JsZW0gLSBjb2RlICVkIiwgZHAtPmljbXBfY29kZSk7Ci0JCWVsc2UgewotCQkJVENIRUNLKGRwLT5pY21wX3BwdHIpOwotCQkJKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAicGFyYW1ldGVyIHByb2JsZW0gLSBvY3RldCAlZCIsIGRwLT5pY21wX3BwdHIpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJQ01QX01BU0tSRVBMWToKLQkJVENIRUNLKGRwLT5pY21wX21hc2spOwotCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiYWRkcmVzcyBtYXNrIGlzIDB4JTA4eCIsCi0JCSAgICBFWFRSQUNUXzMyQklUUygmZHAtPmljbXBfbWFzaykpOwotCQlicmVhazsKLQotCWNhc2UgSUNNUF9UU1RBTVA6Ci0JCVRDSEVDSyhkcC0+aWNtcF9zZXEpOwotCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICAgInRpbWUgc3RhbXAgcXVlcnkgaWQgJXUgc2VxICV1IiwKLQkJICAgIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcF9pZCksCi0JCSAgICBFWFRSQUNUXzE2QklUUygmZHAtPmljbXBfc2VxKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJQ01QX1RTVEFNUFJFUExZOgotCQlUQ0hFQ0soZHAtPmljbXBfdHRpbWUpOwotCQkodm9pZClzbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkgICAgInRpbWUgc3RhbXAgcmVwbHkgaWQgJXUgc2VxICV1OiBvcmcgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcF9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmRwLT5pY21wX3NlcSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNtcF90c3RhbXBfcHJpbnQoRVhUUkFDVF8zMkJJVFMoJmRwLT5pY21wX290aW1lKSkpOwotCi0gICAgICAgICAgICAgICAgKHZvaWQpc25wcmludGYoYnVmK3N0cmxlbihidWYpLHNpemVvZihidWYpLXN0cmxlbihidWYpLCIsIHJlY3YgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGljbXBfdHN0YW1wX3ByaW50KEVYVFJBQ1RfMzJCSVRTKCZkcC0+aWNtcF9ydGltZSkpKTsKLSAgICAgICAgICAgICAgICAodm9pZClzbnByaW50ZihidWYrc3RybGVuKGJ1Ziksc2l6ZW9mKGJ1Ziktc3RybGVuKGJ1ZiksIiwgeG1pdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaWNtcF90c3RhbXBfcHJpbnQoRVhUUkFDVF8zMkJJVFMoJmRwLT5pY21wX3R0aW1lKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RyID0gdG9rMnN0cihpY21wMnN0ciwgInR5cGUtIyVkIiwgZHAtPmljbXBfdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQkodm9pZClwcmludGYoIklDTVAgJXMsIGxlbmd0aCAldSIsIHN0ciwgcGxlbik7Ci0JaWYgKHZmbGFnICYmICFmcmFnbWVudGVkKSB7IC8qIGRvbid0IGF0dGVtcHQgY2hlY2tzdW1taW5nIGlmIHRoaXMgaXMgYSBmcmFnICovCi0JCXVfaW50MTZfdCBzdW0sIGljbXBfc3VtOwotCQlpZiAoVFRFU1QyKCpicCwgcGxlbikpIHsKLQkJCXN1bSA9IGluX2Nrc3VtKCh1X3Nob3J0KilkcCwgcGxlbiwgMCk7Ci0JCQlpZiAoc3VtICE9IDApIHsKLQkJCQlpY21wX3N1bSA9IEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcF9ja3N1bSk7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgKHdyb25nIGljbXAgY2tzdW0gJXggKC0+JXgpISkiLAotCQkJCQkgICAgIGljbXBfc3VtLAotCQkJCQkgICAgIGluX2Nrc3VtX3Nob3VsZGJlKGljbXBfc3VtLCBzdW0pKTsKLQkJCX0KLQkJfQotCX0KLQotICAgICAgICAvKgotICAgICAgICAgKiBwcmludCB0aGUgcmVtbmFudHMgb2YgdGhlIElQIHBhY2tldC4KLSAgICAgICAgICogc2F2ZSB0aGUgc25hcGxlbmd0aCBhcyB0aGlzIG1heSBnZXQgb3ZlcmlkZGVuIGluIHRoZSBJUCBwcmludGVyLgotICAgICAgICAgKi8KLQlpZiAodmZsYWcgPj0gMSAmJiAhSUNNUF9JTkZPVFlQRShkcC0+aWNtcF90eXBlKSkgewotCQlicCArPSA4OwotCQkodm9pZClwcmludGYoIlxuXHQiKTsKLQkJaXAgPSAoc3RydWN0IGlwICopYnA7Ci0JCXNuYXBsZW4gPSBzbmFwZW5kIC0gYnA7Ci0gICAgICAgICAgICAgICAgc25hcGVuZF9zYXZlID0gc25hcGVuZDsKLQkJaXBfcHJpbnQoZ25kbywgYnAsIEVYVFJBQ1RfMTZCSVRTKCZpcC0+aXBfbGVuKSk7Ci0gICAgICAgICAgICAgICAgc25hcGVuZCA9IHNuYXBlbmRfc2F2ZTsKLQl9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXR0ZW1wdCB0byBkZWNvZGUgdGhlIE1QTFMgZXh0ZW5zaW9ucyBvbmx5IGZvciBzb21lIElDTVAgdHlwZXMuCi0gICAgICAgICAqLwotICAgICAgICBpZiAodmZsYWcgPj0gMSAmJiBwbGVuID4gSUNNUF9FWFREX01JTkxFTiAmJiBJQ01QX01QTFNfRVhUX1RZUEUoZHAtPmljbXBfdHlwZSkpIHsKLQotICAgICAgICAgICAgVENIRUNLKCpleHRfZHApOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ2hlY2sgZmlyc3QgaWYgdGhlIG1wbHMgZXh0ZW5zaW9uIGhlYWRlciBzaG93cyBhIG5vbi16ZXJvIGxlbmd0aC4KLSAgICAgICAgICAgICAqIElmIHRoZSBsZW5ndGggZmllbGQgaXMgbm90IHNldCB0aGVuIHNpbGVudGx5IHZlcmlmeSB0aGUgY2hlY2tzdW0KLSAgICAgICAgICAgICAqIHRvIGNoZWNrIGlmIGFuIGV4dGVuc2lvbiBoZWFkZXIgaXMgcHJlc2VudC4gVGhpcyBpcyBleHBlZGllbnQsCi0gICAgICAgICAgICAgKiBob3dldmVyIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHNldCB0aGUgbGVuZ3RoIGZpZWxkIHByb3Blci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCFleHRfZHAtPmljbXBfbGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgaW5fY2tzdW0oKGNvbnN0IHVfc2hvcnQgKikmZXh0X2RwLT5pY21wX2V4dF92ZXJzaW9uX3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwbGVuIC0gSUNNUF9FWFREX01JTkxFTiwgMCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdE1QTFMgZXh0ZW5zaW9uIHYldSIsCi0gICAgICAgICAgICAgICAgICAgSUNNUF9NUExTX0VYVF9FWFRSQUNUX1ZFUlNJT04oKihleHRfZHAtPmljbXBfZXh0X3ZlcnNpb25fcmVzKSkpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChJQ01QX01QTFNfRVhUX0VYVFJBQ1RfVkVSU0lPTigqKGV4dF9kcC0+aWNtcF9leHRfdmVyc2lvbl9yZXMpKSAhPQotICAgICAgICAgICAgICAgIElDTVBfTVBMU19FWFRfVkVSU0lPTikgewotICAgICAgICAgICAgICAgIHByaW50ZigiIHBhY2tldCBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBobGVuID0gcGxlbiAtIElDTVBfRVhURF9NSU5MRU47Ci0gICAgICAgICAgICBwcmludGYoIiwgY2hlY2tzdW0gMHglMDR4ICglc2NvcnJlY3QpLCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGV4dF9kcC0+aWNtcF9leHRfY2hlY2tzdW0pLAotICAgICAgICAgICAgICAgICAgIGluX2Nrc3VtKChjb25zdCB1X3Nob3J0ICopJmV4dF9kcC0+aWNtcF9leHRfdmVyc2lvbl9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxlbiAtIElDTVBfRVhURF9NSU5MRU4sIDApID8gImluIiA6ICIiLAotICAgICAgICAgICAgICAgICAgIGhsZW4pOwotCi0gICAgICAgICAgICBobGVuIC09IDQ7IC8qIHN1YnRyYWN0IGNvbW1vbiBoZWFkZXIgc2l6ZSAqLwotICAgICAgICAgICAgb2JqX3RwdHIgPSAodV9pbnQ4X3QgKilleHRfZHAtPmljbXBfZXh0X2RhdGE7Ci0KLSAgICAgICAgICAgIHdoaWxlIChobGVuID4gc2l6ZW9mKHN0cnVjdCBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXJfdCkpIHsKLQotICAgICAgICAgICAgICAgIGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlciA9IChzdHJ1Y3QgaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyX3QgKilvYmpfdHB0cjsKLSAgICAgICAgICAgICAgICBUQ0hFQ0soKmljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlcik7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4gPSBFWFRSQUNUXzE2QklUUyhpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXItPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgb2JqX2NsYXNzX251bSA9IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlci0+Y2xhc3NfbnVtOwotICAgICAgICAgICAgICAgIG9ial9jdHlwZSA9IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlci0+Y3R5cGU7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIgKz0gc2l6ZW9mKHN0cnVjdCBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXJfdCk7Ci0KLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICVzIE9iamVjdCAoJXUpLCBDbGFzcy1UeXBlOiAldSwgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihpY21wX21wbHNfZXh0X29ial92YWx1ZXMsInVua25vd24iLG9ial9jbGFzc19udW0pLAotICAgICAgICAgICAgICAgICAgICAgICBvYmpfY2xhc3NfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICBvYmpfY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIG9ial90bGVuKTsKLQotICAgICAgICAgICAgICAgIGhsZW4tPXNpemVvZihzdHJ1Y3QgaWNtcF9tcGxzX2V4dF9vYmplY3RfaGVhZGVyX3QpOyAvKiBsZW5ndGggZmllbGQgaW5jbHVkZXMgdGx2IGhlYWRlciAqLwotCi0gICAgICAgICAgICAgICAgLyogaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uICovICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICgob2JqX2NsYXNzX251bSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAob2JqX3RsZW4gPCBzaXplb2Yoc3RydWN0IGljbXBfbXBsc19leHRfb2JqZWN0X2hlYWRlcl90KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09c2l6ZW9mKHN0cnVjdCBpY21wX21wbHNfZXh0X29iamVjdF9oZWFkZXJfdCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG9ial9jbGFzc19udW0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChvYmpfY3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqb2JqX3RwdHIsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmF3X2xhYmVsID0gRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIGxhYmVsICV1LCBleHAgJXUiLCBNUExTX0xBQkVMKHJhd19sYWJlbCksIE1QTFNfRVhQKHJhd19sYWJlbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1QTFNfU1RBQ0socmF3X2xhYmVsKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgW1NdIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgdHRsICV1IiwgTVBMU19UVEwocmF3X2xhYmVsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShvYmpfdHB0ciwgIlxuXHQgICAgIiwgb2JqX3RsZW4pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICogIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBvYmplY3RzIHRoYXQgbGFjayBhIGRlY29kZXIKLSAgICAgICAgICAgICAgICAqICB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQotICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShvYmpfdHB0ciwgIlxuXHQgICAgIiwgb2JqX3RsZW4pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhsZW4gPCBvYmpfdGxlbikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaGxlbiAtPSBvYmpfdGxlbjsKLSAgICAgICAgICAgICAgICBvYmpfdHB0ciArPSBvYmpfdGxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JcmV0dXJuOwotdHJ1bmM6Ci0JZnB1dHMoIlt8aWNtcF0iLCBzdGRvdXQpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaWNtcDYuYyBiL3ByaW50LWljbXA2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDM5MjQuLjAwMDAwMDAKLS0tIGEvcHJpbnQtaWNtcDYuYworKysgL2Rldi9udWxsCkBAIC0xLDEyODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NAotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWljbXA2LmMsdiAxLjc5LjIuNiAyMDA1LzA5LzA1IDA5OjI5OjI4IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSU5FVDYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotI2luY2x1ZGUgImlwNi5oIgotI2luY2x1ZGUgImljbXA2LmgiCi0jaW5jbHVkZSAiaXBwcm90by5oIgotCi0jaW5jbHVkZSAidWRwLmgiCi0jaW5jbHVkZSAiYWguaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9ydHByZWYodV9pbnQpOwotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9saWZldGltZSh1X2ludDMyX3QpOwotc3RhdGljIHZvaWQgcHJpbnRfbGxhZGRyKGNvbnN0IHVfY2hhciAqLCBzaXplX3QpOwotc3RhdGljIHZvaWQgaWNtcDZfb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgbWxkNl9wcmludChjb25zdCB1X2NoYXIgKik7Ci1zdGF0aWMgdm9pZCBtbGR2Ml9yZXBvcnRfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXN0YXRpYyB2b2lkIG1sZHYyX3F1ZXJ5X3ByaW50KGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1zdGF0aWMgc3RydWN0IHVkcGhkciAqZ2V0X3VwcGVybGF5ZXIodV9jaGFyICosIHVfaW50ICopOwotc3RhdGljIHZvaWQgZG5zbmFtZV9wcmludChjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOwotc3RhdGljIHZvaWQgaWNtcDZfbm9kZWluZm9fcHJpbnQodV9pbnQsIGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKik7Ci1zdGF0aWMgdm9pZCBpY21wNl9ycmVudW1fcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqKTsKLQotI2lmbmRlZiBhYnMKLSNkZWZpbmUgYWJzKGEpCSgoMCA8IChhKSkgPyAoYSkgOiAtKGEpKQotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGljbXA2X3R5cGVfdmFsdWVzW10gPSB7Ci0gICAgeyBJQ01QNl9EU1RfVU5SRUFDSCwgImRlc3RpbmF0aW9uIHVucmVhY2hhYmxlIn0sCi0gICAgeyBJQ01QNl9QQUNLRVRfVE9PX0JJRywgInBhY2tldCB0b28gYmlnIn0sCi0gICAgeyBJQ01QNl9USU1FX0VYQ0VFREVELCAidGltZSBleGNlZWRlZCBpbi10cmFuc2l0In0sCi0gICAgeyBJQ01QNl9QQVJBTV9QUk9CLCAicGFyYW1ldGVyIHByb2JsZW0ifSwKLSAgICB7IElDTVA2X0VDSE9fUkVRVUVTVCwgImVjaG8gcmVxdWVzdCJ9LAotICAgIHsgSUNNUDZfRUNIT19SRVBMWSwgImVjaG8gcmVwbHkifSwKLSAgICB7IE1MRDZfTElTVEVORVJfUVVFUlksICJtdWx0aWNhc3QgbGlzdGVuZXIgcXVlcnkifSwKLSAgICB7IE1MRDZfTElTVEVORVJfUkVQT1JULCAibXVsdGljYXN0IGxpc3RlbmVyIHJlcG9ydCJ9LAotICAgIHsgTUxENl9MSVNURU5FUl9ET05FLCAibXVsdGljYXN0IGxpc3RlbmVyIGRvbmUifSwKLSAgICB7IE5EX1JPVVRFUl9TT0xJQ0lULCAicm91dGVyIHNvbGljaXRhdGlvbiJ9LAotICAgIHsgTkRfUk9VVEVSX0FEVkVSVCwgInJvdXRlciBhZHZlcnRpc2VtZW50In0sCi0gICAgeyBORF9ORUlHSEJPUl9TT0xJQ0lULCAibmVpZ2hib3Igc29saWNpdGF0aW9uIn0sCi0gICAgeyBORF9ORUlHSEJPUl9BRFZFUlQsICJuZWlnaGJvciBhZHZlcnRpc2VtZW50In0sCi0gICAgeyBORF9SRURJUkVDVCwgInJlZGlyZWN0In0sCi0gICAgeyBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkcsICJyb3V0ZXIgcmVudW1iZXJpbmcifSwKLSAgICB7IElORF9TT0xJQ0lULCAiaW52ZXJzZSBuZWlnaGJvciBzb2xpY2l0YXRpb24ifSwKLSAgICB7IElORF9BRFZFUlQsICJpbnZlcnNlIG5laWdoYm9yIGFkdmVydGlzZW1lbnQifSwKLSAgICB7IE1MRFYyX0xJU1RFTkVSX1JFUE9SVCwgIm11bHRpY2FzdCBsaXN0ZW5lciByZXBvcnQgdjIifSwKLSAgICB7IElDTVA2X0hBRElTQ09WX1JFUVVFU1QsICJoYSBkaXNjb3ZlcnkgcmVxdWVzdCJ9LAotICAgIHsgSUNNUDZfSEFESVNDT1ZfUkVQTFksICJoYSBkaXNjb3ZlcnkgcmVwbHkifSwKLSAgICB7IElDTVA2X01PQklMRVBSRUZJWF9TT0xJQ0lULCAibW9iaWxlIHJvdXRlciBzb2xpY2l0YXRpb24ifSwKLSAgICB7IElDTVA2X01PQklMRVBSRUZJWF9BRFZFUlQsICJtb2JpbGUgcm91dGVyIGFkdmVydGlzZW1lbnQifSwKLSAgICB7IElDTVA2X1dSVVJFUVVFU1QsICJ3aG8tYXJlLXlvdSByZXF1ZXN0In0sCi0gICAgeyBJQ01QNl9XUlVSRVBMWSwgIndoby1hcmUteW91IHJlcGx5In0sCi0gICAgeyBJQ01QNl9OSV9RVUVSWSwgIm5vZGUgaW5mb3JtYXRpb24gcXVlcnkifSwKLSAgICB7IElDTVA2X05JX1JFUExZLCAibm9kZSBpbmZvcm1hdGlvbiByZXBseSJ9LAotICAgIHsgTUxENl9NVFJBQ0UsICJtdHJhY2UgbWVzc2FnZSJ9LAotICAgIHsgTUxENl9NVFJBQ0VfUkVTUCwgIm10cmFjZSByZXNwb25zZSJ9LAotICAgIHsgMCwJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBpY21wNl9kc3RfdW5yZWFjaF9jb2RlX3ZhbHVlc1tdID0gewotICAgIHsgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURSwgInVucmVhY2hhYmxlIHJvdXRlIiB9LAotICAgIHsgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU4sICIgdW5yZWFjaGFibGUgcHJvaGliaXRlZCJ9LAotICAgIHsgSUNNUDZfRFNUX1VOUkVBQ0hfQkVZT05EU0NPUEUsICJiZXlvbmQgc2NvcGUifSwKLSAgICB7IElDTVA2X0RTVF9VTlJFQUNIX0FERFIsICJ1bnJlYWNoYWJsZSBhZGRyZXNzIn0sCi0gICAgeyBJQ01QNl9EU1RfVU5SRUFDSF9OT1BPUlQsICJ1bnJlYWNoYWJsZSBwb3J0In0sCi0gICAgeyAwLAlOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGljbXA2X29wdF9waV9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgTkRfT1BUX1BJX0ZMQUdfT05MSU5LLCAib25saW5rIiB9LAotICAgIHsgTkRfT1BUX1BJX0ZMQUdfQVVUTywgImF1dG8iIH0sCi0gICAgeyBORF9PUFRfUElfRkxBR19ST1VURVIsICJyb3V0ZXIiIH0sCi0gICAgeyAwLAlOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGljbXA2X29wdF9yYV9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgTkRfUkFfRkxBR19NQU5BR0VELCAibWFuYWdlZCIgfSwKLSAgICB7IE5EX1JBX0ZMQUdfT1RIRVIsICJvdGhlciBzdGF0ZWZ1bCJ9LAotICAgIHsgTkRfUkFfRkxBR19IT01FX0FHRU5ULCAiaG9tZSBhZ2VudCJ9LAotICAgIHsgMCwJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBpY21wNl9uZF9uYV9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgTkRfTkFfRkxBR19ST1VURVIsICJyb3V0ZXIiIH0sCi0gICAgeyBORF9OQV9GTEFHX1NPTElDSVRFRCwgInNvbGljaXRlZCIgfSwKLSAgICB7IE5EX05BX0ZMQUdfT1ZFUlJJREUsICJvdmVycmlkZSIgfSwKLSAgICB7IDAsCU5VTEwgfQotfTsKLQotCi1zdGF0aWMgc3RydWN0IHRvayBpY21wNl9vcHRfdmFsdWVzW10gPSB7Ci0gICB7IE5EX09QVF9TT1VSQ0VfTElOS0FERFIsICJzb3VyY2UgbGluay1hZGRyZXNzIn0sCi0gICB7IE5EX09QVF9UQVJHRVRfTElOS0FERFIsICJkZXN0aW5hdGlvbiBsaW5rLWFkZHJlc3MifSwKLSAgIHsgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTiwgInByZWZpeCBpbmZvIn0sCi0gICB7IE5EX09QVF9SRURJUkVDVEVEX0hFQURFUiwgInJlZGlyZWN0ZWQgaGVhZGVyIn0sCi0gICB7IE5EX09QVF9NVFUsICJtdHUifSwKLSAgIHsgTkRfT1BUX0FEVklOVEVSVkFMLCAiYWR2ZXJ0aXNlbWVudCBpbnRlcnZhbCJ9LAotICAgeyBORF9PUFRfSE9NRUFHRU5UX0lORk8sICJob21lYWdlbnQgaW5mb3JtYXRpb24ifSwKLSAgIHsgTkRfT1BUX1JPVVRFX0lORk8sICJyb3V0ZSBpbmZvIn0sCi0gICB7IDAsCU5VTEwgfQotfTsKLQotLyogbWxkdjIgcmVwb3J0IHR5cGVzICovCi1zdGF0aWMgc3RydWN0IHRvayBtbGR2MnJlcG9ydDJzdHJbXSA9IHsKLQl7IDEsCSJpc19pbiIgfSwKLQl7IDIsCSJpc19leCIgfSwKLQl7IDMsCSJ0b19pbiIgfSwKLQl7IDQsCSJ0b19leCIgfSwKLQl7IDUsCSJhbGxvdyIgfSwKLQl7IDYsCSJibG9jayIgfSwKLQl7IDAsCU5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3J0cHJlZih1X2ludCB2KQotewotCXN0YXRpYyBjb25zdCBjaGFyICpydHByZWZfc3RyW10gPSB7Ci0JCSJtZWRpdW0iLAkJLyogMDAgKi8KLQkJImhpZ2giLAkJCS8qIDAxICovCi0JCSJyc3YiLAkJCS8qIDEwICovCi0JCSJsb3ciCQkJLyogMTEgKi8KLQl9OwotCi0JcmV0dXJuIHJ0cHJlZl9zdHJbKCh2ICYgTkRfUkFfRkxBR19SVFBSRUZfTUFTSykgPj4gMykgJiAweGZmXTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X2xpZmV0aW1lKHVfaW50MzJfdCB2KQotewotCXN0YXRpYyBjaGFyIGJ1ZlsyMF07Ci0KLQlpZiAodiA9PSAodV9pbnQzMl90KX4wVUwpCi0JCXJldHVybiAiaW5maW5pdHkiOwotCWVsc2UgewotCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCB2KTsKLQkJcmV0dXJuIGJ1ZjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9sbGFkZHIoY29uc3QgdV9pbnQ4X3QgKnAsIHNpemVfdCBsKQotewotCWNvbnN0IHVfaW50OF90ICplcCwgKnE7Ci0KLQlxID0gcDsKLQllcCA9IHAgKyBsOwotCXdoaWxlIChsID4gMCAmJiBxIDwgZXApIHsKLQkJaWYgKHEgPiBwKQotCQkJcHJpbnRmKCI6Iik7Ci0JCXByaW50ZigiJTAyeCIsICpxKyspOwotCQlsLS07Ci0JfQotfQotCi1zdGF0aWMgaW50IGljbXA2X2Nrc3VtKGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDYsIGNvbnN0IHN0cnVjdCBpY21wNl9oZHIgKmljcCwKLQl1X2ludCBsZW4pCi17Ci0Jc2l6ZV90IGk7Ci0JcmVnaXN0ZXIgY29uc3QgdV9pbnQxNl90ICpzcDsKLQl1X2ludDMyX3Qgc3VtOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCBpbjZfYWRkciBwaF9zcmM7Ci0JCQlzdHJ1Y3QgaW42X2FkZHIgcGhfZHN0OwotCQkJdV9pbnQzMl90CXBoX2xlbjsKLQkJCXVfaW50OF90CXBoX3plcm9bM107Ci0JCQl1X2ludDhfdAlwaF9ueHQ7Ci0JCX0gcGg7Ci0JCXVfaW50MTZfdCBwYVsyMF07Ci0JfSBwaHU7Ci0KLQkvKiBwc2V1ZG8taGVhZGVyICovCi0JbWVtc2V0KCZwaHUsIDAsIHNpemVvZihwaHUpKTsKLQlwaHUucGgucGhfc3JjID0gaXA2LT5pcDZfc3JjOwotCXBodS5waC5waF9kc3QgPSBpcDYtPmlwNl9kc3Q7Ci0JcGh1LnBoLnBoX2xlbiA9IGh0b25sKGxlbik7Ci0JcGh1LnBoLnBoX254dCA9IElQUFJPVE9fSUNNUFY2OwotCi0Jc3VtID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHBodS5wYSkgLyBzaXplb2YocGh1LnBhWzBdKTsgaSsrKQotCQlzdW0gKz0gcGh1LnBhW2ldOwotCi0Jc3AgPSAoY29uc3QgdV9pbnQxNl90ICopaWNwOwotCi0JZm9yIChpID0gMDsgaSA8IChsZW4gJiB+MSk7IGkgKz0gMikKLQkJc3VtICs9ICpzcCsrOwotCi0JaWYgKGxlbiAmIDEpCi0JCXN1bSArPSBodG9ucygoKihjb25zdCB1X2ludDhfdCAqKXNwKSA8PCA4KTsKLQotCXdoaWxlIChzdW0gPiAweGZmZmYpCi0JCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7Ci0Jc3VtID0gfnN1bSAmIDB4ZmZmZjsKLQotCXJldHVybiAoc3VtKTsKLX0KLQotdm9pZAotaWNtcDZfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLCBjb25zdCB1X2NoYXIgKmJwMiwgaW50IGZyYWdtZW50ZWQpCi17Ci0JY29uc3Qgc3RydWN0IGljbXA2X2hkciAqZHA7Ci0JY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwOwotCWNvbnN0IHN0cnVjdCBpcDZfaGRyICpvaXA7Ci0JY29uc3Qgc3RydWN0IHVkcGhkciAqb3VoOwotCWludCBkcG9ydDsKLQljb25zdCB1X2NoYXIgKmVwOwotCXVfaW50IHByb3Q7Ci0KLQlkcCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopYnA7Ci0JaXAgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7Ci0Jb2lwID0gKHN0cnVjdCBpcDZfaGRyICopKGRwICsgMSk7Ci0JLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KLQllcCA9IHNuYXBlbmQ7Ci0KLQlUQ0hFQ0soZHAtPmljbXA2X2Nrc3VtKTsKLQotCWlmICh2ZmxhZyAmJiAhZnJhZ21lbnRlZCkgewotCQlpbnQgc3VtID0gZHAtPmljbXA2X2Nrc3VtOwotCi0JCWlmIChUVEVTVDIoYnBbMF0sIGxlbmd0aCkpIHsKLQkJCXN1bSA9IGljbXA2X2Nrc3VtKGlwLCBkcCwgbGVuZ3RoKTsKLQkJCWlmIChzdW0gIT0gMCkKLQkJCQkodm9pZClwcmludGYoIltiYWQgaWNtcDYgY2tzdW0gJXghXSAiLCBzdW0pOwotCQkJZWxzZQotCQkJCSh2b2lkKXByaW50ZigiW2ljbXA2IHN1bSBva10gIik7Ci0JCX0KLQl9Ci0KLSAgICAgICAgcHJpbnRmKCJJQ01QNiwgJXMiLCB0b2syc3RyKGljbXA2X3R5cGVfdmFsdWVzLCJ1bmtub3duIGljbXA2IHR5cGUgKCV1KSIsZHAtPmljbXA2X3R5cGUpKTsKLQotICAgICAgICAvKiBkaXNwbGF5IGNvc21ldGljczogcHJpbnQgdGhlIHBhY2tldCBsZW5ndGggZm9yIHByaW50ZXIgdGhhdCB1c2UgdGhlIHZmbGFnIG5vdyAqLwotICAgICAgICBpZiAodmZsYWcgJiYgKGRwLT5pY21wNl90eXBlID09Ci0gICAgICAgICAgICAgICAgICAgICAgTkRfUk9VVEVSX1NPTElDSVQgfHwKLSAgICAgICAgICAgICAgICAgICAgICBORF9ST1VURVJfQURWRVJUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgTkRfTkVJR0hCT1JfQURWRVJUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgTkRfTkVJR0hCT1JfU09MSUNJVCB8fAotICAgICAgICAgICAgICAgICAgICAgIE5EX1JFRElSRUNUIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgSUNNUDZfSEFESVNDT1ZfUkVQTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgICBJQ01QNl9NT0JJTEVQUkVGSVhfQURWRVJUICkpCi0gICAgICAgICAgICBwcmludGYoIiwgbGVuZ3RoICV1IiwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAKLQlzd2l0Y2ggKGRwLT5pY21wNl90eXBlKSB7Ci0JY2FzZSBJQ01QNl9EU1RfVU5SRUFDSDoKLQkJVENIRUNLKG9pcC0+aXA2X2RzdCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzIiwgdG9rMnN0cihpY21wNl9kc3RfdW5yZWFjaF9jb2RlX3ZhbHVlcywidW5rbm93biB1bnJlYWNoIGNvZGUgKCV1KSIsZHAtPmljbXA2X2NvZGUpKTsKLQkJc3dpdGNoIChkcC0+aWNtcDZfY29kZSkgewotCi0JCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9ST1VURTogLyogZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQURNSU46Ci0JCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICVzIixpcDZhZGRyX3N0cmluZygmb2lwLT5pcDZfZHN0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9CRVlPTkRTQ09QRToKLQkJCXByaW50ZigiICVzLCBzb3VyY2UgYWRkcmVzcyAlcyIsCi0JCQkgICAgICAgaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCksCi0JCQkgICAgICAgaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X3NyYykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfTk9QT1JUOgotCQkJaWYgKChvdWggPSBnZXRfdXBwZXJsYXllcigodV9jaGFyICopb2lwLCAmcHJvdCkpCi0JCQkgICAgPT0gTlVMTCkKLQkJCQlnb3RvIHRydW5jOwotCi0JCQlkcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZvdWgtPnVoX2Rwb3J0KTsKLQkJCXN3aXRjaCAocHJvdCkgewotCQkJY2FzZSBJUFBST1RPX1RDUDoKLQkJCQlwcmludGYoIiwgJXMgdGNwIHBvcnQgJXMiLAotCQkJCQlpcDZhZGRyX3N0cmluZygmb2lwLT5pcDZfZHN0KSwKLQkJCQkJdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVBQUk9UT19VRFA6Ci0JCQkJcHJpbnRmKCIsICVzIHVkcCBwb3J0ICVzIiwKLQkJCQkJaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCksCi0JCQkJCXVkcHBvcnRfc3RyaW5nKGRwb3J0KSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiLCAlcyBwcm90b2NvbCAlZCBwb3J0ICVkIHVucmVhY2hhYmxlIiwKLQkJCQkJaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCksCi0JCQkJCW9pcC0+aXA2X254dCwgZHBvcnQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGJwLCJcblx0IixsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElDTVA2X1BBQ0tFVF9UT09fQklHOgotCQlUQ0hFQ0soZHAtPmljbXA2X210dSk7Ci0JCXByaW50ZigiLCBtdHUgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X210dSkpOwotCQlicmVhazsKLQljYXNlIElDTVA2X1RJTUVfRVhDRUVERUQ6Ci0JCVRDSEVDSyhvaXAtPmlwNl9kc3QpOwotCQlzd2l0Y2ggKGRwLT5pY21wNl9jb2RlKSB7Ci0JCWNhc2UgSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVDoKLQkJCXByaW50ZigiIGZvciAlcyIsCi0JCQkJaXA2YWRkcl9zdHJpbmcoJm9pcC0+aXA2X2RzdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUNNUDZfVElNRV9FWENFRURfUkVBU1NFTUJMWToKLQkJCXByaW50ZigiIChyZWFzc2VtYmx5KSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoIiwgdW5rbm93biBjb2RlICgldSkiLCBkcC0+aWNtcDZfY29kZSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElDTVA2X1BBUkFNX1BST0I6Ci0JCVRDSEVDSyhvaXAtPmlwNl9kc3QpOwotCQlzd2l0Y2ggKGRwLT5pY21wNl9jb2RlKSB7Ci0JCWNhc2UgSUNNUDZfUEFSQU1QUk9CX0hFQURFUjoKLQkJCXByaW50ZigiLCBlcnJvcm5lb3VzIC0gb2N0ZXQgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X3BwdHIpKTsKLQkJCWJyZWFrOwotCQljYXNlIElDTVA2X1BBUkFNUFJPQl9ORVhUSEVBREVSOgotCQkJcHJpbnRmKCIsIG5leHQgaGVhZGVyIC0gb2N0ZXQgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X3BwdHIpKTsKLQkJCWJyZWFrOwotCQljYXNlIElDTVA2X1BBUkFNUFJPQl9PUFRJT046Ci0JCQlwcmludGYoIiwgb3B0aW9uIC0gb2N0ZXQgJXUiLCBFWFRSQUNUXzMyQklUUygmZHAtPmljbXA2X3BwdHIpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRmKCIsIGNvZGUtIyVkIiwKLQkJCSAgICAgICBkcC0+aWNtcDZfY29kZSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQljYXNlIElDTVA2X0VDSE9fUkVRVUVTVDoKLQljYXNlIElDTVA2X0VDSE9fUkVQTFk6Ci0JCVRDSEVDSyhkcC0+aWNtcDZfc2VxKTsKLQkJcHJpbnRmKCIsIHNlcSAldSIsIEVYVFJBQ1RfMTZCSVRTKCZkcC0+aWNtcDZfc2VxKSk7Ci0JCWJyZWFrOwotCWNhc2UgSUNNUDZfTUVNQkVSU0hJUF9RVUVSWToKLQkJaWYgKGxlbmd0aCA9PSBNTERfTUlOTEVOKSB7Ci0JCQltbGQ2X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCk7Ci0JCX0gZWxzZSBpZiAobGVuZ3RoID49IE1MRFYyX01JTkxFTikgewotCQkJcHJpbnRmKCJ2MiAiKTsKLQkJCW1sZHYyX3F1ZXJ5X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ZigiIHVua25vd24tdmVyc2lvbiAobGVuICV1KSAiLCBsZW5ndGgpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSUNNUDZfTUVNQkVSU0hJUF9SRVBPUlQ6Ci0JCW1sZDZfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwKTsKLQkJYnJlYWs7Ci0JY2FzZSBJQ01QNl9NRU1CRVJTSElQX1JFRFVDVElPTjoKLQkJbWxkNl9wcmludCgoY29uc3QgdV9jaGFyICopZHApOwotCQlicmVhazsKLQljYXNlIE5EX1JPVVRFUl9TT0xJQ0lUOgotI2RlZmluZSBSVFNPTExFTiA4Ci0JCWlmICh2ZmxhZykgewotCQkJaWNtcDZfb3B0X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCArIFJUU09MTEVOLAotCQkJCQlsZW5ndGggLSBSVFNPTExFTik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBORF9ST1VURVJfQURWRVJUOgotI2RlZmluZSBSVEFEVkxFTiAxNgotCQlpZiAodmZsYWcpIHsKLQkJCXN0cnVjdCBuZF9yb3V0ZXJfYWR2ZXJ0ICpwOwotCi0JCQlwID0gKHN0cnVjdCBuZF9yb3V0ZXJfYWR2ZXJ0ICopZHA7Ci0JCQlUQ0hFQ0socC0+bmRfcmFfcmV0cmFuc21pdCk7Ci0JCQlwcmludGYoIlxuXHRob3AgbGltaXQgJXUsIEZsYWdzIFslc10iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBwcmVmICVzLCByb3V0ZXIgbGlmZXRpbWUgJXVzLCByZWFjaGFibGUgdGltZSAldXMsIHJldHJhbnMgdGltZSAldXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1X2ludClwLT5uZF9yYV9jdXJob3BsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGljbXA2X29wdF9yYV9mbGFnX3ZhbHVlcywibm9uZSIsKHAtPm5kX3JhX2ZsYWdzX3Jlc2VydmVkKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3J0cHJlZihwLT5uZF9yYV9mbGFnc19yZXNlcnZlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnAtPm5kX3JhX3JvdXRlcl9saWZldGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnAtPm5kX3JhX3JlYWNoYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnAtPm5kX3JhX3JldHJhbnNtaXQpKTsKLQotCQkJaWNtcDZfb3B0X3ByaW50KChjb25zdCB1X2NoYXIgKilkcCArIFJUQURWTEVOLAotCQkJCQlsZW5ndGggLSBSVEFEVkxFTik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBORF9ORUlHSEJPUl9TT0xJQ0lUOgotCSAgICB7Ci0JCXN0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0ICpwOwotCQlwID0gKHN0cnVjdCBuZF9uZWlnaGJvcl9zb2xpY2l0ICopZHA7Ci0JCVRDSEVDSyhwLT5uZF9uc190YXJnZXQpOwotCQlwcmludGYoIiwgd2hvIGhhcyAlcyIsIGlwNmFkZHJfc3RyaW5nKCZwLT5uZF9uc190YXJnZXQpKTsKLQkJaWYgKHZmbGFnKSB7Ci0jZGVmaW5lIE5EU09MTEVOIDI0Ci0JCQlpY21wNl9vcHRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwICsgTkRTT0xMRU4sCi0JCQkJCWxlbmd0aCAtIE5EU09MTEVOKTsKLQkJfQotCSAgICB9Ci0JCWJyZWFrOwotCWNhc2UgTkRfTkVJR0hCT1JfQURWRVJUOgotCSAgICB7Ci0JCXN0cnVjdCBuZF9uZWlnaGJvcl9hZHZlcnQgKnA7Ci0KLQkJcCA9IChzdHJ1Y3QgbmRfbmVpZ2hib3JfYWR2ZXJ0ICopZHA7Ci0JCVRDSEVDSyhwLT5uZF9uYV90YXJnZXQpOwotCQlwcmludGYoIiwgdGd0IGlzICVzIiwKLQkJCWlwNmFkZHJfc3RyaW5nKCZwLT5uZF9uYV90YXJnZXQpKTsKLQkJaWYgKHZmbGFnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgRmxhZ3MgWyVzXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihpY21wNl9uZF9uYV9mbGFnX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZwLT5uZF9uYV9mbGFnc19yZXNlcnZlZCkpKTsKLSNkZWZpbmUgTkRBRFZMRU4gMjQKLQkJCWljbXA2X29wdF9wcmludCgoY29uc3QgdV9jaGFyICopZHAgKyBOREFEVkxFTiwKLQkJCQkJbGVuZ3RoIC0gTkRBRFZMRU4pOwotI3VuZGVmIE5EQURWTEVOCi0JCX0KLQkgICAgfQotCQlicmVhazsKLQljYXNlIE5EX1JFRElSRUNUOgotI2RlZmluZSBSRFIoaSkgKChzdHJ1Y3QgbmRfcmVkaXJlY3QgKikoaSkpCi0JCVRDSEVDSyhSRFIoZHApLT5uZF9yZF9kc3QpOwotCQlwcmludGYoIiwgJXMiLCBnZXRuYW1lNigoY29uc3QgdV9jaGFyICopJlJEUihkcCktPm5kX3JkX2RzdCkpOwotCQlUQ0hFQ0soUkRSKGRwKS0+bmRfcmRfdGFyZ2V0KTsKLQkJcHJpbnRmKCIgdG8gJXMiLAotCQkgICAgZ2V0bmFtZTYoKGNvbnN0IHVfY2hhciopJlJEUihkcCktPm5kX3JkX3RhcmdldCkpOwotI2RlZmluZSBSRURJUkVDVExFTiA0MAotCQlpZiAodmZsYWcpIHsKLQkJCWljbXA2X29wdF9wcmludCgoY29uc3QgdV9jaGFyICopZHAgKyBSRURJUkVDVExFTiwKLQkJCQkJbGVuZ3RoIC0gUkVESVJFQ1RMRU4pOwotCQl9Ci0JCWJyZWFrOwotI3VuZGVmIFJFRElSRUNUTEVOCi0jdW5kZWYgUkRSCi0JY2FzZSBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkc6Ci0JCWljbXA2X3JyZW51bV9wcmludChicCwgZXApOwotCQlicmVhazsKLQljYXNlIElDTVA2X05JX1FVRVJZOgotCWNhc2UgSUNNUDZfTklfUkVQTFk6Ci0JCWljbXA2X25vZGVpbmZvX3ByaW50KGxlbmd0aCwgYnAsIGVwKTsKLQkJYnJlYWs7Ci0JY2FzZSBJTkRfU09MSUNJVDoKLQljYXNlIElORF9BRFZFUlQ6Ci0JCWJyZWFrOwotCWNhc2UgSUNNUDZfVjJfTUVNQkVSU0hJUF9SRVBPUlQ6Ci0JCW1sZHYyX3JlcG9ydF9wcmludCgoY29uc3QgdV9jaGFyICopIGRwLCBsZW5ndGgpOwotCQlicmVhazsKLQljYXNlIElDTVA2X01PQklMRVBSRUZJWF9TT0xJQ0lUOiAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIElDTVA2X0hBRElTQ09WX1JFUVVFU1Q6Ci0gICAgICAgICAgICAgICAgVENIRUNLKGRwLT5pY21wNl9kYXRhMTZbMF0pOwotICAgICAgICAgICAgICAgIHByaW50ZigiLCBpZCAweCUwNHgiLCBFWFRSQUNUXzE2QklUUygmZHAtPmljbXA2X2RhdGExNlswXSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCWNhc2UgSUNNUDZfSEFESVNDT1ZfUkVQTFk6Ci0JCWlmICh2ZmxhZykgewotCQkJc3RydWN0IGluNl9hZGRyICppbjY7Ci0JCQl1X2NoYXIgKmNwOwotCi0JCQlUQ0hFQ0soZHAtPmljbXA2X2RhdGExNlswXSk7Ci0JCQlwcmludGYoIiwgaWQgMHglMDR4IiwgRVhUUkFDVF8xNkJJVFMoJmRwLT5pY21wNl9kYXRhMTZbMF0pKTsKLQkJCWNwID0gKHVfY2hhciAqKWRwICsgbGVuZ3RoOwotCQkJaW42ID0gKHN0cnVjdCBpbjZfYWRkciAqKShkcCArIDEpOwotCQkJZm9yICg7ICh1X2NoYXIgKilpbjYgPCBjcDsgaW42KyspIHsKLQkJCQlUQ0hFQ0soKmluNik7Ci0JCQkJcHJpbnRmKCIsICVzIiwgaXA2YWRkcl9zdHJpbmcoaW42KSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJQ01QNl9NT0JJTEVQUkVGSVhfQURWRVJUOgotCQlpZiAodmZsYWcpIHsKLQkJCVRDSEVDSyhkcC0+aWNtcDZfZGF0YTE2WzBdKTsKLQkJCXByaW50ZigiLCBpZCAweCUwNHgiLCBFWFRSQUNUXzE2QklUUygmZHAtPmljbXA2X2RhdGExNlswXSkpOwotCQkJaWYgKGRwLT5pY21wNl9kYXRhMTZbMV0gJiAweGMwKQotCQkJCXByaW50ZigiICIpOwotCQkJaWYgKGRwLT5pY21wNl9kYXRhMTZbMV0gJiAweDgwKQotCQkJCXByaW50ZigiTSIpOwotCQkJaWYgKGRwLT5pY21wNl9kYXRhMTZbMV0gJiAweDQwKQotCQkJCXByaW50ZigiTyIpOwotI2RlZmluZSBNUEFEVkxFTiA4Ci0JCQlpY21wNl9vcHRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwICsgTVBBRFZMRU4sCi0JCQkJCWxlbmd0aCAtIE1QQURWTEVOKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICAgICAgIHByaW50ZigiLCBsZW5ndGggJXUiLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoYnAsIlxuXHQiLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXZmbGFnKQotICAgICAgICAgICAgcHJpbnRmKCIsIGxlbmd0aCAldSIsIGxlbmd0aCk7IAotCXJldHVybjsKLXRydW5jOgotCWZwdXRzKCJbfGljbXA2XSIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdWRwaGRyICoKLWdldF91cHBlcmxheWVyKHVfY2hhciAqYnAsIHVfaW50ICpwcm90KQotewotCWNvbnN0IHVfY2hhciAqZXA7Ci0Jc3RydWN0IGlwNl9oZHIgKmlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwOwotCXN0cnVjdCB1ZHBoZHIgKnVoOwotCXN0cnVjdCBpcDZfaGJoICpoYmg7Ci0Jc3RydWN0IGlwNl9mcmFnICpmcmFnaDsKLQlzdHJ1Y3QgYWggKmFoOwotCXVfaW50IG5oOwotCWludCBobGVuOwotCi0JLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KLQllcCA9IHNuYXBlbmQ7Ci0KLQlpZiAoIVRURVNUKGlwNi0+aXA2X254dCkpCi0JCXJldHVybiBOVUxMOwotCi0JbmggPSBpcDYtPmlwNl9ueHQ7Ci0JaGxlbiA9IHNpemVvZihzdHJ1Y3QgaXA2X2hkcik7Ci0KLQl3aGlsZSAoYnAgPCBlcCkgewotCQlicCArPSBobGVuOwotCi0JCXN3aXRjaChuaCkgewotCQljYXNlIElQUFJPVE9fVURQOgotCQljYXNlIElQUFJPVE9fVENQOgotCQkJdWggPSAoc3RydWN0IHVkcGhkciAqKWJwOwotCQkJaWYgKFRURVNUKHVoLT51aF9kcG9ydCkpIHsKLQkJCQkqcHJvdCA9IG5oOwotCQkJCXJldHVybih1aCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJcmV0dXJuKE5VTEwpOwotCQkJLyogTk9UUkVBQ0hFRCAqLwotCi0JCWNhc2UgSVBQUk9UT19IT1BPUFRTOgotCQljYXNlIElQUFJPVE9fRFNUT1BUUzoKLQkJY2FzZSBJUFBST1RPX1JPVVRJTkc6Ci0JCQloYmggPSAoc3RydWN0IGlwNl9oYmggKilicDsKLQkJCWlmICghVFRFU1QoaGJoLT5pcDZoX2xlbikpCi0JCQkJcmV0dXJuKE5VTEwpOwotCQkJbmggPSBoYmgtPmlwNmhfbnh0OwotCQkJaGxlbiA9IChoYmgtPmlwNmhfbGVuICsgMSkgPDwgMzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBQUk9UT19GUkFHTUVOVDogLyogdGhpcyBzaG91bGQgYmUgb2RkLCBidXQgdHJ5IGFueXdheSAqLwotCQkJZnJhZ2ggPSAoc3RydWN0IGlwNl9mcmFnICopYnA7Ci0JCQlpZiAoIVRURVNUKGZyYWdoLT5pcDZmX29mZmxnKSkKLQkJCQlyZXR1cm4oTlVMTCk7Ci0JCQkvKiBmcmFnbWVudHMgd2l0aCBub24temVybyBvZmZzZXQgYXJlIG1lYW5pbmdsZXNzICovCi0JCQlpZiAoKEVYVFJBQ1RfMTZCSVRTKCZmcmFnaC0+aXA2Zl9vZmZsZykgJiBJUDZGX09GRl9NQVNLKSAhPSAwKQotCQkJCXJldHVybihOVUxMKTsKLQkJCW5oID0gZnJhZ2gtPmlwNmZfbnh0OwotCQkJaGxlbiA9IHNpemVvZihzdHJ1Y3QgaXA2X2ZyYWcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUFBST1RPX0FIOgotCQkJYWggPSAoc3RydWN0IGFoICopYnA7Ci0JCQlpZiAoIVRURVNUKGFoLT5haF9sZW4pKQotCQkJCXJldHVybihOVUxMKTsKLQkJCW5oID0gYWgtPmFoX254dDsKLQkJCWhsZW4gPSAoYWgtPmFoX2xlbiArIDIpIDw8IDI7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgkvKiB1bmtub3duIG9yIHVuZGVjb2RhYmxlIGhlYWRlciAqLwotCQkJKnByb3QgPSBuaDsgLyogbWVhbmluZ2xlc3MsIGJ1dCBzZXQgaGVyZSBhbnl3YXkgKi8KLQkJCXJldHVybihOVUxMKTsKLQkJfQotCX0KLQotCXJldHVybihOVUxMKTsJCS8qIHNob3VsZCBiZSBub3RyZWFjaGVkLCB0aG91Z2ggKi8KLX0KLQotc3RhdGljIHZvaWQKLWljbXA2X29wdF9wcmludChjb25zdCB1X2NoYXIgKmJwLCBpbnQgcmVzaWQpCi17Ci0JY29uc3Qgc3RydWN0IG5kX29wdF9oZHIgKm9wOwotCWNvbnN0IHN0cnVjdCBuZF9vcHRfaGRyICpvcGw7CS8qIHdoeSB0aGVyZSdzIG5vIHN0cnVjdD8gKi8KLQljb25zdCBzdHJ1Y3QgbmRfb3B0X3ByZWZpeF9pbmZvICpvcHA7Ci0JY29uc3Qgc3RydWN0IGljbXA2X29wdHNfcmVkaXJlY3QgKm9wcjsKLQljb25zdCBzdHJ1Y3QgbmRfb3B0X210dSAqb3BtOwotCWNvbnN0IHN0cnVjdCBuZF9vcHRfYWR2aW50ZXJ2YWwgKm9wYTsKLQljb25zdCBzdHJ1Y3QgbmRfb3B0X2hvbWVhZ2VudF9pbmZvICpvcGg7Ci0JY29uc3Qgc3RydWN0IG5kX29wdF9yb3V0ZV9pbmZvICpvcHJpOwotCWNvbnN0IHVfY2hhciAqY3AsICplcDsKLQlzdHJ1Y3QgaW42X2FkZHIgaW42LCAqaW42cDsKLQlzaXplX3QgbDsKLQotI2RlZmluZSBFQ0hFQ0sodmFyKSBpZiAoKHVfY2hhciAqKSYodmFyKSA+IGVwIC0gc2l6ZW9mKHZhcikpIHJldHVybgotCi0JY3AgPSBicDsKLQkvKiAnZXAnIHBvaW50cyB0byB0aGUgZW5kIG9mIGF2YWlsYWJsZSBkYXRhLiAqLwotCWVwID0gc25hcGVuZDsKLQotCXdoaWxlIChjcCA8IGVwKSB7Ci0JCW9wID0gKHN0cnVjdCBuZF9vcHRfaGRyICopY3A7Ci0KLQkJRUNIRUNLKG9wLT5uZF9vcHRfbGVuKTsKLQkJaWYgKHJlc2lkIDw9IDApCi0JCQlyZXR1cm47Ci0JCWlmIChvcC0+bmRfb3B0X2xlbiA9PSAwKQotCQkJZ290byB0cnVuYzsKLQkJaWYgKGNwICsgKG9wLT5uZF9vcHRfbGVuIDw8IDMpID4gZXApCi0JCQlnb3RvIHRydW5jOwotCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBvcHRpb24gKCV1KSwgbGVuZ3RoICV1ICgldSk6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaWNtcDZfb3B0X3ZhbHVlcywgInVua25vd24iLCBvcC0+bmRfb3B0X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICBvcC0+bmRfb3B0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZF9vcHRfbGVuIDw8IDMsCi0gICAgICAgICAgICAgICAgICAgICAgIG9wLT5uZF9vcHRfbGVuKTsKLQotCQlzd2l0Y2ggKG9wLT5uZF9vcHRfdHlwZSkgewotCQljYXNlIE5EX09QVF9TT1VSQ0VfTElOS0FERFI6Ci0JCQlvcGwgPSAoc3RydWN0IG5kX29wdF9oZHIgKilvcDsKLQkJCWwgPSAob3AtPm5kX29wdF9sZW4gPDwgMykgLSAyOwotCQkJcHJpbnRfbGxhZGRyKGNwICsgMiwgbCk7Ci0JCQlicmVhazsKLQkJY2FzZSBORF9PUFRfVEFSR0VUX0xJTktBRERSOgotCQkJb3BsID0gKHN0cnVjdCBuZF9vcHRfaGRyICopb3A7Ci0JCQlsID0gKG9wLT5uZF9vcHRfbGVuIDw8IDMpIC0gMjsKLQkJCXByaW50X2xsYWRkcihjcCArIDIsIGwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkRfT1BUX1BSRUZJWF9JTkZPUk1BVElPTjoKLQkJCW9wcCA9IChzdHJ1Y3QgbmRfb3B0X3ByZWZpeF9pbmZvICopb3A7Ci0JCQlUQ0hFQ0sob3BwLT5uZF9vcHRfcGlfcHJlZml4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMvJXUlcywgRmxhZ3MgWyVzXSwgdmFsaWQgdGltZSAlc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKCZvcHAtPm5kX29wdF9waV9wcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wcC0+bmRfb3B0X3BpX3ByZWZpeF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wLT5uZF9vcHRfbGVuICE9IDQpID8gImJhZGxlbiIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGljbXA2X29wdF9waV9mbGFnX3ZhbHVlcywgIm5vbmUiLCBvcHAtPm5kX29wdF9waV9mbGFnc19yZXNlcnZlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2xpZmV0aW1lKEVYVFJBQ1RfMzJCSVRTKCZvcHAtPm5kX29wdF9waV92YWxpZF90aW1lKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIHByZWYuIHRpbWUgJXNzIiwgZ2V0X2xpZmV0aW1lKEVYVFJBQ1RfMzJCSVRTKCZvcHAtPm5kX29wdF9waV9wcmVmZXJyZWRfdGltZSkpKTsKLQkJCWJyZWFrOwotCQljYXNlIE5EX09QVF9SRURJUkVDVEVEX0hFQURFUjoKLQkJCW9wciA9IChzdHJ1Y3QgaWNtcDZfb3B0c19yZWRpcmVjdCAqKW9wOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGJwLCJcblx0ICAgICIsb3AtPm5kX29wdF9sZW48PDMpOwotCQkJLyogeHh4ICovCi0JCQlicmVhazsKLQkJY2FzZSBORF9PUFRfTVRVOgotCQkJb3BtID0gKHN0cnVjdCBuZF9vcHRfbXR1ICopb3A7Ci0JCQlUQ0hFQ0sob3BtLT5uZF9vcHRfbXR1X210dSk7Ci0JCQlwcmludGYoIiAldSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmb3BtLT5uZF9vcHRfbXR1X210dSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wLT5uZF9vcHRfbGVuICE9IDEpID8gImJhZCBvcHRpb24gbGVuZ3RoIiA6ICIiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJY2FzZSBORF9PUFRfQURWSU5URVJWQUw6Ci0JCQlvcGEgPSAoc3RydWN0IG5kX29wdF9hZHZpbnRlcnZhbCAqKW9wOwotCQkJVENIRUNLKG9wYS0+bmRfb3B0X2Fkdl9pbnRlcnZhbCk7Ci0JCQlwcmludGYoIiAldXMiLCBFWFRSQUNUXzMyQklUUygmb3BhLT5uZF9vcHRfYWR2X2ludGVydmFsKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBORF9PUFRfSE9NRUFHRU5UX0lORk86Ci0JCQlvcGggPSAoc3RydWN0IG5kX29wdF9ob21lYWdlbnRfaW5mbyAqKW9wOwotCQkJVENIRUNLKG9waC0+bmRfb3B0X2hhaV9saWZldGltZSk7Ci0JCQlwcmludGYoIiBwcmVmZXJlbmNlICV1LCBsaWZldGltZSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJm9waC0+bmRfb3B0X2hhaV9wcmVmZXJlbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmb3BoLT5uZF9vcHRfaGFpX2xpZmV0aW1lKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBORF9PUFRfUk9VVEVfSU5GTzoKLQkJCW9wcmkgPSAoc3RydWN0IG5kX29wdF9yb3V0ZV9pbmZvICopb3A7Ci0JCQlUQ0hFQ0sob3ByaS0+bmRfb3B0X3J0aV9saWZldGltZSk7Ci0JCQltZW1zZXQoJmluNiwgMCwgc2l6ZW9mKGluNikpOwotCQkJaW42cCA9IChzdHJ1Y3QgaW42X2FkZHIgKikob3ByaSArIDEpOwotCQkJc3dpdGNoIChvcC0+bmRfb3B0X2xlbikgewotCQkJY2FzZSAxOgotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCVRDSEVDSzIoKmluNnAsIDgpOwotCQkJCW1lbWNweSgmaW42LCBvcHJpICsgMSwgOCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJVENIRUNLKCppbjZwKTsKLQkJCQltZW1jcHkoJmluNiwgb3ByaSArIDEsIHNpemVvZihpbjYpKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZ290byB0cnVuYzsKLQkJCX0KLQkJCXByaW50ZigiICVzLyV1IiwgaXA2YWRkcl9zdHJpbmcoJmluNiksCi0JCQkgICAgb3ByaS0+bmRfb3B0X3J0aV9wcmVmaXhsZW4pOwotCQkJcHJpbnRmKCIsIHByZWY9JXMiLCBnZXRfcnRwcmVmKG9wcmktPm5kX29wdF9ydGlfZmxhZ3MpKTsKLQkJCXByaW50ZigiLCBsaWZldGltZT0lcyIsCi0JCQkgICAgZ2V0X2xpZmV0aW1lKEVYVFJBQ1RfMzJCSVRTKCZvcHJpLT5uZF9vcHRfcnRpX2xpZmV0aW1lKSkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShjcCsyLCJcblx0ICAiLCAob3AtPm5kX29wdF9sZW4gPDwgMykgLSAyKTsgLyogc2tpcCBvcHRpb24gaGVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCX0KLSAgICAgICAgICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsIGhleGR1bXAgPyAqLwotICAgICAgICAgICAgICAgIGlmICh2ZmxhZz4gMSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGNwKzIsIlxuXHQgICAgIiwgKG9wLT5uZF9vcHRfbGVuIDw8IDMpIC0gMik7IC8qIHNraXAgb3B0aW9uIGhlYWRlciAqLwotCi0JCWNwICs9IG9wLT5uZF9vcHRfbGVuIDw8IDM7Ci0JCXJlc2lkIC09IG9wLT5uZF9vcHRfbGVuIDw8IDM7Ci0JfQotCXJldHVybjsKLQotIHRydW5jOgotCWZwdXRzKCJbbmRwIG9wdF0iLCBzdGRvdXQpOwotCXJldHVybjsKLSN1bmRlZiBFQ0hFQ0sKLX0KLQotc3RhdGljIHZvaWQKLW1sZDZfcHJpbnQoY29uc3QgdV9jaGFyICpicCkKLXsKLQlzdHJ1Y3QgbWxkNl9oZHIgKm1wID0gKHN0cnVjdCBtbGQ2X2hkciAqKWJwOwotCWNvbnN0IHVfY2hhciAqZXA7Ci0KLQkvKiAnZXAnIHBvaW50cyB0byB0aGUgZW5kIG9mIGF2YWlsYWJsZSBkYXRhLiAqLwotCWVwID0gc25hcGVuZDsKLQotCWlmICgodV9jaGFyICopbXAgKyBzaXplb2YoKm1wKSA+IGVwKQotCQlyZXR1cm47Ci0KLQlwcmludGYoIm1heCByZXNwIGRlbGF5OiAlZCAiLCBFWFRSQUNUXzE2QklUUygmbXAtPm1sZDZfbWF4ZGVsYXkpKTsKLQlwcmludGYoImFkZHI6ICVzIiwgaXA2YWRkcl9zdHJpbmcoJm1wLT5tbGQ2X2FkZHIpKTsKLX0KLQotc3RhdGljIHZvaWQKLW1sZHYyX3JlcG9ydF9wcmludChjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW4pCi17Ci0gICAgc3RydWN0IGljbXA2X2hkciAqaWNwID0gKHN0cnVjdCBpY21wNl9oZHIgKikgYnA7Ci0gICAgdV9pbnQgZ3JvdXAsIG5zcmNzLCBuZ3JvdXBzOwotICAgIHVfaW50IGksIGo7Ci0KLSAgICAvKiBNaW5pbXVtIGxlbiBpcyA4ICovCi0gICAgaWYgKGxlbiA8IDgpIHsKLQlwcmludGYoIiBbaW52YWxpZCBsZW4gJWRdIiwgbGVuKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgVENIRUNLKGljcC0+aWNtcDZfZGF0YTE2WzFdKTsKLSAgICBuZ3JvdXBzID0gbnRvaHMoaWNwLT5pY21wNl9kYXRhMTZbMV0pOwotICAgIHByaW50ZigiLCAlZCBncm91cCByZWNvcmQocykiLCBuZ3JvdXBzKTsKLSAgICBpZiAodmZsYWcgPiAwKSB7Ci0JLyogUHJpbnQgdGhlIGdyb3VwIHJlY29yZHMgKi8KLQlncm91cCA9IDg7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKLQkgICAgLyogdHlwZSgxKSArIGF1eGxlbigxKSArIG51bXNyYygyKSArIGdycCgxNikgKi8KLQkgICAgaWYgKGxlbiA8IGdyb3VwICsgMjApIHsKLQkJcHJpbnRmKCIgW2ludmFsaWQgbnVtYmVyIG9mIGdyb3Vwc10iKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0gICAgICAgICAgICBUQ0hFQ0syKGJwW2dyb3VwICsgNF0sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLSAgICAgICAgICAgIHByaW50ZigiIFtnYWRkciAlcyIsIGlwNmFkZHJfc3RyaW5nKCZicFtncm91cCArIDRdKSk7Ci0JICAgIHByaW50ZigiICVzIiwgdG9rMnN0cihtbGR2MnJlcG9ydDJzdHIsICIgW3YyLXJlcG9ydC0jJWRdIiwKLQkJCQkJCQkJYnBbZ3JvdXBdKSk7Ci0gICAgICAgICAgICBuc3JjcyA9IChicFtncm91cCArIDJdIDw8IDgpICsgYnBbZ3JvdXAgKyAzXTsKLQkgICAgLyogQ2hlY2sgdGhlIG51bWJlciBvZiBzb3VyY2VzIGFuZCBwcmludCB0aGVtICovCi0JICAgIGlmIChsZW4gPCBncm91cCArIDIwICsgKG5zcmNzICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKSB7Ci0JCXByaW50ZigiIFtpbnZhbGlkIG51bWJlciBvZiBzb3VyY2VzICVkXSIsIG5zcmNzKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0gICAgICAgICAgICBpZiAodmZsYWcgPT0gMSkKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgJWQgc291cmNlKHMpIiwgbnNyY3MpOwotICAgICAgICAgICAgZWxzZSB7Ci0JCS8qIFByaW50IHRoZSBzb3VyY2VzICovCi0gICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIgeyIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuc3JjczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoYnBbZ3JvdXAgKyAyMCArIGogKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwotCQkgICAgcHJpbnRmKCIgJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbZ3JvdXAgKyAyMCArIGogKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKV0pKTsKLQkJfQotICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiIH0iKTsKLSAgICAgICAgICAgIH0KLQkgICAgLyogTmV4dCBncm91cCByZWNvcmQgKi8KLSAgICAgICAgICAgIGdyb3VwICs9IDIwICsgbnNyY3MgKiBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKLQkgICAgcHJpbnRmKCJdIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgKHZvaWQpcHJpbnRmKCJbfGljbXA2XSIpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLW1sZHYyX3F1ZXJ5X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbikKLXsKLSAgICBzdHJ1Y3QgaWNtcDZfaGRyICppY3AgPSAoc3RydWN0IGljbXA2X2hkciAqKSBicDsKLSAgICB1X2ludCBtcmM7Ci0gICAgaW50IG1ydCwgcXFpOwotICAgIHVfaW50IG5zcmNzOwotICAgIHJlZ2lzdGVyIHVfaW50IGk7Ci0KLSAgICAvKiBNaW5pbXVtIGxlbiBpcyAyOCAqLwotICAgIGlmIChsZW4gPCAyOCkgewotCXByaW50ZigiIFtpbnZhbGlkIGxlbiAlZF0iLCBsZW4pOwotCXJldHVybjsKLSAgICB9Ci0gICAgVENIRUNLKGljcC0+aWNtcDZfZGF0YTE2WzBdKTsKLSAgICBtcmMgPSBudG9ocyhpY3AtPmljbXA2X2RhdGExNlswXSk7Ci0gICAgaWYgKG1yYyA8IDMyNzY4KSB7Ci0JbXJ0ID0gbXJjOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1ydCA9ICgobXJjICYgMHgwZmZmKSB8IDB4MTAwMCkgPDwgKCgobXJjICYgMHg3MDAwKSA+PiAxMikgKyAzKTsKLSAgICB9Ci0gICAgaWYgKHZmbGFnKSB7Ci0JKHZvaWQpcHJpbnRmKCIgW21heCByZXNwIGRlbGF5PSVkXSIsIG1ydCk7Ci0gICAgfQotICAgIFRDSEVDSzIoYnBbOF0sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLSAgICBwcmludGYoIiBbZ2FkZHIgJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbOF0pKTsKLQotICAgIGlmICh2ZmxhZykgewotICAgICAgICBUQ0hFQ0soYnBbMjVdKTsKLQlpZiAoYnBbMjRdICYgMHgwOCkgewotCQlwcmludGYoIiBzZmxhZyIpOwotCX0KLQlpZiAoYnBbMjRdICYgMHgwNykgewotCQlwcmludGYoIiByb2J1c3RuZXNzPSVkIiwgYnBbMjRdICYgMHgwNyk7Ci0JfQotCWlmIChicFsyNV0gPCAxMjgpIHsKLQkJcXFpID0gYnBbMjVdOwotCX0gZWxzZSB7Ci0JCXFxaSA9ICgoYnBbMjVdICYgMHgwZikgfCAweDEwKSA8PCAoKChicFsyNV0gJiAweDcwKSA+PiA0KSArIDMpOwotCX0KLQlwcmludGYoIiBxcWk9JWQiLCBxcWkpOwotICAgIH0KLQotICAgIFRDSEVDSzIoYnBbMjZdLCAyKTsKLSAgICBuc3JjcyA9IG50b2hzKCoodV9zaG9ydCAqKSZicFsyNl0pOwotICAgIGlmIChuc3JjcyA+IDApIHsKLQlpZiAobGVuIDwgMjggKyBuc3JjcyAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQotCSAgICBwcmludGYoIiBbaW52YWxpZCBudW1iZXIgb2Ygc291cmNlc10iKTsKLQllbHNlIGlmICh2ZmxhZyA+IDEpIHsKLQkgICAgcHJpbnRmKCIgeyIpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgbnNyY3M7IGkrKykgewotCQlUQ0hFQ0syKGJwWzI4ICsgaSAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLQkJcHJpbnRmKCIgJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbMjggKyBpICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcildKSk7Ci0JICAgIH0KLQkgICAgcHJpbnRmKCIgfSIpOwotCX0gZWxzZQotCSAgICBwcmludGYoIiwgJWQgc291cmNlKHMpIiwgbnNyY3MpOwotICAgIH0KLSAgICBwcmludGYoIl0iKTsKLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICAodm9pZClwcmludGYoIlt8aWNtcDZdIik7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkCi1kbnNuYW1lX3ByaW50KGNvbnN0IHVfY2hhciAqY3AsIGNvbnN0IHVfY2hhciAqZXApCi17Ci0JaW50IGk7Ci0KLQkvKiBETlMgbmFtZSBkZWNvZGluZyAtIG5vIGRlY29tcHJlc3Npb24gKi8KLQlwcmludGYoIiwgXCIiKTsKLQl3aGlsZSAoY3AgPCBlcCkgewotCQlpID0gKmNwKys7Ci0JCWlmIChpKSB7Ci0JCQlpZiAoaSA+IGVwIC0gY3ApIHsKLQkJCQlwcmludGYoIj8/PyIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJd2hpbGUgKGktLSAmJiBjcCA8IGVwKSB7Ci0JCQkJc2FmZXB1dGNoYXIoKmNwKTsKLQkJCQljcCsrOwotCQkJfQotCQkJaWYgKGNwICsgMSA8IGVwICYmICpjcCkKLQkJCQlwcmludGYoIi4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChjcCA9PSBlcCkgewotCQkJCS8qIEZRRE4gKi8KLQkJCQlwcmludGYoIi4iKTsKLQkJCX0gZWxzZSBpZiAoY3AgKyAxID09IGVwICYmICpjcCA9PSAnXDAnKSB7Ci0JCQkJLyogdHJ1bmNhdGVkICovCi0JCQl9IGVsc2UgewotCQkJCS8qIGludmFsaWQgKi8KLQkJCQlwcmludGYoIj8/PyIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcHJpbnRmKCJcIiIpOwotfQotCi1zdGF0aWMgdm9pZAotaWNtcDZfbm9kZWluZm9fcHJpbnQodV9pbnQgaWNtcDZsZW4sIGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IHVfY2hhciAqZXApCi17Ci0Jc3RydWN0IGljbXA2X25vZGVpbmZvICpuaTY7Ci0Jc3RydWN0IGljbXA2X2hkciAqZHA7Ci0JY29uc3QgdV9jaGFyICpjcDsKLQlzaXplX3Qgc2l6LCBpOwotCWludCBuZWVkY29tbWE7Ci0KLQlpZiAoZXAgPCBicCkKLQkJcmV0dXJuOwotCWRwID0gKHN0cnVjdCBpY21wNl9oZHIgKilicDsKLQluaTYgPSAoc3RydWN0IGljbXA2X25vZGVpbmZvICopYnA7Ci0Jc2l6ID0gZXAgLSBicDsKLQotCXN3aXRjaCAobmk2LT5uaV90eXBlKSB7Ci0JY2FzZSBJQ01QNl9OSV9RVUVSWToKLQkJaWYgKHNpeiA9PSBzaXplb2YoKmRwKSArIDQpIHsKLQkJCS8qIEtBTUUgd2hvLWFyZS15b3UgKi8KLQkJCXByaW50ZigiIHdoby1hcmUteW91IHJlcXVlc3QiKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXByaW50ZigiIG5vZGUgaW5mb3JtYXRpb24gcXVlcnkiKTsKLQotCQlUQ0hFQ0syKCpkcCwgc2l6ZW9mKCpuaTYpKTsKLQkJbmk2ID0gKHN0cnVjdCBpY21wNl9ub2RlaW5mbyAqKWRwOwotCQlwcmludGYoIiAoIik7CS8qKSovCi0JCXN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJm5pNi0+bmlfcXR5cGUpKSB7Ci0JCWNhc2UgTklfUVRZUEVfTk9PUDoKLQkJCXByaW50Zigibm9vcCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTklfUVRZUEVfU1VQVFlQRVM6Ci0JCQlwcmludGYoInN1cHBvcnRlZCBxdHlwZXMiKTsKLQkJCWkgPSBFWFRSQUNUXzE2QklUUygmbmk2LT5uaV9mbGFncyk7Ci0JCQlpZiAoaSkKLQkJCQlwcmludGYoIiBbJXNdIiwgKGkgJiAweDAxKSA/ICJDIiA6ICIiKTsKLQkJCWJyZWFrOwotCQkJYnJlYWs7Ci0JCWNhc2UgTklfUVRZUEVfRlFETjoKLQkJCXByaW50ZigiRE5TIG5hbWUiKTsKLQkJCWJyZWFrOwotCQljYXNlIE5JX1FUWVBFX05PREVBRERSOgotCQkJcHJpbnRmKCJub2RlIGFkZHJlc3NlcyIpOwotCQkJaSA9IG5pNi0+bmlfZmxhZ3M7Ci0JCQlpZiAoIWkpCi0JCQkJYnJlYWs7Ci0JCQkvKiBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFIHVuZGVmaW5lZCBmb3IgcXVlcnkgKi8KLQkJCXByaW50ZigiIFslcyVzJXMlcyVzJXNdIiwKLQkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQU5ZQ0FTVCkgPyAiYSIgOiAiIiwKLQkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfR0xPQkFMKSA/ICJHIiA6ICIiLAotCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19TSVRFTE9DQUwpID8gIlMiIDogIiIsCi0JCQkgICAgKGkgJiBOSV9OT0RFQUREUl9GTEFHX0xJTktMT0NBTCkgPyAiTCIgOiAiIiwKLQkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQ09NUEFUKSA/ICJDIiA6ICIiLAotCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19BTEwpID8gIkEiIDogIiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoInVua25vd24iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKG5pNi0+bmlfcXR5cGUgPT0gTklfUVRZUEVfTk9PUCB8fAotCQkgICAgbmk2LT5uaV9xdHlwZSA9PSBOSV9RVFlQRV9TVVBUWVBFUykgewotCQkJaWYgKHNpeiAhPSBzaXplb2YoKm5pNikpCi0JCQkJaWYgKHZmbGFnKQotCQkJCQlwcmludGYoIiwgaW52YWxpZCBsZW4iKTsKLQkJCS8qKCovCi0JCQlwcmludGYoIikiKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQotCQkvKiBYWFggYmFja3dhcmQgY29tcGF0LCBpY21wLW5hbWUtbG9va3VwLTAzICovCi0JCWlmIChzaXogPT0gc2l6ZW9mKCpuaTYpKSB7Ci0JCQlwcmludGYoIiwgMDMgZHJhZnQiKTsKLQkJCS8qKCovCi0JCQlwcmludGYoIikiKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoIChuaTYtPm5pX2NvZGUpIHsKLQkJY2FzZSBJQ01QNl9OSV9TVUJKX0lQVjY6Ci0JCQlpZiAoIVRURVNUMigqZHAsCi0JCQkgICAgc2l6ZW9mKCpuaTYpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQotCQkJCWJyZWFrOwotCQkJaWYgKHNpeiAhPSBzaXplb2YoKm5pNikgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgewotCQkJCWlmICh2ZmxhZykKLQkJCQkJcHJpbnRmKCIsIGludmFsaWQgc3ViamVjdCBsZW4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXByaW50ZigiLCBzdWJqZWN0PSVzIiwKLQkJCSAgICBnZXRuYW1lNigoY29uc3QgdV9jaGFyICopKG5pNiArIDEpKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJQ01QNl9OSV9TVUJKX0ZRRE46Ci0JCQlwcmludGYoIiwgc3ViamVjdD1ETlMgbmFtZSIpOwotCQkJY3AgPSAoY29uc3QgdV9jaGFyICopKG5pNiArIDEpOwotCQkJaWYgKGNwWzBdID09IGVwIC0gY3AgLSAxKSB7Ci0JCQkJLyogaWNtcC1uYW1lLWxvb2t1cC0wMywgcGFzY2FsIHN0cmluZyAqLwotCQkJCWlmICh2ZmxhZykKLQkJCQkJcHJpbnRmKCIsIDAzIGRyYWZ0Iik7Ci0JCQkJY3ArKzsKLQkJCQlwcmludGYoIiwgXCIiKTsKLQkJCQl3aGlsZSAoY3AgPCBlcCkgewotCQkJCQlzYWZlcHV0Y2hhcigqY3ApOwotCQkJCQljcCsrOwotCQkJCX0KLQkJCQlwcmludGYoIlwiIik7Ci0JCQl9IGVsc2UKLQkJCQlkbnNuYW1lX3ByaW50KGNwLCBlcCk7Ci0JCQlicmVhazsKLQkJY2FzZSBJQ01QNl9OSV9TVUJKX0lQVjQ6Ci0JCQlpZiAoIVRURVNUMigqZHAsIHNpemVvZigqbmk2KSArIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQotCQkJCWJyZWFrOwotCQkJaWYgKHNpeiAhPSBzaXplb2YoKm5pNikgKyBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7Ci0JCQkJaWYgKHZmbGFnKQotCQkJCQlwcmludGYoIiwgaW52YWxpZCBzdWJqZWN0IGxlbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcHJpbnRmKCIsIHN1YmplY3Q9JXMiLAotCQkJICAgIGdldG5hbWUoKGNvbnN0IHVfY2hhciAqKShuaTYgKyAxKSkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoIiwgdW5rbm93biBzdWJqZWN0Iik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qKCovCi0JCXByaW50ZigiKSIpOwotCQlicmVhazsKLQotCWNhc2UgSUNNUDZfTklfUkVQTFk6Ci0JCWlmIChpY21wNmxlbiA+IHNpeikgewotCQkJcHJpbnRmKCJbfGljbXA2OiBub2RlIGluZm9ybWF0aW9uIHJlcGx5XSIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQluZWVkY29tbWEgPSAwOwotCi0JCW5pNiA9IChzdHJ1Y3QgaWNtcDZfbm9kZWluZm8gKilkcDsKLQkJcHJpbnRmKCIgbm9kZSBpbmZvcm1hdGlvbiByZXBseSIpOwotCQlwcmludGYoIiAoIik7CS8qKSovCi0JCXN3aXRjaCAobmk2LT5uaV9jb2RlKSB7Ci0JCWNhc2UgSUNNUDZfTklfU1VDQ0VTUzoKLQkJCWlmICh2ZmxhZykgewotCQkJCXByaW50Zigic3VjY2VzcyIpOwotCQkJCW5lZWRjb21tYSsrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSUNNUDZfTklfUkVGVVNFRDoKLQkJCXByaW50ZigicmVmdXNlZCIpOwotCQkJbmVlZGNvbW1hKys7Ci0JCQlpZiAoc2l6ICE9IHNpemVvZigqbmk2KSkKLQkJCQlpZiAodmZsYWcpCi0JCQkJCXByaW50ZigiLCBpbnZhbGlkIGxlbmd0aCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUNNUDZfTklfVU5LTk9XTjoKLQkJCXByaW50ZigidW5rbm93biIpOwotCQkJbmVlZGNvbW1hKys7Ci0JCQlpZiAoc2l6ICE9IHNpemVvZigqbmk2KSkKLQkJCQlpZiAodmZsYWcpCi0JCQkJCXByaW50ZigiLCBpbnZhbGlkIGxlbmd0aCIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAobmk2LT5uaV9jb2RlICE9IElDTVA2X05JX1NVQ0NFU1MpIHsKLQkJCS8qKCovCi0JCQlwcmludGYoIikiKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoIChFWFRSQUNUXzE2QklUUygmbmk2LT5uaV9xdHlwZSkpIHsKLQkJY2FzZSBOSV9RVFlQRV9OT09QOgotCQkJaWYgKG5lZWRjb21tYSkKLQkJCQlwcmludGYoIiwgIik7Ci0JCQlwcmludGYoIm5vb3AiKTsKLQkJCWlmIChzaXogIT0gc2l6ZW9mKCpuaTYpKQotCQkJCWlmICh2ZmxhZykKLQkJCQkJcHJpbnRmKCIsIGludmFsaWQgbGVuZ3RoIik7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9RVFlQRV9TVVBUWVBFUzoKLQkJCWlmIChuZWVkY29tbWEpCi0JCQkJcHJpbnRmKCIsICIpOwotCQkJcHJpbnRmKCJzdXBwb3J0ZWQgcXR5cGVzIik7Ci0JCQlpID0gRVhUUkFDVF8xNkJJVFMoJm5pNi0+bmlfZmxhZ3MpOwotCQkJaWYgKGkpCi0JCQkJcHJpbnRmKCIgWyVzXSIsIChpICYgMHgwMSkgPyAiQyIgOiAiIik7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9RVFlQRV9GUUROOgotCQkJaWYgKG5lZWRjb21tYSkKLQkJCQlwcmludGYoIiwgIik7Ci0JCQlwcmludGYoIkROUyBuYW1lIik7Ci0JCQljcCA9IChjb25zdCB1X2NoYXIgKikobmk2ICsgMSkgKyA0OwotCQkJaWYgKGNwWzBdID09IGVwIC0gY3AgLSAxKSB7Ci0JCQkJLyogaWNtcC1uYW1lLWxvb2t1cC0wMywgcGFzY2FsIHN0cmluZyAqLwotCQkJCWlmICh2ZmxhZykKLQkJCQkJcHJpbnRmKCIsIDAzIGRyYWZ0Iik7Ci0JCQkJY3ArKzsKLQkJCQlwcmludGYoIiwgXCIiKTsKLQkJCQl3aGlsZSAoY3AgPCBlcCkgewotCQkJCQlzYWZlcHV0Y2hhcigqY3ApOwotCQkJCQljcCsrOwotCQkJCX0KLQkJCQlwcmludGYoIlwiIik7Ci0JCQl9IGVsc2UKLQkJCQlkbnNuYW1lX3ByaW50KGNwLCBlcCk7Ci0JCQlpZiAoKEVYVFJBQ1RfMTZCSVRTKCZuaTYtPm5pX2ZsYWdzKSAmIDB4MDEpICE9IDApCi0JCQkJcHJpbnRmKCIgW1RUTD0ldV0iLCAqKHVfaW50MzJfdCAqKShuaTYgKyAxKSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOSV9RVFlQRV9OT0RFQUREUjoKLQkJCWlmIChuZWVkY29tbWEpCi0JCQkJcHJpbnRmKCIsICIpOwotCQkJcHJpbnRmKCJub2RlIGFkZHJlc3NlcyIpOwotCQkJaSA9IHNpemVvZigqbmk2KTsKLQkJCXdoaWxlIChpIDwgc2l6KSB7Ci0JCQkJaWYgKGkgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSArIHNpemVvZihpbnQzMl90KSA+IHNpeikKLQkJCQkJYnJlYWs7Ci0JCQkJcHJpbnRmKCIgJXMiLCBnZXRuYW1lNihicCArIGkpKTsKLQkJCQlpICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwotCQkJCXByaW50ZigiKCVkKSIsIChpbnQzMl90KUVYVFJBQ1RfMzJCSVRTKGJwICsgaSkpOwotCQkJCWkgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJfQotCQkJaSA9IG5pNi0+bmlfZmxhZ3M7Ci0JCQlpZiAoIWkpCi0JCQkJYnJlYWs7Ci0JCQlwcmludGYoIiBbJXMlcyVzJXMlcyVzJXNdIiwKLQkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQU5ZQ0FTVCkgPyAiYSIgOiAiIiwKLQkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfR0xPQkFMKSA/ICJHIiA6ICIiLAotCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19TSVRFTE9DQUwpID8gIlMiIDogIiIsCi0JCQkgICAgKGkgJiBOSV9OT0RFQUREUl9GTEFHX0xJTktMT0NBTCkgPyAiTCIgOiAiIiwKLQkJCSAgICAoaSAmIE5JX05PREVBRERSX0ZMQUdfQ09NUEFUKSA/ICJDIiA6ICIiLAotCQkJICAgIChpICYgTklfTk9ERUFERFJfRkxBR19BTEwpID8gIkEiIDogIiIsCi0JCQkgICAgKGkgJiBOSV9OT0RFQUREUl9GTEFHX1RSVU5DQVRFKSA/ICJUIiA6ICIiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaWYgKG5lZWRjb21tYSkKLQkJCQlwcmludGYoIiwgIik7Ci0JCQlwcmludGYoInVua25vd24iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyooKi8KLQkJcHJpbnRmKCIpIik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm47Ci0KLXRydW5jOgotCWZwdXRzKCJbfGljbXA2XSIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pY21wNl9ycmVudW1fcHJpbnQoY29uc3QgdV9jaGFyICpicCwgY29uc3QgdV9jaGFyICplcCkKLXsKLQlzdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtICpycjY7Ci0JY29uc3QgY2hhciAqY3A7Ci0Jc3RydWN0IHJyX3Bjb19tYXRjaCAqbWF0Y2g7Ci0Jc3RydWN0IHJyX3Bjb191c2UgKnVzZTsKLQljaGFyIGhidWZbTklfTUFYSE9TVF07Ci0JaW50IG47Ci0KLQlpZiAoZXAgPCBicCkKLQkJcmV0dXJuOwotCXJyNiA9IChzdHJ1Y3QgaWNtcDZfcm91dGVyX3JlbnVtICopYnA7Ci0JY3AgPSAoY29uc3QgY2hhciAqKShycjYgKyAxKTsKLQotCVRDSEVDSyhycjYtPnJyX3Jlc2VydmVkKTsKLQlzd2l0Y2ggKHJyNi0+cnJfY29kZSkgewotCWNhc2UgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HX0NPTU1BTkQ6Ci0JCXByaW50Zigicm91dGVyIHJlbnVtOiBjb21tYW5kIik7Ci0JCWJyZWFrOwotCWNhc2UgSUNNUDZfUk9VVEVSX1JFTlVNQkVSSU5HX1JFU1VMVDoKLQkJcHJpbnRmKCJyb3V0ZXIgcmVudW06IHJlc3VsdCIpOwotCQlicmVhazsKLQljYXNlIElDTVA2X1JPVVRFUl9SRU5VTUJFUklOR19TRVFOVU1fUkVTRVQ6Ci0JCXByaW50Zigicm91dGVyIHJlbnVtOiBzZXF1ZW5jZSBudW1iZXIgcmVzZXQiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRmKCJyb3V0ZXIgcmVudW06IGNvZGUtIyVkIiwgcnI2LT5ycl9jb2RlKTsKLQkJYnJlYWs7Ci0JfQotCi0JcHJpbnRmKCIsIHNlcT0ldSIsIEVYVFJBQ1RfMzJCSVRTKCZycjYtPnJyX3NlcW51bSkpOwotCi0JaWYgKHZmbGFnKSB7Ci0jZGVmaW5lIEYoeCwgeSkJKChycjYtPnJyX2ZsYWdzKSAmICh4KSA/ICh5KSA6ICIiKQotCQlwcmludGYoIlsiKTsJLypdKi8KLQkJaWYgKHJyNi0+cnJfZmxhZ3MpIHsKLQkJCXByaW50ZigiJXMlcyVzJXMlcywiLCBGKElDTVA2X1JSX0ZMQUdTX1RFU1QsICJUIiksCi0JCQkgICAgRihJQ01QNl9SUl9GTEFHU19SRVFSRVNVTFQsICJSIiksCi0JCQkgICAgRihJQ01QNl9SUl9GTEFHU19GT1JDRUFQUExZLCAiQSIpLAotCQkJICAgIEYoSUNNUDZfUlJfRkxBR1NfU1BFQ1NJVEUsICJTIiksCi0JCQkgICAgRihJQ01QNl9SUl9GTEFHU19QUkVWRE9ORSwgIlAiKSk7Ci0JCX0KLQkJcHJpbnRmKCJzZWc9JXUsIiwgcnI2LT5ycl9zZWdudW0pOwotCQlwcmludGYoIm1heGRlbGF5PSV1IiwgcnI2LT5ycl9tYXhkZWxheSk7Ci0JCWlmIChycjYtPnJyX3Jlc2VydmVkKQotCQkJcHJpbnRmKCJyc3ZkPTB4JXgiLCBFWFRSQUNUXzE2QklUUygmcnI2LT5ycl9yZXNlcnZlZCkpOwotCQkvKlsqLwotCQlwcmludGYoIl0iKTsKLSN1bmRlZiBGCi0JfQotCi0JaWYgKHJyNi0+cnJfY29kZSA9PSBJQ01QNl9ST1VURVJfUkVOVU1CRVJJTkdfQ09NTUFORCkgewotCQltYXRjaCA9IChzdHJ1Y3QgcnJfcGNvX21hdGNoICopY3A7Ci0JCWNwID0gKGNvbnN0IGNoYXIgKikobWF0Y2ggKyAxKTsKLQotCQlUQ0hFQ0sobWF0Y2gtPnJwbV9wcmVmaXgpOwotCi0JCWlmICh2ZmxhZyA+IDEpCi0JCQlwcmludGYoIlxuXHQiKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIgIik7Ci0JCXByaW50ZigibWF0Y2goIik7CS8qKSovCi0JCXN3aXRjaCAobWF0Y2gtPnJwbV9jb2RlKSB7Ci0JCWNhc2UgUlBNX1BDT19BREQ6CXByaW50ZigiYWRkIik7IGJyZWFrOwotCQljYXNlIFJQTV9QQ09fQ0hBTkdFOglwcmludGYoImNoYW5nZSIpOyBicmVhazsKLQkJY2FzZSBSUE1fUENPX1NFVEdMT0JBTDoJcHJpbnRmKCJzZXRnbG9iYWwiKTsgYnJlYWs7Ci0JCWRlZmF1bHQ6CQlwcmludGYoIiMldSIsIG1hdGNoLT5ycG1fY29kZSk7IGJyZWFrOwotCQl9Ci0KLQkJaWYgKHZmbGFnKSB7Ci0JCQlwcmludGYoIixvcmQ9JXUiLCBtYXRjaC0+cnBtX29yZGluYWwpOwotCQkJcHJpbnRmKCIsbWluPSV1IiwgbWF0Y2gtPnJwbV9taW5sZW4pOwotCQkJcHJpbnRmKCIsbWF4PSV1IiwgbWF0Y2gtPnJwbV9tYXhsZW4pOwotCQl9Ci0JCWlmIChpbmV0X250b3AoQUZfSU5FVDYsICZtYXRjaC0+cnBtX3ByZWZpeCwgaGJ1Ziwgc2l6ZW9mKGhidWYpKSkKLQkJCXByaW50ZigiLCVzLyV1IiwgaGJ1ZiwgbWF0Y2gtPnJwbV9tYXRjaGxlbik7Ci0JCWVsc2UKLQkJCXByaW50ZigiLD8vJXUiLCBtYXRjaC0+cnBtX21hdGNobGVuKTsKLQkJLyooKi8KLQkJcHJpbnRmKCIpIik7Ci0KLQkJbiA9IG1hdGNoLT5ycG1fbGVuIC0gMzsKLQkJaWYgKG4gJSA0KQotCQkJZ290byB0cnVuYzsKLQkJbiAvPSA0OwotCQl3aGlsZSAobi0tID4gMCkgewotCQkJdXNlID0gKHN0cnVjdCBycl9wY29fdXNlICopY3A7Ci0JCQljcCA9IChjb25zdCBjaGFyICopKHVzZSArIDEpOwotCi0JCQlUQ0hFQ0sodXNlLT5ycHVfcHJlZml4KTsKLQotCQkJaWYgKHZmbGFnID4gMSkKLQkJCQlwcmludGYoIlxuXHQiKTsKLQkJCWVsc2UKLQkJCQlwcmludGYoIiAiKTsKLQkJCXByaW50ZigidXNlKCIpOwkvKikqLwotCQkJaWYgKHVzZS0+cnB1X2ZsYWdzKSB7Ci0jZGVmaW5lIEYoeCwgeSkJKCh1c2UtPnJwdV9mbGFncykgJiAoeCkgPyAoeSkgOiAiIikKLQkJCQlwcmludGYoIiVzJXMsIiwKLQkJCQkgICAgRihJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlZMVElNRSwgIlYiKSwKLQkJCQkgICAgRihJQ01QNl9SUl9QQ09VU0VfRkxBR1NfREVDUlBMVElNRSwgIlAiKSk7Ci0jdW5kZWYgRgotCQkJfQotCQkJaWYgKHZmbGFnKSB7Ci0JCQkJcHJpbnRmKCJtYXNrPTB4JXgsIiwgdXNlLT5ycHVfcmFtYXNrKTsKLQkJCQlwcmludGYoInJhZmxhZ3M9MHgleCwiLCB1c2UtPnJwdV9yYWZsYWdzKTsKLQkJCQlpZiAofnVzZS0+cnB1X3ZsdGltZSA9PSAwKQotCQkJCQlwcmludGYoInZsdGltZT1pbmZ0eSwiKTsKLQkJCQllbHNlCi0JCQkJCXByaW50Zigidmx0aW1lPSV1LCIsCi0JCQkJCSAgICBFWFRSQUNUXzMyQklUUygmdXNlLT5ycHVfdmx0aW1lKSk7Ci0JCQkJaWYgKH51c2UtPnJwdV9wbHRpbWUgPT0gMCkKLQkJCQkJcHJpbnRmKCJwbHRpbWU9aW5mdHksIik7Ci0JCQkJZWxzZQotCQkJCQlwcmludGYoInBsdGltZT0ldSwiLAotCQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJnVzZS0+cnB1X3BsdGltZSkpOwotCQkJfQotCQkJaWYgKGluZXRfbnRvcChBRl9JTkVUNiwgJnVzZS0+cnB1X3ByZWZpeCwgaGJ1ZiwKLQkJCSAgICBzaXplb2YoaGJ1ZikpKQotCQkJCXByaW50ZigiJXMvJXUvJXUiLCBoYnVmLCB1c2UtPnJwdV91c2VsZW4sCi0JCQkJICAgIHVzZS0+cnB1X2tlZXBsZW4pOwotCQkJZWxzZQotCQkJCXByaW50ZigiPy8ldS8ldSIsIHVzZS0+cnB1X3VzZWxlbiwKLQkJCQkgICAgdXNlLT5ycHVfa2VlcGxlbik7Ci0JCQkvKigqLwotCQkJcHJpbnRmKCIpIik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCWZwdXRzKCJbfGljbXA2XSIsIHN0ZG91dCk7Ci19Ci0KLSNlbmRpZiAvKiBJTkVUNiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtaWdtcC5jIGIvcHJpbnQtaWdtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzEwZDU1Li4wMDAwMDAwCi0tLSBhL3ByaW50LWlnbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKiAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWlnbXAuYyx2IDEuMTUgMjAwNC8wMy8yNCAwMDo1OToxNiBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIgICAgICAgICAgICAvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KLQotI2lmbmRlZiBJTl9DTEFTU0QKLSNkZWZpbmUgSU5fQ0xBU1NEKGkpICgoKGludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKLSNlbmRpZgotCi0vKiAoZm9sbG93aW5nIGZyb20gaXBtdWx0aS9tcm91dGVkL3BydW5lLmgpICovCi0KLS8qCi0gKiBUaGUgcGFja2V0IGZvcm1hdCBmb3IgYSB0cmFjZXJvdXRlIHJlcXVlc3QuCi0gKi8KLXN0cnVjdCB0cl9xdWVyeSB7Ci0gICAgdV9pbnQzMl90ICB0cl9zcmM7ICAgICAgICAgIC8qIHRyYWNlcm91dGUgc291cmNlICovCi0gICAgdV9pbnQzMl90ICB0cl9kc3Q7ICAgICAgICAgIC8qIHRyYWNlcm91dGUgZGVzdGluYXRpb24gKi8KLSAgICB1X2ludDMyX3QgIHRyX3JhZGRyOyAgICAgICAgLyogdHJhY2Vyb3V0ZSByZXNwb25zZSBhZGRyZXNzICovCi0gICAgdV9pbnQzMl90ICB0cl9ydHRscWlkOyAgICAgIC8qIHJlc3BvbnNlIHR0bCBhbmQgcWlkICovCi19OwotCi0jZGVmaW5lIFRSX0dFVFRUTCh4KSAgICAgICAgKGludCkoKCh4KSA+PiAyNCkgJiAweGZmKQotI2RlZmluZSBUUl9HRVRRSUQoeCkgICAgICAgICgoeCkgJiAweDAwZmZmZmZmKQotCi0vKgotICogVHJhY2Vyb3V0ZSByZXNwb25zZSBmb3JtYXQuICBBIHRyYWNlcm91dGUgcmVzcG9uc2UgaGFzIGEgdHJfcXVlcnkgYXQgdGhlCi0gKiBiZWdpbm5pbmcsIGZvbGxvd2VkIGJ5IG9uZSB0cl9yZXNwIGZvciBlYWNoIGhvcCB0YWtlbi4KLSAqLwotc3RydWN0IHRyX3Jlc3AgewotICAgIHVfaW50MzJfdCB0cl9xYXJyOyAgICAgICAgICAvKiBxdWVyeSBhcnJpdmFsIHRpbWUgKi8KLSAgICB1X2ludDMyX3QgdHJfaW5hZGRyOyAgICAgICAgLyogaW5jb21pbmcgaW50ZXJmYWNlIGFkZHJlc3MgKi8KLSAgICB1X2ludDMyX3QgdHJfb3V0YWRkcjsgICAgICAgLyogb3V0Z29pbmcgaW50ZXJmYWNlIGFkZHJlc3MgKi8KLSAgICB1X2ludDMyX3QgdHJfcm10YWRkcjsgICAgICAgLyogcGFyZW50IGFkZHJlc3MgaW4gc291cmNlIHRyZWUgKi8KLSAgICB1X2ludDMyX3QgdHJfdmlmaW47ICAgICAgICAgLyogaW5wdXQgcGFja2V0IGNvdW50IG9uIGludGVyZmFjZSAqLwotICAgIHVfaW50MzJfdCB0cl92aWZvdXQ7ICAgICAgICAvKiBvdXRwdXQgcGFja2V0IGNvdW50IG9uIGludGVyZmFjZSAqLwotICAgIHVfaW50MzJfdCB0cl9wa3RjbnQ7ICAgICAgICAvKiB0b3RhbCBpbmNvbWluZyBwYWNrZXRzIGZvciBzcmMtZ3JwICovCi0gICAgdV9pbnQ4X3QgIHRyX3Jwcm90bzsgICAgICAvKiByb3V0aW5nIHByb3RvIGRlcGxveWVkIG9uIHJvdXRlciAqLwotICAgIHVfaW50OF90ICB0cl9mdHRsOyAgICAgICAgLyogdHRsIHJlcXVpcmVkIHRvIGZvcndhcmQgb24gb3V0dmlmICovCi0gICAgdV9pbnQ4X3QgIHRyX3NtYXNrOyAgICAgICAvKiBzdWJuZXQgbWFzayBmb3Igc3JjIGFkZHIgKi8KLSAgICB1X2ludDhfdCAgdHJfcmZsYWdzOyAgICAgIC8qIGZvcndhcmRpbmcgZXJyb3IgY29kZXMgKi8KLX07Ci0KLS8qIGRlZnMgd2l0aGluIG10cmFjZSAqLwotI2RlZmluZSBUUl9RVUVSWSAxCi0jZGVmaW5lIFRSX1JFU1AgMgotCi0vKiBmaWVsZHMgZm9yIHRyX3JmbGFncyAoZm9yd2FyZGluZyBlcnJvciBjb2RlcykgKi8KLSNkZWZpbmUgVFJfTk9fRVJSICAgMAotI2RlZmluZSBUUl9XUk9OR19JRiAxCi0jZGVmaW5lIFRSX1BSVU5FRCAgIDIKLSNkZWZpbmUgVFJfT1BSVU5FRCAgMwotI2RlZmluZSBUUl9TQ09QRUQgICA0Ci0jZGVmaW5lIFRSX05PX1JURSAgIDUKLSNkZWZpbmUgVFJfTk9fRldEICAgNwotI2RlZmluZSBUUl9OT19TUEFDRSAweDgxCi0jZGVmaW5lIFRSX09MRF9ST1VURVIgICAweDgyCi0KLS8qIGZpZWxkcyBmb3IgdHJfcnByb3RvIChyb3V0aW5nIHByb3RvY29sKSAqLwotI2RlZmluZSBUUl9QUk9UT19EVk1SUCAgMQotI2RlZmluZSBUUl9QUk9UT19NT1NQRiAgMgotI2RlZmluZSBUUl9QUk9UT19QSU0gICAgMwotI2RlZmluZSBUUl9QUk9UT19DQlQgICAgNAotCi0vKiBpZ21wdjMgcmVwb3J0IHR5cGVzICovCi1zdGF0aWMgc3RydWN0IHRvayBpZ21wdjNyZXBvcnQyc3RyW10gPSB7Ci0JeyAxLAkiaXNfaW4iIH0sCi0JeyAyLAkiaXNfZXgiIH0sCi0JeyAzLAkidG9faW4iIH0sCi0JeyA0LAkidG9fZXgiIH0sCi0JeyA1LAkiYWxsb3ciIH0sCi0JeyA2LAkiYmxvY2siIH0sCi0JeyAwLAlOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9tdHJhY2UocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0cl9xdWVyeSAqdHIgPSAoY29uc3Qgc3RydWN0IHRyX3F1ZXJ5ICopKGJwICsgOCk7Ci0KLSAgICBUQ0hFQ0soKnRyKTsKLSAgICBpZiAobGVuIDwgOCArIHNpemVvZiAoc3RydWN0IHRyX3F1ZXJ5KSkgewotCSh2b2lkKXByaW50ZigiIFtpbnZhbGlkIGxlbiAlZF0iLCBsZW4pOwotCXJldHVybjsKLSAgICB9Ci0gICAgcHJpbnRmKCJtdHJhY2UgJXU6ICVzIHRvICVzIHJlcGx5LXRvICVzIiwKLSAgICAgICAgVFJfR0VUUUlEKEVYVFJBQ1RfMzJCSVRTKCZ0ci0+dHJfcnR0bHFpZCkpLAotICAgICAgICBpcGFkZHJfc3RyaW5nKCZ0ci0+dHJfc3JjKSwgaXBhZGRyX3N0cmluZygmdHItPnRyX2RzdCksCi0gICAgICAgIGlwYWRkcl9zdHJpbmcoJnRyLT50cl9yYWRkcikpOwotICAgIGlmIChJTl9DTEFTU0QoRVhUUkFDVF8zMkJJVFMoJnRyLT50cl9yYWRkcikpKQotICAgICAgICBwcmludGYoIiB3aXRoLXR0bCAlZCIsIFRSX0dFVFRUTChFWFRSQUNUXzMyQklUUygmdHItPnRyX3J0dGxxaWQpKSk7Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgKHZvaWQpcHJpbnRmKCJbfGlnbXBdIik7Ci0gICAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbXJlc3AocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0cl9xdWVyeSAqdHIgPSAoY29uc3Qgc3RydWN0IHRyX3F1ZXJ5ICopKGJwICsgOCk7Ci0KLSAgICBUQ0hFQ0soKnRyKTsKLSAgICBpZiAobGVuIDwgOCArIHNpemVvZiAoc3RydWN0IHRyX3F1ZXJ5KSkgewotCSh2b2lkKXByaW50ZigiIFtpbnZhbGlkIGxlbiAlZF0iLCBsZW4pOwotCXJldHVybjsKLSAgICB9Ci0gICAgcHJpbnRmKCJtcmVzcCAlbHU6ICVzIHRvICVzIHJlcGx5LXRvICVzIiwKLSAgICAgICAgKHVfbG9uZylUUl9HRVRRSUQoRVhUUkFDVF8zMkJJVFMoJnRyLT50cl9ydHRscWlkKSksCi0gICAgICAgIGlwYWRkcl9zdHJpbmcoJnRyLT50cl9zcmMpLCBpcGFkZHJfc3RyaW5nKCZ0ci0+dHJfZHN0KSwKLSAgICAgICAgaXBhZGRyX3N0cmluZygmdHItPnRyX3JhZGRyKSk7Ci0gICAgaWYgKElOX0NMQVNTRChFWFRSQUNUXzMyQklUUygmdHItPnRyX3JhZGRyKSkpCi0gICAgICAgIHByaW50ZigiIHdpdGgtdHRsICVkIiwgVFJfR0VUVFRMKEVYVFJBQ1RfMzJCSVRTKCZ0ci0+dHJfcnR0bHFpZCkpKTsKLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICAodm9pZClwcmludGYoIlt8aWdtcF0iKTsKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pZ21wdjNfcmVwb3J0KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLSAgICB1X2ludCBncm91cCwgbnNyY3MsIG5ncm91cHM7Ci0gICAgcmVnaXN0ZXIgdV9pbnQgaSwgajsKLQotICAgIC8qIE1pbmltdW0gbGVuIGlzIDE2LCBhbmQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgNCAqLwotICAgIGlmIChsZW4gPCAxNiB8fCBsZW4gJiAweDAzKSB7Ci0JKHZvaWQpcHJpbnRmKCIgW2ludmFsaWQgbGVuICVkXSIsIGxlbik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBUQ0hFQ0syKGJwWzZdLCAyKTsKLSAgICBuZ3JvdXBzID0gRVhUUkFDVF8xNkJJVFMoJmJwWzZdKTsKLSAgICAodm9pZClwcmludGYoIiwgJWQgZ3JvdXAgcmVjb3JkKHMpIiwgbmdyb3Vwcyk7Ci0gICAgaWYgKHZmbGFnID4gMCkgewotCS8qIFByaW50IHRoZSBncm91cCByZWNvcmRzICovCi0JZ3JvdXAgPSA4OwotICAgICAgICBmb3IgKGk9MDsgaTxuZ3JvdXBzOyBpKyspIHsKLQkgICAgaWYgKGxlbiA8IGdyb3VwKzgpIHsKLQkJKHZvaWQpcHJpbnRmKCIgW2ludmFsaWQgbnVtYmVyIG9mIGdyb3Vwc10iKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIFRDSEVDSzIoYnBbZ3JvdXArNF0sIDQpOwotICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIgW2dhZGRyICVzIiwgaXBhZGRyX3N0cmluZygmYnBbZ3JvdXArNF0pKTsKLQkgICAgKHZvaWQpcHJpbnRmKCIgJXMiLCB0b2syc3RyKGlnbXB2M3JlcG9ydDJzdHIsICIgW3YzLXJlcG9ydC0jJWRdIiwKLQkJCQkJCQkJYnBbZ3JvdXBdKSk7Ci0gICAgICAgICAgICBuc3JjcyA9IEVYVFJBQ1RfMTZCSVRTKCZicFtncm91cCsyXSk7Ci0JICAgIC8qIENoZWNrIHRoZSBudW1iZXIgb2Ygc291cmNlcyBhbmQgcHJpbnQgdGhlbSAqLwotCSAgICBpZiAobGVuIDwgZ3JvdXArOCsobnNyY3M8PDIpKSB7Ci0JCSh2b2lkKXByaW50ZigiIFtpbnZhbGlkIG51bWJlciBvZiBzb3VyY2VzICVkXSIsIG5zcmNzKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0gICAgICAgICAgICBpZiAodmZsYWcgPT0gMSkKLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiwgJWQgc291cmNlKHMpIiwgbnNyY3MpOwotICAgICAgICAgICAgZWxzZSB7Ci0JCS8qIFByaW50IHRoZSBzb3VyY2VzICovCi0gICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIgeyIpOwotICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqPG5zcmNzOyBqKyspIHsKLQkJICAgIFRDSEVDSzIoYnBbZ3JvdXArOCsoajw8MildLCA0KTsKLQkJICAgICh2b2lkKXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZygmYnBbZ3JvdXArOCsoajw8MildKSk7Ci0JCX0KLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiB9Iik7Ci0gICAgICAgICAgICB9Ci0JICAgIC8qIE5leHQgZ3JvdXAgcmVjb3JkICovCi0gICAgICAgICAgICBncm91cCArPSA4ICsgKG5zcmNzIDw8IDIpOwotCSAgICAodm9pZClwcmludGYoIl0iKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICAodm9pZClwcmludGYoIlt8aWdtcF0iKTsKLSAgICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pZ21wdjNfcXVlcnkocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotICAgIHVfaW50IG1yYzsKLSAgICBpbnQgbXJ0OwotICAgIHVfaW50IG5zcmNzOwotICAgIHJlZ2lzdGVyIHVfaW50IGk7Ci0KLSAgICAodm9pZClwcmludGYoIiB2MyIpOwotICAgIC8qIE1pbmltdW0gbGVuIGlzIDEyLCBhbmQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgNCAqLwotICAgIGlmIChsZW4gPCAxMiB8fCBsZW4gJiAweDAzKSB7Ci0JKHZvaWQpcHJpbnRmKCIgW2ludmFsaWQgbGVuICVkXSIsIGxlbik7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBUQ0hFQ0soYnBbMV0pOwotICAgIG1yYyA9IGJwWzFdOwotICAgIGlmIChtcmMgPCAxMjgpIHsKLQltcnQgPSBtcmM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXJ0ID0gKChtcmMgJiAweDBmKSB8IDB4MTApIDw8ICgoKG1yYyAmIDB4NzApID4+IDQpICsgMyk7Ci0gICAgfQotICAgIGlmIChtcmMgIT0gMTAwKSB7Ci0JKHZvaWQpcHJpbnRmKCIgW21heCByZXNwIHRpbWUgIik7Ci0JcmVsdHNfcHJpbnQobXJ0KTsKLQkodm9pZClwcmludGYoIl0iKTsKLSAgICB9Ci0gICAgVENIRUNLMihicFs0XSwgNCk7Ci0gICAgaWYgKEVYVFJBQ1RfMzJCSVRTKCZicFs0XSkgPT0gMCkKLQlyZXR1cm47Ci0gICAgKHZvaWQpcHJpbnRmKCIgW2dhZGRyICVzIiwgaXBhZGRyX3N0cmluZygmYnBbNF0pKTsKLSAgICBUQ0hFQ0syKGJwWzEwXSwgMik7Ci0gICAgbnNyY3MgPSBFWFRSQUNUXzE2QklUUygmYnBbMTBdKTsKLSAgICBpZiAobnNyY3MgPiAwKSB7Ci0JaWYgKGxlbiA8IDEyICsgKG5zcmNzIDw8IDIpKQotCSAgICAodm9pZClwcmludGYoIiBbaW52YWxpZCBudW1iZXIgb2Ygc291cmNlc10iKTsKLQllbHNlIGlmICh2ZmxhZyA+IDEpIHsKLQkgICAgKHZvaWQpcHJpbnRmKCIgeyIpOwotCSAgICBmb3IgKGk9MDsgaTxuc3JjczsgaSsrKSB7Ci0JCVRDSEVDSzIoYnBbMTIrKGk8PDIpXSwgNCk7Ci0JCSh2b2lkKXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZygmYnBbMTIrKGk8PDIpXSkpOwotCSAgICB9Ci0JICAgICh2b2lkKXByaW50ZigiIH0iKTsKLQl9IGVsc2UKLQkgICAgKHZvaWQpcHJpbnRmKCIsICVkIHNvdXJjZShzKSIsIG5zcmNzKTsKLSAgICB9Ci0gICAgKHZvaWQpcHJpbnRmKCJdIik7Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgKHZvaWQpcHJpbnRmKCJbfGlnbXBdIik7Ci0gICAgcmV0dXJuOwotfQotCi12b2lkCi1pZ21wX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLSAgICBpZiAocWZsYWcpIHsKLSAgICAgICAgKHZvaWQpcHJpbnRmKCJpZ21wIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUQ0hFQ0soYnBbMF0pOwotICAgIHN3aXRjaCAoYnBbMF0pIHsKLSAgICBjYXNlIDB4MTE6Ci0gICAgICAgICh2b2lkKXByaW50ZigiaWdtcCBxdWVyeSIpOwotCWlmIChsZW4gPj0gMTIpCi0JICAgIHByaW50X2lnbXB2M19xdWVyeShicCwgbGVuKTsKLQllbHNlIHsKLSAgICAgICAgICAgIFRDSEVDSyhicFsxXSk7Ci0JICAgIGlmIChicFsxXSkgewotCQkodm9pZClwcmludGYoIiB2MiIpOwotCQlpZiAoYnBbMV0gIT0gMTAwKQotCQkgICAgKHZvaWQpcHJpbnRmKCIgW21heCByZXNwIHRpbWUgJWRdIiwgYnBbMV0pOwotCSAgICB9IGVsc2UKLQkJKHZvaWQpcHJpbnRmKCIgdjEiKTsKLSAgICAgICAgICAgIFRDSEVDSzIoYnBbNF0sIDQpOwotCSAgICBpZiAoRVhUUkFDVF8zMkJJVFMoJmJwWzRdKSkKLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiBbZ2FkZHIgJXNdIiwgaXBhZGRyX3N0cmluZygmYnBbNF0pKTsKLSAgICAgICAgICAgIGlmIChsZW4gIT0gOCkKLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiBbbGVuICVkXSIsIGxlbik7Ci0JfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4MTI6Ci0gICAgICAgIFRDSEVDSzIoYnBbNF0sIDQpOwotICAgICAgICAodm9pZClwcmludGYoImlnbXAgdjEgcmVwb3J0ICVzIiwgaXBhZGRyX3N0cmluZygmYnBbNF0pKTsKLSAgICAgICAgaWYgKGxlbiAhPSA4KQotICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIgW2xlbiAlZF0iLCBsZW4pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4MTY6Ci0gICAgICAgIFRDSEVDSzIoYnBbNF0sIDQpOwotICAgICAgICAodm9pZClwcmludGYoImlnbXAgdjIgcmVwb3J0ICVzIiwgaXBhZGRyX3N0cmluZygmYnBbNF0pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDIyOgotICAgICAgICAodm9pZClwcmludGYoImlnbXAgdjMgcmVwb3J0Iik7Ci0JcHJpbnRfaWdtcHYzX3JlcG9ydChicCwgbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDE3OgotICAgICAgICBUQ0hFQ0syKGJwWzRdLCA0KTsKLSAgICAgICAgKHZvaWQpcHJpbnRmKCJpZ21wIGxlYXZlICVzIiwgaXBhZGRyX3N0cmluZygmYnBbNF0pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDEzOgotICAgICAgICAodm9pZClwcmludGYoImlnbXAgZHZtcnAiKTsKLSAgICAgICAgaWYgKGxlbiA8IDgpCi0gICAgICAgICAgICAodm9pZClwcmludGYoIiBbbGVuICVkXSIsIGxlbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGR2bXJwX3ByaW50KGJwLCBsZW4pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4MTQ6Ci0gICAgICAgICh2b2lkKXByaW50ZigiaWdtcCBwaW12MSIpOwotICAgICAgICBwaW12MV9wcmludChicCwgbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDFlOgotICAgICAgICBwcmludF9tcmVzcChicCwgbGVuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDFmOgotICAgICAgICBwcmludF9tdHJhY2UoYnAsIGxlbik7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICh2b2lkKXByaW50ZigiaWdtcC0lZCIsIGJwWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHZmbGFnICYmIFRURVNUMihicFswXSwgbGVuKSkgewotICAgICAgICAvKiBDaGVjayB0aGUgSUdNUCBjaGVja3N1bSAqLwotICAgICAgICBpZiAoaW5fY2tzdW0oKGNvbnN0IHVfc2hvcnQqKWJwLCBsZW4sIDApKQotICAgICAgICAgICAgcHJpbnRmKCIgYmFkIGlnbXAgY2tzdW0gJXghIiwgRVhUUkFDVF8xNkJJVFMoJmJwWzJdKSk7Ci0gICAgfQotICAgIHJldHVybjsKLXRydW5jOgotICAgIGZwdXRzKCJbfGlnbXBdIiwgc3Rkb3V0KTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWlncnAuYyBiL3ByaW50LWlncnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4NDcxZC4uMDAwMDAwMAotLS0gYS9wcmludC1pZ3JwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEluaXRpYWwgY29udHJpYnV0aW9uIGZyb20gRnJhbmNpcyBEdXBvbnQgKGZyYW5jaXMuZHVwb250QGlucmlhLmZyKQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWlncnAuYyx2IDEuMjAuMi4xIDIwMDUvMDQvMjAgMjE6MDI6MTUgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJpZ3JwLmgiCi0jaW5jbHVkZSAiaXAuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCi0KLXN0YXRpYyB2b2lkCi1pZ3JwX2VudHJ5X3ByaW50KHJlZ2lzdGVyIHN0cnVjdCBpZ3JwcnRlICppZ3IsIHJlZ2lzdGVyIGludCBpc19pbnRlcmlvciwKLSAgICByZWdpc3RlciBpbnQgaXNfZXh0ZXJpb3IpCi17Ci0JcmVnaXN0ZXIgdV9pbnQgZGVsYXksIGJhbmR3aWR0aDsKLQl1X2ludCBtZXRyaWMsIG10dTsKLQotCWlmIChpc19pbnRlcmlvcikKLQkJcHJpbnRmKCIgKi4lZC4lZC4lZCIsIGlnci0+aWdyX25ldFswXSwKLQkJICAgIGlnci0+aWdyX25ldFsxXSwgaWdyLT5pZ3JfbmV0WzJdKTsKLQllbHNlIGlmIChpc19leHRlcmlvcikKLQkJcHJpbnRmKCIgWCVkLiVkLiVkLjAiLCBpZ3ItPmlncl9uZXRbMF0sCi0JCSAgICBpZ3ItPmlncl9uZXRbMV0sIGlnci0+aWdyX25ldFsyXSk7Ci0JZWxzZQotCQlwcmludGYoIiAlZC4lZC4lZC4wIiwgaWdyLT5pZ3JfbmV0WzBdLAotCQkgICAgaWdyLT5pZ3JfbmV0WzFdLCBpZ3ItPmlncl9uZXRbMl0pOwotCi0JZGVsYXkgPSBFWFRSQUNUXzI0QklUUyhpZ3ItPmlncl9kbHkpOwotCWJhbmR3aWR0aCA9IEVYVFJBQ1RfMjRCSVRTKGlnci0+aWdyX2J3KTsKLQltZXRyaWMgPSBiYW5kd2lkdGggKyBkZWxheTsKLQlpZiAobWV0cmljID4gMHhmZmZmZmYpCi0JCW1ldHJpYyA9IDB4ZmZmZmZmOwotCW10dSA9IEVYVFJBQ1RfMTZCSVRTKGlnci0+aWdyX210dSk7Ci0KLQlwcmludGYoIiBkPSVkIGI9JWQgcj0lZCBsPSVkIE09JWQgbXR1PSVkIGluICVkIGhvcHMiLAotCSAgICAxMCAqIGRlbGF5LCBiYW5kd2lkdGggPT0gMCA/IDAgOiAxMDAwMDAwMCAvIGJhbmR3aWR0aCwKLQkgICAgaWdyLT5pZ3JfcmVsLCBpZ3ItPmlncl9sZCwgbWV0cmljLAotCSAgICBtdHUsIGlnci0+aWdyX2hjdCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIG9wMnN0cltdID0gewotCXsgSUdSUF9VUERBVEUsCQkidXBkYXRlIiB9LAotCXsgSUdSUF9SRVFVRVNULAkJInJlcXVlc3QiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotdm9pZAotaWdycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsIGNvbnN0IHVfY2hhciAqYnAyIF9VXykKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgaWdycGhkciAqaGRyOwotCXJlZ2lzdGVyIHVfY2hhciAqY3A7Ci0JdV9pbnQgbmludCwgbnN5cywgbmV4dDsKLQotCWhkciA9IChzdHJ1Y3QgaWdycGhkciAqKWJwOwotCWNwID0gKHVfY2hhciAqKShoZHIgKyAxKTsKLSAgICAgICAgKHZvaWQpcHJpbnRmKCJpZ3JwOiIpOwotCi0JLyogSGVhZGVyICovCi0JVENIRUNLKCpoZHIpOwotCW5pbnQgPSBFWFRSQUNUXzE2QklUUygmaGRyLT5pZ19uaSk7Ci0JbnN5cyA9IEVYVFJBQ1RfMTZCSVRTKCZoZHItPmlnX25zKTsKLQluZXh0ID0gRVhUUkFDVF8xNkJJVFMoJmhkci0+aWdfbngpOwotCi0JKHZvaWQpcHJpbnRmKCIgJXMgViVkIGVkaXQ9JWQgQVM9JWQgKCVkLyVkLyVkKSIsCi0JICAgIHRvazJzdHIob3Ayc3RyLCAib3AtIyVkIiwgSUdSUF9PUChoZHItPmlnX3ZvcCkpLAotCSAgICBJR1JQX1YoaGRyLT5pZ192b3ApLAotCSAgICBoZHItPmlnX2VkLAotCSAgICBFWFRSQUNUXzE2QklUUygmaGRyLT5pZ19hcyksCi0JICAgIG5pbnQsCi0JICAgIG5zeXMsCi0JICAgIG5leHQpOwotCi0JbGVuZ3RoIC09IHNpemVvZigqaGRyKTsKLQl3aGlsZSAobGVuZ3RoID49IElHUlBfUlRFX1NJWkUpIHsKLQkJaWYgKG5pbnQgPiAwKSB7Ci0JCQlUQ0hFQ0syKCpjcCwgSUdSUF9SVEVfU0laRSk7Ci0JCQlpZ3JwX2VudHJ5X3ByaW50KChzdHJ1Y3QgaWdycHJ0ZSAqKWNwLCAxLCAwKTsKLQkJCS0tbmludDsKLQkJfSBlbHNlIGlmIChuc3lzID4gMCkgewotCQkJVENIRUNLMigqY3AsIElHUlBfUlRFX1NJWkUpOwotCQkJaWdycF9lbnRyeV9wcmludCgoc3RydWN0IGlncnBydGUgKiljcCwgMCwgMCk7Ci0JCQktLW5zeXM7Ci0JCX0gZWxzZSBpZiAobmV4dCA+IDApIHsKLQkJCVRDSEVDSzIoKmNwLCBJR1JQX1JURV9TSVpFKTsKLQkJCWlncnBfZW50cnlfcHJpbnQoKHN0cnVjdCBpZ3JwcnRlICopY3AsIDAsIDEpOwotCQkJLS1uZXh0OwotCQl9IGVsc2UgewotCQkJKHZvaWQpcHJpbnRmKCIgW2V4dHJhIGJ5dGVzICVkXSIsIGxlbmd0aCk7Ci0JCQlicmVhazsKLQkJfQotCQljcCArPSBJR1JQX1JURV9TSVpFOwotCQlsZW5ndGggLT0gSUdSUF9SVEVfU0laRTsKLQl9Ci0JaWYgKG5pbnQgPT0gMCAmJiBuc3lzID09IDAgJiYgbmV4dCA9PSAwKQotCQlyZXR1cm47Ci10cnVuYzoKLQlmcHV0cygiIFt8aWdycF0iLCBzdGRvdXQpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaXAuYyBiL3ByaW50LWlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MjM4ZjUuLjAwMDAwMDAKLS0tIGEvcHJpbnQtaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDc0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXAuYyx2IDEuMTQ5LjIuOSAyMDA3LzA5LzE0IDAxOjMwOjAyIGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi0jaW5jbHVkZSAiaXAuaCIKLSNpbmNsdWRlICJpcHByb3RvLmgiCi0KLXN0cnVjdCB0b2sgaXBfb3B0aW9uX3ZhbHVlc1tdID0gewotICAgIHsgSVBPUFRfRU9MLCAiRU9MIiB9LAotICAgIHsgSVBPUFRfTk9QLCAiTk9QIiB9LAotICAgIHsgSVBPUFRfVFMsICJ0aW1lc3RhbXAiIH0sCi0gICAgeyBJUE9QVF9TRUNVUklUWSwgInNlY3VyaXR5IiB9LAotICAgIHsgSVBPUFRfUlIsICJSUiIgfSwKLSAgICB7IElQT1BUX1NTUlIsICJTU1JSIiB9LAotICAgIHsgSVBPUFRfTFNSUiwgIkxTUlIiIH0sCi0gICAgeyBJUE9QVF9SQSwgIlJBIiB9LAotICAgIHsgSVBPUFRfUkZDMTM5MywgInRyYWNlcm91dGUiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLS8qCi0gKiBwcmludCB0aGUgcmVjb3JkZWQgcm91dGUgaW4gYW4gSVAgUlIsIExTUlIgb3IgU1NSUiBvcHRpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1pcF9wcmludHJvdXRlKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3AsIHVfaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciB1X2ludCBwdHI7Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuOwotCi0JaWYgKGxlbmd0aCA8IDMpIHsKLQkJcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgbGVuZ3RoKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKGxlbmd0aCArIDEpICYgMykKLQkJcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgbGVuZ3RoKTsKLQlwdHIgPSBjcFsyXSAtIDE7Ci0JaWYgKHB0ciA8IDMgfHwgKChwdHIgKyAxKSAmIDMpIHx8IHB0ciA+IGxlbmd0aCArIDEpCi0JCXByaW50ZigiIFtiYWQgcHRyICV1XSIsIGNwWzJdKTsKLQotCWZvciAobGVuID0gMzsgbGVuIDwgbGVuZ3RoOyBsZW4gKz0gNCkgewotCQlwcmludGYoIiAlcyIsIGlwYWRkcl9zdHJpbmcoJmNwW2xlbl0pKTsKLSAgICAgICAgICAgICAgICBpZiAocHRyID4gbGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIik7Ci0JfQotfQotCi0vKgotICogSWYgc291cmNlLXJvdXRpbmcgaXMgcHJlc2VudCBhbmQgdmFsaWQsIHJldHVybiB0aGUgZmluYWwgZGVzdGluYXRpb24uCi0gKiBPdGhlcndpc2UsIHJldHVybiBJUCBkZXN0aW5hdGlvbi4KLSAqCi0gKiBUaGlzIGlzIHVzZWQgZm9yIFVEUCBhbmQgVENQIHBzZXVkby1oZWFkZXIgaW4gdGhlIGNoZWNrc3VtCi0gKiBjYWxjdWxhdGlvbi4KLSAqLwotdV9pbnQzMl90Ci1pcF9maW5kZHN0KGNvbnN0IHN0cnVjdCBpcCAqaXApCi17Ci0JaW50IGxlbmd0aDsKLQlpbnQgbGVuOwotCWNvbnN0IHVfY2hhciAqY3A7Ci0JdV9pbnQzMl90IHJldHZhbDsKLQotCWNwID0gKGNvbnN0IHVfY2hhciAqKShpcCArIDEpOwotCWxlbmd0aCA9IChJUF9ITChpcCkgPDwgMikgLSBzaXplb2Yoc3RydWN0IGlwKTsKLQotCWZvciAoOyBsZW5ndGggPiAwOyBjcCArPSBsZW4sIGxlbmd0aCAtPSBsZW4pIHsKLQkJaW50IHR0OwotCi0JCVRDSEVDSygqY3ApOwotCQl0dCA9ICpjcDsKLQkJaWYgKHR0ID09IElQT1BUX0VPTCkKLQkJCWJyZWFrOwotCQllbHNlIGlmICh0dCA9PSBJUE9QVF9OT1ApCi0JCQlsZW4gPSAxOwotCQllbHNlIHsKLQkJCVRDSEVDSyhjcFsxXSk7Ci0JCQlsZW4gPSBjcFsxXTsKLQkJCWlmIChsZW4gPCAyKQotCQkJCWJyZWFrOwotCQl9Ci0JCVRDSEVDSzIoKmNwLCBsZW4pOwotCQlzd2l0Y2ggKHR0KSB7Ci0KLQkJY2FzZSBJUE9QVF9TU1JSOgotCQljYXNlIElQT1BUX0xTUlI6Ci0JCQlpZiAobGVuIDwgNykKLQkJCQlicmVhazsKLQkJCW1lbWNweSgmcmV0dmFsLCBjcCArIGxlbiAtIDQsIDQpOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCX0KLXRydW5jOgotCW1lbWNweSgmcmV0dmFsLCAmaXAtPmlwX2RzdC5zX2FkZHIsIHNpemVvZih1X2ludDMyX3QpKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZAotaXBfcHJpbnR0cyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwLCB1X2ludCBsZW5ndGgpCi17Ci0JcmVnaXN0ZXIgdV9pbnQgcHRyOwotCXJlZ2lzdGVyIHVfaW50IGxlbjsKLQlpbnQgaG9wbGVuOwotCWNvbnN0IGNoYXIgKnR5cGU7Ci0KLQlpZiAobGVuZ3RoIDwgNCkgewotCQlwcmludGYoIltiYWQgbGVuZ3RoICV1XSIsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0JcHJpbnRmKCIgVFN7Iik7Ci0JaG9wbGVuID0gKChjcFszXSYweEYpICE9IElQT1BUX1RTX1RTT05MWSkgPyA4IDogNDsKLQlpZiAoKGxlbmd0aCAtIDQpICYgKGhvcGxlbi0xKSkKLQkJcHJpbnRmKCJbYmFkIGxlbmd0aCAldV0iLCBsZW5ndGgpOwotCXB0ciA9IGNwWzJdIC0gMTsKLQlsZW4gPSAwOwotCWlmIChwdHIgPCA0IHx8ICgocHRyIC0gNCkgJiAoaG9wbGVuLTEpKSB8fCBwdHIgPiBsZW5ndGggKyAxKQotCQlwcmludGYoIltiYWQgcHRyICV1XSIsIGNwWzJdKTsKLQlzd2l0Y2ggKGNwWzNdJjB4RikgewotCWNhc2UgSVBPUFRfVFNfVFNPTkxZOgotCQlwcmludGYoIlRTT05MWSIpOwotCQlicmVhazsKLQljYXNlIElQT1BUX1RTX1RTQU5EQUREUjoKLQkJcHJpbnRmKCJUUytBRERSIik7Ci0JCWJyZWFrOwotCS8qCi0JICogcHJlc3BlY2lmaWVkIHNob3VsZCByZWFsbHkgYmUgMywgYnV0IHNvbWUgb25lcyBtaWdodCBzZW5kIDIKLQkgKiBpbnN0ZWFkLCBhbmQgdGhlIElQT1BUX1RTX1BSRVNQRUMgY29uc3RhbnQgY2FuIGFwcGFyZW50bHkKLQkgKiBoYXZlIGJvdGggdmFsdWVzLCBzbyB3ZSBoYXZlIHRvIGhhcmQtY29kZSBpdCBoZXJlLgotCSAqLwotCi0JY2FzZSAyOgotCQlwcmludGYoIlBSRVNQRUMyLjAiKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgkJCS8qIElQT1BUX1RTX1BSRVNQRUMgKi8KLQkJcHJpbnRmKCJQUkVTUEVDIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiW2JhZCB0cyB0eXBlICVkXSIsIGNwWzNdJjB4Rik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl0eXBlID0gIiAiOwotCWZvciAobGVuID0gNDsgbGVuIDwgbGVuZ3RoOyBsZW4gKz0gaG9wbGVuKSB7Ci0JCWlmIChwdHIgPT0gbGVuKQotCQkJdHlwZSA9ICIgXiAiOwotCQlwcmludGYoIiVzJWRAJXMiLCB0eXBlLCBFWFRSQUNUXzMyQklUUygmY3BbbGVuK2hvcGxlbi00XSksCi0JCSAgICAgICBob3BsZW4hPTggPyAiIiA6IGlwYWRkcl9zdHJpbmcoJmNwW2xlbl0pKTsKLQkJdHlwZSA9ICIgIjsKLQl9Ci0KLWRvbmU6Ci0JcHJpbnRmKCIlcyIsIHB0ciA9PSBsZW4gPyAiIF4gIiA6ICIiKTsKLQotCWlmIChjcFszXT4+NCkKLQkJcHJpbnRmKCIgWyVkIGhvcHMgbm90IHJlY29yZGVkXX0gIiwgY3BbM10+PjQpOwotCWVsc2UKLQkJcHJpbnRmKCJ9Iik7Ci19Ci0KLS8qCi0gKiBwcmludCBJUCBvcHRpb25zLgotICovCi1zdGF0aWMgdm9pZAotaXBfb3B0cHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIHVfaW50IG9wdGlvbl9sZW47Ci0JY29uc3QgY2hhciAqc2VwID0gIiI7Ci0KLQlmb3IgKDsgbGVuZ3RoID4gMDsgY3AgKz0gb3B0aW9uX2xlbiwgbGVuZ3RoIC09IG9wdGlvbl9sZW4pIHsKLQkJdV9pbnQgb3B0aW9uX2NvZGU7Ci0KLQkJcHJpbnRmKCIlcyIsIHNlcCk7Ci0JCXNlcCA9ICIsIjsKLQotCQlUQ0hFQ0soKmNwKTsKLQkJb3B0aW9uX2NvZGUgPSAqY3A7Ci0KLSAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaXBfb3B0aW9uX3ZhbHVlcywidW5rbm93biAldSIsb3B0aW9uX2NvZGUpKTsKLQotCQlpZiAob3B0aW9uX2NvZGUgPT0gSVBPUFRfTk9QIHx8Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbl9jb2RlID09IElQT1BUX0VPTCkKLQkJCW9wdGlvbl9sZW4gPSAxOwotCi0JCWVsc2UgewotCQkJVENIRUNLKGNwWzFdKTsKLQkJCW9wdGlvbl9sZW4gPSBjcFsxXTsKLQkJCWlmIChvcHRpb25fbGVuIDwgMikgewotCQkgICAgICAgICAgICAgICAgcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgb3B0aW9uX2xlbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJaWYgKG9wdGlvbl9sZW4gPiBsZW5ndGgpIHsKLQkgICAgICAgICAgICAgICAgcHJpbnRmKCIgW2JhZCBsZW5ndGggJXVdIiwgb3B0aW9uX2xlbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotICAgICAgICAgICAgICAgIFRDSEVDSzIoKmNwLCBvcHRpb25fbGVuKTsKLQotCQlzd2l0Y2ggKG9wdGlvbl9jb2RlKSB7Ci0JCWNhc2UgSVBPUFRfRU9MOgotCQkJcmV0dXJuOwotCi0JCWNhc2UgSVBPUFRfVFM6Ci0JCQlpcF9wcmludHRzKGNwLCBvcHRpb25fbGVuKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBPUFRfUlI6ICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIElQT1BUX1NTUlI6Ci0JCWNhc2UgSVBPUFRfTFNSUjoKLQkJCWlwX3ByaW50cm91dGUoY3AsIG9wdGlvbl9sZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJUE9QVF9SQToKLQkJCWlmIChvcHRpb25fbGVuIDwgNCkgewotCQkJCXByaW50ZigiIFtiYWQgbGVuZ3RoICV1XSIsIG9wdGlvbl9sZW4pOwotCQkJCWJyZWFrOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLKGNwWzNdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFWFRSQUNUXzE2QklUUygmY3BbMl0pICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgdmFsdWUgJXUiLCBFWFRSQUNUXzE2QklUUygmY3BbMl0pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBPUFRfTk9QOiAgICAgICAvKiBub3RoaW5nIHRvIHByaW50IC0gZmFsbCB0aHJvdWdoICovCi0JCWNhc2UgSVBPUFRfU0VDVVJJVFk6Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiW3xpcF0iKTsKLX0KLQotLyoKLSAqIGNvbXB1dGUgYW4gSVAgaGVhZGVyIGNoZWNrc3VtLgotICogZG9uJ3QgbW9kaWZpeSB0aGUgcGFja2V0LgotICovCi11X3Nob3J0Ci1pbl9ja3N1bShjb25zdCB1X3Nob3J0ICphZGRyLCByZWdpc3RlciB1X2ludCBsZW4sIGludCBjc3VtKQotewotCWludCBubGVmdCA9IGxlbjsKLQljb25zdCB1X3Nob3J0ICp3ID0gYWRkcjsKLQl1X3Nob3J0IGFuc3dlcjsKLQlpbnQgc3VtID0gY3N1bTsKLQotCS8qCi0JICogIE91ciBhbGdvcml0aG0gaXMgc2ltcGxlLCB1c2luZyBhIDMyIGJpdCBhY2N1bXVsYXRvciAoc3VtKSwKLQkgKiAgd2UgYWRkIHNlcXVlbnRpYWwgMTYgYml0IHdvcmRzIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCwgZm9sZAotCSAqICBiYWNrIGFsbCB0aGUgY2FycnkgYml0cyBmcm9tIHRoZSB0b3AgMTYgYml0cyBpbnRvIHRoZSBsb3dlcgotCSAqICAxNiBiaXRzLgotCSAqLwotCXdoaWxlIChubGVmdCA+IDEpICB7Ci0JCXN1bSArPSAqdysrOwotCQlubGVmdCAtPSAyOwotCX0KLQlpZiAobmxlZnQgPT0gMSkKLQkJc3VtICs9IGh0b25zKCoodV9jaGFyICopdzw8OCk7Ci0KLQkvKgotCSAqIGFkZCBiYWNrIGNhcnJ5IG91dHMgZnJvbSB0b3AgMTYgYml0cyB0byBsb3cgMTYgYml0cwotCSAqLwotCXN1bSA9IChzdW0gPj4gMTYpICsgKHN1bSAmIDB4ZmZmZik7CS8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KLQlzdW0gKz0gKHN1bSA+PiAxNik7CQkJLyogYWRkIGNhcnJ5ICovCi0JYW5zd2VyID0gfnN1bTsJCQkJLyogdHJ1bmNhdGUgdG8gMTYgYml0cyAqLwotCXJldHVybiAoYW5zd2VyKTsKLX0KLQotLyoKLSAqIEdpdmVuIHRoZSBob3N0LWJ5dGUtb3JkZXIgdmFsdWUgb2YgdGhlIGNoZWNrc3VtIGZpZWxkIGluIGEgcGFja2V0Ci0gKiBoZWFkZXIsIGFuZCB0aGUgbmV0d29yay1ieXRlLW9yZGVyIGNvbXB1dGVkIGNoZWNrc3VtIG9mIHRoZSBkYXRhCi0gKiB0aGF0IHRoZSBjaGVja3N1bSBjb3ZlcnMgKGluY2x1ZGluZyB0aGUgY2hlY2tzdW0gaXRzZWxmKSwgY29tcHV0ZQotICogd2hhdCB0aGUgY2hlY2tzdW0gZmllbGQgKnNob3VsZCogaGF2ZSBiZWVuLgotICovCi11X2ludDE2X3QKLWluX2Nrc3VtX3Nob3VsZGJlKHVfaW50MTZfdCBzdW0sIHVfaW50MTZfdCBjb21wdXRlZF9zdW0pCi17Ci0JdV9pbnQzMl90IHNob3VsZGJlOwotCi0JLyoKLQkgKiBUaGUgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSBnb25lIGludG8gdGhlIGNoZWNrc3VtIGZpZWxkCi0JICogaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSB2YWx1ZSBnb3R0ZW4gYnkgc3VtbWluZyB1cCBldmVyeXRoaW5nCi0JICogKmJ1dCogdGhlIGNoZWNrc3VtIGZpZWxkLgotCSAqCi0JICogV2UgY2FuIGNvbXB1dGUgdGhhdCBieSBzdWJ0cmFjdGluZyB0aGUgdmFsdWUgb2YgdGhlIGNoZWNrc3VtCi0JICogZmllbGQgZnJvbSB0aGUgc3VtIG9mIGFsbCB0aGUgZGF0YSBpbiB0aGUgcGFja2V0LCBhbmQgdGhlbgotCSAqIGNvbXB1dGluZyB0aGUgbmVnYXRpdmUgb2YgdGhhdCB2YWx1ZS4KLQkgKgotCSAqICJzdW0iIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0gZmllbGQsIGFuZCAiY29tcHV0ZWRfc3VtIgotCSAqIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgc3VtIG9mIGFsbCB0aGUgZGF0YSBpbiB0aGUgcGFja2V0cywKLQkgKiBzbyB0aGF0J3MgLSgtY29tcHV0ZWRfc3VtIC0gc3VtKSwgb3IgKHN1bSArIGNvbXB1dGVkX3N1bSkuCi0JICoKLQkgKiBBbGwgdGhlIGFyaXRobWV0aWMgaW4gcXVlc3Rpb24gaXMgb25lJ3MgY29tcGxlbWVudCwgc28gdGhlCi0JICogYWRkaXRpb24gbXVzdCBpbmNsdWRlIGFuIGVuZC1hcm91bmQgY2Fycnk7IHdlIGRvIHRoaXMgYnkKLQkgKiBkb2luZyB0aGUgYXJpdGhtZXRpYyBpbiAzMiBiaXRzICh3aXRoIG5vIHNpZ24tZXh0ZW5zaW9uKSwKLQkgKiBhbmQgdGhlbiBhZGRpbmcgdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIHN1bSwgd2hpY2ggY29udGFpbgotCSAqIHRoZSBjYXJyeSwgdG8gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHN1bSwgYW5kIHRoZW4gZG8gaXQKLQkgKiBhZ2FpbiBpbiBjYXNlICp0aGF0KiBzdW0gcHJvZHVjZWQgYSBjYXJyeS4KLQkgKgotCSAqIEFzIFJGQyAxMDcxIG5vdGVzLCB0aGUgY2hlY2tzdW0gY2FuIGJlIGNvbXB1dGVkIHdpdGhvdXQKLQkgKiBieXRlLXN3YXBwaW5nIHRoZSAxNi1iaXQgd29yZHM7IHN1bW1pbmcgMTYtYml0IHdvcmRzCi0JICogb24gYSBiaWctZW5kaWFuIG1hY2hpbmUgZ2l2ZXMgYSBiaWctZW5kaWFuIGNoZWNrc3VtLCB3aGljaAotCSAqIGNhbiBiZSBkaXJlY3RseSBzdHVmZmVkIGludG8gdGhlIGJpZy1lbmRpYW4gY2hlY2tzdW0gZmllbGRzCi0JICogaW4gcHJvdG9jb2wgaGVhZGVycywgYW5kIHN1bW1pbmcgd29yZHMgb24gYSBsaXR0bGUtZW5kaWFuCi0JICogbWFjaGluZSBnaXZlcyBhIGxpdHRsZS1lbmRpYW4gY2hlY2tzdW0sIHdoaWNoIG11c3QgYmUKLQkgKiBieXRlLXN3YXBwZWQgYmVmb3JlIGJlaW5nIHN0dWZmZWQgaW50byBhIGJpZy1lbmRpYW4gY2hlY2tzdW0KLQkgKiBmaWVsZC4KLQkgKgotCSAqICJjb21wdXRlZF9zdW0iIGlzIGEgbmV0d29yay1ieXRlLW9yZGVyIHZhbHVlLCBzbyB3ZSBtdXN0IHB1dAotCSAqIGl0IGluIGhvc3QgYnl0ZSBvcmRlciBiZWZvcmUgc3VidHJhY3RpbmcgaXQgZnJvbSB0aGUKLQkgKiBob3N0LWJ5dGUtb3JkZXIgdmFsdWUgZnJvbSB0aGUgaGVhZGVyOyB0aGUgYWRqdXN0ZWQgY2hlY2tzdW0KLQkgKiB3aWxsIGJlIGluIGhvc3QgYnl0ZSBvcmRlciwgd2hpY2ggaXMgd2hhdCB3ZSdsbCByZXR1cm4uCi0JICovCi0Jc2hvdWxkYmUgPSBzdW07Ci0Jc2hvdWxkYmUgKz0gbnRvaHMoY29tcHV0ZWRfc3VtKTsKLQlzaG91bGRiZSA9IChzaG91bGRiZSAmIDB4RkZGRikgKyAoc2hvdWxkYmUgPj4gMTYpOwotCXNob3VsZGJlID0gKHNob3VsZGJlICYgMHhGRkZGKSArIChzaG91bGRiZSA+PiAxNik7Ci0JcmV0dXJuIHNob3VsZGJlOwotfQotCi0jZGVmaW5lIElQX1JFUyAweDgwMDAKLQotc3RhdGljIHN0cnVjdCB0b2sgaXBfZnJhZ192YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBJUF9NRiwgICAgICAgICIrIiB9LAotICAgICAgICB7IElQX0RGLCAgICAgICAgIkRGIiB9LAotCXsgSVBfUkVTLCAgICAgICAicnN2ZCIgfSwgLyogVGhlIFJGQzM1MTQgZXZpbCA7LSkgYml0ICovCi0gICAgICAgIHsgMCwgICAgICAgICAgICBOVUxMIH0KLX07Ci0KLXN0cnVjdCBpcF9wcmludF9kZW11eF9zdGF0ZSB7Ci0JY29uc3Qgc3RydWN0IGlwICppcDsKLQljb25zdCB1X2NoYXIgKmNwOwotCXVfaW50ICAgbGVuLCBvZmY7Ci0JdV9jaGFyICBuaDsKLQlpbnQgICAgIGFkdmFuY2U7Ci19OwotCi1zdGF0aWMgdm9pZAotaXBfcHJpbnRfZGVtdXgobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JICAgICAgIHN0cnVjdCBpcF9wcmludF9kZW11eF9zdGF0ZSAqaXBkcykKLXsKLQlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOwotCi1hZ2FpbjoKLQlzd2l0Y2ggKGlwZHMtPm5oKSB7Ci0KLQljYXNlIElQUFJPVE9fQUg6Ci0JCWlwZHMtPm5oID0gKmlwZHMtPmNwOwotCQlpcGRzLT5hZHZhbmNlID0gYWhfcHJpbnQoaXBkcy0+Y3ApOwotCQlpZiAoaXBkcy0+YWR2YW5jZSA8PSAwKQotCQkJYnJlYWs7Ci0JCWlwZHMtPmNwICs9IGlwZHMtPmFkdmFuY2U7Ci0JCWlwZHMtPmxlbiAtPSBpcGRzLT5hZHZhbmNlOwotCQlnb3RvIGFnYWluOwotCi0JY2FzZSBJUFBST1RPX0VTUDoKLQl7Ci0JCWludCBlbmgsIHBhZGxlbjsKLQkJaXBkcy0+YWR2YW5jZSA9IGVzcF9wcmludChuZG8sIGlwZHMtPmNwLCBpcGRzLT5sZW4sCi0JCQkJICAgIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCwKLQkJCQkgICAgJmVuaCwgJnBhZGxlbik7Ci0JCWlmIChpcGRzLT5hZHZhbmNlIDw9IDApCi0JCQlicmVhazsKLQkJaXBkcy0+Y3AgKz0gaXBkcy0+YWR2YW5jZTsKLQkJaXBkcy0+bGVuIC09IGlwZHMtPmFkdmFuY2UgKyBwYWRsZW47Ci0JCWlwZHMtPm5oID0gZW5oICYgMHhmZjsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JCi0JY2FzZSBJUFBST1RPX0lQQ09NUDoKLQl7Ci0JCWludCBlbmg7Ci0JCWlwZHMtPmFkdmFuY2UgPSBpcGNvbXBfcHJpbnQoaXBkcy0+Y3AsICZlbmgpOwotCQlpZiAoaXBkcy0+YWR2YW5jZSA8PSAwKQotCQkJYnJlYWs7Ci0JCWlwZHMtPmNwICs9IGlwZHMtPmFkdmFuY2U7Ci0JCWlwZHMtPmxlbiAtPSBpcGRzLT5hZHZhbmNlOwotCQlpcGRzLT5uaCA9IGVuaCAmIDB4ZmY7Ci0JCWdvdG8gYWdhaW47Ci0JfQotCi0JY2FzZSBJUFBST1RPX1NDVFA6Ci0JCXNjdHBfcHJpbnQoaXBkcy0+Y3AsIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCwgaXBkcy0+bGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQUFJPVE9fRENDUDoKLQkJZGNjcF9wcmludChpcGRzLT5jcCwgKGNvbnN0IHVfY2hhciAqKWlwZHMtPmlwLCBpcGRzLT5sZW4pOwotCQlicmVhazsKLQkJCi0JY2FzZSBJUFBST1RPX1RDUDoKLQkJLyogcGFzcyBvbiB0aGUgTUYgYml0IHBsdXMgdGhlIG9mZnNldCB0byBkZXRlY3QgZnJhZ21lbnRzICovCi0JCXRjcF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXAsCi0JCQkgIGlwZHMtPm9mZiAmIChJUF9NRnxJUF9PRkZNQVNLKSk7Ci0JCWJyZWFrOwotCQkKLQljYXNlIElQUFJPVE9fVURQOgotCQkvKiBwYXNzIG9uIHRoZSBNRiBiaXQgcGx1cyB0aGUgb2Zmc2V0IHRvIGRldGVjdCBmcmFnbWVudHMgKi8KLQkJdWRwX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4sIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCwKLQkJCSAgaXBkcy0+b2ZmICYgKElQX01GfElQX09GRk1BU0spKTsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgSVBQUk9UT19JQ01QOgotCQkvKiBwYXNzIG9uIHRoZSBNRiBiaXQgcGx1cyB0aGUgb2Zmc2V0IHRvIGRldGVjdCBmcmFnbWVudHMgKi8KLQkJaWNtcF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXAsCi0JCQkgICBpcGRzLT5vZmYgJiAoSVBfTUZ8SVBfT0ZGTUFTSykpOwotCQlicmVhazsKLQkJCi0JY2FzZSBJUFBST1RPX1BJR1A6Ci0JCS8qCi0JCSAqIFhYWCAtIHRoZSBjdXJyZW50IElBTkEgcHJvdG9jb2wgbnVtYmVyIGFzc2lnbm1lbnRzCi0JCSAqIHBhZ2UgbGlzdHMgOSBhcyAiYW55IHByaXZhdGUgaW50ZXJpb3IgZ2F0ZXdheQotCQkgKiAodXNlZCBieSBDaXNjbyBmb3IgdGhlaXIgSUdSUCkiIGFuZCA4OCBhcwotCQkgKiAiRUlHUlAiIGZyb20gQ2lzY28uCi0JCSAqCi0JCSAqIFJlY2VudCBCU0QgPG5ldGluZXQvaW4uaD4gaGVhZGVycyBkZWZpbmUKLQkJICogSVBfUFJPVE9fUElHUCBhcyA5IGFuZCBJUF9QUk9UT19JR1JQIGFzIDg4LgotCQkgKiBXZSBkZWZpbmUgSVBfUFJPVE9fUElHUCBhcyA5IGFuZAotCQkgKiBJUF9QUk9UT19FSUdSUCBhcyA4ODsgdGhvc2UgbmFtZXMgYmV0dGVyCi0JCSAqIG1hdGNoIHdhcyB0aGUgY3VycmVudCBwcm90b2NvbCBudW1iZXIKLQkJICogYXNzaWdubWVudHMgc2F5LgotCQkgKi8KLQkJaWdycF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXApOwotCQlicmVhazsKLQkJCi0JY2FzZSBJUFBST1RPX0VJR1JQOgotCQllaWdycF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKLQkJYnJlYWs7Ci0JCQotCWNhc2UgSVBQUk9UT19ORDoKLQkJTkRfUFJJTlQoKG5kbywgIiBuZCAlZCIsIGlwZHMtPmxlbikpOwotCQlicmVhazsKLQotCWNhc2UgSVBQUk9UT19FR1A6Ci0JCWVncF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQUFJPVE9fT1NQRjoKLQkJb3NwZl9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuLCAoY29uc3QgdV9jaGFyICopaXBkcy0+aXApOwotCQlicmVhazsKLQotCWNhc2UgSVBQUk9UT19JR01QOgotCQlpZ21wX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4pOwotCQlicmVhazsKLQotCWNhc2UgSVBQUk9UT19JUFY0OgotCQkvKiBEVk1SUCBtdWx0aWNhc3QgdHVubmVsIChpcC1pbi1pcCBlbmNhcHN1bGF0aW9uKSAqLwotCQlpcF9wcmludChnbmRvLCBpcGRzLT5jcCwgaXBkcy0+bGVuKTsKLQkJaWYgKCEgdmZsYWcpIHsKLQkJCU5EX1BSSU5UKChuZG8sICIgKGlwaXAtcHJvdG8tNCkiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0JCQotI2lmZGVmIElORVQ2Ci0JY2FzZSBJUFBST1RPX0lQVjY6Ci0JCS8qIGlwNi1pbi1pcCBlbmNhcHN1bGF0aW9uICovCi0JCWlwNl9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLypJTkVUNiovCi0KLQljYXNlIElQUFJPVE9fUlNWUDoKLQkJcnN2cF9wcmludChpcGRzLT5jcCwgaXBkcy0+bGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElQUFJPVE9fR1JFOgotCQkvKiBkbyBpdCAqLwotCQlncmVfcHJpbnQoaXBkcy0+Y3AsIGlwZHMtPmxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUFBST1RPX01PQklMRToKLQkJbW9iaWxlX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4pOwotCQlicmVhazsKLQotCWNhc2UgSVBQUk9UT19QSU06Ci0JCXBpbV9wcmludChpcGRzLT5jcCwgIGlwZHMtPmxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUFBST1RPX1ZSUlA6Ci0JCXZycnBfcHJpbnQoaXBkcy0+Y3AsIGlwZHMtPmxlbiwgaXBkcy0+aXAtPmlwX3R0bCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUFBST1RPX1BHTToKLQkJcGdtX3ByaW50KGlwZHMtPmNwLCBpcGRzLT5sZW4sIChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJaWYgKChwcm90byA9IGdldHByb3RvYnludW1iZXIoaXBkcy0+bmgpKSAhPSBOVUxMKQotCQkJTkRfUFJJTlQoKG5kbywgIiAlcyIsIHByb3RvLT5wX25hbWUpKTsKLQkJZWxzZQotCQkJTkRfUFJJTlQoKG5kbywgIiBpcC1wcm90by0lZCIsIGlwZHMtPm5oKSk7Ci0JCU5EX1BSSU5UKChuZG8sICIgJWQiLCBpcGRzLT5sZW4pKTsKLQkJYnJlYWs7Ci0JfQotfQotCSAgICAgICAKLXZvaWQKLWlwX3ByaW50X2lubmVyKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCSAgICAgICBjb25zdCB1X2NoYXIgKmJwLAotCSAgICAgICB1X2ludCBsZW5ndGgsIHVfaW50IG5oLAotCSAgICAgICBjb25zdCB1X2NoYXIgKmJwMikKLXsKLQlzdHJ1Y3QgaXBfcHJpbnRfZGVtdXhfc3RhdGUgIGlwZDsKLQotCWlwZC5pcCA9IChjb25zdCBzdHJ1Y3QgaXAgKilicDI7Ci0JaXBkLmNwID0gYnA7Ci0JaXBkLmxlbiAgPSBsZW5ndGg7Ci0JaXBkLm9mZiAgPSAwOwotCWlwZC5uaCAgID0gbmg7Ci0JaXBkLmFkdmFuY2UgPSAwOwotCi0JaXBfcHJpbnRfZGVtdXgobmRvLCAmaXBkKTsKLX0KLQotCi0vKgotICogcHJpbnQgYW4gSVAgZGF0YWdyYW0uCi0gKi8KLXZvaWQKLWlwX3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLAotCSBjb25zdCB1X2NoYXIgKmJwLAotCSB1X2ludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGlwX3ByaW50X2RlbXV4X3N0YXRlICBpcGQ7Ci0Jc3RydWN0IGlwX3ByaW50X2RlbXV4X3N0YXRlICppcGRzPSZpcGQ7Ci0JY29uc3QgdV9jaGFyICppcGVuZDsKLQl1X2ludCBobGVuOwotCXVfaW50MTZfdCBzdW0sIGlwX3N1bTsKLQlzdHJ1Y3QgcHJvdG9lbnQgKnByb3RvOwotCi0JaXBkcy0+aXAgPSAoY29uc3Qgc3RydWN0IGlwICopYnA7Ci0JaWYgKElQX1YoaXBkcy0+aXApICE9IDQpIHsgLyogcHJpbnQgdmVyc2lvbiBpZiAhPSA0ICovCi0JICAgIHByaW50ZigiSVAldSAiLCBJUF9WKGlwZHMtPmlwKSk7Ci0JICAgIGlmIChJUF9WKGlwZHMtPmlwKSA9PSA2KQotCQlwcmludGYoIiwgd3JvbmcgbGluay1sYXllciBlbmNhcHN1bGF0aW9uIik7Ci0JfQotICAgICAgICBlbHNlIGlmICghZWZsYWcpCi0JICAgIHByaW50ZigiSVAgIik7Ci0KLQlpZiAoKHVfY2hhciAqKShpcGRzLT5pcCArIDEpID4gc25hcGVuZCkgewotCQlwcmludGYoIlt8aXBdIik7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGxlbmd0aCA8IHNpemVvZiAoc3RydWN0IGlwKSkgewotCQkodm9pZClwcmludGYoInRydW5jYXRlZC1pcCAldSIsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0JaGxlbiA9IElQX0hMKGlwZHMtPmlwKSAqIDQ7Ci0JaWYgKGhsZW4gPCBzaXplb2YgKHN0cnVjdCBpcCkpIHsKLQkJKHZvaWQpcHJpbnRmKCJiYWQtaGxlbiAldSIsIGhsZW4pOwotCQlyZXR1cm47Ci0JfQotCi0JaXBkcy0+bGVuID0gRVhUUkFDVF8xNkJJVFMoJmlwZHMtPmlwLT5pcF9sZW4pOwotCWlmIChsZW5ndGggPCBpcGRzLT5sZW4pCi0JCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLWlwIC0gJXUgYnl0ZXMgbWlzc2luZyEgIiwKLQkJCWlwZHMtPmxlbiAtIGxlbmd0aCk7Ci0JaWYgKGlwZHMtPmxlbiA8IGhsZW4pIHsKLSNpZmRlZiBHVUVTU19UU08KLSAgICAgICAgICAgIGlmIChpcGRzLT5sZW4pIHsKLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoImJhZC1sZW4gJXUiLCBpcGRzLT5sZW4pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8qIHdlIGd1ZXNzIHRoYXQgaXQgaXMgYSBUU08gc2VuZCAqLwotICAgICAgICAgICAgICAgIGlwZHMtPmxlbiA9IGxlbmd0aDsKLSAgICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgICAodm9pZClwcmludGYoImJhZC1sZW4gJXUiLCBpcGRzLT5sZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotI2VuZGlmIC8qIEdVRVNTX1RTTyAqLwotCX0KLQotCS8qCi0JICogQ3V0IG9mZiB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIHRoZSBlbmQgb2YgdGhlIElQIHBheWxvYWQuCi0JICovCi0JaXBlbmQgPSBicCArIGlwZHMtPmxlbjsKLQlpZiAoaXBlbmQgPCBzbmFwZW5kKQotCQlzbmFwZW5kID0gaXBlbmQ7Ci0KLQlpcGRzLT5sZW4gLT0gaGxlbjsKLQotCWlwZHMtPm9mZiA9IEVYVFJBQ1RfMTZCSVRTKCZpcGRzLT5pcC0+aXBfb2ZmKTsKLQotICAgICAgICBpZiAodmZsYWcpIHsKLSAgICAgICAgICAgICh2b2lkKXByaW50ZigiKHRvcyAweCV4IiwgKGludClpcGRzLT5pcC0+aXBfdG9zKTsKLSAgICAgICAgICAgIC8qIEVDTiBiaXRzICovCi0gICAgICAgICAgICBpZiAoaXBkcy0+aXAtPmlwX3RvcyAmIDB4MDMpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGlwZHMtPmlwLT5pcF90b3MgJiAweDAzKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIixFQ1QoMSkiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIixFQ1QoMCkiKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIixDRSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlwZHMtPmlwLT5pcF90dGwgPj0gMSkKLSAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiwgdHRsICV1IiwgaXBkcy0+aXAtPmlwX3R0bCk7ICAgIAotCi0JICAgIC8qCi0JICAgICAqIGZvciB0aGUgZmlyZXdhbGwgZ3V5cywgcHJpbnQgaWQsIG9mZnNldC4KLSAgICAgICAgICAgICAqIE9uIGFsbCBidXQgdGhlIGxhc3Qgc3RpY2sgYSAiKyIgaW4gdGhlIGZsYWdzIHBvcnRpb24uCi0JICAgICAqIEZvciB1bmZyYWdtZW50ZWQgZGF0YWdyYW1zLCBub3RlIHRoZSBkb24ndCBmcmFnbWVudCBmbGFnLgotCSAgICAgKi8KLQotCSAgICAodm9pZClwcmludGYoIiwgaWQgJXUsIG9mZnNldCAldSwgZmxhZ3MgWyVzXSwgcHJvdG8gJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmlwZHMtPmlwLT5pcF9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGlwZHMtPm9mZiAmIDB4MWZmZikgKiA4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoaXBfZnJhZ192YWx1ZXMsICJub25lIiwgaXBkcy0+b2ZmJjB4ZTAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihpcHByb3RvX3ZhbHVlcywidW5rbm93biIsaXBkcy0+aXAtPmlwX3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlwZHMtPmlwLT5pcF9wKTsKLQotICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIGxlbmd0aCAldSIsIEVYVFJBQ1RfMTZCSVRTKCZpcGRzLT5pcC0+aXBfbGVuKSk7Ci0KLSAgICAgICAgICAgIGlmICgoaGxlbiAtIHNpemVvZihzdHJ1Y3QgaXApKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgb3B0aW9ucyAoIik7Ci0gICAgICAgICAgICAgICAgaXBfb3B0cHJpbnQoKHVfY2hhciAqKShpcGRzLT5pcCArIDEpLCBobGVuIC0gc2l6ZW9mKHN0cnVjdCBpcCkpOwotICAgICAgICAgICAgICAgIHByaW50ZigiKSIpOwotICAgICAgICAgICAgfQotCi0JICAgIGlmICgodV9jaGFyICopaXBkcy0+aXAgKyBobGVuIDw9IHNuYXBlbmQpIHsKLQkgICAgICAgIHN1bSA9IGluX2Nrc3VtKChjb25zdCB1X3Nob3J0ICopaXBkcy0+aXAsIGhsZW4sIDApOwotCQlpZiAoc3VtICE9IDApIHsKLQkJICAgIGlwX3N1bSA9IEVYVFJBQ1RfMTZCSVRTKCZpcGRzLT5pcC0+aXBfc3VtKTsKLQkJICAgICh2b2lkKXByaW50ZigiLCBiYWQgY2tzdW0gJXggKC0+JXgpISIsIGlwX3N1bSwKLQkJCSAgICAgaW5fY2tzdW1fc2hvdWxkYmUoaXBfc3VtLCBzdW0pKTsKLQkJfQotCSAgICB9Ci0KLSAgICAgICAgICAgIHByaW50ZigiKSAiKTsKLQl9Ci0KLQkvKgotCSAqIElmIHRoaXMgaXMgZnJhZ21lbnQgemVybywgaGFuZCBpdCB0byB0aGUgbmV4dCBoaWdoZXIKLQkgKiBsZXZlbCBwcm90b2NvbC4KLQkgKi8KLQlpZiAoKGlwZHMtPm9mZiAmIDB4MWZmZikgPT0gMCkgewotCQlpcGRzLT5jcCA9IChjb25zdCB1X2NoYXIgKilpcGRzLT5pcCArIGhsZW47Ci0JCWlwZHMtPm5oID0gaXBkcy0+aXAtPmlwX3A7Ci0KLQkJaWYgKGlwZHMtPm5oICE9IElQUFJPVE9fVENQICYmIGlwZHMtPm5oICE9IElQUFJPVE9fVURQICYmCi0JCSAgICBpcGRzLT5uaCAhPSBJUFBST1RPX1NDVFAgJiYgaXBkcy0+bmggIT0gSVBQUk9UT19EQ0NQKSB7Ci0JCQkodm9pZClwcmludGYoIiVzID4gJXM6ICIsCi0JCQkJICAgICBpcGFkZHJfc3RyaW5nKCZpcGRzLT5pcC0+aXBfc3JjKSwKLQkJCQkgICAgIGlwYWRkcl9zdHJpbmcoJmlwZHMtPmlwLT5pcF9kc3QpKTsKLQkJfQotCQlpcF9wcmludF9kZW11eChuZG8sIGlwZHMpOwotCX0gZWxzZSB7Ci0JICAgIC8qIFVsdHJhIHF1aWV0IG5vdyBtZWFucyB0aGF0IGFsbCB0aGlzIHN0dWZmIHNob3VsZCBiZSBzdXBwcmVzc2VkICovCi0JICAgIGlmIChxZmxhZyA+IDEpIHJldHVybjsKLQotCSAgICAvKgotCSAgICAgKiBpZiB0aGlzIGlzbid0IHRoZSBmaXJzdCBmcmFnLCB3ZSdyZSBtaXNzaW5nIHRoZQotCSAgICAgKiBuZXh0IGxldmVsIHByb3RvY29sIGhlYWRlci4gIHByaW50IHRoZSBpcCBhZGRyCi0JICAgICAqIGFuZCB0aGUgcHJvdG9jb2wuCi0JICAgICAqLwotCSAgICBpZiAoaXBkcy0+b2ZmICYgMHgxZmZmKSB7Ci0JICAgICAgICAodm9pZClwcmludGYoIiVzID4gJXM6IiwgaXBhZGRyX3N0cmluZygmaXBkcy0+aXAtPmlwX3NyYyksCi0JCQkgICAgIGlwYWRkcl9zdHJpbmcoJmlwZHMtPmlwLT5pcF9kc3QpKTsKLQkJaWYgKChwcm90byA9IGdldHByb3RvYnludW1iZXIoaXBkcy0+aXAtPmlwX3ApKSAhPSBOVUxMKQotCQkgICAgKHZvaWQpcHJpbnRmKCIgJXMiLCBwcm90by0+cF9uYW1lKTsKLQkJZWxzZQotCQkgICAgKHZvaWQpcHJpbnRmKCIgaXAtcHJvdG8tJWQiLCBpcGRzLT5pcC0+aXBfcCk7Ci0JICAgIH0gCi0JfQotfQotCi12b2lkCi1pcE5fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoKQotewotCXN0cnVjdCBpcCAqaXAsIGhkcjsKLQotCWlwID0gKHN0cnVjdCBpcCAqKWJwOwotCWlmIChsZW5ndGggPCA0KSB7Ci0JCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLWlwICVkIiwgbGVuZ3RoKTsKLQkJcmV0dXJuOwotCX0KLQltZW1jcHkgKCZoZHIsIChjaGFyICopaXAsIDQpOwotCXN3aXRjaCAoSVBfVigmaGRyKSkgewotCWNhc2UgNDoKLQkJaXBfcHJpbnQgKGduZG8sIGJwLCBsZW5ndGgpOwotCQlyZXR1cm47Ci0jaWZkZWYgSU5FVDYKLQljYXNlIDY6Ci0JCWlwNl9wcmludCAoYnAsIGxlbmd0aCk7Ci0JCXJldHVybjsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCSh2b2lkKXByaW50ZigidW5rbm93biBpcCAlZCIsIElQX1YoJmhkcikpOwotCQlyZXR1cm47Ci0JfQotfQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogYy1zdHlsZTogd2hpdGVzbWl0aAotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwotCi0KZGlmZiAtLWdpdCBhL3ByaW50LWlwNi5jIGIvcHJpbnQtaXA2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTU5ODguLjAwMDAwMDAKLS0tIGEvcHJpbnQtaXA2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NAotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWlwNi5jLHYgMS40Ny4yLjUgMjAwNy8wOS8yMSAwNzowNzo1MiBoYW5uZXMgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmZGVmIElORVQ2Ci0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLSNpbmNsdWRlICJpcDYuaCIKLSNpbmNsdWRlICJpcHByb3RvLmgiCi0KLS8qCi0gKiBwcmludCBhbiBJUDYgZGF0YWdyYW0uCi0gKi8KLXZvaWQKLWlwNl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgpCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKLQlyZWdpc3RlciBpbnQgYWR2YW5jZTsKLQl1X2ludCBsZW47Ci0JY29uc3QgdV9jaGFyICppcGVuZDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwOwotCXJlZ2lzdGVyIHVfaW50IHBheWxvYWRfbGVuOwotCWludCBuaDsKLQlpbnQgZnJhZ21lbnRlZCA9IDA7Ci0JdV9pbnQgZmxvdzsKLQotCWlwNiA9IChjb25zdCBzdHJ1Y3QgaXA2X2hkciAqKWJwOwotCi0JVENIRUNLKCppcDYpOwotCWlmIChsZW5ndGggPCBzaXplb2YgKHN0cnVjdCBpcDZfaGRyKSkgewotCQkodm9pZClwcmludGYoInRydW5jYXRlZC1pcDYgJXUiLCBsZW5ndGgpOwotCQlyZXR1cm47Ci0JfQotCi0gICAgICAgIGlmICghZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIklQNiAiKTsKLQotCXBheWxvYWRfbGVuID0gRVhUUkFDVF8xNkJJVFMoJmlwNi0+aXA2X3BsZW4pOwotCWxlbiA9IHBheWxvYWRfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKTsKLQlpZiAobGVuZ3RoIDwgbGVuKQotCQkodm9pZClwcmludGYoInRydW5jYXRlZC1pcDYgLSAldSBieXRlcyBtaXNzaW5nISIsCi0JCQlsZW4gLSBsZW5ndGgpOwotCi0gICAgICAgIGlmICh2ZmxhZykgewotICAgICAgICAgICAgZmxvdyA9IEVYVFJBQ1RfMzJCSVRTKCZpcDYtPmlwNl9mbG93KTsKLSAgICAgICAgICAgIHByaW50ZigiKCIpOwotI2lmIDAKLSAgICAgICAgICAgIC8qIHJmYzE4ODMgKi8KLSAgICAgICAgICAgIGlmIChmbG93ICYgMHgwZjAwMDAwMCkKLQkJKHZvaWQpcHJpbnRmKCJwcmkgMHglMDJ4LCAiLCAoZmxvdyAmIDB4MGYwMDAwMDApID4+IDI0KTsKLSAgICAgICAgICAgIGlmIChmbG93ICYgMHgwMGZmZmZmZikKLQkJKHZvaWQpcHJpbnRmKCJmbG93bGFiZWwgMHglMDZ4LCAiLCBmbG93ICYgMHgwMGZmZmZmZik7Ci0jZWxzZQotICAgICAgICAgICAgLyogUkZDIDI0NjAgKi8KLSAgICAgICAgICAgIGlmIChmbG93ICYgMHgwZmYwMDAwMCkKLQkJKHZvaWQpcHJpbnRmKCJjbGFzcyAweCUwMngsICIsIChmbG93ICYgMHgwZmYwMDAwMCkgPj4gMjApOwotICAgICAgICAgICAgaWYgKGZsb3cgJiAweDAwMGZmZmZmKQotCQkodm9pZClwcmludGYoImZsb3dsYWJlbCAweCUwNXgsICIsIGZsb3cgJiAweDAwMGZmZmZmKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAodm9pZClwcmludGYoImhsaW0gJXUsIG5leHQtaGVhZGVyICVzICgldSkgcGF5bG9hZCBsZW5ndGg6ICV1KSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlwNi0+aXA2X2hsaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihpcHByb3RvX3ZhbHVlcywidW5rbm93biIsaXA2LT5pcDZfbnh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpcDYtPmlwNl9ueHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9sZW4pOwotICAgICAgICB9Ci0KLQkvKgotCSAqIEN1dCBvZmYgdGhlIHNuYXBzaG90IGxlbmd0aCB0byB0aGUgZW5kIG9mIHRoZSBJUCBwYXlsb2FkLgotCSAqLwotCWlwZW5kID0gYnAgKyBsZW47Ci0JaWYgKGlwZW5kIDwgc25hcGVuZCkKLQkJc25hcGVuZCA9IGlwZW5kOwotCi0JY3AgPSAoY29uc3QgdV9jaGFyICopaXA2OwotCWFkdmFuY2UgPSBzaXplb2Yoc3RydWN0IGlwNl9oZHIpOwotCW5oID0gaXA2LT5pcDZfbnh0OwotCXdoaWxlIChjcCA8IHNuYXBlbmQgJiYgYWR2YW5jZSA+IDApIHsKLQkJY3AgKz0gYWR2YW5jZTsKLQkJbGVuIC09IGFkdmFuY2U7Ci0KLQkJaWYgKGNwID09IChjb25zdCB1X2NoYXIgKikoaXA2ICsgMSkgJiYKLQkJICAgIG5oICE9IElQUFJPVE9fVENQICYmIG5oICE9IElQUFJPVE9fVURQICYmCi0JCSAgICBuaCAhPSBJUFBST1RPX0RDQ1AgJiYgbmggIT0gSVBQUk9UT19TQ1RQKSB7Ci0JCQkodm9pZClwcmludGYoIiVzID4gJXM6ICIsIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9zcmMpLAotCQkJCSAgICAgaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X2RzdCkpOwotCQl9Ci0KLQkJc3dpdGNoIChuaCkgewotCQljYXNlIElQUFJPVE9fSE9QT1BUUzoKLQkJCWFkdmFuY2UgPSBoYmhvcHRfcHJpbnQoY3ApOwotCQkJbmggPSAqY3A7Ci0JCQlicmVhazsKLQkJY2FzZSBJUFBST1RPX0RTVE9QVFM6Ci0JCQlhZHZhbmNlID0gZHN0b3B0X3ByaW50KGNwKTsKLQkJCW5oID0gKmNwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBQUk9UT19GUkFHTUVOVDoKLQkJCWFkdmFuY2UgPSBmcmFnNl9wcmludChjcCwgKGNvbnN0IHVfY2hhciAqKWlwNik7Ci0JCQlpZiAoc25hcGVuZCA8PSBjcCArIGFkdmFuY2UpCi0JCQkJcmV0dXJuOwotCQkJbmggPSAqY3A7Ci0JCQlmcmFnbWVudGVkID0gMTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVBQUk9UT19NT0JJTElUWV9PTEQ6Ci0JCWNhc2UgSVBQUk9UT19NT0JJTElUWToKLQkJCS8qCi0JCQkgKiBYWFggLSB3ZSBkb24ndCB1c2UgImFkdmFuY2UiOyB0aGUgY3VycmVudAotCQkJICogIk1vYmlsaXR5IFN1cHBvcnQgaW4gSVB2NiIgZHJhZnQKLQkJCSAqIChkcmFmdC1pZXRmLW1vYmlsZWlwLWlwdjYtMjQpIHNheXMgdGhhdAotCQkJICogdGhlIG5leHQgaGVhZGVyIGZpZWxkIGluIGEgbW9iaWxpdHkgaGVhZGVyCi0JCQkgKiBzaG91bGQgYmUgSVBQUk9UT19OT05FLCBidXQgc3BlYWtzIG9mCi0JCQkgKiB0aGUgcG9zc2libGl0eSBvZiBhIGZ1dHVyZSBleHRlbnNpb24gaW4KLQkJCSAqIHdoaWNoIHBheWxvYWQgY2FuIGJlIHBpZ2d5YmFja2VkIGF0b3AgYQotCQkJICogbW9iaWxpdHkgaGVhZGVyLgotCQkJICovCi0JCQlhZHZhbmNlID0gbW9iaWxpdHlfcHJpbnQoY3AsIChjb25zdCB1X2NoYXIgKilpcDYpOwotCQkJbmggPSAqY3A7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgSVBQUk9UT19ST1VUSU5HOgotCQkJYWR2YW5jZSA9IHJ0Nl9wcmludChjcCwgKGNvbnN0IHVfY2hhciAqKWlwNik7Ci0JCQluaCA9ICpjcDsKLQkJCWJyZWFrOwotCQljYXNlIElQUFJPVE9fU0NUUDoKLQkJCXNjdHBfcHJpbnQoY3AsIChjb25zdCB1X2NoYXIgKilpcDYsIGxlbik7Ci0JCQlyZXR1cm47Ci0JCWNhc2UgSVBQUk9UT19EQ0NQOgotCQkJZGNjcF9wcmludChjcCwgKGNvbnN0IHVfY2hhciAqKWlwNiwgbGVuKTsKLQkJCXJldHVybjsKLQkJY2FzZSBJUFBST1RPX1RDUDoKLQkJCXRjcF9wcmludChjcCwgbGVuLCAoY29uc3QgdV9jaGFyICopaXA2LCBmcmFnbWVudGVkKTsKLQkJCXJldHVybjsKLQkJY2FzZSBJUFBST1RPX1VEUDoKLQkJCXVkcF9wcmludChjcCwgbGVuLCAoY29uc3QgdV9jaGFyICopaXA2LCBmcmFnbWVudGVkKTsKLQkJCXJldHVybjsKLQkJY2FzZSBJUFBST1RPX0lDTVBWNjoKLQkJCWljbXA2X3ByaW50KGNwLCBsZW4sIChjb25zdCB1X2NoYXIgKilpcDYsIGZyYWdtZW50ZWQpOwotCQkJcmV0dXJuOwotCQljYXNlIElQUFJPVE9fQUg6Ci0JCQlhZHZhbmNlID0gYWhfcHJpbnQoY3ApOwotCQkJbmggPSAqY3A7Ci0JCQlicmVhazsKLQkJY2FzZSBJUFBST1RPX0VTUDoKLQkJICAgIHsKLQkJCWludCBlbmgsIHBhZGxlbjsKLQkJCWFkdmFuY2UgPSBlc3BfcHJpbnQoZ25kbywgY3AsIGxlbiwgKGNvbnN0IHVfY2hhciAqKWlwNiwgJmVuaCwgJnBhZGxlbik7Ci0JCQluaCA9IGVuaCAmIDB4ZmY7Ci0JCQlsZW4gLT0gcGFkbGVuOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCWNhc2UgSVBQUk9UT19JUENPTVA6Ci0JCSAgICB7Ci0JCQlpbnQgZW5oOwotCQkJYWR2YW5jZSA9IGlwY29tcF9wcmludChjcCwgJmVuaCk7Ci0JCQluaCA9IGVuaCAmIDB4ZmY7Ci0JCQlicmVhazsKLQkJICAgIH0KLQotCQljYXNlIElQUFJPVE9fUElNOgotCQkJcGltX3ByaW50KGNwLCBsZW4pOwotCQkJcmV0dXJuOwotCi0JCWNhc2UgSVBQUk9UT19PU1BGOgotCQkJb3NwZjZfcHJpbnQoY3AsIGxlbik7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBJUFBST1RPX0lQVjY6Ci0JCQlpcDZfcHJpbnQoY3AsIGxlbik7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBJUFBST1RPX0lQVjQ6Ci0JCSAgICAgICAgaXBfcHJpbnQoZ25kbywgY3AsIGxlbik7Ci0JCQlyZXR1cm47Ci0KLSAgICAgICAgICAgICAgICBjYXNlIElQUFJPVE9fUEdNOgotICAgICAgICAgICAgICAgICAgICAgICAgcGdtX3ByaW50KGNwLCBsZW4sIChjb25zdCB1X2NoYXIgKilpcDYpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JCWNhc2UgSVBQUk9UT19HUkU6Ci0JCQlncmVfcHJpbnQoY3AsIGxlbik7Ci0JCQlyZXR1cm47Ci0KLQkJY2FzZSBJUFBST1RPX1JTVlA6Ci0JCQlyc3ZwX3ByaW50KGNwLCBsZW4pOwotCQkJcmV0dXJuOwotCi0JCWNhc2UgSVBQUk9UT19OT05FOgotCQkJKHZvaWQpcHJpbnRmKCJubyBuZXh0IGhlYWRlciIpOwotCQkJcmV0dXJuOwotCi0JCWRlZmF1bHQ6Ci0JCQkodm9pZClwcmludGYoImlwLXByb3RvLSVkICVkIiwgbmgsIGxlbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci10cnVuYzoKLQkodm9pZClwcmludGYoIlt8aXA2XSIpOwotfQotCi0jZW5kaWYgLyogSU5FVDYgKi8KZGlmZiAtLWdpdCBhL3ByaW50LWlwNm9wdHMuYyBiL3ByaW50LWlwNm9wdHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxNjNhMi4uMDAwMDAwMAotLS0gYS9wcmludC1pcDZvcHRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5OCBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pcDZvcHRzLmMsdiAxLjE3LjIuMSAyMDA1LzA0LzIwIDIyOjE5OjA2IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIElORVQ2Ci0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpcDYuaCIKLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLS8qIGl0ZW1zIG91dHNpZGUgb2YgcmZjMjI5MmJpcyAqLwotI2lmbmRlZiBJUDZPUFRfTUlOTEVOCi0jZGVmaW5lIElQNk9QVF9NSU5MRU4JMgotI2VuZGlmCi0jaWZuZGVmIElQNk9QVF9SVEFMRVJUX0xFTgotI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9MRU4JNAotI2VuZGlmCi0jaWZuZGVmIElQNk9QVF9KVU1CT19MRU4KLSNkZWZpbmUgSVA2T1BUX0pVTUJPX0xFTgk2Ci0jZW5kaWYKLSNkZWZpbmUgSVA2T1BUX0hPTUVBRERSX01JTkxFTiAxOAotI2RlZmluZSBJUDZPUFRfQlVfTUlOTEVOICAgICAgIDEwCi0jZGVmaW5lIElQNk9QVF9CQV9NSU5MRU4gICAgICAgMTMKLSNkZWZpbmUgSVA2T1BUX0JSX01JTkxFTiAgICAgICAgMgotI2RlZmluZSBJUDZTT1BUX1VJICAgICAgICAgICAgMHgyCi0jZGVmaW5lIElQNlNPUFRfVUlfTUlOTEVOICAgICAgIDQKLSNkZWZpbmUgSVA2U09QVF9BTFRDT0EgICAgICAgIDB4MwotI2RlZmluZSBJUDZTT1BUX0FMVENPQV9NSU5MRU4gIDE4Ci0jZGVmaW5lIElQNlNPUFRfQVVUSCAgICAgICAgICAweDQKLSNkZWZpbmUgSVA2U09QVF9BVVRIX01JTkxFTiAgICAgNgotCi1zdGF0aWMgdm9pZCBpcDZfc29wdF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKLQotc3RhdGljIHZvaWQKLWlwNl9zb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW4pCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IG9wdGxlbjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gb3B0bGVuKSB7Ci0JaWYgKGJwW2ldID09IElQNk9QVF9QQUQxKQotCSAgICBvcHRsZW4gPSAxOwotCWVsc2UgewotCSAgICBpZiAoaSArIDEgPCBsZW4pCi0JCW9wdGxlbiA9IGJwW2kgKyAxXSArIDI7Ci0JICAgIGVsc2UKLQkJZ290byB0cnVuYzsKLQl9Ci0JaWYgKGkgKyBvcHRsZW4gPiBsZW4pCi0JICAgIGdvdG8gdHJ1bmM7Ci0KLQlzd2l0Y2ggKGJwW2ldKSB7Ci0JY2FzZSBJUDZPUFRfUEFEMToKLSAgICAgICAgICAgIHByaW50ZigiLCBwYWQxIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgSVA2T1BUX1BBRE46Ci0JICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX01JTkxFTikgewotCQlwcmludGYoIiwgcGFkbjogdHJ1bmMiKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotICAgICAgICAgICAgcHJpbnRmKCIsIHBhZG4iKTsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVA2U09QVF9VSToKLSAgICAgICAgICAgICBpZiAobGVuIC0gaSA8IElQNlNPUFRfVUlfTUlOTEVOKSB7Ci0JCXByaW50ZigiLCB1aTogdHJ1bmMiKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotICAgICAgICAgICAgcHJpbnRmKCIsIHVpOiAweCUwNHggIiwgRVhUUkFDVF8xNkJJVFMoJmJwW2kgKyAyXSkpOwotCSAgICBicmVhazsKLSAgICAgICAgY2FzZSBJUDZTT1BUX0FMVENPQToKLSAgICAgICAgICAgICBpZiAobGVuIC0gaSA8IElQNlNPUFRfQUxUQ09BX01JTkxFTikgewotCQlwcmludGYoIiwgYWx0Y29hOiB0cnVuYyIpOwotCQlnb3RvIHRydW5jOwotCSAgICB9Ci0gICAgICAgICAgICBwcmludGYoIiwgYWx0LUNvQTogJXMiLCBpcDZhZGRyX3N0cmluZygmYnBbaSsyXSkpOwotCSAgICBicmVhazsKLSAgICAgICAgY2FzZSBJUDZTT1BUX0FVVEg6Ci0gICAgICAgICAgICAgaWYgKGxlbiAtIGkgPCBJUDZTT1BUX0FVVEhfTUlOTEVOKSB7Ci0JCXByaW50ZigiLCBhdXRoOiB0cnVuYyIpOwotCQlnb3RvIHRydW5jOwotCSAgICB9Ci0gICAgICAgICAgICBwcmludGYoIiwgYXV0aCBzcGk6IDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKCZicFtpICsgMl0pKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgaWYgKGxlbiAtIGkgPCBJUDZPUFRfTUlOTEVOKSB7Ci0JCXByaW50ZigiLCBzb3B0X3R5cGUgJWQ6IHRydW5jKSIsIGJwW2ldKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBwcmludGYoIiwgc29wdF90eXBlIDB4JTAyeDogbGVuPSVkIiwgYnBbaV0sIGJwW2kgKyAxXSk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuOwotCi10cnVuYzoKLSAgICBwcmludGYoIlt0cnVuY10gIik7Ci19Ci0KLXZvaWQKLWlwNl9vcHRfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgaW50IGxlbikKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgb3B0bGVuID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gb3B0bGVuKSB7Ci0JaWYgKGJwW2ldID09IElQNk9QVF9QQUQxKQotCSAgICBvcHRsZW4gPSAxOwotCWVsc2UgewotCSAgICBpZiAoaSArIDEgPCBsZW4pCi0JCW9wdGxlbiA9IGJwW2kgKyAxXSArIDI7Ci0JICAgIGVsc2UKLQkJZ290byB0cnVuYzsKLQl9Ci0JaWYgKGkgKyBvcHRsZW4gPiBsZW4pCi0JICAgIGdvdG8gdHJ1bmM7Ci0KLQlzd2l0Y2ggKGJwW2ldKSB7Ci0JY2FzZSBJUDZPUFRfUEFEMToKLSAgICAgICAgICAgIHByaW50ZigiKHBhZDEpIik7Ci0JICAgIGJyZWFrOwotCWNhc2UgSVA2T1BUX1BBRE46Ci0JICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX01JTkxFTikgewotCQlwcmludGYoIihwYWRuOiB0cnVuYykiKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotICAgICAgICAgICAgcHJpbnRmKCIocGFkbikiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBJUDZPUFRfUk9VVEVSX0FMRVJUOgotCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9SVEFMRVJUX0xFTikgewotCQlwcmludGYoIihydGFsZXJ0OiB0cnVuYykiKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBpZiAoYnBbaSArIDFdICE9IElQNk9QVF9SVEFMRVJUX0xFTiAtIDIpIHsKLQkJcHJpbnRmKCIocnRhbGVydDogaW52YWxpZCBsZW4gJWQpIiwgYnBbaSArIDFdKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBwcmludGYoIihydGFsZXJ0OiAweCUwNHgpICIsIEVYVFJBQ1RfMTZCSVRTKCZicFtpICsgMl0pKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBJUDZPUFRfSlVNQk86Ci0JICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX0pVTUJPX0xFTikgewotCQlwcmludGYoIihqdW1ibzogdHJ1bmMpIik7Ci0JCWdvdG8gdHJ1bmM7Ci0JICAgIH0KLQkgICAgaWYgKGJwW2kgKyAxXSAhPSBJUDZPUFRfSlVNQk9fTEVOIC0gMikgewotCQlwcmludGYoIihqdW1ibzogaW52YWxpZCBsZW4gJWQpIiwgYnBbaSArIDFdKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBwcmludGYoIihqdW1ibzogJXUpICIsIEVYVFJBQ1RfMzJCSVRTKCZicFtpICsgMl0pKTsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVA2T1BUX0hPTUVfQUREUkVTUzoKLQkgICAgaWYgKGxlbiAtIGkgPCBJUDZPUFRfSE9NRUFERFJfTUlOTEVOKSB7Ci0JCXByaW50ZigiKGhvbWVhZGRyOiB0cnVuYykiKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBpZiAoYnBbaSArIDFdIDwgSVA2T1BUX0hPTUVBRERSX01JTkxFTiAtIDIpIHsKLQkJcHJpbnRmKCIoaG9tZWFkZHI6IGludmFsaWQgbGVuICVkKSIsIGJwW2kgKyAxXSk7Ci0JCWdvdG8gdHJ1bmM7Ci0JICAgIH0KLQkgICAgcHJpbnRmKCIoaG9tZWFkZHI6ICVzIiwgaXA2YWRkcl9zdHJpbmcoJmJwW2kgKyAyXSkpOwotICAgICAgICAgICAgaWYgKGJwW2kgKyAxXSA+IElQNk9QVF9IT01FQUREUl9NSU5MRU4gLSAyKSB7Ci0JCWlwNl9zb3B0X3ByaW50KCZicFtpICsgSVA2T1BUX0hPTUVBRERSX01JTkxFTl0sCi0JCSAgICAob3B0bGVuIC0gSVA2T1BUX0hPTUVBRERSX01JTkxFTikpOwotCSAgICB9Ci0gICAgICAgICAgICBwcmludGYoIikiKTsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVA2T1BUX0JJTkRJTkdfVVBEQVRFOgotCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9CVV9NSU5MRU4pIHsKLQkJcHJpbnRmKCIoYnU6IHRydW5jKSIpOwotCQlnb3RvIHRydW5jOwotCSAgICB9Ci0JICAgIGlmIChicFtpICsgMV0gPCBJUDZPUFRfQlVfTUlOTEVOIC0gMikgewotCQlwcmludGYoIihidTogaW52YWxpZCBsZW4gJWQpIiwgYnBbaSArIDFdKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBwcmludGYoIihidTogIik7Ci0JICAgIGlmIChicFtpICsgMl0gJiAweDgwKQotCQkgICAgcHJpbnRmKCJBIik7Ci0JICAgIGlmIChicFtpICsgMl0gJiAweDQwKQotCQkgICAgcHJpbnRmKCJIIik7Ci0JICAgIGlmIChicFtpICsgMl0gJiAweDIwKQotCQkgICAgcHJpbnRmKCJTIik7Ci0JICAgIGlmIChicFtpICsgMl0gJiAweDEwKQotCQkgICAgcHJpbnRmKCJEIik7Ci0JICAgIGlmICgoYnBbaSArIDJdICYgMHgwZikgfHwgYnBbaSArIDNdIHx8IGJwW2kgKyA0XSkKLQkJICAgIHByaW50ZigicmVzIik7Ci0JICAgIHByaW50ZigiLCBzZXF1ZW5jZTogJXUiLCBicFtpICsgNV0pOwotCSAgICBwcmludGYoIiwgbGlmZXRpbWU6ICV1IiwgRVhUUkFDVF8zMkJJVFMoJmJwW2kgKyA2XSkpOwotCi0JICAgIGlmIChicFtpICsgMV0gPiBJUDZPUFRfQlVfTUlOTEVOIC0gMikgewotCQlpcDZfc29wdF9wcmludCgmYnBbaSArIElQNk9QVF9CVV9NSU5MRU5dLAotCQkgICAgKG9wdGxlbiAtIElQNk9QVF9CVV9NSU5MRU4pKTsKLQkgICAgfQotCSAgICBwcmludGYoIikiKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBJUDZPUFRfQklORElOR19BQ0s6Ci0JICAgIGlmIChsZW4gLSBpIDwgSVA2T1BUX0JBX01JTkxFTikgewotCQlwcmludGYoIihiYTogdHJ1bmMpIik7Ci0JCWdvdG8gdHJ1bmM7Ci0JICAgIH0KLQkgICAgaWYgKGJwW2kgKyAxXSA8IElQNk9QVF9CQV9NSU5MRU4gLSAyKSB7Ci0JCXByaW50ZigiKGJhOiBpbnZhbGlkIGxlbiAlZCkiLCBicFtpICsgMV0pOwotCQlnb3RvIHRydW5jOwotCSAgICB9Ci0JICAgIHByaW50ZigiKGJhOiAiKTsKLQkgICAgcHJpbnRmKCJzdGF0dXM6ICV1IiwgYnBbaSArIDJdKTsKLQkgICAgaWYgKGJwW2kgKyAzXSkKLQkJICAgIHByaW50ZigicmVzIik7Ci0JICAgIHByaW50ZigiLCBzZXF1ZW5jZTogJXUiLCBicFtpICsgNF0pOwotCSAgICBwcmludGYoIiwgbGlmZXRpbWU6ICV1IiwgRVhUUkFDVF8zMkJJVFMoJmJwW2kgKyA1XSkpOwotCSAgICBwcmludGYoIiwgcmVmcmVzaDogJXUiLCBFWFRSQUNUXzMyQklUUygmYnBbaSArIDldKSk7Ci0KLQkgICAgaWYgKGJwW2kgKyAxXSA+IElQNk9QVF9CQV9NSU5MRU4gLSAyKSB7Ci0JCWlwNl9zb3B0X3ByaW50KCZicFtpICsgSVA2T1BUX0JBX01JTkxFTl0sCi0JCSAgICAob3B0bGVuIC0gSVA2T1BUX0JBX01JTkxFTikpOwotCSAgICB9Ci0gICAgICAgICAgICBwcmludGYoIikiKTsKLQkgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVA2T1BUX0JJTkRJTkdfUkVROgotCSAgICBpZiAobGVuIC0gaSA8IElQNk9QVF9CUl9NSU5MRU4pIHsKLQkJcHJpbnRmKCIoYnI6IHRydW5jKSIpOwotCQlnb3RvIHRydW5jOwotCSAgICB9Ci0gICAgICAgICAgICBwcmludGYoIihiciIpOwotICAgICAgICAgICAgaWYgKGJwW2kgKyAxXSA+IElQNk9QVF9CUl9NSU5MRU4gLSAyKSB7Ci0JCWlwNl9zb3B0X3ByaW50KCZicFtpICsgSVA2T1BUX0JSX01JTkxFTl0sCi0JCSAgICAob3B0bGVuIC0gSVA2T1BUX0JSX01JTkxFTikpOwotCSAgICB9Ci0gICAgICAgICAgICBwcmludGYoIikiKTsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgaWYgKGxlbiAtIGkgPCBJUDZPUFRfTUlOTEVOKSB7Ci0JCXByaW50ZigiKHR5cGUgJWQ6IHRydW5jKSIsIGJwW2ldKTsKLQkJZ290byB0cnVuYzsKLQkgICAgfQotCSAgICBwcmludGYoIihvcHRfdHlwZSAweCUwMng6IGxlbj0lZCkgIiwgYnBbaV0sIGJwW2kgKyAxXSk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSNpZiAwCi1lbmQ6Ci0jZW5kaWYKLSAgICByZXR1cm47Ci0KLXRydW5jOgotICAgIHByaW50ZigiW3RydW5jXSAiKTsKLX0KLQotaW50Ci1oYmhvcHRfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKLXsKLSAgICBjb25zdCBzdHJ1Y3QgaXA2X2hiaCAqZHAgPSAoc3RydWN0IGlwNl9oYmggKilicDsKLSAgICBpbnQgaGJobGVuID0gMDsKLQotICAgIFRDSEVDSyhkcC0+aXA2aF9sZW4pOwotICAgIGhiaGxlbiA9IChpbnQpKChkcC0+aXA2aF9sZW4gKyAxKSA8PCAzKTsKLSAgICBUQ0hFQ0syKCpkcCwgaGJobGVuKTsKLSAgICBwcmludGYoIkhCSCAiKTsKLSAgICBpZiAodmZsYWcpCi0JaXA2X29wdF9wcmludCgoY29uc3QgdV9jaGFyICopZHAgKyBzaXplb2YoKmRwKSwgaGJobGVuIC0gc2l6ZW9mKCpkcCkpOwotCi0gICAgcmV0dXJuKGhiaGxlbik7Ci0KLSAgdHJ1bmM6Ci0gICAgZnB1dHMoIlt8SEJIXSIsIHN0ZG91dCk7Ci0gICAgcmV0dXJuKC0xKTsKLX0KLQotaW50Ci1kc3RvcHRfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKLXsKLSAgICBjb25zdCBzdHJ1Y3QgaXA2X2Rlc3QgKmRwID0gKHN0cnVjdCBpcDZfZGVzdCAqKWJwOwotICAgIGludCBkc3RvcHRsZW4gPSAwOwotCi0gICAgVENIRUNLKGRwLT5pcDZkX2xlbik7Ci0gICAgZHN0b3B0bGVuID0gKGludCkoKGRwLT5pcDZkX2xlbiArIDEpIDw8IDMpOwotICAgIFRDSEVDSzIoKmRwLCBkc3RvcHRsZW4pOwotICAgIHByaW50ZigiRFNUT1BUICIpOwotICAgIGlmICh2ZmxhZykgewotCWlwNl9vcHRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWRwICsgc2l6ZW9mKCpkcCksCi0JICAgIGRzdG9wdGxlbiAtIHNpemVvZigqZHApKTsKLSAgICB9Ci0KLSAgICByZXR1cm4oZHN0b3B0bGVuKTsKLQotICB0cnVuYzoKLSAgICBmcHV0cygiW3xEU1RPUFRdIiwgc3Rkb3V0KTsKLSAgICByZXR1cm4oLTEpOwotfQotI2VuZGlmIC8qIElORVQ2ICovCmRpZmYgLS1naXQgYS9wcmludC1pcGNvbXAuYyBiL3ByaW50LWlwY29tcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTllNWFkLi4wMDAwMDAwCi0tLSBhL3ByaW50LWlwY29tcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MywgMTk5NAotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWlwY29tcC5jLHYgMS4yMCAyMDAzLzExLzE5IDAwOjM2OjA4IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXN0cnVjdCBpcGNvbXAgewotCXVfaW50OF90IGNvbXBfbnh0OwkvKiBOZXh0IEhlYWRlciAqLwotCXVfaW50OF90IGNvbXBfZmxhZ3M7CS8qIExlbmd0aCBvZiBkYXRhLCBpbiAzMmJpdCAqLwotCXVfaW50MTZfdCBjb21wX2NwaTsJLyogQ29tcHJlc3Npb24gcGFyYW1ldGVyIGluZGV4ICovCi19OwotCi0jaWYgZGVmaW5lZChIQVZFX0xJQlopICYmIGRlZmluZWQoSEFWRV9aTElCX0gpCi0jaW5jbHVkZSA8emxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi1pbnQKLWlwY29tcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgKm5oZHIgX1VfKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcGNvbXAgKmlwY29tcDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwOwotCXVfaW50MTZfdCBjcGk7Ci0jaWYgZGVmaW5lZChIQVZFX0xJQlopICYmIGRlZmluZWQoSEFWRV9aTElCX0gpCi0JaW50IGFkdmFuY2U7Ci0jZW5kaWYKLQotCWlwY29tcCA9IChzdHJ1Y3QgaXBjb21wICopYnA7Ci0JY3BpID0gRVhUUkFDVF8xNkJJVFMoJmlwY29tcC0+Y29tcF9jcGkpOwotCi0JLyogJ2VwJyBwb2ludHMgdG8gdGhlIGVuZCBvZiBhdmFpbGFibGUgZGF0YS4gKi8KLQllcCA9IHNuYXBlbmQ7Ci0KLQlpZiAoKHVfY2hhciAqKShpcGNvbXAgKyAxKSA+PSBlcCAtIHNpemVvZihzdHJ1Y3QgaXBjb21wKSkgewotCQlmcHV0cygiW3xJUENPTVBdIiwgc3Rkb3V0KTsKLQkJZ290byBmYWlsOwotCX0KLQlwcmludGYoIklQQ29tcChjcGk9MHglMDR4KSIsIGNwaSk7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfTElCWikgJiYgZGVmaW5lZChIQVZFX1pMSUJfSCkKLQlpZiAoMSkKLQkJZ290byBmYWlsOwotCi0JLyoKLQkgKiBXZSBtYXkgd2FudCB0byBkZWNvbXByZXNzIHRoZSBwYWNrZXQgaGVyZS4gIFBhY2tldCBidWZmZXIKLQkgKiBtYW5hZ2VtZW50IGlzIGEgaGVhZGFjaGUgKGlmIHdlIGRlY29tcHJlc3MsIHBhY2tldCB3aWxsIGJlY29tZQotCSAqIGxhcmdlcikuCi0JICovCi0JaWYgKG5oZHIpCi0JCSpuaGRyID0gaXBjb21wLT5jb21wX254dDsKLQlhZHZhbmNlID0gc2l6ZW9mKHN0cnVjdCBpcGNvbXApOwotCi0JcHJpbnRmKCI6ICIpOwotCXJldHVybiBhZHZhbmNlOwotCi0jZW5kaWYKLWZhaWw6Ci0JcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaXBmYy5jIGIvcHJpbnQtaXBmYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzEyZTVmLi4wMDAwMDAwCi0tLSBhL3ByaW50LWlwZmMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtaXBmYy5jLHYgMS43LjIuMiAyMDA1LzExLzEzIDEyOjEyOjU5IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHBjYXAuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotCi0jaW5jbHVkZSAiZXRoZXIuaCIKLSNpbmNsdWRlICJpcGZjLmgiCi0KLS8qCi0gKiBSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwuCi0gKi8KLQotLyogRXh0cmFjdCBzcmMsIGRzdCBhZGRyZXNzZXMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotZXh0cmFjdF9pcGZjX2FkZHJzKGNvbnN0IHN0cnVjdCBpcGZjX2hlYWRlciAqaXBmY3AsIGNoYXIgKmlwZmNzcmMsCi0gICAgY2hhciAqaXBmY2RzdCkKLXsKLQkvKgotCSAqIFdlIGFzc3VtZSB0aGF0LCBhcyBwZXIgUkZDIDI2MjUsIHRoZSBsb3dlciA0OCBiaXRzIG9mIHRoZQotCSAqIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzIGFyZSBNQUMgYWRkcmVzc2VzLgotCSAqLwotCW1lbWNweShpcGZjZHN0LCAoY29uc3QgY2hhciAqKSZpcGZjcC0+aXBmY19kaG9zdFsyXSwgNik7Ci0JbWVtY3B5KGlwZmNzcmMsIChjb25zdCBjaGFyICopJmlwZmNwLT5pcGZjX3Nob3N0WzJdLCA2KTsKLX0KLQotLyoKLSAqIFByaW50IHRoZSBOZXR3b3JrX0hlYWRlcgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWlwZmNfaGRyX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcGZjX2hlYWRlciAqaXBmY3AgX1VfLAotCSAgIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICppcGZjc3JjLAotCSAgIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqaXBmY2RzdCkKLXsKLQljb25zdCBjaGFyICpzcmNuYW1lLCAqZHN0bmFtZTsKLQotCXNyY25hbWUgPSBldGhlcmFkZHJfc3RyaW5nKGlwZmNzcmMpOwotCWRzdG5hbWUgPSBldGhlcmFkZHJfc3RyaW5nKGlwZmNkc3QpOwotCi0JLyoKLQkgKiBYWFggLSBzaG93IHRoZSB1cHBlciAxNiBiaXRzPyAgRG8gc28gb25seSBpZiAidmZsYWciIGlzIHNldD8KLQkgKi8KLQkodm9pZCkgcHJpbnRmKCIlcyAlcyAlZDogIiwgc3JjbmFtZSwgZHN0bmFtZSwgbGVuZ3RoKTsKLX0KLQotc3RhdGljIHZvaWQKLWlwZmNfcHJpbnQoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbikKLXsKLQljb25zdCBzdHJ1Y3QgaXBmY19oZWFkZXIgKmlwZmNwID0gKGNvbnN0IHN0cnVjdCBpcGZjX2hlYWRlciAqKXA7Ci0Jc3RydWN0IGV0aGVyX2hlYWRlciBlaGRyOwotCXVfc2hvcnQgZXh0cmFjdGVkX2V0aGVydHlwZTsKLQotCWlmIChjYXBsZW4gPCBJUEZDX0hEUkxFTikgewotCQlwcmludGYoIlt8aXBmY10iKTsKLQkJcmV0dXJuOwotCX0KLQkvKgotCSAqIEdldCB0aGUgbmV0d29yayBhZGRyZXNzZXMgaW50byBhIGNhbm9uaWNhbCBmb3JtCi0JICovCi0JZXh0cmFjdF9pcGZjX2FkZHJzKGlwZmNwLCAoY2hhciAqKUVTUkMoJmVoZHIpLCAoY2hhciAqKUVEU1QoJmVoZHIpKTsKLQotCWlmIChlZmxhZykKLQkJaXBmY19oZHJfcHJpbnQoaXBmY3AsIGxlbmd0aCwgRVNSQygmZWhkciksIEVEU1QoJmVoZHIpKTsKLQotCS8qIFNraXAgb3ZlciBOZXR3b3JrX0hlYWRlciAqLwotCWxlbmd0aCAtPSBJUEZDX0hEUkxFTjsKLQlwICs9IElQRkNfSERSTEVOOwotCWNhcGxlbiAtPSBJUEZDX0hEUkxFTjsKLQotCS8qIFRyeSB0byBwcmludCB0aGUgTExDLWxheWVyIGhlYWRlciAmIGhpZ2hlciBsYXllcnMgKi8KLQlpZiAobGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBFU1JDKCZlaGRyKSwgRURTVCgmZWhkciksCi0JICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKSB7Ci0JCS8qCi0JCSAqIFNvbWUga2luZHMgb2YgTExDIHBhY2tldCB3ZSBjYW5ub3QKLQkJICogaGFuZGxlIGludGVsbGlnZW50bHkKLQkJICovCi0JCWlmICghZWZsYWcpCi0JCQlpcGZjX2hkcl9wcmludChpcGZjcCwgbGVuZ3RoICsgSVBGQ19IRFJMRU4sCi0JCQkgICAgRVNSQygmZWhkciksIEVEU1QoJmVoZHIpKTsKLQkJaWYgKGV4dHJhY3RlZF9ldGhlcnR5cGUpIHsKLQkJCXByaW50ZigiKExMQyAlcykgIiwKLQkJZXRoZXJwcm90b19zdHJpbmcoaHRvbnMoZXh0cmFjdGVkX2V0aGVydHlwZSkpKTsKLQkJfQotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7Ci0JfQotfQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCi0gKiB0byB0aGUgTmV0d29ya19IZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotaXBmY19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlpcGZjX3ByaW50KHAsIGgtPmxlbiwgaC0+Y2FwbGVuKTsKLQotCXJldHVybiAoSVBGQ19IRFJMRU4pOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtaXB4LmMgYi9wcmludC1pcHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwOWFhNC4uMDAwMDAwMAotLS0gYS9wcmludC1pcHguYworKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRm9ybWF0IGFuZCBwcmludCBOb3ZlbGwgSVBYIHBhY2tldHMuCi0gKiBDb250cmlidXRlZCBieSBCcmFkIFBhcmtlciAoYnJhZEBmY3IuY29tKS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pcHguYyx2IDEuNDAuMi4yIDIwMDUvMDUvMDYgMDg6Mjc6MDAgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJpcHguaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmlweGFkZHJfc3RyaW5nKHVfaW50MzJfdCwgY29uc3QgdV9jaGFyICopOwotdm9pZCBpcHhfZGVjb2RlKGNvbnN0IHN0cnVjdCBpcHhIZHIgKiwgY29uc3QgdV9jaGFyICosIHVfaW50KTsKLXZvaWQgaXB4X3NhcF9wcmludChjb25zdCB1X3Nob3J0ICosIHVfaW50KTsKLXZvaWQgaXB4X3JpcF9wcmludChjb25zdCB1X3Nob3J0ICosIHVfaW50KTsKLQotLyoKLSAqIFByaW50IElQWCBkYXRhZ3JhbSBwYWNrZXRzLgotICovCi12b2lkCi1pcHhfcHJpbnQoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgpCi17Ci0JY29uc3Qgc3RydWN0IGlweEhkciAqaXB4ID0gKGNvbnN0IHN0cnVjdCBpcHhIZHIgKilwOwotCi0JaWYgKCFlZmxhZykKLQkJcHJpbnRmKCJJUFggIik7Ci0KLQlUQ0hFQ0soaXB4LT5zcmNTa3QpOwotCSh2b2lkKXByaW50ZigiJXMuJTA0eCA+ICIsCi0JCSAgICAgaXB4YWRkcl9zdHJpbmcoRVhUUkFDVF8zMkJJVFMoaXB4LT5zcmNOZXQpLCBpcHgtPnNyY05vZGUpLAotCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZpcHgtPnNyY1NrdCkpOwotCi0JKHZvaWQpcHJpbnRmKCIlcy4lMDR4OiAiLAotCQkgICAgIGlweGFkZHJfc3RyaW5nKEVYVFJBQ1RfMzJCSVRTKGlweC0+ZHN0TmV0KSwgaXB4LT5kc3ROb2RlKSwKLQkJICAgICBFWFRSQUNUXzE2QklUUygmaXB4LT5kc3RTa3QpKTsKLQotCS8qIHRha2UgbGVuZ3RoIGZyb20gaXB4IGhlYWRlciAqLwotCVRDSEVDSyhpcHgtPmxlbmd0aCk7Ci0JbGVuZ3RoID0gRVhUUkFDVF8xNkJJVFMoJmlweC0+bGVuZ3RoKTsKLQotCWlweF9kZWNvZGUoaXB4LCAodV9jaGFyICopaXB4ICsgaXB4U2l6ZSwgbGVuZ3RoIC0gaXB4U2l6ZSk7Ci0JcmV0dXJuOwotdHJ1bmM6Ci0JcHJpbnRmKCJbfGlweCAlZF0iLCBsZW5ndGgpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pcHhhZGRyX3N0cmluZyh1X2ludDMyX3QgbmV0LCBjb25zdCB1X2NoYXIgKm5vZGUpCi17Ci0gICAgc3RhdGljIGNoYXIgbGluZVsyNTZdOwotCi0gICAgc25wcmludGYobGluZSwgc2l6ZW9mKGxpbmUpLCAiJTA4eC4lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCi0JICAgIG5ldCwgbm9kZVswXSwgbm9kZVsxXSwgbm9kZVsyXSwgbm9kZVszXSwgbm9kZVs0XSwgbm9kZVs1XSk7Ci0KLSAgICByZXR1cm4gbGluZTsKLX0KLQotdm9pZAotaXB4X2RlY29kZShjb25zdCBzdHJ1Y3QgaXB4SGRyICppcHgsIGNvbnN0IHVfY2hhciAqZGF0YXAsIHVfaW50IGxlbmd0aCkKLXsKLSAgICByZWdpc3RlciB1X3Nob3J0IGRzdFNrdDsKLQotICAgIGRzdFNrdCA9IEVYVFJBQ1RfMTZCSVRTKCZpcHgtPmRzdFNrdCk7Ci0gICAgc3dpdGNoIChkc3RTa3QpIHsKLSAgICAgIGNhc2UgSVBYX1NLVF9OQ1A6Ci0JKHZvaWQpcHJpbnRmKCJpcHgtbmNwICVkIiwgbGVuZ3RoKTsKLQlicmVhazsKLSAgICAgIGNhc2UgSVBYX1NLVF9TQVA6Ci0JaXB4X3NhcF9wcmludCgodV9zaG9ydCAqKWRhdGFwLCBsZW5ndGgpOwotCWJyZWFrOwotICAgICAgY2FzZSBJUFhfU0tUX1JJUDoKLQlpcHhfcmlwX3ByaW50KCh1X3Nob3J0ICopZGF0YXAsIGxlbmd0aCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIElQWF9TS1RfTkVUQklPUzoKLQkodm9pZClwcmludGYoImlweC1uZXRiaW9zICVkIiwgbGVuZ3RoKTsKLSNpZmRlZiBUQ1BEVU1QX0RPX1NNQgotCWlweF9uZXRiaW9zX3ByaW50KGRhdGFwLCBsZW5ndGgpOwotI2VuZGlmCi0JYnJlYWs7Ci0gICAgICBjYXNlIElQWF9TS1RfRElBR05PU1RJQ1M6Ci0JKHZvaWQpcHJpbnRmKCJpcHgtZGlhZ3MgJWQiLCBsZW5ndGgpOwotCWJyZWFrOwotICAgICAgY2FzZSBJUFhfU0tUX05XTElOS19ER006Ci0JKHZvaWQpcHJpbnRmKCJpcHgtbndsaW5rLWRnbSAlZCIsIGxlbmd0aCk7Ci0jaWZkZWYgVENQRFVNUF9ET19TTUIKLQlpcHhfbmV0Ymlvc19wcmludChkYXRhcCwgbGVuZ3RoKTsKLSNlbmRpZgotCWJyZWFrOwotICAgICAgY2FzZSBJUFhfU0tUX0VJR1JQOgotCWVpZ3JwX3ByaW50KGRhdGFwLCBsZW5ndGgpOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkodm9pZClwcmludGYoImlweC0jJXggJWQiLCBkc3RTa3QsIGxlbmd0aCk7Ci0JYnJlYWs7Ci0gICAgfQotfQotCi12b2lkCi1pcHhfc2FwX3ByaW50KGNvbnN0IHVfc2hvcnQgKmlweCwgdV9pbnQgbGVuZ3RoKQotewotICAgIGludCBjb21tYW5kLCBpOwotCi0gICAgVENIRUNLKGlweFswXSk7Ci0gICAgY29tbWFuZCA9IEVYVFJBQ1RfMTZCSVRTKGlweCk7Ci0gICAgaXB4Kys7Ci0gICAgbGVuZ3RoIC09IDI7Ci0KLSAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgIGNhc2UgMToKLSAgICAgIGNhc2UgMzoKLQlpZiAoY29tbWFuZCA9PSAxKQotCSAgICAodm9pZClwcmludGYoImlweC1zYXAtcmVxIik7Ci0JZWxzZQotCSAgICAodm9pZClwcmludGYoImlweC1zYXAtbmVhcmVzdC1yZXEiKTsKLQotCVRDSEVDSyhpcHhbMF0pOwotCSh2b2lkKXByaW50ZigiICVzIiwgaXB4c2FwX3N0cmluZyhodG9ucyhFWFRSQUNUXzE2QklUUygmaXB4WzBdKSkpKTsKLQlicmVhazsKLQotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSA0OgotCWlmIChjb21tYW5kID09IDIpCi0JICAgICh2b2lkKXByaW50ZigiaXB4LXNhcC1yZXNwIik7Ci0JZWxzZQotCSAgICAodm9pZClwcmludGYoImlweC1zYXAtbmVhcmVzdC1yZXNwIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgOCAmJiBsZW5ndGggPiAwOyBpKyspIHsKLQkgICAgVENIRUNLKGlweFswXSk7Ci0JICAgICh2b2lkKXByaW50ZigiICVzICciLCBpcHhzYXBfc3RyaW5nKGh0b25zKEVYVFJBQ1RfMTZCSVRTKCZpcHhbMF0pKSkpOwotCSAgICBpZiAoZm5fcHJpbnR6cCgodV9jaGFyICopJmlweFsxXSwgNDgsIHNuYXBlbmQpKSB7Ci0JCXByaW50ZigiJyIpOwotCQlnb3RvIHRydW5jOwotCSAgICB9Ci0JICAgIFRDSEVDSzIoaXB4WzI1XSwgMTApOwotCSAgICBwcmludGYoIicgYWRkciAlcyIsCi0JCWlweGFkZHJfc3RyaW5nKEVYVFJBQ1RfMzJCSVRTKCZpcHhbMjVdKSwgKHVfY2hhciAqKSZpcHhbMjddKSk7Ci0JICAgIGlweCArPSAzMjsKLQkgICAgbGVuZ3RoIC09IDY0OwotCX0KLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JKHZvaWQpcHJpbnRmKCJpcHgtc2FwLT8leCIsIGNvbW1hbmQpOwotCWJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8aXB4ICVkXSIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQKLWlweF9yaXBfcHJpbnQoY29uc3QgdV9zaG9ydCAqaXB4LCB1X2ludCBsZW5ndGgpCi17Ci0gICAgaW50IGNvbW1hbmQsIGk7Ci0KLSAgICBUQ0hFQ0soaXB4WzBdKTsKLSAgICBjb21tYW5kID0gRVhUUkFDVF8xNkJJVFMoaXB4KTsKLSAgICBpcHgrKzsKLSAgICBsZW5ndGggLT0gMjsKLQotICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgICAgY2FzZSAxOgotCSh2b2lkKXByaW50ZigiaXB4LXJpcC1yZXEiKTsKLQlpZiAobGVuZ3RoID4gMCkgewotCSAgICBUQ0hFQ0soaXB4WzNdKTsKLQkgICAgKHZvaWQpcHJpbnRmKCIgJXUvJWQuJWQiLCBFWFRSQUNUXzMyQklUUygmaXB4WzBdKSwKLQkJCSBFWFRSQUNUXzE2QklUUygmaXB4WzJdKSwgRVhUUkFDVF8xNkJJVFMoJmlweFszXSkpOwotCX0KLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQkodm9pZClwcmludGYoImlweC1yaXAtcmVzcCIpOwotCWZvciAoaSA9IDA7IGkgPCA1MCAmJiBsZW5ndGggPiAwOyBpKyspIHsKLQkgICAgVENIRUNLKGlweFszXSk7Ci0JICAgICh2b2lkKXByaW50ZigiICV1LyVkLiVkIiwgRVhUUkFDVF8zMkJJVFMoJmlweFswXSksCi0JCQkgRVhUUkFDVF8xNkJJVFMoJmlweFsyXSksIEVYVFJBQ1RfMTZCSVRTKCZpcHhbM10pKTsKLQotCSAgICBpcHggKz0gNDsKLQkgICAgbGVuZ3RoIC09IDg7Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkodm9pZClwcmludGYoImlweC1yaXAtPyV4IiwgY29tbWFuZCk7Ci0JYnJlYWs7Ci0gICAgfQotICAgIHJldHVybjsKLXRydW5jOgotICAgIHByaW50ZigiW3xpcHggJWRdIiwgbGVuZ3RoKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LWlzYWttcC5jIGIvcHJpbnQtaXNha21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDhkMzIuLjAwMDAwMDAKLS0tIGEvcHJpbnQtaXNha21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1pc2FrbXAuYyx2IDEuNTEgMjAwNS8wNC8wNyAwMDoyODoxNyBtY3IgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpc2FrbXAuaCIKLSNpbmNsdWRlICJpcHNlY19kb2kuaCIKLSNpbmNsdWRlICJvYWtsZXkuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIiAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCi0KLSNpbmNsdWRlICJpcC5oIgotI2lmZGVmIElORVQ2Ci0jaW5jbHVkZSAiaXA2LmgiCi0jZW5kaWYKLQotI2lmbmRlZiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UKLSNkZWZpbmUgc29ja2FkZHJfc3RvcmFnZSBzb2NrYWRkcgotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9zYV9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAotCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9wX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCi0JdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOwotc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX3RfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKLQl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7Ci1zdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfa2VfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKLQl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7Ci1zdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfaWRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKLQl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7Ci1zdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfY2VydF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAotCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9jcl9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAotCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9zaWdfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKLQl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7Ci1zdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfaGFzaF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAotCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9ub25jZV9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAotCXVfaW50LCBjb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKmlzYWttcF9uX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCi0JdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOwotc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX2RfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKiwKLQl1X2ludCwgY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7Ci1zdGF0aWMgY29uc3QgdV9jaGFyICppc2FrbXBfdmlkX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCi0JdV9pbnQsIGNvbnN0IHVfY2hhciAqLCB1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOwotc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX3N1YjBfcHJpbnQodV9jaGFyLCBjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqLAotCWNvbnN0IHVfY2hhciAqLAl1X2ludDMyX3QsIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOwotc3RhdGljIGNvbnN0IHVfY2hhciAqaXNha21wX3N1Yl9wcmludCh1X2NoYXIsIGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosCi0JY29uc3QgdV9jaGFyICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCB1X2ludDMyX3QsIGludCk7Ci1zdGF0aWMgY2hhciAqbnVtc3RyKGludCk7Ci1zdGF0aWMgdm9pZCBzYWZlbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotCi0jZGVmaW5lIE1BWElOSVRJQVRPUlMJMjAKLWludCBuaW5pdGlhdG9yID0gMDsKLXN0cnVjdCB7Ci0JY29va2llX3QgaW5pdGlhdG9yOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGlhZGRyOwotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHJhZGRyOwotfSBjb29raWVjYWNoZVtNQVhJTklUSUFUT1JTXTsKLQotLyogcHJvdG9jb2wgaWQgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpwcm90b2lkc3RyW10gPSB7Ci0JTlVMTCwgImlzYWttcCIsICJpcHNlYy1haCIsICJpcHNlYy1lc3AiLCAiaXBjb21wIiwKLX07Ci0KLS8qIGlzYWttcC0+bnAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpucHN0cltdID0gewotCSJub25lIiwgInNhIiwgInAiLCAidCIsICJrZSIsICJpZCIsICJjZXJ0IiwgImNyIiwgImhhc2giLAotCSJzaWciLCAibm9uY2UiLCAibiIsICJkIiwgInZpZCIKLX07Ci0KLS8qIGlzYWttcC0+bnAgKi8KLXN0YXRpYyBjb25zdCB1X2NoYXIgKigqbnBmdW5jW10pKGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICosIHVfaW50LAotCQljb25zdCB1X2NoYXIgKiwgdV9pbnQzMl90LCB1X2ludDMyX3QsIHVfaW50MzJfdCwgaW50KSA9IHsKLQlOVUxMLAotCWlzYWttcF9zYV9wcmludCwKLQlpc2FrbXBfcF9wcmludCwKLQlpc2FrbXBfdF9wcmludCwKLQlpc2FrbXBfa2VfcHJpbnQsCi0JaXNha21wX2lkX3ByaW50LAotCWlzYWttcF9jZXJ0X3ByaW50LAotCWlzYWttcF9jcl9wcmludCwKLQlpc2FrbXBfaGFzaF9wcmludCwKLQlpc2FrbXBfc2lnX3ByaW50LAotCWlzYWttcF9ub25jZV9wcmludCwKLQlpc2FrbXBfbl9wcmludCwKLQlpc2FrbXBfZF9wcmludCwKLQlpc2FrbXBfdmlkX3ByaW50LAotfTsKLQotLyogaXNha21wLT5ldHlwZSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmV0eXBlc3RyW10gPSB7Ci0JIm5vbmUiLCAiYmFzZSIsICJpZGVudCIsICJhdXRoIiwgImFnZyIsICJpbmYiLCBOVUxMLCBOVUxMLAotCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0JTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotCSJvYWtsZXktcXVpY2siLCAib2FrbGV5LW5ld2dyb3VwIiwKLX07Ci0KLSNkZWZpbmUgU1RSX09SX0lEKHgsIHRhYikgXAotCSgoKHgpIDwgc2l6ZW9mKHRhYikvc2l6ZW9mKHRhYlswXSkgJiYgdGFiWyh4KV0pCT8gdGFiWyh4KV0gOiBudW1zdHIoeCkpCi0jZGVmaW5lIFBST1RPSURTVFIoeCkJU1RSX09SX0lEKHgsIHByb3RvaWRzdHIpCi0jZGVmaW5lIE5QU1RSKHgpCVNUUl9PUl9JRCh4LCBucHN0cikKLSNkZWZpbmUgRVRZUEVTVFIoeCkJU1RSX09SX0lEKHgsIGV0eXBlc3RyKQotCi0jZGVmaW5lIE5QRlVOQyh4KSBcCi0JKCgoeCkgPCBzaXplb2YobnBmdW5jKS9zaXplb2YobnBmdW5jWzBdKSAmJiBucGZ1bmNbKHgpXSkgXAotCQk/IG5wZnVuY1soeCldIDogTlVMTCkKLQotc3RhdGljIGludAotaXN6ZXJvKHVfY2hhciAqcCwgc2l6ZV90IGwpCi17Ci0Jd2hpbGUgKGwtLSkgewotCQlpZiAoKnArKykKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotLyogZmluZCBjb29raWUgZnJvbSBpbml0aWF0b3IgY2FjaGUgKi8KLXN0YXRpYyBpbnQKLWNvb2tpZV9maW5kKGNvb2tpZV90ICppbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhJTklUSUFUT1JTOyBpKyspIHsKLQkJaWYgKG1lbWNtcChpbiwgJmNvb2tpZWNhY2hlW2ldLmluaXRpYXRvciwgc2l6ZW9mKCppbikpID09IDApCi0JCQlyZXR1cm4gaTsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qIHJlY29yZCBpbml0aWF0b3IgKi8KLXN0YXRpYyB2b2lkCi1jb29raWVfcmVjb3JkKGNvb2tpZV90ICppbiwgY29uc3QgdV9jaGFyICpicDIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IGlwICppcDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLSNpZmRlZiBJTkVUNgotCXN0cnVjdCBpcDZfaGRyICppcDY7Ci0Jc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKLSNlbmRpZgotCi0JaSA9IGNvb2tpZV9maW5kKGluKTsKLQlpZiAoMCA8PSBpKSB7Ci0JCW5pbml0aWF0b3IgPSAoaSArIDEpICUgTUFYSU5JVElBVE9SUzsKLQkJcmV0dXJuOwotCX0KLQotCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKLQlzd2l0Y2ggKElQX1YoaXApKSB7Ci0JY2FzZSA0OgotCQltZW1zZXQoJmNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyLCAwLAotCQkJc2l6ZW9mKGNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyKSk7Ci0JCW1lbXNldCgmY29va2llY2FjaGVbbmluaXRpYXRvcl0ucmFkZHIsIDAsCi0JCQlzaXplb2YoY29va2llY2FjaGVbbmluaXRpYXRvcl0ucmFkZHIpKTsKLQotCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJmNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyOwotI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0JCXNpbi0+c2luX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwotI2VuZGlmCi0JCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCW1lbWNweSgmc2luLT5zaW5fYWRkciwgJmlwLT5pcF9zcmMsIHNpemVvZihpcC0+aXBfc3JjKSk7Ci0JCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmY29va2llY2FjaGVbbmluaXRpYXRvcl0ucmFkZHI7Ci0jaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJc2luLT5zaW5fbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7Ci0jZW5kaWYKLQkJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQkJbWVtY3B5KCZzaW4tPnNpbl9hZGRyLCAmaXAtPmlwX2RzdCwgc2l6ZW9mKGlwLT5pcF9kc3QpKTsKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIDY6Ci0JCW1lbXNldCgmY29va2llY2FjaGVbbmluaXRpYXRvcl0uaWFkZHIsIDAsCi0JCQlzaXplb2YoY29va2llY2FjaGVbbmluaXRpYXRvcl0uaWFkZHIpKTsKLQkJbWVtc2V0KCZjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5yYWRkciwgMCwKLQkJCXNpemVvZihjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5yYWRkcikpOwotCi0JCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKLQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmNvb2tpZWNhY2hlW25pbml0aWF0b3JdLmlhZGRyOwotI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0JCXNpbjYtPnNpbjZfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwotI2VuZGlmCi0JCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCW1lbWNweSgmc2luNi0+c2luNl9hZGRyLCAmaXA2LT5pcDZfc3JjLCBzaXplb2YoaXA2LT5pcDZfc3JjKSk7Ci0JCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5yYWRkcjsKLSNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzaW42LT5zaW42X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKLSNlbmRpZgotCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgJmlwNi0+aXA2X2RzdCwgc2l6ZW9mKGlwNi0+aXA2X2RzdCkpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0JbWVtY3B5KCZjb29raWVjYWNoZVtuaW5pdGlhdG9yXS5pbml0aWF0b3IsIGluLCBzaXplb2YoKmluKSk7Ci0JbmluaXRpYXRvciA9IChuaW5pdGlhdG9yICsgMSkgJSBNQVhJTklUSUFUT1JTOwotfQotCi0jZGVmaW5lIGNvb2tpZV9pc2luaXRpYXRvcih4LCB5KQljb29raWVfc2lkZWNoZWNrKCh4KSwgKHkpLCAxKQotI2RlZmluZSBjb29raWVfaXNyZXNwb25kZXIoeCwgeSkJY29va2llX3NpZGVjaGVjaygoeCksICh5KSwgMCkKLXN0YXRpYyBpbnQKLWNvb2tpZV9zaWRlY2hlY2soaW50IGksIGNvbnN0IHVfY2hhciAqYnAyLCBpbnQgaW5pdGlhdG9yKQotewotCXN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHNzOwotCXN0cnVjdCBzb2NrYWRkciAqc2E7Ci0Jc3RydWN0IGlwICppcDsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKLSNpZmRlZiBJTkVUNgotCXN0cnVjdCBpcDZfaGRyICppcDY7Ci0Jc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKLSNlbmRpZgotCWludCBzYWxlbjsKLQotCW1lbXNldCgmc3MsIDAsIHNpemVvZihzcykpOwotCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKLQlzd2l0Y2ggKElQX1YoaXApKSB7Ci0JY2FzZSA0OgotCQlzaW4gPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNzOwotI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCi0JCXNpbi0+c2luX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwotI2VuZGlmCi0JCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0JCW1lbWNweSgmc2luLT5zaW5fYWRkciwgJmlwLT5pcF9zcmMsIHNpemVvZihpcC0+aXBfc3JjKSk7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JY2FzZSA2OgotCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7Ci0JCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzczsKLSNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzaW42LT5zaW42X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKLSNlbmRpZgotCQlzaW42LT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQltZW1jcHkoJnNpbjYtPnNpbjZfYWRkciwgJmlwNi0+aXA2X3NyYywgc2l6ZW9mKGlwNi0+aXA2X3NyYykpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQotCXNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzczsKLQlpZiAoaW5pdGlhdG9yKSB7Ci0JCWlmIChzYS0+c2FfZmFtaWx5ICE9ICgoc3RydWN0IHNvY2thZGRyICopJmNvb2tpZWNhY2hlW2ldLmlhZGRyKS0+c2FfZmFtaWx5KQotCQkJcmV0dXJuIDA7Ci0jaWZkZWYgSEFWRV9TT0NLQUREUl9TQV9MRU4KLQkJc2FsZW4gPSBzYS0+c2FfbGVuOwotI2Vsc2UKLSNpZmRlZiBJTkVUNgotCQlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKLQkJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOwotCQllbHNlCi0JCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOwotI2Vsc2UKLQkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyKTsKLSNlbmRpZgotI2VuZGlmCi0JCWlmIChtZW1jbXAoJnNzLCAmY29va2llY2FjaGVbaV0uaWFkZHIsIHNhbGVuKSA9PSAwKQotCQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJaWYgKHNhLT5zYV9mYW1pbHkgIT0gKChzdHJ1Y3Qgc29ja2FkZHIgKikmY29va2llY2FjaGVbaV0ucmFkZHIpLT5zYV9mYW1pbHkpCi0JCQlyZXR1cm4gMDsKLSNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgotCQlzYWxlbiA9IHNhLT5zYV9sZW47Ci0jZWxzZQotI2lmZGVmIElORVQ2Ci0JCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KQotCQkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7Ci0JCWVsc2UKLQkJCXNhbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcik7Ci0jZWxzZQotCQlzYWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOwotI2VuZGlmCi0jZW5kaWYKLQkJaWYgKG1lbWNtcCgmc3MsICZjb29raWVjYWNoZVtpXS5yYWRkciwgc2FsZW4pID09IDApCi0JCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXJhd3ByaW50KGNhZGRyX3QgbG9jLCBzaXplX3QgbGVuKQotewotCXN0YXRpYyB1X2NoYXIgKnA7Ci0Jc2l6ZV90IGk7Ci0KLQlUQ0hFQ0syKCpsb2MsIGxlbik7Ci0JCi0JcCA9ICh1X2NoYXIgKilsb2M7Ci0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlwcmludGYoIiUwMngiLCBwW2ldICYgMHhmZik7Ci0JcmV0dXJuIDE7Ci10cnVuYzoKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGF0dHJtYXAgewotCWNvbnN0IGNoYXIgKnR5cGU7Ci0JdV9pbnQgbnZhbHVlOwotCWNvbnN0IGNoYXIgKnZhbHVlWzMwXTsJLypYWFgqLwotfTsKLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfYXR0cm1hcF9wcmludChjb25zdCB1X2NoYXIgKnAsIGNvbnN0IHVfY2hhciAqZXAsCi0JY29uc3Qgc3RydWN0IGF0dHJtYXAgKm1hcCwgc2l6ZV90IG5tYXApCi17Ci0JdV9pbnQxNl90ICpxOwotCWludCB0b3RsZW47Ci0JdV9pbnQzMl90IHQsIHY7Ci0KLQlxID0gKHVfaW50MTZfdCAqKXA7Ci0JaWYgKHBbMF0gJiAweDgwKQotCQl0b3RsZW4gPSA0OwotCWVsc2UKLQkJdG90bGVuID0gNCArIEVYVFJBQ1RfMTZCSVRTKCZxWzFdKTsKLQlpZiAoZXAgPCBwICsgdG90bGVuKSB7Ci0JCXByaW50ZigiW3xhdHRyXSIpOwotCQlyZXR1cm4gZXAgKyAxOwotCX0KLQotCXByaW50ZigiKCIpOwotCXQgPSBFWFRSQUNUXzE2QklUUygmcVswXSkgJiAweDdmZmY7Ci0JaWYgKG1hcCAmJiB0IDwgbm1hcCAmJiBtYXBbdF0udHlwZSkKLQkJcHJpbnRmKCJ0eXBlPSVzICIsIG1hcFt0XS50eXBlKTsKLQllbHNlCi0JCXByaW50ZigidHlwZT0jJWQgIiwgdCk7Ci0JaWYgKHBbMF0gJiAweDgwKSB7Ci0JCXByaW50ZigidmFsdWU9Iik7Ci0JCXYgPSBFWFRSQUNUXzE2QklUUygmcVsxXSk7Ci0JCWlmIChtYXAgJiYgdCA8IG5tYXAgJiYgdiA8IG1hcFt0XS5udmFsdWUgJiYgbWFwW3RdLnZhbHVlW3ZdKQotCQkJcHJpbnRmKCIlcyIsIG1hcFt0XS52YWx1ZVt2XSk7Ci0JCWVsc2UKLQkJCXJhd3ByaW50KChjYWRkcl90KSZxWzFdLCAyKTsKLQl9IGVsc2UgewotCQlwcmludGYoImxlbj0lZCB2YWx1ZT0iLCBFWFRSQUNUXzE2QklUUygmcVsxXSkpOwotCQlyYXdwcmludCgoY2FkZHJfdCkmcFs0XSwgRVhUUkFDVF8xNkJJVFMoJnFbMV0pKTsKLQl9Ci0JcHJpbnRmKCIpIik7Ci0JcmV0dXJuIHAgKyB0b3RsZW47Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotaXNha21wX2F0dHJfcHJpbnQoY29uc3QgdV9jaGFyICpwLCBjb25zdCB1X2NoYXIgKmVwKQotewotCXVfaW50MTZfdCAqcTsKLQlpbnQgdG90bGVuOwotCXVfaW50MzJfdCB0OwotCi0JcSA9ICh1X2ludDE2X3QgKilwOwotCWlmIChwWzBdICYgMHg4MCkKLQkJdG90bGVuID0gNDsKLQllbHNlCi0JCXRvdGxlbiA9IDQgKyBFWFRSQUNUXzE2QklUUygmcVsxXSk7Ci0JaWYgKGVwIDwgcCArIHRvdGxlbikgewotCQlwcmludGYoIlt8YXR0cl0iKTsKLQkJcmV0dXJuIGVwICsgMTsKLQl9Ci0KLQlwcmludGYoIigiKTsKLQl0ID0gRVhUUkFDVF8xNkJJVFMoJnFbMF0pICYgMHg3ZmZmOwotCXByaW50ZigidHlwZT0jJWQgIiwgdCk7Ci0JaWYgKHBbMF0gJiAweDgwKSB7Ci0JCXByaW50ZigidmFsdWU9Iik7Ci0JCXQgPSBxWzFdOwotCQlyYXdwcmludCgoY2FkZHJfdCkmcVsxXSwgMik7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCJsZW49JWQgdmFsdWU9IiwgRVhUUkFDVF8xNkJJVFMoJnFbMV0pKTsKLQkJcmF3cHJpbnQoKGNhZGRyX3QpJnBbMl0sIEVYVFJBQ1RfMTZCSVRTKCZxWzFdKSk7Ci0JfQotCXByaW50ZigiKSIpOwotCXJldHVybiBwICsgdG90bGVuOwotfQotCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLWlzYWttcF9zYV9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LAotCQl1X2ludCBpdGVtX2xlbiBfVV8sCi0JCWNvbnN0IHVfY2hhciAqZXAsIHVfaW50MzJfdCBwaGFzZSwgdV9pbnQzMl90IGRvaTAgX1VfLAotCQl1X2ludDMyX3QgcHJvdG8wLCBpbnQgZGVwdGgpCi17Ci0JY29uc3Qgc3RydWN0IGlzYWttcF9wbF9zYSAqcDsKLQlzdHJ1Y3QgaXNha21wX3BsX3NhIHNhOwotCWNvbnN0IHVfaW50MzJfdCAqcTsKLQl1X2ludDMyX3QgZG9pLCBzaXQsIGlkZW50OwotCWNvbnN0IHVfY2hhciAqY3AsICpucDsKLQlpbnQgdDsKLQotCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9TQSkpOwotCi0JcCA9IChzdHJ1Y3QgaXNha21wX3BsX3NhICopZXh0OwotCVRDSEVDSygqcCk7Ci0Jc2FmZW1lbWNweSgmc2EsIGV4dCwgc2l6ZW9mKHNhKSk7Ci0JZG9pID0gbnRvaGwoc2EuZG9pKTsKLQlzaXQgPSBudG9obChzYS5zaXQpOwotCWlmIChkb2kgIT0gMSkgewotCQlwcmludGYoIiBkb2k9JWQiLCBkb2kpOwotCQlwcmludGYoIiBzaXR1YXRpb249JXUiLCAodV9pbnQzMl90KW50b2hsKHNhLnNpdCkpOwotCQlyZXR1cm4gKHVfY2hhciAqKShwICsgMSk7Ci0JfQotCi0JcHJpbnRmKCIgZG9pPWlwc2VjIik7Ci0JcSA9ICh1X2ludDMyX3QgKikmc2Euc2l0OwotCXByaW50ZigiIHNpdHVhdGlvbj0iKTsKLQl0ID0gMDsKLQlpZiAoc2l0ICYgMHgwMSkgewotCQlwcmludGYoImlkZW50aXR5Iik7Ci0JCXQrKzsKLQl9Ci0JaWYgKHNpdCAmIDB4MDIpIHsKLQkJcHJpbnRmKCIlc3NlY3JlY3kiLCB0ID8gIisiIDogIiIpOwotCQl0Kys7Ci0JfQotCWlmIChzaXQgJiAweDA0KQotCQlwcmludGYoIiVzaW50ZWdyaXR5IiwgdCA/ICIrIiA6ICIiKTsKLQotCW5wID0gKHVfY2hhciAqKWV4dCArIHNpemVvZihzYSk7Ci0JaWYgKHNpdCAhPSAweDAxKSB7Ci0JCVRDSEVDSzIoKihleHQgKyAxKSwgc2l6ZW9mKGlkZW50KSk7Ci0JCXNhZmVtZW1jcHkoJmlkZW50LCBleHQgKyAxLCBzaXplb2YoaWRlbnQpKTsKLQkJcHJpbnRmKCIgaWRlbnQ9JXUiLCAodV9pbnQzMl90KW50b2hsKGlkZW50KSk7Ci0JCW5wICs9IHNpemVvZihpZGVudCk7Ci0JfQotCi0JZXh0ID0gKHN0cnVjdCBpc2FrbXBfZ2VuICopbnA7Ci0JVENIRUNLKCpleHQpOwotCi0JY3AgPSBpc2FrbXBfc3ViX3ByaW50KElTQUtNUF9OUFRZUEVfUCwgZXh0LCBlcCwgcGhhc2UsIGRvaSwgcHJvdG8wLAotCQlkZXB0aCk7Ci0KLQlyZXR1cm4gY3A7Ci10cnVuYzoKLQlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfU0EpKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfcF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCB1X2ludCBpdGVtX2xlbiBfVV8sCi0JICAgICAgIGNvbnN0IHVfY2hhciAqZXAsIHVfaW50MzJfdCBwaGFzZSwgdV9pbnQzMl90IGRvaTAsCi0JICAgICAgIHVfaW50MzJfdCBwcm90bzAgX1VfLCBpbnQgZGVwdGgpCi17Ci0JY29uc3Qgc3RydWN0IGlzYWttcF9wbF9wICpwOwotCXN0cnVjdCBpc2FrbXBfcGxfcCBwcm9wOwotCWNvbnN0IHVfY2hhciAqY3A7Ci0KLQlwcmludGYoIiVzOiIsIE5QU1RSKElTQUtNUF9OUFRZUEVfUCkpOwotCi0JcCA9IChzdHJ1Y3QgaXNha21wX3BsX3AgKilleHQ7Ci0JVENIRUNLKCpwKTsKLQlzYWZlbWVtY3B5KCZwcm9wLCBleHQsIHNpemVvZihwcm9wKSk7Ci0JcHJpbnRmKCIgIyVkIHByb3RvaWQ9JXMgdHJhbnNmb3JtPSVkIiwKLQkJcHJvcC5wX25vLCBQUk9UT0lEU1RSKHByb3AucHJvdF9pZCksIHByb3AubnVtX3QpOwotCWlmIChwcm9wLnNwaV9zaXplKSB7Ci0JCXByaW50ZigiIHNwaT0iKTsKLQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkocCArIDEpLCBwcm9wLnNwaV9zaXplKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JfQotCi0JZXh0ID0gKHN0cnVjdCBpc2FrbXBfZ2VuICopKCh1X2NoYXIgKikocCArIDEpICsgcHJvcC5zcGlfc2l6ZSk7Ci0JVENIRUNLKCpleHQpOwotCi0JY3AgPSBpc2FrbXBfc3ViX3ByaW50KElTQUtNUF9OUFRZUEVfVCwgZXh0LCBlcCwgcGhhc2UsIGRvaTAsCi0JCXByb3AucHJvdF9pZCwgZGVwdGgpOwotCi0JcmV0dXJuIGNwOwotdHJ1bmM6Ci0JcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX1ApKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmlzYWttcF9wX21hcFtdID0gewotCU5VTEwsICJpa2UiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmFoX3BfbWFwW10gPSB7Ci0JTlVMTCwgIihyZXNlcnZlZCkiLCAibWQ1IiwgInNoYSIsICIxZGVzIiwKLQkic2hhMi0yNTYiLCAic2hhMi0zODQiLCAic2hhMi01MTIiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmVzcF9wX21hcFtdID0gewotCU5VTEwsICIxZGVzLWl2NjQiLCAiMWRlcyIsICIzZGVzIiwgInJjNSIsICJpZGVhIiwgImNhc3QiLAotCSJibG93ZmlzaCIsICIzaWRlYSIsICIxZGVzLWl2MzIiLCAicmM0IiwgIm51bGwiLCAiYWVzIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmlwY29tcF9wX21hcFtdID0gewotCU5VTEwsICJvdWkiLCAiZGVmbGF0ZSIsICJsenMiLAotfTsKLQotY29uc3Qgc3RydWN0IGF0dHJtYXAgaXBzZWNfdF9tYXBbXSA9IHsKLQl7IE5VTEwsCTAsIHsgTlVMTCB9IH0sCi0JeyAibGlmZXR5cGUiLCAzLCB7IE5VTEwsICJzZWMiLCAia2IiLCB9LCB9LAotCXsgImxpZmUiLCAwLCB7IE5VTEwgfSB9LAotCXsgImdyb3VwIGRlc2MiLCA1LAl7IE5VTEwsICJtb2RwNzY4IiwgIm1vZHAxMDI0IiwgIkVDMk4gMl4xNTUiLAotCQkJCSAgIkVDMk4gMl4xODUiLCB9LCB9LAotCXsgImVuYyBtb2RlIiwgMywgeyBOVUxMLCAidHVubmVsIiwgInRyYW5zcG9ydCIsIH0sIH0sCi0JeyAiYXV0aCIsIDUsIHsgTlVMTCwgImhtYWMtbWQ1IiwgImhtYWMtc2hhMSIsICIxZGVzLW1hYyIsICJrZXllZCIsIH0sIH0sCi0JeyAia2V5bGVuIiwgMCwgeyBOVUxMIH0gfSwKLQl7ICJyb3VuZHMiLCAwLCB7IE5VTEwgfSB9LAotCXsgImRpY3RzaXplIiwgMCwgeyBOVUxMIH0gfSwKLQl7ICJwcml2YWxnIiwgMCwgeyBOVUxMIH0gfSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBhdHRybWFwIG9ha2xleV90X21hcFtdID0gewotCXsgTlVMTCwJMCwgeyBOVUxMIH0gfSwKLQl7ICJlbmMiLCA4LAl7IE5VTEwsICIxZGVzIiwgImlkZWEiLCAiYmxvd2Zpc2giLCAicmM1IiwKLQkJIAkgICIzZGVzIiwgImNhc3QiLCAiYWVzIiwgfSwgfSwKLQl7ICJoYXNoIiwgNywJeyBOVUxMLCAibWQ1IiwgInNoYTEiLCAidGlnZXIiLAotCQkJICAic2hhMi0yNTYiLCAic2hhMi0zODQiLCAic2hhMi01MTIiLCB9LCB9LAotCXsgImF1dGgiLCA2LAl7IE5VTEwsICJwcmVzaGFyZWQiLCAiZHNzIiwgInJzYSBzaWciLCAicnNhIGVuYyIsCi0JCQkgICJyc2EgZW5jIHJldmlzZWQiLCB9LCB9LAotCXsgImdyb3VwIGRlc2MiLCA1LAl7IE5VTEwsICJtb2RwNzY4IiwgIm1vZHAxMDI0IiwgIkVDMk4gMl4xNTUiLAotCQkJCSAgIkVDMk4gMl4xODUiLCB9LCB9LAotCXsgImdyb3VwIHR5cGUiLCA0LAl7IE5VTEwsICJNT0RQIiwgIkVDUCIsICJFQzJOIiwgfSwgfSwKLQl7ICJncm91cCBwcmltZSIsIDAsIHsgTlVMTCB9IH0sCi0JeyAiZ3JvdXAgZ2VuMSIsIDAsIHsgTlVMTCB9IH0sCi0JeyAiZ3JvdXAgZ2VuMiIsIDAsIHsgTlVMTCB9IH0sCi0JeyAiZ3JvdXAgY3VydmUgQSIsIDAsIHsgTlVMTCB9IH0sCi0JeyAiZ3JvdXAgY3VydmUgQiIsIDAsIHsgTlVMTCB9IH0sCi0JeyAibGlmZXR5cGUiLCAzLAl7IE5VTEwsICJzZWMiLCAia2IiLCB9LCB9LAotCXsgImxpZmVkdXJhdGlvbiIsIDAsIHsgTlVMTCB9IH0sCi0JeyAicHJmIiwgMCwgeyBOVUxMIH0gfSwKLQl7ICJrZXlsZW4iLCAwLCB7IE5VTEwgfSB9LAotCXsgImZpZWxkIiwgMCwgeyBOVUxMIH0gfSwKLQl7ICJvcmRlciIsIDAsIHsgTlVMTCB9IH0sCi19OwotCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLWlzYWttcF90X3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuLAotCWNvbnN0IHVfY2hhciAqZXAsIHVfaW50MzJfdCBwaGFzZSBfVV8sIHVfaW50MzJfdCBkb2kgX1VfLAotCXVfaW50MzJfdCBwcm90bywgaW50IGRlcHRoIF9VXykKLXsKLQljb25zdCBzdHJ1Y3QgaXNha21wX3BsX3QgKnA7Ci0Jc3RydWN0IGlzYWttcF9wbF90IHQ7Ci0JY29uc3QgdV9jaGFyICpjcDsKLQljb25zdCBjaGFyICppZHN0cjsKLQljb25zdCBzdHJ1Y3QgYXR0cm1hcCAqbWFwOwotCXNpemVfdCBubWFwOwotCWNvbnN0IHVfY2hhciAqZXAyOwotCi0JcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX1QpKTsKLQotCXAgPSAoc3RydWN0IGlzYWttcF9wbF90ICopZXh0OwotCVRDSEVDSygqcCk7Ci0Jc2FmZW1lbWNweSgmdCwgZXh0LCBzaXplb2YodCkpOwotCi0Jc3dpdGNoIChwcm90bykgewotCWNhc2UgMToKLQkJaWRzdHIgPSBTVFJfT1JfSUQodC50X2lkLCBpc2FrbXBfcF9tYXApOwotCQltYXAgPSBvYWtsZXlfdF9tYXA7Ci0JCW5tYXAgPSBzaXplb2Yob2FrbGV5X3RfbWFwKS9zaXplb2Yob2FrbGV5X3RfbWFwWzBdKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlpZHN0ciA9IFNUUl9PUl9JRCh0LnRfaWQsIGFoX3BfbWFwKTsKLQkJbWFwID0gaXBzZWNfdF9tYXA7Ci0JCW5tYXAgPSBzaXplb2YoaXBzZWNfdF9tYXApL3NpemVvZihpcHNlY190X21hcFswXSk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJaWRzdHIgPSBTVFJfT1JfSUQodC50X2lkLCBlc3BfcF9tYXApOwotCQltYXAgPSBpcHNlY190X21hcDsKLQkJbm1hcCA9IHNpemVvZihpcHNlY190X21hcCkvc2l6ZW9mKGlwc2VjX3RfbWFwWzBdKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlpZHN0ciA9IFNUUl9PUl9JRCh0LnRfaWQsIGlwY29tcF9wX21hcCk7Ci0JCW1hcCA9IGlwc2VjX3RfbWFwOwotCQlubWFwID0gc2l6ZW9mKGlwc2VjX3RfbWFwKS9zaXplb2YoaXBzZWNfdF9tYXBbMF0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZHN0ciA9IE5VTEw7Ci0JCW1hcCA9IE5VTEw7Ci0JCW5tYXAgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoaWRzdHIpCi0JCXByaW50ZigiICMlZCBpZD0lcyAiLCB0LnRfbm8sIGlkc3RyKTsKLQllbHNlCi0JCXByaW50ZigiICMlZCBpZD0lZCAiLCB0LnRfbm8sIHQudF9pZCk7Ci0JY3AgPSAodV9jaGFyICopKHAgKyAxKTsKLQllcDIgPSAodV9jaGFyICopcCArIGl0ZW1fbGVuOwotCXdoaWxlIChjcCA8IGVwICYmIGNwIDwgZXAyKSB7Ci0JCWlmIChtYXAgJiYgbm1hcCkgewotCQkJY3AgPSBpc2FrbXBfYXR0cm1hcF9wcmludChjcCwgKGVwIDwgZXAyKSA/IGVwIDogZXAyLAotCQkJCW1hcCwgbm1hcCk7Ci0JCX0gZWxzZQotCQkJY3AgPSBpc2FrbXBfYXR0cl9wcmludChjcCwgKGVwIDwgZXAyKSA/IGVwIDogZXAyKTsKLQl9Ci0JaWYgKGVwIDwgZXAyKQotCQlwcmludGYoIi4uLiIpOwotCXJldHVybiBjcDsKLXRydW5jOgotCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9UKSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotaXNha21wX2tlX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuIF9VXywKLQkJY29uc3QgdV9jaGFyICplcCBfVV8sIHVfaW50MzJfdCBwaGFzZSBfVV8sIHVfaW50MzJfdCBkb2kgX1VfLAotCQl1X2ludDMyX3QgcHJvdG8gX1VfLCBpbnQgZGVwdGggX1VfKQotewotCXN0cnVjdCBpc2FrbXBfZ2VuIGU7Ci0KLQlwcmludGYoIiVzOiIsIE5QU1RSKElTQUtNUF9OUFRZUEVfS0UpKTsKLQotCVRDSEVDSygqZXh0KTsKLQlzYWZlbWVtY3B5KCZlLCBleHQsIHNpemVvZihlKSk7Ci0JcHJpbnRmKCIga2V5IGxlbj0lZCIsIG50b2hzKGUubGVuKSAtIDQpOwotCWlmICgyIDwgdmZsYWcgJiYgNCA8IG50b2hzKGUubGVuKSkgewotCQlwcmludGYoIiAiKTsKLQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkoZXh0ICsgMSksIG50b2hzKGUubGVuKSAtIDQpKQotCQkJZ290byB0cnVuYzsKLQl9Ci0JcmV0dXJuICh1X2NoYXIgKilleHQgKyBudG9ocyhlLmxlbik7Ci10cnVuYzoKLQlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfS0UpKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfaWRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwgdV9pbnQgaXRlbV9sZW4gX1VfLAotCQljb25zdCB1X2NoYXIgKmVwIF9VXywgdV9pbnQzMl90IHBoYXNlLCB1X2ludDMyX3QgZG9pIF9VXywKLQkJdV9pbnQzMl90IHByb3RvIF9VXywgaW50IGRlcHRoIF9VXykKLXsKLSNkZWZpbmUgVVNFX0lQU0VDRE9JX0lOX1BIQVNFMQkxCi0JY29uc3Qgc3RydWN0IGlzYWttcF9wbF9pZCAqcDsKLQlzdHJ1Y3QgaXNha21wX3BsX2lkIGlkOwotCXN0YXRpYyBjb25zdCBjaGFyICppZHR5cGVzdHJbXSA9IHsKLQkJIklQdjQiLCAiSVB2NG5ldCIsICJJUHY2IiwgIklQdjZuZXQiLAotCX07Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmlwc2VjaWR0eXBlc3RyW10gPSB7Ci0JCU5VTEwsICJJUHY0IiwgIkZRRE4iLCAidXNlciBGUUROIiwgIklQdjRuZXQiLCAiSVB2NiIsCi0JCSJJUHY2bmV0IiwgIklQdjRyYW5nZSIsICJJUHY2cmFuZ2UiLCAiQVNOMSBETiIsICJBU04xIEdOIiwKLQkJImtleWlkIiwKLQl9OwotCWludCBsZW47Ci0JY29uc3QgdV9jaGFyICpkYXRhOwotCi0JcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX0lEKSk7Ci0KLQlwID0gKHN0cnVjdCBpc2FrbXBfcGxfaWQgKilleHQ7Ci0JVENIRUNLKCpwKTsKLQlzYWZlbWVtY3B5KCZpZCwgZXh0LCBzaXplb2YoaWQpKTsKLQlpZiAoc2l6ZW9mKCpwKSA8IGl0ZW1fbGVuKSB7Ci0JCWRhdGEgPSAodV9jaGFyICopKHAgKyAxKTsKLQkJbGVuID0gaXRlbV9sZW4gLSBzaXplb2YoKnApOwotCX0gZWxzZSB7Ci0JCWRhdGEgPSBOVUxMOwotCQlsZW4gPSAwOwotCX0KLQotI2lmIDAgLypkZWJ1ZyovCi0JcHJpbnRmKCIgW3BoYXNlPSVkIGRvaT0lZCBwcm90bz0lZF0iLCBwaGFzZSwgZG9pLCBwcm90byk7Ci0jZW5kaWYKLQlzd2l0Y2ggKHBoYXNlKSB7Ci0jaWZuZGVmIFVTRV9JUFNFQ0RPSV9JTl9QSEFTRTEKLQljYXNlIDE6Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlwcmludGYoIiBpZHR5cGU9JXMiLCBTVFJfT1JfSUQoaWQuZC5pZF90eXBlLCBpZHR5cGVzdHIpKTsKLQkJcHJpbnRmKCIgZG9pX2RhdGE9JXUiLAotCQkJKHVfaW50MzJfdCkobnRvaGwoaWQuZC5kb2lfZGF0YSkgJiAweGZmZmZmZikpOwotCQlicmVhazsKLQotI2lmZGVmIFVTRV9JUFNFQ0RPSV9JTl9QSEFTRTEKLQljYXNlIDE6Ci0jZW5kaWYKLQljYXNlIDI6Ci0JICAgIHsKLQkJY29uc3Qgc3RydWN0IGlwc2VjZG9pX2lkICpwOwotCQlzdHJ1Y3QgaXBzZWNkb2lfaWQgaWQ7Ci0JCXN0cnVjdCBwcm90b2VudCAqcGU7Ci0KLQkJcCA9IChzdHJ1Y3QgaXBzZWNkb2lfaWQgKilleHQ7Ci0JCVRDSEVDSygqcCk7Ci0JCXNhZmVtZW1jcHkoJmlkLCBleHQsIHNpemVvZihpZCkpOwotCQlwcmludGYoIiBpZHR5cGU9JXMiLCBTVFJfT1JfSUQoaWQudHlwZSwgaXBzZWNpZHR5cGVzdHIpKTsKLQkJaWYgKGlkLnByb3RvX2lkKSB7Ci0jaWZuZGVmIFdJTjMyCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIG9uIGFuZHJvaWQKLQkJCS8vc2V0cHJvdG9lbnQoMSk7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQkJCXBlID0gZ2V0cHJvdG9ieW51bWJlcihpZC5wcm90b19pZCk7Ci0JCQlpZiAocGUpCi0JCQkJcHJpbnRmKCIgcHJvdG9pZD0lcyIsIHBlLT5wX25hbWUpOwotI2lmbmRlZiBXSU4zMgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBvbiBhbmRyb2lkCi0JCQkvL2VuZHByb3RvZW50KCk7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIGl0IERPRVMgTk9UIG1lYW4gSVBQUk9UT19JUCEgKi8KLQkJCXByaW50ZigiIHByb3RvaWQ9JXMiLCAiMCIpOwotCQl9Ci0JCXByaW50ZigiIHBvcnQ9JWQiLCBudG9ocyhpZC5wb3J0KSk7Ci0JCWlmICghbGVuKQotCQkJYnJlYWs7Ci0JCWlmIChkYXRhID09IE5VTEwpCi0JCQlnb3RvIHRydW5jOwotCQlUQ0hFQ0syKCpkYXRhLCBsZW4pOwotCQlzd2l0Y2ggKGlkLnR5cGUpIHsKLQkJY2FzZSBJUFNFQ0RPSV9JRF9JUFY0X0FERFI6Ci0JCQlpZiAobGVuIDwgNCkKLQkJCQlwcmludGYoIiBsZW49JWQgW2JhZDogPCA0XSIsIGxlbik7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCIgbGVuPSVkICVzIiwgbGVuLCBpcGFkZHJfc3RyaW5nKGRhdGEpKTsKLQkJCWxlbiA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBJUFNFQ0RPSV9JRF9GUUROOgotCQljYXNlIElQU0VDRE9JX0lEX1VTRVJfRlFETjoKLQkJICAgIHsKLQkJCWludCBpOwotCQkJcHJpbnRmKCIgbGVuPSVkICIsIGxlbik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCQkJc2FmZXB1dGNoYXIoZGF0YVtpXSk7Ci0JCQlsZW4gPSAwOwotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCWNhc2UgSVBTRUNET0lfSURfSVBWNF9BRERSX1NVQk5FVDoKLQkJICAgIHsKLQkJCWNvbnN0IHVfY2hhciAqbWFzazsKLQkJCWlmIChsZW4gPCA4KQotCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDhdIiwgbGVuKTsKLQkJCWVsc2UgewotCQkJCW1hc2sgPSBkYXRhICsgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJCQlwcmludGYoIiBsZW49JWQgJXMvJXUuJXUuJXUuJXUiLCBsZW4sCi0JCQkJCWlwYWRkcl9zdHJpbmcoZGF0YSksCi0JCQkJCW1hc2tbMF0sIG1hc2tbMV0sIG1hc2tbMl0sIG1hc2tbM10pOwotCQkJfQotCQkJbGVuID0gMDsKLQkJCWJyZWFrOwotCQkgICAgfQotI2lmZGVmIElORVQ2Ci0JCWNhc2UgSVBTRUNET0lfSURfSVBWNl9BRERSOgotCQkJaWYgKGxlbiA8IDE2KQotCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDE2XSIsIGxlbik7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCIgbGVuPSVkICVzIiwgbGVuLCBpcDZhZGRyX3N0cmluZyhkYXRhKSk7Ci0JCQlsZW4gPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBTRUNET0lfSURfSVBWNl9BRERSX1NVQk5FVDoKLQkJICAgIHsKLQkJCWNvbnN0IHVfaW50MzJfdCAqbWFzazsKLQkJCWlmIChsZW4gPCAyMCkKLQkJCQlwcmludGYoIiBsZW49JWQgW2JhZDogPCAyMF0iLCBsZW4pOwotCQkJZWxzZSB7Ci0JCQkJbWFzayA9ICh1X2ludDMyX3QgKikoZGF0YSArIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLQkJCQkvKlhYWCovCi0JCQkJcHJpbnRmKCIgbGVuPSVkICVzLzB4JTA4eCUwOHglMDh4JTA4eCIsIGxlbiwKLQkJCQkJaXA2YWRkcl9zdHJpbmcoZGF0YSksCi0JCQkJCW1hc2tbMF0sIG1hc2tbMV0sIG1hc2tbMl0sIG1hc2tbM10pOwotCQkJfQotCQkJbGVuID0gMDsKLQkJCWJyZWFrOwotCQkgICAgfQotI2VuZGlmIC8qSU5FVDYqLwotCQljYXNlIElQU0VDRE9JX0lEX0lQVjRfQUREUl9SQU5HRToKLQkJCWlmIChsZW4gPCA4KQotCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDhdIiwgbGVuKTsKLQkJCWVsc2UgewotCQkJCXByaW50ZigiIGxlbj0lZCAlcy0lcyIsIGxlbiwKLQkJCQkJaXBhZGRyX3N0cmluZyhkYXRhKSwKLQkJCQkJaXBhZGRyX3N0cmluZyhkYXRhICsgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpOwotCQkJfQotCQkJbGVuID0gMDsKLQkJCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JCWNhc2UgSVBTRUNET0lfSURfSVBWNl9BRERSX1JBTkdFOgotCQkJaWYgKGxlbiA8IDMyKQotCQkJCXByaW50ZigiIGxlbj0lZCBbYmFkOiA8IDMyXSIsIGxlbik7Ci0JCQllbHNlIHsKLQkJCQlwcmludGYoIiBsZW49JWQgJXMtJXMiLCBsZW4sCi0JCQkJCWlwNmFkZHJfc3RyaW5nKGRhdGEpLAotCQkJCQlpcDZhZGRyX3N0cmluZyhkYXRhICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKTsKLQkJCX0KLQkJCWxlbiA9IDA7Ci0JCQlicmVhazsKLSNlbmRpZiAvKklORVQ2Ki8KLQkJY2FzZSBJUFNFQ0RPSV9JRF9ERVJfQVNOMV9ETjoKLQkJY2FzZSBJUFNFQ0RPSV9JRF9ERVJfQVNOMV9HTjoKLQkJY2FzZSBJUFNFQ0RPSV9JRF9LRVlfSUQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQkgICAgfQotCX0KLQlpZiAoZGF0YSAmJiBsZW4pIHsKLQkJcHJpbnRmKCIgbGVuPSVkIiwgbGVuKTsKLQkJaWYgKDIgPCB2ZmxhZykgewotCQkJcHJpbnRmKCIgIik7Ci0JCQlpZiAoIXJhd3ByaW50KChjYWRkcl90KWRhdGEsIGxlbikpCi0JCQkJZ290byB0cnVuYzsKLQkJfQotCX0KLQlyZXR1cm4gKHVfY2hhciAqKWV4dCArIGl0ZW1fbGVuOwotdHJ1bmM6Ci0JcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX0lEKSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotaXNha21wX2NlcnRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwgdV9pbnQgaXRlbV9sZW4gX1VfLAotCQkgIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLAotCQkgIHVfaW50MzJfdCBkb2kwIF9VXywKLQkJICB1X2ludDMyX3QgcHJvdG8wIF9VXywgaW50IGRlcHRoIF9VXykKLXsKLQljb25zdCBzdHJ1Y3QgaXNha21wX3BsX2NlcnQgKnA7Ci0Jc3RydWN0IGlzYWttcF9wbF9jZXJ0IGNlcnQ7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmNlcnRzdHJbXSA9IHsKLQkJIm5vbmUiLAkicGtjczciLCAicGdwIiwgImRucyIsCi0JCSJ4NTA5c2lnbiIsICJ4NTA5a2UiLCAia2VyYmVyb3MiLCAiY3JsIiwKLQkJImFybCIsICJzcGtpIiwgIng1MDlhdHRyIiwKLQl9OwotCi0JcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX0NFUlQpKTsKLQotCXAgPSAoc3RydWN0IGlzYWttcF9wbF9jZXJ0ICopZXh0OwotCVRDSEVDSygqcCk7Ci0Jc2FmZW1lbWNweSgmY2VydCwgZXh0LCBzaXplb2YoY2VydCkpOwotCXByaW50ZigiIGxlbj0lZCIsIGl0ZW1fbGVuIC0gNCk7Ci0JcHJpbnRmKCIgdHlwZT0lcyIsIFNUUl9PUl9JRCgoY2VydC5lbmNvZGUpLCBjZXJ0c3RyKSk7Ci0JaWYgKDIgPCB2ZmxhZyAmJiA0IDwgaXRlbV9sZW4pIHsKLQkJcHJpbnRmKCIgIik7Ci0JCWlmICghcmF3cHJpbnQoKGNhZGRyX3QpKGV4dCArIDEpLCBpdGVtX2xlbiAtIDQpKQotCQkJZ290byB0cnVuYzsKLQl9Ci0JcmV0dXJuICh1X2NoYXIgKilleHQgKyBpdGVtX2xlbjsKLXRydW5jOgotCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9DRVJUKSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotaXNha21wX2NyX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuIF9VXywKLQkJY29uc3QgdV9jaGFyICplcCBfVV8sIHVfaW50MzJfdCBwaGFzZSBfVV8sIHVfaW50MzJfdCBkb2kwIF9VXywKLQkJdV9pbnQzMl90IHByb3RvMCBfVV8sIGludCBkZXB0aCBfVV8pCi17Ci0JY29uc3Qgc3RydWN0IGlzYWttcF9wbF9jZXJ0ICpwOwotCXN0cnVjdCBpc2FrbXBfcGxfY2VydCBjZXJ0OwotCXN0YXRpYyBjb25zdCBjaGFyICpjZXJ0c3RyW10gPSB7Ci0JCSJub25lIiwJInBrY3M3IiwgInBncCIsICJkbnMiLAotCQkieDUwOXNpZ24iLCAieDUwOWtlIiwgImtlcmJlcm9zIiwgImNybCIsCi0JCSJhcmwiLCAic3BraSIsICJ4NTA5YXR0ciIsCi0JfTsKLQotCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9DUikpOwotCi0JcCA9IChzdHJ1Y3QgaXNha21wX3BsX2NlcnQgKilleHQ7Ci0JVENIRUNLKCpwKTsKLQlzYWZlbWVtY3B5KCZjZXJ0LCBleHQsIHNpemVvZihjZXJ0KSk7Ci0JcHJpbnRmKCIgbGVuPSVkIiwgaXRlbV9sZW4gLSA0KTsKLQlwcmludGYoIiB0eXBlPSVzIiwgU1RSX09SX0lEKChjZXJ0LmVuY29kZSksIGNlcnRzdHIpKTsKLQlpZiAoMiA8IHZmbGFnICYmIDQgPCBpdGVtX2xlbikgewotCQlwcmludGYoIiAiKTsKLQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkoZXh0ICsgMSksIGl0ZW1fbGVuIC0gNCkpCi0JCQlnb3RvIHRydW5jOwotCX0KLQlyZXR1cm4gKHVfY2hhciAqKWV4dCArIGl0ZW1fbGVuOwotdHJ1bmM6Ci0JcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX0NSKSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotaXNha21wX2hhc2hfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwgdV9pbnQgaXRlbV9sZW4gX1VfLAotCQkgIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pIF9VXywKLQkJICB1X2ludDMyX3QgcHJvdG8gX1VfLCBpbnQgZGVwdGggX1VfKQotewotCXN0cnVjdCBpc2FrbXBfZ2VuIGU7Ci0KLQlwcmludGYoIiVzOiIsIE5QU1RSKElTQUtNUF9OUFRZUEVfSEFTSCkpOwotCi0JVENIRUNLKCpleHQpOwotCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKLQlwcmludGYoIiBsZW49JWQiLCBudG9ocyhlLmxlbikgLSA0KTsKLQlpZiAoMiA8IHZmbGFnICYmIDQgPCBudG9ocyhlLmxlbikpIHsKLQkJcHJpbnRmKCIgIik7Ci0JCWlmICghcmF3cHJpbnQoKGNhZGRyX3QpKGV4dCArIDEpLCBudG9ocyhlLmxlbikgLSA0KSkKLQkJCWdvdG8gdHJ1bmM7Ci0JfQotCXJldHVybiAodV9jaGFyICopZXh0ICsgbnRvaHMoZS5sZW4pOwotdHJ1bmM6Ci0JcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX0hBU0gpKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfc2lnX3ByaW50KGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIHVfaW50IGl0ZW1fbGVuIF9VXywKLQkJIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pIF9VXywKLQkJIHVfaW50MzJfdCBwcm90byBfVV8sIGludCBkZXB0aCBfVV8pCi17Ci0Jc3RydWN0IGlzYWttcF9nZW4gZTsKLQotCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9TSUcpKTsKLQotCVRDSEVDSygqZXh0KTsKLQlzYWZlbWVtY3B5KCZlLCBleHQsIHNpemVvZihlKSk7Ci0JcHJpbnRmKCIgbGVuPSVkIiwgbnRvaHMoZS5sZW4pIC0gNCk7Ci0JaWYgKDIgPCB2ZmxhZyAmJiA0IDwgbnRvaHMoZS5sZW4pKSB7Ci0JCXByaW50ZigiICIpOwotCQlpZiAoIXJhd3ByaW50KChjYWRkcl90KShleHQgKyAxKSwgbnRvaHMoZS5sZW4pIC0gNCkpCi0JCQlnb3RvIHRydW5jOwotCX0KLQlyZXR1cm4gKHVfY2hhciAqKWV4dCArIG50b2hzKGUubGVuKTsKLXRydW5jOgotCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9TSUcpKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfbm9uY2VfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwKLQkJICAgdV9pbnQgaXRlbV9sZW4gX1VfLAotCQkgICBjb25zdCB1X2NoYXIgKmVwIF9VXywKLQkJICAgdV9pbnQzMl90IHBoYXNlIF9VXywgdV9pbnQzMl90IGRvaSBfVV8sCi0JCSAgIHVfaW50MzJfdCBwcm90byBfVV8sIGludCBkZXB0aCBfVV8pCi17Ci0Jc3RydWN0IGlzYWttcF9nZW4gZTsKLQotCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9OT05DRSkpOwotCi0JVENIRUNLKCpleHQpOwotCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKLQlwcmludGYoIiBuIGxlbj0lZCIsIG50b2hzKGUubGVuKSAtIDQpOwotCWlmICgyIDwgdmZsYWcgJiYgNCA8IG50b2hzKGUubGVuKSkgewotCQlwcmludGYoIiAiKTsKLQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkoZXh0ICsgMSksIG50b2hzKGUubGVuKSAtIDQpKQotCQkJZ290byB0cnVuYzsKLQl9Ci0JcmV0dXJuICh1X2NoYXIgKilleHQgKyBudG9ocyhlLmxlbik7Ci10cnVuYzoKLQlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfTk9OQ0UpKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfbl9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCB1X2ludCBpdGVtX2xlbiwKLQljb25zdCB1X2NoYXIgKmVwLCB1X2ludDMyX3QgcGhhc2UsIHVfaW50MzJfdCBkb2kwIF9VXywKLQl1X2ludDMyX3QgcHJvdG8wIF9VXywgaW50IGRlcHRoKQotewotCXN0cnVjdCBpc2FrbXBfcGxfbiAqcCwgbjsKLQljb25zdCB1X2NoYXIgKmNwOwotCXVfY2hhciAqZXAyOwotCXVfaW50MzJfdCBkb2k7Ci0JdV9pbnQzMl90IHByb3RvOwotCXN0YXRpYyBjb25zdCBjaGFyICpub3RpZnlfZXJyb3Jfc3RyW10gPSB7Ci0JCU5VTEwsCQkJCSJJTlZBTElELVBBWUxPQUQtVFlQRSIsCi0JCSJET0ktTk9ULVNVUFBPUlRFRCIsCQkiU0lUVUFUSU9OLU5PVC1TVVBQT1JURUQiLAotCQkiSU5WQUxJRC1DT09LSUUiLAkJIklOVkFMSUQtTUFKT1ItVkVSU0lPTiIsCi0JCSJJTlZBTElELU1JTk9SLVZFUlNJT04iLAkiSU5WQUxJRC1FWENIQU5HRS1UWVBFIiwKLQkJIklOVkFMSUQtRkxBR1MiLAkJIklOVkFMSUQtTUVTU0FHRS1JRCIsCi0JCSJJTlZBTElELVBST1RPQ09MLUlEIiwJCSJJTlZBTElELVNQSSIsCi0JCSJJTlZBTElELVRSQU5TRk9STS1JRCIsCQkiQVRUUklCVVRFUy1OT1QtU1VQUE9SVEVEIiwKLQkJIk5PLVBST1BPU0FMLUNIT1NFTiIsCQkiQkFELVBST1BPU0FMLVNZTlRBWCIsCi0JCSJQQVlMT0FELU1BTEZPUk1FRCIsCQkiSU5WQUxJRC1LRVktSU5GT1JNQVRJT04iLAotCQkiSU5WQUxJRC1JRC1JTkZPUk1BVElPTiIsCSJJTlZBTElELUNFUlQtRU5DT0RJTkciLAotCQkiSU5WQUxJRC1DRVJUSUZJQ0FURSIsCQkiQ0VSVC1UWVBFLVVOU1VQUE9SVEVEIiwKLQkJIklOVkFMSUQtQ0VSVC1BVVRIT1JJVFkiLAkiSU5WQUxJRC1IQVNILUlORk9STUFUSU9OIiwKLQkJIkFVVEhFTlRJQ0FUSU9OLUZBSUxFRCIsCSJJTlZBTElELVNJR05BVFVSRSIsCi0JCSJBRERSRVNTLU5PVElGSUNBVElPTiIsCQkiTk9USUZZLVNBLUxJRkVUSU1FIiwKLQkJIkNFUlRJRklDQVRFLVVOQVZBSUxBQkxFIiwJIlVOU1VQUE9SVEVELUVYQ0hBTkdFLVRZUEUiLAotCQkiVU5FUVVBTC1QQVlMT0FELUxFTkdUSFMiLAotCX07Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKmlwc2VjX25vdGlmeV9lcnJvcl9zdHJbXSA9IHsKLQkJIlJFU0VSVkVEIiwKLQl9OwotCXN0YXRpYyBjb25zdCBjaGFyICpub3RpZnlfc3RhdHVzX3N0cltdID0gewotCQkiQ09OTkVDVEVEIiwKLQl9OwotCXN0YXRpYyBjb25zdCBjaGFyICppcHNlY19ub3RpZnlfc3RhdHVzX3N0cltdID0gewotCQkiUkVTUE9OREVSLUxJRkVUSU1FIiwJCSJSRVBMQVktU1RBVFVTIiwKLQkJIklOSVRJQUwtQ09OVEFDVCIsCi0JfTsKLS8qIE5PVEU6IHRoZXNlIG1hY3JvIG11c3QgYmUgY2FsbGVkIHdpdGggeCBpbiBwcm9wZXIgcmFuZ2UgKi8KLQotLyogMCAtIDgxOTEgKi8KLSNkZWZpbmUgTk9USUZZX0VSUk9SX1NUUih4KSBcCi0JU1RSX09SX0lEKCh4KSwgbm90aWZ5X2Vycm9yX3N0cikKLQotLyogODE5MiAtIDE2MzgzICovCi0jZGVmaW5lIElQU0VDX05PVElGWV9FUlJPUl9TVFIoeCkgXAotCVNUUl9PUl9JRCgodV9pbnQpKCh4KSAtIDgxOTIpLCBpcHNlY19ub3RpZnlfZXJyb3Jfc3RyKQotCi0vKiAxNjM4NCAtIDI0NTc1ICovCi0jZGVmaW5lIE5PVElGWV9TVEFUVVNfU1RSKHgpIFwKLQlTVFJfT1JfSUQoKHVfaW50KSgoeCkgLSAxNjM4NCksIG5vdGlmeV9zdGF0dXNfc3RyKQotCi0vKiAyNDU3NiAtIDMyNzY3ICovCi0jZGVmaW5lIElQU0VDX05PVElGWV9TVEFUVVNfU1RSKHgpIFwKLQlTVFJfT1JfSUQoKHVfaW50KSgoeCkgLSAyNDU3NiksIGlwc2VjX25vdGlmeV9zdGF0dXNfc3RyKQotCi0JcHJpbnRmKCIlczoiLCBOUFNUUihJU0FLTVBfTlBUWVBFX04pKTsKLQotCXAgPSAoc3RydWN0IGlzYWttcF9wbF9uICopZXh0OwotCVRDSEVDSygqcCk7Ci0Jc2FmZW1lbWNweSgmbiwgZXh0LCBzaXplb2YobikpOwotCWRvaSA9IG50b2hsKG4uZG9pKTsKLQlwcm90byA9IG4ucHJvdF9pZDsKLQlpZiAoZG9pICE9IDEpIHsKLQkJcHJpbnRmKCIgZG9pPSVkIiwgZG9pKTsKLQkJcHJpbnRmKCIgcHJvdG89JWQiLCBwcm90byk7Ci0JCWlmIChudG9ocyhuLnR5cGUpIDwgODE5MikKLQkJCXByaW50ZigiIHR5cGU9JXMiLCBOT1RJRllfRVJST1JfU1RSKG50b2hzKG4udHlwZSkpKTsKLQkJZWxzZSBpZiAobnRvaHMobi50eXBlKSA8IDE2Mzg0KQotCQkJcHJpbnRmKCIgdHlwZT0lcyIsIG51bXN0cihudG9ocyhuLnR5cGUpKSk7Ci0JCWVsc2UgaWYgKG50b2hzKG4udHlwZSkgPCAyNDU3NikKLQkJCXByaW50ZigiIHR5cGU9JXMiLCBOT1RJRllfU1RBVFVTX1NUUihudG9ocyhuLnR5cGUpKSk7Ci0JCWVsc2UKLQkJCXByaW50ZigiIHR5cGU9JXMiLCBudW1zdHIobnRvaHMobi50eXBlKSkpOwotCQlpZiAobi5zcGlfc2l6ZSkgewotCQkJcHJpbnRmKCIgc3BpPSIpOwotCQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkocCArIDEpLCBuLnNwaV9zaXplKSkKLQkJCQlnb3RvIHRydW5jOwotCQl9Ci0JCXJldHVybiAodV9jaGFyICopKHAgKyAxKSArIG4uc3BpX3NpemU7Ci0JfQotCi0JcHJpbnRmKCIgZG9pPWlwc2VjIik7Ci0JcHJpbnRmKCIgcHJvdG89JXMiLCBQUk9UT0lEU1RSKHByb3RvKSk7Ci0JaWYgKG50b2hzKG4udHlwZSkgPCA4MTkyKQotCQlwcmludGYoIiB0eXBlPSVzIiwgTk9USUZZX0VSUk9SX1NUUihudG9ocyhuLnR5cGUpKSk7Ci0JZWxzZSBpZiAobnRvaHMobi50eXBlKSA8IDE2Mzg0KQotCQlwcmludGYoIiB0eXBlPSVzIiwgSVBTRUNfTk9USUZZX0VSUk9SX1NUUihudG9ocyhuLnR5cGUpKSk7Ci0JZWxzZSBpZiAobnRvaHMobi50eXBlKSA8IDI0NTc2KQotCQlwcmludGYoIiB0eXBlPSVzIiwgTk9USUZZX1NUQVRVU19TVFIobnRvaHMobi50eXBlKSkpOwotCWVsc2UgaWYgKG50b2hzKG4udHlwZSkgPCAzMjc2OCkKLQkJcHJpbnRmKCIgdHlwZT0lcyIsIElQU0VDX05PVElGWV9TVEFUVVNfU1RSKG50b2hzKG4udHlwZSkpKTsKLQllbHNlCi0JCXByaW50ZigiIHR5cGU9JXMiLCBudW1zdHIobnRvaHMobi50eXBlKSkpOwotCWlmIChuLnNwaV9zaXplKSB7Ci0JCXByaW50ZigiIHNwaT0iKTsKLQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdCkocCArIDEpLCBuLnNwaV9zaXplKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JfQotCi0JY3AgPSAodV9jaGFyICopKHAgKyAxKSArIG4uc3BpX3NpemU7Ci0JZXAyID0gKHVfY2hhciAqKXAgKyBpdGVtX2xlbjsKLQotCWlmIChjcCA8IGVwKSB7Ci0JCXByaW50ZigiIG9yaWc9KCIpOwotCQlzd2l0Y2ggKG50b2hzKG4udHlwZSkpIHsKLQkJY2FzZSBJUFNFQ0RPSV9OVFlQRV9SRVNQT05ERVJfTElGRVRJTUU6Ci0JCSAgICB7Ci0JCQljb25zdCBzdHJ1Y3QgYXR0cm1hcCAqbWFwID0gb2FrbGV5X3RfbWFwOwotCQkJc2l6ZV90IG5tYXAgPSBzaXplb2Yob2FrbGV5X3RfbWFwKS9zaXplb2Yob2FrbGV5X3RfbWFwWzBdKTsKLQkJCXdoaWxlIChjcCA8IGVwICYmIGNwIDwgZXAyKSB7Ci0JCQkJY3AgPSBpc2FrbXBfYXR0cm1hcF9wcmludChjcCwKLQkJCQkJKGVwIDwgZXAyKSA/IGVwIDogZXAyLCBtYXAsIG5tYXApOwotCQkJfQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCWNhc2UgSVBTRUNET0lfTlRZUEVfUkVQTEFZX1NUQVRVUzoKLQkJCXByaW50ZigicmVwbGF5IGRldGVjdGlvbiAlc2FibGVkIiwKLQkJCQkoKih1X2ludDMyX3QgKiljcCkgPyAiZW4iIDogImRpcyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVNBS01QX05UWVBFX05PX1BST1BPU0FMX0NIT1NFTjoKLQkJCWlmIChpc2FrbXBfc3ViX3ByaW50KElTQUtNUF9OUFRZUEVfU0EsCi0JCQkgICAgKHN0cnVjdCBpc2FrbXBfZ2VuICopY3AsIGVwLCBwaGFzZSwgZG9pLCBwcm90bywKLQkJCSAgICBkZXB0aCkgPT0gTlVMTCkKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJLyogTlVMTCBpcyBkdW1teSAqLwotCQkJaXNha21wX3ByaW50KGduZG8sIGNwLAotCQkJCSAgICAgaXRlbV9sZW4gLSBzaXplb2YoKnApIC0gbi5zcGlfc2l6ZSwKLQkJCQkgICAgIE5VTEwpOwotCQl9Ci0JCXByaW50ZigiKSIpOwotCX0KLQlyZXR1cm4gKHVfY2hhciAqKWV4dCArIGl0ZW1fbGVuOwotdHJ1bmM6Ci0JcHJpbnRmKCIgW3wlc10iLCBOUFNUUihJU0FLTVBfTlBUWVBFX04pKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfZF9wcmludChjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCB1X2ludCBpdGVtX2xlbiBfVV8sCi0JICAgICAgIGNvbnN0IHVfY2hhciAqZXAgX1VfLCB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pMCBfVV8sCi0JICAgICAgIHVfaW50MzJfdCBwcm90bzAgX1VfLCBpbnQgZGVwdGggX1VfKQotewotCWNvbnN0IHN0cnVjdCBpc2FrbXBfcGxfZCAqcDsKLQlzdHJ1Y3QgaXNha21wX3BsX2QgZDsKLQljb25zdCB1X2ludDhfdCAqcTsKLQl1X2ludDMyX3QgZG9pOwotCXVfaW50MzJfdCBwcm90bzsKLQlpbnQgaTsKLQotCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9EKSk7Ci0KLQlwID0gKHN0cnVjdCBpc2FrbXBfcGxfZCAqKWV4dDsKLQlUQ0hFQ0soKnApOwotCXNhZmVtZW1jcHkoJmQsIGV4dCwgc2l6ZW9mKGQpKTsKLQlkb2kgPSBudG9obChkLmRvaSk7Ci0JcHJvdG8gPSBkLnByb3RfaWQ7Ci0JaWYgKGRvaSAhPSAxKSB7Ci0JCXByaW50ZigiIGRvaT0ldSIsIGRvaSk7Ci0JCXByaW50ZigiIHByb3RvPSV1IiwgcHJvdG8pOwotCX0gZWxzZSB7Ci0JCXByaW50ZigiIGRvaT1pcHNlYyIpOwotCQlwcmludGYoIiBwcm90bz0lcyIsIFBST1RPSURTVFIocHJvdG8pKTsKLQl9Ci0JcHJpbnRmKCIgc3BpbGVuPSV1IiwgZC5zcGlfc2l6ZSk7Ci0JcHJpbnRmKCIgbnNwaT0ldSIsIG50b2hzKGQubnVtX3NwaSkpOwotCXByaW50ZigiIHNwaT0iKTsKLQlxID0gKHVfaW50OF90ICopKHAgKyAxKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnRvaHMoZC5udW1fc3BpKTsgaSsrKSB7Ci0JCWlmIChpICE9IDApCi0JCQlwcmludGYoIiwiKTsKLQkJaWYgKCFyYXdwcmludCgoY2FkZHJfdClxLCBkLnNwaV9zaXplKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCXEgKz0gZC5zcGlfc2l6ZTsKLQl9Ci0JcmV0dXJuIHE7Ci10cnVuYzoKLQlwcmludGYoIiBbfCVzXSIsIE5QU1RSKElTQUtNUF9OUFRZUEVfRCkpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLWlzYWttcF92aWRfcHJpbnQoY29uc3Qgc3RydWN0IGlzYWttcF9nZW4gKmV4dCwKLQkJIHVfaW50IGl0ZW1fbGVuIF9VXywgY29uc3QgdV9jaGFyICplcCBfVV8sCi0JCSB1X2ludDMyX3QgcGhhc2UgX1VfLCB1X2ludDMyX3QgZG9pIF9VXywKLQkJIHVfaW50MzJfdCBwcm90byBfVV8sIGludCBkZXB0aCBfVV8pCi17Ci0Jc3RydWN0IGlzYWttcF9nZW4gZTsKLQotCXByaW50ZigiJXM6IiwgTlBTVFIoSVNBS01QX05QVFlQRV9WSUQpKTsKLQotCVRDSEVDSygqZXh0KTsKLQlzYWZlbWVtY3B5KCZlLCBleHQsIHNpemVvZihlKSk7Ci0JcHJpbnRmKCIgbGVuPSVkIiwgbnRvaHMoZS5sZW4pIC0gNCk7Ci0JaWYgKDIgPCB2ZmxhZyAmJiA0IDwgbnRvaHMoZS5sZW4pKSB7Ci0JCXByaW50ZigiICIpOwotCQlpZiAoIXJhd3ByaW50KChjYWRkcl90KShleHQgKyAxKSwgbnRvaHMoZS5sZW4pIC0gNCkpCi0JCQlnb3RvIHRydW5jOwotCX0KLQlyZXR1cm4gKHVfY2hhciAqKWV4dCArIG50b2hzKGUubGVuKTsKLXRydW5jOgotCXByaW50ZigiIFt8JXNdIiwgTlBTVFIoSVNBS01QX05QVFlQRV9WSUQpKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1pc2FrbXBfc3ViMF9wcmludCh1X2NoYXIgbnAsIGNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQsIGNvbnN0IHVfY2hhciAqZXAsCi0JdV9pbnQzMl90IHBoYXNlLCB1X2ludDMyX3QgZG9pLCB1X2ludDMyX3QgcHJvdG8sIGludCBkZXB0aCkKLXsKLQljb25zdCB1X2NoYXIgKmNwOwotCXN0cnVjdCBpc2FrbXBfZ2VuIGU7Ci0JdV9pbnQgaXRlbV9sZW47Ci0KLQljcCA9ICh1X2NoYXIgKilleHQ7Ci0JVENIRUNLKCpleHQpOwotCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKLQotCS8qCi0JICogU2luY2Ugd2UgY2FuJ3QgaGF2ZSBhIHBheWxvYWQgbGVuZ3RoIG9mIGxlc3MgdGhhbiA0IGJ5dGVzLAotCSAqIHdlIG5lZWQgdG8gYmFpbCBvdXQgaGVyZSBpZiB0aGUgZ2VuZXJpYyBoZWFkZXIgaXMgbm9uc2Vuc2ljYWwKLQkgKiBvciB0cnVuY2F0ZWQsIG90aGVyd2lzZSB3ZSBjb3VsZCBsb29wIGZvcmV2ZXIgcHJvY2Vzc2luZwotCSAqIHplcm8tbGVuZ3RoIGl0ZW1zIG9yIG90aGVyd2lzZSBtaXNkaXNzZWN0IHRoZSBwYWNrZXQuCi0JICovCi0JaXRlbV9sZW4gPSBudG9ocyhlLmxlbik7Ci0JaWYgKGl0ZW1fbGVuIDw9IDQpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKE5QRlVOQyhucCkpIHsKLQkJLyoKLQkJICogWFhYIC0gd2hhdCBpZiBpdGVtX2xlbiBpcyB0b28gc2hvcnQsIG9yIHRvbyBsb25nLAotCQkgKiBmb3IgdGhpcyBwYXlsb2FkIHR5cGU/Ci0JCSAqLwotCQljcCA9ICgqbnBmdW5jW25wXSkoZXh0LCBpdGVtX2xlbiwgZXAsIHBoYXNlLCBkb2ksIHByb3RvLCBkZXB0aCk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCIlcyIsIE5QU1RSKG5wKSk7Ci0JCWNwICs9IGl0ZW1fbGVuOwotCX0KLQotCXJldHVybiBjcDsKLXRydW5jOgotCXByaW50ZigiIFt8aXNha21wXSIpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLWlzYWttcF9zdWJfcHJpbnQodV9jaGFyIG5wLCBjb25zdCBzdHJ1Y3QgaXNha21wX2dlbiAqZXh0LCBjb25zdCB1X2NoYXIgKmVwLAotCXVfaW50MzJfdCBwaGFzZSwgdV9pbnQzMl90IGRvaSwgdV9pbnQzMl90IHByb3RvLCBpbnQgZGVwdGgpCi17Ci0JY29uc3QgdV9jaGFyICpjcDsKLQlpbnQgaTsKLQlzdHJ1Y3QgaXNha21wX2dlbiBlOwotCi0JY3AgPSAoY29uc3QgdV9jaGFyICopZXh0OwotCi0Jd2hpbGUgKG5wKSB7Ci0JCVRDSEVDSygqZXh0KTsKLQkJCi0JCXNhZmVtZW1jcHkoJmUsIGV4dCwgc2l6ZW9mKGUpKTsKLQotCQlUQ0hFQ0syKCpleHQsIG50b2hzKGUubGVuKSk7Ci0KLQkJZGVwdGgrKzsKLQkJcHJpbnRmKCJcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKLQkJCXByaW50ZigiICAgICIpOwotCQlwcmludGYoIigiKTsKLQkJY3AgPSBpc2FrbXBfc3ViMF9wcmludChucCwgZXh0LCBlcCwgcGhhc2UsIGRvaSwgcHJvdG8sIGRlcHRoKTsKLQkJcHJpbnRmKCIpIik7Ci0JCWRlcHRoLS07Ci0KLQkJaWYgKGNwID09IE5VTEwpIHsKLQkJCS8qIFplcm8tbGVuZ3RoIHN1Yml0ZW0gKi8KLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJbnAgPSBlLm5wOwotCQlleHQgPSAoc3RydWN0IGlzYWttcF9nZW4gKiljcDsKLQl9Ci0JcmV0dXJuIGNwOwotdHJ1bmM6Ci0JcHJpbnRmKCIgW3wlc10iLCBOUFNUUihucCkpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY2hhciAqCi1udW1zdHIoaW50IHgpCi17Ci0Jc3RhdGljIGNoYXIgYnVmWzIwXTsKLQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiIyVkIiwgeCk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotLyoKLSAqIHNvbWUgY29tcGlsZXIgdHJpZXMgdG8gb3B0aW1pemUgbWVtY3B5KCksIHVzaW5nIHRoZSBhbGlnbm1lbnQgY29uc3RyYWludAotICogb24gdGhlIGFyZ3VtZW50IHBvaW50ZXIgdHlwZS4gIGJ5IHVzaW5nIHRoaXMgZnVuY3Rpb24sIHdlIHRyeSB0byBhdm9pZCB0aGUKLSAqIG9wdGltaXphdGlvbi4KLSAqLwotc3RhdGljIHZvaWQKLXNhZmVtZW1jcHkodm9pZCAqcCwgY29uc3Qgdm9pZCAqcSwgc2l6ZV90IGwpCi17Ci0JbWVtY3B5KHAsIHEsIGwpOwotfQotCi12b2lkCi1pc2FrbXBfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JICAgICBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgsCi0JICAgICBjb25zdCB1X2NoYXIgKmJwMikKLXsKLQljb25zdCBzdHJ1Y3QgaXNha21wICpwOwotCXN0cnVjdCBpc2FrbXAgYmFzZTsKLQljb25zdCB1X2NoYXIgKmVwOwotCXVfY2hhciBucDsKLQlpbnQgaTsKLQlpbnQgcGhhc2U7Ci0JaW50IG1ham9yLCBtaW5vcjsKLQotCXAgPSAoY29uc3Qgc3RydWN0IGlzYWttcCAqKWJwOwotCWVwID0gbmRvLT5uZG9fc25hcGVuZDsKLQotCWlmICgoc3RydWN0IGlzYWttcCAqKWVwIDwgcCArIDEpIHsKLQkJcHJpbnRmKCJbfGlzYWttcF0iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNhZmVtZW1jcHkoJmJhc2UsIHAsIHNpemVvZihiYXNlKSk7Ci0KLQlwcmludGYoImlzYWttcCIpOwotCWlmICh2ZmxhZykgewotCQltYWpvciA9IChiYXNlLnZlcnMgJiBJU0FLTVBfVkVSU19NQUpPUikKLQkJCQk+PiBJU0FLTVBfVkVSU19NQUpPUl9TSElGVDsKLQkJbWlub3IgPSAoYmFzZS52ZXJzICYgSVNBS01QX1ZFUlNfTUlOT1IpCi0JCQkJPj4gSVNBS01QX1ZFUlNfTUlOT1JfU0hJRlQ7Ci0JCXByaW50ZigiICVkLiVkIiwgbWFqb3IsIG1pbm9yKTsKLQl9Ci0KLQlpZiAodmZsYWcpIHsKLQkJcHJpbnRmKCIgbXNnaWQgIik7Ci0JCXJhd3ByaW50KChjYWRkcl90KSZiYXNlLm1zZ2lkLCBzaXplb2YoYmFzZS5tc2dpZCkpOwotCX0KLQotCWlmICgxIDwgdmZsYWcpIHsKLQkJcHJpbnRmKCIgY29va2llICIpOwotCQlyYXdwcmludCgoY2FkZHJfdCkmYmFzZS5pX2NrLCBzaXplb2YoYmFzZS5pX2NrKSk7Ci0JCXByaW50ZigiLT4iKTsKLQkJcmF3cHJpbnQoKGNhZGRyX3QpJmJhc2Uucl9jaywgc2l6ZW9mKGJhc2Uucl9jaykpOwotCX0KLQlwcmludGYoIjoiKTsKLQotCXBoYXNlID0gKCoodV9pbnQzMl90ICopYmFzZS5tc2dpZCA9PSAwKSA/IDEgOiAyOwotCWlmIChwaGFzZSA9PSAxKQotCQlwcmludGYoIiBwaGFzZSAlZCIsIHBoYXNlKTsKLQllbHNlCi0JCXByaW50ZigiIHBoYXNlICVkL290aGVycyIsIHBoYXNlKTsKLQotCWkgPSBjb29raWVfZmluZCgmYmFzZS5pX2NrKTsKLQlpZiAoaSA8IDApIHsKLQkJaWYgKGlzemVybygodV9jaGFyICopJmJhc2Uucl9jaywgc2l6ZW9mKGJhc2Uucl9jaykpKSB7Ci0JCQkvKiB0aGUgZmlyc3QgcGFja2V0ICovCi0JCQlwcmludGYoIiBJIik7Ci0JCQlpZiAoYnAyKQotCQkJCWNvb2tpZV9yZWNvcmQoJmJhc2UuaV9jaywgYnAyKTsKLQkJfSBlbHNlCi0JCQlwcmludGYoIiA/Iik7Ci0JfSBlbHNlIHsKLQkJaWYgKGJwMiAmJiBjb29raWVfaXNpbml0aWF0b3IoaSwgYnAyKSkKLQkJCXByaW50ZigiIEkiKTsKLQkJZWxzZSBpZiAoYnAyICYmIGNvb2tpZV9pc3Jlc3BvbmRlcihpLCBicDIpKQotCQkJcHJpbnRmKCIgUiIpOwotCQllbHNlCi0JCQlwcmludGYoIiA/Iik7Ci0JfQotCi0JcHJpbnRmKCIgJXMiLCBFVFlQRVNUUihiYXNlLmV0eXBlKSk7Ci0JaWYgKGJhc2UuZmxhZ3MpIHsKLQkJcHJpbnRmKCJbJXMlc10iLCBiYXNlLmZsYWdzICYgSVNBS01QX0ZMQUdfRSA/ICJFIiA6ICIiLAotCQkJYmFzZS5mbGFncyAmIElTQUtNUF9GTEFHX0MgPyAiQyIgOiAiIik7Ci0JfQotCi0JaWYgKHZmbGFnKSB7Ci0JCWNvbnN0IHN0cnVjdCBpc2FrbXBfZ2VuICpleHQ7Ci0JCWludCBucGFyZW47Ci0KLSNkZWZpbmUgQ0hFQ0tMRU4ocCwgbnApIFwKLQkJaWYgKGVwIDwgKHVfY2hhciAqKShwKSkgewkJCQlcCi0JCQlwcmludGYoIiBbfCVzXSIsIE5QU1RSKG5wKSk7CQkJXAotCQkJZ290byBkb25lOwkJCQkJXAotCQl9Ci0KLQkJcHJpbnRmKCI6Iik7Ci0KLQkJLyogcmVnYXJkbGVzcyBvZiBwaGFzZS4uLiAqLwotCQlpZiAoYmFzZS5mbGFncyAmIElTQUtNUF9GTEFHX0UpIHsKLQkJCS8qCi0JCQkgKiBlbmNyeXB0ZWQsIG5vdGhpbmcgd2UgY2FuIGRvIHJpZ2h0IG5vdy4KLQkJCSAqIHdlIGhvcGUgdG8gZGVjcnlwdCB0aGUgcGFja2V0IGluIHRoZSBmdXR1cmUuLi4KLQkJCSAqLwotCQkJcHJpbnRmKCIgW2VuY3J5cHRlZCAlc10iLCBOUFNUUihiYXNlLm5wKSk7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQotCQlucGFyZW4gPSAwOwotCQlDSEVDS0xFTihwICsgMSwgYmFzZS5ucCkKLQotCQlucCA9IGJhc2UubnA7Ci0JCWV4dCA9IChzdHJ1Y3QgaXNha21wX2dlbiAqKShwICsgMSk7Ci0JCWlzYWttcF9zdWJfcHJpbnQobnAsIGV4dCwgZXAsIHBoYXNlLCAwLCAwLCAwKTsKLQl9Ci0KLWRvbmU6Ci0JaWYgKHZmbGFnKSB7Ci0JCWlmIChudG9obChiYXNlLmxlbikgIT0gbGVuZ3RoKSB7Ci0JCQlwcmludGYoIiAobGVuIG1pc21hdGNoOiBpc2FrbXAgJXUvaXAgJXUpIiwKLQkJCQkodV9pbnQzMl90KW50b2hsKGJhc2UubGVuKSwgbGVuZ3RoKTsKLQkJfQotCX0KLX0KLQotdm9pZAotaXNha21wX3JmYzM5NDhfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sCi0JCSAgICAgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLAotCQkgICAgIGNvbnN0IHVfY2hhciAqYnAyKQotewotCWNvbnN0IHVfY2hhciAqZXA7Ci0JZXAgPSBuZG8tPm5kb19zbmFwZW5kOwotCi0JaWYobGVuZ3RoID09IDEgJiYgYnBbMF09PTB4ZmYpIHsKLQkJTkRfUFJJTlQoKG5kbywgImlzYWttcC1uYXQta2VlcC1hbGl2ZSIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmKGxlbmd0aCA8IDQpIHsKLQkJZ290byB0cnVuYzsKLQl9Ci0KLQkvKgotCSAqIHNlZSBpZiB0aGlzIGlzIGFuIElLRSBwYWNrZXQKLQkgKi8KLQlpZihicFswXT09MCAmJiBicFsxXT09MCAmJiBicFsyXT09MCAmJiBicFszXT09MCkgewotCQlORF9QUklOVCgobmRvLCAiTk9ORVNQLWVuY2FwOiAiKSk7Ci0JCWlzYWttcF9wcmludChuZG8sIGJwKzQsIGxlbmd0aC00LCBicDIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogbXVzdCBiZSBhbiBFU1AgcGFja2V0ICovCi0JewotCQlpbnQgbmgsIGVuaCwgcGFkbGVuOwotCQlpbnQgYWR2YW5jZTsKLQotCQlORF9QUklOVCgobmRvLCAiVURQLWVuY2FwOiAiKSk7Ci0KLQkJYWR2YW5jZSA9IGVzcF9wcmludChuZG8sIGJwLCBsZW5ndGgsIGJwMiwgJmVuaCwgJnBhZGxlbik7Ci0JCWlmKGFkdmFuY2UgPD0gMCkKLQkJCXJldHVybjsKLQotCQlicCArPSBhZHZhbmNlOwotCQlsZW5ndGggLT0gYWR2YW5jZSArIHBhZGxlbjsKLQkJbmggPSBlbmggJiAweGZmOwotCSAgICAgCi0JCWlwX3ByaW50X2lubmVyKG5kbywgYnAsIGxlbmd0aCwgbmgsIGJwMik7Ci0JCXJldHVybjsKLQl9Ci0KLXRydW5jOgotCXByaW50ZigiW3xpc2FrbXBdIik7Ci0JcmV0dXJuOwotfQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogYy1zdHlsZTogd2hpdGVzbWl0aAotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtaXNvY2xucy5jIGIvcHJpbnQtaXNvY2xucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzkzNWZjLi4wMDAwMDAwCi0tLSBhL3ByaW50LWlzb2NsbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgTWF0dCBUaG9tYXMsIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uCi0gKgotICogRXh0ZW5zaXZlbHkgbW9kaWZpZWQgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkgZm9yIG1vcmUKLSAqIGNvbXBsZXRlIElTLUlTICYgQ0xOUCBzdXBwb3J0LgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWlzb2NsbnMuYyx2IDEuMTMzLjIuMjUgMjAwNy8wMy8wMiAwOToyMDoyNyBoYW5uZXMgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotI2luY2x1ZGUgImV0aGVyLmgiCi0jaW5jbHVkZSAibmxwaWQuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiZ21wbHMuaCIKLSNpbmNsdWRlICJvdWkuaCIKLQotI2RlZmluZSBJUFY0ICAgICAgICAgICAgMSAgICAgICAvKiBBRkkgdmFsdWUgKi8KLSNkZWZpbmUgSVBWNiAgICAgICAgICAgIDIgICAgICAgLyogQUZJIHZhbHVlICovCi0KLS8qCi0gKiBJUy1JUyBpcyBkZWZpbmVkIGluIElTTyAxMDU4OS4gIExvb2sgdGhlcmUgZm9yIHByb3RvY29sIGRlZmluaXRpb25zLgotICovCi0KLSNkZWZpbmUgU1lTVEVNX0lEX0xFTglFVEhFUl9BRERSX0xFTgotI2RlZmluZSBOT0RFX0lEX0xFTiAgICAgU1lTVEVNX0lEX0xFTisxCi0jZGVmaW5lIExTUF9JRF9MRU4gICAgICBTWVNURU1fSURfTEVOKzIKLQotI2RlZmluZSBJU0lTX1ZFUlNJT04JMQotI2RlZmluZSBFU0lTX1ZFUlNJT04JMQotI2RlZmluZSBDTE5QX1ZFUlNJT04JMQotCi0jZGVmaW5lIElTSVNfUERVX1RZUEVfTUFTSyAgICAgIDB4MUYKLSNkZWZpbmUgRVNJU19QRFVfVFlQRV9NQVNLICAgICAgMHgxRgotI2RlZmluZSBDTE5QX1BEVV9UWVBFX01BU0sgICAgICAweDFGCi0jZGVmaW5lIENMTlBfRkxBR19NQVNLICAgICAgICAgIDB4RTAKLSNkZWZpbmUgSVNJU19MQU5fUFJJT1JJVFlfTUFTSyAgMHg3RgotCi0jZGVmaW5lIElTSVNfUERVX0wxX0xBTl9JSUgJMTUKLSNkZWZpbmUgSVNJU19QRFVfTDJfTEFOX0lJSAkxNgotI2RlZmluZSBJU0lTX1BEVV9QVFBfSUlICTE3Ci0jZGVmaW5lIElTSVNfUERVX0wxX0xTUCAgICAgICAJMTgKLSNkZWZpbmUgSVNJU19QRFVfTDJfTFNQICAgICAgIAkyMAotI2RlZmluZSBJU0lTX1BEVV9MMV9DU05QICAJMjQKLSNkZWZpbmUgSVNJU19QRFVfTDJfQ1NOUCAgCTI1Ci0jZGVmaW5lIElTSVNfUERVX0wxX1BTTlAgICAgICAgIDI2Ci0jZGVmaW5lIElTSVNfUERVX0wyX1BTTlAgICAgICAgIDI3Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfcGR1X3ZhbHVlc1tdID0gewotICAgIHsgSVNJU19QRFVfTDFfTEFOX0lJSCwgICAgICAgIkwxIExhbiBJSUgifSwKLSAgICB7IElTSVNfUERVX0wyX0xBTl9JSUgsICAgICAgICJMMiBMYW4gSUlIIn0sCi0gICAgeyBJU0lTX1BEVV9QVFBfSUlILCAgICAgICAgICAicDJwIElJSCJ9LAotICAgIHsgSVNJU19QRFVfTDFfTFNQLCAgICAgICAgICAgIkwxIExTUCJ9LAotICAgIHsgSVNJU19QRFVfTDJfTFNQLCAgICAgICAgICAgIkwyIExTUCJ9LAotICAgIHsgSVNJU19QRFVfTDFfQ1NOUCwgICAgICAgICAgIkwxIENTTlAifSwKLSAgICB7IElTSVNfUERVX0wyX0NTTlAsICAgICAgICAgICJMMiBDU05QIn0sCi0gICAgeyBJU0lTX1BEVV9MMV9QU05QLCAgICAgICAgICAiTDEgUFNOUCJ9LAotICAgIHsgSVNJU19QRFVfTDJfUFNOUCwgICAgICAgICAgIkwyIFBTTlAifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0vKgotICogQSBUTFYgaXMgYSB0dXBsZSBvZiBhIHR5cGUsIGxlbmd0aCBhbmQgYSB2YWx1ZSBhbmQgaXMgbm9ybWFsbHkgdXNlZCBmb3IKLSAqIGVuY29kaW5nIGluZm9ybWF0aW9uIGluIGFsbCBzb3J0cyBvZiBwbGFjZXMuICBUaGlzIGlzIGFuIGVudW1lcmF0aW9uIG9mCi0gKiB0aGUgd2VsbCBrbm93biB0eXBlcy4KLSAqCi0gKiBsaXN0IHRha2VuIGZyb20gcmZjMzM1OSBwbHVzIHNvbWUgbWVtb3J5IGZyb20gdmV0ZXJhbnMgOy0pCi0gKi8KLQotI2RlZmluZSBJU0lTX1RMVl9BUkVBX0FERFIgICAgICAgICAgIDEgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9JU19SRUFDSCAgICAgICAgICAgIDIgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9FU05FSUdIICAgICAgICAgICAgIDMgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9QQVJUX0RJUyAgICAgICAgICAgIDQgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9QUkVGSVhfTkVJR0ggICAgICAgIDUgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9JU05FSUdIICAgICAgICAgICAgIDYgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9JU05FSUdIX1ZBUkxFTiAgICAgIDcgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9QQURESU5HICAgICAgICAgICAgIDggICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9MU1AgICAgICAgICAgICAgICAgIDkgICAvKiBpc28xMDU4OSAqLwotI2RlZmluZSBJU0lTX1RMVl9BVVRIICAgICAgICAgICAgICAgIDEwICAvKiBpc28xMDU4OSwgcmZjMzU2NyAqLwotI2RlZmluZSBJU0lTX1RMVl9DSEVDS1NVTSAgICAgICAgICAgIDEyICAvKiByZmMzMzU4ICovCi0jZGVmaW5lIElTSVNfVExWX0NIRUNLU1VNX01JTkxFTiAyCi0jZGVmaW5lIElTSVNfVExWX0xTUF9CVUZGRVJTSVpFICAgICAgMTQgIC8qIGlzbzEwNTg5IHJldjIgKi8KLSNkZWZpbmUgSVNJU19UTFZfTFNQX0JVRkZFUlNJWkVfTUlOTEVOIDIKLSNkZWZpbmUgSVNJU19UTFZfRVhUX0lTX1JFQUNIICAgICAgICAyMiAgLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KLSNkZWZpbmUgSVNJU19UTFZfSVNfQUxJQVNfSUQgICAgICAgICAyNCAgLyogZHJhZnQtaWV0Zi1pc2lzLWV4dC1sc3AtZnJhZ3MtMDIgKi8KLSNkZWZpbmUgSVNJU19UTFZfREVDTkVUX1BIQVNFNCAgICAgICA0MgotI2RlZmluZSBJU0lTX1RMVl9MVUNFTlRfUFJJVkFURSAgICAgIDY2Ci0jZGVmaW5lIElTSVNfVExWX0lOVF9JUF9SRUFDSCAgICAgICAgMTI4IC8qIHJmYzExOTUsIHJmYzI5NjYgKi8KLSNkZWZpbmUgSVNJU19UTFZfUFJPVE9DT0xTICAgICAgICAgICAxMjkgLyogcmZjMTE5NSAqLwotI2RlZmluZSBJU0lTX1RMVl9FWFRfSVBfUkVBQ0ggICAgICAgIDEzMCAvKiByZmMxMTk1LCByZmMyOTY2ICovCi0jZGVmaW5lIElTSVNfVExWX0lEUlBfSU5GTyAgICAgICAgICAgMTMxIC8qIHJmYzExOTUgKi8KLSNkZWZpbmUgSVNJU19UTFZfSURSUF9JTkZPX01JTkxFTiAgICAgIDEKLSNkZWZpbmUgSVNJU19UTFZfSVBBRERSICAgICAgICAgICAgICAxMzIgLyogcmZjMTE5NSAqLwotI2RlZmluZSBJU0lTX1RMVl9JUEFVVEggICAgICAgICAgICAgIDEzMyAvKiByZmMxMTk1ICovCi0jZGVmaW5lIElTSVNfVExWX1RFX1JPVVRFUl9JRCAgICAgICAgMTM0IC8qIGRyYWZ0LWlldGYtaXNpcy10cmFmZmljLTA1ICovCi0jZGVmaW5lIElTSVNfVExWX0VYVERfSVBfUkVBQ0ggICAgICAgMTM1IC8qIGRyYWZ0LWlldGYtaXNpcy10cmFmZmljLTA1ICovCi0jZGVmaW5lIElTSVNfVExWX0hPU1ROQU1FICAgICAgICAgICAgMTM3IC8qIHJmYzI3NjMgKi8KLSNkZWZpbmUgSVNJU19UTFZfU0hBUkVEX1JJU0tfR1JPVVAgICAxMzggLyogZHJhZnQtaWV0Zi1pc2lzLWdtcGxzLWV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgSVNJU19UTFZfTk9SVEVMX1BSSVZBVEUxICAgICAxNzYKLSNkZWZpbmUgSVNJU19UTFZfTk9SVEVMX1BSSVZBVEUyICAgICAxNzcKLSNkZWZpbmUgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkcgICAyMTEgLyogcmZjMzg0NyAqLwotI2RlZmluZSBJU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19GTEFHTEVOIDEKLSNkZWZpbmUgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkdfSE9MRFRJTUVMRU4gMgotI2RlZmluZSBJU0lTX1RMVl9NVF9JU19SRUFDSCAgICAgICAgIDIyMiAvKiBkcmFmdC1pZXRmLWlzaXMtd2ctbXVsdGktdG9wb2xvZ3ktMDUgKi8KLSNkZWZpbmUgSVNJU19UTFZfTVRfU1VQUE9SVEVEICAgICAgICAyMjkgLyogZHJhZnQtaWV0Zi1pc2lzLXdnLW11bHRpLXRvcG9sb2d5LTA1ICovCi0jZGVmaW5lIElTSVNfVExWX01UX1NVUFBPUlRFRF9NSU5MRU4gMgotI2RlZmluZSBJU0lTX1RMVl9JUDZBRERSICAgICAgICAgICAgIDIzMiAvKiBkcmFmdC1pZXRmLWlzaXMtaXB2Ni0wMiAqLwotI2RlZmluZSBJU0lTX1RMVl9NVF9JUF9SRUFDSCAgICAgICAgIDIzNSAvKiBkcmFmdC1pZXRmLWlzaXMtd2ctbXVsdGktdG9wb2xvZ3ktMDUgKi8KLSNkZWZpbmUgSVNJU19UTFZfSVA2X1JFQUNIICAgICAgICAgICAyMzYgLyogZHJhZnQtaWV0Zi1pc2lzLWlwdjYtMDIgKi8KLSNkZWZpbmUgSVNJU19UTFZfTVRfSVA2X1JFQUNIICAgICAgICAyMzcgLyogZHJhZnQtaWV0Zi1pc2lzLXdnLW11bHRpLXRvcG9sb2d5LTA1ICovCi0jZGVmaW5lIElTSVNfVExWX1BUUF9BREogICAgICAgICAgICAgMjQwIC8qIHJmYzMzNzMgKi8KLSNkZWZpbmUgSVNJU19UTFZfSUlIX1NFUU5SICAgICAgICAgICAyNDEgLyogZHJhZnQtc2hlbi1pc2lzLWlpaC1zZXF1ZW5jZS0wMCAqLwotI2RlZmluZSBJU0lTX1RMVl9JSUhfU0VRTlJfTUlOTEVOIDQKLSNkZWZpbmUgSVNJU19UTFZfVkVORE9SX1BSSVZBVEUgICAgICAyNTAgLyogZHJhZnQtaWV0Zi1pc2lzLWV4cGVyaW1lbnRhbC10bHYtMDEgKi8KLSNkZWZpbmUgSVNJU19UTFZfVkVORE9SX1BSSVZBVEVfTUlOTEVOIDMKLQotc3RhdGljIHN0cnVjdCB0b2sgaXNpc190bHZfdmFsdWVzW10gPSB7Ci0gICAgeyBJU0lTX1RMVl9BUkVBX0FERFIsCSAgICJBcmVhIGFkZHJlc3MoZXMpIn0sCi0gICAgeyBJU0lTX1RMVl9JU19SRUFDSCwgICAgICAgICAgICJJUyBSZWFjaGFiaWxpdHkifSwKLSAgICB7IElTSVNfVExWX0VTTkVJR0gsICAgICAgICAgICAgIkVTIE5laWdoYm9yKHMpIn0sCi0gICAgeyBJU0lTX1RMVl9QQVJUX0RJUywgICAgICAgICAgICJQYXJ0aXRpb24gRElTIn0sCi0gICAgeyBJU0lTX1RMVl9QUkVGSVhfTkVJR0gsICAgICAgICJQcmVmaXggTmVpZ2hib3JzIn0sCi0gICAgeyBJU0lTX1RMVl9JU05FSUdILCAgICAgICAgICAgICJJUyBOZWlnaGJvcihzKSJ9LAotICAgIHsgSVNJU19UTFZfSVNORUlHSF9WQVJMRU4sICAgICAiSVMgTmVpZ2hib3IocykgKHZhcmlhYmxlIGxlbmd0aCkifSwKLSAgICB7IElTSVNfVExWX1BBRERJTkcsICAgICAgICAgICAgIlBhZGRpbmcifSwKLSAgICB7IElTSVNfVExWX0xTUCwgICAgICAgICAgICAgICAgIkxTUCBlbnRyaWVzIn0sCi0gICAgeyBJU0lTX1RMVl9BVVRILCAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiJ9LAotICAgIHsgSVNJU19UTFZfQ0hFQ0tTVU0sICAgICAgICAgICAiQ2hlY2tzdW0ifSwKLSAgICB7IElTSVNfVExWX0xTUF9CVUZGRVJTSVpFLCAgICAgIkxTUCBCdWZmZXJzaXplIn0sCi0gICAgeyBJU0lTX1RMVl9FWFRfSVNfUkVBQ0gsICAgICAgICJFeHRlbmRlZCBJUyBSZWFjaGFiaWxpdHkifSwKLSAgICB7IElTSVNfVExWX0lTX0FMSUFTX0lELCAgICAgICAgIklTIEFsaWFzIElEIn0sCi0gICAgeyBJU0lTX1RMVl9ERUNORVRfUEhBU0U0LCAgICAgICJERUNuZXQgUGhhc2UgSVYifSwKLSAgICB7IElTSVNfVExWX0xVQ0VOVF9QUklWQVRFLCAgICAgIkx1Y2VudCBQcm9wcmlldGFyeSJ9LAotICAgIHsgSVNJU19UTFZfSU5UX0lQX1JFQUNILCAgICAgICAiSVB2NCBJbnRlcm5hbCBSZWFjaGFiaWxpdHkifSwKLSAgICB7IElTSVNfVExWX1BST1RPQ09MUywgICAgICAgICAgIlByb3RvY29scyBzdXBwb3J0ZWQifSwKLSAgICB7IElTSVNfVExWX0VYVF9JUF9SRUFDSCwgICAgICAgIklQdjQgRXh0ZXJuYWwgUmVhY2hhYmlsaXR5In0sCi0gICAgeyBJU0lTX1RMVl9JRFJQX0lORk8sICAgICAgICAgICJJbnRlci1Eb21haW4gSW5mb3JtYXRpb24gVHlwZSJ9LAotICAgIHsgSVNJU19UTFZfSVBBRERSLCAgICAgICAgICAgICAiSVB2NCBJbnRlcmZhY2UgYWRkcmVzcyhlcykifSwKLSAgICB7IElTSVNfVExWX0lQQVVUSCwgICAgICAgICAgICAgIklQdjQgYXV0aGVudGljYXRpb24gKGRlcHJlY2F0ZWQpIn0sCi0gICAgeyBJU0lTX1RMVl9URV9ST1VURVJfSUQsICAgICAgICJUcmFmZmljIEVuZ2luZWVyaW5nIFJvdXRlciBJRCJ9LAotICAgIHsgSVNJU19UTFZfRVhURF9JUF9SRUFDSCwgICAgICAiRXh0ZW5kZWQgSVB2NCBSZWFjaGFiaWxpdHkifSwKLSAgICB7IElTSVNfVExWX1NIQVJFRF9SSVNLX0dST1VQLCAgIlNoYXJlZCBSaXNrIExpbmsgR3JvdXAifSwKLSAgICB7IElTSVNfVExWX05PUlRFTF9QUklWQVRFMSwgICAgIk5vcnRlbCBQcm9wcmlldGFyeSJ9LAotICAgIHsgSVNJU19UTFZfTk9SVEVMX1BSSVZBVEUyLCAgICAiTm9ydGVsIFByb3ByaWV0YXJ5In0sCi0gICAgeyBJU0lTX1RMVl9IT1NUTkFNRSwgICAgICAgICAgICJIb3N0bmFtZSJ9LAotICAgIHsgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkcsICAiUmVzdGFydCBTaWduYWxpbmcifSwKLSAgICB7IElTSVNfVExWX01UX0lTX1JFQUNILCAgICAgICAgIk11bHRpIFRvcG9sb2d5IElTIFJlYWNoYWJpbGl0eSJ9LAotICAgIHsgSVNJU19UTFZfTVRfU1VQUE9SVEVELCAgICAgICAiTXVsdGkgVG9wb2xvZ3kifSwKLSAgICB7IElTSVNfVExWX0lQNkFERFIsICAgICAgICAgICAgIklQdjYgSW50ZXJmYWNlIGFkZHJlc3MoZXMpIn0sCi0gICAgeyBJU0lTX1RMVl9NVF9JUF9SRUFDSCwgICAgICAgICJNdWx0aS1Ub3BvbG9neSBJUHY0IFJlYWNoYWJpbGl0eSJ9LAotICAgIHsgSVNJU19UTFZfSVA2X1JFQUNILCAgICAgICAgICAiSVB2NiByZWFjaGFiaWxpdHkifSwKLSAgICB7IElTSVNfVExWX01UX0lQNl9SRUFDSCwgICAgICAgIk11bHRpLVRvcG9sb2d5IElQNiBSZWFjaGFiaWxpdHkifSwKLSAgICB7IElTSVNfVExWX1BUUF9BREosICAgICAgICAgICAgIlBvaW50LXRvLXBvaW50IEFkamFjZW5jeSBTdGF0ZSJ9LAotICAgIHsgSVNJU19UTFZfSUlIX1NFUU5SLCAgICAgICAgICAiSGVsbG8gUERVIFNlcXVlbmNlIE51bWJlciJ9LAotICAgIHsgSVNJU19UTFZfVkVORE9SX1BSSVZBVEUsICAgICAiVmVuZG9yIFByaXZhdGUifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotI2RlZmluZSBFU0lTX09QVElPTl9QUk9UT0NPTFMgICAgICAgIDEyOQotI2RlZmluZSBFU0lTX09QVElPTl9RT1NfTUFJTlRFTkFOQ0UgIDE5NSAvKiBpc285NTQyICovCi0jZGVmaW5lIEVTSVNfT1BUSU9OX1NFQ1VSSVRZICAgICAgICAgMTk3IC8qIGlzbzk1NDIgKi8KLSNkZWZpbmUgRVNJU19PUFRJT05fRVNfQ09ORl9USU1FICAgICAxOTggLyogaXNvOTU0MiAqLwotI2RlZmluZSBFU0lTX09QVElPTl9QUklPUklUWSAgICAgICAgIDIwNSAvKiBpc285NTQyICovCi0jZGVmaW5lIEVTSVNfT1BUSU9OX0FERFJFU1NfTUFTSyAgICAgMjI1IC8qIGlzbzk1NDIgKi8KLSNkZWZpbmUgRVNJU19PUFRJT05fU05QQV9NQVNLICAgICAgICAyMjYgLyogaXNvOTU0MiAqLwotCi1zdGF0aWMgc3RydWN0IHRvayBlc2lzX29wdGlvbl92YWx1ZXNbXSA9IHsKLSAgICB7IEVTSVNfT1BUSU9OX1BST1RPQ09MUywgICAgICAgIlByb3RvY29scyBzdXBwb3J0ZWQifSwKLSAgICB7IEVTSVNfT1BUSU9OX1FPU19NQUlOVEVOQU5DRSwgIlFvUyBNYWludGVuYW5jZSIgfSwKLSAgICB7IEVTSVNfT1BUSU9OX1NFQ1VSSVRZLCAgICAgICAgIlNlY3VyaXR5IiB9LAotICAgIHsgRVNJU19PUFRJT05fRVNfQ09ORl9USU1FLCAgICAiRVMgQ29uZmlndXJhdGlvbiBUaW1lIiB9LAotICAgIHsgRVNJU19PUFRJT05fUFJJT1JJVFksICAgICAgICAiUHJpb3JpdHkiIH0sCi0gICAgeyBFU0lTX09QVElPTl9BRERSRVNTX01BU0ssICAgICJBZGRyZXNzayBNYXNrIiB9LAotICAgIHsgRVNJU19PUFRJT05fU05QQV9NQVNLLCAgICAgICAiU05QQSBNYXNrIiB9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi0jZGVmaW5lIENMTlBfT1BUSU9OX0RJU0NBUkRfUkVBU09OICAgMTkzCi0jZGVmaW5lIENMTlBfT1BUSU9OX1FPU19NQUlOVEVOQU5DRSAgMTk1IC8qIGlzbzg0NzMgKi8KLSNkZWZpbmUgQ0xOUF9PUFRJT05fU0VDVVJJVFkgICAgICAgICAxOTcgLyogaXNvODQ3MyAqLwotI2RlZmluZSBDTE5QX09QVElPTl9TT1VSQ0VfUk9VVElORyAgIDIwMCAvKiBpc284NDczICovCi0jZGVmaW5lIENMTlBfT1BUSU9OX1JPVVRFX1JFQ09SRElORyAgMjAzIC8qIGlzbzg0NzMgKi8KLSNkZWZpbmUgQ0xOUF9PUFRJT05fUEFERElORyAgICAgICAgICAyMDQgLyogaXNvODQ3MyAqLwotI2RlZmluZSBDTE5QX09QVElPTl9QUklPUklUWSAgICAgICAgIDIwNSAvKiBpc284NDczICovCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3ZhbHVlc1tdID0gewotICAgIHsgQ0xOUF9PUFRJT05fRElTQ0FSRF9SRUFTT04sICAiRGlzY2FyZCBSZWFzb24ifSwKLSAgICB7IENMTlBfT1BUSU9OX1BSSU9SSVRZLCAgICAgICAgIlByaW9yaXR5In0sCi0gICAgeyBDTE5QX09QVElPTl9RT1NfTUFJTlRFTkFOQ0UsICJRb1MgTWFpbnRlbmFuY2UifSwKLSAgICB7IENMTlBfT1BUSU9OX1NFQ1VSSVRZLCAiU2VjdXJpdHkifSwKLSAgICB7IENMTlBfT1BUSU9OX1NPVVJDRV9ST1VUSU5HLCAiU291cmNlIFJvdXRpbmcifSwKLSAgICB7IENMTlBfT1BUSU9OX1JPVVRFX1JFQ09SRElORywgIlJvdXRlIFJlY29yZGluZyJ9LAotICAgIHsgQ0xOUF9PUFRJT05fUEFERElORywgIlBhZGRpbmcifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fcmZkX2NsYXNzX3ZhbHVlc1tdID0gewotICAgIHsgMHgwLCAiR2VuZXJhbCJ9LAotICAgIHsgMHg4LCAiQWRkcmVzcyJ9LAotICAgIHsgMHg5LCAiU291cmNlIFJvdXRlaW5nIn0sCi0gICAgeyAweGEsICJMaWZldGltZSJ9LAotICAgIHsgMHhiLCAiUERVIERpc2NhcmRlZCJ9LAotICAgIHsgMHhjLCAiUmVhc3NlbWJseSJ9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBjbG5wX29wdGlvbl9yZmRfZ2VuZXJhbF92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MCwgIlJlYXNvbiBub3Qgc3BlY2lmaWVkIn0sCi0gICAgeyAweDEsICJQcm90b2NvbCBwcm9jZWR1cmUgZXJyb3IifSwKLSAgICB7IDB4MiwgIkluY29ycmVjdCBjaGVja3N1bSJ9LAotICAgIHsgMHgzLCAiUERVIGRpc2NhcmRlZCBkdWUgdG8gY29uZ2VzdGlvbiJ9LAotICAgIHsgMHg0LCAiSGVhZGVyIHN5bnRheCBlcnJvciAoY2Fubm90IGJlIHBhcnNlZCkifSwKLSAgICB7IDB4NSwgIlNlZ21lbnRhdGlvbiBuZWVkZWQgYnV0IG5vdCBwZXJtaXR0ZWQifSwKLSAgICB7IDB4NiwgIkluY29tcGxldGUgUERVIHJlY2VpdmVkIn0sCi0gICAgeyAweDcsICJEdXBsaWNhdGUgb3B0aW9uIn0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3JmZF9hZGRyZXNzX3ZhbHVlc1tdID0gewotICAgIHsgMHgwLCAiRGVzdGluYXRpb24gYWRkcmVzcyB1bnJlYWNoYWJsZSJ9LAotICAgIHsgMHgxLCAiRGVzdGluYXRpb24gYWRkcmVzcyB1bmtub3duIn0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3JmZF9zb3VyY2Vfcm91dGVpbmdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAsICJVbnNwZWNpZmllZCBzb3VyY2Ugcm91dGVpbmcgZXJyb3IifSwKLSAgICB7IDB4MSwgIlN5bnRheCBlcnJvciBpbiBzb3VyY2Ugcm91dGVpbmcgZmllbGQifSwKLSAgICB7IDB4MiwgIlVua25vd24gYWRkcmVzcyBpbiBzb3VyY2Ugcm91dGVpbmcgZmllbGQifSwKLSAgICB7IDB4MywgIlBhdGggbm90IGFjY2VwdGFibGUifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fcmZkX2xpZmV0aW1lX3ZhbHVlc1tdID0gewotICAgIHsgMHgwLCAiTGlmZXRpbWUgZXhwaXJlZCB3aGlsZSBkYXRhIHVuaXQgaW4gdHJhbnNpdCJ9LAotICAgIHsgMHgxLCAiTGlmZXRpbWUgZXhwaXJlZCBkdXJpbmcgcmVhc3NlbWJseSJ9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBjbG5wX29wdGlvbl9yZmRfcGR1X2Rpc2NhcmRfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAsICJVbnN1cHBvcnRlZCBvcHRpb24gbm90IHNwZWNpZmllZCJ9LAotICAgIHsgMHgxLCAiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgdmVyc2lvbiJ9LAotICAgIHsgMHgyLCAiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgb3B0aW9uIn0sCi0gICAgeyAweDMsICJVbnN1cHBvcnRlZCBzb3VyY2Ugcm91dGVpbmcgb3B0aW9uIn0sCi0gICAgeyAweDQsICJVbnN1cHBvcnRlZCByZWNvcmRpbmcgb2Ygcm91dGUgb3B0aW9uIn0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3JmZF9yZWFzc2VtYmx5X3ZhbHVlc1tdID0gewotICAgIHsgMHgwLCAiUmVhc3NlbWJseSBpbnRlcmZlcmVuY2UifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotLyogYXJyYXkgb2YgMTYgZXJyb3ItY2xhc3NlcyAqLwotc3RhdGljIHN0cnVjdCB0b2sgKmNsbnBfb3B0aW9uX3JmZF9lcnJvcl9jbGFzc1tdID0gewotICAgIGNsbnBfb3B0aW9uX3JmZF9nZW5lcmFsX3ZhbHVlcywKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIGNsbnBfb3B0aW9uX3JmZF9hZGRyZXNzX3ZhbHVlcywKLSAgICBjbG5wX29wdGlvbl9yZmRfc291cmNlX3JvdXRlaW5nX3ZhbHVlcywKLSAgICBjbG5wX29wdGlvbl9yZmRfbGlmZXRpbWVfdmFsdWVzLAotICAgIGNsbnBfb3B0aW9uX3JmZF9wZHVfZGlzY2FyZF92YWx1ZXMsCi0gICAgY2xucF9vcHRpb25fcmZkX3JlYXNzZW1ibHlfdmFsdWVzLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMCi19OwotCi0jZGVmaW5lIENMTlBfT1BUSU9OX09QVElPTl9RT1NfTUFTSyAweDNmCi0jZGVmaW5lIENMTlBfT1BUSU9OX1NDT1BFX01BU0sgICAgICAweGMwCi0jZGVmaW5lIENMTlBfT1BUSU9OX1NDT1BFX1NBX1NQRUMgICAweDQwCi0jZGVmaW5lIENMTlBfT1BUSU9OX1NDT1BFX0RBX1NQRUMgICAweDgwCi0jZGVmaW5lIENMTlBfT1BUSU9OX1NDT1BFX0dMT0JBTCAgICAweGMwCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3Njb3BlX3ZhbHVlc1tdID0gewotICAgIHsgQ0xOUF9PUFRJT05fU0NPUEVfU0FfU1BFQywgIlNvdXJjZSBBZGRyZXNzIFNwZWNpZmljIn0sCi0gICAgeyBDTE5QX09QVElPTl9TQ09QRV9EQV9TUEVDLCAiRGVzdGluYXRpb24gQWRkcmVzcyBTcGVjaWZpYyJ9LAotICAgIHsgQ0xOUF9PUFRJT05fU0NPUEVfR0xPQkFMLCAiR2xvYmFsbHkgdW5pcXVlIn0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3NyX3JyX3ZhbHVlc1tdID0gewotICAgIHsgMHgwLCAicGFydGlhbCJ9LAotICAgIHsgMHgxLCAiY29tcGxldGUifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgY2xucF9vcHRpb25fc3JfcnJfc3RyaW5nX3ZhbHVlc1tdID0gewotICAgIHsgQ0xOUF9PUFRJT05fU09VUkNFX1JPVVRJTkcsICJzb3VyY2Ugcm91dGluZyJ9LAotICAgIHsgQ0xOUF9PUFRJT05fUk9VVEVfUkVDT1JESU5HLCAicmVjb3JkaW5nIG9mIHJvdXRlIGluIHByb2dyZXNzIn0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNsbnBfb3B0aW9uX3Fvc19nbG9iYWxfdmFsdWVzW10gPSB7Ci0gICAgeyAweDIwLCAicmVzZXJ2ZWQifSwKLSAgICB7IDB4MTAsICJzZXF1ZW5jaW5nIHZzLiBkZWxheSJ9LAotICAgIHsgMHgwOCwgImNvbmdlc3RlZCJ9LAotICAgIHsgMHgwNCwgImRlbGF5IHZzLiBjb3N0In0sCi0gICAgeyAweDAyLCAiZXJyb3IgdnMuIGRlbGF5In0sCi0gICAgeyAweDAxLCAiZXJyb3IgdnMuIGNvc3QifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfQURNSU5fR1JPVVAgICAgICAgICAgIDMgLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KLSNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfTE9DQUxfUkVNT1RFX0lEICA0IC8qIGRyYWZ0LWlldGYtaXNpcy1nbXBscy1leHRlbnNpb25zICovCi0jZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9MSU5LX1JFTU9URV9JRCAgICAgICAgNSAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLwotI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSVBWNF9JTlRGX0FERFIgICAgICAgIDYgLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KLSNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0lQVjRfTkVJR0hCT1JfQUREUiAgICA4IC8qIGRyYWZ0LWlldGYtaXNpcy10cmFmZmljLTA1ICovCi0jZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9NQVhfTElOS19CVyAgICAgICAgICAgOSAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLwotI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfUkVTRVJWQUJMRV9CVyAgICAgICAgMTAgLyogZHJhZnQtaWV0Zi1pc2lzLXRyYWZmaWMtMDUgKi8KLSNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX1VOUkVTRVJWRURfQlcgICAgICAgIDExIC8qIHJmYzQxMjQgKi8KLSNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0JXX0NPTlNUUkFJTlRTX09MRCAgIDEyIC8qIGRyYWZ0LWlldGYtdGV3Zy1kaWZmLXRlLXByb3RvLTA2ICovCi0jZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9URV9NRVRSSUMgICAgICAgICAgICAxOCAvKiBkcmFmdC1pZXRmLWlzaXMtdHJhZmZpYy0wNSAqLwotI2RlZmluZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTElOS19QUk9URUNUSU9OX1RZUEUgMjAgLyogZHJhZnQtaWV0Zi1pc2lzLWdtcGxzLWV4dGVuc2lvbnMgKi8KLSNkZWZpbmUgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0lOVEZfU1dfQ0FQX0RFU0NSICAgIDIxIC8qIGRyYWZ0LWlldGYtaXNpcy1nbXBscy1leHRlbnNpb25zICovCi0jZGVmaW5lIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9CV19DT05TVFJBSU5UUyAgICAgICAyMiAvKiByZmM0MTI0ICovCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfZXh0X2lzX3JlYWNoX3N1YnRsdl92YWx1ZXNbXSA9IHsKLSAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9BRE1JTl9HUk9VUCwgICAgICAgICAgICAiQWRtaW5pc3RyYXRpdmUgZ3JvdXBzIiB9LAotICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfTE9DQUxfUkVNT1RFX0lELCAgICJMaW5rIExvY2FsL1JlbW90ZSBJZGVudGlmaWVyIiB9LAotICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfUkVNT1RFX0lELCAgICAgICAgICJMaW5rIFJlbW90ZSBJZGVudGlmaWVyIiB9LAotICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0lQVjRfSU5URl9BRERSLCAgICAgICAgICJJUHY0IGludGVyZmFjZSBhZGRyZXNzIiB9LAotICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0lQVjRfTkVJR0hCT1JfQUREUiwgICAgICJJUHY0IG5laWdoYm9yIGFkZHJlc3MiIH0sCi0gICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTUFYX0xJTktfQlcsICAgICAgICAgICAgIk1heGltdW0gbGluayBiYW5kd2lkdGgiIH0sCi0gICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfUkVTRVJWQUJMRV9CVywgICAgICAgICAgIlJlc2VydmFibGUgbGluayBiYW5kd2lkdGgiIH0sCi0gICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfVU5SRVNFUlZFRF9CVywgICAgICAgICAgIlVucmVzZXJ2ZWQgYmFuZHdpZHRoIiB9LAotICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX1RFX01FVFJJQywgICAgICAgICAgICAgICJUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyIgfSwKLSAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9MSU5LX1BST1RFQ1RJT05fVFlQRSwgICAiTGluayBQcm90ZWN0aW9uIFR5cGUiIH0sCi0gICAgeyBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSU5URl9TV19DQVBfREVTQ1IsICAgICAgIkludGVyZmFjZSBTd2l0Y2hpbmcgQ2FwYWJpbGl0eSIgfSwKLSAgICB7IElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9CV19DT05TVFJBSU5UU19PTEQsICAgICAiQmFuZHdpZHRoIENvbnN0cmFpbnRzIChvbGQpIiB9LAotICAgIHsgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0JXX0NPTlNUUkFJTlRTLCAgICAgICAgICJCYW5kd2lkdGggQ29uc3RyYWludHMiIH0sCi0gICAgeyAyNTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIGZvciBjaXNjbyBzcGVjaWZpYyBleHRlbnNpb25zIiB9LAotICAgIHsgMjUxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlcnZlZCBmb3IgY2lzY28gc3BlY2lmaWMgZXh0ZW5zaW9ucyIgfSwKLSAgICB7IDI1MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQgZm9yIGNpc2NvIHNwZWNpZmljIGV4dGVuc2lvbnMiIH0sCi0gICAgeyAyNTMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIGZvciBjaXNjbyBzcGVjaWZpYyBleHRlbnNpb25zIiB9LAotICAgIHsgMjU0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNlcnZlZCBmb3IgY2lzY28gc3BlY2lmaWMgZXh0ZW5zaW9ucyIgfSwKLSAgICB7IDI1NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24iIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLSNkZWZpbmUgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9BRE1JTl9UQUczMiAgICAgICAgICAxIC8qIGRyYWZ0LWlldGYtaXNpcy1hZG1pbi10YWdzLTAxICovCi0jZGVmaW5lIElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfQURNSU5fVEFHNjQgICAgICAgICAgMiAvKiBkcmFmdC1pZXRmLWlzaXMtYWRtaW4tdGFncy0wMSAqLwotI2RlZmluZSBJU0lTX1NVQlRMVl9FWFREX0lQX1JFQUNIX01HTVRfUFJFRklYX0NPTE9SICAxMTcgLyogZHJhZnQtaWV0Zi1pc2lzLXdnLW11bHRpLXRvcG9sb2d5LTA1ICovCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfZXh0X2lwX3JlYWNoX3N1YnRsdl92YWx1ZXNbXSA9IHsKLSAgICB7IElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfQURNSU5fVEFHMzIsICAgICAgICAgICAiMzItQml0IEFkbWluaXN0cmF0aXZlIHRhZyIgfSwKLSAgICB7IElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfQURNSU5fVEFHNjQsICAgICAgICAgICAiNjQtQml0IEFkbWluaXN0cmF0aXZlIHRhZyIgfSwKLSAgICB7IElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfTUdNVF9QUkVGSVhfQ09MT1IsICAgICAiTWFuYWdlbWVudCBQcmVmaXggQ29sb3IiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLSNkZWZpbmUgSVNJU19TVUJUTFZfQVVUSF9TSU1QTEUgICAgICAgIDEKLSNkZWZpbmUgSVNJU19TVUJUTFZfQVVUSF9NRDUgICAgICAgICAgNTQKLSNkZWZpbmUgSVNJU19TVUJUTFZfQVVUSF9NRDVfTEVOICAgICAgMTYKLSNkZWZpbmUgSVNJU19TVUJUTFZfQVVUSF9QUklWQVRFICAgICAyNTUKLQotc3RhdGljIHN0cnVjdCB0b2sgaXNpc19zdWJ0bHZfYXV0aF92YWx1ZXNbXSA9IHsKLSAgICB7IElTSVNfU1VCVExWX0FVVEhfU0lNUExFLAkic2ltcGxlIHRleHQgcGFzc3dvcmQifSwKLSAgICB7IElTSVNfU1VCVExWX0FVVEhfTUQ1LAkiSE1BQy1NRDUgcGFzc3dvcmQifSwKLSAgICB7IElTSVNfU1VCVExWX0FVVEhfUFJJVkFURSwJIlJvdXRpbmcgRG9tYWluIHByaXZhdGUgcGFzc3dvcmQifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotI2RlZmluZSBJU0lTX1NVQlRMVl9JRFJQX1JFUyAgICAgICAgICAgMAotI2RlZmluZSBJU0lTX1NVQlRMVl9JRFJQX0xPQ0FMICAgICAgICAgMQotI2RlZmluZSBJU0lTX1NVQlRMVl9JRFJQX0FTTiAgICAgICAgICAgMgotCi1zdGF0aWMgc3RydWN0IHRvayBpc2lzX3N1YnRsdl9pZHJwX3ZhbHVlc1tdID0gewotICAgIHsgSVNJU19TVUJUTFZfSURSUF9SRVMsICAgICAgICAgIlJlc2VydmVkIn0sCi0gICAgeyBJU0lTX1NVQlRMVl9JRFJQX0xPQ0FMLCAgICAgICAiUm91dGluZy1Eb21haW4gU3BlY2lmaWMifSwKLSAgICB7IElTSVNfU1VCVExWX0lEUlBfQVNOLCAgICAgICAgICJBUyBOdW1iZXIgVGFnIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZSBDTE5QX1NFR01FTlRfUEFSVCAgMHg4MAotI2RlZmluZSBDTE5QX01PUkVfU0VHTUVOVFMgMHg0MAotI2RlZmluZSBDTE5QX1JFUVVFU1RfRVIgICAgMHgyMAotCi1zdGF0aWMgc3RydWN0IHRvayBjbG5wX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyBDTE5QX1NFR01FTlRfUEFSVCwgIlNlZ21lbnRhdGlvbiBwZXJtaXR0ZWQifSwKLSAgICB7IENMTlBfTU9SRV9TRUdNRU5UUywgIm1vcmUgU2VnbWVudHMifSwKLSAgICB7IENMTlBfUkVRVUVTVF9FUiwgInJlcXVlc3QgRXJyb3IgUmVwb3J0In0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZSBJU0lTX01BU0tfTFNQX09MX0JJVCh4KSAgICAgICAgICAgICgoeCkmMHg0KQotI2RlZmluZSBJU0lTX01BU0tfTFNQX0lTVFlQRV9CSVRTKHgpICAgICAgICgoeCkmMHgzKQotI2RlZmluZSBJU0lTX01BU0tfTFNQX1BBUlRJVElPTl9CSVQoeCkgICAgICgoeCkmMHg4MCkKLSNkZWZpbmUgSVNJU19NQVNLX0xTUF9BVFRfQklUUyh4KSAgICAgICAgICAoKHgpJjB4NzgpCi0jZGVmaW5lIElTSVNfTUFTS19MU1BfQVRUX0VSUk9SX0JJVCh4KSAgICAgKCh4KSYweDQwKQotI2RlZmluZSBJU0lTX01BU0tfTFNQX0FUVF9FWFBFTlNFX0JJVCh4KSAgICgoeCkmMHgyMCkKLSNkZWZpbmUgSVNJU19NQVNLX0xTUF9BVFRfREVMQVlfQklUKHgpICAgICAoKHgpJjB4MTApCi0jZGVmaW5lIElTSVNfTUFTS19MU1BfQVRUX0RFRkFVTFRfQklUKHgpICAgKCh4KSYweDgpCi0KLSNkZWZpbmUgSVNJU19NQVNLX01USUQoeCkgICAgICAgICAgICAgICAgICAoKHgpJjB4MGZmZikKLSNkZWZpbmUgSVNJU19NQVNLX01URkxBR1MoeCkgICAgICAgICAgICAgICAoKHgpJjB4ZjAwMCkKLQotc3RhdGljIHN0cnVjdCB0b2sgaXNpc19tdF9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHg0MDAwLCAgICAgICAgICAgICAgICAgICJzdWItVExWcyBwcmVzZW50In0sCi0gICAgeyAweDgwMDAsICAgICAgICAgICAgICAgICAgIkFUVCBiaXQgc2V0In0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZSBJU0lTX01BU0tfVExWX0VYVERfSVBfVVBET1dOKHgpICAgICAoKHgpJjB4ODApCi0jZGVmaW5lIElTSVNfTUFTS19UTFZfRVhURF9JUF9TVUJUTFYoeCkgICAgICgoeCkmMHg0MCkKLQotI2RlZmluZSBJU0lTX01BU0tfVExWX0VYVERfSVA2X0lFKHgpICAgICAgICAoKHgpJjB4NDApCi0jZGVmaW5lIElTSVNfTUFTS19UTFZfRVhURF9JUDZfU1VCVExWKHgpICAgICgoeCkmMHgyMCkKLQotI2RlZmluZSBJU0lTX0xTUF9UTFZfTUVUUklDX1NVUFBPUlRFRCh4KSAgICgoeCkmMHg4MCkKLSNkZWZpbmUgSVNJU19MU1BfVExWX01FVFJJQ19JRSh4KSAgICAgICAgICAoKHgpJjB4NDApCi0jZGVmaW5lIElTSVNfTFNQX1RMVl9NRVRSSUNfVVBET1dOKHgpICAgICAgKCh4KSYweDgwKQotI2RlZmluZSBJU0lTX0xTUF9UTFZfTUVUUklDX1ZBTFVFKHgpCSAgICgoeCkmMHgzZikKLQotI2RlZmluZSBJU0lTX01BU0tfVExWX1NIQVJFRF9SSVNLX0dST1VQKHgpICgoeCkmMHgxKQotCi1zdGF0aWMgc3RydWN0IHRvayBpc2lzX210X3ZhbHVlc1tdID0gewotICAgIHsgMCwgICAgIklQdjQgdW5pY2FzdCJ9LAotICAgIHsgMSwgICAgIkluLUJhbmQgTWFuYWdlbWVudCJ9LAotICAgIHsgMiwgICAgIklQdjYgdW5pY2FzdCJ9LAotICAgIHsgMywgICAgIk11bHRpY2FzdCJ9LAotICAgIHsgNDA5NSwgIkRldmVsb3BtZW50LCBFeHBlcmltZW50YWwgb3IgUHJvcHJpZXRhcnkifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgaXNpc19paWhfY2lyY3VpdF90eXBlX3ZhbHVlc1tdID0gewotICAgIHsgMSwgICAgIkxldmVsIDEgb25seSJ9LAotICAgIHsgMiwgICAgIkxldmVsIDIgb25seSJ9LAotICAgIHsgMywgICAgIkxldmVsIDEsIExldmVsIDIifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIElTSVNfTFNQX1RZUEVfVU5VU0VEMCAgIDAKLSNkZWZpbmUgSVNJU19MU1BfVFlQRV9MRVZFTF8xICAgMQotI2RlZmluZSBJU0lTX0xTUF9UWVBFX1VOVVNFRDIgICAyCi0jZGVmaW5lIElTSVNfTFNQX1RZUEVfTEVWRUxfMiAgIDMKLQotc3RhdGljIHN0cnVjdCB0b2sgaXNpc19sc3BfaXN0eXBlX3ZhbHVlc1tdID0gewotICAgIHsgSVNJU19MU1BfVFlQRV9VTlVTRUQwLAkiVW51c2VkIDB4MCAoaW52YWxpZCkifSwKLSAgICB7IElTSVNfTFNQX1RZUEVfTEVWRUxfMSwJIkwxIElTIn0sCi0gICAgeyBJU0lTX0xTUF9UWVBFX1VOVVNFRDIsCSJVbnVzZWQgMHgyIChpbnZhbGlkKSJ9LAotICAgIHsgSVNJU19MU1BfVFlQRV9MRVZFTF8yLAkiTDIgSVMifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotLyoKLSAqIEthdHoncyBwb2ludCB0byBwb2ludCBhZGphY2VuY3kgVExWIHVzZXMgY29kZXMgdG8gdGVsbCB1cyB0aGUgc3RhdGUgb2YKLSAqIHRoZSByZW1vdGUgYWRqYWNlbmN5LiAgRW51bWVyYXRlIHRoZW0uCi0gKi8KLQotI2RlZmluZSBJU0lTX1BUUF9BREpfVVAgICAwCi0jZGVmaW5lIElTSVNfUFRQX0FESl9JTklUIDEKLSNkZWZpbmUgSVNJU19QVFBfQURKX0RPV04gMgotCi1zdGF0aWMgc3RydWN0IHRvayBpc2lzX3B0cF9hZGphbmNleV92YWx1ZXNbXSA9IHsKLSAgICB7IElTSVNfUFRQX0FESl9VUCwgICAgIlVwIiB9LAotICAgIHsgSVNJU19QVFBfQURKX0lOSVQsICAiSW5pdGlhbGl6aW5nIiB9LAotICAgIHsgSVNJU19QVFBfQURKX0RPV04sICAiRG93biIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgaXNpc190bHZfcHRwX2FkaiB7Ci0gICAgdV9pbnQ4X3QgYWRqYWNlbmN5X3N0YXRlOwotICAgIHVfaW50OF90IGV4dGRfbG9jYWxfY2lyY3VpdF9pZFs0XTsKLSAgICB1X2ludDhfdCBuZWlnaGJvcl9zeXNpZFtTWVNURU1fSURfTEVOXTsKLSAgICB1X2ludDhfdCBuZWlnaGJvcl9leHRkX2xvY2FsX2NpcmN1aXRfaWRbNF07Ci19OwotCi1zdGF0aWMgaW50IG9zaV9ja3N1bShjb25zdCB1X2ludDhfdCAqLCB1X2ludCk7Ci1zdGF0aWMgaW50IGNsbnBfcHJpbnQoY29uc3QgdV9pbnQ4X3QgKiwgdV9pbnQpOwotc3RhdGljIHZvaWQgZXNpc19wcmludChjb25zdCB1X2ludDhfdCAqLCB1X2ludCk7Ci1zdGF0aWMgaW50IGlzaXNfcHJpbnQoY29uc3QgdV9pbnQ4X3QgKiwgdV9pbnQpOwotCi1zdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2sgewotICAgIHVfaW50OF90IG1ldHJpY19kZWZhdWx0OwotICAgIHVfaW50OF90IG1ldHJpY19kZWxheTsKLSAgICB1X2ludDhfdCBtZXRyaWNfZXhwZW5zZTsKLSAgICB1X2ludDhfdCBtZXRyaWNfZXJyb3I7Ci19OwotCi1zdHJ1Y3QgaXNpc190bHZfaXNfcmVhY2ggewotICAgIHN0cnVjdCBpc2lzX21ldHJpY19ibG9jayBpc2lzX21ldHJpY19ibG9jazsKLSAgICB1X2ludDhfdCBuZWlnaGJvcl9ub2RlaWRbTk9ERV9JRF9MRU5dOwotfTsKLQotc3RydWN0IGlzaXNfdGx2X2VzX3JlYWNoIHsKLSAgICBzdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2sgaXNpc19tZXRyaWNfYmxvY2s7Ci0gICAgdV9pbnQ4X3QgbmVpZ2hib3Jfc3lzaWRbU1lTVEVNX0lEX0xFTl07Ci19OwotCi1zdHJ1Y3QgaXNpc190bHZfaXBfcmVhY2ggewotICAgIHN0cnVjdCBpc2lzX21ldHJpY19ibG9jayBpc2lzX21ldHJpY19ibG9jazsKLSAgICB1X2ludDhfdCBwcmVmaXhbNF07Ci0gICAgdV9pbnQ4X3QgbWFza1s0XTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGlzaXNfaXNfcmVhY2hfdmlydHVhbF92YWx1ZXNbXSA9IHsKLSAgICB7IDAsICAgICJJc05vdFZpcnR1YWwifSwKLSAgICB7IDEsICAgICJJc1ZpcnR1YWwifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgaXNpc19yZXN0YXJ0X2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDEsICAiUmVzdGFydCBSZXF1ZXN0In0sCi0gICAgeyAweDIsICAiUmVzdGFydCBBY2tub3dsZWRnZW1lbnQifSwKLSAgICB7IDB4NCwgICJTdXBwcmVzcyBhZGphY2VuY3kgYWR2ZXJ0aXNlbWVudCJ9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdHJ1Y3QgaXNpc19jb21tb25faGVhZGVyIHsKLSAgICB1X2ludDhfdCBubHBpZDsKLSAgICB1X2ludDhfdCBmaXhlZF9sZW47Ci0gICAgdV9pbnQ4X3QgdmVyc2lvbjsJCQkvKiBQcm90b2NvbCB2ZXJzaW9uICovCi0gICAgdV9pbnQ4X3QgaWRfbGVuZ3RoOwotICAgIHVfaW50OF90IHBkdV90eXBlOwkJICAgICAgICAvKiAzIE1TYml0cyBhcmUgcmVzZXJ2ZWQgKi8KLSAgICB1X2ludDhfdCBwZHVfdmVyc2lvbjsJCS8qIFBhY2tldCBmb3JtYXQgdmVyc2lvbiAqLwotICAgIHVfaW50OF90IHJlc2VydmVkOwotICAgIHVfaW50OF90IG1heF9hcmVhOwotfTsKLQotc3RydWN0IGlzaXNfaWloX2xhbl9oZWFkZXIgewotICAgIHVfaW50OF90IGNpcmN1aXRfdHlwZTsKLSAgICB1X2ludDhfdCBzb3VyY2VfaWRbU1lTVEVNX0lEX0xFTl07Ci0gICAgdV9pbnQ4X3QgaG9sZGluZ190aW1lWzJdOwotICAgIHVfaW50OF90IHBkdV9sZW5bMl07Ci0gICAgdV9pbnQ4X3QgcHJpb3JpdHk7Ci0gICAgdV9pbnQ4X3QgbGFuX2lkW05PREVfSURfTEVOXTsKLX07Ci0KLXN0cnVjdCBpc2lzX2lpaF9wdHBfaGVhZGVyIHsKLSAgICB1X2ludDhfdCBjaXJjdWl0X3R5cGU7Ci0gICAgdV9pbnQ4X3Qgc291cmNlX2lkW1NZU1RFTV9JRF9MRU5dOwotICAgIHVfaW50OF90IGhvbGRpbmdfdGltZVsyXTsKLSAgICB1X2ludDhfdCBwZHVfbGVuWzJdOwotICAgIHVfaW50OF90IGNpcmN1aXRfaWQ7Ci19OwotCi1zdHJ1Y3QgaXNpc19sc3BfaGVhZGVyIHsKLSAgICB1X2ludDhfdCBwZHVfbGVuWzJdOwotICAgIHVfaW50OF90IHJlbWFpbmluZ19saWZldGltZVsyXTsKLSAgICB1X2ludDhfdCBsc3BfaWRbTFNQX0lEX0xFTl07Ci0gICAgdV9pbnQ4X3Qgc2VxdWVuY2VfbnVtYmVyWzRdOwotICAgIHVfaW50OF90IGNoZWNrc3VtWzJdOwotICAgIHVfaW50OF90IHR5cGVibG9jazsKLX07Ci0KLXN0cnVjdCBpc2lzX2NzbnBfaGVhZGVyIHsKLSAgICB1X2ludDhfdCBwZHVfbGVuWzJdOwotICAgIHVfaW50OF90IHNvdXJjZV9pZFtOT0RFX0lEX0xFTl07Ci0gICAgdV9pbnQ4X3Qgc3RhcnRfbHNwX2lkW0xTUF9JRF9MRU5dOwotICAgIHVfaW50OF90IGVuZF9sc3BfaWRbTFNQX0lEX0xFTl07Ci19OwotCi1zdHJ1Y3QgaXNpc19wc25wX2hlYWRlciB7Ci0gICAgdV9pbnQ4X3QgcGR1X2xlblsyXTsKLSAgICB1X2ludDhfdCBzb3VyY2VfaWRbTk9ERV9JRF9MRU5dOwotfTsKLQotc3RydWN0IGlzaXNfdGx2X2xzcCB7Ci0gICAgdV9pbnQ4X3QgcmVtYWluaW5nX2xpZmV0aW1lWzJdOwotICAgIHVfaW50OF90IGxzcF9pZFtMU1BfSURfTEVOXTsKLSAgICB1X2ludDhfdCBzZXF1ZW5jZV9udW1iZXJbNF07Ci0gICAgdV9pbnQ4X3QgY2hlY2tzdW1bMl07Ci19OwotCi0jZGVmaW5lIElTSVNfQ09NTU9OX0hFQURFUl9TSVpFIChzaXplb2Yoc3RydWN0IGlzaXNfY29tbW9uX2hlYWRlcikpCi0jZGVmaW5lIElTSVNfSUlIX0xBTl9IRUFERVJfU0laRSAoc2l6ZW9mKHN0cnVjdCBpc2lzX2lpaF9sYW5faGVhZGVyKSkKLSNkZWZpbmUgSVNJU19JSUhfUFRQX0hFQURFUl9TSVpFIChzaXplb2Yoc3RydWN0IGlzaXNfaWloX3B0cF9oZWFkZXIpKQotI2RlZmluZSBJU0lTX0xTUF9IRUFERVJfU0laRSAoc2l6ZW9mKHN0cnVjdCBpc2lzX2xzcF9oZWFkZXIpKQotI2RlZmluZSBJU0lTX0NTTlBfSEVBREVSX1NJWkUgKHNpemVvZihzdHJ1Y3QgaXNpc19jc25wX2hlYWRlcikpCi0jZGVmaW5lIElTSVNfUFNOUF9IRUFERVJfU0laRSAoc2l6ZW9mKHN0cnVjdCBpc2lzX3BzbnBfaGVhZGVyKSkKLQotdm9pZCBpc29jbG5zX3ByaW50KGNvbnN0IHVfaW50OF90ICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbikKLXsKLQljb25zdCBzdHJ1Y3QgaXNpc19jb21tb25faGVhZGVyICpoZWFkZXI7Ci0KLQloZWFkZXIgPSAoY29uc3Qgc3RydWN0IGlzaXNfY29tbW9uX2hlYWRlciAqKXA7Ci0KLSAgICAgICAgaWYgKGNhcGxlbiA8PSAxKSB7IC8qIGVub3VnaCBieXRlcyBvbiB0aGUgd2lyZSA/ICovCi0gICAgICAgICAgICBwcmludGYoInxPU0kiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlZmxhZykKLSAgICAgICAgICAgIHByaW50ZigiT1NJIE5MUElEICVzICgweCUwMngpOiAiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIobmxwaWRfdmFsdWVzLCJVbmtub3duIiwqcCksCi0gICAgICAgICAgICAgICAgICAgKnApOwotICAgICAgICAKLQlzd2l0Y2ggKCpwKSB7Ci0KLQljYXNlIE5MUElEX0NMTlA6Ci0JCWlmICghY2xucF9wcmludChwLCBsZW5ndGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHAsIlxuXHQiLGNhcGxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBOTFBJRF9FU0lTOgotCQllc2lzX3ByaW50KHAsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQotCWNhc2UgTkxQSURfSVNJUzoKLQkJaWYgKCFpc2lzX3ByaW50KHAsIGxlbmd0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocCwiXG5cdCIsY2FwbGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5MUElEX05VTExOUzoKLQkJKHZvaWQpcHJpbnRmKCIlc2xlbmd0aDogJXUiLAotCQkgICAgICAgICAgICAgZWZsYWcgPyAiIiA6ICIsICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0JCWJyZWFrOwotCi0gICAgICAgIGNhc2UgTkxQSURfUTkzMzoKLSAgICAgICAgICAgICAgICBxOTMzX3ByaW50KHArMSwgbGVuZ3RoLTEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTkxQSURfSVA6Ci0JCWlwX3ByaW50KGduZG8sIHArMSwgbGVuZ3RoLTEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0jaWZkZWYgSU5FVDYKLSAgICAgICAgY2FzZSBOTFBJRF9JUDY6Ci0gICAgICAgICAgICAgICAgaXA2X3ByaW50KHArMSwgbGVuZ3RoLTEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICAgICAgY2FzZSBOTFBJRF9QUFA6Ci0gICAgICAgICAgICAgICAgcHBwX3ByaW50KHArMSwgbGVuZ3RoLTEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoIWVmbGFnKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIk9TSSBOTFBJRCAweCUwMnggdW5rbm93biIsKnApOwotCQkodm9pZClwcmludGYoIiVzbGVuZ3RoOiAldSIsCi0JCSAgICAgICAgICAgICBlZmxhZyA/ICIiIDogIiwgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQkJaWYgKGNhcGxlbiA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocCwiXG5cdCIsY2FwbGVuKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0jZGVmaW5lCUNMTlBfUERVX0VSCSAxCi0jZGVmaW5lCUNMTlBfUERVX0RUCTI4Ci0jZGVmaW5lCUNMTlBfUERVX01ECTI5Ci0jZGVmaW5lCUNMTlBfUERVX0VSUQkzMAotI2RlZmluZQlDTE5QX1BEVV9FUlAJMzEKLQotc3RhdGljIHN0cnVjdCB0b2sgY2xucF9wZHVfdmFsdWVzW10gPSB7Ci0gICAgeyBDTE5QX1BEVV9FUiwgICJFcnJvciBSZXBvcnQifSwKLSAgICB7IENMTlBfUERVX01ELCAgIk1EIn0sCi0gICAgeyBDTE5QX1BEVV9EVCwgICJEYXRhIn0sCi0gICAgeyBDTE5QX1BEVV9FUlEsICJFY2hvIFJlcXVlc3QifSwKLSAgICB7IENMTlBfUERVX0VSUCwgIkVjaG8gUmVzcG9uc2UifSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RydWN0IGNsbnBfaGVhZGVyX3QgewotICAgIHVfaW50OF90IG5scGlkOwotICAgIHVfaW50OF90IGxlbmd0aF9pbmRpY2F0b3I7Ci0gICAgdV9pbnQ4X3QgdmVyc2lvbjsKLSAgICB1X2ludDhfdCBsaWZldGltZTsgLyogdW5pdHMgb2YgNTAwbXMgKi8KLSAgICB1X2ludDhfdCB0eXBlOwotICAgIHVfaW50OF90IHNlZ21lbnRfbGVuZ3RoWzJdOwotICAgIHVfaW50OF90IGNrc3VtWzJdOwotfTsKLQotc3RydWN0IGNsbnBfc2VnbWVudF9oZWFkZXJfdCB7Ci0gICAgdV9pbnQ4X3QgZGF0YV91bml0X2lkWzJdOwotICAgIHVfaW50OF90IHNlZ21lbnRfb2Zmc2V0WzJdOwotICAgIHVfaW50OF90IHRvdGFsX2xlbmd0aFsyXTsKLX07Ci0KLS8qCi0gKiBjbG5wX3ByaW50Ci0gKiBEZWNvZGUgQ0xOUCBwYWNrZXRzLiAgUmV0dXJuIDAgb24gZXJyb3IuCi0gKi8KLQotc3RhdGljIGludCBjbG5wX3ByaW50IChjb25zdCB1X2ludDhfdCAqcHB0ciwgdV9pbnQgbGVuZ3RoKQotewotCWNvbnN0IHVfaW50OF90ICpvcHRyLCpzb3VyY2VfYWRkcmVzcywqZGVzdF9hZGRyZXNzOwotICAgICAgICB1X2ludCBsaSx0bGVuLG5zYXBfb2Zmc2V0LHNvdXJjZV9hZGRyZXNzX2xlbmd0aCxkZXN0X2FkZHJlc3NfbGVuZ3RoLCBjbG5wX3BkdV90eXBlLCBjbG5wX2ZsYWdzOwotCWNvbnN0IHN0cnVjdCBjbG5wX2hlYWRlcl90ICpjbG5wX2hlYWRlcjsKLQljb25zdCBzdHJ1Y3QgY2xucF9zZWdtZW50X2hlYWRlcl90ICpjbG5wX3NlZ21lbnRfaGVhZGVyOwotICAgICAgICB1X2ludDhfdCByZmRfZXJyb3JfbWFqb3IscmZkX2Vycm9yX21pbm9yOwotCi0JY2xucF9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGNsbnBfaGVhZGVyX3QgKikgcHB0cjsKLSAgICAgICAgVENIRUNLKCpjbG5wX2hlYWRlcik7Ci0KLSAgICAgICAgbGkgPSBjbG5wX2hlYWRlci0+bGVuZ3RoX2luZGljYXRvcjsKLSAgICAgICAgb3B0ciA9IHBwdHI7Ci0KLSAgICAgICAgaWYgKCFlZmxhZykKLSAgICAgICAgICAgIHByaW50ZigiQ0xOUCIpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoY2xucF9oZWFkZXItPnZlcnNpb24gIT0gQ0xOUF9WRVJTSU9OKSB7Ci0gICAgICAgICAgICBwcmludGYoInZlcnNpb24gJWQgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLCBjbG5wX2hlYWRlci0+dmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRklYTUUgZnVydGhlciBoZWFkZXIgc2FuaXR5IGNoZWNraW5nICovCi0KLSAgICAgICAgY2xucF9wZHVfdHlwZSA9IGNsbnBfaGVhZGVyLT50eXBlICYgQ0xOUF9QRFVfVFlQRV9NQVNLOwotICAgICAgICBjbG5wX2ZsYWdzID0gY2xucF9oZWFkZXItPnR5cGUgJiBDTE5QX0ZMQUdfTUFTSzsKLQotICAgICAgICBwcHRyICs9IHNpemVvZihzdHJ1Y3QgY2xucF9oZWFkZXJfdCk7Ci0gICAgICAgIGxpIC09IHNpemVvZihzdHJ1Y3QgY2xucF9oZWFkZXJfdCk7Ci0gICAgICAgIGRlc3RfYWRkcmVzc19sZW5ndGggPSAqcHB0cjsKLSAgICAgICAgZGVzdF9hZGRyZXNzID0gcHB0ciArIDE7Ci0KLSAgICAgICAgcHB0ciArPSAoMSArIGRlc3RfYWRkcmVzc19sZW5ndGgpOwotICAgICAgICBsaSAtPSAoMSArIGRlc3RfYWRkcmVzc19sZW5ndGgpOwotICAgICAgICBzb3VyY2VfYWRkcmVzc19sZW5ndGggPSAqcHB0cjsKLSAgICAgICAgc291cmNlX2FkZHJlc3MgPSBwcHRyICsxOwotCi0gICAgICAgIHBwdHIgKz0gKDEgKyBzb3VyY2VfYWRkcmVzc19sZW5ndGgpOwotICAgICAgICBsaSAtPSAoMSArIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCk7Ci0KLSAgICAgICAgaWYgKHZmbGFnIDwgMSkgewotICAgICAgICAgICAgcHJpbnRmKCIlcyVzID4gJXMsICVzLCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgIGVmbGFnID8gIiIgOiAiLCAiLAotICAgICAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKHNvdXJjZV9hZGRyZXNzLCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpLAotICAgICAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKGRlc3RfYWRkcmVzcywgZGVzdF9hZGRyZXNzX2xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX3BkdV92YWx1ZXMsInVua25vd24gKCV1KSIsY2xucF9wZHVfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiAoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCIlc2xlbmd0aCAldSIsZWZsYWcgPyAiIiA6ICIsICIsbGVuZ3RoKTsKLQotICAgICAgICBwcmludGYoIlxuXHQlcyBQRFUsIGhsZW46ICV1LCB2OiAldSwgbGlmZXRpbWU6ICV1LiV1cywgU2VnbWVudCBQRFUgbGVuZ3RoOiAldSwgY2hlY2tzdW06IDB4JTA0eCAiLAotICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX3BkdV92YWx1ZXMsICJ1bmtub3duICgldSkiLGNsbnBfcGR1X3R5cGUpLAotICAgICAgICAgICAgICAgY2xucF9oZWFkZXItPmxlbmd0aF9pbmRpY2F0b3IsCi0gICAgICAgICAgICAgICBjbG5wX2hlYWRlci0+dmVyc2lvbiwKLSAgICAgICAgICAgICAgIGNsbnBfaGVhZGVyLT5saWZldGltZS8yLAotICAgICAgICAgICAgICAgKGNsbnBfaGVhZGVyLT5saWZldGltZSUyKSo1LAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoY2xucF9oZWFkZXItPnNlZ21lbnRfbGVuZ3RoKSwKLSAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGNsbnBfaGVhZGVyLT5ja3N1bSkpOwotCi0gICAgICAgIC8qIGRvIG5vdCBhdHRlbXB0IHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0gaWYgaXQgaXMgemVybyAqLwotICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoY2xucF9oZWFkZXItPmNrc3VtKSA9PSAwKQotICAgICAgICAgICAgICAgIHByaW50ZigiKHVudmVyaWZpZWQpIik7Ci0gICAgICAgICAgICBlbHNlIHByaW50ZigiKCVzKSIsIG9zaV9ja3N1bShvcHRyLCBjbG5wX2hlYWRlci0+bGVuZ3RoX2luZGljYXRvcikgPyAiaW5jb3JyZWN0IiA6ICJjb3JyZWN0Iik7Ci0KLSAgICAgICAgcHJpbnRmKCJcblx0RmxhZ3MgWyVzXSIsCi0gICAgICAgICAgICAgICBiaXR0b2syc3RyKGNsbnBfZmxhZ192YWx1ZXMsIm5vbmUiLGNsbnBfZmxhZ3MpKTsKLQotICAgICAgICBwcmludGYoIlxuXHRzb3VyY2UgYWRkcmVzcyAobGVuZ3RoICV1KTogJXNcblx0ZGVzdCAgIGFkZHJlc3MgKGxlbmd0aCAldSk6ICVzIiwKLSAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCwKLSAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKHNvdXJjZV9hZGRyZXNzLCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpLAotICAgICAgICAgICAgICAgZGVzdF9hZGRyZXNzX2xlbmd0aCwKLSAgICAgICAgICAgICAgIGlzb25zYXBfc3RyaW5nKGRlc3RfYWRkcmVzcyxkZXN0X2FkZHJlc3NfbGVuZ3RoKSk7Ci0KLSAgICAgICAgaWYgKGNsbnBfZmxhZ3MgJiBDTE5QX1NFR01FTlRfUEFSVCkgewotICAgICAgICAgICAgCWNsbnBfc2VnbWVudF9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGNsbnBfc2VnbWVudF9oZWFkZXJfdCAqKSBwcHRyOwotICAgICAgICAgICAgICAgIFRDSEVDSygqY2xucF9zZWdtZW50X2hlYWRlcik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0RGF0YSBVbml0IElEOiAweCUwNHgsIFNlZ21lbnQgT2Zmc2V0OiAldSwgVG90YWwgUERVIExlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhjbG5wX3NlZ21lbnRfaGVhZGVyLT5kYXRhX3VuaXRfaWQpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhjbG5wX3NlZ21lbnRfaGVhZGVyLT5zZWdtZW50X29mZnNldCksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGNsbnBfc2VnbWVudF9oZWFkZXItPnRvdGFsX2xlbmd0aCkpOwotICAgICAgICAgICAgICAgIHBwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3QgY2xucF9zZWdtZW50X2hlYWRlcl90KTsKLSAgICAgICAgICAgICAgICBsaS09c2l6ZW9mKGNvbnN0IHN0cnVjdCBjbG5wX3NlZ21lbnRfaGVhZGVyX3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm93IHdhbGsgdGhlIG9wdGlvbnMgKi8KLSAgICAgICAgd2hpbGUgKGxpID49IDIpIHsKLSAgICAgICAgICAgIHVfaW50IG9wLCBvcGxpOwotICAgICAgICAgICAgY29uc3QgdV9pbnQ4X3QgKnRwdHI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsIDIpOwotICAgICAgICAgICAgaWYgKGxpIDwgMikgewotICAgICAgICAgICAgICAgIHByaW50ZigiLCBiYWQgb3B0cy9saSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcCA9ICpwcHRyKys7Ci0gICAgICAgICAgICBvcGxpID0gKnBwdHIrKzsKLSAgICAgICAgICAgIGxpIC09IDI7Ci0gICAgICAgICAgICBUQ0hFQ0syKCpwcHRyLCBvcGxpKTsKLSAgICAgICAgICAgIGlmIChvcGxpID4gbGkpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgb3B0ICglZCkgdG9vIGxvbmciLCBvcCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpIC09IG9wbGk7Ci0gICAgICAgICAgICB0cHRyID0gcHB0cjsKLSAgICAgICAgICAgIHRsZW4gPSBvcGxpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgICVzIE9wdGlvbiAjJXUsIGxlbmd0aCAldSwgdmFsdWU6ICIsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX29wdGlvbl92YWx1ZXMsIlVua25vd24iLG9wKSwKLSAgICAgICAgICAgICAgICAgICBvcCwKLSAgICAgICAgICAgICAgICAgICBvcGxpKTsKLQotICAgICAgICAgICAgc3dpdGNoIChvcCkgewotCi0KLSAgICAgICAgICAgIGNhc2UgQ0xOUF9PUFRJT05fUk9VVEVfUkVDT1JESU5HOiAvKiB0aG9zZSB0d28gb3B0aW9ucyBzaGFyZSB0aGUgZm9ybWF0ICovCi0gICAgICAgICAgICBjYXNlIENMTlBfT1BUSU9OX1NPVVJDRV9ST1VUSU5HOiAgCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX29wdGlvbl9zcl9ycl92YWx1ZXMsIlVua25vd24iLCp0cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2xucF9vcHRpb25fc3JfcnJfc3RyaW5nX3ZhbHVlcywiVW5rbm93biBPcHRpb24gJXUiLG9wKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5zYXBfb2Zmc2V0PSoodHB0cisxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5zYXBfb2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBCYWQgTlNBUCBvZmZzZXQgKDApIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbnNhcF9vZmZzZXQtPTE7IC8qIG9mZnNldCB0byBuc2FwIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5zYXBfb2Zmc2V0ID4gdGxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIEJhZCBOU0FQIG9mZnNldCAocGFzdCBlbmQgb2Ygb3B0aW9uKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRwdHIrPW5zYXBfb2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB0bGVuLT1uc2FwX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3NfbGVuZ3RoPSp0cHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bGVuIDwgc291cmNlX2FkZHJlc3NfbGVuZ3RoKzEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBOU0FQIGFkZHJlc3MgZ29lcyBwYXN0IGVuZCBvZiBvcHRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlX2FkZHJlc3NfbGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3M9KHRwdHIrMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCpzb3VyY2VfYWRkcmVzcywgc291cmNlX2FkZHJlc3NfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBOU0FQIGFkZHJlc3MgKGxlbmd0aCAldSk6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzc19sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcoc291cmNlX2FkZHJlc3MsIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bGVuLT1zb3VyY2VfYWRkcmVzc19sZW5ndGgrMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBDTE5QX09QVElPTl9QUklPUklUWToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUxeCIsICp0cHRyJjB4MGYpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBDTE5QX09QVElPTl9RT1NfTUFJTlRFTkFOQ0U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBGb3JtYXQgQ29kZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihjbG5wX29wdGlvbl9zY29wZV92YWx1ZXMsIlJlc2VydmVkIiwqdHB0ciZDTE5QX09QVElPTl9TQ09QRV9NQVNLKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgqdHB0ciZDTE5QX09QVElPTl9TQ09QRV9NQVNLKSA9PSBDTE5QX09QVElPTl9TQ09QRV9HTE9CQUwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFFvUyBGbGFncyBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihjbG5wX29wdGlvbl9xb3NfZ2xvYmFsX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRwdHImQ0xOUF9PUFRJT05fT1BUSU9OX1FPU19NQVNLKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENMTlBfT1BUSU9OX1NFQ1VSSVRZOgotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgRm9ybWF0IENvZGU6ICVzLCBTZWN1cml0eS1MZXZlbCAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfb3B0aW9uX3Njb3BlX3ZhbHVlcywiUmVzZXJ2ZWQiLCp0cHRyJkNMTlBfT1BUSU9OX1NDT1BFX01BU0spLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cHRyKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgQ0xOUF9PUFRJT05fRElTQ0FSRF9SRUFTT046Ci0gICAgICAgICAgICAgICAgcmZkX2Vycm9yX21ham9yID0gKCp0cHRyJjB4ZjApID4+IDQ7Ci0gICAgICAgICAgICAgICAgcmZkX2Vycm9yX21pbm9yID0gKnRwdHImMHgwZjsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQ2xhc3M6ICVzIEVycm9yICgweCUwMXgpLCAlcyAoMHglMDF4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoY2xucF9vcHRpb25fcmZkX2NsYXNzX3ZhbHVlcywiVW5rbm93biIscmZkX2Vycm9yX21ham9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcmZkX2Vycm9yX21ham9yLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGNsbnBfb3B0aW9uX3JmZF9lcnJvcl9jbGFzc1tyZmRfZXJyb3JfbWFqb3JdLCJVbmtub3duIixyZmRfZXJyb3JfbWlub3IpLAotICAgICAgICAgICAgICAgICAgICAgICByZmRfZXJyb3JfbWlub3IpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIENMTlBfT1BUSU9OX1BBRERJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigicGFkZGluZyBkYXRhIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBPcHRpb25zIHRoYXQgbGFjayBhIGRlY29kZXIKLSAgICAgICAgICAgICAgICAgKiB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQotICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAiLG9wbGkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZmbGFnID4gMSkKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixvcGxpKTsKLSAgICAgICAgICAgIHBwdHIgKz0gb3BsaTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoY2xucF9wZHVfdHlwZSkgewotCi0gICAgICAgIGNhc2UgICAgQ0xOUF9QRFVfRVI6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlIAlDTE5QX1BEVV9FUlA6Ci0gICAgICAgICAgICBUQ0hFQ0soKnBwdHIpOwotICAgICAgICAgICAgaWYgKCoocHB0cikgPT0gTkxQSURfQ0xOUCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdC0tLS0tb3JpZ2luYWwgcGFja2V0LS0tLS1cblx0Iik7Ci0gICAgICAgICAgICAgICAgLyogRklYTUUgcmVjdXJzaW9uIHByb3RlY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBjbG5wX3ByaW50KHBwdHIsIGxlbmd0aC1jbG5wX2hlYWRlci0+bGVuZ3RoX2luZGljYXRvcik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IAotCi0gICAgICAgIGNhc2UgCUNMTlBfUERVX0RUOgotICAgICAgICBjYXNlIAlDTE5QX1BEVV9NRDoKLSAgICAgICAgY2FzZSAJQ0xOUF9QRFVfRVJROgotICAgICAgICAgICAgCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBkdW1wIHRoZSBQRFUgc3BlY2lmaWMgZGF0YSAqLwotICAgICAgICAgICAgaWYgKGxlbmd0aC0ocHB0ci1vcHRyKSA+IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIHVuZGVjb2RlZCBub24taGVhZGVyIGRhdGEsIGxlbmd0aCAldSIsbGVuZ3RoLWNsbnBfaGVhZGVyLT5sZW5ndGhfaW5kaWNhdG9yKTsKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixsZW5ndGgtKHBwdHItb3B0cikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuICgxKTsKLQotIHRydW5jOgotICAgIGZwdXRzKCJbfGNsbnBdIiwgc3Rkb3V0KTsKLSAgICByZXR1cm4gKDEpOwotCi19Ci0KLQotI2RlZmluZQlFU0lTX1BEVV9SRURJUkVDVAk2Ci0jZGVmaW5lCUVTSVNfUERVX0VTSAkgICAgICAgIDIKLSNkZWZpbmUJRVNJU19QRFVfSVNICSAgICAgICAgNAotCi1zdGF0aWMgc3RydWN0IHRvayBlc2lzX3BkdV92YWx1ZXNbXSA9IHsKLSAgICB7IEVTSVNfUERVX1JFRElSRUNULCAicmVkaXJlY3QifSwKLSAgICB7IEVTSVNfUERVX0VTSCwgICAgICAiRVNIIn0sCi0gICAgeyBFU0lTX1BEVV9JU0gsICAgICAgIklTSCJ9LAotICAgIHsgMCwgTlVMTCB9Ci19OwotCi1zdHJ1Y3QgZXNpc19oZWFkZXJfdCB7Ci0JdV9pbnQ4X3QgbmxwaWQ7Ci0JdV9pbnQ4X3QgbGVuZ3RoX2luZGljYXRvcjsKLQl1X2ludDhfdCB2ZXJzaW9uOwotCXVfaW50OF90IHJlc2VydmVkOwotCXVfaW50OF90IHR5cGU7Ci0JdV9pbnQ4X3QgaG9sZHRpbWVbMl07Ci0JdV9pbnQ4X3QgY2tzdW1bMl07Ci19OwotCi1zdGF0aWMgdm9pZAotZXNpc19wcmludChjb25zdCB1X2ludDhfdCAqcHB0ciwgdV9pbnQgbGVuZ3RoKQotewotCWNvbnN0IHVfaW50OF90ICpvcHRyOwotCXVfaW50IGxpLGVzaXNfcGR1X3R5cGUsc291cmNlX2FkZHJlc3NfbGVuZ3RoLCBzb3VyY2VfYWRkcmVzc19udW1iZXI7Ci0JY29uc3Qgc3RydWN0IGVzaXNfaGVhZGVyX3QgKmVzaXNfaGVhZGVyOwotCi0gICAgICAgIGlmICghZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIkVTLUlTIik7Ci0KLQlpZiAobGVuZ3RoIDw9IDIpIHsKLQkJaWYgKHFmbGFnKQotCQkJcHJpbnRmKCJiYWQgcGt0ISIpOwotCQllbHNlCi0JCQlwcmludGYoIm5vIGhlYWRlciBhdCBhbGwhIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllc2lzX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgZXNpc19oZWFkZXJfdCAqKSBwcHRyOwotICAgICAgICBUQ0hFQ0soKmVzaXNfaGVhZGVyKTsKLSAgICAgICAgbGkgPSBlc2lzX2hlYWRlci0+bGVuZ3RoX2luZGljYXRvcjsKLSAgICAgICAgb3B0ciA9IHBwdHI7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmIChlc2lzX2hlYWRlci0+bmxwaWQgIT0gTkxQSURfRVNJUykgewotICAgICAgICAgICAgcHJpbnRmKCIgbmxwaWQgMHglMDJ4IHBhY2tldCBub3Qgc3VwcG9ydGVkIiwgZXNpc19oZWFkZXItPm5scGlkKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlc2lzX2hlYWRlci0+dmVyc2lvbiAhPSBFU0lTX1ZFUlNJT04pIHsKLSAgICAgICAgICAgIHByaW50ZigiIHZlcnNpb24gJWQgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLCBlc2lzX2hlYWRlci0+dmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLQlpZiAobGkgPiBsZW5ndGgpIHsKLSAgICAgICAgICAgIHByaW50ZigiIGxlbmd0aCBpbmRpY2F0b3IoJWQpID4gUERVIHNpemUgKCVkKSEiLCBsaSwgbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybjsKLQl9Ci0KLQlpZiAobGkgPCBzaXplb2Yoc3RydWN0IGVzaXNfaGVhZGVyX3QpICsgMikgewotICAgICAgICAgICAgcHJpbnRmKCIgbGVuZ3RoIGluZGljYXRvciA8IG1pbiBQRFUgc2l6ZSAlZDoiLCBsaSk7Ci0gICAgICAgICAgICB3aGlsZSAoLS1sZW5ndGggIT0gMCkKLSAgICAgICAgICAgICAgICBwcmludGYoIiUwMlgiLCAqcHB0cisrKTsKLSAgICAgICAgICAgIHJldHVybjsKLQl9Ci0KLSAgICAgICAgZXNpc19wZHVfdHlwZSA9IGVzaXNfaGVhZGVyLT50eXBlICYgRVNJU19QRFVfVFlQRV9NQVNLOwotCi0gICAgICAgIGlmICh2ZmxhZyA8IDEpIHsKLSAgICAgICAgICAgIHByaW50ZigiJXMlcywgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgICBlZmxhZyA/ICIiIDogIiwgIiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGVzaXNfcGR1X3ZhbHVlcywidW5rbm93biB0eXBlICgldSkiLGVzaXNfcGR1X3R5cGUpLAotICAgICAgICAgICAgICAgICAgIGxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcHJpbnRmKCIlc2xlbmd0aCAldVxuXHQlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICBlZmxhZyA/ICIiIDogIiwgIiwKLSAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihlc2lzX3BkdV92YWx1ZXMsInVua25vd24gdHlwZTogJXUiLCBlc2lzX3BkdV90eXBlKSwKLSAgICAgICAgICAgICAgICAgICBlc2lzX3BkdV90eXBlKTsKLQotICAgICAgICBwcmludGYoIiwgdjogJXUlcyIsIGVzaXNfaGVhZGVyLT52ZXJzaW9uLCBlc2lzX2hlYWRlci0+dmVyc2lvbiA9PSBFU0lTX1ZFUlNJT04gPyAiIiA6ICJ1bnN1cHBvcnRlZCIgKTsKLSAgICAgICAgcHJpbnRmKCIsIGNoZWNrc3VtOiAweCUwNHggIiwgRVhUUkFDVF8xNkJJVFMoZXNpc19oZWFkZXItPmNrc3VtKSk7Ci0gICAgICAgIC8qIGRvIG5vdCBhdHRlbXB0IHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0gaWYgaXQgaXMgemVybyAqLwotICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoZXNpc19oZWFkZXItPmNrc3VtKSA9PSAwKQotICAgICAgICAgICAgICAgIHByaW50ZigiKHVudmVyaWZpZWQpIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIiglcykiLCBvc2lfY2tzdW0ocHB0ciwgbGkpID8gImluY29ycmVjdCIgOiAiY29ycmVjdCIpOwotCi0gICAgICAgIHByaW50ZigiLCBob2xkaW5nIHRpbWU6ICV1cywgbGVuZ3RoIGluZGljYXRvcjogJXUiLEVYVFJBQ1RfMTZCSVRTKGVzaXNfaGVhZGVyLT5ob2xkdGltZSksbGkpOwotCi0gICAgICAgIGlmICh2ZmxhZyA+IDEpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEob3B0ciwiXG5cdCIsc2l6ZW9mKHN0cnVjdCBlc2lzX2hlYWRlcl90KSk7Ci0KLQlwcHRyICs9IHNpemVvZihzdHJ1Y3QgZXNpc19oZWFkZXJfdCk7Ci0JbGkgLT0gc2l6ZW9mKHN0cnVjdCBlc2lzX2hlYWRlcl90KTsKLQotCXN3aXRjaCAoZXNpc19wZHVfdHlwZSkgewotCWNhc2UgRVNJU19QRFVfUkVESVJFQ1Q6IHsKLQkJY29uc3QgdV9pbnQ4X3QgKmRzdCwgKnNucGEsICpuZXRhOwotCQl1X2ludCBkc3RsLCBzbnBhbCwgbmV0YWw7Ci0KLQkJVENIRUNLKCpwcHRyKTsKLQkJaWYgKGxpIDwgMSkgewotCQkJcHJpbnRmKCIsIGJhZCByZWRpcmVjdC9saSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRzdGwgPSAqcHB0cjsKLQkJcHB0cisrOwotCQlsaS0tOwotCQlUQ0hFQ0syKCpwcHRyLCBkc3RsKTsKLQkJaWYgKGxpIDwgZHN0bCkgewotCQkJcHJpbnRmKCIsIGJhZCByZWRpcmVjdC9saSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWRzdCA9IHBwdHI7Ci0JCXBwdHIgKz0gZHN0bDsKLSAgICAgICAgICAgICAgICBsaSAtPSBkc3RsOwotCQlwcmludGYoIlxuXHQgICVzIiwgaXNvbnNhcF9zdHJpbmcoZHN0LGRzdGwpKTsKLQotCQlUQ0hFQ0soKnBwdHIpOwotCQlpZiAobGkgPCAxKSB7Ci0JCQlwcmludGYoIiwgYmFkIHJlZGlyZWN0L2xpIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc25wYWwgPSAqcHB0cjsKLQkJcHB0cisrOwotCQlsaS0tOwotCQlUQ0hFQ0syKCpwcHRyLCBzbnBhbCk7Ci0JCWlmIChsaSA8IHNucGFsKSB7Ci0JCQlwcmludGYoIiwgYmFkIHJlZGlyZWN0L2xpIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc25wYSA9IHBwdHI7Ci0JCXBwdHIgKz0gc25wYWw7Ci0gICAgICAgICAgICAgICAgbGkgLT0gc25wYWw7Ci0JCVRDSEVDSygqcHB0cik7Ci0JCWlmIChsaSA8IDEpIHsKLQkJCXByaW50ZigiLCBiYWQgcmVkaXJlY3QvbGkiKTsKLQkJCXJldHVybjsKLQkJfQotCQluZXRhbCA9ICpwcHRyOwotCQlwcHRyKys7Ci0JCVRDSEVDSzIoKnBwdHIsIG5ldGFsKTsKLQkJaWYgKGxpIDwgbmV0YWwpIHsKLQkJCXByaW50ZigiLCBiYWQgcmVkaXJlY3QvbGkiKTsKLQkJCXJldHVybjsKLQkJfQotCQluZXRhID0gcHB0cjsKLQkJcHB0ciArPSBuZXRhbDsKLSAgICAgICAgICAgICAgICBsaSAtPSBuZXRhbDsKLQotCQlpZiAobmV0YWwgPT0gMCkKLQkJCXByaW50ZigiXG5cdCAgJXMiLCBldGhlcmFkZHJfc3RyaW5nKHNucGEpKTsKLQkJZWxzZQotCQkJcHJpbnRmKCJcblx0ICAlcyIsIGlzb25zYXBfc3RyaW5nKG5ldGEsbmV0YWwpKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBFU0lTX1BEVV9FU0g6Ci0gICAgICAgICAgICBUQ0hFQ0soKnBwdHIpOwotICAgICAgICAgICAgaWYgKGxpIDwgMSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiLCBiYWQgZXNoL2xpIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc291cmNlX2FkZHJlc3NfbnVtYmVyID0gKnBwdHI7Ci0gICAgICAgICAgICBwcHRyKys7Ci0gICAgICAgICAgICBsaS0tOwotCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgIE51bWJlciBvZiBTb3VyY2UgQWRkcmVzc2VzOiAldSIsIHNvdXJjZV9hZGRyZXNzX251bWJlcik7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgd2hpbGUgKHNvdXJjZV9hZGRyZXNzX251bWJlciA+IDApIHsKLSAgICAgICAgICAgICAgICBUQ0hFQ0soKnBwdHIpOwotICAgICAgICAgICAgCWlmIChsaSA8IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIGJhZCBlc2gvbGkiKTsKLSAgICAgICAgICAgIAkgICAgcmV0dXJuOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzc19sZW5ndGggPSAqcHB0cjsKLSAgICAgICAgICAgICAgICBwcHRyKys7Ci0gICAgICAgICAgICAJbGktLTsKLQotICAgICAgICAgICAgICAgIFRDSEVDSzIoKnBwdHIsIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCk7Ci0gICAgICAgICAgICAJaWYgKGxpIDwgc291cmNlX2FkZHJlc3NfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBiYWQgZXNoL2xpIik7Ci0gICAgICAgICAgICAJICAgIHJldHVybjsKLSAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBORVQgKGxlbmd0aDogJXUpOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcocHB0cixzb3VyY2VfYWRkcmVzc19sZW5ndGgpKTsKLSAgICAgICAgICAgICAgICBwcHRyICs9IHNvdXJjZV9hZGRyZXNzX2xlbmd0aDsKLSAgICAgICAgICAgICAgICBsaSAtPSBzb3VyY2VfYWRkcmVzc19sZW5ndGg7Ci0gICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3NfbnVtYmVyLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0JY2FzZSBFU0lTX1BEVV9JU0g6IHsKLSAgICAgICAgICAgIFRDSEVDSygqcHB0cik7Ci0gICAgICAgICAgICBpZiAobGkgPCAxKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIsIGJhZCBpc2gvbGkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3VyY2VfYWRkcmVzc19sZW5ndGggPSAqcHB0cjsKLSAgICAgICAgICAgIHBwdHIrKzsKLSAgICAgICAgICAgIGxpLS07Ci0gICAgICAgICAgICBUQ0hFQ0syKCpwcHRyLCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpOwotICAgICAgICAgICAgaWYgKGxpIDwgc291cmNlX2FkZHJlc3NfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIsIGJhZCBpc2gvbGkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgIE5FVCAobGVuZ3RoOiAldSk6ICVzIiwgc291cmNlX2FkZHJlc3NfbGVuZ3RoLCBpc29uc2FwX3N0cmluZyhwcHRyLCBzb3VyY2VfYWRkcmVzc19sZW5ndGgpKTsKLSAgICAgICAgICAgIHBwdHIgKz0gc291cmNlX2FkZHJlc3NfbGVuZ3RoOwotICAgICAgICAgICAgbGkgLT0gc291cmNlX2FkZHJlc3NfbGVuZ3RoOwotICAgICAgICAgICAgYnJlYWs7Ci0JfQotCi0JZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKSB7Ci0JCSAgICBpZiAocHB0ciA8IHNuYXBlbmQpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLHNuYXBlbmQtcHB0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0JfQotCi0gICAgICAgIC8qIG5vdyB3YWxrIHRoZSBvcHRpb25zICovCi0gICAgICAgIHdoaWxlIChsaSA+PSAyKSB7Ci0gICAgICAgICAgICB1X2ludCBvcCwgb3BsaTsKLSAgICAgICAgICAgIGNvbnN0IHVfaW50OF90ICp0cHRyOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBUQ0hFQ0syKCpwcHRyLCAyKTsKLSAgICAgICAgICAgIGlmIChsaSA8IDIpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgYmFkIG9wdHMvbGkiKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcCA9ICpwcHRyKys7Ci0gICAgICAgICAgICBvcGxpID0gKnBwdHIrKzsKLSAgICAgICAgICAgIGxpIC09IDI7Ci0gICAgICAgICAgICBpZiAob3BsaSA+IGxpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIsIG9wdCAoJWQpIHRvbyBsb25nIiwgb3ApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxpIC09IG9wbGk7Ci0gICAgICAgICAgICB0cHRyID0gcHB0cjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBPcHRpb24gIyV1LCBsZW5ndGggJXUsIHZhbHVlOiAiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXNpc19vcHRpb25fdmFsdWVzLCJVbmtub3duIixvcCksCi0gICAgICAgICAgICAgICAgICAgb3AsCi0gICAgICAgICAgICAgICAgICAgb3BsaSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKLQotICAgICAgICAgICAgY2FzZSBFU0lTX09QVElPTl9FU19DT05GX1RJTUU6Ci0gICAgICAgICAgICAgICAgVENIRUNLMigqcHB0ciwgMik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIldXMiLCBFWFRSQUNUXzE2QklUUyh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgRVNJU19PUFRJT05fUFJPVE9DT0xTOgotICAgICAgICAgICAgICAgIHdoaWxlIChvcGxpPjApIHsKLSAgICAgICAgICAgICAgICAgICAgVENIRUNLKCpwcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAoMHglMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKG5scGlkX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcGxpPjEpIC8qIGZ1cnRoZXIgTlBMSURzID8gLSBwdXQgY29tbWEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgdHB0cisrOwotICAgICAgICAgICAgICAgICAgICBvcGxpLS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgT3B0aW9ucyB0aGF0IGxhY2sgYSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgICogeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKLSAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgY2FzZSBFU0lTX09QVElPTl9RT1NfTUFJTlRFTkFOQ0U6Ci0gICAgICAgICAgICBjYXNlIEVTSVNfT1BUSU9OX1NFQ1VSSVRZOgotICAgICAgICAgICAgY2FzZSBFU0lTX09QVElPTl9QUklPUklUWToKLSAgICAgICAgICAgIGNhc2UgRVNJU19PUFRJT05fQUREUkVTU19NQVNLOgotICAgICAgICAgICAgY2FzZSBFU0lTX09QVElPTl9TTlBBX01BU0s6Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICIsb3BsaSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmZsYWcgPiAxKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0ICAiLG9wbGkpOwotICAgICAgICAgICAgcHB0ciArPSBvcGxpOwotICAgICAgICB9Ci10cnVuYzoKLQlyZXR1cm47Ci19ICAgCi0KLS8qIHNoYXJlZCByb3V0aW5lIGZvciBwcmludGluZyBzeXN0ZW0sIG5vZGUgYW5kIGxzcC1pZHMgKi8KLXN0YXRpYyBjaGFyICoKLWlzaXNfcHJpbnRfaWQoY29uc3QgdV9pbnQ4X3QgKmNwLCBpbnQgaWRfbGVuKQotewotICAgIGludCBpOwotICAgIHN0YXRpYyBjaGFyIGlkW3NpemVvZigieHh4eC54eHh4Lnh4eHgueXktenoiKV07Ci0gICAgY2hhciAqcG9zID0gaWQ7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDw9IFNZU1RFTV9JRF9MRU47IGkrKykgewotICAgICAgICBzbnByaW50Zihwb3MsIHNpemVvZihpZCkgLSAocG9zIC0gaWQpLCAiJTAyeCIsICpjcCsrKTsKLQlwb3MgKz0gc3RybGVuKHBvcyk7Ci0JaWYgKGkgPT0gMiB8fCBpID09IDQpCi0JICAgICpwb3MrKyA9ICcuJzsKLQl9Ci0gICAgaWYgKGlkX2xlbiA+PSBOT0RFX0lEX0xFTikgewotICAgICAgICBzbnByaW50Zihwb3MsIHNpemVvZihpZCkgLSAocG9zIC0gaWQpLCAiLiUwMngiLCAqY3ArKyk7Ci0JcG9zICs9IHN0cmxlbihwb3MpOwotICAgIH0KLSAgICBpZiAoaWRfbGVuID09IExTUF9JRF9MRU4pCi0gICAgICAgIHNucHJpbnRmKHBvcywgc2l6ZW9mKGlkKSAtIChwb3MgLSBpZCksICItJTAyeCIsICpjcCk7Ci0gICAgcmV0dXJuIChpZCk7Ci19Ci0KLS8qIHByaW50IHRoZSA0LWJ5dGUgbWV0cmljIGJsb2NrIHdoaWNoIGlzIGNvbW1vbiBmb3VuZCBpbiB0aGUgb2xkLXN0eWxlIFRMVnMgKi8KLXN0YXRpYyBpbnQKLWlzaXNfcHJpbnRfbWV0cmljX2Jsb2NrIChjb25zdCBzdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2sgKmlzaXNfbWV0cmljX2Jsb2NrKQotewotICAgIHByaW50ZigiLCBEZWZhdWx0IE1ldHJpYzogJWQsICVzIiwKLSAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19WQUxVRShpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2RlZmF1bHQpLAotICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZGVmYXVsdCkgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7Ci0gICAgaWYgKCFJU0lTX0xTUF9UTFZfTUVUUklDX1NVUFBPUlRFRChpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2RlbGF5KSkKLSAgICAgICAgcHJpbnRmKCJcblx0XHQgIERlbGF5IE1ldHJpYzogJWQsICVzIiwKLSAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfVkFMVUUoaXNpc19tZXRyaWNfYmxvY2stPm1ldHJpY19kZWxheSksCi0gICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZGVsYXkpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIpOwotICAgIGlmICghSVNJU19MU1BfVExWX01FVFJJQ19TVVBQT1JURUQoaXNpc19tZXRyaWNfYmxvY2stPm1ldHJpY19leHBlbnNlKSkKLSAgICAgICAgcHJpbnRmKCJcblx0XHQgIEV4cGVuc2UgTWV0cmljOiAlZCwgJXMiLAotICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19WQUxVRShpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2V4cGVuc2UpLAotICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19JRShpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2V4cGVuc2UpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIpOwotICAgIGlmICghSVNJU19MU1BfVExWX01FVFJJQ19TVVBQT1JURUQoaXNpc19tZXRyaWNfYmxvY2stPm1ldHJpY19lcnJvcikpCi0gICAgICAgIHByaW50ZigiXG5cdFx0ICBFcnJvciBNZXRyaWM6ICVkLCAlcyIsCi0gICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX1ZBTFVFKGlzaXNfbWV0cmljX2Jsb2NrLT5tZXRyaWNfZXJyb3IpLAotICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19JRShpc2lzX21ldHJpY19ibG9jay0+bWV0cmljX2Vycm9yKSA/ICJFeHRlcm5hbCIgOiAiSW50ZXJuYWwiKTsKLQotICAgIHJldHVybigxKTsgLyogZXZlcnl0aGluZyBpcyBvayAqLwotfQotCi1zdGF0aWMgaW50Ci1pc2lzX3ByaW50X3Rsdl9pcF9yZWFjaCAoY29uc3QgdV9pbnQ4X3QgKmNwLCBjb25zdCBjaGFyICppZGVudCwgaW50IGxlbmd0aCkKLXsKLQlpbnQgcHJlZml4X2xlbjsKLQljb25zdCBzdHJ1Y3QgaXNpc190bHZfaXBfcmVhY2ggKnRsdl9pcF9yZWFjaDsKLQotCXRsdl9pcF9yZWFjaCA9IChjb25zdCBzdHJ1Y3QgaXNpc190bHZfaXBfcmVhY2ggKiljcDsKLQotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCWlmICgoc2l6ZV90KWxlbmd0aCA8IHNpemVvZigqdGx2X2lwX3JlYWNoKSkgewotCQkJcHJpbnRmKCJzaG9ydCBJUHY0IFJlYWNoYWJpbGl0eSAoJWQgdnMgJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXNpemVvZigqdGx2X2lwX3JlYWNoKSk7Ci0JCQlyZXR1cm4gKDApOwotCQl9Ci0KLQkJaWYgKCFUVEVTVCgqdGx2X2lwX3JlYWNoKSkKLQkJICAgIHJldHVybiAoMCk7Ci0KLQkJcHJlZml4X2xlbiA9IG1hc2sycGxlbihFWFRSQUNUXzMyQklUUyh0bHZfaXBfcmVhY2gtPm1hc2spKTsKLQotCQlpZiAocHJlZml4X2xlbiA9PSAtMSkKLQkJCXByaW50ZigiJXNJUHY0IHByZWZpeDogJXMgbWFzayAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0JCQkgICAgICAgaXBhZGRyX3N0cmluZygodGx2X2lwX3JlYWNoLT5wcmVmaXgpKSwKLQkJCSAgICAgICBpcGFkZHJfc3RyaW5nKCh0bHZfaXBfcmVhY2gtPm1hc2spKSk7Ci0JCWVsc2UKLQkJCXByaW50ZigiJXNJUHY0IHByZWZpeDogJTE1cy8ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0JCQkgICAgICAgaXBhZGRyX3N0cmluZygodGx2X2lwX3JlYWNoLT5wcmVmaXgpKSwKLQkJCSAgICAgICBwcmVmaXhfbGVuKTsKLQotCQlwcmludGYoIiwgRGlzdHJpYnV0aW9uOiAlcywgTWV0cmljOiAldSwgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX1VQRE9XTih0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19kZWZhdWx0KSA/ICJkb3duIiA6ICJ1cCIsCi0gICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfVkFMVUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZGVmYXVsdCksCi0gICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfSUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZGVmYXVsdCkgPyAiRXh0ZXJuYWwiIDogIkludGVybmFsIik7Ci0KLQkJaWYgKCFJU0lTX0xTUF9UTFZfTUVUUklDX1NVUFBPUlRFRCh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19kZWxheSkpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIERlbGF5IE1ldHJpYzogJXUsICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNJU19MU1BfVExWX01FVFJJQ19WQUxVRSh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19kZWxheSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2RlbGF5KSA/ICJFeHRlcm5hbCIgOiAiSW50ZXJuYWwiKTsKLSAgICAgICAgICAgICAgICAKLQkJaWYgKCFJU0lTX0xTUF9UTFZfTUVUUklDX1NVUFBPUlRFRCh0bHZfaXBfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrLm1ldHJpY19leHBlbnNlKSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRXhwZW5zZSBNZXRyaWM6ICV1LCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfVkFMVUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZXhwZW5zZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX0lFKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2V4cGVuc2UpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIpOwotICAgICAgICAgICAgICAgIAotCQlpZiAoIUlTSVNfTFNQX1RMVl9NRVRSSUNfU1VQUE9SVEVEKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2Vycm9yKSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRXJyb3IgTWV0cmljOiAldSwgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJU0lTX0xTUF9UTFZfTUVUUklDX1ZBTFVFKHRsdl9pcF9yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2subWV0cmljX2Vycm9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElTSVNfTFNQX1RMVl9NRVRSSUNfSUUodGx2X2lwX3JlYWNoLT5pc2lzX21ldHJpY19ibG9jay5tZXRyaWNfZXJyb3IpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIpOwotCi0JCWxlbmd0aCAtPSBzaXplb2Yoc3RydWN0IGlzaXNfdGx2X2lwX3JlYWNoKTsKLQkJdGx2X2lwX3JlYWNoKys7Ci0JfQotCXJldHVybiAoMSk7Ci19Ci0KLS8qCi0gKiB0aGlzIGlzIHRoZSBjb21tb24gSVAtUkVBQ0ggc3ViVExWIGRlY29kZXIgaXQgaXMgY2FsbGVkCi0gKiBmcm9tIHZhcmlvdXMgRVhURC1JUCBSRUFDSCBUTFZzICgxMzUsMjM1LDIzNiwyMzcpCi0gKi8KLQotc3RhdGljIGludAotaXNpc19wcmludF9pcF9yZWFjaF9zdWJ0bHYgKGNvbnN0IHVfaW50OF90ICp0cHRyLGludCBzdWJ0LGludCBzdWJsLGNvbnN0IGNoYXIgKmlkZW50KSB7Ci0KLSAgICAgICAgLyogZmlyc3QgbGV0cyBzZWUgaWYgd2Uga25vdyB0aGUgc3ViVExWcyBuYW1lKi8KLQlwcmludGYoIiVzJXMgc3ViVExWICMldSwgbGVuZ3RoOiAldSIsCi0JICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgdG9rMnN0cihpc2lzX2V4dF9pcF9yZWFjaF9zdWJ0bHZfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN1YnQpLAotICAgICAgICAgICAgICAgc3VidCwKLSAgICAgICAgICAgICAgIHN1YmwpOwotCi0JaWYgKCFUVEVTVDIoKnRwdHIsc3VibCkpCi0JICAgIGdvdG8gdHJ1bmN0bHY7Ci0KLSAgICBzd2l0Y2goc3VidCkgewotICAgIGNhc2UgSVNJU19TVUJUTFZfRVhURF9JUF9SRUFDSF9NR01UX1BSRUZJWF9DT0xPUjogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBJU0lTX1NVQlRMVl9FWFREX0lQX1JFQUNIX0FETUlOX1RBRzMyOgotICAgICAgICB3aGlsZSAoc3VibCA+PSA0KSB7Ci0JICAgIHByaW50ZigiLCAweCUwOHggKD0ldSkiLAotCQkgICBFWFRSQUNUXzMyQklUUyh0cHRyKSwKLQkJICAgRVhUUkFDVF8zMkJJVFModHB0cikpOwotCSAgICB0cHRyKz00OwotCSAgICBzdWJsLT00OwotCX0KLQlicmVhazsKLSAgICBjYXNlIElTSVNfU1VCVExWX0VYVERfSVBfUkVBQ0hfQURNSU5fVEFHNjQ6Ci0gICAgICAgIHdoaWxlIChzdWJsID49IDgpIHsKLQkgICAgcHJpbnRmKCIsIDB4JTA4eCUwOHgiLAotCQkgICBFWFRSQUNUXzMyQklUUyh0cHRyKSwKLQkJICAgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7Ci0JICAgIHRwdHIrPTg7Ci0JICAgIHN1YmwtPTg7Ci0JfQotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0JaWYoIXByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0XHQgICAgIiwKLQkJCSAgICAgICBzdWJsKSkKLQkgIHJldHVybigwKTsKLQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuKDEpOwotCQotdHJ1bmN0bHY6Ci0gICAgcHJpbnRmKCIlc3BhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIsaWRlbnQpOwotICAgIHJldHVybigwKTsKLX0KLQotLyoKLSAqIHRoaXMgaXMgdGhlIGNvbW1vbiBJUy1SRUFDSCBzdWJUTFYgZGVjb2RlciBpdCBpcyBjYWxsZWQKLSAqIGZyb20gaXNpc19wcmludF9leHRfaXNfcmVhY2goKQotICovCi0KLXN0YXRpYyBpbnQKLWlzaXNfcHJpbnRfaXNfcmVhY2hfc3VidGx2IChjb25zdCB1X2ludDhfdCAqdHB0cix1X2ludCBzdWJ0LHVfaW50IHN1YmwsY29uc3QgY2hhciAqaWRlbnQpIHsKLQotICAgICAgICB1X2ludCB0ZV9jbGFzcyxwcmlvcml0eV9sZXZlbDsKLSAgICAgICAgdW5pb24geyAvKiBpbnQgdG8gZmxvYXQgY29udmVyc2lvbiBidWZmZXIgZm9yIHNldmVyYWwgc3ViVExWcyAqLwotICAgICAgICAgICAgZmxvYXQgZjsgCi0gICAgICAgICAgICB1X2ludDMyX3QgaTsKLSAgICAgICAgfSBidzsKLQotICAgICAgICAvKiBmaXJzdCBsZXRzIHNlZSBpZiB3ZSBrbm93IHRoZSBzdWJUTFZzIG5hbWUqLwotCXByaW50ZigiJXMlcyBzdWJUTFYgIyV1LCBsZW5ndGg6ICV1IiwKLQkgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfZXh0X2lzX3JlYWNoX3N1YnRsdl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3VidCksCi0gICAgICAgICAgICAgICBzdWJ0LAotICAgICAgICAgICAgICAgc3VibCk7Ci0KLQlpZiAoIVRURVNUMigqdHB0cixzdWJsKSkKLQkgICAgZ290byB0cnVuY3RsdjsKLQotICAgICAgICBzd2l0Y2goc3VidCkgewotICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9BRE1JTl9HUk9VUDogICAgICAKLSAgICAgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTElOS19MT0NBTF9SRU1PVEVfSUQ6Ci0gICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX0xJTktfUkVNT1RFX0lEOgotCSAgICBpZiAoc3VibCA+PSA0KSB7Ci0JICAgICAgcHJpbnRmKCIsIDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKLQkgICAgICBpZiAoc3VibCA9PSA4KSAvKiBkcmFmdC1pZXRmLWlzaXMtZ21wbHMtZXh0ZW5zaW9ucyAqLwotCSAgICAgICAgcHJpbnRmKCIsIDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCkpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9JUFY0X0lOVEZfQUREUjoKLSAgICAgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfSVBWNF9ORUlHSEJPUl9BRERSOgotICAgICAgICAgICAgaWYgKHN1YmwgPj0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkKLSAgICAgICAgICAgICAgcHJpbnRmKCIsICVzIiwgaXBhZGRyX3N0cmluZyh0cHRyKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfTUFYX0xJTktfQlcgOgotCWNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX1JFU0VSVkFCTEVfQlc6ICAKLSAgICAgICAgICAgIGlmIChzdWJsID49IDQpIHsKLSAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOwotICAgICAgICAgICAgICBwcmludGYoIiwgJS4zZiBNYnBzIiwgYncuZio4LzEwMDAwMDAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9VTlJFU0VSVkVEX0JXIDoKLSAgICAgICAgICAgIGlmIChzdWJsID49IDMyKSB7Ci0gICAgICAgICAgICAgIGZvciAodGVfY2xhc3MgPSAwOyB0ZV9jbGFzcyA8IDg7IHRlX2NsYXNzKyspIHsKLSAgICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgVEUtQ2xhc3MgJXU6ICUuM2YgTWJwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICB0ZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDAgKTsKLQkJdHB0cis9NDsKLQkgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJU0lTX1NVQlRMVl9FWFRfSVNfUkVBQ0hfQldfQ09OU1RSQUlOVFM6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9CV19DT05TVFJBSU5UU19PTEQ6Ci0gICAgICAgICAgICBwcmludGYoIiVzQmFuZHdpZHRoIENvbnN0cmFpbnRzIE1vZGVsIElEOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGRpZmZzZXJ2X3RlX2JjX3ZhbHVlcywgInVua25vd24iLCAqdHB0ciksCi0gICAgICAgICAgICAgICAgICAgKnRwdHIpOwotICAgICAgICAgICAgdHB0cisrOwotICAgICAgICAgICAgLyogZGVjb2RlIEJDcyB1bnRpbCB0aGUgc3ViVExWIGVuZHMgKi8KLSAgICAgICAgICAgIGZvciAodGVfY2xhc3MgPSAwOyB0ZV9jbGFzcyA8IChzdWJsLTEpLzQ7IHRlX2NsYXNzKyspIHsKLSAgICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgQmFuZHdpZHRoIGNvbnN0cmFpbnQgQ1QldTogJS4zZiBNYnBzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCApOwotCQl0cHRyKz00OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVNJU19TVUJUTFZfRVhUX0lTX1JFQUNIX1RFX01FVFJJQzoKLSAgICAgICAgICAgIGlmIChzdWJsID49IDMpCi0gICAgICAgICAgICAgIHByaW50ZigiLCAldSIsIEVYVFJBQ1RfMjRCSVRTKHRwdHIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9MSU5LX1BST1RFQ1RJT05fVFlQRToKLSAgICAgICAgICAgIGlmIChzdWJsID49IDIpIHsKLSAgICAgICAgICAgICAgcHJpbnRmKCIsICVzLCBQcmlvcml0eSAldSIsCi0JCSAgIGJpdHRvazJzdHIoZ21wbHNfbGlua19wcm90X3ZhbHVlcywgIm5vbmUiLCAqdHB0ciksCi0gICAgICAgICAgICAgICAgICAgKih0cHRyKzEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElTSVNfU1VCVExWX0VYVF9JU19SRUFDSF9JTlRGX1NXX0NBUF9ERVNDUjoKLSAgICAgICAgICAgIGlmIChzdWJsID49IDM2KSB7Ci0gICAgICAgICAgICAgIHByaW50ZigiJXMgIEludGVyZmFjZSBTd2l0Y2hpbmcgQ2FwYWJpbGl0eTolcyIsCi0gICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihnbXBsc19zd2l0Y2hfY2FwX3ZhbHVlcywgIlVua25vd24iLCAqKHRwdHIpKSk7Ci0gICAgICAgICAgICAgIHByaW50ZigiLCBMU1AgRW5jb2Rpbmc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGdtcGxzX2VuY29kaW5nX3ZhbHVlcywgIlVua25vd24iLCAqKHRwdHIrMSkpKTsKLQkgICAgICB0cHRyKz00OwotICAgICAgICAgICAgICBwcmludGYoIiVzICBNYXggTFNQIEJhbmR3aWR0aDoiLGlkZW50KTsKLSAgICAgICAgICAgICAgZm9yIChwcmlvcml0eV9sZXZlbCA9IDA7IHByaW9yaXR5X2xldmVsIDwgODsgcHJpb3JpdHlfbGV2ZWwrKykgewotICAgICAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgIHByaW9yaXR5IGxldmVsICVkOiAlLjNmIE1icHMiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHlfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwICk7Ci0JCXRwdHIrPTQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgc3VibC09MzY7Ci0gICAgICAgICAgICAgIC8qIHRoZXJlIGlzIHNvbWUgb3B0aW9uYWwgc3R1ZmYgbGVmdCB0byBkZWNvZGUgYnV0IHRoaXMgaXMgYXMgb2YgeWV0Ci0gICAgICAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgc28ganVzdCBsZXRzIGhleGR1bXAgd2hhdCBpcyBsZWZ0ICovCi0gICAgICAgICAgICAgIGlmKHN1Ymw+MCl7Ci0gICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0XHQgICAgIiwKLQkJCQkgICAgICAgc3VibCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHRcdCAgICAiLAotCQkJCSAgIHN1YmwpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybigxKTsKLQotdHJ1bmN0bHY6Ci0gICAgcHJpbnRmKCIlc3BhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIsaWRlbnQpOwotICAgIHJldHVybigwKTsKLX0KLQotCi0vKgotICogdGhpcyBpcyB0aGUgY29tbW9uIElTLVJFQUNIIGRlY29kZXIgaXQgaXMgY2FsbGVkCi0gKiBmcm9tIHZhcmlvdXMgRVhURC1JUyBSRUFDSCBzdHlsZSBUTFZzICgyMiwyNCwyMjIpCi0gKi8KLQotc3RhdGljIGludAotaXNpc19wcmludF9leHRfaXNfcmVhY2ggKGNvbnN0IHVfaW50OF90ICp0cHRyLGNvbnN0IGNoYXIgKmlkZW50LCBpbnQgdGx2X3R5cGUpIHsKLQotICAgIGNoYXIgaWRlbnRfYnVmZmVyWzIwXTsKLSAgICBpbnQgc3VidGx2X3R5cGUsc3VidGx2X2xlbixzdWJ0bHZfc3VtX2xlbjsKLSAgICBpbnQgcHJvY19ieXRlcyA9IDA7IC8qIGhvdyBtYW55IGJ5dGVzIGRpZCB3ZSBwcm9jZXNzID8gKi8KLSAgICAKLSAgICBpZiAoIVRURVNUMigqdHB0ciwgTk9ERV9JRF9MRU4pKQotICAgICAgICByZXR1cm4oMCk7Ci0KLSAgICBwcmludGYoIiVzSVMgTmVpZ2hib3I6ICVzIiwgaWRlbnQsIGlzaXNfcHJpbnRfaWQodHB0ciwgTk9ERV9JRF9MRU4pKTsKLSAgICB0cHRyKz0oTk9ERV9JRF9MRU4pOwotCi0gICAgaWYgKHRsdl90eXBlICE9IElTSVNfVExWX0lTX0FMSUFTX0lEKSB7IC8qIHRoZSBBbGlhcyBUTFYgTWV0cmljIGZpZWxkIGlzIGltcGxpY2l0IDAgKi8KLSAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDMpKSAgICAvKiBhbmQgaXMgdGhlcmVmb3JlIHNraXBwZWQgKi8KLQkgICAgcmV0dXJuKDApOwotCXByaW50ZigiLCBNZXRyaWM6ICVkIixFWFRSQUNUXzI0QklUUyh0cHRyKSk7Ci0JdHB0cis9MzsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmICghVFRFU1QyKCp0cHRyLCAxKSkKLSAgICAgICAgcmV0dXJuKDApOwotICAgIHN1YnRsdl9zdW1fbGVuPSoodHB0cisrKTsgLyogcmVhZCBvdXQgc3ViVExWIGxlbmd0aCAqLwotICAgIHByb2NfYnl0ZXM9Tk9ERV9JRF9MRU4rMysxOwotICAgIHByaW50ZigiLCAlc3N1Yi1UTFZzIHByZXNlbnQiLHN1YnRsdl9zdW1fbGVuID8gIiIgOiAibm8gIik7Ci0gICAgaWYgKHN1YnRsdl9zdW1fbGVuKSB7Ci0gICAgICAgIHByaW50ZigiICgldSkiLHN1YnRsdl9zdW1fbGVuKTsKLSAgICAgICAgd2hpbGUgKHN1YnRsdl9zdW1fbGVuPjApIHsKLSAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLDIpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgIHN1YnRsdl90eXBlPSoodHB0cisrKTsKLSAgICAgICAgICAgIHN1YnRsdl9sZW49Kih0cHRyKyspOwotICAgICAgICAgICAgLyogcHJlcGVuZCB0aGUgaWRlbnQgc3RyaW5nICovCi0gICAgICAgICAgICBzbnByaW50ZihpZGVudF9idWZmZXIsIHNpemVvZihpZGVudF9idWZmZXIpLCAiJXMgICIsaWRlbnQpOwotICAgICAgICAgICAgaWYoIWlzaXNfcHJpbnRfaXNfcmVhY2hfc3VidGx2KHRwdHIsc3VidGx2X3R5cGUsc3VidGx2X2xlbixpZGVudF9idWZmZXIpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgIHRwdHIrPXN1YnRsdl9sZW47Ci0gICAgICAgICAgICBzdWJ0bHZfc3VtX2xlbi09KHN1YnRsdl9sZW4rMik7Ci0gICAgICAgICAgICBwcm9jX2J5dGVzKz0oc3VidGx2X2xlbisyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4ocHJvY19ieXRlcyk7Ci19Ci0KLS8qCi0gKiB0aGlzIGlzIHRoZSBjb21tb24gTXVsdGkgVG9wb2xvZ3kgSUQgZGVjb2RlcgotICogaXQgaXMgY2FsbGVkIGZyb20gdmFyaW91cyBNVC1UTFZzICgyMjIsMjI5LDIzNSwyMzcpCi0gKi8KLQotc3RhdGljIGludAotaXNpc19wcmludF9tdGlkIChjb25zdCB1X2ludDhfdCAqdHB0cixjb25zdCBjaGFyICppZGVudCkgewotICAgIAotICAgIGlmICghVFRFU1QyKCp0cHRyLCAyKSkKLSAgICAgICAgcmV0dXJuKDApOwotCi0gICAgcHJpbnRmKCIlcyVzIiwKLSAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgIHRvazJzdHIoaXNpc19tdF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgIlJlc2VydmVkIGZvciBJRVRGIENvbnNlbnN1cyIsCi0gICAgICAgICAgICAgICAgICAgSVNJU19NQVNLX01USUQoRVhUUkFDVF8xNkJJVFModHB0cikpKSk7Ci0KLSAgICBwcmludGYoIiBUb3BvbG9neSAoMHglMDN4KSwgRmxhZ3M6IFslc10iLAotICAgICAgICAgICBJU0lTX01BU0tfTVRJRChFWFRSQUNUXzE2QklUUyh0cHRyKSksCi0gICAgICAgICAgIGJpdHRvazJzdHIoaXNpc19tdF9mbGFnX3ZhbHVlcywgIm5vbmUiLElTSVNfTUFTS19NVEZMQUdTKEVYVFJBQ1RfMTZCSVRTKHRwdHIpKSkpOwotCi0gICAgcmV0dXJuKDIpOwotfQotCi0vKgotICogdGhpcyBpcyB0aGUgY29tbW9uIGV4dGVuZGVkIElQIHJlYWNoIGRlY29kZXIKLSAqIGl0IGlzIGNhbGxlZCBmcm9tIFRMVnMgKDEzNSwyMzUsMjM2LDIzNykKLSAqIHdlIHByb2Nlc3MgdGhlIFRMViBhbmQgb3B0aW9uYWwgc3ViVExWcyBhbmQgcmV0dXJuCi0gKiB0aGUgYW1vdW50IG9mIHByb2Nlc3NlZCBieXRlcwotICovCi0KLXN0YXRpYyBpbnQKLWlzaXNfcHJpbnRfZXh0ZF9pcF9yZWFjaCAoY29uc3QgdV9pbnQ4X3QgKnRwdHIsIGNvbnN0IGNoYXIgKmlkZW50LCB1X2ludDE2X3QgYWZpKSB7Ci0KLSAgICBjaGFyIGlkZW50X2J1ZmZlclsyMF07Ci0jaWZkZWYgSU5FVDYKLSAgICB1X2ludDhfdCBwcmVmaXhbc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcildOyAvKiBzaGFyZWQgY29weSBidWZmZXIgZm9yIElQdjQgYW5kIElQdjYgcHJlZml4ZXMgKi8KLSNlbHNlCi0gICAgdV9pbnQ4X3QgcHJlZml4W3NpemVvZihzdHJ1Y3QgaW5fYWRkcildOyAvKiBzaGFyZWQgY29weSBidWZmZXIgZm9yIElQdjQgcHJlZml4ZXMgKi8KLSNlbmRpZgotICAgIHVfaW50IG1ldHJpYywgc3RhdHVzX2J5dGUsIGJpdF9sZW5ndGgsIGJ5dGVfbGVuZ3RoLCBzdWJsZW4sIHByb2Nlc3NlZCwgc3VidGx2dHlwZSwgc3VidGx2bGVuOwotCi0gICAgaWYgKCFUVEVTVDIoKnRwdHIsIDQpKQotICAgICAgICByZXR1cm4gKDApOwotICAgIG1ldHJpYyA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOwotICAgIHByb2Nlc3NlZD00OwotICAgIHRwdHIrPTQ7Ci0gICAgCi0gICAgaWYgKGFmaSA9PSBJUFY0KSB7Ci0gICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCAxKSkgLyogZmV0Y2ggc3RhdHVzIGJ5dGUgKi8KLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIHN0YXR1c19ieXRlPSoodHB0cisrKTsKLSAgICAgICAgYml0X2xlbmd0aCA9IHN0YXR1c19ieXRlJjB4M2Y7Ci0gICAgICAgIGlmIChiaXRfbGVuZ3RoID4gMzIpIHsKLSAgICAgICAgICAgIHByaW50ZigiJXNJUHY0IHByZWZpeDogYmFkIGJpdCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgIGJpdF9sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzZWQrKzsKLSNpZmRlZiBJTkVUNgotICAgIH0gZWxzZSBpZiAoYWZpID09IElQVjYpIHsKLSAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpKSAvKiBmZXRjaCBzdGF0dXMgJiBwcmVmaXhfbGVuIGJ5dGUgKi8KLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIHN0YXR1c19ieXRlPSoodHB0cisrKTsKLSAgICAgICAgYml0X2xlbmd0aD0qKHRwdHIrKyk7Ci0gICAgICAgIGlmIChiaXRfbGVuZ3RoID4gMTI4KSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzSVB2NiBwcmVmaXg6IGJhZCBiaXQgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICBiaXRfbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc2VkKz0yOwotI2VuZGlmCi0gICAgfSBlbHNlCi0gICAgICAgIHJldHVybiAoMCk7IC8qIHNvbWVib2R5IGlzIGZvb2xpbmcgdXMgKi8KLQotICAgIGJ5dGVfbGVuZ3RoID0gKGJpdF9sZW5ndGggKyA3KSAvIDg7IC8qIHByZWZpeCBoYXMgdmFyaWFibGUgbGVuZ3RoIGVuY29kaW5nICovCi0gICAKLSAgICBpZiAoIVRURVNUMigqdHB0ciwgYnl0ZV9sZW5ndGgpKQotICAgICAgICByZXR1cm4gKDApOwotICAgIG1lbXNldChwcmVmaXgsIDAsIHNpemVvZiBwcmVmaXgpOyAgIC8qIGNsZWFyIHRoZSBjb3B5IGJ1ZmZlciAqLwotICAgIG1lbWNweShwcmVmaXgsdHB0cixieXRlX2xlbmd0aCk7ICAgIC8qIGNvcHkgYXMgbXVjaCBhcyBpcyBzdG9yZWQgaW4gdGhlIFRMViAqLwotICAgIHRwdHIrPWJ5dGVfbGVuZ3RoOwotICAgIHByb2Nlc3NlZCs9Ynl0ZV9sZW5ndGg7Ci0KLSAgICBpZiAoYWZpID09IElQVjQpCi0gICAgICAgIHByaW50ZigiJXNJUHY0IHByZWZpeDogJTE1cy8ldSIsCi0gICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcocHJlZml4KSwKLSAgICAgICAgICAgICAgIGJpdF9sZW5ndGgpOwotI2lmZGVmIElORVQ2Ci0gICAgaWYgKGFmaSA9PSBJUFY2KQotICAgICAgICBwcmludGYoIiVzSVB2NiBwcmVmaXg6ICVzLyV1IiwKLSAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcocHJlZml4KSwKLSAgICAgICAgICAgICAgIGJpdF9sZW5ndGgpOwotI2VuZGlmIAotICAgCi0gICAgcHJpbnRmKCIsIERpc3RyaWJ1dGlvbjogJXMsIE1ldHJpYzogJXUiLAotICAgICAgICAgICBJU0lTX01BU0tfVExWX0VYVERfSVBfVVBET1dOKHN0YXR1c19ieXRlKSA/ICJkb3duIiA6ICJ1cCIsCi0gICAgICAgICAgIG1ldHJpYyk7Ci0KLSAgICBpZiAoYWZpID09IElQVjQgJiYgSVNJU19NQVNLX1RMVl9FWFREX0lQX1NVQlRMVihzdGF0dXNfYnl0ZSkpCi0gICAgICAgIHByaW50ZigiLCBzdWItVExWcyBwcmVzZW50Iik7Ci0jaWZkZWYgSU5FVDYKLSAgICBpZiAoYWZpID09IElQVjYpCi0gICAgICAgIHByaW50ZigiLCAlcyVzIiwKLSAgICAgICAgICAgICAgIElTSVNfTUFTS19UTFZfRVhURF9JUDZfSUUoc3RhdHVzX2J5dGUpID8gIkV4dGVybmFsIiA6ICJJbnRlcm5hbCIsCi0gICAgICAgICAgICAgICBJU0lTX01BU0tfVExWX0VYVERfSVA2X1NVQlRMVihzdGF0dXNfYnl0ZSkgPyAiLCBzdWItVExWcyBwcmVzZW50IiA6ICIiKTsKLSNlbmRpZgotICAgIAotICAgIGlmICgoSVNJU19NQVNLX1RMVl9FWFREX0lQX1NVQlRMVihzdGF0dXNfYnl0ZSkgICYmIGFmaSA9PSBJUFY0KSB8fAotICAgICAgICAoSVNJU19NQVNLX1RMVl9FWFREX0lQNl9TVUJUTFYoc3RhdHVzX2J5dGUpICYmIGFmaSA9PSBJUFY2KSkgewotICAgICAgICAvKiBhc3N1bWUgdGhhdCBvbmUgcHJlZml4IGNhbiBob2xkIG1vcmUKLSAgICAgICAgICAgdGhhbiBvbmUgc3ViVExWIC0gdGhlcmVmb3JlIHRoZSBmaXJzdCBieXRlIG11c3QgcmVmbGVjdAotICAgICAgICAgICB0aGUgYWdncmVnYXRlIGJ5dGVjb3VudCBvZiB0aGUgc3ViVExWcyBmb3IgdGhpcyBwcmVmaXgKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpKQotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgc3VibGVuPSoodHB0cisrKTsKLSAgICAgICAgcHJvY2Vzc2VkKz1zdWJsZW4rMTsKLSAgICAgICAgcHJpbnRmKCIgKCV1KSIsc3VibGVuKTsgICAvKiBwcmludCBvdXQgc3ViVExWIGxlbmd0aCAqLwotICAgICAgICAKLSAgICAgICAgd2hpbGUgKHN1Ymxlbj4wKSB7Ci0gICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotICAgICAgICAgICAgc3VidGx2dHlwZT0qKHRwdHIrKyk7Ci0gICAgICAgICAgICBzdWJ0bHZsZW49Kih0cHRyKyspOwotICAgICAgICAgICAgLyogcHJlcGVuZCB0aGUgaWRlbnQgc3RyaW5nICovCi0gICAgICAgICAgICBzbnByaW50ZihpZGVudF9idWZmZXIsIHNpemVvZihpZGVudF9idWZmZXIpLCAiJXMgICIsaWRlbnQpOwotICAgICAgICAgICAgaWYoIWlzaXNfcHJpbnRfaXBfcmVhY2hfc3VidGx2KHRwdHIsc3VidGx2dHlwZSxzdWJ0bHZsZW4saWRlbnRfYnVmZmVyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgICAgICB0cHRyKz1zdWJ0bHZsZW47Ci0gICAgICAgICAgICBzdWJsZW4tPShzdWJ0bHZsZW4rMik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChwcm9jZXNzZWQpOwotfQotCi0vKgotICogaXNpc19wcmludAotICogRGVjb2RlIElTLUlTIHBhY2tldHMuICBSZXR1cm4gMCBvbiBlcnJvci4KLSAqLwotCi1zdGF0aWMgaW50IGlzaXNfcHJpbnQgKGNvbnN0IHVfaW50OF90ICpwLCB1X2ludCBsZW5ndGgpCi17Ci0gICAgY29uc3Qgc3RydWN0IGlzaXNfY29tbW9uX2hlYWRlciAqaXNpc19oZWFkZXI7Ci0KLSAgICBjb25zdCBzdHJ1Y3QgaXNpc19paWhfbGFuX2hlYWRlciAqaGVhZGVyX2lpaF9sYW47Ci0gICAgY29uc3Qgc3RydWN0IGlzaXNfaWloX3B0cF9oZWFkZXIgKmhlYWRlcl9paWhfcHRwOwotICAgIGNvbnN0IHN0cnVjdCBpc2lzX2xzcF9oZWFkZXIgKmhlYWRlcl9sc3A7Ci0gICAgY29uc3Qgc3RydWN0IGlzaXNfY3NucF9oZWFkZXIgKmhlYWRlcl9jc25wOwotICAgIGNvbnN0IHN0cnVjdCBpc2lzX3BzbnBfaGVhZGVyICpoZWFkZXJfcHNucDsKLQotICAgIGNvbnN0IHN0cnVjdCBpc2lzX3Rsdl9sc3AgKnRsdl9sc3A7Ci0gICAgY29uc3Qgc3RydWN0IGlzaXNfdGx2X3B0cF9hZGogKnRsdl9wdHBfYWRqOwotICAgIGNvbnN0IHN0cnVjdCBpc2lzX3Rsdl9pc19yZWFjaCAqdGx2X2lzX3JlYWNoOwotICAgIGNvbnN0IHN0cnVjdCBpc2lzX3Rsdl9lc19yZWFjaCAqdGx2X2VzX3JlYWNoOwotCi0gICAgdV9pbnQ4X3QgcGR1X3R5cGUsIG1heF9hcmVhLCBpZF9sZW5ndGgsIHRsdl90eXBlLCB0bHZfbGVuLCB0bXAsIGFsZW4sIGxhbl9hbGVuLCBwcmVmaXhfbGVuOwotICAgIHVfaW50OF90IGV4dF9pc19sZW4sIGV4dF9pcF9sZW4sIG10X2xlbjsKLSAgICBjb25zdCB1X2ludDhfdCAqb3B0ciwgKnBwdHIsICp0cHRyOwotICAgIHVfc2hvcnQgcGFja2V0X2xlbixwZHVfbGVuOwotICAgIHVfaW50IGksdmVuZG9yX2lkOwotCi0gICAgcGFja2V0X2xlbj1sZW5ndGg7Ci0gICAgb3B0ciA9IHA7IC8qIGluaXRpYWxpemUgdGhlIF9vX3JpZ2luYWwgcG9pbnRlciB0byB0aGUgcGFja2V0IHN0YXJ0IC0KLSAgICAgICAgICAgICAgICAgbmVlZCBpdCBmb3IgcGFyc2luZyB0aGUgY2hlY2tzdW0gVExWICovCi0gICAgaXNpc19oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGlzaXNfY29tbW9uX2hlYWRlciAqKXA7Ci0gICAgVENIRUNLKCppc2lzX2hlYWRlcik7Ci0gICAgcHB0ciA9IHArKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFKTsKLSAgICBoZWFkZXJfaWloX2xhbiA9IChjb25zdCBzdHJ1Y3QgaXNpc19paWhfbGFuX2hlYWRlciAqKXBwdHI7Ci0gICAgaGVhZGVyX2lpaF9wdHAgPSAoY29uc3Qgc3RydWN0IGlzaXNfaWloX3B0cF9oZWFkZXIgKilwcHRyOwotICAgIGhlYWRlcl9sc3AgPSAoY29uc3Qgc3RydWN0IGlzaXNfbHNwX2hlYWRlciAqKXBwdHI7Ci0gICAgaGVhZGVyX2NzbnAgPSAoY29uc3Qgc3RydWN0IGlzaXNfY3NucF9oZWFkZXIgKilwcHRyOwotICAgIGhlYWRlcl9wc25wID0gKGNvbnN0IHN0cnVjdCBpc2lzX3BzbnBfaGVhZGVyICopcHB0cjsKLQotICAgIGlmICghZWZsYWcpCi0gICAgICAgIHByaW50ZigiSVMtSVMiKTsKLQotICAgIC8qCi0gICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCi0gICAgICovCi0KLSAgICBpZiAoaXNpc19oZWFkZXItPnZlcnNpb24gIT0gSVNJU19WRVJTSU9OKSB7Ci0JcHJpbnRmKCJ2ZXJzaW9uICVkIHBhY2tldCBub3Qgc3VwcG9ydGVkIiwgaXNpc19oZWFkZXItPnZlcnNpb24pOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgaWYgKChpc2lzX2hlYWRlci0+aWRfbGVuZ3RoICE9IFNZU1RFTV9JRF9MRU4pICYmIChpc2lzX2hlYWRlci0+aWRfbGVuZ3RoICE9IDApKSB7Ci0JcHJpbnRmKCJzeXN0ZW0gSUQgbGVuZ3RoIG9mICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAotCSAgICAgICBpc2lzX2hlYWRlci0+aWRfbGVuZ3RoKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIGlmIChpc2lzX2hlYWRlci0+cGR1X3ZlcnNpb24gIT0gSVNJU19WRVJTSU9OKSB7Ci0JcHJpbnRmKCJ2ZXJzaW9uICVkIHBhY2tldCBub3Qgc3VwcG9ydGVkIiwgaXNpc19oZWFkZXItPnBkdV92ZXJzaW9uKTsKLQlyZXR1cm4gKDApOwotICAgIH0KLQotICAgIG1heF9hcmVhID0gaXNpc19oZWFkZXItPm1heF9hcmVhOwotICAgIHN3aXRjaChtYXhfYXJlYSkgewotICAgIGNhc2UgMDoKLQltYXhfYXJlYSA9IDM7CSAvKiBzaWxseSBzaGl0ICovCi0JYnJlYWs7Ci0gICAgY2FzZSAyNTU6Ci0JcHJpbnRmKCJiYWQgcGFja2V0IC0tIDI1NSBhcmVhcyIpOwotCXJldHVybiAoMCk7Ci0gICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0KLSAgICBpZF9sZW5ndGggPSBpc2lzX2hlYWRlci0+aWRfbGVuZ3RoOwotICAgIHN3aXRjaChpZF9sZW5ndGgpIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIGlkX2xlbmd0aCA9IDY7CSAvKiBzaWxseSBzaGl0IGFnYWluICovCi0JYnJlYWs7Ci0gICAgY2FzZSAxOiAgICAgICAgICAgICAgLyogMS04IGFyZSB2YWxpZCBzeXMtSUQgbGVuZ2h0cyAqLwotICAgIGNhc2UgMjoKLSAgICBjYXNlIDM6Ci0gICAgY2FzZSA0OgotICAgIGNhc2UgNToKLSAgICBjYXNlIDY6Ci0gICAgY2FzZSA3OgotICAgIGNhc2UgODoKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNTU6Ci0gICAgICAgIGlkX2xlbmd0aCA9IDA7ICAgLyogZW50aXJlbHkgdXNlbGVzcyAqLwotCWJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIHRvc3MgYW55IG5vbiA2LWJ5dGUgc3lzLUlEIGxlbiBQRFVzICovCi0gICAgaWYgKGlkX2xlbmd0aCAhPSA2ICkgeyAKLQlwcmludGYoImJhZCBwYWNrZXQgLS0gaWxsZWdhbCBzeXMtSUQgbGVuZ3RoICgldSkiLCBpZF9sZW5ndGgpOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgcGR1X3R5cGU9aXNpc19oZWFkZXItPnBkdV90eXBlOwotCi0gICAgLyogaW4gbm9uLXZlcmJvc2UgbW9kZSBwcmludCB0aGUgYmFzaWMgUERVIFR5cGUgcGx1cyBQRFUgc3BlY2lmaWMgYnJpZWYgaW5mb3JtYXRpb24qLwotICAgIGlmICh2ZmxhZyA8IDEpIHsKLSAgICAgICAgcHJpbnRmKCIlcyVzIiwKLSAgICAgICAgICAgICAgIGVmbGFnID8gIiIgOiAiLCAiLAotICAgICAgICAgICAgICAgdG9rMnN0cihpc2lzX3BkdV92YWx1ZXMsInVua25vd24gUERVLVR5cGUgJXUiLHBkdV90eXBlKSk7Ci0KLQlzd2l0Y2ggKHBkdV90eXBlKSB7Ci0KLQljYXNlIElTSVNfUERVX0wxX0xBTl9JSUg6Ci0JY2FzZSBJU0lTX1BEVV9MMl9MQU5fSUlIOgotCSAgICBwcmludGYoIiwgc3JjLWlkICVzIiwKLSAgICAgICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9paWhfbGFuLT5zb3VyY2VfaWQsU1lTVEVNX0lEX0xFTikpOwotCSAgICBwcmludGYoIiwgbGFuLWlkICVzLCBwcmlvICV1IiwKLSAgICAgICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9paWhfbGFuLT5sYW5faWQsTk9ERV9JRF9MRU4pLAotICAgICAgICAgICAgICAgICAgIGhlYWRlcl9paWhfbGFuLT5wcmlvcml0eSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSVNJU19QRFVfUFRQX0lJSDoKLQkgICAgcHJpbnRmKCIsIHNyYy1pZCAlcyIsIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2lpaF9wdHAtPnNvdXJjZV9pZCxTWVNURU1fSURfTEVOKSk7Ci0JICAgIGJyZWFrOwotCWNhc2UgSVNJU19QRFVfTDFfTFNQOgotCWNhc2UgSVNJU19QRFVfTDJfTFNQOgotCSAgICBwcmludGYoIiwgbHNwLWlkICVzLCBzZXEgMHglMDh4LCBsaWZldGltZSAlNXVzIiwKLQkJICAgaXNpc19wcmludF9pZChoZWFkZXJfbHNwLT5sc3BfaWQsIExTUF9JRF9MRU4pLAotCQkgICBFWFRSQUNUXzMyQklUUyhoZWFkZXJfbHNwLT5zZXF1ZW5jZV9udW1iZXIpLAotCQkgICBFWFRSQUNUXzE2QklUUyhoZWFkZXJfbHNwLT5yZW1haW5pbmdfbGlmZXRpbWUpKTsKLQkgICAgYnJlYWs7Ci0JY2FzZSBJU0lTX1BEVV9MMV9DU05QOgotCWNhc2UgSVNJU19QRFVfTDJfQ1NOUDoKLQkgICAgcHJpbnRmKCIsIHNyYy1pZCAlcyIsIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2NzbnAtPnNvdXJjZV9pZCxOT0RFX0lEX0xFTikpOwotCSAgICBicmVhazsKLQljYXNlIElTSVNfUERVX0wxX1BTTlA6Ci0JY2FzZSBJU0lTX1BEVV9MMl9QU05QOgotCSAgICBwcmludGYoIiwgc3JjLWlkICVzIiwgaXNpc19wcmludF9pZChoZWFkZXJfcHNucC0+c291cmNlX2lkLE5PREVfSURfTEVOKSk7Ci0JICAgIGJyZWFrOwotCi0JfQotCXByaW50ZigiLCBsZW5ndGggJXUiLCBsZW5ndGgpOwotCi0gICAgICAgIHJldHVybigxKTsKLSAgICB9Ci0KLSAgICAvKiBvayB0aGV5IHNlZW0gdG8gd2FudCB0byBrbm93IGV2ZXJ5dGhpbmcgLSBsZXRzIGZ1bGx5IGRlY29kZSBpdCAqLwotICAgIHByaW50ZigiJXNsZW5ndGggJXUiLCBlZmxhZyA/ICIiIDogIiwgIixsZW5ndGgpOwotCi0gICAgcHJpbnRmKCJcblx0JXMsIGhsZW46ICV1LCB2OiAldSwgcGR1LXY6ICV1LCBzeXMtaWQtbGVuOiAldSAoJXUpLCBtYXgtYXJlYTogJXUgKCV1KSIsCi0gICAgICAgICAgIHRvazJzdHIoaXNpc19wZHVfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICJ1bmtub3duLCB0eXBlICV1IiwKLSAgICAgICAgICAgICAgICAgICBwZHVfdHlwZSksCi0gICAgICAgICAgIGlzaXNfaGVhZGVyLT5maXhlZF9sZW4sCi0gICAgICAgICAgIGlzaXNfaGVhZGVyLT52ZXJzaW9uLAotICAgICAgICAgICBpc2lzX2hlYWRlci0+cGR1X3ZlcnNpb24sCi0JICAgaWRfbGVuZ3RoLAotCSAgIGlzaXNfaGVhZGVyLT5pZF9sZW5ndGgsCi0gICAgICAgICAgIG1heF9hcmVhLAotICAgICAgICAgICBpc2lzX2hlYWRlci0+bWF4X2FyZWEpOwotCi0gICAgaWYgKHZmbGFnID4gMSkgewotICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKG9wdHIsIlxuXHQiLDgpKSAvKiBwcm92aWRlIHRoZSBfb19yaWdpbmFsIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHJldHVybigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIG9wdGlvbmFsbHkgZGVidWdnaW5nIHRoZSBjb21tb24gaGVhZGVyICovCi0gICAgfQotCi0gICAgc3dpdGNoIChwZHVfdHlwZSkgewotCi0gICAgY2FzZSBJU0lTX1BEVV9MMV9MQU5fSUlIOgotICAgIGNhc2UgSVNJU19QRFVfTDJfTEFOX0lJSDoKLQlpZiAoaXNpc19oZWFkZXItPmZpeGVkX2xlbiAhPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19JSUhfTEFOX0hFQURFUl9TSVpFKSkgewotCSAgICBwcmludGYoIiwgYm9ndXMgZml4ZWQgaGVhZGVyIGxlbmd0aCAldSBzaG91bGQgYmUgJWx1IiwKLQkJICAgaXNpc19oZWFkZXItPmZpeGVkX2xlbiwgKHVuc2lnbmVkIGxvbmcpSVNJU19JSUhfTEFOX0hFQURFUl9TSVpFKTsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0KLQlwZHVfbGVuPUVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9paWhfbGFuLT5wZHVfbGVuKTsKLQlpZiAocGFja2V0X2xlbj5wZHVfbGVuKSB7Ci0gICAgICAgICAgICBwYWNrZXRfbGVuPXBkdV9sZW47IC8qIGRvIFRMViBkZWNvZGluZyBhcyBsb25nIGFzIGl0IG1ha2VzIHNlbnNlICovCi0gICAgICAgICAgICBsZW5ndGg9cGR1X2xlbjsKLQl9Ci0KLQlUQ0hFQ0soKmhlYWRlcl9paWhfbGFuKTsKLQlwcmludGYoIlxuXHQgIHNvdXJjZS1pZDogJXMsICBob2xkaW5nIHRpbWU6ICV1cywgRmxhZ3M6IFslc10iLAotICAgICAgICAgICAgICAgaXNpc19wcmludF9pZChoZWFkZXJfaWloX2xhbi0+c291cmNlX2lkLFNZU1RFTV9JRF9MRU4pLAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoaGVhZGVyX2lpaF9sYW4tPmhvbGRpbmdfdGltZSksCi0gICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfaWloX2NpcmN1aXRfdHlwZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGNpcmN1aXQgdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfaWloX2xhbi0+Y2lyY3VpdF90eXBlKSk7Ci0KLQlwcmludGYoIlxuXHQgIGxhbi1pZDogICAgJXMsIFByaW9yaXR5OiAldSwgUERVIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgaXNpc19wcmludF9pZChoZWFkZXJfaWloX2xhbi0+bGFuX2lkLCBOT0RFX0lEX0xFTiksCi0gICAgICAgICAgICAgICAoaGVhZGVyX2lpaF9sYW4tPnByaW9yaXR5KSAmIElTSVNfTEFOX1BSSU9SSVRZX01BU0ssCi0gICAgICAgICAgICAgICBwZHVfbGVuKTsKLQotICAgICAgICBpZiAodmZsYWcgPiAxKSB7Ci0gICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICIsSVNJU19JSUhfTEFOX0hFQURFUl9TSVpFKSkKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KLQotCXBhY2tldF9sZW4gLT0gKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfSUlIX0xBTl9IRUFERVJfU0laRSk7Ci0JcHB0ciA9IHAgKyAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19JSUhfTEFOX0hFQURFUl9TSVpFKTsKLQlicmVhazsKLQotICAgIGNhc2UgSVNJU19QRFVfUFRQX0lJSDoKLQlpZiAoaXNpc19oZWFkZXItPmZpeGVkX2xlbiAhPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19JSUhfUFRQX0hFQURFUl9TSVpFKSkgewotCSAgICBwcmludGYoIiwgYm9ndXMgZml4ZWQgaGVhZGVyIGxlbmd0aCAldSBzaG91bGQgYmUgJWx1IiwKLQkJICAgaXNpc19oZWFkZXItPmZpeGVkX2xlbiwgKHVuc2lnbmVkIGxvbmcpSVNJU19JSUhfUFRQX0hFQURFUl9TSVpFKTsKLQkgICAgcmV0dXJuICgwKTsKLQl9Ci0KLQlwZHVfbGVuPUVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9paWhfcHRwLT5wZHVfbGVuKTsKLQlpZiAocGFja2V0X2xlbj5wZHVfbGVuKSB7Ci0gICAgICAgICAgICBwYWNrZXRfbGVuPXBkdV9sZW47IC8qIGRvIFRMViBkZWNvZGluZyBhcyBsb25nIGFzIGl0IG1ha2VzIHNlbnNlICovCi0gICAgICAgICAgICBsZW5ndGg9cGR1X2xlbjsKLQl9Ci0KLQlUQ0hFQ0soKmhlYWRlcl9paWhfcHRwKTsKLQlwcmludGYoIlxuXHQgIHNvdXJjZS1pZDogJXMsIGhvbGRpbmcgdGltZTogJXVzLCBGbGFnczogWyVzXSIsCi0gICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9paWhfcHRwLT5zb3VyY2VfaWQsU1lTVEVNX0lEX0xFTiksCi0gICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhoZWFkZXJfaWloX3B0cC0+aG9sZGluZ190aW1lKSwKLSAgICAgICAgICAgICAgIHRvazJzdHIoaXNpc19paWhfY2lyY3VpdF90eXBlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gY2lyY3VpdCB0eXBlIDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9paWhfcHRwLT5jaXJjdWl0X3R5cGUpKTsKLQotCXByaW50ZigiXG5cdCAgY2lyY3VpdC1pZDogMHglMDJ4LCBQRFUgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICBoZWFkZXJfaWloX3B0cC0+Y2lyY3VpdF9pZCwKLSAgICAgICAgICAgICAgIHBkdV9sZW4pOwotCi0gICAgICAgIGlmICh2ZmxhZyA+IDEpIHsKLSAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixJU0lTX0lJSF9QVFBfSEVBREVSX1NJWkUpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQotCi0JcGFja2V0X2xlbiAtPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19JSUhfUFRQX0hFQURFUl9TSVpFKTsKLQlwcHRyID0gcCArIChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0lJSF9QVFBfSEVBREVSX1NJWkUpOwotCWJyZWFrOwotCi0gICAgY2FzZSBJU0lTX1BEVV9MMV9MU1A6Ci0gICAgY2FzZSBJU0lTX1BEVV9MMl9MU1A6Ci0JaWYgKGlzaXNfaGVhZGVyLT5maXhlZF9sZW4gIT0gKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfTFNQX0hFQURFUl9TSVpFKSkgewotCSAgICBwcmludGYoIiwgYm9ndXMgZml4ZWQgaGVhZGVyIGxlbmd0aCAldSBzaG91bGQgYmUgJWx1IiwKLQkJICAgaXNpc19oZWFkZXItPmZpeGVkX2xlbiwgKHVuc2lnbmVkIGxvbmcpSVNJU19MU1BfSEVBREVSX1NJWkUpOwotCSAgICByZXR1cm4gKDApOwotCX0KLQotCXBkdV9sZW49RVhUUkFDVF8xNkJJVFMoaGVhZGVyX2xzcC0+cGR1X2xlbik7Ci0JaWYgKHBhY2tldF9sZW4+cGR1X2xlbikgewotICAgICAgICAgICAgcGFja2V0X2xlbj1wZHVfbGVuOyAvKiBkbyBUTFYgZGVjb2RpbmcgYXMgbG9uZyBhcyBpdCBtYWtlcyBzZW5zZSAqLwotICAgICAgICAgICAgbGVuZ3RoPXBkdV9sZW47Ci0JfQotCi0JVENIRUNLKCpoZWFkZXJfbHNwKTsKLQlwcmludGYoIlxuXHQgIGxzcC1pZDogJXMsIHNlcTogMHglMDh4LCBsaWZldGltZTogJTV1c1xuXHQgIGNoa3N1bTogMHglMDR4IiwKLSAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQoaGVhZGVyX2xzcC0+bHNwX2lkLCBMU1BfSURfTEVOKSwKLSAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGhlYWRlcl9sc3AtPnNlcXVlbmNlX251bWJlciksCi0gICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhoZWFkZXJfbHNwLT5yZW1haW5pbmdfbGlmZXRpbWUpLAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoaGVhZGVyX2xzcC0+Y2hlY2tzdW0pKTsKLQotICAgICAgICAvKiBpZiB0aGlzIGlzIGEgcHVyZ2UgZG8gbm90IGF0dGVtcHQgdG8gdmVyaWZ5IHRoZSBjaGVja3N1bSAqLwotICAgICAgICBpZiAoIEVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9sc3AtPnJlbWFpbmluZ19saWZldGltZSkgPT0gMCAmJgotICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKGhlYWRlcl9sc3AtPmNoZWNrc3VtKSA9PSAwKQotICAgICAgICAgICAgcHJpbnRmKCIgKHB1cmdlZCkiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLyogdmVyaWZ5IHRoZSBjaGVja3N1bSAtCi0gICAgICAgICAgICAgKiBjaGVja2luZyBzdGFydHMgYXQgdGhlIGxzcC1pZCBmaWVsZCBhdCBieXRlIHBvc2l0aW9uIFsxMl0KLSAgICAgICAgICAgICAqIGhlbmNlIHRoZSBsZW5ndGggbmVlZHMgdG8gYmUgcmVkdWNlZCBieSAxMiBieXRlcyAqLwotICAgICAgICAgICAgcHJpbnRmKCIgKCVzKSIsIChvc2lfY2tzdW0oKHVfaW50OF90ICopaGVhZGVyX2xzcC0+bHNwX2lkLCBsZW5ndGgtMTIpKSA/ICJpbmNvcnJlY3QiIDogImNvcnJlY3QiKTsKLQotCXByaW50ZigiLCBQRFUgbGVuZ3RoOiAldSwgRmxhZ3M6IFsgJXMiLAotICAgICAgICAgICAgICAgcGR1X2xlbiwKLSAgICAgICAgICAgICAgIElTSVNfTUFTS19MU1BfT0xfQklUKGhlYWRlcl9sc3AtPnR5cGVibG9jaykgPyAiT3ZlcmxvYWQgYml0IHNldCwgIiA6ICIiKTsKLQotCWlmIChJU0lTX01BU0tfTFNQX0FUVF9CSVRTKGhlYWRlcl9sc3AtPnR5cGVibG9jaykpIHsKLQkgICAgcHJpbnRmKCIlcyIsIElTSVNfTUFTS19MU1BfQVRUX0RFRkFVTFRfQklUKGhlYWRlcl9sc3AtPnR5cGVibG9jaykgPyAiZGVmYXVsdCAiIDogIiIpOwotCSAgICBwcmludGYoIiVzIiwgSVNJU19NQVNLX0xTUF9BVFRfREVMQVlfQklUKGhlYWRlcl9sc3AtPnR5cGVibG9jaykgPyAiZGVsYXkgIiA6ICIiKTsKLQkgICAgcHJpbnRmKCIlcyIsIElTSVNfTUFTS19MU1BfQVRUX0VYUEVOU0VfQklUKGhlYWRlcl9sc3AtPnR5cGVibG9jaykgPyAiZXhwZW5zZSAiIDogIiIpOwotCSAgICBwcmludGYoIiVzIiwgSVNJU19NQVNLX0xTUF9BVFRfRVJST1JfQklUKGhlYWRlcl9sc3AtPnR5cGVibG9jaykgPyAiZXJyb3IgIiA6ICIiKTsKLQkgICAgcHJpbnRmKCJBVFQgYml0IHNldCwgIik7Ci0JfQotCXByaW50ZigiJXMiLCBJU0lTX01BU0tfTFNQX1BBUlRJVElPTl9CSVQoaGVhZGVyX2xzcC0+dHlwZWJsb2NrKSA/ICJQIGJpdCBzZXQsICIgOiAiIik7Ci0JcHJpbnRmKCIlcyBdIiwgdG9rMnN0cihpc2lzX2xzcF9pc3R5cGVfdmFsdWVzLCJVbmtub3duKDB4JXgpIixJU0lTX01BU0tfTFNQX0lTVFlQRV9CSVRTKGhlYWRlcl9sc3AtPnR5cGVibG9jaykpKTsKLQotICAgICAgICBpZiAodmZsYWcgPiAxKSB7Ci0gICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICIsSVNJU19MU1BfSEVBREVSX1NJWkUpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQotCi0JcGFja2V0X2xlbiAtPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19MU1BfSEVBREVSX1NJWkUpOwotCXBwdHIgPSBwICsgKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfTFNQX0hFQURFUl9TSVpFKTsKLQlicmVhazsKLQotICAgIGNhc2UgSVNJU19QRFVfTDFfQ1NOUDoKLSAgICBjYXNlIElTSVNfUERVX0wyX0NTTlA6Ci0JaWYgKGlzaXNfaGVhZGVyLT5maXhlZF9sZW4gIT0gKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfQ1NOUF9IRUFERVJfU0laRSkpIHsKLQkgICAgcHJpbnRmKCIsIGJvZ3VzIGZpeGVkIGhlYWRlciBsZW5ndGggJXUgc2hvdWxkIGJlICVsdSIsCi0JCSAgIGlzaXNfaGVhZGVyLT5maXhlZF9sZW4sICh1bnNpZ25lZCBsb25nKUlTSVNfQ1NOUF9IRUFERVJfU0laRSk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotCi0JcGR1X2xlbj1FWFRSQUNUXzE2QklUUyhoZWFkZXJfY3NucC0+cGR1X2xlbik7Ci0JaWYgKHBhY2tldF9sZW4+cGR1X2xlbikgewotICAgICAgICAgICAgcGFja2V0X2xlbj1wZHVfbGVuOyAvKiBkbyBUTFYgZGVjb2RpbmcgYXMgbG9uZyBhcyBpdCBtYWtlcyBzZW5zZSAqLwotICAgICAgICAgICAgbGVuZ3RoPXBkdV9sZW47Ci0JfQotCi0JVENIRUNLKCpoZWFkZXJfY3NucCk7Ci0JcHJpbnRmKCJcblx0ICBzb3VyY2UtaWQ6ICAgICVzLCBQRFUgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9jc25wLT5zb3VyY2VfaWQsIE5PREVfSURfTEVOKSwKLSAgICAgICAgICAgICAgIHBkdV9sZW4pOwotCXByaW50ZigiXG5cdCAgc3RhcnQgbHNwLWlkOiAlcyIsCi0gICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9jc25wLT5zdGFydF9sc3BfaWQsIExTUF9JRF9MRU4pKTsKLQlwcmludGYoIlxuXHQgIGVuZCBsc3AtaWQ6ICAgJXMiLAotICAgICAgICAgICAgICAgaXNpc19wcmludF9pZChoZWFkZXJfY3NucC0+ZW5kX2xzcF9pZCwgTFNQX0lEX0xFTikpOwotCi0gICAgICAgIGlmICh2ZmxhZyA+IDEpIHsKLSAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixJU0lTX0NTTlBfSEVBREVSX1NJWkUpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQotCi0JcGFja2V0X2xlbiAtPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19DU05QX0hFQURFUl9TSVpFKTsKLQlwcHRyID0gcCArIChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX0NTTlBfSEVBREVSX1NJWkUpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgSVNJU19QRFVfTDFfUFNOUDoKLSAgICBjYXNlIElTSVNfUERVX0wyX1BTTlA6Ci0JaWYgKGlzaXNfaGVhZGVyLT5maXhlZF9sZW4gIT0gKElTSVNfQ09NTU9OX0hFQURFUl9TSVpFK0lTSVNfUFNOUF9IRUFERVJfU0laRSkpIHsKLQkgICAgcHJpbnRmKCItIGJvZ3VzIGZpeGVkIGhlYWRlciBsZW5ndGggJXUgc2hvdWxkIGJlICVsdSIsCi0JCSAgIGlzaXNfaGVhZGVyLT5maXhlZF9sZW4sICh1bnNpZ25lZCBsb25nKUlTSVNfUFNOUF9IRUFERVJfU0laRSk7Ci0JICAgIHJldHVybiAoMCk7Ci0JfQotCi0JcGR1X2xlbj1FWFRSQUNUXzE2QklUUyhoZWFkZXJfcHNucC0+cGR1X2xlbik7Ci0JaWYgKHBhY2tldF9sZW4+cGR1X2xlbikgewotICAgICAgICAgICAgcGFja2V0X2xlbj1wZHVfbGVuOyAvKiBkbyBUTFYgZGVjb2RpbmcgYXMgbG9uZyBhcyBpdCBtYWtlcyBzZW5zZSAqLwotICAgICAgICAgICAgbGVuZ3RoPXBkdV9sZW47Ci0JfQotCi0JVENIRUNLKCpoZWFkZXJfcHNucCk7Ci0JcHJpbnRmKCJcblx0ICBzb3VyY2UtaWQ6ICAgICVzLCBQRFUgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICBpc2lzX3ByaW50X2lkKGhlYWRlcl9wc25wLT5zb3VyY2VfaWQsIE5PREVfSURfTEVOKSwKLSAgICAgICAgICAgICAgIHBkdV9sZW4pOwotCi0gICAgICAgIGlmICh2ZmxhZyA+IDEpIHsKLSAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgIixJU0lTX1BTTlBfSEVBREVSX1NJWkUpKQotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQotCi0JcGFja2V0X2xlbiAtPSAoSVNJU19DT01NT05fSEVBREVSX1NJWkUrSVNJU19QU05QX0hFQURFUl9TSVpFKTsKLQlwcHRyID0gcCArIChJU0lTX0NPTU1PTl9IRUFERVJfU0laRStJU0lTX1BTTlBfSEVBREVSX1NJWkUpOwotCWJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQlpZighcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQgICIsbGVuZ3RoKSkKLQkgICAgcmV0dXJuKDApOwotCXJldHVybiAoMCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOb3cgcHJpbnQgdGhlIFRMVidzLgotICAgICAqLwotCi0gICAgd2hpbGUgKHBhY2tldF9sZW4gPj0gMikgewotICAgICAgICBpZiAocHB0ciA9PSBzbmFwZW5kKSB7Ci0JICAgIHJldHVybiAoMSk7Ci0gICAgICAgIH0KLQotCWlmICghVFRFU1QyKCpwcHRyLCAyKSkgewotCSAgICBwcmludGYoIlxuXHRcdCBwYWNrZXQgZXhjZWVkZWQgc25hcHNob3QgKCVsZCkgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgIChsb25nKShwcHRyLXNuYXBlbmQpKTsKLQkgICAgcmV0dXJuICgxKTsKLQl9Ci0JdGx2X3R5cGUgPSAqcHB0cisrOwotCXRsdl9sZW4gPSAqcHB0cisrOwotICAgICAgICB0bXAgPXRsdl9sZW47IC8qIGNvcHkgdGVtcG9yYXJ5IGxlbiAmIHBvaW50ZXIgdG8gcGFja2V0IGRhdGEgKi8KLSAgICAgICAgdHB0ciA9IHBwdHI7Ci0JcGFja2V0X2xlbiAtPSAyOwotCWlmICh0bHZfbGVuID4gcGFja2V0X2xlbikgewotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgICAgLyogZmlyc3QgbGV0cyBzZWUgaWYgd2Uga25vdyB0aGUgVExWcyBuYW1lKi8KLQlwcmludGYoIlxuXHQgICAgJXMgVExWICMldSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGlzaXNfdGx2X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICB0bHZfdHlwZSksCi0gICAgICAgICAgICAgICB0bHZfdHlwZSwKLSAgICAgICAgICAgICAgIHRsdl9sZW4pOwotCi0gICAgICAgIGlmICh0bHZfbGVuID09IDApIC8qIHNvbWV0aGluZyBpcyBtYWxmb3JtZWQgKi8KLQkgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogbm93IGNoZWNrIGlmIHdlIGhhdmUgYSBkZWNvZGVyIG90aGVyd2lzZSBkbyBhIGhleGR1bXAgYXQgdGhlIGVuZCovCi0Jc3dpdGNoICh0bHZfdHlwZSkgewotCWNhc2UgSVNJU19UTFZfQVJFQV9BRERSOgotCSAgICBpZiAoIVRURVNUMigqdHB0ciwgMSkpCi0JCWdvdG8gdHJ1bmN0bHY7Ci0JICAgIGFsZW4gPSAqdHB0cisrOwotCSAgICB3aGlsZSAodG1wICYmIGFsZW4gPCB0bXApIHsKLQkJcHJpbnRmKCJcblx0ICAgICAgQXJlYSBhZGRyZXNzIChsZW5ndGg6ICV1KTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBhbGVuLAotICAgICAgICAgICAgICAgICAgICAgICBpc29uc2FwX3N0cmluZyh0cHRyLGFsZW4pKTsKLQkJdHB0ciArPSBhbGVuOwotCQl0bXAgLT0gYWxlbiArIDE7Ci0JCWlmICh0bXA9PTApIC8qIGlmIHRoaXMgaXMgdGhlIGxhc3QgYXJlYSBhZGRyZXNzIGRvIG5vdCBhdHRlbXQgYSBib3VuZGFyeSBjaGVjayAqLwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJaWYgKCFUVEVTVDIoKnRwdHIsIDEpKQotCQkgICAgZ290byB0cnVuY3RsdjsKLQkJYWxlbiA9ICp0cHRyKys7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0JY2FzZSBJU0lTX1RMVl9JU05FSUdIOgotCSAgICB3aGlsZSAodG1wID49IEVUSEVSX0FERFJfTEVOKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIEVUSEVSX0FERFJfTEVOKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBTTlBBOiAlcyIsaXNpc19wcmludF9pZCh0cHRyLEVUSEVSX0FERFJfTEVOKSk7Ci0gICAgICAgICAgICAgICAgdG1wIC09IEVUSEVSX0FERFJfTEVOOwotICAgICAgICAgICAgICAgIHRwdHIgKz0gRVRIRVJfQUREUl9MRU47Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJU0lTX1RMVl9JU05FSUdIX1ZBUkxFTjoKLSAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCAxKSB8fCB0bXAgPCAzKSAvKiBtaW4uIFRMViBsZW5ndGggKi8KLQkJZ290byB0cnVuY3RsdjsKLQkgICAgbGFuX2FsZW4gPSAqdHB0cisrOyAvKiBMQU4gYWRkcmVzcyBsZW5ndGggKi8KLQkgICAgaWYgKGxhbl9hbGVuID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBMQU4gYWRkcmVzcyBsZW5ndGggMCBieXRlcyAoaW52YWxpZCkiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcCAtLTsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIExBTiBhZGRyZXNzIGxlbmd0aCAldSBieXRlcyAiLGxhbl9hbGVuKTsKLQkgICAgd2hpbGUgKHRtcCA+PSBsYW5fYWxlbikgewotICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBsYW5fYWxlbikpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRJUyBOZWlnaGJvcjogJXMiLGlzaXNfcHJpbnRfaWQodHB0cixsYW5fYWxlbikpOwotICAgICAgICAgICAgICAgIHRtcCAtPSBsYW5fYWxlbjsKLSAgICAgICAgICAgICAgICB0cHRyICs9bGFuX2FsZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotCWNhc2UgSVNJU19UTFZfUEFERElORzoKLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJU0lTX1RMVl9NVF9JU19SRUFDSDoKLSAgICAgICAgICAgIHdoaWxlICh0bXAgPj0gMitOT0RFX0lEX0xFTiszKzEpIHsKLSAgICAgICAgICAgICAgICBtdF9sZW4gPSBpc2lzX3ByaW50X210aWQodHB0ciwgIlxuXHQgICAgICAiKTsKLSAgICAgICAgICAgICAgICBpZiAobXRfbGVuID09IDApIC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLwotICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OwotICAgICAgICAgICAgICAgIHRwdHIrPW10X2xlbjsKLSAgICAgICAgICAgICAgICB0bXAtPW10X2xlbjsKLQotICAgICAgICAgICAgICAgIGV4dF9pc19sZW4gPSBpc2lzX3ByaW50X2V4dF9pc19yZWFjaCh0cHRyLCJcblx0ICAgICAgIix0bHZfdHlwZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dF9pc19sZW4gPT0gMCkgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgdG1wLT1leHRfaXNfbGVuOwotICAgICAgICAgICAgICAgIHRwdHIrPWV4dF9pc19sZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIElTSVNfVExWX0lTX0FMSUFTX0lEOgotCSAgICB3aGlsZSAodG1wID49IE5PREVfSURfTEVOKzEpIHsgLyogaXMgaXQgd29ydGggYXR0ZW1wdGluZyBhIGRlY29kZSA/ICovCi0JICAgICAgICBleHRfaXNfbGVuID0gaXNpc19wcmludF9leHRfaXNfcmVhY2godHB0ciwiXG5cdCAgICAgICIsdGx2X3R5cGUpOwotCQlpZiAoZXh0X2lzX2xlbiA9PSAwKSAvKiBkaWQgc29tZXRoaW5nIGdvIHdyb25nID8gKi8KLQkgICAgICAgICAgICBnb3RvIHRydW5jdGx2OwotCQl0bXAtPWV4dF9pc19sZW47Ci0JCXRwdHIrPWV4dF9pc19sZW47Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJU0lTX1RMVl9FWFRfSVNfUkVBQ0g6Ci0gICAgICAgICAgICB3aGlsZSAodG1wID49IE5PREVfSURfTEVOKzMrMSkgeyAvKiBpcyBpdCB3b3J0aCBhdHRlbXB0aW5nIGEgZGVjb2RlID8gKi8KLSAgICAgICAgICAgICAgICBleHRfaXNfbGVuID0gaXNpc19wcmludF9leHRfaXNfcmVhY2godHB0ciwiXG5cdCAgICAgICIsdGx2X3R5cGUpOwotICAgICAgICAgICAgICAgIGlmIChleHRfaXNfbGVuID09IDApIC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLwotICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB0bXAtPWV4dF9pc19sZW47Ci0gICAgICAgICAgICAgICAgdHB0cis9ZXh0X2lzX2xlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElTSVNfVExWX0lTX1JFQUNIOgotCSAgICBpZiAoIVRURVNUMigqdHB0ciwxKSkgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIG9uZSBieXRlIGxlZnQgdG8gcmVhZCBvdXQgdGhlIHZpcnR1YWwgZmxhZyAqLwotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcyIsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihpc2lzX2lzX3JlYWNoX3ZpcnR1YWxfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvZ3VzIHZpcnR1YWwgZmxhZyAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKnRwdHIrKykpOwotCSAgICB0bHZfaXNfcmVhY2ggPSAoY29uc3Qgc3RydWN0IGlzaXNfdGx2X2lzX3JlYWNoICopdHB0cjsKLSAgICAgICAgICAgIHdoaWxlICh0bXAgPj0gc2l6ZW9mKHN0cnVjdCBpc2lzX3Rsdl9pc19yZWFjaCkpIHsKLQkJaWYgKCFUVEVTVCgqdGx2X2lzX3JlYWNoKSkKLQkJICAgIGdvdG8gdHJ1bmN0bHY7Ci0JCXByaW50ZigiXG5cdCAgICAgIElTIE5laWdoYm9yOiAlcyIsCi0JCSAgICAgICBpc2lzX3ByaW50X2lkKHRsdl9pc19yZWFjaC0+bmVpZ2hib3Jfbm9kZWlkLCBOT0RFX0lEX0xFTikpOwotICAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfbWV0cmljX2Jsb2NrKCZ0bHZfaXNfcmVhY2gtPmlzaXNfbWV0cmljX2Jsb2NrKTsKLQkJdG1wIC09IHNpemVvZihzdHJ1Y3QgaXNpc190bHZfaXNfcmVhY2gpOwotCQl0bHZfaXNfcmVhY2grKzsKLQkgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJU0lTX1RMVl9FU05FSUdIOgotCSAgICB0bHZfZXNfcmVhY2ggPSAoY29uc3Qgc3RydWN0IGlzaXNfdGx2X2VzX3JlYWNoICopdHB0cjsKLSAgICAgICAgICAgIHdoaWxlICh0bXAgPj0gc2l6ZW9mKHN0cnVjdCBpc2lzX3Rsdl9lc19yZWFjaCkpIHsKLQkJaWYgKCFUVEVTVCgqdGx2X2VzX3JlYWNoKSkKLQkJICAgIGdvdG8gdHJ1bmN0bHY7Ci0JCXByaW50ZigiXG5cdCAgICAgIEVTIE5laWdoYm9yOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlzaXNfcHJpbnRfaWQodGx2X2VzX3JlYWNoLT5uZWlnaGJvcl9zeXNpZCxTWVNURU1fSURfTEVOKSk7Ci0gICAgICAgICAgICAgICAgaXNpc19wcmludF9tZXRyaWNfYmxvY2soJnRsdl9lc19yZWFjaC0+aXNpc19tZXRyaWNfYmxvY2spOwotCQl0bXAgLT0gc2l6ZW9mKHN0cnVjdCBpc2lzX3Rsdl9lc19yZWFjaCk7Ci0JCXRsdl9lc19yZWFjaCsrOwotCSAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogdGhvc2UgdHdvIFRMVnMgc2hhcmUgdGhlIHNhbWUgZm9ybWF0ICovCi0JY2FzZSBJU0lTX1RMVl9JTlRfSVBfUkVBQ0g6Ci0JY2FzZSBJU0lTX1RMVl9FWFRfSVBfUkVBQ0g6Ci0JICAgIGlmICghaXNpc19wcmludF90bHZfaXBfcmVhY2gocHB0ciwgIlxuXHQgICAgICAiLCB0bHZfbGVuKSkKLQkJcmV0dXJuICgxKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIElTSVNfVExWX0VYVERfSVBfUkVBQ0g6Ci0JICAgIHdoaWxlICh0bXA+MCkgewotICAgICAgICAgICAgICAgIGV4dF9pcF9sZW4gPSBpc2lzX3ByaW50X2V4dGRfaXBfcmVhY2godHB0ciwgIlxuXHQgICAgICAiLCBJUFY0KTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0X2lwX2xlbiA9PSAwKSAvKiBkaWQgc29tZXRoaW5nIGdvIHdyb25nID8gKi8KLSAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLSAgICAgICAgICAgICAgICB0cHRyKz1leHRfaXBfbGVuOwotCQl0bXAtPWV4dF9pcF9sZW47Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJU0lTX1RMVl9NVF9JUF9SRUFDSDoKLSAgICAgICAgICAgIG10X2xlbiA9IGlzaXNfcHJpbnRfbXRpZCh0cHRyLCAiXG5cdCAgICAgICIpOwotICAgICAgICAgICAgaWYgKG10X2xlbiA9PSAwKSB7IC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLwotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cHRyKz1tdF9sZW47Ci0gICAgICAgICAgICB0bXAtPW10X2xlbjsKLQotICAgICAgICAgICAgd2hpbGUgKHRtcD4wKSB7Ci0gICAgICAgICAgICAgICAgZXh0X2lwX2xlbiA9IGlzaXNfcHJpbnRfZXh0ZF9pcF9yZWFjaCh0cHRyLCAiXG5cdCAgICAgICIsIElQVjQpOwotICAgICAgICAgICAgICAgIGlmIChleHRfaXBfbGVuID09IDApIC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLwotICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OwotICAgICAgICAgICAgICAgIHRwdHIrPWV4dF9pcF9sZW47Ci0JCXRtcC09ZXh0X2lwX2xlbjsKLQkgICAgfQotCSAgICBicmVhazsKLQotI2lmZGVmIElORVQ2Ci0JY2FzZSBJU0lTX1RMVl9JUDZfUkVBQ0g6Ci0JICAgIHdoaWxlICh0bXA+MCkgewotICAgICAgICAgICAgICAgIGV4dF9pcF9sZW4gPSBpc2lzX3ByaW50X2V4dGRfaXBfcmVhY2godHB0ciwgIlxuXHQgICAgICAiLCBJUFY2KTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0X2lwX2xlbiA9PSAwKSAvKiBkaWQgc29tZXRoaW5nIGdvIHdyb25nID8gKi8KLSAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLSAgICAgICAgICAgICAgICB0cHRyKz1leHRfaXBfbGVuOwotCQl0bXAtPWV4dF9pcF9sZW47Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIElTSVNfVExWX01UX0lQNl9SRUFDSDoKLSAgICAgICAgICAgIG10X2xlbiA9IGlzaXNfcHJpbnRfbXRpZCh0cHRyLCAiXG5cdCAgICAgICIpOwotICAgICAgICAgICAgaWYgKG10X2xlbiA9PSAwKSB7IC8qIGRpZCBzb21ldGhpbmcgZ28gd3JvbmcgPyAqLwotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cHRyKz1tdF9sZW47Ci0gICAgICAgICAgICB0bXAtPW10X2xlbjsKLQotCSAgICB3aGlsZSAodG1wPjApIHsKLSAgICAgICAgICAgICAgICBleHRfaXBfbGVuID0gaXNpc19wcmludF9leHRkX2lwX3JlYWNoKHRwdHIsICJcblx0ICAgICAgIiwgSVBWNik7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dF9pcF9sZW4gPT0gMCkgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgdHB0cis9ZXh0X2lwX2xlbjsKLQkJdG1wLT1leHRfaXBfbGVuOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9JUDZBRERSOgotCSAgICB3aGlsZSAodG1wPj1zaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgewotCQlpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKQotCQkgICAgZ290byB0cnVuY3RsdjsKLQotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIElQdjYgaW50ZXJmYWNlIGFkZHJlc3M6ICVzIiwKLQkJICAgICAgIGlwNmFkZHJfc3RyaW5nKHRwdHIpKTsKLQotCQl0cHRyICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwotCQl0bXAgLT0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0jZW5kaWYKLQljYXNlIElTSVNfVExWX0FVVEg6Ci0JICAgIGlmICghVFRFU1QyKCp0cHRyLCAxKSkKLQkJZ290byB0cnVuY3RsdjsKLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXM6ICIsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihpc2lzX3N1YnRsdl9hdXRoX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIEF1dGhlbnRpY2F0aW9uIHR5cGUgMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cHRyKSk7Ci0KLQkgICAgc3dpdGNoICgqdHB0cikgewotCSAgICBjYXNlIElTSVNfU1VCVExWX0FVVEhfU0lNUExFOgotCQlmb3IoaT0xO2k8dGx2X2xlbjtpKyspIHsKLQkJICAgIGlmICghVFRFU1QyKCoodHB0citpKSwgMSkpCi0JCQlnb3RvIHRydW5jdGx2OwotCQkgICAgcHJpbnRmKCIlYyIsKih0cHRyK2kpKTsKLQkJfQotCQlicmVhazsKLQkgICAgY2FzZSBJU0lTX1NVQlRMVl9BVVRIX01ENToKLQkJZm9yKGk9MTtpPHRsdl9sZW47aSsrKSB7Ci0JCSAgICBpZiAoIVRURVNUMigqKHRwdHIraSksIDEpKQotCQkJZ290byB0cnVuY3RsdjsKLQkJICAgIHByaW50ZigiJTAyeCIsKih0cHRyK2kpKTsKLQkJfQotCQlpZiAodGx2X2xlbiAhPSBJU0lTX1NVQlRMVl9BVVRIX01ENV9MRU4rMSkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIChtYWxmb3JtZWQgc3ViVExWKSAiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgSVNJU19TVUJUTFZfQVVUSF9QUklWQVRFOgotCSAgICBkZWZhdWx0OgotCQlpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrMSwiXG5cdFx0ICAiLHRsdl9sZW4tMSkpCi0JCSAgICByZXR1cm4oMCk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9QVFBfQURKOgotCSAgICB0bHZfcHRwX2FkaiA9IChjb25zdCBzdHJ1Y3QgaXNpc190bHZfcHRwX2FkaiAqKXRwdHI7Ci0JICAgIGlmKHRtcD49MSkgewotCQlpZiAoIVRURVNUMigqdHB0ciwgMSkpCi0JCSAgICBnb3RvIHRydW5jdGx2OwotCQlwcmludGYoIlxuXHQgICAgICBBZGphY2VuY3kgU3RhdGU6ICVzICgldSkiLAotCQkgICAgICAgdG9rMnN0cihpc2lzX3B0cF9hZGphbmNleV92YWx1ZXMsICJ1bmtub3duIiwgKnRwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgKnRwdHIpOwotCQl0bXAtLTsKLQkgICAgfQotCSAgICBpZih0bXA+c2l6ZW9mKHRsdl9wdHBfYWRqLT5leHRkX2xvY2FsX2NpcmN1aXRfaWQpKSB7Ci0JCWlmICghVFRFU1QyKHRsdl9wdHBfYWRqLT5leHRkX2xvY2FsX2NpcmN1aXRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRsdl9wdHBfYWRqLT5leHRkX2xvY2FsX2NpcmN1aXRfaWQpKSkKLQkJICAgIGdvdG8gdHJ1bmN0bHY7Ci0JCXByaW50ZigiXG5cdCAgICAgIEV4dGVuZGVkIExvY2FsIGNpcmN1aXQtSUQ6IDB4JTA4eCIsCi0JCSAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRwX2Fkai0+ZXh0ZF9sb2NhbF9jaXJjdWl0X2lkKSk7Ci0JCXRtcC09c2l6ZW9mKHRsdl9wdHBfYWRqLT5leHRkX2xvY2FsX2NpcmN1aXRfaWQpOwotCSAgICB9Ci0JICAgIGlmKHRtcD49U1lTVEVNX0lEX0xFTikgewotCQlpZiAoIVRURVNUMih0bHZfcHRwX2Fkai0+bmVpZ2hib3Jfc3lzaWQsIFNZU1RFTV9JRF9MRU4pKQotCQkgICAgZ290byB0cnVuY3RsdjsKLQkJcHJpbnRmKCJcblx0ICAgICAgTmVpZ2hib3IgU3lzdGVtLUlEOiAlcyIsCi0JCSAgICAgICBpc2lzX3ByaW50X2lkKHRsdl9wdHBfYWRqLT5uZWlnaGJvcl9zeXNpZCxTWVNURU1fSURfTEVOKSk7Ci0JCXRtcC09U1lTVEVNX0lEX0xFTjsKLQkgICAgfQotCSAgICBpZih0bXA+PXNpemVvZih0bHZfcHRwX2Fkai0+bmVpZ2hib3JfZXh0ZF9sb2NhbF9jaXJjdWl0X2lkKSkgewotCQlpZiAoIVRURVNUMih0bHZfcHRwX2Fkai0+bmVpZ2hib3JfZXh0ZF9sb2NhbF9jaXJjdWl0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bHZfcHRwX2Fkai0+bmVpZ2hib3JfZXh0ZF9sb2NhbF9jaXJjdWl0X2lkKSkpCi0JCSAgICBnb3RvIHRydW5jdGx2OwotCQlwcmludGYoIlxuXHQgICAgICBOZWlnaGJvciBFeHRlbmRlZCBMb2NhbCBjaXJjdWl0LUlEOiAweCUwOHgiLAotCQkgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0cF9hZGotPm5laWdoYm9yX2V4dGRfbG9jYWxfY2lyY3VpdF9pZCkpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9QUk9UT0NPTFM6Ci0JICAgIHByaW50ZigiXG5cdCAgICAgIE5MUElEKHMpOiAiKTsKLQkgICAgd2hpbGUgKHRtcD4wKSB7Ci0JCWlmICghVFRFU1QyKCoodHB0ciksIDEpKQotCQkgICAgZ290byB0cnVuY3RsdjsKLQkJcHJpbnRmKCIlcyAoMHglMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobmxwaWRfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICp0cHRyKTsKLQkJaWYgKHRtcD4xKSAvKiBmdXJ0aGVyIE5QTElEcyA/IC0gcHV0IGNvbW1hICovCi0JCSAgICBwcmludGYoIiwgIik7Ci0gICAgICAgICAgICAgICAgdHB0cisrOwotICAgICAgICAgICAgICAgIHRtcC0tOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9URV9ST1VURVJfSUQ6Ci0JICAgIGlmICghVFRFU1QyKCpwcHRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSkKLQkJZ290byB0cnVuY3RsdjsKLQkgICAgcHJpbnRmKCJcblx0ICAgICAgVHJhZmZpYyBFbmdpbmVlcmluZyBSb3V0ZXIgSUQ6ICVzIiwgaXBhZGRyX3N0cmluZyhwcHRyKSk7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9JUEFERFI6Ci0JICAgIHdoaWxlICh0bXA+PXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKLQkJaWYgKCFUVEVTVDIoKnRwdHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQotCQkgICAgZ290byB0cnVuY3RsdjsKLQkJcHJpbnRmKCJcblx0ICAgICAgSVB2NCBpbnRlcmZhY2UgYWRkcmVzczogJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKLQkJdHB0ciArPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwotCQl0bXAgLT0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCWNhc2UgSVNJU19UTFZfSE9TVE5BTUU6Ci0JICAgIHByaW50ZigiXG5cdCAgICAgIEhvc3RuYW1lOiAiKTsKLQkgICAgd2hpbGUgKHRtcD4wKSB7Ci0JCWlmICghVFRFU1QyKCp0cHRyLCAxKSkKLQkJICAgIGdvdG8gdHJ1bmN0bHY7Ci0JCXByaW50ZigiJWMiLCp0cHRyKyspOwotICAgICAgICAgICAgICAgIHRtcC0tOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9TSEFSRURfUklTS19HUk9VUDoKLQkgICAgaWYgKHRtcCA8IE5PREVfSURfTEVOKQotCSAgICAgICAgYnJlYWs7Ci0JICAgIGlmICghVFRFU1QyKCp0cHRyLCBOT0RFX0lEX0xFTikpCi0gICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLQkgICAgcHJpbnRmKCJcblx0ICAgICAgSVMgTmVpZ2hib3I6ICVzIiwgaXNpc19wcmludF9pZCh0cHRyLCBOT0RFX0lEX0xFTikpOwotCSAgICB0cHRyKz0oTk9ERV9JRF9MRU4pOwotCSAgICB0bXAtPShOT0RFX0lEX0xFTik7Ci0KLQkgICAgaWYgKHRtcCA8IDEpCi0JICAgICAgICBicmVhazsKLQkgICAgaWYgKCFUVEVTVDIoKnRwdHIsIDEpKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0JICAgIHByaW50ZigiLCBGbGFnczogWyVzXSIsIElTSVNfTUFTS19UTFZfU0hBUkVEX1JJU0tfR1JPVVAoKnRwdHIrKykgPyAibnVtYmVyZWQiIDogInVubnVtYmVyZWQiKTsKLQkgICAgdG1wLS07Ci0KLQkgICAgaWYgKHRtcCA8IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpCi0JICAgICAgICBicmVhazsKLQkgICAgaWYgKCFUVEVTVDIoKnRwdHIsc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpCi0gICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLQkgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NCBpbnRlcmZhY2UgYWRkcmVzczogJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKLQkgICAgdHB0cis9c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkgICAgdG1wLT1zaXplb2Yoc3RydWN0IGluX2FkZHIpOwotCi0JICAgIGlmICh0bXAgPCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKQotCSAgICAgICAgYnJlYWs7Ci0JICAgIGlmICghVFRFU1QyKCp0cHRyLHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0JICAgIHByaW50ZigiXG5cdCAgICAgIElQdjQgbmVpZ2hib3IgYWRkcmVzczogJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKLQkgICAgdHB0cis9c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkgICAgdG1wLT1zaXplb2Yoc3RydWN0IGluX2FkZHIpOwotCi0JICAgIHdoaWxlICh0bXA+PTQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgNCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgTGluay1JRDogMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOwotICAgICAgICAgICAgICAgIHRwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgdG1wLT00OwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9MU1A6Ci0JICAgIHRsdl9sc3AgPSAoY29uc3Qgc3RydWN0IGlzaXNfdGx2X2xzcCAqKXRwdHI7Ci0JICAgIHdoaWxlKHRtcD49c2l6ZW9mKHN0cnVjdCBpc2lzX3Rsdl9sc3ApKSB7Ci0JCWlmICghVFRFU1QoKHRsdl9sc3AtPmxzcF9pZClbTFNQX0lEX0xFTi0xXSkpCi0JCSAgICBnb3RvIHRydW5jdGx2OwotCQlwcmludGYoIlxuXHQgICAgICBsc3AtaWQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaXNpc19wcmludF9pZCh0bHZfbHNwLT5sc3BfaWQsIExTUF9JRF9MRU4pKTsKLQkJaWYgKCFUVEVTVDIodGx2X2xzcC0+c2VxdWVuY2VfbnVtYmVyLCA0KSkKLQkJICAgIGdvdG8gdHJ1bmN0bHY7Ci0JCXByaW50ZigiLCBzZXE6IDB4JTA4eCIsRVhUUkFDVF8zMkJJVFModGx2X2xzcC0+c2VxdWVuY2VfbnVtYmVyKSk7Ci0JCWlmICghVFRFU1QyKHRsdl9sc3AtPnJlbWFpbmluZ19saWZldGltZSwgMikpCi0JCSAgICBnb3RvIHRydW5jdGx2OwotCQlwcmludGYoIiwgbGlmZXRpbWU6ICU1ZHMiLEVYVFJBQ1RfMTZCSVRTKHRsdl9sc3AtPnJlbWFpbmluZ19saWZldGltZSkpOwotCQlpZiAoIVRURVNUMih0bHZfbHNwLT5jaGVja3N1bSwgMikpCi0JCSAgICBnb3RvIHRydW5jdGx2OwotCQlwcmludGYoIiwgY2hrc3VtOiAweCUwNHgiLEVYVFJBQ1RfMTZCSVRTKHRsdl9sc3AtPmNoZWNrc3VtKSk7Ci0JCXRtcC09c2l6ZW9mKHN0cnVjdCBpc2lzX3Rsdl9sc3ApOwotCQl0bHZfbHNwKys7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQljYXNlIElTSVNfVExWX0NIRUNLU1VNOgotCSAgICBpZiAodG1wIDwgSVNJU19UTFZfQ0hFQ0tTVU1fTUlOTEVOKQotCSAgICAgICAgYnJlYWs7Ci0JICAgIGlmICghVFRFU1QyKCp0cHRyLCBJU0lTX1RMVl9DSEVDS1NVTV9NSU5MRU4pKQotCQlnb3RvIHRydW5jdGx2OwotCSAgICBwcmludGYoIlxuXHQgICAgICBjaGVja3N1bTogMHglMDR4ICIsIEVYVFJBQ1RfMTZCSVRTKHRwdHIpKTsKLSAgICAgICAgICAgIC8qIGRvIG5vdCBhdHRlbXB0IHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0gaWYgaXQgaXMgemVybwotICAgICAgICAgICAgICogbW9zdCBsaWtlbHkgYSBITUFDLU1ENSBUTFYgaXMgYWxzbyBwcmVzZW50IGFuZAotICAgICAgICAgICAgICogdG8gYXZvaWQgY29uZmxpY3RzIHRoZSBjaGVja3N1bSBUTFYgaXMgemVyb2VkLgotICAgICAgICAgICAgICogc2VlIHJmYzMzNTggZm9yIGRldGFpbHMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKEVYVFJBQ1RfMTZCSVRTKHRwdHIpID09IDApCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIodW52ZXJpZmllZCkiKTsKLSAgICAgICAgICAgIGVsc2UgcHJpbnRmKCIoJXMpIiwgb3NpX2Nrc3VtKG9wdHIsIGxlbmd0aCkgPyAiaW5jb3JyZWN0IiA6ICJjb3JyZWN0Iik7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9NVF9TVVBQT1JURUQ6Ci0gICAgICAgICAgICBpZiAodG1wIDwgSVNJU19UTFZfTVRfU1VQUE9SVEVEX01JTkxFTikKLSAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgd2hpbGUgKHRtcD4xKSB7Ci0JCS8qIGxlbmd0aCBjYW4gb25seSBiZSBhIG11bHRpcGxlIG9mIDIsIG90aGVyd2lzZSB0aGVyZSBpcwotCQkgICBzb21ldGhpbmcgYnJva2VuIC0+IHNvIGRlY29kZSBkb3duIHVudGlsIGxlbmd0aCBpcyAxICovCi0JCWlmICh0bXAhPTEpIHsKLSAgICAgICAgICAgICAgICAgICAgbXRfbGVuID0gaXNpc19wcmludF9tdGlkKHRwdHIsICJcblx0ICAgICAgIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtdF9sZW4gPT0gMCkgLyogZGlkIHNvbWV0aGluZyBnbyB3cm9uZyA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OwotICAgICAgICAgICAgICAgICAgICB0cHRyKz1tdF9sZW47Ci0gICAgICAgICAgICAgICAgICAgIHRtcC09bXRfbGVuOwotCQl9IGVsc2UgewotCQkgICAgcHJpbnRmKCJcblx0ICAgICAgbWFsZm9ybWVkIE1ULUlEIik7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSBJU0lTX1RMVl9SRVNUQVJUX1NJR05BTElORzoKLSAgICAgICAgICAgIC8qIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBmbGFncyAqLwotICAgICAgICAgICAgaWYgKHRtcCA8IElTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0ZMQUdMRU4pCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgSVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkdfRkxBR0xFTikpCi0gICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIEZsYWdzIFslc10iLAotICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIoaXNpc19yZXN0YXJ0X2ZsYWdfdmFsdWVzLCAibm9uZSIsICp0cHRyKSk7Ci0gICAgICAgICAgICB0cHRyKz1JU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19GTEFHTEVOOwotICAgICAgICAgICAgdG1wLT1JU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19GTEFHTEVOOwotCi0gICAgICAgICAgICAvKiBpcyB0aGVyZSBhbnl0aGluZyBvdGhlciB0aGFuIHRoZSBmbGFncyBmaWVsZD8gKi8KLSAgICAgICAgICAgIGlmICh0bXAgPT0gMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKHRtcCA8IElTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0hPTERUSU1FTEVOKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIElTSVNfVExWX1JFU1RBUlRfU0lHTkFMSU5HX0hPTERUSU1FTEVOKSkKLSAgICAgICAgICAgICAgICBnb3RvIHRydW5jdGx2OwotCi0gICAgICAgICAgICBwcmludGYoIiwgUmVtYWluaW5nIGhvbGRpbmcgdGltZSAldXMiLCBFWFRSQUNUXzE2QklUUyh0cHRyKSk7Ci0gICAgICAgICAgICB0cHRyKz1JU0lTX1RMVl9SRVNUQVJUX1NJR05BTElOR19IT0xEVElNRUxFTjsKLSAgICAgICAgICAgIHRtcC09SVNJU19UTFZfUkVTVEFSVF9TSUdOQUxJTkdfSE9MRFRJTUVMRU47Ci0KLSAgICAgICAgICAgIC8qIGlzIHRoZXJlIGFuIGFkZGl0aW9uYWwgc3lzaWQgZmllbGQgcHJlc2VudCA/Ki8KLSAgICAgICAgICAgIGlmICh0bXAgPT0gU1lTVEVNX0lEX0xFTikgewotICAgICAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgU1lTVEVNX0lEX0xFTikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIGZvciAlcyIsaXNpc19wcmludF9pZCh0cHRyLFNZU1RFTV9JRF9MRU4pKTsKLSAgICAgICAgICAgIH0gCi0JICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNJU19UTFZfSURSUF9JTkZPOgotCSAgICBpZiAodG1wIDwgSVNJU19UTFZfSURSUF9JTkZPX01JTkxFTikKLQkgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIElTSVNfVExWX0lEUlBfSU5GT19NSU5MRU4pKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBJbnRlci1Eb21haW4gSW5mb3JtYXRpb24gVHlwZTogJXMiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIoaXNpc19zdWJ0bHZfaWRycF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biAoMHglMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cikpOwotICAgICAgICAgICAgc3dpdGNoICgqdHB0cisrKSB7Ci0gICAgICAgICAgICBjYXNlIElTSVNfU1VCVExWX0lEUlBfQVNOOgotICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCAyKSkgLyogZmV0Y2ggQVMgbnVtYmVyICovCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJBUyBOdW1iZXI6ICV1IixFWFRSQUNUXzE2QklUUyh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIElTSVNfU1VCVExWX0lEUlBfTE9DQUw6Ci0gICAgICAgICAgICBjYXNlIElTSVNfU1VCVExWX0lEUlBfUkVTOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHQgICAgICAiLHRsdl9sZW4tMSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNJU19UTFZfTFNQX0JVRkZFUlNJWkU6Ci0JICAgIGlmICh0bXAgPCBJU0lTX1RMVl9MU1BfQlVGRkVSU0laRV9NSU5MRU4pCi0JICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBJU0lTX1RMVl9MU1BfQlVGRkVSU0laRV9NSU5MRU4pKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBMU1AgQnVmZmVyc2l6ZTogJXUiLEVYVFJBQ1RfMTZCSVRTKHRwdHIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNJU19UTFZfUEFSVF9ESVM6Ci0gICAgICAgICAgICB3aGlsZSAodG1wID49IFNZU1RFTV9JRF9MRU4pIHsKLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgU1lTVEVNX0lEX0xFTikpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMiLGlzaXNfcHJpbnRfaWQodHB0cixTWVNURU1fSURfTEVOKSk7Ci0gICAgICAgICAgICAgICAgdHB0cis9U1lTVEVNX0lEX0xFTjsKLSAgICAgICAgICAgICAgICB0bXAtPVNZU1RFTV9JRF9MRU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIElTSVNfVExWX1BSRUZJWF9ORUlHSDoKLQkgICAgaWYgKHRtcCA8IHNpemVvZihzdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2spKQotCSAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBpc2lzX21ldHJpY19ibG9jaykpKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBNZXRyaWMgQmxvY2siKTsKLSAgICAgICAgICAgIGlzaXNfcHJpbnRfbWV0cmljX2Jsb2NrKChjb25zdCBzdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2sgKil0cHRyKTsKLSAgICAgICAgICAgIHRwdHIrPXNpemVvZihzdHJ1Y3QgaXNpc19tZXRyaWNfYmxvY2spOwotICAgICAgICAgICAgdG1wLT1zaXplb2Yoc3RydWN0IGlzaXNfbWV0cmljX2Jsb2NrKTsKLQotICAgICAgICAgICAgd2hpbGUodG1wPjApIHsKLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgMSkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICAgICAgcHJlZml4X2xlbj0qdHB0cisrOyAvKiByZWFkIG91dCBwcmVmaXggbGVuZ3RoIGluIHNlbWlvY3RldHMqLwotICAgICAgICAgICAgICAgIGlmIChwcmVmaXhfbGVuIDwgMikgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdEFkZHJlc3M6IHByZWZpeCBsZW5ndGggJXUgPCAyIiwgcHJlZml4X2xlbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXAtLTsKLSAgICAgICAgICAgICAgICBpZiAodG1wIDwgcHJlZml4X2xlbi8yKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgcHJlZml4X2xlbi8yKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byB0cnVuY3RsdjsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdEFkZHJlc3M6ICVzLyV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgaXNvbnNhcF9zdHJpbmcodHB0cixwcmVmaXhfbGVuLzIpLAotICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhfbGVuKjQpOwotICAgICAgICAgICAgICAgIHRwdHIrPXByZWZpeF9sZW4vMjsKLSAgICAgICAgICAgICAgICB0bXAtPXByZWZpeF9sZW4vMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNJU19UTFZfSUlIX1NFUU5SOgotCSAgICBpZiAodG1wIDwgSVNJU19UTFZfSUlIX1NFUU5SX01JTkxFTikKLQkgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIElTSVNfVExWX0lJSF9TRVFOUl9NSU5MRU4pKSAvKiBjaGVjayBpZiBmb3VyIGJ5dGVzIGFyZSBvbiB0aGUgd2lyZSAqLwotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBTZXF1ZW5jZSBudW1iZXI6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikgKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgSVNJU19UTFZfVkVORE9SX1BSSVZBVEU6Ci0JICAgIGlmICh0bXAgPCBJU0lTX1RMVl9WRU5ET1JfUFJJVkFURV9NSU5MRU4pCi0JICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBJU0lTX1RMVl9WRU5ET1JfUFJJVkFURV9NSU5MRU4pKSAvKiBjaGVjayBpZiBlbm91Z2ggYnl0ZSBmb3IgYSBmdWxsIG91aSAqLwotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmN0bHY7Ci0gICAgICAgICAgICB2ZW5kb3JfaWQgPSBFWFRSQUNUXzI0QklUUyh0cHRyKTsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIFZlbmRvcjogJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihvdWlfdmFsdWVzLCJVbmtub3duIix2ZW5kb3JfaWQpLAotICAgICAgICAgICAgICAgICAgIHZlbmRvcl9pZCk7Ci0gICAgICAgICAgICB0cHRyKz0zOwotICAgICAgICAgICAgdG1wLT0zOwotICAgICAgICAgICAgaWYgKHRtcCA+IDApIC8qIGhleGR1bXAgdGhlIHJlc3QgKi8KLSAgICAgICAgICAgICAgICBpZighcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIsIlxuXHRcdCIsdG1wKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRklYTUUgdGhvc2UgYXJlIHRoZSBkZWZpbmVkIFRMVnMgdGhhdCBsYWNrIGEgZGVjb2RlcgotICAgICAgICAgICAgICogeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKLSAgICAgICAgICAgICAqLwotCi0gICAgICAgIGNhc2UgSVNJU19UTFZfREVDTkVUX1BIQVNFNDoKLSAgICAgICAgY2FzZSBJU0lTX1RMVl9MVUNFTlRfUFJJVkFURToKLSAgICAgICAgY2FzZSBJU0lTX1RMVl9JUEFVVEg6Ci0gICAgICAgIGNhc2UgSVNJU19UTFZfTk9SVEVMX1BSSVZBVEUxOgotICAgICAgICBjYXNlIElTSVNfVExWX05PUlRFTF9QUklWQVRFMjoKLQotCWRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgewotICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdFx0Iix0bHZfbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICAgICAgfQotCSAgICBicmVhazsKLQl9Ci0gICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSBoZXhkdW1wID8gKi8KLSAgICAgICAgaWYgKHZmbGFnPiAxKSB7Ci0JICAgIGlmKCFwcmludF91bmtub3duX2RhdGEocHB0ciwiXG5cdCAgICAgICIsdGx2X2xlbikpCi0JICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KLQotCXBwdHIgKz0gdGx2X2xlbjsKLQlwYWNrZXRfbGVuIC09IHRsdl9sZW47Ci0gICAgfQotCi0gICAgaWYgKHBhY2tldF9sZW4gIT0gMCkgewotCXByaW50ZigiXG5cdCAgICAgICV1IHN0cmFnZ2xlciBieXRlcyIsIHBhY2tldF9sZW4pOwotICAgIH0KLSAgICByZXR1cm4gKDEpOwotCi0gdHJ1bmM6Ci0gICAgZnB1dHMoIlt8aXNpc10iLCBzdGRvdXQpOwotICAgIHJldHVybiAoMSk7Ci0KLSB0cnVuY3RsdjoKLSAgICBwcmludGYoIlxuXHRcdCBwYWNrZXQgZXhjZWVkZWQgc25hcHNob3QiKTsKLSAgICByZXR1cm4oMSk7Ci19Ci0KLS8qCi0gKiBWZXJpZnkgdGhlIGNoZWNrc3VtLiAgU2VlIDg0NzMtMSwgQXBwZW5kaXggQywgc2VjdGlvbiBDLjQuCi0gKi8KLQotc3RhdGljIGludAotb3NpX2Nrc3VtKGNvbnN0IHVfaW50OF90ICp0cHRyLCB1X2ludCBsZW4pCi17Ci0JaW50MzJfdCBjMCA9IDAsIGMxID0gMDsKLQotCXdoaWxlICgoaW50KS0tbGVuID49IDApIHsKLQkJYzAgKz0gKnRwdHIrKzsKLQkJYzAgJT0gMjU1OwotCQljMSArPSBjMDsKLQkJYzEgJT0gMjU1OwotCX0KLQlyZXR1cm4gKGMwIHwgYzEpOwotfQotCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1qdW5pcGVyLmMgYi9wcmludC1qdW5pcGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODM3ZTMuLjAwMDAwMDAKLS0tIGEvcHJpbnQtanVuaXBlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMiArMCwwIEBACi0vKiAKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtanVuaXBlci5jLHYgMS44LjIuMjIgMjAwNi8wNS8xMCAyMjo0Mjo0NiBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxwY2FwLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAicHBwLmgiCi0jaW5jbHVkZSAibGxjLmgiCi0jaW5jbHVkZSAibmxwaWQuaCIKLSNpbmNsdWRlICJldGhlcnR5cGUuaCIKLSNpbmNsdWRlICJhdG0uaCIKLQotI2RlZmluZSBKVU5JUEVSX0JQRl9PVVQgICAgICAgICAgIDAgICAgICAgLyogT3V0Z29pbmcgcGFja2V0ICovCi0jZGVmaW5lIEpVTklQRVJfQlBGX0lOICAgICAgICAgICAgMSAgICAgICAvKiBJbmNvbWluZyBwYWNrZXQgKi8KLSNkZWZpbmUgSlVOSVBFUl9CUEZfUEtUX0lOICAgICAgICAweDEgICAgIC8qIEluY29taW5nIHBhY2tldCAqLwotI2RlZmluZSBKVU5JUEVSX0JQRl9OT19MMiAgICAgICAgIDB4MiAgICAgLyogTDIgaGVhZGVyIHN0cmlwcGVkICovCi0jZGVmaW5lIEpVTklQRVJfQlBGX0VYVCAgICAgICAgICAgMHg4MCAgICAvKiBleHRlbnNpb25zIHByZXNlbnQgKi8KLSNkZWZpbmUgSlVOSVBFUl9NR0NfTlVNQkVSICAgICAgICAweDRkNDc0MyAvKiA9ICJNR0MiICovCi0KLSNkZWZpbmUgSlVOSVBFUl9MU1FfQ09PS0lFX1JFICAgICAgICAgKDEgPDwgMykKLSNkZWZpbmUgSlVOSVBFUl9MU1FfQ09PS0lFX0RJUiAgICAgICAgKDEgPDwgMikKLSNkZWZpbmUgSlVOSVBFUl9MU1FfTDNfUFJPVE9fU0hJRlQgICAgIDQKLSNkZWZpbmUgSlVOSVBFUl9MU1FfTDNfUFJPVE9fTUFTSyAgICAgKDB4MTcgPDwgSlVOSVBFUl9MU1FfTDNfUFJPVE9fU0hJRlQpCi0jZGVmaW5lIEpVTklQRVJfTFNRX0wzX1BST1RPX0lQVjQgICAgICgwIDw8IEpVTklQRVJfTFNRX0wzX1BST1RPX1NISUZUKQotI2RlZmluZSBKVU5JUEVSX0xTUV9MM19QUk9UT19JUFY2ICAgICAoMSA8PCBKVU5JUEVSX0xTUV9MM19QUk9UT19TSElGVCkKLSNkZWZpbmUgSlVOSVBFUl9MU1FfTDNfUFJPVE9fTVBMUyAgICAgKDIgPDwgSlVOSVBFUl9MU1FfTDNfUFJPVE9fU0hJRlQpCi0jZGVmaW5lIEpVTklQRVJfTFNRX0wzX1BST1RPX0lTTyAgICAgICgzIDw8IEpVTklQRVJfTFNRX0wzX1BST1RPX1NISUZUKQotI2RlZmluZSBBU19QSUNfQ09PS0lFX0xFTiA4Ci0KLSNkZWZpbmUgSlVOSVBFUl9JUFNFQ19PX0VTUF9FTkNSWVBUX0VTUF9BVVRIRU5fVFlQRSAxCi0jZGVmaW5lIEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVF9BSF9BVVRIRU5fVFlQRSAyCi0jZGVmaW5lIEpVTklQRVJfSVBTRUNfT19FU1BfQVVUSEVOVElDQVRJT05fVFlQRSAzCi0jZGVmaW5lIEpVTklQRVJfSVBTRUNfT19BSF9BVVRIRU5USUNBVElPTl9UWVBFIDQKLSNkZWZpbmUgSlVOSVBFUl9JUFNFQ19PX0VTUF9FTkNSWVBUSU9OX1RZUEUgNQotCi1zdGF0aWMgc3RydWN0IHRvayBqdW5pcGVyX2lwc2VjX3R5cGVfdmFsdWVzW10gPSB7Ci0gICAgeyBKVU5JUEVSX0lQU0VDX09fRVNQX0VOQ1JZUFRfRVNQX0FVVEhFTl9UWVBFLCAiRVNQIEVOQ1ItQVVUSCIgfSwKLSAgICB7IEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVF9BSF9BVVRIRU5fVFlQRSwgIkVTUCBFTkNSLUFIIEFVVEgiIH0sCi0gICAgeyBKVU5JUEVSX0lQU0VDX09fRVNQX0FVVEhFTlRJQ0FUSU9OX1RZUEUsICJFU1AgQVVUSCIgfSwKLSAgICB7IEpVTklQRVJfSVBTRUNfT19BSF9BVVRIRU5USUNBVElPTl9UWVBFLCAiQUggQVVUSCIgfSwKLSAgICB7IEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVElPTl9UWVBFLCAiRVNQIEVOQ1IiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sganVuaXBlcl9kaXJlY3Rpb25fdmFsdWVzW10gPSB7Ci0gICAgeyBKVU5JUEVSX0JQRl9JTiwgICJJbiJ9LAotICAgIHsgSlVOSVBFUl9CUEZfT1VULCAiT3V0In0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RydWN0IGp1bmlwZXJfY29va2llX3RhYmxlX3QgewotICAgIHVfaW50MzJfdCBwaWN0eXBlOwkJLyogcGljIHR5cGUgKi8KLSAgICB1X2ludDhfdCAgY29va2llX2xlbjsgICAgICAgLyogY29va2llIGxlbiAqLwotICAgIGNvbnN0IGNoYXIgKnM7CQkvKiBwaWMgbmFtZSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBqdW5pcGVyX2Nvb2tpZV90YWJsZV90IGp1bmlwZXJfY29va2llX3RhYmxlW10gPSB7Ci0jaWZkZWYgRExUX0pVTklQRVJfQVRNMQotICAgIHsgRExUX0pVTklQRVJfQVRNMSwgIDQsICJBVE0xIn0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9BVE0yCi0gICAgeyBETFRfSlVOSVBFUl9BVE0yLCAgOCwgIkFUTTIifSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX01MUFBQCi0gICAgeyBETFRfSlVOSVBFUl9NTFBQUCwgMiwgIk1MUFBQIn0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9NTEZSCi0gICAgeyBETFRfSlVOSVBFUl9NTEZSLCAgMiwgIk1MRlIifSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX01GUgotICAgIHsgRExUX0pVTklQRVJfTUZSLCAgIDQsICJNRlIifSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX1BQUE9FCi0gICAgeyBETFRfSlVOSVBFUl9QUFBPRSwgMCwgIlBQUG9FIn0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9QUFBPRV9BVE0KLSAgICB7IERMVF9KVU5JUEVSX1BQUE9FX0FUTSwgMCwgIlBQUG9FIEFUTSJ9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfR0dTTgotICAgIHsgRExUX0pVTklQRVJfR0dTTiwgOCwgIkdHU04ifSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX01PTklUT1IKLSAgICB7IERMVF9KVU5JUEVSX01PTklUT1IsIDgsICJNT05JVE9SIn0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9TRVJWSUNFUwotICAgIHsgRExUX0pVTklQRVJfU0VSVklDRVMsIDgsICJBUyJ9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfRVMKLSAgICB7IERMVF9KVU5JUEVSX0VTLCAwLCAiRVMifSwKLSNlbmRpZgotICAgIHsgMCwgMCwgTlVMTCB9Ci19OwotCi1zdHJ1Y3QganVuaXBlcl9sMmluZm9fdCB7Ci0gICAgdV9pbnQzMl90IGxlbmd0aDsKLSAgICB1X2ludDMyX3QgY2FwbGVuOwotICAgIHVfaW50MzJfdCBwaWN0eXBlOwotICAgIHVfaW50OF90IGRpcmVjdGlvbjsKLSAgICB1X2ludDhfdCBoZWFkZXJfbGVuOwotICAgIHVfaW50OF90IGNvb2tpZV9sZW47Ci0gICAgdV9pbnQ4X3QgY29va2llX3R5cGU7Ci0gICAgdV9pbnQ4X3QgY29va2llWzhdOwotICAgIHVfaW50OF90IGJ1bmRsZTsKLSAgICB1X2ludDE2X3QgcHJvdG87Ci19OwotCi0jZGVmaW5lIExTX0NPT0tJRV9JRCAgICAgICAgICAgIDB4NTQKLSNkZWZpbmUgQVNfQ09PS0lFX0lEICAgICAgICAgICAgMHg0NwotI2RlZmluZSBMU19NTEZSX0NPT0tJRV9MRU4JNAotI2RlZmluZSBNTF9NTEZSX0NPT0tJRV9MRU4JMgotI2RlZmluZSBMU19NRlJfQ09PS0lFX0xFTgk2Ci0jZGVmaW5lIEFUTTFfQ09PS0lFX0xFTiAgICAgICAgIDQKLSNkZWZpbmUgQVRNMl9DT09LSUVfTEVOICAgICAgICAgOAotCi0jZGVmaW5lIEFUTTJfUEtUX1RZUEVfTUFTSyAgMHg3MAotI2RlZmluZSBBVE0yX0dBUF9DT1VOVF9NQVNLIDB4M0YKLQotI2RlZmluZSBKVU5JUEVSX1BST1RPX05VTEwgICAgICAgICAgMQotI2RlZmluZSBKVU5JUEVSX1BST1RPX0lQVjQgICAgICAgICAgMgotI2RlZmluZSBKVU5JUEVSX1BST1RPX0lQVjYgICAgICAgICAgNgotCi0jZGVmaW5lIE1GUl9CRV9NQVNLIDB4YzAKLQotc3RhdGljIHN0cnVjdCB0b2sganVuaXBlcl9wcm90b2NvbF92YWx1ZXNbXSA9IHsKLSAgICB7IEpVTklQRVJfUFJPVE9fTlVMTCwgIk51bGwiIH0sCi0gICAgeyBKVU5JUEVSX1BST1RPX0lQVjQsICJJUHY0IiB9LAotICAgIHsgSlVOSVBFUl9QUk9UT19JUFY2LCAiSVB2NiIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1pbnQgaXBfaGV1cmlzdGljX2d1ZXNzKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1pbnQganVuaXBlcl9wcHBfaGV1cmlzdGljX2d1ZXNzKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqLCB1X2ludCk7Ci1zdGF0aWMgaW50IGp1bmlwZXJfcGFyc2VfaGVhZGVyIChjb25zdCB1X2NoYXIgKiwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190ICopOwotCi0jaWZkZWYgRExUX0pVTklQRVJfR0dTTgotdV9pbnQKLWp1bmlwZXJfZ2dzbl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotICAgICAgICBzdHJ1Y3QganVuaXBlcl9nZ3NuX2hlYWRlciB7Ci0gICAgICAgICAgICB1X2ludDhfdCBzdmNfaWQ7Ci0gICAgICAgICAgICB1X2ludDhfdCBmbGFnc19sZW47Ci0gICAgICAgICAgICB1X2ludDhfdCBwcm90bzsKLSAgICAgICAgICAgIHVfaW50OF90IGZsYWdzOwotICAgICAgICAgICAgdV9pbnQ4X3Qgdmxhbl9pZFsyXTsKLSAgICAgICAgICAgIHVfaW50OF90IHJlc1syXTsKLSAgICAgICAgfTsKLSAgICAgICAgY29uc3Qgc3RydWN0IGp1bmlwZXJfZ2dzbl9oZWFkZXIgKmdoOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfR0dTTjsKLSAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgZ2ggPSAoc3RydWN0IGp1bmlwZXJfZ2dzbl9oZWFkZXIgKilwOwotCi0gICAgICAgIGlmIChlZmxhZykKLSAgICAgICAgICAgIHByaW50ZigicHJvdG8gJXMgKCV1KSwgdmxhbiAldTogIiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGp1bmlwZXJfcHJvdG9jb2xfdmFsdWVzLCJVbmtub3duIixnaC0+cHJvdG8pLAotICAgICAgICAgICAgICAgICAgIGdoLT5wcm90bywKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmZ2gtPnZsYW5faWRbMF0pKTsKLQotICAgICAgICBzd2l0Y2ggKGdoLT5wcm90bykgewotICAgICAgICBjYXNlIEpVTklQRVJfUFJPVE9fSVBWNDoKLSAgICAgICAgICAgIGlwX3ByaW50KGduZG8sIHAsIGwyaW5mby5sZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgY2FzZSBKVU5JUEVSX1BST1RPX0lQVjY6Ci0gICAgICAgICAgICBpcDZfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvKiBJTkVUNiAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCFlZmxhZykKLSAgICAgICAgICAgICAgICBwcmludGYoInVua25vd24gR0dTTiBwcm90byAoJXUpIiwgZ2gtPnByb3RvKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLX0KLSNlbmRpZgotCi0jaWZkZWYgRExUX0pVTklQRVJfRVMKLXVfaW50Ci1qdW5pcGVyX2VzX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87Ci0gICAgICAgIHN0cnVjdCBqdW5pcGVyX2lwc2VjX2hlYWRlciB7Ci0gICAgICAgICAgICB1X2ludDhfdCBzYV9pbmRleFsyXTsKLSAgICAgICAgICAgIHVfaW50OF90IHR0bDsKLSAgICAgICAgICAgIHVfaW50OF90IHR5cGU7Ci0gICAgICAgICAgICB1X2ludDhfdCBzcGlbNF07Ci0gICAgICAgICAgICB1X2ludDhfdCBzcmNfaXBbNF07Ci0gICAgICAgICAgICB1X2ludDhfdCBkc3RfaXBbNF07Ci0gICAgICAgIH07Ci0gICAgICAgIHVfaW50IHJld3JpdGVfbGVuLGVzX3R5cGVfYnVuZGxlOwotICAgICAgICBjb25zdCBzdHJ1Y3QganVuaXBlcl9pcHNlY19oZWFkZXIgKmloOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfRVM7Ci0gICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47Ci0gICAgICAgIGloID0gKHN0cnVjdCBqdW5pcGVyX2lwc2VjX2hlYWRlciAqKXA7Ci0KLSAgICAgICAgc3dpdGNoIChpaC0+dHlwZSkgewotICAgICAgICBjYXNlIEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVF9FU1BfQVVUSEVOX1RZUEU6Ci0gICAgICAgIGNhc2UgSlVOSVBFUl9JUFNFQ19PX0VTUF9FTkNSWVBUX0FIX0FVVEhFTl9UWVBFOgotICAgICAgICAgICAgcmV3cml0ZV9sZW4gPSAwOwotICAgICAgICAgICAgZXNfdHlwZV9idW5kbGUgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlVOSVBFUl9JUFNFQ19PX0VTUF9BVVRIRU5USUNBVElPTl9UWVBFOgotICAgICAgICBjYXNlIEpVTklQRVJfSVBTRUNfT19BSF9BVVRIRU5USUNBVElPTl9UWVBFOgotICAgICAgICBjYXNlIEpVTklQRVJfSVBTRUNfT19FU1BfRU5DUllQVElPTl9UWVBFOgotICAgICAgICAgICAgcmV3cml0ZV9sZW4gPSAxNjsKLSAgICAgICAgICAgIGVzX3R5cGVfYnVuZGxlID0gMDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50ZigiRVMgSW52YWxpZCB0eXBlICV1LCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgIGloLT50eXBlLAotICAgICAgICAgICAgICAgICAgIGwyaW5mby5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgbDJpbmZvLmxlbmd0aC09cmV3cml0ZV9sZW47Ci0gICAgICAgIHArPXJld3JpdGVfbGVuOwotCi0gICAgICAgIGlmIChlZmxhZykgewotICAgICAgICAgICAgaWYgKCFlc190eXBlX2J1bmRsZSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiRVMgU0EsIGluZGV4ICV1LCB0dGwgJXUgdHlwZSAlcyAoJXUpLCBzcGkgJXUsIFR1bm5lbCAlcyA+ICVzLCBsZW5ndGggJXVcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmaWgtPnNhX2luZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgaWgtPnR0bCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoanVuaXBlcl9pcHNlY190eXBlX3ZhbHVlcywiVW5rbm93biIsaWgtPnR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICBpaC0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJmloLT5zcGkpLAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKEVYVFJBQ1RfMzJCSVRTKCZpaC0+c3JjX2lwKSksCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcoRVhUUkFDVF8zMkJJVFMoJmloLT5kc3RfaXApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbDJpbmZvLmxlbmd0aCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50ZigiRVMgU0EsIGluZGV4ICV1LCB0dGwgJXUgdHlwZSAlcyAoJXUpLCBsZW5ndGggJXVcbiIsIAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmaWgtPnNhX2luZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgaWgtPnR0bCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoanVuaXBlcl9pcHNlY190eXBlX3ZhbHVlcywiVW5rbm93biIsaWgtPnR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICBpaC0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgbDJpbmZvLmxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9NT05JVE9SCi11X2ludAotanVuaXBlcl9tb25pdG9yX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87Ci0gICAgICAgIHN0cnVjdCBqdW5pcGVyX21vbml0b3JfaGVhZGVyIHsKLSAgICAgICAgICAgIHVfaW50OF90IHBrdF90eXBlOwotICAgICAgICAgICAgdV9pbnQ4X3QgcGFkZGluZzsKLSAgICAgICAgICAgIHVfaW50OF90IGlpZlsyXTsKLSAgICAgICAgICAgIHVfaW50OF90IHNlcnZpY2VfaWRbNF07Ci0gICAgICAgIH07Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBqdW5pcGVyX21vbml0b3JfaGVhZGVyICptaDsKLQotICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX01PTklUT1I7Ci0gICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47Ci0gICAgICAgIG1oID0gKHN0cnVjdCBqdW5pcGVyX21vbml0b3JfaGVhZGVyICopcDsKLQotICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoInNlcnZpY2UtaWQgJXUsIGlpZiAldSwgcGt0LXR5cGUgJXU6ICIsCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJm1oLT5zZXJ2aWNlX2lkKSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmbWgtPmlpZiksCi0gICAgICAgICAgICAgICAgICAgbWgtPnBrdF90eXBlKTsKLQotICAgICAgICAvKiBubyBwcm90byBmaWVsZCAtIGxldHMgZ3Vlc3MgYnkgZmlyc3QgYnl0ZSBvZiBJUCBoZWFkZXIqLwotICAgICAgICBpcF9oZXVyaXN0aWNfZ3Vlc3MocCwgbDJpbmZvLmxlbmd0aCk7Ci0KLSAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9TRVJWSUNFUwotdV9pbnQKLWp1bmlwZXJfc2VydmljZXNfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfc2VydmljZXNfaGVhZGVyIHsKLSAgICAgICAgICAgIHVfaW50OF90IHN2Y19pZDsKLSAgICAgICAgICAgIHVfaW50OF90IGZsYWdzX2xlbjsKLSAgICAgICAgICAgIHVfaW50OF90IHN2Y19zZXRfaWRbMl07Ci0gICAgICAgICAgICB1X2ludDhfdCBkaXJfaWlmWzRdOwotICAgICAgICB9OwotICAgICAgICBjb25zdCBzdHJ1Y3QganVuaXBlcl9zZXJ2aWNlc19oZWFkZXIgKnNoOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfU0VSVklDRVM7Ci0gICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47Ci0gICAgICAgIHNoID0gKHN0cnVjdCBqdW5pcGVyX3NlcnZpY2VzX2hlYWRlciAqKXA7Ci0KLSAgICAgICAgaWYgKGVmbGFnKQotICAgICAgICAgICAgcHJpbnRmKCJzZXJ2aWNlLWlkICV1IGZsYWdzIDB4JTAyeCBzZXJ2aWNlLXNldC1pZCAweCUwNHggaWlmICV1OiAiLAotICAgICAgICAgICAgICAgICAgIHNoLT5zdmNfaWQsCi0gICAgICAgICAgICAgICAgICAgc2gtPmZsYWdzX2xlbiwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmc2gtPnN2Y19zZXRfaWQpLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKCZzaC0+ZGlyX2lpZlsxXSkpOwotCi0gICAgICAgIC8qIG5vIHByb3RvIGZpZWxkIC0gbGV0cyBndWVzcyBieSBmaXJzdCBieXRlIG9mIElQIGhlYWRlciovCi0gICAgICAgIGlwX2hldXJpc3RpY19ndWVzcyhwLCBsMmluZm8ubGVuZ3RoKTsKLQotICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci19Ci0jZW5kaWYKLQotI2lmZGVmIERMVF9KVU5JUEVSX1BQUE9FCi11X2ludAotanVuaXBlcl9wcHBvZV9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfUFBQT0U7Ci0gICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47Ci0gICAgICAgIC8qIHRoaXMgRExUIGNvbnRhaW5zIG5vdGhpbmcgYnV0IHJhdyBldGhlcm5ldCBmcmFtZXMgKi8KLSAgICAgICAgZXRoZXJfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCwgbDJpbmZvLmNhcGxlbik7Ci0gICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLX0KLSNlbmRpZgotCi0jaWZkZWYgRExUX0pVTklQRVJfRVRIRVIKLXVfaW50Ci1qdW5pcGVyX2V0aGVyX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotICAgICAgICBzdHJ1Y3QganVuaXBlcl9sMmluZm9fdCBsMmluZm87Ci0KLSAgICAgICAgbDJpbmZvLnBpY3R5cGUgPSBETFRfSlVOSVBFUl9FVEhFUjsKLSAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgLyogdGhpcyBETFQgY29udGFpbnMgbm90aGluZyBidXQgcmF3IEV0aGVybmV0IGZyYW1lcyAqLwotICAgICAgICBldGhlcl9wcmludChwLCBsMmluZm8ubGVuZ3RoLCBsMmluZm8uY2FwbGVuKTsKLSAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9QUFAKLXVfaW50Ci1qdW5pcGVyX3BwcF9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfUFBQOwotICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotCi0gICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICAvKiB0aGlzIERMVCBjb250YWlucyBub3RoaW5nIGJ1dCByYXcgcHBwIGZyYW1lcyAqLwotICAgICAgICBwcHBfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCk7Ci0gICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLX0KLSNlbmRpZgotCi0jaWZkZWYgRExUX0pVTklQRVJfRlJFTEFZCi11X2ludAotanVuaXBlcl9mcmVsYXlfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKLQotICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX0ZSRUxBWTsKLSAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgLyogdGhpcyBETFQgY29udGFpbnMgbm90aGluZyBidXQgcmF3IGZyYW1lLXJlbGF5IGZyYW1lcyAqLwotICAgICAgICBmcl9wcmludChwLCBsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9DSERMQwotdV9pbnQKLWp1bmlwZXJfY2hkbGNfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKLQotICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX0NIRExDOwotICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotCi0gICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICAvKiB0aGlzIERMVCBjb250YWlucyBub3RoaW5nIGJ1dCByYXcgYy1oZGxjIGZyYW1lcyAqLwotICAgICAgICBjaGRsY19wcmludChwLCBsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9QUFBPRV9BVE0KLXVfaW50Ci1qdW5pcGVyX3BwcG9lX2F0bV9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotCXVfaW50MTZfdCBleHRyYWN0ZWRfZXRoZXJ0eXBlOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfUFBQT0VfQVRNOwotICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotCi0gICAgICAgIHArPWwyaW5mby5oZWFkZXJfbGVuOwotCi0gICAgICAgIGV4dHJhY3RlZF9ldGhlcnR5cGUgPSBFWFRSQUNUXzE2QklUUyhwKTsKLSAgICAgICAgLyogdGhpcyBETFQgY29udGFpbnMgbm90aGluZyBidXQgcmF3IFBQUG9FIGZyYW1lcywKLSAgICAgICAgICogcHJlcGVuZGVkIHdpdGggYSB0eXBlIGZpZWxkKi8KLSAgICAgICAgaWYgKGV0aGVyX2VuY2FwX3ByaW50KGV4dHJhY3RlZF9ldGhlcnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwK0VUSEVSVFlQRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmluZm8ubGVuZ3RoLUVUSEVSVFlQRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsMmluZm8uY2FwbGVuLUVUSEVSVFlQRV9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkgPT0gMCkKLSAgICAgICAgICAgIC8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcm9iYWJseSBpdCB3YXNuJ3Qgb25lICovCi0gICAgICAgICAgICBwcmludGYoInVua25vd24gZXRoZXJ0eXBlIDB4JTA0eCIsIGV4dHJhY3RlZF9ldGhlcnR5cGUpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9NTFBQUAotdV9pbnQKLWp1bmlwZXJfbWxwcHBfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKLQotICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX01MUFBQOwotICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotCi0gICAgICAgIC8qIHN1cHByZXNzIEJ1bmRsZS1JRCBpZiBmcmFtZSB3YXMgY2FwdHVyZWQgb24gYSBjaGlsZC1saW5rCi0gICAgICAgICAqIGJlc3QgaW5kaWNhdG9yIGlmIHRoZSBjb29raWUgbG9va3MgbGlrZSBhIHByb3RvICovCi0gICAgICAgIGlmIChlZmxhZyAmJgotICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmwyaW5mby5jb29raWUpICE9IFBQUF9PU0kgJiYKLSAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsMmluZm8uY29va2llKSAhPSAgKFBQUF9BRERSRVNTIDw8IDggfCBQUFBfQ09OVFJPTCkpCi0gICAgICAgICAgICBwcmludGYoIkJ1bmRsZS1JRCAldTogIixsMmluZm8uYnVuZGxlKTsKLQotICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICAvKiBmaXJzdCB0cnkgdGhlIExTUSBwcm90b3MgKi8KLSAgICAgICAgc3dpdGNoKGwyaW5mby5wcm90bykgewotICAgICAgICBjYXNlIEpVTklQRVJfTFNRX0wzX1BST1RPX0lQVjQ6Ci0gICAgICAgICAgICAvKiBJUCB0cmFmZmljIGdvaW5nIHRvIHRoZSBSRSB3b3VsZCBub3QgaGF2ZSBhIGNvb2tpZQotICAgICAgICAgICAgICogLT4gdGhpcyBtdXN0IGJlIGluY29taW5nIElTLUlTIG92ZXIgUFBQCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChsMmluZm8uY29va2llWzRdID09IChKVU5JUEVSX0xTUV9DT09LSUVfUkV8SlVOSVBFUl9MU1FfQ09PS0lFX0RJUikpCi0gICAgICAgICAgICAgICAgcHBwX3ByaW50KHAsIGwyaW5mby5sZW5ndGgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlwX3ByaW50KGduZG8sIHAsIGwyaW5mby5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotI2lmZGVmIElORVQ2Ci0gICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fSVBWNjoKLSAgICAgICAgICAgIGlwNl9wcmludChwLGwyaW5mby5sZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotI2VuZGlmCi0gICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fTVBMUzoKLSAgICAgICAgICAgIG1wbHNfcHJpbnQocCxsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgY2FzZSBKVU5JUEVSX0xTUV9MM19QUk9UT19JU086Ci0gICAgICAgICAgICBpc29jbG5zX3ByaW50KHAsbDJpbmZvLmxlbmd0aCxsMmluZm8uY2FwbGVuKTsKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogemVybyBsZW5ndGggY29va2llID8gKi8KLSAgICAgICAgc3dpdGNoIChFWFRSQUNUXzE2QklUUygmbDJpbmZvLmNvb2tpZSkpIHsKLSAgICAgICAgY2FzZSBQUFBfT1NJOgotICAgICAgICAgICAgcHBwX3ByaW50KHAtMixsMmluZm8ubGVuZ3RoKzIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKFBQUF9BRERSRVNTIDw8IDggfCBQUFBfQ09OVFJPTCk6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcHBwX3ByaW50KHAsbDJpbmZvLmxlbmd0aCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLX0KLSNlbmRpZgotCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9NRlIKLXVfaW50Ci1qdW5pcGVyX21mcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfTUZSOwotICAgICAgICBpZihqdW5pcGVyX3BhcnNlX2hlYWRlcihwLCBoLCAmbDJpbmZvKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICAKLSAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgLyogY2hpbGQtbGluayA/ICovCi0gICAgICAgIGlmIChsMmluZm8uY29va2llX2xlbiA9PSAwKSB7Ci0gICAgICAgICAgICBtZnJfcHJpbnQocCxsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGZpcnN0IHRyeSB0aGUgTFNRIHByb3RvcyAqLwotICAgICAgICBpZiAobDJpbmZvLmNvb2tpZV9sZW4gPT0gQVNfUElDX0NPT0tJRV9MRU4pIHsKLSAgICAgICAgICAgIHN3aXRjaChsMmluZm8ucHJvdG8pIHsKLSAgICAgICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fSVBWNDoKLSAgICAgICAgICAgICAgICBpcF9wcmludChnbmRvLCBwLCBsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fSVBWNjoKLSAgICAgICAgICAgICAgICBpcDZfcHJpbnQocCxsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0jZW5kaWYKLSAgICAgICAgICAgIGNhc2UgSlVOSVBFUl9MU1FfTDNfUFJPVE9fTVBMUzoKLSAgICAgICAgICAgICAgICBtcGxzX3ByaW50KHAsbDJpbmZvLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICAgICAgY2FzZSBKVU5JUEVSX0xTUV9MM19QUk9UT19JU086Ci0gICAgICAgICAgICAgICAgaXNvY2xuc19wcmludChwLGwyaW5mby5sZW5ndGgsbDJpbmZvLmNhcGxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHN1cHByZXNzIEJ1bmRsZS1JRCBpZiBmcmFtZSB3YXMgY2FwdHVyZWQgb24gYSBjaGlsZC1saW5rICovCi0gICAgICAgIGlmIChlZmxhZyAmJiBFWFRSQUNUXzMyQklUUyhsMmluZm8uY29va2llKSAhPSAxKSBwcmludGYoIkJ1bmRsZS1JRCAldSwgIixsMmluZm8uYnVuZGxlKTsKLSAgICAgICAgc3dpdGNoIChsMmluZm8ucHJvdG8pIHsKLSAgICAgICAgY2FzZSAoTExDU0FQX0lTT05TPDw4IHwgTExDU0FQX0lTT05TKToKLSAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocCsxLCBsMmluZm8ubGVuZ3RoLTEsIGwyaW5mby5jYXBsZW4tMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAoTExDX1VJPDw4IHwgTkxQSURfUTkzMyk6Ci0gICAgICAgIGNhc2UgKExMQ19VSTw8OCB8IE5MUElEX0lQKToKLSAgICAgICAgY2FzZSAoTExDX1VJPDw4IHwgTkxQSURfSVA2KToKLSAgICAgICAgICAgIC8qIHBhc3MgSVB7NCw2fSB0byB0aGUgT1NJIGxheWVyIGZvciBwcm9wZXIgbGluay1sYXllciBwcmludGluZyAqLwotICAgICAgICAgICAgaXNvY2xuc19wcmludChwLTEsIGwyaW5mby5sZW5ndGgrMSwgbDJpbmZvLmNhcGxlbisxKTsgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50ZigidW5rbm93biBwcm90b2NvbCAweCUwNHgsIGxlbmd0aCAldSIsbDJpbmZvLnByb3RvLCBsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLX0KLSNlbmRpZgotCi0jaWZkZWYgRExUX0pVTklQRVJfTUxGUgotdV9pbnQKLWp1bmlwZXJfbWxmcl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfTUxGUjsKLSAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICAvKiBzdXBwcmVzcyBCdW5kbGUtSUQgaWYgZnJhbWUgd2FzIGNhcHR1cmVkIG9uIGEgY2hpbGQtbGluayAqLwotICAgICAgICBpZiAoZWZsYWcgJiYgRVhUUkFDVF8zMkJJVFMobDJpbmZvLmNvb2tpZSkgIT0gMSkgcHJpbnRmKCJCdW5kbGUtSUQgJXUsICIsbDJpbmZvLmJ1bmRsZSk7Ci0gICAgICAgIHN3aXRjaCAobDJpbmZvLnByb3RvKSB7Ci0gICAgICAgIGNhc2UgKExMQ19VSSk6Ci0gICAgICAgIGNhc2UgKExMQ19VSTw8OCk6Ci0gICAgICAgICAgICBpc29jbG5zX3ByaW50KHAsIGwyaW5mby5sZW5ndGgsIGwyaW5mby5jYXBsZW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgKExMQ19VSTw8OCB8IE5MUElEX1E5MzMpOgotICAgICAgICBjYXNlIChMTENfVUk8PDggfCBOTFBJRF9JUCk6Ci0gICAgICAgIGNhc2UgKExMQ19VSTw8OCB8IE5MUElEX0lQNik6Ci0gICAgICAgICAgICAvKiBwYXNzIElQezQsNn0gdG8gdGhlIE9TSSBsYXllciBmb3IgcHJvcGVyIGxpbmstbGF5ZXIgcHJpbnRpbmcgKi8KLSAgICAgICAgICAgIGlzb2NsbnNfcHJpbnQocC0xLCBsMmluZm8ubGVuZ3RoKzEsIGwyaW5mby5jYXBsZW4rMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHByaW50ZigidW5rbm93biBwcm90b2NvbCAweCUwNHgsIGxlbmd0aCAldSIsbDJpbmZvLnByb3RvLCBsMmluZm8ubGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLX0KLSNlbmRpZgotCi0vKgotICogICAgIEFUTTEgUElDIGNvb2tpZSBmb3JtYXQKLSAqCi0gKiAgICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqICAgICB8Zm10aWR8ICAgICB2YyBpbmRleCAgICAgICAgICAgIHwgIGNoYW5uZWwgIElEICAgICAgICAgICAgICAgICAgfAotICogICAgICstLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKi8KLQotI2lmZGVmIERMVF9KVU5JUEVSX0FUTTEKLXVfaW50Ci1qdW5pcGVyX2F0bTFfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgICAgIHVfaW50MTZfdCBleHRyYWN0ZWRfZXRoZXJ0eXBlOwotCi0gICAgICAgIHN0cnVjdCBqdW5pcGVyX2wyaW5mb190IGwyaW5mbzsKLQotICAgICAgICBsMmluZm8ucGljdHlwZSA9IERMVF9KVU5JUEVSX0FUTTE7Ci0gICAgICAgIGlmKGp1bmlwZXJfcGFyc2VfaGVhZGVyKHAsIGgsICZsMmluZm8pID09IDApCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgcCs9bDJpbmZvLmhlYWRlcl9sZW47Ci0KLSAgICAgICAgaWYgKGwyaW5mby5jb29raWVbMF0gPT0gMHg4MCkgeyAvKiBPQU0gY2VsbCA/ICovCi0gICAgICAgICAgICBvYW1fcHJpbnQocCxsMmluZm8ubGVuZ3RoLEFUTV9PQU1fTk9IRUMpOwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEVYVFJBQ1RfMjRCSVRTKHApID09IDB4ZmVmZTAzIHx8IC8qIE5MUElEIGVuY2FwcyA/ICovCi0gICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwKSA9PSAweGFhYWEwMykgeyAvKiBTTkFQIGVuY2FwcyA/ICovCi0KLSAgICAgICAgICAgIGlmIChsbGNfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCwgbDJpbmZvLmNhcGxlbiwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBbMF0gPT0gMHgwMykgeyAvKiBDaXNjbyBzdHlsZSBOTFBJRCBlbmNhcHMgPyAqLwotICAgICAgICAgICAgaXNvY2xuc19wcmludChwICsgMSwgbDJpbmZvLmxlbmd0aCAtIDEsIGwyaW5mby5jYXBsZW4gLSAxKTsKLSAgICAgICAgICAgIC8qIEZJWE1FIGNoZWNrIGlmIGZyYW1lIHdhcyByZWNvZ25pemVkICovCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihpcF9oZXVyaXN0aWNfZ3Vlc3MocCwgbDJpbmZvLmxlbmd0aCkgIT0gMCkgLyogbGFzdCB0cnkgLSB2Y211eCBlbmNhcHMgPyAqLwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotCi0JcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLS8qCi0gKiAgICAgQVRNMiBQSUMgY29va2llIGZvcm1hdAotICoKLSAqICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tKy0tLS0tKy0tLS0tLS0tLS0tKwotICogICAgIHwgICAgIGNoYW5uZWwgSUQgICAgICAgICAgICAgICAgfCAgcmVzZXJ2IHxBQUx8IENDUlF8IGdhcCBjbnQgICB8Ci0gKiAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLSstLS0tLSstLS0tLS0tLS0tLSsKLSAqLwotCi0jaWZkZWYgRExUX0pVTklQRVJfQVRNMgotdV9pbnQKLWp1bmlwZXJfYXRtMl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICAgICAgdV9pbnQxNl90IGV4dHJhY3RlZF9ldGhlcnR5cGU7Ci0KLSAgICAgICAgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgbDJpbmZvOwotCi0gICAgICAgIGwyaW5mby5waWN0eXBlID0gRExUX0pVTklQRVJfQVRNMjsKLSAgICAgICAgaWYoanVuaXBlcl9wYXJzZV9oZWFkZXIocCwgaCwgJmwyaW5mbykgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBwKz1sMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBpZiAobDJpbmZvLmNvb2tpZVs3XSAmIEFUTTJfUEtUX1RZUEVfTUFTSykgeyAvKiBPQU0gY2VsbCA/ICovCi0gICAgICAgICAgICBvYW1fcHJpbnQocCxsMmluZm8ubGVuZ3RoLEFUTV9PQU1fTk9IRUMpOwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKEVYVFJBQ1RfMjRCSVRTKHApID09IDB4ZmVmZTAzIHx8IC8qIE5MUElEIGVuY2FwcyA/ICovCi0gICAgICAgICAgICBFWFRSQUNUXzI0QklUUyhwKSA9PSAweGFhYWEwMykgeyAvKiBTTkFQIGVuY2FwcyA/ICovCi0KLSAgICAgICAgICAgIGlmIChsbGNfcHJpbnQocCwgbDJpbmZvLmxlbmd0aCwgbDJpbmZvLmNhcGxlbiwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGwyaW5mby5kaXJlY3Rpb24gIT0gSlVOSVBFUl9CUEZfUEtUX0lOICYmIC8qIGV0aGVyLW92ZXItMTQ4MyBlbmNhcHMgPyAqLwotICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKGwyaW5mby5jb29raWUpICYgQVRNMl9HQVBfQ09VTlRfTUFTSykpIHsKLSAgICAgICAgICAgIGV0aGVyX3ByaW50KHAsIGwyaW5mby5sZW5ndGgsIGwyaW5mby5jYXBsZW4pOwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBbMF0gPT0gMHgwMykgeyAvKiBDaXNjbyBzdHlsZSBOTFBJRCBlbmNhcHMgPyAqLwotICAgICAgICAgICAgaXNvY2xuc19wcmludChwICsgMSwgbDJpbmZvLmxlbmd0aCAtIDEsIGwyaW5mby5jYXBsZW4gLSAxKTsKLSAgICAgICAgICAgIC8qIEZJWE1FIGNoZWNrIGlmIGZyYW1lIHdhcyByZWNvZ25pemVkICovCi0gICAgICAgICAgICByZXR1cm4gbDJpbmZvLmhlYWRlcl9sZW47Ci0gICAgICAgIH0KLQotICAgICAgICBpZihqdW5pcGVyX3BwcF9oZXVyaXN0aWNfZ3Vlc3MocCwgbDJpbmZvLmxlbmd0aCkgIT0gMCkgLyogUFBQb0EgdmNtdXggZW5jYXBzID8gKi8KLSAgICAgICAgICAgIHJldHVybiBsMmluZm8uaGVhZGVyX2xlbjsKLQotICAgICAgICBpZihpcF9oZXVyaXN0aWNfZ3Vlc3MocCwgbDJpbmZvLmxlbmd0aCkgIT0gMCkgLyogbGFzdCB0cnkgLSB2Y211eCBlbmNhcHMgPyAqLwotICAgICAgICAgICAgcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotCi0JcmV0dXJuIGwyaW5mby5oZWFkZXJfbGVuOwotfQotI2VuZGlmCi0KLQotLyogdHJ5IHRvIGd1ZXNzLCBiYXNlZCBvbiBhbGwgUFBQIHByb3RvcyB0aGF0IGFyZSBzdXBwb3J0ZWQgaW4KLSAqIGEganVuaXBlciByb3V0ZXIgaWYgdGhlIHBheWxvYWQgZGF0YSBpcyBlbmNhcHN1bGF0ZWQgdXNpbmcgUFBQICovCi1pbnQKLWp1bmlwZXJfcHBwX2hldXJpc3RpY19ndWVzcyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkgewotCi0gICAgc3dpdGNoKEVYVFJBQ1RfMTZCSVRTKHApKSB7Ci0gICAgY2FzZSBQUFBfSVAgOgotICAgIGNhc2UgUFBQX09TSSA6Ci0gICAgY2FzZSBQUFBfTVBMU19VQ0FTVCA6Ci0gICAgY2FzZSBQUFBfTVBMU19NQ0FTVCA6Ci0gICAgY2FzZSBQUFBfSVBDUCA6Ci0gICAgY2FzZSBQUFBfT1NJQ1AgOgotICAgIGNhc2UgUFBQX01QTFNDUCA6Ci0gICAgY2FzZSBQUFBfTENQIDoKLSAgICBjYXNlIFBQUF9QQVAgOgotICAgIGNhc2UgUFBQX0NIQVAgOgotICAgIGNhc2UgUFBQX01MIDoKLSNpZmRlZiBJTkVUNgotICAgIGNhc2UgUFBQX0lQVjYgOgotICAgIGNhc2UgUFBQX0lQVjZDUCA6Ci0jZW5kaWYKLSAgICAgICAgcHBwX3ByaW50KHAsIGxlbmd0aCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7IC8qIGRpZCBub3QgZmluZCBhIHBwcCBoZWFkZXIgKi8KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAxOyAvKiB3ZSBwcmludGVkIGEgcHBwIHBhY2tldCAqLwotfQotCi1pbnQKLWlwX2hldXJpc3RpY19ndWVzcyhyZWdpc3RlciBjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkgewotCi0gICAgc3dpdGNoKHBbMF0pIHsKLSAgICBjYXNlIDB4NDU6Ci0gICAgY2FzZSAweDQ2OgotICAgIGNhc2UgMHg0NzoKLSAgICBjYXNlIDB4NDg6Ci0gICAgY2FzZSAweDQ5OgotICAgIGNhc2UgMHg0YToKLSAgICBjYXNlIDB4NGI6Ci0gICAgY2FzZSAweDRjOgotICAgIGNhc2UgMHg0ZDoKLSAgICBjYXNlIDB4NGU6Ci0gICAgY2FzZSAweDRmOgotCSAgICBpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOwotCSAgICBicmVhazsKLSNpZmRlZiBJTkVUNgotICAgIGNhc2UgMHg2MDoKLSAgICBjYXNlIDB4NjE6Ci0gICAgY2FzZSAweDYyOgotICAgIGNhc2UgMHg2MzoKLSAgICBjYXNlIDB4NjQ6Ci0gICAgY2FzZSAweDY1OgotICAgIGNhc2UgMHg2NjoKLSAgICBjYXNlIDB4Njc6Ci0gICAgY2FzZSAweDY4OgotICAgIGNhc2UgMHg2OToKLSAgICBjYXNlIDB4NmE6Ci0gICAgY2FzZSAweDZiOgotICAgIGNhc2UgMHg2YzoKLSAgICBjYXNlIDB4NmQ6Ci0gICAgY2FzZSAweDZlOgotICAgIGNhc2UgMHg2ZjoKLSAgICAgICAgaXA2X3ByaW50KHAsIGxlbmd0aCk7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7IC8qIGRpZCBub3QgZmluZCBhIGlwIGhlYWRlciAqLwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDE7IC8qIHdlIHByaW50ZWQgYW4gdjQvdjYgcGFja2V0ICovCi19Ci0KLXN0YXRpYyBpbnQKLWp1bmlwZXJfcGFyc2VfaGVhZGVyIChjb25zdCB1X2NoYXIgKnAsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgc3RydWN0IGp1bmlwZXJfbDJpbmZvX3QgKmwyaW5mbykgewotCi0gICAgc3RydWN0IGp1bmlwZXJfY29va2llX3RhYmxlX3QgKmxwID0ganVuaXBlcl9jb29raWVfdGFibGU7Ci0gICAgdV9pbnQgaWR4LCBvZmZzZXQ7Ci0jaWZkZWYgRExUX0pVTklQRVJfQVRNMgotICAgIHVfaW50MzJfdCBjb250cm9sX3dvcmQ7Ci0jZW5kaWYKLQotICAgIGwyaW5mby0+aGVhZGVyX2xlbiA9IDA7Ci0gICAgbDJpbmZvLT5jb29raWVfbGVuID0gMDsKLSAgICBsMmluZm8tPnByb3RvID0gMDsKLQotCi0gICAgbDJpbmZvLT5sZW5ndGggPSBoLT5sZW47Ci0gICAgbDJpbmZvLT5jYXBsZW4gPSBoLT5jYXBsZW47Ci0gICAgbDJpbmZvLT5kaXJlY3Rpb24gPSBwWzNdJkpVTklQRVJfQlBGX1BLVF9JTjsKLSAgICAKLSAgICBUQ0hFQ0syKHBbMF0sNCk7Ci0gICAgaWYgKEVYVFJBQ1RfMjRCSVRTKHApICE9IEpVTklQRVJfTUdDX05VTUJFUikgeyAvKiBtYWdpYyBudW1iZXIgZm91bmQgPyAqLwotICAgICAgICBwcmludGYoIm5vIG1hZ2ljLW51bWJlciBmb3VuZCEiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSAKLQotICAgIGlmIChlZmxhZykgLyogcHJpbnQgZGlyZWN0aW9uICovCi0gICAgICAgIHByaW50ZigiJTNzICIsdG9rMnN0cihqdW5pcGVyX2RpcmVjdGlvbl92YWx1ZXMsIi0tLSIsbDJpbmZvLT5kaXJlY3Rpb24pKTsKLQotICAgIC8qIGV4dGVuc2lvbnMgcHJlc2VudCA/ICAtIGNhbGN1bGF0ZSBob3cgbXVjaCBieXRlcyB0byBza2lwICovCi0gICAgaWYgKChwWzNdICYgSlVOSVBFUl9CUEZfRVhUICkgPT0gSlVOSVBFUl9CUEZfRVhUICkgewotICAgICAgICBvZmZzZXQgPSA2ICsgRVhUUkFDVF8xNkJJVFMocCs0KTsKLSAgICAgICAgaWYgKGVmbGFnPjEpCi0gICAgICAgICAgICBwcmludGYoImV4dC1sZW4gJXUsICIsRVhUUkFDVF8xNkJJVFMocCs0KSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG9mZnNldCA9IDQ7Ci0KLSAgICBpZiAoKHBbM10gJiBKVU5JUEVSX0JQRl9OT19MMiApID09IEpVTklQRVJfQlBGX05PX0wyICkgeyAgICAgICAgICAgIAotICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIm5vLUwyLWhkciwgIik7Ci0KLSAgICAgICAgLyogdGhlcmUgaXMgbm8gbGluay1sYXllciBwcmVzZW50IC0KLSAgICAgICAgICogcGVyZm9ybSB0aGUgdjQvdjYgaGV1cmlzdGljcwotICAgICAgICAgKiB0byBmaWd1cmUgb3V0IHdoYXQgaXQgaXMKLSAgICAgICAgICovCi0gICAgICAgIFRDSEVDSzIocFtvZmZzZXQrNF0sMSk7Ci0gICAgICAgIGlmKGlwX2hldXJpc3RpY19ndWVzcyhwK29mZnNldCs0LGwyaW5mby0+bGVuZ3RoLShvZmZzZXQrNCkpID09IDApCi0gICAgICAgICAgICBwcmludGYoIm5vIElQLWhkciBmb3VuZCEiKTsKLQotICAgICAgICBsMmluZm8tPmhlYWRlcl9sZW49b2Zmc2V0KzQ7Ci0gICAgICAgIHJldHVybiAwOyAvKiBzdG9wIHBhcnNpbmcgdGhlIG91dHB1dCBmdXJ0aGVyICovCi0gICAgICAgIAotICAgIH0KLSAgICBsMmluZm8tPmhlYWRlcl9sZW4gPSBvZmZzZXQ7Ci0gICAgcCs9bDJpbmZvLT5oZWFkZXJfbGVuOwotICAgIGwyaW5mby0+bGVuZ3RoIC09IGwyaW5mby0+aGVhZGVyX2xlbjsKLSAgICBsMmluZm8tPmNhcGxlbiAtPSBsMmluZm8tPmhlYWRlcl9sZW47Ci0KLSAgICAvKiBzZWFyY2ggdGhyb3VnaCB0aGUgY29va2llIHRhYmxlIGFuZCBjb3B5IHZhbHVlcyBtYXRjaGluZyBmb3Igb3VyIFBJQyB0eXBlICovCi0gICAgd2hpbGUgKGxwLT5zICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKGxwLT5waWN0eXBlID09IGwyaW5mby0+cGljdHlwZSkgewotCi0gICAgICAgICAgICBsMmluZm8tPmNvb2tpZV9sZW4gKz0gbHAtPmNvb2tpZV9sZW47Ci0KLSAgICAgICAgICAgIHN3aXRjaCAocFswXSkgewotICAgICAgICAgICAgY2FzZSBMU19DT09LSUVfSUQ6Ci0gICAgICAgICAgICAgICAgbDJpbmZvLT5jb29raWVfdHlwZSA9IExTX0NPT0tJRV9JRDsKLSAgICAgICAgICAgICAgICBsMmluZm8tPmNvb2tpZV9sZW4gKz0gMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVNfQ09PS0lFX0lEOgotICAgICAgICAgICAgICAgIGwyaW5mby0+Y29va2llX3R5cGUgPSBBU19DT09LSUVfSUQ7Ci0gICAgICAgICAgICAgICAgbDJpbmZvLT5jb29raWVfbGVuID0gODsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IGwyaW5mby0+Y29va2llWzBdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0KLSNpZmRlZiBETFRfSlVOSVBFUl9NRlIKLSAgICAgICAgICAgIC8qIE1GUiBjaGlsZCBsaW5rcyBkb24ndCBjYXJyeSBjb29raWVzICovCi0gICAgICAgICAgICBpZiAobDJpbmZvLT5waWN0eXBlID09IERMVF9KVU5JUEVSX01GUiAmJgotICAgICAgICAgICAgICAgIChwWzBdICYgTUZSX0JFX01BU0spID09IE1GUl9CRV9NQVNLKSB7Ci0gICAgICAgICAgICAgICAgbDJpbmZvLT5jb29raWVfbGVuID0gMDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBsMmluZm8tPmhlYWRlcl9sZW4gKz0gbDJpbmZvLT5jb29raWVfbGVuOwotICAgICAgICAgICAgbDJpbmZvLT5sZW5ndGggLT0gbDJpbmZvLT5jb29raWVfbGVuOwotICAgICAgICAgICAgbDJpbmZvLT5jYXBsZW4gLT0gbDJpbmZvLT5jb29raWVfbGVuOwotCi0gICAgICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcy1QSUMsIGNvb2tpZS1sZW4gJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBscC0+cywKLSAgICAgICAgICAgICAgICAgICAgICAgbDJpbmZvLT5jb29raWVfbGVuKTsKLQotICAgICAgICAgICAgaWYgKGwyaW5mby0+Y29va2llX2xlbiA+IDApIHsKLSAgICAgICAgICAgICAgICBUQ0hFQ0syKHBbMF0sbDJpbmZvLT5jb29raWVfbGVuKTsKLSAgICAgICAgICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBjb29raWUgMHgiKTsKLSAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGwyaW5mby0+Y29va2llX2xlbjsgaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgbDJpbmZvLT5jb29raWVbaWR4XSA9IHBbaWR4XTsgLyogY29weSBjb29raWUgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoZWZsYWcpIHByaW50ZigiJTAyeCIscFtpZHhdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlZmxhZykgcHJpbnRmKCI6ICIpOyAvKiBwcmludCBkZW1hcmMgYi93IEwyL0wzKi8KLSAgICAgICAgICAgIAotCi0gICAgICAgICAgICBsMmluZm8tPnByb3RvID0gRVhUUkFDVF8xNkJJVFMocCtsMmluZm8tPmNvb2tpZV9sZW4pOyAKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgICsrbHA7Ci0gICAgfQotICAgIHArPWwyaW5mby0+Y29va2llX2xlbjsKLQotICAgIC8qIERMVF8gc3BlY2lmaWMgcGFyc2luZyAqLwotICAgIHN3aXRjaChsMmluZm8tPnBpY3R5cGUpIHsKLSNpZmRlZiBETFRfSlVOSVBFUl9NTFBQUAotICAgIGNhc2UgRExUX0pVTklQRVJfTUxQUFA6Ci0gICAgICAgIHN3aXRjaCAobDJpbmZvLT5jb29raWVfdHlwZSkgewotICAgICAgICBjYXNlIExTX0NPT0tJRV9JRDoKLSAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gbDJpbmZvLT5jb29raWVbMV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU19DT09LSUVfSUQ6Ci0gICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IChFWFRSQUNUXzE2QklUUygmbDJpbmZvLT5jb29raWVbNl0pPj4zKSYweGZmZjsKLSAgICAgICAgICAgIGwyaW5mby0+cHJvdG8gPSAobDJpbmZvLT5jb29raWVbNV0pJkpVTklQRVJfTFNRX0wzX1BST1RPX01BU0s7ICAgICAgICAgICAgCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gbDJpbmZvLT5jb29raWVbMF07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX01MRlIKLSAgICBjYXNlIERMVF9KVU5JUEVSX01MRlI6Ci0gICAgICAgIHN3aXRjaCAobDJpbmZvLT5jb29raWVfdHlwZSkgewotICAgICAgICBjYXNlIExTX0NPT0tJRV9JRDoKLSAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gbDJpbmZvLT5jb29raWVbMV07Ci0gICAgICAgICAgICBsMmluZm8tPnByb3RvID0gRVhUUkFDVF8xNkJJVFMocCk7ICAgICAgICAKLSAgICAgICAgICAgIGwyaW5mby0+aGVhZGVyX2xlbiArPSAyOwotICAgICAgICAgICAgbDJpbmZvLT5sZW5ndGggLT0gMjsKLSAgICAgICAgICAgIGwyaW5mby0+Y2FwbGVuIC09IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBU19DT09LSUVfSUQ6Ci0gICAgICAgICAgICBsMmluZm8tPmJ1bmRsZSA9IChFWFRSQUNUXzE2QklUUygmbDJpbmZvLT5jb29raWVbNl0pPj4zKSYweGZmZjsKLSAgICAgICAgICAgIGwyaW5mby0+cHJvdG8gPSAobDJpbmZvLT5jb29raWVbNV0pJkpVTklQRVJfTFNRX0wzX1BST1RPX01BU0s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gbDJpbmZvLT5jb29raWVbMF07Ci0gICAgICAgICAgICBsMmluZm8tPmhlYWRlcl9sZW4gKz0gMjsKLSAgICAgICAgICAgIGwyaW5mby0+bGVuZ3RoIC09IDI7Ci0gICAgICAgICAgICBsMmluZm8tPmNhcGxlbiAtPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9NRlIKLSAgICBjYXNlIERMVF9KVU5JUEVSX01GUjoKLSAgICAgICAgc3dpdGNoIChsMmluZm8tPmNvb2tpZV90eXBlKSB7Ci0gICAgICAgIGNhc2UgTFNfQ09PS0lFX0lEOgotICAgICAgICAgICAgbDJpbmZvLT5idW5kbGUgPSBsMmluZm8tPmNvb2tpZVsxXTsKLSAgICAgICAgICAgIGwyaW5mby0+cHJvdG8gPSBFWFRSQUNUXzE2QklUUyhwKTsgICAgICAgIAotICAgICAgICAgICAgbDJpbmZvLT5oZWFkZXJfbGVuICs9IDI7Ci0gICAgICAgICAgICBsMmluZm8tPmxlbmd0aCAtPSAyOwotICAgICAgICAgICAgbDJpbmZvLT5jYXBsZW4gLT0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFTX0NPT0tJRV9JRDoKLSAgICAgICAgICAgIGwyaW5mby0+YnVuZGxlID0gKEVYVFJBQ1RfMTZCSVRTKCZsMmluZm8tPmNvb2tpZVs2XSk+PjMpJjB4ZmZmOwotICAgICAgICAgICAgbDJpbmZvLT5wcm90byA9IChsMmluZm8tPmNvb2tpZVs1XSkmSlVOSVBFUl9MU1FfTDNfUFJPVE9fTUFTSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbDJpbmZvLT5idW5kbGUgPSBsMmluZm8tPmNvb2tpZVswXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfQVRNMgotICAgIGNhc2UgRExUX0pVTklQRVJfQVRNMjoKLSAgICAgICAgVENIRUNLMihwWzBdLDQpOwotICAgICAgICAvKiBBVE0gY2VsbCByZWxheSBjb250cm9sIHdvcmQgcHJlc2VudCA/ICovCi0gICAgICAgIGlmIChsMmluZm8tPmNvb2tpZVs3XSAmIEFUTTJfUEtUX1RZUEVfTUFTSykgewotICAgICAgICAgICAgY29udHJvbF93b3JkID0gRVhUUkFDVF8zMkJJVFMocCk7Ci0gICAgICAgICAgICAvKiBzb21lIGNvbnRyb2wgd29yZCBoZXVyaXN0aWNzICovCi0gICAgICAgICAgICBzd2l0Y2goY29udHJvbF93b3JkKSB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8qIHplcm8gY29udHJvbCB3b3JkICovCi0gICAgICAgICAgICBjYXNlIDB4MDgwMDAwMDA6IC8qIDwgSlVOT1MgNy40IGNvbnRyb2wtd29yZCAqLwotICAgICAgICAgICAgY2FzZSAweDA4MzgwMDAwOiAvKiBjbnRsIHdvcmQgcGx1cyBjZWxsIGxlbmd0aCAoNTYpID49IEpVTk9TIDcuNCovCi0gICAgICAgICAgICAgICAgbDJpbmZvLT5oZWFkZXJfbGVuICs9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJjb250cm9sLXdvcmQgMHglMDh4ICIsIGNvbnRyb2xfd29yZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9BVE0xCi0gICAgY2FzZSBETFRfSlVOSVBFUl9BVE0xOgotICAgICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX1BQUAotICAgIGNhc2UgRExUX0pVTklQRVJfUFBQOgotICAgICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX0NIRExDCi0gICAgY2FzZSBETFRfSlVOSVBFUl9DSERMQzoKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9FVEhFUgotICAgIGNhc2UgRExUX0pVTklQRVJfRVRIRVI6Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfRlJFTEFZCi0gICAgY2FzZSBETFRfSlVOSVBFUl9GUkVMQVk6Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgICBwcmludGYoIlVua25vd24gSnVuaXBlciBETFRfIHR5cGUgJXU6ICIsIGwyaW5mby0+cGljdHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICAKLSAgICBpZiAoZWZsYWcgPiAxKQotICAgICAgICBwcmludGYoImhsZW4gJXUsIHByb3RvIDB4JTA0eCwgIixsMmluZm8tPmhlYWRlcl9sZW4sbDJpbmZvLT5wcm90byk7Ci0KLSAgICByZXR1cm4gMTsgLyogZXZlcnl0aGluZyB3ZW50IG9rIHNvIGZhci4gY29udGludWUgcGFyc2luZyAqLwotIHRydW5jOgotICAgIHByaW50ZigiW3xqdW5pcGVyX2hkcl0sIGxlbmd0aCAldSIsaC0+bGVuKTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogYy1zdHlsZTogd2hpdGVzbWl0aAotICogYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQta3JiLmMgYi9wcmludC1rcmIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjOGUxNC4uMDAwMDAwMAotLS0gYS9wcmludC1rcmIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogSW5pdGlhbCBjb250cmlidXRpb24gZnJvbSBKb2huIEhhd2tpbnNvbiAoamhhd2tAbWl0LmVkdSkuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQta3JiLmMsdiAxLjIzIDIwMDMvMTEvMTYgMDk6MzY6MjYgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKmNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICosIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKmtyYjRfcHJpbnRfaGRyKGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyB2b2lkIGtyYjRfcHJpbnQoY29uc3QgdV9jaGFyICopOwotCi0jZGVmaW5lIEFVVEhfTVNHX0tEQ19SRVFVRVNUCQkJMTw8MQotI2RlZmluZSBBVVRIX01TR19LRENfUkVQTFkJCQkyPDwxCi0jZGVmaW5lIEFVVEhfTVNHX0FQUExfUkVRVUVTVAkJCTM8PDEKLSNkZWZpbmUgQVVUSF9NU0dfQVBQTF9SRVFVRVNUX01VVFVBTAkJNDw8MQotI2RlZmluZSBBVVRIX01TR19FUlJfUkVQTFkJCQk1PDwxCi0jZGVmaW5lIEFVVEhfTVNHX1BSSVZBVEUJCQk2PDwxCi0jZGVmaW5lIEFVVEhfTVNHX1NBRkUJCQkJNzw8MQotI2RlZmluZSBBVVRIX01TR19BUFBMX0VSUgkJCTg8PDEKLSNkZWZpbmUgQVVUSF9NU0dfRElFCQkJCTYzPDwxCi0KLSNkZWZpbmUgS0VSQl9FUlJfT0sJCQkJMAotI2RlZmluZSBLRVJCX0VSUl9OQU1FX0VYUAkJCTEKLSNkZWZpbmUgS0VSQl9FUlJfU0VSVklDRV9FWFAJCQkyCi0jZGVmaW5lIEtFUkJfRVJSX0FVVEhfRVhQCQkJMwotI2RlZmluZSBLRVJCX0VSUl9QS1RfVkVSCQkJNAotI2RlZmluZSBLRVJCX0VSUl9OQU1FX01BU1RfS0VZX1ZFUgkJNQotI2RlZmluZSBLRVJCX0VSUl9TRVJWX01BU1RfS0VZX1ZFUgkJNgotI2RlZmluZSBLRVJCX0VSUl9CWVRFX09SREVSCQkJNwotI2RlZmluZSBLRVJCX0VSUl9QUklOQ0lQQUxfVU5LTk9XTgkJOAotI2RlZmluZSBLRVJCX0VSUl9QUklOQ0lQQUxfTk9UX1VOSVFVRQkJOQotI2RlZmluZSBLRVJCX0VSUl9OVUxMX0tFWQkJCTEwCi0KLXN0cnVjdCBrcmIgewotCXVfaW50OF90IHB2bm87CQkvKiBQcm90b2NvbCBWZXJzaW9uICovCi0JdV9pbnQ4X3QgdHlwZTsJCS8qIFR5cGUrQiAqLwotfTsKLQotc3RhdGljIGNoYXIgdHN0cltdID0gIiBbfGtlcmJlcm9zXSI7Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7Ci0JeyBBVVRIX01TR19LRENfUkVRVUVTVCwJCSJLRENfUkVRVUVTVCIgfSwKLQl7IEFVVEhfTVNHX0tEQ19SRVBMWSwJCSJLRENfUkVQTFkiIH0sCi0JeyBBVVRIX01TR19BUFBMX1JFUVVFU1QsCSJBUFBMX1JFUVVFU1QiIH0sCi0JeyBBVVRIX01TR19BUFBMX1JFUVVFU1RfTVVUVUFMLAkiQVBQTF9SRVFVRVNUX01VVFVBTCIgfSwKLQl7IEFVVEhfTVNHX0VSUl9SRVBMWSwJCSJFUlJfUkVQTFkiIH0sCi0JeyBBVVRIX01TR19QUklWQVRFLAkJIlBSSVZBVEUiIH0sCi0JeyBBVVRIX01TR19TQUZFLAkJIlNBRkUiIH0sCi0JeyBBVVRIX01TR19BUFBMX0VSUiwJCSJBUFBMX0VSUiIgfSwKLQl7IEFVVEhfTVNHX0RJRSwJCQkiRElFIiB9LAotCXsgMCwJCQkJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBrZXJyMnN0cltdID0gewotCXsgS0VSQl9FUlJfT0ssCQkJIk9LIiB9LAotCXsgS0VSQl9FUlJfTkFNRV9FWFAsCQkiTkFNRV9FWFAiIH0sCi0JeyBLRVJCX0VSUl9TRVJWSUNFX0VYUCwJCSJTRVJWSUNFX0VYUCIgfSwKLQl7IEtFUkJfRVJSX0FVVEhfRVhQLAkJIkFVVEhfRVhQIiB9LAotCXsgS0VSQl9FUlJfUEtUX1ZFUiwJCSJQS1RfVkVSIiB9LAotCXsgS0VSQl9FUlJfTkFNRV9NQVNUX0tFWV9WRVIsCSJOQU1FX01BU1RfS0VZX1ZFUiIgfSwKLQl7IEtFUkJfRVJSX1NFUlZfTUFTVF9LRVlfVkVSLAkiU0VSVl9NQVNUX0tFWV9WRVIiIH0sCi0JeyBLRVJCX0VSUl9CWVRFX09SREVSLAkJIkJZVEVfT1JERVIiIH0sCi0JeyBLRVJCX0VSUl9QUklOQ0lQQUxfVU5LTk9XTiwJIlBSSU5DSVBBTF9VTktOT1dOIiB9LAotCXsgS0VSQl9FUlJfUFJJTkNJUEFMX05PVF9VTklRVUUsIlBSSU5DSVBBTF9OT1RfVU5JUVVFIiB9LAotCXsgS0VSQl9FUlJfTlVMTF9LRVksCQkiTlVMTF9LRVkifSwKLQl7IDAsCQkJCU5VTEx9Ci19OwotCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLWNfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpzLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQotewotCXJlZ2lzdGVyIHVfY2hhciBjOwotCXJlZ2lzdGVyIGludCBmbGFnOwotCi0JZmxhZyA9IDE7Ci0Jd2hpbGUgKHMgPCBlcCkgewotCQljID0gKnMrKzsKLQkJaWYgKGMgPT0gJ1wwJykgewotCQkJZmxhZyA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIWlzYXNjaWkoYykpIHsKLQkJCWMgPSB0b2FzY2lpKGMpOwotCQkJcHV0Y2hhcignTScpOwotCQkJcHV0Y2hhcignLScpOwotCQl9Ci0JCWlmICghaXNwcmludChjKSkgewotCQkJYyBePSAweDQwOwkvKiBERUwgdG8gPywgb3RoZXJzIHRvIGFscGhhICovCi0JCQlwdXRjaGFyKCdeJyk7Ci0JCX0KLQkJcHV0Y2hhcihjKTsKLQl9Ci0JaWYgKGZsYWcpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAocyk7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgota3JiNF9wcmludF9oZHIoY29uc3QgdV9jaGFyICpjcCkKLXsKLQljcCArPSAyOwotCi0jZGVmaW5lIFBSSU5UCQlpZiAoKGNwID0gY19wcmludChjcCwgc25hcGVuZCkpID09IE5VTEwpIGdvdG8gdHJ1bmMKLQotCVBSSU5UOwotCXB1dGNoYXIoJy4nKTsKLQlQUklOVDsKLQlwdXRjaGFyKCdAJyk7Ci0JUFJJTlQ7Ci0JcmV0dXJuIChjcCk7Ci0KLXRydW5jOgotCWZwdXRzKHRzdHIsIHN0ZG91dCk7Ci0JcmV0dXJuIChOVUxMKTsKLQotI3VuZGVmIFBSSU5UCi19Ci0KLXN0YXRpYyB2b2lkCi1rcmI0X3ByaW50KGNvbnN0IHVfY2hhciAqY3ApCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGtyYiAqa3A7Ci0JdV9jaGFyIHR5cGU7Ci0JdV9zaG9ydCBsZW47Ci0KLSNkZWZpbmUgUFJJTlQJCWlmICgoY3AgPSBjX3ByaW50KGNwLCBzbmFwZW5kKSkgPT0gTlVMTCkgZ290byB0cnVuYwotLyogIFRydWUgaWYgc3RydWN0IGtyYiBpcyBsaXR0bGUgZW5kaWFuICovCi0jZGVmaW5lIElTX0xFTkRJQU4oa3ApCSgoKGtwKS0+dHlwZSAmIDB4MDEpICE9IDApCi0jZGVmaW5lIEtUT0hTUChrcCwgY3ApCShJU19MRU5ESUFOKGtwKSA/IEVYVFJBQ1RfTEVfMTZCSVRTKGNwKSA6IEVYVFJBQ1RfMTZCSVRTKGNwKSkKLQotCWtwID0gKHN0cnVjdCBrcmIgKiljcDsKLQotCWlmICgoJmtwLT50eXBlKSA+PSBzbmFwZW5kKSB7Ci0JCWZwdXRzKHRzdHIsIHN0ZG91dCk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0eXBlID0ga3AtPnR5cGUgJiAoMHhGRiA8PCAxKTsKLQotCXByaW50ZigiICVzICVzOiAiLAotCSAgICBJU19MRU5ESUFOKGtwKSA/ICJsZSIgOiAiYmUiLCB0b2syc3RyKHR5cGUyc3RyLCBOVUxMLCB0eXBlKSk7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQotCWNhc2UgQVVUSF9NU0dfS0RDX1JFUVVFU1Q6Ci0JCWlmICgoY3AgPSBrcmI0X3ByaW50X2hkcihjcCkpID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWNwICs9IDQ7CS8qIGN0aW1lICovCi0JCVRDSEVDSygqY3ApOwotCQlwcmludGYoIiAlZG1pbiAiLCAqY3ArKyAqIDUpOwotCQlQUklOVDsKLQkJcHV0Y2hhcignLicpOwotCQlQUklOVDsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVVEhfTVNHX0FQUExfUkVRVUVTVDoKLQkJY3AgKz0gMjsKLQkJVENIRUNLKCpjcCk7Ci0JCXByaW50ZigidiVkICIsICpjcCsrKTsKLQkJUFJJTlQ7Ci0JCVRDSEVDSygqY3ApOwotCQlwcmludGYoIiAoJWQpIiwgKmNwKyspOwotCQlUQ0hFQ0soKmNwKTsKLQkJcHJpbnRmKCIgKCVkKSIsICpjcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBBVVRIX01TR19LRENfUkVQTFk6Ci0JCWlmICgoY3AgPSBrcmI0X3ByaW50X2hkcihjcCkpID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWNwICs9IDEwOwkvKiB0aW1lc3RhbXAgKyBuICsgZXhwICsga3ZubyAqLwotCQlUQ0hFQ0syKCpjcCwgc2l6ZW9mKHNob3J0KSk7Ci0JCWxlbiA9IEtUT0hTUChrcCwgY3ApOwotCQlwcmludGYoIiAoJWQpIiwgbGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEFVVEhfTVNHX0VSUl9SRVBMWToKLQkJaWYgKChjcCA9IGtyYjRfcHJpbnRfaGRyKGNwKSkgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJY3AgKz0gNDsgCSAgLyogdGltZXN0YW1wICovCi0JCVRDSEVDSzIoKmNwLCBzaXplb2Yoc2hvcnQpKTsKLQkJcHJpbnRmKCIgJXMgIiwgdG9rMnN0cihrZXJyMnN0ciwgTlVMTCwgS1RPSFNQKGtwLCBjcCkpKTsKLQkJY3AgKz0gNDsKLQkJUFJJTlQ7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZnB1dHMoIih1bmtub3duKSIsIHN0ZG91dCk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybjsKLXRydW5jOgotCWZwdXRzKHRzdHIsIHN0ZG91dCk7Ci19Ci0KLXZvaWQKLWtyYl9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qga3JiICprcDsKLQotCWtwID0gKHN0cnVjdCBrcmIgKilkYXQ7Ci0KLQlpZiAoZGF0ID49IHNuYXBlbmQpIHsKLQkJZnB1dHModHN0ciwgc3Rkb3V0KTsKLQkJcmV0dXJuOwotCX0KLQotCXN3aXRjaCAoa3AtPnB2bm8pIHsKLQotCWNhc2UgMToKLQljYXNlIDI6Ci0JY2FzZSAzOgotCQlwcmludGYoIiB2JWQiLCBrcC0+cHZubyk7Ci0JCWJyZWFrOwotCi0JY2FzZSA0OgotCQlwcmludGYoIiB2JWQiLCBrcC0+cHZubyk7Ci0JCWtyYjRfcHJpbnQoKGNvbnN0IHVfY2hhciAqKWtwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDEwNjoKLQljYXNlIDEwNzoKLQkJZnB1dHMoIiB2NSIsIHN0ZG91dCk7Ci0JCS8qIERlY29kZSBBU04uMSBoZXJlICJzb21lZGF5IiAqLwotCQlicmVhazsKLQl9Ci0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtbDJ0cC5jIGIvcHJpbnQtbDJ0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2VhYjQzLi4wMDAwMDAwCi0tLSBhL3ByaW50LWwydHAuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBMMlRQIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTW90b25vcmkgU2hpbmRvIChtc2hpbmRvQG1zaGluZG8ubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWwydHAuYyx2IDEuMTcuMi4zIDIwMDYvMDYvMjMgMDI6MDc6MjcgaGFubmVzIEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImwydHAuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLXN0YXRpYyBjaGFyIHRzdHJbXSA9ICIgW3xsMnRwXSI7Ci0KLSNkZWZpbmUJTDJUUF9NU0dUWVBFX1NDQ1JRCTEgIC8qIFN0YXJ0LUNvbnRyb2wtQ29ubmVjdGlvbi1SZXF1ZXN0ICovCi0jZGVmaW5lCUwyVFBfTVNHVFlQRV9TQ0NSUAkyICAvKiBTdGFydC1Db250cm9sLUNvbm5lY3Rpb24tUmVwbHkgKi8KLSNkZWZpbmUJTDJUUF9NU0dUWVBFX1NDQ0NOCTMgIC8qIFN0YXJ0LUNvbnRyb2wtQ29ubmVjdGlvbi1Db25uZWN0ZWQgKi8KLSNkZWZpbmUJTDJUUF9NU0dUWVBFX1NUT1BDQ04JNCAgLyogU3RvcC1Db250cm9sLUNvbm5lY3Rpb24tTm90aWZpY2F0aW9uICovCi0jZGVmaW5lCUwyVFBfTVNHVFlQRV9IRUxMTwk2ICAvKiBIZWxsbyAqLwotI2RlZmluZQlMMlRQX01TR1RZUEVfT0NSUQk3ICAvKiBPdXRnb2luZy1DYWxsLVJlcXVlc3QgKi8KLSNkZWZpbmUJTDJUUF9NU0dUWVBFX09DUlAJOCAgLyogT3V0Z29pbmctQ2FsbC1SZXBseSAqLwotI2RlZmluZQlMMlRQX01TR1RZUEVfT0NDTgk5ICAvKiBPdXRnb2luZy1DYWxsLUNvbm5lY3RlZCAqLwotI2RlZmluZQlMMlRQX01TR1RZUEVfSUNSUQkxMCAvKiBJbmNvbWluZy1DYWxsLVJlcXVlc3QgKi8KLSNkZWZpbmUJTDJUUF9NU0dUWVBFX0lDUlAJMTEgLyogSW5jb21pbmctQ2FsbC1SZXBseSAqLwotI2RlZmluZQlMMlRQX01TR1RZUEVfSUNDTgkxMiAvKiBJbmNvbWluZy1DYWxsLUNvbm5lY3RlZCAqLwotI2RlZmluZQlMMlRQX01TR1RZUEVfQ0ROCTE0IC8qIENhbGwtRGlzY29ubmVjdC1Ob3RpZnkgKi8KLSNkZWZpbmUJTDJUUF9NU0dUWVBFX1dFTgkxNSAvKiBXQU4tRXJyb3ItTm90aWZ5ICovCi0jZGVmaW5lCUwyVFBfTVNHVFlQRV9TTEkJMTYgLyogU2V0LUxpbmstSW5mbyAqLwotCi1zdGF0aWMgc3RydWN0IHRvayBsMnRwX21zZ3R5cGUyc3RyW10gPSB7Ci0JeyBMMlRQX01TR1RZUEVfU0NDUlEsIAkiU0NDUlEiIH0sCi0JeyBMMlRQX01TR1RZUEVfU0NDUlAsCSJTQ0NSUCIgfSwKLQl7IEwyVFBfTVNHVFlQRV9TQ0NDTiwJIlNDQ0NOIiB9LAotCXsgTDJUUF9NU0dUWVBFX1NUT1BDQ04sCSJTdG9wQ0NOIiB9LAotCXsgTDJUUF9NU0dUWVBFX0hFTExPLAkiSEVMTE8iIH0sCi0JeyBMMlRQX01TR1RZUEVfT0NSUSwJIk9DUlEiIH0sCi0JeyBMMlRQX01TR1RZUEVfT0NSUCwJIk9DUlAiIH0sCi0JeyBMMlRQX01TR1RZUEVfT0NDTiwJIk9DQ04iIH0sCi0JeyBMMlRQX01TR1RZUEVfSUNSUSwJIklDUlEiIH0sCi0JeyBMMlRQX01TR1RZUEVfSUNSUCwJIklDUlAiIH0sCi0JeyBMMlRQX01TR1RZUEVfSUNDTiwJIklDQ04iIH0sCi0JeyBMMlRQX01TR1RZUEVfQ0ROLAkiQ0ROIiB9LAotCXsgTDJUUF9NU0dUWVBFX1dFTiwJIldFTiIgfSwKLQl7IEwyVFBfTVNHVFlQRV9TTEksCSJTTEkiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotI2RlZmluZSBMMlRQX0FWUF9NU0dUWVBFCQkwICAvKiBNZXNzYWdlIFR5cGUgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUkVTVUxUX0NPREUJCTEgIC8qIFJlc3VsdCBDb2RlICovCi0jZGVmaW5lIEwyVFBfQVZQX1BST1RPX1ZFUgkJMiAgLyogUHJvdG9jb2wgVmVyc2lvbiAqLwotI2RlZmluZSBMMlRQX0FWUF9GUkFNSU5HX0NBUAkJMyAgLyogRnJhbWluZyBDYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgTDJUUF9BVlBfQkVBUkVSX0NBUAkJNCAgLyogQmVhcmVyIENhcGFiaWxpdGllcyAqLwotI2RlZmluZSBMMlRQX0FWUF9USUVfQlJFQUtFUgkJNSAgLyogVGllIEJyZWFrZXIgKi8KLSNkZWZpbmUgTDJUUF9BVlBfRklSTV9WRVIJCTYgIC8qIEZpcm13YXJlIFJldmlzaW9uICovCi0jZGVmaW5lIEwyVFBfQVZQX0hPU1RfTkFNRQkJNyAgLyogSG9zdCBOYW1lICovCi0jZGVmaW5lIEwyVFBfQVZQX1ZFTkRPUl9OQU1FCQk4ICAvKiBWZW5kb3IgTmFtZSAqLwotI2RlZmluZSBMMlRQX0FWUF9BU1NORF9UVU5fSUQgCQk5ICAvKiBBc3NpZ25lZCBUdW5uZWwgSUQgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUkVDVl9XSU5fU0laRQkJMTAgLyogUmVjZWl2ZSBXaW5kb3cgU2l6ZSAqLwotI2RlZmluZSBMMlRQX0FWUF9DSEFMTEVOR0UJCTExIC8qIENoYWxsZW5nZSAqLwotI2RlZmluZSBMMlRQX0FWUF9ROTMxX0NDCQkxMiAvKiBRLjkzMSBDYXVzZSBDb2RlICovCi0jZGVmaW5lIEwyVFBfQVZQX0NIQUxMRU5HRV9SRVNQCQkxMyAvKiBDaGFsbGVuZ2UgUmVzcG9uc2UgKi8KLSNkZWZpbmUgTDJUUF9BVlBfQVNTTkRfU0VTU19JRCAgCTE0IC8qIEFzc2lnbmVkIFNlc3Npb24gSUQgKi8KLSNkZWZpbmUgTDJUUF9BVlBfQ0FMTF9TRVJfTlVNIAkJMTUgLyogQ2FsbCBTZXJpYWwgTnVtYmVyICovCi0jZGVmaW5lIEwyVFBfQVZQX01JTklNVU1fQlBTCQkxNiAvKiBNaW5pbXVtIEJQUyAqLwotI2RlZmluZSBMMlRQX0FWUF9NQVhJTVVNX0JQUwkJMTcgLyogTWF4aW11bSBCUFMgKi8KLSNkZWZpbmUgTDJUUF9BVlBfQkVBUkVSX1RZUEUJCTE4IC8qIEJlYXJlciBUeXBlICovCi0jZGVmaW5lIEwyVFBfQVZQX0ZSQU1JTkdfVFlQRSAJCTE5IC8qIEZyYW1pbmcgVHlwZSAqLwotI2RlZmluZSBMMlRQX0FWUF9QQUNLRVRfUFJPQ19ERUxBWQkyMCAvKiBQYWNrZXQgUHJvY2Vzc2luZyBEZWxheSAoT0JTT0xFVEUpICovCi0jZGVmaW5lIEwyVFBfQVZQX0NBTExFRF9OVU1CRVIJCTIxIC8qIENhbGxlZCBOdW1iZXIgKi8KLSNkZWZpbmUgTDJUUF9BVlBfQ0FMTElOR19OVU1CRVIJCTIyIC8qIENhbGxpbmcgTnVtYmVyICovCi0jZGVmaW5lIEwyVFBfQVZQX1NVQl9BRERSRVNTCQkyMyAvKiBTdWItQWRkcmVzcyAqLwotI2RlZmluZSBMMlRQX0FWUF9UWF9DT05OX1NQRUVECQkyNCAvKiAoVHgpIENvbm5lY3QgU3BlZWQgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUEhZX0NIQU5ORUxfSUQJCTI1IC8qIFBoeXNpY2FsIENoYW5uZWwgSUQgKi8KLSNkZWZpbmUgTDJUUF9BVlBfSU5JX1JFQ1ZfTENQCQkyNiAvKiBJbml0aWFsIFJlY2VpdmVkIExDUCBDT05GUkVRICovCi0jZGVmaW5lIEwyVFBfQVZQX0xBU1RfU0VOVF9MQ1AJCTI3IC8qIExhc3QgU2VudCBMQ1AgQ09ORlJFUSAqLwotI2RlZmluZSBMMlRQX0FWUF9MQVNUX1JFQ1ZfTENQCQkyOCAvKiBMYXN0IFJlY2VpdmVkIExDUCBDT05GUkVRICovCi0jZGVmaW5lIEwyVFBfQVZQX1BST1hZX0FVVEhfVFlQRQkyOSAvKiBQcm94eSBBdXRoZW4gVHlwZSAqLwotI2RlZmluZSBMMlRQX0FWUF9QUk9YWV9BVVRIX05BTUUJMzAgLyogUHJveHkgQXV0aGVuIE5hbWUgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUFJPWFlfQVVUSF9DSEFMCTMxIC8qIFByb3h5IEF1dGhlbiBDaGFsbGVuZ2UgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUFJPWFlfQVVUSF9JRAkJMzIgLyogUHJveHkgQXV0aGVuIElEICovCi0jZGVmaW5lIEwyVFBfQVZQX1BST1hZX0FVVEhfUkVTUAkzMyAvKiBQcm94eSBBdXRoZW4gUmVzcG9uc2UgKi8KLSNkZWZpbmUgTDJUUF9BVlBfQ0FMTF9FUlJPUlMJCTM0IC8qIENhbGwgRXJyb3JzICovCi0jZGVmaW5lIEwyVFBfQVZQX0FDQ00JCQkzNSAvKiBBQ0NNICovCi0jZGVmaW5lIEwyVFBfQVZQX1JBTkRPTV9WRUNUT1IJCTM2IC8qIFJhbmRvbSBWZWN0b3IgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUFJJVkFURV9HUlBfSUQJCTM3IC8qIFByaXZhdGUgR3JvdXAgSUQgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUlhfQ09OTl9TUEVFRAkJMzggLyogKFJ4KSBDb25uZWN0IFNwZWVkICovCi0jZGVmaW5lIEwyVFBfQVZQX1NFUV9SRVFVSVJFRCAJCTM5IC8qIFNlcXVlbmNpbmcgUmVxdWlyZWQgKi8KLSNkZWZpbmUgTDJUUF9BVlBfUFBQX0RJU0NPTl9DQwkJNDYgLyogUFBQIERpc2Nvbm5lY3QgQ2F1c2UgQ29kZSAqLwotCi1zdGF0aWMgc3RydWN0IHRvayBsMnRwX2F2cDJzdHJbXSA9IHsKLQl7IEwyVFBfQVZQX01TR1RZUEUsCQkiTVNHVFlQRSIgfSwKLQl7IEwyVFBfQVZQX1JFU1VMVF9DT0RFLAkJIlJFU1VMVF9DT0RFIiB9LAotCXsgTDJUUF9BVlBfUFJPVE9fVkVSLAkJIlBST1RPX1ZFUiIgfSwKLQl7IEwyVFBfQVZQX0ZSQU1JTkdfQ0FQLAkJIkZSQU1JTkdfQ0FQIiB9LAotCXsgTDJUUF9BVlBfQkVBUkVSX0NBUCwJCSJCRUFSRVJfQ0FQIiB9LAotCXsgTDJUUF9BVlBfVElFX0JSRUFLRVIsCQkiVElFX0JSRUFLRVIiIH0sCi0JeyBMMlRQX0FWUF9GSVJNX1ZFUiwJCSJGSVJNX1ZFUiIgfSwKLQl7IEwyVFBfQVZQX0hPU1RfTkFNRSwJCSJIT1NUX05BTUUiIH0sCi0JeyBMMlRQX0FWUF9WRU5ET1JfTkFNRSwJCSJWRU5ET1JfTkFNRSIgfSwKLQl7IEwyVFBfQVZQX0FTU05EX1RVTl9JRCwJIkFTU05EX1RVTl9JRCIgfSwKLQl7IEwyVFBfQVZQX1JFQ1ZfV0lOX1NJWkUsCSJSRUNWX1dJTl9TSVpFIiB9LAotCXsgTDJUUF9BVlBfQ0hBTExFTkdFLAkJIkNIQUxMRU5HRSIgfSwKLQl7IEwyVFBfQVZQX1E5MzFfQ0MsCQkiUTkzMV9DQyIsIH0sCi0JeyBMMlRQX0FWUF9DSEFMTEVOR0VfUkVTUCwJIkNIQUxMRU5HRV9SRVNQIiB9LAotCXsgTDJUUF9BVlBfQVNTTkRfU0VTU19JRCwJIkFTU05EX1NFU1NfSUQiIH0sCi0JeyBMMlRQX0FWUF9DQUxMX1NFUl9OVU0sCSJDQUxMX1NFUl9OVU0iIH0sCi0JeyBMMlRQX0FWUF9NSU5JTVVNX0JQUywJCSJNSU5JTVVNX0JQUyIgfSwKLQl7IEwyVFBfQVZQX01BWElNVU1fQlBTLAkJIk1BWElNVU1fQlBTIiB9LAotCXsgTDJUUF9BVlBfQkVBUkVSX1RZUEUsCQkiQkVBUkVSX1RZUEUiIH0sCi0JeyBMMlRQX0FWUF9GUkFNSU5HX1RZUEUsCSJGUkFNSU5HX1RZUEUiIH0sCi0JeyBMMlRQX0FWUF9QQUNLRVRfUFJPQ19ERUxBWSwJIlBBQ0tFVF9QUk9DX0RFTEFZIiB9LAotCXsgTDJUUF9BVlBfQ0FMTEVEX05VTUJFUiwJIkNBTExFRF9OVU1CRVIiIH0sCi0JeyBMMlRQX0FWUF9DQUxMSU5HX05VTUJFUiwJIkNBTExJTkdfTlVNQkVSIiB9LAotCXsgTDJUUF9BVlBfU1VCX0FERFJFU1MsCQkiU1VCX0FERFJFU1MiIH0sCi0JeyBMMlRQX0FWUF9UWF9DT05OX1NQRUVELAkiVFhfQ09OTl9TUEVFRCIgfSwKLQl7IEwyVFBfQVZQX1BIWV9DSEFOTkVMX0lELAkiUEhZX0NIQU5ORUxfSUQiIH0sCi0JeyBMMlRQX0FWUF9JTklfUkVDVl9MQ1AsCSJJTklfUkVDVl9MQ1AiIH0sCi0JeyBMMlRQX0FWUF9MQVNUX1NFTlRfTENQLAkiTEFTVF9TRU5UX0xDUCIgfSwKLQl7IEwyVFBfQVZQX0xBU1RfUkVDVl9MQ1AsCSJMQVNUX1JFQ1ZfTENQIiB9LAotCXsgTDJUUF9BVlBfUFJPWFlfQVVUSF9UWVBFLAkiUFJPWFlfQVVUSF9UWVBFIiB9LAotCXsgTDJUUF9BVlBfUFJPWFlfQVVUSF9OQU1FLAkiUFJPWFlfQVVUSF9OQU1FIiB9LAotCXsgTDJUUF9BVlBfUFJPWFlfQVVUSF9DSEFMLAkiUFJPWFlfQVVUSF9DSEFMIiB9LAotCXsgTDJUUF9BVlBfUFJPWFlfQVVUSF9JRCwJIlBST1hZX0FVVEhfSUQiIH0sCi0JeyBMMlRQX0FWUF9QUk9YWV9BVVRIX1JFU1AsCSJQUk9YWV9BVVRIX1JFU1AiIH0sCi0JeyBMMlRQX0FWUF9DQUxMX0VSUk9SUywJCSJDQUxMX0VSUk9SUyIgfSwKLQl7IEwyVFBfQVZQX0FDQ00sCQkiQUNDTSIgfSwKLQl7IEwyVFBfQVZQX1JBTkRPTV9WRUNUT1IsCSJSQU5ET01fVkVDVE9SIiB9LAotCXsgTDJUUF9BVlBfUFJJVkFURV9HUlBfSUQsCSJQUklWQVRFX0dSUF9JRCIgfSwKLQl7IEwyVFBfQVZQX1JYX0NPTk5fU1BFRUQsCSJSWF9DT05OX1NQRUVEIiB9LAotCXsgTDJUUF9BVlBfU0VRX1JFUVVJUkVELAkiU0VRX1JFUVVJUkVEIiB9LAotCXsgTDJUUF9BVlBfUFBQX0RJU0NPTl9DQywJIlBQUF9ESVNDT05fQ0MiIH0sCi0JeyAwLAkJCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGwydHBfYXV0aGVudHlwZTJzdHJbXSA9IHsKLQl7IEwyVFBfQVVUSEVOX1RZUEVfUkVTRVJWRUQsCSJSZXNlcnZlZCIgfSwKLQl7IEwyVFBfQVVUSEVOX1RZUEVfVEVYVFVBTCwJIlRleHR1YWwiIH0sCi0JeyBMMlRQX0FVVEhFTl9UWVBFX0NIQVAsCSJDSEFQIiB9LAotCXsgTDJUUF9BVVRIRU5fVFlQRV9QQVAsCQkiUEFQIiB9LAotCXsgTDJUUF9BVVRIRU5fVFlQRV9OT19BVVRILAkiTm8gQXV0aCIgfSwKLQl7IEwyVFBfQVVUSEVOX1RZUEVfTVNDSEFQdjEsCSJNUy1DSEFQdjEiIH0sCi0JeyAwLAkJCQlOVUxMIH0KLX07Ci0KLSNkZWZpbmUgTDJUUF9QUFBfRElTQ09OX0NDX0RJUkVDVElPTl9HTE9CQUwJMAotI2RlZmluZSBMMlRQX1BQUF9ESVNDT05fQ0NfRElSRUNUSU9OX0FUX1BFRVIJMQotI2RlZmluZSBMMlRQX1BQUF9ESVNDT05fQ0NfRElSRUNUSU9OX0FUX0xPQ0FMCTIKLQotc3RhdGljIHN0cnVjdCB0b2sgbDJ0cF9jY19kaXJlY3Rpb24yc3RyW10gPSB7Ci0JeyBMMlRQX1BQUF9ESVNDT05fQ0NfRElSRUNUSU9OX0dMT0JBTCwJImdsb2JhbCBlcnJvciIgfSwKLQl7IEwyVFBfUFBQX0RJU0NPTl9DQ19ESVJFQ1RJT05fQVRfUEVFUiwJImF0IHBlZXIiIH0sCi0JeyBMMlRQX1BQUF9ESVNDT05fQ0NfRElSRUNUSU9OX0FUX0xPQ0FMLCJhdCBsb2NhbCIgfSwKLQl7IDAsCQkJCQlOVUxMIH0KLX07Ci0KLSNpZiAwCi1zdGF0aWMgY2hhciAqbDJ0cF9yZXN1bHRfY29kZV9TdG9wQ0NOW10gPSB7Ci0gICAgICAgICAiUmVzZXJ2ZWQiLAotICAgICAgICAgIkdlbmVyYWwgcmVxdWVzdCB0byBjbGVhciBjb250cm9sIGNvbm5lY3Rpb24iLAotICAgICAgICAgIkdlbmVyYWwgZXJyb3ItLUVycm9yIENvZGUgaW5kaWNhdGVzIHRoZSBwcm9ibGVtIiwKLSAgICAgICAgICJDb250cm9sIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMiLAotICAgICAgICAgIlJlcXVlc3RlciBpcyBub3QgYXV0aG9yaXplZCB0byBlc3RhYmxpc2ggYSBjb250cm9sIGNoYW5uZWwiLAotICAgICAgICAgIlRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSByZXF1ZXN0ZXIgaXMgbm90IHN1cHBvcnRlZCIsCi0gICAgICAgICAiUmVxdWVzdGVyIGlzIGJlaW5nIHNodXQgZG93biIsCi0gICAgICAgICAiRmluaXRlIFN0YXRlIE1hY2hpbmUgZXJyb3IiCi0jZGVmaW5lIEwyVFBfTUFYX1JFU1VMVF9DT0RFX1NUT1BDQ19JTkRFWAk4Ci19OwotI2VuZGlmCi0KLSNpZiAwCi1zdGF0aWMgY2hhciAqbDJ0cF9yZXN1bHRfY29kZV9DRE5bXSA9IHsKLQkiUmVzZXJ2ZWQiLAotCSJDYWxsIGRpc2Nvbm5lY3RlZCBkdWUgdG8gbG9zcyBvZiBjYXJyaWVyIiwKLQkiQ2FsbCBkaXNjb25uZWN0ZWQgZm9yIHRoZSByZWFzb24gaW5kaWNhdGVkIGluIGVycm9yIGNvZGUiLAotCSJDYWxsIGRpc2Nvbm5lY3RlZCBmb3IgYWRtaW5pc3RyYXRpdmUgcmVhc29ucyIsCi0JIkNhbGwgZmFpbGVkIGR1ZSB0byBsYWNrIG9mIGFwcHJvcHJpYXRlIGZhY2lsaXRpZXMgYmVpbmcgIiBcCi0JImF2YWlsYWJsZSAodGVtcG9yYXJ5IGNvbmRpdGlvbikiLAotCSJDYWxsIGZhaWxlZCBkdWUgdG8gbGFjayBvZiBhcHByb3ByaWF0ZSBmYWNpbGl0aWVzIGJlaW5nICIgXAotCSJhdmFpbGFibGUgKHBlcm1hbmVudCBjb25kaXRpb24pIiwKLQkiSW52YWxpZCBkZXN0aW5hdGlvbiIsCi0JIkNhbGwgZmFpbGVkIGR1ZSB0byBubyBjYXJyaWVyIGRldGVjdGVkIiwKLQkiQ2FsbCBmYWlsZWQgZHVlIHRvIGRldGVjdGlvbiBvZiBhIGJ1c3kgc2lnbmFsIiwKLQkiQ2FsbCBmYWlsZWQgZHVlIHRvIGxhY2sgb2YgYSBkaWFsIHRvbmUiLAotCSJDYWxsIHdhcyBub3QgZXN0YWJsaXNoZWQgd2l0aGluIHRpbWUgYWxsb3R0ZWQgYnkgTEFDIiwKLQkiQ2FsbCB3YXMgY29ubmVjdGVkIGJ1dCBubyBhcHByb3ByaWF0ZSBmcmFtaW5nIHdhcyBkZXRlY3RlZCIKLSNkZWZpbmUgTDJUUF9NQVhfUkVTVUxUX0NPREVfQ0ROX0lOREVYCTEyCi19OwotI2VuZGlmCi0KLSNpZiAwCi1zdGF0aWMgY2hhciAqbDJ0cF9lcnJvcl9jb2RlX2dlbmVyYWxbXSA9IHsKLQkiTm8gZ2VuZXJhbCBlcnJvciIsCi0JIk5vIGNvbnRyb2wgY29ubmVjdGlvbiBleGlzdHMgeWV0IGZvciB0aGlzIExBQy1MTlMgcGFpciIsCi0JIkxlbmd0aCBpcyB3cm9uZyIsCi0JIk9uZSBvZiB0aGUgZmllbGQgdmFsdWVzIHdhcyBvdXQgb2YgcmFuZ2Ugb3IgIiBcCi0JInJlc2VydmVkIGZpZWxkIHdhcyBub24temVybyIKLQkiSW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBoYW5kbGUgdGhpcyBvcGVyYXRpb24gbm93IiwKLQkiVGhlIFNlc3Npb24gSUQgaXMgaW52YWxpZCBpbiB0aGlzIGNvbnRleHQiLAotCSJBIGdlbmVyaWMgdmVuZG9yLXNwZWNpZmljIGVycm9yIG9jY3VycmVkIGluIHRoZSBMQUMiLAotCSJUcnkgYW5vdGhlciIKLSNkZWZpbmUgTDJUUF9NQVhfRVJST1JfQ09ERV9HRU5FUkFMX0lOREVYCTgKLX07Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGdlbmVyaWMgcHJpbnQgb3V0IHJvdXRpbmVzICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXByaW50X3N0cmluZyhjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQotewotCXVfaW50IGk7Ci0JZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJcHJpbnRmKCIlYyIsICpkYXQrKyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2N0ZXRzKGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQgaTsKLQlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgewotCQlwcmludGYoIiUwMngiLCAqZGF0KyspOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50XzE2Yml0c192YWwoY29uc3QgdV9pbnQxNl90ICpkYXQpCi17Ci0JcHJpbnRmKCIldSIsIEVYVFJBQ1RfMTZCSVRTKGRhdCkpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfMzJiaXRzX3ZhbChjb25zdCB1X2ludDMyX3QgKmRhdCkKLXsKLQlwcmludGYoIiVsdSIsICh1X2xvbmcpRVhUUkFDVF8zMkJJVFMoZGF0KSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEFWUC1zcGVjaWZpYyBwcmludCBvdXQgcm91dGluZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1sMnRwX21zZ3R5cGVfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCi17Ci0JdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90KilkYXQ7Ci0KLQlwcmludGYoIiVzIiwgdG9rMnN0cihsMnRwX21zZ3R5cGUyc3RyLCAiTVNHVFlQRS0jJXUiLAotCSAgICBFWFRSQUNUXzE2QklUUyhwdHIpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX3Jlc3VsdF9jb2RlX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OwotCi0JcHJpbnRmKCIldSIsIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsJLyogUmVzdWx0IENvZGUgKi8KLQlpZiAobGVuZ3RoID4gMikgewkJCQkvKiBFcnJvciBDb2RlIChvcHQpICovCi0JICAgICAgICBwcmludGYoIi8ldSIsIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsKLQl9Ci0JaWYgKGxlbmd0aCA+IDQpIHsJCQkJLyogRXJyb3IgTWVzc2FnZSAob3B0KSAqLwotCQlwcmludGYoIiAiKTsKLQkJcHJpbnRfc3RyaW5nKCh1X2NoYXIgKilwdHIsIGxlbmd0aCAtIDQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWwydHBfcHJvdG9fdmVyX3ByaW50KGNvbnN0IHVfaW50MTZfdCAqZGF0KQotewotCXByaW50ZigiJXUuJXUiLCAoRVhUUkFDVF8xNkJJVFMoZGF0KSA+PiA4KSwKLQkgICAgKEVYVFJBQ1RfMTZCSVRTKGRhdCkgJiAweGZmKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX2ZyYW1pbmdfY2FwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXVfaW50MzJfdCAqcHRyID0gKHVfaW50MzJfdCAqKWRhdDsKLQotCWlmIChFWFRSQUNUXzMyQklUUyhwdHIpICYgIEwyVFBfRlJBTUlOR19DQVBfQVNZTkNfTUFTSykgewotCQlwcmludGYoIkEiKTsKLQl9Ci0JaWYgKEVYVFJBQ1RfMzJCSVRTKHB0cikgJiAgTDJUUF9GUkFNSU5HX0NBUF9TWU5DX01BU0spIHsKLQkJcHJpbnRmKCJTIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotbDJ0cF9iZWFyZXJfY2FwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXVfaW50MzJfdCAqcHRyID0gKHVfaW50MzJfdCAqKWRhdDsKLQotCWlmIChFWFRSQUNUXzMyQklUUyhwdHIpICYgIEwyVFBfQkVBUkVSX0NBUF9BTkFMT0dfTUFTSykgewotCQlwcmludGYoIkEiKTsKLQl9Ci0JaWYgKEVYVFJBQ1RfMzJCSVRTKHB0cikgJiAgTDJUUF9CRUFSRVJfQ0FQX0RJR0lUQUxfTUFTSykgewotCQlwcmludGYoIkQiKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX3E5MzFfY2NfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKLXsKLQlwcmludF8xNmJpdHNfdmFsKCh1X2ludDE2X3QgKilkYXQpOwotCXByaW50ZigiLCAlMDJ4IiwgZGF0WzJdKTsKLQlpZiAobGVuZ3RoID4gMykgewotCQlwcmludGYoIiAiKTsKLQkJcHJpbnRfc3RyaW5nKGRhdCszLCBsZW5ndGgtMyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotbDJ0cF9iZWFyZXJfdHlwZV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQl1X2ludDMyX3QgKnB0ciA9ICh1X2ludDMyX3QgKilkYXQ7Ci0KLQlpZiAoRVhUUkFDVF8zMkJJVFMocHRyKSAmICBMMlRQX0JFQVJFUl9UWVBFX0FOQUxPR19NQVNLKSB7Ci0JCXByaW50ZigiQSIpOwotCX0KLQlpZiAoRVhUUkFDVF8zMkJJVFMocHRyKSAmICBMMlRQX0JFQVJFUl9UWVBFX0RJR0lUQUxfTUFTSykgewotCQlwcmludGYoIkQiKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX2ZyYW1pbmdfdHlwZV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQl1X2ludDMyX3QgKnB0ciA9ICh1X2ludDMyX3QgKilkYXQ7Ci0KLQlpZiAoRVhUUkFDVF8zMkJJVFMocHRyKSAmICBMMlRQX0ZSQU1JTkdfVFlQRV9BU1lOQ19NQVNLKSB7Ci0JCXByaW50ZigiQSIpOwotCX0KLQlpZiAoRVhUUkFDVF8zMkJJVFMocHRyKSAmICBMMlRQX0ZSQU1JTkdfVFlQRV9TWU5DX01BU0spIHsKLQkJcHJpbnRmKCJTIik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotbDJ0cF9wYWNrZXRfcHJvY19kZWxheV9wcmludCh2b2lkKQotewotCXByaW50Zigib2Jzb2xldGUiKTsKLX0KLQotc3RhdGljIHZvaWQKLWwydHBfcHJveHlfYXV0aF90eXBlX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXVfaW50MTZfdCAqcHRyID0gKHVfaW50MTZfdCAqKWRhdDsKLQotCXByaW50ZigiJXMiLCB0b2syc3RyKGwydHBfYXV0aGVudHlwZTJzdHIsCi0JCQkgICAgICJBdXRoVHlwZS0jJXUiLCBFWFRSQUNUXzE2QklUUyhwdHIpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX3Byb3h5X2F1dGhfaWRfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCi17Ci0JdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OwotCi0JcHJpbnRmKCIldSIsIEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX1BST1hZX0FVVEhfSURfTUFTSyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX2NhbGxfZXJyb3JzX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXVfaW50MTZfdCAqcHRyID0gKHVfaW50MTZfdCAqKWRhdDsKLQl1X2ludDE2X3QgdmFsX2gsIHZhbF9sOwotCi0JcHRyKys7CQkvKiBza2lwICJSZXNlcnZlZCIgKi8KLQotCXZhbF9oID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JdmFsX2wgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQlwcmludGYoIkNSQ0Vycj0ldSAiLCAodmFsX2g8PDE2KSArIHZhbF9sKTsKLQotCXZhbF9oID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JdmFsX2wgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQlwcmludGYoIkZyYW1lRXJyPSV1ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOwotCi0JdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOwotCXByaW50ZigiSGFyZE92ZXI9JXUgIiwgKHZhbF9oPDwxNikgKyB2YWxfbCk7Ci0KLQl2YWxfaCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOwotCXZhbF9sID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JcHJpbnRmKCJCdWZPdmVyPSV1ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOwotCi0JdmFsX2ggPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQl2YWxfbCA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOwotCXByaW50ZigiVGltZW91dD0ldSAiLCAodmFsX2g8PDE2KSArIHZhbF9sKTsKLQotCXZhbF9oID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JdmFsX2wgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQlwcmludGYoIkFsaWduRXJyPSV1ICIsICh2YWxfaDw8MTYpICsgdmFsX2wpOwotfQotCi1zdGF0aWMgdm9pZAotbDJ0cF9hY2NtX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXVfaW50MTZfdCAqcHRyID0gKHVfaW50MTZfdCAqKWRhdDsKLQl1X2ludDE2X3QgdmFsX2gsIHZhbF9sOwotCi0JcHRyKys7CQkvKiBza2lwICJSZXNlcnZlZCIgKi8KLQotCXZhbF9oID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JdmFsX2wgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQlwcmludGYoInNlbmQ9JTA4eCAiLCAodmFsX2g8PDE2KSArIHZhbF9sKTsKLQotCXZhbF9oID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JdmFsX2wgPSBFWFRSQUNUXzE2QklUUyhwdHIpOyBwdHIrKzsKLQlwcmludGYoInJlY3Y9JTA4eCAiLCAodmFsX2g8PDE2KSArIHZhbF9sKTsKLX0KLQotc3RhdGljIHZvaWQKLWwydHBfcHBwX2Rpc2Nvbl9jY19wcmludChjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQotewotCXVfaW50MTZfdCAqcHRyID0gKHVfaW50MTZfdCAqKWRhdDsKLQotCXByaW50ZigiJTA0eCwgIiwgRVhUUkFDVF8xNkJJVFMocHRyKSk7IHB0cisrOwkvKiBEaXNjb25uZWN0IENvZGUgKi8KLQlwcmludGYoIiUwNHggIiwgIEVYVFJBQ1RfMTZCSVRTKHB0cikpOyBwdHIrKzsJLyogQ29udHJvbCBQcm90b2NvbCBOdW1iZXIgKi8KLQlwcmludGYoIiVzIiwgdG9rMnN0cihsMnRwX2NjX2RpcmVjdGlvbjJzdHIsCi0JCQkgICAgICJEaXJlY3Rpb24tIyV1IiwgKigodV9jaGFyICopcHRyKyspKSk7Ci0KLQlpZiAobGVuZ3RoID4gNSkgewotCQlwcmludGYoIiAiKTsKLQkJcHJpbnRfc3RyaW5nKChjb25zdCB1X2NoYXIgKilwdHIsIGxlbmd0aC01KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sMnRwX2F2cF9wcmludChjb25zdCB1X2NoYXIgKmRhdCwgaW50IGxlbmd0aCkKLXsKLQl1X2ludCBsZW47Ci0JY29uc3QgdV9pbnQxNl90ICpwdHIgPSAodV9pbnQxNl90ICopZGF0OwotCXVfaW50MTZfdCBhdHRyX3R5cGU7Ci0JaW50IGhpZGRlbiA9IEZBTFNFOwotCi0JaWYgKGxlbmd0aCA8PSAwKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcmludGYoIiAiKTsKLQotCVRDSEVDSygqcHRyKTsJLyogRmxhZ3MgJiBMZW5ndGggKi8KLQlsZW4gPSBFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9BVlBfSERSX0xFTl9NQVNLOwotCi0JLyogSWYgaXQgaXMgbm90IGxvbmcgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIGhlYWRlciwgd2UnbGwgZ2l2ZSB1cC4gKi8KLQlpZiAobGVuIDwgNikKLQkJZ290byB0cnVuYzsKLQotCS8qIElmIGl0IGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIHRoZSBwYWNrZXQsCi0JICAgd2UnbGwgZ2l2ZSB1cC4gKi8KLQlpZiAobGVuID4gKHVfaW50KWxlbmd0aCkKLQkJZ290byB0cnVuYzsKLQotCS8qIElmIGl0IGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSByZW1haW5pbmcgbGVuZ3RoIG9mIHRoZSBjYXB0dXJlZAotCSAgIGRhdGEsIHdlJ2xsIGdpdmUgdXAuICovCi0JVENIRUNLMigqcHRyLCBsZW4pOwotCS8qIEFmdGVyIHRoaXMgcG9pbnQsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdHJ1bmNhdGlvbiAqLwotCi0JaWYgKEVYVFJBQ1RfMTZCSVRTKHB0cikgJiBMMlRQX0FWUF9IRFJfRkxBR19NQU5EQVRPUlkpIHsKLQkJcHJpbnRmKCIqIik7Ci0JfQotCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9BVlBfSERSX0ZMQUdfSElEREVOKSB7Ci0JCWhpZGRlbiA9IFRSVUU7Ci0JCXByaW50ZigiPyIpOwotCX0KLQlwdHIrKzsKLQotCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpKSB7Ci0JCS8qIFZlbmRvciBTcGVjaWZpYyBBdHRyaWJ1dGUgKi8KLQkgICAgICAgIHByaW50ZigiVkVORE9SJTA0eDoiLCBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7Ci0JCXByaW50ZigiQVRUUiUwNHgiLCBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7Ci0JCXByaW50ZigiKCIpOwotCQlwcmludF9vY3RldHMoKHVfY2hhciAqKXB0ciwgbGVuLTYpOwotCQlwcmludGYoIikiKTsKLQl9IGVsc2UgewotCQkvKiBJRVRGLWRlZmluZWQgQXR0cmlidXRlcyAqLwotCQlwdHIrKzsKLQkJYXR0cl90eXBlID0gRVhUUkFDVF8xNkJJVFMocHRyKTsgcHRyKys7Ci0JCXByaW50ZigiJXMiLCB0b2syc3RyKGwydHBfYXZwMnN0ciwgIkFWUC0jJXUiLCBhdHRyX3R5cGUpKTsKLQkJcHJpbnRmKCIoIik7Ci0JCWlmIChoaWRkZW4pIHsKLQkJCXByaW50ZigiPz8/Iik7Ci0JCX0gZWxzZSB7Ci0JCQlzd2l0Y2ggKGF0dHJfdHlwZSkgewotCQkJY2FzZSBMMlRQX0FWUF9NU0dUWVBFOgotCQkJCWwydHBfbXNndHlwZV9wcmludCgodV9jaGFyICopcHRyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTDJUUF9BVlBfUkVTVUxUX0NPREU6Ci0JCQkJbDJ0cF9yZXN1bHRfY29kZV9wcmludCgodV9jaGFyICopcHRyLCBsZW4tNik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwyVFBfQVZQX1BST1RPX1ZFUjoKLQkJCQlsMnRwX3Byb3RvX3Zlcl9wcmludChwdHIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9GUkFNSU5HX0NBUDoKLQkJCQlsMnRwX2ZyYW1pbmdfY2FwX3ByaW50KCh1X2NoYXIgKilwdHIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9CRUFSRVJfQ0FQOgotCQkJCWwydHBfYmVhcmVyX2NhcF9wcmludCgodV9jaGFyICopcHRyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTDJUUF9BVlBfVElFX0JSRUFLRVI6Ci0JCQkJcHJpbnRfb2N0ZXRzKCh1X2NoYXIgKilwdHIsIDgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9GSVJNX1ZFUjoKLQkJCWNhc2UgTDJUUF9BVlBfQVNTTkRfVFVOX0lEOgotCQkJY2FzZSBMMlRQX0FWUF9SRUNWX1dJTl9TSVpFOgotCQkJY2FzZSBMMlRQX0FWUF9BU1NORF9TRVNTX0lEOgotCQkJCXByaW50XzE2Yml0c192YWwocHRyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTDJUUF9BVlBfSE9TVF9OQU1FOgotCQkJY2FzZSBMMlRQX0FWUF9WRU5ET1JfTkFNRToKLQkJCWNhc2UgTDJUUF9BVlBfQ0FMTElOR19OVU1CRVI6Ci0JCQljYXNlIEwyVFBfQVZQX0NBTExFRF9OVU1CRVI6Ci0JCQljYXNlIEwyVFBfQVZQX1NVQl9BRERSRVNTOgotCQkJY2FzZSBMMlRQX0FWUF9QUk9YWV9BVVRIX05BTUU6Ci0JCQljYXNlIEwyVFBfQVZQX1BSSVZBVEVfR1JQX0lEOgotCQkJCXByaW50X3N0cmluZygodV9jaGFyICopcHRyLCBsZW4tNik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwyVFBfQVZQX0NIQUxMRU5HRToKLQkJCWNhc2UgTDJUUF9BVlBfSU5JX1JFQ1ZfTENQOgotCQkJY2FzZSBMMlRQX0FWUF9MQVNUX1NFTlRfTENQOgotCQkJY2FzZSBMMlRQX0FWUF9MQVNUX1JFQ1ZfTENQOgotCQkJY2FzZSBMMlRQX0FWUF9QUk9YWV9BVVRIX0NIQUw6Ci0JCQljYXNlIEwyVFBfQVZQX1BST1hZX0FVVEhfUkVTUDoKLQkJCWNhc2UgTDJUUF9BVlBfUkFORE9NX1ZFQ1RPUjoKLQkJCQlwcmludF9vY3RldHMoKHVfY2hhciAqKXB0ciwgbGVuLTYpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9ROTMxX0NDOgotCQkJCWwydHBfcTkzMV9jY19wcmludCgodV9jaGFyICopcHRyLCBsZW4tNik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwyVFBfQVZQX0NIQUxMRU5HRV9SRVNQOgotCQkJCXByaW50X29jdGV0cygodV9jaGFyICopcHRyLCAxNik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwyVFBfQVZQX0NBTExfU0VSX05VTToKLQkJCWNhc2UgTDJUUF9BVlBfTUlOSU1VTV9CUFM6Ci0JCQljYXNlIEwyVFBfQVZQX01BWElNVU1fQlBTOgotCQkJY2FzZSBMMlRQX0FWUF9UWF9DT05OX1NQRUVEOgotCQkJY2FzZSBMMlRQX0FWUF9QSFlfQ0hBTk5FTF9JRDoKLQkJCWNhc2UgTDJUUF9BVlBfUlhfQ09OTl9TUEVFRDoKLQkJCQlwcmludF8zMmJpdHNfdmFsKCh1X2ludDMyX3QgKilwdHIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9CRUFSRVJfVFlQRToKLQkJCQlsMnRwX2JlYXJlcl90eXBlX3ByaW50KCh1X2NoYXIgKilwdHIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9GUkFNSU5HX1RZUEU6Ci0JCQkJbDJ0cF9mcmFtaW5nX3R5cGVfcHJpbnQoKHVfY2hhciAqKXB0cik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwyVFBfQVZQX1BBQ0tFVF9QUk9DX0RFTEFZOgotCQkJCWwydHBfcGFja2V0X3Byb2NfZGVsYXlfcHJpbnQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTDJUUF9BVlBfUFJPWFlfQVVUSF9UWVBFOgotCQkJCWwydHBfcHJveHlfYXV0aF90eXBlX3ByaW50KCh1X2NoYXIgKilwdHIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMMlRQX0FWUF9QUk9YWV9BVVRIX0lEOgotCQkJCWwydHBfcHJveHlfYXV0aF9pZF9wcmludCgodV9jaGFyICopcHRyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTDJUUF9BVlBfQ0FMTF9FUlJPUlM6Ci0JCQkJbDJ0cF9jYWxsX2Vycm9yc19wcmludCgodV9jaGFyICopcHRyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTDJUUF9BVlBfQUNDTToKLQkJCQlsMnRwX2FjY21fcHJpbnQoKHVfY2hhciAqKXB0cik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEwyVFBfQVZQX1NFUV9SRVFVSVJFRDoKLQkJCQlicmVhazsJLyogTm8gQXR0cmlidXRlIFZhbHVlICovCi0JCQljYXNlIEwyVFBfQVZQX1BQUF9ESVNDT05fQ0M6Ci0JCQkJbDJ0cF9wcHBfZGlzY29uX2NjX3ByaW50KCh1X2NoYXIgKilwdHIsIGxlbi02KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcHJpbnRmKCIpIik7Ci0JfQotCi0JbDJ0cF9hdnBfcHJpbnQoZGF0K2xlbiwgbGVuZ3RoLWxlbik7Ci0JcmV0dXJuOwotCi0gdHJ1bmM6Ci0JcHJpbnRmKCJ8Li4uIik7Ci19Ci0KLQotdm9pZAotbDJ0cF9wcmludChjb25zdCB1X2NoYXIgKmRhdCwgdV9pbnQgbGVuZ3RoKQotewotCWNvbnN0IHVfaW50MTZfdCAqcHRyID0gKHVfaW50MTZfdCAqKWRhdDsKLQl1X2ludCBjbnQgPSAwOwkJCS8qIHRvdGFsIG9jdGV0cyBjb25zdW1lZCAqLwotCXVfaW50MTZfdCBwYWQ7Ci0JaW50IGZsYWdfdCwgZmxhZ19sLCBmbGFnX3MsIGZsYWdfbzsKLQl1X2ludDE2X3QgbDJ0cF9sZW47Ci0KLQlmbGFnX3QgPSBmbGFnX2wgPSBmbGFnX3MgPSBmbGFnX28gPSBGQUxTRTsKLQotCVRDSEVDSygqcHRyKTsJLyogRmxhZ3MgJiBWZXJzaW9uICovCi0JaWYgKChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9WRVJTSU9OX01BU0spID09IEwyVFBfVkVSU0lPTl9MMlRQKSB7Ci0JCXByaW50ZigiIGwydHA6Iik7Ci0JfSBlbHNlIGlmICgoRVhUUkFDVF8xNkJJVFMocHRyKSAmIEwyVFBfVkVSU0lPTl9NQVNLKSA9PSBMMlRQX1ZFUlNJT05fTDJGKSB7Ci0JCXByaW50ZigiIGwyZjoiKTsKLQkJcmV0dXJuOwkJLyogbm90aGluZyB0byBkbyAqLwotCX0gZWxzZSB7Ci0JCXByaW50ZigiIFVua25vd24gVmVyc2lvbiwgbmVpdGhlciBMMkYoMSkgbm9yIEwyVFAoMikiKTsKLQkJcmV0dXJuOwkJLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KLQl9Ci0KLQlwcmludGYoIlsiKTsKLQlpZiAoRVhUUkFDVF8xNkJJVFMocHRyKSAmIEwyVFBfRkxBR19UWVBFKSB7Ci0JCWZsYWdfdCA9IFRSVUU7Ci0JCXByaW50ZigiVCIpOwotCX0KLQlpZiAoRVhUUkFDVF8xNkJJVFMocHRyKSAmIEwyVFBfRkxBR19MRU5HVEgpIHsKLQkJZmxhZ19sID0gVFJVRTsKLQkJcHJpbnRmKCJMIik7Ci0JfQotCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9GTEFHX1NFUVVFTkNFKSB7Ci0JCWZsYWdfcyA9IFRSVUU7Ci0JCXByaW50ZigiUyIpOwotCX0KLQlpZiAoRVhUUkFDVF8xNkJJVFMocHRyKSAmIEwyVFBfRkxBR19PRkZTRVQpIHsKLQkJZmxhZ19vID0gVFJVRTsKLQkJcHJpbnRmKCJPIik7Ci0JfQotCWlmIChFWFRSQUNUXzE2QklUUyhwdHIpICYgTDJUUF9GTEFHX1BSSU9SSVRZKQotCQlwcmludGYoIlAiKTsKLQlwcmludGYoIl0iKTsKLQotCXB0cisrOwotCWNudCArPSAyOwotCi0JaWYgKGZsYWdfbCkgewotCQlUQ0hFQ0soKnB0cik7CS8qIExlbmd0aCAqLwotCQlsMnRwX2xlbiA9IEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOwotCQljbnQgKz0gMjsKLQl9IGVsc2UgewotCQlsMnRwX2xlbiA9IDA7Ci0JfQotCi0JVENIRUNLKCpwdHIpOwkJLyogVHVubmVsIElEICovCi0JcHJpbnRmKCIoJXUvIiwgRVhUUkFDVF8xNkJJVFMocHRyKSk7IHB0cisrOwotCWNudCArPSAyOwotCVRDSEVDSygqcHRyKTsJCS8qIFNlc3Npb24gSUQgKi8KLQlwcmludGYoIiV1KSIsICBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7Ci0JY250ICs9IDI7Ci0KLQlpZiAoZmxhZ19zKSB7Ci0JCVRDSEVDSygqcHRyKTsJLyogTnMgKi8KLQkJcHJpbnRmKCJOcz0ldSwiLCBFWFRSQUNUXzE2QklUUyhwdHIpKTsgcHRyKys7Ci0JCWNudCArPSAyOwotCQlUQ0hFQ0soKnB0cik7CS8qIE5yICovCi0JCXByaW50ZigiTnI9JXUiLCAgRVhUUkFDVF8xNkJJVFMocHRyKSk7IHB0cisrOwotCQljbnQgKz0gMjsKLQl9Ci0KLQlpZiAoZmxhZ19vKSB7Ci0JCVRDSEVDSygqcHRyKTsJLyogT2Zmc2V0IFNpemUgKi8KLQkJcGFkID0gIEVYVFJBQ1RfMTZCSVRTKHB0cik7IHB0cisrOwotCQlwdHIgKz0gcGFkIC8gc2l6ZW9mKCpwdHIpOwotCQljbnQgKz0gKDIgKyBwYWQpOwotCX0KLQotCWlmIChmbGFnX2wpIHsKLQkJaWYgKGxlbmd0aCA8IGwydHBfbGVuKSB7Ci0JCQlwcmludGYoIiBMZW5ndGggJXUgbGFyZ2VyIHRoYW4gcGFja2V0IiwgbDJ0cF9sZW4pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWxlbmd0aCA9IGwydHBfbGVuOwotCX0KLQlpZiAobGVuZ3RoIDwgY250KSB7Ci0JCXByaW50ZigiIExlbmd0aCAldSBzbWFsbGVyIHRoYW4gaGVhZGVyIGxlbmd0aCIsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGZsYWdfdCkgewotCQlpZiAoIWZsYWdfbCkgewotCQkJcHJpbnRmKCIgTm8gbGVuZ3RoIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGxlbmd0aCAtIGNudCA9PSAwKSB7Ci0JCQlwcmludGYoIiBaTEIiKTsKLQkJfSBlbHNlIHsKLQkJCWwydHBfYXZwX3ByaW50KCh1X2NoYXIgKilwdHIsIGxlbmd0aCAtIGNudCk7Ci0JCX0KLQl9IGVsc2UgewotCQlwcmludGYoIiB7Iik7Ci0JCXBwcF9wcmludCgodV9jaGFyICopcHRyLCBsZW5ndGggLSBjbnQpOwotCQlwcmludGYoIn0iKTsKLQl9Ci0KLQlyZXR1cm47Ci0KLSB0cnVuYzoKLQlwcmludGYoIiVzIiwgdHN0cik7Ci19CmRpZmYgLS1naXQgYS9wcmludC1sYW5lLmMgYi9wcmludC1sYW5lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2MyYzIuLjAwMDAwMDAKLS0tIGEvcHJpbnQtbGFuZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBNYXJrbyBLaWlza2lsYSBjYXJuaWxAY3MudHV0LmZpCi0gKgotICogVGFtcGVyZSBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kgLSBUZWxlY29tbXVuaWNhdGlvbnMgTGFib3JhdG9yeQotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcwotICogc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGlzIGhlcmVieSBncmFudGVkLAotICogcHJvdmlkZWQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzCi0gKiBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBvZiB0aGUgc29mdHdhcmUsCi0gKiBkZXJpdmF0aXZlIHdvcmtzIG9yIG1vZGlmaWVkIHZlcnNpb25zLCBhbmQgYW55IHBvcnRpb25zCi0gKiB0aGVyZW9mLCB0aGF0IGJvdGggbm90aWNlcyBhcHBlYXIgaW4gc3VwcG9ydGluZwotICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzCi0gKiBhY2tub3dsZWRnZWQgaW4gYW55IHB1YmxpY2F0aW9ucyByZXN1bHRpbmcgZnJvbSB1c2luZwotICogdGhlIHNvZnR3YXJlLgotICoKLSAqIFRVVCBBTExPV1MgRlJFRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSBJTiBJVFMgIkFTIElTIgotICogQ09ORElUSU9OIEFORCBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBPRiBBTlkgS0lORCBGT1IKLSAqIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbGFuZS5jLHYgMS4yMy4yLjIgMjAwNS8xMS8xMyAxMjoxMjo1OSBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHBjYXAuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiZXRoZXIuaCIKLSNpbmNsdWRlICJsYW5lLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxlY29wMnN0cltdID0gewotCXsgMHgwMDAxLAkiY29uZmlndXJlIHJlcXVlc3QiIH0sCi0JeyAweDAxMDEsCSJjb25maWd1cmUgcmVzcG9uc2UiIH0sCi0JeyAweDAwMDIsCSJqb2luIHJlcXVlc3QiIH0sCi0JeyAweDAxMDIsCSJqb2luIHJlc3BvbnNlIiB9LAotCXsgMHgwMDAzLAkicmVhZHkgcXVlcnkiIH0sCi0JeyAweDAxMDMsCSJyZWFkeSBpbmRpY2F0aW9uIiB9LAotCXsgMHgwMDA0LAkicmVnaXN0ZXIgcmVxdWVzdCIgfSwKLQl7IDB4MDEwNCwJInJlZ2lzdGVyIHJlc3BvbnNlIiB9LAotCXsgMHgwMDA1LAkidW5yZWdpc3RlciByZXF1ZXN0IiB9LAotCXsgMHgwMTA1LAkidW5yZWdpc3RlciByZXNwb25zZSIgfSwKLQl7IDB4MDAwNiwJIkFSUCByZXF1ZXN0IiB9LAotCXsgMHgwMTA2LAkiQVJQIHJlc3BvbnNlIiB9LAotCXsgMHgwMDA3LAkiZmx1c2ggcmVxdWVzdCIgfSwKLQl7IDB4MDEwNywJImZsdXNoIHJlc3BvbnNlIiB9LAotCXsgMHgwMDA4LAkiTkFSUCByZXF1ZXN0IiB9LAotCXsgMHgwMDA5LAkidG9wb2xvZ3kgcmVxdWVzdCIgfSwKLQl7IDAsCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbGFuZV9oZHJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICplcDsKLQotCWVwID0gKGNvbnN0IHN0cnVjdCBsZWNkYXRhaGRyXzgwMjMgKilicDsKLQlpZiAocWZsYWcpCi0JCSh2b2lkKXByaW50ZigibGVjaWQ6JXggJXMgJXMgJWQ6ICIsCi0JCQkgICAgIEVYVFJBQ1RfMTZCSVRTKCZlcC0+bGVfaGVhZGVyKSwKLQkJCSAgICAgZXRoZXJhZGRyX3N0cmluZyhlcC0+aF9zb3VyY2UpLAotCQkJICAgICBldGhlcmFkZHJfc3RyaW5nKGVwLT5oX2Rlc3QpLAotCQkJICAgICBsZW5ndGgpOwotCWVsc2UKLQkJKHZvaWQpcHJpbnRmKCJsZWNpZDoleCAlcyAlcyAlcyAlZDogIiwKLQkJCSAgICAgRVhUUkFDVF8xNkJJVFMoJmVwLT5sZV9oZWFkZXIpLAotCQkJICAgICBldGhlcmFkZHJfc3RyaW5nKGVwLT5oX3NvdXJjZSksCi0JCQkgICAgIGV0aGVyYWRkcl9zdHJpbmcoZXAtPmhfZGVzdCksCi0JCQkgICAgIGV0aGVycHJvdG9fc3RyaW5nKGVwLT5oX3R5cGUpLAotCQkJICAgICBsZW5ndGgpOwotfQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCi0gKiB0byB0aGUgTEFORSBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICoKLSAqIFRoaXMgYXNzdW1lcyA4MDIuMywgbm90IDgwMi41LCBMQU4gZW11bGF0aW9uLgotICovCi12b2lkCi1sYW5lX3ByaW50KGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoLCB1X2ludCBjYXBsZW4pCi17Ci0Jc3RydWN0IGxhbmVfY29udHJvbGhkciAqbGVjOwotCXN0cnVjdCBsZWNkYXRhaGRyXzgwMjMgKmVwOwotCXVfc2hvcnQgZXRoZXJfdHlwZTsKLQl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcnR5cGU7Ci0KLQlpZiAoY2FwbGVuIDwgc2l6ZW9mKHN0cnVjdCBsYW5lX2NvbnRyb2xoZHIpKSB7Ci0JCXByaW50ZigiW3xsYW5lXSIpOwotCQlyZXR1cm47Ci0JfQotCi0JbGVjID0gKHN0cnVjdCBsYW5lX2NvbnRyb2xoZHIgKilwOwotCWlmIChFWFRSQUNUXzE2QklUUygmbGVjLT5sZWNfaGVhZGVyKSA9PSAweGZmMDApIHsKLQkJLyoKLQkJICogTEUgQ29udHJvbC4KLQkJICovCi0JCXByaW50ZigibGVjOiBwcm90byAleCB2ZXJzICV4ICVzIiwKLQkJICAgIGxlYy0+bGVjX3Byb3RvLCBsZWMtPmxlY192ZXJzLAotCQkgICAgdG9rMnN0cihsZWNvcDJzdHIsICJvcGNvZGUtIyV1IiwgRVhUUkFDVF8xNkJJVFMoJmxlYy0+bGVjX29wY29kZSkpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjYXBsZW4gPCBzaXplb2Yoc3RydWN0IGxlY2RhdGFoZHJfODAyMykpIHsKLQkJcHJpbnRmKCJbfGxhbmVdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoZWZsYWcpCi0JCWxhbmVfaGRyX3ByaW50KHAsIGxlbmd0aCk7Ci0KLQkvKgotCSAqIEdvIHBhc3QgdGhlIExBTkUgaGVhZGVyLgotCSAqLwotCWxlbmd0aCAtPSBzaXplb2Yoc3RydWN0IGxlY2RhdGFoZHJfODAyMyk7Ci0JY2FwbGVuIC09IHNpemVvZihzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzKTsKLQllcCA9IChzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzICopcDsKLQlwICs9IHNpemVvZihzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzKTsKLQotCWV0aGVyX3R5cGUgPSBFWFRSQUNUXzE2QklUUygmZXAtPmhfdHlwZSk7Ci0KLQkvKgotCSAqIElzIGl0IChnYWcpIGFuIDgwMi4zIGVuY2Fwc3VsYXRpb24/Ci0JICovCi0JaWYgKGV0aGVyX3R5cGUgPD0gRVRIRVJNVFUpIHsKLQkJLyogVHJ5IHRvIHByaW50IHRoZSBMTEMtbGF5ZXIgaGVhZGVyICYgaGlnaGVyIGxheWVycyAqLwotCQlpZiAobGxjX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuLCBlcC0+aF9zb3VyY2UsIGVwLT5oX2Rlc3QsCi0JCSAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkgPT0gMCkgewotCQkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KLQkJCWlmICghZWZsYWcpCi0JCQkJbGFuZV9oZHJfcHJpbnQoKHVfY2hhciAqKWVwLCBsZW5ndGggKyBzaXplb2YoKmVwKSk7Ci0JCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgewotCQkJCXByaW50ZigiKExMQyAlcykgIiwKLQkJCSAgICAgICBldGhlcnByb3RvX3N0cmluZyhodG9ucyhleHRyYWN0ZWRfZXRoZXJ0eXBlKSkpOwotCQkJfQotCQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJCWRlZmF1bHRfcHJpbnQocCwgY2FwbGVuKTsKLQkJfQotCX0gZWxzZSBpZiAoZXRoZXJfZW5jYXBfcHJpbnQoZXRoZXJfdHlwZSwgcCwgbGVuZ3RoLCBjYXBsZW4sCi0JICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKSB7Ci0JCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCi0JCWlmICghZWZsYWcpCi0JCQlsYW5lX2hkcl9wcmludCgodV9jaGFyICopZXAsIGxlbmd0aCArIHNpemVvZigqZXApKTsKLQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCX0KLX0KLQotdV9pbnQKLWxhbmVfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCi17Ci0JbGFuZV9wcmludChwLCBoLT5sZW4sIGgtPmNhcGxlbik7Ci0KLQlyZXR1cm4gKHNpemVvZihzdHJ1Y3QgbGVjZGF0YWhkcl84MDIzKSk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1sZHAuYyBiL3ByaW50LWxkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjgwZDhjLi4wMDAwMDAwCi0tLSBhL3ByaW50LWxkcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjE0ICswLDAgQEAKLS8qCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICogIGFuZCBTdGVpbmFyIEhhdWcgKHN0aGF1Z0BuZXRoZWxwLm5vKQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxkcC5jLHYgMS44LjIuMTAgMjAwNy8wMi8yNiAxMzozMTozMyBoYW5uZXMgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZGVjb2RlX3ByZWZpeC5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiYWYuaCIKLQotI2luY2x1ZGUgImwydnBuLmgiCi0KLS8qCi0gKiBsZHAgY29tbW9uIGhlYWRlcgotICoKLSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgUERVIExlbmd0aCAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIExEUCBJZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKgotICovCi0KLXN0cnVjdCBsZHBfY29tbW9uX2hlYWRlciB7Ci0gICAgdV9pbnQ4X3QgdmVyc2lvblsyXTsKLSAgICB1X2ludDhfdCBwZHVfbGVuZ3RoWzJdOwotICAgIHVfaW50OF90IGxzcl9pZFs0XTsKLSAgICB1X2ludDhfdCBsYWJlbF9zcGFjZVsyXTsKLX07Ci0KLSNkZWZpbmUgTERQX1ZFUlNJT04gMQotCi0vKgotICogbGRwIG1lc3NhZ2UgaGVhZGVyCi0gKgotICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8VXwgICBNZXNzYWdlIFR5cGUgICAgICAgICAgICAgIHwgICAgICBNZXNzYWdlIExlbmd0aCAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5IFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgfAotICogKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgfAotICogKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICovCi0KLXN0cnVjdCBsZHBfbXNnX2hlYWRlciB7Ci0gICAgdV9pbnQ4X3QgdHlwZVsyXTsKLSAgICB1X2ludDhfdCBsZW5ndGhbMl07Ci0gICAgdV9pbnQ4X3QgaWRbNF07Ci19OwotCi0jZGVmaW5lCUxEUF9NQVNLX01TR19UWVBFKHgpICAoKHgpJjB4N2ZmZikgCi0jZGVmaW5lCUxEUF9NQVNLX1VfQklUKHgpICAgICAoKHgpJjB4ODAwMCkgCi0KLSNkZWZpbmUJTERQX01TR19OT1RJRiAgICAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUJTERQX01TR19IRUxMTyAgICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUJTERQX01TR19JTklUICAgICAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUJTERQX01TR19LRUVQQUxJVkUgICAgICAgICAgICAweDAyMDEKLSNkZWZpbmUJTERQX01TR19BRERSRVNTICAgICAgICAgICAgICAweDAzMDAKLSNkZWZpbmUJTERQX01TR19BRERSRVNTX1dJVEhEUkFXICAgICAweDAzMDEKLSNkZWZpbmUJTERQX01TR19MQUJFTF9NQVBQSU5HICAgICAgICAweDA0MDAKLSNkZWZpbmUJTERQX01TR19MQUJFTF9SRVFVRVNUICAgICAgICAweDA0MDEKLSNkZWZpbmUJTERQX01TR19MQUJFTF9XSVRIRFJBVyAgICAgICAweDA0MDIKLSNkZWZpbmUJTERQX01TR19MQUJFTF9SRUxFQVNFICAgICAgICAweDA0MDMKLSNkZWZpbmUJTERQX01TR19MQUJFTF9BQk9SVF9SRVFVRVNUICAweDA0MDQKLQotI2RlZmluZQlMRFBfVkVORE9SX1BSSVZBVEVfTUlOICAgICAgIDB4M2UwMAotI2RlZmluZQlMRFBfVkVORE9SX1BSSVZBVEVfTUFYICAgICAgIDB4M2VmZgotI2RlZmluZQlMRFBfRVhQRVJJTUVOVEFMX01JTiAgICAgICAgIDB4M2YwMAotI2RlZmluZQlMRFBfRVhQRVJJTUVOVEFMX01BWCAgICAgICAgIDB4M2ZmZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZHBfbXNnX3ZhbHVlc1tdID0gewotICAgIHsgTERQX01TR19OT1RJRiwJICAgICAgICAgICAgICJOb3RpZmljYXRpb24iIH0sCi0gICAgeyBMRFBfTVNHX0hFTExPLAkgICAgICAgICAgICAgIkhlbGxvIiB9LAotICAgIHsgTERQX01TR19JTklULAkgICAgICAgICAgICAgIkluaXRpYWxpemF0aW9uIiB9LAotICAgIHsgTERQX01TR19LRUVQQUxJVkUsICAgICAgICAgICAgICJLZWVwYWxpdmUiIH0sCi0gICAgeyBMRFBfTVNHX0FERFJFU1MsCSAgICAgICAgICAgICAiQWRkcmVzcyIgfSwKLSAgICB7IExEUF9NU0dfQUREUkVTU19XSVRIRFJBVywJICAgICAiQWRkcmVzcyBXaXRoZHJhdyIgfSwKLSAgICB7IExEUF9NU0dfTEFCRUxfTUFQUElORywJICAgICAiTGFiZWwgTWFwcGluZyIgfSwKLSAgICB7IExEUF9NU0dfTEFCRUxfUkVRVUVTVCwJICAgICAiTGFiZWwgUmVxdWVzdCIgfSwKLSAgICB7IExEUF9NU0dfTEFCRUxfV0lUSERSQVcsCSAgICAgIkxhYmVsIFdpdGhkcmF3IiB9LAotICAgIHsgTERQX01TR19MQUJFTF9SRUxFQVNFLAkgICAgICJMYWJlbCBSZWxlYXNlIiB9LAotICAgIHsgTERQX01TR19MQUJFTF9BQk9SVF9SRVFVRVNULCAgICJMYWJlbCBBYm9ydCBSZXF1ZXN0IiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUJTERQX01BU0tfVExWX1RZUEUoeCkgICgoeCkmMHgzZmZmKSAKLSNkZWZpbmUJTERQX01BU0tfRl9CSVQoeCkgKCh4KSYweDQwMDApIAotCi0jZGVmaW5lCUxEUF9UTFZfRkVDICAgICAgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lCUxEUF9UTFZfQUREUkVTU19MSVNUICAgICAgICAgMHgwMTAxCi0jZGVmaW5lCUxEUF9UTFZfSE9QX0NPVU5UICAgICAgICAgICAgMHgwMTAzCi0jZGVmaW5lCUxEUF9UTFZfUEFUSF9WRUNUT1IgICAgICAgICAgMHgwMTA0Ci0jZGVmaW5lCUxEUF9UTFZfR0VORVJJQ19MQUJFTCAgICAgICAgMHgwMjAwCi0jZGVmaW5lCUxEUF9UTFZfQVRNX0xBQkVMICAgICAgICAgICAgMHgwMjAxCi0jZGVmaW5lCUxEUF9UTFZfRlJfTEFCRUwgICAgICAgICAgICAgMHgwMjAyCi0jZGVmaW5lCUxEUF9UTFZfU1RBVFVTICAgICAgICAgICAgICAgMHgwMzAwCi0jZGVmaW5lCUxEUF9UTFZfRVhURF9TVEFUVVMgICAgICAgICAgMHgwMzAxCi0jZGVmaW5lCUxEUF9UTFZfUkVUVVJORURfUERVICAgICAgICAgMHgwMzAyCi0jZGVmaW5lCUxEUF9UTFZfUkVUVVJORURfTVNHICAgICAgICAgMHgwMzAzCi0jZGVmaW5lCUxEUF9UTFZfQ09NTU9OX0hFTExPICAgICAgICAgMHgwNDAwCi0jZGVmaW5lCUxEUF9UTFZfSVBWNF9UUkFOU1BPUlRfQUREUiAgMHgwNDAxCi0jZGVmaW5lCUxEUF9UTFZfQ09ORklHX1NFUV9OVU1CRVIgICAgMHgwNDAyCi0jZGVmaW5lCUxEUF9UTFZfSVBWNl9UUkFOU1BPUlRfQUREUiAgMHgwNDAzCi0jZGVmaW5lCUxEUF9UTFZfQ09NTU9OX1NFU1NJT04gICAgICAgMHgwNTAwCi0jZGVmaW5lCUxEUF9UTFZfQVRNX1NFU1NJT05fUEFSTSAgICAgMHgwNTAxCi0jZGVmaW5lCUxEUF9UTFZfRlJfU0VTU0lPTl9QQVJNICAgICAgMHgwNTAyCi0jZGVmaW5lIExEUF9UTFZfRlRfU0VTU0lPTgkgICAgIDB4MDUwMwotI2RlZmluZQlMRFBfVExWX0xBQkVMX1JFUVVFU1RfTVNHX0lEIDB4MDYwMAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZHBfdGx2X3ZhbHVlc1tdID0gewotICAgIHsgTERQX1RMVl9GRUMsCSAgICAgICAgICAgICAiRkVDIiB9LAotICAgIHsgTERQX1RMVl9BRERSRVNTX0xJU1QsICAgICAgICAgICJBZGRyZXNzIExpc3QiIH0sCi0gICAgeyBMRFBfVExWX0hPUF9DT1VOVCwgICAgICAgICAgICAgIkhvcCBDb3VudCIgfSwKLSAgICB7IExEUF9UTFZfUEFUSF9WRUNUT1IsICAgICAgICAgICAiUGF0aCBWZWN0b3IiIH0sCi0gICAgeyBMRFBfVExWX0dFTkVSSUNfTEFCRUwsICAgICAgICAgIkdlbmVyaWMgTGFiZWwiIH0sCi0gICAgeyBMRFBfVExWX0FUTV9MQUJFTCwgICAgICAgICAgICAgIkFUTSBMYWJlbCIgfSwKLSAgICB7IExEUF9UTFZfRlJfTEFCRUwsICAgICAgICAgICAgICAiRnJhbWUtUmVsYXkgTGFiZWwiIH0sCi0gICAgeyBMRFBfVExWX1NUQVRVUywgICAgICAgICAgICAgICAgIlN0YXR1cyIgfSwKLSAgICB7IExEUF9UTFZfRVhURF9TVEFUVVMsICAgICAgICAgICAiRXh0ZW5kZWQgU3RhdHVzIiB9LAotICAgIHsgTERQX1RMVl9SRVRVUk5FRF9QRFUsICAgICAgICAgICJSZXR1cm5lZCBQRFUiIH0sCi0gICAgeyBMRFBfVExWX1JFVFVSTkVEX01TRywgICAgICAgICAgIlJldHVybmVkIE1lc3NhZ2UiIH0sCi0gICAgeyBMRFBfVExWX0NPTU1PTl9IRUxMTywgICAgICAgICAgIkNvbW1vbiBIZWxsbyBQYXJhbWV0ZXJzIiB9LAotICAgIHsgTERQX1RMVl9JUFY0X1RSQU5TUE9SVF9BRERSLCAgICJJUHY0IFRyYW5zcG9ydCBBZGRyZXNzIiB9LAotICAgIHsgTERQX1RMVl9DT05GSUdfU0VRX05VTUJFUiwgICAgICJDb25maWd1cmF0aW9uIFNlcXVlbmNlIE51bWJlciIgfSwKLSAgICB7IExEUF9UTFZfSVBWNl9UUkFOU1BPUlRfQUREUiwgICAiSVB2NiBUcmFuc3BvcnQgQWRkcmVzcyIgfSwKLSAgICB7IExEUF9UTFZfQ09NTU9OX1NFU1NJT04sICAgICAgICAiQ29tbW9uIFNlc3Npb24gUGFyYW1ldGVycyIgfSwKLSAgICB7IExEUF9UTFZfQVRNX1NFU1NJT05fUEFSTSwgICAgICAiQVRNIFNlc3Npb24gUGFyYW1ldGVycyIgfSwKLSAgICB7IExEUF9UTFZfRlJfU0VTU0lPTl9QQVJNLCAgICAgICAiRnJhbWUtUmVsYXkgU2Vzc2lvbiBQYXJhbWV0ZXJzIiB9LAotICAgIHsgTERQX1RMVl9GVF9TRVNTSU9OLCAgICAgICAgICAgICJGYXVsdC1Ub2xlcmFudCBTZXNzaW9uIFBhcmFtZXRlcnMiIH0sCi0gICAgeyBMRFBfVExWX0xBQkVMX1JFUVVFU1RfTVNHX0lELCAgIkxhYmVsIFJlcXVlc3QgTWVzc2FnZSBJRCIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIExEUF9GRUNfV0lMRENBUkQJMHgwMQotI2RlZmluZSBMRFBfRkVDX1BSRUZJWAkJMHgwMgotI2RlZmluZSBMRFBfRkVDX0hPU1RBRERSRVNTCTB4MDMKLS8qIEZyb20gZHJhZnQtbWFydGluaS1sMmNpcmN1aXQtdHJhbnMtbXBscy0xMy50eHQgKi8KLSNkZWZpbmUgTERQX0ZFQ19NQVJUSU5JX1ZDCTB4ODAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbGRwX2ZlY192YWx1ZXNbXSA9IHsKLSAgICB7IExEUF9GRUNfV0lMRENBUkQsCQkiV2lsZGNhcmQiIH0sCi0gICAgeyBMRFBfRkVDX1BSRUZJWCwJCSJQcmVmaXgiIH0sCi0gICAgeyBMRFBfRkVDX0hPU1RBRERSRVNTLAkiSG9zdCBhZGRyZXNzIiB9LAotICAgIHsgTERQX0ZFQ19NQVJUSU5JX1ZDLAkiTWFydGluaSBWQyIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fTVRVICAweDAxCi0jZGVmaW5lIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fREVTQyAweDAzCi0jZGVmaW5lIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fVkNDViAweDBjCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxkcF9mZWNfbWFydGluaV9pZnBhcm1fdmFsdWVzW10gPSB7Ci0gICAgeyBMRFBfRkVDX01BUlRJTklfSUZQQVJNX01UVSwgIk1UVSIgfSwKLSAgICB7IExEUF9GRUNfTUFSVElOSV9JRlBBUk1fREVTQywgIkRlc2NyaXB0aW9uIiB9LAotICAgIHsgTERQX0ZFQ19NQVJUSU5JX0lGUEFSTV9WQ0NWLCAiVkNDViIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0vKiBkcmFmdC1pZXRmLXB3ZTMtdmNjdi0wNC50eHQgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxkcF9mZWNfbWFydGluaV9pZnBhcm1fdmNjdl9jY192YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICJQV0UzIGNvbnRyb2wgd29yZCIgfSwKLSAgICB7IDB4MDIsICJNUExTIFJvdXRlciBBbGVydCBMYWJlbCIgfSwKLSAgICB7IDB4MDQsICJNUExTIGlubmVyIGxhYmVsIFRUTCA9IDEiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotLyogZHJhZnQtaWV0Zi1wd2UzLXZjY3YtMDQudHh0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsZHBfZmVjX21hcnRpbmlfaWZwYXJtX3ZjY3ZfY3ZfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiSUNNUCBQaW5nIiB9LAotICAgIHsgMHgwMiwgIkxTUCBQaW5nIiB9LAotICAgIHsgMHgwNCwgIkJGRCIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIEFGTlVNX0xFTiAgICAgICAyIAotCi1pbnQgbGRwX21zZ19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKik7Ci1pbnQgbGRwX3Rsdl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKik7Ci0gICAKLS8qIAotICogbGRwIHRsdiBoZWFkZXIKLSAqCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHxVfEZ8ICAgICAgICBUeXBlICAgICAgICAgICAgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfgotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICovCi0KLWludAotbGRwX3Rsdl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnRwdHIpIHsKLQotICAgIHN0cnVjdCBsZHBfdGx2X2hlYWRlciB7Ci0gICAgICAgIHVfaW50OF90IHR5cGVbMl07Ci0gICAgICAgIHVfaW50OF90IGxlbmd0aFsyXTsKLSAgICB9OwotCi0gICAgY29uc3Qgc3RydWN0IGxkcF90bHZfaGVhZGVyICpsZHBfdGx2X2hlYWRlcjsKLSAgICB1X3Nob3J0IHRsdl90eXBlLHRsdl9sZW4sdGx2X3RsZW4sYWYsZnRfZmxhZ3M7Ci0gICAgdV9jaGFyIGZlY190eXBlOwotICAgIHVfaW50IHVpLHZjX2luZm9fbGVuLCB2Y19pbmZvX3Rsdl90eXBlLCB2Y19pbmZvX3Rsdl9sZW4saWR4OwotICAgIGNoYXIgYnVmWzEwMF07Ci0gICAgaW50IGk7Ci0KLSAgICBsZHBfdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbGRwX3Rsdl9oZWFkZXIgKil0cHRyOyAgICAKLSAgICB0bHZfbGVuPUVYVFJBQ1RfMTZCSVRTKGxkcF90bHZfaGVhZGVyLT5sZW5ndGgpOwotICAgIHRsdl90bGVuPXRsdl9sZW47Ci0gICAgdGx2X3R5cGU9TERQX01BU0tfVExWX1RZUEUoRVhUUkFDVF8xNkJJVFMobGRwX3Rsdl9oZWFkZXItPnR5cGUpKTsKLQotICAgIC8qIEZJWE1FIHZlbmRvciBwcml2YXRlIC8gZXhwZXJpbWVudGFsIGNoZWNrICovCi0gICAgcHJpbnRmKCJcblx0ICAgICVzIFRMViAoMHglMDR4KSwgbGVuZ3RoOiAldSwgRmxhZ3M6IFslcyBhbmQgJXMgZm9yd2FyZCBpZiB1bmtub3duXSIsCi0gICAgICAgICAgIHRvazJzdHIobGRwX3Rsdl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgIlVua25vd24iLAotICAgICAgICAgICAgICAgICAgIHRsdl90eXBlKSwKLSAgICAgICAgICAgdGx2X3R5cGUsCi0gICAgICAgICAgIHRsdl9sZW4sCi0gICAgICAgICAgIExEUF9NQVNLX1VfQklUKEVYVFJBQ1RfMTZCSVRTKCZsZHBfdGx2X2hlYWRlci0+dHlwZSkpID8gImNvbnRpbnVlIHByb2Nlc3NpbmciIDogImlnbm9yZSIsCi0gICAgICAgICAgIExEUF9NQVNLX0ZfQklUKEVYVFJBQ1RfMTZCSVRTKCZsZHBfdGx2X2hlYWRlci0+dHlwZSkpID8gImRvIiA6ICJkb24ndCIpOwotCi0gICAgdHB0cis9c2l6ZW9mKHN0cnVjdCBsZHBfdGx2X2hlYWRlcik7Ci0KLSAgICBzd2l0Y2godGx2X3R5cGUpIHsKLQotICAgIGNhc2UgTERQX1RMVl9DT01NT05fSEVMTE86Ci0gICAgICAgIHByaW50ZigiXG5cdCAgICAgIEhvbGQgVGltZTogJXVzLCBGbGFnczogWyVzIEhlbGxvJXNdIiwKLSAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIpLAotICAgICAgICAgICAgICAgKEVYVFJBQ1RfMTZCSVRTKHRwdHIrMikmMHg4MDAwKSA/ICJUYXJnZXRlZCIgOiAiTGluayIsCi0gICAgICAgICAgICAgICAoRVhUUkFDVF8xNkJJVFModHB0cisyKSYweDQwMDApID8gIiwgUmVxdWVzdCBmb3IgdGFyZ2V0ZWQgSGVsbG9zIiA6ICIiKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIExEUF9UTFZfSVBWNF9UUkFOU1BPUlRfQUREUjoKLSAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NCBUcmFuc3BvcnQgQWRkcmVzczogJXMiLCBpcGFkZHJfc3RyaW5nKHRwdHIpKTsKLSAgICAgICAgYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLSAgICBjYXNlIExEUF9UTFZfSVBWNl9UUkFOU1BPUlRfQUREUjoKLSAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgSVB2NiBUcmFuc3BvcnQgQWRkcmVzczogJXMiLCBpcDZhZGRyX3N0cmluZyh0cHRyKSk7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgY2FzZSBMRFBfVExWX0NPTkZJR19TRVFfTlVNQkVSOgotICAgICAgICBwcmludGYoIlxuXHQgICAgICBTZXF1ZW5jZSBOdW1iZXI6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgTERQX1RMVl9BRERSRVNTX0xJU1Q6Ci0JYWYgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKLQl0cHRyKz1BRk5VTV9MRU47Ci0gICAgICAgIHRsdl90bGVuIC09IEFGTlVNX0xFTjsKLQlwcmludGYoIlxuXHQgICAgICBBZGRyZXNzIEZhbWlseTogIik7Ci0JaWYgKGFmID09IEFGTlVNX0lORVQpIHsKLQkgICAgcHJpbnRmKCJJUHY0LCBhZGRyZXNzZXM6Iik7Ci0JICAgIHdoaWxlKHRsdl90bGVuID49IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKLQkJcHJpbnRmKCIgJXMiLGlwYWRkcl9zdHJpbmcodHB0cikpOwotCQl0bHZfdGxlbi09c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJdHB0cis9c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsgICAgICAgICAgICAgICAgCi0JICAgIH0KLQl9Ci0jaWZkZWYgSU5FVDYKLQllbHNlIGlmIChhZiA9PSBBRk5VTV9JTkVUNikgewotCSAgICBwcmludGYoIklQdjYsIGFkZHJlc3NlczoiKTsKLQkgICAgd2hpbGUodGx2X3RsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKLQkJcHJpbnRmKCIgJXMiLGlwNmFkZHJfc3RyaW5nKHRwdHIpKTsKLQkJdGx2X3RsZW4tPXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwotCQl0cHRyKz1zaXplb2Yoc3RydWN0IGluNl9hZGRyKTsgICAgICAgICAgICAgICAgCi0JICAgIH0KLQl9Ci0jZW5kaWYKLQlicmVhazsKLQotICAgIGNhc2UgTERQX1RMVl9DT01NT05fU0VTU0lPTjoKLQlwcmludGYoIlxuXHQgICAgICBWZXJzaW9uOiAldSwgS2VlcGFsaXZlOiAldXMsIEZsYWdzOiBbRG93bnN0cmVhbSAlcywgTG9vcCBEZXRlY3Rpb24gJXNdIiwKLQkgICAgICAgRVhUUkFDVF8xNkJJVFModHB0ciksIEVYVFJBQ1RfMTZCSVRTKHRwdHIrMiksCi0JICAgICAgIChFWFRSQUNUXzE2QklUUyh0cHRyKzYpJjB4ODAwMCkgPyAiT24gRGVtYW5kIiA6ICJVbnNvbGljaXRlZCIsCi0JICAgICAgIChFWFRSQUNUXzE2QklUUyh0cHRyKzYpJjB4NDAwMCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiCi0JICAgICAgICk7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIExEUF9UTFZfRkVDOgotICAgICAgICBmZWNfdHlwZSA9ICp0cHRyOwotCXByaW50ZigiXG5cdCAgICAgICVzIEZFQyAoMHglMDJ4KSIsCi0JICAgICAgIHRvazJzdHIobGRwX2ZlY192YWx1ZXMsICJVbmtub3duIiwgZmVjX3R5cGUpLAotCSAgICAgICBmZWNfdHlwZSk7Ci0KLQl0cHRyKz0xOwotCXN3aXRjaChmZWNfdHlwZSkgewotCi0JY2FzZSBMRFBfRkVDX1dJTERDQVJEOgotCSAgICBicmVhazsKLQljYXNlIExEUF9GRUNfUFJFRklYOgotCSAgICBhZiA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIpOwotCSAgICB0cHRyKz0yOwotCSAgICBpZiAoYWYgPT0gQUZOVU1fSU5FVCkgewotCQlpPWRlY29kZV9wcmVmaXg0KHRwdHIsYnVmLHNpemVvZihidWYpKTsKLQkJcHJpbnRmKCI6IElQdjQgcHJlZml4ICVzIixidWYpOwotCSAgICB9Ci0jaWZkZWYgSU5FVDYKLQkgICAgZWxzZSBpZiAoYWYgPT0gQUZOVU1fSU5FVDYpIHsKLQkJaT1kZWNvZGVfcHJlZml4Nih0cHRyLGJ1ZixzaXplb2YoYnVmKSk7Ci0JCXByaW50ZigiOiBJUHY2IHByZWZpeCAlcyIsYnVmKTsKLQkgICAgfQotI2VuZGlmCi0JICAgIGJyZWFrOwotCWNhc2UgTERQX0ZFQ19IT1NUQUREUkVTUzoKLQkgICAgYnJlYWs7Ci0JY2FzZSBMRFBfRkVDX01BUlRJTklfVkM6Ci0gICAgICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgMTEpKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICB2Y19pbmZvX2xlbiA9ICoodHB0cisyKTsKLQotCSAgICBwcmludGYoIjogJXMsICVzY29udHJvbCB3b3JkLCBncm91cC1JRCAldSwgVkMtSUQgJXUsIFZDLWluZm8tbGVuZ3RoOiAldSIsCi0JCSAgIHRvazJzdHIobDJ2cG5fZW5jYXBzX3ZhbHVlcywgIlVua25vd24iLCBFWFRSQUNUXzE2QklUUyh0cHRyKSYweDdmZmYpLAotCQkgICBFWFRSQUNUXzE2QklUUyh0cHRyKSYweDgwMDAgPyAiIiA6ICJubyAiLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIrMyksCi0JCSAgIEVYVFJBQ1RfMzJCSVRTKHRwdHIrNyksCi0gICAgICAgICAgICAgICAgICAgdmNfaW5mb19sZW4pOwotCi0gICAgICAgICAgICBpZiAodmNfaW5mb19sZW4gPT0gMCkgLyogaW5maW5pdGUgbG9vcCBwcm90ZWN0aW9uICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHRwdHIrPTExOwotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHZjX2luZm9fbGVuKSkKLSAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgICAgICB3aGlsZSAodmNfaW5mb19sZW4gPiAyKSB7Ci0gICAgICAgICAgICAgICAgdmNfaW5mb190bHZfdHlwZSA9ICp0cHRyOwotICAgICAgICAgICAgICAgIHZjX2luZm9fdGx2X2xlbiA9ICoodHB0cisxKTsKLSAgICAgICAgICAgICAgICBpZiAodmNfaW5mb190bHZfbGVuIDwgMikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKHZjX2luZm9fbGVuIDwgdmNfaW5mb190bHZfbGVuKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0SW50ZXJmYWNlIFBhcmFtZXRlcjogJXMgKDB4JTAyeCksIGxlbiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGRwX2ZlY19tYXJ0aW5pX2lmcGFybV92YWx1ZXMsIlVua25vd24iLHZjX2luZm9fdGx2X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICB2Y19pbmZvX3Rsdl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICB2Y19pbmZvX3Rsdl9sZW4pOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoKHZjX2luZm9fdGx2X3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fTVRVOgotICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogJXUiLEVYVFJBQ1RfMTZCSVRTKHRwdHIrMikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTERQX0ZFQ19NQVJUSU5JX0lGUEFSTV9ERVNDOgotICAgICAgICAgICAgICAgICAgICBwcmludGYoIjogIik7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gMjsgaWR4IDwgdmNfaW5mb190bHZfbGVuOyBpZHgrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVwdXRjaGFyKCoodHB0citpZHgpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIExEUF9GRUNfTUFSVElOSV9JRlBBUk1fVkNDVjoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHQgIENvbnRyb2wgQ2hhbm5lbHMgKDB4JTAyeCkgPSBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICoodHB0cisyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIobGRwX2ZlY19tYXJ0aW5pX2lmcGFybV92Y2N2X2NjX3ZhbHVlcywibm9uZSIsKih0cHRyKzIpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0ICBDViBUeXBlcyAoMHglMDJ4KSA9IFslc10iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cHRyKzMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihsZHBfZmVjX21hcnRpbmlfaWZwYXJtX3ZjY3ZfY3ZfdmFsdWVzLCJub25lIiwqKHRwdHIrMykpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0cisyLCJcblx0XHQgICIsdmNfaW5mb190bHZfbGVuLTIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2Y19pbmZvX2xlbiAtPSB2Y19pbmZvX3Rsdl9sZW47Ci0gICAgICAgICAgICAgICAgdHB0ciArPSB2Y19pbmZvX3Rsdl9sZW47Ci0gICAgICAgICAgICB9Ci0JICAgIGJyZWFrOwotCX0KLQotCWJyZWFrOwotCi0gICAgY2FzZSBMRFBfVExWX0dFTkVSSUNfTEFCRUw6Ci0JcHJpbnRmKCJcblx0ICAgICAgTGFiZWw6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikgJiAweGZmZmZmKTsKLQlicmVhazsKLQotICAgIGNhc2UgTERQX1RMVl9TVEFUVVM6Ci0JdWkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKLQl0cHRyKz00OwotCXByaW50ZigiXG5cdCAgICAgIFN0YXR1czogMHglMDJ4LCBGbGFnczogWyVzIGFuZCAlcyBmb3J3YXJkXSIsCi0JICAgICAgIHVpJjB4M2ZmZmZmZmYsCi0JICAgICAgIHVpJjB4ODAwMDAwMDAgPyAiRmF0YWwgZXJyb3IiIDogIkFkdmlzb3J5IE5vdGlmaWNhdGlvbiIsCi0JICAgICAgIHVpJjB4NDAwMDAwMDAgPyAiZG8iIDogImRvbid0Iik7Ci0JdWkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKLQl0cHRyKz00OwotCWlmICh1aSkKLQkgICAgcHJpbnRmKCIsIGNhdXNpbmcgTWVzc2FnZSBJRDogMHglMDh4IiwgdWkpOwotCWJyZWFrOwotCi0gICAgY2FzZSBMRFBfVExWX0ZUX1NFU1NJT046Ci0JZnRfZmxhZ3MgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKLQlwcmludGYoIlxuXHQgICAgICBGbGFnczogWyVzUmVjb25uZWN0LCAlc1NhdmUgU3RhdGUsICVzQWxsLUxhYmVsIFByb3RlY3Rpb24sICVzIENoZWNrcG9pbnQsICVzUmUtTGVhcm4gU3RhdGVdIiwKLQkgICAgICAgZnRfZmxhZ3MmMHg4MDAwID8gIiIgOiAiTm8gIiwKLQkgICAgICAgZnRfZmxhZ3MmMHg4ID8gIiIgOiAiRG9uJ3QgIiwKLQkgICAgICAgZnRfZmxhZ3MmMHg0ID8gIiIgOiAiTm8gIiwKLQkgICAgICAgZnRfZmxhZ3MmMHgyID8gIlNlcXVlbmNlIE51bWJlcmVkIExhYmVsIiA6ICJBbGwgTGFiZWxzIiwKLQkgICAgICAgZnRfZmxhZ3MmMHgxID8gIiIgOiAiRG9uJ3QgIik7Ci0JdHB0cis9NDsKLQl1aSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIpOwotCWlmICh1aSkKLQkgICAgcHJpbnRmKCIsIFJlY29ubmVjdCBUaW1lb3V0OiAldW1zIiwgdWkpOwotCXRwdHIrPTQ7Ci0JdWkgPSBFWFRSQUNUXzMyQklUUyh0cHRyKTsKLQlpZiAodWkpCi0JICAgIHByaW50ZigiLCBSZWNvdmVyeSBUaW1lOiAldW1zIiwgdWkpOwotCWJyZWFrOwotCi0KLSAgICAvKgotICAgICAqICBGSVhNRSB0aG9zZSBhcmUgdGhlIGRlZmluZWQgVExWcyB0aGF0IGxhY2sgYSBkZWNvZGVyCi0gICAgICogIHlvdSBhcmUgd2VsY29tZSB0byBjb250cmlidXRlIGNvZGUgOy0pCi0gICAgICovCi0KLSAgICBjYXNlIExEUF9UTFZfSE9QX0NPVU5UOgotICAgIGNhc2UgTERQX1RMVl9QQVRIX1ZFQ1RPUjoKLSAgICBjYXNlIExEUF9UTFZfQVRNX0xBQkVMOgotICAgIGNhc2UgTERQX1RMVl9GUl9MQUJFTDoKLSAgICBjYXNlIExEUF9UTFZfRVhURF9TVEFUVVM6Ci0gICAgY2FzZSBMRFBfVExWX1JFVFVSTkVEX1BEVToKLSAgICBjYXNlIExEUF9UTFZfUkVUVVJORURfTVNHOgotICAgIGNhc2UgTERQX1RMVl9BVE1fU0VTU0lPTl9QQVJNOgotICAgIGNhc2UgTERQX1RMVl9GUl9TRVNTSU9OX1BBUk06Ci0gICAgY2FzZSBMRFBfVExWX0xBQkVMX1JFUVVFU1RfTVNHX0lEOgotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKHZmbGFnIDw9IDEpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAgICIsdGx2X3RsZW4pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuKHRsdl9sZW4rNCk7IC8qIFR5cGUgJiBMZW5ndGggZmllbGRzIG5vdCBpbmNsdWRlZCAqLwotIAotdHJ1bmM6Ci0gICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLWxkcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbikgewotCi0gICAgaW50IHByb2Nlc3NlZDsKLSAgICB3aGlsZSAobGVuID4gKHNpemVvZihzdHJ1Y3QgbGRwX2NvbW1vbl9oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikpKSB7Ci0gICAgICAgIHByb2Nlc3NlZCA9IGxkcF9tc2dfcHJpbnQocHB0cik7Ci0gICAgICAgIGlmIChwcm9jZXNzZWQgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgbGVuIC09IHByb2Nlc3NlZDsKLSAgICAgICAgcHB0ciArPSBwcm9jZXNzZWQ7Ci0gICAgfQotfQotCi0KLWludAotbGRwX21zZ19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIpIHsKLQotICAgIGNvbnN0IHN0cnVjdCBsZHBfY29tbW9uX2hlYWRlciAqbGRwX2NvbV9oZWFkZXI7Ci0gICAgY29uc3Qgc3RydWN0IGxkcF9tc2dfaGVhZGVyICpsZHBfbXNnX2hlYWRlcjsKLSAgICBjb25zdCB1X2NoYXIgKnRwdHIsKm1zZ190cHRyOwotICAgIHVfc2hvcnQgdGxlbjsKLSAgICB1X3Nob3J0IHBkdV9sZW4sbXNnX2xlbixtc2dfdHlwZSxtc2dfdGxlbjsKLSAgICBpbnQgaGV4ZHVtcCxwcm9jZXNzZWQ7Ci0KLSAgICB0cHRyPXBwdHI7Ci0gICAgbGRwX2NvbV9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGxkcF9jb21tb25faGVhZGVyICopcHB0cjsKLSAgICBUQ0hFQ0soKmxkcF9jb21faGVhZGVyKTsKLQotICAgIC8qCi0gICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCi0gICAgICovCi0gICAgaWYgKEVYVFJBQ1RfMTZCSVRTKCZsZHBfY29tX2hlYWRlci0+dmVyc2lvbikgIT0gTERQX1ZFUlNJT04pIHsKLQlwcmludGYoIiVzTERQIHZlcnNpb24gJXUgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgKHZmbGFnIDwgMSkgPyAiIiA6ICJcblx0IiwKLSAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsZHBfY29tX2hlYWRlci0+dmVyc2lvbikpOwotCXJldHVybiAwOwotICAgIH0KLQotICAgIC8qIHByaW50IHRoZSBMU1ItSUQsIGxhYmVsLXNwYWNlICYgbGVuZ3RoICovCi0gICAgcGR1X2xlbiA9IEVYVFJBQ1RfMTZCSVRTKCZsZHBfY29tX2hlYWRlci0+cGR1X2xlbmd0aCk7Ci0gICAgcHJpbnRmKCIlc0xEUCwgTGFiZWwtU3BhY2UtSUQ6ICVzOiV1LCBwZHUtbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICh2ZmxhZyA8IDEpID8gIiIgOiAiXG5cdCIsCi0gICAgICAgICAgIGlwYWRkcl9zdHJpbmcoJmxkcF9jb21faGVhZGVyLT5sc3JfaWQpLAotICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmbGRwX2NvbV9oZWFkZXItPmxhYmVsX3NwYWNlKSwKLSAgICAgICAgICAgcGR1X2xlbik7Ci0KLSAgICAvKiBiYWlsIG91dCBpZiBub24tdmVyYm9zZSAqLyAKLSAgICBpZiAodmZsYWcgPCAxKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIG9rIHRoZXkgc2VlbSB0byB3YW50IHRvIGtub3cgZXZlcnl0aGluZyAtIGxldHMgZnVsbHkgZGVjb2RlIGl0ICovCi0gICAgdGxlbj1wZHVfbGVuOwotCi0gICAgdHB0ciArPSBzaXplb2YoY29uc3Qgc3RydWN0IGxkcF9jb21tb25faGVhZGVyKTsKLSAgICB0bGVuIC09IHNpemVvZihjb25zdCBzdHJ1Y3QgbGRwX2NvbW1vbl9oZWFkZXIpLTQ7CS8qIFR5cGUgJiBMZW5ndGggZmllbGRzIG5vdCBpbmNsdWRlZCAqLwotCi0gICAgd2hpbGUodGxlbj4wKSB7Ci0gICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIG1zZyBoZWFkZXIgPyAqLwotICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikpKQotICAgICAgICAgICAgZ290byB0cnVuYzsKLQotICAgICAgICBsZHBfbXNnX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbGRwX21zZ19oZWFkZXIgKil0cHRyOwotICAgICAgICBtc2dfbGVuPUVYVFJBQ1RfMTZCSVRTKGxkcF9tc2dfaGVhZGVyLT5sZW5ndGgpOwotICAgICAgICBtc2dfdHlwZT1MRFBfTUFTS19NU0dfVFlQRShFWFRSQUNUXzE2QklUUyhsZHBfbXNnX2hlYWRlci0+dHlwZSkpOwotCi0gICAgICAgIC8qIEZJWE1FIHZlbmRvciBwcml2YXRlIC8gZXhwZXJpbWVudGFsIGNoZWNrICovCi0gICAgICAgIHByaW50ZigiXG5cdCAgJXMgTWVzc2FnZSAoMHglMDR4KSwgbGVuZ3RoOiAldSwgTWVzc2FnZSBJRDogMHglMDh4LCBGbGFnczogWyVzIGlmIHVua25vd25dIiwKLSAgICAgICAgICAgICAgIHRvazJzdHIobGRwX21zZ192YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbXNnX3R5cGUpLAotICAgICAgICAgICAgICAgbXNnX3R5cGUsCi0gICAgICAgICAgICAgICBtc2dfbGVuLAotICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJmxkcF9tc2dfaGVhZGVyLT5pZCksCi0gICAgICAgICAgICAgICBMRFBfTUFTS19VX0JJVChFWFRSQUNUXzE2QklUUygmbGRwX21zZ19oZWFkZXItPnR5cGUpKSA/ICJjb250aW51ZSBwcm9jZXNzaW5nIiA6ICJpZ25vcmUiKTsKLQotICAgICAgICBpZiAobXNnX2xlbiA9PSAwKSAvKiBpbmZpbml0ZSBsb29wIHByb3RlY3Rpb24gKi8KLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIG1zZ190cHRyPXRwdHIrc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcik7Ci0gICAgICAgIG1zZ190bGVuPW1zZ19sZW4tc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikrNDsgLyogVHlwZSAmIExlbmd0aCBmaWVsZHMgbm90IGluY2x1ZGVkICovCi0KLSAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgbWVzc2FnZSA/ICovCi0gICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBtc2dfbGVuKSkKLSAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgIGhleGR1bXA9RkFMU0U7Ci0KLSAgICAgICAgc3dpdGNoKG1zZ190eXBlKSB7Ci0gCi0gICAgICAgIGNhc2UgTERQX01TR19OT1RJRjoKLSAgICAgICAgY2FzZSBMRFBfTVNHX0hFTExPOgotICAgICAgICBjYXNlIExEUF9NU0dfSU5JVDoKLSAgICAgICAgY2FzZSBMRFBfTVNHX0tFRVBBTElWRToKLSAgICAgICAgY2FzZSBMRFBfTVNHX0FERFJFU1M6Ci0gICAgICAgIGNhc2UgTERQX01TR19MQUJFTF9NQVBQSU5HOgotICAgICAgICBjYXNlIExEUF9NU0dfQUREUkVTU19XSVRIRFJBVzoKLSAgICAgICAgY2FzZSBMRFBfTVNHX0xBQkVMX1dJVEhEUkFXOgotICAgICAgICAgICAgd2hpbGUobXNnX3RsZW4gPj0gNCkgewotICAgICAgICAgICAgICAgIHByb2Nlc3NlZCA9IGxkcF90bHZfcHJpbnQobXNnX3RwdHIpOwotICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgbXNnX3RsZW4tPXByb2Nlc3NlZDsKLSAgICAgICAgICAgICAgICBtc2dfdHB0cis9cHJvY2Vzc2VkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBtZXNzYWdlcyB0aGF0IGxhY2sgYSBkZWNvZGVyCi0gICAgICAgICAqICB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQotICAgICAgICAgKi8KLQotICAgICAgICBjYXNlIExEUF9NU0dfTEFCRUxfUkVRVUVTVDoKLSAgICAgICAgY2FzZSBMRFBfTVNHX0xBQkVMX1JFTEVBU0U6Ci0gICAgICAgIGNhc2UgTERQX01TR19MQUJFTF9BQk9SVF9SRVFVRVNUOgotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEobXNnX3RwdHIsIlxuXHQgICIsbXNnX3RsZW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLwotICAgICAgICBpZiAodmZsYWcgPiAxIHx8IGhleGR1bXA9PVRSVUUpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBsZHBfbXNnX2hlYWRlcikpLCJcblx0ICAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19sZW4pOwotCi0gICAgICAgIHRwdHIgKz0gbXNnX2xlbis0OwotICAgICAgICB0bGVuIC09IG1zZ19sZW4rNDsKLSAgICB9Ci0gICAgcmV0dXJuIHBkdV9sZW4rNDsKLXRydW5jOgotICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOwotICAgIHJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9wcmludC1sbGMuYyBiL3ByaW50LWxsYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQxOTg1Li4wMDAwMDAwCi0tLSBhL3ByaW50LWxsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBDb2RlIGJ5IE1hdHQgVGhvbWFzLCBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbgotICoJd2l0aCBhbiBhd2Z1bCBsb3Qgb2YgaGFja2luZyBieSBKZWZmcmV5IE1vZ3VsLCBERUNXUkwKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1sbGMuYyx2IDEuNjEuMi4xMCAyMDA3LzAyLzA4IDA3OjA3OjUxIGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi0jaW5jbHVkZSAibGxjLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAib3VpLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGxsY192YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBMTENTQVBfTlVMTCwgICAgICJOdWxsIiB9LAotICAgICAgICB7IExMQ1NBUF9HTE9CQUwsICAgIkdsb2JhbCIgfSwKLSAgICAgICAgeyBMTENTQVBfODAyMUJfSSwgICI4MDIuMUIgSSIgfSwKLSAgICAgICAgeyBMTENTQVBfODAyMUJfRywgICI4MDIuMUIgRyIgfSwKLSAgICAgICAgeyBMTENTQVBfSVAsICAgICAgICJJUCIgfSwKLSAgICAgICAgeyBMTENTQVBfU05BLCAgICAgICJTTkEiIH0sCi0gICAgICAgIHsgTExDU0FQX1BST1dBWU5NLCAiUHJvV2F5IE5NIiB9LAotICAgICAgICB7IExMQ1NBUF84MDIxRCwgICAgIlNUUCIgfSwKLSAgICAgICAgeyBMTENTQVBfUlM1MTEsICAgICJSUzUxMSIgfSwKLSAgICAgICAgeyBMTENTQVBfSVNPODIwOCwgICJJU084MjA4IiB9LAotICAgICAgICB7IExMQ1NBUF9QUk9XQVksICAgIlByb1dheSIgfSwKLSAgICAgICAgeyBMTENTQVBfU05BUCwgICAgICJTTkFQIiB9LAotICAgICAgICB7IExMQ1NBUF9JUFgsICAgICAgIklQWCIgfSwKLSAgICAgICAgeyBMTENTQVBfTkVUQkVVSSwgICJOZXRCZXVpIiB9LAotICAgICAgICB7IExMQ1NBUF9JU09OUywgICAgIk9TSSIgfSwKLSAgICAgICAgeyAwLCAgICAgICAgICAgICAgIE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGxsY19jbWRfdmFsdWVzW10gPSB7Ci0JeyBMTENfVUksCSJ1aSIgfSwKLQl7IExMQ19URVNULAkidGVzdCIgfSwKLQl7IExMQ19YSUQsCSJ4aWQiIH0sCi0JeyBMTENfVUEsCSJ1YSIgfSwKLQl7IExMQ19ESVNDLAkiZGlzYyIgfSwKLQl7IExMQ19ETSwJImRtIiB9LAotCXsgTExDX1NBQk1FLAkic2FibWUiIH0sCi0JeyBMTENfRlJNUiwJImZybXIiIH0sCi0JeyAwLAkJTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbGNfZmxhZ192YWx1ZXNbXSA9IHsgCi0gICAgICAgIHsgMCwgIkNvbW1hbmQiIH0sCi0gICAgICAgIHsgTExDX0dTQVAsICJSZXNwb25zZSIgfSwKLSAgICAgICAgeyBMTENfVV9QT0xMLCAiUG9sbCIgfSwKLSAgICAgICAgeyBMTENfR1NBUHxMTENfVV9QT0xMLCAiRmluYWwiIH0sCi0gICAgICAgIHsgTExDX0lTX1BPTEwsICJQb2xsIiB9LAotICAgICAgICB7IExMQ19HU0FQfExMQ19JU19QT0xMLCAiRmluYWwiIH0sCi0JeyAwLCBOVUxMIH0KLX07Ci0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbGxjX2lnX2ZsYWdfdmFsdWVzW10gPSB7IAotICAgICAgICB7IDAsICJJbmRpdmlkdWFsIiB9LAotICAgICAgICB7IExMQ19JRywgIkdyb3VwIiB9LAotCXsgMCwgTlVMTCB9Ci19OwotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxsY19zdXBlcnZpc29yeV92YWx1ZXNbXSA9IHsgCi0gICAgICAgIHsgMCwgIlJlY2VpdmVyIFJlYWR5IiB9LAotICAgICAgICB7IDEsICJSZWNlaXZlciBub3QgUmVhZHkiIH0sCi0gICAgICAgIHsgMiwgIlJlamVjdCIgfSwKLQl7IDAsICAgICAgICAgICAgIE5VTEwgfQotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBjaXNjb192YWx1ZXNbXSA9IHsgCi0JeyBQSURfQ0lTQ09fQ0RQLCAiQ0RQIiB9LAotCXsgUElEX0NJU0NPX1ZUUCwgIlZUUCIgfSwKLQl7IFBJRF9DSVNDT19EVFAsICJEVFAiIH0sCi0JeyAwLCAgICAgICAgICAgICBOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGJyaWRnZWRfdmFsdWVzW10gPSB7IAotCXsgUElEX1JGQzI2ODRfRVRIX0ZDUywgICAgICJFdGhlcm5ldCArIEZDUyIgfSwKLQl7IFBJRF9SRkMyNjg0X0VUSF9OT0ZDUywgICAiRXRoZXJuZXQgdy9vIEZDUyIgfSwKLQl7IFBJRF9SRkMyNjg0XzgwMl80X0ZDUywgICAiODAyLjQgKyBGQ1MiIH0sCi0JeyBQSURfUkZDMjY4NF84MDJfNF9OT0ZDUywgIjgwMi40IHcvbyBGQ1MiIH0sCi0JeyBQSURfUkZDMjY4NF84MDJfNV9GQ1MsICAgIlRva2VuIFJpbmcgKyBGQ1MiIH0sCi0JeyBQSURfUkZDMjY4NF84MDJfNV9OT0ZDUywgIlRva2VuIFJpbmcgdy9vIEZDUyIgfSwKLQl7IFBJRF9SRkMyNjg0X0ZERElfRkNTLCAgICAiRkRESSArIEZDUyIgfSwKLQl7IFBJRF9SRkMyNjg0X0ZERElfTk9GQ1MsICAiRkRESSB3L28gRkNTIiB9LAotCXsgUElEX1JGQzI2ODRfODAyXzZfRkNTLCAgICI4MDIuNiArIEZDUyIgfSwKLQl7IFBJRF9SRkMyNjg0XzgwMl82X05PRkNTLCAiODAyLjYgdy9vIEZDUyIgfSwKLQl7IFBJRF9SRkMyNjg0X0JQRFUsICAgICAgICAiQlBEVSIgfSwKLQl7IDAsICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBudWxsX3ZhbHVlc1tdID0geyAKLQl7IDAsICAgICAgICAgICAgIE5VTEwgfQotfTsKLQotc3RydWN0IG91aV90b2sgewotCXVfaW50MzJfdAlvdWk7Ci0JY29uc3Qgc3RydWN0IHRvayAqdG9rOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvdWlfdG9rIG91aV90b190b2tbXSA9IHsKLQl7IE9VSV9FTkNBUF9FVEhFUiwgZXRoZXJ0eXBlX3ZhbHVlcyB9LAotCXsgT1VJX0NJU0NPXzkwLCBldGhlcnR5cGVfdmFsdWVzIH0sCS8qIHVzZXMgc29tZSBFdGhlcnR5cGUgdmFsdWVzICovCi0JeyBPVUlfQVBQTEVUQUxLLCBldGhlcnR5cGVfdmFsdWVzIH0sCS8qIHVzZXMgc29tZSBFdGhlcnR5cGUgdmFsdWVzICovCi0JeyBPVUlfQ0lTQ08sIGNpc2NvX3ZhbHVlcyB9LAotCXsgT1VJX1JGQzI2ODQsIGJyaWRnZWRfdmFsdWVzIH0sCS8qIGJyaWRnZWQsIFJGQyAyNDI3IEZSIG9yIFJGQyAyODY0IEFUTSAqLwotCXsgMCwgTlVMTCB9Ci19OwotCi0vKgotICogUmV0dXJucyBub24temVybyBJRkYgaXQgc3VjY2VlZHMgaW4gcHJpbnRpbmcgdGhlIGhlYWRlcgotICovCi1pbnQKLWxsY19wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuLAotCSAgY29uc3QgdV9jaGFyICplc3JjLCBjb25zdCB1X2NoYXIgKmVkc3QsIHVfc2hvcnQgKmV4dHJhY3RlZF9ldGhlcnR5cGUpCi17Ci0JdV9pbnQ4X3QgZHNhcF9maWVsZCwgZHNhcCwgc3NhcF9maWVsZCwgc3NhcDsKLQl1X2ludDE2X3QgY29udHJvbDsKLQlpbnQgaXNfdTsKLQlyZWdpc3RlciBpbnQgcmV0OwotCi0JKmV4dHJhY3RlZF9ldGhlcnR5cGUgPSAwOwotCi0JaWYgKGNhcGxlbiA8IDMpIHsKLQkJKHZvaWQpcHJpbnRmKCJbfGxsY10iKTsKLQkJZGVmYXVsdF9wcmludCgodV9jaGFyICopcCwgY2FwbGVuKTsKLQkJcmV0dXJuKDApOwotCX0KLQotCWRzYXBfZmllbGQgPSAqcDsKLQlzc2FwX2ZpZWxkID0gKihwICsgMSk7Ci0KLQkvKgotCSAqIE9LLCB3aGF0IHR5cGUgb2YgTExDIGZyYW1lIGlzIHRoaXM/ICBUaGUgbGVuZ3RoCi0JICogb2YgdGhlIGNvbnRyb2wgZmllbGQgZGVwZW5kcyBvbiB0aGF0IC0gSSBmcmFtZXMKLQkgKiBoYXZlIGEgdHdvLWJ5dGUgY29udHJvbCBmaWVsZCwgYW5kIFUgZnJhbWVzIGhhdmUKLQkgKiBhIG9uZS1ieXRlIGNvbnRyb2wgZmllbGQuCi0JICovCi0JY29udHJvbCA9ICoocCArIDIpOwotCWlmICgoY29udHJvbCAmIExMQ19VX0ZNVCkgPT0gTExDX1VfRk1UKSB7Ci0JCS8qCi0JCSAqIFUgZnJhbWUuCi0JCSAqLwotCQlpc191ID0gMTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBUaGUgY29udHJvbCBmaWVsZCBpbiBJIGFuZCBTIGZyYW1lcyBpcwotCQkgKiAyIGJ5dGVzLi4uCi0JCSAqLwotCQlpZiAoY2FwbGVuIDwgNCkgewotCQkJKHZvaWQpcHJpbnRmKCJbfGxsY10iKTsKLQkJCWRlZmF1bHRfcHJpbnQoKHVfY2hhciAqKXAsIGNhcGxlbik7Ci0JCQlyZXR1cm4oMCk7Ci0JCX0KLQotCQkvKgotCQkgKiAuLi5hbmQgaXMgbGl0dGxlLWVuZGlhbi4KLQkJICovCi0JCWNvbnRyb2wgPSBFWFRSQUNUX0xFXzE2QklUUyhwICsgMik7Ci0JCWlzX3UgPSAwOwotCX0KLQotCWlmIChzc2FwX2ZpZWxkID09IExMQ1NBUF9HTE9CQUwgJiYgZHNhcF9maWVsZCA9PSBMTENTQVBfR0xPQkFMKSB7Ci0JCS8qCi0JCSAqIFRoaXMgaXMgYW4gRXRoZXJuZXRfODAyLjMgSVBYIGZyYW1lOyBpdCBoYXMgYW4KLQkJICogODAyLjMgaGVhZGVyIChpLmUuLCBhbiBFdGhlcm5ldCBoZWFkZXIgd2hlcmUgdGhlCi0JCSAqIHR5cGUvbGVuZ3RoIGZpZWxkIGlzIDw9IEVUSEVSTVRVLCBpLmUuIGl0J3MgYSBsZW5ndGgKLQkJICogZmllbGQsIG5vdCBhIHR5cGUgZmllbGQpLCBidXQgaGFzIG5vIDgwMi4yIGhlYWRlciAtCi0JCSAqIHRoZSBJUFggcGFja2V0IHN0YXJ0cyByaWdodCBhZnRlciB0aGUgRXRoZXJuZXQgaGVhZGVyLAotCQkgKiB3aXRoIGEgc2lnbmF0dXJlIG9mIHR3byBieXRlcyBvZiAweEZGICh3aGljaCBpcwotCQkgKiBMTENTQVBfR0xPQkFMKS4KLQkJICoKLQkJICogKEl0IG1pZ2h0IGFsc28gaGF2ZSBiZWVuIGFuIEV0aGVybmV0XzgwMi4zIElQWCBhdAotCQkgKiBvbmUgdGltZSwgYnV0IGdvdCBicmlkZ2VkIG9udG8gYW5vdGhlciBuZXR3b3JrLAotCQkgKiBzdWNoIGFzIGFuIDgwMi4xMSBuZXR3b3JrOyB0aGlzIGhhcyBhcHBlYXJlZCBpbiBhdAotCQkgKiBsZWFzdCBvbmUgY2FwdHVyZSBmaWxlLikKLQkJICovCi0KLSAgICAgICAgICAgIGlmIChlZmxhZykKLQkJcHJpbnRmKCJJUFggODAyLjM6ICIpOwotCi0gICAgICAgICAgICBpcHhfcHJpbnQocCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiAoMSk7Ci0JfQotCi0JZHNhcCA9IGRzYXBfZmllbGQgJiB+TExDX0lHOwotCXNzYXAgPSBzc2FwX2ZpZWxkICYgfkxMQ19HU0FQOwotCi0JaWYgKGVmbGFnKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJMTEMsIGRzYXAgJXMgKDB4JTAyeCkgJXMsIHNzYXAgJXMgKDB4JTAyeCkgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxsY192YWx1ZXMsICJVbmtub3duIiwgZHNhcCksCi0gICAgICAgICAgICAgICAgICAgICAgIGRzYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGxjX2lnX2ZsYWdfdmFsdWVzLCAiVW5rbm93biIsIGRzYXBfZmllbGQgJiBMTENfSUcpLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxsY192YWx1ZXMsICJVbmtub3duIiwgc3NhcCksCi0gICAgICAgICAgICAgICAgICAgICAgIHNzYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobGxjX2ZsYWdfdmFsdWVzLCAiVW5rbm93biIsIHNzYXBfZmllbGQgJiBMTENfR1NBUCkpOwotCi0JCWlmIChpc191KSB7Ci0JCQlwcmludGYoIiwgY3RybCAweCUwMng6ICIsIGNvbnRyb2wpOwotCQl9IGVsc2UgewotCQkJcHJpbnRmKCIsIGN0cmwgMHglMDR4OiAiLCBjb250cm9sKTsKLQkJfQotCX0KLQotCWlmIChzc2FwID09IExMQ1NBUF84MDIxRCAmJiBkc2FwID09IExMQ1NBUF84MDIxRCAmJgotCSAgICBjb250cm9sID09IExMQ19VSSkgewotCQlzdHBfcHJpbnQocCszLCBsZW5ndGgtMyk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0JaWYgKHNzYXAgPT0gTExDU0FQX0lQICYmIGRzYXAgPT0gTExDU0FQX0lQICYmCi0JICAgIGNvbnRyb2wgPT0gTExDX1VJKSB7Ci0JCWlwX3ByaW50KGduZG8sIHArNCwgbGVuZ3RoLTQpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChzc2FwID09IExMQ1NBUF9JUFggJiYgZHNhcCA9PSBMTENTQVBfSVBYICYmCi0JICAgIGNvbnRyb2wgPT0gTExDX1VJKSB7Ci0JCS8qCi0JCSAqIFRoaXMgaXMgYW4gRXRoZXJuZXRfODAyLjIgSVBYIGZyYW1lLCB3aXRoIGFuIDgwMi4zCi0JCSAqIGhlYWRlciBhbmQgYW4gODAyLjIgTExDIGhlYWRlciB3aXRoIHRoZSBzb3VyY2UgYW5kCi0JCSAqIGRlc3RpbmF0aW9uIFNBUHMgYmVpbmcgdGhlIElQWCBTQVAuCi0JCSAqCi0JCSAqIFNraXAgRFNBUCwgTFNBUCwgYW5kIGNvbnRyb2wgZmllbGQuCi0JCSAqLwotICAgICAgICAgICAgICAgIGlmIChlZmxhZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiSVBYIDgwMi4yOiAiKTsKLQotCQlpcHhfcHJpbnQocCszLCBsZW5ndGgtMyk7Ci0JCXJldHVybiAoMSk7Ci0JfQotCi0jaWZkZWYgVENQRFVNUF9ET19TTUIKLQlpZiAoc3NhcCA9PSBMTENTQVBfTkVUQkVVSSAmJiBkc2FwID09IExMQ1NBUF9ORVRCRVVJCi0JICAgICYmICghKGNvbnRyb2wgJiBMTENfU19GTVQpIHx8IGNvbnRyb2wgPT0gTExDX1VfRk1UKSkgewotCQkvKgotCQkgKiB3ZSBkb24ndCBhY3R1YWxseSBoYXZlIGEgZnVsbCBuZXRiZXVpIHBhcnNlciB5ZXQsIGJ1dCB0aGUKLQkJICogc21iIHBhcnNlciBjYW4gaGFuZGxlIG1hbnkgc21iLWluLW5ldGJldWkgcGFja2V0cywgd2hpY2gKLQkJICogaXMgdmVyeSB1c2VmdWwsIHNvIHdlIGNhbGwgdGhhdAotCQkgKgotCQkgKiBXZSBkb24ndCBjYWxsIGl0IGZvciBTIGZyYW1lcywgaG93ZXZlciwganVzdCBJIGZyYW1lcwotCQkgKiAod2hpY2ggYXJlIGZyYW1lcyB0aGF0IGRvbid0IGhhdmUgdGhlIGxvdy1vcmRlciBiaXQsCi0JCSAqIExMQ19TX0ZNVCwgc2V0IGluIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBjb250cm9sIGZpZWxkKQotCQkgKiBhbmQgVUkgZnJhbWVzICh3aG9zZSBjb250cm9sIGZpZWxkIGlzIGp1c3QgMywgTExDX1VfRk1UKS4KLQkJICovCi0KLQkJLyoKLQkJICogU2tpcCB0aGUgTExDIGhlYWRlci4KLQkJICovCi0JCWlmIChpc191KSB7Ci0JCQlwICs9IDM7Ci0JCQlsZW5ndGggLT0gMzsKLQkJCWNhcGxlbiAtPSAzOwotCQl9IGVsc2UgewotCQkJcCArPSA0OwotCQkJbGVuZ3RoIC09IDQ7Ci0JCQljYXBsZW4gLT0gNDsKLQkJfQotCQluZXRiZXVpX3ByaW50KGNvbnRyb2wsIHAsIGxlbmd0aCk7Ci0JCXJldHVybiAoMSk7Ci0JfQotI2VuZGlmCi0JaWYgKHNzYXAgPT0gTExDU0FQX0lTT05TICYmIGRzYXAgPT0gTExDU0FQX0lTT05TCi0JICAgICYmIGNvbnRyb2wgPT0gTExDX1VJKSB7Ci0JCWlzb2NsbnNfcHJpbnQocCArIDMsIGxlbmd0aCAtIDMsIGNhcGxlbiAtIDMpOwotCQlyZXR1cm4gKDEpOwotCX0KLQotCWlmIChzc2FwID09IExMQ1NBUF9TTkFQICYmIGRzYXAgPT0gTExDU0FQX1NOQVAKLQkgICAgJiYgY29udHJvbCA9PSBMTENfVUkpIHsKLQkJLyoKLQkJICogWFhYIC0gd2hhdCAqaXMqIHRoZSByaWdodCBicmlkZ2UgcGFkIHZhbHVlIGhlcmU/Ci0JCSAqIERvZXMgYW55Ym9keSBldmVyIGJyaWRnZSBvbmUgZm9ybSBvZiBMQU4gdHJhZmZpYwotCQkgKiBvdmVyIGEgbmV0d29ya2luZyB0eXBlIHRoYXQgdXNlcyA4MDIuMiBMTEM/Ci0JCSAqLwotCQlyZXQgPSBzbmFwX3ByaW50KHArMywgbGVuZ3RoLTMsIGNhcGxlbi0zLCBleHRyYWN0ZWRfZXRoZXJ0eXBlLAotCQkgICAgMik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gKHJldCk7Ci0JfQotCi0JaWYgKCFlZmxhZykgewotCQlpZiAoc3NhcCA9PSBkc2FwKSB7Ci0JCQlpZiAoZXNyYyA9PSBOVUxMIHx8IGVkc3QgPT0gTlVMTCkKLQkJCQkodm9pZClwcmludGYoIiVzICIsIHRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24gRFNBUCAweCUwMngiLCBkc2FwKSk7Ci0JCQllbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzICVzICIsCi0JCQkJCQlldGhlcmFkZHJfc3RyaW5nKGVzcmMpLAotCQkJCQkJZXRoZXJhZGRyX3N0cmluZyhlZHN0KSwKLQkJCQkJCXRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24gRFNBUCAweCUwMngiLCBkc2FwKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZXNyYyA9PSBOVUxMIHx8IGVkc3QgPT0gTlVMTCkKLQkJCQkodm9pZClwcmludGYoIiVzID4gJXMgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxsY192YWx1ZXMsICJVbmtub3duIFNTQVAgMHglMDJ4Iiwgc3NhcCksCi0JCQkJCXRvazJzdHIobGxjX3ZhbHVlcywgIlVua25vd24gRFNBUCAweCUwMngiLCBkc2FwKSk7Ci0JCQllbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCIlcyAlcyA+ICVzICVzICIsCi0JCQkJCWV0aGVyYWRkcl9zdHJpbmcoZXNyYyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsbGNfdmFsdWVzLCAiVW5rbm93biBTU0FQIDB4JTAyeCIsIHNzYXApLAotCQkJCQlldGhlcmFkZHJfc3RyaW5nKGVkc3QpLAotCQkJCQl0b2syc3RyKGxsY192YWx1ZXMsICJVbmtub3duIERTQVAgMHglMDJ4IiwgZHNhcCkpOwotCQl9Ci0JfQotCi0JaWYgKGlzX3UpIHsKLQkJcHJpbnRmKCJVbm51bWJlcmVkLCAlcywgRmxhZ3MgWyVzXSwgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsbGNfY21kX3ZhbHVlcywgIiUwMngiLCBMTENfVV9DTUQoY29udHJvbCkpLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxsY19mbGFnX3ZhbHVlcywiPyIsKHNzYXBfZmllbGQgJiBMTENfR1NBUCkgfCAoY29udHJvbCAmIExMQ19VX1BPTEwpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQotCQlwICs9IDM7Ci0JCWxlbmd0aCAtPSAzOwotCQljYXBsZW4gLT0gMzsKLQotCQlpZiAoKGNvbnRyb2wgJiB+TExDX1VfUE9MTCkgPT0gTExDX1hJRCkgewotCQkJaWYgKCpwID09IExMQ19YSURfRkkpIHsKLQkJCQlwcmludGYoIjogJTAyeCAlMDJ4IiwgcFsxXSwgcFsyXSk7Ci0JCQkJcCArPSAzOwotCQkJCWxlbmd0aCAtPSAzOwotCQkJCWNhcGxlbiAtPSAzOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKChjb250cm9sICYgTExDX1NfRk1UKSA9PSBMTENfU19GTVQpIHsKLQkJCSh2b2lkKXByaW50ZigiU3VwZXJ2aXNvcnksICVzLCByY3Ygc2VxICV1LCBGbGFncyBbJXNdLCBsZW5ndGggJXUiLAotCQkJCXRvazJzdHIobGxjX3N1cGVydmlzb3J5X3ZhbHVlcywiPyIsTExDX1NfQ01EKGNvbnRyb2wpKSwKLQkJCQlMTENfSVNfTlIoY29udHJvbCksCi0JCQkJdG9rMnN0cihsbGNfZmxhZ192YWx1ZXMsIj8iLChzc2FwX2ZpZWxkICYgTExDX0dTQVApIHwgKGNvbnRyb2wgJiBMTENfSVNfUE9MTCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJKHZvaWQpcHJpbnRmKCJJbmZvcm1hdGlvbiwgc2VuZCBzZXEgJXUsIHJjdiBzZXEgJXUsIEZsYWdzIFslc10sIGxlbmd0aCAldSIsCi0JCQkJTExDX0lfTlMoY29udHJvbCksCi0JCQkJTExDX0lTX05SKGNvbnRyb2wpLAotCQkJCXRvazJzdHIobGxjX2ZsYWdfdmFsdWVzLCI/Iiwoc3NhcF9maWVsZCAmIExMQ19HU0FQKSB8IChjb250cm9sICYgTExDX0lTX1BPTEwpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKLQkJfQotCQlwICs9IDQ7Ci0JCWxlbmd0aCAtPSA0OwotCQljYXBsZW4gLT0gNDsKLQl9Ci0JcmV0dXJuKDEpOwotfQotCi1pbnQKLXNuYXBfcHJpbnQoY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW5ndGgsIHVfaW50IGNhcGxlbiwKLSAgICB1X3Nob3J0ICpleHRyYWN0ZWRfZXRoZXJ0eXBlLCB1X2ludCBicmlkZ2VfcGFkKQotewotCXVfaW50MzJfdCBvcmdjb2RlOwotCXJlZ2lzdGVyIHVfc2hvcnQgZXQ7Ci0JcmVnaXN0ZXIgaW50IHJldDsKLQotCVRDSEVDSzIoKnAsIDUpOwotCW9yZ2NvZGUgPSBFWFRSQUNUXzI0QklUUyhwKTsKLQlldCA9IEVYVFJBQ1RfMTZCSVRTKHAgKyAzKTsKLQotCWlmIChlZmxhZykgewotCQljb25zdCBzdHJ1Y3QgdG9rICp0b2sgPSBudWxsX3ZhbHVlczsKLQkJY29uc3Qgc3RydWN0IG91aV90b2sgKm90cDsKLQotCQlmb3IgKG90cCA9ICZvdWlfdG9fdG9rWzBdOyBvdHAtPnRvayAhPSBOVUxMOyBvdHArKykgewotCQkJaWYgKG90cC0+b3VpID09IG9yZ2NvZGUpIHsKLQkJCQl0b2sgPSBvdHAtPnRvazsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkodm9pZClwcmludGYoIm91aSAlcyAoMHglMDZ4KSwgJXMgJXMgKDB4JTA0eCk6ICIsCi0JCSAgICAgdG9rMnN0cihvdWlfdmFsdWVzLCAiVW5rbm93biIsIG9yZ2NvZGUpLAotCQkgICAgIG9yZ2NvZGUsCi0JCSAgICAgKG9yZ2NvZGUgPT0gMHgwMDAwMDAgPyAiZXRoZXJ0eXBlIiA6ICJwaWQiKSwKLQkJICAgICB0b2syc3RyKHRvaywgIlVua25vd24iLCBldCksCi0JCSAgICAgZXQpOwotCX0KLQlwICs9IDU7Ci0JbGVuZ3RoIC09IDU7Ci0JY2FwbGVuIC09IDU7Ci0KLQlzd2l0Y2ggKG9yZ2NvZGUpIHsKLQljYXNlIE9VSV9FTkNBUF9FVEhFUjoKLQljYXNlIE9VSV9DSVNDT185MDoKLQkJLyoKLQkJICogVGhpcyBpcyBhbiBlbmNhcHN1bGF0ZWQgRXRoZXJuZXQgcGFja2V0LAotCQkgKiBvciBhIHBhY2tldCBicmlkZ2VkIGJ5IHNvbWUgcGllY2Ugb2YKLQkJICogQ2lzY28gaGFyZHdhcmU7IHRoZSBwcm90b2NvbCBJRCBpcwotCQkgKiBhbiBFdGhlcm5ldCBwcm90b2NvbCB0eXBlLgotCQkgKi8KLQkJcmV0ID0gZXRoZXJfZW5jYXBfcHJpbnQoZXQsIHAsIGxlbmd0aCwgY2FwbGVuLAotCQkgICAgZXh0cmFjdGVkX2V0aGVydHlwZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gKHJldCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPVUlfQVBQTEVUQUxLOgotCQlpZiAoZXQgPT0gRVRIRVJUWVBFX0FUQUxLKSB7Ci0JCQkvKgotCQkJICogTm8sIEkgaGF2ZSBubyBpZGVhIHdoeSBBcHBsZSB1c2VkIG9uZQotCQkJICogb2YgdGhlaXIgb3duIE9VSXMsIHJhdGhlciB0aGFuCi0JCQkgKiAweDAwMDAwMCwgYW5kIGFuIEV0aGVybmV0IHBhY2tldAotCQkJICogdHlwZSwgZm9yIEFwcGxldGFsayBkYXRhIHBhY2tldHMsCi0JCQkgKiBidXQgdXNlZCAweDAwMDAwMCBhbmQgYW4gRXRoZXJuZXQKLQkJCSAqIHBhY2tldCB0eXBlIGZvciBBQVJQIHBhY2tldHMuCi0JCQkgKi8KLQkJCXJldCA9IGV0aGVyX2VuY2FwX3ByaW50KGV0LCBwLCBsZW5ndGgsIGNhcGxlbiwKLQkJCSAgICBleHRyYWN0ZWRfZXRoZXJ0eXBlKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIChyZXQpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBPVUlfQ0lTQ086Ci0JCWlmIChldCA9PSBQSURfQ0lTQ09fQ0RQKSB7Ci0JCQljZHBfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4pOwotCQkJcmV0dXJuICgxKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT1VJX1JGQzI2ODQ6Ci0JCXN3aXRjaCAoZXQpIHsKLQotCQljYXNlIFBJRF9SRkMyNjg0X0VUSF9GQ1M6Ci0JCWNhc2UgUElEX1JGQzI2ODRfRVRIX05PRkNTOgotCQkJLyoKLQkJCSAqIFhYWCAtIHJlbW92ZSB0aGUgbGFzdCB0d28gYnl0ZXMgZm9yCi0JCQkgKiBQSURfUkZDMjY4NF9FVEhfRkNTPwotCQkJICovCi0JCQkvKgotCQkJICogU2tpcCB0aGUgcGFkZGluZy4KLQkJCSAqLwotCQkJVENIRUNLMigqcCwgYnJpZGdlX3BhZCk7Ci0JCQljYXBsZW4gLT0gYnJpZGdlX3BhZDsKLQkJCWxlbmd0aCAtPSBicmlkZ2VfcGFkOwotCQkJcCArPSBicmlkZ2VfcGFkOwotCi0JCQkvKgotCQkJICogV2hhdCByZW1haW5zIGlzIGFuIEV0aGVybmV0IHBhY2tldC4KLQkJCSAqLwotCQkJZXRoZXJfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4pOwotCQkJcmV0dXJuICgxKTsKLQotCQljYXNlIFBJRF9SRkMyNjg0XzgwMl81X0ZDUzoKLQkJY2FzZSBQSURfUkZDMjY4NF84MDJfNV9OT0ZDUzoKLQkJCS8qCi0JCQkgKiBYWFggLSByZW1vdmUgdGhlIGxhc3QgdHdvIGJ5dGVzIGZvcgotCQkJICogUElEX1JGQzI2ODRfRVRIX0ZDUz8KLQkJCSAqLwotCQkJLyoKLQkJCSAqIFNraXAgdGhlIHBhZGRpbmcsIGJ1dCBub3QgdGhlIEFjY2VzcwotCQkJICogQ29udHJvbCBmaWVsZC4KLQkJCSAqLwotCQkJVENIRUNLMigqcCwgYnJpZGdlX3BhZCk7Ci0JCQljYXBsZW4gLT0gYnJpZGdlX3BhZDsKLQkJCWxlbmd0aCAtPSBicmlkZ2VfcGFkOwotCQkJcCArPSBicmlkZ2VfcGFkOwotCi0JCQkvKgotCQkJICogV2hhdCByZW1haW5zIGlzIGFuIDgwMi41IFRva2VuIFJpbmcKLQkJCSAqIHBhY2tldC4KLQkJCSAqLwotCQkJdG9rZW5fcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4pOwotCQkJcmV0dXJuICgxKTsKLQotCQljYXNlIFBJRF9SRkMyNjg0X0ZERElfRkNTOgotCQljYXNlIFBJRF9SRkMyNjg0X0ZERElfTk9GQ1M6Ci0JCQkvKgotCQkJICogWFhYIC0gcmVtb3ZlIHRoZSBsYXN0IHR3byBieXRlcyBmb3IKLQkJCSAqIFBJRF9SRkMyNjg0X0VUSF9GQ1M/Ci0JCQkgKi8KLQkJCS8qCi0JCQkgKiBTa2lwIHRoZSBwYWRkaW5nLgotCQkJICovCi0JCQlUQ0hFQ0syKCpwLCBicmlkZ2VfcGFkICsgMSk7Ci0JCQljYXBsZW4gLT0gYnJpZGdlX3BhZCArIDE7Ci0JCQlsZW5ndGggLT0gYnJpZGdlX3BhZCArIDE7Ci0JCQlwICs9IGJyaWRnZV9wYWQgKyAxOwotCi0JCQkvKgotCQkJICogV2hhdCByZW1haW5zIGlzIGFuIEZEREkgcGFja2V0LgotCQkJICovCi0JCQlmZGRpX3ByaW50KHAsIGxlbmd0aCwgY2FwbGVuKTsKLQkJCXJldHVybiAoMSk7Ci0KLQkJY2FzZSBQSURfUkZDMjY4NF9CUERVOgotCQkJc3RwX3ByaW50KHAsIGxlbmd0aCk7Ci0JCQlyZXR1cm4gKDEpOwotCQl9Ci0JfQotCXJldHVybiAoMCk7Ci0KLXRydW5jOgotCSh2b2lkKXByaW50ZigiW3xzbmFwXSIpOwotCXJldHVybiAoMSk7Ci19Ci0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGMtc3R5bGU6IHdoaXRlc21pdGgKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3ByaW50LWxtcC5jIGIvcHJpbnQtbG1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZDE2NmYuLjAwMDAwMDAKLS0tIGEvcHJpbnQtbG1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ODEgKzAsMCBAQAotLyoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKiBTdXBwb3J0IGZvciBMTVAgc2VydmljZSBkaXNjb3ZlcnkgZXh0ZW5zaW9ucyAoZGVmaW5lZCBieSBVTkkgMS4wKSBhZGRlZAotICogYnkgTWFudSBQYXRoYWsgKG1hcGF0aGFrQGNpc2NvLmNvbSksIE1heSAyMDA1Ci0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbG1wLmMsdiAxLjUuMi40IDIwMDYvMDYvMjMgMDI6MDc6MjcgaGFubmVzIEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZ21wbHMuaCIKLQotLyoKLSAqIExNUCBjb21tb24gaGVhZGVyCi0gKgotICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8IFZlcnMgIHwgICAgICAoUmVzZXJ2ZWQpICAgICAgIHwgICAgRmxhZ3MgICAgICB8ICAgIE1zZyBUeXBlICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgTE1QIExlbmd0aCAgICAgICAgICAgfCAgICAgICAgICAoUmVzZXJ2ZWQpICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICovCi0KLXN0cnVjdCBsbXBfY29tbW9uX2hlYWRlciB7Ci0gICAgdV9pbnQ4X3QgdmVyc2lvbl9yZXNbMl07Ci0gICAgdV9pbnQ4X3QgZmxhZ3M7ICAgCi0gICAgdV9pbnQ4X3QgbXNnX3R5cGU7Ci0gICAgdV9pbnQ4X3QgbGVuZ3RoWzJdOwotICAgIHVfaW50OF90IHJlc2VydmVkWzJdOwotfTsKLQotI2RlZmluZSBMTVBfVkVSU0lPTiAgICAgICAgICAgIDEKLSNkZWZpbmUJTE1QX0VYVFJBQ1RfVkVSU0lPTih4KSAoKCh4KSYweGYwKT4+NCkgCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9oZWFkZXJfZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICJDb250cm9sIENoYW5uZWwgRG93biJ9LAotICAgIHsgMHgwMiwgIkxNUCByZXN0YXJ0In0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial90ZV9saW5rX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiRmF1bHQgTWFuYWdlbWVudCBTdXBwb3J0ZWQifSwKLSAgICB7IDB4MDIsICJMaW5rIFZlcmlmaWNhdGlvbiBTdXBwb3J0ZWQifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfb2JqX2RhdGFfbGlua19mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHgwMSwgIkRhdGEgTGluayBQb3J0In0sCi0gICAgeyAweDAyLCAiQWxsb2NhdGVkIGZvciB1c2VyIHRyYWZmaWMifSwKLSAgICB7IDB4MDQsICJGYWlsZWQgbGluayJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfY2hhbm5lbF9zdGF0dXNfdmFsdWVzW10gPSB7Ci0gICAgeyAxLCAiU2lnbmFsIE9rYXkifSwKLSAgICB7IDIsICJTaWduYWwgRGVncmFkZWQifSwKLSAgICB7IDMsICJTaWduYWwgRmFpbCJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfYmVnaW5fdmVyaWZ5X2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAwMDEsICJWZXJpZnkgYWxsIGxpbmtzIn0sCi0gICAgeyAweDAwMDIsICJEYXRhIGxpbmsgdHlwZSJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9vYmpfYmVnaW5fdmVyaWZ5X2Vycm9yX3ZhbHVlc1tdID0gewotICAgIHsgMHgwMSwgIlxuXHRcdExpbmsgVmVyaWZpY2F0aW9uIFByb2NlZHVyZSBOb3Qgc3VwcG9ydGVkIn0sCi0gICAgeyAweDAyLCAiXG5cdFx0VW53aWxsaW5nIHRvIHZlcmlmeSJ9LAotICAgIHsgMHgwNCwgIlxuXHRcdFVuc3VwcG9ydGVkIHZlcmlmaWNhdGlvbiB0cmFuc3BvcnQgbWVjaGFuaXNtIn0sCi0gICAgeyAweDA4LCAiXG5cdFx0TGlua19JZCBjb25maWd1cmF0aW9uIGVycm9yIn0sCi0gICAgeyAweDEwLCAiXG5cdFx0VW5rbm93biBvYmplY3QgYy10eXBlIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9saW5rX3N1bW1hcnlfZXJyb3JfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiXG5cdFx0VW5hY2NlcHRhYmxlIG5vbi1uZWdvdGlhYmxlIExJTktfU1VNTUFSWSBwYXJhbWV0ZXJzIn0sCi0gICAgeyAweDAyLCAiXG5cdFx0UmVuZWdvdGlhdGUgTElOS19TVU1NQVJZIHBhcmFtZXRlcnMifSwKLSAgICB7IDB4MDQsICJcblx0XHRJbnZhbGlkIFRFLUxJTksgT2JqZWN0In0sCi0gICAgeyAweDA4LCAiXG5cdFx0SW52YWxpZCBEQVRBLUxJTksgT2JqZWN0In0sCi0gICAgeyAweDEwLCAiXG5cdFx0VW5rbm93biBURS1MSU5LIE9iamVjdCBjLXR5cGUifSwKLSAgICB7IDB4MjAsICJcblx0XHRVbmtub3duIERBVEEtTElOSyBPYmplY3QgYy10eXBlIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotLyogU2VydmljZSBDb25maWcgU3VwcG9ydGVkIFByb3RvY29scyBGbGFncyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19zcF9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHgwMSwgIlJTVlAgU3VwcG9ydGVkIn0sCi0gICAgeyAweDAyLCAiTERQIFN1cHBvcnRlZCJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIFNlcnZpY2UgQ29uZmlnIENsaWVudCBQb3J0IFNlcnZpY2UgQXR0cmlidXRlIFRyYW5zcGFyZW5jeSBGbGFncyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19jcHNhX3RwX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiUGF0aC9WQyBPdmVyaGVhZCBUcmFuc3BhcmVuY3kgU3VwcG9ydGVkIn0sCi0gICAgeyAweDAyLCAiTGluZS9NUyBPdmVyaGVhZCBUcmFuc3BhcmVuY3kgU3VwcG9ydGVkIn0sCi0gICAgeyAweDA0LCAiU2VjdGlvbi9SUyBPdmVyaGVhZCBUcmFuc3BhcmVuY3kgU3VwcG9ydGVkIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotLyogU2VydmljZSBDb25maWcgQ2xpZW50IFBvcnQgU2VydmljZSBBdHRyaWJ1dGUgQ29udGlndW91cyBDb25jYXRlbmF0aW9uIFR5cGVzIEZsYWdzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfb2JqX3NlcnZpY2VfY29uZmlnX2Nwc2FfY2N0X2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiQ29udGlndW91cyBDb25jYXRlbmF0aW9uIFR5cGVzIFN1cHBvcnRlZCJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIFNlcnZpY2UgQ29uZmlnIE5ldHdvcmsgU2VydmljZSBBdHRyaWJ1dGVzIFRyYW5zcGFyZW5jeSBGbGFncyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19uc2FfdHJhbnNwYXJlbmN5X2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiU3RhbmRhcmQgU09IL1JTT0ggVHJhbnNwYXJlbmN5IFN1cHBvcnRlZCJ9LAotICAgIHsgMHgwMiwgIlN0YW5kYXJkIExPSC9NU09IIFRyYW5zcGFyZW5jeSBTdXBwb3J0ZWQifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0vKiBTZXJ2aWNlIENvbmZpZyBOZXR3b3JrIFNlcnZpY2UgQXR0cmlidXRlcyBUQ00gTW9uaXRvcmluZyBGbGFncyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19uc2FfdGNtX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAiVHJhbnNwYXJlbnQgVGFuZGVtIENvbm5lY3Rpb24gTW9uaXRvcmluZyBTdXBwb3J0ZWQifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0vKiBOZXR3b3JrIFNlcnZpY2UgQXR0cmlidXRlcyBOZXR3b3JrIERpdmVyc2l0eSBGbGFncyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19uc2FfbmV0d29ya19kaXZlcnNpdHlfZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICJOb2RlIERpdmVyc2l0eSBTdXBwb3J0ZWQifSwKLSAgICB7IDB4MDIsICJMaW5rIERpdmVyc2l0eSBTdXBwb3J0ZWQifSwKLSAgICB7IDB4MDQsICJTUkxHIERpdmVyc2l0eSBTdXBwb3J0ZWQifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lCUxNUF9NU0dUWVBFX0NPTkZJRyAgICAgICAgICAgICAgICAgMQotI2RlZmluZQlMTVBfTVNHVFlQRV9DT05GSUdfQUNLICAgICAgICAgICAgIDIKLSNkZWZpbmUJTE1QX01TR1RZUEVfQ09ORklHX05BQ0sgICAgICAgICAgICAzCi0jZGVmaW5lCUxNUF9NU0dUWVBFX0hFTExPICAgICAgICAgICAgICAgICAgNAotI2RlZmluZQlMTVBfTVNHVFlQRV9WRVJJRllfQkVHSU4gICAgICAgICAgIDUKLSNkZWZpbmUJTE1QX01TR1RZUEVfVkVSSUZZX0JFR0lOX0FDSyAgICAgICA2Ci0jZGVmaW5lCUxNUF9NU0dUWVBFX1ZFUklGWV9CRUdJTl9OQUNLICAgICAgNwotI2RlZmluZSBMTVBfTVNHVFlQRV9WRVJJRllfRU5EICAgICAgICAgICAgIDgKLSNkZWZpbmUgTE1QX01TR1RZUEVfVkVSSUZZX0VORF9BQ0sgICAgICAgICA5Ci0jZGVmaW5lIExNUF9NU0dUWVBFX1RFU1QgICAgICAgICAgICAgICAgICAxMAotI2RlZmluZSBMTVBfTVNHVFlQRV9URVNUX1NUQVRVU19TVUNDRVNTICAgMTEKLSNkZWZpbmUJTE1QX01TR1RZUEVfVEVTVF9TVEFUVVNfRkFJTFVSRSAgIDEyCi0jZGVmaW5lCUxNUF9NU0dUWVBFX1RFU1RfU1RBVFVTX0FDSyAgICAgICAxMwotI2RlZmluZQlMTVBfTVNHVFlQRV9MSU5LX1NVTU1BUlkgICAgICAgICAgMTQKLSNkZWZpbmUJTE1QX01TR1RZUEVfTElOS19TVU1NQVJZX0FDSyAgICAgIDE1Ci0jZGVmaW5lCUxNUF9NU0dUWVBFX0xJTktfU1VNTUFSWV9OQUNLICAgICAxNgotI2RlZmluZQlMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVUyAgICAgICAgMTcKLSNkZWZpbmUJTE1QX01TR1RZUEVfQ0hBTk5FTF9TVEFUVVNfQUNLICAgIDE4Ci0jZGVmaW5lCUxNUF9NU0dUWVBFX0NIQU5ORUxfU1RBVFVTX1JFUSAgICAxOQotI2RlZmluZQlMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVU19SRVNQICAgMjAKLS8qIExNUCBTZXJ2aWNlIERpc2NvdmVyeSBtZXNzYWdlIHR5cGVzIGRlZmluZWQgYnkgVU5JIDEuMCAqLwotI2RlZmluZSBMTVBfTVNHVFlQRV9TRVJWSUNFX0NPTkZJRyAgICAgICAgNTAKLSNkZWZpbmUgTE1QX01TR1RZUEVfU0VSVklDRV9DT05GSUdfQUNLICAgIDUxCi0jZGVmaW5lIExNUF9NU0dUWVBFX1NFUlZJQ0VfQ09ORklHX05BQ0sgICA1MgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfbXNnX3R5cGVfdmFsdWVzW10gPSB7Ci0gICAgeyBMTVBfTVNHVFlQRV9DT05GSUcsICJDb25maWcifSwKLSAgICB7IExNUF9NU0dUWVBFX0NPTkZJR19BQ0ssICJDb25maWcgQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9DT05GSUdfTkFDSywgIkNvbmZpZyBOQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9IRUxMTywgIkhlbGxvIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9WRVJJRllfQkVHSU4sICJCZWdpbiBWZXJpZnkifSwKLSAgICB7IExNUF9NU0dUWVBFX1ZFUklGWV9CRUdJTl9BQ0ssICJCZWdpbiBWZXJpZnkgQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9WRVJJRllfQkVHSU5fTkFDSywgIkJlZ2luIFZlcmlmeSBOQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9WRVJJRllfRU5ELCAiRW5kIFZlcmlmeSJ9LAotICAgIHsgTE1QX01TR1RZUEVfVkVSSUZZX0VORF9BQ0ssICJFbmQgVmVyaWZ5IEFDSyJ9LAotICAgIHsgTE1QX01TR1RZUEVfVEVTVCwgIlRlc3QifSwKLSAgICB7IExNUF9NU0dUWVBFX1RFU1RfU1RBVFVTX1NVQ0NFU1MsICJUZXN0IFN0YXR1cyBTdWNjZXNzIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9URVNUX1NUQVRVU19GQUlMVVJFLCAiVGVzdCBTdGF0dXMgRmFpbHVyZSJ9LAotICAgIHsgTE1QX01TR1RZUEVfVEVTVF9TVEFUVVNfQUNLLCAiVGVzdCBTdGF0dXMgQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9MSU5LX1NVTU1BUlksICJMaW5rIFN1bW1hcnkifSwKLSAgICB7IExNUF9NU0dUWVBFX0xJTktfU1VNTUFSWV9BQ0ssICJMaW5rIFN1bW1hcnkgQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9MSU5LX1NVTU1BUllfTkFDSywgIkxpbmsgU3VtbWFyeSBOQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVUywgIkNoYW5uZWwgU3RhdHVzIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9DSEFOTkVMX1NUQVRVU19BQ0ssICJDaGFubmVsIFN0YXR1cyBBQ0sifSwKLSAgICB7IExNUF9NU0dUWVBFX0NIQU5ORUxfU1RBVFVTX1JFUSwgIkNoYW5uZWwgU3RhdHVzIFJlcXVlc3QifSwKLSAgICB7IExNUF9NU0dUWVBFX0NIQU5ORUxfU1RBVFVTX1JFU1AsICJDaGFubmVsIFN0YXR1cyBSZXNwb25zZSJ9LAotICAgIHsgTE1QX01TR1RZUEVfU0VSVklDRV9DT05GSUcsICJTZXJ2aWNlIENvbmZpZyJ9LAotICAgIHsgTE1QX01TR1RZUEVfU0VSVklDRV9DT05GSUdfQUNLLCAiU2VydmljZSBDb25maWcgQUNLIn0sCi0gICAgeyBMTVBfTVNHVFlQRV9TRVJWSUNFX0NPTkZJR19OQUNLLCAiU2VydmljZSBDb25maWcgTkFDSyJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIAotICogTE1QIG9iamVjdCBoZWFkZXIKLSAqCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHxOfCAgIEMtVHlwZSAgICB8ICAgICBDbGFzcyAgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC8vICAgICAgICAgICAgICAgICAgICAgICAob2JqZWN0IGNvbnRlbnRzKSAgICAgICAgICAgICAgICAgICAgIC8vCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsgCi0gKi8KLQotc3RydWN0IGxtcF9vYmplY3RfaGVhZGVyIHsKLSAgICB1X2ludDhfdCBjdHlwZTsKLSAgICB1X2ludDhfdCBjbGFzc19udW07Ci0gICAgdV9pbnQ4X3QgbGVuZ3RoWzJdOwotfTsKLQotI2RlZmluZQlMTVBfT0JKX0NDX0lEICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCUxNUF9PQkpfTk9ERV9JRCAgICAgICAgICAgICAgIDIKLSNkZWZpbmUJTE1QX09CSl9MSU5LX0lEICAgICAgICAgICAgICAgMwotI2RlZmluZQlMTVBfT0JKX0lOVEVSRkFDRV9JRCAgICAgICAgICA0Ci0jZGVmaW5lCUxNUF9PQkpfTUVTU0FHRV9JRCAgICAgICAgICAgIDUgCi0jZGVmaW5lCUxNUF9PQkpfQ09ORklHICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUJTE1QX09CSl9IRUxMTyAgICAgICAgICAgICAgICAgNwotI2RlZmluZQlMTVBfT0JKX1ZFUklGWV9CRUdJTiAgICAgICAgICA4Ci0jZGVmaW5lIExNUF9PQkpfVkVSSUZZX0JFR0lOX0FDSyAgICAgIDkKLSNkZWZpbmUgTE1QX09CSl9WRVJJRllfSUQgICAgICAgICAgICAxMAotI2RlZmluZSBMTVBfT0JKX1RFX0xJTksgICAgICAgICAgICAgIDExCi0jZGVmaW5lIExNUF9PQkpfREFUQV9MSU5LICAgICAgICAgICAgMTIKLSNkZWZpbmUgTE1QX09CSl9DSEFOTkVMX1NUQVRVUyAgICAgICAxMwotI2RlZmluZSBMTVBfT0JKX0NIQU5ORUxfU1RBVFVTX1JFUSAgIDE0Ci0jZGVmaW5lIExNUF9PQkpfRVJST1JfQ09ERSAgICAgICAgICAgMjAKLQotI2RlZmluZSBMTVBfT0JKX1NFUlZJQ0VfQ09ORklHICAgICAgIDUxIC8qIGRlZmluZWQgaW4gVU5JIDEuMCAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBsbXBfb2JqX3ZhbHVlc1tdID0gewotICAgIHsgTE1QX09CSl9DQ19JRCwgIkNvbnRyb2wgQ2hhbm5lbCBJRCIgfSwKLSAgICB7IExNUF9PQkpfTk9ERV9JRCwgIk5vZGUgSUQiIH0sCi0gICAgeyBMTVBfT0JKX0xJTktfSUQsICJMaW5rIElEIiB9LAotICAgIHsgTE1QX09CSl9JTlRFUkZBQ0VfSUQsICJJbnRlcmZhY2UgSUQiIH0sCi0gICAgeyBMTVBfT0JKX01FU1NBR0VfSUQsICJNZXNzYWdlIElEIiB9LAotICAgIHsgTE1QX09CSl9DT05GSUcsICJDb25maWd1cmF0aW9uIiB9LAotICAgIHsgTE1QX09CSl9IRUxMTywgIkhlbGxvIiB9LAotICAgIHsgTE1QX09CSl9WRVJJRllfQkVHSU4sICJWZXJpZnkgQmVnaW4iIH0sCi0gICAgeyBMTVBfT0JKX1ZFUklGWV9CRUdJTl9BQ0ssICJWZXJpZnkgQmVnaW4gQUNLIiB9LAotICAgIHsgTE1QX09CSl9WRVJJRllfSUQsICJWZXJpZnkgSUQiIH0sCi0gICAgeyBMTVBfT0JKX1RFX0xJTkssICJURSBMaW5rIiB9LAotICAgIHsgTE1QX09CSl9EQVRBX0xJTkssICJEYXRhIExpbmsiIH0sCi0gICAgeyBMTVBfT0JKX0NIQU5ORUxfU1RBVFVTLCAiQ2hhbm5lbCBTdGF0dXMiIH0sCi0gICAgeyBMTVBfT0JKX0NIQU5ORUxfU1RBVFVTX1JFUSwgIkNoYW5uZWwgU3RhdHVzIFJlcXVlc3QiIH0sCi0gICAgeyBMTVBfT0JKX0VSUk9SX0NPREUsICJFcnJvciBDb2RlIiB9LAotICAgIHsgTE1QX09CSl9TRVJWSUNFX0NPTkZJRywgIlNlcnZpY2UgQ29uZmlnIiB9LAotCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZSBJTlRfU1dJVENISU5HX1RZUEVfU1VCT0JKIDEKLSNkZWZpbmUgV0FWRUxFTkdUSF9TVUJPQkogICAgICAgICAyCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9kYXRhX2xpbmtfc3Vib2JqW10gPSB7Ci0gICAgeyBJTlRfU1dJVENISU5HX1RZUEVfU1VCT0JKLCAiSW50ZXJmYWNlIFN3aXRjaGluZyBUeXBlIiB9LAotICAgIHsgV0FWRUxFTkdUSF9TVUJPQkogICAgICAgICwgIldhdmVsZW5ndGgiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZQlMTVBfQ1RZUEVfSVBWNCAgICAgICAxCi0jZGVmaW5lCUxNUF9DVFlQRV9JUFY2ICAgICAgIDIKLQotI2RlZmluZQlMTVBfQ1RZUEVfTE9DICAgICAgICAxCi0jZGVmaW5lCUxNUF9DVFlQRV9STVQgICAgICAgIDIKLSNkZWZpbmUJTE1QX0NUWVBFX1VOTUQgICAgICAgMwotIAotI2RlZmluZQlMTVBfQ1RZUEVfSVBWNF9MT0MgICAxCi0jZGVmaW5lCUxNUF9DVFlQRV9JUFY0X1JNVCAgIDIKLSNkZWZpbmUJTE1QX0NUWVBFX0lQVjZfTE9DICAgMwotI2RlZmluZQlMTVBfQ1RZUEVfSVBWNl9STVQgICA0Ci0jZGVmaW5lCUxNUF9DVFlQRV9VTk1EX0xPQyAgIDUgIAotI2RlZmluZQlMTVBfQ1RZUEVfVU5NRF9STVQgICA2IAotCi0jZGVmaW5lCUxNUF9DVFlQRV8xICAgICAgICAgIDEKLSNkZWZpbmUJTE1QX0NUWVBFXzIgICAgICAgICAgMgotCi0jZGVmaW5lIExNUF9DVFlQRV9IRUxMT19DT05GSUcgIDEKLSNkZWZpbmUgTE1QX0NUWVBFX0hFTExPICAgICAgICAgMQotCi0jZGVmaW5lIExNUF9DVFlQRV9CRUdJTl9WRVJJRllfRVJST1IgMQotI2RlZmluZSBMTVBfQ1RZUEVfTElOS19TVU1NQVJZX0VSUk9SIDIKLQotLyogQy1UeXBlcyBmb3IgU2VydmljZSBDb25maWcgT2JqZWN0ICovCi0jZGVmaW5lIExNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19TUCAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIExNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19DUFNBICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIExNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19UUkFOU1BBUkVOQ1lfVENNICAgICAzCi0jZGVmaW5lIExNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19ORVRXT1JLX0RJVkVSU0lUWSAgICA0Ci0KLS8qIAotICogRGlmZmVyZW50IGxpbmsgdHlwZXMgYWxsb3dlZCBpbiB0aGUgQ2xpZW50IFBvcnQgU2VydmljZSBBdHRyaWJ1dGVzCi0gKiBzdWJvYmplY3QgZGVmaW5lZCBmb3IgTE1QIFNlcnZpY2UgRGlzY292ZXJ5IGluIHRoZSBVTkkgMS4wIHNwZWMKLSAqLwotI2RlZmluZSBMTVBfU0RfU0VSVklDRV9DT05GSUdfQ1BTQV9MSU5LX1RZUEVfU0RIICAgICA1IC8qIFVOSSAxLjAgU2VjIDkuNC4yICovCi0jZGVmaW5lIExNUF9TRF9TRVJWSUNFX0NPTkZJR19DUFNBX0xJTktfVFlQRV9TT05FVCAgIDYgLyogVU5JIDEuMCBTZWMgOS40LjIgKi8KLQotLyoKLSAqIHRoZSBjdHlwZXMgYXJlIG5vdCBnbG9iYWxseSB1bmlxdWUgc28gZm9yCi0gKiB0cmFuc2xhdGluZyBpdCB0byBzdHJpbmdzIHdlIGJ1aWxkIGEgdGFibGUgYmFzZWQKLSAqIG9uIG9iamVjdHMgb2Zmc2V0dGVkIGJ5IHRoZSBjdHlwZQotICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxtcF9jdHlwZV92YWx1ZXNbXSA9IHsKLSAgICB7IDI1NipMTVBfT0JKX0NDX0lEK0xNUF9DVFlQRV9MT0MsICJMb2NhbCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0NDX0lEK0xNUF9DVFlQRV9STVQsICJSZW1vdGUiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9OT0RFX0lEK0xNUF9DVFlQRV9MT0MsICJMb2NhbCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX05PREVfSUQrTE1QX0NUWVBFX1JNVCwgIlJlbW90ZSIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0xJTktfSUQrTE1QX0NUWVBFX0lQVjRfTE9DLCAiSVB2NCBMb2NhbCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0xJTktfSUQrTE1QX0NUWVBFX0lQVjRfUk1ULCAiSVB2NCBSZW1vdGUiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9MSU5LX0lEK0xNUF9DVFlQRV9JUFY2X0xPQywgIklQdjYgTG9jYWwiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9MSU5LX0lEK0xNUF9DVFlQRV9JUFY2X1JNVCwgIklQdjYgUmVtb3RlIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfTElOS19JRCtMTVBfQ1RZUEVfVU5NRF9MT0MsICJVbm51bWJlcmVkIExvY2FsIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfTElOS19JRCtMTVBfQ1RZUEVfVU5NRF9STVQsICJVbm51bWJlcmVkIFJlbW90ZSIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0lOVEVSRkFDRV9JRCtMTVBfQ1RZUEVfSVBWNF9MT0MsICJJUHY0IExvY2FsIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfSU5URVJGQUNFX0lEK0xNUF9DVFlQRV9JUFY0X1JNVCwgIklQdjQgUmVtb3RlIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfSU5URVJGQUNFX0lEK0xNUF9DVFlQRV9JUFY2X0xPQywgIklQdjYgTG9jYWwiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9JTlRFUkZBQ0VfSUQrTE1QX0NUWVBFX0lQVjZfUk1ULCAiSVB2NiBSZW1vdGUiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9JTlRFUkZBQ0VfSUQrTE1QX0NUWVBFX1VOTURfTE9DLCAiVW5udW1iZXJlZCBMb2NhbCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0lOVEVSRkFDRV9JRCtMTVBfQ1RZUEVfVU5NRF9STVQsICJVbm51bWJlcmVkIFJlbW90ZSIgfSwKLSAgICB7IDI1NipMTVBfT0JKX01FU1NBR0VfSUQrTE1QX0NUWVBFXzEsICIxIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfTUVTU0FHRV9JRCtMTVBfQ1RZUEVfMiwgIjIiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9DT05GSUcrTE1QX0NUWVBFXzEsICIxIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfSEVMTE8rTE1QX0NUWVBFXzEsICIxIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfVkVSSUZZX0JFR0lOK0xNUF9DVFlQRV8xLCAiMSIgfSwKLSAgICB7IDI1NipMTVBfT0JKX1ZFUklGWV9CRUdJTl9BQ0srTE1QX0NUWVBFXzEsICIxIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfVkVSSUZZX0lEK0xNUF9DVFlQRV8xLCAiMSIgfSwKLSAgICB7IDI1NipMTVBfT0JKX1RFX0xJTksrTE1QX0NUWVBFX0lQVjQsICJJUHY0IiB9LAotICAgIHsgMjU2KkxNUF9PQkpfVEVfTElOSytMTVBfQ1RZUEVfSVBWNiwgIklQdjYiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9URV9MSU5LK0xNUF9DVFlQRV9VTk1ELCAiVW5udW1iZXJlZCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0RBVEFfTElOSytMTVBfQ1RZUEVfSVBWNCwgIklQdjQiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9EQVRBX0xJTksrTE1QX0NUWVBFX0lQVjYsICJJUHY2IiB9LAotICAgIHsgMjU2KkxNUF9PQkpfREFUQV9MSU5LK0xNUF9DVFlQRV9VTk1ELCAiVW5udW1iZXJlZCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0NIQU5ORUxfU1RBVFVTK0xNUF9DVFlQRV9JUFY0LCAiSVB2NCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0NIQU5ORUxfU1RBVFVTK0xNUF9DVFlQRV9JUFY2LCAiSVB2NiIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0NIQU5ORUxfU1RBVFVTK0xNUF9DVFlQRV9VTk1ELCAiVW5udW1iZXJlZCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0NIQU5ORUxfU1RBVFVTX1JFUStMTVBfQ1RZUEVfSVBWNCwgIklQdjQiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9DSEFOTkVMX1NUQVRVU19SRVErTE1QX0NUWVBFX0lQVjYsICJJUHY2IiB9LAotICAgIHsgMjU2KkxNUF9PQkpfQ0hBTk5FTF9TVEFUVVNfUkVRK0xNUF9DVFlQRV9VTk1ELCAiVW5udW1iZXJlZCIgfSwKLSAgICB7IDI1NipMTVBfT0JKX0VSUk9SX0NPREUrTE1QX0NUWVBFXzEsICIxIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfRVJST1JfQ09ERStMTVBfQ1RZUEVfMiwgIjIiIH0sCi0gICAgeyAyNTYqTE1QX09CSl9TRVJWSUNFX0NPTkZJRytMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfU1AsICIxIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfU0VSVklDRV9DT05GSUcrTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX0NQU0EsICIyIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfU0VSVklDRV9DT05GSUcrTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX1RSQU5TUEFSRU5DWV9UQ00sICIzIiB9LAotICAgIHsgMjU2KkxNUF9PQkpfU0VSVklDRV9DT05GSUcrTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX05FVFdPUktfRElWRVJTSVRZLCAiNCIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi12b2lkCi1sbXBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwcHRyLCByZWdpc3RlciB1X2ludCBsZW4pIHsKLQotICAgIGNvbnN0IHN0cnVjdCBsbXBfY29tbW9uX2hlYWRlciAqbG1wX2NvbV9oZWFkZXI7Ci0gICAgY29uc3Qgc3RydWN0IGxtcF9vYmplY3RfaGVhZGVyICpsbXBfb2JqX2hlYWRlcjsKLSAgICBjb25zdCB1X2NoYXIgKnRwdHIsKm9ial90cHRyOwotICAgIGludCB0bGVuLGxtcF9vYmpfbGVuLGxtcF9vYmpfY3R5cGUsb2JqX3RsZW47Ci0gICAgaW50IGhleGR1bXA7Ci0gICAgaW50IG9mZnNldCxzdWJvYmpfdHlwZSxzdWJvYmpfbGVuLHRvdGFsX3N1Ym9ial9sZW47Ci0gICAgaW50IGxpbmtfdHlwZTsKLQotICAgIHVuaW9uIHsgLyogaW50IHRvIGZsb2F0IGNvbnZlcnNpb24gYnVmZmVyICovCi0gICAgICAgIGZsb2F0IGY7IAotICAgICAgICB1X2ludDMyX3QgaTsKLSAgICB9IGJ3OwotCi0gICAgdHB0cj1wcHRyOwotICAgIGxtcF9jb21faGVhZGVyID0gKGNvbnN0IHN0cnVjdCBsbXBfY29tbW9uX2hlYWRlciAqKXBwdHI7Ci0gICAgVENIRUNLKCpsbXBfY29tX2hlYWRlcik7Ci0KLSAgICAvKgotICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIGlmIChMTVBfRVhUUkFDVF9WRVJTSU9OKGxtcF9jb21faGVhZGVyLT52ZXJzaW9uX3Jlc1swXSkgIT0gTE1QX1ZFUlNJT04pIHsKLQlwcmludGYoIkxNUCB2ZXJzaW9uICV1IHBhY2tldCBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgIExNUF9FWFRSQUNUX1ZFUlNJT04obG1wX2NvbV9oZWFkZXItPnZlcnNpb25fcmVzWzBdKSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGluIG5vbi12ZXJib3NlIG1vZGUganVzdCBsZXRzIHByaW50IHRoZSBiYXNpYyBNZXNzYWdlIFR5cGUqLwotICAgIGlmICh2ZmxhZyA8IDEpIHsKLSAgICAgICAgcHJpbnRmKCJMTVB2JXUgJXMgTWVzc2FnZSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICBMTVBfRVhUUkFDVF9WRVJTSU9OKGxtcF9jb21faGVhZGVyLT52ZXJzaW9uX3Jlc1swXSksCi0gICAgICAgICAgICAgICB0b2syc3RyKGxtcF9tc2dfdHlwZV92YWx1ZXMsICJ1bmtub3duICgldSkiLGxtcF9jb21faGVhZGVyLT5tc2dfdHlwZSksCi0gICAgICAgICAgICAgICBsZW4pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogb2sgdGhleSBzZWVtIHRvIHdhbnQgdG8ga25vdyBldmVyeXRoaW5nIC0gbGV0cyBmdWxseSBkZWNvZGUgaXQgKi8KLQotICAgIHRsZW49RVhUUkFDVF8xNkJJVFMobG1wX2NvbV9oZWFkZXItPmxlbmd0aCk7Ci0KLSAgICBwcmludGYoIlxuXHRMTVB2JXUsIG1zZy10eXBlOiAlcywgRmxhZ3M6IFslc10sIGxlbmd0aDogJXUiLAotICAgICAgICAgICBMTVBfRVhUUkFDVF9WRVJTSU9OKGxtcF9jb21faGVhZGVyLT52ZXJzaW9uX3Jlc1swXSksCi0gICAgICAgICAgIHRvazJzdHIobG1wX21zZ190eXBlX3ZhbHVlcywgInVua25vd24sIHR5cGU6ICV1IixsbXBfY29tX2hlYWRlci0+bXNnX3R5cGUpLAotICAgICAgICAgICBiaXR0b2syc3RyKGxtcF9oZWFkZXJfZmxhZ192YWx1ZXMsIm5vbmUiLGxtcF9jb21faGVhZGVyLT5mbGFncyksCi0gICAgICAgICAgIHRsZW4pOwotCi0gICAgdHB0cis9c2l6ZW9mKGNvbnN0IHN0cnVjdCBsbXBfY29tbW9uX2hlYWRlcik7Ci0gICAgdGxlbi09c2l6ZW9mKGNvbnN0IHN0cnVjdCBsbXBfY29tbW9uX2hlYWRlcik7Ci0KLSAgICB3aGlsZSh0bGVuPjApIHsKLSAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgb2JqZWN0IGhlYWRlciA/ICovCi0gICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IGxtcF9vYmplY3RfaGVhZGVyKSkpCi0gICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgIGxtcF9vYmpfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlciAqKXRwdHI7Ci0gICAgICAgIGxtcF9vYmpfbGVuPUVYVFJBQ1RfMTZCSVRTKGxtcF9vYmpfaGVhZGVyLT5sZW5ndGgpOwotICAgICAgICBsbXBfb2JqX2N0eXBlPShsbXBfb2JqX2hlYWRlci0+Y3R5cGUpJjB4N2Y7Ci0KLSAgICAgICAgaWYobG1wX29ial9sZW4gJSA0IHx8IGxtcF9vYmpfbGVuIDwgNCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBwcmludGYoIlxuXHQgICVzIE9iamVjdCAoJXUpLCBDbGFzcy1UeXBlOiAlcyAoJXUpIEZsYWdzOiBbJXNuZWdvdGlhYmxlXSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGxtcF9vYmpfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgIGxtcF9vYmpfaGVhZGVyLT5jbGFzc19udW0pLAotICAgICAgICAgICAgICAgbG1wX29ial9oZWFkZXItPmNsYXNzX251bSwKLSAgICAgICAgICAgICAgIHRvazJzdHIobG1wX2N0eXBlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICAoKGxtcF9vYmpfaGVhZGVyLT5jbGFzc19udW0pPDw4KStsbXBfb2JqX2N0eXBlKSwKLSAgICAgICAgICAgICAgIGxtcF9vYmpfY3R5cGUsCi0gICAgICAgICAgICAgICAobG1wX29ial9oZWFkZXItPmN0eXBlKSYweDgwID8gIiIgOiAibm9uLSIsCi0gICAgICAgICAgICAgICBsbXBfb2JqX2xlbik7Ci0KLSAgICAgICAgb2JqX3RwdHI9dHB0citzaXplb2Yoc3RydWN0IGxtcF9vYmplY3RfaGVhZGVyKTsKLSAgICAgICAgb2JqX3RsZW49bG1wX29ial9sZW4tc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcik7Ci0KLSAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgb2JqZWN0ID8gKi8KLSAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIGxtcF9vYmpfbGVuKSkKLSAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgIGhleGR1bXA9RkFMU0U7Ci0KLSAgICAgICAgc3dpdGNoKGxtcF9vYmpfaGVhZGVyLT5jbGFzc19udW0pIHsKLQotICAgICAgICBjYXNlIExNUF9PQkpfQ0NfSUQ6Ci0gICAgICAgICAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfTE9DOgotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfUk1UOgotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBDb250cm9sIENoYW5uZWwgSUQ6ICV1ICgweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTE1QX09CSl9MSU5LX0lEOgotICAgICAgICBjYXNlIExNUF9PQkpfSU5URVJGQUNFX0lEOgotICAgICAgICAgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX0lQVjRfTE9DOgotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNF9STVQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIElQdjQgTGluayBJRDogJXMgKDB4JTA4eCkiLAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBJTkVUNgotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNl9MT0M6Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9JUFY2X1JNVDoKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgSVB2NiBMaW5rIElEOiAlcyAoMHglMDh4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfVU5NRF9MT0M6Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9VTk1EX1JNVDoKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgTGluayBJRDogJXUgKDB4JTA4eCkiLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTE1QX09CSl9NRVNTQUdFX0lEOgotICAgICAgICAgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFXzE6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIE1lc3NhZ2UgSUQ6ICV1ICgweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfMjoKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgTWVzc2FnZSBJRCBBY2s6ICV1ICgweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIExNUF9PQkpfTk9ERV9JRDoKLSAgICAgICAgICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9MT0M6Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9STVQ6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIE5vZGUgSUQ6ICVzICgweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMTVBfT0JKX0NPTkZJRzoKLSAgICAgICAgICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV9IRUxMT19DT05GSUc6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEhlbGxvIEludGVydmFsOiAldVxuXHQgICAgSGVsbG8gRGVhZCBJbnRlcnZhbDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQkKLSAgICAgICAgY2FzZSBMTVBfT0JKX0hFTExPOgotICAgICAgICAgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKLQkgICAgY2FzZSBMTVBfQ1RZUEVfSEVMTE86Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFR4U2VxTnVtOiAldVxuXHQgICAgUmN2U2VxTnVtOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOyAgICAgIAotCSAgICAKLSAgICAgICAgY2FzZSBMTVBfT0JKX1RFX0xJTks6Ci0JCXByaW50ZigiXG5cdCAgICBGbGFnczogWyVzXSIsCi0JCWJpdHRvazJzdHIobG1wX29ial90ZV9saW5rX2ZsYWdfdmFsdWVzLAotCQkJIm5vbmUiLAotCQkJRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpPj44KSk7Ci0gICAgICAgICAgICAKLQkgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKLQkgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNDoKLQkJcHJpbnRmKCJcblx0ICAgIExvY2FsIExpbmstSUQ6ICVzICgweCUwOHgpIFwKLQkJCVxuXHQgICAgUmVtb3RlIExpbmstSUQ6ICVzICgweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cis0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrOCksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzgpKTsKLQkJYnJlYWs7Ci0JCQotI2lmZGVmIElORVQ2Ci0JICAgIGNhc2UgTE1QX0NUWVBFX0lQVjY6Ci0jZW5kaWYKLQkgICAgY2FzZSBMTVBfQ1RZUEVfVU5NRDoKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0JCi0gICAgICAgIGNhc2UgTE1QX09CSl9EQVRBX0xJTks6Ci0JCXByaW50ZigiXG5cdCAgICBGbGFnczogWyVzXSIsCi0JCWJpdHRvazJzdHIobG1wX29ial9kYXRhX2xpbmtfZmxhZ192YWx1ZXMsCi0JCQkibm9uZSIsCi0JCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0cik+PjgpKTsKLSAgICAgICAgICAgIAotCSAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgewotCSAgICBjYXNlIExNUF9DVFlQRV9JUFY0OgotCSAgICBjYXNlIExNUF9DVFlQRV9VTk1EOgotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBMb2NhbCBJbnRlcmZhY2UgSUQ6ICVzICgweCUwOHgpIFwKLQkJCVxuXHQgICAgUmVtb3RlIEludGVyZmFjZSBJRDogJXMgKDB4JTA4eCkiLAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKzQpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cis4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrOCkpOwotCQkKLQkJdG90YWxfc3Vib2JqX2xlbiA9IGxtcF9vYmpfbGVuIC0gMTY7CSAKLQkJb2Zmc2V0ID0gMTI7Ci0JCXdoaWxlICh0b3RhbF9zdWJvYmpfbGVuID4gMCAmJiBoZXhkdW1wID09IEZBTFNFICkgewotCQkJc3Vib2JqX3R5cGUgPSBFWFRSQUNUXzE2QklUUyhvYmpfdHB0citvZmZzZXQpPj44OwotCQkJc3Vib2JqX2xlbiAgPSBFWFRSQUNUXzE2QklUUyhvYmpfdHB0citvZmZzZXQpJjB4MDBGRjsKLQkJCXByaW50ZigiXG5cdCAgICBTdWJvYmplY3QsIFR5cGU6ICVzICgldSksIExlbmd0aDogJXUiLAotCQkJCXRvazJzdHIobG1wX2RhdGFfbGlua19zdWJvYmosCi0JCQkJCSJVbmtub3duIiwKLQkJCQkJc3Vib2JqX3R5cGUpLAotCQkJCQlzdWJvYmpfdHlwZSwKLQkJCQkJc3Vib2JqX2xlbik7Ci0JCQlzd2l0Y2goc3Vib2JqX3R5cGUpIHsKLQkJCWNhc2UgSU5UX1NXSVRDSElOR19UWVBFX1NVQk9CSjoKLQkJCQlwcmludGYoIlxuXHQgICAgICBTd2l0Y2hpbmcgVHlwZTogJXMgKCV1KSIsCi0JCQkJCXRvazJzdHIoZ21wbHNfc3dpdGNoX2NhcF92YWx1ZXMsIAotCQkJCQkJIlVua25vd24iLCAKLQkJCQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyK29mZnNldCsyKT4+OCksCi0JCQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyK29mZnNldCsyKT4+OCk7Ci0JCQkJcHJpbnRmKCJcblx0ICAgICAgRW5jb2RpbmcgVHlwZTogJXMgKCV1KSIsCi0JCQkJCXRvazJzdHIoZ21wbHNfZW5jb2RpbmdfdmFsdWVzLCAKLQkJCQkJCSJVbmtub3duIiwgCi0JCQkJCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0citvZmZzZXQrMikmMHgwMEZGKSwKLQkJCQkJRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrb2Zmc2V0KzIpJjB4MDBGRik7Ci0JCQkJYncuaSA9IEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs0KTsKLQkJCQlwcmludGYoIlxuXHQgICAgICBNaW4gUmVzZXJ2YWJsZSBCYW5kd2lkdGg6ICUuM2YgTWJwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCk7Ci0JCQkJYncuaSA9IEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs4KTsKLQkJCQlwcmludGYoIlxuXHQgICAgICBNYXggUmVzZXJ2YWJsZSBCYW5kd2lkdGg6ICUuM2YgTWJwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5mKjgvMTAwMDAwMCk7Ci0JCQkJYnJlYWs7CQotCQkJY2FzZSBXQVZFTEVOR1RIX1NVQk9CSjoKLQkJCQlwcmludGYoIlxuXHQgICAgICBXYXZlbGVuZ3RoOiAldSIsCi0JCQkJCUVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs0KSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCS8qIEFueSBVbmtub3duIFN1Ym9iamVjdCA9PT4gRXhpdCBsb29wICovCi0JCQkJaGV4ZHVtcD1UUlVFOwotCQkJCWJyZWFrOwotCQkJfQotCQkJdG90YWxfc3Vib2JqX2xlbi09c3Vib2JqX2xlbjsKLQkJCW9mZnNldCs9c3Vib2JqX2xlbjsKLQkJfQotCQkKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYgICAKLQkgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNjoKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsgICAgICAKLQkgICAgCi0gICAgICAgIGNhc2UgTE1QX09CSl9WRVJJRllfQkVHSU46Ci0JICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV8xOgotCQlwcmludGYoIlxuXHQgICAgRmxhZ3M6ICVzIiwKLQkJYml0dG9rMnN0cihsbXBfb2JqX2JlZ2luX3ZlcmlmeV9mbGFnX3ZhbHVlcywKLQkJCSJub25lIiwKLQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKSkpOwotCQlwcmludGYoIlxuXHQgICAgVmVyaWZ5IEludGVydmFsOiAldSIsCi0JCQlFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSk7Ci0JCXByaW50ZigiXG5cdCAgICBEYXRhIGxpbmtzOiAldSIsCi0JCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEVuY29kaW5nIHR5cGU6ICVzIiwKLQkJCXRvazJzdHIoZ21wbHNfZW5jb2RpbmdfdmFsdWVzLCAiVW5rbm93biIsICoob2JqX3RwdHIrOCkpKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgVmVyaWZ5IFRyYW5wb3J0IE1lY2hhbmlzbTogJXUgKDB4JXgpICVzIiwKLQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzEwKSwKLQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzEwKSwKLQkJCUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzEwKSY4MDAwID8gIihQYXlsb2FkIHRlc3QgbWVzc2FnZXMgY2FwYWJsZSkiIDogIiIpOwotICAgICAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cisxMik7Ci0JCXByaW50ZigiXG5cdCAgICBUcmFuc21pc3Npb24gUmF0ZTogJS4zZiBNYnBzIixidy5mKjgvMTAwMDAwMCk7Ci0JCXByaW50ZigiXG5cdCAgICBXYXZlbGVuZ3RoOiAldSIsCi0JCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0cisxNikpOwotCQlicmVhazsKLQkJCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOyAgICAgIAotCQotICAgICAgICBjYXNlIExNUF9PQkpfVkVSSUZZX0JFR0lOX0FDSzoKLQkgICAgc3dpdGNoKGxtcF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFXzE6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFZlcmlmeSBEZWFkIEludGVydmFsOiAldSAJXAotCQkJXG5cdCAgICBWZXJpZnkgVHJhbnNwb3J0IFJlc3BvbnNlOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCQkKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7ICAgICAgCi0gICAgICAgIAotCWNhc2UgTE1QX09CSl9WRVJJRllfSUQ6Ci0JICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIExNUF9DVFlQRV8xOgotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBWZXJpZnkgSUQ6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQkJCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOyAgICAgIAotICAgICAgICAKLQljYXNlIExNUF9PQkpfQ0hBTk5FTF9TVEFUVVM6Ci0gICAgICAgICAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgewotCSAgICBjYXNlIExNUF9DVFlQRV9JUFY0OgotCSAgICBjYXNlIExNUF9DVFlQRV9VTk1EOgotCQlvZmZzZXQgPSAwOwotCQkvKiBEZWNvZGUgcGFpcnM6IDxJbnRlcmZhY2VfSUQgKDQgYnl0ZXMpLCBDaGFubmVsX3N0YXR1cyAoNCBieXRlcyk+ICovCi0JCXdoaWxlIChvZmZzZXQgPCAobG1wX29ial9sZW4tKGludClzaXplb2Yoc3RydWN0IGxtcF9vYmplY3RfaGVhZGVyKSkgKSB7Ci0JCQlwcmludGYoIlxuXHQgICAgSW50ZXJmYWNlIElEOiAlcyAoMHglMDh4KSIsCi0JCQlpcGFkZHJfc3RyaW5nKG9ial90cHRyK29mZnNldCksCi0JCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQpKTsKLQkJCQotCQkJcHJpbnRmKCJcblx0XHQgICAgQWN0aXZlOiAlcyAoJXUpIiwgCQkoRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrb2Zmc2V0KzQpPj4zMSkgPyAKLQkJCQkJCSJBbGxvY2F0ZWQiIDogIk5vbi1hbGxvY2F0ZWQiLAotCQkJCShFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrNCk+PjMxKSk7Ci0JCQkKLQkJCXByaW50ZigiXG5cdFx0ICAgIERpcmVjdGlvbjogJXMgKCV1KSIsIChFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQrNCk+PjMwKSYweDEgPyAKLQkJCQkJCSJUcmFuc21pdCIgOiAiUmVjZWl2ZSIsCi0JCQkJKEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs0KT4+MzApJjB4MSk7CQotCQkJCQkJCi0JCQlwcmludGYoIlxuXHRcdCAgICBDaGFubmVsIFN0YXR1czogJXMgKCV1KSIsCi0JCQkJCXRvazJzdHIobG1wX29ial9jaGFubmVsX3N0YXR1c192YWx1ZXMsCi0JCQkgCQkiVW5rbm93biIsCi0JCQkJCUVYVFJBQ1RfMzJCSVRTKG9ial90cHRyK29mZnNldCs0KSYweDNGRkZGRkYpLAotCQkJRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrb2Zmc2V0KzQpJjB4M0ZGRkZGRik7Ci0JCQlvZmZzZXQrPTg7Ci0JCX0KLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBJTkVUNiAgICAgICAKLQkgICAgY2FzZSBMTVBfQ1RZUEVfSVBWNjoKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsgICAgICAKLSAgICAgICAgCi0JY2FzZSBMTVBfT0JKX0NIQU5ORUxfU1RBVFVTX1JFUToKLSAgICAgICAgICAgIHN3aXRjaChsbXBfb2JqX2N0eXBlKSB7Ci0JICAgIGNhc2UgTE1QX0NUWVBFX0lQVjQ6Ci0JICAgIGNhc2UgTE1QX0NUWVBFX1VOTUQ6Ci0JCW9mZnNldCA9IDA7Ci0JCXdoaWxlIChvZmZzZXQgPCAobG1wX29ial9sZW4tKGludClzaXplb2Yoc3RydWN0IGxtcF9vYmplY3RfaGVhZGVyKSkgKSB7Ci0JCQlwcmludGYoIlxuXHQgICAgSW50ZXJmYWNlIElEOiAlcyAoMHglMDh4KSIsCi0JCQlpcGFkZHJfc3RyaW5nKG9ial90cHRyK29mZnNldCksCi0JCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0citvZmZzZXQpKTsKLQkJCW9mZnNldCs9NDsKLQkJfQotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2ICAgICAgIAotCSAgICBjYXNlIExNUF9DVFlQRV9JUFY2OgotI2VuZGlmCi0JICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7ICAgICAgCi0JCi0gICAgICAgIGNhc2UgTE1QX09CSl9FUlJPUl9DT0RFOgotCSAgICBzd2l0Y2gobG1wX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfQkVHSU5fVkVSSUZZX0VSUk9SOgotCQlwcmludGYoIlxuXHQgICAgRXJyb3IgQ29kZTogJXMiLAotCQliaXR0b2syc3RyKGxtcF9vYmpfYmVnaW5fdmVyaWZ5X2Vycm9yX3ZhbHVlcywKLQkJCSJub25lIiwKLQkJCUVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCQkKLSAgICAgICAgICAgIGNhc2UgTE1QX0NUWVBFX0xJTktfU1VNTUFSWV9FUlJPUjoKLQkJcHJpbnRmKCJcblx0ICAgIEVycm9yIENvZGU6ICVzIiwKLQkJYml0dG9rMnN0cihsbXBfb2JqX2xpbmtfc3VtbWFyeV9lcnJvcl92YWx1ZXMsCi0JCQkibm9uZSIsCi0JCQlFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7ICAgICAgCi0KLQljYXNlIExNUF9PQkpfU0VSVklDRV9DT05GSUc6Ci0JICAgIHN3aXRjaCAobG1wX29ial9jdHlwZSkgewotCSAgICBjYXNlIExNUF9DVFlQRV9TRVJWSUNFX0NPTkZJR19TUDoKLQkJCi0JCXByaW50ZigiXG5cdCBGbGFnczogJXMiLAotCQkgICAgICAgYml0dG9rMnN0cihsbXBfb2JqX3NlcnZpY2VfY29uZmlnX3NwX2ZsYWdfdmFsdWVzLAotCQkJCSAgIm5vbmUiLCAKLQkJCQkgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKT4+OCkpOwotCi0JCXByaW50ZigiXG5cdCAgVU5JIFZlcnNpb246ICV1IiwKLQkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKSAmIDB4MDBGRik7Ci0KLQkJYnJlYWs7Ci0JCQotICAgICAgICAgICAgY2FzZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfQ1BTQToKLQkJCi0JCWxpbmtfdHlwZSA9IEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKT4+ODsKLQkJCi0JCXByaW50ZigiXG5cdCBMaW5rIFR5cGU6ICVzICgldSkiLAotCQkgICAgICAgdG9rMnN0cihsbXBfc2Rfc2VydmljZV9jb25maWdfY3BzYV9saW5rX3R5cGVfdmFsdWVzLAotCQkJICAgICAgICJVbmtub3duIiwgbGlua190eXBlKSwKLQkJICAgICAgIGxpbmtfdHlwZSk7Ci0JCQotCQlpZiAobGlua190eXBlID09IExNUF9TRF9TRVJWSUNFX0NPTkZJR19DUFNBX0xJTktfVFlQRV9TREgpIHsKLQkJICAgIHByaW50ZigiXG5cdCBTaWduYWwgVHlwZTogJXMgKCV1KSIsCi0JCQkgICB0b2syc3RyKGxtcF9zZF9zZXJ2aWNlX2NvbmZpZ19jcHNhX3NpZ25hbF90eXBlX3NkaF92YWx1ZXMsCi0JCQkJICAgIlVua25vd24iLAotCQkJCSAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKSAmIDB4MDBGRiksCi0JCQkgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cikgJiAweDAwRkYpOwotCQl9Ci0JCQotCQlpZiAobGlua190eXBlID09IExNUF9TRF9TRVJWSUNFX0NPTkZJR19DUFNBX0xJTktfVFlQRV9TT05FVCkgewotCQkgICAgcHJpbnRmKCJcblx0IFNpZ25hbCBUeXBlOiAlcyAoJXUpIiwKLQkJCSAgIHRvazJzdHIobG1wX3NkX3NlcnZpY2VfY29uZmlnX2Nwc2Ffc2lnbmFsX3R5cGVfc29uZXRfdmFsdWVzLAotCQkJCSAgICJVbmtub3duIiwKLQkJCQkgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cikgJiAweDAwRkYpLAotCQkJICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpICYgMHgwMEZGKTsKLQkJfQotCQkKLQkJcHJpbnRmKCJcblx0IFRyYW5zcGFyZW5jeTogJXMiLAotCQkgICAgICAgYml0dG9rMnN0cihsbXBfb2JqX3NlcnZpY2VfY29uZmlnX2Nwc2FfdHBfZmxhZ192YWx1ZXMsCi0JCQkJICAibm9uZSIsCi0JCQkJICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKT4+OCkpOwotCQkKLQkJcHJpbnRmKCJcblx0IENvbnRpZ3VvdXMgQ29uY2F0ZW5hdGlvbiBUeXBlczogJXMiLAotCQkgICAgICAgYml0dG9rMnN0cihsbXBfb2JqX3NlcnZpY2VfY29uZmlnX2Nwc2FfY2N0X2ZsYWdfdmFsdWVzLAotCQkJCSAgIm5vbmUiLAotCQkJCSAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMik+PjggJiAweDAwRkYpKTsKLQkJCi0JCXByaW50ZigiXG5cdCBNaW5pbXVtIE5DQzogJXUiLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNCkpOwotCQkKLQkJcHJpbnRmKCJcblx0IE1heGltdW0gTkNDOiAldSIsCi0JCSAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cis2KSk7Ci0JCQotCQlwcmludGYoIlxuXHQgTWluaW11bSBOVkM6JXUiLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrOCkpOwotCQkKLQkJcHJpbnRmKCJcblx0IE1heGltdW0gTlZDOiV1IiwKLQkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzEwKSk7Ci0JCQotCQlwcmludGYoIlxuXHQgICAgTG9jYWwgSW50ZXJmYWNlIElEOiAlcyAoMHglMDh4KSIsCi0JCSAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKzEyKSwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzEyKSk7Ci0JCQotCQlicmVhazsKLQkJCi0JICAgIGNhc2UgTE1QX0NUWVBFX1NFUlZJQ0VfQ09ORklHX1RSQU5TUEFSRU5DWV9UQ006Ci0JCQotCQlwcmludGYoIlxuXHQgVHJhbnNwYXJlbmN5IEZsYWdzOiAlcyIsCi0JCSAgICAgICBiaXR0b2syc3RyKAotCQkJICAgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19uc2FfdHJhbnNwYXJlbmN5X2ZsYWdfdmFsdWVzLAotCQkJICAgIm5vbmUiLAotCQkJICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKSk7Ci0KLQkJcHJpbnRmKCJcblx0IFRDTSBNb25pdG9yaW5nIEZsYWdzOiAlcyIsCi0JCSAgICAgICBiaXR0b2syc3RyKAotCQkJICAgbG1wX29ial9zZXJ2aWNlX2NvbmZpZ19uc2FfdGNtX2ZsYWdfdmFsdWVzLAotCQkJICAgIm5vbmUiLAotCQkJICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikgJiAweDAwRkYpKTsKLQkJCi0JCWJyZWFrOwotCQkKLQkgICAgY2FzZSBMTVBfQ1RZUEVfU0VSVklDRV9DT05GSUdfTkVUV09SS19ESVZFUlNJVFk6Ci0JCQotCQlwcmludGYoIlxuXHQgRGl2ZXJzaXR5OiBGbGFnczogJXMiLAotCQkgICAgICAgYml0dG9rMnN0cigKLQkJCSAgIGxtcF9vYmpfc2VydmljZV9jb25maWdfbnNhX25ldHdvcmtfZGl2ZXJzaXR5X2ZsYWdfdmFsdWVzLAotCQkJICAgIm5vbmUiLAotCQkJICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikgJiAweDAwRkYpKTsKLQkJYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkJaGV4ZHVtcCA9IFRSVUU7Ci0JICAgIH07Ci0KLQlicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKHZmbGFnIDw9IDEpCi0gICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKG9ial90cHRyLCJcblx0ICAgICIsb2JqX3RsZW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLwotICAgICAgICBpZiAodmZsYWcgPiAxIHx8IGhleGR1bXA9PVRSVUUpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcikpLCJcblx0ICAgICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG1wX29ial9sZW4tc2l6ZW9mKHN0cnVjdCBsbXBfb2JqZWN0X2hlYWRlcikpOwotCi0gICAgICAgIHRwdHIrPWxtcF9vYmpfbGVuOwotICAgICAgICB0bGVuLT1sbXBfb2JqX2xlbjsKLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Ci19CmRpZmYgLS1naXQgYS9wcmludC1sc3BwaW5nLmMgYi9wcmludC1sc3BwaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MGNkYzYuLjAwMDAwMDAKLS0tIGEvcHJpbnQtbHNwcGluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsODY3ICswLDAgQEAKLS8qCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LWxzcHBpbmcuYyx2IDEuMTIuMi42IDIwMDYvMDYvMjMgMDI6MDc6MjcgaGFubmVzIEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLSNpbmNsdWRlICJiZ3AuaCIKLSNpbmNsdWRlICJsMnZwbi5oIgotCi0vKgotICogTFNQUElORyBjb21tb24gaGVhZGVyCi0gKgotICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgVmVyc2lvbiBOdW1iZXIgICAgICAgIHwgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgIE1lc3NhZ2UgVHlwZSB8ICAgUmVwbHkgbW9kZSAgfCAgUmV0dXJuIENvZGUgIHwgUmV0dXJuIFN1YmNvZGV8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgIFNlbmRlcidzIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgIFRpbWVTdGFtcCBTZW50IChzZWNvbmRzKSAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgIFRpbWVTdGFtcCBTZW50IChtaWNyb3NlY29uZHMpICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgVGltZVN0YW1wIFJlY2VpdmVkIChzZWNvbmRzKSAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgVGltZVN0YW1wIFJlY2VpdmVkIChtaWNyb3NlY29uZHMpICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTFZzIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAqLwotCi1zdHJ1Y3QgbHNwcGluZ19jb21tb25faGVhZGVyIHsKLSAgICB1X2ludDhfdCB2ZXJzaW9uWzJdOwotICAgIHVfaW50OF90IHJlc2VydmVkWzJdOwotICAgIHVfaW50OF90IG1zZ190eXBlOwotICAgIHVfaW50OF90IHJlcGx5X21vZGU7ICAgCi0gICAgdV9pbnQ4X3QgcmV0dXJuX2NvZGU7ICAgCi0gICAgdV9pbnQ4X3QgcmV0dXJuX3N1YmNvZGU7ICAgCi0gICAgdV9pbnQ4X3Qgc2VuZGVyX2hhbmRsZVs0XTsKLSAgICB1X2ludDhfdCBzZXFfbnVtYmVyWzRdOwotICAgIHVfaW50OF90IHRzX3NlbnRfc2VjWzRdOwotICAgIHVfaW50OF90IHRzX3NlbnRfdXNlY1s0XTsKLSAgICB1X2ludDhfdCB0c19yY3ZkX3NlY1s0XTsKLSAgICB1X2ludDhfdCB0c19yY3ZkX3VzZWNbNF07Ci19OwotCi0jZGVmaW5lIExTUFBJTkdfVkVSU0lPTiAgICAgICAgICAgIDEKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbHNwcGluZ19tc2dfdHlwZV92YWx1ZXNbXSA9IHsKLSAgICB7IDEsICJNUExTIEVjaG8gUmVxdWVzdCJ9LAotICAgIHsgMiwgIk1QTFMgRWNobyBSZXBseSJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxzcHBpbmdfcmVwbHlfbW9kZV92YWx1ZXNbXSA9IHsKLSAgICB7IDEsICJEbyBub3QgcmVwbHkifSwKLSAgICB7IDIsICJSZXBseSB2aWEgYW4gSVB2NC9JUHY2IFVEUCBwYWNrZXQifSwKLSAgICB7IDMsICJSZXBseSB2aWEgYW4gSVB2NC9JUHY2IFVEUCBwYWNrZXQgd2l0aCBSb3V0ZXIgQWxlcnQifSwKLSAgICB7IDQsICJSZXBseSB2aWEgYXBwbGljYXRpb24gbGV2ZWwgY29udHJvbCBjaGFubmVsIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbHNwcGluZ19yZXR1cm5fY29kZV92YWx1ZXNbXSA9IHsKLSAgICB7ICAwLCAiTm8gcmV0dXJuIGNvZGUgb3IgcmV0dXJuIGNvZGUgY29udGFpbmVkIGluIHRoZSBFcnJvciBDb2RlIFRMViJ9LAotICAgIHsgIDEsICJNYWxmb3JtZWQgZWNobyByZXF1ZXN0IHJlY2VpdmVkIn0sCi0gICAgeyAgMiwgIk9uZSBvciBtb3JlIG9mIHRoZSBUTFZzIHdhcyBub3QgdW5kZXJzdG9vZCJ9LAotICAgIHsgIDMsICJSZXBseWluZyByb3V0ZXIgaXMgYW4gZWdyZXNzIGZvciB0aGUgRkVDIGF0IHN0YWNrIGRlcHRoIn0sCi0gICAgeyAgNCwgIlJlcGx5aW5nIHJvdXRlciBoYXMgbm8gbWFwcGluZyBmb3IgdGhlIEZFQyBhdCBzdGFjayBkZXB0aCJ9LAotICAgIHsgIDUsICJSZXNlcnZlZCJ9LAotICAgIHsgIDYsICJSZXNlcnZlZCJ9LAotICAgIHsgIDcsICJSZXNlcnZlZCJ9LAotICAgIHsgIDgsICJMYWJlbCBzd2l0Y2hlZCBhdCBzdGFjay1kZXB0aCJ9LAotICAgIHsgIDksICJMYWJlbCBzd2l0Y2hlZCBidXQgbm8gTVBMUyBmb3J3YXJkaW5nIGF0IHN0YWNrLWRlcHRoIn0sCi0gICAgeyAxMCwgIk1hcHBpbmcgZm9yIHRoaXMgRkVDIGlzIG5vdCB0aGUgZ2l2ZW4gbGFiZWwgYXQgc3RhY2sgZGVwdGgifSwKLSAgICB7IDExLCAiTm8gbGFiZWwgZW50cnkgYXQgc3RhY2stZGVwdGgifSwKLSAgICB7IDEyLCAiUHJvdG9jb2wgbm90IGFzc29jaWF0ZWQgd2l0aCBpbnRlcmZhY2UgYXQgRkVDIHN0YWNrIGRlcHRoIn0sCi19OwotCi0KLS8qIAotICogTFNQUElORyBUTFYgaGVhZGVyCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgfCAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICovCi0KLXN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIgewotICAgIHVfaW50OF90IHR5cGVbMl07Ci0gICAgdV9pbnQ4X3QgbGVuZ3RoWzJdOwotfTsKLQotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRfRkVDX1NUQUNLICAgICAgMQotI2RlZmluZQlMU1BQSU5HX1RMVl9ET1dOU1RSRUFNX01BUFBJTkcgICAgMgotI2RlZmluZQlMU1BQSU5HX1RMVl9QQUQgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZQlMU1BQSU5HX1RMVl9FUlJPUl9DT0RFICAgICAgICAgICAgNAotI2RlZmluZQlMU1BQSU5HX1RMVl9CRkRfRElTQ1JJTUlOQVRPUiAgICAgMTUgLyogZHJhZnQtaWV0Zi1iZmQtbXBscy0wMiAqLwotI2RlZmluZSBMU1BQSU5HX1RMVl9CRkRfRElTQ1JJTUlOQVRPUl9MRU4gNAotI2RlZmluZQlMU1BQSU5HX1RMVl9WRU5ET1JfUFJJVkFURSAgICAgICAgMHhmYzAwCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxzcHBpbmdfdGx2X3ZhbHVlc1tdID0gewotICAgIHsgTFNQUElOR19UTFZfVEFSR0VUX0ZFQ19TVEFDSywgIlRhcmdldCBGRUMgU3RhY2siIH0sCi0gICAgeyBMU1BQSU5HX1RMVl9ET1dOU1RSRUFNX01BUFBJTkcsICJEb3duc3RyZWFtIE1hcHBpbmciIH0sCi0gICAgeyBMU1BQSU5HX1RMVl9QQUQsICJQYWQiIH0sCi0gICAgeyBMU1BQSU5HX1RMVl9FUlJPUl9DT0RFLCAiRXJyb3IgQ29kZSIgfSwKLSAgICB7IExTUFBJTkdfVExWX0JGRF9ESVNDUklNSU5BVE9SLCAiQkZEIERpc2NyaW1pbmF0b3IiIH0sCi0gICAgeyBMU1BQSU5HX1RMVl9WRU5ET1JfUFJJVkFURSwgIlZlbmRvciBFbnRlcnByaXNlIENvZGUiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0xEUF9JUFY0ICAgICAgMQotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0xEUF9JUFY2ICAgICAgMgotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX1JTVlBfSVBWNCAgICAgMwotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX1JTVlBfSVBWNiAgICAgNAotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjQgICAgNgotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjYgICAgNwotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wyVlBOX0VORFBUICAgOAotI2RlZmluZQlMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wyVlBOX1ZDSURfT0xEIDkKLSNkZWZpbmUJTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEICAgMTAKLSNkZWZpbmUJTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9CR1BfSVBWNCAgICAgMTEKLSNkZWZpbmUJTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9CR1BfSVBWNiAgICAgMTIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgbHNwcGluZ190bHZ0YXJnZXRmZWNfc3VidGx2X3ZhbHVlc1tdID0gewotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MRFBfSVBWNCwgIkxEUCBJUHY0IHByZWZpeCJ9LAotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MRFBfSVBWNiwgIkxEUCBJUHY2IHByZWZpeCJ9LAotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjQsICJSU1ZQIElQdjQgU2Vzc2lvbiBRdWVyeSJ9LAotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjYsICJSU1ZQIElQdjYgU2Vzc2lvbiBRdWVyeSJ9LAotICAgIHsgNSwgIlJlc2VydmVkIn0sCi0gICAgeyBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjQsICJWUE4gSVB2NCBwcmVmaXgifSwKLSAgICB7IExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfTDNWUE5fSVBWNiwgIlZQTiBJUHY2IHByZWZpeCJ9LAotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9FTkRQVCwgIkwyIFZQTiBlbmRwb2ludCJ9LAotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEX09MRCwgIkwyIGNpcmN1aXQgSUQgKG9sZCkifSwKLSAgICB7IExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfTDJWUE5fVkNJRCwgIkwyIGNpcmN1aXQgSUQifSwKLSAgICB7IExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfQkdQX0lQVjQsICJCR1AgbGFiZWxlZCBJUHY0IHByZWZpeCJ9LAotICAgIHsgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9CR1BfSVBWNiwgIkJHUCBsYWJlbGVkIElQdjYgcHJlZml4In0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotLyoKLSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NCBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8IFByZWZpeCBMZW5ndGggfCAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjRfdCB7Ci0gICAgdV9pbnQ4X3QgcHJlZml4IFs0XTsKLSAgICB1X2ludDhfdCBwcmVmaXhfbGVuOwotfTsKLQotLyoKLSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICgxNiBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8IFByZWZpeCBMZW5ndGggfCAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjZfdCB7Ci0gICAgdV9pbnQ4X3QgcHJlZml4IFsxNl07Ci0gICAgdV9pbnQ4X3QgcHJlZml4X2xlbjsKLX07Ci0KLS8qCi0gKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICBTZW5kZXIgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NCBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCBQcmVmaXggTGVuZ3RoIHwgICAgICAgICAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY0X3QgewotICAgIHVfaW50OF90IHNlbmRlcl9pZCBbNF07Ci0gICAgdV9pbnQ4X3QgcHJlZml4IFs0XTsKLSAgICB1X2ludDhfdCBwcmVmaXhfbGVuOwotfTsKLQotLyoKLSAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgIFNlbmRlciBpZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgb2N0ZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICgxNiBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8IFByZWZpeCBMZW5ndGggfCAgICAgICAgICAgICAgICAgTXVzdCBCZSBaZXJvICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjZfdCB7Ci0gICAgdV9pbnQ4X3Qgc2VuZGVyX2lkIFsxNl07Ci0gICAgdV9pbnQ4X3QgcHJlZml4IFsxNl07Ci0gICAgdV9pbnQ4X3QgcHJlZml4X2xlbjsKLX07Ci0KLS8qCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgIElQdjQgdHVubmVsIGVuZCBwb2ludCBhZGRyZXNzICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICBUdW5uZWwgSUQgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBUdW5uZWwgSUQgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgSVB2NCB0dW5uZWwgc2VuZGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICAgICAgICAgTFNQIElEICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2NF90IHsKLSAgICB1X2ludDhfdCB0dW5uZWxfZW5kcG9pbnQgWzRdOwotICAgIHVfaW50OF90IHJlc1syXTsKLSAgICB1X2ludDhfdCB0dW5uZWxfaWRbMl07Ci0gICAgdV9pbnQ4X3QgZXh0ZW5kZWRfdHVubmVsX2lkWzRdOwotICAgIHVfaW50OF90IHR1bm5lbF9zZW5kZXIgWzRdOwotICAgIHVfaW50OF90IHJlczJbMl07Ci0gICAgdV9pbnQ4X3QgbHNwX2lkIFsyXTsKLX07Ci0KLS8qCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgIElQdjYgdHVubmVsIGVuZCBwb2ludCBhZGRyZXNzICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICAgICAgIFR1bm5lbCBJRCAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZCBUdW5uZWwgSUQgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgSVB2NiB0dW5uZWwgc2VuZGVyIGFkZHJlc3MgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICB8ICAgICAgICAgICAgTFNQIElEICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2Nl90IHsKLSAgICB1X2ludDhfdCB0dW5uZWxfZW5kcG9pbnQgWzE2XTsKLSAgICB1X2ludDhfdCByZXNbMl07Ci0gICAgdV9pbnQ4X3QgdHVubmVsX2lkWzJdOwotICAgIHVfaW50OF90IGV4dGVuZGVkX3R1bm5lbF9pZFsxNl07Ci0gICAgdV9pbnQ4X3QgdHVubmVsX3NlbmRlciBbMTZdOwotICAgIHVfaW50OF90IHJlczJbMl07Ci0gICAgdV9pbnQ4X3QgbHNwX2lkIFsyXTsKLX07Ci0KLS8qCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgUm91dGUgRGlzdGluZ3Vpc2hlciAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoOCBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NCBwcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCBQcmVmaXggTGVuZ3RoIHwgICAgICAgICAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjRfdCB7Ci0gICAgdV9pbnQ4X3QgcmQgWzhdOwotICAgIHVfaW50OF90IHByZWZpeCBbNF07Ci0gICAgdV9pbnQ4X3QgcHJlZml4X2xlbjsKLX07Ci0KLS8qCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgUm91dGUgRGlzdGluZ3Vpc2hlciAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoOCBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgcHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgb2N0ZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCBQcmVmaXggTGVuZ3RoIHwgICAgICAgICAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjZfdCB7Ci0gICAgdV9pbnQ4X3QgcmQgWzhdOwotICAgIHVfaW50OF90IHByZWZpeCBbMTZdOwotICAgIHVfaW50OF90IHByZWZpeF9sZW47Ci19OwotCi0vKgotICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgIFJvdXRlIERpc3Rpbmd1aXNoZXIgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgKDggb2N0ZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgU2VuZGVyJ3MgQ0UgSUQgICAgICAgIHwgICAgICAgUmVjZWl2ZXIncyBDRSBJRCAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICBFbmNhcHN1bGF0aW9uIFR5cGUgICAgICAgfCAgICAgICAgIE11c3QgQmUgWmVybyAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqLwotc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHRfdCB7Ci0gICAgdV9pbnQ4X3QgcmQgWzhdOwotICAgIHVfaW50OF90IHNlbmRlcl9jZV9pZCBbMl07Ci0gICAgdV9pbnQ4X3QgcmVjZWl2ZXJfY2VfaWQgWzJdOwotICAgIHVfaW50OF90IGVuY2Fwc3VsYXRpb25bMl07Ci19OwotCi0vKgotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFBFIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgRW5jYXBzdWxhdGlvbiBUeXBlICAgICAgIHwgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF9vbGRfdCB7Ci0gICAgdV9pbnQ4X3QgcmVtb3RlX3BlX2FkZHJlc3MgWzRdOwotICAgIHVfaW50OF90IHZjX2lkIFs0XTsKLSAgICB1X2ludDhfdCBlbmNhcHN1bGF0aW9uWzJdOwotfTsKLQotLyoKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgU2VuZGVyJ3MgUEUgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlIFBFIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkMgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgRW5jYXBzdWxhdGlvbiBUeXBlICAgICAgIHwgICAgICAgICBNdXN0IEJlIFplcm8gICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqLwotc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF90IHsKLSAgICB1X2ludDhfdCBzZW5kZXJfcGVfYWRkcmVzcyBbNF07Ci0gICAgdV9pbnQ4X3QgcmVtb3RlX3BlX2FkZHJlc3MgWzRdOwotICAgIHVfaW50OF90IHZjX2lkIFs0XTsKLSAgICB1X2ludDhfdCBlbmNhcHN1bGF0aW9uWzJdOwotfTsKLQotLyoKLSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgIE1UVSAgICAgICAgICAgICB8IEFkZHJlc3MgVHlwZSAgfCAgUmVzdmQgKFNCWikgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgIERvd25zdHJlYW0gSVAgQWRkcmVzcyAoNCBvciAxNiBvY3RldHMpICAgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICBEb3duc3RyZWFtIEludGVyZmFjZSBBZGRyZXNzICg0IG9yIDE2IG9jdGV0cykgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCBIYXNoIEtleSBUeXBlIHwgRGVwdGggTGltaXQgICB8ICAgICAgICBNdWx0aXBhdGggTGVuZ3RoICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICogLiAgICAgICAgICAgICAgICAgICAgIChNdWx0aXBhdGggSW5mb3JtYXRpb24pICAgICAgICAgICAgICAgICAgIC4KLSAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgIERvd25zdHJlYW0gTGFiZWwgICAgICAgICAgICAgICAgfCAgICBQcm90b2NvbCAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgotICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KLSAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgIERvd25zdHJlYW0gTGFiZWwgICAgICAgICAgICAgICAgfCAgICBQcm90b2NvbCAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QgewotICAgIHVfaW50OF90IG10dSBbMl07Ci0gICAgdV9pbnQ4X3QgYWRkcmVzc190eXBlOwotICAgIHVfaW50OF90IHJlczsKLSAgICB1X2ludDhfdCBkb3duc3RyZWFtX2lwWzRdOwotICAgIHVfaW50OF90IGRvd25zdHJlYW1faW50ZXJmYWNlWzRdOwotfTsKLQotc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjZfdCB7Ci0gICAgdV9pbnQ4X3QgbXR1IFsyXTsKLSAgICB1X2ludDhfdCBhZGRyZXNzX3R5cGU7Ci0gICAgdV9pbnQ4X3QgcmVzOwotICAgIHVfaW50OF90IGRvd25zdHJlYW1faXBbMTZdOwotICAgIHVfaW50OF90IGRvd25zdHJlYW1faW50ZXJmYWNlWzE2XTsKLX07Ci0KLXN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QgewotICAgIHVfaW50OF90IGhhc2hfa2V5X3R5cGU7Ci0gICAgdV9pbnQ4X3QgZGVwdGhfbGltaXQ7Ci0gICAgdV9pbnQ4X3QgbXVsdGlwYXRoX2xlbmd0aCBbMl07Ci19OwotCi0jZGVmaW5lIExTUFBJTkdfQUZJX0lQVjQgMQotI2RlZmluZSBMU1BQSU5HX0FGSV9VTk1CIDIKLSNkZWZpbmUgTFNQUElOR19BRklfSVBWNiAzCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fYWRkcl92YWx1ZXNbXSA9IHsKLSAgICB7IExTUFBJTkdfQUZJX0lQVjQsICJJUHY0In0sCi0gICAgeyBMU1BQSU5HX0FGSV9JUFY2LCAiSVB2NiJ9LAotICAgIHsgTFNQUElOR19BRklfVU5NQiwgIlVubnVtYmVyZWQifSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi12b2lkCi1sc3BwaW5nX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcHB0ciwgcmVnaXN0ZXIgdV9pbnQgbGVuKSB7Ci0KLSAgICBjb25zdCBzdHJ1Y3QgbHNwcGluZ19jb21tb25faGVhZGVyICpsc3BwaW5nX2NvbV9oZWFkZXI7Ci0gICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlciAqbHNwcGluZ190bHZfaGVhZGVyOwotICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIgKmxzcHBpbmdfc3VidGx2X2hlYWRlcjsKLSAgICBjb25zdCB1X2NoYXIgKnRwdHIsKnRsdl90cHRyLCpzdWJ0bHZfdHB0cjsKLSAgICBpbnQgdGxlbixsc3BwaW5nX3Rsdl9sZW4sbHNwcGluZ190bHZfdHlwZSx0bHZfdGxlbjsKLSAgICBpbnQgdGx2X2hleGR1bXAsc3VidGx2X2hleGR1bXA7Ci0gICAgaW50IGxzcHBpbmdfc3VidGx2X2xlbixsc3BwaW5nX3N1YnRsdl90eXBlOwotICAgIHN0cnVjdCB0aW1ldmFsIHRpbWVzdGFtcDsgCi0KLSAgICB1bmlvbiB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QgKmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjQ7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY2X3QgKmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjY7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QgICpsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvOwotICAgIH0gdGx2X3B0cjsKLQotICAgIHVuaW9uIHsKLSAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NDsKLSAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjZfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NjsKLSAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0OwotICAgICAgICBjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjZfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjY7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0OwotICAgICAgICBjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY2X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDN2cG5faXB2NjsKLSAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdDsKLSAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF9vbGRfdCAqbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX29sZDsKLSAgICAgICAgY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF90ICpsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWQ7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY0X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjQ7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2X3QgKmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjY7Ci0gICAgfSBzdWJ0bHZfcHRyOwotCi0gICAgdHB0cj1wcHRyOwotICAgIGxzcHBpbmdfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbHNwcGluZ19jb21tb25faGVhZGVyICopcHB0cjsKLSAgICBUQ0hFQ0soKmxzcHBpbmdfY29tX2hlYWRlcik7Ci0KLSAgICAvKgotICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIGlmIChFWFRSQUNUXzE2QklUUygmbHNwcGluZ19jb21faGVhZGVyLT52ZXJzaW9uWzBdKSAhPSBMU1BQSU5HX1ZFUlNJT04pIHsKLQlwcmludGYoIkxTUC1QSU5HIHZlcnNpb24gJXUgcGFja2V0IG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmxzcHBpbmdfY29tX2hlYWRlci0+dmVyc2lvblswXSkpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgbGV0cyBwcmludCB0aGUgYmFzaWMgTWVzc2FnZSBUeXBlKi8KLSAgICBpZiAodmZsYWcgPCAxKSB7Ci0gICAgICAgIHByaW50ZigiTFNQLVBJTkd2JXUsICVzLCBzZXEgJXUsIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJmxzcHBpbmdfY29tX2hlYWRlci0+dmVyc2lvblswXSksCi0gICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biAoJXUpIixsc3BwaW5nX2NvbV9oZWFkZXItPm1zZ190eXBlKSwKLSAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGxzcHBpbmdfY29tX2hlYWRlci0+c2VxX251bWJlciksCi0gICAgICAgICAgICAgICBsZW4pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogb2sgdGhleSBzZWVtIHRvIHdhbnQgdG8ga25vdyBldmVyeXRoaW5nIC0gbGV0cyBmdWxseSBkZWNvZGUgaXQgKi8KLQotICAgIHRsZW49bGVuOwotCi0gICAgcHJpbnRmKCJcblx0TFNQLVBJTkd2JXUsIG1zZy10eXBlOiAlcyAoJXUpLCBsZW5ndGg6ICV1XG5cdCAgcmVwbHktbW9kZTogJXMgKCV1KSIsCi0gICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZsc3BwaW5nX2NvbV9oZWFkZXItPnZlcnNpb25bMF0pLAotICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5tc2dfdHlwZSksCi0gICAgICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+bXNnX3R5cGUsCi0gICAgICAgICAgIGxlbiwKLSAgICAgICAgICAgdG9rMnN0cihsc3BwaW5nX3JlcGx5X21vZGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5yZXBseV9tb2RlKSwKLSAgICAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXBseV9tb2RlKTsKLQotICAgIC8qCi0gICAgICogIHRoZSBmb2xsb3dpbmcgcmV0dXJuIGNvZGVzIHJlcXVpcmUgdGhhdCB0aGUgc3ViY29kZSBpcyBhdHRhY2hlZAotICAgICAqICBhdCB0aGUgZW5kIG9mIHRoZSB0cmFuc2xhdGVkIHRva2VuIG91dHB1dAotICAgICAqLwotICAgIGlmIChsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9jb2RlID09IDMgfHwKLSAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSA9PSA0IHx8Ci0gICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+cmV0dXJuX2NvZGUgPT0gOCB8fAotICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9jb2RlID09IDEwIHx8Ci0gICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+cmV0dXJuX2NvZGUgPT0gMTEgfHwKLSAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSA9PSAxMiApCi0gICAgICAgIHByaW50ZigiXG5cdCAgUmV0dXJuIENvZGU6ICVzICV1ICgldSlcblx0ICBSZXR1cm4gU3ViY29kZTogKCV1KSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfcmV0dXJuX2NvZGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSksCi0gICAgICAgICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9zdWJjb2RlLCAgICAKLSAgICAgICAgICAgICAgIGxzcHBpbmdfY29tX2hlYWRlci0+cmV0dXJuX2NvZGUsCi0gICAgICAgICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9zdWJjb2RlKTsKLSAgICBlbHNlCi0gICAgICAgIHByaW50ZigiXG5cdCAgUmV0dXJuIENvZGU6ICVzICgldSlcblx0ICBSZXR1cm4gU3ViY29kZTogKCV1KSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfcmV0dXJuX2NvZGVfdmFsdWVzLCAidW5rbm93biIsbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fY29kZSksICAgCi0gICAgICAgICAgICAgICBsc3BwaW5nX2NvbV9oZWFkZXItPnJldHVybl9jb2RlLAotICAgICAgICAgICAgICAgbHNwcGluZ19jb21faGVhZGVyLT5yZXR1cm5fc3ViY29kZSk7Ci0gCi0gICAgcHJpbnRmKCJcblx0ICBTZW5kZXIgSGFuZGxlOiAweCUwOHgsIFNlcXVlbmNlOiAldSIsCi0gICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGxzcHBpbmdfY29tX2hlYWRlci0+c2VuZGVyX2hhbmRsZSksCi0gICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGxzcHBpbmdfY29tX2hlYWRlci0+c2VxX251bWJlcikpOwotCi0gICAgdGltZXN0YW1wLnR2X3NlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3NlbnRfc2VjKTsKLSAgICB0aW1lc3RhbXAudHZfdXNlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3NlbnRfdXNlYyk7ICAgICAKLSAgICBwcmludGYoIlxuXHQgIFNlbmRlciBUaW1lc3RhbXA6ICIpOwotICAgIHRzX3ByaW50KCZ0aW1lc3RhbXApOwotCi0gICAgdGltZXN0YW1wLnR2X3NlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3JjdmRfc2VjKTsKLSAgICB0aW1lc3RhbXAudHZfdXNlYz1FWFRSQUNUXzMyQklUUyhsc3BwaW5nX2NvbV9oZWFkZXItPnRzX3JjdmRfdXNlYyk7IAotICAgIHByaW50ZigiUmVjZWl2ZXIgVGltZXN0YW1wOiAiKTsKLSAgICBpZiAoKHRpbWVzdGFtcC50dl9zZWMgIT0gMCkgJiYgKHRpbWVzdGFtcC50dl91c2VjICE9IDApKQotICAgICAgICB0c19wcmludCgmdGltZXN0YW1wKTsKLSAgICBlbHNlCi0gICAgICAgIHByaW50Zigibm8gdGltZXN0YW1wIik7Ci0KLSAgICB0cHRyKz1zaXplb2YoY29uc3Qgc3RydWN0IGxzcHBpbmdfY29tbW9uX2hlYWRlcik7Ci0gICAgdGxlbi09c2l6ZW9mKGNvbnN0IHN0cnVjdCBsc3BwaW5nX2NvbW1vbl9oZWFkZXIpOwotCi0gICAgd2hpbGUodGxlbj4oaW50KXNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKSkgewotICAgICAgICAvKiBkaWQgd2UgY2FwdHVyZSBlbm91Z2ggZm9yIGZ1bGx5IGRlY29kaW5nIHRoZSB0bHYgaGVhZGVyID8gKi8KLSAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKSkpCi0gICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgIGxzcHBpbmdfdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyICopdHB0cjsKLSAgICAgICAgbHNwcGluZ190bHZfdHlwZT1FWFRSQUNUXzE2QklUUyhsc3BwaW5nX3Rsdl9oZWFkZXItPnR5cGUpOwotICAgICAgICBsc3BwaW5nX3Rsdl9sZW49RVhUUkFDVF8xNkJJVFMobHNwcGluZ190bHZfaGVhZGVyLT5sZW5ndGgpOwotCi0gICAgICAgIGlmIChsc3BwaW5nX3Rsdl9sZW4gPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZihsc3BwaW5nX3Rsdl9sZW4gJSA0IHx8IGxzcHBpbmdfdGx2X2xlbiA8IDQpIHsgLyogYWxpZ25lZCB0byBmb3VyIG9jdGV0IGJvdW5kYXJ5ICovCi0gICAgICAgICAgICBwcmludGYoIlxuXHQgIEVSUk9SOiBUTFYgJXUgYm9ndXMgc2l6ZSAldSIsbHNwcGluZ190bHZfdHlwZSxsc3BwaW5nX3Rsdl9sZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRmKCJcblx0ICAlcyBUTFYgKCV1KSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGxzcHBpbmdfdGx2X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICBsc3BwaW5nX3Rsdl90eXBlKSwKLSAgICAgICAgICAgICAgIGxzcHBpbmdfdGx2X3R5cGUsCi0gICAgICAgICAgICAgICBsc3BwaW5nX3Rsdl9sZW4pOwotCi0gICAgICAgIHRsdl90cHRyPXRwdHIrc2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIpOwotICAgICAgICB0bHZfdGxlbj1sc3BwaW5nX3Rsdl9sZW47IC8qIGhlYWRlciBub3QgaW5jbHVkZWQgLT4gbm8gYWRqdXN0bWVudCAqLwotCi0gICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIHRsdiA/ICovCi0gICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBsc3BwaW5nX3Rsdl9sZW4pKQotICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgdGx2X2hleGR1bXA9RkFMU0U7Ci0KLSAgICAgICAgc3dpdGNoKGxzcHBpbmdfdGx2X3R5cGUpIHsKLSAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRfRkVDX1NUQUNLOgotICAgICAgICAgICAgd2hpbGUodGx2X3RsZW4+KGludClzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlcikpIHsKLQotICAgICAgICAgICAgICAgIC8qIGRpZCB3ZSBjYXB0dXJlIGVub3VnaCBmb3IgZnVsbHkgZGVjb2RpbmcgdGhlIHN1YnRsdiBoZWFkZXIgPyAqLwotICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlcikpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgIHN1YnRsdl9oZXhkdW1wPUZBTFNFOwotCi0gICAgICAgICAgICAgICAgbHNwcGluZ19zdWJ0bHZfaGVhZGVyID0gKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIgKil0bHZfdHB0cjsKLSAgICAgICAgICAgICAgICBsc3BwaW5nX3N1YnRsdl90eXBlPUVYVFJBQ1RfMTZCSVRTKGxzcHBpbmdfc3VidGx2X2hlYWRlci0+dHlwZSk7Ci0gICAgICAgICAgICAgICAgbHNwcGluZ19zdWJ0bHZfbGVuPUVYVFJBQ1RfMTZCSVRTKGxzcHBpbmdfc3VidGx2X2hlYWRlci0+bGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzdWJ0bHZfdHB0cj10bHZfdHB0citzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlcik7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxzcHBpbmdfc3VidGx2X2xlbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyBzdWJUTFYgKCV1KSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobHNwcGluZ190bHZ0YXJnZXRmZWNfc3VidGx2X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNwcGluZ19zdWJ0bHZfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfc3VidGx2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfc3VidGx2X2xlbik7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2gobHNwcGluZ19zdWJ0bHZfdHlwZSkgewotCi0gICAgICAgICAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0xEUF9JUFY0OgotICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjQgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbGRwX2lwdjRfdCAqKXN1YnRsdl90cHRyOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICAlcy8ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NC0+cHJlZml4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NC0+cHJlZml4X2xlbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgICAgICBjYXNlIExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfTERQX0lQVjY6Ci0gICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2NiA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2Nl90ICopc3VidGx2X3RwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzLyV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2Ni0+cHJlZml4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sZHBfaXB2Ni0+cHJlZml4X2xlbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBjYXNlIExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfQkdQX0lQVjQ6Ci0gICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NCA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NF90ICopc3VidGx2X3RwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzLyV1LCBzZW5kZXItaWQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjQtPnByZWZpeCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfYmdwX2lwdjQtPnByZWZpeF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NC0+c2VuZGVyX2lkKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgICAgICBjYXNlIExTUFBJTkdfVExWX1RBUkdFVEZFQ19TVUJUTFZfQkdQX0lQVjY6Ci0gICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2NiA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9iZ3BfaXB2Nl90ICopc3VidGx2X3RwdHI7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgICVzLyV1LCBzZW5kZXItaWQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2LT5wcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2LT5wcmVmaXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2JncF9pcHY2LT5zZW5kZXJfaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjQ6Ci0gICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjQgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0X3QgKilzdWJ0bHZfdHB0cjsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgdHVubmVsIGVuZC1wb2ludCAlcywgdHVubmVsIHNlbmRlciAlcywgbHNwLWlkIDB4JTA0eCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICB0dW5uZWwtaWQgMHglMDR4LCBleHRlbmRlZCB0dW5uZWwtaWQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT50dW5uZWxfZW5kcG9pbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT50dW5uZWxfc2VuZGVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjQtPmxzcF9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT50dW5uZWxfaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY0LT5leHRlbmRlZF90dW5uZWxfaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBJTkVUNgotICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9SU1ZQX0lQVjY6Ci0gICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjYgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY2X3QgKilzdWJ0bHZfdHB0cjsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgdHVubmVsIGVuZC1wb2ludCAlcywgdHVubmVsIHNlbmRlciAlcywgbHNwLWlkIDB4JTA0eCIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICB0dW5uZWwtaWQgMHglMDR4LCBleHRlbmRlZCB0dW5uZWwtaWQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2Ni0+dHVubmVsX2VuZHBvaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjYtPnR1bm5lbF9zZW5kZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X3JzdnBfaXB2Ni0+bHNwX2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9yc3ZwX2lwdjYtPnR1bm5lbF9pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfcnN2cF9pcHY2LT5leHRlbmRlZF90dW5uZWxfaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MM1ZQTl9JUFY0OgotICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDN2cG5faXB2NCA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0X3QgKilzdWJ0bHZfdHB0cjsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgUkQ6ICVzLCAlcy8ldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZ3BfdnBuX3JkX3ByaW50KHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0LT5yZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY0LT5wcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjQtPnByZWZpeF9sZW4pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wzVlBOX0lQVjY6Ci0gICAgICAgICAgICAgICAgICAgIHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY2ID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjZfdCAqKXN1YnRsdl90cHRyOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBSRDogJXMsICVzLyV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJncF92cG5fcmRfcHJpbnQoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjYtPnJkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sM3Zwbl9pcHY2LT5wcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wzdnBuX2lwdjYtPnByZWZpeF9sZW4pOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9UQVJHRVRGRUNfU1VCVExWX0wyVlBOX0VORFBUOgotICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHQgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IGxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHRfdCAqKXN1YnRsdl90cHRyOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgICBSRDogJXMsIFNlbmRlciBDRS1JRDogJXUsIFJlY2VpdmVyIENFLUlEOiAldSIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICBFbmNhcHN1bGF0aW9uIFR5cGU6ICVzICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdwX3Zwbl9yZF9wcmludChzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fZW5kcHQtPnJkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdC0+c2VuZGVyX2NlX2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdC0+cmVjZWl2ZXJfY2VfaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsMnZwbl9lbmNhcHNfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl9lbmRwdC0+ZW5jYXBzdWxhdGlvbikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX2VuZHB0LT5lbmNhcHN1bGF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAvKiB0aGUgb2xkIEwyVlBOIFZDSUQgc3ViVExWIGRvZXMgbm90IGhhdmUgc3VwcG9ydCBmb3IgdGhlIHNlbmRlciBmaWVsZCAqLwotICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEX09MRDoKLSAgICAgICAgICAgICAgICAgICAgc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWRfb2xkID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWRfb2xkX3QgKilzdWJ0bHZfdHB0cjsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgUmVtb3RlIFBFOiAlcyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICBWQy1JRDogMHglMDh4LCBFbmNhcHN1bGF0aW9uIFR5cGU6ICVzICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZF9vbGQtPnJlbW90ZV9wZV9hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX29sZC0+dmNfaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsMnZwbl9lbmNhcHNfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHN1YnRsdl9wdHIubHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX29sZC0+ZW5jYXBzdWxhdGlvbikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWRfb2xkLT5lbmNhcHN1bGF0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgTFNQUElOR19UTFZfVEFSR0VURkVDX1NVQlRMVl9MMlZQTl9WQ0lEOgotICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZCA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfdGFyZ2V0ZmVjX3N1YnRsdl9sMnZwbl92Y2lkX3QgKilzdWJ0bHZfdHB0cjsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgU2VuZGVyIFBFOiAlcywgUmVtb3RlIFBFOiAlcyIgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgICBWQy1JRDogMHglMDh4LCBFbmNhcHN1bGF0aW9uIFR5cGU6ICVzICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZC0+c2VuZGVyX3BlX2FkZHJlc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZC0+cmVtb3RlX3BlX2FkZHJlc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWQtPnZjX2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobDJ2cG5fZW5jYXBzX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhzdWJ0bHZfcHRyLmxzcHBpbmdfdGx2X3RhcmdldGZlY19zdWJ0bHZfbDJ2cG5fdmNpZC0+ZW5jYXBzdWxhdGlvbikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoc3VidGx2X3B0ci5sc3BwaW5nX3Rsdl90YXJnZXRmZWNfc3VidGx2X2wydnBuX3ZjaWQtPmVuY2Fwc3VsYXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgc3VidGx2X2hleGR1bXA9VFJVRTsgLyogdW5rbm93biBzdWJUTFYganVzdCBoZXhkdW1wIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsbHkgc3VidGx2IGhleGR1bXAgPyAqLwotICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA+IDEgfHwgc3VidGx2X2hleGR1bXA9PVRSVUUpCi0gICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0citzaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2hlYWRlciksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcblx0ICAgICAgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfc3VidGx2X2xlbik7Ci0KLSAgICAgICAgICAgICAgICB0bHZfdHB0cis9bHNwcGluZ19zdWJ0bHZfbGVuOwotICAgICAgICAgICAgICAgIHRsdl90bGVuLT1sc3BwaW5nX3N1YnRsdl9sZW4rc2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9ET1dOU1RSRUFNX01BUFBJTkc6Ci0gICAgICAgICAgICAvKiB0aGF0IHN0cmFuZ2UgdGhpbmcgd2l0aCB0aGUgZG93bnN0cmVhbSBtYXAgVExWIGlzIHRoYXQgdW50aWwgbm93Ci0gICAgICAgICAgICAgKiB3ZSBkbyBub3Qga25vdyBpZiBpdHMgSVB2NCBvciBJUHY2ICwgYWZ0ZXIgd2UgZm91bmQgdGhlIGFkcmVzcy10eXBlCi0gICAgICAgICAgICAgKiBsZXRzIHJlY2FzdCB0aGUgdGx2X3RwdHIgYW5kIG1vdmUgb24gKi8KLQotICAgICAgICAgICAgdGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0PSBcCi0gICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QgKil0bHZfdHB0cjsKLSAgICAgICAgICAgIHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Nj0gXAotICAgICAgICAgICAgICAgIChjb25zdCBzdHJ1Y3QgbHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Nl90ICopdGx2X3RwdHI7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgTVRVOiAldSwgQWRkcmVzcy1UeXBlOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjQtPm10dSksCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX2FkZHJfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0LT5hZGRyZXNzX3R5cGUpLAotICAgICAgICAgICAgICAgICAgIHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NC0+YWRkcmVzc190eXBlKTsKLQotICAgICAgICAgICAgc3dpdGNoKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NC0+YWRkcmVzc190eXBlKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgTFNQUElOR19BRklfSVBWNDoKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgRG93bnN0cmVhbSBJUDogJXMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgRG93bnN0cmVhbSBJbnRlcmZhY2UgSVA6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyh0bHZfcHRyLmxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjQtPmRvd25zdHJlYW1faXApLAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NC0+ZG93bnN0cmVhbV9pbnRlcmZhY2UpKTsKLSAgICAgICAgICAgICAgICB0bHZfdHB0cis9c2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0X3QpOwotICAgICAgICAgICAgICAgIHRsdl90bGVuLT1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjRfdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgICBjYXNlIExTUFBJTkdfQUZJX0lQVjY6Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIERvd25zdHJlYW0gSVA6ICVzIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICJcblx0ICAgIERvd25zdHJlYW0gSW50ZXJmYWNlIElQOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Ni0+ZG93bnN0cmVhbV9pcCksCi0gICAgICAgICAgICAgICAgICAgICAgIGlwNmFkZHJfc3RyaW5nKHRsdl9wdHIubHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2Ni0+ZG93bnN0cmVhbV9pbnRlcmZhY2UpKTsKLSAgICAgICAgICAgICAgICB0bHZfdHB0cis9c2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY2X3QpOwotICAgICAgICAgICAgICAgIHRsdl90bGVuLT1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjZfdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNhc2UgTFNQUElOR19BRklfVU5NQjoKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgRG93bnN0cmVhbSBJUDogJXMiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgRG93bnN0cmVhbSBJbnRlcmZhY2UgSW5kZXg6IDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcodGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0LT5kb3duc3RyZWFtX2lwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pcHY0LT5kb3duc3RyZWFtX2ludGVyZmFjZSkpOwotICAgICAgICAgICAgICAgIHRsdl90cHRyKz1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2lwdjRfdCk7Ci0gICAgICAgICAgICAgICAgdGx2X3RsZW4tPXNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfZG93bnN0cmVhbV9tYXBfaXB2NF90KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBzaG91bGQgbm90IGhhcHBlbiAhIC0gbm8gZXJyb3IgbWVzc2FnZSAtIHRvazJzdHIoKSBoYXMgYmFya2VkIGFscmVhZHkgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGx2X3B0ci5sc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvPSBcCi0gICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QgKil0bHZfdHB0cjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyogRklYTUUgYWRkIGhhc2gta2V5IHR5cGUsIGRlcHRoIGxpbWl0LCBtdWx0aXBhdGggcHJvY2Vzc2luZyAqLwotCi0KLSAgICAgICAgICAgIHRsdl90cHRyKz1zaXplb2Yoc3RydWN0IGxzcHBpbmdfdGx2X2Rvd25zdHJlYW1fbWFwX2luZm9fdCk7Ci0gICAgICAgICAgICB0bHZfdGxlbi09c2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9kb3duc3RyZWFtX21hcF9pbmZvX3QpOwotCi0gICAgICAgICAgICAvKiBGSVhNRSBwcmludCBkb3duc3RyZWFtIGxhYmVscyAqLwotCi0KLSAgICAgICAgICAgIHRsdl9oZXhkdW1wPVRSVUU7IC8qIGR1bXAgdGhlIFRMViB1bnRpbCBjb2RlIGNvbXBsZXRlICovCi0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTFNQUElOR19UTFZfQkZEX0RJU0NSSU1JTkFUT1I6Ci0gICAgICAgICAgICB0cHRyICs9IHNpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKTsKLSAgICAgICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBMU1BQSU5HX1RMVl9CRkRfRElTQ1JJTUlOQVRPUl9MRU4pKQotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQkZEIERpc2NyaW1pbmF0b3IgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogIEZJWE1FIHRob3NlIGFyZSB0aGUgZGVmaW5lZCBUTFZzIHRoYXQgbGFjayBhIGRlY29kZXIKLSAgICAgICAgICAgICAqICB5b3UgYXJlIHdlbGNvbWUgdG8gY29udHJpYnV0ZSBjb2RlIDstKQotICAgICAgICAgICAgICovCi0KLSAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9QQUQ6Ci0gICAgICAgIGNhc2UgTFNQUElOR19UTFZfRVJST1JfQ09ERToKLSAgICAgICAgY2FzZSBMU1BQSU5HX1RMVl9WRU5ET1JfUFJJVkFURToKLSAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0ciwiXG5cdCAgICAiLHRsdl90bGVuKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSB0bHYgaGV4ZHVtcCA/ICovCi0gICAgICAgIGlmICh2ZmxhZyA+IDEgfHwgdGx2X2hleGR1bXA9PVRSVUUpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCBsc3BwaW5nX3Rsdl9oZWFkZXIpKSwiXG5cdCAgICAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcHBpbmdfdGx2X2xlbik7Ci0KLSAgICAgICAgdHB0cis9bHNwcGluZ190bHZfbGVuK3NpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKTsKLSAgICAgICAgdGxlbi09bHNwcGluZ190bHZfbGVuK3NpemVvZihzdHJ1Y3QgbHNwcGluZ190bHZfaGVhZGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Ci19CmRpZmYgLS1naXQgYS9wcmludC1sd3Jlcy5jIGIvcHJpbnQtbHdyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNmZlMS4uMDAwMDAwMAotLS0gYS9wcmludC1sd3Jlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgV0lERSBQcm9qZWN0LgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbHdyZXMuYyx2IDEuMTMgMjAwNC8wMy8yNCAwMTo1NDoyOSBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlICJuYW1lc2VyLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi0vKiBCSU5EOSBsaWIvbHdyZXMvaW5jbHVkZS9sd3JlcyAqLwotdHlwZWRlZiB1X2ludDMyX3QgbHdyZXNfdWludDMyX3Q7Ci10eXBlZGVmIHVfaW50MTZfdCBsd3Jlc191aW50MTZfdDsKLXR5cGVkZWYgdV9pbnQ4X3QgbHdyZXNfdWludDhfdDsKLQotc3RydWN0IGx3cmVzX2x3cGFja2V0IHsKLQlsd3Jlc191aW50MzJfdAkJbGVuZ3RoOwotCWx3cmVzX3VpbnQxNl90CQl2ZXJzaW9uOwotCWx3cmVzX3VpbnQxNl90CQlwa3RmbGFnczsKLQlsd3Jlc191aW50MzJfdAkJc2VyaWFsOwotCWx3cmVzX3VpbnQzMl90CQlvcGNvZGU7Ci0JbHdyZXNfdWludDMyX3QJCXJlc3VsdDsKLQlsd3Jlc191aW50MzJfdAkJcmVjdmxlbmd0aDsKLQlsd3Jlc191aW50MTZfdAkJYXV0aHR5cGU7Ci0JbHdyZXNfdWludDE2X3QJCWF1dGhsZW5ndGg7Ci19OwotCi0jZGVmaW5lIExXUkVTX0xXUEFDS0VURkxBR19SRVNQT05TRQkweDAwMDFVCS8qIGlmIHNldCwgcGt0IGlzIGEgcmVzcG9uc2UgKi8KLQotI2RlZmluZSBMV1JFU19MV1BBQ0tFVFZFUlNJT05fMAkJMAotCi0jZGVmaW5lIExXUkVTX0ZMQUdfVFJVU1ROT1RSRVFVSVJFRAkweDAwMDAwMDAxVQotI2RlZmluZSBMV1JFU19GTEFHX1NFQ1VSRURBVEEJCTB4MDAwMDAwMDJVCi0KLS8qCi0gKiBuby1vcAotICovCi0jZGVmaW5lIExXUkVTX09QQ09ERV9OT09QCQkweDAwMDAwMDAwVQotCi10eXBlZGVmIHN0cnVjdCB7Ci0JLyogcHVibGljICovCi0JbHdyZXNfdWludDE2X3QJCQlkYXRhbGVuZ3RoOwotCS8qIGRhdGEgZm9sbG93cyAqLwotfSBsd3Jlc19ub29wcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JLyogcHVibGljICovCi0JbHdyZXNfdWludDE2X3QJCQlkYXRhbGVuZ3RoOwotCS8qIGRhdGEgZm9sbG93cyAqLwotfSBsd3Jlc19ub29wcmVzcG9uc2VfdDsKLQotLyoKLSAqIGdldCBhZGRyZXNzZXMgYnkgbmFtZQotICovCi0jZGVmaW5lIExXUkVTX09QQ09ERV9HRVRBRERSU0JZTkFNRQkweDAwMDEwMDAxVQotCi10eXBlZGVmIHN0cnVjdCBsd3Jlc19hZGRyIGx3cmVzX2FkZHJfdDsKLQotc3RydWN0IGx3cmVzX2FkZHIgewotCWx3cmVzX3VpbnQzMl90CQkJZmFtaWx5OwotCWx3cmVzX3VpbnQxNl90CQkJbGVuZ3RoOwotCS8qIGFkZHJlc3MgZm9sb3dzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JLyogcHVibGljICovCi0JbHdyZXNfdWludDMyX3QJCQlmbGFnczsKLQlsd3Jlc191aW50MzJfdAkJCWFkZHJ0eXBlczsKLQlsd3Jlc191aW50MTZfdAkJCW5hbWVsZW47Ci0JLyogbmFtZSBmb2xsb3dzICovCi19IGx3cmVzX2dhYm5yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiBwdWJsaWMgKi8KLQlsd3Jlc191aW50MzJfdAkJCWZsYWdzOwotCWx3cmVzX3VpbnQxNl90CQkJbmFsaWFzZXM7Ci0JbHdyZXNfdWludDE2X3QJCQluYWRkcnM7Ci0JbHdyZXNfdWludDE2X3QJCQlyZWFsbmFtZWxlbjsKLQkvKiBhbGlhc2VzIGZvbGxvd3MgKi8KLQkvKiBhZGRycyBmb2xsb3dzICovCi0JLyogcmVhbG5hbWUgZm9sbG93cyAqLwotfSBsd3Jlc19nYWJucmVzcG9uc2VfdDsKLQotLyoKLSAqIGdldCBuYW1lIGJ5IGFkZHJlc3MKLSAqLwotI2RlZmluZSBMV1JFU19PUENPREVfR0VUTkFNRUJZQUREUgkweDAwMDEwMDAyVQotdHlwZWRlZiBzdHJ1Y3QgewotCS8qIHB1YmxpYyAqLwotCWx3cmVzX3VpbnQzMl90CQkJZmxhZ3M7Ci0JbHdyZXNfYWRkcl90CQkJYWRkcjsKLQkvKiBhZGRyIGJvZHkgZm9sbG93cyAqLwotfSBsd3Jlc19nbmJhcmVxdWVzdF90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JLyogcHVibGljICovCi0JbHdyZXNfdWludDMyX3QJCQlmbGFnczsKLQlsd3Jlc191aW50MTZfdAkJCW5hbGlhc2VzOwotCWx3cmVzX3VpbnQxNl90CQkJcmVhbG5hbWVsZW47Ci0JLyogYWxpYXNlcyBmb2xsb3dzICovCi0JLyogcmVhbG5hbWUgZm9sbG93cyAqLwotfSBsd3Jlc19nbmJhcmVzcG9uc2VfdDsKLQotLyoKLSAqIGdldCByZGF0YSBieSBuYW1lCi0gKi8KLSNkZWZpbmUgTFdSRVNfT1BDT0RFX0dFVFJEQVRBQllOQU1FCTB4MDAwMTAwMDNVCi0KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiBwdWJsaWMgKi8KLQlsd3Jlc191aW50MzJfdAkJCWZsYWdzOwotCWx3cmVzX3VpbnQxNl90CQkJcmRjbGFzczsKLQlsd3Jlc191aW50MTZfdAkJCXJkdHlwZTsKLQlsd3Jlc191aW50MTZfdAkJCW5hbWVsZW47Ci0JLyogbmFtZSBmb2xsb3dzICovCi19IGx3cmVzX2dyYm5yZXF1ZXN0X3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQkvKiBwdWJsaWMgKi8KLQlsd3Jlc191aW50MzJfdAkJCWZsYWdzOwotCWx3cmVzX3VpbnQxNl90CQkJcmRjbGFzczsKLQlsd3Jlc191aW50MTZfdAkJCXJkdHlwZTsKLQlsd3Jlc191aW50MzJfdAkJCXR0bDsKLQlsd3Jlc191aW50MTZfdAkJCW5yZGF0YXM7Ci0JbHdyZXNfdWludDE2X3QJCQluc2lnczsKLQkvKiByZWFsbmFtZSBoZXJlIChsZW4gKyBuYW1lKSAqLwotCS8qIHJkYXRhIGhlcmUgKGxlbiArIG5hbWUpICovCi0JLyogc2lnbmF0dXJlcyBoZXJlIChsZW4gKyBuYW1lKSAqLwotfSBsd3Jlc19ncmJucmVzcG9uc2VfdDsKLQotI2RlZmluZSBMV1JEQVRBX1ZBTElEQVRFRAkweDAwMDAwMDAxCi0KLSNkZWZpbmUgTFdSRVNfQUREUlRZUEVfVjQJCTB4MDAwMDAwMDFVCS8qIGlwdjQgKi8KLSNkZWZpbmUgTFdSRVNfQUREUlRZUEVfVjYJCTB4MDAwMDAwMDJVCS8qIGlwdjYgKi8KLQotI2RlZmluZSBMV1JFU19NQVhfQUxJQVNFUwkJMTYJCS8qIG1heCAjIG9mIGFsaWFzZXMgKi8KLSNkZWZpbmUgTFdSRVNfTUFYX0FERFJTCQkJNjQJCS8qIG1heCAjIG9mIGFkZHJzICovCi0KLXN0cnVjdCB0b2sgb3Bjb2RlW10gPSB7Ci0JeyBMV1JFU19PUENPREVfTk9PUCwJCSJub29wIiwgfSwKLQl7IExXUkVTX09QQ09ERV9HRVRBRERSU0JZTkFNRSwJImdldGFkZHJzYnluYW1lIiwgfSwKLQl7IExXUkVTX09QQ09ERV9HRVROQU1FQllBRERSLAkiZ2V0bmFtZWJ5YWRkciIsIH0sCi0JeyBMV1JFU19PUENPREVfR0VUUkRBVEFCWU5BTUUsCSJnZXRyZGF0YWJ5bmFtZSIsIH0sCi0JeyAwLCAJCQkJTlVMTCwgfSwKLX07Ci0KLS8qIHByaW50LWRvbWFpbi5jICovCi1leHRlcm4gc3RydWN0IHRvayBuc190eXBlMnN0cltdOwotZXh0ZXJuIHN0cnVjdCB0b2sgbnNfY2xhc3Myc3RyW107Ci0KLXN0YXRpYyBpbnQgbHdyZXNfcHJpbnRuYW1lKHNpemVfdCwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBpbnQgbHdyZXNfcHJpbnRuYW1lbGVuKGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgaW50IGx3cmVzX3ByaW50YmlubGVuKGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgaW50IGx3cmVzX3ByaW50YWRkcihsd3Jlc19hZGRyX3QgKik7Ci0KLXN0YXRpYyBpbnQKLWx3cmVzX3ByaW50bmFtZShzaXplX3QgbCwgY29uc3QgY2hhciAqcDApCi17Ci0JY29uc3QgY2hhciAqcDsKLQlzaXplX3QgaTsKLQotCXAgPSBwMDsKLQkvKiArIDEgZm9yIHRlcm1pbmF0aW5nIFwwICovCi0JaWYgKHAgKyBsICsgMSA+IChjb25zdCBjaGFyICopc25hcGVuZCkKLQkJZ290byB0cnVuYzsKLQotCXByaW50ZigiICIpOwotCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspCi0JCXNhZmVwdXRjaGFyKCpwKyspOwotCXArKzsJLyogc2tpcCB0ZXJtaW5hdGluZyBcMCAqLwotCi0JcmV0dXJuIHAgLSBwMDsKLQotICB0cnVuYzoKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQKLWx3cmVzX3ByaW50bmFtZWxlbihjb25zdCBjaGFyICpwKQotewotCXVfaW50MTZfdCBsOwotCWludCBhZHZhbmNlOwotCi0JaWYgKHAgKyAyID4gKGNvbnN0IGNoYXIgKilzbmFwZW5kKQotCQlnb3RvIHRydW5jOwotCWwgPSBFWFRSQUNUXzE2QklUUyhwKTsKLQlhZHZhbmNlID0gbHdyZXNfcHJpbnRuYW1lKGwsIHAgKyAyKTsKLQlpZiAoYWR2YW5jZSA8IDApCi0JCWdvdG8gdHJ1bmM7Ci0JcmV0dXJuIDIgKyBhZHZhbmNlOwotCi0gIHRydW5jOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludAotbHdyZXNfcHJpbnRiaW5sZW4oY29uc3QgY2hhciAqcDApCi17Ci0JY29uc3QgY2hhciAqcDsKLQl1X2ludDE2X3QgbDsKLQlpbnQgaTsKLQotCXAgPSBwMDsKLQlpZiAocCArIDIgPiAoY29uc3QgY2hhciAqKXNuYXBlbmQpCi0JCWdvdG8gdHJ1bmM7Ci0JbCA9IEVYVFJBQ1RfMTZCSVRTKHApOwotCWlmIChwICsgMiArIGwgPiAoY29uc3QgY2hhciAqKXNuYXBlbmQpCi0JCWdvdG8gdHJ1bmM7Ci0JcCArPSAyOwotCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspCi0JCXByaW50ZigiJTAyeCIsICpwKyspOwotCXJldHVybiBwIC0gcDA7Ci0KLSAgdHJ1bmM6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50Ci1sd3Jlc19wcmludGFkZHIobHdyZXNfYWRkcl90ICphcCkKLXsKLQl1X2ludDE2X3QgbDsKLQljb25zdCBjaGFyICpwOwotCWludCBpOwotCi0JVENIRUNLKGFwLT5sZW5ndGgpOwotCWwgPSBFWFRSQUNUXzE2QklUUygmYXAtPmxlbmd0aCk7Ci0JLyogWFhYIGFwIHBvaW50cyB0byBwYWNrZWQgc3RydWN0ICovCi0JcCA9IChjb25zdCBjaGFyICopJmFwLT5sZW5ndGggKyBzaXplb2YoYXAtPmxlbmd0aCk7Ci0JVENIRUNLMigqcCwgbCk7Ci0KLQlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKCZhcC0+ZmFtaWx5KSkgewotCWNhc2UgMToJLyogSVB2NCAqLwotCQlpZiAobCA8IDQpCi0JCQlyZXR1cm4gLTE7Ci0JCXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZyhwKSk7Ci0JCXAgKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIDI6CS8qIElQdjYgKi8KLQkJaWYgKGwgPCAxNikKLQkJCXJldHVybiAtMTsKLQkJcHJpbnRmKCIgJXMiLCBpcDZhZGRyX3N0cmluZyhwKSk7Ci0JCXAgKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCIgJXUvIiwgRVhUUkFDVF8zMkJJVFMoJmFwLT5mYW1pbHkpKTsKLQkJZm9yIChpID0gMDsgaSA8IGw7IGkrKykKLQkJCXByaW50ZigiJTAyeCIsICpwKyspOwotCX0KLQotCXJldHVybiBwIC0gKGNvbnN0IGNoYXIgKilhcDsKLQotICB0cnVuYzoKLQlyZXR1cm4gLTE7Ci19Ci0KLXZvaWQKLWx3cmVzX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKLXsKLQljb25zdCBzdHJ1Y3QgbHdyZXNfbHdwYWNrZXQgKm5wOwotCXVfaW50MzJfdCB2OwotCWNvbnN0IGNoYXIgKnM7Ci0JaW50IHJlc3BvbnNlOwotCWludCBhZHZhbmNlOwotCWludCB1bnN1cHBvcnRlZCA9IDA7Ci0KLQlucCA9IChjb25zdCBzdHJ1Y3QgbHdyZXNfbHdwYWNrZXQgKilicDsKLQlUQ0hFQ0sobnAtPmF1dGhsZW5ndGgpOwotCi0JcHJpbnRmKCIgbHdyZXMiKTsKLQl2ID0gRVhUUkFDVF8xNkJJVFMoJm5wLT52ZXJzaW9uKTsKLQlpZiAodmZsYWcgfHwgdiAhPSBMV1JFU19MV1BBQ0tFVFZFUlNJT05fMCkKLQkJcHJpbnRmKCIgdiV1Iiwgdik7Ci0JaWYgKHYgIT0gTFdSRVNfTFdQQUNLRVRWRVJTSU9OXzApIHsKLQkJcyA9IChjb25zdCBjaGFyICopbnAgKyBFWFRSQUNUXzMyQklUUygmbnAtPmxlbmd0aCk7Ci0JCWdvdG8gdGFpbDsKLQl9Ci0KLQlyZXNwb25zZSA9IEVYVFJBQ1RfMTZCSVRTKCZucC0+cGt0ZmxhZ3MpICYgTFdSRVNfTFdQQUNLRVRGTEFHX1JFU1BPTlNFOwotCi0JLyogb3Bjb2RlIGFuZCBwa3RmbGFncyAqLwotCXYgPSBFWFRSQUNUXzMyQklUUygmbnAtPm9wY29kZSk7Ci0JcyA9IHRvazJzdHIob3Bjb2RlLCAiIzB4JXgiLCB2KTsKLQlwcmludGYoIiAlcyVzIiwgcywgcmVzcG9uc2UgPyAiIiA6ICI/Iik7Ci0KLQkvKiBwa3RmbGFncyAqLwotCXYgPSBFWFRSQUNUXzE2QklUUygmbnAtPnBrdGZsYWdzKTsKLQlpZiAodiAmIH5MV1JFU19MV1BBQ0tFVEZMQUdfUkVTUE9OU0UpCi0JCXByaW50ZigiWzB4JXhdIiwgdik7Ci0KLQlpZiAodmZsYWcgPiAxKSB7Ci0JCXByaW50ZigiICgiKTsJLyopKi8KLQkJcHJpbnRmKCJzZXJpYWw6MHgleCIsIEVYVFJBQ1RfMzJCSVRTKCZucC0+c2VyaWFsKSk7Ci0JCXByaW50ZigiIHJlc3VsdDoweCV4IiwgRVhUUkFDVF8zMkJJVFMoJm5wLT5yZXN1bHQpKTsKLQkJcHJpbnRmKCIgcmVjdmxlbjoldSIsIEVYVFJBQ1RfMzJCSVRTKCZucC0+cmVjdmxlbmd0aCkpOwotCQkvKiBCSU5EOTEwOiBub3QgdXNlZCAqLwotCQlpZiAodmZsYWcgPiAyKSB7Ci0JCQlwcmludGYoIiBhdXRodHlwZToweCV4IiwgRVhUUkFDVF8xNkJJVFMoJm5wLT5hdXRodHlwZSkpOwotCQkJcHJpbnRmKCIgYXV0aGxlbjoldSIsIEVYVFJBQ1RfMTZCSVRTKCZucC0+YXV0aGxlbmd0aCkpOwotCQl9Ci0JCS8qKCovCi0JCXByaW50ZigiKSIpOwotCX0KLQotCS8qIHBlci1vcGNvZGUgY29udGVudCAqLwotCWlmICghcmVzcG9uc2UpIHsKLQkJLyoKLQkJICogcXVlcmllcwotCQkgKi8KLQkJbHdyZXNfZ2FibnJlcXVlc3RfdCAqZ2FibjsKLQkJbHdyZXNfZ25iYXJlcXVlc3RfdCAqZ25iYTsKLQkJbHdyZXNfZ3JibnJlcXVlc3RfdCAqZ3JibjsKLQkJdV9pbnQzMl90IGw7Ci0KLQkJZ2FibiA9IE5VTEw7Ci0JCWduYmEgPSBOVUxMOwotCQlncmJuID0gTlVMTDsKLQotCQlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKCZucC0+b3Bjb2RlKSkgewotCQljYXNlIExXUkVTX09QQ09ERV9OT09QOgotCQkJYnJlYWs7Ci0JCWNhc2UgTFdSRVNfT1BDT0RFX0dFVEFERFJTQllOQU1FOgotCQkJZ2FibiA9IChsd3Jlc19nYWJucmVxdWVzdF90ICopKG5wICsgMSk7Ci0JCQlUQ0hFQ0soZ2Fibi0+bmFtZWxlbik7Ci0JCQkvKiBYWFggZ2FibiBwb2ludHMgdG8gcGFja2VkIHN0cnVjdCAqLwotCQkJcyA9IChjb25zdCBjaGFyICopJmdhYm4tPm5hbWVsZW4gKwotCQkJICAgIHNpemVvZihnYWJuLT5uYW1lbGVuKTsKLQkJCWwgPSBFWFRSQUNUXzE2QklUUygmZ2Fibi0+bmFtZWxlbik7Ci0KLQkJCS8qIEJJTkQ5MTA6IG5vdCB1c2VkICovCi0JCQlpZiAodmZsYWcgPiAyKSB7Ci0JCQkJcHJpbnRmKCIgZmxhZ3M6MHgleCIsCi0JCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZnYWJuLT5mbGFncykpOwotCQkJfQotCi0JCQl2ID0gRVhUUkFDVF8zMkJJVFMoJmdhYm4tPmFkZHJ0eXBlcyk7Ci0JCQlzd2l0Y2ggKHYgJiAoTFdSRVNfQUREUlRZUEVfVjQgfCBMV1JFU19BRERSVFlQRV9WNikpIHsKLQkJCWNhc2UgTFdSRVNfQUREUlRZUEVfVjQ6Ci0JCQkJcHJpbnRmKCIgSVB2NCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBMV1JFU19BRERSVFlQRV9WNjoKLQkJCQlwcmludGYoIiBJUHY2Iik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIExXUkVTX0FERFJUWVBFX1Y0IHwgTFdSRVNfQUREUlRZUEVfVjY6Ci0JCQkJcHJpbnRmKCIgSVB2NC82Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAodiAmIH4oTFdSRVNfQUREUlRZUEVfVjQgfCBMV1JFU19BRERSVFlQRV9WNikpCi0JCQkJcHJpbnRmKCJbMHgleF0iLCB2KTsKLQotCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50bmFtZShsLCBzKTsKLQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQlnb3RvIHRydW5jOwotCQkJcyArPSBhZHZhbmNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFdSRVNfT1BDT0RFX0dFVE5BTUVCWUFERFI6Ci0JCQlnbmJhID0gKGx3cmVzX2duYmFyZXF1ZXN0X3QgKikobnAgKyAxKTsKLQkJCVRDSEVDSyhnbmJhLT5hZGRyKTsKLQotCQkJLyogQklORDkxMDogbm90IHVzZWQgKi8KLQkJCWlmICh2ZmxhZyA+IDIpIHsKLQkJCQlwcmludGYoIiBmbGFnczoweCV4IiwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmduYmEtPmZsYWdzKSk7Ci0JCQl9Ci0KLQkJCXMgPSAoY29uc3QgY2hhciAqKSZnbmJhLT5hZGRyOwotCi0JCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRhZGRyKCZnbmJhLT5hZGRyKTsKLQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQlnb3RvIHRydW5jOwotCQkJcyArPSBhZHZhbmNlOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFdSRVNfT1BDT0RFX0dFVFJEQVRBQllOQU1FOgotCQkJLyogWFhYIG5vIHRyYWNlLCBub3QgdGVzdGVkICovCi0JCQlncmJuID0gKGx3cmVzX2dyYm5yZXF1ZXN0X3QgKikobnAgKyAxKTsKLQkJCVRDSEVDSyhncmJuLT5uYW1lbGVuKTsKLQotCQkJLyogQklORDkxMDogbm90IHVzZWQgKi8KLQkJCWlmICh2ZmxhZyA+IDIpIHsKLQkJCQlwcmludGYoIiBmbGFnczoweCV4IiwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmdyYm4tPmZsYWdzKSk7Ci0JCQl9Ci0KLQkJCXByaW50ZigiICVzIiwgdG9rMnN0cihuc190eXBlMnN0ciwgIlR5cGUlZCIsCi0JCQkgICAgRVhUUkFDVF8xNkJJVFMoJmdyYm4tPnJkdHlwZSkpKTsKLQkJCWlmIChFWFRSQUNUXzE2QklUUygmZ3Jibi0+cmRjbGFzcykgIT0gQ19JTikgewotCQkJCXByaW50ZigiICVzIiwgdG9rMnN0cihuc19jbGFzczJzdHIsICJDbGFzcyVkIiwKLQkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJmdyYm4tPnJkY2xhc3MpKSk7Ci0JCQl9Ci0KLQkJCS8qIFhYWCBncmJuIHBvaW50cyB0byBwYWNrZWQgc3RydWN0ICovCi0JCQlzID0gKGNvbnN0IGNoYXIgKikmZ3Jibi0+bmFtZWxlbiArCi0JCQkgICAgc2l6ZW9mKGdyYm4tPm5hbWVsZW4pOwotCQkJbCA9IEVYVFJBQ1RfMTZCSVRTKCZncmJuLT5uYW1lbGVuKTsKLQotCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50bmFtZShsLCBzKTsKLQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQlnb3RvIHRydW5jOwotCQkJcyArPSBhZHZhbmNlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl1bnN1cHBvcnRlZCsrOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiByZXNwb25zZXMKLQkJICovCi0JCWx3cmVzX2dhYm5yZXNwb25zZV90ICpnYWJuOwotCQlsd3Jlc19nbmJhcmVzcG9uc2VfdCAqZ25iYTsKLQkJbHdyZXNfZ3JibnJlc3BvbnNlX3QgKmdyYm47Ci0JCXVfaW50MzJfdCBsLCBuYTsKLQkJdV9pbnQzMl90IGk7Ci0KLQkJZ2FibiA9IE5VTEw7Ci0JCWduYmEgPSBOVUxMOwotCQlncmJuID0gTlVMTDsKLQotCQlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKCZucC0+b3Bjb2RlKSkgewotCQljYXNlIExXUkVTX09QQ09ERV9OT09QOgotCQkJYnJlYWs7Ci0JCWNhc2UgTFdSRVNfT1BDT0RFX0dFVEFERFJTQllOQU1FOgotCQkJZ2FibiA9IChsd3Jlc19nYWJucmVzcG9uc2VfdCAqKShucCArIDEpOwotCQkJVENIRUNLKGdhYm4tPnJlYWxuYW1lbGVuKTsKLQkJCS8qIFhYWCBnYWJuIHBvaW50cyB0byBwYWNrZWQgc3RydWN0ICovCi0JCQlzID0gKGNvbnN0IGNoYXIgKikmZ2Fibi0+cmVhbG5hbWVsZW4gKwotCQkJICAgIHNpemVvZihnYWJuLT5yZWFsbmFtZWxlbik7Ci0JCQlsID0gRVhUUkFDVF8xNkJJVFMoJmdhYm4tPnJlYWxuYW1lbGVuKTsKLQotCQkJLyogQklORDkxMDogbm90IHVzZWQgKi8KLQkJCWlmICh2ZmxhZyA+IDIpIHsKLQkJCQlwcmludGYoIiBmbGFnczoweCV4IiwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmdhYm4tPmZsYWdzKSk7Ci0JCQl9Ci0KLQkJCXByaW50ZigiICV1LyV1IiwgRVhUUkFDVF8xNkJJVFMoJmdhYm4tPm5hbGlhc2VzKSwKLQkJCSAgICBFWFRSQUNUXzE2QklUUygmZ2Fibi0+bmFkZHJzKSk7Ci0KLQkJCWFkdmFuY2UgPSBsd3Jlc19wcmludG5hbWUobCwgcyk7Ci0JCQlpZiAoYWR2YW5jZSA8IDApCi0JCQkJZ290byB0cnVuYzsKLQkJCXMgKz0gYWR2YW5jZTsKLQotCQkJLyogYWxpYXNlcyAqLwotCQkJbmEgPSBFWFRSQUNUXzE2QklUUygmZ2Fibi0+bmFsaWFzZXMpOwotCQkJZm9yIChpID0gMDsgaSA8IG5hOyBpKyspIHsKLQkJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRuYW1lbGVuKHMpOwotCQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCQlzICs9IGFkdmFuY2U7Ci0JCQl9Ci0KLQkJCS8qIGFkZHJzICovCi0JCQluYSA9IEVYVFJBQ1RfMTZCSVRTKCZnYWJuLT5uYWRkcnMpOwotCQkJZm9yIChpID0gMDsgaSA8IG5hOyBpKyspIHsKLQkJCQlhZHZhbmNlID0gbHdyZXNfcHJpbnRhZGRyKChsd3Jlc19hZGRyX3QgKilzKTsKLQkJCQlpZiAoYWR2YW5jZSA8IDApCi0JCQkJCWdvdG8gdHJ1bmM7Ci0JCQkJcyArPSBhZHZhbmNlOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgTFdSRVNfT1BDT0RFX0dFVE5BTUVCWUFERFI6Ci0JCQlnbmJhID0gKGx3cmVzX2duYmFyZXNwb25zZV90ICopKG5wICsgMSk7Ci0JCQlUQ0hFQ0soZ25iYS0+cmVhbG5hbWVsZW4pOwotCQkJLyogWFhYIGduYmEgcG9pbnRzIHRvIHBhY2tlZCBzdHJ1Y3QgKi8KLQkJCXMgPSAoY29uc3QgY2hhciAqKSZnbmJhLT5yZWFsbmFtZWxlbiArCi0JCQkgICAgc2l6ZW9mKGduYmEtPnJlYWxuYW1lbGVuKTsKLQkJCWwgPSBFWFRSQUNUXzE2QklUUygmZ25iYS0+cmVhbG5hbWVsZW4pOwotCi0JCQkvKiBCSU5EOTEwOiBub3QgdXNlZCAqLwotCQkJaWYgKHZmbGFnID4gMikgewotCQkJCXByaW50ZigiIGZsYWdzOjB4JXgiLAotCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZ25iYS0+ZmxhZ3MpKTsKLQkJCX0KLQotCQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzE2QklUUygmZ25iYS0+bmFsaWFzZXMpKTsKLQotCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50bmFtZShsLCBzKTsKLQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQlnb3RvIHRydW5jOwotCQkJcyArPSBhZHZhbmNlOwotCi0JCQkvKiBhbGlhc2VzICovCi0JCQluYSA9IEVYVFJBQ1RfMTZCSVRTKCZnbmJhLT5uYWxpYXNlcyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbmE7IGkrKykgewotCQkJCWFkdmFuY2UgPSBsd3Jlc19wcmludG5hbWVsZW4ocyk7Ci0JCQkJaWYgKGFkdmFuY2UgPCAwKQotCQkJCQlnb3RvIHRydW5jOwotCQkJCXMgKz0gYWR2YW5jZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIExXUkVTX09QQ09ERV9HRVRSREFUQUJZTkFNRToKLQkJCS8qIFhYWCBubyB0cmFjZSwgbm90IHRlc3RlZCAqLwotCQkJZ3JibiA9IChsd3Jlc19ncmJucmVzcG9uc2VfdCAqKShucCArIDEpOwotCQkJVENIRUNLKGdyYm4tPm5zaWdzKTsKLQotCQkJLyogQklORDkxMDogbm90IHVzZWQgKi8KLQkJCWlmICh2ZmxhZyA+IDIpIHsKLQkJCQlwcmludGYoIiBmbGFnczoweCV4IiwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmdyYm4tPmZsYWdzKSk7Ci0JCQl9Ci0KLQkJCXByaW50ZigiICVzIiwgdG9rMnN0cihuc190eXBlMnN0ciwgIlR5cGUlZCIsCi0JCQkgICAgRVhUUkFDVF8xNkJJVFMoJmdyYm4tPnJkdHlwZSkpKTsKLQkJCWlmIChFWFRSQUNUXzE2QklUUygmZ3Jibi0+cmRjbGFzcykgIT0gQ19JTikgewotCQkJCXByaW50ZigiICVzIiwgdG9rMnN0cihuc19jbGFzczJzdHIsICJDbGFzcyVkIiwKLQkJCQkgICAgRVhUUkFDVF8xNkJJVFMoJmdyYm4tPnJkY2xhc3MpKSk7Ci0JCQl9Ci0JCQlwcmludGYoIiBUVEwgIik7Ci0JCQlyZWx0c19wcmludChFWFRSQUNUXzMyQklUUygmZ3Jibi0+dHRsKSk7Ci0JCQlwcmludGYoIiAldS8ldSIsIEVYVFJBQ1RfMTZCSVRTKCZncmJuLT5ucmRhdGFzKSwKLQkJCSAgICBFWFRSQUNUXzE2QklUUygmZ3Jibi0+bnNpZ3MpKTsKLQotCQkJLyogWFhYIGdyYm4gcG9pbnRzIHRvIHBhY2tlZCBzdHJ1Y3QgKi8KLQkJCXMgPSAoY29uc3QgY2hhciAqKSZncmJuLT5uc2lncysgc2l6ZW9mKGdyYm4tPm5zaWdzKTsKLQotCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50bmFtZWxlbihzKTsKLQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQlnb3RvIHRydW5jOwotCQkJcyArPSBhZHZhbmNlOwotCi0JCQkvKiByZGF0YXMgKi8KLQkJCW5hID0gRVhUUkFDVF8xNkJJVFMoJmdyYm4tPm5yZGF0YXMpOwotCQkJZm9yIChpID0gMDsgaSA8IG5hOyBpKyspIHsKLQkJCQkvKiBYWFggc2hvdWxkIGRlY29kZSByZXNvdXJjZSBkYXRhICovCi0JCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50YmlubGVuKHMpOwotCQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCQlzICs9IGFkdmFuY2U7Ci0JCQl9Ci0KLQkJCS8qIHNpZ3MgKi8KLQkJCW5hID0gRVhUUkFDVF8xNkJJVFMoJmdyYm4tPm5zaWdzKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBuYTsgaSsrKSB7Ci0JCQkJLyogWFhYIGhvdyBzaG91bGQgd2UgcHJpbnQgaXQ/ICovCi0JCQkJYWR2YW5jZSA9IGx3cmVzX3ByaW50YmlubGVuKHMpOwotCQkJCWlmIChhZHZhbmNlIDwgMCkKLQkJCQkJZ290byB0cnVuYzsKLQkJCQlzICs9IGFkdmFuY2U7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXVuc3VwcG9ydGVkKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotICB0YWlsOgotCS8qIGxlbmd0aCBtaXNtYXRjaCAqLwotCWlmIChFWFRSQUNUXzMyQklUUygmbnAtPmxlbmd0aCkgIT0gbGVuZ3RoKSB7Ci0JCXByaW50ZigiIFtsZW46ICV1ICE9ICV1XSIsIEVYVFJBQ1RfMzJCSVRTKCZucC0+bGVuZ3RoKSwKLQkJICAgIGxlbmd0aCk7Ci0JfQotCWlmICghdW5zdXBwb3J0ZWQgJiYgcyA8IChjb25zdCBjaGFyICopbnAgKyBFWFRSQUNUXzMyQklUUygmbnAtPmxlbmd0aCkpCi0JCXByaW50ZigiW2V4dHJhXSIpOwotCXJldHVybjsKLQotICB0cnVuYzoKLQlwcmludGYoIlt8bHdyZXNdIik7Ci0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtbW9iaWxlLmMgYi9wcmludC1tb2JpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2ZjAxMy4uMDAwMDAwMAotLS0gYS9wcmludC1tb2JpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgkkTmV0QlNEOiBwcmludC1tb2JpbGUuYyx2IDEuMiAxOTk4LzA5LzMwIDA4OjU3OjAxIGh3ciBFeHAgJCAqLwotCi0vKgotICogKGMpIDE5OTggVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCi0gKiBieSBIZWlrbyBXLlJ1cHAgPGh3ckBwaWxodWhuLmRlPgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECi0gKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCi0gKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1tb2JpbGUuYyx2IDEuMTUgMjAwNC8wMy8yNCAwMTo1ODoxNCBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KLQotI2RlZmluZSBNT0JJTEVfU0laRSAoOCkKLQotc3RydWN0IG1vYmlsZV9pcCB7Ci0JdV9pbnQxNl90IHByb3RvOwotCXVfaW50MTZfdCBoY2hlY2s7Ci0JdV9pbnQzMl90IG9kc3Q7Ci0JdV9pbnQzMl90IG9zcmM7Ci19OwotCi0jZGVmaW5lIE9TUkNfUFJFUwkweDAwODAJLyogb2xkIHNvdXJjZSBpcyBwcmVzZW50ICovCi0KLS8qCi0gKiBEZWVuY2Fwc3VsYXRlIGFuZCBwcmludCBhIG1vYmlsZS10dW5uZWxlZCBJUCBkYXRhZ3JhbQotICovCi12b2lkCi1tb2JpbGVfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoKQotewotCWNvbnN0IHVfY2hhciAqY3AgPSBicCArOCA7Ci0JY29uc3Qgc3RydWN0IG1vYmlsZV9pcCAqbW9iOwotCXVfc2hvcnQgcHJvdG8sY3JjOwotCXVfY2hhciBvc3AgPTA7CQkJLyogb2xkIHNvdXJjZSBhZGRyZXNzIHByZXNlbnQgKi8KLQotCW1vYiA9IChjb25zdCBzdHJ1Y3QgbW9iaWxlX2lwICopYnA7Ci0KLQlpZiAobGVuZ3RoIDwgTU9CSUxFX1NJWkUgfHwgIVRURVNUKCptb2IpKSB7Ci0JCWZwdXRzKCJbfG1vYmlsZV0iLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCWZwdXRzKCJtb2JpbGU6ICIsIHN0ZG91dCk7Ci0KLQlwcm90byA9IEVYVFJBQ1RfMTZCSVRTKCZtb2ItPnByb3RvKTsKLQljcmMgPSAgRVhUUkFDVF8xNkJJVFMoJm1vYi0+aGNoZWNrKTsKLQlpZiAocHJvdG8gJiBPU1JDX1BSRVMpIHsKLQkJb3NwPTE7Ci0JCWNwICs9NCA7Ci0JfQotCi0JaWYgKG9zcCkgIHsKLQkJZnB1dHMoIltTXSAiLHN0ZG91dCk7Ci0JCWlmICh2ZmxhZykKLQkJCSh2b2lkKXByaW50ZigiJXMgIixpcGFkZHJfc3RyaW5nKCZtb2ItPm9zcmMpKTsKLQl9IGVsc2UgewotCQlmcHV0cygiW10gIixzdGRvdXQpOwotCX0KLQlpZiAodmZsYWcpIHsKLQkJKHZvaWQpcHJpbnRmKCI+ICVzICIsaXBhZGRyX3N0cmluZygmbW9iLT5vZHN0KSk7Ci0JCSh2b2lkKXByaW50ZigiKG9wcm90bz0lZCkiLHByb3RvPj44KTsKLQl9Ci0JaWYgKGluX2Nrc3VtKCh1X3Nob3J0ICopbW9iLCBvc3AgPyAxMiA6IDgsIDApIT0wKSB7Ci0JCSh2b2lkKXByaW50ZigiIChiYWQgY2hlY2tzdW0gJWQpIixjcmMpOwotCX0KLQotCXJldHVybjsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LW1vYmlsaXR5LmMgYi9wcmludC1tb2JpbGl0eS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjljYmVlLi4wMDAwMDAwCi0tLSBhL3ByaW50LW1vYmlsaXR5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW1vYmlsaXR5LmMsdiAxLjExLjIuMSAyMDA1LzA0LzIwIDIyOjIxOjE2IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIElORVQ2Ci0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpcDYuaCIKLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KLQotLyogTW9iaWxpdHkgaGVhZGVyICovCi1zdHJ1Y3QgaXA2X21vYmlsaXR5IHsKLQl1X2ludDhfdCBpcDZtX3Bwcm90bzsJLyogZm9sbG93aW5nIHBheWxvYWQgcHJvdG9jb2wgKGZvciBQRykgKi8KLQl1X2ludDhfdCBpcDZtX2xlbjsJLyogbGVuZ3RoIGluIHVuaXRzIG9mIDggb2N0ZXRzICovCi0JdV9pbnQ4X3QgaXA2bV90eXBlOwkvKiBtZXNzYWdlIHR5cGUgKi8KLQl1X2ludDhfdCByZXNlcnZlZDsJLyogcmVzZXJ2ZWQgKi8KLQl1X2ludDE2X3QgaXA2bV9ja3N1bTsJLyogc3VtIG9mIElQdjYgcHNldWRvLWhlYWRlciBhbmQgTUggKi8KLQl1bmlvbiB7Ci0JCXVfaW50MTZfdAlpcDZtX3VuX2RhdGExNlsxXTsgLyogdHlwZS1zcGVjaWZpYyBmaWVsZCAqLwotCQl1X2ludDhfdAlpcDZtX3VuX2RhdGE4WzJdOyAgLyogdHlwZS1zcGVjaWZpYyBmaWVkbCAqLwotCX0gaXA2bV9kYXRhdW47Ci19OwotCi0jZGVmaW5lIGlwNm1fZGF0YTE2CWlwNm1fZGF0YXVuLmlwNm1fdW5fZGF0YTE2Ci0jZGVmaW5lIGlwNm1fZGF0YTgJaXA2bV9kYXRhdW4uaXA2bV91bl9kYXRhOAotCi0jZGVmaW5lIElQNk1fTUlOTEVOCTgKLQotLyogbWVzc2FnZSB0eXBlICovCi0jZGVmaW5lIElQNk1fQklORElOR19SRVFVRVNUCTAJLyogQmluZGluZyBSZWZyZXNoIFJlcXVlc3QgKi8KLSNkZWZpbmUgSVA2TV9IT01FX1RFU1RfSU5JVAkxCS8qIEhvbWUgVGVzdCBJbml0ICovCi0jZGVmaW5lIElQNk1fQ0FSRU9GX1RFU1RfSU5JVAkyCS8qIENhcmUtb2YgVGVzdCBJbml0ICovCi0jZGVmaW5lIElQNk1fSE9NRV9URVNUCQkzCS8qIEhvbWUgVGVzdCAqLwotI2RlZmluZSBJUDZNX0NBUkVPRl9URVNUCTQJLyogQ2FyZS1vZiBUZXN0ICovCi0jZGVmaW5lIElQNk1fQklORElOR19VUERBVEUJNQkvKiBCaW5kaW5nIFVwZGF0ZSAqLwotI2RlZmluZSBJUDZNX0JJTkRJTkdfQUNLCTYJLyogQmluZGluZyBBY2tub3dsZWRnZW1lbnQgKi8KLSNkZWZpbmUgSVA2TV9CSU5ESU5HX0VSUk9SCTcJLyogQmluZGluZyBFcnJvciAqLwotCi0vKiBNb2JpbGl0eSBIZWFkZXIgT3B0aW9ucyAqLwotI2RlZmluZSBJUDZNT1BUX01JTkxFTgkJMgotI2RlZmluZSBJUDZNT1BUX1BBRDEgICAgICAgICAgMHgwCS8qIFBhZDEgKi8KLSNkZWZpbmUgSVA2TU9QVF9QQUROICAgICAgICAgIDB4MQkvKiBQYWROICovCi0jZGVmaW5lIElQNk1PUFRfUkVGUkVTSAkgICAgICAweDIJLyogQmluZGluZyBSZWZyZXNoIEFkdmljZSAqLwotI2RlZmluZSBJUDZNT1BUX1JFRlJFU0hfTUlOTEVOICA0Ci0jZGVmaW5lIElQNk1PUFRfQUxUQ09BICAgICAgICAweDMJLyogQWx0ZXJuYXRlIENhcmUtb2YgQWRkcmVzcyAqLwotI2RlZmluZSBJUDZNT1BUX0FMVENPQV9NSU5MRU4gIDE4Ci0jZGVmaW5lIElQNk1PUFRfTk9OQ0VJRCAgICAgICAweDQJLyogTm9uY2UgSW5kaWNlcyAqLwotI2RlZmluZSBJUDZNT1BUX05PTkNFSURfTUlOTEVOICA2Ci0jZGVmaW5lIElQNk1PUFRfQVVUSCAgICAgICAgICAweDUJLyogQmluZGluZyBBdXRob3JpemF0aW9uIERhdGEgKi8KLSNkZWZpbmUgSVA2TU9QVF9BVVRIX01JTkxFTiAgICAxMgotCi1zdGF0aWMgdm9pZAotbW9iaWxpdHlfb3B0X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0JaW50IG9wdGxlbjsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gb3B0bGVuKSB7Ci0JCWlmIChicFtpXSA9PSBJUDZNT1BUX1BBRDEpCi0JCQlvcHRsZW4gPSAxOwotCQllbHNlIHsKLQkJCWlmIChpICsgMSA8IGxlbikKLQkJCQlvcHRsZW4gPSBicFtpICsgMV0gKyAyOwotCQkJZWxzZQotCQkJCWdvdG8gdHJ1bmM7Ci0JCX0KLQkJaWYgKGkgKyBvcHRsZW4gPiBsZW4pCi0JCQlnb3RvIHRydW5jOwotCi0JCXN3aXRjaCAoYnBbaV0pIHsKLQkJY2FzZSBJUDZNT1BUX1BBRDE6Ci0JCQlwcmludGYoIihwYWQxKSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVA2TU9QVF9QQUROOgotCQkJaWYgKGxlbiAtIGkgPCBJUDZNT1BUX01JTkxFTikgewotCQkJCXByaW50ZigiKHBhZG46IHRydW5jKSIpOwotCQkJCWdvdG8gdHJ1bmM7Ci0JCQl9Ci0JCQlwcmludGYoIihwYWRuKSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVA2TU9QVF9SRUZSRVNIOgotCQkJaWYgKGxlbiAtIGkgPCBJUDZNT1BUX1JFRlJFU0hfTUlOTEVOKSB7Ci0JCQkJcHJpbnRmKCIocmVmcmVzaDogdHJ1bmMpIik7Ci0JCQkJZ290byB0cnVuYzsKLQkJCX0KLQkJCS8qIHVuaXRzIG9mIDQgc2VjcyAqLwotCQkJcHJpbnRmKCIocmVmcmVzaDogJWQpIiwKLQkJCQlFWFRSQUNUXzE2QklUUygmYnBbaSsyXSkgPDwgMik7Ci0JCQlicmVhazsKLQkJY2FzZSBJUDZNT1BUX0FMVENPQToKLQkJCWlmIChsZW4gLSBpIDwgSVA2TU9QVF9BTFRDT0FfTUlOTEVOKSB7Ci0JCQkJcHJpbnRmKCIoYWx0Y29hOiB0cnVuYykiKTsKLQkJCQlnb3RvIHRydW5jOwotCQkJfQotCQkJcHJpbnRmKCIoYWx0LUNvQTogJXMpIiwgaXA2YWRkcl9zdHJpbmcoJmJwW2krMl0pKTsKLQkJCWJyZWFrOwotCQljYXNlIElQNk1PUFRfTk9OQ0VJRDoKLQkJCWlmIChsZW4gLSBpIDwgSVA2TU9QVF9OT05DRUlEX01JTkxFTikgewotCQkJCXByaW50ZigiKG5pOiB0cnVuYykiKTsKLQkJCQlnb3RvIHRydW5jOwotCQkJfQotCQkJcHJpbnRmKCIobmk6IGhvPTB4JTA0eCBjbz0weCUwNHgpIiwKLQkJCQlFWFRSQUNUXzE2QklUUygmYnBbaSsyXSksCi0JCQkJRVhUUkFDVF8xNkJJVFMoJmJwW2krNF0pKTsKLQkJCWJyZWFrOwotCQljYXNlIElQNk1PUFRfQVVUSDoKLQkJCWlmIChsZW4gLSBpIDwgSVA2TU9QVF9BVVRIX01JTkxFTikgewotCQkJCXByaW50ZigiKGF1dGg6IHRydW5jKSIpOwotCQkJCWdvdG8gdHJ1bmM7Ci0JCQl9Ci0JCQlwcmludGYoIihhdXRoKSIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAobGVuIC0gaSA8IElQNk1PUFRfTUlOTEVOKSB7Ci0JCQkJcHJpbnRmKCIoc29wdF90eXBlICVkOiB0cnVuYykiLCBicFtpXSk7Ci0JCQkJZ290byB0cnVuYzsKLQkJCX0KLQkJCXByaW50ZigiKHR5cGUtMHglMDJ4OiBsZW49JWQpIiwgYnBbaV0sIGJwW2kgKyAxXSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiW3RydW5jXSAiKTsKLX0KLQotLyoKLSAqIE1vYmlsaXR5IEhlYWRlcgotICovCi1pbnQKLW1vYmlsaXR5X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IHVfY2hhciAqYnAyIF9VXykKLXsKLQljb25zdCBzdHJ1Y3QgaXA2X21vYmlsaXR5ICptaDsKLQljb25zdCB1X2NoYXIgKmVwOwotCWludCBtaGxlbiwgaGxlbiwgdHlwZTsKLQotCW1oID0gKHN0cnVjdCBpcDZfbW9iaWxpdHkgKilicDsKLQotCS8qICdlcCcgcG9pbnRzIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIGRhdGEuICovCi0JZXAgPSBzbmFwZW5kOwotCi0JaWYgKCFUVEVTVChtaC0+aXA2bV9sZW4pKSB7Ci0JCS8qCi0JCSAqIFRoZXJlJ3Mgbm90IGVub3VnaCBjYXB0dXJlZCBkYXRhIHRvIGluY2x1ZGUgdGhlCi0JCSAqIG1vYmlsaXR5IGhlYWRlciBsZW5ndGguCi0JCSAqCi0JCSAqIE91ciBjYWxsZXIgZXhwZWN0cyB1cyB0byByZXR1cm4gdGhlIGxlbmd0aCwgaG93ZXZlciwKLQkJICogc28gcmV0dXJuIGEgdmFsdWUgdGhhdCB3aWxsIHJ1biB0byB0aGUgZW5kIG9mIHRoZQotCQkgKiBjYXB0dXJlZCBkYXRhLgotCQkgKgotCQkgKiBYWFggLSAiaXA2X3ByaW50KCkiIGRvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUKLQkJICogcmV0dXJuZWQgbGVuZ3RoLCBob3dldmVyLCBhcyBpdCBicmVha3Mgb3V0IG9mIHRoZQotCQkgKiBoZWFkZXItcHJvY2Vzc2luZyBsb29wLgotCQkgKi8KLQkJbWhsZW4gPSBlcCAtIGJwOwotCQlnb3RvIHRydW5jOwotCX0KLQltaGxlbiA9IChpbnQpKChtaC0+aXA2bV9sZW4gKyAxKSA8PCAzKTsKLQotCS8qIFhYWCBpcDZtX2Nrc3VtICovCi0KLQlUQ0hFQ0sobWgtPmlwNm1fdHlwZSk7Ci0JdHlwZSA9IG1oLT5pcDZtX3R5cGU7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJUDZNX0JJTkRJTkdfUkVRVUVTVDoKLQkJcHJpbnRmKCJtb2JpbGl0eTogQlJSIik7Ci0JCWhsZW4gPSBJUDZNX01JTkxFTjsKLQkJYnJlYWs7Ci0JY2FzZSBJUDZNX0hPTUVfVEVTVF9JTklUOgotCWNhc2UgSVA2TV9DQVJFT0ZfVEVTVF9JTklUOgotCQlwcmludGYoIm1vYmlsaXR5OiAlc29USSIsCi0JCQl0eXBlID09IElQNk1fSE9NRV9URVNUX0lOSVQgPyAiSCIgOiAiQyIpOwotCQlobGVuID0gSVA2TV9NSU5MRU47Ci0gICAgCQlpZiAodmZsYWcpIHsKLQkJCVRDSEVDSzIoKm1oLCBobGVuICsgOCk7Ci0JCQlwcmludGYoIiAlcyBJbml0IENvb2tpZT0lMDh4OiUwOHgiLAotCQkJICAgICAgIHR5cGUgPT0gSVA2TV9IT01FX1RFU1RfSU5JVCA/ICJIb21lIiA6ICJDYXJlLW9mIiwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmYnBbaGxlbl0pLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZicFtobGVuICsgNF0pKTsKLQkJfQotCQlobGVuICs9IDg7Ci0JCWJyZWFrOwotCWNhc2UgSVA2TV9IT01FX1RFU1Q6Ci0JY2FzZSBJUDZNX0NBUkVPRl9URVNUOgotCQlwcmludGYoIm1vYmlsaXR5OiAlc29UIiwKLQkJCXR5cGUgPT0gSVA2TV9IT01FX1RFU1QgPyAiSCIgOiAiQyIpOwotCQlUQ0hFQ0sobWgtPmlwNm1fZGF0YTE2WzBdKTsKLQkJcHJpbnRmKCIgbm9uY2UgaWQ9MHgleCIsIEVYVFJBQ1RfMTZCSVRTKCZtaC0+aXA2bV9kYXRhMTZbMF0pKTsKLQkJaGxlbiA9IElQNk1fTUlOTEVOOwotICAgIAkJaWYgKHZmbGFnKSB7Ci0JCQlUQ0hFQ0syKCptaCwgaGxlbiArIDgpOwotCQkJcHJpbnRmKCIgJXMgSW5pdCBDb29raWU9JTA4eDolMDh4IiwKLQkJCSAgICAgICB0eXBlID09IElQNk1fSE9NRV9URVNUID8gIkhvbWUiIDogIkNhcmUtb2YiLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZicFtobGVuXSksCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmJwW2hsZW4gKyA0XSkpOwotCQl9Ci0JCWhsZW4gKz0gODsKLSAgICAJCWlmICh2ZmxhZykgewotCQkJVENIRUNLMigqbWgsIGhsZW4gKyA4KTsKLQkJCXByaW50ZigiICVzIEtleWdlbiBUb2tlbj0lMDh4OiUwOHgiLAotCQkJICAgICAgIHR5cGUgPT0gSVA2TV9IT01FX1RFU1QgPyAiSG9tZSIgOiAiQ2FyZS1vZiIsCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmJwW2hsZW5dKSwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmYnBbaGxlbiArIDRdKSk7Ci0JCX0KLQkJaGxlbiArPSA4OwotCQlicmVhazsKLQljYXNlIElQNk1fQklORElOR19VUERBVEU6Ci0JCXByaW50ZigibW9iaWxpdHk6IEJVIik7Ci0JCVRDSEVDSyhtaC0+aXA2bV9kYXRhMTZbMF0pOwotCQlwcmludGYoIiBzZXEjPSVkIiwgRVhUUkFDVF8xNkJJVFMoJm1oLT5pcDZtX2RhdGExNlswXSkpOwotCQlobGVuID0gSVA2TV9NSU5MRU47Ci0JCVRDSEVDSzIoKm1oLCBobGVuICsgMSk7Ci0JCWlmIChicFtobGVuXSAmIDB4ZjApCi0JCQlwcmludGYoIiAiKTsKLQkJaWYgKGJwW2hsZW5dICYgMHg4MCkKLQkJCXByaW50ZigiQSIpOwotCQlpZiAoYnBbaGxlbl0gJiAweDQwKQotCQkJcHJpbnRmKCJIIik7Ci0JCWlmIChicFtobGVuXSAmIDB4MjApCi0JCQlwcmludGYoIkwiKTsKLQkJaWYgKGJwW2hsZW5dICYgMHgxMCkKLQkJCXByaW50ZigiSyIpOwotCQkvKiBSZXNlcnZlZCAoNGJpdHMpICovCi0JCWhsZW4gKz0gMTsKLQkJLyogUmVzZXJ2ZWQgKDhiaXRzKSAqLwotCQlobGVuICs9IDE7Ci0JCVRDSEVDSzIoKm1oLCBobGVuICsgMik7Ci0JCS8qIHVuaXRzIG9mIDQgc2VjcyAqLwotCQlwcmludGYoIiBsaWZldGltZT0lZCIsIEVYVFJBQ1RfMTZCSVRTKCZicFtobGVuXSkgPDwgMik7Ci0JCWhsZW4gKz0gMjsKLQkJYnJlYWs7Ci0JY2FzZSBJUDZNX0JJTkRJTkdfQUNLOgotCQlwcmludGYoIm1vYmlsaXR5OiBCQSIpOwotCQlUQ0hFQ0sobWgtPmlwNm1fZGF0YThbMF0pOwotCQlwcmludGYoIiBzdGF0dXM9JWQiLCBtaC0+aXA2bV9kYXRhOFswXSk7Ci0JCWlmIChtaC0+aXA2bV9kYXRhOFsxXSAmIDB4ODApCi0JCQlwcmludGYoIiBLIik7Ci0JCS8qIFJlc2VydmVkICg3Yml0cykgKi8KLQkJaGxlbiA9IElQNk1fTUlOTEVOOwotCQlUQ0hFQ0syKCptaCwgaGxlbiArIDIpOwotCQlwcmludGYoIiBzZXEjPSVkIiwgRVhUUkFDVF8xNkJJVFMoJmJwW2hsZW5dKSk7Ci0JCWhsZW4gKz0gMjsKLQkJVENIRUNLMigqbWgsIGhsZW4gKyAyKTsKLQkJLyogdW5pdHMgb2YgNCBzZWNzICovCi0JCXByaW50ZigiIGxpZmV0aW1lPSVkIiwgRVhUUkFDVF8xNkJJVFMoJmJwW2hsZW5dKSA8PCAyKTsKLQkJaGxlbiArPSAyOwotCQlicmVhazsKLQljYXNlIElQNk1fQklORElOR19FUlJPUjoKLQkJcHJpbnRmKCJtb2JpbGl0eTogQkUiKTsKLQkJVENIRUNLKG1oLT5pcDZtX2RhdGE4WzBdKTsKLQkJcHJpbnRmKCIgc3RhdHVzPSVkIiwgbWgtPmlwNm1fZGF0YThbMF0pOwotCQkvKiBSZXNlcnZlZCAqLwotCQlobGVuID0gSVA2TV9NSU5MRU47Ci0JCVRDSEVDSzIoKm1oLCBobGVuICsgMTYpOwotCQlwcmludGYoIiBob21lYWRkciAlcyIsIGlwNmFkZHJfc3RyaW5nKCZicFtobGVuXSkpOwotCQlobGVuICs9IDE2OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIm1vYmlsaXR5OiB0eXBlLSMlZCBsZW49JWQiLCB0eXBlLCBtaC0+aXA2bV9sZW4pOwotCQlyZXR1cm4obWhsZW4pOwotCQlicmVhazsKLQl9Ci0gICAgCWlmICh2ZmxhZykKLQkJbW9iaWxpdHlfb3B0X3ByaW50KCZicFtobGVuXSwgbWhsZW4gLSBobGVuKTsKLQotCXJldHVybihtaGxlbik7Ci0KLSB0cnVuYzoKLQlmcHV0cygiW3xNT0JJTElUWV0iLCBzdGRvdXQpOwotCXJldHVybihtaGxlbik7Ci19Ci0jZW5kaWYgLyogSU5FVDYgKi8KZGlmZiAtLWdpdCBhL3ByaW50LW1wbHMuYyBiL3ByaW50LW1wbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1NDU2Ny4uMDAwMDAwMAotLS0gYS9wcmludC1tcGxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBXSURFIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1tcGxzLmMsdiAxLjEzLjIuMSAyMDA1LzA3LzA1IDA5OjM5OjI5IGhhbm5lcyBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotI2luY2x1ZGUgIm1wbHMuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1wbHNfbGFiZWxuYW1lW10gPSB7Ci0vKjAqLwkiSVB2NCBleHBsaWNpdCBOVUxMIiwgInJvdXRlciBhbGVydCIsICJJUHY2IGV4cGxpY2l0IE5VTEwiLAotCSJpbXBsaWNpdCBOVUxMIiwgInJzdmQiLAotLyo1Ki8JInJzdmQiLCAicnN2ZCIsICJyc3ZkIiwgInJzdmQiLCAicnN2ZCIsCi0vKjEwKi8JInJzdmQiLCAicnN2ZCIsICJyc3ZkIiwgInJzdmQiLCAicnN2ZCIsCi0vKjE1Ki8JInJzdmQiLAotfTsKLQotLyoKLSAqIFJGQzMwMzI6IE1QTFMgbGFiZWwgc3RhY2sgZW5jb2RpbmcKLSAqLwotdm9pZAotbXBsc19wcmludChjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCi17Ci0JY29uc3QgdV9jaGFyICpwOwotCXVfaW50MzJfdCBsYWJlbF9lbnRyeTsKLSAgICAgICAgdV9pbnQxNl90IGxhYmVsX3N0YWNrX2RlcHRoID0gMDsKLQotCXAgPSBicDsKLQlwcmludGYoIk1QTFMiKTsKLQlkbyB7Ci0JCVRDSEVDSzIoKnAsIHNpemVvZihsYWJlbF9lbnRyeSkpOwotCQlsYWJlbF9lbnRyeSA9IEVYVFJBQ1RfMzJCSVRTKHApOwotCQlwcmludGYoIiVzKGxhYmVsICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxfc3RhY2tfZGVwdGggPyAiXG5cdCIgOiAiICIsCi0gICAgICAgICAgICAgICAgICAgICAgIE1QTFNfTEFCRUwobGFiZWxfZW50cnkpKTsKLSAgICAgICAgICAgICAgICBsYWJlbF9zdGFja19kZXB0aCsrOwotCQlpZiAodmZsYWcgJiYKLQkJICAgIE1QTFNfTEFCRUwobGFiZWxfZW50cnkpIDwgc2l6ZW9mKG1wbHNfbGFiZWxuYW1lKSAvIHNpemVvZihtcGxzX2xhYmVsbmFtZVswXSkpCi0JCQlwcmludGYoIiAoJXMpIiwgbXBsc19sYWJlbG5hbWVbTVBMU19MQUJFTChsYWJlbF9lbnRyeSldKTsKLQkJcHJpbnRmKCIsIGV4cCAldSIsIE1QTFNfRVhQKGxhYmVsX2VudHJ5KSk7Ci0JCWlmIChNUExTX1NUQUNLKGxhYmVsX2VudHJ5KSkKLQkJCXByaW50ZigiLCBbU10iKTsKLQkJcHJpbnRmKCIsIHR0bCAldSkiLCBNUExTX1RUTChsYWJlbF9lbnRyeSkpOwotCi0JCXAgKz0gc2l6ZW9mKGxhYmVsX2VudHJ5KTsKLQl9IHdoaWxlICghTVBMU19TVEFDSyhsYWJlbF9lbnRyeSkpOwotCi0Jc3dpdGNoIChNUExTX0xBQkVMKGxhYmVsX2VudHJ5KSkgewotCWNhc2UgMDoJLyogSVB2NCBleHBsaWNpdCBOVUxMIGxhYmVsICovCi0gICAgICAgIGNhc2UgMzoJLyogSVB2NCBpbXBsaWNpdCBOVUxMIGxhYmVsICovCi0gICAgICAgICAgICAgICAgaWYgKHZmbGFnPjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoIC0gKHAgLSBicCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHByaW50ZigiLCBJUCwgbGVuZ3RoOiAldSIsbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIDI6CS8qIElQdjYgZXhwbGljaXQgTlVMTCBsYWJlbCAqLwotICAgICAgICAgICAgICAgIGlmICh2ZmxhZz4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlwNl9wcmludChwLCBsZW5ndGggLSAocCAtIGJwKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgcHJpbnRmKCIsIElQdjYsIGxlbmd0aDogJXUiLGxlbmd0aCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJLyoKLQkJICogR2VuZXJhbGx5IHRoZXJlJ3Mgbm8gaW5kaWNhdGlvbiBvZiBwcm90b2NvbCBpbiBNUExTIGxhYmVsCi0JCSAqIGVuY29kaW5nLCBob3dldmVyIGRyYWZ0LWhzbWl0LWlzaXMtYWFsNW11eC0wMC50eHQgZGVzY3JpYmVzCi0gICAgICAgICAgICAgICAgICogYSB0ZWNobmlxdWUgdGhhdCBsb29rcyBhdCB0aGUgZmlyc3QgcGF5bG9hZCBieXRlIGlmIHRoZSBCT1MgKGJvdHRvbSBvZiBzdGFjaykKLSAgICAgICAgICAgICAgICAgKiBiaXQgaXMgc2V0IGFuZCB0cmllcyB0byBkZXRlcm1pbmUgdGhlIG5ldHdvcmsgbGF5ZXIgcHJvdG9jb2wKLSAgICAgICAgICAgICAgICAgKiAweDQ1LTB4NGYgaXMgSVB2NAotICAgICAgICAgICAgICAgICAqIDB4NjAtMHg2ZiBpcyBJUHY2Ci0gICAgICAgICAgICAgICAgICogMHg4MS0weDgzIGlzIE9TSSAoQ0xOUCxFUy1JUyxJUy1JUykKLSAgICAgICAgICAgICAgICAgKiB0aGlzIHRlY2huaXF1ZSBpcyBzb21ldGltZXMga25vd24gYXMgTlVMTCBlbmNhcHN1bGF0aW9uCi0gICAgICAgICAgICAgICAgICogYW5kIGRlY29kaW5nIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGNvbnRyb2wtcGxhbmUgdHJhZmZpYyBbQkdQXQotICAgICAgICAgICAgICAgICAqIHdoaWNoIGNpc2NvIGJ5IGRlZmF1bHQgc2VuZHMgTVBMUyBlbmNhcHN1bGF0ZWQKLQkJICovCi0KLSAgICAgICAgICAgICAgICBpZiAoTVBMU19TVEFDSyhsYWJlbF9lbnRyeSkpIHsgLyogb25seSBkbyB0aGlzIGlmIHRoZSBzdGFjayBiaXQgaXMgc2V0ICovCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCgqcCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0NjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDQ3OgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NDg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0OToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDRhOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NGI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0YzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDRkOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NGU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg0ZjoKLQkJICAgICAgICBpZiAodmZsYWc+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwX3ByaW50KGduZG8sIHAsIGxlbmd0aCAtIChwIC0gYnApKTsKLQkJCSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHByaW50ZigiLCBJUCwgbGVuZ3RoOiAldSIsbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2MDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDYxOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2MzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY0OgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NjU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2NjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDY3OgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4Njg6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2OToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDZhOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmI6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2YzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDZkOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4NmU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg2ZjoKLQkJICAgICAgICBpZiAodmZsYWc+MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwNl9wcmludChwLCBsZW5ndGggLSAocCAtIGJwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJZWxzZSBwcmludGYoIiwgSVB2NiwgbGVuZ3RoOiAldSIsbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHg4MToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDgyOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ODM6Ci0JCSAgICAgICAgaWYgKHZmbGFnPjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29jbG5zX3ByaW50KHAsIGxlbmd0aCAtIChwIC0gYnApLCBsZW5ndGggLSAocCAtIGJwKSk7Ci0JCQkgICAgfQotCQkJZWxzZSBwcmludGYoIiwgT1NJLCBsZW5ndGg6ICV1IixsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBvayBiYWlsIG91dCAtIHdlIGRpZCBub3QgZmlndXJlIG91dCB3aGF0IGl0IGlzKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLQl9Ci0KLXRydW5jOgotCXByaW50ZigiW3xNUExTXSIpOwotfQotCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1tc2RwLmMgYi9wcmludC1tc2RwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNzliNjguLjAwMDAwMDAKLS0tIGEvcHJpbnQtbXNkcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgV2lsbGlhbSBDLiBGZW5uZXIuCi0gKiAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBuYW1lIG9mIFdpbGxpYW0gQy4gRmVubmVyIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yCi0gKiBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4gIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbXNkcC5jLHYgMS43IDIwMDUvMDQvMDYgMjE6MzI6NDEgbWNyIEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLSNkZWZpbmUgTVNEUF9UWVBFX01BWAk3Ci0KLXZvaWQKLW1zZHBfcHJpbnQoY29uc3QgdW5zaWduZWQgY2hhciAqc3AsIHVfaW50IGxlbmd0aCkKLXsKLQl1bnNpZ25lZCBpbnQgdHlwZSwgbGVuOwotCi0JVENIRUNLMigqc3AsIDMpOwotCS8qIFNlZSBpZiB3ZSB0aGluayB3ZSdyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY29tcG91bmQgcGFja2V0ICovCi0JdHlwZSA9ICpzcDsKLQlsZW4gPSBFWFRSQUNUXzE2QklUUyhzcCArIDEpOwotCWlmIChsZW4gPiAxNTAwIHx8IGxlbiA8IDMgfHwgdHlwZSA9PSAwIHx8IHR5cGUgPiBNU0RQX1RZUEVfTUFYKQotCQlnb3RvIHRydW5jOwkvKiBub3QgcmVhbGx5IHRydW5jYXRlZCwgYnV0IHN0aWxsIG5vdCBkZWNvZGFibGUgKi8KLQkodm9pZClwcmludGYoIiBtc2RwOiIpOwotCXdoaWxlIChsZW5ndGggPiAwKSB7Ci0JCVRDSEVDSzIoKnNwLCAzKTsKLQkJdHlwZSA9ICpzcDsKLQkJbGVuID0gRVhUUkFDVF8xNkJJVFMoc3AgKyAxKTsKLQkJaWYgKGxlbiA+IDE0MDAgfHwgdmZsYWcpCi0JCQlwcmludGYoIiBbbGVuICV1XSIsIGxlbik7Ci0JCWlmIChsZW4gPCAzKQotCQkJZ290byB0cnVuYzsKLQkJc3AgKz0gMzsKLQkJbGVuZ3RoIC09IDM7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDE6CS8qIElQdjQgU291cmNlLUFjdGl2ZSAqLwotCQljYXNlIDM6IC8qIElQdjQgU291cmNlLUFjdGl2ZSBSZXNwb25zZSAqLwotCQkJaWYgKHR5cGUgPT0gMSkKLQkJCQkodm9pZClwcmludGYoIiBTQSIpOwotCQkJZWxzZQotCQkJCSh2b2lkKXByaW50ZigiIFNBLVJlc3BvbnNlIik7Ci0JCQlUQ0hFQ0soKnNwKTsKLQkJCSh2b2lkKXByaW50ZigiICV1IGVudHJpZXMiLCAqc3ApOwotCQkJaWYgKCh1X2ludCkoKCpzcCAqIDEyKSArIDgpIDwgbGVuKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgW3cvZGF0YV0iKTsKLQkJCQlpZiAodmZsYWcgPiAxKSB7Ci0JCQkJCSh2b2lkKXByaW50ZigiICIpOwotCQkJCQlpcF9wcmludChnbmRvLCBzcCArICpzcCAqIDEyICsgOCAtIDMsCi0JCQkJCSAgICAgICAgIGxlbiAtICgqc3AgKiAxMiArIDgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJKHZvaWQpcHJpbnRmKCIgU0EtUmVxdWVzdCIpOwotCQkJVENIRUNLMigqc3AsIDUpOwotCQkJKHZvaWQpcHJpbnRmKCIgZm9yICVzIiwgaXBhZGRyX3N0cmluZyhzcCArIDEpKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQkodm9pZClwcmludGYoIiBLZWVwYWxpdmUiKTsKLQkJCWlmIChsZW4gIT0gMykKLQkJCQkodm9pZClwcmludGYoIltsZW49JWRdICIsIGxlbik7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgotCQkJKHZvaWQpcHJpbnRmKCIgTm90aWZpY2F0aW9uIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCSh2b2lkKXByaW50ZigiIFt0eXBlPSVkIGxlbj0lZF0iLCB0eXBlLCBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQkJc3AgKz0gKGxlbiAtIDMpOwotCQlsZW5ndGggLT0gKGxlbiAtIDMpOwotCX0KLQlyZXR1cm47Ci10cnVuYzoKLQkodm9pZClwcmludGYoIiBbfG1zZHBdIik7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1uZXRiaW9zLmMgYi9wcmludC1uZXRiaW9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOTk1M2MuLjAwMDAwMDAKLS0tIGEvcHJpbnQtbmV0Ymlvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NgotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIEZvcm1hdCBhbmQgcHJpbnQgTkVUQklPUyBwYWNrZXRzLgotICogQ29udHJpYnV0ZWQgYnkgQnJhZCBQYXJrZXIgKGJyYWRAZmNyLmNvbSkuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbmV0Ymlvcy5jLHYgMS4yMCAyMDAzLzExLzE2IDA5OjM2OjI5IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAibmV0Ymlvcy5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotLyoKLSAqIFByaW50IE5FVEJJT1MgcGFja2V0cy4KLSAqLwotdm9pZAotbmV0Ymlvc19wcmludChzdHJ1Y3QgcDgwMjJIZHIgKm5iLCB1X2ludCBsZW5ndGgpCi17Ci0JaWYgKGxlbmd0aCA8IHA4MDIyU2l6ZSkgewotCQkodm9pZClwcmludGYoIiB0cnVuY2F0ZWQtbmV0YmlvcyAlZCIsIGxlbmd0aCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAobmItPmZsYWdzID09IFVJKSB7Ci0JICAgICh2b2lkKXByaW50ZigiODAyLjEgVUkgIik7Ci0JfSBlbHNlIHsKLQkgICAgKHZvaWQpcHJpbnRmKCI4MDIuMSBDT05OICIpOwotCX0KLQotCWlmICgodV9jaGFyICopKG5iICsgMSkgPiBzbmFwZW5kKSB7Ci0JCXByaW50ZigiIFt8bmV0Ymlvc10iKTsKLQkJcmV0dXJuOwotCX0KLQotLyoKLQluZXRiaW9zX2RlY29kZShuYiwgKHVfY2hhciAqKW5iICsgcDgwMjJTaXplLCBsZW5ndGggLSBwODAyMlNpemUpOwotKi8KLX0KLQotI2lmZGVmIG5ldmVyCi0JKHZvaWQpcHJpbnRmKCIlcy4lZCA+ICIsCi0JCSAgICAgaXB4YWRkcl9zdHJpbmcoRVhUUkFDVF8zMkJJVFMoaXB4LT5zcmNOZXQpLCBpcHgtPnNyY05vZGUpLAotCQkgICAgIEVYVFJBQ1RfMTZCSVRTKGlweC0+c3JjU2t0KSk7Ci0KLQkodm9pZClwcmludGYoIiVzLiVkOiIsCi0JCSAgICAgaXB4YWRkcl9zdHJpbmcoRVhUUkFDVF8zMkJJVFMoaXB4LT5kc3ROZXQpLCBpcHgtPmRzdE5vZGUpLAotCQkgICAgIEVYVFJBQ1RfMTZCSVRTKGlweC0+ZHN0U2t0KSk7Ci0KLQlpZiAoKHVfY2hhciAqKShpcHggKyAxKSA+IHNuYXBlbmQpIHsKLQkJcHJpbnRmKCIgW3xpcHhdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiB0YWtlIGxlbmd0aCBmcm9tIGlweCBoZWFkZXIgKi8KLQlsZW5ndGggPSBFWFRSQUNUXzE2QklUUygmaXB4LT5sZW5ndGgpOwotCi0JaXB4X2RlY29kZShpcHgsICh1X2NoYXIgKilpcHggKyBpcHhTaXplLCBsZW5ndGggLSBpcHhTaXplKTsKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9wcmludC1uZnMuYyBiL3ByaW50LW5mcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWU4ODY5Li4wMDAwMDAwCi0tLSBhL3ByaW50LW5mcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtbmZzLmMsdiAxLjEwNi4yLjQgMjAwNy8wNi8xNSAyMzoxNzo0MCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxwY2FwLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLSNpbmNsdWRlICJuZnMuaCIKLSNpbmNsdWRlICJuZnNmaC5oIgotCi0jaW5jbHVkZSAiaXAuaCIKLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwNi5oIgotI2VuZGlmCi0jaW5jbHVkZSAicnBjX2F1dGguaCIKLSNpbmNsdWRlICJycGNfbXNnLmgiCi0KLXN0YXRpYyB2b2lkIG5mc19wcmludGZoKGNvbnN0IHVfaW50MzJfdCAqLCBjb25zdCB1X2ludCk7Ci1zdGF0aWMgdm9pZCB4aWRfbWFwX2VudGVyKGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICosIGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyBpbnQzMl90IHhpZF9tYXBfZmluZChjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqLCBjb25zdCB1X2NoYXIgKiwKLQkJCSAgICB1X2ludDMyX3QgKiwgdV9pbnQzMl90ICopOwotc3RhdGljIHZvaWQgaW50ZXJwX3JlcGx5KGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICosIHVfaW50MzJfdCwgdV9pbnQzMl90LCBpbnQpOwotc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqcGFyc2VfcG9zdF9vcF9hdHRyKGNvbnN0IHVfaW50MzJfdCAqLCBpbnQpOwotc3RhdGljIHZvaWQgcHJpbnRfc2F0dHIzKGNvbnN0IHN0cnVjdCBuZnN2M19zYXR0ciAqc2EzLCBpbnQgdmVyYm9zZSk7Ci1zdGF0aWMgdm9pZCBwcmludF9uZnNhZGRyKGNvbnN0IHVfY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0KLS8qCi0gKiBNYXBwaW5nIG9mIG9sZCBORlMgVmVyc2lvbiAyIFJQQyBudW1iZXJzIHRvIGdlbmVyaWMgbnVtYmVycy4KLSAqLwotdV9pbnQzMl90IG5mc3YzX3Byb2NpZFtORlNfTlBST0NTXSA9IHsKLQlORlNQUk9DX05VTEwsCi0JTkZTUFJPQ19HRVRBVFRSLAotCU5GU1BST0NfU0VUQVRUUiwKLQlORlNQUk9DX05PT1AsCi0JTkZTUFJPQ19MT09LVVAsCi0JTkZTUFJPQ19SRUFETElOSywKLQlORlNQUk9DX1JFQUQsCi0JTkZTUFJPQ19OT09QLAotCU5GU1BST0NfV1JJVEUsCi0JTkZTUFJPQ19DUkVBVEUsCi0JTkZTUFJPQ19SRU1PVkUsCi0JTkZTUFJPQ19SRU5BTUUsCi0JTkZTUFJPQ19MSU5LLAotCU5GU1BST0NfU1lNTElOSywKLQlORlNQUk9DX01LRElSLAotCU5GU1BST0NfUk1ESVIsCi0JTkZTUFJPQ19SRUFERElSLAotCU5GU1BST0NfRlNTVEFULAotCU5GU1BST0NfTk9PUCwKLQlORlNQUk9DX05PT1AsCi0JTkZTUFJPQ19OT09QLAotCU5GU1BST0NfTk9PUCwKLQlORlNQUk9DX05PT1AsCi0JTkZTUFJPQ19OT09QLAotCU5GU1BST0NfTk9PUCwKLQlORlNQUk9DX05PT1AKLX07Ci0KLS8qCi0gKiBORlMgVjIgYW5kIFYzIHN0YXR1cyB2YWx1ZXMuCi0gKgotICogU29tZSBvZiB0aGVzZSBjb21lIGZyb20gdGhlIFJGQ3MgZm9yIE5GUyBWMiBhbmQgVjMsIHdpdGggdGhlIG1lc3NhZ2UKLSAqIHN0cmluZ3MgdGFrZW4gZnJvbSB0aGUgRnJlZUJTRCBDIGxpYnJhcnkgImVycmxzdC5jIi4KLSAqCi0gKiBPdGhlcnMgYXJlIGVycm9ycyB0aGF0IGFyZSBub3QgaW4gdGhlIFJGQyBidXQgdGhhdCBJIHN1c3BlY3Qgc29tZQotICogTkZTIHNlcnZlcnMgY291bGQgcmV0dXJuOyB0aGUgdmFsdWVzIGFyZSBGcmVlQlNEIGVycm5vIHZhbHVlcywgYXMKLSAqIHRoZSBmaXJzdCBORlMgc2VydmVyIHdhcyB0aGUgU3VuT1MgMi4wIG9uZSwgYW5kIHVudGlsIDUuMCBTdW5PUwotICogd2FzIHByaW1hcmlseSBCU0QtZGVyaXZlZC4KLSAqLwotc3RhdGljIHN0cnVjdCB0b2sgc3RhdHVzMnN0cltdID0gewotCXsgMSwgICAgICJPcGVyYXRpb24gbm90IHBlcm1pdHRlZCIgfSwJLyogRVBFUk0gKi8KLQl7IDIsICAgICAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgfSwJLyogRU5PRU5UICovCi0JeyA1LCAgICAgIklucHV0L291dHB1dCBlcnJvciIgfSwJLyogRUlPICovCi0JeyA2LCAgICAgIkRldmljZSBub3QgY29uZmlndXJlZCIgfSwJLyogRU5YSU8gKi8KLQl7IDExLCAgICAiUmVzb3VyY2UgZGVhZGxvY2sgYXZvaWRlZCIgfSwJLyogRURFQURMSyAqLwotCXsgMTIsICAgICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IiB9LAkvKiBFTk9NRU0gKi8KLQl7IDEzLCAgICAiUGVybWlzc2lvbiBkZW5pZWQiIH0sCQkvKiBFQUNDRVMgKi8KLQl7IDE3LCAgICAiRmlsZSBleGlzdHMiIH0sCQkvKiBFRVhJU1QgKi8KLQl7IDE4LCAgICAiQ3Jvc3MtZGV2aWNlIGxpbmsiIH0sCQkvKiBFWERFViAqLwotCXsgMTksICAgICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBieSBkZXZpY2UiIH0sIC8qIEVOT0RFViAqLwotCXsgMjAsICAgICJOb3QgYSBkaXJlY3RvcnkiIH0sCQkvKiBFTk9URElSICovCi0JeyAyMSwgICAgIklzIGEgZGlyZWN0b3J5IiB9LAkJLyogRUlTRElSICovCi0JeyAyMiwgICAgIkludmFsaWQgYXJndW1lbnQiIH0sCQkvKiBFSU5WQUwgKi8KLQl7IDI2LCAgICAiVGV4dCBmaWxlIGJ1c3kiIH0sCQkvKiBFVFhUQlNZICovCi0JeyAyNywgICAgIkZpbGUgdG9vIGxhcmdlIiB9LAkJLyogRUZCSUcgKi8KLQl7IDI4LCAgICAiTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UiIH0sCS8qIEVOT1NQQyAqLwotCXsgMzAsICAgICJSZWFkLW9ubHkgZmlsZSBzeXN0ZW0iIH0sCS8qIEVST0ZTICovCi0JeyAzMSwgICAgIlRvbyBtYW55IGxpbmtzIiB9LAkJLyogRU1MSU5LICovCi0JeyA0NSwgICAgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIiB9LAkvKiBFT1BOT1RTVVBQICovCi0JeyA2MiwgICAgIlRvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcyIgfSwgLyogRUxPT1AgKi8KLQl7IDYzLCAgICAiRmlsZSBuYW1lIHRvbyBsb25nIiB9LAkvKiBFTkFNRVRPT0xPTkcgKi8KLQl7IDY2LCAgICAiRGlyZWN0b3J5IG5vdCBlbXB0eSIgfSwJLyogRU5PVEVNUFRZICovCi0JeyA2OSwgICAgIkRpc2MgcXVvdGEgZXhjZWVkZWQiIH0sCS8qIEVEUVVPVCAqLwotCXsgNzAsICAgICJTdGFsZSBORlMgZmlsZSBoYW5kbGUiIH0sCS8qIEVTVEFMRSAqLwotCXsgNzEsICAgICJUb28gbWFueSBsZXZlbHMgb2YgcmVtb3RlIGluIHBhdGgiIH0sIC8qIEVSRU1PVEUgKi8KLQl7IDk5LCAgICAiV3JpdGUgY2FjaGUgZmx1c2hlZCB0byBkaXNrIiB9LCAvKiBORlNFUlJfV0ZMVVNIIChub3QgdXNlZCkgKi8KLQl7IDEwMDAxLCAiSWxsZWdhbCBORlMgZmlsZSBoYW5kbGUiIH0sCS8qIE5GUzNFUlJfQkFESEFORExFICovCi0JeyAxMDAwMiwgIlVwZGF0ZSBzeW5jaHJvbml6YXRpb24gbWlzbWF0Y2giIH0sIC8qIE5GUzNFUlJfTk9UX1NZTkMgKi8KLQl7IDEwMDAzLCAiUkVBRERJUi9SRUFERElSUExVUyBjb29raWUgaXMgc3RhbGUiIH0sIC8qIE5GUzNFUlJfQkFEX0NPT0tJRSAqLwotCXsgMTAwMDQsICJPcGVyYXRpb24gbm90IHN1cHBvcnRlZCIgfSwJLyogTkZTM0VSUl9OT1RTVVBQICovCi0JeyAxMDAwNSwgIkJ1ZmZlciBvciByZXF1ZXN0IGlzIHRvbyBzbWFsbCIgfSwgLyogTkZTM0VSUl9UT09TTUFMTCAqLwotCXsgMTAwMDYsICJVbnNwZWNpZmllZCBlcnJvciBvbiBzZXJ2ZXIiIH0sIC8qIE5GUzNFUlJfU0VSVkVSRkFVTFQgKi8KLQl7IDEwMDA3LCAiT2JqZWN0IG9mIHRoYXQgdHlwZSBub3Qgc3VwcG9ydGVkIiB9LCAvKiBORlMzRVJSX0JBRFRZUEUgKi8KLQl7IDEwMDA4LCAiUmVxdWVzdCBjb3VsZG4ndCBiZSBjb21wbGV0ZWQgaW4gdGltZSIgfSwgLyogTkZTM0VSUl9KVUtFQk9YICovCi0JeyAwLCAgICAgTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBuZnN2M193cml0ZW1vZGVzW10gPSB7Ci0JeyAwLAkJInVuc3RhYmxlIiB9LAotCXsgMSwJCSJkYXRhc3luYyIgfSwKLQl7IDIsCQkiZmlsZXN5bmMiIH0sCi0JeyAwLAkJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayB0eXBlMnN0cltdID0gewotCXsgTkZOT04sCSJOT04iIH0sCi0JeyBORlJFRywJIlJFRyIgfSwKLQl7IE5GRElSLAkiRElSIiB9LAotCXsgTkZCTEssCSJCTEsiIH0sCi0JeyBORkNIUiwJIkNIUiIgfSwKLQl7IE5GTE5LLAkiTE5LIiB9LAotCXsgTkZGSUZPLAkiRklGTyIgfSwKLQl7IDAsCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9uZnNhZGRyKGNvbnN0IHVfY2hhciAqYnAsIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmQpCi17Ci0Jc3RydWN0IGlwICppcDsKLSNpZmRlZiBJTkVUNgotCXN0cnVjdCBpcDZfaGRyICppcDY7Ci0JY2hhciBzcmNhZGRyW0lORVQ2X0FERFJTVFJMRU5dLCBkc3RhZGRyW0lORVQ2X0FERFJTVFJMRU5dOwotI2Vsc2UKLSNpZm5kZWYgSU5FVF9BRERSU1RSTEVOCi0jZGVmaW5lIElORVRfQUREUlNUUkxFTgkxNgotI2VuZGlmCi0JY2hhciBzcmNhZGRyW0lORVRfQUREUlNUUkxFTl0sIGRzdGFkZHJbSU5FVF9BRERSU1RSTEVOXTsKLSNlbmRpZgotCi0Jc3JjYWRkclswXSA9IGRzdGFkZHJbMF0gPSAnXDAnOwotCXN3aXRjaCAoSVBfVigoc3RydWN0IGlwICopYnApKSB7Ci0JY2FzZSA0OgotCQlpcCA9IChzdHJ1Y3QgaXAgKilicDsKLQkJc3RybGNweShzcmNhZGRyLCBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwgc2l6ZW9mKHNyY2FkZHIpKTsKLQkJc3RybGNweShkc3RhZGRyLCBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSwgc2l6ZW9mKGRzdGFkZHIpKTsKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQljYXNlIDY6Ci0JCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwOwotCQlzdHJsY3B5KHNyY2FkZHIsIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9zcmMpLAotCQkgICAgc2l6ZW9mKHNyY2FkZHIpKTsKLQkJc3RybGNweShkc3RhZGRyLCBpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSwKLQkJICAgIHNpemVvZihkc3RhZGRyKSk7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJc3RybGNweShzcmNhZGRyLCAiPyIsIHNpemVvZihzcmNhZGRyKSk7Ci0JCXN0cmxjcHkoZHN0YWRkciwgIj8iLCBzaXplb2YoZHN0YWRkcikpOwotCQlicmVhazsKLQl9Ci0KLQkodm9pZClwcmludGYoIiVzLiVzID4gJXMuJXM6ICIsIHNyY2FkZHIsIHMsIGRzdGFkZHIsIGQpOwotfQotCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlX3NhdHRyMyhjb25zdCB1X2ludDMyX3QgKmRwLCBzdHJ1Y3QgbmZzdjNfc2F0dHIgKnNhMykKLXsKLQlUQ0hFQ0soZHBbMF0pOwotCXNhMy0+c2FfbW9kZXNldCA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKLQlkcCsrOwotCWlmIChzYTMtPnNhX21vZGVzZXQpIHsKLQkJVENIRUNLKGRwWzBdKTsKLQkJc2EzLT5zYV9tb2RlID0gRVhUUkFDVF8zMkJJVFMoZHApOwotCQlkcCsrOwotCX0KLQotCVRDSEVDSyhkcFswXSk7Ci0Jc2EzLT5zYV91aWRzZXQgPSBFWFRSQUNUXzMyQklUUyhkcCk7Ci0JZHArKzsKLQlpZiAoc2EzLT5zYV91aWRzZXQpIHsKLQkJVENIRUNLKGRwWzBdKTsKLQkJc2EzLT5zYV91aWQgPSBFWFRSQUNUXzMyQklUUyhkcCk7Ci0JCWRwKys7Ci0JfQotCi0JVENIRUNLKGRwWzBdKTsKLQlzYTMtPnNhX2dpZHNldCA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKLQlkcCsrOwotCWlmIChzYTMtPnNhX2dpZHNldCkgewotCQlUQ0hFQ0soZHBbMF0pOwotCQlzYTMtPnNhX2dpZCA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKLQkJZHArKzsKLQl9Ci0KLQlUQ0hFQ0soZHBbMF0pOwotCXNhMy0+c2Ffc2l6ZXNldCA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKLQlkcCsrOwotCWlmIChzYTMtPnNhX3NpemVzZXQpIHsKLQkJVENIRUNLKGRwWzBdKTsKLQkJc2EzLT5zYV9zaXplID0gRVhUUkFDVF8zMkJJVFMoZHApOwotCQlkcCsrOwotCX0KLQotCVRDSEVDSyhkcFswXSk7Ci0Jc2EzLT5zYV9hdGltZXR5cGUgPSBFWFRSQUNUXzMyQklUUyhkcCk7Ci0JZHArKzsKLQlpZiAoc2EzLT5zYV9hdGltZXR5cGUgPT0gTkZTVjNTQVRUUlRJTUVfVE9DTElFTlQpIHsKLQkJVENIRUNLKGRwWzFdKTsKLQkJc2EzLT5zYV9hdGltZS5uZnN2M19zZWMgPSBFWFRSQUNUXzMyQklUUyhkcCk7Ci0JCWRwKys7Ci0JCXNhMy0+c2FfYXRpbWUubmZzdjNfbnNlYyA9IEVYVFJBQ1RfMzJCSVRTKGRwKTsKLQkJZHArKzsKLQl9Ci0KLQlUQ0hFQ0soZHBbMF0pOwotCXNhMy0+c2FfbXRpbWV0eXBlID0gRVhUUkFDVF8zMkJJVFMoZHApOwotCWRwKys7Ci0JaWYgKHNhMy0+c2FfbXRpbWV0eXBlID09IE5GU1YzU0FUVFJUSU1FX1RPQ0xJRU5UKSB7Ci0JCVRDSEVDSyhkcFsxXSk7Ci0JCXNhMy0+c2FfbXRpbWUubmZzdjNfc2VjID0gRVhUUkFDVF8zMkJJVFMoZHApOwotCQlkcCsrOwotCQlzYTMtPnNhX210aW1lLm5mc3YzX25zZWMgPSBFWFRSQUNUXzMyQklUUyhkcCk7Ci0JCWRwKys7Ci0JfQotCi0JcmV0dXJuIGRwOwotdHJ1bmM6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzZXJyOwkJLyogdHJ1ZSBpZiB3ZSBlcnJvciByYXRoZXIgdGhhbiB0cnVuYyAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2F0dHIzKGNvbnN0IHN0cnVjdCBuZnN2M19zYXR0ciAqc2EzLCBpbnQgdmVyYm9zZSkKLXsKLQlpZiAoc2EzLT5zYV9tb2Rlc2V0KQotCQlwcmludGYoIiBtb2RlICVvIiwgc2EzLT5zYV9tb2RlKTsKLQlpZiAoc2EzLT5zYV91aWRzZXQpCi0JCXByaW50ZigiIHVpZCAldSIsIHNhMy0+c2FfdWlkKTsKLQlpZiAoc2EzLT5zYV9naWRzZXQpCi0JCXByaW50ZigiIGdpZCAldSIsIHNhMy0+c2FfZ2lkKTsKLQlpZiAodmVyYm9zZSA+IDEpIHsKLQkJaWYgKHNhMy0+c2FfYXRpbWV0eXBlID09IE5GU1YzU0FUVFJUSU1FX1RPQ0xJRU5UKQotCQkJcHJpbnRmKCIgYXRpbWUgJXUuJTA2dSIsIHNhMy0+c2FfYXRpbWUubmZzdjNfc2VjLAotCQkJICAgICAgIHNhMy0+c2FfYXRpbWUubmZzdjNfbnNlYyk7Ci0JCWlmIChzYTMtPnNhX210aW1ldHlwZSA9PSBORlNWM1NBVFRSVElNRV9UT0NMSUVOVCkKLQkJCXByaW50ZigiIG10aW1lICV1LiUwNnUiLCBzYTMtPnNhX210aW1lLm5mc3YzX3NlYywKLQkJCSAgICAgICBzYTMtPnNhX210aW1lLm5mc3YzX25zZWMpOwotCX0KLX0KLQotdm9pZAotbmZzcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLAotCSAgICAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMikKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqcnA7Ci0JdV9pbnQzMl90IHByb2MsIHZlcnMsIHJlcGx5X3N0YXQ7Ci0JY2hhciBzcmNpZFsyMF0sIGRzdGlkWzIwXTsJLypmaXRzIDMyYml0Ki8KLQllbnVtIHN1bnJwY19yZWplY3Rfc3RhdCByc3RhdDsKLQl1X2ludDMyX3QgcmxvdzsKLQl1X2ludDMyX3QgcmhpZ2g7Ci0JZW51bSBzdW5ycGNfYXV0aF9zdGF0IHJ3aHk7Ci0KLQluZnNlcnIgPSAwOwkJLyogYXNzdW1lIG5vIGVycm9yICovCi0JcnAgPSAoY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKilicDsKLQotCWlmICghbmZsYWcpIHsKLQkJc3RybGNweShzcmNpZCwgIm5mcyIsIHNpemVvZihzcmNpZCkpOwotCQlzbnByaW50Zihkc3RpZCwgc2l6ZW9mKGRzdGlkKSwgIiV1IiwKLQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1feGlkKSk7Ci0JfSBlbHNlIHsKLQkJc25wcmludGYoc3JjaWQsIHNpemVvZihzcmNpZCksICIldSIsIE5GU19QT1JUKTsKLQkJc25wcmludGYoZHN0aWQsIHNpemVvZihkc3RpZCksICIldSIsCi0JCSAgICBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3hpZCkpOwotCX0KLQlwcmludF9uZnNhZGRyKGJwMiwgc3JjaWQsIGRzdGlkKTsKLQlyZXBseV9zdGF0ID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9yZXBseS5ycF9zdGF0KTsKLQlzd2l0Y2ggKHJlcGx5X3N0YXQpIHsKLQotCWNhc2UgU1VOUlBDX01TR19BQ0NFUFRFRDoKLQkJKHZvaWQpcHJpbnRmKCJyZXBseSBvayAldSIsIGxlbmd0aCk7Ci0JCWlmICh4aWRfbWFwX2ZpbmQocnAsIGJwMiwgJnByb2MsICZ2ZXJzKSA+PSAwKQotCQkJaW50ZXJwX3JlcGx5KHJwLCBwcm9jLCB2ZXJzLCBsZW5ndGgpOwotCQlicmVhazsKLQotCWNhc2UgU1VOUlBDX01TR19ERU5JRUQ6Ci0JCSh2b2lkKXByaW50ZigicmVwbHkgRVJSICV1OiAiLCBsZW5ndGgpOwotCQlyc3RhdCA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fcmVwbHkucnBfcmVqZWN0LnJqX3N0YXQpOwotCQlzd2l0Y2ggKHJzdGF0KSB7Ci0KLQkJY2FzZSBTVU5SUENfUlBDX01JU01BVENIOgotCQkJcmxvdyA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fcmVwbHkucnBfcmVqZWN0LnJqX3ZlcnMubG93KTsKLQkJCXJoaWdoID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9yZXBseS5ycF9yZWplY3QucmpfdmVycy5oaWdoKTsKLQkJCSh2b2lkKXByaW50ZigiUlBDIFZlcnNpb24gbWlzbWF0Y2ggKCV1LSV1KSIsCi0JCQkgICAgcmxvdywgcmhpZ2gpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVU5SUENfQVVUSF9FUlJPUjoKLQkJCXJ3aHkgPSBFWFRSQUNUXzMyQklUUygmcnAtPnJtX3JlcGx5LnJwX3JlamVjdC5yal93aHkpOwotCQkJKHZvaWQpcHJpbnRmKCJBdXRoICIpOwotCQkJc3dpdGNoIChyd2h5KSB7Ci0KLQkJCWNhc2UgU1VOUlBDX0FVVEhfT0s6Ci0JCQkJKHZvaWQpcHJpbnRmKCJPSyIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVTlJQQ19BVVRIX0JBRENSRUQ6Ci0JCQkJKHZvaWQpcHJpbnRmKCJCb2d1cyBDcmVkZW50aWFscyAoc2VhbCBicm9rZW4pIik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VOUlBDX0FVVEhfUkVKRUNURURDUkVEOgotCQkJCSh2b2lkKXByaW50ZigiUmVqZWN0ZWQgQ3JlZGVudGlhbHMgKGNsaWVudCBzaG91bGQgYmVnaW4gbmV3IHNlc3Npb24pIik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VOUlBDX0FVVEhfQkFEVkVSRjoKLQkJCQkodm9pZClwcmludGYoIkJvZ3VzIFZlcmlmaWVyIChzZWFsIGJyb2tlbikiKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVU5SUENfQVVUSF9SRUpFQ1RFRFZFUkY6Ci0JCQkJKHZvaWQpcHJpbnRmKCJWZXJpZmllciBleHBpcmVkIG9yIHdhcyByZXBsYXllZCIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNVTlJQQ19BVVRIX1RPT1dFQUs6Ci0JCQkJKHZvaWQpcHJpbnRmKCJDcmVkZW50aWFscyBhcmUgdG9vIHdlYWsiKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVU5SUENfQVVUSF9JTlZBTElEUkVTUDoKLQkJCQkodm9pZClwcmludGYoIkJvZ3VzIHJlc3BvbnNlIHZlcmlmaWVyIik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1VOUlBDX0FVVEhfRkFJTEVEOgotCQkJCSh2b2lkKXByaW50ZigiVW5rbm93biBmYWlsdXJlIik7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJKHZvaWQpcHJpbnRmKCJJbnZhbGlkIGZhaWx1cmUgY29kZSAldSIsCi0JCQkJICAgICh1bnNpZ25lZCBpbnQpcndoeSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJKHZvaWQpcHJpbnRmKCJVbmtub3duIHJlYXNvbiBmb3IgcmVqZWN0aW5nIHJwYyBtZXNzYWdlICV1IiwKLQkJCSAgICAodW5zaWduZWQgaW50KXJzdGF0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJKHZvaWQpcHJpbnRmKCJyZXBseSBVbmtub3duIHJwYyByZXNwb25zZSBjb2RlPSV1ICV1IiwKLQkJICAgIHJlcGx5X3N0YXQsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGZpbGUgaGFuZGxlIGluIHRoZSBwYWNrZXQuCi0gKiBJZiB0aGUgcGFja2V0IHdhcyB0cnVuY2F0ZWQsIHJldHVybiAwLgotICovCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlcmVxKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGNvbnN0IHVfaW50MzJfdCAqZHA7Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuOwotCi0JLyoKLQkgKiBmaW5kIHRoZSBzdGFydCBvZiB0aGUgcmVxIGRhdGEgKGlmIHdlIGNhcHR1cmVkIGl0KQotCSAqLwotCWRwID0gKHVfaW50MzJfdCAqKSZycC0+cm1fY2FsbC5jYl9jcmVkOwotCVRDSEVDSyhkcFsxXSk7Ci0JbGVuID0gRVhUUkFDVF8zMkJJVFMoJmRwWzFdKTsKLQlpZiAobGVuIDwgbGVuZ3RoKSB7Ci0JCWRwICs9IChsZW4gKyAoMiAqIHNpemVvZigqZHApICsgMykpIC8gc2l6ZW9mKCpkcCk7Ci0JCVRDSEVDSyhkcFsxXSk7Ci0JCWxlbiA9IEVYVFJBQ1RfMzJCSVRTKCZkcFsxXSk7Ci0JCWlmIChsZW4gPCBsZW5ndGgpIHsKLQkJCWRwICs9IChsZW4gKyAoMiAqIHNpemVvZigqZHApICsgMykpIC8gc2l6ZW9mKCpkcCk7Ci0JCQlUQ0hFQ0syKGRwWzBdLCAwKTsKLQkJCXJldHVybiAoZHApOwotCQl9Ci0JfQotdHJ1bmM6Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotLyoKLSAqIFByaW50IG91dCBhbiBORlMgZmlsZSBoYW5kbGUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gZm9sbG93aW5nIHdvcmQuCi0gKiBJZiBwYWNrZXQgd2FzIHRydW5jYXRlZCwgcmV0dXJuIDAuCi0gKi8KLXN0YXRpYyBjb25zdCB1X2ludDMyX3QgKgotcGFyc2VmaChyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdjMpCi17Ci0JdV9pbnQgbGVuOwotCi0JaWYgKHYzKSB7Ci0JCVRDSEVDSyhkcFswXSk7Ci0JCWxlbiA9IEVYVFJBQ1RfMzJCSVRTKGRwKSAvIDQ7Ci0JCWRwKys7Ci0JfSBlbHNlCi0JCWxlbiA9IE5GU1hfVjJGSCAvIDQ7Ci0KLQlpZiAoVFRFU1QyKCpkcCwgbGVuICogc2l6ZW9mKCpkcCkpKSB7Ci0JCW5mc19wcmludGZoKGRwLCBsZW4pOwotCQlyZXR1cm4gKGRwICsgbGVuKTsKLQl9Ci10cnVuYzoKLQlyZXR1cm4gKE5VTEwpOwotfQotCi0vKgotICogUHJpbnQgb3V0IGEgZmlsZSBuYW1lIGFuZCByZXR1cm4gcG9pbnRlciB0byAzMi1iaXQgd29yZCBwYXN0IGl0LgotICogSWYgcGFja2V0IHdhcyB0cnVuY2F0ZWQsIHJldHVybiAwLgotICovCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlZm4ocmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpkcCkKLXsKLQlyZWdpc3RlciB1X2ludDMyX3QgbGVuOwotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqY3A7Ci0KLQkvKiBCYWlsIGlmIHdlIGRvbid0IGhhdmUgdGhlIHN0cmluZyBsZW5ndGggKi8KLQlUQ0hFQ0soKmRwKTsKLQotCS8qIEZldGNoIHN0cmluZyBsZW5ndGg7IGNvbnZlcnQgdG8gaG9zdCBvcmRlciAqLwotCWxlbiA9ICpkcCsrOwotCU5UT0hMKGxlbik7Ci0KLQlUQ0hFQ0syKCpkcCwgKChsZW4gKyAzKSAmIH4zKSk7Ci0KLQljcCA9ICh1X2NoYXIgKilkcDsKLQkvKiBVcGRhdGUgMzItYml0IHBvaW50ZXIgKE5GUyBmaWxlbmFtZXMgcGFkZGVkIHRvIDMyLWJpdCBib3VuZGFyaWVzKSAqLwotCWRwICs9ICgobGVuICsgMykgJiB+MykgLyBzaXplb2YoKmRwKTsKLQlwdXRjaGFyKCciJyk7Ci0JaWYgKGZuX3ByaW50bihjcCwgbGVuLCBzbmFwZW5kKSkgewotCQlwdXRjaGFyKCciJyk7Ci0JCWdvdG8gdHJ1bmM7Ci0JfQotCXB1dGNoYXIoJyInKTsKLQotCXJldHVybiAoZHApOwotdHJ1bmM6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBQcmludCBvdXQgZmlsZSBoYW5kbGUgYW5kIGZpbGUgbmFtZS4KLSAqIFJldHVybiBwb2ludGVyIHRvIDMyLWJpdCB3b3JkIHBhc3QgZmlsZSBuYW1lLgotICogSWYgcGFja2V0IHdhcyB0cnVuY2F0ZWQgKG9yIHRoZXJlIHdhcyBzb21lIG90aGVyIGVycm9yKSwgcmV0dXJuIDAuCi0gKi8KLXN0YXRpYyBjb25zdCB1X2ludDMyX3QgKgotcGFyc2VmaG4ocmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpkcCwgaW50IHYzKQotewotCWRwID0gcGFyc2VmaChkcCwgdjMpOwotCWlmIChkcCA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCXB1dGNoYXIoJyAnKTsKLQlyZXR1cm4gKHBhcnNlZm4oZHApKTsKLX0KLQotdm9pZAotbmZzcmVxX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCwKLSAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMikKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqcnA7Ci0JcmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpkcDsKLQluZnNfdHlwZSB0eXBlOwotCWludCB2MzsKLQl1X2ludDMyX3QgcHJvYzsKLQlzdHJ1Y3QgbmZzdjNfc2F0dHIgc2EzOwotCWNoYXIgc3JjaWRbMjBdLCBkc3RpZFsyMF07CS8qZml0cyAzMmJpdCovCi0KLQluZnNlcnIgPSAwOwkJLyogYXNzdW1lIG5vIGVycm9yICovCi0JcnAgPSAoY29uc3Qgc3RydWN0IHN1bnJwY19tc2cgKilicDsKLQlpZiAoIW5mbGFnKSB7Ci0JCXNucHJpbnRmKHNyY2lkLCBzaXplb2Yoc3JjaWQpLCAiJXUiLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV94aWQpKTsKLQkJc3RybGNweShkc3RpZCwgIm5mcyIsIHNpemVvZihkc3RpZCkpOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKHNyY2lkLCBzaXplb2Yoc3JjaWQpLCAiJXUiLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV94aWQpKTsKLQkJc25wcmludGYoZHN0aWQsIHNpemVvZihkc3RpZCksICIldSIsIE5GU19QT1JUKTsKLQl9Ci0JcHJpbnRfbmZzYWRkcihicDIsIHNyY2lkLCBkc3RpZCk7Ci0JKHZvaWQpcHJpbnRmKCIlZCIsIGxlbmd0aCk7Ci0KLQl4aWRfbWFwX2VudGVyKHJwLCBicDIpOwkvKiByZWNvcmQgcHJvYyBudW1iZXIgZm9yIGxhdGVyIG9uICovCi0KLQl2MyA9IChFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfdmVycykgPT0gTkZTX1ZFUjMpOwotCXByb2MgPSBFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfcHJvYyk7Ci0KLQlpZiAoIXYzICYmIHByb2MgPCBORlNfTlBST0NTKQotCQlwcm9jID0gIG5mc3YzX3Byb2NpZFtwcm9jXTsKLQotCXN3aXRjaCAocHJvYykgewotCWNhc2UgTkZTUFJPQ19OT09QOgotCQlwcmludGYoIiBub3AiKTsKLQkJcmV0dXJuOwotCWNhc2UgTkZTUFJPQ19OVUxMOgotCQlwcmludGYoIiBudWxsIik7Ci0JCXJldHVybjsKLQotCWNhc2UgTkZTUFJPQ19HRVRBVFRSOgotCQlwcmludGYoIiBnZXRhdHRyIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgotCQkgICAgcGFyc2VmaChkcCwgdjMpICE9IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1NFVEFUVFI6Ci0JCXByaW50ZigiIHNldGF0dHIiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICBwYXJzZWZoKGRwLCB2MykgIT0gTlVMTCkKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfTE9PS1VQOgotCQlwcmludGYoIiBsb29rdXAiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICBwYXJzZWZobihkcCwgdjMpICE9IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX0FDQ0VTUzoKLQkJcHJpbnRmKCIgYWNjZXNzIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgotCQkgICAgKGRwID0gcGFyc2VmaChkcCwgdjMpKSAhPSBOVUxMKSB7Ci0JCQlUQ0hFQ0soZHBbMF0pOwotCQkJcHJpbnRmKCIgJTA0eCIsIEVYVFJBQ1RfMzJCSVRTKCZkcFswXSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1JFQURMSU5LOgotCQlwcmludGYoIiByZWFkbGluayIpOwotCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKLQkJICAgIHBhcnNlZmgoZHAsIHYzKSAhPSBOVUxMKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19SRUFEOgotCQlwcmludGYoIiByZWFkIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgotCQkgICAgKGRwID0gcGFyc2VmaChkcCwgdjMpKSAhPSBOVUxMKSB7Ci0JCQlpZiAodjMpIHsKLQkJCQlUQ0hFQ0soZHBbMl0pOwotCQkJCXByaW50ZigiICV1IGJ5dGVzIEAgJSIgUFJJdTY0LAotCQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbMl0pLAotCQkJCSAgICAgICBFWFRSQUNUXzY0QklUUygmZHBbMF0pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJVENIRUNLKGRwWzFdKTsKLQkJCQlwcmludGYoIiAldSBieXRlcyBAICV1IiwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmRwWzFdKSwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJmRwWzBdKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfV1JJVEU6Ci0JCXByaW50ZigiIHdyaXRlIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgotCQkgICAgKGRwID0gcGFyc2VmaChkcCwgdjMpKSAhPSBOVUxMKSB7Ci0JCQlpZiAodjMpIHsKLQkJCQlUQ0hFQ0soZHBbMl0pOwotCQkJCXByaW50ZigiICV1ICgldSkgYnl0ZXMgQCAlIiBQUkl1NjQsCi0JCQkJCQlFWFRSQUNUXzMyQklUUygmZHBbNF0pLAotCQkJCQkJRVhUUkFDVF8zMkJJVFMoJmRwWzJdKSwKLQkJCQkJCUVYVFJBQ1RfNjRCSVRTKCZkcFswXSkpOwotCQkJCWlmICh2ZmxhZykgewotCQkJCQlkcCArPSAzOwotCQkJCQlUQ0hFQ0soZHBbMF0pOwotCQkJCQlwcmludGYoIiA8JXM+IiwKLQkJCQkJCXRvazJzdHIobmZzdjNfd3JpdGVtb2RlcywKLQkJCQkJCQlOVUxMLCBFWFRSQUNUXzMyQklUUyhkcCkpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVRDSEVDSyhkcFszXSk7Ci0JCQkJcHJpbnRmKCIgJXUgKCV1KSBieXRlcyBAICV1ICgldSkiLAotCQkJCQkJRVhUUkFDVF8zMkJJVFMoJmRwWzNdKSwKLQkJCQkJCUVYVFJBQ1RfMzJCSVRTKCZkcFsyXSksCi0JCQkJCQlFWFRSQUNUXzMyQklUUygmZHBbMV0pLAotCQkJCQkJRVhUUkFDVF8zMkJJVFMoJmRwWzBdKSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfQ1JFQVRFOgotCQlwcmludGYoIiBjcmVhdGUiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICBwYXJzZWZobihkcCwgdjMpICE9IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX01LRElSOgotCQlwcmludGYoIiBta2RpciIpOwotCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IDAgJiYgcGFyc2VmaG4oZHAsIHYzKSAhPSAwKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19TWU1MSU5LOgotCQlwcmludGYoIiBzeW1saW5rIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gMCAmJgotCQkgICAgKGRwID0gcGFyc2VmaG4oZHAsIHYzKSkgIT0gMCkgewotCQkJZnB1dHMoIiAtPiIsIHN0ZG91dCk7Ci0JCQlpZiAodjMgJiYgKGRwID0gcGFyc2Vfc2F0dHIzKGRwLCAmc2EzKSkgPT0gMCkKLQkJCQlicmVhazsKLQkJCWlmIChwYXJzZWZuKGRwKSA9PSAwKQotCQkJCWJyZWFrOwotCQkJaWYgKHYzICYmIHZmbGFnKQotCQkJCXByaW50X3NhdHRyMygmc2EzLCB2ZmxhZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfTUtOT0Q6Ci0JCXByaW50ZigiIG1rbm9kIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gMCAmJgotCQkgICAgKGRwID0gcGFyc2VmaG4oZHAsIHYzKSkgIT0gMCkgewotCQkJVENIRUNLKCpkcCk7Ci0JCQl0eXBlID0gKG5mc190eXBlKUVYVFJBQ1RfMzJCSVRTKGRwKTsKLQkJCWRwKys7Ci0JCQlpZiAoKGRwID0gcGFyc2Vfc2F0dHIzKGRwLCAmc2EzKSkgPT0gMCkKLQkJCQlicmVhazsKLQkJCXByaW50ZigiICVzIiwgdG9rMnN0cih0eXBlMnN0ciwgInVuay1mdCAlZCIsIHR5cGUpKTsKLQkJCWlmICh2ZmxhZyAmJiAodHlwZSA9PSBORkNIUiB8fCB0eXBlID09IE5GQkxLKSkgewotCQkJCVRDSEVDSyhkcFsxXSk7Ci0JCQkJcHJpbnRmKCIgJXUvJXUiLAotCQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbMF0pLAotCQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbMV0pKTsKLQkJCQlkcCArPSAyOwotCQkJfQotCQkJaWYgKHZmbGFnKQotCQkJCXByaW50X3NhdHRyMygmc2EzLCB2ZmxhZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfUkVNT1ZFOgotCQlwcmludGYoIiByZW1vdmUiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICBwYXJzZWZobihkcCwgdjMpICE9IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1JNRElSOgotCQlwcmludGYoIiBybWRpciIpOwotCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKLQkJICAgIHBhcnNlZmhuKGRwLCB2MykgIT0gTlVMTCkKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfUkVOQU1FOgotCQlwcmludGYoIiByZW5hbWUiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICAoZHAgPSBwYXJzZWZobihkcCwgdjMpKSAhPSBOVUxMKSB7Ci0JCQlmcHV0cygiIC0+Iiwgc3Rkb3V0KTsKLQkJCWlmIChwYXJzZWZobihkcCwgdjMpICE9IE5VTEwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX0xJTks6Ci0JCXByaW50ZigiIGxpbmsiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICAoZHAgPSBwYXJzZWZoKGRwLCB2MykpICE9IE5VTEwpIHsKLQkJCWZwdXRzKCIgLT4iLCBzdGRvdXQpOwotCQkJaWYgKHBhcnNlZmhuKGRwLCB2MykgIT0gTlVMTCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfUkVBRERJUjoKLQkJcHJpbnRmKCIgcmVhZGRpciIpOwotCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKLQkJICAgIChkcCA9IHBhcnNlZmgoZHAsIHYzKSkgIT0gTlVMTCkgewotCQkJaWYgKHYzKSB7Ci0JCQkJVENIRUNLKGRwWzRdKTsKLQkJCQkvKgotCQkJCSAqIFdlIHNob3VsZG4ndCByZWFsbHkgdHJ5IHRvIGludGVycHJldCB0aGUKLQkJCQkgKiBvZmZzZXQgY29va2llIGhlcmUuCi0JCQkJICovCi0JCQkJcHJpbnRmKCIgJXUgYnl0ZXMgQCAlIiBQUklkNjQsCi0JCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZkcFs0XSksCi0JCQkJICAgIEVYVFJBQ1RfNjRCSVRTKCZkcFswXSkpOwotCQkJCWlmICh2ZmxhZykKLQkJCQkJcHJpbnRmKCIgdmVyZiAlMDh4JTA4eCIsIGRwWzJdLAotCQkJCQkgICAgICAgZHBbM10pOwotCQkJfSBlbHNlIHsKLQkJCQlUQ0hFQ0soZHBbMV0pOwotCQkJCS8qCi0JCQkJICogUHJpbnQgdGhlIG9mZnNldCBhcyBzaWduZWQsIHNpbmNlIC0xIGlzCi0JCQkJICogY29tbW9uLCBidXQgb2Zmc2V0cyA+IDJeMzEgYXJlbid0LgotCQkJCSAqLwotCQkJCXByaW50ZigiICV1IGJ5dGVzIEAgJWQiLAotCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZHBbMV0pLAotCQkJCSAgICBFWFRSQUNUXzMyQklUUygmZHBbMF0pKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19SRUFERElSUExVUzoKLQkJcHJpbnRmKCIgcmVhZGRpcnBsdXMiKTsKLQkJaWYgKChkcCA9IHBhcnNlcmVxKHJwLCBsZW5ndGgpKSAhPSBOVUxMICYmCi0JCSAgICAoZHAgPSBwYXJzZWZoKGRwLCB2MykpICE9IE5VTEwpIHsKLQkJCVRDSEVDSyhkcFs0XSk7Ci0JCQkvKgotCQkJICogV2UgZG9uJ3QgdHJ5IHRvIGludGVycHJldCB0aGUgb2Zmc2V0Ci0JCQkgKiBjb29raWUgaGVyZS4KLQkJCSAqLwotCQkJcHJpbnRmKCIgJXUgYnl0ZXMgQCAlIiBQUklkNjQsCi0JCQkJRVhUUkFDVF8zMkJJVFMoJmRwWzRdKSwKLQkJCQlFWFRSQUNUXzY0QklUUygmZHBbMF0pKTsKLQkJCWlmICh2ZmxhZykgewotCQkJCVRDSEVDSyhkcFs1XSk7Ci0JCQkJcHJpbnRmKCIgbWF4ICV1IHZlcmYgJTA4eCUwOHgiLAotCQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbNV0pLCBkcFsyXSwgZHBbM10pOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX0ZTU1RBVDoKLQkJcHJpbnRmKCIgZnNzdGF0Iik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgotCQkgICAgcGFyc2VmaChkcCwgdjMpICE9IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX0ZTSU5GTzoKLQkJcHJpbnRmKCIgZnNpbmZvIik7Ci0JCWlmICgoZHAgPSBwYXJzZXJlcShycCwgbGVuZ3RoKSkgIT0gTlVMTCAmJgotCQkgICAgcGFyc2VmaChkcCwgdjMpICE9IE5VTEwpCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1BBVEhDT05GOgotCQlwcmludGYoIiBwYXRoY29uZiIpOwotCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKLQkJICAgIHBhcnNlZmgoZHAsIHYzKSAhPSBOVUxMKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19DT01NSVQ6Ci0JCXByaW50ZigiIGNvbW1pdCIpOwotCQlpZiAoKGRwID0gcGFyc2VyZXEocnAsIGxlbmd0aCkpICE9IE5VTEwgJiYKLQkJICAgIChkcCA9IHBhcnNlZmgoZHAsIHYzKSkgIT0gTlVMTCkgewotCQkJVENIRUNLKGRwWzJdKTsKLQkJCXByaW50ZigiICV1IGJ5dGVzIEAgJSIgUFJJdTY0LAotCQkJCUVYVFJBQ1RfMzJCSVRTKCZkcFsyXSksCi0JCQkJRVhUUkFDVF82NEJJVFMoJmRwWzBdKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIiBwcm9jLSV1IiwgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3Byb2MpKTsKLQkJcmV0dXJuOwotCX0KLQotdHJ1bmM6Ci0JaWYgKCFuZnNlcnIpCi0JCWZwdXRzKCIgW3xuZnNdIiwgc3Rkb3V0KTsKLX0KLQotLyoKLSAqIFByaW50IG91dCBhbiBORlMgZmlsZSBoYW5kbGUuCi0gKiBXZSBhc3N1bWUgcGFja2V0IHdhcyBub3QgdHJ1bmNhdGVkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZQotICogZmlsZSBoYW5kbGUgcG9pbnRlZCB0byBieSBkcC4KLSAqCi0gKiBOb3RlOiBuZXcgdmVyc2lvbiAodXNpbmcgcG9ydGFibGUgZmlsZS1oYW5kbGUgcGFyc2VyKSBkb2Vzbid0IHByb2R1Y2UKLSAqIGdlbmVyYXRpb24gbnVtYmVyLiAgSXQgcHJvYmFibHkgY291bGQgYmUgbWFkZSB0byBkbyB0aGF0LCB3aXRoIHNvbWUKLSAqIGFkZGl0aW9uYWwgaGFja2luZyBvbiB0aGUgcGFyc2VyIGNvZGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1uZnNfcHJpbnRmaChyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmRwLCBjb25zdCB1X2ludCBsZW4pCi17Ci0JbXlfZnNpZCBmc2lkOwotCWlub190IGlubzsKLQljb25zdCBjaGFyICpzZnNuYW1lID0gTlVMTDsKLQljaGFyICpzcGFjZXA7Ci0KLQlpZiAodWZsYWcpIHsKLQkJdV9pbnQgaTsKLQkJY2hhciBjb25zdCAqc2VwID0gIiI7Ci0KLQkJcHJpbnRmKCIgZmhbIik7Ci0JCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7Ci0JCQkodm9pZClwcmludGYoIiVzJXgiLCBzZXAsIGRwW2ldKTsKLQkJCXNlcCA9ICI6IjsKLQkJfQotCQlwcmludGYoIl0iKTsKLQkJcmV0dXJuOwotCX0KLQotCVBhcnNlX2ZoKChjb25zdCB1X2NoYXIgKilkcCwgbGVuLCAmZnNpZCwgJmlubywgTlVMTCwgJnNmc25hbWUsIDApOwotCi0JaWYgKHNmc25hbWUpIHsKLQkJLyogZmlsZSBzeXN0ZW0gSUQgaXMgQVNDSUksIG5vdCBudW1lcmljLCBmb3IgdGhpcyBzZXJ2ZXIgT1MgKi8KLQkJc3RhdGljIGNoYXIgdGVtcFtORlNYX1YzRkhNQVgrMV07Ci0KLQkJLyogTWFrZSBzdXJlIHN0cmluZyBpcyBudWxsLXRlcm1pbmF0ZWQgKi8KLQkJc3RybmNweSh0ZW1wLCBzZnNuYW1lLCBORlNYX1YzRkhNQVgpOwotCQl0ZW1wW3NpemVvZih0ZW1wKSAtIDFdID0gJ1wwJzsKLQkJLyogUmVtb3ZlIHRyYWlsaW5nIHNwYWNlcyAqLwotCQlzcGFjZXAgPSBzdHJjaHIodGVtcCwgJyAnKTsKLQkJaWYgKHNwYWNlcCkKLQkJCSpzcGFjZXAgPSAnXDAnOwotCi0JCSh2b2lkKXByaW50ZigiIGZoICVzLyIsIHRlbXApOwotCX0gZWxzZSB7Ci0JCSh2b2lkKXByaW50ZigiIGZoICVkLCVkLyIsCi0JCQkgICAgIGZzaWQuRnNpZF9kZXYuTWFqb3IsIGZzaWQuRnNpZF9kZXYuTWlub3IpOwotCX0KLQotCWlmKGZzaWQuRnNpZF9kZXYuTWlub3IgPT0gMjU3KQotCQkvKiBQcmludCB0aGUgdW5kZWNvZGVkIGhhbmRsZSAqLwotCQkodm9pZClwcmludGYoIiVzIiwgZnNpZC5PcGFxdWVfSGFuZGxlKTsKLQllbHNlCi0JCSh2b2lkKXByaW50ZigiJWxkIiwgKGxvbmcpIGlubyk7Ci19Ci0KLS8qCi0gKiBNYWludGFpbiBhIHNtYWxsIGNhY2hlIG9mIHJlY2VudCBjbGllbnQuWElELnNlcnZlci9wcm9jIHBhaXJzLCB0byBhbGxvdwotICogdXMgdG8gbWF0Y2ggdXAgcmVwbGllcyB3aXRoIHJlcXVlc3RzIGFuZCB0aHVzIHRvIGtub3cgaG93IHRvIHBhcnNlCi0gKiB0aGUgcmVwbHkuCi0gKi8KLQotc3RydWN0IHhpZF9tYXBfZW50cnkgewotCXVfaW50MzJfdAl4aWQ7CQkvKiB0cmFuc2FjdGlvbiBJRCAobmV0IG9yZGVyKSAqLwotCWludCBpcHZlcjsJCQkvKiBJUCB2ZXJzaW9uICg0IG9yIDYpICovCi0jaWZkZWYgSU5FVDYKLQlzdHJ1Y3QgaW42X2FkZHIJY2xpZW50OwkJLyogY2xpZW50IElQIGFkZHJlc3MgKG5ldCBvcmRlcikgKi8KLQlzdHJ1Y3QgaW42X2FkZHIJc2VydmVyOwkJLyogc2VydmVyIElQIGFkZHJlc3MgKG5ldCBvcmRlcikgKi8KLSNlbHNlCi0Jc3RydWN0IGluX2FkZHIJY2xpZW50OwkJLyogY2xpZW50IElQIGFkZHJlc3MgKG5ldCBvcmRlcikgKi8KLQlzdHJ1Y3QgaW5fYWRkcglzZXJ2ZXI7CQkvKiBzZXJ2ZXIgSVAgYWRkcmVzcyAobmV0IG9yZGVyKSAqLwotI2VuZGlmCi0JdV9pbnQzMl90CXByb2M7CQkvKiBjYWxsIHByb2MgbnVtYmVyIChob3N0IG9yZGVyKSAqLwotCXVfaW50MzJfdAl2ZXJzOwkJLyogcHJvZ3JhbSB2ZXJzaW9uIChob3N0IG9yZGVyKSAqLwotfTsKLQotLyoKLSAqIE1hcCBlbnRyaWVzIGFyZSBrZXB0IGluIGFuIGFycmF5IHRoYXQgd2UgbWFuYWdlIGFzIGEgcmluZzsKLSAqIG5ldyBlbnRyaWVzIGFyZSBhbHdheXMgYWRkZWQgYXQgdGhlIHRhaWwgb2YgdGhlIHJpbmcuICBJbml0aWFsbHksCi0gKiBhbGwgdGhlIGVudHJpZXMgYXJlIHplcm8gYW5kIGhlbmNlIGRvbid0IG1hdGNoIGFueXRoaW5nLgotICovCi0KLSNkZWZpbmUJWElETUFQU0laRQk2NAotCi1zdHJ1Y3QgeGlkX21hcF9lbnRyeSB4aWRfbWFwW1hJRE1BUFNJWkVdOwotCi1pbnQJeGlkX21hcF9uZXh0ID0gMDsKLWludAl4aWRfbWFwX2hpbnQgPSAwOwotCi1zdGF0aWMgdm9pZAoteGlkX21hcF9lbnRlcihjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqcnAsIGNvbnN0IHVfY2hhciAqYnApCi17Ci0Jc3RydWN0IGlwICppcCA9IE5VTEw7Ci0jaWZkZWYgSU5FVDYKLQlzdHJ1Y3QgaXA2X2hkciAqaXA2ID0gTlVMTDsKLSNlbmRpZgotCXN0cnVjdCB4aWRfbWFwX2VudHJ5ICp4bWVwOwotCi0Jc3dpdGNoIChJUF9WKChzdHJ1Y3QgaXAgKilicCkpIHsKLQljYXNlIDQ6Ci0JCWlwID0gKHN0cnVjdCBpcCAqKWJwOwotCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCWNhc2UgNjoKLQkJaXA2ID0gKHN0cnVjdCBpcDZfaGRyICopYnA7Ci0JCWJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCXhtZXAgPSAmeGlkX21hcFt4aWRfbWFwX25leHRdOwotCi0JaWYgKCsreGlkX21hcF9uZXh0ID49IFhJRE1BUFNJWkUpCi0JCXhpZF9tYXBfbmV4dCA9IDA7Ci0KLQl4bWVwLT54aWQgPSBycC0+cm1feGlkOwotCWlmIChpcCkgewotCQl4bWVwLT5pcHZlciA9IDQ7Ci0JCW1lbWNweSgmeG1lcC0+Y2xpZW50LCAmaXAtPmlwX3NyYywgc2l6ZW9mKGlwLT5pcF9zcmMpKTsKLQkJbWVtY3B5KCZ4bWVwLT5zZXJ2ZXIsICZpcC0+aXBfZHN0LCBzaXplb2YoaXAtPmlwX2RzdCkpOwotCX0KLSNpZmRlZiBJTkVUNgotCWVsc2UgaWYgKGlwNikgewotCQl4bWVwLT5pcHZlciA9IDY7Ci0JCW1lbWNweSgmeG1lcC0+Y2xpZW50LCAmaXA2LT5pcDZfc3JjLCBzaXplb2YoaXA2LT5pcDZfc3JjKSk7Ci0JCW1lbWNweSgmeG1lcC0+c2VydmVyLCAmaXA2LT5pcDZfZHN0LCBzaXplb2YoaXA2LT5pcDZfZHN0KSk7Ci0JfQotI2VuZGlmCi0JeG1lcC0+cHJvYyA9IEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fY2FsbC5jYl9wcm9jKTsKLQl4bWVwLT52ZXJzID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3ZlcnMpOwotfQotCi0vKgotICogUmV0dXJucyAwIGFuZCBwdXRzIE5GU1BST0NfeHh4IGluIHByb2MgcmV0dXJuIGFuZAotICogdmVyc2lvbiBpbiB2ZXJzIHJldHVybiwgb3IgcmV0dXJucyAtMSBvbiBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQKLXhpZF9tYXBfZmluZChjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqcnAsIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50MzJfdCAqcHJvYywKLQkgICAgIHVfaW50MzJfdCAqdmVycykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgeGlkX21hcF9lbnRyeSAqeG1lcDsKLQl1X2ludDMyX3QgeGlkID0gcnAtPnJtX3hpZDsKLQlzdHJ1Y3QgaXAgKmlwID0gKHN0cnVjdCBpcCAqKWJwOwotI2lmZGVmIElORVQ2Ci0Jc3RydWN0IGlwNl9oZHIgKmlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwOwotI2VuZGlmCi0JaW50IGNtcDsKLQotCS8qIFN0YXJ0IHNlYXJjaGluZyBmcm9tIHdoZXJlIHdlIGxhc3QgbGVmdCBvZmYgKi8KLQlpID0geGlkX21hcF9oaW50OwotCWRvIHsKLQkJeG1lcCA9ICZ4aWRfbWFwW2ldOwotCQljbXAgPSAxOwotCQlpZiAoeG1lcC0+aXB2ZXIgIT0gSVBfVihpcCkgfHwgeG1lcC0+eGlkICE9IHhpZCkKLQkJCWdvdG8gbmV4dGl0ZW07Ci0JCXN3aXRjaCAoeG1lcC0+aXB2ZXIpIHsKLQkJY2FzZSA0OgotCQkJaWYgKG1lbWNtcCgmaXAtPmlwX3NyYywgJnhtZXAtPnNlcnZlciwKLQkJCQkgICBzaXplb2YoaXAtPmlwX3NyYykpICE9IDAgfHwKLQkJCSAgICBtZW1jbXAoJmlwLT5pcF9kc3QsICZ4bWVwLT5jbGllbnQsCi0JCQkJICAgc2l6ZW9mKGlwLT5pcF9kc3QpKSAhPSAwKSB7Ci0JCQkJY21wID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JCWNhc2UgNjoKLQkJCWlmIChtZW1jbXAoJmlwNi0+aXA2X3NyYywgJnhtZXAtPnNlcnZlciwKLQkJCQkgICBzaXplb2YoaXA2LT5pcDZfc3JjKSkgIT0gMCB8fAotCQkJICAgIG1lbWNtcCgmaXA2LT5pcDZfZHN0LCAmeG1lcC0+Y2xpZW50LAotCQkJCSAgIHNpemVvZihpcDYtPmlwNl9kc3QpKSAhPSAwKSB7Ci0JCQkJY21wID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQljbXAgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKGNtcCkgewotCQkJLyogbWF0Y2ggKi8KLQkJCXhpZF9tYXBfaGludCA9IGk7Ci0JCQkqcHJvYyA9IHhtZXAtPnByb2M7Ci0JCQkqdmVycyA9IHhtZXAtPnZlcnM7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCW5leHRpdGVtOgotCQlpZiAoKytpID49IFhJRE1BUFNJWkUpCi0JCQlpID0gMDsKLQl9IHdoaWxlIChpICE9IHhpZF9tYXBfaGludCk7Ci0KLQkvKiBzZWFyY2ggZmFpbGVkICovCi0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qCi0gKiBSb3V0aW5lcyBmb3IgcGFyc2luZyByZXBseSBwYWNrZXRzCi0gKi8KLQotLyoKLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYWN0dWFsIHJlc3VsdHMuCi0gKiBJZiB0aGUgcGFja2V0IHdhcyB0cnVuY2F0ZWQsIHJldHVybiAwLgotICovCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlcmVwKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBzdW5ycGNfbXNnICpycCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGNvbnN0IHVfaW50MzJfdCAqZHA7Ci0JdV9pbnQgbGVuOwotCWVudW0gc3VucnBjX2FjY2VwdF9zdGF0IGFzdGF0OwotCi0JLyoKLQkgKiBQb3J0YWJpbGl0eSBub3RlOgotCSAqIEhlcmUgd2UgZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgYXJfdmVyZiBjcmVkZW50aWFscy4KLQkgKiBPcmlnaW5hbGx5LCB0aGlzIGNhbGN1bGF0aW9uIHdhcwotCSAqCWRwID0gKHVfaW50MzJfdCAqKSZycC0+cm1fcmVwbHkucnBfYWNwdC5hcl92ZXJmCi0JICogT24gdGhlIHdpcmUsIHRoZSBycF9hY3B0IGZpZWxkIHN0YXJ0cyBpbW1lZGlhdGVseSBhZnRlcgotCSAqIHRoZSAoMzIgYml0KSBycF9zdGF0IGZpZWxkLiAgSG93ZXZlciwgcnBfYWNwdCAod2hpY2ggaXMgYQotCSAqICJzdHJ1Y3QgYWNjZXB0ZWRfcmVwbHkiKSBjb250YWlucyBhICJzdHJ1Y3Qgb3BhcXVlX2F1dGgiLAotCSAqIHdob3NlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGNvbnRhaW5zIGEgcG9pbnRlciwgc28gb24gYQotCSAqIDY0LWJpdCBtYWNoaW5lIHRoZSBjb21waWxlciBpbnNlcnRzIDMyIGJpdHMgb2YgcGFkZGluZwotCSAqIGJlZm9yZSBycC0+cm1fcmVwbHkucnBfYWNwdC5hcl92ZXJmLiAgU28sIHdlIGNhbm5vdCB1c2UKLQkgKiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gcGFyc2UgdGhlIG9uLXRoZS13aXJlCi0JICogcmVwcmVzZW50YXRpb24uICBJbnN0ZWFkLCB3ZSBza2lwIHBhc3QgdGhlIHJwX3N0YXQgZmllbGQsCi0JICogd2hpY2ggaXMgYW4gImVudW0iIGFuZCBzbyBvY2N1cGllcyBvbmUgMzItYml0IHdvcmQuCi0JICovCi0JZHAgPSAoKGNvbnN0IHVfaW50MzJfdCAqKSZycC0+cm1fcmVwbHkpICsgMTsKLQlUQ0hFQ0soZHBbMV0pOwotCWxlbiA9IEVYVFJBQ1RfMzJCSVRTKCZkcFsxXSk7Ci0JaWYgKGxlbiA+PSBsZW5ndGgpCi0JCXJldHVybiAoTlVMTCk7Ci0JLyoKLQkgKiBza2lwIHBhc3QgdGhlIGFyX3ZlcmYgY3JlZGVudGlhbHMuCi0JICovCi0JZHAgKz0gKGxlbiArICgyKnNpemVvZih1X2ludDMyX3QpICsgMykpIC8gc2l6ZW9mKHVfaW50MzJfdCk7Ci0JVENIRUNLMihkcFswXSwgMCk7Ci0KLQkvKgotCSAqIG5vdyB3ZSBjYW4gY2hlY2sgdGhlIGFyX3N0YXQgZmllbGQKLQkgKi8KLQlhc3RhdCA9IChlbnVtIHN1bnJwY19hY2NlcHRfc3RhdCkgRVhUUkFDVF8zMkJJVFMoZHApOwotCXN3aXRjaCAoYXN0YXQpIHsKLQotCWNhc2UgU1VOUlBDX1NVQ0NFU1M6Ci0JCWJyZWFrOwotCi0JY2FzZSBTVU5SUENfUFJPR19VTkFWQUlMOgotCQlwcmludGYoIiBQUk9HX1VOQVZBSUwiKTsKLQkJbmZzZXJyID0gMTsJCS8qIHN1cHByZXNzIHRydW5jIHN0cmluZyAqLwotCQlyZXR1cm4gKE5VTEwpOwotCi0JY2FzZSBTVU5SUENfUFJPR19NSVNNQVRDSDoKLQkJcHJpbnRmKCIgUFJPR19NSVNNQVRDSCIpOwotCQluZnNlcnIgPSAxOwkJLyogc3VwcHJlc3MgdHJ1bmMgc3RyaW5nICovCi0JCXJldHVybiAoTlVMTCk7Ci0KLQljYXNlIFNVTlJQQ19QUk9DX1VOQVZBSUw6Ci0JCXByaW50ZigiIFBST0NfVU5BVkFJTCIpOwotCQluZnNlcnIgPSAxOwkJLyogc3VwcHJlc3MgdHJ1bmMgc3RyaW5nICovCi0JCXJldHVybiAoTlVMTCk7Ci0KLQljYXNlIFNVTlJQQ19HQVJCQUdFX0FSR1M6Ci0JCXByaW50ZigiIEdBUkJBR0VfQVJHUyIpOwotCQluZnNlcnIgPSAxOwkJLyogc3VwcHJlc3MgdHJ1bmMgc3RyaW5nICovCi0JCXJldHVybiAoTlVMTCk7Ci0KLQljYXNlIFNVTlJQQ19TWVNURU1fRVJSOgotCQlwcmludGYoIiBTWVNURU1fRVJSIik7Ci0JCW5mc2VyciA9IDE7CQkvKiBzdXBwcmVzcyB0cnVuYyBzdHJpbmcgKi8KLQkJcmV0dXJuIChOVUxMKTsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ZigiIGFyX3N0YXQgJWQiLCBhc3RhdCk7Ci0JCW5mc2VyciA9IDE7CQkvKiBzdXBwcmVzcyB0cnVuYyBzdHJpbmcgKi8KLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0JLyogc3VjY2Vzc2Z1bCByZXR1cm4gKi8KLQlUQ0hFQ0syKCpkcCwgc2l6ZW9mKGFzdGF0KSk7Ci0JcmV0dXJuICgodV9pbnQzMl90ICopIChzaXplb2YoYXN0YXQpICsgKChjaGFyICopZHApKSk7Ci10cnVuYzoKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlc3RhdHVzKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCAqZXIpCi17Ci0JaW50IGVycm51bTsKLQotCVRDSEVDSyhkcFswXSk7Ci0KLQllcnJudW0gPSBFWFRSQUNUXzMyQklUUygmZHBbMF0pOwotCWlmIChlcikKLQkJKmVyID0gZXJybnVtOwotCWlmIChlcnJudW0gIT0gMCkgewotCQlpZiAoIXFmbGFnKQotCQkJcHJpbnRmKCIgRVJST1I6ICVzIiwKLQkJCSAgICB0b2syc3RyKHN0YXR1czJzdHIsICJ1bmsgJWQiLCBlcnJudW0pKTsKLQkJbmZzZXJyID0gMTsKLQl9Ci0JcmV0dXJuIChkcCArIDEpOwotdHJ1bmM6Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2ludDMyX3QgKgotcGFyc2VmYXR0cihjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdmVyYm9zZSwgaW50IHYzKQotewotCWNvbnN0IHN0cnVjdCBuZnNfZmF0dHIgKmZhcDsKLQotCWZhcCA9IChjb25zdCBzdHJ1Y3QgbmZzX2ZhdHRyICopZHA7Ci0JVENIRUNLKGZhcC0+ZmFfZ2lkKTsKLQlpZiAodmVyYm9zZSkgewotCQlwcmludGYoIiAlcyAlbyBpZHMgJWQvJWQiLAotCQkgICAgdG9rMnN0cih0eXBlMnN0ciwgInVuay1mdCAlZCAiLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmFfdHlwZSkpLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmFfbW9kZSksCi0JCSAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYV91aWQpLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmFfZ2lkKSk7Ci0JCWlmICh2MykgewotCQkJVENIRUNLKGZhcC0+ZmEzX3NpemUpOwotCQkJcHJpbnRmKCIgc3ogJSIgUFJJdTY0LAotCQkJCUVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmZmFwLT5mYTNfc2l6ZSkpOwotCQl9IGVsc2UgewotCQkJVENIRUNLKGZhcC0+ZmEyX3NpemUpOwotCQkJcHJpbnRmKCIgc3ogJWQiLCBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfc2l6ZSkpOwotCQl9Ci0JfQotCS8qIHByaW50IGxvdHMgbW9yZSBzdHVmZiAqLwotCWlmICh2ZXJib3NlID4gMSkgewotCQlpZiAodjMpIHsKLQkJCVRDSEVDSyhmYXAtPmZhM19jdGltZSk7Ci0JCQlwcmludGYoIiBubGluayAlZCByZGV2ICVkLyVkIiwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYV9ubGluayksCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEzX3JkZXYuc3BlY2RhdGExKSwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTNfcmRldi5zcGVjZGF0YTIpKTsKLQkJCXByaW50ZigiIGZzaWQgJSIgUFJJeDY0LAotCQkJCUVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmZmFwLT5mYTNfZnNpZCkpOwotCQkJcHJpbnRmKCIgZmlsZWlkICUiIFBSSXg2NCwKLQkJCQlFWFRSQUNUXzY0QklUUygodV9pbnQzMl90ICopJmZhcC0+ZmEzX2ZpbGVpZCkpOwotCQkJcHJpbnRmKCIgYS9tL2N0aW1lICV1LiUwNnUiLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhM19hdGltZS5uZnN2M19zZWMpLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhM19hdGltZS5uZnN2M19uc2VjKSk7Ci0JCQlwcmludGYoIiAldS4lMDZ1IiwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTNfbXRpbWUubmZzdjNfc2VjKSwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTNfbXRpbWUubmZzdjNfbnNlYykpOwotCQkJcHJpbnRmKCIgJXUuJTA2dSIsCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEzX2N0aW1lLm5mc3YzX3NlYyksCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEzX2N0aW1lLm5mc3YzX25zZWMpKTsKLQkJfSBlbHNlIHsKLQkJCVRDSEVDSyhmYXAtPmZhMl9jdGltZSk7Ci0JCQlwcmludGYoIiBubGluayAlZCByZGV2ICV4IGZzaWQgJXggbm9kZWlkICV4IGEvbS9jdGltZSIsCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmFfbmxpbmspLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9yZGV2KSwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfZnNpZCksCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEyX2ZpbGVpZCkpOwotCQkJcHJpbnRmKCIgJXUuJTA2dSIsCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEyX2F0aW1lLm5mc3YyX3NlYyksCi0JCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmZhcC0+ZmEyX2F0aW1lLm5mc3YyX3VzZWMpKTsKLQkJCXByaW50ZigiICV1LiUwNnUiLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9tdGltZS5uZnN2Ml9zZWMpLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZmYXAtPmZhMl9tdGltZS5uZnN2Ml91c2VjKSk7Ci0JCQlwcmludGYoIiAldS4lMDZ1IiwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfY3RpbWUubmZzdjJfc2VjKSwKLQkJCSAgICAgICBFWFRSQUNUXzMyQklUUygmZmFwLT5mYTJfY3RpbWUubmZzdjJfdXNlYykpOwotCQl9Ci0JfQotCXJldHVybiAoKGNvbnN0IHVfaW50MzJfdCAqKSgodW5zaWduZWQgY2hhciAqKWRwICsKLQkJKHYzID8gTkZTWF9WM0ZBVFRSIDogTkZTWF9WMkZBVFRSKSkpOwotdHJ1bmM6Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIGludAotcGFyc2VhdHRyc3RhdChjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdmVyYm9zZSwgaW50IHYzKQotewotCWludCBlcjsKLQotCWRwID0gcGFyc2VzdGF0dXMoZHAsICZlcik7Ci0JaWYgKGRwID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGVyKQotCQlyZXR1cm4gKDEpOwotCi0JcmV0dXJuIChwYXJzZWZhdHRyKGRwLCB2ZXJib3NlLCB2MykgIT0gTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlZGlyb3ByZXMoY29uc3QgdV9pbnQzMl90ICpkcCkKLXsKLQlpbnQgZXI7Ci0KLQlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKLQkJcmV0dXJuICgwKTsKLQlpZiAoZXIpCi0JCXJldHVybiAoMSk7Ci0KLQlkcCA9IHBhcnNlZmgoZHAsIDApOwotCWlmIChkcCA9PSBOVUxMKQotCQlyZXR1cm4gKDApOwotCi0JcmV0dXJuIChwYXJzZWZhdHRyKGRwLCB2ZmxhZywgMCkgIT0gTlVMTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlbGlua3Jlcyhjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdjMpCi17Ci0JaW50IGVyOwotCi0JZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKTsKLQlpZiAoZHAgPT0gTlVMTCkKLQkJcmV0dXJuKDApOwotCWlmIChlcikKLQkJcmV0dXJuKDEpOwotCWlmICh2MyAmJiAhKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZykpKQotCQlyZXR1cm4gKDApOwotCXB1dGNoYXIoJyAnKTsKLQlyZXR1cm4gKHBhcnNlZm4oZHApICE9IE5VTEwpOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZXN0YXRmcyhjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdjMpCi17Ci0JY29uc3Qgc3RydWN0IG5mc19zdGF0ZnMgKnNmc3A7Ci0JaW50IGVyOwotCi0JZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKTsKLQlpZiAoZHAgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQlpZiAoIXYzICYmIGVyKQotCQlyZXR1cm4gKDEpOwotCi0JaWYgKHFmbGFnKQotCQlyZXR1cm4oMSk7Ci0KLQlpZiAodjMpIHsKLQkJaWYgKHZmbGFnKQotCQkJcHJpbnRmKCIgUE9TVDoiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCi0JCQlyZXR1cm4gKDApOwotCX0KLQotCVRDSEVDSzIoKmRwLCAodjMgPyBORlNYX1YzU1RBVEZTIDogTkZTWF9WMlNUQVRGUykpOwotCi0Jc2ZzcCA9IChjb25zdCBzdHJ1Y3QgbmZzX3N0YXRmcyAqKWRwOwotCi0JaWYgKHYzKSB7Ci0JCXByaW50ZigiIHRieXRlcyAlIiBQUkl1NjQgIiBmYnl0ZXMgJSIgUFJJdTY0ICIgYWJ5dGVzICUiIFBSSXU2NCwKLQkJCUVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmc2ZzcC0+c2ZfdGJ5dGVzKSwKLQkJCUVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmc2ZzcC0+c2ZfZmJ5dGVzKSwKLQkJCUVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmc2ZzcC0+c2ZfYWJ5dGVzKSk7Ci0JCWlmICh2ZmxhZykgewotCQkJcHJpbnRmKCIgdGZpbGVzICUiIFBSSXU2NCAiIGZmaWxlcyAlIiBQUkl1NjQgIiBhZmlsZXMgJSIgUFJJdTY0ICIgaW52YXIgJXUiLAotCQkJICAgICAgIEVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmc2ZzcC0+c2ZfdGZpbGVzKSwKLQkJCSAgICAgICBFWFRSQUNUXzY0QklUUygodV9pbnQzMl90ICopJnNmc3AtPnNmX2ZmaWxlcyksCi0JCQkgICAgICAgRVhUUkFDVF82NEJJVFMoKHVfaW50MzJfdCAqKSZzZnNwLT5zZl9hZmlsZXMpLAotCQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnNwLT5zZl9pbnZhcnNlYykpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCIgdHNpemUgJWQgYnNpemUgJWQgYmxvY2tzICVkIGJmcmVlICVkIGJhdmFpbCAlZCIsCi0JCQlFWFRSQUNUXzMyQklUUygmc2ZzcC0+c2ZfdHNpemUpLAotCQkJRVhUUkFDVF8zMkJJVFMoJnNmc3AtPnNmX2JzaXplKSwKLQkJCUVYVFJBQ1RfMzJCSVRTKCZzZnNwLT5zZl9ibG9ja3MpLAotCQkJRVhUUkFDVF8zMkJJVFMoJnNmc3AtPnNmX2JmcmVlKSwKLQkJCUVYVFJBQ1RfMzJCSVRTKCZzZnNwLT5zZl9iYXZhaWwpKTsKLQl9Ci0KLQlyZXR1cm4gKDEpOwotdHJ1bmM6Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotcGFyc2VyZGRpcmVzKGNvbnN0IHVfaW50MzJfdCAqZHApCi17Ci0JaW50IGVyOwotCi0JZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKTsKLQlpZiAoZHAgPT0gTlVMTCkKLQkJcmV0dXJuICgwKTsKLQlpZiAoZXIpCi0JCXJldHVybiAoMSk7Ci0JaWYgKHFmbGFnKQotCQlyZXR1cm4gKDEpOwotCi0JVENIRUNLKGRwWzJdKTsKLQlwcmludGYoIiBvZmZzZXQgJXggc2l6ZSAlZCAiLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmZHBbMF0pLCBFWFRSQUNUXzMyQklUUygmZHBbMV0pKTsKLQlpZiAoZHBbMl0gIT0gMCkKLQkJcHJpbnRmKCIgZW9mIik7Ci0KLQlyZXR1cm4gKDEpOwotdHJ1bmM6Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCi1wYXJzZV93Y2NfYXR0cihjb25zdCB1X2ludDMyX3QgKmRwKQotewotCXByaW50ZigiIHN6ICUiIFBSSXU2NCwgRVhUUkFDVF82NEJJVFMoJmRwWzBdKSk7Ci0JcHJpbnRmKCIgbXRpbWUgJXUuJTA2dSBjdGltZSAldS4lMDZ1IiwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmRwWzJdKSwgRVhUUkFDVF8zMkJJVFMoJmRwWzNdKSwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmRwWzRdKSwgRVhUUkFDVF8zMkJJVFMoJmRwWzVdKSk7Ci0JcmV0dXJuIChkcCArIDYpOwotfQotCi0vKgotICogUHJlIG9wZXJhdGlvbiBhdHRyaWJ1dGVzLiBQcmludCBvbmx5IGlmIHZmbGFnID4gMS4KLSAqLwotc3RhdGljIGNvbnN0IHVfaW50MzJfdCAqCi1wYXJzZV9wcmVfb3BfYXR0cihjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdmVyYm9zZSkKLXsKLQlUQ0hFQ0soZHBbMF0pOwotCWlmICghRVhUUkFDVF8zMkJJVFMoJmRwWzBdKSkKLQkJcmV0dXJuIChkcCArIDEpOwotCWRwKys7Ci0JVENIRUNLMigqZHAsIDI0KTsKLQlpZiAodmVyYm9zZSA+IDEpIHsKLQkJcmV0dXJuIHBhcnNlX3djY19hdHRyKGRwKTsKLQl9IGVsc2UgewotCQkvKiBJZiBub3QgdmVyYm9zZSBlbm91Z2gsIGp1c3Qgc2tpcCBvdmVyIHdjY19hdHRyICovCi0JCXJldHVybiAoZHAgKyA2KTsKLQl9Ci10cnVuYzoKLQlyZXR1cm4gKE5VTEwpOwotfQotCi0vKgotICogUG9zdCBvcGVyYXRpb24gYXR0cmlidXRlcyBhcmUgcHJpbnRlZCBpZiB2ZmxhZyA+PSAxCi0gKi8KLXN0YXRpYyBjb25zdCB1X2ludDMyX3QgKgotcGFyc2VfcG9zdF9vcF9hdHRyKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlKQotewotCVRDSEVDSyhkcFswXSk7Ci0JaWYgKCFFWFRSQUNUXzMyQklUUygmZHBbMF0pKQotCQlyZXR1cm4gKGRwICsgMSk7Ci0JZHArKzsKLQlpZiAodmVyYm9zZSkgewotCQlyZXR1cm4gcGFyc2VmYXR0cihkcCwgdmVyYm9zZSwgMSk7Ci0JfSBlbHNlCi0JCXJldHVybiAoZHAgKyAoTkZTWF9WM0ZBVFRSIC8gc2l6ZW9mICh1X2ludDMyX3QpKSk7Ci10cnVuYzoKLQlyZXR1cm4gKE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlX3djY19kYXRhKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlKQotewotCWlmICh2ZXJib3NlID4gMSkKLQkJcHJpbnRmKCIgUFJFOiIpOwotCWlmICghKGRwID0gcGFyc2VfcHJlX29wX2F0dHIoZHAsIHZlcmJvc2UpKSkKLQkJcmV0dXJuICgwKTsKLQotCWlmICh2ZXJib3NlKQotCQlwcmludGYoIiBQT1NUOiIpOwotCXJldHVybiBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZlcmJvc2UpOwotfQotCi1zdGF0aWMgY29uc3QgdV9pbnQzMl90ICoKLXBhcnNlY3JlYXRlb3ByZXMoY29uc3QgdV9pbnQzMl90ICpkcCwgaW50IHZlcmJvc2UpCi17Ci0JaW50IGVyOwotCi0JaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCi0JCXJldHVybiAoMCk7Ci0JaWYgKGVyKQotCQlkcCA9IHBhcnNlX3djY19kYXRhKGRwLCB2ZXJib3NlKTsKLQllbHNlIHsKLQkJVENIRUNLKGRwWzBdKTsKLQkJaWYgKCFFWFRSQUNUXzMyQklUUygmZHBbMF0pKQotCQkJcmV0dXJuIChkcCArIDEpOwotCQlkcCsrOwotCQlpZiAoIShkcCA9IHBhcnNlZmgoZHAsIDEpKSkKLQkJCXJldHVybiAoMCk7Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlpZiAoIShkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmVyYm9zZSkpKQotCQkJCXJldHVybiAoMCk7Ci0JCQlpZiAodmZsYWcgPiAxKSB7Ci0JCQkJcHJpbnRmKCIgZGlyIGF0dHI6Iik7Ci0JCQkJZHAgPSBwYXJzZV93Y2NfZGF0YShkcCwgdmVyYm9zZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIChkcCk7Ci10cnVuYzoKLQlyZXR1cm4gKE5VTEwpOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZXdjY3Jlcyhjb25zdCB1X2ludDMyX3QgKmRwLCBpbnQgdmVyYm9zZSkKLXsKLQlpbnQgZXI7Ci0KLQlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKLQkJcmV0dXJuICgwKTsKLQlyZXR1cm4gcGFyc2Vfd2NjX2RhdGEoZHAsIHZlcmJvc2UpICE9IDA7Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2ludDMyX3QgKgotcGFyc2V2M3JkZGlycmVzKGNvbnN0IHVfaW50MzJfdCAqZHAsIGludCB2ZXJib3NlKQotewotCWludCBlcjsKLQotCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQotCQlyZXR1cm4gKDApOwotCWlmICh2ZmxhZykKLQkJcHJpbnRmKCIgUE9TVDoiKTsKLQlpZiAoIShkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmVyYm9zZSkpKQotCQlyZXR1cm4gKDApOwotCWlmIChlcikKLQkJcmV0dXJuIGRwOwotCWlmICh2ZmxhZykgewotCQlUQ0hFQ0soZHBbMV0pOwotCQlwcmludGYoIiB2ZXJmICUwOHglMDh4IiwgZHBbMF0sIGRwWzFdKTsKLQkJZHAgKz0gMjsKLQl9Ci0JcmV0dXJuIGRwOwotdHJ1bmM6Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIGludAotcGFyc2Vmc2luZm8oY29uc3QgdV9pbnQzMl90ICpkcCkKLXsKLQlzdHJ1Y3QgbmZzdjNfZnNpbmZvICpzZnA7Ci0JaW50IGVyOwotCi0JaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCi0JCXJldHVybiAoMCk7Ci0JaWYgKHZmbGFnKQotCQlwcmludGYoIiBQT1NUOiIpOwotCWlmICghKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZykpKQotCQlyZXR1cm4gKDApOwotCWlmIChlcikKLQkJcmV0dXJuICgxKTsKLQotCXNmcCA9IChzdHJ1Y3QgbmZzdjNfZnNpbmZvICopZHA7Ci0JVENIRUNLKCpzZnApOwotCXByaW50ZigiIHJ0bWF4ICV1IHJ0cHJlZiAldSB3dG1heCAldSB3dHByZWYgJXUgZHRwcmVmICV1IiwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNmcC0+ZnNfcnRtYXgpLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmc2ZwLT5mc19ydHByZWYpLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmc2ZwLT5mc193dG1heCksCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX3d0cHJlZiksCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX2R0cHJlZikpOwotCWlmICh2ZmxhZykgewotCQlwcmludGYoIiBydG11bHQgJXUgd3RtdWx0ICV1IG1heGZzeiAlIiBQUkl1NjQsCi0JCSAgICAgICBFWFRSQUNUXzMyQklUUygmc2ZwLT5mc19ydG11bHQpLAotCQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNmcC0+ZnNfd3RtdWx0KSwKLQkJICAgICAgIEVYVFJBQ1RfNjRCSVRTKCh1X2ludDMyX3QgKikmc2ZwLT5mc19tYXhmaWxlc2l6ZSkpOwotCQlwcmludGYoIiBkZWx0YSAldS4lMDZ1ICIsCi0JCSAgICAgICBFWFRSQUNUXzMyQklUUygmc2ZwLT5mc190aW1lZGVsdGEubmZzdjNfc2VjKSwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzZnAtPmZzX3RpbWVkZWx0YS5uZnN2M19uc2VjKSk7Ci0JfQotCXJldHVybiAoMSk7Ci10cnVuYzoKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci1wYXJzZXBhdGhjb25mKGNvbnN0IHVfaW50MzJfdCAqZHApCi17Ci0JaW50IGVyOwotCXN0cnVjdCBuZnN2M19wYXRoY29uZiAqc3BwOwotCi0JaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCi0JCXJldHVybiAoMCk7Ci0JaWYgKHZmbGFnKQotCQlwcmludGYoIiBQT1NUOiIpOwotCWlmICghKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZykpKQotCQlyZXR1cm4gKDApOwotCWlmIChlcikKLQkJcmV0dXJuICgxKTsKLQotCXNwcCA9IChzdHJ1Y3QgbmZzdjNfcGF0aGNvbmYgKilkcDsKLQlUQ0hFQ0soKnNwcCk7Ci0KLQlwcmludGYoIiBsaW5rbWF4ICV1IG5hbWVtYXggJXUgJXMgJXMgJXMgJXMiLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmc3BwLT5wY19saW5rbWF4KSwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNwcC0+cGNfbmFtZW1heCksCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzcHAtPnBjX25vdHJ1bmMpID8gIm5vdHJ1bmMiIDogIiIsCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzcHAtPnBjX2Nob3ducmVzdHJpY3RlZCkgPyAiY2hvd25yZXMiIDogIiIsCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzcHAtPnBjX2Nhc2VpbnNlbnNpdGl2ZSkgPyAiaWduY2FzZSIgOiAiIiwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNwcC0+cGNfY2FzZXByZXNlcnZpbmcpID8gImtlZXBjYXNlIiA6ICIiKTsKLQlyZXR1cm4gKDEpOwotdHJ1bmM6Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIHZvaWQKLWludGVycF9yZXBseShjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqcnAsIHVfaW50MzJfdCBwcm9jLCB1X2ludDMyX3QgdmVycywgaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCB1X2ludDMyX3QgKmRwOwotCXJlZ2lzdGVyIGludCB2MzsKLQlpbnQgZXI7Ci0KLQl2MyA9ICh2ZXJzID09IE5GU19WRVIzKTsKLQotCWlmICghdjMgJiYgcHJvYyA8IE5GU19OUFJPQ1MpCi0JCXByb2MgPSBuZnN2M19wcm9jaWRbcHJvY107Ci0KLQlzd2l0Y2ggKHByb2MpIHsKLQotCWNhc2UgTkZTUFJPQ19OT09QOgotCQlwcmludGYoIiBub3AiKTsKLQkJcmV0dXJuOwotCi0JY2FzZSBORlNQUk9DX05VTEw6Ci0JCXByaW50ZigiIG51bGwiKTsKLQkJcmV0dXJuOwotCi0JY2FzZSBORlNQUk9DX0dFVEFUVFI6Ci0JCXByaW50ZigiIGdldGF0dHIiKTsKLQkJZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKTsKLQkJaWYgKGRwICE9IE5VTEwgJiYgcGFyc2VhdHRyc3RhdChkcCwgIXFmbGFnLCB2MykgIT0gMCkKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfU0VUQVRUUjoKLQkJcHJpbnRmKCIgc2V0YXR0ciIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCXJldHVybjsKLQkJaWYgKHYzKSB7Ci0JCQlpZiAocGFyc2V3Y2NyZXMoZHAsIHZmbGFnKSkKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGFyc2VhdHRyc3RhdChkcCwgIXFmbGFnLCAwKSAhPSAwKQotCQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19MT09LVVA6Ci0JCXByaW50ZigiIGxvb2t1cCIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCWJyZWFrOwotCQlpZiAodjMpIHsKLQkJCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQotCQkJCWJyZWFrOwotCQkJaWYgKGVyKSB7Ci0JCQkJaWYgKHZmbGFnID4gMSkgewotCQkJCQlwcmludGYoIiBwb3N0IGRhdHRyOiIpOwotCQkJCQlkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmZsYWcpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCEoZHAgPSBwYXJzZWZoKGRwLCB2MykpKQotCQkJCQlicmVhazsKLQkJCQlpZiAoKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZykpICYmCi0JCQkJICAgIHZmbGFnID4gMSkgewotCQkJCQlwcmludGYoIiBwb3N0IGRhdHRyOiIpOwotCQkJCQlkcCA9IHBhcnNlX3Bvc3Rfb3BfYXR0cihkcCwgdmZsYWcpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkcCkKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGFyc2VkaXJvcHJlcyhkcCkgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfQUNDRVNTOgotCQlwcmludGYoIiBhY2Nlc3MiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCi0JCQlicmVhazsKLQkJaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCi0JCQlicmVhazsKLQkJaWYgKHZmbGFnKQotCQkJcHJpbnRmKCIgYXR0cjoiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCi0JCQlicmVhazsKLQkJaWYgKCFlcikKLQkJCXByaW50ZigiIGMgJTA0eCIsIEVYVFJBQ1RfMzJCSVRTKCZkcFswXSkpOwotCQlyZXR1cm47Ci0KLQljYXNlIE5GU1BST0NfUkVBRExJTks6Ci0JCXByaW50ZigiIHJlYWRsaW5rIik7Ci0JCWRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCk7Ci0JCWlmIChkcCAhPSBOVUxMICYmIHBhcnNlbGlua3JlcyhkcCwgdjMpICE9IDApCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1JFQUQ6Ci0JCXByaW50ZigiIHJlYWQiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCi0JCQlicmVhazsKLQkJaWYgKHYzKSB7Ci0JCQlpZiAoIShkcCA9IHBhcnNlc3RhdHVzKGRwLCAmZXIpKSkKLQkJCQlicmVhazsKLQkJCWlmICghKGRwID0gcGFyc2VfcG9zdF9vcF9hdHRyKGRwLCB2ZmxhZykpKQotCQkJCWJyZWFrOwotCQkJaWYgKGVyKQotCQkJCXJldHVybjsKLQkJCWlmICh2ZmxhZykgewotCQkJCVRDSEVDSyhkcFsxXSk7Ci0JCQkJcHJpbnRmKCIgJXUgYnl0ZXMiLCBFWFRSQUNUXzMyQklUUygmZHBbMF0pKTsKLQkJCQlpZiAoRVhUUkFDVF8zMkJJVFMoJmRwWzFdKSkKLQkJCQkJcHJpbnRmKCIgRU9GIik7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGFyc2VhdHRyc3RhdChkcCwgdmZsYWcsIDApICE9IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1dSSVRFOgotCQlwcmludGYoIiB3cml0ZSIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCWJyZWFrOwotCQlpZiAodjMpIHsKLQkJCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQotCQkJCWJyZWFrOwotCQkJaWYgKCEoZHAgPSBwYXJzZV93Y2NfZGF0YShkcCwgdmZsYWcpKSkKLQkJCQlicmVhazsKLQkJCWlmIChlcikKLQkJCQlyZXR1cm47Ci0JCQlpZiAodmZsYWcpIHsKLQkJCQlUQ0hFQ0soZHBbMF0pOwotCQkJCXByaW50ZigiICV1IGJ5dGVzIiwgRVhUUkFDVF8zMkJJVFMoJmRwWzBdKSk7Ci0JCQkJaWYgKHZmbGFnID4gMSkgewotCQkJCQlUQ0hFQ0soZHBbMV0pOwotCQkJCQlwcmludGYoIiA8JXM+IiwKLQkJCQkJCXRvazJzdHIobmZzdjNfd3JpdGVtb2RlcywKLQkJCQkJCQlOVUxMLCBFWFRSQUNUXzMyQklUUygmZHBbMV0pKSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZWF0dHJzdGF0KGRwLCB2ZmxhZywgdjMpICE9IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX0NSRUFURToKLQkJcHJpbnRmKCIgY3JlYXRlIik7Ci0JCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQotCQkJYnJlYWs7Ci0JCWlmICh2MykgewotCQkJaWYgKHBhcnNlY3JlYXRlb3ByZXMoZHAsIHZmbGFnKSAhPSAwKQotCQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZWRpcm9wcmVzKGRwKSAhPSAwKQotCQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19NS0RJUjoKLQkJcHJpbnRmKCIgbWtkaXIiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCi0JCQlicmVhazsKLQkJaWYgKHYzKSB7Ci0JCQlpZiAocGFyc2VjcmVhdGVvcHJlcyhkcCwgdmZsYWcpICE9IDApCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJaWYgKHBhcnNlZGlyb3ByZXMoZHApICE9IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1NZTUxJTks6Ci0JCXByaW50ZigiIHN5bWxpbmsiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCi0JCQlicmVhazsKLQkJaWYgKHYzKSB7Ci0JCQlpZiAocGFyc2VjcmVhdGVvcHJlcyhkcCwgdmZsYWcpICE9IDApCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJaWYgKHBhcnNlc3RhdHVzKGRwLCAmZXIpICE9IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX01LTk9EOgotCQlwcmludGYoIiBta25vZCIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCWJyZWFrOwotCQlpZiAocGFyc2VjcmVhdGVvcHJlcyhkcCwgdmZsYWcpICE9IDApCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1JFTU9WRToKLQkJcHJpbnRmKCIgcmVtb3ZlIik7Ci0JCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQotCQkJYnJlYWs7Ci0JCWlmICh2MykgewotCQkJaWYgKHBhcnNld2NjcmVzKGRwLCB2ZmxhZykpCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJaWYgKHBhcnNlc3RhdHVzKGRwLCAmZXIpICE9IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX1JNRElSOgotCQlwcmludGYoIiBybWRpciIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCWJyZWFrOwotCQlpZiAodjMpIHsKLQkJCWlmIChwYXJzZXdjY3JlcyhkcCwgdmZsYWcpKQotCQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZXN0YXR1cyhkcCwgJmVyKSAhPSAwKQotCQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19SRU5BTUU6Ci0JCXByaW50ZigiIHJlbmFtZSIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCWJyZWFrOwotCQlpZiAodjMpIHsKLQkJCWlmICghKGRwID0gcGFyc2VzdGF0dXMoZHAsICZlcikpKQotCQkJCWJyZWFrOwotCQkJaWYgKHZmbGFnKSB7Ci0JCQkJcHJpbnRmKCIgZnJvbToiKTsKLQkJCQlpZiAoIShkcCA9IHBhcnNlX3djY19kYXRhKGRwLCB2ZmxhZykpKQotCQkJCQlicmVhazsKLQkJCQlwcmludGYoIiB0bzoiKTsKLQkJCQlpZiAoIShkcCA9IHBhcnNlX3djY19kYXRhKGRwLCB2ZmxhZykpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCWlmIChwYXJzZXN0YXR1cyhkcCwgJmVyKSAhPSAwKQotCQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19MSU5LOgotCQlwcmludGYoIiBsaW5rIik7Ci0JCWlmICghKGRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCkpKQotCQkJYnJlYWs7Ci0JCWlmICh2MykgewotCQkJaWYgKCEoZHAgPSBwYXJzZXN0YXR1cyhkcCwgJmVyKSkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodmZsYWcpIHsKLQkJCQlwcmludGYoIiBmaWxlIFBPU1Q6Iik7Ci0JCQkJaWYgKCEoZHAgPSBwYXJzZV9wb3N0X29wX2F0dHIoZHAsIHZmbGFnKSkpCi0JCQkJCWJyZWFrOwotCQkJCXByaW50ZigiIGRpcjoiKTsKLQkJCQlpZiAoIShkcCA9IHBhcnNlX3djY19kYXRhKGRwLCB2ZmxhZykpKQotCQkJCQlicmVhazsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGFyc2VzdGF0dXMoZHAsICZlcikgIT0gMCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfUkVBRERJUjoKLQkJcHJpbnRmKCIgcmVhZGRpciIpOwotCQlpZiAoIShkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpKSkKLQkJCWJyZWFrOwotCQlpZiAodjMpIHsKLQkJCWlmIChwYXJzZXYzcmRkaXJyZXMoZHAsIHZmbGFnKSkKLQkJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGFyc2VyZGRpcmVzKGRwKSAhPSAwKQotCQkJCXJldHVybjsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19SRUFERElSUExVUzoKLQkJcHJpbnRmKCIgcmVhZGRpcnBsdXMiKTsKLQkJaWYgKCEoZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKSkpCi0JCQlicmVhazsKLQkJaWYgKHBhcnNldjNyZGRpcnJlcyhkcCwgdmZsYWcpKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19GU1NUQVQ6Ci0JCXByaW50ZigiIGZzc3RhdCIpOwotCQlkcCA9IHBhcnNlcmVwKHJwLCBsZW5ndGgpOwotCQlpZiAoZHAgIT0gTlVMTCAmJiBwYXJzZXN0YXRmcyhkcCwgdjMpICE9IDApCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBORlNQUk9DX0ZTSU5GTzoKLQkJcHJpbnRmKCIgZnNpbmZvIik7Ci0JCWRwID0gcGFyc2VyZXAocnAsIGxlbmd0aCk7Ci0JCWlmIChkcCAhPSBOVUxMICYmIHBhcnNlZnNpbmZvKGRwKSAhPSAwKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgTkZTUFJPQ19QQVRIQ09ORjoKLQkJcHJpbnRmKCIgcGF0aGNvbmYiKTsKLQkJZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKTsKLQkJaWYgKGRwICE9IE5VTEwgJiYgcGFyc2VwYXRoY29uZihkcCkgIT0gMCkKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0KLQljYXNlIE5GU1BST0NfQ09NTUlUOgotCQlwcmludGYoIiBjb21taXQiKTsKLQkJZHAgPSBwYXJzZXJlcChycCwgbGVuZ3RoKTsKLQkJaWYgKGRwICE9IE5VTEwgJiYgcGFyc2V3Y2NyZXMoZHAsIHZmbGFnKSAhPSAwKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ZigiIHByb2MtJXUiLCBwcm9jKTsKLQkJcmV0dXJuOwotCX0KLXRydW5jOgotCWlmICghbmZzZXJyKQotCQlmcHV0cygiIFt8bmZzXSIsIHN0ZG91dCk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1udHAuYyBiL3ByaW50LW50cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDZhNjU0Li4wMDAwMDAwCi0tLSBhL3ByaW50LW50cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBGb3JtYXQgYW5kIHByaW50IG50cCBwYWNrZXRzLgotICoJQnkgSmVmZnJleSBNb2d1bC9ERUNXUkwKLSAqCWxvb3NlbHkgYmFzZWQgb24gcHJpbnQtYm9vdHAuYwotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW50cC5jLHYgMS40MS4yLjEgMjAwNS8wNS8wNiAwNzo1NzoxOCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2lmZGVmIEhBVkVfU1RSRlRJTUUKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaWZkZWYgTU9ERU1BU0sKLSN1bmRlZiBNT0RFTUFTSwkJCQkJLyogU29sYXJpcyBzdWNrcyAqLwotI2VuZGlmCi0jaW5jbHVkZSAibnRwLmgiCi0KLXN0YXRpYyB2b2lkIHBfc2ZpeChjb25zdCBzdHJ1Y3Qgc19maXhlZHB0ICopOwotc3RhdGljIHZvaWQgcF9udHBfdGltZShjb25zdCBzdHJ1Y3QgbF9maXhlZHB0ICopOwotc3RhdGljIHZvaWQgcF9udHBfZGVsdGEoY29uc3Qgc3RydWN0IGxfZml4ZWRwdCAqLCBjb25zdCBzdHJ1Y3QgbF9maXhlZHB0ICopOwotCi1zdGF0aWMgc3RydWN0IHRvayBudHBfbW9kZV92YWx1ZXNbXSA9IHsKLSAgICB7IE1PREVfVU5TUEVDLCAgICAidW5zcGVjaWZpZWQiIH0sCi0gICAgeyBNT0RFX1NZTV9BQ1QsICAgInN5bW1ldHJpYyBhY3RpdmUiIH0sCi0gICAgeyBNT0RFX1NZTV9QQVMsICAgInN5bW1ldHJpYyBwYXNzaXZlIiB9LAotICAgIHsgTU9ERV9DTElFTlQsICAgICJDbGllbnQiIH0sCi0gICAgeyBNT0RFX1NFUlZFUiwgICAgIlNlcnZlciIgfSwKLSAgICB7IE1PREVfQlJPQURDQVNULCAiQnJvYWRjYXN0IiB9LAotICAgIHsgTU9ERV9SRVMxLCAgICAgICJSZXNlcnZlZCIgfSwKLSAgICB7IE1PREVfUkVTMiwgICAgICAiUmVzZXJ2ZWQiIH0sCi0gICAgeyAwLCBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIG50cF9sZWFwaW5kX3ZhbHVlc1tdID0gewotICAgIHsgTk9fV0FSTklORywgICAgICIiIH0sCi0gICAgeyBQTFVTX1NFQywgICAgICAgIisxcyIgfSwKLSAgICB7IE1JTlVTX1NFQywgICAgICAiLTFzIiB9LAotICAgIHsgQUxBUk0sICAgICAgICAgICJjbG9jayB1bnN5bmNocm9uaXplZCIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotLyoKLSAqIFByaW50IG50cCByZXF1ZXN0cwotICovCi12b2lkCi1udHBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCwgdV9pbnQgbGVuZ3RoKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBudHBkYXRhICpicDsKLQlpbnQgbW9kZSwgdmVyc2lvbiwgbGVhcGluZDsKLQotCWJwID0gKHN0cnVjdCBudHBkYXRhICopY3A7Ci0KLQlUQ0hFQ0soYnAtPnN0YXR1cyk7Ci0KLQl2ZXJzaW9uID0gKGludCkoYnAtPnN0YXR1cyAmIFZFUlNJT05NQVNLKSA+PiAzOwotCXByaW50ZigiTlRQdiVkIiwgdmVyc2lvbik7Ci0KLQltb2RlID0gYnAtPnN0YXR1cyAmIE1PREVNQVNLOwotICAgICAgICBpZiAoIXZmbGFnKSB7Ci0gICAgICAgICAgICBwcmludGYgKCIsICVzLCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgICB0b2syc3RyKG50cF9tb2RlX3ZhbHVlcywgIlVua25vd24gbW9kZSIsIG1vZGUpLAotICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcmludGYgKCIsIGxlbmd0aCAldVxuXHQlcyIsCi0gICAgICAgICAgICAgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgIHRvazJzdHIobnRwX21vZGVfdmFsdWVzLCAiVW5rbm93biBtb2RlIiwgbW9kZSkpOyAgICAgICAgCi0KLQlsZWFwaW5kID0gYnAtPnN0YXR1cyAmIExFQVBNQVNLOwotICAgICAgICBwcmludGYgKCIsIExlYXAgaW5kaWNhdG9yOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICB0b2syc3RyKG50cF9sZWFwaW5kX3ZhbHVlcywgIlVua25vd24iLCBsZWFwaW5kKSwKLSAgICAgICAgICAgICAgICBsZWFwaW5kKTsKLQotCVRDSEVDSyhicC0+c3RyYXR1bSk7Ci0JcHJpbnRmKCIsIFN0cmF0dW0gJXUiLCBicC0+c3RyYXR1bSk7Ci0KLQlUQ0hFQ0soYnAtPnBwb2xsKTsKLQlwcmludGYoIiwgcG9sbCAldXMiLCBicC0+cHBvbGwpOwotCi0JLyogQ2FuJ3QgVENIRUNLIGJwLT5wcmVjaXNpb24gYml0ZmllbGQgc28gYnAtPmRpc3RhbmNlICsgMCBpbnN0ZWFkICovCi0JVENIRUNLMihicC0+cm9vdF9kZWxheSwgMCk7Ci0JcHJpbnRmKCIsIHByZWNpc2lvbiAlZCIsIGJwLT5wcmVjaXNpb24pOwotCi0JVENIRUNLKGJwLT5yb290X2RlbGF5KTsKLQlmcHV0cygiXG5cdFJvb3QgRGVsYXk6ICIsIHN0ZG91dCk7Ci0JcF9zZml4KCZicC0+cm9vdF9kZWxheSk7Ci0KLQlUQ0hFQ0soYnAtPnJvb3RfZGlzcGVyc2lvbik7Ci0JZnB1dHMoIiwgUm9vdCBkaXNwZXJzaW9uOiAiLCBzdGRvdXQpOwotCXBfc2ZpeCgmYnAtPnJvb3RfZGlzcGVyc2lvbik7Ci0KLQlUQ0hFQ0soYnAtPnJlZmlkKTsKLQlmcHV0cygiLCBSZWZlcmVuY2UtSUQ6ICIsIHN0ZG91dCk7Ci0JLyogSW50ZXJwcmV0YXRpb24gZGVwZW5kcyBvbiBzdHJhdHVtICovCi0Jc3dpdGNoIChicC0+c3RyYXR1bSkgewotCi0JY2FzZSBVTlNQRUNJRklFRDoKLQkJcHJpbnRmKCIodW5zcGVjKSIpOwotCQlicmVhazsKLQotCWNhc2UgUFJJTV9SRUY6Ci0JCWlmIChmbl9wcmludG4oKHVfY2hhciAqKSYoYnAtPnJlZmlkKSwgNCwgc25hcGVuZCkpCi0JCQlnb3RvIHRydW5jOwotCQlicmVhazsKLQotCWNhc2UgSU5GT19RVUVSWToKLQkJcHJpbnRmKCIlcyBJTkZPX1FVRVJZIiwgaXBhZGRyX3N0cmluZygmKGJwLT5yZWZpZCkpKTsKLQkJLyogdGhpcyBkb2Vzbid0IGhhdmUgbW9yZSBjb250ZW50ICovCi0JCXJldHVybjsKLQotCWNhc2UgSU5GT19SRVBMWToKLQkJcHJpbnRmKCIlcyBJTkZPX1JFUExZIiwgaXBhZGRyX3N0cmluZygmKGJwLT5yZWZpZCkpKTsKLQkJLyogdGhpcyBpcyB0b28gY29tcGxleCB0byBiZSB3b3J0aCBwcmludGluZyAqLwotCQlyZXR1cm47Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIiVzIiwgaXBhZGRyX3N0cmluZygmKGJwLT5yZWZpZCkpKTsKLQkJYnJlYWs7Ci0JfQotCi0JVENIRUNLKGJwLT5yZWZfdGltZXN0YW1wKTsKLQlmcHV0cygiXG5cdCAgUmVmZXJlbmNlIFRpbWVzdGFtcDogICIsIHN0ZG91dCk7Ci0JcF9udHBfdGltZSgmKGJwLT5yZWZfdGltZXN0YW1wKSk7Ci0KLQlUQ0hFQ0soYnAtPm9yZ190aW1lc3RhbXApOwotCWZwdXRzKCJcblx0ICBPcmlnaW5hdG9yIFRpbWVzdGFtcDogIiwgc3Rkb3V0KTsKLQlwX250cF90aW1lKCYoYnAtPm9yZ190aW1lc3RhbXApKTsKLQotCVRDSEVDSyhicC0+cmVjX3RpbWVzdGFtcCk7Ci0JZnB1dHMoIlxuXHQgIFJlY2VpdmUgVGltZXN0YW1wOiAgICAiLCBzdGRvdXQpOwotCXBfbnRwX3RpbWUoJihicC0+cmVjX3RpbWVzdGFtcCkpOwotCi0JVENIRUNLKGJwLT54bXRfdGltZXN0YW1wKTsKLQlmcHV0cygiXG5cdCAgVHJhbnNtaXQgVGltZXN0YW1wOiAgICIsIHN0ZG91dCk7Ci0JcF9udHBfdGltZSgmKGJwLT54bXRfdGltZXN0YW1wKSk7Ci0KLQlmcHV0cygiXG5cdCAgICBPcmlnaW5hdG9yIC0gUmVjZWl2ZSBUaW1lc3RhbXA6ICAiLCBzdGRvdXQpOwotCXBfbnRwX2RlbHRhKCYoYnAtPm9yZ190aW1lc3RhbXApLCAmKGJwLT5yZWNfdGltZXN0YW1wKSk7Ci0KLQlmcHV0cygiXG5cdCAgICBPcmlnaW5hdG9yIC0gVHJhbnNtaXQgVGltZXN0YW1wOiAiLCBzdGRvdXQpOwotCXBfbnRwX2RlbHRhKCYoYnAtPm9yZ190aW1lc3RhbXApLCAmKGJwLT54bXRfdGltZXN0YW1wKSk7Ci0KLSAgICAgICAgLyogRklYTUUga2V5LWlkLCBhdXRoZW50aWNhdGlvbiAqLwotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlmcHV0cygiIFt8bnRwXSIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wX3NmaXgocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHNfZml4ZWRwdCAqc2ZwKQotewotCXJlZ2lzdGVyIGludCBpOwotCXJlZ2lzdGVyIGludCBmOwotCXJlZ2lzdGVyIGZsb2F0IGZmOwotCi0JaSA9IEVYVFJBQ1RfMTZCSVRTKCZzZnAtPmludF9wYXJ0KTsKLQlmID0gRVhUUkFDVF8xNkJJVFMoJnNmcC0+ZnJhY3Rpb24pOwotCWZmID0gZiAvIDY1NTM2LjA7CS8qIHNoaWZ0IHJhZGl4IHBvaW50IGJ5IDE2IGJpdHMgKi8KLQlmID0gZmYgKiAxMDAwMDAwLjA7CS8qIFRyZWF0IGZyYWN0aW9uIGFzIHBhcnRzIHBlciBtaWxsaW9uICovCi0JcHJpbnRmKCIlZC4lMDZkIiwgaSwgZik7Ci19Ci0KLSNkZWZpbmUJRk1BWElOVAkoNDI5NDk2NzI5Ni4wKQkvKiBmbG9hdGluZyBwb2ludCByZXAuIG9mIE1BWElOVCAqLwotCi1zdGF0aWMgdm9pZAotcF9udHBfdGltZShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbF9maXhlZHB0ICpsZnApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCBpOwotCXJlZ2lzdGVyIHVfaW50MzJfdCB1ZjsKLQlyZWdpc3RlciB1X2ludDMyX3QgZjsKLQlyZWdpc3RlciBmbG9hdCBmZjsKLQotCWkgPSBFWFRSQUNUXzMyQklUUygmbGZwLT5pbnRfcGFydCk7Ci0JdWYgPSBFWFRSQUNUXzMyQklUUygmbGZwLT5mcmFjdGlvbik7Ci0JZmYgPSB1ZjsKLQlpZiAoZmYgPCAwLjApCQkvKiBzb21lIGNvbXBpbGVycyBhcmUgYnVnZ3kgKi8KLQkJZmYgKz0gRk1BWElOVDsKLQlmZiA9IGZmIC8gRk1BWElOVDsJLyogc2hpZnQgcmFkaXggcG9pbnQgYnkgMzIgYml0cyAqLwotCWYgPSBmZiAqIDEwMDAwMDAwMDAuMDsJLyogdHJlYXQgZnJhY3Rpb24gYXMgcGFydHMgcGVyIGJpbGxpb24gKi8KLQlwcmludGYoIiV1LiUwOWQiLCBpLCBmKTsKLQotI2lmZGVmIEhBVkVfU1RSRlRJTUUKLQkvKgotCSAqIHByaW50IHRoZSB0aW1lIGluIGh1bWFuLXJlYWRhYmxlIGZvcm1hdC4KLQkgKi8KLQlpZiAoaSkgewotCSAgICB0aW1lX3Qgc2Vjb25kcyA9IGkgLSBKQU5fMTk3MDsKLQkgICAgc3RydWN0IHRtICp0bTsKLQkgICAgY2hhciB0aW1lX2J1ZlsxMjhdOwotCi0JICAgIHRtID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsKLQkgICAgc3RyZnRpbWUodGltZV9idWYsIHNpemVvZiAodGltZV9idWYpLCAiJVkvJW0vJWQgJUg6JU06JVMiLCB0bSk7Ci0JICAgIHByaW50ZiAoIiAoJXMpIiwgdGltZV9idWYpOwotCX0KLSNlbmRpZgotfQotCi0vKiBQcmludHMgdGltZSBkaWZmZXJlbmNlIGJldHdlZW4gKmxmcCBhbmQgKm9sZnAgKi8KLXN0YXRpYyB2b2lkCi1wX250cF9kZWx0YShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbF9maXhlZHB0ICpvbGZwLAotCSAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbF9maXhlZHB0ICpsZnApCi17Ci0JcmVnaXN0ZXIgaW50MzJfdCBpOwotCXJlZ2lzdGVyIHVfaW50MzJfdCB1LCB1ZjsKLQlyZWdpc3RlciB1X2ludDMyX3Qgb3UsIG91ZjsKLQlyZWdpc3RlciB1X2ludDMyX3QgZjsKLQlyZWdpc3RlciBmbG9hdCBmZjsKLQlpbnQgc2lnbmJpdDsKLQotCXUgPSBFWFRSQUNUXzMyQklUUygmbGZwLT5pbnRfcGFydCk7Ci0Jb3UgPSBFWFRSQUNUXzMyQklUUygmb2xmcC0+aW50X3BhcnQpOwotCXVmID0gRVhUUkFDVF8zMkJJVFMoJmxmcC0+ZnJhY3Rpb24pOwotCW91ZiA9IEVYVFJBQ1RfMzJCSVRTKCZvbGZwLT5mcmFjdGlvbik7Ci0JaWYgKG91ID09IDAgJiYgb3VmID09IDApIHsKLQkJcF9udHBfdGltZShsZnApOwotCQlyZXR1cm47Ci0JfQotCi0JaSA9IHUgLSBvdTsKLQotCWlmIChpID4gMCkgewkJLyogbmV3IGlzIGRlZmluaXRlbHkgZ3JlYXRlciB0aGFuIG9sZCAqLwotCQlzaWduYml0ID0gMDsKLQkJZiA9IHVmIC0gb3VmOwotCQlpZiAob3VmID4gdWYpCS8qIG11c3QgYm9ycm93IGZyb20gaGlnaC1vcmRlciBiaXRzICovCi0JCQlpIC09IDE7Ci0JfSBlbHNlIGlmIChpIDwgMCkgewkvKiBuZXcgaXMgZGVmaW5pdGVseSBsZXNzIHRoYW4gb2xkICovCi0JCXNpZ25iaXQgPSAxOwotCQlmID0gb3VmIC0gdWY7Ci0JCWlmICh1ZiA+IG91ZikJLyogbXVzdCBjYXJyeSBpbnRvIHRoZSBoaWdoLW9yZGVyIGJpdHMgKi8KLQkJCWkgKz0gMTsKLQkJaSA9IC1pOwotCX0gZWxzZSB7CQkvKiBpbnRfcGFydCBpcyB6ZXJvICovCi0JCWlmICh1ZiA+IG91ZikgewotCQkJc2lnbmJpdCA9IDA7Ci0JCQlmID0gdWYgLSBvdWY7Ci0JCX0gZWxzZSB7Ci0JCQlzaWduYml0ID0gMTsKLQkJCWYgPSBvdWYgLSB1ZjsKLQkJfQotCX0KLQotCWZmID0gZjsKLQlpZiAoZmYgPCAwLjApCQkvKiBzb21lIGNvbXBpbGVycyBhcmUgYnVnZ3kgKi8KLQkJZmYgKz0gRk1BWElOVDsKLQlmZiA9IGZmIC8gRk1BWElOVDsJLyogc2hpZnQgcmFkaXggcG9pbnQgYnkgMzIgYml0cyAqLwotCWYgPSBmZiAqIDEwMDAwMDAwMDAuMDsJLyogdHJlYXQgZnJhY3Rpb24gYXMgcGFydHMgcGVyIGJpbGxpb24gKi8KLQlpZiAoc2lnbmJpdCkKLQkJcHV0Y2hhcignLScpOwotCWVsc2UKLQkJcHV0Y2hhcignKycpOwotCXByaW50ZigiJWQuJTA5ZCIsIGksIGYpOwotfQotCmRpZmYgLS1naXQgYS9wcmludC1udWxsLmMgYi9wcmludC1udWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjAzZGEuLjAwMDAwMDAKLS0tIGEvcHJpbnQtbnVsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1udWxsLmMsdiAxLjUzLjIuNCAyMDA3LzAyLzI2IDEzOjMxOjMzIGhhbm5lcyBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHBjYXAuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImFmLmgiCi0KLSNpbmNsdWRlICJpcC5oIgotI2lmZGVmIElORVQ2Ci0jaW5jbHVkZSAiaXA2LmgiCi0jZW5kaWYKLQotLyoKLSAqIFRoZSBETFRfTlVMTCBwYWNrZXQgaGVhZGVyIGlzIDQgYnl0ZXMgbG9uZy4gSXQgY29udGFpbnMgYSBob3N0LWJ5dGUtb3JkZXIKLSAqIDMyLWJpdCBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSBmYW1pbHksIGUuZy4gQUZfSU5FVC4KLSAqCi0gKiBOb3RlIGhlcmUgdGhhdCAiaG9zdCIgcmVmZXJzIHRvIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBwYWNrZXRzIHdlcmUKLSAqIGNhcHR1cmVkOyB0aGF0IGlzbid0IG5lY2Vzc2FyaWx5ICp0aGlzKiBob3N0LgotICoKLSAqIFRoZSBPcGVuQlNEIERMVF9MT09QIHBhY2tldCBoZWFkZXIgaXMgdGhlIHNhbWUsIGV4Y2VwdCB0aGF0IHRoZSBpbnRlZ2VyCi0gKiBpcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKi8KLSNkZWZpbmUJTlVMTF9IRFJMRU4gNAotCi0KLS8qCi0gKiBCeXRlLXN3YXAgYSAzMi1iaXQgbnVtYmVyLgotICogKCJodG9ubCgpIiBvciAibnRvaGwoKSIgd29uJ3Qgd29yayAtIHdlIHdhbnQgdG8gYnl0ZS1zd2FwIGV2ZW4gb24KLSAqIGJpZy1lbmRpYW4gcGxhdGZvcm1zLikKLSAqLwotI2RlZmluZQlTV0FQTE9ORyh5KSBcCi0oKCgoeSkmMHhmZik8PDI0KSB8ICgoKHkpJjB4ZmYwMCk8PDgpIHwgKCgoeSkmMHhmZjAwMDApPj44KSB8ICgoKHkpPj4yNCkmMHhmZikpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbnVsbF9oZHJfcHJpbnQodV9pbnQgZmFtaWx5LCB1X2ludCBsZW5ndGgpCi17Ci0JaWYgKCFxZmxhZykgewotCQkodm9pZClwcmludGYoIkFGICVzICgldSkiLAotCQkJdG9rMnN0cihic2RfYWZfdmFsdWVzLCJVbmtub3duIixmYW1pbHkpLGZhbWlseSk7Ci0JfSBlbHNlIHsKLQkJKHZvaWQpcHJpbnRmKCIlcyIsCi0JCQl0b2syc3RyKGJzZF9hZl92YWx1ZXMsIlVua25vd24gQUYgJXUiLGZhbWlseSkpOwotCX0KLQotCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKLSAqIHRvIHRoZSBldGhlciBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotbnVsbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQl1X2ludCBsZW5ndGggPSBoLT5sZW47Ci0JdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOwotCXVfaW50IGZhbWlseTsKLQotCWlmIChjYXBsZW4gPCBOVUxMX0hEUkxFTikgewotCQlwcmludGYoIlt8bnVsbF0iKTsKLQkJcmV0dXJuIChOVUxMX0hEUkxFTik7Ci0JfQotCi0JbWVtY3B5KChjaGFyICopJmZhbWlseSwgKGNoYXIgKilwLCBzaXplb2YoZmFtaWx5KSk7Ci0KLQkvKgotCSAqIFRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgaW4gb3VyIGhvc3QgYnl0ZSBvcmRlcjsgaWYgdGhpcyBpcwotCSAqIGEgRExUX0xPT1AgY2FwdHVyZSwgaXQncyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIGFuZCBpZgotCSAqIHRoaXMgaXMgYSBETFRfTlVMTCBjYXB0dXJlIGZyb20gYSBtYWNoaW5lIHdpdGggdGhlIG9wcG9zaXRlCi0JICogYnl0ZS1vcmRlciwgaXQncyBpbiB0aGUgb3Bwb3NpdGUgYnl0ZSBvcmRlciBmcm9tIG91cnMuCi0JICoKLQkgKiBJZiB0aGUgdXBwZXIgMTYgYml0cyBhcmVuJ3QgYWxsIHplcm8sIGFzc3VtZSBpdCdzIGJ5dGUtc3dhcHBlZC4KLQkgKi8KLQlpZiAoKGZhbWlseSAmIDB4RkZGRjAwMDApICE9IDApCi0JCWZhbWlseSA9IFNXQVBMT05HKGZhbWlseSk7Ci0KLQlpZiAoZWZsYWcpCi0JCW51bGxfaGRyX3ByaW50KGZhbWlseSwgbGVuZ3RoKTsKLQotCWxlbmd0aCAtPSBOVUxMX0hEUkxFTjsKLQljYXBsZW4gLT0gTlVMTF9IRFJMRU47Ci0JcCArPSBOVUxMX0hEUkxFTjsKLQotCXN3aXRjaCAoZmFtaWx5KSB7Ci0KLQljYXNlIEJTRF9BRk5VTV9JTkVUOgotCQlpcF9wcmludChnbmRvLCBwLCBsZW5ndGgpOwotCQlicmVhazsKLQotI2lmZGVmIElORVQ2Ci0JY2FzZSBCU0RfQUZOVU1fSU5FVDZfQlNEOgotCWNhc2UgQlNEX0FGTlVNX0lORVQ2X0ZSRUVCU0Q6Ci0JY2FzZSBCU0RfQUZOVU1fSU5FVDZfREFSV0lOOgotCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgQlNEX0FGTlVNX0lTTzoKLQkJaXNvY2xuc19wcmludChwLCBsZW5ndGgsIGNhcGxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBCU0RfQUZOVU1fQVBQTEVUQUxLOgotCQlhdGFsa19wcmludChwLCBsZW5ndGgpOwotCQlicmVhazsKLQotCWNhc2UgQlNEX0FGTlVNX0lQWDoKLQkJaXB4X3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogdW5rbm93biBBRl8gdmFsdWUgKi8KLQkJaWYgKCFlZmxhZykKLQkJCW51bGxfaGRyX3ByaW50KGZhbWlseSwgbGVuZ3RoICsgTlVMTF9IRFJMRU4pOwotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7Ci0JfQotCi0JcmV0dXJuIChOVUxMX0hEUkxFTik7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1vbHNyLmMgYi9wcmludC1vbHNyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NGE1MWUuLjAwMDAwMDAKLS0tIGEvcHJpbnQtb2xzci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgVENQRFVNUCBwcm9qZWN0Ci0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlCi0gKiBkaXN0cmlidXRpb25zIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGgKLSAqIGluIGl0cyBlbnRpcmV0eSwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlCi0gKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluCi0gKiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5ECi0gKiBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUCi0gKiBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9wdGltaXplZCBMaW5rIFN0YXRlIFByb3RvY2wgKE9MU1IpIGFzIHBlciByZmMzNjI2Ci0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0PgotICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIJCQotI2luY2x1ZGUgImlwLmgiCi0KLS8qCi0gKiBSRkMgMzYyNiBjb21tb24gaGVhZGVyCi0gKgotICogIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgUGFja2V0IExlbmd0aCAgICAgICAgIHwgICAgUGFja2V0IFNlcXVlbmNlIE51bWJlciAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgIE1lc3NhZ2UgVHlwZSB8ICAgICBWdGltZSAgICAgfCAgICAgICAgIE1lc3NhZ2UgU2l6ZSAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICBPcmlnaW5hdG9yIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICBUaW1lIFRvIExpdmUgfCAgIEhvcCBDb3VudCAgIHwgICAgTWVzc2FnZSBTZXF1ZW5jZSBOdW1iZXIgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICBNZXNzYWdlIFR5cGUgfCAgICAgVnRpbWUgICAgIHwgICAgICAgICBNZXNzYWdlIFNpemUgICAgICAgICAgfAotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgT3JpZ2luYXRvciBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgVGltZSBUbyBMaXZlIHwgICBIb3AgQ291bnQgICB8ICAgIE1lc3NhZ2UgU2VxdWVuY2UgTnVtYmVyICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVNTQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKLSAqLwotCi1zdHJ1Y3Qgb2xzcl9jb21tb24gewotICAgIHVfaW50OF90IHBhY2tldF9sZW5bMl07Ci0gICAgdV9pbnQ4X3QgcGFja2V0X3NlcVsyXTsKLX07Ci0KLSNkZWZpbmUgT0xTUl9IRUxMT19NU0cgICAgICAgICAxIC8qIHJmYzM2MjYgKi8KLSNkZWZpbmUgT0xTUl9UQ19NU0cgICAgICAgICAgICAyIC8qIHJmYzM2MjYgKi8KLSNkZWZpbmUgT0xTUl9NSURfTVNHICAgICAgICAgICAzIC8qIHJmYzM2MjYgKi8KLSNkZWZpbmUgT0xTUl9ITkFfTVNHICAgICAgICAgICA0IC8qIHJmYzM2MjYgKi8KLSNkZWZpbmUgT0xTUl9QT1dFUklORk9fTVNHICAgMTI4Ci0jZGVmaW5lIE9MU1JfTkFNRVNFUlZJQ0VfTVNHIDEzMAotI2RlZmluZSBPTFNSX0hFTExPX0xRX01TRyAgICAyMDEgLyogTFEgZXh0ZW5zaW9ucyBvbHNyLm9yZyAqLwotI2RlZmluZSBPTFNSX1RDX0xRX01TRyAgICAgICAyMDIgLyogTFEgZXh0ZW5zaW9ucyBvbHNyLm9yZyAqLwotCi1zdGF0aWMgc3RydWN0IHRvayBvbHNyX21zZ192YWx1ZXNbXSA9IHsKLSAgICB7IE9MU1JfSEVMTE9fTVNHLCAiSGVsbG8iIH0sCi0gICAgeyBPTFNSX1RDX01TRywgIlRDIiB9LAotICAgIHsgT0xTUl9NSURfTVNHLCAiTUlEIiB9LAotICAgIHsgT0xTUl9ITkFfTVNHLCAiSE5BIiB9LAotICAgIHsgT0xTUl9QT1dFUklORk9fTVNHLCAiUG93ZXJpbmZvIiB9LAotICAgIHsgT0xTUl9OQU1FU0VSVklDRV9NU0csICJOYW1lc2VydmljZSIgfSwKLSAgICB7IE9MU1JfSEVMTE9fTFFfTVNHLCAiSGVsbG8tTFEiIH0sCi0gICAgeyBPTFNSX1RDX0xRX01TRywgIlRDLUxRIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0cnVjdCBvbHNyX21zZyB7Ci0gICAgdV9pbnQ4X3QgbXNnX3R5cGU7Ci0gICAgdV9pbnQ4X3QgdnRpbWU7Ci0gICAgdV9pbnQ4X3QgbXNnX2xlblsyXTsKLSAgICB1X2ludDhfdCBvcmlnaW5hdG9yWzRdOwotICAgIHVfaW50OF90IHR0bDsKLSAgICB1X2ludDhfdCBob3Bjb3VudDsKLSAgICB1X2ludDhfdCBtc2dfc2VxWzJdOwotfTsKLQotc3RydWN0IG9sc3JfaGVsbG8gewotICAgIHVfaW50OF90IHJlc1syXTsKLSAgICB1X2ludDhfdCBodGltZTsKLSAgICB1X2ludDhfdCB3aWxsOwotfTsKLQotc3RydWN0IG9sc3JfaGVsbG9fbGluayB7Ci0gICAgdV9pbnQ4X3QgbGlua19jb2RlOwotICAgIHVfaW50OF90IHJlczsKLSAgICB1X2ludDhfdCBsZW5bMl07Ci19OwotCi1zdHJ1Y3Qgb2xzcl90YyB7Ci0gICAgdV9pbnQ4X3QgYW5zX3NlcVsyXTsKLSAgICB1X2ludDhfdCByZXNbMl07Ci19OwotCi1zdHJ1Y3Qgb2xzcl9obmEgewotICAgIHVfaW50OF90IG5ldHdvcmtbNF07Ci0gICAgdV9pbnQ4X3QgbWFza1s0XTsKLX07Ci0KLQotI2RlZmluZSBPTFNSX0VYVFJBQ1RfTElOS19UWVBFKGxpbmtfY29kZSkgKGxpbmtfY29kZSAmIDB4MykKLSNkZWZpbmUgT0xTUl9FWFRSQUNUX05FSUdIQk9SX1RZUEUobGlua19jb2RlKSAobGlua19jb2RlID4+IDIpCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIG9sc3JfbGlua190eXBlX3ZhbHVlc1tdID0gewotICAgIHsgMCwgIlVuc3BlY2lmaWVkIiB9LAotICAgIHsgMSwgIkFzeW1tZXRyaWMiIH0sCi0gICAgeyAyLCAiU3ltbWV0cmljIiB9LAotICAgIHsgMywgIkxvc3QiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgb2xzcl9uZWlnaGJvcl90eXBlX3ZhbHVlc1tdID0gewotICAgIHsgMCwgIk5vdC1OZWlnaGJvciIgfSwKLSAgICB7IDEsICJTeW1tZXRyaWMiIH0sCi0gICAgeyAyLCAiU3ltbWV0cmljLU1QUiIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3Qgb2xzcl9scV9uZWlnaGJvciB7Ci0gICAgdV9pbnQ4X3QgbmVpZ2hib3JbNF07Ci0gICAgdV9pbnQ4X3QgbGlua19xdWFsaXR5OwotICAgIHVfaW50OF90IG5laWdoYm9yX2xpbmtfcXVhbGl0eTsKLSAgICB1X2ludDhfdCByZXNbMl07Ci19OwotCi0vKgotICogbWFjcm8gdG8gY29udmVydCB0aGUgOC1iaXQgbWFudGlzc2EvZXhwb25lbnQgdG8gYSBkb3VibGUgZmxvYXQKLSAqIHRha2VuIGZyb20gb2xzci5vcmcuCi0gKi8KLSNkZWZpbmUgVlRJTUVfU0NBTEVfRkFDVE9SICAgIDAuMDYyNQotI2RlZmluZSBNRV9UT19ET1VCTEUobWUpIFwKLSAgKGRvdWJsZSkoVlRJTUVfU0NBTEVfRkFDVE9SKigxKyhkb3VibGUpKG1lPj40KS8xNikqKGRvdWJsZSkoMTw8KG1lJjB4MEYpKSkKLQotLyoKLSAqIHByaW50IGEgbmVpZ2hib3IgbGlzdCB3aXRoIExRIGV4dGVuc2lvbnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1vbHNyX3ByaW50X2xxX25laWdoYm9yIChjb25zdCB1X2NoYXIgKm1zZ19kYXRhLCB1X2ludCBoZWxsb19sZW4pCi17Ci0gICAgc3RydWN0IG9sc3JfbHFfbmVpZ2hib3IgKmxxX25laWdoYm9yOwotCi0gICAgd2hpbGUgKGhlbGxvX2xlbiA+PSBzaXplb2Yoc3RydWN0IG9sc3JfbHFfbmVpZ2hib3IpKSB7Ci0KLSAgICAgICAgbHFfbmVpZ2hib3IgPSAoc3RydWN0IG9sc3JfbHFfbmVpZ2hib3IgKiltc2dfZGF0YTsKLQotICAgICAgICBwcmludGYoIlxuXHQgICAgICBuZWlnaGJvciAlcywgbGluay1xdWFsaXR5ICUuMmxmJSUiCi0gICAgICAgICAgICAgICAiLCBuZWlnaGJvci1saW5rLXF1YWxpdHkgJS4ybGYlJSIsCi0gICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKGxxX25laWdoYm9yLT5uZWlnaGJvciksCi0gICAgICAgICAgICAgICAoKGRvdWJsZSlscV9uZWlnaGJvci0+bGlua19xdWFsaXR5LzIuNTUpLAotICAgICAgICAgICAgICAgKChkb3VibGUpbHFfbmVpZ2hib3ItPm5laWdoYm9yX2xpbmtfcXVhbGl0eS8yLjU1KSk7Ci0KLSAgICAgICAgbXNnX2RhdGEgKz0gc2l6ZW9mKHN0cnVjdCBvbHNyX2xxX25laWdoYm9yKTsKLSAgICAgICAgaGVsbG9fbGVuIC09IHNpemVvZihzdHJ1Y3Qgb2xzcl9scV9uZWlnaGJvcik7Ci0gICAgfQotfQotCi0vKgotICogcHJpbnQgYSBuZWlnaGJvciBsaXN0LgotICovCi1zdGF0aWMgdm9pZAotb2xzcl9wcmludF9uZWlnaGJvciAoY29uc3QgdV9jaGFyICptc2dfZGF0YSwgdV9pbnQgaGVsbG9fbGVuKQotewotICAgIGludCBuZWlnaGJvcjsKLQotICAgIHByaW50ZigiXG5cdCAgICAgIG5laWdoYm9yXG5cdFx0Iik7Ci0gICAgbmVpZ2hib3IgPSAxOwotCi0gICAgd2hpbGUgKGhlbGxvX2xlbiA+PSBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7Ci0KLSAgICAgICAgLyogcHJpbnQgNCBuZWlnaGJvcnMgcGVyIGxpbmUgKi8KLQotICAgICAgICBwcmludGYoIiVzJXMiLCBpcGFkZHJfc3RyaW5nKG1zZ19kYXRhKSwKLSAgICAgICAgICAgICAgIG5laWdoYm9yICUgNCA9PSAwID8gIlxuXHRcdCIgOiAiICIpOwotCi0gICAgICAgIG1zZ19kYXRhICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0gICAgICAgIGhlbGxvX2xlbiAtPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwotICAgIH0KLX0KLQotCi12b2lkCi1vbHNyX3ByaW50IChjb25zdCB1X2NoYXIgKnBwdHIsIHVfaW50IGxlbmd0aCkKLXsKLSAgICB1bmlvbiB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBvbHNyX2NvbW1vbiAqY29tbW9uOwotICAgICAgICBjb25zdCBzdHJ1Y3Qgb2xzcl9tc2cgKm1zZzsKLSAgICAgICAgY29uc3Qgc3RydWN0IG9sc3JfaGVsbG8gKmhlbGxvOwotICAgICAgICBjb25zdCBzdHJ1Y3Qgb2xzcl9oZWxsb19saW5rICpoZWxsb19saW5rOwotICAgICAgICBjb25zdCBzdHJ1Y3Qgb2xzcl9scV9uZWlnaGJvciAqbHFfbmVpZ2hib3I7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBvbHNyX3RjICp0YzsKLSAgICAgICAgY29uc3Qgc3RydWN0IG9sc3JfaG5hICpobmE7Ci0gICAgfSBwdHI7Ci0KLSAgICB1X2ludCBtc2dfdHlwZSwgbXNnX2xlbiwgbXNnX3RsZW4sIGhlbGxvX2xlbiwgcHJlZml4OwotICAgIHVfaW50OF90IGxpbmtfdHlwZSwgbmVpZ2hib3JfdHlwZTsKLSAgICBjb25zdCB1X2NoYXIgKnRwdHIsICptc2dfZGF0YTsKLQotICAgIHRwdHIgPSBwcHRyOyAKLQotICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG9sc3JfY29tbW9uKSkgewotICAgICAgICBnb3RvIHRydW5jOwotICAgIH0KLQotICAgIGlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IG9sc3JfY29tbW9uKSkpIHsKLQlnb3RvIHRydW5jOwotICAgIH0KLQotICAgIHB0ci5jb21tb24gPSAoc3RydWN0IG9sc3JfY29tbW9uICopdHB0cjsKLSAgICBsZW5ndGggPSBNSU4obGVuZ3RoLCBFWFRSQUNUXzE2QklUUyhwdHIuY29tbW9uLT5wYWNrZXRfbGVuKSk7Ci0KLSAgICBwcmludGYoIk9MU1IsIHNlcSAweCUwNHgsIGxlbmd0aCAldSIsCi0gICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHB0ci5jb21tb24tPnBhY2tldF9zZXEpLAotICAgICAgICAgICBsZW5ndGgpOwotCi0gICAgdHB0ciArPSBzaXplb2Yoc3RydWN0IG9sc3JfY29tbW9uKTsKLQotICAgIC8qCi0gICAgICogSW4gbm9uLXZlcmJvc2UgbW9kZSwganVzdCBwcmludCB2ZXJzaW9uLgotICAgICAqLwotICAgIGlmICh2ZmxhZyA8IDEpIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKHRwdHIgPCAocHB0citsZW5ndGgpKSB7Ci0KLSAgICAgICAgaWYgKCFUVEVTVDIoKnRwdHIsIHNpemVvZihzdHJ1Y3Qgb2xzcl9tc2cpKSkJCi0gICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgIHB0ci5tc2cgPSAoc3RydWN0IG9sc3JfbXNnICopdHB0cjsKLQotICAgICAgICBtc2dfdHlwZSA9IHB0ci5tc2ctPm1zZ190eXBlOwotICAgICAgICBtc2dfbGVuID0gRVhUUkFDVF8xNkJJVFMocHRyLm1zZy0+bXNnX2xlbik7Ci0KLSAgICAgICAgLyogaW5maW5pdGUgbG9vcCBjaGVjayAqLwotICAgICAgICBpZiAobXNnX3R5cGUgPT0gMCB8fCBtc2dfbGVuID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50ZigiXG5cdCVzIE1lc3NhZ2UgKCV1KSwgb3JpZ2luYXRvciAlcywgdHRsICV1LCBob3AgJXUiCi0gICAgICAgICAgICAgICAiXG5cdCAgdnRpbWUgJS4zbGZzLCBtc2ctc2VxIDB4JTA0eCwgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgIHRvazJzdHIob2xzcl9tc2dfdmFsdWVzLCAiVW5rbm93biIsIG1zZ190eXBlKSwKLSAgICAgICAgICAgICAgIG1zZ190eXBlLCBpcGFkZHJfc3RyaW5nKHB0ci5tc2ctPm9yaWdpbmF0b3IpLAotICAgICAgICAgICAgICAgcHRyLm1zZy0+dHRsLAotICAgICAgICAgICAgICAgcHRyLm1zZy0+aG9wY291bnQsCi0gICAgICAgICAgICAgICBNRV9UT19ET1VCTEUocHRyLm1zZy0+dnRpbWUpLAotICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocHRyLm1zZy0+bXNnX3NlcSksCi0gICAgICAgICAgICAgICBtc2dfbGVuKTsKLQotICAgICAgICBtc2dfdGxlbiA9IG1zZ19sZW4gLSBzaXplb2Yoc3RydWN0IG9sc3JfbXNnKTsKLSAgICAgICAgbXNnX2RhdGEgPSB0cHRyICsgc2l6ZW9mKHN0cnVjdCBvbHNyX21zZyk7Ci0KLSAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkgewotICAgICAgICBjYXNlIE9MU1JfSEVMTE9fTVNHOgotICAgICAgICBjYXNlIE9MU1JfSEVMTE9fTFFfTVNHOgotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKm1zZ19kYXRhLCBzaXplb2Yoc3RydWN0IG9sc3JfaGVsbG8pKSkJCi0gICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLQotICAgICAgICAgICAgcHRyLmhlbGxvID0gKHN0cnVjdCBvbHNyX2hlbGxvICopbXNnX2RhdGE7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgIGhlbGxvLXRpbWUgJS4zbGZzLCBNUFIgd2lsbGluZ25lc3MgJXUiLAotICAgICAgICAgICAgICAgICAgIE1FX1RPX0RPVUJMRShwdHIuaGVsbG8tPmh0aW1lKSwgcHRyLmhlbGxvLT53aWxsKTsKLSAgICAgICAgICAgIG1zZ19kYXRhICs9IHNpemVvZihzdHJ1Y3Qgb2xzcl9oZWxsbyk7Ci0gICAgICAgICAgICBtc2dfdGxlbiAtPSBzaXplb2Yoc3RydWN0IG9sc3JfaGVsbG8pOwotCi0gICAgICAgICAgICB3aGlsZSAobXNnX3RsZW4gPj0gc2l6ZW9mKHN0cnVjdCBvbHNyX2hlbGxvX2xpbmspKSB7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIGxpbmstdHlwZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqbXNnX2RhdGEsIHNpemVvZihzdHJ1Y3Qgb2xzcl9oZWxsb19saW5rKSkpCQotICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgICAgICAgICAgcHRyLmhlbGxvX2xpbmsgPSAoc3RydWN0IG9sc3JfaGVsbG9fbGluayAqKW1zZ19kYXRhOwotCi0gICAgICAgICAgICAgICAgaGVsbG9fbGVuID0gRVhUUkFDVF8xNkJJVFMocHRyLmhlbGxvX2xpbmstPmxlbik7Ci0gICAgICAgICAgICAgICAgbGlua190eXBlID0gT0xTUl9FWFRSQUNUX0xJTktfVFlQRShwdHIuaGVsbG9fbGluay0+bGlua19jb2RlKTsKLSAgICAgICAgICAgICAgICBuZWlnaGJvcl90eXBlID0gT0xTUl9FWFRSQUNUX05FSUdIQk9SX1RZUEUocHRyLmhlbGxvX2xpbmstPmxpbmtfY29kZSk7Ci0KLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgbGluay10eXBlICVzLCBuZWlnaGJvci10eXBlICVzLCBsZW4gJXUiLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKG9sc3JfbGlua190eXBlX3ZhbHVlcywgIlVua25vd24iLCBsaW5rX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKG9sc3JfbmVpZ2hib3JfdHlwZV92YWx1ZXMsICJVbmtub3duIiwgbmVpZ2hib3JfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbGxvX2xlbik7Ci0KLSAgICAgICAgICAgICAgICBtc2dfZGF0YSArPSBzaXplb2Yoc3RydWN0IG9sc3JfaGVsbG9fbGluayk7Ci0gICAgICAgICAgICAgICAgbXNnX3RsZW4gLT0gc2l6ZW9mKHN0cnVjdCBvbHNyX2hlbGxvX2xpbmspOwotICAgICAgICAgICAgICAgIGhlbGxvX2xlbiAtPSBzaXplb2Yoc3RydWN0IG9sc3JfaGVsbG9fbGluayk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobXNnX3R5cGUgPT0gT0xTUl9IRUxMT19NU0cpIHsKLSAgICAgICAgICAgICAgICAgICAgb2xzcl9wcmludF9uZWlnaGJvcihtc2dfZGF0YSwgaGVsbG9fbGVuKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvbHNyX3ByaW50X2xxX25laWdoYm9yKG1zZ19kYXRhLCBoZWxsb19sZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1zZ19kYXRhICs9IGhlbGxvX2xlbjsKLSAgICAgICAgICAgICAgICBtc2dfdGxlbiAtPSBoZWxsb19sZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE9MU1JfVENfTVNHOgotICAgICAgICBjYXNlIE9MU1JfVENfTFFfTVNHOgotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKm1zZ19kYXRhLCBzaXplb2Yoc3RydWN0IG9sc3JfdGMpKSkJCi0gICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLQotICAgICAgICAgICAgcHRyLnRjID0gKHN0cnVjdCBvbHNyX3RjICopbXNnX2RhdGE7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgYWR2ZXJ0aXNlZCBuZWlnaGJvciBzZXEgMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhwdHIudGMtPmFuc19zZXEpKTsKLSAgICAgICAgICAgIG1zZ19kYXRhICs9IHNpemVvZihzdHJ1Y3Qgb2xzcl90Yyk7Ci0gICAgICAgICAgICBtc2dfdGxlbiAtPSBzaXplb2Yoc3RydWN0IG9sc3JfdGMpOwotCi0gICAgICAgICAgICBpZiAobXNnX3R5cGUgPT0gT0xTUl9UQ19NU0cpIHsKLSAgICAgICAgICAgICAgICBvbHNyX3ByaW50X25laWdoYm9yKG1zZ19kYXRhLCBtc2dfdGxlbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9sc3JfcHJpbnRfbHFfbmVpZ2hib3IobXNnX2RhdGEsIG1zZ190bGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgT0xTUl9NSURfTVNHOgotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKm1zZ19kYXRhLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKSkJCi0gICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLQotICAgICAgICAgICAgd2hpbGUgKG1zZ190bGVuID49IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIGludGVyZmFjZSBhZGRyZXNzICVzIiwgaXBhZGRyX3N0cmluZyhtc2dfZGF0YSkpOwotICAgICAgICAgICAgICAgIG1zZ19kYXRhICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0gICAgICAgICAgICAgICAgbXNnX3RsZW4gLT0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgT0xTUl9ITkFfTVNHOgotICAgICAgICAgICAgcHJlZml4ID0gMTsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgYWR2ZXJ0aXNlZCBuZXR3b3Jrc1xuXHQgICAgIik7Ci0gICAgICAgICAgICB3aGlsZSAobXNnX3RsZW4gPj0gc2l6ZW9mKHN0cnVjdCBvbHNyX2huYSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIVRURVNUMigqbXNnX2RhdGEsIHNpemVvZihzdHJ1Y3Qgb2xzcl9obmEpKSkJCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0KLSAgICAgICAgICAgICAgICBwdHIuaG5hID0gKHN0cnVjdCBvbHNyX2huYSAqKW1zZ19kYXRhOwotCi0gICAgICAgICAgICAgICAgLyogcHJpbnQgNCBwcmVmaXhlcyBwZXIgbGluZSAqLwotCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcy8ldSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhwdHIuaG5hLT5uZXR3b3JrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWFzazJwbGVuKEVYVFJBQ1RfMzJCSVRTKHB0ci5obmEtPm1hc2spKSwgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggJSA0ID09IDAgPyAiXG5cdCAgICAiIDogIiAiKTsKLQotICAgICAgICAgICAgICAgIG1zZ19kYXRhICs9IHNpemVvZihzdHJ1Y3Qgb2xzcl9obmEpOwotICAgICAgICAgICAgICAgIG1zZ190bGVuIC09IHNpemVvZihzdHJ1Y3Qgb2xzcl9obmEpOwotICAgICAgICAgICAgICAgIHByZWZpeCArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRklYTUUgdGhvc2UgYXJlIHRoZSBkZWZpbmVkIG1lc3NhZ2VzIHRoYXQgbGFjayBhIGRlY29kZXIKLSAgICAgICAgICAgICAqIHlvdSBhcmUgd2VsY29tZSB0byBjb250cmlidXRlIGNvZGUgOy0pCi0gICAgICAgICAgICAgKi8KLQotICAgICAgICBjYXNlIE9MU1JfUE9XRVJJTkZPX01TRzoKLSAgICAgICAgY2FzZSBPTFNSX05BTUVTRVJWSUNFX01TRzoKLSAgICAgICAgZGVmYXVsdDoKLQkgICAgcHJpbnRfdW5rbm93bl9kYXRhKG1zZ19kYXRhLCAiXG5cdCAgICAiLCBtc2dfdGxlbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQkKLSAgICAgICAgdHB0ciArPSBtc2dfbGVuOwotICAgIH0KLQotICAgIHJldHVybjsKLQotIHRydW5jOgotICAgIHByaW50ZigiW3xvbHNyXSIpOwotfQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogYy1zdHlsZTogd2hpdGVzbWl0aAotICogYy1iYXNpYy1vZmZzZXQ6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtb3NwZi5jIGIvcHJpbnQtb3NwZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDhmMTExLi4wMDAwMDAwCi0tLSBhL3ByaW50LW9zcGYuYworKysgL2Rldi9udWxsCkBAIC0xLDk2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT1NQRiBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IEplZmZyZXkgSG9uaWcgKGpjaEBtaXRjaGVsbC5jaXQuY29ybmVsbC5lZHUpCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtb3NwZi5jLHYgMS41Ni4yLjQgMjAwNi8xMi8xMyAwODoyNDoyNyBoYW5uZXMgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJnbXBscy5oIgotCi0jaW5jbHVkZSAib3NwZi5oIgotCi0jaW5jbHVkZSAiaXAuaCIKLQotc3RhdGljIHN0cnVjdCB0b2sgb3NwZl9vcHRpb25fdmFsdWVzW10gPSB7Ci0JeyBPU1BGX09QVElPTl9ULAkiVE9TIiB9LAotCXsgT1NQRl9PUFRJT05fRSwJIkV4dGVybmFsIiB9LAotCXsgT1NQRl9PUFRJT05fTUMsCSJNdWx0aWNhc3QiIH0sCi0JeyBPU1BGX09QVElPTl9OUCwJIk5TU0EiIH0sCi0JeyBPU1BGX09QVElPTl9FQSwJIkFkdmVydGlzZSBFeHRlcm5hbCIgfSwKLQl7IE9TUEZfT1BUSU9OX0RDLAkiRGVtYW5kIENpcmN1aXQiIH0sCi0JeyBPU1BGX09QVElPTl9PLAkiT3BhcXVlIiB9LAotCXsgT1NQRl9PUFRJT05fRE4sCSJVcC9Eb3duIiB9LAotCXsgMCwJCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIG9zcGZfYXV0aHR5cGVfdmFsdWVzW10gPSB7Ci0JeyBPU1BGX0FVVEhfTk9ORSwJIm5vbmUiIH0sCi0JeyBPU1BGX0FVVEhfU0lNUExFLAkic2ltcGxlIiB9LAotCXsgT1NQRl9BVVRIX01ENSwJIk1ENSIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBvc3BmX3JsYV9mbGFnX3ZhbHVlc1tdID0gewotCXsgUkxBX0ZMQUdfQiwJCSJBQlIiIH0sCi0JeyBSTEFfRkxBR19FLAkJIkFTQlIiIH0sCi0JeyBSTEFfRkxBR19XMSwJCSJWaXJ0dWFsIiB9LAotCXsgUkxBX0ZMQUdfVzIsCQkiVzIiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgdHlwZTJzdHJbXSA9IHsKLQl7IE9TUEZfVFlQRV9VTUQsCSJVTUQiIH0sCi0JeyBPU1BGX1RZUEVfSEVMTE8sCSJIZWxsbyIgfSwKLQl7IE9TUEZfVFlQRV9ERCwJCSJEYXRhYmFzZSBEZXNjcmlwdGlvbiIgfSwKLQl7IE9TUEZfVFlQRV9MU19SRVEsCSJMUy1SZXF1ZXN0IiB9LAotCXsgT1NQRl9UWVBFX0xTX1VQREFURSwJIkxTLVVwZGF0ZSIgfSwKLQl7IE9TUEZfVFlQRV9MU19BQ0ssCSJMUy1BY2siIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgbHNhX3ZhbHVlc1tdID0gewotCXsgTFNfVFlQRV9ST1VURVIsICAgICAgICJSb3V0ZXIiIH0sCi0JeyBMU19UWVBFX05FVFdPUkssICAgICAgIk5ldHdvcmsiIH0sCi0JeyBMU19UWVBFX1NVTV9JUCwgICAgICAgIlN1bW1hcnkiIH0sCi0JeyBMU19UWVBFX1NVTV9BQlIsICAgICAgIkFTQlIgU3VtbWFyeSIgfSwKLQl7IExTX1RZUEVfQVNFLCAgICAgICAgICAiRXh0ZXJuYWwiIH0sCi0JeyBMU19UWVBFX0dST1VQLCAgICAgICAgIk11bHRpY2FzdCBHcm91cCIgfSwKLQl7IExTX1RZUEVfTlNTQSwgICAgICAgICAiTlNTQSIgfSwKLQl7IExTX1RZUEVfT1BBUVVFX0xMLCAgICAiTGluayBMb2NhbCBPcGFxdWUiIH0sCi0JeyBMU19UWVBFX09QQVFVRV9BTCwgICAgIkFyZWEgTG9jYWwgT3BhcXVlIiB9LAotCXsgTFNfVFlQRV9PUEFRVUVfRFcsICAgICJEb21haW4gV2lkZSBPcGFxdWUiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgb3NwZl9kZF9mbGFnX3ZhbHVlc1tdID0gewotCXsgT1NQRl9EQl9JTklULAkgICAgICAgICJJbml0IiB9LAotCXsgT1NQRl9EQl9NT1JFLAkgICAgICAgICJNb3JlIiB9LAotCXsgT1NQRl9EQl9NQVNURVIsCSJNYXN0ZXIiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgbHNhX29wYXF1ZV92YWx1ZXNbXSA9IHsKLQl7IExTX09QQVFVRV9UWVBFX1RFLCAgICAiVHJhZmZpYyBFbmdpbmVlcmluZyIgfSwKLQl7IExTX09QQVFVRV9UWVBFX0dSQUNFLCAiR3JhY2VmdWwgcmVzdGFydCIgfSwKLQl7IExTX09QQVFVRV9UWVBFX1JJLCAgICAiUm91dGVyIEluZm9ybWF0aW9uIiB9LAotCXsgMCwJCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfdGVfdGx2X3ZhbHVlc1tdID0gewotCXsgTFNfT1BBUVVFX1RFX1RMVl9ST1VURVIsICJSb3V0ZXIgQWRkcmVzcyIgfSwKLQl7IExTX09QQVFVRV9URV9UTFZfTElOSywgICAiTGluayIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBsc2Ffb3BhcXVlX3RlX2xpbmtfdGx2X3N1YnRsdl92YWx1ZXNbXSA9IHsKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1RZUEUsICAgICAgICAgICAgIkxpbmsgVHlwZSIgfSwKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX0lELCAgICAgICAgICAgICAgIkxpbmsgSUQiIH0sCi0JeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTE9DQUxfSVAsICAgICAgICAgICAgICJMb2NhbCBJbnRlcmZhY2UgSVAgYWRkcmVzcyIgfSwKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9SRU1PVEVfSVAsICAgICAgICAgICAgIlJlbW90ZSBJbnRlcmZhY2UgSVAgYWRkcmVzcyIgfSwKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9URV9NRVRSSUMsICAgICAgICAgICAgIlRyYWZmaWMgRW5naW5lZXJpbmcgTWV0cmljIiB9LAotCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX01BWF9CVywgICAgICAgICAgICAgICAiTWF4aW11bSBCYW5kd2lkdGgiIH0sCi0JeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTUFYX1JFU19CVywgICAgICAgICAgICJNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIiB9LAotCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX1VOUkVTX0JXLCAgICAgICAgICAgICAiVW5yZXNlcnZlZCBCYW5kd2lkdGgiIH0sCi0JeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfQURNSU5fR1JPVVAsICAgICAgICAgICJBZG1pbmlzdHJhdGl2ZSBHcm91cCIgfSwKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX0xPQ0FMX1JFTU9URV9JRCwgIkxpbmsgTG9jYWwvUmVtb3RlIElkZW50aWZpZXIiIH0sCi0JeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19QUk9URUNUSU9OX1RZUEUsICJMaW5rIFByb3RlY3Rpb24gVHlwZSIgfSwKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9JTlRGX1NXX0NBUF9ERVNDUiwgICAgIkludGVyZmFjZSBTd2l0Y2hpbmcgQ2FwYWJpbGl0eSIgfSwKLQl7IExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9TSEFSRURfUklTS19HUk9VUCwgICAgIlNoYXJlZCBSaXNrIExpbmsgR3JvdXAiIH0sCi0JeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfQldfQ09OU1RSQUlOVFMsICAgICAgICJCYW5kd2lkdGggQ29uc3RyYWludHMiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgbHNhX29wYXF1ZV9ncmFjZV90bHZfdmFsdWVzW10gPSB7Ci0JeyBMU19PUEFRVUVfR1JBQ0VfVExWX1BFUklPRCwgICAgICAgICAgICAgIkdyYWNlIFBlcmlvZCIgfSwKLQl7IExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OLCAgICAgICAgICAgICAiR3JhY2VmdWwgcmVzdGFydCBSZWFzb24iIH0sCi0JeyBMU19PUEFRVUVfR1JBQ0VfVExWX0lOVF9BRERSRVNTLCAgICAgICAgIklQdjQgaW50ZXJmYWNlIGFkZHJlc3MiIH0sCi0JeyAwLAkJICAgICAgICBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfZ3JhY2VfdGx2X3JlYXNvbl92YWx1ZXNbXSA9IHsKLQl7IExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OX1VOS05PV04sICAgICAiVW5rbm93biIgfSwKLQl7IExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OX1NXX1JFU1RBUlQsICAiU29mdHdhcmUgUmVzdGFydCIgfSwKLQl7IExTX09QQVFVRV9HUkFDRV9UTFZfUkVBU09OX1NXX1VQR1JBREUsICAiU29mdHdhcmUgUmVsb2FkL1VwZ3JhZGUiIH0sCi0JeyBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTl9DUF9TV0lUQ0gsICAgIkNvbnRyb2wgUHJvY2Vzc29yIFN3aXRjaCIgfSwKLQl7IDAsCQkgICAgICAgIE5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgbHNhX29wYXF1ZV90ZV90bHZfbGlua190eXBlX3N1Yl90bHZfdmFsdWVzW10gPSB7Ci0JeyBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19UWVBFX1BUUCwgIlBvaW50LXRvLXBvaW50IiB9LAotCXsgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xJTktfVFlQRV9NQSwgICJNdWx0aS1BY2Nlc3MiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgbHNhX29wYXF1ZV9yaV90bHZfdmFsdWVzW10gPSB7Ci0JeyBMU19PUEFRVUVfUklfVExWX0NBUCwgIlJvdXRlciBDYXBhYmlsaXRpZXMiIH0sCi0JeyAwLAkJICAgICAgICBOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGxzYV9vcGFxdWVfcmlfdGx2X2NhcF92YWx1ZXNbXSA9IHsKLQl7IDEsICJSZXNlcnZlZCIgfSwKLQl7IDIsICJSZXNlcnZlZCIgfSwKLQl7IDQsICJSZXNlcnZlZCIgfSwKLQl7IDgsICJSZXNlcnZlZCIgfSwKLQl7IDE2LCAiZ3JhY2VmdWwgcmVzdGFydCBjYXBhYmxlIiB9LAotCXsgMzIsICJncmFjZWZ1bCByZXN0YXJ0IGhlbHBlciIgfSwKLQl7IDY0LCAiU3R1YiByb3V0ZXIgc3VwcG9ydCIgfSwKLQl7IDEyOCwgIlRyYWZmaWMgZW5naW5lZXJpbmciIH0sCi0JeyAyNTYsICJwMnAgb3ZlciBMQU4iIH0sCi0JeyA1MTIsICJwYXRoIGNvbXB1dGF0aW9uIHNlcnZlciIgfSwKLQl7IDAsCQkgICAgICAgIE5VTEwgfQotfTsKLQotc3RhdGljIGNoYXIgdHN0cltdID0gIiBbfG9zcGZdIjsKLQotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIGlubGluZSBfX2lubGluZQotI2VuZGlmIC8qIFdJTjMyICovCi0KLXN0YXRpYyBpbnQgb3NwZl9wcmludF9sc2hkcihjb25zdCBzdHJ1Y3QgbHNhX2hkciAqKTsKLXN0YXRpYyBjb25zdCB1X2NoYXIgKm9zcGZfcHJpbnRfbHNhKGNvbnN0IHN0cnVjdCBsc2EgKik7Ci1zdGF0aWMgaW50IG9zcGZfZGVjb2RlX3YyKGNvbnN0IHN0cnVjdCBvc3BmaGRyICosIGNvbnN0IHVfY2hhciAqKTsKLQotc3RhdGljIGludAotb3NwZl9wcmludF9sc2hkcihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNhX2hkciAqbHNocCkKLXsKLSAgICAgICAgdV9pbnQgbHNfbGVuZ3RoOwotCi0gICAgICAgIFRDSEVDSyhsc2hwLT5sc19sZW5ndGgpOwotICAgICAgICBsc19sZW5ndGggPSBFWFRSQUNUXzE2QklUUygmbHNocC0+bHNfbGVuZ3RoKTsKLSAgICAgICAgaWYgKGxzX2xlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbHNhX2hkcikpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQm9ndXMgbGVuZ3RoICV1IDwgJWx1IiwgbHNfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzaXplb2Yoc3RydWN0IGxzYV9oZHIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4oLTEpOwotICAgICAgICB9Ci0KLSAgICAgICAgVENIRUNLKGxzaHAtPmxzX3NlcSk7CS8qIFhYWCAtIGxzX2xlbmd0aCBjaGVjayBjaGVja2VkIHRoaXMgKi8KLQlwcmludGYoIlxuXHQgIEFkdmVydGlzaW5nIFJvdXRlcjogJXMsIHNlcSAweCUwOHgsIGFnZSAldXMsIGxlbmd0aDogJXUiLAotCSAgICAgICBpcGFkZHJfc3RyaW5nKCZsc2hwLT5sc19yb3V0ZXIpLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmbHNocC0+bHNfc2VxKSwKLQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJmxzaHAtPmxzX2FnZSksCi0gICAgICAgICAgICAgICBsc19sZW5ndGgtKHVfaW50KXNpemVvZihzdHJ1Y3QgbHNhX2hkcikpOwotCi0JVENIRUNLKGxzaHAtPmxzX3R5cGUpOwkvKiBYWFggLSBsc19sZW5ndGggY2hlY2sgY2hlY2tlZCB0aGlzICovCi0gICAgICAgIHN3aXRjaCAobHNocC0+bHNfdHlwZSkgewotCS8qIHRoZSBMU0EgaGVhZGVyIGZvciBvcGFxdWUgTFNBcyB3YXMgc2xpZ2h0bHkgY2hhbmdlZCAqLwotICAgICAgICBjYXNlIExTX1RZUEVfT1BBUVVFX0xMOgotICAgICAgICBjYXNlIExTX1RZUEVfT1BBUVVFX0FMOgotICAgICAgICBjYXNlIExTX1RZUEVfT1BBUVVFX0RXOgotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICVzIExTQSAoJWQpLCBPcGFxdWUtVHlwZTogJXMgTFNBICgldSksIE9wYXF1ZS1JRDogJXUiLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIobHNhX3ZhbHVlcywidW5rbm93biIsbHNocC0+bHNfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgbHNocC0+bHNfdHlwZSwKLQotCQkgICB0b2syc3RyKGxzYV9vcGFxdWVfdmFsdWVzLAotCQkJICAgInVua25vd24iLAotCQkJICAgKigmbHNocC0+dW5fbHNhX2lkLm9wYXF1ZV9maWVsZC5vcGFxdWVfdHlwZSkpLAotCQkgICAqKCZsc2hwLT51bl9sc2FfaWQub3BhcXVlX2ZpZWxkLm9wYXF1ZV90eXBlKSwKLQkJICAgRVhUUkFDVF8yNEJJVFMoJmxzaHAtPnVuX2xzYV9pZC5vcGFxdWVfZmllbGQub3BhcXVlX2lkKQotICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICBicmVhazsKLQotCS8qIGFsbCBvdGhlciBMU0EgdHlwZXMgdXNlIHJlZ3VsYXIgc3R5bGUgTFNBIGhlYWRlcnMgKi8KLQlkZWZhdWx0OgotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICVzIExTQSAoJWQpLCBMU0EtSUQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV92YWx1ZXMsInVua25vd24iLGxzaHAtPmxzX3R5cGUpLAotICAgICAgICAgICAgICAgICAgIGxzaHAtPmxzX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZygmbHNocC0+dW5fbHNhX2lkLmxzYV9pZCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCVRDSEVDSyhsc2hwLT5sc19vcHRpb25zKTsJLyogWFhYIC0gbHNfbGVuZ3RoIGNoZWNrIGNoZWNrZWQgdGhpcyAqLwotICAgICAgICBwcmludGYoIlxuXHQgICAgT3B0aW9uczogWyVzXSIsIGJpdHRvazJzdHIob3NwZl9vcHRpb25fdmFsdWVzLCJub25lIixsc2hwLT5sc19vcHRpb25zKSk7Ci0KLSAgICAgICAgcmV0dXJuIChsc19sZW5ndGgpOwotdHJ1bmM6Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLS8qCi0gKiBQcmludCBhIHNpbmdsZSBsaW5rIHN0YXRlIGFkdmVydGlzZW1lbnQuICBJZiB0cnVuY2F0ZWQgb3IgaWYgTFNBIGxlbmd0aAotICogZmllbGQgaXMgbGVzcyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIExTQSBoZWFkZXIsIHJldHVybiBOVUxsLCBlbHNlCi0gKiByZXR1cm4gcG9pbnRlciB0byBkYXRhIHBhc3QgZW5kIG9mIExTQS4KLSAqLwotc3RhdGljIGNvbnN0IHVfaW50OF90ICoKLW9zcGZfcHJpbnRfbHNhKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc2EgKmxzYXApCi17Ci0JcmVnaXN0ZXIgY29uc3QgdV9pbnQ4X3QgKmxzX2VuZDsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmxhbGluayAqcmxwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0b3NfbWV0cmljICp0b3NwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphcDsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXNsYW1ldHJpYyAqYWxtcDsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWNsYSAqbWNwOwotCXJlZ2lzdGVyIGNvbnN0IHVfaW50MzJfdCAqbHA7Ci0JcmVnaXN0ZXIgaW50IGosIGssIHRsdl90eXBlLCB0bHZfbGVuZ3RoLCBzdWJ0bHZfdHlwZSwgc3VidGx2X2xlbmd0aCwgcHJpb3JpdHlfbGV2ZWwsIHRlX2NsYXNzOwotCXJlZ2lzdGVyIGludCBsc19sZW5ndGg7Ci0JY29uc3QgdV9pbnQ4X3QgKnRwdHI7Ci0JaW50IGNvdW50X3NybGc7Ci0gICAgICAgIHVuaW9uIHsgLyogaW50IHRvIGZsb2F0IGNvbnZlcnNpb24gYnVmZmVyIGZvciBzZXZlcmFsIHN1YlRMVnMgKi8KLSAgICAgICAgICAgIGZsb2F0IGY7IAotICAgICAgICAgICAgdV9pbnQzMl90IGk7Ci0gICAgICAgIH0gYnc7Ci0KLQl0cHRyID0gKHVfaW50OF90ICopbHNhcC0+bHNhX3VuLnVuX3Vua25vd247IC8qIHNxdWVsY2ggY29tcGlsZXIgd2FybmluZ3MgKi8KLSAgICAgICAgbHNfbGVuZ3RoID0gb3NwZl9wcmludF9sc2hkcigmbHNhcC0+bHNfaGRyKTsKLSAgICAgICAgaWYgKGxzX2xlbmd0aCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7Ci0JbHNfZW5kID0gKHVfaW50OF90ICopbHNhcCArIGxzX2xlbmd0aDsKLQlsc19sZW5ndGggLT0gc2l6ZW9mKHN0cnVjdCBsc2FfaGRyKTsKLQotCXN3aXRjaCAobHNhcC0+bHNfaGRyLmxzX3R5cGUpIHsKLQotCWNhc2UgTFNfVFlQRV9ST1VURVI6Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9mbGFncyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFJvdXRlciBMU0EgT3B0aW9uczogWyVzXSIsIGJpdHRvazJzdHIob3NwZl9ybGFfZmxhZ192YWx1ZXMsIm5vbmUiLGxzYXAtPmxzYV91bi51bl9ybGEucmxhX2ZsYWdzKSk7Ci0KLQkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9ybGEucmxhX2NvdW50KTsKLQkJaiA9IEVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9jb3VudCk7Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9saW5rKTsKLQkJcmxwID0gbHNhcC0+bHNhX3VuLnVuX3JsYS5ybGFfbGluazsKLQkJd2hpbGUgKGotLSkgewotCQkJVENIRUNLKCpybHApOwotCQkJc3dpdGNoIChybHAtPmxpbmtfdHlwZSkgewotCi0JCQljYXNlIFJMQV9UWVBFX1ZJUlRVQUw6Ci0JCQkJcHJpbnRmKCJcblx0ICAgICAgVmlydHVhbCBMaW5rOiBOZWlnaGJvciBSb3V0ZXItSUQ6ICVzLCBJbnRlcmZhY2UgQWRkcmVzczogJXMiLAotCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfaWQpLAotCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfZGF0YSkpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWNhc2UgUkxBX1RZUEVfUk9VVEVSOgotCQkJCXByaW50ZigiXG5cdCAgICAgIE5laWdoYm9yIFJvdXRlci1JRDogJXMsIEludGVyZmFjZSBBZGRyZXNzOiAlcyIsCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19pZCksCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19kYXRhKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUkxBX1RZUEVfVFJBTlNJVDoKLQkJCQlwcmludGYoIlxuXHQgICAgICBOZWlnaGJvciBOZXR3b3JrLUlEOiAlcywgSW50ZXJmYWNlIEFkZHJlc3M6ICVzIiwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmcmxwLT5saW5rX2lkKSwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmcmxwLT5saW5rX2RhdGEpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSTEFfVFlQRV9TVFVCOgotCQkJCXByaW50ZigiXG5cdCAgICAgIFN0dWIgTmV0d29yazogJXMsIE1hc2s6ICVzIiwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmcmxwLT5saW5rX2lkKSwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmcmxwLT5saW5rX2RhdGEpKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlwcmludGYoIlxuXHQgICAgICBVbmtub3duIFJvdXRlciBMaW5rIFR5cGUgKCV1KSIsCi0JCQkJICAgIHJscC0+bGlua190eXBlKTsKLQkJCQlyZXR1cm4gKGxzX2VuZCk7Ci0JCQl9Ci0JCQlwcmludGYoIiwgdG9zIDAsIG1ldHJpYzogJWQiLCBFWFRSQUNUXzE2QklUUygmcmxwLT5saW5rX3RvczBtZXRyaWMpKTsKLQkJCXRvc3AgPSAoc3RydWN0IHRvc19tZXRyaWMgKikKLQkJCSAgICAoKHNpemVvZiBybHAtPmxpbmtfdG9zMG1ldHJpYykgKyAodV9jaGFyICopIHJscCk7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgKGludCkgcmxwLT5saW5rX3Rvc2NvdW50OyArK2ssICsrdG9zcCkgewotCQkJCVRDSEVDSygqdG9zcCk7Ci0JCQkJcHJpbnRmKCIsIHRvcyAlZCwgbWV0cmljOiAlZCIsCi0JCQkJICAgIHRvc3AtPnRvc190eXBlLAotCQkJCSAgICBFWFRSQUNUXzE2QklUUygmdG9zcC0+dG9zX21ldHJpYykpOwotCQkJfQotCQkJcmxwID0gKHN0cnVjdCBybGFsaW5rICopKCh1X2NoYXIgKikocmxwICsgMSkgKwotCQkJICAgICgocmxwLT5saW5rX3Rvc2NvdW50KSAqIHNpemVvZigqdG9zcCkpKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTFNfVFlQRV9ORVRXT1JLOgotCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX25sYS5ubGFfbWFzayk7Ci0JCXByaW50ZigiXG5cdCAgICBNYXNrICVzXG5cdCAgICBDb25uZWN0ZWQgUm91dGVyczoiLAotCQkgICAgaXBhZGRyX3N0cmluZygmbHNhcC0+bHNhX3VuLnVuX25sYS5ubGFfbWFzaykpOwotCQlhcCA9IGxzYXAtPmxzYV91bi51bl9ubGEubmxhX3JvdXRlcjsKLQkJd2hpbGUgKCh1X2NoYXIgKilhcCA8IGxzX2VuZCkgewotCQkJVENIRUNLKCphcCk7Ci0JCQlwcmludGYoIlxuXHQgICAgICAlcyIsIGlwYWRkcl9zdHJpbmcoYXApKTsKLQkJCSsrYXA7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfU1VNX0lQOgotCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX25sYS5ubGFfbWFzayk7Ci0JCXByaW50ZigiXG5cdCAgICBNYXNrICVzIiwKLQkJICAgIGlwYWRkcl9zdHJpbmcoJmxzYXAtPmxzYV91bi51bl9zbGEuc2xhX21hc2spKTsKLQkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9zbGEuc2xhX3Rvc21ldHJpYyk7Ci0JCWxwID0gbHNhcC0+bHNhX3VuLnVuX3NsYS5zbGFfdG9zbWV0cmljOwotICAgICAgICAgICAgICAgIC8qIHN1cHByZXNzIHRvcyBpZiBpdHMgbm90IHN1cHBvcnRlZCAqLwotICAgICAgICAgICAgICAgIGlmKCEoKGxzYXAtPmxzX2hkci5sc19vcHRpb25zKSZPU1BGX09QVElPTl9UKSkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgbWV0cmljOiAldSIsIEVYVFJBQ1RfMzJCSVRTKGxwKSZTTEFfTUFTS19NRVRSSUMpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0JCXdoaWxlICgodV9jaGFyICopbHAgPCBsc19lbmQpIHsKLQkJCXJlZ2lzdGVyIHVfaW50MzJfdCB1bDsKLQotCQkJVENIRUNLKCpscCk7Ci0JCQl1bCA9IEVYVFJBQ1RfMzJCSVRTKGxwKTsKLQkJCXByaW50ZigiLCB0b3MgJWQgbWV0cmljICVkIiwKLQkJCSAgICAodWwgJiBTTEFfTUFTS19UT1MpID4+IFNMQV9TSElGVF9UT1MsCi0JCQkgICAgdWwgJiBTTEFfTUFTS19NRVRSSUMpOwotCQkJKytscDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTFNfVFlQRV9TVU1fQUJSOgotCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX3NsYS5zbGFfdG9zbWV0cmljKTsKLQkJbHAgPSBsc2FwLT5sc2FfdW4udW5fc2xhLnNsYV90b3NtZXRyaWM7Ci0gICAgICAgICAgICAgICAgLyogc3VwcHJlc3MgdG9zIGlmIGl0cyBub3Qgc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgaWYoISgobHNhcC0+bHNfaGRyLmxzX29wdGlvbnMpJk9TUEZfT1BUSU9OX1QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBtZXRyaWM6ICV1IiwgRVhUUkFDVF8zMkJJVFMobHApJlNMQV9NQVNLX01FVFJJQyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQkJd2hpbGUgKCh1X2NoYXIgKilscCA8IGxzX2VuZCkgewotCQkJcmVnaXN0ZXIgdV9pbnQzMl90IHVsOwotCi0JCQlUQ0hFQ0soKmxwKTsKLQkJCXVsID0gRVhUUkFDVF8zMkJJVFMobHApOwotCQkJcHJpbnRmKCIsIHRvcyAlZCBtZXRyaWMgJWQiLAotCQkJICAgICh1bCAmIFNMQV9NQVNLX1RPUykgPj4gU0xBX1NISUZUX1RPUywKLQkJCSAgICB1bCAmIFNMQV9NQVNLX01FVFJJQyk7Ci0JCQkrK2xwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBMU19UWVBFX0FTRToKLSAgICAgICAgY2FzZSBMU19UWVBFX05TU0E6IC8qIGZhbGwgdGhyb3VnaCAtIHRob3NlIExTQXMgc2hhcmUgdGhlIHNhbWUgZm9ybWF0ICovCi0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9tYXNrKTsKLQkJcHJpbnRmKCJcblx0ICAgIE1hc2sgJXMiLAotCQkgICAgaXBhZGRyX3N0cmluZygmbHNhcC0+bHNhX3VuLnVuX2FzbGEuYXNsYV9tYXNrKSk7Ci0KLQkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9zbGEuc2xhX3Rvc21ldHJpYyk7Ci0JCWFsbXAgPSBsc2FwLT5sc2FfdW4udW5fYXNsYS5hc2xhX21ldHJpYzsKLQkJd2hpbGUgKCh1X2NoYXIgKilhbG1wIDwgbHNfZW5kKSB7Ci0JCQlyZWdpc3RlciB1X2ludDMyX3QgdWw7Ci0KLQkJCVRDSEVDSyhhbG1wLT5hc2xhX3Rvc21ldHJpYyk7Ci0JCQl1bCA9IEVYVFJBQ1RfMzJCSVRTKCZhbG1wLT5hc2xhX3Rvc21ldHJpYyk7Ci0JCQlwcmludGYoIiwgdHlwZSAlZCwgdG9zICVkIG1ldHJpYzoiLAotCQkJICAgICh1bCAmIEFTTEFfRkxBR19FWFRFUk5BTCkgPyAyIDogMSwKLQkJCSAgICAodWwgJiBBU0xBX01BU0tfVE9TKSA+PiBBU0xBX1NISUZUX1RPUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHVsICYgQVNMQV9NQVNLX01FVFJJQyk9PTB4ZmZmZmZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIGluZmluaXRlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJWQiLCAodWwgJiBBU0xBX01BU0tfTUVUUklDKSk7Ci0KLQkJCVRDSEVDSyhhbG1wLT5hc2xhX2ZvcndhcmQpOwotCQkJaWYgKGFsbXAtPmFzbGFfZm9yd2FyZC5zX2FkZHIpIHsKLQkJCQlwcmludGYoIiwgZm9yd2FyZCAlcyIsCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJmFsbXAtPmFzbGFfZm9yd2FyZCkpOwotCQkJfQotCQkJVENIRUNLKGFsbXAtPmFzbGFfdGFnKTsKLQkJCWlmIChhbG1wLT5hc2xhX3RhZy5zX2FkZHIpIHsKLQkJCQlwcmludGYoIiwgdGFnICVzIiwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmYWxtcC0+YXNsYV90YWcpKTsKLQkJCX0KLQkJCSsrYWxtcDsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgTFNfVFlQRV9HUk9VUDoKLQkJLyogTXVsdGljYXN0IGV4dGVuc2lvbnMgYXMgb2YgMjMgSnVseSAxOTkxICovCi0JCW1jcCA9IGxzYXAtPmxzYV91bi51bl9tY2xhOwotCQl3aGlsZSAoKHVfY2hhciAqKW1jcCA8IGxzX2VuZCkgewotCQkJVENIRUNLKG1jcC0+bWNsYV92aWQpOwotCQkJc3dpdGNoIChFWFRSQUNUXzMyQklUUygmbWNwLT5tY2xhX3Z0eXBlKSkgewotCi0JCQljYXNlIE1DTEFfVkVSVEVYX1JPVVRFUjoKLQkJCQlwcmludGYoIlxuXHQgICAgUm91dGVyIFJvdXRlci1JRCAlcyIsCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJm1jcC0+bWNsYV92aWQpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBNQ0xBX1ZFUlRFWF9ORVRXT1JLOgotCQkJCXByaW50ZigiXG5cdCAgICBOZXR3b3JrIERlc2lnbmF0ZWQgUm91dGVyICVzIiwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmbWNwLT5tY2xhX3ZpZCkpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiXG5cdCAgICB1bmtub3duIFZlcnRleFR5cGUgKCV1KSIsCi0JCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZtY3AtPm1jbGFfdnR5cGUpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJKyttY3A7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfT1BBUVVFX0xMOiAvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIExTX1RZUEVfT1BBUVVFX0FMOiAKLQljYXNlIExTX1RZUEVfT1BBUVVFX0RXOgotCi0JICAgIHN3aXRjaCAoKigmbHNhcC0+bHNfaGRyLnVuX2xzYV9pZC5vcGFxdWVfZmllbGQub3BhcXVlX3R5cGUpKSB7Ci0gICAgICAgICAgICBjYXNlIExTX09QQVFVRV9UWVBFX1JJOgotCQl0cHRyID0gKHVfaW50OF90ICopKCZsc2FwLT5sc2FfdW4udW5fcmlfdGx2LnR5cGUpOwotCi0JCXdoaWxlIChsc19sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLCA0KTsKLQkJICAgIGlmIChsc19sZW5ndGggPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgUmVtYWluaW5nIExTIGxlbmd0aCAldSA8IDQiLCBsc19sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGx2X3R5cGUgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKLSAgICAgICAgICAgICAgICAgICAgdGx2X2xlbmd0aCA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIrMik7Ci0gICAgICAgICAgICAgICAgICAgIHRwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgICAgIGxzX2xlbmd0aC09NDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyBUTFYgKCV1KSwgbGVuZ3RoOiAldSwgdmFsdWU6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV9vcGFxdWVfcmlfdGx2X3ZhbHVlcywidW5rbm93biIsdGx2X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGx2X2xlbmd0aCA+IGxzX2xlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEJvZ3VzIGxlbmd0aCAldSA+ICV1IiwgdGx2X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc19sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbHNfbGVuZ3RoLT10bHZfbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLCB0bHZfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHRsdl90eXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfUklfVExWX0NBUDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoICE9IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQm9ndXMgbGVuZ3RoICV1ICE9IDQiLCB0bHZfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2FwYWJpbGl0aWVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihsc2Ffb3BhcXVlX3JpX3Rsdl9jYXBfdmFsdWVzLCAiVW5rbm93biIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAgICAgIix0bHZfbGVuZ3RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRwdHIrPXRsdl9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIExTX09QQVFVRV9UWVBFX0dSQUNFOgotCQl0cHRyID0gKHVfaW50OF90ICopKCZsc2FwLT5sc2FfdW4udW5fZ3JhY2VfdGx2LnR5cGUpOwotCi0JCXdoaWxlIChsc19sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLCA0KTsKLQkJICAgIGlmIChsc19sZW5ndGggPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgUmVtYWluaW5nIExTIGxlbmd0aCAldSA8IDQiLCBsc19sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGx2X3R5cGUgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKLSAgICAgICAgICAgICAgICAgICAgdGx2X2xlbmd0aCA9IEVYVFJBQ1RfMTZCSVRTKHRwdHIrMik7Ci0gICAgICAgICAgICAgICAgICAgIHRwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgICAgIGxzX2xlbmd0aC09NDsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAlcyBUTFYgKCV1KSwgbGVuZ3RoOiAldSwgdmFsdWU6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV9vcGFxdWVfZ3JhY2VfdGx2X3ZhbHVlcywidW5rbm93biIsdGx2X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAodGx2X2xlbmd0aCA+IGxzX2xlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIEJvZ3VzIGxlbmd0aCAldSA+ICV1IiwgdGx2X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc19sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbHNfbGVuZ3RoLT10bHZfbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLCB0bHZfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHRsdl90eXBlKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfR1JBQ0VfVExWX1BFUklPRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoICE9IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQm9ndXMgbGVuZ3RoICV1ICE9IDQiLCB0bHZfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXVzIixFWFRSQUNUXzMyQklUUyh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfR1JBQ0VfVExWX1JFQVNPTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoICE9IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgQm9ndXMgbGVuZ3RoICV1ICE9IDEiLCB0bHZfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2Ffb3BhcXVlX2dyYWNlX3Rsdl9yZWFzb25fdmFsdWVzLCAiVW5rbm93biIsICp0cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfR1JBQ0VfVExWX0lOVF9BRERSRVNTOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsdl9sZW5ndGggIT0gNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBCb2d1cyBsZW5ndGggJXUgIT0gNCIsIHRsdl9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsIGlwYWRkcl9zdHJpbmcodHB0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAgICIsdGx2X2xlbmd0aCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cHRyKz10bHZfbGVuZ3RoOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGJyZWFrOwotCSAgICBjYXNlIExTX09QQVFVRV9UWVBFX1RFOgotCQl0cHRyID0gKHVfaW50OF90ICopKCZsc2FwLT5sc2FfdW4udW5fdGVfbHNhX3Rsdi50eXBlKTsKLQotCQl3aGlsZSAobHNfbGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgNCk7Ci0JCSAgICBpZiAobHNfbGVuZ3RoIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFJlbWFpbmluZyBMUyBsZW5ndGggJXUgPCA0IiwgbHNfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRsdl90eXBlID0gRVhUUkFDVF8xNkJJVFModHB0cik7Ci0gICAgICAgICAgICAgICAgICAgIHRsdl9sZW5ndGggPSBFWFRSQUNUXzE2QklUUyh0cHRyKzIpOwotICAgICAgICAgICAgICAgICAgICB0cHRyKz00OwotICAgICAgICAgICAgICAgICAgICBsc19sZW5ndGgtPTQ7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgJXMgVExWICgldSksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihsc2Ffb3BhcXVlX3RlX3Rsdl92YWx1ZXMsInVua25vd24iLHRsdl90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGx2X2xlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRsdl9sZW5ndGggPiBsc19sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICBCb2d1cyBsZW5ndGggJXUgPiAldSIsIHRsdl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHNfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxzX2xlbmd0aC09dGx2X2xlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHRsdl90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX1RMVl9MSU5LOgotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRsdl9sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bHZfbGVuZ3RoIDwgNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgUmVtYWluaW5nIFRMViBsZW5ndGggJXUgPCA0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl9sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X3R5cGUgPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfbGVuZ3RoID0gRVhUUkFDVF8xNkJJVFModHB0cisyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cHRyKz00OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsdl9sZW5ndGgtPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICAgJXMgc3ViVExWICgldSksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV9vcGFxdWVfdGVfbGlua190bHZfc3VidGx2X3ZhbHVlcywidW5rbm93biIsc3VidGx2X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0bHZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqdHB0ciwgc3VidGx2X2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHN1YnRsdl90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfQURNSU5fR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xJTktfSUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfTElOS19MT0NBTF9SRU1PVEVfSUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcyAoMHglMDh4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHRwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModHB0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGx2X2xlbmd0aCA9PSA4KSAvKiBkcmFmdC1pZXRmLWNjYW1wLW9zcGYtZ21wbHMtZXh0ZW5zaW9ucyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzICgweCUwOHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKHRwdHIrNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX0xPQ0FMX0lQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX1JFTU9URV9JUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzIiwgaXBhZGRyX3N0cmluZyh0cHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfT1BBUVVFX1RFX0xJTktfU1VCVExWX01BWF9CVzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9NQVhfUkVTX0JXOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlLjNmIE1icHMiLCBidy5mKjgvMTAwMDAwMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9VTlJFU19CVzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ZV9jbGFzcyA9IDA7IHRlX2NsYXNzIDwgODsgdGVfY2xhc3MrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrdGVfY2xhc3MqNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdFRFLUNsYXNzICV1OiAlLjNmIE1icHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfQldfQ09OU1RSQUlOVFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0QmFuZHdpZHRoIENvbnN0cmFpbnRzIE1vZGVsIElEOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZGlmZnNlcnZfdGVfYmNfdmFsdWVzLCAidW5rbm93biIsICp0cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp0cHRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVjb2RlIEJDcyB1bnRpbCB0aGUgc3ViVExWIGVuZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh0ZV9jbGFzcyA9IDA7IHRlX2NsYXNzIDwgKHN1YnRsdl9sZW5ndGgtNCkvNDsgdGVfY2xhc3MrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCt0ZV9jbGFzcyo0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0ICBCYW5kd2lkdGggY29uc3RyYWludCBDVCV1OiAlLjNmIE1icHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfVEVfTUVUUklDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgTWV0cmljICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1BST1RFQ1RJT05fVFlQRToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzLCBQcmlvcml0eSAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGdtcGxzX2xpbmtfcHJvdF92YWx1ZXMsICJub25lIiwgKnRwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih0cHRyKzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfSU5URl9TV19DQVBfREVTQ1I6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0SW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5OiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGdtcGxzX3N3aXRjaF9jYXBfdmFsdWVzLCAiVW5rbm93biIsICoodHB0cikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRMU1AgRW5jb2Rpbmc6ICVzXG5cdFx0TWF4IExTUCBCYW5kd2lkdGg6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZ21wbHNfZW5jb2RpbmdfdmFsdWVzLCAiVW5rbm93biIsICoodHB0cisxKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByaW9yaXR5X2xldmVsID0gMDsgcHJpb3JpdHlfbGV2ZWwgPCA4OyBwcmlvcml0eV9sZXZlbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cis0Kyhwcmlvcml0eV9sZXZlbCo0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdCAgcHJpb3JpdHkgbGV2ZWwgJWQ6ICUuM2YgTWJwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHlfbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9MSU5LX1NVQlRMVl9MSU5LX1RZUEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIobHNhX29wYXF1ZV90ZV90bHZfbGlua190eXBlX3N1Yl90bHZfdmFsdWVzLCJ1bmtub3duIiwqdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMU19PUEFRVUVfVEVfTElOS19TVUJUTFZfU0hBUkVEX1JJU0tfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50X3NybGcgPSBzdWJ0bHZfbGVuZ3RoIC8gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50X3NybGcgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdCAgU2hhcmVkIHJpc2sgZ3JvdXA6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY291bnRfc3JsZyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsYncuaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHB0cis9NDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9zcmxnLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50X3NybGcgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0XHQiLHN1YnRsdl9sZW5ndGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbiBPU1BGIGV2ZXJ5dGhpbmcgaGFzIHRvIGJlIDMyLWJpdCBhbGlnbmVkLCBpbmNsdWRpbmcgVExWcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0bHZfbGVuZ3RoJTQgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGx2X2xlbmd0aCs9NC0oc3VidGx2X2xlbmd0aCU0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuZ3RoLT1zdWJ0bHZfbGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwdHIrPXN1YnRsdl9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBjYXNlIExTX09QQVFVRV9URV9UTFZfUk9VVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRsdl9sZW5ndGggPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFRMViBsZW5ndGggJXUgPCA0IiwgdGx2X2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKCp0cHRyLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcyIsIGlwYWRkcl9zdHJpbmcodHB0cikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSh0cHRyLCJcblx0ICAgICAgIix0bHZfbGVuZ3RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKGxzX2VuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0cHRyKz10bHZfbGVuZ3RoOwotCQl9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgewotICAgICAgICAgICAgICAgIGlmKCFwcmludF91bmtub3duX2RhdGEoKHVfaW50OF90ICopbHNhcC0+bHNhX3VuLnVuX3Vua25vd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG5cdCAgICAiLCBsc19sZW5ndGgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4obHNfZW5kKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSBoZXhkdW1wID8gKi8KLSAgICAgICAgaWYgKHZmbGFnPiAxKQotICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKilsc2FwLT5sc2FfdW4udW5fdW5rbm93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuXHQgICAgIiwgbHNfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgIHJldHVybihsc19lbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAKLQlyZXR1cm4gKGxzX2VuZCk7Ci10cnVuYzoKLQlyZXR1cm4gKE5VTEwpOwotfQotCi1zdGF0aWMgaW50Ci1vc3BmX2RlY29kZV92MihyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgb3NwZmhkciAqb3AsCi0gICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpkYXRhZW5kKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphcDsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNyICpsc3JwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc2FfaGRyICpsc2hwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc2EgKmxzYXA7Ci0JcmVnaXN0ZXIgdV9pbnQzMl90IGxzYV9jb3VudCxsc2FfY291bnRfbWF4OwotCi0Jc3dpdGNoIChvcC0+b3NwZl90eXBlKSB7Ci0KLQljYXNlIE9TUEZfVFlQRV9VTUQ6Ci0JCS8qCi0JCSAqIFJvYiBDb2x0dW4ncyBzcGVjaWFsIG1vbml0b3JpbmcgcGFja2V0czsKLQkJICogZG8gbm90aGluZwotCQkgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIE9TUEZfVFlQRV9IRUxMTzoKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRPcHRpb25zOiBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihvc3BmX29wdGlvbl92YWx1ZXMsIm5vbmUiLG9wLT5vc3BmX2hlbGxvLmhlbGxvX29wdGlvbnMpKTsKLQotICAgICAgICAgICAgICAgIFRDSEVDSyhvcC0+b3NwZl9oZWxsby5oZWxsb19kZWFkaW50KTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIEhlbGxvIFRpbWVyOiAldXMsIERlYWQgVGltZXIgJXVzLCBNYXNrOiAlcywgUHJpb3JpdHk6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmX2hlbGxvLmhlbGxvX2hlbGxvaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJm9wLT5vc3BmX2hlbGxvLmhlbGxvX2RlYWRpbnQpLAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZl9oZWxsby5oZWxsb19tYXNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgb3AtPm9zcGZfaGVsbG8uaGVsbG9fcHJpb3JpdHkpOwotCi0JCVRDSEVDSyhvcC0+b3NwZl9oZWxsby5oZWxsb19kcik7Ci0JCWlmIChvcC0+b3NwZl9oZWxsby5oZWxsb19kci5zX2FkZHIgIT0gMCkKLQkJCXByaW50ZigiXG5cdCAgRGVzaWduYXRlZCBSb3V0ZXIgJXMiLAotCQkJICAgIGlwYWRkcl9zdHJpbmcoJm9wLT5vc3BmX2hlbGxvLmhlbGxvX2RyKSk7Ci0KLQkJVENIRUNLKG9wLT5vc3BmX2hlbGxvLmhlbGxvX2Jkcik7Ci0JCWlmIChvcC0+b3NwZl9oZWxsby5oZWxsb19iZHIuc19hZGRyICE9IDApCi0JCQlwcmludGYoIiwgQmFja3VwIERlc2lnbmF0ZWQgUm91dGVyICVzIiwKLQkJCSAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZl9oZWxsby5oZWxsb19iZHIpKTsKLQotICAgICAgICAgICAgICAgIGFwID0gb3AtPm9zcGZfaGVsbG8uaGVsbG9fbmVpZ2hib3I7Ci0gICAgICAgICAgICAgICAgaWYgKCh1X2NoYXIgKilhcCA8IGRhdGFlbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIE5laWdoYm9yIExpc3Q6Iik7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCh1X2NoYXIgKilhcCA8IGRhdGFlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSygqYXApOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgICVzIiwgaXBhZGRyX3N0cmluZyhhcCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgKythcDsKLSAgICAgICAgICAgICAgICB9Ci0JCWJyZWFrOwkvKiBIRUxMTyAqLwotCi0JY2FzZSBPU1BGX1RZUEVfREQ6Ci0JCVRDSEVDSyhvcC0+b3NwZl9kYi5kYl9vcHRpb25zKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRPcHRpb25zOiBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYml0dG9rMnN0cihvc3BmX29wdGlvbl92YWx1ZXMsIm5vbmUiLG9wLT5vc3BmX2RiLmRiX29wdGlvbnMpKTsKLQkJVENIRUNLKG9wLT5vc3BmX2RiLmRiX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgREQgRmxhZ3M6IFslc10iLAotICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKG9zcGZfZGRfZmxhZ192YWx1ZXMsIm5vbmUiLG9wLT5vc3BmX2RiLmRiX2ZsYWdzKSk7Ci0KLQkJaWYgKHZmbGFnKSB7Ci0JCQkvKiBQcmludCBhbGwgdGhlIExTIGFkdidzICovCi0JCQlsc2hwID0gb3AtPm9zcGZfZGIuZGJfbHNoZHI7Ci0JCQl3aGlsZSAob3NwZl9wcmludF9sc2hkcihsc2hwKSAhPSAtMSkgewotCQkJCSsrbHNocDsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgT1NQRl9UWVBFX0xTX1JFUToKLSAgICAgICAgICAgICAgICBsc3JwID0gb3AtPm9zcGZfbHNyOwotICAgICAgICAgICAgICAgIHdoaWxlICgodV9jaGFyICopbHNycCA8IGRhdGFlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgVENIRUNLKCpsc3JwKTsKLQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIEFkdmVydGlzaW5nIFJvdXRlcjogJXMsICVzIExTQSAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcoJmxzcnAtPmxzX3JvdXRlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV92YWx1ZXMsInVua25vd24iLEVYVFJBQ1RfMzJCSVRTKGxzcnAtPmxzX3R5cGUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZsc3JwLT5sc190eXBlKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChFWFRSQUNUXzMyQklUUyhsc3JwLT5sc190eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIExTQSBoZWFkZXIgZm9yIG9wYXF1ZSBMU0FzIHdhcyBzbGlnaHRseSBjaGFuZ2VkICovCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfVFlQRV9PUEFRVUVfTEw6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfVFlQRV9PUEFRVUVfQUw6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTFNfVFlQRV9PUEFRVUVfRFc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgT3BhcXVlLVR5cGU6ICVzIExTQSAoJXUpLCBPcGFxdWUtSUQ6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGxzYV9vcGFxdWVfdmFsdWVzLCAidW5rbm93biIsbHNycC0+dW5fbHNfc3RhdGVpZC5vcGFxdWVfZmllbGQub3BhcXVlX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzcnAtPnVuX2xzX3N0YXRlaWQub3BhcXVlX2ZpZWxkLm9wYXF1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKCZsc3JwLT51bl9sc19zdGF0ZWlkLm9wYXF1ZV9maWVsZC5vcGFxdWVfaWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIExTQS1JRDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcoJmxzcnAtPnVuX2xzX3N0YXRlaWQubHNfc3RhdGVpZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICsrbHNycDsKLSAgICAgICAgICAgICAgICB9Ci0JCWJyZWFrOwotCi0JY2FzZSBPU1BGX1RZUEVfTFNfVVBEQVRFOgotICAgICAgICAgICAgICAgIGxzYXAgPSBvcC0+b3NwZl9sc3UubHN1X2xzYTsKLSAgICAgICAgICAgICAgICBUQ0hFQ0sob3AtPm9zcGZfbHN1LmxzdV9jb3VudCk7Ci0gICAgICAgICAgICAgICAgbHNhX2NvdW50X21heCA9IEVYVFJBQ1RfMzJCSVRTKCZvcC0+b3NwZl9sc3UubHN1X2NvdW50KTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiwgJWQgTFNBJXMiLGxzYV9jb3VudF9tYXgsIGxzYV9jb3VudF9tYXggPiAxID8gInMiIDogIiIpOwotICAgICAgICAgICAgICAgIGZvciAobHNhX2NvdW50PTE7bHNhX2NvdW50IDw9IGxzYV9jb3VudF9tYXg7bHNhX2NvdW50KyspIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBMU0EgIyV1Iixsc2FfY291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbHNhcCA9IChjb25zdCBzdHJ1Y3QgbHNhICopb3NwZl9wcmludF9sc2EobHNhcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobHNhcCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgICAgIH0KLQkJYnJlYWs7Ci0KLQljYXNlIE9TUEZfVFlQRV9MU19BQ0s6Ci0gICAgICAgICAgICAgICAgbHNocCA9IG9wLT5vc3BmX2xzYS5sc2FfbHNoZHI7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG9zcGZfcHJpbnRfbHNoZHIobHNocCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgKytsc2hwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXByaW50ZigidjIgdHlwZSAoJWQpIiwgb3AtPm9zcGZfdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gKDApOwotdHJ1bmM6Ci0JcmV0dXJuICgxKTsKLX0KLQotdm9pZAotb3NwZl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCi0gICAgY29uc3QgdV9jaGFyICpicDIgX1VfKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBvc3BmaGRyICpvcDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmRhdGFlbmQ7Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0KLQlvcCA9IChzdHJ1Y3Qgb3NwZmhkciAqKWJwOwotCi0gICAgICAgIC8qIFhYWCBCZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSwgc3RyaXAgb2ZmIHRoZSBNRDUgdHJhaWxlciAqLwotICAgICAgICBUQ0hFQ0sob3AtPm9zcGZfYXV0aHR5cGUpOwotICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmX2F1dGh0eXBlKSA9PSBPU1BGX0FVVEhfTUQ1KSB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoIC09IE9TUEZfQVVUSF9NRDVfTEVOOwotICAgICAgICAgICAgICAgIHNuYXBlbmQgLT0gT1NQRl9BVVRIX01ENV9MRU47Ci0gICAgICAgIH0KLQotCS8qIElmIHRoZSB0eXBlIGlzIHZhbGlkIHRyYW5zbGF0ZSBpdCwgb3IganVzdCBwcmludCB0aGUgdHlwZSAqLwotCS8qIHZhbHVlLiAgSWYgaXQncyBub3QgdmFsaWQsIHNheSBzbyBhbmQgcmV0dXJuICovCi0JVENIRUNLKG9wLT5vc3BmX3R5cGUpOwotCWNwID0gdG9rMnN0cih0eXBlMnN0ciwgInVua25vd24gTFMtdHlwZSIsIG9wLT5vc3BmX3R5cGUpOwotCXByaW50ZigiT1NQRnYldSwgJXMsIGxlbmd0aDogJXUiLAotCSAgICAgICBvcC0+b3NwZl92ZXJzaW9uLAotCSAgICAgICBjcCwKLQkgICAgICAgbGVuZ3RoKTsKLQlpZiAoKmNwID09ICd1JykKLQkJcmV0dXJuOwotCi0gICAgICAgIGlmKCF2ZmxhZykgLyogbm9uIHZlcmJvc2UgLSBzbyBsZXRzIGJhaWwgb3V0IGhlcmUgKi8KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLQlUQ0hFQ0sob3AtPm9zcGZfbGVuKTsKLQlpZiAobGVuZ3RoICE9IEVYVFJBQ1RfMTZCSVRTKCZvcC0+b3NwZl9sZW4pKSB7Ci0JCXByaW50ZigiIFtsZW4gJWRdIiwgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmX2xlbikpOwotCQlyZXR1cm47Ci0JfQotCWRhdGFlbmQgPSBicCArIGxlbmd0aDsKLQotCVRDSEVDSyhvcC0+b3NwZl9yb3V0ZXJpZCk7Ci0gICAgICAgIHByaW50ZigiXG5cdFJvdXRlci1JRDogJXMiLCBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZl9yb3V0ZXJpZCkpOwotCi0JVENIRUNLKG9wLT5vc3BmX2FyZWFpZCk7Ci0JaWYgKG9wLT5vc3BmX2FyZWFpZC5zX2FkZHIgIT0gMCkKLQkJcHJpbnRmKCIsIEFyZWEgJXMiLCBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZl9hcmVhaWQpKTsKLQllbHNlCi0JCXByaW50ZigiLCBCYWNrYm9uZSBBcmVhIik7Ci0KLQlpZiAodmZsYWcpIHsKLQkJLyogUHJpbnQgYXV0aGVudGljYXRpb24gZGF0YSAoc2hvdWxkIHdlIHJlYWxseSBkbyB0aGlzPykgKi8KLQkJVENIRUNLMihvcC0+b3NwZl9hdXRoZGF0YVswXSwgc2l6ZW9mKG9wLT5vc3BmX2F1dGhkYXRhKSk7Ci0KLSAgICAgICAgICAgICAgICBwcmludGYoIiwgQXV0aGVudGljYXRpb24gVHlwZTogJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIob3NwZl9hdXRodHlwZV92YWx1ZXMsInVua25vd24iLEVYVFJBQ1RfMTZCSVRTKCZvcC0+b3NwZl9hdXRodHlwZSkpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmb3AtPm9zcGZfYXV0aHR5cGUpKTsKLQotCQlzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKCZvcC0+b3NwZl9hdXRodHlwZSkpIHsKLQotCQljYXNlIE9TUEZfQVVUSF9OT05FOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBPU1BGX0FVVEhfU0lNUExFOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0U2ltcGxlIHRleHQgcGFzc3dvcmQ6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2FmZXB1dHMob3AtPm9zcGZfYXV0aGRhdGEsIE9TUEZfQVVUSF9TSU1QTEVfTEVOKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgT1NQRl9BVVRIX01ENToKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEtleS1JRDogJXUsIEF1dGgtTGVuZ3RoOiAldSwgQ3J5cHRvIFNlcXVlbmNlIE51bWJlcjogMHglMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKChvcC0+b3NwZl9hdXRoZGF0YSkrMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigob3AtPm9zcGZfYXV0aGRhdGEpKzMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKChvcC0+b3NwZl9hdXRoZGF0YSkrNCkpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldHVybjsKLQkJfQotCX0KLQkvKiBEbyByZXN0IGFjY29yZGluZyB0byB2ZXJzaW9uLgkgKi8KLQlzd2l0Y2ggKG9wLT5vc3BmX3ZlcnNpb24pIHsKLQotCWNhc2UgMjoKLQkJLyogb3NwZiB2ZXJzaW9uIDIgKi8KLQkJaWYgKG9zcGZfZGVjb2RlX3YyKG9wLCBkYXRhZW5kKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCIgb3NwZiBbdmVyc2lvbiAlZF0iLCBvcC0+b3NwZl92ZXJzaW9uKTsKLQkJYnJlYWs7Ci0JfQkJCS8qIGVuZCBzd2l0Y2ggb24gdmVyc2lvbiAqLwotCi0JcmV0dXJuOwotdHJ1bmM6Ci0JZnB1dHModHN0ciwgc3Rkb3V0KTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LW9zcGY2LmMgYi9wcmludC1vc3BmNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzI1YTIxLi4wMDAwMDAwCi0tLSBhL3ByaW50LW9zcGY2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIE9TUEYgc3VwcG9ydCBjb250cmlidXRlZCBieSBKZWZmcmV5IEhvbmlnIChqY2hAbWl0Y2hlbGwuY2l0LmNvcm5lbGwuZWR1KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LW9zcGY2LmMsdiAxLjEzIDIwMDMvMTEvMTYgMDk6MzY6MzEgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLSNpbmNsdWRlICJvc3BmNi5oIgotCi1zdHJ1Y3QgYml0cyB7Ci0JdV9pbnQzMl90IGJpdDsKLQljb25zdCBjaGFyICpzdHI7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJpdHMgb3NwZjZfb3B0aW9uX2JpdHNbXSA9IHsKLQl7IE9TUEY2X09QVElPTl9WNiwJIlY2IiB9LAotCXsgT1NQRjZfT1BUSU9OX0UsCSJFIiB9LAotCXsgT1NQRjZfT1BUSU9OX01DLAkiTUMiIH0sCi0JeyBPU1BGNl9PUFRJT05fTiwJIk4iIH0sCi0JeyBPU1BGNl9PUFRJT05fUiwJIlIiIH0sCi0JeyBPU1BGNl9PUFRJT05fREMsCSJEQyIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJpdHMgb3NwZjZfcmxhX2ZsYWdfYml0c1tdID0gewotCXsgUkxBX0ZMQUdfQiwJCSJCIiB9LAotCXsgUkxBX0ZMQUdfRSwJCSJFIiB9LAotCXsgUkxBX0ZMQUdfViwJCSJWIiB9LAotCXsgUkxBX0ZMQUdfVywJCSJXIiB9LAotCXsgMCwJCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYml0cyBvc3BmNl9hc2xhX2ZsYWdfYml0c1tdID0gewotCXsgQVNMQV9GTEFHX0VYVEVSTkFMLAkiRSIgfSwKLQl7IEFTTEFfRkxBR19GV0RBRERSLAkiRiIgfSwKLQl7IEFTTEFfRkxBR19ST1VURVRBRywJIlQiIH0sCi0JeyAwLAkJCU5VTEwgfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgdHlwZTJzdHJbXSA9IHsKLQl7IE9TUEZfVFlQRV9VTUQsCSJ1bWQiIH0sCi0JeyBPU1BGX1RZUEVfSEVMTE8sCSJoZWxsbyIgfSwKLQl7IE9TUEZfVFlQRV9EQiwJCSJkZCIgfSwKLQl7IE9TUEZfVFlQRV9MU1IsCSJsc19yZXEiIH0sCi0JeyBPU1BGX1RZUEVfTFNVLAkibHNfdXBkIiB9LAotCXsgT1NQRl9UWVBFX0xTQSwJImxzX2FjayIgfSwKLQl7IDAsCQkJTlVMTCB9Ci19OwotCi1zdGF0aWMgY2hhciB0c3RyW10gPSAiIFt8b3NwZl0iOwotCi0jaWZkZWYgV0lOMzIKLSNkZWZpbmUgaW5saW5lIF9faW5saW5lCi0jZW5kaWYgLyogV0lOMzIgKi8KLQotLyogRm9yd2FyZHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBvc3BmNl9wcmludF9zZXFhZ2UodV9pbnQzMl90LCB0aW1lX3QpOwotc3RhdGljIGlubGluZSB2b2lkIG9zcGY2X3ByaW50X2JpdHMoY29uc3Qgc3RydWN0IGJpdHMgKiwgdV9jaGFyKTsKLXN0YXRpYyB2b2lkIG9zcGY2X3ByaW50X2xzX3R5cGUodV9pbnQsIGNvbnN0IHJ0cmlkX3QgKiwKLSAgICBjb25zdCBydHJpZF90ICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgaW50IG9zcGY2X3ByaW50X2xzaGRyKGNvbnN0IHN0cnVjdCBsc2FfaGRyICopOwotc3RhdGljIGludCBvc3BmNl9wcmludF9sc2EoY29uc3Qgc3RydWN0IGxzYSAqKTsKLXN0YXRpYyBpbnQgb3NwZjZfZGVjb2RlX3YzKGNvbnN0IHN0cnVjdCBvc3BmNmhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotb3NwZjZfcHJpbnRfc2VxYWdlKHJlZ2lzdGVyIHVfaW50MzJfdCBzZXEsIHJlZ2lzdGVyIHRpbWVfdCB1cykKLXsKLQlyZWdpc3RlciB0aW1lX3Qgc2VjID0gdXMgJSA2MDsKLQlyZWdpc3RlciB0aW1lX3QgbWlucyA9ICh1cyAvIDYwKSAlIDYwOwotCXJlZ2lzdGVyIHRpbWVfdCBob3VyID0gdXMgLyAzNjAwOwotCi0JcHJpbnRmKCIgUyAlWCBhZ2UgIiwgc2VxKTsKLQlpZiAoaG91cikKLQkJcHJpbnRmKCIldTolMDJ1OiUwMnUiLAotCQkgICAgKHVfaW50MzJfdCkgaG91ciwgKHVfaW50MzJfdCkgbWlucywgKHVfaW50MzJfdCkgc2VjKTsKLQllbHNlIGlmIChtaW5zKQotCQlwcmludGYoIiV1OiUwMnUiLCAodV9pbnQzMl90KSBtaW5zLCAodV9pbnQzMl90KSBzZWMpOwotCWVsc2UKLQkJcHJpbnRmKCIldSIsICh1X2ludDMyX3QpIHNlYyk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkCi1vc3BmNl9wcmludF9iaXRzKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBiaXRzICpicCwgcmVnaXN0ZXIgdV9jaGFyIG9wdGlvbnMpCi17Ci0JcmVnaXN0ZXIgY2hhciBzZXAgPSAnICc7Ci0KLQlkbyB7Ci0JCWlmIChvcHRpb25zICYgYnAtPmJpdCkgewotCQkJcHJpbnRmKCIlYyVzIiwgc2VwLCBicC0+c3RyKTsKLQkJCXNlcCA9ICcvJzsKLQkJfQotCX0gd2hpbGUgKCgrK2JwKS0+Yml0KTsKLX0KLQotc3RhdGljIHZvaWQKLW9zcGY2X3ByaW50X2xzX3R5cGUocmVnaXN0ZXIgdV9pbnQgbHNfdHlwZSwKLSAgICByZWdpc3RlciBjb25zdCBydHJpZF90ICpsc19zdGF0ZWlkLAotICAgIHJlZ2lzdGVyIGNvbnN0IHJ0cmlkX3QgKmxzX3JvdXRlciwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10KQotewotCWNvbnN0IGNoYXIgKnNjb3BlOwotCi0Jc3dpdGNoIChsc190eXBlICYgTFNfU0NPUEVfTUFTSykgewotCWNhc2UgTFNfU0NPUEVfTElOS0xPQ0FMOgotCQlzY29wZSA9ICJsaW5rbG9jYWwtIjsKLQkJYnJlYWs7Ci0JY2FzZSBMU19TQ09QRV9BUkVBOgotCQlzY29wZSA9ICJhcmVhLSI7Ci0JCWJyZWFrOwotCWNhc2UgTFNfU0NPUEVfQVM6Ci0JCXNjb3BlID0gIkFTLSI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXNjb3BlID0gIiI7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAobHNfdHlwZSAmIExTX1RZUEVfTUFTSykgewotCWNhc2UgTFNfVFlQRV9ST1VURVI6Ci0JCXByaW50ZigiICVzcnRyICVzIiwgc2NvcGUsIGlwYWRkcl9zdHJpbmcobHNfcm91dGVyKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBMU19UWVBFX05FVFdPUks6Ci0JCXByaW50ZigiICVzbmV0IGRyICVzIGlmICVzIiwgc2NvcGUsCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3JvdXRlciksCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfSU5URVJfQVA6Ci0JCXByaW50ZigiICVzaW50ZXItYXJlYS1wcmVmaXggJXMgYWJyICVzIiwgc2NvcGUsCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAotCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfSU5URVJfQVI6Ci0JCXByaW50ZigiICVzaW50ZXItYXJlYS1yb3V0ZXIgJXMgcnRyICVzIiwgc2NvcGUsCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3JvdXRlciksCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfQVNFOgotCQlwcmludGYoIiAlc2FzZSAlcyBhc2JyICVzIiwgc2NvcGUsCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAotCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfR1JPVVA6Ci0JCXByaW50ZigiICVzZ3JvdXAgJXMgcnRyICVzIiwgc2NvcGUsCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAotCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfVFlQRTc6Ci0JCXByaW50ZigiICVzdHlwZTcgJXMgcnRyICVzIiwgc2NvcGUsCi0JCSAgICBpcGFkZHJfc3RyaW5nKGxzX3N0YXRlaWQpLAotCQkgICAgaXBhZGRyX3N0cmluZyhsc19yb3V0ZXIpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfTElOSzoKLQkJcHJpbnRmKCIgJXNsaW5rICVzIHJ0ciAlcyIsIHNjb3BlLAotCQkgICAgaXBhZGRyX3N0cmluZyhsc19zdGF0ZWlkKSwKLQkJICAgIGlwYWRkcl9zdHJpbmcobHNfcm91dGVyKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBMU19UWVBFX0lOVFJBX0FQOgotCQlwcmludGYoIiAlc2ludHJhLWFyZWEtcHJlZml4ICVzIHJ0ciAlcyIsIHNjb3BlLAotCQkgICAgaXBhZGRyX3N0cmluZyhsc19zdGF0ZWlkKSwKLQkJICAgIGlwYWRkcl9zdHJpbmcobHNfcm91dGVyKSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCIgJXMiLCBzY29wZSk7Ci0JCXByaW50ZihmbXQsIGxzX3R5cGUpOwotCQlicmVhazsKLQl9Ci0KLX0KLQotc3RhdGljIGludAotb3NwZjZfcHJpbnRfbHNoZHIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYV9oZHIgKmxzaHApCi17Ci0KLQlUQ0hFQ0sobHNocC0+bHNfdHlwZSk7Ci0JcHJpbnRmKCIgeyIpOwkJCQkJCS8qIH0gKGN0YWdzKSAqLwotCi0JVENIRUNLKGxzaHAtPmxzX3NlcSk7Ci0Jb3NwZjZfcHJpbnRfc2VxYWdlKEVYVFJBQ1RfMzJCSVRTKCZsc2hwLT5sc19zZXEpLCBFWFRSQUNUXzE2QklUUygmbHNocC0+bHNfYWdlKSk7Ci0Jb3NwZjZfcHJpbnRfbHNfdHlwZShFWFRSQUNUXzE2QklUUygmbHNocC0+bHNfdHlwZSksICZsc2hwLT5sc19zdGF0ZWlkLAotCQkmbHNocC0+bHNfcm91dGVyLCAibHNfdHlwZSAlZCIpOwotCi0JcmV0dXJuICgwKTsKLXRydW5jOgotCXJldHVybiAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW9zcGY2X3ByaW50X2xzYXByZWZpeChyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbHNhX3ByZWZpeCAqbHNhcHApCi17Ci0JdV9pbnQgazsKLQlzdHJ1Y3QgaW42X2FkZHIgcHJlZml4OwotCi0JVENIRUNLKCpsc2FwcCk7Ci0JayA9IChsc2FwcC0+bHNhX3BfbGVuICsgMzEpIC8gMzI7Ci0JaWYgKGsgKiA0ID4gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKLQkJcHJpbnRmKCI/P3ByZWZpeGxlbiAlZD8/IiwgbHNhcHAtPmxzYV9wX2xlbik7Ci0JCWdvdG8gdHJ1bmM7Ci0JfQotCW1lbXNldCgmcHJlZml4LCAwLCBzaXplb2YocHJlZml4KSk7Ci0JbWVtY3B5KCZwcmVmaXgsIGxzYXBwLT5sc2FfcF9wcmVmaXgsIGsgKiA0KTsKLQlwcmludGYoIiAlcy8lZCIsIGlwNmFkZHJfc3RyaW5nKCZwcmVmaXgpLAotCQlsc2FwcC0+bHNhX3BfbGVuKTsKLQlpZiAobHNhcHAtPmxzYV9wX29wdCkKLQkJcHJpbnRmKCIob3B0PSV4KSIsIGxzYXBwLT5sc2FfcF9vcHQpOwotCWlmIChsc2FwcC0+bHNhX3BfbWJ6KQotCQlwcmludGYoIihtYno9JXgpIiwgRVhUUkFDVF8xNkJJVFMoJmxzYXBwLT5sc2FfcF9tYnopKTsgLyogWFhYICovCi0JcmV0dXJuIHNpemVvZigqbHNhcHApIC0gNCArIGsgKiA0OwotCi10cnVuYzoKLQlyZXR1cm4gLTE7Ci19Ci0KLQotLyoKLSAqIFByaW50IGEgc2luZ2xlIGxpbmsgc3RhdGUgYWR2ZXJ0aXNlbWVudC4gIElmIHRydW5jYXRlZCByZXR1cm4gMSwgZWxzZSAwLgotICovCi1zdGF0aWMgaW50Ci1vc3BmNl9wcmludF9sc2EocmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYSAqbHNhcCkKLXsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmxzX2VuZCwgKmxzX29wdDsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmxhbGluayAqcmxwOwotI2lmIDAKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9zX21ldHJpYyAqdG9zcDsKLSNlbmRpZgotCXJlZ2lzdGVyIGNvbnN0IHJ0cmlkX3QgKmFwOwotI2lmIDAKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXNsYW1ldHJpYyAqYWxtcDsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWNsYSAqbWNwOwotI2VuZGlmCi0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxsc2EgKmxsc2FwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc2FfcHJlZml4ICpsc2FwcDsKLSNpZiAwCi0JcmVnaXN0ZXIgY29uc3QgdV9pbnQzMl90ICpscDsKLSNlbmRpZgotCXJlZ2lzdGVyIHVfaW50IGo7Ci0JcmVnaXN0ZXIgaW50IGs7Ci0JdV9pbnQzMl90IGZsYWdzMzI7Ci0KLQlpZiAob3NwZjZfcHJpbnRfbHNoZHIoJmxzYXAtPmxzX2hkcikpCi0JCXJldHVybiAoMSk7Ci0JVENIRUNLKGxzYXAtPmxzX2hkci5sc19sZW5ndGgpOwotCWxzX2VuZCA9ICh1X2NoYXIgKilsc2FwICsgRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzX2hkci5sc19sZW5ndGgpOwotCXN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzX2hkci5sc190eXBlKSkgewotCWNhc2UgTFNfVFlQRV9ST1VURVIgfCBMU19TQ09QRV9BUkVBOgotCQlUQ0hFQ0sobHNhcC0+bHNhX3VuLnVuX3JsYS5ybGFfZmxhZ3MpOwotCQlvc3BmNl9wcmludF9iaXRzKG9zcGY2X3JsYV9mbGFnX2JpdHMsCi0JCQlsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9mbGFncyk7Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9vcHRpb25zKTsKLQkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywKLQkJCUVYVFJBQ1RfMzJCSVRTKCZsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9vcHRpb25zKSk7Ci0KLQkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9ybGEucmxhX2xpbmspOwotCQlybHAgPSBsc2FwLT5sc2FfdW4udW5fcmxhLnJsYV9saW5rOwotCQl3aGlsZSAocmxwICsgc2l6ZW9mKCpybHApIDw9IChzdHJ1Y3QgcmxhbGluayAqKWxzX2VuZCkgewotCQkJVENIRUNLKCpybHApOwotCQkJcHJpbnRmKCIgeyIpOwkJCQkvKiB9IChjdGFncykgKi8KLQkJCXN3aXRjaCAocmxwLT5saW5rX3R5cGUpIHsKLQotCQkJY2FzZSBSTEFfVFlQRV9WSVJUVUFMOgotCQkJCXByaW50ZigiIHZpcnQiKTsKLQkJCQkvKiBGYWxsIHRocm91Z2ggKi8KLQotCQkJY2FzZSBSTEFfVFlQRV9ST1VURVI6Ci0JCQkJcHJpbnRmKCIgbmJyaWQgJXMgbmJyaWYgJXMgaWYgJXMiLAotCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfbnJ0aWQpLAotCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfbmlmaWQpLAotCQkJCSAgICBpcGFkZHJfc3RyaW5nKCZybHAtPmxpbmtfaWZpZCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJMQV9UWVBFX1RSQU5TSVQ6Ci0JCQkJcHJpbnRmKCIgZHIgJXMgZHJpZiAlcyBpZiAlcyIsCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19ucnRpZCksCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19uaWZpZCksCi0JCQkJICAgIGlwYWRkcl9zdHJpbmcoJnJscC0+bGlua19pZmlkKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJCQkJCS8qIHsgKGN0YWdzKSAqLwotCQkJCXByaW50ZigiID8/Um91dGVyTGlua3NUeXBlIDB4JTAyeD8/IH0iLAotCQkJCSAgICBybHAtPmxpbmtfdHlwZSk7Ci0JCQkJcmV0dXJuICgwKTsKLQkJCX0KLQkJCXByaW50ZigiIG1ldHJpYyAlZCIsIEVYVFJBQ1RfMTZCSVRTKCZybHAtPmxpbmtfbWV0cmljKSk7Ci0JCQkJCQkJCS8qIHsgKGN0YWdzKSAqLwotCQkJcHJpbnRmKCIgfSIpOwotCQkJcmxwKys7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfTkVUV09SSyB8IExTX1NDT1BFX0FSRUE6Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9vcHRpb25zKTsKLQkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywKLQkJCUVYVFJBQ1RfMzJCSVRTKCZsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9vcHRpb25zKSk7Ci0JCXByaW50ZigiIHJ0cnMiKTsKLQkJYXAgPSBsc2FwLT5sc2FfdW4udW5fbmxhLm5sYV9yb3V0ZXI7Ci0JCXdoaWxlICgodV9jaGFyICopYXAgPCBsc19lbmQpIHsKLQkJCVRDSEVDSygqYXApOwotCQkJcHJpbnRmKCIgJXMiLCBpcGFkZHJfc3RyaW5nKGFwKSk7Ci0JCQkrK2FwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBMU19UWVBFX0lOVEVSX0FQIHwgTFNfU0NPUEVfQVJFQToKLQkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9pbnRlcl9hcC5pbnRlcl9hcF9tZXRyaWMpOwotCQlwcmludGYoIiBtZXRyaWMgJXUiLAotCQkJRVhUUkFDVF8zMkJJVFMoJmxzYXAtPmxzYV91bi51bl9pbnRlcl9hcC5pbnRlcl9hcF9tZXRyaWMpICYgU0xBX01BU0tfTUVUUklDKTsKLQkJbHNhcHAgPSBsc2FwLT5sc2FfdW4udW5faW50ZXJfYXAuaW50ZXJfYXBfcHJlZml4OwotCQl3aGlsZSAobHNhcHAgKyBzaXplb2YobHNhcHApIDw9IChzdHJ1Y3QgbHNhX3ByZWZpeCAqKWxzX2VuZCkgewotCQkJayA9IG9zcGY2X3ByaW50X2xzYXByZWZpeChsc2FwcCk7Ci0JCQlpZiAoaykKLQkJCQlnb3RvIHRydW5jOwotCQkJbHNhcHAgPSAoc3RydWN0IGxzYV9wcmVmaXggKikoKCh1X2NoYXIgKilsc2FwcCkgKyBrKTsKLQkJfQotCQlicmVhazsKLQljYXNlIExTX1NDT1BFX0FTIHwgTFNfVFlQRV9BU0U6Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fYXNsYS5hc2xhX21ldHJpYyk7Ci0JCWZsYWdzMzIgPSBFWFRSQUNUXzMyQklUUygmbHNhcC0+bHNhX3VuLnVuX2FzbGEuYXNsYV9tZXRyaWMpOwotCQlvc3BmNl9wcmludF9iaXRzKG9zcGY2X2FzbGFfZmxhZ19iaXRzLCBmbGFnczMyKTsKLQkJcHJpbnRmKCIgbWV0cmljICV1IiwKLQkJICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZsc2FwLT5sc2FfdW4udW5fYXNsYS5hc2xhX21ldHJpYykgJgotCQkgICAgICAgQVNMQV9NQVNLX01FVFJJQyk7Ci0JCWxzYXBwID0gbHNhcC0+bHNhX3VuLnVuX2FzbGEuYXNsYV9wcmVmaXg7Ci0JCWsgPSBvc3BmNl9wcmludF9sc2FwcmVmaXgobHNhcHApOwotCQlpZiAoayA8IDApCi0JCQlnb3RvIHRydW5jOwotCQlpZiAoKGxzX29wdCA9ICh1X2NoYXIgKikoKCh1X2NoYXIgKilsc2FwcCkgKyBrKSkgPCBsc19lbmQpIHsKLQkJCXN0cnVjdCBpbjZfYWRkciAqZndkYWRkcjY7Ci0KLQkJCWlmICgoZmxhZ3MzMiAmIEFTTEFfRkxBR19GV0RBRERSKSAhPSAwKSB7Ci0JCQkJZndkYWRkcjYgPSAoc3RydWN0IGluNl9hZGRyICopbHNfb3B0OwotCQkJCVRDSEVDSygqZndkYWRkcjYpOwotCQkJCXByaW50ZigiIGZvcndhcmQgJXMiLAotCQkJCSAgICAgICBpcDZhZGRyX3N0cmluZyhmd2RhZGRyNikpOwotCi0JCQkJbHNfb3B0ICs9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwotCQkJfQotCi0JCQlpZiAoKGZsYWdzMzIgJiBBU0xBX0ZMQUdfUk9VVEVUQUcpICE9IDApIHsKLQkJCQlUQ0hFQ0soKih1X2ludDMyX3QgKilsc19vcHQpOwotCQkJCXByaW50ZigiIHRhZyAlcyIsCi0JCQkJICAgICAgIGlwYWRkcl9zdHJpbmcoKHVfaW50MzJfdCAqKWxzX29wdCkpOwotCi0JCQkJbHNfb3B0ICs9IHNpemVvZih1X2ludDMyX3QpOwotCQkJfQotCi0JCQlpZiAobHNhcHAtPmxzYV9wX21ieikgewotCQkJCVRDSEVDSygqKHVfaW50MzJfdCAqKWxzX29wdCk7Ci0JCQkJcHJpbnRmKCIgUmVmTFNJRDogJXMiLAotCQkJCSAgICAgICBpcGFkZHJfc3RyaW5nKCh1X2ludDMyX3QgKilsc19vcHQpKTsKLQotCQkJCWxzX29wdCArPSBzaXplb2YodV9pbnQzMl90KTsKLQkJCX0KLQkJfQotCQlicmVhazsKLSNpZiAwCi0JY2FzZSBMU19UWVBFX1NVTV9BQlI6Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5fc2xhLnNsYV90b3NtZXRyaWMpOwotCQlscCA9IGxzYXAtPmxzYV91bi51bl9zbGEuc2xhX3Rvc21ldHJpYzsKLQkJd2hpbGUgKCh1X2NoYXIgKilscCA8IGxzX2VuZCkgewotCQkJcmVnaXN0ZXIgdV9pbnQzMl90IHVsOwotCi0JCQlUQ0hFQ0soKmxwKTsKLQkJCXVsID0gRVhUUkFDVF8zMkJJVFMobHApOwotCQkJcHJpbnRmKCIgdG9zICVkIG1ldHJpYyAlZCIsCi0JCQkgICAgKHVsICYgU0xBX01BU0tfVE9TKSA+PiBTTEFfU0hJRlRfVE9TLAotCQkJICAgIHVsICYgU0xBX01BU0tfTUVUUklDKTsKLQkJCSsrbHA7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfR1JPVVA6Ci0JCS8qIE11bHRpY2FzdCBleHRlbnNpb25zIGFzIG9mIDIzIEp1bHkgMTk5MSAqLwotCQltY3AgPSBsc2FwLT5sc2FfdW4udW5fbWNsYTsKLQkJd2hpbGUgKCh1X2NoYXIgKiltY3AgPCBsc19lbmQpIHsKLQkJCVRDSEVDSyhtY3AtPm1jbGFfdmlkKTsKLQkJCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoJm1jcC0+bWNsYV92dHlwZSkpIHsKLQotCQkJY2FzZSBNQ0xBX1ZFUlRFWF9ST1VURVI6Ci0JCQkJcHJpbnRmKCIgcnRyIHJ0cmlkICVzIiwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmbWNwLT5tY2xhX3ZpZCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIE1DTEFfVkVSVEVYX05FVFdPUks6Ci0JCQkJcHJpbnRmKCIgbmV0IGRyICVzIiwKLQkJCQkgICAgaXBhZGRyX3N0cmluZygmbWNwLT5tY2xhX3ZpZCkpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiID8/VmVydGV4VHlwZSAldT8/IiwKLQkJCQkgICAgRVhUUkFDVF8zMkJJVFMoJm1jcC0+bWNsYV92dHlwZSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkrK21jcDsKLQkJfQotI2VuZGlmCi0KLQljYXNlIExTX1RZUEVfTElOSzoKLQkJLyogTGluayBMU0EgKi8KLQkJbGxzYXAgPSAmbHNhcC0+bHNhX3VuLnVuX2xsc2E7Ci0JCVRDSEVDSyhsbHNhcC0+bGxzYV9vcHRpb25zKTsKLQkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywgRVhUUkFDVF8zMkJJVFMoJmxsc2FwLT5sbHNhX29wdGlvbnMpKTsKLQkJVENIRUNLKGxsc2FwLT5sbHNhX25wcmVmaXgpOwotCQlwcmludGYoIiBwcmkgJWQgbGxhZGRyICVzIG5wcmVmICVkIiwgbGxzYXAtPmxsc2FfcHJpb3JpdHksCi0JCQlpcDZhZGRyX3N0cmluZygmbGxzYXAtPmxsc2FfbGxhZGRyKSwKLQkJCUVYVFJBQ1RfMzJCSVRTKCZsbHNhcC0+bGxzYV9ucHJlZml4KSk7Ci0JCWxzYXBwID0gbGxzYXAtPmxsc2FfcHJlZml4OwotCQlmb3IgKGogPSAwOyBqIDwgRVhUUkFDVF8zMkJJVFMoJmxsc2FwLT5sbHNhX25wcmVmaXgpOyBqKyspIHsKLQkJCWsgPSBvc3BmNl9wcmludF9sc2FwcmVmaXgobHNhcHApOwotCQkJaWYgKGspCi0JCQkJZ290byB0cnVuYzsKLQkJCWxzYXBwID0gKHN0cnVjdCBsc2FfcHJlZml4ICopKCgodV9jaGFyICopbHNhcHApICsgayk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIExTX1RZUEVfSU5UUkFfQVAgfCBMU19TQ09QRV9BUkVBOgotCQkvKiBJbnRyYS1BcmVhLVByZWZpeCBMU0EgKi8KLQkJVENIRUNLKGxzYXAtPmxzYV91bi51bl9pbnRyYV9hcC5pbnRyYV9hcF9ydGlkKTsKLQkJb3NwZjZfcHJpbnRfbHNfdHlwZSgKLQkJCUVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbHN0eXBlKSwKLQkJCSZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbHNpZCwKLQkJCSZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfcnRpZCwKLQkJCSJMaW5rU3RhdGVUeXBlICVkIik7Ci0JCVRDSEVDSyhsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbnByZWZpeCk7Ci0JCXByaW50ZigiIG5wcmVmICVkIiwKLQkJCUVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc2FfdW4udW5faW50cmFfYXAuaW50cmFfYXBfbnByZWZpeCkpOwotCi0JCWxzYXBwID0gbHNhcC0+bHNhX3VuLnVuX2ludHJhX2FwLmludHJhX2FwX3ByZWZpeDsKLQkJZm9yIChqID0gMDsKLQkJICAgICBqIDwgRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzYV91bi51bl9pbnRyYV9hcC5pbnRyYV9hcF9ucHJlZml4KTsKLQkJICAgICBqKyspIHsKLQkJCWsgPSBvc3BmNl9wcmludF9sc2FwcmVmaXgobHNhcHApOwotCQkJaWYgKGspCi0JCQkJZ290byB0cnVuYzsKLQkJCWxzYXBwID0gKHN0cnVjdCBsc2FfcHJlZml4ICopKCgodV9jaGFyICopbHNhcHApICsgayk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGYoIiA/P0xpbmtTdGF0ZVR5cGUgMHglMDR4Pz8iLAotCQkJRVhUUkFDVF8xNkJJVFMoJmxzYXAtPmxzX2hkci5sc190eXBlKSk7Ci0JfQotCi0JCQkJCQkJCS8qIHsgKGN0YWdzKSAqLwotCWZwdXRzKCIgfSIsIHN0ZG91dCk7Ci0JcmV0dXJuICgwKTsKLXRydW5jOgotCWZwdXRzKCIgfSIsIHN0ZG91dCk7Ci0JcmV0dXJuICgxKTsKLX0KLQotc3RhdGljIGludAotb3NwZjZfZGVjb2RlX3YzKHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBvc3BmNmhkciAqb3AsCi0gICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpkYXRhZW5kKQotewotCXJlZ2lzdGVyIGNvbnN0IHJ0cmlkX3QgKmFwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBsc3IgKmxzcnA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYV9oZHIgKmxzaHA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGxzYSAqbHNhcDsKLQlyZWdpc3RlciBjaGFyIHNlcDsKLQlyZWdpc3RlciBpbnQgaTsKLQotCXN3aXRjaCAob3AtPm9zcGY2X3R5cGUpIHsKLQotCWNhc2UgT1NQRl9UWVBFX1VNRDoKLQkJLyoKLQkJICogUm9iIENvbHR1bidzIHNwZWNpYWwgbW9uaXRvcmluZyBwYWNrZXRzOwotCQkgKiBkbyBub3RoaW5nCi0JCSAqLwotCQlicmVhazsKLQotCWNhc2UgT1NQRl9UWVBFX0hFTExPOgotCQlpZiAodmZsYWcpIHsKLQkJCVRDSEVDSyhvcC0+b3NwZjZfaGVsbG8uaGVsbG9fZGVhZGludCk7Ci0JCQlvc3BmNl9wcmludF9iaXRzKG9zcGY2X29wdGlvbl9iaXRzLAotCQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZvcC0+b3NwZjZfaGVsbG8uaGVsbG9fb3B0aW9ucykpOwotCQkJcHJpbnRmKCIgaWZpZCAlcyBwcmkgJWQgaW50ICVkIGRlYWQgJXUiLAotCQkJICAgIGlwYWRkcl9zdHJpbmcoJm9wLT5vc3BmNl9oZWxsby5oZWxsb19pZmlkKSwKLQkJCSAgICBvcC0+b3NwZjZfaGVsbG8uaGVsbG9fcHJpb3JpdHksCi0JCQkgICAgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmNl9oZWxsby5oZWxsb19oZWxsb2ludCksCi0JCQkgICAgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmNl9oZWxsby5oZWxsb19kZWFkaW50KSk7Ci0JCX0KLQkJVENIRUNLKG9wLT5vc3BmNl9oZWxsby5oZWxsb19kcik7Ci0JCWlmIChvcC0+b3NwZjZfaGVsbG8uaGVsbG9fZHIgIT0gMCkKLQkJCXByaW50ZigiIGRyICVzIiwKLQkJCSAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZjZfaGVsbG8uaGVsbG9fZHIpKTsKLQkJVENIRUNLKG9wLT5vc3BmNl9oZWxsby5oZWxsb19iZHIpOwotCQlpZiAob3AtPm9zcGY2X2hlbGxvLmhlbGxvX2JkciAhPSAwKQotCQkJcHJpbnRmKCIgYmRyICVzIiwKLQkJCSAgICBpcGFkZHJfc3RyaW5nKCZvcC0+b3NwZjZfaGVsbG8uaGVsbG9fYmRyKSk7Ci0JCWlmICh2ZmxhZykgewotCQkJcHJpbnRmKCIgbmJycyIpOwotCQkJYXAgPSBvcC0+b3NwZjZfaGVsbG8uaGVsbG9fbmVpZ2hib3I7Ci0JCQl3aGlsZSAoKHVfY2hhciAqKWFwIDwgZGF0YWVuZCkgewotCQkJCVRDSEVDSygqYXApOwotCQkJCXByaW50ZigiICVzIiwgaXBhZGRyX3N0cmluZyhhcCkpOwotCQkJCSsrYXA7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7CS8qIEhFTExPICovCi0KLQljYXNlIE9TUEZfVFlQRV9EQjoKLQkJVENIRUNLKG9wLT5vc3BmNl9kYi5kYl9vcHRpb25zKTsKLQkJb3NwZjZfcHJpbnRfYml0cyhvc3BmNl9vcHRpb25fYml0cywKLQkJCUVYVFJBQ1RfMzJCSVRTKCZvcC0+b3NwZjZfZGIuZGJfb3B0aW9ucykpOwotCQlzZXAgPSAnICc7Ci0JCVRDSEVDSyhvcC0+b3NwZjZfZGIuZGJfZmxhZ3MpOwotCQlpZiAob3AtPm9zcGY2X2RiLmRiX2ZsYWdzICYgT1NQRjZfREJfSU5JVCkgewotCQkJcHJpbnRmKCIlY0kiLCBzZXApOwotCQkJc2VwID0gJy8nOwotCQl9Ci0JCWlmIChvcC0+b3NwZjZfZGIuZGJfZmxhZ3MgJiBPU1BGNl9EQl9NT1JFKSB7Ci0JCQlwcmludGYoIiVjTSIsIHNlcCk7Ci0JCQlzZXAgPSAnLyc7Ci0JCX0KLQkJaWYgKG9wLT5vc3BmNl9kYi5kYl9mbGFncyAmIE9TUEY2X0RCX01BU1RFUikgewotCQkJcHJpbnRmKCIlY01TIiwgc2VwKTsKLQkJCXNlcCA9ICcvJzsKLQkJfQotCQlUQ0hFQ0sob3AtPm9zcGY2X2RiLmRiX3NlcSk7Ci0JCXByaW50ZigiIG10dSAldSBTICVYIiwgRVhUUkFDVF8xNkJJVFMoJm9wLT5vc3BmNl9kYi5kYl9tdHUpLAotCQkJRVhUUkFDVF8zMkJJVFMoJm9wLT5vc3BmNl9kYi5kYl9zZXEpKTsKLQotCQlpZiAodmZsYWcpIHsKLQkJCS8qIFByaW50IGFsbCB0aGUgTFMgYWR2J3MgKi8KLQkJCWxzaHAgPSBvcC0+b3NwZjZfZGIuZGJfbHNoZHI7Ci0KLQkJCXdoaWxlICghb3NwZjZfcHJpbnRfbHNoZHIobHNocCkpIHsKLQkJCQkJCQkvKiB7IChjdGFncykgKi8KLQkJCQlwcmludGYoIiB9Iik7Ci0JCQkJKytsc2hwOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBPU1BGX1RZUEVfTFNSOgotCQlpZiAodmZsYWcpIHsKLQkJCWxzcnAgPSBvcC0+b3NwZjZfbHNyOwotCQkJd2hpbGUgKCh1X2NoYXIgKilsc3JwIDwgZGF0YWVuZCkgewotCQkJCVRDSEVDSygqbHNycCk7Ci0JCQkJcHJpbnRmKCIgeyIpOwkJLyogfSAoY3RhZ3MpICovCi0JCQkJb3NwZjZfcHJpbnRfbHNfdHlwZShFWFRSQUNUXzE2QklUUygmbHNycC0+bHNfdHlwZSksCi0JCQkJICAgICZsc3JwLT5sc19zdGF0ZWlkLAotCQkJCSAgICAmbHNycC0+bHNfcm91dGVyLAotCQkJCSAgICAiTGlua1N0YXRlVHlwZSAlZCIpOwotCQkJCQkJCS8qIHsgKGN0YWdzKSAqLwotCQkJCXByaW50ZigiIH0iKTsKLQkJCQkrK2xzcnA7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIE9TUEZfVFlQRV9MU1U6Ci0JCWlmICh2ZmxhZykgewotCQkJbHNhcCA9IG9wLT5vc3BmNl9sc3UubHN1X2xzYTsKLQkJCVRDSEVDSyhvcC0+b3NwZjZfbHN1LmxzdV9jb3VudCk7Ci0JCQlpID0gRVhUUkFDVF8zMkJJVFMoJm9wLT5vc3BmNl9sc3UubHN1X2NvdW50KTsKLQkJCXdoaWxlIChpLS0pIHsKLQkJCQlpZiAob3NwZjZfcHJpbnRfbHNhKGxzYXApKQotCQkJCQlnb3RvIHRydW5jOwotCQkJCWxzYXAgPSAoc3RydWN0IGxzYSAqKSgodV9jaGFyICopbHNhcCArCi0JCQkJICAgIEVYVFJBQ1RfMTZCSVRTKCZsc2FwLT5sc19oZHIubHNfbGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQotCWNhc2UgT1NQRl9UWVBFX0xTQToKLQkJaWYgKHZmbGFnKSB7Ci0JCQlsc2hwID0gb3AtPm9zcGY2X2xzYS5sc2FfbHNoZHI7Ci0KLQkJCXdoaWxlICghb3NwZjZfcHJpbnRfbHNoZHIobHNocCkpIHsKLQkJCQkJCQkvKiB7IChjdGFncykgKi8KLQkJCQlwcmludGYoIiB9Iik7Ci0JCQkJKytsc2hwOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCJ2MyB0eXBlICVkIiwgb3AtPm9zcGY2X3R5cGUpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuICgwKTsKLXRydW5jOgotCXJldHVybiAoMSk7Ci19Ci0KLXZvaWQKLW9zcGY2X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHJlZ2lzdGVyIHVfaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgb3NwZjZoZHIgKm9wOwotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZGF0YWVuZDsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpjcDsKLQotCW9wID0gKHN0cnVjdCBvc3BmNmhkciAqKWJwOwotCi0JLyogSWYgdGhlIHR5cGUgaXMgdmFsaWQgdHJhbnNsYXRlIGl0LCBvciBqdXN0IHByaW50IHRoZSB0eXBlICovCi0JLyogdmFsdWUuICBJZiBpdCdzIG5vdCB2YWxpZCwgc2F5IHNvIGFuZCByZXR1cm4gKi8KLQlUQ0hFQ0sob3AtPm9zcGY2X3R5cGUpOwotCWNwID0gdG9rMnN0cih0eXBlMnN0ciwgInR5cGUlZCIsIG9wLT5vc3BmNl90eXBlKTsKLQlwcmludGYoIk9TUEZ2JWQtJXMgJWQ6Iiwgb3AtPm9zcGY2X3ZlcnNpb24sIGNwLCBsZW5ndGgpOwotCWlmICgqY3AgPT0gJ3QnKQotCQlyZXR1cm47Ci0KLQlUQ0hFQ0sob3AtPm9zcGY2X2xlbik7Ci0JaWYgKGxlbmd0aCAhPSBFWFRSQUNUXzE2QklUUygmb3AtPm9zcGY2X2xlbikpIHsKLQkJcHJpbnRmKCIgW2xlbiAlZF0iLCBFWFRSQUNUXzE2QklUUygmb3AtPm9zcGY2X2xlbikpOwotCQlyZXR1cm47Ci0JfQotCWRhdGFlbmQgPSBicCArIGxlbmd0aDsKLQotCS8qIFByaW50IHRoZSByb3V0ZXJpZCBpZiBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHNvdXJjZSAqLwotCVRDSEVDSyhvcC0+b3NwZjZfcm91dGVyaWQpOwotCXByaW50ZigiIHJ0cmlkICVzIiwgaXBhZGRyX3N0cmluZygmb3AtPm9zcGY2X3JvdXRlcmlkKSk7Ci0KLQlUQ0hFQ0sob3AtPm9zcGY2X2FyZWFpZCk7Ci0JaWYgKG9wLT5vc3BmNl9hcmVhaWQgIT0gMCkKLQkJcHJpbnRmKCIgYXJlYSAlcyIsIGlwYWRkcl9zdHJpbmcoJm9wLT5vc3BmNl9hcmVhaWQpKTsKLQllbHNlCi0JCXByaW50ZigiIGJhY2tib25lIik7Ci0JVENIRUNLKG9wLT5vc3BmNl9pbnN0YW5jZWlkKTsKLQlpZiAob3AtPm9zcGY2X2luc3RhbmNlaWQpCi0JCXByaW50ZigiIGluc3RhbmNlICV1Iiwgb3AtPm9zcGY2X2luc3RhbmNlaWQpOwotCi0JLyogRG8gcmVzdCBhY2NvcmRpbmcgdG8gdmVyc2lvbi4JICovCi0Jc3dpdGNoIChvcC0+b3NwZjZfdmVyc2lvbikgewotCi0JY2FzZSAzOgotCQkvKiBvc3BmIHZlcnNpb24gMyAqLwotCQlpZiAob3NwZjZfZGVjb2RlX3YzKG9wLCBkYXRhZW5kKSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCIgb3NwZiBbdmVyc2lvbiAlZF0iLCBvcC0+b3NwZjZfdmVyc2lvbik7Ci0JCWJyZWFrOwotCX0JCQkvKiBlbmQgc3dpdGNoIG9uIHZlcnNpb24gKi8KLQotCXJldHVybjsKLXRydW5jOgotCWZwdXRzKHRzdHIsIHN0ZG91dCk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1wZmxvZy5jIGIvcHJpbnQtcGZsb2cuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ5YmE0OS4uMDAwMDAwMAotLS0gYS9wcmludC1wZmxvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1wZmxvZy5jLHYgMS4xMy4yLjQgMjAwNy8wOS8xMyAxNzoxODoxMCBnaWFubHVjYSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfTkVUX1BGVkFSX0gKLSNlcnJvciAiTm8gcGYgaGVhZGVycyBhdmFpbGFibGUiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmbmRlZiBXSU4zMgotI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPG5ldC9pZi5oPgotI2luY2x1ZGUgPG5ldC9wZnZhci5oPgotI2luY2x1ZGUgPG5ldC9pZl9wZmxvZy5oPgotCi0KLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHBjYXAuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLQotc3RhdGljIHN0cnVjdCB0b2sgcGZfcmVhc29uc1tdID0gewotCXsgMCwJIjAobWF0Y2gpIiB9LAotCXsgMSwJIjEoYmFkLW9mZnNldCkiIH0sCi0JeyAyLAkiMihmcmFnbWVudCkiIH0sCi0JeyAzLAkiMyhzaG9ydCkiIH0sCi0JeyA0LAkiNChub3JtYWxpemUpIiB9LAotCXsgNSwJIjUobWVtb3J5KSIgfSwKLQl7IDYsCSI2KGJhZC10aW1lc3RhbXApIiB9LAotCXsgNywJIjcoY29uZ2VzdGlvbikiIH0sCi0JeyA4LAkiOChpcC1vcHRpb24pIiB9LAotCXsgOSwJIjkocHJvdG8tY2tzdW0pIiB9LAotCXsgMTAsCSIxMChzdGF0ZS1taXNtYXRjaCkiIH0sCi0JeyAxMSwJIjExKHN0YXRlLWluc2VydCkiIH0sCi0JeyAxMiwJIjEyKHN0YXRlLWxpbWl0KSIgfSwKLQl7IDEzLAkiMTMoc3JjLWxpbWl0KSIgfSwKLQl7IDE0LAkiMTQoc3lucHJveHkpIiB9LAotCXsgMCwJTlVMTCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHRvayBwZl9hY3Rpb25zW10gPSB7Ci0JeyBQRl9QQVNTLAkJInBhc3MiIH0sCi0JeyBQRl9EUk9QLAkJImJsb2NrIiB9LAotCXsgUEZfU0NSVUIsCQkic2NydWIiIH0sCi0JeyBQRl9OQVQsCQkibmF0IiB9LAotCXsgUEZfTk9OQVQsCQkibmF0IiB9LAotCXsgUEZfQklOQVQsCQkiYmluYXQiIH0sCi0JeyBQRl9OT0JJTkFULAkJImJpbmF0IiB9LAotCXsgUEZfUkRSLAkJInJkciIgfSwKLQl7IFBGX05PUkRSLAkJInJkciIgfSwKLQl7IFBGX1NZTlBST1hZX0RST1AsCSJzeW5wcm94eS1kcm9wIiB9LAotCXsgMCwJCQlOVUxMIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHBmX2RpcmVjdGlvbnNbXSA9IHsKLQl7IFBGX0lOT1VULAkiaW4vb3V0IiB9LAotCXsgUEZfSU4sCSJpbiIgfSwKLQl7IFBGX09VVCwJIm91dCIgfSwKLQl7IDAsCQlOVUxMIH0KLX07Ci0KLS8qIEZvciByZWFkaW5nIGNhcHR1cmUgZmlsZXMgb24gb3RoZXIgc3lzdGVtcyAqLwotI2RlZmluZQlPUEVOQlNEX0FGX0lORVQJCTIKLSNkZWZpbmUJT1BFTkJTRF9BRl9JTkVUNgkyNAotCi1zdGF0aWMgdm9pZAotcGZsb2dfcHJpbnQoY29uc3Qgc3RydWN0IHBmbG9naGRyICpoZHIpCi17Ci0JdV9pbnQzMl90IHJ1bGVuciwgc3VicnVsZW5yOwotCi0JcnVsZW5yID0gbnRvaGwoaGRyLT5ydWxlbnIpOwotCXN1YnJ1bGVuciA9IG50b2hsKGhkci0+c3VicnVsZW5yKTsKLQlpZiAoc3VicnVsZW5yID09ICh1X2ludDMyX3QpLTEpCi0JCXByaW50ZigicnVsZSAldS8iLCBydWxlbnIpOwotCWVsc2UKLQkJcHJpbnRmKCJydWxlICV1LiVzLiV1LyIsIHJ1bGVuciwgaGRyLT5ydWxlc2V0LCBzdWJydWxlbnIpOwotCi0JcHJpbnRmKCIlczogJXMgJXMgb24gJXM6ICIsCi0JICAgIHRvazJzdHIocGZfcmVhc29ucywgInVua24oJXUpIiwgaGRyLT5yZWFzb24pLAotCSAgICB0b2syc3RyKHBmX2FjdGlvbnMsICJ1bmtuKCV1KSIsIGhkci0+YWN0aW9uKSwKLQkgICAgdG9rMnN0cihwZl9kaXJlY3Rpb25zLCAidW5rbigldSkiLCBoZHItPmRpciksCi0JICAgIGhkci0+aWZuYW1lKTsKLX0KLQotdV9pbnQKLXBmbG9nX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotCXVfaW50IGxlbmd0aCA9IGgtPmxlbjsKLQl1X2ludCBoZHJsZW47Ci0JdV9pbnQgY2FwbGVuID0gaC0+Y2FwbGVuOwotCWNvbnN0IHN0cnVjdCBwZmxvZ2hkciAqaGRyOwotCXVfaW50OF90IGFmOwotCi0JLyogY2hlY2sgbGVuZ3RoICovCi0JaWYgKGNhcGxlbiA8IHNpemVvZih1X2ludDhfdCkpIHsKLQkJcHJpbnRmKCJbfHBmbG9nXSIpOwotCQlyZXR1cm4gKGNhcGxlbik7Ci0JfQotCi0jZGVmaW5lIE1JTl9QRkxPR19IRFJMRU4JNDUKLQloZHIgPSAoc3RydWN0IHBmbG9naGRyICopcDsKLQlpZiAoaGRyLT5sZW5ndGggPCBNSU5fUEZMT0dfSERSTEVOKSB7Ci0JCXByaW50ZigiW3BmbG9nOiBpbnZhbGlkIGhlYWRlciBsZW5ndGghXSIpOwotCQlyZXR1cm4gKGhkci0+bGVuZ3RoKTsJLyogWFhYOiBub3QgcmVhbGx5ICovCi0JfQotCWhkcmxlbiA9IEJQRl9XT1JEQUxJR04oaGRyLT5sZW5ndGgpOwotCi0JaWYgKGNhcGxlbiA8IGhkcmxlbikgewotCQlwcmludGYoIlt8cGZsb2ddIik7Ci0JCXJldHVybiAoaGRybGVuKTsJLyogWFhYOiB0cnVlPyAqLwotCX0KLQotCS8qIHByaW50IHdoYXQgd2Uga25vdyAqLwotCWhkciA9IChzdHJ1Y3QgcGZsb2doZHIgKilwOwotCVRDSEVDSygqaGRyKTsKLQlpZiAoZWZsYWcpCi0JCXBmbG9nX3ByaW50KGhkcik7Ci0JCi0JLyogc2tpcCB0byB0aGUgcmVhbCBwYWNrZXQgKi8KLQlhZiA9IGhkci0+YWY7Ci0JbGVuZ3RoIC09IGhkcmxlbjsKLQljYXBsZW4gLT0gaGRybGVuOwotCXAgKz0gaGRybGVuOwotCXN3aXRjaCAoYWYpIHsKLQotCQljYXNlIEFGX0lORVQ6Ci0jaWYgT1BFTkJTRF9BRl9JTkVUICE9IEFGX0lORVQKLQkJY2FzZSBPUEVOQlNEX0FGX0lORVQ6CQkvKiBYWFg6IHJlYWQgcGNhcCBmaWxlcyAqLwotI2VuZGlmCi0JCSAgICAgICAgaXBfcHJpbnQoZ25kbywgcCwgbGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0jaWZkZWYgSU5FVDYKLQkJY2FzZSBBRl9JTkVUNjoKLSNpZiBPUEVOQlNEX0FGX0lORVQ2ICE9IEFGX0lORVQ2Ci0JCWNhc2UgT1BFTkJTRF9BRl9JTkVUNjoJCS8qIFhYWDogcmVhZCBwY2FwIGZpbGVzICovCi0jZW5kaWYKLQkJCWlwNl9wcmludChwLCBsZW5ndGgpOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCWRlZmF1bHQ6Ci0JCS8qIGFkZHJlc3MgZmFtaWx5IG5vdCBoYW5kbGVkLCBwcmludCByYXcgcGFja2V0ICovCi0JCWlmICghZWZsYWcpCi0JCQlwZmxvZ19wcmludChoZHIpOwotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7Ci0JfQotCQotCXJldHVybiAoaGRybGVuKTsKLXRydW5jOgotCXByaW50ZigiW3xwZmxvZ10iKTsKLQlyZXR1cm4gKGhkcmxlbik7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1wZ20uYyBiL3ByaW50LXBnbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGFmOTMzLi4wMDAwMDAwCi0tLSBhL3ByaW50LXBnbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBBbmR5IEhlZmZlcm5hbiAoYWhoQGp1bmlwZXIubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXBnbS5jLHYgMS4xLjIuNSAyMDA1LzA2LzA3IDIyOjA2OjE2IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotCi0jaW5jbHVkZSAiaXAuaCIKLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwNi5oIgotI2VuZGlmCi0jaW5jbHVkZSAiaXBwcm90by5oIgotCi0vKgotICogUEdNIGhlYWRlciAoUkZDIDMyMDgpCi0gKi8KLXN0cnVjdCBwZ21faGVhZGVyIHsKLSAgICB1X2ludDE2X3QJcGdtX3Nwb3J0OwotICAgIHVfaW50MTZfdAlwZ21fZHBvcnQ7Ci0gICAgdV9pbnQ4X3QJcGdtX3R5cGU7Ci0gICAgdV9pbnQ4X3QJcGdtX29wdGlvbnM7Ci0gICAgdV9pbnQxNl90CXBnbV9zdW07Ci0gICAgdV9pbnQ4X3QJcGdtX2dzaWRbNl07Ci0gICAgdV9pbnQxNl90CXBnbV9sZW5ndGg7Ci19OwotCi1zdHJ1Y3QgcGdtX3NwbSB7Ci0gICAgdV9pbnQzMl90CXBnbXNfc2VxOwotICAgIHVfaW50MzJfdAlwZ21zX3RyYWlsc2VxOwotICAgIHVfaW50MzJfdAlwZ21zX2xlYWRzZXE7Ci0gICAgdV9pbnQxNl90CXBnbXNfbmxhX2FmaTsKLSAgICB1X2ludDE2X3QJcGdtc19yZXNlcnZlZDsKLSAgICAvKiAuLi4gdV9pbnQ4X3QJcGdtc19ubGFbMF07ICovCi0gICAgLyogLi4uIG9wdGlvbnMgKi8KLX07Ci0KLXN0cnVjdCBwZ21fbmFrIHsKLSAgICB1X2ludDMyX3QJcGdtbl9zZXE7Ci0gICAgdV9pbnQxNl90CXBnbW5fc291cmNlX2FmaTsKLSAgICB1X2ludDE2X3QJcGdtbl9yZXNlcnZlZDsKLSAgICAvKiAuLi4gdV9pbnQ4X3QJcGdtbl9zb3VyY2VbMF07ICovCi0gICAgLyogLi4uIHVfaW50MTZfdAlwZ21uX2dyb3VwX2FmaSAqLwotICAgIC8qIC4uLiB1X2ludDE2X3QJcGdtbl9yZXNlcnZlZDI7ICovCi0gICAgLyogLi4uIHVfaW50OF90CXBnbW5fZ3JvdXBbMF07ICovCi0gICAgLyogLi4uIG9wdGlvbnMgKi8KLX07Ci0KLXN0cnVjdCBwZ21fcG9sbCB7Ci0gICAgdV9pbnQzMl90CXBnbXBfc2VxOwotICAgIHVfaW50MTZfdAlwZ21wX3JvdW5kOwotICAgIHVfaW50MTZfdAlwZ21wX3Jlc2VydmVkOwotICAgIC8qIC4uLiBvcHRpb25zICovCi19OwotCi1zdHJ1Y3QgcGdtX3BvbHIgewotICAgIHVfaW50MzJfdAlwZ21wX3NlcTsKLSAgICB1X2ludDE2X3QJcGdtcF9yb3VuZDsKLSAgICB1X2ludDE2X3QJcGdtcF9zdWJ0eXBlOwotICAgIHVfaW50MTZfdAlwZ21wX25sYV9hZmk7Ci0gICAgdV9pbnQxNl90CXBnbXBfcmVzZXJ2ZWQ7Ci0gICAgLyogLi4uIHVfaW50OF90CXBnbXBfbmxhWzBdOyAqLwotICAgIC8qIC4uLiBvcHRpb25zICovCi19OwotCi1zdHJ1Y3QgcGdtX2RhdGEgewotICAgIHVfaW50MzJfdAlwZ21kX3NlcTsKLSAgICB1X2ludDMyX3QJcGdtZF90cmFpbHNlcTsKLSAgICAvKiAuLi4gb3B0aW9ucyAqLwotfTsKLQotdHlwZWRlZiBlbnVtIF9wZ21fdHlwZSB7Ci0gICAgUEdNX1NQTSA9IDAsCQkvKiBzb3VyY2UgcGF0aCBtZXNzYWdlICovCi0gICAgUEdNX1BPTEwgPSAxLAkJLyogUE9MTCBSZXF1ZXN0ICovCi0gICAgUEdNX1BPTFIgPSAyLAkJLyogUE9MTCBSZXNwb25zZSAqLwotICAgIFBHTV9PREFUQSA9IDQsCQkvKiBvcmlnaW5hbCBkYXRhICovCi0gICAgUEdNX1JEQVRBID0gNSwJCS8qIHJlcGFpciBkYXRhICovCi0gICAgUEdNX05BSyA9IDgsCQkvKiBOQUsgKi8KLSAgICBQR01fTlVMTE5BSyA9IDksCQkvKiBOdWxsIE5BSyAqLwotICAgIFBHTV9OQ0YgPSAxMCwJCS8qIE5BSyBDb25maXJtYXRpb24gKi8KLSAgICBQR01fQUNLID0gMTEsCQkvKiBBQ0sgZm9yIGNvbmdlc3Rpb24gY29udHJvbCAqLwotICAgIFBHTV9TUE1SID0gMTIsCQkvKiBTUE0gcmVxdWVzdCAqLwotICAgIFBHTV9NQVggPSAyNTUKLX0gcGdtX3R5cGU7Ci0KLSNkZWZpbmUgUEdNX09QVF9CSVRfUFJFU0VOVAkweDAxCi0jZGVmaW5lIFBHTV9PUFRfQklUX05FVFdPUksJMHgwMgotI2RlZmluZSBQR01fT1BUX0JJVF9WQVJfUEtUTEVOCTB4NDAKLSNkZWZpbmUgUEdNX09QVF9CSVRfUEFSSVRZCTB4ODAKLQotI2RlZmluZSBQR01fT1BUX0xFTkdUSAkJMHgwMAotI2RlZmluZSBQR01fT1BUX0ZSQUdNRU5UICAgICAgICAweDAxCi0jZGVmaW5lIFBHTV9PUFRfTkFLX0xJU1QgICAgICAgIDB4MDIKLSNkZWZpbmUgUEdNX09QVF9KT0lOICAgICAgICAgICAgMHgwMwotI2RlZmluZSBQR01fT1BUX05BS19CT19JVkwJMHgwNAotI2RlZmluZSBQR01fT1BUX05BS19CT19STkcJMHgwNQotCi0jZGVmaW5lIFBHTV9PUFRfUkVESVJFQ1QgICAgICAgIDB4MDcKLSNkZWZpbmUgUEdNX09QVF9QQVJJVFlfUFJNICAgICAgMHgwOAotI2RlZmluZSBQR01fT1BUX1BBUklUWV9HUlAgICAgICAweDA5Ci0jZGVmaW5lIFBHTV9PUFRfQ1VSUl9UR1NJWkUgICAgIDB4MEEKLSNkZWZpbmUgUEdNX09QVF9OQlJfVU5SRUFDSAkweDBCCi0jZGVmaW5lIFBHTV9PUFRfUEFUSF9OTEEJMHgwQwotCi0jZGVmaW5lIFBHTV9PUFRfU1lOICAgICAgICAgICAgIDB4MEQKLSNkZWZpbmUgUEdNX09QVF9GSU4gICAgICAgICAgICAgMHgwRQotI2RlZmluZSBQR01fT1BUX1JTVCAgICAgICAgICAgICAweDBGCi0jZGVmaW5lIFBHTV9PUFRfQ1IJCTB4MTAKLSNkZWZpbmUgUEdNX09QVF9DUlFTVAkJMHgxMQotICAgICAKLSNkZWZpbmUgUEdNX09QVF9NQVNLCQkweDdmCi0KLSNkZWZpbmUgUEdNX09QVF9FTkQJCTB4ODAgICAgLyogZW5kIG9mIG9wdGlvbnMgbWFya2VyICovCi0KLSNkZWZpbmUgUEdNX01JTl9PUFRfTEVOCQk0Ci0KLSNpZm5kZWYgQUZJX0lQCi0jZGVmaW5lIEFGSV9JUAkJMQotI2RlZmluZSBBRklfSVA2CSAgICAgICAgMgotI2VuZGlmCi0KLXZvaWQKLXBnbV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCi0JICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMikKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcGdtX2hlYWRlciAqcGdtOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXA7Ci0JcmVnaXN0ZXIgY2hhciBjaDsKLQl1X2ludDE2X3Qgc3BvcnQsIGRwb3J0OwotCWludCBhZGRyX3NpemU7Ci0JY29uc3Qgdm9pZCAqbmxhOwotCWludCBubGFfYWY7Ci0jaWZkZWYgSU5FVDYKLQljaGFyIG5sYV9idWZbSU5FVDZfQUREUlNUUkxFTl07Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKLSNlbHNlCi0JY2hhciBubGFfYnVmW0lORVRfQUREUlNUUkxFTl07Ci0jZW5kaWYKLQl1X2ludDhfdCBvcHRfdHlwZSwgb3B0X2xlbiwgZmxhZ3MxLCBmbGFnczI7Ci0JdV9pbnQzMl90IHNlcSwgb3B0c19sZW4sIGxlbiwgb2Zmc2V0OwotCi0JcGdtID0gKHN0cnVjdCBwZ21faGVhZGVyICopYnA7Ci0JaXAgPSAoc3RydWN0IGlwICopYnAyOwotI2lmZGVmIElORVQ2Ci0JaWYgKElQX1YoaXApID09IDYpCi0JCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKLQllbHNlCi0JCWlwNiA9IE5VTEw7Ci0jZWxzZSAvKiBJTkVUNiAqLwotCWlmIChJUF9WKGlwKSA9PSA2KSB7Ci0JCSh2b2lkKXByaW50ZigiQ2FuJ3QgaGFuZGxlIElQdjYiKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZiAvKiBJTkVUNiAqLwotCWNoID0gJ1wwJzsKLQlpZiAoIVRURVNUKHBnbS0+cGdtX2Rwb3J0KSkgewotI2lmZGVmIElORVQ2Ci0JCWlmIChpcDYpIHsKLQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogW3xwZ21dIiwKLQkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfc3JjKSwKLQkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZQotI2VuZGlmIC8qIElORVQ2ICovCi0JCXsKLQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogW3xwZ21dIiwKLQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKLQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlzcG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZwZ20tPnBnbV9zcG9ydCk7Ci0JZHBvcnQgPSBFWFRSQUNUXzE2QklUUygmcGdtLT5wZ21fZHBvcnQpOwotCi0jaWZkZWYgSU5FVDYKLQlpZiAoaXA2KSB7Ci0JCWlmIChpcDYtPmlwNl9ueHQgPT0gSVBQUk9UT19QR00pIHsKLQkJCSh2b2lkKXByaW50ZigiJXMuJXMgPiAlcy4lczogIiwKLQkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfc3JjKSwKLQkJCQl0Y3Bwb3J0X3N0cmluZyhzcG9ydCksCi0JCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X2RzdCksCi0JCQkJdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJfSBlbHNlIHsKLQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKLQkJCQl0Y3Bwb3J0X3N0cmluZyhzcG9ydCksIHRjcHBvcnRfc3RyaW5nKGRwb3J0KSk7Ci0JCX0KLQl9IGVsc2UKLSNlbmRpZiAvKklORVQ2Ki8KLQl7Ci0JCWlmIChpcC0+aXBfcCA9PSBJUFBST1RPX1BHTSkgewotCQkJKHZvaWQpcHJpbnRmKCIlcy4lcyA+ICVzLiVzOiAiLAotCQkJCWlwYWRkcl9zdHJpbmcoJmlwLT5pcF9zcmMpLAotCQkJCXRjcHBvcnRfc3RyaW5nKHNwb3J0KSwKLQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSwKLQkJCQl0Y3Bwb3J0X3N0cmluZyhkcG9ydCkpOwotCQl9IGVsc2UgewotCQkJKHZvaWQpcHJpbnRmKCIlcyA+ICVzOiAiLAotCQkJCXRjcHBvcnRfc3RyaW5nKHNwb3J0KSwgdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJfQotCX0KLQotCVRDSEVDSygqcGdtKTsKLQotICAgICAgICAodm9pZClwcmludGYoIlBHTSwgbGVuZ3RoICV1IiwgcGdtLT5wZ21fbGVuZ3RoKTsKLQotICAgICAgICBpZiAoIXZmbGFnKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChsZW5ndGggPiBwZ20tPnBnbV9sZW5ndGgpCi0gICAgICAgICAgICBsZW5ndGggPSBwZ20tPnBnbV9sZW5ndGg7Ci0KLQkodm9pZClwcmludGYoIiAweCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiLAotCQkgICAgIHBnbS0+cGdtX2dzaWRbMF0sCi0gICAgICAgICAgICAgICAgICAgICBwZ20tPnBnbV9nc2lkWzFdLAotICAgICAgICAgICAgICAgICAgICAgcGdtLT5wZ21fZ3NpZFsyXSwKLQkJICAgICBwZ20tPnBnbV9nc2lkWzNdLAotICAgICAgICAgICAgICAgICAgICAgcGdtLT5wZ21fZ3NpZFs0XSwKLSAgICAgICAgICAgICAgICAgICAgIHBnbS0+cGdtX2dzaWRbNV0pOwotCXN3aXRjaCAocGdtLT5wZ21fdHlwZSkgewotCWNhc2UgUEdNX1NQTTogewotCSAgICBzdHJ1Y3QgcGdtX3NwbSAqc3BtOwotCi0JICAgIHNwbSA9IChzdHJ1Y3QgcGdtX3NwbSAqKShwZ20gKyAxKTsKLQkgICAgVENIRUNLKCpzcG0pOwotCi0JICAgIHN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJnNwbS0+cGdtc19ubGFfYWZpKSkgewotCSAgICBjYXNlIEFGSV9JUDoKLQkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJbmxhX2FmID0gQUZfSU5FVDsKLQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQkgICAgY2FzZSBBRklfSVA2OgotCQlhZGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKLQkJbmxhX2FmID0gQUZfSU5FVDY7Ci0JCWJyZWFrOwotI2VuZGlmCi0JICAgIGRlZmF1bHQ6Ci0JCWdvdG8gdHJ1bmM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJwID0gKHVfY2hhciAqKSAoc3BtICsgMSk7Ci0JICAgIFRDSEVDSzIoKmJwLCBhZGRyX3NpemUpOwotCSAgICBubGEgPSBicDsKLQkgICAgYnAgKz0gYWRkcl9zaXplOwotCi0JICAgIGluZXRfbnRvcChubGFfYWYsIG5sYSwgbmxhX2J1Ziwgc2l6ZW9mKG5sYV9idWYpKTsKLQkgICAgKHZvaWQpcHJpbnRmKCJTUE0gc2VxICV1IHRyYWlsICV1IGxlYWQgJXUgbmxhICVzIiwKLQkJCSBFWFRSQUNUXzMyQklUUygmc3BtLT5wZ21zX3NlcSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnNwbS0+cGdtc190cmFpbHNlcSksCi0JCQkgRVhUUkFDVF8zMkJJVFMoJnNwbS0+cGdtc19sZWFkc2VxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBubGFfYnVmKTsKLQkgICAgYnJlYWs7Ci0JfQotCi0JY2FzZSBQR01fUE9MTDogewotCSAgICBzdHJ1Y3QgcGdtX3BvbGwgKnBvbGw7Ci0KLQkgICAgcG9sbCA9IChzdHJ1Y3QgcGdtX3BvbGwgKikocGdtICsgMSk7Ci0JICAgIFRDSEVDSygqcG9sbCk7Ci0JICAgICh2b2lkKXByaW50ZigiUE9MTCBzZXEgJXUgcm91bmQgJXUiLAotCQkJIEVYVFJBQ1RfMzJCSVRTKCZwb2xsLT5wZ21wX3NlcSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnBvbGwtPnBnbXBfcm91bmQpKTsKLQkgICAgYnAgPSAodV9jaGFyICopIChwb2xsICsgMSk7Ci0JICAgIGJyZWFrOwotCX0KLQljYXNlIFBHTV9QT0xSOiB7Ci0JICAgIHN0cnVjdCBwZ21fcG9sciAqcG9scjsKLQkgICAgdV9pbnQzMl90IGl2bCwgcm5kLCBtYXNrOwotCi0JICAgIHBvbHIgPSAoc3RydWN0IHBnbV9wb2xyICopKHBnbSArIDEpOwotCSAgICBUQ0hFQ0soKnBvbHIpOwotCi0JICAgIHN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoJnBvbHItPnBnbXBfbmxhX2FmaSkpIHsKLQkgICAgY2FzZSBBRklfSVA6Ci0JCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0JCW5sYV9hZiA9IEFGX0lORVQ7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JICAgIGNhc2UgQUZJX0lQNjoKLQkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JCW5sYV9hZiA9IEFGX0lORVQ2OwotCQlicmVhazsKLSNlbmRpZgotCSAgICBkZWZhdWx0OgotCQlnb3RvIHRydW5jOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicCA9ICh1X2NoYXIgKikgKHBvbHIgKyAxKTsKLQkgICAgVENIRUNLMigqYnAsIGFkZHJfc2l6ZSk7Ci0JICAgIG5sYSA9IGJwOwotCSAgICBicCArPSBhZGRyX3NpemU7Ci0KLQkgICAgaW5ldF9udG9wKG5sYV9hZiwgbmxhLCBubGFfYnVmLCBzaXplb2YobmxhX2J1ZikpOwotCi0JICAgIFRDSEVDSzIoKmJwLCBzaXplb2YodV9pbnQzMl90KSk7Ci0JICAgIGl2bCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7Ci0KLQkgICAgVENIRUNLMigqYnAsIHNpemVvZih1X2ludDMyX3QpKTsKLQkgICAgcm5kID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKLQotCSAgICBUQ0hFQ0syKCpicCwgc2l6ZW9mKHVfaW50MzJfdCkpOwotCSAgICBtYXNrID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKLQotCSAgICAodm9pZClwcmludGYoIlBPTFIgc2VxICV1IHJvdW5kICV1IG5sYSAlcyBpdmwgJXUgcm5kIDB4JTA4eCAiCi0JCQkgIm1hc2sgMHglMDh4IiwgRVhUUkFDVF8zMkJJVFMoJnBvbHItPnBnbXBfc2VxKSwKLQkJCSBFWFRSQUNUXzE2QklUUygmcG9sci0+cGdtcF9yb3VuZCksIG5sYV9idWYsIGl2bCwgcm5kLCBtYXNrKTsKLQkgICAgYnJlYWs7Ci0JfQotCWNhc2UgUEdNX09EQVRBOiB7Ci0JICAgIHN0cnVjdCBwZ21fZGF0YSAqb2RhdGE7Ci0KLQkgICAgb2RhdGEgPSAoc3RydWN0IHBnbV9kYXRhICopKHBnbSArIDEpOwotCSAgICBUQ0hFQ0soKm9kYXRhKTsKLQkgICAgKHZvaWQpcHJpbnRmKCJPREFUQSB0cmFpbCAldSBzZXEgJXUiLAotCQkJIEVYVFJBQ1RfMzJCSVRTKCZvZGF0YS0+cGdtZF90cmFpbHNlcSksCi0JCQkgRVhUUkFDVF8zMkJJVFMoJm9kYXRhLT5wZ21kX3NlcSkpOwotCSAgICBicCA9ICh1X2NoYXIgKikgKG9kYXRhICsgMSk7Ci0JICAgIGJyZWFrOwotCX0KLQotCWNhc2UgUEdNX1JEQVRBOiB7Ci0JICAgIHN0cnVjdCBwZ21fZGF0YSAqcmRhdGE7Ci0KLQkgICAgcmRhdGEgPSAoc3RydWN0IHBnbV9kYXRhICopKHBnbSArIDEpOwotCSAgICBUQ0hFQ0soKnJkYXRhKTsKLQkgICAgKHZvaWQpcHJpbnRmKCJSREFUQSB0cmFpbCAldSBzZXEgJXUiLAotCQkJIEVYVFJBQ1RfMzJCSVRTKCZyZGF0YS0+cGdtZF90cmFpbHNlcSksCi0JCQkgRVhUUkFDVF8zMkJJVFMoJnJkYXRhLT5wZ21kX3NlcSkpOwotCSAgICBicCA9ICh1X2NoYXIgKikgKHJkYXRhICsgMSk7Ci0JICAgIGJyZWFrOwotCX0KLQotCWNhc2UgUEdNX05BSzoKLQljYXNlIFBHTV9OVUxMTkFLOgotCWNhc2UgUEdNX05DRjogewotCSAgICBzdHJ1Y3QgcGdtX25hayAqbmFrOwotCSAgICBjb25zdCB2b2lkICpzb3VyY2UsICpncm91cDsKLQkgICAgaW50IHNvdXJjZV9hZiwgZ3JvdXBfYWY7Ci0jaWZkZWYgSU5FVDYKLQkgICAgY2hhciBzb3VyY2VfYnVmW0lORVQ2X0FERFJTVFJMRU5dLCBncm91cF9idWZbSU5FVDZfQUREUlNUUkxFTl07Ci0jZWxzZQotCSAgICBjaGFyIHNvdXJjZV9idWZbSU5FVF9BRERSU1RSTEVOXSwgZ3JvdXBfYnVmW0lORVRfQUREUlNUUkxFTl07Ci0jZW5kaWYKLQotCSAgICBuYWsgPSAoc3RydWN0IHBnbV9uYWsgKikocGdtICsgMSk7Ci0JICAgIFRDSEVDSygqbmFrKTsKLQotCSAgICAvKgotCSAgICAgKiBTa2lwIHBhc3QgdGhlIHNvdXJjZSwgc2F2aW5nIGluZm8gYWxvbmcgdGhlIHdheQotCSAgICAgKiBhbmQgc3RvcHBpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2guCi0JICAgICAqLwotCSAgICBzd2l0Y2ggKEVYVFJBQ1RfMTZCSVRTKCZuYWstPnBnbW5fc291cmNlX2FmaSkpIHsKLQkgICAgY2FzZSBBRklfSVA6Ci0JCWFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0JCXNvdXJjZV9hZiA9IEFGX0lORVQ7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JICAgIGNhc2UgQUZJX0lQNjoKLQkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JCXNvdXJjZV9hZiA9IEFGX0lORVQ2OwotCQlicmVhazsKLSNlbmRpZgotCSAgICBkZWZhdWx0OgotCQlnb3RvIHRydW5jOwotCQlicmVhazsKLQkgICAgfQotCSAgICBicCA9ICh1X2NoYXIgKikgKG5hayArIDEpOwotCSAgICBUQ0hFQ0syKCpicCwgYWRkcl9zaXplKTsKLQkgICAgc291cmNlID0gYnA7Ci0JICAgIGJwICs9IGFkZHJfc2l6ZTsKLQotCSAgICAvKgotCSAgICAgKiBTa2lwIHBhc3QgdGhlIGdyb3VwLCBzYXZpbmcgaW5mbyBhbG9uZyB0aGUgd2F5Ci0JICAgICAqIGFuZCBzdG9wcGluZyBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaC4KLQkgICAgICovCi0JICAgIHN3aXRjaCAoRVhUUkFDVF8xNkJJVFMoYnApKSB7Ci0JICAgIGNhc2UgQUZJX0lQOgotCQlhZGRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwotCQlncm91cF9hZiA9IEFGX0lORVQ7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JICAgIGNhc2UgQUZJX0lQNjoKLQkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JCWdyb3VwX2FmID0gQUZfSU5FVDY7Ci0JCWJyZWFrOwotI2VuZGlmCi0JICAgIGRlZmF1bHQ6Ci0JCWdvdG8gdHJ1bmM7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGJwICs9ICgyICogc2l6ZW9mKHVfaW50MTZfdCkpOwotCSAgICBUQ0hFQ0syKCpicCwgYWRkcl9zaXplKTsKLQkgICAgZ3JvdXAgPSBicDsKLQkgICAgYnAgKz0gYWRkcl9zaXplOwotCi0JICAgIC8qCi0JICAgICAqIE9wdGlvbnMgZGVjb2RpbmcgY2FuIGdvIGhlcmUuCi0JICAgICAqLwotCSAgICBpbmV0X250b3Aoc291cmNlX2FmLCBzb3VyY2UsIHNvdXJjZV9idWYsIHNpemVvZihzb3VyY2VfYnVmKSk7Ci0JICAgIGluZXRfbnRvcChncm91cF9hZiwgZ3JvdXAsIGdyb3VwX2J1Ziwgc2l6ZW9mKGdyb3VwX2J1ZikpOwotCSAgICBzd2l0Y2ggKHBnbS0+cGdtX3R5cGUpIHsKLQkJY2FzZSBQR01fTkFLOgotCQkgICAgKHZvaWQpcHJpbnRmKCJOQUsgIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSBQR01fTlVMTE5BSzoKLQkJICAgICh2b2lkKXByaW50ZigiTk5BSyAiKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIFBHTV9OQ0Y6Ci0JCSAgICAodm9pZClwcmludGYoIk5DRiAiKTsKLQkJICAgIGJyZWFrOwotCQlkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkgICAgfQotCSAgICAodm9pZClwcmludGYoIiglcyAtPiAlcyksIHNlcSAldSIsCi0JCQkgc291cmNlX2J1ZiwgZ3JvdXBfYnVmLCBFWFRSQUNUXzMyQklUUygmbmFrLT5wZ21uX3NlcSkpOwotCSAgICBicmVhazsKLQl9Ci0KLQljYXNlIFBHTV9TUE1SOgotCSAgICAodm9pZClwcmludGYoIlNQTVIiKTsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICAodm9pZClwcmludGYoIlVOS05PV04gdHlwZSAlMHgwMngiLCBwZ20tPnBnbV90eXBlKTsKLQkgICAgYnJlYWs7Ci0KLQl9Ci0JaWYgKHBnbS0+cGdtX29wdGlvbnMgJiBQR01fT1BUX0JJVF9QUkVTRU5UKSB7ICAgICAgCi0KLQkgICAgLyoKLQkgICAgICogbWFrZSBzdXJlIHRoZXJlJ3MgZW5vdWdoIGZvciB0aGUgZmlyc3Qgb3B0aW9uIGhlYWRlcgotCSAgICAgKi8KLQkgICAgaWYgKCFUVEVTVDIoKmJwLCBQR01fTUlOX09QVF9MRU4pKSB7Ci0JCSh2b2lkKXByaW50ZigiW3xPUFRdIik7Ci0JCXJldHVybjsKLQkgICAgfSAKLQotCSAgICAvKgotCSAgICAgKiBUaGF0IG9wdGlvbiBoZWFkZXIgTVVTVCBiZSBhbiBPUFRfTEVOR1RIIG9wdGlvbgotCSAgICAgKiAoc2VlIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2Ygc2VjdGlvbiA5LjEgaW4gUkZDIDMyMDgpLgotCSAgICAgKi8KLQkgICAgb3B0X3R5cGUgPSAqYnArKzsKLQkgICAgaWYgKChvcHRfdHlwZSAmIFBHTV9PUFRfTUFTSykgIT0gUEdNX09QVF9MRU5HVEgpIHsKLQkJKHZvaWQpcHJpbnRmKCJbRmlyc3Qgb3B0aW9uIGJhZCwgc2hvdWxkIGJlIFBHTV9PUFRfTEVOR1RILCBpcyAldV0iLCBvcHRfdHlwZSAmIFBHTV9PUFRfTUFTSyk7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBvcHRfbGVuID0gKmJwKys7Ci0JICAgIGlmIChvcHRfbGVuICE9IDQpIHsKLQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9MRU5HVEggb3B0aW9uLCBsZW5ndGggJXUgIT0gNF0iLCBvcHRfbGVuKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0JICAgIG9wdHNfbGVuID0gRVhUUkFDVF8xNkJJVFMoYnApOwotCSAgICBpZiAob3B0c19sZW4gPCA0KSB7Ci0JCSh2b2lkKXByaW50ZigiW0JhZCB0b3RhbCBvcHRpb24gbGVuZ3RoICV1IDwgNF0iLCBvcHRzX2xlbik7Ci0JCXJldHVybjsKLQkgICAgfQotCSAgICBicCArPSBzaXplb2YodV9pbnQxNl90KTsKLQkgICAgKHZvaWQpcHJpbnRmKCIgT1BUUyBMRU4gJWQiLCBvcHRzX2xlbik7Ci0JICAgIG9wdHNfbGVuIC09IDQ7Ci0KLQkgICAgd2hpbGUgKG9wdHNfbGVuKSB7Ci0JCWlmIChvcHRzX2xlbiA8IFBHTV9NSU5fT1BUX0xFTikgewotCQkgICAgKHZvaWQpcHJpbnRmKCJbVG90YWwgb3B0aW9uIGxlbmd0aCBsZWF2ZXMgbm8gcm9vbSBmb3IgZmluYWwgb3B0aW9uXSIpOwotCQkgICAgcmV0dXJuOwotCQl9Ci0JCW9wdF90eXBlID0gKmJwKys7Ci0JCW9wdF9sZW4gPSAqYnArKzsKLQkJaWYgKG9wdF9sZW4gPCBQR01fTUlOX09QVF9MRU4pIHsKLQkJICAgICh2b2lkKXByaW50ZigiW0JhZCBvcHRpb24sIGxlbmd0aCAldSA8ICV1XSIsIG9wdF9sZW4sCi0JCSAgICAgICAgUEdNX01JTl9PUFRfTEVOKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWlmIChvcHRzX2xlbiA8IG9wdF9sZW4pIHsKLQkJICAgICh2b2lkKXByaW50ZigiW1RvdGFsIG9wdGlvbiBsZW5ndGggbGVhdmVzIG5vIHJvb20gZm9yIGZpbmFsIG9wdGlvbl0iKTsKLQkJICAgIHJldHVybjsKLQkJfQotCQlpZiAoIVRURVNUMigqYnAsIG9wdF9sZW4gLSAyKSkgewotCQkgICAgKHZvaWQpcHJpbnRmKCIgW3xPUFRdIik7Ci0JCSAgICByZXR1cm47Ci0JCX0gCi0KLQkJc3dpdGNoIChvcHRfdHlwZSAmIFBHTV9PUFRfTUFTSykgewotCQljYXNlIFBHTV9PUFRfTEVOR1RIOgotCQkgICAgaWYgKG9wdF9sZW4gIT0gNCkgewotCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9MRU5HVEggb3B0aW9uLCBsZW5ndGggJXUgIT0gNF0iLCBvcHRfbGVuKTsKLQkJCXJldHVybjsKLQkJICAgIH0KLQkJICAgICh2b2lkKXByaW50ZigiIE9QVFMgTEVOIChleHRyYT8pICVkIiwgRVhUUkFDVF8xNkJJVFMoYnApKTsKLQkJICAgIGJwICs9IHNpemVvZih1X2ludDE2X3QpOwotCQkgICAgb3B0c19sZW4gLT0gNDsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9GUkFHTUVOVDoKLQkJICAgIGlmIChvcHRfbGVuICE9IDE2KSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX0ZSQUdNRU5UIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDE2XSIsIG9wdF9sZW4pOwotCQkJcmV0dXJuOwotCQkgICAgfQotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgIHNlcSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOwotCQkgICAgb2Zmc2V0ID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7Ci0JCSAgICBsZW4gPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKLQkJICAgICh2b2lkKXByaW50ZigiIEZSQUcgc2VxICV1IG9mZiAldSBsZW4gJXUiLCBzZXEsIG9mZnNldCwgbGVuKTsKLQkJICAgIG9wdHNfbGVuIC09IDE2OwotCQkgICAgYnJlYWs7Ci0KLQkJY2FzZSBQR01fT1BUX05BS19MSVNUOgotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgIG9wdF9sZW4gLT0gc2l6ZW9mKHVfaW50MzJfdCk7CS8qIG9wdGlvbiBoZWFkZXIgKi8KLQkJICAgICh2b2lkKXByaW50ZigiIE5BSyBMSVNUIik7Ci0JCSAgICB3aGlsZSAob3B0X2xlbikgewotCQkJaWYgKG9wdF9sZW4gPCBzaXplb2YodV9pbnQzMl90KSkgewotCQkJICAgICh2b2lkKXByaW50ZigiW09wdGlvbiBsZW5ndGggbm90IGEgbXVsdGlwbGUgb2YgNF0iKTsKLQkJCSAgICByZXR1cm47Ci0JCQl9Ci0JCQlUQ0hFQ0syKCpicCwgc2l6ZW9mKHVfaW50MzJfdCkpOwotCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhicCkpOwotCQkJYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7Ci0JCQlvcHRfbGVuIC09IHNpemVvZih1X2ludDMyX3QpOwotCQkJb3B0c19sZW4gLT0gc2l6ZW9mKHVfaW50MzJfdCk7Ci0JCSAgICB9Ci0JCSAgICBicmVhazsKLQotCQljYXNlIFBHTV9PUFRfSk9JTjoKLQkJICAgIGlmIChvcHRfbGVuICE9IDgpIHsKLQkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfSk9JTiBvcHRpb24sIGxlbmd0aCAldSAhPSA4XSIsIG9wdF9sZW4pOwotCQkJcmV0dXJuOwotCQkgICAgfQotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgIHNlcSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOwotCQkgICAgKHZvaWQpcHJpbnRmKCIgSk9JTiAldSIsIHNlcSk7Ci0JCSAgICBvcHRzX2xlbiAtPSA4OwotCQkgICAgYnJlYWs7Ci0KLQkJY2FzZSBQR01fT1BUX05BS19CT19JVkw6Ci0JCSAgICBpZiAob3B0X2xlbiAhPSAxMikgewotCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9OQUtfQk9fSVZMIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDEyXSIsIG9wdF9sZW4pOwotCQkJcmV0dXJuOwotCQkgICAgfQotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgIG9mZnNldCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOwotCQkgICAgc2VxID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7Ci0JCSAgICAodm9pZClwcmludGYoIiBCQUNLT0ZGIGl2bCAldSBpdmxzZXEgJXUiLCBvZmZzZXQsIHNlcSk7Ci0JCSAgICBvcHRzX2xlbiAtPSAxMjsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9OQUtfQk9fUk5HOgotCQkgICAgaWYgKG9wdF9sZW4gIT0gMTIpIHsKLQkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfTkFLX0JPX1JORyBvcHRpb24sIGxlbmd0aCAldSAhPSAxMl0iLCBvcHRfbGVuKTsKLQkJCXJldHVybjsKLQkJICAgIH0KLQkJICAgIGZsYWdzMSA9ICpicCsrOwotCQkgICAgZmxhZ3MyID0gKmJwKys7Ci0JCSAgICBvZmZzZXQgPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKLQkJICAgIHNlcSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJICAgIGJwICs9IHNpemVvZih1X2ludDMyX3QpOwotCQkgICAgKHZvaWQpcHJpbnRmKCIgQkFDS09GRiBtYXggJXUgbWluICV1Iiwgb2Zmc2V0LCBzZXEpOwotCQkgICAgb3B0c19sZW4gLT0gMTI7Ci0JCSAgICBicmVhazsKLQotCQljYXNlIFBHTV9PUFRfUkVESVJFQ1Q6Ci0JCSAgICBmbGFnczEgPSAqYnArKzsKLQkJICAgIGZsYWdzMiA9ICpicCsrOwotCQkgICAgc3dpdGNoIChFWFRSQUNUXzE2QklUUyhicCkpIHsKLQkJICAgIGNhc2UgQUZJX0lQOgotCQkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJCW5sYV9hZiA9IEFGX0lORVQ7Ci0JCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCQkgICAgY2FzZSBBRklfSVA2OgotCQkJYWRkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0JCQlubGFfYWYgPSBBRl9JTkVUNjsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCSAgICBkZWZhdWx0OgotCQkJZ290byB0cnVuYzsKLQkJCWJyZWFrOwotCQkgICAgfQotCQkgICAgYnAgKz0gKDIgKiBzaXplb2YodV9pbnQxNl90KSk7Ci0JCSAgICBpZiAob3B0X2xlbiAhPSA0ICsgYWRkcl9zaXplKSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX1JFRElSRUNUIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDQgKyBhZGRyZXNzIHNpemVdIiwgb3B0X2xlbik7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCSAgICBUQ0hFQ0syKCpicCwgYWRkcl9zaXplKTsKLQkJICAgIG5sYSA9IGJwOwotCQkgICAgYnAgKz0gYWRkcl9zaXplOwotCi0JCSAgICBpbmV0X250b3AobmxhX2FmLCBubGEsIG5sYV9idWYsIHNpemVvZihubGFfYnVmKSk7Ci0JCSAgICAodm9pZClwcmludGYoIiBSRURJUkVDVCAlcyIsICAoY2hhciAqKW5sYSk7Ci0JCSAgICBvcHRzX2xlbiAtPSA0ICsgYWRkcl9zaXplOwotCQkgICAgYnJlYWs7Ci0KLQkJY2FzZSBQR01fT1BUX1BBUklUWV9QUk06Ci0JCSAgICBpZiAob3B0X2xlbiAhPSA4KSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX1BBUklUWV9QUk0gb3B0aW9uLCBsZW5ndGggJXUgIT0gOF0iLCBvcHRfbGVuKTsKLQkJCXJldHVybjsKLQkJICAgIH0KLQkJICAgIGZsYWdzMSA9ICpicCsrOwotCQkgICAgZmxhZ3MyID0gKmJwKys7Ci0JCSAgICBsZW4gPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKLQkJICAgICh2b2lkKXByaW50ZigiIFBBUklUWSBNQVhUR1MgJXUiLCBsZW4pOwotCQkgICAgb3B0c19sZW4gLT0gODsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9QQVJJVFlfR1JQOgotCQkgICAgaWYgKG9wdF9sZW4gIT0gOCkgewotCQkJKHZvaWQpcHJpbnRmKCJbQmFkIE9QVF9QQVJJVFlfR1JQIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDhdIiwgb3B0X2xlbik7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCSAgICBmbGFnczEgPSAqYnArKzsKLQkJICAgIGZsYWdzMiA9ICpicCsrOwotCQkgICAgc2VxID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkgICAgYnAgKz0gc2l6ZW9mKHVfaW50MzJfdCk7Ci0JCSAgICAodm9pZClwcmludGYoIiBQQVJJVFkgR1JPVVAgJXUiLCBzZXEpOwotCQkgICAgb3B0c19sZW4gLT0gODsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9DVVJSX1RHU0laRToKLQkJICAgIGlmIChvcHRfbGVuICE9IDgpIHsKLQkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfQ1VSUl9UR1NJWkUgb3B0aW9uLCBsZW5ndGggJXUgIT0gOF0iLCBvcHRfbGVuKTsKLQkJCXJldHVybjsKLQkJICAgIH0KLQkJICAgIGZsYWdzMSA9ICpicCsrOwotCQkgICAgZmxhZ3MyID0gKmJwKys7Ci0JCSAgICBsZW4gPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCSAgICBicCArPSBzaXplb2YodV9pbnQzMl90KTsKLQkJICAgICh2b2lkKXByaW50ZigiIFBBUklUWSBBVEdTICV1IiwgbGVuKTsKLQkJICAgIG9wdHNfbGVuIC09IDg7Ci0JCSAgICBicmVhazsKLQotCQljYXNlIFBHTV9PUFRfTkJSX1VOUkVBQ0g6Ci0JCSAgICBpZiAob3B0X2xlbiAhPSA0KSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX05CUl9VTlJFQUNIIG9wdGlvbiwgbGVuZ3RoICV1ICE9IDRdIiwgb3B0X2xlbik7Ci0JCQlyZXR1cm47Ci0JCSAgICB9Ci0JCSAgICBmbGFnczEgPSAqYnArKzsKLQkJICAgIGZsYWdzMiA9ICpicCsrOwotCQkgICAgKHZvaWQpcHJpbnRmKCIgTkJSX1VOUkVBQ0giKTsKLQkJICAgIG9wdHNfbGVuIC09IDQ7Ci0JCSAgICBicmVhazsKLQotCQljYXNlIFBHTV9PUFRfUEFUSF9OTEE6Ci0JCSAgICAodm9pZClwcmludGYoIiBQQVRIX05MQSBbJWRdIiwgb3B0X2xlbik7Ci0JCSAgICBicCArPSBvcHRfbGVuOwotCQkgICAgb3B0c19sZW4gLT0gb3B0X2xlbjsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9TWU46Ci0JCSAgICBpZiAob3B0X2xlbiAhPSA0KSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX1NZTiBvcHRpb24sIGxlbmd0aCAldSAhPSA0XSIsIG9wdF9sZW4pOwotCQkJcmV0dXJuOwotCQkgICAgfQotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgICh2b2lkKXByaW50ZigiIFNZTiIpOwotCQkgICAgb3B0c19sZW4gLT0gNDsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9GSU46Ci0JCSAgICBpZiAob3B0X2xlbiAhPSA0KSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX0ZJTiBvcHRpb24sIGxlbmd0aCAldSAhPSA0XSIsIG9wdF9sZW4pOwotCQkJcmV0dXJuOwotCQkgICAgfQotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgICh2b2lkKXByaW50ZigiIEZJTiIpOwotCQkgICAgb3B0c19sZW4gLT0gNDsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9SU1Q6Ci0JCSAgICBpZiAob3B0X2xlbiAhPSA0KSB7Ci0JCQkodm9pZClwcmludGYoIltCYWQgT1BUX1JTVCBvcHRpb24sIGxlbmd0aCAldSAhPSA0XSIsIG9wdF9sZW4pOwotCQkJcmV0dXJuOwotCQkgICAgfQotCQkgICAgZmxhZ3MxID0gKmJwKys7Ci0JCSAgICBmbGFnczIgPSAqYnArKzsKLQkJICAgICh2b2lkKXByaW50ZigiIFJTVCIpOwotCQkgICAgb3B0c19sZW4gLT0gNDsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9DUjoKLQkJICAgICh2b2lkKXByaW50ZigiIENSIik7Ci0JCSAgICBicCArPSBvcHRfbGVuOwotCQkgICAgb3B0c19sZW4gLT0gb3B0X2xlbjsKLQkJICAgIGJyZWFrOwotCi0JCWNhc2UgUEdNX09QVF9DUlFTVDoKLQkJICAgIGlmIChvcHRfbGVuICE9IDQpIHsKLQkJCSh2b2lkKXByaW50ZigiW0JhZCBPUFRfQ1JRU1Qgb3B0aW9uLCBsZW5ndGggJXUgIT0gNF0iLCBvcHRfbGVuKTsKLQkJCXJldHVybjsKLQkJICAgIH0KLQkJICAgIGZsYWdzMSA9ICpicCsrOwotCQkgICAgZmxhZ3MyID0gKmJwKys7Ci0JCSAgICAodm9pZClwcmludGYoIiBDUlFTVCIpOwotCQkgICAgb3B0c19sZW4gLT0gNDsKLQkJICAgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgICAodm9pZClwcmludGYoIiBPUFRfJTAyWCBbJWRdICIsIG9wdF90eXBlLCBvcHRfbGVuKTsKLQkJICAgIGJwICs9IG9wdF9sZW47Ci0JCSAgICBvcHRzX2xlbiAtPSBvcHRfbGVuOwotCQkgICAgYnJlYWs7Ci0JCX0KLQotCQlpZiAob3B0X3R5cGUgJiBQR01fT1BUX0VORCkKLQkJICAgIGJyZWFrOwotCSAgICAgfQotCX0KLQotCSh2b2lkKXByaW50ZigiIFsldV0iLCBFWFRSQUNUXzE2QklUUygmcGdtLT5wZ21fbGVuZ3RoKSk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCWZwdXRzKCJbfHBnbV0iLCBzdGRvdXQpOwotCWlmIChjaCAhPSAnXDAnKQotCQlwdXRjaGFyKCc+Jyk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1waW0uYyBiL3ByaW50LXBpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWM0ZTRkLi4wMDAwMDAwCi0tLSBhL3ByaW50LXBpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcGltLmMsdiAxLjQ1LjIuNCAyMDA2LzAyLzEzIDAxOjMyOjM0IGhhbm5lcyBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotI2RlZmluZSBQSU1WMl9UWVBFX0hFTExPICAgICAgICAgMAotI2RlZmluZSBQSU1WMl9UWVBFX1JFR0lTVEVSICAgICAgMQotI2RlZmluZSBQSU1WMl9UWVBFX1JFR0lTVEVSX1NUT1AgMgotI2RlZmluZSBQSU1WMl9UWVBFX0pPSU5fUFJVTkUgICAgMwotI2RlZmluZSBQSU1WMl9UWVBFX0JPT1RTVFJBUCAgICAgNAotI2RlZmluZSBQSU1WMl9UWVBFX0FTU0VSVCAgICAgICAgNQotI2RlZmluZSBQSU1WMl9UWVBFX0dSQUZUICAgICAgICAgNgotI2RlZmluZSBQSU1WMl9UWVBFX0dSQUZUX0FDSyAgICAgNwotI2RlZmluZSBQSU1WMl9UWVBFX0NBTkRJREFURV9SUCAgOAotI2RlZmluZSBQSU1WMl9UWVBFX1BSVU5FX1JFRlJFU0ggOQotCi1zdGF0aWMgc3RydWN0IHRvayBwaW12Ml90eXBlX3ZhbHVlc1tdID0gewotICAgIHsgUElNVjJfVFlQRV9IRUxMTywgICAgICAgICAiSGVsbG8iIH0sCi0gICAgeyBQSU1WMl9UWVBFX1JFR0lTVEVSLCAgICAgICJSZWdpc3RlciIgfSwKLSAgICB7IFBJTVYyX1RZUEVfUkVHSVNURVJfU1RPUCwgIlJlZ2lzdGVyIFN0b3AiIH0sCi0gICAgeyBQSU1WMl9UWVBFX0pPSU5fUFJVTkUsICAgICJKb2luIC8gUHJ1bmUiIH0sCi0gICAgeyBQSU1WMl9UWVBFX0JPT1RTVFJBUCwgICAgICJCb290c3RyYXAiIH0sCi0gICAgeyBQSU1WMl9UWVBFX0FTU0VSVCwgICAgICAgICJBc3NlcnQiIH0sCi0gICAgeyBQSU1WMl9UWVBFX0dSQUZULCAgICAgICAgICJHcmFmdCIgfSwKLSAgICB7IFBJTVYyX1RZUEVfR1JBRlRfQUNLLCAgICAgIkdyYWZ0IEFja25vd2xlZGdlbWVudCIgfSwKLSAgICB7IFBJTVYyX1RZUEVfQ0FORElEQVRFX1JQLCAgIkNhbmRpZGF0ZSBSUCBBZHZlcnRpc2VtZW50IiB9LAotICAgIHsgUElNVjJfVFlQRV9QUlVORV9SRUZSRVNILCAiUHJ1bmUgUmVmcmVzaCIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9IT0xEVElNRSAgICAgICAgICAgICAxCi0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9MQU5QUlVORURFTEFZICAgICAgICAyCi0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWV9PTEQgICAgIDE4Ci0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWSAgICAgICAgIDE5Ci0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9HRU5JRCAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9SRUZSRVNIX0NBUCAgICAgICAgIDIxCi0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9CSURJUl9DQVAgICAgICAgICAgIDIyCi0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9BRERSRVNTX0xJU1QgICAgICAgIDI0Ci0jZGVmaW5lIFBJTVYyX0hFTExPX09QVElPTl9BRERSRVNTX0xJU1RfT0xEIDY1MDAxCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHBpbXYyX2hlbGxvX29wdGlvbl92YWx1ZXNbXSA9IHsKLSAgICB7IFBJTVYyX0hFTExPX09QVElPTl9IT0xEVElNRSwgICAgICAgICAiSG9sZCBUaW1lIiB9LAotICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0xBTlBSVU5FREVMQVksICAgICJMQU4gUHJ1bmUgRGVsYXkiIH0sCi0gICAgeyBQSU1WMl9IRUxMT19PUFRJT05fRFJfUFJJT1JJVFlfT0xELCAgIkRSIFByaW9yaXR5IChPbGQpIiB9LAotICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0RSX1BSSU9SSVRZLCAgICAgICJEUiBQcmlvcml0eSIgfSwKLSAgICB7IFBJTVYyX0hFTExPX09QVElPTl9HRU5JRCwgICAgICAgICAgICAiR2VuZXJhdGlvbiBJRCIgfSwKLSAgICB7IFBJTVYyX0hFTExPX09QVElPTl9SRUZSRVNIX0NBUCwgICAgICAiU3RhdGUgUmVmcmVzaCBDYXBhYmlsaXR5IiB9LAotICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0JJRElSX0NBUCwgICAgICAgICJCaS1EaXJlY3Rpb25hbCBDYXBhYmlsaXR5IiB9LAotICAgIHsgUElNVjJfSEVMTE9fT1BUSU9OX0FERFJFU1NfTElTVCwgICAgICJBZGRyZXNzIExpc3QiIH0sCi0gICAgeyBQSU1WMl9IRUxMT19PUFRJT05fQUREUkVTU19MSVNUX09MRCwgIkFkZHJlc3MgTGlzdCAoT2xkKSIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIFBJTVYyX1JFR0lTVEVSX0ZMQUdfTEVOICAgICAgNAotI2RlZmluZSBQSU1WMl9SRUdJU1RFUl9GTEFHX0JPUkRFUiAweDgwMDAwMDAwCi0jZGVmaW5lIFBJTVYyX1JFR0lTVEVSX0ZMQUdfTlVMTCAgIDB4NDAwMDAwMDAKLQotc3RhdGljIHN0cnVjdCB0b2sgcGltdjJfcmVnaXN0ZXJfZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IFBJTVYyX1JFR0lTVEVSX0ZMQUdfQk9SREVSLCAiQm9yZGVyIiB9LAotICAgIHsgUElNVjJfUkVHSVNURVJfRkxBR19OVUxMLCAiTnVsbCIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OyAgICAKLQotLyoKLSAqIFhYWDogV2UgY29uc2lkZXIgYSBjYXNlIHdoZXJlIElQdjYgaXMgbm90IHJlYWR5IHlldCBmb3IgcG9ydGFiaWxpdHksCi0gKiBidXQgUElNIGRlcGVuZGVudCBkZWZpbnRpb25zIHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiBJUHY2Li4uCi0gKi8KLQotc3RydWN0IHBpbSB7Ci0JdV9pbnQ4X3QgcGltX3R5cGV2ZXI7Ci0JCQkvKiB1cHBlciA0Yml0OiBQSU0gdmVyc2lvbiBudW1iZXI7IDIgZm9yIFBJTXYyICovCi0JCQkvKiBsb3dlciA0Yml0OiB0aGUgUElNIG1lc3NhZ2UgdHlwZSwgY3VycmVudGx5IHRoZXkgYXJlOgotCQkJICogSGVsbG8sIFJlZ2lzdGVyLCBSZWdpc3Rlci1TdG9wLCBKb2luL1BydW5lLAotCQkJICogQm9vdHN0cmFwLCBBc3NlcnQsIEdyYWZ0IChQSU0tRE0gb25seSksCi0JCQkgKiBHcmFmdC1BY2sgKFBJTS1ETSBvbmx5KSwgQy1SUC1BZHYKLQkJCSAqLwotI2RlZmluZSBQSU1fVkVSKHgpCSgoKHgpICYgMHhmMCkgPj4gNCkKLSNkZWZpbmUgUElNX1RZUEUoeCkJKCh4KSAmIDB4MGYpCi0JdV9jaGFyICBwaW1fcnN2OwkvKiBSZXNlcnZlZCAqLwotCXVfc2hvcnQJcGltX2Nrc3VtOwkvKiBJUCBzdHlsZSBjaGVjayBzdW0gKi8KLX07Ci0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaW5jbHVkZSAiaXAuaCIKLQotc3RhdGljIHZvaWQgcGltdjJfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKTsKLQotc3RhdGljIHZvaWQKLXBpbXYxX2pvaW5fcHJ1bmVfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotCWludCBtYWRkcmxlbiwgYWRkcmxlbiwgbmdyb3VwcywgbmpvaW4sIG5wcnVuZTsKLQlpbnQgbmpwOwotCi0JLyogSWYgaXQncyBhIHNpbmdsZSBncm91cCBhbmQgYSBzaW5nbGUgc291cmNlLCB1c2UgMS1saW5lIG91dHB1dC4gKi8KLQlpZiAoVFRFU1QyKGJwWzBdLCAzMCkgJiYgYnBbMTFdID09IDEgJiYKLQkgICAgKChuam9pbiA9IEVYVFJBQ1RfMTZCSVRTKCZicFsyMF0pKSArIEVYVFJBQ1RfMTZCSVRTKCZicFsyMl0pKSA9PSAxKSB7Ci0JCWludCBob2xkOwotCi0JCSh2b2lkKXByaW50ZigiIFJQRiAlcyAiLCBpcGFkZHJfc3RyaW5nKGJwKSk7Ci0JCWhvbGQgPSBFWFRSQUNUXzE2QklUUygmYnBbNl0pOwotCQlpZiAoaG9sZCAhPSAxODApIHsKLQkJCSh2b2lkKXByaW50ZigiSG9sZCAiKTsKLQkJCXJlbHRzX3ByaW50KGhvbGQpOwotCQl9Ci0JCSh2b2lkKXByaW50ZigiJXMgKCVzLyVkLCAlcyIsIG5qb2luID8gIkpvaW4iIDogIlBydW5lIiwKLQkJaXBhZGRyX3N0cmluZygmYnBbMjZdKSwgYnBbMjVdICYgMHgzZiwKLQkJaXBhZGRyX3N0cmluZygmYnBbMTJdKSk7Ci0JCWlmIChFWFRSQUNUXzMyQklUUygmYnBbMTZdKSAhPSAweGZmZmZmZmZmKQotCQkJKHZvaWQpcHJpbnRmKCIvJXMiLCBpcGFkZHJfc3RyaW5nKCZicFsxNl0pKTsKLQkJKHZvaWQpcHJpbnRmKCIpICVzJXMgJXMiLAotCQkgICAgKGJwWzI0XSAmIDB4MDEpID8gIlNwYXJzZSIgOiAiRGVuc2UiLAotCQkgICAgKGJwWzI1XSAmIDB4ODApID8gIiBXQyIgOiAiIiwKLQkJICAgIChicFsyNV0gJiAweDQwKSA/ICJSUCIgOiAiU1BUIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlUQ0hFQ0syKGJwWzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKLQlpZiAodmZsYWcgPiAxKQotCQkodm9pZClwcmludGYoIlxuIik7Ci0JKHZvaWQpcHJpbnRmKCIgVXBzdHJlYW0gTmJyOiAlcyIsIGlwYWRkcl9zdHJpbmcoYnApKTsKLQlUQ0hFQ0syKGJwWzZdLCAyKTsKLQlpZiAodmZsYWcgPiAxKQotCQkodm9pZClwcmludGYoIlxuIik7Ci0JKHZvaWQpcHJpbnRmKCIgSG9sZCB0aW1lOiAiKTsKLQlyZWx0c19wcmludChFWFRSQUNUXzE2QklUUygmYnBbNl0pKTsKLQlpZiAodmZsYWcgPCAyKQotCQlyZXR1cm47Ci0JYnAgKz0gODsKLQlsZW4gLT0gODsKLQotCVRDSEVDSzIoYnBbMF0sIDQpOwotCW1hZGRybGVuID0gYnBbMV07Ci0JYWRkcmxlbiA9IGJwWzJdOwotCW5ncm91cHMgPSBicFszXTsKLQlicCArPSA0OwotCWxlbiAtPSA0OwotCXdoaWxlIChuZ3JvdXBzLS0pIHsKLQkJLyoKLQkJICogWFhYIC0gZG9lcyB0aGUgYWRkcmVzcyBoYXZlIGxlbmd0aCAiYWRkcmxlbiIgYW5kIHRoZQotCQkgKiBtYXNrIGxlbmd0aCAibWFkZHJsZW4iPwotCQkgKi8KLQkJVENIRUNLMihicFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JCSh2b2lkKXByaW50ZigiXG5cdEdyb3VwOiAlcyIsIGlwYWRkcl9zdHJpbmcoYnApKTsKLQkJVENIRUNLMihicFs0XSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JCWlmIChFWFRSQUNUXzMyQklUUygmYnBbNF0pICE9IDB4ZmZmZmZmZmYpCi0JCQkodm9pZClwcmludGYoIi8lcyIsIGlwYWRkcl9zdHJpbmcoJmJwWzRdKSk7Ci0JCVRDSEVDSzIoYnBbOF0sIDQpOwotCQluam9pbiA9IEVYVFJBQ1RfMTZCSVRTKCZicFs4XSk7Ci0JCW5wcnVuZSA9IEVYVFJBQ1RfMTZCSVRTKCZicFsxMF0pOwotCQkodm9pZClwcmludGYoIiBqb2luZWQ6ICVkIHBydW5lZDogJWQiLCBuam9pbiwgbnBydW5lKTsKLQkJYnAgKz0gMTI7Ci0JCWxlbiAtPSAxMjsKLQkJZm9yIChuanAgPSAwOyBuanAgPCAobmpvaW4gKyBucHJ1bmUpOyBuanArKykgewotCQkJY29uc3QgY2hhciAqdHlwZTsKLQotCQkJaWYgKG5qcCA8IG5qb2luKQotCQkJCXR5cGUgPSAiSm9pbiAiOwotCQkJZWxzZQotCQkJCXR5cGUgPSAiUHJ1bmUiOwotCQkJVENIRUNLMihicFswXSwgNik7Ci0JCQkodm9pZClwcmludGYoIlxuXHQlcyAlcyVzJXMlcy8lZCIsIHR5cGUsCi0JCQkgICAgKGJwWzBdICYgMHgwMSkgPyAiU3BhcnNlICIgOiAiRGVuc2UgIiwKLQkJCSAgICAoYnBbMV0gJiAweDgwKSA/ICJXQyAiIDogIiIsCi0JCQkgICAgKGJwWzFdICYgMHg0MCkgPyAiUlAgIiA6ICJTUFQgIiwKLQkJCWlwYWRkcl9zdHJpbmcoJmJwWzJdKSwgYnBbMV0gJiAweDNmKTsKLQkJCWJwICs9IDY7Ci0JCQlsZW4gLT0gNjsKLQkJfQotCX0KLQlyZXR1cm47Ci10cnVuYzoKLQkodm9pZClwcmludGYoIlt8cGltXSIpOwotCXJldHVybjsKLX0KLQotdm9pZAotcGltdjFfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7Ci0JcmVnaXN0ZXIgdV9jaGFyIHR5cGU7Ci0KLQllcCA9IChjb25zdCB1X2NoYXIgKilzbmFwZW5kOwotCWlmIChicCA+PSBlcCkKLQkJcmV0dXJuOwotCi0JVENIRUNLKGJwWzFdKTsKLQl0eXBlID0gYnBbMV07Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIDA6Ci0JCSh2b2lkKXByaW50ZigiIFF1ZXJ5Iik7Ci0JCWlmIChUVEVTVChicFs4XSkpIHsKLQkJCXN3aXRjaCAoYnBbOF0gPj4gNCkgewotCQkJY2FzZSAwOgotCQkJCSh2b2lkKXByaW50ZigiIERlbnNlLW1vZGUiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQkodm9pZClwcmludGYoIiBTcGFyc2UtbW9kZSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCSh2b2lkKXByaW50ZigiIFNwYXJzZS1EZW5zZS1tb2RlIik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCSh2b2lkKXByaW50ZigiIG1vZGUtJWQiLCBicFs4XSA+PiA0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAodmZsYWcpIHsKLQkJCVRDSEVDSzIoYnBbMTBdLDIpOwotCQkJKHZvaWQpcHJpbnRmKCIgKEhvbGQtdGltZSAiKTsKLQkJCXJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKCZicFsxMF0pKTsKLQkJCSh2b2lkKXByaW50ZigiKSIpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAxOgotCQkodm9pZClwcmludGYoIiBSZWdpc3RlciIpOwotCQlUQ0hFQ0syKGJwWzhdLCAyMCk7CQkJLyogaXAgaGVhZGVyICovCi0JCSh2b2lkKXByaW50ZigiIGZvciAlcyA+ICVzIiwgaXBhZGRyX3N0cmluZygmYnBbMjBdKSwKLQkJICAgIGlwYWRkcl9zdHJpbmcoJmJwWzI0XSkpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCSh2b2lkKXByaW50ZigiIFJlZ2lzdGVyLVN0b3AiKTsKLQkJVENIRUNLMihicFsxMl0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwotCQkodm9pZClwcmludGYoIiBmb3IgJXMgPiAlcyIsIGlwYWRkcl9zdHJpbmcoJmJwWzhdKSwKLQkJICAgIGlwYWRkcl9zdHJpbmcoJmJwWzEyXSkpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCSh2b2lkKXByaW50ZigiIEpvaW4vUHJ1bmUiKTsKLQkJaWYgKHZmbGFnKQotCQkJcGltdjFfam9pbl9wcnVuZV9wcmludCgmYnBbOF0sIGxlbiAtIDgpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCSh2b2lkKXByaW50ZigiIFJQLXJlYWNoYWJsZSIpOwotCQlpZiAodmZsYWcpIHsKLQkJCVRDSEVDSzIoYnBbMjJdLCAyKTsKLQkJCSh2b2lkKXByaW50ZigiIGdyb3VwICVzIiwKLQkJCWlwYWRkcl9zdHJpbmcoJmJwWzhdKSk7Ci0JCQlpZiAoRVhUUkFDVF8zMkJJVFMoJmJwWzEyXSkgIT0gMHhmZmZmZmZmZikKLQkJCQkodm9pZClwcmludGYoIi8lcyIsIGlwYWRkcl9zdHJpbmcoJmJwWzEyXSkpOwotCQkJKHZvaWQpcHJpbnRmKCIgUlAgJXMgaG9sZCAiLCBpcGFkZHJfc3RyaW5nKCZicFsxNl0pKTsKLQkJCXJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKCZicFsyMl0pKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDU6Ci0JCSh2b2lkKXByaW50ZigiIEFzc2VydCIpOwotCQlUQ0hFQ0syKGJwWzE2XSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0JCSh2b2lkKXByaW50ZigiIGZvciAlcyA+ICVzIiwgaXBhZGRyX3N0cmluZygmYnBbMTZdKSwKLQkJICAgIGlwYWRkcl9zdHJpbmcoJmJwWzhdKSk7Ci0JCWlmIChFWFRSQUNUXzMyQklUUygmYnBbMTJdKSAhPSAweGZmZmZmZmZmKQotCQkJKHZvaWQpcHJpbnRmKCIvJXMiLCBpcGFkZHJfc3RyaW5nKCZicFsxMl0pKTsKLQkJVENIRUNLMihicFsyNF0sIDQpOwotCQkodm9pZClwcmludGYoIiAlcyBwcmVmICVkIG1ldHJpYyAlZCIsCi0JCSAgICAoYnBbMjBdICYgMHg4MCkgPyAiUlAtdHJlZSIgOiAiU1BUIiwKLQkJRVhUUkFDVF8zMkJJVFMoJmJwWzIwXSkgJiAweDdmZmZmZmZmLAotCQlFWFRSQUNUXzMyQklUUygmYnBbMjRdKSk7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQkJKHZvaWQpcHJpbnRmKCIgR3JhZnQiKTsKLQkJaWYgKHZmbGFnKQotCQkJcGltdjFfam9pbl9wcnVuZV9wcmludCgmYnBbOF0sIGxlbiAtIDgpOwotCQlicmVhazsKLQljYXNlIDc6Ci0JCSh2b2lkKXByaW50ZigiIEdyYWZ0LUFDSyIpOwotCQlpZiAodmZsYWcpCi0JCQlwaW12MV9qb2luX3BydW5lX3ByaW50KCZicFs4XSwgbGVuIC0gOCk7Ci0JCWJyZWFrOwotCWNhc2UgODoKLQkJKHZvaWQpcHJpbnRmKCIgTW9kZSIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkodm9pZClwcmludGYoIiBbdHlwZSAlZF0iLCB0eXBlKTsKLQkJYnJlYWs7Ci0JfQotCWlmICgoYnBbNF0gPj4gNCkgIT0gMSkKLQkJKHZvaWQpcHJpbnRmKCIgW3YlZF0iLCBicFs0XSA+PiA0KTsKLQlyZXR1cm47Ci0KLXRydW5jOgotCSh2b2lkKXByaW50ZigiW3xwaW1dIik7Ci0JcmV0dXJuOwotfQotCi0vKgotICogYXV0by1SUCBpcyBhIGNpc2NvIHByb3RvY29sLCBkb2N1bWVudGVkIGF0Ci0gKiBmdHA6Ly9mdHBlbmcuY2lzY28uY29tL2lwbXVsdGljYXN0L3NwZWNzL3BpbS1hdXRvcnAtc3BlYzAxLnR4dAotICoKLSAqIFRoaXMgaW1wbGVtZW50cyB2ZXJzaW9uIDErLCBkYXRlZCBTZXB0IDksIDE5OTguCi0gKi8KLXZvaWQKLWNpc2NvX2F1dG9ycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCi17Ci0JaW50IHR5cGU7Ci0JaW50IG51bXJwczsKLQlpbnQgaG9sZDsKLQotCVRDSEVDSyhicFswXSk7Ci0JKHZvaWQpcHJpbnRmKCIgYXV0by1ycCAiKTsKLQl0eXBlID0gYnBbMF07Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSAweDExOgotCQkodm9pZClwcmludGYoImNhbmRpZGF0ZS1hZHZlcnQiKTsKLQkJYnJlYWs7Ci0JY2FzZSAweDEyOgotCQkodm9pZClwcmludGYoIm1hcHBpbmciKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKHZvaWQpcHJpbnRmKCJ0eXBlLTB4JTAyeCIsIHR5cGUpOwotCQlicmVhazsKLQl9Ci0KLQlUQ0hFQ0soYnBbMV0pOwotCW51bXJwcyA9IGJwWzFdOwotCi0JVENIRUNLMihicFsyXSwgMik7Ci0JKHZvaWQpcHJpbnRmKCIgSG9sZCAiKTsKLQlob2xkID0gRVhUUkFDVF8xNkJJVFMoJmJwWzJdKTsKLQlpZiAoaG9sZCkKLQkJcmVsdHNfcHJpbnQoRVhUUkFDVF8xNkJJVFMoJmJwWzJdKSk7Ci0JZWxzZQotCQlwcmludGYoIkZPUkVWRVIiKTsKLQotCS8qIE5leHQgNCBieXRlcyBhcmUgcmVzZXJ2ZWQuICovCi0KLQlicCArPSA4OyBsZW4gLT0gODsKLQotCS8qWFhYIHNraXAgdW5sZXNzIC12PyAqLwotCi0JLyoKLQkgKiBSZXN0IG9mIHBhY2tldDoKLQkgKiBudW1ycHMgZW50cmllcyBvZiB0aGUgZm9ybToKLQkgKiAzMiBiaXRzOiBSUAotCSAqIDYgYml0czogcmVzZXJ2ZWQKLQkgKiAyIGJpdHM6IFBJTSB2ZXJzaW9uIHN1cHBvcnRlZCwgYml0IDAgaXMgInN1cHBvcnRzIHYxIiwgMSBpcyAidjIiLgotCSAqIDggYml0czogIyBvZiBlbnRyaWVzIGZvciB0aGlzIFJQCi0JICogZWFjaCBlbnRyeTogNyBiaXRzOiByZXNlcnZlZCwgMSBiaXQ6IG5lZ2F0aXZlLAotCSAqCSAgICAgICA4IGJpdHM6IG1hc2sgMzIgYml0czogc291cmNlCi0JICogbGF0aGVyLCByaW5zZSwgcmVwZWF0LgotCSAqLwotCXdoaWxlIChudW1ycHMtLSkgewotCQlpbnQgbmVudHJpZXM7Ci0JCWNoYXIgczsKLQotCQlUQ0hFQ0syKGJwWzBdLCA0KTsKLQkJKHZvaWQpcHJpbnRmKCIgUlAgJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSk7Ci0JCVRDSEVDSyhicFs0XSk7Ci0JCXN3aXRjaCAoYnBbNF0gJiAweDMpIHsKLQkJY2FzZSAwOiBwcmludGYoIiBQSU12PyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToJcHJpbnRmKCIgUElNdjEiKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6CXByaW50ZigiIFBJTXYyIik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOglwcmludGYoIiBQSU12MSsyIik7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoYnBbNF0gJiAweGZjKQotCQkJKHZvaWQpcHJpbnRmKCIgW3JzdmQ9MHglMDJ4XSIsIGJwWzRdICYgMHhmYyk7Ci0JCVRDSEVDSyhicFs1XSk7Ci0JCW5lbnRyaWVzID0gYnBbNV07Ci0JCWJwICs9IDY7IGxlbiAtPSA2OwotCQlzID0gJyAnOwotCQlmb3IgKDsgbmVudHJpZXM7IG5lbnRyaWVzLS0pIHsKLQkJCVRDSEVDSzIoYnBbMF0sIDYpOwotCQkJKHZvaWQpcHJpbnRmKCIlYyVzJXMvJWQiLCBzLCBicFswXSAmIDEgPyAiISIgOiAiIiwKLQkJCSAgICBpcGFkZHJfc3RyaW5nKCZicFsyXSksIGJwWzFdKTsKLQkJCWlmIChicFswXSAmIDB4ZmUpCi0JCQkJKHZvaWQpcHJpbnRmKCJbcnN2ZD0weCUwMnhdIiwgYnBbMF0gJiAweGZlKTsKLQkJCXMgPSAnLCc7Ci0JCQlicCArPSA2OyBsZW4gLT0gNjsKLQkJfQotCX0KLQlyZXR1cm47Ci0KLXRydW5jOgotCSh2b2lkKXByaW50ZigiW3xhdXRvcnBdIik7Ci0JcmV0dXJuOwotfQotCi12b2lkCi1waW1fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZXA7Ci0JcmVnaXN0ZXIgc3RydWN0IHBpbSAqcGltID0gKHN0cnVjdCBwaW0gKilicDsKLQotCWVwID0gKGNvbnN0IHVfY2hhciAqKXNuYXBlbmQ7Ci0JaWYgKGJwID49IGVwKQotCQlyZXR1cm47Ci0jaWZkZWYgbm90eWV0CQkJLyogY3VycmVudGx5IHdlIHNlZSBvbmx5IHZlcnNpb24gYW5kIHR5cGUgKi8KLQlUQ0hFQ0socGltLT5waW1fcnN2KTsKLSNlbmRpZgotCi0Jc3dpdGNoIChQSU1fVkVSKHBpbS0+cGltX3R5cGV2ZXIpKSB7Ci0JY2FzZSAyOgotICAgICAgICAgICAgaWYgKCF2ZmxhZykgewotICAgICAgICAgICAgICAgIHByaW50ZigiUElNdiV1LCAlcywgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgUElNX1ZFUihwaW0tPnBpbV90eXBldmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihwaW12Ml90eXBlX3ZhbHVlcywiVW5rbm93biBUeXBlIixQSU1fVFlQRShwaW0tPnBpbV90eXBldmVyKSksCi0gICAgICAgICAgICAgICAgICAgICAgIGxlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlBJTXYldSwgbGVuZ3RoICV1XG5cdCVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgUElNX1ZFUihwaW0tPnBpbV90eXBldmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHBpbXYyX3R5cGVfdmFsdWVzLCJVbmtub3duIFR5cGUiLFBJTV9UWVBFKHBpbS0+cGltX3R5cGV2ZXIpKSk7Ci0gICAgICAgICAgICAgICAgcGltdjJfcHJpbnQoYnAsIGxlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIlBJTXYldSwgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgUElNX1ZFUihwaW0tPnBpbV90eXBldmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLX0KLQotLyoKLSAqIFBJTXYyIHVzZXMgZW5jb2RlZCBhZGRyZXNzIHJlcHJlc2VudGF0aW9ucy4KLSAqCi0gKiBUaGUgbGFzdCBQSU0tU00gSS1EIGJlZm9yZSBSRkMyMTE3IHdhcyBwdWJsaXNoZWQgc3BlY2lmaWVkIHRoZQotICogZm9sbG93aW5nIHJlcHJlc2VudGF0aW9uIGZvciB1bmljYXN0IGFkZHJlc3Nlcy4gIEhvd2V2ZXIsIFJGQzIxMTcKLSAqIHNwZWNpZmllZCBubyBlbmNvZGluZyBmb3IgdW5pY2FzdCBhZGRyZXNzZXMgd2l0aCB0aGUgdW5pY2FzdAotICogYWRkcmVzcyBsZW5ndGggc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIuICBUaGVyZWZvcmUsIHdlIGhhdmUgdG8KLSAqIGd1ZXNzIHdoaWNoIGVuY29kaW5nIGlzIGJlaW5nIHVzZWQgKENpc2NvJ3MgUElNdjIgaW1wbGVtZW50YXRpb24KLSAqIHVzZXMgdGhlIG5vbi1SRkMgZW5jb2RpbmcpLiAgUkZDMjExNyB0dXJucyBhIHByZXZpb3VzbHkgIlJlc2VydmVkIgotICogZmllbGQgaW50byBhICd1bmljYXN0LWFkZHJlc3MtbGVuZ3RoLWluLWJ5dGVzJyBmaWVsZC4gIFdlIGd1ZXNzCi0gKiB0aGF0IGl0J3MgdGhlIGRyYWZ0IGVuY29kaW5nIGlmIHRoaXMgcmVzZXJ2ZWQgZmllbGQgaXMgemVyby4KLSAqCi0gKiBSRkMyMzYyIGdvZXMgYmFjayB0byB0aGUgZW5jb2RlZCBmb3JtYXQsIGFuZCBjYWxscyB0aGUgYWRkciBsZW5ndGgKLSAqIGZpZWxkICJyZXNlcnZlZCIgYWdhaW4uCi0gKgotICogVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGFkZHJlc3MgZmFtaWx5LCBmcm9tOgotICoKLSAqICAgIDAgICAgUmVzZXJ2ZWQKLSAqICAgIDEgICAgSVAgKElQIHZlcnNpb24gNCkKLSAqICAgIDIgICAgSVA2IChJUCB2ZXJzaW9uIDYpCi0gKiAgICAzICAgIE5TQVAKLSAqICAgIDQgICAgSERMQyAoOC1iaXQgbXVsdGlkcm9wKQotICogICAgNSAgICBCQk4gMTgyMgotICogICAgNiAgICA4MDIgKGluY2x1ZGVzIGFsbCA4MDIgbWVkaWEgcGx1cyBFdGhlcm5ldCAiY2Fub25pY2FsIGZvcm1hdCIpCi0gKiAgICA3ICAgIEUuMTYzCi0gKiAgICA4ICAgIEUuMTY0IChTTURTLCBGcmFtZSBSZWxheSwgQVRNKQotICogICAgOSAgICBGLjY5IChUZWxleCkKLSAqICAgMTAgICAgWC4xMjEgKFguMjUsIEZyYW1lIFJlbGF5KQotICogICAxMSAgICBJUFgKLSAqICAgMTIgICAgQXBwbGV0YWxrCi0gKiAgIDEzICAgIERlY25ldCBJVgotICogICAxNCAgICBCYW55YW4gVmluZXMKLSAqICAgMTUgICAgRS4xNjQgd2l0aCBOU0FQIGZvcm1hdCBzdWJhZGRyZXNzCi0gKgotICogSW4gYWRkaXRpb24sIHRoZSBzZWNvbmQgYnl0ZSBpcyBhbiAiRW5jb2RpbmciLiAgMCBpcyB0aGUgZGVmYXVsdAotICogZW5jb2RpbmcgZm9yIHRoZSBhZGRyZXNzIGZhbWlseSwgYW5kIG5vIG90aGVyIGVuY29kaW5ncyBhcmUgY3VycmVudGx5Ci0gKiBzcGVjaWZpZWQuCi0gKgotICovCi0KLXN0YXRpYyBpbnQgcGltdjJfYWRkcl9sZW47Ci0KLWVudW0gcGltdjJfYWRkcnR5cGUgewotCXBpbXYyX3VuaWNhc3QsIHBpbXYyX2dyb3VwLCBwaW12Ml9zb3VyY2UKLX07Ci0KLS8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCBBZGRyIEZhbWlseSAgIHwgRW5jb2RpbmcgVHlwZSB8ICAgICBVbmljYXN0IEFkZHJlc3MgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rKysrKysrCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgQWRkciBGYW1pbHkgICB8IEVuY29kaW5nIFR5cGUgfCAgIFJlc2VydmVkICAgIHwgIE1hc2sgTGVuICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICBHcm91cCBtdWx0aWNhc3QgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqIHwgQWRkciBGYW1pbHkgICB8IEVuY29kaW5nIFR5cGUgfCBSc3J2ZCAgIHxTfFd8UnwgIE1hc2sgTGVuICAgICB8Ci0gKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLXN0YXRpYyBpbnQKLXBpbXYyX2FkZHJfcHJpbnQoY29uc3QgdV9jaGFyICpicCwgZW51bSBwaW12Ml9hZGRydHlwZSBhdCwgaW50IHNpbGVudCkKLXsKLQlpbnQgYWY7Ci0JaW50IGxlbiwgaGRybGVuOwotCi0JVENIRUNLKGJwWzBdKTsKLQotCWlmIChwaW12Ml9hZGRyX2xlbiA9PSAwKSB7Ci0JCVRDSEVDSyhicFsxXSk7Ci0JCXN3aXRjaCAoYnBbMF0pIHsKLQkJY2FzZSAxOgotCQkJYWYgPSBBRl9JTkVUOwotCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLQkJCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JCWNhc2UgMjoKLQkJCWFmID0gQUZfSU5FVDY7Ci0JCQlsZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaWYgKGJwWzFdICE9IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWhkcmxlbiA9IDI7Ci0JfSBlbHNlIHsKLQkJc3dpdGNoIChwaW12Ml9hZGRyX2xlbikgewotCQljYXNlIHNpemVvZihzdHJ1Y3QgaW5fYWRkcik6Ci0JCQlhZiA9IEFGX0lORVQ7Ci0JCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCQljYXNlIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOgotCQkJYWYgPSBBRl9JTkVUNjsKLQkJCWJyZWFrOwotI2VuZGlmCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLTE7Ci0JCQlicmVhazsKLQkJfQotCQlsZW4gPSBwaW12Ml9hZGRyX2xlbjsKLQkJaGRybGVuID0gMDsKLQl9Ci0KLQlicCArPSBoZHJsZW47Ci0Jc3dpdGNoIChhdCkgewotCWNhc2UgcGltdjJfdW5pY2FzdDoKLQkJVENIRUNLMihicFswXSwgbGVuKTsKLQkJaWYgKGFmID09IEFGX0lORVQpIHsKLQkJCWlmICghc2lsZW50KQotCQkJCSh2b2lkKXByaW50ZigiJXMiLCBpcGFkZHJfc3RyaW5nKGJwKSk7Ci0JCX0KLSNpZmRlZiBJTkVUNgotCQllbHNlIGlmIChhZiA9PSBBRl9JTkVUNikgewotCQkJaWYgKCFzaWxlbnQpCi0JCQkJKHZvaWQpcHJpbnRmKCIlcyIsIGlwNmFkZHJfc3RyaW5nKGJwKSk7Ci0JCX0KLSNlbmRpZgotCQlyZXR1cm4gaGRybGVuICsgbGVuOwotCWNhc2UgcGltdjJfZ3JvdXA6Ci0JY2FzZSBwaW12Ml9zb3VyY2U6Ci0JCVRDSEVDSzIoYnBbMF0sIGxlbiArIDIpOwotCQlpZiAoYWYgPT0gQUZfSU5FVCkgewotCQkJaWYgKCFzaWxlbnQpIHsKLQkJCQkodm9pZClwcmludGYoIiVzIiwgaXBhZGRyX3N0cmluZyhicCArIDIpKTsKLQkJCQlpZiAoYnBbMV0gIT0gMzIpCi0JCQkJCSh2b2lkKXByaW50ZigiLyV1IiwgYnBbMV0pOwotCQkJfQotCQl9Ci0jaWZkZWYgSU5FVDYKLQkJZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKLQkJCWlmICghc2lsZW50KSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIlcyIsIGlwNmFkZHJfc3RyaW5nKGJwICsgMikpOwotCQkJCWlmIChicFsxXSAhPSAxMjgpCi0JCQkJCSh2b2lkKXByaW50ZigiLyV1IiwgYnBbMV0pOwotCQkJfQotCQl9Ci0jZW5kaWYKLQkJaWYgKGJwWzBdICYmICFzaWxlbnQpIHsKLQkJCWlmIChhdCA9PSBwaW12Ml9ncm91cCkgewotCQkJCSh2b2lkKXByaW50ZigiKDB4JTAyeCkiLCBicFswXSk7Ci0JCQl9IGVsc2UgewotCQkJCSh2b2lkKXByaW50ZigiKCVzJXMlcyIsCi0JCQkJCWJwWzBdICYgMHgwNCA/ICJTIiA6ICIiLAotCQkJCQlicFswXSAmIDB4MDIgPyAiVyIgOiAiIiwKLQkJCQkJYnBbMF0gJiAweDAxID8gIlIiIDogIiIpOwotCQkJCWlmIChicFswXSAmIDB4ZjgpIHsKLQkJCQkJKHZvaWQpIHByaW50ZigiKzB4JTAyeCIsIGJwWzBdICYgMHhmOCk7Ci0JCQkJfQotCQkJCSh2b2lkKXByaW50ZigiKSIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoZHJsZW4gKyAyICsgbGVuOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci10cnVuYzoKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1waW12Ml9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4pCi17Ci0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplcDsKLQlyZWdpc3RlciBzdHJ1Y3QgcGltICpwaW0gPSAoc3RydWN0IHBpbSAqKWJwOwotCWludCBhZHZhbmNlOwotCi0JZXAgPSAoY29uc3QgdV9jaGFyICopc25hcGVuZDsKLQlpZiAoYnAgPj0gZXApCi0JCXJldHVybjsKLQlpZiAoZXAgPiBicCArIGxlbikKLQkJZXAgPSBicCArIGxlbjsKLQlUQ0hFQ0socGltLT5waW1fcnN2KTsKLQlwaW12Ml9hZGRyX2xlbiA9IHBpbS0+cGltX3JzdjsKLQlpZiAocGltdjJfYWRkcl9sZW4gIT0gMCkKLQkJKHZvaWQpcHJpbnRmKCIsIFJGQzIxMTctZW5jb2RpbmciKTsKLQotICAgICAgICBwcmludGYoIiwgY2tzdW0gMHglMDR4ICIsIEVYVFJBQ1RfMTZCSVRTKCZwaW0tPnBpbV9ja3N1bSkpOwotICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJnBpbS0+cGltX2Nrc3VtKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIodW52ZXJpZmllZCkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiglc2NvcnJlY3QpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgVFRFU1QyKGJwWzBdLCBsZW4pICYmCi0gICAgICAgICAgICAgICAgICAgICAgIGluX2Nrc3VtKChjb25zdCB1X3Nob3J0KilicCwgbGVuLCAwKSA/ICJpbiIgOiAiIiApOwotICAgICAgICB9Ci0KLQlzd2l0Y2ggKFBJTV9UWVBFKHBpbS0+cGltX3R5cGV2ZXIpKSB7Ci0JY2FzZSBQSU1WMl9UWVBFX0hFTExPOgotCSAgICB7Ci0JCXVfaW50MTZfdCBvdHlwZSwgb2xlbjsKLQkJYnAgKz0gNDsKLQkJd2hpbGUgKGJwIDwgZXApIHsKLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJb3R5cGUgPSBFWFRSQUNUXzE2QklUUygmYnBbMF0pOwotCQkJb2xlbiA9IEVYVFJBQ1RfMTZCSVRTKCZicFsyXSk7Ci0JCQlUQ0hFQ0syKGJwWzBdLCA0ICsgb2xlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgldSksIGxlbmd0aCAldSwgVmFsdWU6ICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0ciggcGltdjJfaGVsbG9fb3B0aW9uX3ZhbHVlcywiVW5rbm93biIsb3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZW4pOwotCQkJYnAgKz0gNDsKLQotCQkJc3dpdGNoIChvdHlwZSkgewotCQkJY2FzZSBQSU1WMl9IRUxMT19PUFRJT05fSE9MRFRJTUU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKGJwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCQljYXNlIFBJTVYyX0hFTExPX09QVElPTl9MQU5QUlVORURFTEFZOgotCQkJCWlmIChvbGVuICE9IDQpIHsKLQkJCQkJKHZvaWQpcHJpbnRmKCJFUlJPUjogT3B0aW9uIExlbmdodCAhPSA0IEJ5dGVzICgldSkiLCBvbGVuKTsKLQkJCQl9IGVsc2UgewotCQkJCQljaGFyIHRfYml0OwotCQkJCQl1X2ludDE2X3QgbGFuX2RlbGF5LCBvdmVycmlkZV9pbnRlcnZhbDsKLQkJCQkJbGFuX2RlbGF5ID0gRVhUUkFDVF8xNkJJVFMoYnApOwotCQkJCQlvdmVycmlkZV9pbnRlcnZhbCA9IEVYVFJBQ1RfMTZCSVRTKGJwKzIpOwotCQkJCQl0X2JpdCA9IChsYW5fZGVsYXkgJiAweDgwMDApPyAxIDogMDsKLQkJCQkJbGFuX2RlbGF5ICY9IH4weDgwMDA7Ci0JCQkJCSh2b2lkKXByaW50ZigiXG5cdCAgICBULWJpdD0lZCwgTEFOIGRlbGF5ICVkbXMsIE92ZXJyaWRlIGludGVydmFsICVkbXMiLAotCQkJCQl0X2JpdCwgbGFuX2RlbGF5LCBvdmVycmlkZV9pbnRlcnZhbCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWV9PTEQ6Ci0JCQljYXNlIFBJTVYyX0hFTExPX09QVElPTl9EUl9QUklPUklUWToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQmktRGlyZWN0aW9uYWwgQ2FwYWJpbGl0eSAoT2xkKSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXUiLCBFWFRSQUNUXzMyQklUUyhicCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBPcHRpb24gTGVuZ2h0ICE9IDQgQnl0ZXMgKCV1KSIsIG9sZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCWNhc2UgUElNVjJfSEVMTE9fT1BUSU9OX0dFTklEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIjB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKGJwKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUElNVjJfSEVMTE9fT1BUSU9OX1JFRlJFU0hfQ0FQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoInYlZCIsICpicCk7Ci0JCQkJaWYgKCooYnArMSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIGludGVydmFsICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsdHNfcHJpbnQoKihicCsxKSk7Ci0JCQkJfQotCQkJCWlmIChFWFRSQUNUXzE2QklUUyhicCsyKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIiA/MHglMDR4PyIsIEVYVFJBQ1RfMTZCSVRTKGJwKzIpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgIFBJTVYyX0hFTExPX09QVElPTl9CSURJUl9DQVA6Ci0JCQkJYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUElNVjJfSEVMTE9fT1BUSU9OX0FERFJFU1NfTElTVF9PTEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBJTVYyX0hFTExPX09QVElPTl9BRERSRVNTX0xJU1Q6Ci0JCQkJaWYgKHZmbGFnID4gMSkgewotCQkJCQljb25zdCB1X2NoYXIgKnB0ciA9IGJwOwotCQkJCQl3aGlsZSAocHRyIDwgKGJwK29sZW4pKSB7Ci0JCQkJCQlpbnQgYWR2YW5jZTsKLQotCQkJCQkJcHJpbnRmKCJcblx0ICAgICIpOwotCQkJCQkJYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQocHRyLCBwaW12Ml91bmljYXN0LCAwKTsKLQkJCQkJCWlmIChhZHZhbmNlIDwgMCkgewotCQkJCQkJCXByaW50ZigiLi4uIik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlwdHIgKz0gYWR2YW5jZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKGJwLCJcblx0ICAgICIsb2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZmbGFnPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShicCwiXG5cdCAgICAiLG9sZW4pOwotCQkJYnAgKz0gb2xlbjsKLQkJfQotCQlicmVhazsKLQkgICAgfQotCi0JY2FzZSBQSU1WMl9UWVBFX1JFR0lTVEVSOgotCXsKLQkJc3RydWN0IGlwICppcDsKLQotICAgICAgICAgICAgICAgIGlmICghVFRFU1QyKCooYnArNCksIFBJTVYyX1JFR0lTVEVSX0ZMQUdfTEVOKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0KLSAgICAgICAgICAgICAgICBwcmludGYoIiwgRmxhZ3MgWyAlcyBdXG5cdCIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocGltdjJfcmVnaXN0ZXJfZmxhZ192YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGJwKzQpKSk7Ci0KLQkJYnAgKz0gODsgbGVuIC09IDg7Ci0JCS8qIGVuY2Fwc3VsYXRlZCBtdWx0aWNhc3QgcGFja2V0ICovCi0JCWlwID0gKHN0cnVjdCBpcCAqKWJwOwotCQlzd2l0Y2ggKElQX1YoaXApKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOiAvKiBOdWxsIGhlYWRlciAqLwotCQkJKHZvaWQpcHJpbnRmKCJJUC1OdWxsLWhlYWRlciAlcyA+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSk7Ci0JCQlicmVhazsKLQotCQljYXNlIDQ6CS8qIElQdjQgKi8KLQkJCWlwX3ByaW50KGduZG8sIGJwLCBsZW4pOwotCQkJYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLQkJY2FzZSA2OgkvKiBJUHY2ICovCi0JCQlpcDZfcHJpbnQoYnAsIGxlbik7Ci0JCQlicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZClwcmludGYoIklQIHZlciAlZCIsIElQX1YoaXApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUElNVjJfVFlQRV9SRUdJU1RFUl9TVE9QOgotCQlicCArPSA0OyBsZW4gLT0gNDsKLQkJaWYgKGJwID49IGVwKQotCQkJYnJlYWs7Ci0JCSh2b2lkKXByaW50ZigiIGdyb3VwPSIpOwotCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9ncm91cCwgMCkpIDwgMCkgewotCQkJKHZvaWQpcHJpbnRmKCIuLi4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWJwICs9IGFkdmFuY2U7IGxlbiAtPSBhZHZhbmNlOwotCQlpZiAoYnAgPj0gZXApCi0JCQlicmVhazsKLQkJKHZvaWQpcHJpbnRmKCIgc291cmNlPSIpOwotCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml91bmljYXN0LCAwKSkgPCAwKSB7Ci0JCQkodm9pZClwcmludGYoIi4uLiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSU1WMl9UWVBFX0pPSU5fUFJVTkU6Ci0JY2FzZSBQSU1WMl9UWVBFX0dSQUZUOgotCWNhc2UgUElNVjJfVFlQRV9HUkFGVF9BQ0s6Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCi0gICAgICAgICAqICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfFBJTSBWZXJ8IFR5cGUgIHwgQWRkciBsZW5ndGggICB8ICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqICB8ICAgICAgICAgICAgIFVuaWNhc3QtVXBzdHJlYW0gTmVpZ2hib3IgQWRkcmVzcyAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgIFJlc2VydmVkICAgICB8IE51bSBncm91cHMgICAgfCAgICAgICAgICBIb2xkdGltZSAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfCAgICAgICAgICAgIEVuY29kZWQtTXVsdGljYXN0IEdyb3VwIEFkZHJlc3MtMSAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqICB8ICAgTnVtYmVyIG9mIEpvaW5lZCAgU291cmNlcyAgIHwgICBOdW1iZXIgb2YgUHJ1bmVkIFNvdXJjZXMgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICBFbmNvZGVkLUpvaW5lZCBTb3VyY2UgQWRkcmVzcy0xICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgIEVuY29kZWQtSm9pbmVkIFNvdXJjZSBBZGRyZXNzLW4gICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgRW5jb2RlZC1QcnVuZWQgU291cmNlIEFkZHJlc3MtMSAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAgKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICBFbmNvZGVkLVBydW5lZCBTb3VyY2UgQWRkcmVzcy1uICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAgKiAgfCAgICAgICAgICAgICAgICBFbmNvZGVkLU11bHRpY2FzdCBHcm91cCBBZGRyZXNzLW4gICAgICAgICAgICAgIHwKLSAgICAgICAgICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICAqLwotCi0JICAgIHsKLQkJdV9pbnQ4X3Qgbmdyb3VwOwotCQl1X2ludDE2X3QgaG9sZHRpbWU7Ci0JCXVfaW50MTZfdCBuam9pbjsKLQkJdV9pbnQxNl90IG5wcnVuZTsKLQkJaW50IGksIGo7Ci0KLQkJYnAgKz0gNDsgbGVuIC09IDQ7Ci0JCWlmIChQSU1fVFlQRShwaW0tPnBpbV90eXBldmVyKSAhPSA3KSB7CS8qbm90IGZvciBHcmFmdC1BQ0sqLwotCQkJaWYgKGJwID49IGVwKQotCQkJCWJyZWFrOwotCQkJKHZvaWQpcHJpbnRmKCIsIHVwc3RyZWFtLW5laWdoYm9yOiAiKTsKLQkJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKLQkJCQkodm9pZClwcmludGYoIi4uLiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7Ci0JCX0KLQkJaWYgKGJwICsgNCA+IGVwKQotCQkJYnJlYWs7Ci0JCW5ncm91cCA9IGJwWzFdOwotCQlob2xkdGltZSA9IEVYVFJBQ1RfMTZCSVRTKCZicFsyXSk7Ci0JCSh2b2lkKXByaW50ZigiXG5cdCAgJXUgZ3JvdXAocykiLCBuZ3JvdXApOwotCQlpZiAoUElNX1RZUEUocGltLT5waW1fdHlwZXZlcikgIT0gNykgewkvKm5vdCBmb3IgR3JhZnQtQUNLKi8KLQkJCSh2b2lkKXByaW50ZigiLCBob2xkdGltZTogIik7Ci0JCQlpZiAoaG9sZHRpbWUgPT0gMHhmZmZmKQotCQkJCSh2b2lkKXByaW50ZigiaW5maW5pdGUiKTsKLQkJCWVsc2UKLQkJCQlyZWx0c19wcmludChob2xkdGltZSk7Ci0JCX0KLQkJYnAgKz0gNDsgbGVuIC09IDQ7Ci0JCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXA7IGkrKykgewotCQkJaWYgKGJwID49IGVwKQotCQkJCWdvdG8ganBfZG9uZTsKLQkJCSh2b2lkKXByaW50ZigiXG5cdCAgICBncm91cCAjJXU6ICIsIGkrMSk7Ci0JCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9ncm91cCwgMCkpIDwgMCkgewotCQkJCSh2b2lkKXByaW50ZigiLi4uKSIpOwotCQkJCWdvdG8ganBfZG9uZTsKLQkJCX0KLQkJCWJwICs9IGFkdmFuY2U7IGxlbiAtPSBhZHZhbmNlOwotCQkJaWYgKGJwICsgNCA+IGVwKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJZ290byBqcF9kb25lOwotCQkJfQotCQkJbmpvaW4gPSBFWFRSQUNUXzE2QklUUygmYnBbMF0pOwotCQkJbnBydW5lID0gRVhUUkFDVF8xNkJJVFMoJmJwWzJdKTsKLQkJCSh2b2lkKXByaW50ZigiLCBqb2luZWQgc291cmNlczogJXUsIHBydW5lZCBzb3VyY2VzOiAldSIsIG5qb2luLG5wcnVuZSk7Ci0JCQlicCArPSA0OyBsZW4gLT0gNDsKLQkJCWZvciAoaiA9IDA7IGogPCBuam9pbjsgaisrKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCJcblx0ICAgICAgam9pbmVkIHNvdXJjZSAjJXU6ICIsaisxKTsKLQkJCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9zb3VyY2UsIDApKSA8IDApIHsKLQkJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJCWdvdG8ganBfZG9uZTsKLQkJCQl9Ci0JCQkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7Ci0JCQl9Ci0JCQlmb3IgKGogPSAwOyBqIDwgbnBydW5lOyBqKyspIHsKLQkJCQkodm9pZClwcmludGYoIlxuXHQgICAgICBwcnVuZWQgc291cmNlICMldTogIixqKzEpOwotCQkJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3NvdXJjZSwgMCkpIDwgMCkgewotCQkJCQkodm9pZClwcmludGYoIi4uLikiKTsKLQkJCQkJZ290byBqcF9kb25lOwotCQkJCX0KLQkJCQlicCArPSBhZHZhbmNlOyBsZW4gLT0gYWR2YW5jZTsKLQkJCX0KLQkJfQotCWpwX2RvbmU6Ci0JCWJyZWFrOwotCSAgICB9Ci0KLQljYXNlIFBJTVYyX1RZUEVfQk9PVFNUUkFQOgotCXsKLQkJaW50IGksIGosIGZycGNudDsKLQkJYnAgKz0gNDsKLQotCQkvKiBGcmFnbWVudCBUYWcsIEhhc2ggTWFzayBsZW4sIGFuZCBCU1ItcHJpb3JpdHkgKi8KLQkJaWYgKGJwICsgc2l6ZW9mKHVfaW50MTZfdCkgPj0gZXApIGJyZWFrOwotCQkodm9pZClwcmludGYoIiB0YWc9JXgiLCBFWFRSQUNUXzE2QklUUyhicCkpOwotCQlicCArPSBzaXplb2YodV9pbnQxNl90KTsKLQkJaWYgKGJwID49IGVwKSBicmVhazsKLQkJKHZvaWQpcHJpbnRmKCIgaGFzaG1sZW49JWQiLCBicFswXSk7Ci0JCWlmIChicCArIDEgPj0gZXApIGJyZWFrOwotCQkodm9pZClwcmludGYoIiBCU1JwcmlvPSVkIiwgYnBbMV0pOwotCQlicCArPSAyOwotCi0JCS8qIEVuY29kZWQtVW5pY2FzdC1CU1ItQWRkcmVzcyAqLwotCQlpZiAoYnAgPj0gZXApIGJyZWFrOwotCQkodm9pZClwcmludGYoIiBCU1I9Iik7Ci0JCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKLQkJCSh2b2lkKXByaW50ZigiLi4uIik7Ci0JCQlicmVhazsKLQkJfQotCQlicCArPSBhZHZhbmNlOwotCi0JCWZvciAoaSA9IDA7IGJwIDwgZXA7IGkrKykgewotCQkJLyogRW5jb2RlZC1Hcm91cCBBZGRyZXNzICovCi0JCQkodm9pZClwcmludGYoIiAoZ3JvdXAlZDogIiwgaSk7Ci0JCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml9ncm91cCwgMCkpCi0JCQkgICAgPCAwKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJZ290byBic19kb25lOwotCQkJfQotCQkJYnAgKz0gYWR2YW5jZTsKLQotCQkJLyogUlAtQ291bnQsIEZyYWcgUlAtQ250LCBhbmQgcnN2ZCAqLwotCQkJaWYgKGJwID49IGVwKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJZ290byBic19kb25lOwotCQkJfQotCQkJKHZvaWQpcHJpbnRmKCIgUlBjbnQ9JWQiLCBicFswXSk7Ci0JCQlpZiAoYnAgKyAxID49IGVwKSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJZ290byBic19kb25lOwotCQkJfQotCQkJKHZvaWQpcHJpbnRmKCIgRlJQY250PSVkIiwgZnJwY250ID0gYnBbMV0pOwotCQkJYnAgKz0gNDsKLQotCQkJZm9yIChqID0gMDsgaiA8IGZycGNudCAmJiBicCA8IGVwOyBqKyspIHsKLQkJCQkvKiBlYWNoIFJQIGluZm8gKi8KLQkJCQkodm9pZClwcmludGYoIiBSUCVkPSIsIGopOwotCQkJCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsCi0JCQkJCQkJCXBpbXYyX3VuaWNhc3QsCi0JCQkJCQkJCTApKSA8IDApIHsKLQkJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJCWdvdG8gYnNfZG9uZTsKLQkJCQl9Ci0JCQkJYnAgKz0gYWR2YW5jZTsKLQotCQkJCWlmIChicCArIDEgPj0gZXApIHsKLQkJCQkJKHZvaWQpcHJpbnRmKCIuLi4pIik7Ci0JCQkJCWdvdG8gYnNfZG9uZTsKLQkJCQl9Ci0JCQkJKHZvaWQpcHJpbnRmKCIsaG9sZHRpbWU9Iik7Ci0JCQkJcmVsdHNfcHJpbnQoRVhUUkFDVF8xNkJJVFMoYnApKTsKLQkJCQlpZiAoYnAgKyAyID49IGVwKSB7Ci0JCQkJCSh2b2lkKXByaW50ZigiLi4uKSIpOwotCQkJCQlnb3RvIGJzX2RvbmU7Ci0JCQkJfQotCQkJCSh2b2lkKXByaW50ZigiLHByaW89JWQiLCBicFsyXSk7Ci0JCQkJYnAgKz0gNDsKLQkJCX0KLQkJCSh2b2lkKXByaW50ZigiKSIpOwotCQl9Ci0JICAgYnNfZG9uZToKLQkJYnJlYWs7Ci0JfQotCWNhc2UgUElNVjJfVFlQRV9BU1NFUlQ6Ci0JCWJwICs9IDQ7IGxlbiAtPSA0OwotCQlpZiAoYnAgPj0gZXApCi0JCQlicmVhazsKLQkJKHZvaWQpcHJpbnRmKCIgZ3JvdXA9Iik7Ci0JCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX2dyb3VwLCAwKSkgPCAwKSB7Ci0JCQkodm9pZClwcmludGYoIi4uLiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnAgKz0gYWR2YW5jZTsgbGVuIC09IGFkdmFuY2U7Ci0JCWlmIChicCA+PSBlcCkKLQkJCWJyZWFrOwotCQkodm9pZClwcmludGYoIiBzcmM9Iik7Ci0JCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKLQkJCSh2b2lkKXByaW50ZigiLi4uIik7Ci0JCQlicmVhazsKLQkJfQotCQlicCArPSBhZHZhbmNlOyBsZW4gLT0gYWR2YW5jZTsKLQkJaWYgKGJwICsgOCA+IGVwKQotCQkJYnJlYWs7Ci0JCWlmIChicFswXSAmIDB4ODApCi0JCQkodm9pZClwcmludGYoIiBSUFQiKTsKLQkJKHZvaWQpcHJpbnRmKCIgcHJlZj0ldSIsIEVYVFJBQ1RfMzJCSVRTKCZicFswXSkgJiAweDdmZmZmZmZmKTsKLQkJKHZvaWQpcHJpbnRmKCIgbWV0cmljPSV1IiwgRVhUUkFDVF8zMkJJVFMoJmJwWzRdKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSU1WMl9UWVBFX0NBTkRJREFURV9SUDoKLQl7Ci0JCWludCBpLCBwZnhjbnQ7Ci0JCWJwICs9IDQ7Ci0KLQkJLyogUHJlZml4LUNudCwgUHJpb3JpdHksIGFuZCBIb2xkdGltZSAqLwotCQlpZiAoYnAgPj0gZXApIGJyZWFrOwotCQkodm9pZClwcmludGYoIiBwcmVmaXgtY250PSVkIiwgYnBbMF0pOwotCQlwZnhjbnQgPSBicFswXTsKLQkJaWYgKGJwICsgMSA+PSBlcCkgYnJlYWs7Ci0JCSh2b2lkKXByaW50ZigiIHByaW89JWQiLCBicFsxXSk7Ci0JCWlmIChicCArIDMgPj0gZXApIGJyZWFrOwotCQkodm9pZClwcmludGYoIiBob2xkdGltZT0iKTsKLQkJcmVsdHNfcHJpbnQoRVhUUkFDVF8xNkJJVFMoJmJwWzJdKSk7Ci0JCWJwICs9IDQ7Ci0KLQkJLyogRW5jb2RlZC1VbmljYXN0LVJQLUFkZHJlc3MgKi8KLQkJaWYgKGJwID49IGVwKSBicmVhazsKLQkJKHZvaWQpcHJpbnRmKCIgUlA9Iik7Ci0JCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKLQkJCSh2b2lkKXByaW50ZigiLi4uIik7Ci0JCQlicmVhazsKLQkJfQotCQlicCArPSBhZHZhbmNlOwotCi0JCS8qIEVuY29kZWQtR3JvdXAgQWRkcmVzc2VzICovCi0JCWZvciAoaSA9IDA7IGkgPCBwZnhjbnQgJiYgYnAgPCBlcDsgaSsrKSB7Ci0JCQkodm9pZClwcmludGYoIiBHcm91cCVkPSIsIGkpOwotCQkJaWYgKChhZHZhbmNlID0gcGltdjJfYWRkcl9wcmludChicCwgcGltdjJfZ3JvdXAsIDApKQotCQkJICAgIDwgMCkgewotCQkJCSh2b2lkKXByaW50ZigiLi4uIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicCArPSBhZHZhbmNlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgUElNVjJfVFlQRV9QUlVORV9SRUZSRVNIOgotCQkodm9pZClwcmludGYoIiBzcmM9Iik7Ci0JCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX3VuaWNhc3QsIDApKSA8IDApIHsKLQkJCSh2b2lkKXByaW50ZigiLi4uIik7Ci0JCQlicmVhazsKLQkJfQotCQlicCArPSBhZHZhbmNlOwotCQkodm9pZClwcmludGYoIiBncnA9Iik7Ci0JCWlmICgoYWR2YW5jZSA9IHBpbXYyX2FkZHJfcHJpbnQoYnAsIHBpbXYyX2dyb3VwLCAwKSkgPCAwKSB7Ci0JCQkodm9pZClwcmludGYoIi4uLiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnAgKz0gYWR2YW5jZTsKLQkJKHZvaWQpcHJpbnRmKCIgZm9yd2FyZGVyPSIpOwotCQlpZiAoKGFkdmFuY2UgPSBwaW12Ml9hZGRyX3ByaW50KGJwLCBwaW12Ml91bmljYXN0LCAwKSkgPCAwKSB7Ci0JCQkodm9pZClwcmludGYoIi4uLiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnAgKz0gYWR2YW5jZTsKLQkJVENIRUNLMihicFswXSwgMik7Ci0JCSh2b2lkKXByaW50ZigiIFRVTlIgIik7Ci0JCXJlbHRzX3ByaW50KEVYVFJBQ1RfMTZCSVRTKGJwKSk7Ci0JCWJyZWFrOwotCi0KLQkgZGVmYXVsdDoKLQkJKHZvaWQpcHJpbnRmKCIgW3R5cGUgJWRdIiwgUElNX1RZUEUocGltLT5waW1fdHlwZXZlcikpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCSh2b2lkKXByaW50ZigiW3xwaW1dIik7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1wcHAuYyBiL3ByaW50LXBwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk5YzE1Li4wMDAwMDAwCi0tLSBhL3ByaW50LXBwcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRXh0ZW5zaXZlbHkgbW9kaWZpZWQgYnkgTW90b25vcmkgU2hpbmRvIChtc2hpbmRvQG1zaGluZG8ubmV0KSBmb3IgbW9yZQotICogY29tcGxldGUgUFBQIHN1cHBvcnQuCi0gKi8KLQotLyoKLSAqIFRPRE86Ci0gKiBvIHJlc29sdmUgWFhYIGFzIG11Y2ggYXMgcG9zc2libGUKLSAqIG8gTVAgc3VwcG9ydAotICogbyBCQVAgc3VwcG9ydAotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXBwcC5jLHYgMS4xMDguMi42IDIwMDUvMTIvMDUgMTE6NDA6MzYgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaWZkZWYgX19ic2RpX18KLSNpbmNsdWRlIDxuZXQvc2xjb21wcmVzcy5oPgotI2luY2x1ZGUgPG5ldC9pZl9wcHAuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgInBwcC5oIgotI2luY2x1ZGUgImNoZGxjLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAib3VpLmgiCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGNvbnN0YXRucyBhcmUgZGVmaW5lZCBieSBJQU5BLiBQbGVhc2UgcmVmZXIgdG8KLSAqICAgIGh0dHA6Ly93d3cuaXNpLmVkdS9pbi1ub3Rlcy9pYW5hL2Fzc2lnbm1lbnRzL3BwcC1udW1iZXJzCi0gKiBmb3IgdGhlIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCi0gKi8KLQotLyogUHJvdG9jb2wgQ29kZXMgZGVmaW5lZCBpbiBwcHAuaCAqLwotCi1zdHJ1Y3QgdG9rIHBwcHR5cGUyc3RyW10gPSB7Ci0gICAgICAgIHsgUFBQX0lQLAkgICJJUCIgfSwKLSAgICAgICAgeyBQUFBfT1NJLAkgICJPU0kiIH0sCi0gICAgICAgIHsgUFBQX05TLAkgICJOUyIgfSwKLSAgICAgICAgeyBQUFBfREVDTkVULAkgICJERUNORVQiIH0sCi0gICAgICAgIHsgUFBQX0FQUExFLAkgICJBUFBMRSIgfSwKLQl7IFBQUF9JUFgsCSAgIklQWCIgfSwKLQl7IFBQUF9WSkMsCSAgIlZKQyBJUCIgfSwKLQl7IFBQUF9WSk5DLAkgICJWSk5DIElQIiB9LAotCXsgUFBQX0JSUERVLAkgICJCUlBEVSIgfSwKLQl7IFBQUF9TVElJLAkgICJTVElJIiB9LAotCXsgUFBQX1ZJTkVTLAkgICJWSU5FUyIgfSwKLQl7IFBQUF9NUExTX1VDQVNULCAiTVBMUyIgfSwKLQl7IFBQUF9NUExTX01DQVNULCAiTVBMUyIgfSwKLSAgICAgICAgeyBQUFBfQ09NUCwgICAgICAgIkNvbXByZXNzZWQifSwKLSAgICAgICAgeyBQUFBfTUwsICAgICAgICAgIk1MUFBQIn0sCi0gICAgICAgIHsgUFBQX0lQVjYsICAgICAgICJJUDYifSwKLQotCXsgUFBQX0hFTExPLAkgICJIRUxMTyIgfSwKLQl7IFBQUF9MVVhDT00sCSAgIkxVWENPTSIgfSwKLQl7IFBQUF9TTlMsCSAgIlNOUyIgfSwKLQl7IFBQUF9JUENQLAkgICJJUENQIiB9LAotCXsgUFBQX09TSUNQLAkgICJPU0lDUCIgfSwKLQl7IFBQUF9OU0NQLAkgICJOU0NQIiB9LAotCXsgUFBQX0RFQ05FVENQLCAgICJERUNORVRDUCIgfSwKLQl7IFBQUF9BUFBMRUNQLAkgICJBUFBMRUNQIiB9LAotCXsgUFBQX0lQWENQLAkgICJJUFhDUCIgfSwKLQl7IFBQUF9TVElJQ1AsCSAgIlNUSUlDUCIgfSwKLQl7IFBQUF9WSU5FU0NQLAkgICJWSU5FU0NQIiB9LAotICAgICAgICB7IFBQUF9JUFY2Q1AsICAgICAiSVA2Q1AiIH0sCi0JeyBQUFBfTVBMU0NQLAkgICJNUExTQ1AiIH0sCi0KLQl7IFBQUF9MQ1AsCSAgIkxDUCIgfSwKLQl7IFBQUF9QQVAsCSAgIlBBUCIgfSwKLQl7IFBQUF9MUU0sCSAgIkxRTSIgfSwKLQl7IFBQUF9DSEFQLAkgICJDSEFQIiB9LAotCXsgUFBQX0VBUCwJICAiRUFQIiB9LAotCXsgUFBQX1NQQVAsCSAgIlNQQVAiIH0sCi0JeyBQUFBfU1BBUF9PTEQsCSAgIk9sZC1TUEFQIiB9LAotCXsgUFBQX0JBQ1AsCSAgIkJBQ1AiIH0sCi0JeyBQUFBfQkFQLAkgICJCQVAiIH0sCi0JeyBQUFBfTVBDUCwJICAiTUxQUFAtQ1AiIH0sCi0JeyAwLAkJICBOVUxMIH0KLX07Ci0KLS8qIENvbnRyb2wgUHJvdG9jb2xzIChMQ1AvSVBDUC9DQ1AgZXRjLikgQ29kZXMgZGVmaW5lZCBpbiBSRkMgMTY2MSAqLwotCi0jZGVmaW5lIENQQ09ERVNfVkVYVAkJMAkvKiBWZW5kb3ItU3BlY2lmaWMgKFJGQzIxNTMpICovCi0jZGVmaW5lIENQQ09ERVNfQ09ORl9SRVEJMQkvKiBDb25maWd1cmUtUmVxdWVzdCAqLwotI2RlZmluZSBDUENPREVTX0NPTkZfQUNLCTIJLyogQ29uZmlndXJlLUFjayAqLwotI2RlZmluZSBDUENPREVTX0NPTkZfTkFLCTMJLyogQ29uZmlndXJlLU5hayAqLwotI2RlZmluZSBDUENPREVTX0NPTkZfUkVKCTQJLyogQ29uZmlndXJlLVJlamVjdCAqLwotI2RlZmluZSBDUENPREVTX1RFUk1fUkVRCTUJLyogVGVybWluYXRlLVJlcXVlc3QgKi8KLSNkZWZpbmUgQ1BDT0RFU19URVJNX0FDSwk2CS8qIFRlcm1pbmF0ZS1BY2sgKi8KLSNkZWZpbmUgQ1BDT0RFU19DT0RFX1JFSgk3CS8qIENvZGUtUmVqZWN0ICovCi0jZGVmaW5lIENQQ09ERVNfUFJPVF9SRUoJOAkvKiBQcm90b2NvbC1SZWplY3QgKExDUCBvbmx5KSAqLwotI2RlZmluZSBDUENPREVTX0VDSE9fUkVRCTkJLyogRWNoby1SZXF1ZXN0IChMQ1Agb25seSkgKi8KLSNkZWZpbmUgQ1BDT0RFU19FQ0hPX1JQTAkxMAkvKiBFY2hvLVJlcGx5IChMQ1Agb25seSkgKi8KLSNkZWZpbmUgQ1BDT0RFU19ESVNDX1JFUQkxMQkvKiBEaXNjYXJkLVJlcXVlc3QgKExDUCBvbmx5KSAqLwotI2RlZmluZSBDUENPREVTX0lECQkxMgkvKiBJZGVudGlmaWNhdGlvbiAoTENQIG9ubHkpIFJGQzE1NzAgKi8KLSNkZWZpbmUgQ1BDT0RFU19USU1FX1JFTQkxMwkvKiBUaW1lLVJlbWFpbmluZyAoTENQIG9ubHkpIFJGQzE1NzAgKi8KLSNkZWZpbmUgQ1BDT0RFU19SRVNFVF9SRVEJMTQJLyogUmVzZXQtUmVxdWVzdCAoQ0NQIG9ubHkpIFJGQzE5NjIgKi8KLSNkZWZpbmUgQ1BDT0RFU19SRVNFVF9SRVAJMTUJLyogUmVzZXQtUmVwbHkgKENDUCBvbmx5KSAqLwotCi1zdHJ1Y3QgdG9rIGNwY29kZXNbXSA9IHsKLQl7Q1BDT0RFU19WRVhULCAgICAgICJWZW5kb3ItRXh0ZW5zaW9uIn0sIC8qIFJGQzIxNTMgKi8KLQl7Q1BDT0RFU19DT05GX1JFUSwgICJDb25mLVJlcXVlc3QifSwKLSAgICAgICAge0NQQ09ERVNfQ09ORl9BQ0ssICAiQ29uZi1BY2sifSwKLQl7Q1BDT0RFU19DT05GX05BSywgICJDb25mLU5hY2sifSwKLQl7Q1BDT0RFU19DT05GX1JFSiwgICJDb25mLVJlamVjdCJ9LAotCXtDUENPREVTX1RFUk1fUkVRLCAgIlRlcm0tUmVxdWVzdCJ9LAotCXtDUENPREVTX1RFUk1fQUNLLCAgIlRlcm0tQWNrIn0sCi0Je0NQQ09ERVNfQ09ERV9SRUosICAiQ29kZS1SZWplY3QifSwKLQl7Q1BDT0RFU19QUk9UX1JFSiwgICJQcm90LVJlamVjdCJ9LAotCXtDUENPREVTX0VDSE9fUkVRLCAgIkVjaG8tUmVxdWVzdCJ9LAotCXtDUENPREVTX0VDSE9fUlBMLCAgIkVjaG8tUmVwbHkifSwKLQl7Q1BDT0RFU19ESVNDX1JFUSwgICJEaXNjLVJlcSJ9LAotCXtDUENPREVTX0lELCAgICAgICAgIklkZW50In0sICAgICAgICAgICAgLyogUkZDMTU3MCAqLwotCXtDUENPREVTX1RJTUVfUkVNLCAgIlRpbWUtUmVtIn0sICAgICAgICAgLyogUkZDMTU3MCAqLwotCXtDUENPREVTX1JFU0VUX1JFUSwgIlJlc2V0LVJlcSJ9LCAgICAgICAgLyogUkZDMTk2MiAqLwotCXtDUENPREVTX1JFU0VUX1JFUCwgIlJlc2V0LUFjayJ9LCAgICAgICAgLyogUkZDMTk2MiAqLwotICAgICAgICB7MCwgICAgICAgICAgICAgICAgIE5VTEx9Ci19OwotCi0vKiBMQ1AgQ29uZmlnIE9wdGlvbnMgKi8KLQotI2RlZmluZSBMQ1BPUFRfVkVYVAkwCi0jZGVmaW5lIExDUE9QVF9NUlUJMQotI2RlZmluZSBMQ1BPUFRfQUNDTQkyCi0jZGVmaW5lIExDUE9QVF9BUAkzCi0jZGVmaW5lIExDUE9QVF9RUAk0Ci0jZGVmaW5lIExDUE9QVF9NTgk1Ci0jZGVmaW5lIExDUE9QVF9ERVA2CTYKLSNkZWZpbmUgTENQT1BUX1BGQwk3Ci0jZGVmaW5lIExDUE9QVF9BQ0ZDCTgKLSNkZWZpbmUgTENQT1BUX0ZDU0FMVAk5Ci0jZGVmaW5lIExDUE9QVF9TRFAJMTAKLSNkZWZpbmUgTENQT1BUX05VTU1PREUJMTEKLSNkZWZpbmUgTENQT1BUX0RFUDEyCTEyCi0jZGVmaW5lIExDUE9QVF9DQkFDSwkxMwotI2RlZmluZSBMQ1BPUFRfREVQMTQJMTQKLSNkZWZpbmUgTENQT1BUX0RFUDE1CTE1Ci0jZGVmaW5lIExDUE9QVF9ERVAxNgkxNgotI2RlZmluZSBMQ1BPUFRfTUxNUlJVCTE3Ci0jZGVmaW5lIExDUE9QVF9NTFNTTkhGCTE4Ci0jZGVmaW5lIExDUE9QVF9NTEVECTE5Ci0jZGVmaW5lIExDUE9QVF9QUk9QCTIwCi0jZGVmaW5lIExDUE9QVF9EQ0VJRAkyMQotI2RlZmluZSBMQ1BPUFRfTVBQCTIyCi0jZGVmaW5lIExDUE9QVF9MRAkyMwotI2RlZmluZSBMQ1BPUFRfTENQQU9QVAkyNAotI2RlZmluZSBMQ1BPUFRfQ09CUwkyNQotI2RlZmluZSBMQ1BPUFRfUEUJMjYKLSNkZWZpbmUgTENQT1BUX01MSEYJMjcKLSNkZWZpbmUgTENQT1BUX0kxOE4JMjgKLSNkZWZpbmUgTENQT1BUX1NETE9TCTI5Ci0jZGVmaW5lIExDUE9QVF9QUFBNVVgJMzAKLQotI2RlZmluZSBMQ1BPUFRfTUlOIExDUE9QVF9WRVhUCi0jZGVmaW5lIExDUE9QVF9NQVggTENQT1BUX1BQUE1VWAotCi1zdGF0aWMgY29uc3QgY2hhciAqbGNwY29uZm9wdHNbXSA9IHsKLQkiVmVuZC1FeHQiLAkJLyogKDApICovCi0JIk1SVSIsCQkJLyogKDEpICovCi0JIkFDQ00iLAkJCS8qICgyKSAqLwotCSJBdXRoLVByb3QiLAkJLyogKDMpICovCi0JIlF1YWwtUHJvdCIsCQkvKiAoNCkgKi8KLQkiTWFnaWMtTnVtIiwJCS8qICg1KSAqLwotCSJkZXByZWNhdGVkKDYpIiwJLyogdXNlZCB0byBiZSBhIFF1YWxpdHkgUHJvdG9jb2wgKi8KLQkiUEZDIiwJCQkvKiAoNykgKi8KLQkiQUNGQyIsCQkJLyogKDgpICovCi0JIkZDUy1BbHQiLAkJLyogKDkpICovCi0JIlNEUCIsCQkJLyogKDEwKSAqLwotCSJOdW0tTW9kZSIsCQkvKiAoMTEpICovCi0JImRlcHJlY2F0ZWQoMTIpIiwJLyogdXNlZCB0byBiZSBhIE11bHRpLUxpbmstUHJvY2VkdXJlKi8KLQkiQ2FsbC1CYWNrIiwJCS8qICgxMykgKi8KLQkiZGVwcmVjYXRlZCgxNCkiLAkvKiB1c2VkIHRvIGJlIGEgQ29ubmVjdC1UaW1lICovCi0JImRlcHJlY2F0ZWQoMTUpIiwJLyogdXNlZCB0byBiZSBhIENvbXB1bmQtRnJhbWVzICovCi0JImRlcHJlY2F0ZWQoMTYpIiwJLyogdXNlZCB0byBiZSBhIE5vbWluYWwtRGF0YS1FbmNhcCAqLwotCSJNUlJVIiwJCQkvKiAoMTcpICovCi0JIjEyLUJpdCBzZXEgIyIsCQkvKiAoMTgpICovCi0JIkVuZC1EaXNjIiwJCS8qICgxOSkgKi8KLQkiUHJvcHJpZXRhcnkiLAkJLyogKDIwKSAqLwotCSJEQ0UtSWQiLAkJLyogKDIxKSAqLwotCSJNUCsiLAkJCS8qICgyMikgKi8KLQkiTGluay1EaXNjIiwJCS8qICgyMykgKi8KLQkiTENQLUF1dGgtT3B0IiwJCS8qICgyNCkgKi8KLQkiQ09CUyIsCQkJLyogKDI1KSAqLwotCSJQcmVmaXgtZWxpc2lvbiIsCS8qICgyNikgKi8KLQkiTXVsdGlsaW5rLWhlYWRlci1Gb3JtIiwvKiAoMjcpICovCi0JIkkxOE4iLAkJCS8qICgyOCkgKi8KLQkiU0RMLW92ZXItU09ORVQvU0RIIiwJLyogKDI5KSAqLwotCSJQUFAtTXV4aW5nIiwJCS8qICgzMCkgKi8KLX07Ci0KLS8qIEVDUCAtIHRvIGJlIHN1cHBvcnRlZCAqLwotCi0vKiBDQ1AgQ29uZmlnIE9wdGlvbnMgKi8KLQotI2RlZmluZSBDQ1BPUFRfT1VJCTAJLyogUkZDMTk2MiAqLwotI2RlZmluZSBDQ1BPUFRfUFJFRDEJMQkvKiBSRkMxOTYyICovCi0jZGVmaW5lIENDUE9QVF9QUkVEMgkyCS8qIFJGQzE5NjIgKi8KLSNkZWZpbmUgQ0NQT1BUX1BKVU1QCTMJLyogUkZDMTk2MiAqLwotLyogNC0xNSB1bmFzc2lnbmVkICovCi0jZGVmaW5lIENDUE9QVF9IUFBQQwkxNgkvKiBSRkMxOTYyICovCi0jZGVmaW5lIENDUE9QVF9TVEFDTFpTCTE3CS8qIFJGQzE5NzQgKi8KLSNkZWZpbmUgQ0NQT1BUX01QUEMJMTgJLyogUkZDMjExOCAqLwotI2RlZmluZSBDQ1BPUFRfR0ZaQQkxOQkvKiBSRkMxOTYyICovCi0jZGVmaW5lIENDUE9QVF9WNDJCSVMJMjAJLyogUkZDMTk2MiAqLwotI2RlZmluZSBDQ1BPUFRfQlNEQ09NUAkyMQkvKiBSRkMxOTc3ICovCi0vKiAyMiB1bmFzc2lnbmVkICovCi0jZGVmaW5lIENDUE9QVF9MWlNEQ1AJMjMJLyogUkZDMTk2NyAqLwotI2RlZmluZSBDQ1BPUFRfTVZSQ0EJMjQJLyogUkZDMTk3NSAqLwotI2RlZmluZSBDQ1BPUFRfREVDCTI1CS8qIFJGQzE5NzYgKi8KLSNkZWZpbmUgQ0NQT1BUX0RFRkxBVEUJMjYJLyogUkZDMTk3OSAqLwotLyogMjctMjU0IHVuYXNzaWduZWQgKi8KLSNkZWZpbmUgQ0NQT1BUX1JFU1YJMjU1CS8qIFJGQzE5NjIgKi8KLQotY29uc3Qgc3RydWN0IHRvayBjY3Bjb25mb3B0c192YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBDQ1BPUFRfT1VJLCAiT1VJIiB9LAotICAgICAgICB7IENDUE9QVF9QUkVEMSwgIlByZWQtMSIgfSwKLSAgICAgICAgeyBDQ1BPUFRfUFJFRDIsICJQcmVkLTIiIH0sCi0gICAgICAgIHsgQ0NQT1BUX1BKVU1QLCAiUHVkZGxlIiB9LAotICAgICAgICB7IENDUE9QVF9IUFBQQywgIkhQLVBQQyIgfSwKLSAgICAgICAgeyBDQ1BPUFRfU1RBQ0xaUywgIlN0YWMtTFpTIiB9LAotICAgICAgICB7IENDUE9QVF9NUFBDLCAiTVBQQyIgfSwKLSAgICAgICAgeyBDQ1BPUFRfR0ZaQSwgIkdhbmQtRlpBIiB9LAotICAgICAgICB7IENDUE9QVF9WNDJCSVMsICJWLjQyYmlzIiB9LAotICAgICAgICB7IENDUE9QVF9CU0RDT01QLCAiQlNELUNvbXAiIH0sCi0gICAgICAgIHsgQ0NQT1BUX0xaU0RDUCwgIkxaUy1EQ1AiIH0sCi0gICAgICAgIHsgQ0NQT1BUX01WUkNBLCAiTVZSQ0EiIH0sCi0gICAgICAgIHsgQ0NQT1BUX0RFQywgIkRFQyIgfSwKLSAgICAgICAgeyBDQ1BPUFRfREVGTEFURSwgIkRlZmxhdGUiIH0sCi0gICAgICAgIHsgQ0NQT1BUX1JFU1YsICJSZXNlcnZlZCJ9LAotICAgICAgICB7MCwgICAgICAgICAgICAgICAgIE5VTEx9Ci19OwotCi0vKiBCQUNQIENvbmZpZyBPcHRpb25zICovCi0KLSNkZWZpbmUgQkFDUE9QVF9GUEVFUgkxCS8qIFJGQzIxMjUgKi8KLQotY29uc3Qgc3RydWN0IHRvayBiYWNjb25mb3B0c192YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBCQUNQT1BUX0ZQRUVSLCAiRmF2b3JlZC1QZWVyIiB9LAotICAgICAgICB7MCwgICAgICAgICAgICAgICAgIE5VTEx9Ci19OwotCi0KLS8qIFNEQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KLQotLyogSVBDUCBDb25maWcgT3B0aW9ucyAqLwotI2RlZmluZSBJUENQT1BUXzJBRERSCTEJLyogUkZDMTE3MiwgUkZDMTMzMiAoZGVwcmVjYXRlZCkgKi8KLSNkZWZpbmUgSVBDUE9QVF9JUENPTVAJMgkvKiBSRkMxMzMyICovCi0jZGVmaW5lIElQQ1BPUFRfQUREUgkzCS8qIFJGQzEzMzIgKi8KLSNkZWZpbmUgSVBDUE9QVF9NT0JJTEU0CTQJLyogUkZDMjI5MCAqLwotI2RlZmluZSBJUENQT1BUX1BSSUROUwkxMjkJLyogUkZDMTg3NyAqLwotI2RlZmluZSBJUENQT1BUX1BSSU5CTlMJMTMwCS8qIFJGQzE4NzcgKi8KLSNkZWZpbmUgSVBDUE9QVF9TRUNETlMJMTMxCS8qIFJGQzE4NzcgKi8KLSNkZWZpbmUgSVBDUE9QVF9TRUNOQk5TCTEzMgkvKiBSRkMxODc3ICovCi0KLXN0cnVjdCB0b2sgaXBjcG9wdF92YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBJUENQT1BUXzJBRERSLCAiSVAtQWRkcnMiIH0sCi0gICAgICAgIHsgSVBDUE9QVF9JUENPTVAsICJJUC1Db21wIiB9LAotICAgICAgICB7IElQQ1BPUFRfQUREUiwgIklQLUFkZHIiIH0sCi0gICAgICAgIHsgSVBDUE9QVF9NT0JJTEU0LCAiSG9tZS1BZGRyIiB9LAotICAgICAgICB7IElQQ1BPUFRfUFJJRE5TLCAiUHJpLUROUyIgfSwKLSAgICAgICAgeyBJUENQT1BUX1BSSU5CTlMsICJQcmktTkJOUyIgfSwKLSAgICAgICAgeyBJUENQT1BUX1NFQ0ROUywgIlNlYy1ETlMiIH0sCi0gICAgICAgIHsgSVBDUE9QVF9TRUNOQk5TLCAiU2VjLU5CTlMiIH0sCi0JeyAwLAkJICBOVUxMIH0KLX07Ci0KLSNkZWZpbmUgSVBDUE9QVF9JUENPTVBfSERSQ09NUCAweDYxICAvKiByZmMzNTQ0ICovCi0jZGVmaW5lIElQQ1BPUFRfSVBDT01QX01JTkxFTiAgICAxNAotCi1zdHJ1Y3QgdG9rIGlwY3BvcHRfY29tcHByb3RvX3ZhbHVlc1tdID0gewotICAgICAgICB7IFBQUF9WSkMsICJWSi1Db21wIiB9LAotICAgICAgICB7IElQQ1BPUFRfSVBDT01QX0hEUkNPTVAsICJJUCBIZWFkZXIgQ29tcHJlc3Npb24iIH0sCi0JeyAwLAkJICBOVUxMIH0KLX07Ci0KLXN0cnVjdCB0b2sgaXBjcG9wdF9jb21wcHJvdG9fc3Vib3B0X3ZhbHVlc1tdID0gewotICAgICAgICB7IDEsICJSVFAtQ29tcHJlc3Npb24iIH0sCi0gICAgICAgIHsgMiwgIkVuaGFuY2VkIFJUUC1Db21wcmVzc2lvbiIgfSwKLQl7IDAsCQkgIE5VTEwgfQotfTsKLQotLyogSVA2Q1AgQ29uZmlnIE9wdGlvbnMgKi8KLSNkZWZpbmUgSVA2Q1BfSUZJRCAgICAgIDEKLQotc3RydWN0IHRvayBpcDZjcG9wdF92YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBJUDZDUF9JRklELCAiSW50ZXJmYWNlLUlEIiB9LAotCXsgMCwJCSAgTlVMTCB9Ci19OwotCi0vKiBBVENQIC0gdG8gYmUgc3VwcG9ydGVkICovCi0vKiBPU0lOTENQIC0gdG8gYmUgc3VwcG9ydGVkICovCi0vKiBCVkNQIC0gdG8gYmUgc3VwcG9ydGVkICovCi0vKiBCQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KLS8qIElQWENQIC0gdG8gYmUgc3VwcG9ydGVkICovCi0vKiBNUExTQ1AgLSB0byBiZSBzdXBwb3J0ZWQgKi8KLQotLyogQXV0aCBBbGdvcml0aG1zICovCi0KLS8qIDAtNCBSZXNlcnZlZCAoUkZDMTk5NCkgKi8KLSNkZWZpbmUgQVVUSEFMR19DSEFQTUQ1CTUJLyogUkZDMTk5NCAqLwotI2RlZmluZSBBVVRIQUxHX01TQ0hBUDEJMTI4CS8qIFJGQzI0MzMgKi8KLSNkZWZpbmUgQVVUSEFMR19NU0NIQVAyCTEyOQkvKiBSRkMyNzk1ICovCi0KLXN0cnVjdCB0b2sgYXV0aGFsZ192YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBBVVRIQUxHX0NIQVBNRDUsICJNRDUiIH0sCi0gICAgICAgIHsgQVVUSEFMR19NU0NIQVAxLCAiTVMtQ0hBUHYxIiB9LAotICAgICAgICB7IEFVVEhBTEdfTVNDSEFQMiwgIk1TLUNIQVB2MiIgfSwKLQl7IDAsCQkgIE5VTEwgfQotfTsKLQotLyogRkNTIEFsdGVybmF0aXZlcyAtIHRvIGJlIHN1cHBvcnRlZCAqLwotCi0vKiBNdWx0aWxpbmsgRW5kcG9pbnQgRGlzY3JpbWluYXRvciAoUkZDMTcxNykgKi8KLSNkZWZpbmUgTUVEQ0xBU1NfTlVMTAkwCS8qIE51bGwgQ2xhc3MgKi8KLSNkZWZpbmUgTUVEQ0xBU1NfTE9DQUwJMQkvKiBMb2NhbGx5IEFzc2lnbmVkICovCi0jZGVmaW5lIE1FRENMQVNTX0lQVjQJMgkvKiBJbnRlcm5ldCBQcm90b2NvbCAoSVB2NCkgKi8KLSNkZWZpbmUgTUVEQ0xBU1NfTUFDCTMJLyogSUVFRSA4MDIuMSBnbG9iYWwgTUFDIGFkZHJlc3MgKi8KLSNkZWZpbmUgTUVEQ0xBU1NfTU5CCTQJLyogUFBQIE1hZ2ljIE51bWJlciBCbG9jayAqLwotI2RlZmluZSBNRURDTEFTU19QU05ETgk1CS8qIFB1YmxpYyBTd2l0Y2hlZCBOZXR3b3JrIERpcmVjdG9yIE51bWJlciAqLwotCi0vKiBQUFAgTENQIENhbGxiYWNrICovCi0jZGVmaW5lIENBTExCQUNLX0FVVEgJMAkvKiBMb2NhdGlvbiBkZXRlcm1pbmVkIGJ5IHVzZXIgYXV0aCAqLwotI2RlZmluZSBDQUxMQkFDS19EU1RSCTEJLyogRGlhbGluZyBzdHJpbmcgKi8KLSNkZWZpbmUgQ0FMTEJBQ0tfTElECTIJLyogTG9jYXRpb24gaWRlbnRpZmllciAqLwotI2RlZmluZSBDQUxMQkFDS19FMTY0CTMJLyogRS4xNjQgbnVtYmVyICovCi0jZGVmaW5lIENBTExCQUNLX1g1MDAJNAkvKiBYLjUwMCBkaXN0aW5ndWlzaGVkIG5hbWUgKi8KLSNkZWZpbmUgQ0FMTEJBQ0tfQ0JDUAk2CS8qIExvY2F0aW9uIGlzIGRldGVybWluZWQgZHVyaW5nIENCQ1AgbmVnbyAqLwotCi1zdHJ1Y3QgdG9rIHBwcF9jYWxsYmFja192YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBDQUxMQkFDS19BVVRILCAiVXNlckF1dGgiIH0sCi0gICAgICAgIHsgQ0FMTEJBQ0tfRFNUUiwgIkRpYWxTdHJpbmciIH0sCi0gICAgICAgIHsgQ0FMTEJBQ0tfTElELCAiTG9jYWxJRCIgfSwKLSAgICAgICAgeyBDQUxMQkFDS19FMTY0LCAiRS4xNjQiIH0sCi0gICAgICAgIHsgQ0FMTEJBQ0tfWDUwMCwgIlguNTAwIiB9LAotICAgICAgICB7IENBTExCQUNLX0NCQ1AsICJDQkNQIiB9LAotCXsgMCwJCSAgTlVMTCB9Ci19OwotCi0vKiBDSEFQICovCi0KLSNkZWZpbmUgQ0hBUF9DSEFMCTEKLSNkZWZpbmUgQ0hBUF9SRVNQCTIKLSNkZWZpbmUgQ0hBUF9TVUNDCTMKLSNkZWZpbmUgQ0hBUF9GQUlMCTQKLQotc3RydWN0IHRvayBjaGFwY29kZV92YWx1ZXNbXSA9IHsKLQl7IENIQVBfQ0hBTCwgIkNoYWxsZW5nZSIgfSwKLQl7IENIQVBfUkVTUCwgIlJlc3BvbnNlIiB9LAotCXsgQ0hBUF9TVUNDLCAiU3VjY2VzcyIgfSwKLQl7IENIQVBfRkFJTCwgIkZhaWwiIH0sCi0gICAgICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIFBBUCAqLwotCi0jZGVmaW5lIFBBUF9BUkVRCTEKLSNkZWZpbmUgUEFQX0FBQ0sJMgotI2RlZmluZSBQQVBfQU5BSwkzCi0KLXN0cnVjdCB0b2sgcGFwY29kZV92YWx1ZXNbXSA9IHsKLSAgICAgICAgeyBQQVBfQVJFUSwgIkF1dGgtUmVxIiB9LAotICAgICAgICB7IFBBUF9BQUNLLCAiQXV0aC1BQ0siIH0sCi0gICAgICAgIHsgUEFQX0FOQUssICJBdXRoLU5BQ0siIH0sCi0gICAgICAgIHsgMCwgTlVMTCB9Ci19OwotCi0vKiBCQVAgKi8KLSNkZWZpbmUgQkFQX0NBTExSRVEJMQotI2RlZmluZSBCQVBfQ0FMTFJFUwkyCi0jZGVmaW5lIEJBUF9DQlJFUQkzCi0jZGVmaW5lIEJBUF9DQlJFUwk0Ci0jZGVmaW5lIEJBUF9MRFFSRVEJNQotI2RlZmluZSBCQVBfTERRUkVTCTYKLSNkZWZpbmUgQkFQX0NTSU5ECTcKLSNkZWZpbmUgQkFQX0NTUkVTCTgKLQotc3RhdGljIHZvaWQgaGFuZGxlX2N0cmxfcHJvdG8gKHVfaW50IHByb3RvLGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfY2hhcCAoY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGhhbmRsZV9wYXAgKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfYmFwIChjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpOwotc3RhdGljIHZvaWQgaGFuZGxlX21scHBwKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCk7Ci1zdGF0aWMgaW50IHByaW50X2xjcF9jb25maWdfb3B0aW9ucyAoY29uc3QgdV9jaGFyICpwLCBpbnQpOwotc3RhdGljIGludCBwcmludF9pcGNwX2NvbmZpZ19vcHRpb25zIChjb25zdCB1X2NoYXIgKnAsIGludCk7Ci1zdGF0aWMgaW50IHByaW50X2lwNmNwX2NvbmZpZ19vcHRpb25zIChjb25zdCB1X2NoYXIgKnAsIGludCk7Ci1zdGF0aWMgaW50IHByaW50X2NjcF9jb25maWdfb3B0aW9ucyAoY29uc3QgdV9jaGFyICpwLCBpbnQpOwotc3RhdGljIGludCBwcmludF9iYWNwX2NvbmZpZ19vcHRpb25zIChjb25zdCB1X2NoYXIgKnAsIGludCk7Ci1zdGF0aWMgdm9pZCBoYW5kbGVfcHBwICh1X2ludCBwcm90bywgY29uc3QgdV9jaGFyICpwLCBpbnQgbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIHBwcF9oZGxjKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCk7Ci0KLS8qIGdlbmVyaWMgQ29udHJvbCBQcm90b2NvbCAoZS5nLiBMQ1AsIElQQ1AsIENDUCwgZXRjLikgaGFuZGxlciAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9jdHJsX3Byb3RvKHVfaW50IHByb3RvLCBjb25zdCB1X2NoYXIgKnBwdHIsIGludCBsZW5ndGgpCi17Ci0JY29uc3QgY2hhciAqdHlwZXN0cjsKLQl1X2ludCBjb2RlLCBsZW47Ci0JaW50ICgqcGZ1bmMpKGNvbnN0IHVfY2hhciAqLCBpbnQpOwotCWludCB4LCBqOwotICAgICAgICBjb25zdCB1X2NoYXIgKnRwdHI7Ci0KLSAgICAgICAgdHB0cj1wcHRyOwotCi0gICAgICAgIHR5cGVzdHIgPSB0b2syc3RyKHBwcHR5cGUyc3RyLCAidW5rbm93biBjdHJsLXByb3RvICgweCUwNHgpIiwgcHJvdG8pOwotICAgICAgICBwcmludGYoIiVzLCAiLHR5cGVzdHIpOwotCi0JaWYgKGxlbmd0aCA8IDQpIC8qIEZJWE1FIHdlYWsgYm91bmRhcnkgY2hlY2tpbmcgKi8KLQkJZ290byB0cnVuYzsKLQlUQ0hFQ0syKCp0cHRyLCAyKTsKLQotCWNvZGUgPSAqdHB0cisrOwotCQotICAgICAgICBwcmludGYoIiVzICgweCUwMngpLCBpZCAldSwgbGVuZ3RoICV1IiwKLSAgICAgICAgICAgICAgIHRvazJzdHIoY3Bjb2RlcywgIlVua25vd24gT3Bjb2RlIixjb2RlKSwKLSAgICAgICAgICAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAqdHB0cisrLCAvKiBJRCAqLwotICAgICAgICAgICAgICAgbGVuZ3RoKzIpOwotCi0gICAgICAgIGlmICghdmZsYWcpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JaWYgKGxlbmd0aCA8PSA0KQotCQlyZXR1cm47ICAgIC8qIHRoZXJlIG1heSBiZSBhIE5VTEwgY29uZnJlcSBldGMuICovCi0KLQlUQ0hFQ0syKCp0cHRyLCAyKTsKLQlsZW4gPSBFWFRSQUNUXzE2QklUUyh0cHRyKTsKLQl0cHRyICs9IDI7Ci0KLSAgICAgICAgcHJpbnRmKCJcblx0ZW5jb2RlZCBsZW5ndGggJXUgKD1PcHRpb24ocykgbGVuZ3RoICV1KSIsbGVuLGxlbi00KTsKLQotICAgICAgICBpZiAodmZsYWc+MSkKLSAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YShwcHRyLTIsIlxuXHQiLDYpOwotCi0KLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIENQQ09ERVNfVkVYVDoKLQkJaWYgKGxlbmd0aCA8IDExKQotCQkJYnJlYWs7Ci0JCVRDSEVDSzIoKnRwdHIsIDQpOwotCQlwcmludGYoIlxuXHQgIE1hZ2ljLU51bSAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyh0cHRyKSk7Ci0JCXRwdHIgKz0gNDsKLQkJVENIRUNLMigqdHB0ciwgMyk7Ci0JCXByaW50ZigiIFZlbmRvcjogJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIob3VpX3ZhbHVlcywiVW5rbm93biIsRVhUUkFDVF8yNEJJVFModHB0cikpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzI0QklUUyh0cHRyKSk7Ci0JCS8qIFhYWDogbmVlZCB0byBkZWNvZGUgS2luZCBhbmQgVmFsdWUocyk/ICovCi0JCWJyZWFrOwotCWNhc2UgQ1BDT0RFU19DT05GX1JFUToKLQljYXNlIENQQ09ERVNfQ09ORl9BQ0s6Ci0JY2FzZSBDUENPREVTX0NPTkZfTkFLOgotCWNhc2UgQ1BDT0RFU19DT05GX1JFSjoKLQkJeCA9IGxlbiAtIDQ7CS8qIENvZGUoMSksIElkZW50aWZpZXIoMSkgYW5kIExlbmd0aCgyKSAqLwotCQlkbyB7Ci0JCQlzd2l0Y2ggKHByb3RvKSB7Ci0JCQljYXNlIFBQUF9MQ1A6Ci0JCQkJcGZ1bmMgPSBwcmludF9sY3BfY29uZmlnX29wdGlvbnM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBQUF9JUENQOgotCQkJCXBmdW5jID0gcHJpbnRfaXBjcF9jb25maWdfb3B0aW9uczsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFBQX0lQVjZDUDoKLQkJCQlwZnVuYyA9IHByaW50X2lwNmNwX2NvbmZpZ19vcHRpb25zOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQUFBfQ0NQOgotCQkJCXBmdW5jID0gcHJpbnRfY2NwX2NvbmZpZ19vcHRpb25zOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQUFBfQkFDUDoKLQkJCQlwZnVuYyA9IHByaW50X2JhY3BfY29uZmlnX29wdGlvbnM7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCS8qCi0JCQkJICogTm8gcHJpbnQgcm91dGluZSBmb3IgdGhlIG9wdGlvbnMgZm9yCi0JCQkJICogdGhpcyBwcm90b2NvbC4KLQkJCQkgKi8KLQkJCQlwZnVuYyA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChwZnVuYyA9PSBOVUxMKSAvKiBjYXRjaCB0aGUgYWJvdmUgbnVsbCBwb2ludGVyIGlmIHVua25vd24gQ1AgKi8KLQkJCQlicmVhazsKLSAKLQkJCWlmICgoaiA9ICgqcGZ1bmMpKHRwdHIsIGxlbikpID09IDApCi0JCQkJYnJlYWs7Ci0JCQl4IC09IGo7Ci0JCQl0cHRyICs9IGo7Ci0JCX0gd2hpbGUgKHggPiAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQQ09ERVNfVEVSTV9SRVE6Ci0JY2FzZSBDUENPREVTX1RFUk1fQUNLOgotCQkvKiBYWFg6IG5lZWQgdG8gZGVjb2RlIERhdGE/ICovCi0JCWJyZWFrOwotCWNhc2UgQ1BDT0RFU19DT0RFX1JFSjoKLQkJLyogWFhYOiBuZWVkIHRvIGRlY29kZSBSZWplY3RlZC1QYWNrZXQ/ICovCi0JCWJyZWFrOwotCWNhc2UgQ1BDT0RFU19QUk9UX1JFSjoKLQkJaWYgKGxlbmd0aCA8IDYpCi0JCQlicmVhazsKLQkJVENIRUNLMigqdHB0ciwgMik7Ci0JCXByaW50ZigiXG5cdCAgUmVqZWN0ZWQgJXMgUHJvdG9jb2wgKDB4JTA0eCkiLAotCQkgICAgICAgdG9rMnN0cihwcHB0eXBlMnN0ciwidW5rbm93biIsIEVYVFJBQ1RfMTZCSVRTKHRwdHIpKSwKLQkJICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRwdHIpKTsKLQkJLyogWFhYOiBuZWVkIHRvIGRlY29kZSBSZWplY3RlZC1JbmZvcm1hdGlvbj8gLSBoZXhkdW1wIGZvciBub3cgKi8KLSAgICAgICAgICAgICAgICBpZiAobGVuID4gNikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBSZWplY3RlZCBQYWNrZXQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyKzIsIlxuXHQgICAgIixsZW4tMik7Ci0gICAgICAgICAgICAgICAgfQotCQlicmVhazsKLQljYXNlIENQQ09ERVNfRUNIT19SRVE6Ci0JY2FzZSBDUENPREVTX0VDSE9fUlBMOgotCWNhc2UgQ1BDT0RFU19ESVNDX1JFUToKLQkJaWYgKGxlbmd0aCA8IDgpCi0JCQlicmVhazsKLQkJVENIRUNLMigqdHB0ciwgNCk7Ci0JCXByaW50ZigiXG5cdCAgTWFnaWMtTnVtIDB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIpKTsKLQkJLyogWFhYOiBuZWVkIHRvIGRlY29kZSBEYXRhPyAtIGhleGR1bXAgZm9yIG5vdyAqLwotICAgICAgICAgICAgICAgIGlmIChsZW4gPiA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgIC0tLS0tdHJhaWxpbmcgZGF0YS0tLS0tIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUQ0hFQ0syKHRwdHJbNF0sIGxlbi04KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0cHRyKzQsIlxuXHQgICIsbGVuLTgpOwotICAgICAgICAgICAgICAgIH0KLQkJYnJlYWs7Ci0JY2FzZSBDUENPREVTX0lEOgotCQlpZiAobGVuZ3RoIDwgOCkKLQkJCWJyZWFrOwotCQlUQ0hFQ0syKCp0cHRyLCA0KTsKLQkJcHJpbnRmKCJcblx0ICBNYWdpYy1OdW0gMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOwotCQkvKiBSRkMgMTY2MSBzYXlzIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgaHVtYW4gcmVhZGFibGUgKi8KLSAgICAgICAgICAgICAgICBpZiAobGVuID4gOCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBNZXNzYWdlXG5cdCAgICAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZuX3ByaW50bih0cHRyKzQsbGVuLTQsc25hcGVuZCk7Ci0gICAgICAgICAgICAgICAgfQotCQlicmVhazsKLQljYXNlIENQQ09ERVNfVElNRV9SRU06Ci0JCWlmIChsZW5ndGggPCAxMikKLQkJCWJyZWFrOwotCQlUQ0hFQ0syKCp0cHRyLCA0KTsKLQkJcHJpbnRmKCJcblx0ICBNYWdpYy1OdW0gMHglMDh4IiwgRVhUUkFDVF8zMkJJVFModHB0cikpOwotCQlUQ0hFQ0syKCoodHB0ciArIDQpLCA0KTsKLQkJcHJpbnRmKCIsIFNlY29uZHMtUmVtYWluaW5nICV1cyIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIgKyA0KSk7Ci0JCS8qIFhYWDogbmVlZCB0byBkZWNvZGUgTWVzc2FnZT8gKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLSAgICAgICAgICAgIC8qIFhYWCB0aGlzIGlzIGRpcnR5IGJ1dCB3ZSBkbyBub3QgZ2V0IHRoZQotICAgICAgICAgICAgICogb3JpZ2luYWwgcG9pbnRlciBwYXNzZWQgdG8gdGhlIGJlZ2luCi0gICAgICAgICAgICAgKiB0aGUgUFBQIHBhY2tldCAqLwotICAgICAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEocHB0ci0yLCJcblx0ICAiLGxlbmd0aCsyKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfCVzXSIsIHR5cGVzdHIpOwotfQotCi0vKiBMQ1AgY29uZmlnIG9wdGlvbnMgKi8KLXN0YXRpYyBpbnQKLXByaW50X2xjcF9jb25maWdfb3B0aW9ucyhjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpCi17Ci0JaW50IGxlbiwgb3B0OwotCi0JaWYgKGxlbmd0aCA8IDIpCi0JCXJldHVybiAwOwotCVRDSEVDSzIoKnAsIDIpOwotCWxlbiA9IHBbMV07Ci0Jb3B0ID0gcFswXTsKLQlpZiAobGVuZ3RoIDwgbGVuKQotCQlyZXR1cm4gMDsKLQlpZiAobGVuIDwgMikgewotCQlpZiAoKG9wdCA+PSBMQ1BPUFRfTUlOKSAmJiAob3B0IDw9IExDUE9QVF9NQVgpKQotCQkJcHJpbnRmKCJcblx0ICAlcyBPcHRpb24gKDB4JTAyeCksIGxlbmd0aCAldSAoYm9ndXMsIHNob3VsZCBiZSA+PSAyKSIsIGxjcGNvbmZvcHRzW29wdF0sb3B0LGxlbik7Ci0JCWVsc2UKLQkJCXByaW50ZigiXG5cdHVua25vd24gTENQIG9wdGlvbiAweCUwMngiLCBvcHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKChvcHQgPj0gTENQT1BUX01JTikgJiYgKG9wdCA8PSBMQ1BPUFRfTUFYKSkKLQkJcHJpbnRmKCJcblx0ICAlcyBPcHRpb24gKDB4JTAyeCksIGxlbmd0aCAldTogIiwgbGNwY29uZm9wdHNbb3B0XSxvcHQsbGVuKTsKLQllbHNlIHsKLQkJcHJpbnRmKCJcblx0dW5rbm93biBMQ1Agb3B0aW9uIDB4JTAyeCIsIG9wdCk7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0Jc3dpdGNoIChvcHQpIHsKLQljYXNlIExDUE9QVF9WRVhUOgotCQlpZiAobGVuID49IDYpIHsKLQkJCVRDSEVDSzIoKihwICsgMiksIDMpOwotCQkJcHJpbnRmKCJWZW5kb3I6ICVzICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIob3VpX3ZhbHVlcywiVW5rbm93biIsRVhUUkFDVF8yNEJJVFMocCsyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMocCsyKSk7Ci0jaWYgMAotCQkJVENIRUNLKHBbNV0pOwotCQkJcHJpbnRmKCIsIGtpbmQ6IDB4JTAyeCIsIHBbNV0pOwotCQkJcHJpbnRmKCIsIFZhbHVlOiAweCIpCi0JCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gNjsgaSsrKSB7Ci0JCQkJVENIRUNLKHBbNiArIGldKTsKLQkJCQlwcmludGYoIiUwMngiLCBwWzYgKyBpXSk7Ci0JCQl9Ci0jZW5kaWYKLQkJfQotCQlicmVhazsKLQljYXNlIExDUE9QVF9NUlU6Ci0JCWlmIChsZW4gPT0gNCkgewotCQkJVENIRUNLMigqKHAgKyAyKSwgMik7Ci0JCQlwcmludGYoIiV1IiwgRVhUUkFDVF8xNkJJVFMocCArIDIpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIExDUE9QVF9BQ0NNOgotCQlpZiAobGVuID09IDYpIHsKLQkJCVRDSEVDSzIoKihwICsgMiksIDQpOwotCQkJcHJpbnRmKCIweCUwOHgiLCBFWFRSQUNUXzMyQklUUyhwICsgMikpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgTENQT1BUX0FQOgotCQlpZiAobGVuID49IDQpIHsKLQkJICAgIFRDSEVDSzIoKihwICsgMiksIDIpOwotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzIiwgdG9rMnN0cihwcHB0eXBlMnN0ciwiVW5rbm93biBBdXRoIFByb3RvICgweDA0eCkiLEVYVFJBQ1RfMTZCSVRTKHArMikpKTsKLQotCQkgICAgc3dpdGNoIChFWFRSQUNUXzE2QklUUyhwKzIpKSB7Ci0JCSAgICBjYXNlIFBQUF9DSEFQOgotCQkgICAgICAgIFRDSEVDSyhwWzRdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAlcyIsdG9rMnN0cihhdXRoYWxnX3ZhbHVlcywiVW5rbm93biBBdXRoIEFsZyAldSIscFs0XSkpOwotCQkJYnJlYWs7Ci0JCSAgICBjYXNlIFBQUF9QQVA6IC8qIGZhbGwgdGhyb3VnaCAqLwotCQkgICAgY2FzZSBQUFBfRUFQOgotCQkgICAgY2FzZSBQUFBfU1BBUDoKLQkJICAgIGNhc2UgUFBQX1NQQVBfT0xEOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHAsIlxuXHQiLGxlbik7Ci0JCSAgICB9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBMQ1BPUFRfUVA6Ci0JCWlmIChsZW4gPj0gNCkgewotCQkJVENIRUNLMigqKHAgKyAyKSwgMik7Ci0JCSAgICAgICAgaWYgKEVYVFJBQ1RfMTZCSVRTKHArMikgPT0gUFBQX0xRTSkKLQkJCQlwcmludGYoIiBMUVIiKTsKLQkJCWVsc2UKLQkJCQlwcmludGYoIiB1bmtub3duIik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBMQ1BPUFRfTU46Ci0JCWlmIChsZW4gPT0gNikgewotCQkJVENIRUNLMigqKHAgKyAyKSwgNCk7Ci0JCQlwcmludGYoIjB4JTA4eCIsIEVYVFJBQ1RfMzJCSVRTKHAgKyAyKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBMQ1BPUFRfUEZDOgotCQlicmVhazsKLQljYXNlIExDUE9QVF9BQ0ZDOgotCQlicmVhazsKLQljYXNlIExDUE9QVF9MRDoKLQkJaWYgKGxlbiA9PSA0KSB7Ci0JCQlUQ0hFQ0syKCoocCArIDIpLCAyKTsKLQkJCXByaW50ZigiMHglMDR4IiwgRVhUUkFDVF8xNkJJVFMocCArIDIpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIExDUE9QVF9DQkFDSzoKLQkJaWYgKGxlbiA8IDMpCi0JCQlicmVhazsKLQkJVENIRUNLKHBbMl0pOwotICAgICAgICAgICAgICAgIHByaW50ZigiQ2FsbGJhY2sgT3BlcmF0aW9uICVzICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHBwcF9jYWxsYmFja192YWx1ZXMsIlVua25vd24iLHBbMl0pLAotICAgICAgICAgICAgICAgICAgICAgICBwWzJdKTsKLQkJYnJlYWs7Ci0JY2FzZSBMQ1BPUFRfTUxNUlJVOgotCQlpZiAobGVuID09IDQpIHsKLQkJCVRDSEVDSzIoKihwICsgMiksIDIpOwotCQkJcHJpbnRmKCIldSIsIEVYVFJBQ1RfMTZCSVRTKHAgKyAyKSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBMQ1BPUFRfTUxFRDoKLQkJaWYgKGxlbiA8IDMpCi0JCQlicmVhazsKLQkJVENIRUNLKHBbMl0pOwotCQlzd2l0Y2ggKHBbMl0pIHsJCS8qIGNsYXNzICovCi0JCWNhc2UgTUVEQ0xBU1NfTlVMTDoKLQkJCXByaW50ZigiTnVsbCIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVEQ0xBU1NfTE9DQUw6Ci0JCQlwcmludGYoIkxvY2FsIik7IC8qIFhYWCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVEQ0xBU1NfSVBWNDoKLQkJCWlmIChsZW4gIT0gNykKLQkJCQlicmVhazsKLQkJCVRDSEVDSzIoKihwICsgMyksIDQpOwotCQkJcHJpbnRmKCJJUHY0ICVzIiwgaXBhZGRyX3N0cmluZyhwICsgMykpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVEQ0xBU1NfTUFDOgotCQkJaWYgKGxlbiAhPSA5KQotCQkJCWJyZWFrOwotCQkJVENIRUNLKHBbOF0pOwotCQkJcHJpbnRmKCJNQUMgJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAotCQkJICAgICAgIHBbM10sIHBbNF0sIHBbNV0sIHBbNl0sIHBbN10sIHBbOF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVEQ0xBU1NfTU5COgotCQkJcHJpbnRmKCJNYWdpYy1OdW0tQmxvY2siKTsgLyogWFhYICovCi0JCQlicmVhazsKLQkJY2FzZSBNRURDTEFTU19QU05ETjoKLQkJCXByaW50ZigiUFNORE4iKTsgLyogWFhYICovCi0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotLyogWFhYOiB0byBiZSBzdXBwb3J0ZWQgKi8KLSNpZiAwCi0JY2FzZSBMQ1BPUFRfREVQNjoKLQljYXNlIExDUE9QVF9GQ1NBTFQ6Ci0JY2FzZSBMQ1BPUFRfU0RQOgotCWNhc2UgTENQT1BUX05VTU1PREU6Ci0JY2FzZSBMQ1BPUFRfREVQMTI6Ci0JY2FzZSBMQ1BPUFRfREVQMTQ6Ci0JY2FzZSBMQ1BPUFRfREVQMTU6Ci0JY2FzZSBMQ1BPUFRfREVQMTY6Ci0gICAgICAgIGNhc2UgTENQT1BUX01MU1NOSEY6Ci0JY2FzZSBMQ1BPUFRfUFJPUDoKLQljYXNlIExDUE9QVF9EQ0VJRDoKLQljYXNlIExDUE9QVF9NUFA6Ci0JY2FzZSBMQ1BPUFRfTENQQU9QVDoKLQljYXNlIExDUE9QVF9DT0JTOgotCWNhc2UgTENQT1BUX1BFOgotCWNhc2UgTENQT1BUX01MSEY6Ci0JY2FzZSBMQ1BPUFRfSTE4TjoKLQljYXNlIExDUE9QVF9TRExPUzoKLQljYXNlIExDUE9QVF9QUFBNVVg6Ci0JCWJyZWFrOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYodmZsYWc8MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmcFsyXSwiXG5cdCAgICAiLGxlbi0yKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQl9Ci0gICAgICAgICAKLSAgICAgICAgaWYgKHZmbGFnPjEpCi0gICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOyAvKiBleGNsdWRlIFRMViBoZWFkZXIgKi8KLQotCXJldHVybiBsZW47Ci0KLXRydW5jOgotCXByaW50ZigiW3xsY3BdIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIE1MLVBQUCovCi1zdHJ1Y3QgdG9rIHBwcF9tbF9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHg4MCwgImJlZ2luIiB9LAotICAgIHsgMHg0MCwgImVuZCIgfSwKLSAgICB7IDAsIE5VTEwgfQotfTsKLQotc3RhdGljIHZvaWQKLWhhbmRsZV9tbHBwcChjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpIHsKLQotICAgIGlmICghZWZsYWcpCi0gICAgICAgIHByaW50ZigiTUxQUFAsICIpOwotCi0gICAgcHJpbnRmKCJzZXEgMHglMDN4LCBGbGFncyBbJXNdLCBsZW5ndGggJXUiLAotICAgICAgICAgICAoRVhUUkFDVF8xNkJJVFMocCkpJjB4MGZmZiwgLyogb25seSBzdXBwb3J0IDEyLUJpdCBzZXF1ZW5jZSBzcGFjZSBmb3Igbm93ICovCi0gICAgICAgICAgIGJpdHRvazJzdHIocHBwX21sX2ZsYWdfdmFsdWVzLCAibm9uZSIsICpwICYgMHhjMCksCi0gICAgICAgICAgIGxlbmd0aCk7Ci0KLSAgICByZXR1cm47Ci19Ci0KLS8qIENIQVAgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfY2hhcChjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpCi17Ci0JdV9pbnQgY29kZSwgbGVuOwotCWludCB2YWxfc2l6ZSwgbmFtZV9zaXplLCBtc2dfc2l6ZTsKLQljb25zdCB1X2NoYXIgKnAwOwotCWludCBpOwotCi0JcDAgPSBwOwotCWlmIChsZW5ndGggPCAxKSB7Ci0JCXByaW50ZigiW3xjaGFwXSIpOwotCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChsZW5ndGggPCA0KSB7Ci0JCVRDSEVDSygqcCk7Ci0JCXByaW50ZigiW3xjaGFwIDB4JTAyeF0iLCAqcCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlUQ0hFQ0soKnApOwotCWNvZGUgPSAqcDsKLSAgICAgICAgcHJpbnRmKCJDSEFQLCAlcyAoMHglMDJ4KSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGNoYXBjb2RlX3ZhbHVlcywidW5rbm93biIsY29kZSksCi0gICAgICAgICAgICAgICBjb2RlKTsKLQlwKys7Ci0KLQlUQ0hFQ0soKnApOwotCXByaW50ZigiLCBpZCAldSIsICpwKTsJCS8qIElEICovCi0JcCsrOwotCi0JVENIRUNLMigqcCwgMik7Ci0JbGVuID0gRVhUUkFDVF8xNkJJVFMocCk7Ci0JcCArPSAyOwotCi0JLyoKLQkgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIGdlbmVyaWMgQ0hBUCBkZWNvZGluZyByb3V0aW5lLiBTaW5jZSB3ZQotCSAqIGRvbid0IGtub3cgd2hpY2ggZmxhdm9yIG9mIENIQVAgKGkuZS4gQ0hBUC1NRDUsIE1TLUNIQVB2MSwKLQkgKiBNUy1DSEFQdjIpIGlzIHVzZWQgYXQgdGhpcyBwb2ludCwgd2UgY2FuJ3QgZGVjb2RlIHBhY2tldAotCSAqIHNwZWNpZmljYWxseSB0byBlYWNoIGFsZ29yaXRobXMuIEluc3RlYWQsIHdlIHNpbXBseSBkZWNvZGUKLQkgKiB0aGUgR0NEIChHcmF0ZXN0IENvbW1vbiBEZW5vbWluYXRvcikgZm9yIGFsbCBhbGdvcml0aG1zLgotCSAqLwotCXN3aXRjaCAoY29kZSkgewotCWNhc2UgQ0hBUF9DSEFMOgotCWNhc2UgQ0hBUF9SRVNQOgotCQlpZiAobGVuZ3RoIC0gKHAgLSBwMCkgPCAxKQotCQkJcmV0dXJuOwotCQlUQ0hFQ0soKnApOwotCQl2YWxfc2l6ZSA9ICpwOwkJLyogdmFsdWUgc2l6ZSAqLwotCQlwKys7Ci0JCWlmIChsZW5ndGggLSAocCAtIHAwKSA8IHZhbF9zaXplKQotCQkJcmV0dXJuOwotCQlwcmludGYoIiwgVmFsdWUgIik7Ci0JCWZvciAoaSA9IDA7IGkgPCB2YWxfc2l6ZTsgaSsrKSB7Ci0JCQlUQ0hFQ0soKnApOwotCQkJcHJpbnRmKCIlMDJ4IiwgKnArKyk7Ci0JCX0KLQkJbmFtZV9zaXplID0gbGVuIC0gKHAgLSBwMCk7Ci0JCXByaW50ZigiLCBOYW1lICIpOwotCQlmb3IgKGkgPSAwOyBpIDwgbmFtZV9zaXplOyBpKyspIHsKLQkJCVRDSEVDSygqcCk7Ci0JCQlzYWZlcHV0Y2hhcigqcCsrKTsKLQkJfQotCQlicmVhazsKLQljYXNlIENIQVBfU1VDQzoKLQljYXNlIENIQVBfRkFJTDoKLQkJbXNnX3NpemUgPSBsZW4gLSAocCAtIHAwKTsKLQkJcHJpbnRmKCIsIE1zZyAiKTsKLQkJZm9yIChpID0gMDsgaTwgbXNnX3NpemU7IGkrKykgewotCQkJVENIRUNLKCpwKTsKLQkJCXNhZmVwdXRjaGFyKCpwKyspOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiW3xjaGFwXSIpOwotfQotCi0vKiBQQVAgKHNlZSBSRkMgMTMzNCkgKi8KLXN0YXRpYyB2b2lkCi1oYW5kbGVfcGFwKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKLXsKLQl1X2ludCBjb2RlLCBsZW47Ci0JaW50IHBlZXJpZF9sZW4sIHBhc3N3ZF9sZW4sIG1zZ19sZW47Ci0JY29uc3QgdV9jaGFyICpwMDsKLQlpbnQgaTsKLQotCXAwID0gcDsKLQlpZiAobGVuZ3RoIDwgMSkgewotCQlwcmludGYoIlt8cGFwXSIpOwotCQlyZXR1cm47Ci0JfSBlbHNlIGlmIChsZW5ndGggPCA0KSB7Ci0JCVRDSEVDSygqcCk7Ci0JCXByaW50ZigiW3xwYXAgMHglMDJ4XSIsICpwKTsKLQkJcmV0dXJuOwotCX0KLQotCVRDSEVDSygqcCk7Ci0JY29kZSA9ICpwOwotICAgICAgICBwcmludGYoIlBBUCwgJXMgKDB4JTAyeCkiLAotICAgICAgICAgICAgICAgdG9rMnN0cihwYXBjb2RlX3ZhbHVlcywidW5rbm93biIsY29kZSksCi0gICAgICAgICAgICAgICBjb2RlKTsKLQlwKys7Ci0KLQlUQ0hFQ0soKnApOwotCXByaW50ZigiLCBpZCAldSIsICpwKTsJCS8qIElEICovCi0JcCsrOwotCi0JVENIRUNLMigqcCwgMik7Ci0JbGVuID0gRVhUUkFDVF8xNkJJVFMocCk7Ci0JcCArPSAyOwotCi0JaWYgKChpbnQpbGVuID4gbGVuZ3RoKSB7Ci0JCXByaW50ZigiLCBsZW5ndGggJXUgPiBwYWNrZXQgc2l6ZSIsIGxlbik7Ci0JCXJldHVybjsKLQl9Ci0JbGVuZ3RoID0gbGVuOwotCWlmIChsZW5ndGggPCAocCAtIHAwKSkgewotCQlwcmludGYoIiwgbGVuZ3RoICV1IDwgUEFQIGhlYWRlciBsZW5ndGgiLCBsZW5ndGgpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBQQVBfQVJFUToKLQkJaWYgKGxlbmd0aCAtIChwIC0gcDApIDwgMSkKLQkJCXJldHVybjsKLQkJVENIRUNLKCpwKTsKLQkJcGVlcmlkX2xlbiA9ICpwOwkvKiBQZWVyLUlEIExlbmd0aCAqLwotCQlwKys7Ci0JCWlmIChsZW5ndGggLSAocCAtIHAwKSA8IHBlZXJpZF9sZW4pCi0JCQlyZXR1cm47Ci0JCXByaW50ZigiLCBQZWVyICIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGVlcmlkX2xlbjsgaSsrKSB7Ci0JCQlUQ0hFQ0soKnApOwotCQkJc2FmZXB1dGNoYXIoKnArKyk7Ci0JCX0KLQotCQlpZiAobGVuZ3RoIC0gKHAgLSBwMCkgPCAxKQotCQkJcmV0dXJuOwotCQlUQ0hFQ0soKnApOwotCQlwYXNzd2RfbGVuID0gKnA7CS8qIFBhc3N3b3JkIExlbmd0aCAqLwotCQlwKys7Ci0JCWlmIChsZW5ndGggLSAocCAtIHAwKSA8IHBhc3N3ZF9sZW4pCi0JCQlyZXR1cm47Ci0JCXByaW50ZigiLCBOYW1lICIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGFzc3dkX2xlbjsgaSsrKSB7Ci0JCQlUQ0hFQ0soKnApOwotCQkJc2FmZXB1dGNoYXIoKnArKyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBQQVBfQUFDSzoKLQljYXNlIFBBUF9BTkFLOgotCQlpZiAobGVuZ3RoIC0gKHAgLSBwMCkgPCAxKQotCQkJcmV0dXJuOwotCQlUQ0hFQ0soKnApOwotCQltc2dfbGVuID0gKnA7CQkvKiBNc2ctTGVuZ3RoICovCi0JCXArKzsKLQkJaWYgKGxlbmd0aCAtIChwIC0gcDApIDwgbXNnX2xlbikKLQkJCXJldHVybjsKLQkJcHJpbnRmKCIsIE1zZyAiKTsKLQkJZm9yIChpID0gMDsgaTwgbXNnX2xlbjsgaSsrKSB7Ci0JCQlUQ0hFQ0soKnApOwotCQkJc2FmZXB1dGNoYXIoKnArKyk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfHBhcF0iKTsKLX0KLQotLyogQkFQICovCi1zdGF0aWMgdm9pZAotaGFuZGxlX2JhcChjb25zdCB1X2NoYXIgKnAgX1VfLCBpbnQgbGVuZ3RoIF9VXykKLXsKLQkvKiBYWFg6IHRvIGJlIHN1cHBvcnRlZCEhICovCi19Ci0KLQotLyogSVBDUCBjb25maWcgb3B0aW9ucyAqLwotc3RhdGljIGludAotcHJpbnRfaXBjcF9jb25maWdfb3B0aW9ucyhjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpCi17Ci0JaW50IGxlbiwgb3B0OwotICAgICAgICB1X2ludCBjb21wcHJvdG8sIGlwY29tcF9zdWJvcHR0b3RhbGxlbiwgaXBjb21wX3N1Ym9wdCwgaXBjb21wX3N1Ym9wdGxlbjsKLQotCWlmIChsZW5ndGggPCAyKQotCQlyZXR1cm4gMDsKLQlUQ0hFQ0syKCpwLCAyKTsKLQlsZW4gPSBwWzFdOwotCW9wdCA9IHBbMF07Ci0JaWYgKGxlbmd0aCA8IGxlbikKLQkJcmV0dXJuIDA7Ci0JaWYgKGxlbiA8IDIpIHsKLQkJcHJpbnRmKCJcblx0ICAlcyBPcHRpb24gKDB4JTAyeCksIGxlbmd0aCAldSAoYm9ndXMsIHNob3VsZCBiZSA+PSAyKSIsCi0JCSAgICAgICB0b2syc3RyKGlwY3BvcHRfdmFsdWVzLCJ1bmtub3duIixvcHQpLAotCQkgICAgICAgb3B0LAotICAgICAgICAJICAgICAgIGxlbik7Ci0JCXJldHVybiAwOwotCX0KLQotCXByaW50ZigiXG5cdCAgJXMgT3B0aW9uICgweCUwMngpLCBsZW5ndGggJXU6ICIsCi0JICAgICAgIHRvazJzdHIoaXBjcG9wdF92YWx1ZXMsInVua25vd24iLG9wdCksCi0JICAgICAgIG9wdCwKLSAgICAgICAgICAgICAgIGxlbik7Ci0KLQlzd2l0Y2ggKG9wdCkgewotCWNhc2UgSVBDUE9QVF8yQUREUjoJCS8qIGRlcHJlY2F0ZWQgKi8KLQkJaWYgKGxlbiAhPSAxMCkKLQkJCWdvdG8gaW52bGVuOwotCQlUQ0hFQ0syKCoocCArIDYpLCA0KTsKLQkJcHJpbnRmKCJzcmMgJXMsIGRzdCAlcyIsCi0JCSAgICAgICBpcGFkZHJfc3RyaW5nKHAgKyAyKSwKLQkJICAgICAgIGlwYWRkcl9zdHJpbmcocCArIDYpKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUENQT1BUX0lQQ09NUDoKLQkJaWYgKGxlbiA8IDQpCi0JCQlnb3RvIGludmxlbjsKLQkJVENIRUNLMigqKHAgKyAyKSwgMik7Ci0gICAgICAgICAgICAgICAgY29tcHByb3RvID0gRVhUUkFDVF8xNkJJVFMocCsyKTsKLQotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgKDB4JTAyeCk6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihpcGNwb3B0X2NvbXBwcm90b192YWx1ZXMsIlVua25vd24iLGNvbXBwcm90byksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbXBwcm90byk7Ci0KLQkJc3dpdGNoIChjb21wcHJvdG8pIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBQUF9WSkM6Ci0JCQkvKiBYWFg6IFZKLUNvbXAgcGFyYW1ldGVycyBzaG91bGQgYmUgZGVjb2RlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBJUENQT1BUX0lQQ09NUF9IRFJDT01QOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA8IElQQ1BPUFRfSVBDT01QX01JTkxFTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpbnZsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFRDSEVDSzIoKihwICsgMiksIElQQ1BPUFRfSVBDT01QX01JTkxFTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQgICAgVENQIFNwYWNlICV1LCBub24tVENQIFNwYWNlICV1IiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWF4UGVyaW9kICV1LCBtYXhUaW1lICV1LCBtYXhIZHIgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHArNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMocCs2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhwKzgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHArMTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHArMTIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogc3Vib3B0aW9ucyBwcmVzZW50ID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiBJUENQT1BUX0lQQ09NUF9NSU5MRU4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBjb21wX3N1Ym9wdHRvdGFsbGVuID0gbGVuIC0gSVBDUE9QVF9JUENPTVBfTUlOTEVOOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwICs9IElQQ1BPUFRfSVBDT01QX01JTkxFTjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgICAgIFN1Ym9wdGlvbnMsIGxlbmd0aCAldSIsIGlwY29tcF9zdWJvcHR0b3RhbGxlbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlwY29tcF9zdWJvcHR0b3RhbGxlbiA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENIRUNLMigqcCwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBjb21wX3N1Ym9wdCA9ICpwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwY29tcF9zdWJvcHRsZW4gPSAqKHArMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2FuaXR5IGNoZWNrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwY29tcF9zdWJvcHQgPT0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGNvbXBfc3Vib3B0bGVuID09IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IGp1c3QgZGlzcGxheSB0aGUgc3Vib3B0aW9ucyBmb3Igbm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHQlcyBTdWJvcHRpb24gIyV1LCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGlwY3BvcHRfY29tcHByb3RvX3N1Ym9wdF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwY29tcF9zdWJvcHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGNvbXBfc3Vib3B0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcGNvbXBfc3Vib3B0bGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwY29tcF9zdWJvcHR0b3RhbGxlbiAtPSBpcGNvbXBfc3Vib3B0bGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgKz0gaXBjb21wX3N1Ym9wdGxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJUENQT1BUX0FERFI6ICAgICAvKiB0aG9zZSBvcHRpb25zIHNoYXJlIHRoZSBzYW1lIGZvcm1hdCAtIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgSVBDUE9QVF9NT0JJTEU0OgotCWNhc2UgSVBDUE9QVF9QUklETlM6Ci0JY2FzZSBJUENQT1BUX1BSSU5CTlM6Ci0JY2FzZSBJUENQT1BUX1NFQ0ROUzoKLQljYXNlIElQQ1BPUFRfU0VDTkJOUzoKLQkJaWYgKGxlbiAhPSA2KQotCQkJZ290byBpbnZsZW47Ci0JCVRDSEVDSzIoKihwICsgMiksIDQpOwotCQlwcmludGYoIiVzIiwgaXBhZGRyX3N0cmluZyhwICsgMikpOwotCQlicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlmKHZmbGFnPDIpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJnBbMl0sIlxuXHQgICAgIixsZW4tMik7Ci0JCWJyZWFrOwotCX0KLSAgICAgICAgaWYgKHZmbGFnPjEpCi0gICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOyAvKiBleGNsdWRlIFRMViBoZWFkZXIgKi8KLQlyZXR1cm4gbGVuOwotCi1pbnZsZW46Ci0JcHJpbnRmKCIsIGludmFsaWQtbGVuZ3RoLSVkIiwgb3B0KTsKLQlyZXR1cm4gMDsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfGlwY3BdIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIElQNkNQIGNvbmZpZyBvcHRpb25zICovCi1zdGF0aWMgaW50Ci1wcmludF9pcDZjcF9jb25maWdfb3B0aW9ucyhjb25zdCB1X2NoYXIgKnAsIGludCBsZW5ndGgpCi17Ci0JaW50IGxlbiwgb3B0OwotCi0JaWYgKGxlbmd0aCA8IDIpCi0JCXJldHVybiAwOwotCVRDSEVDSzIoKnAsIDIpOwotCWxlbiA9IHBbMV07Ci0Jb3B0ID0gcFswXTsKLQlpZiAobGVuZ3RoIDwgbGVuKQotCQlyZXR1cm4gMDsKLQlpZiAobGVuIDwgMikgewotCQlwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1IChib2d1cywgc2hvdWxkIGJlID49IDIpIiwKLQkJICAgICAgIHRvazJzdHIoaXA2Y3BvcHRfdmFsdWVzLCJ1bmtub3duIixvcHQpLAotCQkgICAgICAgb3B0LAotCSAgICAgICAgICAgICAgIGxlbik7Ci0JICAgICAgICByZXR1cm4gMDsKLQl9Ci0KLQlwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1OiAiLAotCSAgICAgICB0b2syc3RyKGlwNmNwb3B0X3ZhbHVlcywidW5rbm93biIsb3B0KSwKLQkgICAgICAgb3B0LAotICAgICAgICAgICAgICAgbGVuKTsKLQotCXN3aXRjaCAob3B0KSB7Ci0JY2FzZSBJUDZDUF9JRklEOgotCQlpZiAobGVuICE9IDEwKQotCQkJZ290byBpbnZsZW47Ci0JCVRDSEVDSzIoKihwICsgMiksIDgpOwotCQlwcmludGYoIiUwNHg6JTA0eDolMDR4OiUwNHgiLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMocCArIDIpLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMocCArIDQpLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMocCArIDYpLAotCQkgICAgICAgRVhUUkFDVF8xNkJJVFMocCArIDgpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZih2ZmxhZzwyKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOwotCQlicmVhazsKLQl9Ci0gICAgICAgIGlmICh2ZmxhZz4xKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmcFsyXSwiXG5cdCAgICAiLGxlbi0yKTsgLyogZXhjbHVkZSBUTFYgaGVhZGVyICovCi0KLQlyZXR1cm4gbGVuOwotCi1pbnZsZW46Ci0JcHJpbnRmKCIsIGludmFsaWQtbGVuZ3RoLSVkIiwgb3B0KTsKLQlyZXR1cm4gMDsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfGlwNmNwXSIpOwotCXJldHVybiAwOwotfQotCi0KLS8qIENDUCBjb25maWcgb3B0aW9ucyAqLwotc3RhdGljIGludAotcHJpbnRfY2NwX2NvbmZpZ19vcHRpb25zKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKLXsKLQlpbnQgbGVuLCBvcHQ7Ci0KLQlpZiAobGVuZ3RoIDwgMikKLQkJcmV0dXJuIDA7Ci0JVENIRUNLMigqcCwgMik7Ci0JbGVuID0gcFsxXTsKLQlvcHQgPSBwWzBdOwotCWlmIChsZW5ndGggPCBsZW4pCi0JCXJldHVybiAwOwotCWlmIChsZW4gPCAyKSB7Ci0JICAgICAgICBwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1IChib2d1cywgc2hvdWxkIGJlID49IDIpIiwKLSAgICAgICAgCSAgICAgICB0b2syc3RyKGNjcGNvbmZvcHRzX3ZhbHVlcywgIlVua25vd24iLCBvcHQpLAotCSAgICAgICAgICAgICAgIG9wdCwKLSAgICAgICAgCSAgICAgICBsZW4pOwotICAgICAgICAJcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1OiIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGNjcGNvbmZvcHRzX3ZhbHVlcywgIlVua25vd24iLCBvcHQpLAotICAgICAgICAgICAgICAgb3B0LAotICAgICAgICAgICAgICAgbGVuKTsKLQotCXN3aXRjaCAob3B0KSB7Ci0gICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoIC0tPiBkZWZhdWx0OiBub3RoaW5nIHN1cHBvcnRlZCB5ZXQgKi8KLQljYXNlIENDUE9QVF9PVUk6Ci0JY2FzZSBDQ1BPUFRfUFJFRDE6Ci0JY2FzZSBDQ1BPUFRfUFJFRDI6Ci0JY2FzZSBDQ1BPUFRfUEpVTVA6Ci0JY2FzZSBDQ1BPUFRfSFBQUEM6Ci0JY2FzZSBDQ1BPUFRfU1RBQ0xaUzoKLQljYXNlIENDUE9QVF9NUFBDOgotCWNhc2UgQ0NQT1BUX0dGWkE6Ci0JY2FzZSBDQ1BPUFRfVjQyQklTOgotCWNhc2UgQ0NQT1BUX0JTRENPTVA6Ci0JY2FzZSBDQ1BPUFRfTFpTRENQOgotCWNhc2UgQ0NQT1BUX01WUkNBOgotCWNhc2UgQ0NQT1BUX0RFQzoKLQljYXNlIENDUE9QVF9ERUZMQVRFOgotCWNhc2UgQ0NQT1BUX1JFU1Y6Ci0JZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZih2ZmxhZzwyKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCZwWzJdLCJcblx0ICAgICIsbGVuLTIpOwotCQlicmVhazsKLQl9Ci0gICAgICAgIGlmICh2ZmxhZz4xKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmcFsyXSwiXG5cdCAgICAiLGxlbi0yKTsgLyogZXhjbHVkZSBUTFYgaGVhZGVyICovCi0KLQlyZXR1cm4gbGVuOwotCi10cnVuYzoKLQlwcmludGYoIlt8Y2NwXSIpOwotCXJldHVybiAwOwotfQotCi0vKiBCQUNQIGNvbmZpZyBvcHRpb25zICovCi1zdGF0aWMgaW50Ci1wcmludF9iYWNwX2NvbmZpZ19vcHRpb25zKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKLXsKLQlpbnQgbGVuLCBvcHQ7Ci0KLQlpZiAobGVuZ3RoIDwgMikKLQkJcmV0dXJuIDA7Ci0JVENIRUNLMigqcCwgMik7Ci0JbGVuID0gcFsxXTsKLQlvcHQgPSBwWzBdOwotCWlmIChsZW5ndGggPCBsZW4pCi0JCXJldHVybiAwOwotCWlmIChsZW4gPCAyKSB7Ci0JICAgICAgICBwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1IChib2d1cywgc2hvdWxkIGJlID49IDIpIiwKLSAgICAgICAgCSAgICAgICB0b2syc3RyKGJhY2NvbmZvcHRzX3ZhbHVlcywgIlVua25vd24iLCBvcHQpLAotCSAgICAgICAgICAgICAgIG9wdCwKLSAgICAgICAgCSAgICAgICBsZW4pOwotICAgICAgICAJcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmludGYoIlxuXHQgICVzIE9wdGlvbiAoMHglMDJ4KSwgbGVuZ3RoICV1OiIsCi0gICAgICAgICAgICAgICB0b2syc3RyKGJhY2NvbmZvcHRzX3ZhbHVlcywgIlVua25vd24iLCBvcHQpLAotICAgICAgICAgICAgICAgb3B0LAotICAgICAgICAgICAgICAgbGVuKTsKLQotCXN3aXRjaCAob3B0KSB7Ci0JY2FzZSBCQUNQT1BUX0ZQRUVSOgotCQlUQ0hFQ0syKCoocCArIDIpLCA0KTsKLQkJcHJpbnRmKCIsIE1hZ2ljLU51bSAweCUwOHgiLCBFWFRSQUNUXzMyQklUUyhwICsgMikpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYodmZsYWc8MikKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgmcFsyXSwiXG5cdCAgICAiLGxlbi0yKTsKLQkJYnJlYWs7Ci0JfQotICAgICAgICBpZiAodmZsYWc+MSkKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoJnBbMl0sIlxuXHQgICAgIixsZW4tMik7IC8qIGV4Y2x1ZGUgVExWIGhlYWRlciAqLwotCi0JcmV0dXJuIGxlbjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfGJhY3BdIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXBwcF9oZGxjKGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKLXsKLQl1X2NoYXIgKmIsICpzLCAqdCwgYzsKLQlpbnQgaSwgcHJvdG87Ci0JY29uc3Qgdm9pZCAqc2U7Ci0KLQliID0gKHVfaW50OF90ICopbWFsbG9jKGxlbmd0aCk7Ci0JaWYgKGIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBVbmVzY2FwZSBhbGwgdGhlIGRhdGEgaW50byBhIHRlbXBvcmFyeSwgcHJpdmF0ZSwgYnVmZmVyLgotCSAqIERvIHRoaXMgc28gdGhhdCB3ZSBkb250IG92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgcGFja2V0Ci0JICogY29udGVudHMuCi0JICovCi0JZm9yIChzID0gKHVfY2hhciAqKXAsIHQgPSBiLCBpID0gbGVuZ3RoOyBpID4gMDsgaS0tKSB7Ci0JCWMgPSAqcysrOwotCQlpZiAoYyA9PSAweDdkKSB7Ci0JCQlpZiAoaSA+IDEpIHsKLQkJCQlpLS07Ci0JCQkJYyA9ICpzKysgXiAweDIwOwotCQkJfSBlbHNlCi0JCQkJY29udGludWU7Ci0JCX0KLQkJKnQrKyA9IGM7Ci0JfQotCi0Jc2UgPSBzbmFwZW5kOwotCXNuYXBlbmQgPSB0OwotCi0gICAgICAgIC8qIG5vdyBsZXRzIGd1ZXNzIGFib3V0IHRoZSBwYXlsb2FkIGNvZGVwb2ludCBmb3JtYXQgKi8KLSAgICAgICAgcHJvdG8gPSAqYjsgLyogc3RhcnQgd2l0aCBhIG9uZS1vY3RldCBjb2RlcG9pbnQgZ3Vlc3MgKi8KLSAgICAgICAgCi0gICAgICAgIHN3aXRjaCAocHJvdG8pIHsKLSAgICAgICAgY2FzZSBQUFBfSVA6Ci0JCWlwX3ByaW50KGduZG8sIGIrMSwgdCAtIGIgLSAxKTsKLQkJZ290byBjbGVhbnVwOwotI2lmZGVmIElORVQ2Ci0gICAgICAgIGNhc2UgUFBQX0lQVjY6Ci0gICAgICAgICAgICBpcDZfcHJpbnQoYisxLCB0IC0gYiAtIDEpOwotICAgICAgICAgICAgZ290byBjbGVhbnVwOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6IC8qIG5vIGx1Y2sgLSB0cnkgbmV4dCBndWVzcyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90byA9IEVYVFJBQ1RfMTZCSVRTKGIpOyAvKiBuZXh0IGd1ZXNzIC0gbG9hZCB0d28gb2N0ZXRzICovCi0KLSAgICAgICAgc3dpdGNoIChwcm90bykgewotICAgICAgICBjYXNlIChQUFBfQUREUkVTUyA8PCA4IHwgUFBQX0NPTlRST0wpOiAvKiBsb29rcyBsaWtlIGEgUFBQIGZyYW1lICovCi0gICAgICAgICAgICBwcm90byA9IEVYVFJBQ1RfMTZCSVRTKGIrMik7IC8qIGxvYWQgdGhlIFBQUCBwcm90by1pZCAqLwotICAgICAgICAgICAgaGFuZGxlX3BwcChwcm90bywgYis0LCB0IC0gYiAtIDQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8qIGxhc3QgZ3Vlc3MgLSBwcm90byBtdXN0IGJlIGEgUFBQIHByb3RvLWlkICovCi0gICAgICAgICAgICBoYW5kbGVfcHBwKHByb3RvLCBiKzIsIHQgLSBiIC0gMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi1jbGVhbnVwOgotICAgICAgICBzbmFwZW5kID0gc2U7Ci0JZnJlZShiKTsKLSAgICAgICAgcmV0dXJuOwotfQotCi0KLS8qIFBQUCAqLwotc3RhdGljIHZvaWQKLWhhbmRsZV9wcHAodV9pbnQgcHJvdG8sIGNvbnN0IHVfY2hhciAqcCwgaW50IGxlbmd0aCkKLXsKLSAgICAgICAgaWYgKChwcm90byAmIDB4ZmYwMCkgPT0gMHg3ZTAwKSB7LyogaXMgdGhpcyBhbiBlc2NhcGUgY29kZSA/ICovCi0gICAgICAgICAgICBwcHBfaGRsYyhwLTEsIGxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCXN3aXRjaCAocHJvdG8pIHsKLQljYXNlIFBQUF9MQ1A6IC8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgUFBQX0lQQ1A6Ci0JY2FzZSBQUFBfT1NJQ1A6Ci0JY2FzZSBQUFBfTVBMU0NQOgotCWNhc2UgUFBQX0lQVjZDUDoKLQljYXNlIFBQUF9DQ1A6Ci0JY2FzZSBQUFBfQkFDUDoKLQkJaGFuZGxlX2N0cmxfcHJvdG8ocHJvdG8sIHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIFBQUF9NTDoKLSAgICAgICAgICAgICAgICBoYW5kbGVfbWxwcHAocCwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQljYXNlIFBQUF9DSEFQOgotCQloYW5kbGVfY2hhcChwLCBsZW5ndGgpOwotCQlicmVhazsKLQljYXNlIFBQUF9QQVA6Ci0JCWhhbmRsZV9wYXAocCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFBfQkFQOgkJLyogWFhYOiBub3QgeWV0IGNvbXBsZXRlZCAqLwotCQloYW5kbGVfYmFwKHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCWNhc2UgRVRIRVJUWVBFX0lQOgkvKlhYWCovCi0gICAgICAgIGNhc2UgUFBQX1ZKTkM6Ci0JY2FzZSBQUFBfSVA6Ci0JCWlwX3ByaW50KGduZG8sIHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JY2FzZSBFVEhFUlRZUEVfSVBWNjoJLypYWFgqLwotCWNhc2UgUFBQX0lQVjY6Ci0JCWlwNl9wcmludChwLCBsZW5ndGgpOwotCQlicmVhazsKLSNlbmRpZgotCWNhc2UgRVRIRVJUWVBFX0lQWDoJLypYWFgqLwotCWNhc2UgUFBQX0lQWDoKLQkJaXB4X3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBQX09TSToKLQkgICAgICAgIGlzb2NsbnNfcHJpbnQocCwgbGVuZ3RoLCBsZW5ndGgpOwotCSAgICAgICAgYnJlYWs7Ci0JY2FzZSBQUFBfTVBMU19VQ0FTVDoKLQljYXNlIFBQUF9NUExTX01DQVNUOgotCQltcGxzX3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBQX0NPTVA6Ci0JCXByaW50ZigiY29tcHJlc3NlZCBQUFAgZGF0YSIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIiVzICIsIHRvazJzdHIocHBwdHlwZTJzdHIsICJ1bmtub3duIFBQUCBwcm90b2NvbCAoMHglMDR4KSIsIHByb3RvKSk7Ci0JCXByaW50X3Vua25vd25fZGF0YShwLCJcblx0IixsZW5ndGgpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIFN0YW5kYXJkIFBQUCBwcmludGVyICovCi11X2ludAotcHBwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCwgdV9pbnQgbGVuZ3RoKQotewotCXVfaW50IHByb3RvLHBwcF9oZWFkZXI7Ci0gICAgICAgIHVfaW50IG9sZW4gPSBsZW5ndGg7IC8qIF9vX3JpZ2luYWwgbGVuZ3RoICovCi0JdV9pbnQgaGRyX2xlbiA9IDA7Ci0KLQkvKgotCSAqIEhlcmUsIHdlIGFzc3VtZSB0aGF0IHAgcG9pbnRzIHRvIHRoZSBBZGRyZXNzIGFuZCBDb250cm9sCi0JICogZmllbGQgKGlmIHRoZXkgcHJlc2VudCkuCi0JICovCi0JaWYgKGxlbmd0aCA8IDIpCi0JCWdvdG8gdHJ1bmM7Ci0JVENIRUNLMigqcCwgMik7Ci0gICAgICAgIHBwcF9oZWFkZXIgPSBFWFRSQUNUXzE2QklUUyhwKTsKLQotICAgICAgICBzd2l0Y2gocHBwX2hlYWRlcikgewotICAgICAgICBjYXNlIChQUFBfV0lUSERJUkVDVElPTl9JTiAgPDwgOCB8IFBQUF9DT05UUk9MKToKLSAgICAgICAgICAgIGlmIChlZmxhZykgcHJpbnRmKCJJbiAgIik7Ci0gICAgICAgICAgICBwICs9IDI7Ci0gICAgICAgICAgICBsZW5ndGggLT0gMjsKLSAgICAgICAgICAgIGhkcl9sZW4gKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChQUFBfV0lUSERJUkVDVElPTl9PVVQgPDwgOCB8IFBQUF9DT05UUk9MKToKLSAgICAgICAgICAgIGlmIChlZmxhZykgcHJpbnRmKCJPdXQgIik7Ci0gICAgICAgICAgICBwICs9IDI7Ci0gICAgICAgICAgICBsZW5ndGggLT0gMjsKLSAgICAgICAgICAgIGhkcl9sZW4gKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIChQUFBfQUREUkVTUyA8PCA4IHwgUFBQX0NPTlRST0wpOgotICAgICAgICAgICAgcCArPSAyOwkJCS8qIEFDRkMgbm90IHVzZWQgKi8KLSAgICAgICAgICAgIGxlbmd0aCAtPSAyOwotICAgICAgICAgICAgaGRyX2xlbiArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQlpZiAobGVuZ3RoIDwgMikKLQkJZ290byB0cnVuYzsKLQlUQ0hFQ0soKnApOwotCWlmICgqcCAlIDIpIHsKLQkJcHJvdG8gPSAqcDsJCS8qIFBGQyBpcyB1c2VkICovCi0JCXArKzsKLQkJbGVuZ3RoLS07Ci0JCWhkcl9sZW4rKzsKLQl9IGVsc2UgewotCQlUQ0hFQ0syKCpwLCAyKTsKLQkJcHJvdG8gPSBFWFRSQUNUXzE2QklUUyhwKTsKLQkJcCArPSAyOwotCQlsZW5ndGggLT0gMjsKLQkJaGRyX2xlbiArPSAyOwotCX0KLQotICAgICAgICBpZiAoZWZsYWcpCi0gICAgICAgICAgICBwcmludGYoIiVzICgweCUwNHgpLCBsZW5ndGggJXU6ICIsCi0gICAgICAgICAgICAgICAgICAgdG9rMnN0cihwcHB0eXBlMnN0ciwgInVua25vd24iLCBwcm90byksCi0gICAgICAgICAgICAgICAgICAgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgb2xlbik7Ci0KLQloYW5kbGVfcHBwKHByb3RvLCBwLCBsZW5ndGgpOwotCXJldHVybiAoaGRyX2xlbik7Ci10cnVuYzoKLQlwcmludGYoIlt8cHBwXSIpOwotCXJldHVybiAoMCk7Ci19Ci0KLQotLyogUFBQIEkvRiBwcmludGVyICovCi11X2ludAotcHBwX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotCXJlZ2lzdGVyIHVfaW50IGxlbmd0aCA9IGgtPmxlbjsKLQlyZWdpc3RlciB1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0KLQlpZiAoY2FwbGVuIDwgUFBQX0hEUkxFTikgewotCQlwcmludGYoIlt8cHBwXSIpOwotCQlyZXR1cm4gKGNhcGxlbik7Ci0JfQotCi0jaWYgMAotCS8qCi0JICogWFhYOiBzZWVtcyB0byBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgMiBvY3RldHMgcHJlcGVuZGVkIHRvIGFuCi0JICogYWN0dWFsIFBQUCBmcmFtZS4gVGhlIDFzdCBvY3RldCBsb29rcyBsaWtlIElucHV0L091dHB1dCBmbGFnCi0JICogd2hpbGUgMm5kIG9jdGV0IGlzIHVua25vd24sIGF0IGxlYXN0IHRvIG1lCi0JICogKG1zaGluZG9AbXNoaW5kby5uZXQpLgotCSAqCi0JICogVGhhdCB3YXMgd2hhdCB0aGUgb3JpZ2luYWwgdGNwZHVtcCBjb2RlIGRpZC4KLQkgKgotCSAqIEZyZWVCU0QncyAiaWZfcHBwLmMiICpkb2VzKiBzZXQgdGhlIGZpcnN0IG9jdGV0IHRvIDEgZm9yIG91dGJvdW5kCi0JICogcGFja2V0cyBhbmQgMCBmb3IgaW5ib3VuZCBwYWNrZXRzIC0gYnV0IG9ubHkgaWYgdGhlCi0JICogcHJvdG9jb2wgZmllbGQgaGFzIHRoZSAweDgwMDAgYml0IHNldCAoaS5lLiwgaXQncyBhIG5ldHdvcmsKLQkgKiBjb250cm9sIHByb3RvY29sKTsgaXQgZG9lcyBzbyBiZWZvcmUgcnVubmluZyB0aGUgcGFja2V0IHRocm91Z2gKLQkgKiAiYnBmX2ZpbHRlciIgdG8gc2VlIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQsIGFuZCB0byBzZWUKLQkgKiBpZiB3ZSBzaG91bGQgdXBkYXRlIHRoZSB0aW1lIHdlIHNlbnQgdGhlIG1vc3QgcmVjZW50IHBhY2tldC4uLgotCSAqCi0JICogLi4uYnV0IGl0IHB1dHMgdGhlIG9yaWdpbmFsIGFkZHJlc3MgZmllbGQgYmFjayBhZnRlciBkb2luZwotCSAqIHNvLgotCSAqCi0JICogTmV0QlNEJ3MgImlmX3BwcC5jIiBkb2Vzbid0IHNldCB0aGUgZmlyc3Qgb2N0ZXQgaW4gdGhhdCBmYXNoaW9uLgotCSAqCi0JICogSSBkb24ndCBrbm93IGlmIGFueSBQUFAgaW1wbGVtZW50YXRpb24gaGFuZGVkIHVwIHRvIGEgQlBGCi0JICogZGV2aWNlIHBhY2tldHMgd2l0aCB0aGUgZmlyc3Qgb2N0ZXQgYmVpbmcgMSBmb3Igb3V0Ym91bmQgYW5kCi0JICogMCBmb3IgaW5ib3VuZCBwYWNrZXRzLCBzbyBJIChndXlAYWx1bS5taXQuZWR1KSBkb24ndCBrbm93Ci0JICogd2hldGhlciB0aGF0IGV2ZXIgbmVlZHMgdG8gYmUgY2hlY2tlZCBvciBub3QuCi0JICoKLQkgKiBOb3RlIHRoYXQgTmV0QlNEIGhhcyBhIERMVF9QUFBfU0VSSUFMLCB3aGljaCBpdCB1c2VzIGZvciBQUFAsCi0JICogYW5kIGl0cyB0Y3BkdW1wIGFwcGVhcnMgdG8gYXNzdW1lIHRoYXQgdGhlIGZyYW1lIGFsd2F5cwotCSAqIGJlZ2lucyB3aXRoIGFuIGFkZHJlc3MgZmllbGQgYW5kIGEgY29udHJvbCBmaWVsZCwgYW5kIHRoYXQKLQkgKiB0aGUgYWRkcmVzcyBmaWVsZCBtaWdodCBiZSAweDBmIG9yIDB4OGYsIGZvciBDaXNjbwotCSAqIHBvaW50LXRvLXBvaW50IHdpdGggSERMQyBmcmFtaW5nIGFzIHBlciBzZWN0aW9uIDQuMy4xIG9mIFJGQwotCSAqIDE1NDcsIGFzIHdlbGwgYXMgMHhmZiwgZm9yIFBQUCBpbiBIRExDLWxpa2UgZnJhbWluZyBhcyBwZXIKLQkgKiBSRkMgMTY2Mi4KLQkgKgotCSAqIChJcyB0aGUgQ2lzY28gZnJhbWluZyBpbiBxdWVzdGlvbiB3aGF0IERMVF9DX0hETEMsIGluCi0JICogQlNEL09TLCBpcz8pCi0JICovCi0JaWYgKGVmbGFnKQotCQlwcmludGYoIiVjICU0ZCAlMDJ4ICIsIHBbMF0gPyAnTycgOiAnSScsIGxlbmd0aCwgcFsxXSk7Ci0jZW5kaWYKLQotCXBwcF9wcmludChwLCBsZW5ndGgpOwotCi0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIFBQUCBJL0YgcHJpbnRlciB0byB1c2UgaWYgd2Uga25vdyB0aGF0IFJGQyAxNjYyLXN0eWxlIFBQUCBpbiBIRExDLWxpa2UKLSAqIGZyYW1pbmcsIG9yIENpc2NvIFBQUCB3aXRoIEhETEMgZnJhbWluZyBhcyBwZXIgc2VjdGlvbiA0LjMuMSBvZiBSRkMgMTU0NywKLSAqIGlzIGJlaW5nIHVzZWQgKGkuZS4sIHdlIGRvbid0IGNoZWNrIGZvciBQUFBfQUREUkVTUyBhbmQgUFBQX0NPTlRST0wsCi0gKiBkaXNjYXJkIHRoZW0gKmlmKiB0aG9zZSBhcmUgdGhlIGZpcnN0IHR3byBvY3RldHMsIGFuZCBwYXJzZSB0aGUgcmVtYWluaW5nCi0gKiBwYWNrZXQgYXMgYSBQUFAgcGFja2V0LCBhcyAicHBwX3ByaW50KCkiIGRvZXMpLgotICoKLSAqIFRoaXMgaGFuZGxlcywgZm9yIGV4YW1wbGUsIERMVF9QUFBfU0VSSUFMIGluIE5ldEJTRC4KLSAqLwotdV9pbnQKLXBwcF9oZGxjX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotCXJlZ2lzdGVyIHVfaW50IGxlbmd0aCA9IGgtPmxlbjsKLQlyZWdpc3RlciB1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JdV9pbnQgcHJvdG87Ci0JdV9pbnQgaGRybGVuID0gMDsKLQotCWlmIChjYXBsZW4gPCAyKSB7Ci0JCXByaW50ZigiW3xwcHBdIik7Ci0JCXJldHVybiAoY2FwbGVuKTsKLQl9Ci0KLQlzd2l0Y2ggKHBbMF0pIHsKLQotCWNhc2UgUFBQX0FERFJFU1M6Ci0JCWlmIChjYXBsZW4gPCA0KSB7Ci0JCQlwcmludGYoIlt8cHBwXSIpOwotCQkJcmV0dXJuIChjYXBsZW4pOwotCQl9Ci0KLQkJaWYgKGVmbGFnKQotCQkJcHJpbnRmKCIlMDJ4ICUwMnggJWQgIiwgcFswXSwgcFsxXSwgbGVuZ3RoKTsKLQkJcCArPSAyOwotCQlsZW5ndGggLT0gMjsKLQkJaGRybGVuICs9IDI7Ci0KLQkJcHJvdG8gPSBFWFRSQUNUXzE2QklUUyhwKTsKLQkJcCArPSAyOwotCQlsZW5ndGggLT0gMjsKLQkJaGRybGVuICs9IDI7Ci0JCXByaW50ZigiJXM6ICIsIHRvazJzdHIocHBwdHlwZTJzdHIsICJ1bmtub3duIFBQUCBwcm90b2NvbCAoMHglMDR4KSIsIHByb3RvKSk7Ci0KLQkJaGFuZGxlX3BwcChwcm90bywgcCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENIRExDX1VOSUNBU1Q6Ci0JY2FzZSBDSERMQ19CQ0FTVDoKLQkJcmV0dXJuIChjaGRsY19pZl9wcmludChoLCBwKSk7Ci0KLQlkZWZhdWx0OgotCQlpZiAoZWZsYWcpCi0JCQlwcmludGYoIiUwMnggJTAyeCAlZCAiLCBwWzBdLCBwWzFdLCBsZW5ndGgpOwotCQlwICs9IDI7Ci0JCWxlbmd0aCAtPSAyOwotCQloZHJsZW4gKz0gMjsKLQotCQkvKgotCQkgKiBYWFggLSBOZXRCU0QncyAicHBwX25ldGJzZF9zZXJpYWxfaWZfcHJpbnQoKSIgdHJlYXRzCi0JCSAqIHRoZSBuZXh0IHR3byBvY3RldHMgYXMgYW4gRXRoZXJuZXQgdHlwZTsgZG9lcyB0aGF0Ci0JCSAqIGV2ZXIgaGFwcGVuPwotCQkgKi8KLQkJcHJpbnRmKCJ1bmtub3duIGFkZHIgJTAyeDsgY3RybCAlMDJ4IiwgcFswXSwgcFsxXSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAoaGRybGVuKTsKLX0KLQotI2RlZmluZSBQUFBfQlNESV9IRFJMRU4gMjQKLQotLyogQlNEL09TIHNwZWNpZmljIFBQUCBwcmludGVyICovCi11X2ludAotcHBwX2JzZG9zX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCBfVV8sIHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCBfVV8pCi17Ci0JcmVnaXN0ZXIgaW50IGhkcmxlbmd0aDsKLSNpZmRlZiBfX2JzZGlfXwotCXJlZ2lzdGVyIHVfaW50IGxlbmd0aCA9IGgtPmxlbjsKLQlyZWdpc3RlciB1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JdV9pbnQxNl90IHB0eXBlOwotCWNvbnN0IHVfY2hhciAqcTsKLQlpbnQgaTsKLQotCWlmIChjYXBsZW4gPCBQUFBfQlNESV9IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfHBwcF0iKTsKLQkJcmV0dXJuIChjYXBsZW4pCi0JfQotCi0JaGRybGVuZ3RoID0gMDsKLQotI2lmIDAKLQlpZiAocFswXSA9PSBQUFBfQUREUkVTUyAmJiBwWzFdID09IFBQUF9DT05UUk9MKSB7Ci0JCWlmIChlZmxhZykKLQkJCXByaW50ZigiJTAyeCAlMDJ4ICIsIHBbMF0sIHBbMV0pOwotCQlwICs9IDI7Ci0JCWhkcmxlbmd0aCA9IDI7Ci0JfQotCi0JaWYgKGVmbGFnKQotCQlwcmludGYoIiVkICIsIGxlbmd0aCk7Ci0JLyogUmV0cmlldmUgdGhlIHByb3RvY29sIHR5cGUgKi8KLQlpZiAoKnAgJiAwMSkgewotCQkvKiBDb21wcmVzc2VkIHByb3RvY29sIGZpZWxkICovCi0JCXB0eXBlID0gKnA7Ci0JCWlmIChlZmxhZykKLQkJCXByaW50ZigiJTAyeCAiLCBwdHlwZSk7Ci0JCXArKzsKLQkJaGRybGVuZ3RoICs9IDE7Ci0JfSBlbHNlIHsKLQkJLyogVW4tY29tcHJlc3NlZCBwcm90b2NvbCBmaWVsZCAqLwotCQlwdHlwZSA9IG50b2hzKCoodV9pbnQxNl90ICopcCk7Ci0JCWlmIChlZmxhZykKLQkJCXByaW50ZigiJTA0eCAiLCBwdHlwZSk7Ci0JCXAgKz0gMjsKLQkJaGRybGVuZ3RoICs9IDI7Ci0JfQotI2Vsc2UKLQlwdHlwZSA9IDA7CS8qWFhYKi8KLQlpZiAoZWZsYWcpCi0JCXByaW50ZigiJWMgIiwgcFtTTENfRElSXSA/ICdPJyA6ICdJJyk7Ci0JaWYgKHBbU0xDX0xMSExdKSB7Ci0JCS8qIGxpbmsgbGV2ZWwgaGVhZGVyICovCi0JCXN0cnVjdCBwcHBfaGVhZGVyICpwaDsKLQotCQlxID0gcCArIFNMQ19CUEZIRFJMRU47Ci0JCXBoID0gKHN0cnVjdCBwcHBfaGVhZGVyICopcTsKLQkJaWYgKHBoLT5waGRyX2FkZHIgPT0gUFBQX0FERFJFU1MKLQkJICYmIHBoLT5waGRyX2N0bCA9PSBQUFBfQ09OVFJPTCkgewotCQkJaWYgKGVmbGFnKQotCQkJCXByaW50ZigiJTAyeCAlMDJ4ICIsIHFbMF0sIHFbMV0pOwotCQkJcHR5cGUgPSBudG9ocyhwaC0+cGhkcl90eXBlKTsKLQkJCWlmIChlZmxhZyAmJiAocHR5cGUgPT0gUFBQX1ZKQyB8fCBwdHlwZSA9PSBQUFBfVkpOQykpIHsKLQkJCQlwcmludGYoIiVzICIsIHRvazJzdHIocHBwdHlwZTJzdHIsCi0JCQkJCQkicHJvdG8tIyVkIiwgcHR5cGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChlZmxhZykgewotCQkJCXByaW50ZigiTExIPVsiKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgcFtTTENfTExITF07IGkrKykKLQkJCQkJcHJpbnRmKCIlMDJ4IiwgcVtpXSk7Ci0JCQkJcHJpbnRmKCJdICIpOwotCQkJfQotCQl9Ci0JfQotCWlmIChlZmxhZykKLQkJcHJpbnRmKCIlZCAiLCBsZW5ndGgpOwotCWlmIChwW1NMQ19DSExdKSB7Ci0JCXEgPSBwICsgU0xDX0JQRkhEUkxFTiArIHBbU0xDX0xMSExdOwotCi0JCXN3aXRjaCAocHR5cGUpIHsKLQkJY2FzZSBQUFBfVkpDOgotCQkJcHR5cGUgPSB2amNfcHJpbnQocSwgcHR5cGUpOwotCQkJaGRybGVuZ3RoID0gUFBQX0JTRElfSERSTEVOOwotCQkJcCArPSBoZHJsZW5ndGg7Ci0JCQlzd2l0Y2ggKHB0eXBlKSB7Ci0JCQljYXNlIFBQUF9JUDoKLQkJCQlpcF9wcmludChwLCBsZW5ndGgpOwotCQkJCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JCQljYXNlIFBQUF9JUFY2OgotCQkJCWlwNl9wcmludChwLCBsZW5ndGgpOwotCQkJCWJyZWFrOwotI2VuZGlmCi0JCQljYXNlIFBQUF9NUExTX1VDQVNUOgotCQkJY2FzZSBQUFBfTVBMU19NQ0FTVDoKLQkJCQltcGxzX3ByaW50KHAsIGxlbmd0aCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlnb3RvIHByaW50eDsKLQkJY2FzZSBQUFBfVkpOQzoKLQkJCXB0eXBlID0gdmpjX3ByaW50KHEsIHB0eXBlKTsKLQkJCWhkcmxlbmd0aCA9IFBQUF9CU0RJX0hEUkxFTjsKLQkJCXAgKz0gaGRybGVuZ3RoOwotCQkJc3dpdGNoIChwdHlwZSkgewotCQkJY2FzZSBQUFBfSVA6Ci0JCQkJaXBfcHJpbnQocCwgbGVuZ3RoKTsKLQkJCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCQkJY2FzZSBQUFBfSVBWNjoKLQkJCQlpcDZfcHJpbnQocCwgbGVuZ3RoKTsKLQkJCQlicmVhazsKLSNlbmRpZgotCQkJY2FzZSBQUFBfTVBMU19VQ0FTVDoKLQkJCWNhc2UgUFBQX01QTFNfTUNBU1Q6Ci0JCQkJbXBsc19wcmludChwLCBsZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZ290byBwcmludHg7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAoZWZsYWcpIHsKLQkJCQlwcmludGYoIkNIPVsiKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgcFtTTENfTExITF07IGkrKykKLQkJCQkJcHJpbnRmKCIlMDJ4IiwgcVtpXSk7Ci0JCQkJcHJpbnRmKCJdICIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQloZHJsZW5ndGggPSBQUFBfQlNESV9IRFJMRU47Ci0jZW5kaWYKLQotCWxlbmd0aCAtPSBoZHJsZW5ndGg7Ci0JcCArPSBoZHJsZW5ndGg7Ci0KLQlzd2l0Y2ggKHB0eXBlKSB7Ci0JY2FzZSBQUFBfSVA6Ci0JCWlwX3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JY2FzZSBQUFBfSVBWNjoKLQkJaXA2X3ByaW50KHAsIGxlbmd0aCk7Ci0JCWJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgUFBQX01QTFNfVUNBU1Q6Ci0gICAgICAgIGNhc2UgUFBQX01QTFNfTUNBU1Q6Ci0gICAgICAgICAgICAgICAgbXBsc19wcmludChwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiJXMgIiwgdG9rMnN0cihwcHB0eXBlMnN0ciwgInVua25vd24gUFBQIHByb3RvY29sICgweCUwNHgpIiwgcHR5cGUpKTsKLQl9Ci0KLXByaW50eDoKLSNlbHNlIC8qIF9fYnNkaSAqLwotCWhkcmxlbmd0aCA9IDA7Ci0jZW5kaWYgLyogX19ic2RpX18gKi8KLQlyZXR1cm4gKGhkcmxlbmd0aCk7Ci19Ci0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGMtc3R5bGU6IHdoaXRlc21pdGgKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKi8KZGlmZiAtLWdpdCBhL3ByaW50LXBwcG9lLmMgYi9wcmludC1wcHBvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjliNWVlLi4wMDAwMDAwCi0tLSBhL3ByaW50LXBwcG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICogCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEdyZWcgU3RhcmsgPGdzc3RhcmtAbWl0LmVkdT4gCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0iQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1wcHBvZS5jLHYgMS4zMC4yLjEgMjAwNS8wNC8yNiAxOTo0ODo1NiBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgInBwcC5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotI2luY2x1ZGUgImV0aGVyLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgkJCS8qIG11c3QgY29tZSBhZnRlciBpbnRlcmZhY2UuaCAqLwotCi0vKiBDb2RlcyAqLwotZW51bSB7Ci0JUFBQT0VfUEFESSA9IDB4MDksCi0JUFBQT0VfUEFETyA9IDB4MDcsCi0JUFBQT0VfUEFEUiA9IDB4MTksCi0JUFBQT0VfUEFEUyA9IDB4NjUsCi0JUFBQT0VfUEFEVCA9IDB4YTcKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHBwcG9lY29kZTJzdHJbXSA9IHsKLQl7IFBQUE9FX1BBREksICJQQURJIiB9LAotCXsgUFBQT0VfUEFETywgIlBBRE8iIH0sCi0JeyBQUFBPRV9QQURSLCAiUEFEUiIgfSwKLQl7IFBQUE9FX1BBRFMsICJQQURTIiB9LAotCXsgUFBQT0VfUEFEVCwgIlBBRFQiIH0sCi0JeyAwLCAiIiB9LCAvKiBQUFAgRGF0YSAqLwotCXsgMCwgTlVMTCB9Ci19OwotCi0vKiBUYWdzICovCi1lbnVtIHsKLQlQUFBPRV9FT0wgPSAwLAotCVBQUE9FX1NFUlZJQ0VfTkFNRSA9IDB4MDEwMSwKLQlQUFBPRV9BQ19OQU1FID0gMHgwMTAyLAotCVBQUE9FX0hPU1RfVU5JUSA9IDB4MDEwMywKLQlQUFBPRV9BQ19DT09LSUUgPSAweDAxMDQsCi0JUFBQT0VfVkVORE9SID0gMHgwMTA1LAotCVBQUE9FX1JFTEFZX1NJRCA9IDB4MDExMCwKLQlQUFBPRV9TRVJWSUNFX05BTUVfRVJST1IgPSAweDAyMDEsCi0JUFBQT0VfQUNfU1lTVEVNX0VSUk9SID0gMHgwMjAyLAotCVBQUE9FX0dFTkVSSUNfRVJST1IgPSAweDAyMDMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHBwcG9ldGFnMnN0cltdID0gewotCXsgUFBQT0VfRU9MLCAiRU9MIiB9LAotCXsgUFBQT0VfU0VSVklDRV9OQU1FLCAiU2VydmljZS1OYW1lIiB9LAotCXsgUFBQT0VfQUNfTkFNRSwgIkFDLU5hbWUiIH0sCi0JeyBQUFBPRV9IT1NUX1VOSVEsICJIb3N0LVVuaXEiIH0sCi0JeyBQUFBPRV9BQ19DT09LSUUsICJBQy1Db29raWUiIH0sCi0JeyBQUFBPRV9WRU5ET1IsICJWZW5kb3ItU3BlY2lmaWMiIH0sCi0JeyBQUFBPRV9SRUxBWV9TSUQsICJSZWxheS1TZXNzaW9uLUlEIiB9LAotCXsgUFBQT0VfU0VSVklDRV9OQU1FX0VSUk9SLCAiU2VydmljZS1OYW1lLUVycm9yIiB9LAotCXsgUFBQT0VfQUNfU1lTVEVNX0VSUk9SLCAiQUMtU3lzdGVtLUVycm9yIiB9LAotCXsgUFBQT0VfR0VORVJJQ19FUlJPUiwgIkdlbmVyaWMtRXJyb3IiIH0sCi0JeyAwLCBOVUxMIH0KLX07Ci0KLSNkZWZpbmUgUFBQT0VfSERSTEVOIDYKLSNkZWZpbmUgTUFYVEFHUFJJTlQgODAKLQotdV9pbnQKLXBwcG9lX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwKQotewotCXJldHVybiAocHBwb2VfcHJpbnQocCwgaC0+bGVuKSk7Ci19Ci0KLXVfaW50Ci1wcHBvZV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCi17Ci0JdV9pbnQxNl90IHBwcG9lX3ZlciwgcHBwb2VfdHlwZSwgcHBwb2VfY29kZSwgcHBwb2Vfc2Vzc2lvbmlkOwotCXVfaW50IHBwcG9lX2xlbmd0aDsKLQljb25zdCB1X2NoYXIgKnBwcG9lX3BhY2tldCwgKnBwcG9lX3BheWxvYWQ7Ci0KLQlpZiAobGVuZ3RoIDwgUFBQT0VfSERSTEVOKSB7Ci0JCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLXBwcG9lICV1IiwgbGVuZ3RoKTsKLQkJcmV0dXJuIChsZW5ndGgpOwotCX0KLQlsZW5ndGggLT0gUFBQT0VfSERSTEVOOwotCXBwcG9lX3BhY2tldCA9IGJwOwotCVRDSEVDSzIoKnBwcG9lX3BhY2tldCwgUFBQT0VfSERSTEVOKTsKLQlwcHBvZV92ZXIgID0gKHBwcG9lX3BhY2tldFswXSAmIDB4RjApID4+IDQ7Ci0JcHBwb2VfdHlwZSAgPSAocHBwb2VfcGFja2V0WzBdICYgMHgwRik7Ci0JcHBwb2VfY29kZSA9IHBwcG9lX3BhY2tldFsxXTsKLQlwcHBvZV9zZXNzaW9uaWQgPSBFWFRSQUNUXzE2QklUUyhwcHBvZV9wYWNrZXQgKyAyKTsKLQlwcHBvZV9sZW5ndGggICAgPSBFWFRSQUNUXzE2QklUUyhwcHBvZV9wYWNrZXQgKyA0KTsKLQlwcHBvZV9wYXlsb2FkID0gcHBwb2VfcGFja2V0ICsgUFBQT0VfSERSTEVOOwotCi0JaWYgKHBwcG9lX3ZlciAhPSAxKSB7Ci0JCXByaW50ZigiIFt2ZXIgJWRdIixwcHBvZV92ZXIpOwotCX0KLQlpZiAocHBwb2VfdHlwZSAhPSAxKSB7Ci0JCXByaW50ZigiIFt0eXBlICVkXSIscHBwb2VfdHlwZSk7Ci0JfQotCi0JcHJpbnRmKCJQUFBvRSAlcyIsIHRvazJzdHIocHBwb2Vjb2RlMnN0ciwgIlBBRC0leCIsIHBwcG9lX2NvZGUpKTsKLQlpZiAocHBwb2VfY29kZSA9PSBQUFBPRV9QQURJICYmIHBwcG9lX2xlbmd0aCA+IDE0ODQgLSBQUFBPRV9IRFJMRU4pIHsKLQkJcHJpbnRmKCIgW2xlbiAldSFdIixwcHBvZV9sZW5ndGgpOwotCX0KLQlpZiAocHBwb2VfbGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCXByaW50ZigiIFtsZW4gJXUgPiAldSFdIiwgcHBwb2VfbGVuZ3RoLCBsZW5ndGgpOwotCQlwcHBvZV9sZW5ndGggPSBsZW5ndGg7Ci0JfQotCWlmIChwcHBvZV9zZXNzaW9uaWQpIHsKLQkJcHJpbnRmKCIgW3NlcyAweCV4XSIsIHBwcG9lX3Nlc3Npb25pZCk7Ci0JfQotCi0JaWYgKHBwcG9lX2NvZGUpIHsKLQkJLyogUFBQIHNlc3Npb24gcGFja2V0cyBkb24ndCBjb250YWluIHRhZ3MgKi8KLQkJdV9zaG9ydCB0YWdfdHlwZSA9IDB4ZmZmZiwgdGFnX2xlbjsKLQkJY29uc3QgdV9jaGFyICpwID0gcHBwb2VfcGF5bG9hZDsKLQotCQkvKgotCQkgKiBsb29wIGludmFyaWFudDoKLQkJICogcCBwb2ludHMgdG8gY3VycmVudCB0YWcsCi0JCSAqIHRhZ190eXBlIGlzIHByZXZpb3VzIHRhZyBvciAweGZmZmYgZm9yIGZpcnN0IGl0ZXJhdGlvbgotCQkgKi8KLQkJd2hpbGUgKHRhZ190eXBlICYmIHAgPCBwcHBvZV9wYXlsb2FkICsgcHBwb2VfbGVuZ3RoKSB7Ci0JCQlUQ0hFQ0syKCpwLCA0KTsKLQkJCXRhZ190eXBlID0gRVhUUkFDVF8xNkJJVFMocCk7Ci0JCQl0YWdfbGVuID0gRVhUUkFDVF8xNkJJVFMocCArIDIpOwotCQkJcCArPSA0OwotCQkJLyogcCBwb2ludHMgdG8gdGFnX3ZhbHVlICovCi0KLQkJCWlmICh0YWdfbGVuKSB7Ci0JCQkJdW5zaWduZWQgaXNhc2NpaSA9IDAsIGlzZ2FyYmFnZSA9IDA7Ci0JCQkJY29uc3QgdV9jaGFyICp2ID0gcDsKLQkJCQljaGFyIHRhZ19zdHJbTUFYVEFHUFJJTlRdOwotCQkJCXVuc2lnbmVkIHRhZ19zdHJfbGVuID0gMDsKLQotCQkJCS8qIFRPRE8gcHJpbnQgVVRGLTggZGVjb2RlZCB0ZXh0ICovCi0JCQkJVENIRUNLMigqcCwgdGFnX2xlbik7Ci0JCQkJZm9yICh2ID0gcDsgdiA8IHAgKyB0YWdfbGVuICYmIHRhZ19zdHJfbGVuIDwgTUFYVEFHUFJJTlQtMTsgdisrKQotCQkJCQlpZiAoKnYgPj0gMzIgJiYgKnYgPCAxMjcpIHsKLQkJCQkJCXRhZ19zdHJbdGFnX3N0cl9sZW4rK10gPSAqdjsKLQkJCQkJCWlzYXNjaWkrKzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRhZ19zdHJbdGFnX3N0cl9sZW4rK10gPSAnLic7Ci0JCQkJCQlpc2dhcmJhZ2UrKzsKLQkJCQkJfQotCQkJCXRhZ19zdHJbdGFnX3N0cl9sZW5dID0gMDsKLQotCQkJCWlmIChpc2FzY2lpID4gaXNnYXJiYWdlKSB7Ci0JCQkJCXByaW50ZigiIFslcyBcIiUqLipzXCJdIiwKLQkJCQkJICAgICAgIHRvazJzdHIocHBwb2V0YWcyc3RyLCAiVEFHLTB4JXgiLCB0YWdfdHlwZSksCi0JCQkJCSAgICAgICAoaW50KXRhZ19zdHJfbGVuLAotCQkJCQkgICAgICAgKGludCl0YWdfc3RyX2xlbiwKLQkJCQkJICAgICAgIHRhZ19zdHIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIFByaW50IGhleCwgbm90IGZhc3QgdG8gYWJ1c2UgcHJpbnRmIGJ1dCB0aGlzIGRvZXNuJ3QgZ2V0IHVzZWQgbXVjaCAqLwotCQkJCQlwcmludGYoIiBbJXMgMHgiLCB0b2syc3RyKHBwcG9ldGFnMnN0ciwgIlRBRy0weCV4IiwgdGFnX3R5cGUpKTsKLQkJCQkJZm9yICh2PXA7IHY8cCt0YWdfbGVuOyB2KyspIHsKLQkJCQkJCXByaW50ZigiJTAyWCIsICp2KTsKLQkJCQkJfQotCQkJCQlwcmludGYoIl0iKTsKLQkJCQl9Ci0JCQkJCi0KLQkJCX0gZWxzZQotCQkJCXByaW50ZigiIFslc10iLCB0b2syc3RyKHBwcG9ldGFnMnN0ciwKLQkJCQkgICAgIlRBRy0weCV4IiwgdGFnX3R5cGUpKTsKLQotCQkJcCArPSB0YWdfbGVuOwotCQkJLyogcCBwb2ludHMgdG8gbmV4dCB0YWcgKi8KLQkJfQotCQlyZXR1cm4gKDApOwotCX0gZWxzZSB7Ci0JCS8qIFBQUG9FIGRhdGEgKi8KLQkJcHJpbnRmKCIgIik7Ci0JCXJldHVybiAoUFBQT0VfSERSTEVOICsgcHBwX3ByaW50KHBwcG9lX3BheWxvYWQsIHBwcG9lX2xlbmd0aCkpOwotCX0KLQotdHJ1bmM6Ci0JcHJpbnRmKCJbfHBwcG9lXSIpOwotCXJldHVybiAoUFBQT0VfSERSTEVOKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LXBwdHAuYyBiL3ByaW50LXBwdHAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwMDU4OS4uMDAwMDAwMAotLS0gYS9wcmludC1wcHRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICoKLSAqIFBQVFAgc3VwcG9ydCBjb250cmlidXRlZCBieSBNb3Rvbm9yaSBTaGluZG8gKG1zaGluZG9AbXNoaW5kby5uZXQpCi0gKi8KLQotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcHB0cC5jLHYgMS4xMS4yLjEgMjAwNi8wNi8yMyAwMjowNzoyNyBoYW5uZXMgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi1zdGF0aWMgY2hhciB0c3RyW10gPSAiIFt8cHB0cF0iOwotCi0jZGVmaW5lIFBQVFBfTVNHX1RZUEVfQ1RSTAkxCS8qIENvbnRyb2wgTWVzc2FnZSAqLwotI2RlZmluZSBQUFRQX01TR19UWVBFX01HTVQJMgkvKiBNYW5hZ2VtZW50IE1lc3NhZ2UgKGN1cnJlbnRseSBub3QgdXNlZCAqLwotI2RlZmluZSBQUFRQX01BR0lDX0NPT0tJRQkweDFhMmIzYzRkCS8qIGZvciBzYW5pdHkgY2hlY2sgKi8KLQotI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU0NDUlEJMQotI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU0NDUlAJMgotI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU3RvcENDUlEJMwotI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfU3RvcENDUlAJNAotI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfRUNIT1JRCTUKLSNkZWZpbmUgUFBUUF9DVFJMX01TR19UWVBFX0VDSE9SUAk2Ci0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JRCQk3Ci0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JQCQk4Ci0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9JQ1JRCQk5Ci0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9JQ1JQCQkxMAotI2RlZmluZSBQUFRQX0NUUkxfTVNHX1RZUEVfSUNDTgkJMTEKLSNkZWZpbmUgUFBUUF9DVFJMX01TR19UWVBFX0NDUlEJCTEyCi0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9DRE4JCTEzCi0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9XRU4JCTE0Ci0jZGVmaW5lIFBQVFBfQ1RSTF9NU0dfVFlQRV9TTEkJCTE1Ci0KLSNkZWZpbmUgUFBUUF9GUkFNSU5HX0NBUF9BU1lOQ19NQVNLCTB4MDAwMDAwMDEgICAgICAvKiBBeW5jaHJvbm91cyAqLwotI2RlZmluZSBQUFRQX0ZSQU1JTkdfQ0FQX1NZTkNfTUFTSwkweDAwMDAwMDAyICAgICAgLyogU3luY2hyb25vdXMgKi8KLQotI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfQU5BTE9HX01BU0sJMHgwMDAwMDAwMSAgICAgIC8qIEFuYWxvZyAqLwotI2RlZmluZSBQUFRQX0JFQVJFUl9DQVBfRElHSVRBTF9NQVNLCTB4MDAwMDAwMDIgICAgICAvKiBEaWdpdGFsICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpwcHRwX21lc3NhZ2VfdHlwZV9zdHJpbmdbXSA9IHsKLQkiTk9UX0RFRklORUQiLAkJLyogMCAgTm90IGRlZmluZWQgaW4gdGhlIFJGQzI2MzcgKi8KLQkiU0NDUlEiLAkJLyogMSAgU3RhcnQtQ29udHJvbC1Db25uZWN0aW9uLVJlcXVlc3QgKi8KLQkiU0NDUlAiLAkJLyogMiAgU3RhcnQtQ29udHJvbC1Db25uZWN0aW9uLVJlcGx5ICovCi0JIlN0b3BDQ1JRIiwJCS8qIDMgIFN0b3AtQ29udHJvbC1Db25uZWN0aW9uLVJlcXVlc3QgKi8KLQkiU3RvcENDUlAiLAkJLyogNCAgU3RvcC1Db250cm9sLUNvbm5lY3Rpb24tUmVwbHkgKi8KLQkiRUNIT1JRIiwJCS8qIDUgIEVjaG8gUmVxdWVzdCAqLwotCSJFQ0hPUlAiLAkJLyogNiAgRWNobyBSZXBseSAqLwotCi0JIk9DUlEiLAkJCS8qIDcgIE91dGdvaW5nLUNhbGwtUmVxdWVzdCAqLwotCSJPQ1JQIiwJCQkvKiA4ICBPdXRnb2luZy1DYWxsLVJlcGx5ICovCi0JIklDUlEiLAkJCS8qIDkgIEluY29taW5nLUNhbGwtUmVxdWVzdCAqLwotCSJJQ1JQIiwJCQkvKiAxMCBJbmNvbWluZy1DYWxsLVJlcGx5ICovCi0JIklDQ04iLAkJCS8qIDExIEluY29taW5nLUNhbGwtQ29ubmVjdGVkICovCi0JIkNDUlEiLAkJCS8qIDEyIENhbGwtQ2xlYXItUmVxdWVzdCAqLwotCSJDRE4iLAkJCS8qIDEzIENhbGwtRGlzY29ubmVjdC1Ob3RpZnkgKi8KLQotCSJXRU4iLAkJCS8qIDE0IFdBTi1FcnJvci1Ob3RpZnkgKi8KLQotCSJTTEkiCQkJLyogMTUgU2V0LUxpbmstSW5mbyAqLwotI2RlZmluZSBQUFRQX01BWF9NU0dUWVBFX0lOREVYCTE2Ci19OwotCi0vKiBjb21tb24gZm9yIGFsbCBQUFRQIGNvbnRyb2wgbWVzc2FnZXMgKi8KLXN0cnVjdCBwcHRwX2hkciB7Ci0JdV9pbnQxNl90IGxlbmd0aDsKLQl1X2ludDE2X3QgbXNnX3R5cGU7Ci0JdV9pbnQzMl90IG1hZ2ljX2Nvb2tpZTsKLQl1X2ludDE2X3QgY3RybF9tc2dfdHlwZTsKLQl1X2ludDE2X3QgcmVzZXJ2ZWQwOwotfTsKLQotc3RydWN0IHBwdHBfbXNnX3NjY3JxIHsKLQl1X2ludDE2X3QgcHJvdG9fdmVyOwotCXVfaW50MTZfdCByZXNlcnZlZDE7Ci0JdV9pbnQzMl90IGZyYW1pbmdfY2FwOwotCXVfaW50MzJfdCBiZWFyZXJfY2FwOwotCXVfaW50MTZfdCBtYXhfY2hhbm5lbDsKLQl1X2ludDE2X3QgZmlybV9yZXY7Ci0JdV9jaGFyIGhvc3RuYW1lWzY0XTsKLQl1X2NoYXIgdmVuZG9yWzY0XTsKLX07Ci0KLXN0cnVjdCBwcHRwX21zZ19zY2NycCB7Ci0JdV9pbnQxNl90IHByb3RvX3ZlcjsKLQl1X2ludDhfdCByZXN1bHRfY29kZTsKLQl1X2ludDhfdCBlcnJfY29kZTsKLQl1X2ludDMyX3QgZnJhbWluZ19jYXA7Ci0JdV9pbnQzMl90IGJlYXJlcl9jYXA7Ci0JdV9pbnQxNl90IG1heF9jaGFubmVsOwotCXVfaW50MTZfdCBmaXJtX3JldjsKLQl1X2NoYXIgaG9zdG5hbWVbNjRdOwotCXVfY2hhciB2ZW5kb3JbNjRdOwotfTsKLQotc3RydWN0IHBwdHBfbXNnX3N0b3BjY3JxIHsKLQl1X2ludDhfdCByZWFzb247Ci0JdV9pbnQ4X3QgcmVzZXJ2ZWQxOwotCXVfaW50MTZfdCByZXNlcnZlZDI7Ci19OwotCi1zdHJ1Y3QgcHB0cF9tc2dfc3RvcGNjcnAgewotCXVfaW50OF90IHJlc3VsdF9jb2RlOwotCXVfaW50OF90IGVycl9jb2RlOwotCXVfaW50MTZfdCByZXNlcnZlZDE7Ci19OwotCi1zdHJ1Y3QgcHB0cF9tc2dfZWNob3JxIHsKLQl1X2ludDMyX3QgaWQ7Ci19OwotCi1zdHJ1Y3QgcHB0cF9tc2dfZWNob3JwIHsKLQl1X2ludDMyX3QgaWQ7Ci0JdV9pbnQ4X3QgcmVzdWx0X2NvZGU7Ci0JdV9pbnQ4X3QgZXJyX2NvZGU7Ci0JdV9pbnQxNl90IHJlc2VydmVkMTsKLX07Ci0KLXN0cnVjdCBwcHRwX21zZ19vY3JxIHsKLQl1X2ludDE2X3QgY2FsbF9pZDsKLQl1X2ludDE2X3QgY2FsbF9zZXI7Ci0JdV9pbnQzMl90IG1pbl9icHM7Ci0JdV9pbnQzMl90IG1heF9icHM7Ci0JdV9pbnQzMl90IGJlYXJlcl90eXBlOwotCXVfaW50MzJfdCBmcmFtaW5nX3R5cGU7Ci0JdV9pbnQxNl90IHJlY3Zfd2luc2l6OwotCXVfaW50MTZfdCBwa3RfcHJvY19kZWxheTsKLQl1X2ludDE2X3QgcGhvbmVfbm9fbGVuOwotCXVfaW50MTZfdCByZXNlcnZlZDE7Ci0JdV9jaGFyIHBob25lX25vWzY0XTsKLQl1X2NoYXIgc3ViYWRkcls2NF07Ci19OwotCi1zdHJ1Y3QgcHB0cF9tc2dfb2NycCB7Ci0JdV9pbnQxNl90IGNhbGxfaWQ7Ci0JdV9pbnQxNl90IHBlZXJfY2FsbF9pZDsKLQl1X2ludDhfdCByZXN1bHRfY29kZTsKLQl1X2ludDhfdCBlcnJfY29kZTsKLQl1X2ludDE2X3QgY2F1c2VfY29kZTsKLQl1X2ludDMyX3QgY29ubl9zcGVlZDsKLQl1X2ludDE2X3QgcmVjdl93aW5zaXo7Ci0JdV9pbnQxNl90IHBrdF9wcm9jX2RlbGF5OwotCXVfaW50MzJfdCBwaHlfY2hhbl9pZDsKLX07Ci0KLXN0cnVjdCBwcHRwX21zZ19pY3JxIHsKLQl1X2ludDE2X3QgY2FsbF9pZDsKLQl1X2ludDE2X3QgY2FsbF9zZXI7Ci0JdV9pbnQzMl90IGJlYXJlcl90eXBlOwotCXVfaW50MzJfdCBwaHlfY2hhbl9pZDsKLQl1X2ludDE2X3QgZGlhbGVkX25vX2xlbjsKLQl1X2ludDE2X3QgZGlhbGluZ19ub19sZW47Ci0JdV9jaGFyIGRpYWxlZF9ub1s2NF07CQkvKiBETklTICovCi0JdV9jaGFyIGRpYWxpbmdfbm9bNjRdOwkJLyogQ0xJRCAqLwotCXVfY2hhciBzdWJhZGRyWzY0XTsKLX07Ci0KLXN0cnVjdCBwcHRwX21zZ19pY3JwIHsKLQl1X2ludDE2X3QgY2FsbF9pZDsKLQl1X2ludDE2X3QgcGVlcl9jYWxsX2lkOwotCXVfaW50OF90IHJlc3VsdF9jb2RlOwotCXVfaW50OF90IGVycl9jb2RlOwotCXVfaW50MTZfdCByZWN2X3dpbnNpejsKLQl1X2ludDE2X3QgcGt0X3Byb2NfZGVsYXk7Ci0JdV9pbnQxNl90IHJlc2VydmVkMTsKLX07Ci0KLXN0cnVjdCBwcHRwX21zZ19pY2NuIHsKLQl1X2ludDE2X3QgcGVlcl9jYWxsX2lkOwotCXVfaW50MTZfdCByZXNlcnZlZDE7Ci0JdV9pbnQzMl90IGNvbm5fc3BlZWQ7Ci0JdV9pbnQxNl90IHJlY3Zfd2luc2l6OwotCXVfaW50MTZfdCBwa3RfcHJvY19kZWxheTsKLQl1X2ludDMyX3QgZnJhbWluZ190eXBlOwotfTsKLQotc3RydWN0IHBwdHBfbXNnX2NjcnEgewotCXVfaW50MTZfdCBjYWxsX2lkOwotCXVfaW50MTZfdCByZXNlcnZlZDE7Ci19OwotCi1zdHJ1Y3QgcHB0cF9tc2dfY2RuIHsKLQl1X2ludDE2X3QgY2FsbF9pZDsKLQl1X2ludDhfdCByZXN1bHRfY29kZTsKLQl1X2ludDhfdCBlcnJfY29kZTsKLQl1X2ludDE2X3QgY2F1c2VfY29kZTsKLQl1X2ludDE2X3QgcmVzZXJ2ZWQxOwotCXVfY2hhciBjYWxsX3N0YXRzWzEyOF07Ci19OwotCi1zdHJ1Y3QgcHB0cF9tc2dfd2VuIHsKLQl1X2ludDE2X3QgcGVlcl9jYWxsX2lkOwotCXVfaW50MTZfdCByZXNlcnZlZDE7Ci0JdV9pbnQzMl90IGNyY19lcnI7Ci0JdV9pbnQzMl90IGZyYW1pbmdfZXJyOwotCXVfaW50MzJfdCBoYXJkd2FyZV9vdmVycnVuOwotCXVfaW50MzJfdCBidWZmZXJfb3ZlcnJ1bjsKLQl1X2ludDMyX3QgdGltZW91dF9lcnI7Ci0JdV9pbnQzMl90IGFsaWduX2VycjsKLX07Ci0KLXN0cnVjdCBwcHRwX21zZ19zbGkgewotCXVfaW50MTZfdCBwZWVyX2NhbGxfaWQ7Ci0JdV9pbnQxNl90IHJlc2VydmVkMTsKLQl1X2ludDMyX3Qgc2VuZF9hY2NtOwotCXVfaW50MzJfdCByZWN2X2FjY207Ci19OwotCi0vKiBhdHRyaWJ1dGVzIHRoYXQgYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGFib3ZlIG1lc3NhZ2VzOgotCi0gICBOdW1iZXIgb2YKLSAgIG9jY3VyZW5jZSAgICBhdHRyaWJ1dGVzCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAyICAgICAgICAgdV9pbnQzMl90IGJlYXJlcl9jYXA7Ci0gICAgICAyICAgICAgICAgdV9pbnQzMl90IGJlYXJlcl90eXBlOwotICAgICAgNiAgICAgICAgIHVfaW50MTZfdCBjYWxsX2lkOwotICAgICAgMiAgICAgICAgIHVfaW50MTZfdCBjYWxsX3NlcjsKLSAgICAgIDIgICAgICAgICB1X2ludDE2X3QgY2F1c2VfY29kZTsKLSAgICAgIDIgICAgICAgICB1X2ludDMyX3QgY29ubl9zcGVlZDsKLSAgICAgIDYgICAgICAgICB1X2ludDhfdCBlcnJfY29kZTsKLSAgICAgIDIgICAgICAgICB1X2ludDE2X3QgZmlybV9yZXY7Ci0gICAgICAyICAgICAgICAgdV9pbnQzMl90IGZyYW1pbmdfY2FwOwotICAgICAgMiAgICAgICAgIHVfaW50MzJfdCBmcmFtaW5nX3R5cGU7Ci0gICAgICAyICAgICAgICAgdV9jaGFyIGhvc3RuYW1lWzY0XTsKLSAgICAgIDIgICAgICAgICB1X2ludDMyX3QgaWQ7Ci0gICAgICAyICAgICAgICAgdV9pbnQxNl90IG1heF9jaGFubmVsOwotICAgICAgNSAgICAgICAgIHVfaW50MTZfdCBwZWVyX2NhbGxfaWQ7Ci0gICAgICAyICAgICAgICAgdV9pbnQzMl90IHBoeV9jaGFuX2lkOwotICAgICAgNCAgICAgICAgIHVfaW50MTZfdCBwa3RfcHJvY19kZWxheTsKLSAgICAgIDIgICAgICAgICB1X2ludDE2X3QgcHJvdG9fdmVyOwotICAgICAgNCAgICAgICAgIHVfaW50MTZfdCByZWN2X3dpbnNpejsKLSAgICAgIDIgICAgICAgICB1X2ludDhfdCByZXNlcnZlZDE7Ci0gICAgICA5ICAgICAgICAgdV9pbnQxNl90IHJlc2VydmVkMTsKLSAgICAgIDYgICAgICAgICB1X2ludDhfdCByZXN1bHRfY29kZTsKLSAgICAgIDIgICAgICAgICB1X2NoYXIgc3ViYWRkcls2NF07Ci0gICAgICAyICAgICAgICAgdV9jaGFyIHZlbmRvcls2NF07Ci0KLSAgc28gSSB3aWxsIHByZXBhcmUgcHJpbnQgb3V0IGZ1bmN0aW9ucyBmb3IgdGhlc2UgYXR0cmlidXRlcyAoZXhjZXB0IGZvcgotICByZXNlcnZlZCopLgotKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEF0dHJpYnV0ZS1zcGVjaWZpYyBwcmludCBvdXQgZnVuY3Rpb25zICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBJbiB0aGVzZSBhdHRyaWJ1dGUtc3BlY2lmaWMgcHJpbnQtb3V0IGZ1bmN0aW9ucywgaXQndCBub3QgbmVjZXNzYXJ5Ci0gICB0byBkbyBUQ0hFQ0sgYmVjYXVzZSB0aGV5IGFyZSBhbHJlYWR5IGNoZWNrZWQgaW4gdGhlIGNhbGxlciBvZgotICAgdGhlc2UgZnVuY3Rpb25zLiAqLwotCi1zdGF0aWMgdm9pZAotcHB0cF9iZWFyZXJfY2FwX3ByaW50KGNvbnN0IHVfaW50MzJfdCAqYmVhcmVyX2NhcCkKLXsKLQlwcmludGYoIiBCRUFSRVJfQ0FQKCIpOwotCWlmIChFWFRSQUNUXzMyQklUUyhiZWFyZXJfY2FwKSAmIFBQVFBfQkVBUkVSX0NBUF9ESUdJVEFMX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIkQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoYmVhcmVyX2NhcCkgJiBQUFRQX0JFQVJFUl9DQVBfQU5BTE9HX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIkEiKTsKLSAgICAgICAgfQotCXByaW50ZigiKSIpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9iZWFyZXJfdHlwZV9wcmludChjb25zdCB1X2ludDMyX3QgKmJlYXJlcl90eXBlKQotewotCXByaW50ZigiIEJFQVJFUl9UWVBFKCIpOwotCXN3aXRjaCAoRVhUUkFDVF8zMkJJVFMoYmVhcmVyX3R5cGUpKSB7Ci0JY2FzZSAxOgotCQlwcmludGYoIkEiKTsJLyogQW5hbG9nICovCi0JCWJyZWFrOwotCWNhc2UgMjoKLQkJcHJpbnRmKCJEIik7CS8qIERpZ2l0YWwgKi8KLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlwcmludGYoIkFueSIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIj8iKTsKLQkJYnJlYWs7Ci0gICAgICAgIH0KLQlwcmludGYoIikiKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfY2FsbF9pZF9wcmludChjb25zdCB1X2ludDE2X3QgKmNhbGxfaWQpCi17Ci0JcHJpbnRmKCIgQ0FMTF9JRCgldSkiLCBFWFRSQUNUXzE2QklUUyhjYWxsX2lkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2NhbGxfc2VyX3ByaW50KGNvbnN0IHVfaW50MTZfdCAqY2FsbF9zZXIpCi17Ci0JcHJpbnRmKCIgQ0FMTF9TRVJfTlVNKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKGNhbGxfc2VyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2NhdXNlX2NvZGVfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpjYXVzZV9jb2RlKQotewotCXByaW50ZigiIENBVVNFX0NPREUoJXUpIiwgRVhUUkFDVF8xNkJJVFMoY2F1c2VfY29kZSkpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9jb25uX3NwZWVkX3ByaW50KGNvbnN0IHVfaW50MzJfdCAqY29ubl9zcGVlZCkKLXsKLQlwcmludGYoIiBDT05OX1NQRUVEKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKGNvbm5fc3BlZWQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfZXJyX2NvZGVfcHJpbnQoY29uc3QgdV9pbnQ4X3QgKmVycl9jb2RlKQotewotCXByaW50ZigiIEVSUl9DT0RFKCV1IiwgKmVycl9jb2RlKTsKLQlpZiAodmZsYWcpIHsKLQkJc3dpdGNoICgqZXJyX2NvZGUpIHsKLQkJY2FzZSAwOgotCQkJcHJpbnRmKCI6Tm9uZSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCXByaW50ZigiOk5vdC1Db25uZWN0ZWQiKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlwcmludGYoIjpCYWQtRm9ybWF0Iik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcHJpbnRmKCI6QmFkLVZhbHVkZSIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCXByaW50ZigiOk5vLVJlc291cmNlIik7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgotCQkJcHJpbnRmKCI6QmFkLUNhbGwtSUQiKTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlwcmludGYoIjpQQUMtRXJyb3IiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRmKCI6PyIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcHJpbnRmKCIpIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2Zpcm1fcmV2X3ByaW50KGNvbnN0IHVfaW50MTZfdCAqZmlybV9yZXYpCi17Ci0JcHJpbnRmKCIgRklSTV9SRVYoJXUpIiwgRVhUUkFDVF8xNkJJVFMoZmlybV9yZXYpKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfZnJhbWluZ19jYXBfcHJpbnQoY29uc3QgdV9pbnQzMl90ICpmcmFtaW5nX2NhcCkKLXsKLQlwcmludGYoIiBGUkFNRV9DQVAoIik7Ci0JaWYgKEVYVFJBQ1RfMzJCSVRTKGZyYW1pbmdfY2FwKSAmIFBQVFBfRlJBTUlOR19DQVBfQVNZTkNfTUFTSykgewotICAgICAgICAgICAgICAgIHByaW50ZigiQSIpOwkJLyogQXN5bmMgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoZnJhbWluZ19jYXApICYgUFBUUF9GUkFNSU5HX0NBUF9TWU5DX01BU0spIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIlMiKTsJCS8qIFN5bmMgKi8KLSAgICAgICAgfQotCXByaW50ZigiKSIpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9mcmFtaW5nX3R5cGVfcHJpbnQoY29uc3QgdV9pbnQzMl90ICpmcmFtaW5nX3R5cGUpCi17Ci0JcHJpbnRmKCIgRlJBTUVfVFlQRSgiKTsKLQlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKGZyYW1pbmdfdHlwZSkpIHsKLQljYXNlIDE6Ci0JCXByaW50ZigiQSIpOwkJLyogQXN5bmMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlwcmludGYoIlMiKTsJCS8qIFN5bmMgKi8KLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlwcmludGYoIkUiKTsJCS8qIEVpdGhlciAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGYoIj8iKTsKLQkJYnJlYWs7Ci0JfQotCXByaW50ZigiKSIpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9ob3N0bmFtZV9wcmludChjb25zdCB1X2NoYXIgKmhvc3RuYW1lKQotewotCXByaW50ZigiIEhPU1ROQU1FKCUuNjRzKSIsIGhvc3RuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfaWRfcHJpbnQoY29uc3QgdV9pbnQzMl90ICppZCkKLXsKLQlwcmludGYoIiBJRCgldSkiLCBFWFRSQUNUXzMyQklUUyhpZCkpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9tYXhfY2hhbm5lbF9wcmludChjb25zdCB1X2ludDE2X3QgKm1heF9jaGFubmVsKQotewotCXByaW50ZigiIE1BWF9DSEFOKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKG1heF9jaGFubmVsKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX3BlZXJfY2FsbF9pZF9wcmludChjb25zdCB1X2ludDE2X3QgKnBlZXJfY2FsbF9pZCkKLXsKLQlwcmludGYoIiBQRUVSX0NBTExfSUQoJXUpIiwgRVhUUkFDVF8xNkJJVFMocGVlcl9jYWxsX2lkKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX3BoeV9jaGFuX2lkX3ByaW50KGNvbnN0IHVfaW50MzJfdCAqcGh5X2NoYW5faWQpCi17Ci0JcHJpbnRmKCIgUEhZX0NIQU5fSUQoJXUpIiwgRVhUUkFDVF8zMkJJVFMocGh5X2NoYW5faWQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfcGt0X3Byb2NfZGVsYXlfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpwa3RfcHJvY19kZWxheSkKLXsKLQlwcmludGYoIiBQUk9DX0RFTEFZKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKHBrdF9wcm9jX2RlbGF5KSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX3Byb3RvX3Zlcl9wcmludChjb25zdCB1X2ludDE2X3QgKnByb3RvX3ZlcikKLXsKLQlwcmludGYoIiBQUk9UT19WRVIoJXUuJXUpIiwJLyogVmVyc2lvbi5SZXZpc2lvbiAqLwotCSAgICAgICBFWFRSQUNUXzE2QklUUyhwcm90b192ZXIpID4+IDgsCi0JICAgICAgIEVYVFJBQ1RfMTZCSVRTKHByb3RvX3ZlcikgJiAweGZmKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfcmVjdl93aW5zaXpfcHJpbnQoY29uc3QgdV9pbnQxNl90ICpyZWN2X3dpbnNpeikKLXsKLQlwcmludGYoIiBSRUNWX1dJTigldSkiLCBFWFRSQUNUXzE2QklUUyhyZWN2X3dpbnNpeikpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9yZXN1bHRfY29kZV9wcmludChjb25zdCB1X2ludDhfdCAqcmVzdWx0X2NvZGUsIGludCBjdHJsX21zZ190eXBlKQotewotCXByaW50ZigiIFJFU1VMVF9DT0RFKCV1IiwgKnJlc3VsdF9jb2RlKTsKLQlpZiAodmZsYWcpIHsKLQkJc3dpdGNoIChjdHJsX21zZ190eXBlKSB7Ci0JCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1NDQ1JQOgotCQkJc3dpdGNoICgqcmVzdWx0X2NvZGUpIHsKLQkJCWNhc2UgMToKLQkJCQlwcmludGYoIjpTdWNjZXNzZnVsIGNoYW5uZWwgZXN0YWJsaXNobWVudCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXByaW50ZigiOkdlbmVyYWwgZXJyb3IiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlwcmludGYoIjpDb21tYW5kIGNoYW5uZWwgYWxyZWFkeSBleGlzdHMiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlwcmludGYoIjpSZXF1ZXN0ZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gZXN0YWJsaXNoIGEgY29tbWFuZCBjaGFubmVsIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDU6Ci0JCQkJcHJpbnRmKCI6VGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3RlciBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiOj8iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9TdG9wQ0NSUDoKLQkJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfRUNIT1JQOgotCQkJc3dpdGNoICgqcmVzdWx0X2NvZGUpIHsKLQkJCWNhc2UgMToKLQkJCQlwcmludGYoIjpPSyIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRmKCI6PyIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX09DUlA6Ci0JCQlzd2l0Y2ggKCpyZXN1bHRfY29kZSkgewotCQkJY2FzZSAxOgotCQkJCXByaW50ZigiOkNvbm5lY3RlZCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlwcmludGYoIjpObyBDYXJyaWVyIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJcHJpbnRmKCI6QnVzeSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA1OgotCQkJCXByaW50ZigiOk5vIERpYWwgVG9uZSIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJCXByaW50ZigiOlRpbWUtb3V0Iik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJcHJpbnRmKCI6RG8gTm90IEFjY2VwdCIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlwcmludGYoIjo/Iik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfSUNSUDoKLQkJCXN3aXRjaCAoKnJlc3VsdF9jb2RlKSB7Ci0JCQljYXNlIDE6Ci0JCQkJcHJpbnRmKCI6Q29ubmVjdCIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlwcmludGYoIjpEbyBOb3QgQWNjZXB0Iik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ZigiOj8iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9DRE46Ci0JCQlzd2l0Y2ggKCpyZXN1bHRfY29kZSkgewotCQkJY2FzZSAxOgotCQkJCXByaW50ZigiOkxvc3QgQ2FycmllciIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCXByaW50ZigiOkdlbmVyYWwgRXJyb3IiKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlwcmludGYoIjpBZG1pbiBTaHV0ZG93biIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJCXByaW50ZigiOlJlcXVlc3QiKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRmKCI6PyIpOwotCQkJCWJyZWFrOwotCQkJYnJlYWs7Ci0JCQl9Ci0JCWRlZmF1bHQ6Ci0JCQkvKiBhc3NlcnRpb24gZXJyb3IgKi8KLQkJCWJyZWFrOwotCQl9Ci0JfQotCXByaW50ZigiKSIpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9zdWJhZGRyX3ByaW50KGNvbnN0IHVfY2hhciAqc3ViYWRkcikKLXsKLQlwcmludGYoIiBTVUJfQUREUiglLjY0cykiLCBzdWJhZGRyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfdmVuZG9yX3ByaW50KGNvbnN0IHVfY2hhciAqdmVuZG9yKQotewotCXByaW50ZigiIFZFTkRPUiglLjY0cykiLCB2ZW5kb3IpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUFBUUCBtZXNzYWdlIHByaW50IG91dCBmdW5jdGlvbnMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcHB0cF9zY2NycV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfc2NjcnEgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfc2NjcnEgKilkYXQ7Ci0KLQlUQ0hFQ0socHRyLT5wcm90b192ZXIpOwotCXBwdHBfcHJvdG9fdmVyX3ByaW50KCZwdHItPnByb3RvX3Zlcik7Ci0JVENIRUNLKHB0ci0+cmVzZXJ2ZWQxKTsKLQlUQ0hFQ0socHRyLT5mcmFtaW5nX2NhcCk7Ci0JcHB0cF9mcmFtaW5nX2NhcF9wcmludCgmcHRyLT5mcmFtaW5nX2NhcCk7Ci0JVENIRUNLKHB0ci0+YmVhcmVyX2NhcCk7Ci0JcHB0cF9iZWFyZXJfY2FwX3ByaW50KCZwdHItPmJlYXJlcl9jYXApOwotCVRDSEVDSyhwdHItPm1heF9jaGFubmVsKTsKLQlwcHRwX21heF9jaGFubmVsX3ByaW50KCZwdHItPm1heF9jaGFubmVsKTsKLQlUQ0hFQ0socHRyLT5maXJtX3Jldik7Ci0JcHB0cF9maXJtX3Jldl9wcmludCgmcHRyLT5maXJtX3Jldik7Ci0JVENIRUNLKHB0ci0+aG9zdG5hbWUpOwotCXBwdHBfaG9zdG5hbWVfcHJpbnQoJnB0ci0+aG9zdG5hbWVbMF0pOwotCVRDSEVDSyhwdHItPnZlbmRvcik7Ci0JcHB0cF92ZW5kb3JfcHJpbnQoJnB0ci0+dmVuZG9yWzBdKTsKLQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCIlcyIsIHRzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9zY2NycF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfc2NjcnAgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfc2NjcnAgKilkYXQ7Ci0KLQlUQ0hFQ0socHRyLT5wcm90b192ZXIpOwotCXBwdHBfcHJvdG9fdmVyX3ByaW50KCZwdHItPnByb3RvX3Zlcik7Ci0JVENIRUNLKHB0ci0+cmVzdWx0X2NvZGUpOwotCXBwdHBfcmVzdWx0X2NvZGVfcHJpbnQoJnB0ci0+cmVzdWx0X2NvZGUsIFBQVFBfQ1RSTF9NU0dfVFlQRV9TQ0NSUCk7Ci0JVENIRUNLKHB0ci0+ZXJyX2NvZGUpOwotCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOwotCVRDSEVDSyhwdHItPmZyYW1pbmdfY2FwKTsKLQlwcHRwX2ZyYW1pbmdfY2FwX3ByaW50KCZwdHItPmZyYW1pbmdfY2FwKTsKLQlUQ0hFQ0socHRyLT5iZWFyZXJfY2FwKTsKLQlwcHRwX2JlYXJlcl9jYXBfcHJpbnQoJnB0ci0+YmVhcmVyX2NhcCk7Ci0JVENIRUNLKHB0ci0+bWF4X2NoYW5uZWwpOwotCXBwdHBfbWF4X2NoYW5uZWxfcHJpbnQoJnB0ci0+bWF4X2NoYW5uZWwpOwotCVRDSEVDSyhwdHItPmZpcm1fcmV2KTsKLQlwcHRwX2Zpcm1fcmV2X3ByaW50KCZwdHItPmZpcm1fcmV2KTsKLQlUQ0hFQ0socHRyLT5ob3N0bmFtZSk7Ci0JcHB0cF9ob3N0bmFtZV9wcmludCgmcHRyLT5ob3N0bmFtZVswXSk7Ci0JVENIRUNLKHB0ci0+dmVuZG9yKTsKLQlwcHRwX3ZlbmRvcl9wcmludCgmcHRyLT52ZW5kb3JbMF0pOwotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiVzIiwgdHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX3N0b3BjY3JxX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXN0cnVjdCBwcHRwX21zZ19zdG9wY2NycSAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19zdG9wY2NycSAqKWRhdDsKLQotCVRDSEVDSyhwdHItPnJlYXNvbik7Ci0JcHJpbnRmKCIgUkVBU09OKCV1IiwgcHRyLT5yZWFzb24pOwotCWlmICh2ZmxhZykgewotCQlzd2l0Y2ggKHB0ci0+cmVhc29uKSB7Ci0JCWNhc2UgMToKLQkJCXByaW50ZigiOk5vbmUiKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlwcmludGYoIjpTdG9wLVByb3RvY29sIik7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcHJpbnRmKCI6U3RvcC1Mb2NhbC1TaHV0ZG93biIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoIjo/Iik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlwcmludGYoIikiKTsKLQlUQ0hFQ0socHRyLT5yZXNlcnZlZDEpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMik7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfc3RvcGNjcnBfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCi17Ci0Jc3RydWN0IHBwdHBfbXNnX3N0b3BjY3JwICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX3N0b3BjY3JwICopZGF0OwotCi0JVENIRUNLKHB0ci0+cmVzdWx0X2NvZGUpOwotCXBwdHBfcmVzdWx0X2NvZGVfcHJpbnQoJnB0ci0+cmVzdWx0X2NvZGUsIFBQVFBfQ1RSTF9NU0dfVFlQRV9TdG9wQ0NSUCk7Ci0JVENIRUNLKHB0ci0+ZXJyX2NvZGUpOwotCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfZWNob3JxX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXN0cnVjdCBwcHRwX21zZ19lY2hvcnEgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfZWNob3JxICopZGF0OwotCi0JVENIRUNLKHB0ci0+aWQpOwotCXBwdHBfaWRfcHJpbnQoJnB0ci0+aWQpOwotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiVzIiwgdHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2VjaG9ycF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfZWNob3JwICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX2VjaG9ycCAqKWRhdDsKLQotCVRDSEVDSyhwdHItPmlkKTsKLQlwcHRwX2lkX3ByaW50KCZwdHItPmlkKTsKLQlUQ0hFQ0socHRyLT5yZXN1bHRfY29kZSk7Ci0JcHB0cF9yZXN1bHRfY29kZV9wcmludCgmcHRyLT5yZXN1bHRfY29kZSwgUFBUUF9DVFJMX01TR19UWVBFX0VDSE9SUCk7Ci0JVENIRUNLKHB0ci0+ZXJyX2NvZGUpOwotCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfb2NycV9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfb2NycSAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19vY3JxICopZGF0OwotCi0JVENIRUNLKHB0ci0+Y2FsbF9pZCk7Ci0JcHB0cF9jYWxsX2lkX3ByaW50KCZwdHItPmNhbGxfaWQpOwotCVRDSEVDSyhwdHItPmNhbGxfc2VyKTsKLQlwcHRwX2NhbGxfc2VyX3ByaW50KCZwdHItPmNhbGxfc2VyKTsKLQlUQ0hFQ0socHRyLT5taW5fYnBzKTsKLQlwcmludGYoIiBNSU5fQlBTKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPm1pbl9icHMpKTsKLQlUQ0hFQ0socHRyLT5tYXhfYnBzKTsKLQlwcmludGYoIiBNQVhfQlBTKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPm1heF9icHMpKTsKLQlUQ0hFQ0socHRyLT5iZWFyZXJfdHlwZSk7Ci0JcHB0cF9iZWFyZXJfdHlwZV9wcmludCgmcHRyLT5iZWFyZXJfdHlwZSk7Ci0JVENIRUNLKHB0ci0+ZnJhbWluZ190eXBlKTsKLQlwcHRwX2ZyYW1pbmdfdHlwZV9wcmludCgmcHRyLT5mcmFtaW5nX3R5cGUpOwotCVRDSEVDSyhwdHItPnJlY3Zfd2luc2l6KTsKLQlwcHRwX3JlY3Zfd2luc2l6X3ByaW50KCZwdHItPnJlY3Zfd2luc2l6KTsKLQlUQ0hFQ0socHRyLT5wa3RfcHJvY19kZWxheSk7Ci0JcHB0cF9wa3RfcHJvY19kZWxheV9wcmludCgmcHRyLT5wa3RfcHJvY19kZWxheSk7Ci0JVENIRUNLKHB0ci0+cGhvbmVfbm9fbGVuKTsKLQlwcmludGYoIiBQSE9ORV9OT19MRU4oJXUpIiwgRVhUUkFDVF8xNkJJVFMoJnB0ci0+cGhvbmVfbm9fbGVuKSk7Ci0JVENIRUNLKHB0ci0+cmVzZXJ2ZWQxKTsKLQlUQ0hFQ0socHRyLT5waG9uZV9ubyk7Ci0JcHJpbnRmKCIgUEhPTkVfTk8oJS42NHMpIiwgcHRyLT5waG9uZV9ubyk7Ci0JVENIRUNLKHB0ci0+c3ViYWRkcik7Ci0JcHB0cF9zdWJhZGRyX3ByaW50KCZwdHItPnN1YmFkZHJbMF0pOwotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiVzIiwgdHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX29jcnBfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCi17Ci0Jc3RydWN0IHBwdHBfbXNnX29jcnAgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfb2NycCAqKWRhdDsKLQotCVRDSEVDSyhwdHItPmNhbGxfaWQpOwotCXBwdHBfY2FsbF9pZF9wcmludCgmcHRyLT5jYWxsX2lkKTsKLQlUQ0hFQ0socHRyLT5wZWVyX2NhbGxfaWQpOwotCXBwdHBfcGVlcl9jYWxsX2lkX3ByaW50KCZwdHItPnBlZXJfY2FsbF9pZCk7Ci0JVENIRUNLKHB0ci0+cmVzdWx0X2NvZGUpOwotCXBwdHBfcmVzdWx0X2NvZGVfcHJpbnQoJnB0ci0+cmVzdWx0X2NvZGUsIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JQKTsKLQlUQ0hFQ0socHRyLT5lcnJfY29kZSk7Ci0JcHB0cF9lcnJfY29kZV9wcmludCgmcHRyLT5lcnJfY29kZSk7Ci0JVENIRUNLKHB0ci0+Y2F1c2VfY29kZSk7Ci0JcHB0cF9jYXVzZV9jb2RlX3ByaW50KCZwdHItPmNhdXNlX2NvZGUpOwotCVRDSEVDSyhwdHItPmNvbm5fc3BlZWQpOwotCXBwdHBfY29ubl9zcGVlZF9wcmludCgmcHRyLT5jb25uX3NwZWVkKTsKLQlUQ0hFQ0socHRyLT5yZWN2X3dpbnNpeik7Ci0JcHB0cF9yZWN2X3dpbnNpel9wcmludCgmcHRyLT5yZWN2X3dpbnNpeik7Ci0JVENIRUNLKHB0ci0+cGt0X3Byb2NfZGVsYXkpOwotCXBwdHBfcGt0X3Byb2NfZGVsYXlfcHJpbnQoJnB0ci0+cGt0X3Byb2NfZGVsYXkpOwotCVRDSEVDSyhwdHItPnBoeV9jaGFuX2lkKTsKLQlwcHRwX3BoeV9jaGFuX2lkX3ByaW50KCZwdHItPnBoeV9jaGFuX2lkKTsKLQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCIlcyIsIHRzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotcHB0cF9pY3JxX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXN0cnVjdCBwcHRwX21zZ19pY3JxICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX2ljcnEgKilkYXQ7Ci0KLQlUQ0hFQ0socHRyLT5jYWxsX2lkKTsKLQlwcHRwX2NhbGxfaWRfcHJpbnQoJnB0ci0+Y2FsbF9pZCk7Ci0JVENIRUNLKHB0ci0+Y2FsbF9zZXIpOwotCXBwdHBfY2FsbF9zZXJfcHJpbnQoJnB0ci0+Y2FsbF9zZXIpOwotCVRDSEVDSyhwdHItPmJlYXJlcl90eXBlKTsKLQlwcHRwX2JlYXJlcl90eXBlX3ByaW50KCZwdHItPmJlYXJlcl90eXBlKTsKLQlUQ0hFQ0socHRyLT5waHlfY2hhbl9pZCk7Ci0JcHB0cF9waHlfY2hhbl9pZF9wcmludCgmcHRyLT5waHlfY2hhbl9pZCk7Ci0JVENIRUNLKHB0ci0+ZGlhbGVkX25vX2xlbik7Ci0JcHJpbnRmKCIgRElBTEVEX05PX0xFTigldSkiLCBFWFRSQUNUXzE2QklUUygmcHRyLT5kaWFsZWRfbm9fbGVuKSk7Ci0JVENIRUNLKHB0ci0+ZGlhbGluZ19ub19sZW4pOwotCXByaW50ZigiIERJQUxJTkdfTk9fTEVOKCV1KSIsIEVYVFJBQ1RfMTZCSVRTKCZwdHItPmRpYWxpbmdfbm9fbGVuKSk7Ci0JVENIRUNLKHB0ci0+ZGlhbGVkX25vKTsKLQlwcmludGYoIiBESUFMRURfTk8oJS42NHMpIiwgcHRyLT5kaWFsZWRfbm8pOwotCVRDSEVDSyhwdHItPmRpYWxpbmdfbm8pOwotCXByaW50ZigiIERJQUxJTkdfTk8oJS42NHMpIiwgcHRyLT5kaWFsaW5nX25vKTsKLQlUQ0hFQ0socHRyLT5zdWJhZGRyKTsKLQlwcHRwX3N1YmFkZHJfcHJpbnQoJnB0ci0+c3ViYWRkclswXSk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfaWNycF9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfaWNycCAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19pY3JwICopZGF0OwotCi0JVENIRUNLKHB0ci0+Y2FsbF9pZCk7Ci0JcHB0cF9jYWxsX2lkX3ByaW50KCZwdHItPmNhbGxfaWQpOwotCVRDSEVDSyhwdHItPnBlZXJfY2FsbF9pZCk7Ci0JcHB0cF9wZWVyX2NhbGxfaWRfcHJpbnQoJnB0ci0+cGVlcl9jYWxsX2lkKTsKLQlUQ0hFQ0socHRyLT5yZXN1bHRfY29kZSk7Ci0JcHB0cF9yZXN1bHRfY29kZV9wcmludCgmcHRyLT5yZXN1bHRfY29kZSwgUFBUUF9DVFJMX01TR19UWVBFX0lDUlApOwotCVRDSEVDSyhwdHItPmVycl9jb2RlKTsKLQlwcHRwX2Vycl9jb2RlX3ByaW50KCZwdHItPmVycl9jb2RlKTsKLQlUQ0hFQ0socHRyLT5yZWN2X3dpbnNpeik7Ci0JcHB0cF9yZWN2X3dpbnNpel9wcmludCgmcHRyLT5yZWN2X3dpbnNpeik7Ci0JVENIRUNLKHB0ci0+cGt0X3Byb2NfZGVsYXkpOwotCXBwdHBfcGt0X3Byb2NfZGVsYXlfcHJpbnQoJnB0ci0+cGt0X3Byb2NfZGVsYXkpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfaWNjbl9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfaWNjbiAqcHRyID0gKHN0cnVjdCBwcHRwX21zZ19pY2NuICopZGF0OwotCi0JVENIRUNLKHB0ci0+cGVlcl9jYWxsX2lkKTsKLQlwcHRwX3BlZXJfY2FsbF9pZF9wcmludCgmcHRyLT5wZWVyX2NhbGxfaWQpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7Ci0JVENIRUNLKHB0ci0+Y29ubl9zcGVlZCk7Ci0JcHB0cF9jb25uX3NwZWVkX3ByaW50KCZwdHItPmNvbm5fc3BlZWQpOwotCVRDSEVDSyhwdHItPnJlY3Zfd2luc2l6KTsKLQlwcHRwX3JlY3Zfd2luc2l6X3ByaW50KCZwdHItPnJlY3Zfd2luc2l6KTsKLQlUQ0hFQ0socHRyLT5wa3RfcHJvY19kZWxheSk7Ci0JcHB0cF9wa3RfcHJvY19kZWxheV9wcmludCgmcHRyLT5wa3RfcHJvY19kZWxheSk7Ci0JVENIRUNLKHB0ci0+ZnJhbWluZ190eXBlKTsKLQlwcHRwX2ZyYW1pbmdfdHlwZV9wcmludCgmcHRyLT5mcmFtaW5nX3R5cGUpOwotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiVzIiwgdHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2NjcnFfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQpCi17Ci0Jc3RydWN0IHBwdHBfbXNnX2NjcnEgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfY2NycSAqKWRhdDsKLQotCVRDSEVDSyhwdHItPmNhbGxfaWQpOwotCXBwdHBfY2FsbF9pZF9wcmludCgmcHRyLT5jYWxsX2lkKTsKLQlUQ0hFQ0socHRyLT5yZXNlcnZlZDEpOwotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiVzIiwgdHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcHRwX2Nkbl9wcmludChjb25zdCB1X2NoYXIgKmRhdCkKLXsKLQlzdHJ1Y3QgcHB0cF9tc2dfY2RuICpwdHIgPSAoc3RydWN0IHBwdHBfbXNnX2NkbiAqKWRhdDsKLQotCVRDSEVDSyhwdHItPmNhbGxfaWQpOwotCXBwdHBfY2FsbF9pZF9wcmludCgmcHRyLT5jYWxsX2lkKTsKLQlUQ0hFQ0socHRyLT5yZXN1bHRfY29kZSk7Ci0JcHB0cF9yZXN1bHRfY29kZV9wcmludCgmcHRyLT5yZXN1bHRfY29kZSwgUFBUUF9DVFJMX01TR19UWVBFX0NETik7Ci0JVENIRUNLKHB0ci0+ZXJyX2NvZGUpOwotCXBwdHBfZXJyX2NvZGVfcHJpbnQoJnB0ci0+ZXJyX2NvZGUpOwotCVRDSEVDSyhwdHItPmNhdXNlX2NvZGUpOwotCXBwdHBfY2F1c2VfY29kZV9wcmludCgmcHRyLT5jYXVzZV9jb2RlKTsKLQlUQ0hFQ0socHRyLT5yZXNlcnZlZDEpOwotCVRDSEVDSyhwdHItPmNhbGxfc3RhdHMpOwotCXByaW50ZigiIENBTExfU1RBVFMoJS4xMjhzKSIsIHB0ci0+Y2FsbF9zdGF0cyk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfd2VuX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXN0cnVjdCBwcHRwX21zZ193ZW4gKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfd2VuICopZGF0OwotCi0JVENIRUNLKHB0ci0+cGVlcl9jYWxsX2lkKTsKLQlwcHRwX3BlZXJfY2FsbF9pZF9wcmludCgmcHRyLT5wZWVyX2NhbGxfaWQpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7Ci0JVENIRUNLKHB0ci0+Y3JjX2Vycik7Ci0JcHJpbnRmKCIgQ1JDX0VSUigldSkiLCBFWFRSQUNUXzMyQklUUygmcHRyLT5jcmNfZXJyKSk7Ci0JVENIRUNLKHB0ci0+ZnJhbWluZ19lcnIpOwotCXByaW50ZigiIEZSQU1JTkdfRVJSKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPmZyYW1pbmdfZXJyKSk7Ci0JVENIRUNLKHB0ci0+aGFyZHdhcmVfb3ZlcnJ1bik7Ci0JcHJpbnRmKCIgSEFSRFdBUkVfT1ZFUlJVTigldSkiLCBFWFRSQUNUXzMyQklUUygmcHRyLT5oYXJkd2FyZV9vdmVycnVuKSk7Ci0JVENIRUNLKHB0ci0+YnVmZmVyX292ZXJydW4pOwotCXByaW50ZigiIEJVRkZFUl9PVkVSUlVOKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPmJ1ZmZlcl9vdmVycnVuKSk7Ci0JVENIRUNLKHB0ci0+dGltZW91dF9lcnIpOwotCXByaW50ZigiIFRJTUVPVVRfRVJSKCV1KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPnRpbWVvdXRfZXJyKSk7Ci0JVENIRUNLKHB0ci0+YWxpZ25fZXJyKTsKLQlwcmludGYoIiBBTElHTl9FUlIoJXUpIiwgRVhUUkFDVF8zMkJJVFMoJnB0ci0+YWxpZ25fZXJyKSk7Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiJXMiLCB0c3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXBwdHBfc2xpX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCXN0cnVjdCBwcHRwX21zZ19zbGkgKnB0ciA9IChzdHJ1Y3QgcHB0cF9tc2dfc2xpICopZGF0OwotCi0JVENIRUNLKHB0ci0+cGVlcl9jYWxsX2lkKTsKLQlwcHRwX3BlZXJfY2FsbF9pZF9wcmludCgmcHRyLT5wZWVyX2NhbGxfaWQpOwotCVRDSEVDSyhwdHItPnJlc2VydmVkMSk7Ci0JVENIRUNLKHB0ci0+c2VuZF9hY2NtKTsKLQlwcmludGYoIiBTRU5EX0FDQ00oMHglMDh4KSIsIEVYVFJBQ1RfMzJCSVRTKCZwdHItPnNlbmRfYWNjbSkpOwotCVRDSEVDSyhwdHItPnJlY3ZfYWNjbSk7Ci0JcHJpbnRmKCIgUkVDVl9BQ0NNKDB4JTA4eCkiLCBFWFRSQUNUXzMyQklUUygmcHRyLT5yZWN2X2FjY20pKTsKLQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCIlcyIsIHRzdHIpOwotfQotCi12b2lkCi1wcHRwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0KQotewotCWNvbnN0IHN0cnVjdCBwcHRwX2hkciAqaGRyOwotCXVfaW50MzJfdCBtYzsKLQl1X2ludDE2X3QgY3RybF9tc2dfdHlwZTsKLQotCXByaW50ZigiOiBwcHRwIik7Ci0KLQloZHIgPSAoc3RydWN0IHBwdHBfaGRyICopZGF0OwotCi0JVENIRUNLKGhkci0+bGVuZ3RoKTsKLQlpZiAodmZsYWcpIHsKLQkJcHJpbnRmKCIgTGVuZ3RoPSV1IiwgRVhUUkFDVF8xNkJJVFMoJmhkci0+bGVuZ3RoKSk7Ci0JfQotCVRDSEVDSyhoZHItPm1zZ190eXBlKTsKLQlpZiAodmZsYWcpIHsKLQkJc3dpdGNoKEVYVFJBQ1RfMTZCSVRTKCZoZHItPm1zZ190eXBlKSkgewotCQljYXNlIFBQVFBfTVNHX1RZUEVfQ1RSTDoKLQkJCXByaW50ZigiIENUUkwtTVNHIik7Ci0JCQlicmVhazsKLQkJY2FzZSBQUFRQX01TR19UWVBFX01HTVQ6Ci0JCQlwcmludGYoIiBNR01ULU1TRyIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoIiBVTktOT1dOLU1TRy1UWVBFIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCVRDSEVDSyhoZHItPm1hZ2ljX2Nvb2tpZSk7Ci0JbWMgPSBFWFRSQUNUXzMyQklUUygmaGRyLT5tYWdpY19jb29raWUpOwotCWlmIChtYyAhPSBQUFRQX01BR0lDX0NPT0tJRSkgewotCQlwcmludGYoIiBVTkVYUEVDVEVEIE1hZ2ljLUNvb2tpZSEhKCUwOHgpIiwgbWMpOwotCX0KLQlpZiAodmZsYWcgfHwgbWMgIT0gUFBUUF9NQUdJQ19DT09LSUUpIHsKLQkJcHJpbnRmKCIgTWFnaWMtQ29va2llPSUwOHgiLCBtYyk7Ci0JfQotCVRDSEVDSyhoZHItPmN0cmxfbXNnX3R5cGUpOwotCWN0cmxfbXNnX3R5cGUgPSBFWFRSQUNUXzE2QklUUygmaGRyLT5jdHJsX21zZ190eXBlKTsKLQlpZiAoY3RybF9tc2dfdHlwZSA8IFBQVFBfTUFYX01TR1RZUEVfSU5ERVgpIHsKLQkJcHJpbnRmKCIgQ1RSTF9NU0dUWVBFPSVzIiwKLQkJICAgICAgIHBwdHBfbWVzc2FnZV90eXBlX3N0cmluZ1tjdHJsX21zZ190eXBlXSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCIgVU5LTk9XTl9DVFJMX01TR1RZUEUoJXUpIiwgY3RybF9tc2dfdHlwZSk7Ci0JfQotCVRDSEVDSyhoZHItPnJlc2VydmVkMCk7Ci0KLQlkYXQgKz0gMTI7Ci0KLQlzd2l0Y2goY3RybF9tc2dfdHlwZSkgewotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1NDQ1JROgotCQlwcHRwX3NjY3JxX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1NDQ1JQOgotCQlwcHRwX3NjY3JwX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1N0b3BDQ1JROgotCQlwcHRwX3N0b3BjY3JxX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1N0b3BDQ1JQOgotCQlwcHRwX3N0b3BjY3JwX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX0VDSE9SUToKLQkJcHB0cF9lY2hvcnFfcHJpbnQoZGF0KTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfRUNIT1JQOgotCQlwcHRwX2VjaG9ycF9wcmludChkYXQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9PQ1JROgotCQlwcHRwX29jcnFfcHJpbnQoZGF0KTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfT0NSUDoKLQkJcHB0cF9vY3JwX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX0lDUlE6Ci0JCXBwdHBfaWNycV9wcmludChkYXQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9JQ1JQOgotCQlwcHRwX2ljcnBfcHJpbnQoZGF0KTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfSUNDTjoKLQkJcHB0cF9pY2NuX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX0NDUlE6Ci0JCXBwdHBfY2NycV9wcmludChkYXQpOwotCQlicmVhazsKLQljYXNlIFBQVFBfQ1RSTF9NU0dfVFlQRV9DRE46Ci0JCXBwdHBfY2RuX3ByaW50KGRhdCk7Ci0JCWJyZWFrOwotCWNhc2UgUFBUUF9DVFJMX01TR19UWVBFX1dFTjoKLQkJcHB0cF93ZW5fcHJpbnQoZGF0KTsKLQkJYnJlYWs7Ci0JY2FzZSBQUFRQX0NUUkxfTVNHX1RZUEVfU0xJOgotCQlwcHRwX3NsaV9wcmludChkYXQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCIlcyIsIHRzdHIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtcmFkaXVzLmMgYi9wcmludC1yYWRpdXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzYzUwYi4uMDAwMDAwMAotLS0gYS9wcmludC1yYWRpdXMuYworKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIEFsZnJlZG8gQW5kcmVzIE9tZWxsYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLS8qCi0gKiBSYWRpdXMgcHJpbnRlciByb3V0aW5lcyBhcyBzcGVjaWZpZWQgb246Ci0gKgotICogUkZDIDI4NjU6Ci0gKiAgICAgICJSZW1vdGUgQXV0aGVudGljYXRpb24gRGlhbCBJbiBVc2VyIFNlcnZpY2UgKFJBRElVUykiCi0gKgotICogUkZDIDI4NjY6Ci0gKiAgICAgICJSQURJVVMgQWNjb3VudGluZyIKLSAqCi0gKiBSRkMgMjg2NzoKLSAqICAgICAgIlJBRElVUyBBY2NvdW50aW5nIE1vZGlmaWNhdGlvbnMgZm9yIFR1bm5lbCBQcm90b2NvbCBTdXBwb3J0IgotICoKLSAqIFJGQyAyODY4OgotICogICAgICAiUkFESVVTIEF0dHJpYnV0ZXMgZm9yIFR1bm5lbCBQcm90b2NvbCBTdXBwb3J0IgotICoKLSAqIFJGQyAyODY5OgotICogICAgICAiUkFESVVTIEV4dGVuc2lvbnMiCi0gKgotICogQWxmcmVkbyBBbmRyZXMgT21lbGxhIChhYW5kcmVzQHMyMXNlYy5jb20pIHYwLjEgMjAwMC8wOS8xNQotICoKLSAqIFRPRE86IEFtb25nIG90aGVyIHRoaW5ncyB0byBwcmludCBvayBNYWNJbnRvc2ggYW5kIFZlbmRvciB2YWx1ZXMKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiJElkOiBwcmludC1yYWRpdXMuYyx2IDEuMjcuMi4xIDIwMDUvMDkvMjYgMDE6MDI6NDAgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJvdWkuaCIKLQotI2RlZmluZSBUQU1fU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSApCi0KLSNkZWZpbmUgUFJJTlRfSEVYKGJ5dGVzX2xlbiwgcHRyX2RhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgd2hpbGUoYnl0ZXNfbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgcHJpbnRmKCIlMDJYIiwgKnB0cl9kYXRhICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgcHRyX2RhdGErKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgYnl0ZXNfbGVuLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgfQotCi0KLS8qIFJhZGl1cyBwYWNrZXQgY29kZXMgKi8KLSNkZWZpbmUgUkFEQ01EX0FDQ0VTU19SRVEgICAxIC8qIEFjY2Vzcy1SZXF1ZXN0ICAgICAgKi8KLSNkZWZpbmUgUkFEQ01EX0FDQ0VTU19BQ0MgICAyIC8qIEFjY2Vzcy1BY2NlcHQgICAgICAgKi8KLSNkZWZpbmUgUkFEQ01EX0FDQ0VTU19SRUogICAzIC8qIEFjY2Vzcy1SZWplY3QgICAgICAgKi8KLSNkZWZpbmUgUkFEQ01EX0FDQ09VTl9SRVEgICA0IC8qIEFjY291bnRpbmctUmVxdWVzdCAgKi8KLSNkZWZpbmUgUkFEQ01EX0FDQ09VTl9SRVMgICA1IC8qIEFjY291bnRpbmctUmVzcG9uc2UgKi8KLSNkZWZpbmUgUkFEQ01EX0FDQ0VTU19DSEEgIDExIC8qIEFjY2Vzcy1DaGFsbGVuZ2UgICAgKi8KLSNkZWZpbmUgUkFEQ01EX1NUQVRVU19TRVIgIDEyIC8qIFN0YXR1cy1TZXJ2ZXIgICAgICAgKi8KLSNkZWZpbmUgUkFEQ01EX1NUQVRVU19DTEkgIDEzIC8qIFN0YXR1cy1DbGllbnQgICAgICAgKi8KLSNkZWZpbmUgUkFEQ01EX1JFU0VSVkVEICAgMjU1IC8qIFJlc2VydmVkICAgICAgICAgICAgKi8KLQotc3RhdGljIHN0cnVjdCB0b2sgcmFkaXVzX2NvbW1hbmRfdmFsdWVzW10gPSB7Ci0gICAgeyBSQURDTURfQUNDRVNTX1JFUSwgIkFjY2VzcyBSZXF1ZXN0IiB9LAotICAgIHsgUkFEQ01EX0FDQ0VTU19BQ0MsICJBY2Nlc3MgQWNjZXB0IiB9LAotICAgIHsgUkFEQ01EX0FDQ0VTU19SRUosICJBY2Nlc3MgUmVqZWN0IiB9LAotICAgIHsgUkFEQ01EX0FDQ09VTl9SRVEsICJBY2NvdW50aW5nIFJlcXVlc3QiIH0sCi0gICAgeyBSQURDTURfQUNDT1VOX1JFUywgIkFjY291bnRpbmcgUmVzcG9uc2UiIH0sCi0gICAgeyBSQURDTURfQUNDRVNTX0NIQSwgIkFjY2VzcyBDaGFsbGVuZ2UiIH0sCi0gICAgeyBSQURDTURfU1RBVFVTX1NFUiwgIlN0YXR1cyBTZXJ2ZXIiIH0sCi0gICAgeyBSQURDTURfU1RBVFVTX0NMSSwgIlN0YXR1cyBDbGllbnQiIH0sCi0gICAgeyBSQURDTURfUkVTRVJWRUQsICAgIlJlc2VydmVkIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEJlZ2luIFJhZGl1cyBBdHRyaWJ1dGUgdHlwZXMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgU0VSVl9UWVBFICAgIDYKLSNkZWZpbmUgRlJNX0lQQUREUiAgIDgKLSNkZWZpbmUgTE9HX0lQSE9TVCAgMTQKLSNkZWZpbmUgTE9HX1NFUlZJQ0UgMTUKLSNkZWZpbmUgRlJNX0lQWCAgICAgMjMKLSNkZWZpbmUgU0VTU0lPTl9USU1FT1VUICAgMjcKLSNkZWZpbmUgSURMRV9USU1FT1VUICAgICAgMjgKLSNkZWZpbmUgRlJNX0FUQUxLX0xJTksgICAgMzcKLSNkZWZpbmUgRlJNX0FUQUxLX05FVFdPUksgMzgKLQotI2RlZmluZSBBQ0NUX0RFTEFZICAgICAgICA0MQotI2RlZmluZSBBQ0NUX1NFU1NJT05fVElNRSA0NgotCi0jZGVmaW5lIFRVTk5FTF9UWVBFICAgICAgICA2NAotI2RlZmluZSBUVU5ORUxfTUVESVVNICAgICAgNjUKLSNkZWZpbmUgVFVOTkVMX0NMSUVOVF9FTkQgIDY2Ci0jZGVmaW5lIFRVTk5FTF9TRVJWRVJfRU5EICA2NwotI2RlZmluZSBUVU5ORUxfUEFTUyAgICAgICAgNjkKLQotI2RlZmluZSBBUkFQX1BBU1MgICAgICAgICAgNzAKLSNkZWZpbmUgQVJBUF9GRUFUVVJFUyAgICAgIDcxCi0KLSNkZWZpbmUgVFVOTkVMX1BSSVZfR1JPVVAgIDgxCi0jZGVmaW5lIFRVTk5FTF9BU1NJR05fSUQgICA4MgotI2RlZmluZSBUVU5ORUxfUFJFRkVSRU5DRSAgODMKLQotI2RlZmluZSBBUkFQX0NIQUxMRU5HRV9SRVNQIDg0Ci0jZGVmaW5lIEFDQ1RfSU5UX0lOVEVSVkFMICAgODUKLQotI2RlZmluZSBUVU5ORUxfQ0xJRU5UX0FVVEggOTAKLSNkZWZpbmUgVFVOTkVMX1NFUlZFUl9BVVRIIDkxCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBFbmQgUmFkaXVzIEF0dHJpYnV0ZSB0eXBlcyAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0YXRpYyB2b2lkIHByaW50X2F0dHJfc3RyaW5nKHJlZ2lzdGVyIHVfY2hhciAqLCB1X2ludCwgdV9zaG9ydCApOwotc3RhdGljIHZvaWQgcHJpbnRfYXR0cl9udW0ocmVnaXN0ZXIgdV9jaGFyICosIHVfaW50LCB1X3Nob3J0ICk7Ci1zdGF0aWMgdm9pZCBwcmludF92ZW5kb3JfYXR0cihyZWdpc3RlciB1X2NoYXIgKiwgdV9pbnQsIHVfc2hvcnQgKTsKLXN0YXRpYyB2b2lkIHByaW50X2F0dHJfYWRkcmVzcyhyZWdpc3RlciB1X2NoYXIgKiwgdV9pbnQsIHVfc2hvcnQpOwotc3RhdGljIHZvaWQgcHJpbnRfYXR0cl90aW1lKHJlZ2lzdGVyIHVfY2hhciAqLCB1X2ludCwgdV9zaG9ydCk7Ci1zdGF0aWMgdm9pZCBwcmludF9hdHRyX3N0cmFuZ2UocmVnaXN0ZXIgdV9jaGFyICosIHVfaW50LCB1X3Nob3J0KTsKLQotCi1zdHJ1Y3QgcmFkaXVzX2hkciB7IHVfaW50OF90ICBjb2RlOyAvKiBSYWRpdXMgcGFja2V0IGNvZGUgICovCi0gICAgICAgICAgICAgICAgICAgIHVfaW50OF90ICBpZDsgICAvKiBSYWRpdXMgcGFja2V0IGlkICAgICovCi0gICAgICAgICAgICAgICAgICAgIHVfaW50MTZfdCBsZW47ICAvKiBSYWRpdXMgdG90YWwgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgIHVfaW50OF90ICBhdXRoWzE2XTsgLyogQXV0aGVudGljYXRvciAgICovCi0gICAgICAgICAgICAgICAgICB9OwotCi0jZGVmaW5lIE1JTl9SQURJVVNfTEVOCTIwCi0KLXN0cnVjdCByYWRpdXNfYXR0ciB7IHVfaW50OF90IHR5cGU7IC8qIEF0dHJpYnV0ZSB0eXBlICAgKi8KLSAgICAgICAgICAgICAgICAgICAgIHVfaW50OF90IGxlbjsgIC8qIEF0dHJpYnV0ZSBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICAgICB9OwotCi0KLS8qIFNlcnZpY2UtVHlwZSBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2Vydl90eXBlW109eyBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9naW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxiYWNrIExvZ2luIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxiYWNrIEZyYW1lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdXRib3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZG1pbmlzdHJhdGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQVMgUHJvbXB0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhlbnRpY2F0ZSBPbmx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxiYWNrIE5BUyBQcm9tcHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbCBDaGVjayIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYWxsYmFjayBBZG1pbmlzdHJhdGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyogRnJhbWVkLVByb3RvY29sIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpmcm1fcHJvdG9bXT17IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFBQIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTTElQIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUkFQIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHYW5kYWxmIHByb3ByaWV0YXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYeWxvZ2ljcyBJUFgvU0xJUCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC43NSBTeW5jaHJvbm91cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyogRnJhbWVkLVJvdXRpbmcgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmZybV9yb3V0aW5nW109eyAiTm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpc3RlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kJkxpc3RlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKiBGcmFtZWQtQ29tcHJlc3Npb24gQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmZybV9jb21wW109eyAiTm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWSiBUQ1AvSVAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVBYIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YWMtTFpTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLS8qIExvZ2luLVNlcnZpY2UgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmxvZ2luX3NlcnZbXT17ICJUZWxuZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSbG9naW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ1AgQ2xlYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0TWFzdGVyKHByb3ByaWV0YXJ5KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBVCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlguMjUtUEFEIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC4yNS1UM1BPUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYXNzaWduZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUQ1AgQ2xlYXIgUXVpZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0KLS8qIFRlcm1pbmF0aW9uLUFjdGlvbiBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCi1zdGF0aWMgY29uc3QgY2hhciAqdGVybV9hY3Rpb25bXT17ICJEZWZhdWx0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJBRElVUy1SZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLS8qIE5BUy1Qb3J0LVR5cGUgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKm5hc19wb3J0X3R5cGVbXT17ICJBc3luYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bmMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJU0ROIFN5bmMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJU0ROIEFzeW5jIFYuMTIwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVNETiBBc3luYyBWLjExMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZpcnR1YWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQSUFGUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhETEMgQ2xlYXIgQ2hhbm5lbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlguMjUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYLjc1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRy4zIEZheCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNEU0wiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBRFNMLUNBUCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFEU0wtRE1UIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVNETi1EU0wiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdGhlcm5ldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhEU0wiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpcmVsZXNzIC0gT3RoZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaXJlbGVzcyAtIElFRUUgODAyLjExIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyogQWNjdC1TdGF0dXMtVHlwZSBBY2NvdW50aW5nIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICphY2N0X3N0YXR1c1tdPXsgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0b3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJpbS1VcGRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hc3NpZ25lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFzc2lnbmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYXNzaWduZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjb3VudGluZy1PbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2NvdW50aW5nLU9mZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdW5uZWwtU3RhcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHVubmVsLVN0b3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHVubmVsLVJlamVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdW5uZWwtTGluay1TdGFydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUdW5uZWwtTGluay1TdG9wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR1bm5lbC1MaW5rLVJlamVjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyogQWNjdC1BdXRoZW50aWMgQWNjb3VudGluZyBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWNjdF9hdXRoW109eyBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJBRElVUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jYWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlbW90ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyogQWNjdC1UZXJtaW5hdGUtQ2F1c2UgQWNjb3VudGluZyBBdHRyaWJ1dGUgc3RhbmRhcmQgdmFsdWVzICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWNjdF90ZXJtW109eyBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgUmVxdWVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9zdCBDYXJyaWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3N0IFNlcnZpY2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklkbGUgVGltZW91dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2Vzc2lvbiBUaW1lb3V0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZG1pbiBSZXNldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRtaW4gUmVib290IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQVMgRXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5BUyBSZXF1ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQVMgUmVib290IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IFVubmVlZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3J0IFByZWVtcHRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9ydCBTdXNwZW5kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlcnZpY2UgVW5hdmFpbGFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGxiYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyIEVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0IFJlcXVlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLS8qIFR1bm5lbC1UeXBlIEF0dHJpYnV0ZSBzdGFuZGFyZCB2YWx1ZXMgKi8KLXN0YXRpYyBjb25zdCBjaGFyICp0dW5uZWxfdHlwZVtdPXsgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBQVFAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTDJGIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkwyVFAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVRNUCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWVFAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSVAtSVAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUlOLUlQLUlQIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVTUCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRFZTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQLWluLUlQIFR1bm5lbGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0vKiBUdW5uZWwtTWVkaXVtLVR5cGUgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnR1bm5lbF9tZWRpdW1bXT17IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklQdjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJUHY2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlNBUCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhETEMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCQk4gMTgyMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgwMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkUuMTYzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRS4xNjQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGLjY5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWC4xMjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJUFgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHBsZXRhbGsiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNuZXQgSVYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYW55YW4gVmluZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFLjE2NCB3aXRoIE5TQVAgc3ViYWRkcmVzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLS8qIEFSQVAtWm9uZS1BY2Nlc3MgQXR0cmlidXRlIHN0YW5kYXJkIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmFyYXBfem9uZVtdPXsgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbmx5IGFjY2VzcyB0byBkZmwgem9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIHpvbmUgZmlsdGVyIGluYy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCB1c2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2Ugem9uZSBmaWx0ZXIgZXhjLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnByb21wdFtdPXsgIk5vIEVjaG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVjaG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLQotc3RydWN0IGF0dHJ0eXBlIHsgY29uc3QgY2hhciAqbmFtZTsgICAgICAvKiBBdHRyaWJ1dGUgbmFtZSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipzdWJ0eXBlczsgLyogU3RhbmRhcmQgVmFsdWVzIChpZiBhbnkpICAgICAgICovCi0gICAgICAgICAgICAgICAgICB1X2NoYXIgc2l6X3N1YnR5cGVzOyAgIC8qIFNpemUgb2YgdG90YWwgc3RhbmRhcmQgdmFsdWVzICAqLwotICAgICAgICAgICAgICAgICAgdV9jaGFyIGZpcnN0X3N1YnR5cGU7ICAvKiBGaXJzdCBzdGFuZGFyZCB2YWx1ZSBpcyAwIG9yIDEgKi8KLSAgICAgICAgICAgICAgICAgIHZvaWQgKCpwcmludF9mdW5jKShyZWdpc3RlciB1X2NoYXIgKiwgdV9pbnQsIHVfc2hvcnQgKTsKLSAgICAgICAgICAgICAgICB9IGF0dHJfdHlwZVtdPQotICB7Ci0gICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMICAgICAgICAgICAgICAgfSwKLSAgICAgeyAiVXNlcm5hbWUiLCAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nICB9LAotICAgICB7ICJQYXNzd29yZCIsICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgTlVMTCAgICAgICAgICAgICAgIH0sCi0gICAgIHsgIkNIQVAgUGFzc3dvcmQiLCAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMICAgICAgICAgICAgICAgfSwKLSAgICAgeyAiTkFTIElQIEFkZHJlc3MiLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfYWRkcmVzcyB9LAotICAgICB7ICJOQVMgUG9ydCIsICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgIH0sCi0gICAgIHsgIlNlcnZpY2UgVHlwZSIsICAgICAgICAgICAgICAgICAgICBzZXJ2X3R5cGUsIFRBTV9TSVpFKHNlcnZfdHlwZSktMSwgMSwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiRnJhbWVkIFByb3RvY29sIiwgICAgICAgICAgICAgICAgIGZybV9wcm90bywgVEFNX1NJWkUoZnJtX3Byb3RvKS0xLCAxLCBwcmludF9hdHRyX251bSB9LAotICAgICB7ICJGcmFtZWQgSVAgQWRkcmVzcyIsICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9hZGRyZXNzIH0sCi0gICAgIHsgIkZyYW1lZCBJUCBOZXR3b3JrIiwgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX2FkZHJlc3MgfSwKLSAgICAgeyAiRnJhbWVkIFJvdXRpbmciLCAgICAgICAgICAgICAgICAgIGZybV9yb3V0aW5nLCBUQU1fU0laRShmcm1fcm91dGluZyksIDAsIHByaW50X2F0dHJfbnVtIH0sCi0gICAgIHsgIkZpbHRlciBJRCIsICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyAgfSwKLSAgICAgeyAiRnJhbWVkIE1UVSIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgICB9LAotICAgICB7ICJGcmFtZWQgQ29tcHJlc3Npb24iLCAgICAgICAgICAgICAgZnJtX2NvbXAsIFRBTV9TSVpFKGZybV9jb21wKSwgICAwLCBwcmludF9hdHRyX251bSB9LAotICAgICB7ICJMb2dpbiBJUCBIb3N0IiwgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9hZGRyZXNzIH0sCi0gICAgIHsgIkxvZ2luIFNlcnZpY2UiLCAgICAgICAgICAgICAgICAgICBsb2dpbl9zZXJ2LCBUQU1fU0laRShsb2dpbl9zZXJ2KSwgMCwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiTG9naW4gVENQIFBvcnQiLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgICB9LAotICAgICB7ICJVbmFzc2lnbmVkIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgTlVMTCB9LCAvKjE3Ki8KLSAgICAgeyAiUmVwbHkiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkNhbGxiYWNrLW51bWJlciIsICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJDYWxsYmFjay1JRCIsICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwgLyoyMSovCi0gICAgIHsgIkZyYW1lZCBSb3V0ZSIsICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJGcmFtZWQgSVBYIE5ldHdvcmsiLCAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgfSwKLSAgICAgeyAiU3RhdGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkNsYXNzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJWZW5kb3IgU3BlY2lmaWMiLCAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfdmVuZG9yX2F0dHIgfSwKLSAgICAgeyAiU2Vzc2lvbiBUaW1lb3V0IiwgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgIH0sCi0gICAgIHsgIklkbGUgVGltZW91dCIsICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAotICAgICB7ICJUZXJtaW5hdGlvbiBBY3Rpb24iLCAgICAgICAgICAgICAgdGVybV9hY3Rpb24sIFRBTV9TSVpFKHRlcm1fYWN0aW9uKSwgMCwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiQ2FsbGVkIFN0YXRpb24iLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkNhbGxpbmcgU3RhdGlvbiIsICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJOQVMgSUQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiUHJveHkgU3RhdGUiLCAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkxvZ2luIExBVCBTZXJ2aWNlIiwgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJMb2dpbiBMQVQgTm9kZSIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiTG9naW4gTEFUIEdyb3VwIiwgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkZyYW1lZCBBcHBsZXRhbGsgTGluayIsICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAotICAgICB7ICJGcmFtZWQgQXBwbHRhbGsgTmV0IiwgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgfSwKLSAgICAgeyAiRnJhbWVkIEFwcGxldGFsayBab25lIiwgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkFjY291bnRpbmcgU3RhdHVzIiwgICAgICAgICAgICAgICBhY2N0X3N0YXR1cywgVEFNX1NJWkUoYWNjdF9zdGF0dXMpLTEsIDEsIHByaW50X2F0dHJfbnVtIH0sCi0gICAgIHsgIkFjY291bnRpbmcgRGVsYXkiLCAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAotICAgICB7ICJBY2NvdW50aW5nIElucHV0IE9jdGV0cyIsICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgfSwKLSAgICAgeyAiQWNjb3VudGluZyBPdXRwdXQgT2N0ZXRzIiwgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtICAgIH0sCi0gICAgIHsgIkFjY291bnRpbmcgU2Vzc2lvbiBJRCIsICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJBY2NvdW50aW5nIEF1dGhlbnRpY2F0aW9uIiwgICAgICAgYWNjdF9hdXRoLCBUQU1fU0laRShhY2N0X2F1dGgpLTEsIDEsIHByaW50X2F0dHJfbnVtIH0sCi0gICAgIHsgIkFjY291bnRpbmcgU2Vzc2lvbiBUaW1lIiwgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSB9LAotICAgICB7ICJBY2NvdW50aW5nIElucHV0IFBhY2tldHMiLCAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiQWNjb3VudGluZyBPdXRwdXQgUGFja2V0cyIsICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtIH0sCi0gICAgIHsgIkFjY291bnRpbmcgVGVybWluYXRpb24gQ2F1c2UiLCAgICBhY2N0X3Rlcm0sIFRBTV9TSVpFKGFjY3RfdGVybSktMSwgMSwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiQWNjb3VudGluZyBNdWx0aWxpbmsgU2Vzc2lvbiBJRCIsIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkFjY291bnRpbmcgTGluayBDb3VudCIsICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSB9LAotICAgICB7ICJBY2NvdW50aW5nIElucHV0IEdpZ2EiLCAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiQWNjb3VudGluZyBPdXRwdXQgR2lnYSIsICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtIH0sCi0gICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0sIC8qNTQqLwotICAgICB7ICJFdmVudCBUaW1lc3RhbXAiLCAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl90aW1lIH0sCi0gICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0sIC8qNTYqLwotICAgICB7ICJVbmFzc2lnbmVkIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgTlVMTCB9LCAvKjU3Ki8KLSAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwgLyo1OCovCi0gICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0sIC8qNTkqLwotICAgICB7ICJDSEFQIGNoYWxsZW5nZSIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiTkFTIFBvcnQgVHlwZSIsICAgICAgICAgICAgICAgICAgIG5hc19wb3J0X3R5cGUsIFRBTV9TSVpFKG5hc19wb3J0X3R5cGUpLCAwLCBwcmludF9hdHRyX251bSB9LAotICAgICB7ICJQb3J0IExpbWl0IiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiTG9naW4gTEFUIFBvcnQiLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sIC8qNjMqLwotICAgICB7ICJUdW5uZWwgVHlwZSIsICAgICAgICAgICAgICAgICAgICAgdHVubmVsX3R5cGUsIFRBTV9TSVpFKHR1bm5lbF90eXBlKS0xLCAxLCBwcmludF9hdHRyX251bSB9LAotICAgICB7ICJUdW5uZWwgTWVkaXVtIiwgICAgICAgICAgICAgICAgICAgdHVubmVsX21lZGl1bSwgVEFNX1NJWkUodHVubmVsX21lZGl1bSktMSwgMSwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiVHVubmVsIENsaWVudCBFbmQiLCAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIlR1bm5lbCBTZXJ2ZXIgRW5kIiwgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJBY2NvdW50aW5nIFR1bm5lbCBjb25uZWN0IiwgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiVHVubmVsIFBhc3N3b3JkIiwgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nICB9LAotICAgICB7ICJBUkFQIFBhc3N3b3JkIiwgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJhbmdlIH0sCi0gICAgIHsgIkFSQVAgRmVhdHVyZSIsICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmFuZ2UgfSwKLSAgICAgeyAiQVJBUCBab25lIEFjY2VzIiwgICAgICAgICAgICAgICAgIGFyYXBfem9uZSwgVEFNX1NJWkUoYXJhcF96b25lKS0xLCAxLCBwcmludF9hdHRyX251bSB9LCAvKjcyKi8KLSAgICAgeyAiQVJBUCBTZWN1cml0eSIsICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIkFSQVAgU2VjdXJpdHkgRGF0YSIsICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJQYXNzd29yZCBSZXRyeSIsICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9udW0gICAgfSwKLSAgICAgeyAiUHJvbXB0IiwgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdCwgVEFNX1NJWkUocHJvbXB0KSwgMCwgcHJpbnRfYXR0cl9udW0gfSwKLSAgICAgeyAiQ29ubmVjdCBJbmZvIiwgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nICAgfSwKLSAgICAgeyAiQ29uZmlnIFRva2VuIiwgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nICAgfSwKLSAgICAgeyAiRUFQIE1lc3NhZ2UiLCAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nICAgfSwKLSAgICAgeyAiTWVzc2FnZSBBdXRoZW50aWNhdGlvbiIsICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sIC8qODAqLwotICAgICB7ICJUdW5uZWwgUHJpdmF0ZSBHcm91cCIsICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiVHVubmVsIEFzc2lnbmVkIElEIiwgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIlR1bm5lbCBQcmVmZXJlbmNlIiwgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICB9LAotICAgICB7ICJBUkFQIENoYWxsZW5nZSBSZXNwb25zZSIsICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJhbmdlIH0sCi0gICAgIHsgIkFjY291bnRpbmcgSW50ZXJpbSBJbnRlcnZhbCIsICAgICBOVUxMLCAwLCAwLCBwcmludF9hdHRyX251bSAgICAgfSwKLSAgICAgeyAiQWNjb3VudGluZyBUdW5uZWwgcGFja2V0cyBsb3N0IiwgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfbnVtIH0sIC8qODYqLwotICAgICB7ICJOQVMgUG9ydCBJRCIsICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiRnJhbWVkIFBvb2wiLCAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIHByaW50X2F0dHJfc3RyaW5nIH0sCi0gICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0sCi0gICAgIHsgIlR1bm5lbCBDbGllbnQgQXV0aGVudGljYXRpb24gSUQiLCBOVUxMLCAwLCAwLCBwcmludF9hdHRyX3N0cmluZyB9LAotICAgICB7ICJUdW5uZWwgU2VydmVyIEF1dGhlbnRpY2F0aW9uIElEIiwgTlVMTCwgMCwgMCwgcHJpbnRfYXR0cl9zdHJpbmcgfSwKLSAgICAgeyAiVW5hc3NpZ25lZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIE5VTEwgfSwgLyo5MiovCi0gICAgIHsgIlVuYXNzaWduZWQiLCAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwLCBOVUxMIH0gIC8qOTMqLwotICB9OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFByaW50IGFuIGF0dHJpYnV0ZSBzdHJpbmcgKi8KLS8qIHZhbHVlIHBvaW50ZWQgYnkgJ2RhdGEnICAgKi8KLS8qIGFuZCAnbGVuZ3RoJyBzaXplLiAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJldHVybnMgbm90aGluZy4gICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1wcmludF9hdHRyX3N0cmluZyhyZWdpc3RlciB1X2NoYXIgKmRhdGEsIHVfaW50IGxlbmd0aCwgdV9zaG9ydCBhdHRyX2NvZGUgKQotewotICAgcmVnaXN0ZXIgdV9pbnQgaTsKLQotICAgVENIRUNLMihkYXRhWzBdLGxlbmd0aCk7Ci0KLSAgIHN3aXRjaChhdHRyX2NvZGUpCi0gICB7Ci0gICAgICBjYXNlIFRVTk5FTF9QQVNTOgotICAgICAgICAgICBpZiAobGVuZ3RoIDwgMykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmICgqZGF0YSAmJiAoKmRhdGEgPD0weDFGKSApCi0gICAgICAgICAgICAgIHByaW50ZigiVGFnICV1LCAiLCpkYXRhKTsKLSAgICAgICAgICAgZGF0YSsrOwotICAgICAgICAgICBsZW5ndGgtLTsKLSAgICAgICAgICAgcHJpbnRmKCJTYWx0ICV1ICIsRVhUUkFDVF8xNkJJVFMoZGF0YSkgKTsKLSAgICAgICAgICAgZGF0YSs9MjsKLSAgICAgICAgICAgbGVuZ3RoLT0yOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFVOTkVMX0NMSUVOVF9FTkQ6Ci0gICAgICBjYXNlIFRVTk5FTF9TRVJWRVJfRU5EOgotICAgICAgY2FzZSBUVU5ORUxfUFJJVl9HUk9VUDoKLSAgICAgIGNhc2UgVFVOTkVMX0FTU0lHTl9JRDoKLSAgICAgIGNhc2UgVFVOTkVMX0NMSUVOVF9BVVRIOgotICAgICAgY2FzZSBUVU5ORUxfU0VSVkVSX0FVVEg6Ci0gICAgICAgICAgIGlmICgqZGF0YSA8PSAweDFGKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmIChsZW5ndGggPCAxKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHByaW50ZigiIFt8cmFkaXVzXSIpOwotICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJpbnRmKCJUYWcgJXUiLCpkYXRhKTsKLSAgICAgICAgICAgICAgZGF0YSsrOwotICAgICAgICAgICAgICBsZW5ndGgtLTsKLSAgICAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgIH0KLQotICAgZm9yIChpPTA7ICpkYXRhICYmIGkgPCBsZW5ndGggOyBpKyssIGRhdGErKykKLSAgICAgICBwcmludGYoIiVjIiwoKmRhdGEgPCAzMiB8fCAqZGF0YSA+IDEyOCkgPyAnLicgOiAqZGF0YSApOwotCi0gICByZXR1cm47Ci0KLSAgIHRydW5jOgotICAgICAgcHJpbnRmKCIgW3xyYWRpdXNdIik7Ci19Ci0KLS8qCi0gKiBwcmludCB2ZW5kb3Igc3BlY2lmaWMgYXR0cmlidXRlcwotICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92ZW5kb3JfYXR0cihyZWdpc3RlciB1X2NoYXIgKmRhdGEsIHVfaW50IGxlbmd0aCwgdV9zaG9ydCBhdHRyX2NvZGUgX1VfKQotewotICAgIHVfaW50IGlkeDsKLSAgICB1X2ludCB2ZW5kb3JfaWQ7Ci0gICAgdV9pbnQgdmVuZG9yX3R5cGU7Ci0gICAgdV9pbnQgdmVuZG9yX2xlbmd0aDsKLQotICAgIGlmIChsZW5ndGggPCA0KQotICAgICAgICBnb3RvIHRydW5jOwotICAgIFRDSEVDSzIoKmRhdGEsIDQpOwotICAgIHZlbmRvcl9pZCA9IEVYVFJBQ1RfMzJCSVRTKGRhdGEpOwotICAgIGRhdGErPTQ7Ci0gICAgbGVuZ3RoLT00OwotCi0gICAgcHJpbnRmKCJWZW5kb3I6ICVzICgldSkiLAotICAgICAgICAgICB0b2syc3RyKHNtaV92YWx1ZXMsIlVua25vd24iLHZlbmRvcl9pZCksCi0gICAgICAgICAgIHZlbmRvcl9pZCk7Ci0KLSAgICB3aGlsZSAobGVuZ3RoID49IDIpIHsKLQlUQ0hFQ0syKCpkYXRhLCAyKTsKLQotICAgICAgICB2ZW5kb3JfdHlwZSA9ICooZGF0YSk7Ci0gICAgICAgIHZlbmRvcl9sZW5ndGggPSAqKGRhdGErMSk7Ci0KLSAgICAgICAgaWYgKHZlbmRvcl9sZW5ndGggPCAyKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQgICAgVmVuZG9yIEF0dHJpYnV0ZTogJXUsIExlbmd0aDogJXUgKGJvZ3VzLCBtdXN0IGJlID49IDIpIiwKLSAgICAgICAgICAgICAgICAgICB2ZW5kb3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICB2ZW5kb3JfbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodmVuZG9yX2xlbmd0aCA+IGxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICAgIFZlbmRvciBBdHRyaWJ1dGU6ICV1LCBMZW5ndGg6ICV1IChib2d1cywgZ29lcyBwYXN0IGVuZCBvZiB2ZW5kb3Itc3BlY2lmaWMgYXR0cmlidXRlKSIsCi0gICAgICAgICAgICAgICAgICAgdmVuZG9yX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgdmVuZG9yX2xlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZGF0YSs9MjsKLSAgICAgICAgdmVuZG9yX2xlbmd0aC09MjsKLSAgICAgICAgbGVuZ3RoLT0yOwotCVRDSEVDSzIoKmRhdGEsIHZlbmRvcl9sZW5ndGgpOwotCi0gICAgICAgIHByaW50ZigiXG5cdCAgICBWZW5kb3IgQXR0cmlidXRlOiAldSwgTGVuZ3RoOiAldSwgVmFsdWU6ICIsCi0gICAgICAgICAgICAgICB2ZW5kb3JfdHlwZSwKLSAgICAgICAgICAgICAgIHZlbmRvcl9sZW5ndGgpOwotICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHZlbmRvcl9sZW5ndGggOyBpZHgrKywgZGF0YSsrKQotICAgICAgICAgICAgcHJpbnRmKCIlYyIsKCpkYXRhIDwgMzIgfHwgKmRhdGEgPiAxMjgpID8gJy4nIDogKmRhdGEgKTsKLSAgICAgICAgbGVuZ3RoLT12ZW5kb3JfbGVuZ3RoOwotICAgIH0KLSAgICByZXR1cm47Ci0KLSAgIHRydW5jOgotICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQcmludCBhbiBhdHRyaWJ1dGUgbnVtZXJpYyAqLwotLyogdmFsdWUgcG9pbnRlZCBieSAnZGF0YScgICAgKi8KLS8qIGFuZCAnbGVuZ3RoJyBzaXplLiAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmV0dXJucyBub3RoaW5nLiAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcHJpbnRfYXR0cl9udW0ocmVnaXN0ZXIgdV9jaGFyICpkYXRhLCB1X2ludCBsZW5ndGgsIHVfc2hvcnQgYXR0cl9jb2RlICkKLXsKLSAgIHVfaW50OF90IHRhZzsKLSAgIHVfaW50MzJfdCB0aW1lb3V0OwotCi0gICBpZiAobGVuZ3RoICE9IDQpCi0gICB7Ci0gICAgICAgcHJpbnRmKCJFUlJPUjogbGVuZ3RoICV1ICE9IDQiLCBsZW5ndGgpOwotICAgICAgIHJldHVybjsKLSAgIH0KLQotICAgVENIRUNLMihkYXRhWzBdLDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGF0dHJpYnV0ZSBoYXMgc3RhbmRhcmQgdmFsdWVzICovCi0gICBpZiAoYXR0cl90eXBlW2F0dHJfY29kZV0uc2l6X3N1YnR5cGVzKQotICAgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKip0YWJsZTsKLSAgICAgIHVfaW50MzJfdCBkYXRhX3ZhbHVlOwotICAgICAgdGFibGUgPSBhdHRyX3R5cGVbYXR0cl9jb2RlXS5zdWJ0eXBlczsKLQotICAgICAgaWYgKCAoYXR0cl9jb2RlID09IFRVTk5FTF9UWVBFKSB8fCAoYXR0cl9jb2RlID09IFRVTk5FTF9NRURJVU0pICkKLSAgICAgIHsKLSAgICAgICAgIGlmICghKmRhdGEpCi0gICAgICAgICAgICBwcmludGYoIlRhZ1tVbnVzZWRdIik7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYoIlRhZ1slZF0iLCAqZGF0YSk7Ci0gICAgICAgICBkYXRhKys7Ci0gICAgICAgICBkYXRhX3ZhbHVlID0gRVhUUkFDVF8yNEJJVFMoZGF0YSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICBkYXRhX3ZhbHVlID0gRVhUUkFDVF8zMkJJVFMoZGF0YSk7Ci0gICAgICB9Ci0gICAgICBpZiAoIGRhdGFfdmFsdWUgPD0gKHVfaW50MzJfdCkoYXR0cl90eXBlW2F0dHJfY29kZV0uc2l6X3N1YnR5cGVzIC0gMSArCi0gICAgICAgICAgICBhdHRyX3R5cGVbYXR0cl9jb2RlXS5maXJzdF9zdWJ0eXBlKSAmJgotCSAgIGRhdGFfdmFsdWUgPj0gYXR0cl90eXBlW2F0dHJfY29kZV0uZmlyc3Rfc3VidHlwZSApCi0gICAgICAgICBwcmludGYoIiVzIix0YWJsZVtkYXRhX3ZhbHVlXSk7Ci0gICAgICBlbHNlCi0gICAgICAgICBwcmludGYoIiMldSIsZGF0YV92YWx1ZSk7Ci0gICB9Ci0gICBlbHNlCi0gICB7Ci0gICAgICBzd2l0Y2goYXR0cl9jb2RlKSAvKiBCZSBhd2FyZSBvZiBzcGVjaWFsIGNhc2VzLi4uICovCi0gICAgICB7Ci0gICAgICAgIGNhc2UgRlJNX0lQWDoKLSAgICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoIGRhdGEpID09IDB4RkZGRkZGRkUgKQotICAgICAgICAgICAgICAgIHByaW50ZigiTkFTIFNlbGVjdCIpOwotICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIiVkIixFWFRSQUNUXzMyQklUUyggZGF0YSkgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNFU1NJT05fVElNRU9VVDoKLSAgICAgICAgY2FzZSBJRExFX1RJTUVPVVQ6Ci0gICAgICAgIGNhc2UgQUNDVF9ERUxBWToKLSAgICAgICAgY2FzZSBBQ0NUX1NFU1NJT05fVElNRToKLSAgICAgICAgY2FzZSBBQ0NUX0lOVF9JTlRFUlZBTDoKLSAgICAgICAgICAgICB0aW1lb3V0ID0gRVhUUkFDVF8zMkJJVFMoIGRhdGEpOwotICAgICAgICAgICAgIGlmICggdGltZW91dCA8IDYwICkKLSAgICAgICAgICAgICAgICBwcmludGYoICIlMDJkIHNlY3MiLCB0aW1lb3V0KTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggdGltZW91dCA8IDM2MDAgKQotICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiUwMmQ6JTAyZCBtaW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0IC8gNjAsIHRpbWVvdXQgJSA2MCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIHByaW50ZiggIiUwMmQ6JTAyZDolMDJkIGhvdXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAvIDM2MDAsICh0aW1lb3V0ICUgMzYwMCkgLyA2MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAlIDYwKTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGUk1fQVRBTEtfTElOSzoKLSAgICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoZGF0YSkgKQotICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLEVYVFJBQ1RfMzJCSVRTKGRhdGEpICk7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50ZigiVW5udW1iZXJlZCIgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZSTV9BVEFMS19ORVRXT1JLOgotICAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyhkYXRhKSApCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlZCIsRVhUUkFDVF8zMkJJVFMoZGF0YSkgKTsKLSAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJOQVMgYXNzaWduZWQiICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUVU5ORUxfUFJFRkVSRU5DRToKLSAgICAgICAgICAgIHRhZyA9ICpkYXRhOwotICAgICAgICAgICAgZGF0YSsrOwotICAgICAgICAgICAgaWYgKHRhZyA9PSAwKQotICAgICAgICAgICAgICAgcHJpbnRmKCJUYWcgKFVudXNlZCkgJWQiLEVYVFJBQ1RfMjRCSVRTKGRhdGEpICk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICBwcmludGYoIlRhZyAoJWQpICVkIiwgdGFnLCBFWFRSQUNUXzI0QklUUyhkYXRhKSApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgcHJpbnRmKCIlZCIsRVhUUkFDVF8zMkJJVFMoIGRhdGEpICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgIH0gLyogc3dpdGNoICovCi0KLSAgIH0gLyogaWYtZWxzZSAqLwotCi0gICByZXR1cm47Ci0KLSAgIHRydW5jOgotICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQcmludCBhbiBhdHRyaWJ1dGUgSVB2NCAgICovCi0vKiBhZGRyZXNzIHZhbHVlIHBvaW50ZWQgYnkgICovCi0vKiAnZGF0YScgYW5kICdsZW5ndGgnIHNpemUuICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZXR1cm5zIG5vdGhpbmcuICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotcHJpbnRfYXR0cl9hZGRyZXNzKHJlZ2lzdGVyIHVfY2hhciAqZGF0YSwgdV9pbnQgbGVuZ3RoLCB1X3Nob3J0IGF0dHJfY29kZSApCi17Ci0gICBpZiAobGVuZ3RoICE9IDQpCi0gICB7Ci0gICAgICAgcHJpbnRmKCJFUlJPUjogbGVuZ3RoICV1ICE9IDQiLCBsZW5ndGgpOwotICAgICAgIHJldHVybjsKLSAgIH0KLQotICAgVENIRUNLMihkYXRhWzBdLDQpOwotCi0gICBzd2l0Y2goYXR0cl9jb2RlKQotICAgewotICAgICAgY2FzZSBGUk1fSVBBRERSOgotICAgICAgY2FzZSBMT0dfSVBIT1NUOgotICAgICAgICAgICBpZiAoRVhUUkFDVF8zMkJJVFMoZGF0YSkgPT0gMHhGRkZGRkZGRiApCi0gICAgICAgICAgICAgIHByaW50ZigiVXNlciBTZWxlY3RlZCIpOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGlmIChFWFRSQUNUXzMyQklUUyhkYXRhKSA9PSAweEZGRkZGRkZFICkKLSAgICAgICAgICAgICAgICAgcHJpbnRmKCJOQVMgU2VsZWN0Iik7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyIsaXBhZGRyX3N0cmluZyhkYXRhKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBwcmludGYoIiVzIixpcGFkZHJfc3RyaW5nKGRhdGEpICk7Ci0gICAgICBicmVhazsKLSAgIH0KLQotICAgcmV0dXJuOwotCi0gICB0cnVuYzoKLSAgICAgcHJpbnRmKCIgW3xyYWRpdXNdIik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQcmludCBhbiBhdHRyaWJ1dGUgb2YgJ3NlY3Mgc2luY2UgKi8KLS8qIEphbnVhcnkgMSwgMTk3MCAwMDowMCBVVEMnIHZhbHVlICAqLwotLyogcG9pbnRlZCBieSAnZGF0YScgYW5kICdsZW5ndGgnICAgICovCi0vKiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmV0dXJucyBub3RoaW5nLiAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHByaW50X2F0dHJfdGltZShyZWdpc3RlciB1X2NoYXIgKmRhdGEsIHVfaW50IGxlbmd0aCwgdV9zaG9ydCBhdHRyX2NvZGUgX1VfKQotewotICAgdGltZV90IGF0dHJfdGltZTsKLSAgIGNoYXIgc3RyaW5nWzI2XTsKLQotICAgaWYgKGxlbmd0aCAhPSA0KQotICAgewotICAgICAgIHByaW50ZigiRVJST1I6IGxlbmd0aCAldSAhPSA0IiwgbGVuZ3RoKTsKLSAgICAgICByZXR1cm47Ci0gICB9Ci0KLSAgIFRDSEVDSzIoZGF0YVswXSw0KTsKLQotICAgYXR0cl90aW1lID0gRVhUUkFDVF8zMkJJVFMoZGF0YSk7Ci0gICBzdHJsY3B5KHN0cmluZywgY3RpbWUoJmF0dHJfdGltZSksIHNpemVvZihzdHJpbmcpKTsKLSAgIC8qIEdldCByaWQgb2YgdGhlIG5ld2xpbmUgKi8KLSAgIHN0cmluZ1syNF0gPSAnXDAnOwotICAgcHJpbnRmKCIlLjI0cyIsIHN0cmluZyk7Ci0gICByZXR1cm47Ci0KLSAgIHRydW5jOgotICAgICBwcmludGYoIiBbfHJhZGl1c10iKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBQcmludCBhbiBhdHRyaWJ1dGUgb2YgJ3N0cmFuZ2UnICovCi0vKiBkYXRhIGZvcm1hdCBwb2ludGVkIGJ5ICdkYXRhJyAgICovCi0vKiBhbmQgJ2xlbmd0aCcgc2l6ZS4gICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSZXR1cm5zIG5vdGhpbmcuICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwcmludF9hdHRyX3N0cmFuZ2UocmVnaXN0ZXIgdV9jaGFyICpkYXRhLCB1X2ludCBsZW5ndGgsIHVfc2hvcnQgYXR0cl9jb2RlKQotewotICAgdV9zaG9ydCBsZW5fZGF0YTsKLQotICAgc3dpdGNoKGF0dHJfY29kZSkKLSAgIHsKLSAgICAgIGNhc2UgQVJBUF9QQVNTOgotICAgICAgICAgICBpZiAobGVuZ3RoICE9IDE2KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBsZW5ndGggJXUgIT0gMTYiLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIHByaW50ZigiVXNlcl9jaGFsbGVuZ2UgKCIpOwotICAgICAgICAgICBUQ0hFQ0syKGRhdGFbMF0sOCk7Ci0gICAgICAgICAgIGxlbl9kYXRhID0gODsKLSAgICAgICAgICAgUFJJTlRfSEVYKGxlbl9kYXRhLCBkYXRhKTsKLSAgICAgICAgICAgcHJpbnRmKCIpIFVzZXJfcmVzcCgiKTsKLSAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDgpOwotICAgICAgICAgICBsZW5fZGF0YSA9IDg7Ci0gICAgICAgICAgIFBSSU5UX0hFWChsZW5fZGF0YSwgZGF0YSk7Ci0gICAgICAgICAgIHByaW50ZigiKSIpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBUkFQX0ZFQVRVUkVTOgotICAgICAgICAgICBpZiAobGVuZ3RoICE9IDE0KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBsZW5ndGggJXUgIT0gMTQiLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIFRDSEVDSzIoZGF0YVswXSwxKTsKLSAgICAgICAgICAgaWYgKCpkYXRhKQotICAgICAgICAgICAgICBwcmludGYoIlVzZXIgY2FuIGNoYW5nZSBwYXNzd29yZCIpOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHByaW50ZigiVXNlciBjYW5ub3QgY2hhbmdlIHBhc3N3b3JkIik7Ci0gICAgICAgICAgIGRhdGErKzsKLSAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDEpOwotICAgICAgICAgICBwcmludGYoIiwgTWluIHBhc3N3b3JkIGxlbmd0aDogJWQiLCpkYXRhKTsKLSAgICAgICAgICAgZGF0YSsrOwotICAgICAgICAgICBwcmludGYoIiwgY3JlYXRlZCBhdDogIik7Ci0gICAgICAgICAgIFRDSEVDSzIoZGF0YVswXSw0KTsKLSAgICAgICAgICAgbGVuX2RhdGEgPSA0OwotICAgICAgICAgICBQUklOVF9IRVgobGVuX2RhdGEsIGRhdGEpOwotICAgICAgICAgICBwcmludGYoIiwgZXhwaXJlcyBpbjogIik7Ci0gICAgICAgICAgIFRDSEVDSzIoZGF0YVswXSw0KTsKLSAgICAgICAgICAgbGVuX2RhdGEgPSA0OwotICAgICAgICAgICBQUklOVF9IRVgobGVuX2RhdGEsIGRhdGEpOwotICAgICAgICAgICBwcmludGYoIiwgQ3VycmVudCBUaW1lOiAiKTsKLSAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDQpOwotICAgICAgICAgICBsZW5fZGF0YSA9IDQ7Ci0gICAgICAgICAgIFBSSU5UX0hFWChsZW5fZGF0YSwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFSQVBfQ0hBTExFTkdFX1JFU1A6Ci0gICAgICAgICAgIGlmIChsZW5ndGggPCA4KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBsZW5ndGggJXUgIT0gOCIsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgVENIRUNLMihkYXRhWzBdLDgpOwotICAgICAgICAgICBsZW5fZGF0YSA9IDg7Ci0gICAgICAgICAgIFBSSU5UX0hFWChsZW5fZGF0YSwgZGF0YSk7Ci0gICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuOwotCi0gICB0cnVuYzoKLSAgICAgcHJpbnRmKCIgW3xyYWRpdXNdIik7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZAotcmFkaXVzX2F0dHJzX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYXR0ciwgdV9pbnQgbGVuZ3RoKQotewotICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJhZGl1c19hdHRyICpyYWRfYXR0ciA9IChzdHJ1Y3QgcmFkaXVzX2F0dHIgKilhdHRyOwotICAgY29uc3QgY2hhciAqYXR0cl9zdHJpbmc7Ci0KLSAgIHdoaWxlIChsZW5ndGggPiAwKQotICAgewotICAgICBpZiAobGVuZ3RoIDwgMikKLSAgICAgICAgZ290byB0cnVuYzsKLSAgICAgVENIRUNLKCpyYWRfYXR0cik7Ci0gICAgIAotICAgICBpZiAocmFkX2F0dHItPnR5cGUgPiAwICYmIHJhZF9hdHRyLT50eXBlIDwgVEFNX1NJWkUoYXR0cl90eXBlKSkKLQlhdHRyX3N0cmluZyA9IGF0dHJfdHlwZVtyYWRfYXR0ci0+dHlwZV0ubmFtZTsKLSAgICAgZWxzZQotCWF0dHJfc3RyaW5nID0gIlVua25vd24iOwotICAgICBpZiAocmFkX2F0dHItPmxlbiA8IDIpCi0gICAgIHsKLQlwcmludGYoIlxuXHQgICVzIEF0dHJpYnV0ZSAoJXUpLCBsZW5ndGg6ICV1IChib2d1cywgbXVzdCBiZSA+PSAyKSIsCi0gICAgICAgICAgICAgICBhdHRyX3N0cmluZywKLSAgICAgICAgICAgICAgIHJhZF9hdHRyLT50eXBlLAotICAgICAgICAgICAgICAgcmFkX2F0dHItPmxlbik7Ci0JcmV0dXJuOwotICAgICB9Ci0gICAgIGlmIChyYWRfYXR0ci0+bGVuID4gbGVuZ3RoKQotICAgICB7Ci0JcHJpbnRmKCJcblx0ICAlcyBBdHRyaWJ1dGUgKCV1KSwgbGVuZ3RoOiAldSAoYm9ndXMsIGdvZXMgcGFzdCBlbmQgb2YgcGFja2V0KSIsCi0gICAgICAgICAgICAgICBhdHRyX3N0cmluZywKLSAgICAgICAgICAgICAgIHJhZF9hdHRyLT50eXBlLAotICAgICAgICAgICAgICAgcmFkX2F0dHItPmxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICBwcmludGYoIlxuXHQgICVzIEF0dHJpYnV0ZSAoJXUpLCBsZW5ndGg6ICV1LCBWYWx1ZTogIiwKLSAgICAgICAgICAgIGF0dHJfc3RyaW5nLAotICAgICAgICAgICAgcmFkX2F0dHItPnR5cGUsCi0gICAgICAgICAgICByYWRfYXR0ci0+bGVuKTsKLQotICAgICBpZiAocmFkX2F0dHItPnR5cGUgPCBUQU1fU0laRShhdHRyX3R5cGUpKQotICAgICB7Ci0gICAgICAgICBpZiAocmFkX2F0dHItPmxlbiA+IDIpCi0gICAgICAgICB7Ci0gICAgICAgICAgICAgaWYgKCBhdHRyX3R5cGVbcmFkX2F0dHItPnR5cGVdLnByaW50X2Z1bmMgKQotICAgICAgICAgICAgICAgICAoKmF0dHJfdHlwZVtyYWRfYXR0ci0+dHlwZV0ucHJpbnRfZnVuYykoCi0gICAgICAgICAgICAgICAgICAgICAoKHVfY2hhciAqKShyYWRfYXR0cisxKSksCi0gICAgICAgICAgICAgICAgICAgICByYWRfYXR0ci0+bGVuIC0gMiwgcmFkX2F0dHItPnR5cGUpOwotICAgICAgICAgfQotICAgICB9Ci0gICAgIC8qIGRvIHdlIGFsc28gd2FudCB0byBzZWUgYSBoZXggZHVtcCA/ICovCi0gICAgIGlmICh2ZmxhZz4gMSkKLSAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9jaGFyICopcmFkX2F0dHIrMiwiXG5cdCAgICAiLChyYWRfYXR0ci0+bGVuKS0yKTsKLQotICAgICBsZW5ndGgtPShyYWRfYXR0ci0+bGVuKTsKLSAgICAgcmFkX2F0dHIgPSAoc3RydWN0IHJhZGl1c19hdHRyICopKCAoKGNoYXIgKikocmFkX2F0dHIpKStyYWRfYXR0ci0+bGVuKTsKLSAgIH0KLSAgIHJldHVybjsKLQotdHJ1bmM6Ci0gICBwcmludGYoIiBbfHJhZGl1c10iKTsKLX0KLQotCi12b2lkCi1yYWRpdXNfcHJpbnQoY29uc3QgdV9jaGFyICpkYXQsIHVfaW50IGxlbmd0aCkKLXsKLSAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCByYWRpdXNfaGRyICpyYWQ7Ci0gICB1X2ludCBsZW4sIGF1dGhfaWR4OwotCi0gICBUQ0hFQ0syKCpkYXQsIE1JTl9SQURJVVNfTEVOKTsKLSAgIHJhZCA9IChzdHJ1Y3QgcmFkaXVzX2hkciAqKWRhdDsKLSAgIGxlbiA9IEVYVFJBQ1RfMTZCSVRTKCZyYWQtPmxlbik7Ci0KLSAgIGlmIChsZW4gPCBNSU5fUkFESVVTX0xFTikKLSAgIHsKLQkgIHByaW50ZigiIFt8cmFkaXVzXSIpOwotCSAgcmV0dXJuOwotICAgfQotCi0gICBpZiAobGVuID4gbGVuZ3RoKQotCSAgbGVuID0gbGVuZ3RoOwotCi0gICBpZiAodmZsYWcgPCAxKSB7Ci0gICAgICAgcHJpbnRmKCJSQURJVVMsICVzICgldSksIGlkOiAweCUwMnggbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgIHRvazJzdHIocmFkaXVzX2NvbW1hbmRfdmFsdWVzLCJVbmtub3duIENvbW1hbmQiLHJhZC0+Y29kZSksCi0gICAgICAgICAgICAgIHJhZC0+Y29kZSwKLSAgICAgICAgICAgICAgcmFkLT5pZCwKLSAgICAgICAgICAgICAgbGVuKTsKLSAgICAgICByZXR1cm47Ci0gICB9Ci0gICBlbHNlIHsKLSAgICAgICBwcmludGYoIlJBRElVUywgbGVuZ3RoOiAldVxuXHQlcyAoJXUpLCBpZDogMHglMDJ4LCBBdXRoZW50aWNhdG9yOiAiLAotICAgICAgICAgICAgICBsZW4sCi0gICAgICAgICAgICAgIHRvazJzdHIocmFkaXVzX2NvbW1hbmRfdmFsdWVzLCJVbmtub3duIENvbW1hbmQiLHJhZC0+Y29kZSksCi0gICAgICAgICAgICAgIHJhZC0+Y29kZSwKLSAgICAgICAgICAgICAgcmFkLT5pZCk7Ci0KLSAgICAgICBmb3IoYXV0aF9pZHg9MDsgYXV0aF9pZHggPCAxNjsgYXV0aF9pZHgrKykKLSAgICAgICAgICAgIHByaW50ZigiJTAyeCIsIHJhZC0+YXV0aFthdXRoX2lkeF0gKTsKLSAgIH0KLQotICAgaWYgKGxlbiA+IE1JTl9SQURJVVNfTEVOKQotICAgICAgcmFkaXVzX2F0dHJzX3ByaW50KCBkYXQgKyBNSU5fUkFESVVTX0xFTiwgbGVuIC0gTUlOX1JBRElVU19MRU4pOwotICAgcmV0dXJuOwotCi10cnVuYzoKLSAgIHByaW50ZigiIFt8cmFkaXVzXSIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtcmF3LmMgYi9wcmludC1yYXcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlNmRkMS4uMDAwMDAwMAotLS0gYS9wcmludC1yYXcuYworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1yYXcuYyx2IDEuNDEgMjAwMy8xMS8xNiAwOTozNjozNCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxwY2FwLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotLyoKLSAqIFRoZSBETFRfUkFXIHBhY2tldCBoYXMgbm8gaGVhZGVyLiBJdCBjb250YWlucyBhIHJhdyBJUCBwYWNrZXQuCi0gKi8KLQotdV9pbnQKLXJhd19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlpZiAoZWZsYWcpCi0JCXByaW50ZigiaXA6ICIpOwotCi0JaXBOX3ByaW50KHAsIGgtPmxlbik7Ci0KLQlyZXR1cm4gKDApOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtcmlwLmMgYi9wcmludC1yaXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyYTJlMC4uMDAwMDAwMAotLS0gYS9wcmludC1yaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcmlwLmMsdiAxLjU3IDIwMDMvMTEvMTYgMDk6MzY6MzQgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCQkJLyogbXVzdCBjb21lIGFmdGVyIGludGVyZmFjZS5oICovCi0KLXN0cnVjdCByaXAgewotCXVfaW50OF90IHJpcF9jbWQ7CQkvKiByZXF1ZXN0L3Jlc3BvbnNlICovCi0JdV9pbnQ4X3QgcmlwX3ZlcnM7CQkvKiBwcm90b2NvbCB2ZXJzaW9uICMgKi8KLQl1X2ludDhfdCB1bnVzZWRbMl07CQkvKiB1bnVzZWQgKi8KLX07Ci0KLSNkZWZpbmUJUklQQ01EX1JFUVVFU1QJCTEJLyogd2FudCBpbmZvICovCi0jZGVmaW5lCVJJUENNRF9SRVNQT05TRQkJMgkvKiByZXNwb25kaW5nIHRvIHJlcXVlc3QgKi8KLSNkZWZpbmUJUklQQ01EX1RSQUNFT04JCTMJLyogdHVybiB0cmFjaW5nIG9uICovCi0jZGVmaW5lCVJJUENNRF9UUkFDRU9GRgkJNAkvKiB0dXJuIGl0IG9mZiAqLwotI2RlZmluZQlSSVBDTURfUE9MTAkJNQkvKiB3YW50IGluZm8gZnJvbSBldmVyeWJvZHkgKi8KLSNkZWZpbmUJUklQQ01EX1BPTExFTlRSWQk2CS8qIHBvbGwgZm9yIGVudHJ5ICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJpcF9jbWRfdmFsdWVzW10gPSB7Ci0gICAgeyBSSVBDTURfUkVRVUVTVCwJICAgICAgICAiUmVxdWVzdCIgfSwKLSAgICB7IFJJUENNRF9SRVNQT05TRSwJICAgICAgICAiUmVzcG9uc2UiIH0sCi0gICAgeyBSSVBDTURfVFJBQ0VPTiwJICAgICAgICAiVHJhY2Ugb24iIH0sCi0gICAgeyBSSVBDTURfVFJBQ0VPRkYsCSAgICAgICAgIlRyYWNlIG9mZiIgfSwKLSAgICB7IFJJUENNRF9QT0xMLAkgICAgICAgICJQb2xsIiB9LAotICAgIHsgUklQQ01EX1BPTExFTlRSWSwJICAgICAgICAiUG9sbCBFbnRyeSIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0jZGVmaW5lIFJJUF9BVVRITEVOICAxNgotI2RlZmluZSBSSVBfUk9VVEVMRU4gMjAKLQotLyoKLSAqIHJmYyAxNzIzCi0gKiAKLSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzIDMKLSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiB8IENvbW1hbmQgKDEpICAgfCBWZXJzaW9uICgxKSAgIHwgICAgICAgICAgIHVudXNlZCAgICAgICAgICAgICAgfAotICogKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgQWRkcmVzcyBGYW1pbHkgSWRlbnRpZmllciAoMikgfCAgICAgICAgUm91dGUgVGFnICgyKSAgICAgICAgICB8Ci0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICBJUCBBZGRyZXNzICg0KSAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym5ldCBNYXNrICg0KSAgICAgICAgICAgICAgICAgICAgICAgfAotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dCBIb3AgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogfCAgICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWMgKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKgotICovCi0KLXN0cnVjdCByaXBfbmV0aW5mbyB7Ci0JdV9pbnQxNl90IHJpcF9mYW1pbHk7Ci0JdV9pbnQxNl90IHJpcF90YWc7Ci0JdV9pbnQzMl90IHJpcF9kZXN0OwotCXVfaW50MzJfdCByaXBfZGVzdF9tYXNrOwotCXVfaW50MzJfdCByaXBfcm91dGVyOwotCXVfaW50MzJfdCByaXBfbWV0cmljOwkJLyogY29zdCBvZiByb3V0ZSAqLwotfTsKLQotc3RhdGljIHZvaWQKLXJpcF9lbnRyeV9wcmludF92MShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmlwX25ldGluZm8gKm5pKQotewotCXJlZ2lzdGVyIHVfc2hvcnQgZmFtaWx5OwotCi0JLyogUkZDIDEwNTggKi8KLQlmYW1pbHkgPSBFWFRSQUNUXzE2QklUUygmbmktPnJpcF9mYW1pbHkpOwotCWlmIChmYW1pbHkgIT0gQUZfSU5FVCkgewotCQlwcmludGYoIlxuXHQgQUZJOiAldToiLCBmYW1pbHkpOwotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKikmbmktPnJpcF9mYW1pbHksIlxuXHQgICIsUklQX1JPVVRFTEVOKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXBfdGFnKSB8fAotCSAgICBFWFRSQUNUXzMyQklUUygmbmktPnJpcF9kZXN0X21hc2spIHx8Ci0JICAgIEVYVFJBQ1RfMzJCSVRTKCZuaS0+cmlwX3JvdXRlcikpIHsKLQkJLyogTUJaIGZpZWxkcyBub3QgemVybyAqLwotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKikmbmktPnJpcF9mYW1pbHksIlxuXHQgICIsUklQX1JPVVRFTEVOKTsKLQkJcmV0dXJuOwotCX0gLyogQUZfSU5FVCAqLwotCXByaW50ZigiXG5cdCAgJXMsIG1ldHJpYzogJXUiLAotICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZygmbmktPnJpcF9kZXN0KSwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJm5pLT5yaXBfbWV0cmljKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yaXBfZW50cnlfcHJpbnRfdjIocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJpcF9uZXRpbmZvICpuaSkKLXsKLQlyZWdpc3RlciB1X2NoYXIgKnA7Ci0JcmVnaXN0ZXIgdV9zaG9ydCBmYW1pbHk7Ci0JdV9jaGFyIGJ1ZltSSVBfQVVUSExFTl07Ci0KLQlmYW1pbHkgPSBFWFRSQUNUXzE2QklUUygmbmktPnJpcF9mYW1pbHkpOwotCWlmIChmYW1pbHkgPT0gMHhGRkZGKSB7IC8qIDE2IGJ5dGVzIGF1dGhlbnRpY2F0aW9uID8gKi8KLSAgICAgICAgICAgICAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXBfdGFnKSA9PSAyKSB7IC8qIHNpbXBsZSB0ZXh0IGF1dGhlbnRpY2F0aW9uID8gKi8KLQkJCW1lbWNweShidWYsICZuaS0+cmlwX2Rlc3QsIHNpemVvZihidWYpKTsKLQkJCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7Ci0JCQlmb3IgKHAgPSBidWY7ICpwOyBwKyspIHsKLQkJCQlpZiAoIWlzcHJpbnQoKnApKQotCQkJCQlicmVhazsKLQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdCAgU2ltcGxlIFRleHQgQXV0aGVudGljYXRpb24gZGF0YTogJXMiLCBidWYpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0JCQlwcmludGYoIlxuXHQgIFVua25vd24gKCV1KSBBdXRoZW50aWNhdGlvbiBkYXRhOiIsCi0JCQkgICAgICAgRVhUUkFDVF8xNkJJVFMoJm5pLT5yaXBfdGFnKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEoKHVfaW50OF90ICopJm5pLT5yaXBfZGVzdCwiXG5cdCAgIixSSVBfQVVUSExFTik7Ci0JCX0KLQl9IGVsc2UgaWYgKGZhbWlseSAhPSBBRl9JTkVUKSB7Ci0JCXByaW50ZigiXG5cdCAgQUZJOiAldSIsIGZhbWlseSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKCh1X2ludDhfdCAqKSZuaS0+cmlwX3RhZywiXG5cdCAgIixSSVBfUk9VVEVMRU4tMik7Ci0JCXJldHVybjsKLQl9IGVsc2UgeyAvKiBBRl9JTkVUICovCi0JCXByaW50ZigiXG5cdCAgQUZJOiBJUHY0OiAlMTVzLyUtMmQsIHRhZyAweCUwNHgsIG1ldHJpYzogJXUsIG5leHQtaG9wOiAiLAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKCZuaS0+cmlwX2Rlc3QpLAotCQkgICAgICAgbWFzazJwbGVuKEVYVFJBQ1RfMzJCSVRTKCZuaS0+cmlwX2Rlc3RfbWFzaykpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUygmbmktPnJpcF90YWcpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUygmbmktPnJpcF9tZXRyaWMpKTsKLQkJaWYgKEVYVFJBQ1RfMzJCSVRTKCZuaS0+cmlwX3JvdXRlcikpCi0JCQlwcmludGYoIiVzIiwgaXBhZGRyX3N0cmluZygmbmktPnJpcF9yb3V0ZXIpKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHByaW50Zigic2VsZiIpOwotCX0KLX0KLQotdm9pZAotcmlwX3ByaW50KGNvbnN0IHVfY2hhciAqZGF0LCB1X2ludCBsZW5ndGgpCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJpcCAqcnA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHJpcF9uZXRpbmZvICpuaTsKLQlyZWdpc3RlciB1X2ludCBpLCBqOwotCXJlZ2lzdGVyIGludCB0cnVuYzsKLQotCWlmIChzbmFwZW5kIDwgZGF0KSB7Ci0JCXByaW50ZigiIFt8cmlwXSIpOwotCQlyZXR1cm47Ci0JfQotCWkgPSBzbmFwZW5kIC0gZGF0OwotCWlmIChpID4gbGVuZ3RoKQotCQlpID0gbGVuZ3RoOwotCWlmIChpIDwgc2l6ZW9mKCpycCkpIHsKLQkJcHJpbnRmKCIgW3xyaXBdIik7Ci0JCXJldHVybjsKLQl9Ci0JaSAtPSBzaXplb2YoKnJwKTsKLQotCXJwID0gKHN0cnVjdCByaXAgKilkYXQ7Ci0KLSAgICAgICAgcHJpbnRmKCIlc1JJUHYldSIsCi0gICAgICAgICAgICAgICAodmZsYWcgPj0gMSkgPyAiXG5cdCIgOiAiIiwKLSAgICAgICAgICAgICAgIHJwLT5yaXBfdmVycyk7Ci0KLQlzd2l0Y2ggKHJwLT5yaXBfdmVycykgewotCWNhc2UgMDoKLQkJLyoKLQkJICogUkZDIDEwNTguCi0JCSAqCi0JCSAqIFhYWCAtIFJGQyAxMDU4IHNheXMKLQkJICoKLQkJICogMCAgRGF0YWdyYW1zIHdob3NlIHZlcnNpb24gbnVtYmVyIGlzIHplcm8gYXJlIHRvIGJlIGlnbm9yZWQuCi0JCSAqICAgIFRoZXNlIGFyZSBmcm9tIGEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgcHJvdG9jb2wsIHdob3NlCi0JCSAqICAgIHBhY2tldCBmb3JtYXQgd2FzIG1hY2hpbmUtc3BlY2lmaWMuCi0JCSAqCi0JCSAqIHNvIHBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgZHVtcCB0aGUgcGFja2V0LCBpbiBoZXguCi0JCSAqLwotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKikmcnAtPnJpcF9jbWQsIlxuXHQiLGxlbmd0aCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogZHVtcCB2ZXJzaW9uIGFuZCBsZXRzIHNlZSBpZiB3ZSBrbm93IHRoZSBjb21tYW5kcyBuYW1lKi8KLSAgICAgICAgICAgICAgICBwcmludGYoIiwgJXMsIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJpcF9jbWRfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGNvbW1hbmQgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnAtPnJpcF9jbWQpLAotICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZmbGFnIDwgMSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotCi0JCXN3aXRjaCAocnAtPnJpcF9jbWQpIHsKLQkJY2FzZSBSSVBDTURfUkVTUE9OU0U6Ci0JCQlqID0gbGVuZ3RoIC8gc2l6ZW9mKCpuaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgcm91dGVzOiAldSIsaik7Ci0JCQl0cnVuYyA9IChpIC8gc2l6ZW9mKCpuaSkpICE9IGo7Ci0JCQluaSA9IChzdHJ1Y3QgcmlwX25ldGluZm8gKikocnAgKyAxKTsKLQkJCWZvciAoOyBpID49IHNpemVvZigqbmkpOyArK25pKSB7Ci0JCQkJaWYgKHJwLT5yaXBfdmVycyA9PSAxKQotCQkJCQlyaXBfZW50cnlfcHJpbnRfdjEobmkpOwotCQkJCWVsc2UgaWYgKHJwLT5yaXBfdmVycyA9PSAyKQotCQkJCQlyaXBfZW50cnlfcHJpbnRfdjIobmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQkJCQlpIC09IHNpemVvZigqbmkpOwotCQkJfQotCQkJaWYgKHRydW5jKQotCQkJCXByaW50ZigiW3xyaXBdIik7Ci0JCQlicmVhazsKLQotCQljYXNlIFJJUENNRF9SRVFVRVNUOgotCQljYXNlIFJJUENNRF9UUkFDRU9GRjoKLQkJY2FzZSBSSVBDTURfUE9MTDoKLQkJY2FzZSBSSVBDTURfUE9MTEVOVFJZOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBSSVBDTURfVFJBQ0VPTjoKLSAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0JICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKilycCwiXG5cdCIsbGVuZ3RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGRvIHdlIHdhbnQgdG8gc2VlIGFuIGFkZGl0aW9uYWxseSBoZXhkdW1wID8gKi8KLSAgICAgICAgICAgICAgICBpZiAodmZsYWc+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YSgodV9pbnQ4X3QgKilycCwiXG5cdCIsbGVuZ3RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0KLQotCmRpZmYgLS1naXQgYS9wcmludC1yaXBuZy5jIGIvcHJpbnQtcmlwbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU3YTAyZS4uMDAwMDAwMAotLS0gYS9wcmludC1yaXBuZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1yaXBuZy5jLHYgMS4xOCAyMDA1LzAxLzA0IDAwOjE1OjU0IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSU5FVDYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgInJvdXRlNmQuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaWYgIWRlZmluZWQoSU42X0lTX0FERFJfVU5TUEVDSUZJRUQpICYmICFkZWZpbmVkKF9NU0NfVkVSKSAvKiBNU1ZDIGlubGluZSAqLwotc3RhdGljIGludCBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCi17Ci0gICAgc3RhdGljIGNvbnN0IHN0cnVjdCBpbjZfYWRkciBpbjZhZGRyX2FueTsgICAgICAgIC8qIDo6ICovCi0gICAgcmV0dXJuIChtZW1jbXAoYWRkciwgJmluNmFkZHJfYW55LCBzaXplb2YoKmFkZHIpKSA9PSAwKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1yaXA2X2VudHJ5X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBuZXRpbmZvNiAqbmksIGludCBtZXRyaWMpCi17Ci0JaW50IGw7Ci0JbCA9IHByaW50ZigiJXMvJWQiLCBpcDZhZGRyX3N0cmluZygmbmktPnJpcDZfZGVzdCksIG5pLT5yaXA2X3BsZW4pOwotCWlmIChuaS0+cmlwNl90YWcpCi0JCWwgKz0gcHJpbnRmKCIgWyVkXSIsIEVYVFJBQ1RfMTZCSVRTKCZuaS0+cmlwNl90YWcpKTsKLQlpZiAobWV0cmljKQotCQlsICs9IHByaW50ZigiICglZCkiLCBuaS0+cmlwNl9tZXRyaWMpOwotCXJldHVybiBsOwotfQotCi12b2lkCi1yaXBuZ19wcmludChjb25zdCB1X2NoYXIgKmRhdCwgdW5zaWduZWQgaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgcmlwNiAqcnAgPSAoc3RydWN0IHJpcDYgKilkYXQ7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG5ldGluZm82ICpuaTsKLQlyZWdpc3RlciB1X2ludCBhbXQ7Ci0JcmVnaXN0ZXIgdV9pbnQgaTsKLQlpbnQgajsKLQlpbnQgdHJ1bmM7Ci0KLQlpZiAoc25hcGVuZCA8IGRhdCkKLQkJcmV0dXJuOwotCWFtdCA9IHNuYXBlbmQgLSBkYXQ7Ci0JaSA9IG1pbihsZW5ndGgsIGFtdCk7Ci0JaWYgKGkgPCAoc2l6ZW9mKHN0cnVjdCByaXA2KSAtIHNpemVvZihzdHJ1Y3QgbmV0aW5mbzYpKSkKLQkJcmV0dXJuOwotCWkgLT0gKHNpemVvZihzdHJ1Y3QgcmlwNikgLSBzaXplb2Yoc3RydWN0IG5ldGluZm82KSk7Ci0KLQlzd2l0Y2ggKHJwLT5yaXA2X2NtZCkgewotCi0JY2FzZSBSSVA2X1JFUVVFU1Q6Ci0JCWogPSBsZW5ndGggLyBzaXplb2YoKm5pKTsKLQkJaWYgKGogPT0gMQotCQkgICAgJiYgIHJwLT5yaXA2X25ldHMtPnJpcDZfbWV0cmljID09IEhPUENOVF9JTkZJTklUWTYKLQkJICAgICYmICBJTjZfSVNfQUREUl9VTlNQRUNJRklFRCgmcnAtPnJpcDZfbmV0cy0+cmlwNl9kZXN0KSkgewotCQkJcHJpbnRmKCIgcmlwbmctcmVxIGR1bXAiKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChqICogc2l6ZW9mKCpuaSkgIT0gbGVuZ3RoIC0gNCkKLQkJCXByaW50ZigiIHJpcG5nLXJlcSAlZFsldV06IiwgaiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIgcmlwbmctcmVxICVkOiIsIGopOwotCQl0cnVuYyA9ICgoaSAvIHNpemVvZigqbmkpKSAqIHNpemVvZigqbmkpICE9IGkpOwotCQlmb3IgKG5pID0gcnAtPnJpcDZfbmV0czsgaSA+PSBzaXplb2YoKm5pKTsKLQkJICAgIGkgLT0gc2l6ZW9mKCpuaSksICsrbmkpIHsKLQkJCWlmICh2ZmxhZyA+IDEpCi0JCQkJcHJpbnRmKCJcblx0Iik7Ci0JCQllbHNlCi0JCQkJcHJpbnRmKCIgIik7Ci0JCQlyaXA2X2VudHJ5X3ByaW50KG5pLCAwKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFJJUDZfUkVTUE9OU0U6Ci0JCWogPSBsZW5ndGggLyBzaXplb2YoKm5pKTsKLQkJaWYgKGogKiBzaXplb2YoKm5pKSAhPSBsZW5ndGggLSA0KQotCQkJcHJpbnRmKCIgcmlwbmctcmVzcCAlZFsldV06IiwgaiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIgcmlwbmctcmVzcCAlZDoiLCBqKTsKLQkJdHJ1bmMgPSAoKGkgLyBzaXplb2YoKm5pKSkgKiBzaXplb2YoKm5pKSAhPSBpKTsKLQkJZm9yIChuaSA9IHJwLT5yaXA2X25ldHM7IGkgPj0gc2l6ZW9mKCpuaSk7Ci0JCSAgICBpIC09IHNpemVvZigqbmkpLCArK25pKSB7Ci0JCQlpZiAodmZsYWcgPiAxKQotCQkJCXByaW50ZigiXG5cdCIpOwotCQkJZWxzZQotCQkJCXByaW50ZigiICIpOwotCQkJcmlwNl9lbnRyeV9wcmludChuaSwgbmktPnJpcDZfbWV0cmljKTsKLQkJfQotCQlpZiAodHJ1bmMpCi0JCQlwcmludGYoIlt8cmlwbmddIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByaW50ZigiIHJpcG5nLSVkID8/ICV1IiwgcnAtPnJpcDZfY21kLCBsZW5ndGgpOwotCQlicmVhazsKLQl9Ci0JaWYgKHJwLT5yaXA2X3ZlcnMgIT0gUklQNl9WRVJTSU9OKQotCQlwcmludGYoIiBbdmVycyAlZF0iLCBycC0+cmlwNl92ZXJzKTsKLX0KLSNlbmRpZiAvKiBJTkVUNiAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtcnN2cC5jIGIvcHJpbnQtcnN2cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDUxOTMwLi4wMDAwMDAwCi0tLSBhL3ByaW50LXJzdnAuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBUQ1BEVU1QIHByb2plY3QKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogT3JpZ2luYWwgY29kZSBieSBIYW5uZXMgR3JlZGxlciAoaGFubmVzQGp1bmlwZXIubmV0KQotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXJzdnAuYyx2IDEuMzMuMi4xNSAyMDA3LzA5LzEzIDE3OjMzOjU0IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotI2luY2x1ZGUgImdtcGxzLmgiCi0jaW5jbHVkZSAiYWYuaCIKLQotLyoKLSAqIFJGQyAyMjA1IGNvbW1vbiBoZWFkZXIKLSAqCi0gKiAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMiAgICAgICAgICAgICAzCi0gKiAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgfCBWZXJzIHwgRmxhZ3N8ICBNc2cgVHlwZSAgIHwgICAgICAgUlNWUCBDaGVja3N1bSAgICAgICB8Ci0gKiAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgfCAgU2VuZF9UVEwgICB8IChSZXNlcnZlZCkgIHwgICAgICAgIFJTVlAgTGVuZ3RoICAgICAgICB8Ci0gKiAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCi0gKgotICovCi0KLXN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIgewotICAgIHVfaW50OF90IHZlcnNpb25fZmxhZ3M7Ci0gICAgdV9pbnQ4X3QgbXNnX3R5cGU7Ci0gICAgdV9pbnQ4X3QgY2hlY2tzdW1bMl07Ci0gICAgdV9pbnQ4X3QgdHRsOwotICAgIHVfaW50OF90IHJlc2VydmVkOwotICAgIHVfaW50OF90IGxlbmd0aFsyXTsKLX07Ci0KLS8qIAotICogUkZDMjIwNSBvYmplY3QgaGVhZGVyCi0gKgotICogCi0gKiAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgMiAgICAgICAgICAgICAzCi0gKiAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgfCAgICAgICBMZW5ndGggKGJ5dGVzKSAgICAgIHwgIENsYXNzLU51bSAgfCAgIEMtVHlwZSAgICB8Ci0gKiAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rCi0gKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAoT2JqZWN0IGNvbnRlbnRzKSAgICAgICAgICAgICAgICAgICAvLwotICogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKwotICovCi0KLXN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIgewotICAgIHVfaW50OF90IGxlbmd0aFsyXTsKLSAgICB1X2ludDhfdCBjbGFzc19udW07Ci0gICAgdV9pbnQ4X3QgY3R5cGU7Ci19OwotCi0jZGVmaW5lIFJTVlBfVkVSU0lPTiAgICAgICAgICAgIDEKLSNkZWZpbmUJUlNWUF9FWFRSQUNUX1ZFUlNJT04oeCkgKCgoeCkmMHhmMCk+PjQpIAotI2RlZmluZQlSU1ZQX0VYVFJBQ1RfRkxBR1MoeCkgICAoKHgpJjB4MGYpCi0KLSNkZWZpbmUJUlNWUF9NU0dUWVBFX1BBVEggICAgICAgMQotI2RlZmluZQlSU1ZQX01TR1RZUEVfUkVTViAgICAgICAyCi0jZGVmaW5lCVJTVlBfTVNHVFlQRV9QQVRIRVJSICAgIDMKLSNkZWZpbmUJUlNWUF9NU0dUWVBFX1JFU1ZFUlIgICAgNAotI2RlZmluZQlSU1ZQX01TR1RZUEVfUEFUSFRFQVIgICA1Ci0jZGVmaW5lCVJTVlBfTVNHVFlQRV9SRVNWVEVBUiAgIDYKLSNkZWZpbmUJUlNWUF9NU0dUWVBFX1JFU1ZDT05GICAgNwotI2RlZmluZSBSU1ZQX01TR1RZUEVfQUdHUkVHQVRFICAxMgotI2RlZmluZSBSU1ZQX01TR1RZUEVfQUNLICAgICAgICAxMwotI2RlZmluZSBSU1ZQX01TR1RZUEVfSEVMTE9fT0xEICAxNCAgICAgIC8qIGFuY2llbnQgSGVsbG9zICovCi0jZGVmaW5lIFJTVlBfTVNHVFlQRV9TUkVGUkVTSCAgIDE1Ci0jZGVmaW5lCVJTVlBfTVNHVFlQRV9IRUxMTyAgICAgIDIwCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfbXNnX3R5cGVfdmFsdWVzW10gPSB7Ci0gICAgeyBSU1ZQX01TR1RZUEVfUEFUSCwJIlBhdGgiIH0sCi0gICAgeyBSU1ZQX01TR1RZUEVfUkVTViwJIlJlc3YiIH0sCi0gICAgeyBSU1ZQX01TR1RZUEVfUEFUSEVSUiwJIlBhdGhFcnIiIH0sCi0gICAgeyBSU1ZQX01TR1RZUEVfUkVTVkVSUiwJIlJlc3ZFcnIiIH0sCi0gICAgeyBSU1ZQX01TR1RZUEVfUEFUSFRFQVIsCSJQYXRoVGVhciIgfSwKLSAgICB7IFJTVlBfTVNHVFlQRV9SRVNWVEVBUiwJIlJlc3ZUZWFyIiB9LAotICAgIHsgUlNWUF9NU0dUWVBFX1JFU1ZDT05GLAkiUmVzdkNvbmYiIH0sCi0gICAgeyBSU1ZQX01TR1RZUEVfQUdHUkVHQVRFLAkiQWdncmVnYXRlIiB9LAotICAgIHsgUlNWUF9NU0dUWVBFX0FDSywJICAgICAgICAiQWNrbm93bGVkZ2VtZW50IiB9LAotICAgIHsgUlNWUF9NU0dUWVBFX0hFTExPX09MRCwJIkhlbGxvIChPbGQpIiB9LAotICAgIHsgUlNWUF9NU0dUWVBFX1NSRUZSRVNILAkiUmVmcmVzaCIgfSwKLSAgICB7IFJTVlBfTVNHVFlQRV9IRUxMTywJIkhlbGxvIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfaGVhZGVyX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLAkgICAgICAgICAgICAgICJSZWZyZXNoIHJlZHVjdGlvbiBjYXBhYmxlIiB9LCAvKiByZmMyOTYxICovCi0gICAgeyAwLCBOVUxMfQotfTsKLQotI2RlZmluZQlSU1ZQX09CSl9TRVNTSU9OICAgICAgICAgICAgMSAgIC8qIHJmYzIyMDUgKi8KLSNkZWZpbmUJUlNWUF9PQkpfUlNWUF9IT1AgICAgICAgICAgIDMgICAvKiByZmMyMjA1LCByZmMzNDczICovCi0jZGVmaW5lCVJTVlBfT0JKX0lOVEVHUklUWSAgICAgICAgICA0ICAgLyogcmZjMjc0NyAqLwotI2RlZmluZQlSU1ZQX09CSl9USU1FX1ZBTFVFUyAgICAgICAgNSAgIC8qIHJmYzIyMDUgKi8KLSNkZWZpbmUJUlNWUF9PQkpfRVJST1JfU1BFQyAgICAgICAgIDYgCi0jZGVmaW5lCVJTVlBfT0JKX1NDT1BFICAgICAgICAgICAgICA3Ci0jZGVmaW5lCVJTVlBfT0JKX1NUWUxFICAgICAgICAgICAgICA4ICAgLyogcmZjMjIwNSAqLwotI2RlZmluZQlSU1ZQX09CSl9GTE9XU1BFQyAgICAgICAgICAgOSAgIC8qIHJmYzIyMTUgKi8KLSNkZWZpbmUJUlNWUF9PQkpfRklMVEVSU1BFQyAgICAgICAgIDEwICAvKiByZmMyMjE1ICovCi0jZGVmaW5lCVJTVlBfT0JKX1NFTkRFUl9URU1QTEFURSAgICAxMQotI2RlZmluZQlSU1ZQX09CSl9TRU5ERVJfVFNQRUMgICAgICAgMTIgIC8qIHJmYzIyMTUgKi8KLSNkZWZpbmUJUlNWUF9PQkpfQURTUEVDICAgICAgICAgICAgIDEzICAvKiByZmMyMjE1ICovCi0jZGVmaW5lCVJTVlBfT0JKX1BPTElDWV9EQVRBICAgICAgICAxNAotI2RlZmluZQlSU1ZQX09CSl9DT05GSVJNICAgICAgICAgICAgMTUgIC8qIHJmYzIyMDUgKi8KLSNkZWZpbmUJUlNWUF9PQkpfTEFCRUwgICAgICAgICAgICAgIDE2ICAvKiByZmMzMjA5ICovCi0jZGVmaW5lCVJTVlBfT0JKX0xBQkVMX1JFUSAgICAgICAgICAxOSAgLyogcmZjMzIwOSAqLwotI2RlZmluZQlSU1ZQX09CSl9FUk8gICAgICAgICAgICAgICAgMjAgIC8qIHJmYzMyMDkgKi8KLSNkZWZpbmUJUlNWUF9PQkpfUlJPICAgICAgICAgICAgICAgIDIxICAvKiByZmMzMjA5ICovCi0jZGVmaW5lCVJTVlBfT0JKX0hFTExPICAgICAgICAgICAgICAyMiAgLyogcmZjMzIwOSAqLwotI2RlZmluZQlSU1ZQX09CSl9NRVNTQUdFX0lEICAgICAgICAgMjMgIC8qIHJmYzI5NjEgKi8KLSNkZWZpbmUJUlNWUF9PQkpfTUVTU0FHRV9JRF9BQ0sgICAgIDI0ICAvKiByZmMyOTYxICovCi0jZGVmaW5lCVJTVlBfT0JKX01FU1NBR0VfSURfTElTVCAgICAyNSAgLyogcmZjMjk2MSAqLwotI2RlZmluZQlSU1ZQX09CSl9SRUNPVkVSWV9MQUJFTCAgICAgMzQgIC8qIHJmYzM0NzMgKi8KLSNkZWZpbmUJUlNWUF9PQkpfVVBTVFJFQU1fTEFCRUwgICAgIDM1ICAvKiByZmMzNDczICovCi0jZGVmaW5lCVJTVlBfT0JKX0xBQkVMX1NFVCAgICAgICAgICAzNiAgLyogcmZjMzQ3MyAqLwotI2RlZmluZQlSU1ZQX09CSl9QUk9URUNUSU9OICAgICAgICAgMzcgIC8qIHJmYzM0NzMgKi8KLSNkZWZpbmUJUlNWUF9PQkpfREVUT1VSICAgICAgICAgICAgIDYzICAvKiBkcmFmdC1pZXRmLW1wbHMtcnN2cC1sc3AtZmFzdHJlcm91dGUtMDcgKi8KLSNkZWZpbmUJUlNWUF9PQkpfQ0xBU1NUWVBFICAgICAgICAgIDY2ICAvKiByZmM0MTI0ICovCi0jZGVmaW5lIFJTVlBfT0JKX0NMQVNTVFlQRV9PTEQgICAgICAxMjUgLyogZHJhZnQtaWV0Zi10ZXdnLWRpZmYtdGUtcHJvdG8tMDcgKi8KLSNkZWZpbmUJUlNWUF9PQkpfU1VHR0VTVEVEX0xBQkVMICAgIDEyOSAvKiByZmMzNDczICovCi0jZGVmaW5lCVJTVlBfT0JKX0FDQ0VQVF9MQUJFTF9TRVQgICAxMzAgLyogcmZjMzQ3MyAqLwotI2RlZmluZQlSU1ZQX09CSl9SRVNUQVJUX0NBUEFCSUxJVFkgMTMxIC8qIHJmYzM0NzMgKi8KLSNkZWZpbmUJUlNWUF9PQkpfTk9USUZZX1JFUSAgICAgICAgIDE5NSAvKiByZmMzNDczICovCi0jZGVmaW5lCVJTVlBfT0JKX0FETUlOX1NUQVRVUyAgICAgICAxOTYgLyogcmZjMzQ3MyAqLwotI2RlZmluZQlSU1ZQX09CSl9QUk9QRVJUSUVTICAgICAgICAgMjA0IC8qIGp1bmlwZXIgcHJvcHJpZXRhcnkgKi8KLSNkZWZpbmUJUlNWUF9PQkpfRkFTVFJFUk9VVEUgICAgICAgIDIwNSAvKiBkcmFmdC1pZXRmLW1wbHMtcnN2cC1sc3AtZmFzdHJlcm91dGUtMDcgKi8KLSNkZWZpbmUJUlNWUF9PQkpfU0VTU0lPTl9BVFRSSUJVVEUgIDIwNyAvKiByZmMzMjA5ICovCi0jZGVmaW5lIFJTVlBfT0JKX0dFTkVSQUxJWkVEX1VOSSAgICAyMjkgLyogT0lGIFJTVlAgZXh0ZW5zaW9ucyBVTkkgMS4wIFNpZ25hbGluZywgUmVsLiAyICovCi0jZGVmaW5lIFJTVlBfT0JKX0NBTExfSUQgICAgICAgICAgICAyMzAgLyogcmZjMzQ3NCAqLwotI2RlZmluZSBSU1ZQX09CSl9DQUxMX09QUyAgICAgICAgICAgMjM2IC8qIHJmYzM0NzQgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9vYmpfdmFsdWVzW10gPSB7Ci0gICAgeyBSU1ZQX09CSl9TRVNTSU9OLCAgICAgICAgICAgICJTZXNzaW9uIiB9LAotICAgIHsgUlNWUF9PQkpfUlNWUF9IT1AsICAgICAgICAgICAiUlNWUCBIb3AiIH0sCi0gICAgeyBSU1ZQX09CSl9JTlRFR1JJVFksICAgICAgICAgICJJbnRlZ3JpdHkiIH0sCi0gICAgeyBSU1ZQX09CSl9USU1FX1ZBTFVFUywgICAgICAgICJUaW1lIFZhbHVlcyIgfSwKLSAgICB7IFJTVlBfT0JKX0VSUk9SX1NQRUMsICAgICAgICAgIkVycm9yIFNwZWMiIH0sCi0gICAgeyBSU1ZQX09CSl9TQ09QRSwgICAgICAgICAgICAgICJTY29wZSIgfSwKLSAgICB7IFJTVlBfT0JKX1NUWUxFLCAgICAgICAgICAgICAgIlN0eWxlIiB9LAotICAgIHsgUlNWUF9PQkpfRkxPV1NQRUMsICAgICAgICAgICAiRmxvd3NwZWMiIH0sCi0gICAgeyBSU1ZQX09CSl9GSUxURVJTUEVDLCAgICAgICAgICJGaWx0ZXJTcGVjIiB9LAotICAgIHsgUlNWUF9PQkpfU0VOREVSX1RFTVBMQVRFLCAgICAiU2VuZGVyIFRlbXBsYXRlIiB9LAotICAgIHsgUlNWUF9PQkpfU0VOREVSX1RTUEVDLCAgICAgICAiU2VuZGVyIFRTcGVjIiB9LAotICAgIHsgUlNWUF9PQkpfQURTUEVDLCAgICAgICAgICAgICAiQWRzcGVjIiB9LAotICAgIHsgUlNWUF9PQkpfUE9MSUNZX0RBVEEsICAgICAgICAiUG9saWN5IERhdGEiIH0sCi0gICAgeyBSU1ZQX09CSl9DT05GSVJNLCAgICAgICAgICAgICJDb25maXJtIiB9LAotICAgIHsgUlNWUF9PQkpfTEFCRUwsICAgICAgICAgICAgICAiTGFiZWwiIH0sCi0gICAgeyBSU1ZQX09CSl9MQUJFTF9SRVEsICAgICAgICAgICJMYWJlbCBSZXF1ZXN0IiB9LAotICAgIHsgUlNWUF9PQkpfRVJPLCAgICAgICAgICAgICAgICAiRVJPIiB9LAotICAgIHsgUlNWUF9PQkpfUlJPLCAgICAgICAgICAgICAgICAiUlJPIiB9LAotICAgIHsgUlNWUF9PQkpfSEVMTE8sICAgICAgICAgICAgICAiSGVsbG8iIH0sCi0gICAgeyBSU1ZQX09CSl9NRVNTQUdFX0lELCAgICAgICAgICJNZXNzYWdlIElEIiB9LAotICAgIHsgUlNWUF9PQkpfTUVTU0FHRV9JRF9BQ0ssICAgICAiTWVzc2FnZSBJRCBBY2siIH0sCi0gICAgeyBSU1ZQX09CSl9NRVNTQUdFX0lEX0xJU1QsICAgICJNZXNzYWdlIElEIExpc3QiIH0sCi0gICAgeyBSU1ZQX09CSl9SRUNPVkVSWV9MQUJFTCwgICAgICJSZWNvdmVyeSBMYWJlbCIgfSwKLSAgICB7IFJTVlBfT0JKX1VQU1RSRUFNX0xBQkVMLCAgICAgIlVwc3RyZWFtIExhYmVsIiB9LAotICAgIHsgUlNWUF9PQkpfTEFCRUxfU0VULCAgICAgICAgICAiTGFiZWwgU2V0IiB9LAotICAgIHsgUlNWUF9PQkpfQUNDRVBUX0xBQkVMX1NFVCwgICAiQWNjZXB0YWJsZSBMYWJlbCBTZXQiIH0sCi0gICAgeyBSU1ZQX09CSl9ERVRPVVIsICAgICAgICAgICAgICJEZXRvdXIiIH0sCi0gICAgeyBSU1ZQX09CSl9DTEFTU1RZUEUsICAgICAgICAgICJDbGFzcyBUeXBlIiB9LAotICAgIHsgUlNWUF9PQkpfQ0xBU1NUWVBFX09MRCwgICAgICAiQ2xhc3MgVHlwZSAob2xkKSIgfSwKLSAgICB7IFJTVlBfT0JKX1NVR0dFU1RFRF9MQUJFTCwgICAgIlN1Z2dlc3RlZCBMYWJlbCIgfSwKLSAgICB7IFJTVlBfT0JKX1BST1BFUlRJRVMsICAgICAgICAgIlByb3BlcnRpZXMiIH0sCi0gICAgeyBSU1ZQX09CSl9GQVNUUkVST1VURSwgICAgICAgICJGYXN0IFJlLVJvdXRlIiB9LAotICAgIHsgUlNWUF9PQkpfU0VTU0lPTl9BVFRSSUJVVEUsICAiU2Vzc2lvbiBBdHRyaWJ1dGUiIH0sCi0gICAgeyBSU1ZQX09CSl9HRU5FUkFMSVpFRF9VTkksICAgICJHZW5lcmFsaXplZCBVTkkiIH0sCi0gICAgeyBSU1ZQX09CSl9DQUxMX0lELCAgICAgICAgICAgICJDYWxsLUlEIiB9LAotICAgIHsgUlNWUF9PQkpfQ0FMTF9PUFMsICAgICAgICAgICAiQ2FsbCBDYXBhYmlsaXR5IiB9LAotICAgIHsgUlNWUF9PQkpfUkVTVEFSVF9DQVBBQklMSVRZLCAiUmVzdGFydCBDYXBhYmlsaXR5IiB9LAotICAgIHsgUlNWUF9PQkpfTk9USUZZX1JFUSwgICAgICAgICAiTm90aWZ5IFJlcXVlc3QiIH0sCi0gICAgeyBSU1ZQX09CSl9QUk9URUNUSU9OLCAgICAgICAgICJQcm90ZWN0aW9uIiB9LAotICAgIHsgUlNWUF9PQkpfQURNSU5fU1RBVFVTLCAgICAgICAiQWRtaW5pc3RyYXRpdmUgU3RhdHVzIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUJUlNWUF9DVFlQRV9JUFY0ICAgICAgICAxCi0jZGVmaW5lCVJTVlBfQ1RZUEVfSVBWNiAgICAgICAgMgotI2RlZmluZQlSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0IDcKLSNkZWZpbmUJUlNWUF9DVFlQRV9UVU5ORUxfSVBWNiA4Ci0jZGVmaW5lCVJTVlBfQ1RZUEVfVU5JX0lQVjQgICAgMTEgLyogT0lGIFJTVlAgZXh0ZW5zaW9ucyBVTkkgMS4wIFNpZ25hbGluZyBSZWwuIDIgKi8KLSNkZWZpbmUgUlNWUF9DVFlQRV8xICAgICAgICAgICAxCi0jZGVmaW5lIFJTVlBfQ1RZUEVfMiAgICAgICAgICAgMgotI2RlZmluZSBSU1ZQX0NUWVBFXzMgICAgICAgICAgIDMKLSNkZWZpbmUgUlNWUF9DVFlQRV80ICAgICAgICAgICA0Ci0KLS8qCi0gKiB0aGUgY3R5cGVzIGFyZSBub3QgZ2xvYmFsbHkgdW5pcXVlIHNvIGZvcgotICogdHJhbnNsYXRpbmcgaXQgdG8gc3RyaW5ncyB3ZSBidWlsZCBhIHRhYmxlIGJhc2VkCi0gKiBvbiBvYmplY3RzIG9mZnNldHRlZCBieSB0aGUgY3R5cGUKLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX2N0eXBlX3ZhbHVlc1tdID0gewotICAgIHsgMjU2KlJTVlBfT0JKX1JTVlBfSE9QK1JTVlBfQ1RZUEVfSVBWNCwJICAgICAgICAgICAgICJJUHY0IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1JTVlBfSE9QK1JTVlBfQ1RZUEVfSVBWNiwJICAgICAgICAgICAgICJJUHY2IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1JTVlBfSE9QK1JTVlBfQ1RZUEVfMywJICAgICAgICAgICAgICJJUHY0IHBsdXMgb3B0LiBUTFZzIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1JTVlBfSE9QK1JTVlBfQ1RZUEVfNCwJICAgICAgICAgICAgICJJUHY2IHBsdXMgb3B0LiBUTFZzIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX05PVElGWV9SRVErUlNWUF9DVFlQRV9JUFY0LAkgICAgICAgICAgICAgIklQdjQiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfTk9USUZZX1JFUStSU1ZQX0NUWVBFX0lQVjYsCSAgICAgICAgICAgICAiSVB2NiIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9DT05GSVJNK1JTVlBfQ1RZUEVfSVBWNCwJICAgICAgICAgICAgICJJUHY0IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0NPTkZJUk0rUlNWUF9DVFlQRV9JUFY2LAkgICAgICAgICAgICAgIklQdjYiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfVElNRV9WQUxVRVMrUlNWUF9DVFlQRV8xLAkgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfRkxPV1NQRUMrUlNWUF9DVFlQRV8xLAkgICAgICAgICAgICAgIm9ic29sZXRlIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0ZMT1dTUEVDK1JTVlBfQ1RZUEVfMiwJICAgICAgICAgICAgICJJbnRTZXJ2IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1NFTkRFUl9UU1BFQytSU1ZQX0NUWVBFXzIsCSAgICAgICAgICAgICAiSW50U2VydiIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9BRFNQRUMrUlNWUF9DVFlQRV8yLAkgICAgICAgICAgICAgICAgICAgICAiSW50U2VydiIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9GSUxURVJTUEVDK1JTVlBfQ1RZUEVfSVBWNCwJICAgICAgICAgICAgICJJUHY0IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0ZJTFRFUlNQRUMrUlNWUF9DVFlQRV9JUFY2LAkgICAgICAgICAgICAgIklQdjYiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfRklMVEVSU1BFQytSU1ZQX0NUWVBFXzMsCSAgICAgICAgICAgICAiSVB2NiBGbG93LWxhYmVsIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0ZJTFRFUlNQRUMrUlNWUF9DVFlQRV9UVU5ORUxfSVBWNCwJICAgICAiVHVubmVsIElQdjQiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfU0VTU0lPTitSU1ZQX0NUWVBFX0lQVjQsCSAgICAgICAgICAgICAiSVB2NCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9TRVNTSU9OK1JTVlBfQ1RZUEVfSVBWNiwJICAgICAgICAgICAgICJJUHY2IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1NFU1NJT04rUlNWUF9DVFlQRV9UVU5ORUxfSVBWNCwgICAgICAgICAgICJUdW5uZWwgSVB2NCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9TRVNTSU9OK1JTVlBfQ1RZUEVfVU5JX0lQVjQsICAgICAgICAgICAgICAiVU5JIElQdjQiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfU0VOREVSX1RFTVBMQVRFK1JTVlBfQ1RZUEVfSVBWNCwgICAgICAgICAgIklQdjQiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfU0VOREVSX1RFTVBMQVRFK1JTVlBfQ1RZUEVfSVBWNiwgICAgICAgICAgIklQdjYiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfU0VOREVSX1RFTVBMQVRFK1JTVlBfQ1RZUEVfVFVOTkVMX0lQVjQsICAgIlR1bm5lbCBJUHY0IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX01FU1NBR0VfSUQrUlNWUF9DVFlQRV8xLCAgICAgICAgICAgICAgICAgICIxIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX01FU1NBR0VfSURfQUNLK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICJNZXNzYWdlIGlkIGFjayIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9NRVNTQUdFX0lEX0FDSytSU1ZQX0NUWVBFXzIsICAgICAgICAgICAgICAiTWVzc2FnZSBpZCBuYWNrIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX01FU1NBR0VfSURfTElTVCtSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICIxIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1NUWUxFK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICAgICAgICIxIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0hFTExPK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyBSZXF1ZXN0IiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0hFTExPK1JTVlBfQ1RZUEVfMiwgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyBBY2siIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfTEFCRUxfUkVRK1JTVlBfQ1RZUEVfMSwJICAgICAgICAgICAgICJ3aXRob3V0IGxhYmVsIHJhbmdlIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMX1JFUStSU1ZQX0NUWVBFXzIsCSAgICAgICAgICAgICAid2l0aCBBVE0gbGFiZWwgcmFuZ2UiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfTEFCRUxfUkVRK1JTVlBfQ1RZUEVfMywgICAgICAgICAgICAgICAgICAgIndpdGggRlIgbGFiZWwgcmFuZ2UiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfTEFCRUxfUkVRK1JTVlBfQ1RZUEVfNCwgICAgICAgICAgICAgICAgICAgIkdlbmVyYWxpemVkIExhYmVsIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX0xBQkVMK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICAgICAgICJMYWJlbCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9MQUJFTCtSU1ZQX0NUWVBFXzIsICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhbGl6ZWQgTGFiZWwiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfTEFCRUwrUlNWUF9DVFlQRV8zLCAgICAgICAgICAgICAgICAgICAgICAgIldhdmViYW5kIFN3aXRjaGluZyIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9TVUdHRVNURURfTEFCRUwrUlNWUF9DVFlQRV8xLCAgICAgICAgICAgICAiTGFiZWwiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfU1VHR0VTVEVEX0xBQkVMK1JTVlBfQ1RZUEVfMiwgICAgICAgICAgICAgIkdlbmVyYWxpemVkIExhYmVsIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1NVR0dFU1RFRF9MQUJFTCtSU1ZQX0NUWVBFXzMsICAgICAgICAgICAgICJXYXZlYmFuZCBTd2l0Y2hpbmciIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfVVBTVFJFQU1fTEFCRUwrUlNWUF9DVFlQRV8xLCAgICAgICAgICAgICAgIkxhYmVsIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1VQU1RSRUFNX0xBQkVMK1JTVlBfQ1RZUEVfMiwgICAgICAgICAgICAgICJHZW5lcmFsaXplZCBMYWJlbCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9VUFNUUkVBTV9MQUJFTCtSU1ZQX0NUWVBFXzMsICAgICAgICAgICAgICAiV2F2ZWJhbmQgU3dpdGNoaW5nIiB9LAotICAgIHsgMjU2KlJTVlBfT0JKX1JFQ09WRVJZX0xBQkVMK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICJMYWJlbCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9SRUNPVkVSWV9MQUJFTCtSU1ZQX0NUWVBFXzIsICAgICAgICAgICAgICAiR2VuZXJhbGl6ZWQgTGFiZWwiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfUkVDT1ZFUllfTEFCRUwrUlNWUF9DVFlQRV8zLCAgICAgICAgICAgICAgIldhdmViYW5kIFN3aXRjaGluZyIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9FUk8rUlNWUF9DVFlQRV9JUFY0LCAgICAgICAgICAgICAgICAgICAgICAiSVB2NCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9SUk8rUlNWUF9DVFlQRV9JUFY0LCAgICAgICAgICAgICAgICAgICAgICAiSVB2NCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9FUlJPUl9TUEVDK1JTVlBfQ1RZUEVfSVBWNCwgICAgICAgICAgICAgICAiSVB2NCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9FUlJPUl9TUEVDK1JTVlBfQ1RZUEVfSVBWNiwgICAgICAgICAgICAgICAiSVB2NiIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9FUlJPUl9TUEVDK1JTVlBfQ1RZUEVfMywgICAgICAgICAgICAgICAgICAiSVB2NCBwbHVzIG9wdC4gVExWcyIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9FUlJPUl9TUEVDK1JTVlBfQ1RZUEVfNCwgICAgICAgICAgICAgICAgICAiSVB2NiBwbHVzIG9wdC4gVExWcyIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9SRVNUQVJUX0NBUEFCSUxJVFkrUlNWUF9DVFlQRV8xLCAgICAgICAgICAiSVB2NCIgfSwKLSAgICB7IDI1NipSU1ZQX09CSl9TRVNTSU9OX0FUVFJJQlVURStSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0LCAiVHVubmVsIElQdjQiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfRkFTVFJFUk9VVEUrUlNWUF9DVFlQRV9UVU5ORUxfSVBWNCwgICAgICAgIlR1bm5lbCBJUHY0IiB9LCAvKiBvbGQgc3R5bGUqLwotICAgIHsgMjU2KlJTVlBfT0JKX0ZBU1RSRVJPVVRFK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICIxIiB9LCAvKiBuZXcgc3R5bGUgKi8KLSAgICB7IDI1NipSU1ZQX09CSl9ERVRPVVIrUlNWUF9DVFlQRV9UVU5ORUxfSVBWNCwgICAgICAgICAgICAiVHVubmVsIElQdjQiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfUFJPUEVSVElFUytSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfQURNSU5fU1RBVFVTK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfQ0xBU1NUWVBFK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfQ0xBU1NUWVBFX09MRCtSU1ZQX0NUWVBFXzEsICAgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfTEFCRUxfU0VUK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAyNTYqUlNWUF9PQkpfR0VORVJBTElaRURfVU5JK1JTVlBfQ1RZUEVfMSwgICAgICAgICAgICAgIjEiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RydWN0IHJzdnBfb2JqX2ludGVncml0eV90IHsKLSAgICB1X2ludDhfdCBmbGFnczsKLSAgICB1X2ludDhfdCByZXM7Ci0gICAgdV9pbnQ4X3Qga2V5X2lkWzZdOwotICAgIHVfaW50OF90IHNlcXVlbmNlWzhdOwotICAgIHVfaW50OF90IGRpZ2VzdFsxNl07Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX29ial9pbnRlZ3JpdHlfZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IDB4ODAsICJIYW5kc2hha2UiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RydWN0IHJzdnBfb2JqX2Zycl90IHsKLSAgICB1X2ludDhfdCBzZXR1cF9wcmlvOwotICAgIHVfaW50OF90IGhvbGRfcHJpbzsKLSAgICB1X2ludDhfdCBob3BfbGltaXQ7Ci0gICAgdV9pbnQ4X3QgZmxhZ3M7Ci0gICAgdV9pbnQ4X3QgYmFuZHdpZHRoWzRdOwotICAgIHVfaW50OF90IGluY2x1ZGVfYW55WzRdOwotICAgIHVfaW50OF90IGV4Y2x1ZGVfYW55WzRdOwotICAgIHVfaW50OF90IGluY2x1ZGVfYWxsWzRdOwotfTsKLQotCi0jZGVmaW5lIFJTVlBfT0JKX1hST19NQVNLX1NVQk9CSih4KSAgICgoeCkmMHg3ZikKLSNkZWZpbmUgUlNWUF9PQkpfWFJPX01BU0tfTE9PU0UoeCkgICAgKCh4KSYweDgwKQotCi0jZGVmaW5lCVJTVlBfT0JKX1hST19SRVMgICAgICAgMAotI2RlZmluZQlSU1ZQX09CSl9YUk9fSVBWNCAgICAgIDEKLSNkZWZpbmUJUlNWUF9PQkpfWFJPX0lQVjYgICAgICAyCi0jZGVmaW5lCVJTVlBfT0JKX1hST19BU04gICAgICAgMzIKLSNkZWZpbmUJUlNWUF9PQkpfWFJPX01QTFMgICAgICA2NAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX29ial94cm9fdmFsdWVzW10gPSB7Ci0gICAgeyBSU1ZQX09CSl9YUk9fUkVTLAkgICAgICAiUmVzZXJ2ZWQiIH0sCi0gICAgeyBSU1ZQX09CSl9YUk9fSVBWNCwgICAgICAiSVB2NCBwcmVmaXgiIH0sCi0gICAgeyBSU1ZQX09CSl9YUk9fSVBWNiwgICAgICAiSVB2NiBwcmVmaXgiIH0sCi0gICAgeyBSU1ZQX09CSl9YUk9fQVNOLCAgICAgICAiQXV0b25vbW91cyBzeXN0ZW0gbnVtYmVyIiB9LAotICAgIHsgUlNWUF9PQkpfWFJPX01QTFMsICAgICAgIk1QTFMgbGFiZWwgc3dpdGNoZWQgcGF0aCB0ZXJtaW5hdGlvbiIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0vKiBkcmFmdC1pZXRmLW1wbHMtcnN2cC1sc3AtZmFzdHJlcm91dGUtMDcudHh0ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX29ial9ycm9fZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsCSAgICAgICAgICAgICAgIkxvY2FsIHByb3RlY3Rpb24gYXZhaWxhYmxlIiB9LAotICAgIHsgMHgwMiwgICAgICAgICAgICAgICAgICAgIkxvY2FsIHByb3RlY3Rpb24gaW4gdXNlIiB9LAotICAgIHsgMHgwNCwgICAgICAgICAgICAgICAgICAgIkJhbmR3aWR0aCBwcm90ZWN0aW9uIiB9LAotICAgIHsgMHgwOCwgICAgICAgICAgICAgICAgICAgIk5vZGUgcHJvdGVjdGlvbiIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX3Jlc3N0eWxlX3ZhbHVlc1tdID0gewotICAgIHsgMTcsCSAgICAgICAgICAgICAgIldpbGRjYXJkIEZpbHRlciIgfSwKLSAgICB7IDEwLCAgICAgICAgICAgICAgICAgICAgICJGaXhlZCBGaWx0ZXIiIH0sCi0gICAgeyAxOCwgICAgICAgICAgICAgICAgICAgICAiU2hhcmVkIEV4cGxpY2l0IiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgUlNWUF9PQkpfSU5UU0VSVl9HVUFSQU5URUVEX1NFUlYgMgotI2RlZmluZSBSU1ZQX09CSl9JTlRTRVJWX0NPTlRST0xMRURfTE9BRCA1Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfaW50c2Vydl9zZXJ2aWNlX3R5cGVfdmFsdWVzW10gPSB7Ci0gICAgeyAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHQvR2xvYmFsIEluZm9ybWF0aW9uIiB9LAotICAgIHsgUlNWUF9PQkpfSU5UU0VSVl9HVUFSQU5URUVEX1NFUlYsICJHdWFyYW50ZWVkIFNlcnZpY2UiIH0sCi0gICAgeyBSU1ZQX09CSl9JTlRTRVJWX0NPTlRST0xMRURfTE9BRCwJIkNvbnRyb2xsZWQgTG9hZCIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayByc3ZwX2ludHNlcnZfcGFyYW1ldGVyX2lkX3ZhbHVlc1tdID0gewotICAgIHsgNCwgICAgICAgICAgICAgICAgICAgICAiSVMgaG9wIGNudCIgfSwKLSAgICB7IDYsICAgICAgICAgICAgICAgICAgICAgIlBhdGggYi93IGVzdGltYXRlIiB9LAotICAgIHsgOCwgICAgICAgICAgICAgICAgICAgICAiTWluaW11bSBwYXRoIGxhdGVuY3kiIH0sCi0gICAgeyAxMCwgICAgICAgICAgICAgICAgICAgICJDb21wb3NlZCBNVFUiIH0sCi0gICAgeyAxMjcsICAgICAgICAgICAgICAgICAgICJUb2tlbiBCdWNrZXQgVFNwZWMiIH0sCi0gICAgeyAxMzAsICAgICAgICAgICAgICAgICAgICJHdWFyYW50ZWVkIFNlcnZpY2UgUlNwZWMiIH0sCi0gICAgeyAxMzMsICAgICAgICAgICAgICAgICAgICJFbmQtdG8tZW5kIGNvbXBvc2VkIHZhbHVlIGZvciBDIiB9LAotICAgIHsgMTM0LCAgICAgICAgICAgICAgICAgICAiRW5kLXRvLWVuZCBjb21wb3NlZCB2YWx1ZSBmb3IgRCIgfSwKLSAgICB7IDEzNSwgICAgICAgICAgICAgICAgICAgIlNpbmNlLWxhc3QtcmVzaGFwaW5nIHBvaW50IGNvbXBvc2VkIEMiIH0sCi0gICAgeyAxMzYsICAgICAgICAgICAgICAgICAgICJTaW5jZS1sYXN0LXJlc2hhcGluZyBwb2ludCBjb21wb3NlZCBEIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHJzdnBfc2Vzc2lvbl9hdHRyaWJ1dGVfZmxhZ192YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsCSAgICAgICAgICAgICAgIkxvY2FsIFByb3RlY3Rpb24gZGVzaXJlZCIgfSwKLSAgICB7IDB4MDIsICAgICAgICAgICAgICAgICAgICJMYWJlbCBSZWNvcmRpbmcgZGVzaXJlZCIgfSwKLSAgICB7IDB4MDQsICAgICAgICAgICAgICAgICAgICJTRSBTdHlsZSBkZXNpcmVkIiB9LAotICAgIHsgMHgwOCwgICAgICAgICAgICAgICAgICAgIkJhbmR3aWR0aCBwcm90ZWN0aW9uIGRlc2lyZWQiIH0sIC8qIGRyYWZ0LWlldGYtbXBscy1yc3ZwLWxzcC1mYXN0cmVyb3V0ZS0wMi50eHQgKi8KLSAgICB7IDB4MTAsICAgICAgICAgICAgICAgICAgICJOb2RlIHByb3RlY3Rpb24gZGVzaXJlZCIgfSwgICAgICAvKiBkcmFmdC1pZXRmLW1wbHMtcnN2cC1sc3AtZmFzdHJlcm91dGUtMDIudHh0ICovCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgcnN2cF9vYmpfcHJvcF90bHZfdmFsdWVzW10gPSB7Ci0gICAgeyAweDAxLCAgICAgICAgICAgICAgICAgICAiQ29zIiB9LAotICAgIHsgMHgwMiwgICAgICAgICAgICAgICAgICAgIk1ldHJpYyAxIiB9LAotICAgIHsgMHgwNCwgICAgICAgICAgICAgICAgICAgIk1ldHJpYyAyIiB9LAotICAgIHsgMHgwOCwgICAgICAgICAgICAgICAgICAgIkNDQyBTdGF0dXMiIH0sCi0gICAgeyAweDEwLCAgICAgICAgICAgICAgICAgICAiUGF0aCBUeXBlIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX1JPVVRJTkcgMjQKLSNkZWZpbmUgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX05PVElGWSAgMjUKLSNkZWZpbmUgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX0RJRkZTRVJWX1RFIDI4Ci0jZGVmaW5lIFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9ESUZGU0VSVl9URV9PTEQgMTI1Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHJzdnBfb2JqX2Vycm9yX2NvZGVfdmFsdWVzW10gPSB7Ci0gICAgeyBSU1ZQX09CSl9FUlJPUl9TUEVDX0NPREVfUk9VVElORywgIlJvdXRpbmcgUHJvYmxlbSIgfSwKLSAgICB7IFJTVlBfT0JKX0VSUk9SX1NQRUNfQ09ERV9OT1RJRlksICAiTm90aWZ5IEVycm9yIiB9LAotICAgIHsgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX0RJRkZTRVJWX1RFLCAiRGlmZnNlcnYgVEUgRXJyb3IiIH0sCi0gICAgeyBSU1ZQX09CSl9FUlJPUl9TUEVDX0NPREVfRElGRlNFUlZfVEVfT0xELCAiRGlmZnNlcnYgVEUgRXJyb3IgKE9sZCkiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgcnN2cF9vYmpfZXJyb3JfY29kZV9yb3V0aW5nX3ZhbHVlc1tdID0gewotICAgIHsgMSwgICAgICAgICAgICAgICAgICAgICAgIkJhZCBFWFBMSUNJVF9ST1VURSBvYmplY3QiIH0sCi0gICAgeyAyLCAgICAgICAgICAgICAgICAgICAgICAiQmFkIHN0cmljdCBub2RlIiB9LAotICAgIHsgMywgICAgICAgICAgICAgICAgICAgICAgIkJhZCBsb29zZSBub2RlIiB9LAotICAgIHsgNCwgICAgICAgICAgICAgICAgICAgICAgIkJhZCBpbml0aWFsIHN1Ym9iamVjdCIgfSwKLSAgICB7IDUsICAgICAgICAgICAgICAgICAgICAgICJObyByb3V0ZSBhdmFpbGFibGUgdG93YXJkIGRlc3RpbmF0aW9uIiB9LAotICAgIHsgNiwgICAgICAgICAgICAgICAgICAgICAgIlVuYWNjZXB0YWJsZSBsYWJlbCB2YWx1ZSIgfSwKLSAgICB7IDcsICAgICAgICAgICAgICAgICAgICAgICJSUk8gaW5kaWNhdGVkIHJvdXRpbmcgbG9vcHMiIH0sCi0gICAgeyA4LCAgICAgICAgICAgICAgICAgICAgICAibm9uLVJTVlAtY2FwYWJsZSByb3V0ZXIgaW4gdGhlIHBhdGgiIH0sCi0gICAgeyA5LCAgICAgICAgICAgICAgICAgICAgICAiTVBMUyBsYWJlbCBhbGxvY2F0aW9uIGZhaWx1cmUiIH0sCi0gICAgeyAxMCwgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgTDNQSUQiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sgcnN2cF9vYmpfZXJyb3JfY29kZV9kaWZmc2Vydl90ZV92YWx1ZXNbXSA9IHsKLSAgICB7IDEsICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIENUIG9iamVjdCIgfSwKLSAgICB7IDIsICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBDVCIgfSwKLSAgICB7IDMsICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIENUIHZhbHVlIiB9LAotICAgIHsgNCwgICAgICAgICAgICAgICAgICAgICAgIkNUL3NldHVwIHByaW9yaXR5IGRvIG5vdCBmb3JtIGEgY29uZmlndXJlZCBURS1DbGFzcyIgfSwKLSAgICB7IDUsICAgICAgICAgICAgICAgICAgICAgICJDVC9ob2xkaW5nIHByaW9yaXR5IGRvIG5vdCBmb3JtIGEgY29uZmlndXJlZCBURS1DbGFzcyIgfSwKLSAgICB7IDYsICAgICAgICAgICAgICAgICAgICAgICJDVC9zZXR1cCBwcmlvcml0eSBhbmQgQ1QvaG9sZGluZyBwcmlvcml0eSBkbyBub3QgZm9ybSBhIGNvbmZpZ3VyZWQgVEUtQ2xhc3MiIH0sCi0gICAgeyA3LCAgICAgICAgICAgICAgICAgICAgICAiSW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHNpZ25hbGVkIFBTQyBhbmQgc2lnbmFsZWQgQ1QiIH0sIAotICAgIHsgOCwgICAgICAgICAgICAgICAgICAgICAgIkluY29uc2lzdGVuY3kgYmV0d2VlbiBzaWduYWxlZCBQSEJzIGFuZCBzaWduYWxlZCBDVCIgfSwKLSAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIHJmYzM0NzMgLyByZmMgMzQ3MSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9vYmpfYWRtaW5fc3RhdHVzX2ZsYWdfdmFsdWVzW10gPSB7Ci0gICAgeyAweDgwMDAwMDAwLCAiUmVmbGVjdCIgfSwKLSAgICB7IDB4MDAwMDAwMDQsICJUZXN0aW5nIiB9LAotICAgIHsgMHgwMDAwMDAwMiwgIkFkbWluLWRvd24iIH0sCi0gICAgeyAweDAwMDAwMDAxLCAiRGVsZXRlLWluLXByb2dyZXNzIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLS8qIGxhYmVsIHNldCBhY3Rpb25zIC0gcmZjMzQ3MSAqLwotI2RlZmluZSBMQUJFTF9TRVRfSU5DTFVTSVZFX0xJU1QgIDAKLSNkZWZpbmUgTEFCRUxfU0VUX0VYQ0xVU0lWRV9MSVNUICAxCi0jZGVmaW5lIExBQkVMX1NFVF9JTkNMVVNJVkVfUkFOR0UgMgotI2RlZmluZSBMQUJFTF9TRVRfRVhDTFVTSVZFX1JBTkdFIDMKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgcnN2cF9vYmpfbGFiZWxfc2V0X2FjdGlvbl92YWx1ZXNbXSA9IHsKLSAgICB7IExBQkVMX1NFVF9JTkNMVVNJVkVfTElTVCwgIkluY2x1c2l2ZSBsaXN0IiB9LAotICAgIHsgTEFCRUxfU0VUX0VYQ0xVU0lWRV9MSVNULCAiRXhjbHVzaXZlIGxpc3QiIH0sCi0gICAgeyBMQUJFTF9TRVRfSU5DTFVTSVZFX1JBTkdFLCAiSW5jbHVzaXZlIHJhbmdlIiB9LAotICAgIHsgTEFCRUxfU0VUX0VYQ0xVU0lWRV9SQU5HRSwgIkV4Y2x1c2l2ZSByYW5nZSIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi0vKiBPSUYgUlNWUCBleHRlbnNpb25zIFVOSSAxLjAgU2lnbmFsaW5nLCByZWxlYXNlIDIgKi8KLSNkZWZpbmUgUlNWUF9HRU5fVU5JX1NVQk9CSl9TT1VSQ0VfVE5BX0FERFJFU1MJICAgIDEKLSNkZWZpbmUgUlNWUF9HRU5fVU5JX1NVQk9CSl9ERVNUSU5BVElPTl9UTkFfQUREUkVTUyAyCi0jZGVmaW5lIFJTVlBfR0VOX1VOSV9TVUJPQkpfRElWRVJTSVRZCQkgICAgMwotI2RlZmluZSBSU1ZQX0dFTl9VTklfU1VCT0JKX0VHUkVTU19MQUJFTCAgICAgICAgICAgIDQKLSNkZWZpbmUgUlNWUF9HRU5fVU5JX1NVQk9CSl9TRVJWSUNFX0xFVkVMICAgICAgICAgICA1Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHJzdnBfb2JqX2dlbmVyYWxpemVkX3VuaV92YWx1ZXNbXSA9IHsKLSAgICB7IFJTVlBfR0VOX1VOSV9TVUJPQkpfU09VUkNFX1ROQV9BRERSRVNTLCAiU291cmNlIFROQSBhZGRyZXNzIiB9LAotICAgIHsgUlNWUF9HRU5fVU5JX1NVQk9CSl9ERVNUSU5BVElPTl9UTkFfQUREUkVTUywgIkRlc3RpbmF0aW9uIFROQSBhZGRyZXNzIiB9LAotICAgIHsgUlNWUF9HRU5fVU5JX1NVQk9CSl9ESVZFUlNJVFksICJEaXZlcnNpdHkiIH0sCi0gICAgeyBSU1ZQX0dFTl9VTklfU1VCT0JKX0VHUkVTU19MQUJFTCwgIkVncmVzcyBsYWJlbCIgfSwKLSAgICB7IFJTVlBfR0VOX1VOSV9TVUJPQkpfU0VSVklDRV9MRVZFTCwgIlNlcnZpY2UgbGV2ZWwiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIGludCByc3ZwX2ludHNlcnZfcHJpbnQoY29uc3QgdV9jaGFyICosIHVfc2hvcnQpOwotCi0vKiAKLSAqIHRoaXMgaXMgYSBkaXNzZWN0b3IgZm9yIGFsbCB0aGUgaW50c2VydiBkZWZpbmVkCi0gKiBzcGVjcyBhcyBkZWZpbmVkIHBlciByZmMyMjE1Ci0gKiBpdCBpcyBjYWxsZWQgZnJvbSB2YXJpb3VzIHJzdnAgb2JqZWN0czsKLSAqIHJldHVybnMgdGhlIGFtb3VudCBvZiBieXRlcyBiZWluZyBwcm9jZXNzZWQKLSAqLwotc3RhdGljIGludAotcnN2cF9pbnRzZXJ2X3ByaW50KGNvbnN0IHVfY2hhciAqdHB0ciwgdV9zaG9ydCBvYmpfdGxlbikgewotCi0gICAgaW50IHBhcmFtZXRlcl9pZCxwYXJhbWV0ZXJfbGVuZ3RoOwotICAgIHVuaW9uIHsKLQlmbG9hdCBmOwotCXVfaW50MzJfdCBpOwotICAgIH0gYnc7Ci0KLSAgICBpZiAob2JqX3RsZW4gPCA0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBwYXJhbWV0ZXJfaWQgPSAqKHRwdHIpOwotICAgIHBhcmFtZXRlcl9sZW5ndGggPSBFWFRSQUNUXzE2QklUUyh0cHRyKzIpPDwyOyAvKiBjb252ZXJ0IHdvcmRjb3VudCB0byBieXRlY291bnQgKi8KLQotICAgIHByaW50ZigiXG5cdCAgICAgIFBhcmFtZXRlciBJRDogJXMgKCV1KSwgbGVuZ3RoOiAldSwgRmxhZ3M6IFsweCUwMnhdIiwKLSAgICAgICAgICAgdG9rMnN0cihyc3ZwX2ludHNlcnZfcGFyYW1ldGVyX2lkX3ZhbHVlcywidW5rbm93biIscGFyYW1ldGVyX2lkKSwKLSAgICAgICAgICAgcGFyYW1ldGVyX2lkLAotICAgICAgICAgICBwYXJhbWV0ZXJfbGVuZ3RoLAotICAgICAgICAgICAqKHRwdHIrMSkpOwotCi0gICAgaWYgKG9ial90bGVuIDwgcGFyYW1ldGVyX2xlbmd0aCs0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBzd2l0Y2gocGFyYW1ldGVyX2lkKSB7IC8qIHBhcmFtZXRlcl9pZCAqLwotCi0gICAgY2FzZSA0OgotICAgICAgIC8qCi0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICAgIDQgKGUpICAgICAgfCAgICAoZikgICAgICAgIHwgICAgICAgICAgIDEgKGcpICAgICAgICAgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICogfCAgICAgICAgSVMgaG9wIGNudCAoMzItYml0IHVuc2lnbmVkIGludGVnZXIpICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqLwotICAgICAgICBpZiAocGFyYW1ldGVyX2xlbmd0aCA9PSA0KQotICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRJUyBob3AgY291bnQ6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2OgotICAgICAgIC8qCi0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICAgIDYgKGgpICAgICAgfCAgICAoaSkgICAgICAgIHwgICAgICAgICAgIDEgKGopICAgICAgICAgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICogfCAgUGF0aCBiL3cgZXN0aW1hdGUgICgzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCBudW1iZXIpICAgICAgIHwKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqLwotICAgICAgICBpZiAocGFyYW1ldGVyX2xlbmd0aCA9PSA0KSB7Ci0gICAgICAgICAgICBidy5pID0gRVhUUkFDVF8zMkJJVFModHB0cis0KTsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdFx0UGF0aCBiL3cgZXN0aW1hdGU6ICUuMTBnIE1icHMiLCBidy5mLzEyNTAwMCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAgLyoKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqIHwgICAgIDggKGspICAgICB8ICAgIChsKSAgICAgICAgfCAgICAgICAgICAgMSAobSkgICAgICAgICAgICAgICB8Ci0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICAgICAgICBNaW5pbXVtIHBhdGggbGF0ZW5jeSAoMzItYml0IGludGVnZXIpICAgICAgICAgICAgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICovCi0gICAgICAgIGlmIChwYXJhbWV0ZXJfbGVuZ3RoID09IDQpIHsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdFx0TWluaW11bSBwYXRoIGxhdGVuY3k6ICIpOwotICAgICAgICAgICAgaWYgKEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCkgPT0gMHhmZmZmZmZmZikKLSAgICAgICAgICAgICAgICBwcmludGYoImRvbid0IGNhcmUiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIiV1IiwgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEwOgotCi0gICAgICAgLyoKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqIHwgICAgIDEwIChuKSAgICB8ICAgICAgKG8pICAgICAgfCAgICAgICAgICAgMSAocCkgICAgICAgICAgICAgICB8Ci0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICAgICAgQ29tcG9zZWQgTVRVICgzMi1iaXQgdW5zaWduZWQgaW50ZWdlcikgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICovCi0gICAgICAgIGlmIChwYXJhbWV0ZXJfbGVuZ3RoID09IDQpCi0gICAgICAgICAgICBwcmludGYoIlxuXHRcdENvbXBvc2VkIE1UVTogJXUgYnl0ZXMiLCBFWFRSQUNUXzMyQklUUyh0cHRyKzQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjc6Ci0gICAgICAgLyogCi0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICAgMTI3IChlKSAgICAgfCAgICAwIChmKSAgICAgIHwgICAgICAgICAgICAgNSAoZykgICAgICAgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICogfCAgVG9rZW4gQnVja2V0IFJhdGUgW3JdICgzMi1iaXQgSUVFRSBmbG9hdGluZyBwb2ludCBudW1iZXIpICAgIHwKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqIHwgIFRva2VuIEJ1Y2tldCBTaXplIFtiXSAoMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyKSAgICB8Ci0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICBQZWFrIERhdGEgUmF0ZSBbcF0gKDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcikgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICogfCAgTWluaW11bSBQb2xpY2VkIFVuaXQgW21dICgzMi1iaXQgaW50ZWdlcikgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqIHwgIE1heGltdW0gUGFja2V0IFNpemUgW01dICAoMzItYml0IGludGVnZXIpICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKi8KLQotICAgICAgICBpZiAocGFyYW1ldGVyX2xlbmd0aCA9PSAyMCkgewotICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHRcdFRva2VuIEJ1Y2tldCBSYXRlOiAlLjEwZyBNYnBzIiwgYncuZi8xMjUwMDApOwotICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrOCk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHRcdFRva2VuIEJ1Y2tldCBTaXplOiAlLjEwZyBieXRlcyIsIGJ3LmYpOwotICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrMTIpOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRQZWFrIERhdGEgUmF0ZTogJS4xMGcgTWJwcyIsIGJ3LmYvMTI1MDAwKTsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdFx0TWluaW11bSBQb2xpY2VkIFVuaXQ6ICV1IGJ5dGVzIiwgRVhUUkFDVF8zMkJJVFModHB0cisxNikpOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRNYXhpbXVtIFBhY2tldCBTaXplOiAldSBieXRlcyIsIEVYVFJBQ1RfMzJCSVRTKHRwdHIrMjApKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgMTMwOgotICAgICAgIC8qIAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICogfCAgICAgMTMwIChoKSAgIHwgICAgMCAoaSkgICAgICB8ICAgICAgICAgICAgMiAoaikgICAgICAgICAgICAgIHwKLSAgICAgICAgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICAgICAgICAqIHwgIFJhdGUgW1JdICAoMzItYml0IElFRUUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyKSAgICAgICAgICAgICAgICB8Ci0gICAgICAgICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAgICAgICAgKiB8ICBTbGFjayBUZXJtIFtTXSAgKDMyLWJpdCBpbnRlZ2VyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAgICAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gICAgICAgICovCi0KLSAgICAgICAgaWYgKHBhcmFtZXRlcl9sZW5ndGggPT0gOCkgewotICAgICAgICAgICAgYncuaSA9IEVYVFJBQ1RfMzJCSVRTKHRwdHIrNCk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHRcdFJhdGU6ICUuMTBnIE1icHMiLCBidy5mLzEyNTAwMCk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHRcdFNsYWNrIFRlcm06ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cis4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDEzMzoKLSAgICBjYXNlIDEzNDoKLSAgICBjYXNlIDEzNToKLSAgICBjYXNlIDEzNjoKLSAgICAgICAgaWYgKHBhcmFtZXRlcl9sZW5ndGggPT0gNCkKLSAgICAgICAgICAgIHByaW50ZigiXG5cdFx0VmFsdWU6ICV1IiwgRVhUUkFDVF8zMkJJVFModHB0cis0KSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKHZmbGFnIDw9IDEpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0cis0LCJcblx0XHQiLHBhcmFtZXRlcl9sZW5ndGgpOwotICAgIH0KLSAgICByZXR1cm4gKHBhcmFtZXRlcl9sZW5ndGgrNCk7IC8qIGhlYWRlciBsZW5ndGggNCBieXRlcyAqLwotfQotCi1zdGF0aWMgaW50Ci1yc3ZwX29ial9wcmludCAoY29uc3QgdV9jaGFyICp0cHRyLCBjb25zdCBjaGFyICppZGVudCwgdV9pbnQgdGxlbikgewotCi0gICAgY29uc3Qgc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlciAqcnN2cF9vYmpfaGVhZGVyOwotICAgIGNvbnN0IHVfY2hhciAqb2JqX3RwdHI7Ci0gICAgdW5pb24gewotICAgICAgICBjb25zdCBzdHJ1Y3QgcnN2cF9vYmpfaW50ZWdyaXR5X3QgKnJzdnBfb2JqX2ludGVncml0eTsKLSAgICAgICAgY29uc3Qgc3RydWN0IHJzdnBfb2JqX2Zycl90ICpyc3ZwX29ial9mcnI7Ci0gICAgfSBvYmpfcHRyOwotCi0gICAgdV9zaG9ydCByc3ZwX29ial9sZW4scnN2cF9vYmpfY3R5cGUsb2JqX3RsZW4saW50c2Vydl9zZXJ2X3RsZW47Ci0gICAgaW50IGhleGR1bXAscHJvY2Vzc2VkLHBhZGJ5dGVzLGVycm9yX2NvZGUsZXJyb3JfdmFsdWUsaTsKLSAgICB1bmlvbiB7Ci0JZmxvYXQgZjsKLQl1X2ludDMyX3QgaTsKLSAgICB9IGJ3OwotICAgIHVfaW50OF90IG5hbWVsZW47Ci0KLSAgICB1X2ludCBhY3Rpb24sIHN1YmNoYW5uZWw7Ci0KLSAgICB3aGlsZSh0bGVuPj1zaXplb2Yoc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlcikpIHsKLSAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgb2JqZWN0IGhlYWRlciA/ICovCi0gICAgICAgIGlmICghVFRFU1QyKCp0cHRyLCBzaXplb2Yoc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlcikpKQotICAgICAgICAgICAgZ290byB0cnVuYzsKLQotICAgICAgICByc3ZwX29ial9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlciAqKXRwdHI7Ci0gICAgICAgIHJzdnBfb2JqX2xlbj1FWFRSQUNUXzE2QklUUyhyc3ZwX29ial9oZWFkZXItPmxlbmd0aCk7Ci0gICAgICAgIHJzdnBfb2JqX2N0eXBlPXJzdnBfb2JqX2hlYWRlci0+Y3R5cGU7Ci0KLSAgICAgICAgaWYocnN2cF9vYmpfbGVuICUgNCkgewotICAgICAgICAgICAgcHJpbnRmKCIlc0VSUk9SOiBvYmplY3QgaGVhZGVyIHNpemUgJXUgbm90IGEgbXVsdGlwbGUgb2YgNCIsIGlkZW50LCByc3ZwX29ial9sZW4pOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmKHJzdnBfb2JqX2xlbiA8IHNpemVvZihzdHJ1Y3QgcnN2cF9vYmplY3RfaGVhZGVyKSkgewotICAgICAgICAgICAgcHJpbnRmKCIlc0VSUk9SOiBvYmplY3QgaGVhZGVyIHRvbyBzaG9ydCAldSA8ICVsdSIsIGlkZW50LCByc3ZwX29ial9sZW4sCi0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIpKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50ZigiJXMlcyBPYmplY3QgKCV1KSBGbGFnczogWyVzIiwKLSAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcnN2cF9vYmpfaGVhZGVyLT5jbGFzc19udW0pLAotICAgICAgICAgICAgICAgcnN2cF9vYmpfaGVhZGVyLT5jbGFzc19udW0sCi0gICAgICAgICAgICAgICAoKHJzdnBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKSYweDgwKSA/ICJpZ25vcmUiIDogInJlamVjdCIpOwotCi0gICAgICAgIGlmIChyc3ZwX29ial9oZWFkZXItPmNsYXNzX251bSA+IDEyOCkKLSAgICAgICAgICAgIHByaW50ZigiICVzIiwKLSAgICAgICAgICAgICAgICAgICAoKHJzdnBfb2JqX2hlYWRlci0+Y2xhc3NfbnVtKSYweDQwKSA/ICJhbmQgZm9yd2FyZCIgOiAic2lsZW50bHkiKTsKLQotICAgICAgICBwcmludGYoIiBpZiB1bmtub3duXSwgQ2xhc3MtVHlwZTogJXMgKCV1KSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfY3R5cGVfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICgocnN2cF9vYmpfaGVhZGVyLT5jbGFzc19udW0pPDw4KStyc3ZwX29ial9jdHlwZSksCi0gICAgICAgICAgICAgICByc3ZwX29ial9jdHlwZSwKLSAgICAgICAgICAgICAgIHJzdnBfb2JqX2xlbik7Ci0gICAgCi0gICAgICAgIGlmKHRsZW4gPCByc3ZwX29ial9sZW4pIHsKLSAgICAgICAgICAgIHByaW50ZigiJXNFUlJPUjogb2JqZWN0IGdvZXMgcGFzdCBlbmQgb2Ygb2JqZWN0cyBUTFYiLCBpZGVudCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBvYmpfdHB0cj10cHRyK3NpemVvZihzdHJ1Y3QgcnN2cF9vYmplY3RfaGVhZGVyKTsKLSAgICAgICAgb2JqX3RsZW49cnN2cF9vYmpfbGVuLXNpemVvZihzdHJ1Y3QgcnN2cF9vYmplY3RfaGVhZGVyKTsKLQotICAgICAgICAvKiBkaWQgd2UgY2FwdHVyZSBlbm91Z2ggZm9yIGZ1bGx5IGRlY29kaW5nIHRoZSBvYmplY3QgPyAqLwotICAgICAgICBpZiAoIVRURVNUMigqdHB0ciwgcnN2cF9vYmpfbGVuKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaGV4ZHVtcD1GQUxTRTsKLQotICAgICAgICBzd2l0Y2gocnN2cF9vYmpfaGVhZGVyLT5jbGFzc19udW0pIHsKLSAgICAgICAgY2FzZSBSU1ZQX09CSl9TRVNTSU9OOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNDoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NCBEZXN0QWRkcmVzczogJXMsIFByb3RvY29sIElEOiAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEZsYWdzOiBbMHglMDJ4XSwgRGVzdFBvcnQgJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cis1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT04OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz04OyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBJTkVUNgotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjY6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMjApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBJUHY2IERlc3RBZGRyZXNzOiAlcywgUHJvdG9jb2wgSUQ6IDB4JTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBGbGFnczogWzB4JTAyeF0sIERlc3RQb3J0ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikrMSksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyK3NpemVvZihzdHJ1Y3QgaW42X2FkZHIpKzIpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09MjA7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTIwOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1RVTk5FTF9JUFY2OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDM2KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NiBUdW5uZWwgRW5kUG9pbnQ6ICVzLCBUdW5uZWwgSUQ6IDB4JTA0eCwgRXh0ZW5kZWQgVHVubmVsIElEOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzE4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIrMjApKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09MzY7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTM2OyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0OgotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1VOSV9JUFY0OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDEyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NCBUdW5uZWwgRW5kUG9pbnQ6ICVzLCBUdW5uZWwgSUQ6IDB4JTA0eCwgRXh0ZW5kZWQgVHVubmVsIElEOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNiksCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrOCkpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT0xMjsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9MTI7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX0NPTkZJUk06Ci0gICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY0OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBJUHY0IFJlY2VpdmVyIEFkZHJlc3M6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9c2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY2OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSVB2NiBSZWNlaXZlciBBZGRyZXNzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT1zaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9c2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfTk9USUZZX1JFUToKLSAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjQ6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIElQdjQgTm90aWZ5IE5vZGUgQWRkcmVzczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT1zaXplb2Yoc3RydWN0IGluX2FkZHIpOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz1zaXplb2Yoc3RydWN0IGluX2FkZHIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBJTkVUNgotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjY6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIElQdjYgTm90aWZ5IE5vZGUgQWRkcmVzczogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09c2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX1NVR0dFU1RFRF9MQUJFTDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfVVBTVFJFQU1fTEFCRUw6ICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgY2FzZSBSU1ZQX09CSl9SRUNPVkVSWV9MQUJFTDogIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlIFJTVlBfT0JKX0xBQkVMOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKLSAgICAgICAgICAgICAgICB3aGlsZShvYmpfdGxlbiA+PSA0ICkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICBMYWJlbDogJXUiLCBpZGVudCwgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0gICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8yOgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEdlbmVyYWxpemVkIExhYmVsOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT00OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzM6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMTIpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFdhdmViYW5kIElEOiAldSVzICBTdGFydCBMYWJlbDogJXUsIFN0b3AgTGFiZWw6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis4KSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTEyOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz0xMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU1ZQX09CSl9TVFlMRToKLSAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgNCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgUmVzZXJ2YXRpb24gU3R5bGU6ICVzLCBGbGFnczogWzB4JTAyeF0iLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX3Jlc3N0eWxlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMob2JqX3RwdHIrMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyKSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfU0VOREVSX1RFTVBMQVRFOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNDoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTb3VyY2UgQWRkcmVzczogJXMsIFNvdXJjZSBQb3J0OiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT04OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz04OwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNjoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAyMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBTb3VyY2UgUG9ydDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxOCkpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT0yMDsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9MjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9UVU5ORUxfSVBWNDoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBJUHY0IFR1bm5lbCBTZW5kZXIgQWRkcmVzczogJXMsIExTUC1JRDogMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cis2KSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTg7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfTEFCRUxfUkVROgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKLSAgICAgICAgICAgICAgICB3aGlsZShvYmpfdGxlbiA+PSA0ICkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICBMMyBQcm90b2NvbCBJRDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGV0aGVydHlwZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFByb3RvY29sICgweCUwNHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0gICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8yOgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDEyKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBMMyBQcm90b2NvbCBJRDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIFByb3RvY29sICgweCUwNHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSkpOwotICAgICAgICAgICAgICAgIHByaW50ZigiLCVzIG1lcmdlIGNhcGFiaWxpdHkiLCgoKihvYmpfdHB0cis0KSkmMHg4MCkgPyAibm8iIDogIiIgKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBNaW5pbXVtIFZQSS9WQ0k6ICV1LyV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cis0KSkmMHhmZmYsCi0gICAgICAgICAgICAgICAgICAgICAgIChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cis2KSkmMHhmZmYpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIE1heGltdW0gVlBJL1ZDSTogJXUvJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzgpKSYweGZmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzEwKSkmMHhmZmYpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT0xMjsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9MTI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMzoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAxMikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgTDMgUHJvdG9jb2wgSUQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBQcm90b2NvbCAoMHglMDR4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMikpKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBNaW5pbXVtL01heGltdW0gRExDSTogJXUvJXUsICVzJXMgYml0IERMQ0kiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpKSYweDdmZmZmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgKEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzgpKSYweDdmZmZmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgKCgoRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNCk+PjcpJjMpID09IDAgKSA/ICIxMCIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKCgoRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNCk+PjcpJjMpID09IDIgKSA/ICIyMyIgOiAiIik7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTEyOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz0xMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV80OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIExTUCBFbmNvZGluZyBUeXBlOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIoZ21wbHNfZW5jb2RpbmdfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb2JqX3RwdHIpLAotCQkgICAgICAgKm9ial90cHRyKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTd2l0Y2hpbmcgVHlwZTogJXMgKCV1KSwgUGF5bG9hZCBJRDogJXMgKDB4JTA0eCkiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihnbXBsc19zd2l0Y2hfY2FwX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cisxKSksCi0JCSAgICAgICAqKG9ial90cHRyKzEpLAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKGdtcGxzX3BheWxvYWRfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSksCi0JCSAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfUlJPOgotICAgICAgICBjYXNlIFJTVlBfT0JKX0VSTzoKLSAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjQ6Ci0gICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gNCApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU3Vib2JqZWN0IFR5cGU6ICVzLCBsZW5ndGggJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfb2JqX3hyb192YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlNWUF9PQkpfWFJPX01BU0tfU1VCT0JKKCpvYmpfdHB0cikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cisxKSk7ICAgICAgICAgICAgICAgIAotCi0gICAgICAgICAgICAgICAgICAgIGlmICgqKG9ial90cHRyKzEpID09IDApIHsgLyogcHJldmVudCBpbmZpbml0ZSBsb29wcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRVJST1I6IHplcm8gbGVuZ3RoIEVSTyBzdWJ0eXBlIixpZGVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChSU1ZQX09CSl9YUk9fTUFTS19TVUJPQkooKm9ial90cHRyKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFJTVlBfT0JKX1hST19JUFY0OgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsICVzLCAlcy8ldSwgRmxhZ3M6IFslc10iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTVlBfT0JKX1hST19NQVNLX0xPT1NFKCpvYmpfdHB0cikgPyAiTG9vc2UiIDogIlN0cmljdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cisyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyKzYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIocnN2cF9vYmpfcnJvX2ZsYWdfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrNykpKTsgLyogcmZjMzIwOSBzYXlzIHRoYXQgdGhpcyBmaWVsZCBpcyByc3ZkLiAqLwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT0qKG9ial90cHRyKzEpOwotICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9KihvYmpfdHB0cisxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfSEVMTE86Ci0gICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOgotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzI6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEluc3RhbmNlOiAweCUwOHgsIERlc3RpbmF0aW9uIEluc3RhbmNlOiAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTg7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfUkVTVEFSVF9DQVBBQklMSVRZOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBSZXN0YXJ0ICBUaW1lOiAldW1zLCBSZWNvdmVyeSBUaW1lOiAldW1zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCkpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT04OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz04OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX1NFU1NJT05fQVRUUklCVVRFOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfVFVOTkVMX0lQVjQ6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgNCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgbmFtZWxlbiA9ICoob2JqX3RwdHIrMyk7Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgNCtuYW1lbGVuKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTZXNzaW9uIE5hbWU6ICIsIGlkZW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZWxlbjsgaSsrKQotICAgICAgICAgICAgICAgICAgICBzYWZlcHV0Y2hhcigqKG9ial90cHRyKzQraSkpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNldHVwIFByaW9yaXR5OiAldSwgSG9sZGluZyBQcmlvcml0eTogJXUsIEZsYWdzOiBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpKm9ial90cHRyLAotICAgICAgICAgICAgICAgICAgICAgICAoaW50KSoob2JqX3RwdHIrMSksCi0gICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9zZXNzaW9uX2F0dHJpYnV0ZV9mbGFnX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0cisyKSkpOwotCi0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQrKihvYmpfdHB0ciszKTsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9NCsqKG9ial90cHRyKzMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotCWNhc2UgUlNWUF9PQkpfR0VORVJBTElaRURfVU5JOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0JCWludCBzdWJvYmpfdHlwZSxhZixzdWJvYmpfbGVuLHRvdGFsX3N1Ym9ial9sZW47Ci0KLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOiAKLQotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotCi0JCS8qIHJlYWQgdmFyaWFibGUgbGVuZ3RoIHN1Ym9iamVjdHMgKi8KLQkJdG90YWxfc3Vib2JqX2xlbiA9IG9ial90bGVuOwotICAgICAgICAgICAgICAgIHdoaWxlKHRvdGFsX3N1Ym9ial9sZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1Ym9ial9sZW4gID0gRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpOwotICAgICAgICAgICAgICAgICAgICBzdWJvYmpfdHlwZSA9IChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisyKSk+Pjg7Ci0gICAgICAgICAgICAgICAgICAgIGFmID0gKEVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzIpKSYweDAwRkY7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU3Vib2JqZWN0IFR5cGU6ICVzICgldSksIEFGOiAlcyAoJXUpLCBsZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial9nZW5lcmFsaXplZF91bmlfdmFsdWVzLCAiVW5rbm93biIsIHN1Ym9ial90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym9ial90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihhZl92YWx1ZXMsICJVbmtub3duIiwgYWYpLCBhZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym9ial9sZW4pOwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChzdWJvYmpfdHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFJTVlBfR0VOX1VOSV9TVUJPQkpfU09VUkNFX1ROQV9BRERSRVNTOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFJTVlBfR0VOX1VOSV9TVUJPQkpfREVTVElOQVRJT05fVE5BX0FERFJFU1M6Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChhZikgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBRk5VTV9JTkVUOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJvYmpfbGVuIDwgOCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgICAgVU5JIElQdjQgVE5BIGFkZHJlc3M6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIrNCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFGTlVNX0lORVQ2OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJvYmpfbGVuIDwgMjApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgIFVOSSBJUHY2IFROQSBhZGRyZXNzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LCBpcDZhZGRyX3N0cmluZyhvYmpfdHB0cis0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUZOVU1fTlNBUDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vib2JqX2xlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmxlc3Mgd2UgaGF2ZSBhIFRMViBwYXJzZXIgbGV0cyBqdXN0IGhleGR1bXAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9HRU5fVU5JX1NVQk9CSl9ESVZFUlNJVFk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vib2JqX2xlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVubGVzcyB3ZSBoYXZlIGEgVExWIHBhcnNlciBsZXRzIGp1c3QgaGV4ZHVtcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9HRU5fVU5JX1NVQk9CSl9FR1JFU1NfTEFCRUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vib2JqX2xlbiA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgIFUtYml0OiAleCwgTGFiZWwgdHlwZTogJXUsIExvZ2ljYWwgcG9ydCBpZDogJXUsIExhYmVsOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSk+PjMxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpKSYweEZGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cisxMikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSU1ZQX0dFTl9VTklfU1VCT0JKX1NFUlZJQ0VfTEVWRUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vib2JqX2xlbiA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgICAgU2VydmljZSBsZXZlbDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LCAoRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIrNCkpPj4yNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdG90YWxfc3Vib2JqX2xlbi09c3Vib2JqX2xlbjsKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RwdHIrPXN1Ym9ial9sZW47Ci0gICAgICAgICAgICAgICAgICAgIG9ial90bGVuKz1zdWJvYmpfbGVuOwotCQl9Ci0KLSAgICAgICAgICAgICAgICBpZiAodG90YWxfc3Vib2JqX2xlbikgewotICAgICAgICAgICAgICAgICAgICAvKiB1bmxlc3Mgd2UgaGF2ZSBhIFRMViBwYXJzZXIgbGV0cyBqdXN0IGhleGR1bXAgKi8KLSAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX1JTVlBfSE9QOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMzogLyogZmFsbCB0aHJvdWdoIC0gRklYTUUgYWRkIFRMViBwYXJzZXIgKi8KLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY0OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDgpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFByZXZpb3VzL05leHQgSW50ZXJmYWNlOiAlcywgTG9naWNhbCBJbnRlcmZhY2UgSGFuZGxlOiAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzQpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09ODsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9ODsKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4pCi0gICAgICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsgLyogdW5sZXNzIHdlIGhhdmUgYSBUTFYgcGFyc2VyIGxldHMganVzdCBoZXhkdW1wICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgSU5FVDYKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV80OiAvKiBmYWxsIHRocm91Z2ggLSBGSVhNRSBhZGQgVExWIHBhcnNlciAqLwotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjY6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgMjApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFByZXZpb3VzL05leHQgSW50ZXJmYWNlOiAlcywgTG9naWNhbCBJbnRlcmZhY2UgSGFuZGxlOiAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cisxNikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT0yMDsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9MjA7Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOyAvKiB1bmxlc3Mgd2UgaGF2ZSBhIFRMViBwYXJzZXIgbGV0cyBqdXN0IGhleGR1bXAgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX1RJTUVfVkFMVUVTOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMToKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA0KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBSZWZyZXNoIFBlcmlvZDogJXVtcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT00OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiB0aG9zZSB0aHJlZSBvYmplY3RzIGRvIHNoYXJlIHRoZSBzYW1lIHNlbWFudGljcyAqLwotICAgICAgICBjYXNlIFJTVlBfT0JKX1NFTkRFUl9UU1BFQzoKLSAgICAgICAgY2FzZSBSU1ZQX09CSl9BRFNQRUM6Ci0gICAgICAgIGNhc2UgUlNWUF9PQkpfRkxPV1NQRUM6Ci0gICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8yOgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIE1zZy1WZXJzaW9uOiAldSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICAoKm9ial90cHRyICYgMHhmMCkgPj4gNCwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMik8PDIpOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz00OyAvKiBnZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZXJ2aWNlIGhlYWRlciAqLwotICAgICAgICAgICAgICAgIG9ial90bGVuLT00OwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKG9ial90bGVuID49IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50c2Vydl9zZXJ2X3RsZW49RVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMik8PDI7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNlcnZpY2UgVHlwZTogJXMgKCV1KSwgYnJlYWsgYml0ICVzIHNldCwgU2VydmljZSBsZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX2ludHNlcnZfc2VydmljZV90eXBlX3ZhbHVlcywidW5rbm93biIsKihvYmpfdHB0cikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKihvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKihvYmpfdHB0cisxKSYweDgwKSA/ICIiIDogIm5vdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRzZXJ2X3NlcnZfdGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBvYmpfdHB0cis9NDsgLyogZ2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgcGFyYW1ldGVyIGxpc3QgKi8KLSAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGludHNlcnZfc2Vydl90bGVuPj00KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgPSByc3ZwX2ludHNlcnZfcHJpbnQob2JqX3RwdHIsIG9ial90bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9ial90bGVuLT1wcm9jZXNzZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRzZXJ2X3NlcnZfdGxlbi09cHJvY2Vzc2VkOwotICAgICAgICAgICAgICAgICAgICAgICAgb2JqX3RwdHIrPXByb2Nlc3NlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU1ZQX09CSl9GSUxURVJTUEVDOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNDoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBTb3VyY2UgQWRkcmVzczogJXMsIFNvdXJjZSBQb3J0OiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT04OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz04OwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfSVBWNjoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAyMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBTb3VyY2UgUG9ydDogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgaXA2YWRkcl9zdHJpbmcob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhvYmpfdHB0cisxOCkpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT0yMDsKLSAgICAgICAgICAgICAgICBvYmpfdHB0cis9MjA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMzoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAyMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBGbG93IExhYmVsOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMjRCSVRTKG9ial90cHRyKzE3KSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTIwOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz0yMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9UVU5ORUxfSVBWNjoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAyMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBMU1AtSUQ6IDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMTgpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09MjA7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTIwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfVFVOTkVMX0lQVjQ6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU291cmNlIEFkZHJlc3M6ICVzLCBMU1AtSUQ6IDB4JTA0eCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcGFkZHJfc3RyaW5nKG9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrNikpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT04OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz04OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX0ZBU1RSRVJPVVRFOgotICAgICAgICAgICAgLyogdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYy10eXBlIDEgYW5kIDcgYXJlIG1pbm9yICovCi0gICAgICAgICAgICBvYmpfcHRyLnJzdnBfb2JqX2ZyciA9IChjb25zdCBzdHJ1Y3QgcnN2cF9vYmpfZnJyX3QgKilvYmpfdHB0cjsKLSAgICAgICAgICAgIGJ3LmkgPSBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2Zyci0+YmFuZHdpZHRoKTsKLQotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMTogLyogbmV3IHN0eWxlICovCi0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgc2l6ZW9mKHN0cnVjdCByc3ZwX29ial9mcnJfdCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIFNldHVwIFByaW9yaXR5OiAldSwgSG9sZGluZyBQcmlvcml0eTogJXUsIEhvcC1saW1pdDogJXUsIEJhbmR3aWR0aDogJS4xMGcgTWJwcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICAoaW50KW9ial9wdHIucnN2cF9vYmpfZnJyLT5zZXR1cF9wcmlvLAotICAgICAgICAgICAgICAgICAgICAgICAoaW50KW9ial9wdHIucnN2cF9vYmpfZnJyLT5ob2xkX3ByaW8sCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpb2JqX3B0ci5yc3ZwX29ial9mcnItPmhvcF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ3LmYqOC8xMDAwMDAwKTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEluY2x1ZGUtYW55OiAweCUwOHgsIEV4Y2x1ZGUtYW55OiAweCUwOHgsIEluY2x1ZGUtYWxsOiAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9mcnItPmluY2x1ZGVfYW55KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9mcnItPmV4Y2x1ZGVfYW55KSwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9mcnItPmluY2x1ZGVfYWxsKSk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPXNpemVvZihzdHJ1Y3QgcnN2cF9vYmpfZnJyX3QpOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz1zaXplb2Yoc3RydWN0IHJzdnBfb2JqX2Zycl90KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX1RVTk5FTF9JUFY0OiAvKiBvbGQgc3R5bGUgKi8KLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAxNikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU2V0dXAgUHJpb3JpdHk6ICV1LCBIb2xkaW5nIFByaW9yaXR5OiAldSwgSG9wLWxpbWl0OiAldSwgQmFuZHdpZHRoOiAlLjEwZyBNYnBzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpb2JqX3B0ci5yc3ZwX29ial9mcnItPnNldHVwX3ByaW8sCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpb2JqX3B0ci5yc3ZwX29ial9mcnItPmhvbGRfcHJpbywKLSAgICAgICAgICAgICAgICAgICAgICAgKGludClvYmpfcHRyLnJzdnBfb2JqX2Zyci0+aG9wX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgYncuZio4LzEwMDAwMDApOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgSW5jbHVkZSBDb2xvcnM6IDB4JTA4eCwgRXhjbHVkZSBDb2xvcnM6IDB4JTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2Zyci0+aW5jbHVkZV9hbnkpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2Zyci0+ZXhjbHVkZV9hbnkpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbi09MTY7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTE2OwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfREVUT1VSOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfVFVOTkVMX0lQVjQ6Ci0gICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gOCkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICBQTFItSUQ6ICVzLCBBdm9pZC1Ob2RlLUlEOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBhZGRyX3N0cmluZyhvYmpfdHB0cis0KSk7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTg7Ci0gICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz04OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU1ZQX09CSl9DTEFTU1RZUEU6Ci0gICAgICAgIGNhc2UgUlNWUF9PQkpfQ0xBU1NUWVBFX09MRDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOgotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIENUOiAldSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikmMHg3KTsgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG9ial90bGVuLT00OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX0VSUk9SX1NQRUM6Ci0gICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8zOiAvKiBmYWxsIHRocm91Z2ggLSBGSVhNRSBhZGQgVExWIHBhcnNlciAqLwotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFX0lQVjQ6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgOCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgZXJyb3JfY29kZT0qKG9ial90cHRyKzUpOwotICAgICAgICAgICAgICAgIGVycm9yX3ZhbHVlPUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzYpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEVycm9yIE5vZGUgQWRkcmVzczogJXMsIEZsYWdzOiBbMHglMDJ4XSVzICBFcnJvciBDb2RlOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGlwYWRkcl9zdHJpbmcob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAqKG9ial90cHRyKzQpLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial9lcnJvcl9jb2RlX3ZhbHVlcywidW5rbm93biIsZXJyb3JfY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfY29kZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX1JPVVRJTkc6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCBFcnJvciBWYWx1ZTogJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfb2JqX2Vycm9yX2NvZGVfcm91dGluZ192YWx1ZXMsInVua25vd24iLGVycm9yX3ZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSU1ZQX09CSl9FUlJPUl9TUEVDX0NPREVfRElGRlNFUlZfVEU6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgICAgICAgIGNhc2UgUlNWUF9PQkpfRVJST1JfU1BFQ19DT0RFX0RJRkZTRVJWX1RFX09MRDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIEVycm9yIFZhbHVlOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9vYmpfZXJyb3JfY29kZV9kaWZmc2Vydl90ZV92YWx1ZXMsInVua25vd24iLGVycm9yX3ZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIFVua25vd24gRXJyb3IgVmFsdWUgKCV1KSIsIGVycm9yX3ZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9ial90bGVuLT04OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz04OwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIElORVQ2Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfNDogLyogZmFsbCB0aHJvdWdoIC0gRklYTUUgYWRkIFRMViBwYXJzZXIgKi8KLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV9JUFY2OgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDIwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBlcnJvcl9jb2RlPSoob2JqX3RwdHIrMTcpOwotICAgICAgICAgICAgICAgIGVycm9yX3ZhbHVlPUVYVFJBQ1RfMTZCSVRTKG9ial90cHRyKzE4KTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBFcnJvciBOb2RlIEFkZHJlc3M6ICVzLCBGbGFnczogWzB4JTAyeF0lcyAgRXJyb3IgQ29kZTogJXMgKCV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBpcDZhZGRyX3N0cmluZyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrMTYpLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgdG9rMnN0cihyc3ZwX29ial9lcnJvcl9jb2RlX3ZhbHVlcywidW5rbm93biIsZXJyb3JfY29kZSksCi0gICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChlcnJvcl9jb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSU1ZQX09CSl9FUlJPUl9TUEVDX0NPREVfUk9VVElORzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIEVycm9yIFZhbHVlOiAlcyAoJXUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9vYmpfZXJyb3JfY29kZV9yb3V0aW5nX3ZhbHVlcywidW5rbm93biIsZXJyb3JfdmFsdWUpLAotCQkJICAgZXJyb3JfdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTIwOwotICAgICAgICAgICAgICAgIG9ial90cHRyKz0yMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX1BST1BFUlRJRVM6Ci0gICAgICAgICAgICBzd2l0Y2gocnN2cF9vYmpfY3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgUlNWUF9DVFlQRV8xOgotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIHBhZGJ5dGVzID0gRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIrMik7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgVExWIGNvdW50OiAldSwgcGFkZGluZyBieXRlczogJXUiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMob2JqX3RwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICBwYWRieXRlcyk7Ci0gICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgLyogbG9vcCB0aHJvdWdoIGFzIGxvbmcgdGhlcmUgaXMgYW55dGhpbmcgbG9uZ2VyIHRoYW4gdGhlIFRMViBoZWFkZXIgKDIpICovCi0gICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gMiArIHBhZGJ5dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgICAgJXMgVExWICgweCUwMngpLCBsZW5ndGg6ICV1IiwgLyogbGVuZ3RoIGluY2x1ZGVzIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfb2JqX3Byb3BfdGx2X3ZhbHVlcywidW5rbm93biIsKm9ial90cHRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpvYmpfdHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICoob2JqX3RwdHIrMSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCAqKG9ial90cHRyKzEpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqKG9ial90cHRyKzEpIDwgMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKG9ial90cHRyKzIsIlxuXHRcdCIsKihvYmpfdHB0cisxKS0yKTsKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPSoob2JqX3RwdHIrMSk7Ci0gICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz0qKG9ial90cHRyKzEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGV4ZHVtcD1UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSU1ZQX09CSl9NRVNTQUdFX0lEOiAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfTUVTU0FHRV9JRF9BQ0s6IC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlIFJTVlBfT0JKX01FU1NBR0VfSURfTElTVDoKLSAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMjoKLSAgICAgICAgICAgICAgICBpZiAob2JqX3RsZW4gPCA4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4tMTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBGbGFncyBbMHglMDJ4XSwgZXBvY2g6ICV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICpvYmpfdHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8yNEJJVFMob2JqX3RwdHIrMSkpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT00OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhcyBsb25nIHRoZXJlIGFyZSBubyBtZXNzYWdlcyBsZWZ0ICovCi0gICAgICAgICAgICAgICAgd2hpbGUob2JqX3RsZW4gPj0gNCkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzICAgIE1lc3NhZ2UtSUQgMHglMDh4ICgldSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0ciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikpOwotICAgICAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX0lOVEVHUklUWToKLSAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6Ci0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgc2l6ZW9mKHN0cnVjdCByc3ZwX29ial9pbnRlZ3JpdHlfdCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIG9ial9wdHIucnN2cF9vYmpfaW50ZWdyaXR5ID0gKGNvbnN0IHN0cnVjdCByc3ZwX29ial9pbnRlZ3JpdHlfdCAqKW9ial90cHRyOwotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgIEtleS1JRCAweCUwNHglMDh4LCBTZXF1ZW5jZSAweCUwOHglMDh4LCBGbGFncyBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKG9ial9wdHIucnN2cF9vYmpfaW50ZWdyaXR5LT5rZXlfaWQpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+a2V5X2lkKzIpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+c2VxdWVuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+c2VxdWVuY2UrNCksCi0gICAgICAgICAgICAgICAgICAgICAgIGJpdHRvazJzdHIocnN2cF9vYmpfaW50ZWdyaXR5X2ZsYWdfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfcHRyLnJzdnBfb2JqX2ludGVncml0eS0+ZmxhZ3MpKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzICBNRDUtc3VtIDB4JTA4eCUwOHglMDh4JTA4eCAodW52ZXJpZmllZCkiLAotICAgICAgICAgICAgICAgICAgICAgICBpZGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3B0ci5yc3ZwX29ial9pbnRlZ3JpdHktPmRpZ2VzdCksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfaW50ZWdyaXR5LT5kaWdlc3QrNCksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfaW50ZWdyaXR5LT5kaWdlc3QrOCksCi0gICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial9wdHIucnN2cF9vYmpfaW50ZWdyaXR5LT5kaWdlc3QrMTIpKTsKLSAgICAgICAgICAgICAgICBvYmpfdGxlbis9c2l6ZW9mKHN0cnVjdCByc3ZwX29ial9pbnRlZ3JpdHlfdCk7Ci0gICAgICAgICAgICAgICAgb2JqX3RwdHIrPXNpemVvZihzdHJ1Y3QgcnN2cF9vYmpfaW50ZWdyaXR5X3QpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsgICAgICAgICAgIAotCi0gICAgICAgIGNhc2UgUlNWUF9PQkpfQURNSU5fU1RBVFVTOgotICAgICAgICAgICAgc3dpdGNoKHJzdnBfb2JqX2N0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFJTVlBfQ1RZUEVfMTogCi0gICAgICAgICAgICAgICAgaWYgKG9ial90bGVuIDwgNCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuLTE7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgRmxhZ3MgWyVzXSIsIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKHJzdnBfb2JqX2FkbWluX3N0YXR1c19mbGFnX3ZhbHVlcywgIm5vbmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKSkpOwotICAgICAgICAgICAgICAgIG9ial90bGVuLT00OwotICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBoZXhkdW1wPVRSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFJTVlBfT0JKX0xBQkVMX1NFVDoKLSAgICAgICAgICAgIHN3aXRjaChyc3ZwX29ial9jdHlwZSkgewotICAgICAgICAgICAgY2FzZSBSU1ZQX0NUWVBFXzE6IAotICAgICAgICAgICAgICAgIGlmIChvYmpfdGxlbiA8IDQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybi0xOwotICAgICAgICAgICAgICAgIGFjdGlvbiA9IChFWFRSQUNUXzE2QklUUyhvYmpfdHB0cik+PjgpOwotCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgQWN0aW9uOiAlcyAoJXUpLCBMYWJlbCB0eXBlOiAldSIsIGlkZW50LAotICAgICAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfb2JqX2xhYmVsX3NldF9hY3Rpb25fdmFsdWVzLCAiVW5rbm93biIsIGFjdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiwgKChFWFRSQUNUXzMyQklUUyhvYmpfdHB0cikgJiAweDdGKSkpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBjYXNlIExBQkVMX1NFVF9JTkNMVVNJVkVfUkFOR0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBMQUJFTF9TRVRfRVhDTFVTSVZFX1JBTkdFOiAvKiBmYWxsIHRocm91Z2ggKi8KLQotCQkgICAgLyogb25seSBhIGNvdXBsZSBvZiBzdWJjaGFubmVscyBhcmUgZXhwZWN0ZWQgKi8KLQkJICAgIGlmIChvYmpfdGxlbiA8IDEyKQotCQkJcmV0dXJuIC0xOwotCQkgICAgcHJpbnRmKCIlcyAgU3RhcnQgcmFuZ2U6ICV1LCBFbmQgcmFuZ2U6ICV1IiwgaWRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhvYmpfdHB0cis0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKG9ial90cHRyKzgpKTsKLQkJICAgIG9ial90bGVuLT0xMjsKLQkJICAgIG9ial90cHRyKz0xMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBvYmpfdGxlbi09NDsKLSAgICAgICAgICAgICAgICAgICAgb2JqX3RwdHIrPTQ7Ci0gICAgICAgICAgICAgICAgICAgIHN1YmNoYW5uZWwgPSAxOwotICAgICAgICAgICAgICAgICAgICB3aGlsZShvYmpfdGxlbiA+PSA0ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAgU3ViY2hhbm5lbCAjJXU6ICV1IiwgaWRlbnQsIHN1YmNoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMob2JqX3RwdHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9ial90cHRyKz00OwotICAgICAgICAgICAgICAgICAgICAgICAgb2JqX3RsZW4tPTQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJjaGFubmVsKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhleGR1bXA9VFJVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAgRklYTUUgdGhvc2UgYXJlIHRoZSBkZWZpbmVkIG9iamVjdHMgdGhhdCBsYWNrIGEgZGVjb2RlcgotICAgICAgICAgKiAgeW91IGFyZSB3ZWxjb21lIHRvIGNvbnRyaWJ1dGUgY29kZSA7LSkKLSAgICAgICAgICovCi0KLSAgICAgICAgY2FzZSBSU1ZQX09CSl9TQ09QRToKLSAgICAgICAgY2FzZSBSU1ZQX09CSl9QT0xJQ1lfREFUQToKLSAgICAgICAgY2FzZSBSU1ZQX09CSl9BQ0NFUFRfTEFCRUxfU0VUOgotICAgICAgICBjYXNlIFJTVlBfT0JKX1BST1RFQ1RJT046Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAodmZsYWcgPD0gMSkKLSAgICAgICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEob2JqX3RwdHIsIlxuXHQgICAgIixvYmpfdGxlbik7IC8qIEZJWE1FIGluZGVudGF0aW9uICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBkbyB3ZSBhbHNvIHdhbnQgdG8gc2VlIGEgaGV4IGR1bXAgPyAqLwotICAgICAgICBpZiAodmZsYWcgPiAxIHx8IGhleGR1bXA9PVRSVUUpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCByc3ZwX29iamVjdF9oZWFkZXIpKSwiXG5cdCAgICAiLCAvKiBGSVhNRSBpbmRlbnRhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzdnBfb2JqX2xlbi1zaXplb2Yoc3RydWN0IHJzdnBfb2JqZWN0X2hlYWRlcikpOwotCi0gICAgICAgIHRwdHIrPXJzdnBfb2JqX2xlbjsKLSAgICAgICAgdGxlbi09cnN2cF9vYmpfbGVuOwotICAgIH0KLSAgICByZXR1cm4gMDsKLXRydW5jOgotICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOwotICAgIHJldHVybiAtMTsKLX0KLQotCi12b2lkCi1yc3ZwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcHB0ciwgcmVnaXN0ZXIgdV9pbnQgbGVuKSB7Ci0KLSAgICBjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyICpyc3ZwX2NvbV9oZWFkZXI7Ci0gICAgY29uc3QgdV9jaGFyICp0cHRyLCpzdWJ0cHRyOwotICAgIHVfc2hvcnQgdGxlbixzdWJ0bGVuOwotCi0gICAgdHB0cj1wcHRyOwotCi0gICAgcnN2cF9jb21faGVhZGVyID0gKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIgKilwcHRyOwotICAgIFRDSEVDSygqcnN2cF9jb21faGVhZGVyKTsKLQotICAgIC8qCi0gICAgICogU2FuaXR5IGNoZWNraW5nIG9mIHRoZSBoZWFkZXIuCi0gICAgICovCi0gICAgaWYgKFJTVlBfRVhUUkFDVF9WRVJTSU9OKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncykgIT0gUlNWUF9WRVJTSU9OKSB7Ci0JcHJpbnRmKCJFUlJPUjogUlNWUCB2ZXJzaW9uICV1IHBhY2tldCBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgIFJTVlBfRVhUUkFDVF9WRVJTSU9OKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncykpOwotCXJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgbGV0cyBwcmludCB0aGUgYmFzaWMgTWVzc2FnZSBUeXBlKi8KLSAgICBpZiAodmZsYWcgPCAxKSB7Ci0gICAgICAgIHByaW50ZigiUlNWUHYldSAlcyBNZXNzYWdlLCBsZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgIFJTVlBfRVhUUkFDVF9WRVJTSU9OKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncyksCi0gICAgICAgICAgICAgICB0b2syc3RyKHJzdnBfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biAoJXUpIixyc3ZwX2NvbV9oZWFkZXItPm1zZ190eXBlKSwKLSAgICAgICAgICAgICAgIGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBvayB0aGV5IHNlZW0gdG8gd2FudCB0byBrbm93IGV2ZXJ5dGhpbmcgLSBsZXRzIGZ1bGx5IGRlY29kZSBpdCAqLwotCi0gICAgdGxlbj1FWFRSQUNUXzE2QklUUyhyc3ZwX2NvbV9oZWFkZXItPmxlbmd0aCk7Ci0KLSAgICBwcmludGYoIlxuXHRSU1ZQdiV1ICVzIE1lc3NhZ2UgKCV1KSwgRmxhZ3M6IFslc10sIGxlbmd0aDogJXUsIHR0bDogJXUsIGNoZWNrc3VtOiAweCUwNHgiLAotICAgICAgICAgICBSU1ZQX0VYVFJBQ1RfVkVSU0lPTihyc3ZwX2NvbV9oZWFkZXItPnZlcnNpb25fZmxhZ3MpLAotICAgICAgICAgICB0b2syc3RyKHJzdnBfbXNnX3R5cGVfdmFsdWVzLCAidW5rbm93biwgdHlwZTogJXUiLHJzdnBfY29tX2hlYWRlci0+bXNnX3R5cGUpLAotICAgICAgICAgICByc3ZwX2NvbV9oZWFkZXItPm1zZ190eXBlLAotICAgICAgICAgICBiaXR0b2syc3RyKHJzdnBfaGVhZGVyX2ZsYWdfdmFsdWVzLCJub25lIixSU1ZQX0VYVFJBQ1RfRkxBR1MocnN2cF9jb21faGVhZGVyLT52ZXJzaW9uX2ZsYWdzKSksCi0gICAgICAgICAgIHRsZW4sCi0gICAgICAgICAgIHJzdnBfY29tX2hlYWRlci0+dHRsLAotICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhyc3ZwX2NvbV9oZWFkZXItPmNoZWNrc3VtKSk7Ci0KLSAgICBpZiAodGxlbiA8IHNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKSkgewotICAgICAgICBwcmludGYoIkVSUk9SOiBjb21tb24gaGVhZGVyIHRvbyBzaG9ydCAldSA8ICVsdSIsIHRsZW4sCi0gICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzaXplb2YoY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlcikpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHB0cis9c2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpOwotICAgIHRsZW4tPXNpemVvZihjb25zdCBzdHJ1Y3QgcnN2cF9jb21tb25faGVhZGVyKTsKLQotICAgIHN3aXRjaChyc3ZwX2NvbV9oZWFkZXItPm1zZ190eXBlKSB7Ci0KLSAgICBjYXNlIFJTVlBfTVNHVFlQRV9BR0dSRUdBVEU6Ci0gICAgICAgIHdoaWxlKHRsZW4gPiAwKSB7Ci0gICAgICAgICAgICBzdWJ0cHRyPXRwdHI7Ci0gICAgICAgICAgICByc3ZwX2NvbV9oZWFkZXIgPSAoY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlciAqKXN1YnRwdHI7Ci0gICAgICAgICAgICBUQ0hFQ0soKnJzdnBfY29tX2hlYWRlcik7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTYW5pdHkgY2hlY2tpbmcgb2YgdGhlIGhlYWRlci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKFJTVlBfRVhUUkFDVF9WRVJTSU9OKHJzdnBfY29tX2hlYWRlci0+dmVyc2lvbl9mbGFncykgIT0gUlNWUF9WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogUlNWUCB2ZXJzaW9uICV1IHBhY2tldCBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgUlNWUF9FWFRSQUNUX1ZFUlNJT04ocnN2cF9jb21faGVhZGVyLT52ZXJzaW9uX2ZsYWdzKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3VidGxlbj1FWFRSQUNUXzE2QklUUyhyc3ZwX2NvbV9oZWFkZXItPmxlbmd0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgUlNWUHYldSAlcyBNZXNzYWdlICgldSksIEZsYWdzOiBbJXNdLCBsZW5ndGg6ICV1LCB0dGw6ICV1LCBjaGVja3N1bTogMHglMDR4IiwKLSAgICAgICAgICAgICAgICAgICBSU1ZQX0VYVFJBQ1RfVkVSU0lPTihyc3ZwX2NvbV9oZWFkZXItPnZlcnNpb25fZmxhZ3MpLAotICAgICAgICAgICAgICAgICAgIHRvazJzdHIocnN2cF9tc2dfdHlwZV92YWx1ZXMsICJ1bmtub3duLCB0eXBlOiAldSIscnN2cF9jb21faGVhZGVyLT5tc2dfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgcnN2cF9jb21faGVhZGVyLT5tc2dfdHlwZSwKLSAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKHJzdnBfaGVhZGVyX2ZsYWdfdmFsdWVzLCJub25lIixSU1ZQX0VYVFJBQ1RfRkxBR1MocnN2cF9jb21faGVhZGVyLT52ZXJzaW9uX2ZsYWdzKSksCi0gICAgICAgICAgICAgICAgICAgc3VidGxlbiwKLSAgICAgICAgICAgICAgICAgICByc3ZwX2NvbV9oZWFkZXItPnR0bCwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyhyc3ZwX2NvbV9oZWFkZXItPmNoZWNrc3VtKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChzdWJ0bGVuIDwgc2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogY29tbW9uIGhlYWRlciB0b28gc2hvcnQgJXUgPCAlbHUiLCBzdWJ0bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzaXplb2YoY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlcikpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRsZW4gPCBzdWJ0bGVuKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogY29tbW9uIGhlYWRlciB0b28gbGFyZ2UgJXUgPiAldSIsIHN1YnRsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIHRsZW4pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3VidHB0cis9c2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpOwotICAgICAgICAgICAgc3VidGxlbi09c2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpOwotCi0gICAgICAgICAgICBpZiAocnN2cF9vYmpfcHJpbnQoc3VidHB0ciwiXG5cdCAgICAiLCBzdWJ0bGVuKSA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIHRwdHIrPXN1YnRsZW4rc2l6ZW9mKGNvbnN0IHN0cnVjdCByc3ZwX2NvbW1vbl9oZWFkZXIpOwotICAgICAgICAgICAgdGxlbi09c3VidGxlbitzaXplb2YoY29uc3Qgc3RydWN0IHJzdnBfY29tbW9uX2hlYWRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgUlNWUF9NU0dUWVBFX1BBVEg6Ci0gICAgY2FzZSBSU1ZQX01TR1RZUEVfUkVTVjoKLSAgICBjYXNlIFJTVlBfTVNHVFlQRV9QQVRIRVJSOgotICAgIGNhc2UgUlNWUF9NU0dUWVBFX1JFU1ZFUlI6Ci0gICAgY2FzZSBSU1ZQX01TR1RZUEVfUEFUSFRFQVI6Ci0gICAgY2FzZSBSU1ZQX01TR1RZUEVfUkVTVlRFQVI6Ci0gICAgY2FzZSBSU1ZQX01TR1RZUEVfUkVTVkNPTkY6Ci0gICAgY2FzZSBSU1ZQX01TR1RZUEVfSEVMTE9fT0xEOgotICAgIGNhc2UgUlNWUF9NU0dUWVBFX0hFTExPOgotICAgIGNhc2UgUlNWUF9NU0dUWVBFX0FDSzoKLSAgICBjYXNlIFJTVlBfTVNHVFlQRV9TUkVGUkVTSDoKLSAgICAgICAgaWYgKHJzdnBfb2JqX3ByaW50KHRwdHIsIlxuXHQgICIsIHRsZW4pID09IC0xKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6IAotICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0ciwiXG5cdCAgICAiLHRsZW4pOyAgCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybjsKLXRydW5jOgotICAgIHByaW50ZigiXG5cdFx0IHBhY2tldCBleGNlZWRlZCBzbmFwc2hvdCIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtcnQ2LmMgYi9wcmludC1ydDYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllMjJhZS4uMDAwMDAwMAotLS0gYS9wcmludC1ydDYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtcnQ2LmMsdiAxLjI2LjIuMSAyMDA1LzA0LzIwIDIyOjM1OjExIGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSU5FVDYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaXA2LmgiCi0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi1pbnQKLXJ0Nl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBjb25zdCB1X2NoYXIgKmJwMiBfVV8pCi17Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9ydGhkciAqZHA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwNl9ydGhkcjAgKmRwMDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwOwotCWludCBpLCBsZW47Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyOwotCi0JZHAgPSAoc3RydWN0IGlwNl9ydGhkciAqKWJwOwotCWxlbiA9IGRwLT5pcDZyX2xlbjsKLQotCS8qICdlcCcgcG9pbnRzIHRvIHRoZSBlbmQgb2YgYXZhaWxhYmxlIGRhdGEuICovCi0JZXAgPSBzbmFwZW5kOwotCi0JVENIRUNLKGRwLT5pcDZyX3NlZ2xlZnQpOwotCi0JcHJpbnRmKCJzcmNydCAobGVuPSVkIiwgZHAtPmlwNnJfbGVuKTsJLyopKi8KLQlwcmludGYoIiwgdHlwZT0lZCIsIGRwLT5pcDZyX3R5cGUpOwotCXByaW50ZigiLCBzZWdsZWZ0PSVkIiwgZHAtPmlwNnJfc2VnbGVmdCk7Ci0KLQlzd2l0Y2ggKGRwLT5pcDZyX3R5cGUpIHsKLSNpZm5kZWYgSVBWNl9SVEhEUl9UWVBFXzAKLSNkZWZpbmUgSVBWNl9SVEhEUl9UWVBFXzAgMAotI2VuZGlmCi0jaWZuZGVmIElQVjZfUlRIRFJfVFlQRV8yCi0jZGVmaW5lIElQVjZfUlRIRFJfVFlQRV8yIDIKLSNlbmRpZgotCWNhc2UgSVBWNl9SVEhEUl9UWVBFXzA6Ci0JY2FzZSBJUFY2X1JUSERSX1RZUEVfMjoJCQkvKiBNb2JpbGUgSVB2NiBJRC0yMCAqLwotCQlkcDAgPSAoc3RydWN0IGlwNl9ydGhkcjAgKilkcDsKLQotCQlUQ0hFQ0soZHAwLT5pcDZyMF9yZXNlcnZlZCk7Ci0JCWlmIChkcDAtPmlwNnIwX3Jlc2VydmVkIHx8IHZmbGFnKSB7Ci0JCQlwcmludGYoIiwgcnN2PTB4JTB4IiwKLQkJCSAgICBFWFRSQUNUXzMyQklUUygmZHAwLT5pcDZyMF9yZXNlcnZlZCkpOwotCQl9Ci0KLQkJaWYgKGxlbiAlIDIgPT0gMSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWxlbiA+Pj0gMTsKLQkJYWRkciA9ICZkcDAtPmlwNnIwX2FkZHJbMF07Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCh1X2NoYXIgKikoYWRkciArIDEpID4gZXApCi0JCQkJZ290byB0cnVuYzsKLQotCQkJcHJpbnRmKCIsIFslZF0lcyIsIGksIGlwNmFkZHJfc3RyaW5nKGFkZHIpKTsKLQkJCWFkZHIrKzsKLQkJfQotCQkvKigqLwotCQlwcmludGYoIikgIik7Ci0JCXJldHVybigoZHAwLT5pcDZyMF9sZW4gKyAxKSA8PCAzKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byB0cnVuYzsKLQkJYnJlYWs7Ci0JfQotCi0gdHJ1bmM6Ci0JZnB1dHMoIlt8c3JjcnRdIiwgc3Rkb3V0KTsKLQlyZXR1cm4gLTE7Ci19Ci0jZW5kaWYgLyogSU5FVDYgKi8KZGlmZiAtLWdpdCBhL3ByaW50LXJ4LmMgYi9wcmludC1yeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTkxMDY2Li4wMDAwMDAwCi0tLSBhL3ByaW50LXJ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQ6IChjKSAyMDAwIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBhcyByZXByZXNlbnRlZCBieSB0aGUKLSAqCVNlY3JldGFyeSBvZiB0aGUgTmF2eS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgICAgZGlzdHJpYnV0aW9uLgotICogICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiAgICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotLyoKLSAqIFRoaXMgY29kZSB1bm1hbmdsZXMgUlggcGFja2V0cy4gIFJYIGlzIHRoZSBtdXRhbnQgZm9ybSBvZiBSUEMgdGhhdCBBRlMKLSAqIHVzZXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjbGllbnRzIGFuZCBzZXJ2ZXJzLgotICoKLSAqIEluIHRoaXMgY29kZSwgSSBtYWlubHkgY29uY2VybiBteXNlbGYgd2l0aCBkZWNvZGluZyB0aGUgQUZTIGNhbGxzLCBub3QKLSAqIHdpdGggdGhlIGd1dHMgb2YgUlgsIHBlciBzZS4KLSAqCi0gKiBCYWguICBJZiBJIG5ldmVyIGxvb2sgYXQgcnhfcGFja2V0LmggYWdhaW4sIGl0IHdpbGwgYmUgdG9vIHNvb24uCi0gKgotICogS2VuIEhvcm5zdGVpbiA8a2VuaEBjbWYubnJsLm5hdnkubWlsPgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXJ4LmMsdiAxLjM3LjIuMiAyMDA3LzA2LzE1IDE5OjQzOjE1IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotI2luY2x1ZGUgInJ4LmgiCi0KLSNpbmNsdWRlICJpcC5oIgotCi1zdGF0aWMgc3RydWN0IHRvayByeF90eXBlc1tdID0gewotCXsgUlhfUEFDS0VUX1RZUEVfREFUQSwJCSJkYXRhIiB9LAotCXsgUlhfUEFDS0VUX1RZUEVfQUNLLAkJImFjayIgfSwKLQl7IFJYX1BBQ0tFVF9UWVBFX0JVU1ksCQkiYnVzeSIgfSwKLQl7IFJYX1BBQ0tFVF9UWVBFX0FCT1JULAkJImFib3J0IiB9LAotCXsgUlhfUEFDS0VUX1RZUEVfQUNLQUxMLAkiYWNrYWxsIiB9LAotCXsgUlhfUEFDS0VUX1RZUEVfQ0hBTExFTkdFLAkiY2hhbGxlbmdlIiB9LAotCXsgUlhfUEFDS0VUX1RZUEVfUkVTUE9OU0UsCSJyZXNwb25zZSIgfSwKLQl7IFJYX1BBQ0tFVF9UWVBFX0RFQlVHLAkJImRlYnVnIiB9LAotCXsgUlhfUEFDS0VUX1RZUEVfUEFSQU1TLAkicGFyYW1zIiB9LAotCXsgUlhfUEFDS0VUX1RZUEVfVkVSU0lPTiwJInZlcnNpb24iIH0sCi0JeyAwLAkJCQlOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IGRvdWJsZV90b2sgewotCWludCBmbGFnOwkJLyogUnggZmxhZyAqLwotCWludCBwYWNrZXRUeXBlOwkJLyogUGFja2V0IHR5cGUgKi8KLQljb25zdCBjaGFyICpzOwkJLyogRmxhZyBzdHJpbmcgKi8KLX0gcnhfZmxhZ3NbXSA9IHsKLQl7IFJYX0NMSUVOVF9JTklUSUFURUQsCTAsCQkJImNsaWVudC1pbml0IiB9LAotCXsgUlhfUkVRVUVTVF9BQ0ssCTAsCQkJInJlcS1hY2siIH0sCi0JeyBSWF9MQVNUX1BBQ0tFVCwJMCwJCQkibGFzdC1wY2t0IiB9LAotCXsgUlhfTU9SRV9QQUNLRVRTLAkwLAkJCSJtb3JlLXBja3RzIiB9LAotCXsgUlhfRlJFRV9QQUNLRVQsCTAsCQkJImZyZWUtcGNrdCIgfSwKLQl7IFJYX1NMT1dfU1RBUlRfT0ssCVJYX1BBQ0tFVF9UWVBFX0FDSywJInNsb3ctc3RhcnQiIH0sCi0JeyBSWF9KVU1CT19QQUNLRVQsCVJYX1BBQ0tFVF9UWVBFX0RBVEEsCSJqdW1ib2dyYW0iIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGZzX3JlcVtdID0gewotCXsgMTMwLAkJImZldGNoLWRhdGEiIH0sCi0JeyAxMzEsCQkiZmV0Y2gtYWNsIiB9LAotCXsgMTMyLAkJImZldGNoLXN0YXR1cyIgfSwKLQl7IDEzMywJCSJzdG9yZS1kYXRhIiB9LAotCXsgMTM0LAkJInN0b3JlLWFjbCIgfSwKLQl7IDEzNSwJCSJzdG9yZS1zdGF0dXMiIH0sCi0JeyAxMzYsCQkicmVtb3ZlLWZpbGUiIH0sCi0JeyAxMzcsCQkiY3JlYXRlLWZpbGUiIH0sCi0JeyAxMzgsCQkicmVuYW1lIiB9LAotCXsgMTM5LAkJInN5bWxpbmsiIH0sCi0JeyAxNDAsCQkibGluayIgfSwKLQl7IDE0MSwJCSJtYWtlZGlyIiB9LAotCXsgMTQyLAkJInJtZGlyIiB9LAotCXsgMTQzLAkJIm9sZHNldGxvY2siIH0sCi0JeyAxNDQsCQkib2xkZXh0bG9jayIgfSwKLQl7IDE0NSwJCSJvbGRyZWxsb2NrIiB9LAotCXsgMTQ2LAkJImdldC1zdGF0cyIgfSwKLQl7IDE0NywJCSJnaXZlLWNicyIgfSwKLQl7IDE0OCwJCSJnZXQtdmxpbmZvIiB9LAotCXsgMTQ5LAkJImdldC12bHN0YXRzIiB9LAotCXsgMTUwLAkJInNldC12bHN0YXRzIiB9LAotCXsgMTUxLAkJImdldC1yb290dmwiIH0sCi0JeyAxNTIsCQkiY2hlY2stdG9rZW4iIH0sCi0JeyAxNTMsCQkiZ2V0LXRpbWUiIH0sCi0JeyAxNTQsCQkibmdldC12bGluZm8iIH0sCi0JeyAxNTUsCQkiYnVsay1zdGF0IiB9LAotCXsgMTU2LAkJInNldGxvY2siIH0sCi0JeyAxNTcsCQkiZXh0bG9jayIgfSwKLQl7IDE1OCwJCSJyZWxsb2NrIiB9LAotCXsgMTU5LAkJInhzdGF0LXZlciIgfSwKLQl7IDE2MCwJCSJnZXQteHN0YXQiIH0sCi0JeyAxNjEsCQkiZGZzLWxvb2t1cCIgfSwKLQl7IDE2MiwJCSJkZnMtZmx1c2hjcHMiIH0sCi0JeyAxNjMsCQkiZGZzLXN5bWxpbmsiIH0sCi0JeyAyMjAsCQkicmVzaWRlbmN5IiB9LAotCXsgMCwJCU5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNiX3JlcVtdID0gewotCXsgMjA0LAkJImNhbGxiYWNrIiB9LAotCXsgMjA1LAkJImluaXRjYiIgfSwKLQl7IDIwNiwJCSJwcm9iZSIgfSwKLQl7IDIwNywJCSJnZXRsb2NrIiB9LAotCXsgMjA4LAkJImdldGNlIiB9LAotCXsgMjA5LAkJInhzdGF0dmVyIiB9LAotCXsgMjEwLAkJImdldHhzdGF0IiB9LAotCXsgMjExLAkJImluaXRjYjIiIH0sCi0JeyAyMTIsCQkid2hvYXJleW91IiB9LAotCXsgMjEzLAkJImluaXRjYjMiIH0sCi0JeyAyMTQsCQkicHJvYmV1dWlkIiB9LAotCXsgMjE1LAkJImdldHNydnByZWZzIiB9LAotCXsgMjE2LAkJImdldGNlbGxzZXJ2ZGIiIH0sCi0JeyAyMTcsCQkiZ2V0bG9jYWxjZWxsIiB9LAotCXsgMjE4LAkJImdldGNhY2hlY29uZiIgfSwKLQl7IDAsCQlOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHRvayBwdF9yZXFbXSA9IHsKLQl7IDUwMCwJCSJuZXctdXNlciIgfSwKLQl7IDUwMSwJCSJ3aGVyZS1pcy1pdCIgfSwKLQl7IDUwMiwJCSJkdW1wLWVudHJ5IiB9LAotCXsgNTAzLAkJImFkZC10by1ncm91cCIgfSwKLQl7IDUwNCwJCSJuYW1lLXRvLWlkIiB9LAotCXsgNTA1LAkJImlkLXRvLW5hbWUiIH0sCi0JeyA1MDYsCQkiZGVsZXRlIiB9LAotCXsgNTA3LAkJInJlbW92ZS1mcm9tLWdyb3VwIiB9LAotCXsgNTA4LAkJImdldC1jcHMiIH0sCi0JeyA1MDksCQkibmV3LWVudHJ5IiB9LAotCXsgNTEwLAkJImxpc3QtbWF4IiB9LAotCXsgNTExLAkJInNldC1tYXgiIH0sCi0JeyA1MTIsCQkibGlzdC1lbnRyeSIgfSwKLQl7IDUxMywJCSJjaGFuZ2UtZW50cnkiIH0sCi0JeyA1MTQsCQkibGlzdC1lbGVtZW50cyIgfSwKLQl7IDUxNSwJCSJzYW1lLW1ici1vZiIgfSwKLQl7IDUxNiwJCSJzZXQtZmxkLXNlbnRyeSIgfSwKLQl7IDUxNywJCSJsaXN0LW93bmVkIiB9LAotCXsgNTE4LAkJImdldC1jcHMyIiB9LAotCXsgNTE5LAkJImdldC1ob3N0LWNwcyIgfSwKLQl7IDUyMCwJCSJ1cGRhdGUtZW50cnkiIH0sCi0JeyA1MjEsCQkibGlzdC1lbnRyaWVzIiB9LAotCXsgMCwJCU5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHZsZGJfcmVxW10gPSB7Ci0JeyA1MDEsCQkiY3JlYXRlLWVudHJ5IiB9LAotCXsgNTAyLAkJImRlbGV0ZS1lbnRyeSIgfSwKLQl7IDUwMywJCSJnZXQtZW50cnktYnktaWQiIH0sCi0JeyA1MDQsCQkiZ2V0LWVudHJ5LWJ5LW5hbWUiIH0sCi0JeyA1MDUsCQkiZ2V0LW5ldy12b2x1bWUtaWQiIH0sCi0JeyA1MDYsCQkicmVwbGFjZS1lbnRyeSIgfSwKLQl7IDUwNywJCSJ1cGRhdGUtZW50cnkiIH0sCi0JeyA1MDgsCQkic2V0bG9jayIgfSwKLQl7IDUwOSwJCSJyZWxlYXNlbG9jayIgfSwKLQl7IDUxMCwJCSJsaXN0LWVudHJ5IiB9LAotCXsgNTExLAkJImxpc3QtYXR0cmliIiB9LAotCXsgNTEyLAkJImxpbmtlZC1saXN0IiB9LAotCXsgNTEzLAkJImdldC1zdGF0cyIgfSwKLQl7IDUxNCwJCSJwcm9iZSIgfSwKLQl7IDUxNSwJCSJnZXQtYWRkcnMiIH0sCi0JeyA1MTYsCQkiY2hhbmdlLWFkZHIiIH0sCi0JeyA1MTcsCQkiY3JlYXRlLWVudHJ5LW4iIH0sCi0JeyA1MTgsCQkiZ2V0LWVudHJ5LWJ5LWlkLW4iIH0sCi0JeyA1MTksCQkiZ2V0LWVudHJ5LWJ5LW5hbWUtbiIgfSwKLQl7IDUyMCwJCSJyZXBsYWNlLWVudHJ5LW4iIH0sCi0JeyA1MjEsCQkibGlzdC1lbnRyeS1uIiB9LAotCXsgNTIyLAkJImxpc3QtYXR0cmliLW4iIH0sCi0JeyA1MjMsCQkibGlua2VkLWxpc3QtbiIgfSwKLQl7IDUyNCwJCSJ1cGRhdGUtZW50cnktYnktbmFtZSIgfSwKLQl7IDUyNSwJCSJjcmVhdGUtZW50cnktdSIgfSwKLQl7IDUyNiwJCSJnZXQtZW50cnktYnktaWQtdSIgfSwKLQl7IDUyNywJCSJnZXQtZW50cnktYnktbmFtZS11IiB9LAotCXsgNTI4LAkJInJlcGxhY2UtZW50cnktdSIgfSwKLQl7IDUyOSwJCSJsaXN0LWVudHJ5LXUiIH0sCi0JeyA1MzAsCQkibGlzdC1hdHRyaWItdSIgfSwKLQl7IDUzMSwJCSJsaW5rZWQtbGlzdC11IiB9LAotCXsgNTMyLAkJInJlZ2FkZHIiIH0sCi0JeyA1MzMsCQkiZ2V0LWFkZHJzLXUiIH0sCi0JeyA1MzQsCQkibGlzdC1hdHRyaWItbjIiIH0sCi0JeyAwLAkJTlVMTCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCB0b2sga2F1dGhfcmVxW10gPSB7Ci0JeyAxLAkJImF1dGgtb2xkIiB9LAotCXsgMjEsCQkiYXV0aGVudGljYXRlIiB9LAotCXsgMjIsCQkiYXV0aGVudGljYXRlLXYyIiB9LAotCXsgMiwJCSJjaGFuZ2UtcHciIH0sCi0JeyAzLAkJImdldC10aWNrZXQtb2xkIiB9LAotCXsgMjMsCQkiZ2V0LXRpY2tldCIgfSwKLQl7IDQsCQkic2V0LXB3IiB9LAotCXsgNSwJCSJzZXQtZmllbGRzIiB9LAotCXsgNiwJCSJjcmVhdGUtdXNlciIgfSwKLQl7IDcsCQkiZGVsZXRlLXVzZXIiIH0sCi0JeyA4LAkJImdldC1lbnRyeSIgfSwKLQl7IDksCQkibGlzdC1lbnRyeSIgfSwKLQl7IDEwLAkJImdldC1zdGF0cyIgfSwKLQl7IDExLAkJImRlYnVnIiB9LAotCXsgMTIsCQkiZ2V0LXB3IiB9LAotCXsgMTMsCQkiZ2V0LXJhbmRvbS1rZXkiIH0sCi0JeyAxNCwJCSJ1bmxvY2siIH0sCi0JeyAxNSwJCSJsb2NrLXN0YXR1cyIgfSwKLQl7IDAsCQlOVUxMIH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHRvayB2b2xfcmVxW10gPSB7Ci0JeyAxMDAsCQkiY3JlYXRlLXZvbHVtZSIgfSwKLQl7IDEwMSwJCSJkZWxldGUtdm9sdW1lIiB9LAotCXsgMTAyLAkJInJlc3RvcmUiIH0sCi0JeyAxMDMsCQkiZm9yd2FyZCIgfSwKLQl7IDEwNCwJCSJlbmQtdHJhbnMiIH0sCi0JeyAxMDUsCQkiY2xvbmUiIH0sCi0JeyAxMDYsCQkic2V0LWZsYWdzIiB9LAotCXsgMTA3LAkJImdldC1mbGFncyIgfSwKLQl7IDEwOCwJCSJ0cmFucy1jcmVhdGUiIH0sCi0JeyAxMDksCQkiZHVtcCIgfSwKLQl7IDExMCwJCSJnZXQtbnRoLXZvbHVtZSIgfSwKLQl7IDExMSwJCSJzZXQtZm9yd2FyZGluZyIgfSwKLQl7IDExMiwJCSJnZXQtbmFtZSIgfSwKLQl7IDExMywJCSJnZXQtc3RhdHVzIiB9LAotCXsgMTE0LAkJInNpZy1yZXN0b3JlIiB9LAotCXsgMTE1LAkJImxpc3QtcGFydGl0aW9ucyIgfSwKLQl7IDExNiwJCSJsaXN0LXZvbHVtZXMiIH0sCi0JeyAxMTcsCQkic2V0LWlkLXR5cGVzIiB9LAotCXsgMTE4LAkJIm1vbml0b3IiIH0sCi0JeyAxMTksCQkicGFydGl0aW9uLWluZm8iIH0sCi0JeyAxMjAsCQkicmVjbG9uZSIgfSwKLQl7IDEyMSwJCSJsaXN0LW9uZS12b2x1bWUiIH0sCi0JeyAxMjIsCQkibnVrZSIgfSwKLQl7IDEyMywJCSJzZXQtZGF0ZSIgfSwKLQl7IDEyNCwJCSJ4LWxpc3Qtdm9sdW1lcyIgfSwKLQl7IDEyNSwJCSJ4LWxpc3Qtb25lLXZvbHVtZSIgfSwKLQl7IDEyNiwJCSJzZXQtaW5mbyIgfSwKLQl7IDEyNywJCSJ4LWxpc3QtcGFydGl0aW9ucyIgfSwKLQl7IDEyOCwJCSJmb3J3YXJkLW11bHRpcGxlIiB9LAotCXsgMCwJCU5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGJvc19yZXFbXSA9IHsKLQl7IDgwLAkJImNyZWF0ZS1ibm9kZSIgfSwKLQl7IDgxLAkJImRlbGV0ZS1ibm9kZSIgfSwKLQl7IDgyLAkJInNldC1zdGF0dXMiIH0sCi0JeyA4MywJCSJnZXQtc3RhdHVzIiB9LAotCXsgODQsCQkiZW51bWVyYXRlLWluc3RhbmNlIiB9LAotCXsgODUsCQkiZ2V0LWluc3RhbmNlLWluZm8iIH0sCi0JeyA4NiwJCSJnZXQtaW5zdGFuY2UtcGFybSIgfSwKLQl7IDg3LAkJImFkZC1zdXBlcnVzZXIiIH0sCi0JeyA4OCwJCSJkZWxldGUtc3VwZXJ1c2VyIiB9LAotCXsgODksCQkibGlzdC1zdXBlcnVzZXJzIiB9LAotCXsgOTAsCQkibGlzdC1rZXlzIiB9LAotCXsgOTEsCQkiYWRkLWtleSIgfSwKLQl7IDkyLAkJImRlbGV0ZS1rZXkiIH0sCi0JeyA5MywJCSJzZXQtY2VsbC1uYW1lIiB9LAotCXsgOTQsCQkiZ2V0LWNlbGwtbmFtZSIgfSwKLQl7IDk1LAkJImdldC1jZWxsLWhvc3QiIH0sCi0JeyA5NiwJCSJhZGQtY2VsbC1ob3N0IiB9LAotCXsgOTcsCQkiZGVsZXRlLWNlbGwtaG9zdCIgfSwKLQl7IDk4LAkJInNldC10LXN0YXR1cyIgfSwKLQl7IDk5LAkJInNodXRkb3duLWFsbCIgfSwKLQl7IDEwMCwJCSJyZXN0YXJ0LWFsbCIgfSwKLQl7IDEwMSwJCSJzdGFydHVwLWFsbCIgfSwKLQl7IDEwMiwJCSJzZXQtbm9hdXRoLWZsYWciIH0sCi0JeyAxMDMsCQkicmUtYm96byIgfSwKLQl7IDEwNCwJCSJyZXN0YXJ0IiB9LAotCXsgMTA1LAkJInN0YXJ0LWJvem8taW5zdGFsbCIgfSwKLQl7IDEwNiwJCSJ1bmluc3RhbGwiIH0sCi0JeyAxMDcsCQkiZ2V0LWRhdGVzIiB9LAotCXsgMTA4LAkJImV4ZWMiIH0sCi0JeyAxMDksCQkicHJ1bmUiIH0sCi0JeyAxMTAsCQkic2V0LXJlc3RhcnQtdGltZSIgfSwKLQl7IDExMSwJCSJnZXQtcmVzdGFydC10aW1lIiB9LAotCXsgMTEyLAkJInN0YXJ0LWJvem8tbG9nIiB9LAotCXsgMTEzLAkJIndhaXQtYWxsIiB9LAotCXsgMTE0LAkJImdldC1pbnN0YW5jZS1zdHJpbmdzIiB9LAotCXsgMTE1LAkJImdldC1yZXN0cmljdGVkIiB9LAotCXsgMTE2LAkJInNldC1yZXN0cmljdGVkIiB9LAotCXsgMCwJCU5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHViaWtfcmVxW10gPSB7Ci0JeyAxMDAwMCwJInZvdGUtYmVhY29uIiB9LAotCXsgMTAwMDEsCSJ2b3RlLWRlYnVnLW9sZCIgfSwKLQl7IDEwMDAyLAkidm90ZS1zZGVidWctb2xkIiB9LAotCXsgMTAwMDMsCSJ2b3RlLWdldHN5bmNzaXRlIiB9LAotCXsgMTAwMDQsCSJ2b3RlLWRlYnVnIiB9LAotCXsgMTAwMDUsCSJ2b3RlLXNkZWJ1ZyIgfSwKLQl7IDIwMDAwLAkiZGlzay1iZWdpbiIgfSwKLQl7IDIwMDAxLAkiZGlzay1jb21taXQiIH0sCi0JeyAyMDAwMiwJImRpc2stbG9jayIgfSwKLQl7IDIwMDAzLAkiZGlzay13cml0ZSIgfSwKLQl7IDIwMDA0LAkiZGlzay1nZXR2ZXJzaW9uIiB9LAotCXsgMjAwMDUsCSJkaXNrLWdldGZpbGUiIH0sCi0JeyAyMDAwNiwJImRpc2stc2VuZGZpbGUiIH0sCi0JeyAyMDAwNywJImRpc2stYWJvcnQiIH0sCi0JeyAyMDAwOCwJImRpc2stcmVsZWFzZWxvY2tzIiB9LAotCXsgMjAwMDksCSJkaXNrLXRydW5jYXRlIiB9LAotCXsgMjAwMTAsCSJkaXNrLXByb2JlIiB9LAotCXsgMjAwMTEsCSJkaXNrLXdyaXRldiIgfSwKLQl7IDIwMDEyLAkiZGlzay1pbnRlcmZhY2VhZGRyIiB9LAotCXsgMjAwMTMsCSJkaXNrLXNldHZlcnNpb24iIH0sCi0JeyAwLAkJTlVMTCB9LAotfTsKLQotI2RlZmluZSBWT1RFX0xPVwkxMDAwMAotI2RlZmluZSBWT1RFX0hJR0gJMTAwMDUKLSNkZWZpbmUgRElTS19MT1cJMjAwMDAKLSNkZWZpbmUgRElTS19ISUdICTIwMDEzCi0KLXN0YXRpYyBzdHJ1Y3QgdG9rIGNiX3R5cGVzW10gPSB7Ci0JeyAxLAkJImV4Y2x1c2l2ZSIgfSwKLQl7IDIsCQkic2hhcmVkIiB9LAotCXsgMywJCSJkcm9wcGVkIiB9LAotCXsgMCwJCU5VTEwgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHViaWtfbG9ja190eXBlc1tdID0gewotCXsgMSwJCSJyZWFkIiB9LAotCXsgMiwJCSJ3cml0ZSIgfSwKLQl7IDMsCQkid2FpdCIgfSwKLQl7IDAsCQlOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqdm9sdHlwZVtdID0geyAicmVhZC13cml0ZSIsICJyZWFkLW9ubHkiLCAiYmFja3VwIiB9OwotCi1zdGF0aWMgc3RydWN0IHRvayBhZnNfZnNfZXJyb3JzW10gPSB7Ci0JeyAxMDEsCQkic2FsdmFnZSB2b2x1bWUiIH0sCi0JeyAxMDIsIAkJIm5vIHN1Y2ggdm5vZGUiIH0sCi0JeyAxMDMsIAkJIm5vIHN1Y2ggdm9sdW1lIiB9LAotCXsgMTA0LCAJCSJ2b2x1bWUgZXhpc3QiIH0sCi0JeyAxMDUsIAkJIm5vIHNlcnZpY2UiIH0sCi0JeyAxMDYsIAkJInZvbHVtZSBvZmZsaW5lIiB9LAotCXsgMTA3LCAJCSJ2b2xpbmUgb25saW5lIiB9LAotCXsgMTA4LCAJCSJkaXNrZnVsbCIgfSwKLQl7IDEwOSwgCQkiZGlza3F1b3RhIGV4Y2VlZGVkIiB9LAotCXsgMTEwLCAJCSJ2b2x1bWUgYnVzeSIgfSwKLQl7IDExMSwgCQkidm9sdW1lIG1vdmVkIiB9LAotCXsgMTEyLCAJCSJBRlMgSU8gZXJyb3IiIH0sCi0JeyAtMTAwLAkJInJlc3RhcnRpbmcgZmlsZXNlcnZlciIgfSwKLQl7IDAsCQlOVUxMIH0KLX07Ci0KLS8qCi0gKiBSZWFzb25zIGZvciBhY2tub3dsZWRnaW5nIGEgcGFja2V0Ci0gKi8KLQotc3RhdGljIHN0cnVjdCB0b2sgcnhfYWNrX3JlYXNvbnNbXSA9IHsKLQl7IDEsCQkiYWNrIHJlcXVlc3RlZCIgfSwKLQl7IDIsCQkiZHVwbGljYXRlIHBhY2tldCIgfSwKLQl7IDMsCQkib3V0IG9mIHNlcXVlbmNlIiB9LAotCXsgNCwJCSJleGNlZWRzIHdpbmRvdyIgfSwKLQl7IDUsCQkibm8gYnVmZmVyIHNwYWNlIiB9LAotCXsgNiwJCSJwaW5nIiB9LAotCXsgNywJCSJwaW5nIHJlc3BvbnNlIiB9LAotCXsgOCwJCSJkZWxheSIgfSwKLQl7IDksCQkiaWRsZSIgfSwKLQl7IDAsCQlOVUxMIH0sCi19OwotCi0vKgotICogQ2FjaGUgZW50cmllcyB3ZSBrZWVwIGFyb3VuZCBzbyB3ZSBjYW4gZmlndXJlIG91dCB0aGUgUlggb3Bjb2RlCi0gKiBudW1iZXJzIGZvciByZXBsaWVzLiAgVGhpcyBhbGxvd3MgdXMgdG8gbWFrZSBzZW5zZSBvZiBSWCByZXBseSBwYWNrZXRzLgotICovCi0KLXN0cnVjdCByeF9jYWNoZV9lbnRyeSB7Ci0JdV9pbnQzMl90CWNhbGxudW07CS8qIENhbGwgbnVtYmVyIChuZXQgb3JkZXIpICovCi0Jc3RydWN0IGluX2FkZHIJY2xpZW50OwkJLyogY2xpZW50IElQIGFkZHJlc3MgKG5ldCBvcmRlcikgKi8KLQlzdHJ1Y3QgaW5fYWRkcglzZXJ2ZXI7CQkvKiBzZXJ2ZXIgSVAgYWRkcmVzcyAobmV0IG9yZGVyKSAqLwotCWludAkJZHBvcnQ7CQkvKiBzZXJ2ZXIgcG9ydCAoaG9zdCBvcmRlcikgKi8KLQl1X3Nob3J0CQlzZXJ2aWNlSWQ7CS8qIFNlcnZpY2UgaWRlbnRpZmllciAobmV0IG9yZGVyKSAqLwotCXVfaW50MzJfdAlvcGNvZGU7CQkvKiBSWCBvcGNvZGUgKGhvc3Qgb3JkZXIpICovCi19OwotCi0jZGVmaW5lIFJYX0NBQ0hFX1NJWkUJNjQKLQotc3RhdGljIHN0cnVjdCByeF9jYWNoZV9lbnRyeQlyeF9jYWNoZVtSWF9DQUNIRV9TSVpFXTsKLQotc3RhdGljIGludAlyeF9jYWNoZV9uZXh0ID0gMDsKLXN0YXRpYyBpbnQJcnhfY2FjaGVfaGludCA9IDA7Ci1zdGF0aWMgdm9pZAlyeF9jYWNoZV9pbnNlcnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHN0cnVjdCBpcCAqLCBpbnQpOwotc3RhdGljIGludAlyeF9jYWNoZV9maW5kKGNvbnN0IHN0cnVjdCByeF9oZWFkZXIgKiwgY29uc3Qgc3RydWN0IGlwICosCi0JCQkgICAgICBpbnQsIGludDMyX3QgKik7Ci0KLXN0YXRpYyB2b2lkIGZzX3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgZnNfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7Ci1zdGF0aWMgdm9pZCBhY2xfcHJpbnQodV9jaGFyICosIGludCwgdV9jaGFyICopOwotc3RhdGljIHZvaWQgY2JfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7Ci1zdGF0aWMgdm9pZCBjYl9yZXBseV9wcmludChjb25zdCB1X2NoYXIgKiwgaW50LCBpbnQzMl90KTsKLXN0YXRpYyB2b2lkIHByb3RfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7Ci1zdGF0aWMgdm9pZCBwcm90X3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQsIGludDMyX3QpOwotc3RhdGljIHZvaWQgdmxkYl9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKLXN0YXRpYyB2b2lkIHZsZGJfcmVwbHlfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCwgaW50MzJfdCk7Ci1zdGF0aWMgdm9pZCBrYXV0aF9wcmludChjb25zdCB1X2NoYXIgKiwgaW50KTsKLXN0YXRpYyB2b2lkIGthdXRoX3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQsIGludDMyX3QpOwotc3RhdGljIHZvaWQgdm9sX3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgdm9sX3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQsIGludDMyX3QpOwotc3RhdGljIHZvaWQgYm9zX3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQpOwotc3RhdGljIHZvaWQgYm9zX3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQsIGludDMyX3QpOwotc3RhdGljIHZvaWQgdWJpa19wcmludChjb25zdCB1X2NoYXIgKik7Ci1zdGF0aWMgdm9pZCB1YmlrX3JlcGx5X3ByaW50KGNvbnN0IHVfY2hhciAqLCBpbnQsIGludDMyX3QpOwotCi1zdGF0aWMgdm9pZCByeF9hY2tfcHJpbnQoY29uc3QgdV9jaGFyICosIGludCk7Ci0KLXN0YXRpYyBpbnQgaXNfdWJpayh1X2ludDMyX3QpOwotCi0vKgotICogSGFuZGxlIHRoZSByeC1sZXZlbCBwYWNrZXQuICBTZWUgaWYgd2Uga25vdyB3aGF0IHBvcnQgaXQncyBnb2luZyB0byBzbwotICogd2UgY2FuIHBlZWsgYXQgdGhlIGFmcyBjYWxsIGluc2lkZQotICovCi0KLXZvaWQKLXJ4X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgsIGludCBzcG9ydCwgaW50IGRwb3J0LAotCSB1X2NoYXIgKmJwMikKLXsKLQlyZWdpc3RlciBzdHJ1Y3QgcnhfaGVhZGVyICpyeGg7Ci0JaW50IGk7Ci0JaW50MzJfdCBvcGNvZGU7Ci0KLQlpZiAoc25hcGVuZCAtIGJwIDwgKGludClzaXplb2YgKHN0cnVjdCByeF9oZWFkZXIpKSB7Ci0JCXByaW50ZigiIFt8cnhdICglZCkiLCBsZW5ndGgpOwotCQlyZXR1cm47Ci0JfQotCi0JcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7Ci0KLQlwcmludGYoIiByeCAlcyIsIHRvazJzdHIocnhfdHlwZXMsICJ0eXBlICVkIiwgcnhoLT50eXBlKSk7Ci0KLQlpZiAodmZsYWcpIHsKLQkJaW50IGZpcnN0ZmxhZyA9IDA7Ci0KLQkJaWYgKHZmbGFnID4gMSkKLQkJCXByaW50ZigiIGNpZCAlMDh4IGNhbGwjICVkIiwKLQkJCSAgICAgICAoaW50KSBFWFRSQUNUXzMyQklUUygmcnhoLT5jaWQpLAotCQkJICAgICAgIChpbnQpIEVYVFJBQ1RfMzJCSVRTKCZyeGgtPmNhbGxOdW1iZXIpKTsKLQotCQlwcmludGYoIiBzZXEgJWQgc2VyICVkIiwKLQkJICAgICAgIChpbnQpIEVYVFJBQ1RfMzJCSVRTKCZyeGgtPnNlcSksCi0JCSAgICAgICAoaW50KSBFWFRSQUNUXzMyQklUUygmcnhoLT5zZXJpYWwpKTsKLQotCQlpZiAodmZsYWcgPiAyKQotCQkJcHJpbnRmKCIgc2VjaW5kZXggJWQgc2VydmljZWlkICVodSIsCi0JCQkJKGludCkgcnhoLT5zZWN1cml0eUluZGV4LAotCQkJCUVYVFJBQ1RfMTZCSVRTKCZyeGgtPnNlcnZpY2VJZCkpOwotCi0JCWlmICh2ZmxhZyA+IDEpCi0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0ZMQUdTOyBpKyspIHsKLQkJCQlpZiAocnhoLT5mbGFncyAmIHJ4X2ZsYWdzW2ldLmZsYWcgJiYKLQkJCQkgICAgKCFyeF9mbGFnc1tpXS5wYWNrZXRUeXBlIHx8Ci0JCQkJICAgICByeGgtPnR5cGUgPT0gcnhfZmxhZ3NbaV0ucGFja2V0VHlwZSkpIHsKLQkJCQkJaWYgKCFmaXJzdGZsYWcpIHsKLQkJCQkJCWZpcnN0ZmxhZyA9IDE7Ci0JCQkJCQlwcmludGYoIiAiKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByaW50ZigiLCIpOwotCQkJCQl9Ci0JCQkJCXByaW50ZigiPCVzPiIsIHJ4X2ZsYWdzW2ldLnMpOwotCQkJCX0KLQkJCX0KLQl9Ci0KLQkvKgotCSAqIFRyeSB0byBoYW5kbGUgQUZTIGNhbGxzIHRoYXQgd2Uga25vdyBhYm91dC4gIENoZWNrIHRoZSBkZXN0aW5hdGlvbgotCSAqIHBvcnQgYW5kIG1ha2Ugc3VyZSBpdCdzIGEgZGF0YSBwYWNrZXQuICBBbHNvLCBtYWtlIHN1cmUgdGhlCi0JICogc2VxIG51bWJlciBpcyAxIChiZWNhdXNlIG90aGVyd2lzZSBpdCdzIGEgY29udGludWF0aW9uIHBhY2tldCwKLQkgKiBhbmQgd2UgY2FuJ3QgaW50ZXJwcmV0IHRoYXQpLiAgQWxzbywgc2VlbXMgdGhhdCByZXBseSBwYWNrZXRzCi0JICogZG8gbm90IGhhdmUgdGhlIGNsaWVudC1pbml0IGZsYWcgc2V0LCBzbyB3ZSBjaGVjayBmb3IgdGhhdAotCSAqIGFzIHdlbGwuCi0JICovCi0KLQlpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkgICAgRVhUUkFDVF8zMkJJVFMoJnJ4aC0+c2VxKSA9PSAxICYmCi0JICAgIHJ4aC0+ZmxhZ3MgJiBSWF9DTElFTlRfSU5JVElBVEVEKSB7Ci0KLQkJLyoKLQkJICogSW5zZXJ0IHRoaXMgY2FsbCBpbnRvIHRoZSBjYWxsIGNhY2hlIHRhYmxlLCBzbyB3ZQotCQkgKiBoYXZlIGEgY2hhbmNlIHRvIHByaW50IG91dCByZXBsaWVzCi0JCSAqLwotCi0JCXJ4X2NhY2hlX2luc2VydChicCwgKGNvbnN0IHN0cnVjdCBpcCAqKSBicDIsIGRwb3J0KTsKLQotCQlzd2l0Y2ggKGRwb3J0KSB7Ci0JCQljYXNlIEZTX1JYX1BPUlQ6CS8qIEFGUyBmaWxlIHNlcnZpY2UgKi8KLQkJCQlmc19wcmludChicCwgbGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0JfUlhfUE9SVDoJLyogQUZTIGNhbGxiYWNrIHNlcnZpY2UgKi8KLQkJCQljYl9wcmludChicCwgbGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUFJPVF9SWF9QT1JUOgkvKiBBRlMgcHJvdGVjdGlvbiBzZXJ2aWNlICovCi0JCQkJcHJvdF9wcmludChicCwgbGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVkxEQl9SWF9QT1JUOgkvKiBBRlMgVkxEQiBzZXJ2aWNlICovCi0JCQkJdmxkYl9wcmludChicCwgbGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgS0FVVEhfUlhfUE9SVDoJLyogQUZTIEtlcmJlcm9zIGF1dGggc2VydmljZSAqLwotCQkJCWthdXRoX3ByaW50KGJwLCBsZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBWT0xfUlhfUE9SVDoJLyogQUZTIFZvbHVtZSBzZXJ2aWNlICovCi0JCQkJdm9sX3ByaW50KGJwLCBsZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCT1NfUlhfUE9SVDoJLyogQUZTIEJPUyBzZXJ2aWNlICovCi0JCQkJYm9zX3ByaW50KGJwLCBsZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQk7Ci0JCX0KLQotCS8qCi0JICogSWYgaXQncyBhIHJlcGx5IChjbGllbnQtaW5pdCBpcyBfbm90XyBzZXQsIGJ1dCBzZXEgaXMgb25lKQotCSAqIHRoZW4gbG9vayBpdCB1cCBpbiB0aGUgY2FjaGUuICBJZiB3ZSBmaW5kIGl0LCBjYWxsIHRoZSByZXBseQotCSAqIHByaW50aW5nIGZ1bmN0aW9ucyAgTm90ZSB0aGF0IHdlIGhhbmRsZSBhYm9ydCBwYWNrZXRzIGhlcmUsCi0JICogYmVjYXVzZSBwcmludGluZyBvdXQgdGhlIHJldHVybiBjb2RlIGNhbiBiZSB1c2VmdWwgYXQgdGltZXMuCi0JICovCi0KLQl9IGVsc2UgaWYgKCgocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEgJiYKLQkJCQkJRVhUUkFDVF8zMkJJVFMoJnJ4aC0+c2VxKSA9PSAxKSB8fAotCQkgICAgcnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0FCT1JUKSAmJgotCQkgICAocnhoLT5mbGFncyAmIFJYX0NMSUVOVF9JTklUSUFURUQpID09IDAgJiYKLQkJICAgcnhfY2FjaGVfZmluZChyeGgsIChjb25zdCBzdHJ1Y3QgaXAgKikgYnAyLAotCQkJCSBzcG9ydCwgJm9wY29kZSkpIHsKLQotCQlzd2l0Y2ggKHNwb3J0KSB7Ci0JCQljYXNlIEZTX1JYX1BPUlQ6CS8qIEFGUyBmaWxlIHNlcnZpY2UgKi8KLQkJCQlmc19yZXBseV9wcmludChicCwgbGVuZ3RoLCBvcGNvZGUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDQl9SWF9QT1JUOgkvKiBBRlMgY2FsbGJhY2sgc2VydmljZSAqLwotCQkJCWNiX3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFBST1RfUlhfUE9SVDoJLyogQUZTIFBUIHNlcnZpY2UgKi8KLQkJCQlwcm90X3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZMREJfUlhfUE9SVDoJLyogQUZTIFZMREIgc2VydmljZSAqLwotCQkJCXZsZGJfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgS0FVVEhfUlhfUE9SVDoJLyogQUZTIEtlcmJlcm9zIGF1dGggc2VydmljZSAqLwotCQkJCWthdXRoX3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFZPTF9SWF9QT1JUOgkvKiBBRlMgVm9sdW1lIHNlcnZpY2UgKi8KLQkJCQl2b2xfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQk9TX1JYX1BPUlQ6CS8qIEFGUyBCT1Mgc2VydmljZSAqLwotCQkJCWJvc19yZXBseV9wcmludChicCwgbGVuZ3RoLCBvcGNvZGUpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQk7Ci0JCX0KLQotCS8qCi0JICogSWYgaXQncyBhbiBSWCBhY2sgcGFja2V0LCB0aGVuIHVzZSB0aGUgYXBwcm9wcmlhdGUgYWNrIGRlY29kaW5nCi0JICogZnVuY3Rpb24gKHRoZXJlIGlzbid0IGFueSBzZXJ2aWNlLXNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZQotCSAqIGFjayBwYWNrZXQsIHNvIHdlIGNhbiB1c2Ugb25lIGZvciBhbGwgQUZTIHNlcnZpY2VzKQotCSAqLwotCi0JfSBlbHNlIGlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfQUNLKQotCQlyeF9hY2tfcHJpbnQoYnAsIGxlbmd0aCk7Ci0KLQotCXByaW50ZigiICglZCkiLCBsZW5ndGgpOwotfQotCi0vKgotICogSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGNhY2hlLiAgVGFrZW4gZnJvbSBwcmludC1uZnMuYwotICovCi0KLXN0YXRpYyB2b2lkCi1yeF9jYWNoZV9pbnNlcnQoY29uc3QgdV9jaGFyICpicCwgY29uc3Qgc3RydWN0IGlwICppcCwgaW50IGRwb3J0KQotewotCXN0cnVjdCByeF9jYWNoZV9lbnRyeSAqcnhlbnQ7Ci0JY29uc3Qgc3RydWN0IHJ4X2hlYWRlciAqcnhoID0gKGNvbnN0IHN0cnVjdCByeF9oZWFkZXIgKikgYnA7Ci0KLQlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSAoaW50KShzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyBzaXplb2YoaW50MzJfdCkpKQotCQlyZXR1cm47Ci0KLQlyeGVudCA9ICZyeF9jYWNoZVtyeF9jYWNoZV9uZXh0XTsKLQotCWlmICgrK3J4X2NhY2hlX25leHQgPj0gUlhfQ0FDSEVfU0laRSkKLQkJcnhfY2FjaGVfbmV4dCA9IDA7Ci0KLQlyeGVudC0+Y2FsbG51bSA9IHJ4aC0+Y2FsbE51bWJlcjsKLQlyeGVudC0+Y2xpZW50ID0gaXAtPmlwX3NyYzsKLQlyeGVudC0+c2VydmVyID0gaXAtPmlwX2RzdDsKLQlyeGVudC0+ZHBvcnQgPSBkcG9ydDsKLQlyeGVudC0+c2VydmljZUlkID0gcnhoLT5zZXJ2aWNlSWQ7Ci0JcnhlbnQtPm9wY29kZSA9IEVYVFJBQ1RfMzJCSVRTKGJwICsgc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKTsKLX0KLQotLyoKLSAqIExvb2t1cCBhbiBlbnRyeSBpbiB0aGUgY2FjaGUuICBBbHNvIHRha2VuIGZyb20gcHJpbnQtbmZzLmMKLSAqCi0gKiBOb3RlIHRoYXQgYmVjYXVzZSB0aGlzIGlzIGEgcmVwbHksIHdlJ3JlIGxvb2tpbmcgYXQgdGhlIF9zb3VyY2VfCi0gKiBwb3J0LgotICovCi0KLXN0YXRpYyBpbnQKLXJ4X2NhY2hlX2ZpbmQoY29uc3Qgc3RydWN0IHJ4X2hlYWRlciAqcnhoLCBjb25zdCBzdHJ1Y3QgaXAgKmlwLCBpbnQgc3BvcnQsCi0JICAgICAgaW50MzJfdCAqb3Bjb2RlKQotewotCWludCBpOwotCXN0cnVjdCByeF9jYWNoZV9lbnRyeSAqcnhlbnQ7Ci0JdV9pbnQzMl90IGNsaXAgPSBpcC0+aXBfZHN0LnNfYWRkcjsKLQl1X2ludDMyX3Qgc2lwID0gaXAtPmlwX3NyYy5zX2FkZHI7Ci0KLQkvKiBTdGFydCB0aGUgc2VhcmNoIHdoZXJlIHdlIGxhc3QgbGVmdCBvZmYgKi8KLQotCWkgPSByeF9jYWNoZV9oaW50OwotCWRvIHsKLQkJcnhlbnQgPSAmcnhfY2FjaGVbaV07Ci0JCWlmIChyeGVudC0+Y2FsbG51bSA9PSByeGgtPmNhbGxOdW1iZXIgJiYKLQkJICAgIHJ4ZW50LT5jbGllbnQuc19hZGRyID09IGNsaXAgJiYKLQkJICAgIHJ4ZW50LT5zZXJ2ZXIuc19hZGRyID09IHNpcCAmJgotCQkgICAgcnhlbnQtPnNlcnZpY2VJZCA9PSByeGgtPnNlcnZpY2VJZCAmJgotCQkgICAgcnhlbnQtPmRwb3J0ID09IHNwb3J0KSB7Ci0KLQkJCS8qIFdlIGdvdCBhIG1hdGNoISAqLwotCi0JCQlyeF9jYWNoZV9oaW50ID0gaTsKLQkJCSpvcGNvZGUgPSByeGVudC0+b3Bjb2RlOwotCQkJcmV0dXJuKDEpOwotCQl9Ci0JCWlmICgrK2kgPiBSWF9DQUNIRV9TSVpFKQotCQkJaSA9IDA7Ci0JfSB3aGlsZSAoaSAhPSByeF9jYWNoZV9oaW50KTsKLQotCS8qIE91ciBzZWFyY2ggZmFpbGVkICovCi0JcmV0dXJuKDApOwotfQotCi0vKgotICogVGhlc2UgZXh0cmVtZW1seSBncm9keSBtYWNyb3MgaGFuZGxlIHRoZSBwcmludGluZyBvZiB2YXJpb3VzIEFGUyBzdHVmZi4KLSAqLwotCi0jZGVmaW5lIEZJRE9VVCgpIHsgdW5zaWduZWQgbG9uZyBuMSwgbjIsIG4zOyBcCi0JCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkgKiAzKTsgXAotCQkJbjEgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkJbjIgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkJbjMgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkJcHJpbnRmKCIgZmlkICVkLyVkLyVkIiwgKGludCkgbjEsIChpbnQpIG4yLCAoaW50KSBuMyk7IFwKLQkJfQotCi0jZGVmaW5lIFNUUk9VVChNQVgpIHsgdW5zaWduZWQgaW50IGk7IFwKLQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7IFwKLQkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCWlmIChpID4gKE1BWCkpIFwKLQkJCQlnb3RvIHRydW5jOyBcCi0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7IFwKLQkJCXByaW50ZigiIFwiIik7IFwKLQkJCWlmIChmbl9wcmludG4oYnAsIGksIHNuYXBlbmQpKSBcCi0JCQkJZ290byB0cnVuYzsgXAotCQkJcHJpbnRmKCJcIiIpOyBcCi0JCQlicCArPSAoKGkgKyBzaXplb2YoaW50MzJfdCkgLSAxKSAvIHNpemVvZihpbnQzMl90KSkgKiBzaXplb2YoaW50MzJfdCk7IFwKLQkJfQotCi0jZGVmaW5lIElOVE9VVCgpIHsgaW50IGk7IFwKLQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7IFwKLQkJCWkgPSAoaW50KSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkJcHJpbnRmKCIgJWQiLCBpKTsgXAotCQl9Ci0KLSNkZWZpbmUgVUlOVE9VVCgpIHsgdW5zaWduZWQgbG9uZyBpOyBcCi0JCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOyBcCi0JCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOyBcCi0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7IFwKLQkJCXByaW50ZigiICVsdSIsIGkpOyBcCi0JCX0KLQotI2RlZmluZSBEQVRFT1VUKCkgeyB0aW1lX3QgdDsgc3RydWN0IHRtICp0bTsgY2hhciBzdHJbMjU2XTsgXAotCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsgXAotCQkJdCA9ICh0aW1lX3QpIEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCi0JCQl0bSA9IGxvY2FsdGltZSgmdCk7IFwKLQkJCXN0cmZ0aW1lKHN0ciwgMjU2LCAiJVkvJW0vJWQgJVQiLCB0bSk7IFwKLQkJCXByaW50ZigiICVzIiwgc3RyKTsgXAotCQl9Ci0KLSNkZWZpbmUgU1RPUkVBVFRST1VUKCkgeyB1bnNpZ25lZCBsb25nIG1hc2ssIGk7IFwKLQkJCVRDSEVDSzIoYnBbMF0sIChzaXplb2YoaW50MzJfdCkqNikpOyBcCi0JCQltYXNrID0gRVhUUkFDVF8zMkJJVFMoYnApOyBicCArPSBzaXplb2YoaW50MzJfdCk7IFwKLQkJCWlmIChtYXNrKSBwcmludGYgKCIgU3RvcmVTdGF0dXMiKTsgXAotCQkgICAgICAgIGlmIChtYXNrICYgMSkgeyBwcmludGYoIiBkYXRlIik7IERBVEVPVVQoKTsgfSBcCi0JCQllbHNlIGJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCi0JCSAgICAgICAgaWYgKG1hc2sgJiAyKSBwcmludGYoIiBvd25lciAlbHUiLCBpKTsgIFwKLQkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7IGJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkgICAgICAgIGlmIChtYXNrICYgNCkgcHJpbnRmKCIgZ3JvdXAgJWx1IiwgaSk7IFwKLQkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7IGJwICs9IHNpemVvZihpbnQzMl90KTsgXAotCQkgICAgICAgIGlmIChtYXNrICYgOCkgcHJpbnRmKCIgbW9kZSAlbG8iLCBpICYgMDc3NzcpOyBcCi0JCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOyBicCArPSBzaXplb2YoaW50MzJfdCk7IFwKLQkJICAgICAgICBpZiAobWFzayAmIDE2KSBwcmludGYoIiBzZWdzaXplICVsdSIsIGkpOyBcCi0JCQkvKiB1bmRvY3VtZW50ZWQgaW4gMy4zIGRvY3UgKi8gXAotCQkgICAgICAgIGlmIChtYXNrICYgMTAyNCkgcHJpbnRmKCIgZnN5bmMiKTsgIFwKLQkJfQotCi0jZGVmaW5lIFVCSUtfVkVSU0lPTk9VVCgpIHtpbnQzMl90IGVwb2NoOyBpbnQzMl90IGNvdW50ZXI7IFwKLQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSAqIDIpOyBcCi0JCQllcG9jaCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOyBcCi0JCQljb3VudGVyID0gRVhUUkFDVF8zMkJJVFMoYnApOyBcCi0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7IFwKLQkJCXByaW50ZigiICVkLiVkIiwgZXBvY2gsIGNvdW50ZXIpOyBcCi0JCX0KLQotI2RlZmluZSBBRlNVVUlET1VUKCkge3VfaW50MzJfdCB0ZW1wOyBpbnQgaTsgXAotCQkJVENIRUNLMihicFswXSwgMTEqc2l6ZW9mKHVfaW50MzJfdCkpOyBcCi0JCQl0ZW1wID0gRVhUUkFDVF8zMkJJVFMoYnApOyBcCi0JCQlicCArPSBzaXplb2YodV9pbnQzMl90KTsgXAotCQkJcHJpbnRmKCIgJTA4eCIsIHRlbXApOyBcCi0JCQl0ZW1wID0gRVhUUkFDVF8zMkJJVFMoYnApOyBcCi0JCQlicCArPSBzaXplb2YodV9pbnQzMl90KTsgXAotCQkJcHJpbnRmKCIlMDR4IiwgdGVtcCk7IFwKLQkJCXRlbXAgPSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCWJwICs9IHNpemVvZih1X2ludDMyX3QpOyBcCi0JCQlwcmludGYoIiUwNHgiLCB0ZW1wKTsgXAotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeyBcCi0JCQkJdGVtcCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsgXAotCQkJCWJwICs9IHNpemVvZih1X2ludDMyX3QpOyBcCi0JCQkJcHJpbnRmKCIlMDJ4IiwgKHVuc2lnbmVkIGNoYXIpIHRlbXApOyBcCi0JCQl9IFwKLQkJfQotCi0vKgotICogVGhpcyBpcyB0aGUgc2lja2VzdCBvbmUgb2YgYWxsCi0gKi8KLQotI2RlZmluZSBWRUNPVVQoTUFYKSB7IHVfY2hhciAqc3A7IFwKLQkJCXVfY2hhciBzW0FGU05BTUVNQVhdOyBcCi0JCQlpbnQgazsgXAotCQkJaWYgKChNQVgpICsgMSA+IHNpemVvZihzKSkgXAotCQkJCWdvdG8gdHJ1bmM7IFwKLQkJCVRDSEVDSzIoYnBbMF0sIChNQVgpICogc2l6ZW9mKGludDMyX3QpKTsgXAotCQkJc3AgPSBzOyBcCi0JCQlmb3IgKGsgPSAwOyBrIDwgKE1BWCk7IGsrKykgeyBcCi0JCQkJKnNwKysgPSAodV9jaGFyKSBFWFRSQUNUXzMyQklUUyhicCk7IFwKLQkJCQlicCArPSBzaXplb2YoaW50MzJfdCk7IFwKLQkJCX0gXAotCQkJc1soTUFYKV0gPSAnXDAnOyBcCi0JCQlwcmludGYoIiBcIiIpOyBcCi0JCQlmbl9wcmludChzLCBOVUxMKTsgXAotCQkJcHJpbnRmKCJcIiIpOyBcCi0JCX0KLQotLyoKLSAqIEhhbmRsZSBjYWxscyB0byB0aGUgQUZTIGZpbGUgc2VydmljZSAoZnMpCi0gKi8KLQotc3RhdGljIHZvaWQKLWZzX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCi17Ci0JaW50IGZzX29wOwotCXVuc2lnbmVkIGxvbmcgaTsKLQotCWlmIChsZW5ndGggPD0gKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCi0JCXJldHVybjsKLQotCWlmIChzbmFwZW5kIC0gYnAgKyAxIDw9IChpbnQpKHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIHNpemVvZihpbnQzMl90KSkpIHsKLQkJZ290byB0cnVuYzsKLQl9Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcwotCSAqIGdsZWFuZWQgZnJvbSBmc2ludC9hZnNpbnQueGcKLQkgKi8KLQotCWZzX29wID0gRVhUUkFDVF8zMkJJVFMoYnAgKyBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpOwotCi0JcHJpbnRmKCIgZnMgY2FsbCAlcyIsIHRvazJzdHIoZnNfcmVxLCAib3AjJWQiLCBmc19vcCkpOwotCi0JLyoKLQkgKiBQcmludCBvdXQgYXJndW1lbnRzIHRvIHNvbWUgb2YgdGhlIEFGUyBjYWxscy4gIFRoaXMgc3R1ZmYgaXMKLQkgKiBhbGwgZnJvbSBhZnNpbnQueGcKLQkgKi8KLQotCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIDQ7Ci0KLQkvKgotCSAqIFNpZ2guICBUaGlzIGlzIGdyb3NzLiAgUml0Y2hpZSBmb3JnaXZlIG1lLgotCSAqLwotCi0Jc3dpdGNoIChmc19vcCkgewotCQljYXNlIDEzMDoJLyogRmV0Y2ggZGF0YSAqLwotCQkJRklET1VUKCk7Ci0JCQlwcmludGYoIiBvZmZzZXQiKTsKLQkJCVVJTlRPVVQoKTsKLQkJCXByaW50ZigiIGxlbmd0aCIpOwotCQkJVUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTMxOgkvKiBGZXRjaCBBQ0wgKi8KLQkJY2FzZSAxMzI6CS8qIEZldGNoIFN0YXR1cyAqLwotCQljYXNlIDE0MzoJLyogT2xkIHNldCBsb2NrICovCi0JCWNhc2UgMTQ0OgkvKiBPbGQgZXh0ZW5kIGxvY2sgKi8KLQkJY2FzZSAxNDU6CS8qIE9sZCByZWxlYXNlIGxvY2sgKi8KLQkJY2FzZSAxNTY6CS8qIFNldCBsb2NrICovCi0JCWNhc2UgMTU3OgkvKiBFeHRlbmQgbG9jayAqLwotCQljYXNlIDE1ODoJLyogUmVsZWFzZSBsb2NrICovCi0JCQlGSURPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDEzNToJLyogU3RvcmUgc3RhdHVzICovCi0JCQlGSURPVVQoKTsKLQkJCVNUT1JFQVRUUk9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTMzOgkvKiBTdG9yZSBkYXRhICovCi0JCQlGSURPVVQoKTsKLQkJCVNUT1JFQVRUUk9VVCgpOwotCQkJcHJpbnRmKCIgb2Zmc2V0Iik7Ci0JCQlVSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBsZW5ndGgiKTsKLQkJCVVJTlRPVVQoKTsKLQkJCXByaW50ZigiIGZsZW4iKTsKLQkJCVVJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDEzNDoJLyogU3RvcmUgQUNMICovCi0JCXsKLQkJCWNoYXIgYVtBRlNPUEFRVUVNQVgrMV07Ci0JCQlGSURPVVQoKTsKLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJaSA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCVRDSEVDSzIoYnBbMF0sIGkpOwotCQkJaSA9IG1pbihBRlNPUEFRVUVNQVgsIGkpOwotCQkJc3RybmNweShhLCAoY2hhciAqKSBicCwgaSk7Ci0JCQlhW2ldID0gJ1wwJzsKLQkJCWFjbF9wcmludCgodV9jaGFyICopIGEsIHNpemVvZihhKSwgKHVfY2hhciAqKSBhICsgaSk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDEzNzoJLyogQ3JlYXRlIGZpbGUgKi8KLQkJY2FzZSAxNDE6CS8qIE1ha2VEaXIgKi8KLQkJCUZJRE9VVCgpOwotCQkJU1RST1VUKEFGU05BTUVNQVgpOwotCQkJU1RPUkVBVFRST1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzY6CS8qIFJlbW92ZSBmaWxlICovCi0JCWNhc2UgMTQyOgkvKiBSZW1vdmUgZGlyZWN0b3J5ICovCi0JCQlGSURPVVQoKTsKLQkJCVNUUk9VVChBRlNOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIDEzODoJLyogUmVuYW1lIGZpbGUgKi8KLQkJCXByaW50ZigiIG9sZCIpOwotCQkJRklET1VUKCk7Ci0JCQlTVFJPVVQoQUZTTkFNRU1BWCk7Ci0JCQlwcmludGYoIiBuZXciKTsKLQkJCUZJRE9VVCgpOwotCQkJU1RST1VUKEFGU05BTUVNQVgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTM5OgkvKiBTeW1saW5rICovCi0JCQlGSURPVVQoKTsKLQkJCVNUUk9VVChBRlNOQU1FTUFYKTsKLQkJCXByaW50ZigiIGxpbmsgdG8iKTsKLQkJCVNUUk9VVChBRlNOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIDE0MDoJLyogTGluayAqLwotCQkJRklET1VUKCk7Ci0JCQlTVFJPVVQoQUZTTkFNRU1BWCk7Ci0JCQlwcmludGYoIiBsaW5rIHRvIik7Ci0JCQlGSURPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDE0ODoJLyogR2V0IHZvbHVtZSBpbmZvICovCi0JCQlTVFJPVVQoQUZTTkFNRU1BWCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNDk6CS8qIEdldCB2b2x1bWUgc3RhdHMgKi8KLQkJY2FzZSAxNTA6CS8qIFNldCB2b2x1bWUgc3RhdHMgKi8KLQkJCXByaW50ZigiIHZvbGlkIik7Ci0JCQlVSU5UT1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNTQ6CS8qIE5ldyBnZXQgdm9sdW1lIGluZm8gKi8KLQkJCXByaW50ZigiIHZvbG5hbWUiKTsKLQkJCVNUUk9VVChBRlNOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIDE1NToJLyogQnVsayBzdGF0ICovCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgajsKLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkJCUZJRE9VVCgpOwotCQkJCWlmIChpICE9IGogLSAxKQotCQkJCQlwcmludGYoIiwiKTsKLQkJCX0KLQkJCWlmIChqID09IDApCi0JCQkJcHJpbnRmKCIgPG5vbmUhPiIpOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCQk7Ci0JfQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfGZzXSIpOwotfQotCi0vKgotICogSGFuZGxlIHJlcGxpZXMgdG8gdGhlIEFGUyBmaWxlIHNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAotZnNfcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50MzJfdCBvcGNvZGUpCi17Ci0JdW5zaWduZWQgbG9uZyBpOwotCXN0cnVjdCByeF9oZWFkZXIgKnJ4aDsKLQotCWlmIChsZW5ndGggPD0gKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCi0JCXJldHVybjsKLQotCXJ4aCA9IChzdHJ1Y3QgcnhfaGVhZGVyICopIGJwOwotCi0JLyoKLQkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKLQkgKiBnbGVhbmVkIGZyb20gZnNpbnQvYWZzaW50LnhnCi0JICovCi0KLQlwcmludGYoIiBmcyByZXBseSAlcyIsIHRvazJzdHIoZnNfcmVxLCAib3AjJWQiLCBvcGNvZGUpKTsKLQotCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKTsKLQotCS8qCi0JICogSWYgaXQgd2FzIGEgZGF0YSBwYWNrZXQsIGludGVycHJldCB0aGUgcmVzcG9uc2UKLQkgKi8KLQotCWlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfREFUQSkgewotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIDEzMToJLyogRmV0Y2ggQUNMICovCi0JCXsKLQkJCWNoYXIgYVtBRlNPUEFRVUVNQVgrMV07Ci0JCQlUQ0hFQ0syKGJwWzBdLCA0KTsKLQkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0JCQlUQ0hFQ0syKGJwWzBdLCBpKTsKLQkJCWkgPSBtaW4oQUZTT1BBUVVFTUFYLCBpKTsKLQkJCXN0cm5jcHkoYSwgKGNoYXIgKikgYnAsIGkpOwotCQkJYVtpXSA9ICdcMCc7Ci0JCQlhY2xfcHJpbnQoKHVfY2hhciAqKSBhLCBzaXplb2YoYSksICh1X2NoYXIgKikgYSArIGkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSAxMzc6CS8qIENyZWF0ZSBmaWxlICovCi0JCWNhc2UgMTQxOgkvKiBNYWtlRGlyICovCi0JCQlwcmludGYoIiBuZXciKTsKLQkJCUZJRE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTUxOgkvKiBHZXQgcm9vdCB2b2x1bWUgKi8KLQkJCXByaW50ZigiIHJvb3Qgdm9sdW1lIik7Ci0JCQlTVFJPVVQoQUZTTkFNRU1BWCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNTM6CS8qIEdldCB0aW1lICovCi0JCQlEQVRFT1VUKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCTsKLQkJfQotCX0gZWxzZSBpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0FCT1JUKSB7Ci0JCWludCBpOwotCi0JCS8qCi0JCSAqIE90aGVyd2lzZSwganVzdCBwcmludCBvdXQgdGhlIHJldHVybiBjb2RlCi0JCSAqLwotCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOwotCQlpID0gKGludCkgRVhUUkFDVF8zMkJJVFMoYnApOwotCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0KLQkJcHJpbnRmKCIgZXJyb3IgJXMiLCB0b2syc3RyKGFmc19mc19lcnJvcnMsICIjJWQiLCBpKSk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRmKCIgc3RyYW5nZSBmcyByZXBseSBvZiB0eXBlICVkIiwgcnhoLT50eXBlKTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8ZnNdIik7Ci19Ci0KLS8qCi0gKiBQcmludCBvdXQgYW4gQUZTIEFDTCBzdHJpbmcuICBBbiBBRlMgQUNMIGlzIGEgc3RyaW5nIHRoYXQgaGFzIHRoZQotICogZm9sbG93aW5nIGZvcm1hdDoKLSAqCi0gKiA8cG9zaXRpdmU+IDxuZWdhdGl2ZT4KLSAqIDx1aWQxPiA8YWNsYml0czE+Ci0gKiAuLi4uCi0gKgotICogInBvc2l0aXZlIiBhbmQgIm5lZ2F0aXZlIiBhcmUgaW50ZWdlcnMgd2hpY2ggY29udGFpbiB0aGUgbnVtYmVyIG9mCi0gKiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgQUNMJ3MgaW4gdGhlIHN0cmluZy4gIFRoZSB1aWQvYWNsYml0cyBwYWlyIGFyZQotICogQVNDSUkgc3RyaW5ncyBjb250YWluaW5nIHRoZSBVSUQvUFRTIHJlY29yZCBhbmQgYW5kIGEgYXNjaWkgbnVtYmVyCi0gKiByZXByZXNlbnRpbmcgYSBsb2dpY2FsIE9SIG9mIGFsbCB0aGUgQUNMIHBlcm1pc3Npb24gYml0cwotICovCi0KLXN0YXRpYyB2b2lkCi1hY2xfcHJpbnQodV9jaGFyICpzLCBpbnQgbWF4c2l6ZSwgdV9jaGFyICplbmQpCi17Ci0JaW50IHBvcywgbmVnLCBhY2w7Ci0JaW50IG4sIGk7Ci0JY2hhciAqdXNlcjsKLQljaGFyIGZtdFsxMDI0XTsKLQotCWlmICgodXNlciA9IChjaGFyICopbWFsbG9jKG1heHNpemUpKSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlpZiAoc3NjYW5mKChjaGFyICopIHMsICIlZCAlZFxuJW4iLCAmcG9zLCAmbmVnLCAmbikgIT0gMikKLQkJZ290byBmaW5pc2g7Ci0KLQlzICs9IG47Ci0KLQlpZiAocyA+IGVuZCkKLQkJZ290byBmaW5pc2g7Ci0KLQkvKgotCSAqIFRoaXMgd2Fja3kgb3JkZXIgcHJlc2VydmVzIHRoZSBvcmRlciB1c2VkIGJ5IHRoZSAiZnMiIGNvbW1hbmQKLQkgKi8KLQotI2RlZmluZSBBQ0xPVVQoYWNsKSBcCi0JaWYgKGFjbCAmIFBSU0ZTX1JFQUQpIFwKLQkJcHJpbnRmKCJyIik7IFwKLQlpZiAoYWNsICYgUFJTRlNfTE9PS1VQKSBcCi0JCXByaW50ZigibCIpOyBcCi0JaWYgKGFjbCAmIFBSU0ZTX0lOU0VSVCkgXAotCQlwcmludGYoImkiKTsgXAotCWlmIChhY2wgJiBQUlNGU19ERUxFVEUpIFwKLQkJcHJpbnRmKCJkIik7IFwKLQlpZiAoYWNsICYgUFJTRlNfV1JJVEUpIFwKLQkJcHJpbnRmKCJ3Iik7IFwKLQlpZiAoYWNsICYgUFJTRlNfTE9DSykgXAotCQlwcmludGYoImsiKTsgXAotCWlmIChhY2wgJiBQUlNGU19BRE1JTklTVEVSKSBcCi0JCXByaW50ZigiYSIpOwotCi0JZm9yIChpID0gMDsgaSA8IHBvczsgaSsrKSB7Ci0JCXNucHJpbnRmKGZtdCwgc2l6ZW9mKGZtdCksICIlJSVkcyAlJWRcbiUlbiIsIG1heHNpemUgLSAxKTsKLQkJaWYgKHNzY2FuZigoY2hhciAqKSBzLCBmbXQsIHVzZXIsICZhY2wsICZuKSAhPSAyKQotCQkJZ290byBmaW5pc2g7Ci0JCXMgKz0gbjsKLQkJcHJpbnRmKCIgK3siKTsKLQkJZm5fcHJpbnQoKHVfY2hhciAqKXVzZXIsIE5VTEwpOwotCQlwcmludGYoIiAiKTsKLQkJQUNMT1VUKGFjbCk7Ci0JCXByaW50ZigifSIpOwotCQlpZiAocyA+IGVuZCkKLQkJCWdvdG8gZmluaXNoOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBuZWc7IGkrKykgewotCQlzbnByaW50ZihmbXQsIHNpemVvZihmbXQpLCAiJSUlZHMgJSVkXG4lJW4iLCBtYXhzaXplIC0gMSk7Ci0JCWlmIChzc2NhbmYoKGNoYXIgKikgcywgZm10LCB1c2VyLCAmYWNsLCAmbikgIT0gMikKLQkJCWdvdG8gZmluaXNoOwotCQlzICs9IG47Ci0JCXByaW50ZigiIC17Iik7Ci0JCWZuX3ByaW50KCh1X2NoYXIgKil1c2VyLCBOVUxMKTsKLQkJcHJpbnRmKCIgIik7Ci0JCUFDTE9VVChhY2wpOwotCQlwcmludGYoIn0iKTsKLQkJaWYgKHMgPiBlbmQpCi0JCQlnb3RvIGZpbmlzaDsKLQl9Ci0KLWZpbmlzaDoKLQlmcmVlKHVzZXIpOwotCXJldHVybjsKLX0KLQotI3VuZGVmIEFDTE9VVAotCi0vKgotICogSGFuZGxlIGNhbGxzIHRvIHRoZSBBRlMgY2FsbGJhY2sgc2VydmljZQotICovCi0KLXN0YXRpYyB2b2lkCi1jYl9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoKQotewotCWludCBjYl9vcDsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlpZiAobGVuZ3RoIDw9IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQotCQlyZXR1cm47Ci0KLQlpZiAoc25hcGVuZCAtIGJwICsgMSA8PSAoaW50KShzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyBzaXplb2YoaW50MzJfdCkpKSB7Ci0JCWdvdG8gdHJ1bmM7Ci0JfQotCi0JLyoKLQkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKLQkgKiBnbGVhbmVkIGZyb20gZnNpbnQvYWZzY2JpbnQueGcKLQkgKi8KLQotCWNiX29wID0gRVhUUkFDVF8zMkJJVFMoYnAgKyBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpOwotCi0JcHJpbnRmKCIgY2IgY2FsbCAlcyIsIHRvazJzdHIoY2JfcmVxLCAib3AjJWQiLCBjYl9vcCkpOwotCi0JYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgNDsKLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIGZzaW50L2Fmc2NiaW50LnhnCi0JICovCi0KLQlzd2l0Y2ggKGNiX29wKSB7Ci0JCWNhc2UgMjA0OgkJLyogQ2FsbGJhY2sgKi8KLQkJewotCQkJdW5zaWduZWQgbG9uZyBqLCB0OwotCQkJVENIRUNLMihicFswXSwgNCk7Ci0JCQlqID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQkJRklET1VUKCk7Ci0JCQkJaWYgKGkgIT0gaiAtIDEpCi0JCQkJCXByaW50ZigiLCIpOwotCQkJfQotCi0JCQlpZiAoaiA9PSAwKQotCQkJCXByaW50ZigiIDxub25lIT4iKTsKLQotCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQotCQkJaWYgKGogIT0gMCkKLQkJCQlwcmludGYoIjsiKTsKLQotCQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkJCXByaW50ZigiIHZlciIpOwotCQkJCUlOVE9VVCgpOwotCQkJCXByaW50ZigiIGV4cGlyZXMiKTsKLQkJCQlEQVRFT1VUKCk7Ci0JCQkJVENIRUNLMihicFswXSwgNCk7Ci0JCQkJdCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0JCQkJdG9rMnN0cihjYl90eXBlcywgInR5cGUgJWQiLCB0KTsKLQkJCX0KLQkJfQotCQljYXNlIDIxNDogewotCQkJcHJpbnRmKCIgYWZzdXVpZCIpOwotCQkJQUZTVVVJRE9VVCgpOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8Y2JdIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgcmVwbGllcyB0byB0aGUgQUZTIENhbGxiYWNrIFNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAotY2JfcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50MzJfdCBvcGNvZGUpCi17Ci0Jc3RydWN0IHJ4X2hlYWRlciAqcnhoOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcwotCSAqIGdsZWFuZWQgZnJvbSBmc2ludC9hZnNjYmludC54ZwotCSAqLwotCi0JcHJpbnRmKCIgY2IgcmVwbHkgJXMiLCB0b2syc3RyKGNiX3JlcSwgIm9wIyVkIiwgb3Bjb2RlKSk7Ci0KLQlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7Ci0KLQkvKgotCSAqIElmIGl0IHdhcyBhIGRhdGEgcGFja2V0LCBpbnRlcnByZXQgdGhlIHJlc3BvbnNlLgotCSAqLwotCi0JaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIDIxMzoJLyogSW5pdENhbGxCYWNrU3RhdGUzICovCi0JCQlBRlNVVUlET1VUKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJOwotCQl9Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSwganVzdCBwcmludCBvdXQgdGhlIHJldHVybiBjb2RlCi0JCSAqLwotCQlwcmludGYoIiBlcnJjb2RlIik7Ci0JCUlOVE9VVCgpOwotCX0KLQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCIgW3xjYl0iKTsKLX0KLQotLyoKLSAqIEhhbmRsZSBjYWxscyB0byB0aGUgQUZTIHByb3RlY3Rpb24gZGF0YWJhc2Ugc2VydmVyCi0gKi8KLQotc3RhdGljIHZvaWQKLXByb3RfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKLXsKLQl1bnNpZ25lZCBsb25nIGk7Ci0JaW50IHB0X29wOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gKGludCkoc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgc2l6ZW9mKGludDMyX3QpKSkgewotCQlnb3RvIHRydW5jOwotCX0KLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIHB0c2VydmVyL3B0aW50LnhnCi0JICovCi0KLQlwdF9vcCA9IEVYVFJBQ1RfMzJCSVRTKGJwICsgc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKTsKLQotCXByaW50ZigiIHB0Iik7Ci0KLQlpZiAoaXNfdWJpayhwdF9vcCkpIHsKLQkJdWJpa19wcmludChicCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcmludGYoIiBjYWxsICVzIiwgdG9rMnN0cihwdF9yZXEsICJvcCMlZCIsIHB0X29wKSk7Ci0KLQkvKgotCSAqIERlY29kZSBzb21lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIFBUIGNhbGxzCi0JICovCi0KLQlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyA0OwotCi0Jc3dpdGNoIChwdF9vcCkgewotCQljYXNlIDUwMDoJLyogSSBOZXcgVXNlciAqLwotCQkJU1RST1VUKFBSTkFNRU1BWCk7Ci0JCQlwcmludGYoIiBpZCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBvbGRpZCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSA1MDE6CS8qIFdoZXJlIGlzIGl0ICovCi0JCWNhc2UgNTA2OgkvKiBEZWxldGUgKi8KLQkJY2FzZSA1MDg6CS8qIEdldCBDUFMgKi8KLQkJY2FzZSA1MTI6CS8qIExpc3QgZW50cnkgKi8KLQkJY2FzZSA1MTQ6CS8qIExpc3QgZWxlbWVudHMgKi8KLQkJY2FzZSA1MTc6CS8qIExpc3Qgb3duZWQgKi8KLQkJY2FzZSA1MTg6CS8qIEdldCBDUFMyICovCi0JCWNhc2UgNTE5OgkvKiBHZXQgaG9zdCBDUFMgKi8KLQkJCXByaW50ZigiIGlkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDUwMjoJLyogRHVtcCBlbnRyeSAqLwotCQkJcHJpbnRmKCIgcG9zIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDUwMzoJLyogQWRkIHRvIGdyb3VwICovCi0JCWNhc2UgNTA3OgkvKiBSZW1vdmUgZnJvbSBncm91cCAqLwotCQljYXNlIDUxNToJLyogSXMgYSBtZW1iZXIgb2Y/ICovCi0JCQlwcmludGYoIiB1aWQiKTsKLQkJCUlOVE9VVCgpOwotCQkJcHJpbnRmKCIgZ2lkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDUwNDoJLyogTmFtZSB0byBJRCAqLwotCQl7Ci0JCQl1bnNpZ25lZCBsb25nIGo7Ci0JCQlUQ0hFQ0syKGJwWzBdLCA0KTsKLQkJCWogPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0KLQkJCS8qCi0JCQkgKiBXaG8gZGVzaWduZWQgdGhpcyBjaGlja2VuLXNoaXQgcHJvdG9jb2w/Ci0JCQkgKgotCQkJICogRWFjaCBjaGFyYWN0ZXIgaXMgc3RvcmVkIGFzIGEgMzItYml0Ci0JCQkgKiBpbnRlZ2VyIQotCQkJICovCi0KLQkJCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCQlWRUNPVVQoUFJOQU1FTUFYKTsKLQkJCX0KLQkJCWlmIChqID09IDApCi0JCQkJcHJpbnRmKCIgPG5vbmUhPiIpOwotCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA1MDU6CS8qIElkIHRvIG5hbWUgKi8KLQkJewotCQkJdW5zaWduZWQgbG9uZyBqOwotCQkJcHJpbnRmKCIgaWRzOiIpOwotCQkJVENIRUNLMihicFswXSwgNCk7Ci0JCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQlJTlRPVVQoKTsKLQkJCWlmIChqID09IDApCi0JCQkJcHJpbnRmKCIgPG5vbmUhPiIpOwotCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA1MDk6CS8qIE5ldyBlbnRyeSAqLwotCQkJU1RST1VUKFBSTkFNRU1BWCk7Ci0JCQlwcmludGYoIiBmbGFnIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIG9pZCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSA1MTE6CS8qIFNldCBtYXggKi8KLQkJCXByaW50ZigiIGlkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIGdmbGFnIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDUxMzoJLyogQ2hhbmdlIGVudHJ5ICovCi0JCQlwcmludGYoIiBpZCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlTVFJPVVQoUFJOQU1FTUFYKTsKLQkJCXByaW50ZigiIG9sZGlkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIG5ld2lkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDUyMDoJLyogVXBkYXRlIGVudHJ5ICovCi0JCQlwcmludGYoIiBpZCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlTVFJPVVQoUFJOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJOwotCX0KLQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfHB0XSIpOwotfQotCi0vKgotICogSGFuZGxlIHJlcGxpZXMgdG8gdGhlIEFGUyBwcm90ZWN0aW9uIHNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAotcHJvdF9yZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoLCBpbnQzMl90IG9wY29kZSkKLXsKLQlzdHJ1Y3QgcnhfaGVhZGVyICpyeGg7Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0JaWYgKGxlbmd0aCA8IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQotCQlyZXR1cm47Ci0KLQlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIHB0c2VydmVyL3B0aW50LnhnLiAgQ2hlY2sgdG8gc2VlIGlmIGl0J3MgYQotCSAqIFViaWsgY2FsbCwgaG93ZXZlci4KLQkgKi8KLQotCXByaW50ZigiIHB0Iik7Ci0KLQlpZiAoaXNfdWJpayhvcGNvZGUpKSB7Ci0JCXViaWtfcmVwbHlfcHJpbnQoYnAsIGxlbmd0aCwgb3Bjb2RlKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaW50ZigiIHJlcGx5ICVzIiwgdG9rMnN0cihwdF9yZXEsICJvcCMlZCIsIG9wY29kZSkpOwotCi0JYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpOwotCi0JLyoKLQkgKiBJZiBpdCB3YXMgYSBkYXRhIHBhY2tldCwgaW50ZXJwcmV0IHRoZSByZXNwb25zZQotCSAqLwotCi0JaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIDUwNDoJCS8qIE5hbWUgdG8gSUQgKi8KLQkJewotCQkJdW5zaWduZWQgbG9uZyBqOwotCQkJcHJpbnRmKCIgaWRzOiIpOwotCQkJVENIRUNLMihicFswXSwgNCk7Ci0JCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQlJTlRPVVQoKTsKLQkJCWlmIChqID09IDApCi0JCQkJcHJpbnRmKCIgPG5vbmUhPiIpOwotCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA1MDU6CQkvKiBJRCB0byBuYW1lICovCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgajsKLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQotCQkJLyoKLQkJCSAqIFdobyBkZXNpZ25lZCB0aGlzIGNoaWNrZW4tc2hpdCBwcm90b2NvbD8KLQkJCSAqCi0JCQkgKiBFYWNoIGNoYXJhY3RlciBpcyBzdG9yZWQgYXMgYSAzMi1iaXQKLQkJCSAqIGludGVnZXIhCi0JCQkgKi8KLQotCQkJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgewotCQkJCVZFQ09VVChQUk5BTUVNQVgpOwotCQkJfQotCQkJaWYgKGogPT0gMCkKLQkJCQlwcmludGYoIiA8bm9uZSE+Iik7Ci0JCX0KLQkJCWJyZWFrOwotCQljYXNlIDUwODoJCS8qIEdldCBDUFMgKi8KLQkJY2FzZSA1MTQ6CQkvKiBMaXN0IGVsZW1lbnRzICovCi0JCWNhc2UgNTE3OgkJLyogTGlzdCBvd25lZCAqLwotCQljYXNlIDUxODoJCS8qIEdldCBDUFMyICovCi0JCWNhc2UgNTE5OgkJLyogR2V0IGhvc3QgQ1BTICovCi0JCXsKLQkJCXVuc2lnbmVkIGxvbmcgajsKLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCQlJTlRPVVQoKTsKLQkJCX0KLQkJCWlmIChqID09IDApCi0JCQkJcHJpbnRmKCIgPG5vbmUhPiIpOwotCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA1MTA6CQkvKiBMaXN0IG1heCAqLwotCQkJcHJpbnRmKCIgbWF4dWlkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIG1heGdpZCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCTsKLQkJfQotCWVsc2UgewotCQkvKgotCQkgKiBPdGhlcndpc2UsIGp1c3QgcHJpbnQgb3V0IHRoZSByZXR1cm4gY29kZQotCQkgKi8KLQkJcHJpbnRmKCIgZXJyY29kZSIpOwotCQlJTlRPVVQoKTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8cHRdIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgY2FsbHMgdG8gdGhlIEFGUyB2b2x1bWUgbG9jYXRpb24gZGF0YWJhc2Ugc2VydmljZQotICovCi0KLXN0YXRpYyB2b2lkCi12bGRiX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCi17Ci0JaW50IHZsZGJfb3A7Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gKGludCkoc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgc2l6ZW9mKGludDMyX3QpKSkgewotCQlnb3RvIHRydW5jOwotCX0KLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIHZsc2VydmVyL3ZsZGJpbnQueGcKLQkgKi8KLQotCXZsZGJfb3AgPSBFWFRSQUNUXzMyQklUUyhicCArIHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSk7Ci0KLQlwcmludGYoIiB2bGRiIik7Ci0KLQlpZiAoaXNfdWJpayh2bGRiX29wKSkgewotCQl1YmlrX3ByaW50KGJwKTsKLQkJcmV0dXJuOwotCX0KLQlwcmludGYoIiBjYWxsICVzIiwgdG9rMnN0cih2bGRiX3JlcSwgIm9wIyVkIiwgdmxkYl9vcCkpOwotCi0JLyoKLQkgKiBEZWNvZGUgc29tZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBWTERCIGNhbGxzCi0JICovCi0KLQlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyA0OwotCi0Jc3dpdGNoICh2bGRiX29wKSB7Ci0JCWNhc2UgNTAxOgkvKiBDcmVhdGUgbmV3IHZvbHVtZSAqLwotCQljYXNlIDUxNzoJLyogQ3JlYXRlIGVudHJ5IE4gKi8KLQkJCVZFQ09VVChWTE5BTUVNQVgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTAyOgkvKiBEZWxldGUgZW50cnkgKi8KLQkJY2FzZSA1MDM6CS8qIEdldCBlbnRyeSBieSBJRCAqLwotCQljYXNlIDUwNzoJLyogVXBkYXRlIGVudHJ5ICovCi0JCWNhc2UgNTA4OgkvKiBTZXQgbG9jayAqLwotCQljYXNlIDUwOToJLyogUmVsZWFzZSBsb2NrICovCi0JCWNhc2UgNTE4OgkvKiBHZXQgZW50cnkgYnkgSUQgTiAqLwotCQkJcHJpbnRmKCIgdm9saWQiKTsKLQkJCUlOVE9VVCgpOwotCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKLQkJCWkgPSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0JCQlpZiAoaSA8PSAyKQotCQkJCXByaW50ZigiIHR5cGUgJXMiLCB2b2x0eXBlW2ldKTsKLQkJCWJyZWFrOwotCQljYXNlIDUwNDoJLyogR2V0IGVudHJ5IGJ5IG5hbWUgKi8KLQkJY2FzZSA1MTk6CS8qIEdldCBlbnRyeSBieSBuYW1lIE4gKi8KLQkJY2FzZSA1MjQ6CS8qIFVwZGF0ZSBlbnRyeSBieSBuYW1lICovCi0JCWNhc2UgNTI3OgkvKiBHZXQgZW50cnkgYnkgbmFtZSBVICovCi0JCQlTVFJPVVQoVkxOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIDUwNToJLyogR2V0IG5ldyB2b2wgaWQgKi8KLQkJCXByaW50ZigiIGJ1bXAiKTsKLQkJCUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTA2OgkvKiBSZXBsYWNlIGVudHJ5ICovCi0JCWNhc2UgNTIwOgkvKiBSZXBsYWNlIGVudHJ5IE4gKi8KLQkJCXByaW50ZigiIHZvbGlkIik7Ci0JCQlJTlRPVVQoKTsKLQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQlpID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJaWYgKGkgPD0gMikKLQkJCQlwcmludGYoIiB0eXBlICVzIiwgdm9sdHlwZVtpXSk7Ci0JCQlWRUNPVVQoVkxOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIDUxMDoJLyogTGlzdCBlbnRyeSAqLwotCQljYXNlIDUyMToJLyogTGlzdCBlbnRyeSBOICovCi0JCQlwcmludGYoIiBpbmRleCIpOwotCQkJSU5UT1VUKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8dmxkYl0iKTsKLX0KLQotLyoKLSAqIEhhbmRsZSByZXBsaWVzIHRvIHRoZSBBRlMgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIHNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAotdmxkYl9yZXBseV9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoLCBpbnQzMl90IG9wY29kZSkKLXsKLQlzdHJ1Y3QgcnhfaGVhZGVyICpyeGg7Ci0JdW5zaWduZWQgbG9uZyBpOwotCi0JaWYgKGxlbmd0aCA8IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQotCQlyZXR1cm47Ci0KLQlyeGggPSAoc3RydWN0IHJ4X2hlYWRlciAqKSBicDsKLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIHZsc2VydmVyL3ZsZGJpbnQueGcuICBDaGVjayB0byBzZWUgaWYgaXQncyBhCi0JICogVWJpayBjYWxsLCBob3dldmVyLgotCSAqLwotCi0JcHJpbnRmKCIgdmxkYiIpOwotCi0JaWYgKGlzX3ViaWsob3Bjb2RlKSkgewotCQl1YmlrX3JlcGx5X3ByaW50KGJwLCBsZW5ndGgsIG9wY29kZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcmludGYoIiByZXBseSAlcyIsIHRvazJzdHIodmxkYl9yZXEsICJvcCMlZCIsIG9wY29kZSkpOwotCi0JYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpOwotCi0JLyoKLQkgKiBJZiBpdCB3YXMgYSBkYXRhIHBhY2tldCwgaW50ZXJwcmV0IHRoZSByZXNwb25zZQotCSAqLwotCi0JaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIDUxMDoJLyogTGlzdCBlbnRyeSAqLwotCQkJcHJpbnRmKCIgY291bnQiKTsKLQkJCUlOVE9VVCgpOwotCQkJcHJpbnRmKCIgbmV4dGluZGV4Iik7Ci0JCQlJTlRPVVQoKTsKLQkJY2FzZSA1MDM6CS8qIEdldCBlbnRyeSBieSBpZCAqLwotCQljYXNlIDUwNDoJLyogR2V0IGVudHJ5IGJ5IG5hbWUgKi8KLQkJewl1bnNpZ25lZCBsb25nIG5zZXJ2ZXJzLCBqOwotCQkJVkVDT1VUKFZMTkFNRU1BWCk7Ci0JCQlUQ0hFQ0syKGJwWzBdLCBzaXplb2YoaW50MzJfdCkpOwotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJcHJpbnRmKCIgbnVtc2VydmVycyIpOwotCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKLQkJCW5zZXJ2ZXJzID0gRVhUUkFDVF8zMkJJVFMoYnApOwotCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJcHJpbnRmKCIgJWx1IiwgbnNlcnZlcnMpOwotCQkJcHJpbnRmKCIgc2VydmVycyIpOwotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQkJaWYgKGkgPCBuc2VydmVycykKLQkJCQkJcHJpbnRmKCIgJXMiLAotCQkJCQkgICBpbnRvYSgoKHN0cnVjdCBpbl9hZGRyICopIGJwKS0+c19hZGRyKSk7Ci0JCQkJYnAgKz0gc2l6ZW9mKGludDMyX3QpOwotCQkJfQotCQkJcHJpbnRmKCIgcGFydGl0aW9ucyIpOwotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCQlpZiAoaSA8IG5zZXJ2ZXJzICYmIGogPD0gMjYpCi0JCQkJCXByaW50ZigiICVjIiwgJ2EnICsgKGludClqKTsKLQkJCQllbHNlIGlmIChpIDwgbnNlcnZlcnMpCi0JCQkJCXByaW50ZigiICVsdSIsIGopOwotCQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCX0KLQkJCVRDSEVDSzIoYnBbMF0sIDggKiBzaXplb2YoaW50MzJfdCkpOwotCQkJYnAgKz0gOCAqIHNpemVvZihpbnQzMl90KTsKLQkJCXByaW50ZigiIHJ3dm9sIik7Ci0JCQlVSU5UT1VUKCk7Ci0JCQlwcmludGYoIiByb3ZvbCIpOwotCQkJVUlOVE9VVCgpOwotCQkJcHJpbnRmKCIgYmFja3VwIik7Ci0JCQlVSU5UT1VUKCk7Ci0JCX0KLQkJCWJyZWFrOwotCQljYXNlIDUwNToJLyogR2V0IG5ldyB2b2x1bWUgSUQgKi8KLQkJCXByaW50ZigiIG5ld3ZvbCIpOwotCQkJVUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNTIxOgkvKiBMaXN0IGVudHJ5ICovCi0JCWNhc2UgNTI5OgkvKiBMaXN0IGVudHJ5IFUgKi8KLQkJCXByaW50ZigiIGNvdW50Iik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIG5leHRpbmRleCIpOwotCQkJSU5UT1VUKCk7Ci0JCWNhc2UgNTE4OgkvKiBHZXQgZW50cnkgYnkgSUQgTiAqLwotCQljYXNlIDUxOToJLyogR2V0IGVudHJ5IGJ5IG5hbWUgTiAqLwotCQl7CXVuc2lnbmVkIGxvbmcgbnNlcnZlcnMsIGo7Ci0JCQlWRUNPVVQoVkxOQU1FTUFYKTsKLQkJCXByaW50ZigiIG51bXNlcnZlcnMiKTsKLQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQluc2VydmVycyA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCXByaW50ZigiICVsdSIsIG5zZXJ2ZXJzKTsKLQkJCXByaW50ZigiIHNlcnZlcnMiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7Ci0JCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKLQkJCQlpZiAoaSA8IG5zZXJ2ZXJzKQotCQkJCQlwcmludGYoIiAlcyIsCi0JCQkJCSAgIGludG9hKCgoc3RydWN0IGluX2FkZHIgKikgYnApLT5zX2FkZHIpKTsKLQkJCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0JCQl9Ci0JCQlwcmludGYoIiBwYXJ0aXRpb25zIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykgewotCQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCQlpZiAoaSA8IG5zZXJ2ZXJzICYmIGogPD0gMjYpCi0JCQkJCXByaW50ZigiICVjIiwgJ2EnICsgKGludClqKTsKLQkJCQllbHNlIGlmIChpIDwgbnNlcnZlcnMpCi0JCQkJCXByaW50ZigiICVsdSIsIGopOwotCQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCX0KLQkJCVRDSEVDSzIoYnBbMF0sIDEzICogc2l6ZW9mKGludDMyX3QpKTsKLQkJCWJwICs9IDEzICogc2l6ZW9mKGludDMyX3QpOwotCQkJcHJpbnRmKCIgcnd2b2wiKTsKLQkJCVVJTlRPVVQoKTsKLQkJCXByaW50ZigiIHJvdm9sIik7Ci0JCQlVSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBiYWNrdXAiKTsKLQkJCVVJTlRPVVQoKTsKLQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgNTI2OgkvKiBHZXQgZW50cnkgYnkgSUQgVSAqLwotCQljYXNlIDUyNzoJLyogR2V0IGVudHJ5IGJ5IG5hbWUgVSAqLwotCQl7CXVuc2lnbmVkIGxvbmcgbnNlcnZlcnMsIGo7Ci0JCQlWRUNPVVQoVkxOQU1FTUFYKTsKLQkJCXByaW50ZigiIG51bXNlcnZlcnMiKTsKLQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQluc2VydmVycyA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCXByaW50ZigiICVsdSIsIG5zZXJ2ZXJzKTsKLQkJCXByaW50ZigiIHNlcnZlcnMiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7Ci0JCQkJaWYgKGkgPCBuc2VydmVycykgewotCQkJCQlwcmludGYoIiBhZnN1dWlkIik7Ci0JCQkJCUFGU1VVSURPVVQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlUQ0hFQ0syKGJwWzBdLCA0NCk7Ci0JCQkJCWJwICs9IDQ0OwotCQkJCX0KLQkJCX0KLQkJCVRDSEVDSzIoYnBbMF0sIDQgKiAxMyk7Ci0JCQlicCArPSA0ICogMTM7Ci0JCQlwcmludGYoIiBwYXJ0aXRpb25zIik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykgewotCQkJCVRDSEVDSzIoYnBbMF0sIHNpemVvZihpbnQzMl90KSk7Ci0JCQkJaiA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCQlpZiAoaSA8IG5zZXJ2ZXJzICYmIGogPD0gMjYpCi0JCQkJCXByaW50ZigiICVjIiwgJ2EnICsgKGludClqKTsKLQkJCQllbHNlIGlmIChpIDwgbnNlcnZlcnMpCi0JCQkJCXByaW50ZigiICVsdSIsIGopOwotCQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCX0KLQkJCVRDSEVDSzIoYnBbMF0sIDEzICogc2l6ZW9mKGludDMyX3QpKTsKLQkJCWJwICs9IDEzICogc2l6ZW9mKGludDMyX3QpOwotCQkJcHJpbnRmKCIgcnd2b2wiKTsKLQkJCVVJTlRPVVQoKTsKLQkJCXByaW50ZigiIHJvdm9sIik7Ci0JCQlVSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBiYWNrdXAiKTsKLQkJCVVJTlRPVVQoKTsKLQkJfQotCQlkZWZhdWx0OgotCQkJOwotCQl9Ci0KLQllbHNlIHsKLQkJLyoKLQkJICogT3RoZXJ3aXNlLCBqdXN0IHByaW50IG91dCB0aGUgcmV0dXJuIGNvZGUKLQkJICovCi0JCXByaW50ZigiIGVycmNvZGUiKTsKLQkJSU5UT1VUKCk7Ci0JfQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfHZsZGJdIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgY2FsbHMgdG8gdGhlIEFGUyBLZXJiZXJvcyBBdXRoZW50aWNhdGlvbiBzZXJ2aWNlCi0gKi8KLQotc3RhdGljIHZvaWQKLWthdXRoX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCi17Ci0JaW50IGthdXRoX29wOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gKGludCkoc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgc2l6ZW9mKGludDMyX3QpKSkgewotCQlnb3RvIHRydW5jOwotCX0KLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIGthdXRoL2thdXRoLnJnCi0JICovCi0KLQlrYXV0aF9vcCA9IEVYVFJBQ1RfMzJCSVRTKGJwICsgc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKTsKLQotCXByaW50ZigiIGthdXRoIik7Ci0KLQlpZiAoaXNfdWJpayhrYXV0aF9vcCkpIHsKLQkJdWJpa19wcmludChicCk7Ci0JCXJldHVybjsKLQl9Ci0KLQotCXByaW50ZigiIGNhbGwgJXMiLCB0b2syc3RyKGthdXRoX3JlcSwgIm9wIyVkIiwga2F1dGhfb3ApKTsKLQotCS8qCi0JICogRGVjb2RlIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgS0EgY2FsbHMKLQkgKi8KLQotCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIDQ7Ci0KLQlzd2l0Y2ggKGthdXRoX29wKSB7Ci0JCWNhc2UgMToJCS8qIEF1dGhlbnRpY2F0ZSBvbGQgKi87Ci0JCWNhc2UgMjE6CS8qIEF1dGhlbnRpY2F0ZSAqLwotCQljYXNlIDIyOgkvKiBBdXRoZW50aWNhdGUtVjIgKi8KLQkJY2FzZSAyOgkJLyogQ2hhbmdlIFBXICovCi0JCWNhc2UgNToJCS8qIFNldCBmaWVsZHMgKi8KLQkJY2FzZSA2OgkJLyogQ3JlYXRlIHVzZXIgKi8KLQkJY2FzZSA3OgkJLyogRGVsZXRlIHVzZXIgKi8KLQkJY2FzZSA4OgkJLyogR2V0IGVudHJ5ICovCi0JCWNhc2UgMTQ6CS8qIFVubG9jayAqLwotCQljYXNlIDE1OgkvKiBMb2NrIHN0YXR1cyAqLwotCQkJcHJpbnRmKCIgcHJpbmNpcGFsIik7Ci0JCQlTVFJPVVQoS0FOQU1FTUFYKTsKLQkJCVNUUk9VVChLQU5BTUVNQVgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJCS8qIEdldFRpY2tldC1vbGQgKi8KLQkJY2FzZSAyMzoJLyogR2V0VGlja2V0ICovCi0JCXsKLQkJCWludCBpOwotCQkJcHJpbnRmKCIga3ZubyIpOwotCQkJSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBkb21haW4iKTsKLQkJCVNUUk9VVChLQU5BTUVNQVgpOwotCQkJVENIRUNLMihicFswXSwgc2l6ZW9mKGludDMyX3QpKTsKLQkJCWkgPSAoaW50KSBFWFRSQUNUXzMyQklUUyhicCk7Ci0JCQlicCArPSBzaXplb2YoaW50MzJfdCk7Ci0JCQlUQ0hFQ0syKGJwWzBdLCBpKTsKLQkJCWJwICs9IGk7Ci0JCQlwcmludGYoIiBwcmluY2lwYWwiKTsKLQkJCVNUUk9VVChLQU5BTUVNQVgpOwotCQkJU1RST1VUKEtBTkFNRU1BWCk7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIDQ6CQkvKiBTZXQgUGFzc3dvcmQgKi8KLQkJCXByaW50ZigiIHByaW5jaXBhbCIpOwotCQkJU1RST1VUKEtBTkFNRU1BWCk7Ci0JCQlTVFJPVVQoS0FOQU1FTUFYKTsKLQkJCXByaW50ZigiIGt2bm8iKTsKLQkJCUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6CS8qIEdldCBwYXNzd29yZCAqLwotCQkJcHJpbnRmKCIgbmFtZSIpOwotCQkJU1RST1VUKEtBTkFNRU1BWCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8a2F1dGhdIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgcmVwbGllcyB0byB0aGUgQUZTIEtlcmJlcm9zIEF1dGhlbnRpY2F0aW9uIFNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAota2F1dGhfcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50MzJfdCBvcGNvZGUpCi17Ci0Jc3RydWN0IHJ4X2hlYWRlciAqcnhoOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcwotCSAqIGdsZWFuZWQgZnJvbSBrYXV0aC9rYXV0aC5yZwotCSAqLwotCi0JcHJpbnRmKCIga2F1dGgiKTsKLQotCWlmIChpc191YmlrKG9wY29kZSkpIHsKLQkJdWJpa19yZXBseV9wcmludChicCwgbGVuZ3RoLCBvcGNvZGUpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRmKCIgcmVwbHkgJXMiLCB0b2syc3RyKGthdXRoX3JlcSwgIm9wIyVkIiwgb3Bjb2RlKSk7Ci0KLQlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7Ci0KLQkvKgotCSAqIElmIGl0IHdhcyBhIGRhdGEgcGFja2V0LCBpbnRlcnByZXQgdGhlIHJlc3BvbnNlLgotCSAqLwotCi0JaWYgKHJ4aC0+dHlwZSA9PSBSWF9QQUNLRVRfVFlQRV9EQVRBKQotCQkvKiBXZWxsLCBubywgbm90IHJlYWxseS4gIExlYXZlIHRoaXMgZm9yIGxhdGVyICovCi0JCTsKLQllbHNlIHsKLQkJLyoKLQkJICogT3RoZXJ3aXNlLCBqdXN0IHByaW50IG91dCB0aGUgcmV0dXJuIGNvZGUKLQkJICovCi0JCXByaW50ZigiIGVycmNvZGUiKTsKLQkJSU5UT1VUKCk7Ci0JfQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfGthdXRoXSIpOwotfQotCi0vKgotICogSGFuZGxlIGNhbGxzIHRvIHRoZSBBRlMgVm9sdW1lIGxvY2F0aW9uIHNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAotdm9sX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgpCi17Ci0JaW50IHZvbF9vcDsKLQotCWlmIChsZW5ndGggPD0gKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCi0JCXJldHVybjsKLQotCWlmIChzbmFwZW5kIC0gYnAgKyAxIDw9IChpbnQpKHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSArIHNpemVvZihpbnQzMl90KSkpIHsKLQkJZ290byB0cnVuYzsKLQl9Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcwotCSAqIGdsZWFuZWQgZnJvbSB2b2xzZXIvdm9saW50LnhnCi0JICovCi0KLQl2b2xfb3AgPSBFWFRSQUNUXzMyQklUUyhicCArIHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSk7Ci0KLQlwcmludGYoIiB2b2wgY2FsbCAlcyIsIHRvazJzdHIodm9sX3JlcSwgIm9wIyVkIiwgdm9sX29wKSk7Ci0KLQkvKgotCSAqIE5vcm1hbGx5IHRoZXJlIHdvdWxkIGJlIGEgc3dpdGNoIHN0YXRlbWVudCBoZXJlIHRvIGRlY29kZSB0aGUKLQkgKiBhcmd1bWVudHMgdG8gdGhlIEFGUyBjYWxsLCBidXQgc2luY2UgSSBkb24ndCBoYXZlIGFjY2VzcyB0bwotCSAqIGFuIEFGUyBzZXJ2ZXIgKHlldCkgYW5kIEknbSBub3QgYW4gQUZTIGFkbWluLCBJIGNhbid0Ci0JICogdGVzdCBhbnkgb2YgdGhlc2UgY2FsbHMuICBMZWF2ZSB0aGlzIGJsYW5rIGZvciBub3cuCi0JICovCi0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8dm9sXSIpOwotfQotCi0vKgotICogSGFuZGxlIHJlcGxpZXMgdG8gdGhlIEFGUyBWb2x1bWUgU2VydmljZQotICovCi0KLXN0YXRpYyB2b2lkCi12b2xfcmVwbHlfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCwgaW50MzJfdCBvcGNvZGUpCi17Ci0Jc3RydWN0IHJ4X2hlYWRlciAqcnhoOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcwotCSAqIGdsZWFuZWQgZnJvbSB2b2xzZXIvdm9saW50LnhnCi0JICovCi0KLQlwcmludGYoIiB2b2wgcmVwbHkgJXMiLCB0b2syc3RyKHZvbF9yZXEsICJvcCMlZCIsIG9wY29kZSkpOwotCi0JYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpOwotCi0JLyoKLQkgKiBJZiBpdCB3YXMgYSBkYXRhIHBhY2tldCwgaW50ZXJwcmV0IHRoZSByZXNwb25zZS4KLQkgKi8KLQotCWlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfREFUQSkKLQkJLyogV2VsbCwgbm8sIG5vdCByZWFsbHkuICBMZWF2ZSB0aGlzIGZvciBsYXRlciAqLwotCQk7Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIE90aGVyd2lzZSwganVzdCBwcmludCBvdXQgdGhlIHJldHVybiBjb2RlCi0JCSAqLwotCQlwcmludGYoIiBlcnJjb2RlIik7Ci0JCUlOVE9VVCgpOwotCX0KLQotCXJldHVybjsKLQotdHJ1bmM6Ci0JcHJpbnRmKCIgW3x2b2xdIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgY2FsbHMgdG8gdGhlIEFGUyBCT1Mgc2VydmljZQotICovCi0KLXN0YXRpYyB2b2lkCi1ib3NfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgaW50IGxlbmd0aCkKLXsKLQlpbnQgYm9zX29wOwotCi0JaWYgKGxlbmd0aCA8PSAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gKGludCkoc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgc2l6ZW9mKGludDMyX3QpKSkgewotCQlnb3RvIHRydW5jOwotCX0KLQotCS8qCi0JICogUHJpbnQgb3V0IHRoZSBhZnMgY2FsbCB3ZSdyZSBpbnZva2luZy4gIFRoZSB0YWJsZSB1c2VkIGhlcmUgd2FzCi0JICogZ2xlYW5lZCBmcm9tIGJvem8vYm9zaW50LnhnCi0JICovCi0KLQlib3Nfb3AgPSBFWFRSQUNUXzMyQklUUyhicCArIHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSk7Ci0KLQlwcmludGYoIiBib3MgY2FsbCAlcyIsIHRvazJzdHIoYm9zX3JlcSwgIm9wIyVkIiwgYm9zX29wKSk7Ci0KLQkvKgotCSAqIERlY29kZSBzb21lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIEJPUyBjYWxscwotCSAqLwotCi0JYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpICsgNDsKLQotCXN3aXRjaCAoYm9zX29wKSB7Ci0JCWNhc2UgODA6CS8qIENyZWF0ZSBCIG5vZGUgKi8KLQkJCXByaW50ZigiIHR5cGUiKTsKLQkJCVNUUk9VVChCT1NOQU1FTUFYKTsKLQkJCXByaW50ZigiIGluc3RhbmNlIik7Ci0JCQlTVFJPVVQoQk9TTkFNRU1BWCk7Ci0JCQlicmVhazsKLQkJY2FzZSA4MToJLyogRGVsZXRlIEIgbm9kZSAqLwotCQljYXNlIDgzOgkvKiBHZXQgc3RhdHVzICovCi0JCWNhc2UgODU6CS8qIEdldCBpbnN0YW5jZSBpbmZvICovCi0JCWNhc2UgODc6CS8qIEFkZCBzdXBlciB1c2VyICovCi0JCWNhc2UgODg6CS8qIERlbGV0ZSBzdXBlciB1c2VyICovCi0JCWNhc2UgOTM6CS8qIFNldCBjZWxsIG5hbWUgKi8KLQkJY2FzZSA5NjoJLyogQWRkIGNlbGwgaG9zdCAqLwotCQljYXNlIDk3OgkvKiBEZWxldGUgY2VsbCBob3N0ICovCi0JCWNhc2UgMTA0OgkvKiBSZXN0YXJ0ICovCi0JCWNhc2UgMTA2OgkvKiBVbmluc3RhbGwgKi8KLQkJY2FzZSAxMDg6CS8qIEV4ZWMgKi8KLQkJY2FzZSAxMTI6CS8qIEdldGxvZyAqLwotCQljYXNlIDExNDoJLyogR2V0IGluc3RhbmNlIHN0cmluZ3MgKi8KLQkJCVNUUk9VVChCT1NOQU1FTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIDgyOgkvKiBTZXQgc3RhdHVzICovCi0JCWNhc2UgOTg6CS8qIFNldCBUIHN0YXR1cyAqLwotCQkJU1RST1VUKEJPU05BTUVNQVgpOwotCQkJcHJpbnRmKCIgc3RhdHVzIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDg2OgkvKiBHZXQgaW5zdGFuY2UgcGFybSAqLwotCQkJU1RST1VUKEJPU05BTUVNQVgpOwotCQkJcHJpbnRmKCIgbnVtIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDg0OgkvKiBFbnVtZXJhdGUgaW5zdGFuY2UgKi8KLQkJY2FzZSA4OToJLyogTGlzdCBzdXBlciB1c2VycyAqLwotCQljYXNlIDkwOgkvKiBMaXN0IGtleXMgKi8KLQkJY2FzZSA5MToJLyogQWRkIGtleSAqLwotCQljYXNlIDkyOgkvKiBEZWxldGUga2V5ICovCi0JCWNhc2UgOTU6CS8qIEdldCBjZWxsIGhvc3QgKi8KLQkJCUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA1OgkvKiBJbnN0YWxsICovCi0JCQlTVFJPVVQoQk9TTkFNRU1BWCk7Ci0JCQlwcmludGYoIiBzaXplIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIGZsYWdzIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIGRhdGUiKTsKLQkJCUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQk7Ci0JfQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfGJvc10iKTsKLX0KLQotLyoKLSAqIEhhbmRsZSByZXBsaWVzIHRvIHRoZSBBRlMgQk9TIFNlcnZpY2UKLSAqLwotCi1zdGF0aWMgdm9pZAotYm9zX3JlcGx5X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgsIGludDMyX3Qgb3Bjb2RlKQotewotCXN0cnVjdCByeF9oZWFkZXIgKnJ4aDsKLQotCWlmIChsZW5ndGggPD0gKGludClzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpCi0JCXJldHVybjsKLQotCXJ4aCA9IChzdHJ1Y3QgcnhfaGVhZGVyICopIGJwOwotCi0JLyoKLQkgKiBQcmludCBvdXQgdGhlIGFmcyBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhlIHRhYmxlIHVzZWQgaGVyZSB3YXMKLQkgKiBnbGVhbmVkIGZyb20gdm9sc2VyL3ZvbGludC54ZwotCSAqLwotCi0JcHJpbnRmKCIgYm9zIHJlcGx5ICVzIiwgdG9rMnN0cihib3NfcmVxLCAib3AjJWQiLCBvcGNvZGUpKTsKLQotCWJwICs9IHNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKTsKLQotCS8qCi0JICogSWYgaXQgd2FzIGEgZGF0YSBwYWNrZXQsIGludGVycHJldCB0aGUgcmVzcG9uc2UuCi0JICovCi0KLQlpZiAocnhoLT50eXBlID09IFJYX1BBQ0tFVF9UWVBFX0RBVEEpCi0JCS8qIFdlbGwsIG5vLCBub3QgcmVhbGx5LiAgTGVhdmUgdGhpcyBmb3IgbGF0ZXIgKi8KLQkJOwotCWVsc2UgewotCQkvKgotCQkgKiBPdGhlcndpc2UsIGp1c3QgcHJpbnQgb3V0IHRoZSByZXR1cm4gY29kZQotCQkgKi8KLQkJcHJpbnRmKCIgZXJyY29kZSIpOwotCQlJTlRPVVQoKTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8Ym9zXSIpOwotfQotCi0vKgotICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYSBVYmlrIG9wY29kZS4KLSAqLwotCi1zdGF0aWMgaW50Ci1pc191YmlrKHVfaW50MzJfdCBvcGNvZGUpCi17Ci0JaWYgKChvcGNvZGUgPj0gVk9URV9MT1cgJiYgb3Bjb2RlIDw9IFZPVEVfSElHSCkgfHwKLQkgICAgKG9wY29kZSA+PSBESVNLX0xPVyAmJiBvcGNvZGUgPD0gRElTS19ISUdIKSkKLQkJcmV0dXJuKDEpOwotCWVsc2UKLQkJcmV0dXJuKDApOwotfQotCi0vKgotICogSGFuZGxlIFViaWsgb3Bjb2RlcyB0byBhbnkgb25lIG9mIHRoZSByZXBsaWNhdGVkIGRhdGFiYXNlIHNlcnZpY2VzCi0gKi8KLQotc3RhdGljIHZvaWQKLXViaWtfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKLXsKLQlpbnQgdWJpa19vcDsKLQlpbnQzMl90IHRlbXA7Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgYWZzIGNhbGwgd2UncmUgaW52b2tpbmcuICBUaGUgdGFibGUgdXNlZCBoZXJlIHdhcwotCSAqIGdsZWFuZWQgZnJvbSB1YmlrL3ViaWtfaW50LnhnCi0JICovCi0KLQl1YmlrX29wID0gRVhUUkFDVF8zMkJJVFMoYnAgKyBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikpOwotCi0JcHJpbnRmKCIgdWJpayBjYWxsICVzIiwgdG9rMnN0cih1YmlrX3JlcSwgIm9wIyVkIiwgdWJpa19vcCkpOwotCi0JLyoKLQkgKiBEZWNvZGUgc29tZSBvZiB0aGUgYXJndW1lbnRzIHRvIHRoZSBVYmlrIGNhbGxzCi0JICovCi0KLQlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcikgKyA0OwotCi0Jc3dpdGNoICh1YmlrX29wKSB7Ci0JCWNhc2UgMTAwMDA6CQkvKiBCZWFjb24gKi8KLQkJCVRDSEVDSzIoYnBbMF0sIDQpOwotCQkJdGVtcCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCXByaW50ZigiIHN5bmNzaXRlICVzIiwgdGVtcCA/ICJ5ZXMiIDogIm5vIik7Ci0JCQlwcmludGYoIiB2b3Rlc3RhcnQiKTsKLQkJCURBVEVPVVQoKTsKLQkJCXByaW50ZigiIGRidmVyc2lvbiIpOwotCQkJVUJJS19WRVJTSU9OT1VUKCk7Ci0JCQlwcmludGYoIiB0aWQiKTsKLQkJCVVCSUtfVkVSU0lPTk9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTAwMDM6CQkvKiBHZXQgc3luYyBzaXRlICovCi0JCQlwcmludGYoIiBzaXRlIik7Ci0JCQlVSU5UT1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyMDAwMDoJCS8qIEJlZ2luICovCi0JCWNhc2UgMjAwMDE6CQkvKiBDb21taXQgKi8KLQkJY2FzZSAyMDAwNzoJCS8qIEFib3J0ICovCi0JCWNhc2UgMjAwMDg6CQkvKiBSZWxlYXNlIGxvY2tzICovCi0JCWNhc2UgMjAwMTA6CQkvKiBXcml0ZXYgKi8KLQkJCXByaW50ZigiIHRpZCIpOwotCQkJVUJJS19WRVJTSU9OT1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyMDAwMjoJCS8qIExvY2sgKi8KLQkJCXByaW50ZigiIHRpZCIpOwotCQkJVUJJS19WRVJTSU9OT1VUKCk7Ci0JCQlwcmludGYoIiBmaWxlIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIHBvcyIpOwotCQkJSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBsZW5ndGgiKTsKLQkJCUlOVE9VVCgpOwotCQkJdGVtcCA9IEVYVFJBQ1RfMzJCSVRTKGJwKTsKLQkJCWJwICs9IHNpemVvZihpbnQzMl90KTsKLQkJCXRvazJzdHIodWJpa19sb2NrX3R5cGVzLCAidHlwZSAlZCIsIHRlbXApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjAwMDM6CQkvKiBXcml0ZSAqLwotCQkJcHJpbnRmKCIgdGlkIik7Ci0JCQlVQklLX1ZFUlNJT05PVVQoKTsKLQkJCXByaW50ZigiIGZpbGUiKTsKLQkJCUlOVE9VVCgpOwotCQkJcHJpbnRmKCIgcG9zIik7Ci0JCQlJTlRPVVQoKTsKLQkJCWJyZWFrOwotCQljYXNlIDIwMDA1OgkJLyogR2V0IGZpbGUgKi8KLQkJCXByaW50ZigiIGZpbGUiKTsKLQkJCUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjAwMDY6CQkvKiBTZW5kIGZpbGUgKi8KLQkJCXByaW50ZigiIGZpbGUiKTsKLQkJCUlOVE9VVCgpOwotCQkJcHJpbnRmKCIgbGVuZ3RoIik7Ci0JCQlJTlRPVVQoKTsKLQkJCXByaW50ZigiIGRidmVyc2lvbiIpOwotCQkJVUJJS19WRVJTSU9OT1VUKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyMDAwOToJCS8qIFRydW5jYXRlICovCi0JCQlwcmludGYoIiB0aWQiKTsKLQkJCVVCSUtfVkVSU0lPTk9VVCgpOwotCQkJcHJpbnRmKCIgZmlsZSIpOwotCQkJSU5UT1VUKCk7Ci0JCQlwcmludGYoIiBsZW5ndGgiKTsKLQkJCUlOVE9VVCgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjAwMTI6CQkvKiBTZXQgdmVyc2lvbiAqLwotCQkJcHJpbnRmKCIgdGlkIik7Ci0JCQlVQklLX1ZFUlNJT05PVVQoKTsKLQkJCXByaW50ZigiIG9sZHZlcnNpb24iKTsKLQkJCVVCSUtfVkVSU0lPTk9VVCgpOwotCQkJcHJpbnRmKCIgbmV3dmVyc2lvbiIpOwotCQkJVUJJS19WRVJTSU9OT1VUKCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCTsKLQl9Ci0KLQlyZXR1cm47Ci0KLXRydW5jOgotCXByaW50ZigiIFt8dWJpa10iKTsKLX0KLQotLyoKLSAqIEhhbmRsZSBVYmlrIHJlcGxpZXMgdG8gYW55IG9uZSBvZiB0aGUgcmVwbGljYXRlZCBkYXRhYmFzZSBzZXJ2aWNlcwotICovCi0KLXN0YXRpYyB2b2lkCi11YmlrX3JlcGx5X3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIGludCBsZW5ndGgsIGludDMyX3Qgb3Bjb2RlKQotewotCXN0cnVjdCByeF9oZWFkZXIgKnJ4aDsKLQotCWlmIChsZW5ndGggPCAoaW50KXNpemVvZihzdHJ1Y3QgcnhfaGVhZGVyKSkKLQkJcmV0dXJuOwotCi0JcnhoID0gKHN0cnVjdCByeF9oZWFkZXIgKikgYnA7Ci0KLQkvKgotCSAqIFByaW50IG91dCB0aGUgdWJpayBjYWxsIHdlJ3JlIGludm9raW5nLiAgVGhpcyB0YWJsZSB3YXMgZ2xlYW5lZAotCSAqIGZyb20gdWJpay91YmlrX2ludC54ZwotCSAqLwotCi0JcHJpbnRmKCIgdWJpayByZXBseSAlcyIsIHRvazJzdHIodWJpa19yZXEsICJvcCMlZCIsIG9wY29kZSkpOwotCi0JYnAgKz0gc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpOwotCi0JLyoKLQkgKiBJZiBpdCB3YXMgYSBkYXRhIHBhY2tldCwgcHJpbnQgb3V0IHRoZSBhcmd1bWVudHMgdG8gdGhlIFViaWsgY2FsbHMKLQkgKi8KLQotCWlmIChyeGgtPnR5cGUgPT0gUlhfUEFDS0VUX1RZUEVfREFUQSkKLQkJc3dpdGNoIChvcGNvZGUpIHsKLQkJY2FzZSAxMDAwMDoJCS8qIEJlYWNvbiAqLwotCQkJcHJpbnRmKCIgdm90ZSBubyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjAwMDQ6CQkvKiBHZXQgdmVyc2lvbiAqLwotCQkJcHJpbnRmKCIgZGJ2ZXJzaW9uIik7Ci0JCQlVQklLX1ZFUlNJT05PVVQoKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJOwotCQl9Ci0KLQkvKgotCSAqIE90aGVyd2lzZSwgcHJpbnQgb3V0ICJ5ZXMiIGl0IGl0IHdhcyBhIGJlYWNvbiBwYWNrZXQgKGJlY2F1c2UKLQkgKiB0aGF0J3MgaG93IHllcyB2b3RlcyBhcmUgcmV0dXJuZWQsIGdvIGZpZ3VyZSksIG90aGVyd2lzZQotCSAqIGp1c3QgcHJpbnQgb3V0IHRoZSBlcnJvciBjb2RlLgotCSAqLwotCi0JZWxzZQotCQlzd2l0Y2ggKG9wY29kZSkgewotCQljYXNlIDEwMDAwOgkJLyogQmVhY29uICovCi0JCQlwcmludGYoIiB2b3RlIHllcyB1bnRpbCIpOwotCQkJREFURU9VVCgpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGYoIiBlcnJjb2RlIik7Ci0JCQlJTlRPVVQoKTsKLQkJfQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfHViaWtdIik7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgUlggQUNLIHBhY2tldHMuCi0gKi8KLQotc3RhdGljIHZvaWQKLXJ4X2Fja19wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCBpbnQgbGVuZ3RoKQotewotCXN0cnVjdCByeF9hY2tQYWNrZXQgKnJ4YTsKLQlpbnQgaSwgc3RhcnQsIGxhc3Q7Ci0JdV9pbnQzMl90IGZpcnN0UGFja2V0OwotCi0JaWYgKGxlbmd0aCA8IChpbnQpc2l6ZW9mKHN0cnVjdCByeF9oZWFkZXIpKQotCQlyZXR1cm47Ci0KLQlicCArPSBzaXplb2Yoc3RydWN0IHJ4X2hlYWRlcik7Ci0KLQkvKgotCSAqIFRoaXMgbWF5IHNlZW0gYSBsaXR0bGUgb2RkIC4uLi4gdGhlIHJ4X2Fja1BhY2tldCBzdHJ1Y3R1cmUKLQkgKiBjb250YWlucyBhbiBhcnJheSBvZiBpbmRpdmlkdWFsIHBhY2tldCBhY2tub3dsZWRnZW1lbnRzCi0JICogKHVzZWQgZm9yIHNlbGVjdGl2ZSBhY2svbmFjayksIGJ1dCBzaW5jZSBpdCdzIHZhcmlhYmxlIGluIHNpemUsCi0JICogd2UgZG9uJ3Qgd2FudCB0byB0cnVuY2F0ZSBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUKLQkgKiByeF9hY2tQYWNrZXQgc3RydWN0dXJlLgotCSAqLwotCi0JVENIRUNLMihicFswXSwgc2l6ZW9mKHN0cnVjdCByeF9hY2tQYWNrZXQpIC0gUlhfTUFYQUNLUyk7Ci0KLQlyeGEgPSAoc3RydWN0IHJ4X2Fja1BhY2tldCAqKSBicDsKLQlicCArPSAoc2l6ZW9mKHN0cnVjdCByeF9hY2tQYWNrZXQpIC0gUlhfTUFYQUNLUyk7Ci0KLQkvKgotCSAqIFByaW50IG91dCBhIGZldyB1c2VmdWwgdGhpbmdzIGZyb20gdGhlIGFjayBwYWNrZXQgc3RydWN0dXJlCi0JICovCi0KLQlpZiAodmZsYWcgPiAyKQotCQlwcmludGYoIiBidWZzcGFjZSAlZCBtYXhza2V3ICVkIiwKLQkJICAgICAgIChpbnQpIEVYVFJBQ1RfMTZCSVRTKCZyeGEtPmJ1ZmZlclNwYWNlKSwKLQkJICAgICAgIChpbnQpIEVYVFJBQ1RfMTZCSVRTKCZyeGEtPm1heFNrZXcpKTsKLQotCWZpcnN0UGFja2V0ID0gRVhUUkFDVF8zMkJJVFMoJnJ4YS0+Zmlyc3RQYWNrZXQpOwotCXByaW50ZigiIGZpcnN0ICVkIHNlcmlhbCAlZCByZWFzb24gJXMiLAotCSAgICAgICBmaXJzdFBhY2tldCwgRVhUUkFDVF8zMkJJVFMoJnJ4YS0+c2VyaWFsKSwKLQkgICAgICAgdG9rMnN0cihyeF9hY2tfcmVhc29ucywgIiMlZCIsIChpbnQpIHJ4YS0+cmVhc29uKSk7Ci0KLQkvKgotCSAqIE9rYXksIG5vdyB3ZSBwcmludCBvdXQgdGhlIGFjayBhcnJheS4gIFRoZSB3YXkgX3RoaXNfIHdvcmtzCi0JICogaXMgdGhhdCB3ZSBzdGFydCBhdCAiZmlyc3QiLCBhbmQgc3RlcCB0aHJvdWdoIHRoZSBhY2sgYXJyYXkuCi0JICogSWYgd2UgaGF2ZSBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYWNrcy9uYWNrcywgdHJ5IHRvCi0JICogY29sbGFwc2UgdGhlbSBpbnRvIGEgcmFuZ2UuCi0JICoKLQkgKiBJZiB5b3UncmUgcmVhbGx5IGNsZXZlciwgeW91IG1pZ2h0IGhhdmUgbm90aWNlZCB0aGF0IHRoaXMKLQkgKiBkb2Vzbid0IHNlZW0gcXVpdGUgY29ycmVjdC4gIFNwZWNpZmljYWxseSwgZHVlIHRvIHN0cnVjdHVyZQotCSAqIHBhZGRpbmcsIHNpemVvZihzdHJ1Y3QgcnhfYWNrUGFja2V0KSAtIFJYX01BWEFDS1Mgd29uJ3QgYWN0dWFsbHkKLQkgKiB5aWVsZCB0aGUgc3RhcnQgb2YgdGhlIGFjayBhcnJheSAoYmVjYXVzZSBSWF9NQVhBQ0tTIGlzIDI1NQotCSAqIGFuZCB0aGUgc3RydWN0dXJlIHdpbGwgbGlrZWx5IGdldCBwYWRkZWQgdG8gYSAyIG9yIDQgYnl0ZQotCSAqIGJvdW5kYXJ5KS4gIEhvd2V2ZXIsIHRoaXMgaXMgdGhlIHdheSBpdCdzIGltcGxlbWVudGVkIGluc2lkZQotCSAqIG9mIEFGUyAtIHRoZSBzdGFydCBvZiB0aGUgZXh0cmEgZmllbGRzIGFyZSBhdAotCSAqIHNpemVvZihzdHJ1Y3QgcnhfYWNrUGFja2V0KSAtIFJYX01BWEFDS1MgKyBuQWNrcywgd2hpY2ggX2lzbid0XwotCSAqIHRoZSBleGFjdCBzdGFydCBvZiB0aGUgYWNrIGFycmF5LiAgU2lnaC4gIFRoYXQncyB3aHkgd2UgYXJlbid0Ci0JICogdXNpbmcgYnAsIGJ1dCBpbnN0ZWFkIHVzZSByeGEtPmFja3NbXS4gIEJ1dCBuQWNrcyBnZXRzIGFkZGVkCi0JICogdG8gYnAgYWZ0ZXIgdGhpcywgc28gYnAgZW5kcyB1cCBhdCB0aGUgcmlnaHQgc3BvdC4gIEdvIGZpZ3VyZS4KLQkgKi8KLQotCWlmIChyeGEtPm5BY2tzICE9IDApIHsKLQotCQlUQ0hFQ0syKGJwWzBdLCByeGEtPm5BY2tzKTsKLQotCQkvKgotCQkgKiBTaWdoLCB0aGlzIGlzIGdyb3NzLCBidXQgaXQgc2VlbXMgdG8gd29yayB0byBjb2xsYXBzZQotCQkgKiByYW5nZXMgY29ycmVjdGx5LgotCQkgKi8KLQotCQlmb3IgKGkgPSAwLCBzdGFydCA9IGxhc3QgPSAtMjsgaSA8IHJ4YS0+bkFja3M7IGkrKykKLQkJCWlmIChyeGEtPmFja3NbaV0gPT0gUlhfQUNLX1RZUEVfQUNLKSB7Ci0KLQkJCQkvKgotCQkJCSAqIEkgZmlndXJlZCB0aGlzIGRlc2VydmVkIF9zb21lXyBleHBsYW5hdGlvbi4KLQkJCQkgKiBGaXJzdCwgcHJpbnQgImFja2VkIiBhbmQgdGhlIHBhY2tldCBzZXEKLQkJCQkgKiBudW1iZXIgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZQotCQkJCSAqIHNlZW4gYW4gYWNrZWQgcGFja2V0LgotCQkJCSAqLwotCi0JCQkJaWYgKGxhc3QgPT0gLTIpIHsKLQkJCQkJcHJpbnRmKCIgYWNrZWQgJWQiLAotCQkJCQkgICAgICAgZmlyc3RQYWNrZXQgKyBpKTsKLQkJCQkJc3RhcnQgPSBpOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogT3RoZXJ3aXNlLCBpZiB0aGUgdGhlcmUgaXMgYSBza2lwIGluCi0JCQkJICogdGhlIHJhbmdlIChzdWNoIGFzIGFuIG5hY2tlZCBwYWNrZXQgaW4KLQkJCQkgKiB0aGUgbWlkZGxlIG9mIHNvbWUgYWNrZWQgcGFja2V0cyksCi0JCQkJICogdGhlbiBwcmludCB0aGUgY3VycmVudCBwYWNrZXQgbnVtYmVyCi0JCQkJICogc2VwZXJhdGVkIGZyb20gdGhlIGxhc3QgbnVtYmVyIGJ5Ci0JCQkJICogYSBjb21tYS4KLQkJCQkgKi8KLQotCQkJCWVsc2UgaWYgKGxhc3QgIT0gaSAtIDEpIHsKLQkJCQkJcHJpbnRmKCIsJWQiLCBmaXJzdFBhY2tldCArIGkpOwotCQkJCQlzdGFydCA9IGk7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBXZSBhbHdheXMgc2V0IGxhc3QgdG8gdGhlIHZhbHVlIG9mCi0JCQkJICogdGhlIGxhc3QgYWNrIHdlIHNhdy4gIENvbnZlcnNlbHksIHN0YXJ0Ci0JCQkJICogaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYWNrCi0JCQkJICogd2Ugc2F3IGluIGEgcmFuZ2UuCi0JCQkJICovCi0KLQkJCQlsYXN0ID0gaTsKLQotCQkJCS8qCi0JCQkJICogT2theSwgdGhpcyBiaXQgYSBjb2RlIGdldHMgZXhlY3V0ZWQgd2hlbgotCQkJCSAqIHdlIGhpdCBhIG5hY2sgLi4uIGluIF90aGlzXyBjYXNlIHdlCi0JCQkJICogd2FudCB0byBwcmludCBvdXQgdGhlIHJhbmdlIG9mIHBhY2tldHMKLQkJCQkgKiB0aGF0IHdlcmUgYWNrZWQsIHNvIHdlIG5lZWQgdG8gcHJpbnQKLQkJCQkgKiB0aGUgX3ByZXZpb3VzXyBwYWNrZXQgbnVtYmVyIHNlcGVyYXRlZAotCQkJCSAqIGZyb20gdGhlIGZpcnN0IGJ5IGEgZGFzaCAoLSkuICBTaW5jZSB3ZQotCQkJCSAqIGFscmVhZHkgcHJpbnRlZCB0aGUgZmlyc3QgcGFja2V0IGFib3ZlLAotCQkJCSAqIGp1c3QgcHJpbnQgdGhlIGZpbmFsIHBhY2tldC4gIERvbid0Ci0JCQkJICogZG8gdGhpcyBpZiB0aGVyZSB3aWxsIGJlIGEgc2luZ2xlLWxlbmd0aAotCQkJCSAqIHJhbmdlLgotCQkJCSAqLwotCQkJfSBlbHNlIGlmIChsYXN0ID09IGkgLSAxICYmIHN0YXJ0ICE9IGxhc3QpCi0JCQkJcHJpbnRmKCItJWQiLCBmaXJzdFBhY2tldCArIGkgLSAxKTsKLQotCQkvKgotCQkgKiBTbywgd2hhdCdzIGdvaW5nIG9uIGhlcmU/ICBXZSByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlCi0JCSAqIGFjayBsaXN0LCBhbmQgaWYgd2UgZ290IGEgcmFuZ2Ugd2UgbmVlZCB0byBmaW5pc2ggaXQgdXAuCi0JCSAqIFNvIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBsYXN0IHBhY2tldCBpbiB0aGUgbGlzdAotCQkgKiB3YXMgYW4gYWNrIChpZiBzbywgdGhlbiBsYXN0IHdpbGwgYmUgc2V0IHRvIGl0KSBhbmQKLQkJICogd2UgbmVlZCB0byBzZWUgaWYgdGhlIGxhc3QgcmFuZ2UgZGlkbid0IHN0YXJ0IHdpdGggdGhlCi0JCSAqIGxhc3QgcGFja2V0IChiZWNhdXNlIGlmIGl0IF9kaWRfLCB0aGVuIHRoYXQgd291bGQgbWVhbgotCQkgKiB0aGF0IHRoZSBwYWNrZXQgbnVtYmVyIGhhcyBhbHJlYWR5IGJlZW4gcHJpbnRlZCBhbmQKLQkJICogd2UgZG9uJ3QgbmVlZCB0byBwcmludCBpdCBhZ2FpbikuCi0JCSAqLwotCi0JCWlmIChsYXN0ID09IGkgLSAxICYmIHN0YXJ0ICE9IGxhc3QpCi0JCQlwcmludGYoIi0lZCIsIGZpcnN0UGFja2V0ICsgaSAtIDEpOwotCi0JCS8qCi0JCSAqIFNhbWUgYXMgYWJvdmUsIGp1c3Qgd2l0aG91dCBjb21tZW50cwotCQkgKi8KLQotCQlmb3IgKGkgPSAwLCBzdGFydCA9IGxhc3QgPSAtMjsgaSA8IHJ4YS0+bkFja3M7IGkrKykKLQkJCWlmIChyeGEtPmFja3NbaV0gPT0gUlhfQUNLX1RZUEVfTkFDSykgewotCQkJCWlmIChsYXN0ID09IC0yKSB7Ci0JCQkJCXByaW50ZigiIG5hY2tlZCAlZCIsCi0JCQkJCSAgICAgICBmaXJzdFBhY2tldCArIGkpOwotCQkJCQlzdGFydCA9IGk7Ci0JCQkJfSBlbHNlIGlmIChsYXN0ICE9IGkgLSAxKSB7Ci0JCQkJCXByaW50ZigiLCVkIiwgZmlyc3RQYWNrZXQgKyBpKTsKLQkJCQkJc3RhcnQgPSBpOwotCQkJCX0KLQkJCQlsYXN0ID0gaTsKLQkJCX0gZWxzZSBpZiAobGFzdCA9PSBpIC0gMSAmJiBzdGFydCAhPSBsYXN0KQotCQkJCXByaW50ZigiLSVkIiwgZmlyc3RQYWNrZXQgKyBpIC0gMSk7Ci0KLQkJaWYgKGxhc3QgPT0gaSAtIDEgJiYgc3RhcnQgIT0gbGFzdCkKLQkJCXByaW50ZigiLSVkIiwgZmlyc3RQYWNrZXQgKyBpIC0gMSk7Ci0KLQkJYnAgKz0gcnhhLT5uQWNrczsKLQl9Ci0KLQotCS8qCi0JICogVGhlc2UgYXJlIG9wdGlvbmFsIGZpZWxkczsgZGVwZW5kaW5nIG9uIHlvdXIgdmVyc2lvbiBvZiBBRlMsCi0JICogeW91IG1heSBvciBtYXkgbm90IHNlZSB0aGVtCi0JICovCi0KLSNkZWZpbmUgVFJVTkNSRVQobikJaWYgKHNuYXBlbmQgLSBicCArIDEgPD0gbikgcmV0dXJuOwotCi0JaWYgKHZmbGFnID4gMSkgewotCQlUUlVOQ1JFVCg0KTsKLQkJcHJpbnRmKCIgaWZtdHUiKTsKLQkJSU5UT1VUKCk7Ci0KLQkJVFJVTkNSRVQoNCk7Ci0JCXByaW50ZigiIG1heG10dSIpOwotCQlJTlRPVVQoKTsKLQotCQlUUlVOQ1JFVCg0KTsKLQkJcHJpbnRmKCIgcndpbmQiKTsKLQkJSU5UT1VUKCk7Ci0KLQkJVFJVTkNSRVQoNCk7Ci0JCXByaW50ZigiIG1heHBhY2tldHMiKTsKLQkJSU5UT1VUKCk7Ci0JfQotCi0JcmV0dXJuOwotCi10cnVuYzoKLQlwcmludGYoIiBbfGFja10iKTsKLX0KLSN1bmRlZiBUUlVOQ1JFVApkaWZmIC0tZ2l0IGEvcHJpbnQtc2N0cC5jIGIvcHJpbnQtc2N0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE4OTc4Li4wMDAwMDAwCi0tLSBhL3ByaW50LXNjdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKGMpIDIwMDEgTkVUTEFCLCBUZW1wbGUgVW5pdmVyc2l0eQotICogQ29weXJpZ2h0IChjKSAyMDAxIFByb3RvY29sIEVuZ2luZWVyaW5nIExhYiwgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZQotICoKLSAqIEplcnJ5IEhlaW56IDxnaGVpbnpAYXN0cm8udGVtcGxlLmVkdT4KLSAqIEpvaG4gRmlvcmUgPGpmaW9yZUBqb2RhLmNpcy50ZW1wbGUuZWR1PgotICogQXJtYW5kbyBMLiBDYXJvIEpyLiA8YWNhcm9AY2lzLnVkZWwuZWR1PgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKLSAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXNjdHAuYyx2IDEuMTYuMi41IDIwMDcvMDkvMTMgMTg6MDQ6NTggZ3V5IEV4cCAkIChORVRMQUIvUEVMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgInNjdHBIZWFkZXIuaCIKLSNpbmNsdWRlICJzY3RwQ29uc3RhbnRzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIJCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KLSNpbmNsdWRlICJpcC5oIgotI2lmZGVmIElORVQ2Ci0jaW5jbHVkZSAiaXA2LmgiCi0jZW5kaWYKLQotdm9pZCBzY3RwX3ByaW50KGNvbnN0IHVfY2hhciAqYnAsICAgICAgICAvKiBiZWdpbm5pbmcgb2Ygc2N0cCBwYWNrZXQgKi8KLQkJY29uc3QgdV9jaGFyICpicDIsICAgICAgIC8qIGJlZ2lubmluZyBvZiBlbmNsb3NpbmcgKi8KLQkJdV9pbnQgc2N0cFBhY2tldExlbmd0aCkgIC8qIGlwIHBhY2tldCAqLwotewotICBjb25zdCBzdHJ1Y3Qgc2N0cEhlYWRlciAqc2N0cFBrdEhkcjsKLSAgY29uc3Qgc3RydWN0IGlwICppcDsKLSNpZmRlZiBJTkVUNgotICBjb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2OwotI2VuZGlmCi0gIGNvbnN0IHZvaWQgKmVuZFBhY2tldFB0cjsKLSAgdV9zaG9ydCBzb3VyY2VQb3J0LCBkZXN0UG9ydDsKLSAgaW50IGNodW5rQ291bnQ7Ci0gIGNvbnN0IHN0cnVjdCBzY3RwQ2h1bmtEZXNjICpjaHVua0Rlc2NQdHI7Ci0gIGNvbnN0IHZvaWQgKm5leHRDaHVuazsKLSAgY29uc3QgY2hhciAqc2VwOwotCi0gIHNjdHBQa3RIZHIgPSAoY29uc3Qgc3RydWN0IHNjdHBIZWFkZXIqKSBicDsKLSAgZW5kUGFja2V0UHRyID0gKGNvbnN0IHVfY2hhciopc2N0cFBrdEhkcitzY3RwUGFja2V0TGVuZ3RoOwotCi0gIGlmKCAodV9sb25nKSBlbmRQYWNrZXRQdHIgPiAodV9sb25nKSBzbmFwZW5kKQotICAgIGVuZFBhY2tldFB0ciA9IChjb25zdCB2b2lkICopIHNuYXBlbmQ7Ci0gIGlwID0gKHN0cnVjdCBpcCAqKWJwMjsKLSNpZmRlZiBJTkVUNgotICBpZiAoSVBfVihpcCkgPT0gNikKLSAgICBpcDYgPSAoY29uc3Qgc3RydWN0IGlwNl9oZHIgKilicDI7Ci0gIGVsc2UKLSAgICBpcDYgPSBOVUxMOwotI2VuZGlmIC8qSU5FVDYqLwotICBUQ0hFQ0soKnNjdHBQa3RIZHIpOwotCi0gIGlmIChzY3RwUGFja2V0TGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzY3RwSGVhZGVyKSkKLSAgICB7Ci0gICAgICAodm9pZClwcmludGYoInRydW5jYXRlZC1zY3RwIC0gJWxkIGJ5dGVzIG1pc3NpbmchIiwKLQkJICAgKGxvbmcpc2N0cFBhY2tldExlbmd0aC1zaXplb2Yoc3RydWN0IHNjdHBIZWFkZXIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogICAgc2N0cFBhY2tldExlbmd0aCAtPSBzaXplb2Yoc3RydWN0IHNjdHBIZWFkZXIpOyAgcGFja2V0IGxlbmd0aCAgKi8KLSAgLyogIAkJCSAgICAgIGlzIG5vdyBvbmx5IGFzIGxvbmcgYXMgdGhlIHBheWxvYWQgICovCi0KLSAgc291cmNlUG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZzY3RwUGt0SGRyLT5zb3VyY2UpOwotICBkZXN0UG9ydCA9IEVYVFJBQ1RfMTZCSVRTKCZzY3RwUGt0SGRyLT5kZXN0aW5hdGlvbik7Ci0KLSNpZmRlZiBJTkVUNgotICBpZiAoaXA2KSB7Ci0gICAgKHZvaWQpcHJpbnRmKCIlcy4lZCA+ICVzLiVkOiBzY3RwIiwKLSAgICAgIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9zcmMpLAotICAgICAgc291cmNlUG9ydCwKLSAgICAgIGlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLAotICAgICAgZGVzdFBvcnQpOwotICB9IGVsc2UKLSNlbmRpZiAvKklORVQ2Ki8KLSAgewotICAgICh2b2lkKXByaW50ZigiJXMuJWQgPiAlcy4lZDogc2N0cCIsCi0gICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKLSAgICAgIHNvdXJjZVBvcnQsCi0gICAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSwKLSAgICAgIGRlc3RQb3J0KTsKLSAgfQotICBmZmx1c2goc3Rkb3V0KTsKLQotICBpZiAodmZsYWcgPj0gMikKLSAgICBzZXAgPSAiXG5cdCI7Ci0gIGVsc2UKLSAgICBzZXAgPSAiICgiOwotICAvKiBjeWNsZSB0aHJvdWdoIGFsbCBjaHVua3MsIHByaW50aW5nIGluZm9ybWF0aW9uIG9uIGVhY2ggb25lICovCi0gIGZvciAoY2h1bmtDb3VudCA9IDAsCi0JIGNodW5rRGVzY1B0ciA9IChjb25zdCBzdHJ1Y3Qgc2N0cENodW5rRGVzYyAqKQotCSAgICAoKGNvbnN0IHVfY2hhciopIHNjdHBQa3RIZHIgKyBzaXplb2Yoc3RydWN0IHNjdHBIZWFkZXIpKTsKLSAgICAgICBjaHVua0Rlc2NQdHIgIT0gTlVMTCAmJgotCSAoIChjb25zdCB2b2lkICopCi0JICAgICgoY29uc3QgdV9jaGFyICopIGNodW5rRGVzY1B0ciArIHNpemVvZihzdHJ1Y3Qgc2N0cENodW5rRGVzYykpCi0JICAgPD0gZW5kUGFja2V0UHRyKTsKLQotICAgICAgIGNodW5rRGVzY1B0ciA9IChjb25zdCBzdHJ1Y3Qgc2N0cENodW5rRGVzYyAqKSBuZXh0Q2h1bmssIGNodW5rQ291bnQrKykKLSAgICB7Ci0gICAgICB1X2ludDE2X3QgY2h1bmtMZW5ndGg7Ci0gICAgICBjb25zdCB1X2NoYXIgKmNodW5rRW5kOwotICAgICAgdV9pbnQxNl90IGFsaWduOwotCi0gICAgICBUQ0hFQ0soKmNodW5rRGVzY1B0cik7Ci0gICAgICBjaHVua0xlbmd0aCA9IEVYVFJBQ1RfMTZCSVRTKCZjaHVua0Rlc2NQdHItPmNodW5rTGVuZ3RoKTsKLSAgICAgIGlmIChjaHVua0xlbmd0aCA8IHNpemVvZigqY2h1bmtEZXNjUHRyKSkgewotICAgICAgCXByaW50ZigiJXMlZCkgW0JhZCBjaHVuayBsZW5ndGggJXVdIiwgc2VwLCBjaHVua0NvdW50KzEsIGNodW5rTGVuZ3RoKTsKLSAgICAgIAlicmVhazsKLSAgICAgIH0KLQotICAgICAgVENIRUNLMigqKCh1X2ludDhfdCAqKWNodW5rRGVzY1B0ciksIGNodW5rTGVuZ3RoKTsKLSAgICAgIGNodW5rRW5kID0gKChjb25zdCB1X2NoYXIqKWNodW5rRGVzY1B0ciArIGNodW5rTGVuZ3RoKTsKLQotICAgICAgYWxpZ249Y2h1bmtMZW5ndGggJSA0OwotICAgICAgaWYgKGFsaWduICE9IDApCi0JYWxpZ24gPSA0IC0gYWxpZ247Ci0KLSAgICAgIG5leHRDaHVuayA9IChjb25zdCB2b2lkICopIChjaHVua0VuZCArIGFsaWduKTsKLQotICAgICAgcHJpbnRmKCIlcyVkKSAiLCBzZXAsIGNodW5rQ291bnQrMSk7Ci0gICAgICBzd2l0Y2ggKGNodW5rRGVzY1B0ci0+Y2h1bmtJRCkKLQl7Ci0JY2FzZSBTQ1RQX0RBVEEgOgotCSAgewotCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cERhdGFQYXJ0ICpkYXRhSGRyUHRyOwotCi0JICAgIHByaW50ZigiW0RBVEFdICIpOwotCi0JICAgIGlmICgoY2h1bmtEZXNjUHRyLT5jaHVua0ZsZyAmIFNDVFBfREFUQV9VTk9SREVSRUQpCi0JCT09IFNDVFBfREFUQV9VTk9SREVSRUQpCi0JICAgICAgcHJpbnRmKCIoVSkiKTsKLQotCSAgICBpZiAoKGNodW5rRGVzY1B0ci0+Y2h1bmtGbGcgJiBTQ1RQX0RBVEFfRklSU1RfRlJBRykKLQkJPT0gU0NUUF9EQVRBX0ZJUlNUX0ZSQUcpCi0JICAgICAgcHJpbnRmKCIoQikiKTsKLQotCSAgICBpZiAoKGNodW5rRGVzY1B0ci0+Y2h1bmtGbGcgJiBTQ1RQX0RBVEFfTEFTVF9GUkFHKQotCQk9PSBTQ1RQX0RBVEFfTEFTVF9GUkFHKQotCSAgICAgIHByaW50ZigiKEUpIik7Ci0KLQkgICAgaWYoICgoY2h1bmtEZXNjUHRyLT5jaHVua0ZsZyAmIFNDVFBfREFUQV9VTk9SREVSRUQpCi0JCSA9PSBTQ1RQX0RBVEFfVU5PUkRFUkVEKQotCQl8fAotCQkoKGNodW5rRGVzY1B0ci0+Y2h1bmtGbGcgJiBTQ1RQX0RBVEFfRklSU1RfRlJBRykKLQkJID09IFNDVFBfREFUQV9GSVJTVF9GUkFHKQotCQl8fAotCQkoKGNodW5rRGVzY1B0ci0+Y2h1bmtGbGcgJiBTQ1RQX0RBVEFfTEFTVF9GUkFHKQotCQkgPT0gU0NUUF9EQVRBX0xBU1RfRlJBRykgKQotCSAgICAgIHByaW50ZigiICIpOwotCi0JICAgIGRhdGFIZHJQdHI9KGNvbnN0IHN0cnVjdCBzY3RwRGF0YVBhcnQqKShjaHVua0Rlc2NQdHIrMSk7Ci0KLQkgICAgcHJpbnRmKCJbVFNOOiAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJmRhdGFIZHJQdHItPlRTTikpOwotCSAgICBwcmludGYoIltTSUQ6ICV1XSAiLCBFWFRSQUNUXzE2QklUUygmZGF0YUhkclB0ci0+c3RyZWFtSWQpKTsKLQkgICAgcHJpbnRmKCJbU1NFUSAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJmRhdGFIZHJQdHItPnNlcXVlbmNlKSk7Ci0JICAgIHByaW50ZigiW1BQSUQgMHgleF0gIiwgRVhUUkFDVF8zMkJJVFMoJmRhdGFIZHJQdHItPnBheWxvYWR0eXBlKSk7Ci0JICAgIGZmbHVzaChzdGRvdXQpOwotCi0JICAgIGlmICh2ZmxhZyA+PSAyKQkgICAvKiBpZiB2ZXJib3NlIG91dHB1dCBpcyBzcGVjaWZpZWQgKi8KLQkgICAgICB7CQkgICAgICAgICAgIC8qIGF0IHRoZSBjb21tYW5kIGxpbmUgKi8KLQkJY29uc3QgdV9jaGFyICpwYXlsb2FkUHRyOwotCi0JCXByaW50ZigiW1BheWxvYWQiKTsKLQotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpIHsKLQkJCXBheWxvYWRQdHIgPSAoY29uc3QgdV9jaGFyICopICgrK2RhdGFIZHJQdHIpOwotCQkJcHJpbnRmKCI6Iik7Ci0JCQlpZiAoaHRvbnMoY2h1bmtEZXNjUHRyLT5jaHVua0xlbmd0aCkgPAotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cERhdGFQYXJ0KSsKLQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBDaHVua0Rlc2MpKzEpIHsKLQkJCQkvKiBMZXNzIHRoYW4gMSBieXRlIG9mIGNodW5rIHBheWxvYWQgKi8KLQkJCQlwcmludGYoImJvZ3VzIGNodW5rIGxlbmd0aCAldV0iLAotCQkJCSAgICBodG9ucyhjaHVua0Rlc2NQdHItPmNodW5rTGVuZ3RoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZGVmYXVsdF9wcmludChwYXlsb2FkUHRyLAotCQkJICAgICAgaHRvbnMoY2h1bmtEZXNjUHRyLT5jaHVua0xlbmd0aCkgLQotCQkJICAgICAgKHNpemVvZihzdHJ1Y3Qgc2N0cERhdGFQYXJ0KSsKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cENodW5rRGVzYykpKTsKLQkJfSBlbHNlCi0JCQlwcmludGYoIl0iKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgU0NUUF9JTklUSUFUSU9OIDoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHNjdHBJbml0aWF0aW9uICppbml0OwotCi0JICAgIHByaW50ZigiW0lOSVRdICIpOwotCSAgICBpbml0PShjb25zdCBzdHJ1Y3Qgc2N0cEluaXRpYXRpb24qKShjaHVua0Rlc2NQdHIrMSk7Ci0JICAgIHByaW50ZigiW2luaXQgdGFnOiAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJmluaXQtPmluaXRUYWcpKTsKLQkgICAgcHJpbnRmKCJbcnduZDogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZpbml0LT5yY3ZXaW5kb3dDcmVkaXQpKTsKLQkgICAgcHJpbnRmKCJbT1M6ICV1XSAiLCBFWFRSQUNUXzE2QklUUygmaW5pdC0+TnVtUHJlb3BlblN0cmVhbXMpKTsKLQkgICAgcHJpbnRmKCJbTUlTOiAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJmluaXQtPk1heEluYm91bmRTdHJlYW1zKSk7Ci0JICAgIHByaW50ZigiW2luaXQgVFNOOiAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJmluaXQtPmluaXRpYWxUU04pKTsKLQotI2lmKDApIC8qIEFMQyB5b3UgY2FuIGFkZCBjb2RlIGZvciBvcHRpb25hbCBwYXJhbXMgaGVyZSAqLwotCSAgICBpZiggKGluaXQrMSkgPCBjaHVua0VuZCApCi0JICAgICAgcHJpbnRmKCIgQEBAQEAgVU5GSU5JU0hFRCBAQEBAQEAlc1xuIiwKLQkJICAgICAiT3B0aW9uYWwgcGFyYW1zIHByZXNlbnQsIGJ1dCBub3QgcHJpbnRlZC4iKTsKLSNlbmRpZgotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIFNDVFBfSU5JVElBVElPTl9BQ0sgOgotCSAgewotCSAgICBjb25zdCBzdHJ1Y3Qgc2N0cEluaXRpYXRpb24gKmluaXQ7Ci0KLQkgICAgcHJpbnRmKCJbSU5JVCBBQ0tdICIpOwotCSAgICBpbml0PShjb25zdCBzdHJ1Y3Qgc2N0cEluaXRpYXRpb24qKShjaHVua0Rlc2NQdHIrMSk7Ci0JICAgIHByaW50ZigiW2luaXQgdGFnOiAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJmluaXQtPmluaXRUYWcpKTsKLQkgICAgcHJpbnRmKCJbcnduZDogJXVdICIsIEVYVFJBQ1RfMzJCSVRTKCZpbml0LT5yY3ZXaW5kb3dDcmVkaXQpKTsKLQkgICAgcHJpbnRmKCJbT1M6ICV1XSAiLCBFWFRSQUNUXzE2QklUUygmaW5pdC0+TnVtUHJlb3BlblN0cmVhbXMpKTsKLQkgICAgcHJpbnRmKCJbTUlTOiAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJmluaXQtPk1heEluYm91bmRTdHJlYW1zKSk7Ci0JICAgIHByaW50ZigiW2luaXQgVFNOOiAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJmluaXQtPmluaXRpYWxUU04pKTsKLQotI2lmKDApIC8qIEFMQyB5b3UgY2FuIGFkZCBjb2RlIGZvciBvcHRpb25hbCBwYXJhbXMgaGVyZSAqLwotCSAgICBpZiggKGluaXQrMSkgPCBjaHVua0VuZCApCi0JICAgICAgcHJpbnRmKCIgQEBAQEAgVU5GSU5JU0hFRCBAQEBAQEAlc1xuIiwKLQkJICAgICAiT3B0aW9uYWwgcGFyYW1zIHByZXNlbnQsIGJ1dCBub3QgcHJpbnRlZC4iKTsKLSNlbmRpZgotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIFNDVFBfU0VMRUNUSVZFX0FDSzoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHNjdHBTZWxlY3RpdmVBY2sgKnNhY2s7Ci0JICAgIGNvbnN0IHN0cnVjdCBzY3RwU2VsZWN0aXZlRnJhZyAqZnJhZzsKLQkgICAgaW50IGZyYWdObywgdHNuTm87Ci0JICAgIGNvbnN0IHVfY2hhciAqZHVwVFNOOwotCi0JICAgIHByaW50ZigiW1NBQ0tdICIpOwotCSAgICBzYWNrPShjb25zdCBzdHJ1Y3Qgc2N0cFNlbGVjdGl2ZUFjayopKGNodW5rRGVzY1B0cisxKTsKLQkgICAgcHJpbnRmKCJbY3VtIGFjayAldV0gIiwgRVhUUkFDVF8zMkJJVFMoJnNhY2stPmhpZ2hlc3RDb25zZXFUU04pKTsKLQkgICAgcHJpbnRmKCJbYV9yd25kICV1XSAiLCBFWFRSQUNUXzMyQklUUygmc2Fjay0+dXBkYXRlZFJ3bmQpKTsKLQkgICAgcHJpbnRmKCJbI2dhcCBhY2tzICV1XSAiLCBFWFRSQUNUXzE2QklUUygmc2Fjay0+bnVtYmVyT2ZkZXNjKSk7Ci0JICAgIHByaW50ZigiWyNkdXAgdHNucyAldV0gIiwgRVhUUkFDVF8xNkJJVFMoJnNhY2stPm51bUR1cFRzbnMpKTsKLQotCi0JICAgIC8qIHByaW50IGdhcHMgKi8KLQkgICAgZm9yIChmcmFnID0gKCAoY29uc3Qgc3RydWN0IHNjdHBTZWxlY3RpdmVGcmFnICopCi0JCQkgICgoY29uc3Qgc3RydWN0IHNjdHBTZWxlY3RpdmVBY2sgKikgc2FjaysxKSksCi0JCSAgIGZyYWdObz0wOwotCQkgKGNvbnN0IHZvaWQgKilmcmFnIDwgbmV4dENodW5rICYmIGZyYWdObyA8IEVYVFJBQ1RfMTZCSVRTKCZzYWNrLT5udW1iZXJPZmRlc2MpOwotCQkgZnJhZysrLCBmcmFnTm8rKykKLQkgICAgICBwcmludGYoIlxuXHRcdFtnYXAgYWNrIGJsb2NrICMlZDogc3RhcnQgPSAldSwgZW5kID0gJXVdICIsCi0JCSAgICAgZnJhZ05vKzEsCi0JCSAgICAgRVhUUkFDVF8zMkJJVFMoJnNhY2stPmhpZ2hlc3RDb25zZXFUU04pICsgRVhUUkFDVF8xNkJJVFMoJmZyYWctPmZyYWdtZW50U3RhcnQpLAotCQkgICAgIEVYVFJBQ1RfMzJCSVRTKCZzYWNrLT5oaWdoZXN0Q29uc2VxVFNOKSArIEVYVFJBQ1RfMTZCSVRTKCZmcmFnLT5mcmFnbWVudEVuZCkpOwotCi0KLQkgICAgLyogcHJpbnQgZHVwbGljYXRlIFRTTnMgKi8KLQkgICAgZm9yIChkdXBUU04gPSAoY29uc3QgdV9jaGFyICopZnJhZywgdHNuTm89MDsKLQkJIChjb25zdCB2b2lkICopIGR1cFRTTiA8IG5leHRDaHVuayAmJiB0c25ObzxFWFRSQUNUXzE2QklUUygmc2Fjay0+bnVtRHVwVHNucyk7Ci0JCSBkdXBUU04gKz0gNCwgdHNuTm8rKykKLQkgICAgICBwcmludGYoIlxuXHRcdFtkdXAgVFNOICMldTogJXVdICIsIHRzbk5vKzEsCi0JICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKGR1cFRTTikpOwotCi0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgU0NUUF9IRUFSVEJFQVRfUkVRVUVTVCA6Ci0JICB7Ci0JICAgIGNvbnN0IHN0cnVjdCBzY3RwSEJzZW5kZXIgKmhiOwotCi0JICAgIGhiPShjb25zdCBzdHJ1Y3Qgc2N0cEhCc2VuZGVyKiljaHVua0Rlc2NQdHI7Ci0KLQkgICAgcHJpbnRmKCJbSEIgUkVRXSAiKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIFNDVFBfSEVBUlRCRUFUX0FDSyA6Ci0JICBwcmludGYoIltIQiBBQ0tdICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ1RQX0FCT1JUX0FTU09DSUFUSU9OIDoKLQkgIHByaW50ZigiW0FCT1JUXSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgU0NUUF9TSFVURE9XTiA6Ci0JICBwcmludGYoIltTSFVURE9XTl0gIik7Ci0JICBicmVhazsKLQljYXNlIFNDVFBfU0hVVERPV05fQUNLIDoKLQkgIHByaW50ZigiW1NIVVRET1dOIEFDS10gIik7Ci0JICBicmVhazsKLQljYXNlIFNDVFBfT1BFUkFUSU9OX0VSUiA6Ci0JICBwcmludGYoIltPUCBFUlJdICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ1RQX0NPT0tJRV9FQ0hPIDoKLQkgIHByaW50ZigiW0NPT0tJRSBFQ0hPXSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgU0NUUF9DT09LSUVfQUNLIDoKLQkgIHByaW50ZigiW0NPT0tJRSBBQ0tdICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ1RQX0VDTl9FQ0hPIDoKLQkgIHByaW50ZigiW0VDTiBFQ0hPXSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgU0NUUF9FQ05fQ1dSIDoKLQkgIHByaW50ZigiW0VDTiBDV1JdICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ1RQX1NIVVRET1dOX0NPTVBMRVRFIDoKLQkgIHByaW50ZigiW1NIVVRET1dOIENPTVBMRVRFXSAiKTsKLQkgIGJyZWFrOwotCWNhc2UgU0NUUF9GT1JXQVJEX0NVTV9UU04gOgotCSAgcHJpbnRmKCJbRk9SIENVTSBUU05dICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ1RQX1JFTElBQkxFX0NOVEwgOgotCSAgcHJpbnRmKCJbUkVMIENUUkxdICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ1RQX1JFTElBQkxFX0NOVExfQUNLIDoKLQkgIHByaW50ZigiW1JFTCBDVFJMIEFDS10gIik7Ci0JICBicmVhazsKLQlkZWZhdWx0IDoKLQkgIHByaW50ZigiW1Vua25vd24gY2h1bmsgdHlwZTogMHgleF0iLCBjaHVua0Rlc2NQdHItPmNodW5rSUQpOwotCSAgcmV0dXJuOwotCX0KLQotCWlmICh2ZmxhZyA8IDIpCi0JICBzZXAgPSAiLCAoIjsKLSAgICB9Ci0gICAgcmV0dXJuOwotCi10cnVuYzoKLSAgICBwcmludGYoIlt8c2N0cF0iKTsKLSAgICByZXR1cm47Ci19CmRpZmYgLS1naXQgYS9wcmludC1zaXAuYyBiL3ByaW50LXNpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGQxM2IxLi4wMDAwMDAwCi0tLSBhL3ByaW50LXNpcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBPcmlnaW5hbCBjb2RlIGJ5IEhhbm5lcyBHcmVkbGVyIChoYW5uZXNAanVuaXBlci5uZXQpCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtc2lwLmMsdiAxLjEgMjAwNC8wNy8yNyAxNzowNDoyMCBoYW5uZXMgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaW5jbHVkZSAidWRwLmgiCi0KLXZvaWQKLXNpcF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnBwdHIsIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLSAgICB1X2ludCBpZHg7Ci0KLSAgICBwcmludGYoIlNJUCwgbGVuZ3RoOiAldSVzIiwgbGVuLCB2ZmxhZyA/ICJcblx0IiA6ICIiKTsKLQotICAgIC8qIGluIG5vbi12ZXJib3NlIG1vZGUganVzdCBsZXRzIHByaW50IHRoZSBwcm90b2NvbCBhbmQgbGVuZ3RoICovCi0gICAgaWYgKHZmbGFnIDwgMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBsZW47IGlkeCsrKSB7Ci0gICAgICAgIGlmIChFWFRSQUNUXzE2QklUUyhwcHRyK2lkeCkgIT0gMHgwZDBhKSB7IC8qIGxpbmVmZWVkID8gKi8KLSAgICAgICAgICAgIHNhZmVwdXRjaGFyKCoocHB0citpZHgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHByaW50ZigiXG5cdCIpOwotICAgICAgICAgICAgaWR4Kz0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZG8gd2Ugd2FudCB0byBzZWUgYW4gYWRkaXRpb25hbGx5IGhleGR1bXAgPyAqLwotICAgIGlmICh2ZmxhZz4gMSkKLSAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHBwdHIsIlxuXHQiLGxlbik7Ci0KLSAgICByZXR1cm47Ci19CmRpZmYgLS1naXQgYS9wcmludC1zbC5jIGIvcHJpbnQtc2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI4YTIxYS4uMDAwMDAwMAotLS0gYS9wcmludC1zbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zbC5jLHYgMS42NSAyMDA1LzA0LzA2IDIxOjMyOjQyIG1jciBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHBjYXAuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIJCQkvKiBtdXN0IGNvbWUgYWZ0ZXIgaW50ZXJmYWNlLmggKi8KLQotI2luY2x1ZGUgImlwLmgiCi0jaW5jbHVkZSAidGNwLmgiCi0jaW5jbHVkZSAic2xpcC5oIgotI2luY2x1ZGUgInNsY29tcHJlc3MuaCIKLQotc3RhdGljIHVfaW50IGxhc3RsZW5bMl1bMjU2XTsKLXN0YXRpYyB1X2ludCBsYXN0Y29ubiA9IDI1NTsKLQotc3RhdGljIHZvaWQgc2xpcGxpbmtfcHJpbnQoY29uc3QgdV9jaGFyICosIGNvbnN0IHN0cnVjdCBpcCAqLCB1X2ludCk7Ci1zdGF0aWMgdm9pZCBjb21wcmVzc2VkX3NsX3ByaW50KGNvbnN0IHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgaXAgKiwgdV9pbnQsIGludCk7Ci0KLXVfaW50Ci1zbF9pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlyZWdpc3RlciB1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXA7Ci0KLQlpZiAoY2FwbGVuIDwgU0xJUF9IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfHNsaXBdIik7Ci0JCXJldHVybiAoY2FwbGVuKTsKLQl9Ci0KLQlsZW5ndGggLT0gU0xJUF9IRFJMRU47Ci0KLQlpcCA9IChzdHJ1Y3QgaXAgKikocCArIFNMSVBfSERSTEVOKTsKLQotCWlmIChlZmxhZykKLQkJc2xpcGxpbmtfcHJpbnQocCwgaXAsIGxlbmd0aCk7Ci0KLQlzd2l0Y2ggKElQX1YoaXApKSB7Ci0JY2FzZSA0OgotCSAgICAgICAgaXBfcHJpbnQoZ25kbywgKHVfY2hhciAqKWlwLCBsZW5ndGgpOwotCQlicmVhazsKLSNpZmRlZiBJTkVUNgotCWNhc2UgNjoKLQkJaXA2X3ByaW50KCh1X2NoYXIgKilpcCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQlwcmludGYgKCJpcCB2JWQiLCBJUF9WKGlwKSk7Ci0JfQotCi0JcmV0dXJuIChTTElQX0hEUkxFTik7Ci19Ci0KLXVfaW50Ci1zbF9ic2Rvc19pZl9wcmludChjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcCkKLXsKLQlyZWdpc3RlciB1X2ludCBjYXBsZW4gPSBoLT5jYXBsZW47Ci0JcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXA7Ci0KLQlpZiAoY2FwbGVuIDwgU0xJUF9IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfHNsaXBdIik7Ci0JCXJldHVybiAoY2FwbGVuKTsKLQl9Ci0KLQlsZW5ndGggLT0gU0xJUF9IRFJMRU47Ci0KLQlpcCA9IChzdHJ1Y3QgaXAgKikocCArIFNMSVBfSERSTEVOKTsKLQotI2lmZGVmIG5vdGRlZgotCWlmIChlZmxhZykKLQkJc2xpcGxpbmtfcHJpbnQocCwgaXAsIGxlbmd0aCk7Ci0jZW5kaWYKLQotCWlwX3ByaW50KGduZG8sICh1X2NoYXIgKilpcCwgbGVuZ3RoKTsKLQotCXJldHVybiAoU0xJUF9IRFJMRU4pOwotfQotCi1zdGF0aWMgdm9pZAotc2xpcGxpbmtfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCByZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXAgKmlwLAotCSAgICAgICByZWdpc3RlciB1X2ludCBsZW5ndGgpCi17Ci0JaW50IGRpcjsKLQl1X2ludCBobGVuOwotCi0JZGlyID0gcFtTTFhfRElSXTsKLQlwdXRjaGFyKGRpciA9PSBTTElQRElSX0lOID8gJ0knIDogJ08nKTsKLQlwdXRjaGFyKCcgJyk7Ci0KLQlpZiAobmZsYWcpIHsKLQkJLyogWFhYIGp1c3QgZHVtcCB0aGUgaGVhZGVyICovCi0JCXJlZ2lzdGVyIGludCBpOwotCi0JCWZvciAoaSA9IFNMWF9DSERSOyBpIDwgU0xYX0NIRFIgKyBDSERSX0xFTiAtIDE7ICsraSkKLQkJCXByaW50ZigiJTAyeC4iLCBwW2ldKTsKLQkJcHJpbnRmKCIlMDJ4OiAiLCBwW1NMWF9DSERSICsgQ0hEUl9MRU4gLSAxXSk7Ci0JCXJldHVybjsKLQl9Ci0Jc3dpdGNoIChwW1NMWF9DSERSXSAmIDB4ZjApIHsKLQotCWNhc2UgVFlQRV9JUDoKLQkJcHJpbnRmKCJpcCAlZDogIiwgbGVuZ3RoICsgU0xJUF9IRFJMRU4pOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9VTkNPTVBSRVNTRURfVENQOgotCQkvKgotCQkgKiBUaGUgY29ubmVjdGlvbiBpZCBpcyBzdG9yZWQgaW4gdGhlIElQIHByb3RvY29sIGZpZWxkLgotCQkgKiBHZXQgaXQgZnJvbSB0aGUgbGluayBsYXllciBzaW5jZSBzbF91bmNvbXByZXNzX3RjcCgpCi0JCSAqIGhhcyByZXN0b3JlZCB0aGUgSVAgaGVhZGVyIGNvcHkgdG8gSVBQUk9UT19UQ1AuCi0JCSAqLwotCQlsYXN0Y29ubiA9ICgoc3RydWN0IGlwICopJnBbU0xYX0NIRFJdKS0+aXBfcDsKLQkJaGxlbiA9IElQX0hMKGlwKTsKLQkJaGxlbiArPSBUSF9PRkYoKHN0cnVjdCB0Y3BoZHIgKikmKChpbnQgKilpcClbaGxlbl0pOwotCQlsYXN0bGVuW2Rpcl1bbGFzdGNvbm5dID0gbGVuZ3RoIC0gKGhsZW4gPDwgMik7Ci0JCXByaW50ZigidXRjcCAlZDogIiwgbGFzdGNvbm4pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWlmIChwW1NMWF9DSERSXSAmIFRZUEVfQ09NUFJFU1NFRF9UQ1ApIHsKLQkJCWNvbXByZXNzZWRfc2xfcHJpbnQoJnBbU0xYX0NIRFJdLCBpcCwKLQkJCSAgICBsZW5ndGgsIGRpcik7Ci0JCQlwcmludGYoIjogIik7Ci0JCX0gZWxzZQotCQkJcHJpbnRmKCJzbGlwLSVkITogIiwgcFtTTFhfQ0hEUl0pOwotCX0KLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1wcmludF9zbF9jaGFuZ2UoY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwKQotewotCXJlZ2lzdGVyIHVfaW50IGk7Ci0KLQlpZiAoKGkgPSAqY3ArKykgPT0gMCkgewotCQlpID0gRVhUUkFDVF8xNkJJVFMoY3ApOwotCQljcCArPSAyOwotCX0KLQlwcmludGYoIiAlcyVkIiwgc3RyLCBpKTsKLQlyZXR1cm4gKGNwKTsKLX0KLQotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1wcmludF9zbF93aW5jaGFuZ2UocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcCkKLXsKLQlyZWdpc3RlciBzaG9ydCBpOwotCi0JaWYgKChpID0gKmNwKyspID09IDApIHsKLQkJaSA9IEVYVFJBQ1RfMTZCSVRTKGNwKTsKLQkJY3AgKz0gMjsKLQl9Ci0JaWYgKGkgPj0gMCkKLQkJcHJpbnRmKCIgVyslZCIsIGkpOwotCWVsc2UKLQkJcHJpbnRmKCIgVyVkIiwgaSk7Ci0JcmV0dXJuIChjcCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb21wcmVzc2VkX3NsX3ByaW50KGNvbnN0IHVfY2hhciAqY2hkciwgY29uc3Qgc3RydWN0IGlwICppcCwKLQkJICAgIHVfaW50IGxlbmd0aCwgaW50IGRpcikKLXsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmNwID0gY2hkcjsKLQlyZWdpc3RlciB1X2ludCBmbGFncywgaGxlbjsKLQotCWZsYWdzID0gKmNwKys7Ci0JaWYgKGZsYWdzICYgTkVXX0MpIHsKLQkJbGFzdGNvbm4gPSAqY3ArKzsKLQkJcHJpbnRmKCJjdGNwICVkIiwgbGFzdGNvbm4pOwotCX0gZWxzZQotCQlwcmludGYoImN0Y3AgKiIpOwotCi0JLyogc2tpcCB0Y3AgY2hlY2tzdW0gKi8KLQljcCArPSAyOwotCi0Jc3dpdGNoIChmbGFncyAmIFNQRUNJQUxTX01BU0spIHsKLQljYXNlIFNQRUNJQUxfSToKLQkJcHJpbnRmKCIgKlNBKyVkIiwgbGFzdGxlbltkaXJdW2xhc3Rjb25uXSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTUEVDSUFMX0Q6Ci0JCXByaW50ZigiICpTKyVkIiwgbGFzdGxlbltkaXJdW2xhc3Rjb25uXSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJaWYgKGZsYWdzICYgTkVXX1UpCi0JCQljcCA9IHByaW50X3NsX2NoYW5nZSgiVT0iLCBjcCk7Ci0JCWlmIChmbGFncyAmIE5FV19XKQotCQkJY3AgPSBwcmludF9zbF93aW5jaGFuZ2UoY3ApOwotCQlpZiAoZmxhZ3MgJiBORVdfQSkKLQkJCWNwID0gcHJpbnRfc2xfY2hhbmdlKCJBKyIsIGNwKTsKLQkJaWYgKGZsYWdzICYgTkVXX1MpCi0JCQljcCA9IHByaW50X3NsX2NoYW5nZSgiUysiLCBjcCk7Ci0JCWJyZWFrOwotCX0KLQlpZiAoZmxhZ3MgJiBORVdfSSkKLQkJY3AgPSBwcmludF9zbF9jaGFuZ2UoIkkrIiwgY3ApOwotCi0JLyoKLQkgKiAnaGxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgdW5jb21wcmVzc2VkIFRDUC9JUCBoZWFkZXIgKGluIHdvcmRzKS4KLQkgKiAnY3AgLSBjaGRyJyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGhlYWRlci4KLQkgKiAnbGVuZ3RoIC0gaGxlbicgaXMgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBwYWNrZXQuCi0JICovCi0JaGxlbiA9IElQX0hMKGlwKTsKLQlobGVuICs9IFRIX09GRigoc3RydWN0IHRjcGhkciAqKSYoKGludDMyX3QgKilpcClbaGxlbl0pOwotCWxhc3RsZW5bZGlyXVtsYXN0Y29ubl0gPSBsZW5ndGggLSAoaGxlbiA8PCAyKTsKLQlwcmludGYoIiAlZCAoJWxkKSIsIGxhc3RsZW5bZGlyXVtsYXN0Y29ubl0sIChsb25nKShjcCAtIGNoZHIpKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LXNsbC5jIGIvcHJpbnQtc2xsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MzVmNjUuLjAwMDAwMDAKLS0tIGEvcHJpbnQtc2xsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zbGwuYyx2IDEuMTYuMi4zIDIwMDUvMTEvMTMgMTI6MTM6MDAgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwY2FwLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaW5jbHVkZSAiZXRoZXIuaCIKLSNpbmNsdWRlICJzbGwuaCIKLQotY29uc3Qgc3RydWN0IHRvayBzbGxfcGt0dHlwZV92YWx1ZXNbXSA9IHsKLSAgICB7IExJTlVYX1NMTF9IT1NULCAiSW4iIH0sCi0gICAgeyBMSU5VWF9TTExfQlJPQURDQVNULCAiQiIgfSwKLSAgICB7IExJTlVYX1NMTF9NVUxUSUNBU1QsICJNIiB9LAotICAgIHsgTElOVVhfU0xMX09USEVSSE9TVCwgIlAiIH0sCi0gICAgeyBMSU5VWF9TTExfT1VUR09JTkcsICJPdXQiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIGlubGluZSB2b2lkCi1zbGxfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHNsbF9oZWFkZXIgKnNsbHAsIHVfaW50IGxlbmd0aCkKLXsKLQl1X3Nob3J0IGV0aGVyX3R5cGU7Ci0KLSAgICAgICAgcHJpbnRmKCIlM3MgIix0b2syc3RyKHNsbF9wa3R0eXBlX3ZhbHVlcywiPyIsRVhUUkFDVF8xNkJJVFMoJnNsbHAtPnNsbF9wa3R0eXBlKSkpOwotCi0JLyoKLQkgKiBYWFggLSBjaGVjayB0aGUgbGluay1sYXllciBhZGRyZXNzIHR5cGUgdmFsdWU/Ci0JICogRm9yIG5vdywgd2UganVzdCBhc3N1bWUgNiBtZWFucyBFdGhlcm5ldC4KLQkgKiBYWFggLSBwcmludCBvdGhlcnMgYXMgc3RyaW5ncyBvZiBoZXg/Ci0JICovCi0JaWYgKEVYVFJBQ1RfMTZCSVRTKCZzbGxwLT5zbGxfaGFsZW4pID09IDYpCi0JCSh2b2lkKXByaW50ZigiJXMgIiwgZXRoZXJhZGRyX3N0cmluZyhzbGxwLT5zbGxfYWRkcikpOwotCi0JaWYgKCFxZmxhZykgewotCQlldGhlcl90eXBlID0gRVhUUkFDVF8xNkJJVFMoJnNsbHAtPnNsbF9wcm90b2NvbCk7Ci0JCi0JCWlmIChldGhlcl90eXBlIDw9IEVUSEVSTVRVKSB7Ci0JCQkvKgotCQkJICogTm90IGFuIEV0aGVybmV0IHR5cGU7IHdoYXQgdHlwZSBpcyBpdD8KLQkJCSAqLwotCQkJc3dpdGNoIChldGhlcl90eXBlKSB7Ci0KLQkJCWNhc2UgTElOVVhfU0xMX1BfODAyXzM6Ci0JCQkJLyoKLQkJCQkgKiBFdGhlcm5ldF84MDIuMyBJUFggZnJhbWUuCi0JCQkJICovCi0JCQkJKHZvaWQpcHJpbnRmKCI4MDIuMyIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIExJTlVYX1NMTF9QXzgwMl8yOgotCQkJCS8qCi0JCQkJICogODAyLjIuCi0JCQkJICovCi0JCQkJKHZvaWQpcHJpbnRmKCI4MDIuMyIpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCS8qCi0JCQkJICogV2hhdCBpcyBpdD8KLQkJCQkgKi8KLQkJCQkodm9pZClwcmludGYoImV0aGVydHlwZSBVbmtub3duICgweCUwNHgpIiwKLQkJCQkgICAgZXRoZXJfdHlwZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkodm9pZClwcmludGYoImV0aGVydHlwZSAlcyAoMHglMDR4KSIsCi0JCQkgICAgdG9rMnN0cihldGhlcnR5cGVfdmFsdWVzLCAiVW5rbm93biIsIGV0aGVyX3R5cGUpLAotCQkJICAgIGV0aGVyX3R5cGUpOwotCQl9Ci0JCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Ci0JfQotfQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzIHRvIHRoZQotICogTGludXggImNvb2tlZCBjYXB0dXJlIiBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotc2xsX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQotewotCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQl1X2ludCBsZW5ndGggPSBoLT5sZW47Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHNsbF9oZWFkZXIgKnNsbHA7Ci0JdV9zaG9ydCBldGhlcl90eXBlOwotCXVfc2hvcnQgZXh0cmFjdGVkX2V0aGVydHlwZTsKLQotCWlmIChjYXBsZW4gPCBTTExfSERSX0xFTikgewotCQkvKgotCQkgKiBYWFggLSB0aGlzICJjYW4ndCBoYXBwZW4iIGJlY2F1c2UgInBjYXAtbGludXguYyIgYWx3YXlzCi0JCSAqIGFkZHMgdGhpcyBtYW55IGJ5dGVzIG9mIGhlYWRlciB0byBldmVyeSBwYWNrZXQgaW4gYQotCQkgKiBjb29rZWQgc29ja2V0IGNhcHR1cmUuCi0JCSAqLwotCQlwcmludGYoIlt8c2xsXSIpOwotCQlyZXR1cm4gKGNhcGxlbik7Ci0JfQotCi0Jc2xscCA9IChjb25zdCBzdHJ1Y3Qgc2xsX2hlYWRlciAqKXA7Ci0KLQlpZiAoZWZsYWcpCi0JCXNsbF9wcmludChzbGxwLCBsZW5ndGgpOwotCi0JLyoKLQkgKiBHbyBwYXN0IHRoZSBjb29rZWQtbW9kZSBoZWFkZXIuCi0JICovCi0JbGVuZ3RoIC09IFNMTF9IRFJfTEVOOwotCWNhcGxlbiAtPSBTTExfSERSX0xFTjsKLQlwICs9IFNMTF9IRFJfTEVOOwotCi0JZXRoZXJfdHlwZSA9IG50b2hzKHNsbHAtPnNsbF9wcm90b2NvbCk7Ci0KLQkvKgotCSAqIElzIGl0IChnYWcpIGFuIDgwMi4zIGVuY2Fwc3VsYXRpb24sIG9yIHNvbWUgbm9uLUV0aGVybmV0Ci0JICogcGFja2V0IHR5cGU/Ci0JICovCi0JaWYgKGV0aGVyX3R5cGUgPD0gRVRIRVJNVFUpIHsKLQkJLyoKLQkJICogWWVzIC0gd2hhdCB0eXBlIGlzIGl0PwotCQkgKi8KLQkJc3dpdGNoIChldGhlcl90eXBlKSB7Ci0KLQkJY2FzZSBMSU5VWF9TTExfUF84MDJfMzoKLQkJCS8qCi0JCQkgKiBFdGhlcm5ldF84MDIuMyBJUFggZnJhbWUuCi0JCQkgKi8KLQkJCWlweF9wcmludChwLCBsZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBMSU5VWF9TTExfUF84MDJfMjoKLQkJCS8qCi0JCQkgKiA4MDIuMi4KLQkJCSAqIFRyeSB0byBwcmludCB0aGUgTExDLWxheWVyIGhlYWRlciAmIGhpZ2hlciBsYXllcnMuCi0JCQkgKi8KLQkJCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIE5VTEwsIE5VTEwsCi0JCQkgICAgJmV4dHJhY3RlZF9ldGhlcnR5cGUpID09IDApCi0JCQkJZ290byB1bmtub3duOwkvKiB1bmtub3duIExMQyB0eXBlICovCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZXh0cmFjdGVkX2V0aGVydHlwZSA9IDA7Ci0JCQkvKkZBTExUSFJPVUdIKi8KLQotCQl1bmtub3duOgotCQkJLyogZXRoZXJfdHlwZSBub3Qga25vd24sIHByaW50IHJhdyBwYWNrZXQgKi8KLQkJCWlmICghZWZsYWcpCi0JCQkJc2xsX3ByaW50KHNsbHAsIGxlbmd0aCArIFNMTF9IRFJfTEVOKTsKLQkJCWlmIChleHRyYWN0ZWRfZXRoZXJ0eXBlKSB7Ci0JCQkJcHJpbnRmKCIoTExDICVzKSAiLAotCQkJICAgICAgIGV0aGVycHJvdG9fc3RyaW5nKGh0b25zKGV4dHJhY3RlZF9ldGhlcnR5cGUpKSk7Ci0JCQl9Ci0JCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKGV0aGVyX2VuY2FwX3ByaW50KGV0aGVyX3R5cGUsIHAsIGxlbmd0aCwgY2FwbGVuLAotCSAgICAmZXh0cmFjdGVkX2V0aGVydHlwZSkgPT0gMCkgewotCQkvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJpbnQgcmF3IHBhY2tldCAqLwotCQlpZiAoIWVmbGFnKQotCQkJc2xsX3ByaW50KHNsbHAsIGxlbmd0aCArIFNMTF9IRFJfTEVOKTsKLQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCX0KLQotCXJldHVybiAoU0xMX0hEUl9MRU4pOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtc2xvdy5jIGIvcHJpbnQtc2xvdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjA5OTIyLi4wMDAwMDAwCi0tLSBhL3ByaW50LXNsb3cuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIFRDUERVTVAgcHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBzdXBwb3J0IGZvciB0aGUgSUVFRSAic2xvdyBwcm90b2NvbHMiIExBQ1AsIE1BUktFUiBhcyBwZXIgODAyLjNhZAotICoKLSAqIE9yaWdpbmFsIGNvZGUgYnkgSGFubmVzIEdyZWRsZXIgKGhhbm5lc0BqdW5pcGVyLm5ldCkKLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zbG93LmMsdiAxLjEuMi4xIDIwMDUvMDcvMTAgMTQ6NDc6NTYgaGFubmVzIEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXIuaCIKLQotc3RydWN0IHNsb3dfY29tbW9uX2hlYWRlciB7Ci0gICAgdV9pbnQ4X3QgcHJvdG9fc3VidHlwZTsKLSAgICB1X2ludDhfdCB2ZXJzaW9uOwotfTsKLQotI2RlZmluZQlTTE9XX1BST1RPX0xBQ1AgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCVNMT1dfUFJPVE9fTUFSS0VSICAgICAgICAgICAgICAgICAgIDIKLQotI2RlZmluZQlMQUNQX1ZFUlNJT04gICAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lCU1BUktFUl9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgIDEKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgc2xvd19wcm90b192YWx1ZXNbXSA9IHsKLSAgICB7IFNMT1dfUFJPVE9fTEFDUCwgIkxBQ1AiIH0sCi0gICAgeyBTTE9XX1BST1RPX01BUktFUiwgIk1BUktFUiIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgdGx2X2hlYWRlcl90IHsKLSAgICB1X2ludDhfdCB0eXBlOwotICAgIHVfaW50OF90IGxlbmd0aDsKLX07Ci0KLSNkZWZpbmUgTEFDUF9UTFZfVEVSTUlOQVRPUiAgICAgMHgwMAotI2RlZmluZSBMQUNQX1RMVl9BQ1RPUl9JTkZPICAgICAweDAxCi0jZGVmaW5lIExBQ1BfVExWX1BBUlRORVJfSU5GTyAgIDB4MDIKLSNkZWZpbmUgTEFDUF9UTFZfQ09MTEVDVE9SX0lORk8gMHgwMwotCi0jZGVmaW5lIE1BUktFUl9UTFZfVEVSTUlOQVRPUiAgIDB4MDAKLSNkZWZpbmUgTUFSS0VSX1RMVl9NQVJLRVJfSU5GTyAgMHgwMQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBzbG93X3Rsdl92YWx1ZXNbXSA9IHsKLSAgICB7IChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9URVJNSU5BVE9SLCAiVGVybWluYXRvciJ9LAotICAgIHsgKFNMT1dfUFJPVE9fTEFDUCA8PCA4KSArIExBQ1BfVExWX0FDVE9SX0lORk8sICJBY3RvciBJbmZvcm1hdGlvbiJ9LAotICAgIHsgKFNMT1dfUFJPVE9fTEFDUCA8PCA4KSArIExBQ1BfVExWX1BBUlRORVJfSU5GTywgIlBhcnRuZXIgSW5mb3JtYXRpb24ifSwKLSAgICB7IChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9DT0xMRUNUT1JfSU5GTywgIkNvbGxlY3RvciBJbmZvcm1hdGlvbiJ9LAotCi0gICAgeyAoU0xPV19QUk9UT19NQVJLRVIgPDwgOCkgKyBNQVJLRVJfVExWX1RFUk1JTkFUT1IsICJUZXJtaW5hdG9yIn0sCi0gICAgeyAoU0xPV19QUk9UT19NQVJLRVIgPDwgOCkgKyBNQVJLRVJfVExWX01BUktFUl9JTkZPLCAiTWFya2VyIEluZm9ybWF0aW9uIn0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RydWN0IGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb190IHsKLSAgICB1X2ludDhfdCBzeXNfcHJpWzJdOwotICAgIHVfaW50OF90IHN5c1tFVEhFUl9BRERSX0xFTl07Ci0gICAgdV9pbnQ4X3Qga2V5WzJdOwotICAgIHVfaW50OF90IHBvcnRfcHJpWzJdOwotICAgIHVfaW50OF90IHBvcnRbMl07Ci0gICAgdV9pbnQ4X3Qgc3RhdGU7Ci0gICAgdV9pbnQ4X3QgcGFkWzNdOwotfTsgICAgICAgICAgCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb19zdGF0ZV92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDEsICJBY3Rpdml0eSJ9LAotICAgIHsgMHgwMiwgIlRpbWVvdXQifSwKLSAgICB7IDB4MDQsICJBZ2dyZWdhdGlvbiJ9LAotICAgIHsgMHgwOCwgIlN5bmNocm9uaXphdGlvbiJ9LAotICAgIHsgMHgxMCwgIkNvbGxlY3RpbmcifSwKLSAgICB7IDB4MjAsICJEaXN0cmlidXRpbmcifSwKLSAgICB7IDB4NDAsICJEZWZhdWx0In0sCi0gICAgeyAweDgwLCAiRXhwaXJlZCJ9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0cnVjdCBsYWNwX3Rsdl9jb2xsZWN0b3JfaW5mb190IHsKLSAgICB1X2ludDhfdCBtYXhfZGVsYXlbMl07Ci0gICAgdV9pbnQ4X3QgcGFkWzEyXTsKLX07IAotCi1zdHJ1Y3QgbWFya2VyX3Rsdl9tYXJrZXJfaW5mb190IHsKLSAgICB1X2ludDhfdCByZXFfcG9ydFsyXTsKLSAgICB1X2ludDhfdCByZXFfc3lzW0VUSEVSX0FERFJfTEVOXTsKLSAgICB1X2ludDhfdCByZXFfdHJhbnNfaWRbNF07Ci0gICAgdV9pbnQ4X3QgcGFkWzJdOwotfTsgCi0KLXN0cnVjdCBsYWNwX21hcmtlcl90bHZfdGVybWluYXRvcl90IHsKLSAgICB1X2ludDhfdCBwYWRbNTBdOwotfTsgCi0KLXZvaWQKLXNsb3dfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwcHRyLCByZWdpc3RlciB1X2ludCBsZW4pIHsKLQotICAgIGNvbnN0IHN0cnVjdCBzbG93X2NvbW1vbl9oZWFkZXIgKnNsb3dfY29tX2hlYWRlcjsKLSAgICBjb25zdCBzdHJ1Y3QgdGx2X2hlYWRlcl90ICp0bHZfaGVhZGVyOwotICAgIGNvbnN0IHVfY2hhciAqdHB0ciwqdGx2X3RwdHI7Ci0gICAgdV9pbnQgdGx2X2xlbix0bGVuLHRsdl90bGVuOwotCi0gICAgdW5pb24gewotICAgICAgICBjb25zdCBzdHJ1Y3QgbGFjcF9tYXJrZXJfdGx2X3Rlcm1pbmF0b3JfdCAqbGFjcF9tYXJrZXJfdGx2X3Rlcm1pbmF0b3I7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBsYWNwX3Rsdl9hY3Rvcl9wYXJ0bmVyX2luZm9fdCAqbGFjcF90bHZfYWN0b3JfcGFydG5lcl9pbmZvOwotICAgICAgICBjb25zdCBzdHJ1Y3QgbGFjcF90bHZfY29sbGVjdG9yX2luZm9fdCAqbGFjcF90bHZfY29sbGVjdG9yX2luZm87Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBtYXJrZXJfdGx2X21hcmtlcl9pbmZvX3QgKm1hcmtlcl90bHZfbWFya2VyX2luZm87Ci0gICAgfSB0bHZfcHRyOwotCi0gICAgdHB0cj1wcHRyOwotICAgIHNsb3dfY29tX2hlYWRlciA9IChjb25zdCBzdHJ1Y3Qgc2xvd19jb21tb25faGVhZGVyICopcHB0cjsKLSAgICBUQ0hFQ0soKnNsb3dfY29tX2hlYWRlcik7Ci0KLSAgICAvKgotICAgICAqIFNhbml0eSBjaGVja2luZyBvZiB0aGUgaGVhZGVyLgotICAgICAqLwotICAgIGlmIChzbG93X2NvbV9oZWFkZXItPnByb3RvX3N1YnR5cGUgPT0gU0xPV19QUk9UT19MQUNQICYmCi0gICAgICAgIHNsb3dfY29tX2hlYWRlci0+dmVyc2lvbiAhPSBMQUNQX1ZFUlNJT04pIHsKLQlwcmludGYoIkxBQ1AgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsc2xvd19jb21faGVhZGVyLT52ZXJzaW9uKTsKLQlyZXR1cm47Ci0gICAgfQotICAgIGlmIChzbG93X2NvbV9oZWFkZXItPnByb3RvX3N1YnR5cGUgPT0gU0xPV19QUk9UT19NQVJLRVIgJiYKLSAgICAgICAgc2xvd19jb21faGVhZGVyLT52ZXJzaW9uICE9IE1BUktFUl9WRVJTSU9OKSB7Ci0JcHJpbnRmKCJNQVJLRVIgdmVyc2lvbiAldSBwYWNrZXQgbm90IHN1cHBvcnRlZCIsc2xvd19jb21faGVhZGVyLT52ZXJzaW9uKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgcHJpbnRmKCIlc3YldSwgbGVuZ3RoOiAldSIsCi0gICAgICAgICAgIHRvazJzdHIoc2xvd19wcm90b192YWx1ZXMsICJ1bmtub3duICgldSkiLHNsb3dfY29tX2hlYWRlci0+cHJvdG9fc3VidHlwZSksCi0gICAgICAgICAgIHNsb3dfY29tX2hlYWRlci0+dmVyc2lvbiwKLSAgICAgICAgICAgbGVuKTsKLQotICAgIGlmICghdmZsYWcpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIG9rIHRoZXkgc2VlbSB0byB3YW50IHRvIGtub3cgZXZlcnl0aGluZyAtIGxldHMgZnVsbHkgZGVjb2RlIGl0ICovCi0gICAgdGxlbj1sZW4tc2l6ZW9mKHN0cnVjdCBzbG93X2NvbW1vbl9oZWFkZXIpOwotICAgIHRwdHIrPXNpemVvZihjb25zdCBzdHJ1Y3Qgc2xvd19jb21tb25faGVhZGVyKTsKLQotICAgIHdoaWxlKHRsZW4+MCkgewotICAgICAgICAvKiBkaWQgd2UgY2FwdHVyZSBlbm91Z2ggZm9yIGZ1bGx5IGRlY29kaW5nIHRoZSB0bHYgaGVhZGVyID8gKi8KLSAgICAgICAgVENIRUNLMigqdHB0ciwgc2l6ZW9mKHN0cnVjdCB0bHZfaGVhZGVyX3QpKTsKLSAgICAgICAgdGx2X2hlYWRlciA9IChjb25zdCBzdHJ1Y3QgdGx2X2hlYWRlcl90ICopdHB0cjsKLSAgICAgICAgdGx2X2xlbiA9IHRsdl9oZWFkZXItPmxlbmd0aDsKLQotICAgICAgICBwcmludGYoIlxuXHQlcyBUTFYgKDB4JTAyeCksIGxlbmd0aDogJXUiLAotICAgICAgICAgICAgICAgdG9rMnN0cihzbG93X3Rsdl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHNsb3dfY29tX2hlYWRlci0+cHJvdG9fc3VidHlwZSA8PCA4KSArIHRsdl9oZWFkZXItPnR5cGUpLAotICAgICAgICAgICAgICAgdGx2X2hlYWRlci0+dHlwZSwKLSAgICAgICAgICAgICAgIHRsdl9sZW4pOwotCi0gICAgICAgIGlmICgodGx2X2xlbiA8IHNpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KSB8fAotICAgICAgICAgICAgdGx2X2xlbiA+IHRsZW4pICYmCi0gICAgICAgICAgICB0bHZfaGVhZGVyLT50eXBlICE9IExBQ1BfVExWX1RFUk1JTkFUT1IgJiYKLSAgICAgICAgICAgIHRsdl9oZWFkZXItPnR5cGUgIT0gTUFSS0VSX1RMVl9URVJNSU5BVE9SKSB7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHQtLS0tLXRyYWlsaW5nIGRhdGEtLS0tLSIpOwotICAgICAgICAgICAgcHJpbnRfdW5rbm93bl9kYXRhKHRwdHIrc2l6ZW9mKHNpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KSksIlxuXHQgICIsdGxlbik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICB0bHZfdHB0cj10cHRyK3NpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KTsKLSAgICAgICAgdGx2X3RsZW49dGx2X2xlbi1zaXplb2Yoc3RydWN0IHRsdl9oZWFkZXJfdCk7Ci0KLSAgICAgICAgLyogZGlkIHdlIGNhcHR1cmUgZW5vdWdoIGZvciBmdWxseSBkZWNvZGluZyB0aGUgdGx2ID8gKi8KLSAgICAgICAgVENIRUNLMigqdHB0ciwgdGx2X2xlbik7Ci0KLSAgICAgICAgc3dpdGNoKChzbG93X2NvbV9oZWFkZXItPnByb3RvX3N1YnR5cGUgPDwgOCkgKyB0bHZfaGVhZGVyLT50eXBlKSB7Ci0KLSAgICAgICAgICAgIC8qIHRob3NlIHR3byBUTFZzIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIC0+IGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlICgoU0xPV19QUk9UT19MQUNQIDw8IDgpICsgTEFDUF9UTFZfQUNUT1JfSU5GTyk6Ci0gICAgICAgIGNhc2UgKChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9QQVJUTkVSX0lORk8pOgotICAgICAgICAgICAgdGx2X3B0ci5sYWNwX3Rsdl9hY3Rvcl9wYXJ0bmVyX2luZm8gPSAoY29uc3Qgc3RydWN0IGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb190ICopdGx2X3RwdHI7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgU3lzdGVtICVzLCBTeXN0ZW0gUHJpb3JpdHkgJXUsIEtleSAldSIgXAotICAgICAgICAgICAgICAgICAgICIsIFBvcnQgJXUsIFBvcnQgUHJpb3JpdHkgJXVcblx0ICBTdGF0ZSBGbGFncyBbJXNdIiwKLSAgICAgICAgICAgICAgICAgICBldGhlcmFkZHJfc3RyaW5nKHRsdl9wdHIubGFjcF90bHZfYWN0b3JfcGFydG5lcl9pbmZvLT5zeXMpLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRsdl9wdHIubGFjcF90bHZfYWN0b3JfcGFydG5lcl9pbmZvLT5zeXNfcHJpKSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mby0+a2V5KSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLmxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mby0+cG9ydCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8xNkJJVFModGx2X3B0ci5sYWNwX3Rsdl9hY3Rvcl9wYXJ0bmVyX2luZm8tPnBvcnRfcHJpKSwKLSAgICAgICAgICAgICAgICAgICBiaXR0b2syc3RyKGxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mb19zdGF0ZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfcHRyLmxhY3BfdGx2X2FjdG9yX3BhcnRuZXJfaW5mby0+c3RhdGUpKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoKFNMT1dfUFJPVE9fTEFDUCA8PCA4KSArIExBQ1BfVExWX0NPTExFQ1RPUl9JTkZPKToKLSAgICAgICAgICAgIHRsdl9wdHIubGFjcF90bHZfY29sbGVjdG9yX2luZm8gPSAoY29uc3Qgc3RydWN0IGxhY3BfdGx2X2NvbGxlY3Rvcl9pbmZvX3QgKil0bHZfdHB0cjsKLQotICAgICAgICAgICAgcHJpbnRmKCJcblx0ICBNYXggRGVsYXkgJXUiLAotICAgICAgICAgICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKHRsdl9wdHIubGFjcF90bHZfY29sbGVjdG9yX2luZm8tPm1heF9kZWxheSkpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICgoU0xPV19QUk9UT19NQVJLRVIgPDwgOCkgKyBNQVJLRVJfVExWX01BUktFUl9JTkZPKToKLSAgICAgICAgICAgIHRsdl9wdHIubWFya2VyX3Rsdl9tYXJrZXJfaW5mbyA9IChjb25zdCBzdHJ1Y3QgbWFya2VyX3Rsdl9tYXJrZXJfaW5mb190ICopdGx2X3RwdHI7Ci0KLSAgICAgICAgICAgIHByaW50ZigiXG5cdCAgUmVxdWVzdCBTeXN0ZW0gJXMsIFJlcXVlc3QgUG9ydCAldSwgUmVxdWVzdCBUcmFuc2FjdGlvbiBJRCAweCUwOHgiLAotICAgICAgICAgICAgICAgICAgIGV0aGVyYWRkcl9zdHJpbmcodGx2X3B0ci5tYXJrZXJfdGx2X21hcmtlcl9pbmZvLT5yZXFfc3lzKSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzE2QklUUyh0bHZfcHRyLm1hcmtlcl90bHZfbWFya2VyX2luZm8tPnJlcV9wb3J0KSwKLSAgICAgICAgICAgICAgICAgICBFWFRSQUNUXzMyQklUUyh0bHZfcHRyLm1hcmtlcl90bHZfbWFya2VyX2luZm8tPnJlcV90cmFuc19pZCkpOwotCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLyogdGhvc2UgdHdvIFRMVnMgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUgLT4gZmFsbCB0aHJvdWdoICovCi0gICAgICAgIGNhc2UgKChTTE9XX1BST1RPX0xBQ1AgPDwgOCkgKyBMQUNQX1RMVl9URVJNSU5BVE9SKToKLSAgICAgICAgY2FzZSAoKFNMT1dfUFJPVE9fTUFSS0VSIDw8IDgpICsgTEFDUF9UTFZfVEVSTUlOQVRPUik6Ci0gICAgICAgICAgICB0bHZfcHRyLmxhY3BfbWFya2VyX3Rsdl90ZXJtaW5hdG9yID0gKGNvbnN0IHN0cnVjdCBsYWNwX21hcmtlcl90bHZfdGVybWluYXRvcl90ICopdGx2X3RwdHI7Ci0gICAgICAgICAgICBpZiAodGx2X2xlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGx2X2xlbiA9IHNpemVvZih0bHZfcHRyLmxhY3BfbWFya2VyX3Rsdl90ZXJtaW5hdG9yLT5wYWQpICsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCB0bHZfaGVhZGVyX3QpOwotICAgICAgICAgICAgICAgIC8qIHRlbGwgdGhlIHVzZXIgdGhhdCB3ZSBtb2RpZmllZCB0aGUgbGVuZ3RoIGZpZWxkICAqLwotICAgICAgICAgICAgICAgIGlmICh2ZmxhZz4xKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAoPSV1KSIsdGx2X2xlbik7Ci0gICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBtZXNzZWQgYXJvdW5kIHdpdGggdGhlIGxlbmd0aCBmaWVsZCAtIG5vdyB3ZSBuZWVkIHRvIGNoZWNrCi0gICAgICAgICAgICAgICAgICogYWdhaW4gaWYgdGhlcmUgYXJlIGVub3VnaCBieXRlcyBvbiB0aGUgd2lyZSBmb3IgdGhlIGhleGR1bXAgKi8KLSAgICAgICAgICAgICAgICBUQ0hFQ0syKHRsdl9wdHIubGFjcF9tYXJrZXJfdGx2X3Rlcm1pbmF0b3ItPnBhZFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0bHZfcHRyLmxhY3BfbWFya2VyX3Rsdl90ZXJtaW5hdG9yLT5wYWQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICh2ZmxhZyA8PSAxKQotICAgICAgICAgICAgICAgIHByaW50X3Vua25vd25fZGF0YSh0bHZfdHB0ciwiXG5cdCAgIix0bHZfdGxlbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBkbyB3ZSB3YW50IHRvIHNlZSBhbiBhZGRpdGlvbmFsbHkgaGV4ZHVtcCA/ICovCi0gICAgICAgIGlmICh2ZmxhZyA+IDEpCi0gICAgICAgICAgICBwcmludF91bmtub3duX2RhdGEodHB0citzaXplb2Yoc2l6ZW9mKHN0cnVjdCB0bHZfaGVhZGVyX3QpKSwiXG5cdCAgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bHZfbGVuLXNpemVvZihzdHJ1Y3QgdGx2X2hlYWRlcl90KSk7Ci0KLSAgICAgICAgdHB0cis9dGx2X2xlbjsKLSAgICAgICAgdGxlbi09dGx2X2xlbjsKLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJcblx0XHQgcGFja2V0IGV4Y2VlZGVkIHNuYXBzaG90Iik7Ci19CmRpZmYgLS1naXQgYS9wcmludC1zbWIuYyBiL3ByaW50LXNtYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjk2M2RlLi4wMDAwMDAwCi0tLSBhL3ByaW50LXNtYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMTk5NS0xOTk5Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgYWNjb21wYW5pZXMgdGNwZHVtcCBvciB0aGUgR05VIEdQTCB2ZXJzaW9uIDIKLSAqIG9yIGxhdGVyCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtc21iLmMsdiAxLjQxLjIuNCAyMDA3LzA3LzE0IDIyOjI5OjA1IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotI2luY2x1ZGUgInNtYi5oIgotCi1zdGF0aWMgaW50IHJlcXVlc3QgPSAwOwotc3RhdGljIGludCB1bmljb2Rlc3RyID0gMDsKLQotY29uc3QgdV9jaGFyICpzdGFydGJ1ZiA9IE5VTEw7Ci0KLXN0cnVjdCBzbWJkZXNjcmlwdCB7Ci0gICAgY29uc3QgY2hhciAqcmVxX2YxOwotICAgIGNvbnN0IGNoYXIgKnJlcV9mMjsKLSAgICBjb25zdCBjaGFyICpyZXBfZjE7Ci0gICAgY29uc3QgY2hhciAqcmVwX2YyOwotICAgIHZvaWQgKCpmbikoY29uc3QgdV9jaGFyICosIGNvbnN0IHVfY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICopOwotfTsKLQotc3RydWN0IHNtYmRlc2NyaXB0aW50IHsKLSAgICBjb25zdCBjaGFyICpyZXFfZjE7Ci0gICAgY29uc3QgY2hhciAqcmVxX2YyOwotICAgIGNvbnN0IGNoYXIgKnJlcF9mMTsKLSAgICBjb25zdCBjaGFyICpyZXBfZjI7Ci0gICAgdm9pZCAoKmZuKShjb25zdCB1X2NoYXIgKiwgY29uc3QgdV9jaGFyICosIGludCwgaW50KTsKLX07Ci0KLXN0cnVjdCBzbWJmbnMKLXsKLSAgICBpbnQgaWQ7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBpbnQgZmxhZ3M7Ci0gICAgc3RydWN0IHNtYmRlc2NyaXB0IGRlc2NyaXB0OwotfTsKLQotc3RydWN0IHNtYmZuc2ludAotewotICAgIGludCBpZDsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGludCBmbGFnczsKLSAgICBzdHJ1Y3Qgc21iZGVzY3JpcHRpbnQgZGVzY3JpcHQ7Ci19OwotCi0jZGVmaW5lIERFRkRFU0NSSVBUCXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9Ci0KLSNkZWZpbmUgRkxHX0NIQUlOCSgxIDw8IDApCi0KLXN0YXRpYyBzdHJ1Y3Qgc21iZm5zICoKLXNtYmZpbmQoaW50IGlkLCBzdHJ1Y3Qgc21iZm5zICpsaXN0KQotewotICAgIGludCBzaW5kZXg7Ci0KLSAgICBmb3IgKHNpbmRleCA9IDA7IGxpc3Rbc2luZGV4XS5uYW1lOyBzaW5kZXgrKykKLQlpZiAobGlzdFtzaW5kZXhdLmlkID09IGlkKQotCSAgICByZXR1cm4oJmxpc3Rbc2luZGV4XSk7Ci0KLSAgICByZXR1cm4oJmxpc3RbMF0pOwotfQotCi1zdGF0aWMgc3RydWN0IHNtYmZuc2ludCAqCi1zbWJmaW5kaW50KGludCBpZCwgc3RydWN0IHNtYmZuc2ludCAqbGlzdCkKLXsKLSAgICBpbnQgc2luZGV4OwotCi0gICAgZm9yIChzaW5kZXggPSAwOyBsaXN0W3NpbmRleF0ubmFtZTsgc2luZGV4KyspCi0JaWYgKGxpc3Rbc2luZGV4XS5pZCA9PSBpZCkKLQkgICAgcmV0dXJuKCZsaXN0W3NpbmRleF0pOwotCi0gICAgcmV0dXJuKCZsaXN0WzBdKTsKLX0KLQotc3RhdGljIHZvaWQKLXRyYW5zMl9maW5kZmlyc3QoY29uc3QgdV9jaGFyICpwYXJhbSwgY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgcGNudCwgaW50IGRjbnQpCi17Ci0gICAgY29uc3QgY2hhciAqZm10OwotCi0gICAgaWYgKHJlcXVlc3QpCi0JZm10ID0gIkF0dHJpYnV0ZT1bQV1cblNlYXJjaENvdW50PVtkXVxuRmxhZ3M9W3ddXG5MZXZlbD1bZFA0XVxuRmlsZT1bU11cbiI7Ci0gICAgZWxzZQotCWZtdCA9ICJIYW5kbGU9W3ddXG5Db3VudD1bZF1cbkVPUz1bd11cbkVvZmZzZXQ9W2RdXG5MYXN0TmFtZU9mcz1bd11cbiI7Ci0KLSAgICBzbWJfZmRhdGEocGFyYW0sIGZtdCwgcGFyYW0gKyBwY250LCB1bmljb2Rlc3RyKTsKLSAgICBpZiAoZGNudCkgewotCXByaW50ZigiZGF0YTpcbiIpOwotCXByaW50X2RhdGEoZGF0YSwgZGNudCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotdHJhbnMyX3Fmc2luZm8oY29uc3QgdV9jaGFyICpwYXJhbSwgY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgcGNudCwgaW50IGRjbnQpCi17Ci0gICAgc3RhdGljIGludCBsZXZlbCA9IDA7Ci0gICAgY29uc3QgY2hhciAqZm10PSIiOwotCi0gICAgaWYgKHJlcXVlc3QpIHsKLQlUQ0hFQ0syKCpwYXJhbSwgMik7Ci0JbGV2ZWwgPSBFWFRSQUNUX0xFXzE2QklUUyhwYXJhbSk7Ci0JZm10ID0gIkluZm9MZXZlbD1bZF1cbiI7Ci0Jc21iX2ZkYXRhKHBhcmFtLCBmbXQsIHBhcmFtICsgcGNudCwgdW5pY29kZXN0cik7Ci0gICAgfSBlbHNlIHsKLQlzd2l0Y2ggKGxldmVsKSB7Ci0JY2FzZSAxOgotCSAgICBmbXQgPSAiaWRGaWxlU3lzdGVtPVtXXVxuU2VjdG9yVW5pdD1bRF1cblVuaXQ9W0RdXG5BdmFpbD1bRF1cblNlY3RvclNpemU9W2RdXG4iOwotCSAgICBicmVhazsKLQljYXNlIDI6Ci0JICAgIGZtdCA9ICJDcmVhdGlvblRpbWU9W1QyXVZvbE5hbWVMZW5ndGg9W2xiXVxuVm9sdW1lTGFiZWw9W2NdXG4iOwotCSAgICBicmVhazsKLQljYXNlIDB4MTA1OgotCSAgICBmbXQgPSAiQ2FwYWJpbGl0aWVzPVtXXVxuTWF4RmlsZUxlbj1bRF1cblZvbE5hbWVMZW49W2xEXVxuVm9sdW1lPVtDXVxuIjsKLQkgICAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgZm10ID0gIlVua25vd25MZXZlbFxuIjsKLQkgICAgYnJlYWs7Ci0JfQotCXNtYl9mZGF0YShkYXRhLCBmbXQsIGRhdGEgKyBkY250LCB1bmljb2Rlc3RyKTsKLSAgICB9Ci0gICAgaWYgKGRjbnQpIHsKLQlwcmludGYoImRhdGE6XG4iKTsKLQlwcmludF9kYXRhKGRhdGEsIGRjbnQpOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotc3RydWN0IHNtYmZuc2ludCB0cmFuczJfZm5zW10gPSB7Ci0gICAgeyAwLCAiVFJBTlNBQ1QyX09QRU4iLCAwLAotCXsgIkZsYWdzMj1bd11cbk1vZGU9W3ddXG5TZWFyY2hBdHRyaWI9W0FdXG5BdHRyaWI9W0FdXG5UaW1lPVtUMl1cbk9GdW49W3ddXG5TaXplPVtEXVxuUmVzPShbdywgdywgdywgdywgd10pXG5QYXRoPVtTXSIsCi0JICBOVUxMLAotCSAgIkhhbmRsZT1bZF1cbkF0dHJpYj1bQV1cblRpbWU9W1QyXVxuU2l6ZT1bRF1cbkFjY2Vzcz1bd11cblR5cGU9W3ddXG5TdGF0ZT1bd11cbkFjdGlvbj1bd11cbklub2RlPVtXXVxuT2ZmRXJyPVtkXVxufEVBTGVuZ3RoPVtkXVxuIiwKLQkgIE5VTEwsIE5VTEwgfX0sCi0gICAgeyAxLCAiVFJBTlNBQ1QyX0ZJTkRGSVJTVCIsIDAsCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCB0cmFuczJfZmluZGZpcnN0IH19LAotICAgIHsgMiwgIlRSQU5TQUNUMl9GSU5ETkVYVCIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyAzLCAiVFJBTlNBQ1QyX1FGU0lORk8iLCAwLAotCXsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgdHJhbnMyX3Fmc2luZm8gfX0sCi0gICAgeyA0LCAiVFJBTlNBQ1QyX1NFVEZTSU5GTyIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyA1LCAiVFJBTlNBQ1QyX1FQQVRISU5GTyIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyA2LCAiVFJBTlNBQ1QyX1NFVFBBVEhJTkZPIiwgMCwgREVGREVTQ1JJUFQgfSwKLSAgICB7IDcsICJUUkFOU0FDVDJfUUZJTEVJTkZPIiwgMCwgREVGREVTQ1JJUFQgfSwKLSAgICB7IDgsICJUUkFOU0FDVDJfU0VURklMRUlORk8iLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgOSwgIlRSQU5TQUNUMl9GU0NUTCIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyAxMCwgIlRSQU5TQUNUMl9JT0NUTCIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyAxMSwgIlRSQU5TQUNUMl9GSU5ETk9USUZZRklSU1QiLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgMTIsICJUUkFOU0FDVDJfRklORE5PVElGWU5FWFQiLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgMTMsICJUUkFOU0FDVDJfTUtESVIiLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgLTEsIE5VTEwsIDAsIERFRkRFU0NSSVBUIH0KLX07Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3RyYW5zMihjb25zdCB1X2NoYXIgKndvcmRzLCBjb25zdCB1X2NoYXIgKmRhdCwgY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IHVfY2hhciAqbWF4YnVmKQotewotICAgIHVfaW50IGJjYzsKLSAgICBzdGF0aWMgc3RydWN0IHNtYmZuc2ludCAqZm4gPSAmdHJhbnMyX2Zuc1swXTsKLSAgICBjb25zdCB1X2NoYXIgKmRhdGEsICpwYXJhbTsKLSAgICBjb25zdCB1X2NoYXIgKncgPSB3b3JkcyArIDE7Ci0gICAgY29uc3QgY2hhciAqZjEgPSBOVUxMLCAqZjIgPSBOVUxMOwotICAgIGludCBwY250LCBkY250OwotCi0gICAgVENIRUNLKHdvcmRzWzBdKTsKLSAgICBpZiAocmVxdWVzdCkgewotCVRDSEVDSzIod1sxNCAqIDJdLCAyKTsKLQlwY250ID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDkgKiAyKTsKLQlwYXJhbSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyAxMCAqIDIpOwotCWRjbnQgPSBFWFRSQUNUX0xFXzE2QklUUyh3ICsgMTEgKiAyKTsKLQlkYXRhID0gYnVmICsgRVhUUkFDVF9MRV8xNkJJVFModyArIDEyICogMik7Ci0JZm4gPSBzbWJmaW5kaW50KEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyAxNCAqIDIpLCB0cmFuczJfZm5zKTsKLSAgICB9IGVsc2UgewotCWlmICh3b3Jkc1swXSA9PSAwKSB7Ci0JICAgIHByaW50ZigiJXNcbiIsIGZuLT5uYW1lKTsKLQkgICAgcHJpbnRmKCJUcmFuczJJbnRlcmltXG4iKTsKLQkgICAgcmV0dXJuOwotCX0KLQlUQ0hFQ0syKHdbNyAqIDJdLCAyKTsKLQlwY250ID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDMgKiAyKTsKLQlwYXJhbSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA0ICogMik7Ci0JZGNudCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA2ICogMik7Ci0JZGF0YSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA3ICogMik7Ci0gICAgfQotCi0gICAgcHJpbnRmKCIlcyBwYXJhbV9sZW5ndGg9JWQgZGF0YV9sZW5ndGg9JWRcbiIsIGZuLT5uYW1lLCBwY250LCBkY250KTsKLQotICAgIGlmIChyZXF1ZXN0KSB7Ci0JaWYgKHdvcmRzWzBdID09IDgpIHsKLQkgICAgc21iX2ZkYXRhKHdvcmRzICsgMSwKLQkJIlRyYW5zMlNlY29uZGFyeVxuVG90UGFyYW09W2RdXG5Ub3REYXRhPVtkXVxuUGFyYW1DbnQ9W2RdXG5QYXJhbU9mZj1bZF1cblBhcmFtRGlzcD1bZF1cbkRhdGFDbnQ9W2RdXG5EYXRhT2ZmPVtkXVxuRGF0YURpc3A9W2RdXG5IYW5kbGU9W2RdXG4iLAotCQltYXhidWYsIHVuaWNvZGVzdHIpOwotCSAgICByZXR1cm47Ci0JfSBlbHNlIHsKLQkgICAgc21iX2ZkYXRhKHdvcmRzICsgMSwKLQkJIlRvdFBhcmFtPVtkXVxuVG90RGF0YT1bZF1cbk1heFBhcmFtPVtkXVxuTWF4RGF0YT1bZF1cbk1heFNldHVwPVtiXVtQMV1cbkZsYWdzPVt3XVxuVGltZU91dD1bRF1cblJlczE9W3ddXG5QYXJhbUNudD1bZF1cblBhcmFtT2ZmPVtkXVxuRGF0YUNudD1bZF1cbkRhdGFPZmY9W2RdXG5TZXR1cENudD1bYl1bUDFdXG4iLAotCQl3b3JkcyArIDEgKyAxNCAqIDIsIHVuaWNvZGVzdHIpOwotCX0KLQlmMSA9IGZuLT5kZXNjcmlwdC5yZXFfZjE7Ci0JZjIgPSBmbi0+ZGVzY3JpcHQucmVxX2YyOwotICAgIH0gZWxzZSB7Ci0Jc21iX2ZkYXRhKHdvcmRzICsgMSwKLQkgICAgIlRvdFBhcmFtPVtkXVxuVG90RGF0YT1bZF1cblJlczE9W3ddXG5QYXJhbUNudD1bZF1cblBhcmFtT2ZmPVtkXVxuUGFyYW1EaXNwW2RdXG5EYXRhQ250PVtkXVxuRGF0YU9mZj1bZF1cbkRhdGFEaXNwPVtkXVxuU2V0dXBDbnQ9W2JdW1AxXVxuIiwKLQkgICAgd29yZHMgKyAxICsgMTAgKiAyLCB1bmljb2Rlc3RyKTsKLQlmMSA9IGZuLT5kZXNjcmlwdC5yZXBfZjE7Ci0JZjIgPSBmbi0+ZGVzY3JpcHQucmVwX2YyOwotICAgIH0KLQotICAgIFRDSEVDSzIoKmRhdCwgMik7Ci0gICAgYmNjID0gRVhUUkFDVF9MRV8xNkJJVFMoZGF0KTsKLSAgICBwcmludGYoInNtYl9iY2M9JXVcbiIsIGJjYyk7Ci0gICAgaWYgKGZuLT5kZXNjcmlwdC5mbikKLQkoKmZuLT5kZXNjcmlwdC5mbikocGFyYW0sIGRhdGEsIHBjbnQsIGRjbnQpOwotICAgIGVsc2UgewotCXNtYl9mZGF0YShwYXJhbSwgZjEgPyBmMSA6ICJQYXJhbWV0ZXJzPVxuIiwgcGFyYW0gKyBwY250LCB1bmljb2Rlc3RyKTsKLQlzbWJfZmRhdGEoZGF0YSwgZjIgPyBmMiA6ICJEYXRhPVxuIiwgZGF0YSArIGRjbnQsIHVuaWNvZGVzdHIpOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYnJvd3NlKGNvbnN0IHVfY2hhciAqcGFyYW0sIGludCBwYXJhbWxlbiwgY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgZGF0YWxlbikKLXsKLSAgICBjb25zdCB1X2NoYXIgKm1heGJ1ZiA9IGRhdGEgKyBkYXRhbGVuOwotICAgIGludCBjb21tYW5kOwotCi0gICAgVENIRUNLKGRhdGFbMF0pOwotICAgIGNvbW1hbmQgPSBkYXRhWzBdOwotCi0gICAgc21iX2ZkYXRhKHBhcmFtLCAiQlJPV1NFIFBBQ0tFVFxufFBhcmFtICIsIHBhcmFtK3BhcmFtbGVuLCB1bmljb2Rlc3RyKTsKLQotICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgIGNhc2UgMHhGOgotCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKLQkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoTG9jYWxNYXN0ZXJBbm5vdW5jZW1lbnQpXG5VcGRhdGVDb3VudD1bd11cblJlczE9W0JdXG5Bbm5vdW5jZUludGVydmFsPVtkXVxuTmFtZT1bbjJdXG5NYWpvclZlcnNpb249W0JdXG5NaW5vclZlcnNpb249W0JdXG5TZXJ2ZXJUeXBlPVtXXVxuRWxlY3Rpb25WZXJzaW9uPVt3XVxuQnJvd3NlckNvbnN0YW50PVt3XVxuIiwKLQkgICAgbWF4YnVmLCB1bmljb2Rlc3RyKTsKLQlicmVhazsKLQotICAgIGNhc2UgMHgxOgotCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKLQkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoSG9zdEFubm91bmNlbWVudClcblVwZGF0ZUNvdW50PVt3XVxuUmVzMT1bQl1cbkFubm91bmNlSW50ZXJ2YWw9W2RdXG5OYW1lPVtuMl1cbk1ham9yVmVyc2lvbj1bQl1cbk1pbm9yVmVyc2lvbj1bQl1cblNlcnZlclR5cGU9W1ddXG5FbGVjdGlvblZlcnNpb249W3ddXG5Ccm93c2VyQ29uc3RhbnQ9W3ddXG4iLAotCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOwotCWJyZWFrOwotCi0gICAgY2FzZSAweDI6Ci0JZGF0YSA9IHNtYl9mZGF0YShkYXRhLAotCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChBbm5vdW5jZW1lbnRSZXF1ZXN0KVxuRmxhZ3M9W0JdXG5SZXBseVN5c3RlbU5hbWU9W1NdXG4iLAotCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOwotCWJyZWFrOwotCi0gICAgY2FzZSAweGM6Ci0JZGF0YSA9IHNtYl9mZGF0YShkYXRhLAotCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChXb3JrZ3JvdXBBbm5vdW5jZW1lbnQpXG5VcGRhdGVDb3VudD1bd11cblJlczE9W0JdXG5Bbm5vdW5jZUludGVydmFsPVtkXVxuTmFtZT1bbjJdXG5NYWpvclZlcnNpb249W0JdXG5NaW5vclZlcnNpb249W0JdXG5TZXJ2ZXJUeXBlPVtXXVxuQ29tbWVudFBvaW50ZXI9W1ddXG5TZXJ2ZXJOYW1lPVtTXVxuIiwKLQkgICAgbWF4YnVmLCB1bmljb2Rlc3RyKTsKLQlicmVhazsKLQotICAgIGNhc2UgMHg4OgotCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKLQkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoRWxlY3Rpb25GcmFtZSlcbkVsZWN0aW9uVmVyc2lvbj1bQl1cbk9TU3VtbWFyeT1bV11cblVwdGltZT1bKFcsIFcpXVxuU2VydmVyTmFtZT1bU11cbiIsCi0JICAgIG1heGJ1ZiwgdW5pY29kZXN0cik7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4YjoKLQlkYXRhID0gc21iX2ZkYXRhKGRhdGEsCi0JICAgICJCUk9XU0UgUEFDS0VUOlxuVHlwZT1bQl0gKEJlY29tZUJhY2t1cEJyb3dzZXIpXG5OYW1lPVtTXVxuIiwKLQkgICAgbWF4YnVmLCB1bmljb2Rlc3RyKTsKLQlicmVhazsKLQotICAgIGNhc2UgMHg5OgotCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKLQkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoR2V0QmFja3VwTGlzdClcbkxpc3RDb3VudD89W0JdXG5Ub2tlbj1bV11cbiIsCi0JICAgIG1heGJ1ZiwgdW5pY29kZXN0cik7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIDB4YToKLQlkYXRhID0gc21iX2ZkYXRhKGRhdGEsCi0JICAgICJCUk9XU0UgUEFDS0VUOlxuVHlwZT1bQl0gKEJhY2t1cExpc3RSZXNwb25zZSlcblNlcnZlckNvdW50Pz1bQl1cblRva2VuPVtXXVxuKk5hbWU9W1NdXG4iLAotCSAgICBtYXhidWYsIHVuaWNvZGVzdHIpOwotCWJyZWFrOwotCi0gICAgY2FzZSAweGQ6Ci0JZGF0YSA9IHNtYl9mZGF0YShkYXRhLAotCSAgICAiQlJPV1NFIFBBQ0tFVDpcblR5cGU9W0JdIChNYXN0ZXJBbm5vdW5jZW1lbnQpXG5NYXN0ZXJOYW1lPVtTXVxuIiwKLQkgICAgbWF4YnVmLCB1bmljb2Rlc3RyKTsKLQlicmVhazsKLQotICAgIGNhc2UgMHhlOgotCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwKLQkgICAgIkJST1dTRSBQQUNLRVQ6XG5UeXBlPVtCXSAoUmVzZXRCcm93c2VyKVxuT3B0aW9ucz1bQl1cbiIsIG1heGJ1ZiwgdW5pY29kZXN0cik7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgIlVua25vd24gQnJvd3NlciBGcmFtZSAiLCBtYXhidWYsIHVuaWNvZGVzdHIpOwotCWJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaXBjKGNvbnN0IHVfY2hhciAqcGFyYW0sIGludCBwYXJhbWxlbiwgY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgZGF0YWxlbikKLXsKLSAgICBpZiAocGFyYW1sZW4pCi0Jc21iX2ZkYXRhKHBhcmFtLCAiQ29tbWFuZD1bd11cblN0cjE9W1NdXG5TdHIyPVtTXVxuIiwgcGFyYW0gKyBwYXJhbWxlbiwKLQkgICAgdW5pY29kZXN0cik7Ci0gICAgaWYgKGRhdGFsZW4pCi0Jc21iX2ZkYXRhKGRhdGEsICJJUEMgIiwgZGF0YSArIGRhdGFsZW4sIHVuaWNvZGVzdHIpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1wcmludF90cmFucyhjb25zdCB1X2NoYXIgKndvcmRzLCBjb25zdCB1X2NoYXIgKmRhdGExLCBjb25zdCB1X2NoYXIgKmJ1ZiwgY29uc3QgdV9jaGFyICptYXhidWYpCi17Ci0gICAgdV9pbnQgYmNjOwotICAgIGNvbnN0IGNoYXIgKmYxLCAqZjIsICpmMywgKmY0OwotICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgKnBhcmFtOwotICAgIGNvbnN0IHVfY2hhciAqdyA9IHdvcmRzICsgMTsKLSAgICBpbnQgZGF0YWxlbiwgcGFyYW1sZW47Ci0KLSAgICBpZiAocmVxdWVzdCkgewotCVRDSEVDSzIod1sxMiAqIDJdLCAyKTsKLQlwYXJhbWxlbiA9IEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA5ICogMik7Ci0JcGFyYW0gPSBidWYgKyBFWFRSQUNUX0xFXzE2QklUUyh3ICsgMTAgKiAyKTsKLQlkYXRhbGVuID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDExICogMik7Ci0JZGF0YSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyAxMiAqIDIpOwotCWYxID0gIlRvdFBhcmFtQ250PVtkXSBcblRvdERhdGFDbnQ9W2RdIFxuTWF4UGFybUNudD1bZF0gXG5NYXhEYXRhQ250PVtkXVxuTWF4U0NudD1bZF0gXG5UcmFuc0ZsYWdzPVt3XSBcblJlczE9W3ddIFxuUmVzMj1bd10gXG5SZXMzPVt3XVxuUGFyYW1DbnQ9W2RdIFxuUGFyYW1PZmY9W2RdIFxuRGF0YUNudD1bZF0gXG5EYXRhT2ZmPVtkXSBcblNVQ250PVtkXVxuIjsKLQlmMiA9ICJ8TmFtZT1bU11cbiI7Ci0JZjMgPSAifFBhcmFtICI7Ci0JZjQgPSAifERhdGEgIjsKLSAgICB9IGVsc2UgewotCVRDSEVDSzIod1s3ICogMl0sIDIpOwotCXBhcmFtbGVuID0gRVhUUkFDVF9MRV8xNkJJVFModyArIDMgKiAyKTsKLQlwYXJhbSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA0ICogMik7Ci0JZGF0YWxlbiA9IEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA2ICogMik7Ci0JZGF0YSA9IGJ1ZiArIEVYVFJBQ1RfTEVfMTZCSVRTKHcgKyA3ICogMik7Ci0JZjEgPSAiVG90UGFyYW1DbnQ9W2RdIFxuVG90RGF0YUNudD1bZF0gXG5SZXMxPVtkXVxuUGFyYW1DbnQ9W2RdIFxuUGFyYW1PZmY9W2RdIFxuUmVzMj1bZF0gXG5EYXRhQ250PVtkXSBcbkRhdGFPZmY9W2RdIFxuUmVzMz1bZF1cbkxzZXR1cD1bZF1cbiI7Ci0JZjIgPSAifFVua25vd24gIjsKLQlmMyA9ICJ8UGFyYW0gIjsKLQlmNCA9ICJ8RGF0YSAiOwotICAgIH0KLQotICAgIHNtYl9mZGF0YSh3b3JkcyArIDEsIGYxLCBTTUJNSU4od29yZHMgKyAxICsgMiAqIHdvcmRzWzBdLCBtYXhidWYpLAotICAgICAgICB1bmljb2Rlc3RyKTsKLQotICAgIFRDSEVDSzIoKmRhdGExLCAyKTsKLSAgICBiY2MgPSBFWFRSQUNUX0xFXzE2QklUUyhkYXRhMSk7Ci0gICAgcHJpbnRmKCJzbWJfYmNjPSV1XG4iLCBiY2MpOwotICAgIGlmIChiY2MgPiAwKSB7Ci0Jc21iX2ZkYXRhKGRhdGExICsgMiwgZjIsIG1heGJ1ZiAtIChwYXJhbWxlbiArIGRhdGFsZW4pLCB1bmljb2Rlc3RyKTsKLQotCWlmIChzdHJjbXAoKGNvbnN0IGNoYXIgKikoZGF0YTEgKyAyKSwgIlxcTUFJTFNMT1RcXEJST1dTRSIpID09IDApIHsKLQkgICAgcHJpbnRfYnJvd3NlKHBhcmFtLCBwYXJhbWxlbiwgZGF0YSwgZGF0YWxlbik7Ci0JICAgIHJldHVybjsKLQl9Ci0KLQlpZiAoc3RyY21wKChjb25zdCBjaGFyICopKGRhdGExICsgMiksICJcXFBJUEVcXExBTk1BTiIpID09IDApIHsKLQkgICAgcHJpbnRfaXBjKHBhcmFtLCBwYXJhbWxlbiwgZGF0YSwgZGF0YWxlbik7Ci0JICAgIHJldHVybjsKLQl9Ci0KLQlpZiAocGFyYW1sZW4pCi0JICAgIHNtYl9mZGF0YShwYXJhbSwgZjMsIFNNQk1JTihwYXJhbSArIHBhcmFtbGVuLCBtYXhidWYpLCB1bmljb2Rlc3RyKTsKLQlpZiAoZGF0YWxlbikKLQkgICAgc21iX2ZkYXRhKGRhdGEsIGY0LCBTTUJNSU4oZGF0YSArIGRhdGFsZW4sIG1heGJ1ZiksIHVuaWNvZGVzdHIpOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbmVncHJvdChjb25zdCB1X2NoYXIgKndvcmRzLCBjb25zdCB1X2NoYXIgKmRhdGEsIGNvbnN0IHVfY2hhciAqYnVmIF9VXywgY29uc3QgdV9jaGFyICptYXhidWYpCi17Ci0gICAgdV9pbnQgd2N0LCBiY2M7Ci0gICAgY29uc3QgY2hhciAqZjEgPSBOVUxMLCAqZjIgPSBOVUxMOwotCi0gICAgVENIRUNLKHdvcmRzWzBdKTsKLSAgICB3Y3QgPSB3b3Jkc1swXTsKLSAgICBpZiAocmVxdWVzdCkKLQlmMiA9ICIqfERpYWxlY3Q9W1ldXG4iOwotICAgIGVsc2UgewotCWlmICh3Y3QgPT0gMSkKLQkgICAgZjEgPSAiQ29yZSBQcm90b2NvbFxuRGlhbGVjdEluZGV4PVtkXSI7Ci0JZWxzZSBpZiAod2N0ID09IDE3KQotCSAgICBmMSA9ICJOVDEgUHJvdG9jb2xcbkRpYWxlY3RJbmRleD1bZF1cblNlY01vZGU9W0JdXG5NYXhNdXg9W2RdXG5OdW1WY3M9W2RdXG5NYXhCdWZmZXI9W0RdXG5SYXdTaXplPVtEXVxuU2Vzc2lvbktleT1bV11cbkNhcGFiaWxpdGllcz1bV11cblNlcnZlclRpbWU9W1QzXVRpbWVab25lPVtkXVxuQ3J5cHRLZXk9IjsKLQllbHNlIGlmICh3Y3QgPT0gMTMpCi0JICAgIGYxID0gIkNvcmVwbHVzL0xhbm1hbjEvTGFubWFuMiBQcm90b2NvbFxuRGlhbGVjdEluZGV4PVtkXVxuU2VjTW9kZT1bd11cbk1heFhNaXQ9W2RdXG5NYXhNdXg9W2RdXG5NYXhWY3M9W2RdXG5CbGtNb2RlPVt3XVxuU2Vzc2lvbktleT1bV11cblNlcnZlclRpbWU9W1QxXVRpbWVab25lPVtkXVxuUmVzPVtXXVxuQ3J5cHRLZXk9IjsKLSAgICB9Ci0KLSAgICBpZiAoZjEpCi0Jc21iX2ZkYXRhKHdvcmRzICsgMSwgZjEsIFNNQk1JTih3b3JkcyArIDEgKyB3Y3QgKiAyLCBtYXhidWYpLAotCSAgICB1bmljb2Rlc3RyKTsKLSAgICBlbHNlCi0JcHJpbnRfZGF0YSh3b3JkcyArIDEsIFNNQk1JTih3Y3QgKiAyLCBQVFJfRElGRihtYXhidWYsIHdvcmRzICsgMSkpKTsKLQotICAgIFRDSEVDSzIoKmRhdGEsIDIpOwotICAgIGJjYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpOwotICAgIHByaW50Zigic21iX2JjYz0ldVxuIiwgYmNjKTsKLSAgICBpZiAoYmNjID4gMCkgewotCWlmIChmMikKLQkgICAgc21iX2ZkYXRhKGRhdGEgKyAyLCBmMiwgU01CTUlOKGRhdGEgKyAyICsgRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSksCi0JCW1heGJ1ZiksIHVuaWNvZGVzdHIpOwotCWVsc2UKLQkgICAgcHJpbnRfZGF0YShkYXRhICsgMiwgU01CTUlOKEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpLCBQVFJfRElGRihtYXhidWYsIGRhdGEgKyAyKSkpOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3Nlc3NzZXR1cChjb25zdCB1X2NoYXIgKndvcmRzLCBjb25zdCB1X2NoYXIgKmRhdGEsIGNvbnN0IHVfY2hhciAqYnVmIF9VXywgY29uc3QgdV9jaGFyICptYXhidWYpCi17Ci0gICAgdV9pbnQgd2N0LCBiY2M7Ci0gICAgY29uc3QgY2hhciAqZjEgPSBOVUxMLCAqZjIgPSBOVUxMOwotCi0gICAgVENIRUNLKHdvcmRzWzBdKTsKLSAgICB3Y3QgPSB3b3Jkc1swXTsKLSAgICBpZiAocmVxdWVzdCkgewotCWlmICh3Y3QgPT0gMTApCi0JICAgIGYxID0gIkNvbTI9W3ddXG5PZmYyPVtkXVxuQnVmU2l6ZT1bZF1cbk1weE1heD1bZF1cblZjTnVtPVtkXVxuU2Vzc2lvbktleT1bV11cblBhc3NMZW49W2RdXG5DcnlwdExlbj1bZF1cbkNyeXB0T2ZmPVtkXVxuUGFzcyZOYW1lPVxuIjsKLQllbHNlCi0JICAgIGYxID0gIkNvbTI9W0JdXG5SZXMxPVtCXVxuT2ZmMj1bZF1cbk1heEJ1ZmZlcj1bZF1cbk1heE1weD1bZF1cblZjTnVtYmVyPVtkXVxuU2Vzc2lvbktleT1bV11cbkNhc2VJbnNlbnNpdGl2ZVBhc3N3b3JkTGVuZ3RoPVtkXVxuQ2FzZVNlbnNpdGl2ZVBhc3N3b3JkTGVuZ3RoPVtkXVxuUmVzPVtXXVxuQ2FwYWJpbGl0aWVzPVtXXVxuUGFzczEmUGFzczImQWNjb3VudCZEb21haW4mT1MmTGFuTWFuPVxuIjsKLSAgICB9IGVsc2UgewotCWlmICh3Y3QgPT0gMykgewotCSAgICBmMSA9ICJDb20yPVt3XVxuT2ZmMj1bZF1cbkFjdGlvbj1bd11cbiI7Ci0JfSBlbHNlIGlmICh3Y3QgPT0gMTMpIHsKLQkgICAgZjEgPSAiQ29tMj1bQl1cblJlcz1bQl1cbk9mZjI9W2RdXG5BY3Rpb249W3ddXG4iOwotCSAgICBmMiA9ICJOYXRpdmVPUz1bU11cbk5hdGl2ZUxhbk1hbj1bU11cblByaW1hcnlEb21haW49W1NdXG4iOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoZjEpCi0Jc21iX2ZkYXRhKHdvcmRzICsgMSwgZjEsIFNNQk1JTih3b3JkcyArIDEgKyB3Y3QgKiAyLCBtYXhidWYpLAotCSAgICB1bmljb2Rlc3RyKTsKLSAgICBlbHNlCi0JcHJpbnRfZGF0YSh3b3JkcyArIDEsIFNNQk1JTih3Y3QgKiAyLCBQVFJfRElGRihtYXhidWYsIHdvcmRzICsgMSkpKTsKLQotICAgIFRDSEVDSzIoKmRhdGEsIDIpOwotICAgIGJjYyA9IEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpOwotICAgIHByaW50Zigic21iX2JjYz0ldVxuIiwgYmNjKTsKLSAgICBpZiAoYmNjID4gMCkgewotCWlmIChmMikKLQkgICAgc21iX2ZkYXRhKGRhdGEgKyAyLCBmMiwgU01CTUlOKGRhdGEgKyAyICsgRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSksCi0JCW1heGJ1ZiksIHVuaWNvZGVzdHIpOwotCWVsc2UKLQkgICAgcHJpbnRfZGF0YShkYXRhICsgMiwgU01CTUlOKEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpLCBQVFJfRElGRihtYXhidWYsIGRhdGEgKyAyKSkpOwotICAgIH0KLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2xvY2tpbmdhbmR4KGNvbnN0IHVfY2hhciAqd29yZHMsIGNvbnN0IHVfY2hhciAqZGF0YSwgY29uc3QgdV9jaGFyICpidWYgX1VfLCBjb25zdCB1X2NoYXIgKm1heGJ1ZikKLXsKLSAgICB1X2ludCB3Y3QsIGJjYzsKLSAgICBjb25zdCB1X2NoYXIgKm1heHdvcmRzOwotICAgIGNvbnN0IGNoYXIgKmYxID0gTlVMTCwgKmYyID0gTlVMTDsKLQotICAgIFRDSEVDSyh3b3Jkc1swXSk7Ci0gICAgd2N0ID0gd29yZHNbMF07Ci0gICAgaWYgKHJlcXVlc3QpIHsKLQlmMSA9ICJDb20yPVt3XVxuT2ZmMj1bZF1cbkhhbmRsZT1bZF1cbkxvY2tUeXBlPVt3XVxuVGltZU91dD1bRF1cblVubG9ja0NvdW50PVtkXVxuTG9ja0NvdW50PVtkXVxuIjsKLQlUQ0hFQ0sod29yZHNbN10pOwotCWlmICh3b3Jkc1s3XSAmIDB4MTApCi0JICAgIGYyID0gIipQcm9jZXNzPVtkXVxuW1AyXU9mZnNldD1bTV1cbkxlbmd0aD1bTV1cbiI7Ci0JZWxzZQotCSAgICBmMiA9ICIqUHJvY2Vzcz1bZF1cbk9mZnNldD1bRF1cbkxlbmd0aD1bRF1cbiI7Ci0gICAgfSBlbHNlIHsKLQlmMSA9ICJDb20yPVt3XVxuT2ZmMj1bZF1cbiI7Ci0gICAgfQotCi0gICAgbWF4d29yZHMgPSBTTUJNSU4od29yZHMgKyAxICsgd2N0ICogMiwgbWF4YnVmKTsKLSAgICBpZiAod2N0KQotCXNtYl9mZGF0YSh3b3JkcyArIDEsIGYxLCBtYXh3b3JkcywgdW5pY29kZXN0cik7Ci0KLSAgICBUQ0hFQ0syKCpkYXRhLCAyKTsKLSAgICBiY2MgPSBFWFRSQUNUX0xFXzE2QklUUyhkYXRhKTsKLSAgICBwcmludGYoInNtYl9iY2M9JXVcbiIsIGJjYyk7Ci0gICAgaWYgKGJjYyA+IDApIHsKLQlpZiAoZjIpCi0JICAgIHNtYl9mZGF0YShkYXRhICsgMiwgZjIsIFNNQk1JTihkYXRhICsgMiArIEVYVFJBQ1RfTEVfMTZCSVRTKGRhdGEpLAotCQltYXhidWYpLCB1bmljb2Rlc3RyKTsKLQllbHNlCi0JICAgIHByaW50X2RhdGEoZGF0YSArIDIsIFNNQk1JTihFWFRSQUNUX0xFXzE2QklUUyhkYXRhKSwgUFRSX0RJRkYobWF4YnVmLCBkYXRhICsgMikpKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJbfFNNQl0iKTsKLSAgICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBzbWJmbnMgc21iX2Zuc1tdID0gewotICAgIHsgLTEsICJTTUJ1bmtub3duIiwgMCwgREVGREVTQ1JJUFQgfSwKLQotICAgIHsgU01CdGNvbiwgIlNNQnRjb24iLCAwLAotCXsgTlVMTCwgIlBhdGg9W1pdXG5QYXNzd29yZD1bWl1cbkRldmljZT1bWl1cbiIsCi0JICAiTWF4WG1pdD1bZF1cblRyZWVJZD1bZF1cbiIsIE5VTEwsCi0JICBOVUxMIH0gfSwKLQotICAgIHsgU01CdGRpcywgIlNNQnRkaXMiLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgU01CZXhpdCwgICJTTUJleGl0IiwgMCwgREVGREVTQ1JJUFQgfSwKLSAgICB7IFNNQmlvY3RsLCAiU01CaW9jdGwiLCAwLCBERUZERVNDUklQVCB9LAotCi0gICAgeyBTTUJlY2hvLCAiU01CZWNobyIsIDAsCi0JeyAiUmV2ZXJiQ291bnQ9W2RdXG4iLCBOVUxMLAotCSAgIlNlcXVlbmNlTnVtPVtkXVxuIiwgTlVMTCwKLQkgIE5VTEwgfSB9LAotCi0gICAgeyBTTUJ1bG9nb2ZmWCwgIlNNQnVsb2dvZmZYIiwgRkxHX0NIQUlOLCBERUZERVNDUklQVCB9LAotCi0gICAgeyBTTUJnZXRhdHIsICJTTUJnZXRhdHIiLCAwLAotCXsgTlVMTCwgIlBhdGg9W1pdXG4iLAotCSAgIkF0dHJpYnV0ZT1bQV1cblRpbWU9W1QyXVNpemU9W0RdXG5SZXM9KFt3LHcsdyx3LHddKVxuIiwgTlVMTCwKLQkgIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzZXRhdHIsICJTTUJzZXRhdHIiLCAwLAotCXsgIkF0dHJpYnV0ZT1bQV1cblRpbWU9W1QyXVJlcz0oW3csdyx3LHcsd10pXG4iLCAiUGF0aD1bWl1cbiIsCi0JICBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CY2hrcHRoLCAiU01CY2hrcHRoIiwgMCwKLSAgICAgICB7IE5VTEwsICJQYXRoPVtaXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnNlYXJjaCwgIlNNQnNlYXJjaCIsIDAsCi0JeyAiQ291bnQ9W2RdXG5BdHRyaWI9W0FdXG4iLAotCSAgIlBhdGg9W1pdXG5CbGtUeXBlPVtCXVxuQmxrTGVuPVtkXVxufFJlczE9W0JdXG5NYXNrPVtzMTFdXG5TcnYxPVtCXVxuRGlySW5kZXg9W2RdXG5TcnYyPVt3XVxuUmVzMj1bV11cbiIsCi0JICAiQ291bnQ9W2RdXG4iLAotCSAgIkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG4qXG5SZXMxPVtCXVxuTWFzaz1bczExXVxuU3J2MT1bQl1cbkRpckluZGV4PVtkXVxuU3J2Mj1bd11cblJlczI9W1ddXG5BdHRyaWI9W2FdXG5UaW1lPVtUMV1TaXplPVtEXVxuTmFtZT1bczEzXVxuIiwKLQkgIE5VTEwgfSB9LAotCi0gICAgeyBTTUJvcGVuLCAiU01Cb3BlbiIsIDAsCi0JeyAiTW9kZT1bd11cbkF0dHJpYnV0ZT1bQV1cbiIsICJQYXRoPVtaXVxuIiwKLQkgICJIYW5kbGU9W2RdXG5PQXR0cmliPVtBXVxuVGltZT1bVDJdU2l6ZT1bRF1cbkFjY2Vzcz1bd11cbiIsCi0JICBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CY3JlYXRlLCAiU01CY3JlYXRlIiwgMCwKLQl7ICJBdHRyaWI9W0FdXG5UaW1lPVtUMl0iLCAiUGF0aD1bWl1cbiIsICJIYW5kbGU9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CbWtuZXcsICJTTUJta25ldyIsIDAsCi0JeyAiQXR0cmliPVtBXVxuVGltZT1bVDJdIiwgIlBhdGg9W1pdXG4iLCAiSGFuZGxlPVtkXVxuIiwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnVubGluaywgIlNNQnVubGluayIsIDAsCi0JeyAiQXR0cmliPVtBXVxuIiwgIlBhdGg9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CcmVhZCwgIlNNQnJlYWQiLCAwLAotCXsgIkhhbmRsZT1bZF1cbkJ5dGVDb3VudD1bZF1cbk9mZnNldD1bRF1cbkNvdW50TGVmdD1bZF1cbiIsIE5VTEwsCi0JICAiQ291bnQ9W2RdXG5SZXM9KFt3LHcsdyx3XSlcbiIsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJ3cml0ZSwgIlNNQndyaXRlIiwgMCwKLQl7ICJIYW5kbGU9W2RdXG5CeXRlQ291bnQ9W2RdXG5PZmZzZXQ9W0RdXG5Db3VudExlZnQ9W2RdXG4iLCBOVUxMLAotCSAgIkNvdW50PVtkXVxuIiwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQmNsb3NlLCAiU01CY2xvc2UiLCAwLAotCXsgIkhhbmRsZT1bZF1cblRpbWU9W1QyXSIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJta2RpciwgIlNNQm1rZGlyIiwgMCwKLQl7IE5VTEwsICJQYXRoPVtaXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnJtZGlyLCAiU01Ccm1kaXIiLCAwLAotCXsgTlVMTCwgIlBhdGg9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CZHNrYXR0ciwgIlNNQmRza2F0dHIiLCAwLAotCXsgTlVMTCwgTlVMTCwKLQkgICJUb3RhbFVuaXRzPVtkXVxuQmxvY2tzUGVyVW5pdD1bZF1cbkJsb2NrU2l6ZT1bZF1cbkZyZWVVbml0cz1bZF1cbk1lZGlhPVt3XVxuIiwKLQkgIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJtdiwgIlNNQm12IiwgMCwKLQl7ICJBdHRyaWI9W0FdXG4iLCAiT2xkUGF0aD1bWl1cbk5ld1BhdGg9W1pdXG4iLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIC8qCi0gICAgICogdGhpcyBpcyBhIFBhdGh3b3JrcyBzcGVjaWZpYyBjYWxsLCBhbGxvd2luZyB0aGUKLSAgICAgKiBjaGFuZ2luZyBvZiB0aGUgcm9vdCBwYXRoCi0gICAgICovCi0gICAgeyBwU0VURElSLCAiU01Cc2V0ZGlyIiwgMCwgeyBOVUxMLCAiUGF0aD1bWl1cbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJsc2VlaywgIlNNQmxzZWVrIiwgMCwKLQl7ICJIYW5kbGU9W2RdXG5Nb2RlPVt3XVxuT2Zmc2V0PVtEXVxuIiwgIk9mZnNldD1bRF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJmbHVzaCwgIlNNQmZsdXNoIiwgMCwgeyAiSGFuZGxlPVtkXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnNwbG9wZW4sICJTTUJzcGxvcGVuIiwgMCwKLQl7ICJTZXR1cExlbj1bZF1cbk1vZGU9W3ddXG4iLCAiSWRlbnQ9W1pdXG4iLCAiSGFuZGxlPVtkXVxuIiwKLQkgIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzcGxjbG9zZSwgIlNNQnNwbGNsb3NlIiwgMCwKLQl7ICJIYW5kbGU9W2RdXG4iLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01Cc3BscmV0cSwgIlNNQnNwbHJldHEiLCAwLAotCXsgIk1heENvdW50PVtkXVxuU3RhcnRJbmRleD1bZF1cbiIsIE5VTEwsCi0JICAiQ291bnQ9W2RdXG5JbmRleD1bZF1cbiIsCi0JICAiKlRpbWU9W1QyXVN0YXR1cz1bQl1cbkpvYklEPVtkXVxuU2l6ZT1bRF1cblJlcz1bQl1OYW1lPVtzMTZdXG4iLAotCSAgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnNwbHdyLCAiU01Cc3Bsd3IiLCAwLAotCXsgIkhhbmRsZT1bZF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJsb2NrLCAiU01CbG9jayIsIDAsCi0JeyAiSGFuZGxlPVtkXVxuQ291bnQ9W0RdXG5PZmZzZXQ9W0RdXG4iLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CdW5sb2NrLCAiU01CdW5sb2NrIiwgMCwKLQl7ICJIYW5kbGU9W2RdXG5Db3VudD1bRF1cbk9mZnNldD1bRF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgLyogQ09SRSsgUFJPVE9DT0wgRk9MTE9XUyAqLwotCi0gICAgeyBTTUJyZWFkYnJhdywgIlNNQnJlYWRicmF3IiwgMCwKLQl7ICJIYW5kbGU9W2RdXG5PZmZzZXQ9W0RdXG5NYXhDb3VudD1bZF1cbk1pbkNvdW50PVtkXVxuVGltZU91dD1bRF1cblJlcz1bZF1cbiIsCi0JICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01Cd3JpdGVicmF3LCAiU01Cd3JpdGVicmF3IiwgMCwKLQl7ICJIYW5kbGU9W2RdXG5Ub3RhbENvdW50PVtkXVxuUmVzPVt3XVxuT2Zmc2V0PVtEXVxuVGltZU91dD1bRF1cbldNb2RlPVt3XVxuUmVzMj1bV11cbnxEYXRhU2l6ZT1bZF1cbkRhdGFPZmY9W2RdXG4iLAotCSAgTlVMTCwgIldyaXRlUmF3QWNrIiwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQndyaXRlYywgIlNNQndyaXRlYyIsIDAsCi0JeyBOVUxMLCBOVUxMLCAiQ291bnQ9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01Cd3JpdGVjbG9zZSwgIlNNQndyaXRlY2xvc2UiLCAwLAotCXsgIkhhbmRsZT1bZF1cbkNvdW50PVtkXVxuT2Zmc2V0PVtEXVxuVGltZT1bVDJdUmVzPShbdyx3LHcsdyx3LHddKSIsCi0JICBOVUxMLCAiQ291bnQ9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CbG9ja3JlYWQsICJTTUJsb2NrcmVhZCIsIDAsCi0JeyAiSGFuZGxlPVtkXVxuQnl0ZUNvdW50PVtkXVxuT2Zmc2V0PVtEXVxuQ291bnRMZWZ0PVtkXVxuIiwgTlVMTCwKLQkgICJDb3VudD1bZF1cblJlcz0oW3csdyx3LHddKVxuIiwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQndyaXRldW5sb2NrLCAiU01Cd3JpdGV1bmxvY2siLCAwLAotCXsgIkhhbmRsZT1bZF1cbkJ5dGVDb3VudD1bZF1cbk9mZnNldD1bRF1cbkNvdW50TGVmdD1bZF1cbiIsIE5VTEwsCi0JICAiQ291bnQ9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CcmVhZEJtcHgsICJTTUJyZWFkQm1weCIsIDAsCi0JeyAiSGFuZGxlPVtkXVxuT2Zmc2V0PVtEXVxuTWF4Q291bnQ9W2RdXG5NaW5Db3VudD1bZF1cblRpbWVPdXQ9W0RdXG5SZXM9W3ddXG4iLAotCSAgTlVMTCwKLQkgICJPZmZzZXQ9W0RdXG5Ub3RDb3VudD1bZF1cblJlbWFpbmluZz1bZF1cblJlcz0oW3csd10pXG5EYXRhU2l6ZT1bZF1cbkRhdGFPZmY9W2RdXG4iLAotCSAgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQndyaXRlQm1weCwgIlNNQndyaXRlQm1weCIsIDAsCi0JeyAiSGFuZGxlPVtkXVxuVG90Q291bnQ9W2RdXG5SZXM9W3ddXG5PZmZzZXQ9W0RdXG5UaW1lT3V0PVtEXVxuV01vZGU9W3ddXG5SZXMyPVtXXVxuRGF0YVNpemU9W2RdXG5EYXRhT2ZmPVtkXVxuIiwgTlVMTCwKLQkgICJSZW1haW5pbmc9W2RdXG4iLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01Cd3JpdGVCcywgIlNNQndyaXRlQnMiLCAwLAotCXsgIkhhbmRsZT1bZF1cblRvdENvdW50PVtkXVxuT2Zmc2V0PVtEXVxuUmVzPVtXXVxuRGF0YVNpemU9W2RdXG5EYXRhT2ZmPVtkXVxuIiwKLQkgIE5VTEwsICJDb3VudD1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzZXRhdHRyRSwgIlNNQnNldGF0dHJFIiwgMCwKLQl7ICJIYW5kbGU9W2RdXG5DcmVhdGlvblRpbWU9W1QyXUFjY2Vzc1RpbWU9W1QyXU1vZGlmeVRpbWU9W1QyXSIsIE5VTEwsCi0JICBOVUxMLCBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CZ2V0YXR0ckUsICJTTUJnZXRhdHRyRSIsIDAsCi0JeyAiSGFuZGxlPVtkXVxuIiwgTlVMTCwKLQkgICJDcmVhdGlvblRpbWU9W1QyXUFjY2Vzc1RpbWU9W1QyXU1vZGlmeVRpbWU9W1QyXVNpemU9W0RdXG5BbGxvY1NpemU9W0RdXG5BdHRyaWJ1dGU9W0FdXG4iLAotCSAgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnRyYW5zcywgIlNNQnRyYW5zcyIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyBTTUJpb2N0bHMsICJTTUJpb2N0bHMiLCAwLCBERUZERVNDUklQVCB9LAotCi0gICAgeyBTTUJjb3B5LCAiU01CY29weSIsIDAsCi0JeyAiVHJlZUlEMj1bZF1cbk9GdW49W3ddXG5GbGFncz1bd11cbiIsICJQYXRoPVtTXVxuTmV3UGF0aD1bU11cbiIsCi0JICAiQ29weUNvdW50PVtkXVxuIiwgICJ8RXJyU3RyPVtTXVxuIiwgIE5VTEwgfSB9LAotCi0gICAgeyBTTUJtb3ZlLCAiU01CbW92ZSIsIDAsCi0JeyAiVHJlZUlEMj1bZF1cbk9GdW49W3ddXG5GbGFncz1bd11cbiIsICJQYXRoPVtTXVxuTmV3UGF0aD1bU11cbiIsCi0JICAiTW92ZUNvdW50PVtkXVxuIiwgICJ8RXJyU3RyPVtTXVxuIiwgIE5VTEwgfSB9LAotCi0gICAgeyBTTUJvcGVuWCwgIlNNQm9wZW5YIiwgRkxHX0NIQUlOLAotCXsgIkNvbTI9W3ddXG5PZmYyPVtkXVxuRmxhZ3M9W3ddXG5Nb2RlPVt3XVxuU2VhcmNoQXR0cmliPVtBXVxuQXR0cmliPVtBXVxuVGltZT1bVDJdT0Z1bj1bd11cblNpemU9W0RdXG5UaW1lT3V0PVtEXVxuUmVzPVtXXVxuIiwKLQkgICJQYXRoPVtTXVxuIiwKLQkgICJDb20yPVt3XVxuT2ZmMj1bZF1cbkhhbmRsZT1bZF1cbkF0dHJpYj1bQV1cblRpbWU9W1QyXVNpemU9W0RdXG5BY2Nlc3M9W3ddXG5UeXBlPVt3XVxuU3RhdGU9W3ddXG5BY3Rpb249W3ddXG5GaWxlSUQ9W1ddXG5SZXM9W3ddXG4iLAotCSAgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnJlYWRYLCAiU01CcmVhZFgiLCBGTEdfQ0hBSU4sCi0JeyAiQ29tMj1bd11cbk9mZjI9W2RdXG5IYW5kbGU9W2RdXG5PZmZzZXQ9W0RdXG5NYXhDb3VudD1bZF1cbk1pbkNvdW50PVtkXVxuVGltZU91dD1bRF1cbkNvdW50TGVmdD1bZF1cbiIsCi0JICBOVUxMLAotCSAgIkNvbTI9W3ddXG5PZmYyPVtkXVxuUmVtYWluaW5nPVtkXVxuUmVzPVtXXVxuRGF0YVNpemU9W2RdXG5EYXRhT2ZmPVtkXVxuUmVzPShbdyx3LHcsd10pXG4iLAotCSAgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQndyaXRlWCwgIlNNQndyaXRlWCIsIEZMR19DSEFJTiwKLQl7ICJDb20yPVt3XVxuT2ZmMj1bZF1cbkhhbmRsZT1bZF1cbk9mZnNldD1bRF1cblRpbWVPdXQ9W0RdXG5XTW9kZT1bd11cbkNvdW50TGVmdD1bZF1cblJlcz1bd11cbkRhdGFTaXplPVtkXVxuRGF0YU9mZj1bZF1cbiIsCi0JICBOVUxMLAotCSAgIkNvbTI9W3ddXG5PZmYyPVtkXVxuQ291bnQ9W2RdXG5SZW1haW5pbmc9W2RdXG5SZXM9W1ddXG4iLAotCSAgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQmZmaXJzdCwgIlNNQmZmaXJzdCIsIDAsCi0JeyAiQ291bnQ9W2RdXG5BdHRyaWI9W0FdXG4iLAotCSAgIlBhdGg9W1pdXG5CbGtUeXBlPVtCXVxuQmxrTGVuPVtkXVxufFJlczE9W0JdXG5NYXNrPVtzMTFdXG5TcnYxPVtCXVxuRGlySW5kZXg9W2RdXG5TcnYyPVt3XVxuIiwKLQkgICJDb3VudD1bZF1cbiIsCi0JICAiQmxrVHlwZT1bQl1cbkJsa0xlbj1bZF1cbipcblJlczE9W0JdXG5NYXNrPVtzMTFdXG5TcnYxPVtCXVxuRGlySW5kZXg9W2RdXG5TcnYyPVt3XVxuUmVzMj1bV11cbkF0dHJpYj1bYV1cblRpbWU9W1QxXVNpemU9W0RdXG5OYW1lPVtzMTNdXG4iLAotCSAgTlVMTCB9IH0sCi0KLSAgICB7IFNNQmZ1bmlxdWUsICJTTUJmdW5pcXVlIiwgMCwKLQl7ICJDb3VudD1bZF1cbkF0dHJpYj1bQV1cbiIsCi0JICAiUGF0aD1bWl1cbkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG58UmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG4iLAotCSAgIkNvdW50PVtkXVxuIiwKLQkgICJCbGtUeXBlPVtCXVxuQmxrTGVuPVtkXVxuKlxuUmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG5SZXMyPVtXXVxuQXR0cmliPVthXVxuVGltZT1bVDFdU2l6ZT1bRF1cbk5hbWU9W3MxM11cbiIsCi0JICBOVUxMIH0gfSwKLQotICAgIHsgU01CZmNsb3NlLCAiU01CZmNsb3NlIiwgMCwKLQl7ICJDb3VudD1bZF1cbkF0dHJpYj1bQV1cbiIsCi0JICAiUGF0aD1bWl1cbkJsa1R5cGU9W0JdXG5CbGtMZW49W2RdXG58UmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG4iLAotCSAgIkNvdW50PVtkXVxuIiwKLQkgICJCbGtUeXBlPVtCXVxuQmxrTGVuPVtkXVxuKlxuUmVzMT1bQl1cbk1hc2s9W3MxMV1cblNydjE9W0JdXG5EaXJJbmRleD1bZF1cblNydjI9W3ddXG5SZXMyPVtXXVxuQXR0cmliPVthXVxuVGltZT1bVDFdU2l6ZT1bRF1cbk5hbWU9W3MxM11cbiIsCi0JICBOVUxMIH0gfSwKLQotICAgIHsgU01CZmluZG5jbG9zZSwgIlNNQmZpbmRuY2xvc2UiLCAwLAotCXsgIkhhbmRsZT1bZF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJmaW5kY2xvc2UsICJTTUJmaW5kY2xvc2UiLCAwLAotCXsgIkhhbmRsZT1bZF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzZW5kcywgIlNNQnNlbmRzIiwgMCwKLQl7IE5VTEwsICJTb3VyY2U9W1pdXG5EZXN0PVtaXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQnNlbmRzdHJ0LCAiU01Cc2VuZHN0cnQiLCAwLAotCXsgTlVMTCwgIlNvdXJjZT1bWl1cbkRlc3Q9W1pdXG4iLCAiR3JvdXBJRD1bZF1cbiIsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzZW5kZW5kLCAiU01Cc2VuZGVuZCIsIDAsCi0JeyAiR3JvdXBJRD1bZF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzZW5kdHh0LCAiU01Cc2VuZHR4dCIsIDAsCi0JeyAiR3JvdXBJRD1bZF1cbiIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSB9LAotCi0gICAgeyBTTUJzZW5kYiwgIlNNQnNlbmRiIiwgMCwKLQl7IE5VTEwsICJTb3VyY2U9W1pdXG5EZXN0PVtaXVxuIiwgTlVMTCwgTlVMTCwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQmZ3ZG5hbWUsICJTTUJmd2RuYW1lIiwgMCwgREVGREVTQ1JJUFQgfSwKLSAgICB7IFNNQmNhbmNlbGYsICJTTUJjYW5jZWxmIiwgMCwgREVGREVTQ1JJUFQgfSwKLSAgICB7IFNNQmdldG1hYywgIlNNQmdldG1hYyIsIDAsIERFRkRFU0NSSVBUIH0sCi0KLSAgICB7IFNNQm5lZ3Byb3QsICJTTUJuZWdwcm90IiwgMCwKLQl7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHByaW50X25lZ3Byb3QgfSB9LAotCi0gICAgeyBTTUJzZXNzc2V0dXBYLCAiU01Cc2Vzc3NldHVwWCIsIEZMR19DSEFJTiwKLQl7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIHByaW50X3Nlc3NzZXR1cCB9IH0sCi0KLSAgICB7IFNNQnRjb25YLCAiU01CdGNvblgiLCBGTEdfQ0hBSU4sCi0JeyAiQ29tMj1bd11cbk9mZjI9W2RdXG5GbGFncz1bd11cblBhc3NMZW49W2RdXG5QYXNzd2QmUGF0aCZEZXZpY2U9XG4iLAotCSAgTlVMTCwgIkNvbTI9W3ddXG5PZmYyPVtkXVxuIiwgIlNlcnZpY2VUeXBlPVtSXVxuIiwgTlVMTCB9IH0sCi0KLSAgICB7IFNNQmxvY2tpbmdYLCAiU01CbG9ja2luZ1giLCBGTEdfQ0hBSU4sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBwcmludF9sb2NraW5nYW5keCB9IH0sCi0KLSAgICB7IFNNQnRyYW5zMiwgIlNNQnRyYW5zMiIsIDAsIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcHJpbnRfdHJhbnMyIH0gfSwKLQotICAgIHsgU01CdHJhbnNzMiwgIlNNQnRyYW5zczIiLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgU01CY3RlbXAsICJTTUJjdGVtcCIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyBTTUJyZWFkQnMsICJTTUJyZWFkQnMiLCAwLCBERUZERVNDUklQVCB9LAotICAgIHsgU01CdHJhbnMsICJTTUJ0cmFucyIsIDAsIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgcHJpbnRfdHJhbnMgfSB9LAotCi0gICAgeyBTTUJudHRyYW5zLCAiU01CbnR0cmFucyIsIDAsIERFRkRFU0NSSVBUIH0sCi0gICAgeyBTTUJudHRyYW5zcywgIlNNQm50dHJhbnNzIiwgMCwgREVGREVTQ1JJUFQgfSwKLQotICAgIHsgU01CbnRjcmVhdGVYLCAiU01CbnRjcmVhdGVYIiwgRkxHX0NIQUlOLAotCXsgIkNvbTI9W3ddXG5PZmYyPVtkXVxuUmVzPVtiXVxuTmFtZUxlbj1bbGRdXG5GbGFncz1bV11cblJvb3REaXJlY3RvcnlGaWQ9W0RdXG5BY2Nlc3NNYXNrPVtXXVxuQWxsb2NhdGlvblNpemU9W0xdXG5FeHRGaWxlQXR0cmlidXRlcz1bV11cblNoYXJlQWNjZXNzPVtXXVxuQ3JlYXRlRGlzcG9zaXRpb249W1ddXG5DcmVhdGVPcHRpb25zPVtXXVxuSW1wZXJzb25hdGlvbkxldmVsPVtXXVxuU2VjdXJpdHlGbGFncz1bYl1cbiIsCi0JICAiUGF0aD1bQ11cbiIsCi0JICAiQ29tMj1bd11cbk9mZjI9W2RdXG5PcGxvY2tMZXZlbD1bYl1cbkZpZD1bZF1cbkNyZWF0ZUFjdGlvbj1bV11cbkNyZWF0ZVRpbWU9W1QzXUxhc3RBY2Nlc3NUaW1lPVtUM11MYXN0V3JpdGVUaW1lPVtUM11DaGFuZ2VUaW1lPVtUM11FeHRGaWxlQXR0cmlidXRlcz1bV11cbkFsbG9jYXRpb25TaXplPVtMXVxuRW5kT2ZGaWxlPVtMXVxuRmlsZVR5cGU9W3ddXG5EZXZpY2VTdGF0ZT1bd11cbkRpcmVjdG9yeT1bYl1cbiIsCi0JICBOVUxMLCBOVUxMIH0gfSwKLQotICAgIHsgU01CbnRjYW5jZWwsICJTTUJudGNhbmNlbCIsIDAsIERFRkRFU0NSSVBUIH0sCi0KLSAgICB7IC0xLCBOVUxMLCAwLCBERUZERVNDUklQVCB9Ci19OwotCi0KLS8qCi0gKiBwcmludCBhIFNNQiBtZXNzYWdlCi0gKi8KLXN0YXRpYyB2b2lkCi1wcmludF9zbWIoY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IHVfY2hhciAqbWF4YnVmKQotewotICAgIHVfaW50MTZfdCBmbGFnczI7Ci0gICAgaW50IG50ZXJyY29kZXM7Ci0gICAgaW50IGNvbW1hbmQ7Ci0gICAgdV9pbnQzMl90IG50ZXJyb3I7Ci0gICAgY29uc3QgdV9jaGFyICp3b3JkcywgKm1heHdvcmRzLCAqZGF0YTsKLSAgICBzdHJ1Y3Qgc21iZm5zICpmbjsKLSAgICBjb25zdCBjaGFyICpmbXRfc21iaGVhZGVyID0KLSAgICAgICAgIltQNF1TTUIgQ29tbWFuZCAgID0gIFtCXVxuRXJyb3IgY2xhc3MgICA9ICBbQlAxXVxuRXJyb3IgY29kZSAgICA9ICBbZF1cbkZsYWdzMSAgICAgICAgPSAgW0JdXG5GbGFnczIgICAgICAgID0gIFtCXVtQMTNdXG5UcmVlIElEICAgICAgID0gIFtkXVxuUHJvYyBJRCAgICAgICA9ICBbZF1cblVJRCAgICAgICAgICAgPSAgW2RdXG5NSUQgICAgICAgICAgID0gIFtkXVxuV29yZCBDb3VudCAgICA9ICBbYl1cbiI7Ci0gICAgaW50IHNtYm9mZnNldDsKLQotICAgIFRDSEVDSyhidWZbOV0pOwotICAgIHJlcXVlc3QgPSAoYnVmWzldICYgMHg4MCkgPyAwIDogMTsKLSAgICBmbGFnczIgPSBFWFRSQUNUX0xFXzE2QklUUygmYnVmWzEwXSk7Ci0gICAgdW5pY29kZXN0ciA9IGZsYWdzMiAmIDB4ODAwMDsKLSAgICBudGVycmNvZGVzID0gZmxhZ3MyICYgMHg0MDAwOwotICAgIHN0YXJ0YnVmID0gYnVmOwotCi0gICAgY29tbWFuZCA9IGJ1Zls0XTsKLQotICAgIGZuID0gc21iZmluZChjb21tYW5kLCBzbWJfZm5zKTsKLQotICAgIGlmICh2ZmxhZyA+IDEpCi0JcHJpbnRmKCJcbiIpOwotCi0gICAgcHJpbnRmKCJTTUIgUEFDS0VUOiAlcyAoJXMpXG4iLCBmbi0+bmFtZSwgcmVxdWVzdCA/ICJSRVFVRVNUIiA6ICJSRVBMWSIpOwotCi0gICAgaWYgKHZmbGFnIDwgMikKLQlyZXR1cm47Ci0KLSAgICAvKiBwcmludCBvdXQgdGhlIGhlYWRlciAqLwotICAgIHNtYl9mZGF0YShidWYsIGZtdF9zbWJoZWFkZXIsIGJ1ZiArIDMzLCB1bmljb2Rlc3RyKTsKLQotICAgIGlmIChudGVycmNvZGVzKSB7Ci0gICAgCW50ZXJyb3IgPSBFWFRSQUNUX0xFXzMyQklUUygmYnVmWzVdKTsKLQlpZiAobnRlcnJvcikKLQkgICAgcHJpbnRmKCJOVEVycm9yID0gJXNcbiIsIG50X2VycnN0cihudGVycm9yKSk7Ci0gICAgfSBlbHNlIHsKLQlpZiAoYnVmWzVdKQotCSAgICBwcmludGYoIlNNQkVycm9yID0gJXNcbiIsIHNtYl9lcnJzdHIoYnVmWzVdLCBFWFRSQUNUX0xFXzE2QklUUygmYnVmWzddKSkpOwotICAgIH0KLQotICAgIHNtYm9mZnNldCA9IDMyOwotCi0gICAgZm9yICg7OykgewotCWNvbnN0IGNoYXIgKmYxLCAqZjI7Ci0JaW50IHdjdDsKLQl1X2ludCBiY2M7Ci0JaW50IG5ld3NtYm9mZnNldDsKLQotCXdvcmRzID0gYnVmICsgc21ib2Zmc2V0OwotCVRDSEVDSyh3b3Jkc1swXSk7Ci0Jd2N0ID0gd29yZHNbMF07Ci0JZGF0YSA9IHdvcmRzICsgMSArIHdjdCAqIDI7Ci0JbWF4d29yZHMgPSBTTUJNSU4oZGF0YSwgbWF4YnVmKTsKLQotCWlmIChyZXF1ZXN0KSB7Ci0JICAgIGYxID0gZm4tPmRlc2NyaXB0LnJlcV9mMTsKLQkgICAgZjIgPSBmbi0+ZGVzY3JpcHQucmVxX2YyOwotCX0gZWxzZSB7Ci0JICAgIGYxID0gZm4tPmRlc2NyaXB0LnJlcF9mMTsKLQkgICAgZjIgPSBmbi0+ZGVzY3JpcHQucmVwX2YyOwotCX0KLQotCWlmIChmbi0+ZGVzY3JpcHQuZm4pCi0JICAgICgqZm4tPmRlc2NyaXB0LmZuKSh3b3JkcywgZGF0YSwgYnVmLCBtYXhidWYpOwotCWVsc2UgewotCSAgICBpZiAod2N0KSB7Ci0JCWlmIChmMSkKLQkJICAgIHNtYl9mZGF0YSh3b3JkcyArIDEsIGYxLCB3b3JkcyArIDEgKyB3Y3QgKiAyLCB1bmljb2Rlc3RyKTsKLQkJZWxzZSB7Ci0JCSAgICBpbnQgaTsKLQkJICAgIGludCB2OwotCi0JCSAgICBmb3IgKGkgPSAwOyAmd29yZHNbMSArIDIgKiBpXSA8IG1heHdvcmRzOyBpKyspIHsKLQkJCVRDSEVDSzIod29yZHNbMSArIDIgKiBpXSwgMik7Ci0JCQl2ID0gRVhUUkFDVF9MRV8xNkJJVFMod29yZHMgKyAxICsgMiAqIGkpOwotCQkJcHJpbnRmKCJzbWJfdnd2WyVkXT0lZCAoMHglWClcbiIsIGksIHYsIHYpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgICBUQ0hFQ0syKCpkYXRhLCAyKTsKLQkgICAgYmNjID0gRVhUUkFDVF9MRV8xNkJJVFMoZGF0YSk7Ci0JICAgIHByaW50Zigic21iX2JjYz0ldVxuIiwgYmNjKTsKLQkgICAgaWYgKGYyKSB7Ci0JCWlmIChiY2MgPiAwKQotCQkgICAgc21iX2ZkYXRhKGRhdGEgKyAyLCBmMiwgZGF0YSArIDIgKyBiY2MsIHVuaWNvZGVzdHIpOwotCSAgICB9IGVsc2UgewotCQlpZiAoYmNjID4gMCkgewotCQkgICAgcHJpbnRmKCJzbWJfYnVmW109XG4iKTsKLQkJICAgIHByaW50X2RhdGEoZGF0YSArIDIsIFNNQk1JTihiY2MsIFBUUl9ESUZGKG1heGJ1ZiwgZGF0YSArIDIpKSk7Ci0JCX0KLQkgICAgfQotCX0KLQotCWlmICgoZm4tPmZsYWdzICYgRkxHX0NIQUlOKSA9PSAwKQotCSAgICBicmVhazsKLQlpZiAod2N0ID09IDApCi0JICAgIGJyZWFrOwotCVRDSEVDSyh3b3Jkc1sxXSk7Ci0JY29tbWFuZCA9IHdvcmRzWzFdOwotCWlmIChjb21tYW5kID09IDB4RkYpCi0JICAgIGJyZWFrOwotCVRDSEVDSzIod29yZHNbM10sIDIpOwotCW5ld3NtYm9mZnNldCA9IEVYVFJBQ1RfTEVfMTZCSVRTKHdvcmRzICsgMyk7IAotCi0JZm4gPSBzbWJmaW5kKGNvbW1hbmQsIHNtYl9mbnMpOwotCi0JcHJpbnRmKCJcblNNQiBQQUNLRVQ6ICVzICglcykgKENIQUlORUQpXG4iLAotCSAgICBmbi0+bmFtZSwgcmVxdWVzdCA/ICJSRVFVRVNUIiA6ICJSRVBMWSIpOwotCWlmIChuZXdzbWJvZmZzZXQgPD0gc21ib2Zmc2V0KSB7Ci0JICAgIHByaW50ZigiQmFkIGFuZFggb2Zmc2V0OiAldSA8PSAldVxuIiwgbmV3c21ib2Zmc2V0LCBzbWJvZmZzZXQpOwotCSAgICBicmVhazsKLQl9Ci0Jc21ib2Zmc2V0ID0gbmV3c21ib2Zmc2V0OwotICAgIH0KLQotICAgIHByaW50ZigiXG4iKTsKLSAgICByZXR1cm47Ci10cnVuYzoKLSAgICBwcmludGYoIlt8U01CXSIpOwotICAgIHJldHVybjsKLX0KLQotCi0vKgotICogcHJpbnQgYSBOQlQgcGFja2V0IHJlY2VpdmVkIGFjcm9zcyB0Y3Agb24gcG9ydCAxMzkKLSAqLwotdm9pZAotbmJ0X3RjcF9wcmludChjb25zdCB1X2NoYXIgKmRhdGEsIGludCBsZW5ndGgpCi17Ci0gICAgaW50IGNhcGxlbjsKLSAgICBpbnQgdHlwZTsKLSAgICB1X2ludCBuYnRfbGVuOwotICAgIGNvbnN0IHVfY2hhciAqbWF4YnVmOwotCi0gICAgaWYgKGxlbmd0aCA8IDQpCi0JZ290byB0cnVuYzsKLSAgICBpZiAoc25hcGVuZCA8IGRhdGEpCi0JZ290byB0cnVuYzsKLSAgICBjYXBsZW4gPSBzbmFwZW5kIC0gZGF0YTsKLSAgICBpZiAoY2FwbGVuIDwgNCkKLQlnb3RvIHRydW5jOwotICAgIG1heGJ1ZiA9IGRhdGEgKyBjYXBsZW47Ci0gICAgdHlwZSA9IGRhdGFbMF07Ci0gICAgbmJ0X2xlbiA9IEVYVFJBQ1RfMTZCSVRTKGRhdGEgKyAyKTsKLSAgICBsZW5ndGggLT0gNDsKLSAgICBjYXBsZW4gLT0gNDsKLQotICAgIHN0YXJ0YnVmID0gZGF0YTsKLQotICAgIGlmICh2ZmxhZyA8IDIpIHsKLQlwcmludGYoIiBOQlQgU2Vzc2lvbiBQYWNrZXQ6ICIpOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgMHgwMDoKLQkgICAgcHJpbnRmKCJTZXNzaW9uIE1lc3NhZ2UiKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIDB4ODE6Ci0JICAgIHByaW50ZigiU2Vzc2lvbiBSZXF1ZXN0Iik7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSAweDgyOgotCSAgICBwcmludGYoIlNlc3Npb24gR3JhbnRlZCIpOwotCSAgICBicmVhazsKLQotCWNhc2UgMHg4MzoKLQkgIHsKLQkgICAgaW50IGVjb2RlOwotCi0JICAgIGlmIChuYnRfbGVuIDwgNCkKLQkJZ290byB0cnVuYzsKLQkgICAgaWYgKGxlbmd0aCA8IDQpCi0JCWdvdG8gdHJ1bmM7Ci0JICAgIGlmIChjYXBsZW4gPCA0KQotCQlnb3RvIHRydW5jOwotCSAgICBlY29kZSA9IGRhdGFbNF07Ci0KLQkgICAgcHJpbnRmKCJTZXNzaW9uIFJlamVjdCwgIik7Ci0JICAgIHN3aXRjaCAoZWNvZGUpIHsKLQkgICAgY2FzZSAweDgwOgotCQlwcmludGYoIk5vdCBsaXN0ZW5pbmcgb24gY2FsbGVkIG5hbWUiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHg4MToKLQkJcHJpbnRmKCJOb3QgbGlzdGVuaW5nIGZvciBjYWxsaW5nIG5hbWUiKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMHg4MjoKLQkJcHJpbnRmKCJDYWxsZWQgbmFtZSBub3QgcHJlc2VudCIpOwotCQlicmVhazsKLQkgICAgY2FzZSAweDgzOgotCQlwcmludGYoIkNhbGxlZCBuYW1lIHByZXNlbnQsIGJ1dCBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIik7Ci0JCWJyZWFrOwotCSAgICBkZWZhdWx0OgotCQlwcmludGYoIlVuc3BlY2lmaWVkIGVycm9yIDB4JVgiLCBlY29kZSk7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICB9Ci0JICAgIGJyZWFrOwotCi0JY2FzZSAweDg1OgotCSAgICBwcmludGYoIlNlc3Npb24gS2VlcGFsaXZlIik7Ci0JICAgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiVW5rbm93biBwYWNrZXQgdHlwZSBbckJdIiwgbWF4YnVmLCAwKTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0gZWxzZSB7Ci0JcHJpbnRmICgiXG4+Pj4gTkJUIFNlc3Npb24gUGFja2V0XG4iKTsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIDB4MDA6Ci0JICAgIGRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgIltQMV1OQlQgU2Vzc2lvbiBNZXNzYWdlXG5GbGFncz1bQl1cbkxlbmd0aD1bcmRdXG4iLAotCQlkYXRhICsgNCwgMCk7Ci0JICAgIGlmIChkYXRhID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICBpZiAobmJ0X2xlbiA+PSA0ICYmIGNhcGxlbiA+PSA0ICYmIG1lbWNtcChkYXRhLCJcMzc3U01CIiw0KSA9PSAwKSB7Ci0JCWlmICgoaW50KW5idF9sZW4gPiBjYXBsZW4pIHsKLQkJICAgIGlmICgoaW50KW5idF9sZW4gPiBsZW5ndGgpCi0JCQlwcmludGYoIldBUk5JTkc6IFBhY2tldCBpcyBjb250aW51ZWQgaW4gbGF0ZXIgVENQIHNlZ21lbnRzXG4iKTsKLQkJICAgIGVsc2UKLQkJCXByaW50ZigiV0FSTklORzogU2hvcnQgcGFja2V0LiBUcnkgaW5jcmVhc2luZyB0aGUgc25hcCBsZW5ndGggYnkgJWRcbiIsCi0JCQkgICAgbmJ0X2xlbiAtIGNhcGxlbik7Ci0JCX0KLQkJcHJpbnRfc21iKGRhdGEsIG1heGJ1ZiA+IGRhdGEgKyBuYnRfbGVuID8gZGF0YSArIG5idF9sZW4gOiBtYXhidWYpOwotCSAgICB9IGVsc2UKLQkJcHJpbnRmKCJTZXNzaW9uIHBhY2tldDoocmF3IGRhdGEgb3IgY29udGludWF0aW9uPylcbiIpOwotCSAgICBicmVhazsKLQotCWNhc2UgMHg4MToKLQkgICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLAotCQkiW1AxXU5CVCBTZXNzaW9uIFJlcXVlc3RcbkZsYWdzPVtCXVxuTGVuZ3RoPVtyZF1cbkRlc3RpbmF0aW9uPVtuMV1cblNvdXJjZT1bbjFdXG4iLAotCQltYXhidWYsIDApOwotCSAgICBicmVhazsKLQotCWNhc2UgMHg4MjoKLQkgICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiW1AxXU5CVCBTZXNzaW9uIEdyYW50ZWRcbkZsYWdzPVtCXVxuTGVuZ3RoPVtyZF1cbiIsIG1heGJ1ZiwgMCk7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSAweDgzOgotCSAgewotCSAgICBjb25zdCB1X2NoYXIgKm9yaWdkYXRhOwotCSAgICBpbnQgZWNvZGU7Ci0KLQkgICAgb3JpZ2RhdGEgPSBkYXRhOwotCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJbUDFdTkJUIFNlc3Npb25SZWplY3RcbkZsYWdzPVtCXVxuTGVuZ3RoPVtyZF1cblJlYXNvbj1bQl1cbiIsCi0JCW1heGJ1ZiwgMCk7Ci0JICAgIGlmIChkYXRhID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICBpZiAobmJ0X2xlbiA+PSAxICYmIGNhcGxlbiA+PSAxKSB7Ci0JCWVjb2RlID0gb3JpZ2RhdGFbNF07Ci0JCXN3aXRjaCAoZWNvZGUpIHsKLQkJY2FzZSAweDgwOgotCQkgICAgcHJpbnRmKCJOb3QgbGlzdGVuaW5nIG9uIGNhbGxlZCBuYW1lXG4iKTsKLQkJICAgIGJyZWFrOwotCQljYXNlIDB4ODE6Ci0JCSAgICBwcmludGYoIk5vdCBsaXN0ZW5pbmcgZm9yIGNhbGxpbmcgbmFtZVxuIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAweDgyOgotCQkgICAgcHJpbnRmKCJDYWxsZWQgbmFtZSBub3QgcHJlc2VudFxuIik7Ci0JCSAgICBicmVhazsKLQkJY2FzZSAweDgzOgotCQkgICAgcHJpbnRmKCJDYWxsZWQgbmFtZSBwcmVzZW50LCBidXQgaW5zdWZmaWNpZW50IHJlc291cmNlc1xuIik7Ci0JCSAgICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAgIHByaW50ZigiVW5zcGVjaWZpZWQgZXJyb3IgMHglWFxuIiwgZWNvZGUpOwotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgfQotCSAgICBicmVhazsKLQotCWNhc2UgMHg4NToKLQkgICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiW1AxXU5CVCBTZXNzaW9uIEtlZXBhbGl2ZVxuRmxhZ3M9W0JdXG5MZW5ndGg9W3JkXVxuIiwgbWF4YnVmLCAwKTsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJOQlQgLSBVbmtub3duIHBhY2tldCB0eXBlXG5UeXBlPVtCXVxuIiwgbWF4YnVmLCAwKTsKLQkgICAgYnJlYWs7Ci0JfQotCXByaW50ZigiXG4iKTsKLQlmZmx1c2goc3Rkb3V0KTsKLSAgICB9Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJbfFNNQl0iKTsKLSAgICByZXR1cm47Ci19Ci0KLQotLyoKLSAqIHByaW50IGEgTkJUIHBhY2tldCByZWNlaXZlZCBhY3Jvc3MgdWRwIG9uIHBvcnQgMTM3Ci0gKi8KLXZvaWQKLW5idF91ZHAxMzdfcHJpbnQoY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgbGVuZ3RoKQotewotICAgIGNvbnN0IHVfY2hhciAqbWF4YnVmID0gZGF0YSArIGxlbmd0aDsKLSAgICBpbnQgbmFtZV90cm5faWQsIHJlc3BvbnNlLCBvcGNvZGUsIG5tX2ZsYWdzLCByY29kZTsKLSAgICBpbnQgcWRjb3VudCwgYW5jb3VudCwgbnNjb3VudCwgYXJjb3VudDsKLSAgICBjb25zdCBjaGFyICpvcGNvZGVzdHI7Ci0gICAgY29uc3QgdV9jaGFyICpwOwotICAgIGludCB0b3RhbCwgaTsKLQotICAgIFRDSEVDSzIoZGF0YVsxMF0sIDIpOwotICAgIG5hbWVfdHJuX2lkID0gRVhUUkFDVF8xNkJJVFMoZGF0YSk7Ci0gICAgcmVzcG9uc2UgPSAoZGF0YVsyXSA+PiA3KTsKLSAgICBvcGNvZGUgPSAoZGF0YVsyXSA+PiAzKSAmIDB4RjsKLSAgICBubV9mbGFncyA9ICgoZGF0YVsyXSAmIDB4NykgPDwgNCkgKyAoZGF0YVszXSA+PiA0KTsKLSAgICByY29kZSA9IGRhdGFbM10gJiAweEY7Ci0gICAgcWRjb3VudCA9IEVYVFJBQ1RfMTZCSVRTKGRhdGEgKyA0KTsKLSAgICBhbmNvdW50ID0gRVhUUkFDVF8xNkJJVFMoZGF0YSArIDYpOwotICAgIG5zY291bnQgPSBFWFRSQUNUXzE2QklUUyhkYXRhICsgOCk7Ci0gICAgYXJjb3VudCA9IEVYVFJBQ1RfMTZCSVRTKGRhdGEgKyAxMCk7Ci0gICAgc3RhcnRidWYgPSBkYXRhOwotCi0gICAgaWYgKG1heGJ1ZiA8PSBkYXRhKQotCXJldHVybjsKLQotICAgIGlmICh2ZmxhZyA+IDEpCi0JcHJpbnRmKCJcbj4+PiAiKTsKLQotICAgIHByaW50ZigiTkJUIFVEUCBQQUNLRVQoMTM3KTogIik7Ci0KLSAgICBzd2l0Y2ggKG9wY29kZSkgewotICAgIGNhc2UgMDogb3Bjb2Rlc3RyID0gIlFVRVJZIjsgYnJlYWs7Ci0gICAgY2FzZSA1OiBvcGNvZGVzdHIgPSAiUkVHSVNUUkFUSU9OIjsgYnJlYWs7Ci0gICAgY2FzZSA2OiBvcGNvZGVzdHIgPSAiUkVMRUFTRSI7IGJyZWFrOwotICAgIGNhc2UgNzogb3Bjb2Rlc3RyID0gIldBQ0siOyBicmVhazsKLSAgICBjYXNlIDg6IG9wY29kZXN0ciA9ICJSRUZSRVNIKDgpIjsgYnJlYWs7Ci0gICAgY2FzZSA5OiBvcGNvZGVzdHIgPSAiUkVGUkVTSCI7IGJyZWFrOwotICAgIGNhc2UgMTU6IG9wY29kZXN0ciA9ICJNVUxUSUhPTUVEIFJFR0lTVFJBVElPTiI7IGJyZWFrOwotICAgIGRlZmF1bHQ6IG9wY29kZXN0ciA9ICJPUFVOS05PV04iOyBicmVhazsKLSAgICB9Ci0gICAgcHJpbnRmKCIlcyIsIG9wY29kZXN0cik7Ci0gICAgaWYgKHJlc3BvbnNlKSB7Ci0JaWYgKHJjb2RlKQotCSAgICBwcmludGYoIjsgTkVHQVRJVkUiKTsKLQllbHNlCi0JICAgIHByaW50ZigiOyBQT1NJVElWRSIpOwotICAgIH0KLQotICAgIGlmIChyZXNwb25zZSkKLQlwcmludGYoIjsgUkVTUE9OU0UiKTsKLSAgICBlbHNlCi0JcHJpbnRmKCI7IFJFUVVFU1QiKTsKLQotICAgIGlmIChubV9mbGFncyAmIDEpCi0JcHJpbnRmKCI7IEJST0FEQ0FTVCIpOwotICAgIGVsc2UKLQlwcmludGYoIjsgVU5JQ0FTVCIpOwotCi0gICAgaWYgKHZmbGFnIDwgMikKLQlyZXR1cm47Ci0KLSAgICBwcmludGYoIlxuVHJuSUQ9MHglWFxuT3BDb2RlPSVkXG5ObUZsYWdzPTB4JVhcblJjb2RlPSVkXG5RdWVyeUNvdW50PSVkXG5BbnN3ZXJDb3VudD0lZFxuQXV0aG9yaXR5Q291bnQ9JWRcbkFkZHJlc3NSZWNDb3VudD0lZFxuIiwKLQluYW1lX3Rybl9pZCwgb3Bjb2RlLCBubV9mbGFncywgcmNvZGUsIHFkY291bnQsIGFuY291bnQsIG5zY291bnQsCi0JYXJjb3VudCk7Ci0KLSAgICBwID0gZGF0YSArIDEyOwotCi0gICAgdG90YWwgPSBhbmNvdW50ICsgbnNjb3VudCArIGFyY291bnQ7Ci0KLSAgICBpZiAocWRjb3VudCA+IDEwMCB8fCB0b3RhbCA+IDEwMCkgewotCXByaW50ZigiQ29ycnVwdCBwYWNrZXQ/P1xuIik7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChxZGNvdW50KSB7Ci0JcHJpbnRmKCJRdWVzdGlvblJlY29yZHM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgcWRjb3VudDsgaSsrKSB7Ci0JICAgIHAgPSBzbWJfZmRhdGEocCwKLQkJInxOYW1lPVtuMV1cblF1ZXN0aW9uVHlwZT1bcnddXG5RdWVzdGlvbkNsYXNzPVtyd11cbiMiLAotCQltYXhidWYsIDApOwotCSAgICBpZiAocCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHRvdGFsKSB7Ci0JcHJpbnRmKCJcblJlc291cmNlUmVjb3JkczpcbiIpOwotCWZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKSB7Ci0JICAgIGludCByZGxlbjsKLQkgICAgaW50IHJlc3R5cGU7Ci0KLQkgICAgcCA9IHNtYl9mZGF0YShwLCAiTmFtZT1bbjFdXG4jIiwgbWF4YnVmLCAwKTsKLQkgICAgaWYgKHAgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0JICAgIHJlc3R5cGUgPSBFWFRSQUNUXzE2QklUUyhwKTsKLQkgICAgcCA9IHNtYl9mZGF0YShwLCAiUmVzVHlwZT1bcnddXG5SZXNDbGFzcz1bcnddXG5UVEw9W3JEXVxuIiwgcCArIDgsIDApOwotCSAgICBpZiAocCA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQkgICAgcmRsZW4gPSBFWFRSQUNUXzE2QklUUyhwKTsKLQkgICAgcHJpbnRmKCJSZXNvdXJjZUxlbmd0aD0lZFxuUmVzb3VyY2VEYXRhPVxuIiwgcmRsZW4pOwotCSAgICBwICs9IDI7Ci0JICAgIGlmIChyZGxlbiA9PSA2KSB7Ci0JCXAgPSBzbWJfZmRhdGEocCwgIkFkZHJUeXBlPVtyd11cbkFkZHJlc3M9W2IuYi5iLmJdXG4iLCBwICsgcmRsZW4sIDApOwotCQlpZiAocCA9PSBOVUxMKQotCQkgICAgZ290byBvdXQ7Ci0JICAgIH0gZWxzZSB7Ci0JCWlmIChyZXN0eXBlID09IDB4MjEpIHsKLQkJICAgIGludCBudW1uYW1lczsKLQotCQkgICAgVENIRUNLKCpwKTsKLQkJICAgIG51bW5hbWVzID0gcFswXTsKLQkJICAgIHAgPSBzbWJfZmRhdGEocCwgIk51bU5hbWVzPVtCXVxuIiwgcCArIDEsIDApOwotCQkgICAgaWYgKHAgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwotCQkgICAgd2hpbGUgKG51bW5hbWVzLS0pIHsKLQkJCXAgPSBzbWJfZmRhdGEocCwgIk5hbWU9W24yXVx0IyIsIG1heGJ1ZiwgMCk7Ci0JCQlpZiAocCA9PSBOVUxMKQotCQkJICAgIGdvdG8gb3V0OwotCQkJVENIRUNLKCpwKTsKLQkJCWlmIChwWzBdICYgMHg4MCkKLQkJCSAgICBwcmludGYoIjxHUk9VUD4gIik7Ci0JCQlzd2l0Y2ggKHBbMF0gJiAweDYwKSB7Ci0JCQljYXNlIDB4MDA6IHByaW50ZigiQiAiKTsgYnJlYWs7Ci0JCQljYXNlIDB4MjA6IHByaW50ZigiUCAiKTsgYnJlYWs7Ci0JCQljYXNlIDB4NDA6IHByaW50ZigiTSAiKTsgYnJlYWs7Ci0JCQljYXNlIDB4NjA6IHByaW50ZigiXyAiKTsgYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocFswXSAmIDB4MTApCi0JCQkgICAgcHJpbnRmKCI8REVSRUdJU1RFUklORz4gIik7Ci0JCQlpZiAocFswXSAmIDB4MDgpCi0JCQkgICAgcHJpbnRmKCI8Q09ORkxJQ1Q+ICIpOwotCQkJaWYgKHBbMF0gJiAweDA0KQotCQkJICAgIHByaW50ZigiPEFDVElWRT4gIik7Ci0JCQlpZiAocFswXSAmIDB4MDIpCi0JCQkgICAgcHJpbnRmKCI8UEVSTUFORU5UPiAiKTsKLQkJCXByaW50ZigiXG4iKTsKLQkJCXAgKz0gMjsKLQkJICAgIH0KLQkJfSBlbHNlIHsKLQkJICAgIHByaW50X2RhdGEocCwgbWluKHJkbGVuLCBsZW5ndGggLSAocCAtIGRhdGEpKSk7Ci0JCSAgICBwICs9IHJkbGVuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgaWYgKHAgPCBtYXhidWYpCi0Jc21iX2ZkYXRhKHAsICJBZGRpdGlvbmFsRGF0YTpcbiIsIG1heGJ1ZiwgMCk7Ci0KLW91dDoKLSAgICBwcmludGYoIlxuIik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci0gICAgcmV0dXJuOwotdHJ1bmM6Ci0gICAgcHJpbnRmKCJbfFNNQl0iKTsKLSAgICByZXR1cm47Ci19Ci0KLQotCi0vKgotICogcHJpbnQgYSBOQlQgcGFja2V0IHJlY2VpdmVkIGFjcm9zcyB1ZHAgb24gcG9ydCAxMzgKLSAqLwotdm9pZAotbmJ0X3VkcDEzOF9wcmludChjb25zdCB1X2NoYXIgKmRhdGEsIGludCBsZW5ndGgpCi17Ci0gICAgY29uc3QgdV9jaGFyICptYXhidWYgPSBkYXRhICsgbGVuZ3RoOwotCi0gICAgaWYgKG1heGJ1ZiA+IHNuYXBlbmQpCi0JbWF4YnVmID0gc25hcGVuZDsKLSAgICBpZiAobWF4YnVmIDw9IGRhdGEpCi0JcmV0dXJuOwotICAgIHN0YXJ0YnVmID0gZGF0YTsKLQotICAgIGlmICh2ZmxhZyA8IDIpIHsKLQlwcmludGYoIk5CVCBVRFAgUEFDS0VUKDEzOCkiKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZGF0YSA9IHNtYl9mZGF0YShkYXRhLAotCSJcbj4+PiBOQlQgVURQIFBBQ0tFVCgxMzgpIFJlcz1bcnddIElEPVtyd10gSVA9W2IuYi5iLmJdIFBvcnQ9W3JkXSBMZW5ndGg9W3JkXSBSZXMyPVtyd11cblNvdXJjZU5hbWU9W24xXVxuRGVzdE5hbWU9W24xXVxuIyIsCi0JbWF4YnVmLCAwKTsKLQotICAgIGlmIChkYXRhICE9IE5VTEwpIHsKLQkvKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSBmb3IgIlwzNzdTTUIiLCBkb24ndCBjaGVjayBmb3IgaXQuICovCi0JaWYgKCZkYXRhWzNdID49IG1heGJ1ZikKLQkgICAgZ290byBvdXQ7Ci0KLQlpZiAobWVtY21wKGRhdGEsICJcMzc3U01CIiw0KSA9PSAwKQotCSAgICBwcmludF9zbWIoZGF0YSwgbWF4YnVmKTsKLSAgICB9Ci1vdXQ6Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIGZmbHVzaChzdGRvdXQpOwotfQotCi0KLS8qCi0gICBwcmludCBuZXRiZXVpIGZyYW1lcwotKi8KLXN0cnVjdCBuYmZfc3RyaW5ncyB7Ci0JY29uc3QgY2hhcgkqbmFtZTsKLQljb25zdCBjaGFyCSpub252ZXJib3NlOwotCWNvbnN0IGNoYXIJKnZlcmJvc2U7Ci19IG5iZl9zdHJpbmdzWzB4MjBdID0gewotCXsgIkFkZCBHcm91cCBOYW1lIFF1ZXJ5IiwgIiwgW1AyM11OYW1lIHRvIGFkZD1bbjJdIyIsCi0JICAiW1A1XVJlc3BvbnNlQ29ycmVsYXRvcj1bd11cbltQMTZdTmFtZSB0byBhZGQ9W24yXVxuIiB9LAotCXsgIkFkZCBOYW1lIFF1ZXJ5IiwgIiwgW1AyM11OYW1lIHRvIGFkZD1bbjJdIyIsCi0JICAiW1A1XVJlc3BvbnNlQ29ycmVsYXRvcj1bd11cbltQMTZdTmFtZSB0byBhZGQ9W24yXVxuIiB9LAotCXsgIk5hbWUgSW4gQ29uZmxpY3QiLCBOVUxMLCBOVUxMIH0sCi0JeyAiU3RhdHVzIFF1ZXJ5IiwgTlVMTCwgTlVMTCB9LAotCXsgTlVMTCwgTlVMTCwgTlVMTCB9LAkvKiBub3QgdXNlZCAqLwotCXsgTlVMTCwgTlVMTCwgTlVMTCB9LAkvKiBub3QgdXNlZCAqLwotCXsgTlVMTCwgTlVMTCwgTlVMTCB9LAkvKiBub3QgdXNlZCAqLwotCXsgIlRlcm1pbmF0ZSBUcmFjZSIsIE5VTEwsIE5VTEwgfSwKLQl7ICJEYXRhZ3JhbSIsIE5VTEwsCi0JICAiW1A3XURlc3RpbmF0aW9uPVtuMl1cblNvdXJjZT1bbjJdXG4iIH0sCi0JeyAiQnJvYWRjYXN0IERhdGFncmFtIiwgTlVMTCwKLQkgICJbUDddRGVzdGluYXRpb249W24yXVxuU291cmNlPVtuMl1cbiIgfSwKLQl7ICJOYW1lIFF1ZXJ5IiwgIiwgW1A3XU5hbWU9W24yXSMiLAotCSAgIltQMV1TZXNzaW9uTnVtYmVyPVtCXVxuTmFtZVR5cGU9W0JdW1AyXVxuUmVzcG9uc2VDb3JyZWxhdG9yPVt3XVxuTmFtZT1bbjJdXG5OYW1lIG9mIHNlbmRlcj1bbjJdXG4iIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCi0JeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCi0JeyAiQWRkIE5hbWUgUmVzcG9uc2UiLCAiLCBbUDFdR3JvdXBOYW1lPVt3XSBbUDRdRGVzdGluYXRpb249W24yXSBTb3VyY2U9W24yXSMiLAotCSAgIkFkZE5hbWVJblByb2Nlc3M9W0JdXG5Hcm91cE5hbWU9W3ddXG5UcmFuc21pdENvcnJlbGF0b3I9W3ddW1AyXVxuRGVzdGluYXRpb249W24yXVxuU291cmNlPVtuMl1cbiIgfSwKLQl7ICJOYW1lIFJlY29nbml6ZWQiLCBOVUxMLAotCSAgIltQMV1EYXRhMj1bd11cblRyYW5zbWl0Q29ycmVsYXRvcj1bd11cblJlc3BvbnNlQ29yZWxhdG9yPVt3XVxuRGVzdGluYXRpb249W24yXVxuU291cmNlPVtuMl1cbiIgfSwKLQl7ICJTdGF0dXMgUmVzcG9uc2UiLCBOVUxMLCBOVUxMIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCi0JeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCi0JeyBOVUxMLCBOVUxMLCBOVUxMIH0sCS8qIG5vdCB1c2VkICovCi0JeyAiVGVybWluYXRlIFRyYWNlIiwgTlVMTCwgTlVMTCB9LAotCXsgIkRhdGEgQWNrIiwgTlVMTCwKLQkgICJbUDNdVHJhbnNtaXRDb3JyZWxhdG9yPVt3XVtQMl1cblJlbW90ZVNlc3Npb25OdW1iZXI9W0JdXG5Mb2NhbFNlc3Npb25OdW1iZXI9W0JdXG4iIH0sCi0JeyAiRGF0YSBGaXJzdC9NaWRkbGUiLCBOVUxMLAotCSAgIkZsYWdzPVt7UkVDRUlWRV9DT05USU5VRXxOT19BQ0t8fFBJR0dZQkFDS19BQ0tfSU5DTFVERUR8fV1cblJlc3luY0luZGljYXRvcj1bd11bUDJdXG5SZXNwb25zZUNvcmVsYXRvcj1bd11cblJlbW90ZVNlc3Npb25OdW1iZXI9W0JdXG5Mb2NhbFNlc3Npb25OdW1iZXI9W0JdXG4iIH0sCi0JeyAiRGF0YSBPbmx5L0xhc3QiLCBOVUxMLAotCSAgIkZsYWdzPVt7fE5PX0FDS3xQSUdHWUJBQ0tfQUNLX0FMTE9XRUR8UElHR1lCQUNLX0FDS19JTkNMVURFRHx9XVxuUmVzeW5jSW5kaWNhdG9yPVt3XVtQMl1cblJlc3BvbnNlQ29yZWxhdG9yPVt3XVxuUmVtb3RlU2Vzc2lvbk51bWJlcj1bQl1cbkxvY2FsU2Vzc2lvbk51bWJlcj1bQl1cbiIgfSwKLQl7ICJTZXNzaW9uIENvbmZpcm0iLCBOVUxMLAotCSAgIkRhdGExPVtCXVxuRGF0YTI9W3ddXG5UcmFuc21pdENvcnJlbGF0b3I9W3ddXG5SZXNwb25zZUNvcmVsYXRvcj1bd11cblJlbW90ZVNlc3Npb25OdW1iZXI9W0JdXG5Mb2NhbFNlc3Npb25OdW1iZXI9W0JdXG4iIH0sCi0JeyAiU2Vzc2lvbiBFbmQiLCBOVUxMLAotCSAgIltQMV1EYXRhMj1bd11bUDRdXG5SZW1vdGVTZXNzaW9uTnVtYmVyPVtCXVxuTG9jYWxTZXNzaW9uTnVtYmVyPVtCXVxuIiB9LAotCXsgIlNlc3Npb24gSW5pdGlhbGl6ZSIsIE5VTEwsCi0JICAiRGF0YTE9W0JdXG5EYXRhMj1bd11cblRyYW5zbWl0Q29ycmVsYXRvcj1bd11cblJlc3BvbnNlQ29yZWxhdG9yPVt3XVxuUmVtb3RlU2Vzc2lvbk51bWJlcj1bQl1cbkxvY2FsU2Vzc2lvbk51bWJlcj1bQl1cbiIgfSwKLQl7ICJObyBSZWNlaXZlIiwgTlVMTCwKLQkgICJGbGFncz1be3xTRU5EX05PX0FDS31dXG5EYXRhQnl0ZXNBY2NlcHRlZD1bYl1bUDRdXG5SZW1vdGVTZXNzaW9uTnVtYmVyPVtCXVxuTG9jYWxTZXNzaW9uTnVtYmVyPVtCXVxuIiB9LAotCXsgIlJlY2VpdmUgT3V0c3RhbmRpbmciLCBOVUxMLAotCSAgIltQMV1EYXRhQnl0ZXNBY2NlcHRlZD1bYl1bUDRdXG5SZW1vdGVTZXNzaW9uTnVtYmVyPVtCXVxuTG9jYWxTZXNzaW9uTnVtYmVyPVtCXVxuIiB9LAotCXsgIlJlY2VpdmUgQ29udGludWUiLCBOVUxMLAotCSAgIltQMl1UcmFuc21pdENvcnJlbGF0b3I9W3ddXG5bUDJdUmVtb3RlU2Vzc2lvbk51bWJlcj1bQl1cbkxvY2FsU2Vzc2lvbk51bWJlcj1bQl1cbiIgfSwKLQl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KLQl7IE5VTEwsIE5VTEwsIE5VTEwgfSwJLyogbm90IHVzZWQgKi8KLQl7ICJTZXNzaW9uIEFsaXZlIiwgTlVMTCwgTlVMTCB9Ci19OwotCi12b2lkCi1uZXRiZXVpX3ByaW50KHVfc2hvcnQgY29udHJvbCwgY29uc3QgdV9jaGFyICpkYXRhLCBpbnQgbGVuZ3RoKQotewotICAgIGNvbnN0IHVfY2hhciAqbWF4YnVmID0gZGF0YSArIGxlbmd0aDsKLSAgICBpbnQgbGVuOwotICAgIGludCBjb21tYW5kOwotICAgIGNvbnN0IHVfY2hhciAqZGF0YTI7Ci0gICAgaW50IGlzX3RydW5jYXRlZCA9IDA7Ci0KLSAgICBpZiAobWF4YnVmID4gc25hcGVuZCkKLQltYXhidWYgPSBzbmFwZW5kOwotICAgIFRDSEVDSyhkYXRhWzRdKTsKLSAgICBsZW4gPSBFWFRSQUNUX0xFXzE2QklUUyhkYXRhKTsKLSAgICBjb21tYW5kID0gZGF0YVs0XTsKLSAgICBkYXRhMiA9IGRhdGEgKyBsZW47Ci0gICAgaWYgKGRhdGEyID49IG1heGJ1ZikgewotCWRhdGEyID0gbWF4YnVmOwotCWlzX3RydW5jYXRlZCA9IDE7Ci0gICAgfQotCi0gICAgc3RhcnRidWYgPSBkYXRhOwotCi0gICAgaWYgKHZmbGFnIDwgMikgewotCXByaW50ZigiTkJGIFBhY2tldDogIik7Ci0JZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiW1A1XSMiLCBtYXhidWYsIDApOwotICAgIH0gZWxzZSB7Ci0JcHJpbnRmKCJcbj4+PiBOQkYgUGFja2V0XG5UeXBlPTB4JVggIiwgY29udHJvbCk7Ci0JZGF0YSA9IHNtYl9mZGF0YShkYXRhLCAiTGVuZ3RoPVtkXSBTaWduYXR1cmU9W3ddIENvbW1hbmQ9W0JdXG4jIiwgbWF4YnVmLCAwKTsKLSAgICB9Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlnb3RvIG91dDsKLQotICAgIGlmIChjb21tYW5kID4gMHgxZiB8fCBuYmZfc3RyaW5nc1tjb21tYW5kXS5uYW1lID09IE5VTEwpIHsKLQlpZiAodmZsYWcgPCAyKQotCSAgICBkYXRhID0gc21iX2ZkYXRhKGRhdGEsICJVbmtub3duIE5CRiBDb21tYW5kIyIsIGRhdGEyLCAwKTsKLQllbHNlCi0JICAgIGRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgIlVua25vd24gTkJGIENvbW1hbmRcbiIsIGRhdGEyLCAwKTsKLSAgICB9IGVsc2UgewotCWlmICh2ZmxhZyA8IDIpIHsKLQkgICAgcHJpbnRmKCIlcyIsIG5iZl9zdHJpbmdzW2NvbW1hbmRdLm5hbWUpOwotCSAgICBpZiAobmJmX3N0cmluZ3NbY29tbWFuZF0ubm9udmVyYm9zZSAhPSBOVUxMKQotCQlkYXRhID0gc21iX2ZkYXRhKGRhdGEsIG5iZl9zdHJpbmdzW2NvbW1hbmRdLm5vbnZlcmJvc2UsIGRhdGEyLCAwKTsKLQl9IGVsc2UgewotCSAgICBwcmludGYoIiVzOlxuIiwgbmJmX3N0cmluZ3NbY29tbWFuZF0ubmFtZSk7Ci0JICAgIGlmIChuYmZfc3RyaW5nc1tjb21tYW5kXS52ZXJib3NlICE9IE5VTEwpCi0JCWRhdGEgPSBzbWJfZmRhdGEoZGF0YSwgbmJmX3N0cmluZ3NbY29tbWFuZF0udmVyYm9zZSwgZGF0YTIsIDApOwotCSAgICBlbHNlCi0JCXByaW50ZigiXG4iKTsKLQl9Ci0gICAgfQotCi0gICAgaWYgKHZmbGFnIDwgMikKLQlyZXR1cm47Ci0KLSAgICBpZiAoZGF0YSA9PSBOVUxMKQotCWdvdG8gb3V0OwotCi0gICAgaWYgKGlzX3RydW5jYXRlZCkgewotCS8qIGRhdGEyIHdhcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCWdvdG8gb3V0OwotICAgIH0KLQotICAgIC8qIElmIHRoaXMgaXNuJ3QgYSBjb21tYW5kIHRoYXQgd291bGQgY29udGFpbiBhbiBTTUIgbWVzc2FnZSwgcXVpdC4gKi8KLSAgICBpZiAoY29tbWFuZCAhPSAweDA4ICYmIGNvbW1hbmQgIT0gMHgwOSAmJiBjb21tYW5kICE9IDB4MTUgJiYKLSAgICAgICAgY29tbWFuZCAhPSAweDE2KQotCWdvdG8gb3V0OwotCi0gICAgLyogSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIGRhdGEgZm9yICJcMzc3U01CIiwgZG9uJ3QgbG9vayBmb3IgaXQuICovCi0gICAgaWYgKCZkYXRhMlszXSA+PSBtYXhidWYpCi0JZ290byBvdXQ7Ci0KLSAgICBpZiAobWVtY21wKGRhdGEyLCAiXDM3N1NNQiIsNCkgPT0gMCkKLQlwcmludF9zbWIoZGF0YTIsIG1heGJ1Zik7Ci0gICAgZWxzZSB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7Ci0JICAgIGlmICgmZGF0YTJbaSArIDNdID49IG1heGJ1ZikKLQkJYnJlYWs7Ci0JICAgIGlmIChtZW1jbXAoJmRhdGEyW2ldLCAiXDM3N1NNQiIsIDQpID09IDApIHsKLQkJcHJpbnRmKCJmb3VuZCBTTUIgcGFja2V0IGF0ICVkXG4iLCBpKTsKLQkJcHJpbnRfc21iKCZkYXRhMltpXSwgbWF4YnVmKTsKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi1vdXQ6Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHJldHVybjsKLXRydW5jOgotICAgIHByaW50ZigiW3xTTUJdIik7Ci0gICAgcmV0dXJuOwotfQotCi0KLS8qCi0gKiBwcmludCBJUFgtTmV0YmlvcyBmcmFtZXMKLSAqLwotdm9pZAotaXB4X25ldGJpb3NfcHJpbnQoY29uc3QgdV9jaGFyICpkYXRhLCB1X2ludCBsZW5ndGgpCi17Ci0gICAgLyoKLSAgICAgKiB0aGlzIGlzIGEgaGFjayB0aWxsIEkgd29yayBvdXQgaG93IHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZQotICAgICAqIE5ldEJJT1Mtb3Zlci1JUFggc3R1ZmYKLSAgICAgKi8KLSAgICBpbnQgaTsKLSAgICBjb25zdCB1X2NoYXIgKm1heGJ1ZjsKLQotICAgIG1heGJ1ZiA9IGRhdGEgKyBsZW5ndGg7Ci0gICAgLyogRG9uJ3QgZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBjYXB0dXJlZCBkYXRhIGluIHRoZSBwYWNrZXQuICovCi0gICAgaWYgKG1heGJ1ZiA+IHNuYXBlbmQpCi0JbWF4YnVmID0gc25hcGVuZDsKLSAgICBzdGFydGJ1ZiA9IGRhdGE7Ci0gICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7Ci0JaWYgKCZkYXRhW2kgKyA0XSA+IG1heGJ1ZikKLQkgICAgYnJlYWs7Ci0JaWYgKG1lbWNtcCgmZGF0YVtpXSwgIlwzNzdTTUIiLCA0KSA9PSAwKSB7Ci0JICAgIHNtYl9mZGF0YShkYXRhLCAiXG4+Pj4gSVBYIHRyYW5zcG9ydCAiLCAmZGF0YVtpXSwgMCk7Ci0JICAgIGlmIChkYXRhICE9IE5VTEwpCi0JCXByaW50X3NtYigmZGF0YVtpXSwgbWF4YnVmKTsKLQkgICAgcHJpbnRmKCJcbiIpOwotCSAgICBmZmx1c2goc3Rkb3V0KTsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLSAgICBpZiAoaSA9PSAxMjgpCi0Jc21iX2ZkYXRhKGRhdGEsICJcbj4+PiBVbmtub3duIElQWCAiLCBtYXhidWYsIDApOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtc25tcC5jIGIvcHJpbnQtc25tcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjg2YjYyLi4wMDAwMDAwCi0tLSBhL3ByaW50LXNubXAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICogICAgIEpvaG4gUm9iZXJ0IExvVmVyc28uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4KLSAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLSAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICoKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gaGFzIGJlZW4gaW5mbHVlbmNlZCBieSB0aGUgQ01VIFNOTVAgcmVsZWFzZSwKLSAqIGJ5IFN0ZXZlIFdhbGRidXNzZXIuICBIb3dldmVyLCB0aGlzIHNoYXJlcyBubyBjb2RlIHdpdGggdGhhdCBzeXN0ZW0uCi0gKiBBZGRpdGlvbmFsIEFTTi4xIGluc2lnaHQgZ2FpbmVkIGZyb20gTWFyc2hhbGwgVC4gUm9zZSdzIF9UaGVfT3Blbl9Cb29rXy4KLSAqIEVhcmxpZXIgZm9ybXMgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiB3ZXJlIGRlcml2ZWQgYW5kL29yIGluc3BpcmVkIGJ5IGFuCi0gKiBhd2sgc2NyaXB0IG9yaWdpbmFsbHkgd3JpdHRlbiBieSBDLiBQaGlsaXAgV29vZCBvZiBMQU5MIChidXQgbGF0ZXIKLSAqIGhlYXZpbHkgbW9kaWZpZWQgYnkgSm9obiBSb2JlcnQgTG9WZXJzbykuICBUaGUgY29weXJpZ2h0IG5vdGljZSBmb3IKLSAqIHRoYXQgd29yayBpcyBwcmVzZXJ2ZWQgYmVsb3csIGV2ZW4gdGhvdWdoIGl0IG1heSBub3QgcmlnaHRseSBhcHBseQotICogdG8gdGhpcyBmaWxlLgotICoKLSAqIFN1cHBvcnQgZm9yIFNOTVB2MmMvU05NUHYzIGFuZCB0aGUgYWJpbGl0eSB0byBsaW5rIHRoZSBtb2R1bGUgYWdhaW5zdAotICogdGhlIGxpYnNtaSB3YXMgYWRkZWQgYnkgSi4gU2Nob2Vud2FlbGRlciwgQ29weXJpZ2h0IChjKSAxOTk5LgotICoKLSAqIFRoaXMgc3RhcnRlZCBvdXQgYXMgYSB2ZXJ5IHNpbXBsZSBwcm9ncmFtLCBidXQgdGhlIGluY3JlbWVudGFsIGRlY29kaW5nCi0gKiAoaW50byB0aGUgQkUgc3RydWN0dXJlKSBjb21wbGljYXRlZCB0aGluZ3MuCi0gKgotICMJCQlMb3MgQWxhbW9zIE5hdGlvbmFsIExhYm9yYXRvcnkKLSAjCi0gIwlDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAjCVRoaXMgc29mdHdhcmUgd2FzIHByb2R1Y2VkIHVuZGVyIGEgVS5TLiBHb3Zlcm5tZW50IGNvbnRyYWN0Ci0gIwkoVy03NDA1LUVORy0zNikgYnkgTG9zIEFsYW1vcyBOYXRpb25hbCBMYWJvcmF0b3J5LCB3aGljaCBpcwotICMJb3BlcmF0ZWQgYnkgdGhlCVVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIFUuUy4gRGVwYXJ0bWVudAotICMJb2YgRW5lcmd5LiAgVGhlIFUuUy4gR292ZXJubWVudCBpcyBsaWNlbnNlZCB0byB1c2UsIHJlcHJvZHVjZSwKLSAjCWFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUuICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdGhlCi0gIwlwdWJsaWMgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgd2l0aG91dCBjaGFyZ2UsIHByb3ZpZGVkCi0gIwl0aGF0IHRoaXMgTm90aWNlIGFuZCBhbnkgc3RhdGVtZW50IG9mIGF1dGhvcnNoaXAgYXJlIHJlcHJvZHVjZWQKLSAjCW9uIGFsbCBjb3BpZXMuICBOZWl0aGVyIHRoZSBHb3Zlcm5tZW50IG5vciB0aGUgVW5pdmVyc2l0eSBtYWtlcwotICMJYW55IHdhcnJhbnR5LCBleHByZXNzIG9yIGltcGxpZWQsIG9yIGFzc3VtZXMgYW55IGxpYWJpbGl0eSBvcgotICMJcmVzcG9uc2liaWxpdHkgZm9yIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLSAjCUAoIylzbm1wLmF3ay54CTEuMSAoTEFOTCkgMS8xNS85MAotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXNubXAuYyx2IDEuNjIuMi4yIDIwMDUvMDUvMDYgMDc6NTc6MTkgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIEhBVkVfU01JX0gKLSNpbmNsdWRlIDxzbWkuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotCi0jdW5kZWYgT1BBUVVFICAvKiBkZWZpbmVkIGluIDx3aW5nZGkuaD4gKi8KLQotLyoKLSAqIFVuaXZlcnNhbCBBU04uMSB0eXBlcwotICogKHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgdGFnIHZhbHVlcyBmb3IgdGhvc2UgYWxsb3dlZCBpbiB0aGUgSW50ZXJuZXQgU01JKQotICovCi1jb25zdCBjaGFyICpVbml2ZXJzYWxbXSA9IHsKLQkiVS0wIiwKLQkiQm9vbGVhbiIsCi0JIkludGVnZXIiLAotI2RlZmluZSBJTlRFR0VSIDIKLQkiQml0c3RyaW5nIiwKLQkiU3RyaW5nIiwKLSNkZWZpbmUgU1RSSU5HIDQKLQkiTnVsbCIsCi0jZGVmaW5lIEFTTl9OVUxMIDUKLQkiT2JqSUQiLAotI2RlZmluZSBPQkpFQ1RJRCA2Ci0JIk9iamVjdERlcyIsCi0JIlUtOCIsIlUtOSIsIlUtMTAiLCJVLTExIiwJLyogOC0xMSAqLwotCSJVLTEyIiwiVS0xMyIsIlUtMTQiLCJVLTE1IiwJLyogMTItMTUgKi8KLQkiU2VxdWVuY2UiLAotI2RlZmluZSBTRVFVRU5DRSAxNgotCSJTZXQiCi19OwotCi0vKgotICogQXBwbGljYXRpb24td2lkZSBBU04uMSB0eXBlcyBmcm9tIHRoZSBJbnRlcm5ldCBTTUkgYW5kIHRoZWlyIHRhZ3MKLSAqLwotY29uc3QgY2hhciAqQXBwbGljYXRpb25bXSA9IHsKLQkiSXBBZGRyZXNzIiwKLSNkZWZpbmUgSVBBRERSIDAKLQkiQ291bnRlciIsCi0jZGVmaW5lIENPVU5URVIgMQotCSJHYXVnZSIsCi0jZGVmaW5lIEdBVUdFIDIKLQkiVGltZVRpY2tzIiwKLSNkZWZpbmUgVElNRVRJQ0tTIDMKLQkiT3BhcXVlIiwKLSNkZWZpbmUgT1BBUVVFIDQKLQkiQy01IiwKLQkiQ291bnRlcjY0IgotI2RlZmluZSBDT1VOVEVSNjQgNgotfTsKLQotLyoKLSAqIENvbnRleHQtc3BlY2lmaWMgQVNOLjEgdHlwZXMgZm9yIHRoZSBTTk1QIFBEVXMgYW5kIHRoZWlyIHRhZ3MKLSAqLwotY29uc3QgY2hhciAqQ29udGV4dFtdID0gewotCSJHZXRSZXF1ZXN0IiwKLSNkZWZpbmUgR0VUUkVRIDAKLQkiR2V0TmV4dFJlcXVlc3QiLAotI2RlZmluZSBHRVRORVhUUkVRIDEKLQkiR2V0UmVzcG9uc2UiLAotI2RlZmluZSBHRVRSRVNQIDIKLQkiU2V0UmVxdWVzdCIsCi0jZGVmaW5lIFNFVFJFUSAzCi0JIlRyYXAiLAotI2RlZmluZSBUUkFQIDQKLQkiR2V0QnVsayIsCi0jZGVmaW5lIEdFVEJVTEtSRVEgNQotCSJJbmZvcm0iLAotI2RlZmluZSBJTkZPUk1SRVEgNgotCSJWMlRyYXAiLAotI2RlZmluZSBWMlRSQVAgNwotCSJSZXBvcnQiCi0jZGVmaW5lIFJFUE9SVCA4Ci19OwotCi0jZGVmaW5lIE5PVElGWV9DTEFTUyh4KQkgICAgKHggPT0gVFJBUCB8fCB4ID09IFYyVFJBUCB8fCB4ID09IElORk9STVJFUSkKLSNkZWZpbmUgUkVBRF9DTEFTUyh4KSAgICAgICAoeCA9PSBHRVRSRVEgfHwgeCA9PSBHRVRORVhUUkVRIHx8IHggPT0gR0VUQlVMS1JFUSkKLSNkZWZpbmUgV1JJVEVfQ0xBU1MoeCkJICAgICh4ID09IFNFVFJFUSkKLSNkZWZpbmUgUkVTUE9OU0VfQ0xBU1MoeCkgICAoeCA9PSBHRVRSRVNQKQotI2RlZmluZSBJTlRFUk5BTF9DTEFTUyh4KSAgICh4ID09IFJFUE9SVCkKLQotLyoKLSAqIENvbnRleHQtc3BlY2lmaWMgQVNOLjEgdHlwZXMgZm9yIHRoZSBTTk1QIEV4Y2VwdGlvbnMgYW5kIHRoZWlyIHRhZ3MKLSAqLwotY29uc3QgY2hhciAqRXhjZXB0aW9uc1tdID0gewotCSJub1N1Y2hPYmplY3QiLAotI2RlZmluZSBOT1NVQ0hPQkpFQ1QgMAotCSJub1N1Y2hJbnN0YW5jZSIsCi0jZGVmaW5lIE5PU1VDSElOU1RBTkNFIDEKLQkiZW5kT2ZNaWJWaWV3IiwKLSNkZWZpbmUgRU5ET0ZNSUJWSUVXIDIKLX07Ci0KLS8qCi0gKiBQcml2YXRlIEFTTi4xIHR5cGVzCi0gKiBUaGUgSW50ZXJuZXQgU01JIGRvZXMgbm90IHNwZWNpZnkgYW55Ci0gKi8KLWNvbnN0IGNoYXIgKlByaXZhdGVbXSA9IHsKLQkiUC0wIgotfTsKLQotLyoKLSAqIGVycm9yLXN0YXR1cyB2YWx1ZXMgZm9yIGFueSBTTk1QIFBEVQotICovCi1jb25zdCBjaGFyICpFcnJvclN0YXR1c1tdID0gewotCSJub0Vycm9yIiwKLQkidG9vQmlnIiwKLQkibm9TdWNoTmFtZSIsCi0JImJhZFZhbHVlIiwKLQkicmVhZE9ubHkiLAotCSJnZW5FcnIiLAotCSJub0FjY2VzcyIsCi0JIndyb25nVHlwZSIsCi0JIndyb25nTGVuZ3RoIiwKLQkid3JvbmdFbmNvZGluZyIsCi0JIndyb25nVmFsdWUiLAotCSJub0NyZWF0aW9uIiwKLQkiaW5jb25zaXN0ZW50VmFsdWUiLAotCSJyZXNvdXJjZVVuYXZhaWxhYmxlIiwKLQkiY29tbWl0RmFpbGVkIiwKLQkidW5kb0ZhaWxlZCIsCi0JImF1dGhvcml6YXRpb25FcnJvciIsCi0JIm5vdFdyaXRhYmxlIiwKLQkiaW5jb25zaXN0ZW50TmFtZSIKLX07Ci0jZGVmaW5lIERFQ09ERV9FcnJvclN0YXR1cyhlKSBcCi0JKCBlID49IDAgJiYgKHNpemVfdCllIDwgc2l6ZW9mKEVycm9yU3RhdHVzKS9zaXplb2YoRXJyb3JTdGF0dXNbMF0pIFwKLQkJPyBFcnJvclN0YXR1c1tlXSBcCi0JCTogKHNucHJpbnRmKGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZiksICJlcnI9JXUiLCBlKSwgZXJyYnVmKSkKLQotLyoKLSAqIGdlbmVyaWMtdHJhcCB2YWx1ZXMgaW4gdGhlIFNOTVAgVHJhcC1QRFUKLSAqLwotY29uc3QgY2hhciAqR2VuZXJpY1RyYXBbXSA9IHsKLQkiY29sZFN0YXJ0IiwKLQkid2FybVN0YXJ0IiwKLQkibGlua0Rvd24iLAotCSJsaW5rVXAiLAotCSJhdXRoZW50aWNhdGlvbkZhaWx1cmUiLAotCSJlZ3BOZWlnaGJvckxvc3MiLAotCSJlbnRlcnByaXNlU3BlY2lmaWMiCi0jZGVmaW5lIEdUX0VOVEVSUFJJU0UgNgotfTsKLSNkZWZpbmUgREVDT0RFX0dlbmVyaWNUcmFwKHQpIFwKLQkoIHQgPj0gMCAmJiAoc2l6ZV90KXQgPCBzaXplb2YoR2VuZXJpY1RyYXApL3NpemVvZihHZW5lcmljVHJhcFswXSkgXAotCQk/IEdlbmVyaWNUcmFwW3RdIFwKLQkJOiAoc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgImd0PSVkIiwgdCksIGJ1ZikpCi0KLS8qCi0gKiBBU04uMSB0eXBlIGNsYXNzIHRhYmxlCi0gKiBUaWVzIHRvZ2V0aGVyIHRoZSBwcmVjZWRpbmcgVW5pdmVyc2FsLCBBcHBsaWNhdGlvbiwgQ29udGV4dCwgYW5kIFByaXZhdGUKLSAqIHR5cGUgZGVmaW5pdGlvbnMuCi0gKi8KLSNkZWZpbmUgZGVmaW5lQ0xBU1MoeCkgeyAieCIsIHgsIHNpemVvZih4KS9zaXplb2YoeFswXSkgfSAvKiBub3QgQU5TSS1DICovCi1zdHJ1Y3QgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JY29uc3QgY2hhcgkqKklkOwotCSAgICBpbnQJbnVtSURzOwotICAgIH0gQ2xhc3NbXSA9IHsKLQlkZWZpbmVDTEFTUyhVbml2ZXJzYWwpLAotI2RlZmluZQlVTklWRVJTQUwJMAotCWRlZmluZUNMQVNTKEFwcGxpY2F0aW9uKSwKLSNkZWZpbmUJQVBQTElDQVRJT04JMQotCWRlZmluZUNMQVNTKENvbnRleHQpLAotI2RlZmluZQlDT05URVhUCQkyCi0JZGVmaW5lQ0xBU1MoUHJpdmF0ZSksCi0jZGVmaW5lCVBSSVZBVEUJCTMKLQlkZWZpbmVDTEFTUyhFeGNlcHRpb25zKSwKLSNkZWZpbmUgRVhDRVBUSU9OUwk0Ci19OwotCi0vKgotICogZGVmaW5lZCBmb3JtcyBmb3IgQVNOLjEgdHlwZXMKLSAqLwotY29uc3QgY2hhciAqRm9ybVtdID0gewotCSJQcmltaXRpdmUiLAotI2RlZmluZSBQUklNSVRJVkUJMAotCSJDb25zdHJ1Y3RlZCIsCi0jZGVmaW5lIENPTlNUUlVDVEVECTEKLX07Ci0KLS8qCi0gKiBBIHN0cnVjdHVyZSBmb3IgdGhlIE9JRCB0cmVlIGZvciB0aGUgY29tcGlsZWQtaW4gTUlCLgotICogVGhpcyBpcyBzdG9yZWQgYXMgYSBnZW5lcmFsLW9yZGVyIHRyZWUuCi0gKi8KLXN0cnVjdCBvYmogewotCWNvbnN0IGNoYXIJKmRlc2M7CQkvKiBuYW1lIG9mIG9iamVjdCAqLwotCXVfY2hhcglvaWQ7CQkJLyogc3ViLWlkIGZvbGxvd2luZyBwYXJlbnQgKi8KLQl1X2NoYXIJdHlwZTsJCQkvKiBvYmplY3QgdHlwZSAodW51c2VkKSAqLwotCXN0cnVjdCBvYmogKmNoaWxkLCAqbmV4dDsJLyogY2hpbGQgYW5kIG5leHQgc2libGluZyBwb2ludGVycyAqLwotfSAqb2JqcCA9IE5VTEw7Ci0KLS8qCi0gKiBJbmNsdWRlIHRoZSBjb21waWxlZCBpbiBTTk1QIE1JQi4gICJtaWIuaCIgaXMgcHJvZHVjZWQgYnkgZmVlZGluZwotICogUkZDLTExNTYgZm9ybWF0IGZpbGVzIGludG8gIm1ha2VtaWIiLiAgIm1pYi5oIiBNVVNUIGRlZmluZSBhdCBsZWFzdAotICogYSB2YWx1ZSBmb3IgYG1pYnJvb3QnLgotICoKLSAqIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgZ3Jvc3MsIGFzIHRoaXMgaXMgaW5jbHVkaW5nIGluaXRpYWxpemVkIHN0cnVjdHVyZXMsCi0gKiBhbmQgYnkgcmlnaHQgc2hvdWxkbid0IGJlIGFuICJpbmNsdWRlIiBmaWxlLgotICovCi0jaW5jbHVkZSAibWliLmgiCi0KLS8qCi0gKiBUaGlzIGRlZmluZXMgYSBsaXN0IG9mIE9JRHMgd2hpY2ggd2lsbCBiZSBhYmJyZXZpYXRlZCBvbiBvdXRwdXQuCi0gKiBDdXJyZW50bHksIHRoaXMgaW5jbHVkZXMgdGhlIHByZWZpeGVzIGZvciB0aGUgSW50ZXJuZXQgTUlCLCB0aGUKLSAqIHByaXZhdGUgZW50ZXJwcmlzZXMgdHJlZSwgYW5kIHRoZSBleHBlcmltZW50YWwgdHJlZS4KLSAqLwotc3RydWN0IG9ial9hYnJldiB7Ci0JY29uc3QgY2hhciAqcHJlZml4OwkJLyogcHJlZml4IGZvciB0aGlzIGFicmV2ICovCi0Jc3RydWN0IG9iaiAqbm9kZTsJCS8qIHBvaW50ZXIgaW50byBvYmplY3QgdGFibGUgKi8KLQljb25zdCBjaGFyICpvaWQ7CQkvKiBBU04uMSBlbmNvZGVkIE9JRCAqLwotfSBvYmpfYWJyZXZfbGlzdFtdID0gewotI2lmbmRlZiBOT19BQlJFVl9NSUIKLQkvKiAuaXNvLm9yZy5kb2QuaW50ZXJuZXQubWdtdC5taWIgKi8KLQl7ICIiLAkmX21pYl9vYmosCQkiXDUzXDZcMVwyXDEiIH0sCi0jZW5kaWYKLSNpZm5kZWYgTk9fQUJSRVZfRU5URVIKLQkvKiAuaXNvLm9yZy5kb2QuaW50ZXJuZXQucHJpdmF0ZS5lbnRlcnByaXNlcyAqLwotCXsgIkU6IiwJJl9lbnRlcnByaXNlc19vYmosCSJcNTNcNlwxXDRcMSIgfSwKLSNlbmRpZgotI2lmbmRlZiBOT19BQlJFVl9FWFBFUkkKLQkvKiAuaXNvLm9yZy5kb2QuaW50ZXJuZXQuZXhwZXJpbWVudGFsICovCi0JeyAiWDoiLAkmX2V4cGVyaW1lbnRhbF9vYmosCSJcNTNcNlwxXDMiIH0sCi0jZW5kaWYKLSNpZm5kZWYgTk9fQUJCUkVWX1NOTVBNT0RTCi0JLyogLmlzby5vcmcuZG9kLmludGVybmV0LnNubXBWMi5zbm1wTW9kdWxlcyAqLwotICAgICAgICB7ICJTOiIsICZfc25tcE1vZHVsZXNfb2JqLCAgICAgICJcNTNcNlwxXDZcMyIgfSwKLSNlbmRpZgotCXsgMCwwLDAgfQotfTsKLQotLyoKLSAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgT0lEIHByaW50IHJvdXRpbmUgdG8gd2FsayBkb3duIHRoZSBvYmplY3QgdHJlZQotICogcm9vdGVkIGF0IGBtaWJyb290Jy4KLSAqLwotI2RlZmluZSBPQkpfUFJJTlQobywgc3VwcHJlc3Nkb3QpIFwKLXsgXAotCWlmIChvYmpwKSB7IFwKLQkJZG8geyBcCi0JCQlpZiAoKG8pID09IG9ianAtPm9pZCkgXAotCQkJCWJyZWFrOyBcCi0JCX0gd2hpbGUgKChvYmpwID0gb2JqcC0+bmV4dCkgIT0gTlVMTCk7IFwKLQl9IFwKLQlpZiAob2JqcCkgeyBcCi0JCXByaW50ZihzdXBwcmVzc2RvdD8iJXMiOiIuJXMiLCBvYmpwLT5kZXNjKTsgXAotCQlvYmpwID0gb2JqcC0+Y2hpbGQ7IFwKLQl9IGVsc2UgXAotCQlwcmludGYoc3VwcHJlc3Nkb3Q/IiV1IjoiLiV1IiwgKG8pKTsgXAotfQotCi0vKgotICogVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgdGhlIEFueS1EYXRhLVR5cGUgc3RvcmFnZSB1c2VkIHB1cmVseSBmb3IKLSAqIHRlbXBvcmFyeSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiB3aGlsZSBkZWNvZGluZyBhbiBBU04uMSBkYXRhIHN0cmVhbS4KLSAqLwotc3RydWN0IGJlIHsKLQl1X2ludDMyX3QgYXNubGVuOwotCXVuaW9uIHsKLQkJY2FkZHJfdCByYXc7Ci0JCWludDMyX3QgaW50ZWdlcjsKLQkJdV9pbnQzMl90IHVuczsKLQkJY29uc3QgdV9jaGFyICpzdHI7Ci0JICAgICAgICBzdHJ1Y3QgewotCQkgICAgICAgIHVfaW50MzJfdCBoaWdoOwotCQkgICAgICAgIHVfaW50MzJfdCBsb3c7Ci0JCX0gdW5zNjQ7Ci0JfSBkYXRhOwotCXVfc2hvcnQgaWQ7Ci0JdV9jaGFyIGZvcm0sIGNsYXNzOwkJLyogdGFnIGluZm8gKi8KLQl1X2NoYXIgdHlwZTsKLSNkZWZpbmUgQkVfQU5ZCQkyNTUKLSNkZWZpbmUgQkVfTk9ORQkJMAotI2RlZmluZSBCRV9OVUxMCQkxCi0jZGVmaW5lIEJFX09DVEVUCTIKLSNkZWZpbmUgQkVfT0lECQkzCi0jZGVmaW5lIEJFX0lOVAkJNAotI2RlZmluZSBCRV9VTlMJCTUKLSNkZWZpbmUgQkVfU1RSCQk2Ci0jZGVmaW5lIEJFX1NFUQkJNwotI2RlZmluZSBCRV9JTkVUQUREUgk4Ci0jZGVmaW5lIEJFX1BEVQkJOQotI2RlZmluZSBCRV9VTlM2NAkxMAotI2RlZmluZSBCRV9OT1NVQ0hPQkpFQ1QJMTI4Ci0jZGVmaW5lIEJFX05PU1VDSElOU1QJMTI5Ci0jZGVmaW5lIEJFX0VORE9GTUlCVklFVwkxMzAKLX07Ci0KLS8qCi0gKiBTTk1QIHZlcnNpb25zIHJlY29nbml6ZWQgYnkgdGhpcyBtb2R1bGUKLSAqLwotY29uc3QgY2hhciAqU25tcFZlcnNpb25bXSA9IHsKLQkiU05NUHYxIiwKLSNkZWZpbmUgU05NUF9WRVJTSU9OXzEJMAotCSJTTk1QdjJjIiwKLSNkZWZpbmUgU05NUF9WRVJTSU9OXzIJMQotCSJTTk1QdjJ1IiwKLSNkZWZpbmUgU05NUF9WRVJTSU9OXzJVCTIKLQkiU05NUHYzIgotI2RlZmluZSBTTk1QX1ZFUlNJT05fMwkzCi19OwotCi0vKgotICogRGVmYXVsdHMgZm9yIFNOTVAgUERVIGNvbXBvbmVudHMKLSAqLwotI2RlZmluZSBERUZfQ09NTVVOSVRZICJwdWJsaWMiCi0KLS8qCi0gKiBjb25zdGFudHMgZm9yIEFTTi4xIGRlY29kaW5nCi0gKi8KLSNkZWZpbmUgT0lETVVYIDQwCi0jZGVmaW5lIEFTTkxFTl9JTkVUQUREUiA0Ci0jZGVmaW5lIEFTTl9TSElGVDcgNwotI2RlZmluZSBBU05fU0hJRlQ4IDgKLSNkZWZpbmUgQVNOX0JJVDggMHg4MAotI2RlZmluZSBBU05fTE9OR0xFTiAweDgwCi0KLSNkZWZpbmUgQVNOX0lEX0JJVFMgMHgxZgotI2RlZmluZSBBU05fRk9STV9CSVRTIDB4MjAKLSNkZWZpbmUgQVNOX0ZPUk1fU0hJRlQgNQotI2RlZmluZSBBU05fQ0xBU1NfQklUUyAweGMwCi0jZGVmaW5lIEFTTl9DTEFTU19TSElGVCA2Ci0KLSNkZWZpbmUgQVNOX0lEX0VYVCAweDFmCQkvKiBleHRlbnNpb24gSUQgaW4gdGFnIGZpZWxkICovCi0KLS8qCi0gKiBUaGlzIGRlY29kZXMgdGhlIG5leHQgQVNOLjEgb2JqZWN0IGluIHRoZSBzdHJlYW0gcG9pbnRlZCB0byBieSAicCIKLSAqIChhbmQgb2YgcmVhbC1sZW5ndGggImxlbiIpIGFuZCBzdG9yZXMgdGhlIGludGVybWVkaWF0ZSBkYXRhIGluIHRoZQotICogcHJvdmlkZWQgQkUgb2JqZWN0LgotICoKLSAqIFRoaXMgcmV0dXJucyAtbCBpZiBpdCBmYWlscyAoaS5lLiwgdGhlIEFTTi4xIHN0cmVhbSBpcyBub3QgdmFsaWQpLgotICogTy93LCB0aGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBwYXJzZWQgZnJvbSAicCIuCi0gKi8KLXN0YXRpYyBpbnQKLWFzbjFfcGFyc2UocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwLCB1X2ludCBsZW4sIHN0cnVjdCBiZSAqZWxlbSkKLXsKLQl1X2NoYXIgZm9ybSwgY2xhc3MsIGlkOwotCWludCBpLCBoZHI7Ci0KLQllbGVtLT5hc25sZW4gPSAwOwotCWVsZW0tPnR5cGUgPSBCRV9BTlk7Ci0JaWYgKGxlbiA8IDEpIHsKLQkJZnB1dHMoIltub3RoaW5nIHRvIHBhcnNlXSIsIHN0ZG91dCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JVENIRUNLKCpwKTsKLQotCS8qCi0JICogaXQgd291bGQgYmUgbmljZSB0byB1c2UgYSBiaXQgZmllbGQsIGJ1dCB5b3UgY2FuJ3QgZGVwZW5kIG9uIHRoZW0uCi0JICogICstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwotCSAqICArIGNsYXNzIHxmcm18ICAgICAgICBpZCAgICAgICAgIHwKLQkgKiAgKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCi0JICogICAgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAKLQkgKi8KLQlpZCA9ICpwICYgQVNOX0lEX0JJVFM7CQkvKiBsb3dlciA1IGJpdHMsIHJhbmdlIDAwLTFmICovCi0jaWZkZWYgbm90ZGVmCi0JZm9ybSA9ICgqcCAmIDB4ZTApID4+IDU7CS8qIG1vdmUgdXBwZXIgMyBiaXRzIHRvIGxvd2VyIDMgKi8KLQljbGFzcyA9IGZvcm0gPj4gMTsJCS8qIGJpdHMgNyY2IC0+IGJpdHMgMSYwLCByYW5nZSAwLTMgKi8KLQlmb3JtICY9IDB4MTsJCQkvKiBiaXQgNSAtPiBiaXQgMCwgcmFuZ2UgMC0xICovCi0jZWxzZQotCWZvcm0gPSAodV9jaGFyKSgqcCAmIEFTTl9GT1JNX0JJVFMpID4+IEFTTl9GT1JNX1NISUZUOwotCWNsYXNzID0gKHVfY2hhcikoKnAgJiBBU05fQ0xBU1NfQklUUykgPj4gQVNOX0NMQVNTX1NISUZUOwotI2VuZGlmCi0JZWxlbS0+Zm9ybSA9IGZvcm07Ci0JZWxlbS0+Y2xhc3MgPSBjbGFzczsKLQllbGVtLT5pZCA9IGlkOwotCXArKzsgbGVuLS07IGhkciA9IDE7Ci0JLyogZXh0ZW5kZWQgdGFnIGZpZWxkICovCi0JaWYgKGlkID09IEFTTl9JRF9FWFQpIHsKLQkJLyoKLQkJICogVGhlIElEIGZvbGxvd3MsIGFzIGEgc2VxdWVuY2Ugb2Ygb2N0ZXRzIHdpdGggdGhlCi0JCSAqIDh0aCBiaXQgc2V0IGFuZCB0aGUgcmVtYWluaW5nIDcgYml0cyBiZWluZwotCQkgKiB0aGUgbmV4dCA3IGJpdHMgb2YgdGhlIHZhbHVlLCB0ZXJtaW5hdGVkIHdpdGgKLQkJICogYW4gb2N0ZXQgd2l0aCB0aGUgOHRoIGJpdCBub3Qgc2V0LgotCQkgKgotCQkgKiBGaXJzdCwgYXNzZW1ibGUgYWxsIHRoZSBvY3RldHMgd2l0aCB0aGUgOHRoCi0JCSAqIGJpdCBzZXQuICBYWFggLSB0aGlzIGRvZXNuJ3QgaGFuZGxlIGEgdmFsdWUKLQkJICogdGhhdCB3b24ndCBmaXQgaW4gMzIgYml0cy4KLQkJICovCi0JCWZvciAoaWQgPSAwOyAqcCAmIEFTTl9CSVQ4OyBsZW4tLSwgaGRyKyssIHArKykgewotCQkJaWYgKGxlbiA8IDEpIHsKLQkJCQlmcHV0cygiW1h0YWdmaWVsZD9dIiwgc3Rkb3V0KTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQlUQ0hFQ0soKnApOwotCQkJaWQgPSAoaWQgPDwgNykgfCAoKnAgJiB+QVNOX0JJVDgpOwotCQl9Ci0JCWlmIChsZW4gPCAxKSB7Ci0JCQlmcHV0cygiW1h0YWdmaWVsZD9dIiwgc3Rkb3V0KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlUQ0hFQ0soKnApOwotCQllbGVtLT5pZCA9IGlkID0gKGlkIDw8IDcpIHwgKnA7Ci0JCS0tbGVuOwotCQkrK2hkcjsKLQkJKytwOwotCX0KLQlpZiAobGVuIDwgMSkgewotCQlmcHV0cygiW25vIGFzbmxlbl0iLCBzdGRvdXQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCVRDSEVDSygqcCk7Ci0JZWxlbS0+YXNubGVuID0gKnA7Ci0JcCsrOyBsZW4tLTsgaGRyKys7Ci0JaWYgKGVsZW0tPmFzbmxlbiAmIEFTTl9CSVQ4KSB7Ci0JCXVfaW50MzJfdCBub2N0ID0gZWxlbS0+YXNubGVuICUgQVNOX0JJVDg7Ci0JCWVsZW0tPmFzbmxlbiA9IDA7Ci0JCWlmIChsZW4gPCBub2N0KSB7Ci0JCQlwcmludGYoIlthc25sZW4/ICVkPCVkXSIsIGxlbiwgbm9jdCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJVENIRUNLMigqcCwgbm9jdCk7Ci0JCWZvciAoOyBub2N0LS0gPiAwOyBsZW4tLSwgaGRyKyspCi0JCQllbGVtLT5hc25sZW4gPSAoZWxlbS0+YXNubGVuIDw8IEFTTl9TSElGVDgpIHwgKnArKzsKLQl9Ci0JaWYgKGxlbiA8IGVsZW0tPmFzbmxlbikgewotCQlwcmludGYoIltsZW4lZDxhc25sZW4ldV0iLCBsZW4sIGVsZW0tPmFzbmxlbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaWYgKGZvcm0gPj0gc2l6ZW9mKEZvcm0pL3NpemVvZihGb3JtWzBdKSkgewotCQlwcmludGYoIltmb3JtPyVkXSIsIGZvcm0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmIChjbGFzcyA+PSBzaXplb2YoQ2xhc3MpL3NpemVvZihDbGFzc1swXSkpIHsKLQkJcHJpbnRmKCJbY2xhc3M/JWMvJWRdIiwgKkZvcm1bZm9ybV0sIGNsYXNzKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKGludClpZCA+PSBDbGFzc1tjbGFzc10ubnVtSURzKSB7Ci0JCXByaW50ZigiW2lkPyVjLyVzLyVkXSIsICpGb3JtW2Zvcm1dLCBDbGFzc1tjbGFzc10ubmFtZSwgaWQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3dpdGNoIChmb3JtKSB7Ci0JY2FzZSBQUklNSVRJVkU6Ci0JCXN3aXRjaCAoY2xhc3MpIHsKLQkJY2FzZSBVTklWRVJTQUw6Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIFNUUklORzoKLQkJCQllbGVtLT50eXBlID0gQkVfU1RSOwotCQkJCWVsZW0tPmRhdGEuc3RyID0gcDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBJTlRFR0VSOiB7Ci0JCQkJcmVnaXN0ZXIgaW50MzJfdCBkYXRhOwotCQkJCWVsZW0tPnR5cGUgPSBCRV9JTlQ7Ci0JCQkJZGF0YSA9IDA7Ci0KLQkJCQlUQ0hFQ0syKCpwLCBlbGVtLT5hc25sZW4pOwotCQkJCWlmICgqcCAmIEFTTl9CSVQ4KQkvKiBuZWdhdGl2ZSAqLwotCQkJCQlkYXRhID0gLTE7Ci0JCQkJZm9yIChpID0gZWxlbS0+YXNubGVuOyBpLS0gPiAwOyBwKyspCi0JCQkJCWRhdGEgPSAoZGF0YSA8PCBBU05fU0hJRlQ4KSB8ICpwOwotCQkJCWVsZW0tPmRhdGEuaW50ZWdlciA9IGRhdGE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWNhc2UgT0JKRUNUSUQ6Ci0JCQkJZWxlbS0+dHlwZSA9IEJFX09JRDsKLQkJCQllbGVtLT5kYXRhLnJhdyA9IChjYWRkcl90KXA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQVNOX05VTEw6Ci0JCQkJZWxlbS0+dHlwZSA9IEJFX05VTEw7Ci0JCQkJZWxlbS0+ZGF0YS5yYXcgPSBOVUxMOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWVsZW0tPnR5cGUgPSBCRV9PQ1RFVDsKLQkJCQllbGVtLT5kYXRhLnJhdyA9IChjYWRkcl90KXA7Ci0JCQkJcHJpbnRmKCJbUC9VLyVzXSIsCi0JCQkJCUNsYXNzW2NsYXNzXS5JZFtpZF0pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBUFBMSUNBVElPTjoKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgSVBBRERSOgotCQkJCWVsZW0tPnR5cGUgPSBCRV9JTkVUQUREUjsKLQkJCQllbGVtLT5kYXRhLnJhdyA9IChjYWRkcl90KXA7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgQ09VTlRFUjoKLQkJCWNhc2UgR0FVR0U6Ci0JCQljYXNlIFRJTUVUSUNLUzogewotCQkJCXJlZ2lzdGVyIHVfaW50MzJfdCBkYXRhOwotCQkJCVRDSEVDSzIoKnAsIGVsZW0tPmFzbmxlbik7Ci0JCQkJZWxlbS0+dHlwZSA9IEJFX1VOUzsKLQkJCQlkYXRhID0gMDsKLQkJCQlmb3IgKGkgPSBlbGVtLT5hc25sZW47IGktLSA+IDA7IHArKykKLQkJCQkJZGF0YSA9IChkYXRhIDw8IDgpICsgKnA7Ci0JCQkJZWxlbS0+ZGF0YS51bnMgPSBkYXRhOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlIENPVU5URVI2NDogewotCQkJCXJlZ2lzdGVyIHVfaW50MzJfdCBoaWdoLCBsb3c7Ci0JCQkJVENIRUNLMigqcCwgZWxlbS0+YXNubGVuKTsKLQkJCSAgICAgICAgZWxlbS0+dHlwZSA9IEJFX1VOUzY0OwotCQkJCWhpZ2ggPSAwLCBsb3cgPSAwOwotCQkJCWZvciAoaSA9IGVsZW0tPmFzbmxlbjsgaS0tID4gMDsgcCsrKSB7Ci0JCQkJICAgICAgICBoaWdoID0gKGhpZ2ggPDwgOCkgfAotCQkJCQkgICAgKChsb3cgJiAweEZGMDAwMDAwKSA+PiAyNCk7Ci0JCQkJCWxvdyA9IChsb3cgPDwgOCkgfCAqcDsKLQkJCQl9Ci0JCQkJZWxlbS0+ZGF0YS51bnM2NC5oaWdoID0gaGlnaDsKLQkJCQllbGVtLT5kYXRhLnVuczY0LmxvdyA9IGxvdzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJZGVmYXVsdDoKLQkJCQllbGVtLT50eXBlID0gQkVfT0NURVQ7Ci0JCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOwotCQkJCXByaW50ZigiW1AvQS8lc10iLAotCQkJCQlDbGFzc1tjbGFzc10uSWRbaWRdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ09OVEVYVDoKLQkJCXN3aXRjaCAoaWQpIHsKLQkJCWNhc2UgTk9TVUNIT0JKRUNUOgotCQkJCWVsZW0tPnR5cGUgPSBCRV9OT1NVQ0hPQkpFQ1Q7Ci0JCQkJZWxlbS0+ZGF0YS5yYXcgPSBOVUxMOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIE5PU1VDSElOU1RBTkNFOgotCQkJCWVsZW0tPnR5cGUgPSBCRV9OT1NVQ0hJTlNUOwotCQkJCWVsZW0tPmRhdGEucmF3ID0gTlVMTDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBFTkRPRk1JQlZJRVc6Ci0JCQkJZWxlbS0+dHlwZSA9IEJFX0VORE9GTUlCVklFVzsKLQkJCQllbGVtLT5kYXRhLnJhdyA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRmKCJbUC8lcy8lc10iLAotCQkJCUNsYXNzW2NsYXNzXS5uYW1lLCBDbGFzc1tjbGFzc10uSWRbaWRdKTsKLQkJCVRDSEVDSzIoKnAsIGVsZW0tPmFzbmxlbik7Ci0JCQllbGVtLT50eXBlID0gQkVfT0NURVQ7Ci0JCQllbGVtLT5kYXRhLnJhdyA9IChjYWRkcl90KXA7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgQ09OU1RSVUNURUQ6Ci0JCXN3aXRjaCAoY2xhc3MpIHsKLQkJY2FzZSBVTklWRVJTQUw6Ci0JCQlzd2l0Y2ggKGlkKSB7Ci0JCQljYXNlIFNFUVVFTkNFOgotCQkJCWVsZW0tPnR5cGUgPSBCRV9TRVE7Ci0JCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWVsZW0tPnR5cGUgPSBCRV9PQ1RFVDsKLQkJCQllbGVtLT5kYXRhLnJhdyA9IChjYWRkcl90KXA7Ci0JCQkJcHJpbnRmKCJDL1UvJXMiLCBDbGFzc1tjbGFzc10uSWRbaWRdKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgQ09OVEVYVDoKLQkJCWVsZW0tPnR5cGUgPSBCRV9QRFU7Ci0JCQllbGVtLT5kYXRhLnJhdyA9IChjYWRkcl90KXA7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZWxlbS0+dHlwZSA9IEJFX09DVEVUOwotCQkJZWxlbS0+ZGF0YS5yYXcgPSAoY2FkZHJfdClwOwotCQkJcHJpbnRmKCJDLyVzLyVzIiwKLQkJCQlDbGFzc1tjbGFzc10ubmFtZSwgQ2xhc3NbY2xhc3NdLklkW2lkXSk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0JcCArPSBlbGVtLT5hc25sZW47Ci0JbGVuIC09IGVsZW0tPmFzbmxlbjsKLQlyZXR1cm4gZWxlbS0+YXNubGVuICsgaGRyOwotCi10cnVuYzoKLQlmcHV0cygiW3xzbm1wXSIsIHN0ZG91dCk7Ci0JcmV0dXJuIC0xOwotfQotCi0vKgotICogRGlzcGxheSB0aGUgQVNOLjEgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoZSBCRSBvYmplY3QuCi0gKiBUaGlzIHVzZWQgdG8gYmUgYW4gaW50ZWdyYWwgcGFydCBvZiBhc24xX3BhcnNlKCkgYmVmb3JlIHRoZSBpbnRlcm1lZGlhdGUKLSAqIEJFIGZvcm0gd2FzIGFkZGVkLgotICovCi1zdGF0aWMgaW50Ci1hc24xX3ByaW50KHN0cnVjdCBiZSAqZWxlbSkKLXsKLQl1X2NoYXIgKnAgPSAodV9jaGFyICopZWxlbS0+ZGF0YS5yYXc7Ci0JdV9pbnQzMl90IGFzbmxlbiA9IGVsZW0tPmFzbmxlbjsKLQl1X2ludDMyX3QgaTsKLQotCXN3aXRjaCAoZWxlbS0+dHlwZSkgewotCi0JY2FzZSBCRV9PQ1RFVDoKLQkJVENIRUNLMigqcCwgYXNubGVuKTsKLQkJZm9yIChpID0gYXNubGVuOyBpLS0gPiAwOyBwKyspCi0JCQlwcmludGYoIl8lLjJ4IiwgKnApOwotCQlicmVhazsKLQotCWNhc2UgQkVfTlVMTDoKLQkJYnJlYWs7Ci0KLQljYXNlIEJFX09JRDogewotCQlpbnQgbyA9IDAsIGZpcnN0ID0gLTEsIGkgPSBhc25sZW47Ci0KLQkJaWYgKCFzZmxhZyAmJiAhbmZsYWcgJiYgYXNubGVuID4gMikgewotCQkJc3RydWN0IG9ial9hYnJldiAqYSA9ICZvYmpfYWJyZXZfbGlzdFswXTsKLQkJCXNpemVfdCBhX2xlbiA9IHN0cmxlbihhLT5vaWQpOwotCQkJZm9yICg7IGEtPm5vZGU7IGErKykgewotCQkJCVRDSEVDSzIoKnAsIGFfbGVuKTsKLQkJCQlpZiAobWVtY21wKGEtPm9pZCwgKGNoYXIgKilwLCBhX2xlbikgPT0gMCkgewotCQkJCQlvYmpwID0gYS0+bm9kZS0+Y2hpbGQ7Ci0JCQkJCWkgLT0gc3RybGVuKGEtPm9pZCk7Ci0JCQkJCXAgKz0gc3RybGVuKGEtPm9pZCk7Ci0JCQkJCWZwdXRzKGEtPnByZWZpeCwgc3Rkb3V0KTsKLQkJCQkJZmlyc3QgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKDsgIXNmbGFnICYmIGktLSA+IDA7IHArKykgewotCQkJVENIRUNLKCpwKTsKLQkJCW8gPSAobyA8PCBBU05fU0hJRlQ3KSArICgqcCAmIH5BU05fQklUOCk7Ci0JCQlpZiAoKnAgJiBBU05fTE9OR0xFTikKLQkJCSAgICAgICAgY29udGludWU7Ci0KLQkJCS8qCi0JCQkgKiBmaXJzdCBzdWJpdGVtIGVuY29kZXMgdHdvIGl0ZW1zIHdpdGggMXN0Kk9JRE1VWCsybmQKLQkJCSAqIChzZWUgWC42OTA6MTk5NyBjbGF1c2UgOC4xOSBmb3IgdGhlIGRldGFpbHMpCi0JCQkgKi8KLQkJCWlmIChmaXJzdCA8IDApIHsKLQkJCSAgICAgICAgaW50IHM7Ci0JCQkJaWYgKCFuZmxhZykKLQkJCQkJb2JqcCA9IG1pYnJvb3Q7Ci0JCQkJZmlyc3QgPSAwOwotCQkJCXMgPSBvIC8gT0lETVVYOwotCQkJCWlmIChzID4gMikgcyA9IDI7Ci0JCQkJT0JKX1BSSU5UKHMsIGZpcnN0KTsKLQkJCQlvIC09IHMgKiBPSURNVVg7Ci0JCQl9Ci0JCQlPQkpfUFJJTlQobywgZmlyc3QpOwotCQkJaWYgKC0tZmlyc3QgPCAwKQotCQkJCWZpcnN0ID0gMDsKLQkJCW8gPSAwOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgQkVfSU5UOgotCQlwcmludGYoIiVkIiwgZWxlbS0+ZGF0YS5pbnRlZ2VyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJFX1VOUzoKLQkJcHJpbnRmKCIldSIsIGVsZW0tPmRhdGEudW5zKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJFX1VOUzY0OiB7CS8qIGlkZWEgYm9ycm93ZWQgZnJvbSBieSBNYXJzaGFsbCBSb3NlICovCi0JICAgICAgICBkb3VibGUgZDsKLQkJaW50IGosIGNhcnJ5OwotCQljaGFyICpjcGYsICpjcGwsIGxhc3RbNl0sIGZpcnN0WzMwXTsKLQkJaWYgKGVsZW0tPmRhdGEudW5zNjQuaGlnaCA9PSAwKSB7Ci0JCSAgICAgICAgcHJpbnRmKCIldSIsIGVsZW0tPmRhdGEudW5zNjQubG93KTsKLQkJICAgICAgICBicmVhazsKLQkJfQotCQlkID0gZWxlbS0+ZGF0YS51bnM2NC5oaWdoICogNDI5NDk2NzI5Ni4wOwkvKiAyXjMyICovCi0JCWlmIChlbGVtLT5kYXRhLnVuczY0LmhpZ2ggPD0gMHgxZmZmZmYpIHsKLQkJICAgICAgICBkICs9IGVsZW0tPmRhdGEudW5zNjQubG93OwotI2lmIDAgLyppcyBsb29rcyBpbGxlZ2FsLCBidXQgd2hhdCBpcyB0aGUgaW50ZW50aW9uPyovCi0JCQlwcmludGYoIiUuZiIsIGQpOwotI2Vsc2UKLQkJCXByaW50ZigiJWYiLCBkKTsKLSNlbmRpZgotCQkJYnJlYWs7Ci0JCX0KLQkJZCArPSAoZWxlbS0+ZGF0YS51bnM2NC5sb3cgJiAweGZmZmZmMDAwKTsKLSNpZiAwIC8qaXMgbG9va3MgaWxsZWdhbCwgYnV0IHdoYXQgaXMgdGhlIGludGVudGlvbj8qLwotCQlzbnByaW50ZihmaXJzdCwgc2l6ZW9mKGZpcnN0KSwgIiUuZiIsIGQpOwotI2Vsc2UKLQkJc25wcmludGYoZmlyc3QsIHNpemVvZihmaXJzdCksICIlZiIsIGQpOwotI2VuZGlmCi0JCXNucHJpbnRmKGxhc3QsIHNpemVvZihsYXN0KSwgIiU1LjVkIiwKLQkJICAgIGVsZW0tPmRhdGEudW5zNjQubG93ICYgMHhmZmYpOwotCQlmb3IgKGNhcnJ5ID0gMCwgY3BmID0gZmlyc3Qrc3RybGVuKGZpcnN0KS0xLCBjcGwgPSBsYXN0KzQ7Ci0JCSAgICAgY3BsID49IGxhc3Q7Ci0JCSAgICAgY3BmLS0sIGNwbC0tKSB7Ci0JCSAgICAgICAgaiA9IGNhcnJ5ICsgKCpjcGYgLSAnMCcpICsgKCpjcGwgLSAnMCcpOwotCQkJaWYgKGogPiA5KSB7Ci0JCQkgICAgICAgIGogLT0gMTA7Ci0JCQkJY2FycnkgPSAxOwotCQkJfSBlbHNlIHsKLQkJCSAgICAgICAgY2FycnkgPSAwOwotCQkgICAgICAgIH0KLQkJCSpjcGYgPSBqICsgJzAnOwotCQl9Ci0JCWZwdXRzKGZpcnN0LCBzdGRvdXQpOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIEJFX1NUUjogewotCQlyZWdpc3RlciBpbnQgcHJpbnRhYmxlID0gMSwgZmlyc3QgPSAxOwotCQljb25zdCB1X2NoYXIgKnAgPSBlbGVtLT5kYXRhLnN0cjsKLQkJVENIRUNLMigqcCwgYXNubGVuKTsKLQkJZm9yIChpID0gYXNubGVuOyBwcmludGFibGUgJiYgaS0tID4gMDsgcCsrKQotCQkJcHJpbnRhYmxlID0gaXNwcmludCgqcCkgfHwgaXNzcGFjZSgqcCk7Ci0JCXAgPSBlbGVtLT5kYXRhLnN0cjsKLQkJaWYgKHByaW50YWJsZSkgewotCQkJcHV0Y2hhcignIicpOwotCQkJaWYgKGZuX3ByaW50bihwLCBhc25sZW4sIHNuYXBlbmQpKSB7Ci0JCQkJcHV0Y2hhcignIicpOwotCQkJCWdvdG8gdHJ1bmM7Ci0JCQl9Ci0JCQlwdXRjaGFyKCciJyk7Ci0JCX0gZWxzZQotCQkJZm9yIChpID0gYXNubGVuOyBpLS0gPiAwOyBwKyspIHsKLQkJCQlwcmludGYoZmlyc3QgPyAiJS4yeCIgOiAiXyUuMngiLCAqcCk7Ci0JCQkJZmlyc3QgPSAwOwotCQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIEJFX1NFUToKLQkJcHJpbnRmKCJTZXEoJXUpIiwgZWxlbS0+YXNubGVuKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJFX0lORVRBRERSOgotCQlpZiAoYXNubGVuICE9IEFTTkxFTl9JTkVUQUREUikKLQkJCXByaW50ZigiW2luZXRhZGRyIGxlbiE9JWRdIiwgQVNOTEVOX0lORVRBRERSKTsKLQkJVENIRUNLMigqcCwgYXNubGVuKTsKLQkJZm9yIChpID0gYXNubGVuOyBpLS0gIT0gMDsgcCsrKSB7Ci0JCQlwcmludGYoKGkgPT0gYXNubGVuLTEpID8gIiV1IiA6ICIuJXUiLCAqcCk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEJFX05PU1VDSE9CSkVDVDoKLQljYXNlIEJFX05PU1VDSElOU1Q6Ci0JY2FzZSBCRV9FTkRPRk1JQlZJRVc6Ci0JICAgICAgICBwcmludGYoIlslc10iLCBDbGFzc1tFWENFUFRJT05TXS5JZFtlbGVtLT5pZF0pOwotCQlicmVhazsKLQotCWNhc2UgQkVfUERVOgotCQlwcmludGYoIiVzKCV1KSIsCi0JCQlDbGFzc1tDT05URVhUXS5JZFtlbGVtLT5pZF0sIGVsZW0tPmFzbmxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBCRV9BTlk6Ci0JCWZwdXRzKCJbQkVfQU5ZIT9dIiwgc3Rkb3V0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlmcHV0cygiW2JlIT9dIiwgc3Rkb3V0KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotCi10cnVuYzoKLQlmcHV0cygiW3xzbm1wXSIsIHN0ZG91dCk7Ci0JcmV0dXJuIC0xOwotfQotCi0jaWZkZWYgbm90ZGVmCi0vKgotICogVGhpcyBpcyBhIGJydXRlIGZvcmNlIEFTTi4xIHByaW50ZXI6IHJlY3Vyc2VzIHRvIGR1bXAgYW4gZW50aXJlIHN0cnVjdHVyZS4KLSAqIFRoaXMgd2lsbCB3b3JrIGZvciBhbnkgQVNOLjEgc3RyZWFtLCBub3QganVzdCBhbiBTTk1QIFBEVS4KLSAqCi0gKiBCeSBhZGRpbmcgbmV3bGluZXMgYW5kIHNwYWNlcyBhdCB0aGUgY29ycmVjdCBwbGFjZXMsIHRoaXMgd291bGQgcHJpbnQgaW4KLSAqIFJvc2UtTm9ybWFsLUZvcm0uCi0gKgotICogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1hc24xX2RlY29kZSh1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgYmUgZWxlbTsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoaSA+PSAwICYmIGxlbmd0aCA+IDApIHsKLQkJaSA9IGFzbjFfcGFyc2UocCwgbGVuZ3RoLCAmZWxlbSk7Ci0JCWlmIChpID49IDApIHsKLQkJCWZwdXRzKCIgIiwgc3Rkb3V0KTsKLQkJCWlmIChhc24xX3ByaW50KCZlbGVtKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKGVsZW0udHlwZSA9PSBCRV9TRVEgfHwgZWxlbS50eXBlID09IEJFX1BEVSkgewotCQkJCWZwdXRzKCIgeyIsIHN0ZG91dCk7Ci0JCQkJYXNuMV9kZWNvZGUoZWxlbS5kYXRhLnJhdywgZWxlbS5hc25sZW4pOwotCQkJCWZwdXRzKCIgfSIsIHN0ZG91dCk7Ci0JCQl9Ci0JCQlsZW5ndGggLT0gaTsKLQkJCXAgKz0gaTsKLQkJfQotCX0KLX0KLSNlbmRpZgotCi0jaWZkZWYgTElCU01JCi0KLXN0cnVjdCBzbWkyYmUgewotICAgIFNtaUJhc2V0eXBlIGJhc2V0eXBlOwotICAgIGludCBiZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc21pMmJlIHNtaTJiZXRhYltdID0gewotICAgIHsgU01JX0JBU0VUWVBFX0lOVEVHRVIzMiwJCUJFX0lOVCB9LAotICAgIHsgU01JX0JBU0VUWVBFX09DVEVUU1RSSU5HLAkJQkVfU1RSIH0sCi0gICAgeyBTTUlfQkFTRVRZUEVfT0NURVRTVFJJTkcsCQlCRV9JTkVUQUREUiB9LAotICAgIHsgU01JX0JBU0VUWVBFX09CSkVDVElERU5USUZJRVIsCUJFX09JRCB9LAotICAgIHsgU01JX0JBU0VUWVBFX1VOU0lHTkVEMzIsCQlCRV9VTlMgfSwKLSAgICB7IFNNSV9CQVNFVFlQRV9JTlRFR0VSNjQsCQlCRV9OT05FIH0sCi0gICAgeyBTTUlfQkFTRVRZUEVfVU5TSUdORUQ2NCwJCUJFX1VOUzY0IH0sCi0gICAgeyBTTUlfQkFTRVRZUEVfRkxPQVQzMiwJCUJFX05PTkUgfSwKLSAgICB7IFNNSV9CQVNFVFlQRV9GTE9BVDY0LAkJQkVfTk9ORSB9LAotICAgIHsgU01JX0JBU0VUWVBFX0ZMT0FUMTI4LAkJQkVfTk9ORSB9LAotICAgIHsgU01JX0JBU0VUWVBFX0VOVU0sCQlCRV9JTlQgfSwKLSAgICB7IFNNSV9CQVNFVFlQRV9CSVRTLAkJQkVfU1RSIH0sCi0gICAgeyBTTUlfQkFTRVRZUEVfVU5LTk9XTiwJCUJFX05PTkUgfQotfTsKLQotc3RhdGljIGludAotc21pX2RlY29kZV9vaWQoc3RydWN0IGJlICplbGVtLCB1bnNpZ25lZCBpbnQgKm9pZCwKLQkgICAgICAgdW5zaWduZWQgaW50IG9pZHNpemUsIHVuc2lnbmVkIGludCAqb2lkbGVuKQotewotCXVfY2hhciAqcCA9ICh1X2NoYXIgKillbGVtLT5kYXRhLnJhdzsKLQl1X2ludDMyX3QgYXNubGVuID0gZWxlbS0+YXNubGVuOwotCWludCBvID0gMCwgZmlyc3QgPSAtMSwgaSA9IGFzbmxlbjsKLQotCWZvciAoKm9pZGxlbiA9IDA7IHNmbGFnICYmIGktLSA+IDA7IHArKykgewotCQlUQ0hFQ0soKnApOwotCSAgICAgICAgbyA9IChvIDw8IEFTTl9TSElGVDcpICsgKCpwICYgfkFTTl9CSVQ4KTsKLQkJaWYgKCpwICYgQVNOX0xPTkdMRU4pCi0JCSAgICBjb250aW51ZTsKLQotCQkvKgotCQkgKiBmaXJzdCBzdWJpdGVtIGVuY29kZXMgdHdvIGl0ZW1zIHdpdGggMXN0Kk9JRE1VWCsybmQKLQkJICogKHNlZSBYLjY5MDoxOTk3IGNsYXVzZSA4LjE5IGZvciB0aGUgZGV0YWlscykKLQkJICovCi0JCWlmIChmaXJzdCA8IDApIHsKLQkJICAgICAgICBmaXJzdCA9IDA7Ci0JCQlpZiAoKm9pZGxlbiA8IG9pZHNpemUpIHsKLQkJCSAgICBvaWRbKm9pZGxlbl0gPSBvIC8gT0lETVVYOwotCQkJICAgIGlmIChvaWRbKm9pZGxlbl0gPiAyKSBvaWRbKm9pZGxlbl0gPSAyOwotCQkJfQotCQkJbyAtPSBvaWRbKm9pZGxlbl0gKiBPSURNVVg7Ci0JCQlpZiAoKm9pZGxlbiA8IG9pZHNpemUpICgqb2lkbGVuKSsrOwotCQl9Ci0JCWlmICgqb2lkbGVuIDwgb2lkc2l6ZSkgewotCQkJb2lkWygqb2lkbGVuKSsrXSA9IG87Ci0JCX0KLQkJbyA9IDA7Ci0JfQotCXJldHVybiAwOwotCi10cnVuYzoKLQlmcHV0cygiW3xzbm1wXSIsIHN0ZG91dCk7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IHNtaV9jaGVja190eXBlKFNtaUJhc2V0eXBlIGJhc2V0eXBlLCBpbnQgYmUpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBzbWkyYmV0YWJbaV0uYmFzZXR5cGUgIT0gU01JX0JBU0VUWVBFX1VOS05PV047IGkrKykgewotCWlmIChzbWkyYmV0YWJbaV0uYmFzZXR5cGUgPT0gYmFzZXR5cGUgJiYgc21pMmJldGFiW2ldLmJlID09IGJlKSB7Ci0JICAgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbWlfY2hlY2tfYV9yYW5nZShTbWlUeXBlICpzbWlUeXBlLCBTbWlSYW5nZSAqc21pUmFuZ2UsCi0JCQkgICAgIHN0cnVjdCBiZSAqZWxlbSkKLXsKLSAgICBpbnQgb2sgPSAxOwotCi0gICAgc3dpdGNoIChzbWlUeXBlLT5iYXNldHlwZSkgewotICAgIGNhc2UgU01JX0JBU0VUWVBFX09CSkVDVElERU5USUZJRVI6Ci0gICAgY2FzZSBTTUlfQkFTRVRZUEVfT0NURVRTVFJJTkc6Ci0JaWYgKHNtaVJhbmdlLT5taW5WYWx1ZS52YWx1ZS51bnNpZ25lZDMyCi0JICAgID09IHNtaVJhbmdlLT5tYXhWYWx1ZS52YWx1ZS51bnNpZ25lZDMyKSB7Ci0JICAgIG9rID0gKGVsZW0tPmFzbmxlbiA9PSBzbWlSYW5nZS0+bWluVmFsdWUudmFsdWUudW5zaWduZWQzMik7Ci0JfSBlbHNlIHsKLQkgICAgb2sgPSAoZWxlbS0+YXNubGVuID49IHNtaVJhbmdlLT5taW5WYWx1ZS52YWx1ZS51bnNpZ25lZDMyCi0JCSAgJiYgZWxlbS0+YXNubGVuIDw9IHNtaVJhbmdlLT5tYXhWYWx1ZS52YWx1ZS51bnNpZ25lZDMyKTsKLQl9Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNNSV9CQVNFVFlQRV9JTlRFR0VSMzI6Ci0Jb2sgPSAoZWxlbS0+ZGF0YS5pbnRlZ2VyID49IHNtaVJhbmdlLT5taW5WYWx1ZS52YWx1ZS5pbnRlZ2VyMzIKLQkgICAgICAmJiBlbGVtLT5kYXRhLmludGVnZXIgPD0gc21pUmFuZ2UtPm1heFZhbHVlLnZhbHVlLmludGVnZXIzMik7Ci0JYnJlYWs7Ci0KLSAgICBjYXNlIFNNSV9CQVNFVFlQRV9VTlNJR05FRDMyOgotCW9rID0gKGVsZW0tPmRhdGEudW5zID49IHNtaVJhbmdlLT5taW5WYWx1ZS52YWx1ZS51bnNpZ25lZDMyCi0JICAgICAgJiYgZWxlbS0+ZGF0YS51bnMgPD0gc21pUmFuZ2UtPm1heFZhbHVlLnZhbHVlLnVuc2lnbmVkMzIpOwotCWJyZWFrOwotCi0gICAgY2FzZSBTTUlfQkFTRVRZUEVfVU5TSUdORUQ2NDoKLQkvKiBYWFggKi8KLQlicmVhazsKLQotCS8qIGNhc2UgU01JX0JBU0VUWVBFX0lOVEVHRVI2NDogU01JbmcgKi8KLQkvKiBjYXNlIFNNSV9CQVNFVFlQRV9GTE9BVDMyOiBTTUluZyAqLwotCS8qIGNhc2UgU01JX0JBU0VUWVBFX0ZMT0FUNjQ6IFNNSW5nICovCi0JLyogY2FzZSBTTUlfQkFTRVRZUEVfRkxPQVQxMjg6IFNNSW5nICovCi0KLSAgICBjYXNlIFNNSV9CQVNFVFlQRV9FTlVNOgotICAgIGNhc2UgU01JX0JBU0VUWVBFX0JJVFM6Ci0gICAgY2FzZSBTTUlfQkFTRVRZUEVfVU5LTk9XTjoKLQlvayA9IDE7Ci0JYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotCW9rID0gMDsKLQlicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgc21pX2NoZWNrX3JhbmdlKFNtaVR5cGUgKnNtaVR5cGUsIHN0cnVjdCBiZSAqZWxlbSkKLXsKLSAgICAgICAgU21pUmFuZ2UgKnNtaVJhbmdlOwotCWludCBvayA9IDE7Ci0KLQlmb3IgKHNtaVJhbmdlID0gc21pR2V0Rmlyc3RSYW5nZShzbWlUeXBlKTsKLQkgICAgIHNtaVJhbmdlOwotCSAgICAgc21pUmFuZ2UgPSBzbWlHZXROZXh0UmFuZ2Uoc21pUmFuZ2UpKSB7Ci0KLQkgICAgb2sgPSBzbWlfY2hlY2tfYV9yYW5nZShzbWlUeXBlLCBzbWlSYW5nZSwgZWxlbSk7Ci0KLQkgICAgaWYgKG9rKSB7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0JaWYgKG9rKSB7Ci0JICAgIFNtaVR5cGUgKnBhcmVudFR5cGU7Ci0JICAgIHBhcmVudFR5cGUgPSBzbWlHZXRQYXJlbnRUeXBlKHNtaVR5cGUpOwotCSAgICBpZiAocGFyZW50VHlwZSkgewotCQlvayA9IHNtaV9jaGVja19yYW5nZShwYXJlbnRUeXBlLCBlbGVtKTsKLQkgICAgfQotCX0KLQotCXJldHVybiBvazsKLX0KLQotc3RhdGljIFNtaU5vZGUgKnNtaV9wcmludF92YXJpYWJsZShzdHJ1Y3QgYmUgKmVsZW0sIGludCAqc3RhdHVzKQotewotCXVuc2lnbmVkIGludCBvaWRbMTI4XSwgb2lkbGVuOwotCVNtaU5vZGUgKnNtaU5vZGUgPSBOVUxMOwotCXVuc2lnbmVkIGludCBpOwotCi0JKnN0YXR1cyA9IHNtaV9kZWNvZGVfb2lkKGVsZW0sIG9pZCwgc2l6ZW9mKG9pZCkvc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JICAgICZvaWRsZW4pOwotCWlmICgqc3RhdHVzIDwgMCkKLQkJcmV0dXJuIE5VTEw7Ci0Jc21pTm9kZSA9IHNtaUdldE5vZGVCeU9JRChvaWRsZW4sIG9pZCk7Ci0JaWYgKCEgc21pTm9kZSkgewotCQkqc3RhdHVzID0gYXNuMV9wcmludChlbGVtKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmICh2ZmxhZykgewotCQlmcHV0cyhzbWlHZXROb2RlTW9kdWxlKHNtaU5vZGUpLT5uYW1lLCBzdGRvdXQpOwotCQlmcHV0cygiOjoiLCBzdGRvdXQpOwotCX0KLQlmcHV0cyhzbWlOb2RlLT5uYW1lLCBzdGRvdXQpOwotCWlmIChzbWlOb2RlLT5vaWRsZW4gPCBvaWRsZW4pIHsKLQkgICAgICAgIGZvciAoaSA9IHNtaU5vZGUtPm9pZGxlbjsgaSA8IG9pZGxlbjsgaSsrKSB7Ci0JCSAgICAgICAgcHJpbnRmKCIuJXUiLCBvaWRbaV0pOwotCQl9Ci0JfQotCSpzdGF0dXMgPSAwOwotCXJldHVybiBzbWlOb2RlOwotfQotCi1zdGF0aWMgaW50Ci1zbWlfcHJpbnRfdmFsdWUoU21pTm9kZSAqc21pTm9kZSwgdV9jaGFyIHBkdWlkLCBzdHJ1Y3QgYmUgKmVsZW0pCi17Ci0JdW5zaWduZWQgaW50IGksIG9pZFsxMjhdLCBvaWRsZW47Ci0JU21pVHlwZSAqc21pVHlwZTsKLQlTbWlOYW1lZE51bWJlciAqbm47Ci0JaW50IGRvbmUgPSAwOwotCi0JaWYgKCEgc21pTm9kZSB8fCAhIChzbWlOb2RlLT5ub2Rla2luZAotCQkJICAgICYgKFNNSV9OT0RFS0lORF9TQ0FMQVIgfCBTTUlfTk9ERUtJTkRfQ09MVU1OKSkpIHsKLQkgICAgcmV0dXJuIGFzbjFfcHJpbnQoZWxlbSk7Ci0JfQotCi0JaWYgKGVsZW0tPnR5cGUgPT0gQkVfTk9TVUNIT0JKRUNUCi0JICAgIHx8IGVsZW0tPnR5cGUgPT0gQkVfTk9TVUNISU5TVAotCSAgICB8fCBlbGVtLT50eXBlID09IEJFX0VORE9GTUlCVklFVykgewotCSAgICByZXR1cm4gYXNuMV9wcmludChlbGVtKTsKLQl9Ci0KLQlpZiAoTk9USUZZX0NMQVNTKHBkdWlkKSAmJiBzbWlOb2RlLT5hY2Nlc3MgPCBTTUlfQUNDRVNTX05PVElGWSkgewotCSAgICBmcHV0cygiW25vdE5vdGlmeWFibGVdIiwgc3Rkb3V0KTsKLQl9Ci0KLQlpZiAoUkVBRF9DTEFTUyhwZHVpZCkgJiYgc21pTm9kZS0+YWNjZXNzIDwgU01JX0FDQ0VTU19SRUFEX09OTFkpIHsKLQkgICAgZnB1dHMoIltub3RSZWFkYWJsZV0iLCBzdGRvdXQpOwotCX0KLQotCWlmIChXUklURV9DTEFTUyhwZHVpZCkgJiYgc21pTm9kZS0+YWNjZXNzIDwgU01JX0FDQ0VTU19SRUFEX1dSSVRFKSB7Ci0JICAgIGZwdXRzKCJbbm90V3JpdGFibGVdIiwgc3Rkb3V0KTsKLQl9Ci0KLQlpZiAoUkVTUE9OU0VfQ0xBU1MocGR1aWQpCi0JICAgICYmIHNtaU5vZGUtPmFjY2VzcyA9PSBTTUlfQUNDRVNTX05PVF9BQ0NFU1NJQkxFKSB7Ci0JICAgIGZwdXRzKCJbbm9BY2Nlc3NdIiwgc3Rkb3V0KTsKLQl9Ci0KLQlzbWlUeXBlID0gc21pR2V0Tm9kZVR5cGUoc21pTm9kZSk7Ci0JaWYgKCEgc21pVHlwZSkgewotCSAgICByZXR1cm4gYXNuMV9wcmludChlbGVtKTsKLQl9Ci0KLQlpZiAoISBzbWlfY2hlY2tfdHlwZShzbWlUeXBlLT5iYXNldHlwZSwgZWxlbS0+dHlwZSkpIHsKLQkgICAgZnB1dHMoIlt3cm9uZ1R5cGVdIiwgc3Rkb3V0KTsKLQl9Ci0KLQlpZiAoISBzbWlfY2hlY2tfcmFuZ2Uoc21pVHlwZSwgZWxlbSkpIHsKLQkgICAgZnB1dHMoIltvdXRPZlJhbmdlXSIsIHN0ZG91dCk7Ci0JfQotCi0JLyogcmVzb2x2ZSBiaXRzIHRvIG5hbWVkIGJpdHMgKi8KLQotCS8qIGNoZWNrIHdoZXRoZXIgaW5zdGFuY2UgaWRlbnRpZmllciBpcyB2YWxpZCAqLwotCi0JLyogYXBwbHkgZGlzcGxheSBoaW50cyAoaW50ZWdlciwgb2N0ZXRzdHJpbmcpICovCi0KLQkvKiBjb252ZXJ0IGluc3RhbmNlIGlkZW50aWZpZXIgdG8gaW5kZXggdHlwZSB2YWx1ZXMgKi8KLQotCXN3aXRjaCAoZWxlbS0+dHlwZSkgewotCWNhc2UgQkVfT0lEOgotCSAgICAgICAgaWYgKHNtaVR5cGUtPmJhc2V0eXBlID09IFNNSV9CQVNFVFlQRV9CSVRTKSB7Ci0JCSAgICAgICAgLyogcHJpbnQgYml0IGxhYmVscyAqLwotCQl9IGVsc2UgewotCQkgICAgICAgIHNtaV9kZWNvZGVfb2lkKGVsZW0sIG9pZCwKLQkJCQkgICAgICAgc2l6ZW9mKG9pZCkvc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCQkJICAgICAgICZvaWRsZW4pOwotCQkJc21pTm9kZSA9IHNtaUdldE5vZGVCeU9JRChvaWRsZW4sIG9pZCk7Ci0JCQlpZiAoc21pTm9kZSkgewotCQkJICAgICAgICBpZiAodmZsYWcpIHsKLQkJCQkJZnB1dHMoc21pR2V0Tm9kZU1vZHVsZShzbWlOb2RlKS0+bmFtZSwgc3Rkb3V0KTsKLQkJCQkJZnB1dHMoIjo6Iiwgc3Rkb3V0KTsKLQkJCQl9Ci0JCQkJZnB1dHMoc21pTm9kZS0+bmFtZSwgc3Rkb3V0KTsKLQkJCQlpZiAoc21pTm9kZS0+b2lkbGVuIDwgb2lkbGVuKSB7Ci0JCQkJICAgICAgICBmb3IgKGkgPSBzbWlOb2RlLT5vaWRsZW47Ci0JCQkJCSAgICAgaSA8IG9pZGxlbjsgaSsrKSB7Ci0JCQkJCSAgICAgICAgcHJpbnRmKCIuJXUiLCBvaWRbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRvbmUrKzsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgQkVfSU5UOgotCSAgICAgICAgaWYgKHNtaVR5cGUtPmJhc2V0eXBlID09IFNNSV9CQVNFVFlQRV9FTlVNKSB7Ci0JCSAgICAgICAgZm9yIChubiA9IHNtaUdldEZpcnN0TmFtZWROdW1iZXIoc21pVHlwZSk7Ci0JCQkgICAgIG5uOwotCQkJICAgICBubiA9IHNtaUdldE5leHROYW1lZE51bWJlcihubikpIHsKLQkJCSAgICAgICAgIGlmIChubi0+dmFsdWUudmFsdWUuaW50ZWdlcjMyCi0JCQkJICAgICA9PSBlbGVtLT5kYXRhLmludGVnZXIpIHsKLQkJCQkgICAgICAgICBmcHV0cyhubi0+bmFtZSwgc3Rkb3V0KTsKLQkJCQkJIHByaW50ZigiKCVkKSIsIGVsZW0tPmRhdGEuaW50ZWdlcik7Ci0JCQkJCSBkb25lKys7Ci0JCQkJCSBicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCEgZG9uZSkgewotCQlyZXR1cm4gYXNuMV9wcmludChlbGVtKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIEdlbmVyYWwgU05NUCBoZWFkZXIKLSAqCVNFUVVFTkNFIHsKLSAqCQl2ZXJzaW9uIElOVEVHRVIge3ZlcnNpb24tMSgwKX0sCi0gKgkJY29tbXVuaXR5IE9DVEVUIFNUUklORywKLSAqCQlkYXRhIEFOWQktLSBQRFVzCi0gKgl9Ci0gKiBQRFVzIGZvciBhbGwgYnV0IFRyYXA6IChzZWUgcmZjMTE1NyBmcm9tIHBhZ2UgMTUgb24pCi0gKglTRVFVRU5DRSB7Ci0gKgkJcmVxdWVzdC1pZCBJTlRFR0VSLAotICoJCWVycm9yLXN0YXR1cyBJTlRFR0VSLAotICoJCWVycm9yLWluZGV4IElOVEVHRVIsCi0gKgkJdmFyYmluZGxpc3QgU0VRVUVOQ0UgT0YKLSAqCQkJU0VRVUVOQ0UgewotICoJCQkJbmFtZSBPYmplY3ROYW1lLAotICoJCQkJdmFsdWUgT2JqZWN0VmFsdWUKLSAqCQkJfQotICoJfQotICogUERVIGZvciBUcmFwOgotICoJU0VRVUVOQ0UgewotICoJCWVudGVycHJpc2UgT0JKRUNUIElERU5USUZJRVIsCi0gKgkJYWdlbnQtYWRkciBOZXR3b3JrQWRkcmVzcywKLSAqCQlnZW5lcmljLXRyYXAgSU5URUdFUiwKLSAqCQlzcGVjaWZpYy10cmFwIElOVEVHRVIsCi0gKgkJdGltZS1zdGFtcCBUaW1lVGlja3MsCi0gKgkJdmFyYmluZGxpc3QgU0VRVUVOQ0UgT0YKLSAqCQkJU0VRVUVOQ0UgewotICoJCQkJbmFtZSBPYmplY3ROYW1lLAotICoJCQkJdmFsdWUgT2JqZWN0VmFsdWUKLSAqCQkJfQotICoJfQotICovCi0KLS8qCi0gKiBEZWNvZGUgU05NUCB2YXJCaW5kCi0gKi8KLXN0YXRpYyB2b2lkCi12YXJiaW5kX3ByaW50KHVfY2hhciBwZHVpZCwgY29uc3QgdV9jaGFyICpucCwgdV9pbnQgbGVuZ3RoKQotewotCXN0cnVjdCBiZSBlbGVtOwotCWludCBjb3VudCA9IDAsIGluZDsKLSNpZmRlZiBMSUJTTUkKLQlTbWlOb2RlICpzbWlOb2RlID0gTlVMTDsKLSNlbmRpZgotCWludCBzdGF0dXM7Ci0KLQkvKiBTZXF1ZW5jZSBvZiB2YXJCaW5kICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX1NFUSkgewotCQlmcHV0cygiWyFTRVEgb2YgdmFyYmluZF0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoKHVfaW50KWNvdW50IDwgbGVuZ3RoKQotCQlwcmludGYoIlslZCBleHRyYSBhZnRlciBTRVEgb2YgdmFyYmluZF0iLCBsZW5ndGggLSBjb3VudCk7Ci0JLyogZGVzY2VuZCAqLwotCWxlbmd0aCA9IGVsZW0uYXNubGVuOwotCW5wID0gKHVfY2hhciAqKWVsZW0uZGF0YS5yYXc7Ci0KLQlmb3IgKGluZCA9IDE7IGxlbmd0aCA+IDA7IGluZCsrKSB7Ci0JCWNvbnN0IHVfY2hhciAqdmJlbmQ7Ci0JCXVfaW50IHZibGVuZ3RoOwotCi0JCWZwdXRzKCIgIiwgc3Rkb3V0KTsKLQotCQkvKiBTZXF1ZW5jZSAqLwotCQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJCXJldHVybjsKLQkJaWYgKGVsZW0udHlwZSAhPSBCRV9TRVEpIHsKLQkJCWZwdXRzKCJbIXZhcmJpbmRdIiwgc3Rkb3V0KTsKLQkJCWFzbjFfcHJpbnQoJmVsZW0pOwotCQkJcmV0dXJuOwotCQl9Ci0JCXZiZW5kID0gbnAgKyBjb3VudDsKLQkJdmJsZW5ndGggPSBsZW5ndGggLSBjb3VudDsKLQkJLyogZGVzY2VuZCAqLwotCQlsZW5ndGggPSBlbGVtLmFzbmxlbjsKLQkJbnAgPSAodV9jaGFyICopZWxlbS5kYXRhLnJhdzsKLQotCQkvKiBvYmpOYW1lIChPSUQpICovCi0JCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQkJcmV0dXJuOwotCQlpZiAoZWxlbS50eXBlICE9IEJFX09JRCkgewotCQkJZnB1dHMoIltvYmpOYW1lIT1PSURdIiwgc3Rkb3V0KTsKLQkJCWFzbjFfcHJpbnQoJmVsZW0pOwotCQkJcmV0dXJuOwotCQl9Ci0jaWZkZWYgTElCU01JCi0JCXNtaU5vZGUgPSBzbWlfcHJpbnRfdmFyaWFibGUoJmVsZW0sICZzdGF0dXMpOwotI2Vsc2UKLQkJc3RhdHVzID0gYXNuMV9wcmludCgmZWxlbSk7Ci0jZW5kaWYKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlyZXR1cm47Ci0JCWxlbmd0aCAtPSBjb3VudDsKLQkJbnAgKz0gY291bnQ7Ci0KLQkJaWYgKHBkdWlkICE9IEdFVFJFUSAmJiBwZHVpZCAhPSBHRVRORVhUUkVRCi0JCSAgICAmJiBwZHVpZCAhPSBHRVRCVUxLUkVRKQotCQkJZnB1dHMoIj0iLCBzdGRvdXQpOwotCi0JCS8qIG9ialZhbCAoQU5ZKSAqLwotCQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJCXJldHVybjsKLQkJaWYgKHBkdWlkID09IEdFVFJFUSB8fCBwZHVpZCA9PSBHRVRORVhUUkVRCi0JCSAgICB8fCBwZHVpZCA9PSBHRVRCVUxLUkVRKSB7Ci0JCQlpZiAoZWxlbS50eXBlICE9IEJFX05VTEwpIHsKLQkJCQlmcHV0cygiW29ialZhbCE9TlVMTF0iLCBzdGRvdXQpOwotCQkJCWlmIChhc24xX3ByaW50KCZlbGVtKSA8IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJICAgICAgICBpZiAoZWxlbS50eXBlICE9IEJFX05VTEwpIHsKLSNpZmRlZiBMSUJTTUkKLQkJCQlzdGF0dXMgPSBzbWlfcHJpbnRfdmFsdWUoc21pTm9kZSwgcGR1aWQsICZlbGVtKTsKLSNlbHNlCi0JCQkJc3RhdHVzID0gYXNuMV9wcmludCgmZWxlbSk7Ci0jZW5kaWYKLQkJCX0KLQkJCWlmIChzdGF0dXMgPCAwKQotCQkJCXJldHVybjsKLQkJfQotCQlsZW5ndGggPSB2Ymxlbmd0aDsKLQkJbnAgPSB2YmVuZDsKLQl9Ci19Ci0KLS8qCi0gKiBEZWNvZGUgU05NUCBQRFVzOiBHZXRSZXF1ZXN0LCBHZXROZXh0UmVxdWVzdCwgR2V0UmVzcG9uc2UsIFNldFJlcXVlc3QsCi0gKiBHZXRCdWxrLCBJbmZvcm0sIFYyVHJhcCwgYW5kIFJlcG9ydAotICovCi1zdGF0aWMgdm9pZAotc25tcHBkdV9wcmludCh1X3Nob3J0IHBkdWlkLCBjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGJlIGVsZW07Ci0JaW50IGNvdW50ID0gMCwgZXJyb3I7Ci0KLQkvKiByZXFJZCAoSW50ZWdlcikgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfSU5UKSB7Ci0JCWZwdXRzKCJbcmVxSWQhPUlOVF0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodmZsYWcpCi0JCXByaW50ZigiUj0lZCAiLCBlbGVtLmRhdGEuaW50ZWdlcik7Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JLyogZXJyb3JTdGF0dXMgKEludGVnZXIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgewotCQlmcHV0cygiW2Vycm9yU3RhdHVzIT1JTlRdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JZXJyb3IgPSAwOwotCWlmICgocGR1aWQgPT0gR0VUUkVRIHx8IHBkdWlkID09IEdFVE5FWFRSRVEgfHwgcGR1aWQgPT0gU0VUUkVRCi0JICAgIHx8IHBkdWlkID09IElORk9STVJFUSB8fCBwZHVpZCA9PSBWMlRSQVAgfHwgcGR1aWQgPT0gUkVQT1JUKQotCSAgICAmJiBlbGVtLmRhdGEuaW50ZWdlciAhPSAwKSB7Ci0JCWNoYXIgZXJyYnVmWzIwXTsKLQkJcHJpbnRmKCJbZXJyb3JTdGF0dXMoJXMpIT0wXSIsCi0JCQlERUNPREVfRXJyb3JTdGF0dXMoZWxlbS5kYXRhLmludGVnZXIpKTsKLQl9IGVsc2UgaWYgKHBkdWlkID09IEdFVEJVTEtSRVEpIHsKLQkgICAgICAgIHByaW50ZigiIE49JWQiLCBlbGVtLmRhdGEuaW50ZWdlcik7Ci0JfSBlbHNlIGlmIChlbGVtLmRhdGEuaW50ZWdlciAhPSAwKSB7Ci0JCWNoYXIgZXJyYnVmWzIwXTsKLQkJcHJpbnRmKCIgJXMiLCBERUNPREVfRXJyb3JTdGF0dXMoZWxlbS5kYXRhLmludGVnZXIpKTsKLQkJZXJyb3IgPSBlbGVtLmRhdGEuaW50ZWdlcjsKLQl9Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JLyogZXJyb3JJbmRleCAoSW50ZWdlcikgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfSU5UKSB7Ci0JCWZwdXRzKCJbZXJyb3JJbmRleCE9SU5UXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWlmICgocGR1aWQgPT0gR0VUUkVRIHx8IHBkdWlkID09IEdFVE5FWFRSRVEgfHwgcGR1aWQgPT0gU0VUUkVRCi0JICAgIHx8IHBkdWlkID09IElORk9STVJFUSB8fCBwZHVpZCA9PSBWMlRSQVAgfHwgcGR1aWQgPT0gUkVQT1JUKQotCSAgICAmJiBlbGVtLmRhdGEuaW50ZWdlciAhPSAwKQotCQlwcmludGYoIltlcnJvckluZGV4KCVkKSE9MF0iLCBlbGVtLmRhdGEuaW50ZWdlcik7Ci0JZWxzZSBpZiAocGR1aWQgPT0gR0VUQlVMS1JFUSkKLQkgICAgICAgIHByaW50ZigiIE09JWQiLCBlbGVtLmRhdGEuaW50ZWdlcik7Ci0JZWxzZSBpZiAoZWxlbS5kYXRhLmludGVnZXIgIT0gMCkgewotCQlpZiAoIWVycm9yKQotCQkJcHJpbnRmKCJbZXJyb3JJbmRleCglZCkgdy9vIGVycm9yU3RhdHVzXSIsCi0JCQkJZWxlbS5kYXRhLmludGVnZXIpOwotCQllbHNlIHsKLQkJCXByaW50ZigiQCVkIiwgZWxlbS5kYXRhLmludGVnZXIpOwotCQkJZXJyb3IgPSBlbGVtLmRhdGEuaW50ZWdlcjsKLQkJfQotCX0gZWxzZSBpZiAoZXJyb3IpIHsKLQkJZnB1dHMoIltlcnJvckluZGV4PT0wXSIsIHN0ZG91dCk7Ci0JCWVycm9yID0gMDsKLQl9Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JdmFyYmluZF9wcmludChwZHVpZCwgbnAsIGxlbmd0aCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogRGVjb2RlIFNOTVAgVHJhcCBQRFUKLSAqLwotc3RhdGljIHZvaWQKLXRyYXBwZHVfcHJpbnQoY29uc3QgdV9jaGFyICpucCwgdV9pbnQgbGVuZ3RoKQotewotCXN0cnVjdCBiZSBlbGVtOwotCWludCBjb3VudCA9IDAsIGdlbmVyaWM7Ci0KLQlwdXRjaGFyKCcgJyk7Ci0KLQkvKiBlbnRlcnByaXNlIChvaWQpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX09JRCkgewotCQlmcHV0cygiW2VudGVycHJpc2UhPU9JRF0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoYXNuMV9wcmludCgmZWxlbSkgPCAwKQotCQlyZXR1cm47Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JcHV0Y2hhcignICcpOwotCi0JLyogYWdlbnQtYWRkciAoaW5ldGFkZHIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lORVRBRERSKSB7Ci0JCWZwdXRzKCJbYWdlbnQtYWRkciE9SU5FVEFERFJdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGFzbjFfcHJpbnQoJmVsZW0pIDwgMCkKLQkJcmV0dXJuOwotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCS8qIGdlbmVyaWMtdHJhcCAoSW50ZWdlcikgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfSU5UKSB7Ci0JCWZwdXRzKCJbZ2VuZXJpYy10cmFwIT1JTlRdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JZ2VuZXJpYyA9IGVsZW0uZGF0YS5pbnRlZ2VyOwotCXsKLQkJY2hhciBidWZbMjBdOwotCQlwcmludGYoIiAlcyIsIERFQ09ERV9HZW5lcmljVHJhcChnZW5lcmljKSk7Ci0JfQotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCS8qIHNwZWNpZmljLXRyYXAgKEludGVnZXIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgewotCQlmcHV0cygiW3NwZWNpZmljLXRyYXAhPUlOVF0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoZ2VuZXJpYyAhPSBHVF9FTlRFUlBSSVNFKSB7Ci0JCWlmIChlbGVtLmRhdGEuaW50ZWdlciAhPSAwKQotCQkJcHJpbnRmKCJbc3BlY2lmaWMtdHJhcCglZCkhPTBdIiwgZWxlbS5kYXRhLmludGVnZXIpOwotCX0gZWxzZQotCQlwcmludGYoIiBzPSVkIiwgZWxlbS5kYXRhLmludGVnZXIpOwotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCXB1dGNoYXIoJyAnKTsKLQotCS8qIHRpbWUtc3RhbXAgKFRpbWVUaWNrcykgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfVU5TKSB7CQkJLyogWFhYICovCi0JCWZwdXRzKCJbdGltZS1zdGFtcCE9VElNRVRJQ0tTXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWlmIChhc24xX3ByaW50KCZlbGVtKSA8IDApCi0JCXJldHVybjsKLQlsZW5ndGggLT0gY291bnQ7Ci0JbnAgKz0gY291bnQ7Ci0KLQl2YXJiaW5kX3ByaW50IChUUkFQLCBucCwgbGVuZ3RoKTsKLQlyZXR1cm47Ci19Ci0KLS8qCi0gKiBEZWNvZGUgYXJiaXRyYXJ5IFNOTVAgUERVcy4KLSAqLwotc3RhdGljIHZvaWQKLXBkdV9wcmludChjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgsIGludCB2ZXJzaW9uKQotewotCXN0cnVjdCBiZSBwZHU7Ci0JaW50IGNvdW50ID0gMDsKLQotCS8qIFBEVSAoQ29udGV4dCkgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmcGR1KSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKHBkdS50eXBlICE9IEJFX1BEVSkgewotCQlmcHV0cygiW25vIFBEVV0iLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCWlmICgodV9pbnQpY291bnQgPCBsZW5ndGgpCi0JCXByaW50ZigiWyVkIGV4dHJhIGFmdGVyIFBEVV0iLCBsZW5ndGggLSBjb3VudCk7Ci0JaWYgKHZmbGFnKSB7Ci0JCWZwdXRzKCJ7ICIsIHN0ZG91dCk7Ci0JfQotCWlmIChhc24xX3ByaW50KCZwZHUpIDwgMCkKLQkJcmV0dXJuOwotCWZwdXRzKCIgIiwgc3Rkb3V0KTsKLQkvKiBkZXNjZW5kIGludG8gUERVICovCi0JbGVuZ3RoID0gcGR1LmFzbmxlbjsKLQlucCA9ICh1X2NoYXIgKilwZHUuZGF0YS5yYXc7Ci0KLQlpZiAodmVyc2lvbiA9PSBTTk1QX1ZFUlNJT05fMSAmJgotCSAgICAocGR1LmlkID09IEdFVEJVTEtSRVEgfHwgcGR1LmlkID09IElORk9STVJFUSB8fAotCSAgICAgcGR1LmlkID09IFYyVFJBUCB8fCBwZHUuaWQgPT0gUkVQT1JUKSkgewotCSAgICAgICAgcHJpbnRmKCJbdjIgUERVIGluIHYxIG1lc3NhZ2VdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodmVyc2lvbiA9PSBTTk1QX1ZFUlNJT05fMiAmJiBwZHUuaWQgPT0gVFJBUCkgewotCSAgICAgICAgcHJpbnRmKCJbdjEgUERVIGluIHYyIG1lc3NhZ2VdIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzd2l0Y2ggKHBkdS5pZCkgewotCWNhc2UgVFJBUDoKLQkJdHJhcHBkdV9wcmludChucCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0JY2FzZSBHRVRSRVE6Ci0JY2FzZSBHRVRORVhUUkVROgotCWNhc2UgR0VUUkVTUDoKLQljYXNlIFNFVFJFUToKLQljYXNlIEdFVEJVTEtSRVE6Ci0JY2FzZSBJTkZPUk1SRVE6Ci0JY2FzZSBWMlRSQVA6Ci0JY2FzZSBSRVBPUlQ6Ci0JCXNubXBwZHVfcHJpbnQocGR1LmlkLCBucCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHZmbGFnKSB7Ci0JCWZwdXRzKCIgfSAiLCBzdGRvdXQpOwotCX0KLX0KLQotLyoKLSAqIERlY29kZSBhIHNjb3BlZCBTTk1QIFBEVS4KLSAqLwotc3RhdGljIHZvaWQKLXNjb3BlZHBkdV9wcmludChjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgsIGludCB2ZXJzaW9uKQotewotCXN0cnVjdCBiZSBlbGVtOwotCWludCBpLCBjb3VudCA9IDA7Ci0KLQkvKiBTZXF1ZW5jZSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TRVEpIHsKLQkJZnB1dHMoIlshc2NvcGVkIFBEVV0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggPSBlbGVtLmFzbmxlbjsKLQlucCA9ICh1X2NoYXIgKillbGVtLmRhdGEucmF3OwotCi0JLyogY29udGV4dEVuZ2luZUlEIChPQ1RFVCBTVFJJTkcpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX1NUUikgewotCQlmcHV0cygiW2NvbnRleHRFbmdpbmVJRCE9U1RSXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCWZwdXRzKCJFPSAiLCBzdGRvdXQpOwotCWZvciAoaSA9IDA7IGkgPCAoaW50KWVsZW0uYXNubGVuOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50ZigiMHglMDJYIiwgZWxlbS5kYXRhLnN0cltpXSk7Ci0gICAgICAgIH0KLQlmcHV0cygiICIsIHN0ZG91dCk7Ci0KLQkvKiBjb250ZXh0TmFtZSAoT0NURVQgU1RSSU5HKSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKLQkJZnB1dHMoIltjb250ZXh0TmFtZSE9U1RSXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCXByaW50ZigiQz0lLipzICIsIChpbnQpZWxlbS5hc25sZW4sIGVsZW0uZGF0YS5zdHIpOwotCi0JcGR1X3ByaW50KG5wLCBsZW5ndGgsIHZlcnNpb24pOwotfQotCi0vKgotICogRGVjb2RlIFNOTVAgQ29tbXVuaXR5IEhlYWRlciAoU05NUHYxIGFuZCBTTk1QdjJjKQotICovCi1zdGF0aWMgdm9pZAotY29tbXVuaXR5X3ByaW50KGNvbnN0IHVfY2hhciAqbnAsIHVfaW50IGxlbmd0aCwgaW50IHZlcnNpb24pCi17Ci0Jc3RydWN0IGJlIGVsZW07Ci0JaW50IGNvdW50ID0gMDsKLQotCS8qIENvbW11bml0eSAoU3RyaW5nKSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKLQkJZnB1dHMoIltjb21tIT1TVFJdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JLyogZGVmYXVsdCBjb21tdW5pdHkgKi8KLQlpZiAoIShlbGVtLmFzbmxlbiA9PSBzaXplb2YoREVGX0NPTU1VTklUWSkgLSAxICYmCi0JICAgIHN0cm5jbXAoKGNoYXIgKillbGVtLmRhdGEuc3RyLCBERUZfQ09NTVVOSVRZLAotCSAgICAgICAgICAgIHNpemVvZihERUZfQ09NTVVOSVRZKSAtIDEpID09IDApKQotCQkvKiAhICJwdWJsaWMiICovCi0JCXByaW50ZigiQz0lLipzICIsIChpbnQpZWxlbS5hc25sZW4sIGVsZW0uZGF0YS5zdHIpOwotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCXBkdV9wcmludChucCwgbGVuZ3RoLCB2ZXJzaW9uKTsKLX0KLQotLyoKLSAqIERlY29kZSBTTk1QdjMgVXNlci1iYXNlZCBTZWN1cml0eSBNZXNzYWdlIEhlYWRlciAoU05NUHYzKQotICovCi1zdGF0aWMgdm9pZAotdXNtX3ByaW50KGNvbnN0IHVfY2hhciAqbnAsIHVfaW50IGxlbmd0aCkKLXsKLSAgICAgICAgc3RydWN0IGJlIGVsZW07Ci0JaW50IGNvdW50ID0gMDsKLQotCS8qIFNlcXVlbmNlICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX1NFUSkgewotCQlmcHV0cygiWyF1c21dIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JbGVuZ3RoID0gZWxlbS5hc25sZW47Ci0JbnAgPSAodV9jaGFyICopZWxlbS5kYXRhLnJhdzsKLQotCS8qIG1zZ0F1dGhvcml0YXRpdmVFbmdpbmVJRCAoT0NURVQgU1RSSU5HKSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKLQkJZnB1dHMoIlttc2dBdXRob3JpdGF0aXZlRW5naW5lSUQhPVNUUl0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggLT0gY291bnQ7Ci0JbnAgKz0gY291bnQ7Ci0KLQkvKiBtc2dBdXRob3JpdGF0aXZlRW5naW5lQm9vdHMgKElOVEVHRVIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgewotCQlmcHV0cygiW21zZ0F1dGhvcml0YXRpdmVFbmdpbmVCb290cyE9SU5UXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWlmICh2ZmxhZykKLQkgICAgICAgIHByaW50ZigiQj0lZCAiLCBlbGVtLmRhdGEuaW50ZWdlcik7Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JLyogbXNnQXV0aG9yaXRhdGl2ZUVuZ2luZVRpbWUgKElOVEVHRVIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgewotCQlmcHV0cygiW21zZ0F1dGhvcml0YXRpdmVFbmdpbmVUaW1lIT1JTlRdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHZmbGFnKQotCSAgICAgICAgcHJpbnRmKCJUPSVkICIsIGVsZW0uZGF0YS5pbnRlZ2VyKTsKLQlsZW5ndGggLT0gY291bnQ7Ci0JbnAgKz0gY291bnQ7Ci0KLQkvKiBtc2dVc2VyTmFtZSAoT0NURVQgU1RSSU5HKSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKLQkJZnB1dHMoIlttc2dVc2VyTmFtZSE9U1RSXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWxlbmd0aCAtPSBjb3VudDsKLSAgICAgICAgbnAgKz0gY291bnQ7Ci0KLQlwcmludGYoIlU9JS4qcyAiLCAoaW50KWVsZW0uYXNubGVuLCBlbGVtLmRhdGEuc3RyKTsKLQotCS8qIG1zZ0F1dGhlbnRpY2F0aW9uUGFyYW1ldGVycyAoT0NURVQgU1RSSU5HKSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TVFIpIHsKLQkJZnB1dHMoIlttc2dBdXRoZW50aWNhdGlvblBhcmFtZXRlcnMhPVNUUl0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggLT0gY291bnQ7Ci0gICAgICAgIG5wICs9IGNvdW50OwotCi0JLyogbXNnUHJpdmFjeVBhcmFtZXRlcnMgKE9DVEVUIFNUUklORykgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7Ci0JCWZwdXRzKCJbbXNnUHJpdmFjeVBhcmFtZXRlcnMhPVNUUl0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggLT0gY291bnQ7Ci0gICAgICAgIG5wICs9IGNvdW50OwotCi0JaWYgKCh1X2ludCljb3VudCA8IGxlbmd0aCkKLQkJcHJpbnRmKCJbJWQgZXh0cmEgYWZ0ZXIgdXNtIFNFUV0iLCBsZW5ndGggLSBjb3VudCk7Ci19Ci0KLS8qCi0gKiBEZWNvZGUgU05NUHYzIE1lc3NhZ2UgSGVhZGVyIChTTk1QdjMpCi0gKi8KLXN0YXRpYyB2b2lkCi12M21zZ19wcmludChjb25zdCB1X2NoYXIgKm5wLCB1X2ludCBsZW5ndGgpCi17Ci0Jc3RydWN0IGJlIGVsZW07Ci0JaW50IGNvdW50ID0gMDsKLQl1X2NoYXIgZmxhZ3M7Ci0JaW50IG1vZGVsOwotCWNvbnN0IHVfY2hhciAqeG5wID0gbnA7Ci0JaW50IHhsZW5ndGggPSBsZW5ndGg7Ci0KLQkvKiBTZXF1ZW5jZSAqLwotCWlmICgoY291bnQgPSBhc24xX3BhcnNlKG5wLCBsZW5ndGgsICZlbGVtKSkgPCAwKQotCQlyZXR1cm47Ci0JaWYgKGVsZW0udHlwZSAhPSBCRV9TRVEpIHsKLQkJZnB1dHMoIlshbWVzc2FnZV0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggPSBlbGVtLmFzbmxlbjsKLQlucCA9ICh1X2NoYXIgKillbGVtLmRhdGEucmF3OwotCi0JaWYgKHZmbGFnKSB7Ci0JCWZwdXRzKCJ7ICIsIHN0ZG91dCk7Ci0JfQotCi0JLyogbXNnSUQgKElOVEVHRVIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgewotCQlmcHV0cygiW21zZ0lEIT1JTlRdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JLyogbXNnTWF4U2l6ZSAoSU5URUdFUikgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfSU5UKSB7Ci0JCWZwdXRzKCJbbXNnTWF4U2l6ZSE9SU5UXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCS8qIG1zZ0ZsYWdzIChPQ1RFVCBTVFJJTkcpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX1NUUikgewotCQlmcHV0cygiW21zZ0ZsYWdzIT1TVFJdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGVsZW0uYXNubGVuICE9IDEpIHsKLQkgICAgICAgIHByaW50ZigiW21zZ0ZsYWdzIHNpemUgJWRdIiwgZWxlbS5hc25sZW4pOwotCQlyZXR1cm47Ci0JfQotCWZsYWdzID0gZWxlbS5kYXRhLnN0clswXTsKLQlpZiAoZmxhZ3MgIT0gMHgwMCAmJiBmbGFncyAhPSAweDAxICYmIGZsYWdzICE9IDB4MDMKLQkgICAgJiYgZmxhZ3MgIT0gMHgwNCAmJiBmbGFncyAhPSAweDA1ICYmIGZsYWdzICE9IDB4MDcpIHsKLQkJcHJpbnRmKCJbbXNnRmxhZ3M9MHglMDJYXSIsIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQlsZW5ndGggLT0gY291bnQ7Ci0JbnAgKz0gY291bnQ7Ci0KLQlmcHV0cygiRj0iLCBzdGRvdXQpOwotCWlmIChmbGFncyAmIDB4MDEpIGZwdXRzKCJhIiwgc3Rkb3V0KTsKLQlpZiAoZmxhZ3MgJiAweDAyKSBmcHV0cygicCIsIHN0ZG91dCk7Ci0JaWYgKGZsYWdzICYgMHgwNCkgZnB1dHMoInIiLCBzdGRvdXQpOwotCWZwdXRzKCIgIiwgc3Rkb3V0KTsKLQotCS8qIG1zZ1NlY3VyaXR5TW9kZWwgKElOVEVHRVIpICovCi0JaWYgKChjb3VudCA9IGFzbjFfcGFyc2UobnAsIGxlbmd0aCwgJmVsZW0pKSA8IDApCi0JCXJldHVybjsKLQlpZiAoZWxlbS50eXBlICE9IEJFX0lOVCkgewotCQlmcHV0cygiW21zZ1NlY3VyaXR5TW9kZWwhPUlOVF0iLCBzdGRvdXQpOwotCQlhc24xX3ByaW50KCZlbGVtKTsKLQkJcmV0dXJuOwotCX0KLQltb2RlbCA9IGVsZW0uZGF0YS5pbnRlZ2VyOwotCWxlbmd0aCAtPSBjb3VudDsKLQlucCArPSBjb3VudDsKLQotCWlmICgodV9pbnQpY291bnQgPCBsZW5ndGgpCi0JCXByaW50ZigiWyVkIGV4dHJhIGFmdGVyIG1lc3NhZ2UgU0VRXSIsIGxlbmd0aCAtIGNvdW50KTsKLQotCWlmICh2ZmxhZykgewotCQlmcHV0cygifSAiLCBzdGRvdXQpOwotCX0KLQotCWlmIChtb2RlbCA9PSAzKSB7Ci0JICAgIGlmICh2ZmxhZykgewotCQlmcHV0cygieyBVU00gIiwgc3Rkb3V0KTsKLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgIHByaW50ZigiW3NlY3VyaXR5IG1vZGVsICVkXSIsIG1vZGVsKTsKLSAgICAgICAgICAgIHJldHVybjsKLQl9Ci0KLQlucCA9IHhucCArIChucCAtIHhucCk7Ci0JbGVuZ3RoID0geGxlbmd0aCAtIChucCAtIHhucCk7Ci0KLQkvKiBtc2dTZWN1cml0eVBhcmFtZXRlcnMgKE9DVEVUIFNUUklORykgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfU1RSKSB7Ci0JCWZwdXRzKCJbbXNnU2VjdXJpdHlQYXJhbWV0ZXJzIT1TVFJdIiwgc3Rkb3V0KTsKLQkJYXNuMV9wcmludCgmZWxlbSk7Ci0JCXJldHVybjsKLQl9Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0JaWYgKG1vZGVsID09IDMpIHsKLQkgICAgdXNtX3ByaW50KGVsZW0uZGF0YS5zdHIsIGVsZW0uYXNubGVuKTsKLQkgICAgaWYgKHZmbGFnKSB7Ci0JCWZwdXRzKCJ9ICIsIHN0ZG91dCk7Ci0JICAgIH0KLQl9Ci0KLQlpZiAodmZsYWcpIHsKLQkgICAgZnB1dHMoInsgU2NvcGVkUERVICIsIHN0ZG91dCk7Ci0JfQotCi0Jc2NvcGVkcGR1X3ByaW50KG5wLCBsZW5ndGgsIDMpOwotCi0JaWYgKHZmbGFnKSB7Ci0JCWZwdXRzKCJ9ICIsIHN0ZG91dCk7Ci0JfQotfQotCi0vKgotICogRGVjb2RlIFNOTVAgaGVhZGVyIGFuZCBwYXNzIG9uIHRvIFBEVSBwcmludGluZyByb3V0aW5lcwotICovCi12b2lkCi1zbm1wX3ByaW50KGNvbnN0IHVfY2hhciAqbnAsIHVfaW50IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgYmUgZWxlbTsKLQlpbnQgY291bnQgPSAwOwotCWludCB2ZXJzaW9uID0gMDsKLQotCXB1dGNoYXIoJyAnKTsKLQotCS8qIGluaXRpYWwgU2VxdWVuY2UgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfU0VRKSB7Ci0JCWZwdXRzKCJbIWluaXQgU0VRXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCWlmICgodV9pbnQpY291bnQgPCBsZW5ndGgpCi0JCXByaW50ZigiWyVkIGV4dHJhIGFmdGVyIGlTRVFdIiwgbGVuZ3RoIC0gY291bnQpOwotCS8qIGRlc2NlbmQgKi8KLQlsZW5ndGggPSBlbGVtLmFzbmxlbjsKLQlucCA9ICh1X2NoYXIgKillbGVtLmRhdGEucmF3OwotCi0JLyogVmVyc2lvbiAoSU5URUdFUikgKi8KLQlpZiAoKGNvdW50ID0gYXNuMV9wYXJzZShucCwgbGVuZ3RoLCAmZWxlbSkpIDwgMCkKLQkJcmV0dXJuOwotCWlmIChlbGVtLnR5cGUgIT0gQkVfSU5UKSB7Ci0JCWZwdXRzKCJbdmVyc2lvbiE9SU5UXSIsIHN0ZG91dCk7Ci0JCWFzbjFfcHJpbnQoJmVsZW0pOwotCQlyZXR1cm47Ci0JfQotCi0Jc3dpdGNoIChlbGVtLmRhdGEuaW50ZWdlcikgewotCWNhc2UgU05NUF9WRVJTSU9OXzE6Ci0JY2FzZSBTTk1QX1ZFUlNJT05fMjoKLQljYXNlIFNOTVBfVkVSU0lPTl8zOgotCSAgICAgICAgaWYgKHZmbGFnKQotCQkgICAgICAgIHByaW50ZigieyAlcyAiLCBTbm1wVmVyc2lvbltlbGVtLmRhdGEuaW50ZWdlcl0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCSAgICAgICAgcHJpbnRmKCJbdmVyc2lvbiA9ICVkXSIsIGVsZW0uZGF0YS5pbnRlZ2VyKTsKLQkJcmV0dXJuOwotCX0KLQl2ZXJzaW9uID0gZWxlbS5kYXRhLmludGVnZXI7Ci0JbGVuZ3RoIC09IGNvdW50OwotCW5wICs9IGNvdW50OwotCi0Jc3dpdGNoICh2ZXJzaW9uKSB7Ci0JY2FzZSBTTk1QX1ZFUlNJT05fMToKLSAgICAgICAgY2FzZSBTTk1QX1ZFUlNJT05fMjoKLQkJY29tbXVuaXR5X3ByaW50KG5wLCBsZW5ndGgsIHZlcnNpb24pOwotCQlicmVhazsKLQljYXNlIFNOTVBfVkVSU0lPTl8zOgotCQl2M21zZ19wcmludChucCwgbGVuZ3RoKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkgICAgICAgIHByaW50ZigiW3ZlcnNpb24gPSAlZF0iLCBlbGVtLmRhdGEuaW50ZWdlcik7Ci0JCWJyZWFrOwotCX0KLQotCWlmICh2ZmxhZykgewotCQlmcHV0cygifSAiLCBzdGRvdXQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3ByaW50LXN0cC5jIGIvcHJpbnQtc3RwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDhhZTAuLjAwMDAwMDAKLS0tIGEvcHJpbnQtc3RwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBMZW5uZXJ0IEJ1eXRlbmhlawotICoKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGFjY29tcGFuaWVzIHRjcGR1bXAgb3IgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZQotICoKLSAqIEZvcm1hdCBhbmQgcHJpbnQgSUVFRSA4MDIuMWQgc3Bhbm5pbmcgdHJlZSBwcm90b2NvbCBwYWNrZXRzLgotICogQ29udHJpYnV0ZWQgYnkgTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAZ251Lm9yZz4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXN0cC5jLHYgMS4xMy4yLjcgMjAwNy8wMy8xOCAxNzoxMjozNiBoYW5uZXMgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotI2RlZmluZQlSU1RQX0VYVFJBQ1RfUE9SVF9ST0xFKHgpICgoKHgpJjB4MEMpPj4yKSAKLS8qIFNUUCB0aW1lcnMgYXJlIGV4cHJlc3NlZCBpbiBtdWx0aXBsZXMgb2YgMS8yNTZ0aCBzZWNvbmQgKi8KLSNkZWZpbmUgU1RQX1RJTUVfQkFTRSAyNTYKLSNkZWZpbmUgU1RQX0JQRFVfTVNUUF9NSU5fTEVOIDEwMgotCi1zdHJ1Y3Qgc3RwX2JwZHVfIHsKLSAgICB1X2ludDhfdCBwcm90b2NvbF9pZFsyXTsKLSAgICB1X2ludDhfdCBwcm90b2NvbF92ZXJzaW9uOwotICAgIHVfaW50OF90IGJwZHVfdHlwZTsKLSAgICB1X2ludDhfdCBmbGFnczsKLSAgICB1X2ludDhfdCByb290X2lkWzhdOwotICAgIHVfaW50OF90IHJvb3RfcGF0aF9jb3N0WzRdOwotICAgIHVfaW50OF90IGJyaWRnZV9pZFs4XTsKLSAgICB1X2ludDhfdCBwb3J0X2lkWzJdOwotICAgIHVfaW50OF90IG1lc3NhZ2VfYWdlWzJdOwotICAgIHVfaW50OF90IG1heF9hZ2VbMl07Ci0gICAgdV9pbnQ4X3QgaGVsbG9fdGltZVsyXTsKLSAgICB1X2ludDhfdCBmb3J3YXJkX2RlbGF5WzJdOwotICAgIHVfaW50OF90IHYxX2xlbmd0aDsKLX07Ci0KLSNkZWZpbmUgU1RQX1BST1RPX1JFR1VMQVIgMHgwMAotI2RlZmluZSBTVFBfUFJPVE9fUkFQSUQgICAweDAyCi0jZGVmaW5lIFNUUF9QUk9UT19NU1RQICAgIDB4MDMKLQotc3RydWN0IHRvayBzdHBfcHJvdG9fdmFsdWVzW10gPSB7Ci0gICAgeyBTVFBfUFJPVE9fUkVHVUxBUiwgIjgwMi4xZCIgfSwKLSAgICB7IFNUUF9QUk9UT19SQVBJRCwgIjgwMi4xdyIgfSwKLSAgICB7IFNUUF9QUk9UT19NU1RQLCAiODAyLjFzIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLSNkZWZpbmUgU1RQX0JQRFVfVFlQRV9DT05GSUcgICAgICAweDAwCi0jZGVmaW5lIFNUUF9CUERVX1RZUEVfUlNUUCAgICAgICAgMHgwMgotI2RlZmluZSBTVFBfQlBEVV9UWVBFX1RPUE9fQ0hBTkdFIDB4ODAKLQotc3RydWN0IHRvayBzdHBfYnBkdV9mbGFnX3ZhbHVlc1tdID0gewotICAgIHsgMHgwMSwgIlRvcG9sb2d5IGNoYW5nZSIgfSwKLSAgICB7IDB4MDIsICJQcm9wb3NhbCIgfSwKLSAgICB7IDB4MTAsICJMZWFybiIgfSwKLSAgICB7IDB4MjAsICJGb3J3YXJkIiB9LAotICAgIHsgMHg0MCwgIkFncmVlbWVudCIgfSwKLSAgICB7IDB4ODAsICJUb3BvbG9neSBjaGFuZ2UgQUNLIiB9LAotICAgIHsgMCwgTlVMTH0KLX07Ci0KLXN0cnVjdCB0b2sgc3RwX2JwZHVfdHlwZV92YWx1ZXNbXSA9IHsKLSAgICB7IFNUUF9CUERVX1RZUEVfQ09ORklHLCAiQ29uZmlnIiB9LAotICAgIHsgU1RQX0JQRFVfVFlQRV9SU1RQLCAiUmFwaWQgU1RQIiB9LAotICAgIHsgU1RQX0JQRFVfVFlQRV9UT1BPX0NIQU5HRSwgIlRvcG9sb2d5IENoYW5nZSIgfSwKLSAgICB7IDAsIE5VTEx9Ci19OwotCi1zdHJ1Y3QgdG9rIHJzdHBfb2JqX3BvcnRfcm9sZV92YWx1ZXNbXSA9IHsKLSAgICB7IDB4MDAsICJVbmtub3duIiB9LAotICAgIHsgMHgwMSwgIkFsdGVybmF0ZSIgfSwKLSAgICB7IDB4MDIsICJSb290IiB9LAotICAgIHsgMHgwMywgIkRlc2lnbmF0ZWQiIH0sCi0gICAgeyAwLCBOVUxMfQotfTsKLQotc3RhdGljIGNoYXIgKgotc3RwX3ByaW50X2JyaWRnZV9pZChjb25zdCB1X2NoYXIgKnApCi17Ci0gICAgc3RhdGljIGNoYXIgYnJpZGdlX2lkX3N0cltzaXplb2YoInBwcHAuYWE6YmI6Y2M6ZGQ6ZWU6ZmYiKV07Ci0KLSAgICBzbnByaW50ZihicmlkZ2VfaWRfc3RyLCBzaXplb2YoYnJpZGdlX2lkX3N0ciksCi0gICAgICAgICAgICAgIiUuMnglLjJ4LiUuMng6JS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4IiwKLSAgICAgICAgICAgICBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdLCBwWzddKTsKLQotICAgIHJldHVybiBicmlkZ2VfaWRfc3RyOwotfQotCi1zdGF0aWMgdm9pZAotc3RwX3ByaW50X2NvbmZpZ19icGR1KGNvbnN0IHN0cnVjdCBzdHBfYnBkdV8gKnN0cF9icGR1LCB1X2ludCBsZW5ndGgpCi17Ci0gICAgcHJpbnRmKCIsIEZsYWdzIFslc10iLAotICAgICAgICAgICBiaXR0b2syc3RyKHN0cF9icGR1X2ZsYWdfdmFsdWVzLCAibm9uZSIsIHN0cF9icGR1LT5mbGFncykpOwotCi0gICAgcHJpbnRmKCIsIGJyaWRnZS1pZCAlcy4lMDR4LCBsZW5ndGggJXUiLAotICAgICAgICAgICBzdHBfcHJpbnRfYnJpZGdlX2lkKChjb25zdCB1X2NoYXIgKikmc3RwX2JwZHUtPmJyaWRnZV9pZCksCi0gICAgICAgICAgIEVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+cG9ydF9pZCksIGxlbmd0aCk7Ci0KLSAgICAvKiBpbiBub24tdmVyYm9zZSBtb2RlIGp1c3QgcHJpbnQgdGhlIGJyaWRnZS1pZCAqLwotICAgIGlmICghdmZsYWcpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaW50ZigiXG5cdG1lc3NhZ2UtYWdlICUuMmZzLCBtYXgtYWdlICUuMmZzIgotICAgICAgICAgICAiLCBoZWxsby10aW1lICUuMmZzLCBmb3J3YXJkaW5nLWRlbGF5ICUuMmZzIiwKLSAgICAgICAgICAgKGZsb2F0KUVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+bWVzc2FnZV9hZ2UpIC8gU1RQX1RJTUVfQkFTRSwKLSAgICAgICAgICAgKGZsb2F0KUVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+bWF4X2FnZSkgLyBTVFBfVElNRV9CQVNFLAotICAgICAgICAgICAoZmxvYXQpRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5oZWxsb190aW1lKSAvIFNUUF9USU1FX0JBU0UsCi0gICAgICAgICAgIChmbG9hdClFWFRSQUNUXzE2QklUUygmc3RwX2JwZHUtPmZvcndhcmRfZGVsYXkpIC8gU1RQX1RJTUVfQkFTRSk7Ci0KLSAgICBwcmludGYoIlxuXHRyb290LWlkICVzLCByb290LXBhdGhjb3N0ICV1IiwKLSAgICAgICAgICAgc3RwX3ByaW50X2JyaWRnZV9pZCgoY29uc3QgdV9jaGFyICopJnN0cF9icGR1LT5yb290X2lkKSwKLSAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMoJnN0cF9icGR1LT5yb290X3BhdGhfY29zdCkpOwotCi0gICAgLyogUG9ydCByb2xlIGlzIG9ubHkgdmFsaWQgZm9yIDgwMi4xdyAqLwotICAgIGlmIChzdHBfYnBkdS0+cHJvdG9jb2xfdmVyc2lvbiA9PSBTVFBfUFJPVE9fUkFQSUQpIHsKLSAgICAgICAgcHJpbnRmKCIsIHBvcnQtcm9sZSAlcyIsCi0gICAgICAgICAgICAgICB0b2syc3RyKHJzdHBfb2JqX3BvcnRfcm9sZV92YWx1ZXMsICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgUlNUUF9FWFRSQUNUX1BPUlRfUk9MRShzdHBfYnBkdS0+ZmxhZ3MpKSk7Ci0gICAgfQotfQotCi0vKgotICogTVNUUCBwYWNrZXQgZm9ybWF0Ci0gKiBSZWYuIElFRUUgODAyLjFRIDIwMDMgRWQuIFNlY3Rpb24gMTQKLSAqCi0gKiBNU1RQIEJQRFUKLSAqCi0gKiAyIC0gIGJ5dGVzIFByb3RvY29sIElkCi0gKiAxIC0gIGJ5dGUgIFByb3RvY29sIFZlci4gCi0gKiAxIC0gIGJ5dGUgIEJQRFUgdHllCi0gKiAxIC0gIGJ5dGUgIEZsYWdzCi0gKiA4IC0gIGJ5dGVzIENJU1QgUm9vdCBJZGVudGlmaWVyCi0gKiA0IC0gIGJ5dGVzIENJU1QgRXh0ZXJuYWwgUGF0aCBDb3N0Ci0gKiA4IC0gIGJ5dGVzIENJU1QgUmVnaW9uYWwgUm9vdCBJZGVudGlmaWVyCi0gKiAyIC0gIGJ5dGVzIENJU1QgUG9ydCBJZGVudGlmaWVyCi0gKiAyIC0gIGJ5dGVzIE1lc3NhZ2UgQWdlCi0gKiAyIC0gIGJ5dGVzIE1heCBhZ2UKLSAqIDIgLSAgYnl0ZXMgSGVsbG8gVGltZQotICogMiAtICBieXRlcyBGb3J3YXJkIGRlbGF5Ci0gKiAxIC0gIGJ5dGUgIFZlcnNpb24gMSBsZW5ndGguIE11c3QgYmUgMAotICogMiAtICBieXRlcyBWZXJzaW9uIDMgbGVuZ3RoCi0gKiAxIC0gIGJ5dGUgIENvbmZpZyBJZGVudGlmaWVyCi0gKiAzMiAtIGJ5dGVzIENvbmZpZyBOYW1lCi0gKiAyIC0gIGJ5dGVzIFJldmlzaW9uIGxldmVsCi0gKiAxNiAtIGJ5dGVzIENvbmZpZyBEaWdlc3QgW01ENV0KLSAqIDQgLSAgYnl0ZXMgQ0lTVCBJbnRlcm5hbCBSb290IFBhdGggQ29zdAotICogOCAtICBieXRlcyBDSVNUIEJyaWRnZSBJZGVudGlmaWVyCi0gKiAxIC0gIGJ5dGUgIENJU1QgUmVtYWluaW5nIEhvcHMKLSAqIDE2IC0gYnl0ZXMgTVNUSSBpbmZvcm1hdGlvbiBbTWF4IDY0IE1TVEksIGVhY2ggMTYgYnl0ZXNdCi0gKgotICogTVNUSSBQYXlsb2FkCi0gKgotICogMSAtIGJ5dGUgIE1TVEkgZmxhZwotICogOCAtIGJ5dGVzIE1TVEkgUmVnaW9uYWwgUm9vdCBJZGVudGlmaWVyCi0gKiA0IC0gYnl0ZXMgTVNUSSBSZWdpb25hbCBQYXRoIENvc3QKLSAqIDEgLSBieXRlICBNU1RJIEJyaWRnZSBQcmlvcml0eQotICogMSAtIGJ5dGUgIE1TVEkgUG9ydCBQcmlvcml0eQotICogMSAtIGJ5dGUgIE1TVEkgUmVtYWluaW5nIEhvcHMKLSAqLwotCi0jZGVmaW5lIE1TVF9CUERVX01TVElfTEVOR1RICQkgICAgMTYKLSNkZWZpbmUgTVNUX0JQRFVfQ09ORklHX0lORk9fTEVOR1RICSAgICA2NAotCi0vKiBPZmZzZXRzIG9mIGZpZWxkcyBmcm9tIHRoZSBiZWdnaW5uaW5nIGZvciB0aGUgcGFja2V0ICovCi0jZGVmaW5lIE1TVF9CUERVX1ZFUjNfTEVOX09GRlNFVAkgICAgMzYKLSNkZWZpbmUgTVNUX0JQRFVfQ09ORklHX05BTUVfT0ZGU0VUCSAgICAzOQotI2RlZmluZSBNU1RfQlBEVV9DT05GSUdfRElHRVNUX09GRlNFVAkgICAgNzMKLSNkZWZpbmUgTVNUX0JQRFVfQ0lTVF9JTlRfUEFUSF9DT1NUX09GRlNFVCAgODkKLSNkZWZpbmUgTVNUX0JQRFVfQ0lTVF9CUklER0VfSURfT0ZGU0VUCSAgICA5MwotI2RlZmluZSBNU1RfQlBEVV9DSVNUX1JFTUFJTl9IT1BTX09GRlNFVCAgICAxMDEKLSNkZWZpbmUgTVNUX0JQRFVfTVNUSV9PRkZTRVQJCSAgICAxMDIKLS8qIE9mZnNldHMgd2l0aGluICBhbiBNU1RJICovCi0jZGVmaW5lIE1TVF9CUERVX01TVElfUk9PVF9QUklPX09GRlNFVAkgICAgMQotI2RlZmluZSBNU1RfQlBEVV9NU1RJX1JPT1RfUEFUSF9DT1NUX09GRlNFVCA5Ci0jZGVmaW5lIE1TVF9CUERVX01TVElfQlJJREdFX1BSSU9fT0ZGU0VUICAgIDEzCi0jZGVmaW5lIE1TVF9CUERVX01TVElfUE9SVF9QUklPX09GRlNFVAkgICAgMTQKLSNkZWZpbmUgTVNUX0JQRFVfTVNUSV9SRU1BSU5fSE9QU19PRkZTRVQgICAgMTUKLQotc3RhdGljIHZvaWQKLXN0cF9wcmludF9tc3RwX2JwZHUoY29uc3Qgc3RydWN0IHN0cF9icGR1XyAqc3RwX2JwZHUsIHVfaW50IGxlbmd0aCkKLXsKLSAgICBjb25zdCB1X2NoYXIgICAgKnB0cjsKLSAgICB1X2ludDE2X3QJICAgIHYzbGVuOwotICAgIHVfaW50MTZfdAkgICAgbGVuOwotICAgIHVfaW50MTZfdAkgICAgbXN0aTsKLSAgICB1X2ludDE2X3QJICAgIG9mZnNldDsKLQotICAgIHB0ciA9IChjb25zdCB1X2NoYXIgKilzdHBfYnBkdTsKLSAgICBwcmludGYoIiwgQ0lTVCBGbGFncyBbJXNdIiwKLSAgICAgICAgICAgYml0dG9rMnN0cihzdHBfYnBkdV9mbGFnX3ZhbHVlcywgIm5vbmUiLCBzdHBfYnBkdS0+ZmxhZ3MpKTsKLQotICAgIC8qCi0gICAgICogaW4gbm9uLXZlcmJvc2UgbW9kZSBqdXN0IHByaW50IHRoZSBmbGFncy4gV2UgZG9udCByZWFkIHRoYXQgbXVjaAotICAgICAqIG9mIHRoZSBwYWNrZXQgKERFRkFVTFRfU05BUExFTikgdG8gcHJpbnQgb3V0IGNpc3QgYnJpZGdlLWlkCi0gICAgICovCi0gICAgaWYgKCF2ZmxhZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpbnRmKCIsIENJU1QgYnJpZGdlLWlkICVzLiUwNHgsIGxlbmd0aCAldSIsCi0gICAgICAgICAgIHN0cF9wcmludF9icmlkZ2VfaWQocHRyICsgTVNUX0JQRFVfQ0lTVF9CUklER0VfSURfT0ZGU0VUKSwKLSAgICAgICAgICAgRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5wb3J0X2lkKSwgbGVuZ3RoKTsKLQotCi0gICAgcHJpbnRmKCJcblx0bWVzc2FnZS1hZ2UgJS4yZnMsIG1heC1hZ2UgJS4yZnMiCi0gICAgICAgICAgICIsIGhlbGxvLXRpbWUgJS4yZnMsIGZvcndhcmRpbmctZGVsYXkgJS4yZnMiLAotICAgICAgICAgICAoZmxvYXQpRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5tZXNzYWdlX2FnZSkgLyBTVFBfVElNRV9CQVNFLAotICAgICAgICAgICAoZmxvYXQpRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5tYXhfYWdlKSAvIFNUUF9USU1FX0JBU0UsCi0gICAgICAgICAgIChmbG9hdClFWFRSQUNUXzE2QklUUygmc3RwX2JwZHUtPmhlbGxvX3RpbWUpIC8gU1RQX1RJTUVfQkFTRSwKLSAgICAgICAgICAgKGZsb2F0KUVYVFJBQ1RfMTZCSVRTKCZzdHBfYnBkdS0+Zm9yd2FyZF9kZWxheSkgLyBTVFBfVElNRV9CQVNFKTsKLQotICAgIHByaW50ZigiXG5cdENJU1Qgcm9vdC1pZCAlcywgZXh0LXBhdGhjb3N0ICV1IGludC1wYXRoY29zdCAldSIsCi0gICAgICAgICAgIHN0cF9wcmludF9icmlkZ2VfaWQoKGNvbnN0IHVfY2hhciAqKSZzdHBfYnBkdS0+cm9vdF9pZCksCi0gICAgICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZzdHBfYnBkdS0+cm9vdF9wYXRoX2Nvc3QpLAotICAgICAgICAgICBFWFRSQUNUXzMyQklUUyhwdHIgKyBNU1RfQlBEVV9DSVNUX0lOVF9QQVRIX0NPU1RfT0ZGU0VUKSk7Ci0KLSAgICBwcmludGYoIiwgcG9ydC1yb2xlICVzIiwKLSAgICAgICAgICAgdG9rMnN0cihyc3RwX29ial9wb3J0X3JvbGVfdmFsdWVzLCAiVW5rbm93biIsCi0gICAgICAgICAgICAgICAgICAgUlNUUF9FWFRSQUNUX1BPUlRfUk9MRShzdHBfYnBkdS0+ZmxhZ3MpKSk7Ci0KLSAgICBwcmludGYoIlxuXHRDSVNUIHJlZ2lvbmFsLXJvb3QtaWQgJXMiLAotICAgICAgICAgICBzdHBfcHJpbnRfYnJpZGdlX2lkKChjb25zdCB1X2NoYXIgKikmc3RwX2JwZHUtPmJyaWRnZV9pZCkpOwotCi0gICAgcHJpbnRmKCJcblx0TVNUUCBDb25maWd1cmF0aW9uIE5hbWUgJXMsIHJldmlzaW9uICV1LCBkaWdlc3QgJTA4eCUwOHglMDh4JTA4eCIsCi0gICAgICAgICAgIHB0ciArIE1TVF9CUERVX0NPTkZJR19OQU1FX09GRlNFVCwKLQkgICBFWFRSQUNUXzE2QklUUyhwdHIgKyBNU1RfQlBEVV9DT05GSUdfTkFNRV9PRkZTRVQgKyAzMiksCi0JICAgRVhUUkFDVF8zMkJJVFMocHRyICsgTVNUX0JQRFVfQ09ORklHX0RJR0VTVF9PRkZTRVQpLAotCSAgIEVYVFJBQ1RfMzJCSVRTKHB0ciArIE1TVF9CUERVX0NPTkZJR19ESUdFU1RfT0ZGU0VUICsgNCksCi0JICAgRVhUUkFDVF8zMkJJVFMocHRyICsgTVNUX0JQRFVfQ09ORklHX0RJR0VTVF9PRkZTRVQgKyA4KSwKLQkgICBFWFRSQUNUXzMyQklUUyhwdHIgKyBNU1RfQlBEVV9DT05GSUdfRElHRVNUX09GRlNFVCArIDEyKSk7Ci0KLSAgICBwcmludGYoIlxuXHRDSVNUIHJlbWFpbmluZy1ob3BzICVkIiwgcHRyW01TVF9CUERVX0NJU1RfUkVNQUlOX0hPUFNfT0ZGU0VUXSk7Ci0KLSAgICAvKiBEdW1wIGFsbCBNU1RJJ3MgKi8KLSAgICB2M2xlbiA9IEVYVFJBQ1RfMTZCSVRTKHB0ciArIE1TVF9CUERVX1ZFUjNfTEVOX09GRlNFVCk7Ci0gICAgaWYgKHYzbGVuID4gTVNUX0JQRFVfQ09ORklHX0lORk9fTEVOR1RIKSB7Ci0gICAgICAgIGxlbiA9IHYzbGVuIC0gTVNUX0JQRFVfQ09ORklHX0lORk9fTEVOR1RIOwotICAgICAgICBvZmZzZXQgPSBNU1RfQlBEVV9NU1RJX09GRlNFVDsKLSAgICAgICAgd2hpbGUgKGxlbiA+PSBNU1RfQlBEVV9NU1RJX0xFTkdUSCkgewotICAgICAgICAgICAgbXN0aSA9IEVYVFJBQ1RfMTZCSVRTKHB0ciArIG9mZnNldCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNUX0JQRFVfTVNUSV9ST09UX1BSSU9fT0ZGU0VUKTsKLSAgICAgICAgICAgIG1zdGkgPSBtc3RpICYgMHgwRkZGOwotCi0gICAgICAgICAgICBwcmludGYoIlxuXHRNU1RJICVkLCBGbGFncyBbJXNdLCBwb3J0LXJvbGUgJXMiLCAKLSAgICAgICAgICAgICAgICAgICBtc3RpLCBiaXR0b2syc3RyKHN0cF9icGR1X2ZsYWdfdmFsdWVzLCAibm9uZSIsIHB0cltvZmZzZXRdKSwKLSAgICAgICAgICAgICAgICAgICB0b2syc3RyKHJzdHBfb2JqX3BvcnRfcm9sZV92YWx1ZXMsICJVbmtub3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJTVFBfRVhUUkFDVF9QT1JUX1JPTEUocHRyW29mZnNldF0pKSk7Ci0gICAgICAgICAgICBwcmludGYoIlxuXHRcdE1TVEkgcmVnaW9uYWwtcm9vdC1pZCAlcywgcGF0aGNvc3QgJXUiLAotICAgICAgICAgICAgICAgICAgIHN0cF9wcmludF9icmlkZ2VfaWQocHRyICsgb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TVF9CUERVX01TVElfUk9PVF9QUklPX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgRVhUUkFDVF8zMkJJVFMocHRyICsgb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1RfQlBEVV9NU1RJX1JPT1RfUEFUSF9DT1NUX09GRlNFVCkpOwotICAgICAgICAgICAgcHJpbnRmKCJcblx0XHRNU1RJIGJyaWRnZS1wcmlvICVkLCBwb3J0LXByaW8gJWQsIGhvcHMgJWQiLAotICAgICAgICAgICAgICAgICAgIHB0cltvZmZzZXQgKyBNU1RfQlBEVV9NU1RJX0JSSURHRV9QUklPX09GRlNFVF0gPj4gNCwKLSAgICAgICAgICAgICAgICAgICBwdHJbb2Zmc2V0ICsgTVNUX0JQRFVfTVNUSV9QT1JUX1BSSU9fT0ZGU0VUXSA+PiA0LAotICAgICAgICAgICAgICAgICAgIHB0cltvZmZzZXQgKyBNU1RfQlBEVV9NU1RJX1JFTUFJTl9IT1BTX09GRlNFVF0pOwotCi0gICAgICAgICAgICBsZW4gLT0gTVNUX0JQRFVfTVNUSV9MRU5HVEg7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gTVNUX0JQRFVfTVNUSV9MRU5HVEg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qCi0gKiBQcmludCA4MDIuMWQgLyA4MDIuMXcgLyA4MDIuMXEgKG1zdHApIHBhY2tldHMuCi0gKi8KLXZvaWQKLXN0cF9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCkKLXsKLSAgICBjb25zdCBzdHJ1Y3Qgc3RwX2JwZHVfICpzdHBfYnBkdTsKLSAgICB1X2ludDE2X3QgICAgICAgICAgICAgIG1zdHBfbGVuOwotICAgIAotICAgIHN0cF9icGR1ID0gKHN0cnVjdCBzdHBfYnBkdV8qKXA7Ci0KLSAgICAvKiBNaW5pbXVtIFNUUCBGcmFtZSBzaXplLiAqLwotICAgIGlmIChsZW5ndGggPCA0KQotICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAKLSAgICBpZiAoRVhUUkFDVF8xNkJJVFMoJnN0cF9icGR1LT5wcm90b2NvbF9pZCkpIHsKLSAgICAgICAgcHJpbnRmKCJ1bmtub3duIFNUUCB2ZXJzaW9uLCBsZW5ndGggJXUiLCBsZW5ndGgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpbnRmKCJTVFAgJXMiLCB0b2syc3RyKHN0cF9wcm90b192YWx1ZXMsICJVbmtub3duIFNUUCBwcm90b2NvbCAoMHglMDJ4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RwX2JwZHUtPnByb3RvY29sX3ZlcnNpb24pKTsKLQotICAgIHN3aXRjaCAoc3RwX2JwZHUtPnByb3RvY29sX3ZlcnNpb24pIHsKLSAgICBjYXNlIFNUUF9QUk9UT19SRUdVTEFSOgotICAgIGNhc2UgU1RQX1BST1RPX1JBUElEOgotICAgIGNhc2UgU1RQX1BST1RPX01TVFA6Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwcmludGYoIiwgJXMiLCB0b2syc3RyKHN0cF9icGR1X3R5cGVfdmFsdWVzLCAiVW5rbm93biBCUERVIFR5cGUgKDB4JTAyeCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RwX2JwZHUtPmJwZHVfdHlwZSkpOwotCi0gICAgc3dpdGNoIChzdHBfYnBkdS0+YnBkdV90eXBlKSB7Ci0gICAgY2FzZSBTVFBfQlBEVV9UWVBFX0NPTkZJRzoKLSAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3Qgc3RwX2JwZHVfKSAtIDEpIHsKLSAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgIH0KLSAgICAgICAgc3RwX3ByaW50X2NvbmZpZ19icGR1KHN0cF9icGR1LCBsZW5ndGgpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RQX0JQRFVfVFlQRV9SU1RQOgotICAgICAgICBpZiAoc3RwX2JwZHUtPnByb3RvY29sX3ZlcnNpb24gPT0gU1RQX1BST1RPX1JBUElEKSB7Ci0gICAgICAgICAgICBpZiAobGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzdHBfYnBkdV8pKSB7Ci0gICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cF9wcmludF9jb25maWdfYnBkdShzdHBfYnBkdSwgbGVuZ3RoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHBfYnBkdS0+cHJvdG9jb2xfdmVyc2lvbiA9PSBTVFBfUFJPVE9fTVNUUCkgewotICAgICAgICAgICAgaWYgKGxlbmd0aCA8IFNUUF9CUERVX01TVFBfTUlOX0xFTikgewotICAgICAgICAgICAgICAgIGdvdG8gdHJ1bmM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RwX2JwZHUtPnYxX2xlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogRklYIE1FOiBFbWl0IGEgbWVzc2FnZSBoZXJlID8gKi8KLSAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogVmFsaWRhdGUgdjMgbGVuZ3RoICovCi0gICAgICAgICAgICBtc3RwX2xlbiA9IEVYVFJBQ1RfMTZCSVRTKHAgKyBNU1RfQlBEVV9WRVIzX0xFTl9PRkZTRVQpOwotICAgICAgICAgICAgbXN0cF9sZW4gKz0gMjsgIC8qIGxlbmd0aCBlbmNvZGluZyBpdHNlbGYgaXMgMiBieXRlcyAqLwotICAgICAgICAgICAgaWYgKGxlbmd0aCA8IChzaXplb2Yoc3RydWN0IHN0cF9icGR1XykgKyBtc3RwX2xlbikpIHsKLSAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RwX3ByaW50X21zdHBfYnBkdShzdHBfYnBkdSwgbGVuZ3RoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgU1RQX0JQRFVfVFlQRV9UT1BPX0NIQU5HRToKLSAgICAgICAgLyogYWx3YXlzIGVtcHR5IG1lc3NhZ2UgLSBqdXN0IGJyZWFrIG91dCAqLwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybjsKLSB0cnVuYzoKLSAgICBwcmludGYoIlt8c3RwICVkXSIsIGxlbmd0aCk7Ci19Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjLXN0eWxlOiB3aGl0ZXNtaXRoCi0gKiBjLWJhc2ljLW9mZnNldDogNAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9wcmludC1zdW5hdG0uYyBiL3ByaW50LXN1bmF0bS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2QzOGJmLi4wMDAwMDAwCi0tLSBhL3ByaW50LXN1bmF0bS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcgWWVuIFllbiBMaW0gYW5kIE5vcnRoIERha290YSBTdGF0ZSBVbml2ZXJzaXR5Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgWWVuIFllbiBMaW0gYW5kCi0JTm9ydGggRGFrb3RhIFN0YXRlIFVuaXZlcnNpdHkKLSAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCi0gKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgotICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCi0gKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KLSAqIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXN1bmF0bS5jLHYgMS44IDIwMDQvMDMvMTcgMjM6MjQ6MzggZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotIAotc3RydWN0IG1idWY7Ci1zdHJ1Y3QgcnRlbnRyeTsKLSAKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHBjYXAuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLSNpbmNsdWRlICJhdG0uaCIKLSNpbmNsdWRlICJhdG11bmkzMS5oIgotCi0vKiBTdW5BVE0gaGVhZGVyIGZvciBBVE0gcGFja2V0ICovCi0jZGVmaW5lIERJUl9QT1MJCTAJLyogRGlyZWN0aW9uICgweDgwID0gdHJhbnNtaXQsIDB4MDAgPSByZWNlaXZlKSAqLwotI2RlZmluZSBWUElfUE9TCQkxCS8qIFZQSSAqLwotI2RlZmluZSBWQ0lfUE9TCQkyCS8qIFZDSSAqLwotI2RlZmluZSBQS1RfQkVHSU5fUE9TICAgNAkvKiBTdGFydCBvZiB0aGUgQVRNIHBhY2tldCAqLwotCi0vKiBQcm90b2NvbCB0eXBlIHZhbHVlcyBpbiB0aGUgYm90dG9tIGZvciBiaXRzIG9mIHRoZSBieXRlIGF0IFNVTkFUTV9ESVJfUE9TLiAqLwotI2RlZmluZSBQVF9MQU5FCQkweDAxCS8qIExBTkUgKi8KLSNkZWZpbmUgUFRfTExDCQkweDAyCS8qIExMQyBlbmNhcHN1bGF0aW9uICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKLSAqIHRvIHRoZSBTdW5BVE0gcHNldWRvLWhlYWRlciBmb3IgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotc3VuYXRtX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQotewotCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQl1X2ludCBsZW5ndGggPSBoLT5sZW47Ci0JdV9zaG9ydCB2Y2k7Ci0JdV9jaGFyIHZwaTsKLQl1X2ludCB0cmFmdHlwZTsKLQotCWlmIChjYXBsZW4gPCBQS1RfQkVHSU5fUE9TKSB7Ci0JCXByaW50ZigiW3xhdG1dIik7Ci0JCXJldHVybiAoY2FwbGVuKTsKLQl9Ci0KLQlpZiAoZWZsYWcpIHsKLQkJaWYgKHBbRElSX1BPU10gJiAweDgwKQotCQkJcHJpbnRmKCJUeDogIik7Ci0JCWVsc2UKLQkJCXByaW50ZigiUng6ICIpOwotCX0KLQotCXN3aXRjaCAocFtESVJfUE9TXSAmIDB4MGYpIHsKLQotCWNhc2UgUFRfTEFORToKLQkJdHJhZnR5cGUgPSBBVE1fTEFORTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUX0xMQzoKLQkJdHJhZnR5cGUgPSBBVE1fTExDOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXRyYWZ0eXBlID0gQVRNX1VOS05PV047Ci0JCWJyZWFrOwotCX0KLQotCXZjaSA9IEVYVFJBQ1RfMTZCSVRTKCZwW1ZDSV9QT1NdKTsKLQl2cGkgPSBwW1ZQSV9QT1NdOwotCi0JcCArPSBQS1RfQkVHSU5fUE9TOwotCWNhcGxlbiAtPSBQS1RfQkVHSU5fUE9TOwotCWxlbmd0aCAtPSBQS1RfQkVHSU5fUE9TOwotCWF0bV9wcmludCh2cGksIHZjaSwgdHJhZnR5cGUsIHAsIGxlbmd0aCwgY2FwbGVuKTsKLQotCXJldHVybiAoUEtUX0JFR0lOX1BPUyk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1zdW5ycGMuYyBiL3ByaW50LXN1bnJwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2UyOGE0Li4wMDAwMDAwCi0tLSBhL3ByaW50LXN1bnJwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zdW5ycGMuYyx2IDEuNDYuMi4xIDIwMDUvMDQvMjcgMjE6NDQ6MDYgZ3V5IEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaWZkZWYgSEFWRV9HRVRSUENCWU5VTUJFUgotI2luY2x1ZGUgPHJwYy9ycGMuaD4KLSNpZmRlZiBIQVZFX1JQQ19SUENFTlRfSAotI2luY2x1ZGUgPHJwYy9ycGNlbnQuaD4KLSNlbmRpZiAvKiBIQVZFX1JQQ19SUENFTlRfSCAqLwotI2VuZGlmIC8qIEhBVkVfR0VUUlBDQllOVU1CRVIgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaW5jbHVkZSAiaXAuaCIKLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwNi5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJycGNfYXV0aC5oIgotI2luY2x1ZGUgInJwY19tc2cuaCIKLSNpbmNsdWRlICJwbWFwX3Byb3QuaCIKLQotc3RhdGljIHN0cnVjdCB0b2sgcHJvYzJzdHJbXSA9IHsKLQl7IFNVTlJQQ19QTUFQUFJPQ19OVUxMLAkJIm51bGwiIH0sCi0JeyBTVU5SUENfUE1BUFBST0NfU0VULAkJInNldCIgfSwKLQl7IFNVTlJQQ19QTUFQUFJPQ19VTlNFVCwJInVuc2V0IiB9LAotCXsgU1VOUlBDX1BNQVBQUk9DX0dFVFBPUlQsCSJnZXRwb3J0IiB9LAotCXsgU1VOUlBDX1BNQVBQUk9DX0RVTVAsCQkiZHVtcCIgfSwKLQl7IFNVTlJQQ19QTUFQUFJPQ19DQUxMSVQsCSJjYWxsIiB9LAotCXsgMCwJCQkJTlVMTCB9Ci19OwotCi0vKiBGb3J3YXJkcyAqLwotc3RhdGljIGNoYXIgKnByb2dzdHIodV9pbnQzMl90KTsKLQotdm9pZAotc3VucnBjcmVxdWVzdF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCi0JCSAgICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwMikKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgc3VucnBjX21zZyAqcnA7Ci0JcmVnaXN0ZXIgY29uc3Qgc3RydWN0IGlwICppcDsKLSNpZmRlZiBJTkVUNgotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDY7Ci0jZW5kaWYKLQl1X2ludDMyX3QgeDsKLQljaGFyIHNyY2lkWzIwXSwgZHN0aWRbMjBdOwkvKmZpdHMgMzJiaXQqLwotCi0JcnAgPSAoc3RydWN0IHN1bnJwY19tc2cgKilicDsKLQotCWlmICghbmZsYWcpIHsKLQkJc25wcmludGYoc3JjaWQsIHNpemVvZihzcmNpZCksICIweCV4IiwKLQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1feGlkKSk7Ci0JCXN0cmxjcHkoZHN0aWQsICJzdW5ycGMiLCBzaXplb2YoZHN0aWQpKTsKLQl9IGVsc2UgewotCQlzbnByaW50ZihzcmNpZCwgc2l6ZW9mKHNyY2lkKSwgIjB4JXgiLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV94aWQpKTsKLQkJc25wcmludGYoZHN0aWQsIHNpemVvZihkc3RpZCksICIweCV4IiwgU1VOUlBDX1BNQVBQT1JUKTsKLQl9Ci0KLQlzd2l0Y2ggKElQX1YoKHN0cnVjdCBpcCAqKWJwMikpIHsKLQljYXNlIDQ6Ci0JCWlwID0gKHN0cnVjdCBpcCAqKWJwMjsKLQkJcHJpbnRmKCIlcy4lcyA+ICVzLiVzOiAlZCIsCi0JCSAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwgc3JjaWQsCi0JCSAgICBpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSwgZHN0aWQsIGxlbmd0aCk7Ci0JCWJyZWFrOwotI2lmZGVmIElORVQ2Ci0JY2FzZSA2OgotCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilicDI7Ci0JCXByaW50ZigiJXMuJXMgPiAlcy4lczogJWQiLAotCQkgICAgaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksIHNyY2lkLAotCQkgICAgaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X2RzdCksIGRzdGlkLCBsZW5ndGgpOwotCQlicmVhazsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXByaW50ZigiJXMuJXMgPiAlcy4lczogJWQiLCAiPyIsIHNyY2lkLCAiPyIsIGRzdGlkLCBsZW5ndGgpOwotCQlicmVhazsKLQl9Ci0KLQlwcmludGYoIiAlcyIsIHRvazJzdHIocHJvYzJzdHIsICIgcHJvYyAjJXUiLAotCSAgICBFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfcHJvYykpKTsKLQl4ID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3JwY3ZlcnMpOwotCWlmICh4ICE9IDIpCi0JCXByaW50ZigiIFtycGN2ZXIgJXVdIiwgeCk7Ci0KLQlzd2l0Y2ggKEVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fY2FsbC5jYl9wcm9jKSkgewotCi0JY2FzZSBTVU5SUENfUE1BUFBST0NfU0VUOgotCWNhc2UgU1VOUlBDX1BNQVBQUk9DX1VOU0VUOgotCWNhc2UgU1VOUlBDX1BNQVBQUk9DX0dFVFBPUlQ6Ci0JY2FzZSBTVU5SUENfUE1BUFBST0NfQ0FMTElUOgotCQl4ID0gRVhUUkFDVF8zMkJJVFMoJnJwLT5ybV9jYWxsLmNiX3Byb2cpOwotCQlpZiAoIW5mbGFnKQotCQkJcHJpbnRmKCIgJXMiLCBwcm9nc3RyKHgpKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIgJXUiLCB4KTsKLQkJcHJpbnRmKCIuJXUiLCBFWFRSQUNUXzMyQklUUygmcnAtPnJtX2NhbGwuY2JfdmVycykpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXByb2dzdHIocHJvZykKLQl1X2ludDMyX3QgcHJvZzsKLXsKLSNpZmRlZiBIQVZFX0dFVFJQQ0JZTlVNQkVSCi0JcmVnaXN0ZXIgc3RydWN0IHJwY2VudCAqcnA7Ci0jZW5kaWYKLQlzdGF0aWMgY2hhciBidWZbMzJdOwotCXN0YXRpYyB1X2ludDMyX3QgbGFzdHByb2cgPSAwOwotCi0JaWYgKGxhc3Rwcm9nICE9IDAgJiYgcHJvZyA9PSBsYXN0cHJvZykKLQkJcmV0dXJuIChidWYpOwotI2lmZGVmIEhBVkVfR0VUUlBDQllOVU1CRVIKLQlycCA9IGdldHJwY2J5bnVtYmVyKHByb2cpOwotCWlmIChycCA9PSBOVUxMKQotI2VuZGlmCi0JCSh2b2lkKSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiIyV1IiwgcHJvZyk7Ci0jaWZkZWYgSEFWRV9HRVRSUENCWU5VTUJFUgotCWVsc2UKLQkJc3RybGNweShidWYsIHJwLT5yX25hbWUsIHNpemVvZihidWYpKTsKLSNlbmRpZgotCXJldHVybiAoYnVmKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LXN5bWFudGVjLmMgYi9wcmludC1zeW1hbnRlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjcyMTgwLi4wMDAwMDAwCi0tLSBhL3ByaW50LXN5bWFudGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zeW1hbnRlYy5jLHYgMS40LjIuMSAyMDA1LzA3LzA3IDAxOjI0OjM5IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8cGNhcC5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV0aGVydHlwZS5oIgotCi0jaW5jbHVkZSAiZXRoZXIuaCIKLQotc3RydWN0IHN5bWFudGVjX2hlYWRlciB7Ci0JdV9pbnQ4X3QgIHN0dWZmMVs2XTsKLQl1X2ludDE2X3QgZXRoZXJfdHlwZTsKLQl1X2ludDhfdCAgc3R1ZmYyWzM2XTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc3ltYW50ZWNfaGRyX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyICpzcDsKLQl1X2ludDE2X3QgZXR5cGU7Ci0KLQlzcCA9IChjb25zdCBzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyICopYnA7Ci0KLQlldHlwZSA9IG50b2hzKHNwLT5ldGhlcl90eXBlKTsKLQlpZiAoIXFmbGFnKSB7Ci0JICAgICAgICBpZiAoZXR5cGUgPD0gRVRIRVJNVFUpCi0JCSAgICAgICAgICAodm9pZClwcmludGYoImludmFsaWQgZXRoZXJ0eXBlICV1IiwgZXR5cGUpOwotICAgICAgICAgICAgICAgIGVsc2UgCi0JCSAgICAgICAgICAodm9pZClwcmludGYoImV0aGVydHlwZSAlcyAoMHglMDR4KSIsCi0JCQkJICAgICAgIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiVW5rbm93biIsIGV0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0eXBlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoZXR5cGUgPD0gRVRIRVJNVFUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiaW52YWxpZCBldGhlcnR5cGUgJXUiLCBldHlwZSk7Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIlcyIsIHRvazJzdHIoZXRoZXJ0eXBlX3ZhbHVlcywiVW5rbm93biBFdGhlcnR5cGUgKDB4JTA0eCkiLCBldHlwZSkpOyAgCi0gICAgICAgIH0KLQotCSh2b2lkKXByaW50ZigiLCBsZW5ndGggJXU6ICIsIGxlbmd0aCk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgcm91dGluZSBvZiB0aGUgcHJpbnRlci4gICdwJyBwb2ludHMKLSAqIHRvIHRoZSBldGhlciBoZWFkZXIgb2YgdGhlIHBhY2tldCwgJ2gtPnRzJyBpcyB0aGUgdGltZXN0YW1wLAotICogJ2gtPmxlbicgaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IG9mZiB0aGUgd2lyZSwgYW5kICdoLT5jYXBsZW4nCi0gKiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNhcHR1cmVkLgotICovCi11X2ludAotc3ltYW50ZWNfaWZfcHJpbnQoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnApCi17Ci0JdV9pbnQgbGVuZ3RoID0gaC0+bGVuOwotCXVfaW50IGNhcGxlbiA9IGgtPmNhcGxlbjsKLQlzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyICpzcDsKLQl1X3Nob3J0IGV0aGVyX3R5cGU7Ci0JdV9zaG9ydCBleHRyYWN0ZWRfZXRoZXJfdHlwZTsKLQotCWlmIChjYXBsZW4gPCBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpKSB7Ci0JCXByaW50ZigiW3xzeW1hbnRlY10iKTsKLQkJcmV0dXJuIGNhcGxlbjsKLQl9Ci0KLQlpZiAoZWZsYWcpCi0JCXN5bWFudGVjX2hkcl9wcmludChwLCBsZW5ndGgpOwotCi0JbGVuZ3RoIC09IHNpemVvZiAoc3RydWN0IHN5bWFudGVjX2hlYWRlcik7Ci0JY2FwbGVuIC09IHNpemVvZiAoc3RydWN0IHN5bWFudGVjX2hlYWRlcik7Ci0Jc3AgPSAoc3RydWN0IHN5bWFudGVjX2hlYWRlciAqKXA7Ci0JcCArPSBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpOwotCi0JZXRoZXJfdHlwZSA9IG50b2hzKHNwLT5ldGhlcl90eXBlKTsKLQotCWlmIChldGhlcl90eXBlIDw9IEVUSEVSTVRVKSB7Ci0JCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCi0JCWlmICghZWZsYWcpCi0JCQlzeW1hbnRlY19oZHJfcHJpbnQoKHVfY2hhciAqKXNwLCBsZW5ndGggKyBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpKTsKLQotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7Ci0JfSBlbHNlIGlmIChldGhlcl9lbmNhcF9wcmludChldGhlcl90eXBlLCBwLCBsZW5ndGgsIGNhcGxlbiwKLQkgICAgJmV4dHJhY3RlZF9ldGhlcl90eXBlKSA9PSAwKSB7Ci0JCS8qIGV0aGVyX3R5cGUgbm90IGtub3duLCBwcmludCByYXcgcGFja2V0ICovCi0JCWlmICghZWZsYWcpCi0JCQlzeW1hbnRlY19oZHJfcHJpbnQoKHVfY2hhciAqKXNwLCBsZW5ndGggKyBzaXplb2YgKHN0cnVjdCBzeW1hbnRlY19oZWFkZXIpKTsKLQotCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQlkZWZhdWx0X3ByaW50KHAsIGNhcGxlbik7Ci0JfSAKLQotCXJldHVybiAoc2l6ZW9mIChzdHJ1Y3Qgc3ltYW50ZWNfaGVhZGVyKSk7Ci19CmRpZmYgLS1naXQgYS9wcmludC1zeXNsb2cuYyBiL3ByaW50LXN5c2xvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTlkMDI3Li4wMDAwMDAwCi0tLSBhL3ByaW50LXN5c2xvZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCAgSGFubmVzIEdyZWRsZXIgPGhhbm5lc0B0Y3BkdW1wLm9yZz4KLSAqICAgICAgVGhlIFRDUERVTVAgcHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORAotICogV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVAotICogTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC1zeXNsb2cuYyx2IDEuMSAyMDA0LzEwLzI5IDExOjQyOjUzIGhhbm5lcyBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotCi0vKiAKLSAqIHRva2VubGlzdHMgYW5kICNkZWZpbmVzIHRha2VuIGZyb20gRXRoZXJlYWwgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKLSAqIGJ5IEdlcmFsZCBDb21icyA8Z2VyYWxkQGV0aGVyZWFsLmNvbT4KLSAqLwotCi0jZGVmaW5lIFNZU0xPR19TRVZFUklUWV9NQVNLIDB4MDAwNyAgLyogMDAwMCAwMDAwIDAwMDAgMDExMSAqLwotI2RlZmluZSBTWVNMT0dfRkFDSUxJVFlfTUFTSyAweDAzZjggIC8qIDAwMDAgMDAxMSAxMTExIDEwMDAgKi8KLSNkZWZpbmUgU1lTTE9HX01BWF9ESUdJVFMgMyAvKiBUaGUgbWF4aW11bSBudW1iZXIgaWYgcHJpb3JpdHkgZGlnaXRzIHRvIHJlYWQgaW4uICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHN5c2xvZ19zZXZlcml0eV92YWx1ZXNbXSA9IHsKLSAgeyAwLCAgICAgICJlbWVyZ2VuY3kiIH0sCi0gIHsgMSwgICAgICAiYWxlcnQiIH0sCi0gIHsgMiwgICAgICAiY3JpdGljYWwiIH0sCi0gIHsgMywgICAgICAiZXJyb3IiIH0sCi0gIHsgNCwgICAgICAid2FybmluZyIgfSwKLSAgeyA1LCAgICAgICJub3RpY2UiIH0sCi0gIHsgNiwgICAgICAiaW5mbyIgfSwKLSAgeyA3LCAgICAgICJkZWJ1ZyIgfSwKLSAgeyAwLCBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBzeXNsb2dfZmFjaWxpdHlfdmFsdWVzW10gPSB7Ci0gIHsgMCwgICAgICJrZXJuZWwiIH0sCi0gIHsgMSwgICAgICJ1c2VyIiB9LAotICB7IDIsICAgICAibWFpbCIgfSwKLSAgeyAzLCAgICAgImRhZW1vbiIgfSwKLSAgeyA0LCAgICAgImF1dGgiIH0sCi0gIHsgNSwgICAgICJzeXNsb2ciIH0sCi0gIHsgNiwgICAgICJscHIiIH0sCi0gIHsgNywgICAgICJuZXdzIiB9LAotICB7IDgsICAgICAidXVjcCIgfSwKLSAgeyA5LCAgICAgImNyb24iIH0sCi0gIHsgMTAsICAgICJhdXRocHJpdiIgfSwKLSAgeyAxMSwgICAgImZ0cCIgfSwKLSAgeyAxMiwgICAgIm50cCIgfSwKLSAgeyAxMywgICAgInNlY3VyaXR5IiB9LAotICB7IDE0LCAgICAiY29uc29sZSIgfSwKLSAgeyAxNSwgICAgImNyb24iIH0sCi0gIHsgMTYsICAgICJsb2NhbDAiIH0sCi0gIHsgMTcsICAgICJsb2NhbDEiIH0sCi0gIHsgMTgsICAgICJsb2NhbDIiIH0sCi0gIHsgMTksICAgICJsb2NhbDMiIH0sCi0gIHsgMjAsICAgICJsb2NhbDQiIH0sCi0gIHsgMjEsICAgICJsb2NhbDUiIH0sCi0gIHsgMjIsICAgICJsb2NhbDYiIH0sCi0gIHsgMjMsICAgICJsb2NhbDciIH0sCi0gIHsgMCwgTlVMTCB9LAotfTsKLQotdm9pZAotc3lzbG9nX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcHB0ciwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotICAgIHVfaW50MTZfdCBtc2dfb2ZmID0gMDsKLSAgICB1X2ludDE2X3QgcHJpID0gMDsKLSAgICB1X2ludDE2X3QgZmFjaWxpdHksc2V2ZXJpdHk7Ci0KLSAgICAvKiBleHRyYWN0IGRlY2ltYWwgZmlndXJlcyB0aGF0IGFyZQotICAgICAqIGVuY2Fwc3VsYXRlZCB3aXRoaW4gPCA+IHRhZ3MKLSAgICAgKiBiYXNlZCBvbiB0aGlzIGRlY2ltYWwgZmlndXJlIGV4dHJhY3QgdGhlCi0gICAgICogc2V2ZXJpdHkgYW5kIGZhY2lsaXR5IHZhbHVlcwotICAgICAqLwotCi0gICAgaWYgKCFUVEVTVDIoKnBwdHIsIDEpKQotICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgaWYgKCoocHB0cittc2dfb2ZmKSA9PSAnPCcpIHsKLSAgICAgICAgbXNnX29mZisrOwotCi0gICAgICAgIGlmICghVFRFU1QyKCoocHB0cittc2dfb2ZmKSwgMSkpCi0gICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgIHdoaWxlICggKihwcHRyK21zZ19vZmYpID49ICcwJyAmJgotICAgICAgICAgICAgICAgICoocHB0cittc2dfb2ZmKSA8PSAnOScgJiYKLSAgICAgICAgICAgICAgICBtc2dfb2ZmIDw9IFNZU0xPR19NQVhfRElHSVRTKSB7Ci0KLSAgICAgICAgICAgIGlmICghVFRFU1QyKCoocHB0cittc2dfb2ZmKSwgMSkpCi0gICAgICAgICAgICAgICAgZ290byB0cnVuYzsKLQotICAgICAgICAgICAgcHJpID0gcHJpICogMTAgKyAoKihwcHRyK21zZ19vZmYpIC0gJzAnKTsKLSAgICAgICAgICAgIG1zZ19vZmYrKzsKLQotICAgICAgICAgICAgaWYgKCFUVEVTVDIoKihwcHRyK21zZ19vZmYpLCAxKSkKLSAgICAgICAgICAgICAgICBnb3RvIHRydW5jOwotCi0gICAgICAgIGlmICgqKHBwdHIrbXNnX29mZikgPT0gJz4nKQotICAgICAgICAgICAgbXNnX29mZisrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJbfHN5c2xvZ10iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGZhY2lsaXR5ID0gKHByaSAmIFNZU0xPR19GQUNJTElUWV9NQVNLKSA+PiAzOwotICAgIHNldmVyaXR5ID0gcHJpICYgU1lTTE9HX1NFVkVSSVRZX01BU0s7Ci0KLSAgICAKLSAgICBpZiAodmZsYWcgPCAxICkKLSAgICB7Ci0gICAgICAgIHByaW50ZigiU1lTTE9HICVzLiVzLCBsZW5ndGg6ICV1IiwKLSAgICAgICAgICAgICAgIHRvazJzdHIoc3lzbG9nX2ZhY2lsaXR5X3ZhbHVlcywgInVua25vd24gKCV1KSIsIGZhY2lsaXR5KSwKLSAgICAgICAgICAgICAgIHRvazJzdHIoc3lzbG9nX3NldmVyaXR5X3ZhbHVlcywgInVua25vd24gKCV1KSIsIHNldmVyaXR5KSwKLSAgICAgICAgICAgICAgIGxlbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgICAgCi0gICAgcHJpbnRmKCJTWVNMT0csIGxlbmd0aDogJXVcblx0RmFjaWxpdHkgJXMgKCV1KSwgU2V2ZXJpdHkgJXMgKCV1KVxuXHRNc2c6ICIsCi0gICAgICAgICAgIGxlbiwKLSAgICAgICAgICAgdG9rMnN0cihzeXNsb2dfZmFjaWxpdHlfdmFsdWVzLCAidW5rbm93biAoJXUpIiwgZmFjaWxpdHkpLAotICAgICAgICAgICBmYWNpbGl0eSwKLSAgICAgICAgICAgdG9rMnN0cihzeXNsb2dfc2V2ZXJpdHlfdmFsdWVzLCAidW5rbm93biAoJXUpIiwgc2V2ZXJpdHkpLAotICAgICAgICAgICBzZXZlcml0eSk7Ci0KLSAgICAvKiBwcmludCB0aGUgc3lzbG9nIHRleHQgaW4gdmVyYm9zZSBtb2RlICovCi0gICAgZm9yICg7IG1zZ19vZmYgPCBsZW47IG1zZ19vZmYrKykgewotICAgICAgICBpZiAoIVRURVNUMigqKHBwdHIrbXNnX29mZiksIDEpKQotICAgICAgICAgICAgZ290byB0cnVuYzsKLSAgICAgICAgc2FmZXB1dGNoYXIoKihwcHRyK21zZ19vZmYpKTsgICAgICAgIAotICAgIH0KLQotICAgIGlmICh2ZmxhZyA+IDEpIHsKLSAgICAgICAgaWYoIXByaW50X3Vua25vd25fZGF0YShwcHRyLCJcblx0IixsZW4pKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICByZXR1cm47Ci0KLXRydW5jOgotICAgICAgICBwcmludGYoIlt8c3lzbG9nXSIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtdGNwLmMgYi9wcmludC10Y3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiZDZiNy4uMDAwMDAwMAotLS0gYS9wcmludC10Y3AuYworKysgL2Rldi9udWxsCkBAIC0xLDgwNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgdGNwZHVtcC5vcmcgcHJvamVjdAotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC10Y3AuYyx2IDEuMTIwLjIuMyAyMDA1LzEwLzE2IDA2OjA1OjQ2IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotCi0jaW5jbHVkZSAidGNwLmgiCi0KLSNpbmNsdWRlICJpcC5oIgotI2lmZGVmIElORVQ2Ci0jaW5jbHVkZSAiaXA2LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJpcHByb3RvLmgiCi0jaW5jbHVkZSAicnBjX2F1dGguaCIKLSNpbmNsdWRlICJycGNfbXNnLmgiCi0KLSNpbmNsdWRlICJuYW1lc2VyLmgiCi0KLSNpZmRlZiBIQVZFX0xJQkNSWVBUTwotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0KLSNkZWZpbmUgU0lHTkFUVVJFX1ZBTElECQkwCi0jZGVmaW5lIFNJR05BVFVSRV9JTlZBTElECTEKLSNkZWZpbmUgQ0FOVF9DSEVDS19TSUdOQVRVUkUJMgotCi1zdGF0aWMgaW50IHRjcF92ZXJpZnlfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBpcCAqaXAsIGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRwLAotICAgIGNvbnN0IHVfY2hhciAqZGF0YSwgaW50IGxlbmd0aCwgY29uc3QgdV9jaGFyICpyY3ZzaWcpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIHByaW50X3RjcF9yc3RfZGF0YShyZWdpc3RlciBjb25zdCB1X2NoYXIgKnNwLCB1X2ludCBsZW5ndGgpOwotCi0jZGVmaW5lIE1BWF9SU1RfREFUQV9MRU4JMzAKLQotCi1zdHJ1Y3QgdGhhIHsKLSNpZm5kZWYgSU5FVDYKLQlzdHJ1Y3QgaW5fYWRkciBzcmM7Ci0Jc3RydWN0IGluX2FkZHIgZHN0OwotI2Vsc2UKLQlzdHJ1Y3QgaW42X2FkZHIgc3JjOwotCXN0cnVjdCBpbjZfYWRkciBkc3Q7Ci0jZW5kaWYgLypJTkVUNiovCi0JdV9pbnQgcG9ydDsKLX07Ci0KLXN0cnVjdCB0Y3Bfc2VxX2hhc2ggewotCXN0cnVjdCB0Y3Bfc2VxX2hhc2ggKm54dDsKLQlzdHJ1Y3QgdGhhIGFkZHI7Ci0JdGNwX3NlcSBzZXE7Ci0JdGNwX3NlcSBhY2s7Ci19OwotCi0jZGVmaW5lIFRTRVFfSEFTSFNJWkUgOTE5Ci0KLS8qIFRoZXNlIHRjcCBvcHRpbm9zIGRvIG5vdCBoYXZlIHRoZSBzaXplIG9jdGV0ICovCi0jZGVmaW5lIFpFUk9MRU5PUFQobykgKChvKSA9PSBUQ1BPUFRfRU9MIHx8IChvKSA9PSBUQ1BPUFRfTk9QKQotCi1zdGF0aWMgc3RydWN0IHRjcF9zZXFfaGFzaCB0Y3Bfc2VxX2hhc2hbVFNFUV9IQVNIU0laRV07Ci0KLQotI2lmbmRlZiBURUxORVRfUE9SVAotI2RlZmluZSBURUxORVRfUE9SVAkyMwotI2VuZGlmCi0jaWZuZGVmIEJHUF9QT1JUCi0jZGVmaW5lIEJHUF9QT1JUCTE3OQotI2VuZGlmCi0jZGVmaW5lIE5FVEJJT1NfU1NOX1BPUlQgMTM5Ci0jaWZuZGVmIFBQVFBfUE9SVAotI2RlZmluZSBQUFRQX1BPUlQJMTcyMwotI2VuZGlmCi0jZGVmaW5lIEJFRVBfUE9SVCAgICAgICAgMTAyODgKLSNpZm5kZWYgTkZTX1BPUlQKLSNkZWZpbmUgTkZTX1BPUlQJMjA0OQotI2VuZGlmCi0jZGVmaW5lIE1TRFBfUE9SVAk2MzkKLSNkZWZpbmUgTERQX1BPUlQgICAgICAgIDY0NgotCi1zdGF0aWMgaW50IHRjcF9ja3N1bShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXAgKmlwLAotCQkgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRwLAotCQkgICAgIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLQl1bmlvbiBwaHUgewotCQlzdHJ1Y3QgcGhkciB7Ci0JCQl1X2ludDMyX3Qgc3JjOwotCQkJdV9pbnQzMl90IGRzdDsKLQkJCXVfY2hhciBtYno7Ci0JCQl1X2NoYXIgcHJvdG87Ci0JCQl1X2ludDE2X3QgbGVuOwotCQl9IHBoOwotCQl1X2ludDE2X3QgcGFbNl07Ci0JfSBwaHU7Ci0JY29uc3QgdV9pbnQxNl90ICpzcDsKLQotCS8qIHBzZXVkby1oZWFkZXIuLiAqLwotCXBodS5waC5sZW4gPSBodG9ucygodV9pbnQxNl90KWxlbik7Ci0JcGh1LnBoLm1ieiA9IDA7Ci0JcGh1LnBoLnByb3RvID0gSVBQUk9UT19UQ1A7Ci0JbWVtY3B5KCZwaHUucGguc3JjLCAmaXAtPmlwX3NyYy5zX2FkZHIsIHNpemVvZih1X2ludDMyX3QpKTsKLQlpZiAoSVBfSEwoaXApID09IDUpCi0JCW1lbWNweSgmcGh1LnBoLmRzdCwgJmlwLT5pcF9kc3Quc19hZGRyLCBzaXplb2YodV9pbnQzMl90KSk7Ci0JZWxzZQotCQlwaHUucGguZHN0ID0gaXBfZmluZGRzdChpcCk7Ci0KLQlzcCA9ICZwaHUucGFbMF07Ci0JcmV0dXJuIGluX2Nrc3VtKCh1X3Nob3J0ICopdHAsIGxlbiwKLQkJCXNwWzBdK3NwWzFdK3NwWzJdK3NwWzNdK3NwWzRdK3NwWzVdKTsKLX0KLQotI2lmZGVmIElORVQ2Ci1zdGF0aWMgaW50IHRjcDZfY2tzdW0oY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNiwgY29uc3Qgc3RydWN0IHRjcGhkciAqdHAsCi0JdV9pbnQgbGVuKQotewotCXNpemVfdCBpOwotCXJlZ2lzdGVyIGNvbnN0IHVfaW50MTZfdCAqc3A7Ci0JdV9pbnQzMl90IHN1bTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgaW42X2FkZHIgcGhfc3JjOwotCQkJc3RydWN0IGluNl9hZGRyIHBoX2RzdDsKLQkJCXVfaW50MzJfdAlwaF9sZW47Ci0JCQl1X2ludDhfdAlwaF96ZXJvWzNdOwotCQkJdV9pbnQ4X3QJcGhfbnh0OwotCQl9IHBoOwotCQl1X2ludDE2X3QgcGFbMjBdOwotCX0gcGh1OwotCi0JLyogcHNldWRvLWhlYWRlciAqLwotCW1lbXNldCgmcGh1LCAwLCBzaXplb2YocGh1KSk7Ci0JcGh1LnBoLnBoX3NyYyA9IGlwNi0+aXA2X3NyYzsKLQlwaHUucGgucGhfZHN0ID0gaXA2LT5pcDZfZHN0OwotCXBodS5waC5waF9sZW4gPSBodG9ubChsZW4pOwotCXBodS5waC5waF9ueHQgPSBJUFBST1RPX1RDUDsKLQotCXN1bSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihwaHUucGEpIC8gc2l6ZW9mKHBodS5wYVswXSk7IGkrKykKLQkJc3VtICs9IHBodS5wYVtpXTsKLQotCXNwID0gKGNvbnN0IHVfaW50MTZfdCAqKXRwOwotCi0JZm9yIChpID0gMDsgaSA8IChsZW4gJiB+MSk7IGkgKz0gMikKLQkJc3VtICs9ICpzcCsrOwotCi0JaWYgKGxlbiAmIDEpCi0JCXN1bSArPSBodG9ucygoKihjb25zdCB1X2ludDhfdCAqKXNwKSA8PCA4KTsKLQotCXdoaWxlIChzdW0gPiAweGZmZmYpCi0JCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7Ci0Jc3VtID0gfnN1bSAmIDB4ZmZmZjsKLQotCXJldHVybiAoc3VtKTsKLX0KLSNlbmRpZgotCi12b2lkCi10Y3BfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgcmVnaXN0ZXIgdV9pbnQgbGVuZ3RoLAotCSAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicDIsIGludCBmcmFnbWVudGVkKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0Y3BoZHIgKnRwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXA7Ci0JcmVnaXN0ZXIgdV9jaGFyIGZsYWdzOwotCXJlZ2lzdGVyIHVfaW50IGhsZW47Ci0JcmVnaXN0ZXIgY2hhciBjaDsKLQl1X2ludDE2X3Qgc3BvcnQsIGRwb3J0LCB3aW4sIHVycDsKLQl1X2ludDMyX3Qgc2VxLCBhY2ssIHRoc2VxLCB0aGFjazsKLQlpbnQgdGhyZXY7Ci0jaWZkZWYgSU5FVDYKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXA2X2hkciAqaXA2OwotI2VuZGlmCi0KLQl0cCA9IChzdHJ1Y3QgdGNwaGRyICopYnA7Ci0JaXAgPSAoc3RydWN0IGlwICopYnAyOwotI2lmZGVmIElORVQ2Ci0JaWYgKElQX1YoaXApID09IDYpCi0JCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKLQllbHNlCi0JCWlwNiA9IE5VTEw7Ci0jZW5kaWYgLypJTkVUNiovCi0JY2ggPSAnXDAnOwotCWlmICghVFRFU1QodHAtPnRoX2Rwb3J0KSkgewotCQkodm9pZClwcmludGYoIiVzID4gJXM6IFt8dGNwXSIsCi0JCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKLQkJCWlwYWRkcl9zdHJpbmcoJmlwLT5pcF9kc3QpKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwb3J0ID0gRVhUUkFDVF8xNkJJVFMoJnRwLT50aF9zcG9ydCk7Ci0JZHBvcnQgPSBFWFRSQUNUXzE2QklUUygmdHAtPnRoX2Rwb3J0KTsKLQotCWhsZW4gPSBUSF9PRkYodHApICogNDsKLQotCS8qCi0JICogSWYgZGF0YSBwcmVzZW50LCBoZWFkZXIgbGVuZ3RoIHZhbGlkLCBhbmQgTkZTIHBvcnQgdXNlZCwKLQkgKiBhc3N1bWUgTkZTLgotCSAqIFBhc3Mgb2Zmc2V0IG9mIGRhdGEgcGx1cyA0IGJ5dGVzIGZvciBSUEMgVENQIG1zZyBsZW5ndGgKLQkgKiB0byBORlMgcHJpbnQgcm91dGluZXMuCi0JICovCi0JaWYgKCFxZmxhZyAmJiBobGVuID49IHNpemVvZigqdHApICYmIGhsZW4gPD0gbGVuZ3RoKSB7Ci0JCWlmICgodV9jaGFyICopdHAgKyA0ICsgc2l6ZW9mKHN0cnVjdCBzdW5ycGNfbXNnKSA8PSBzbmFwZW5kICYmCi0JCSAgICBkcG9ydCA9PSBORlNfUE9SVCkgewotCQkJbmZzcmVxX3ByaW50KCh1X2NoYXIgKil0cCArIGhsZW4gKyA0LCBsZW5ndGggLSBobGVuLAotCQkJCSAgICAgKHVfY2hhciAqKWlwKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmICgodV9jaGFyICopdHAgKyA0ICsgc2l6ZW9mKHN0cnVjdCBzdW5ycGNfbXNnKQotCQkJICAgPD0gc25hcGVuZCAmJgotCQkJICAgc3BvcnQgPT0gTkZTX1BPUlQpIHsKLQkJCW5mc3JlcGx5X3ByaW50KCh1X2NoYXIgKil0cCArIGhsZW4gKyA0LCBsZW5ndGggLSBobGVuLAotCQkJCSAgICAgICAodV9jaGFyICopaXApOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotI2lmZGVmIElORVQ2Ci0JaWYgKGlwNikgewotCQlpZiAoaXA2LT5pcDZfbnh0ID09IElQUFJPVE9fVENQKSB7Ci0JCQkodm9pZClwcmludGYoIiVzLiVzID4gJXMuJXM6ICIsCi0JCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksCi0JCQkJdGNwcG9ydF9zdHJpbmcoc3BvcnQpLAotCQkJCWlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpLAotCQkJCXRjcHBvcnRfc3RyaW5nKGRwb3J0KSk7Ci0JCX0gZWxzZSB7Ci0JCQkodm9pZClwcmludGYoIiVzID4gJXM6ICIsCi0JCQkJdGNwcG9ydF9zdHJpbmcoc3BvcnQpLCB0Y3Bwb3J0X3N0cmluZyhkcG9ydCkpOwotCQl9Ci0JfSBlbHNlCi0jZW5kaWYgLypJTkVUNiovCi0JewotCQlpZiAoaXAtPmlwX3AgPT0gSVBQUk9UT19UQ1ApIHsKLQkJCSh2b2lkKXByaW50ZigiJXMuJXMgPiAlcy4lczogIiwKLQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKLQkJCQl0Y3Bwb3J0X3N0cmluZyhzcG9ydCksCi0JCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX2RzdCksCi0JCQkJdGNwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJfSBlbHNlIHsKLQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKLQkJCQl0Y3Bwb3J0X3N0cmluZyhzcG9ydCksIHRjcHBvcnRfc3RyaW5nKGRwb3J0KSk7Ci0JCX0KLQl9Ci0KLQlpZiAoaGxlbiA8IHNpemVvZigqdHApKSB7Ci0JCSh2b2lkKXByaW50ZigiIHRjcCAlZCBbYmFkIGhkciBsZW5ndGggJXUgLSB0b28gc2hvcnQsIDwgJWx1XSIsCi0JCSAgICBsZW5ndGggLSBobGVuLCBobGVuLCAodW5zaWduZWQgbG9uZylzaXplb2YoKnRwKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlUQ0hFQ0soKnRwKTsKLQotCXNlcSA9IEVYVFJBQ1RfMzJCSVRTKCZ0cC0+dGhfc2VxKTsKLQlhY2sgPSBFWFRSQUNUXzMyQklUUygmdHAtPnRoX2Fjayk7Ci0Jd2luID0gRVhUUkFDVF8xNkJJVFMoJnRwLT50aF93aW4pOwotCXVycCA9IEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfdXJwKTsKLQotCWlmIChxZmxhZykgewotCQkodm9pZClwcmludGYoInRjcCAlZCIsIGxlbmd0aCAtIGhsZW4pOwotCQlpZiAoaGxlbiA+IGxlbmd0aCkgewotCQkJKHZvaWQpcHJpbnRmKCIgW2JhZCBoZHIgbGVuZ3RoICV1IC0gdG9vIGxvbmcsID4gJXVdIiwKLQkJCSAgICBobGVuLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKChmbGFncyA9IHRwLT50aF9mbGFncykgJiAoVEhfU1lOfFRIX0ZJTnxUSF9SU1R8VEhfUFVTSHwKLQkJCQkgICAgICBUSF9FQ05FQ0hPfFRIX0NXUikpIHsKLQkJaWYgKGZsYWdzICYgVEhfU1lOKQotCQkJcHV0Y2hhcignUycpOwotCQlpZiAoZmxhZ3MgJiBUSF9GSU4pCi0JCQlwdXRjaGFyKCdGJyk7Ci0JCWlmIChmbGFncyAmIFRIX1JTVCkKLQkJCXB1dGNoYXIoJ1InKTsKLQkJaWYgKGZsYWdzICYgVEhfUFVTSCkKLQkJCXB1dGNoYXIoJ1AnKTsKLQkJaWYgKGZsYWdzICYgVEhfQ1dSKQotCQkJcHV0Y2hhcignVycpOwkvKiBjb25nZXN0aW9uIF9XX2luZG93IHJlZHVjZWQgKEVDTikgKi8KLQkJaWYgKGZsYWdzICYgVEhfRUNORUNITykKLQkJCXB1dGNoYXIoJ0UnKTsJLyogZWNuIF9FX2NobyBzZW50IChFQ04pICovCi0JfSBlbHNlCi0JCXB1dGNoYXIoJy4nKTsKLQotCWlmICghU2ZsYWcgJiYgKGZsYWdzICYgVEhfQUNLKSkgewotCQlyZWdpc3RlciBzdHJ1Y3QgdGNwX3NlcV9oYXNoICp0aDsKLQkJY29uc3Qgdm9pZCAqc3JjLCAqZHN0OwotCQlyZWdpc3RlciBpbnQgcmV2OwotCQlzdHJ1Y3QgdGhhIHRoYTsKLQkJLyoKLQkJICogRmluZCAob3IgcmVjb3JkKSB0aGUgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXJzIGZvcgotCQkgKiB0aGlzIGNvbnZlcnNhdGlvbi4gICh3ZSBwaWNrIGFuIGFyYml0cmFyeQotCQkgKiBjb2xsYXRpbmcgb3JkZXIgc28gdGhlcmUncyBvbmx5IG9uZSBlbnRyeSBmb3IKLQkJICogYm90aCBkaXJlY3Rpb25zKS4KLQkJICovCi0jaWZkZWYgSU5FVDYKLQkJbWVtc2V0KCZ0aGEsIDAsIHNpemVvZih0aGEpKTsKLQkJcmV2ID0gMDsKLQkJaWYgKGlwNikgewotCQkJc3JjID0gJmlwNi0+aXA2X3NyYzsKLQkJCWRzdCA9ICZpcDYtPmlwNl9kc3Q7Ci0JCQlpZiAoc3BvcnQgPiBkcG9ydCkKLQkJCQlyZXYgPSAxOwotCQkJZWxzZSBpZiAoc3BvcnQgPT0gZHBvcnQpIHsKLQkJCQlpZiAobWVtY21wKHNyYywgZHN0LCBzaXplb2YgaXA2LT5pcDZfZHN0KSA+IDApCi0JCQkJCXJldiA9IDE7Ci0JCQl9Ci0JCQlpZiAocmV2KSB7Ci0JCQkJbWVtY3B5KCZ0aGEuc3JjLCBkc3QsIHNpemVvZiBpcDYtPmlwNl9kc3QpOwotCQkJCW1lbWNweSgmdGhhLmRzdCwgc3JjLCBzaXplb2YgaXA2LT5pcDZfc3JjKTsKLQkJCQl0aGEucG9ydCA9IGRwb3J0IDw8IDE2IHwgc3BvcnQ7Ci0JCQl9IGVsc2UgewotCQkJCW1lbWNweSgmdGhhLmRzdCwgZHN0LCBzaXplb2YgaXA2LT5pcDZfZHN0KTsKLQkJCQltZW1jcHkoJnRoYS5zcmMsIHNyYywgc2l6ZW9mIGlwNi0+aXA2X3NyYyk7Ci0JCQkJdGhhLnBvcnQgPSBzcG9ydCA8PCAxNiB8IGRwb3J0OwotCQkJfQotCQl9IGVsc2UgewotCQkJc3JjID0gJmlwLT5pcF9zcmM7Ci0JCQlkc3QgPSAmaXAtPmlwX2RzdDsKLQkJCWlmIChzcG9ydCA+IGRwb3J0KQotCQkJCXJldiA9IDE7Ci0JCQllbHNlIGlmIChzcG9ydCA9PSBkcG9ydCkgewotCQkJCWlmIChtZW1jbXAoc3JjLCBkc3QsIHNpemVvZiBpcC0+aXBfZHN0KSA+IDApCi0JCQkJCXJldiA9IDE7Ci0JCQl9Ci0JCQlpZiAocmV2KSB7Ci0JCQkJbWVtY3B5KCZ0aGEuc3JjLCBkc3QsIHNpemVvZiBpcC0+aXBfZHN0KTsKLQkJCQltZW1jcHkoJnRoYS5kc3QsIHNyYywgc2l6ZW9mIGlwLT5pcF9zcmMpOwotCQkJCXRoYS5wb3J0ID0gZHBvcnQgPDwgMTYgfCBzcG9ydDsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtY3B5KCZ0aGEuZHN0LCBkc3QsIHNpemVvZiBpcC0+aXBfZHN0KTsKLQkJCQltZW1jcHkoJnRoYS5zcmMsIHNyYywgc2l6ZW9mIGlwLT5pcF9zcmMpOwotCQkJCXRoYS5wb3J0ID0gc3BvcnQgPDwgMTYgfCBkcG9ydDsKLQkJCX0KLQkJfQotI2Vsc2UKLQkJcmV2ID0gMDsKLQkJc3JjID0gJmlwLT5pcF9zcmM7Ci0JCWRzdCA9ICZpcC0+aXBfZHN0OwotCQlpZiAoc3BvcnQgPiBkcG9ydCkKLQkJCXJldiA9IDE7Ci0JCWVsc2UgaWYgKHNwb3J0ID09IGRwb3J0KSB7Ci0JCQlpZiAobWVtY21wKHNyYywgZHN0LCBzaXplb2YgaXAtPmlwX2RzdCkgPiAwKQotCQkJCXJldiA9IDE7Ci0JCX0KLQkJaWYgKHJldikgewotCQkJbWVtY3B5KCZ0aGEuc3JjLCBkc3QsIHNpemVvZiBpcC0+aXBfZHN0KTsKLQkJCW1lbWNweSgmdGhhLmRzdCwgc3JjLCBzaXplb2YgaXAtPmlwX3NyYyk7Ci0JCQl0aGEucG9ydCA9IGRwb3J0IDw8IDE2IHwgc3BvcnQ7Ci0JCX0gZWxzZSB7Ci0JCQltZW1jcHkoJnRoYS5kc3QsIGRzdCwgc2l6ZW9mIGlwLT5pcF9kc3QpOwotCQkJbWVtY3B5KCZ0aGEuc3JjLCBzcmMsIHNpemVvZiBpcC0+aXBfc3JjKTsKLQkJCXRoYS5wb3J0ID0gc3BvcnQgPDwgMTYgfCBkcG9ydDsKLQkJfQotI2VuZGlmCi0KLQkJdGhyZXYgPSByZXY7Ci0JCWZvciAodGggPSAmdGNwX3NlcV9oYXNoW3RoYS5wb3J0ICUgVFNFUV9IQVNIU0laRV07Ci0JCSAgICAgdGgtPm54dDsgdGggPSB0aC0+bnh0KQotCQkJaWYgKG1lbWNtcCgoY2hhciAqKSZ0aGEsIChjaGFyICopJnRoLT5hZGRyLAotCQkJCSAgc2l6ZW9mKHRoLT5hZGRyKSkgPT0gMCkKLQkJCQlicmVhazsKLQotCQlpZiAoIXRoLT5ueHQgfHwgKGZsYWdzICYgVEhfU1lOKSkgewotCQkJLyogZGlkbid0IGZpbmQgaXQgb3IgbmV3IGNvbnZlcnNhdGlvbiAqLwotCQkJaWYgKHRoLT5ueHQgPT0gTlVMTCkgewotCQkJCXRoLT5ueHQgPSAoc3RydWN0IHRjcF9zZXFfaGFzaCAqKQotCQkJCQljYWxsb2MoMSwgc2l6ZW9mKCp0aCkpOwotCQkJCWlmICh0aC0+bnh0ID09IE5VTEwpCi0JCQkJCWVycm9yKCJ0Y3BfcHJpbnQ6IGNhbGxvYyIpOwotCQkJfQotCQkJdGgtPmFkZHIgPSB0aGE7Ci0JCQlpZiAocmV2KQotCQkJCXRoLT5hY2sgPSBzZXEsIHRoLT5zZXEgPSBhY2sgLSAxOwotCQkJZWxzZQotCQkJCXRoLT5zZXEgPSBzZXEsIHRoLT5hY2sgPSBhY2sgLSAxOwotCQl9IGVsc2UgewotCQkJaWYgKHJldikKLQkJCQlzZXEgLT0gdGgtPmFjaywgYWNrIC09IHRoLT5zZXE7Ci0JCQllbHNlCi0JCQkJc2VxIC09IHRoLT5zZXEsIGFjayAtPSB0aC0+YWNrOwotCQl9Ci0KLQkJdGhzZXEgPSB0aC0+c2VxOwotCQl0aGFjayA9IHRoLT5hY2s7Ci0JfSBlbHNlIHsKLQkJLypmb29sIGdjYyovCi0JCXRoc2VxID0gdGhhY2sgPSB0aHJldiA9IDA7Ci0JfQotCWlmIChobGVuID4gbGVuZ3RoKSB7Ci0JCSh2b2lkKXByaW50ZigiIFtiYWQgaGRyIGxlbmd0aCAldSAtIHRvbyBsb25nLCA+ICV1XSIsCi0JCSAgICBobGVuLCBsZW5ndGgpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKElQX1YoaXApID09IDQgJiYgdmZsYWcgJiYgIWZyYWdtZW50ZWQpIHsKLQkJdV9pbnQxNl90IHN1bSwgdGNwX3N1bTsKLQkJaWYgKFRURVNUMih0cC0+dGhfc3BvcnQsIGxlbmd0aCkpIHsKLQkJCXN1bSA9IHRjcF9ja3N1bShpcCwgdHAsIGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXByaW50ZigiLCBja3N1bSAweCUwNHgiLEVYVFJBQ1RfMTZCSVRTKCZ0cC0+dGhfc3VtKSk7Ci0JCQlpZiAoc3VtICE9IDApIHsKLQkJCQl0Y3Bfc3VtID0gRVhUUkFDVF8xNkJJVFMoJnRwLT50aF9zdW0pOwotCQkJCSh2b2lkKXByaW50ZigiIChpbmNvcnJlY3QgKC0+IDB4JTA0eCksIixpbl9ja3N1bV9zaG91bGRiZSh0Y3Bfc3VtLCBzdW0pKTsKLQkJCX0gZWxzZQotCQkJCSh2b2lkKXByaW50ZigiIChjb3JyZWN0KSwiKTsKLQkJfQotCX0KLSNpZmRlZiBJTkVUNgotCWlmIChJUF9WKGlwKSA9PSA2ICYmIGlwNi0+aXA2X3BsZW4gJiYgdmZsYWcgJiYgIWZyYWdtZW50ZWQpIHsKLQkJdV9pbnQxNl90IHN1bSx0Y3Bfc3VtOwotCQlpZiAoVFRFU1QyKHRwLT50aF9zcG9ydCwgbGVuZ3RoKSkgewotCQkJc3VtID0gdGNwNl9ja3N1bShpcDYsIHRwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpcHJpbnRmKCIsIGNrc3VtIDB4JTA0eCIsRVhUUkFDVF8xNkJJVFMoJnRwLT50aF9zdW0pKTsKLQkJCWlmIChzdW0gIT0gMCkgewotCQkJCXRjcF9zdW0gPSBFWFRSQUNUXzE2QklUUygmdHAtPnRoX3N1bSk7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgKGluY29ycmVjdCAoLT4gMHglMDR4KSwiLGluX2Nrc3VtX3Nob3VsZGJlKHRjcF9zdW0sIHN1bSkpOwotCQkJfSBlbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCIgKGNvcnJlY3QpLCIpOwotCi0JCX0KLQl9Ci0jZW5kaWYKLQotCWxlbmd0aCAtPSBobGVuOwotCWlmICh2ZmxhZyA+IDEgfHwgbGVuZ3RoID4gMCB8fCBmbGFncyAmIChUSF9TWU4gfCBUSF9GSU4gfCBUSF9SU1QpKQotCQkodm9pZClwcmludGYoIiAldToldSgldSkiLCBzZXEsIHNlcSArIGxlbmd0aCwgbGVuZ3RoKTsKLQlpZiAoZmxhZ3MgJiBUSF9BQ0spCi0JCSh2b2lkKXByaW50ZigiIGFjayAldSIsIGFjayk7Ci0KLQkodm9pZClwcmludGYoIiB3aW4gJWQiLCB3aW4pOwotCi0JaWYgKGZsYWdzICYgVEhfVVJHKQotCQkodm9pZClwcmludGYoIiB1cmcgJWQiLCB1cnApOwotCS8qCi0JICogSGFuZGxlIGFueSBvcHRpb25zLgotCSAqLwotCWlmIChobGVuID4gc2l6ZW9mKCp0cCkpIHsKLQkJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcDsKLQkJcmVnaXN0ZXIgdV9pbnQgaSwgb3B0LCBkYXRhbGVuOwotCQlyZWdpc3RlciB1X2ludCBsZW47Ci0KLQkJaGxlbiAtPSBzaXplb2YoKnRwKTsKLQkJY3AgPSAoY29uc3QgdV9jaGFyICopdHAgKyBzaXplb2YoKnRwKTsKLQkJcHV0Y2hhcignICcpOwotCQljaCA9ICc8JzsKLQkJd2hpbGUgKGhsZW4gPiAwKSB7Ci0JCQlwdXRjaGFyKGNoKTsKLQkJCVRDSEVDSygqY3ApOwotCQkJb3B0ID0gKmNwKys7Ci0JCQlpZiAoWkVST0xFTk9QVChvcHQpKQotCQkJCWxlbiA9IDE7Ci0JCQllbHNlIHsKLQkJCQlUQ0hFQ0soKmNwKTsKLQkJCQlsZW4gPSAqY3ArKzsJLyogdG90YWwgaW5jbHVkaW5nIHR5cGUsIGxlbiAqLwotCQkJCWlmIChsZW4gPCAyIHx8IGxlbiA+IGhsZW4pCi0JCQkJCWdvdG8gYmFkOwotCQkJCS0taGxlbjsJCS8qIGFjY291bnQgZm9yIGxlbmd0aCBieXRlICovCi0JCQl9Ci0JCQktLWhsZW47CQkJLyogYWNjb3VudCBmb3IgdHlwZSBieXRlICovCi0JCQlkYXRhbGVuID0gMDsKLQotLyogQmFpbCBpZiAibCIgYnl0ZXMgb2YgZGF0YSBhcmUgbm90IGxlZnQgb3Igd2VyZSBub3QgY2FwdHVyZWQgICovCi0jZGVmaW5lIExFTkNIRUNLKGwpIHsgaWYgKChsKSA+IGhsZW4pIGdvdG8gYmFkOyBUQ0hFQ0syKCpjcCwgbCk7IH0KLQotCQkJc3dpdGNoIChvcHQpIHsKLQotCQkJY2FzZSBUQ1BPUFRfTUFYU0VHOgotCQkJCSh2b2lkKXByaW50ZigibXNzIik7Ci0JCQkJZGF0YWxlbiA9IDI7Ci0JCQkJTEVOQ0hFQ0soZGF0YWxlbik7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzE2QklUUyhjcCkpOwotCi0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgVENQT1BUX0VPTDoKLQkJCQkodm9pZClwcmludGYoImVvbCIpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRDUE9QVF9OT1A6Ci0JCQkJKHZvaWQpcHJpbnRmKCJub3AiKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBUQ1BPUFRfV1NDQUxFOgotCQkJCSh2b2lkKXByaW50Zigid3NjYWxlIik7Ci0JCQkJZGF0YWxlbiA9IDE7Ci0JCQkJTEVOQ0hFQ0soZGF0YWxlbik7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCAqY3ApOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRDUE9QVF9TQUNLT0s6Ci0JCQkJKHZvaWQpcHJpbnRmKCJzYWNrT0siKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBUQ1BPUFRfU0FDSzoKLQkJCQlkYXRhbGVuID0gbGVuIC0gMjsKLQkJCQlpZiAoZGF0YWxlbiAlIDggIT0gMCkgewotCQkJCQkodm9pZClwcmludGYoIm1hbGZvcm1lZCBzYWNrIik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdV9pbnQzMl90IHMsIGU7Ci0KLQkJCQkJKHZvaWQpcHJpbnRmKCJzYWNrICVkICIsIGRhdGFsZW4gLyA4KTsKLQkJCQkJZm9yIChpID0gMDsgaSA8IGRhdGFsZW47IGkgKz0gOCkgewotCQkJCQkJTEVOQ0hFQ0soaSArIDQpOwotCQkJCQkJcyA9IEVYVFJBQ1RfMzJCSVRTKGNwICsgaSk7Ci0JCQkJCQlMRU5DSEVDSyhpICsgOCk7Ci0JCQkJCQllID0gRVhUUkFDVF8zMkJJVFMoY3AgKyBpICsgNCk7Ci0JCQkJCQlpZiAodGhyZXYpIHsKLQkJCQkJCQlzIC09IHRoc2VxOwotCQkJCQkJCWUgLT0gdGhzZXE7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXMgLT0gdGhhY2s7Ci0JCQkJCQkJZSAtPSB0aGFjazsKLQkJCQkJCX0KLQkJCQkJCSh2b2lkKXByaW50ZigieyV1OiV1fSIsIHMsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRDUE9QVF9FQ0hPOgotCQkJCSh2b2lkKXByaW50ZigiZWNobyIpOwotCQkJCWRhdGFsZW4gPSA0OwotCQkJCUxFTkNIRUNLKGRhdGFsZW4pOwotCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBUQ1BPUFRfRUNIT1JFUExZOgotCQkJCSh2b2lkKXByaW50ZigiZWNob3JlcGx5Iik7Ci0JCQkJZGF0YWxlbiA9IDQ7Ci0JCQkJTEVOQ0hFQ0soZGF0YWxlbik7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRDUE9QVF9USU1FU1RBTVA6Ci0JCQkJKHZvaWQpcHJpbnRmKCJ0aW1lc3RhbXAiKTsKLQkJCQlkYXRhbGVuID0gODsKLQkJCQlMRU5DSEVDSyg0KTsKLQkJCQkodm9pZClwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKGNwKSk7Ci0JCQkJTEVOQ0hFQ0soZGF0YWxlbik7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCArIDQpKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBUQ1BPUFRfQ0M6Ci0JCQkJKHZvaWQpcHJpbnRmKCJjYyIpOwotCQkJCWRhdGFsZW4gPSA0OwotCQkJCUxFTkNIRUNLKGRhdGFsZW4pOwotCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBUQ1BPUFRfQ0NORVc6Ci0JCQkJKHZvaWQpcHJpbnRmKCJjY25ldyIpOwotCQkJCWRhdGFsZW4gPSA0OwotCQkJCUxFTkNIRUNLKGRhdGFsZW4pOwotCQkJCSh2b2lkKXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoY3ApKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBUQ1BPUFRfQ0NFQ0hPOgotCQkJCSh2b2lkKXByaW50ZigiY2NlY2hvIik7Ci0JCQkJZGF0YWxlbiA9IDQ7Ci0JCQkJTEVOQ0hFQ0soZGF0YWxlbik7Ci0JCQkJKHZvaWQpcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUyhjcCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFRDUE9QVF9TSUdOQVRVUkU6Ci0JCQkJKHZvaWQpcHJpbnRmKCJtZDU6Iik7Ci0JCQkJZGF0YWxlbiA9IFRDUF9TSUdMRU47Ci0JCQkJTEVOQ0hFQ0soZGF0YWxlbik7Ci0jaWZkZWYgSEFWRV9MSUJDUllQVE8KLQkJCQlzd2l0Y2ggKHRjcF92ZXJpZnlfc2lnbmF0dXJlKGlwLCB0cCwKLQkJCQkgICAgYnAgKyBUSF9PRkYodHApICogNCwgbGVuZ3RoLCBjcCkpIHsKLQotCQkJCWNhc2UgU0lHTkFUVVJFX1ZBTElEOgotCQkJCQkodm9pZClwcmludGYoInZhbGlkIik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBTSUdOQVRVUkVfSU5WQUxJRDoKLQkJCQkJKHZvaWQpcHJpbnRmKCJpbnZhbGlkIik7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBDQU5UX0NIRUNLX1NJR05BVFVSRToKLQkJCQkJKHZvaWQpcHJpbnRmKCJjYW4ndCBjaGVjayAtICIpOwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgVENQX1NJR0xFTjsgKytpKQotCQkJCQkJKHZvaWQpcHJpbnRmKCIlMDJ4IiwgY3BbaV0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0jZWxzZQotCQkJCWZvciAoaSA9IDA7IGkgPCBUQ1BfU0lHTEVOOyArK2kpCi0JCQkJCSh2b2lkKXByaW50ZigiJTAyeCIsIGNwW2ldKTsKLSNlbmRpZgotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCSh2b2lkKXByaW50Zigib3B0LSV1OiIsIG9wdCk7Ci0JCQkJZGF0YWxlbiA9IGxlbiAtIDI7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGRhdGFsZW47ICsraSkgewotCQkJCQlMRU5DSEVDSyhpKTsKLQkJCQkJKHZvaWQpcHJpbnRmKCIlMDJ4IiwgY3BbaV0pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogQWNjb3VudCBmb3IgZGF0YSBwcmludGVkICovCi0JCQljcCArPSBkYXRhbGVuOwotCQkJaGxlbiAtPSBkYXRhbGVuOwotCi0JCQkvKiBDaGVjayBzcGVjaWZpY2F0aW9uIGFnYWluc3Qgb2JzZXJ2ZWQgbGVuZ3RoICovCi0JCQkrK2RhdGFsZW47CQkJLyogb3B0aW9uIG9jdGV0ICovCi0JCQlpZiAoIVpFUk9MRU5PUFQob3B0KSkKLQkJCQkrK2RhdGFsZW47CQkvKiBzaXplIG9jdGV0ICovCi0JCQlpZiAoZGF0YWxlbiAhPSBsZW4pCi0JCQkJKHZvaWQpcHJpbnRmKCJbbGVuICVkXSIsIGxlbik7Ci0JCQljaCA9ICcsJzsKLQkJCWlmIChvcHQgPT0gVENQT1BUX0VPTCkKLQkJCQlicmVhazsKLQkJfQotCQlwdXRjaGFyKCc+Jyk7Ci0JfQotCi0JaWYgKGxlbmd0aCA8PSAwKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIERlY29kZSBwYXlsb2FkIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlicCArPSBUSF9PRkYodHApICogNDsKLQlpZiAoZmxhZ3MgJiBUSF9SU1QpIHsKLQkJaWYgKHZmbGFnKQotCQkJcHJpbnRfdGNwX3JzdF9kYXRhKGJwLCBsZW5ndGgpOwotCX0gZWxzZSB7Ci0JCWlmIChzcG9ydCA9PSBURUxORVRfUE9SVCB8fCBkcG9ydCA9PSBURUxORVRfUE9SVCkgewotCQkJaWYgKCFxZmxhZyAmJiB2ZmxhZykKLQkJCQl0ZWxuZXRfcHJpbnQoYnAsIGxlbmd0aCk7Ci0JCX0gZWxzZSBpZiAoc3BvcnQgPT0gQkdQX1BPUlQgfHwgZHBvcnQgPT0gQkdQX1BPUlQpCi0JCQliZ3BfcHJpbnQoYnAsIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKHNwb3J0ID09IFBQVFBfUE9SVCB8fCBkcG9ydCA9PSBQUFRQX1BPUlQpCi0JCQlwcHRwX3ByaW50KGJwKTsKLSNpZmRlZiBUQ1BEVU1QX0RPX1NNQgotCQllbHNlIGlmIChzcG9ydCA9PSBORVRCSU9TX1NTTl9QT1JUIHx8IGRwb3J0ID09IE5FVEJJT1NfU1NOX1BPUlQpCi0JCQluYnRfdGNwX3ByaW50KGJwLCBsZW5ndGgpOwotI2VuZGlmCi0JCWVsc2UgaWYgKHNwb3J0ID09IEJFRVBfUE9SVCB8fCBkcG9ydCA9PSBCRUVQX1BPUlQpCi0JCQliZWVwX3ByaW50KGJwLCBsZW5ndGgpOwotCQllbHNlIGlmIChsZW5ndGggPiAyICYmCi0JCSAgICAoc3BvcnQgPT0gTkFNRVNFUlZFUl9QT1JUIHx8IGRwb3J0ID09IE5BTUVTRVJWRVJfUE9SVCB8fAotCQkgICAgIHNwb3J0ID09IE1VTFRJQ0FTVEROU19QT1JUIHx8IGRwb3J0ID09IE1VTFRJQ0FTVEROU19QT1JUKSkgewotCQkJLyoKLQkJCSAqIFRDUCBETlMgcXVlcnkgaGFzIDJieXRlIGxlbmd0aCBhdCB0aGUgaGVhZC4KLQkJCSAqIFhYWCBwYWNrZXQgY291bGQgYmUgdW5hbGlnbmVkLCBpdCBjYW4gZ28gc3RyYW5nZQotCQkJICovCi0JCQluc19wcmludChicCArIDIsIGxlbmd0aCAtIDIsIDApOwotCQl9IGVsc2UgaWYgKHNwb3J0ID09IE1TRFBfUE9SVCB8fCBkcG9ydCA9PSBNU0RQX1BPUlQpIHsKLQkJCW1zZHBfcHJpbnQoYnAsIGxlbmd0aCk7Ci0JCX0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChsZW5ndGggPiAwICYmIChzcG9ydCA9PSBMRFBfUE9SVCB8fCBkcG9ydCA9PSBMRFBfUE9SVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxkcF9wcmludChicCwgbGVuZ3RoKTsKLQkJfQotCX0KLQlyZXR1cm47Ci1iYWQ6Ci0JZnB1dHMoIltiYWQgb3B0XSIsIHN0ZG91dCk7Ci0JaWYgKGNoICE9ICdcMCcpCi0JCXB1dGNoYXIoJz4nKTsKLQlyZXR1cm47Ci10cnVuYzoKLQlmcHV0cygiW3x0Y3BdIiwgc3Rkb3V0KTsKLQlpZiAoY2ggIT0gJ1wwJykKLQkJcHV0Y2hhcignPicpOwotfQotCi0vKgotICogUkZDMTEyMiBzYXlzIHRoZSBmb2xsb3dpbmcgb24gZGF0YSBpbiBSU1Qgc2VnbWVudHM6Ci0gKgotICogICAgICAgICA0LjIuMi4xMiAgUlNUIFNlZ21lbnQ6IFJGQy03OTMgU2VjdGlvbiAzLjQKLSAqCi0gKiAgICAgICAgICAgIEEgVENQIFNIT1VMRCBhbGxvdyBhIHJlY2VpdmVkIFJTVCBzZWdtZW50IHRvIGluY2x1ZGUgZGF0YS4KLSAqCi0gKiAgICAgICAgICAgIERJU0NVU1NJT04KLSAqICAgICAgICAgICAgICAgICBJdCBoYXMgYmVlbiBzdWdnZXN0ZWQgdGhhdCBhIFJTVCBzZWdtZW50IGNvdWxkIGNvbnRhaW4KLSAqICAgICAgICAgICAgICAgICBBU0NJSSB0ZXh0IHRoYXQgZW5jb2RlZCBhbmQgZXhwbGFpbmVkIHRoZSBjYXVzZSBvZiB0aGUKLSAqICAgICAgICAgICAgICAgICBSU1QuICBObyBzdGFuZGFyZCBoYXMgeWV0IGJlZW4gZXN0YWJsaXNoZWQgZm9yIHN1Y2gKLSAqICAgICAgICAgICAgICAgICBkYXRhLgotICoKLSAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfdGNwX3JzdF9kYXRhKHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqc3AsIHVfaW50IGxlbmd0aCkKLXsKLQlpbnQgYzsKLQotCWlmIChUVEVTVDIoKnNwLCBsZW5ndGgpKQotCQlwcmludGYoIiBbUlNUIik7Ci0JZWxzZQotCQlwcmludGYoIiBbIVJTVCIpOwotCWlmIChsZW5ndGggPiBNQVhfUlNUX0RBVEFfTEVOKSB7Ci0JCWxlbmd0aCA9IE1BWF9SU1RfREFUQV9MRU47CS8qIGNhbiB1c2UgLVggZm9yIGxvbmdlciAqLwotCQlwdXRjaGFyKCcrJyk7CQkJLyogaW5kaWNhdGUgd2UgdHJ1bmNhdGUgKi8KLQl9Ci0JcHV0Y2hhcignICcpOwotCXdoaWxlIChsZW5ndGgtLSAmJiBzcCA8PSBzbmFwZW5kKSB7Ci0JCWMgPSAqc3ArKzsKLQkJc2FmZXB1dGNoYXIoYyk7Ci0JfQotCXB1dGNoYXIoJ10nKTsKLX0KLQotI2lmZGVmIEhBVkVfTElCQ1JZUFRPCi1zdGF0aWMgaW50Ci10Y3BfdmVyaWZ5X3NpZ25hdHVyZShjb25zdCBzdHJ1Y3QgaXAgKmlwLCBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0cCwKLSAgICBjb25zdCB1X2NoYXIgKmRhdGEsIGludCBsZW5ndGgsIGNvbnN0IHVfY2hhciAqcmN2c2lnKQotewotICAgICAgICBzdHJ1Y3QgdGNwaGRyIHRwMTsKLQl1X2NoYXIgc2lnW1RDUF9TSUdMRU5dOwotCWNoYXIgemVyb19wcm90byA9IDA7Ci0JTUQ1X0NUWCBjdHg7Ci0JdV9pbnQxNl90IHNhdmVjc3VtLCB0bGVuOwotI2lmZGVmIElORVQ2Ci0Jc3RydWN0IGlwNl9oZHIgKmlwNjsKLSNlbmRpZgotCXVfaW50MzJfdCBsZW4zMjsKLQl1X2ludDhfdCBueHQ7Ci0KLQl0cDEgPSAqdHA7Ci0KLQlpZiAodGNwbWQ1c2VjcmV0ID09IE5VTEwpCi0JCXJldHVybiAoQ0FOVF9DSEVDS19TSUdOQVRVUkUpOwotCi0JTUQ1X0luaXQoJmN0eCk7Ci0JLyoKLQkgKiBTdGVwIDE6IFVwZGF0ZSBNRDUgaGFzaCB3aXRoIElQIHBzZXVkby1oZWFkZXIuCi0JICovCi0JaWYgKElQX1YoaXApID09IDQpIHsKLQkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZpcC0+aXBfc3JjLCBzaXplb2YoaXAtPmlwX3NyYykpOwotCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJmlwLT5pcF9kc3QsIHNpemVvZihpcC0+aXBfZHN0KSk7Ci0JCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmemVyb19wcm90bywgc2l6ZW9mKHplcm9fcHJvdG8pKTsKLQkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZpcC0+aXBfcCwgc2l6ZW9mKGlwLT5pcF9wKSk7Ci0JCXRsZW4gPSBFWFRSQUNUXzE2QklUUygmaXAtPmlwX2xlbikgLSBJUF9ITChpcCkgKiA0OwotCQl0bGVuID0gaHRvbnModGxlbik7Ci0JCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmdGxlbiwgc2l6ZW9mKHRsZW4pKTsKLSNpZmRlZiBJTkVUNgotCX0gZWxzZSBpZiAoSVBfVihpcCkgPT0gNikgewotCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKilpcDsKLQkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZpcDYtPmlwNl9zcmMsIHNpemVvZihpcDYtPmlwNl9zcmMpKTsKLQkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZpcDYtPmlwNl9kc3QsIHNpemVvZihpcDYtPmlwNl9kc3QpKTsKLQkJbGVuMzIgPSBodG9ubChudG9ocyhpcDYtPmlwNl9wbGVuKSk7Ci0JCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmbGVuMzIsIHNpemVvZihsZW4zMikpOwotCQlueHQgPSAwOwotCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJm54dCwgc2l6ZW9mKG54dCkpOwotCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJm54dCwgc2l6ZW9mKG54dCkpOwotCQlNRDVfVXBkYXRlKCZjdHgsIChjaGFyICopJm54dCwgc2l6ZW9mKG54dCkpOwotCQlueHQgPSBJUFBST1RPX1RDUDsKLQkJTUQ1X1VwZGF0ZSgmY3R4LCAoY2hhciAqKSZueHQsIHNpemVvZihueHQpKTsKLSNlbmRpZgotCX0gZWxzZQotCQlyZXR1cm4gKENBTlRfQ0hFQ0tfU0lHTkFUVVJFKTsKLQotCS8qCi0JICogU3RlcCAyOiBVcGRhdGUgTUQ1IGhhc2ggd2l0aCBUQ1AgaGVhZGVyLCBleGNsdWRpbmcgb3B0aW9ucy4KLQkgKiBUaGUgVENQIGNoZWNrc3VtIG11c3QgYmUgc2V0IHRvIHplcm8uCi0JICovCi0Jc2F2ZWNzdW0gPSB0cDEudGhfc3VtOwotCXRwMS50aF9zdW0gPSAwOwotCU1ENV9VcGRhdGUoJmN0eCwgKGNoYXIgKikmdHAxLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwotCXRwMS50aF9zdW0gPSBzYXZlY3N1bTsKLQkvKgotCSAqIFN0ZXAgMzogVXBkYXRlIE1ENSBoYXNoIHdpdGggVENQIHNlZ21lbnQgZGF0YSwgaWYgcHJlc2VudC4KLQkgKi8KLQlpZiAobGVuZ3RoID4gMCkKLQkJTUQ1X1VwZGF0ZSgmY3R4LCBkYXRhLCBsZW5ndGgpOwotCS8qCi0JICogU3RlcCA0OiBVcGRhdGUgTUQ1IGhhc2ggd2l0aCBzaGFyZWQgc2VjcmV0LgotCSAqLwotCU1ENV9VcGRhdGUoJmN0eCwgdGNwbWQ1c2VjcmV0LCBzdHJsZW4odGNwbWQ1c2VjcmV0KSk7Ci0JTUQ1X0ZpbmFsKHNpZywgJmN0eCk7Ci0KLQlpZiAobWVtY21wKHJjdnNpZywgc2lnLCBUQ1BfU0lHTEVOKSA9PSAwKQotCQlyZXR1cm4gKFNJR05BVFVSRV9WQUxJRCk7Ci0JZWxzZQotCQlyZXR1cm4gKFNJR05BVFVSRV9JTlZBTElEKTsKLX0KLSNlbmRpZiAvKiBIQVZFX0xJQkNSWVBUTyAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtdGVsbmV0LmMgYi9wcmludC10ZWxuZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg4ODcyNy4uMDAwMDAwMAotLS0gYS9wcmludC10ZWxuZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKgkkTmV0QlNEOiBwcmludC10ZWxuZXQuYyx2IDEuMiAxOTk5LzEwLzExIDEyOjQwOjEyIHNqZyBFeHAgJCAJKi8KLQotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTggVGhlIE5ldEJTRCBGb3VuZGF0aW9uLCBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gVGhlIE5ldEJTRCBGb3VuZGF0aW9uCi0gKiBieSBTaW1vbiBKLiBHZXJyYXR5LgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiAgICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgTmV0QlNECi0gKiAgICAgICAgRm91bmRhdGlvbiwgSW5jLiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIE5ldEJTRCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBORVRCU0QgRk9VTkRBVElPTiwgSU5DLiBBTkQgQ09OVFJJQlVUT1JTCi0gKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEZPVU5EQVRJT04gT1IgQ09OVFJJQlVUT1JTCi0gKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0gKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgotICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCi0gKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgotICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCi0gKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotLyoKLSAqICAgICAgQCgjKUNvcHlyaWdodCAoYykgMTk5NCwgU2ltb24gSi4gR2VycmF0eS4KLSAqCi0gKiAgICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gIEl0IGNvbWVzIHdpdGggTk8gV0FSUkFOVFkuCi0gKiAgICAgIFBlcm1pc3Npb24gdG8gdXNlLCBtb2RpZnkgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb3VyY2UgY29kZQotICogICAgICBpcyBncmFudGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zLgotICogICAgICAxLyB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIG5vdGljZQotICogICAgICBhcmUgcHJlc2VydmVkIGluIGFsbCBjb3BpZXMuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdGVsbmV0LmMsdiAxLjI0IDIwMDMvMTIvMjkgMTE6MDU6MTAgaGFubmVzIEV4cCAkIjsKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLSNkZWZpbmUgVEVMQ01EUwotI2RlZmluZSBURUxPUFRTCi0jaW5jbHVkZSAidGVsbmV0LmgiCi0KLS8qIG5vcm1hbCAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNtZHNbXSA9IHsKLQkiSVMiLCAiU0VORCIsICJJTkZPIiwKLX07Ci0KLS8qIDM3OiBBdXRoZW50aWNhdGlvbiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmF1dGhjbWRbXSA9IHsKLQkiSVMiLCAiU0VORCIsICJSRVBMWSIsICJOQU1FIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqYXV0aHR5cGVbXSA9IHsKLQkiTlVMTCIsICJLRVJCRVJPU19WNCIsICJLRVJCRVJPU19WNSIsICJTUFgiLCAiTUlOSyIsCi0JIlNSUCIsICJSU0EiLCAiU1NMIiwgTlVMTCwgTlVMTCwKLQkiTE9LSSIsICJTU0EiLCAiS0VBX1NKIiwgIktFQV9TSl9JTlRFRyIsICJEU1MiLAotCSJOVExNIiwKLX07Ci0KLS8qIDM4OiBFbmNyeXB0aW9uICovCi1zdGF0aWMgY29uc3QgY2hhciAqZW5jY21kW10gPSB7Ci0JIklTIiwgIlNVUFBPUlQiLCAiUkVQTFkiLCAiU1RBUlQiLCAiRU5EIiwKLQkiUkVRVUVTVC1TVEFSVCIsICJSRVFVRVNULUVORCIsICJFTkRfS0VZSUQiLCAiREVDX0tFWUlEIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqZW5jdHlwZVtdID0gewotCSJOVUxMIiwgIkRFU19DRkI2NCIsICJERVNfT0ZCNjQiLCAiREVTM19DRkI2NCIsICJERVMzX09GQjY0IiwKLQlOVUxMLCAiQ0FTVDVfNDBfQ0ZCNjQiLCAiQ0FTVDVfNDBfT0ZCNjQiLCAiQ0FTVDEyOF9DRkI2NCIsICJDQVNUMTI4X09GQjY0IiwKLX07Ci0KLSNkZWZpbmUgU1RSX09SX0lEKHgsIHRhYikgXAotCSgoKHgpIDwgc2l6ZW9mKHRhYikvc2l6ZW9mKHRhYlswXSkgJiYgdGFiWyh4KV0pID8gdGFiWyh4KV0gOiBudW1zdHIoeCkpCi0KLXN0YXRpYyBjaGFyICoKLW51bXN0cihpbnQgeCkKLXsKLQlzdGF0aWMgY2hhciBidWZbMjBdOwotCi0Jc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUjeCIsIHgpOwotCXJldHVybiBidWY7Ci19Ci0KLS8qIHNwIHBvaW50cyB0byBJQUMgYnl0ZSAqLwotc3RhdGljIGludAotdGVsbmV0X3BhcnNlKGNvbnN0IHVfY2hhciAqc3AsIHVfaW50IGxlbmd0aCwgaW50IHByaW50KQotewotCWludCBpLCB4OwotCXVfaW50IGM7Ci0JY29uc3QgdV9jaGFyICpvc3AsICpwOwotI2RlZmluZSBGRVRDSChjLCBzcCwgbGVuZ3RoKSBcCi0JZG8geyBcCi0JCWlmIChsZW5ndGggPCAxKSBcCi0JCQlnb3RvIHBrdGVuZDsgXAotCQlUQ0hFQ0soKnNwKTsgXAotCQljID0gKnNwKys7IFwKLQkJbGVuZ3RoLS07IFwKLQl9IHdoaWxlICgwKQotCi0Jb3NwID0gc3A7Ci0KLQlGRVRDSChjLCBzcCwgbGVuZ3RoKTsKLQlpZiAoYyAhPSBJQUMpCi0JCWdvdG8gcGt0ZW5kOwotCUZFVENIKGMsIHNwLCBsZW5ndGgpOwotCWlmIChjID09IElBQykgewkJLyogPElBQz48SUFDPiEgKi8KLQkJaWYgKHByaW50KQotCQkJcHJpbnRmKCJJQUMgSUFDIik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpID0gYyAtIFRFTENNRF9GSVJTVDsKLQlpZiAoaSA8IDAgfHwgaSA+IElBQyAtIFRFTENNRF9GSVJTVCkKLQkJZ290byBwa3RlbmQ7Ci0KLQlzd2l0Y2ggKGMpIHsKLQljYXNlIERPTlQ6Ci0JY2FzZSBETzoKLQljYXNlIFdPTlQ6Ci0JY2FzZSBXSUxMOgotCWNhc2UgU0I6Ci0JCS8qIERPTlQvRE8vV09OVC9XSUxMIHggKi8KLQkJRkVUQ0goeCwgc3AsIGxlbmd0aCk7Ci0JCWlmICh4ID49IDAgJiYgeCA8IE5URUxPUFRTKSB7Ci0JCQlpZiAocHJpbnQpCi0JCQkJKHZvaWQpcHJpbnRmKCIlcyAlcyIsIHRlbGNtZHNbaV0sIHRlbG9wdHNbeF0pOwotCQl9IGVsc2UgewotCQkJaWYgKHByaW50KQotCQkJCSh2b2lkKXByaW50ZigiJXMgJSN4IiwgdGVsY21kc1tpXSwgeCk7Ci0JCX0KLQkJaWYgKGMgIT0gU0IpCi0JCQlicmVhazsKLQkJLyogSUFDIFNCIC4uLi4gSUFDIFNFICovCi0JCXAgPSBzcDsKLQkJd2hpbGUgKGxlbmd0aCA+ICh1X2ludCkocCArIDEgLSBzcCkpIHsKLQkJCWlmIChwWzBdID09IElBQyAmJiBwWzFdID09IFNFKQotCQkJCWJyZWFrOwotCQkJcCsrOwotCQl9Ci0JCWlmICgqcCAhPSBJQUMpCi0JCQlnb3RvIHBrdGVuZDsKLQotCQlzd2l0Y2ggKHgpIHsKLQkJY2FzZSBURUxPUFRfQVVUSEVOVElDQVRJT046Ci0JCQlpZiAocCA8PSBzcCkKLQkJCQlicmVhazsKLQkJCUZFVENIKGMsIHNwLCBsZW5ndGgpOwotCQkJaWYgKHByaW50KQotCQkJCSh2b2lkKXByaW50ZigiICVzIiwgU1RSX09SX0lEKGMsIGF1dGhjbWQpKTsKLQkJCWlmIChwIDw9IHNwKQotCQkJCWJyZWFrOwotCQkJRkVUQ0goYywgc3AsIGxlbmd0aCk7Ci0JCQlpZiAocHJpbnQpCi0JCQkJKHZvaWQpcHJpbnRmKCIgJXMiLCBTVFJfT1JfSUQoYywgYXV0aHR5cGUpKTsKLQkJCWJyZWFrOwotCQljYXNlIFRFTE9QVF9FTkNSWVBUOgotCQkJaWYgKHAgPD0gc3ApCi0JCQkJYnJlYWs7Ci0JCQlGRVRDSChjLCBzcCwgbGVuZ3RoKTsKLQkJCWlmIChwcmludCkKLQkJCQkodm9pZClwcmludGYoIiAlcyIsIFNUUl9PUl9JRChjLCBlbmNjbWQpKTsKLQkJCWlmIChwIDw9IHNwKQotCQkJCWJyZWFrOwotCQkJRkVUQ0goYywgc3AsIGxlbmd0aCk7Ci0JCQlpZiAocHJpbnQpCi0JCQkJKHZvaWQpcHJpbnRmKCIgJXMiLCBTVFJfT1JfSUQoYywgZW5jdHlwZSkpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlpZiAocCA8PSBzcCkKLQkJCQlicmVhazsKLQkJCUZFVENIKGMsIHNwLCBsZW5ndGgpOwotCQkJaWYgKHByaW50KQotCQkJCSh2b2lkKXByaW50ZigiICVzIiwgU1RSX09SX0lEKGMsIGNtZHMpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCXdoaWxlIChwID4gc3ApIHsKLQkJCUZFVENIKHgsIHNwLCBsZW5ndGgpOwotCQkJaWYgKHByaW50KQotCQkJCSh2b2lkKXByaW50ZigiICUjeCIsIHgpOwotCQl9Ci0JCS8qIHRlcm1pbmF0aW5nIElBQyBTRSAqLwotCQlpZiAocHJpbnQpCi0JCQkodm9pZClwcmludGYoIiBTRSIpOwotCQlzcCArPSAyOwotCQlsZW5ndGggLT0gMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaWYgKHByaW50KQotCQkJKHZvaWQpcHJpbnRmKCIlcyIsIHRlbGNtZHNbaV0pOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCXJldHVybiBzcCAtIG9zcDsKLQotdHJ1bmM6Ci0JKHZvaWQpcHJpbnRmKCJbfHRlbG5ldF0iKTsKLXBrdGVuZDoKLQlyZXR1cm4gLTE7Ci0jdW5kZWYgRkVUQ0gKLX0KLQotdm9pZAotdGVsbmV0X3ByaW50KGNvbnN0IHVfY2hhciAqc3AsIHVfaW50IGxlbmd0aCkKLXsKLQlpbnQgZmlyc3QgPSAxOwotCWNvbnN0IHVfY2hhciAqb3NwOwotCWludCBsOwotCi0Jb3NwID0gc3A7Ci0KLQl3aGlsZSAobGVuZ3RoID4gMCAmJiAqc3AgPT0gSUFDKSB7Ci0JCWwgPSB0ZWxuZXRfcGFyc2Uoc3AsIGxlbmd0aCwgMCk7Ci0JCWlmIChsIDwgMCkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIG5vdyBwcmludCBpdAotCQkgKi8KLQkJaWYgKFhmbGFnICYmIDIgPCB2ZmxhZykgewotCQkJaWYgKGZpcnN0KQotCQkJCXByaW50ZigiXG5UZWxuZXQ6Iik7Ci0JCQloZXhfcHJpbnRfd2l0aF9vZmZzZXQoIlxuIiwgc3AsIGwsIHNwIC0gb3NwKTsKLQkJCWlmIChsID4gOCkKLQkJCQlwcmludGYoIlxuXHRcdFx0XHQiKTsKLQkJCWVsc2UKLQkJCQlwcmludGYoIiUqc1x0IiwgKDggLSBsKSAqIDMsICIiKTsKLQkJfSBlbHNlCi0JCQlwcmludGYoIiVzIiwgKGZpcnN0KSA/ICIgW3RlbG5ldCAiIDogIiwgIik7Ci0KLQkJKHZvaWQpdGVsbmV0X3BhcnNlKHNwLCBsZW5ndGgsIDEpOwotCQlmaXJzdCA9IDA7Ci0KLQkJc3AgKz0gbDsKLQkJbGVuZ3RoIC09IGw7Ci0JfQotCWlmICghZmlyc3QpIHsKLQkJaWYgKFhmbGFnICYmIDIgPCB2ZmxhZykKLQkJCXByaW50ZigiXG4iKTsKLQkJZWxzZQotCQkJcHJpbnRmKCJdIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtdGZ0cC5jIGIvcHJpbnQtdGZ0cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE3ODk4Li4wMDAwMDAwCi0tLSBhL3ByaW50LXRmdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogRm9ybWF0IGFuZCBwcmludCB0cml2aWFsIGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wgcGFja2V0cy4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC10ZnRwLmMsdiAxLjM3LjIuMSAyMDA3LzA5LzE0IDAxOjAzOjEyIGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2lmZGVmIFNFR1NJWkUKLSN1bmRlZiBTRUdTSVpFCQkJCQkvKiBTSU5JWCBzdWNrcyAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLSNpbmNsdWRlICJ0ZnRwLmgiCi0KLS8qIG9wIGNvZGUgdG8gc3RyaW5nIG1hcHBpbmcgKi8KLXN0YXRpYyBzdHJ1Y3QgdG9rIG9wMnN0cltdID0gewotCXsgUlJRLAkJIlJSUSIgfSwJLyogcmVhZCByZXF1ZXN0ICovCi0JeyBXUlEsCQkiV1JRIiB9LAkvKiB3cml0ZSByZXF1ZXN0ICovCi0JeyBEQVRBLAkJIkRBVEEiIH0sCS8qIGRhdGEgcGFja2V0ICovCi0JeyBBQ0ssCQkiQUNLIiB9LAkvKiBhY2tub3dsZWRnZW1lbnQgKi8KLQl7IEVSUk9SLAkiRVJST1IiIH0sCS8qIGVycm9yIGNvZGUgKi8KLQl7IE9BQ0ssCQkiT0FDSyIgfSwJLyogb3B0aW9uIGFja25vd2xlZGdlbWVudCAqLwotCXsgMCwJCU5VTEwgfQotfTsKLQotLyogZXJyb3IgY29kZSB0byBzdHJpbmcgbWFwcGluZyAqLwotc3RhdGljIHN0cnVjdCB0b2sgZXJyMnN0cltdID0gewotCXsgRVVOREVGLAkiRVVOREVGIiB9LAkvKiBub3QgZGVmaW5lZCAqLwotCXsgRU5PVEZPVU5ELAkiRU5PVEZPVU5EIiB9LAkvKiBmaWxlIG5vdCBmb3VuZCAqLwotCXsgRUFDQ0VTUywJIkVBQ0NFU1MiIH0sCS8qIGFjY2VzcyB2aW9sYXRpb24gKi8KLQl7IEVOT1NQQUNFLAkiRU5PU1BBQ0UiIH0sCS8qIGRpc2sgZnVsbCBvciBhbGxvY2F0aW9uIGV4Y2VlZGVkICovCi0JeyBFQkFET1AsCSJFQkFET1AiIH0sCS8qIGlsbGVnYWwgVEZUUCBvcGVyYXRpb24gKi8KLQl7IEVCQURJRCwJIkVCQURJRCIgfSwJLyogdW5rbm93biB0cmFuc2ZlciBJRCAqLwotCXsgRUVYSVNUUywJIkVFWElTVFMiIH0sCS8qIGZpbGUgYWxyZWFkeSBleGlzdHMgKi8KLQl7IEVOT1VTRVIsCSJFTk9VU0VSIiB9LAkvKiBubyBzdWNoIHVzZXIgKi8KLQl7IDAsCQlOVUxMIH0KLX07Ci0KLS8qCi0gKiBQcmludCB0cml2aWFsIGZpbGUgdHJhbnNmZXIgcHJvZ3JhbSByZXF1ZXN0cwotICovCi12b2lkCi10ZnRwX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKLXsKLQlyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGZ0cGhkciAqdHA7Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwOwotCXJlZ2lzdGVyIGludCBvcGNvZGUsIGk7Ci0Jc3RhdGljIGNoYXIgdHN0cltdID0gIiBbfHRmdHBdIjsKLQotCXRwID0gKGNvbnN0IHN0cnVjdCB0ZnRwaGRyICopYnA7Ci0KLQkvKiBQcmludCBsZW5ndGggKi8KLQlwcmludGYoIiAlZCIsIGxlbmd0aCk7Ci0KLQkvKiBQcmludCB0ZnRwIHJlcXVlc3QgdHlwZSAqLwotCVRDSEVDSyh0cC0+dGhfb3Bjb2RlKTsKLQlvcGNvZGUgPSBFWFRSQUNUXzE2QklUUygmdHAtPnRoX29wY29kZSk7Ci0JY3AgPSB0b2syc3RyKG9wMnN0ciwgInRmdHAtIyVkIiwgb3Bjb2RlKTsKLQlwcmludGYoIiAlcyIsIGNwKTsKLQkvKiBCYWlsIGlmIGJvZ3VzIG9wY29kZSAqLwotCWlmICgqY3AgPT0gJ3QnKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKG9wY29kZSkgewotCi0JY2FzZSBSUlE6Ci0JY2FzZSBXUlE6Ci0JY2FzZSBPQUNLOgotCQkvKgotCQkgKiBYWFggTm90IGFsbCBhcnBhL3RmdHAuaCdzIHNwZWNpZnkgdGhfc3R1ZmYgYXMgYW55Ci0JCSAqIGFycmF5OyB1c2UgYWRkcmVzcyBvZiB0aF9ibG9jayBpbnN0ZWFkCi0JCSAqLwotI2lmZGVmIG5vdGRlZgotCQlwID0gKHVfY2hhciAqKXRwLT50aF9zdHVmZjsKLSNlbHNlCi0JCXAgPSAodV9jaGFyICopJnRwLT50aF9ibG9jazsKLSNlbmRpZgotCQlwdXRjaGFyKCcgJyk7Ci0JCS8qIFByaW50IGZpbGVuYW1lIG9yIGZpcnN0IG9wdGlvbiAqLwotCQlpZiAob3Bjb2RlICE9IE9BQ0spCi0JCQlwdXRjaGFyKCciJyk7Ci0JCWkgPSBmbl9wcmludChwLCBzbmFwZW5kKTsKLQkJaWYgKG9wY29kZSAhPSBPQUNLKQotCQkJcHV0Y2hhcignIicpOwotCi0JCS8qIFByaW50IHRoZSBtb2RlIChSUlEgYW5kIFdSUSBvbmx5KSBhbmQgYW55IG9wdGlvbnMgKi8KLQkJd2hpbGUgKChwID0gKGNvbnN0IHVfY2hhciAqKXN0cmNocigoY29uc3QgY2hhciAqKXAsICdcMCcpKSAhPSBOVUxMKSB7Ci0JCQlpZiAobGVuZ3RoIDw9ICh1X2ludCkocCAtIChjb25zdCB1X2NoYXIgKikmdHAtPnRoX2Jsb2NrKSkKLQkJCQlicmVhazsKLQkJCXArKzsKLQkJCWlmICgqcCAhPSAnXDAnKSB7Ci0JCQkJcHV0Y2hhcignICcpOwotCQkJCWZuX3ByaW50KHAsIHNuYXBlbmQpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoaSkKLQkJCWdvdG8gdHJ1bmM7Ci0JCWJyZWFrOwotCi0JY2FzZSBBQ0s6Ci0JY2FzZSBEQVRBOgotCQlUQ0hFQ0sodHAtPnRoX2Jsb2NrKTsKLQkJcHJpbnRmKCIgYmxvY2sgJWQiLCBFWFRSQUNUXzE2QklUUygmdHAtPnRoX2Jsb2NrKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBFUlJPUjoKLQkJLyogUHJpbnQgZXJyb3IgY29kZSBzdHJpbmcgKi8KLQkJVENIRUNLKHRwLT50aF9jb2RlKTsKLQkJcHJpbnRmKCIgJXMgXCIiLCB0b2syc3RyKGVycjJzdHIsICJ0ZnRwLWVyci0jJWQgXCIiLAotCQkJCSAgICAgICBFWFRSQUNUXzE2QklUUygmdHAtPnRoX2NvZGUpKSk7Ci0JCS8qIFByaW50IGVycm9yIG1lc3NhZ2Ugc3RyaW5nICovCi0JCWkgPSBmbl9wcmludCgoY29uc3QgdV9jaGFyICopdHAtPnRoX2RhdGEsIHNuYXBlbmQpOwotCQlwdXRjaGFyKCciJyk7Ci0JCWlmIChpKQotCQkJZ290byB0cnVuYzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiBXZSBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQkJcHJpbnRmKCIodW5rbm93biAjJWQpIiwgb3Bjb2RlKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLXRydW5jOgotCWZwdXRzKHRzdHIsIHN0ZG91dCk7Ci0JcmV0dXJuOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtdGltZWQuYyBiL3ByaW50LXRpbWVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZjIyNDEuLjAwMDAwMDAKLS0tIGEvcHJpbnQtdGltZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIEJlbiBTbWl0aHVyc3QgPGJlbkBzY2llbnRpYS5kZW1vbi5jby51az4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXRpbWVkLmMsdiAxLjkgMjAwMy8xMS8xNiAwOTozNjo0MCBndXkgRXhwICQiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAidGltZWQuaCIKLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICp0c3B0eXBlW1RTUFRZUEVOVU1CRVJdID0KLSAgeyAiQU5ZIiwgIkFESlRJTUUiLCAiQUNLIiwgIk1BU1RFUlJFUSIsICJNQVNURVJBQ0siLCAiU0VUVElNRSIsICJNQVNURVJVUCIsCi0gICJTTEFWRVVQIiwgIkVMRUNUSU9OIiwgIkFDQ0VQVCIsICJSRUZVU0UiLCAiQ09ORkxJQ1QiLCAiUkVTT0xWRSIsICJRVUlUIiwKLSAgIkRBVEUiLCAiREFURVJFUSIsICJEQVRFQUNLIiwgIlRSQUNFT04iLCAiVFJBQ0VPRkYiLCAiTVNJVEUiLCAiTVNJVEVSRVEiLAotICAiVEVTVCIsICJTRVREQVRFIiwgIlNFVERBVEVSRVEiLCAiTE9PUCIgfTsKLQotdm9pZAotdGltZWRfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCkKLXsKLSNkZWZpbmUgZW5kb2YoeCkgKCh1X2NoYXIgKikmKHgpICsgc2l6ZW9mICh4KSkKLQlzdHJ1Y3QgdHNwICp0c3AgPSAoc3RydWN0IHRzcCAqKWJwOwotCWxvbmcgc2VjLCB1c2VjOwotCWNvbnN0IHVfY2hhciAqZW5kOwotCi0JaWYgKGVuZG9mKHRzcC0+dHNwX3R5cGUpID4gc25hcGVuZCkgewotCQlmcHV0cygiW3x0aW1lZF0iLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCWlmICh0c3AtPnRzcF90eXBlIDwgVFNQVFlQRU5VTUJFUikKLQkJcHJpbnRmKCJUU1BfJXMiLCB0c3B0eXBlW3RzcC0+dHNwX3R5cGVdKTsKLQllbHNlCi0JCXByaW50ZigiKHRzcF90eXBlICUjeCkiLCB0c3AtPnRzcF90eXBlKTsKLQotCWlmIChlbmRvZih0c3AtPnRzcF92ZXJzKSA+IHNuYXBlbmQpIHsKLQkJZnB1dHMoIiBbfHRpbWVkXSIsIHN0ZG91dCk7Ci0JCXJldHVybjsKLQl9Ci0JcHJpbnRmKCIgdmVycyAlZCIsIHRzcC0+dHNwX3ZlcnMpOwotCi0JaWYgKGVuZG9mKHRzcC0+dHNwX3NlcSkgPiBzbmFwZW5kKSB7Ci0JCWZwdXRzKCIgW3x0aW1lZF0iLCBzdGRvdXQpOwotCQlyZXR1cm47Ci0JfQotCXByaW50ZigiIHNlcSAlZCIsIHRzcC0+dHNwX3NlcSk7Ci0KLQlpZiAodHNwLT50c3BfdHlwZSA9PSBUU1BfTE9PUCkgewotCQlpZiAoZW5kb2YodHNwLT50c3BfaG9wY250KSA+IHNuYXBlbmQpIHsKLQkJCWZwdXRzKCIgW3x0aW1lZF0iLCBzdGRvdXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByaW50ZigiIGhvcGNudCAlZCIsIHRzcC0+dHNwX2hvcGNudCk7Ci0JfSBlbHNlIGlmICh0c3AtPnRzcF90eXBlID09IFRTUF9TRVRUSU1FIHx8Ci0JICB0c3AtPnRzcF90eXBlID09IFRTUF9BREpUSU1FIHx8Ci0JICB0c3AtPnRzcF90eXBlID09IFRTUF9TRVREQVRFIHx8Ci0JICB0c3AtPnRzcF90eXBlID09IFRTUF9TRVREQVRFUkVRKSB7Ci0JCWlmIChlbmRvZih0c3AtPnRzcF90aW1lKSA+IHNuYXBlbmQpIHsKLQkJCWZwdXRzKCIgW3x0aW1lZF0iLCBzdGRvdXQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNlYyA9IEVYVFJBQ1RfMzJCSVRTKCZ0c3AtPnRzcF90aW1lLnR2X3NlYyk7Ci0JCXVzZWMgPSBFWFRSQUNUXzMyQklUUygmdHNwLT50c3BfdGltZS50dl91c2VjKTsKLQkJaWYgKHVzZWMgPCAwKQotCQkJLyogY29ycnVwdCwgc2tpcCB0aGUgcmVzdCBvZiB0aGUgcGFja2V0ICovCi0JCQlyZXR1cm47Ci0JCWZwdXRzKCIgdGltZSAiLCBzdGRvdXQpOwotCQlpZiAoc2VjIDwgMCAmJiB1c2VjICE9IDApIHsKLQkJCXNlYysrOwotCQkJaWYgKHNlYyA9PSAwKQotCQkJCWZwdXRjKCctJywgc3Rkb3V0KTsKLQkJCXVzZWMgPSAxMDAwMDAwIC0gdXNlYzsKLQkJfQotCQlwcmludGYoIiVsZC4lMDZsZCIsIHNlYywgdXNlYyk7Ci0JfQotCi0JZW5kID0gbWVtY2hyKHRzcC0+dHNwX25hbWUsICdcMCcsIHNuYXBlbmQgLSAodV9jaGFyICopdHNwLT50c3BfbmFtZSk7Ci0JaWYgKGVuZCA9PSBOVUxMKQotCQlmcHV0cygiIFt8dGltZWRdIiwgc3Rkb3V0KTsKLQllbHNlIHsKLQkJZnB1dHMoIiBuYW1lICIsIHN0ZG91dCk7Ci0JCWZ3cml0ZSh0c3AtPnRzcF9uYW1lLCBlbmQgLSAodV9jaGFyICopdHNwLT50c3BfbmFtZSwgMSwgc3Rkb3V0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wcmludC10b2tlbi5jIGIvcHJpbnQtdG9rZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmY2NhNi4uMDAwMDAwMAotLS0gYS9wcmludC10b2tlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBIYWNrZWQgdmVyc2lvbiBvZiBwcmludC1ldGhlci5jICBMYXJyeSBMaWxlIDxsaWxlQHN0ZGlvLmNvbT4KLSAqCi0gKiBGdXJ0aGVyIHR3ZWFrZWQgdG8gbW9yZSBjbG9zZWx5IHJlc2VtYmxlIHByaW50LWZkZGkuYwotICoJR3V5IEhhcnJpcyA8Z3V5QGFsdW0ubWl0LmVkdT4KLSAqLwotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdG9rZW4uYyx2IDEuMjUuMi4yIDIwMDUvMTEvMTMgMTI6MTM6MDEgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0jaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCi0KLSNpbmNsdWRlICJldGhlci5oIgotI2luY2x1ZGUgInRva2VuLmgiCi0KLS8qIEV4dHJhY3Qgc3JjLCBkc3QgYWRkcmVzc2VzICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLWV4dHJhY3RfdG9rZW5fYWRkcnMoY29uc3Qgc3RydWN0IHRva2VuX2hlYWRlciAqdHJwLCBjaGFyICpmc3JjLCBjaGFyICpmZHN0KQotewotCW1lbWNweShmZHN0LCAoY29uc3QgY2hhciAqKXRycC0+dG9rZW5fZGhvc3QsIDYpOwotCW1lbWNweShmc3JjLCAoY29uc3QgY2hhciAqKXRycC0+dG9rZW5fc2hvc3QsIDYpOwotfQotCi0vKgotICogUHJpbnQgdGhlIFRSIE1BQyBoZWFkZXIKLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi10b2tlbl9oZHJfcHJpbnQocmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRva2VuX2hlYWRlciAqdHJwLCByZWdpc3RlciB1X2ludCBsZW5ndGgsCi0JICAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpmc3JjLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmZkc3QpCi17Ci0JY29uc3QgY2hhciAqc3JjbmFtZSwgKmRzdG5hbWU7Ci0KLQlzcmNuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmc3JjKTsKLQlkc3RuYW1lID0gZXRoZXJhZGRyX3N0cmluZyhmZHN0KTsKLQotCWlmICh2ZmxhZykKLQkJKHZvaWQpIHByaW50ZigiJTAyeCAlMDJ4ICVzICVzICVkOiAiLAotCQkgICAgICAgdHJwLT50b2tlbl9hYywKLQkJICAgICAgIHRycC0+dG9rZW5fZmMsCi0JCSAgICAgICBzcmNuYW1lLCBkc3RuYW1lLAotCQkgICAgICAgbGVuZ3RoKTsKLQllbHNlCi0JCXByaW50ZigiJXMgJXMgJWQ6ICIsIHNyY25hbWUsIGRzdG5hbWUsIGxlbmd0aCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpicm9hZGNhc3RfaW5kaWNhdG9yW10gPSB7Ci0JIk5vbi1Ccm9hZGNhc3QiLCAiTm9uLUJyb2FkY2FzdCIsCi0JIk5vbi1Ccm9hZGNhc3QiLCAiTm9uLUJyb2FkY2FzdCIsCi0JIkFsbC1yb3V0ZXMiLCAgICAiQWxsLXJvdXRlcyIsCi0JIlNpbmdsZS1yb3V0ZSIsICAiU2luZ2xlLXJvdXRlIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmRpcmVjdGlvbltdID0gewotCSJGb3J3YXJkIiwgIkJhY2t3YXJkIgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmxhcmdlc3RfZnJhbWVbXSA9IHsKLQkiNTE2IiwKLQkiMTUwMCIsCi0JIjIwNTIiLAotCSI0NDcyIiwKLQkiODE0NCIsCi0JIjExNDA3IiwKLQkiMTc4MDAiLAotCSI/PyIKLX07Ci0KLXVfaW50Ci10b2tlbl9wcmludChjb25zdCB1X2NoYXIgKnAsIHVfaW50IGxlbmd0aCwgdV9pbnQgY2FwbGVuKQotewotCWNvbnN0IHN0cnVjdCB0b2tlbl9oZWFkZXIgKnRycDsKLQl1X3Nob3J0IGV4dHJhY3RlZF9ldGhlcnR5cGU7Ci0Jc3RydWN0IGV0aGVyX2hlYWRlciBlaGRyOwotCXVfaW50IHJvdXRlX2xlbiA9IDAsIGhkcl9sZW4gPSBUT0tFTl9IRFJMRU47Ci0JaW50IHNlZzsKLQotCXRycCA9IChjb25zdCBzdHJ1Y3QgdG9rZW5faGVhZGVyICopcDsKLQotCWlmIChjYXBsZW4gPCBUT0tFTl9IRFJMRU4pIHsKLQkJcHJpbnRmKCJbfHRva2VuLXJpbmddIik7Ci0JCXJldHVybiBoZHJfbGVuOwotCX0KLQotCS8qCi0JICogR2V0IHRoZSBUUiBhZGRyZXNzZXMgaW50byBhIGNhbm9uaWNhbCBmb3JtCi0JICovCi0JZXh0cmFjdF90b2tlbl9hZGRycyh0cnAsIChjaGFyKilFU1JDKCZlaGRyKSwgKGNoYXIqKUVEU1QoJmVoZHIpKTsKLQotCS8qIEFkanVzdCBmb3Igc291cmNlIHJvdXRpbmcgaW5mb3JtYXRpb24gaW4gdGhlIE1BQyBoZWFkZXIgKi8KLQlpZiAoSVNfU09VUkNFX1JPVVRFRCh0cnApKSB7Ci0JCS8qIENsZWFyIHNvdXJjZS1yb3V0ZWQgYml0ICovCi0JCSpFU1JDKCZlaGRyKSAmPSAweDdmOwotCi0JCWlmIChlZmxhZykKLQkJCXRva2VuX2hkcl9wcmludCh0cnAsIGxlbmd0aCwgRVNSQygmZWhkciksIEVEU1QoJmVoZHIpKTsKLQotCQlyb3V0ZV9sZW4gPSBSSUZfTEVOR1RIKHRycCk7Ci0JCWlmICh2ZmxhZykgewotCQkJcHJpbnRmKCIlcyAiLCBicm9hZGNhc3RfaW5kaWNhdG9yW0JST0FEQ0FTVCh0cnApXSk7Ci0JCQlwcmludGYoIiVzIiwgZGlyZWN0aW9uW0RJUkVDVElPTih0cnApXSk7Ci0KLQkJCWZvciAoc2VnID0gMDsgc2VnIDwgU0VHTUVOVF9DT1VOVCh0cnApOyBzZWcrKykKLQkJCQlwcmludGYoIiBbJWQ6JWRdIiwgUklOR19OVU1CRVIodHJwLCBzZWcpLAotCQkJCSAgICBCUklER0VfTlVNQkVSKHRycCwgc2VnKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGYoInJ0ID0gJXgiLCBudG9ocyh0cnAtPnRva2VuX3JjZikpOwotCi0JCQlmb3IgKHNlZyA9IDA7IHNlZyA8IFNFR01FTlRfQ09VTlQodHJwKTsgc2VnKyspCi0JCQkJcHJpbnRmKCI6JXgiLCBudG9ocyh0cnAtPnRva2VuX3JzZWdbc2VnXSkpOwotCQl9Ci0JCXByaW50ZigiICglcykgIiwgbGFyZ2VzdF9mcmFtZVtMQVJHRVNUX0ZSQU1FKHRycCldKTsKLQl9IGVsc2UgewotCQlpZiAoZWZsYWcpCi0JCQl0b2tlbl9oZHJfcHJpbnQodHJwLCBsZW5ndGgsIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7Ci0JfQotCi0JLyogU2tpcCBvdmVyIHRva2VuIHJpbmcgTUFDIGhlYWRlciBhbmQgcm91dGluZyBpbmZvcm1hdGlvbiAqLwotCWhkcl9sZW4gKz0gcm91dGVfbGVuOwotCWxlbmd0aCAtPSBoZHJfbGVuOwotCXAgKz0gaGRyX2xlbjsKLQljYXBsZW4gLT0gaGRyX2xlbjsKLQotCS8qIEZyYW1lIENvbnRyb2wgZmllbGQgZGV0ZXJtaW5lcyBpbnRlcnByZXRhdGlvbiBvZiBwYWNrZXQgKi8KLQlpZiAoRlJBTUVfVFlQRSh0cnApID09IFRPS0VOX0ZDX0xMQykgewotCQkvKiBUcnkgdG8gcHJpbnQgdGhlIExMQy1sYXllciBoZWFkZXIgJiBoaWdoZXIgbGF5ZXJzICovCi0JCWlmIChsbGNfcHJpbnQocCwgbGVuZ3RoLCBjYXBsZW4sIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSwKLQkJICAgICZleHRyYWN0ZWRfZXRoZXJ0eXBlKSA9PSAwKSB7Ci0JCQkvKiBldGhlcl90eXBlIG5vdCBrbm93biwgcHJpbnQgcmF3IHBhY2tldCAqLwotCQkJaWYgKCFlZmxhZykKLQkJCQl0b2tlbl9oZHJfcHJpbnQodHJwLAotCQkJCSAgICBsZW5ndGggKyBUT0tFTl9IRFJMRU4gKyByb3V0ZV9sZW4sCi0JCQkJICAgIEVTUkMoJmVoZHIpLCBFRFNUKCZlaGRyKSk7Ci0JCQlpZiAoZXh0cmFjdGVkX2V0aGVydHlwZSkgewotCQkJCXByaW50ZigiKExMQyAlcykgIiwKLQkJCWV0aGVycHJvdG9fc3RyaW5nKGh0b25zKGV4dHJhY3RlZF9ldGhlcnR5cGUpKSk7Ci0JCQl9Ci0JCQlpZiAoIXN1cHByZXNzX2RlZmF1bHRfcHJpbnQpCi0JCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogU29tZSBraW5kcyBvZiBUUiBwYWNrZXQgd2UgY2Fubm90IGhhbmRsZSBpbnRlbGxpZ2VudGx5ICovCi0JCS8qIFhYWCAtIGRpc3NlY3QgTUFDIHBhY2tldHMgaWYgZnJhbWUgdHlwZSBpcyAwICovCi0JCWlmICghZWZsYWcpCi0JCQl0b2tlbl9oZHJfcHJpbnQodHJwLCBsZW5ndGggKyBUT0tFTl9IRFJMRU4gKyByb3V0ZV9sZW4sCi0JCQkgICAgRVNSQygmZWhkciksIEVEU1QoJmVoZHIpKTsKLQkJaWYgKCFzdXBwcmVzc19kZWZhdWx0X3ByaW50KQotCQkJZGVmYXVsdF9wcmludChwLCBjYXBsZW4pOwotCX0KLQlyZXR1cm4gKGhkcl9sZW4pOwotfQotCi0vKgotICogVGhpcyBpcyB0aGUgdG9wIGxldmVsIHJvdXRpbmUgb2YgdGhlIHByaW50ZXIuICAncCcgcG9pbnRzCi0gKiB0byB0aGUgVFIgaGVhZGVyIG9mIHRoZSBwYWNrZXQsICdoLT50cycgaXMgdGhlIHRpbWVzdGFtcCwKLSAqICdoLT5sZW4nIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBvZmYgdGhlIHdpcmUsIGFuZCAnaC0+Y2FwbGVuJwotICogaXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSBjYXB0dXJlZC4KLSAqLwotdV9pbnQKLXRva2VuX2lmX3ByaW50KGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpwKQotewotCXJldHVybiAodG9rZW5fcHJpbnQocCwgaC0+bGVuLCBoLT5jYXBsZW4pKTsKLX0KZGlmZiAtLWdpdCBhL3ByaW50LXVkcC5jIGIvcHJpbnQtdWRwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOTgzYjYuLjAwMDAwMDAKLS0tIGEvcHJpbnQtdWRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXVkcC5jLHYgMS4xMzguMi4xIDIwMDcvMDMvMjggMDc6NDU6NDYgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaWZkZWYgU0VHU0laRQotI3VuZGVmIFNFR1NJWkUKLSNlbmRpZgotLy8jaW5jbHVkZSA8YXJwYS90ZnRwLmg+Ci0jaW5jbHVkZSAidGZ0cC5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYXBwbGV0YWxrLmgiCi0KLSNpbmNsdWRlICJ1ZHAuaCIKLQotI2luY2x1ZGUgImlwLmgiCi0jaWZkZWYgSU5FVDYKLSNpbmNsdWRlICJpcDYuaCIKLSNlbmRpZgotI2luY2x1ZGUgImlwcHJvdG8uaCIKLSNpbmNsdWRlICJycGNfYXV0aC5oIgotI2luY2x1ZGUgInJwY19tc2cuaCIKLQotI2luY2x1ZGUgIm5hbWVzZXIuaCIKLSNpbmNsdWRlICJuZnMuaCIKLSNpbmNsdWRlICJib290cC5oIgotCi1zdHJ1Y3QgcnRjcGhkciB7Ci0JdV9pbnQxNl90IHJoX2ZsYWdzOwkvKiBUOjIgUDoxIENOVDo1IFBUOjggKi8KLQl1X2ludDE2X3QgcmhfbGVuOwkvKiBsZW5ndGggb2YgbWVzc2FnZSAoaW4gd29yZHMpICovCi0JdV9pbnQzMl90IHJoX3NzcmM7CS8qIHN5bmNocm9uaXphdGlvbiBzcmMgaWQgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQl1X2ludDMyX3QgdXBwZXI7CS8qIG1vcmUgc2lnbmlmaWNhbnQgMzIgYml0cyAqLwotCXVfaW50MzJfdCBsb3dlcjsJLyogbGVzcyBzaWduaWZpY2FudCAzMiBiaXRzICovCi19IG50cDY0OwotCi0vKgotICogU2VuZGVyIHJlcG9ydC4KLSAqLwotc3RydWN0IHJ0Y3Bfc3IgewotCW50cDY0IHNyX250cDsJCS8qIDY0LWJpdCBudHAgdGltZXN0YW1wICovCi0JdV9pbnQzMl90IHNyX3RzOwkvKiByZWZlcmVuY2UgbWVkaWEgdGltZXN0YW1wICovCi0JdV9pbnQzMl90IHNyX25wOwkvKiBuby4gcGFja2V0cyBzZW50ICovCi0JdV9pbnQzMl90IHNyX25iOwkvKiBuby4gYnl0ZXMgc2VudCAqLwotfTsKLQotLyoKLSAqIFJlY2VpdmVyIHJlcG9ydC4KLSAqIFRpbWUgc3RhbXBzIGFyZSBtaWRkbGUgMzItYml0cyBvZiBudHAgdGltZXN0YW1wLgotICovCi1zdHJ1Y3QgcnRjcF9yciB7Ci0JdV9pbnQzMl90IHJyX3NyY2lkOwkvKiBzZW5kZXIgYmVpbmcgcmVwb3J0ZWQgKi8KLQl1X2ludDMyX3QgcnJfbmw7CS8qIG5vLiBwYWNrZXRzIGxvc3QgKi8KLQl1X2ludDMyX3QgcnJfbHM7CS8qIGV4dGVuZGVkIGxhc3Qgc2VxIG51bWJlciByZWNlaXZlZCAqLwotCXVfaW50MzJfdCBycl9kdjsJLyogaml0dGVyIChkZWxheSB2YXJpYW5jZSkgKi8KLQl1X2ludDMyX3QgcnJfbHNyOwkvKiBvcmlnLiB0cyBmcm9tIGxhc3QgcnIgZnJvbSB0aGlzIHNyYyAgKi8KLQl1X2ludDMyX3QgcnJfZGxzcjsJLyogdGltZSBmcm9tIHJlY3B0IG9mIGxhc3QgcnIgdG8geG1pdCB0aW1lICovCi19OwotCi0vKlhYWCovCi0jZGVmaW5lIFJUQ1BfUFRfU1IJMjAwCi0jZGVmaW5lIFJUQ1BfUFRfUlIJMjAxCi0jZGVmaW5lIFJUQ1BfUFRfU0RFUwkyMDIKLSNkZWZpbmUgCVJUQ1BfU0RFU19DTkFNRQkxCi0jZGVmaW5lIAlSVENQX1NERVNfTkFNRQkyCi0jZGVmaW5lIAlSVENQX1NERVNfRU1BSUwJMwotI2RlZmluZSAJUlRDUF9TREVTX1BIT05FCTQKLSNkZWZpbmUgCVJUQ1BfU0RFU19MT0MJNQotI2RlZmluZSAJUlRDUF9TREVTX1RPT0wJNgotI2RlZmluZSAJUlRDUF9TREVTX05PVEUJNwotI2RlZmluZSAJUlRDUF9TREVTX1BSSVYJOAotI2RlZmluZSBSVENQX1BUX0JZRQkyMDMKLSNkZWZpbmUgUlRDUF9QVF9BUFAJMjA0Ci0KLXN0YXRpYyB2b2lkCi12YXRfcHJpbnQoY29uc3Qgdm9pZCAqaGRyLCByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdWRwaGRyICp1cCkKLXsKLQkvKiB2YXQvdnQgYXVkaW8gKi8KLQl1X2ludCB0cyA9ICoodV9pbnQxNl90ICopaGRyOwotCWlmICgodHMgJiAweGYwNjApICE9IDApIHsKLQkJLyogcHJvYmFibHkgdnQgKi8KLQkJKHZvaWQpcHJpbnRmKCJ1ZHAvdnQgJXUgJWQgLyAlZCIsCi0JCQkgICAgICh1X2ludDMyX3QpKEVYVFJBQ1RfMTZCSVRTKCZ1cC0+dWhfdWxlbikgLSBzaXplb2YoKnVwKSksCi0JCQkgICAgIHRzICYgMHgzZmYsIHRzID4+IDEwKTsKLQl9IGVsc2UgewotCQkvKiBwcm9iYWJseSB2YXQgKi8KLQkJdV9pbnQzMl90IGkwID0gRVhUUkFDVF8zMkJJVFMoJigodV9pbnQgKiloZHIpWzBdKTsKLQkJdV9pbnQzMl90IGkxID0gRVhUUkFDVF8zMkJJVFMoJigodV9pbnQgKiloZHIpWzFdKTsKLQkJcHJpbnRmKCJ1ZHAvdmF0ICV1IGMlZCAldSVzIiwKLQkJCSh1X2ludDMyX3QpKEVYVFJBQ1RfMTZCSVRTKCZ1cC0+dWhfdWxlbikgLSBzaXplb2YoKnVwKSAtIDgpLAotCQkJaTAgJiAweGZmZmYsCi0JCQlpMSwgaTAgJiAweDgwMDAwMD8gIioiIDogIiIpOwotCQkvKiBhdWRpbyBmb3JtYXQgKi8KLQkJaWYgKGkwICYgMHgxZjAwMDApCi0JCQlwcmludGYoIiBmJWQiLCAoaTAgPj4gMTYpICYgMHgxZik7Ci0JCWlmIChpMCAmIDB4M2YwMDAwMDApCi0JCQlwcmludGYoIiBzJWQiLCAoaTAgPj4gMjQpICYgMHgzZik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcnRwX3ByaW50KGNvbnN0IHZvaWQgKmhkciwgdV9pbnQgbGVuLCByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdWRwaGRyICp1cCkKLXsKLQkvKiBydHAgdjEgb3IgdjIgKi8KLQl1X2ludCAqaXAgPSAodV9pbnQgKiloZHI7Ci0JdV9pbnQgaGFzb3B0LCBoYXNleHQsIGNvbnR5cGUsIGhhc21hcmtlcjsKLQl1X2ludDMyX3QgaTAgPSBFWFRSQUNUXzMyQklUUygmKCh1X2ludCAqKWhkcilbMF0pOwotCXVfaW50MzJfdCBpMSA9IEVYVFJBQ1RfMzJCSVRTKCYoKHVfaW50ICopaGRyKVsxXSk7Ci0JdV9pbnQgZGxlbiA9IEVYVFJBQ1RfMTZCSVRTKCZ1cC0+dWhfdWxlbikgLSBzaXplb2YoKnVwKSAtIDg7Ci0JY29uc3QgY2hhciAqIHB0eXBlOwotCi0JaXAgKz0gMjsKLQlsZW4gPj49IDI7Ci0JbGVuIC09IDI7Ci0JaGFzb3B0ID0gMDsKLQloYXNleHQgPSAwOwotCWlmICgoaTAgPj4gMzApID09IDEpIHsKLQkJLyogcnRwIHYxICovCi0JCWhhc29wdCA9IGkwICYgMHg4MDAwMDA7Ci0JCWNvbnR5cGUgPSAoaTAgPj4gMTYpICYgMHgzZjsKLQkJaGFzbWFya2VyID0gaTAgJiAweDQwMDAwMDsKLQkJcHR5cGUgPSAicnRwdjEiOwotCX0gZWxzZSB7Ci0JCS8qIHJ0cCB2MiAqLwotCQloYXNleHQgPSBpMCAmIDB4MTAwMDAwMDA7Ci0JCWNvbnR5cGUgPSAoaTAgPj4gMTYpICYgMHg3ZjsKLQkJaGFzbWFya2VyID0gaTAgJiAweDgwMDAwMDsKLQkJZGxlbiAtPSA0OwotCQlwdHlwZSA9ICJydHAiOwotCQlpcCArPSAxOwotCQlsZW4gLT0gMTsKLQl9Ci0JcHJpbnRmKCJ1ZHAvJXMgJWQgYyVkICVzJXMgJWQgJXUiLAotCQlwdHlwZSwKLQkJZGxlbiwKLQkJY29udHlwZSwKLQkJKGhhc29wdCB8fCBoYXNleHQpPyAiKyIgOiAiIiwKLQkJaGFzbWFya2VyPyAiKiIgOiAiIiwKLQkJaTAgJiAweGZmZmYsCi0JCWkxKTsKLQlpZiAodmZsYWcpIHsKLQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUygmKCh1X2ludCAqKWhkcilbMl0pKTsKLQkJaWYgKGhhc29wdCkgewotCQkJdV9pbnQgaTIsIG9wdGxlbjsKLQkJCWRvIHsKLQkJCQlpMiA9IGlwWzBdOwotCQkJCW9wdGxlbiA9IChpMiA+PiAxNikgJiAweGZmOwotCQkJCWlmIChvcHRsZW4gPT0gMCB8fCBvcHRsZW4gPiBsZW4pIHsKLQkJCQkJcHJpbnRmKCIgIW9wdCIpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlwICs9IG9wdGxlbjsKLQkJCQlsZW4gLT0gb3B0bGVuOwotCQkJfSB3aGlsZSAoKGludClpMiA+PSAwKTsKLQkJfQotCQlpZiAoaGFzZXh0KSB7Ci0JCQl1X2ludCBpMiwgZXh0bGVuOwotCQkJaTIgPSBpcFswXTsKLQkJCWV4dGxlbiA9IChpMiAmIDB4ZmZmZikgKyAxOwotCQkJaWYgKGV4dGxlbiA+IGxlbikgewotCQkJCXByaW50ZigiICFleHQiKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpcCArPSBleHRsZW47Ci0JCX0KLQkJaWYgKGNvbnR5cGUgPT0gMHgxZikgLypYWFggSC4yNjEgKi8KLQkJCXByaW50ZigiIDB4JTA0eCIsIGlwWzBdID4+IDE2KTsKLQl9Ci19Ci0KLXN0YXRpYyBjb25zdCB1X2NoYXIgKgotcnRjcF9wcmludChjb25zdCB1X2NoYXIgKmhkciwgY29uc3QgdV9jaGFyICplcCkKLXsKLQkvKiBydHAgdjIgY29udHJvbCAocnRjcCkgKi8KLQlzdHJ1Y3QgcnRjcF9yciAqcnIgPSAwOwotCXN0cnVjdCBydGNwX3NyICpzcjsKLQlzdHJ1Y3QgcnRjcGhkciAqcmggPSAoc3RydWN0IHJ0Y3BoZHIgKiloZHI7Ci0JdV9pbnQgbGVuOwotCXVfaW50MTZfdCBmbGFnczsKLQlpbnQgY250OwotCWRvdWJsZSB0cywgZHRzOwotCWlmICgodV9jaGFyICopKHJoICsgMSkgPiBlcCkgewotCQlwcmludGYoIiBbfHJ0Y3BdIik7Ci0JCXJldHVybiAoZXApOwotCX0KLQlsZW4gPSAoRVhUUkFDVF8xNkJJVFMoJnJoLT5yaF9sZW4pICsgMSkgKiA0OwotCWZsYWdzID0gRVhUUkFDVF8xNkJJVFMoJnJoLT5yaF9mbGFncyk7Ci0JY250ID0gKGZsYWdzID4+IDgpICYgMHgxZjsKLQlzd2l0Y2ggKGZsYWdzICYgMHhmZikgewotCWNhc2UgUlRDUF9QVF9TUjoKLQkJc3IgPSAoc3RydWN0IHJ0Y3Bfc3IgKikocmggKyAxKTsKLQkJcHJpbnRmKCIgc3IiKTsKLQkJaWYgKGxlbiAhPSBjbnQgKiBzaXplb2YoKnJyKSArIHNpemVvZigqc3IpICsgc2l6ZW9mKCpyaCkpCi0JCQlwcmludGYoIiBbJWRdIiwgbGVuKTsKLQkJaWYgKHZmbGFnKQotCQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUygmcmgtPnJoX3NzcmMpKTsKLQkJaWYgKCh1X2NoYXIgKikoc3IgKyAxKSA+IGVwKSB7Ci0JCQlwcmludGYoIiBbfHJ0Y3BdIik7Ci0JCQlyZXR1cm4gKGVwKTsKLQkJfQotCQl0cyA9IChkb3VibGUpKEVYVFJBQ1RfMzJCSVRTKCZzci0+c3JfbnRwLnVwcGVyKSkgKwotCQkgICAgKChkb3VibGUpKEVYVFJBQ1RfMzJCSVRTKCZzci0+c3JfbnRwLmxvd2VyKSkgLwotCQkgICAgNDI5NDk2NzI5Ni4wKTsKLQkJcHJpbnRmKCIgQCUuMmYgJXUgJXVwICV1YiIsIHRzLCBFWFRSQUNUXzMyQklUUygmc3ItPnNyX3RzKSwKLQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZzci0+c3JfbnApLCBFWFRSQUNUXzMyQklUUygmc3ItPnNyX25iKSk7Ci0JCXJyID0gKHN0cnVjdCBydGNwX3JyICopKHNyICsgMSk7Ci0JCWJyZWFrOwotCWNhc2UgUlRDUF9QVF9SUjoKLQkJcHJpbnRmKCIgcnIiKTsKLQkJaWYgKGxlbiAhPSBjbnQgKiBzaXplb2YoKnJyKSArIHNpemVvZigqcmgpKQotCQkJcHJpbnRmKCIgWyVkXSIsIGxlbik7Ci0JCXJyID0gKHN0cnVjdCBydGNwX3JyICopKHJoICsgMSk7Ci0JCWlmICh2ZmxhZykKLQkJCXByaW50ZigiICV1IiwgRVhUUkFDVF8zMkJJVFMoJnJoLT5yaF9zc3JjKSk7Ci0JCWJyZWFrOwotCWNhc2UgUlRDUF9QVF9TREVTOgotCQlwcmludGYoIiBzZGVzICVkIiwgbGVuKTsKLQkJaWYgKHZmbGFnKQotCQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUygmcmgtPnJoX3NzcmMpKTsKLQkJY250ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBSVENQX1BUX0JZRToKLQkJcHJpbnRmKCIgYnllICVkIiwgbGVuKTsKLQkJaWYgKHZmbGFnKQotCQkJcHJpbnRmKCIgJXUiLCBFWFRSQUNUXzMyQklUUygmcmgtPnJoX3NzcmMpKTsKLQkJY250ID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRmKCIgdHlwZS0weCV4ICVkIiwgZmxhZ3MgJiAweGZmLCBsZW4pOwotCQljbnQgPSAwOwotCQlicmVhazsKLQl9Ci0JaWYgKGNudCA+IDEpCi0JCXByaW50ZigiIGMlZCIsIGNudCk7Ci0Jd2hpbGUgKC0tY250ID49IDApIHsKLQkJaWYgKCh1X2NoYXIgKikocnIgKyAxKSA+IGVwKSB7Ci0JCQlwcmludGYoIiBbfHJ0Y3BdIik7Ci0JCQlyZXR1cm4gKGVwKTsKLQkJfQotCQlpZiAodmZsYWcpCi0JCQlwcmludGYoIiAldSIsIEVYVFJBQ1RfMzJCSVRTKCZyci0+cnJfc3JjaWQpKTsKLQkJdHMgPSAoZG91YmxlKShFWFRSQUNUXzMyQklUUygmcnItPnJyX2xzcikpIC8gNjU1MzYuOwotCQlkdHMgPSAoZG91YmxlKShFWFRSQUNUXzMyQklUUygmcnItPnJyX2Rsc3IpKSAvIDY1NTM2LjsKLQkJcHJpbnRmKCIgJXVsICV1cyAldWogQCUuMmYrJS4yZiIsCi0JCSAgICBFWFRSQUNUXzMyQklUUygmcnItPnJyX25sKSAmIDB4MDBmZmZmZmYsCi0JCSAgICBFWFRSQUNUXzMyQklUUygmcnItPnJyX2xzKSwKLQkJICAgIEVYVFJBQ1RfMzJCSVRTKCZyci0+cnJfZHYpLCB0cywgZHRzKTsKLQl9Ci0JcmV0dXJuIChoZHIgKyBsZW4pOwotfQotCi1zdGF0aWMgaW50IHVkcF9ja3N1bShyZWdpc3RlciBjb25zdCBzdHJ1Y3QgaXAgKmlwLAotCQkgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB1ZHBoZHIgKnVwLAotCQkgICAgIHJlZ2lzdGVyIHVfaW50IGxlbikKLXsKLQl1bmlvbiBwaHUgewotCQlzdHJ1Y3QgcGhkciB7Ci0JCQl1X2ludDMyX3Qgc3JjOwotCQkJdV9pbnQzMl90IGRzdDsKLQkJCXVfY2hhciBtYno7Ci0JCQl1X2NoYXIgcHJvdG87Ci0JCQl1X2ludDE2X3QgbGVuOwotCQl9IHBoOwotCQl1X2ludDE2X3QgcGFbNl07Ci0JfSBwaHU7Ci0JcmVnaXN0ZXIgY29uc3QgdV9pbnQxNl90ICpzcDsKLQotCS8qIHBzZXVkby1oZWFkZXIuLiAqLwotCXBodS5waC5sZW4gPSBodG9ucygodV9pbnQxNl90KWxlbik7Ci0JcGh1LnBoLm1ieiA9IDA7Ci0JcGh1LnBoLnByb3RvID0gSVBQUk9UT19VRFA7Ci0JbWVtY3B5KCZwaHUucGguc3JjLCAmaXAtPmlwX3NyYy5zX2FkZHIsIHNpemVvZih1X2ludDMyX3QpKTsKLQlpZiAoSVBfSEwoaXApID09IDUpCi0JCW1lbWNweSgmcGh1LnBoLmRzdCwgJmlwLT5pcF9kc3Quc19hZGRyLCBzaXplb2YodV9pbnQzMl90KSk7Ci0JZWxzZQotCQlwaHUucGguZHN0ID0gaXBfZmluZGRzdChpcCk7Ci0KLQlzcCA9ICZwaHUucGFbMF07Ci0JcmV0dXJuIGluX2Nrc3VtKCh1X3Nob3J0ICopdXAsIGxlbiwKLQkJCXNwWzBdK3NwWzFdK3NwWzJdK3NwWzNdK3NwWzRdK3NwWzVdKTsKLX0KLQotI2lmZGVmIElORVQ2Ci1zdGF0aWMgaW50IHVkcDZfY2tzdW0oY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNiwgY29uc3Qgc3RydWN0IHVkcGhkciAqdXAsCi0JdV9pbnQgbGVuKQotewotCXNpemVfdCBpOwotCXJlZ2lzdGVyIGNvbnN0IHVfaW50MTZfdCAqc3A7Ci0JdV9pbnQzMl90IHN1bTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgaW42X2FkZHIgcGhfc3JjOwotCQkJc3RydWN0IGluNl9hZGRyIHBoX2RzdDsKLQkJCXVfaW50MzJfdAlwaF9sZW47Ci0JCQl1X2ludDhfdAlwaF96ZXJvWzNdOwotCQkJdV9pbnQ4X3QJcGhfbnh0OwotCQl9IHBoOwotCQl1X2ludDE2X3QgcGFbMjBdOwotCX0gcGh1OwotCi0JLyogcHNldWRvLWhlYWRlciAqLwotCW1lbXNldCgmcGh1LCAwLCBzaXplb2YocGh1KSk7Ci0JcGh1LnBoLnBoX3NyYyA9IGlwNi0+aXA2X3NyYzsKLQlwaHUucGgucGhfZHN0ID0gaXA2LT5pcDZfZHN0OwotCXBodS5waC5waF9sZW4gPSBodG9ubChsZW4pOwotCXBodS5waC5waF9ueHQgPSBJUFBST1RPX1VEUDsKLQotCXN1bSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihwaHUucGEpIC8gc2l6ZW9mKHBodS5wYVswXSk7IGkrKykKLQkJc3VtICs9IHBodS5wYVtpXTsKLQotCXNwID0gKGNvbnN0IHVfaW50MTZfdCAqKXVwOwotCi0JZm9yIChpID0gMDsgaSA8IChsZW4gJiB+MSk7IGkgKz0gMikKLQkJc3VtICs9ICpzcCsrOwotCi0JaWYgKGxlbiAmIDEpCi0JCXN1bSArPSBodG9ucygoKihjb25zdCB1X2ludDhfdCAqKXNwKSA8PCA4KTsKLQotCXdoaWxlIChzdW0gPiAweGZmZmYpCi0JCXN1bSA9IChzdW0gJiAweGZmZmYpICsgKHN1bSA+PiAxNik7Ci0Jc3VtID0gfnN1bSAmIDB4ZmZmZjsKLQotCXJldHVybiAoc3VtKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotdWRwaXBhZGRyX3ByaW50KGNvbnN0IHN0cnVjdCBpcCAqaXAsIGludCBzcG9ydCwgaW50IGRwb3J0KQotewotI2lmZGVmIElORVQ2Ci0JY29uc3Qgc3RydWN0IGlwNl9oZHIgKmlwNjsKLQotCWlmIChJUF9WKGlwKSA9PSA2KQotCQlpcDYgPSAoY29uc3Qgc3RydWN0IGlwNl9oZHIgKilpcDsKLQllbHNlCi0JCWlwNiA9IE5VTEw7Ci0KLQlpZiAoaXA2KSB7Ci0JCWlmIChpcDYtPmlwNl9ueHQgPT0gSVBQUk9UT19VRFApIHsKLQkJCWlmIChzcG9ydCA9PSAtMSkgewotCQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKLQkJCQkJaXA2YWRkcl9zdHJpbmcoJmlwNi0+aXA2X3NyYyksCi0JCQkJCWlwNmFkZHJfc3RyaW5nKCZpcDYtPmlwNl9kc3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIlcy4lcyA+ICVzLiVzOiAiLAotCQkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfc3JjKSwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoc3BvcnQpLAotCQkJCQlpcDZhZGRyX3N0cmluZygmaXA2LT5pcDZfZHN0KSwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzcG9ydCAhPSAtMSkgewotCQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoc3BvcnQpLAotCQkJCQl1ZHBwb3J0X3N0cmluZyhkcG9ydCkpOwotCQkJfQotCQl9Ci0JfSBlbHNlCi0jZW5kaWYgLypJTkVUNiovCi0JewotCQlpZiAoaXAtPmlwX3AgPT0gSVBQUk9UT19VRFApIHsKLQkJCWlmIChzcG9ydCA9PSAtMSkgewotCQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKLQkJCQkJaXBhZGRyX3N0cmluZygmaXAtPmlwX3NyYyksCi0JCQkJCWlwYWRkcl9zdHJpbmcoJmlwLT5pcF9kc3QpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKHZvaWQpcHJpbnRmKCIlcy4lcyA+ICVzLiVzOiAiLAotCQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfc3JjKSwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoc3BvcnQpLAotCQkJCQlpcGFkZHJfc3RyaW5nKCZpcC0+aXBfZHN0KSwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoZHBvcnQpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChzcG9ydCAhPSAtMSkgewotCQkJCSh2b2lkKXByaW50ZigiJXMgPiAlczogIiwKLQkJCQkJdWRwcG9ydF9zdHJpbmcoc3BvcnQpLAotCQkJCQl1ZHBwb3J0X3N0cmluZyhkcG9ydCkpOwotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkCi11ZHBfcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicCwgdV9pbnQgbGVuZ3RoLAotCSAgcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpicDIsIGludCBmcmFnbWVudGVkKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB1ZHBoZHIgKnVwOwotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcCAqaXA7Ci0JcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpjcDsKLQlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwID0gYnAgKyBsZW5ndGg7Ci0JdV9pbnQxNl90IHNwb3J0LCBkcG9ydCwgdWxlbjsKLSNpZmRlZiBJTkVUNgotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBpcDZfaGRyICppcDY7Ci0jZW5kaWYKLQotCWlmIChlcCA+IHNuYXBlbmQpCi0JCWVwID0gc25hcGVuZDsKLQl1cCA9IChzdHJ1Y3QgdWRwaGRyICopYnA7Ci0JaXAgPSAoc3RydWN0IGlwICopYnAyOwotI2lmZGVmIElORVQ2Ci0JaWYgKElQX1YoaXApID09IDYpCi0JCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKWJwMjsKLQllbHNlCi0JCWlwNiA9IE5VTEw7Ci0jZW5kaWYgLypJTkVUNiovCi0JY3AgPSAodV9jaGFyICopKHVwICsgMSk7Ci0JaWYgKCFUVEVTVCh1cC0+dWhfZHBvcnQpKSB7Ci0JCXVkcGlwYWRkcl9wcmludChpcCwgLTEsIC0xKTsKLQkJKHZvaWQpcHJpbnRmKCJbfHVkcF0iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwb3J0ID0gRVhUUkFDVF8xNkJJVFMoJnVwLT51aF9zcG9ydCk7Ci0JZHBvcnQgPSBFWFRSQUNUXzE2QklUUygmdXAtPnVoX2Rwb3J0KTsKLQotCWlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IHVkcGhkcikpIHsKLQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOwotCQkodm9pZClwcmludGYoInRydW5jYXRlZC11ZHAgJWQiLCBsZW5ndGgpOwotCQlyZXR1cm47Ci0JfQotCWxlbmd0aCAtPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0KLQlpZiAoY3AgPiBzbmFwZW5kKSB7Ci0JCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKLQkJKHZvaWQpcHJpbnRmKCJbfHVkcF0iKTsKLQkJcmV0dXJuOwotCX0KLQotCXVsZW4gPSBFWFRSQUNUXzE2QklUUygmdXAtPnVoX3VsZW4pOwotCWlmICh1bGVuIDwgOCkgewotCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7Ci0JCSh2b2lkKXByaW50ZigidHJ1bmNhdGVkLXVkcGxlbmd0aCAlZCIsIHVsZW4pOwotCQlyZXR1cm47Ci0JfQotCWlmIChwYWNrZXR0eXBlKSB7Ci0JCXJlZ2lzdGVyIHN0cnVjdCBzdW5ycGNfbXNnICpycDsKLQkJZW51bSBzdW5ycGNfbXNnX3R5cGUgZGlyZWN0aW9uOwotCi0JCXN3aXRjaCAocGFja2V0dHlwZSkgewotCi0JCWNhc2UgUFRfVkFUOgotCQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOwotCQkJdmF0X3ByaW50KCh2b2lkICopKHVwICsgMSksIHVwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUFRfV0I6Ci0JCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7Ci0JCQl3Yl9wcmludCgodm9pZCAqKSh1cCArIDEpLCBsZW5ndGgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVF9SUEM6Ci0JCQlycCA9IChzdHJ1Y3Qgc3VucnBjX21zZyAqKSh1cCArIDEpOwotCQkJZGlyZWN0aW9uID0gKGVudW0gc3VucnBjX21zZ190eXBlKUVYVFJBQ1RfMzJCSVRTKCZycC0+cm1fZGlyZWN0aW9uKTsKLQkJCWlmIChkaXJlY3Rpb24gPT0gU1VOUlBDX0NBTEwpCi0JCQkJc3VucnBjcmVxdWVzdF9wcmludCgodV9jaGFyICopcnAsIGxlbmd0aCwKLQkJCQkgICAgKHVfY2hhciAqKWlwKTsKLQkJCWVsc2UKLQkJCQluZnNyZXBseV9wcmludCgodV9jaGFyICopcnAsIGxlbmd0aCwKLQkJCQkgICAgKHVfY2hhciAqKWlwKTsJCQkvKlhYWCovCi0JCQlicmVhazsKLQotCQljYXNlIFBUX1JUUDoKLQkJCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKLQkJCXJ0cF9wcmludCgodm9pZCAqKSh1cCArIDEpLCBsZW5ndGgsIHVwKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUFRfUlRDUDoKLQkJCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKLQkJCXdoaWxlIChjcCA8IGVwKQotCQkJCWNwID0gcnRjcF9wcmludChjcCwgZXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVF9TTk1QOgotCQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOwotCQkJc25tcF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBUX0NORlA6Ci0JCQl1ZHBpcGFkZHJfcHJpbnQoaXAsIHNwb3J0LCBkcG9ydCk7Ci0JCQljbmZwX3ByaW50KGNwLCAoY29uc3QgdV9jaGFyICopaXApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQVF9URlRQOgotCQkJdWRwaXBhZGRyX3ByaW50KGlwLCBzcG9ydCwgZHBvcnQpOwotCQkJdGZ0cF9wcmludChjcCwgbGVuZ3RoKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUFRfQU9EVjoKLQkJCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKLQkJCWFvZHZfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgsCi0jaWZkZWYgSU5FVDYKLQkJCSAgICBpcDYgIT0gTlVMTCk7Ci0jZWxzZQotCQkJICAgIDApOwotI2VuZGlmCi0JCQlicmVhazsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFxZmxhZykgewotCQlyZWdpc3RlciBzdHJ1Y3Qgc3VucnBjX21zZyAqcnA7Ci0JCWVudW0gc3VucnBjX21zZ190eXBlIGRpcmVjdGlvbjsKLQotCQlycCA9IChzdHJ1Y3Qgc3VucnBjX21zZyAqKSh1cCArIDEpOwotCQlpZiAoVFRFU1QocnAtPnJtX2RpcmVjdGlvbikpIHsKLQkJCWRpcmVjdGlvbiA9IChlbnVtIHN1bnJwY19tc2dfdHlwZSlFWFRSQUNUXzMyQklUUygmcnAtPnJtX2RpcmVjdGlvbik7Ci0JCQlpZiAoZHBvcnQgPT0gTkZTX1BPUlQgJiYgZGlyZWN0aW9uID09IFNVTlJQQ19DQUxMKSB7Ci0JCQkJbmZzcmVxX3ByaW50KCh1X2NoYXIgKilycCwgbGVuZ3RoLAotCQkJCSAgICAodV9jaGFyICopaXApOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChzcG9ydCA9PSBORlNfUE9SVCAmJiBkaXJlY3Rpb24gPT0gU1VOUlBDX1JFUExZKSB7Ci0JCQkJbmZzcmVwbHlfcHJpbnQoKHVfY2hhciAqKXJwLCBsZW5ndGgsCi0JCQkJICAgICh1X2NoYXIgKilpcCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotI2lmZGVmIG5vdGRlZgotCQkJaWYgKGRwb3J0ID09IFNVTlJQQ19QT1JUICYmIGRpcmVjdGlvbiA9PSBTVU5SUENfQ0FMTCkgewotCQkJCXN1bnJwY3JlcXVlc3RfcHJpbnQoKHVfY2hhciAqKXJwLCBsZW5ndGgsICh1X2NoYXIgKilpcCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotI2VuZGlmCi0JCX0KLQkJaWYgKFRURVNUKCgoc3RydWN0IExBUCAqKWNwKS0+dHlwZSkgJiYKLQkJICAgICgoc3RydWN0IExBUCAqKWNwKS0+dHlwZSA9PSBsYXBERFAgJiYKLQkJICAgIChhdGFsa19wb3J0KHNwb3J0KSB8fCBhdGFsa19wb3J0KGRwb3J0KSkpIHsKLQkJCWlmICh2ZmxhZykKLQkJCQlmcHV0cygia2lwICIsIHN0ZG91dCk7Ci0JCQlsbGFwX3ByaW50KGNwLCBsZW5ndGgpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXVkcGlwYWRkcl9wcmludChpcCwgc3BvcnQsIGRwb3J0KTsKLQotCWlmIChJUF9WKGlwKSA9PSA0ICYmICh2ZmxhZyA+IDEpICYmICFmcmFnbWVudGVkKSB7Ci0JCWludCBzdW0gPSB1cC0+dWhfc3VtOwotCQlpZiAoc3VtID09IDApIHsKLQkJCSh2b2lkKXByaW50ZigiW25vIGNrc3VtXSAiKTsKLQkJfSBlbHNlIGlmIChUVEVTVDIoY3BbMF0sIGxlbmd0aCkpIHsKLQkJCXN1bSA9IHVkcF9ja3N1bShpcCwgdXAsIGxlbmd0aCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7Ci0JCQlpZiAoc3VtICE9IDApCi0JCQkJKHZvaWQpcHJpbnRmKCJbYmFkIHVkcCBja3N1bSAleCFdICIsIHN1bSk7Ci0JCQllbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCJbdWRwIHN1bSBva10gIik7Ci0JCX0KLQl9Ci0jaWZkZWYgSU5FVDYKLQlpZiAoSVBfVihpcCkgPT0gNiAmJiBpcDYtPmlwNl9wbGVuICYmIHZmbGFnICYmICFmcmFnbWVudGVkKSB7Ci0JCWludCBzdW0gPSB1cC0+dWhfc3VtOwotCQkvKiBmb3IgSVB2NiwgVURQIGNoZWNrc3VtIGlzIG1hbmRhdG9yeSAqLwotCQlpZiAoVFRFU1QyKGNwWzBdLCBsZW5ndGgpKSB7Ci0JCQlzdW0gPSB1ZHA2X2Nrc3VtKGlwNiwgdXAsIGxlbmd0aCArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7Ci0JCQlpZiAoc3VtICE9IDApCi0JCQkJKHZvaWQpcHJpbnRmKCJbYmFkIHVkcCBja3N1bSAleCFdICIsIHN1bSk7Ci0JCQllbHNlCi0JCQkJKHZvaWQpcHJpbnRmKCJbdWRwIHN1bSBva10gIik7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmICghcWZsYWcpIHsKLSNkZWZpbmUgSVNQT1JUKHApIChkcG9ydCA9PSAocCkgfHwgc3BvcnQgPT0gKHApKQotCQlpZiAoSVNQT1JUKE5BTUVTRVJWRVJfUE9SVCkpCi0JCQluc19wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCwgMCk7Ci0JCWVsc2UgaWYgKElTUE9SVChNVUxUSUNBU1RETlNfUE9SVCkpCi0JCQluc19wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCwgMSk7Ci0JCWVsc2UgaWYgKElTUE9SVChUSU1FRF9QT1JUKSkKLQkJCXRpbWVkX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSk7Ci0JCWVsc2UgaWYgKElTUE9SVChURlRQX1BPUlQpKQotCQkJdGZ0cF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTUE9SVChJUFBPUlRfQk9PVFBDKSB8fCBJU1BPUlQoSVBQT1JUX0JPT1RQUykpCi0JCQlib290cF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTUE9SVChSSVBfUE9SVCkpCi0JCQlyaXBfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOwotCQllbHNlIGlmIChJU1BPUlQoQU9EVl9QT1JUKSkKLQkJCWFvZHZfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgsCi0jaWZkZWYgSU5FVDYKLQkJCSAgICBpcDYgIT0gTlVMTCk7Ci0jZWxzZQotCQkJICAgIDApOwotI2VuZGlmCi0JICAgICAgICBlbHNlIGlmIChJU1BPUlQoSVNBS01QX1BPUlQpKQotCQkJIGlzYWttcF9wcmludChnbmRvLCAoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCwgYnAyKTsKLSAgCSAgICAgICAgZWxzZSBpZiAoSVNQT1JUKElTQUtNUF9QT1JUX05BVFQpKQotCQkJIGlzYWttcF9yZmMzOTQ4X3ByaW50KGduZG8sIChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoLCBicDIpOwotI2lmIDEgLyo/Pz8qLwotICAgCSAgICAgICAgZWxzZSBpZiAoSVNQT1JUKElTQUtNUF9QT1JUX1VTRVIxKSB8fCBJU1BPUlQoSVNBS01QX1BPUlRfVVNFUjIpKQotCQkJaXNha21wX3ByaW50KGduZG8sIChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoLCBicDIpOwotI2VuZGlmCi0JCWVsc2UgaWYgKElTUE9SVChTTk1QX1BPUlQpIHx8IElTUE9SVChTTk1QVFJBUF9QT1JUKSkKLQkJCXNubXBfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOwotCQllbHNlIGlmIChJU1BPUlQoTlRQX1BPUlQpKQotCQkJbnRwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLQkJZWxzZSBpZiAoSVNQT1JUKEtFUkJFUk9TX1BPUlQpIHx8IElTUE9SVChLRVJCRVJPU19TRUNfUE9SVCkpCi0JCQlrcmJfcHJpbnQoKGNvbnN0IHZvaWQgKikodXAgKyAxKSk7Ci0JCWVsc2UgaWYgKElTUE9SVChMMlRQX1BPUlQpKQotCQkJbDJ0cF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0jaWZkZWYgVENQRFVNUF9ET19TTUIKLQkJZWxzZSBpZiAoSVNQT1JUKE5FVEJJT1NfTlNfUE9SVCkpCi0JCQluYnRfdWRwMTM3X3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLQkJZWxzZSBpZiAoSVNQT1JUKE5FVEJJT1NfREdSQU1fUE9SVCkpCi0JCQluYnRfdWRwMTM4X3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLSNlbmRpZgotCQllbHNlIGlmIChkcG9ydCA9PSAzNDU2KQotCQkJdmF0X3ByaW50KChjb25zdCB2b2lkICopKHVwICsgMSksIHVwKTsKLQkJZWxzZSBpZiAoSVNQT1JUKFpFUEhZUl9TUlZfUE9SVCkgfHwgSVNQT1JUKFpFUEhZUl9DTFRfUE9SVCkpCi0JCQl6ZXBoeXJfcHJpbnQoKGNvbnN0IHZvaWQgKikodXAgKyAxKSwgbGVuZ3RoKTsKLQkJLyoKLQkJICogU2luY2UgdGhlcmUgYXJlIDEwIHBvc3NpYmxlIHBvcnRzIHRvIGNoZWNrLCBJIHRoaW5rCi0JCSAqIGEgPD4gdGVzdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudAotCQkgKi8KLQkJZWxzZSBpZiAoKHNwb3J0ID49IFJYX1BPUlRfTE9XICYmIHNwb3J0IDw9IFJYX1BPUlRfSElHSCkgfHwKLQkJCSAoZHBvcnQgPj0gUlhfUE9SVF9MT1cgJiYgZHBvcnQgPD0gUlhfUE9SVF9ISUdIKSkKLQkJCXJ4X3ByaW50KChjb25zdCB2b2lkICopKHVwICsgMSksIGxlbmd0aCwgc3BvcnQsIGRwb3J0LAotCQkJCSAodV9jaGFyICopIGlwKTsKLSNpZmRlZiBJTkVUNgotCQllbHNlIGlmIChJU1BPUlQoUklQTkdfUE9SVCkpCi0JCQlyaXBuZ19wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTUE9SVChESENQNl9TRVJWX1BPUlQpIHx8IElTUE9SVChESENQNl9DTElfUE9SVCkpIHsKLQkJCWRoY3A2X3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLQkJfQotI2VuZGlmIC8qSU5FVDYqLwotCQkvKgotCQkgKiBLbHVkZ2UgaW4gdGVzdCBmb3Igd2hpdGVib2FyZCBwYWNrZXRzLgotCQkgKi8KLQkJZWxzZSBpZiAoZHBvcnQgPT0gNDU2NykKLQkJCXdiX3ByaW50KChjb25zdCB2b2lkICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTUE9SVChDSVNDT19BVVRPUlBfUE9SVCkpCi0JCQljaXNjb19hdXRvcnBfcHJpbnQoKGNvbnN0IHZvaWQgKikodXAgKyAxKSwgbGVuZ3RoKTsKLQkJZWxzZSBpZiAoSVNQT1JUKFJBRElVU19QT1JUKSB8fAotCQkJIElTUE9SVChSQURJVVNfTkVXX1BPUlQpIHx8Ci0JCQkgSVNQT1JUKFJBRElVU19BQ0NPVU5USU5HX1BPUlQpIHx8Ci0JCQkgSVNQT1JUKFJBRElVU19ORVdfQUNDT1VOVElOR19QT1JUKSApCi0JCQlyYWRpdXNfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCsxKSwgbGVuZ3RoKTsKLQkJZWxzZSBpZiAoZHBvcnQgPT0gSFNSUF9QT1JUKQotCQkJaHNycF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTUE9SVChMV1JFU19QT1JUKSkKLQkJCWx3cmVzX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChJU1BPUlQoTERQX1BPUlQpKQotCQkJbGRwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChJU1BPUlQoT0xTUl9QT1JUKSkKLQkJCW9sc3JfcHJpbnQoKGNvbnN0IHVfY2hhciAqKSh1cCArIDEpLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTUE9SVChNUExTX0xTUF9QSU5HX1BPUlQpKQotCQkJbHNwcGluZ19wcmludCgoY29uc3QgdV9jaGFyICopKHVwICsgMSksIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKGRwb3J0ID09IEJGRF9DT05UUk9MX1BPUlQgfHwKLQkJCSBkcG9ydCA9PSBCRkRfRUNIT19QT1JUICkKLQkJCWJmZF9wcmludCgoY29uc3QgdV9jaGFyICopKHVwKzEpLCBsZW5ndGgsIGRwb3J0KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChJU1BPUlQoTE1QX1BPUlQpKQotCQkJbG1wX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChJU1BPUlQoU0lQX1BPUlQpKQotCQkJc2lwX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChJU1BPUlQoU1lTTE9HX1BPUlQpKQotCQkJc3lzbG9nX3ByaW50KChjb25zdCB1X2NoYXIgKikodXAgKyAxKSwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJKHZvaWQpcHJpbnRmKCJVRFAsIGxlbmd0aCAldSIsCi0JCQkgICAgKHVfaW50MzJfdCkodWxlbiAtIHNpemVvZigqdXApKSk7Ci0jdW5kZWYgSVNQT1JUCi0JfSBlbHNlCi0JCSh2b2lkKXByaW50ZigiVURQLCBsZW5ndGggJXUiLCAodV9pbnQzMl90KSh1bGVuIC0gc2l6ZW9mKCp1cCkpKTsKLX0KLQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogYy1zdHlsZTogd2hpdGVzbWl0aAotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvcHJpbnQtdmpjLmMgYi9wcmludC12amMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViN2QwOC4uMDAwMDAwMAotLS0gYS9wcmludC12amMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9wcmludC12amMuYyx2IDEuMTUgMjAwNC8wMy8yNSAwMzozMToxNyBtY3IgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJhZGRydG9uYW1lLmgiCi0KLSNpbmNsdWRlICJzbGNvbXByZXNzLmgiCi0jaW5jbHVkZSAicHBwLmgiCi0KLS8qCi0gKiBYWFggLSBmb3IgQlNEL09TIFBQUCwgd2hhdCBwYWNrZXRzIGdldCBzdXBwbGllZCB3aXRoIGEgUFBQIGhlYWRlciB0eXBlCi0gKiBvZiBQUFBfVkpDIGFuZCB3aGF0IHBhY2tldHMgZ2V0IHN1cHBsaWVkIHdpdGggYSBQUFAgaGVhZGVyIHR5cGUgb2YKLSAqIFBQUF9WSk5DPyAgUFBQX1ZKTkMgaXMgZm9yICJVTkNPTVBSRVNTRURfVENQIiBwYWNrZXRzLCBhbmQgUFBQX1ZKQwotICogaXMgZm9yIENPTVBSRVNTRURfVENQIHBhY2tldHMgKFBQUF9JUCBpcyB1c2VkIGZvciBUWVBFX0lQIHBhY2tldHMpLgotICoKLSAqIFJGQyAxMTQ0IGltcGxpZXMgdGhhdCwgb24gdGhlIHdpcmUsIHRoZSBwYWNrZXQgdHlwZSBpcyAqbm90KiBuZWVkZWQKLSAqIGZvciBQUFAsIGFzIGRpZmZlcmVudCBQUFAgcHJvdG9jb2wgdHlwZXMgY2FuIGJlIHVzZWQ7IGl0IG9ubHkgbmVlZHMKLSAqIHRvIGJlIHB1dCBvbiB0aGUgd2lyZSBmb3IgU0xJUC4KLSAqCi0gKiBJdCBhbHNvIGluZGljYXRlcyB0aGF0LCBmb3IgY29tcHJlc3NlZCBTTElQOgotICoKLSAqCUlmIHRoZSBDT01QUkVTU0VEX1RDUCBiaXQgaXMgc2V0IGluIHRoZSBmaXJzdCBieXRlLCBpdCdzCi0gKglhIENPTVBSRVNTRURfVENQIHBhY2tldDsgdGhhdCBieXRlIGlzIHRoZSBjaGFuZ2UgYnl0ZSwgYW5kCi0gKgl0aGUgQ09NUFJFU1NFRF9UQ1AgYml0LCAweDgwLCBpc24ndCB1c2VkIGluIHRoZSBjaGFuZ2UgYnl0ZS4KLSAqCi0gKglJZiB0aGUgdXBwZXIgNCBiaXRzIG9mIHRoZSBmaXJzdCBieXRlIGFyZSA3LCBpdCdzIGFuCi0gKglVTkNPTVBSRVNTRURfVENQIHBhY2tldDsgdGhhdCBieXRlIGlzIHRoZSBmaXJzdCBieXRlIG9mCi0gKgl0aGUgVU5DT01QUkVTU0VEX1RDUCBtb2RpZmllZCBJUCBoZWFkZXIsIHdpdGggYSBjb25uZWN0aW9uCi0gKgludW1iZXIgaW4gdGhlIHByb3RvY29sIGZpZWxkLCBhbmQgd2l0aCB0aGUgdmVyc2lvbiBmaWVsZAotICoJYmVpbmcgNywgbm90IDQuCi0gKgotICoJT3RoZXJ3aXNlLCB0aGUgcGFja2V0IGlzIGFuIElQdjQgcGFja2V0ICh3aGVyZSB0aGUgdXBwZXIgNCBiaXRzCi0gKglvZiB0aGUgcGFja2V0IGFyZSA0KS4KLSAqCi0gKiBTbyB0aGlzIHJvdXRpbmUgbG9va3MgYXMgaWYgaXQncyBzb3J0LW9mIGludGVuZGVkIHRvIGhhbmRsZQotICogY29tcHJlc3NlZCBTTElQLCBhbHRob3VnaCBpdCBkb2Vzbid0IGhhbmRsZSBVTkNPTVBSRVNTRURfVENQCi0gKiBjb3JyZWN0bHkgZm9yIHRoYXQgKGl0IGRvZXNuJ3QgZml4IHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZG9lc24ndAotICogZG8gYW55dGhpbmcgdG8gdGhlIHByb3RvY29sIGZpZWxkKSwgYW5kIGRvZXNuJ3QgY2hlY2sgZm9yIENPTVBSRVNTRURfVENQCi0gKiBwYWNrZXRzIGNvcnJlY3RseSBmb3IgdGhhdCAoeW91IG9ubHkgY2hlY2sgdGhlIGZpcnN0IGJpdCAtIHNlZQotICogQi4xIGluIFJGQyAxMTQ0KS4KLSAqCi0gKiBCdXQgaXQncyBjYWxsZWQgZm9yIEJTRC9PUyBQUFAsIG5vdCBTTElQIC0gcGVyaGFwcyBCU0QvT1MgZG9lcyB3ZWlyZAotICogdGhpbmdzIHdpdGggdGhlIGhlYWRlcnM/Ci0gKgotICogV2l0aG91dCBhIEJTRC9PUyBWSkMtY29tcHJlc3NlZCBQUFAgdHJhY2UsIG9yIGtub3dsZWRnZSBvZiB3aGF0IHRoZQotICogQlNEL09TIFZKQyBjb2RlIGRvZXMsIHdlIGNhbid0IHNheSB3aGF0J3MgdGhlIGNhc2UuCi0gKgotICogV2UgdGhlcmVmb3JlIGxlYXZlICJwcm90byIgLSB3aGljaCBpcyB0aGUgUFBQIHByb3RvY29sIHR5cGUgLSBpbiBwbGFjZSwKLSAqICpub3QqIG1hcmtlZCBhcyB1bnVzZWQsIGZvciBub3csIHNvIHRoYXQgR0NDIHdhcm5pbmdzIGFib3V0IHRoZQotICogdW51c2VkIGFyZ3VtZW50IHJlbWluZCB1cyB0aGF0IHdlIHNob3VsZCBmaXggdGhpcyBzb21lIGRheS4KLSAqLwotaW50Ci12amNfcHJpbnQocmVnaXN0ZXIgY29uc3QgY2hhciAqYnAsIHVfc2hvcnQgcHJvdG8gX1VfKQotewotCWludCBpOwotCi0Jc3dpdGNoIChicFswXSAmIDB4ZjApIHsKLQljYXNlIFRZUEVfSVA6Ci0JCWlmIChlZmxhZykKLQkJCXByaW50ZigiKHZqYyB0eXBlPUlQKSAiKTsKLQkJcmV0dXJuIFBQUF9JUDsKLQljYXNlIFRZUEVfVU5DT01QUkVTU0VEX1RDUDoKLQkJaWYgKGVmbGFnKQotCQkJcHJpbnRmKCIodmpjIHR5cGU9cmF3IFRDUCkgIik7Ci0JCXJldHVybiBQUFBfSVA7Ci0JY2FzZSBUWVBFX0NPTVBSRVNTRURfVENQOgotCQlpZiAoZWZsYWcpCi0JCQlwcmludGYoIih2amMgdHlwZT1jb21wcmVzc2VkIFRDUCkgIik7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJCWlmIChicFsxXSAmICgweDgwID4+IGkpKQotCQkJCXByaW50ZigiJWMiLCAiP0NJP1NBV1UiW2ldKTsKLQkJfQotCQlpZiAoYnBbMV0pCi0JCQlwcmludGYoIiAiKTsKLQkJcHJpbnRmKCJDPTB4JTAyeCAiLCBicFsyXSk7Ci0JCXByaW50Zigic3VtPTB4JTA0eCAiLCAqKHVfc2hvcnQgKikmYnBbM10pOwotCQlyZXR1cm4gLTE7Ci0JY2FzZSBUWVBFX0VSUk9SOgotCQlpZiAoZWZsYWcpCi0JCQlwcmludGYoIih2amMgdHlwZT1lcnJvcikgIik7Ci0JCXJldHVybiAtMTsKLQlkZWZhdWx0OgotCQlpZiAoZWZsYWcpCi0JCQlwcmludGYoIih2amMgdHlwZT0weCUwMngpICIsIGJwWzBdICYgMHhmMCk7Ci0JCXJldHVybiAtMTsKLQl9Ci19CmRpZmYgLS1naXQgYS9wcmludC12cnJwLmMgYi9wcmludC12cnJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODdhNTAuLjAwMDAwMDAKLS0tIGEvcHJpbnQtdnJycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgV2lsbGlhbSBDLiBGZW5uZXIuCi0gKiAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIEtldmluIFN0ZXZlcyA8a3NAaHAuc2U+IEp1bHkgMjAwMAotICogTW9kaWZpZWQgdG86Ci0gKiAtIHByaW50IHZlcnNpb24sIHR5cGUgc3RyaW5nIGFuZCBwYWNrZXQgbGVuZ3RoCi0gKiAtIHByaW50IElQIGFkZHJlc3MgY291bnQgaWYgPiAxICgtdikKLSAqIC0gdmVyaWZ5IGNoZWNrc3VtICgtdikKLSAqIC0gcHJpbnQgYXV0aGVudGljYXRpb24gc3RyaW5nICgtdikKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUKLSAqIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaAotICogaW4gaXRzIGVudGlyZXR5LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUKLSAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4KLSAqIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiBUaGUgbmFtZSBvZiBXaWxsaWFtIEMuIEZlbm5lciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvcgotICogcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQKLSAqIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQKLSAqIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtdnJycC5jLHYgMS45LjIuMSAyMDA1LzA1LzA2IDA3OjU3OjIwIGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJleHRyYWN0LmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotCi0vKgotICogUkZDIDIzMzg6Ci0gKiAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwotICogICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHxWZXJzaW9ufCBUeXBlICB8IFZpcnR1YWwgUnRyIElEfCAgIFByaW9yaXR5ICAgIHwgQ291bnQgSVAgQWRkcnN8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICAgfCAgIEF1dGggVHlwZSAgIHwgICBBZHZlciBJbnQgICB8ICAgICAgICAgIENoZWNrc3VtICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIElQIEFkZHJlc3MgKDEpICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIElQIEFkZHJlc3MgKG4pICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLSAqICAgIHwgICAgICAgICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiBEYXRhICgxKSAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotICogICAgfCAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIERhdGEgKDIpICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0gKi8KLQotLyogVHlwZSAqLwotI2RlZmluZQlWUlJQX1RZUEVfQURWRVJUSVNFTUVOVAkxCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIHR5cGUyc3RyW10gPSB7Ci0JeyBWUlJQX1RZUEVfQURWRVJUSVNFTUVOVCwJIkFkdmVydGlzZW1lbnQiCX0sCi0JeyAwLAkJCQlOVUxMCQl9Ci19OwotCi0vKiBBdXRoIFR5cGUgKi8KLSNkZWZpbmUJVlJSUF9BVVRIX05PTkUJCTAKLSNkZWZpbmUJVlJSUF9BVVRIX1NJTVBMRQkxCi0jZGVmaW5lCVZSUlBfQVVUSF9BSAkJMgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRvayBhdXRoMnN0cltdID0gewotCXsgVlJSUF9BVVRIX05PTkUsCQkibm9uZSIJCX0sCi0JeyBWUlJQX0FVVEhfU0lNUExFLAkJInNpbXBsZSIJfSwKLQl7IFZSUlBfQVVUSF9BSCwJCQkiYWgiCQl9LAotCXsgMCwJCQkJTlVMTAkJfQotfTsKLQotdm9pZAotdnJycF9wcmludChyZWdpc3RlciBjb25zdCB1X2NoYXIgKmJwLCByZWdpc3RlciB1X2ludCBsZW4sIGludCB0dGwpCi17Ci0JaW50IHZlcnNpb24sIHR5cGUsIGF1dGhfdHlwZTsKLQljb25zdCBjaGFyICp0eXBlX3M7Ci0KLQlUQ0hFQ0soYnBbMF0pOwotCXZlcnNpb24gPSAoYnBbMF0gJiAweGYwKSA+PiA0OwotCXR5cGUgPSBicFswXSAmIDB4MGY7Ci0JdHlwZV9zID0gdG9rMnN0cih0eXBlMnN0ciwgInVua25vd24gdHlwZSAoJXUpIiwgdHlwZSk7Ci0JcHJpbnRmKCJWUlJQdiV1LCAlcyIsIHZlcnNpb24sIHR5cGVfcyk7Ci0JaWYgKHR0bCAhPSAyNTUpCi0JCXByaW50ZigiLCAodHRsICV1KSIsIHR0bCk7Ci0JaWYgKHZlcnNpb24gIT0gMiB8fCB0eXBlICE9IFZSUlBfVFlQRV9BRFZFUlRJU0VNRU5UKQotCQlyZXR1cm47Ci0JVENIRUNLKGJwWzJdKTsKLQlwcmludGYoIiwgdnJpZCAldSwgcHJpbyAldSIsIGJwWzFdLCBicFsyXSk7Ci0JVENIRUNLKGJwWzVdKTsKLQlhdXRoX3R5cGUgPSBicFs0XTsKLQlwcmludGYoIiwgYXV0aHR5cGUgJXMiLCB0b2syc3RyKGF1dGgyc3RyLCBOVUxMLCBhdXRoX3R5cGUpKTsKLQlwcmludGYoIiwgaW50dmwgJXVzLCBsZW5ndGggJXUiLCBicFs1XSxsZW4pOwotCWlmICh2ZmxhZykgewotCQlpbnQgbmFkZHJzID0gYnBbM107Ci0JCWludCBpOwotCQljaGFyIGM7Ci0KLQkJaWYgKFRURVNUMihicFswXSwgbGVuKSAmJiBpbl9ja3N1bSgoY29uc3QgdV9zaG9ydCopYnAsIGxlbiwgMCkpCi0JCQlwcmludGYoIiwgKGJhZCB2cnJwIGNrc3VtICV4KSIsCi0JCQkJRVhUUkFDVF8xNkJJVFMoJmJwWzZdKSk7Ci0JCXByaW50ZigiLCBhZGRycyIpOwotCQlpZiAobmFkZHJzID4gMSkKLQkJCXByaW50ZigiKCVkKSIsIG5hZGRycyk7Ci0JCXByaW50ZigiOiIpOwotCQljID0gJyAnOwotCQlicCArPSA4OwotCQlmb3IgKGkgPSAwOyBpIDwgbmFkZHJzOyBpKyspIHsKLQkJCVRDSEVDSyhicFszXSk7Ci0JCQlwcmludGYoIiVjJXMiLCBjLCBpcGFkZHJfc3RyaW5nKGJwKSk7Ci0JCQljID0gJywnOwotCQkJYnAgKz0gNDsKLQkJfQotCQlpZiAoYXV0aF90eXBlID09IFZSUlBfQVVUSF9TSU1QTEUpIHsgLyogc2ltcGxlIHRleHQgcGFzc3dvcmQgKi8KLQkJCVRDSEVDSyhicFs3XSk7Ci0JCQlwcmludGYoIiBhdXRoIFwiIik7Ci0JCQlpZiAoZm5fcHJpbnRuKGJwLCA4LCBzbmFwZW5kKSkgewotCQkJCXByaW50ZigiXCIiKTsKLQkJCQlnb3RvIHRydW5jOwotCQkJfQotCQkJcHJpbnRmKCJcIiIpOwotCQl9Ci0JfQotCXJldHVybjsKLXRydW5jOgotCXByaW50ZigiW3x2cnJwXSIpOwotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtd2IuYyBiL3ByaW50LXdiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODY5N2EuLjAwMDAwMDAKLS0tIGEvcHJpbnQtd2IuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcHJpbnQtd2IuYyx2IDEuMzMgMjAwNC8wMy8yNCAwNDowNjoyOCBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiYWRkcnRvbmFtZS5oIgotI2luY2x1ZGUgImV4dHJhY3QuaCIKLQotLyogWFhYIG5lZWQgdG8gYWRkIGJ5dGUtc3dhcHBpbmcgbWFjcm9zISAqLwotLyogWFhYIC0geW91IG1lYW4gbGlrZSB0aGUgb25lcyBpbiAiZXh0cmFjdC5oIj8gKi8KLQotLyoKLSAqIExhcmdlc3QgcGFja2V0IHNpemUuICBFdmVyeXRoaW5nIHNob3VsZCBmaXQgd2l0aGluIHRoaXMgc3BhY2UuCi0gKiBGb3IgaW5zdGFuY2UsIG11bHRpbGluZSBvYmplY3RzIGFyZSBzZW50IHBpZWNld2lzZS4KLSAqLwotI2RlZmluZSBNQVhGUkFNRVNJWkUgMTAyNAotCi0vKgotICogTXVsdGlwbGUgZHJhd2luZyBvcHMgY2FuIGJlIHNlbnQgaW4gb25lIHBhY2tldC4gIEVhY2ggb25lIHN0YXJ0cyBvbiBhCi0gKiBhbiBldmVuIG11bHRpcGxlIG9mIERPUF9BTElHTiBieXRlcywgd2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KLSAqLwotI2RlZmluZSBET1BfQUxJR04gNAotI2RlZmluZSBET1BfUk9VTkRVUCh4KQkoKCgoaW50KSh4KSkgKyAoRE9QX0FMSUdOIC0gMSkpICYgfihET1BfQUxJR04gLSAxKSkKLSNkZWZpbmUgRE9QX05FWFQoZClcCi0JKChzdHJ1Y3QgZG9waGRyICopKCh1X2NoYXIgKikoZCkgKyBcCi0JCQkgIERPUF9ST1VORFVQKEVYVFJBQ1RfMTZCSVRTKCYoZCktPmRoX2xlbikgKyBzaXplb2YoKihkKSkpKSkKLQotLyoKLSAqIEZvcm1hdCBvZiB0aGUgd2hpdGVib2FyZCBwYWNrZXQgaGVhZGVyLgotICogVGhlIHRyYW5zcG9ydCBsZXZlbCBoZWFkZXIuCi0gKi8KLXN0cnVjdCBwa3RfaGRyIHsKLQl1X2ludDMyX3QgcGhfc3JjOwkJLyogc2l0ZSBpZCBvZiBzb3VyY2UgKi8KLQl1X2ludDMyX3QgcGhfdHM7CQkvKiB0aW1lIHN0YW1wIChmb3Igc2tldyBjb21wdXRhdGlvbikgKi8KLQl1X2ludDE2X3QgcGhfdmVyc2lvbjsJLyogdmVyc2lvbiBudW1iZXIgKi8KLQl1X2NoYXIgcGhfdHlwZTsJCS8qIG1lc3NhZ2UgdHlwZSAqLwotCXVfY2hhciBwaF9mbGFnczsJLyogbWVzc2FnZSBmbGFncyAqLwotfTsKLQotLyogUGFja2V0IHR5cGVzICovCi0jZGVmaW5lIFBUX0RSQVdPUAkwCS8qIGRyYXdpbmcgb3BlcmF0aW9uICovCi0jZGVmaW5lIFBUX0lECQkxCS8qIGFubm91bmNlbWVudCBwYWNrZXQgKi8KLSNkZWZpbmUgUFRfUlJFUQkJMgkvKiByZXBhaXIgcmVxdWVzdCAqLwotI2RlZmluZSBQVF9SUkVQCQkzCS8qIHJlcGFpciByZXBseSAqLwotI2RlZmluZSBQVF9LSUxMCQk0CS8qIHRlcm1pbmF0ZSBwYXJ0aWNpcGF0aW9uICovCi0jZGVmaW5lIFBUX1BSRVEgICAgICAgICA1ICAgICAgIC8qIHBhZ2UgdmVjdG9yIHJlcXVlc3QgKi8KLSNkZWZpbmUgUFRfUFJFUCAgICAgICAgIDcgICAgICAgLyogcGFnZSB2ZWN0b3IgcmVwbHkgKi8KLQotI2lmZGVmIFBGX1VTRVIKLSN1bmRlZiBQRl9VU0VSCQkJLyoge0RpZ2l0YWwsVHJ1NjR9IFVOSVggZGVmaW5lIHRoaXMsIGFsYXMgKi8KLSNlbmRpZgotCi0vKiBmbGFncyAqLwotI2RlZmluZSBQRl9VU0VSCQkweDAxCS8qIGhpbnQgdGhhdCBwYWNrZXQgaGFzIGludGVyYWN0aXZlIGRhdGEgKi8KLSNkZWZpbmUgUEZfVklTCQkweDAyCS8qIG9ubHkgdmlzaWJsZSBvcHMgd2FudGVkICovCi0KLXN0cnVjdCBQYWdlSUQgewotCXVfaW50MzJfdCBwX3NpZDsJCS8qIHNlc3Npb24gaWQgb2YgaW5pdGlhdG9yICovCi0JdV9pbnQzMl90IHBfdWlkOwkJLyogcGFnZSBudW1iZXIgKi8KLX07Ci0KLXN0cnVjdCBkb3BoZHIgewotCXVfaW50MzJfdCAgZGhfdHM7CQkvKiBzZW5kZXIncyB0aW1lc3RhbXAgKi8KLQl1X2ludDE2X3QJZGhfbGVuOwkJLyogYm9keSBsZW5ndGggKi8KLQl1X2NoYXIJZGhfZmxhZ3M7Ci0JdV9jaGFyCWRoX3R5cGU7CS8qIGJvZHkgdHlwZSAqLwotCS8qIGJvZHkgZm9sbG93cyAqLwotfTsKLS8qCi0gKiBEcmF3aW5nIG9wIHN1Yi10eXBlcy4KLSAqLwotI2RlZmluZSBEVF9SRUNUICAgICAgICAgMgotI2RlZmluZSBEVF9MSU5FICAgICAgICAgMwotI2RlZmluZSBEVF9NTCAgICAgICAgICAgNAotI2RlZmluZSBEVF9ERUwgICAgICAgICAgNQotI2RlZmluZSBEVF9YRk9STSAgICAgICAgNgotI2RlZmluZSBEVF9FTEwgICAgICAgICAgNwotI2RlZmluZSBEVF9DSEFSICAgICAgICAgOAotI2RlZmluZSBEVF9TVFIgICAgICAgICAgOQotI2RlZmluZSBEVF9OT1AgICAgICAgICAgMTAKLSNkZWZpbmUgRFRfUFNDT0RFICAgICAgIDExCi0jZGVmaW5lIERUX1BTQ09NUCAgICAgICAxMgotI2RlZmluZSBEVF9SRUYgICAgICAgICAgMTMKLSNkZWZpbmUgRFRfU0tJUCAgICAgICAgIDE0Ci0jZGVmaW5lIERUX0hPTEUgICAgICAgICAxNQotI2RlZmluZSBEVF9NQVhUWVBFICAgICAgMTUKLQotLyoKLSAqIEEgZHJhd2luZyBvcGVyYXRpb24uCi0gKi8KLXN0cnVjdCBwa3RfZG9wIHsKLQlzdHJ1Y3QgUGFnZUlEIHBkX3BhZ2U7CS8qIHBhZ2UgdGhhdCBvcGVyYXRpb25zIGFwcGx5IHRvICovCi0JdV9pbnQzMl90CXBkX3NzZXE7CS8qIHN0YXJ0IHNlcXVlbmNlIG51bWJlciAqLwotCXVfaW50MzJfdAlwZF9lc2VxOwkvKiBlbmQgc2VxdWVuY2UgbnVtYmVyICovCi0JLyogZHJhd2luZyBvcHMgZm9sbG93ICovCi19OwotCi0vKgotICogQSByZXBhaXIgcmVxdWVzdC4KLSAqLwotc3RydWN0IHBrdF9ycmVxIHsKLSAgICAgICAgdV9pbnQzMl90IHByX2lkOyAgICAgICAgICAgLyogc291cmNlIGlkIG9mIGRyYXdvcHMgdG8gYmUgcmVwYWlyZWQgKi8KLSAgICAgICAgc3RydWN0IFBhZ2VJRCBwcl9wYWdlOyAgICAgICAgICAgLyogcGFnZSBvZiBkcmF3b3BzICovCi0gICAgICAgIHVfaW50MzJfdCBwcl9zc2VxOyAgICAgICAgIC8qIHN0YXJ0IHNlcW5vICovCi0gICAgICAgIHVfaW50MzJfdCBwcl9lc2VxOyAgICAgICAgIC8qIGVuZCBzZXFubyAqLwotfTsKLQotLyoKLSAqIEEgcmVwYWlyIHJlcGx5LgotICovCi1zdHJ1Y3QgcGt0X3JyZXAgewotCXVfaW50MzJfdCBwcl9pZDsJLyogb3JpZ2luYWwgc2l0ZSBpZCBvZiBvcHMgICovCi0Jc3RydWN0IHBrdF9kb3AgcHJfZG9wOwotCS8qIGRyYXdpbmcgb3BzIGZvbGxvdyAqLwotfTsKLQotc3RydWN0IGlkX29mZiB7Ci0gICAgICAgIHVfaW50MzJfdCBpZDsKLSAgICAgICAgdV9pbnQzMl90IG9mZjsKLX07Ci0KLXN0cnVjdCBwZ3N0YXRlIHsKLQl1X2ludDMyX3Qgc2xvdDsKLQlzdHJ1Y3QgUGFnZUlEIHBhZ2U7Ci0JdV9pbnQxNl90IG5pZDsKLQl1X2ludDE2X3QgcnN2ZDsKLSAgICAgICAgLyogc2VxcHRyJ3MgKi8KLX07Ci0KLS8qCi0gKiBBbiBhbm5vdW5jZW1lbnQgcGFja2V0LgotICovCi1zdHJ1Y3QgcGt0X2lkIHsKLQl1X2ludDMyX3QgcGlfbXNsb3Q7Ci0gICAgICAgIHN0cnVjdCBQYWdlSUQgICAgcGlfbXBhZ2U7ICAgICAgICAvKiBjdXJyZW50IHBhZ2UgKi8KLQlzdHJ1Y3QgcGdzdGF0ZSBwaV9wczsKLSAgICAgICAgLyogc2VxcHRyJ3MgKi8KLSAgICAgICAgLyogbnVsbC10ZXJtaW5hdGVkIHNpdGUgbmFtZSAqLwotfTsKLQotc3RydWN0IHBrdF9wcmVxIHsKLSAgICAgICAgc3RydWN0IFBhZ2VJRCAgcHBfcGFnZTsKLSAgICAgICAgdV9pbnQzMl90ICBwcF9sb3c7Ci0gICAgICAgIHVfaW50MzJfdCAgcHBfaGlnaDsKLX07Ci0KLXN0cnVjdCBwa3RfcHJlcCB7Ci0gICAgICAgIHVfaW50MzJfdCAgcHBfbjsgICAgICAgICAgIC8qIHNpemUgb2YgcGFnZWlkIGFycmF5ICovCi0gICAgICAgIC8qIHBnc3RhdGUncyBmb2xsb3cgKi8KLX07Ci0KLXN0YXRpYyBpbnQKLXdiX2lkKGNvbnN0IHN0cnVjdCBwa3RfaWQgKmlkLCB1X2ludCBsZW4pCi17Ci0JaW50IGk7Ci0JY29uc3QgY2hhciAqY3A7Ci0JY29uc3Qgc3RydWN0IGlkX29mZiAqaW87Ci0JY2hhciBjOwotCWludCBuaWQ7Ci0KLQlwcmludGYoIiB3Yi1pZDoiKTsKLQlpZiAobGVuIDwgc2l6ZW9mKCppZCkgfHwgKHVfY2hhciAqKShpZCArIDEpID4gc25hcGVuZCkKLQkJcmV0dXJuICgtMSk7Ci0JbGVuIC09IHNpemVvZigqaWQpOwotCi0JcHJpbnRmKCIgJXUvJXM6JXUgKG1heCAldS8lczoldSkgIiwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmlkLT5waV9wcy5zbG90KSwKLQkgICAgICAgaXBhZGRyX3N0cmluZygmaWQtPnBpX3BzLnBhZ2UucF9zaWQpLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmaWQtPnBpX3BzLnBhZ2UucF91aWQpLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmaWQtPnBpX21zbG90KSwKLQkgICAgICAgaXBhZGRyX3N0cmluZygmaWQtPnBpX21wYWdlLnBfc2lkKSwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJmlkLT5waV9tcGFnZS5wX3VpZCkpOwotCi0JbmlkID0gRVhUUkFDVF8xNkJJVFMoJmlkLT5waV9wcy5uaWQpOwotCWxlbiAtPSBzaXplb2YoKmlvKSAqIG5pZDsKLQlpbyA9IChzdHJ1Y3QgaWRfb2ZmICopKGlkICsgMSk7Ci0JY3AgPSAoY2hhciAqKShpbyArIG5pZCk7Ci0JaWYgKCh1X2NoYXIgKiljcCArIGxlbiA8PSBzbmFwZW5kKSB7Ci0JCXB1dGNoYXIoJyInKTsKLQkJKHZvaWQpZm5fcHJpbnQoKHVfY2hhciAqKWNwLCAodV9jaGFyICopY3AgKyBsZW4pOwotCQlwdXRjaGFyKCciJyk7Ci0JfQotCi0JYyA9ICc8JzsKLQlmb3IgKGkgPSAwOyBpIDwgbmlkICYmICh1X2NoYXIgKikoaW8gKyAxKSA8PSBzbmFwZW5kOyArK2lvLCArK2kpIHsKLQkJcHJpbnRmKCIlYyVzOiV1IiwKLQkJICAgIGMsIGlwYWRkcl9zdHJpbmcoJmlvLT5pZCksIEVYVFJBQ1RfMzJCSVRTKCZpby0+b2ZmKSk7Ci0JCWMgPSAnLCc7Ci0JfQotCWlmIChpID49IG5pZCkgewotCQlwcmludGYoIj4iKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JcmV0dXJuICgtMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXdiX3JyZXEoY29uc3Qgc3RydWN0IHBrdF9ycmVxICpycmVxLCB1X2ludCBsZW4pCi17Ci0JcHJpbnRmKCIgd2ItcnJlcToiKTsKLQlpZiAobGVuIDwgc2l6ZW9mKCpycmVxKSB8fCAodV9jaGFyICopKHJyZXEgKyAxKSA+IHNuYXBlbmQpCi0JCXJldHVybiAoLTEpOwotCi0JcHJpbnRmKCIgcGxlYXNlIHJlcGFpciAlcyAlczoldTwldToldT4iLAotCSAgICAgICBpcGFkZHJfc3RyaW5nKCZycmVxLT5wcl9pZCksCi0JICAgICAgIGlwYWRkcl9zdHJpbmcoJnJyZXEtPnByX3BhZ2UucF9zaWQpLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmcnJlcS0+cHJfcGFnZS5wX3VpZCksCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZycmVxLT5wcl9zc2VxKSwKLQkgICAgICAgRVhUUkFDVF8zMkJJVFMoJnJyZXEtPnByX2VzZXEpKTsKLQlyZXR1cm4gKDApOwotfQotCi1zdGF0aWMgaW50Ci13Yl9wcmVxKGNvbnN0IHN0cnVjdCBwa3RfcHJlcSAqcHJlcSwgdV9pbnQgbGVuKQotewotCXByaW50ZigiIHdiLXByZXE6Iik7Ci0JaWYgKGxlbiA8IHNpemVvZigqcHJlcSkgfHwgKHVfY2hhciAqKShwcmVxICsgMSkgPiBzbmFwZW5kKQotCQlyZXR1cm4gKC0xKTsKLQotCXByaW50ZigiIG5lZWQgJXUvJXM6JXUiLAotCSAgICAgICBFWFRSQUNUXzMyQklUUygmcHJlcS0+cHBfbG93KSwKLQkgICAgICAgaXBhZGRyX3N0cmluZygmcHJlcS0+cHBfcGFnZS5wX3NpZCksCi0JICAgICAgIEVYVFJBQ1RfMzJCSVRTKCZwcmVxLT5wcF9wYWdlLnBfdWlkKSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludAotd2JfcHJlcChjb25zdCBzdHJ1Y3QgcGt0X3ByZXAgKnByZXAsIHVfaW50IGxlbikKLXsKLQlpbnQgbjsKLQljb25zdCBzdHJ1Y3QgcGdzdGF0ZSAqcHM7Ci0JY29uc3QgdV9jaGFyICplcCA9IHNuYXBlbmQ7Ci0KLQlwcmludGYoIiB3Yi1wcmVwOiIpOwotCWlmIChsZW4gPCBzaXplb2YoKnByZXApKSB7Ci0JCXJldHVybiAoLTEpOwotCX0KLQluID0gRVhUUkFDVF8zMkJJVFMoJnByZXAtPnBwX24pOwotCXBzID0gKGNvbnN0IHN0cnVjdCBwZ3N0YXRlICopKHByZXAgKyAxKTsKLQl3aGlsZSAoLS1uID49IDAgJiYgKHVfY2hhciAqKShwcyArIDEpIDw9IGVwKSB7Ci0JCWNvbnN0IHN0cnVjdCBpZF9vZmYgKmlvLCAqaWU7Ci0JCWNoYXIgYyA9ICc8JzsKLQotCQlwcmludGYoIiAldS8lczoldSIsCi0JCSAgICBFWFRSQUNUXzMyQklUUygmcHMtPnNsb3QpLAotCQkgICAgaXBhZGRyX3N0cmluZygmcHMtPnBhZ2UucF9zaWQpLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJnBzLT5wYWdlLnBfdWlkKSk7Ci0JCWlvID0gKHN0cnVjdCBpZF9vZmYgKikocHMgKyAxKTsKLQkJZm9yIChpZSA9IGlvICsgcHMtPm5pZDsgaW8gPCBpZSAmJiAodV9jaGFyICopKGlvICsgMSkgPD0gZXA7ICsraW8pIHsKLQkJCXByaW50ZigiJWMlczoldSIsIGMsIGlwYWRkcl9zdHJpbmcoJmlvLT5pZCksCi0JCQkgICAgRVhUUkFDVF8zMkJJVFMoJmlvLT5vZmYpKTsKLQkJCWMgPSAnLCc7Ci0JCX0KLQkJcHJpbnRmKCI+Iik7Ci0JCXBzID0gKHN0cnVjdCBwZ3N0YXRlICopaW87Ci0JfQotCXJldHVybiAoKHVfY2hhciAqKXBzIDw9IGVwPyAwIDogLTEpOwotfQotCi0KLWNvbnN0IGNoYXIgKmRvcHN0cltdID0gewotCSJkb3AtMCEiLAotCSJkb3AtMSEiLAotCSJSRUNUIiwKLQkiTElORSIsCi0JIk1MIiwKLQkiREVMIiwKLQkiWEZPUk0iLAotCSJFTEwiLAotCSJDSEFSIiwKLQkiU1RSIiwKLQkiTk9QIiwKLQkiUFNDT0RFIiwKLQkiUFNDT01QIiwKLQkiUkVGIiwKLQkiU0tJUCIsCi0JIkhPTEUiLAotfTsKLQotc3RhdGljIGludAotd2JfZG9wcyhjb25zdCBzdHJ1Y3QgZG9waGRyICpkaCwgdV9pbnQzMl90IHNzLCB1X2ludDMyX3QgZXMpCi17Ci0JcHJpbnRmKCIgPCIpOwotCWZvciAoIDsgc3MgPD0gZXM7ICsrc3MpIHsKLQkJcmVnaXN0ZXIgaW50IHQgPSBkaC0+ZGhfdHlwZTsKLQotCQlpZiAodCA+IERUX01BWFRZUEUpCi0JCQlwcmludGYoIiBkb3AtJWQhIiwgdCk7Ci0JCWVsc2UgewotCQkJcHJpbnRmKCIgJXMiLCBkb3BzdHJbdF0pOwotCQkJaWYgKHQgPT0gRFRfU0tJUCB8fCB0ID09IERUX0hPTEUpIHsKLQkJCQl1X2ludDMyX3QgdHMgPSBFWFRSQUNUXzMyQklUUygmZGgtPmRoX3RzKTsKLQkJCQlwcmludGYoIiVkIiwgdHMgLSBzcyArIDEpOwotCQkJCWlmIChzcyA+IHRzIHx8IHRzID4gZXMpIHsKLQkJCQkJcHJpbnRmKCJbfF0iKTsKLQkJCQkJaWYgKHRzIDwgc3MpCi0JCQkJCQlyZXR1cm4gKDApOwotCQkJCX0KLQkJCQlzcyA9IHRzOwotCQkJfQotCQl9Ci0JCWRoID0gRE9QX05FWFQoZGgpOwotCQlpZiAoKHVfY2hhciAqKWRoID4gc25hcGVuZCkgewotCQkJcHJpbnRmKCJbfHdiXSIpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcHJpbnRmKCIgPiIpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXdiX3JyZXAoY29uc3Qgc3RydWN0IHBrdF9ycmVwICpycmVwLCB1X2ludCBsZW4pCi17Ci0JY29uc3Qgc3RydWN0IHBrdF9kb3AgKmRvcCA9ICZycmVwLT5wcl9kb3A7Ci0KLQlwcmludGYoIiB3Yi1ycmVwOiIpOwotCWlmIChsZW4gPCBzaXplb2YoKnJyZXApIHx8ICh1X2NoYXIgKikocnJlcCArIDEpID4gc25hcGVuZCkKLQkJcmV0dXJuICgtMSk7Ci0JbGVuIC09IHNpemVvZigqcnJlcCk7Ci0KLQlwcmludGYoIiBmb3IgJXMgJXM6JXU8JXU6JXU+IiwKLQkgICAgaXBhZGRyX3N0cmluZygmcnJlcC0+cHJfaWQpLAotCSAgICBpcGFkZHJfc3RyaW5nKCZkb3AtPnBkX3BhZ2UucF9zaWQpLAotCSAgICBFWFRSQUNUXzMyQklUUygmZG9wLT5wZF9wYWdlLnBfdWlkKSwKLQkgICAgRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfc3NlcSksCi0JICAgIEVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX2VzZXEpKTsKLQotCWlmICh2ZmxhZykKLQkJcmV0dXJuICh3Yl9kb3BzKChjb25zdCBzdHJ1Y3QgZG9waGRyICopKGRvcCArIDEpLAotCQkgICAgRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfc3NlcSksCi0JCSAgICBFWFRSQUNUXzMyQklUUygmZG9wLT5wZF9lc2VxKSkpOwotCXJldHVybiAoMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXdiX2RyYXdvcChjb25zdCBzdHJ1Y3QgcGt0X2RvcCAqZG9wLCB1X2ludCBsZW4pCi17Ci0JcHJpbnRmKCIgd2ItZG9wOiIpOwotCWlmIChsZW4gPCBzaXplb2YoKmRvcCkgfHwgKHVfY2hhciAqKShkb3AgKyAxKSA+IHNuYXBlbmQpCi0JCXJldHVybiAoLTEpOwotCWxlbiAtPSBzaXplb2YoKmRvcCk7Ci0KLQlwcmludGYoIiAlczoldTwldToldT4iLAotCSAgICBpcGFkZHJfc3RyaW5nKCZkb3AtPnBkX3BhZ2UucF9zaWQpLAotCSAgICBFWFRSQUNUXzMyQklUUygmZG9wLT5wZF9wYWdlLnBfdWlkKSwKLQkgICAgRVhUUkFDVF8zMkJJVFMoJmRvcC0+cGRfc3NlcSksCi0JICAgIEVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX2VzZXEpKTsKLQotCWlmICh2ZmxhZykKLQkJcmV0dXJuICh3Yl9kb3BzKChjb25zdCBzdHJ1Y3QgZG9waGRyICopKGRvcCArIDEpLAotCQkJCUVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX3NzZXEpLAotCQkJCUVYVFJBQ1RfMzJCSVRTKCZkb3AtPnBkX2VzZXEpKSk7Ci0JcmV0dXJuICgwKTsKLX0KLQotLyoKLSAqIFByaW50IHdoaXRlYm9hcmQgbXVsdGljYXN0IHBhY2tldHMuCi0gKi8KLXZvaWQKLXdiX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHZvaWQgKmhkciwgcmVnaXN0ZXIgdV9pbnQgbGVuKQotewotCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBwa3RfaGRyICpwaDsKLQotCXBoID0gKGNvbnN0IHN0cnVjdCBwa3RfaGRyICopaGRyOwotCWlmIChsZW4gPCBzaXplb2YoKnBoKSB8fCAodV9jaGFyICopKHBoICsgMSkgPiBzbmFwZW5kKSB7Ci0JCXByaW50ZigiW3x3Yl0iKTsKLQkJcmV0dXJuOwotCX0KLQlsZW4gLT0gc2l6ZW9mKCpwaCk7Ci0KLQlpZiAocGgtPnBoX2ZsYWdzKQotCQlwcmludGYoIioiKTsKLQlzd2l0Y2ggKHBoLT5waF90eXBlKSB7Ci0KLQljYXNlIFBUX0tJTEw6Ci0JCXByaW50ZigiIHdiLWtpbGwiKTsKLQkJcmV0dXJuOwotCi0JY2FzZSBQVF9JRDoKLQkJaWYgKHdiX2lkKChzdHJ1Y3QgcGt0X2lkICopKHBoICsgMSksIGxlbikgPj0gMCkKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUX1JSRVE6Ci0JCWlmICh3Yl9ycmVxKChzdHJ1Y3QgcGt0X3JyZXEgKikocGggKyAxKSwgbGVuKSA+PSAwKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgUFRfUlJFUDoKLQkJaWYgKHdiX3JyZXAoKHN0cnVjdCBwa3RfcnJlcCAqKShwaCArIDEpLCBsZW4pID49IDApCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JY2FzZSBQVF9EUkFXT1A6Ci0JCWlmICh3Yl9kcmF3b3AoKHN0cnVjdCBwa3RfZG9wICopKHBoICsgMSksIGxlbikgPj0gMCkKLQkJCXJldHVybjsKLQkJYnJlYWs7Ci0KLQljYXNlIFBUX1BSRVE6Ci0JCWlmICh3Yl9wcmVxKChzdHJ1Y3QgcGt0X3ByZXEgKikocGggKyAxKSwgbGVuKSA+PSAwKQotCQkJcmV0dXJuOwotCQlicmVhazsKLQotCWNhc2UgUFRfUFJFUDoKLQkJaWYgKHdiX3ByZXAoKHN0cnVjdCBwa3RfcHJlcCAqKShwaCArIDEpLCBsZW4pID49IDApCi0JCQlyZXR1cm47Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRmKCIgd2ItJWQhIiwgcGgtPnBoX3R5cGUpOwotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvcHJpbnQtemVwaHlyLmMgYi9wcmludC16ZXBoeXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZmFhMi4uMDAwMDAwMAotLS0gYS9wcmludC16ZXBoeXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKgotICogRGVjb2RlIGFuZCBwcmludCBaZXBoeXIgcGFja2V0cy4KLSAqCi0gKglodHRwOi8vd2ViLm1pdC5lZHUvemVwaHlyL2RvYy9wcm90b2NvbAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBOaWNrb2xhaSBaZWxkb3ZpY2ggPGtvbHlhQE1JVC5FRFU+Ci0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZQotICogZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoCi0gKiBpbiBpdHMgZW50aXJldHksIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZQotICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbgotICogdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IocykgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQotICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gKiBwZXJtaXNzaW9uLiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3ByaW50LXplcGh5ci5jLHYgMS44LjIuMSAyMDA1LzA0LzIxIDA2OjUxOjI0IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJpbnRlcmZhY2UuaCIKLQotc3RydWN0IHpfcGFja2V0IHsKLSAgICBjaGFyICp2ZXJzaW9uOwotICAgIGludCBudW1maWVsZHM7Ci0gICAgaW50IGtpbmQ7Ci0gICAgY2hhciAqdWlkOwotICAgIGludCBwb3J0OwotICAgIGludCBhdXRoOwotICAgIGludCBhdXRobGVuOwotICAgIGNoYXIgKmF1dGhkYXRhOwotICAgIGNoYXIgKmNsYXNzOwotICAgIGNoYXIgKmluc3Q7Ci0gICAgY2hhciAqb3Bjb2RlOwotICAgIGNoYXIgKnNlbmRlcjsKLSAgICBjb25zdCBjaGFyICpyZWNpcGllbnQ7Ci0gICAgY2hhciAqZm9ybWF0OwotICAgIGludCBja3N1bTsKLSAgICBpbnQgbXVsdGk7Ci0gICAgY2hhciAqbXVsdGlfdWlkOwotICAgIC8qIE90aGVyIGZpZWxkcyBmb2xsb3cgaGVyZS4uICovCi19OwotCi1lbnVtIHpfcGFja2V0X3R5cGUgewotICAgIFpfUEFDS0VUX1VOU0FGRSA9IDAsCi0gICAgWl9QQUNLRVRfVU5BQ0tFRCwKLSAgICBaX1BBQ0tFVF9BQ0tFRCwKLSAgICBaX1BBQ0tFVF9ITUFDSywKLSAgICBaX1BBQ0tFVF9ITUNUTCwKLSAgICBaX1BBQ0tFVF9TRVJWQUNLLAotICAgIFpfUEFDS0VUX1NFUlZOQUssCi0gICAgWl9QQUNLRVRfQ0xJRU5UQUNLLAotICAgIFpfUEFDS0VUX1NUQVQKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdG9rIHpfdHlwZXNbXSA9IHsKLSAgICB7IFpfUEFDS0VUX1VOU0FGRSwJCSJ1bnNhZmUiIH0sCi0gICAgeyBaX1BBQ0tFVF9VTkFDS0VELAkJInVuYWNrZWQiIH0sCi0gICAgeyBaX1BBQ0tFVF9BQ0tFRCwJCSJhY2tlZCIgfSwKLSAgICB7IFpfUEFDS0VUX0hNQUNLLAkJImhtLWFjayIgfSwKLSAgICB7IFpfUEFDS0VUX0hNQ1RMLAkJImhtLWN0bCIgfSwKLSAgICB7IFpfUEFDS0VUX1NFUlZBQ0ssCQkic2Vydi1hY2siIH0sCi0gICAgeyBaX1BBQ0tFVF9TRVJWTkFLLAkJInNlcnYtbmFrIiB9LAotICAgIHsgWl9QQUNLRVRfQ0xJRU5UQUNLLAkiY2xpZW50LWFjayIgfSwKLSAgICB7IFpfUEFDS0VUX1NUQVQsCQkic3RhdCIgfQotfTsKLQotY2hhciB6X2J1ZlsyNTZdOwotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9maWVsZChjaGFyICoqcHB0ciwgaW50ICpsZW4pCi17Ci0gICAgY2hhciAqczsKLQotICAgIGlmICgqbGVuIDw9IDAgfHwgIXBwdHIgfHwgISpwcHRyKQotCXJldHVybiBOVUxMOwotICAgIGlmICgqcHB0ciA+IChjaGFyICopIHNuYXBlbmQpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICBzID0gKnBwdHI7Ci0gICAgd2hpbGUgKCpwcHRyIDw9IChjaGFyICopIHNuYXBlbmQgJiYgKmxlbiA+PSAwICYmICoqcHB0cikgewotCSgqcHB0cikrKzsKLQkoKmxlbiktLTsKLSAgICB9Ci0gICAgKCpwcHRyKSsrOwotICAgICgqbGVuKS0tOwotICAgIGlmICgqbGVuIDwgMCB8fCAqcHB0ciA+IChjaGFyICopIHNuYXBlbmQpCi0JcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXpfdHJpcGxlKGNoYXIgKmNsYXNzLCBjaGFyICppbnN0LCBjb25zdCBjaGFyICpyZWNpcGllbnQpCi17Ci0gICAgaWYgKCEqcmVjaXBpZW50KQotCXJlY2lwaWVudCA9ICIqIjsKLSAgICBzbnByaW50Zih6X2J1Ziwgc2l6ZW9mKHpfYnVmKSwgIjwlcywlcywlcz4iLCBjbGFzcywgaW5zdCwgcmVjaXBpZW50KTsKLSAgICB6X2J1ZltzaXplb2Yoel9idWYpLTFdID0gJ1wwJzsKLSAgICByZXR1cm4gel9idWY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXN0cl90b19sb3dlcihjaGFyICpzdHJpbmcpCi17Ci0gICAgc3RybmNweSh6X2J1Ziwgc3RyaW5nLCBzaXplb2Yoel9idWYpKTsKLSAgICB6X2J1ZltzaXplb2Yoel9idWYpLTFdID0gJ1wwJzsKLQotICAgIHN0cmluZyA9IHpfYnVmOwotICAgIHdoaWxlICgqc3RyaW5nKSB7Ci0JKnN0cmluZyA9IHRvbG93ZXIoKHVuc2lnbmVkIGNoYXIpKCpzdHJpbmcpKTsKLQlzdHJpbmcrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gel9idWY7Ci19Ci0KLXZvaWQKLXplcGh5cl9wcmludChjb25zdCB1X2NoYXIgKmNwLCBpbnQgbGVuZ3RoKQotewotICAgIHN0cnVjdCB6X3BhY2tldCB6OwotICAgIGNoYXIgKnBhcnNlID0gKGNoYXIgKikgY3A7Ci0gICAgaW50IHBhcnNlbGVuID0gbGVuZ3RoOwotICAgIGNoYXIgKnM7Ci0gICAgaW50IGxvc2UgPSAwOwotCi0jZGVmaW5lIFBBUlNFX1NUUklORwkJCQlcCi0JcyA9IHBhcnNlX2ZpZWxkKCZwYXJzZSwgJnBhcnNlbGVuKTsJXAotCWlmICghcykgbG9zZSA9IDE7Ci0KLSNkZWZpbmUgUEFSU0VfRklFTERfSU5UKGZpZWxkKQkJCVwKLQlQQVJTRV9TVFJJTkcJCQkJXAotCWlmICghbG9zZSkgZmllbGQgPSBzdHJ0b2wocywgMCwgMTYpOwotCi0jZGVmaW5lIFBBUlNFX0ZJRUxEX1NUUihmaWVsZCkJCQlcCi0JUEFSU0VfU1RSSU5HCQkJCVwKLQlpZiAoIWxvc2UpIGZpZWxkID0gczsKLQotICAgIFBBUlNFX0ZJRUxEX1NUUih6LnZlcnNpb24pOwotICAgIGlmIChsb3NlKSByZXR1cm47Ci0gICAgaWYgKHN0cm5jbXAoei52ZXJzaW9uLCAiWkVQSCIsIDQpKQotCXJldHVybjsKLQotICAgIFBBUlNFX0ZJRUxEX0lOVCh6Lm51bWZpZWxkcyk7Ci0gICAgUEFSU0VfRklFTERfSU5UKHoua2luZCk7Ci0gICAgUEFSU0VfRklFTERfU1RSKHoudWlkKTsKLSAgICBQQVJTRV9GSUVMRF9JTlQoei5wb3J0KTsKLSAgICBQQVJTRV9GSUVMRF9JTlQoei5hdXRoKTsKLSAgICBQQVJTRV9GSUVMRF9JTlQoei5hdXRobGVuKTsKLSAgICBQQVJTRV9GSUVMRF9TVFIoei5hdXRoZGF0YSk7Ci0gICAgUEFSU0VfRklFTERfU1RSKHouY2xhc3MpOwotICAgIFBBUlNFX0ZJRUxEX1NUUih6Lmluc3QpOwotICAgIFBBUlNFX0ZJRUxEX1NUUih6Lm9wY29kZSk7Ci0gICAgUEFSU0VfRklFTERfU1RSKHouc2VuZGVyKTsKLSAgICBQQVJTRV9GSUVMRF9TVFIoei5yZWNpcGllbnQpOwotICAgIFBBUlNFX0ZJRUxEX1NUUih6LmZvcm1hdCk7Ci0gICAgUEFSU0VfRklFTERfSU5UKHouY2tzdW0pOwotICAgIFBBUlNFX0ZJRUxEX0lOVCh6Lm11bHRpKTsKLSAgICBQQVJTRV9GSUVMRF9TVFIoei5tdWx0aV91aWQpOwotCi0gICAgaWYgKGxvc2UpIHsKLQlwcmludGYoIiBbfHplcGh5cl0gKCVkKSIsIGxlbmd0aCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHByaW50ZigiIHplcGh5ciIpOwotICAgIGlmIChzdHJuY21wKHoudmVyc2lvbis0LCAiMC4yIiwgMykpIHsKLQlwcmludGYoIiB2JXMiLCB6LnZlcnNpb24rNCk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIHByaW50ZigiICVzIiwgdG9rMnN0cih6X3R5cGVzLCAidHlwZSAlZCIsIHoua2luZCkpOwotICAgIGlmICh6LmtpbmQgPT0gWl9QQUNLRVRfU0VSVkFDSykgewotCS8qIEluaXRpYWxpemF0aW9uIHRvIHNpbGVuY2Ugd2FybmluZ3MgKi8KLQljaGFyICphY2tkYXRhID0gTlVMTDsKLQlQQVJTRV9GSUVMRF9TVFIoYWNrZGF0YSk7Ci0JaWYgKCFsb3NlICYmIHN0cmNtcChhY2tkYXRhLCAiU0VOVCIpKQotCSAgICBwcmludGYoIi8lcyIsIHN0cl90b19sb3dlcihhY2tkYXRhKSk7Ci0gICAgfQotICAgIGlmICgqei5zZW5kZXIpIHByaW50ZigiICVzIiwgei5zZW5kZXIpOwotCi0gICAgaWYgKCFzdHJjbXAoei5jbGFzcywgIlVTRVJfTE9DQVRFIikpIHsKLQlpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIlVTRVJfSElERSIpKQotCSAgICBwcmludGYoIiBoaWRlIik7Ci0JZWxzZSBpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIlVTRVJfVU5ISURFIikpCi0JICAgIHByaW50ZigiIHVuaGlkZSIpOwotCWVsc2UKLQkgICAgcHJpbnRmKCIgbG9jYXRlICVzIiwgei5pbnN0KTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoei5jbGFzcywgIlpFUEhZUl9BRE1JTiIpKSB7Ci0JcHJpbnRmKCIgemVwaHlyLWFkbWluICVzIiwgc3RyX3RvX2xvd2VyKHoub3Bjb2RlKSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghc3RyY21wKHouY2xhc3MsICJaRVBIWVJfQ1RMIikpIHsKLQlpZiAoIXN0cmNtcCh6Lmluc3QsICJDTElFTlQiKSkgewotCSAgICBpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIlNVQlNDUklCRSIpIHx8Ci0JCSFzdHJjbXAoei5vcGNvZGUsICJTVUJTQ1JJQkVfTk9ERUZTIikgfHwKLQkJIXN0cmNtcCh6Lm9wY29kZSwgIlVOU1VCU0NSSUJFIikpIHsKLQotCQlwcmludGYoIiAlc3N1YiVzIiwgc3RyY21wKHoub3Bjb2RlLCAiU1VCU0NSSUJFIikgPyAidW4iIDogIiIsCi0JCQkJICAgc3RyY21wKHoub3Bjb2RlLCAiU1VCU0NSSUJFX05PREVGUyIpID8gIiIgOgotCQkJCQkJCQkgICAiLW5vZGVmcyIpOwotCQlpZiAoei5raW5kICE9IFpfUEFDS0VUX1NFUlZBQ0spIHsKLQkJICAgIC8qIEluaXRpYWxpemF0aW9uIHRvIHNpbGVuY2Ugd2FybmluZ3MgKi8KLQkJICAgIGNoYXIgKmMgPSBOVUxMLCAqaSA9IE5VTEwsICpyID0gTlVMTDsKLQkJICAgIFBBUlNFX0ZJRUxEX1NUUihjKTsKLQkJICAgIFBBUlNFX0ZJRUxEX1NUUihpKTsKLQkJICAgIFBBUlNFX0ZJRUxEX1NUUihyKTsKLQkJICAgIGlmICghbG9zZSkgcHJpbnRmKCIgJXMiLCB6X3RyaXBsZShjLCBpLCByKSk7Ci0JCX0KLQkJcmV0dXJuOwotCSAgICB9Ci0KLQkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJHSU1NRSIpKSB7Ci0JCXByaW50ZigiIHJldCIpOwotCQlyZXR1cm47Ci0JICAgIH0KLQotCSAgICBpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIkdJTU1FREVGUyIpKSB7Ci0JCXByaW50ZigiIGdpbW1lLWRlZnMiKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0KLQkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJDTEVBUlNVQiIpKSB7Ci0JCXByaW50ZigiIGNsZWFyLXN1YnMiKTsKLQkJcmV0dXJuOwotCSAgICB9Ci0KLQkgICAgcHJpbnRmKCIgJXMiLCBzdHJfdG9fbG93ZXIoei5vcGNvZGUpKTsKLQkgICAgcmV0dXJuOwotCX0KLQotCWlmICghc3RyY21wKHouaW5zdCwgIkhNIikpIHsKLQkgICAgcHJpbnRmKCIgJXMiLCBzdHJfdG9fbG93ZXIoei5vcGNvZGUpKTsKLQkgICAgcmV0dXJuOwotCX0KLQotCWlmICghc3RyY21wKHouaW5zdCwgIlJFQUxNIikpIHsKLQkgICAgaWYgKCFzdHJjbXAoei5vcGNvZGUsICJBRERfU1VCU0NSSUJFIikpCi0JCXByaW50ZigiIHJlYWxtIGFkZC1zdWJzIik7Ci0JICAgIGlmICghc3RyY21wKHoub3Bjb2RlLCAiUkVRX1NVQlNDUklCRSIpKQotCQlwcmludGYoIiByZWFsbSByZXEtc3VicyIpOwotCSAgICBpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIlJMTV9TVUJTQ1JJQkUiKSkKLQkJcHJpbnRmKCIgcmVhbG0gcmxtLXN1YiIpOwotCSAgICBpZiAoIXN0cmNtcCh6Lm9wY29kZSwgIlJMTV9VTlNVQlNDUklCRSIpKQotCQlwcmludGYoIiByZWFsbSBybG0tdW5zdWIiKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNtcCh6LmNsYXNzLCAiSE1fQ1RMIikpIHsKLQlwcmludGYoIiBobV9jdGwgJXMiLCBzdHJfdG9fbG93ZXIoei5pbnN0KSk7Ci0JcHJpbnRmKCIgJXMiLCBzdHJfdG9fbG93ZXIoei5vcGNvZGUpKTsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoei5jbGFzcywgIkhNX1NUQVQiKSkgewotCWlmICghc3RyY21wKHouaW5zdCwgIkhNU1RfQ0xJRU5UIikgJiYgIXN0cmNtcCh6Lm9wY29kZSwgIkdJTU1FU1RBVFMiKSkgewotCSAgICBwcmludGYoIiBnZXQtY2xpZW50LXN0YXRzIik7Ci0JICAgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICAgaWYgKCFzdHJjbXAoei5jbGFzcywgIldHX0NUTCIpKSB7Ci0JcHJpbnRmKCIgd2dfY3RsICVzIiwgc3RyX3RvX2xvd2VyKHouaW5zdCkpOwotCXByaW50ZigiICVzIiwgc3RyX3RvX2xvd2VyKHoub3Bjb2RlKSk7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghc3RyY21wKHouY2xhc3MsICJMT0dJTiIpKSB7Ci0JaWYgKCFzdHJjbXAoei5vcGNvZGUsICJVU0VSX0ZMVVNIIikpIHsKLQkgICAgcHJpbnRmKCIgZmx1c2hfbG9jcyIpOwotCSAgICByZXR1cm47Ci0JfQotCi0JaWYgKCFzdHJjbXAoei5vcGNvZGUsICJOT05FIikgfHwKLQkgICAgIXN0cmNtcCh6Lm9wY29kZSwgIk9QU1RBRkYiKSB8fAotCSAgICAhc3RyY21wKHoub3Bjb2RlLCAiUkVBTE0tVklTSUJMRSIpIHx8Ci0JICAgICFzdHJjbXAoei5vcGNvZGUsICJSRUFMTS1BTk5PVU5DRUQiKSB8fAotCSAgICAhc3RyY21wKHoub3Bjb2RlLCAiTkVULVZJU0lCTEUiKSB8fAotCSAgICAhc3RyY21wKHoub3Bjb2RlLCAiTkVULUFOTk9VTkNFRCIpKSB7Ci0JICAgIHByaW50ZigiIHNldC1leHBvc3VyZSAlcyIsIHN0cl90b19sb3dlcih6Lm9wY29kZSkpOwotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLQotICAgIGlmICghKnoucmVjaXBpZW50KQotCXoucmVjaXBpZW50ID0gIioiOwotCi0gICAgcHJpbnRmKCIgdG8gJXMiLCB6X3RyaXBsZSh6LmNsYXNzLCB6Lmluc3QsIHoucmVjaXBpZW50KSk7Ci0gICAgaWYgKCp6Lm9wY29kZSkKLQlwcmludGYoIiBvcCAlcyIsIHoub3Bjb2RlKTsKLSAgICByZXR1cm47Ci19CmRpZmYgLS1naXQgYS9yb3V0ZTZkLmggYi9yb3V0ZTZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMDAzMzEuLjAwMDAwMDAKLS0tIGEvcm91dGU2ZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBhbmQgMTk5OCBXSURFIFByb2plY3QuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotLyoKLSAqICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3JvdXRlNmQuaCx2IDEuNSAyMDAyLzEyLzExIDA3OjE0OjEwIGd1eSBFeHAgJAotICovCi0KLSNkZWZpbmUJUklQNl9WRVJTSU9OCTEKLQotI2RlZmluZQlSSVA2X1JFUVVFU1QJMQotI2RlZmluZQlSSVA2X1JFU1BPTlNFCTIKLQotc3RydWN0IG5ldGluZm82IHsKLQlzdHJ1Y3QgaW42X2FkZHIJcmlwNl9kZXN0OwotCXVfaW50MTZfdAlyaXA2X3RhZzsKLQl1X2ludDhfdAlyaXA2X3BsZW47Ci0JdV9pbnQ4X3QJcmlwNl9tZXRyaWM7Ci19OwotCi1zdHJ1Y3QJcmlwNiB7Ci0JdV9pbnQ4X3QJcmlwNl9jbWQ7Ci0JdV9pbnQ4X3QJcmlwNl92ZXJzOwotCXVfaW50OF90CXJpcDZfcmVzMVsyXTsKLQl1bmlvbiB7Ci0JCXN0cnVjdAluZXRpbmZvNglydTZfbmV0c1sxXTsKLQkJY2hhcglydTZfdHJhY2VmaWxlWzFdOwotCX0gcmlwNnVuOwotI2RlZmluZQlyaXA2X25ldHMJcmlwNnVuLnJ1Nl9uZXRzCi0jZGVmaW5lCXJpcDZfdHJhY2VmaWxlCXJpcDZ1bi5ydTZfdHJhY2VmaWxlCi19OwotCi0jZGVmaW5lCUhPUENOVF9JTkZJTklUWTYJMTYKLSNkZWZpbmUJTUFYUlRFCQkJMjQKLSNkZWZpbmUJTkVYVEhPUF9NRVRSSUMJCTB4ZmYKLQotI2lmbmRlZglERUJVRwotI2RlZmluZQlTVVBQTFlfSU5URVJWQUw2CTMwCi0jZGVmaW5lCVJJUF9MSUZFVElNRQkJMTgwCi0jZGVmaW5lCVJJUF9IT0xERE9XTgkJMTIwCi0jZGVmaW5lCVJJUF9UUklHX0lOVEVSVkFMNgk1Ci0jZGVmaW5lCVJJUF9UUklHX0lOVEVSVkFMNl9NSU4JMQotI2Vsc2UKLS8qIG9ubHkgZm9yIGRlYnVnZ2luZzsgY2FuIG5vdCB3YWl0IGZvciAzMHNlYyB0byBhcHBlYXIgYSBidWcgKi8KLSNkZWZpbmUJU1VQUExZX0lOVEVSVkFMNgkxMAotI2RlZmluZQlSSVBfTElGRVRJTUUJCTYwCi0jZGVmaW5lCVJJUF9IT0xERE9XTgkJNDAKLSNkZWZpbmUJUklQX1RSSUdfSU5URVJWQUw2CTUKLSNkZWZpbmUJUklQX1RSSUdfSU5URVJWQUw2X01JTgkxCi0jZW5kaWYKLQotI2RlZmluZQlSSVA2X1BPUlQJCTUyMQotI2RlZmluZQlSSVA2X0RFU1QJCSJmZjAyOjo5IgpkaWZmIC0tZ2l0IGEvcnBjX2F1dGguaCBiL3JwY19hdXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDQyN2UuLjAwMDAwMDAKLS0tIGEvcnBjX2F1dGguaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvcnBjX2F1dGguaCx2IDEuMS4yLjEgMjAwNS8wNC8yNyAyMTo0NDowNyBndXkgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKLSAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQotICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKLSAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCi0gKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCi0gKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KLSAqCi0gKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCi0gKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KLSAqCi0gKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKLSAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKLSAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KLSAqCi0gKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKLSAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKLSAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCi0gKgotICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQotICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCi0gKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDI1NTAgR2FyY2lhIEF2ZW51ZQotICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKLSAqCi0gKglmcm9tOiBAKCMpYXV0aC5oIDEuMTcgODgvMDIvMDggU01JCi0gKglmcm9tOiBAKCMpYXV0aC5oCTIuMyA4OC8wOC8wNyA0LjAgUlBDU1JDCi0gKiAkRnJlZUJTRDogc3JjL2luY2x1ZGUvcnBjL2F1dGguaCx2IDEuMTQuMi4xIDE5OTkvMDgvMjkgMTQ6Mzk6MDIgcGV0ZXIgRXhwICQKLSAqLwotCi0vKgotICogYXV0aC5oLCBBdXRoZW50aWNhdGlvbiBpbnRlcmZhY2UuCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTg0LCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuCi0gKgotICogVGhlIGRhdGEgc3RydWN0dXJlcyBhcmUgY29tcGxldGVseSBvcGFxdWUgdG8gdGhlIGNsaWVudC4gIFRoZSBjbGllbnQKLSAqIGlzIHJlcXVpcmVkIHRvIHBhc3MgYSBBVVRIICogdG8gcm91dGluZXMgdGhhdCBjcmVhdGUgcnBjCi0gKiAic2Vzc2lvbnMiLgotICovCi0KLS8qCi0gKiBTdGF0dXMgcmV0dXJuZWQgZnJvbSBhdXRoZW50aWNhdGlvbiBjaGVjawotICovCi1lbnVtIHN1bnJwY19hdXRoX3N0YXQgewotCVNVTlJQQ19BVVRIX09LPTAsCi0JLyoKLQkgKiBmYWlsZWQgYXQgcmVtb3RlIGVuZAotCSAqLwotCVNVTlJQQ19BVVRIX0JBRENSRUQ9MSwJCS8qIGJvZ3VzIGNyZWRlbnRpYWxzIChzZWFsIGJyb2tlbikgKi8KLQlTVU5SUENfQVVUSF9SRUpFQ1RFRENSRUQ9MiwJLyogY2xpZW50IHNob3VsZCBiZWdpbiBuZXcgc2Vzc2lvbiAqLwotCVNVTlJQQ19BVVRIX0JBRFZFUkY9MywJCS8qIGJvZ3VzIHZlcmlmaWVyIChzZWFsIGJyb2tlbikgKi8KLQlTVU5SUENfQVVUSF9SRUpFQ1RFRFZFUkY9NCwJLyogdmVyaWZpZXIgZXhwaXJlZCBvciB3YXMgcmVwbGF5ZWQgKi8KLQlTVU5SUENfQVVUSF9UT09XRUFLPTUsCQkvKiByZWplY3RlZCBkdWUgdG8gc2VjdXJpdHkgcmVhc29ucyAqLwotCS8qCi0JICogZmFpbGVkIGxvY2FsbHkKLQkqLwotCVNVTlJQQ19BVVRIX0lOVkFMSURSRVNQPTYsCS8qIGJvZ3VzIHJlc3BvbnNlIHZlcmlmaWVyICovCi0JU1VOUlBDX0FVVEhfRkFJTEVEPTcJCS8qIHNvbWUgdW5rbm93biByZWFzb24gKi8KLX07Ci0KLS8qCi0gKiBBdXRoZW50aWNhdGlvbiBpbmZvLiAgT3BhcXVlIHRvIGNsaWVudC4KLSAqLwotc3RydWN0IHN1bnJwY19vcGFxdWVfYXV0aCB7Ci0JdV9pbnQzMl90IG9hX2ZsYXZvcjsJCS8qIGZsYXZvciBvZiBhdXRoICovCi0JdV9pbnQzMl90IG9hX2xlbjsJCS8qIGxlbmd0aCBvZiBvcGFxdWUgYm9keSAqLwotCS8qIHplcm8gb3IgbW9yZSBieXRlcyBvZiBib2R5ICovCi19OwotCi0jZGVmaW5lIFNVTlJQQ19BVVRIX05PTkUJMAkvKiBubyBhdXRoZW50aWNhdGlvbiAqLwotI2RlZmluZQlTVU5SUENfQVVUSF9OVUxMCTAJLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotI2RlZmluZQlTVU5SUENfQVVUSF9VTklYCTEJLyogdW5peCBzdHlsZSAodWlkLCBnaWRzKSAqLwotI2RlZmluZQlTVU5SUENfQVVUSF9TWVMJCTEJLyogZm9yd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lCVNVTlJQQ19BVVRIX1NIT1JUCTIJLyogc2hvcnQgaGFuZCB1bml4IHN0eWxlICovCi0jZGVmaW5lIFNVTlJQQ19BVVRIX0RFUwkJMwkvKiBkZXMgc3R5bGUgKGVuY3J5cHRlZCB0aW1lc3RhbXBzKSAqLwpkaWZmIC0tZ2l0IGEvcnBjX21zZy5oIGIvcnBjX21zZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmYzYzQyLi4wMDAwMDAwCi0tLSBhL3JwY19tc2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3JwY19tc2cuaCx2IDEuMS4yLjEgMjAwNS8wNC8yNyAyMTo0NDowNyBndXkgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKLSAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQotICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKLSAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCi0gKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCi0gKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KLSAqCi0gKiBTVU4gUlBDIElTIFBST1ZJREVEIEFTIElTIFdJVEggTk8gV0FSUkFOVElFUyBPRiBBTlkgS0lORCBJTkNMVURJTkcgVEhFCi0gKiBXQVJSQU5USUVTIE9GIERFU0lHTiwgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UsIE9SIEFSSVNJTkcgRlJPTSBBIENPVVJTRSBPRiBERUFMSU5HLCBVU0FHRSBPUiBUUkFERSBQUkFDVElDRS4KLSAqCi0gKiBTdW4gUlBDIGlzIHByb3ZpZGVkIHdpdGggbm8gc3VwcG9ydCBhbmQgd2l0aG91dCBhbnkgb2JsaWdhdGlvbiBvbiB0aGUKLSAqIHBhcnQgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiB0byBhc3Npc3QgaW4gaXRzIHVzZSwgY29ycmVjdGlvbiwKLSAqIG1vZGlmaWNhdGlvbiBvciBlbmhhbmNlbWVudC4KLSAqCi0gKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKLSAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKLSAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCi0gKgotICogSW4gbm8gZXZlbnQgd2lsbCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGJlIGxpYWJsZSBmb3IgYW55IGxvc3QgcmV2ZW51ZQotICogb3IgcHJvZml0cyBvciBvdGhlciBzcGVjaWFsLCBpbmRpcmVjdCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBldmVuIGlmCi0gKiBTdW4gaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICoKLSAqIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqIDI1NTAgR2FyY2lhIEF2ZW51ZQotICogTW91bnRhaW4gVmlldywgQ2FsaWZvcm5pYSAgOTQwNDMKLSAqCi0gKglmcm9tOiBAKCMpcnBjX21zZy5oIDEuNyA4Ni8wNy8xNiBTTUkKLSAqCWZyb206IEAoIylycGNfbXNnLmgJMi4xIDg4LzA3LzI5IDQuMCBSUENTUkMKLSAqICRGcmVlQlNEOiBzcmMvaW5jbHVkZS9ycGMvcnBjX21zZy5oLHYgMS4xMS4yLjEgMTk5OS8wOC8yOSAxNDozOTowNyBwZXRlciBFeHAgJAotICovCi0KLS8qCi0gKiBycGNfbXNnLmgKLSAqIHJwYyBtZXNzYWdlIGRlZmluaXRpb24KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5ODQsIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqLwotCi0jZGVmaW5lIFNVTlJQQ19NU0dfVkVSU0lPTgkoKHVfaW50MzJfdCkgMikKLQotLyoKLSAqIEJvdHRvbSB1cCBkZWZpbml0aW9uIG9mIGFuIHJwYyBtZXNzYWdlLgotICogTk9URTogY2FsbCBhbmQgcmVwbHkgdXNlIHRoZSBzYW1lIG92ZXJhbGwgc3R1Y3QgYnV0Ci0gKiBkaWZmZXJlbnQgcGFydHMgb2YgdW5pb25zIHdpdGhpbiBpdC4KLSAqLwotCi1lbnVtIHN1bnJwY19tc2dfdHlwZSB7Ci0JU1VOUlBDX0NBTEw9MCwKLQlTVU5SUENfUkVQTFk9MQotfTsKLQotZW51bSBzdW5ycGNfcmVwbHlfc3RhdCB7Ci0JU1VOUlBDX01TR19BQ0NFUFRFRD0wLAotCVNVTlJQQ19NU0dfREVOSUVEPTEKLX07Ci0KLWVudW0gc3VucnBjX2FjY2VwdF9zdGF0IHsKLQlTVU5SUENfU1VDQ0VTUz0wLAotCVNVTlJQQ19QUk9HX1VOQVZBSUw9MSwKLQlTVU5SUENfUFJPR19NSVNNQVRDSD0yLAotCVNVTlJQQ19QUk9DX1VOQVZBSUw9MywKLQlTVU5SUENfR0FSQkFHRV9BUkdTPTQsCi0JU1VOUlBDX1NZU1RFTV9FUlI9NQotfTsKLQotZW51bSBzdW5ycGNfcmVqZWN0X3N0YXQgewotCVNVTlJQQ19SUENfTUlTTUFUQ0g9MCwKLQlTVU5SUENfQVVUSF9FUlJPUj0xCi19OwotCi0vKgotICogUmVwbHkgcGFydCBvZiBhbiBycGMgZXhjaGFuZ2UKLSAqLwotCi0vKgotICogUmVwbHkgdG8gYW4gcnBjIHJlcXVlc3QgdGhhdCB3YXMgcmVqZWN0ZWQgYnkgdGhlIHNlcnZlci4KLSAqLwotc3RydWN0IHN1bnJwY19yZWplY3RlZF9yZXBseSB7Ci0JdV9pbnQzMl90CQkgcmpfc3RhdDsJLyogZW51bSByZWplY3Rfc3RhdCAqLwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXVfaW50MzJfdCBsb3c7Ci0JCQl1X2ludDMyX3QgaGlnaDsKLQkJfSBSSl92ZXJzaW9uczsKLQkJdV9pbnQzMl90IFJKX3doeTsgIC8qIGVudW0gYXV0aF9zdGF0IC0gd2h5IGF1dGhlbnRpY2F0aW9uIGRpZCBub3Qgd29yayAqLwotCX0gcnU7Ci0jZGVmaW5lCXJqX3ZlcnMJcnUuUkpfdmVyc2lvbnMKLSNkZWZpbmUJcmpfd2h5CXJ1LlJKX3doeQotfTsKLQotLyoKLSAqIEJvZHkgb2YgYSByZXBseSB0byBhbiBycGMgcmVxdWVzdC4KLSAqLwotc3RydWN0IHN1bnJwY19yZXBseV9ib2R5IHsKLQl1X2ludDMyX3QJcnBfc3RhdDsJCS8qIGVudW0gcmVwbHlfc3RhdCAqLwotCXN0cnVjdCBzdW5ycGNfcmVqZWN0ZWRfcmVwbHkgcnBfcmVqZWN0OwkvKiBpZiByZWplY3RlZCAqLwotfTsKLQotLyoKLSAqIEJvZHkgb2YgYW4gcnBjIHJlcXVlc3QgY2FsbC4KLSAqLwotc3RydWN0IHN1bnJwY19jYWxsX2JvZHkgewotCXVfaW50MzJfdCBjYl9ycGN2ZXJzOwkvKiBtdXN0IGJlIGVxdWFsIHRvIHR3byAqLwotCXVfaW50MzJfdCBjYl9wcm9nOwotCXVfaW50MzJfdCBjYl92ZXJzOwotCXVfaW50MzJfdCBjYl9wcm9jOwotCXN0cnVjdCBzdW5ycGNfb3BhcXVlX2F1dGggY2JfY3JlZDsKLQkvKiBmb2xsb3dlZCBieSBvcGFxdWUgdmVyaWZpZXIgKi8KLX07Ci0KLS8qCi0gKiBUaGUgcnBjIG1lc3NhZ2UKLSAqLwotc3RydWN0IHN1bnJwY19tc2cgewotCXVfaW50MzJfdAkJcm1feGlkOwotCXVfaW50MzJfdAkJcm1fZGlyZWN0aW9uOwkvKiBlbnVtIG1zZ190eXBlICovCi0JdW5pb24gewotCQlzdHJ1Y3Qgc3VucnBjX2NhbGxfYm9keSBSTV9jbWI7Ci0JCXN0cnVjdCBzdW5ycGNfcmVwbHlfYm9keSBSTV9ybWI7Ci0JfSBydTsKLSNkZWZpbmUJcm1fY2FsbAkJcnUuUk1fY21iCi0jZGVmaW5lCXJtX3JlcGx5CXJ1LlJNX3JtYgotfTsKLSNkZWZpbmUJYWNwdGVkX3JwbHkJcnUuUk1fcm1iLnJ1LlJQX2FyCi0jZGVmaW5lCXJqY3RlZF9ycGx5CXJ1LlJNX3JtYi5ydS5SUF9kcgpkaWZmIC0tZ2l0IGEvcnguaCBiL3J4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MTJlNTEuLjAwMDAwMDAKLS0tIGEvcnguaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0OiAoYykgMjAwMCBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgYXMgcmVwcmVzZW50ZWQgYnkgdGhlCi0gKglTZWNyZXRhcnkgb2YgdGhlIE5hdnkuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICAgICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLS8qCi0gKiBSeCBwcm90b2NvbCBmb3JtYXQKLSAqCi0gKiAkSWQ6IHJ4LmgsdiAxLjggMjAwMi8xMi8xMSAwNzoxNDoxMSBndXkgRXhwICQKLSAqLwotCi0jZGVmaW5lIEZTX1JYX1BPUlQJNzAwMAotI2RlZmluZSBDQl9SWF9QT1JUCTcwMDEKLSNkZWZpbmUgUFJPVF9SWF9QT1JUCTcwMDIKLSNkZWZpbmUgVkxEQl9SWF9QT1JUCTcwMDMKLSNkZWZpbmUgS0FVVEhfUlhfUE9SVAk3MDA0Ci0jZGVmaW5lIFZPTF9SWF9QT1JUCTcwMDUKLSNkZWZpbmUgRVJST1JfUlhfUE9SVAk3MDA2CQkvKiBEb2Vzbid0IHNlZW0gdG8gYmUgdXNlZCAqLwotI2RlZmluZSBCT1NfUlhfUE9SVAk3MDA3Ci0KLSNpZm5kZWYgQUZTTkFNRU1BWAotI2RlZmluZSBBRlNOQU1FTUFYIDI1NgotI2VuZGlmCi0KLSNpZm5kZWYgQUZTT1BBUVVFTUFYCi0jZGVmaW5lIEFGU09QQVFVRU1BWCAxMDI0Ci0jZW5kaWYKLQotI2RlZmluZSBQUk5BTUVNQVggNjQKLSNkZWZpbmUgVkxOQU1FTUFYIDY1Ci0jZGVmaW5lIEtBTkFNRU1BWCA2NAotI2RlZmluZSBCT1NOQU1FTUFYIDI1NgotCi0jZGVmaW5lCVBSU0ZTX1JFQUQJCTEgLyogUmVhZCBmaWxlcyAqLwotI2RlZmluZQlQUlNGU19XUklURQkJMiAvKiBXcml0ZSBmaWxlcyAqLwotI2RlZmluZQlQUlNGU19JTlNFUlQJCTQgLyogSW5zZXJ0IGZpbGVzIGludG8gYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUJUFJTRlNfTE9PS1VQCQk4IC8qIExvb2t1cCBmaWxlcyBpbnRvIGEgZGlyZWN0b3J5ICovCi0jZGVmaW5lCVBSU0ZTX0RFTEVURQkJMTYgLyogRGVsZXRlIGZpbGVzICovCi0jZGVmaW5lCVBSU0ZTX0xPQ0sJCTMyIC8qIExvY2sgZmlsZXMgKi8KLSNkZWZpbmUJUFJTRlNfQURNSU5JU1RFUgk2NCAvKiBDaGFuZ2UgQUNMJ3MgKi8KLQotc3RydWN0IHJ4X2hlYWRlciB7Ci0JdV9pbnQzMl90IGVwb2NoOwotCXVfaW50MzJfdCBjaWQ7Ci0JdV9pbnQzMl90IGNhbGxOdW1iZXI7Ci0JdV9pbnQzMl90IHNlcTsKLQl1X2ludDMyX3Qgc2VyaWFsOwotCXVfaW50OF90IHR5cGU7Ci0jZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0RBVEEJCTEKLSNkZWZpbmUgUlhfUEFDS0VUX1RZUEVfQUNLCQkyCi0jZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0JVU1kJCTMKLSNkZWZpbmUgUlhfUEFDS0VUX1RZUEVfQUJPUlQJCTQKLSNkZWZpbmUgUlhfUEFDS0VUX1RZUEVfQUNLQUxMCQk1Ci0jZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0NIQUxMRU5HRQk2Ci0jZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX1JFU1BPTlNFCQk3Ci0jZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX0RFQlVHCQk4Ci0jZGVmaW5lIFJYX1BBQ0tFVF9UWVBFX1BBUkFNUwkJOQotI2RlZmluZSBSWF9QQUNLRVRfVFlQRV9WRVJTSU9OCQkxMwotCXVfaW50OF90IGZsYWdzOwotI2RlZmluZSBSWF9DTElFTlRfSU5JVElBVEVECTEKLSNkZWZpbmUgUlhfUkVRVUVTVF9BQ0sJCTIKLSNkZWZpbmUgUlhfTEFTVF9QQUNLRVQJCTQKLSNkZWZpbmUgUlhfTU9SRV9QQUNLRVRTCQk4Ci0jZGVmaW5lIFJYX0ZSRUVfUEFDS0VUCQkxNgotI2RlZmluZSBSWF9TTE9XX1NUQVJUX09LCTMyCi0jZGVmaW5lIFJYX0pVTUJPX1BBQ0tFVAkJMzIKLQl1X2ludDhfdCB1c2VyU3RhdHVzOwotCXVfaW50OF90IHNlY3VyaXR5SW5kZXg7Ci0JdV9pbnQxNl90IHNwYXJlOwkJLyogSG93IGNsZXZlcjogZXZlbiB0aG91Z2ggdGhlIEFGUyAqLwotCXVfaW50MTZfdCBzZXJ2aWNlSWQ7CQkvKiBoZWFkZXIgZmlsZXMgaW5kaWNhdGUgdGhhdCB0aGUgKi8KLX07CQkJCQkvKiBzZXJ2aWNlSWQgaXMgZmlyc3QsIGl0J3MgcmVhbGx5ICovCi0JCQkJCS8qIGVuY29kZWQgX2FmdGVyXyB0aGUgc3BhcmUgZmllbGQgKi8KLQkJCQkJLyogSSB3YXN0ZWQgYSBkYXkgZmlndXJpbmcgdGhhdCBvdXQhICovCi0KLSNkZWZpbmUgTlVNX1JYX0ZMQUdTIDcKLQotI2RlZmluZSBSWF9NQVhBQ0tTIDI1NQotCi1zdHJ1Y3QgcnhfYWNrUGFja2V0IHsKLQl1X2ludDE2X3QgYnVmZmVyU3BhY2U7CQkvKiBOdW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgYXZhaWxhYmxlICovCi0JdV9pbnQxNl90IG1heFNrZXc7CQkvKiBNYXggZGlmZiBiZXR3ZWVuIGFjaydkIHBhY2tldCBhbmQgKi8KLQkJCQkJLyogaGlnaGVzdCBwYWNrZXQgcmVjZWl2ZWQgKi8KLQl1X2ludDMyX3QgZmlyc3RQYWNrZXQ7CQkvKiBUaGUgZmlyc3QgcGFja2V0IGluIGFjayBsaXN0ICovCi0JdV9pbnQzMl90IHByZXZpb3VzUGFja2V0OwkvKiBQcmV2aW91cyBwYWNrZXQgcmVjdidkIChvYnNvbGV0ZSkgKi8KLQl1X2ludDMyX3Qgc2VyaWFsOwkJLyogIyBvZiBwYWNrZXQgdGhhdCBwcm9tcHRlZCB0aGUgYWNrICovCi0JdV9pbnQ4X3QgcmVhc29uOwkJLyogUmVhc29uIGZvciBhY2tub3dsZWRnZW1lbnQgKi8KLQl1X2ludDhfdCBuQWNrczsJCQkvKiBOdW1iZXIgb2YgYWNrbm93bGVkZ2VtZW50cyAqLwotCXVfaW50OF90IGFja3NbUlhfTUFYQUNLU107CS8qIFVwIHRvIFJYX01BWEFDS1MgYWNrbm93bGVkZ2VtZW50cyAqLwotfTsKLQotLyoKLSAqIFZhbHVlcyBmb3IgdGhlIGFja3MgYXJyYXkKLSAqLwotCi0jZGVmaW5lIFJYX0FDS19UWVBFX05BQ0sJMAkvKiBEb24ndCBoYXZlIHRoaXMgcGFja2V0ICovCi0jZGVmaW5lIFJYX0FDS19UWVBFX0FDSwkJMQkvKiBJIGhhdmUgdGhpcyBwYWNrZXQgKi8KZGlmZiAtLWdpdCBhL3NjdHBDb25zdGFudHMuaCBiL3NjdHBDb25zdGFudHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwMjI2Yi4uMDAwMDAwMAotLS0gYS9zY3RwQ29uc3RhbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NzEgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zY3RwQ29uc3RhbnRzLmgsdiAxLjQgMjAwMy8wNi8wMyAyMzo0OToyMyBndXkgRXhwICQgKExCTCkgKi8KLQotLyogU0NUUCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gQ29weXJpZ2h0IChDKSAxOTk5IENpc2NvIEFuZCBNb3Rvcm9sYQotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBDaXNjbyBub3Igb2YgTW90b3JvbGEgbWF5IGJlIHVzZWQKLSAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KLSAqCi0gKgotICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGVtYWlsCi0gKiBhZGRyZXNzZXM6Ci0gKgotICogcnN0ZXdhcjFAZW1haWwubW90LmNvbQotICoga21vcm5lYXVAY2lzY28uY29tCi0gKiBxeGllMUBlbWFpbC5tb3QuY29tCi0gKgotICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAotICogYmUgaW5jb3JwZXJhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgotICovCi0KLQotI2lmbmRlZiBfX3NjdHBDb25zdGFudHNfaF9fCi0jZGVmaW5lIF9fc2N0cENvbnN0YW50c19oX18KLQotCi0gIC8qIElmIHlvdSB3aXNoIHRvIHVzZSBNRDUgaW5zdGVhZCBvZiBTTEEgdW5jb21tZW50IHRoZSBsaW5lCi0gICAqIGJlbG93LiBXaHkgeW91IHdvdWxkIGxpa2UgdG8gZG8gdGhpczoKLSAgICogYSkgVGhlcmUgbWF5IGJlIElQUiBvbiBTSEEtMSwgb3Igc28gdGhlIEZJUC0xODAtMSBwYWdlIHNheXMsCi0gICAqIGIpIE1ENSBpcyAzIHRpbWVzIGZhc3RlciAoaGFzIGNvZGVkIGhlcmUpLgotICAgKgotICAgKiBUaGUgZGlzYWR2YW50YWdlIGlzLCBpdCBpcyB0aG91Z2h0IHRoYXQgTUQ1IGhhcyBiZWVuCi0gICAqIGNyYWNrZWQuLi4gc2VlIFJGQzIxMDQuCi0gICAqLwotLyojZGVmaW5lIFVTRV9NRDUgMSovCi0KLS8qIHRoZSBTQ1RQIHByb3RvY29sIHNpZ25hdHVyZQotICogdGhpcyBpbmNsdWRlcyB0aGUgdmVyc2lvbiBudW1iZXIKLSAqIGVuY29kZWQgaW4gdGhlIGxhc3QgNCBiaXRzIG9mIHRoZQotICogc2lnbmF0dXJlLgotICovCi0jZGVmaW5lIFBST1RPX1NJR05BVFVSRV9BIDB4MzAwMDAwMDAKLQotI2RlZmluZSBTQ1RQX1ZFUlNJT05fTlVNQkVSIDB4MwotCi0jZGVmaW5lIE1BWF9UU04gMHhmZmZmZmZmZgotI2RlZmluZSBNQVhfU0VRIDB4ZmZmZgotCi0vKiBvcHRpb246Ci0gKiBJZiB5b3UgY29tbWVudCBvdXQgdGhlIGZvbGxvd2luZyB5b3Ugd2lsbAotICogcmVjZWl2ZSB0aGUgb2xkIGJlaGF2aW9yIG9mIG9iZXlpbmcgY3duZCBmb3IKLSAqIHRoZSBmYXN0IHJldHJhbnNtaXQgYWxnb3JpdGhtLiBXaXRoIHRoaXMgZGVmaW5lZAotICogYSBGUiBoYXBwZW5zIHJpZ2h0IGF3YXkgd2l0aC1vdXQgd2FpdGluZyBmb3IgdGhlCi0gKiBmbGlnaHRzaXplIHRvIGRyb3AgYmVsb3cgdGhlIGN3bmQgdmFsdWUgKHdoaWNoCi0gKiBpcyByZWR1Y2VkIGJ5IHRoZSBGUiB0byAxLzIgdGhlIGluZmxpZ2h0IHBhY2tldHMpLgotICovCi0jZGVmaW5lIFNDVFBfSUdOT1JFX0NXTkRfT05fRlIgMQotLyogZGVmYXVsdCBtYXggSSBjYW4gYnVyc3Qgb3V0IGFmdGVyIGEgZmFzdCByZXRyYW5zbWl0ICovCi0jZGVmaW5lIFNDVFBfREVGX01BWF9CVVJTVCA0Ci0KLS8qIFBhY2tldCB0cmFuc21pdCBzdGF0ZXMgaW4gdGhlIHNlbnQKLSAqIGZpZWxkIGluIHRoZSBTQ1RQX3RyYW5zbWl0T25RdWV1ZSBzdHJ1Y3QKLSAqLwotI2RlZmluZSBTQ1RQX0RBVEFHUkFNX1VOU0VOVCAJCTAKLSNkZWZpbmUgU0NUUF9EQVRBR1JBTV9TRU5UICAgCQkxCi0jZGVmaW5lIFNDVFBfREFUQUdSQU1fUkVTRU5EMQkJMiAvKiBub3QgdXNlZCAqLwotI2RlZmluZSBTQ1RQX0RBVEFHUkFNX1JFU0VORDIJCTMgLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgU0NUUF9EQVRBR1JBTV9SRVNFTkQzCQk0IC8qIG5vdCB1c2VkICovCi0jZGVmaW5lIFNDVFBfREFUQUdSQU1fUkVTRU5ECQk1Ci0jZGVmaW5lIFNDVFBfREFUQUdSQU1fQUNLRUQJCTEwMDEwCi0jZGVmaW5lIFNDVFBfREFUQUdSQU1fSU5CT1VORAkJMTAwMTEKLSNkZWZpbmUgU0NUUF9SRUFEWV9UT19UUkFOU01JVAkJMTAwMTIKLSNkZWZpbmUgU0NUUF9EQVRBR1JBTV9NQVJLRUQJCTIwMDEwCi0KLSNkZWZpbmUgTUFYX0ZTSUQgNjQJLyogZGVidWcgNSBpbnRzIHVzZWQgZm9yIGNjIGR5bmFtaWMgdHJhY2tpbmcgKi8KLQotLyogVGhlIHZhbGlkIGRlZmluZXMgZm9yIGFsbCBtZXNzYWdlCi0gKiB0eXBlcyBrbm93IHRvIFNDVFAuIDAgaXMgcmVzZXJ2ZWQKLSAqLwotI2RlZmluZSBTQ1RQX01TR1RZUEVfTUFTSwkweGZmCi0KLSNkZWZpbmUgU0NUUF9EQVRBCQkweDAwCi0jZGVmaW5lIFNDVFBfSU5JVElBVElPTgkJMHgwMQotI2RlZmluZSBTQ1RQX0lOSVRJQVRJT05fQUNLCTB4MDIKLSNkZWZpbmUgU0NUUF9TRUxFQ1RJVkVfQUNLCTB4MDMKLSNkZWZpbmUgU0NUUF9IRUFSVEJFQVRfUkVRVUVTVAkweDA0Ci0jZGVmaW5lIFNDVFBfSEVBUlRCRUFUX0FDSwkweDA1Ci0jZGVmaW5lIFNDVFBfQUJPUlRfQVNTT0NJQVRJT04JMHgwNgotI2RlZmluZSBTQ1RQX1NIVVRET1dOCQkweDA3Ci0jZGVmaW5lIFNDVFBfU0hVVERPV05fQUNLCTB4MDgKLSNkZWZpbmUgU0NUUF9PUEVSQVRJT05fRVJSCTB4MDkKLSNkZWZpbmUgU0NUUF9DT09LSUVfRUNITwkweDBhCi0jZGVmaW5lIFNDVFBfQ09PS0lFX0FDSyAgICAgICAgIDB4MGIKLSNkZWZpbmUgU0NUUF9FQ05fRUNITwkJMHgwYwotI2RlZmluZSBTQ1RQX0VDTl9DV1IJCTB4MGQKLSNkZWZpbmUgU0NUUF9TSFVURE9XTl9DT01QTEVURQkweDBlCi0jZGVmaW5lIFNDVFBfRk9SV0FSRF9DVU1fVFNOICAgIDB4YzAKLSNkZWZpbmUgU0NUUF9SRUxJQUJMRV9DTlRMICAgICAgMHhjMQotI2RlZmluZSBTQ1RQX1JFTElBQkxFX0NOVExfQUNLICAweGMyCi0KLS8qIEFCT1JUIGFuZCBTSFVURE9XTiBDT01QTEVURSBGTEFHICovCi0jZGVmaW5lIFNDVFBfSEFEX05PX1RDQgkJMHgwMQotCi0vKiBEYXRhIENodWNrIFNwZWNpZmljIEZsYWdzICovCi0jZGVmaW5lIFNDVFBfREFUQV9GUkFHX01BU0sJMHgwMwotI2RlZmluZSBTQ1RQX0RBVEFfTUlERExFX0ZSQUcJMHgwMAotI2RlZmluZSBTQ1RQX0RBVEFfTEFTVF9GUkFHCTB4MDEKLSNkZWZpbmUgU0NUUF9EQVRBX0ZJUlNUX0ZSQUcJMHgwMgotI2RlZmluZSBTQ1RQX0RBVEFfTk9UX0ZSQUcJMHgwMwotI2RlZmluZSBTQ1RQX0RBVEFfVU5PUkRFUkVECTB4MDQKLQotI2RlZmluZSBTQ1RQX0NSQ19FTkFCTEVfQklUCTB4MDEJLyogbG93ZXIgYml0IG9mIHJlc2VydmVkICovCi0KLSNkZWZpbmUgaXNTQ1RQQ29udHJvbChhKSAoYS0+Y2h1bmtJRCAhPSBTQ1RQX0RBVEEpCi0jZGVmaW5lIGlzU0NUUERhdGEoYSkgKGEtPmNodW5rSUQgPT0gU0NUUF9EQVRBKQotCi0vKiBzY3RwIHBhcmFtZXRlciB0eXBlcyBmb3IgaW5pdC9pbml0LWFjayAqLwotCi0jZGVmaW5lIFNDVFBfSVBWNF9QQVJBTV9UWVBFICAgIDB4MDAwNQotI2RlZmluZSBTQ1RQX0lQVjZfUEFSQU1fVFlQRSAgICAweDAwMDYKLSNkZWZpbmUgU0NUUF9SRVNQT05ERVJfQ09PS0lFICAgMHgwMDA3Ci0jZGVmaW5lIFNDVFBfVU5SRUNPR19QQVJBTQkweDAwMDgKLSNkZWZpbmUgU0NUUF9DT09LSUVfUFJFU0VSVkUgICAgMHgwMDA5Ci0jZGVmaW5lIFNDVFBfSE9TVE5BTUVfVklBX0ROUyAgIDB4MDAwYgotI2RlZmluZSBTQ1RQX1JFU1RSSUNUX0FERFJfVE8JMHgwMDBjCi0KLSNkZWZpbmUgU0NUUF9FQ05fSV9DQU5fRE9fRUNOCTB4ODAwMAotI2RlZmluZSBTQ1RQX09QRVJBVElPTl9TVUNDRUVECTB4NDAwMQotI2RlZmluZSBTQ1RQX0VSUk9SX05PVF9FWEVDVVRFRAkweDQwMDIKLQotI2RlZmluZSBTQ1RQX1VOUkVMSUFCTEVfU1RSTSAgICAweGMwMDAKLSNkZWZpbmUgU0NUUF9BRERfSVBfQUREUkVTUyAgICAgMHhjMDAxCi0jZGVmaW5lIFNDVFBfREVMX0lQX0FERFJFU1MgICAgIDB4YzAwMgotI2RlZmluZSBTQ1RQX1NUUk1fRkxPV19MSU1JVCAgICAweGMwMDMKLSNkZWZpbmUgU0NUUF9QQVJUSUFMX0NTVU0gICAgICAgMHhjMDA0Ci0jZGVmaW5lIFNDVFBfRVJST1JfQ0FVU0VfVExWCTB4YzAwNQotI2RlZmluZSBTQ1RQX01JVF9TVEFDS19OQU1FCTB4YzAwNgotI2RlZmluZSBTQ1RQX1NFVEFERFJFU1NfUFJJTUFSWSAweGMwMDcKLQotLyogYml0cyBmb3IgVE9TIGZpZWxkICovCi0jZGVmaW5lIFNDVFBfRUNUX0JJVAkJMHgwMgotI2RlZmluZSBTQ1RQX0NFX0JJVAkJMHgwMQotCi0vKiBlcnJvciBjb2RlcyAqLwotI2RlZmluZSBTQ1RQX09QX0VSUk9SX05PX0VSUk9SCQkweDAwMDAKLSNkZWZpbmUgU0NUUF9PUF9FUlJPUl9JTlZfU1RSTQkJMHgwMDAxCi0jZGVmaW5lIFNDVFBfT1BfRVJST1JfTUlTU19QQVJBTQkweDAwMDIKLSNkZWZpbmUgU0NUUF9PUF9FUlJPUl9TVEFMRV9DT09LSUUJMHgwMDAzCi0jZGVmaW5lIFNDVFBfT1BfRVJST1JfTk9fUkVTT1VSQ0UgCTB4MDAwNAotI2RlZmluZSBTQ1RQX09QX0VSUk9SX0ROU19GQUlMRUQgICAJMHgwMDA1Ci0jZGVmaW5lIFNDVFBfT1BfRVJST1JfVU5LX0NIVU5LCSAgIAkweDAwMDYKLSNkZWZpbmUgU0NUUF9PUF9FUlJPUl9JTlZfUEFSQU0JCTB4MDAwNwotI2RlZmluZSBTQ1RQX09QX0VSUk9SX1VOS19QQVJBTQkgICAgICAgCTB4MDAwOAotI2RlZmluZSBTQ1RQX09QX0VSUk9SX05PX1VTRVJEICAgIAkweDAwMDkKLSNkZWZpbmUgU0NUUF9PUF9FUlJPUl9DT09LSUVfU0hVVAkweDAwMGEKLSNkZWZpbmUgU0NUUF9PUF9FUlJPUl9ERUxFVEVfTEFTVAkweDAwMGIKLSNkZWZpbmUgU0NUUF9PUF9FUlJPUl9SRVNPVVJDRV9TSE9SVCAJMHgwMDBjCi0KLSNkZWZpbmUgU0NUUF9NQVhfRVJST1JfQ0FVU0UgIDEyCi0KLS8qIGVtcHR5IGVycm9yIGNhdXNlcyBpLmUuIG5vdGhpbmcgYnV0IHRoZSBjYXVzZQotICogYXJlIFNDVFBfT1BfRVJST1JfTk9fUkVTT1VSQ0UsIFNDVFBfT1BfRVJST1JfSU5WX1BBUkFNLAotICogU0NUUF9PUF9FUlJPUl9DT09LSUVfU0hVVC4KLSAqLwotCi0vKiBwYXJhbWV0ZXIgZm9yIEhlYXJ0IEJlYXQgKi8KLSNkZWZpbmUgSEVBUlRfQkVBVF9QQVJBTSAweDAwMDEKLQotCi0KLS8qIHNlbmQgb3B0aW9ucyBmb3IgU0NUUAotICovCi0jZGVmaW5lIFNDVFBfT1JERVJFRF9ERUxJVkVSWQkJMHgwMQotI2RlZmluZSBTQ1RQX05PTl9PUkRFUkVEX0RFTElWRVJZCTB4MDIKLSNkZWZpbmUgU0NUUF9ET19DUkMxNgkJCTB4MDgKLSNkZWZpbmUgU0NUUF9NWV9BRERSRVNTX09OTFkJCTB4MTAKLQotLyogYmVsb3cgdHVybnMgb2ZmIGFib3ZlICovCi0jZGVmaW5lIFNDVFBfRkxFWElCTEVfQUREUkVTUwkJMHgyMAotI2RlZmluZSBTQ1RQX05PX0hFQVJUQkVBVAkJMHg0MAotCi0vKiBtYXNrIHRvIGdldCBzdGlja3kgKi8KLSNkZWZpbmUgU0NUUF9TVElDS1lfT1BUSU9OU19NQVNLICAgICAgICAweDBjCi0KLS8qIE1UVSBkaXNjb3ZlcnkgZmxhZ3MgKi8KLSNkZWZpbmUgU0NUUF9ET05UX0ZSQUdNRU5UCQkweDAxMDAKLSNkZWZpbmUgU0NUUF9GUkFHTUVOVF9PSwkJMHgwMjAwCi0KLQotLyogU0NUUCBzdGF0ZSBkZWZpbmVzIGZvciBpbnRlcm5hbCBzdGF0ZSBtYWNoaW5lICovCi0jZGVmaW5lIFNDVFBfU1RBVEVfRU1QVFkJCTB4MDAwMAotI2RlZmluZSBTQ1RQX1NUQVRFX0lOVVNFCQkweDAwMDEKLSNkZWZpbmUgU0NUUF9TVEFURV9DT09LSUVfV0FJVAkJMHgwMDAyCi0jZGVmaW5lIFNDVFBfU1RBVEVfQ09PS0lFX1NFTlQJCTB4MDAwNAotI2RlZmluZSBTQ1RQX1NUQVRFX09QRU4JCQkweDAwMDgKLSNkZWZpbmUgU0NUUF9TVEFURV9TSFVURE9XTgkJMHgwMDEwCi0jZGVmaW5lIFNDVFBfU1RBVEVfU0hVVERPV05fUkVDVgkweDAwMjAKLSNkZWZpbmUgU0NUUF9TVEFURV9TSFVURE9XTl9BQ0tfU0VOVAkweDAwNDAKLSNkZWZpbmUgU0NUUF9TVEFURV9TSFVURE9XTl9QRU5ECTB4MDA4MAotI2RlZmluZSBTQ1RQX1NUQVRFX01BU0sJCQkweDAwN2YKLS8qIFNDVFAgcmVhY2hhYmlsaXR5IHN0YXRlIGZvciBlYWNoIGFkZHJlc3MgKi8KLSNkZWZpbmUgU0NUUF9BRERSX05PVF9SRUFDSEFCTEUJCTEKLSNkZWZpbmUgU0NUUF9BRERSX1JFQUNIQUJMRQkJMgotI2RlZmluZSBTQ1RQX0FERFJfTk9IQgkJCTQKLSNkZWZpbmUgU0NUUF9BRERSX0JFSU5HX0RFTEVURUQJCTgKLQotLyogSG93IGxvbmcgYSBjb29raWUgbGl2ZXMgKi8KLSNkZWZpbmUgU0NUUF9ERUZBVUxUX0NPT0tJRV9MSUZFIDYwIC8qIHNlY29uZHMgKi8KLQotLyogcmVzb3VyY2UgbGltaXQgb2Ygc3RyZWFtcyAqLwotI2RlZmluZSBNQVhfU0NUUF9TVFJFQU1TIDIwNDgKLQotCi0vKiBndWVzcyBhdCBob3cgYmlnIHRvIG1ha2UgdGhlIFRTTiBtYXBwaW5nIGFycmF5ICovCi0jZGVmaW5lIFNDVFBfU1RBUlRJTkdfTUFQQVJSQVkgMTAwMDAKLQotLyogSGVyZSB3ZSBkZWZpbmUgdGhlIHRpbWVyIHR5cGVzIHVzZWQKLSAqIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBoYXMKLSAqIGFyZ3VtZW50cyBpbiB0aGUgc2V0L2dldCB0aW1lciB0eXBlIGNhbGxzLgotICovCi0jZGVmaW5lIFNDVFBfVElNRVJfSU5JVCAJMAotI2RlZmluZSBTQ1RQX1RJTUVSX1JFQ1YgCTEKLSNkZWZpbmUgU0NUUF9USU1FUl9TRU5EIAkyCi0jZGVmaW5lIFNDVFBfVElNRVJfU0hVVERPV04JMwotI2RlZmluZSBTQ1RQX1RJTUVSX0hFQVJUQkVBVAk0Ci0jZGVmaW5lIFNDVFBfVElNRVJfUE1UVQkJNQotLyogbnVtYmVyIG9mIHRpbWVyIHR5cGVzIGluIHRoZSBiYXNlIFNDVFAKLSAqIHN0cnVjdHVyZSB1c2VkIGluIHRoZSBzZXQvZ2V0IGFuZCBoYXMKLSAqIHRoZSBiYXNlIGRlZmF1bHQuCi0gKi8KLSNkZWZpbmUgU0NUUF9OVU1fVE1SUyA2Ci0KLQotCi0jZGVmaW5lIFNDVFBfSVBWNF9BRERSRVNTCTIKLSNkZWZpbmUgU0NUUF9JUFY2X0FERFJFU1MJNAotCi0vKiB0aW1lciB0eXBlcyAqLwotI2RlZmluZSBTY3RwVGltZXJUeXBlTm9uZQkJMAotI2RlZmluZSBTY3RwVGltZXJUeXBlU2VuZAkJMQotI2RlZmluZSBTY3RwVGltZXJUeXBlSW5pdAkJMgotI2RlZmluZSBTY3RwVGltZXJUeXBlUmVjdgkJMwotI2RlZmluZSBTY3RwVGltZXJUeXBlU2h1dGRvd24JCTQKLSNkZWZpbmUgU2N0cFRpbWVyVHlwZUhlYXJ0YmVhdAkJNQotI2RlZmluZSBTY3RwVGltZXJUeXBlQ29va2llCQk2Ci0jZGVmaW5lIFNjdHBUaW1lclR5cGVOZXdDb29raWUJCTcKLSNkZWZpbmUgU2N0cFRpbWVyVHlwZVBhdGhNdHVSYWlzZQk4Ci0jZGVmaW5lIFNjdHBUaW1lclR5cGVTaHV0ZG93bkFjawk5Ci0jZGVmaW5lIFNjdHBUaW1lclR5cGVSZWxSZXEJCTEwCi0KLS8qIEhlcmUgYXJlIHRoZSB0aW1lciBkaXJlY3RpdmVzIGdpdmVuIHRvIHRoZQotICogdXNlciBwcm92aWRlZCBmdW5jdGlvbgotICovCi0jZGVmaW5lIFNDVFBfVElNRVJfU1RBUlQJMQotI2RlZmluZSBTQ1RQX1RJTUVSX1NUT1AJCTIKLQotLyogcnVubmluZyBmbGFnIHN0YXRlcyBpbiB0aW1lciBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgU0NUUF9USU1FUl9JRExFCQkweDAKLSNkZWZpbmUgU0NUUF9USU1FUl9FWFBJUkVECTB4MQotI2RlZmluZSBTQ1RQX1RJTUVSX1JVTk5JTkcJMHgyCi0KLQotLyogbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB0aW1lcnMgcnVubmluZyAqLwotI2RlZmluZSBTQ1RQX01BWF9ORVRfVElNRVJTICAgICA2CS8qIGJhc2Ugb2Ygd2hlcmUgbmV0IHRpbWVycyBzdGFydCAqLwotI2RlZmluZSBTQ1RQX05VTUJFUl9USU1FUlMJMTIJLyogYWxsb3dzIHVwIHRvIDYgZGVzdGluYXRpb25zICovCi0KLQotLyogT2YgY291cnNlIHdlIHJlYWxseSBkb24ndCBjb2xsZWN0IHN0YWxlIGNvb2tpZXMsIGJlaW5nCi0gKiBmb2xrcyBvZiBkZWNlcm5pbmcgdGFzdGUuIEhvd2V2ZXIgd2UgZG8gY291bnQgdGhlbSwgaWYKLSAqIHdlIGdldCB0byBtYW55IGJlZm9yZSB0aGUgYXNzb2NpYXRpb24gY29tZXMgdXAuLiB3ZQotICogZ2l2ZSB1cC4gQmVsb3cgaXMgdGhlIGNvbnN0YW50IHRoYXQgZGljdGF0ZXMgd2hlbgotICogd2UgZ2l2ZSBpdCB1cC4uLnRoaXMgaXMgYSBpbXBsZW1lbmF0aW9uIGRlcGVuZGFudAotICogdHJlYXRtZW50LiBJbiBvdXJzIHdlIGRvIG5vdCBhc2sgZm9yIGEgZXh0ZW5zaW9uIG9mCi0gKiB0aW1lLCBidXQganVzdCByZXRyeSB0aGlzIG1hbnkgdGltZXMuLi4KLSAqLwotI2RlZmluZSBTQ1RQX01BWF9TVEFMRV9DT09LSUVTX0lfQ09MTEVDVCAxMAotCi0vKiBtYXggbnVtYmVyIG9mIFRTTidzIGR1cCdkIHRoYXQgSSB3aWxsIGhvbGQgKi8KLSNkZWZpbmUgU0NUUF9NQVhfRFVQX1RTTlMgICAgICAyMAotCi0vKiBIZXJlIHdlIGRlZmluZSB0aGUgdHlwZXMgdXNlZCB3aGVuCi0gKiBzZXR0aW5nIHRoZSByZXRyeSBhbW1vdW50cy4KLSAqLwotLyogY29uc3RhbnRzIGZvciB0eXBlIG9mIHNldCAqLwotI2RlZmluZSBTQ1RQX01BWEFUVEVNUFRfSU5JVCAyCi0jZGVmaW5lIFNDVFBfTUFYQVRURU1QVF9TRU5EIDMKLQotLyogSGVyZSB3ZSBkZWZpbmUgdGhlIGRlZmF1bHQgdGltZXJzIGFuZCB0aGUKLSAqIGRlZmF1bHQgbnVtYmVyIG9mIGF0dGVtdHMgd2UgbWFrZSBmb3IKLSAqIGVhY2ggcmVzcGVjdGl2ZSBzaWRlIChzZW5kL2luaXQpLgotICovCi0KLS8qIGluaXQgdGltZXIgZGVmID0gM3NlYyAgKi8KLSNkZWZpbmUgU0NUUF9JTklUX1NFQwkzCi0jZGVmaW5lIFNDVFBfSU5JVF9OU0VDCTAKLQotLyogc2VuZCB0aW1lciBkZWYgPSAzIHNlY29uZHMgKi8KLSNkZWZpbmUgU0NUUF9TRU5EX1NFQwkxCi0jZGVmaW5lIFNDVFBfU0VORF9OU0VDCTAKLQotLyogcmVjdiB0aW1lciBkZWYgPSAyMDBtcyAoaW4gbnNlYykgKi8KLSNkZWZpbmUgU0NUUF9SRUNWX1NFQwkwCi0jZGVmaW5lIFNDVFBfUkVDVl9OU0VDCTIwMDAwMDAwMAotCi0vKiAzMCBzZWNvbmRzICsgUlRPICovCi0jZGVmaW5lIFNDVFBfSEJfU0VDCTMwCi0jZGVmaW5lIFNDVFBfSEJfTlNFQwkwCi0KLQotLyogMzAwIG1zICovCi0jZGVmaW5lIFNDVFBfU0hVVERPV05fU0VDCTAKLSNkZWZpbmUgU0NUUF9TSFVURE9XTl9OU0VDCTMwMDAwMDAwMAotCi0jZGVmaW5lIFNDVFBfUlRPX1VQUEVSX0JPVU5EIDYwMDAwMDAwIC8qIDYwIHNlYyBpbiBtaWNyby1zZWNvbmQncyAqLwotI2RlZmluZSBTQ1RQX1JUT19VUFBFUl9CT1VORF9TRUMgNjAgIC8qIGZvciB0aGUgaW5pdCB0aW1lciAqLwotI2RlZmluZSBTQ1RQX1JUT19MT1dFUl9CT1VORCAgMTAwMDAwMCAvKiAxIHNlYyBpbiBtaWNyby1zZWMncyAqLwotCi0jZGVmaW5lIFNDVFBfREVGX01BWF9JTklUIDgKLSNkZWZpbmUgU0NUUF9ERUZfTUFYX1NFTkQgMTAKLQotI2RlZmluZSBTQ1RQX0RFRl9QTVRVX1JBSVNFIDYwMCAgLyogMTAgTWludXRlcyBiZXR3ZWVuIHJhaXNlIGF0dGVtcHRzICovCi0jZGVmaW5lIFNDVFBfREVGX1BNVFVfTUlOICAgNjAwCi0KLSNkZWZpbmUgU0NUUF9NU0VDX0lOX0FfU0VDICAxMDAwCi0jZGVmaW5lIFNDVFBfVVNFQ19JTl9BX1NFQyAgMTAwMDAwMAotI2RlZmluZSBTQ1RQX05TRUNfSU5fQV9TRUMgIDEwMDAwMDAwMDAKLQotCi0vKiBFdmVudHMgdGhhdCBTQ1RQIHdpbGwgbG9vayBmb3IsIHRoZXNlCi0gKiBhcmUgb3InZCB0b2dldGhlciB0byBkZWNsYXJlIHdoYXQgU0NUUAotICogd2FudHMuIEVhY2ggc2VsZWN0IG1hc2svcG9sbCBsaXN0IHNob3VsZCBiZQotICogc2V0IGZvciB0aGUgZmQsIGlmIHRoZSBiaXQgaXMgb24uCi0gKi8KLSNkZWZpbmUgU0NUUF9FVkVOVF9SRUFECQkweDAwMDAwMQotI2RlZmluZSBTQ1RQX0VWRU5UX1dSSVRFCTB4MDAwMDAyCi0jZGVmaW5lIFNDVFBfRVZFTlRfRVhDRVBUCTB4MDAwMDA0Ci0KLS8qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgaXMgYSB2YWx1ZSBmb3IgdGhpcwotICogcGFydGljdWxhciBpbXBsZW1lbmF0aW9uLiBJdCBpcyBxdWl0ZSBhcmJpdHJhcnkgYW5kCi0gKiBpcyB1c2VkIHRvIGxpbWl0IGhvdyBtdWNoIGRhdGEgd2lsbCBiZSBxdWV1ZWQgdXAgdG8KLSAqIGEgc2VuZGVyLCB3YWl0aW5nIGZvciBjd25kIHRvIGJlIGxhcmdlciB0aGFuIGZsaWdodFNpemUuCi0gKiBBbGwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0aGlzIHByb3RlY3Rpb24gaXMgc29tZQotICogd2F5IGR1ZSB0byBidWZmZXIgc2l6ZSBjb25zdHJhaW50cy4KLSAqLwotCi0jZGVmaW5lIFNDVFBfTUFYX09VVFNUQU5ESU5HX0RHCTEwMDAwCi0KLQotCi0vKiBUaGlzIGNvbnN0YW50IChTQ1RQX01BWF9SRUFEQlVGRkVSKSBkZWZpbmUKLSAqIGhvdyBiaWcgdGhlIHJlYWQvd3JpdGUgYnVmZmVyIGlzCi0gKiB3aGVuIHdlIGVudGVyIHRoZSBmZCBldmVudCBub3RpZmljYXRpb24KLSAqIHRoZSBidWZmZXIgaXMgcHV0IG9uIHRoZSBzdGFjaywgc28gdGhlIGJpZ2dlcgotICogaXQgaXMgdGhlIG1vcmUgc3RhY2sgeW91IGNoZXcgdXAsIGhvd2V2ZXIgaXQKLSAqIGhhcyBnb3QgdG8gYmUgYmlnIGVub3VnaCB0byBoYW5kbGUgdGhlIGJpZ2VzdAotICogbWVzc2FnZSB0aGlzIE8vUyB3aWxsIHNlbmQgeW91LiBJbiBzb2xhcmlzCi0gKiB3aXRoIHNvY2tldHMgKG5vdCBUTEkpIHdlIGVuZCB1cCBhdCBhIHZhbHVlCi0gKiBvZiA2NGsuIEluIFRMSSB3ZSBjb3VsZCBkbyBwYXJ0aWFsIHJlYWRzIHRvCi0gKiBnZXQgaXQgYWxsIGluIHdpdGggbGVzcyBoYXNzZWwuLiBidXQgd2UKLSAqIHdyaXRlIHRvIHNvY2tldHMgZm9yIGdlbmVyYWxpdHkuCi0gKi8KLSNkZWZpbmUgU0NUUF9NQVhfUkVBREJVRkZFUiA2NTUzNgotI2RlZmluZSBTQ1RQX0FERFJNQVggNjAKLQotLyogYW1vdW50IHBlZXIgaXMgb2JsaWdhdGVkIHRvIGhhdmUgaW4gcnduZCBvcgotICogSSB3aWxsIGFib3J0Ci0gKi8KLSNkZWZpbmUgU0NUUF9NSU5fUldORAkxNTAwCi0KLSNkZWZpbmUgU0NUUF9XSU5ET1dfTUlOCTE1MDAJLyogc21hbGxlc3QgcnduZCBjYW4gYmUgKi8KLSNkZWZpbmUgU0NUUF9XSU5ET1dfTUFYIDEwNDg1NzYJLyogYmlnZ2VzdCBJIGNhbiBncm93IHJ3bmQgdG8KLQkJCQkgKiBNeSBwbGF5aW5nIGFyb3VuZCBzdWdnZXN0cyBhCi0JCQkJICogdmFsdWUgZ3JlYXRlciB0aGFuIDY0ayBkb2VzIG5vdAotCQkJCSAqIGRvIG11Y2gsIEkgZ3Vlc3MgdmlhIHRoZSBrZXJuZWwKLQkJCQkgKiBsaW1pdGF0aW9ucyBvbiB0aGUgc3RyZWFtL3NvY2tldC4KLQkJCQkgKi8KLQotI2RlZmluZSBTQ1RQX01BWF9CVU5ETEVfVVAgMjU2CS8qIG1heCBudW1iZXIgb2YgY2h1bmtzIEkgY2FuIGJ1bmRsZSAqLwotCi0vKiAgSSBjYW4gaGFuZGxlIGEgMW1lZyByZS1hc3NlbWJseSAqLwotI2RlZmluZSBTQ1RQX0RFRkFVTFRfTUFYTVNHUkVBU00gMTA0ODU3NgotCi0KLSNkZWZpbmUgU0NUUF9ERUZBVUxUX01BWFdJTkRPVwkzMjc2OAkvKiBkZWZhdWx0IHJ3bmQgc2l6ZSAqLwotI2RlZmluZSBTQ1RQX0RFRkFVTFRfTUFYU0VHTUVOVCAxNTAwCS8qIE1UVSBzaXplLCB0aGlzIGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdG8gd2hpY2ggd2Ugc2V0IHRoZSBzbWFsbGVzdE1UVQotCQkJCQkgKiBzaXplIHRvLiBUaGlzIGdvdmVybnMgd2hhdCBpcyB0aGUKLQkJCQkJICogbGFyZ2VzdCBzaXplIHdlIHdpbGwgdXNlLCBvZiBjb3Vyc2UKLQkJCQkJICogUE1UVSB3aWxsIHJhaXNlIHRoaXMgdXAgdG8KLQkJCQkJICogdGhlIGxhcmdlc3QgaW50ZXJmYWNlIE1UVSBvciB0aGUKLQkJCQkJICogY2VpbGluZyBiZWxvdyBpZiB0aGVyZSBpcyBubwotCQkJCQkgKiBTSU9DR0lGTVRVLgotCQkJCQkgKi8KLSNpZmRlZiBMWU5YCi0jZGVmaW5lIERFRkFVTFRfTVRVX0NFSUxJTkcgIDE1MDAgCS8qIFNpbmNlIEx5bnggTy9TIGlzIGJyYWluIGRlYWQKLQkJCQkJICogaW4gdGhlIHdheSBpdCBoYW5kbGVzIHRoZQotCQkJCQkgKiByYXcgSVAgc29ja2V0LCBpbnNpc3RpbmcKLQkJCQkJICogb24gbWFrZWluZyBpdHMgb3duIElQCi0JCQkJCSAqIGhlYWRlciwgd2UgbGltaXQgdGhlIGdyb3d0aAotCQkJCQkgKiB0byB0aGF0IG9mIHRoZSBlLW5ldCBzaXplCi0JCQkJCSAqLwotI2Vsc2UKLSNkZWZpbmUgREVGQVVMVF9NVFVfQ0VJTElORyAgMjA0OAkvKiBJZiBubyBTSU9DR0lGTVRVLCBoaWdoZXN0IHZhbHVlCi0JCQkJCSAqIHRvIHJhaXNlIHRoZSBQTVRVIHRvLCBpLmUuCi0JCQkJCSAqIGRvbid0IHRyeSB0byByYWlzZSBhYm92ZSB0aGlzCi0JCQkJCSAqIHZhbHVlLiBUdW5lIHRoaXMgcGVyIHlvdXIKLQkJCQkJICogbGFyZ2VzdCBNVFUgaW50ZXJmYWNlIGlmIHlvdXIKLQkJCQkJICogc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhlCi0JCQkJCSAqIFNJT0NHSUZNVFUgaW9jdGwuCi0JCQkJCSAqLwotI2VuZGlmCi0jZGVmaW5lIFNDVFBfREVGQVVMVF9NSU5TRUdNRU5UIDUxMgkvKiBNVFUgc2l6ZSAuLi4gaWYgbm8gbXR1IGRpc2MgKi8KLSNkZWZpbmUgU0NUUF9IT1dfTUFOWV9TRUNSRVRTIDIJCS8qIGhvdyBtYW55IHNlY3JldHMgSSBrZWVwICovCi0vKiBUaGlzIGlzIGhvdyBsb25nIGEgc2VjcmV0IGxpdmVzLCBOT1QgaG93IGxvbmcgYSBjb29raWUgbGl2ZXMgKi8KLSNkZWZpbmUgU0NUUF9IT1dfTE9OR19DT09LSUVfTElWRSAzNjAwCS8qIGhvdyBtYW55IHNlY29uZHMgdGhlIGN1cnJlbnQgc2VjcmV0IHdpbGwgbGl2ZSAqLwotCi0jZGVmaW5lIFNDVFBfTlVNQkVSX09GX1NFQ1JFVFMJOAkvKiBvciA4ICogNCA9IDMyIG9jdGV0cyAqLwotI2RlZmluZSBTQ1RQX1NFQ1JFVF9TSVpFIDMyCQkvKiBudW1iZXIgb2Ygb2N0ZXRzIGluIGEgMjU2IGJpdHMgKi8KLQotI2lmZGVmIFVTRV9NRDUKLSNkZWZpbmUgU0NUUF9TSUdOQVRVUkVfU0laRSAxNgkvKiBzaXplIG9mIGEgTUQ1IHNpZ25hdHVyZSAqLwotI2Vsc2UKLSNkZWZpbmUgU0NUUF9TSUdOQVRVUkVfU0laRSAyMAkvKiBzaXplIG9mIGEgU0xBLTEgc2lnbmF0dXJlICovCi0jZW5kaWYKLS8qIEhlcmUgYXJlIHRoZSBub3RpZmljYXRpb24gY29uc3RhbnRzCi0gKiB0aGF0IHRoZSBjb2RlIGFuZCB1cHBlciBsYXllciB3aWxsIGdldAotICovCi0KLS8qIGFzc29jaWF0aW9uIGlzIHVwICovCi0jZGVmaW5lIFNDVFBfTk9USUZZX0FTU09DX1VQCQkxCi0KLS8qIGFzc29jaWF0aW9uIGlzIGRvd24gKi8KLSNkZWZpbmUgU0NUUF9OT1RJRllfQVNTT0NfRE9XTgkJMgotCi0vKiBpbnRlcmZhY2Ugb24gYSBhc3NvY2lhdGlvbiBpcyBkb3duCi0gKiBhbmQgb3V0IG9mIGNvbnNpZGVyYXRpb24gZm9yIHNlbGVjdGlvbi4KLSAqLwotI2RlZmluZSBTQ1RQX05PVElGWV9JTlRGX0RPV04JCTMKLQotLyogaW50ZXJmYWNlIG9uIGEgYXNzb2NpYXRpb24gaXMgdXAKLSAqIGFuZCBub3cgYmFjayBpbiBjb25zaWRlcmF0aW9uIGZvciBzZWxlY3Rpb24uCi0gKi8KLSNkZWZpbmUgU0NUUF9OT1RJRllfSU5URl9VUAkJNAotCi0vKiBUaGUgZ2l2ZW4gZGF0YWdyYW0gY2Fubm90IGJlIGRlbGl2ZXJlZAotICogdG8gdGhlIHBlZXIsIHRoaXMgd2lsbCBwcm9iYWJseSBiZSBmb2xsb3dlZAotICogYnkgYSBTQ1RQX05PVEZJWV9BU1NPQ19ET1dOLgotICovCi0jZGVmaW5lIFNDVFBfTk9USUZZX0RHX0ZBSUwJCTUKLQotLyogU2VudCBkZyBvbiBub24tb3BlbiBzdHJlYW0gZXh0cmVtZSBjb2RlIGVycm9yIQotICovCi0jZGVmaW5lIFNDVFBfTk9USUZZX1NUUkRBVEFfRVJSIAk2Ci0KLSNkZWZpbmUgU0NUUF9OT1RJRllfQVNTT0NfQUJPUlRFRAk3Ci0KLS8qIFRoZSBzdHJlYW0gb25lcyBhcmUgbm90IHVzZWQgeWV0LCBidXQgY291bGQKLSAqIGJlIHdoZW4gYSBhc3NvY2lhdGlvbiBvcGVucy4KLSAqLwotI2RlZmluZSBTQ1RQX05PVElGWV9QRUVSX09QRU5FRF9TVFIJOAotI2RlZmluZSBTQ1RQX05PVElGWV9TVFJFQU1fT1BFTkVEX09LCTkKLQotLyogYXNzb2NpYXRpb24gc2VlcyBhIHJlc3RhcnQgZXZlbnQgKi8KLSNkZWZpbmUgU0NUUF9OT1RJRllfQVNTT0NfUkVTVEFSVAkxMAotCi0vKiBhIHVzZXIgcmVxdWVzdGVkIEhCIHJldHVybmVkICovCi0jZGVmaW5lIFNDVFBfTk9USUZZX0hCX1JFU1AgICAgICAgICAgICAgMTEKLQotLyogYSByZXN1bHQgZnJvbSBhIFJFTC1SRVEgKi8KLSNkZWZpbmUgU0NUUF9OT1RJRllfUkVMUkVRX1JFU1VMVF9PSwkJMTIKLSNkZWZpbmUgU0NUUF9OT1RJRllfUkVMUkVRX1JFU1VMVF9GQUlMRUQJMTMKLQotLyogY2xvY2sgdmFyaWFuY2UgaXMgMTBtcyBvciAxMCwwMDAgdXMncyAqLwotI2RlZmluZSBTQ1RQX0NMT0NLX0dSQUlOVUxBUklUWSAxMDAwMAotCi0jZGVmaW5lIElQX0hEUl9TSVpFIDQwCQkvKiB3ZSB1c2UgdGhlIHNpemUgb2YgYSBJUDYgaGVhZGVyIGhlcmUKLQkJCQkgKiB0aGlzIGRldHJhY3RzIGEgc21hbGwgYW1vdW50IGZvciBpcHY0Ci0JCQkJICogYnV0IGl0IHNpbXBsaWZpZXMgdGhlIGlwdjYgYWRkaXRpb24KLQkJCQkgKi8KLQotI2RlZmluZSBTQ1RQX05VTV9GRFMgMwotCi0vKiByYXcgSVAgZmlsZWRlc2NyaXB0b3IgKi8KLSNkZWZpbmUgU0NUUF9GRF9JUCAgIDAKLS8qIHJhdyBJQ01QIGZpbGVkZXNjcmlwdG9yICovCi0jZGVmaW5lIFNDVFBfRkRfSUNNUCAxCi0vKiBwcm9jZXNzZXMgY29udGFjdCBtZSBmb3IgcmVxdWVzdHMgaGVyZSAqLwotI2RlZmluZSBTQ1RQX1JFUVVFU1QgMgotCi0KLSNkZWZpbmUgU0NUUF9ERUFNT05fUE9SVCA5ODk5Ci0KLS8qIERlYW1vbiByZWdpc3RyYXRpb24gbWVzc2FnZSB0eXBlcy9yZXNwb25zZXMgKi8KLSNkZWZpbmUgREVBTU9OX1JFR0lTVEVSICAgICAgIDB4MDEKLSNkZWZpbmUgREVBTU9OX1JFR0lTVEVSX0FDSyAgIDB4MDIKLSNkZWZpbmUgREVBTU9OX0RFUkVHSVNURVIgICAgIDB4MDMKLSNkZWZpbmUgREVBTU9OX0RFUkVHSVNURVJfQUNLIDB4MDQKLSNkZWZpbmUgREVBTU9OX0NIRUNLQUREUl9MSVNUIDB4MDUKLQotI2RlZmluZSBERUFNT05fTUFHSUNfVkVSX0xFTiAweGZmCi0KLS8qIG1heCB0aW1lcyBJIHdpbGwgYXR0ZW1wdCB0byBzZW5kIGEgbWVzc2FnZSB0byBkZWFtb24gKi8KLSNkZWZpbmUgU0NUUF9NQVhfQVRURU1QVFNfQVRfREVBTU9OIDUKLSNkZWZpbmUgU0NUUF9USU1FT1VUX0lOX1BPTExfRk9SX0RFQU1PTiAxNTAwIC8qIDEuNSBzZWNvbmRzICovCi0KLS8qIG1vZHVsYXIgY29tcGFyaXNvbiAqLwotLyogVHJ1ZSBpZiBhID4gYiAobW9kID0gTSkgKi8KLSNkZWZpbmUgY29tcGFyZV93aXRoX3dyYXAoYSwgYiwgTSkgKChhID4gYikgJiYgKChhIC0gYikgPCAoTSA+PiAxKSkpIHx8IFwKLSAgICAgICAgICAgICAgKChiID4gYSkgJiYgKChiIC0gYSkgPiAoTSA+PiAxKSkpCi0KLSNpZm5kZWYgVElNRVZBTF9UT19USU1FU1BFQwotI2RlZmluZSBUSU1FVkFMX1RPX1RJTUVTUEVDKHR2LCB0cykJCQlcCi17CQkJCQkJCVwKLSAgICAodHMpLT50dl9zZWMgID0gKHR2KS0+dHZfc2VjOwkJCVwKLSAgICAodHMpLT50dl9uc2VjID0gKHR2KS0+dHZfdXNlYyAqIDEwMDA7CQlcCi19Ci0jZW5kaWYKLQotLyogcGVncyAqLwotI2RlZmluZSBTQ1RQX05VTUJFUl9PRl9QRUdTIDIxCi0vKiBwZWcgaW5kZXgncyAqLwotI2RlZmluZSBTQ1RQX1BFR19TQUNLU19TRUVOIDAKLSNkZWZpbmUgU0NUUF9QRUdfU0FDS1NfU0VOVCAxCi0jZGVmaW5lIFNDVFBfUEVHX1RTTlNfU0VOVCAgMgotI2RlZmluZSBTQ1RQX1BFR19UU05TX1JDVkQgIDMKLSNkZWZpbmUgU0NUUF9EQVRBR1JBTVNfU0VOVCA0Ci0jZGVmaW5lIFNDVFBfREFUQUdSQU1TX1JDVkQgNQotI2RlZmluZSBTQ1RQX1JFVFJBTlRTTl9TRU5UIDYKLSNkZWZpbmUgU0NUUF9EVVBUU05fUkVDVkQgICA3Ci0jZGVmaW5lIFNDVFBfSEJSX1JFQ1YJICAgIDgKLSNkZWZpbmUgU0NUUF9IQkFfUkVDViAgICAgICA5Ci0jZGVmaW5lIFNDVFBfSEJfU0VOVAkgICAxMAotI2RlZmluZSBTQ1RQX0RBVEFfREdfU0VOVCAgMTEKLSNkZWZpbmUgU0NUUF9EQVRBX0RHX1JFQ1YgIDEyCi0jZGVmaW5lIFNDVFBfVE1JVF9USU1FUiAgICAxMwotI2RlZmluZSBTQ1RQX1JFQ1ZfVElNRVIgICAgMTQKLSNkZWZpbmUgU0NUUF9IQl9USU1FUiAgICAgIDE1Ci0jZGVmaW5lIFNDVFBfRkFTVF9SRVRSQU4gICAxNgotI2RlZmluZSBTQ1RQX1BFR19UU05TX1JFQUQgMTcKLSNkZWZpbmUgU0NUUF9OT05FX0xGVF9UTyAgIDE4Ci0jZGVmaW5lIFNDVFBfTk9ORV9MRlRfUldORCAxOQotI2RlZmluZSBTQ1RQX05PTkVfTEZUX0NXTkQgMjAKLQotCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9zY3RwSGVhZGVyLmggYi9zY3RwSGVhZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjYwOTQuLjAwMDAwMDAKLS0tIGEvc2N0cEhlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvc2N0cEhlYWRlci5oLHYgMS42IDIwMDIvMTIvMTEgMDc6MTQ6MTEgZ3V5IEV4cCAkIChMQkwpICovCi0KLS8qIFNDVFAgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIENvcHlyaWdodCAoQykgMTk5OSBDaXNjbyBBbmQgTW90b3JvbGEKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgQ2lzY28gbm9yIG9mIE1vdG9yb2xhIG1heSBiZSB1c2VkCi0gKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFNDVFAgcmVmZXJlbmNlIEltcGxlbWVudGF0aW9uCi0gKgotICoKLSAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBlbWFpbAotICogYWRkcmVzc2VzOgotICoKLSAqIHJzdGV3YXIxQGVtYWlsLm1vdC5jb20KLSAqIGttb3JuZWF1QGNpc2NvLmNvbQotICogcXhpZTFAZW1haWwubW90LmNvbQotICoKLSAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKLSAqIGJlIGluY29ycGVyYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KLSAqLwotCi0KLSNpZm5kZWYgX19zY3RwSGVhZGVyX2hfXwotI2RlZmluZSBfX3NjdHBIZWFkZXJfaF9fCi0KLSNpbmNsdWRlIDxzY3RwQ29uc3RhbnRzLmg+Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogdGhlIHNjdHAgY29tbW9uIGhlYWRlciAqLwotCi0jaWZkZWYgVFJVNjQKLSAjZGVmaW5lIF82NEJJVFMgMQotI2VuZGlmCi0KLXN0cnVjdCBzY3RwSGVhZGVyewotICB1X2ludDE2X3Qgc291cmNlOwotICB1X2ludDE2X3QgZGVzdGluYXRpb247Ci0gIHVfaW50MzJfdCB2ZXJpZmljYXRpb25UYWc7Ci0gIHVfaW50MzJfdCBhZGxlcjMyOwotfTsKLQotLyogdmFyaW91cyBkZXNjcmlwdG9yIHBhcnNlcnMgKi8KLQotc3RydWN0IHNjdHBDaHVua0Rlc2N7Ci0gIHVfaW50OF90IGNodW5rSUQ7Ci0gIHVfaW50OF90IGNodW5rRmxnOwotICB1X2ludDE2X3QgY2h1bmtMZW5ndGg7Ci19OwotCi1zdHJ1Y3Qgc2N0cFBhcmFtRGVzY3sKLSAgdV9pbnQxNl90IHBhcmFtVHlwZTsKLSAgdV9pbnQxNl90IHBhcmFtTGVuZ3RoOwotfTsKLQotCi1zdHJ1Y3Qgc2N0cFJlbENodW5rRGVzY3sKLSAgc3RydWN0IHNjdHBDaHVua0Rlc2MgY2hrOwotICB1X2ludDMyX3Qgc2VyaWFsTnVtYmVyOwotfTsKLQotc3RydWN0IHNjdHBWZW5kb3JTcGVjaWZpY1BhcmFtIHsKLSAgc3RydWN0IHNjdHBQYXJhbURlc2MgcDsgIC8qIHR5cGUgbXVzdCBiZSAweGZmZmUgKi8KLSAgdV9pbnQzMl90IHZlbmRvcklkOwkgICAvKiB2ZW5kb3IgSUQgZnJvbSBSRkMgMTcwMCAqLwotICB1X2ludDE2X3QgdmVuZG9yU3BlY2lmaWNUeXBlOwotICB1X2ludDE2X3QgdmVuZG9yU3BlY2lmaWNMZW47Ci19OwotCi0KLS8qIFN0cnVjdHVyZXMgZm9yIHRoZSBjb250cm9sIHBhcnRzICovCi0KLQotCi0vKiBTY3RwIGFzc29jaWF0aW9uIGluaXQgcmVxdWVzdC9hY2sgKi8KLQotLyogdGhpcyBpcyB1c2VkIGZvciBpbml0IGFjaywgdG9vICovCi1zdHJ1Y3Qgc2N0cEluaXRpYXRpb257Ci0gIHVfaW50MzJfdCBpbml0VGFnOwkJLyogdGFnIG9mIG1pbmUgKi8KLSAgdV9pbnQzMl90IHJjdldpbmRvd0NyZWRpdDsJLyogcnduZCAqLwotICB1X2ludDE2X3QgTnVtUHJlb3BlblN0cmVhbXM7CS8qIE9TICovCi0gIHVfaW50MTZfdCBNYXhJbmJvdW5kU3RyZWFtczsgICAgIC8qIE1JUyAqLwotICB1X2ludDMyX3QgaW5pdGlhbFRTTjsKLSAgLyogb3B0aW9uYWwgcGFyYW0ncyBmb2xsb3cgaW4gc2N0cFBhcmFtRGVzYyBmb3JtICovCi19OwotCi1zdHJ1Y3Qgc2N0cFY0SXBBZGRyZXNzewotICBzdHJ1Y3Qgc2N0cFBhcmFtRGVzYyBwOwkvKiB0eXBlIGlzIHNldCB0byBTQ1RQX0lQVjRfUEFSQU1fVFlQRSwgbGVuPTEwICovCi0gIHVfaW50MzJfdCAgaXBBZGRyZXNzOwotfTsKLQotCi1zdHJ1Y3Qgc2N0cFY2SXBBZGRyZXNzewotICBzdHJ1Y3Qgc2N0cFBhcmFtRGVzYyBwOwkvKiB0eXBlIGlzIHNldCB0byBTQ1RQX0lQVjZfUEFSQU1fVFlQRSwgbGVuPTIyICovCi0gIHVfaW50OF90ICBpcEFkZHJlc3NbMTZdOwotfTsKLQotc3RydWN0IHNjdHBETlNOYW1lewotICBzdHJ1Y3Qgc2N0cFBhcmFtRGVzYyBwYXJhbTsKLSAgdV9pbnQ4X3QgbmFtZVsxXTsKLX07Ci0KLQotc3RydWN0IHNjdHBDb29raWVQcmVzZXJ2ZXsKLSAgc3RydWN0IHNjdHBQYXJhbURlc2MgcDsJLyogdHlwZSBpcyBzZXQgdG8gU0NUUF9DT09LSUVfUFJFU0VSVkUsIGxlbj04ICovCi0gIHVfaW50MzJfdCBleHRyYVRpbWU7Ci19OwotCi0KLXN0cnVjdCBzY3RwVGltZVN0YW1wewotICB1X2ludDMyX3QgdHNfc2VjOwotICB1X2ludDMyX3QgdHNfdXNlYzsKLX07Ci0KLS8qIHdpcmUgc3RydWN0dXJlIG9mIG15IGNvb2tpZSAqLwotc3RydWN0IGNvb2tpZU1lc3NhZ2V7Ci0gIHVfaW50MzJfdCBUaWVUYWdfY3VyVGFnOwkJLyogY29waWVkIGZyb20gYXNzb2MgaWYgcHJlc2VudCAqLwotICB1X2ludDMyX3QgVGllVGFnX2hpc1RhZzsgCQkvKiBjb3BpZWQgZnJvbSBhc3NvYyBpZiBwcmVzZW50ICovCi0gIGludDMyX3QgY29va2llTGlmZTsJCQkvKiBsaWZlIEkgd2lsbCBhd2FyZCB0aGlzIGNvb2tpZSAqLwotICBzdHJ1Y3Qgc2N0cFRpbWVTdGFtcCB0aW1lRW50ZXJpbmdTdGF0ZTsgLyogdGhlIHRpbWUgSSBidWlsdCBjb29raWUgKi8KLSAgc3RydWN0IHNjdHBJbml0aWF0aW9uIGluaXRBY2tJU2VudDsJLyogdGhlIElOSVQtQUNLIHRoYXQgSSBzZW50IHRvIG15IHBlZXIgKi8KLSAgdV9pbnQzMl90IGFkZHJlc3NXaGVyZUlTZW50WzRdOwkvKiBJIG1ha2UgdGhpcyA0IGludHMgc28gSSBnZXQgMTI4Yml0cyBmb3IgZnV0dXJlICovCi0gIGludDMyX3QgYWRkcnR5cGU7CQkJLyogYWRkcmVzcyB0eXBlICovCi0gIHVfaW50MTZfdCBsb2NTY29wZTsJCQkvKiBWNiBsb2NhbCBzY29wZSBmbGFnICovCi0gIHVfaW50MTZfdCBzaXRlU2NvcGU7CQkJLyogVjYgc2l0ZSBzY29wZSBmbGFnICovCi0gIC8qIGF0IHRoZSBlbmQgaXMgdGFja2VkIG9uIHRoZSBJTklUIGNodW5rIHNlbnQgaW4KLSAgICogaXRzIGVudGlyZXR5IGFuZCBvZiBjb3Vyc2Ugb3VyCi0gICAqIHNpZ25hdHVyZS4KLSAgICovCi19OwotCi0KLS8qIHRoaXMgZ3V5IGlzIGZvciB1c2Ugd2hlbgotICogSSBoYXZlIGEgaW5pdGlhdGUgbWVzc2FnZSBnbG9taW5nIHRoZQotICogdGhpbmdzIHRvZ2V0aGVyLgotCi0gKi8KLXN0cnVjdCBzY3RwVW5pZmllZEluaXR7Ci0gIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIHVoOwotICBzdHJ1Y3Qgc2N0cEluaXRpYXRpb24gaW5pdG07Ci19OwotCi1zdHJ1Y3Qgc2N0cFNlbmRhYmxlSW5pdHsKLSAgc3RydWN0IHNjdHBIZWFkZXIgbWg7Ci0gIHN0cnVjdCBzY3RwVW5pZmllZEluaXQgbXNnOwotfTsKLQotCi0vKiBTZWxlY3RpdmUgQWNrbm93bGVkZ2VtZW50Ci0gKiBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgd2l0aAotICogYSBvcHRpb25hbCBhbW1vdW50IG9mIHRyYWlsaW5nIGludCdzCi0gKiBvbiB0aGUgbGFzdCBwYXJ0IChiYXNlZCBvbiB0aGUgbnVtYmVyT2ZEZXNjCi0gKiBmaWVsZCkuCi0gKi8KLQotc3RydWN0IHNjdHBTZWxlY3RpdmVBY2t7Ci0gIHVfaW50MzJfdCBoaWdoZXN0Q29uc2VxVFNOOwotICB1X2ludDMyX3QgdXBkYXRlZFJ3bmQ7Ci0gIHVfaW50MTZfdCBudW1iZXJPZmRlc2M7Ci0gIHVfaW50MTZfdCBudW1EdXBUc25zOwotfTsKLQotc3RydWN0IHNjdHBTZWxlY3RpdmVGcmFnewotICB1X2ludDE2X3QgZnJhZ21lbnRTdGFydDsKLSAgdV9pbnQxNl90IGZyYWdtZW50RW5kOwotfTsKLQotCi1zdHJ1Y3Qgc2N0cFVuaWZpZWRTYWNrewotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLSAgc3RydWN0IHNjdHBTZWxlY3RpdmVBY2sgc2FjazsKLX07Ci0KLS8qIGZvciBib3RoIFJUVCByZXF1ZXN0L3Jlc3BvbnNlIHRoZQotICogZm9sbG93aW5nIGlzIHNlbnQKLSAqLwotCi1zdHJ1Y3Qgc2N0cEhCcmVxdWVzdCB7Ci0gIHVfaW50MzJfdCB0aW1lX3ZhbHVlXzE7Ci0gIHVfaW50MzJfdCB0aW1lX3ZhbHVlXzI7Ci19OwotCi0vKiBoZXJlIGlzIHdoYXQgSSByZWFkIGFuZCByZXNwb25kIHdpdGggdG8uICovCi1zdHJ1Y3Qgc2N0cEhCdW5pZmllZHsKLSAgc3RydWN0IHNjdHBDaHVua0Rlc2MgaGRyOwotICBzdHJ1Y3Qgc2N0cFBhcmFtRGVzYyBoYjsKLX07Ci0KLQotLyogaGVyZSBpcyB3aGF0IEkgc2VuZCAqLwotc3RydWN0IHNjdHBIQnNlbmRlcnsKLSAgc3RydWN0IHNjdHBDaHVua0Rlc2MgaGRyOwotICBzdHJ1Y3Qgc2N0cFBhcmFtRGVzYyBoYjsKLSAgc3RydWN0IHNjdHBIQnJlcXVlc3QgcnR0OwotICBpbnQ4X3QgYWRkckZtdFtTQ1RQX0FERFJNQVhdOwotICB1X2ludDE2X3QgdXNlcnJlcTsKLX07Ci0KLQotCi0vKiBmb3IgdGhlIGFib3J0IGFuZCBzaHV0ZG93biBBQ0sKLSAqIHdlIG11c3QgY2FycnkgdGhlIGluaXQgdGFnIGluIHRoZSBjb21tb24gaGVhZGVyLiBKdXN0IHRoZQotICogY29tbW9uIGhlYWRlciBpcyBhbGwgdGhhdCBpcyBuZWVkZWQgd2l0aCBhIGNodW5rIGRlc2NyaXB0b3IuCi0gKi8KLXN0cnVjdCBzY3RwVW5pZmllZEFib3J0ewotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLX07Ci0KLXN0cnVjdCBzY3RwVW5pZmllZEFib3J0TGlnaHR7Ci0gIHN0cnVjdCBzY3RwSGVhZGVyIG1oOwotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLX07Ci0KLXN0cnVjdCBzY3RwVW5pZmllZEFib3J0SGVhdnl7Ci0gIHN0cnVjdCBzY3RwSGVhZGVyIG1oOwotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLSAgdV9pbnQxNl90IGNhdXNlQ29kZTsKLSAgdV9pbnQxNl90IGNhdXNlTGVuOwotfTsKLQotLyogRm9yIHRoZSBncmFjZWZ1bCBzaHV0ZG93biB3ZSBtdXN0IGNhcnJ5Ci0gKiB0aGUgdGFnIChpbiBjb21tb24gaGVhZGVyKSAgYW5kIHRoZSBoaWdoZXN0IGNvbnNlcXVpdGl2ZSBhY2tpbmcgdmFsdWUKLSAqLwotc3RydWN0IHNjdHBTaHV0ZG93biB7Ci0gIHVfaW50MzJfdCBUU05fU2VlbjsKLX07Ci0KLXN0cnVjdCBzY3RwVW5pZmllZFNodXRkb3duewotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLSAgc3RydWN0IHNjdHBTaHV0ZG93biBzaHV0OwotfTsKLQotLyogaW4gdGhlIHVuaWZpZWQgbWVzc2FnZSB3ZSBhZGQgdGhlIHRyYWlsaW5nCi0gKiBzdHJlYW0gaWQgc2luY2UgaXQgaXMgdGhlIG9ubHkgbWVzc2FnZQotICogdGhhdCBpcyBkZWZpbmVkIGFzIGEgb3BlcmF0aW9uIGVycm9yLgotICovCi1zdHJ1Y3Qgc2N0cE9wRXJyb3JDYXVzZXsKLSAgdV9pbnQxNl90IGNhdXNlOwotICB1X2ludDE2X3QgY2F1c2VMZW47Ci19OwotCi1zdHJ1Y3Qgc2N0cFVuaWZpZWRPcEVycm9yewotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLSAgc3RydWN0IHNjdHBPcEVycm9yQ2F1c2UgYzsKLX07Ci0KLXN0cnVjdCBzY3RwVW5pZmllZFN0cmVhbUVycm9yewotICBzdHJ1Y3Qgc2N0cEhlYWRlciBtaDsKLSAgc3RydWN0IHNjdHBDaHVua0Rlc2MgdWg7Ci0gIHN0cnVjdCBzY3RwT3BFcnJvckNhdXNlIGM7Ci0gIHVfaW50MTZfdCBzdHJtTnVtOwotICB1X2ludDE2X3QgcmVzZXJ2ZWQ7Ci19OwotCi1zdHJ1Y3Qgc3RhbGVDb29raWVNc2d7Ci0gIHN0cnVjdCBzY3RwSGVhZGVyIG1oOwotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLSAgc3RydWN0IHNjdHBPcEVycm9yQ2F1c2UgYzsKLSAgdV9pbnQzMl90IG1vcmV0aW1lOwotfTsKLQotLyogdGhlIGZvbGxvd2luZyBpcyB1c2VkIGluIGFsbCBzZW5kcwotICogd2hlcmUgbm90aGluZyBpcyBuZWVkZWQgZXhjZXB0IHRoZQotICogY2h1bmsvdHlwZSBpLmUuIHNodXRkb3duQWNrIEFib3J0ICovCi0KLXN0cnVjdCBzY3RwVW5pZmllZFNpbmdsZU1zZ3sKLSAgc3RydWN0IHNjdHBIZWFkZXIgbWg7Ci0gIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIHVoOwotfTsKLQotc3RydWN0IHNjdHBEYXRhUGFydHsKLSAgdV9pbnQzMl90IFRTTjsKLSAgdV9pbnQxNl90IHN0cmVhbUlkOwotICB1X2ludDE2X3Qgc2VxdWVuY2U7Ci0gIHVfaW50MzJfdCBwYXlsb2FkdHlwZTsKLX07Ci0KLXN0cnVjdCBzY3RwVW5pZmllZERhdGFncmFtewotICBzdHJ1Y3Qgc2N0cENodW5rRGVzYyB1aDsKLSAgc3RydWN0IHNjdHBEYXRhUGFydCBkcDsKLX07Ci0KLXN0cnVjdCBzY3RwRUNOX2VjaG97Ci0gIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIHVoOwotICB1X2ludDMyX3QgTG93ZXN0X1RTTjsKLX07Ci0KLQotc3RydWN0IHNjdHBDV1J7Ci0gIHN0cnVjdCBzY3RwQ2h1bmtEZXNjIHVoOwotICB1X2ludDMyX3QgVFNOX3JlZHVjZWRfYXQ7Ci19OwotCi0jaWZkZWYJX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NlbmQtYWNrLmF3ayBiL3NlbmQtYWNrLmF3awpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU1YjdjMi4uMDAwMDAwMAotLS0gYS9zZW5kLWFjay5hd2sKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi1CRUdJTgl7Ci0JIyB3ZSBuZWVkIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBwYWNrZXQgdG8gZG8gdGhlIG91dHB1dAotCSMgaW4gcGFja2V0IG51bWJlcnMgcmF0aGVyIHRoYW4gYnl0ZSBudW1iZXJzLgotCWlmIChwYWNrZXRzaXplIDw9IDApCi0JCXBhY2tldHNpemUgPSA1MTIKLQlleHBlY3ROZXh0ID0gMQotCWxhc3R3aW4gPSAtMQotCX0KLQl7Ci0JIyBjb252ZXJ0IHRjcCB0cmFjZSB0byBzZW5kL2FjayBmb3JtLgotCW4gPSBzcGxpdCAoJDEsdCwiOiIpCi0JdGltID0gdFsxXSozNjAwICsgdFsyXSo2MCArIHRbM10KLQlpZiAoTlIgPD0gMSkgewotCQl0emVybyA9IHRpbQotCQlsdGltID0gdGltCi0JCU9GUyA9ICJcdCIKLQl9Ci0JaWYgKCQ2ICE9ICJhY2siKSB7Ci0JCSMgd2UgaGF2ZSBhIGRhdGEgcGFja2V0IHJlY29yZDoKLQkJIyBpZ25vcmUgZ3V5cyB3aXRoIHN5biwgZmluIG9yIHJlc2V0ICdjYXVzZSB3ZQotCQkjIGNhbid0IGhhbmRsZSB0aGVpciBzZXF1ZW5jZSBudW1iZXJzLiAgVHJ5IHRvCi0JCSMgZGV0ZWN0IGFuZCBhZGQgYSBmbGFnIGNoYXJhY3RlciBmb3IgJ2Fub21hbGllcyc6Ci0JCSMgICAqIC0+IHJlLXNlbnQgcGFja2V0Ci0JCSMgICAtIC0+IHBhY2tldCBhZnRlciBob2xlIChtaXNzaW5nIHBhY2tldChzKSkKLQkJIyAgICMgLT4gb2RkIHNpemUgcGFja2V0Ci0JCWlmICgkNSAhfiAvW1NGUl0vKSB7Ci0JCQlpID0gaW5kZXgoJDYsIjoiKQotCQkJaiA9IGluZGV4KCQ2LCIoIikKLQkJCXN0cnRTZXEgPSBzdWJzdHIoJDYsMSxpLTEpCi0JCQllbmRTZXEgPSBzdWJzdHIoJDYsaSsxLGotaS0xKQotCQkJbGVuID0gZW5kU2VxIC0gc3RydFNlcQotCQkJaWQgPSBlbmRTZXEKLQkJCWlmICghIHRpbWVPZltpZF0pCi0JCQkJdGltZU9mW2lkXSA9IHRpbQotCQkJaWYgKGVuZFNlcSAtIGV4cGVjdE5leHQgPCAwKQotCQkJCWZsYWcgPSAiKiIKLQkJCWVsc2UgewotCQkJCWlmIChzdHJ0U2VxIC0gZXhwZWN0TmV4dCA+IDApCi0JCQkJCWZsYWcgPSAiLSIKLQkJCQllbHNlIGlmIChsZW4gIT0gcGFja2V0c2l6ZSkKLQkJCQkJZmxhZyA9ICIjIgotCQkJCWVsc2UKLQkJCQkJZmxhZyA9ICIgIgotCQkJCWV4cGVjdE5leHQgPSBlbmRTZXEKLQkJCX0KLQkJCXByaW50ZiAiJTcuMmZcdCU3LjJmXHQlcyBzZW5kICVzICVkIiwgdGltLXR6ZXJvLCB0aW0tbHRpbSxcCi0JCQkJZmxhZywgJDUsIHN0cnRTZXEKLQkJCWlmICgrK3RpbWVzU2VudFtpZF0gPiAxKQotCQkJCXByaW50ZiAiICAoJS4yZikgWyVkXSIsIHRpbSAtIHRpbWVPZltpZF0sIHRpbWVzU2VudFtpZF0KLQkJCWlmIChsZW4gIT0gcGFja2V0c2l6ZSkKLQkJCQlwcmludGYgIiA8JWQ+IiwgbGVuCi0JCX0KLQl9IGVsc2UgewotCQlpZCA9ICQ3Ci0KLQkJcHJpbnRmICIlNy4yZlx0JTcuMmZcdCVzICBhY2sgJXMgJWQiLCB0aW0tdHplcm8sIHRpbS1sdGltLFwKLQkJCWZsYWcsICQ1LCBpZAotCQlpZiAoJDkgIT0gbGFzdHdpbikgewotCQkJcHJpbnRmICIgIHdpbiAlZCIsICQ5Ci0JCQlsYXN0d2luID0gJDkKLQkJfQotCQlwcmludGYgIiAgKCUuMmYpIiwgdGltIC0gdGltZU9mW2lkXQotCQlpZiAoKyt0aW1lc0Fja2VkW2lkXSA+IDEpCi0JCQlwcmludGYgIiBbJWRdIiwgdGltZXNBY2tlZFtpZF0KLQl9Ci0JcHJpbnRmICJcbiIKLQlsdGltID0gdGltCi0JfQpkaWZmIC0tZ2l0IGEvc2V0c2lnbmFsLmMgYi9zZXRzaWduYWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiODY3OC4uMDAwMDAwMAotLS0gYS9zZXRzaWduYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zZXRzaWduYWwuYyx2IDEuMTEgMjAwMy8xMS8xNiAwOTozNjo0MiBndXkgRXhwICQgKExCTCkiOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpZmRlZiBIQVZFX1NJR0FDVElPTgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX09TX1BST1RPX0gKLSNpbmNsdWRlICJvcy1wcm90by5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJzZXRzaWduYWwuaCIKLQotLyoKLSAqIEFuIE9TLWluZGVwZW5kZW50IHNpZ25hbCgpIHdpdGgsIHdoZW5ldmVyIHBvc3NpYmxlLCBwYXJ0aWFsIEJTRAotICogc2VtYW50aWNzLCBpLmUuIHRoZSBzaWduYWwgaGFuZGxlciBpcyByZXN0b3JlZCBmb2xsb3dpbmcgc2VydmljZQotICogb2YgdGhlIHNpZ25hbCwgYnV0IHN5c3RlbSBjYWxscyBhcmUgKm5vdCogcmVzdGFydGVkLCBzbyB0aGF0IGlmCi0gKiAicGNhcF9icmVha2xvb3AoKSIgaXMgY2FsbGVkIGluIGEgc2lnbmFsIGhhbmRsZXIgaW4gYSBsaXZlIGNhcHR1cmUsCi0gKiB0aGUgcmVhZC9yZWN2ZnJvbS93aGF0ZXZlciBpbiB0aGUgbGl2ZSBjYXB0dXJlIGRvZXNuJ3QgZ2V0IHJlc3RhcnRlZCwKLSAqIGl0IHJldHVybnMgLTEgYW5kIHNldHMgImVycm5vIiB0byBFSU5UUiwgc28gd2UgY2FuIGJyZWFrIG91dCBvZiB0aGUKLSAqIGxpdmUgY2FwdHVyZSBsb29wLgotICoKLSAqIFdlIHVzZSAic2lnYWN0aW9uKCkiIGlmIGF2YWlsYWJsZS4gIFdlIGRvbid0IHNwZWNpZnkgdGhhdCB0aGUgc2lnbmFsCi0gKiBzaG91bGQgcmVzdGFydCBzeXN0ZW0gY2FsbHMsIHNvIHRoYXQgc2hvdWxkIGFsd2F5cyBkbyB3aGF0IHdlIHdhbnQuCi0gKgotICogT3RoZXJ3aXNlLCBpZiAic2lnc2V0KCkiIGlzIGF2YWlsYWJsZSwgaXQgcHJvYmFibHkgaGFzIEJTRCBzZW1hbnRpY3MKLSAqIHdoaWxlICJzaWduYWwoKSIgaGFzIHRyYWRpdGlvbmFsIHNlbWFudGljcywgc28gd2UgdXNlICJzaWdzZXQoKSI7IGl0Ci0gKiBtaWdodCBjYXVzZSBzeXN0ZW0gY2FsbHMgdG8gYmUgcmVzdGFydGVkIGZvciB0aGUgc2lnbmFsLCBob3dldmVyLgotICogSSBkb24ndCBrbm93IHdoZXRoZXIsIGluIGFueSBzeXN0ZW1zIHdoZXJlIGl0IGRpZCBjYXVzZSBzeXN0ZW0gY2FsbHMgdG8KLSAqIGJlIHJlc3RhcnRlZCwgdGhlcmUgd2FzIGEgd2F5IHRvIGFzayBpdCBub3QgdG8gZG8gc287IHRoZXJlIG1heSBubwotICogbG9uZ2VyIGJlIGFueSBpbnRlcmVzdGluZyBzeXN0ZW1zIHdpdGhvdXQgInNpZ2FjdGlvbigpIiwgaG93ZXZlciwKLSAqIGFuZCwgaWYgdGhlcmUgYXJlLCB0aGV5IG1pZ2h0IGhhdmUgInNpZ3ZlYygpIiB3aXRoIFNWX0lOVEVSUlVQVAotICogKHdoaWNoIEkgdGhpbmsgZmlyc3QgYXBwZWFyZWQgaW4gNC4zQlNEKS4KLSAqCi0gKiBPdGhlcndpc2UsIHdlIHVzZSAic2lnbmFsKCkiIC0gd2hpY2ggbWVhbnMgd2UgbWlnaHQgZ2V0IHRyYWRpdGlvbmFsCi0gKiBzZW1hbnRpY3MsIHdoZXJlaW4gc3lzdGVtIGNhbGxzIGRvbid0IGdldCByZXN0YXJ0ZWQgKmJ1dCogdGhlCi0gKiBzaWduYWwgaGFuZGxlciBpcyByZXNldCB0byBTSUdfREZMIGFuZCB0aGUgc2lnbmFsIGlzIG5vdCBibG9ja2VkLAotICogc28gdGhhdCBhIHN1YnNlcXVlbnQgc2lnbmFsIHdvdWxkIGtpbGwgdGhlIHByb2Nlc3MgaW1tZWRpYXRlbHkuCi0gKgotICogRGlkIEkgbWVudGlvbiB0aGF0IHNpZ25hbHMgc3Vjaz8gIEF0IGxlYXN0IGluIFBPU0lYLWNvbXBsaWFudCBzeXN0ZW1zCi0gKiB0aGV5IHN1Y2sgZmFyIGxlc3MsIGFzIHRob3NlIHN5c3RlbXMgaGF2ZSAic2lnYWN0aW9uKCkiLgotICovCi1SRVRTSUdUWVBFCi0oKnNldHNpZ25hbCAoaW50IHNpZywgUkVUU0lHVFlQRSAoKmZ1bmMpKGludCkpKShpbnQpCi17Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLQlzdHJ1Y3Qgc2lnYWN0aW9uIG9sZCwgbmV3OwotCi0JbWVtc2V0KCZuZXcsIDAsIHNpemVvZihuZXcpKTsKLQluZXcuc2FfaGFuZGxlciA9IGZ1bmM7Ci0JaWYgKHNpZ2FjdGlvbihzaWcsICZuZXcsICZvbGQpIDwgMCkKLQkJcmV0dXJuIChTSUdfRVJSKTsKLQlyZXR1cm4gKG9sZC5zYV9oYW5kbGVyKTsKLQotI2Vsc2UKLSNpZmRlZiBIQVZFX1NJR1NFVAotCXJldHVybiAoc2lnc2V0KHNpZywgZnVuYykpOwotI2Vsc2UKLQlyZXR1cm4gKHNpZ25hbChzaWcsIGZ1bmMpKTsKLSNlbmRpZgotI2VuZGlmCi19Ci0KZGlmZiAtLWdpdCBhL3NldHNpZ25hbC5oIGIvc2V0c2lnbmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZmIyYTcuLjAwMDAwMDAKLS0tIGEvc2V0c2lnbmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk3Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zZXRzaWduYWwuaCx2IDEuMi4xLjEgMTk5OS8xMC8wNyAyMzo0NzoxMyBtY3IgRXhwICQgKExCTCkKLSAqLwotI2lmbmRlZiBzZXRzaWduYWxfaAotI2RlZmluZSBzZXRzaWduYWxfaAotCi1SRVRTSUdUWVBFICgqc2V0c2lnbmFsKGludCwgUkVUU0lHVFlQRSAoKikoaW50KSkpKGludCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NsY29tcHJlc3MuaCBiL3NsY29tcHJlc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhNTk2Yy4uMDAwMDAwMAotLS0gYS9zbGNvbXByZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogRGVmaW5pdGlvbnMgZm9yIHRjcCBjb21wcmVzc2lvbiByb3V0aW5lcy4KLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NsY29tcHJlc3MuaCx2IDEuMiAyMDAwLzEwLzA5IDAyOjAzOjQ0IGd1eSBFeHAgJCAoTEJMKQotICoKLSAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MCwgMTk5MiwgMTk5MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCi0gKiBDYWxpZm9ybmlhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0gKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKLSAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKglWYW4gSmFjb2Jzb24gKHZhbkBlZS5sYmwuZ292KSwgRGVjIDMxLCAxOTg5OgotICoJLSBJbml0aWFsIGRpc3RyaWJ1dGlvbi4KLSAqLwotCi0vKgotICogQ29tcHJlc3NlZCBwYWNrZXQgZm9ybWF0OgotICoKLSAqIFRoZSBmaXJzdCBvY3RldCBjb250YWlucyB0aGUgcGFja2V0IHR5cGUgKHRvcCAzIGJpdHMpLCBUQ1AKLSAqICdwdXNoJyBiaXQsIGFuZCBmbGFncyB0aGF0IGluZGljYXRlIHdoaWNoIG9mIHRoZSA0IFRDUCBzZXF1ZW5jZQotICogbnVtYmVycyBoYXZlIGNoYW5nZWQgKGJvdHRvbSA1IGJpdHMpLiAgVGhlIG5leHQgb2N0ZXQgaXMgYQotICogY29udmVyc2F0aW9uIG51bWJlciB0aGF0IGFzc29jaWF0ZXMgYSBzYXZlZCBJUC9UQ1AgaGVhZGVyIHdpdGgKLSAqIHRoZSBjb21wcmVzc2VkIHBhY2tldC4gIFRoZSBuZXh0IHR3byBvY3RldHMgYXJlIHRoZSBUQ1AgY2hlY2tzdW0KLSAqIGZyb20gdGhlIG9yaWdpbmFsIGRhdGFncmFtLiAgVGhlIG5leHQgMCB0byAxNSBvY3RldHMgYXJlCi0gKiBzZXF1ZW5jZSBudW1iZXIgY2hhbmdlcywgb25lIGNoYW5nZSBwZXIgYml0IHNldCBpbiB0aGUgaGVhZGVyCi0gKiAodGhlcmUgbWF5IGJlIG5vIGNoYW5nZXMgYW5kIHRoZXJlIGFyZSB0d28gc3BlY2lhbCBjYXNlcyB3aGVyZQotICogdGhlIHJlY2VpdmVyIGltcGxpY2l0bHkga25vd3Mgd2hhdCBjaGFuZ2VkIC0tIHNlZSBiZWxvdykuCi0gKgotICogVGhlcmUgYXJlIDUgbnVtYmVycyB3aGljaCBjYW4gY2hhbmdlICh0aGV5IGFyZSBhbHdheXMgaW5zZXJ0ZWQKLSAqIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIpOiBUQ1AgdXJnZW50IHBvaW50ZXIsIHdpbmRvdywKLSAqIGFja25vd2xlZ2VtZW50LCBzZXF1ZW5jZSBudW1iZXIgYW5kIElQIElELiAgKFRoZSB1cmdlbnQgcG9pbnRlcgotICogaXMgZGlmZmVyZW50IGZyb20gdGhlIG90aGVycyBpbiB0aGF0IGl0cyB2YWx1ZSBpcyBzZW50LCBub3QgdGhlCi0gKiBjaGFuZ2UgaW4gdmFsdWUuKSAgU2luY2UgdHlwaWNhbCB1c2Ugb2YgU0xJUCBsaW5rcyBpcyBiaWFzZWQKLSAqIHRvd2FyZCBzbWFsbCBwYWNrZXRzIChzZWUgY29tbWVudHMgb24gTVRVL01TUyBiZWxvdyksIGNoYW5nZXMKLSAqIHVzZSBhIHZhcmlhYmxlIGxlbmd0aCBjb2Rpbmcgd2l0aCBvbmUgb2N0ZXQgZm9yIG51bWJlcnMgaW4gdGhlCi0gKiByYW5nZSAxIC0gMjU1IGFuZCAzIG9jdGV0cyAoMCwgTVNCLCBMU0IpIGZvciBudW1iZXJzIGluIHRoZQotICogcmFuZ2UgMjU2IC0gNjU1MzUgb3IgMC4gIChJZiB0aGUgY2hhbmdlIGluIHNlcXVlbmNlIG51bWJlciBvcgotICogYWNrIGlzIG1vcmUgdGhhbiA2NTUzNSwgYW4gdW5jb21wcmVzc2VkIHBhY2tldCBpcyBzZW50LikKLSAqLwotCi0vKgotICogUGFja2V0IHR5cGVzIChtdXN0IG5vdCBjb25mbGljdCB3aXRoIElQIHByb3RvY29sIHZlcnNpb24pCi0gKgotICogVGhlIHRvcCBuaWJibGUgb2YgdGhlIGZpcnN0IG9jdGV0IGlzIHRoZSBwYWNrZXQgdHlwZS4gIFRoZXJlIGFyZQotICogdGhyZWUgcG9zc2libGUgdHlwZXM6IElQIChub3QgcHJvdG8gVENQIG9yIHRjcCB3aXRoIG9uZSBvZiB0aGUKLSAqIGNvbnRyb2wgZmxhZ3Mgc2V0KTsgdW5jb21wcmVzc2VkIFRDUCAoYSBub3JtYWwgSVAvVENQIHBhY2tldCBidXQKLSAqIHdpdGggdGhlIDgtYml0IHByb3RvY29sIGZpZWxkIHJlcGxhY2VkIGJ5IGFuIDgtYml0IGNvbm5lY3Rpb24gaWQgLS0KLSAqIHRoaXMgdHlwZSBvZiBwYWNrZXQgc3luY3MgdGhlIHNlbmRlciAmIHJlY2VpdmVyKTsgYW5kIGNvbXByZXNzZWQKLSAqIFRDUCAoZGVzY3JpYmVkIGFib3ZlKS4KLSAqCi0gKiBMU0Igb2YgNC1iaXQgZmllbGQgaXMgVENQICJQVVNIIiBiaXQgKGEgd29ydGhsZXNzIGFuYWNocm9uaXNtKSBhbmQKLSAqIGlzIGxvZ2ljYWxseSBwYXJ0IG9mIHRoZSA0LWJpdCAiY2hhbmdlcyIgZmllbGQgdGhhdCBmb2xsb3dzLiAgVG9wCi0gKiB0aHJlZSBiaXRzIGFyZSBhY3R1YWwgcGFja2V0IHR5cGUuICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICogYW5kIGluIHRoZSBpbnRlcmVzdCBvZiBjb25zZXJ2aW5nIGJpdHMsIG51bWJlcnMgYXJlIGNob3NlbiBzbyB0aGUKLSAqIElQIHByb3RvY29sIHZlcnNpb24gbnVtYmVyICg0KSB3aGljaCBub3JtYWxseSBhcHBlYXJzIGluIHRoaXMgbmliYmxlCi0gKiBtZWFucyAiSVAgcGFja2V0Ii4KLSAqLwotCi0vKiBwYWNrZXQgdHlwZXMgKi8KLSNkZWZpbmUgVFlQRV9JUCAweDQwCi0jZGVmaW5lIFRZUEVfVU5DT01QUkVTU0VEX1RDUCAweDcwCi0jZGVmaW5lIFRZUEVfQ09NUFJFU1NFRF9UQ1AgMHg4MAotI2RlZmluZSBUWVBFX0VSUk9SIDB4MDAKLQotLyogQml0cyBpbiBmaXJzdCBvY3RldCBvZiBjb21wcmVzc2VkIHBhY2tldCAqLwotI2RlZmluZSBORVdfQwkweDQwCS8qIGZsYWcgYml0cyBmb3Igd2hhdCBjaGFuZ2VkIGluIGEgcGFja2V0ICovCi0jZGVmaW5lIE5FV19JCTB4MjAKLSNkZWZpbmUgTkVXX1MJMHgwOAotI2RlZmluZSBORVdfQQkweDA0Ci0jZGVmaW5lIE5FV19XCTB4MDIKLSNkZWZpbmUgTkVXX1UJMHgwMQotCi0vKiByZXNlcnZlZCwgc3BlY2lhbC1jYXNlIHZhbHVlcyBvZiBhYm92ZSAqLwotI2RlZmluZSBTUEVDSUFMX0kgKE5FV19TfE5FV19XfE5FV19VKQkJLyogZWNob2VkIGludGVyYWN0aXZlIHRyYWZmaWMgKi8KLSNkZWZpbmUgU1BFQ0lBTF9EIChORVdfU3xORVdfQXxORVdfV3xORVdfVSkJLyogdW5pZGlyZWN0aW9uYWwgZGF0YSAqLwotI2RlZmluZSBTUEVDSUFMU19NQVNLIChORVdfU3xORVdfQXxORVdfV3xORVdfVSkKLQotI2RlZmluZSBUQ1BfUFVTSF9CSVQgMHgxMApkaWZmIC0tZ2l0IGEvc2xpcC5oIGIvc2xpcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjRmMzAxLi4wMDAwMDAwCi0tLSBhL3NsaXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBEZWZpbml0aW9ucyB0aGF0IHVzZXIgbGV2ZWwgcHJvZ3JhbXMgbWlnaHQgbmVlZCB0byBrbm93IHRvIGludGVyYWN0Ci0gKiB3aXRoIHNlcmlhbCBsaW5lIElQIChzbGlwKSBsaW5lcy4KLSAqCi0gKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3NsaXAuaCx2IDEuMSAyMDAwLzEwLzA5IDAxOjUzOjIxIGd1eSBFeHAgJAotICoKLSAqIENvcHlyaWdodCAoYykgMTk5MCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggYXJlCi0gKiBkdXBsaWNhdGVkIGluIGFsbCBzdWNoIGZvcm1zIGFuZCB0aGF0IGFueSBkb2N1bWVudGF0aW9uLAotICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAotICogZGlzdHJpYnV0aW9uIGFuZCB1c2UgYWNrbm93bGVkZ2UgdGhhdCB0aGUgc29mdHdhcmUgd2FzIGRldmVsb3BlZAotICogYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkuICBUaGUgbmFtZSBvZiB0aGUKLSAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotCi0vKgotICogZGVmaW5pdGlvbnMgb2YgdGhlIHBzZXVkby0gbGluay1sZXZlbCBoZWFkZXIgYXR0YWNoZWQgdG8gc2xpcAotICogcGFja2V0cyBncmFiYmVkIGJ5IHRoZSBwYWNrZXQgZmlsdGVyIChicGYpIHRyYWZmaWMgbW9uaXRvci4KLSAqLwotI2RlZmluZSBTTElQX0hEUkxFTiAxNgotCi0jZGVmaW5lIFNMWF9ESVIgMAotI2RlZmluZSBTTFhfQ0hEUiAxCi0jZGVmaW5lIENIRFJfTEVOIDE1Ci0KLSNkZWZpbmUgU0xJUERJUl9JTiAwCi0jZGVmaW5lIFNMSVBESVJfT1VUIDEKZGlmZiAtLWdpdCBhL3NsbC5oIGIvc2xsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2YwNWUuLjAwMDAwMDAKLS0tIGEvc2xsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIFN0YW5mb3JkL0NNVSBlbmV0IHBhY2tldCBmaWx0ZXIsCi0gKiAobmV0L2VuZXQuYykgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiA0LjNCU0QsIGFuZCBjb2RlIGNvbnRyaWJ1dGVkCi0gKiB0byBCZXJrZWxleSBieSBTdGV2ZW4gTWNDYW5uZSBhbmQgVmFuIEphY29ic29uIGJvdGggb2YgTGF3cmVuY2UKLSAqIEJlcmtlbGV5IExhYm9yYXRvcnkuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zbGwuaCx2IDEuNyAyMDAyLzEyLzExIDA3OjE0OjExIGd1eSBFeHAgJCAoTEJMKQotICovCi0KLS8qCi0gKiBGb3IgY2FwdHVyZXMgb24gTGludXggY29va2VkIHNvY2tldHMsIHdlIGNvbnN0cnVjdCBhIGZha2UgaGVhZGVyCi0gKiB0aGF0IGluY2x1ZGVzOgotICoKLSAqCWEgMi1ieXRlICJwYWNrZXQgdHlwZSIgd2hpY2ggaXMgb25lIG9mOgotICoKLSAqCQlMSU5VWF9TTExfSE9TVAkJcGFja2V0IHdhcyBzZW50IHRvIHVzCi0gKgkJTElOVVhfU0xMX0JST0FEQ0FTVAlwYWNrZXQgd2FzIGJyb2FkY2FzdAotICoJCUxJTlVYX1NMTF9NVUxUSUNBU1QJcGFja2V0IHdhcyBtdWx0aWNhc3QKLSAqCQlMSU5VWF9TTExfT1RIRVJIT1NUCXBhY2tldCB3YXMgc2VudCB0byBzb21lYm9keSBlbHNlCi0gKgkJTElOVVhfU0xMX09VVEdPSU5HCXBhY2tldCB3YXMgc2VudCAqYnkqIHVzOwotICoKLSAqCWEgMi1ieXRlIEV0aGVybmV0IHByb3RvY29sIGZpZWxkOwotICoKLSAqCWEgMi1ieXRlIGxpbmstbGF5ZXIgdHlwZTsKLSAqCi0gKglhIDItYnl0ZSBsaW5rLWxheWVyIGFkZHJlc3MgbGVuZ3RoOwotICoKLSAqCWFuIDgtYnl0ZSBzb3VyY2UgbGluay1sYXllciBhZGRyZXNzLCB3aG9zZSBhY3R1YWwgbGVuZ3RoIGlzCi0gKglzcGVjaWZpZWQgYnkgdGhlIHByZXZpb3VzIHZhbHVlLgotICoKLSAqIEFsbCBmaWVsZHMgZXhjZXB0IGZvciB0aGUgbGluay1sYXllciBhZGRyZXNzIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCi0gKgotICogRE8gTk9UIGNoYW5nZSB0aGUgbGF5b3V0IG9mIHRoaXMgc3RydWN0dXJlLCBvciBjaGFuZ2UgYW55IG9mIHRoZQotICogTElOVVhfU0xMXyB2YWx1ZXMgYmVsb3cuICBJZiB5b3UgbXVzdCBjaGFuZ2UgdGhlIGxpbmstbGF5ZXIgaGVhZGVyCi0gKiBmb3IgYSAiY29va2VkIiBMaW51eCBjYXB0dXJlLCBpbnRyb2R1Y2UgYSBuZXcgRExUXyB0eXBlIChhc2sKLSAqICJ0Y3BkdW1wLXdvcmtlcnNAdGNwZHVtcC5vcmciIGZvciBvbmUsIHNvIHRoYXQgeW91IGRvbid0IGdpdmUgaXQgYQotICogdmFsdWUgdGhhdCBjb2xsaWRlcyB3aXRoIGEgdmFsdWUgYWxyZWFkeSBiZWluZyB1c2VkKSwgYW5kIHVzZSB0aGUKLSAqIG5ldyBoZWFkZXIgaW4gY2FwdHVyZXMgb2YgdGhhdCB0eXBlLCBzbyB0aGF0IHByb2dyYW1zIHRoYXQgY2FuCi0gKiBoYW5kbGUgRExUX0xJTlVYX1NMTCBjYXB0dXJlcyB3aWxsIGNvbnRpbnVlIHRvIGhhbmRsZSB0aGVtIGNvcnJlY3RseQotICogd2l0aG91dCBhbnkgY2hhbmdlLCBhbmQgc28gdGhhdCBjYXB0dXJlIGZpbGVzIHdpdGggZGlmZmVyZW50IGhlYWRlcnMKLSAqIGNhbiBiZSB0b2xkIGFwYXJ0IGFuZCBwcm9ncmFtcyB0aGF0IHJlYWQgdGhlbSBjYW4gZGlzc2VjdCB0aGUKLSAqIHBhY2tldHMgaW4gdGhlbS4KLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSwgYW5kIHRoZSAjZGVmaW5lcyBiZWxvdywgbXVzdCBiZSB0aGUgc2FtZSBpbiB0aGUKLSAqIGxpYnBjYXAgYW5kIHRjcGR1bXAgdmVyc2lvbnMgb2YgInNsbC5oIi4KLSAqLwotCi0vKgotICogQSBETFRfTElOVVhfU0xMIGZha2UgbGluay1sYXllciBoZWFkZXIuCi0gKi8KLSNkZWZpbmUgU0xMX0hEUl9MRU4JMTYJCS8qIHRvdGFsIGhlYWRlciBsZW5ndGggKi8KLSNkZWZpbmUgU0xMX0FERFJMRU4JOAkJLyogbGVuZ3RoIG9mIGFkZHJlc3MgZmllbGQgKi8KLQotc3RydWN0IHNsbF9oZWFkZXIgewotCXVfaW50MTZfdAlzbGxfcGt0dHlwZTsJLyogcGFja2V0IHR5cGUgKi8KLQl1X2ludDE2X3QJc2xsX2hhdHlwZTsJLyogbGluay1sYXllciBhZGRyZXNzIHR5cGUgKi8KLQl1X2ludDE2X3QJc2xsX2hhbGVuOwkvKiBsaW5rLWxheWVyIGFkZHJlc3MgbGVuZ3RoICovCi0JdV9pbnQ4X3QJc2xsX2FkZHJbU0xMX0FERFJMRU5dOwkvKiBsaW5rLWxheWVyIGFkZHJlc3MgKi8KLQl1X2ludDE2X3QJc2xsX3Byb3RvY29sOwkvKiBwcm90b2NvbCAqLwotfTsKLQotLyoKLSAqIFRoZSBMSU5VWF9TTExfIHZhbHVlcyBmb3IgInNsbF9wa3R0eXBlIjsgdGhlc2UgY29ycmVzcG9uZCB0byB0aGUKLSAqIFBBQ0tFVF8gdmFsdWVzIG9uIExpbnV4LCBidXQgYXJlIGRlZmluZWQgaGVyZSBzbyB0aGF0IHRoZXkncmUKLSAqIGF2YWlsYWJsZSBldmVuIG9uIHN5c3RlbXMgb3RoZXIgdGhhbiBMaW51eCwgYW5kIHNvIHRoYXQgdGhleQotICogZG9uJ3QgY2hhbmdlIGV2ZW4gaWYgdGhlIFBBQ0tFVF8gdmFsdWVzIGNoYW5nZS4KLSAqLwotI2RlZmluZSBMSU5VWF9TTExfSE9TVAkJMAotI2RlZmluZSBMSU5VWF9TTExfQlJPQURDQVNUCTEKLSNkZWZpbmUgTElOVVhfU0xMX01VTFRJQ0FTVAkyCi0jZGVmaW5lIExJTlVYX1NMTF9PVEhFUkhPU1QJMwotI2RlZmluZSBMSU5VWF9TTExfT1VUR09JTkcJNAotCi0vKgotICogVGhlIExJTlVYX1NMTF8gdmFsdWVzIGZvciAic2xsX3Byb3RvY29sIjsgdGhlc2UgY29ycmVzcG9uZCB0byB0aGUKLSAqIEVUSF9QXyB2YWx1ZXMgb24gTGludXgsIGJ1dCBhcmUgZGVmaW5lZCBoZXJlIHNvIHRoYXQgdGhleSdyZQotICogYXZhaWxhYmxlIGV2ZW4gb24gc3lzdGVtcyBvdGhlciB0aGFuIExpbnV4LiAgV2UgYXNzdW1lLCBmb3Igbm93LAotICogdGhhdCB0aGUgRVRIX1BfIHZhbHVlcyB3b24ndCBjaGFuZ2UgaW4gTGludXg7IGlmIHRoZXkgZG8sIHRoZW46Ci0gKgotICoJaWYgd2UgZG9uJ3QgdHJhbnNsYXRlIHRoZW0gaW4gInBjYXAtbGludXguYyIsIGNhcHR1cmUgZmlsZXMKLSAqCXdvbid0IG5lY2Vzc2FyaWx5IGJlIHJlYWRhYmxlIGlmIGNhcHR1cmVkIG9uIGEgc3lzdGVtIHRoYXQKLSAqCWRlZmluZXMgRVRIX1BfIHZhbHVlcyB0aGF0IGRvbid0IG1hdGNoIHRoZXNlIHZhbHVlczsKLSAqCi0gKglpZiB3ZSBkbyB0cmFuc2xhdGUgdGhlbSBpbiAicGNhcC1saW51eC5jIiwgdGhhdCBtYWtlcyBsaWZlCi0gKgl1bnBsZWFzYW50IGZvciB0aGUgQlBGIGNvZGUgZ2VuZXJhdG9yLCBhcyB0aGUgdmFsdWVzIHlvdSB0ZXN0Ci0gKglmb3IgaW4gdGhlIGtlcm5lbCBhcmVuJ3QgdGhlIHZhbHVlcyB0aGF0IHlvdSB0ZXN0IGZvciB3aGVuCi0gKglyZWFkaW5nIGEgY2FwdHVyZSBmaWxlLCBzbyB0aGUgZml4dXAgY29kZSBydW4gb24gQlBGIHByb2dyYW1zCi0gKgloYW5kZWQgdG8gdGhlIGtlcm5lbCBlbmRzIHVwIGhhdmluZyB0byBkbyBtb3JlIHdvcmsuCi0gKgotICogQWRkIG90aGVyIHZhbHVlcyBoZXJlIGFzIG5lY2Vzc2FyeSwgZm9yIGhhbmRsaW5nIHBhY2tldCB0eXBlcyB0aGF0Ci0gKiBtaWdodCBzaG93IHVwIG9uIG5vbi1FdGhlcm5ldCwgbm9uLTgwMi54IG5ldHdvcmtzLiAgKE5vdCBhbGwgdGhlIG9uZXMKLSAqIGluIHRoZSBMaW51eCAiaWZfZXRoZXIuaCIgd2lsbCwgSSBzdXNwZWN0LCBhY3R1YWxseSBzaG93IHVwIGluCi0gKiBjYXB0dXJlcy4pCi0gKi8KLSNkZWZpbmUgTElOVVhfU0xMX1BfODAyXzMJMHgwMDAxCS8qIE5vdmVsbCA4MDIuMyBmcmFtZXMgd2l0aG91dCA4MDIuMiBMTEMgaGVhZGVyICovCi0jZGVmaW5lIExJTlVYX1NMTF9QXzgwMl8yCTB4MDAwNAkvKiA4MDIuMiBmcmFtZXMgKG5vdCBEL0kvWCBFdGhlcm5ldCkgKi8KZGlmZiAtLWdpdCBhL3NtYi5oIGIvc21iLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDUyMjcuLjAwMDAwMDAKLS0tIGEvc21iLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zbWIuaCx2IDEuOSAyMDA0LzEyLzI4IDIyOjI5OjQ0IGd1eSBFeHAgJCAoTEJMKSAqLwotLyoKLSAqIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTUtMTk5OQotICoKLSAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIGVpdGhlciB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGFjY29tcGFuaWVzIHRjcGR1bXAgb3IgdGhlIEdOVSBHUEwgdmVyc2lvbiAyCi0gKiBvciBsYXRlcgotICovCi0KLSNkZWZpbmUgU01CTUlOKGEsYikgKChhKTwoYik/KGEpOihiKSkKLQotLyogdGhlIGNvbXBsZXRlICovCi0jZGVmaW5lIFNNQm1rZGlyICAgICAgMHgwMCAgIC8qIGNyZWF0ZSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgU01Ccm1kaXIgICAgICAweDAxICAgLyogZGVsZXRlIGRpcmVjdG9yeSAqLwotI2RlZmluZSBTTUJvcGVuICAgICAgIDB4MDIgICAvKiBvcGVuIGZpbGUgKi8KLSNkZWZpbmUgU01CY3JlYXRlICAgICAweDAzICAgLyogY3JlYXRlIGZpbGUgKi8KLSNkZWZpbmUgU01CY2xvc2UgICAgICAweDA0ICAgLyogY2xvc2UgZmlsZSAqLwotI2RlZmluZSBTTUJmbHVzaCAgICAgIDB4MDUgICAvKiBmbHVzaCBmaWxlICovCi0jZGVmaW5lIFNNQnVubGluayAgICAgMHgwNiAgIC8qIGRlbGV0ZSBmaWxlICovCi0jZGVmaW5lIFNNQm12ICAgICAgICAgMHgwNyAgIC8qIHJlbmFtZSBmaWxlICovCi0jZGVmaW5lIFNNQmdldGF0ciAgICAgMHgwOCAgIC8qIGdldCBmaWxlIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgU01Cc2V0YXRyICAgICAweDA5ICAgLyogc2V0IGZpbGUgYXR0cmlidXRlcyAqLwotI2RlZmluZSBTTUJyZWFkICAgICAgIDB4MEEgICAvKiByZWFkIGZyb20gZmlsZSAqLwotI2RlZmluZSBTTUJ3cml0ZSAgICAgIDB4MEIgICAvKiB3cml0ZSB0byBmaWxlICovCi0jZGVmaW5lIFNNQmxvY2sgICAgICAgMHgwQyAgIC8qIGxvY2sgYnl0ZSByYW5nZSAqLwotI2RlZmluZSBTTUJ1bmxvY2sgICAgIDB4MEQgICAvKiB1bmxvY2sgYnl0ZSByYW5nZSAqLwotI2RlZmluZSBTTUJjdGVtcCAgICAgIDB4MEUgICAvKiBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUgKi8KLSNkZWZpbmUgU01CbWtuZXcgICAgICAweDBGICAgLyogbWFrZSBuZXcgZmlsZSAqLwotI2RlZmluZSBTTUJjaGtwdGggICAgIDB4MTAgICAvKiBjaGVjayBkaXJlY3RvcnkgcGF0aCAqLwotI2RlZmluZSBTTUJleGl0ICAgICAgIDB4MTEgICAvKiBwcm9jZXNzIGV4aXQgKi8KLSNkZWZpbmUgU01CbHNlZWsgICAgICAweDEyICAgLyogc2VlayAqLwotI2RlZmluZSBTTUJ0Y29uICAgICAgIDB4NzAgICAvKiB0cmVlIGNvbm5lY3QgKi8KLSNkZWZpbmUgU01CdGNvblggICAgICAweDc1ICAgLyogdHJlZSBjb25uZWN0IGFuZCBYKi8KLSNkZWZpbmUgU01CdGRpcyAgICAgICAweDcxICAgLyogdHJlZSBkaXNjb25uZWN0ICovCi0jZGVmaW5lIFNNQm5lZ3Byb3QgICAgMHg3MiAgIC8qIG5lZ290aWF0ZSBwcm90b2NvbCAqLwotI2RlZmluZSBTTUJkc2thdHRyICAgIDB4ODAgICAvKiBnZXQgZGlzayBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIFNNQnNlYXJjaCAgICAgMHg4MSAgIC8qIHNlYXJjaCBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgU01Cc3Bsb3BlbiAgICAweEMwICAgLyogb3BlbiBwcmludCBzcG9vbCBmaWxlICovCi0jZGVmaW5lIFNNQnNwbHdyICAgICAgMHhDMSAgIC8qIHdyaXRlIHRvIHByaW50IHNwb29sIGZpbGUgKi8KLSNkZWZpbmUgU01Cc3BsY2xvc2UgICAweEMyICAgLyogY2xvc2UgcHJpbnQgc3Bvb2wgZmlsZSAqLwotI2RlZmluZSBTTUJzcGxyZXRxICAgIDB4QzMgICAvKiByZXR1cm4gcHJpbnQgcXVldWUgKi8KLSNkZWZpbmUgU01Cc2VuZHMgICAgICAweEQwICAgLyogc2VuZCBzaW5nbGUgYmxvY2sgbWVzc2FnZSAqLwotI2RlZmluZSBTTUJzZW5kYiAgICAgIDB4RDEgICAvKiBzZW5kIGJyb2FkY2FzdCBtZXNzYWdlICovCi0jZGVmaW5lIFNNQmZ3ZG5hbWUgICAgMHhEMiAgIC8qIGZvcndhcmQgdXNlciBuYW1lICovCi0jZGVmaW5lIFNNQmNhbmNlbGYgICAgMHhEMyAgIC8qIGNhbmNlbCBmb3J3YXJkICovCi0jZGVmaW5lIFNNQmdldG1hYyAgICAgMHhENCAgIC8qIGdldCBtYWNoaW5lIG5hbWUgKi8KLSNkZWZpbmUgU01Cc2VuZHN0cnQgICAweEQ1ICAgLyogc2VuZCBzdGFydCBvZiBtdWx0aS1ibG9jayBtZXNzYWdlICovCi0jZGVmaW5lIFNNQnNlbmRlbmQgICAgMHhENiAgIC8qIHNlbmQgZW5kIG9mIG11bHRpLWJsb2NrIG1lc3NhZ2UgKi8KLSNkZWZpbmUgU01Cc2VuZHR4dCAgICAweEQ3ICAgLyogc2VuZCB0ZXh0IG9mIG11bHRpLWJsb2NrIG1lc3NhZ2UgKi8KLQotLyogQ29yZSsgcHJvdG9jb2wgKi8KLSNkZWZpbmUgU01CbG9ja3JlYWQJICAweDEzICAgLyogTG9jayBhIHJhbmdlIGFuZCByZWFkICovCi0jZGVmaW5lIFNNQndyaXRldW5sb2NrIDB4MTQgLyogVW5sb2NrIGEgcmFuZ2UgdGhlbiB3cml0ZSAqLwotI2RlZmluZSBTTUJyZWFkYnJhdyAgIDB4MWEgIC8qIHJlYWQgYSBibG9jayBvZiBkYXRhIHdpdGggbm8gc21iIGhlYWRlciAqLwotI2RlZmluZSBTTUJ3cml0ZWJyYXcgIDB4MWQgIC8qIHdyaXRlIGEgYmxvY2sgb2YgZGF0YSB3aXRoIG5vIHNtYiBoZWFkZXIgKi8KLSNkZWZpbmUgU01Cd3JpdGVjICAgICAweDIwICAvKiBzZWNvbmRhcnkgd3JpdGUgcmVxdWVzdCAqLwotI2RlZmluZSBTTUJ3cml0ZWNsb3NlIDB4MmMgIC8qIHdyaXRlIGEgZmlsZSB0aGVuIGNsb3NlIGl0ICovCi0KLS8qIGRvcyBleHRlbmRlZCBwcm90b2NvbCAqLwotI2RlZmluZSBTTUJyZWFkQnJhdyAgICAgIDB4MUEgICAvKiByZWFkIGJsb2NrIHJhdyAqLwotI2RlZmluZSBTTUJyZWFkQm1weCAgICAgIDB4MUIgICAvKiByZWFkIGJsb2NrIG11bHRpcGxleGVkICovCi0jZGVmaW5lIFNNQnJlYWRCcyAgICAgICAgMHgxQyAgIC8qIHJlYWQgYmxvY2sgKHNlY29uZGFyeSByZXNwb25zZSkgKi8KLSNkZWZpbmUgU01Cd3JpdGVCcmF3ICAgICAweDFEICAgLyogd3JpdGUgYmxvY2sgcmF3ICovCi0jZGVmaW5lIFNNQndyaXRlQm1weCAgICAgMHgxRSAgIC8qIHdyaXRlIGJsb2NrIG11bHRpcGxleGVkICovCi0jZGVmaW5lIFNNQndyaXRlQnMgICAgICAgMHgxRiAgIC8qIHdyaXRlIGJsb2NrIChzZWNvbmRhcnkgcmVxdWVzdCkgKi8KLSNkZWZpbmUgU01Cd3JpdGVDICAgICAgICAweDIwICAgLyogd3JpdGUgY29tcGxldGUgcmVzcG9uc2UgKi8KLSNkZWZpbmUgU01Cc2V0YXR0ckUgICAgICAweDIyICAgLyogc2V0IGZpbGUgYXR0cmlidXRlcyBleHBhbmRlZCAqLwotI2RlZmluZSBTTUJnZXRhdHRyRSAgICAgIDB4MjMgICAvKiBnZXQgZmlsZSBhdHRyaWJ1dGVzIGV4cGFuZGVkICovCi0jZGVmaW5lIFNNQmxvY2tpbmdYICAgICAgMHgyNCAgIC8qIGxvY2svdW5sb2NrIGJ5dGUgcmFuZ2VzIGFuZCBYICovCi0jZGVmaW5lIFNNQnRyYW5zICAgICAgICAgMHgyNSAgIC8qIHRyYW5zYWN0aW9uIC0gbmFtZSwgYnl0ZXMgaW4vb3V0ICovCi0jZGVmaW5lIFNNQnRyYW5zcyAgICAgICAgMHgyNiAgIC8qIHRyYW5zYWN0aW9uIChzZWNvbmRhcnkgcmVxdWVzdC9yZXNwb25zZSkgKi8KLSNkZWZpbmUgU01CaW9jdGwgICAgICAgICAweDI3ICAgLyogSU9DVEwgKi8KLSNkZWZpbmUgU01CaW9jdGxzICAgICAgICAweDI4ICAgLyogSU9DVEwgIChzZWNvbmRhcnkgcmVxdWVzdC9yZXNwb25zZSkgKi8KLSNkZWZpbmUgU01CY29weSAgICAgICAgICAweDI5ICAgLyogY29weSAqLwotI2RlZmluZSBTTUJtb3ZlICAgICAgICAgIDB4MkEgICAvKiBtb3ZlICovCi0jZGVmaW5lIFNNQmVjaG8gICAgICAgICAgMHgyQiAgIC8qIGVjaG8gKi8KLSNkZWZpbmUgU01Cb3BlblggICAgICAgICAweDJEICAgLyogb3BlbiBhbmQgWCAqLwotI2RlZmluZSBTTUJyZWFkWCAgICAgICAgIDB4MkUgICAvKiByZWFkIGFuZCBYICovCi0jZGVmaW5lIFNNQndyaXRlWCAgICAgICAgMHgyRiAgIC8qIHdyaXRlIGFuZCBYICovCi0jZGVmaW5lIFNNQnNlc3NzZXR1cFggICAgMHg3MyAgIC8qIFNlc3Npb24gU2V0IFVwICYgWCAoaW5jbHVkaW5nIFVzZXIgTG9nb24pICovCi0jZGVmaW5lIFNNQmZmaXJzdCAgICAgICAgMHg4MiAgIC8qIGZpbmQgZmlyc3QgKi8KLSNkZWZpbmUgU01CZnVuaXF1ZSAgICAgICAweDgzICAgLyogZmluZCB1bmlxdWUgKi8KLSNkZWZpbmUgU01CZmNsb3NlICAgICAgICAweDg0ICAgLyogZmluZCBjbG9zZSAqLwotI2RlZmluZSBTTUJpbnZhbGlkICAgICAgIDB4RkUgICAvKiBpbnZhbGlkIGNvbW1hbmQgKi8KLQotLyogRXh0ZW5kZWQgMi4wIHByb3RvY29sICovCi0jZGVmaW5lIFNNQnRyYW5zMiAgICAgICAgMHgzMiAgIC8qIFRSQU5TMiBwcm90b2NvbCBzZXQgKi8KLSNkZWZpbmUgU01CdHJhbnNzMiAgICAgICAweDMzICAgLyogVFJBTlMyIHByb3RvY29sIHNldCwgc2Vjb25kYXJ5IGNvbW1hbmQgKi8KLSNkZWZpbmUgU01CZmluZGNsb3NlICAgICAweDM0ICAgLyogVGVybWluYXRlIGEgVFJBTlNBQ1QyX0ZJTkRGSVJTVCAqLwotI2RlZmluZSBTTUJmaW5kbmNsb3NlICAgIDB4MzUgICAvKiBUZXJtaW5hdGUgYSBUUkFOU0FDVDJfRklORE5PVElGWUZJUlNUICovCi0jZGVmaW5lIFNNQnVsb2dvZmZYICAgICAgMHg3NCAgIC8qIHVzZXIgbG9nb2ZmICovCi0KLS8qIE5UIFNNQiBleHRlbnNpb25zLiAqLwotI2RlZmluZSBTTUJudHRyYW5zICAgICAgIDB4QTAgICAvKiBOVCB0cmFuc2FjdCAqLwotI2RlZmluZSBTTUJudHRyYW5zcyAgICAgIDB4QTEgICAvKiBOVCB0cmFuc2FjdCBzZWNvbmRhcnkgKi8KLSNkZWZpbmUgU01CbnRjcmVhdGVYICAgICAweEEyICAgLyogTlQgY3JlYXRlIGFuZCBYICovCi0jZGVmaW5lIFNNQm50Y2FuY2VsICAgICAgMHhBNCAgIC8qIE5UIGNhbmNlbCAqLwotCi0vKiBwYXRod29ya3Mgc3BlY2lhbCAqLwotI2RlZmluZSBwU0VURElSICdcMzc3JwotCi0KLS8qIHRoZXNlIGFyZSB0aGUgVFJBTlMyIHN1YiBjb21tYW5kcyAqLwotI2RlZmluZSBUUkFOU0FDVDJfT1BFTiAgICAgICAgICAwCi0jZGVmaW5lIFRSQU5TQUNUMl9GSU5ERklSU1QgICAgIDEKLSNkZWZpbmUgVFJBTlNBQ1QyX0ZJTkRORVhUICAgICAgMgotI2RlZmluZSBUUkFOU0FDVDJfUUZTSU5GTyAgICAgICAzCi0jZGVmaW5lIFRSQU5TQUNUMl9TRVRGU0lORk8gICAgIDQKLSNkZWZpbmUgVFJBTlNBQ1QyX1FQQVRISU5GTyAgICAgNQotI2RlZmluZSBUUkFOU0FDVDJfU0VUUEFUSElORk8gICA2Ci0jZGVmaW5lIFRSQU5TQUNUMl9RRklMRUlORk8gICAgIDcKLSNkZWZpbmUgVFJBTlNBQ1QyX1NFVEZJTEVJTkZPICAgOAotI2RlZmluZSBUUkFOU0FDVDJfRlNDVEwgICAgICAgICA5Ci0jZGVmaW5lIFRSQU5TQUNUMl9JT0NUTCAgICAgICAgICAgMTAKLSNkZWZpbmUgVFJBTlNBQ1QyX0ZJTkROT1RJRllGSVJTVCAxMQotI2RlZmluZSBUUkFOU0FDVDJfRklORE5PVElGWU5FWFQgIDEyCi0jZGVmaW5lIFRSQU5TQUNUMl9NS0RJUiAgICAgICAgICAgMTMKLQotI2RlZmluZSBQVFJfRElGRihwMSwgcDIpICgoc2l6ZV90KSgoKGNoYXIgKikocDEpKSAtIChjaGFyICopKHAyKSkpCi0KLS8qIHNvbWUgcHJvdG9zICovCi1jb25zdCB1X2NoYXIgKnNtYl9mZGF0YShjb25zdCB1X2NoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL3NtYnV0aWwuYyBiL3NtYnV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiY2I0Yy4uMDAwMDAwMAotLS0gYS9zbWJ1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAxOTk1LTE5OTkKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBhY2NvbXBhbmllcyB0Y3BkdW1wIG9yIHRoZSBHTlUgR1BMIHZlcnNpb24gMgotICogb3IgbGF0ZXIKLSAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC9zbWJ1dGlsLmMsdiAxLjM2LjIuMyAyMDA3LzA3LzE1IDE5OjA4OjI1IGd1eSBFeHAgJCI7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHRjcGR1bXAtc3RkaW5jLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiZXh0cmFjdC5oIgotI2luY2x1ZGUgInNtYi5oIgotCi1zdGF0aWMgdV9pbnQzMl90IHN0cmluZ2xlbjsKLWV4dGVybiBjb25zdCB1X2NoYXIgKnN0YXJ0YnVmOwotCi0vKgotICogaW50ZXJwcmV0IGEgMzIgYml0IGRvcyBwYWNrZWQgZGF0ZS90aW1lIHRvIHNvbWUgcGFyYW1ldGVycwotICovCi1zdGF0aWMgdm9pZAotaW50ZXJwcmV0X2Rvc19kYXRlKHVfaW50MzJfdCBkYXRlLCBzdHJ1Y3QgdG0gKnRwKQotewotICAgIHVfaW50MzJfdCBwMCwgcDEsIHAyLCBwMzsKLQotICAgIHAwID0gZGF0ZSAmIDB4RkY7Ci0gICAgcDEgPSAoKGRhdGUgJiAweEZGMDApID4+IDgpICYgMHhGRjsKLSAgICBwMiA9ICgoZGF0ZSAmIDB4RkYwMDAwKSA+PiAxNikgJiAweEZGOwotICAgIHAzID0gKChkYXRlICYgMHhGRjAwMDAwMCkgPj4gMjQpICYgMHhGRjsKLQotICAgIHRwLT50bV9zZWMgPSAyICogKHAwICYgMHgxRik7Ci0gICAgdHAtPnRtX21pbiA9ICgocDAgPj4gNSkgJiAweEZGKSArICgocDEgJiAweDcpIDw8IDMpOwotICAgIHRwLT50bV9ob3VyID0gKHAxID4+IDMpICYgMHhGRjsKLSAgICB0cC0+dG1fbWRheSA9IChwMiAmIDB4MUYpOwotICAgIHRwLT50bV9tb24gPSAoKHAyID4+IDUpICYgMHhGRikgKyAoKHAzICYgMHgxKSA8PCAzKSAtIDE7Ci0gICAgdHAtPnRtX3llYXIgPSAoKHAzID4+IDEpICYgMHhGRikgKyA4MDsKLX0KLQotLyoKLSAqIGNvbW1vbiBwb3J0aW9uOgotICogY3JlYXRlIGEgdW5peCBkYXRlIGZyb20gYSBkb3MgZGF0ZQotICovCi1zdGF0aWMgdGltZV90Ci1pbnRfdW5peF9kYXRlKHVfaW50MzJfdCBkb3NfZGF0ZSkKLXsKLSAgICBzdHJ1Y3QgdG0gdDsKLQotICAgIGlmIChkb3NfZGF0ZSA9PSAwKQotCXJldHVybigwKTsKLQotICAgIGludGVycHJldF9kb3NfZGF0ZShkb3NfZGF0ZSwgJnQpOwotICAgIHQudG1fd2RheSA9IDE7Ci0gICAgdC50bV95ZGF5ID0gMTsKLSAgICB0LnRtX2lzZHN0ID0gMDsKLQotICAgIHJldHVybiAobWt0aW1lKCZ0KSk7Ci19Ci0KLS8qCi0gKiBjcmVhdGUgYSB1bml4IGRhdGUgZnJvbSBhIGRvcyBkYXRlCi0gKiBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIKLSAqLwotc3RhdGljIHRpbWVfdAotbWFrZV91bml4X2RhdGUoY29uc3QgdV9jaGFyICpkYXRlX3B0cikKLXsKLSAgICB1X2ludDMyX3QgZG9zX2RhdGUgPSAwOwotCi0gICAgZG9zX2RhdGUgPSBFWFRSQUNUX0xFXzMyQklUUyhkYXRlX3B0cik7Ci0KLSAgICByZXR1cm4gaW50X3VuaXhfZGF0ZShkb3NfZGF0ZSk7Ci19Ci0KLS8qCi0gKiBjcmVhdGUgYSB1bml4IGRhdGUgZnJvbSBhIGRvcyBkYXRlCi0gKiBpbiBoYWxmd29yZC1zd2FwcGVkIG5ldHdvcmsgYnl0ZSBvcmRlciEKLSAqLwotc3RhdGljIHRpbWVfdAotbWFrZV91bml4X2RhdGUyKGNvbnN0IHVfY2hhciAqZGF0ZV9wdHIpCi17Ci0gICAgdV9pbnQzMl90IHgsIHgyOwotCi0gICAgeCA9IEVYVFJBQ1RfTEVfMzJCSVRTKGRhdGVfcHRyKTsKLSAgICB4MiA9ICgoeCAmIDB4RkZGRikgPDwgMTYpIHwgKCh4ICYgMHhGRkZGMDAwMCkgPj4gMTYpOwotICAgIHJldHVybiBpbnRfdW5peF9kYXRlKHgyKTsKLX0KLQotLyoKLSAqIGludGVycHJldCBhbiA4IGJ5dGUgImZpbGV0aW1lIiBzdHJ1Y3R1cmUgdG8gYSB0aW1lX3QKLSAqIEl0J3Mgb3JpZ2luYWxseSBpbiAiMTAwbnMgdW5pdHMgc2luY2UgamFuIDFzdCAxNjAxIgotICovCi1zdGF0aWMgdGltZV90Ci1pbnRlcnByZXRfbG9uZ19kYXRlKGNvbnN0IHVfY2hhciAqcCkKLXsKLSAgICBkb3VibGUgZDsKLSAgICB0aW1lX3QgcmV0OwotCi0gICAgLyogdGhpcyBnaXZlcyB1cyBzZWNvbmRzIHNpbmNlIGphbiAxc3QgMTYwMSAoYXBwcm94KSAqLwotICAgIGQgPSAoRVhUUkFDVF9MRV8zMkJJVFMocCArIDQpICogMjU2LjAgKyBwWzNdKSAqICgxLjBlLTcgKiAoMSA8PCAyNCkpOwotCi0gICAgLyogbm93IGFkanVzdCBieSAzNjkgeWVhcnMgdG8gbWFrZSB0aGUgc2VjcyBzaW5jZSAxOTcwICovCi0gICAgZCAtPSAzNjkuMCAqIDM2NS4yNSAqIDI0ICogNjAgKiA2MDsKLQotICAgIC8qIGFuZCBhIGZ1ZGdlIGZhY3RvciBhcyB3ZSBnb3QgaXQgd3JvbmcgYnkgYSBmZXcgZGF5cyAqLwotICAgIGQgKz0gKDMgKiAyNCAqIDYwICogNjAgKyA2ICogNjAgKiA2MCArIDIpOwotCi0gICAgaWYgKGQgPCAwKQotCXJldHVybigwKTsKLQotICAgIHJldCA9ICh0aW1lX3QpZDsKLQotICAgIHJldHVybihyZXQpOwotfQotCi0vKgotICogaW50ZXJwcmV0IHRoZSB3ZWlyZCBuZXRiaW9zICJuYW1lIi4gUmV0dXJuIHRoZSBuYW1lIHR5cGUsIG9yIC0xIGlmCi0gKiB3ZSBydW4gcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKLSAqLwotc3RhdGljIGludAotbmFtZV9pbnRlcnByZXQoY29uc3QgdV9jaGFyICppbiwgY29uc3QgdV9jaGFyICptYXhidWYsIGNoYXIgKm91dCkKLXsKLSAgICBpbnQgcmV0OwotICAgIGludCBsZW47Ci0KLSAgICBpZiAoaW4gPj0gbWF4YnVmKQotCXJldHVybigtMSk7CS8qIG5hbWUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotICAgIFRDSEVDSzIoKmluLCAxKTsKLSAgICBsZW4gPSAoKmluKyspIC8gMjsKLQotICAgICpvdXQ9MDsKLQotICAgIGlmIChsZW4gPiAzMCB8fCBsZW4gPCAxKQotCXJldHVybigwKTsKLQotICAgIHdoaWxlIChsZW4tLSkgewotCVRDSEVDSzIoKmluLCAyKTsKLQlpZiAoaW4gKyAxID49IG1heGJ1ZikKLQkgICAgcmV0dXJuKC0xKTsJLyogbmFtZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi0JaWYgKGluWzBdIDwgJ0EnIHx8IGluWzBdID4gJ1AnIHx8IGluWzFdIDwgJ0EnIHx8IGluWzFdID4gJ1AnKSB7Ci0JICAgICpvdXQgPSAwOwotCSAgICByZXR1cm4oMCk7Ci0JfQotCSpvdXQgPSAoKGluWzBdIC0gJ0EnKSA8PCA0KSArIChpblsxXSAtICdBJyk7Ci0JaW4gKz0gMjsKLQlvdXQrKzsKLSAgICB9Ci0gICAgKm91dCA9IDA7Ci0gICAgcmV0ID0gb3V0Wy0xXTsKLQotICAgIHJldHVybihyZXQpOwotCi10cnVuYzoKLSAgICByZXR1cm4oLTEpOwotfQotCi0vKgotICogZmluZCBhIHBvaW50ZXIgdG8gYSBuZXRiaW9zIG5hbWUKLSAqLwotc3RhdGljIGNvbnN0IHVfY2hhciAqCi1uYW1lX3B0cihjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IG9mcywgY29uc3QgdV9jaGFyICptYXhidWYpCi17Ci0gICAgY29uc3QgdV9jaGFyICpwOwotICAgIHVfY2hhciBjOwotCi0gICAgcCA9IGJ1ZiArIG9mczsKLSAgICBpZiAocCA+PSBtYXhidWYpCi0JcmV0dXJuKE5VTEwpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLSAgICBUQ0hFQ0syKCpwLCAxKTsKLQotICAgIGMgPSAqcDsKLQotICAgIC8qIFhYWCAtIHRoaXMgc2hvdWxkIHVzZSB0aGUgc2FtZSBjb2RlIHRoYXQgdGhlIEROUyBkaXNzZWN0b3IgZG9lcyAqLwotICAgIGlmICgoYyAmIDB4QzApID09IDB4QzApIHsKLQl1X2ludDE2X3QgbDsKLQotCVRDSEVDSzIoKnAsIDIpOwotCWlmICgocCArIDEpID49IG1heGJ1ZikKLQkgICAgcmV0dXJuKE5VTEwpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLQlsID0gRVhUUkFDVF8xNkJJVFMocCkgJiAweDNGRkY7Ci0JaWYgKGwgPT0gMCkgewotCSAgICAvKiBXZSBoYXZlIGEgcG9pbnRlciB0aGF0IHBvaW50cyB0byBpdHNlbGYuICovCi0JICAgIHJldHVybihOVUxMKTsKLQl9Ci0JcCA9IGJ1ZiArIGw7Ci0JaWYgKHAgPj0gbWF4YnVmKQotCSAgICByZXR1cm4oTlVMTCk7CS8qIG5hbWUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCVRDSEVDSzIoKnAsIDEpOwotICAgIH0KLSAgICByZXR1cm4ocCk7Ci0KLXRydW5jOgotICAgIHJldHVybihOVUxMKTsJLyogbmFtZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi19Ci0KLS8qCi0gKiBleHRyYWN0IGEgbmV0YmlvcyBuYW1lIGZyb20gYSBidWYKLSAqLwotc3RhdGljIGludAotbmFtZV9leHRyYWN0KGNvbnN0IHVfY2hhciAqYnVmLCBpbnQgb2ZzLCBjb25zdCB1X2NoYXIgKm1heGJ1ZiwgY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCB1X2NoYXIgKnAgPSBuYW1lX3B0cihidWYsIG9mcywgbWF4YnVmKTsKLSAgICBpZiAocCA9PSBOVUxMKQotCXJldHVybigtMSk7CS8qIGVycm9yIChwcm9iYWJseSBuYW1lIGdvaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlcikgKi8KLSAgICBuYW1lWzBdID0gJ1wwJzsKLSAgICByZXR1cm4obmFtZV9pbnRlcnByZXQocCwgbWF4YnVmLCBuYW1lKSk7Ci19Ci0KLQotLyoKLSAqIHJldHVybiB0aGUgdG90YWwgc3RvcmFnZSBsZW5ndGggb2YgYSBtYW5nbGVkIG5hbWUKLSAqLwotc3RhdGljIGludAotbmFtZV9sZW4oY29uc3QgdW5zaWduZWQgY2hhciAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqbWF4YnVmKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMwID0gczsKLSAgICB1bnNpZ25lZCBjaGFyIGM7Ci0KLSAgICBpZiAocyA+PSBtYXhidWYpCi0JcmV0dXJuKC0xKTsJLyogbmFtZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi0gICAgVENIRUNLMigqcywgMSk7Ci0gICAgYyA9ICpzOwotICAgIGlmICgoYyAmIDB4QzApID09IDB4QzApCi0JcmV0dXJuKDIpOwotICAgIHdoaWxlICgqcykgewotCWlmIChzID49IG1heGJ1ZikKLQkgICAgcmV0dXJuKC0xKTsJLyogbmFtZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi0JVENIRUNLMigqcywgMSk7Ci0JcyArPSAoKnMpICsgMTsKLSAgICB9Ci0gICAgcmV0dXJuKFBUUl9ESUZGKHMsIHMwKSArIDEpOwotCi10cnVuYzoKLSAgICByZXR1cm4oLTEpOwkvKiBuYW1lIGdvZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FzYyhjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCXNhZmVwdXRjaGFyKGJ1ZltpXSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW5hbWVfdHlwZV9zdHIoaW50IG5hbWVfdHlwZSkKLXsKLSAgICBjb25zdCBjaGFyICpmID0gTlVMTDsKLQotICAgIHN3aXRjaCAobmFtZV90eXBlKSB7Ci0gICAgY2FzZSAwOiAgICBmID0gIldvcmtzdGF0aW9uIjsgYnJlYWs7Ci0gICAgY2FzZSAweDAzOiBmID0gIkNsaWVudD8iOyBicmVhazsKLSAgICBjYXNlIDB4MjA6IGYgPSAiU2VydmVyIjsgYnJlYWs7Ci0gICAgY2FzZSAweDFkOiBmID0gIk1hc3RlciBCcm93c2VyIjsgYnJlYWs7Ci0gICAgY2FzZSAweDFiOiBmID0gIkRvbWFpbiBDb250cm9sbGVyIjsgYnJlYWs7Ci0gICAgY2FzZSAweDFlOiBmID0gIkJyb3dzZXIgU2VydmVyIjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogICBmID0gIlVua25vd24iOyBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuKGYpOwotfQotCi12b2lkCi1wcmludF9kYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKLXsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBpZiAobGVuIDw9IDApCi0JcmV0dXJuOwotICAgIHByaW50ZigiWyUwM1hdICIsIGkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IC8qbm90aGluZyovKSB7Ci0gICAgICAgIFRDSEVDSyhidWZbaV0pOwotCXByaW50ZigiJTAyWCAiLCBidWZbaV0gJiAweGZmKTsKLQlpKys7Ci0JaWYgKGklOCA9PSAwKQotCSAgICBwcmludGYoIiAiKTsKLQlpZiAoaSAlIDE2ID09IDApIHsKLQkgICAgcHJpbnRfYXNjKCZidWZbaSAtIDE2XSwgOCk7Ci0JICAgIHByaW50ZigiICIpOwotCSAgICBwcmludF9hc2MoJmJ1ZltpIC0gOF0sIDgpOwotCSAgICBwcmludGYoIlxuIik7Ci0JICAgIGlmIChpIDwgbGVuKQotCQlwcmludGYoIlslMDNYXSAiLCBpKTsKLQl9Ci0gICAgfQotICAgIGlmIChpICUgMTYpIHsKLQlpbnQgbjsKLQotCW4gPSAxNiAtIChpICUgMTYpOwotCXByaW50ZigiICIpOwotCWlmIChuPjgpCi0JICAgIHByaW50ZigiICIpOwotCXdoaWxlIChuLS0pCi0JICAgIHByaW50ZigiICAgIik7Ci0KLQluID0gU01CTUlOKDgsIGkgJSAxNik7Ci0JcHJpbnRfYXNjKCZidWZbaSAtIChpICUgMTYpXSwgbik7Ci0JcHJpbnRmKCIgIik7Ci0JbiA9IChpICUgMTYpIC0gbjsKLQlpZiAobiA+IDApCi0JICAgIHByaW50X2FzYygmYnVmW2kgLSBuXSwgbik7Ci0JcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgICByZXR1cm47Ci0KLXRydW5jOgotICAgIHByaW50ZigiXG4iKTsKLSAgICBwcmludGYoIldBUk5JTkc6IFNob3J0IHBhY2tldC4gVHJ5IGluY3JlYXNpbmcgdGhlIHNuYXAgbGVuZ3RoXG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3JpdGVfYml0cyh1bnNpZ25lZCBpbnQgdmFsLCBjb25zdCBjaGFyICpmbXQpCi17Ci0gICAgY29uc3QgY2hhciAqcCA9IGZtdDsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICB3aGlsZSAoKHAgPSBzdHJjaHIoZm10LCAnfCcpKSkgewotCXNpemVfdCBsID0gUFRSX0RJRkYocCwgZm10KTsKLQlpZiAobCAmJiAodmFsICYgKDEgPDwgaSkpKQotCSAgICBwcmludGYoIiUuKnMgIiwgKGludClsLCBmbXQpOwotCWZtdCA9IHAgKyAxOwotCWkrKzsKLSAgICB9Ci19Ci0KLS8qIGNvbnZlcnQgYSBVQ1MyIHN0cmluZyBpbnRvIGlzby04ODU5LTEgc3RyaW5nICovCi0jZGVmaW5lIE1BWF9VTklTVFJfU0laRQkxMDAwCi1zdGF0aWMgY29uc3QgY2hhciAqCi11bmlzdHIoY29uc3QgdV9jaGFyICpzLCB1X2ludDMyX3QgKmxlbiwgaW50IHVzZV91bmljb2RlKQotewotICAgIHN0YXRpYyBjaGFyIGJ1ZltNQVhfVU5JU1RSX1NJWkUrMV07Ci0gICAgc2l6ZV90IGwgPSAwOwotICAgIHVfaW50MzJfdCBzdHJzaXplOwotICAgIGNvbnN0IHVfY2hhciAqc3A7Ci0KLSAgICBpZiAodXNlX3VuaWNvZGUpIHsKLQkvKgotCSAqIFNraXAgcGFkZGluZyB0aGF0IHB1dHMgdGhlIHN0cmluZyBvbiBhbiBldmVuIGJvdW5kYXJ5LgotCSAqLwotCWlmICgoKHMgLSBzdGFydGJ1ZikgJSAyKSAhPSAwKSB7Ci0JICAgIFRDSEVDSyhzWzBdKTsKLQkgICAgcysrOwotCX0KLSAgICB9Ci0gICAgaWYgKCpsZW4gPT0gMCkgewotCS8qCi0JICogTnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KLQkgKi8KLQlzdHJzaXplID0gMDsKLQlzcCA9IHM7Ci0JaWYgKCF1c2VfdW5pY29kZSkgewotCSAgICBmb3IgKDs7KSB7Ci0JCVRDSEVDSyhzcFswXSk7Ci0JCSpsZW4gKz0gMTsKLQkJaWYgKHNwWzBdID09IDApCi0JCSAgICBicmVhazsKLQkJc3ArKzsKLQkgICAgfQotCSAgICBzdHJzaXplID0gKmxlbiAtIDE7Ci0JfSBlbHNlIHsKLQkgICAgZm9yICg7OykgewotCQlUQ0hFQ0syKHNwWzBdLCAyKTsKLQkJKmxlbiArPSAyOwotCQlpZiAoc3BbMF0gPT0gMCAmJiBzcFsxXSA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCXNwICs9IDI7Ci0JICAgIH0KLQkgICAgc3Ryc2l6ZSA9ICpsZW4gLSAyOwotCX0KLSAgICB9IGVsc2UgewotCS8qCi0JICogQ291bnRlZCBzdHJpbmcuCi0JICovCi0Jc3Ryc2l6ZSA9ICpsZW47Ci0gICAgfQotICAgIGlmICghdXNlX3VuaWNvZGUpIHsKLSAgICAJd2hpbGUgKHN0cnNpemUgIT0gMCkgewotICAgIAkgICAgVENIRUNLKHNbMF0pOwotCSAgICBpZiAobCA+PSBNQVhfVU5JU1RSX1NJWkUpCi0JCWJyZWFrOwotCSAgICBpZiAoaXNwcmludChzWzBdKSkKLQkJYnVmW2xdID0gc1swXTsKLQkgICAgZWxzZSB7Ci0JCWlmIChzWzBdID09IDApCi0JCSAgICBicmVhazsKLQkJYnVmW2xdID0gJy4nOwotCSAgICB9Ci0JICAgIGwrKzsKLQkgICAgcysrOwotCSAgICBzdHJzaXplLS07Ci0JfQotICAgIH0gZWxzZSB7Ci0Jd2hpbGUgKHN0cnNpemUgIT0gMCkgewotCSAgICBUQ0hFQ0syKHNbMF0sIDIpOwotCSAgICBpZiAobCA+PSBNQVhfVU5JU1RSX1NJWkUpCi0JCWJyZWFrOwotCSAgICBpZiAoc1sxXSA9PSAwICYmIGlzcHJpbnQoc1swXSkpIHsKLQkJLyogSXQncyBhIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXIgKi8KLQkJYnVmW2xdID0gc1swXTsKLQkgICAgfSBlbHNlIHsKLQkJLyogSXQncyBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIgb3IgYSBub24tcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlciAqLwotCQlpZiAoc1swXSA9PSAwICYmIHNbMV0gPT0gMCkKLQkJICAgIGJyZWFrOwotCQlidWZbbF0gPSAnLic7Ci0JICAgIH0KLQkgICAgbCsrOwotCSAgICBzICs9IDI7Ci0JICAgIGlmIChzdHJzaXplID09IDEpCi0JCWJyZWFrOwotCSAgICBzdHJzaXplIC09IDI7Ci0JfQotICAgIH0KLSAgICBidWZbbF0gPSAwOwotICAgIHJldHVybiBidWY7Ci0KLXRydW5jOgotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgdV9jaGFyICoKLXNtYl9mZGF0YTEoY29uc3QgdV9jaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgdV9jaGFyICptYXhidWYsCi0gICAgaW50IHVuaWNvZGVzdHIpCi17Ci0gICAgaW50IHJldmVyc2UgPSAwOwotICAgIGNvbnN0IGNoYXIgKmF0dHJpYl9mbXQgPSAiUkVBRE9OTFl8SElEREVOfFNZU1RFTXxWT0xVTUV8RElSfEFSQ0hJVkV8IjsKLQotICAgIHdoaWxlICgqZm10ICYmIGJ1ZjxtYXhidWYpIHsKLQlzd2l0Y2ggKCpmbXQpIHsKLQljYXNlICdhJzoKLQkgICAgVENIRUNLKGJ1ZlswXSk7Ci0JICAgIHdyaXRlX2JpdHMoYnVmWzBdLCBhdHRyaWJfZm10KTsKLQkgICAgYnVmKys7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQotCWNhc2UgJ0EnOgotCSAgICBUQ0hFQ0syKGJ1ZlswXSwgMik7Ci0JICAgIHdyaXRlX2JpdHMoRVhUUkFDVF9MRV8xNkJJVFMoYnVmKSwgYXR0cmliX2ZtdCk7Ci0JICAgIGJ1ZiArPSAyOwotCSAgICBmbXQrKzsKLQkgICAgYnJlYWs7Ci0KLQljYXNlICd7JzoKLQkgIHsKLQkgICAgY2hhciBiaXRmbXRbMTI4XTsKLQkgICAgY2hhciAqcDsKLQkgICAgaW50IGw7Ci0KLQkgICAgcCA9IHN0cmNocigrK2ZtdCwgJ30nKTsKLQkgICAgbCA9IFBUUl9ESUZGKHAsIGZtdCk7Ci0KLQkgICAgaWYgKCh1bnNpZ25lZCBpbnQpbCA+IHNpemVvZihiaXRmbXQpIC0gMSkKLQkJICAgIGwgPSBzaXplb2YoYml0Zm10KS0xOwotCi0JICAgIHN0cm5jcHkoYml0Zm10LCBmbXQsIGwpOwotCSAgICBiaXRmbXRbbF0gPSAnXDAnOwotCSAgICBmbXQgPSBwICsgMTsKLQkgICAgVENIRUNLKGJ1ZlswXSk7Ci0JICAgIHdyaXRlX2JpdHMoYnVmWzBdLCBiaXRmbXQpOwotCSAgICBidWYrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlICdQJzoKLQkgIHsKLQkgICAgaW50IGwgPSBhdG9pKGZtdCArIDEpOwotCSAgICBUQ0hFQ0syKGJ1ZlswXSwgbCk7Ci0JICAgIGJ1ZiArPSBsOwotCSAgICBmbXQrKzsKLQkgICAgd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmZtdCkpCi0JCWZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdyJzoKLQkgICAgcmV2ZXJzZSA9ICFyZXZlcnNlOwotCSAgICBmbXQrKzsKLQkgICAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGludCB4OwotCSAgICBUQ0hFQ0soYnVmWzBdKTsKLQkgICAgeCA9IGJ1ZlswXTsKLQkgICAgcHJpbnRmKCIldSAoMHgleCkiLCB4LCB4KTsKLQkgICAgYnVmICs9IDE7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdkJzoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHg7Ci0JICAgIFRDSEVDSzIoYnVmWzBdLCAyKTsKLQkgICAgeCA9IHJldmVyc2UgPyBFWFRSQUNUXzE2QklUUyhidWYpIDoKLQkJCSAgRVhUUkFDVF9MRV8xNkJJVFMoYnVmKTsKLQkgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB4LCB4KTsKLQkgICAgYnVmICs9IDI7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdEJzoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHg7Ci0JICAgIFRDSEVDSzIoYnVmWzBdLCA0KTsKLQkgICAgeCA9IHJldmVyc2UgPyBFWFRSQUNUXzMyQklUUyhidWYpIDoKLQkJCSAgRVhUUkFDVF9MRV8zMkJJVFMoYnVmKTsKLQkgICAgcHJpbnRmKCIlZCAoMHgleCkiLCB4LCB4KTsKLQkgICAgYnVmICs9IDQ7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdMJzoKLQkgIHsKLQkgICAgdV9pbnQ2NF90IHg7Ci0JICAgIFRDSEVDSzIoYnVmWzBdLCA4KTsKLQkgICAgeCA9IHJldmVyc2UgPyBFWFRSQUNUXzY0QklUUyhidWYpIDoKLQkJCSAgRVhUUkFDVF9MRV82NEJJVFMoYnVmKTsKLQkgICAgcHJpbnRmKCIlIiBQUkl1NjQgIiAoMHglIiBQUkl4NjQgIikiLCB4LCB4KTsKLQkgICAgYnVmICs9IDg7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdNJzoKLQkgIHsKLQkgICAgLyogV2VpcmQgbWl4ZWQtZW5kaWFuIGxlbmd0aCB2YWx1ZXMgaW4gNjQtYml0IGxvY2tzICovCi0JICAgIHVfaW50MzJfdCB4MSwgeDI7Ci0JICAgIHVfaW50NjRfdCB4OwotCSAgICBUQ0hFQ0syKGJ1ZlswXSwgOCk7Ci0JICAgIHgxID0gcmV2ZXJzZSA/IEVYVFJBQ1RfMzJCSVRTKGJ1ZikgOgotCQkJICAgRVhUUkFDVF9MRV8zMkJJVFMoYnVmKTsKLQkgICAgeDIgPSByZXZlcnNlID8gRVhUUkFDVF8zMkJJVFMoYnVmICsgNCkgOgotCQkJICAgRVhUUkFDVF9MRV8zMkJJVFMoYnVmICsgNCk7Ci0JICAgIHggPSAoKCh1X2ludDY0X3QpeDEpIDw8IDMyKSB8IHgyOwotCSAgICBwcmludGYoIiUiIFBSSXU2NCAiICgweCUiIFBSSXg2NCAiKSIsIHgsIHgpOwotCSAgICBidWYgKz0gODsKLQkgICAgZm10Kys7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgJ0InOgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgeDsKLQkgICAgVENIRUNLKGJ1ZlswXSk7Ci0JICAgIHggPSBidWZbMF07Ci0JICAgIHByaW50ZigiMHglWCIsIHgpOwotCSAgICBidWYgKz0gMTsKLQkgICAgZm10Kys7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgJ3cnOgotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgeDsKLQkgICAgVENIRUNLMihidWZbMF0sIDIpOwotCSAgICB4ID0gcmV2ZXJzZSA/IEVYVFJBQ1RfMTZCSVRTKGJ1ZikgOgotCQkJICBFWFRSQUNUX0xFXzE2QklUUyhidWYpOwotCSAgICBwcmludGYoIjB4JVgiLCB4KTsKLQkgICAgYnVmICs9IDI7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdXJzoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHg7Ci0JICAgIFRDSEVDSzIoYnVmWzBdLCA0KTsKLQkgICAgeCA9IHJldmVyc2UgPyBFWFRSQUNUXzMyQklUUyhidWYpIDoKLQkJCSAgRVhUUkFDVF9MRV8zMkJJVFMoYnVmKTsKLQkgICAgcHJpbnRmKCIweCVYIiwgeCk7Ci0JICAgIGJ1ZiArPSA0OwotCSAgICBmbXQrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAnbCc6Ci0JICB7Ci0JICAgIGZtdCsrOwotCSAgICBzd2l0Y2ggKCpmbXQpIHsKLQotCSAgICBjYXNlICdiJzoKLQkJVENIRUNLKGJ1ZlswXSk7Ci0JCXN0cmluZ2xlbiA9IGJ1ZlswXTsKLQkJcHJpbnRmKCIldSIsIHN0cmluZ2xlbik7Ci0JCWJ1ZiArPSAxOwotCQlicmVhazsKLQotCSAgICBjYXNlICdkJzoKLQkJVENIRUNLMihidWZbMF0sIDIpOwotCQlzdHJpbmdsZW4gPSByZXZlcnNlID8gRVhUUkFDVF8xNkJJVFMoYnVmKSA6Ci0JCQkJICAgICAgRVhUUkFDVF9MRV8xNkJJVFMoYnVmKTsKLQkJcHJpbnRmKCIldSIsIHN0cmluZ2xlbik7Ci0JCWJ1ZiArPSAyOwotCQlicmVhazsKLQotCSAgICBjYXNlICdEJzoKLQkJVENIRUNLMihidWZbMF0sIDQpOwotCQlzdHJpbmdsZW4gPSByZXZlcnNlID8gRVhUUkFDVF8zMkJJVFMoYnVmKSA6Ci0JCQkJICAgICAgRVhUUkFDVF9MRV8zMkJJVFMoYnVmKTsKLQkJcHJpbnRmKCIldSIsIHN0cmluZ2xlbik7Ci0JCWJ1ZiArPSA0OwotCQlicmVhazsKLQkgICAgfQotCSAgICBmbXQrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnUic6CS8qIGxpa2UgJ1MnLCBidXQgYWx3YXlzIEFTQ0lJICovCi0JICB7Ci0JICAgIC8qWFhYIHVuaXN0cigpICovCi0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHVfaW50MzJfdCBsZW47Ci0KLQkgICAgbGVuID0gMDsKLQkgICAgcyA9IHVuaXN0cihidWYsICZsZW4sICgqZm10ID09ICdSJykgPyAwIDogdW5pY29kZXN0cik7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JCWdvdG8gdHJ1bmM7Ci0JICAgIHByaW50ZigiJXMiLCBzKTsKLQkgICAgYnVmICs9IGxlbjsKLQkgICAgZm10Kys7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgJ1onOgotCWNhc2UgJ1knOgkvKiBsaWtlICdaJywgYnV0IGFsd2F5cyBBU0NJSSAqLwotCSAgewotCSAgICBjb25zdCBjaGFyICpzOwotCSAgICB1X2ludDMyX3QgbGVuOwotCi0JICAgIFRDSEVDSygqYnVmKTsKLQkgICAgaWYgKCpidWYgIT0gNCAmJiAqYnVmICE9IDIpIHsKLQkJcHJpbnRmKCJFcnJvciEgQVNDSUlaIGJ1ZmZlciBvZiB0eXBlICV1IiwgKmJ1Zik7Ci0JCXJldHVybiBtYXhidWY7CS8qIGdpdmUgdXAgKi8KLQkgICAgfQotCSAgICBsZW4gPSAwOwotCSAgICBzID0gdW5pc3RyKGJ1ZiArIDEsICZsZW4sICgqZm10ID09ICdZJykgPyAwIDogdW5pY29kZXN0cik7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JCWdvdG8gdHJ1bmM7Ci0JICAgIHByaW50ZigiJXMiLCBzKTsKLQkgICAgYnVmICs9IGxlbiArIDE7Ci0JICAgIGZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdzJzoKLQkgIHsKLQkgICAgaW50IGwgPSBhdG9pKGZtdCArIDEpOwotCSAgICBUQ0hFQ0syKCpidWYsIGwpOwotCSAgICBwcmludGYoIiUtKi4qcyIsIGwsIGwsIGJ1Zik7Ci0JICAgIGJ1ZiArPSBsOwotCSAgICBmbXQrKzsKLQkgICAgd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmZtdCkpCi0JCWZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlICdjJzoKLQkgIHsKLQkgICAgVENIRUNLMigqYnVmLCBzdHJpbmdsZW4pOwotCSAgICBwcmludGYoIiUtKi4qcyIsIChpbnQpc3RyaW5nbGVuLCAoaW50KXN0cmluZ2xlbiwgYnVmKTsKLQkgICAgYnVmICs9IHN0cmluZ2xlbjsKLQkgICAgZm10Kys7Ci0JICAgIHdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpmbXQpKQotCQlmbXQrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAnQyc6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHMgPSB1bmlzdHIoYnVmLCAmc3RyaW5nbGVuLCB1bmljb2Rlc3RyKTsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkJZ290byB0cnVuYzsKLQkgICAgcHJpbnRmKCIlcyIsIHMpOwotCSAgICBidWYgKz0gc3RyaW5nbGVuOwotCSAgICBmbXQrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAnaCc6Ci0JICB7Ci0JICAgIGludCBsID0gYXRvaShmbXQgKyAxKTsKLQkgICAgVENIRUNLMigqYnVmLCBsKTsKLQkgICAgd2hpbGUgKGwtLSkKLQkJcHJpbnRmKCIlMDJ4IiwgKmJ1ZisrKTsKLQkgICAgZm10Kys7Ci0JICAgIHdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpmbXQpKQotCQlmbXQrKzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSAnbic6Ci0JICB7Ci0JICAgIGludCB0ID0gYXRvaShmbXQrMSk7Ci0JICAgIGNoYXIgbmJ1ZlsyNTVdOwotCSAgICBpbnQgbmFtZV90eXBlOwotCSAgICBpbnQgbGVuOwotCi0JICAgIHN3aXRjaCAodCkgewotCSAgICBjYXNlIDE6Ci0JCW5hbWVfdHlwZSA9IG5hbWVfZXh0cmFjdChzdGFydGJ1ZiwgUFRSX0RJRkYoYnVmLCBzdGFydGJ1ZiksCi0JCSAgICBtYXhidWYsIG5idWYpOwotCQlpZiAobmFtZV90eXBlIDwgMCkKLQkJICAgIGdvdG8gdHJ1bmM7Ci0JCWxlbiA9IG5hbWVfbGVuKGJ1ZiwgbWF4YnVmKTsKLQkJaWYgKGxlbiA8IDApCi0JCSAgICBnb3RvIHRydW5jOwotCQlidWYgKz0gbGVuOwotCQlwcmludGYoIiUtMTUuMTVzIE5hbWVUeXBlPTB4JTAyWCAoJXMpIiwgbmJ1ZiwgbmFtZV90eXBlLAotCQkgICAgbmFtZV90eXBlX3N0cihuYW1lX3R5cGUpKTsKLQkJYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkJVENIRUNLKGJ1ZlsxNV0pOwotCQluYW1lX3R5cGUgPSBidWZbMTVdOwotCQlwcmludGYoIiUtMTUuMTVzIE5hbWVUeXBlPTB4JTAyWCAoJXMpIiwgYnVmLCBuYW1lX3R5cGUsCi0JCSAgICBuYW1lX3R5cGVfc3RyKG5hbWVfdHlwZSkpOwotCQlidWYgKz0gMTY7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGZtdCsrOwotCSAgICB3aGlsZSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqZm10KSkKLQkJZm10Kys7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgJ1QnOgotCSAgewotCSAgICB0aW1lX3QgdDsKLQkgICAgc3RydWN0IHRtICpsdDsKLQkgICAgY29uc3QgY2hhciAqdHN0cmluZzsKLQkgICAgdV9pbnQzMl90IHg7Ci0KLQkgICAgc3dpdGNoIChhdG9pKGZtdCArIDEpKSB7Ci0JICAgIGNhc2UgMToKLQkJVENIRUNLMihidWZbMF0sIDQpOwotCQl4ID0gRVhUUkFDVF9MRV8zMkJJVFMoYnVmKTsKLQkJaWYgKHggPT0gMCB8fCB4ID09IDB4RkZGRkZGRkYpCi0JCSAgICB0ID0gMDsKLQkJZWxzZQotCQkgICAgdCA9IG1ha2VfdW5peF9kYXRlKGJ1Zik7Ci0JCWJ1ZiArPSA0OwotCQlicmVhazsKLQkgICAgY2FzZSAyOgotCQlUQ0hFQ0syKGJ1ZlswXSwgNCk7Ci0JCXggPSBFWFRSQUNUX0xFXzMyQklUUyhidWYpOwotCQlpZiAoeCA9PSAwIHx8IHggPT0gMHhGRkZGRkZGRikKLQkJICAgIHQgPSAwOwotCQllbHNlCi0JCSAgICB0ID0gbWFrZV91bml4X2RhdGUyKGJ1Zik7Ci0JCWJ1ZiArPSA0OwotCQlicmVhazsKLQkgICAgY2FzZSAzOgotCQlUQ0hFQ0syKGJ1ZlswXSwgOCk7Ci0JCXQgPSBpbnRlcnByZXRfbG9uZ19kYXRlKGJ1Zik7Ci0JCWJ1ZiArPSA4OwotCQlicmVhazsKLQkgICAgZGVmYXVsdDoKLQkJdCA9IDA7Ci0JCWJyZWFrOwotCSAgICB9Ci0JICAgIGlmICh0ICE9IDApIHsKLQkJbHQgPSBsb2NhbHRpbWUoJnQpOwotCQlpZiAobHQgIT0gTlVMTCkKLQkJICAgIHRzdHJpbmcgPSBhc2N0aW1lKGx0KTsKLQkJZWxzZQotCQkgICAgdHN0cmluZyA9ICIoQ2FuJ3QgY29udmVydCB0aW1lKVxuIjsKLQkgICAgfSBlbHNlCi0JCXRzdHJpbmcgPSAiTlVMTFxuIjsKLQkgICAgcHJpbnRmKCIlcyIsIHRzdHJpbmcpOwotCSAgICBmbXQrKzsKLQkgICAgd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmZtdCkpCi0JCWZtdCsrOwotCSAgICBicmVhazsKLQkgIH0KLQlkZWZhdWx0OgotCSAgICBwdXRjaGFyKCpmbXQpOwotCSAgICBmbXQrKzsKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAgIGlmIChidWYgPj0gbWF4YnVmICYmICpmbXQpCi0JcHJpbnRmKCJFTkQgT0YgQlVGRkVSXG4iKTsKLQotICAgIHJldHVybihidWYpOwotCi10cnVuYzoKLSAgICBwcmludGYoIlxuIik7Ci0gICAgcHJpbnRmKCJXQVJOSU5HOiBTaG9ydCBwYWNrZXQuIFRyeSBpbmNyZWFzaW5nIHRoZSBzbmFwIGxlbmd0aFxuIik7Ci0gICAgcmV0dXJuKE5VTEwpOwotfQotCi1jb25zdCB1X2NoYXIgKgotc21iX2ZkYXRhKGNvbnN0IHVfY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHVfY2hhciAqbWF4YnVmLAotICAgIGludCB1bmljb2Rlc3RyKQotewotICAgIHN0YXRpYyBpbnQgZGVwdGggPSAwOwotICAgIGNoYXIgc1sxMjhdOwotICAgIGNoYXIgKnA7Ci0KLSAgICB3aGlsZSAoKmZtdCkgewotCXN3aXRjaCAoKmZtdCkgewotCWNhc2UgJyonOgotCSAgICBmbXQrKzsKLQkgICAgd2hpbGUgKGJ1ZiA8IG1heGJ1ZikgewotCQljb25zdCB1X2NoYXIgKmJ1ZjI7Ci0JCWRlcHRoKys7Ci0JCWJ1ZjIgPSBzbWJfZmRhdGEoYnVmLCBmbXQsIG1heGJ1ZiwgdW5pY29kZXN0cik7Ci0JCWRlcHRoLS07Ci0JCWlmIChidWYyID09IE5VTEwpCi0JCSAgICByZXR1cm4oTlVMTCk7Ci0JCWlmIChidWYyID09IGJ1ZikKLQkJICAgIHJldHVybihidWYpOwotCQlidWYgPSBidWYyOwotCSAgICB9Ci0JICAgIHJldHVybihidWYpOwotCi0JY2FzZSAnfCc6Ci0JICAgIGZtdCsrOwotCSAgICBpZiAoYnVmID49IG1heGJ1ZikKLQkJcmV0dXJuKGJ1Zik7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSAnJSc6Ci0JICAgIGZtdCsrOwotCSAgICBidWYgPSBtYXhidWY7Ci0JICAgIGJyZWFrOwotCi0JY2FzZSAnIyc6Ci0JICAgIGZtdCsrOwotCSAgICByZXR1cm4oYnVmKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlICdbJzoKLQkgICAgZm10Kys7Ci0JICAgIGlmIChidWYgPj0gbWF4YnVmKQotCQlyZXR1cm4oYnVmKTsKLQkgICAgbWVtc2V0KHMsIDAsIHNpemVvZihzKSk7Ci0JICAgIHAgPSBzdHJjaHIoZm10LCAnXScpOwotCSAgICBpZiAoKHNpemVfdCkocCAtIGZtdCArIDEpID4gc2l6ZW9mKHMpKSB7Ci0JCS8qIG92ZXJydW4gKi8KLQkJcmV0dXJuKGJ1Zik7Ci0JICAgIH0KLQkgICAgc3RybmNweShzLCBmbXQsIHAgLSBmbXQpOwotCSAgICBzW3AgLSBmbXRdID0gJ1wwJzsKLQkgICAgZm10ID0gcCArIDE7Ci0JICAgIGJ1ZiA9IHNtYl9mZGF0YTEoYnVmLCBzLCBtYXhidWYsIHVuaWNvZGVzdHIpOwotCSAgICBpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybihOVUxMKTsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICBwdXRjaGFyKCpmbXQpOwotCSAgICBmbXQrKzsKLQkgICAgZmZsdXNoKHN0ZG91dCk7Ci0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgaWYgKCFkZXB0aCAmJiBidWYgPCBtYXhidWYpIHsKLQlzaXplX3QgbGVuID0gUFRSX0RJRkYobWF4YnVmLCBidWYpOwotCXByaW50ZigiRGF0YTogKCVsdSBieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKWxlbik7Ci0JcHJpbnRfZGF0YShidWYsIGxlbik7Ci0JcmV0dXJuKGJ1ZiArIGxlbik7Ci0gICAgfQotICAgIHJldHVybihidWYpOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBpbnQgY29kZTsKLSAgICBjb25zdCBjaGFyICptZXNzYWdlOwotfSBlcnJfY29kZV9zdHJ1Y3Q7Ci0KLS8qIERPUyBFcnJvciBNZXNzYWdlcyAqLwotc3RhdGljIGNvbnN0IGVycl9jb2RlX3N0cnVjdCBkb3NfbXNnc1tdID0gewotICAgIHsgIkVSUmJhZGZ1bmMiLCAxLCAiSW52YWxpZCBmdW5jdGlvbi4iIH0sCi0gICAgeyAiRVJSYmFkZmlsZSIsIDIsICJGaWxlIG5vdCBmb3VuZC4iIH0sCi0gICAgeyAiRVJSYmFkcGF0aCIsIDMsICJEaXJlY3RvcnkgaW52YWxpZC4iIH0sCi0gICAgeyAiRVJSbm9maWRzIiwgNCwgIk5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlIiB9LAotICAgIHsgIkVSUm5vYWNjZXNzIiwgNSwgIkFjY2VzcyBkZW5pZWQuIiB9LAotICAgIHsgIkVSUmJhZGZpZCIsIDYsICJJbnZhbGlkIGZpbGUgaGFuZGxlLiIgfSwKLSAgICB7ICJFUlJiYWRtY2IiLCA3LCAiTWVtb3J5IGNvbnRyb2wgYmxvY2tzIGRlc3Ryb3llZC4iIH0sCi0gICAgeyAiRVJSbm9tZW0iLCA4LCAiSW5zdWZmaWNpZW50IHNlcnZlciBtZW1vcnkgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiIgfSwKLSAgICB7ICJFUlJiYWRtZW0iLCA5LCAiSW52YWxpZCBtZW1vcnkgYmxvY2sgYWRkcmVzcy4iIH0sCi0gICAgeyAiRVJSYmFkZW52IiwgMTAsICJJbnZhbGlkIGVudmlyb25tZW50LiIgfSwKLSAgICB7ICJFUlJiYWRmb3JtYXQiLCAxMSwgIkludmFsaWQgZm9ybWF0LiIgfSwKLSAgICB7ICJFUlJiYWRhY2Nlc3MiLCAxMiwgIkludmFsaWQgb3BlbiBtb2RlLiIgfSwKLSAgICB7ICJFUlJiYWRkYXRhIiwgMTMsICJJbnZhbGlkIGRhdGEuIiB9LAotICAgIHsgIkVSUiIsIDE0LCAicmVzZXJ2ZWQuIiB9LAotICAgIHsgIkVSUmJhZGRyaXZlIiwgMTUsICJJbnZhbGlkIGRyaXZlIHNwZWNpZmllZC4iIH0sCi0gICAgeyAiRVJScmVtY2QiLCAxNiwgIkEgRGVsZXRlIERpcmVjdG9yeSByZXF1ZXN0IGF0dGVtcHRlZCB0byByZW1vdmUgdGhlIHNlcnZlcidzIGN1cnJlbnQgZGlyZWN0b3J5LiIgfSwKLSAgICB7ICJFUlJkaWZmZGV2aWNlIiwgMTcsICJOb3Qgc2FtZSBkZXZpY2UuIiB9LAotICAgIHsgIkVSUm5vZmlsZXMiLCAxOCwgIkEgRmlsZSBTZWFyY2ggY29tbWFuZCBjYW4gZmluZCBubyBtb3JlIGZpbGVzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEuIiB9LAotICAgIHsgIkVSUmJhZHNoYXJlIiwgMzIsICJUaGUgc2hhcmluZyBtb2RlIHNwZWNpZmllZCBmb3IgYW4gT3BlbiBjb25mbGljdHMgd2l0aCBleGlzdGluZyBGSURzIG9uIHRoZSBmaWxlLiIgfSwKLSAgICB7ICJFUlJsb2NrIiwgMzMsICJBIExvY2sgcmVxdWVzdCBjb25mbGljdGVkIHdpdGggYW4gZXhpc3RpbmcgbG9jayBvciBzcGVjaWZpZWQgYW4gaW52YWxpZCBtb2RlLCBvciBhbiBVbmxvY2sgcmVxdWVzdGVkIGF0dGVtcHRlZCB0byByZW1vdmUgYSBsb2NrIGhlbGQgYnkgYW5vdGhlciBwcm9jZXNzLiIgfSwKLSAgICB7ICJFUlJmaWxleGlzdHMiLCA4MCwgIlRoZSBmaWxlIG5hbWVkIGluIGEgQ3JlYXRlIERpcmVjdG9yeSwgTWFrZSBOZXcgRmlsZSBvciBMaW5rIHJlcXVlc3QgYWxyZWFkeSBleGlzdHMuIiB9LAotICAgIHsgIkVSUmJhZHBpcGUiLCAyMzAsICJQaXBlIGludmFsaWQuIiB9LAotICAgIHsgIkVSUnBpcGVidXN5IiwgMjMxLCAiQWxsIGluc3RhbmNlcyBvZiB0aGUgcmVxdWVzdGVkIHBpcGUgYXJlIGJ1c3kuIiB9LAotICAgIHsgIkVSUnBpcGVjbG9zaW5nIiwgMjMyLCAiUGlwZSBjbG9zZSBpbiBwcm9ncmVzcy4iIH0sCi0gICAgeyAiRVJSbm90Y29ubmVjdGVkIiwgMjMzLCAiTm8gcHJvY2VzcyBvbiBvdGhlciBlbmQgb2YgcGlwZS4iIH0sCi0gICAgeyAiRVJSbW9yZWRhdGEiLCAyMzQsICJUaGVyZSBpcyBtb3JlIGRhdGEgdG8gYmUgcmV0dXJuZWQuIiB9LAotICAgIHsgTlVMTCwgLTEsIE5VTEwgfQotIH07Ci0KLS8qIFNlcnZlciBFcnJvciBNZXNzYWdlcyAqLwotZXJyX2NvZGVfc3RydWN0IHNlcnZlcl9tc2dzW10gPSB7Ci0gICAgeyAiRVJSZXJyb3IiLCAxLCAiTm9uLXNwZWNpZmljIGVycm9yIGNvZGUuIiB9LAotICAgIHsgIkVSUmJhZHB3IiwgMiwgIkJhZCBwYXNzd29yZCAtIG5hbWUvcGFzc3dvcmQgcGFpciBpbiBhIFRyZWUgQ29ubmVjdCBvciBTZXNzaW9uIFNldHVwIGFyZSBpbnZhbGlkLiIgfSwKLSAgICB7ICJFUlJiYWR0eXBlIiwgMywgInJlc2VydmVkLiIgfSwKLSAgICB7ICJFUlJhY2Nlc3MiLCA0LCAiVGhlIHJlcXVlc3RlciBkb2VzIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgYWNjZXNzIHJpZ2h0cyB3aXRoaW4gdGhlIHNwZWNpZmllZCBjb250ZXh0IGZvciB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGUgY29udGV4dCBpcyBkZWZpbmVkIGJ5IHRoZSBUSUQgb3IgdGhlIFVJRC4iIH0sCi0gICAgeyAiRVJSaW52bmlkIiwgNSwgIlRoZSB0cmVlIElEIChUSUQpIHNwZWNpZmllZCBpbiBhIGNvbW1hbmQgd2FzIGludmFsaWQuIiB9LAotICAgIHsgIkVSUmludm5ldG5hbWUiLCA2LCAiSW52YWxpZCBuZXR3b3JrIG5hbWUgaW4gdHJlZSBjb25uZWN0LiIgfSwKLSAgICB7ICJFUlJpbnZkZXZpY2UiLCA3LCAiSW52YWxpZCBkZXZpY2UgLSBwcmludGVyIHJlcXVlc3QgbWFkZSB0byBub24tcHJpbnRlciBjb25uZWN0aW9uIG9yIG5vbi1wcmludGVyIHJlcXVlc3QgbWFkZSB0byBwcmludGVyIGNvbm5lY3Rpb24uIiB9LAotICAgIHsgIkVSUnFmdWxsIiwgNDksICJQcmludCBxdWV1ZSBmdWxsIChmaWxlcykgLS0gcmV0dXJuZWQgYnkgb3BlbiBwcmludCBmaWxlLiIgfSwKLSAgICB7ICJFUlJxdG9vYmlnIiwgNTAsICJQcmludCBxdWV1ZSBmdWxsIC0tIG5vIHNwYWNlLiIgfSwKLSAgICB7ICJFUlJxZW9mIiwgNTEsICJFT0Ygb24gcHJpbnQgcXVldWUgZHVtcC4iIH0sCi0gICAgeyAiRVJSaW52cGZpZCIsIDUyLCAiSW52YWxpZCBwcmludCBmaWxlIEZJRC4iIH0sCi0gICAgeyAiRVJSc21iY21kIiwgNjQsICJUaGUgc2VydmVyIGRpZCBub3QgcmVjb2duaXplIHRoZSBjb21tYW5kIHJlY2VpdmVkLiIgfSwKLSAgICB7ICJFUlJzcnZlcnJvciIsIDY1LCAiVGhlIHNlcnZlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvciwgZS5nLiwgc3lzdGVtIGZpbGUgdW5hdmFpbGFibGUuIiB9LAotICAgIHsgIkVSUmZpbGVzcGVjcyIsIDY3LCAiVGhlIGZpbGUgaGFuZGxlIChGSUQpIGFuZCBwYXRobmFtZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHZhbHVlcy4iIH0sCi0gICAgeyAiRVJScmVzZXJ2ZWQiLCA2OCwgInJlc2VydmVkLiIgfSwKLSAgICB7ICJFUlJiYWRwZXJtaXRzIiwgNjksICJUaGUgYWNjZXNzIHBlcm1pc3Npb25zIHNwZWNpZmllZCBmb3IgYSBmaWxlIG9yIGRpcmVjdG9yeSBhcmUgbm90IGEgdmFsaWQgY29tYmluYXRpb24uICBUaGUgc2VydmVyIGNhbm5vdCBzZXQgdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUuIiB9LAotICAgIHsgIkVSUnJlc2VydmVkIiwgNzAsICJyZXNlcnZlZC4iIH0sCi0gICAgeyAiRVJSc2V0YXR0cm1vZGUiLCA3MSwgIlRoZSBhdHRyaWJ1dGUgbW9kZSBpbiB0aGUgU2V0IEZpbGUgQXR0cmlidXRlIHJlcXVlc3QgaXMgaW52YWxpZC4iIH0sCi0gICAgeyAiRVJScGF1c2VkIiwgODEsICJTZXJ2ZXIgaXMgcGF1c2VkLiIgfSwKLSAgICB7ICJFUlJtc2dvZmYiLCA4MiwgIk5vdCByZWNlaXZpbmcgbWVzc2FnZXMuIiB9LAotICAgIHsgIkVSUm5vcm9vbSIsIDgzLCAiTm8gcm9vbSB0byBidWZmZXIgbWVzc2FnZS4iIH0sCi0gICAgeyAiRVJScm11bnMiLCA4NywgIlRvbyBtYW55IHJlbW90ZSB1c2VyIG5hbWVzLiIgfSwKLSAgICB7ICJFUlJ0aW1lb3V0IiwgODgsICJPcGVyYXRpb24gdGltZWQgb3V0LiIgfSwKLSAgICB7ICJFUlJub3Jlc291cmNlIiwgODksICJObyByZXNvdXJjZXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgcmVxdWVzdC4iIH0sCi0gICAgeyAiRVJSdG9vbWFueXVpZHMiLCA5MCwgIlRvbyBtYW55IFVJRHMgYWN0aXZlIG9uIHRoaXMgc2Vzc2lvbi4iIH0sCi0gICAgeyAiRVJSYmFkdWlkIiwgOTEsICJUaGUgVUlEIGlzIG5vdCBrbm93biBhcyBhIHZhbGlkIElEIG9uIHRoaXMgc2Vzc2lvbi4iIH0sCi0gICAgeyAiRVJSdXNlbXB4IiwgMjUwLCAiVGVtcCB1bmFibGUgdG8gc3VwcG9ydCBSYXcsIHVzZSBNUFggbW9kZS4iIH0sCi0gICAgeyAiRVJSdXNlc3RkIiwgMjUxLCAiVGVtcCB1bmFibGUgdG8gc3VwcG9ydCBSYXcsIHVzZSBzdGFuZGFyZCByZWFkL3dyaXRlLiIgfSwKLSAgICB7ICJFUlJjb250bXB4IiwgMjUyLCAiQ29udGludWUgaW4gTVBYIG1vZGUuIiB9LAotICAgIHsgIkVSUnJlc2VydmVkIiwgMjUzLCAicmVzZXJ2ZWQuIiB9LAotICAgIHsgIkVSUnJlc2VydmVkIiwgMjU0LCAicmVzZXJ2ZWQuIiB9LAotICAgIHsgIkVSUm5vc3VwcG9ydCIsIDB4RkZGRiwgIkZ1bmN0aW9uIG5vdCBzdXBwb3J0ZWQuIiB9LAotICAgIHsgTlVMTCwgLTEsIE5VTEwgfQotfTsKLQotLyogSGFyZCBFcnJvciBNZXNzYWdlcyAqLwotZXJyX2NvZGVfc3RydWN0IGhhcmRfbXNnc1tdID0gewotICAgIHsgIkVSUm5vd3JpdGUiLCAxOSwgIkF0dGVtcHQgdG8gd3JpdGUgb24gd3JpdGUtcHJvdGVjdGVkIGRpc2tldHRlLiIgfSwKLSAgICB7ICJFUlJiYWR1bml0IiwgMjAsICJVbmtub3duIHVuaXQuIiB9LAotICAgIHsgIkVSUm5vdHJlYWR5IiwgMjEsICJEcml2ZSBub3QgcmVhZHkuIiB9LAotICAgIHsgIkVSUmJhZGNtZCIsIDIyLCAiVW5rbm93biBjb21tYW5kLiIgfSwKLSAgICB7ICJFUlJkYXRhIiwgMjMsICJEYXRhIGVycm9yIChDUkMpLiIgfSwKLSAgICB7ICJFUlJiYWRyZXEiLCAyNCwgIkJhZCByZXF1ZXN0IHN0cnVjdHVyZSBsZW5ndGguIiB9LAotICAgIHsgIkVSUnNlZWsiLCAyNSAsICJTZWVrIGVycm9yLiIgfSwKLSAgICB7ICJFUlJiYWRtZWRpYSIsIDI2LCAiVW5rbm93biBtZWRpYSB0eXBlLiIgfSwKLSAgICB7ICJFUlJiYWRzZWN0b3IiLCAyNywgIlNlY3RvciBub3QgZm91bmQuIiB9LAotICAgIHsgIkVSUm5vcGFwZXIiLCAyOCwgIlByaW50ZXIgb3V0IG9mIHBhcGVyLiIgfSwKLSAgICB7ICJFUlJ3cml0ZSIsIDI5LCAiV3JpdGUgZmF1bHQuIiB9LAotICAgIHsgIkVSUnJlYWQiLCAzMCwgIlJlYWQgZmF1bHQuIiB9LAotICAgIHsgIkVSUmdlbmVyYWwiLCAzMSwgIkdlbmVyYWwgZmFpbHVyZS4iIH0sCi0gICAgeyAiRVJSYmFkc2hhcmUiLCAzMiwgIkEgb3BlbiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBvcGVuLiIgfSwKLSAgICB7ICJFUlJsb2NrIiwgMzMsICJBIExvY2sgcmVxdWVzdCBjb25mbGljdGVkIHdpdGggYW4gZXhpc3RpbmcgbG9jayBvciBzcGVjaWZpZWQgYW4gaW52YWxpZCBtb2RlLCBvciBhbiBVbmxvY2sgcmVxdWVzdGVkIGF0dGVtcHRlZCB0byByZW1vdmUgYSBsb2NrIGhlbGQgYnkgYW5vdGhlciBwcm9jZXNzLiIgfSwKLSAgICB7ICJFUlJ3cm9uZ2Rpc2siLCAzNCwgIlRoZSB3cm9uZyBkaXNrIHdhcyBmb3VuZCBpbiBhIGRyaXZlLiIgfSwKLSAgICB7ICJFUlJGQ0JVbmF2YWlsIiwgMzUsICJObyBGQ0JzIGFyZSBhdmFpbGFibGUgdG8gcHJvY2VzcyByZXF1ZXN0LiIgfSwKLSAgICB7ICJFUlJzaGFyZWJ1ZmV4YyIsIDM2LCAiQSBzaGFyaW5nIGJ1ZmZlciBoYXMgYmVlbiBleGNlZWRlZC4iIH0sCi0gICAgeyBOVUxMLCAtMSwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBpbnQgY29kZTsKLSAgICBjb25zdCBjaGFyICpjbGFzczsKLSAgICBjb25zdCBlcnJfY29kZV9zdHJ1Y3QgKmVycl9tc2dzOwotfSBlcnJfY2xhc3Nlc1tdID0gewotICAgIHsgMCwgIlNVQ0NFU1MiLCBOVUxMIH0sCi0gICAgeyAweDAxLCAiRVJSRE9TIiwgZG9zX21zZ3MgfSwKLSAgICB7IDB4MDIsICJFUlJTUlYiLCBzZXJ2ZXJfbXNncyB9LAotICAgIHsgMHgwMywgIkVSUkhSRCIsIGhhcmRfbXNncyB9LAotICAgIHsgMHgwNCwgIkVSUlhPUyIsIE5VTEwgfSwKLSAgICB7IDB4RTEsICJFUlJSTVgxIiwgTlVMTCB9LAotICAgIHsgMHhFMiwgIkVSUlJNWDIiLCBOVUxMIH0sCi0gICAgeyAweEUzLCAiRVJSUk1YMyIsIE5VTEwgfSwKLSAgICB7IDB4RkYsICJFUlJDTUQiLCBOVUxMIH0sCi0gICAgeyAtMSwgTlVMTCwgTlVMTCB9Ci19OwotCi0vKgotICogcmV0dXJuIGEgU01CIGVycm9yIHN0cmluZyBmcm9tIGEgU01CIGJ1ZmZlcgotICovCi1jaGFyICoKLXNtYl9lcnJzdHIoaW50IGNsYXNzLCBpbnQgbnVtKQotewotICAgIHN0YXRpYyBjaGFyIHJldFsxMjhdOwotICAgIGludCBpLCBqOwotCi0gICAgcmV0WzBdID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGVycl9jbGFzc2VzW2ldLmNsYXNzOyBpKyspCi0JaWYgKGVycl9jbGFzc2VzW2ldLmNvZGUgPT0gY2xhc3MpIHsKLQkgICAgaWYgKGVycl9jbGFzc2VzW2ldLmVycl9tc2dzKSB7Ci0JCWNvbnN0IGVycl9jb2RlX3N0cnVjdCAqZXJyID0gZXJyX2NsYXNzZXNbaV0uZXJyX21zZ3M7Ci0JCWZvciAoaiA9IDA7IGVycltqXS5uYW1lOyBqKyspCi0JCSAgICBpZiAobnVtID09IGVycltqXS5jb2RlKSB7Ci0JCQlzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiJXMgLSAlcyAoJXMpIiwKLQkJCSAgICBlcnJfY2xhc3Nlc1tpXS5jbGFzcywgZXJyW2pdLm5hbWUsIGVycltqXS5tZXNzYWdlKTsKLQkJCXJldHVybiByZXQ7Ci0JCSAgICB9Ci0JICAgIH0KLQotCSAgICBzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiJXMgLSAlZCIsIGVycl9jbGFzc2VzW2ldLmNsYXNzLCBudW0pOwotCSAgICByZXR1cm4gcmV0OwotCX0KLQotICAgIHNucHJpbnRmKHJldCwgc2l6ZW9mKHJldCksICJFUlJPUjogVW5rbm93biBlcnJvciAoJWQsJWQpIiwgY2xhc3MsIG51bSk7Ci0gICAgcmV0dXJuKHJldCk7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1X2ludDMyX3QgY29kZTsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotfSBudF9lcnJfY29kZV9zdHJ1Y3Q7Ci0KLS8qCi0gKiBOVCBFcnJvciBjb2RlcwotICovCi1zdGF0aWMgY29uc3QgbnRfZXJyX2NvZGVfc3RydWN0IG50X2Vycm9yc1tdID0gewotICB7IDB4MDAwMDAwMDAsICJTVEFUVVNfU1VDQ0VTUyIgfSwKLSAgeyAweDAwMDAwMDAwLCAiU1RBVFVTX1dBSVRfMCIgfSwKLSAgeyAweDAwMDAwMDAxLCAiU1RBVFVTX1dBSVRfMSIgfSwKLSAgeyAweDAwMDAwMDAyLCAiU1RBVFVTX1dBSVRfMiIgfSwKLSAgeyAweDAwMDAwMDAzLCAiU1RBVFVTX1dBSVRfMyIgfSwKLSAgeyAweDAwMDAwMDNGLCAiU1RBVFVTX1dBSVRfNjMiIH0sCi0gIHsgMHgwMDAwMDA4MCwgIlNUQVRVU19BQkFORE9ORUQiIH0sCi0gIHsgMHgwMDAwMDA4MCwgIlNUQVRVU19BQkFORE9ORURfV0FJVF8wIiB9LAotICB7IDB4MDAwMDAwQkYsICJTVEFUVVNfQUJBTkRPTkVEX1dBSVRfNjMiIH0sCi0gIHsgMHgwMDAwMDBDMCwgIlNUQVRVU19VU0VSX0FQQyIgfSwKLSAgeyAweDAwMDAwMTAwLCAiU1RBVFVTX0tFUk5FTF9BUEMiIH0sCi0gIHsgMHgwMDAwMDEwMSwgIlNUQVRVU19BTEVSVEVEIiB9LAotICB7IDB4MDAwMDAxMDIsICJTVEFUVVNfVElNRU9VVCIgfSwKLSAgeyAweDAwMDAwMTAzLCAiU1RBVFVTX1BFTkRJTkciIH0sCi0gIHsgMHgwMDAwMDEwNCwgIlNUQVRVU19SRVBBUlNFIiB9LAotICB7IDB4MDAwMDAxMDUsICJTVEFUVVNfTU9SRV9FTlRSSUVTIiB9LAotICB7IDB4MDAwMDAxMDYsICJTVEFUVVNfTk9UX0FMTF9BU1NJR05FRCIgfSwKLSAgeyAweDAwMDAwMTA3LCAiU1RBVFVTX1NPTUVfTk9UX01BUFBFRCIgfSwKLSAgeyAweDAwMDAwMTA4LCAiU1RBVFVTX09QTE9DS19CUkVBS19JTl9QUk9HUkVTUyIgfSwKLSAgeyAweDAwMDAwMTA5LCAiU1RBVFVTX1ZPTFVNRV9NT1VOVEVEIiB9LAotICB7IDB4MDAwMDAxMEEsICJTVEFUVVNfUlhBQ1RfQ09NTUlUVEVEIiB9LAotICB7IDB4MDAwMDAxMEIsICJTVEFUVVNfTk9USUZZX0NMRUFOVVAiIH0sCi0gIHsgMHgwMDAwMDEwQywgIlNUQVRVU19OT1RJRllfRU5VTV9ESVIiIH0sCi0gIHsgMHgwMDAwMDEwRCwgIlNUQVRVU19OT19RVU9UQVNfRk9SX0FDQ09VTlQiIH0sCi0gIHsgMHgwMDAwMDEwRSwgIlNUQVRVU19QUklNQVJZX1RSQU5TUE9SVF9DT05ORUNUX0ZBSUxFRCIgfSwKLSAgeyAweDAwMDAwMTEwLCAiU1RBVFVTX1BBR0VfRkFVTFRfVFJBTlNJVElPTiIgfSwKLSAgeyAweDAwMDAwMTExLCAiU1RBVFVTX1BBR0VfRkFVTFRfREVNQU5EX1pFUk8iIH0sCi0gIHsgMHgwMDAwMDExMiwgIlNUQVRVU19QQUdFX0ZBVUxUX0NPUFlfT05fV1JJVEUiIH0sCi0gIHsgMHgwMDAwMDExMywgIlNUQVRVU19QQUdFX0ZBVUxUX0dVQVJEX1BBR0UiIH0sCi0gIHsgMHgwMDAwMDExNCwgIlNUQVRVU19QQUdFX0ZBVUxUX1BBR0lOR19GSUxFIiB9LAotICB7IDB4MDAwMDAxMTUsICJTVEFUVVNfQ0FDSEVfUEFHRV9MT0NLRUQiIH0sCi0gIHsgMHgwMDAwMDExNiwgIlNUQVRVU19DUkFTSF9EVU1QIiB9LAotICB7IDB4MDAwMDAxMTcsICJTVEFUVVNfQlVGRkVSX0FMTF9aRVJPUyIgfSwKLSAgeyAweDAwMDAwMTE4LCAiU1RBVFVTX1JFUEFSU0VfT0JKRUNUIiB9LAotICB7IDB4MDAwMDA0NUMsICJTVEFUVVNfTk9fU0hVVERPV05fSU5fUFJPR1JFU1MiIH0sCi0gIHsgMHg0MDAwMDAwMCwgIlNUQVRVU19PQkpFQ1RfTkFNRV9FWElTVFMiIH0sCi0gIHsgMHg0MDAwMDAwMSwgIlNUQVRVU19USFJFQURfV0FTX1NVU1BFTkRFRCIgfSwKLSAgeyAweDQwMDAwMDAyLCAiU1RBVFVTX1dPUktJTkdfU0VUX0xJTUlUX1JBTkdFIiB9LAotICB7IDB4NDAwMDAwMDMsICJTVEFUVVNfSU1BR0VfTk9UX0FUX0JBU0UiIH0sCi0gIHsgMHg0MDAwMDAwNCwgIlNUQVRVU19SWEFDVF9TVEFURV9DUkVBVEVEIiB9LAotICB7IDB4NDAwMDAwMDUsICJTVEFUVVNfU0VHTUVOVF9OT1RJRklDQVRJT04iIH0sCi0gIHsgMHg0MDAwMDAwNiwgIlNUQVRVU19MT0NBTF9VU0VSX1NFU1NJT05fS0VZIiB9LAotICB7IDB4NDAwMDAwMDcsICJTVEFUVVNfQkFEX0NVUlJFTlRfRElSRUNUT1JZIiB9LAotICB7IDB4NDAwMDAwMDgsICJTVEFUVVNfU0VSSUFMX01PUkVfV1JJVEVTIiB9LAotICB7IDB4NDAwMDAwMDksICJTVEFUVVNfUkVHSVNUUllfUkVDT1ZFUkVEIiB9LAotICB7IDB4NDAwMDAwMEEsICJTVEFUVVNfRlRfUkVBRF9SRUNPVkVSWV9GUk9NX0JBQ0tVUCIgfSwKLSAgeyAweDQwMDAwMDBCLCAiU1RBVFVTX0ZUX1dSSVRFX1JFQ09WRVJZIiB9LAotICB7IDB4NDAwMDAwMEMsICJTVEFUVVNfU0VSSUFMX0NPVU5URVJfVElNRU9VVCIgfSwKLSAgeyAweDQwMDAwMDBELCAiU1RBVFVTX05VTExfTE1fUEFTU1dPUkQiIH0sCi0gIHsgMHg0MDAwMDAwRSwgIlNUQVRVU19JTUFHRV9NQUNISU5FX1RZUEVfTUlTTUFUQ0giIH0sCi0gIHsgMHg0MDAwMDAwRiwgIlNUQVRVU19SRUNFSVZFX1BBUlRJQUwiIH0sCi0gIHsgMHg0MDAwMDAxMCwgIlNUQVRVU19SRUNFSVZFX0VYUEVESVRFRCIgfSwKLSAgeyAweDQwMDAwMDExLCAiU1RBVFVTX1JFQ0VJVkVfUEFSVElBTF9FWFBFRElURUQiIH0sCi0gIHsgMHg0MDAwMDAxMiwgIlNUQVRVU19FVkVOVF9ET05FIiB9LAotICB7IDB4NDAwMDAwMTMsICJTVEFUVVNfRVZFTlRfUEVORElORyIgfSwKLSAgeyAweDQwMDAwMDE0LCAiU1RBVFVTX0NIRUNLSU5HX0ZJTEVfU1lTVEVNIiB9LAotICB7IDB4NDAwMDAwMTUsICJTVEFUVVNfRkFUQUxfQVBQX0VYSVQiIH0sCi0gIHsgMHg0MDAwMDAxNiwgIlNUQVRVU19QUkVERUZJTkVEX0hBTkRMRSIgfSwKLSAgeyAweDQwMDAwMDE3LCAiU1RBVFVTX1dBU19VTkxPQ0tFRCIgfSwKLSAgeyAweDQwMDAwMDE4LCAiU1RBVFVTX1NFUlZJQ0VfTk9USUZJQ0FUSU9OIiB9LAotICB7IDB4NDAwMDAwMTksICJTVEFUVVNfV0FTX0xPQ0tFRCIgfSwKLSAgeyAweDQwMDAwMDFBLCAiU1RBVFVTX0xPR19IQVJEX0VSUk9SIiB9LAotICB7IDB4NDAwMDAwMUIsICJTVEFUVVNfQUxSRUFEWV9XSU4zMiIgfSwKLSAgeyAweDQwMDAwMDFDLCAiU1RBVFVTX1dYODZfVU5TSU1VTEFURSIgfSwKLSAgeyAweDQwMDAwMDFELCAiU1RBVFVTX1dYODZfQ09OVElOVUUiIH0sCi0gIHsgMHg0MDAwMDAxRSwgIlNUQVRVU19XWDg2X1NJTkdMRV9TVEVQIiB9LAotICB7IDB4NDAwMDAwMUYsICJTVEFUVVNfV1g4Nl9CUkVBS1BPSU5UIiB9LAotICB7IDB4NDAwMDAwMjAsICJTVEFUVVNfV1g4Nl9FWENFUFRJT05fQ09OVElOVUUiIH0sCi0gIHsgMHg0MDAwMDAyMSwgIlNUQVRVU19XWDg2X0VYQ0VQVElPTl9MQVNUQ0hBTkNFIiB9LAotICB7IDB4NDAwMDAwMjIsICJTVEFUVVNfV1g4Nl9FWENFUFRJT05fQ0hBSU4iIH0sCi0gIHsgMHg0MDAwMDAyMywgIlNUQVRVU19JTUFHRV9NQUNISU5FX1RZUEVfTUlTTUFUQ0hfRVhFIiB9LAotICB7IDB4NDAwMDAwMjQsICJTVEFUVVNfTk9fWUlFTERfUEVSRk9STUVEIiB9LAotICB7IDB4NDAwMDAwMjUsICJTVEFUVVNfVElNRVJfUkVTVU1FX0lHTk9SRUQiIH0sCi0gIHsgMHg4MDAwMDAwMSwgIlNUQVRVU19HVUFSRF9QQUdFX1ZJT0xBVElPTiIgfSwKLSAgeyAweDgwMDAwMDAyLCAiU1RBVFVTX0RBVEFUWVBFX01JU0FMSUdOTUVOVCIgfSwKLSAgeyAweDgwMDAwMDAzLCAiU1RBVFVTX0JSRUFLUE9JTlQiIH0sCi0gIHsgMHg4MDAwMDAwNCwgIlNUQVRVU19TSU5HTEVfU1RFUCIgfSwKLSAgeyAweDgwMDAwMDA1LCAiU1RBVFVTX0JVRkZFUl9PVkVSRkxPVyIgfSwKLSAgeyAweDgwMDAwMDA2LCAiU1RBVFVTX05PX01PUkVfRklMRVMiIH0sCi0gIHsgMHg4MDAwMDAwNywgIlNUQVRVU19XQUtFX1NZU1RFTV9ERUJVR0dFUiIgfSwKLSAgeyAweDgwMDAwMDBBLCAiU1RBVFVTX0hBTkRMRVNfQ0xPU0VEIiB9LAotICB7IDB4ODAwMDAwMEIsICJTVEFUVVNfTk9fSU5IRVJJVEFOQ0UiIH0sCi0gIHsgMHg4MDAwMDAwQywgIlNUQVRVU19HVUlEX1NVQlNUSVRVVElPTl9NQURFIiB9LAotICB7IDB4ODAwMDAwMEQsICJTVEFUVVNfUEFSVElBTF9DT1BZIiB9LAotICB7IDB4ODAwMDAwMEUsICJTVEFUVVNfREVWSUNFX1BBUEVSX0VNUFRZIiB9LAotICB7IDB4ODAwMDAwMEYsICJTVEFUVVNfREVWSUNFX1BPV0VSRURfT0ZGIiB9LAotICB7IDB4ODAwMDAwMTAsICJTVEFUVVNfREVWSUNFX09GRl9MSU5FIiB9LAotICB7IDB4ODAwMDAwMTEsICJTVEFUVVNfREVWSUNFX0JVU1kiIH0sCi0gIHsgMHg4MDAwMDAxMiwgIlNUQVRVU19OT19NT1JFX0VBUyIgfSwKLSAgeyAweDgwMDAwMDEzLCAiU1RBVFVTX0lOVkFMSURfRUFfTkFNRSIgfSwKLSAgeyAweDgwMDAwMDE0LCAiU1RBVFVTX0VBX0xJU1RfSU5DT05TSVNURU5UIiB9LAotICB7IDB4ODAwMDAwMTUsICJTVEFUVVNfSU5WQUxJRF9FQV9GTEFHIiB9LAotICB7IDB4ODAwMDAwMTYsICJTVEFUVVNfVkVSSUZZX1JFUVVJUkVEIiB9LAotICB7IDB4ODAwMDAwMTcsICJTVEFUVVNfRVhUUkFORU9VU19JTkZPUk1BVElPTiIgfSwKLSAgeyAweDgwMDAwMDE4LCAiU1RBVFVTX1JYQUNUX0NPTU1JVF9ORUNFU1NBUlkiIH0sCi0gIHsgMHg4MDAwMDAxQSwgIlNUQVRVU19OT19NT1JFX0VOVFJJRVMiIH0sCi0gIHsgMHg4MDAwMDAxQiwgIlNUQVRVU19GSUxFTUFSS19ERVRFQ1RFRCIgfSwKLSAgeyAweDgwMDAwMDFDLCAiU1RBVFVTX01FRElBX0NIQU5HRUQiIH0sCi0gIHsgMHg4MDAwMDAxRCwgIlNUQVRVU19CVVNfUkVTRVQiIH0sCi0gIHsgMHg4MDAwMDAxRSwgIlNUQVRVU19FTkRfT0ZfTUVESUEiIH0sCi0gIHsgMHg4MDAwMDAxRiwgIlNUQVRVU19CRUdJTk5JTkdfT0ZfTUVESUEiIH0sCi0gIHsgMHg4MDAwMDAyMCwgIlNUQVRVU19NRURJQV9DSEVDSyIgfSwKLSAgeyAweDgwMDAwMDIxLCAiU1RBVFVTX1NFVE1BUktfREVURUNURUQiIH0sCi0gIHsgMHg4MDAwMDAyMiwgIlNUQVRVU19OT19EQVRBX0RFVEVDVEVEIiB9LAotICB7IDB4ODAwMDAwMjMsICJTVEFUVVNfUkVESVJFQ1RPUl9IQVNfT1BFTl9IQU5ETEVTIiB9LAotICB7IDB4ODAwMDAwMjQsICJTVEFUVVNfU0VSVkVSX0hBU19PUEVOX0hBTkRMRVMiIH0sCi0gIHsgMHg4MDAwMDAyNSwgIlNUQVRVU19BTFJFQURZX0RJU0NPTk5FQ1RFRCIgfSwKLSAgeyAweDgwMDAwMDI2LCAiU1RBVFVTX0xPTkdKVU1QIiB9LAotICB7IDB4ODAwNDAxMTEsICJNQVBJX0VfTE9HT05fRkFJTEVEIiB9LAotICB7IDB4ODAwOTAzMDAsICJTRUNfRV9JTlNVRkZJQ0lFTlRfTUVNT1JZIiB9LAotICB7IDB4ODAwOTAzMDEsICJTRUNfRV9JTlZBTElEX0hBTkRMRSIgfSwKLSAgeyAweDgwMDkwMzAyLCAiU0VDX0VfVU5TVVBQT1JURURfRlVOQ1RJT04iIH0sCi0gIHsgMHg4MDA5MDMwQiwgIlNFQ19FX05PX0lNUEVSU09OQVRJT04iIH0sCi0gIHsgMHg4MDA5MDMwRCwgIlNFQ19FX1VOS05PV05fQ1JFREVOVElBTFMiIH0sCi0gIHsgMHg4MDA5MDMwRSwgIlNFQ19FX05PX0NSRURFTlRJQUxTIiB9LAotICB7IDB4ODAwOTAzMEYsICJTRUNfRV9NRVNTQUdFX0FMVEVSRUQiIH0sCi0gIHsgMHg4MDA5MDMxMCwgIlNFQ19FX09VVF9PRl9TRVFVRU5DRSIgfSwKLSAgeyAweDgwMDkwMzExLCAiU0VDX0VfTk9fQVVUSEVOVElDQVRJTkdfQVVUSE9SSVRZIiB9LAotICB7IDB4QzAwMDAwMDEsICJTVEFUVVNfVU5TVUNDRVNTRlVMIiB9LAotICB7IDB4QzAwMDAwMDIsICJTVEFUVVNfTk9UX0lNUExFTUVOVEVEIiB9LAotICB7IDB4QzAwMDAwMDMsICJTVEFUVVNfSU5WQUxJRF9JTkZPX0NMQVNTIiB9LAotICB7IDB4QzAwMDAwMDQsICJTVEFUVVNfSU5GT19MRU5HVEhfTUlTTUFUQ0giIH0sCi0gIHsgMHhDMDAwMDAwNSwgIlNUQVRVU19BQ0NFU1NfVklPTEFUSU9OIiB9LAotICB7IDB4QzAwMDAwMDYsICJTVEFUVVNfSU5fUEFHRV9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMDA3LCAiU1RBVFVTX1BBR0VGSUxFX1FVT1RBIiB9LAotICB7IDB4QzAwMDAwMDgsICJTVEFUVVNfSU5WQUxJRF9IQU5ETEUiIH0sCi0gIHsgMHhDMDAwMDAwOSwgIlNUQVRVU19CQURfSU5JVElBTF9TVEFDSyIgfSwKLSAgeyAweEMwMDAwMDBBLCAiU1RBVFVTX0JBRF9JTklUSUFMX1BDIiB9LAotICB7IDB4QzAwMDAwMEIsICJTVEFUVVNfSU5WQUxJRF9DSUQiIH0sCi0gIHsgMHhDMDAwMDAwQywgIlNUQVRVU19USU1FUl9OT1RfQ0FOQ0VMRUQiIH0sCi0gIHsgMHhDMDAwMDAwRCwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUiIgfSwKLSAgeyAweEMwMDAwMDBFLCAiU1RBVFVTX05PX1NVQ0hfREVWSUNFIiB9LAotICB7IDB4QzAwMDAwMEYsICJTVEFUVVNfTk9fU1VDSF9GSUxFIiB9LAotICB7IDB4QzAwMDAwMTAsICJTVEFUVVNfSU5WQUxJRF9ERVZJQ0VfUkVRVUVTVCIgfSwKLSAgeyAweEMwMDAwMDExLCAiU1RBVFVTX0VORF9PRl9GSUxFIiB9LAotICB7IDB4QzAwMDAwMTIsICJTVEFUVVNfV1JPTkdfVk9MVU1FIiB9LAotICB7IDB4QzAwMDAwMTMsICJTVEFUVVNfTk9fTUVESUFfSU5fREVWSUNFIiB9LAotICB7IDB4QzAwMDAwMTQsICJTVEFUVVNfVU5SRUNPR05JWkVEX01FRElBIiB9LAotICB7IDB4QzAwMDAwMTUsICJTVEFUVVNfTk9ORVhJU1RFTlRfU0VDVE9SIiB9LAotICB7IDB4QzAwMDAwMTYsICJTVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEIiB9LAotICB7IDB4QzAwMDAwMTcsICJTVEFUVVNfTk9fTUVNT1JZIiB9LAotICB7IDB4QzAwMDAwMTgsICJTVEFUVVNfQ09ORkxJQ1RJTkdfQUREUkVTU0VTIiB9LAotICB7IDB4QzAwMDAwMTksICJTVEFUVVNfTk9UX01BUFBFRF9WSUVXIiB9LAotICB7IDB4QzAwMDAwMUEsICJTVEFUVVNfVU5BQkxFX1RPX0ZSRUVfVk0iIH0sCi0gIHsgMHhDMDAwMDAxQiwgIlNUQVRVU19VTkFCTEVfVE9fREVMRVRFX1NFQ1RJT04iIH0sCi0gIHsgMHhDMDAwMDAxQywgIlNUQVRVU19JTlZBTElEX1NZU1RFTV9TRVJWSUNFIiB9LAotICB7IDB4QzAwMDAwMUQsICJTVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTiIgfSwKLSAgeyAweEMwMDAwMDFFLCAiU1RBVFVTX0lOVkFMSURfTE9DS19TRVFVRU5DRSIgfSwKLSAgeyAweEMwMDAwMDFGLCAiU1RBVFVTX0lOVkFMSURfVklFV19TSVpFIiB9LAotICB7IDB4QzAwMDAwMjAsICJTVEFUVVNfSU5WQUxJRF9GSUxFX0ZPUl9TRUNUSU9OIiB9LAotICB7IDB4QzAwMDAwMjEsICJTVEFUVVNfQUxSRUFEWV9DT01NSVRURUQiIH0sCi0gIHsgMHhDMDAwMDAyMiwgIlNUQVRVU19BQ0NFU1NfREVOSUVEIiB9LAotICB7IDB4QzAwMDAwMjMsICJTVEFUVVNfQlVGRkVSX1RPT19TTUFMTCIgfSwKLSAgeyAweEMwMDAwMDI0LCAiU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIIiB9LAotICB7IDB4QzAwMDAwMjUsICJTVEFUVVNfTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OIiB9LAotICB7IDB4QzAwMDAwMjYsICJTVEFUVVNfSU5WQUxJRF9ESVNQT1NJVElPTiIgfSwKLSAgeyAweEMwMDAwMDI3LCAiU1RBVFVTX1VOV0lORCIgfSwKLSAgeyAweEMwMDAwMDI4LCAiU1RBVFVTX0JBRF9TVEFDSyIgfSwKLSAgeyAweEMwMDAwMDI5LCAiU1RBVFVTX0lOVkFMSURfVU5XSU5EX1RBUkdFVCIgfSwKLSAgeyAweEMwMDAwMDJBLCAiU1RBVFVTX05PVF9MT0NLRUQiIH0sCi0gIHsgMHhDMDAwMDAyQiwgIlNUQVRVU19QQVJJVFlfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDAyQywgIlNUQVRVU19VTkFCTEVfVE9fREVDT01NSVRfVk0iIH0sCi0gIHsgMHhDMDAwMDAyRCwgIlNUQVRVU19OT1RfQ09NTUlUVEVEIiB9LAotICB7IDB4QzAwMDAwMkUsICJTVEFUVVNfSU5WQUxJRF9QT1JUX0FUVFJJQlVURVMiIH0sCi0gIHsgMHhDMDAwMDAyRiwgIlNUQVRVU19QT1JUX01FU1NBR0VfVE9PX0xPTkciIH0sCi0gIHsgMHhDMDAwMDAzMCwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl9NSVgiIH0sCi0gIHsgMHhDMDAwMDAzMSwgIlNUQVRVU19JTlZBTElEX1FVT1RBX0xPV0VSIiB9LAotICB7IDB4QzAwMDAwMzIsICJTVEFUVVNfRElTS19DT1JSVVBUX0VSUk9SIiB9LAotICB7IDB4QzAwMDAwMzMsICJTVEFUVVNfT0JKRUNUX05BTUVfSU5WQUxJRCIgfSwKLSAgeyAweEMwMDAwMDM0LCAiU1RBVFVTX09CSkVDVF9OQU1FX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMDM1LCAiU1RBVFVTX09CSkVDVF9OQU1FX0NPTExJU0lPTiIgfSwKLSAgeyAweEMwMDAwMDM3LCAiU1RBVFVTX1BPUlRfRElTQ09OTkVDVEVEIiB9LAotICB7IDB4QzAwMDAwMzgsICJTVEFUVVNfREVWSUNFX0FMUkVBRFlfQVRUQUNIRUQiIH0sCi0gIHsgMHhDMDAwMDAzOSwgIlNUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEIiB9LAotICB7IDB4QzAwMDAwM0EsICJTVEFUVVNfT0JKRUNUX1BBVEhfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAwM0IsICJTVEFUVVNfT0JKRUNUX1BBVEhfU1lOVEFYX0JBRCIgfSwKLSAgeyAweEMwMDAwMDNDLCAiU1RBVFVTX0RBVEFfT1ZFUlJVTiIgfSwKLSAgeyAweEMwMDAwMDNELCAiU1RBVFVTX0RBVEFfTEFURV9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMDNFLCAiU1RBVFVTX0RBVEFfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDAzRiwgIlNUQVRVU19DUkNfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDA0MCwgIlNUQVRVU19TRUNUSU9OX1RPT19CSUciIH0sCi0gIHsgMHhDMDAwMDA0MSwgIlNUQVRVU19QT1JUX0NPTk5FQ1RJT05fUkVGVVNFRCIgfSwKLSAgeyAweEMwMDAwMDQyLCAiU1RBVFVTX0lOVkFMSURfUE9SVF9IQU5ETEUiIH0sCi0gIHsgMHhDMDAwMDA0MywgIlNUQVRVU19TSEFSSU5HX1ZJT0xBVElPTiIgfSwKLSAgeyAweEMwMDAwMDQ0LCAiU1RBVFVTX1FVT1RBX0VYQ0VFREVEIiB9LAotICB7IDB4QzAwMDAwNDUsICJTVEFUVVNfSU5WQUxJRF9QQUdFX1BST1RFQ1RJT04iIH0sCi0gIHsgMHhDMDAwMDA0NiwgIlNUQVRVU19NVVRBTlRfTk9UX09XTkVEIiB9LAotICB7IDB4QzAwMDAwNDcsICJTVEFUVVNfU0VNQVBIT1JFX0xJTUlUX0VYQ0VFREVEIiB9LAotICB7IDB4QzAwMDAwNDgsICJTVEFUVVNfUE9SVF9BTFJFQURZX1NFVCIgfSwKLSAgeyAweEMwMDAwMDQ5LCAiU1RBVFVTX1NFQ1RJT05fTk9UX0lNQUdFIiB9LAotICB7IDB4QzAwMDAwNEEsICJTVEFUVVNfU1VTUEVORF9DT1VOVF9FWENFRURFRCIgfSwKLSAgeyAweEMwMDAwMDRCLCAiU1RBVFVTX1RIUkVBRF9JU19URVJNSU5BVElORyIgfSwKLSAgeyAweEMwMDAwMDRDLCAiU1RBVFVTX0JBRF9XT1JLSU5HX1NFVF9MSU1JVCIgfSwKLSAgeyAweEMwMDAwMDRELCAiU1RBVFVTX0lOQ09NUEFUSUJMRV9GSUxFX01BUCIgfSwKLSAgeyAweEMwMDAwMDRFLCAiU1RBVFVTX1NFQ1RJT05fUFJPVEVDVElPTiIgfSwKLSAgeyAweEMwMDAwMDRGLCAiU1RBVFVTX0VBU19OT1RfU1VQUE9SVEVEIiB9LAotICB7IDB4QzAwMDAwNTAsICJTVEFUVVNfRUFfVE9PX0xBUkdFIiB9LAotICB7IDB4QzAwMDAwNTEsICJTVEFUVVNfTk9ORVhJU1RFTlRfRUFfRU5UUlkiIH0sCi0gIHsgMHhDMDAwMDA1MiwgIlNUQVRVU19OT19FQVNfT05fRklMRSIgfSwKLSAgeyAweEMwMDAwMDUzLCAiU1RBVFVTX0VBX0NPUlJVUFRfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDA1NCwgIlNUQVRVU19GSUxFX0xPQ0tfQ09ORkxJQ1QiIH0sCi0gIHsgMHhDMDAwMDA1NSwgIlNUQVRVU19MT0NLX05PVF9HUkFOVEVEIiB9LAotICB7IDB4QzAwMDAwNTYsICJTVEFUVVNfREVMRVRFX1BFTkRJTkciIH0sCi0gIHsgMHhDMDAwMDA1NywgIlNUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEIiB9LAotICB7IDB4QzAwMDAwNTgsICJTVEFUVVNfVU5LTk9XTl9SRVZJU0lPTiIgfSwKLSAgeyAweEMwMDAwMDU5LCAiU1RBVFVTX1JFVklTSU9OX01JU01BVENIIiB9LAotICB7IDB4QzAwMDAwNUEsICJTVEFUVVNfSU5WQUxJRF9PV05FUiIgfSwKLSAgeyAweEMwMDAwMDVCLCAiU1RBVFVTX0lOVkFMSURfUFJJTUFSWV9HUk9VUCIgfSwKLSAgeyAweEMwMDAwMDVDLCAiU1RBVFVTX05PX0lNUEVSU09OQVRJT05fVE9LRU4iIH0sCi0gIHsgMHhDMDAwMDA1RCwgIlNUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZIiB9LAotICB7IDB4QzAwMDAwNUUsICJTVEFUVVNfTk9fTE9HT05fU0VSVkVSUyIgfSwKLSAgeyAweEMwMDAwMDVGLCAiU1RBVFVTX05PX1NVQ0hfTE9HT05fU0VTU0lPTiIgfSwKLSAgeyAweEMwMDAwMDYwLCAiU1RBVFVTX05PX1NVQ0hfUFJJVklMRUdFIiB9LAotICB7IDB4QzAwMDAwNjEsICJTVEFUVVNfUFJJVklMRUdFX05PVF9IRUxEIiB9LAotICB7IDB4QzAwMDAwNjIsICJTVEFUVVNfSU5WQUxJRF9BQ0NPVU5UX05BTUUiIH0sCi0gIHsgMHhDMDAwMDA2MywgIlNUQVRVU19VU0VSX0VYSVNUUyIgfSwKLSAgeyAweEMwMDAwMDY0LCAiU1RBVFVTX05PX1NVQ0hfVVNFUiIgfSwKLSAgeyAweEMwMDAwMDY1LCAiU1RBVFVTX0dST1VQX0VYSVNUUyIgfSwKLSAgeyAweEMwMDAwMDY2LCAiU1RBVFVTX05PX1NVQ0hfR1JPVVAiIH0sCi0gIHsgMHhDMDAwMDA2NywgIlNUQVRVU19NRU1CRVJfSU5fR1JPVVAiIH0sCi0gIHsgMHhDMDAwMDA2OCwgIlNUQVRVU19NRU1CRVJfTk9UX0lOX0dST1VQIiB9LAotICB7IDB4QzAwMDAwNjksICJTVEFUVVNfTEFTVF9BRE1JTiIgfSwKLSAgeyAweEMwMDAwMDZBLCAiU1RBVFVTX1dST05HX1BBU1NXT1JEIiB9LAotICB7IDB4QzAwMDAwNkIsICJTVEFUVVNfSUxMX0ZPUk1FRF9QQVNTV09SRCIgfSwKLSAgeyAweEMwMDAwMDZDLCAiU1RBVFVTX1BBU1NXT1JEX1JFU1RSSUNUSU9OIiB9LAotICB7IDB4QzAwMDAwNkQsICJTVEFUVVNfTE9HT05fRkFJTFVSRSIgfSwKLSAgeyAweEMwMDAwMDZFLCAiU1RBVFVTX0FDQ09VTlRfUkVTVFJJQ1RJT04iIH0sCi0gIHsgMHhDMDAwMDA2RiwgIlNUQVRVU19JTlZBTElEX0xPR09OX0hPVVJTIiB9LAotICB7IDB4QzAwMDAwNzAsICJTVEFUVVNfSU5WQUxJRF9XT1JLU1RBVElPTiIgfSwKLSAgeyAweEMwMDAwMDcxLCAiU1RBVFVTX1BBU1NXT1JEX0VYUElSRUQiIH0sCi0gIHsgMHhDMDAwMDA3MiwgIlNUQVRVU19BQ0NPVU5UX0RJU0FCTEVEIiB9LAotICB7IDB4QzAwMDAwNzMsICJTVEFUVVNfTk9ORV9NQVBQRUQiIH0sCi0gIHsgMHhDMDAwMDA3NCwgIlNUQVRVU19UT09fTUFOWV9MVUlEU19SRVFVRVNURUQiIH0sCi0gIHsgMHhDMDAwMDA3NSwgIlNUQVRVU19MVUlEU19FWEhBVVNURUQiIH0sCi0gIHsgMHhDMDAwMDA3NiwgIlNUQVRVU19JTlZBTElEX1NVQl9BVVRIT1JJVFkiIH0sCi0gIHsgMHhDMDAwMDA3NywgIlNUQVRVU19JTlZBTElEX0FDTCIgfSwKLSAgeyAweEMwMDAwMDc4LCAiU1RBVFVTX0lOVkFMSURfU0lEIiB9LAotICB7IDB4QzAwMDAwNzksICJTVEFUVVNfSU5WQUxJRF9TRUNVUklUWV9ERVNDUiIgfSwKLSAgeyAweEMwMDAwMDdBLCAiU1RBVFVTX1BST0NFRFVSRV9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDA3QiwgIlNUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVCIgfSwKLSAgeyAweEMwMDAwMDdDLCAiU1RBVFVTX05PX1RPS0VOIiB9LAotICB7IDB4QzAwMDAwN0QsICJTVEFUVVNfQkFEX0lOSEVSSVRBTkNFX0FDTCIgfSwKLSAgeyAweEMwMDAwMDdFLCAiU1RBVFVTX1JBTkdFX05PVF9MT0NLRUQiIH0sCi0gIHsgMHhDMDAwMDA3RiwgIlNUQVRVU19ESVNLX0ZVTEwiIH0sCi0gIHsgMHhDMDAwMDA4MCwgIlNUQVRVU19TRVJWRVJfRElTQUJMRUQiIH0sCi0gIHsgMHhDMDAwMDA4MSwgIlNUQVRVU19TRVJWRVJfTk9UX0RJU0FCTEVEIiB9LAotICB7IDB4QzAwMDAwODIsICJTVEFUVVNfVE9PX01BTllfR1VJRFNfUkVRVUVTVEVEIiB9LAotICB7IDB4QzAwMDAwODMsICJTVEFUVVNfR1VJRFNfRVhIQVVTVEVEIiB9LAotICB7IDB4QzAwMDAwODQsICJTVEFUVVNfSU5WQUxJRF9JRF9BVVRIT1JJVFkiIH0sCi0gIHsgMHhDMDAwMDA4NSwgIlNUQVRVU19BR0VOVFNfRVhIQVVTVEVEIiB9LAotICB7IDB4QzAwMDAwODYsICJTVEFUVVNfSU5WQUxJRF9WT0xVTUVfTEFCRUwiIH0sCi0gIHsgMHhDMDAwMDA4NywgIlNUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRCIgfSwKLSAgeyAweEMwMDAwMDg4LCAiU1RBVFVTX05PVF9NQVBQRURfREFUQSIgfSwKLSAgeyAweEMwMDAwMDg5LCAiU1RBVFVTX1JFU09VUkNFX0RBVEFfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAwOEEsICJTVEFUVVNfUkVTT1VSQ0VfVFlQRV9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDA4QiwgIlNUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMDhDLCAiU1RBVFVTX0FSUkFZX0JPVU5EU19FWENFRURFRCIgfSwKLSAgeyAweEMwMDAwMDhELCAiU1RBVFVTX0ZMT0FUX0RFTk9STUFMX09QRVJBTkQiIH0sCi0gIHsgMHhDMDAwMDA4RSwgIlNUQVRVU19GTE9BVF9ESVZJREVfQllfWkVSTyIgfSwKLSAgeyAweEMwMDAwMDhGLCAiU1RBVFVTX0ZMT0FUX0lORVhBQ1RfUkVTVUxUIiB9LAotICB7IDB4QzAwMDAwOTAsICJTVEFUVVNfRkxPQVRfSU5WQUxJRF9PUEVSQVRJT04iIH0sCi0gIHsgMHhDMDAwMDA5MSwgIlNUQVRVU19GTE9BVF9PVkVSRkxPVyIgfSwKLSAgeyAweEMwMDAwMDkyLCAiU1RBVFVTX0ZMT0FUX1NUQUNLX0NIRUNLIiB9LAotICB7IDB4QzAwMDAwOTMsICJTVEFUVVNfRkxPQVRfVU5ERVJGTE9XIiB9LAotICB7IDB4QzAwMDAwOTQsICJTVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVSTyIgfSwKLSAgeyAweEMwMDAwMDk1LCAiU1RBVFVTX0lOVEVHRVJfT1ZFUkZMT1ciIH0sCi0gIHsgMHhDMDAwMDA5NiwgIlNUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OIiB9LAotICB7IDB4QzAwMDAwOTcsICJTVEFUVVNfVE9PX01BTllfUEFHSU5HX0ZJTEVTIiB9LAotICB7IDB4QzAwMDAwOTgsICJTVEFUVVNfRklMRV9JTlZBTElEIiB9LAotICB7IDB4QzAwMDAwOTksICJTVEFUVVNfQUxMT1RURURfU1BBQ0VfRVhDRUVERUQiIH0sCi0gIHsgMHhDMDAwMDA5QSwgIlNUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIiB9LAotICB7IDB4QzAwMDAwOUIsICJTVEFUVVNfREZTX0VYSVRfUEFUSF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMDlDLCAiU1RBVFVTX0RFVklDRV9EQVRBX0VSUk9SIiB9LAotICB7IDB4QzAwMDAwOUQsICJTVEFUVVNfREVWSUNFX05PVF9DT05ORUNURUQiIH0sCi0gIHsgMHhDMDAwMDA5RSwgIlNUQVRVU19ERVZJQ0VfUE9XRVJfRkFJTFVSRSIgfSwKLSAgeyAweEMwMDAwMDlGLCAiU1RBVFVTX0ZSRUVfVk1fTk9UX0FUX0JBU0UiIH0sCi0gIHsgMHhDMDAwMDBBMCwgIlNUQVRVU19NRU1PUllfTk9UX0FMTE9DQVRFRCIgfSwKLSAgeyAweEMwMDAwMEExLCAiU1RBVFVTX1dPUktJTkdfU0VUX1FVT1RBIiB9LAotICB7IDB4QzAwMDAwQTIsICJTVEFUVVNfTUVESUFfV1JJVEVfUFJPVEVDVEVEIiB9LAotICB7IDB4QzAwMDAwQTMsICJTVEFUVVNfREVWSUNFX05PVF9SRUFEWSIgfSwKLSAgeyAweEMwMDAwMEE0LCAiU1RBVFVTX0lOVkFMSURfR1JPVVBfQVRUUklCVVRFUyIgfSwKLSAgeyAweEMwMDAwMEE1LCAiU1RBVFVTX0JBRF9JTVBFUlNPTkFUSU9OX0xFVkVMIiB9LAotICB7IDB4QzAwMDAwQTYsICJTVEFUVVNfQ0FOVF9PUEVOX0FOT05ZTU9VUyIgfSwKLSAgeyAweEMwMDAwMEE3LCAiU1RBVFVTX0JBRF9WQUxJREFUSU9OX0NMQVNTIiB9LAotICB7IDB4QzAwMDAwQTgsICJTVEFUVVNfQkFEX1RPS0VOX1RZUEUiIH0sCi0gIHsgMHhDMDAwMDBBOSwgIlNUQVRVU19CQURfTUFTVEVSX0JPT1RfUkVDT1JEIiB9LAotICB7IDB4QzAwMDAwQUEsICJTVEFUVVNfSU5TVFJVQ1RJT05fTUlTQUxJR05NRU5UIiB9LAotICB7IDB4QzAwMDAwQUIsICJTVEFUVVNfSU5TVEFOQ0VfTk9UX0FWQUlMQUJMRSIgfSwKLSAgeyAweEMwMDAwMEFDLCAiU1RBVFVTX1BJUEVfTk9UX0FWQUlMQUJMRSIgfSwKLSAgeyAweEMwMDAwMEFELCAiU1RBVFVTX0lOVkFMSURfUElQRV9TVEFURSIgfSwKLSAgeyAweEMwMDAwMEFFLCAiU1RBVFVTX1BJUEVfQlVTWSIgfSwKLSAgeyAweEMwMDAwMEFGLCAiU1RBVFVTX0lMTEVHQUxfRlVOQ1RJT04iIH0sCi0gIHsgMHhDMDAwMDBCMCwgIlNUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRCIgfSwKLSAgeyAweEMwMDAwMEIxLCAiU1RBVFVTX1BJUEVfQ0xPU0lORyIgfSwKLSAgeyAweEMwMDAwMEIyLCAiU1RBVFVTX1BJUEVfQ09OTkVDVEVEIiB9LAotICB7IDB4QzAwMDAwQjMsICJTVEFUVVNfUElQRV9MSVNURU5JTkciIH0sCi0gIHsgMHhDMDAwMDBCNCwgIlNUQVRVU19JTlZBTElEX1JFQURfTU9ERSIgfSwKLSAgeyAweEMwMDAwMEI1LCAiU1RBVFVTX0lPX1RJTUVPVVQiIH0sCi0gIHsgMHhDMDAwMDBCNiwgIlNUQVRVU19GSUxFX0ZPUkNFRF9DTE9TRUQiIH0sCi0gIHsgMHhDMDAwMDBCNywgIlNUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUQiIH0sCi0gIHsgMHhDMDAwMDBCOCwgIlNUQVRVU19QUk9GSUxJTkdfTk9UX1NUT1BQRUQiIH0sCi0gIHsgMHhDMDAwMDBCOSwgIlNUQVRVU19DT1VMRF9OT1RfSU5URVJQUkVUIiB9LAotICB7IDB4QzAwMDAwQkEsICJTVEFUVVNfRklMRV9JU19BX0RJUkVDVE9SWSIgfSwKLSAgeyAweEMwMDAwMEJCLCAiU1RBVFVTX05PVF9TVVBQT1JURUQiIH0sCi0gIHsgMHhDMDAwMDBCQywgIlNUQVRVU19SRU1PVEVfTk9UX0xJU1RFTklORyIgfSwKLSAgeyAweEMwMDAwMEJELCAiU1RBVFVTX0RVUExJQ0FURV9OQU1FIiB9LAotICB7IDB4QzAwMDAwQkUsICJTVEFUVVNfQkFEX05FVFdPUktfUEFUSCIgfSwKLSAgeyAweEMwMDAwMEJGLCAiU1RBVFVTX05FVFdPUktfQlVTWSIgfSwKLSAgeyAweEMwMDAwMEMwLCAiU1RBVFVTX0RFVklDRV9ET0VTX05PVF9FWElTVCIgfSwKLSAgeyAweEMwMDAwMEMxLCAiU1RBVFVTX1RPT19NQU5ZX0NPTU1BTkRTIiB9LAotICB7IDB4QzAwMDAwQzIsICJTVEFUVVNfQURBUFRFUl9IQVJEV0FSRV9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMEMzLCAiU1RBVFVTX0lOVkFMSURfTkVUV09SS19SRVNQT05TRSIgfSwKLSAgeyAweEMwMDAwMEM0LCAiU1RBVFVTX1VORVhQRUNURURfTkVUV09SS19FUlJPUiIgfSwKLSAgeyAweEMwMDAwMEM1LCAiU1RBVFVTX0JBRF9SRU1PVEVfQURBUFRFUiIgfSwKLSAgeyAweEMwMDAwMEM2LCAiU1RBVFVTX1BSSU5UX1FVRVVFX0ZVTEwiIH0sCi0gIHsgMHhDMDAwMDBDNywgIlNUQVRVU19OT19TUE9PTF9TUEFDRSIgfSwKLSAgeyAweEMwMDAwMEM4LCAiU1RBVFVTX1BSSU5UX0NBTkNFTExFRCIgfSwKLSAgeyAweEMwMDAwMEM5LCAiU1RBVFVTX05FVFdPUktfTkFNRV9ERUxFVEVEIiB9LAotICB7IDB4QzAwMDAwQ0EsICJTVEFUVVNfTkVUV09SS19BQ0NFU1NfREVOSUVEIiB9LAotICB7IDB4QzAwMDAwQ0IsICJTVEFUVVNfQkFEX0RFVklDRV9UWVBFIiB9LAotICB7IDB4QzAwMDAwQ0MsICJTVEFUVVNfQkFEX05FVFdPUktfTkFNRSIgfSwKLSAgeyAweEMwMDAwMENELCAiU1RBVFVTX1RPT19NQU5ZX05BTUVTIiB9LAotICB7IDB4QzAwMDAwQ0UsICJTVEFUVVNfVE9PX01BTllfU0VTU0lPTlMiIH0sCi0gIHsgMHhDMDAwMDBDRiwgIlNUQVRVU19TSEFSSU5HX1BBVVNFRCIgfSwKLSAgeyAweEMwMDAwMEQwLCAiU1RBVFVTX1JFUVVFU1RfTk9UX0FDQ0VQVEVEIiB9LAotICB7IDB4QzAwMDAwRDEsICJTVEFUVVNfUkVESVJFQ1RPUl9QQVVTRUQiIH0sCi0gIHsgMHhDMDAwMDBEMiwgIlNUQVRVU19ORVRfV1JJVEVfRkFVTFQiIH0sCi0gIHsgMHhDMDAwMDBEMywgIlNUQVRVU19QUk9GSUxJTkdfQVRfTElNSVQiIH0sCi0gIHsgMHhDMDAwMDBENCwgIlNUQVRVU19OT1RfU0FNRV9ERVZJQ0UiIH0sCi0gIHsgMHhDMDAwMDBENSwgIlNUQVRVU19GSUxFX1JFTkFNRUQiIH0sCi0gIHsgMHhDMDAwMDBENiwgIlNUQVRVU19WSVJUVUFMX0NJUkNVSVRfQ0xPU0VEIiB9LAotICB7IDB4QzAwMDAwRDcsICJTVEFUVVNfTk9fU0VDVVJJVFlfT05fT0JKRUNUIiB9LAotICB7IDB4QzAwMDAwRDgsICJTVEFUVVNfQ0FOVF9XQUlUIiB9LAotICB7IDB4QzAwMDAwRDksICJTVEFUVVNfUElQRV9FTVBUWSIgfSwKLSAgeyAweEMwMDAwMERBLCAiU1RBVFVTX0NBTlRfQUNDRVNTX0RPTUFJTl9JTkZPIiB9LAotICB7IDB4QzAwMDAwREIsICJTVEFUVVNfQ0FOVF9URVJNSU5BVEVfU0VMRiIgfSwKLSAgeyAweEMwMDAwMERDLCAiU1RBVFVTX0lOVkFMSURfU0VSVkVSX1NUQVRFIiB9LAotICB7IDB4QzAwMDAwREQsICJTVEFUVVNfSU5WQUxJRF9ET01BSU5fU1RBVEUiIH0sCi0gIHsgMHhDMDAwMDBERSwgIlNUQVRVU19JTlZBTElEX0RPTUFJTl9ST0xFIiB9LAotICB7IDB4QzAwMDAwREYsICJTVEFUVVNfTk9fU1VDSF9ET01BSU4iIH0sCi0gIHsgMHhDMDAwMDBFMCwgIlNUQVRVU19ET01BSU5fRVhJU1RTIiB9LAotICB7IDB4QzAwMDAwRTEsICJTVEFUVVNfRE9NQUlOX0xJTUlUX0VYQ0VFREVEIiB9LAotICB7IDB4QzAwMDAwRTIsICJTVEFUVVNfT1BMT0NLX05PVF9HUkFOVEVEIiB9LAotICB7IDB4QzAwMDAwRTMsICJTVEFUVVNfSU5WQUxJRF9PUExPQ0tfUFJPVE9DT0wiIH0sCi0gIHsgMHhDMDAwMDBFNCwgIlNUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OIiB9LAotICB7IDB4QzAwMDAwRTUsICJTVEFUVVNfSU5URVJOQUxfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDBFNiwgIlNUQVRVU19HRU5FUklDX05PVF9NQVBQRUQiIH0sCi0gIHsgMHhDMDAwMDBFNywgIlNUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVQiIH0sCi0gIHsgMHhDMDAwMDBFOCwgIlNUQVRVU19JTlZBTElEX1VTRVJfQlVGRkVSIiB9LAotICB7IDB4QzAwMDAwRTksICJTVEFUVVNfVU5FWFBFQ1RFRF9JT19FUlJPUiIgfSwKLSAgeyAweEMwMDAwMEVBLCAiU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUiIgfSwKLSAgeyAweEMwMDAwMEVCLCAiU1RBVFVTX1VORVhQRUNURURfTU1fTUFQX0VSUk9SIiB9LAotICB7IDB4QzAwMDAwRUMsICJTVEFUVVNfVU5FWFBFQ1RFRF9NTV9FWFRFTkRfRVJSIiB9LAotICB7IDB4QzAwMDAwRUQsICJTVEFUVVNfTk9UX0xPR09OX1BST0NFU1MiIH0sCi0gIHsgMHhDMDAwMDBFRSwgIlNUQVRVU19MT0dPTl9TRVNTSU9OX0VYSVNUUyIgfSwKLSAgeyAweEMwMDAwMEVGLCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzEiIH0sCi0gIHsgMHhDMDAwMDBGMCwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8yIiB9LAotICB7IDB4QzAwMDAwRjEsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMyIgfSwKLSAgeyAweEMwMDAwMEYyLCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzQiIH0sCi0gIHsgMHhDMDAwMDBGMywgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl81IiB9LAotICB7IDB4QzAwMDAwRjQsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNiIgfSwKLSAgeyAweEMwMDAwMEY1LCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzciIH0sCi0gIHsgMHhDMDAwMDBGNiwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl84IiB9LAotICB7IDB4QzAwMDAwRjcsICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfOSIgfSwKLSAgeyAweEMwMDAwMEY4LCAiU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzEwIiB9LAotICB7IDB4QzAwMDAwRjksICJTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTEiIH0sCi0gIHsgMHhDMDAwMDBGQSwgIlNUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMiIgfSwKLSAgeyAweEMwMDAwMEZCLCAiU1RBVFVTX1JFRElSRUNUT1JfTk9UX1NUQVJURUQiIH0sCi0gIHsgMHhDMDAwMDBGQywgIlNUQVRVU19SRURJUkVDVE9SX1NUQVJURUQiIH0sCi0gIHsgMHhDMDAwMDBGRCwgIlNUQVRVU19TVEFDS19PVkVSRkxPVyIgfSwKLSAgeyAweEMwMDAwMEZFLCAiU1RBVFVTX05PX1NVQ0hfUEFDS0FHRSIgfSwKLSAgeyAweEMwMDAwMEZGLCAiU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRSIgfSwKLSAgeyAweEMwMDAwMTAwLCAiU1RBVFVTX1ZBUklBQkxFX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMTAxLCAiU1RBVFVTX0RJUkVDVE9SWV9OT1RfRU1QVFkiIH0sCi0gIHsgMHhDMDAwMDEwMiwgIlNUQVRVU19GSUxFX0NPUlJVUFRfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDEwMywgIlNUQVRVU19OT1RfQV9ESVJFQ1RPUlkiIH0sCi0gIHsgMHhDMDAwMDEwNCwgIlNUQVRVU19CQURfTE9HT05fU0VTU0lPTl9TVEFURSIgfSwKLSAgeyAweEMwMDAwMTA1LCAiU1RBVFVTX0xPR09OX1NFU1NJT05fQ09MTElTSU9OIiB9LAotICB7IDB4QzAwMDAxMDYsICJTVEFUVVNfTkFNRV9UT09fTE9ORyIgfSwKLSAgeyAweEMwMDAwMTA3LCAiU1RBVFVTX0ZJTEVTX09QRU4iIH0sCi0gIHsgMHhDMDAwMDEwOCwgIlNUQVRVU19DT05ORUNUSU9OX0lOX1VTRSIgfSwKLSAgeyAweEMwMDAwMTA5LCAiU1RBVFVTX01FU1NBR0VfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAxMEEsICJTVEFUVVNfUFJPQ0VTU19JU19URVJNSU5BVElORyIgfSwKLSAgeyAweEMwMDAwMTBCLCAiU1RBVFVTX0lOVkFMSURfTE9HT05fVFlQRSIgfSwKLSAgeyAweEMwMDAwMTBDLCAiU1RBVFVTX05PX0dVSURfVFJBTlNMQVRJT04iIH0sCi0gIHsgMHhDMDAwMDEwRCwgIlNUQVRVU19DQU5OT1RfSU1QRVJTT05BVEUiIH0sCi0gIHsgMHhDMDAwMDEwRSwgIlNUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRCIgfSwKLSAgeyAweEMwMDAwMTBGLCAiU1RBVFVTX0FCSU9TX05PVF9QUkVTRU5UIiB9LAotICB7IDB4QzAwMDAxMTAsICJTVEFUVVNfQUJJT1NfTElEX05PVF9FWElTVCIgfSwKLSAgeyAweEMwMDAwMTExLCAiU1RBVFVTX0FCSU9TX0xJRF9BTFJFQURZX09XTkVEIiB9LAotICB7IDB4QzAwMDAxMTIsICJTVEFUVVNfQUJJT1NfTk9UX0xJRF9PV05FUiIgfSwKLSAgeyAweEMwMDAwMTEzLCAiU1RBVFVTX0FCSU9TX0lOVkFMSURfQ09NTUFORCIgfSwKLSAgeyAweEMwMDAwMTE0LCAiU1RBVFVTX0FCSU9TX0lOVkFMSURfTElEIiB9LAotICB7IDB4QzAwMDAxMTUsICJTVEFUVVNfQUJJT1NfU0VMRUNUT1JfTk9UX0FWQUlMQUJMRSIgfSwKLSAgeyAweEMwMDAwMTE2LCAiU1RBVFVTX0FCSU9TX0lOVkFMSURfU0VMRUNUT1IiIH0sCi0gIHsgMHhDMDAwMDExNywgIlNUQVRVU19OT19MRFQiIH0sCi0gIHsgMHhDMDAwMDExOCwgIlNUQVRVU19JTlZBTElEX0xEVF9TSVpFIiB9LAotICB7IDB4QzAwMDAxMTksICJTVEFUVVNfSU5WQUxJRF9MRFRfT0ZGU0VUIiB9LAotICB7IDB4QzAwMDAxMUEsICJTVEFUVVNfSU5WQUxJRF9MRFRfREVTQ1JJUFRPUiIgfSwKLSAgeyAweEMwMDAwMTFCLCAiU1RBVFVTX0lOVkFMSURfSU1BR0VfTkVfRk9STUFUIiB9LAotICB7IDB4QzAwMDAxMUMsICJTVEFUVVNfUlhBQ1RfSU5WQUxJRF9TVEFURSIgfSwKLSAgeyAweEMwMDAwMTFELCAiU1RBVFVTX1JYQUNUX0NPTU1JVF9GQUlMVVJFIiB9LAotICB7IDB4QzAwMDAxMUUsICJTVEFUVVNfTUFQUEVEX0ZJTEVfU0laRV9aRVJPIiB9LAotICB7IDB4QzAwMDAxMUYsICJTVEFUVVNfVE9PX01BTllfT1BFTkVEX0ZJTEVTIiB9LAotICB7IDB4QzAwMDAxMjAsICJTVEFUVVNfQ0FOQ0VMTEVEIiB9LAotICB7IDB4QzAwMDAxMjEsICJTVEFUVVNfQ0FOTk9UX0RFTEVURSIgfSwKLSAgeyAweEMwMDAwMTIyLCAiU1RBVFVTX0lOVkFMSURfQ09NUFVURVJfTkFNRSIgfSwKLSAgeyAweEMwMDAwMTIzLCAiU1RBVFVTX0ZJTEVfREVMRVRFRCIgfSwKLSAgeyAweEMwMDAwMTI0LCAiU1RBVFVTX1NQRUNJQUxfQUNDT1VOVCIgfSwKLSAgeyAweEMwMDAwMTI1LCAiU1RBVFVTX1NQRUNJQUxfR1JPVVAiIH0sCi0gIHsgMHhDMDAwMDEyNiwgIlNUQVRVU19TUEVDSUFMX1VTRVIiIH0sCi0gIHsgMHhDMDAwMDEyNywgIlNUQVRVU19NRU1CRVJTX1BSSU1BUllfR1JPVVAiIH0sCi0gIHsgMHhDMDAwMDEyOCwgIlNUQVRVU19GSUxFX0NMT1NFRCIgfSwKLSAgeyAweEMwMDAwMTI5LCAiU1RBVFVTX1RPT19NQU5ZX1RIUkVBRFMiIH0sCi0gIHsgMHhDMDAwMDEyQSwgIlNUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1MiIH0sCi0gIHsgMHhDMDAwMDEyQiwgIlNUQVRVU19UT0tFTl9BTFJFQURZX0lOX1VTRSIgfSwKLSAgeyAweEMwMDAwMTJDLCAiU1RBVFVTX1BBR0VGSUxFX1FVT1RBX0VYQ0VFREVEIiB9LAotICB7IDB4QzAwMDAxMkQsICJTVEFUVVNfQ09NTUlUTUVOVF9MSU1JVCIgfSwKLSAgeyAweEMwMDAwMTJFLCAiU1RBVFVTX0lOVkFMSURfSU1BR0VfTEVfRk9STUFUIiB9LAotICB7IDB4QzAwMDAxMkYsICJTVEFUVVNfSU5WQUxJRF9JTUFHRV9OT1RfTVoiIH0sCi0gIHsgMHhDMDAwMDEzMCwgIlNUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1QiIH0sCi0gIHsgMHhDMDAwMDEzMSwgIlNUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNiIgfSwKLSAgeyAweEMwMDAwMTMyLCAiU1RBVFVTX0xPR09OX1NFUlZFUl9DT05GTElDVCIgfSwKLSAgeyAweEMwMDAwMTMzLCAiU1RBVFVTX1RJTUVfRElGRkVSRU5DRV9BVF9EQyIgfSwKLSAgeyAweEMwMDAwMTM0LCAiU1RBVFVTX1NZTkNIUk9OSVpBVElPTl9SRVFVSVJFRCIgfSwKLSAgeyAweEMwMDAwMTM1LCAiU1RBVFVTX0RMTF9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDEzNiwgIlNUQVRVU19PUEVOX0ZBSUxFRCIgfSwKLSAgeyAweEMwMDAwMTM3LCAiU1RBVFVTX0lPX1BSSVZJTEVHRV9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDEzOCwgIlNUQVRVU19PUkRJTkFMX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMTM5LCAiU1RBVFVTX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAxM0EsICJTVEFUVVNfQ09OVFJPTF9DX0VYSVQiIH0sCi0gIHsgMHhDMDAwMDEzQiwgIlNUQVRVU19MT0NBTF9ESVNDT05ORUNUIiB9LAotICB7IDB4QzAwMDAxM0MsICJTVEFUVVNfUkVNT1RFX0RJU0NPTk5FQ1QiIH0sCi0gIHsgMHhDMDAwMDEzRCwgIlNUQVRVU19SRU1PVEVfUkVTT1VSQ0VTIiB9LAotICB7IDB4QzAwMDAxM0UsICJTVEFUVVNfTElOS19GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDEzRiwgIlNUQVRVU19MSU5LX1RJTUVPVVQiIH0sCi0gIHsgMHhDMDAwMDE0MCwgIlNUQVRVU19JTlZBTElEX0NPTk5FQ1RJT04iIH0sCi0gIHsgMHhDMDAwMDE0MSwgIlNUQVRVU19JTlZBTElEX0FERFJFU1MiIH0sCi0gIHsgMHhDMDAwMDE0MiwgIlNUQVRVU19ETExfSU5JVF9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDE0MywgIlNUQVRVU19NSVNTSU5HX1NZU1RFTUZJTEUiIH0sCi0gIHsgMHhDMDAwMDE0NCwgIlNUQVRVU19VTkhBTkRMRURfRVhDRVBUSU9OIiB9LAotICB7IDB4QzAwMDAxNDUsICJTVEFUVVNfQVBQX0lOSVRfRkFJTFVSRSIgfSwKLSAgeyAweEMwMDAwMTQ2LCAiU1RBVFVTX1BBR0VGSUxFX0NSRUFURV9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDE0NywgIlNUQVRVU19OT19QQUdFRklMRSIgfSwKLSAgeyAweEMwMDAwMTQ4LCAiU1RBVFVTX0lOVkFMSURfTEVWRUwiIH0sCi0gIHsgMHhDMDAwMDE0OSwgIlNUQVRVU19XUk9OR19QQVNTV09SRF9DT1JFIiB9LAotICB7IDB4QzAwMDAxNEEsICJTVEFUVVNfSUxMRUdBTF9GTE9BVF9DT05URVhUIiB9LAotICB7IDB4QzAwMDAxNEIsICJTVEFUVVNfUElQRV9CUk9LRU4iIH0sCi0gIHsgMHhDMDAwMDE0QywgIlNUQVRVU19SRUdJU1RSWV9DT1JSVVBUIiB9LAotICB7IDB4QzAwMDAxNEQsICJTVEFUVVNfUkVHSVNUUllfSU9fRkFJTEVEIiB9LAotICB7IDB4QzAwMDAxNEUsICJTVEFUVVNfTk9fRVZFTlRfUEFJUiIgfSwKLSAgeyAweEMwMDAwMTRGLCAiU1RBVFVTX1VOUkVDT0dOSVpFRF9WT0xVTUUiIH0sCi0gIHsgMHhDMDAwMDE1MCwgIlNUQVRVU19TRVJJQUxfTk9fREVWSUNFX0lOSVRFRCIgfSwKLSAgeyAweEMwMDAwMTUxLCAiU1RBVFVTX05PX1NVQ0hfQUxJQVMiIH0sCi0gIHsgMHhDMDAwMDE1MiwgIlNUQVRVU19NRU1CRVJfTk9UX0lOX0FMSUFTIiB9LAotICB7IDB4QzAwMDAxNTMsICJTVEFUVVNfTUVNQkVSX0lOX0FMSUFTIiB9LAotICB7IDB4QzAwMDAxNTQsICJTVEFUVVNfQUxJQVNfRVhJU1RTIiB9LAotICB7IDB4QzAwMDAxNTUsICJTVEFUVVNfTE9HT05fTk9UX0dSQU5URUQiIH0sCi0gIHsgMHhDMDAwMDE1NiwgIlNUQVRVU19UT09fTUFOWV9TRUNSRVRTIiB9LAotICB7IDB4QzAwMDAxNTcsICJTVEFUVVNfU0VDUkVUX1RPT19MT05HIiB9LAotICB7IDB4QzAwMDAxNTgsICJTVEFUVVNfSU5URVJOQUxfREJfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDE1OSwgIlNUQVRVU19GVUxMU0NSRUVOX01PREUiIH0sCi0gIHsgMHhDMDAwMDE1QSwgIlNUQVRVU19UT09fTUFOWV9DT05URVhUX0lEUyIgfSwKLSAgeyAweEMwMDAwMTVCLCAiU1RBVFVTX0xPR09OX1RZUEVfTk9UX0dSQU5URUQiIH0sCi0gIHsgMHhDMDAwMDE1QywgIlNUQVRVU19OT1RfUkVHSVNUUllfRklMRSIgfSwKLSAgeyAweEMwMDAwMTVELCAiU1RBVFVTX05UX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUQiIH0sCi0gIHsgMHhDMDAwMDE1RSwgIlNUQVRVU19ET01BSU5fQ1RSTFJfQ09ORklHX0VSUk9SIiB9LAotICB7IDB4QzAwMDAxNUYsICJTVEFUVVNfRlRfTUlTU0lOR19NRU1CRVIiIH0sCi0gIHsgMHhDMDAwMDE2MCwgIlNUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUlkiIH0sCi0gIHsgMHhDMDAwMDE2MSwgIlNUQVRVU19JTExFR0FMX0NIQVJBQ1RFUiIgfSwKLSAgeyAweEMwMDAwMTYyLCAiU1RBVFVTX1VOTUFQUEFCTEVfQ0hBUkFDVEVSIiB9LAotICB7IDB4QzAwMDAxNjMsICJTVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUiIgfSwKLSAgeyAweEMwMDAwMTY0LCAiU1RBVFVTX0ZMT1BQWV9WT0xVTUUiIH0sCi0gIHsgMHhDMDAwMDE2NSwgIlNUQVRVU19GTE9QUFlfSURfTUFSS19OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDE2NiwgIlNUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVIiIH0sCi0gIHsgMHhDMDAwMDE2NywgIlNUQVRVU19GTE9QUFlfVU5LTk9XTl9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMTY4LCAiU1RBVFVTX0ZMT1BQWV9CQURfUkVHSVNURVJTIiB9LAotICB7IDB4QzAwMDAxNjksICJTVEFUVVNfRElTS19SRUNBTElCUkFURV9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDE2QSwgIlNUQVRVU19ESVNLX09QRVJBVElPTl9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDE2QiwgIlNUQVRVU19ESVNLX1JFU0VUX0ZBSUxFRCIgfSwKLSAgeyAweEMwMDAwMTZDLCAiU1RBVFVTX1NIQVJFRF9JUlFfQlVTWSIgfSwKLSAgeyAweEMwMDAwMTZELCAiU1RBVFVTX0ZUX09SUEhBTklORyIgfSwKLSAgeyAweEMwMDAwMTZFLCAiU1RBVFVTX0JJT1NfRkFJTEVEX1RPX0NPTk5FQ1RfSU5URVJSVVBUIiB9LAotICB7IDB4QzAwMDAxNzIsICJTVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkUiIH0sCi0gIHsgMHhDMDAwMDE3MywgIlNUQVRVU19JTlZBTElEX0JMT0NLX0xFTkdUSCIgfSwKLSAgeyAweEMwMDAwMTc0LCAiU1RBVFVTX0RFVklDRV9OT1RfUEFSVElUSU9ORUQiIH0sCi0gIHsgMHhDMDAwMDE3NSwgIlNUQVRVU19VTkFCTEVfVE9fTE9DS19NRURJQSIgfSwKLSAgeyAweEMwMDAwMTc2LCAiU1RBVFVTX1VOQUJMRV9UT19VTkxPQURfTUVESUEiIH0sCi0gIHsgMHhDMDAwMDE3NywgIlNUQVRVU19FT01fT1ZFUkZMT1ciIH0sCi0gIHsgMHhDMDAwMDE3OCwgIlNUQVRVU19OT19NRURJQSIgfSwKLSAgeyAweEMwMDAwMTdBLCAiU1RBVFVTX05PX1NVQ0hfTUVNQkVSIiB9LAotICB7IDB4QzAwMDAxN0IsICJTVEFUVVNfSU5WQUxJRF9NRU1CRVIiIH0sCi0gIHsgMHhDMDAwMDE3QywgIlNUQVRVU19LRVlfREVMRVRFRCIgfSwKLSAgeyAweEMwMDAwMTdELCAiU1RBVFVTX05PX0xPR19TUEFDRSIgfSwKLSAgeyAweEMwMDAwMTdFLCAiU1RBVFVTX1RPT19NQU5ZX1NJRFMiIH0sCi0gIHsgMHhDMDAwMDE3RiwgIlNUQVRVU19MTV9DUk9TU19FTkNSWVBUSU9OX1JFUVVJUkVEIiB9LAotICB7IDB4QzAwMDAxODAsICJTVEFUVVNfS0VZX0hBU19DSElMRFJFTiIgfSwKLSAgeyAweEMwMDAwMTgxLCAiU1RBVFVTX0NISUxEX01VU1RfQkVfVk9MQVRJTEUiIH0sCi0gIHsgMHhDMDAwMDE4MiwgIlNUQVRVU19ERVZJQ0VfQ09ORklHVVJBVElPTl9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMTgzLCAiU1RBVFVTX0RSSVZFUl9JTlRFUk5BTF9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMTg0LCAiU1RBVFVTX0lOVkFMSURfREVWSUNFX1NUQVRFIiB9LAotICB7IDB4QzAwMDAxODUsICJTVEFUVVNfSU9fREVWSUNFX0VSUk9SIiB9LAotICB7IDB4QzAwMDAxODYsICJTVEFUVVNfREVWSUNFX1BST1RPQ09MX0VSUk9SIiB9LAotICB7IDB4QzAwMDAxODcsICJTVEFUVVNfQkFDS1VQX0NPTlRST0xMRVIiIH0sCi0gIHsgMHhDMDAwMDE4OCwgIlNUQVRVU19MT0dfRklMRV9GVUxMIiB9LAotICB7IDB4QzAwMDAxODksICJTVEFUVVNfVE9PX0xBVEUiIH0sCi0gIHsgMHhDMDAwMDE4QSwgIlNUQVRVU19OT19UUlVTVF9MU0FfU0VDUkVUIiB9LAotICB7IDB4QzAwMDAxOEIsICJTVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlQiIH0sCi0gIHsgMHhDMDAwMDE4QywgIlNUQVRVU19UUlVTVEVEX0RPTUFJTl9GQUlMVVJFIiB9LAotICB7IDB4QzAwMDAxOEQsICJTVEFUVVNfVFJVU1RFRF9SRUxBVElPTlNISVBfRkFJTFVSRSIgfSwKLSAgeyAweEMwMDAwMThFLCAiU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ09SUlVQVCIgfSwKLSAgeyAweEMwMDAwMThGLCAiU1RBVFVTX0VWRU5UTE9HX0NBTlRfU1RBUlQiIH0sCi0gIHsgMHhDMDAwMDE5MCwgIlNUQVRVU19UUlVTVF9GQUlMVVJFIiB9LAotICB7IDB4QzAwMDAxOTEsICJTVEFUVVNfTVVUQU5UX0xJTUlUX0VYQ0VFREVEIiB9LAotICB7IDB4QzAwMDAxOTIsICJTVEFUVVNfTkVUTE9HT05fTk9UX1NUQVJURUQiIH0sCi0gIHsgMHhDMDAwMDE5MywgIlNUQVRVU19BQ0NPVU5UX0VYUElSRUQiIH0sCi0gIHsgMHhDMDAwMDE5NCwgIlNUQVRVU19QT1NTSUJMRV9ERUFETE9DSyIgfSwKLSAgeyAweEMwMDAwMTk1LCAiU1RBVFVTX05FVFdPUktfQ1JFREVOVElBTF9DT05GTElDVCIgfSwKLSAgeyAweEMwMDAwMTk2LCAiU1RBVFVTX1JFTU9URV9TRVNTSU9OX0xJTUlUIiB9LAotICB7IDB4QzAwMDAxOTcsICJTVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEIiB9LAotICB7IDB4QzAwMDAxOTgsICJTVEFUVVNfTk9MT0dPTl9JTlRFUkRPTUFJTl9UUlVTVF9BQ0NPVU5UIiB9LAotICB7IDB4QzAwMDAxOTksICJTVEFUVVNfTk9MT0dPTl9XT1JLU1RBVElPTl9UUlVTVF9BQ0NPVU5UIiB9LAotICB7IDB4QzAwMDAxOUEsICJTVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVCIgfSwKLSAgeyAweEMwMDAwMTlCLCAiU1RBVFVTX0RPTUFJTl9UUlVTVF9JTkNPTlNJU1RFTlQiIH0sCi0gIHsgMHhDMDAwMDE5QywgIlNUQVRVU19GU19EUklWRVJfUkVRVUlSRUQiIH0sCi0gIHsgMHhDMDAwMDIwMiwgIlNUQVRVU19OT19VU0VSX1NFU1NJT05fS0VZIiB9LAotICB7IDB4QzAwMDAyMDMsICJTVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUQiIH0sCi0gIHsgMHhDMDAwMDIwNCwgIlNUQVRVU19SRVNPVVJDRV9MQU5HX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMjA1LCAiU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTIiB9LAotICB7IDB4QzAwMDAyMDYsICJTVEFUVVNfSU5WQUxJRF9CVUZGRVJfU0laRSIgfSwKLSAgeyAweEMwMDAwMjA3LCAiU1RBVFVTX0lOVkFMSURfQUREUkVTU19DT01QT05FTlQiIH0sCi0gIHsgMHhDMDAwMDIwOCwgIlNUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkQiIH0sCi0gIHsgMHhDMDAwMDIwOSwgIlNUQVRVU19UT09fTUFOWV9BRERSRVNTRVMiIH0sCi0gIHsgMHhDMDAwMDIwQSwgIlNUQVRVU19BRERSRVNTX0FMUkVBRFlfRVhJU1RTIiB9LAotICB7IDB4QzAwMDAyMEIsICJTVEFUVVNfQUREUkVTU19DTE9TRUQiIH0sCi0gIHsgMHhDMDAwMDIwQywgIlNUQVRVU19DT05ORUNUSU9OX0RJU0NPTk5FQ1RFRCIgfSwKLSAgeyAweEMwMDAwMjBELCAiU1RBVFVTX0NPTk5FQ1RJT05fUkVTRVQiIH0sCi0gIHsgMHhDMDAwMDIwRSwgIlNUQVRVU19UT09fTUFOWV9OT0RFUyIgfSwKLSAgeyAweEMwMDAwMjBGLCAiU1RBVFVTX1RSQU5TQUNUSU9OX0FCT1JURUQiIH0sCi0gIHsgMHhDMDAwMDIxMCwgIlNUQVRVU19UUkFOU0FDVElPTl9USU1FRF9PVVQiIH0sCi0gIHsgMHhDMDAwMDIxMSwgIlNUQVRVU19UUkFOU0FDVElPTl9OT19SRUxFQVNFIiB9LAotICB7IDB4QzAwMDAyMTIsICJTVEFUVVNfVFJBTlNBQ1RJT05fTk9fTUFUQ0giIH0sCi0gIHsgMHhDMDAwMDIxMywgIlNUQVRVU19UUkFOU0FDVElPTl9SRVNQT05ERUQiIH0sCi0gIHsgMHhDMDAwMDIxNCwgIlNUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX0lEIiB9LAotICB7IDB4QzAwMDAyMTUsICJTVEFUVVNfVFJBTlNBQ1RJT05fSU5WQUxJRF9UWVBFIiB9LAotICB7IDB4QzAwMDAyMTYsICJTVEFUVVNfTk9UX1NFUlZFUl9TRVNTSU9OIiB9LAotICB7IDB4QzAwMDAyMTcsICJTVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OIiB9LAotICB7IDB4QzAwMDAyMTgsICJTVEFUVVNfQ0FOTk9UX0xPQURfUkVHSVNUUllfRklMRSIgfSwKLSAgeyAweEMwMDAwMjE5LCAiU1RBVFVTX0RFQlVHX0FUVEFDSF9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDIxQSwgIlNUQVRVU19TWVNURU1fUFJPQ0VTU19URVJNSU5BVEVEIiB9LAotICB7IDB4QzAwMDAyMUIsICJTVEFUVVNfREFUQV9OT1RfQUNDRVBURUQiIH0sCi0gIHsgMHhDMDAwMDIxQywgIlNUQVRVU19OT19CUk9XU0VSX1NFUlZFUlNfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDIxRCwgIlNUQVRVU19WRE1fSEFSRF9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMjFFLCAiU1RBVFVTX0RSSVZFUl9DQU5DRUxfVElNRU9VVCIgfSwKLSAgeyAweEMwMDAwMjFGLCAiU1RBVFVTX1JFUExZX01FU1NBR0VfTUlTTUFUQ0giIH0sCi0gIHsgMHhDMDAwMDIyMCwgIlNUQVRVU19NQVBQRURfQUxJR05NRU5UIiB9LAotICB7IDB4QzAwMDAyMjEsICJTVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0giIH0sCi0gIHsgMHhDMDAwMDIyMiwgIlNUQVRVU19MT1NUX1dSSVRFQkVISU5EX0RBVEEiIH0sCi0gIHsgMHhDMDAwMDIyMywgIlNUQVRVU19DTElFTlRfU0VSVkVSX1BBUkFNRVRFUlNfSU5WQUxJRCIgfSwKLSAgeyAweEMwMDAwMjI0LCAiU1RBVFVTX1BBU1NXT1JEX01VU1RfQ0hBTkdFIiB9LAotICB7IDB4QzAwMDAyMjUsICJTVEFUVVNfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAyMjYsICJTVEFUVVNfTk9UX1RJTllfU1RSRUFNIiB9LAotICB7IDB4QzAwMDAyMjcsICJTVEFUVVNfUkVDT1ZFUllfRkFJTFVSRSIgfSwKLSAgeyAweEMwMDAwMjI4LCAiU1RBVFVTX1NUQUNLX09WRVJGTE9XX1JFQUQiIH0sCi0gIHsgMHhDMDAwMDIyOSwgIlNUQVRVU19GQUlMX0NIRUNLIiB9LAotICB7IDB4QzAwMDAyMkEsICJTVEFUVVNfRFVQTElDQVRFX09CSkVDVElEIiB9LAotICB7IDB4QzAwMDAyMkIsICJTVEFUVVNfT0JKRUNUSURfRVhJU1RTIiB9LAotICB7IDB4QzAwMDAyMkMsICJTVEFUVVNfQ09OVkVSVF9UT19MQVJHRSIgfSwKLSAgeyAweEMwMDAwMjJELCAiU1RBVFVTX1JFVFJZIiB9LAotICB7IDB4QzAwMDAyMkUsICJTVEFUVVNfRk9VTkRfT1VUX09GX1NDT1BFIiB9LAotICB7IDB4QzAwMDAyMkYsICJTVEFUVVNfQUxMT0NBVEVfQlVDS0VUIiB9LAotICB7IDB4QzAwMDAyMzAsICJTVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDIzMSwgIlNUQVRVU19NQVJTSEFMTF9PVkVSRkxPVyIgfSwKLSAgeyAweEMwMDAwMjMyLCAiU1RBVFVTX0lOVkFMSURfVkFSSUFOVCIgfSwKLSAgeyAweEMwMDAwMjMzLCAiU1RBVFVTX0RPTUFJTl9DT05UUk9MTEVSX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDAwMjM0LCAiU1RBVFVTX0FDQ09VTlRfTE9DS0VEX09VVCIgfSwKLSAgeyAweEMwMDAwMjM1LCAiU1RBVFVTX0hBTkRMRV9OT1RfQ0xPU0FCTEUiIH0sCi0gIHsgMHhDMDAwMDIzNiwgIlNUQVRVU19DT05ORUNUSU9OX1JFRlVTRUQiIH0sCi0gIHsgMHhDMDAwMDIzNywgIlNUQVRVU19HUkFDRUZVTF9ESVNDT05ORUNUIiB9LAotICB7IDB4QzAwMDAyMzgsICJTVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUQiIH0sCi0gIHsgMHhDMDAwMDIzOSwgIlNUQVRVU19BRERSRVNTX05PVF9BU1NPQ0lBVEVEIiB9LAotICB7IDB4QzAwMDAyM0EsICJTVEFUVVNfQ09OTkVDVElPTl9JTlZBTElEIiB9LAotICB7IDB4QzAwMDAyM0IsICJTVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkUiIH0sCi0gIHsgMHhDMDAwMDIzQywgIlNUQVRVU19ORVRXT1JLX1VOUkVBQ0hBQkxFIiB9LAotICB7IDB4QzAwMDAyM0QsICJTVEFUVVNfSE9TVF9VTlJFQUNIQUJMRSIgfSwKLSAgeyAweEMwMDAwMjNFLCAiU1RBVFVTX1BST1RPQ09MX1VOUkVBQ0hBQkxFIiB9LAotICB7IDB4QzAwMDAyM0YsICJTVEFUVVNfUE9SVF9VTlJFQUNIQUJMRSIgfSwKLSAgeyAweEMwMDAwMjQwLCAiU1RBVFVTX1JFUVVFU1RfQUJPUlRFRCIgfSwKLSAgeyAweEMwMDAwMjQxLCAiU1RBVFVTX0NPTk5FQ1RJT05fQUJPUlRFRCIgfSwKLSAgeyAweEMwMDAwMjQyLCAiU1RBVFVTX0JBRF9DT01QUkVTU0lPTl9CVUZGRVIiIH0sCi0gIHsgMHhDMDAwMDI0MywgIlNUQVRVU19VU0VSX01BUFBFRF9GSUxFIiB9LAotICB7IDB4QzAwMDAyNDQsICJTVEFUVVNfQVVESVRfRkFJTEVEIiB9LAotICB7IDB4QzAwMDAyNDUsICJTVEFUVVNfVElNRVJfUkVTT0xVVElPTl9OT1RfU0VUIiB9LAotICB7IDB4QzAwMDAyNDYsICJTVEFUVVNfQ09OTkVDVElPTl9DT1VOVF9MSU1JVCIgfSwKLSAgeyAweEMwMDAwMjQ3LCAiU1RBVFVTX0xPR0lOX1RJTUVfUkVTVFJJQ1RJT04iIH0sCi0gIHsgMHhDMDAwMDI0OCwgIlNUQVRVU19MT0dJTl9XS1NUQV9SRVNUUklDVElPTiIgfSwKLSAgeyAweEMwMDAwMjQ5LCAiU1RBVFVTX0lNQUdFX01QX1VQX01JU01BVENIIiB9LAotICB7IDB4QzAwMDAyNTAsICJTVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk8iIH0sCi0gIHsgMHhDMDAwMDI1MSwgIlNUQVRVU19CQURfRExMX0VOVFJZUE9JTlQiIH0sCi0gIHsgMHhDMDAwMDI1MiwgIlNUQVRVU19CQURfU0VSVklDRV9FTlRSWVBPSU5UIiB9LAotICB7IDB4QzAwMDAyNTMsICJTVEFUVVNfTFBDX1JFUExZX0xPU1QiIH0sCi0gIHsgMHhDMDAwMDI1NCwgIlNUQVRVU19JUF9BRERSRVNTX0NPTkZMSUNUMSIgfSwKLSAgeyAweEMwMDAwMjU1LCAiU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QyIiB9LAotICB7IDB4QzAwMDAyNTYsICJTVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVQiIH0sCi0gIHsgMHhDMDAwMDI1NywgIlNUQVRVU19QQVRIX05PVF9DT1ZFUkVEIiB9LAotICB7IDB4QzAwMDAyNTgsICJTVEFUVVNfTk9fQ0FMTEJBQ0tfQUNUSVZFIiB9LAotICB7IDB4QzAwMDAyNTksICJTVEFUVVNfTElDRU5TRV9RVU9UQV9FWENFRURFRCIgfSwKLSAgeyAweEMwMDAwMjVBLCAiU1RBVFVTX1BXRF9UT09fU0hPUlQiIH0sCi0gIHsgMHhDMDAwMDI1QiwgIlNUQVRVU19QV0RfVE9PX1JFQ0VOVCIgfSwKLSAgeyAweEMwMDAwMjVDLCAiU1RBVFVTX1BXRF9ISVNUT1JZX0NPTkZMSUNUIiB9LAotICB7IDB4QzAwMDAyNUUsICJTVEFUVVNfUExVR1BMQVlfTk9fREVWSUNFIiB9LAotICB7IDB4QzAwMDAyNUYsICJTVEFUVVNfVU5TVVBQT1JURURfQ09NUFJFU1NJT04iIH0sCi0gIHsgMHhDMDAwMDI2MCwgIlNUQVRVU19JTlZBTElEX0hXX1BST0ZJTEUiIH0sCi0gIHsgMHhDMDAwMDI2MSwgIlNUQVRVU19JTlZBTElEX1BMVUdQTEFZX0RFVklDRV9QQVRIIiB9LAotICB7IDB4QzAwMDAyNjIsICJTVEFUVVNfRFJJVkVSX09SRElOQUxfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAyNjMsICJTVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAyNjQsICJTVEFUVVNfUkVTT1VSQ0VfTk9UX09XTkVEIiB9LAotICB7IDB4QzAwMDAyNjUsICJTVEFUVVNfVE9PX01BTllfTElOS1MiIH0sCi0gIHsgMHhDMDAwMDI2NiwgIlNUQVRVU19RVU9UQV9MSVNUX0lOQ09OU0lTVEVOVCIgfSwKLSAgeyAweEMwMDAwMjY3LCAiU1RBVFVTX0ZJTEVfSVNfT0ZGTElORSIgfSwKLSAgeyAweEMwMDAwMjY4LCAiU1RBVFVTX0VWQUxVQVRJT05fRVhQSVJBVElPTiIgfSwKLSAgeyAweEMwMDAwMjY5LCAiU1RBVFVTX0lMTEVHQUxfRExMX1JFTE9DQVRJT04iIH0sCi0gIHsgMHhDMDAwMDI2QSwgIlNUQVRVU19MSUNFTlNFX1ZJT0xBVElPTiIgfSwKLSAgeyAweEMwMDAwMjZCLCAiU1RBVFVTX0RMTF9JTklUX0ZBSUxFRF9MT0dPRkYiIH0sCi0gIHsgMHhDMDAwMDI2QywgIlNUQVRVU19EUklWRVJfVU5BQkxFX1RPX0xPQUQiIH0sCi0gIHsgMHhDMDAwMDI2RCwgIlNUQVRVU19ERlNfVU5BVkFJTEFCTEUiIH0sCi0gIHsgMHhDMDAwMDI2RSwgIlNUQVRVU19WT0xVTUVfRElTTU9VTlRFRCIgfSwKLSAgeyAweEMwMDAwMjZGLCAiU1RBVFVTX1dYODZfSU5URVJOQUxfRVJST1IiIH0sCi0gIHsgMHhDMDAwMDI3MCwgIlNUQVRVU19XWDg2X0ZMT0FUX1NUQUNLX0NIRUNLIiB9LAotICB7IDB4QzAwMDAyNzEsICJTVEFUVVNfVkFMSURBVEVfQ09OVElOVUUiIH0sCi0gIHsgMHhDMDAwMDI3MiwgIlNUQVRVU19OT19NQVRDSCIgfSwKLSAgeyAweEMwMDAwMjczLCAiU1RBVFVTX05PX01PUkVfTUFUQ0hFUyIgfSwKLSAgeyAweEMwMDAwMjc1LCAiU1RBVFVTX05PVF9BX1JFUEFSU0VfUE9JTlQiIH0sCi0gIHsgMHhDMDAwMDI3NiwgIlNUQVRVU19JT19SRVBBUlNFX1RBR19JTlZBTElEIiB9LAotICB7IDB4QzAwMDAyNzcsICJTVEFUVVNfSU9fUkVQQVJTRV9UQUdfTUlTTUFUQ0giIH0sCi0gIHsgMHhDMDAwMDI3OCwgIlNUQVRVU19JT19SRVBBUlNFX0RBVEFfSU5WQUxJRCIgfSwKLSAgeyAweEMwMDAwMjc5LCAiU1RBVFVTX0lPX1JFUEFSU0VfVEFHX05PVF9IQU5ETEVEIiB9LAotICB7IDB4QzAwMDAyODAsICJTVEFUVVNfUkVQQVJTRV9QT0lOVF9OT1RfUkVTT0xWRUQiIH0sCi0gIHsgMHhDMDAwMDI4MSwgIlNUQVRVU19ESVJFQ1RPUllfSVNfQV9SRVBBUlNFX1BPSU5UIiB9LAotICB7IDB4QzAwMDAyODIsICJTVEFUVVNfUkFOR0VfTElTVF9DT05GTElDVCIgfSwKLSAgeyAweEMwMDAwMjgzLCAiU1RBVFVTX1NPVVJDRV9FTEVNRU5UX0VNUFRZIiB9LAotICB7IDB4QzAwMDAyODQsICJTVEFUVVNfREVTVElOQVRJT05fRUxFTUVOVF9GVUxMIiB9LAotICB7IDB4QzAwMDAyODUsICJTVEFUVVNfSUxMRUdBTF9FTEVNRU5UX0FERFJFU1MiIH0sCi0gIHsgMHhDMDAwMDI4NiwgIlNUQVRVU19NQUdBWklORV9OT1RfUFJFU0VOVCIgfSwKLSAgeyAweEMwMDAwMjg3LCAiU1RBVFVTX1JFSU5JVElBTElaQVRJT05fTkVFREVEIiB9LAotICB7IDB4ODAwMDAyODgsICJTVEFUVVNfREVWSUNFX1JFUVVJUkVTX0NMRUFOSU5HIiB9LAotICB7IDB4ODAwMDAyODksICJTVEFUVVNfREVWSUNFX0RPT1JfT1BFTiIgfSwKLSAgeyAweEMwMDAwMjhBLCAiU1RBVFVTX0VOQ1JZUFRJT05fRkFJTEVEIiB9LAotICB7IDB4QzAwMDAyOEIsICJTVEFUVVNfREVDUllQVElPTl9GQUlMRUQiIH0sCi0gIHsgMHhDMDAwMDI4QywgIlNUQVRVU19SQU5HRV9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDI4RCwgIlNUQVRVU19OT19SRUNPVkVSWV9QT0xJQ1kiIH0sCi0gIHsgMHhDMDAwMDI4RSwgIlNUQVRVU19OT19FRlMiIH0sCi0gIHsgMHhDMDAwMDI4RiwgIlNUQVRVU19XUk9OR19FRlMiIH0sCi0gIHsgMHhDMDAwMDI5MCwgIlNUQVRVU19OT19VU0VSX0tFWVMiIH0sCi0gIHsgMHhDMDAwMDI5MSwgIlNUQVRVU19GSUxFX05PVF9FTkNSWVBURUQiIH0sCi0gIHsgMHhDMDAwMDI5MiwgIlNUQVRVU19OT1RfRVhQT1JUX0ZPUk1BVCIgfSwKLSAgeyAweEMwMDAwMjkzLCAiU1RBVFVTX0ZJTEVfRU5DUllQVEVEIiB9LAotICB7IDB4NDAwMDAyOTQsICJTVEFUVVNfV0FLRV9TWVNURU0iIH0sCi0gIHsgMHhDMDAwMDI5NSwgIlNUQVRVU19XTUlfR1VJRF9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDI5NiwgIlNUQVRVU19XTUlfSU5TVEFOQ0VfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAyOTcsICJTVEFUVVNfV01JX0lURU1JRF9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAwMDI5OCwgIlNUQVRVU19XTUlfVFJZX0FHQUlOIiB9LAotICB7IDB4QzAwMDAyOTksICJTVEFUVVNfU0hBUkVEX1BPTElDWSIgfSwKLSAgeyAweEMwMDAwMjlBLCAiU1RBVFVTX1BPTElDWV9PQkpFQ1RfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMDAyOUIsICJTVEFUVVNfUE9MSUNZX09OTFlfSU5fRFMiIH0sCi0gIHsgMHhDMDAwMDI5QywgIlNUQVRVU19WT0xVTUVfTk9UX1VQR1JBREVEIiB9LAotICB7IDB4QzAwMDAyOUQsICJTVEFUVVNfUkVNT1RFX1NUT1JBR0VfTk9UX0FDVElWRSIgfSwKLSAgeyAweEMwMDAwMjlFLCAiU1RBVFVTX1JFTU9URV9TVE9SQUdFX01FRElBX0VSUk9SIiB9LAotICB7IDB4QzAwMDAyOUYsICJTVEFUVVNfTk9fVFJBQ0tJTkdfU0VSVklDRSIgfSwKLSAgeyAweEMwMDAwMkEwLCAiU1RBVFVTX1NFUlZFUl9TSURfTUlTTUFUQ0giIH0sCi0gIHsgMHhDMDAwMDJBMSwgIlNUQVRVU19EU19OT19BVFRSSUJVVEVfT1JfVkFMVUUiIH0sCi0gIHsgMHhDMDAwMDJBMiwgIlNUQVRVU19EU19JTlZBTElEX0FUVFJJQlVURV9TWU5UQVgiIH0sCi0gIHsgMHhDMDAwMDJBMywgIlNUQVRVU19EU19BVFRSSUJVVEVfVFlQRV9VTkRFRklORUQiIH0sCi0gIHsgMHhDMDAwMDJBNCwgIlNUQVRVU19EU19BVFRSSUJVVEVfT1JfVkFMVUVfRVhJU1RTIiB9LAotICB7IDB4QzAwMDAyQTUsICJTVEFUVVNfRFNfQlVTWSIgfSwKLSAgeyAweEMwMDAwMkE2LCAiU1RBVFVTX0RTX1VOQVZBSUxBQkxFIiB9LAotICB7IDB4QzAwMDAyQTcsICJTVEFUVVNfRFNfTk9fUklEU19BTExPQ0FURUQiIH0sCi0gIHsgMHhDMDAwMDJBOCwgIlNUQVRVU19EU19OT19NT1JFX1JJRFMiIH0sCi0gIHsgMHhDMDAwMDJBOSwgIlNUQVRVU19EU19JTkNPUlJFQ1RfUk9MRV9PV05FUiIgfSwKLSAgeyAweEMwMDAwMkFBLCAiU1RBVFVTX0RTX1JJRE1HUl9JTklUX0VSUk9SIiB9LAotICB7IDB4QzAwMDAyQUIsICJTVEFUVVNfRFNfT0JKX0NMQVNTX1ZJT0xBVElPTiIgfSwKLSAgeyAweEMwMDAwMkFDLCAiU1RBVFVTX0RTX0NBTlRfT05fTk9OX0xFQUYiIH0sCi0gIHsgMHhDMDAwMDJBRCwgIlNUQVRVU19EU19DQU5UX09OX1JETiIgfSwKLSAgeyAweEMwMDAwMkFFLCAiU1RBVFVTX0RTX0NBTlRfTU9EX09CSl9DTEFTUyIgfSwKLSAgeyAweEMwMDAwMkFGLCAiU1RBVFVTX0RTX0NST1NTX0RPTV9NT1ZFX0ZBSUxFRCIgfSwKLSAgeyAweEMwMDAwMkIwLCAiU1RBVFVTX0RTX0dDX05PVF9BVkFJTEFCTEUiIH0sCi0gIHsgMHhDMDAwMDJCMSwgIlNUQVRVU19ESVJFQ1RPUllfU0VSVklDRV9SRVFVSVJFRCIgfSwKLSAgeyAweEMwMDAwMkIyLCAiU1RBVFVTX1JFUEFSU0VfQVRUUklCVVRFX0NPTkZMSUNUIiB9LAotICB7IDB4QzAwMDAyQjMsICJTVEFUVVNfQ0FOVF9FTkFCTEVfREVOWV9PTkxZIiB9LAotICB7IDB4QzAwMDAyQjQsICJTVEFUVVNfRkxPQVRfTVVMVElQTEVfRkFVTFRTIiB9LAotICB7IDB4QzAwMDAyQjUsICJTVEFUVVNfRkxPQVRfTVVMVElQTEVfVFJBUFMiIH0sCi0gIHsgMHhDMDAwMDJCNiwgIlNUQVRVU19ERVZJQ0VfUkVNT1ZFRCIgfSwKLSAgeyAweEMwMDAwMkI3LCAiU1RBVFVTX0pPVVJOQUxfREVMRVRFX0lOX1BST0dSRVNTIiB9LAotICB7IDB4QzAwMDAyQjgsICJTVEFUVVNfSk9VUk5BTF9OT1RfQUNUSVZFIiB9LAotICB7IDB4QzAwMDAyQjksICJTVEFUVVNfTk9JTlRFUkZBQ0UiIH0sCi0gIHsgMHhDMDAwMDJDMSwgIlNUQVRVU19EU19BRE1JTl9MSU1JVF9FWENFRURFRCIgfSwKLSAgeyAweEMwMDAwMkMyLCAiU1RBVFVTX0RSSVZFUl9GQUlMRURfU0xFRVAiIH0sCi0gIHsgMHhDMDAwMDJDMywgIlNUQVRVU19NVVRVQUxfQVVUSEVOVElDQVRJT05fRkFJTEVEIiB9LAotICB7IDB4QzAwMDAyQzQsICJTVEFUVVNfQ09SUlVQVF9TWVNURU1fRklMRSIgfSwKLSAgeyAweEMwMDAwMkM1LCAiU1RBVFVTX0RBVEFUWVBFX01JU0FMSUdOTUVOVF9FUlJPUiIgfSwKLSAgeyAweEMwMDAwMkM2LCAiU1RBVFVTX1dNSV9SRUFEX09OTFkiIH0sCi0gIHsgMHhDMDAwMDJDNywgIlNUQVRVU19XTUlfU0VUX0ZBSUxVUkUiIH0sCi0gIHsgMHhDMDAwMDJDOCwgIlNUQVRVU19DT01NSVRNRU5UX01JTklNVU0iIH0sCi0gIHsgMHhDMDAwMDJDOSwgIlNUQVRVU19SRUdfTkFUX0NPTlNVTVBUSU9OIiB9LAotICB7IDB4QzAwMDAyQ0EsICJTVEFUVVNfVFJBTlNQT1JUX0ZVTEwiIH0sCi0gIHsgMHhDMDAwMDJDQiwgIlNUQVRVU19EU19TQU1fSU5JVF9GQUlMVVJFIiB9LAotICB7IDB4QzAwMDAyQ0MsICJTVEFUVVNfT05MWV9JRl9DT05ORUNURUQiIH0sCi0gIHsgMHhDMDAwMDJDRCwgIlNUQVRVU19EU19TRU5TSVRJVkVfR1JPVVBfVklPTEFUSU9OIiB9LAotICB7IDB4QzAwMDAyQ0UsICJTVEFUVVNfUE5QX1JFU1RBUlRfRU5VTUVSQVRJT04iIH0sCi0gIHsgMHhDMDAwMDJDRiwgIlNUQVRVU19KT1VSTkFMX0VOVFJZX0RFTEVURUQiIH0sCi0gIHsgMHhDMDAwMDJEMCwgIlNUQVRVU19EU19DQU5UX01PRF9QUklNQVJZR1JPVVBJRCIgfSwKLSAgeyAweEMwMDAwMkQxLCAiU1RBVFVTX1NZU1RFTV9JTUFHRV9CQURfU0lHTkFUVVJFIiB9LAotICB7IDB4QzAwMDAyRDIsICJTVEFUVVNfUE5QX1JFQk9PVF9SRVFVSVJFRCIgfSwKLSAgeyAweEMwMDAwMkQzLCAiU1RBVFVTX1BPV0VSX1NUQVRFX0lOVkFMSUQiIH0sCi0gIHsgMHhDMDAwMDJENCwgIlNUQVRVU19EU19JTlZBTElEX0dST1VQX1RZUEUiIH0sCi0gIHsgMHhDMDAwMDJENSwgIlNUQVRVU19EU19OT19ORVNUX0dMT0JBTEdST1VQX0lOX01JWEVERE9NQUlOIiB9LAotICB7IDB4QzAwMDAyRDYsICJTVEFUVVNfRFNfTk9fTkVTVF9MT0NBTEdST1VQX0lOX01JWEVERE9NQUlOIiB9LAotICB7IDB4QzAwMDAyRDcsICJTVEFUVVNfRFNfR0xPQkFMX0NBTlRfSEFWRV9MT0NBTF9NRU1CRVIiIH0sCi0gIHsgMHhDMDAwMDJEOCwgIlNUQVRVU19EU19HTE9CQUxfQ0FOVF9IQVZFX1VOSVZFUlNBTF9NRU1CRVIiIH0sCi0gIHsgMHhDMDAwMDJEOSwgIlNUQVRVU19EU19VTklWRVJTQUxfQ0FOVF9IQVZFX0xPQ0FMX01FTUJFUiIgfSwKLSAgeyAweEMwMDAwMkRBLCAiU1RBVFVTX0RTX0dMT0JBTF9DQU5UX0hBVkVfQ1JPU1NET01BSU5fTUVNQkVSIiB9LAotICB7IDB4QzAwMDAyREIsICJTVEFUVVNfRFNfTE9DQUxfQ0FOVF9IQVZFX0NST1NTRE9NQUlOX0xPQ0FMX01FTUJFUiIgfSwKLSAgeyAweEMwMDAwMkRDLCAiU1RBVFVTX0RTX0hBVkVfUFJJTUFSWV9NRU1CRVJTIiB9LAotICB7IDB4QzAwMDAyREQsICJTVEFUVVNfV01JX05PVF9TVVBQT1JURUQiIH0sCi0gIHsgMHhDMDAwMDJERSwgIlNUQVRVU19JTlNVRkZJQ0lFTlRfUE9XRVIiIH0sCi0gIHsgMHhDMDAwMDJERiwgIlNUQVRVU19TQU1fTkVFRF9CT09US0VZX1BBU1NXT1JEIiB9LAotICB7IDB4QzAwMDAyRTAsICJTVEFUVVNfU0FNX05FRURfQk9PVEtFWV9GTE9QUFkiIH0sCi0gIHsgMHhDMDAwMDJFMSwgIlNUQVRVU19EU19DQU5UX1NUQVJUIiB9LAotICB7IDB4QzAwMDAyRTIsICJTVEFUVVNfRFNfSU5JVF9GQUlMVVJFIiB9LAotICB7IDB4QzAwMDAyRTMsICJTVEFUVVNfU0FNX0lOSVRfRkFJTFVSRSIgfSwKLSAgeyAweEMwMDAwMkU0LCAiU1RBVFVTX0RTX0dDX1JFUVVJUkVEIiB9LAotICB7IDB4QzAwMDAyRTUsICJTVEFUVVNfRFNfTE9DQUxfTUVNQkVSX09GX0xPQ0FMX09OTFkiIH0sCi0gIHsgMHhDMDAwMDJFNiwgIlNUQVRVU19EU19OT19GUE9fSU5fVU5JVkVSU0FMX0dST1VQUyIgfSwKLSAgeyAweEMwMDAwMkU3LCAiU1RBVFVTX0RTX01BQ0hJTkVfQUNDT1VOVF9RVU9UQV9FWENFRURFRCIgfSwKLSAgeyAweEMwMDAwMkU4LCAiU1RBVFVTX01VTFRJUExFX0ZBVUxUX1ZJT0xBVElPTiIgfSwKLSAgeyAweEMwMDAwMzAwLCAiU1RBVFVTX05PVF9TVVBQT1JURURfT05fU0JTIiB9LAotICB7IDB4QzAwMDk4OTgsICJTVEFUVVNfV09XX0FTU0VSVElPTiIgfSwKLSAgeyAweEMwMDIwMDAxLCAiUlBDX05UX0lOVkFMSURfU1RSSU5HX0JJTkRJTkciIH0sCi0gIHsgMHhDMDAyMDAwMiwgIlJQQ19OVF9XUk9OR19LSU5EX09GX0JJTkRJTkciIH0sCi0gIHsgMHhDMDAyMDAwMywgIlJQQ19OVF9JTlZBTElEX0JJTkRJTkciIH0sCi0gIHsgMHhDMDAyMDAwNCwgIlJQQ19OVF9QUk9UU0VRX05PVF9TVVBQT1JURUQiIH0sCi0gIHsgMHhDMDAyMDAwNSwgIlJQQ19OVF9JTlZBTElEX1JQQ19QUk9UU0VRIiB9LAotICB7IDB4QzAwMjAwMDYsICJSUENfTlRfSU5WQUxJRF9TVFJJTkdfVVVJRCIgfSwKLSAgeyAweEMwMDIwMDA3LCAiUlBDX05UX0lOVkFMSURfRU5EUE9JTlRfRk9STUFUIiB9LAotICB7IDB4QzAwMjAwMDgsICJSUENfTlRfSU5WQUxJRF9ORVRfQUREUiIgfSwKLSAgeyAweEMwMDIwMDA5LCAiUlBDX05UX05PX0VORFBPSU5UX0ZPVU5EIiB9LAotICB7IDB4QzAwMjAwMEEsICJSUENfTlRfSU5WQUxJRF9USU1FT1VUIiB9LAotICB7IDB4QzAwMjAwMEIsICJSUENfTlRfT0JKRUNUX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDIwMDBDLCAiUlBDX05UX0FMUkVBRFlfUkVHSVNURVJFRCIgfSwKLSAgeyAweEMwMDIwMDBELCAiUlBDX05UX1RZUEVfQUxSRUFEWV9SRUdJU1RFUkVEIiB9LAotICB7IDB4QzAwMjAwMEUsICJSUENfTlRfQUxSRUFEWV9MSVNURU5JTkciIH0sCi0gIHsgMHhDMDAyMDAwRiwgIlJQQ19OVF9OT19QUk9UU0VRU19SRUdJU1RFUkVEIiB9LAotICB7IDB4QzAwMjAwMTAsICJSUENfTlRfTk9UX0xJU1RFTklORyIgfSwKLSAgeyAweEMwMDIwMDExLCAiUlBDX05UX1VOS05PV05fTUdSX1RZUEUiIH0sCi0gIHsgMHhDMDAyMDAxMiwgIlJQQ19OVF9VTktOT1dOX0lGIiB9LAotICB7IDB4QzAwMjAwMTMsICJSUENfTlRfTk9fQklORElOR1MiIH0sCi0gIHsgMHhDMDAyMDAxNCwgIlJQQ19OVF9OT19QUk9UU0VRUyIgfSwKLSAgeyAweEMwMDIwMDE1LCAiUlBDX05UX0NBTlRfQ1JFQVRFX0VORFBPSU5UIiB9LAotICB7IDB4QzAwMjAwMTYsICJSUENfTlRfT1VUX09GX1JFU09VUkNFUyIgfSwKLSAgeyAweEMwMDIwMDE3LCAiUlBDX05UX1NFUlZFUl9VTkFWQUlMQUJMRSIgfSwKLSAgeyAweEMwMDIwMDE4LCAiUlBDX05UX1NFUlZFUl9UT09fQlVTWSIgfSwKLSAgeyAweEMwMDIwMDE5LCAiUlBDX05UX0lOVkFMSURfTkVUV09SS19PUFRJT05TIiB9LAotICB7IDB4QzAwMjAwMUEsICJSUENfTlRfTk9fQ0FMTF9BQ1RJVkUiIH0sCi0gIHsgMHhDMDAyMDAxQiwgIlJQQ19OVF9DQUxMX0ZBSUxFRCIgfSwKLSAgeyAweEMwMDIwMDFDLCAiUlBDX05UX0NBTExfRkFJTEVEX0RORSIgfSwKLSAgeyAweEMwMDIwMDFELCAiUlBDX05UX1BST1RPQ09MX0VSUk9SIiB9LAotICB7IDB4QzAwMjAwMUYsICJSUENfTlRfVU5TVVBQT1JURURfVFJBTlNfU1lOIiB9LAotICB7IDB4QzAwMjAwMjEsICJSUENfTlRfVU5TVVBQT1JURURfVFlQRSIgfSwKLSAgeyAweEMwMDIwMDIyLCAiUlBDX05UX0lOVkFMSURfVEFHIiB9LAotICB7IDB4QzAwMjAwMjMsICJSUENfTlRfSU5WQUxJRF9CT1VORCIgfSwKLSAgeyAweEMwMDIwMDI0LCAiUlBDX05UX05PX0VOVFJZX05BTUUiIH0sCi0gIHsgMHhDMDAyMDAyNSwgIlJQQ19OVF9JTlZBTElEX05BTUVfU1lOVEFYIiB9LAotICB7IDB4QzAwMjAwMjYsICJSUENfTlRfVU5TVVBQT1JURURfTkFNRV9TWU5UQVgiIH0sCi0gIHsgMHhDMDAyMDAyOCwgIlJQQ19OVF9VVUlEX05PX0FERFJFU1MiIH0sCi0gIHsgMHhDMDAyMDAyOSwgIlJQQ19OVF9EVVBMSUNBVEVfRU5EUE9JTlQiIH0sCi0gIHsgMHhDMDAyMDAyQSwgIlJQQ19OVF9VTktOT1dOX0FVVEhOX1RZUEUiIH0sCi0gIHsgMHhDMDAyMDAyQiwgIlJQQ19OVF9NQVhfQ0FMTFNfVE9PX1NNQUxMIiB9LAotICB7IDB4QzAwMjAwMkMsICJSUENfTlRfU1RSSU5HX1RPT19MT05HIiB9LAotICB7IDB4QzAwMjAwMkQsICJSUENfTlRfUFJPVFNFUV9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAyMDAyRSwgIlJQQ19OVF9QUk9DTlVNX09VVF9PRl9SQU5HRSIgfSwKLSAgeyAweEMwMDIwMDJGLCAiUlBDX05UX0JJTkRJTkdfSEFTX05PX0FVVEgiIH0sCi0gIHsgMHhDMDAyMDAzMCwgIlJQQ19OVF9VTktOT1dOX0FVVEhOX1NFUlZJQ0UiIH0sCi0gIHsgMHhDMDAyMDAzMSwgIlJQQ19OVF9VTktOT1dOX0FVVEhOX0xFVkVMIiB9LAotICB7IDB4QzAwMjAwMzIsICJSUENfTlRfSU5WQUxJRF9BVVRIX0lERU5USVRZIiB9LAotICB7IDB4QzAwMjAwMzMsICJSUENfTlRfVU5LTk9XTl9BVVRIWl9TRVJWSUNFIiB9LAotICB7IDB4QzAwMjAwMzQsICJFUFRfTlRfSU5WQUxJRF9FTlRSWSIgfSwKLSAgeyAweEMwMDIwMDM1LCAiRVBUX05UX0NBTlRfUEVSRk9STV9PUCIgfSwKLSAgeyAweEMwMDIwMDM2LCAiRVBUX05UX05PVF9SRUdJU1RFUkVEIiB9LAotICB7IDB4QzAwMjAwMzcsICJSUENfTlRfTk9USElOR19UT19FWFBPUlQiIH0sCi0gIHsgMHhDMDAyMDAzOCwgIlJQQ19OVF9JTkNPTVBMRVRFX05BTUUiIH0sCi0gIHsgMHhDMDAyMDAzOSwgIlJQQ19OVF9JTlZBTElEX1ZFUlNfT1BUSU9OIiB9LAotICB7IDB4QzAwMjAwM0EsICJSUENfTlRfTk9fTU9SRV9NRU1CRVJTIiB9LAotICB7IDB4QzAwMjAwM0IsICJSUENfTlRfTk9UX0FMTF9PQkpTX1VORVhQT1JURUQiIH0sCi0gIHsgMHhDMDAyMDAzQywgIlJQQ19OVF9JTlRFUkZBQ0VfTk9UX0ZPVU5EIiB9LAotICB7IDB4QzAwMjAwM0QsICJSUENfTlRfRU5UUllfQUxSRUFEWV9FWElTVFMiIH0sCi0gIHsgMHhDMDAyMDAzRSwgIlJQQ19OVF9FTlRSWV9OT1RfRk9VTkQiIH0sCi0gIHsgMHhDMDAyMDAzRiwgIlJQQ19OVF9OQU1FX1NFUlZJQ0VfVU5BVkFJTEFCTEUiIH0sCi0gIHsgMHhDMDAyMDA0MCwgIlJQQ19OVF9JTlZBTElEX05BRl9JRCIgfSwKLSAgeyAweEMwMDIwMDQxLCAiUlBDX05UX0NBTk5PVF9TVVBQT1JUIiB9LAotICB7IDB4QzAwMjAwNDIsICJSUENfTlRfTk9fQ09OVEVYVF9BVkFJTEFCTEUiIH0sCi0gIHsgMHhDMDAyMDA0MywgIlJQQ19OVF9JTlRFUk5BTF9FUlJPUiIgfSwKLSAgeyAweEMwMDIwMDQ0LCAiUlBDX05UX1pFUk9fRElWSURFIiB9LAotICB7IDB4QzAwMjAwNDUsICJSUENfTlRfQUREUkVTU19FUlJPUiIgfSwKLSAgeyAweEMwMDIwMDQ2LCAiUlBDX05UX0ZQX0RJVl9aRVJPIiB9LAotICB7IDB4QzAwMjAwNDcsICJSUENfTlRfRlBfVU5ERVJGTE9XIiB9LAotICB7IDB4QzAwMjAwNDgsICJSUENfTlRfRlBfT1ZFUkZMT1ciIH0sCi0gIHsgMHhDMDAyMTAwNywgIlJQQ19QX1JFQ0VJVkVfQUxFUlRFRCIgfSwKLSAgeyAweEMwMDIxMDA4LCAiUlBDX1BfQ09OTkVDVElPTl9DTE9TRUQiIH0sCi0gIHsgMHhDMDAyMTAwOSwgIlJQQ19QX1JFQ0VJVkVfRkFJTEVEIiB9LAotICB7IDB4QzAwMjEwMEEsICJSUENfUF9TRU5EX0ZBSUxFRCIgfSwKLSAgeyAweEMwMDIxMDBCLCAiUlBDX1BfVElNRU9VVCIgfSwKLSAgeyAweEMwMDIxMDBDLCAiUlBDX1BfU0VSVkVSX1RSQU5TUE9SVF9FUlJPUiIgfSwKLSAgeyAweEMwMDIxMDBFLCAiUlBDX1BfRVhDRVBUSU9OX09DQ1VSRUQiIH0sCi0gIHsgMHhDMDAyMTAxMiwgIlJQQ19QX0NPTk5FQ1RJT05fU0hVVERPV04iIH0sCi0gIHsgMHhDMDAyMTAxNSwgIlJQQ19QX1RIUkVBRF9MSVNURU5JTkciIH0sCi0gIHsgMHhDMDAzMDAwMSwgIlJQQ19OVF9OT19NT1JFX0VOVFJJRVMiIH0sCi0gIHsgMHhDMDAzMDAwMiwgIlJQQ19OVF9TU19DSEFSX1RSQU5TX09QRU5fRkFJTCIgfSwKLSAgeyAweEMwMDMwMDAzLCAiUlBDX05UX1NTX0NIQVJfVFJBTlNfU0hPUlRfRklMRSIgfSwKLSAgeyAweEMwMDMwMDA0LCAiUlBDX05UX1NTX0lOX05VTExfQ09OVEVYVCIgfSwKLSAgeyAweEMwMDMwMDA1LCAiUlBDX05UX1NTX0NPTlRFWFRfTUlTTUFUQ0giIH0sCi0gIHsgMHhDMDAzMDAwNiwgIlJQQ19OVF9TU19DT05URVhUX0RBTUFHRUQiIH0sCi0gIHsgMHhDMDAzMDAwNywgIlJQQ19OVF9TU19IQU5ETEVTX01JU01BVENIIiB9LAotICB7IDB4QzAwMzAwMDgsICJSUENfTlRfU1NfQ0FOTk9UX0dFVF9DQUxMX0hBTkRMRSIgfSwKLSAgeyAweEMwMDMwMDA5LCAiUlBDX05UX05VTExfUkVGX1BPSU5URVIiIH0sCi0gIHsgMHhDMDAzMDAwQSwgIlJQQ19OVF9FTlVNX1ZBTFVFX09VVF9PRl9SQU5HRSIgfSwKLSAgeyAweEMwMDMwMDBCLCAiUlBDX05UX0JZVEVfQ09VTlRfVE9PX1NNQUxMIiB9LAotICB7IDB4QzAwMzAwMEMsICJSUENfTlRfQkFEX1NUVUJfREFUQSIgfSwKLSAgeyAweEMwMDIwMDQ5LCAiUlBDX05UX0NBTExfSU5fUFJPR1JFU1MiIH0sCi0gIHsgMHhDMDAyMDA0QSwgIlJQQ19OVF9OT19NT1JFX0JJTkRJTkdTIiB9LAotICB7IDB4QzAwMjAwNEIsICJSUENfTlRfR1JPVVBfTUVNQkVSX05PVF9GT1VORCIgfSwKLSAgeyAweEMwMDIwMDRDLCAiRVBUX05UX0NBTlRfQ1JFQVRFIiB9LAotICB7IDB4QzAwMjAwNEQsICJSUENfTlRfSU5WQUxJRF9PQkpFQ1QiIH0sCi0gIHsgMHhDMDAyMDA0RiwgIlJQQ19OVF9OT19JTlRFUkZBQ0VTIiB9LAotICB7IDB4QzAwMjAwNTAsICJSUENfTlRfQ0FMTF9DQU5DRUxMRUQiIH0sCi0gIHsgMHhDMDAyMDA1MSwgIlJQQ19OVF9CSU5ESU5HX0lOQ09NUExFVEUiIH0sCi0gIHsgMHhDMDAyMDA1MiwgIlJQQ19OVF9DT01NX0ZBSUxVUkUiIH0sCi0gIHsgMHhDMDAyMDA1MywgIlJQQ19OVF9VTlNVUFBPUlRFRF9BVVRITl9MRVZFTCIgfSwKLSAgeyAweEMwMDIwMDU0LCAiUlBDX05UX05PX1BSSU5DX05BTUUiIH0sCi0gIHsgMHhDMDAyMDA1NSwgIlJQQ19OVF9OT1RfUlBDX0VSUk9SIiB9LAotICB7IDB4NDAwMjAwNTYsICJSUENfTlRfVVVJRF9MT0NBTF9PTkxZIiB9LAotICB7IDB4QzAwMjAwNTcsICJSUENfTlRfU0VDX1BLR19FUlJPUiIgfSwKLSAgeyAweEMwMDIwMDU4LCAiUlBDX05UX05PVF9DQU5DRUxMRUQiIH0sCi0gIHsgMHhDMDAzMDA1OSwgIlJQQ19OVF9JTlZBTElEX0VTX0FDVElPTiIgfSwKLSAgeyAweEMwMDMwMDVBLCAiUlBDX05UX1dST05HX0VTX1ZFUlNJT04iIH0sCi0gIHsgMHhDMDAzMDA1QiwgIlJQQ19OVF9XUk9OR19TVFVCX1ZFUlNJT04iIH0sCi0gIHsgMHhDMDAzMDA1QywgIlJQQ19OVF9JTlZBTElEX1BJUEVfT0JKRUNUIiB9LAotICB7IDB4QzAwMzAwNUQsICJSUENfTlRfSU5WQUxJRF9QSVBFX09QRVJBVElPTiIgfSwKLSAgeyAweEMwMDMwMDVFLCAiUlBDX05UX1dST05HX1BJUEVfVkVSU0lPTiIgfSwKLSAgeyAweDQwMDIwMEFGLCAiUlBDX05UX1NFTkRfSU5DT01QTEVURSIgfSwKLSAgeyAwLCAgICAgICAgICBOVUxMIH0KLX07Ci0KLS8qCi0gKiByZXR1cm4gYW4gTlQgZXJyb3Igc3RyaW5nIGZyb20gYSBTTUIgYnVmZmVyCi0gKi8KLWNvbnN0IGNoYXIgKgotbnRfZXJyc3RyKHVfaW50MzJfdCBlcnIpCi17Ci0gICAgc3RhdGljIGNoYXIgcmV0WzEyOF07Ci0gICAgaW50IGk7Ci0KLSAgICByZXRbMF0gPSAwOwotCi0gICAgZm9yIChpID0gMDsgbnRfZXJyb3JzW2ldLm5hbWU7IGkrKykgewotCWlmIChlcnIgPT0gbnRfZXJyb3JzW2ldLmNvZGUpCi0JICAgIHJldHVybiBudF9lcnJvcnNbaV0ubmFtZTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiMHglMDh4IiwgZXJyKTsKLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvc3RpbWUuYXdrIGIvc3RpbWUuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTg5MWYyLi4wMDAwMDAwCi0tLSBhL3N0aW1lLmF3aworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSQ2ICF+IC9eYWNrLyAmJiAkNSAhfiAvW1NGUl0vIAl7Ci0JIyBnaXZlbiBhIHRjcGR1bXAgZnRwIHRyYWNlLCBvdXRwdXQgb25lIGxpbmUgZm9yIGVhY2ggc2VuZAotCSMgaW4gdGhlIGZvcm0KLQkjICAgPHNlbmQgdGltZT4gPHNlcSBubz4KLQkjIHdoZXJlIDxzZW5kIHRpbWU+IGlzIHRoZSB0aW1lIHBhY2tldCB3YXMgc2VudCAoaW4gc2Vjb25kcyB3aXRoCi0JIyB6ZXJvIGF0IHRpbWUgb2YgZmlyc3QgcGFja2V0KSBhbmQgPHNlcSBubz4gaXMgdGhlIHRjcCBzZXF1ZW5jZQotCSMgbnVtYmVyIG9mIHRoZSBwYWNrZXQgZGl2aWRlZCBieSAxMDI0IChpLmUuLCBLYnl0ZXMgc2VudCkuCi0JIwotCSMgY29udmVydCB0aW1lIHRvIHNlY29uZHMKLQluID0gc3BsaXQgKCQxLHQsIjoiKQotCXRpbSA9IHRbMV0qMzYwMCArIHRbMl0qNjAgKyB0WzNdCi0JaWYgKCEgdHplcm8pIHsKLQkJdHplcm8gPSB0aW0KLQkJT0ZTID0gIlx0IgotCX0KLQkjIGdldCBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyCi0JaSA9IGluZGV4KCQ2LCI6IikKLQlwcmludGYgIiU3LjJmXHQlZ1xuIiwgdGltLXR6ZXJvLCBzdWJzdHIoJDYsMSxpLTEpLzEwMjQKLQl9CmRpZmYgLS1naXQgYS9zdHJjYXNlY21wLmMgYi9zdHJjYXNlY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNmQwMDcuLjAwMDAwMDAKLS0tIGEvc3RyY2FzZWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgotICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKLSAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCi0gKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KLSAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvc3RyY2FzZWNtcC5jLHYgMS42IDIwMDMvMTEvMTYgMDk6MzY6NDMgZ3V5IEV4cCAkIjsKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2luY2x1ZGUgImludGVyZmFjZS5oIgotCi0vKgotICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKLSAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKLSAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KLSAqLwotc3RhdGljIHVfY2hhciBjaGFybWFwW10gPSB7Ci0JJ1wwMDAnLCAnXDAwMScsICdcMDAyJywgJ1wwMDMnLCAnXDAwNCcsICdcMDA1JywgJ1wwMDYnLCAnXDAwNycsCi0JJ1wwMTAnLCAnXDAxMScsICdcMDEyJywgJ1wwMTMnLCAnXDAxNCcsICdcMDE1JywgJ1wwMTYnLCAnXDAxNycsCi0JJ1wwMjAnLCAnXDAyMScsICdcMDIyJywgJ1wwMjMnLCAnXDAyNCcsICdcMDI1JywgJ1wwMjYnLCAnXDAyNycsCi0JJ1wwMzAnLCAnXDAzMScsICdcMDMyJywgJ1wwMzMnLCAnXDAzNCcsICdcMDM1JywgJ1wwMzYnLCAnXDAzNycsCi0JJ1wwNDAnLCAnXDA0MScsICdcMDQyJywgJ1wwNDMnLCAnXDA0NCcsICdcMDQ1JywgJ1wwNDYnLCAnXDA0NycsCi0JJ1wwNTAnLCAnXDA1MScsICdcMDUyJywgJ1wwNTMnLCAnXDA1NCcsICdcMDU1JywgJ1wwNTYnLCAnXDA1NycsCi0JJ1wwNjAnLCAnXDA2MScsICdcMDYyJywgJ1wwNjMnLCAnXDA2NCcsICdcMDY1JywgJ1wwNjYnLCAnXDA2NycsCi0JJ1wwNzAnLCAnXDA3MScsICdcMDcyJywgJ1wwNzMnLCAnXDA3NCcsICdcMDc1JywgJ1wwNzYnLCAnXDA3NycsCi0JJ1wxMDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxMzMnLCAnXDEzNCcsICdcMTM1JywgJ1wxMzYnLCAnXDEzNycsCi0JJ1wxNDAnLCAnXDE0MScsICdcMTQyJywgJ1wxNDMnLCAnXDE0NCcsICdcMTQ1JywgJ1wxNDYnLCAnXDE0NycsCi0JJ1wxNTAnLCAnXDE1MScsICdcMTUyJywgJ1wxNTMnLCAnXDE1NCcsICdcMTU1JywgJ1wxNTYnLCAnXDE1NycsCi0JJ1wxNjAnLCAnXDE2MScsICdcMTYyJywgJ1wxNjMnLCAnXDE2NCcsICdcMTY1JywgJ1wxNjYnLCAnXDE2NycsCi0JJ1wxNzAnLCAnXDE3MScsICdcMTcyJywgJ1wxNzMnLCAnXDE3NCcsICdcMTc1JywgJ1wxNzYnLCAnXDE3NycsCi0JJ1wyMDAnLCAnXDIwMScsICdcMjAyJywgJ1wyMDMnLCAnXDIwNCcsICdcMjA1JywgJ1wyMDYnLCAnXDIwNycsCi0JJ1wyMTAnLCAnXDIxMScsICdcMjEyJywgJ1wyMTMnLCAnXDIxNCcsICdcMjE1JywgJ1wyMTYnLCAnXDIxNycsCi0JJ1wyMjAnLCAnXDIyMScsICdcMjIyJywgJ1wyMjMnLCAnXDIyNCcsICdcMjI1JywgJ1wyMjYnLCAnXDIyNycsCi0JJ1wyMzAnLCAnXDIzMScsICdcMjMyJywgJ1wyMzMnLCAnXDIzNCcsICdcMjM1JywgJ1wyMzYnLCAnXDIzNycsCi0JJ1wyNDAnLCAnXDI0MScsICdcMjQyJywgJ1wyNDMnLCAnXDI0NCcsICdcMjQ1JywgJ1wyNDYnLCAnXDI0NycsCi0JJ1wyNTAnLCAnXDI1MScsICdcMjUyJywgJ1wyNTMnLCAnXDI1NCcsICdcMjU1JywgJ1wyNTYnLCAnXDI1NycsCi0JJ1wyNjAnLCAnXDI2MScsICdcMjYyJywgJ1wyNjMnLCAnXDI2NCcsICdcMjY1JywgJ1wyNjYnLCAnXDI2NycsCi0JJ1wyNzAnLCAnXDI3MScsICdcMjcyJywgJ1wyNzMnLCAnXDI3NCcsICdcMjc1JywgJ1wyNzYnLCAnXDI3NycsCi0JJ1wzMDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzMzMnLCAnXDMzNCcsICdcMzM1JywgJ1wzMzYnLCAnXDMzNycsCi0JJ1wzNDAnLCAnXDM0MScsICdcMzQyJywgJ1wzNDMnLCAnXDM0NCcsICdcMzQ1JywgJ1wzNDYnLCAnXDM0NycsCi0JJ1wzNTAnLCAnXDM1MScsICdcMzUyJywgJ1wzNTMnLCAnXDM1NCcsICdcMzU1JywgJ1wzNTYnLCAnXDM1NycsCi0JJ1wzNjAnLCAnXDM2MScsICdcMzYyJywgJ1wzNjMnLCAnXDM2NCcsICdcMzY1JywgJ1wzNjYnLCAnXDM2NycsCi0JJ1wzNzAnLCAnXDM3MScsICdcMzcyJywgJ1wzNzMnLCAnXDM3NCcsICdcMzc1JywgJ1wzNzYnLCAnXDM3NycsCi19OwotCi1pbnQKLXN0cmNhc2VjbXAoczEsIHMyKQotCWNvbnN0IGNoYXIgKnMxLCAqczI7Ci17Ci0JcmVnaXN0ZXIgdV9jaGFyCSpjbSA9IGNoYXJtYXAsCi0JCQkqdXMxID0gKHVfY2hhciAqKXMxLAotCQkJKnVzMiA9ICh1X2NoYXIgKilzMjsKLQotCXdoaWxlIChjbVsqdXMxXSA9PSBjbVsqdXMyKytdKQotCQlpZiAoKnVzMSsrID09ICdcMCcpCi0JCQlyZXR1cm4oMCk7Ci0JcmV0dXJuKGNtWyp1czFdIC0gY21bKi0tdXMyXSk7Ci19Ci0KLWludAotc3RybmNhc2VjbXAoczEsIHMyLCBuKQotCWNvbnN0IGNoYXIgKnMxLCAqczI7Ci0JcmVnaXN0ZXIgaW50IG47Ci17Ci0JcmVnaXN0ZXIgdV9jaGFyCSpjbSA9IGNoYXJtYXAsCi0JCQkqdXMxID0gKHVfY2hhciAqKXMxLAotCQkJKnVzMiA9ICh1X2NoYXIgKilzMjsKLQotCXdoaWxlICgtLW4gPj0gMCAmJiBjbVsqdXMxXSA9PSBjbVsqdXMyKytdKQotCQlpZiAoKnVzMSsrID09ICdcMCcpCi0JCQlyZXR1cm4oMCk7Ci0JcmV0dXJuKG4gPCAwID8gMCA6IGNtWyp1czFdIC0gY21bKi0tdXMyXSk7Ci19CmRpZmYgLS1naXQgYS90Y3AuaCBiL3RjcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM0Y2Q2Li4wMDAwMDAwCi0tLSBhL3RjcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC90Y3AuaCx2IDEuMTEuMi4xIDIwMDUvMTEvMjkgMDk6MDk6MjYgaGFubmVzIEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTkzCi0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIyl0Y3AuaAk4LjEgKEJlcmtlbGV5KSA2LzEwLzkzCi0gKi8KLQotdHlwZWRlZgl1X2ludDMyX3QJdGNwX3NlcTsKLS8qCi0gKiBUQ1AgaGVhZGVyLgotICogUGVyIFJGQyA3OTMsIFNlcHRlbWJlciwgMTk4MS4KLSAqLwotc3RydWN0IHRjcGhkciB7Ci0JdV9pbnQxNl90CXRoX3Nwb3J0OwkJLyogc291cmNlIHBvcnQgKi8KLQl1X2ludDE2X3QJdGhfZHBvcnQ7CQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCi0JdGNwX3NlcQkJdGhfc2VxOwkJCS8qIHNlcXVlbmNlIG51bWJlciAqLwotCXRjcF9zZXEJCXRoX2FjazsJCQkvKiBhY2tub3dsZWRnZW1lbnQgbnVtYmVyICovCi0JdV9pbnQ4X3QJdGhfb2ZmeDI7CQkvKiBkYXRhIG9mZnNldCwgcnN2ZCAqLwotI2RlZmluZSBUSF9PRkYodGgpCSgoKHRoKS0+dGhfb2ZmeDIgJiAweGYwKSA+PiA0KQotCXVfaW50OF90CXRoX2ZsYWdzOwotI2RlZmluZQlUSF9GSU4JMHgwMQotI2RlZmluZQlUSF9TWU4JMHgwMgotI2RlZmluZQlUSF9SU1QJMHgwNAotI2RlZmluZQlUSF9QVVNICTB4MDgKLSNkZWZpbmUJVEhfQUNLCTB4MTAKLSNkZWZpbmUJVEhfVVJHCTB4MjAKLSNkZWZpbmUgVEhfRUNORUNITwkweDQwCS8qIEVDTiBFY2hvICovCi0jZGVmaW5lIFRIX0NXUgkJMHg4MAkvKiBFQ04gQ3duZCBSZWR1Y2VkICovCi0JdV9pbnQxNl90CXRoX3dpbjsJCQkvKiB3aW5kb3cgKi8KLQl1X2ludDE2X3QJdGhfc3VtOwkJCS8qIGNoZWNrc3VtICovCi0JdV9pbnQxNl90CXRoX3VycDsJCQkvKiB1cmdlbnQgcG9pbnRlciAqLwotfTsKLQotI2RlZmluZQlUQ1BPUFRfRU9MCQkwCi0jZGVmaW5lCVRDUE9QVF9OT1AJCTEKLSNkZWZpbmUJVENQT1BUX01BWFNFRwkJMgotI2RlZmluZSAgICBUQ1BPTEVOX01BWFNFRwkJNAotI2RlZmluZQlUQ1BPUFRfV1NDQUxFCQkzCS8qIHdpbmRvdyBzY2FsZSBmYWN0b3IgKHJmYzEzMjMpICovCi0jZGVmaW5lCVRDUE9QVF9TQUNLT0sJCTQJLyogc2VsZWN0aXZlIGFjayBvayAocmZjMjAxOCkgKi8KLSNkZWZpbmUJVENQT1BUX1NBQ0sJCTUJLyogc2VsZWN0aXZlIGFjayAocmZjMjAxOCkgKi8KLSNkZWZpbmUJVENQT1BUX0VDSE8JCTYJLyogZWNobyAocmZjMTA3MikgKi8KLSNkZWZpbmUJVENQT1BUX0VDSE9SRVBMWQk3CS8qIGVjaG8gKHJmYzEwNzIpICovCi0jZGVmaW5lIFRDUE9QVF9USU1FU1RBTVAJOAkvKiB0aW1lc3RhbXAgKHJmYzEzMjMpICovCi0jZGVmaW5lICAgIFRDUE9MRU5fVElNRVNUQU1QCQkxMAotI2RlZmluZSAgICBUQ1BPTEVOX1RTVEFNUF9BUFBBCQkoVENQT0xFTl9USU1FU1RBTVArMikgLyogYXBwZW5kaXggQSAqLwotI2RlZmluZSBUQ1BPUFRfQ0MJCTExCS8qIFQvVENQIENDIG9wdGlvbnMgKHJmYzE2NDQpICovCi0jZGVmaW5lIFRDUE9QVF9DQ05FVwkJMTIJLyogVC9UQ1AgQ0Mgb3B0aW9ucyAocmZjMTY0NCkgKi8KLSNkZWZpbmUgVENQT1BUX0NDRUNITwkJMTMJLyogVC9UQ1AgQ0Mgb3B0aW9ucyAocmZjMTY0NCkgKi8KLSNkZWZpbmUgVENQT1BUX1NJR05BVFVSRQkxOQkvKiBLZXllZCBNRDUgKHJmYzIzODUpICovCi0jZGVmaW5lICAgIFRDUE9MRU5fU0lHTkFUVVJFCQkxOAotI2RlZmluZSBUQ1BfU0lHTEVOIDE2CQkJLyogbGVuZ3RoIG9mIGFuIG9wdGlvbiAxOSBkaWdlc3QgKi8KLSNkZWZpbmUgVENQT1BUX0FVVEggICAgICAgICAgICAgMjAgICAgICAvKiBFbmhhbmNlZCBBVVRIIG9wdGlvbiAqLwotCi0jZGVmaW5lIFRDUE9QVF9UU1RBTVBfSERSCVwKLSAgICAoVENQT1BUX05PUDw8MjR8VENQT1BUX05PUDw8MTZ8VENQT1BUX1RJTUVTVEFNUDw8OHxUQ1BPTEVOX1RJTUVTVEFNUCkKZGlmZiAtLWdpdCBhL3RjcGR1bXAtc3RkaW5jLmggYi90Y3BkdW1wLXN0ZGluYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDA0ZDA5Li4wMDAwMDAwCi0tLSBhL3RjcGR1bXAtc3RkaW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMiAtIDIwMDMKLSAqIE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICoKLSAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvdGNwZHVtcC1zdGRpbmMuaCx2IDEuMTIuMi41IDIwMDYvMDYvMjMgMDI6MDc6MjcgaGFubmVzIEV4cCAkIChMQkwpCi0gKi8KLQotLyoKLSAqIEluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIE9TIGhlYWRlciBmaWxlcyBvbiBXaW5kb3dzIGFuZCB2YXJpb3VzIGZsYXZvcnMKLSAqIG9mIFVOSVgsIGFuZCBhbHNvIGRlZmluZSBzb21lIGFkZGl0aW9uYWwgaXRlbXMgYW5kIGluY2x1ZGUgdmFyaW91cwotICogbm9uLU9TIGhlYWRlciBmaWxlcyBvbiBXaW5kb3dzLCBhbmQ7IHRoaXMgaXNvbGF0ZXMgbW9zdCBvZiB0aGUgcGxhdGZvcm0KLSAqIGRpZmZlcmVuY2VzIHRvIHRoaXMgb25lIGZpbGUuCi0gKi8KLQotI2lmbmRlZiB0Y3BkdW1wX3N0ZGluY19oCi0jZGVmaW5lIHRjcGR1bXBfc3RkaW5jX2gKLQotI2lmZGVmIFdJTjMyCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHdpbnNvY2syLmg+Ci0jaW5jbHVkZSA8V3MydGNwaXAuaD4KLSNpbmNsdWRlICJiaXR0eXBlcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZGIuaD4gIC8qIGluIHdwY2FwJ3MgV2luMzIvaW5jbHVkZSAqLwotCi0jaWYgIWRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fV0FUQ09NQ19fKQotI3VuZGVmIHRvYXNjaWkKLSNkZWZpbmUgaXNhc2NpaSBfX2lzYXNjaWkKLSNkZWZpbmUgdG9hc2NpaSBfX3RvYXNjaWkKLSNkZWZpbmUgc3RhdCBfc3RhdAotI2RlZmluZSBvcGVuIF9vcGVuCi0jZGVmaW5lIGZzdGF0IF9mc3RhdAotI2RlZmluZSByZWFkIF9yZWFkCi0jZGVmaW5lIGNsb3NlIF9jbG9zZQotI2RlZmluZSBPX1JET05MWSBfT19SRE9OTFkKLQotdHlwZWRlZiBzaG9ydCBpbm9fdDsKLSNlbmRpZiAvKiBfX01JTkdXMzJfXyAqLwotCi0jaWZkZWYgX19NSU5HVzMyX18KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0vKiBQcm90b3MgZm9yIG1pc3NpbmcveC5jIGZ1bmN0aW9ucyAoaWRlYWxseSA8bWlzc2luZy9hZGRyaW5mby5oPgotICogc2hvdWxkIGJlIHVzZWQsIGJ1dCBpdCBjbGFzaGVzIHdpdGggPHdzMnRjcGlwLmg+KS4KLSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmluZXRfbnRvcCAoaW50LCBjb25zdCB2b2lkICosIGNoYXIgKiwgc2l6ZV90KTsKLWV4dGVybiBpbnQgaW5ldF9wdG9uIChpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKLWV4dGVybiBpbnQgaW5ldF9hdG9uIChjb25zdCBjaGFyICpjcCwgc3RydWN0IGluX2FkZHIgKmFkZHIpOwotCi0jaWZuZGVmIElORVQ2X0FERFJTVFJMRU4KLSNkZWZpbmUgSU5FVDZfQUREUlNUUkxFTiA0NgotI2VuZGlmCi0KLSNpZm5kZWYgdG9hc2NpaQotI2RlZmluZSB0b2FzY2lpKGMpICgoYykgJiAweDdmKQotI2VuZGlmCi0KLSNpZm5kZWYgY2FkZHJfdAotdHlwZWRlZiBjaGFyKiBjYWRkcl90OwotI2VuZGlmIC8qIGNhZGRyX3QgKi8KLQotI2RlZmluZSBNQVhIT1NUTkFNRUxFTgk2NAotI2RlZmluZQlOSV9NQVhIT1NUCTEwMjUKLSNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCi0jZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCi0jZGVmaW5lIFJFVFNJR1RZUEUgdm9pZAotCi0jZWxzZSAvKiBXSU4zMiAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxuZXRkYi5oPgotI2lmIEhBVkVfSU5UVFlQRVNfSAotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZWxzZQotI2lmIEhBVkVfU1RESU5UX0gKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICi0jaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgkJCS8qIGNvbmNlc3Npb24gdG8gQUlYICovCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+Ci0jaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgotCi0jaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxhcnBhL2luZXQuaD4KLQotI2VuZGlmIC8qIFdJTjMyICovCi0KLSNpZmRlZiBJTkVUNgotI2luY2x1ZGUgImlwNi5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKE1TRE9TKQotICAjZGVmaW5lIEZPUEVOX1JFQURfVFhUICAgInJ0IgotICAjZGVmaW5lIEZPUEVOX1JFQURfQklOICAgInJiIgotICAjZGVmaW5lIEZPUEVOX1dSSVRFX1RYVCAgInd0IgotICAjZGVmaW5lIEZPUEVOX1dSSVRFX0JJTiAgIndiIgotI2Vsc2UKLSAgI2RlZmluZSBGT1BFTl9SRUFEX1RYVCAgICJyIgotICAjZGVmaW5lIEZPUEVOX1JFQURfQklOICAgRk9QRU5fUkVBRF9UWFQKLSAgI2RlZmluZSBGT1BFTl9XUklURV9UWFQgICJ3IgotICAjZGVmaW5lIEZPUEVOX1dSSVRFX0JJTiAgRk9QRU5fV1JJVEVfVFhUCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9fbnRvaGwpCi0gICN1bmRlZiBudG9obAotICAjdW5kZWYgbnRvaHMKLSAgI3VuZGVmIGh0b25sCi0gICN1bmRlZiBodG9ucwotCi0gIGV4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19udG9obCAodW5zaWduZWQgbG9uZyB4KTsKLSAgZXh0ZXJuIF9faW5saW5lX18gdW5zaWduZWQgc2hvcnQgX19udG9ocyAodW5zaWduZWQgc2hvcnQgeCk7Ci0KLSAgI2RlZmluZSBudG9obCh4KSAgX19udG9obCh4KQotICAjZGVmaW5lIG50b2hzKHgpICBfX250b2hzKHgpCi0gICNkZWZpbmUgaHRvbmwoeCkgIF9fbnRvaGwoeCkKLSAgI2RlZmluZSBodG9ucyh4KSAgX19udG9ocyh4KQotCi0gIGV4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19udG9obCAodW5zaWduZWQgbG9uZyB4KQotICB7Ci0gICAgX19hc21fXyAoInhjaGdiICViMCwgJWgwXG5cdCIgICAvKiBzd2FwIGxvd2VyIGJ5dGVzICAqLwotICAgICAgICAgICAgICJyb3JsICAkMTYsICUwXG5cdCIgICAgLyogc3dhcCB3b3JkcyAgICAgICAgKi8KLSAgICAgICAgICAgICAieGNoZ2IgJWIwLCAlaDAiICAgICAgIC8qIHN3YXAgaGlnaGVyIGJ5dGVzICovCi0gICAgICAgICAgICA6ICI9cSIgKHgpIDogIjAiICh4KSk7Ci0gICAgcmV0dXJuICh4KTsKLSAgfQotCi0gIGV4dGVybiBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IF9fbnRvaHMgKHVuc2lnbmVkIHNob3J0IHgpCi0gIHsKLSAgICBfX2FzbV9fICgieGNoZ2IgJWIwLCAlaDAiICAgICAgIC8qIHN3YXAgYnl0ZXMgKi8KLSAgICAgICAgICAgIDogIj1xIiAoeCkgOiAiMCIgKHgpKTsKLSAgICByZXR1cm4gKHgpOwotICB9Ci0jZW5kaWYKLQotI2lmbmRlZiBJTkVUX0FERFJTVFJMRU4KLSNkZWZpbmUgSU5FVF9BRERSU1RSTEVOIDE2Ci0jZW5kaWYKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNlbmRpZiAvKiB0Y3BkdW1wX3N0ZGluY19oICovCmRpZmYgLS1naXQgYS90Y3BkdW1wLjEgYi90Y3BkdW1wLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2I0ZGUuLjAwMDAwMDAKLS0tIGEvdGNwZHVtcC4xCisrKyAvZGV2L251bGwKQEAgLTEsMjM1OSArMCwwIEBACi0uXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC90Y3BkdW1wLjEsdiAxLjE2Ny4yLjExIDIwMDcvMDYvMTUgMjA6MTM6NDkgZ3V5IEV4cCAkIChMQkwpCi0uXCIKLS5cIgkkTmV0QlNEOiB0Y3BkdW1wLjgsdiAxLjkgMjAwMy8wMy8zMSAwMDoxODoxNyBwZXJyeSBFeHAgJAotLlwiCi0uXCIgQ29weXJpZ2h0IChjKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3Ci0uXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0uXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLS5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLS5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0uXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLS5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLS5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLS5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0uXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLS5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotLlwiCi0uVEggVENQRFVNUCAxICAiMTggQXByaWwgMjAwNSIKLS5TSCBOQU1FCi10Y3BkdW1wIFwtIGR1bXAgdHJhZmZpYyBvbiBhIG5ldHdvcmsKLS5TSCBTWU5PUFNJUwotLm5hCi0uQiB0Y3BkdW1wCi1bCi0uQiBcLUFkRGVmbExuTk9wcVJTdHVVdnhYCi1dIFsKLS5CIFwtYwotLkkgY291bnQKLV0KLS5icgotLnRpICs4Ci1bCi0uQiBcLUMKLS5JIGZpbGVfc2l6ZQotXSBbCi0uQiBcLUYKLS5JIGZpbGUKLV0KLS5icgotLnRpICs4Ci1bCi0uQiBcLWkKLS5JIGludGVyZmFjZQotXQotWwotLkIgXC1tCi0uSSBtb2R1bGUKLV0KLVsKLS5CIFwtTQotLkkgc2VjcmV0Ci1dCi0uYnIKLS50aSArOAotWwotLkIgXC1yCi0uSSBmaWxlCi1dCi1bCi0uQiBcLXMKLS5JIHNuYXBsZW4KLV0KLVsKLS5CIFwtVAotLkkgdHlwZQotXQotWwotLkIgXC13Ci0uSSBmaWxlCi1dCi0uYnIKLS50aSArOAotWwotLkIgXC1XCi0uSSBmaWxlY291bnQKLV0KLS5icgotLnRpICs4Ci1bCi0uQiBcLUUKLS5JIHNwaUBpcGFkZHIgYWxnbzpzZWNyZXQsLi4uCi1dCi0uYnIKLS50aSArOAotWwotLkIgXC15Ci0uSSBkYXRhbGlua3R5cGUKLV0KLVsKLS5CIFwtWgotLkkgdXNlcgotXQotLnRpICs4Ci1bCi0uSSBleHByZXNzaW9uCi1dCi0uYnIKLS5hZAotLlNIIERFU0NSSVBUSU9OCi0uTFAKLVxmSVRjcGR1bXBcZlAgcHJpbnRzIG91dCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBwYWNrZXRzIG9uIGEKLW5ldHdvcmsgaW50ZXJmYWNlIHRoYXQgbWF0Y2ggdGhlIGJvb2xlYW4gXGZJZXhwcmVzc2lvblxmUC4gIEl0IGNhbiBhbHNvCi1iZSBydW4gd2l0aCB0aGUKLS5CIFwtdwotZmxhZywgd2hpY2ggY2F1c2VzIGl0IHRvIHNhdmUgdGhlIHBhY2tldCBkYXRhIHRvIGEgZmlsZSBmb3IgbGF0ZXIKLWFuYWx5c2lzLCBhbmQvb3Igd2l0aCB0aGUKLS5CIFwtcgotZmxhZywgd2hpY2ggY2F1c2VzIGl0IHRvIHJlYWQgZnJvbSBhIHNhdmVkIHBhY2tldCBmaWxlIHJhdGhlciB0aGFuIHRvCi1yZWFkIHBhY2tldHMgZnJvbSBhIG5ldHdvcmsgaW50ZXJmYWNlLiAgSW4gYWxsIGNhc2VzLCBvbmx5IHBhY2tldHMgdGhhdAotbWF0Y2gKLS5JIGV4cHJlc3Npb24KLXdpbGwgYmUgcHJvY2Vzc2VkIGJ5Ci0uSVIgdGNwZHVtcCAuCi0uTFAKLS5JIFRjcGR1bXAKLXdpbGwsIGlmIG5vdCBydW4gd2l0aCB0aGUKLS5CIFwtYwotZmxhZywgY29udGludWUgY2FwdHVyaW5nIHBhY2tldHMgdW50aWwgaXQgaXMgaW50ZXJydXB0ZWQgYnkgYSBTSUdJTlQKLXNpZ25hbCAoZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgYnkgdHlwaW5nIHlvdXIgaW50ZXJydXB0IGNoYXJhY3RlciwKLXR5cGljYWxseSBjb250cm9sLUMpIG9yIGEgU0lHVEVSTSBzaWduYWwgKHR5cGljYWxseSBnZW5lcmF0ZWQgd2l0aCB0aGUKLS5CUiBraWxsICgxKQotY29tbWFuZCk7IGlmIHJ1biB3aXRoIHRoZQotLkIgXC1jCi1mbGFnLCBpdCB3aWxsIGNhcHR1cmUgcGFja2V0cyB1bnRpbCBpdCBpcyBpbnRlcnJ1cHRlZCBieSBhIFNJR0lOVCBvcgotU0lHVEVSTSBzaWduYWwgb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGFja2V0cyBoYXZlIGJlZW4gcHJvY2Vzc2VkLgotLkxQCi1XaGVuCi0uSSB0Y3BkdW1wCi1maW5pc2hlcyBjYXB0dXJpbmcgcGFja2V0cywgaXQgd2lsbCByZXBvcnQgY291bnRzIG9mOgotLklQCi1wYWNrZXRzIGBgY2FwdHVyZWQnJyAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdAotLkkgdGNwZHVtcAotaGFzIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWQpOwotLklQCi1wYWNrZXRzIGBgcmVjZWl2ZWQgYnkgZmlsdGVyJycgKHRoZSBtZWFuaW5nIG9mIHRoaXMgZGVwZW5kcyBvbiB0aGUgT1Mgb24KLXdoaWNoIHlvdSdyZSBydW5uaW5nCi0uSVIgdGNwZHVtcCAsCi1hbmQgcG9zc2libHkgb24gdGhlIHdheSB0aGUgT1Mgd2FzIGNvbmZpZ3VyZWQgLSBpZiBhIGZpbHRlciB3YXMKLXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvbiBzb21lIE9TZXMgaXQgY291bnRzIHBhY2tldHMgcmVnYXJkbGVzcwotb2Ygd2hldGhlciB0aGV5IHdlcmUgbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24gYW5kLCBldmVuIGlmIHRoZXkKLXdlcmUgbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotLkkgdGNwZHVtcAotaGFzIHJlYWQgYW5kIHByb2Nlc3NlZCB0aGVtIHlldCwgb24gb3RoZXIgT1NlcyBpdCBjb3VudHMgb25seSBwYWNrZXRzIHRoYXQgd2VyZQotbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyCi0uSSB0Y3BkdW1wCi1oYXMgcmVhZCBhbmQgcHJvY2Vzc2VkIHRoZW0geWV0LCBhbmQgb24gb3RoZXIgT1NlcyBpdCBjb3VudHMgb25seQotcGFja2V0cyB0aGF0IHdlcmUgbWF0Y2hlZCBieSB0aGUgZmlsdGVyIGV4cHJlc3Npb24gYW5kIHdlcmUgcHJvY2Vzc2VkIGJ5Ci0uSVIgdGNwZHVtcCApOwotLklQCi1wYWNrZXRzIGBgZHJvcHBlZCBieSBrZXJuZWwnJyAodGhpcyBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlCi1kcm9wcGVkLCBkdWUgdG8gYSBsYWNrIG9mIGJ1ZmZlciBzcGFjZSwgYnkgdGhlIHBhY2tldCBjYXB0dXJlIG1lY2hhbmlzbQotaW4gdGhlIE9TIG9uIHdoaWNoCi0uSSB0Y3BkdW1wCi1pcyBydW5uaW5nLCBpZiB0aGUgT1MgcmVwb3J0cyB0aGF0IGluZm9ybWF0aW9uIHRvIGFwcGxpY2F0aW9uczsgaWYgbm90LAotaXQgd2lsbCBiZSByZXBvcnRlZCBhcyAwKS4KLS5MUAotT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGUgU0lHSU5GTyBzaWduYWwsIHN1Y2ggYXMgbW9zdCBCU0RzCi0oaW5jbHVkaW5nIE1hYyBPUyBYKSBhbmQgRGlnaXRhbC9UcnU2NCBVTklYLCBpdCB3aWxsIHJlcG9ydCB0aG9zZSBjb3VudHMKLXdoZW4gaXQgcmVjZWl2ZXMgYSBTSUdJTkZPIHNpZ25hbCAoZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgYnkgdHlwaW5nCi15b3VyIGBgc3RhdHVzJycgY2hhcmFjdGVyLCB0eXBpY2FsbHkgY29udHJvbC1ULCBhbHRob3VnaCBvbiBzb21lCi1wbGF0Zm9ybXMsIHN1Y2ggYXMgTWFjIE9TIFgsIHRoZSBgYHN0YXR1cycnIGNoYXJhY3RlciBpcyBub3Qgc2V0IGJ5Ci1kZWZhdWx0LCBzbyB5b3UgbXVzdCBzZXQgaXQgd2l0aAotLkJSIHN0dHkgKDEpCi1pbiBvcmRlciB0byB1c2UgaXQpIGFuZCB3aWxsIGNvbnRpbnVlIGNhcHR1cmluZyBwYWNrZXRzLgotLkxQCi1SZWFkaW5nIHBhY2tldHMgZnJvbSBhIG5ldHdvcmsgaW50ZXJmYWNlIG1heSByZXF1aXJlIHRoYXQgeW91IGhhdmUKLXNwZWNpYWwgcHJpdmlsZWdlczoKLS5UUAotLkIgVW5kZXIgU3VuT1MgMy54IG9yIDQueCB3aXRoIE5JVCBvciBCUEY6Ci1Zb3UgbXVzdCBoYXZlIHJlYWQgYWNjZXNzIHRvCi0uSSAvZGV2L25pdAotb3IKLS5JUiAvZGV2L2JwZiogLgotLlRQCi0uQiBVbmRlciBTb2xhcmlzIHdpdGggRExQSToKLVlvdSBtdXN0IGhhdmUgcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhlIG5ldHdvcmsgcHNldWRvIGRldmljZSwgZS5nLgotLklSIC9kZXYvbGUgLgotT24gYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBTb2xhcmlzLCBob3dldmVyLCB0aGlzIGlzIG5vdCBzdWZmaWNpZW50IHRvCi1hbGxvdwotLkkgdGNwZHVtcAotdG8gY2FwdHVyZSBpbiBwcm9taXNjdW91cyBtb2RlOyBvbiB0aG9zZSB2ZXJzaW9ucyBvZiBTb2xhcmlzLCB5b3UgbXVzdAotYmUgcm9vdCwgb3IKLS5JIHRjcGR1bXAKLW11c3QgYmUgaW5zdGFsbGVkIHNldHVpZCB0byByb290LCBpbiBvcmRlciB0byBjYXB0dXJlIGluIHByb21pc2N1b3VzCi1tb2RlLiAgTm90ZSB0aGF0LCBvbiBtYW55IChwZXJoYXBzIGFsbCkgaW50ZXJmYWNlcywgaWYgeW91IGRvbid0IGNhcHR1cmUKLWluIHByb21pc2N1b3VzIG1vZGUsIHlvdSB3aWxsIG5vdCBzZWUgYW55IG91dGdvaW5nIHBhY2tldHMsIHNvIGEgY2FwdHVyZQotbm90IGRvbmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBtYXkgbm90IGJlIHZlcnkgdXNlZnVsLgotLlRQCi0uQiBVbmRlciBIUC1VWCB3aXRoIERMUEk6Ci1Zb3UgbXVzdCBiZSByb290IG9yCi0uSSB0Y3BkdW1wCi1tdXN0IGJlIGluc3RhbGxlZCBzZXR1aWQgdG8gcm9vdC4KLS5UUAotLkIgVW5kZXIgSVJJWCB3aXRoIHNub29wOgotWW91IG11c3QgYmUgcm9vdCBvcgotLkkgdGNwZHVtcAotbXVzdCBiZSBpbnN0YWxsZWQgc2V0dWlkIHRvIHJvb3QuCi0uVFAKLS5CIFVuZGVyIExpbnV4OgotWW91IG11c3QgYmUgcm9vdCBvcgotLkkgdGNwZHVtcAotbXVzdCBiZSBpbnN0YWxsZWQgc2V0dWlkIHRvIHJvb3QgKHVubGVzcyB5b3VyIGRpc3RyaWJ1dGlvbiBoYXMgYSBrZXJuZWwKLXRoYXQgc3VwcG9ydHMgY2FwYWJpbGl0eSBiaXRzIHN1Y2ggYXMgQ0FQX05FVF9SQVcgYW5kIGNvZGUgdG8gYWxsb3cKLXRob3NlIGNhcGFiaWxpdHkgYml0cyB0byBiZSBnaXZlbiB0byBwYXJ0aWN1bGFyIGFjY291bnRzIGFuZCB0byBjYXVzZQotdGhvc2UgYml0cyB0byBiZSBzZXQgb24gYSB1c2VyJ3MgaW5pdGlhbCBwcm9jZXNzZXMgd2hlbiB0aGV5IGxvZyBpbiwgaW4KLXdoaWNoIGNhc2UgeW91ICBtdXN0IGhhdmUgQ0FQX05FVF9SQVcgaW4gb3JkZXIgdG8gY2FwdHVyZSBhbmQKLUNBUF9ORVRfQURNSU4gdG8gZW51bWVyYXRlIG5ldHdvcmsgZGV2aWNlcyB3aXRoLCBmb3IgZXhhbXBsZSwgdGhlCi0uQiBcLUQKLWZsYWcpLgotLlRQCi0uQiBVbmRlciBVTFRSSVggYW5kIERpZ2l0YWwgVU5JWC9UcnU2NCBVTklYOgotQW55IHVzZXIgbWF5IGNhcHR1cmUgbmV0d29yayB0cmFmZmljIHdpdGgKLS5JUiB0Y3BkdW1wIC4KLUhvd2V2ZXIsIG5vIHVzZXIgKG5vdCBldmVuIHRoZSBzdXBlci11c2VyKSBjYW4gY2FwdHVyZSBpbiBwcm9taXNjdW91cwotbW9kZSBvbiBhbiBpbnRlcmZhY2UgdW5sZXNzIHRoZSBzdXBlci11c2VyIGhhcyBlbmFibGVkIHByb21pc2N1b3VzLW1vZGUKLW9wZXJhdGlvbiBvbiB0aGF0IGludGVyZmFjZSB1c2luZwotLklSIHBmY29uZmlnICg4KSwKLWFuZCBubyB1c2VyIChub3QgZXZlbiB0aGUgc3VwZXItdXNlcikgY2FuIGNhcHR1cmUgdW5pY2FzdCB0cmFmZmljCi1yZWNlaXZlZCBieSBvciBzZW50IGJ5IHRoZSBtYWNoaW5lIG9uIGFuIGludGVyZmFjZSB1bmxlc3MgdGhlIHN1cGVyLXVzZXIKLWhhcyBlbmFibGVkIGNvcHktYWxsLW1vZGUgb3BlcmF0aW9uIG9uIHRoYXQgaW50ZXJmYWNlIHVzaW5nCi0uSVIgcGZjb25maWcgLAotc28KLS5JIHVzZWZ1bAotcGFja2V0IGNhcHR1cmUgb24gYW4gaW50ZXJmYWNlIHByb2JhYmx5IHJlcXVpcmVzIHRoYXQgZWl0aGVyCi1wcm9taXNjdW91cy1tb2RlIG9yIGNvcHktYWxsLW1vZGUgb3BlcmF0aW9uLCBvciBib3RoIG1vZGVzIG9mCi1vcGVyYXRpb24sIGJlIGVuYWJsZWQgb24gdGhhdCBpbnRlcmZhY2UuCi0uVFAKLS5CIFVuZGVyIEJTRCAodGhpcyBpbmNsdWRlcyBNYWMgT1MgWCk6Ci1Zb3UgbXVzdCBoYXZlIHJlYWQgYWNjZXNzIHRvCi0uSSAvZGV2L2JwZioKLW9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGEgY2xvbmluZyBCUEYgZGV2aWNlLCBvciB0bwotLkkgL2Rldi9icGYKLW9uIHN5c3RlbXMgdGhhdCBkby4KLU9uIEJTRHMgd2l0aCBhIGRldmZzICh0aGlzIGluY2x1ZGVzIE1hYyBPUyBYKSwgdGhpcyBtaWdodCBpbnZvbHZlIG1vcmUKLXRoYW4ganVzdCBoYXZpbmcgc29tZWJvZHkgd2l0aCBzdXBlci11c2VyIGFjY2VzcyBzZXR0aW5nIHRoZSBvd25lcnNoaXAKLW9yIHBlcm1pc3Npb25zIG9uIHRoZSBCUEYgZGV2aWNlcyAtIGl0IG1pZ2h0IGludm9sdmUgY29uZmlndXJpbmcgZGV2ZnMKLXRvIHNldCB0aGUgb3duZXJzaGlwIG9yIHBlcm1pc3Npb25zIGV2ZXJ5IHRpbWUgdGhlIHN5c3RlbSBpcyBib290ZWQsCi1pZiB0aGUgc3lzdGVtIGV2ZW4gc3VwcG9ydHMgdGhhdDsgaWYgaXQgZG9lc24ndCBzdXBwb3J0IHRoYXQsIHlvdSBtaWdodAotaGF2ZSB0byBmaW5kIHNvbWUgb3RoZXIgd2F5IHRvIG1ha2UgdGhhdCBoYXBwZW4gYXQgYm9vdCB0aW1lLgotLkxQCi1SZWFkaW5nIGEgc2F2ZWQgcGFja2V0IGZpbGUgZG9lc24ndCByZXF1aXJlIHNwZWNpYWwgcHJpdmlsZWdlcy4KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtQQotUHJpbnQgZWFjaCBwYWNrZXQgKG1pbnVzIGl0cyBsaW5rIGxldmVsIGhlYWRlcikgaW4gQVNDSUkuICBIYW5keSBmb3IKLWNhcHR1cmluZyB3ZWIgcGFnZXMuCi0uVFAKLS5CIFwtYwotRXhpdCBhZnRlciByZWNlaXZpbmcgXGZJY291bnRcZlAgcGFja2V0cy4KLS5UUAotLkIgXC1DCi1CZWZvcmUgd3JpdGluZyBhIHJhdyBwYWNrZXQgdG8gYSBzYXZlZmlsZSwgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcwotY3VycmVudGx5IGxhcmdlciB0aGFuIFxmSWZpbGVfc2l6ZVxmUCBhbmQsIGlmIHNvLCBjbG9zZSB0aGUgY3VycmVudAotc2F2ZWZpbGUgYW5kIG9wZW4gYSBuZXcgb25lLiAgU2F2ZWZpbGVzIGFmdGVyIHRoZSBmaXJzdCBzYXZlZmlsZSB3aWxsCi1oYXZlIHRoZSBuYW1lIHNwZWNpZmllZCB3aXRoIHRoZQotLkIgXC13Ci1mbGFnLCB3aXRoIGEgbnVtYmVyIGFmdGVyIGl0LCBzdGFydGluZyBhdCAxIGFuZCBjb250aW51aW5nIHVwd2FyZC4KLVRoZSB1bml0cyBvZiBcZklmaWxlX3NpemVcZlAgYXJlIG1pbGxpb25zIG9mIGJ5dGVzICgxLDAwMCwwMDAgYnl0ZXMsCi1ub3QgMSwwNDgsNTc2IGJ5dGVzKS4KLS5UUAotLkIgXC1kCi1EdW1wIHRoZSBjb21waWxlZCBwYWNrZXQtbWF0Y2hpbmcgY29kZSBpbiBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gdG8KLXN0YW5kYXJkIG91dHB1dCBhbmQgc3RvcC4KLS5UUAotLkIgXC1kZAotRHVtcCBwYWNrZXQtbWF0Y2hpbmcgY29kZSBhcyBhCi0uQiBDCi1wcm9ncmFtIGZyYWdtZW50LgotLlRQCi0uQiBcLWRkZAotRHVtcCBwYWNrZXQtbWF0Y2hpbmcgY29kZSBhcyBkZWNpbWFsIG51bWJlcnMgKHByZWNlZGVkIHdpdGggYSBjb3VudCkuCi0uVFAKLS5CIFwtRAotUHJpbnQgdGhlIGxpc3Qgb2YgdGhlIG5ldHdvcmsgaW50ZXJmYWNlcyBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSBhbmQgb24KLXdoaWNoCi0uSSB0Y3BkdW1wCi1jYW4gY2FwdHVyZSBwYWNrZXRzLiAgRm9yIGVhY2ggbmV0d29yayBpbnRlcmZhY2UsIGEgbnVtYmVyIGFuZCBhbgotaW50ZXJmYWNlIG5hbWUsIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUKLWludGVyZmFjZSwgaXMgcHJpbnRlZC4gIFRoZSBpbnRlcmZhY2UgbmFtZSBvciB0aGUgbnVtYmVyIGNhbiBiZSBzdXBwbGllZAotdG8gdGhlCi0uQiBcLWkKLWZsYWcgdG8gc3BlY2lmeSBhbiBpbnRlcmZhY2Ugb24gd2hpY2ggdG8gY2FwdHVyZS4KLS5JUAotVGhpcyBjYW4gYmUgdXNlZnVsIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGEgY29tbWFuZCB0byBsaXN0IHRoZW0KLShlLmcuLCBXaW5kb3dzIHN5c3RlbXMsIG9yIFVOSVggc3lzdGVtcyBsYWNraW5nCi0uQlIgImlmY29uZmlnIFwtYSIgKTsKLXRoZSBudW1iZXIgY2FuIGJlIHVzZWZ1bCBvbiBXaW5kb3dzIDIwMDAgYW5kIGxhdGVyIHN5c3RlbXMsIHdoZXJlIHRoZQotaW50ZXJmYWNlIG5hbWUgaXMgYSBzb21ld2hhdCBjb21wbGV4IHN0cmluZy4KLS5JUAotVGhlCi0uQiBcLUQKLWZsYWcgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGlmCi0uSSB0Y3BkdW1wCi13YXMgYnVpbHQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mCi0uSSBsaWJwY2FwCi10aGF0IGxhY2tzIHRoZQotLkIgcGNhcF9maW5kYWxsZGV2cygpCi1mdW5jdGlvbi4KLS5UUAotLkIgXC1lCi1QcmludCB0aGUgbGluay1sZXZlbCBoZWFkZXIgb24gZWFjaCBkdW1wIGxpbmUuCi0uVFAKLS5CIFwtRQotVXNlIFxmSXNwaUBpcGFkZHIgYWxnbzpzZWNyZXRcZlAgZm9yIGRlY3J5cHRpbmcgSVBzZWMgRVNQIHBhY2tldHMgdGhhdAotYXJlIGFkZHJlc3NlZCB0byBcZklhZGRyXGZQIGFuZCBjb250YWluIFNlY3VyaXR5IFBhcmFtZXRlciBJbmRleCB2YWx1ZQotXGZJc3BpXGZQLiBUaGlzIGNvbWJpbmF0aW9uIG1heSBiZSByZXBlYXRlZCB3aXRoIGNvbW1hIG9yIG5ld2xpbmUgc2VwZXJhdGlvbi4KLS5JUAotTm90ZSB0aGF0IHNldHRpbmcgdGhlIHNlY3JldCBmb3IgSVB2NCBFU1AgcGFja2V0cyBpcyBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLgotLklQCi1BbGdvcml0aG1zIG1heSBiZQotXGZCZGVzLWNiY1xmUCwKLVxmQjNkZXMtY2JjXGZQLAotXGZCYmxvd2Zpc2gtY2JjXGZQLAotXGZCcmMzLWNiY1xmUCwKLVxmQmNhc3QxMjgtY2JjXGZQLCBvcgotXGZCbm9uZVxmUC4KLVRoZSBkZWZhdWx0IGlzIFxmQmRlcy1jYmNcZlAuCi1UaGUgYWJpbGl0eSB0byBkZWNyeXB0IHBhY2tldHMgaXMgb25seSBwcmVzZW50IGlmIFxmSXRjcGR1bXBcZlAgd2FzIGNvbXBpbGVkCi13aXRoIGNyeXB0b2dyYXBoeSBlbmFibGVkLgotLklQCi1cZklzZWNyZXRcZlAgaXMgdGhlIEFTQ0lJIHRleHQgZm9yIEVTUCBzZWNyZXQga2V5LiAKLUlmIHByZWNlZWRlZCBieSAweCwgdGhlbiBhIGhleCB2YWx1ZSB3aWxsIGJlIHJlYWQuCi0uSVAKLVRoZSBvcHRpb24gYXNzdW1lcyBSRkMyNDA2IEVTUCwgbm90IFJGQzE4MjcgRVNQLgotVGhlIG9wdGlvbiBpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGFuZAotdGhlIHVzZSBvZiB0aGlzIG9wdGlvbiB3aXRoIGEgdHJ1ZSBgc2VjcmV0JyBrZXkgaXMgZGlzY291cmFnZWQuCi1CeSBwcmVzZW50aW5nIElQc2VjIHNlY3JldCBrZXkgb250byBjb21tYW5kIGxpbmUKLXlvdSBtYWtlIGl0IHZpc2libGUgdG8gb3RoZXJzLCB2aWEKLS5JUiBwcyAoMSkKLWFuZCBvdGhlciBvY2Nhc2lvbnMuCi0uSVAKLUluIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBzeW50YXgsIHRoZSBzeW50YXggXGZJZmlsZSBuYW1lXGZQIG1heSBiZSB1c2VkCi10byBoYXZlIHRjcGR1bXAgcmVhZCB0aGUgcHJvdmlkZWQgZmlsZSBpbi4gVGhlIGZpbGUgaXMgb3BlbmVkIHVwb24gCi1yZWNlaXZpbmcgdGhlIGZpcnN0IEVTUCBwYWNrZXQsIHNvIGFueSBzcGVjaWFsIHBlcm1pc3Npb25zIHRoYXQgdGNwZHVtcAotbWF5IGhhdmUgYmVlbiBnaXZlbiBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gZ2l2ZW4gdXAuCi0uVFAKLS5CIFwtZgotUHJpbnQgYGZvcmVpZ24nIElQdjQgYWRkcmVzc2VzIG51bWVyaWNhbGx5IHJhdGhlciB0aGFuIHN5bWJvbGljYWxseQotKHRoaXMgb3B0aW9uIGlzIGludGVuZGVkIHRvIGdldCBhcm91bmQgc2VyaW91cyBicmFpbiBkYW1hZ2UgaW4KLVN1bidzIE5JUyBzZXJ2ZXIgXChlbSB1c3VhbGx5IGl0IGhhbmdzIGZvcmV2ZXIgdHJhbnNsYXRpbmcgbm9uLWxvY2FsCi1pbnRlcm5ldCBudW1iZXJzKS4KLS5JUAotVGhlIHRlc3QgZm9yIGBmb3JlaWduJyBJUHY0IGFkZHJlc3NlcyBpcyBkb25lIHVzaW5nIHRoZSBJUHY0IGFkZHJlc3MgYW5kCi1uZXRtYXNrIG9mIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggY2FwdHVyZSBpcyBiZWluZyBkb25lLiAgSWYgdGhhdAotYWRkcmVzcyBvciBuZXRtYXNrIGFyZSBub3QgYXZhaWxhYmxlLCBhdmFpbGFibGUsIGVpdGhlciBiZWNhdXNlIHRoZQotaW50ZXJmYWNlIG9uIHdoaWNoIGNhcHR1cmUgaXMgYmVpbmcgZG9uZSBoYXMgbm8gYWRkcmVzcyBvciBuZXRtYXNrIG9yCi1iZWNhdXNlIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUgb24gdGhlIExpbnV4ICJhbnkiIGludGVyZmFjZSwgd2hpY2gKLWNhbiBjYXB0dXJlIG9uIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLCB0aGlzIG9wdGlvbiB3aWxsIG5vdCB3b3JrCi1jb3JyZWN0bHkuCi0uVFAKLS5CIFwtRgotVXNlIFxmSWZpbGVcZlAgYXMgaW5wdXQgZm9yIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbi4KLUFuIGFkZGl0aW9uYWwgZXhwcmVzc2lvbiBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGlnbm9yZWQuCi0uVFAKLS5CIFwtaQotTGlzdGVuIG9uIFxmSWludGVyZmFjZVxmUC4KLUlmIHVuc3BlY2lmaWVkLCBcZkl0Y3BkdW1wXGZQIHNlYXJjaGVzIHRoZSBzeXN0ZW0gaW50ZXJmYWNlIGxpc3QgZm9yIHRoZQotbG93ZXN0IG51bWJlcmVkLCBjb25maWd1cmVkIHVwIGludGVyZmFjZSAoZXhjbHVkaW5nIGxvb3BiYWNrKS4KLVRpZXMgYXJlIGJyb2tlbiBieSBjaG9vc2luZyB0aGUgZWFybGllc3QgbWF0Y2guCi0uSVAKLU9uIExpbnV4IHN5c3RlbXMgd2l0aCAyLjIgb3IgbGF0ZXIga2VybmVscywgYW4KLS5JIGludGVyZmFjZQotYXJndW1lbnQgb2YgYGBhbnknJyBjYW4gYmUgdXNlZCB0byBjYXB0dXJlIHBhY2tldHMgZnJvbSBhbGwgaW50ZXJmYWNlcy4KLU5vdGUgdGhhdCBjYXB0dXJlcyBvbiB0aGUgYGBhbnknJyBkZXZpY2Ugd2lsbCBub3QgYmUgZG9uZSBpbiBwcm9taXNjdW91cwotbW9kZS4KLS5JUAotSWYgdGhlCi0uQiBcLUQKLWZsYWcgaXMgc3VwcG9ydGVkLCBhbiBpbnRlcmZhY2UgbnVtYmVyIGFzIHByaW50ZWQgYnkgdGhhdCBmbGFnIGNhbiBiZQotdXNlZCBhcyB0aGUKLS5JIGludGVyZmFjZQotYXJndW1lbnQuCi0uVFAKLS5CIFwtbAotTWFrZSBzdGRvdXQgbGluZSBidWZmZXJlZC4KLVVzZWZ1bCBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIGRhdGEKLXdoaWxlIGNhcHR1cmluZyBpdC4KLUUuZy4sCi0uYnIKLWBgdGNwZHVtcFwgXCBcLWxcIFwgfFwgXCB0ZWUgZGF0Jycgb3IKLWBgdGNwZHVtcFwgXCBcLWwgXCBcID4gZGF0XCBcICZcIFwgdGFpbFwgXCBcLWZcIFwgZGF0JycuCi0uVFAKLS5CIFwtTAotTGlzdCB0aGUga25vd24gZGF0YSBsaW5rIHR5cGVzIGZvciB0aGUgaW50ZXJmYWNlIGFuZCBleGl0LgotLlRQCi0uQiBcLW0KLUxvYWQgU01JIE1JQiBtb2R1bGUgZGVmaW5pdGlvbnMgZnJvbSBmaWxlIFxmSW1vZHVsZVxmUi4KLVRoaXMgb3B0aW9uCi1jYW4gYmUgdXNlZCBzZXZlcmFsIHRpbWVzIHRvIGxvYWQgc2V2ZXJhbCBNSUIgbW9kdWxlcyBpbnRvIFxmSXRjcGR1bXBcZlAuCi0uVFAKLS5CIFwtTQotVXNlIFxmSXNlY3JldFxmUCBhcyBhIHNoYXJlZCBzZWNyZXQgZm9yIHZhbGlkYXRpbmcgdGhlIGRpZ2VzdHMgZm91bmQgaW4KLVRDUCBzZWdtZW50cyB3aXRoIHRoZSBUQ1AtTUQ1IG9wdGlvbiAoUkZDIDIzODUpLCBpZiBwcmVzZW50LgotLlRQCi0uQiBcLW4KLURvbid0IGNvbnZlcnQgYWRkcmVzc2VzIChpLmUuLCBob3N0IGFkZHJlc3NlcywgcG9ydCBudW1iZXJzLCBldGMuKSB0byBuYW1lcy4KLS5UUAotLkIgXC1OCi1Eb24ndCBwcmludCBkb21haW4gbmFtZSBxdWFsaWZpY2F0aW9uIG9mIGhvc3QgbmFtZXMuCi1FLmcuLAotaWYgeW91IGdpdmUgdGhpcyBmbGFnIHRoZW4gXGZJdGNwZHVtcFxmUCB3aWxsIHByaW50IGBgbmljJycKLWluc3RlYWQgb2YgYGBuaWMuZGRuLm1pbCcnLgotLlRQCi0uQiBcLU8KLURvIG5vdCBydW4gdGhlIHBhY2tldC1tYXRjaGluZyBjb2RlIG9wdGltaXplci4KLVRoaXMgaXMgdXNlZnVsIG9ubHkKLWlmIHlvdSBzdXNwZWN0IGEgYnVnIGluIHRoZSBvcHRpbWl6ZXIuCi0uVFAKLS5CIFwtcAotXGZJRG9uJ3RcZlAgcHV0IHRoZSBpbnRlcmZhY2UKLWludG8gcHJvbWlzY3VvdXMgbW9kZS4KLU5vdGUgdGhhdCB0aGUgaW50ZXJmYWNlIG1pZ2h0IGJlIGluIHByb21pc2N1b3VzCi1tb2RlIGZvciBzb21lIG90aGVyIHJlYXNvbjsgaGVuY2UsIGAtcCcgY2Fubm90IGJlIHVzZWQgYXMgYW4gYWJicmV2aWF0aW9uIGZvcgotYGV0aGVyIGhvc3Qge2xvY2FsLWh3LWFkZHJ9IG9yIGV0aGVyIGJyb2FkY2FzdCcuCi0uVFAKLS5CIFwtcQotUXVpY2sgKHF1aWV0Pykgb3V0cHV0LgotUHJpbnQgbGVzcyBwcm90b2NvbCBpbmZvcm1hdGlvbiBzbyBvdXRwdXQKLWxpbmVzIGFyZSBzaG9ydGVyLgotLlRQCi0uQiBcLVIKLUFzc3VtZSBFU1AvQUggcGFja2V0cyB0byBiZSBiYXNlZCBvbiBvbGQgc3BlY2lmaWNhdGlvbiAoUkZDMTgyNSB0byBSRkMxODI5KS4KLUlmIHNwZWNpZmllZCwgXGZJdGNwZHVtcFxmUCB3aWxsIG5vdCBwcmludCByZXBsYXkgcHJldmVudGlvbiBmaWVsZC4KLVNpbmNlIHRoZXJlIGlzIG5vIHByb3RvY29sIHZlcnNpb24gZmllbGQgaW4gRVNQL0FIIHNwZWNpZmljYXRpb24sCi1cZkl0Y3BkdW1wXGZQIGNhbm5vdCBkZWR1Y2UgdGhlIHZlcnNpb24gb2YgRVNQL0FIIHByb3RvY29sLgotLlRQCi0uQiBcLXIKLVJlYWQgcGFja2V0cyBmcm9tIFxmSWZpbGVcZlIgKHdoaWNoIHdhcyBjcmVhdGVkIHdpdGggdGhlCi0uQiBcLXcKLW9wdGlvbikuCi1TdGFuZGFyZCBpbnB1dCBpcyB1c2VkIGlmIFxmSWZpbGVcZlIgaXMgYGAtJycuCi0uVFAKLS5CIFwtUwotUHJpbnQgYWJzb2x1dGUsIHJhdGhlciB0aGFuIHJlbGF0aXZlLCBUQ1Agc2VxdWVuY2UgbnVtYmVycy4KLS5UUAotLkIgXC1zCi1TbmFyZiBcZklzbmFwbGVuXGZQIGJ5dGVzIG9mIGRhdGEgZnJvbSBlYWNoIHBhY2tldCByYXRoZXIgdGhhbiB0aGUKLWRlZmF1bHQgb2YgNjggKHdpdGggU3VuT1MncyBOSVQsIHRoZSBtaW5pbXVtIGlzIGFjdHVhbGx5IDk2KS4KLTY4IGJ5dGVzIGlzIGFkZXF1YXRlIGZvciBJUCwgSUNNUCwgVENQCi1hbmQgVURQIGJ1dCBtYXkgdHJ1bmNhdGUgcHJvdG9jb2wgaW5mb3JtYXRpb24gZnJvbSBuYW1lIHNlcnZlciBhbmQgTkZTCi1wYWNrZXRzIChzZWUgYmVsb3cpLgotUGFja2V0cyB0cnVuY2F0ZWQgYmVjYXVzZSBvZiBhIGxpbWl0ZWQgc25hcHNob3QKLWFyZSBpbmRpY2F0ZWQgaW4gdGhlIG91dHB1dCB3aXRoIGBgW3xcZklwcm90b1xmUF0nJywgd2hlcmUgXGZJcHJvdG9cZlAKLWlzIHRoZSBuYW1lIG9mIHRoZSBwcm90b2NvbCBsZXZlbCBhdCB3aGljaCB0aGUgdHJ1bmNhdGlvbiBoYXMgb2NjdXJyZWQuCi1Ob3RlIHRoYXQgdGFraW5nIGxhcmdlciBzbmFwc2hvdHMgYm90aCBpbmNyZWFzZXMKLXRoZSBhbW91bnQgb2YgdGltZSBpdCB0YWtlcyB0byBwcm9jZXNzIHBhY2tldHMgYW5kLCBlZmZlY3RpdmVseSwKLWRlY3JlYXNlcyB0aGUgYW1vdW50IG9mIHBhY2tldCBidWZmZXJpbmcuCi1UaGlzIG1heSBjYXVzZSBwYWNrZXRzIHRvIGJlCi1sb3N0LgotWW91IHNob3VsZCBsaW1pdCBcZklzbmFwbGVuXGZQIHRvIHRoZSBzbWFsbGVzdCBudW1iZXIgdGhhdCB3aWxsCi1jYXB0dXJlIHRoZSBwcm90b2NvbCBpbmZvcm1hdGlvbiB5b3UncmUgaW50ZXJlc3RlZCBpbi4KLVNldHRpbmcKLVxmSXNuYXBsZW5cZlAgdG8gMCBtZWFucyB1c2UgdGhlIHJlcXVpcmVkIGxlbmd0aCB0byBjYXRjaCB3aG9sZSBwYWNrZXRzLgotLlRQCi0uQiBcLVQKLUZvcmNlIHBhY2tldHMgc2VsZWN0ZWQgYnkgIlxmSWV4cHJlc3Npb25cZlAiIHRvIGJlIGludGVycHJldGVkIHRoZQotc3BlY2lmaWVkIFxmSXR5cGVcZlIuCi1DdXJyZW50bHkga25vd24gdHlwZXMgYXJlCi1cZkJhb2R2XGZSIChBZC1ob2MgT24tZGVtYW5kIERpc3RhbmNlIFZlY3RvciBwcm90b2NvbCksCi1cZkJjbmZwXGZSIChDaXNjbyBOZXRGbG93IHByb3RvY29sKSwKLVxmQnJwY1xmUiAoUmVtb3RlIFByb2NlZHVyZSBDYWxsKSwKLVxmQnJ0cFxmUiAoUmVhbC1UaW1lIEFwcGxpY2F0aW9ucyBwcm90b2NvbCksCi1cZkJydGNwXGZSIChSZWFsLVRpbWUgQXBwbGljYXRpb25zIGNvbnRyb2wgcHJvdG9jb2wpLAotXGZCc25tcFxmUiAoU2ltcGxlIE5ldHdvcmsgTWFuYWdlbWVudCBQcm90b2NvbCksCi1cZkJ0ZnRwXGZSIChUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wpLAotXGZCdmF0XGZSIChWaXN1YWwgQXVkaW8gVG9vbCksCi1hbmQKLVxmQndiXGZSIChkaXN0cmlidXRlZCBXaGl0ZSBCb2FyZCkuCi0uVFAKLS5CIFwtdAotXGZJRG9uJ3RcZlAgcHJpbnQgYSB0aW1lc3RhbXAgb24gZWFjaCBkdW1wIGxpbmUuCi0uVFAKLS5CIFwtdHQKLVByaW50IGFuIHVuZm9ybWF0dGVkIHRpbWVzdGFtcCBvbiBlYWNoIGR1bXAgbGluZS4KLS5UUAotLkIgXC10dHQKLVByaW50IGEgZGVsdGEgKGluIG1pY3JvLXNlY29uZHMpIGJldHdlZW4gY3VycmVudCBhbmQgcHJldmlvdXMgbGluZQotb24gZWFjaCBkdW1wIGxpbmUuCi0uVFAKLS5CIFwtdHR0dAotUHJpbnQgYSB0aW1lc3RhbXAgaW4gZGVmYXVsdCBmb3JtYXQgcHJvY2VlZGVkIGJ5IGRhdGUgb24gZWFjaCBkdW1wIGxpbmUuCi0uVFAKLS5CIFwtdQotUHJpbnQgdW5kZWNvZGVkIE5GUyBoYW5kbGVzLgotLlRQCi0uQiBcLVUKLU1ha2Ugb3V0cHV0IHNhdmVkIHZpYSB0aGUKLS5CIFwtdwotb3B0aW9uIGBgcGFja2V0LWJ1ZmZlcmVkJyc7IGkuZS4sIGFzIGVhY2ggcGFja2V0IGlzIHNhdmVkLCBpdCB3aWxsIGJlCi13cml0dGVuIHRvIHRoZSBvdXRwdXQgZmlsZSwgcmF0aGVyIHRoYW4gYmVpbmcgd3JpdHRlbiBvbmx5IHdoZW4gdGhlCi1vdXRwdXQgYnVmZmVyIGZpbGxzLgotLklQCi1UaGUKLS5CIFwtVQotZmxhZyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaWYKLS5JIHRjcGR1bXAKLXdhcyBidWlsdCB3aXRoIGFuIG9sZGVyIHZlcnNpb24gb2YKLS5JIGxpYnBjYXAKLXRoYXQgbGFja3MgdGhlCi0uQiBwY2FwX2R1bXBfZmx1c2goKQotZnVuY3Rpb24uCi0uVFAKLS5CIFwtdgotV2hlbiBwYXJzaW5nIGFuZCBwcmludGluZywgcHJvZHVjZSAoc2xpZ2h0bHkgbW9yZSkgdmVyYm9zZSBvdXRwdXQuCi1Gb3IgZXhhbXBsZSwgdGhlIHRpbWUgdG8gbGl2ZSwKLWlkZW50aWZpY2F0aW9uLCB0b3RhbCBsZW5ndGggYW5kIG9wdGlvbnMgaW4gYW4gSVAgcGFja2V0IGFyZSBwcmludGVkLgotQWxzbyBlbmFibGVzIGFkZGl0aW9uYWwgcGFja2V0IGludGVncml0eSBjaGVja3Mgc3VjaCBhcyB2ZXJpZnlpbmcgdGhlCi1JUCBhbmQgSUNNUCBoZWFkZXIgY2hlY2tzdW0uCi0uSVAKLVdoZW4gd3JpdGluZyB0byBhIGZpbGUgd2l0aCB0aGUKLS5CIFwtdwotb3B0aW9uLCByZXBvcnQsIGV2ZXJ5IDEwIHNlY29uZHMsIHRoZSBudW1iZXIgb2YgcGFja2V0cyBjYXB0dXJlZC4KLS5UUAotLkIgXC12dgotRXZlbiBtb3JlIHZlcmJvc2Ugb3V0cHV0LgotRm9yIGV4YW1wbGUsIGFkZGl0aW9uYWwgZmllbGRzIGFyZQotcHJpbnRlZCBmcm9tIE5GUyByZXBseSBwYWNrZXRzLCBhbmQgU01CIHBhY2tldHMgYXJlIGZ1bGx5IGRlY29kZWQuCi0uVFAKLS5CIFwtdnZ2Ci1FdmVuIG1vcmUgdmVyYm9zZSBvdXRwdXQuCi1Gb3IgZXhhbXBsZSwKLXRlbG5ldCBcZkJTQlxmUCAuLi4gXGZCU0VcZlAgb3B0aW9ucwotYXJlIHByaW50ZWQgaW4gZnVsbC4KLVdpdGgKLS5CIFwtWAotVGVsbmV0IG9wdGlvbnMgYXJlIHByaW50ZWQgaW4gaGV4IGFzIHdlbGwuCi0uVFAKLS5CIFwtdwotV3JpdGUgdGhlIHJhdyBwYWNrZXRzIHRvIFxmSWZpbGVcZlIgcmF0aGVyIHRoYW4gcGFyc2luZyBhbmQgcHJpbnRpbmcKLXRoZW0gb3V0LgotVGhleSBjYW4gbGF0ZXIgYmUgcHJpbnRlZCB3aXRoIHRoZSBcLXIgb3B0aW9uLgotU3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgaWYgXGZJZmlsZVxmUiBpcyBgYC0nJy4KLS5UUAotLkIgXC1XCi1Vc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIAotLkIgXC1DIAotb3B0aW9uLCB0aGlzIHdpbGwgbGltaXQgdGhlIG51bWJlcgotb2YgZmlsZXMgY3JlYXRlZCB0byB0aGUgc3BlY2lmaWVkIG51bWJlciwgYW5kIGJlZ2luIG92ZXJ3cml0aW5nIGZpbGVzCi1mcm9tIHRoZSBiZWdpbm5pbmcsIHRodXMgY3JlYXRpbmcgYSAncm90YXRpbmcnIGJ1ZmZlci4gCi1JbiBhZGRpdGlvbiwgaXQgd2lsbCBuYW1lCi10aGUgZmlsZXMgd2l0aCBlbm91Z2ggbGVhZGluZyAwcyB0byBzdXBwb3J0IHRoZSBtYXhpbXVtIG51bWJlciBvZgotZmlsZXMsIGFsbG93aW5nIHRoZW0gdG8gc29ydCBjb3JyZWN0bHkuCi0uVFAKLS5CIFwteAotV2hlbiBwYXJzaW5nIGFuZCBwcmludGluZywKLWluIGFkZGl0aW9uIHRvIHByaW50aW5nIHRoZSBoZWFkZXJzIG9mIGVhY2ggcGFja2V0LCBwcmludCB0aGUgZGF0YSBvZgotZWFjaCBwYWNrZXQgKG1pbnVzIGl0cyBsaW5rIGxldmVsIGhlYWRlcikgaW4gaGV4LiAKLVRoZSBzbWFsbGVyIG9mIHRoZSBlbnRpcmUgcGFja2V0IG9yCi0uSSBzbmFwbGVuCi1ieXRlcyB3aWxsIGJlIHByaW50ZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgZW50aXJlIGxpbmstbGF5ZXIKLXBhY2tldCwgc28gZm9yIGxpbmsgbGF5ZXJzIHRoYXQgcGFkIChlLmcuIEV0aGVybmV0KSwgdGhlIHBhZGRpbmcgYnl0ZXMKLXdpbGwgYWxzbyBiZSBwcmludGVkIHdoZW4gdGhlIGhpZ2hlciBsYXllciBwYWNrZXQgaXMgc2hvcnRlciB0aGFuIHRoZQotcmVxdWlyZWQgcGFkZGluZy4KLS5UUAotLkIgXC14eAotV2hlbiBwYXJzaW5nIGFuZCBwcmludGluZywKLWluIGFkZGl0aW9uIHRvIHByaW50aW5nIHRoZSBoZWFkZXJzIG9mIGVhY2ggcGFja2V0LCBwcmludCB0aGUgZGF0YSBvZgotZWFjaCBwYWNrZXQsCi0uSSBpbmNsdWRpbmcKLWl0cyBsaW5rIGxldmVsIGhlYWRlciwgaW4gaGV4LgotLlRQCi0uQiBcLVgKLVdoZW4gcGFyc2luZyBhbmQgcHJpbnRpbmcsCi1pbiBhZGRpdGlvbiB0byBwcmludGluZyB0aGUgaGVhZGVycyBvZiBlYWNoIHBhY2tldCwgcHJpbnQgdGhlIGRhdGEgb2YKLWVhY2ggcGFja2V0IChtaW51cyBpdHMgbGluayBsZXZlbCBoZWFkZXIpIGluIGhleCBhbmQgQVNDSUkuCi1UaGlzIGlzIHZlcnkgaGFuZHkgZm9yIGFuYWx5c2luZyBuZXcgcHJvdG9jb2xzLgotLlRQCi0uQiBcLVhYCi1XaGVuIHBhcnNpbmcgYW5kIHByaW50aW5nLAotaW4gYWRkaXRpb24gdG8gcHJpbnRpbmcgdGhlIGhlYWRlcnMgb2YgZWFjaCBwYWNrZXQsIHByaW50IHRoZSBkYXRhIG9mCi1lYWNoIHBhY2tldCwKLS5JIGluY2x1ZGluZwotaXRzIGxpbmsgbGV2ZWwgaGVhZGVyLCBpbiBoZXggYW5kIEFTQ0lJLgotLlRQCi0uQiBcLXkKLVNldCB0aGUgZGF0YSBsaW5rIHR5cGUgdG8gdXNlIHdoaWxlIGNhcHR1cmluZyBwYWNrZXRzIHRvIFxmSWRhdGFsaW5rdHlwZVxmUC4KLS5UUAotLkIgXC1aCi1Ecm9wcyBwcml2aWxlZ2VzIChpZiByb290KSBhbmQgY2hhbmdlcyB1c2VyIElEIHRvCi0uSSB1c2VyCi1hbmQgdGhlIGdyb3VwIElEIHRvIHRoZSBwcmltYXJ5IGdyb3VwIG9mCi0uSVIgdXNlciAuCi0uSVAKLVRoaXMgYmVoYXZpb3IgY2FuIGFsc28gYmUgZW5hYmxlZCBieSBkZWZhdWx0IGF0IGNvbXBpbGUgdGltZS4KLS5JUCAiXGZJIGV4cHJlc3Npb25cZlAiCi0uUlMKLXNlbGVjdHMgd2hpY2ggcGFja2V0cyB3aWxsIGJlIGR1bXBlZC4KLUlmIG5vIFxmSWV4cHJlc3Npb25cZlAKLWlzIGdpdmVuLCBhbGwgcGFja2V0cyBvbiB0aGUgbmV0IHdpbGwgYmUgZHVtcGVkLgotT3RoZXJ3aXNlLAotb25seSBwYWNrZXRzIGZvciB3aGljaCBcZklleHByZXNzaW9uXGZQIGlzIGB0cnVlJyB3aWxsIGJlIGR1bXBlZC4KLS5MUAotVGhlIFxmSWV4cHJlc3Npb25cZlAgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUKLS5JIHByaW1pdGl2ZXMuCi1QcmltaXRpdmVzIHVzdWFsbHkgY29uc2lzdCBvZiBhbgotLkkgaWQKLShuYW1lIG9yIG51bWJlcikgcHJlY2VkZWQgYnkgb25lIG9yIG1vcmUgcXVhbGlmaWVycy4KLVRoZXJlIGFyZSB0aHJlZQotZGlmZmVyZW50IGtpbmRzIG9mIHF1YWxpZmllcjoKLS5JUCBcZkl0eXBlXGZQCi1xdWFsaWZpZXJzIHNheSB3aGF0IGtpbmQgb2YgdGhpbmcgdGhlIGlkIG5hbWUgb3IgbnVtYmVyIHJlZmVycyB0by4KLVBvc3NpYmxlIHR5cGVzIGFyZQotLkJSIGhvc3QgLAotLkIgbmV0ICwKLS5CIHBvcnQKLWFuZAotLkJSIHBvcnRyYW5nZSAuCi1FLmcuLCBgaG9zdCBmb28nLCBgbmV0IDEyOC4zJywgYHBvcnQgMjAnLCBgcG9ydHJhbmdlIDYwMDAtNjAwOCcuCi1JZiB0aGVyZSBpcyBubyB0eXBlCi1xdWFsaWZpZXIsCi0uQiBob3N0Ci1pcyBhc3N1bWVkLgotLklQIFxmSWRpclxmUAotcXVhbGlmaWVycyBzcGVjaWZ5IGEgcGFydGljdWxhciB0cmFuc2ZlciBkaXJlY3Rpb24gdG8gYW5kL29yIGZyb20KLS5JUiBpZCAuCi1Qb3NzaWJsZSBkaXJlY3Rpb25zIGFyZQotLkJSIHNyYyAsCi0uQlIgZHN0ICwKLS5CICJzcmMgb3IgZHN0IgotYW5kCi0uQiAic3JjIGFuZCIKLS5CUiBkc3QgLgotRS5nLiwgYHNyYyBmb28nLCBgZHN0IG5ldCAxMjguMycsIGBzcmMgb3IgZHN0IHBvcnQgZnRwLWRhdGEnLgotSWYKLXRoZXJlIGlzIG5vIGRpciBxdWFsaWZpZXIsCi0uQiAic3JjIG9yIGRzdCIKLWlzIGFzc3VtZWQuCi1Gb3Igc29tZSBsaW5rIGxheWVycywgc3VjaCBhcyBTTElQIGFuZCB0aGUgYGBjb29rZWQnJyBMaW51eCBjYXB0dXJlIG1vZGUKLXVzZWQgZm9yIHRoZSBgYGFueScnIGRldmljZSBhbmQgZm9yIHNvbWUgb3RoZXIgZGV2aWNlIHR5cGVzLCB0aGUKLS5CIGluYm91bmQKLWFuZAotLkIgb3V0Ym91bmQKLXF1YWxpZmllcnMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGRlc2lyZWQgZGlyZWN0aW9uLgotLklQIFxmSXByb3RvXGZQCi1xdWFsaWZpZXJzIHJlc3RyaWN0IHRoZSBtYXRjaCB0byBhIHBhcnRpY3VsYXIgcHJvdG9jb2wuCi1Qb3NzaWJsZQotcHJvdG9zIGFyZToKLS5CUiBldGhlciAsCi0uQlIgZmRkaSAsCi0uQlIgdHIgLAotLkJSIHdsYW4gLAotLkJSIGlwICwKLS5CUiBpcDYgLAotLkJSIGFycCAsCi0uQlIgcmFycCAsCi0uQlIgZGVjbmV0ICwKLS5CIHRjcAotYW5kCi0uQlIgdWRwIC4KLUUuZy4sIGBldGhlciBzcmMgZm9vJywgYGFycCBuZXQgMTI4LjMnLCBgdGNwIHBvcnQgMjEnLCBgdWRwIHBvcnRyYW5nZQotNzAwMC03MDA5Jy4KLUlmIHRoZXJlIGlzCi1ubyBwcm90byBxdWFsaWZpZXIsIGFsbCBwcm90b2NvbHMgY29uc2lzdGVudCB3aXRoIHRoZSB0eXBlIGFyZQotYXNzdW1lZC4KLUUuZy4sIGBzcmMgZm9vJyBtZWFucyBgKGlwIG9yIGFycCBvciByYXJwKSBzcmMgZm9vJwotKGV4Y2VwdCB0aGUgbGF0dGVyIGlzIG5vdCBsZWdhbCBzeW50YXgpLCBgbmV0IGJhcicgbWVhbnMgYChpcCBvcgotYXJwIG9yIHJhcnApIG5ldCBiYXInIGFuZCBgcG9ydCA1MycgbWVhbnMgYCh0Y3Agb3IgdWRwKSBwb3J0IDUzJy4KLS5MUAotW2BmZGRpJyBpcyBhY3R1YWxseSBhbiBhbGlhcyBmb3IgYGV0aGVyJzsgdGhlIHBhcnNlciB0cmVhdHMgdGhlbQotaWRlbnRpY2FsbHkgYXMgbWVhbmluZyBgYHRoZSBkYXRhIGxpbmsgbGV2ZWwgdXNlZCBvbiB0aGUgc3BlY2lmaWVkCi1uZXR3b3JrIGludGVyZmFjZS4nJyAgRkRESSBoZWFkZXJzIGNvbnRhaW4gRXRoZXJuZXQtbGlrZSBzb3VyY2UKLWFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMsIGFuZCBvZnRlbiBjb250YWluIEV0aGVybmV0LWxpa2UgcGFja2V0Ci10eXBlcywgc28geW91IGNhbiBmaWx0ZXIgb24gdGhlc2UgRkRESSBmaWVsZHMganVzdCBhcyB3aXRoIHRoZQotYW5hbG9nb3VzIEV0aGVybmV0IGZpZWxkcy4KLUZEREkgaGVhZGVycyBhbHNvIGNvbnRhaW4gb3RoZXIgZmllbGRzLAotYnV0IHlvdSBjYW5ub3QgbmFtZSB0aGVtIGV4cGxpY2l0bHkgaW4gYSBmaWx0ZXIgZXhwcmVzc2lvbi4KLS5MUAotU2ltaWxhcmx5LCBgdHInIGFuZCBgd2xhbicgYXJlIGFsaWFzZXMgZm9yIGBldGhlcic7IHRoZSBwcmV2aW91cwotcGFyYWdyYXBoJ3Mgc3RhdGVtZW50cyBhYm91dCBGRERJIGhlYWRlcnMgYWxzbyBhcHBseSB0byBUb2tlbiBSaW5nCi1hbmQgODAyLjExIHdpcmVsZXNzIExBTiBoZWFkZXJzLiAgRm9yIDgwMi4xMSBoZWFkZXJzLCB0aGUgZGVzdGluYXRpb24KLWFkZHJlc3MgaXMgdGhlIERBIGZpZWxkIGFuZCB0aGUgc291cmNlIGFkZHJlc3MgaXMgdGhlIFNBIGZpZWxkOyB0aGUKLUJTU0lELCBSQSwgYW5kIFRBIGZpZWxkcyBhcmVuJ3QgdGVzdGVkLl0KLS5MUAotSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlLCB0aGVyZSBhcmUgc29tZSBzcGVjaWFsIGBwcmltaXRpdmUnIGtleXdvcmRzCi10aGF0IGRvbid0IGZvbGxvdyB0aGUgcGF0dGVybjoKLS5CUiBnYXRld2F5ICwKLS5CUiBicm9hZGNhc3QgLAotLkJSIGxlc3MgLAotLkIgZ3JlYXRlcgotYW5kIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMuCi1BbGwgb2YgdGhlc2UgYXJlIGRlc2NyaWJlZCBiZWxvdy4KLS5MUAotTW9yZSBjb21wbGV4IGZpbHRlciBleHByZXNzaW9ucyBhcmUgYnVpbHQgdXAgYnkgdXNpbmcgdGhlIHdvcmRzCi0uQlIgYW5kICwKLS5CIG9yCi1hbmQKLS5CIG5vdAotdG8gY29tYmluZSBwcmltaXRpdmVzLgotRS5nLiwgYGhvc3QgZm9vIGFuZCBub3QgcG9ydCBmdHAgYW5kIG5vdCBwb3J0IGZ0cC1kYXRhJy4KLVRvIHNhdmUgdHlwaW5nLCBpZGVudGljYWwgcXVhbGlmaWVyIGxpc3RzIGNhbiBiZSBvbWl0dGVkLgotRS5nLiwKLWB0Y3AgZHN0IHBvcnQgZnRwIG9yIGZ0cC1kYXRhIG9yIGRvbWFpbicgaXMgZXhhY3RseSB0aGUgc2FtZSBhcwotYHRjcCBkc3QgcG9ydCBmdHAgb3IgdGNwIGRzdCBwb3J0IGZ0cC1kYXRhIG9yIHRjcCBkc3QgcG9ydCBkb21haW4nLgotLkxQCi1BbGxvd2FibGUgcHJpbWl0aXZlcyBhcmU6Ci0uSVAgIlxmQmRzdCBob3N0IFxmSWhvc3RcZlIiCi1UcnVlIGlmIHRoZSBJUHY0L3Y2IGRlc3RpbmF0aW9uIGZpZWxkIG9mIHRoZSBwYWNrZXQgaXMgXGZJaG9zdFxmUCwKLXdoaWNoIG1heSBiZSBlaXRoZXIgYW4gYWRkcmVzcyBvciBhIG5hbWUuCi0uSVAgIlxmQnNyYyBob3N0IFxmSWhvc3RcZlIiCi1UcnVlIGlmIHRoZSBJUHY0L3Y2IHNvdXJjZSBmaWVsZCBvZiB0aGUgcGFja2V0IGlzIFxmSWhvc3RcZlAuCi0uSVAgIlxmQmhvc3QgXGZJaG9zdFxmUAotVHJ1ZSBpZiBlaXRoZXIgdGhlIElQdjQvdjYgc291cmNlIG9yIGRlc3RpbmF0aW9uIG9mIHRoZSBwYWNrZXQgaXMgXGZJaG9zdFxmUC4KLS5JUAotQW55IG9mIHRoZSBhYm92ZSBob3N0IGV4cHJlc3Npb25zIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCB0aGUga2V5d29yZHMsCi1cZkJpcFxmUCwgXGZCYXJwXGZQLCBcZkJyYXJwXGZQLCBvciBcZkJpcDZcZlAgYXMgaW46Ci0uaW4gKy41aQotLm5mCi1cZkJpcCBob3N0IFxmSWhvc3RcZlIKLS5maQotLmluIC0uNWkKLXdoaWNoIGlzIGVxdWl2YWxlbnQgdG86Ci0uaW4gKy41aQotLm5mCi1cZkJldGhlciBwcm90byBcZklcXGlwXGZCIGFuZCBob3N0IFxmSWhvc3RcZlIKLS5maQotLmluIC0uNWkKLUlmIFxmSWhvc3RcZlIgaXMgYSBuYW1lIHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCBlYWNoIGFkZHJlc3Mgd2lsbAotYmUgY2hlY2tlZCBmb3IgYSBtYXRjaC4KLS5JUCAiXGZCZXRoZXIgZHN0IFxmSWVob3N0XGZQCi1UcnVlIGlmIHRoZSBFdGhlcm5ldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIFxmSWVob3N0XGZQLgotXGZJRWhvc3RcZlAKLW1heSBiZSBlaXRoZXIgYSBuYW1lIGZyb20gL2V0Yy9ldGhlcnMgb3IgYSBudW1iZXIgKHNlZQotLklSIGV0aGVycyAoM04pCi1mb3IgbnVtZXJpYyBmb3JtYXQpLgotLklQICJcZkJldGhlciBzcmMgXGZJZWhvc3RcZlAKLVRydWUgaWYgdGhlIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzIGlzIFxmSWVob3N0XGZQLgotLklQICJcZkJldGhlciBob3N0IFxmSWVob3N0XGZQCi1UcnVlIGlmIGVpdGhlciB0aGUgRXRoZXJuZXQgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgXGZJZWhvc3RcZlAuCi0uSVAgIlxmQmdhdGV3YXlcZlAgXGZJaG9zdFxmUAotVHJ1ZSBpZiB0aGUgcGFja2V0IHVzZWQgXGZJaG9zdFxmUCBhcyBhIGdhdGV3YXkuCi1JLmUuLCB0aGUgRXRoZXJuZXQKLXNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIHdhcyBcZklob3N0XGZQIGJ1dCBuZWl0aGVyIHRoZSBJUCBzb3VyY2UKLW5vciB0aGUgSVAgZGVzdGluYXRpb24gd2FzIFxmSWhvc3RcZlAuCi1cZklIb3N0XGZQIG11c3QgYmUgYSBuYW1lIGFuZAotbXVzdCBiZSBmb3VuZCBib3RoIGJ5IHRoZSBtYWNoaW5lJ3MgaG9zdC1uYW1lLXRvLUlQLWFkZHJlc3MgcmVzb2x1dGlvbgotbWVjaGFuaXNtcyAoaG9zdCBuYW1lIGZpbGUsIEROUywgTklTLCBldGMuKSBhbmQgYnkgdGhlIG1hY2hpbmUncwotaG9zdC1uYW1lLXRvLUV0aGVybmV0LWFkZHJlc3MgcmVzb2x1dGlvbiBtZWNoYW5pc20gKC9ldGMvZXRoZXJzLCBldGMuKS4KLShBbiBlcXVpdmFsZW50IGV4cHJlc3Npb24gaXMKLS5pbiArLjVpCi0ubmYKLVxmQmV0aGVyIGhvc3QgXGZJZWhvc3QgXGZCYW5kIG5vdCBob3N0IFxmSWhvc3RcZlIKLS5maQotLmluIC0uNWkKLXdoaWNoIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIG5hbWVzIG9yIG51bWJlcnMgZm9yIFxmSWhvc3QgLyBlaG9zdFxmUC4pCi1UaGlzIHN5bnRheCBkb2VzIG5vdCB3b3JrIGluIElQdjYtZW5hYmxlZCBjb25maWd1cmF0aW9uIGF0IHRoaXMgbW9tZW50LgotLklQICJcZkJkc3QgbmV0IFxmSW5ldFxmUiIKLVRydWUgaWYgdGhlIElQdjQvdjYgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKLW51bWJlciBvZiBcZkluZXRcZlAuCi1cZklOZXRcZlAgbWF5IGJlIGVpdGhlciBhIG5hbWUgZnJvbSB0aGUgbmV0d29ya3MgZGF0YWJhc2UKLSgvZXRjL25ldHdvcmtzLCBldGMuKSBvciBhIG5ldHdvcmsgbnVtYmVyLgotQW4gSVB2NCBuZXR3b3JrIG51bWJlciBjYW4gYmUgd3JpdHRlbiBhcyBhIGRvdHRlZCBxdWFkIChlLmcuLCAxOTIuMTY4LjEuMCksCi1kb3R0ZWQgdHJpcGxlIChlLmcuLCAxOTIuMTY4LjEpLCBkb3R0ZWQgcGFpciAoZS5nLCAxNzIuMTYpLCBvciBzaW5nbGUKLW51bWJlciAoZS5nLiwgMTApOyB0aGUgbmV0bWFzayBpcyAyNTUuMjU1LjI1NS4yNTUgZm9yIGEgZG90dGVkIHF1YWQKLSh3aGljaCBtZWFucyB0aGF0IGl0J3MgcmVhbGx5IGEgaG9zdCBtYXRjaCksIDI1NS4yNTUuMjU1LjAgZm9yIGEgZG90dGVkCi10cmlwbGUsIDI1NS4yNTUuMC4wIGZvciBhIGRvdHRlZCBwYWlyLCBvciAyNTUuMC4wLjAgZm9yIGEgc2luZ2xlIG51bWJlci4KLUFuIElQdjYgbmV0d29yayBudW1iZXIgbXVzdCBiZSB3cml0dGVuIG91dCBmdWxseTsgdGhlIG5ldG1hc2sgaXMKLWZmOmZmOmZmOmZmOmZmOmZmOmZmOmZmLCBzbyBJUHY2ICJuZXR3b3JrIiBtYXRjaGVzIGFyZSByZWFsbHkgYWx3YXlzCi1ob3N0IG1hdGNoZXMsIGFuZCBhIG5ldHdvcmsgbWF0Y2ggcmVxdWlyZXMgYSBuZXRtYXNrIGxlbmd0aC4KLS5JUCAiXGZCc3JjIG5ldCBcZkluZXRcZlIiCi1UcnVlIGlmIHRoZSBJUHY0L3Y2IHNvdXJjZSBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaGFzIGEgbmV0d29yawotbnVtYmVyIG9mIFxmSW5ldFxmUC4KLS5JUCAiXGZCbmV0IFxmSW5ldFxmUiIKLVRydWUgaWYgZWl0aGVyIHRoZSBJUHY0L3Y2IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIG9mIHRoZSBwYWNrZXQgaGFzIGEgbmV0d29yawotbnVtYmVyIG9mIFxmSW5ldFxmUC4KLS5JUCAiXGZCbmV0IFxmSW5ldFxmUiBcZkJtYXNrIFxmSW5ldG1hc2tcZlIiCi1UcnVlIGlmIHRoZSBJUHY0IGFkZHJlc3MgbWF0Y2hlcyBcZkluZXRcZlIgd2l0aCB0aGUgc3BlY2lmaWMgXGZJbmV0bWFza1xmUi4KLU1heSBiZSBxdWFsaWZpZWQgd2l0aCBcZkJzcmNcZlIgb3IgXGZCZHN0XGZSLgotTm90ZSB0aGF0IHRoaXMgc3ludGF4IGlzIG5vdCB2YWxpZCBmb3IgSVB2NiBcZkluZXRcZlIuCi0uSVAgIlxmQm5ldCBcZkluZXRcZlIvXGZJbGVuXGZSIgotVHJ1ZSBpZiB0aGUgSVB2NC92NiBhZGRyZXNzIG1hdGNoZXMgXGZJbmV0XGZSIHdpdGggYSBuZXRtYXNrIFxmSWxlblxmUgotYml0cyB3aWRlLgotTWF5IGJlIHF1YWxpZmllZCB3aXRoIFxmQnNyY1xmUiBvciBcZkJkc3RcZlIuCi0uSVAgIlxmQmRzdCBwb3J0IFxmSXBvcnRcZlIiCi1UcnVlIGlmIHRoZSBwYWNrZXQgaXMgaXAvdGNwLCBpcC91ZHAsIGlwNi90Y3Agb3IgaXA2L3VkcCBhbmQgaGFzIGEKLWRlc3RpbmF0aW9uIHBvcnQgdmFsdWUgb2YgXGZJcG9ydFxmUC4KLVRoZSBcZklwb3J0XGZQIGNhbiBiZSBhIG51bWJlciBvciBhIG5hbWUgdXNlZCBpbiAvZXRjL3NlcnZpY2VzIChzZWUKLS5JUiB0Y3AgKDRQKQotYW5kCi0uSVIgdWRwICg0UCkpLgotSWYgYSBuYW1lIGlzIHVzZWQsIGJvdGggdGhlIHBvcnQKLW51bWJlciBhbmQgcHJvdG9jb2wgYXJlIGNoZWNrZWQuCi1JZiBhIG51bWJlciBvciBhbWJpZ3VvdXMgbmFtZSBpcyB1c2VkLAotb25seSB0aGUgcG9ydCBudW1iZXIgaXMgY2hlY2tlZCAoZS5nLiwgXGZCZHN0IHBvcnQgNTEzXGZSIHdpbGwgcHJpbnQgYm90aAotdGNwL2xvZ2luIHRyYWZmaWMgYW5kIHVkcC93aG8gdHJhZmZpYywgYW5kIFxmQnBvcnQgZG9tYWluXGZSIHdpbGwgcHJpbnQKLWJvdGggdGNwL2RvbWFpbiBhbmQgdWRwL2RvbWFpbiB0cmFmZmljKS4KLS5JUCAiXGZCc3JjIHBvcnQgXGZJcG9ydFxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBzb3VyY2UgcG9ydCB2YWx1ZSBvZiBcZklwb3J0XGZQLgotLklQICJcZkJwb3J0IFxmSXBvcnRcZlIiCi1UcnVlIGlmIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIHBvcnQgb2YgdGhlIHBhY2tldCBpcyBcZklwb3J0XGZQLgotLklQICJcZkJkc3QgcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGlwL3RjcCwgaXAvdWRwLCBpcDYvdGNwIG9yIGlwNi91ZHAgYW5kIGhhcyBhCi1kZXN0aW5hdGlvbiBwb3J0IHZhbHVlIGJldHdlZW4gXGZJcG9ydDFcZlAgYW5kIFxmSXBvcnQyXGZQLgotLkkgcG9ydDEKLWFuZAotLkkgcG9ydDIKLWFyZSBpbnRlcnByZXRlZCBpbiB0aGUgc2FtZSBmYXNoaW9uIGFzIHRoZQotLkkgcG9ydAotcGFyYW1ldGVyIGZvcgotLkJSIHBvcnQgLgotLklQICJcZkJzcmMgcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIHNvdXJjZSBwb3J0IHZhbHVlIGJldHdlZW4gXGZJcG9ydDFcZlAgYW5kCi1cZklwb3J0MlxmUC4KLS5JUCAiXGZCcG9ydHJhbmdlIFxmSXBvcnQxXGZCLVxmSXBvcnQyXGZSIgotVHJ1ZSBpZiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBwb3J0IG9mIHRoZSBwYWNrZXQgaXMgYmV0d2VlbgotXGZJcG9ydDFcZlAgYW5kIFxmSXBvcnQyXGZQLgotLklQCi1Bbnkgb2YgdGhlIGFib3ZlIHBvcnQgb3IgcG9ydCByYW5nZSBleHByZXNzaW9ucyBjYW4gYmUgcHJlcGVuZGVkIHdpdGgKLXRoZSBrZXl3b3JkcywgXGZCdGNwXGZQIG9yIFxmQnVkcFxmUCwgYXMgaW46Ci0uaW4gKy41aQotLm5mCi1cZkJ0Y3Agc3JjIHBvcnQgXGZJcG9ydFxmUgotLmZpCi0uaW4gLS41aQotd2hpY2ggbWF0Y2hlcyBvbmx5IHRjcCBwYWNrZXRzIHdob3NlIHNvdXJjZSBwb3J0IGlzIFxmSXBvcnRcZlAuCi0uSVAgIlxmQmxlc3MgXGZJbGVuZ3RoXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIGxlbmd0aCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gXGZJbGVuZ3RoXGZQLgotVGhpcyBpcyBlcXVpdmFsZW50IHRvOgotLmluICsuNWkKLS5uZgotXGZCbGVuIDw9IFxmSWxlbmd0aFxmUC4KLS5maQotLmluIC0uNWkKLS5JUCAiXGZCZ3JlYXRlciBcZklsZW5ndGhcZlIiCi1UcnVlIGlmIHRoZSBwYWNrZXQgaGFzIGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBcZklsZW5ndGhcZlAuCi1UaGlzIGlzIGVxdWl2YWxlbnQgdG86Ci0uaW4gKy41aQotLm5mCi1cZkJsZW4gPj0gXGZJbGVuZ3RoXGZQLgotLmZpCi0uaW4gLS41aQotLklQICJcZkJpcCBwcm90byBcZklwcm90b2NvbFxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY0IHBhY2tldCAoc2VlCi0uSVIgaXAgKDRQKSkKLW9mIHByb3RvY29sIHR5cGUgXGZJcHJvdG9jb2xcZlAuCi1cZklQcm90b2NvbFxmUCBjYW4gYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBuYW1lcwotXGZCaWNtcFxmUCwgXGZCaWNtcDZcZlAsIFxmQmlnbXBcZlAsIFxmQmlncnBcZlAsIFxmQnBpbVxmUCwgXGZCYWhcZlAsCi1cZkJlc3BcZlAsIFxmQnZycnBcZlAsIFxmQnVkcFxmUCwgb3IgXGZCdGNwXGZQLgotTm90ZSB0aGF0IHRoZSBpZGVudGlmaWVycyBcZkJ0Y3BcZlAsIFxmQnVkcFxmUCwgYW5kIFxmQmljbXBcZlAgYXJlIGFsc28KLWtleXdvcmRzIGFuZCBtdXN0IGJlIGVzY2FwZWQgdmlhIGJhY2tzbGFzaCAoXFwpLCB3aGljaCBpcyBcXFxcIGluIHRoZSBDLXNoZWxsLgotTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCi0uSVAgIlxmQmlwNiBwcm90byBcZklwcm90b2NvbFxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IHBhY2tldCBvZiBwcm90b2NvbCB0eXBlIFxmSXByb3RvY29sXGZQLgotTm90ZSB0aGF0IHRoaXMgcHJpbWl0aXZlIGRvZXMgbm90IGNoYXNlIHRoZSBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCi0uSVAgIlxmQmlwNiBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIElQdjYgcGFja2V0LAotYW5kIGNvbnRhaW5zIHByb3RvY29sIGhlYWRlciB3aXRoIHR5cGUgXGZJcHJvdG9jb2xcZlIKLWluIGl0cyBwcm90b2NvbCBoZWFkZXIgY2hhaW4uCi1Gb3IgZXhhbXBsZSwKLS5pbiArLjVpCi0ubmYKLVxmQmlwNiBwcm90b2NoYWluIDZcZlIKLS5maQotLmluIC0uNWkKLW1hdGNoZXMgYW55IElQdjYgcGFja2V0IHdpdGggVENQIHByb3RvY29sIGhlYWRlciBpbiB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgotVGhlIHBhY2tldCBtYXkgY29udGFpbiwgZm9yIGV4YW1wbGUsCi1hdXRoZW50aWNhdGlvbiBoZWFkZXIsIHJvdXRpbmcgaGVhZGVyLCBvciBob3AtYnktaG9wIG9wdGlvbiBoZWFkZXIsCi1iZXR3ZWVuIElQdjYgaGVhZGVyIGFuZCBUQ1AgaGVhZGVyLgotVGhlIEJQRiBjb2RlIGVtaXR0ZWQgYnkgdGhpcyBwcmltaXRpdmUgaXMgY29tcGxleCBhbmQKLWNhbm5vdCBiZSBvcHRpbWl6ZWQgYnkgQlBGIG9wdGltaXplciBjb2RlIGluIFxmSXRjcGR1bXBcZlAsCi1zbyB0aGlzIGNhbiBiZSBzb21ld2hhdCBzbG93LgotLklQICJcZkJpcCBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgotRXF1aXZhbGVudCB0byBcZkJpcDYgcHJvdG9jaGFpbiBcZklwcm90b2NvbFxmUiwgYnV0IHRoaXMgaXMgZm9yIElQdjQuCi0uSVAgIlxmQmV0aGVyIGJyb2FkY2FzdFxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBFdGhlcm5ldCBicm9hZGNhc3QgcGFja2V0LgotVGhlIFxmSWV0aGVyXGZQCi1rZXl3b3JkIGlzIG9wdGlvbmFsLgotLklQICJcZkJpcCBicm9hZGNhc3RcZlIiCi1UcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBicm9hZGNhc3QgcGFja2V0LgotSXQgY2hlY2tzIGZvciBib3RoIHRoZSBhbGwtemVyb2VzIGFuZCBhbGwtb25lcyBicm9hZGNhc3QgY29udmVudGlvbnMsCi1hbmQgbG9va3MgdXAgdGhlIHN1Ym5ldCBtYXNrIG9uIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMKLWJlaW5nIGRvbmUuCi0uSVAKLUlmIHRoZSBzdWJuZXQgbWFzayBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUKLWlzIG5vdCBhdmFpbGFibGUsIGVpdGhlciBiZWNhdXNlIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggY2FwdHVyZSBpcyBiZWluZwotZG9uZSBoYXMgbm8gbmV0bWFzayBvciBiZWNhdXNlIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUgb24gdGhlIExpbnV4Ci0iYW55IiBpbnRlcmZhY2UsIHdoaWNoIGNhbiBjYXB0dXJlIG9uIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLCB0aGlzCi1jaGVjayB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4KLS5JUCAiXGZCZXRoZXIgbXVsdGljYXN0XGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEV0aGVybmV0IG11bHRpY2FzdCBwYWNrZXQuCi1UaGUgXGZCZXRoZXJcZlAKLWtleXdvcmQgaXMgb3B0aW9uYWwuCi1UaGlzIGlzIHNob3J0aGFuZCBmb3IgYFxmQmV0aGVyWzBdICYgMSAhPSAwXGZQJy4KLS5JUCAiXGZCaXAgbXVsdGljYXN0XGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgbXVsdGljYXN0IHBhY2tldC4KLS5JUCAiXGZCaXA2IG11bHRpY2FzdFxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IG11bHRpY2FzdCBwYWNrZXQuCi0uSVAgICJcZkJldGhlciBwcm90byBcZklwcm90b2NvbFxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBvZiBldGhlciB0eXBlIFxmSXByb3RvY29sXGZSLgotXGZJUHJvdG9jb2xcZlAgY2FuIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgbmFtZXMKLVxmQmlwXGZQLCBcZkJpcDZcZlAsIFxmQmFycFxmUCwgXGZCcmFycFxmUCwgXGZCYXRhbGtcZlAsIFxmQmFhcnBcZlAsCi1cZkJkZWNuZXRcZlAsIFxmQnNjYVxmUCwgXGZCbGF0XGZQLCBcZkJtb3BkbFxmUCwgXGZCbW9wcmNcZlAsCi1cZkJpc29cZlAsIFxmQnN0cFxmUCwgXGZCaXB4XGZQLCBvciBcZkJuZXRiZXVpXGZQLgotTm90ZSB0aGVzZSBpZGVudGlmaWVycyBhcmUgYWxzbyBrZXl3b3JkcwotYW5kIG11c3QgYmUgZXNjYXBlZCB2aWEgYmFja3NsYXNoIChcXCkuCi0uSVAKLVtJbiB0aGUgY2FzZSBvZiBGRERJIChlLmcuLCBgXGZCZmRkaSBwcm90b2NvbCBhcnBcZlInKSwgVG9rZW4gUmluZwotKGUuZy4sIGBcZkJ0ciBwcm90b2NvbCBhcnBcZlInKSwgYW5kIElFRUUgODAyLjExIHdpcmVsZXNzIExBTlMgKGUuZy4sCi1gXGZCd2xhbiBwcm90b2NvbCBhcnBcZlInKSwgZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLCB0aGUKLXByb3RvY29sIGlkZW50aWZpY2F0aW9uIGNvbWVzIGZyb20gdGhlIDgwMi4yIExvZ2ljYWwgTGluayBDb250cm9sIChMTEMpCi1oZWFkZXIsIHdoaWNoIGlzIHVzdWFsbHkgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIEZEREksIFRva2VuIFJpbmcsIG9yCi04MDIuMTEgaGVhZGVyLgotLklQCi1XaGVuIGZpbHRlcmluZyBmb3IgbW9zdCBwcm90b2NvbCBpZGVudGlmaWVycyBvbiBGRERJLCBUb2tlbiBSaW5nLCBvcgotODAyLjExLCBcZkl0Y3BkdW1wXGZSIGNoZWNrcyBvbmx5IHRoZSBwcm90b2NvbCBJRCBmaWVsZCBvZiBhbiBMTEMgaGVhZGVyCi1pbiBzby1jYWxsZWQgU05BUCBmb3JtYXQgd2l0aCBhbiBPcmdhbml6YXRpb25hbCBVbml0IElkZW50aWZpZXIgKE9VSSkgb2YKLTB4MDAwMDAwLCBmb3IgZW5jYXBzdWxhdGVkIEV0aGVybmV0OyBpdCBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldAotaXMgaW4gU05BUCBmb3JtYXQgd2l0aCBhbiBPVUkgb2YgMHgwMDAwMDAuCi1UaGUgZXhjZXB0aW9ucyBhcmU6Ci0uUlMKLS5UUAotXGZCaXNvXGZQCi1cZkl0Y3BkdW1wXGZSIGNoZWNrcyB0aGUgRFNBUCAoRGVzdGluYXRpb24gU2VydmljZSBBY2Nlc3MgUG9pbnQpIGFuZAotU1NBUCAoU291cmNlIFNlcnZpY2UgQWNjZXNzIFBvaW50KSBmaWVsZHMgb2YgdGhlIExMQyBoZWFkZXI7Ci0uVFAKLVxmQnN0cFxmUCBhbmQgXGZCbmV0YmV1aVxmUAotXGZJdGNwZHVtcFxmUiBjaGVja3MgdGhlIERTQVAgb2YgdGhlIExMQyBoZWFkZXI7Ci0uVFAKLVxmQmF0YWxrXGZQCi1cZkl0Y3BkdW1wXGZSIGNoZWNrcyBmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgd2l0aCBhbiBPVUkgb2YgMHgwODAwMDcKLWFuZCB0aGUgQXBwbGVUYWxrIGV0eXBlLgotLlJFCi0uSVAKLUluIHRoZSBjYXNlIG9mIEV0aGVybmV0LCBcZkl0Y3BkdW1wXGZSIGNoZWNrcyB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZAotZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLiAgVGhlIGV4Y2VwdGlvbnMgYXJlOgotLlJTCi0uVFAKLVxmQmlzb1xmUCwgXGZCc3RwXGZQLCBhbmQgXGZCbmV0YmV1aVxmUAotXGZJdGNwZHVtcFxmUiBjaGVja3MgZm9yIGFuIDgwMi4zIGZyYW1lIGFuZCB0aGVuIGNoZWNrcyB0aGUgTExDIGhlYWRlciBhcwotaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKLS5UUAotXGZCYXRhbGtcZlAKLVxmSXRjcGR1bXBcZlIgY2hlY2tzIGJvdGggZm9yIHRoZSBBcHBsZVRhbGsgZXR5cGUgaW4gYW4gRXRoZXJuZXQgZnJhbWUgYW5kCi1mb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgYXMgaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKLS5UUAotXGZCYWFycFxmUAotXGZJdGNwZHVtcFxmUiBjaGVja3MgZm9yIHRoZSBBcHBsZVRhbGsgQVJQIGV0eXBlIGluIGVpdGhlciBhbiBFdGhlcm5ldAotZnJhbWUgb3IgYW4gODAyLjIgU05BUCBmcmFtZSB3aXRoIGFuIE9VSSBvZiAweDAwMDAwMDsKLS5UUAotXGZCaXB4XGZQCi1cZkl0Y3BkdW1wXGZSIGNoZWNrcyBmb3IgdGhlIElQWCBldHlwZSBpbiBhbiBFdGhlcm5ldCBmcmFtZSwgdGhlIElQWAotRFNBUCBpbiB0aGUgTExDIGhlYWRlciwgdGhlIDgwMi4zLXdpdGgtbm8tTExDLWhlYWRlciBlbmNhcHN1bGF0aW9uIG9mCi1JUFgsIGFuZCB0aGUgSVBYIGV0eXBlIGluIGEgU05BUCBmcmFtZS4KLS5SRQotLklQICJcZkJkZWNuZXQgc3JjIFxmSWhvc3RcZlIiCi1UcnVlIGlmIHRoZSBERUNORVQgc291cmNlIGFkZHJlc3MgaXMKLS5JUiBob3N0ICwKLXdoaWNoIG1heSBiZSBhbiBhZGRyZXNzIG9mIHRoZSBmb3JtIGBgMTAuMTIzJycsIG9yIGEgREVDTkVUIGhvc3QKLW5hbWUuCi1bREVDTkVUIGhvc3QgbmFtZSBzdXBwb3J0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIFVMVFJJWCBzeXN0ZW1zCi10aGF0IGFyZSBjb25maWd1cmVkIHRvIHJ1biBERUNORVQuXQotLklQICJcZkJkZWNuZXQgZHN0IFxmSWhvc3RcZlIiCi1UcnVlIGlmIHRoZSBERUNORVQgZGVzdGluYXRpb24gYWRkcmVzcyBpcwotLklSIGhvc3QgLgotLklQICJcZkJkZWNuZXQgaG9zdCBcZklob3N0XGZSIgotVHJ1ZSBpZiBlaXRoZXIgdGhlIERFQ05FVCBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpcwotLklSIGhvc3QgLgotLklQICJcZkJpZm5hbWUgXGZJaW50ZXJmYWNlXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgY29taW5nIGZyb20gdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgKGFwcGxpZXMKLW9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCi0uQlIgcGYgKDQpKS4KLS5JUCAiXGZCb24gXGZJaW50ZXJmYWNlXGZSIgotU3lub255bW91cyB3aXRoIHRoZQotLkIgaWZuYW1lCi1tb2RpZmllci4KLS5JUCAiXGZCcm5yIFxmSW51bVxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIGFzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgUEYgcnVsZSBudW1iZXIKLShhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCi0uQlIgcGYgKDQpKS4KLS5JUCAiXGZCcnVsZW51bSBcZkludW1cZlIiCi1TeW5vbm9tb3VzIHdpdGggdGhlCi0uQiBybnIKLW1vZGlmaWVyLgotLklQICJcZkJyZWFzb24gXGZJY29kZVxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCB3YXMgbG9nZ2VkIHdpdGggdGhlIHNwZWNpZmllZCBQRiByZWFzb24gY29kZS4gIFRoZSBrbm93bgotY29kZXMgYXJlOgotLkJSIG1hdGNoICwKLS5CUiBiYWQtb2Zmc2V0ICwKLS5CUiBmcmFnbWVudCAsCi0uQlIgc2hvcnQgLAotLkJSIG5vcm1hbGl6ZSAsCi1hbmQKLS5CIG1lbW9yeQotKGFwcGxpZXMgb25seSB0byBwYWNrZXRzIGxvZ2dlZCBieSBPcGVuQlNEJ3MKLS5CUiBwZiAoNCkpLgotLklQICJcZkJyc2V0IFxmSW5hbWVcZlIiCi1UcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCBhcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFBGIHJ1bGVzZXQKLW5hbWUgb2YgYW4gYW5jaG9yZWQgcnVsZXNldCAoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5Ci0uQlIgcGYgKDQpKS4KLS5JUCAiXGZCcnVsZXNldCBcZkluYW1lXGZSIgotU3lub25vbW91cyB3aXRoIHRoZQotLkIgcnNldAotbW9kaWZpZXIuCi0uSVAgIlxmQnNybnIgXGZJbnVtXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBQRiBydWxlIG51bWJlcgotb2YgYW4gYW5jaG9yZWQgcnVsZXNldCAoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5Ci0uQlIgcGYgKDQpKS4KLS5JUCAiXGZCc3VicnVsZW51bSBcZkludW1cZlIiCi1TeW5vbm9tb3VzIHdpdGggdGhlCi0uQiBzcm5yCi1tb2RpZmllci4KLS5JUCAiXGZCYWN0aW9uIFxmSWFjdFxmUiIKLVRydWUgaWYgUEYgdG9vayB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aGVuIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZC4gIEtub3duIGFjdGlvbnMKLWFyZToKLS5CIHBhc3MKLWFuZAotLkIgYmxvY2sKLShhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzCi0uQlIgcGYgKDQpKS4KLS5JUCAiXGZCaXBcZlIsIFxmQmlwNlxmUiwgXGZCYXJwXGZSLCBcZkJyYXJwXGZSLCBcZkJhdGFsa1xmUiwgXGZCYWFycFxmUiwgXGZCZGVjbmV0XGZSLCBcZkJpc29cZlIsIFxmQnN0cFxmUiwgXGZCaXB4XGZSLCBcZkluZXRiZXVpXGZQIgotQWJicmV2aWF0aW9ucyBmb3I6Ci0uaW4gKy41aQotLm5mCi1cZkJldGhlciBwcm90byBcZklwXGZSCi0uZmkKLS5pbiAtLjVpCi13aGVyZSBcZklwXGZSIGlzIG9uZSBvZiB0aGUgYWJvdmUgcHJvdG9jb2xzLgotLklQICJcZkJsYXRcZlIsIFxmQm1vcHJjXGZSLCBcZkJtb3BkbFxmUiIKLUFiYnJldmlhdGlvbnMgZm9yOgotLmluICsuNWkKLS5uZgotXGZCZXRoZXIgcHJvdG8gXGZJcFxmUgotLmZpCi0uaW4gLS41aQotd2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KLU5vdGUgdGhhdAotXGZJdGNwZHVtcFxmUCBkb2VzIG5vdCBjdXJyZW50bHkga25vdyBob3cgdG8gcGFyc2UgdGhlc2UgcHJvdG9jb2xzLgotLklQICJcZkJ2bGFuIFxmSVt2bGFuX2lkXVxmUiIKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJRUVFIDgwMi4xUSBWTEFOIHBhY2tldC4KLUlmIFxmSVt2bGFuX2lkXVxmUiBpcyBzcGVjaWZpZWQsIG9ubHkgdHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyB0aGUgc3BlY2lmaWVkCi1cZkl2bGFuX2lkXGZSLgotTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJ2bGFuXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgotY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCi10aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBWTEFOIHBhY2tldC4gIFRoZSBcZkJ2bGFuCi1cZklbdmxhbl9pZF1cZlIgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSwgdG8gZmlsdGVyIG9uIFZMQU4KLWhpZXJhcmNoaWVzLiAgRWFjaCB1c2Ugb2YgdGhhdCBleHByZXNzaW9uIGluY3JlbWVudHMgdGhlIGZpbHRlciBvZmZzZXRzCi1ieSA0LgotLklQCi1Gb3IgZXhhbXBsZToKLS5pbiArLjVpCi0ubmYKLVxmQnZsYW4gMTAwICYmIHZsYW4gMjAwXGZSCi0uZmkKLS5pbiAtLjVpCi1maWx0ZXJzIG9uIFZMQU4gMjAwIGVuY2Fwc3VsYXRlZCB3aXRoaW4gVkxBTiAxMDAsIGFuZAotLmluICsuNWkKLS5uZgotXGZCdmxhbiAmJiB2bGFuIDMwMCAmJiBpcFxmUgotLmZpCi0uaW4gLS41aQotZmlsdGVycyBJUHY0IHByb3RvY29scyBlbmNhcHN1bGF0ZWQgaW4gVkxBTiAzMDAgZW5jYXBzdWxhdGVkIHdpdGhpbiBhbnkKLWhpZ2hlciBvcmRlciBWTEFOLgotLklQICJcZkJtcGxzIFxmSVtsYWJlbF9udW1dXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIE1QTFMgcGFja2V0LgotSWYgXGZJW2xhYmVsX251bV1cZlIgaXMgc3BlY2lmaWVkLCBvbmx5IHRydWUgaXMgdGhlIHBhY2tldCBoYXMgdGhlIHNwZWNpZmllZAotXGZJbGFiZWxfbnVtXGZSLgotTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJtcGxzXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgotY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCi10aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBNUExTLWVuY2Fwc3VsYXRlZCBJUCBwYWNrZXQuICBUaGUKLVxmQm1wbHMgXGZJW2xhYmVsX251bV1cZlIgZXhwcmVzc2lvbiBtYXkgYmUgdXNlZCBtb3JlIHRoYW4gb25jZSwgdG8KLWZpbHRlciBvbiBNUExTIGhpZXJhcmNoaWVzLiAgRWFjaCB1c2Ugb2YgdGhhdCBleHByZXNzaW9uIGluY3JlbWVudHMgdGhlCi1maWx0ZXIgb2Zmc2V0cyBieSA0LiAKLS5JUAotRm9yIGV4YW1wbGU6Ci0uaW4gKy41aQotLm5mCi1cZkJtcGxzIDEwMDAwMCAmJiBtcGxzIDEwMjRcZlIKLS5maQotLmluIC0uNWkKLWZpbHRlcnMgcGFja2V0cyB3aXRoIGFuIG91dGVyIGxhYmVsIG9mIDEwMDAwMCBhbmQgYW4gaW5uZXIgbGFiZWwgb2YKLTEwMjQsIGFuZAotLmluICsuNWkKLS5uZgotXGZCbXBscyAmJiBtcGxzIDEwMjQgJiYgaG9zdCAxOTIuOS4yMDAuMVxmUgotLmZpCi0uaW4gLS41aQotZmlsdGVycyBwYWNrZXRzIHRvIG9yIGZyb20gMTkyLjkuMjAwLjEgd2l0aCBhbiBpbm5lciBsYWJlbCBvZiAxMDI0IGFuZAotYW55IG91dGVyIGxhYmVsLgotLklQIFxmQnBwcG9lZFxmUAotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGEgUFBQLW92ZXItRXRoZXJuZXQgRGlzY292ZXJ5IHBhY2tldCAoRXRoZXJuZXQKLXR5cGUgMHg4ODYzKS4KLS5JUCBcZkJwcHBvZXNcZlAKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhIFBQUC1vdmVyLUV0aGVybmV0IFNlc3Npb24gcGFja2V0IChFdGhlcm5ldAotdHlwZSAweDg4NjQpLgotTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJwcHBvZXNcZlIga2V5d29yZCBlbmNvdW50ZXJlZCBpbiBcZklleHByZXNzaW9uXGZSCi1jaGFuZ2VzIHRoZSBkZWNvZGluZyBvZmZzZXRzIGZvciB0aGUgcmVtYWluZGVyIG9mIFxmSWV4cHJlc3Npb25cZlIgb24KLXRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBhIFBQUG9FIHNlc3Npb24gcGFja2V0LgotLklQCi1Gb3IgZXhhbXBsZToKLS5pbiArLjVpCi0ubmYKLVxmQnBwcG9lcyAmJiBpcFxmUgotLmZpCi0uaW4gLS41aQotZmlsdGVycyBJUHY0IHByb3RvY29scyBlbmNhcHN1bGF0ZWQgaW4gUFBQb0UuCi0uSVAgICJcZkJ0Y3BcZlIsIFxmQnVkcFxmUiwgXGZCaWNtcFxmUiIKLUFiYnJldmlhdGlvbnMgZm9yOgotLmluICsuNWkKLS5uZgotXGZCaXAgcHJvdG8gXGZJcFxmUlxmQiBvciBpcDYgcHJvdG8gXGZJcFxmUgotLmZpCi0uaW4gLS41aQotd2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KLS5JUCAiXGZCaXNvIHByb3RvIFxmSXByb3RvY29sXGZSIgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIE9TSSBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZSBcZklwcm90b2NvbFxmUC4KLVxmSVByb3RvY29sXGZQIGNhbiBiZSBhIG51bWJlciBvciBvbmUgb2YgdGhlIG5hbWVzCi1cZkJjbG5wXGZQLCBcZkJlc2lzXGZQLCBvciBcZkJpc2lzXGZQLgotLklQICJcZkJjbG5wXGZSLCBcZkJlc2lzXGZSLCBcZkJpc2lzXGZSIgotQWJicmV2aWF0aW9ucyBmb3I6Ci0uaW4gKy41aQotLm5mCi1cZkJpc28gcHJvdG8gXGZJcFxmUgotLmZpCi0uaW4gLS41aQotd2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KLS5JUCAiXGZCbDFcZlIsIFxmQmwyXGZSLCBcZkJpaWhcZlIsIFxmQmxzcFxmUiwgXGZCc25wXGZSLCBcZkJjc25wXGZSLCBcZkJwc25wXGZSIgotQWJicmV2aWF0aW9ucyBmb3IgSVMtSVMgUERVIHR5cGVzLgotLklQICJcZkJ2cGlcZlAgXGZJblxmUgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgd2l0aCBhCi12aXJ0dWFsIHBhdGggaWRlbnRpZmllciBvZgotLklSIG4gLgotLklQICJcZkJ2Y2lcZlAgXGZJblxmUgotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgd2l0aCBhCi12aXJ0dWFsIGNoYW5uZWwgaWRlbnRpZmllciBvZgotLklSIG4gLgotLklQIFxmQmxhbmVcZlAKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcwotYW4gQVRNIExBTkUgcGFja2V0LgotTm90ZSB0aGF0IHRoZSBmaXJzdCBcZkJsYW5lXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgotY2hhbmdlcyB0aGUgdGVzdHMgZG9uZSBpbiB0aGUgcmVtYWluZGVyIG9mIFxmSWV4cHJlc3Npb25cZlIKLW9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBlaXRoZXIgYSBMQU5FIGVtdWxhdGVkIEV0aGVybmV0Ci1wYWNrZXQgb3IgYSBMQU5FIExFIENvbnRyb2wgcGFja2V0LiAgSWYgXGZCbGFuZVxmUiBpc24ndCBzcGVjaWZpZWQsIHRoZQotdGVzdHMgYXJlIGRvbmUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGFuCi1MTEMtZW5jYXBzdWxhdGVkIHBhY2tldC4KLS5JUCBcZkJsbGNcZlAKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcwotYW4gTExDLWVuY2Fwc3VsYXRlZCBwYWNrZXQuCi0uSVAgXGZCb2FtZjRzXGZQCi1UcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKLWEgc2VnbWVudCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIFZDST0zKS4KLS5JUCBcZkJvYW1mNGVcZlAKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcwotYW4gZW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIFZDST00KS4KLS5JUCBcZkJvYW1mNFxmUAotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCi1hIHNlZ21lbnQgb3IgZW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIChWQ0k9MyB8IFZDST00KSkuCi0uSVAgXGZCb2FtXGZQCi1UcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKLWEgc2VnbWVudCBvciBlbmQtdG8tZW5kIE9BTSBGNCBmbG93IGNlbGwgKFZQST0wICYgKFZDST0zIHwgVkNJPTQpKS4KLS5JUCBcZkJtZXRhY1xmUAotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCi1vbiBhIG1ldGEgc2lnbmFsaW5nIGNpcmN1aXQgKFZQST0wICYgVkNJPTEpLgotLklQIFxmQmJjY1xmUAotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCi1vbiBhIGJyb2FkY2FzdCBzaWduYWxpbmcgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9MikuCi0uSVAgXGZCc2NcZlAKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcwotb24gYSBzaWduYWxpbmcgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9NSkuCi0uSVAgXGZCaWxtaWNcZlAKLVRydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcwotb24gYW4gSUxNSSBjaXJjdWl0IChWUEk9MCAmIFZDST0xNikuCi0uSVAgXGZCY29ubmVjdG1zZ1xmUAotVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCi1vbiBhIHNpZ25hbGluZyBjaXJjdWl0IGFuZCBpcyBhIFEuMjkzMSBTZXR1cCwgQ2FsbCBQcm9jZWVkaW5nLCBDb25uZWN0LAotQ29ubmVjdCBBY2ssIFJlbGVhc2UsIG9yIFJlbGVhc2UgRG9uZSBtZXNzYWdlLgotLklQIFxmQm1ldGFjb25uZWN0XGZQCi1UcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKLW9uIGEgbWV0YSBzaWduYWxpbmcgY2lyY3VpdCBhbmQgaXMgYSBRLjI5MzEgU2V0dXAsIENhbGwgUHJvY2VlZGluZywgQ29ubmVjdCwKLVJlbGVhc2UsIG9yIFJlbGVhc2UgRG9uZSBtZXNzYWdlLgotLklQICAiXGZJZXhwciByZWxvcCBleHByXGZSIgotVHJ1ZSBpZiB0aGUgcmVsYXRpb24gaG9sZHMsIHdoZXJlIFxmSXJlbG9wXGZSIGlzIG9uZSBvZiA+LCA8LCA+PSwgPD0sID0sCi0hPSwgYW5kIFxmSWV4cHJcZlIgaXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGludGVnZXIKLWNvbnN0YW50cyAoZXhwcmVzc2VkIGluIHN0YW5kYXJkIEMgc3ludGF4KSwgdGhlIG5vcm1hbCBiaW5hcnkgb3BlcmF0b3JzCi1bKywgLSwgKiwgLywgJiwgfCwgPDwsID4+XSwgYSBsZW5ndGggb3BlcmF0b3IsIGFuZCBzcGVjaWFsIHBhY2tldCBkYXRhCi1hY2Nlc3NvcnMuICBOb3RlIHRoYXQgYWxsIGNvbXBhcmlzb25zIGFyZSB1bnNpZ25lZCwgc28gdGhhdCwgZm9yIGV4YW1wbGUsCi0weDgwMDAwMDAwIGFuZCAweGZmZmZmZmZmIGFyZSA+IDAuCi1UbyBhY2Nlc3MKLWRhdGEgaW5zaWRlIHRoZSBwYWNrZXQsIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKLS5pbiArLjVpCi0ubmYKLVxmSXByb3RvXGZCIFsgXGZJZXhwclxmQiA6IFxmSXNpemVcZkIgXVxmUgotLmZpCi0uaW4gLS41aQotXGZJUHJvdG9cZlIgaXMgb25lIG9mIFxmQmV0aGVyLCBmZGRpLCB0ciwgd2xhbiwgcHBwLCBzbGlwLCBsaW5rLAotaXAsIGFycCwgcmFycCwgdGNwLCB1ZHAsIGljbXAsIGlwNlxmUiBvciBcZkJyYWRpb1xmUiwgYW5kCi1pbmRpY2F0ZXMgdGhlIHByb3RvY29sIGxheWVyIGZvciB0aGUgaW5kZXggb3BlcmF0aW9uLgotKFxmQmV0aGVyLCBmZGRpLCB3bGFuLCB0ciwgcHBwLCBzbGlwXGZSIGFuZCBcZkJsaW5rXGZSIGFsbCByZWZlciB0byB0aGUKLWxpbmsgbGF5ZXIuIFxmQnJhZGlvXGZSIHJlZmVycyB0byB0aGUgInJhZGlvIGhlYWRlciIgYWRkZWQgdG8gc29tZQotODAyLjExIGNhcHR1cmVzLikKLU5vdGUgdGhhdCBcZkl0Y3AsIHVkcFxmUiBhbmQgb3RoZXIgdXBwZXItbGF5ZXIgcHJvdG9jb2wgdHlwZXMgb25seQotYXBwbHkgdG8gSVB2NCwgbm90IElQdjYgKHRoaXMgd2lsbCBiZSBmaXhlZCBpbiB0aGUgZnV0dXJlKS4KLVRoZSBieXRlIG9mZnNldCwgcmVsYXRpdmUgdG8gdGhlIGluZGljYXRlZCBwcm90b2NvbCBsYXllciwgaXMKLWdpdmVuIGJ5IFxmSWV4cHJcZlIuCi1cZklTaXplXGZSIGlzIG9wdGlvbmFsIGFuZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLWZpZWxkIG9mIGludGVyZXN0OyBpdCBjYW4gYmUgZWl0aGVyIG9uZSwgdHdvLCBvciBmb3VyLCBhbmQgZGVmYXVsdHMgdG8gb25lLgotVGhlIGxlbmd0aCBvcGVyYXRvciwgaW5kaWNhdGVkIGJ5IHRoZSBrZXl3b3JkIFxmQmxlblxmUCwgZ2l2ZXMgdGhlCi1sZW5ndGggb2YgdGhlIHBhY2tldC4KLQotRm9yIGV4YW1wbGUsIGBcZkJldGhlclswXSAmIDEgIT0gMFxmUCcgY2F0Y2hlcyBhbGwgbXVsdGljYXN0IHRyYWZmaWMuCi1UaGUgZXhwcmVzc2lvbiBgXGZCaXBbMF0gJiAweGYgIT0gNVxmUCcKLWNhdGNoZXMgYWxsIElQdjQgcGFja2V0cyB3aXRoIG9wdGlvbnMuCi1UaGUgZXhwcmVzc2lvbgotYFxmQmlwWzY6Ml0gJiAweDFmZmYgPSAwXGZQJwotY2F0Y2hlcyBvbmx5IHVuZnJhZ21lbnRlZCBJUHY0IGRhdGFncmFtcyBhbmQgZnJhZyB6ZXJvIG9mIGZyYWdtZW50ZWQKLUlQdjQgZGF0YWdyYW1zLgotVGhpcyBjaGVjayBpcyBpbXBsaWNpdGx5IGFwcGxpZWQgdG8gdGhlIFxmQnRjcFxmUCBhbmQgXGZCdWRwXGZQCi1pbmRleCBvcGVyYXRpb25zLgotRm9yIGluc3RhbmNlLCBcZkJ0Y3BbMF1cZlAgYWx3YXlzIG1lYW5zIHRoZSBmaXJzdAotYnl0ZSBvZiB0aGUgVENQIFxmSWhlYWRlclxmUCwgYW5kIG5ldmVyIG1lYW5zIHRoZSBmaXJzdCBieXRlIG9mIGFuCi1pbnRlcnZlbmluZyBmcmFnbWVudC4KLQotU29tZSBvZmZzZXRzIGFuZCBmaWVsZCB2YWx1ZXMgbWF5IGJlIGV4cHJlc3NlZCBhcyBuYW1lcyByYXRoZXIgdGhhbgotYXMgbnVtZXJpYyB2YWx1ZXMuCi1UaGUgZm9sbG93aW5nIHByb3RvY29sIGhlYWRlciBmaWVsZCBvZmZzZXRzIGFyZQotYXZhaWxhYmxlOiBcZkJpY21wdHlwZVxmUCAoSUNNUCB0eXBlIGZpZWxkKSwgXGZCaWNtcGNvZGVcZlAgKElDTVAKLWNvZGUgZmllbGQpLCBhbmQgXGZCdGNwZmxhZ3NcZlAgKFRDUCBmbGFncyBmaWVsZCkuCi0KLVRoZSBmb2xsb3dpbmcgSUNNUCB0eXBlIGZpZWxkIHZhbHVlcyBhcmUgYXZhaWxhYmxlOiBcZkJpY21wLWVjaG9yZXBseVxmUCwKLVxmQmljbXAtdW5yZWFjaFxmUCwgXGZCaWNtcC1zb3VyY2VxdWVuY2hcZlAsIFxmQmljbXAtcmVkaXJlY3RcZlAsCi1cZkJpY21wLWVjaG9cZlAsIFxmQmljbXAtcm91dGVyYWR2ZXJ0XGZQLCBcZkJpY21wLXJvdXRlcnNvbGljaXRcZlAsCi1cZkJpY21wLXRpbXhjZWVkXGZQLCBcZkJpY21wLXBhcmFtcHJvYlxmUCwgXGZCaWNtcC10c3RhbXBcZlAsCi1cZkJpY21wLXRzdGFtcHJlcGx5XGZQLCBcZkJpY21wLWlyZXFcZlAsIFxmQmljbXAtaXJlcXJlcGx5XGZQLAotXGZCaWNtcC1tYXNrcmVxXGZQLCBcZkJpY21wLW1hc2tyZXBseVxmUC4KLQotVGhlIGZvbGxvd2luZyBUQ1AgZmxhZ3MgZmllbGQgdmFsdWVzIGFyZSBhdmFpbGFibGU6IFxmQnRjcC1maW5cZlAsCi1cZkJ0Y3Atc3luXGZQLCBcZkJ0Y3AtcnN0XGZQLCBcZkJ0Y3AtcHVzaFxmUCwKLVxmQnRjcC1hY2tcZlAsIFxmQnRjcC11cmdcZlAuCi0uTFAKLVByaW1pdGl2ZXMgbWF5IGJlIGNvbWJpbmVkIHVzaW5nOgotLklQCi1BIHBhcmVudGhlc2l6ZWQgZ3JvdXAgb2YgcHJpbWl0aXZlcyBhbmQgb3BlcmF0b3JzCi0ocGFyZW50aGVzZXMgYXJlIHNwZWNpYWwgdG8gdGhlIFNoZWxsIGFuZCBtdXN0IGJlIGVzY2FwZWQpLgotLklQCi1OZWdhdGlvbiAoYFxmQiFcZlAnIG9yIGBcZkJub3RcZlAnKS4KLS5JUAotQ29uY2F0ZW5hdGlvbiAoYFxmQiYmXGZQJyBvciBgXGZCYW5kXGZQJykuCi0uSVAKLUFsdGVybmF0aW9uIChgXGZCfHxcZlAnIG9yIGBcZkJvclxmUCcpLgotLkxQCi1OZWdhdGlvbiBoYXMgaGlnaGVzdCBwcmVjZWRlbmNlLgotQWx0ZXJuYXRpb24gYW5kIGNvbmNhdGVuYXRpb24gaGF2ZSBlcXVhbCBwcmVjZWRlbmNlIGFuZCBhc3NvY2lhdGUKLWxlZnQgdG8gcmlnaHQuCi1Ob3RlIHRoYXQgZXhwbGljaXQgXGZCYW5kXGZSIHRva2Vucywgbm90IGp1eHRhcG9zaXRpb24sCi1hcmUgbm93IHJlcXVpcmVkIGZvciBjb25jYXRlbmF0aW9uLgotLkxQCi1JZiBhbiBpZGVudGlmaWVyIGlzIGdpdmVuIHdpdGhvdXQgYSBrZXl3b3JkLCB0aGUgbW9zdCByZWNlbnQga2V5d29yZAotaXMgYXNzdW1lZC4KLUZvciBleGFtcGxlLAotLmluICsuNWkKLS5uZgotXGZCbm90IGhvc3QgdnMgYW5kIGFjZVxmUgotLmZpCi0uaW4gLS41aQotaXMgc2hvcnQgZm9yCi0uaW4gKy41aQotLm5mCi1cZkJub3QgaG9zdCB2cyBhbmQgaG9zdCBhY2VcZlIKLS5maQotLmluIC0uNWkKLXdoaWNoIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aAotLmluICsuNWkKLS5uZgotXGZCbm90ICggaG9zdCB2cyBvciBhY2UgKVxmUgotLmZpCi0uaW4gLS41aQotLkxQCi1FeHByZXNzaW9uIGFyZ3VtZW50cyBjYW4gYmUgcGFzc2VkIHRvIFxmSXRjcGR1bXBcZlAgYXMgZWl0aGVyIGEgc2luZ2xlCi1hcmd1bWVudCBvciBhcyBtdWx0aXBsZSBhcmd1bWVudHMsIHdoaWNoZXZlciBpcyBtb3JlIGNvbnZlbmllbnQuCi1HZW5lcmFsbHksIGlmIHRoZSBleHByZXNzaW9uIGNvbnRhaW5zIFNoZWxsIG1ldGFjaGFyYWN0ZXJzLCBpdCBpcwotZWFzaWVyIHRvIHBhc3MgaXQgYXMgYSBzaW5nbGUsIHF1b3RlZCBhcmd1bWVudC4KLU11bHRpcGxlIGFyZ3VtZW50cyBhcmUgY29uY2F0ZW5hdGVkIHdpdGggc3BhY2VzIGJlZm9yZSBiZWluZyBwYXJzZWQuCi0uU0ggRVhBTVBMRVMKLS5MUAotVG8gcHJpbnQgYWxsIHBhY2tldHMgYXJyaXZpbmcgYXQgb3IgZGVwYXJ0aW5nIGZyb20gXGZJc3VuZG93blxmUDoKLS5SUwotLm5mCi1cZkJ0Y3BkdW1wIGhvc3Qgc3VuZG93blxmUAotLmZpCi0uUkUKLS5MUAotVG8gcHJpbnQgdHJhZmZpYyBiZXR3ZWVuIFxmSWhlbGlvc1xmUiBhbmQgZWl0aGVyIFxmSWhvdFxmUiBvciBcZklhY2VcZlI6Ci0uUlMKLS5uZgotXGZCdGNwZHVtcCBob3N0IGhlbGlvcyBhbmQgXFwoIGhvdCBvciBhY2UgXFwpXGZQCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBhbGwgSVAgcGFja2V0cyBiZXR3ZWVuIFxmSWFjZVxmUiBhbmQgYW55IGhvc3QgZXhjZXB0IFxmSWhlbGlvc1xmUjoKLS5SUwotLm5mCi1cZkJ0Y3BkdW1wIGlwIGhvc3QgYWNlIGFuZCBub3QgaGVsaW9zXGZQCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBhbGwgdHJhZmZpYyBiZXR3ZWVuIGxvY2FsIGhvc3RzIGFuZCBob3N0cyBhdCBCZXJrZWxleToKLS5SUwotLm5mCi0uQgotdGNwZHVtcCBuZXQgdWNiLWV0aGVyCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBhbGwgZnRwIHRyYWZmaWMgdGhyb3VnaCBpbnRlcm5ldCBnYXRld2F5IFxmSXNudXBcZlA6Ci0obm90ZSB0aGF0IHRoZSBleHByZXNzaW9uIGlzIHF1b3RlZCB0byBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tCi0obWlzLSlpbnRlcnByZXRpbmcgdGhlIHBhcmVudGhlc2VzKToKLS5SUwotLm5mCi0uQgotdGNwZHVtcCAnZ2F0ZXdheSBzbnVwIGFuZCAocG9ydCBmdHAgb3IgZnRwLWRhdGEpJwotLmZpCi0uUkUKLS5MUAotVG8gcHJpbnQgdHJhZmZpYyBuZWl0aGVyIHNvdXJjZWQgZnJvbSBub3IgZGVzdGluZWQgZm9yIGxvY2FsIGhvc3RzCi0oaWYgeW91IGdhdGV3YXkgdG8gb25lIG90aGVyIG5ldCwgdGhpcyBzdHVmZiBzaG91bGQgbmV2ZXIgbWFrZSBpdAotb250byB5b3VyIGxvY2FsIG5ldCkuCi0uUlMKLS5uZgotLkIKLXRjcGR1bXAgaXAgYW5kIG5vdCBuZXQgXGZJbG9jYWxuZXRcZlAKLS5maQotLlJFCi0uTFAKLVRvIHByaW50IHRoZSBzdGFydCBhbmQgZW5kIHBhY2tldHMgKHRoZSBTWU4gYW5kIEZJTiBwYWNrZXRzKSBvZiBlYWNoCi1UQ1AgY29udmVyc2F0aW9uIHRoYXQgaW52b2x2ZXMgYSBub24tbG9jYWwgaG9zdC4KLS5SUwotLm5mCi0uQgotdGNwZHVtcCAndGNwW3RjcGZsYWdzXSAmICh0Y3Atc3lufHRjcC1maW4pICE9IDAgYW5kIG5vdCBzcmMgYW5kIGRzdCBuZXQgXGZJbG9jYWxuZXRcZlAnCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBhbGwgSVB2NCBIVFRQIHBhY2tldHMgdG8gYW5kIGZyb20gcG9ydCA4MCwgaS5lLiBwcmludCBvbmx5Ci1wYWNrZXRzIHRoYXQgY29udGFpbiBkYXRhLCBub3QsIGZvciBleGFtcGxlLCBTWU4gYW5kIEZJTiBwYWNrZXRzIGFuZAotQUNLLW9ubHkgcGFja2V0cy4gIChJUHY2IGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgZm9yIHRoZSByZWFkZXIuKQotLlJTCi0ubmYKLS5CCi10Y3BkdW1wICd0Y3AgcG9ydCA4MCBhbmQgKCgoaXBbMjoyXSAtICgoaXBbMF0mMHhmKTw8MikpIC0gKCh0Y3BbMTJdJjB4ZjApPj4yKSkgIT0gMCknCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBJUCBwYWNrZXRzIGxvbmdlciB0aGFuIDU3NiBieXRlcyBzZW50IHRocm91Z2ggZ2F0ZXdheSBcZklzbnVwXGZQOgotLlJTCi0ubmYKLS5CCi10Y3BkdW1wICdnYXRld2F5IHNudXAgYW5kIGlwWzI6Ml0gPiA1NzYnCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBJUCBicm9hZGNhc3Qgb3IgbXVsdGljYXN0IHBhY2tldHMgdGhhdCB3ZXJlCi0uSSBub3QKLXNlbnQgdmlhIEV0aGVybmV0IGJyb2FkY2FzdCBvciBtdWx0aWNhc3Q6Ci0uUlMKLS5uZgotLkIKLXRjcGR1bXAgJ2V0aGVyWzBdICYgMSA9IDAgYW5kIGlwWzE2XSA+PSAyMjQnCi0uZmkKLS5SRQotLkxQCi1UbyBwcmludCBhbGwgSUNNUCBwYWNrZXRzIHRoYXQgYXJlIG5vdCBlY2hvIHJlcXVlc3RzL3JlcGxpZXMgKGkuZS4sIG5vdAotcGluZyBwYWNrZXRzKToKLS5SUwotLm5mCi0uQgotdGNwZHVtcCAnaWNtcFtpY21wdHlwZV0gIT0gaWNtcC1lY2hvIGFuZCBpY21wW2ljbXB0eXBlXSAhPSBpY21wLWVjaG9yZXBseScKLS5maQotLlJFCi0uU0ggT1VUUFVUIEZPUk1BVAotLkxQCi1UaGUgb3V0cHV0IG9mIFxmSXRjcGR1bXBcZlAgaXMgcHJvdG9jb2wgZGVwZW5kZW50LgotVGhlIGZvbGxvd2luZwotZ2l2ZXMgYSBicmllZiBkZXNjcmlwdGlvbiBhbmQgZXhhbXBsZXMgb2YgbW9zdCBvZiB0aGUgZm9ybWF0cy4KLS5kZSBIRAotLnNwIDEuNQotLkIKLS4uCi0uSEQKLUxpbmsgTGV2ZWwgSGVhZGVycwotLkxQCi1JZiB0aGUgJy1lJyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rIGxldmVsIGhlYWRlciBpcyBwcmludGVkIG91dC4KLU9uIEV0aGVybmV0cywgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBwcm90b2NvbCwKLWFuZCBwYWNrZXQgbGVuZ3RoIGFyZSBwcmludGVkLgotLkxQCi1PbiBGRERJIG5ldHdvcmtzLCB0aGUgICctZScgb3B0aW9uIGNhdXNlcyBcZkl0Y3BkdW1wXGZQIHRvIHByaW50Ci10aGUgYGZyYW1lIGNvbnRyb2wnIGZpZWxkLCAgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLAotYW5kIHRoZSBwYWNrZXQgbGVuZ3RoLgotKFRoZSBgZnJhbWUgY29udHJvbCcgZmllbGQgZ292ZXJucyB0aGUKLWludGVycHJldGF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZSBwYWNrZXQuCi1Ob3JtYWwgcGFja2V0cyAoc3VjaAotYXMgdGhvc2UgY29udGFpbmluZyBJUCBkYXRhZ3JhbXMpIGFyZSBgYXN5bmMnIHBhY2tldHMsIHdpdGggYSBwcmlvcml0eQotdmFsdWUgYmV0d2VlbiAwIGFuZCA3OyBmb3IgZXhhbXBsZSwgYFxmQmFzeW5jNFxmUicuCi1TdWNoIHBhY2tldHMKLWFyZSBhc3N1bWVkIHRvIGNvbnRhaW4gYW4gODAyLjIgTG9naWNhbCBMaW5rIENvbnRyb2wgKExMQykgcGFja2V0OwotdGhlIExMQyBoZWFkZXIgaXMgcHJpbnRlZCBpZiBpdCBpcyBcZklub3RcZlIgYW4gSVNPIGRhdGFncmFtIG9yIGEKLXNvLWNhbGxlZCBTTkFQIHBhY2tldC4KLS5MUAotT24gVG9rZW4gUmluZyBuZXR3b3JrcywgdGhlICctZScgb3B0aW9uIGNhdXNlcyBcZkl0Y3BkdW1wXGZQIHRvIHByaW50Ci10aGUgYGFjY2VzcyBjb250cm9sJyBhbmQgYGZyYW1lIGNvbnRyb2wnIGZpZWxkcywgdGhlIHNvdXJjZSBhbmQKLWRlc3RpbmF0aW9uIGFkZHJlc3NlcywgYW5kIHRoZSBwYWNrZXQgbGVuZ3RoLgotQXMgb24gRkRESSBuZXR3b3JrcywKLXBhY2tldHMgYXJlIGFzc3VtZWQgdG8gY29udGFpbiBhbiBMTEMgcGFja2V0LgotUmVnYXJkbGVzcyBvZiB3aGV0aGVyCi10aGUgJy1lJyBvcHRpb24gaXMgc3BlY2lmaWVkIG9yIG5vdCwgdGhlIHNvdXJjZSByb3V0aW5nIGluZm9ybWF0aW9uIGlzCi1wcmludGVkIGZvciBzb3VyY2Utcm91dGVkIHBhY2tldHMuCi0uTFAKLU9uIDgwMi4xMSBuZXR3b3JrcywgdGhlICctZScgb3B0aW9uIGNhdXNlcyBcZkl0Y3BkdW1wXGZQIHRvIHByaW50Ci10aGUgYGZyYW1lIGNvbnRyb2wnIGZpZWxkcywgYWxsIG9mIHRoZSBhZGRyZXNzZXMgaW4gdGhlIDgwMi4xMSBoZWFkZXIsCi1hbmQgdGhlIHBhY2tldCBsZW5ndGguCi1BcyBvbiBGRERJIG5ldHdvcmtzLAotcGFja2V0cyBhcmUgYXNzdW1lZCB0byBjb250YWluIGFuIExMQyBwYWNrZXQuCi0uTFAKLVxmSShOLkIuOiBUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aAotdGhlIFNMSVAgY29tcHJlc3Npb24gYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBSRkMtMTE0NC4pXGZQCi0uTFAKLU9uIFNMSVAgbGlua3MsIGEgZGlyZWN0aW9uIGluZGljYXRvciAoYGBJJycgZm9yIGluYm91bmQsIGBgTycnIGZvciBvdXRib3VuZCksCi1wYWNrZXQgdHlwZSwgYW5kIGNvbXByZXNzaW9uIGluZm9ybWF0aW9uIGFyZSBwcmludGVkIG91dC4KLVRoZSBwYWNrZXQgdHlwZSBpcyBwcmludGVkIGZpcnN0LgotVGhlIHRocmVlIHR5cGVzIGFyZSBcZklpcFxmUCwgXGZJdXRjcFxmUCwgYW5kIFxmSWN0Y3BcZlAuCi1ObyBmdXJ0aGVyIGxpbmsgaW5mb3JtYXRpb24gaXMgcHJpbnRlZCBmb3IgXGZJaXBcZlIgcGFja2V0cy4KLUZvciBUQ1AgcGFja2V0cywgdGhlIGNvbm5lY3Rpb24gaWRlbnRpZmllciBpcyBwcmludGVkIGZvbGxvd2luZyB0aGUgdHlwZS4KLUlmIHRoZSBwYWNrZXQgaXMgY29tcHJlc3NlZCwgaXRzIGVuY29kZWQgaGVhZGVyIGlzIHByaW50ZWQgb3V0LgotVGhlIHNwZWNpYWwgY2FzZXMgYXJlIHByaW50ZWQgb3V0IGFzCi1cZkIqUytcZkluXGZSIGFuZCBcZkIqU0ErXGZJblxmUiwgd2hlcmUgXGZJblxmUiBpcyB0aGUgYW1vdW50IGJ5IHdoaWNoCi10aGUgc2VxdWVuY2UgbnVtYmVyIChvciBzZXF1ZW5jZSBudW1iZXIgYW5kIGFjaykgaGFzIGNoYW5nZWQuCi1JZiBpdCBpcyBub3QgYSBzcGVjaWFsIGNhc2UsCi16ZXJvIG9yIG1vcmUgY2hhbmdlcyBhcmUgcHJpbnRlZC4KLUEgY2hhbmdlIGlzIGluZGljYXRlZCBieSBVICh1cmdlbnQgcG9pbnRlciksIFcgKHdpbmRvdyksIEEgKGFjayksCi1TIChzZXF1ZW5jZSBudW1iZXIpLCBhbmQgSSAocGFja2V0IElEKSwgZm9sbG93ZWQgYnkgYSBkZWx0YSAoK24gb3IgLW4pLAotb3IgYSBuZXcgdmFsdWUgKD1uKS4KLUZpbmFsbHksIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgcGFja2V0IGFuZCBjb21wcmVzc2VkIGhlYWRlciBsZW5ndGgKLWFyZSBwcmludGVkLgotLkxQCi1Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBsaW5lIHNob3dzIGFuIG91dGJvdW5kIGNvbXByZXNzZWQgVENQIHBhY2tldCwKLXdpdGggYW4gaW1wbGljaXQgY29ubmVjdGlvbiBpZGVudGlmaWVyOyB0aGUgYWNrIGhhcyBjaGFuZ2VkIGJ5IDYsCi10aGUgc2VxdWVuY2UgbnVtYmVyIGJ5IDQ5LCBhbmQgdGhlIHBhY2tldCBJRCBieSA2OyB0aGVyZSBhcmUgMyBieXRlcyBvZgotZGF0YSBhbmQgNiBieXRlcyBvZiBjb21wcmVzc2VkIGhlYWRlcjoKLS5SUwotLm5mCi1cZkJPIGN0Y3AgKiBBKzYgUys0OSBJKzYgMyAoNilcZlAKLS5maQotLlJFCi0uSEQKLUFSUC9SQVJQIFBhY2tldHMKLS5MUAotQXJwL3JhcnAgb3V0cHV0IHNob3dzIHRoZSB0eXBlIG9mIHJlcXVlc3QgYW5kIGl0cyBhcmd1bWVudHMuCi1UaGUKLWZvcm1hdCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmIGV4cGxhbmF0b3J5LgotSGVyZSBpcyBhIHNob3J0IHNhbXBsZSB0YWtlbiBmcm9tIHRoZSBzdGFydCBvZiBhbiBgcmxvZ2luJyBmcm9tCi1ob3N0IFxmSXJ0c2dcZlAgdG8gaG9zdCBcZkljc2FtXGZQOgotLlJTCi0ubmYKLS5zcCAuNQotXGYoQ1dhcnAgd2hvLWhhcyBjc2FtIHRlbGwgcnRzZwotYXJwIHJlcGx5IGNzYW0gaXMtYXQgQ1NBTVxmUgotLnNwIC41Ci0uZmkKLS5SRQotVGhlIGZpcnN0IGxpbmUgc2F5cyB0aGF0IHJ0c2cgc2VudCBhbiBhcnAgcGFja2V0IGFza2luZwotZm9yIHRoZSBFdGhlcm5ldCBhZGRyZXNzIG9mIGludGVybmV0IGhvc3QgY3NhbS4KLUNzYW0KLXJlcGxpZXMgd2l0aCBpdHMgRXRoZXJuZXQgYWRkcmVzcyAoaW4gdGhpcyBleGFtcGxlLCBFdGhlcm5ldCBhZGRyZXNzZXMKLWFyZSBpbiBjYXBzIGFuZCBpbnRlcm5ldCBhZGRyZXNzZXMgaW4gbG93ZXIgY2FzZSkuCi0uTFAKLVRoaXMgd291bGQgbG9vayBsZXNzIHJlZHVuZGFudCBpZiB3ZSBoYWQgZG9uZSBcZkl0Y3BkdW1wIFwtblxmUDoKLS5SUwotLm5mCi0uc3AgLjUKLVxmKENXYXJwIHdoby1oYXMgMTI4LjMuMjU0LjYgdGVsbCAxMjguMy4yNTQuNjgKLWFycCByZXBseSAxMjguMy4yNTQuNiBpcy1hdCAwMjowNzowMTowMDowMTpjNFxmUAotLmZpCi0uUkUKLS5MUAotSWYgd2UgaGFkIGRvbmUgXGZJdGNwZHVtcCBcLWVcZlAsIHRoZSBmYWN0IHRoYXQgdGhlIGZpcnN0IHBhY2tldCBpcwotYnJvYWRjYXN0IGFuZCB0aGUgc2Vjb25kIGlzIHBvaW50LXRvLXBvaW50IHdvdWxkIGJlIHZpc2libGU6Ci0uUlMKLS5uZgotLnNwIC41Ci1cZihDV1JUU0cgQnJvYWRjYXN0IDA4MDYgIDY0OiBhcnAgd2hvLWhhcyBjc2FtIHRlbGwgcnRzZwotQ1NBTSBSVFNHIDA4MDYgIDY0OiBhcnAgcmVwbHkgY3NhbSBpcy1hdCBDU0FNXGZSCi0uc3AgLjUKLS5maQotLlJFCi1Gb3IgdGhlIGZpcnN0IHBhY2tldCB0aGlzIHNheXMgdGhlIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzIGlzIFJUU0csIHRoZQotZGVzdGluYXRpb24gaXMgdGhlIEV0aGVybmV0IGJyb2FkY2FzdCBhZGRyZXNzLCB0aGUgdHlwZSBmaWVsZAotY29udGFpbmVkIGhleCAwODA2ICh0eXBlIEVUSEVSX0FSUCkgYW5kIHRoZSB0b3RhbCBsZW5ndGggd2FzIDY0IGJ5dGVzLgotLkhECi1UQ1AgUGFja2V0cwotLkxQCi1cZkkoTi5CLjpUaGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIGFzc3VtZXMgZmFtaWxpYXJpdHkgd2l0aAotdGhlIFRDUCBwcm90b2NvbCBkZXNjcmliZWQgaW4gUkZDLTc5My4KLUlmIHlvdSBhcmUgbm90IGZhbWlsaWFyCi13aXRoIHRoZSBwcm90b2NvbCwgbmVpdGhlciB0aGlzIGRlc2NyaXB0aW9uIG5vciBcZkl0Y3BkdW1wXGZQIHdpbGwKLWJlIG9mIG11Y2ggdXNlIHRvIHlvdS4pXGZQCi0uTFAKLVRoZSBnZW5lcmFsIGZvcm1hdCBvZiBhIHRjcCBwcm90b2NvbCBsaW5lIGlzOgotLlJTCi0ubmYKLS5zcCAuNQotXGZJc3JjID4gZHN0OiBmbGFncyBkYXRhLXNlcW5vIGFjayB3aW5kb3cgdXJnZW50IG9wdGlvbnNcZlAKLS5zcCAuNQotLmZpCi0uUkUKLVxmSVNyY1xmUCBhbmQgXGZJZHN0XGZQIGFyZSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBJUAotYWRkcmVzc2VzIGFuZCBwb3J0cy4KLVxmSUZsYWdzXGZQIGFyZSBzb21lIGNvbWJpbmF0aW9uIG9mIFMgKFNZTiksCi1GIChGSU4pLCBQIChQVVNIKSwgUiAoUlNUKSwgVyAoRUNOIENXUikgb3IgRSAoRUNOLUVjaG8pLCBvciBhIHNpbmdsZQotYC4nIChubyBmbGFncykuCi1cZklEYXRhLXNlcW5vXGZQIGRlc2NyaWJlcyB0aGUgcG9ydGlvbiBvZiBzZXF1ZW5jZSBzcGFjZSBjb3ZlcmVkCi1ieSB0aGUgZGF0YSBpbiB0aGlzIHBhY2tldCAoc2VlIGV4YW1wbGUgYmVsb3cpLgotXGZJQWNrXGZQIGlzIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgbmV4dCBkYXRhIGV4cGVjdGVkIHRoZSBvdGhlcgotZGlyZWN0aW9uIG9uIHRoaXMgY29ubmVjdGlvbi4KLVxmSVdpbmRvd1xmUCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHJlY2VpdmUgYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQotdGhlIG90aGVyIGRpcmVjdGlvbiBvbiB0aGlzIGNvbm5lY3Rpb24uCi1cZklVcmdcZlAgaW5kaWNhdGVzIHRoZXJlIGlzIGB1cmdlbnQnIGRhdGEgaW4gdGhlIHBhY2tldC4KLVxmSU9wdGlvbnNcZlAgYXJlIHRjcCBvcHRpb25zIGVuY2xvc2VkIGluIGFuZ2xlIGJyYWNrZXRzIChlLmcuLCA8bXNzIDEwMjQ+KS4KLS5MUAotXGZJU3JjLCBkc3RcZlAgYW5kIFxmSWZsYWdzXGZQIGFyZSBhbHdheXMgcHJlc2VudC4KLVRoZSBvdGhlciBmaWVsZHMKLWRlcGVuZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIHBhY2tldCdzIHRjcCBwcm90b2NvbCBoZWFkZXIgYW5kCi1hcmUgb3V0cHV0IG9ubHkgaWYgYXBwcm9wcmlhdGUuCi0uTFAKLUhlcmUgaXMgdGhlIG9wZW5pbmcgcG9ydGlvbiBvZiBhbiBybG9naW4gZnJvbSBob3N0IFxmSXJ0c2dcZlAgdG8KLWhvc3QgXGZJY3NhbVxmUC4KLS5SUwotLm5mCi0uc3AgLjUKLVxzLTJcZihDV3J0c2cuMTAyMyA+IGNzYW0ubG9naW46IFMgNzY4NTEyOjc2ODUxMigwKSB3aW4gNDA5NiA8bXNzIDEwMjQ+Ci1jc2FtLmxvZ2luID4gcnRzZy4xMDIzOiBTIDk0NzY0ODo5NDc2NDgoMCkgYWNrIDc2ODUxMyB3aW4gNDA5NiA8bXNzIDEwMjQ+Ci1ydHNnLjEwMjMgPiBjc2FtLmxvZ2luOiAuIGFjayAxIHdpbiA0MDk2Ci1ydHNnLjEwMjMgPiBjc2FtLmxvZ2luOiBQIDE6MigxKSBhY2sgMSB3aW4gNDA5NgotY3NhbS5sb2dpbiA+IHJ0c2cuMTAyMzogLiBhY2sgMiB3aW4gNDA5NgotcnRzZy4xMDIzID4gY3NhbS5sb2dpbjogUCAyOjIxKDE5KSBhY2sgMSB3aW4gNDA5NgotY3NhbS5sb2dpbiA+IHJ0c2cuMTAyMzogUCAxOjIoMSkgYWNrIDIxIHdpbiA0MDc3Ci1jc2FtLmxvZ2luID4gcnRzZy4xMDIzOiBQIDI6MygxKSBhY2sgMjEgd2luIDQwNzcgdXJnIDEKLWNzYW0ubG9naW4gPiBydHNnLjEwMjM6IFAgMzo0KDEpIGFjayAyMSB3aW4gNDA3NyB1cmcgMVxmUlxzKzIKLS5zcCAuNQotLmZpCi0uUkUKLVRoZSBmaXJzdCBsaW5lIHNheXMgdGhhdCB0Y3AgcG9ydCAxMDIzIG9uIHJ0c2cgc2VudCBhIHBhY2tldAotdG8gcG9ydCBcZklsb2dpblxmUAotb24gY3NhbS4KLVRoZSBcZkJTXGZQIGluZGljYXRlcyB0aGF0IHRoZSBcZklTWU5cZlAgZmxhZyB3YXMgc2V0LgotVGhlIHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgd2FzIDc2ODUxMiBhbmQgaXQgY29udGFpbmVkIG5vIGRhdGEuCi0oVGhlIG5vdGF0aW9uIGlzIGBmaXJzdDpsYXN0KG5ieXRlcyknIHdoaWNoIG1lYW5zIGBzZXF1ZW5jZQotbnVtYmVycyBcZklmaXJzdFxmUAotdXAgdG8gYnV0IG5vdCBpbmNsdWRpbmcgXGZJbGFzdFxmUCB3aGljaCBpcyBcZkluYnl0ZXNcZlAgYnl0ZXMgb2YgdXNlciBkYXRhJy4pCi1UaGVyZSB3YXMgbm8gcGlnZ3ktYmFja2VkIGFjaywgdGhlIGF2YWlsYWJsZSByZWNlaXZlIHdpbmRvdyB3YXMgNDA5NgotYnl0ZXMgYW5kIHRoZXJlIHdhcyBhIG1heC1zZWdtZW50LXNpemUgb3B0aW9uIHJlcXVlc3RpbmcgYW4gbXNzIG9mCi0xMDI0IGJ5dGVzLgotLkxQCi1Dc2FtIHJlcGxpZXMgd2l0aCBhIHNpbWlsYXIgcGFja2V0IGV4Y2VwdCBpdCBpbmNsdWRlcyBhIHBpZ2d5LWJhY2tlZAotYWNrIGZvciBydHNnJ3MgU1lOLgotUnRzZyB0aGVuIGFja3MgY3NhbSdzIFNZTi4KLVRoZSBgLicgbWVhbnMgbm8KLWZsYWdzIHdlcmUgc2V0LgotVGhlIHBhY2tldCBjb250YWluZWQgbm8gZGF0YSBzbyB0aGVyZSBpcyBubyBkYXRhIHNlcXVlbmNlIG51bWJlci4KLU5vdGUgdGhhdCB0aGUgYWNrIHNlcXVlbmNlCi1udW1iZXIgaXMgYSBzbWFsbCBpbnRlZ2VyICgxKS4KLVRoZSBmaXJzdCB0aW1lIFxmSXRjcGR1bXBcZlAgc2VlcyBhCi10Y3AgYGNvbnZlcnNhdGlvbicsIGl0IHByaW50cyB0aGUgc2VxdWVuY2UgbnVtYmVyIGZyb20gdGhlIHBhY2tldC4KLU9uIHN1YnNlcXVlbnQgcGFja2V0cyBvZiB0aGUgY29udmVyc2F0aW9uLCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgY3VycmVudCBwYWNrZXQncyBzZXF1ZW5jZSBudW1iZXIgYW5kIHRoaXMgaW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIKLWlzIHByaW50ZWQuCi1UaGlzIG1lYW5zIHRoYXQgc2VxdWVuY2UgbnVtYmVycyBhZnRlciB0aGUKLWZpcnN0IGNhbiBiZSBpbnRlcnByZXRlZAotYXMgcmVsYXRpdmUgYnl0ZSBwb3NpdGlvbnMgaW4gdGhlIGNvbnZlcnNhdGlvbidzIGRhdGEgc3RyZWFtICh3aXRoIHRoZQotZmlyc3QgZGF0YSBieXRlIGVhY2ggZGlyZWN0aW9uIGJlaW5nIGAxJykuCi1gLVMnIHdpbGwgb3ZlcnJpZGUgdGhpcwotZmVhdHVyZSwgY2F1c2luZyB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgbnVtYmVycyB0byBiZSBvdXRwdXQuCi0uTFAKLU9uIHRoZSA2dGggbGluZSwgcnRzZyBzZW5kcyBjc2FtIDE5IGJ5dGVzIG9mIGRhdGEgKGJ5dGVzIDIgdGhyb3VnaCAyMAotaW4gdGhlIHJ0c2cgXCgtPiBjc2FtIHNpZGUgb2YgdGhlIGNvbnZlcnNhdGlvbikuCi1UaGUgUFVTSCBmbGFnIGlzIHNldCBpbiB0aGUgcGFja2V0LgotT24gdGhlIDd0aCBsaW5lLCBjc2FtIHNheXMgaXQncyByZWNlaXZlZCBkYXRhIHNlbnQgYnkgcnRzZyB1cCB0bwotYnV0IG5vdCBpbmNsdWRpbmcgYnl0ZSAyMS4KLU1vc3Qgb2YgdGhpcyBkYXRhIGlzIGFwcGFyZW50bHkgc2l0dGluZyBpbiB0aGUKLXNvY2tldCBidWZmZXIgc2luY2UgY3NhbSdzIHJlY2VpdmUgd2luZG93IGhhcyBnb3R0ZW4gMTkgYnl0ZXMgc21hbGxlci4KLUNzYW0gYWxzbyBzZW5kcyBvbmUgYnl0ZSBvZiBkYXRhIHRvIHJ0c2cgaW4gdGhpcyBwYWNrZXQuCi1PbiB0aGUgOHRoIGFuZCA5dGggbGluZXMsCi1jc2FtIHNlbmRzIHR3byBieXRlcyBvZiB1cmdlbnQsIHB1c2hlZCBkYXRhIHRvIHJ0c2cuCi0uTFAKLUlmIHRoZSBzbmFwc2hvdCB3YXMgc21hbGwgZW5vdWdoIHRoYXQgXGZJdGNwZHVtcFxmUCBkaWRuJ3QgY2FwdHVyZQotdGhlIGZ1bGwgVENQIGhlYWRlciwgaXQgaW50ZXJwcmV0cyBhcyBtdWNoIG9mIHRoZSBoZWFkZXIgYXMgaXQgY2FuCi1hbmQgdGhlbiByZXBvcnRzIGBgW3xcZkl0Y3BcZlBdJycgdG8gaW5kaWNhdGUgdGhlIHJlbWFpbmRlciBjb3VsZCBub3QKLWJlIGludGVycHJldGVkLgotSWYgdGhlIGhlYWRlciBjb250YWlucyBhIGJvZ3VzIG9wdGlvbiAob25lIHdpdGggYSBsZW5ndGgKLXRoYXQncyBlaXRoZXIgdG9vIHNtYWxsIG9yIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIpLCBcZkl0Y3BkdW1wXGZQCi1yZXBvcnRzIGl0IGFzIGBgW1xmSWJhZCBvcHRcZlBdJycgYW5kIGRvZXMgbm90IGludGVycHJldCBhbnkgZnVydGhlcgotb3B0aW9ucyAoc2luY2UgaXQncyBpbXBvc3NpYmxlIHRvIHRlbGwgd2hlcmUgdGhleSBzdGFydCkuCi1JZiB0aGUgaGVhZGVyCi1sZW5ndGggaW5kaWNhdGVzIG9wdGlvbnMgYXJlIHByZXNlbnQgYnV0IHRoZSBJUCBkYXRhZ3JhbSBsZW5ndGggaXMgbm90Ci1sb25nIGVub3VnaCBmb3IgdGhlIG9wdGlvbnMgdG8gYWN0dWFsbHkgYmUgdGhlcmUsIFxmSXRjcGR1bXBcZlAgcmVwb3J0cwotaXQgYXMgYGBbXGZJYmFkIGhkciBsZW5ndGhcZlBdJycuCi0uSEQKLS5CIENhcHR1cmluZyBUQ1AgcGFja2V0cyB3aXRoIHBhcnRpY3VsYXIgZmxhZyBjb21iaW5hdGlvbnMgKFNZTi1BQ0ssIFVSRy1BQ0ssIGV0Yy4pCi0uUFAKLVRoZXJlIGFyZSA4IGJpdHMgaW4gdGhlIGNvbnRyb2wgYml0cyBzZWN0aW9uIG9mIHRoZSBUQ1AgaGVhZGVyOgotLklQCi0uSSBDV1IgfCBFQ0UgfCBVUkcgfCBBQ0sgfCBQU0ggfCBSU1QgfCBTWU4gfCBGSU4KLS5QUAotTGV0J3MgYXNzdW1lIHRoYXQgd2Ugd2FudCB0byB3YXRjaCBwYWNrZXRzIHVzZWQgaW4gZXN0YWJsaXNoaW5nCi1hIFRDUCBjb25uZWN0aW9uLgotUmVjYWxsIHRoYXQgVENQIHVzZXMgYSAzLXdheSBoYW5kc2hha2UgcHJvdG9jb2wKLXdoZW4gaXQgaW5pdGlhbGl6ZXMgYSBuZXcgY29ubmVjdGlvbjsgdGhlIGNvbm5lY3Rpb24gc2VxdWVuY2Ugd2l0aAotcmVnYXJkIHRvIHRoZSBUQ1AgY29udHJvbCBiaXRzIGlzCi0uUFAKLS5SUwotMSkgQ2FsbGVyIHNlbmRzIFNZTgotLlJFCi0uUlMKLTIpIFJlY2lwaWVudCByZXNwb25kcyB3aXRoIFNZTiwgQUNLCi0uUkUKLS5SUwotMykgQ2FsbGVyIHNlbmRzIEFDSwotLlJFCi0uUFAKLU5vdyB3ZSdyZSBpbnRlcmVzdGVkIGluIGNhcHR1cmluZyBwYWNrZXRzIHRoYXQgaGF2ZSBvbmx5IHRoZQotU1lOIGJpdCBzZXQgKFN0ZXAgMSkuCi1Ob3RlIHRoYXQgd2UgZG9uJ3Qgd2FudCBwYWNrZXRzIGZyb20gc3RlcCAyCi0oU1lOLUFDSyksIGp1c3QgYSBwbGFpbiBpbml0aWFsIFNZTi4KLVdoYXQgd2UgbmVlZCBpcyBhIGNvcnJlY3QgZmlsdGVyCi1leHByZXNzaW9uIGZvciBcZkl0Y3BkdW1wXGZQLgotLlBQCi1SZWNhbGwgdGhlIHN0cnVjdHVyZSBvZiBhIFRDUCBoZWFkZXIgd2l0aG91dCBvcHRpb25zOgotLlBQCi0ubmYKLSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ICAgICAgICAgIHNvdXJjZSBwb3J0ICAgICAgICAgIHwgICAgICAgZGVzdGluYXRpb24gcG9ydCAgICAgICAgfAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXwgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfCAgICAgICAgICAgICAgICAgICAgIGFja25vd2xlZGdtZW50IG51bWJlciAgICAgICAgICAgICAgICAgICAgIHwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi18ICBITCAgIHwgcnN2ZCAgfEN8RXxVfEF8UHxSfFN8RnwgICAgICAgIHdpbmRvdyBzaXplICAgICAgICAgICAgfAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXwgICAgICAgICBUQ1AgY2hlY2tzdW0gICAgICAgICAgfCAgICAgICB1cmdlbnQgcG9pbnRlciAgICAgICAgICB8Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLmZpCi0uUFAKLUEgVENQIGhlYWRlciB1c3VhbGx5IGhvbGRzIDIwIG9jdGV0cyBvZiBkYXRhLCB1bmxlc3Mgb3B0aW9ucyBhcmUKLXByZXNlbnQuCi1UaGUgZmlyc3QgbGluZSBvZiB0aGUgZ3JhcGggY29udGFpbnMgb2N0ZXRzIDAgLSAzLCB0aGUKLXNlY29uZCBsaW5lIHNob3dzIG9jdGV0cyA0IC0gNyBldGMuCi0uUFAKLVN0YXJ0aW5nIHRvIGNvdW50IHdpdGggMCwgdGhlIHJlbGV2YW50IFRDUCBjb250cm9sIGJpdHMgYXJlIGNvbnRhaW5lZAotaW4gb2N0ZXQgMTM6Ci0uUFAKLS5uZgotIDAgICAgICAgICAgICAgN3wgICAgICAgICAgICAgMTV8ICAgICAgICAgICAgIDIzfCAgICAgICAgICAgICAzMQotLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0KLXwgIEhMICAgfCByc3ZkICB8Q3xFfFV8QXxQfFJ8U3xGfCAgICAgICAgd2luZG93IHNpemUgICAgICAgICAgICB8Ci0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQotfCAgICAgICAgICAgICAgIHwgIDEzdGggb2N0ZXQgICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLS5maQotLlBQCi1MZXQncyBoYXZlIGEgY2xvc2VyIGxvb2sgYXQgb2N0ZXQgbm8uIDEzOgotLlBQCi0ubmYKLSAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS18Ci0gICAgICAgICAgICAgICAgfEN8RXxVfEF8UHxSfFN8RnwKLSAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAgICAgIHw3ICAgNSAgIDMgICAgIDB8Ci0uZmkKLS5QUAotVGhlc2UgYXJlIHRoZSBUQ1AgY29udHJvbCBiaXRzIHdlIGFyZSBpbnRlcmVzdGVkCi1pbi4KLVdlIGhhdmUgbnVtYmVyZWQgdGhlIGJpdHMgaW4gdGhpcyBvY3RldCBmcm9tIDAgdG8gNywgcmlnaHQgdG8KLWxlZnQsIHNvIHRoZSBQU0ggYml0IGlzIGJpdCBudW1iZXIgMywgd2hpbGUgdGhlIFVSRyBiaXQgaXMgbnVtYmVyIDUuCi0uUFAKLVJlY2FsbCB0aGF0IHdlIHdhbnQgdG8gY2FwdHVyZSBwYWNrZXRzIHdpdGggb25seSBTWU4gc2V0LgotTGV0J3Mgc2VlIHdoYXQgaGFwcGVucyB0byBvY3RldCAxMyBpZiBhIFRDUCBkYXRhZ3JhbSBhcnJpdmVzCi13aXRoIHRoZSBTWU4gYml0IHNldCBpbiBpdHMgaGVhZGVyOgotLlBQCi0ubmYKLSAgICAgICAgICAgICAgICB8Q3xFfFV8QXxQfFJ8U3xGfAotICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS18Ci0gICAgICAgICAgICAgICAgfDAgMCAwIDAgMCAwIDEgMHwKLSAgICAgICAgICAgICAgICB8LS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAgICAgIHw3IDYgNSA0IDMgMiAxIDB8Ci0uZmkKLS5QUAotTG9va2luZyBhdCB0aGUKLWNvbnRyb2wgYml0cyBzZWN0aW9uIHdlIHNlZSB0aGF0IG9ubHkgYml0IG51bWJlciAxIChTWU4pIGlzIHNldC4KLS5QUAotQXNzdW1pbmcgdGhhdCBvY3RldCBudW1iZXIgMTMgaXMgYW4gOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbgotbmV0d29yayBieXRlIG9yZGVyLCB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoaXMgb2N0ZXQgaXMKLS5JUAotMDAwMDAwMTAKLS5QUAotYW5kIGl0cyBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIGlzCi0uUFAKLS5uZgotICAgNyAgICAgNiAgICAgNSAgICAgNCAgICAgMyAgICAgMiAgICAgMSAgICAgMAotMCoyICsgMCoyICsgMCoyICsgMCoyICsgMCoyICsgMCoyICsgMSoyICsgMCoyICA9ICAyCi0uZmkKLS5QUAotV2UncmUgYWxtb3N0IGRvbmUsIGJlY2F1c2Ugbm93IHdlIGtub3cgdGhhdCBpZiBvbmx5IFNZTiBpcyBzZXQsCi10aGUgdmFsdWUgb2YgdGhlIDEzdGggb2N0ZXQgaW4gdGhlIFRDUCBoZWFkZXIsIHdoZW4gaW50ZXJwcmV0ZWQKLWFzIGEgOC1iaXQgdW5zaWduZWQgaW50ZWdlciBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIsIG11c3QgYmUgZXhhY3RseSAyLgotLlBQCi1UaGlzIHJlbGF0aW9uc2hpcCBjYW4gYmUgZXhwcmVzc2VkIGFzCi0uUlMKLS5CCi10Y3BbMTNdID09IDIKLS5SRQotLlBQCi1XZSBjYW4gdXNlIHRoaXMgZXhwcmVzc2lvbiBhcyB0aGUgZmlsdGVyIGZvciBcZkl0Y3BkdW1wXGZQIGluIG9yZGVyCi10byB3YXRjaCBwYWNrZXRzIHdoaWNoIGhhdmUgb25seSBTWU4gc2V0OgotLlJTCi0uQgotdGNwZHVtcCAtaSB4bDAgdGNwWzEzXSA9PSAyCi0uUkUKLS5QUAotVGhlIGV4cHJlc3Npb24gc2F5cyAibGV0IHRoZSAxM3RoIG9jdGV0IG9mIGEgVENQIGRhdGFncmFtIGhhdmUKLXRoZSBkZWNpbWFsIHZhbHVlIDIiLCB3aGljaCBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4KLS5QUAotTm93LCBsZXQncyBhc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIGNhcHR1cmUgU1lOIHBhY2tldHMsIGJ1dCB3ZQotZG9uJ3QgY2FyZSBpZiBBQ0sgb3IgYW55IG90aGVyIFRDUCBjb250cm9sIGJpdCBpcyBzZXQgYXQgdGhlCi1zYW1lIHRpbWUuCi1MZXQncyBzZWUgd2hhdCBoYXBwZW5zIHRvIG9jdGV0IDEzIHdoZW4gYSBUQ1AgZGF0YWdyYW0KLXdpdGggU1lOLUFDSyBzZXQgYXJyaXZlczoKLS5QUAotLm5mCi0gICAgIHxDfEV8VXxBfFB8UnxTfEZ8Ci0gICAgIHwtLS0tLS0tLS0tLS0tLS18Ci0gICAgIHwwIDAgMCAxIDAgMCAxIDB8Ci0gICAgIHwtLS0tLS0tLS0tLS0tLS18Ci0gICAgIHw3IDYgNSA0IDMgMiAxIDB8Ci0uZmkKLS5QUAotTm93IGJpdHMgMSBhbmQgNCBhcmUgc2V0IGluIHRoZSAxM3RoIG9jdGV0LgotVGhlIGJpbmFyeSB2YWx1ZSBvZgotb2N0ZXQgMTMgaXMKLS5JUAotICAgICAwMDAxMDAxMAotLlBQCi13aGljaCB0cmFuc2xhdGVzIHRvIGRlY2ltYWwKLS5QUAotLm5mCi0gICA3ICAgICA2ICAgICA1ICAgICA0ICAgICAzICAgICAyICAgICAxICAgICAwCi0wKjIgKyAwKjIgKyAwKjIgKyAxKjIgKyAwKjIgKyAwKjIgKyAxKjIgKyAwKjIgICA9IDE4Ci0uZmkKLS5QUAotTm93IHdlIGNhbid0IGp1c3QgdXNlICd0Y3BbMTNdID09IDE4JyBpbiB0aGUgXGZJdGNwZHVtcFxmUCBmaWx0ZXIKLWV4cHJlc3Npb24sIGJlY2F1c2UgdGhhdCB3b3VsZCBzZWxlY3Qgb25seSB0aG9zZSBwYWNrZXRzIHRoYXQgaGF2ZQotU1lOLUFDSyBzZXQsIGJ1dCBub3QgdGhvc2Ugd2l0aCBvbmx5IFNZTiBzZXQuCi1SZW1lbWJlciB0aGF0IHdlIGRvbid0IGNhcmUKLWlmIEFDSyBvciBhbnkgb3RoZXIgY29udHJvbCBiaXQgaXMgc2V0IGFzIGxvbmcgYXMgU1lOIGlzIHNldC4KLS5QUAotSW4gb3JkZXIgdG8gYWNoaWV2ZSBvdXIgZ29hbCwgd2UgbmVlZCB0byBsb2dpY2FsbHkgQU5EIHRoZQotYmluYXJ5IHZhbHVlIG9mIG9jdGV0IDEzIHdpdGggc29tZSBvdGhlciB2YWx1ZSB0byBwcmVzZXJ2ZQotdGhlIFNZTiBiaXQuCi1XZSBrbm93IHRoYXQgd2Ugd2FudCBTWU4gdG8gYmUgc2V0IGluIGFueSBjYXNlLAotc28gd2UnbGwgbG9naWNhbGx5IEFORCB0aGUgdmFsdWUgaW4gdGhlIDEzdGggb2N0ZXQgd2l0aAotdGhlIGJpbmFyeSB2YWx1ZSBvZiBhIFNZTjoKLS5QUAotLm5mCi0KLSAgICAgICAgICAwMDAxMDAxMCBTWU4tQUNLICAgICAgICAgICAgICAwMDAwMDAxMCBTWU4KLSAgICAgQU5EICAwMDAwMDAxMCAod2Ugd2FudCBTWU4pICAgQU5EICAwMDAwMDAxMCAod2Ugd2FudCBTWU4pCi0gICAgICAgICAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0KLSAgICAgPSAgICAwMDAwMDAxMCAgICAgICAgICAgICAgICAgPSAgICAwMDAwMDAxMAotLmZpCi0uUFAKLVdlIHNlZSB0aGF0IHRoaXMgQU5EIG9wZXJhdGlvbiBkZWxpdmVycyB0aGUgc2FtZSByZXN1bHQKLXJlZ2FyZGxlc3Mgd2hldGhlciBBQ0sgb3IgYW5vdGhlciBUQ1AgY29udHJvbCBiaXQgaXMgc2V0LgotVGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFORCB2YWx1ZSBhcyB3ZWxsIGFzCi10aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIGlzIDIgKGJpbmFyeSAwMDAwMDAxMCksCi1zbyB3ZSBrbm93IHRoYXQgZm9yIHBhY2tldHMgd2l0aCBTWU4gc2V0IHRoZSBmb2xsb3dpbmcKLXJlbGF0aW9uIG11c3QgaG9sZCB0cnVlOgotLklQCi0oICggdmFsdWUgb2Ygb2N0ZXQgMTMgKSBBTkQgKCAyICkgKSA9PSAoIDIgKQotLlBQCi1UaGlzIHBvaW50cyB1cyB0byB0aGUgXGZJdGNwZHVtcFxmUCBmaWx0ZXIgZXhwcmVzc2lvbgotLlJTCi0uQgotICAgICB0Y3BkdW1wIC1pIHhsMCAndGNwWzEzXSAmIDIgPT0gMicKLS5SRQotLlBQCi1Ob3RlIHRoYXQgeW91IHNob3VsZCB1c2Ugc2luZ2xlIHF1b3RlcyBvciBhIGJhY2tzbGFzaAotaW4gdGhlIGV4cHJlc3Npb24gdG8gaGlkZSB0aGUgQU5EICgnJicpIHNwZWNpYWwgY2hhcmFjdGVyCi1mcm9tIHRoZSBzaGVsbC4KLS5IRAotLkIKLVVEUCBQYWNrZXRzCi0uTFAKLVVEUCBmb3JtYXQgaXMgaWxsdXN0cmF0ZWQgYnkgdGhpcyByd2hvIHBhY2tldDoKLS5SUwotLm5mCi0uc3AgLjUKLVxmKENXYWN0aW5pZGUud2hvID4gYnJvYWRjYXN0LndobzogdWRwIDg0XGZQCi0uc3AgLjUKLS5maQotLlJFCi1UaGlzIHNheXMgdGhhdCBwb3J0IFxmSXdob1xmUCBvbiBob3N0IFxmSWFjdGluaWRlXGZQIHNlbnQgYSB1ZHAKLWRhdGFncmFtIHRvIHBvcnQgXGZJd2hvXGZQIG9uIGhvc3QgXGZJYnJvYWRjYXN0XGZQLCB0aGUgSW50ZXJuZXQKLWJyb2FkY2FzdCBhZGRyZXNzLgotVGhlIHBhY2tldCBjb250YWluZWQgODQgYnl0ZXMgb2YgdXNlciBkYXRhLgotLkxQCi1Tb21lIFVEUCBzZXJ2aWNlcyBhcmUgcmVjb2duaXplZCAoZnJvbSB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uCi1wb3J0IG51bWJlcikgYW5kIHRoZSBoaWdoZXIgbGV2ZWwgcHJvdG9jb2wgaW5mb3JtYXRpb24gcHJpbnRlZC4KLUluIHBhcnRpY3VsYXIsIERvbWFpbiBOYW1lIHNlcnZpY2UgcmVxdWVzdHMgKFJGQy0xMDM0LzEwMzUpIGFuZCBTdW4KLVJQQyBjYWxscyAoUkZDLTEwNTApIHRvIE5GUy4KLS5IRAotVURQIE5hbWUgU2VydmVyIFJlcXVlc3RzCi0uTFAKLVxmSShOLkIuOlRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb24gYXNzdW1lcyBmYW1pbGlhcml0eSB3aXRoCi10aGUgRG9tYWluIFNlcnZpY2UgcHJvdG9jb2wgZGVzY3JpYmVkIGluIFJGQy0xMDM1LgotSWYgeW91IGFyZSBub3QgZmFtaWxpYXIKLXdpdGggdGhlIHByb3RvY29sLCB0aGUgZm9sbG93aW5nIGRlc2NyaXB0aW9uIHdpbGwgYXBwZWFyIHRvIGJlIHdyaXR0ZW4KLWluIGdyZWVrLilcZlAKLS5MUAotTmFtZSBzZXJ2ZXIgcmVxdWVzdHMgYXJlIGZvcm1hdHRlZCBhcwotLlJTCi0ubmYKLS5zcCAuNQotXGZJc3JjID4gZHN0OiBpZCBvcD8gZmxhZ3MgcXR5cGUgcWNsYXNzIG5hbWUgKGxlbilcZlAKLS5zcCAuNQotXGYoQ1doMm9wb2xvLjE1MzggPiBoZWxpb3MuZG9tYWluOiAzKyBBPyB1Y2J2YXguYmVya2VsZXkuZWR1LiAoMzcpXGZSCi0uc3AgLjUKLS5maQotLlJFCi1Ib3N0IFxmSWgyb3BvbG9cZlAgYXNrZWQgdGhlIGRvbWFpbiBzZXJ2ZXIgb24gXGZJaGVsaW9zXGZQIGZvciBhbgotYWRkcmVzcyByZWNvcmQgKHF0eXBlPUEpIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSBcZkl1Y2J2YXguYmVya2VsZXkuZWR1LlxmUAotVGhlIHF1ZXJ5IGlkIHdhcyBgMycuCi1UaGUgYCsnIGluZGljYXRlcyB0aGUgXGZJcmVjdXJzaW9uIGRlc2lyZWRcZlAgZmxhZwotd2FzIHNldC4KLVRoZSBxdWVyeSBsZW5ndGggd2FzIDM3IGJ5dGVzLCBub3QgaW5jbHVkaW5nIHRoZSBVRFAgYW5kCi1JUCBwcm90b2NvbCBoZWFkZXJzLgotVGhlIHF1ZXJ5IG9wZXJhdGlvbiB3YXMgdGhlIG5vcm1hbCBvbmUsIFxmSVF1ZXJ5XGZQLAotc28gdGhlIG9wIGZpZWxkIHdhcyBvbWl0dGVkLgotSWYgdGhlIG9wIGhhZCBiZWVuIGFueXRoaW5nIGVsc2UsIGl0IHdvdWxkCi1oYXZlIGJlZW4gcHJpbnRlZCBiZXR3ZWVuIHRoZSBgMycgYW5kIHRoZSBgKycuCi1TaW1pbGFybHksIHRoZSBxY2xhc3Mgd2FzIHRoZSBub3JtYWwgb25lLAotXGZJQ19JTlxmUCwgYW5kIG9taXR0ZWQuCi1Bbnkgb3RoZXIgcWNsYXNzIHdvdWxkIGhhdmUgYmVlbiBwcmludGVkCi1pbW1lZGlhdGVseSBhZnRlciB0aGUgYEEnLgotLkxQCi1BIGZldyBhbm9tYWxpZXMgYXJlIGNoZWNrZWQgYW5kIG1heSByZXN1bHQgaW4gZXh0cmEgZmllbGRzIGVuY2xvc2VkIGluCi1zcXVhcmUgYnJhY2tldHM6ICBJZiBhIHF1ZXJ5IGNvbnRhaW5zIGFuIGFuc3dlciwgYXV0aG9yaXR5IHJlY29yZHMgb3IKLWFkZGl0aW9uYWwgcmVjb3JkcyBzZWN0aW9uLAotLklSIGFuY291bnQgLAotLklSIG5zY291bnQgLAotb3IKLS5JIGFyY291bnQKLWFyZSBwcmludGVkIGFzIGBbXGZJblxmUGFdJywgYFtcZkluXGZQbl0nIG9yICBgW1xmSW5cZlBhdV0nIHdoZXJlIFxmSW5cZlAKLWlzIHRoZSBhcHByb3ByaWF0ZSBjb3VudC4KLUlmIGFueSBvZiB0aGUgcmVzcG9uc2UgYml0cyBhcmUgc2V0IChBQSwgUkEgb3IgcmNvZGUpIG9yIGFueSBvZiB0aGUKLWBtdXN0IGJlIHplcm8nIGJpdHMgYXJlIHNldCBpbiBieXRlcyB0d28gYW5kIHRocmVlLCBgW2IyJjM9XGZJeFxmUF0nCi1pcyBwcmludGVkLCB3aGVyZSBcZkl4XGZQIGlzIHRoZSBoZXggdmFsdWUgb2YgaGVhZGVyIGJ5dGVzIHR3byBhbmQgdGhyZWUuCi0uSEQKLVVEUCBOYW1lIFNlcnZlciBSZXNwb25zZXMKLS5MUAotTmFtZSBzZXJ2ZXIgcmVzcG9uc2VzIGFyZSBmb3JtYXR0ZWQgYXMKLS5SUwotLm5mCi0uc3AgLjUKLVxmSXNyYyA+IGRzdDogIGlkIG9wIHJjb2RlIGZsYWdzIGEvbi9hdSB0eXBlIGNsYXNzIGRhdGEgKGxlbilcZlAKLS5zcCAuNQotXGYoQ1doZWxpb3MuZG9tYWluID4gaDJvcG9sby4xNTM4OiAzIDMvMy83IEEgMTI4LjMyLjEzNy4zICgyNzMpCi1oZWxpb3MuZG9tYWluID4gaDJvcG9sby4xNTM3OiAyIE5YRG9tYWluKiAwLzEvMCAoOTcpXGZSCi0uc3AgLjUKLS5maQotLlJFCi1JbiB0aGUgZmlyc3QgZXhhbXBsZSwgXGZJaGVsaW9zXGZQIHJlc3BvbmRzIHRvIHF1ZXJ5IGlkIDMgZnJvbSBcZkloMm9wb2xvXGZQCi13aXRoIDMgYW5zd2VyIHJlY29yZHMsIDMgbmFtZSBzZXJ2ZXIgcmVjb3JkcyBhbmQgNyBhZGRpdGlvbmFsIHJlY29yZHMuCi1UaGUgZmlyc3QgYW5zd2VyIHJlY29yZCBpcyB0eXBlIEEgKGFkZHJlc3MpIGFuZCBpdHMgZGF0YSBpcyBpbnRlcm5ldAotYWRkcmVzcyAxMjguMzIuMTM3LjMuCi1UaGUgdG90YWwgc2l6ZSBvZiB0aGUgcmVzcG9uc2Ugd2FzIDI3MyBieXRlcywKLWV4Y2x1ZGluZyBVRFAgYW5kIElQIGhlYWRlcnMuCi1UaGUgb3AgKFF1ZXJ5KSBhbmQgcmVzcG9uc2UgY29kZQotKE5vRXJyb3IpIHdlcmUgb21pdHRlZCwgYXMgd2FzIHRoZSBjbGFzcyAoQ19JTikgb2YgdGhlIEEgcmVjb3JkLgotLkxQCi1JbiB0aGUgc2Vjb25kIGV4YW1wbGUsIFxmSWhlbGlvc1xmUCByZXNwb25kcyB0byBxdWVyeSAyIHdpdGggYQotcmVzcG9uc2UgY29kZSBvZiBub24tZXhpc3RlbnQgZG9tYWluIChOWERvbWFpbikgd2l0aCBubyBhbnN3ZXJzLAotb25lIG5hbWUgc2VydmVyIGFuZCBubyBhdXRob3JpdHkgcmVjb3Jkcy4KLVRoZSBgKicgaW5kaWNhdGVzIHRoYXQKLXRoZSBcZklhdXRob3JpdGF0aXZlIGFuc3dlclxmUCBiaXQgd2FzIHNldC4KLVNpbmNlIHRoZXJlIHdlcmUgbm8KLWFuc3dlcnMsIG5vIHR5cGUsIGNsYXNzIG9yIGRhdGEgd2VyZSBwcmludGVkLgotLkxQCi1PdGhlciBmbGFnIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgYXJlIGBcLScgKHJlY3Vyc2lvbiBhdmFpbGFibGUsCi1SQSwgXGZJbm90XGZQIHNldCkgYW5kIGB8JyAodHJ1bmNhdGVkIG1lc3NhZ2UsIFRDLCBzZXQpLgotSWYgdGhlCi1gcXVlc3Rpb24nIHNlY3Rpb24gZG9lc24ndCBjb250YWluIGV4YWN0bHkgb25lIGVudHJ5LCBgW1xmSW5cZlBxXScKLWlzIHByaW50ZWQuCi0uTFAKLU5vdGUgdGhhdCBuYW1lIHNlcnZlciByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIHRlbmQgdG8gYmUgbGFyZ2UgYW5kIHRoZQotZGVmYXVsdCBcZklzbmFwbGVuXGZQIG9mIDY4IGJ5dGVzIG1heSBub3QgY2FwdHVyZSBlbm91Z2ggb2YgdGhlIHBhY2tldAotdG8gcHJpbnQuCi1Vc2UgdGhlIFxmQlwtc1xmUCBmbGFnIHRvIGluY3JlYXNlIHRoZSBzbmFwbGVuIGlmIHlvdQotbmVlZCB0byBzZXJpb3VzbHkgaW52ZXN0aWdhdGUgbmFtZSBzZXJ2ZXIgdHJhZmZpYy4KLWBcZkJcLXMgMTI4XGZQJwotaGFzIHdvcmtlZCB3ZWxsIGZvciBtZS4KLQotLkhECi1TTUIvQ0lGUyBkZWNvZGluZwotLkxQCi1cZkl0Y3BkdW1wXGZQIG5vdyBpbmNsdWRlcyBmYWlybHkgZXh0ZW5zaXZlIFNNQi9DSUZTL05CVCBkZWNvZGluZyBmb3IgZGF0YQotb24gVURQLzEzNywgVURQLzEzOCBhbmQgVENQLzEzOS4KLVNvbWUgcHJpbWl0aXZlIGRlY29kaW5nIG9mIElQWCBhbmQKLU5ldEJFVUkgU01CIGRhdGEgaXMgYWxzbyBkb25lLgotCi1CeSBkZWZhdWx0IGEgZmFpcmx5IG1pbmltYWwgZGVjb2RlIGlzIGRvbmUsIHdpdGggYSBtdWNoIG1vcmUgZGV0YWlsZWQKLWRlY29kZSBkb25lIGlmIC12IGlzIHVzZWQuCi1CZSB3YXJuZWQgdGhhdCB3aXRoIC12IGEgc2luZ2xlIFNNQiBwYWNrZXQKLW1heSB0YWtlIHVwIGEgcGFnZSBvciBtb3JlLCBzbyBvbmx5IHVzZSAtdiBpZiB5b3UgcmVhbGx5IHdhbnQgYWxsIHRoZQotZ29yeSBkZXRhaWxzLgotCi1Gb3IgaW5mb3JtYXRpb24gb24gU01CIHBhY2tldCBmb3JtYXRzIGFuZCB3aGF0IGFsbCB0ZSBmaWVsZHMgbWVhbiBzZWUKLXd3dy5jaWZzLm9yZyBvciB0aGUgcHViL3NhbWJhL3NwZWNzLyBkaXJlY3Rvcnkgb24geW91ciBmYXZvcml0ZQotc2FtYmEub3JnIG1pcnJvciBzaXRlLgotVGhlIFNNQiBwYXRjaGVzIHdlcmUgd3JpdHRlbiBieSBBbmRyZXcgVHJpZGdlbGwKLSh0cmlkZ2VAc2FtYmEub3JnKS4KLQotLkhECi1ORlMgUmVxdWVzdHMgYW5kIFJlcGxpZXMKLS5MUAotU3VuIE5GUyAoTmV0d29yayBGaWxlIFN5c3RlbSkgcmVxdWVzdHMgYW5kIHJlcGxpZXMgYXJlIHByaW50ZWQgYXM6Ci0uUlMKLS5uZgotLnNwIC41Ci1cZklzcmMueGlkID4gZHN0Lm5mczogbGVuIG9wIGFyZ3NcZlAKLVxmSXNyYy5uZnMgPiBkc3QueGlkOiByZXBseSBzdGF0IGxlbiBvcCByZXN1bHRzXGZQCi0uc3AgLjUKLVxmKENXCi1zdXNoaS42NzA5ID4gd3JsLm5mczogMTEyIHJlYWRsaW5rIGZoIDIxLDI0LzEwLjczMTY1Ci13cmwubmZzID4gc3VzaGkuNjcwOTogcmVwbHkgb2sgNDAgcmVhZGxpbmsgIi4uL3ZhciIKLXN1c2hpLjIwMWIgPiB3cmwubmZzOgotCTE0NCBsb29rdXAgZmggOSw3NC80MDk2LjY4NzggInhjb2xvcnMiCi13cmwubmZzID4gc3VzaGkuMjAxYjoKLQlyZXBseSBvayAxMjggbG9va3VwIGZoIDksNzQvNDEzNC4zMTUwCi1cZlIKLS5zcCAuNQotLmZpCi0uUkUKLUluIHRoZSBmaXJzdCBsaW5lLCBob3N0IFxmSXN1c2hpXGZQIHNlbmRzIGEgdHJhbnNhY3Rpb24gd2l0aCBpZCBcZkk2NzA5XGZQCi10byBcZkl3cmxcZlAgKG5vdGUgdGhhdCB0aGUgbnVtYmVyIGZvbGxvd2luZyB0aGUgc3JjIGhvc3QgaXMgYQotdHJhbnNhY3Rpb24gaWQsIFxmSW5vdFxmUCB0aGUgc291cmNlIHBvcnQpLgotVGhlIHJlcXVlc3Qgd2FzIDExMiBieXRlcywKLWV4Y2x1ZGluZyB0aGUgVURQIGFuZCBJUCBoZWFkZXJzLgotVGhlIG9wZXJhdGlvbiB3YXMgYSBcZklyZWFkbGlua1xmUAotKHJlYWQgc3ltYm9saWMgbGluaykgb24gZmlsZSBoYW5kbGUgKFxmSWZoXGZQKSAyMSwyNC8xMC43MzE2NTcxMTkuCi0oSWYgb25lIGlzIGx1Y2t5LCBhcyBpbiB0aGlzIGNhc2UsIHRoZSBmaWxlIGhhbmRsZSBjYW4gYmUgaW50ZXJwcmV0ZWQKLWFzIGEgbWFqb3IsbWlub3IgZGV2aWNlIG51bWJlciBwYWlyLCBmb2xsb3dlZCBieSB0aGUgaW5vZGUgbnVtYmVyIGFuZAotZ2VuZXJhdGlvbiBudW1iZXIuKQotXGZJV3JsXGZQIHJlcGxpZXMgYG9rJyB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgbGluay4KLS5MUAotSW4gdGhlIHRoaXJkIGxpbmUsIFxmSXN1c2hpXGZQIGFza3MgXGZJd3JsXGZQIHRvIGxvb2t1cCB0aGUgbmFtZQotYFxmSXhjb2xvcnNcZlAnIGluIGRpcmVjdG9yeSBmaWxlIDksNzQvNDA5Ni42ODc4LgotTm90ZSB0aGF0IHRoZSBkYXRhIHByaW50ZWQKLWRlcGVuZHMgb24gdGhlIG9wZXJhdGlvbiB0eXBlLgotVGhlIGZvcm1hdCBpcyBpbnRlbmRlZCB0byBiZSBzZWxmCi1leHBsYW5hdG9yeSBpZiByZWFkIGluIGNvbmp1bmN0aW9uIHdpdGgKLWFuIE5GUyBwcm90b2NvbCBzcGVjLgotLkxQCi1JZiB0aGUgXC12ICh2ZXJib3NlKSBmbGFnIGlzIGdpdmVuLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHByaW50ZWQuCi1Gb3IgZXhhbXBsZToKLS5SUwotLm5mCi0uc3AgLjUKLVxmKENXCi1zdXNoaS4xMzcyYSA+IHdybC5uZnM6Ci0JMTQ4IHJlYWQgZmggMjEsMTEvMTIuMTk1IDgxOTIgYnl0ZXMgQCAyNDU3Ngotd3JsLm5mcyA+IHN1c2hpLjEzNzJhOgotCXJlcGx5IG9rIDE0NzIgcmVhZCBSRUcgMTAwNjY0IGlkcyA0MTcvMCBzeiAyOTM4OAotXGZQCi0uc3AgLjUKLS5maQotLlJFCi0oXC12IGFsc28gcHJpbnRzIHRoZSBJUCBoZWFkZXIgVFRMLCBJRCwgbGVuZ3RoLCBhbmQgZnJhZ21lbnRhdGlvbiBmaWVsZHMsCi13aGljaCBoYXZlIGJlZW4gb21pdHRlZCBmcm9tIHRoaXMgZXhhbXBsZS4pICBJbiB0aGUgZmlyc3QgbGluZSwKLVxmSXN1c2hpXGZQIGFza3MgXGZJd3JsXGZQIHRvIHJlYWQgODE5MiBieXRlcyBmcm9tIGZpbGUgMjEsMTEvMTIuMTk1LAotYXQgYnl0ZSBvZmZzZXQgMjQ1NzYuCi1cZklXcmxcZlAgcmVwbGllcyBgb2snOyB0aGUgcGFja2V0IHNob3duIG9uIHRoZQotc2Vjb25kIGxpbmUgaXMgdGhlIGZpcnN0IGZyYWdtZW50IG9mIHRoZSByZXBseSwgYW5kIGhlbmNlIGlzIG9ubHkgMTQ3MgotYnl0ZXMgbG9uZyAodGhlIG90aGVyIGJ5dGVzIHdpbGwgZm9sbG93IGluIHN1YnNlcXVlbnQgZnJhZ21lbnRzLCBidXQKLXRoZXNlIGZyYWdtZW50cyBkbyBub3QgaGF2ZSBORlMgb3IgZXZlbiBVRFAgaGVhZGVycyBhbmQgc28gbWlnaHQgbm90IGJlCi1wcmludGVkLCBkZXBlbmRpbmcgb24gdGhlIGZpbHRlciBleHByZXNzaW9uIHVzZWQpLgotQmVjYXVzZSB0aGUgXC12IGZsYWcKLWlzIGdpdmVuLCBzb21lIG9mIHRoZSBmaWxlIGF0dHJpYnV0ZXMgKHdoaWNoIGFyZSByZXR1cm5lZCBpbiBhZGRpdGlvbgotdG8gdGhlIGZpbGUgZGF0YSkgYXJlIHByaW50ZWQ6IHRoZSBmaWxlIHR5cGUgKGBgUkVHJycsIGZvciByZWd1bGFyIGZpbGUpLAotdGhlIGZpbGUgbW9kZSAoaW4gb2N0YWwpLCB0aGUgdWlkIGFuZCBnaWQsIGFuZCB0aGUgZmlsZSBzaXplLgotLkxQCi1JZiB0aGUgXC12IGZsYWcgaXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGV2ZW4gbW9yZSBkZXRhaWxzIGFyZSBwcmludGVkLgotLkxQCi1Ob3RlIHRoYXQgTkZTIHJlcXVlc3RzIGFyZSB2ZXJ5IGxhcmdlIGFuZCBtdWNoIG9mIHRoZSBkZXRhaWwgd29uJ3QgYmUgcHJpbnRlZAotdW5sZXNzIFxmSXNuYXBsZW5cZlAgaXMgaW5jcmVhc2VkLgotVHJ5IHVzaW5nIGBcZkJcLXMgMTkyXGZQJyB0byB3YXRjaAotTkZTIHRyYWZmaWMuCi0uTFAKLU5GUyByZXBseSBwYWNrZXRzIGRvIG5vdCBleHBsaWNpdGx5IGlkZW50aWZ5IHRoZSBSUEMgb3BlcmF0aW9uLgotSW5zdGVhZCwKLVxmSXRjcGR1bXBcZlAga2VlcHMgdHJhY2sgb2YgYGByZWNlbnQnJyByZXF1ZXN0cywgYW5kIG1hdGNoZXMgdGhlbSB0byB0aGUKLXJlcGxpZXMgdXNpbmcgdGhlIHRyYW5zYWN0aW9uIElELgotSWYgYSByZXBseSBkb2VzIG5vdCBjbG9zZWx5IGZvbGxvdyB0aGUKLWNvcnJlc3BvbmRpbmcgcmVxdWVzdCwgaXQgbWlnaHQgbm90IGJlIHBhcnNhYmxlLgotLkhECi1BRlMgUmVxdWVzdHMgYW5kIFJlcGxpZXMKLS5MUAotVHJhbnNhcmMgQUZTIChBbmRyZXcgRmlsZSBTeXN0ZW0pIHJlcXVlc3RzIGFuZCByZXBsaWVzIGFyZSBwcmludGVkCi1hczoKLS5IRAotLlJTCi0ubmYKLS5zcCAuNQotXGZJc3JjLnNwb3J0ID4gZHN0LmRwb3J0OiByeCBwYWNrZXQtdHlwZVxmUAotXGZJc3JjLnNwb3J0ID4gZHN0LmRwb3J0OiByeCBwYWNrZXQtdHlwZSBzZXJ2aWNlIGNhbGwgY2FsbC1uYW1lIGFyZ3NcZlAKLVxmSXNyYy5zcG9ydCA+IGRzdC5kcG9ydDogcnggcGFja2V0LXR5cGUgc2VydmljZSByZXBseSBjYWxsLW5hbWUgYXJnc1xmUAotLnNwIC41Ci1cZihDVwotZWx2aXMuNzAwMSA+IHBpa2UuYWZzZnM6Ci0JcnggZGF0YSBmcyBjYWxsIHJlbmFtZSBvbGQgZmlkIDUzNjg3Njk2NC8xLzEgIi5uZXdzcmMubmV3IgotCW5ldyBmaWQgNTM2ODc2OTY0LzEvMSAiLm5ld3NyYyIKLXBpa2UuYWZzZnMgPiBlbHZpcy43MDAxOiByeCBkYXRhIGZzIHJlcGx5IHJlbmFtZQotXGZSCi0uc3AgLjUKLS5maQotLlJFCi1JbiB0aGUgZmlyc3QgbGluZSwgaG9zdCBlbHZpcyBzZW5kcyBhIFJYIHBhY2tldCB0byBwaWtlLgotVGhpcyB3YXMKLWEgUlggZGF0YSBwYWNrZXQgdG8gdGhlIGZzIChmaWxlc2VydmVyKSBzZXJ2aWNlLCBhbmQgaXMgdGhlIHN0YXJ0IG9mCi1hbiBSUEMgY2FsbC4KLVRoZSBSUEMgY2FsbCB3YXMgYSByZW5hbWUsIHdpdGggdGhlIG9sZCBkaXJlY3RvcnkgZmlsZSBpZAotb2YgNTM2ODc2OTY0LzEvMSBhbmQgYW4gb2xkIGZpbGVuYW1lIG9mIGAubmV3c3JjLm5ldycsIGFuZCBhIG5ldyBkaXJlY3RvcnkKLWZpbGUgaWQgb2YgNTM2ODc2OTY0LzEvMSBhbmQgYSBuZXcgZmlsZW5hbWUgb2YgYC5uZXdzcmMnLgotVGhlIGhvc3QgcGlrZQotcmVzcG9uZHMgd2l0aCBhIFJQQyByZXBseSB0byB0aGUgcmVuYW1lIGNhbGwgKHdoaWNoIHdhcyBzdWNjZXNzZnVsLCBiZWNhdXNlCi1pdCB3YXMgYSBkYXRhIHBhY2tldCBhbmQgbm90IGFuIGFib3J0IHBhY2tldCkuCi0uTFAKLUluIGdlbmVyYWwsIGFsbCBBRlMgUlBDcyBhcmUgZGVjb2RlZCBhdCBsZWFzdCBieSBSUEMgY2FsbCBuYW1lLgotTW9zdAotQUZTIFJQQ3MgaGF2ZSBhdCBsZWFzdCBzb21lIG9mIHRoZSBhcmd1bWVudHMgZGVjb2RlZCAoZ2VuZXJhbGx5IG9ubHkKLXRoZSBgaW50ZXJlc3RpbmcnIGFyZ3VtZW50cywgZm9yIHNvbWUgZGVmaW5pdGlvbiBvZiBpbnRlcmVzdGluZykuCi0uTFAKLVRoZSBmb3JtYXQgaXMgaW50ZW5kZWQgdG8gYmUgc2VsZi1kZXNjcmliaW5nLCBidXQgaXQgd2lsbCBwcm9iYWJseQotbm90IGJlIHVzZWZ1bCB0byBwZW9wbGUgd2hvIGFyZSBub3QgZmFtaWxpYXIgd2l0aCB0aGUgd29ya2luZ3Mgb2YKLUFGUyBhbmQgUlguCi0uTFAKLUlmIHRoZSAtdiAodmVyYm9zZSkgZmxhZyBpcyBnaXZlbiB0d2ljZSwgYWNrbm93bGVkZ2VtZW50IHBhY2tldHMgYW5kCi1hZGRpdGlvbmFsIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBwcmludGVkLCBzdWNoIGFzIHRoZSB0aGUgUlggY2FsbCBJRCwKLWNhbGwgbnVtYmVyLCBzZXF1ZW5jZSBudW1iZXIsIHNlcmlhbCBudW1iZXIsIGFuZCB0aGUgUlggcGFja2V0IGZsYWdzLgotLkxQCi1JZiB0aGUgLXYgZmxhZyBpcyBnaXZlbiB0d2ljZSwgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLAotc3VjaCBhcyB0aGUgdGhlIFJYIGNhbGwgSUQsIHNlcmlhbCBudW1iZXIsIGFuZCB0aGUgUlggcGFja2V0IGZsYWdzLgotVGhlIE1UVSBuZWdvdGlhdGlvbiBpbmZvcm1hdGlvbiBpcyBhbHNvIHByaW50ZWQgZnJvbSBSWCBhY2sgcGFja2V0cy4KLS5MUAotSWYgdGhlIC12IGZsYWcgaXMgZ2l2ZW4gdGhyZWUgdGltZXMsIHRoZSBzZWN1cml0eSBpbmRleCBhbmQgc2VydmljZSBpZAotYXJlIHByaW50ZWQuCi0uTFAKLUVycm9yIGNvZGVzIGFyZSBwcmludGVkIGZvciBhYm9ydCBwYWNrZXRzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgVWJpawotYmVhY29uIHBhY2tldHMgKGJlY2F1c2UgYWJvcnQgcGFja2V0cyBhcmUgdXNlZCB0byBzaWduaWZ5IGEgeWVzIHZvdGUKLWZvciB0aGUgVWJpayBwcm90b2NvbCkuCi0uTFAKLU5vdGUgdGhhdCBBRlMgcmVxdWVzdHMgYXJlIHZlcnkgbGFyZ2UgYW5kIG1hbnkgb2YgdGhlIGFyZ3VtZW50cyB3b24ndAotYmUgcHJpbnRlZCB1bmxlc3MgXGZJc25hcGxlblxmUCBpcyBpbmNyZWFzZWQuCi1UcnkgdXNpbmcgYFxmQi1zIDI1NlxmUCcKLXRvIHdhdGNoIEFGUyB0cmFmZmljLgotLkxQCi1BRlMgcmVwbHkgcGFja2V0cyBkbyBub3QgZXhwbGljaXRseSBpZGVudGlmeSB0aGUgUlBDIG9wZXJhdGlvbi4KLUluc3RlYWQsCi1cZkl0Y3BkdW1wXGZQIGtlZXBzIHRyYWNrIG9mIGBgcmVjZW50JycgcmVxdWVzdHMsIGFuZCBtYXRjaGVzIHRoZW0gdG8gdGhlCi1yZXBsaWVzIHVzaW5nIHRoZSBjYWxsIG51bWJlciBhbmQgc2VydmljZSBJRC4KLUlmIGEgcmVwbHkgZG9lcyBub3QgY2xvc2VseQotZm9sbG93IHRoZQotY29ycmVzcG9uZGluZyByZXF1ZXN0LCBpdCBtaWdodCBub3QgYmUgcGFyc2FibGUuCi0KLS5IRAotS0lQIEFwcGxlVGFsayAoRERQIGluIFVEUCkKLS5MUAotQXBwbGVUYWxrIEREUCBwYWNrZXRzIGVuY2Fwc3VsYXRlZCBpbiBVRFAgZGF0YWdyYW1zIGFyZSBkZS1lbmNhcHN1bGF0ZWQKLWFuZCBkdW1wZWQgYXMgRERQIHBhY2tldHMgKGkuZS4sIGFsbCB0aGUgVURQIGhlYWRlciBpbmZvcm1hdGlvbiBpcwotZGlzY2FyZGVkKS4KLVRoZSBmaWxlCi0uSSAvZXRjL2F0YWxrLm5hbWVzCi1pcyB1c2VkIHRvIHRyYW5zbGF0ZSBBcHBsZVRhbGsgbmV0IGFuZCBub2RlIG51bWJlcnMgdG8gbmFtZXMuCi1MaW5lcyBpbiB0aGlzIGZpbGUgaGF2ZSB0aGUgZm9ybQotLlJTCi0ubmYKLS5zcCAuNQotXGZJbnVtYmVyCW5hbWVcZlAKLQotXGYoQ1cxLjI1NAkJZXRoZXIKLTE2LjEJCWljc2QtbmV0Ci0xLjI1NC4xMTAJYWNlXGZSCi0uc3AgLjUKLS5maQotLlJFCi1UaGUgZmlyc3QgdHdvIGxpbmVzIGdpdmUgdGhlIG5hbWVzIG9mIEFwcGxlVGFsayBuZXR3b3Jrcy4KLVRoZSB0aGlyZAotbGluZSBnaXZlcyB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgaG9zdCAoYSBob3N0IGlzIGRpc3Rpbmd1aXNoZWQKLWZyb20gYSBuZXQgYnkgdGhlIDNyZCBvY3RldCBpbiB0aGUgbnVtYmVyIFwtCi1hIG5ldCBudW1iZXIgXGZJbXVzdFxmUCBoYXZlIHR3byBvY3RldHMgYW5kIGEgaG9zdCBudW1iZXIgXGZJbXVzdFxmUAotaGF2ZSB0aHJlZSBvY3RldHMuKSAgVGhlIG51bWJlciBhbmQgbmFtZSBzaG91bGQgYmUgc2VwYXJhdGVkIGJ5Ci13aGl0ZXNwYWNlIChibGFua3Mgb3IgdGFicykuCi1UaGUKLS5JIC9ldGMvYXRhbGsubmFtZXMKLWZpbGUgbWF5IGNvbnRhaW4gYmxhbmsgbGluZXMgb3IgY29tbWVudCBsaW5lcyAobGluZXMgc3RhcnRpbmcgd2l0aAotYSBgIycpLgotLkxQCi1BcHBsZVRhbGsgYWRkcmVzc2VzIGFyZSBwcmludGVkIGluIHRoZSBmb3JtCi0uUlMKLS5uZgotLnNwIC41Ci1cZkluZXQuaG9zdC5wb3J0XGZQCi0KLVxmKENXMTQ0LjEuMjA5LjIgPiBpY3NkLW5ldC4xMTIuMjIwCi1vZmZpY2UuMiA+IGljc2QtbmV0LjExMi4yMjAKLWpzc21hZy4xNDkuMjM1ID4gaWNzZC1uZXQuMlxmUgotLnNwIC41Ci0uZmkKLS5SRQotKElmIHRoZQotLkkgL2V0Yy9hdGFsay5uYW1lcwotZG9lc24ndCBleGlzdCBvciBkb2Vzbid0IGNvbnRhaW4gYW4gZW50cnkgZm9yIHNvbWUgQXBwbGVUYWxrCi1ob3N0L25ldCBudW1iZXIsIGFkZHJlc3NlcyBhcmUgcHJpbnRlZCBpbiBudW1lcmljIGZvcm0uKQotSW4gdGhlIGZpcnN0IGV4YW1wbGUsIE5CUCAoRERQIHBvcnQgMikgb24gbmV0IDE0NC4xIG5vZGUgMjA5Ci1pcyBzZW5kaW5nIHRvIHdoYXRldmVyIGlzIGxpc3RlbmluZyBvbiBwb3J0IDIyMCBvZiBuZXQgaWNzZCBub2RlIDExMi4KLVRoZSBzZWNvbmQgbGluZSBpcyB0aGUgc2FtZSBleGNlcHQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgc291cmNlIG5vZGUKLWlzIGtub3duIChgb2ZmaWNlJykuCi1UaGUgdGhpcmQgbGluZSBpcyBhIHNlbmQgZnJvbSBwb3J0IDIzNSBvbgotbmV0IGpzc21hZyBub2RlIDE0OSB0byBicm9hZGNhc3Qgb24gdGhlIGljc2QtbmV0IE5CUCBwb3J0IChub3RlIHRoYXQKLXRoZSBicm9hZGNhc3QgYWRkcmVzcyAoMjU1KSBpcyBpbmRpY2F0ZWQgYnkgYSBuZXQgbmFtZSB3aXRoIG5vIGhvc3QKLW51bWJlciBcLSBmb3IgdGhpcyByZWFzb24gaXQncyBhIGdvb2QgaWRlYSB0byBrZWVwIG5vZGUgbmFtZXMgYW5kCi1uZXQgbmFtZXMgZGlzdGluY3QgaW4gL2V0Yy9hdGFsay5uYW1lcykuCi0uTFAKLU5CUCAobmFtZSBiaW5kaW5nIHByb3RvY29sKSBhbmQgQVRQIChBcHBsZVRhbGsgdHJhbnNhY3Rpb24gcHJvdG9jb2wpCi1wYWNrZXRzIGhhdmUgdGhlaXIgY29udGVudHMgaW50ZXJwcmV0ZWQuCi1PdGhlciBwcm90b2NvbHMganVzdCBkdW1wCi10aGUgcHJvdG9jb2wgbmFtZSAob3IgbnVtYmVyIGlmIG5vIG5hbWUgaXMgcmVnaXN0ZXJlZCBmb3IgdGhlCi1wcm90b2NvbCkgYW5kIHBhY2tldCBzaXplLgotCi1cZkJOQlAgcGFja2V0c1xmUCBhcmUgZm9ybWF0dGVkIGxpa2UgdGhlIGZvbGxvd2luZyBleGFtcGxlczoKLS5SUwotLm5mCi0uc3AgLjUKLVxzLTJcZihDV2ljc2QtbmV0LjExMi4yMjAgPiBqc3NtYWcuMjogbmJwLWxrdXAgMTkwOiAiPTpMYXNlcldyaXRlckAqIgotanNzbWFnLjIwOS4yID4gaWNzZC1uZXQuMTEyLjIyMDogbmJwLXJlcGx5IDE5MDogIlJNMTE0MDpMYXNlcldyaXRlckAqIiAyNTAKLXRlY2hwaXQuMiA+IGljc2QtbmV0LjExMi4yMjA6IG5icC1yZXBseSAxOTA6ICJ0ZWNocGl0Okxhc2VyV3JpdGVyQCoiIDE4NlxmUlxzKzIKLS5zcCAuNQotLmZpCi0uUkUKLVRoZSBmaXJzdCBsaW5lIGlzIGEgbmFtZSBsb29rdXAgcmVxdWVzdCBmb3IgbGFzZXJ3cml0ZXJzIHNlbnQgYnkgbmV0IGljc2QgaG9zdAotMTEyIGFuZCBicm9hZGNhc3Qgb24gbmV0IGpzc21hZy4KLVRoZSBuYnAgaWQgZm9yIHRoZSBsb29rdXAgaXMgMTkwLgotVGhlIHNlY29uZCBsaW5lIHNob3dzIGEgcmVwbHkgZm9yIHRoaXMgcmVxdWVzdCAobm90ZSB0aGF0IGl0IGhhcyB0aGUKLXNhbWUgaWQpIGZyb20gaG9zdCBqc3NtYWcuMjA5IHNheWluZyB0aGF0IGl0IGhhcyBhIGxhc2Vyd3JpdGVyCi1yZXNvdXJjZSBuYW1lZCAiUk0xMTQwIiByZWdpc3RlcmVkIG9uIHBvcnQgMjUwLgotVGhlIHRoaXJkIGxpbmUgaXMKLWFub3RoZXIgcmVwbHkgdG8gdGhlIHNhbWUgcmVxdWVzdCBzYXlpbmcgaG9zdCB0ZWNocGl0IGhhcyBsYXNlcndyaXRlcgotInRlY2hwaXQiIHJlZ2lzdGVyZWQgb24gcG9ydCAxODYuCi0KLVxmQkFUUCBwYWNrZXRcZlAgZm9ybWF0dGluZyBpcyBkZW1vbnN0cmF0ZWQgYnkgdGhlIGZvbGxvd2luZyBleGFtcGxlOgotLlJTCi0ubmYKLS5zcCAuNQotXHMtMlxmKENXanNzbWFnLjIwOS4xNjUgPiBoZWxpb3MuMTMyOiBhdHAtcmVxICAxMjI2NjwwLTc+IDB4YWUwMzAwMDEKLWhlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6MCAoNTEyKSAweGFlMDQwMDAwCi1oZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwIDEyMjY2OjEgKDUxMikgMHhhZTA0MDAwMAotaGVsaW9zLjEzMiA+IGpzc21hZy4yMDkuMTY1OiBhdHAtcmVzcCAxMjI2NjoyICg1MTIpIDB4YWUwNDAwMDAKLWhlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6MyAoNTEyKSAweGFlMDQwMDAwCi1oZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwIDEyMjY2OjQgKDUxMikgMHhhZTA0MDAwMAotaGVsaW9zLjEzMiA+IGpzc21hZy4yMDkuMTY1OiBhdHAtcmVzcCAxMjI2Njo1ICg1MTIpIDB4YWUwNDAwMDAKLWhlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6NiAoNTEyKSAweGFlMDQwMDAwCi1oZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwKjEyMjY2OjcgKDUxMikgMHhhZTA0MDAwMAotanNzbWFnLjIwOS4xNjUgPiBoZWxpb3MuMTMyOiBhdHAtcmVxICAxMjI2NjwzLDU+IDB4YWUwMzAwMDEKLWhlbGlvcy4xMzIgPiBqc3NtYWcuMjA5LjE2NTogYXRwLXJlc3AgMTIyNjY6MyAoNTEyKSAweGFlMDQwMDAwCi1oZWxpb3MuMTMyID4ganNzbWFnLjIwOS4xNjU6IGF0cC1yZXNwIDEyMjY2OjUgKDUxMikgMHhhZTA0MDAwMAotanNzbWFnLjIwOS4xNjUgPiBoZWxpb3MuMTMyOiBhdHAtcmVsICAxMjI2NjwwLTc+IDB4YWUwMzAwMDEKLWpzc21hZy4yMDkuMTMzID4gaGVsaW9zLjEzMjogYXRwLXJlcSogMTIyNjc8MC03PiAweGFlMDMwMDAyXGZSXHMrMgotLnNwIC41Ci0uZmkKLS5SRQotSnNzbWFnLjIwOSBpbml0aWF0ZXMgdHJhbnNhY3Rpb24gaWQgMTIyNjYgd2l0aCBob3N0IGhlbGlvcyBieSByZXF1ZXN0aW5nCi11cCB0byA4IHBhY2tldHMgKHRoZSBgPDAtNz4nKS4KLVRoZSBoZXggbnVtYmVyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUKLWlzIHRoZSB2YWx1ZSBvZiB0aGUgYHVzZXJkYXRhJyBmaWVsZCBpbiB0aGUgcmVxdWVzdC4KLS5MUAotSGVsaW9zIHJlc3BvbmRzIHdpdGggOCA1MTItYnl0ZSBwYWNrZXRzLgotVGhlIGA6ZGlnaXQnIGZvbGxvd2luZyB0aGUKLXRyYW5zYWN0aW9uIGlkIGdpdmVzIHRoZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyIGluIHRoZSB0cmFuc2FjdGlvbgotYW5kIHRoZSBudW1iZXIgaW4gcGFyZW5zIGlzIHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgcGFja2V0LAotZXhjbHVkaW5nIHRoZSBhdHAgaGVhZGVyLgotVGhlIGAqJyBvbiBwYWNrZXQgNyBpbmRpY2F0ZXMgdGhhdCB0aGUKLUVPTSBiaXQgd2FzIHNldC4KLS5MUAotSnNzbWFnLjIwOSB0aGVuIHJlcXVlc3RzIHRoYXQgcGFja2V0cyAzICYgNSBiZSByZXRyYW5zbWl0dGVkLgotSGVsaW9zCi1yZXNlbmRzIHRoZW0gdGhlbiBqc3NtYWcuMjA5IHJlbGVhc2VzIHRoZSB0cmFuc2FjdGlvbi4KLUZpbmFsbHksCi1qc3NtYWcuMjA5IGluaXRpYXRlcyB0aGUgbmV4dCByZXF1ZXN0LgotVGhlIGAqJyBvbiB0aGUgcmVxdWVzdAotaW5kaWNhdGVzIHRoYXQgWE8gKGBleGFjdGx5IG9uY2UnKSB3YXMgXGZJbm90XGZQIHNldC4KLQotLkhECi1JUCBGcmFnbWVudGF0aW9uCi0uTFAKLUZyYWdtZW50ZWQgSW50ZXJuZXQgZGF0YWdyYW1zIGFyZSBwcmludGVkIGFzCi0uUlMKLS5uZgotLnNwIC41Ci1cZkIoZnJhZyBcZklpZFxmQjpcZklzaXplXGZCQFxmSW9mZnNldFxmQispXGZSCi1cZkIoZnJhZyBcZklpZFxmQjpcZklzaXplXGZCQFxmSW9mZnNldFxmQilcZlIKLS5zcCAuNQotLmZpCi0uUkUKLShUaGUgZmlyc3QgZm9ybSBpbmRpY2F0ZXMgdGhlcmUgYXJlIG1vcmUgZnJhZ21lbnRzLgotVGhlIHNlY29uZAotaW5kaWNhdGVzIHRoaXMgaXMgdGhlIGxhc3QgZnJhZ21lbnQuKQotLkxQCi1cZklJZFxmUCBpcyB0aGUgZnJhZ21lbnQgaWQuCi1cZklTaXplXGZQIGlzIHRoZSBmcmFnbWVudAotc2l6ZSAoaW4gYnl0ZXMpIGV4Y2x1ZGluZyB0aGUgSVAgaGVhZGVyLgotXGZJT2Zmc2V0XGZQIGlzIHRoaXMKLWZyYWdtZW50J3Mgb2Zmc2V0IChpbiBieXRlcykgaW4gdGhlIG9yaWdpbmFsIGRhdGFncmFtLgotLkxQCi1UaGUgZnJhZ21lbnQgaW5mb3JtYXRpb24gaXMgb3V0cHV0IGZvciBlYWNoIGZyYWdtZW50LgotVGhlIGZpcnN0Ci1mcmFnbWVudCBjb250YWlucyB0aGUgaGlnaGVyIGxldmVsIHByb3RvY29sIGhlYWRlciBhbmQgdGhlIGZyYWcKLWluZm8gaXMgcHJpbnRlZCBhZnRlciB0aGUgcHJvdG9jb2wgaW5mby4KLUZyYWdtZW50cwotYWZ0ZXIgdGhlIGZpcnN0IGNvbnRhaW4gbm8gaGlnaGVyIGxldmVsIHByb3RvY29sIGhlYWRlciBhbmQgdGhlCi1mcmFnIGluZm8gaXMgcHJpbnRlZCBhZnRlciB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCi1Gb3IgZXhhbXBsZSwgaGVyZSBpcyBwYXJ0IG9mIGFuIGZ0cCBmcm9tIGFyaXpvbmEuZWR1IHRvIGxibC1ydHNnLmFycGEKLW92ZXIgYSBDU05FVCBjb25uZWN0aW9uIHRoYXQgZG9lc24ndCBhcHBlYXIgdG8gaGFuZGxlIDU3NiBieXRlIGRhdGFncmFtczoKLS5SUwotLm5mCi0uc3AgLjUKLVxzLTJcZihDV2FyaXpvbmEuZnRwLWRhdGEgPiBydHNnLjExNzA6IC4gMTAyNDoxMzMyKDMwOCkgYWNrIDEgd2luIDQwOTYgKGZyYWcgNTk1YTozMjhAMCspCi1hcml6b25hID4gcnRzZzogKGZyYWcgNTk1YToyMDRAMzI4KQotcnRzZy4xMTcwID4gYXJpem9uYS5mdHAtZGF0YTogLiBhY2sgMTUzNiB3aW4gMjU2MFxmUFxzKzIKLS5zcCAuNQotLmZpCi0uUkUKLVRoZXJlIGFyZSBhIGNvdXBsZSBvZiB0aGluZ3MgdG8gbm90ZSBoZXJlOiAgRmlyc3QsIGFkZHJlc3NlcyBpbiB0aGUKLTJuZCBsaW5lIGRvbid0IGluY2x1ZGUgcG9ydCBudW1iZXJzLgotVGhpcyBpcyBiZWNhdXNlIHRoZSBUQ1AKLXByb3RvY29sIGluZm9ybWF0aW9uIGlzIGFsbCBpbiB0aGUgZmlyc3QgZnJhZ21lbnQgYW5kIHdlIGhhdmUgbm8gaWRlYQotd2hhdCB0aGUgcG9ydCBvciBzZXF1ZW5jZSBudW1iZXJzIGFyZSB3aGVuIHdlIHByaW50IHRoZSBsYXRlciBmcmFnbWVudHMuCi1TZWNvbmQsIHRoZSB0Y3Agc2VxdWVuY2UgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IGxpbmUgaXMgcHJpbnRlZCBhcyBpZiB0aGVyZQotd2VyZSAzMDggYnl0ZXMgb2YgdXNlciBkYXRhIHdoZW4sIGluIGZhY3QsIHRoZXJlIGFyZSA1MTIgYnl0ZXMgKDMwOCBpbgotdGhlIGZpcnN0IGZyYWcgYW5kIDIwNCBpbiB0aGUgc2Vjb25kKS4KLUlmIHlvdSBhcmUgbG9va2luZyBmb3IgaG9sZXMKLWluIHRoZSBzZXF1ZW5jZSBzcGFjZSBvciB0cnlpbmcgdG8gbWF0Y2ggdXAgYWNrcwotd2l0aCBwYWNrZXRzLCB0aGlzIGNhbiBmb29sIHlvdS4KLS5MUAotQSBwYWNrZXQgd2l0aCB0aGUgSVAgXGZJZG9uJ3QgZnJhZ21lbnRcZlAgZmxhZyBpcyBtYXJrZWQgd2l0aCBhCi10cmFpbGluZyBcZkIoREYpXGZQLgotLkhECi1UaW1lc3RhbXBzCi0uTFAKLUJ5IGRlZmF1bHQsIGFsbCBvdXRwdXQgbGluZXMgYXJlIHByZWNlZGVkIGJ5IGEgdGltZXN0YW1wLgotVGhlIHRpbWVzdGFtcAotaXMgdGhlIGN1cnJlbnQgY2xvY2sgdGltZSBpbiB0aGUgZm9ybQotLlJTCi0ubmYKLVxmSWhoOm1tOnNzLmZyYWNcZlAKLS5maQotLlJFCi1hbmQgaXMgYXMgYWNjdXJhdGUgYXMgdGhlIGtlcm5lbCdzIGNsb2NrLgotVGhlIHRpbWVzdGFtcCByZWZsZWN0cyB0aGUgdGltZSB0aGUga2VybmVsIGZpcnN0IHNhdyB0aGUgcGFja2V0LgotTm8gYXR0ZW1wdAotaXMgbWFkZSB0byBhY2NvdW50IGZvciB0aGUgdGltZSBsYWcgYmV0d2VlbiB3aGVuIHRoZQotRXRoZXJuZXQgaW50ZXJmYWNlIHJlbW92ZWQgdGhlIHBhY2tldCBmcm9tIHRoZSB3aXJlIGFuZCB3aGVuIHRoZSBrZXJuZWwKLXNlcnZpY2VkIHRoZSBgbmV3IHBhY2tldCcgaW50ZXJydXB0LgotLlNIICJTRUUgQUxTTyIKLXN0dHkoMSksIHBjYXAoMyksIGJwZig0KSwgbml0KDRQKSwgcGZjb25maWcoOCkKLS5TSCBBVVRIT1JTCi1UaGUgb3JpZ2luYWwgYXV0aG9ycyBhcmU6Ci0uTFAKLVZhbiBKYWNvYnNvbiwKLUNyYWlnIExlcmVzIGFuZAotU3RldmVuIE1jQ2FubmUsIGFsbCBvZiB0aGUKLUxhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYm9yYXRvcnksIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXksIENBLgotLkxQCi1JdCBpcyBjdXJyZW50bHkgYmVpbmcgbWFpbnRhaW5lZCBieSB0Y3BkdW1wLm9yZy4KLS5MUAotVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhdmFpbGFibGUgdmlhIGh0dHA6Ci0uTFAKLS5SUwotLkkgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy8KLS5SRQotLkxQCi1UaGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIGZ0cDoKLS5MUAotLlJTCi0uSSBmdHA6Ly9mdHAuZWUubGJsLmdvdi90Y3BkdW1wLnRhci5aCi0uUkUKLS5MUAotSVB2Ni9JUHNlYyBzdXBwb3J0IGlzIGFkZGVkIGJ5IFdJREUvS0FNRSBwcm9qZWN0LgotVGhpcyBwcm9ncmFtIHVzZXMgRXJpYyBZb3VuZydzIFNTTGVheSBsaWJyYXJ5LCB1bmRlciBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgotLlNIIEJVR1MKLVBsZWFzZSBzZW5kIHByb2JsZW1zLCBidWdzLCBxdWVzdGlvbnMsIGRlc2lyYWJsZSBlbmhhbmNlbWVudHMsIGV0Yy4gdG86Ci0uTFAKLS5SUwotdGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnCi0uUkUKLS5MUAotUGxlYXNlIHNlbmQgc291cmNlIGNvZGUgY29udHJpYnV0aW9ucywgZXRjLiB0bzoKLS5MUAotLlJTCi1wYXRjaGVzQHRjcGR1bXAub3JnCi0uUkUKLS5MUAotTklUIGRvZXNuJ3QgbGV0IHlvdSB3YXRjaCB5b3VyIG93biBvdXRib3VuZCB0cmFmZmljLCBCUEYgd2lsbC4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgdGhlIGxhdHRlci4KLS5MUAotT24gTGludXggc3lzdGVtcyB3aXRoIDIuMFsueF0ga2VybmVsczoKLS5JUAotcGFja2V0cyBvbiB0aGUgbG9vcGJhY2sgZGV2aWNlIHdpbGwgYmUgc2VlbiB0d2ljZTsKLS5JUAotcGFja2V0IGZpbHRlcmluZyBjYW5ub3QgYmUgZG9uZSBpbiB0aGUga2VybmVsLCBzbyB0aGF0IGFsbCBwYWNrZXRzIG11c3QKLWJlIGNvcGllZCBmcm9tIHRoZSBrZXJuZWwgaW4gb3JkZXIgdG8gYmUgZmlsdGVyZWQgaW4gdXNlciBtb2RlOwotLklQCi1hbGwgb2YgYSBwYWNrZXQsIG5vdCBqdXN0IHRoZSBwYXJ0IHRoYXQncyB3aXRoaW4gdGhlIHNuYXBzaG90IGxlbmd0aCwKLXdpbGwgYmUgY29waWVkIGZyb20gdGhlIGtlcm5lbCAodGhlIDIuMFsueF0gcGFja2V0IGNhcHR1cmUgbWVjaGFuaXNtLCBpZgotYXNrZWQgdG8gY29weSBvbmx5IHBhcnQgb2YgYSBwYWNrZXQgdG8gdXNlcmxhbmQsIHdpbGwgbm90IHJlcG9ydCB0aGUKLXRydWUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQ7IHRoaXMgd291bGQgY2F1c2UgbW9zdCBJUCBwYWNrZXRzIHRvIGdldCBhbgotZXJyb3IgZnJvbQotLkJSIHRjcGR1bXAgKTsKLS5JUAotY2FwdHVyaW5nIG9uIHNvbWUgUFBQIGRldmljZXMgd29uJ3Qgd29yayBjb3JyZWN0bHkuCi0uTFAKLVdlIHJlY29tbWVuZCB0aGF0IHlvdSB1cGdyYWRlIHRvIGEgMi4yIG9yIGxhdGVyIGtlcm5lbC4KLS5MUAotU29tZSBhdHRlbXB0IHNob3VsZCBiZSBtYWRlIHRvIHJlYXNzZW1ibGUgSVAgZnJhZ21lbnRzIG9yLCBhdCBsZWFzdAotdG8gY29tcHV0ZSB0aGUgcmlnaHQgbGVuZ3RoIGZvciB0aGUgaGlnaGVyIGxldmVsIHByb3RvY29sLgotLkxQCi1OYW1lIHNlcnZlciBpbnZlcnNlIHF1ZXJpZXMgYXJlIG5vdCBkdW1wZWQgY29ycmVjdGx5OiB0aGUgKGVtcHR5KQotcXVlc3Rpb24gc2VjdGlvbiBpcyBwcmludGVkIHJhdGhlciB0aGFuIHJlYWwgcXVlcnkgaW4gdGhlIGFuc3dlcgotc2VjdGlvbi4KLVNvbWUgYmVsaWV2ZSB0aGF0IGludmVyc2UgcXVlcmllcyBhcmUgdGhlbXNlbHZlcyBhIGJ1ZyBhbmQKLXByZWZlciB0byBmaXggdGhlIHByb2dyYW0gZ2VuZXJhdGluZyB0aGVtIHJhdGhlciB0aGFuIFxmSXRjcGR1bXBcZlAuCi0uTFAKLUEgcGFja2V0IHRyYWNlIHRoYXQgY3Jvc3NlcyBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBjaGFuZ2Ugd2lsbCBnaXZlCi1za2V3ZWQgdGltZSBzdGFtcHMgKHRoZSB0aW1lIGNoYW5nZSBpcyBpZ25vcmVkKS4KLS5MUAotRmlsdGVyIGV4cHJlc3Npb25zIG9uIGZpZWxkcyBvdGhlciB0aGFuIHRob3NlIGluIFRva2VuIFJpbmcgaGVhZGVycyB3aWxsCi1ub3QgY29ycmVjdGx5IGhhbmRsZSBzb3VyY2Utcm91dGVkIFRva2VuIFJpbmcgcGFja2V0cy4KLS5MUAotRmlsdGVyIGV4cHJlc3Npb25zIG9uIGZpZWxkcyBvdGhlciB0aGFuIHRob3NlIGluIDgwMi4xMSBoZWFkZXJzIHdpbGwgbm90Ci1jb3JyZWN0bHkgaGFuZGxlIDgwMi4xMSBkYXRhIHBhY2tldHMgd2l0aCBib3RoIFRvIERTIGFuZCBGcm9tIERTIHNldC4KLS5MUAotLkJSICJpcDYgcHJvdG8iCi1zaG91bGQgY2hhc2UgaGVhZGVyIGNoYWluLCBidXQgYXQgdGhpcyBtb21lbnQgaXQgZG9lcyBub3QuCi0uQlIgImlwNiBwcm90b2NoYWluIgotaXMgc3VwcGxpZWQgZm9yIHRoaXMgYmVoYXZpb3IuCi0uTFAKLUFyaXRobWV0aWMgZXhwcmVzc2lvbiBhZ2FpbnN0IHRyYW5zcG9ydCBsYXllciBoZWFkZXJzLCBsaWtlIFxmQnRjcFswXVxmUCwKLWRvZXMgbm90IHdvcmsgYWdhaW5zdCBJUHY2IHBhY2tldHMuCi1JdCBvbmx5IGxvb2tzIGF0IElQdjQgcGFja2V0cy4KZGlmZiAtLWdpdCBhL3RjcGR1bXAuYyBiL3RjcGR1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyNGQ1NC4uMDAwMDAwMAotLS0gYS90Y3BkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCi0gKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCi0gKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAotICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscwotICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZwotICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAotICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCi0gKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQotICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCi0gKiB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiBTdXBwb3J0IGZvciBzcGxpdHRpbmcgY2FwdHVyZXMgaW50byBtdWx0aXBsZSBmaWxlcyB3aXRoIGEgbWF4aW11bQotICogZmlsZSBzaXplOgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMQotICoJU2V0aCBXZWJzdGVyIDxzd2Vic3RlckBzc3QubGwubWl0LmVkdT4KLSAqLwotCi0jaWZuZGVmIGxpbnQKLXN0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdIF9VXyA9Ci0gICAgIkAoIykgQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAyMDAwXG5cCi1UaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiI7Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvdGNwZHVtcC5jLHYgMS4yNTMuMi4xMyAyMDA3LzA5LzEyIDE5OjQ4OjUxIGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotLyoKLSAqIHRjcGR1bXAgLSBtb25pdG9yIHRjcC9pcCB0cmFmZmljIG9uIGFuIGV0aGVybmV0LgotICoKLSAqIEZpcnN0IHdyaXR0ZW4gaW4gMTk4NyBieSBWYW4gSmFjb2Jzb24sIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCi0gKiBNZXJjaWxlc3NseSBoYWNrZWQgYW5kIG9jY2FzaW9uYWxseSBpbXByb3ZlZCBzaW5jZSB0aGVuIHZpYSB0aGUKLSAqIGNvbWJpbmVkIGVmZm9ydHMgb2YgVmFuLCBTdGV2ZSBNY0Nhbm5lIGFuZCBDcmFpZyBMZXJlcyBvZiBMQkwuCi0gKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8dGNwZHVtcC1zdGRpbmMuaD4KLQotI2lmZGVmIFdJTjMyCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAidzMyX2Z6cy5oIgotZXh0ZXJuIGludCBzdHJjYXNlY21wIChjb25zdCBjaGFyICpfX3MxLCBjb25zdCBjaGFyICpfX3MyKTsKLWV4dGVybiBpbnQgU0laRV9CVUY7Ci0jZGVmaW5lIG9mZl90IGxvbmcKLSNkZWZpbmUgdWludCBVSU5UCi0jZW5kaWYgLyogV0lOMzIgKi8KLQotI2lmZGVmIEhBVkVfU01JX0gKLSNpbmNsdWRlIDxzbWkuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8cGNhcC5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIFdJTjMyCi0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8Z3JwLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0jaW5jbHVkZSAibmV0ZGlzc2VjdC5oIgotI2luY2x1ZGUgImludGVyZmFjZS5oIgotI2luY2x1ZGUgImFkZHJ0b25hbWUuaCIKLSNpbmNsdWRlICJtYWNoZGVwLmgiCi0jaW5jbHVkZSAic2V0c2lnbmFsLmgiCi0jaW5jbHVkZSAiZ210MmxvY2FsLmgiCi0jaW5jbHVkZSAicGNhcC1taXNzaW5nLmgiCi0KLW5ldGRpc3NlY3Rfb3B0aW9ucyBHbmRvOwotbmV0ZGlzc2VjdF9vcHRpb25zICpnbmRvID0gJkduZG87Ci0KLS8qCi0gKiBEZWZpbmUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIGZvciB0aGUgLUMgZmxhZywgYW5kIGhvdyBtYW55Ci0gKiBjaGFyYWN0ZXJzIGNhbiBiZSBhZGRlZCB0byBhIGZpbGVuYW1lIGZvciB0aGUgLUMgZmxhZyAod2hpY2gKLSAqIHNob3VsZCBiZSBlbm91Z2ggdG8gaGFuZGxlIE1BWF9DRkxBRyAtIDEpLgotICovCi0jZGVmaW5lIE1BWF9DRkxBRwkxMDAwMDAwCi0jZGVmaW5lIE1BWF9DRkxBR19DSEFSUwk2Ci0KLWludCBkZmxhZzsJCQkvKiBwcmludCBmaWx0ZXIgY29kZSAqLwotaW50IExmbGFnOwkJCS8qIGxpc3QgYXZhaWxhYmxlIGRhdGEgbGluayB0eXBlcyBhbmQgZXhpdCAqLwotCi1zdGF0aWMgaW50IGluZm9kZWxheTsKLXN0YXRpYyBpbnQgaW5mb3ByaW50OwotCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLWludDMyX3QgdGhpc3pvbmU7CQkvKiBzZWNvbmRzIG9mZnNldCBmcm9tIGdtdCB0byBsb2NhbCB0aW1lICovCi0KLS8qIEZvcndhcmRzICovCi1zdGF0aWMgUkVUU0lHVFlQRSBjbGVhbnVwKGludCk7Ci1zdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOwotc3RhdGljIHZvaWQgc2hvd19kbHRzX2FuZF9leGl0KHBjYXBfdCAqcGQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7Ci0KLXN0YXRpYyB2b2lkIHByaW50X3BhY2tldCh1X2NoYXIgKiwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLXN0YXRpYyB2b2lkIG5kb19kZWZhdWx0X3ByaW50KG5ldGRpc3NlY3Rfb3B0aW9ucyAqLCBjb25zdCB1X2NoYXIgKiwgdV9pbnQpOwotc3RhdGljIHZvaWQgZHVtcF9wYWNrZXRfYW5kX3RydW5jKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOwotc3RhdGljIHZvaWQgZHVtcF9wYWNrZXQodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7Ci1zdGF0aWMgdm9pZCBkcm9wcm9vdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBuZG9fZXJyb3IobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXN0YXRpYyB2b2lkIG5kb193YXJuaW5nKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0KLSNpZmRlZiBTSUdJTkZPCi1SRVRTSUdUWVBFIHJlcXVlc3RpbmZvKGludCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVVNFX1dJTjMyX01NX1RJTUVSKQotICAjaW5jbHVkZSA8TU1zeXN0ZW0uaD4KLSAgc3RhdGljIFVJTlQgdGltZXJfaWQ7Ci0gIHN0YXRpYyB2b2lkIENBTExCQUNLIHZlcmJvc2Vfc3RhdHNfZHVtcChVSU5ULCBVSU5ULCBEV09SRF9QVFIsIERXT1JEX1BUUiwgRFdPUkRfUFRSKTsKLSNlbGlmIGRlZmluZWQoSEFWRV9BTEFSTSkKLSAgc3RhdGljIHZvaWQgdmVyYm9zZV9zdGF0c19kdW1wKGludCBzaWcpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGluZm8oaW50KTsKLXN0YXRpYyB1X2ludCBwYWNrZXRzX2NhcHR1cmVkOwotCi10eXBlZGVmIHVfaW50ICgqaWZfcHJpbnRlcikoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosIGNvbnN0IHVfY2hhciAqKTsKLQotc3RydWN0IHByaW50ZXIgewotCWlmX3ByaW50ZXIgZjsKLQlpbnQgdHlwZTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJpbnRlciBwcmludGVyc1tdID0gewotCXsgYXJjbmV0X2lmX3ByaW50LAlETFRfQVJDTkVUIH0sCi0jaWZkZWYgRExUX0FSQ05FVF9MSU5VWAotCXsgYXJjbmV0X2xpbnV4X2lmX3ByaW50LCBETFRfQVJDTkVUX0xJTlVYIH0sCi0jZW5kaWYKLQl7IGV0aGVyX2lmX3ByaW50LAlETFRfRU4xME1CIH0sCi0JeyB0b2tlbl9pZl9wcmludCwJRExUX0lFRUU4MDIgfSwKLSNpZmRlZiBETFRfTEFORTgwMjMKLQl7IGxhbmVfaWZfcHJpbnQsICAgICAgICBETFRfTEFORTgwMjMgfSwKLSNlbmRpZgotI2lmZGVmIERMVF9DSVAKLQl7IGNpcF9pZl9wcmludCwgICAgICAgICBETFRfQ0lQIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfQVRNX0NMSVAKLQl7IGNpcF9pZl9wcmludCwgICAgICAgICBETFRfQVRNX0NMSVAgfSwKLSNlbmRpZgotCXsgc2xfaWZfcHJpbnQsCQlETFRfU0xJUCB9LAotI2lmZGVmIERMVF9TTElQX0JTRE9TCi0JeyBzbF9ic2Rvc19pZl9wcmludCwJRExUX1NMSVBfQlNET1MgfSwKLSNlbmRpZgotCXsgcHBwX2lmX3ByaW50LAkJRExUX1BQUCB9LAotI2lmZGVmIERMVF9QUFBfV0lUSERJUkVDVElPTgotCXsgcHBwX2lmX3ByaW50LAkJRExUX1BQUF9XSVRIRElSRUNUSU9OIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfUFBQX0JTRE9TCi0JeyBwcHBfYnNkb3NfaWZfcHJpbnQsCURMVF9QUFBfQlNET1MgfSwKLSNlbmRpZgotCXsgZmRkaV9pZl9wcmludCwJRExUX0ZEREkgfSwKLQl7IG51bGxfaWZfcHJpbnQsCURMVF9OVUxMIH0sCi0jaWZkZWYgRExUX0xPT1AKLQl7IG51bGxfaWZfcHJpbnQsCURMVF9MT09QIH0sCi0jZW5kaWYKLQl7IHJhd19pZl9wcmludCwJCURMVF9SQVcgfSwKLQl7IGF0bV9pZl9wcmludCwJCURMVF9BVE1fUkZDMTQ4MyB9LAotI2lmZGVmIERMVF9DX0hETEMKLQl7IGNoZGxjX2lmX3ByaW50LAlETFRfQ19IRExDIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSERMQwotCXsgY2hkbGNfaWZfcHJpbnQsCURMVF9IRExDIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfUFBQX1NFUklBTAotCXsgcHBwX2hkbGNfaWZfcHJpbnQsICAgIERMVF9QUFBfU0VSSUFMIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfUFBQX0VUSEVSCi0JeyBwcHBvZV9pZl9wcmludCwJRExUX1BQUF9FVEhFUiB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0xJTlVYX1NMTAotCXsgc2xsX2lmX3ByaW50LAkJRExUX0xJTlVYX1NMTCB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0lFRUU4MDJfMTEKLQl7IGllZWU4MDJfMTFfaWZfcHJpbnQsCURMVF9JRUVFODAyXzExfSwKLSNlbmRpZgotI2lmZGVmIERMVF9MVEFMSwotCXsgbHRhbGtfaWZfcHJpbnQsCURMVF9MVEFMSyB9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChETFRfUEZMT0cpICYmIGRlZmluZWQoSEFWRV9ORVRfUEZWQVJfSCkKLQl7IHBmbG9nX2lmX3ByaW50LCAJRExUX1BGTE9HIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfRlIKLQl7IGZyX2lmX3ByaW50LAkJRExUX0ZSIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfRlJFTEFZCi0JeyBmcl9pZl9wcmludCwJCURMVF9GUkVMQVkgfSwKLSNlbmRpZgotI2lmZGVmIERMVF9TVU5BVE0KLQl7IHN1bmF0bV9pZl9wcmludCwJRExUX1NVTkFUTSB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0lQX09WRVJfRkMKLQl7IGlwZmNfaWZfcHJpbnQsCURMVF9JUF9PVkVSX0ZDIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfUFJJU01fSEVBREVSCi0JeyBwcmlzbV9pZl9wcmludCwJRExUX1BSSVNNX0hFQURFUiB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0lFRUU4MDJfMTFfUkFESU8KLQl7IGllZWU4MDJfMTFfcmFkaW9faWZfcHJpbnQsCURMVF9JRUVFODAyXzExX1JBRElPIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfRU5DCi0JeyBlbmNfaWZfcHJpbnQsIAlETFRfRU5DIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfU1lNQU5URUNfRklSRVdBTEwKLQl7IHN5bWFudGVjX2lmX3ByaW50LCAJRExUX1NZTUFOVEVDX0ZJUkVXQUxMIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NAotCXsgYXAxMzk0X2lmX3ByaW50LAlETFRfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfQVRNMQotCXsganVuaXBlcl9hdG0xX3ByaW50LAlETFRfSlVOSVBFUl9BVE0xIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9BVE0yCi0JeyBqdW5pcGVyX2F0bTJfcHJpbnQsCURMVF9KVU5JUEVSX0FUTTIgfSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX01GUgotCXsganVuaXBlcl9tZnJfcHJpbnQsCURMVF9KVU5JUEVSX01GUiB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfTUxGUgotCXsganVuaXBlcl9tbGZyX3ByaW50LAlETFRfSlVOSVBFUl9NTEZSIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9NTFBQUAotCXsganVuaXBlcl9tbHBwcF9wcmludCwJRExUX0pVTklQRVJfTUxQUFAgfSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX1BQUE9FCi0JeyBqdW5pcGVyX3BwcG9lX3ByaW50LAlETFRfSlVOSVBFUl9QUFBPRSB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfUFBQT0VfQVRNCi0JeyBqdW5pcGVyX3BwcG9lX2F0bV9wcmludCwgRExUX0pVTklQRVJfUFBQT0VfQVRNIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9HR1NOCi0JeyBqdW5pcGVyX2dnc25fcHJpbnQsCURMVF9KVU5JUEVSX0dHU04gfSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX0VTCi0JeyBqdW5pcGVyX2VzX3ByaW50LAlETFRfSlVOSVBFUl9FUyB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfTU9OSVRPUgotCXsganVuaXBlcl9tb25pdG9yX3ByaW50LCBETFRfSlVOSVBFUl9NT05JVE9SIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9TRVJWSUNFUwotCXsganVuaXBlcl9zZXJ2aWNlc19wcmludCwgRExUX0pVTklQRVJfU0VSVklDRVMgfSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX0VUSEVSCi0JeyBqdW5pcGVyX2V0aGVyX3ByaW50LCBETFRfSlVOSVBFUl9FVEhFUiB9LAotI2VuZGlmCi0jaWZkZWYgRExUX0pVTklQRVJfUFBQCi0JeyBqdW5pcGVyX3BwcF9wcmludCwgRExUX0pVTklQRVJfUFBQIH0sCi0jZW5kaWYKLSNpZmRlZiBETFRfSlVOSVBFUl9GUkVMQVkKLQl7IGp1bmlwZXJfZnJlbGF5X3ByaW50LCBETFRfSlVOSVBFUl9GUkVMQVkgfSwKLSNlbmRpZgotI2lmZGVmIERMVF9KVU5JUEVSX0NIRExDCi0JeyBqdW5pcGVyX2NoZGxjX3ByaW50LCBETFRfSlVOSVBFUl9DSERMQyB9LAotI2VuZGlmCi0jaWZkZWYgRExUX01GUgotCXsgbWZyX2lmX3ByaW50LCBETFRfTUZSIH0sCi0jZW5kaWYKLQl7IE5VTEwsCQkJMCB9LAotfTsKLQotc3RhdGljIGlmX3ByaW50ZXIKLWxvb2t1cF9wcmludGVyKGludCB0eXBlKQotewotCXN0cnVjdCBwcmludGVyICpwOwotCi0JZm9yIChwID0gcHJpbnRlcnM7IHAtPmY7ICsrcCkKLQkJaWYgKHR5cGUgPT0gcC0+dHlwZSkKLQkJCXJldHVybiBwLT5mOwotCi0JcmV0dXJuIE5VTEw7Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi1zdGF0aWMgcGNhcF90ICpwZDsKLQotZXh0ZXJuIGludCBvcHRpbmQ7Ci1leHRlcm4gaW50IG9wdGVycjsKLWV4dGVybiBjaGFyICpvcHRhcmc7Ci0KLXN0cnVjdCBwcmludF9pbmZvIHsKLQlpZl9wcmludGVyIHByaW50ZXI7Ci19OwotCi1zdHJ1Y3QgZHVtcF9pbmZvIHsKLQljaGFyCSpXRmlsZU5hbWU7Ci0JcGNhcF90CSpwZDsKLQlwY2FwX2R1bXBlcl90ICpwOwotfTsKLQotc3RhdGljIHZvaWQKLXNob3dfZGx0c19hbmRfZXhpdChwY2FwX3QgKnBkKQotewotCWludCBuX2RsdHM7Ci0JaW50ICpkbHRzID0gMDsKLQljb25zdCBjaGFyICpkbHRfbmFtZTsKLQotCW5fZGx0cyA9IHBjYXBfbGlzdF9kYXRhbGlua3MocGQsICZkbHRzKTsKLQlpZiAobl9kbHRzIDwgMCkKLQkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKLQllbHNlIGlmIChuX2RsdHMgPT0gMCB8fCAhZGx0cykKLQkJZXJyb3IoIk5vIGRhdGEgbGluayB0eXBlcy4iKTsKLQotCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIkRhdGEgbGluayB0eXBlcyAodXNlIG9wdGlvbiAteSB0byBzZXQpOlxuIik7Ci0KLQl3aGlsZSAoLS1uX2RsdHMgPj0gMCkgewotCQlkbHRfbmFtZSA9IHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoZGx0c1tuX2RsdHNdKTsKLQkJaWYgKGRsdF9uYW1lICE9IE5VTEwpIHsKLQkJCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIiAgJXMgKCVzKSIsIGRsdF9uYW1lLAotCQkJICAgIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKGRsdHNbbl9kbHRzXSkpOwotCi0JCQkvKgotCQkJICogT0ssIGRvZXMgdGNwZHVtcCBoYW5kbGUgdGhhdCB0eXBlPwotCQkJICovCi0JCQlpZiAobG9va3VwX3ByaW50ZXIoZGx0c1tuX2RsdHNdKSA9PSBOVUxMKQotCQkJCSh2b2lkKSBmcHJpbnRmKHN0ZGVyciwgIiAobm90IHN1cHBvcnRlZCkiKTsKLQkJCXB1dGNoYXIoJ1xuJyk7Ci0JCX0gZWxzZSB7Ci0JCQkodm9pZCkgZnByaW50ZihzdGRlcnIsICIgIERMVCAlZCAobm90IHN1cHBvcnRlZClcbiIsCi0JCQkgICAgZGx0c1tuX2RsdHNdKTsKLQkJfQotCX0KLQlmcmVlKGRsdHMpOwotCWV4aXQoMCk7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgZmxhZ3MgdGhhdCBtaWdodCBvciBtaWdodCBub3QgYmUgc3VwcG9ydGVkIGRlcGVuZGluZyBvbiB0aGUKLSAqIHZlcnNpb24gb2YgbGlicGNhcCB3ZSdyZSB1c2luZy4KLSAqLwotI2lmZGVmIFdJTjMyCi0jZGVmaW5lIEJfRkxBRwkJIkI6IgotI2RlZmluZSBCX0ZMQUdfVVNBR0UJIiBbIC1CIHNpemUgXSIKLSNlbHNlIC8qIFdJTjMyICovCi0jZGVmaW5lIEJfRkxBRwotI2RlZmluZSBCX0ZMQUdfVVNBR0UKLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0jaWZkZWYgSEFWRV9QQ0FQX0ZJTkRBTExERVZTCi0jaWZuZGVmIEhBVkVfUENBUF9JRl9UCi0jdW5kZWYgSEFWRV9QQ0FQX0ZJTkRBTExERVZTCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9QQ0FQX0ZJTkRBTExERVZTCi0jZGVmaW5lIERfRkxBRwkiRCIKLSNlbHNlCi0jZGVmaW5lIERfRkxBRwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1BDQVBfRFVNUF9GTFVTSAotI2RlZmluZSBVX0ZMQUcJIlUiCi0jZWxzZQotI2RlZmluZSBVX0ZMQUcKLSNlbmRpZgotCi0jaWZuZGVmIFdJTjMyCi0vLyBub3Qgc3VwcG9ydGVkIG9uIGFuZHJvaWQKLWludCBpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGdyb3VwKSB7cmV0dXJuIDA7fQotLyogRHJvcCByb290IHByaXZpbGVnZXMgYW5kIGNocm9vdCBpZiBuZWNlc3NhcnkgKi8KLXN0YXRpYyB2b2lkCi1kcm9wcm9vdChjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqY2hyb290X2RpcikKLXsKLQlzdHJ1Y3QgcGFzc3dkICpwdyA9IE5VTEw7Ci0KLQlpZiAoY2hyb290X2RpciAmJiAhdXNlcm5hbWUpIHsKLQkJZnByaW50ZihzdGRlcnIsICJ0Y3BkdW1wOiBDaHJvb3Qgd2l0aG91dCBkcm9wcGluZyByb290IGlzIGluc2VjdXJlXG4iKTsKLQkJZXhpdCgxKTsKLQl9Ci0JCi0JcHcgPSBnZXRwd25hbSh1c2VybmFtZSk7Ci0JaWYgKHB3KSB7Ci0JCWlmIChjaHJvb3RfZGlyKSB7Ci0JCQlpZiAoY2hyb290KGNocm9vdF9kaXIpICE9IDAgfHwgY2hkaXIgKCIvIikgIT0gMCkgewotCQkJCWZwcmludGYoc3RkZXJyLCAidGNwZHVtcDogQ291bGRuJ3QgY2hyb290L2NoZGlyIHRvICclLjY0cyc6ICVzXG4iLAotCQkJCSAgICBjaHJvb3RfZGlyLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0JCQkJZXhpdCgxKTsKLQkJCX0KLQkJfQotCQlpZiAoaW5pdGdyb3Vwcyhwdy0+cHdfbmFtZSwgcHctPnB3X2dpZCkgIT0gMCB8fAotCQkgICAgc2V0Z2lkKHB3LT5wd19naWQpICE9IDAgfHwgc2V0dWlkKHB3LT5wd191aWQpICE9IDApIHsKLQkJCWZwcmludGYoc3RkZXJyLCAidGNwZHVtcDogQ291bGRuJ3QgY2hhbmdlIHRvICclLjMycycgdWlkPSVsdSBnaWQ9JWx1OiAlc1xuIiwKLQkJCSAgICB1c2VybmFtZSwgCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpcHctPnB3X3VpZCwKLQkJCSAgICAodW5zaWduZWQgbG9uZylwdy0+cHdfZ2lkLAotCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWZwcmludGYoc3RkZXJyLCAidGNwZHVtcDogQ291bGRuJ3QgZmluZCB1c2VyICclLjMycydcbiIsCi0JCSAgICB1c2VybmFtZSk7Ci0JCWV4aXQoMSk7Ci0JfQotfQotI2VuZGlmIC8qIFdJTjMyICovCi0KLXN0YXRpYyBpbnQKLWdldFdmbGFnQ2hhcnMoaW50IHgpCi17Ci0JaW50IGMgPSAwOwotCi0JeCAtPSAxOwotCXdoaWxlICh4ID4gMCkgewotCQljICs9IDE7Ci0JCXggLz0gMTA7Ci0JfQotCi0JcmV0dXJuIGM7Ci19Ci0KLQotc3RhdGljIHZvaWQKLU1ha2VGaWxlbmFtZShjaGFyICpidWZmZXIsIGNoYXIgKm9yaWdfbmFtZSwgaW50IGNudCwgaW50IG1heF9jaGFycykKLXsKLQlpZiAoY250ID09IDAgJiYgbWF4X2NoYXJzID09IDApCi0JCXN0cmNweShidWZmZXIsIG9yaWdfbmFtZSk7Ci0JZWxzZQotCQlzcHJpbnRmKGJ1ZmZlciwgIiVzJTAqZCIsIG9yaWdfbmFtZSwgbWF4X2NoYXJzLCBjbnQpOwotfQotCi1zdGF0aWMgaW50IHRjcGR1bXBfcHJpbnRmKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvIF9VXywKLQkJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gIAotICB2YV9saXN0IGFyZ3M7Ci0gIGludCByZXQ7Ci0KLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgcmV0PXZmcHJpbnRmKHN0ZG91dCwgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLWludAotbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JcmVnaXN0ZXIgaW50IGNudCwgb3AsIGk7Ci0JYnBmX3VfaW50MzIgbG9jYWxuZXQsIG5ldG1hc2s7Ci0JcmVnaXN0ZXIgY2hhciAqY3AsICppbmZpbGUsICpjbWRidWYsICpkZXZpY2UsICpSRmlsZU5hbWUsICpXRmlsZU5hbWUsICpXRmlsZU5hbWVBbHQ7Ci0JcGNhcF9oYW5kbGVyIGNhbGxiYWNrOwotCWludCB0eXBlOwotCXN0cnVjdCBicGZfcHJvZ3JhbSBmY29kZTsKLSNpZm5kZWYgV0lOMzIKLQlSRVRTSUdUWVBFICgqb2xkaGFuZGxlcikoaW50KTsKLSNlbmRpZgotCXN0cnVjdCBwcmludF9pbmZvIHByaW50aW5mbzsKLQlzdHJ1Y3QgZHVtcF9pbmZvIGR1bXBpbmZvOwotCXVfY2hhciAqcGNhcF91c2VyZGF0YTsKLQljaGFyIGVidWZbUENBUF9FUlJCVUZfU0laRV07Ci0JY2hhciAqdXNlcm5hbWUgPSBOVUxMOwotCWNoYXIgKmNocm9vdF9kaXIgPSBOVUxMOwotI2lmZGVmIEhBVkVfUENBUF9GSU5EQUxMREVWUwotCXBjYXBfaWZfdCAqZGV2cG9pbnRlcjsKLQlpbnQgZGV2bnVtOwotI2VuZGlmCi0JaW50IHN0YXR1czsKLSNpZmRlZiBXSU4zMgotCXVfaW50IFVzZXJCdWZmZXJTaXplID0gMTAwMDAwMDsKLQlpZih3c29ja2luaXQoKSAhPSAwKSByZXR1cm4gMTsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCi0gICAgICAgIGduZG8tPm5kb19PZmxhZz0xOwotCWduZG8tPm5kb19SZmxhZz0xOwotCWduZG8tPm5kb19kbHQ9LTE7Ci0JZ25kby0+bmRvX2RlZmF1bHRfcHJpbnQ9bmRvX2RlZmF1bHRfcHJpbnQ7Ci0JZ25kby0+bmRvX3ByaW50Zj10Y3BkdW1wX3ByaW50ZjsKLQlnbmRvLT5uZG9fZXJyb3I9bmRvX2Vycm9yOwotCWduZG8tPm5kb193YXJuaW5nPW5kb193YXJuaW5nOwotCWduZG8tPm5kb19zbmFwbGVuID0gREVGQVVMVF9TTkFQTEVOOwotICAKLQljbnQgPSAtMTsKLQlkZXZpY2UgPSBOVUxMOwotCWluZmlsZSA9IE5VTEw7Ci0JUkZpbGVOYW1lID0gTlVMTDsKLQlXRmlsZU5hbWUgPSBOVUxMOwotCWlmICgoY3AgPSBzdHJyY2hyKGFyZ3ZbMF0sICcvJykpICE9IE5VTEwpCi0JCXByb2dyYW1fbmFtZSA9IGNwICsgMTsKLQllbHNlCi0JCXByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLQlpZiAoYWJvcnRfb25fbWlzYWxpZ25tZW50KGVidWYsIHNpemVvZihlYnVmKSkgPCAwKQotCQllcnJvcigiJXMiLCBlYnVmKTsKLQotI2lmZGVmIExJQlNNSQotCXNtaUluaXQoInRjcGR1bXAiKTsKLSNlbmRpZgotCi0Jb3B0ZXJyID0gMDsKLQl3aGlsZSAoCi0JICAgIChvcCA9IGdldG9wdChhcmdjLCBhcmd2LCAiYUEiIEJfRkxBRyAiYzpDOmQiIERfRkxBRyAiZUU6ZkY6aTpsTG06TTpuTk9wcXI6UnM6U3RUOnUiIFVfRkxBRyAidnc6Vzp4WHk6WVo6IikpICE9IC0xKQotCQlzd2l0Y2ggKG9wKSB7Ci0KLQkJY2FzZSAnYSc6Ci0JCQkvKiBjb21wYXRpYmlsaXR5IGZvciBvbGQgLWEgKi8KLQkJCWJyZWFrOwotCi0JCWNhc2UgJ0EnOgotCQkJKytBZmxhZzsKLQkJCWJyZWFrOwotCi0jaWZkZWYgV0lOMzIKLQkJY2FzZSAnQic6Ci0JCQlVc2VyQnVmZmVyU2l6ZSA9IGF0b2kob3B0YXJnKSoxMDI0OwotCQkJaWYgKFVzZXJCdWZmZXJTaXplIDwgMCkKLQkJCQllcnJvcigiaW52YWxpZCBwYWNrZXQgYnVmZmVyIHNpemUgJXMiLCBvcHRhcmcpOwotCQkJYnJlYWs7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotCQljYXNlICdjJzoKLQkJCWNudCA9IGF0b2kob3B0YXJnKTsKLQkJCWlmIChjbnQgPD0gMCkKLQkJCQllcnJvcigiaW52YWxpZCBwYWNrZXQgY291bnQgJXMiLCBvcHRhcmcpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCQlDZmxhZyA9IGF0b2kob3B0YXJnKSAqIDEwMDAwMDA7Ci0JCQlpZiAoQ2ZsYWcgPCAwKQotCQkJCWVycm9yKCJpbnZhbGlkIGZpbGUgc2l6ZSAlcyIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlICdkJzoKLQkJCSsrZGZsYWc7Ci0JCQlicmVhazsKLQotI2lmZGVmIEhBVkVfUENBUF9GSU5EQUxMREVWUwotCQljYXNlICdEJzoKLQkJCWlmIChwY2FwX2ZpbmRhbGxkZXZzKCZkZXZwb2ludGVyLCBlYnVmKSA8IDApCi0JCQkJZXJyb3IoIiVzIiwgZWJ1Zik7Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGkgPSAwOyBkZXZwb2ludGVyICE9IDA7IGkrKykgewotCQkJCQlwcmludGYoIiVkLiVzIiwgaSsxLCBkZXZwb2ludGVyLT5uYW1lKTsKLQkJCQkJaWYgKGRldnBvaW50ZXItPmRlc2NyaXB0aW9uICE9IE5VTEwpCi0JCQkJCQlwcmludGYoIiAoJXMpIiwgZGV2cG9pbnRlci0+ZGVzY3JpcHRpb24pOwotCQkJCQlwcmludGYoIlxuIik7Ci0JCQkJCWRldnBvaW50ZXIgPSBkZXZwb2ludGVyLT5uZXh0OwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotI2VuZGlmIC8qIEhBVkVfUENBUF9GSU5EQUxMREVWUyAqLwotCi0JCWNhc2UgJ0wnOgotCQkJTGZsYWcrKzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2UnOgotCQkJKytlZmxhZzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ0UnOgotI2lmbmRlZiBIQVZFX0xJQkNSWVBUTwotCQkJd2FybmluZygiY3J5cHRvIGNvZGUgbm90IGNvbXBpbGVkIGluIik7Ci0jZW5kaWYKLQkJCWduZG8tPm5kb19lc3BzZWNyZXQgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQotCQljYXNlICdmJzoKLQkJCSsrZmZsYWc7Ci0JCQlicmVhazsKLQotCQljYXNlICdGJzoKLQkJCWluZmlsZSA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ2knOgotCQkJaWYgKG9wdGFyZ1swXSA9PSAnMCcgJiYgb3B0YXJnWzFdID09IDApCi0JCQkJZXJyb3IoIkludmFsaWQgYWRhcHRlciBpbmRleCIpOwotCQkJCi0jaWZkZWYgSEFWRV9QQ0FQX0ZJTkRBTExERVZTCi0JCQkvKgotCQkJICogSWYgdGhlIGFyZ3VtZW50IGlzIGEgbnVtYmVyLCB0cmVhdCBpdCBhcwotCQkJICogYW4gaW5kZXggaW50byB0aGUgbGlzdCBvZiBhZGFwdGVycywgYXMKLQkJCSAqIHByaW50ZWQgYnkgInRjcGR1bXAgLUQiLgotCQkJICoKLQkJCSAqIFRoaXMgc2hvdWxkIGJlIE9LIG9uIFVOSVggc3lzdGVtcywgYXMgaW50ZXJmYWNlcwotCQkJICogc2hvdWxkbid0IGhhdmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGRpZ2l0cy4KLQkJCSAqIEl0IGNhbiBiZSB1c2VmdWwgb24gV2luZG93cywgd2hlcmUgbW9yZSB0aGFuCi0JCQkgKiBvbmUgaW50ZXJmYWNlIGNhbiBoYXZlIHRoZSBzYW1lIG5hbWUuCi0JCQkgKi8KLQkJCWlmICgoZGV2bnVtID0gYXRvaShvcHRhcmcpKSAhPSAwKSB7Ci0JCQkJaWYgKGRldm51bSA8IDApCi0JCQkJCWVycm9yKCJJbnZhbGlkIGFkYXB0ZXIgaW5kZXgiKTsKLQotCQkJCWlmIChwY2FwX2ZpbmRhbGxkZXZzKCZkZXZwb2ludGVyLCBlYnVmKSA8IDApCi0JCQkJCWVycm9yKCIlcyIsIGVidWYpOwotCQkJCWVsc2UgewotCQkJCQlmb3IgKGkgPSAwOyBpIDwgZGV2bnVtLTE7IGkrKyl7Ci0JCQkJCQlkZXZwb2ludGVyID0gZGV2cG9pbnRlci0+bmV4dDsKLQkJCQkJCWlmIChkZXZwb2ludGVyID09IE5VTEwpCi0JCQkJCQkJZXJyb3IoIkludmFsaWQgYWRhcHRlciBpbmRleCIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWRldmljZSA9IGRldnBvaW50ZXItPm5hbWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0jZW5kaWYgLyogSEFWRV9QQ0FQX0ZJTkRBTExERVZTICovCi0JCQlkZXZpY2UgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQotCQljYXNlICdsJzoKLSNpZmRlZiBXSU4zMgotCQkJLyoKLQkJCSAqIF9JT0xCRiBpcyB0aGUgc2FtZSBhcyBfSU9GQkYgaW4gTWljcm9zb2Z0J3MgQwotCQkJICogbGlicmFyaWVzOyB0aGUgb25seSBhbHRlcm5hdGl2ZSB0aGV5IG9mZmVyCi0JCQkgKiBpcyBfSU9OQkYuCi0JCQkgKgotCQkJICogWFhYIC0gdGhpcyBzaG91bGQgcmVhbGx5IGJlIGNoZWNraW5nIGZvciBNU1ZDKyssCi0JCQkgKiBub3QgV0lOMzIsIGlmLCBmb3IgZXhhbXBsZSwgTWluR1cgaGFzIGl0cyBvd24KLQkJCSAqIEMgbGlicmFyeSB0aGF0IGlzIG1vcmUgVU5JWC1jb21wYXRpYmxlLgotCQkJICovCi0JCQlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKLSNlbHNlIC8qIFdJTjMyICovCi0jaWZkZWYgSEFWRV9TRVRMSU5FQlVGCi0JCQlzZXRsaW5lYnVmKHN0ZG91dCk7Ci0jZWxzZQotCQkJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT0xCRiwgMCk7Ci0jZW5kaWYKLSNlbmRpZiAvKiBXSU4zMiAqLwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnbic6Ci0JCQkrK25mbGFnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnTic6Ci0JCQkrK05mbGFnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnbSc6Ci0jaWZkZWYgTElCU01JCi0JCSAgICAgICAgaWYgKHNtaUxvYWRNb2R1bGUob3B0YXJnKSA9PSAwKSB7Ci0JCQkJZXJyb3IoImNvdWxkIG5vdCBsb2FkIE1JQiBtb2R1bGUgJXMiLCBvcHRhcmcpOwotCQkgICAgICAgIH0KLQkJCXNmbGFnID0gMTsKLSNlbHNlCi0JCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBpZ25vcmluZyBvcHRpb24gYC1tICVzJyAiLAotCQkJCSAgICAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiKG5vIGxpYnNtaSBzdXBwb3J0KVxuIik7Ci0jZW5kaWYKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ00nOgotCQkJLyogVENQLU1ENSBzaGFyZWQgc2VjcmV0ICovCi0jaWZuZGVmIEhBVkVfTElCQ1JZUFRPCi0JCQl3YXJuaW5nKCJjcnlwdG8gY29kZSBub3QgY29tcGlsZWQgaW4iKTsKLSNlbmRpZgotCQkJdGNwbWQ1c2VjcmV0ID0gb3B0YXJnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnTyc6Ci0JCQlPZmxhZyA9IDA7Ci0JCQlicmVhazsKLQotCQljYXNlICdwJzoKLQkJCSsrcGZsYWc7Ci0JCQlicmVhazsKLQotCQljYXNlICdxJzoKLQkJCSsrcWZsYWc7Ci0JCQkrK3N1cHByZXNzX2RlZmF1bHRfcHJpbnQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdyJzoKLQkJCVJGaWxlTmFtZSA9IG9wdGFyZzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1InOgotCQkJUmZsYWcgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAncyc6IHsKLQkJCWNoYXIgKmVuZDsKLQotCQkJc25hcGxlbiA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDApOwotCQkJaWYgKG9wdGFyZyA9PSBlbmQgfHwgKmVuZCAhPSAnXDAnCi0JCQkgICAgfHwgc25hcGxlbiA8IDAgfHwgc25hcGxlbiA+IDY1NTM1KQotCQkJCWVycm9yKCJpbnZhbGlkIHNuYXBsZW4gJXMiLCBvcHRhcmcpOwotCQkJZWxzZSBpZiAoc25hcGxlbiA9PSAwKQotCQkJCXNuYXBsZW4gPSA2NTUzNTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSAnUyc6Ci0JCQkrK1NmbGFnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAndCc6Ci0JCQkrK3RmbGFnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnVCc6Ci0JCQlpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJ2YXQiKSA9PSAwKQotCQkJCXBhY2tldHR5cGUgPSBQVF9WQVQ7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgIndiIikgPT0gMCkKLQkJCQlwYWNrZXR0eXBlID0gUFRfV0I7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgInJwYyIpID09IDApCi0JCQkJcGFja2V0dHlwZSA9IFBUX1JQQzsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAicnRwIikgPT0gMCkKLQkJCQlwYWNrZXR0eXBlID0gUFRfUlRQOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJydGNwIikgPT0gMCkKLQkJCQlwYWNrZXR0eXBlID0gUFRfUlRDUDsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAic25tcCIpID09IDApCi0JCQkJcGFja2V0dHlwZSA9IFBUX1NOTVA7Ci0JCQllbHNlIGlmIChzdHJjYXNlY21wKG9wdGFyZywgImNuZnAiKSA9PSAwKQotCQkJCXBhY2tldHR5cGUgPSBQVF9DTkZQOwotCQkJZWxzZSBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJ0ZnRwIikgPT0gMCkKLQkJCQlwYWNrZXR0eXBlID0gUFRfVEZUUDsKLQkJCWVsc2UgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiYW9kdiIpID09IDApCi0JCQkJcGFja2V0dHlwZSA9IFBUX0FPRFY7Ci0JCQllbHNlCi0JCQkJZXJyb3IoInVua25vd24gcGFja2V0IHR5cGUgYCVzJyIsIG9wdGFyZyk7Ci0JCQlicmVhazsKLQotCQljYXNlICd1JzoKLQkJCSsrdWZsYWc7Ci0JCQlicmVhazsKLQotI2lmZGVmIEhBVkVfUENBUF9EVU1QX0ZMVVNICi0JCWNhc2UgJ1UnOgotCQkJKytVZmxhZzsKLQkJCWJyZWFrOwotI2VuZGlmCi0KLQkJY2FzZSAndic6Ci0JCQkrK3ZmbGFnOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAndyc6Ci0JCQlXRmlsZU5hbWUgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQotCQljYXNlICdXJzoKLQkJCVdmbGFnID0gYXRvaShvcHRhcmcpOwotCQkJaWYgKFdmbGFnIDwgMCkgCi0JCQkJZXJyb3IoImludmFsaWQgbnVtYmVyIG9mIG91dHB1dCBmaWxlcyAlcyIsIG9wdGFyZyk7Ci0JCQlXZmxhZ0NoYXJzID0gZ2V0V2ZsYWdDaGFycyhXZmxhZyk7Ci0JCQlicmVhazsKLQotCQljYXNlICd4JzoKLQkJCSsreGZsYWc7Ci0JCQkrK3N1cHByZXNzX2RlZmF1bHRfcHJpbnQ7Ci0JCQlicmVhazsKLQotCQljYXNlICdYJzoKLQkJCSsrWGZsYWc7Ci0JCQkrK3N1cHByZXNzX2RlZmF1bHRfcHJpbnQ7Ci0JCQlicmVhazsKLQotCQljYXNlICd5JzoKLQkJCWduZG8tPm5kb19kbHRuYW1lID0gb3B0YXJnOwotCQkJZ25kby0+bmRvX2RsdCA9Ci0JCQkgIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoZ25kby0+bmRvX2RsdG5hbWUpOwotCQkJaWYgKGduZG8tPm5kb19kbHQgPCAwKQotCQkJCWVycm9yKCJpbnZhbGlkIGRhdGEgbGluayB0eXBlICVzIiwgZ25kby0+bmRvX2RsdG5hbWUpOwotCQkJYnJlYWs7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfUENBUF9ERUJVRykgfHwgZGVmaW5lZChIQVZFX1lZREVCVUcpCi0JCWNhc2UgJ1knOgotCQkJewotCQkJLyogVW5kb2N1bWVudGVkIGZsYWcgKi8KLSNpZmRlZiBIQVZFX1BDQVBfREVCVUcKLQkJCWV4dGVybiBpbnQgcGNhcF9kZWJ1ZzsKLQkJCXBjYXBfZGVidWcgPSAxOwotI2Vsc2UKLQkJCWV4dGVybiBpbnQgeXlkZWJ1ZzsKLQkJCXl5ZGVidWcgPSAxOwotI2VuZGlmCi0JCQl9Ci0JCQlicmVhazsKLSNlbmRpZgotCQljYXNlICdaJzoKLQkJCWlmIChvcHRhcmcpIHsKLQkJCQl1c2VybmFtZSA9IHN0cmR1cChvcHRhcmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXNhZ2UoKTsKLQkJCQkvKiBOT1RSRUFDSEVEICovCi0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJdXNhZ2UoKTsKLQkJCS8qIE5PVFJFQUNIRUQgKi8KLQkJfQotCi0Jc3dpdGNoICh0ZmxhZykgewotCi0JY2FzZSAwOiAvKiBEZWZhdWx0ICovCi0JY2FzZSA0OiAvKiBEZWZhdWx0ICsgRGF0ZSovCi0JCXRoaXN6b25lID0gZ210MmxvY2FsKDApOwotCQlicmVhazsKLQotCWNhc2UgMTogLyogTm8gdGltZSBzdGFtcCAqLwotCWNhc2UgMjogLyogVW5peCB0aW1ldmFsIHN0eWxlICovCi0JY2FzZSAzOiAvKiBNaWNyb3NlY29uZHMgc2luY2UgcHJldmlvdXMgcGFja2V0ICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDogLyogTm90IHN1cHBvcnRlZCAqLwotCQllcnJvcigib25seSAtdCwgLXR0LCAtdHR0LCBhbmQgLXR0dHQgYXJlIHN1cHBvcnRlZCIpOwotCQlicmVhazsKLQl9Ci0KLSNpZmRlZiBXSVRIX0NIUk9PVAotCS8qIGlmIHJ1biBhcyByb290LCBwcmVwYXJlIGZvciBjaHJvb3RpbmcgKi8KLQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkgewotCQkvKiBmdXR1cmUgZXh0ZW5zaWJpbGl0eSBmb3IgY21kLWxpbmUgYXJndW1lbnRzICovCi0JCWlmICghY2hyb290X2RpcikKLQkJCWNocm9vdF9kaXIgPSBXSVRIX0NIUk9PVDsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIFdJVEhfVVNFUgotCS8qIGlmIHJ1biBhcyByb290LCBwcmVwYXJlIGZvciBkcm9wcGluZyByb290IHByaXZpbGVnZXMgKi8KLQlpZiAoZ2V0dWlkKCkgPT0gMCB8fCBnZXRldWlkKCkgPT0gMCkgewotCQkvKiBSdW4gd2l0aCAnLVogcm9vdCcgdG8gcmVzdG9yZSBvbGQgYmVoYXZpb3VyICovIAotCQlpZiAoIXVzZXJuYW1lKQotCQkJdXNlcm5hbWUgPSBXSVRIX1VTRVI7Ci0JfQotI2VuZGlmCi0KLQlpZiAoUkZpbGVOYW1lICE9IE5VTEwpIHsKLQkJaW50IGRsdDsKLQkJY29uc3QgY2hhciAqZGx0X25hbWU7Ci0KLSNpZm5kZWYgV0lOMzIKLQkJLyoKLQkJICogV2UgZG9uJ3QgbmVlZCBuZXR3b3JrIGFjY2Vzcywgc28gcmVsaW5xdWlzaCBhbnkgc2V0LVVJRAotCQkgKiBvciBzZXQtR0lEIHByaXZpbGVnZXMgd2UgaGF2ZSAoaWYgYW55KS4KLQkJICoKLQkJICogV2UgZG8gKm5vdCogd2FudCBzZXQtVUlEIHByaXZpbGVnZXMgd2hlbiBvcGVuaW5nIGEKLQkJICogdHJhY2UgZmlsZSwgYXMgdGhhdCBtaWdodCBsZXQgdGhlIHVzZXIgcmVhZCBvdGhlcgotCQkgKiBwZW9wbGUncyB0cmFjZSBmaWxlcyAoZXNwZWNpYWxseSBpZiB3ZSdyZSBzZXQtVUlECi0JCSAqIHJvb3QpLgotCQkgKi8KLQkJaWYgKHNldGdpZChnZXRnaWQoKSkgIT0gMCB8fCBzZXR1aWQoZ2V0dWlkKCkpICE9IDAgKQotCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBzZXRnaWQvc2V0dWlkIGZhaWxlZCAhXG4iKTsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCQlwZCA9IHBjYXBfb3Blbl9vZmZsaW5lKFJGaWxlTmFtZSwgZWJ1Zik7Ci0JCWlmIChwZCA9PSBOVUxMKQotCQkJZXJyb3IoIiVzIiwgZWJ1Zik7Ci0JCWRsdCA9IHBjYXBfZGF0YWxpbmsocGQpOwotCQlkbHRfbmFtZSA9IHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoZGx0KTsKLQkJaWYgKGRsdF9uYW1lID09IE5VTEwpIHsKLQkJCWZwcmludGYoc3RkZXJyLCAicmVhZGluZyBmcm9tIGZpbGUgJXMsIGxpbmstdHlwZSAldVxuIiwKLQkJCSAgICBSRmlsZU5hbWUsIGRsdCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCSAgICAicmVhZGluZyBmcm9tIGZpbGUgJXMsIGxpbmstdHlwZSAlcyAoJXMpXG4iLAotCQkJICAgIFJGaWxlTmFtZSwgZGx0X25hbWUsCi0JCQkgICAgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oZGx0KSk7Ci0JCX0KLQkJbG9jYWxuZXQgPSAwOwotCQluZXRtYXNrID0gMDsKLQkJaWYgKGZmbGFnICE9IDApCi0JCQllcnJvcigiLWYgYW5kIC1yIG9wdGlvbnMgYXJlIGluY29tcGF0aWJsZSIpOwotCX0gZWxzZSB7Ci0JCWlmIChkZXZpY2UgPT0gTlVMTCkgewotCQkJZGV2aWNlID0gcGNhcF9sb29rdXBkZXYoZWJ1Zik7Ci0JCQlpZiAoZGV2aWNlID09IE5VTEwpCi0JCQkJZXJyb3IoIiVzIiwgZWJ1Zik7Ci0JCX0KLSNpZmRlZiBXSU4zMgotCQlpZihzdHJsZW4oZGV2aWNlKSA9PSAxKQkvL3dlIGFzc3VtZSB0aGF0IGFuIEFTQ0lJIHN0cmluZyBpcyBhbHdheXMgbG9uZ2VyIHRoYW4gMSBjaGFyCi0JCXsJCQkJCQkvL2EgVW5pY29kZSBzdHJpbmcgaGFzIGEgXDAgYXMgc2Vjb25kIGJ5dGUgKHNvIHN0cmxlbigpIGlzIDEpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBsaXN0ZW5pbmcgb24gJXdzXG4iLCBwcm9ncmFtX25hbWUsIGRldmljZSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBsaXN0ZW5pbmcgb24gJXNcbiIsIHByb2dyYW1fbmFtZSwgZGV2aWNlKTsKLQkJfQotCi0JCWZmbHVzaChzdGRlcnIpOwkKLSNlbmRpZiAvKiBXSU4zMiAqLwotCQkqZWJ1ZiA9ICdcMCc7Ci0JCXBkID0gcGNhcF9vcGVuX2xpdmUoZGV2aWNlLCBzbmFwbGVuLCAhcGZsYWcsIDEwMDAsIGVidWYpOwotCQlpZiAocGQgPT0gTlVMTCkKLQkJCWVycm9yKCIlcyIsIGVidWYpOwotCQllbHNlIGlmICgqZWJ1ZikKLQkJCXdhcm5pbmcoIiVzIiwgZWJ1Zik7Ci0JCS8qCi0JCSAqIExldCB1c2VyIG93biBwcm9jZXNzIGFmdGVyIHNvY2tldCBoYXMgYmVlbiBvcGVuZWQuCi0JCSAqLwotI2lmbmRlZiBXSU4zMgotCQlpZiAoc2V0Z2lkKGdldGdpZCgpKSAhPSAwIHx8IHNldHVpZChnZXR1aWQoKSkgIT0gMCkKLQkJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogc2V0Z2lkL3NldHVpZCBmYWlsZWQgIVxuIik7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLSNpZmRlZiBXSU4zMgotCQlpZihVc2VyQnVmZmVyU2l6ZSAhPSAxMDAwMDAwKQotCQkJaWYocGNhcF9zZXRidWZmKHBkLCBVc2VyQnVmZmVyU2l6ZSk9PS0xKXsKLQkJCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOwotCQkJfQotI2VuZGlmIC8qIFdJTjMyICovCi0JCWlmIChMZmxhZykKLQkJCXNob3dfZGx0c19hbmRfZXhpdChwZCk7Ci0JCWlmIChnbmRvLT5uZG9fZGx0ID49IDApIHsKLSNpZmRlZiBIQVZFX1BDQVBfU0VUX0RBVEFMSU5LCi0JCQlpZiAocGNhcF9zZXRfZGF0YWxpbmsocGQsIGduZG8tPm5kb19kbHQpIDwgMCkKLQkJCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOwotI2Vsc2UKLQkJCS8qCi0JCQkgKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IGNoYW5naW5nIHRoZQotCQkJICogZGF0YSBsaW5rIHR5cGUsIHNvIHdlIG9ubHkgbGV0IHRoZW0KLQkJCSAqIHNldCBpdCB0byB3aGF0IGl0IGFscmVhZHkgaXMuCi0JCQkgKi8KLQkJCWlmIChnbmRvLT5uZG9fZGx0ICE9IHBjYXBfZGF0YWxpbmsocGQpKSB7Ci0JCQkJZXJyb3IoIiVzIGlzIG5vdCBvbmUgb2YgdGhlIERMVHMgc3VwcG9ydGVkIGJ5IHRoaXMgZGV2aWNlXG4iLAotCQkJCSAgICAgIGduZG8tPm5kb19kbHRuYW1lKTsKLQkJCX0KLSNlbmRpZgotCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogZGF0YSBsaW5rIHR5cGUgJXNcbiIsCi0JCQkgICAgICAgICAgICAgIHByb2dyYW1fbmFtZSwgZ25kby0+bmRvX2RsdG5hbWUpOwotCQkJKHZvaWQpZmZsdXNoKHN0ZGVycik7Ci0JCX0KLQkJaSA9IHBjYXBfc25hcHNob3QocGQpOwotCQlpZiAoc25hcGxlbiA8IGkpIHsKLQkJCXdhcm5pbmcoInNuYXBsZW4gcmFpc2VkIGZyb20gJWQgdG8gJWQiLCBzbmFwbGVuLCBpKTsKLQkJCXNuYXBsZW4gPSBpOwotCQl9Ci0JCWlmIChwY2FwX2xvb2t1cG5ldChkZXZpY2UsICZsb2NhbG5ldCwgJm5ldG1hc2ssIGVidWYpIDwgMCkgewotCQkJbG9jYWxuZXQgPSAwOwotCQkJbmV0bWFzayA9IDA7Ci0JCQl3YXJuaW5nKCIlcyIsIGVidWYpOwotCQl9Ci0JfQotCWlmIChpbmZpbGUpCi0JCWNtZGJ1ZiA9IHJlYWRfaW5maWxlKGluZmlsZSk7Ci0JZWxzZQotCQljbWRidWYgPSBjb3B5X2FyZ3YoJmFyZ3Zbb3B0aW5kXSk7Ci0KLQlpZiAocGNhcF9jb21waWxlKHBkLCAmZmNvZGUsIGNtZGJ1ZiwgT2ZsYWcsIG5ldG1hc2spIDwgMCkKLQkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKLQlpZiAoZGZsYWcpIHsKLQkJYnBmX2R1bXAoJmZjb2RlLCBkZmxhZyk7Ci0JCXBjYXBfY2xvc2UocGQpOwotCQlleGl0KDApOwotCX0KLQlpbml0X2FkZHJ0b25hbWUobG9jYWxuZXQsIG5ldG1hc2spOwotCi0jaWZuZGVmIFdJTjMyCQotCSh2b2lkKXNldHNpZ25hbChTSUdQSVBFLCBjbGVhbnVwKTsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCSh2b2lkKXNldHNpZ25hbChTSUdURVJNLCBjbGVhbnVwKTsKLQkodm9pZClzZXRzaWduYWwoU0lHSU5ULCBjbGVhbnVwKTsKLQkvKiBDb29wZXJhdGUgd2l0aCBub2h1cCgxKSAqLwotI2lmbmRlZiBXSU4zMgkKLQlpZiAoKG9sZGhhbmRsZXIgPSBzZXRzaWduYWwoU0lHSFVQLCBjbGVhbnVwKSkgIT0gU0lHX0RGTCkKLQkJKHZvaWQpc2V0c2lnbmFsKFNJR0hVUCwgb2xkaGFuZGxlcik7Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQotCWlmIChwY2FwX3NldGZpbHRlcihwZCwgJmZjb2RlKSA8IDApCi0JCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7Ci0JaWYgKFdGaWxlTmFtZSkgewotCQlwY2FwX2R1bXBlcl90ICpwOwotCi0JCVdGaWxlTmFtZUFsdCA9IChjaGFyICopbWFsbG9jKHN0cmxlbihXRmlsZU5hbWUpICsgTUFYX0NGTEFHX0NIQVJTICsgMSk7Ci0JCWlmIChXRmlsZU5hbWVBbHQgPT0gTlVMTCkKLQkJCWVycm9yKCJtYWxsb2Mgb2YgV0ZpbGVOYW1lQWx0Iik7Ci0JCU1ha2VGaWxlbmFtZShXRmlsZU5hbWVBbHQsIFdGaWxlTmFtZSwgMCwgV2ZsYWdDaGFycyk7Ci0JCXAgPSBwY2FwX2R1bXBfb3BlbihwZCwgV0ZpbGVOYW1lQWx0KTsKLQkJaWYgKHAgPT0gTlVMTCkKLQkJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7Ci0JCWlmIChDZmxhZyAhPSAwKSB7Ci0JCQljYWxsYmFjayA9IGR1bXBfcGFja2V0X2FuZF90cnVuYzsKLQkJCWR1bXBpbmZvLldGaWxlTmFtZSA9IFdGaWxlTmFtZTsKLQkJCWR1bXBpbmZvLnBkID0gcGQ7Ci0JCQlkdW1waW5mby5wID0gcDsKLQkJCXBjYXBfdXNlcmRhdGEgPSAodV9jaGFyICopJmR1bXBpbmZvOwotCQl9IGVsc2UgewotCQkJY2FsbGJhY2sgPSBkdW1wX3BhY2tldDsKLQkJCXBjYXBfdXNlcmRhdGEgPSAodV9jaGFyICopcDsKLQkJfQotCX0gZWxzZSB7Ci0JCXR5cGUgPSBwY2FwX2RhdGFsaW5rKHBkKTsKLQkJcHJpbnRpbmZvLnByaW50ZXIgPSBsb29rdXBfcHJpbnRlcih0eXBlKTsKLQkJaWYgKHByaW50aW5mby5wcmludGVyID09IE5VTEwpIHsKLQkJCWduZG8tPm5kb19kbHRuYW1lID0gcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZSh0eXBlKTsKLQkJCWlmIChnbmRvLT5uZG9fZGx0bmFtZSAhPSBOVUxMKQotCQkJCWVycm9yKCJ1bnN1cHBvcnRlZCBkYXRhIGxpbmsgdHlwZSAlcyIsCi0JCQkJICAgICAgZ25kby0+bmRvX2RsdG5hbWUpOwotCQkJZWxzZQotCQkJCWVycm9yKCJ1bnN1cHBvcnRlZCBkYXRhIGxpbmsgdHlwZSAlZCIsIHR5cGUpOwotCQl9Ci0JCWNhbGxiYWNrID0gcHJpbnRfcGFja2V0OwotCQlwY2FwX3VzZXJkYXRhID0gKHVfY2hhciAqKSZwcmludGluZm87Ci0JfQotI2lmbmRlZiBXSU4zMgotCS8qCi0JICogV2UgY2Fubm90IGRvIHRoaXMgZWFybGllciwgYmVjYXVzZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gb3BlbgotCSAqIHRoZSBmaWxlIChpZiBkb25lKSBmb3Igd3JpdGluZyBiZWZvcmUgZ2l2aW5nIHVwIHBlcm1pc3Npb25zLgotCSAqLwotCWlmIChnZXR1aWQoKSA9PSAwIHx8IGdldGV1aWQoKSA9PSAwKSB7Ci0JCWlmICh1c2VybmFtZSB8fCBjaHJvb3RfZGlyKQotCQkJZHJvcHJvb3QodXNlcm5hbWUsIGNocm9vdF9kaXIpOwotCX0KLSNlbmRpZiAvKiBXSU4zMiAqLwotI2lmZGVmIFNJR0lORk8KLQkodm9pZClzZXRzaWduYWwoU0lHSU5GTywgcmVxdWVzdGluZm8pOwotI2VuZGlmCi0KLQlpZiAodmZsYWcgPiAwICYmIFdGaWxlTmFtZSkgewotCQkvKgotCQkgKiBXaGVuIGNhcHR1cmluZyB0byBhIGZpbGUsICItdiIgbWVhbnMgdGNwZHVtcCBzaG91bGQsCi0JCSAqIGV2ZXJ5IDEwIHNlY29kbnMsICJ2ImVyYm9zZWx5IHJlcG9ydCB0aGUgbnVtYmVyIG9mCi0JCSAqIHBhY2tldHMgY2FwdHVyZWQuCi0JCSAqLwotI2lmZGVmIFVTRV9XSU4zMl9NTV9USU1FUgotCQkvKiBjYWxsIHZlcmJvc2Vfc3RhdHNfZHVtcCgpIGVhY2ggMTAwMCArLy0xMDBtc2VjICovCi0JCXRpbWVyX2lkID0gdGltZVNldEV2ZW50KDEwMDAsIDEwMCwgdmVyYm9zZV9zdGF0c19kdW1wLCAwLCBUSU1FX1BFUklPRElDKTsKLQkJc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfQUxBUk0pCi0JCSh2b2lkKXNldHNpZ25hbChTSUdBTFJNLCB2ZXJib3NlX3N0YXRzX2R1bXApOwotCQlhbGFybSgxKTsKLSNlbmRpZgotCX0KLQotI2lmbmRlZiBXSU4zMgotCWlmIChSRmlsZU5hbWUgPT0gTlVMTCkgewotCQlpbnQgZGx0OwotCQljb25zdCBjaGFyICpkbHRfbmFtZTsKLQotCQlpZiAoIXZmbGFnICYmICFXRmlsZU5hbWUpIHsKLQkJCSh2b2lkKWZwcmludGYoc3RkZXJyLAotCQkJICAgICIlczogdmVyYm9zZSBvdXRwdXQgc3VwcHJlc3NlZCwgdXNlIC12IG9yIC12diBmb3IgZnVsbCBwcm90b2NvbCBkZWNvZGVcbiIsCi0JCQkgICAgcHJvZ3JhbV9uYW1lKTsKLQkJfSBlbHNlCi0JCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCQlkbHQgPSBwY2FwX2RhdGFsaW5rKHBkKTsKLQkJZGx0X25hbWUgPSBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKGRsdCk7Ci0JCWlmIChkbHRfbmFtZSA9PSBOVUxMKSB7Ci0JCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgImxpc3RlbmluZyBvbiAlcywgbGluay10eXBlICV1LCBjYXB0dXJlIHNpemUgJXUgYnl0ZXNcbiIsCi0JCQkgICAgZGV2aWNlLCBkbHQsIHNuYXBsZW4pOwotCQl9IGVsc2UgewotCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsICJsaXN0ZW5pbmcgb24gJXMsIGxpbmstdHlwZSAlcyAoJXMpLCBjYXB0dXJlIHNpemUgJXUgYnl0ZXNcbiIsCi0JCQkgICAgZGV2aWNlLCBkbHRfbmFtZSwKLQkJCSAgICBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihkbHQpLCBzbmFwbGVuKTsKLQkJfQotCQkodm9pZClmZmx1c2goc3RkZXJyKTsKLQl9Ci0jZW5kaWYgLyogV0lOMzIgKi8KLQlzdGF0dXMgPSBwY2FwX2xvb3AocGQsIGNudCwgY2FsbGJhY2ssIHBjYXBfdXNlcmRhdGEpOwotCWlmIChXRmlsZU5hbWUgPT0gTlVMTCkgewotCQkvKgotCQkgKiBXZSdyZSBwcmludGluZyBwYWNrZXRzLiAgRmx1c2ggdGhlIHByaW50ZWQgb3V0cHV0LAotCQkgKiBzbyBpdCBkb2Vzbid0IGdldCBpbnRlcm1pbmdsZWQgd2l0aCBlcnJvciBvdXRwdXQuCi0JCSAqLwotCQlpZiAoc3RhdHVzID09IC0yKSB7Ci0JCQkvKgotCQkJICogV2UgZ290IGludGVycnVwdGVkLCBzbyBwZXJoYXBzIHdlIGRpZG4ndAotCQkJICogbWFuYWdlIHRvIGZpbmlzaCBhIGxpbmUgd2Ugd2VyZSBwcmludGluZy4KLQkJCSAqIFByaW50IGFuIGV4dHJhIG5ld2xpbmUsIGp1c3QgaW4gY2FzZS4KLQkJCSAqLwotCQkJcHV0Y2hhcignXG4nKTsKLQkJfQotCQkodm9pZClmZmx1c2goc3Rkb3V0KTsKLQl9Ci0JaWYgKHN0YXR1cyA9PSAtMSkgewotCQkvKgotCQkgKiBFcnJvci4gIFJlcG9ydCBpdC4KLQkJICovCi0JCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IHBjYXBfbG9vcDogJXNcbiIsCi0JCSAgICBwcm9ncmFtX25hbWUsIHBjYXBfZ2V0ZXJyKHBkKSk7Ci0JfQotCWlmIChSRmlsZU5hbWUgPT0gTlVMTCkgewotCQkvKgotCQkgKiBXZSdyZSBkb2luZyBhIGxpdmUgY2FwdHVyZS4gIFJlcG9ydCB0aGUgY2FwdHVyZQotCQkgKiBzdGF0aXN0aWNzLgotCQkgKi8KLQkJaW5mbygxKTsKLQl9Ci0JcGNhcF9jbG9zZShwZCk7Ci0JZXhpdChzdGF0dXMgPT0gLTEgPyAxIDogMCk7Ci19Ci0KLS8qIG1ha2UgYSBjbGVhbiBleGl0IG9uIGludGVycnVwdHMgKi8KLXN0YXRpYyBSRVRTSUdUWVBFCi1jbGVhbnVwKGludCBzaWdubyBfVV8pCi17Ci0jaWZkZWYgVVNFX1dJTjMyX01NX1RJTUVSCi0JaWYgKHRpbWVyX2lkKQotCQl0aW1lS2lsbEV2ZW50KHRpbWVyX2lkKTsKLQl0aW1lcl9pZCA9IDA7Ci0jZWxpZiBkZWZpbmVkKEhBVkVfQUxBUk0pCi0JYWxhcm0oMCk7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfUENBUF9CUkVBS0xPT1AKLQkvKgotCSAqIFdlIGhhdmUgInBjYXBfYnJlYWtsb29wKCkiOyB1c2UgaXQsIHNvIHRoYXQgd2UgZG8gYXMgbGl0dGxlCi0JICogYXMgcG9zc2libGUgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIChpdCdzIHByb2JhYmx5IG5vdCBzYWZlCi0JICogdG8gZG8gYW55dGhpbmcgd2l0aCBzdGFuZGFyZCBJL08gc3RyZWFtcyBpbiBhIHNpZ25hbCBoYW5kbGVyIC0KLQkgKiB0aGUgQU5TSSBDIHN0YW5kYXJkIGRvZXNuJ3Qgc2F5IGl0IGlzKS4KLQkgKi8KLQlwY2FwX2JyZWFrbG9vcChwZCk7Ci0jZWxzZQotCS8qCi0JICogV2UgZG9uJ3QgaGF2ZSAicGNhcF9icmVha2xvb3AoKSI7IHRoaXMgaXNuJ3Qgc2FmZSwgYnV0Ci0JICogaXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8uICBQcmludCB0aGUgc3VtbWFyeSBpZiB3ZSdyZQotCSAqIG5vdCByZWFkaW5nIGZyb20gYSBzYXZlZmlsZSAtIGkuZS4sIGlmIHdlJ3JlIGRvaW5nIGEKLQkgKiBsaXZlIGNhcHR1cmUgLSBhbmQgZXhpdC4KLQkgKi8KLQlpZiAocGQgIT0gTlVMTCAmJiBwY2FwX2ZpbGUocGQpID09IE5VTEwpIHsKLQkJLyoKLQkJICogV2UgZ290IGludGVycnVwdGVkLCBzbyBwZXJoYXBzIHdlIGRpZG4ndAotCQkgKiBtYW5hZ2UgdG8gZmluaXNoIGEgbGluZSB3ZSB3ZXJlIHByaW50aW5nLgotCQkgKiBQcmludCBhbiBleHRyYSBuZXdsaW5lLCBqdXN0IGluIGNhc2UuCi0JCSAqLwotCQlwdXRjaGFyKCdcbicpOwotCQkodm9pZClmZmx1c2goc3Rkb3V0KTsKLQkJaW5mbygxKTsKLQl9Ci0JZXhpdCgwKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotaW5mbyhyZWdpc3RlciBpbnQgdmVyYm9zZSkKLXsKLQlzdHJ1Y3QgcGNhcF9zdGF0IHN0YXQ7Ci0KLQlpZiAocGNhcF9zdGF0cyhwZCwgJnN0YXQpIDwgMCkgewotCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgInBjYXBfc3RhdHM6ICVzXG4iLCBwY2FwX2dldGVycihwZCkpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCF2ZXJib3NlKQotCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCi0JKHZvaWQpZnByaW50ZihzdGRlcnIsICIldSBwYWNrZXRzIGNhcHR1cmVkIiwgcGFja2V0c19jYXB0dXJlZCk7Ci0JaWYgKCF2ZXJib3NlKQotCQlmcHV0cygiLCAiLCBzdGRlcnIpOwotCWVsc2UKLQkJcHV0YygnXG4nLCBzdGRlcnIpOwotCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJWQgcGFja2V0cyByZWNlaXZlZCBieSBmaWx0ZXIiLCBzdGF0LnBzX3JlY3YpOwotCWlmICghdmVyYm9zZSkKLQkJZnB1dHMoIiwgIiwgc3RkZXJyKTsKLQllbHNlCi0JCXB1dGMoJ1xuJywgc3RkZXJyKTsKLQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVkIHBhY2tldHMgZHJvcHBlZCBieSBrZXJuZWxcbiIsIHN0YXQucHNfZHJvcCk7Ci0JaW5mb3ByaW50ID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfcGFja2V0X2FuZF90cnVuYyh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpzcCkKLXsKLQlzdHJ1Y3QgZHVtcF9pbmZvICpkdW1wX2luZm87Ci0JY2hhciAqbmFtZTsKLQotCSsrcGFja2V0c19jYXB0dXJlZDsKLQotCSsraW5mb2RlbGF5OwotCi0JZHVtcF9pbmZvID0gKHN0cnVjdCBkdW1wX2luZm8gKil1c2VyOwotCi0JLyoKLQkgKiBYWFggLSB0aGlzIHdvbid0IHByZXZlbnQgY2FwdHVyZSBmaWxlcyBmcm9tIGdldHRpbmcKLQkgKiBsYXJnZXIgdGhhbiBDZmxhZyAtIHRoZSBsYXN0IHBhY2tldCB3cml0dGVuIHRvIHRoZQotCSAqIGZpbGUgY291bGQgcHV0IGl0IG92ZXIgQ2ZsYWcuCi0JICovCi0JaWYgKHBjYXBfZHVtcF9mdGVsbChkdW1wX2luZm8tPnApID4gQ2ZsYWcpIHsKLQkJLyoKLQkJICogQ2xvc2UgdGhlIGN1cnJlbnQgZmlsZSBhbmQgb3BlbiBhIG5ldyBvbmUuCi0JCSAqLwotCQlwY2FwX2R1bXBfY2xvc2UoZHVtcF9pbmZvLT5wKTsKLQkJQ2ZsYWdfY291bnQrKzsKLQkJaWYgKFdmbGFnID4gMCkgewotCQkJaWYgKENmbGFnX2NvdW50ID49IFdmbGFnKQotCQkJCUNmbGFnX2NvdW50ID0gMDsKLQkJfSBlbHNlIHsKLQkJCWlmIChDZmxhZ19jb3VudCA+PSBNQVhfQ0ZMQUcpCi0JCQkJZXJyb3IoInRvbyBtYW55IG91dHB1dCBmaWxlcyIpOwotCQl9Ci0JCW5hbWUgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZHVtcF9pbmZvLT5XRmlsZU5hbWUpICsgTUFYX0NGTEFHX0NIQVJTICsgMSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQllcnJvcigiZHVtcF9wYWNrZXRfYW5kX3RydW5jOiBtYWxsb2MiKTsKLQkJTWFrZUZpbGVuYW1lKG5hbWUsIGR1bXBfaW5mby0+V0ZpbGVOYW1lLCBDZmxhZ19jb3VudCwgV2ZsYWdDaGFycyk7Ci0JCWR1bXBfaW5mby0+cCA9IHBjYXBfZHVtcF9vcGVuKGR1bXBfaW5mby0+cGQsIG5hbWUpOwotCQlmcmVlKG5hbWUpOwotCQlpZiAoZHVtcF9pbmZvLT5wID09IE5VTEwpCi0JCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOwotCX0KLQotCXBjYXBfZHVtcCgodV9jaGFyICopZHVtcF9pbmZvLT5wLCBoLCBzcCk7Ci0jaWZkZWYgSEFWRV9QQ0FQX0RVTVBfRkxVU0gKLQlpZiAoVWZsYWcpCi0JCXBjYXBfZHVtcF9mbHVzaChkdW1wX2luZm8tPnApOwotI2VuZGlmCi0KLQktLWluZm9kZWxheTsKLQlpZiAoaW5mb3ByaW50KQotCQlpbmZvKDApOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9wYWNrZXQodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqc3ApCi17Ci0JKytwYWNrZXRzX2NhcHR1cmVkOwotCi0JKytpbmZvZGVsYXk7Ci0KLQlwY2FwX2R1bXAodXNlciwgaCwgc3ApOwotI2lmZGVmIEhBVkVfUENBUF9EVU1QX0ZMVVNICi0JaWYgKFVmbGFnKQotCQlwY2FwX2R1bXBfZmx1c2goKHBjYXBfZHVtcGVyX3QgKil1c2VyKTsKLSNlbmRpZgotCi0JLS1pbmZvZGVsYXk7Ci0JaWYgKGluZm9wcmludCkKLQkJaW5mbygwKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3BhY2tldCh1X2NoYXIgKnVzZXIsIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaCwgY29uc3QgdV9jaGFyICpzcCkKLXsKLQlzdHJ1Y3QgcHJpbnRfaW5mbyAqcHJpbnRfaW5mbzsKLQl1X2ludCBoZHJsZW47Ci0KLQkrK3BhY2tldHNfY2FwdHVyZWQ7Ci0KLQkrK2luZm9kZWxheTsKLQl0c19wcmludCgmaC0+dHMpOwotCi0JcHJpbnRfaW5mbyA9IChzdHJ1Y3QgcHJpbnRfaW5mbyAqKXVzZXI7Ci0KLQkvKgotCSAqIFNvbWUgcHJpbnRlcnMgd2FudCB0byBjaGVjayB0aGF0IHRoZXkncmUgbm90IHdhbGtpbmcgb2ZmIHRoZQotCSAqIGVuZCBvZiB0aGUgcGFja2V0LgotCSAqIFJhdGhlciB0aGFuIHBhc3MgaXQgYWxsIHRoZSB3YXkgZG93biwgd2Ugc2V0IHRoaXMgZ2xvYmFsLgotCSAqLwotCXNuYXBlbmQgPSBzcCArIGgtPmNhcGxlbjsKLQotCWhkcmxlbiA9ICgqcHJpbnRfaW5mby0+cHJpbnRlcikoaCwgc3ApOwotCWlmIChYZmxhZykgewotCQkvKgotCQkgKiBQcmludCB0aGUgcmF3IHBhY2tldCBkYXRhIGluIGhleCBhbmQgQVNDSUkuCi0JCSAqLwotCQlpZiAoWGZsYWcgPiAxKSB7Ci0JCQkvKgotCQkJICogSW5jbHVkZSB0aGUgbGluay1sYXllciBoZWFkZXIuCi0JCQkgKi8KLQkJCWhleF9hbmRfYXNjaWlfcHJpbnQoIlxuXHQiLCBzcCwgaC0+Y2FwbGVuKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBEb24ndCBpbmNsdWRlIHRoZSBsaW5rLWxheWVyIGhlYWRlciAtIGFuZCBpZgotCQkJICogd2UgaGF2ZSBub3RoaW5nIHBhc3QgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLAotCQkJICogcHJpbnQgbm90aGluZy4KLQkJCSAqLwotCQkJaWYgKGgtPmNhcGxlbiA+IGhkcmxlbikKLQkJCQloZXhfYW5kX2FzY2lpX3ByaW50KCJcblx0Iiwgc3AgKyBoZHJsZW4sCi0JCQkJICAgIGgtPmNhcGxlbiAtIGhkcmxlbik7Ci0JCX0KLQl9IGVsc2UgaWYgKHhmbGFnKSB7Ci0JCS8qCi0JCSAqIFByaW50IHRoZSByYXcgcGFja2V0IGRhdGEgaW4gaGV4LgotCQkgKi8KLQkJaWYgKHhmbGFnID4gMSkgewotCQkJLyoKLQkJCSAqIEluY2x1ZGUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgotCQkJICovCi0JCQloZXhfcHJpbnQoIlxuXHQiLCBzcCwgaC0+Y2FwbGVuKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBEb24ndCBpbmNsdWRlIHRoZSBsaW5rLWxheWVyIGhlYWRlciAtIGFuZCBpZgotCQkJICogd2UgaGF2ZSBub3RoaW5nIHBhc3QgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLAotCQkJICogcHJpbnQgbm90aGluZy4KLQkJCSAqLwotCQkJaWYgKGgtPmNhcGxlbiA+IGhkcmxlbikKLQkJCQloZXhfcHJpbnQoIlxuXHQiLCBzcCArIGhkcmxlbiwKLQkJCQkgICAgaC0+Y2FwbGVuIC0gaGRybGVuKTsKLQkJfQotCX0gZWxzZSBpZiAoQWZsYWcpIHsKLQkJLyoKLQkJICogUHJpbnQgdGhlIHJhdyBwYWNrZXQgZGF0YSBpbiBBU0NJSS4KLQkJICovCi0JCWlmIChBZmxhZyA+IDEpIHsKLQkJCS8qCi0JCQkgKiBJbmNsdWRlIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KLQkJCSAqLwotCQkJYXNjaWlfcHJpbnQoc3AsIGgtPmNhcGxlbik7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogRG9uJ3QgaW5jbHVkZSB0aGUgbGluay1sYXllciBoZWFkZXIgLSBhbmQgaWYKLQkJCSAqIHdlIGhhdmUgbm90aGluZyBwYXN0IHRoZSBsaW5rLWxheWVyIGhlYWRlciwKLQkJCSAqIHByaW50IG5vdGhpbmcuCi0JCQkgKi8KLQkJCWlmIChoLT5jYXBsZW4gPiBoZHJsZW4pCi0JCQkJYXNjaWlfcHJpbnQoc3AgKyBoZHJsZW4sIGgtPmNhcGxlbiAtIGhkcmxlbik7Ci0JCX0KLQl9Ci0KLQlwdXRjaGFyKCdcbicpOwotCi0JLS1pbmZvZGVsYXk7Ci0JaWYgKGluZm9wcmludCkKLQkJaW5mbygwKTsKLX0KLQotI2lmZGVmIFdJTjMyCi0JLyoKLQkgKiBYWFggLSB0aGVyZSBzaG91bGQgcmVhbGx5IGJlIGxpYnBjYXAgY2FsbHMgdG8gZ2V0IHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIGFzIGEgc3RyaW5nICh0aGUgc3RyaW5nIHdvdWxkIGJlIGdlbmVyYXRlZCBmcm9tICNkZWZpbmVzCi0JICogYXQgcnVuIHRpbWUsIHNvIHRoYXQgaXQncyBub3QgZ2VuZXJhdGVkIGZyb20gc3RyaW5nIGNvbnN0YW50cwotCSAqIGluIHRoZSBsaWJyYXJ5LCBhcywgb24gbWFueSBVTklYIHN5c3RlbXMsIHRob3NlIGNvbnN0YW50cyB3b3VsZAotCSAqIGJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGFwcGxpY2F0aW9uIGV4ZWN1dGFibGUgaW1hZ2UsIGFuZAotCSAqIHdvdWxkIHRodXMgcmVmbGVjdCB0aGUgdmVyc2lvbiBvZiBsaWJwY2FwIG9uIHRoZSBzeXN0ZW0gb24KLQkgKiB3aGljaCB0aGUgYXBwbGljYXRpb24gd2FzICpsaW5rZWQqLCBub3QgdGhlIHN5c3RlbSBvbiB3aGljaCBpdCdzCi0JICogKnJ1bm5pbmcqLgotCSAqCi0JICogVGhhdCByb3V0aW5lIHNob3VsZCBiZSBkb2N1bWVudGVkLCB1bmxpa2UgdGhlICJ2ZXJzaW9uW10iCi0JICogc3RyaW5nLCBzbyB0aGF0IFVOSVggdmVuZG9ycyBwcm92aWRpbmcgdGhlaXIgb3duIGxpYnBjYXBzCi0JICogZG9uJ3Qgb21pdCBpdCAoYXMgYSBjb3VwbGUgb2YgdmVuZG9ycyBoYXZlLi4uKS4KLQkgKgotCSAqIFBhY2tldC5kbGwgc2hvdWxkIHBlcmhhcHMgYWxzbyBleHBvcnQgYSByb3V0aW5lIHRvIHJldHVybiB0aGUKLQkgKiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgUGFja2V0LmRsbCBjb2RlLCB0byBzdXBwbHkgdGhlCi0JICogIldwY2FwX3ZlcnNpb24iIGluZm9ybWF0aW9uIG9uIFdpbmRvd3MuCi0JICovCi0JY2hhciBXRHZlcnNpb25bXT0iY3VycmVudC1jdnMudGNwZHVtcC5vcmciOwotI2lmICFkZWZpbmVkKEhBVkVfR0VORVJBVEVEX1ZFUlNJT04pCi0JY2hhciB2ZXJzaW9uW109ImN1cnJlbnQtY3ZzLnRjcGR1bXAub3JnIjsKLSNlbmRpZgotCWNoYXIgcGNhcF92ZXJzaW9uW109ImN1cnJlbnQtY3ZzLnRjcGR1bXAub3JnIjsKLQljaGFyIFdwY2FwX3ZlcnNpb25bXT0iMy4xIjsKLSNlbmRpZgotCi0vKgotICogQnkgZGVmYXVsdCwgcHJpbnQgdGhlIHNwZWNpZmllZCBkYXRhIG91dCBpbiBoZXggYW5kIEFTQ0lJLgotICovCi1zdGF0aWMgdm9pZAotbmRvX2RlZmF1bHRfcHJpbnQobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8gX1VfLCBjb25zdCB1X2NoYXIgKmJwLCB1X2ludCBsZW5ndGgpCi17Ci0JaGV4X2FuZF9hc2NpaV9wcmludCgiXG5cdCIsIGJwLCBsZW5ndGgpOyAvKiBwYXNzIG9uIGxmIGFuZCBpZGVudGF0aW9uIHN0cmluZyAqLwotfQotCi12b2lkCi1kZWZhdWx0X3ByaW50KGNvbnN0IHVfY2hhciAqYnAsIHVfaW50IGxlbmd0aCkKLXsKLQluZG9fZGVmYXVsdF9wcmludChnbmRvLCBicCwgbGVuZ3RoKTsKLX0KLQotI2lmZGVmIFNJR0lORk8KLVJFVFNJR1RZUEUgcmVxdWVzdGluZm8oaW50IHNpZ25vIF9VXykKLXsKLQlpZiAoaW5mb2RlbGF5KQotCQkrK2luZm9wcmludDsKLQllbHNlCi0JCWluZm8oMCk7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIENhbGxlZCBvbmNlIGVhY2ggc2Vjb25kIGluIHZlcmJvc2UgbW9kZSB3aGlsZSBkdW1waW5nIHRvIGZpbGUKLSAqLwotI2lmZGVmIFVTRV9XSU4zMl9NTV9USU1FUgotdm9pZCBDQUxMQkFDSyB2ZXJib3NlX3N0YXRzX2R1bXAgKFVJTlQgdGltZXJfaWQgX1VfLCBVSU5UIG1zZyBfVV8sIERXT1JEX1BUUiBhcmcgX1VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEX1BUUiBkdzEgX1VfLCBEV09SRF9QVFIgZHcyIF9VXykKLXsKLQlzdHJ1Y3QgcGNhcF9zdGF0IHN0YXQ7Ci0KLQlpZiAoaW5mb2RlbGF5ID09IDAgJiYgcGNhcF9zdGF0cyhwZCwgJnN0YXQpID49IDApCi0JCWZwcmludGYoc3RkZXJyLCAiR290ICV1XHIiLCBwYWNrZXRzX2NhcHR1cmVkKTsKLX0KLSNlbGlmIGRlZmluZWQoSEFWRV9BTEFSTSkKLXN0YXRpYyB2b2lkIHZlcmJvc2Vfc3RhdHNfZHVtcChpbnQgc2lnIF9VXykKLXsKLQlzdHJ1Y3QgcGNhcF9zdGF0IHN0YXQ7Ci0KLQlpZiAoaW5mb2RlbGF5ID09IDAgJiYgcGNhcF9zdGF0cyhwZCwgJnN0YXQpID49IDApCi0JCWZwcmludGYoc3RkZXJyLCAiR290ICV1XHIiLCBwYWNrZXRzX2NhcHR1cmVkKTsKLQlhbGFybSgxKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotdXNhZ2Uodm9pZCkKLXsKLQlleHRlcm4gY2hhciB2ZXJzaW9uW107Ci0jaWZuZGVmIEhBVkVfUENBUF9MSUJfVkVSU0lPTgotI2lmIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoSEFWRV9QQ0FQX1ZFUlNJT04pCi0JZXh0ZXJuIGNoYXIgcGNhcF92ZXJzaW9uW107Ci0jZWxzZSAvKiBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKEhBVkVfUENBUF9WRVJTSU9OKSAqLwotCXN0YXRpYyBjaGFyIHBjYXBfdmVyc2lvbltdID0gInVua25vd24iOwotI2VuZGlmIC8qIGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoSEFWRV9QQ0FQX1ZFUlNJT04pICovCi0jZW5kaWYgLyogSEFWRV9QQ0FQX0xJQl9WRVJTSU9OICovCi0KLSNpZmRlZiBIQVZFX1BDQVBfTElCX1ZFUlNJT04KLSNpZmRlZiBXSU4zMgotCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMgdmVyc2lvbiAlcywgYmFzZWQgb24gdGNwZHVtcCB2ZXJzaW9uICVzXG4iLCBwcm9ncmFtX25hbWUsIFdEdmVyc2lvbiwgdmVyc2lvbik7Ci0jZWxzZSAvKiBXSU4zMiAqLwotCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMgdmVyc2lvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCB2ZXJzaW9uKTsKLSNlbmRpZiAvKiBXSU4zMiAqLwotCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXNcbiIscGNhcF9saWJfdmVyc2lvbigpKTsKLSNlbHNlIC8qIEhBVkVfUENBUF9MSUJfVkVSU0lPTiAqLwotI2lmZGVmIFdJTjMyCi0JKHZvaWQpZnByaW50ZihzdGRlcnIsICIlcyB2ZXJzaW9uICVzLCBiYXNlZCBvbiB0Y3BkdW1wIHZlcnNpb24gJXNcbiIsIHByb2dyYW1fbmFtZSwgV0R2ZXJzaW9uLCB2ZXJzaW9uKTsKLQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIldpblBjYXAgdmVyc2lvbiAlcywgYmFzZWQgb24gbGlicGNhcCB2ZXJzaW9uICVzXG4iLFdwY2FwX3ZlcnNpb24sIHBjYXBfdmVyc2lvbik7Ci0jZWxzZSAvKiBXSU4zMiAqLwotCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMgdmVyc2lvbiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCB2ZXJzaW9uKTsKLQkodm9pZClmcHJpbnRmKHN0ZGVyciwgImxpYnBjYXAgdmVyc2lvbiAlc1xuIiwgcGNhcF92ZXJzaW9uKTsKLSNlbmRpZiAvKiBXSU4zMiAqLwotI2VuZGlmIC8qIEhBVkVfUENBUF9MSUJfVkVSU0lPTiAqLwotCSh2b2lkKWZwcmludGYoc3RkZXJyLAotIlVzYWdlOiAlcyBbLWFBZCIgRF9GTEFHICJlZmxMbk5PcHFSU3R1IiBVX0ZMQUcgInZ4WF0iIEJfRkxBR19VU0FHRSAiIFstYyBjb3VudF0gWyAtQyBmaWxlX3NpemUgXVxuIiwgcHJvZ3JhbV9uYW1lKTsKLQkodm9pZClmcHJpbnRmKHN0ZGVyciwKLSJcdFx0WyAtRSBhbGdvOnNlY3JldCBdIFsgLUYgZmlsZSBdIFsgLWkgaW50ZXJmYWNlIF0gWyAtTSBzZWNyZXQgXVxuIik7Ci0JKHZvaWQpZnByaW50ZihzdGRlcnIsCi0iXHRcdFsgLXIgZmlsZSBdIFsgLXMgc25hcGxlbiBdIFsgLVQgdHlwZSBdIFsgLXcgZmlsZSBdXG4iKTsKLQkodm9pZClmcHJpbnRmKHN0ZGVyciwKLSJcdFx0WyAtVyBmaWxlY291bnQgXSBbIC15IGRhdGFsaW5rdHlwZSBdIFsgLVogdXNlciBdXG4iKTsKLQkodm9pZClmcHJpbnRmKHN0ZGVyciwKLSJcdFx0WyBleHByZXNzaW9uIF1cbiIpOwotCWV4aXQoMSk7Ci19Ci0KLQotCi0vKiBWQVJBUkdTICovCi1zdGF0aWMgdm9pZAotbmRvX2Vycm9yKG5ldGRpc3NlY3Rfb3B0aW9ucyAqbmRvIF9VXywgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQotCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7Ci0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JKHZvaWQpdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotCWlmICgqZm10KSB7Ci0JCWZtdCArPSBzdHJsZW4oZm10KTsKLQkJaWYgKGZtdFstMV0gIT0gJ1xuJykKLQkJCSh2b2lkKWZwdXRjKCdcbicsIHN0ZGVycik7Ci0JfQotCWV4aXQoMSk7Ci0JLyogTk9UUkVBQ0hFRCAqLwotfQotCi0vKiBWQVJBUkdTICovCi1zdGF0aWMgdm9pZAotbmRvX3dhcm5pbmcobmV0ZGlzc2VjdF9vcHRpb25zICpuZG8gX1VfLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCi0JKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogV0FSTklORzogIiwgcHJvZ3JhbV9uYW1lKTsKLQl2YV9zdGFydChhcCwgZm10KTsKLQkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JaWYgKCpmbXQpIHsKLQkJZm10ICs9IHN0cmxlbihmbXQpOwotCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQotCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZWxuZXQuaCBiL3RlbG5ldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTExMDQzLi4wMDAwMDAwCi0tLSBhL3RlbG5ldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvdGVsbmV0LmgsdiAxLjQgMjAwMi8wNi8xMSAxNzowOTowMSBpdG9qdW4gRXhwICQgKExCTCkgKi8KLQotLyoJJE5ldEJTRDogdGVsbmV0LmgsdiAxLjkgMjAwMS8wNi8xMSAwMTo1MDo1MCB3aXogRXhwICQJKi8KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKglAKCMpdGVsbmV0LmgJOC4yIChCZXJrZWxleSkgMTIvMTUvOTMKLSAqLwotCi0jaWZuZGVmIF9BUlBBX1RFTE5FVF9IXwotI2RlZmluZQlfQVJQQV9URUxORVRfSF8KLQotLyoKLSAqIERlZmluaXRpb25zIGZvciB0aGUgVEVMTkVUIHByb3RvY29sLgotICovCi0jZGVmaW5lCUlBQwkyNTUJCS8qIGludGVycHJldCBhcyBjb21tYW5kOiAqLwotI2RlZmluZQlET05UCTI1NAkJLyogeW91IGFyZSBub3QgdG8gdXNlIG9wdGlvbiAqLwotI2RlZmluZQlETwkyNTMJCS8qIHBsZWFzZSwgeW91IHVzZSBvcHRpb24gKi8KLSNkZWZpbmUJV09OVAkyNTIJCS8qIEkgd29uJ3QgdXNlIG9wdGlvbiAqLwotI2RlZmluZQlXSUxMCTI1MQkJLyogSSB3aWxsIHVzZSBvcHRpb24gKi8KLSNkZWZpbmUJU0IJMjUwCQkvKiBpbnRlcnByZXQgYXMgc3VibmVnb3RpYXRpb24gKi8KLSNkZWZpbmUJR0EJMjQ5CQkvKiB5b3UgbWF5IHJldmVyc2UgdGhlIGxpbmUgKi8KLSNkZWZpbmUJRUwJMjQ4CQkvKiBlcmFzZSB0aGUgY3VycmVudCBsaW5lICovCi0jZGVmaW5lCUVDCTI0NwkJLyogZXJhc2UgdGhlIGN1cnJlbnQgY2hhcmFjdGVyICovCi0jZGVmaW5lCUFZVAkyNDYJCS8qIGFyZSB5b3UgdGhlcmUgKi8KLSNkZWZpbmUJQU8JMjQ1CQkvKiBhYm9ydCBvdXRwdXQtLWJ1dCBsZXQgcHJvZyBmaW5pc2ggKi8KLSNkZWZpbmUJSVAJMjQ0CQkvKiBpbnRlcnJ1cHQgcHJvY2Vzcy0tcGVybWFuZW50bHkgKi8KLSNkZWZpbmUJQlJFQUsJMjQzCQkvKiBicmVhayAqLwotI2RlZmluZQlETQkyNDIJCS8qIGRhdGEgbWFyay0tZm9yIGNvbm5lY3QuIGNsZWFuaW5nICovCi0jZGVmaW5lCU5PUAkyNDEJCS8qIG5vcCAqLwotI2RlZmluZQlTRQkyNDAJCS8qIGVuZCBzdWIgbmVnb3RpYXRpb24gKi8KLSNkZWZpbmUgRU9SICAgICAyMzkgICAgICAgICAgICAgLyogZW5kIG9mIHJlY29yZCAodHJhbnNwYXJlbnQgbW9kZSkgKi8KLSNkZWZpbmUJQUJPUlQJMjM4CQkvKiBBYm9ydCBwcm9jZXNzICovCi0jZGVmaW5lCVNVU1AJMjM3CQkvKiBTdXNwZW5kIHByb2Nlc3MgKi8KLSNkZWZpbmUJeEVPRgkyMzYJCS8qIEVuZCBvZiBmaWxlOiBFT0YgaXMgYWxyZWFkeSB1c2VkLi4uICovCi0KLSNkZWZpbmUgU1lOQ0gJMjQyCQkvKiBmb3IgdGVsZnVuYyBjYWxscyAqLwotCi0jaWZkZWYgVEVMQ01EUwotY29uc3QgY2hhciAqdGVsY21kc1tdID0gewotCSJFT0YiLCAiU1VTUCIsICJBQk9SVCIsICJFT1IiLAotCSJTRSIsICJOT1AiLCAiRE1BUksiLCAiQlJLIiwgIklQIiwgIkFPIiwgIkFZVCIsICJFQyIsCi0JIkVMIiwgIkdBIiwgIlNCIiwgIldJTEwiLCAiV09OVCIsICJETyIsICJET05UIiwgIklBQyIsIDAsCi19OwotI2Vsc2UKLWV4dGVybiBjaGFyICp0ZWxjbWRzW107Ci0jZW5kaWYKLQotI2RlZmluZQlURUxDTURfRklSU1QJeEVPRgotI2RlZmluZQlURUxDTURfTEFTVAlJQUMKLSNkZWZpbmUJVEVMQ01EX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8PSBURUxDTURfTEFTVCAmJiBcCi0JCQkgKHVuc2lnbmVkIGludCkoeCkgPj0gVEVMQ01EX0ZJUlNUKQotI2RlZmluZQlURUxDTUQoeCkJdGVsY21kc1soeCktVEVMQ01EX0ZJUlNUXQotCi0vKiB0ZWxuZXQgb3B0aW9ucyAqLwotI2RlZmluZSBURUxPUFRfQklOQVJZCTAJLyogOC1iaXQgZGF0YSBwYXRoICovCi0jZGVmaW5lIFRFTE9QVF9FQ0hPCTEJLyogZWNobyAqLwotI2RlZmluZQlURUxPUFRfUkNQCTIJLyogcHJlcGFyZSB0byByZWNvbm5lY3QgKi8KLSNkZWZpbmUJVEVMT1BUX1NHQQkzCS8qIHN1cHByZXNzIGdvIGFoZWFkICovCi0jZGVmaW5lCVRFTE9QVF9OQU1TCTQJLyogYXBwcm94aW1hdGUgbWVzc2FnZSBzaXplICovCi0jZGVmaW5lCVRFTE9QVF9TVEFUVVMJNQkvKiBnaXZlIHN0YXR1cyAqLwotI2RlZmluZQlURUxPUFRfVE0JNgkvKiB0aW1pbmcgbWFyayAqLwotI2RlZmluZQlURUxPUFRfUkNURQk3CS8qIHJlbW90ZSBjb250cm9sbGVkIHRyYW5zbWlzc2lvbiBhbmQgZWNobyAqLwotI2RlZmluZSBURUxPUFRfTkFPTCAJOAkvKiBuZWdvdGlhdGUgYWJvdXQgb3V0cHV0IGxpbmUgd2lkdGggKi8KLSNkZWZpbmUgVEVMT1BUX05BT1AgCTkJLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBwYWdlIHNpemUgKi8KLSNkZWZpbmUgVEVMT1BUX05BT0NSRAkxMAkvKiBuZWdvdGlhdGUgYWJvdXQgQ1IgZGlzcG9zaXRpb24gKi8KLSNkZWZpbmUgVEVMT1BUX05BT0hUUwkxMQkvKiBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWJzdG9wcyAqLwotI2RlZmluZSBURUxPUFRfTkFPSFRECTEyCS8qIG5lZ290aWF0ZSBhYm91dCBob3Jpem9udGFsIHRhYiBkaXNwb3NpdGlvbiAqLwotI2RlZmluZSBURUxPUFRfTkFPRkZECTEzCS8qIG5lZ290aWF0ZSBhYm91dCBmb3JtZmVlZCBkaXNwb3NpdGlvbiAqLwotI2RlZmluZSBURUxPUFRfTkFPVlRTCTE0CS8qIG5lZ290aWF0ZSBhYm91dCB2ZXJ0aWNhbCB0YWIgc3RvcHMgKi8KLSNkZWZpbmUgVEVMT1BUX05BT1ZURAkxNQkvKiBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIGRpc3Bvc2l0aW9uICovCi0jZGVmaW5lIFRFTE9QVF9OQU9MRkQJMTYJLyogbmVnb3RpYXRlIGFib3V0IG91dHB1dCBMRiBkaXNwb3NpdGlvbiAqLwotI2RlZmluZSBURUxPUFRfWEFTQ0lJCTE3CS8qIGV4dGVuZGVkIGFzY2ljIGNoYXJhY3RlciBzZXQgKi8KLSNkZWZpbmUJVEVMT1BUX0xPR09VVAkxOAkvKiBmb3JjZSBsb2dvdXQgKi8KLSNkZWZpbmUJVEVMT1BUX0JNCTE5CS8qIGJ5dGUgbWFjcm8gKi8KLSNkZWZpbmUJVEVMT1BUX0RFVAkyMAkvKiBkYXRhIGVudHJ5IHRlcm1pbmFsICovCi0jZGVmaW5lCVRFTE9QVF9TVVBEVVAJMjEJLyogc3VwZHVwIHByb3RvY29sICovCi0jZGVmaW5lCVRFTE9QVF9TVVBEVVBPVVRQVVQgMjIJLyogc3VwZHVwIG91dHB1dCAqLwotI2RlZmluZQlURUxPUFRfU05ETE9DCTIzCS8qIHNlbmQgbG9jYXRpb24gKi8KLSNkZWZpbmUJVEVMT1BUX1RUWVBFCTI0CS8qIHRlcm1pbmFsIHR5cGUgKi8KLSNkZWZpbmUJVEVMT1BUX0VPUgkyNQkvKiBlbmQgb3IgcmVjb3JkICovCi0jZGVmaW5lCVRFTE9QVF9UVUlECTI2CS8qIFRBQ0FDUyB1c2VyIGlkZW50aWZpY2F0aW9uICovCi0jZGVmaW5lCVRFTE9QVF9PVVRNUksJMjcJLyogb3V0cHV0IG1hcmtpbmcgKi8KLSNkZWZpbmUJVEVMT1BUX1RUWUxPQwkyOAkvKiB0ZXJtaW5hbCBsb2NhdGlvbiBudW1iZXIgKi8KLSNkZWZpbmUJVEVMT1BUXzMyNzBSRUdJTUUgMjkJLyogMzI3MCByZWdpbWUgKi8KLSNkZWZpbmUJVEVMT1BUX1gzUEFECTMwCS8qIFguMyBQQUQgKi8KLSNkZWZpbmUJVEVMT1BUX05BV1MJMzEJLyogd2luZG93IHNpemUgKi8KLSNkZWZpbmUJVEVMT1BUX1RTUEVFRAkzMgkvKiB0ZXJtaW5hbCBzcGVlZCAqLwotI2RlZmluZQlURUxPUFRfTEZMT1cJMzMJLyogcmVtb3RlIGZsb3cgY29udHJvbCAqLwotI2RlZmluZSBURUxPUFRfTElORU1PREUJMzQJLyogTGluZW1vZGUgb3B0aW9uICovCi0jZGVmaW5lIFRFTE9QVF9YRElTUExPQwkzNQkvKiBYIERpc3BsYXkgTG9jYXRpb24gKi8KLSNkZWZpbmUgVEVMT1BUX09MRF9FTlZJUk9OIDM2CS8qIE9sZCAtIEVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotI2RlZmluZQlURUxPUFRfQVVUSEVOVElDQVRJT04gMzcvKiBBdXRoZW50aWNhdGUgKi8KLSNkZWZpbmUJVEVMT1BUX0VOQ1JZUFQJMzgJLyogRW5jcnlwdGlvbiBvcHRpb24gKi8KLSNkZWZpbmUgVEVMT1BUX05FV19FTlZJUk9OIDM5CS8qIE5ldyAtIEVudmlyb25tZW50IHZhcmlhYmxlcyAqLwotI2RlZmluZQlURUxPUFRfRVhPUEwJMjU1CS8qIGV4dGVuZGVkLW9wdGlvbnMtbGlzdCAqLwotCi0KLSNkZWZpbmUJTlRFTE9QVFMJKDErVEVMT1BUX05FV19FTlZJUk9OKQotI2lmZGVmIFRFTE9QVFMKLWNvbnN0IGNoYXIgKnRlbG9wdHNbTlRFTE9QVFMrMV0gPSB7Ci0JIkJJTkFSWSIsICJFQ0hPIiwgIlJDUCIsICJTVVBQUkVTUyBHTyBBSEVBRCIsICJOQU1FIiwKLQkiU1RBVFVTIiwgIlRJTUlORyBNQVJLIiwgIlJDVEUiLCAiTkFPTCIsICJOQU9QIiwKLQkiTkFPQ1JEIiwgIk5BT0hUUyIsICJOQU9IVEQiLCAiTkFPRkZEIiwgIk5BT1ZUUyIsCi0JIk5BT1ZURCIsICJOQU9MRkQiLCAiRVhURU5EIEFTQ0lJIiwgIkxPR09VVCIsICJCWVRFIE1BQ1JPIiwKLQkiREFUQSBFTlRSWSBURVJNSU5BTCIsICJTVVBEVVAiLCAiU1VQRFVQIE9VVFBVVCIsCi0JIlNFTkQgTE9DQVRJT04iLCAiVEVSTUlOQUwgVFlQRSIsICJFTkQgT0YgUkVDT1JEIiwKLQkiVEFDQUNTIFVJRCIsICJPVVRQVVQgTUFSS0lORyIsICJUVFlMT0MiLAotCSIzMjcwIFJFR0lNRSIsICJYLjMgUEFEIiwgIk5BV1MiLCAiVFNQRUVEIiwgIkxGTE9XIiwKLQkiTElORU1PREUiLCAiWERJU1BMT0MiLCAiT0xELUVOVklST04iLCAiQVVUSEVOVElDQVRJT04iLAotCSJFTkNSWVBUIiwgIk5FVy1FTlZJUk9OIiwKLQkwLAotfTsKLSNkZWZpbmUJVEVMT1BUX0ZJUlNUCVRFTE9QVF9CSU5BUlkKLSNkZWZpbmUJVEVMT1BUX0xBU1QJVEVMT1BUX05FV19FTlZJUk9OCi0jZGVmaW5lCVRFTE9QVF9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPD0gVEVMT1BUX0xBU1QpCi0jZGVmaW5lCVRFTE9QVCh4KQl0ZWxvcHRzWyh4KS1URUxPUFRfRklSU1RdCi0jZW5kaWYKLQotLyogc3ViLW9wdGlvbiBxdWFsaWZpZXJzICovCi0jZGVmaW5lCVRFTFFVQUxfSVMJMAkvKiBvcHRpb24gaXMuLi4gKi8KLSNkZWZpbmUJVEVMUVVBTF9TRU5ECTEJLyogc2VuZCBvcHRpb24gKi8KLSNkZWZpbmUJVEVMUVVBTF9JTkZPCTIJLyogRU5WSVJPTjogaW5mb3JtYXRpb25hbCB2ZXJzaW9uIG9mIElTICovCi0jZGVmaW5lCVRFTFFVQUxfUkVQTFkJMgkvKiBBVVRIRU5USUNBVElPTjogY2xpZW50IHZlcnNpb24gb2YgSVMgKi8KLSNkZWZpbmUJVEVMUVVBTF9OQU1FCTMJLyogQVVUSEVOVElDQVRJT046IGNsaWVudCB2ZXJzaW9uIG9mIElTICovCi0KLSNkZWZpbmUJTEZMT1dfT0ZGCQkwCS8qIERpc2FibGUgcmVtb3RlIGZsb3cgY29udHJvbCAqLwotI2RlZmluZQlMRkxPV19PTgkJMQkvKiBFbmFibGUgcmVtb3RlIGZsb3cgY29udHJvbCAqLwotI2RlZmluZQlMRkxPV19SRVNUQVJUX0FOWQkyCS8qIFJlc3RhcnQgb3V0cHV0IG9uIGFueSBjaGFyICovCi0jZGVmaW5lCUxGTE9XX1JFU1RBUlRfWE9OCTMJLyogUmVzdGFydCBvdXRwdXQgb25seSBvbiBYT04gKi8KLQotLyoKLSAqIExJTkVNT0RFIHN1Ym9wdGlvbnMKLSAqLwotCi0jZGVmaW5lCUxNX01PREUJCTEKLSNkZWZpbmUJTE1fRk9SV0FSRE1BU0sJMgotI2RlZmluZQlMTV9TTEMJCTMKLQotI2RlZmluZQlNT0RFX0VESVQJMHgwMQotI2RlZmluZQlNT0RFX1RSQVBTSUcJMHgwMgotI2RlZmluZQlNT0RFX0FDSwkweDA0Ci0jZGVmaW5lIE1PREVfU09GVF9UQUIJMHgwOAotI2RlZmluZSBNT0RFX0xJVF9FQ0hPCTB4MTAKLQotI2RlZmluZQlNT0RFX01BU0sJMHgxZgotCi0vKiBOb3QgcGFydCBvZiBwcm90b2NvbCwgYnV0IG5lZWRlZCB0byBzaW1wbGlmeSB0aGluZ3MuLi4gKi8KLSNkZWZpbmUgTU9ERV9GTE9XCQkweDAxMDAKLSNkZWZpbmUgTU9ERV9FQ0hPCQkweDAyMDAKLSNkZWZpbmUgTU9ERV9JTkJJTgkJMHgwNDAwCi0jZGVmaW5lIE1PREVfT1VUQklOCQkweDA4MDAKLSNkZWZpbmUgTU9ERV9GT1JDRQkJMHgxMDAwCi0KLSNkZWZpbmUJU0xDX1NZTkNICTEKLSNkZWZpbmUJU0xDX0JSSwkJMgotI2RlZmluZQlTTENfSVAJCTMKLSNkZWZpbmUJU0xDX0FPCQk0Ci0jZGVmaW5lCVNMQ19BWVQJCTUKLSNkZWZpbmUJU0xDX0VPUgkJNgotI2RlZmluZQlTTENfQUJPUlQJNwotI2RlZmluZQlTTENfRU9GCQk4Ci0jZGVmaW5lCVNMQ19TVVNQCTkKLSNkZWZpbmUJU0xDX0VDCQkxMAotI2RlZmluZQlTTENfRUwJCTExCi0jZGVmaW5lCVNMQ19FVwkJMTIKLSNkZWZpbmUJU0xDX1JQCQkxMwotI2RlZmluZQlTTENfTE5FWFQJMTQKLSNkZWZpbmUJU0xDX1hPTgkJMTUKLSNkZWZpbmUJU0xDX1hPRkYJMTYKLSNkZWZpbmUJU0xDX0ZPUlcxCTE3Ci0jZGVmaW5lCVNMQ19GT1JXMgkxOAotI2RlZmluZQlTTENfTUNMICAgICAgICAgMTkKLSNkZWZpbmUJU0xDX01DUiAgICAgICAgIDIwCi0jZGVmaW5lCVNMQ19NQ1dMICAgICAgICAyMQotI2RlZmluZQlTTENfTUNXUiAgICAgICAgMjIKLSNkZWZpbmUJU0xDX01DQk9MICAgICAgIDIzCi0jZGVmaW5lCVNMQ19NQ0VPTCAgICAgICAyNAotI2RlZmluZQlTTENfSU5TUlQgICAgICAgMjUKLSNkZWZpbmUJU0xDX09WRVIgICAgICAgIDI2Ci0jZGVmaW5lCVNMQ19FQ1IgICAgICAgICAyNwotI2RlZmluZQlTTENfRVdSICAgICAgICAgMjgKLSNkZWZpbmUJU0xDX0VCT0wgICAgICAgIDI5Ci0jZGVmaW5lCVNMQ19FRU9MICAgICAgICAzMAotCi0jZGVmaW5lCU5TTEMJCTMwCi0KLS8qCi0gKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIGRlZmluZSBTTENfTkFNRVMgdG8gYmUgdGhlCi0gKiBsaXN0IG9mIG5hbWVzIGlmIFNMQ19OQU1FUyBpcyBub3QgZGVmaW5lZC4KLSAqLwotI2RlZmluZQlTTENfTkFNRUxJU1QJIjAiLCAiU1lOQ0giLCAiQlJLIiwgIklQIiwgIkFPIiwgIkFZVCIsICJFT1IiLAlcCi0JCQkiQUJPUlQiLCAiRU9GIiwgIlNVU1AiLCAiRUMiLCAiRUwiLCAiRVciLCAiUlAiLAlcCi0JCQkiTE5FWFQiLCAiWE9OIiwgIlhPRkYiLCAiRk9SVzEiLCAiRk9SVzIiLAlcCi0JCQkiTUNMIiwgIk1DUiIsICJNQ1dMIiwgIk1DV1IiLCAiTUNCT0wiLAkJXAotCQkJIk1DRU9MIiwgIklOU1JUIiwgIk9WRVIiLCAiRUNSIiwgIkVXUiIsCQlcCi0JCQkiRUJPTCIsICJFRU9MIiwJCQkJCVwKLQkJCTAsCi0KLSNpZmRlZglTTENfTkFNRVMKLWNvbnN0IGNoYXIgKnNsY19uYW1lc1tdID0gewotCVNMQ19OQU1FTElTVAotfTsKLSNlbHNlCi1leHRlcm4gY2hhciAqc2xjX25hbWVzW107Ci0jZGVmaW5lCVNMQ19OQU1FUyBTTENfTkFNRUxJU1QKLSNlbmRpZgotCi0jZGVmaW5lCVNMQ19OQU1FX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8PSBOU0xDKQotI2RlZmluZSBTTENfTkFNRSh4KQlzbGNfbmFtZXNbeF0KLQotI2RlZmluZQlTTENfTk9TVVBQT1JUCTAKLSNkZWZpbmUJU0xDX0NBTlRDSEFOR0UJMQotI2RlZmluZQlTTENfVkFSSUFCTEUJMgotI2RlZmluZQlTTENfREVGQVVMVAkzCi0jZGVmaW5lCVNMQ19MRVZFTEJJVFMJMHgwMwotCi0jZGVmaW5lCVNMQ19GVU5DCTAKLSNkZWZpbmUJU0xDX0ZMQUdTCTEKLSNkZWZpbmUJU0xDX1ZBTFVFCTIKLQotI2RlZmluZQlTTENfQUNLCQkweDgwCi0jZGVmaW5lCVNMQ19GTFVTSElOCTB4NDAKLSNkZWZpbmUJU0xDX0ZMVVNIT1VUCTB4MjAKLQotI2RlZmluZQlPTERfRU5WX1ZBUgkxCi0jZGVmaW5lCU9MRF9FTlZfVkFMVUUJMAotI2RlZmluZQlORVdfRU5WX1ZBUgkwCi0jZGVmaW5lCU5FV19FTlZfVkFMVUUJMQotI2RlZmluZQlFTlZfRVNDCQkyCi0jZGVmaW5lIEVOVl9VU0VSVkFSCTMKLQotLyoKLSAqIEFVVEhFTlRJQ0FUSU9OIHN1Ym9wdGlvbnMKLSAqLwotCi0vKgotICogV2hvIGlzIGF1dGhlbnRpY2F0aW5nIHdobyAuLi4KLSAqLwotI2RlZmluZQlBVVRIX1dIT19DTElFTlQJCTAJLyogQ2xpZW50IGF1dGhlbnRpY2F0aW5nIHNlcnZlciAqLwotI2RlZmluZQlBVVRIX1dIT19TRVJWRVIJCTEJLyogU2VydmVyIGF1dGhlbnRpY2F0aW5nIGNsaWVudCAqLwotI2RlZmluZQlBVVRIX1dIT19NQVNLCQkxCi0KLS8qCi0gKiBhbW91bnQgb2YgYXV0aGVudGljYXRpb24gZG9uZQotICovCi0jZGVmaW5lCUFVVEhfSE9XX09ORV9XQVkJMAotI2RlZmluZQlBVVRIX0hPV19NVVRVQUwJCTIKLSNkZWZpbmUJQVVUSF9IT1dfTUFTSwkJMgotCi0vKgotICogc2hvdWxkIHdlIGJlIGVuY3J5cHRpbmc/IChub3QgeWV0IGZvcm1hbGx5IHN0YW5kYXJkaXplZCkKLSAqLwotI2RlZmluZSBBVVRIX0VOQ1JZUFRfT0ZGCTAKLSNkZWZpbmUgQVVUSF9FTkNSWVBUX09OCQk0Ci0jZGVmaW5lIEFVVEhfRU5DUllQVF9NQVNLCTQKLQotI2RlZmluZQlBVVRIVFlQRV9OVUxMCQkwCi0jZGVmaW5lCUFVVEhUWVBFX0tFUkJFUk9TX1Y0CTEKLSNkZWZpbmUJQVVUSFRZUEVfS0VSQkVST1NfVjUJMgotI2RlZmluZQlBVVRIVFlQRV9TUFgJCTMKLSNkZWZpbmUJQVVUSFRZUEVfTUlOSwkJNAotI2RlZmluZQlBVVRIVFlQRV9DTlQJCTUKLQotI2RlZmluZQlBVVRIVFlQRV9URVNUCQk5OQotCi0jaWZkZWYJQVVUSF9OQU1FUwotY29uc3QgY2hhciAqYXV0aHR5cGVfbmFtZXNbXSA9IHsKLQkiTlVMTCIsICJLRVJCRVJPU19WNCIsICJLRVJCRVJPU19WNSIsICJTUFgiLCAiTUlOSyIsIDAsCi19OwotI2Vsc2UKLWV4dGVybiBjaGFyICphdXRodHlwZV9uYW1lc1tdOwotI2VuZGlmCi0KLSNkZWZpbmUJQVVUSFRZUEVfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPCBBVVRIVFlQRV9DTlQpCi0jZGVmaW5lCUFVVEhUWVBFX05BTUUoeCkJYXV0aHR5cGVfbmFtZXNbeF0KLQotLyoKLSAqIEVOQ1JZUFRpb24gc3Vib3B0aW9ucwotICovCi0jZGVmaW5lCUVOQ1JZUFRfSVMJCTAJLyogSSBwaWNrIGVuY3J5cHRpb24gdHlwZSAuLi4gKi8KLSNkZWZpbmUJRU5DUllQVF9TVVBQT1JUCQkxCS8qIEkgc3VwcG9ydCBlbmNyeXB0aW9uIHR5cGVzIC4uLiAqLwotI2RlZmluZQlFTkNSWVBUX1JFUExZCQkyCS8qIEluaXRpYWwgc2V0dXAgcmVzcG9uc2UgKi8KLSNkZWZpbmUJRU5DUllQVF9TVEFSVAkJMwkvKiBBbSBzdGFydGluZyB0byBzZW5kIGVuY3J5cHRlZCAqLwotI2RlZmluZQlFTkNSWVBUX0VORAkJNAkvKiBBbSBlbmRpbmcgZW5jcnlwdGVkICovCi0jZGVmaW5lCUVOQ1JZUFRfUkVRU1RBUlQJNQkvKiBSZXF1ZXN0IHlvdSBzdGFydCBlbmNyeXB0aW5nICovCi0jZGVmaW5lCUVOQ1JZUFRfUkVRRU5ECQk2CS8qIFJlcXVlc3QgeW91IHNlbmQgZW5jcnlwdGluZyAqLwotI2RlZmluZQlFTkNSWVBUX0VOQ19LRVlJRAk3Ci0jZGVmaW5lCUVOQ1JZUFRfREVDX0tFWUlECTgKLSNkZWZpbmUJRU5DUllQVF9DTlQJCTkKLQotI2RlZmluZQlFTkNUWVBFX0FOWQkJMAotI2RlZmluZQlFTkNUWVBFX0RFU19DRkI2NAkxCi0jZGVmaW5lCUVOQ1RZUEVfREVTX09GQjY0CTIKLSNkZWZpbmUJRU5DVFlQRV9DTlQJCTMKLQotI2lmZGVmCUVOQ1JZUFRfTkFNRVMKLWNvbnN0IGNoYXIgKmVuY3J5cHRfbmFtZXNbXSA9IHsKLQkiSVMiLCAiU1VQUE9SVCIsICJSRVBMWSIsICJTVEFSVCIsICJFTkQiLAotCSJSRVFVRVNULVNUQVJUIiwgIlJFUVVFU1QtRU5EIiwgIkVOQy1LRVlJRCIsICJERUMtS0VZSUQiLAotCTAsCi19OwotY29uc3QgY2hhciAqZW5jdHlwZV9uYW1lc1tdID0gewotCSJBTlkiLCAiREVTX0NGQjY0IiwgICJERVNfT0ZCNjQiLCAgMCwKLX07Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKmVuY3J5cHRfbmFtZXNbXTsKLWV4dGVybiBjaGFyICplbmN0eXBlX25hbWVzW107Ci0jZW5kaWYKLQotCi0jZGVmaW5lCUVOQ1JZUFRfTkFNRV9PSyh4KQkoKHVuc2lnbmVkIGludCkoeCkgPCBFTkNSWVBUX0NOVCkKLSNkZWZpbmUJRU5DUllQVF9OQU1FKHgpCQllbmNyeXB0X25hbWVzW3hdCi0KLSNkZWZpbmUJRU5DVFlQRV9OQU1FX09LKHgpCSgodW5zaWduZWQgaW50KSh4KSA8IEVOQ1RZUEVfQ05UKQotI2RlZmluZQlFTkNUWVBFX05BTUUoeCkJCWVuY3R5cGVfbmFtZXNbeF0KLQotI2VuZGlmIC8qIF9BUlBBX1RFTE5FVF9IXyAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvLmN2c2lnbm9yZSBiL3Rlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTdjOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSoubmV3Ci0qLnBjYXAKLTAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wY2FwCi0wOC1zdW5yaXNlLXN1bnNldC1hZXMucGNhcAotMDgtc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAKLTA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcAotaXNha21wLWRlbGV0ZS1zZWdmYXVsdC5wY2FwCi1pc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucGNhcAotaXNha21wLXBvaW50ZXItbG9vcC5wY2FwCi1ydW4xLnBjYXAKLXJ1bjIucGNhcApkaWZmIC0tZ2l0IGEvdGVzdHMvMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAgYi90ZXN0cy8wMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyYWY5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy8wMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzLzAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wdXUgYi90ZXN0cy8wMi1zdW5yaXNlLXN1bnNldC1lc3AucHV1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2VmZmMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzLzAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wdXUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1iZWdpbiA2NDQgMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCZgYGAhYGBgYGBgYGBgYGBgYGAiNmBgYGBFQGBgYCFgYGAmMUQKLU0xMWBgYCYxRChQQGAxMGBgQi9dR2BgIWAsTzo1UGAkIiVcYCFgQlQyLSU5WGBgYGBgNFBAMTJcXEwpKDEKLU1UWj0oUz43KCQ+LjwzTkBcX0k6QVkiSy9US0FaSlA3MTkiTkNLWVA7UFQoMCskIk0lPV0tWCJgKjhWLicKLU0tJyQxQV0wMiIzTiNPWkkjJjFSXUEqMTtgRzhTQFlGUV08SDdTKSk0MTdZOSFFNDo8JCdDVyklVlomXzMKLU1fXVRgTCtQMV4hYFBFUGBgYGBgYGBgYGBFQGBgYCk4YGBgYDBgYCFEOSQ0MGBgIUQ5IiwoYCQ0YGAoQ18KLU06YGBgMCMrVkUsYCFgQT9gYDAoTSRDMTY+YGBgYGAoOjwkJ0NXKSVWWicsMktRTUJAQ04/JyJeR0o8PToKLU1ELTBgKy5WXkonMkFLKS4nWFFfQiJCODpbJUFfK0tbNktTMidYUltVTmAsUiJCSlA/Xl0uWk0jL1skKSMKLU0xN14hRCI4X1tCWj5HVTRaKiQ3SSJOJFUqPko0Nz9DLTQ7ST4jYCU2KyMwJV1ENzVZQyddKlpcYGBgYGAKLU1gYGBgYCk4YGBgIjZgYGBgJGBgYDkmMSUkYGBgOSYwQyJgISVgYCIoX1ZEYGAkYFJdSS9gYDAoN1BgJCIKLU0rMShUNUdAYGBgYCM3P0MtNDtJPiNgJUBXJTg5P1FKIyRUSiw0R1xGTyZITz1GKywsJTFFKF0pO1hJXVQKLU1WN1cuUlkkMj1KWjElIVFDTlhbO14uSkQ0VzkxOzcpTkpXVjJNRjQ/N2A9Jl8zT1dXJVYmNlJJWEtCNzUKLU0jOzJUV05MIkE6TUYhSUBfNVJeXUw2O1pgTD9FQDE6VCY3MUdgYGBgYGBgYGBgIjZgYGBgRUBgYGAhYGAKLU1gJjFEMTFgYGAmMUQoUEBgMTBgYEIvXUpgYCFgLE86MlBgJCIlXGAhYEJUMi0lOVhgYGBgISpNRiFJQF8KLU01Ul5dJSc7OSpROlNfQl1dT184RlY6MksxQSFdL1NRSEk3Pk9TODE1Kkk/NCUvOi49QkJKVUVHSihYOFwKLU08U1o+UDFFL0AmUFw5TVIpRFAzW1VDV0lALE1SJUEkXENSXT1HKCgiW0NGQjdBVU4kQUVOWk9PJlw6NyUKLU0yS0xXPCdOUCxMKEk9ITs4PTBgYGBgYGBgYGBgRUBgYGApOGBgYGAwYGAhRDkkNDBgYCFEOSIsKGAkNGAKLU1gKENfOlBgYDAjK1ZEPGAhYEE/YGAwKE0kQzE2PmBgYGBgNU5aT08mXDo3JTJKMTIsOTtMT0siLVMsPSQKLU1PMF1YK0ooT0pRRUQjUExCUllbXF4zNTJVWksmNTc8UjBMOUpROktINmApQlVOJGA1XTFXVUAiQSE4VE0KLU1PXik8O2AtU1c7MUhRTyRDRVwjYE9bV1sxN0dXWzBHJk0sXlQ/Nz42LFo8OiU3M0FXVjM6O1kvOj1AKGAKLU1gYGBgYGBgYGApOGBgYCI2YGBgYCRgYGA5JjElJGBgYDkmMEMiYCElYGAiKF9WUGBgJGBSXUkjYGAwKDcKLU1QYCQiKzEoVDVHQGBgYGAmTSxeVD83PjYsWj0+Tl9ZWlFGVltIMV42XCEvSSpJTUFPSFpFXEUwTS5aIVgKLU0jWzBFRzMjPiVdN2BdKjJGP0BTNFgyJydUSzA5SkBORy8uSEVYQ0UuLy4uS14nLUAiOlhbXD8wTCtCYFMKLU1RQVxIVEtcJ0pdOlNdTjZPYF1cKU5RRCk5O0gyUFxLYF5OWDM3YFI1YGBgYGBgYGBgYCI2YGBgYEVAYGAKLU1gIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBCL11NYGAhYCxPOi9QYCQiJVxgIWBCVDItJTlYYGBgYCFeNk8KLU1gXVwpTlFEKT5CWVo+YC9EQT1OO0EyLi4uMy03RlpPSz86NUtHWEJOYC9FPyRcWy0xMS0kRyNFOyg+TiIKLU0rPCQvWVAnU00kPjE2TFUxOCZRXTkpJF0wKS9NXToyWiNBNl0tLFNNKj5GSS9gWCpLLSotOktTM0lXPCIKLU1PKD4oUChLPTpYOjpTSjtPW0o+MEtgYGBgYGBgYGBgYEVAYGBgKThgYGBgMGBgIUQ5JDQwYGAhRDkiLCgKLU1gJDRgYChDXztAYGAwIytWQ0xgIWBBP2BgMChNJEMxNj5gYGBgYEMzSVc8Ik8oPihQJy00MztDW2BNQ0QKLU1gQk1aQVhdRiE/J1okOFEiNUhZTVZEQzkiOEleTyhaNCEvKWAvSVZELShaSylfNTItSDJYSyssKC1MUikKLU1NKUsjWExGIj5LWTA+Qz9cW01BJTNGJSQ/T1JKQDo+T101SD4/LSRPUUgpSjxaRk9XXytLJUc9VUcwIlsKLSJHJ1RgCi1gCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3RzLzA4LXN1bnJpc2Utc3Vuc2V0LWFlcy5wY2FwIGIvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtYWVzLnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmUzZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtYWVzLnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1hZXMucHV1IGIvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtYWVzLnB1dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NzkzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy8wOC1zdW5yaXNlLXN1bnNldC1hZXMucHV1CisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotYmVnaW4gNjQ0IDA4LXN1bnJpc2Utc3Vuc2V0LWFlcy5wY2FwCi1NVSwuUkgwKGAhYGBgYGBgYGBgYGBgYGAmYGBgIWBgYGBgYGBgYGBgYGBgIkZgYGBgSUBgYGAhYGBgJjFECi1NMTFgYGAmMUQoUEBgMTBgYEYvU0pgYCFgLE9EIlBgJCIlXGAhYEJXMShUNUdgYGBgYD46WycuQzBKKCVQCi1NVkYnPihUVTYmKiI5QSxgLC9LU1w6PkRIPk9fTCg1MSlfW1lZIkw8SCNMSi87KEJRKT1bKiQ8QVBZL0ExCi1NLSJUQChgX1EmKVMhQykkKjdTP0czUTRIXEY9KU9ZRitQQFMmMTElXipdUylOQEwqVFpAITomJjpRRlpUCi1NTCcjNzw+OT84Jz9KNFY6Xy5dQis2VVJcVD4zOUQrPU5BOyRgYGBgYGBgYGBgKjhgYGAiRmBgYGAkYGBgCi1NOSYxJSRgYGA5JjBDImAhJWBgIjhfLkxgYCRgUl4wJ2BgMCg3UGAkIis9JEMxNjxgYGBgIjtLMlA8LT1RCi1NWUVdQD1eSTM5S1xbViQxSERVOSdMLDZCVksuXkI0XUU2UVkmOj8zP1QpRz8iUlNVO1ghSl1dN1MpPGAsCi1NKkwhU1lPXlJVV1I/IUVJSk1XVT01QjQwNllMLUlgXUxLYF47LTMlKE5FWSNSYFNUPVc0MD06KltNJCo4Ci1NIzxLWCkxOUAuYC40XzVZRF46VjtHQDM+YEdMVEsoNVpDUyJCQ0BgYGBgYGBgYGBgSUBgYGAqOGBgYGAwCi1NYGAhRDkkNDBgYCFEOSIsKGAkNGBgKUNcW2BgYDAjK1lgLGAhYEE/YGAwKE1UMi0lOVBgYGBgLC1ST0BFCi1NJUZgWGBZM103RjNZSzlOPj02LTtVJic2Ij5fNEg4MERNWV5aOUUzWkwzW09OTipMPCJaQDcoVk9dWFReCi1NLzJKUDwoL144TlRPLTRcL0I1QUpFQzROOyxcIjctJig7OUFNXzJHNUExQy5bTEJLMycpUD9BRTskSVspCi1NIThOJlJDP09URDc8VilBSVU0LCpFPjdFTFVSRlhSRC9KRCg6QFJFUmBgYGBgYGBgYGAiRmBgYGBJQGBgCi1NYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgRi9TTWBgIWAsT0NfUGAkIiVcYCFgQlcxKFQ1R2BgYGAhKDsqCi1NLV5fMjE9UzhGJkc1MFBKNVk+NUslQFI7KUEoRTw1WUQnQDg2QEdUIi0mJk1IUCouQT0/JT06RkRaSD00Ci1NKjkiOj5dJ0cnQ0I0JTI/UEoiMl5IKjUxXDhQITlUYFgzIztGK0gkWzxHVzc9P0suUjMwLSc2J0wzQU84Ci1NUj06TTNTJEdJWj40WiQ3WkwwPFxTPVNcJWA6Qlc5VTInQFVeQEQsLDouUGBgYGBgYGBgYGAqOGBgYCJGCi1NYGBgYCRgYGA5JjElJGBgYDkmMEMiYCElYGAiOF8uWGBgJGBSXi9bYGAwKDdQYCQiKz0kQzE2PGBgYGAlCi1NLDI+R0lZM0gxP0pRIVNTLVcvUDQhQlcmKiZBWyQhWEdLPF5NXj5fWDE5MyJHIjFRVFdHPlEiQ08yNSQiCi1NUE0rMSs4WzYmKDE3XEVFXFA6Ni1XVlBUPTkxMT9AJy1aLCwvVVZaMiFRVihYNDUxM1U5XVA2MkNKTVM+Ci1NXk9EQkdIVT0lVC5IMiZaPDQsOCghNCwyWyZBNF5IPSJMOitgPTRHPyooNywyQGBgYGBgYGBgYGBJQGBgCi1NYCo4YGBgYDBgYCFEOSQ0MGBgIUQ5IiwoYCQ0YGApQ1xbUGBgMCMrWF88YCFgQT9gYDAoTVQyLSU5UGBgCi1NYGA4NzBaQSg7SVEwUUBAJTBRK0w6JTNaQCpIUVBaQV0zU1RXRFkjQ1lKR09KSClLPEtWVDlHNjE+PkknCi1NRUhNRiJYIV5HLEhALFlXVDdePTYwLjMvJDc/QVlIKUc5R0JEJSUjLERdIUVEQV1CKj9VRT5VOTYrIjVcCi1NSz0iIi8uTE8nX19eOyROPEVAIS4yJjNeQFU6UF9fOF8nRF5ZQyE0MUUsIUAhNjxLYGBgYGBgYGBgYCJGCi1NYGBgYElAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBGL1NQYGAhYCxPQ1xQYCQiJVxgIWBCVzEoVDVHCi1NYGBgYCFfWUwyWVI2YCRZKDkvWiM1SyNfXUNfWkpVJTdNP0wyMz5JYEwjRF1AJkc/WjdCMk8jR0k/TkRLCi1NRls3SlBOLDhWXEg+JUcrKScrJStGTComXDgrSDJeS0ZXRjVZUTokNFYhLDE/Rzs9T1lEOyEsM1lEJ1YoCi1NV1tZIUkoVT1YOVtcOkwpKDVHQkosQiEtNU4kLkNHViRWTEReUj9aLEtMW0FNSShaQy1QYGBgYGBgYGBgCi1NYCo4YGBgIkZgYGBgJGBgYDkmMSUkYGBgOSYwQyJgISVgYCI4Xy8kYGAkYFJeL09gYDAoN1BgJCIrPSRDCi1NMTY8YGBgYChQREE2PipIUigkVTZYMFouPzgzOlI7WTA8RS80U04pVVg7UTpEJEQlSyhEWlo6Xl9cSyQnCi1NWlE4MU5UNEtCR0QjWj1fXmBFXiFIUypLSEVKISkhS0U+JicyMDY1LyIqTSdFTFhEPzElM1xMM1RDLlVLCi1IS1dCKEM1T0A3OD45TFFePDBaNl1GPTo8O0BbPkxeOy9cLTZXQjgxW0dYKTxNUzBCPT5MR0RAYGAKLWAKLWVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwIGIvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2U1NGNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzLzA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzLzA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucHV1IGIvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wdXUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ODVmMmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wdXUKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1iZWdpbiA2NDQgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwCi1NVSwuUkgwKGAhYGBgYGBgYGBgYGBgYGAmYGBgIWBgYGBgYGBgYGBgYGBgIy5gYGBgU0BgYGAhYGBgJjFECi1NMTFgYGAmMUQoUEBgMTBgYFAiRS1gYCFgLExRWFBgJCIlXGAhYEJUMi0lOVhgYGBgYDQ9IStcNStGOGArCi1NW1tOT1UtIzk4KkFPNVw3ODBYW1ZEWEZAMlc4PDEwOkohJyFaIS1bN040Q0ZOUktJSDtQVUExU0wiWTlcCi1NLT9fM05fLFcvQCpUK0MvIl09U1tgO0QhLztgU1I1LDMrPjw5Sy5eXDlOPjwxOFRZOVpcIUlcUy4vTDhSCi1NRkU1MyxTNlk1WF9aXChUKVpJVVM/WCQ4PiYoX01UMSIhU1Y6VlBQIVxYVSRbM1MtNUwpNC1PIiY+XWBaCi1NMTouLzYxPSVDNmA2VTEvNjUiQSZLVUU5MDJdKmBgYGBgYGBgYGAjLmBgYGBTQGBgYCFgYGAmMUQxMWBgCi1NYCYxRChQQGAxMGBgUCJFL2BgIWAsTFFWUGAkIiVcYCFgQlQyLSU5WGBgYGBgQ0lVXlNYJTtHXiFHVVNQCi1NU0E8Py84Rlk/TC8nXjJdNicmM1tcLU5FUzNFXTMzWiRRXSM3RDkkOFRGUzUpOz9TPylaSk9QNDtaRC1NCi1NKzBfL0AjKlU9N0E5O0ZZUio1Ji9eViVNU0ZFTWBEQVpZLDgnPDAuOU1eJzo6PE0rTTJHMExHNipTL1szCi1NP1RgSUlKVUpbR1csTCsmUEg8QVImSyhdXj1bSzdJTUdEW2A4W09OTDhMRDNBTWBOQCRTISo/PTsqOD0+Ci1NTDdQNkZNODEpLE4+VC8xWiciUDdINTtgYGBgYGBgYGBgYCMuYGBgYFNAYGBgIWBgYCYxRDExYGBgJjFECi1NKFBAYDEwYGBQIkUxYGAhYCxMUVRQYCQiJVxgIWBCVDItJTlYYGBgYGBSNCktUCZGPkhQSy8/XyRNVEZDCi1NXlRPTz0vTCNXX0FQVEs2TUlIX0JDKkk3XEw8LDkoPy8wTSJISzNbVDNGOyhZMlY3MCRQNT9EJzdHRklCCi1NSlovQyIsUy9CRCE5TjhHViJcLjtHVk1FW1AhQCFCMSJEVD0xVzBfNzVGTUkyM0ghVDJeQyk7NEdZPmBJCi1NLTJUXk9fMF9XVSYkKSYrL1ApJVtUUVVRLVQ3RyVcUlhZSlQwSE88L14qKUZgXjI8VzhLVFkuVzxGSzRLCi1NOFVDK0onLipYKU5IJTxVVEsrSytgYGBgYGBgYGBgIy5gYGBgU0BgYGAhYGBgJjFEMTFgYGAmMUQoUEBgCi1NMTBgYFAiRTNgYCFgLExRUlBgJCIlXGAhYEJUMi0lOVhgYGBgISlgOV1dU0hLSVtFR1c0TT9XOD5bJD08Ci1NYEBAVEwxIyhZOTgwXUUqLyFeMkBHYComUzlPXlFNUzFTPy9gVEw9NUY5QigxMj8oMTQ1PlkySSs7K1Q/Ci1NS1dVREAmLjdVMzZdSy0kWy4lOUNCKkZLXkU4Pk46Sy8pNCMkXVpPLzo9IztNUkgtKV8xMzlcLFc2TTRUCi1NN1NRP0JCWCZHVCwrQTMjQkI1Xk89PitHS0lDLTRdNVZCUClELVM8WDJPKUhbXy8jTSpUKyYkXDdQTC5NCi1NPjctKVxXJjs8QF9KQCwqIWBgYGBgYGBgYGAjLmBgYGBTQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgCi1NUCJFNWBgIWAsTFFQUGAkIiVcYCFgQlQyLSU5WGBgYGAhME9JRkE7LEAyQzRIRjM+NSEtQygwPjVMUjAiCi1NPScxXE9RLiEtP0BEKFUwITQ1MyI8US8hXCpDREsuJk9VJytXRTpeN0o4IkFNUzxAVVlYKiw8KCZZQTJRCi1NR1EoLjMrMFwjYCErYC5URSw7XDM6LjwrRjo/PVRALktPQkwlVkFBWDlfUlkkL14lJEMrSSo0JlM8QU1dCi1NUCpdU1oiUkQnRy5BSkg3Nj9TViYySFFMRishSi9RWjsuOjxMQjo6LV0rQUUxKyYpO01eXWBYWi1XMkNYCi1NKyZDUFpJTlAqOT8+YGBgYGBgYGBgYCMuYGBgYFNAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBQIkU3Ci1NYGAhYCxMUU5QYCQiJVxgIWBCVDItJTlYYGBgYCFJME0iLVRIRUY9KyFMPT5BM04sXDErIidaNyhKP08wCi1NLkI/KSgjWD0vNUYtLiI+JTMuWCcoPUpLSzpXPE1aRjJeOCM3M0NbVVMkLU8mWlorTDo5NFI5RTIjPUo9Ci1NMThIUD9BTmA1XilBK0hXNkVCKjVQPUFaKFMiXFRJQlonXC49XTRBLCMxOCcwL1JfI0M6NFhYXz8+Wk1OCi1NPUIrXlEzIihLRVwxMjk5XT01RSwnLiZVKGBIOU4pKz45RlMvYENBKj5EXj5BVi4tQyhTXClCTSYpKlhNCi1NXkJGX19ePF9gYGBgYGBgYGBgIy5gYGBgU0BgYGAhYGBgJjFEMTFgYGAmMUQoUEBgMTBgYFAiRTlgYCFgCi1NLExRTFBgJCIlXGAhYEJUMi0lOVhgYGBgIVIiU1EnWzYlKDtRPj5PK11DUzZEKitBRDNJTUNcXk1NSzhbCi1NOlQzKUtNMDYhR14uSFw+JVVBVEApWDZKTDlcM1YuSFIiK19RXl9ULU8kWV9TIjpfVFA7VixMSVYxT11ICi1NLUdARE9MJ1YtNSlPQCU8JSEjTyQyVixBU0BXNygmJElYLllLS11cSyM+RklUVSk8Pk80MlQyR0tGVyteCi1NXC9bLD5FNFBbUSIrN08sWTEoUjIyTE5EW0grNDY5KCUzLFNOJjM6VTovSWAnJlJAPGA8VFIiLTQ6JjgrCi1NUTVTWGBgYGBgYGBgYGAjLmBgYGBTQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgUCJFO2BgIWAsTFFKCi1NUGAkIiVcYCFgQlQyLSU5WGBgYGAiKicsXUE2QSxRKCpCK109JjZYJlQqTF5cKVo2TiUsRykoLjs2WC1LCi1NTUAmNDxGUkpdI0lKJVknLV5UKzRbJjswO18lN0hNODVMUjhXKD5IS0dPVixeI0w5LFFGJSlXXjkhVkZNCi1NWEcnWFldQ1dJNVZGMzM/NywqUD82Oi5QUycmW1xOJDdXPCo9PSs7UCokLi80Kk9IJj1PLDZHIUpJTj5JCi1NJ1pEUCpEJjRLPlNLLVwvITdcWiY8JjVKNCVOVT9OUk0mMjUnKl8iJ1VFM1ZIJj9VXS9WQDkzMlVZWlRcCi1gCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2FsbHRlc3RzLnNoIGIvdGVzdHMvYWxsdGVzdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjI1OTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYWxsdGVzdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIS9iaW4vc2gKLQotZm9yIGkgaW4gKi5zaAotZG8KLSAgaWYgWyAiWCRpIiA9ICJYYWxsdGVzdHMuc2giIF0gCi0gIHRoZW4gCi0gIAljb250aW51ZTsKLSAgZmkKLSAgc2ggLi8kaQotZG9uZSAKLQotCmRpZmYgLS1naXQgYS90ZXN0cy9iZ3AtaW5maW5pdGUtbG9vcC5wY2FwIGIvdGVzdHMvYmdwLWluZmluaXRlLWxvb3AucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwN2Q0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9iZ3AtaW5maW5pdGUtbG9vcC5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvYmdwX3Zwbl9hdHRyc2V0Lm91dCBiL3Rlc3RzL2JncF92cG5fYXR0cnNldC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjEyYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvYmdwX3Zwbl9hdHRyc2V0Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLUlQICh0b3MgMHhjMCwgdHRsICA2MiwgaWQgNTg2MjgsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBUQ1AgKDYpLCBsZW5ndGg6IDE3MykgMTIuNC40LjQuMjA1MSA+IDEyLjEuMS4xLjE3OTogUCwgY2tzdW0gMHhjZjE4IChjb3JyZWN0KSwgMzI5MzA3NzU3MzozMjkzMDc3Njk0KDEyMSkgYWNrIDMzNDgxMDg1ODIgd2luIDE2Mzg0IDxub3Asbm9wLHRpbWVzdGFtcCAzODMxMzEgODkwMjk5PjogQkdQLCBsZW5ndGg6IDEyMQotCVVwZGF0ZSBNZXNzYWdlICgyKSwgbGVuZ3RoOiAxMjEKLQkgIE9yaWdpbiAoMSksIGxlbmd0aDogMSwgRmxhZ3MgW1RdOiBJR1AKLQkgIEFTIFBhdGggKDIpLCBsZW5ndGg6IDAsIEZsYWdzIFtUXTogZW1wdHkKLQkgIExvY2FsIFByZWZlcmVuY2UgKDUpLCBsZW5ndGg6IDQsIEZsYWdzIFtUXTogMTAwCi0JICBFeHRlbmRlZCBDb21tdW5pdHkgKDE2KSwgbGVuZ3RoOiA4LCBGbGFncyBbT1RdOiAKLQkgICAgdGFyZ2V0ICgweDAwMDIpLCBGbGFncyBbbm9uZV06IDMwMDowLjAuMS40NAotCSAgQXR0cmlidXRlIFNldCAoMTI4KSwgbGVuZ3RoOiAzNiwgRmxhZ3MgW09UXTogCi0JICAgIE9yaWdpbiBBUzogNjUwMDEKLQkgICAgICBPcmlnaW4gKDEpLCBsZW5ndGg6IDEsIEZsYWdzIFtUXTogSUdQCi0JICAgICAgQVMgUGF0aCAoMiksIGxlbmd0aDogNCwgRmxhZ3MgW1RdOiA1NTU1IAotCSAgICAgIExvY2FsIFByZWZlcmVuY2UgKDUpLCBsZW5ndGg6IDQsIEZsYWdzIFtUXTogNDQKLQkgICAgICBPcmlnaW5hdG9yIElEICg5KSwgbGVuZ3RoOiA0LCBGbGFncyBbT106IDIyLjUuNS41Ci0JICAgICAgQ2x1c3RlciBMaXN0ICgxMCksIGxlbmd0aDogNCwgRmxhZ3MgW09dOiAyMi41LjUuNQotCSAgTXVsdGktUHJvdG9jb2wgUmVhY2ggTkxSSSAoMTQpLCBsZW5ndGg6IDMwLCBGbGFncyBbT0VdOiAKLQkgICAgQUZJOiBJUHY0ICgxKSwgU0FGSTogbGFiZWxlZCBWUE4gVW5pY2FzdCAoMTI4KQotCSAgICBuZXh0aG9wOiBSRDogMDowLjAuMC4wLCAxMi40LjQuNCwgbmgtbGVuZ3RoOiAxMiwgbm8gU05QQQotCSAgICAgIFJEOiA1MDA6MC4wLjEuMjQ0LCAxMzMuMC4wLjAvOCwgbGFiZWw6MTAwMjA4IChib3R0b20pCmRpZmYgLS1naXQgYS90ZXN0cy9iZ3BfdnBuX2F0dHJzZXQucGNhcCBiL3Rlc3RzL2JncF92cG5fYXR0cnNldC5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjBhZmY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2JncF92cG5fYXR0cnNldC5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvYmdwX3Zwbl9hdHRyc2V0LnNoIGIvdGVzdHMvYmdwX3Zwbl9hdHRyc2V0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjMzI4NzJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2JncF92cG5fYXR0cnNldC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMhL2Jpbi9zaAotCi1lY2hvIC1uIHRlc3QgYmdwX3Zwbl9hdHRyc2V0Li4uCi1pZiAoLi4vdGNwZHVtcCAtdCAtbiAtdiAtciBiZ3BfdnBuX2F0dHJzZXQucGNhcCB8IGRpZmYgLXcgLSAgYmdwX3Zwbl9hdHRyc2V0Lm91dCkKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0JCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZGxjLXNsYXJwLXNob3J0LnBjYXAgYi90ZXN0cy9jaGRsYy1zbGFycC1zaG9ydC5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTMxM2RjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2NoZGxjLXNsYXJwLXNob3J0LnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9jaGRsYy1zbGFycC5wY2FwIGIvdGVzdHMvY2hkbGMtc2xhcnAucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyMTQ0My4uMDAwMDAwMAotLS0gYS90ZXN0cy9jaGRsYy1zbGFycC5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24xLmdkYmluaXQgYi90ZXN0cy9lYXBvbjEuZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhZDBiYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9lYXBvbjEuZ2RiaW5pdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXNldCBhcmdzIC1yIGVhcG9uMS5wY2FwCmRpZmYgLS1naXQgYS90ZXN0cy9lYXBvbjEubmV3IGIvdGVzdHMvZWFwb24xLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwNDJlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9lYXBvbjEubmV3CisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtZGdtID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLWRnbSA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1hcnAgd2hvLWhhcyAxOTIuMTY4LjEuMSB0ZWxsIDE5Mi4xNjguMS4yNDkKLWFycCByZXBseSAxOTIuMTY4LjEuMSBpcy1hdCAwMDowZDo4ODo0ZjoyNTo5MSAob3VpIFVua25vd24pCi1JUCAxOTIuMTY4LjEuMjQ5LmJvb3RwYyA+IDE5Mi4xNjguMS4xLmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCi1JUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUVBUCBjb2RlPTEgaWQ9MSBsZW5ndGg9MCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NSAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NDUgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTIwIAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD03NiAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9ODAgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTI4IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD00IAotRUFQIGNvZGU9MSBpZD0zIGxlbmd0aD01NyAKLUVBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NDQgCi1JUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1FQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKLUVBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAotYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAotYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAotYXJwIHdoby1oYXMgMTY5LjI1NC42Ny4xOTQgdGVsbCAxNjkuMjU0LjY3LjE5NAotSVAgMTY5LjI1NC42Ny4xOTQuNDI5OSA+IDIzOS4yNTUuMjU1LjI1MC4xOTAwOiBVRFAsIGxlbmd0aCAxMzMKLUlQIDE2OS4yNTQuNjcuMTk0ID4gSUdNUDogaWdtcCB2MyByZXBvcnQsIDEgZ3JvdXAgcmVjb3JkKHMpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NCA+IElHTVA6IGlnbXAgdjMgcmVwb3J0LCAxIGdyb3VwIHJlY29yZChzKQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1FQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKLUVBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUlQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUVBUCBjb2RlPTEgaWQ9MSBsZW5ndGg9MCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NSAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NDUgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTIwIAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKLUVBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IApkaWZmIC0tZ2l0IGEvdGVzdHMvZWFwb24xLm91dCBiL3Rlc3RzL2VhcG9uMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MDQyZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZWFwb24xLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtZGdtID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLWRnbSA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1kZ20gPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtZGdtID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTkyLjE2OC4xLjI0OS5uZXRiaW9zLW5zID4gMTkyLjE2OC4xLjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxOTIuMTY4LjEuMjQ5Lm5ldGJpb3MtbnMgPiAxOTIuMTY4LjEuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE5Mi4xNjguMS4yNDkubmV0Ymlvcy1ucyA+IDE5Mi4xNjguMS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotYXJwIHdoby1oYXMgMTkyLjE2OC4xLjEgdGVsbCAxOTIuMTY4LjEuMjQ5Ci1hcnAgcmVwbHkgMTkyLjE2OC4xLjEgaXMtYXQgMDA6MGQ6ODg6NGY6MjU6OTEgKG91aSBVbmtub3duKQotSVAgMTkyLjE2OC4xLjI0OS5ib290cGMgPiAxOTIuMTY4LjEuMS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD01IAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1FQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NzYgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTgwIAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yOCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9NCAKLUVBUCBjb2RlPTEgaWQ9MyBsZW5ndGg9NTcgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTQ0IAotSVAgMC4wLjAuMC5ib290cGMgPiAyNTUuMjU1LjI1NS4yNTUuYm9vdHBzOiBCT09UUC9ESENQLCBSZXF1ZXN0IGZyb20gMDA6MDQ6MjM6NTc6YTU6N2EgKG91aSBVbmtub3duKSwgbGVuZ3RoOiAzMDAKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1JUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAotRUFQIGNvZGU9MSBpZD0xIGxlbmd0aD0wIAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD01IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD00NSAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9MjAgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTc2IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD04MCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9MjggCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTU3IAotRUFQIGNvZGU9MSBpZD0zIGxlbmd0aD00NCAKLWFycCB3aG8taGFzIDE2OS4yNTQuNjcuMTk0IHRlbGwgMTY5LjI1NC42Ny4xOTQKLWFycCB3aG8taGFzIDE2OS4yNTQuNjcuMTk0IHRlbGwgMTY5LjI1NC42Ny4xOTQKLWFycCB3aG8taGFzIDE2OS4yNTQuNjcuMTk0IHRlbGwgMTY5LjI1NC42Ny4xOTQKLUlQIDE2OS4yNTQuNjcuMTk0LjQyOTkgPiAyMzkuMjU1LjI1NS4yNTAuMTkwMDogVURQLCBsZW5ndGggMTMzCi1JUCAxNjkuMjU0LjY3LjE5NCA+IElHTVA6IGlnbXAgdjMgcmVwb3J0LCAxIGdyb3VwIHJlY29yZChzKQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQgPiBJR01QOiBpZ21wIHYzIHJlcG9ydCwgMSBncm91cCByZWNvcmQocykKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC40Mjk5ID4gMjM5LjI1NS4yNTUuMjUwLjE5MDA6IFVEUCwgbGVuZ3RoIDEzMwotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotRUFQIGNvZGU9MSBpZD0xIGxlbmd0aD0wIAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD01IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD00NSAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9MjAgCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFJFR0lTVFJBVElPTjsgUkVRVUVTVDsgQlJPQURDQVNUCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTc2IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD04MCAKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9MjggCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTU3IAotRUFQIGNvZGU9MSBpZD0zIGxlbmd0aD00NCAKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1JUCAxNjkuMjU0LjY3LjE5NC40Mjk5ID4gMjM5LjI1NS4yNTUuMjUwLjE5MDA6IFVEUCwgbGVuZ3RoIDEzMwotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBSRUdJU1RSQVRJT047IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAwLjAuMC4wLmJvb3RwYyA+IDI1NS4yNTUuMjU1LjI1NS5ib290cHM6IEJPT1RQL0RIQ1AsIFJlcXVlc3QgZnJvbSAwMDowNDoyMzo1NzphNTo3YSAob3VpIFVua25vd24pLCBsZW5ndGg6IDMwMAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUkVHSVNUUkFUSU9OOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLWRnbSA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLWRnbTogTkJUIFVEUCBQQUNLRVQoMTM4KQotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1kZ20gPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1kZ206IE5CVCBVRFAgUEFDS0VUKDEzOCkKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtbnMgPiAxNjkuMjU0LjI1NS4yNTUubmV0Ymlvcy1uczogTkJUIFVEUCBQQUNLRVQoMTM3KTogUVVFUlk7IFJFUVVFU1Q7IEJST0FEQ0FTVAotSVAgMTY5LjI1NC42Ny4xOTQubmV0Ymlvcy1ucyA+IDE2OS4yNTQuMjU1LjI1NS5uZXRiaW9zLW5zOiBOQlQgVURQIFBBQ0tFVCgxMzcpOiBRVUVSWTsgUkVRVUVTVDsgQlJPQURDQVNUCi1JUCAxNjkuMjU0LjY3LjE5NC5uZXRiaW9zLW5zID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtbnM6IE5CVCBVRFAgUEFDS0VUKDEzNyk6IFFVRVJZOyBSRVFVRVNUOyBCUk9BRENBU1QKLUlQIDAuMC4wLjAuYm9vdHBjID4gMjU1LjI1NS4yNTUuMjU1LmJvb3RwczogQk9PVFAvREhDUCwgUmVxdWVzdCBmcm9tIDAwOjA0OjIzOjU3OmE1OjdhIChvdWkgVW5rbm93biksIGxlbmd0aDogMzAwCi1FQVAgY29kZT0xIGlkPTEgbGVuZ3RoPTAgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTUgCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQ1IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD0yMCAKLUlQIDE2OS4yNTQuNjcuMTk0Lm5ldGJpb3MtZGdtID4gMTY5LjI1NC4yNTUuMjU1Lm5ldGJpb3MtZGdtOiBOQlQgVURQIFBBQ0tFVCgxMzgpCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTc2IAotRUFQIGNvZGU9MSBpZD0wIGxlbmd0aD04MCAKLUVBUCBjb2RlPTEgaWQ9MCBsZW5ndGg9MjggCi1FQVAgY29kZT0xIGlkPTAgbGVuZ3RoPTQgCi1FQVAgY29kZT0xIGlkPTMgbGVuZ3RoPTU3IAotRUFQIGNvZGU9MSBpZD0zIGxlbmd0aD00NCAKZGlmZiAtLWdpdCBhL3Rlc3RzL2VhcG9uMS5wY2FwIGIvdGVzdHMvZWFwb24xLnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODdlZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZWFwb24xLnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9lYXBvbjEucHV1IGIvdGVzdHMvZWFwb24xLnB1dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjMTQzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9lYXBvbjEucHV1CisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLWJlZ2luIDY0NCBlYXBvbjEucGNhcAotTVUsLlJIMChgIWBgYGBgYGBgYGBgYC9fX2BgYCFgYGBgIiU1QDApKkAjQCM9YGBgYFcwYGBgL19fX19fXwotTV9QYCQoVT5FPkBAYDEwYGBTU0InYGAiYCQ3US5QKkAhXjwiSGA/XGBCQCIqYCtNM1shJC5CMVdgSmAnWQotTWAoSGBJMGBgKCQ1JTE0TSYwNDEqMSQ5JjEkMSExNE0jMDQtITBUJSMwNC0hMFQlIzA0JSFgIiElMEQ5IwotTTE0LSUxRDUqMUQ1JjEkNSgxRC0mMUQ5ITFEJSUxRC0hMFQlITAwI180VFUiKTBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYCEkYGBgTGBgYGBgYGBgYGBgI0hgUGBgYGBgYGBgYGAiUCE2YGAsYAotTWAwYCFgYChgJ2AhPDM0JSkzJS0sM1UxPDBFKS81VS0lYGAoYDEkSTAuMzUzLCRIYCIlNUAwLzJAI0AjPQotTWBgYGBXMGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgU1NCKGBgImAkN1EtUCpAIV48IkhgP1xgQkAiKgotTWArTCxcQSQuQjFbYEpgJ1lgKEhgSTBgYCgkNSUxNE0mMDQxKjEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtIQotTTBUJSMwNCUhYCIhITBEJSMxRSEmNCQ1LjFEMSUwVDkjMTUhJjIkOSQxNDkmNCQ5MDA0LSEwQCNfNFRVIgotTSkwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAhJGBgYExgYGBgYGBgYGBgYCNIYFBgYAotTWBgYGBgYGBgIlAhNmBgLGBgMGAhYGAoYCdgITwzNCUpMyUtLDNVMTwwRSkvNVUtJWBgKGAxJEkwLjM1MwotTSwkSGAiJTVAMCgiQyNAI1tgYGBgXlBgYGAvX19fX19fX1BgJChVPkU+QEBgMTBgYFszQilgYCJgJDdQTgotTVAqQCFePCJIYD9cYEJAIipgLUUjV0EkLkIxX2BKYCdZYChIYFBQYGAoJDUlMTRNJjA0MSoxJDkmMSQxIQotTTE0TSMwNC0hMFQlIzA0LSEwVCUjMDQlIWAiISEwRCUjMUUhJjQkNS4xRDElMFQ5IzE1ISYyJDkkMTQ5JgotTTQkOTAwNC0hMEAjXzRUVSIpMGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgISRgYCJEYAotTWBgYGBgYGBgYGAjSGBQYGBgYGBgYGBgYCowITZgYCxgYDBgIWBgKGAuQCE8MzQlKTMlLSwzVTE8MEUpLwotTTVVLSVgYFBgOC5IYGAkJTIwRDUpNSUtJzRFNTA0JDRgYDBgIyJAYDBgKCEsX0AwIzEkSTAuMzUzLCRIYAotTSIlNUAwL0pJI0AhPGBgYGA3YGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgM0NCKmBgImAkN1MsUCpAIQotTV48IkhgP1xgQjAiKWAjSiI9WERBYDFgYGAwYGBgYGBgYCIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJgotTTFEOSExRCUlMUQtITBUJSIzYGBgKGBgISI1NUAwLy84IkAhPGBgYGA3YGBgYC9fX19fX19fUGAkKFU+RQotTT5AQGAxMGBgM0NCLWBgImAkN1MpUCpAIV48IkhgP1xgQjAiKWAjSiI9WERBYDFgYGAwYGBgYGBgYCIhJQotTTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJjFEOSExRCUlMUQtITBUJSIzYGBgKGBgISJFNUAwKywpIVAhPAotTWBgYGA3YGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgM0NCLmBgImAkN1MoUCpAIV48IkhgP1xgQjAiKQotTWAjSiI9WERBYDFgYGAwYGBgYGBgYCIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJjFEOSExRCUlMUQtIQotTTBUJSIzYGBgKGBgISJFNUAwLEBOI2AjU2BgYGBcUGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgWTNCLwotTWBgImAkN1BQUCpAIV48IkhgP1xgQkAiKmAtJ0dJQSQuQjIrYEpgJ1lgKEhgTlBgYCgkNSUxNE0mMDQxKgotTTEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtITBUJSMwNC0hYCIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJgotTTFEOSExRCUlMUQtITBUJSIzUCNfNFRVIikwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWAhJGBgIiRgYGBgYGBgYGBgYCNIYFBgYGBgYGBgYGBgKDAhNmBgLGBgMGBgYGAoYCxAITwzNCUpMyUtLAotTTNVMTwwRSkvNVUtJWBgXGBAL1AqYCQxKjQjRFU0UyEqYGAhUmAmXGA8UGAlYDAsMCEwYC9gNTZKYGBVNQotTTgkITUlMDxgN2BgYGAlUGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgJFhYRWBgYEAhJVxQTCJIYD9HYAotTUpgJ19gKERgQjBgWkBHIikqYCQwYGAkYGBgYGBgYGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JgotTTA0OSExNDkjMDQtITBEUGBgImBgYDBZNTgkYD4xMCxgN2BgYGAlUGBgYCNfX19fX19fXGAhIi03STdIKAotTWAkNGBgJFhYRTBgYEAhJVxQPCJIYD9HYEpgJ19gKERgQjBgWkBHIikqYCQwYGAkYGBgYGBgYGBAMTQpJgotTTBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JjA0OSExNDkjMDQtITBEUGBgImBgYDBZNTgkITBOYFhgN2BgYAotTWAlUGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgJFhYRUBgYEAhJVxQLCJIYD9HYEpgJ19gKERgQjBgWgotTUBHIikqYCQwYGAkYGBgYGBgYGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JjA0OSExNDkjMDQtIQotTTBEUGBgImBgYDBdNTgkIyouYDxgKkBgYGAiSGBgYCNfX19fX19fXGAhIi03STdIKCFAYCEiYGAmIWBgIQotTWBgMEM1WjVaUCpAIV4wYGBgYGBgYCwiSGAwJC81NiFgJVVEJ2AjUGBgYGBcYGBgYGBgMEM1WjVaYGBWKAotTTNSNjEiYDhgYDBAYCFAMGBgQGAtQiRcRUQ8IkhgMCRgISItN0k3S2BKYCdZYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgI1U1QDAiRTkhUCE2YDBgYDVAJGBgYGAtQiRcRUQwYCQoVT5FPkBAYDEwYCEyI0I3YGAiYAotTSQ3UyNQKkAhXjwiSGAwJGAxYCEjYDMxWVZQJCEhQCMoKzI0XUNQJmBgLCJIYD9EYGBgYGBgYGBgYGBgYAotTWBgYGAhIi03STdIYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGA4WCkzOFM0ISFTOCRQKkAhYDNUJwotTWAwYCQoVT5FPk9cYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYF01OCRgNkAwRGAvYGBgYCNQYGBgYGAhIi03STdIYCMsWigsOUooQ0AkYGBgNCFgMGAlYDBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgLzU2IWAiQkwqYCU4IQotTWBgITZgMGBgX19fX19fX19gYDBDNVo1WiJgISVgYCUoLilcYGAoYDFgMDxgYGBgYF9fX19fUCEkYCQsIQotTS0sJktgMCQmYClAN0FTUGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAkKFU+RT5AYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYCFDQEUtQy0wJCE9YCQhLzA8IWBgMEM1WjVaLEAzYEpgJ1kjYEEkMkVgWQotTS01LFAyQ1AoMzUtJjUiYFUrQ2BXIlAkL2BQOEwrQlw/KD9ES19QYGBgYGBgI1U1QDAhW14jYCE2YDBgYAotTTVAJGBgL19fX19fX19QYCQoVT5FPkBAYDEwYCEyI0JBYGAiYCQwJCVgYGBgYC9fX19fXGAxYCEjYDMyLgotTVMwJCEhQCM1YFdUTmBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAhIi03STdIYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGA4WCkzOFM0IWA3MCFgM1QnYDBgJChVPkU+QygkUCpAIV4wUCgxJEkwLjM1MwotTSwkSFwiJFUzMUUwQC0yWFAtUEwhI1AsJisiWE8nUidZKl9cYGBgYGBgISE1OCQiJDhQKGAkUGBgYCEsYAotTWBgYGAjLFooLDlIYCEiLTdJN0ooQ0AkIWBgYGAkJTVAMC5JS2BAYFxgYGBgL2BgYGBgYCQoVT5FPkBgLAotTVNIQFFGSEIuYDBgYCEwJCJgYDQhYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYCElNTgkIT5MYExgL1BgYGAjXGBgYGBgIyxaKCw5SGAhIi03STdKKENAJGBgIlQiYEBgTQotTWAzJFIuMzRQLEMsWCxDYFAsIzRTLjMlYDs2WUMsIyhTK0ZVQzhTKFktMllPPVZRQTtCWU88RjwxNTYhYAotTTgxYCxgI1BgYGBgXGBgYGBgYDBDNVo1WmBgUy5CIyY6QihYIWBgYDRgMWBgJSEoKmBgYC9gQGAiYGAkYAotTWAhJCFgMGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCQ1NUAwLFZMI2AhPmBgYGA3QGBgYGBgLAotTVNIQFFGQGAkKFU+RT5IQi5gMGBgM2AoMGAkUDIiQGBgI0BMYCojJFIuMzRQLEMsWCxDYFAsIzRTLjMlYAotTTs2WUMsIyhTK0ZVQzhTKFktMllPPVZRQTtCWU88RjwnITBgYFhNK1k8TE8pJlgnVlFcJkVHKV8qWEFgIQotTWBgJDE1NiFgUD8oLGAmKGBgYCFCYGBgYGBgMEM1WjVaYGBTLkIjJjpCKFghYGAhMGAxJGA0ISgrYGBgIQotTSMwYGAsYGBgYGBgYGBgYGBgYGBgYGBgYGAjJGBgYGBgYGBgYGBgYGBgYGBgYGBgUmBgYGBgYGBgYGBgYAotTWBgYGBgYGBgIlA0YGAuT1RDSCFCRVsvLipUVVhdSEIsOU84MjU2IWBMUUQqYCJYYGBgYE5gYGBgYGBTLgotTUIjJjpgYDBDNVo1WkIoWCFgYGA8YEEkYCchKCtgYGArITBgYCMqTllMWjJPN1UiJTYzNj9CLDVJW0EpNQotTTgkYEg9MEhgL2BgYGAjUGBgYGBgISItN0k3SGAjLFooLDlKKENAJGBgYDAjYGBgJGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYDI1NiFgJUdEKmAkTGBgYCErYGBgYAotTWBgMEM1WjVaYGBTLkIjJjpCKFghYFBgWWAwYC1gYCFgOCU0MWApTUpOQUIlI1I+TC4qWDpSSCkzQThcRgotTWBFVDEsNVUnUVdWJTFaYEBWLE49MjQuOlw9JTNUS0k8U1YvI0hCOlgkRTVAMCRZXCJAYF5gYGBgL0BgYAotTWBgYCQoVT5FPkBgLFNIQFFGSEIuYDAsYCtgJGAjMGBgMCYhNSQwIjxFP0BdK0tFM0lZNlJSIiQtPURBTwotTTNILVFYN0g+PSZYW0Q9XV0+NDtXXixKRCRVNUAwKkAhIzAhNmAwYGA1QCRgYC9fX19fX19fUGAkKFU+RQotTT5AQGAxMGAhMiNCR2BgImAkMCNfYGBgYGAvX19fX1xgMWAhI2AzMEVTYCQhIUAjNWBXVE46MCRgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgISItN0k3SGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgOFgpMwotTThTNCFgNzAhYDNUJ2AwYCQoVT5FPkMoJFAqQCFeMFAoMSRJMC4zNTMsJEhcIiRVMzFFMEAtMlhQLVBMIQotTSNQLCYrIlhPJ1InWSpfXGBgYGBgYCFJNTgkI09gQFRgNUAkYGAlOCFgYCNfX19fX19fXGAhIi03STdIKAotTWAkNGBgNEBYS1BgYEAhJGBdUGBgYGAjX19fX19gJDBgMFAkVCk8UCFgMDhgVTAtXStGRCFgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYDBDNVo1WmBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgJi4iNFYsVQotTWAwJVRgMCRdIVAkYCEiLTdJN0hSISwiSGA/RCwiJDEqNCNEVTRTISovYEEtNFQ5NCgjNE4sIzwrYDBcIwotTSFCUE4rUVxBXjJPX2BgYGBgYGBKNTYhYF5QKC1gJTghYGAhNmAwYGBfX19fX19fX2BgMEM1WjVaImAhJQotTWBgJSguKyhgYChgMWAvMGBgYGBgX19fX19QISRgJCwhLSI3LGAwJCZgLTQjPzJZSWAwYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYCQoVT5FPkBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgIUNARS1DLTAkIQotTT1gJCEvMDwhYGAwQzVaNVosQDNgSmAnWSNgQSQyRWBZLTUsUDJDUCgzNS0mNSJgVStDYFciUCQvYFA4TAotTStCXD8oP0RLX1BgYGBgYGAsJTVAMC5CJCJAYDNgYGBgJFBgYGBgYCxTSEBRRkBgJChVPkU+SEIuYDAkYAotTWBgYFA1NiFgXkokKmAjUGBgYGBcYGBgYGBgMEM1WjVaYGBTLkIjJjpCKFghYGBgJWAwLGAhMCRgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgLCU1QDApU0EiQGBfYGBgYAotTS9QYGBgYGAsU0hAUUZAYCQoVT5FPkhCLmAwYGArMCgjYCJUISwzKFktM2BSLFNAUiwjYFAtMyxZLDQhTQotTTtGLFAsQyxOOzYtQyxDRFUrRl1XOyYlTitGXVI5UyE1OCQjMCFgUGAvYGBgYCNQYGBgYGAhIi03STdIYAotTSMsWigsOUooQ0AkYGAhMCErUGA0JEBIYGBgXCJgYChgYDBgYCQwJCFgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgUjU2IWAtJCglYCVYYGBgIT5gYGBgYGBTLkIjJjpgYDBDNVo1WkIoWCFgYCEsYEJcYAotTTMhKCpgYGAuIlBgSCwzKFktM2BSLFNAUiwjYFAtMyxZLDQhTTtGLFAsQyxOOzYtQyxDRFUrRl1XOyYlTgotTStGXVI5UDwlYGAjN0ghIVtcXFNFLFBbJiddJFc2QzwlJGAkYGAzKTU4JCMsLmA8YDhAYGBgJihgYGBgYAotTSEiLTdJN0hgIyxaKCw5SihDQCRgYCVgISxgITAkQExgYGAkLWBgYFBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTSwwYGBgYGBgYGBgYGBgYGBgYGBgYCMoYGBgYGBgYGBgYGBgYGBgYGBgYGArITBgYDBXTD8wRyElOzQ5RAotTTAoRExATUQnI0MtNTgkIVM0UChgK0BgYGAiWGBgYGBgIyxaKCw5SGAhIi03STdKKENAJGBgIVAiLGBgPAotTSRATGBgYEwlYGAhJVtfXFA4SCsmNlUhJEIjQCQpVC0iLFU1QDAiJzZgUGBcYGBgYC9gYGBgYGAkKFU+RQotTT5AYCxTSEBRRkhCLmAwYGAhYCxgYGAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGAjLTU4JCE9VkAsYDJQYGBgJExgYGBgYCEiLTdJN0hgIyxaKCw5SihDQCQjYCNEIQotTWBgVGBgJCFANTMkYEc3XSE8Kys/MC4zWT4jQTgzT1tZSEhUIjBUQCZOXClGTC82UDlOSEFUWCU8RT9bQAotTTQ1U0AiX0A+QklSSSVCYFM1NiFgRi1UI2AjWGBgYGBeYGBgYGBgMEM1WjVaYGBTLkIjJjpCKFghYFBgTAotTWAwYC1gYCFgOCU0UWApW04kYCFSOyRLKi5YTEdgSk85TiJBI0BYSz41KltfOlUiQ11FW08/IiJJUiE1KwotTTU2IWBdUSgtYCJIYGBgYEpgYGBgX19fX19fX19gYDBDNVo1WiJgOGBgMEBgIUAwYGAwYCQoVT5FPkpHXgotTTBcKGBgYGBgYGAiSV9ELyIyVTVAMCcmISMwYEpgYGBgKkBgYGAvX19fX19fX1BgJChVPkU+QEAmYGAkKAotTWBgOCRgYCRgISItN0k3SklfRC8iYGBgYGBgYGBKP1kjUERRNTgkYFhAQFRgKkBgYGAiSGBgYCNfX19fXwotTV9fXGAhIi03STdIKCFAYCEiYGAmIWBgIWBgMEM1WjVaSj9ZI1BAYGBgYGBgYCpHXjBcKS01NiFgKj1ILQotTWAqXGBgYCJPYGBgYGAwIT4/X19aYGAwQzVaNVoiYCElYGAiQS4rWGBgYCQxSE0uSV9ELyJbX19fXkEjKwotTSFWUGBDNitYMzJVMzE0JTIwVEBAKkIhKDUlMTArUyROLDBUKjImXVM9I0hSLFNETixDNFUrQyhVLTJYUgotTS0zYFosM0RQLGBUKjRVMFo9NylOLkctQzomNU04NyxNPTchTjwiVU88RjxaOSY1Vjo2LUUuREVOPSY1UgotTTtGNVQxViVUOTc9QT40MUU9RkVDOTNIUSMwSS04NlhaKEctUzknYFo5JkVTOFZdVjk3KEIjMEktNiNIUwotTSMwSC0iRFU1OCQiXFlgVGAtQGBgYCM4YGBgYCFgJVhgYCE4YCEiLTdJN0goYCQ4YGAiQFhQYGBgYDAoPgotTS46R14wXCtAYGBgNkVgMGBgIihgWkAsYGBgYCEhYGBgYC5fX19fSS01NiFgT0s0LmAmWGBgYCFOYGBgYAotTV9fX19fX19fYGAwQzVaNVoiYCElYGAhQC4sKGBgKGAxOkBSSV9ELyJKP1tfX1AiKWAoRGAzKzQoQjJYSQotTSRgYCFgYGBgYGBgISgkNSUxNE0mMDQxKjEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtITBUJSMwNCUhYGBgQAotTWBgJ2AjYGBAYGAkYCEpL0BgYDlAYCpHXjBcKS41NiFgIUhcKmAjOGBgYGBWYGBgYGAwIT5gYGA2YGAwQwotTTVaNVoiYCEmYGBgSC4sMGBgYCQiJ0M2SV9ELyJYYGBgJUkwJGBgYEJgLkgjYGBgYGAwMGBgYCNPX19fWgotTTNFNUAwITNFIkAhTmBgYGA7QGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgOCNDJWBgImAkNkgpSj9ZIwotTVBKR15fX1xgQjAiKWAkUlUiKEROKjFgYGAwYGBgYGBgYDIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIwotTTA0LSEwVCUjMDQtITBUJSEwMGBgKGBgIVBgUGAoYGAhYGAyM1hgYCY4YCJJX0QvIjNVNUAwIyw2IVAhTgotTWBgYGA7QGBgYC9fX19fX19fUGAkKFU+RT5AQGAxMGBgOCNDJmBgImAkNkgoSj9ZI1BKR15fX1xgQjAiKQotTWAkUlUiKEROKjFgYGAwYGBgYGBgYDIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIzA0LSEwVCUjMDQtIQotTTBUJSEwMGBgKGBgIVBgUGAoYGAhYGAyM1hgYCY4YCJJX0QvIjNVNUAwKl5VIzAhNmAwYGA1QCRgYC9fXwotTV9fX19fUGAkKFU+RT5AQGAxMGAhMiNDJ2BgImAkMCM/YGBgYGAvX19fX1xgMWAhI2AzMjU6UCQhIUAiMgotTTEzRS5gYCJgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgISItN0k3SGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgOFgpMzhTNCFgNzAhYDNUJ2AwYCQoVT5FPkMoJFAqQCFeMFAoMSRJMC4zNTMsJEhcIiRVMwotTTFFMEAtMlhQLVBMISNQLCYrIlhPJ1InWSpfXGBgYGBgYCUhNTgkYFQxUCxgO0BgYGAmWGBgYCNfX19fXwotTV9fXGAhIi03STdIKGAkNGBgJmBYUmBgYEAhJUohSkdeMFwqSV9PX19gKERgQjAhLE1AQikrQkAwYGAkYAotTWBgYGBgYCRAMTQ1JTJUOSExJEkkMUQ5JDEkJSUyVC0hMFQlIzA0LSEwVCUjMDQtITA0JGBgImBgYDxgLAotTWAiYGBgMGAkRF5gYCFGYGBKP1kjUEUhNTgkIixXUFRgS1BgYGAqXGBgYGAhYCVZX19fSGAhIi03STdIKAotTWAkNGBgKiRYUkBgYGAxJkJRWkdeMFwrT19fX1okLEwnO2AiLThPQS0rNS0lMDUpIzIiYEooJEE0NSVgTwotTSwyWFEjMEkoO1ctVC5DKFMuMlhSLTM0TixDNFUrQyhVLCNIUS4zYFAjMEkzNSNJVTxGWFo8Vi1IOTZVQQotTTxSVVU8JllQKzZdUjlTSUQ5NzlJOFY0WjI2WVQ5NylOOTcxJzg3MUU9ViVZMSY1Vjo2LUUuQyQtIkRVQQotTTtDSEI8Vy1EPCNJRDo3LUM7VzlFPEIoLSJEVTguQywtIkBUKjQlNUAwYCJcI0AhTmBgYGA7QGBgYC9fXwotTV9fX19fUGAkKFU+RT5AQGAxMGBgOCNDLGBgImAkNkgiSj9ZI1BKR15fX1xgQjAiKWAkUFBdOERPKjFgYAotTWAwYGBgYGBgYDIhJTBEOSMxNC0lMUQ1KjFENSYxJDUoMUQtJjFEOSExRCUlMUQtITBUJSEwMGBgKGBgIQotTVBgUGAoYGAhYGAyM1hgYCZYYCJJX0QvIjQ1NUAwIy9BYFBgM2BgYGAkUGBgYGBgLFNIQFFGQGAkKFU+RQotTT5IQi5gMCRgYGAhMTU2IWA4PkQjYCNQYGBgYFxgYGBgYGAwQzVaNVpgYFMuQiMmOkIoWCFgYGAlYDAwYAotTSEwJGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGA0NTVAMCtUVQotTSFgYF9gYGBgL1BgYGBgYCxTSEBRRkBgJChVPkU+SEIuYDBgYCswKCRgIlQhLDMoWS0zYFIsU0BSLCNgUAotTS0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXVc7JiVOK0ZdUjlVJTU4JCNZW0A0YC9gYGBgI1BgYGBgYAotTSEiLTdJN0hgIyxaKCw5SihDQCRgYCEwITRgYDQkQEhgYGBcImBgKGBgMGBgJDAkIWBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYCExNTYhYDkuTCpgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJQotTWBgIUAuLFRgYChgMTpAJklfRC8iSj9bX19QIilgKERgMyMjVUIyXEkkYGAhYGBgYGBgYCEoJDUiMUQtJQotTTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQlIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QAotTWAqR14wXCkyNTYhYDcxUCdgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLFhgYChgMQotTTpAIklfRC8iSj9bX19QIilgKERgMyMjVUIyXEkkYGAhYGBgYGBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JAotTTE0QSYwVDkmMUQlJjA0NSYwVCUjMDQlIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QGAqR14wXCkyNTYhYAotTTlbKC5gJVhgYGAhPmBgYGBgYFMuQiMmOmBgMEM1WjVaQihYIWBgISxgRWBgMyEoKmBgYC4iUGBILDMoWQotTS0zYFIsU0BSLCNgUC0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXVc7JiVOK0ZdUjlQPCVgYGBaKV1UTAotTT9WJ0pZT1ImOD9KKSlVXSUkYCRgYDUpNTgkYCIkUFxgOEBgYGAmKGBgYGBgISItN0k3SGAjLFooLDlKKAotTUNAJGBgJWAhNDAhMCRATGBgYCQtYGBgUGBgYGBgYGBgYGBgYGBgYGBgYGBgLDBgYGBgYGBgYGBgYGBgYAotTWBgYGBgIyhgYGBgYGBgYGBgYGBgYGBgYGBgYCshMGBgKklGSE9aJFw4W1RYIT4hRl0lUDY6JS01OCQhOAotTTMwLGA7QGBgYCZYYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAmYFhTUGBgQCElSV9aR14wXCpJX09fXwotTWAoRGBCMCEsLD82KStSQDBgYCRgYGBgYGBgJEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5IQotTTE0OSMwNC0hMDQkYGAiYGBgPGAsYCJgYGAwYCREXmBgIU5gYEo/WSNQRS01OCQjTTNgSGArQGBgYCJYYAotTWBgYGAjLFooLDlIYCEiLTdJN0ooQ0AkYGAhUCI0MGA8JEBMYGBgTCVgYCNCRShLPiQ8OV1NLEkoX0BHLAotTUMpLlk0VTVAMGAqPSJAYFxgYGBgL2BgYGBgYCQoVT5FPkBgLFNIQFFGSEIuYDBgYCFgLGBgYDBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCUtNTgkI0NIYEhgMlBgYAotTWAkTGBgYGBgISItN0k3SGAjLFooLDlKKENAJCNgI0QhYGBUYGAkIUA1NShgR1pOME1HT0VBOFtANFdPKgotTSZfMTFAJEAiJjJaSUhgLllIWT09OCkkXyU2I1I6VS9aIkYnMTRCTERLLFopSTolMzU2IWAmKjAqYCNYYAotTWBgYF5gYGBgYGAwQzVaNVpgYFMuQiMmOkIoWCFgUGBMYDBgLWBgIWA4JTUyYCohJlVLMT9LPFJFQ0lUQAotTVknPE8jTkdaQFlKXk8sWUBKUDs/TSwwWy87TTE/UFkzNTYhYDkrSC1gJTghYGAhNmAwYGBfX19fX19fXwotTWBgMEM1WjVaImAhJWBgJSguLWBgYChgMWAtOGBgYGBgX19fX19QISRgJCwhLSZRSmAwJCZgKSklLjRYSQotTWA4YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCQoVT5FPkBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgIUNARS1DLTAkIT1gJCEvMDwhYGAwQzVaNVosQDNgSmAnWSNgQSQyRWBZLTUsUDJDUCgzNS0mNSJgVQotTStDYFciUCQvYFA4TCtCXD8oP0RLX1BgYGBgYGA0VTVAMCk/QSMwIk9gYGBgS1BgYGBgJGA3R19fXkBgJAotTShVPkU+QEBgMTBgYEgzQzJgYGAhJDoqX0o/WSNQTl9fX19IMFJQPUxgKFVCXiRUTTRUNSE0RC0oKCJIQAotTTIlMTQ0IlxRK0MkLSJEQU88VzBaLEMsWStDKFUtMlhSLTM0TixDNFAuQyRZLCNgLSJFLTQuRzVSO0NJUwotTThWQUU7NiVTKzc1UDtHYE07VylHLkYxRT1GRUM5M0kpO0cxRTxGWUU9JD1BPSY1Vzg3RSQ5NzlJOFY0WgotTSwwVCozNiVOLkIpUzxWMVAuRjFJPFYtTz1GNVIoQFQqMzVAWixQVCojMEkzNTYhYE48KC5gJlhgYGAhTgotTWBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLTBgYChgMTo/SklfRC8iSj9bX19QIilgKERgMys0JAotTUIzYEkkYGAhYGBgYGBgYCEoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQtIQotTWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA5QGAqR14wXCkzNTYhYFYsMC5gJlhgYGAhTmBgYGBfX19fX19fXwotTWBgMEM1WjVaImAhJWBgIUAuLTRgYChgMTo/RklfRC8iSj9bX19QIilgKERgMyIrUkIzJEkkYGAhYGBgYAotTWBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpL2BgYEBgYCdgI2BgQAotTWBgJGAhKS9AYGA7QGAqR14wXCk0NTYhYEMvJCpgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJQotTWBgIUAuLUBgYChgMTo/OklfRC8iSj9bX19QIilgKERgMys0JEIzYEkkYGAhYGBgYGBgYCEoJDUlMTRNJgotTTA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQtIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA5QAotTWAqR14wXCk0NTYhYDQ/NCpgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLURgYChgMQotTTo/NklfRC8iSj9bX19QIilgKERgMyIrUkIzJEkkYGAhYGBgYGBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JAotTTE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpL2BgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QGAqR14wXCk1NTYhYAotTUIyKCdgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLUhgYChgMTo/MklfRC8iSj9bXwotTV9QIilgKERgMys0JEIzYEkkYGAhYGBgYGBgYCEoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIwotTTA0LSEwVCUjMDQtIWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA5QGAqR14wXCk1NTYhYDMyOCdgJlhgYGAhTgotTWBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIUAuLUxgYChgMTo/LklfRC8iSj9bX19QIilgKERgMyIrUgotTUIzJEkkYGAhYGBgYGBgYCEoJDUiMUQtJTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpLwotTWBgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QGAqR14wXCk2NTYhYD8lLCNgJlhgYGAhTmBgYGBfX19fX19fXwotTWBgMEM1WjVaImAhJWBgIUAuLVBgYChgMTo/KklfRC8iSj9bX19QIilgKERgMys4JEIzYEgkYGAhYGBgYAotTWBgYCEoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQtIWBgYEBgYCdgI2BgQAotTWBgJGAhKS9AYGA5QGAqR14wXCk2NTYhYDFFPCNgJlhgYGAhTmBgYGBfX19fX19fX2BgMEM1WjVaImAhJQotTWBgIUAuLVRgYChgMTo/JklfRC8iSj9bX19QIilgKERgMyIvUkIzJEgkYGAhYGBgYGBgYCEoJDUiMUQtJQotTTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJjA0NSYwVCUjMDQpL2BgYEBgYCdgI2BgQGBgJGAhKS9AYGA7QAotTWAqR14wXCk2NTYhYFI8UC5gLVRgYGAjPWBgYGBfX19fX19fX2BgMEM1WjVaImAhJWBgIy8uLixgYChgMQotTTo3UklfRC8iSj9bX19QIipgKEhgTlBFISQwWiksSkdeMFwoYEJAIkVgYGBAMTQ1JTJUOSExJEkkMUQ5JAotTTEkJSUyVC0hMFQlIzA0LSEwVCUjMDQtITA0JGAoJDUiMUQtJTBUNSYxNEkmMTQ5JDE0QSYwVDkmMUQlJgotTTA0NSYwVCUjMDQpLmAvXTMzNChFYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgJDBgYAotTSJQYGBgYGBgYGBgYGAuQCNgYGBgYGBgYGBgYCtgJThgYFBgIWBgJGBgQGA8YCVRLTA0RSw0VFEvNSVRIgotTTREXTc0VDRgYEAhJDJFYFktNSxQMkAhNjU2IWBXPFQuYC8sYGBgI1NgYGBgX19fX19fX19gYDBDNVo1WgotTSJgISVgYCNFLi4wYGAoYDE6NjZJX0QvIko/W19fUCIqYChIYFQxYCIkMFopLFpHXjBcKGBCQCJbYGBgQAotTTE0NSUyVDkhMSRJJDFEOSQxJCUlMlQtITBUJSMwNC0hMFQlIzA0LSEwVCRgKCQ1IjFELSUwVDUmMTRJJgotTTE0OSQxNEEmMFQ5JjFEJSYwNDUmMFQlIzA0KS5gL10zMzQoRWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYCQwYGAoMGBgYGBgYGBgYGBgLkAjYGBgYGBgYGBgYGBBYCU4YGBQYCFgYGBgYEBgUgotTWAlUS0wNEUsNFRRLzUlUSI0RF03NFQ0YGAwImBfYEhgMSRJMC4zNTMsJEhgYGBgYGBgYCFgYDQhYFFgIQotTWBgXCE1OkhgNiU1QDArXEwhUCM9YGBgYFcwYGBgL19fX19fX19QYCQoVT5FPkBAYDEwYGBTU0NGYGAiYAotTSQ2RVlKP1kjUEpHXl9fXGBCQCIqYCtMKS8xJC5CMzpJX0QvImAoSGBJMGBgKCQ1JTE0TSYwNDEqMSQ5JgotTTEkMSExNE0jMDQtITBUJSMwNC0hMFQlIzA0JSFgIiElMEQ5IzE0LSUxRDUqMUQ1JjEkNSgxRC0mMUQ5IQotTTFEJSUxRC0hMFQlIjNAI180VFUiKTBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCEkYAotTWBgTGBgYGBgYGBgYGBgI0hgUGBgYGBgYGBgYGAiUCE2YGAsYGAwYCFgYChgJ2AhPDM0JSkzJS0sM1UxPAotTTBFKS81VS0lYGAoYDEkSTAuMzUzLCRIYDY1NUAwLkswI0AjPWBgYGBXMGBgYC9fX19fX19fUGAkKFU+RQotTT5AQGAxMGBgU1NDR2BgImAkNkVYSj9ZI1BKR15fX1xgQkAiKmArTCkvISQuQjM+SV9ELyJgKEhgSTBgYAotTSgkNSUxNE0mMDQxKjEkOSYxJDEhMTRNIzA0LSEwVCUjMDQtITBUJSMwNCUhYCIhJTBEOSMxNC0lMUQ1KgotTTFENSYxJDUoMUQtJjFEOSExRCUlMUQtITBUJSIzQCNfNFRVIikwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGAhJGBgYExgYGBgYGBgYGBgYCNIYFBgYGBgYGBgYGBgIlAhNmBgLGBgMGAhYGAoYAotTSdgITwzNCUpMyUtLDNVMTwwRSkvNVUtJWBgKGAxJEkwLjM1MywkSGA2VTVAMC1AUiFQIz1gYGBgVzBgYAotTWAvX19fX19fX1BgJChVPkU+QEBgMTBgYFNTQ0hgYCJgJDZFV0o/WSNQSkdeX19cYEJAIipgK0wpLlEkLgotTUIzQklfRC8iYChIYEkwYGAoJDUlMTRNJjA0MSoxJDkmMSQxITE0TSMwNC0hMFQlIzA0LSEwVCUjMDQlIQotTWAiISUwRDkjMTQtJTFENSoxRDUmMSQ1KDFELSYxRDkhMUQlJTFELSEwVCUiM0AjXzRUVSIpMGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgISRgYGBMYGBgYGBgYGBgYGAjSGBQYGBgYGBgYGBgYAotTSJQITZgYCxgYDBgIWBgKGAnYCE8MzQlKTMlLSwzVTE8MEUpLzVVLSVgYChgMSRJMC4zNTMsJEhgNyU1QAotTTAiMl0jMCE2YDBgYDVAJGBgL19fX19fX19QYCQoVT5FPkBAYDEwYCEyI0NJYGAiYCQwIl1gYGBgYC9fXwotTV9fXGAxYCEjYDMxTDpAJCEhQCIyMTNFLiowJmBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAhIi03STdIYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGA4WCkzOFM0IWA3MCFgM1QnYDBgJChVPkU+QygkUCpAIQotTV4wUCgxJEkwLjM1MywkSFwiJFUzMUUwQC0yWFAtUEwhI1AsJisiWE8nUidZKl9cYGBgYGBgJVE1OCRgIwotTVVQWGBaMGBgYC5EYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAtTFhaQGBgQCElSTo6R14wXCpJX09fXwotTWAoSGBCQCMnO0BMMSNIRFlKP1kjUEAiKmArJGBgIiElMTQ1KzFEJSQyRDEmMUQxJDA0NSswVCUjMDQtIQotTTBUJSMwNC0hMFQlITAwYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERcYAotTV9VLS0wQjRgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAxYGBgN2BgYGBgYGBgYGBgYAotTVpgLGBgYGBgYGBgYGAhPGA1QGAjYGAkYGAwYCJgIkBgNyRVITI0UTMzJF00NyQpMjNVPTMxMGAoYDJgLwotTWAxITlMMUQ1YGBgYGAkMSo0I0RVNFMhKmAlVTU4JCMvVVBYYFowYGBgLkRgYGAjX19fX19fX1xgISItNwotTUk3SChgJDRgYC1MWFpQYGBAISVJOipHXjBcKklfT19fYChIYEJAIyc7QEgxI0hEWko/WSNQQCIqYCskYAotTWAiISUxNDUrMUQlJDJEMSYxRDEkMDQ1KzBUJSMwNC0hMFQlIzA0LSEwVCUhMDBgQDE0KSYwVDUjMTQ5JQotTTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwRFxgX1UtLTBCNGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYDFgYGA3YGBgYGBgYGBgYGBgWmAsYGBgYGBgYGBgYCE8YDVAYCNgYCRgYDBgIgotTWAiQGA3JFUhMjRRMzMkXTQ3JCkyM1U9MzEwYChgMmAvYDEhOUwxRDVgYGBgYCQxKjQjRFU0UyEqYCVZNQotTTgkIitWYFhgWjBgYGAuRGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgLUxYW2BgYEAhJUk5WkdeMFwqSQotTV9PX19gKEhgQkAjJztARDEjSERbSj9ZI1BAIipgKyRgYCIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIwotTTA0LSEwVCUjMDQtITBUJSEwMGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JjA0OSExNDkjMDQtIQotTTBEXGBfVS0tMEI0YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMWBgYDdgYGBgYGBgYAotTWBgYGBaYCxgYGBgYGBgYGBgITxgNUBgI2BgJGBgMGAiYCJAYDckVSEyNFEzMyRdNDckKTIzVT0zMTBgKAotTWAyYC9gMSE5TDFENWBgYGBgJDEqNCNEVTRTISpgJV01OCQhKVYwWGBaMGBgYC5EYGBgI19fX19fX19cYAotTSEiLTdJN0goYCQ0YGAtTFhbMGBgQCElSTlKR14wXCpJX09fX2AoSGBCQCMnO0BAMSNIRFxKP1kjUEAiKgotTWArJGBgIiElMTQ1KzFEJSQyRDEmMUQxJDA0NSswVCUjMDQtITBUJSMwNC0hMFQlITAwYEAxNCkmMFQ1IwotTTE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERcYF9VLS0wQjRgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGAxYGBgN2BgYGBgYGBgYGBgYFpgLGBgYGBgYGBgYGAhPGA1QGAjYGAkYAotTWAwYCJgIkBgNyRVITI0UTMzJF00NyQpMjNVPTMxMGAoYDJgL2AxITlMMUQ1YGBgYGAkMSo0I0RVNFMhKgotTWAmITU4JCJDVkBYYDtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWFtAYGBAISVJWCpHXgotTTBcKklfT19fYChEYEIwISxIXjopLzJEMGBgJGBgYGBgYGAkQDE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IwotTTFEOSYwNDkhMTQ5IzA0LSEwRFhgYCJgYGA8YCxgImBgYDBgJEReYGAhRmBgSj9ZI1BGJTU4JCNGIkBMYAotTTtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWFtQYGBAISVJV1pHXjBcKklfT19fYChEYAotTUIwISxIXjopLzJEMGBgJGBgYGBgYGAkQDE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IwotTTA0LSEwRFhgYCJgYGA8YCxgImBgYDBgJEReYGAhRmBgSj9ZI1BGKTU4JCM/LlA8YDtAYGBgJlhgYGAjXwotTV9fX19fX1xgISItN0k3SChgJDRgYCZgWFxgYGBAISVJV0pHXjBcKklfT19fYChEYEIwISxIXjopLzJEMAotTWBgJGBgYGBgYGAkQDE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwRFhgYCJgYAotTWA8YCxgImBgYDBgJEReYGAhRmBgSj9ZI1BGLTU4JCM5O2AsYDtAYGBgJlhgYGAjX19fX19fX1xgISItNwotTUk3SChgJDRgYCZgWFxQYGBAISVJVlpHXjBcKklfT19fYChEYEIwISxJLjopLzJAMGBgJGBgYGBgYGAkQAotTTE0KSYwVDUjMTQ5JTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwRFhgYCJgYGA8YCxgImBgYDBgJAotTUReYGAhRmBgSj9ZI1BGLTU4JCInWGBYYDtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWAotTV1gYGBAISVJVkpHXjBcKklfT19fYChEYEIwISxaPlIpL0JEMGBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJQotTTNEOSQxNC0mMFQ1MDFEQSYxJDUmMUUhJjQkJSMwNChgYCJgYGA8YCxgImBgYDBgJEReYGAhTmBgSj9ZIwotTVBGMTU4JGAvJDBMYDtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWF0wYGBAISVJVjpHXgotTTBcKklfT19fYChEYEIwISxaPlIpL0JEMGBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJTNEOSQxNC0mMFQ1MAotTTFEQSYxJDUmMUUhJjQkJSMwNChgYCJgYGA8YCxgImBgYDBgJEReYGAhTmBgSj9ZI1BGNTU4JGAmMEA8YAotTTtAYGBgJlhgYGAjX19fX19fX1xgISItN0k3SChgJDRgYCZgWF1AYGBAISVJVipHXjBcKklfT19fYChEYAotTUIwISxaPlIpL0JEMGBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJTNEOSQxNC0mMFQ1MDFEQSYxJDUmMUUhJgotTTQkJSMwNChgYCJgYGA8YCxgImBgYDBgJEReYGAhTmBgSj9ZI1BGOTU4JCNePEAsYDtAYGBgJlhgYGAjXwotTV9fX19fX1xgISItN0k3SChgJDRgYCZgWF1QYGBAISVJVVpHXjBcKklfT19fYChEYEIwISxaTlIpL0JAMAotTWBgJGBgYGBgYGAkQDA0KSEwVDkwMUUhJTNEOSQxNC0mMFQ1MDFEQSYxJDUmMUUhJjQkJSMwNChgYCJgYAotTWA8YCxgImBgYDBgJEReYGAhTmBgSj9ZI1BGOTU4JCFfWUBYYFcwYGBgLVRgYGAjX19fX19fX1xgISItNwotTUk3SChgJDRgYCxcWF5gYGBAISVJOVpHXjBcKklfT19fYChIYEJAIlslQzQxI0hEX0o/WSNQQCIqYCo0YAotTWAiISUxNDUrMUQlJDJEMSYxRDEkMDQ1KzBUJSMwNC0hMFQlIzA0LSEwVCUhMDBgQDE0KSYwVDUjMTQ5JQotTTJEOSUxRDElMiQ5IzFEOSYwNDkhMTQ5IzA0LSEwNCRgX1UtLTBCNGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYDFgYGArYGBgYGBgYGBgYGBgWmAsYGBgYGBgYGBgYGBMYDVAYCNgYCRgYDBgIgotTWAhUGA3JFUhMjRRMzMkXTQ3JCkyM1U9MzEwYCJgJDEqNCNEVTRTISpgJjk1OCQhQVlQWGBXMGBgYC1UYAotTWBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAsXFheMGBgQCElSTlKR14wXCpJX09fX2AoSGBCQCJbU1NIMQotTSNIRWBKP1kjUEAiKmAqNGBgIiElMTQ1KzFEJSQyRDEmMUQxJDA0NSswVCUjMDQtITBUJSMwNC0hMFQlIQotTTAwYEAwNCkhMFQ5MDFFISUzRDkkMTQtJjBUNTAxREEmMSQ1JjFFISY0JCUjMDQoYF9VLS0wQjRgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAxYGBgK2BgYGBgYGBgYGBgYFpgLGBgYGBgYGBgYAotTWBgTGA1QGAjYGAkYGAwYCJgIVBgNyRVITI0UTMzJF00NyQpMjNVPTMxMGAiYCQxKjQjRFU0UyEqYCY5NQotTTgkIVBaQFhgXlBgYGAvTGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgLlRYXkBgYEAhJUkxWkdeMFwqSQotTV9PX19gKEhgQkAjOSkyLDEjSEUhSj9ZI1BAIipgLCxgYCIhJTE0NSsxRCUkMkQxJjFEMSQwNDUrMFQlIwotTTA0LSEwVCUjMDQtITBUJSEwMGBAMDQpITBUOTAxRSElM0Q5JDE0LSYwVDUwMURBJjEkNSYxRSEmNCQlIwotTTA0KGBfVS0tMEI0YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMWBgYElgYGBgYGBgYAotTWBgYGBaYCxgYGBgYGBgYGBgIkRgNUBgI2BgJGBgMGAiYCNIYDckVSEyNFEzMyRdNDckKTIzVT0zMTBgLAotTWAmI0pgYCEhNEQpJTI1MTMxVSk1NCUhJWBgJGBgUEhgJGAiYDsvWyUhRDEqNCNEVTRTISpgJjk1OCQiNAotTVxgWGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFheUGBgQCElSVk6R14wXCpJX09fXwotTWAoRGBCMGBaO11eKTBQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5IQotTTE0OSMwNC0hMERQYGAiYGBgNj01OCRgKCdQTGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YAotTWAkWFhfYGBgQCElSVkqR14wXCpJX09fX2AoRGBCMGBaO11eKTBQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IwotTTE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYGAiYGBgNkE1OCRgJjRgPGA3YGBgYCVQYAotTWBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFhfMGBgQCElSVhaR14wXCpJX09fX2AoRGBCMGBaO11eKQotTTBQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYAotTWAiYGBgNk01OCQiSjZQPGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFlgMGBgQCElSQotTVdaR14wXCpJX09fX2AoRGBCMGBaO11OKTFQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJQotTTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYGAiYGBgNlE1OCRgLUJQLGA3YGBgYCVQYGBgI19fX19fX19cYAotTSEiLTdJN0goYCQ0YGAkWFlgQGBgQCElSVdKR14wXCpJX09fX2AoRGBCMGBaO11OKTFQJDBgYCRgYGBgYAotTWBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5ITE0OSMwNC0hMERQYGAiYGBgNlE1OCQhJQotTV9AWGA3YGBgYCVQYGBgI19fX19fX19cYCEiLTdJN0goYCQ0YGAkWFkhYGBgQCElSVcqR14wXCpJX09fXwotTWAoRGBCMGBaO11OKTFQJDBgYCRgYGBgYGBgYEAxNCkmMFQ1IzE0OSUyRDklMUQxJTIkOSMxRDkmMDQ5IQotTTE0OSMwNC0hMERQYGAiYGBgNlU1OCRgN09AVGA1QCRgYCU4IWBgI19fX19fX19cYCEiLTdJN0goYCQ0YAotTWA0QFkhQGBgQCEkYEhgYGBgYCNfX19fX2AkMGAwUCRUOyZIIWAwOGBERDRZM0JEIUBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgMEM1WjVaYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAmLiI0VixVYDAlVAotTWAwJF0hUCRgISItN0k3SFIhLCJIYD9ELCIkMSo0I0RVNFMhKi9gQS00VDk0KCM0TiwjPCtgMFwjIUJQTgotTStRXEFeMk9fYGBgYGBgIVE1NiFgXTokKmAhLGBgYGAzYGBgYGBgUy5CIyY6YGAwQzVaNVpCKFghYDBgYAotTWAnJTU4JCElUGBIYC9gYGBgI1BgYGBgYCEiLTdJN0hgIyxaKCw5SihDQCRgYGA0ISEwYCVgMGBgYGBgYAotTWBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCFRNTYhYEM/NCpgI1xgYGBgXwotTWBgYGBgYFMuQiMmOmBgMEM1WjVaQihYIWBgYE1gQDRgKzAkUSxDRFUsIyhTLiMoUCwjYFUsU0RRMCZVTgotTThTYFIsUllNOFYsUi4zNE47Vz1MODZYTjtXKUc8NTVAMC9YViJQYFxgYGBgL2BgYGBgYCQoVT5FPkBgLAotTVNIQFFGSEIuYDBgYCVgJVBgITAyIkBgYCNQKGBgQGAhYGBgMWAwJGBgYGBgYGBgYGBgYGBgYGBgYGBgYAotTWBgYGBgYGBgYCcpNTgkIz0uMFBgXFBgYGAvLGBgYCNfX19fX19fXGAhIi03STdIKGAkNGBgLjRZI2BgYAotTUAhJUkvOkdeMFwqSV9PX19gKEhgQkAjMVxeRDEjSEUqSj9ZI1BAIipgK0xgYCIhJTE0NSsxRCUkMkQxJgotTTFEMSQwNDUrMFQlIzA0LSEwVCUjMDQtITBUJSMwMGBAMTQpJjBUNSMxNDklMkQ5JTFEMSUyJDkjMUQ5JgotTTA0OSExNDkjMDQtITBEXGBfVS0tMEI0YGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMQotTWBgYEFgYGBgYGBgYGBgYGBaYCxgYGBgYGBgYGBgIiRgNUBgI2BgJGBgYGAiYCMoYDckVSEyNFEzMyRdNAotTTckKTIzVT0zMTBgL2AoI1wiQCEkMkVgWS01LFAyQGBgNjAhPGAlNGAhMCQjJGA0YCNQJTVKQCFTNTYhYAotTUonTCRgJVhgYGAhPmBgYGBgYFMuQiMmOmBgMEM1WjVaQihYIWBgISxgR2BgMyEoKmBgYC4iUGBILDMoWQotTS0zYFIsU0BSLCNgUC0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXVc7JiVOK0ZdUjlQPCVgYGApW0ROVgotTV08VFlPSDg/Jj0qTGA8YCYkYCRgYDctNTgkIzNRYDBgOEBgYGAmKGBgYGBgISItN0k3SGAjLFooLDlKKAotTUNAJGBgJWAhPDAhMCRATGBgYCQtYGBgUGBgYGBgYGBgYGBgYGBgYGBgYGBgLDBgYGBgYGBgYGBgYGBgYAotTWBgYGBgIyhgYGBgYGBgYGBgYGBgYGBgYGBgYCshMGBgNCwxPToyOCxZW0E1JzshLS5XJj1BNy01OCQiIwotTS4wXGArQGBgYCJYYGBgYGAjLFooLDlIYCEiLTdJN0ooQ0AkYGAhUCI8MGA8JEBMYGBgTCVgYCMsRzNPKgotTShNRltaUCMuVSM4M05UOjE9JTVAMCMtN2BgYFxgYGBgL2BgYGBgYCQoVT5FPkBgLFNIQFFGSEIuYDBgYAotTSFgLGBgYDBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYCcxNQotTTgkYEc2UGBgMlBgYGAkTGBgYGBgISItN0k3SGAjLFooLDlKKENAJCNgI0QhYGBUYGAkIUA1NyhgSDc9RwotTUZdYDxVPTpRXy5PREYuMCFPXjwiUkYtJkwoPyI2XSQoR0ssJTkpSjQ7IidNUFJdQFkjPzoxQj87MCxVVAotTTU2IWA1NVhgYCNYYGBgYF5gYGBgYGAwQzVaNVpgYFMuQiMmOkIoWCFgUGBMYDBgLWBgIWA4JTVSYCooSQotQDouNCJWRiM6QSpAUTsmQ1AjK1wkQF0zQyM9JTM8MFAmTVwjVldJS2BJTCRgCi1gCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2VhcG9uMS5zaCBiL3Rlc3RzL2VhcG9uMS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMWM4YWE2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9lYXBvbjEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLQotdXVkZWNvZGUgZWFwb24xLnB1dQotCi1lY2hvIC1uIHRlc3QgZWFwb24xLi4uCi0uLi90Y3BkdW1wIC10IC1OIC1yIGVhcG9uMS5wY2FwID4gZWFwb24xLm5ldwotaWYgZGlmZiBlYXBvbjEubmV3IGVhcG9uMS5vdXQKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2VhcG9uMi5wdXUgYi90ZXN0cy9lYXBvbjIucHV1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGFiYjIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VhcG9uMi5wdXUKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1iZWdpbiA2NDQgZWFwb24yLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGAmYGBgYGAhYGBgYF9FMUAwKDBgI2AhImBgYGAwQGBgYGBgK1ZZI10KLU1gQCNAM1VSJDhgQGAxMWBgLSI1MDBgYFchTyQ0VTgnXz5MJjpFS0JNTkBgNio2WTI/Xi46Rj5WYCQvQ0AKLU05Q0BgYGAkISJgSDk3NEZNQk0xNStRITU4JCFRR2A4YDhgYGBgLkxgYGBgYCJdTjBfMChgWCRdPEEmYCgKLU1gJDRgYC1USCdQYGBdQSVOSD02IV9XSyFGSTpYNShYJyVgIykhTTAhJWAjISxLQTA4WUElPF5FLkAuV1wKLU1WR0VBR0AkSiwzKFktM2BSLFNAUiwjYFAtMyxZLDQhTTtGLFAsQyxOOzYtQyxDRFUrRlwwNTYhYGBKMCYKLU1gJmBgYGAiKmBgYGBgYGAsIVpSJWBgTztEL1QiImAhJWBgIVxgYCFgYCRgMSMyKyFGSTpYVTgnXz5APDQKLU01KFhgOilQLSJRMGA4JCQhPEkzTD8tSVxeQ0xaWjhXJkokPCghT19fX19YLCFAYGBgRGAmIUBgYGBgKS8KLU0lQCQwYCEwMiJAYGAjUChgYEBgISQlNUAwL05gIVAhQGBgYGAnYCRgYGBgK1ZZI11gQCNAM1VSJDhgQGAKLU0xMGAhI0JAQGBgI1YkNllPVTgnXz5MJjpFS0E0Q0A8NGAvSSw8YCQ1YC8rTTVHL1xgMDwwRzo9UV1TNDwKLU1NPFcxYDJIUSxDRFUsIyhTLiMoUCwjYFUsU0RRMCZVTjhTYFIsUllNOFYsUi4zNE47USE1OCQiP0FQPGAKLU04YGBgYCw4YGBgYGBgYFAnSyg0YCJdTjBfMCgoYCQ0YGArQGBgNGBgMCEkLFk8JjpFS0M1QD9dWiFRMTQKLU1DQCJEKkBUKyUwIjxHWkBTVD8mQFgmM0RBW1ArLiFLWStAQCZfX19fX0BQJmBgYCIwYDgmYGBgYGBEXTIKLU1gMSRgNCEoK2BgYCEjMGBgLGBgMTU2IWBRUGAlYCZgYGBgI0xgYGBgYGBPO0QvVCJgLiEvNygxQCJgISUKLU1gYCM+KiIkYGAvODE7SVs1QD9dWlA5SjZOJTIuIVEwYFJITEJgMThgUEIqV0c0V14wMUxNXUI0WE4mYCcKLU02RSghKkMkUi4zNFAsQyxYLENgUCwjNFMuMyVgOzZZQywjKFMrRlVDOFMoWS0yWU8kNTVAMCFQJiEwIUAKLU1gYGBgIUAkYGBgYGAjYD5MQTBgK1ZZI11gQEBgMTBgYF5gYCIwYCFgJDBSRFA5SjZOLTYhX1dIJyUlMi4KLU1gLjI+RFAoNmAtUDA0VE4+Jk8iXFdMJUAsLmAxVjE0MiJgO19fX19eI2A4YGBgKWAhQDhgYGBgIiZDSGAKLU1gYCRXJDMyYCtVPDE7TFM2MkJdNTgkITpIQDhgOGBgYGAuTGBgYGBgIl1OMF8wKGBYJF08QSZgKGAkNGAKLU1gLVRIKWBgYF1BJU5HLTYhX1dLIUZJOlg1KFgnJWAjKUdfKCEmYCMhOElAXCxKNUREUkdFTT5ATT5BPUcKLU1CMCRKLDMoWS0zYFIsU0BSLCNgUC0zLFksNCFNO0YsUCxDLE47Ni1DLENEVStGXE81NiFgRyo8JmAmYGAKLU1gYCIqYGBgYGBgYCwhWlIlYGBPO0QvVCIiYCElYGAhXGBgLWBgJGAxIzFfIUZJOlhVOCdfPkA8NDUoWGAKLU06IzxGIlFAYDgkVlhKXFpbJ0YlXlJDSz9CNENeKDZUKCFPX19fX1gsIUBgYGBEYCYhQGBgYGApLyVAJE8KLU1gITAyIkBgYCNQKGBgQGAhLDU1QDAtUy9gMCFAYGBgYCdgJGBgYGArVlkjXWBAI0AzVVIkOGBAYDEwYCEKLU0jQkBFYGAjViQ2WUpVOCdfPkwmOkVLQTRDQDw0YC9IMiRQJDlgLyk2SFA3SDhSMChPPE9dOi8iNEAwPSUKLU1gMkhRLENEVSwjKFMuIyhQLCNgVSxTRFEwJlVOOFNgUixSWU04VixSLjM0TjtTJTU4JCE3VUAkYDhgYGAKLU1gLDhgYGBgYGBgUCdLKDRgIl1OMF8wKChgJDRgYCtAYCEkYGAwISQsWEwmOkVLQzVAP11aIVExNENAIkQKLU1aMiwrJjAiPChZM1hQIWBDXk5WKUpbLVErUFUzIkBAJl9fX19fQFAmYGBgIjBgOCZgYGBgYERdMmAzYGAKLU00ISgrYGBgISMwYGAsYGBRNTYhYCRKWC1gJmBgYGAjTGBgYGBgYE87RC9UImAuIS83KDFAImAhJWBgIz4KLU0qIjhgYC84MTtJRzVAP11aUDlKNk4lMi4hUTBgUkBXQ2AxSGBQQ1MvPyZRSElUOFNYLlsyIz1bUzY4SCEKLU0qQyRSLjM0UCxDLFgsQ2BQLCM0Uy4zJWA7NllDLCMoUytGVUM4UyhZLTJZTyw1NUAwI1ZTIzAhQGBgYGAKLU0hQCRgYGBgYCNgPkxBMGArVlkjXWBAQGAxMGBgXmBgJTBgIWAkMFJBUDlKNk4tNiFfV0gnJSUyLmAuM0IKLU1NUCg6YC1TKlooPzlIMzQpJkFCMCI6RDk8IU8pImA7X19fX14jYDhgYGApYCFAOGBgYGAiJkNIYGBgJFcKLU0kMzIxUD1UM0FERS1YVSE1OCQiJERAYGA4YGBgYC5MYGBgYGAiXU4wXzAoYFgkXTxBJmAoYCQ0YGAtVEgKLU0qYGBgXUElTkYtNiFfV0shRkk6WDUoWCclYCMpWyVIISZQIyFQQjxXNyw7MSMlVUFGIi1WKk9SQzkwJEoKLU0sMyhZLTNgUixTQFIsI2BQLTMsWSw0IU07RixQLEMsTjs2LUMsQ0RVK0ZdMDU2IWA4STxgYCZgYGBgIioKLU1gYGBgYGBgLCFaUiVgYE87RC9UIiJgISVgYCFcYGA5YGAkYDEjMVMhRkk6WFU4J18+QDw0NShYYDojMCUKLU0iUUxgOChOOl5ONUwoRUsmI0g2LSc6VSRYVigoIU9fX19fWCwhQGBgYERgJiFAYGBgYCkvJUAlMGAhMDIKLU0iQGBgI1AoYGBAYCE0NTVAMCpWTCIwIUBgYGBgJ2AkYGBgYCtWWSNdYEAjQDNVUiQ4YEBgMTBgISNCQEkKLU1gYCNWJDZZRlU4J18+TCY6RUtBNENAPDRgL0tERlAkPGAvK0gkUjhQOShCIldbXkc8NCEiSEtRK2AySFEKLU0sQ0RVLCMoUy4jKFAsI2BVLFNEUTAmVU44U2BSLFJZTThWLFIuMzROO1UlNTgkIlpMQERgOGBgYGAsOGAKLU1gYGBgYGBQJ0soNGAiXU4wXzAoKGAkNGBgK0BgIVRgYDAhJCxXXCY6RUtDNUA/XVohUTE0Q0AiREk9QCsKLU0nYCI8R14kUD47KiE+JkZZO0M/Mi8pVDc0YEAmX19fX19AUCZgYGAiMGA4JmBgYGBgRF0yYDUkYDQhKCsKLU1gYGAhIzBgYCxgITI1NiFgQFNMJWAmYGBgYCNMYGBgYGBgTztEL1QiYC4hLzcoMUAiYCElYGAjPioiSGAKLU1gLzgxO0k3NUA/XVpQOUo2TiUyLiFRMGBSSSJUYDFUYFBFOl5QNkpIQF1VJEQqIUMjOENPMFVQISpDJFIKLU0uMzRQLEMsWCxDYFAsIzRTLjMlYDs2WUMsIyhTK0ZVQzhTKFktMllPNEU1QDAnTWAhMCFAYGBgYCFAJGAKLU1gYGBgI2A+TEEwYCtWWSNdYEBAYDEwYGBeYGAoMGAhYCQwUj5QOUo2Ti02IV9XSCclJTIuYC4yPCZAKD0KLU1gLVAmXVdHSE5CKytaMEsmQSJeQjwyUy8iYDtfX19fXiNgOGBgYClgIUA4YGBgYCImQ0hgYGAkVyQzMkYKLU09RFRAJlxEWy9HITU4JCFPVzA0YDhgYGBgLkxgYGBgYCJdTjBfMChgWCRdPEEmYChgJDRgYC1USCpQYGAKLU1dQSVORT02IV9XSyFGSTpYNShYJyVgIykqOkQhJ0AjIUlbRCszP0MrLi9LLWAvPkFTIldeUDAkSiwzKFkKLU0tM2BSLFNAUiwjYFAtMyxZLDQhTTtGLFAsQyxOOzYtQyxDRFUrRl1QNTYhYEw+KCVgJmBgYGAiKmBgYGAKLU1gYGAsIVpSJWBgTztEL1QiImAhJWBgIVxgYEVgYCRgMSMxRyFGSTpYVTgnXz5APDQ1KFhgOmAuViJRWGAKLU04K1AvISpZIVJaPigvOkMuJS9BNjJcKCghT19fX19YLCFAYGBgRGAmIUBgYGBgKS8lQCVQYCEwMiJAYGAKLU0jUChgYEBgITw1NUAwKSpII0AhQGBgYGAnYCRgYGBgK1ZZI11gQCNAM1VSJDhgQGAxMGAhI0JATGBgI1YKLU0kNllDVTgnXz5MJjpFS0E0Q0A8NGAvSkxIQCQ/YC8qLk0iLkQ8Pk00LEtMPS4oOiJbLUY7YDJIUSxDRFUKLU0sIyhTLiMoUCwjYFUsU0RRMCZVTjhTYFIsUllNOFYsUi4zNE47VyU1OCQjJEtAWGA4YGBgYCw4YGBgYGAKLU1gYFAnSyg0YCJdTjBfMCgoYCQ0YGArQGAiRGBgMCEkLFcsJjpFS0M1QD9dWiFRMTRDQCJESzdEKydQIjwKLU1NV1ZQSk86WENgSkVZIzE1PDVVMFpAQCZfX19fX0BQJmBgYCIwYDgmYGBgYGBEXTJgNyRgNCEoK2BgYCEKLU0jMGBgLGAhUjU2IWBTIzQqYCZgYGBgI0xgYGBgYGBPO0QvVCJgLiEvNygxQCJgISVgYCM+KiJUYGAvODEKLU07SSs1QD9dWlA5SjZOJTIuIVEwYFJFPjFgMmBgUEsrIl0/VUNWXUcxSTwtK1gxNj8wK0whKkMkUi4zNFAKLU0sQyxYLENgUCwjNFMuMyVgOzZZQywjKFMrRlVDOFMoWS0yWU88RTVAMCwsWiJAIUBgYGBgIUAkYGBgYGAKLU0jYD5MQTBgK1ZZI11gQEBgMTBgYF5gYCswYCFgJDBSO1A5SjZOLTYhX1dIJyUlMi5gLjFNJVAoQGAtUEoKLU09P0gnNjwxPVVEJjpGUlZBLFYrUyJgO19fX19eI2A4YGBgKWAhQDhgYGBgIiZDSGBgYCRXJDMyUlZSRT0KLSRJJVBcMDBgYAotYAotZW5kCmRpZmYgLS1naXQgYS90ZXN0cy9lc3Atc2VjcmV0cy50eHQgYi90ZXN0cy9lc3Atc2VjcmV0cy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODQ3YTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwLXNlY3JldHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jIGEgY29tbWVudAotCi0weDEyMzQ1Njc4QDE5Mi4xLjIuNDUgM2Rlcy1jYmMtaG1hYzk2OjB4NDM0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1ODQwCi0weGFiY2RhYmNkQDE5Mi4wLjEuMSAgM2Rlcy1jYmMtaG1hYzk2OjB4NDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTg0MDQzCi0weGQxMjM0NTY3QDE5Mi4xLjIuNDUgYWVzMjU2LWNiYy1obWFjOTY6MHhhYWFhYmJiYmNjY2NkZGRkNDA0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4CmRpZmYgLS1naXQgYS90ZXN0cy9lc3AwLm91dCBiL3Rlc3RzL2VzcDAub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGRkZjFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcDAub3V0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDEpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDIpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDMpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTE2CmRpZmYgLS1naXQgYS90ZXN0cy9lc3AwLnNoIGIvdGVzdHMvZXNwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNDA3Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3AwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyEvYmluL3NoCi0KLWVjaG8gLW4gdGVzdCBlc3AwLi4uCi11dWRlY29kZSAwMi1zdW5yaXNlLXN1bnNldC1lc3AucHV1Ci1pZiAoLi4vdGNwZHVtcCAtdCAtbiAtciAwMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcCB8IGRpZmYgLSBlc3AwLm91dCkKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0JCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDEuZ2RiaW5pdCBiL3Rlc3RzL2VzcDEuZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4YWU4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3AxLmdkYmluaXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZXQgYXJncyAtdCAtbiAtRSAiMHgxMjM0NTY3OEAxOTIuMS4yLjQ1IDNkZXMtY2JjLWhtYWM5NjoweDQwNDM0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1OCIgLXIgMDItc3VucmlzZS1zdW5zZXQtZXNwLnBjYXAgCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AxLm5ldyBiL3Rlc3RzL2VzcDEubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIyOTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcDEubmV3CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDEpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDEyODAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIwNDgsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg1KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI4MTYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg4KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDEub3V0IGIvdGVzdHMvZXNwMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjI5NjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTI4MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDIpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDE1MzYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNzkyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjA0OCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIzMDQsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg2KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyNTYwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjgxNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDMwNzIsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwMS5zaCBiL3Rlc3RzL2VzcDEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZWUzYjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwMS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMhL2Jpbi9zaAotCi11dWRlY29kZSAwMi1zdW5yaXNlLXN1bnNldC1lc3AucHV1Ci0KLWVjaG8gLW4gdGVzdCBlc3AxLi4uCi0uLi90Y3BkdW1wIC10IC1uIC1FICIweDEyMzQ1Njc4QDE5Mi4xLjIuNDUgM2Rlcy1jYmMtaG1hYzk2OjB4NDA0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4IiAtciAwMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcCA+ZXNwMS5uZXcKLWlmIGRpZmYgZXNwMS5uZXcgZXNwMS5vdXQKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDIuZ2RiaW5pdCBiL3Rlc3RzL2VzcDIuZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxODQwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3AyLmdkYmluaXQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zZXQgYXJncyAtdCAtbiAtRSAiMHgxMjM0NTY3OEAxOTIuMS4yLjQ1IDNkZXMtY2JjLWhtYWM5NjoweDQzNDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTg0MCwweGFiY2RhYmNkQDE5Mi4wLjEuMSAzZGVzLWNiYy1obWFjOTY6MHg0MzQ1NDU0NjQ2NDk0OTRhNGE0YzRjNGY0ZjUxNTE1MjUyNTQ1NDU3NTc1ODQwNDMiIC1yIDA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucGNhcCAKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDIubmV3IGIvdGVzdHMvZXNwMi5uZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjljOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwMi5uZXcKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgxKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxMjgwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNzkyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NCksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg0KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMDQ4LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NSksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg1KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NiksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg2KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyNTYwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NyksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg3KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyODE2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg4KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDIub3V0IGIvdGVzdHMvZXNwMi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MjljOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgxKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxMjgwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNzkyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NCksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg0KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMDQ4LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NSksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg1KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NiksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg2KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyNTYwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NyksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg3KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyODE2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxNzI6IElQIDE5Mi4xLjIuMjMgPiAxOTIuMC4xLjE6IEVTUChzcGk9MHhhYmNkYWJjZCxzZXE9MHg4KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDIuc2ggYi90ZXN0cy9lc3AyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGE3MDgzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcDIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLQotdXVkZWNvZGUgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wdXUKLQotZWNobyAtbiB0ZXN0IGVzcDIuLi4KLS4uL3RjcGR1bXAgLXQgLW4gLUUgIjB4MTIzNDU2NzhAMTkyLjEuMi40NSAzZGVzLWNiYy1obWFjOTY6MHg0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4NDAsMHhhYmNkYWJjZEAxOTIuMC4xLjEgM2Rlcy1jYmMtaG1hYzk2OjB4NDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTg0MDQzIiAtciAwOC1zdW5yaXNlLXN1bnNldC1lc3AyLnBjYXAgPmVzcDIubmV3Ci1pZiBkaWZmIGVzcDIubmV3IGVzcDIub3V0Ci10aGVuCi0JZWNobyBwYXNzZWQuCi1lbHNlCi0JZWNobyBmYWlsZWQuCi1maQotCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AzLmdkYmluaXQgYi90ZXN0cy9lc3AzLmdkYmluaXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNTAxMTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwMy5nZGJpbml0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2V0IGFyZ3MgLXQgLW4gLUUgIjNkZXMtY2JjLWhtYWM5NjoweDQzNDM0NTQ1NDY0NjQ5NDk0YTRhNGM0YzRmNGY1MTUxNTI1MjU0NTQ1NzU3NTg0MCIgLXIgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwIApkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwMy5uZXcgYi90ZXN0cy9lc3AzLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiMjk2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3AzLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgxKSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxMjgwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTUzNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDMpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDE3OTIsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg0KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMDQ4LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4NSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjMwNCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTE2OiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI1NjAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg3KSwgbGVuZ3RoIDExNjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyODE2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMzA3MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCmRpZmYgLS1naXQgYS90ZXN0cy9lc3AzLnNoIGIvdGVzdHMvZXNwMy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyYmVhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3AzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIDAyLXN1bnJpc2Utc3Vuc2V0LWVzcC5wdXUKLWVjaG8gLW4gdGVzdCBlc3AzLi4uCi0gLi4vdGNwZHVtcCAtdCAtbiAtRSAiM2Rlcy1jYmMtaG1hYzk2OjB4NDA0MzQzNDU0NTQ2NDY0OTQ5NGE0YTRjNGM0ZjRmNTE1MTUyNTI1NDU0NTc1NzU4IiAtciAwMi1zdW5yaXNlLXN1bnNldC1lc3AucGNhcCA+ZXNwMy5uZXcKLWlmIGRpZmYgZXNwMy5uZXcgZXNwMS5vdXQKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDQuZ2RiaW5pdCBiL3Rlc3RzL2VzcDQuZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwNzQ0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3A0LmdkYmluaXQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXNldCBhcmdzIC10IC1uIC1FICJmaWxlIGVzcC1zZWNyZXRzLnR4dCIgLXIgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwIAotCmRpZmYgLS1naXQgYS90ZXN0cy9lc3A0Lm5ldyBiL3Rlc3RzL2VzcDQubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODI5YzhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcDQubmV3CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDEpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTI4MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDIpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTUzNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDMpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4MyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjA0OCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NSksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjMwNCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NiksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4NyksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjgxNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTcyOiBJUCAxOTIuMS4yLjIzID4gMTkyLjAuMS4xOiBFU1Aoc3BpPTB4YWJjZGFiY2Qsc2VxPTB4OCksIGxlbmd0aCAxMTY6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMzA3MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpIChpcGlwLXByb3RvLTQpCmRpZmYgLS1naXQgYS90ZXN0cy9lc3A0LnNoIGIvdGVzdHMvZXNwNC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhMjZlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3A0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIDA4LXN1bnJpc2Utc3Vuc2V0LWVzcDIucHV1Ci0KLWVjaG8gLW4gdGVzdCBlc3A0Li4uCi0uLi90Y3BkdW1wIC10IC1uIC1FICJmaWxlIGVzcC1zZWNyZXRzLnR4dCIgLXIgMDgtc3VucmlzZS1zdW5zZXQtZXNwMi5wY2FwID5lc3A0Lm5ldwotaWYgZGlmZiBlc3A0Lm5ldyBlc3AyLm91dAotdGhlbgotCWVjaG8gcGFzc2VkLgotZWxzZQotCWVjaG8gZmFpbGVkLgotZmkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwNS5nZGJpbml0IGIvdGVzdHMvZXNwNS5nZGJpbml0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjU3OGUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcDUuZ2RiaW5pdAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc2V0IGFyZ3MgLXQgLW4gLUUgImZpbGUgZXNwLXNlY3JldHMudHh0IiAtciAwOC1zdW5yaXNlLXN1bnNldC1hZXMucGNhcCAKLQotCmRpZmYgLS1naXQgYS90ZXN0cy9lc3A1Lm5ldyBiL3Rlc3RzL2VzcDUubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2YzNWUwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcDUubmV3CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDEpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDEyODAsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHgyKSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNTM2LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4MyksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTc5MiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDQpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIwNDgsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg1KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyMzA0LCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4NiksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjU2MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDcpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDI4MTYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg4KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAzMDcyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcDUub3V0IGIvdGVzdHMvZXNwNS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZjM1ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwNS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4MSksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMTI4MCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDIpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDE1MzYsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHgzKSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAxNzkyLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4NCksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjA0OCwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDUpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDIzMDQsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQotSVAgMTkyLjEuMi4yMyA+IDE5Mi4xLjIuNDU6IEVTUChzcGk9MHhkMTIzNDU2NyxzZXE9MHg2KSwgbGVuZ3RoIDEzMjogSVAgMTkyLjAuMi4xID4gMTkyLjAuMS4xOiBJQ01QIGVjaG8gcmVxdWVzdCwgaWQgMjg0MTYsIHNlcSAyNTYwLCBsZW5ndGggNjQgKGlwaXAtcHJvdG8tNCkKLUlQIDE5Mi4xLjIuMjMgPiAxOTIuMS4yLjQ1OiBFU1Aoc3BpPTB4ZDEyMzQ1Njcsc2VxPTB4NyksIGxlbmd0aCAxMzI6IElQIDE5Mi4wLjIuMSA+IDE5Mi4wLjEuMTogSUNNUCBlY2hvIHJlcXVlc3QsIGlkIDI4NDE2LCBzZXEgMjgxNiwgbGVuZ3RoIDY0IChpcGlwLXByb3RvLTQpCi1JUCAxOTIuMS4yLjIzID4gMTkyLjEuMi40NTogRVNQKHNwaT0weGQxMjM0NTY3LHNlcT0weDgpLCBsZW5ndGggMTMyOiBJUCAxOTIuMC4yLjEgPiAxOTIuMC4xLjE6IElDTVAgZWNobyByZXF1ZXN0LCBpZCAyODQxNiwgc2VxIDMwNzIsIGxlbmd0aCA2NCAoaXBpcC1wcm90by00KQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwNS5zaCBiL3Rlc3RzL2VzcDUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWI2NzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwNS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMhL2Jpbi9zaAotCi11dWRlY29kZSAwOC1zdW5yaXNlLXN1bnNldC1hZXMucHV1Ci0KLWVjaG8gLW4gdGVzdCBlc3A1Li4uCi0uLi90Y3BkdW1wIC10IC1uIC1FICJmaWxlIGVzcC1zZWNyZXRzLnR4dCIgLXIgMDgtc3VucmlzZS1zdW5zZXQtYWVzLnBjYXAgPiBlc3A1Lm5ldwotaWYgZGlmZiBlc3A1Lm5ldyBlc3A1Lm91dAotdGhlbgotCWVjaG8gcGFzc2VkLgotZWxzZQotCWVjaG8gZmFpbGVkLgotZmkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwdWRwMS5uZXcgYi90ZXN0cy9lc3B1ZHAxLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk5OWZmNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3B1ZHAxLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgxKSwgbGVuZ3RoIDExNgotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgyKSwgbGVuZ3RoIDExNjogIGlwLXByb3RvLTIyNyA0OQotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHgzKSwgbGVuZ3RoIDExNjogUElNdjEzLCBsZW5ndGg6IDEwCi1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDQpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDUpLCBsZW5ndGggMTE2Ci1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDYpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tMTgzIDI4Ci1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDcpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tNzIgMzQKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuNDUuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4OCksIGxlbmd0aCAxMTY6ICBpcC1wcm90by0yMjQgNTkKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEub3V0IGIvdGVzdHMvZXNwdWRwMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTlmZjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwdWRwMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuNDUuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MSksIGxlbmd0aCAxMTYKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuNDUuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MiksIGxlbmd0aCAxMTY6ICBpcC1wcm90by0yMjcgNDkKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuNDUuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4MTIzNDU2Nzgsc2VxPTB4MyksIGxlbmd0aCAxMTY6IFBJTXYxMywgbGVuZ3RoOiAxMAotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg0KSwgbGVuZ3RoIDExNgotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg1KSwgbGVuZ3RoIDExNgotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg2KSwgbGVuZ3RoIDExNjogIGlwLXByb3RvLTE4MyAyOAotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi40NS40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHgxMjM0NTY3OCxzZXE9MHg3KSwgbGVuZ3RoIDExNjogIGlwLXByb3RvLTcyIDM0Ci1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjQ1LjQ1MDA6IFVEUC1lbmNhcDogRVNQKHNwaT0weDEyMzQ1Njc4LHNlcT0weDgpLCBsZW5ndGggMTE2OiAgaXAtcHJvdG8tMjI0IDU5CmRpZmYgLS1naXQgYS90ZXN0cy9lc3B1ZHAxLnBjYXAgYi90ZXN0cy9lc3B1ZHAxLnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzODdmOWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZXNwdWRwMS5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvZXNwdWRwMS5wdXUgYi90ZXN0cy9lc3B1ZHAxLnB1dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzYzFjOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9lc3B1ZHAxLnB1dQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWJlZ2luIDY0NCBlc3B1ZHAxLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCZgYGAhYGBgYGBgYGBgYGBgYGAiPmBgYGBHQGBgYCFgYGAmMUQKLU0xMWBgYCYxRChQQGAxMGBgRCo4LmBgIWAkNWAoUGAkIiVcYCFgQlQxRSEmNGAnUGBgIShUNUdAYGBgYCEKLU1JUUkxV0FSWSoyLiwzKk4+XEU0LU1WMCJRMCZCOVJHXENIXVo/Ri5KMlUySjY/OSIlV0hJKSxQQ0M0LlQKLU1QSFUxRDIsS1Q2Ii4zVEdgMVI6ViRFNydGRVtdUEclMSNcISdPPTE7OSJQWyNRKlU7RFUxMjw5Qk8kOi8KLU0oQUkyUyosQks1SF9ZVktDLF1LJ0BbWV5gYGBgYGBgYGBgIj5gYGBgR0BgYGAhYGBgJjFEMTFgYGAmMUQKLU0oUEBgMTBgYEQqOC9gYCFgJDVgJ1BgJCIlXGAhYEJUMUUhJjRgJ1BgYCEoVDVHQGBgYGAiKjMkSCkqXksKLU1HNjUhOT9VXltPPikvKkQxIiZXTlVOQD1CR0paViQ7RTEyPCRKJFNHT0FGSiE8NSlPJT1OWTpIWVxCJDMKLU0hKlEuTi0tVS86X0ZeO0wtSDA+WyQ5QVUwXFFQImBGNUpEOEdZMzA3XFNERDU9WVxHQCUoJzc2UjVPYEcKLU1BLzJgPSwkVldGXTBbTFwqYGBgYGBgYGBgYCI+YGBgYEdAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGAKLU1EKjgwYGAhYCQ1YCZQYCQiJVxgIWBCVDFFISY0YCdQYGAhKFQ1R0BgYGBgI0NdIVxSO0skSC9ZWDc+VDYKLU1aVDY+LzJJWytRNCYqXTdBYFZMQilbJUFfL01LUU1YLTpSIi0pREEuW0c+KVw1XUtGI1o1OjNMK0pDTUMKLU1YREhLQkUlL1ElRDFWViM9P1wzSkVaPzgpJlszWyg0RiI0KjBXIkIpLiJbLj8wVSg3ISFaMl82OTowRFYKLU05OEgkOFIlPWBgYGBgYGBgYGAiPmBgYGBHQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgRCo4MWBgIWAKLU0kNWAlUGAkIiVcYCFgQlQxRSEmNGAnUGBgIShUNUdAYGBgYCRGVjg9XCpHUihAX1smVEYyJjMnQVo5KVEKLU0qP0BbKE0hSTpJRSJALT80VzVURVotNUAoRlw2MTMlVjE5TCMlW1hDSkZKWV5HNEJWVyJPXC8qWFwhQTYKLU1AMTxbNEooNSs2ME04XTlSPiQ9XFRVPlhYN0FCN1xUJzFXMUhBUFhbKEtQVFZOIipORUMpRS83QDVEXzEKLU1gYGBgYGBgYGBgIj5gYGBgR0BgYGAhYGBgJjFEMTFgYGAmMUQoUEBgMTBgYEQqODJgYCFgJDVgJFBgJCIKLU0lXGAhYEJUMUUhJjRgJ1BgYCEoVDVHQGBgYGAlPUBDUkE0OU8wRDtBMUBUNVtXUiRRNT9ZKFxNWz5EQEMKLU1SRksrJDVJJVk4Ojg1S2ApJkxaLlFARyZOKTgtUkdAMjtHTllKXDJPQzlaVj8sSVQ3SEpVN0smRE0vMV8KLU06SystOEtYWTQ/MjIqOD0uMUBPPCwjUiY7XlIyUGA+UEFSOUU3Kj4hPjMqRDI0T0s0KkMxYGBgYGBgYGAKLU1gYCI+YGBgYEdAYGBgIWBgYCYxRDExYGBgJjFEKFBAYDEwYGBEKjgzYGAhYCQ1YCNQYCQiJVxgIWBCVDEKLU1FISY0YCdQYGAhKFQ1R0BgYGBgJk9URiskPVNNW1kuPVU4RT45ViY2OVI6TVwuMSZMQV0kIzlRXjorRTcKLU1RRSNFXikxUl0tLT9PXVNXISU3XUtCPDdcTUxSNTZePEhULkQuIjRBNU0xTEJCN0ZOWDdEUC1DJCZBSF0KLU0rJzpWTCQwVilbW0tTQ0FXW1lBLD5XWCkjPykvSUpSPF9AQzkxTkdgKFNeU2BgYGBgYGBgYGAiPmBgYGAKLU1HQGBgYCFgYGAmMUQxMWBgYCYxRChQQGAxMGBgRCo4NGBgIWAkNWAiUGAkIiVcYCFgQlQxRSEmNGAnUGAKLU1gIShUNUdAYGBgYCchMTI5MzNEVEMxUlNUTiouLzRaQ0UlQThHR1ZMOjtAYC4lJzhNRUEuQzcvNl1EW1MKLU1PMUMoW0QvTjZdJVs/TklTUj4xVzFFRSwpPVxJOSYuUEYtJ1EqTFhaUVU3MTEwMC5bXCwtSEs0MUczL1IKLU1HOURZJCxdLihNNThVMVwwWFRcNFJbPD1SQ0NYTTtfJUFWTSlgYGBgYGBgYGBgIj5gYGBgR0BgYGAhYGAKLU1gJjFEMTFgYGAmMUQoUEBgMTBgYEQqODVgYCFgJDVgIVBgJCIlXGAhYEJUMUUhJjRgJ1BgYCEoVDVHQGAKLU1gYGAoKl8zTDYmREVgNjVRUVBBIkBCQVE1RllAPSUsK11AQzlLK08pQF0sL0dDSTQlLE1LSTI4MigwTTkKLU0qPEAvPUwuREIiKipFTSI6KjJLSktgXkg9MFlNLCReW2A9TCUoUk8sT188NGBNTktKKjpeOVc4QDFCUCQKLTU5TEtgLTopVlEvPTJCOzEnNEZWM0I/TF0yO08hCi1gCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2VzcHVkcDEuc2ggYi90ZXN0cy9lc3B1ZHAxLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWRjMGE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2VzcHVkcDEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIS9iaW4vc2gKLQotdXVkZWNvZGUgZXNwdWRwMS5wdXUKLQotZWNobyAtbiB0ZXN0IGVzcHVkcDEuLi4KLS4uL3RjcGR1bXAgLXQgLW4gLUUgImZpbGUgZXNwLXNlY3JldHMudHh0IiAtciBlc3B1ZHAxLnBjYXAgPmVzcHVkcDEubmV3Ci1pZiBkaWZmIGVzcHVkcDEubmV3IGVzcHVkcDEub3V0Ci10aGVuCi0JZWNobyBwYXNzZWQuCi1lbHNlCi0JZWNobyBmYWlsZWQuCi1maQotCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnBjYXAgYi90ZXN0cy9pc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNGFkYTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvaXNha21wLWRlbGV0ZS1zZWdmYXVsdC5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wLWRlbGV0ZS1zZWdmYXVsdC5wdXUgYi90ZXN0cy9pc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnB1dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1MTJiMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnB1dQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLWJlZ2luIDY0NCBpc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCRgYGAhYGBgYEAiWGBgYGBgYGAiSWBAYGBKMChgYC9fX19fX18KLU1fUCQhYDAkIWAwQGAxMGBgSUBgTzBgIWAkM1BBP1BgYGA3XGBgYCQhXWAnVGA8QGBgIU4zJCwrXC83S14KLU0zU0YhRlInSDY/VCxPS1hOJllIPTVULEFFWUglUkAoQDcxK0M2NSNfX19cYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLSFgYGBgCi1gCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wY2FwIGIvdGVzdHMvaXNha21wLWlkZW50aWZpY2F0aW9uLXNlZ2ZhdWx0LnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGYwNGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvaXNha21wLWlkZW50aWZpY2F0aW9uLXNlZ2ZhdWx0LnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucHV1IGIvdGVzdHMvaXNha21wLWlkZW50aWZpY2F0aW9uLXNlZ2ZhdWx0LnB1dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwYWUwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXAtaWRlbnRpZmljYXRpb24tc2VnZmF1bHQucHV1CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmVnaW4gNjQ0IGlzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wY2FwCi1NVSwuUkgwKGAhYGBgYGBgYGBgYGBgL19fYGBgYGBgYGBIViVAMCJfKiNAYFxgMGBgL2AkYGBgKGBgYCElCi1NYGAkWEgmUGBgL1wxJyQ5X2BgYCE/UGBgYDAnVWA/MCEpJEtMKTlFUEMoMVpCUChgYGBgYGBgYGBgYDQwCi1NYEBgYGBgYGBgYGAhJ2BgYGAwYCJgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi1NYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi1NYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi1NYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi1NYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi1JYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAKLWAKLWVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wLXBvaW50ZXItbG9vcC5wY2FwIGIvdGVzdHMvaXNha21wLXBvaW50ZXItbG9vcC5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhkYTBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2lzYWttcC1wb2ludGVyLWxvb3AucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcC1wb2ludGVyLWxvb3AucHV1IGIvdGVzdHMvaXNha21wLXBvaW50ZXItbG9vcC5wdXUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTgyNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvaXNha21wLXBvaW50ZXItbG9vcC5wdXUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWJlZ2luIDY0NCBpc2FrbXAtcG9pbnRlci1sb29wLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGAvX19gYGAhYGBgYERSOzUvW19AITAhKGBgYGAyYGBgYGBgJDZEW0gKLU1FYGAiKzZfOl1AQGAxMGBgLkg9RTBgI1MkMEhCQDpLWT9IJkpeNTwhXWAnVGAiO1I/QGBgYGBgYGBgYGAKLTZgYGBgYGBgYGBgYCgkYCRgYGBgYGBgYGBgYGAqYGBgYAotYAotZW5kCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAxLm91dCBiL3Rlc3RzL2lzYWttcDEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2E2ZWQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2lzYWttcDEub3V0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSVAgMTI3LjAuMC4xLjUwMCA+IDEyNy4wLjAuMS41MDA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgPyAjMTkwW0NdCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAxLnNoIGIvdGVzdHMvaXNha21wMS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyZGU3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXAxLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIGlzYWttcC1kZWxldGUtc2VnZmF1bHQucHV1Ci0KLWVjaG8gLW4gdGVzdCBpc2FrbXAxLi4uCi1pZiAoLi4vdGNwZHVtcCAtdCAtbiAtciBpc2FrbXAtZGVsZXRlLXNlZ2ZhdWx0LnBjYXAgfCBkaWZmIC0gaXNha21wMS5vdXQpCi10aGVuCi0JZWNobyBwYXNzZWQuCi1lbHNlCi0JZWNobyBmYWlsZWQuCi1maQotCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAyLm91dCBiL3Rlc3RzL2lzYWttcDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGMyOGRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2lzYWttcDIub3V0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotSVAgMTI5LjE3MC4yNDkuMTI2LjUwMCA+IDEyOS4xNzAuMjQ5Ljg3LjUwMDogaXNha21wOiBwaGFzZSAxID8gYmFzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wMi5zaCBiL3Rlc3RzL2lzYWttcDIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDA2YTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvaXNha21wMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMhL2Jpbi9zaAotCi11dWRlY29kZSBpc2FrbXAtcG9pbnRlci1sb29wLnB1dQotCi1lY2hvIC1uIHRlc3QgaXNha21wMi4uLgotaWYgKC4uL3RjcGR1bXAgLXQgLW4gLXIgaXNha21wLXBvaW50ZXItbG9vcC5wY2FwIHwgZGlmZiAtIGlzYWttcDIub3V0KQotdGhlbgotCWVjaG8gcGFzc2VkLgotZWxzZQotCWVjaG8gZmFpbGVkLgotZmkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wMy5uZXcgYi90ZXN0cy9pc2FrbXAzLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzN2I3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXAzLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotSVAgKHRvcyAweDAsIHR0bCAyNTUsIGlkIDQxMDY4LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogMzEyKSAxMjcuMC4wLjEuNTAxID4gMTI3LjAuMC4xLjUwMDogaXNha21wIDEuMCBtc2dpZCA6IHBoYXNlIDEgSSBpZGVudDoKLSAgICAoaWQ6IGlkdHlwZT1GUUROIHByb3RvaWQ9MCBwb3J0PTAgbGVuPTI0OCBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDMub3V0IGIvdGVzdHMvaXNha21wMy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMzdiNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvaXNha21wMy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLUlQICh0b3MgMHgwLCB0dGwgMjU1LCBpZCA0MTA2OCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDMxMikgMTI3LjAuMC4xLjUwMSA+IDEyNy4wLjAuMS41MDA6IGlzYWttcCAxLjAgbXNnaWQgOiBwaGFzZSAxIEkgaWRlbnQ6Ci0gICAgKGlkOiBpZHR5cGU9RlFETiBwcm90b2lkPTAgcG9ydD0wIGxlbj0yNDggXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDApCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXAzLnNoIGIvdGVzdHMvaXNha21wMy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYwMDNjYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXAzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIGlzYWttcC1pZGVudGlmaWNhdGlvbi1zZWdmYXVsdC5wdXUKLQotZWNobyAtbiB0ZXN0IGlzYWttcDMuLi4KLS4uL3RjcGR1bXAgLXQgLXYgLW4gLXIgaXNha21wLWlkZW50aWZpY2F0aW9uLXNlZ2ZhdWx0LnBjYXAgPiBpc2FrbXAzLm5ldwotaWYgZGlmZiBpc2FrbXAzLm5ldyBpc2FrbXAzLm91dAotdGhlbgotCWVjaG8gcGFzc2VkLgotZWxzZQotCWVjaG8gZmFpbGVkLgotZmkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wNC5uZXcgYi90ZXN0cy9pc2FrbXA0Lm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YjdkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXA0Lm5ldworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjMgdGVsbCAxOTIuMS4yLjI1NAotYXJwIHJlcGx5IDE5Mi4xLjIuMjMgaXMtYXQgMTA6MDA6MDA6NjQ6NjQ6MjMKLUlQIDE5Mi4xLjIuMjU0LjUwMCA+IDE5Mi4xLjIuMjMuNTAwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudAotSVAgMTkyLjEuMi4yMy41MDAgPiAxOTIuMS4yLjI1NC41MDA6IGlzYWttcDogcGhhc2UgMSBSIGlkZW50Ci1JUCAxOTIuMS4yLjI1NC41MDAgPiAxOTIuMS4yLjIzLjUwMDogaXNha21wOiBwaGFzZSAxIEkgaWRlbnQKLUlQIDE5Mi4xLjIuMjMuNTAwID4gMTkyLjEuMi4yNTQuNTAwOiBpc2FrbXA6IHBoYXNlIDEgUiBpZGVudAotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudFtFXQotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi4yNTQuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDEgUiBpZGVudFtFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCi1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgUiBvYWtsZXktcXVpY2tbRV0KLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBJIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MSksIGxlbmd0aCAxMzIKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjU0IHRlbGwgMTkyLjEuMi4yMwotYXJwIHJlcGx5IDE5Mi4xLjIuMjU0IGlzLWF0IDEwOjAwOjAwOmRlOmFkOmJhCi1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgUiBvYWtsZXktcXVpY2tbRV0KLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBJIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MiksIGxlbmd0aCAxMzIKLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MyksIGxlbmd0aCAxMzIKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCi1JUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg0KSwgbGVuZ3RoIDEzMgotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogaXNha21wLW5hdC1rZWVwLWFsaXZlCi1JUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg1KSwgbGVuZ3RoIDEzMgotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4NiksIGxlbmd0aCAxMzIKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjMgdGVsbCAxOTIuMS4yLjI1NAotYXJwIHJlcGx5IDE5Mi4xLjIuMjMgaXMtYXQgMTA6MDA6MDA6NjQ6NjQ6MjMKLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4NyksIGxlbmd0aCAxMzIKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4OCksIGxlbmd0aCAxMzIKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjU0IHRlbGwgMTkyLjEuMi4yMwotYXJwIHJlcGx5IDE5Mi4xLjIuMjU0IGlzLWF0IDEwOjAwOjAwOmRlOmFkOmJhCi1JUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBpc2FrbXAtbmF0LWtlZXAtYWxpdmUKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIGluZltFXQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wNC5vdXQgYi90ZXN0cy9pc2FrbXA0Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YjdkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXA0Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjMgdGVsbCAxOTIuMS4yLjI1NAotYXJwIHJlcGx5IDE5Mi4xLjIuMjMgaXMtYXQgMTA6MDA6MDA6NjQ6NjQ6MjMKLUlQIDE5Mi4xLjIuMjU0LjUwMCA+IDE5Mi4xLjIuMjMuNTAwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudAotSVAgMTkyLjEuMi4yMy41MDAgPiAxOTIuMS4yLjI1NC41MDA6IGlzYWttcDogcGhhc2UgMSBSIGlkZW50Ci1JUCAxOTIuMS4yLjI1NC41MDAgPiAxOTIuMS4yLjIzLjUwMDogaXNha21wOiBwaGFzZSAxIEkgaWRlbnQKLUlQIDE5Mi4xLjIuMjMuNTAwID4gMTkyLjEuMi4yNTQuNTAwOiBpc2FrbXA6IHBoYXNlIDEgUiBpZGVudAotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDEgSSBpZGVudFtFXQotSVAgMTkyLjEuMi4yMy40NTAwID4gMTkyLjEuMi4yNTQuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDEgUiBpZGVudFtFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCi1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgUiBvYWtsZXktcXVpY2tbRV0KLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBJIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MSksIGxlbmd0aCAxMzIKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjU0IHRlbGwgMTkyLjEuMi4yMwotYXJwIHJlcGx5IDE5Mi4xLjIuMjU0IGlzLWF0IDEwOjAwOjAwOmRlOmFkOmJhCi1JUCAxOTIuMS4yLjIzLjQ1MDAgPiAxOTIuMS4yLjI1NC40NTAwOiBOT05FU1AtZW5jYXA6IGlzYWttcDogcGhhc2UgMi9vdGhlcnMgUiBvYWtsZXktcXVpY2tbRV0KLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBJIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MiksIGxlbmd0aCAxMzIKLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4MyksIGxlbmd0aCAxMzIKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogTk9ORVNQLWVuY2FwOiBpc2FrbXA6IHBoYXNlIDIvb3RoZXJzIEkgb2FrbGV5LXF1aWNrW0VdCi1JUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg0KSwgbGVuZ3RoIDEzMgotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogaXNha21wLW5hdC1rZWVwLWFsaXZlCi1JUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBVRFAtZW5jYXA6IEVTUChzcGk9MHhmNGRjMGFlNSxzZXE9MHg1KSwgbGVuZ3RoIDEzMgotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4NiksIGxlbmd0aCAxMzIKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjMgdGVsbCAxOTIuMS4yLjI1NAotYXJwIHJlcGx5IDE5Mi4xLjIuMjMgaXMtYXQgMTA6MDA6MDA6NjQ6NjQ6MjMKLUlQIDE5Mi4xLjIuMjU0LjQ1MDAgPiAxOTIuMS4yLjIzLjQ1MDA6IGlzYWttcC1uYXQta2VlcC1hbGl2ZQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4NyksIGxlbmd0aCAxMzIKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIG9ha2xleS1xdWlja1tFXQotSVAgMTkyLjEuMi4yNTQuNDUwMCA+IDE5Mi4xLjIuMjMuNDUwMDogVURQLWVuY2FwOiBFU1Aoc3BpPTB4ZjRkYzBhZTUsc2VxPTB4OCksIGxlbmd0aCAxMzIKLWFycCB3aG8taGFzIDE5Mi4xLjIuMjU0IHRlbGwgMTkyLjEuMi4yMwotYXJwIHJlcGx5IDE5Mi4xLjIuMjU0IGlzLWF0IDEwOjAwOjAwOmRlOmFkOmJhCi1JUCAxOTIuMS4yLjI1NC40NTAwID4gMTkyLjEuMi4yMy40NTAwOiBpc2FrbXAtbmF0LWtlZXAtYWxpdmUKLUlQIDE5Mi4xLjIuMjMuNDUwMCA+IDE5Mi4xLjIuMjU0LjQ1MDA6IE5PTkVTUC1lbmNhcDogaXNha21wOiBwaGFzZSAyL290aGVycyBSIGluZltFXQpkaWZmIC0tZ2l0IGEvdGVzdHMvaXNha21wNC5zaCBiL3Rlc3RzL2lzYWttcDQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkN2JmMDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvaXNha21wNC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMhL2Jpbi9zaAotCi11dWRlY29kZSBpc2FrbXA0NTAwLnB1dQotCi1lY2hvIC1uIHRlc3QgaXNha21wNC4uLgotLi4vdGNwZHVtcCAtdCAtbiAtRSAiZmlsZSBlc3Atc2VjcmV0cy50eHQiIC1yIGlzYWttcDQ1MDAucGNhcCA+aXNha21wNC5uZXcKLWlmIGRpZmYgaXNha21wNC5uZXcgaXNha21wNC5vdXQKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2lzYWttcDQ1MDAucGNhcCBiL3Rlc3RzL2lzYWttcDQ1MDAucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmNWFiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2FrbXA0NTAwLnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9pc2FrbXA0NTAwLnB1dSBiL3Rlc3RzL2lzYWttcDQ1MDAucHV1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjU1ZGNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2lzYWttcDQ1MDAucHV1CisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLWJlZ2luIDY0NCBpc2FrbXA0NTAwLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGBgYCZgYGAhYGBgYGBgYGBgYGBgYGBgSmBgYGAqQGBgYC9fX19fX18KLU1fUWBgYC1aTU5AQCZgYCQoYGA4JGBgJDBgYCM+SztLYGAwK15gYGBgYGBgYFBgJCIlUGBgYGBgYGBgYGAKLU0qQGBgYCJIYGBgYDBgYCM+SztIMGBgIUQ5IiwoIUBgISJgYCYhYGAiJGBgYDkmMENQYCQiJVFgYGAtWk0KLU1OTGAhYE9YYGBgYGBgYGBgYCRYIWBgIS5gMGBgJGBgYDkmMEMkYGBgV0pWWiJgISVgYCVgYGAhYGAjXDEKLU1NOTdgYDArXlBgJCIlUCdUYD8wISspNkxHSEdSLiheME8hWGBgYGBgYGBgYGBgJDBgQGBgYGBgYGBgYCEKLU0pYFRgYCkwYGBgYCFgYGBgYDBgYGAoQGBgMGAkYFBgYChgYCFgYCJgIlBgIUBgUC4kKGAhYGA2YGBAYCEKLU1AYCxgYFhgJGBgNCNgYGBAYDAkYGAoYCtgYCZgI2BYMEBgJGAhOGAiYGAqYGBQYCNAYDBgITAsYGAiYCIKLU1gMGBgQGBMYGA4YCwjQSJgYDBgJUBgKGBgSGAjYGAuYCFgYCJgYGBgKGAsIWBgImAiUGAhQGBQLiQoYCEKLU1gYDZgYEBgIUBgLGBgWGAkYGAoLWBgYDAzVDVLNEYpJzYlKVY7NSElIzBgYCUqXypVUS1ISD8nKTpYOjYKLU1fJz03YDBgLWBgYDQyQSw8QDA8IzYkNTw1UkNSI0k1JStQVGBgITFdRSFGRjRRIyo7UlA3RzkoNTRJVTYKLU0jMGBgJSxVQDFELFVXUidYPy9WUl8mQlZJJEBgYGBgNDEoNDUrMUJWTlxUK1oqQSZFN0c9U2BgYGBgYGAKLU1gYGBgTEBgYGArKGBgYGAwYGAjPks7SDBgYCFEOSIsKGAkNGBgKjBgYCRgYDAhJlUsPGAhYEE/YGAwK14KLU1gPzAhXWAiMDglLj5CPyhYQ1kiXCdASVQtN1NDVDoyX2AxYCJgYGBgYGBgYGBgIigjMGBgLWBgYGBgJGAKLU1gYGAhYGBgYCpgYCFgYCRgYGBgQGBgJGBgKGArYGAmYCNgWDBAYCRgIThgImBgJmBgUGAjQGAwYCEwVGAKLU1gISEvMTZNMjhEPTg0RzlNNCQ0LWBgYDRLXEs3JFZCQVw8RUtBSTtcPVU8IWBgYGBgITEqJFFSISFQLTgKLU0xNVE3Ki8oLkU0NE9gYGBgYGBgYGBgISZgMGBgMUAkYGAhYGBgJjFEKFFgYGAtWk1OQEBgMTBgIS5gYGAKLU0wYGBfJDs2PVBgJCJfTGAhYEE8IV1gJ1RgMjA2TDlaKVxDQi9EK1A+IkcwVT8uLzFJK1wkJGAoYGBgYGAKLU1gYGBgYDFQKmBgIyRNXU4nWDRFJkFFTVQqNyhVQSldP1o6TWBSVz5UUFJQUi8yVi1VXi1PJ1NUNyw5SzcKLU1DUVFGUWAjXjIvUFAwR15AXVFIUj05IVk3Py9FTCdPKFxMKEknIzUxVjZOMT8pMUorNlAtQTYmVDBZQCIKLU0tS0pbLF9XUEMrVyVIJ0tTVj5KXyhXIzNgM0E0JkFeNFEqVF4zUSoyJ15NIzlbWEhXLUlWV08uI0o9TT8KLU1ESFRYPy9EUyNdQ0RKRzs/QkNfRTokVzozQURdTjkrIVUnWys2VVUuYCwpNF4mQVNIMlNPXENVLj0yISMKLU1IJzxUQDU0TDktJFgvNVpRKiZfOzlCRjVFM1E3JWBgYCUmOzZdQylJPlVZKEZJKjM5NT5JP1pANGBgYDQKLU07T1gyXCRLWSM/Ty9MNVVRTiQmW0dAYGBgITEkXTE/QC9bLiFeYF4kKzE0WFMvXkxgYGBgYGBgYGBgISYKLU1gMGBgMUAkYGAhYGBgLVpNTkFgYGAmMUQoUEBgMTBgIS5gYGAwYCFgJDsyPVBgJCIlXGAhYE9YIV1gJ1QKLU1gMjAhVVlaKVxDQi9EK1A+IkcwVT8uLzFJK1wkJGAoYGBgYGBgYGBgYDFQKmBgIyRZWUk/XiNWWyVXTyoKLU0rLD9bWEtVXCJZVkZaMFVDTU9BJzZZOkM5MyM0Xk0mLyknMyIsMVEvIiY3KiJEMF88MVNYI0AiS1JaRFYKLU1cX1hDQjRPOVhOUzAiX084LSdbQyZBRzVPO0deR19OKiM/NCwiT0EnP1I+PCJXTjY4UShIPDFFT05NMyEKLU1TMz1dVV1NUlooNFVCTV0mOklcS1cmM1g7TFElTVtCMDosLyJdRFRNMV5KOCs4Q0VTRSc2SkVGQ0UsLCQKLU0/JFc1UCxeNT0xSzFBVEBZWDBKLTklL0VdYE1ZJjwlQz8qWSpLXCc1WCMyQjVPRDYrRlRHSileVjI5OSMKLU0qPkg2JWBgYCUmUV43WlJKMTYkVCU8NlVKRTw/SVMkNGBgYDQuOSwkVTBeXTMqLzsnQUVaXVwkPjtQYGAKLU1gITFOX0ErUDJPRC1eXF5RNzcmWDA7Tj5gYGBgYGBgYGBgIVJgMGBgPEAkYGAhYGBgJjFEKFFgYGAtWk0KLU1OQEBgMTBgITlgYGAwYGBfJDs1UVBgJCJfTGAhYEE8MUUhJjRgNSFSSDBgYGBgIj5CPyhYQ1kiXCdASVQKLU0tN1NDVDoyXyExYCJgMGBgYGBgYGBgJSRIIjFAV2BaVFc6NCYnWj0hSypgSVJUTkxLOjNKL14kREQvQjQKLU0+USxGP001YDM9KD8hSEdXJC9NKWBcVzhaLydGWEs2JCEoOSE3Qkw5IUBRVj0oXkU3PjxcKVI4RVZFM0YKLU02YC5PXjoyRiEoPkxENyU3MU5dYExBP0IhLyEwXCpIMiJZT0owXV9XOSM5REpZWikuTS8uOys4QT9MW08KLU1gSi0nSFZfMConJiZeUFw4OiQnSV4iMTNTTl1WVCU1XDhPODtQMlZWPWArJjkrNF0nTUgrLyY6J1BSIUgKLU00TyMsR0krMT0rKk1STiI1Li04RCYkMTYpPE8hYFNCWk1cQUtDJlBfWDw7U11ALykxKVlcLiZXT1k3XEgKLU0xVlxQNy5OTDw5Mj8xOFgsRis6TGBeXkYjTzFZNTA1UTBIODVETEM5REcpQi9WPF5cXCVXUzVUTztFJDoKLU0iMSRGYERHKj1SPD9aUVlUTjFQXjRRIzFdLjYwR0s8LkFLPV9YT01ePEpTQiFQOVw6QzJYM1FJYExdRGAKLU1gYGBgYGBgYGAlSCFgYCE6YDBgYCRgYGBXSlZaJGBgYDkmMEMiYCElYGAlLGBgIWBgJGAxTShHYGAwKDcKLU1QYCQiX0EmNCQ5MCEuLD8kYGBgYGApWilcQ0IvRCtQPiJHMFU/Li8xSStcJSRgKCFgYGBgYGBgYGAyUyIKLU04WjVdKzxeLU04UTlQJlg7XiVKTjJeKk5ZQzEiQVolNEotUElNWk02MTFXPEQlXTZFVDlEVUJGPVRILjAKLU1RUVNNSFNbRkY7PUU/JEhKUDFaMjdIMDtEUk5gQFFEKz0tWSMmPkE6WiQqNklCV0MuMy45MDM3KTxCOzsKLU0wVSZNK0g5WyY9SyMjR1grK0NYR1goTDs3RV4pQlxRKydfJ041LzUsIls/UDk2SyctKDQ7MjVcI0QlTS8KLU1WSU42QyM3J1E6MFBCRjNcPTEoJE9EQVooJjokKCg9VjEsU1RNL01JQihdQzteN1Q9UiQqJVg/K01UWF4KLU1CKlglNkRKMDlCQyhYVUAoLDRJVTFRXU1WXzslU0A4WTk2TUIsVzMvISNNNUJTKUpHQTUkKEo0SDVXQDgKLU08KkI6Rzw7UV4+TGBbQURTSGBLJjAqXls2KT4iKSRFMzsiNDtVPSJJIiwyKmAxVFBfPTUrJUIiSUkzPigKLU0nQGBgYGBgYGBgYGBWQCRgYC1IIWBgYDBgYCFEOSIsMGBgIz5LO0goYCQ0YGA8UGBgJGBgL1EmVSI8YCEKLU1gT1tgYDAoNyQ5MDFFYCZYVzNAYGBgYGBHSEdSLiheME8hWCo9IzVcWF0mRE9QQDAoYCYrP0hFJ2BgYCEKLU1LJydJI1tIJDxfIjxZRUdHMik4KSE5N1BGJTAtX1w4XlgoVjFbKD0lK1VBTUo5QSgxLyEsWzYrV00zMkMKLU0pKjBJRzpFTS9DKVNGJFAkPSRQIllfUi5AL01DUU9TO1xVPjRZUTVTQU9gMTApXDg0Jkk/XSxSMi4/NU0KLU1aL1leWSIjKiUrMC48OUtYKC9aJCcmTSwtKS8ySTdVXiwhRywqRyFFX08uRDs3Rl87RF5WIyYmKihSLisKLU1IO1lTSScxQEk4R1YlK1wnKjYsMSg4YDhEKFZVUFssKFI/UFE3Iyw1V1FZM1tIVCtJRkYiMz8uKzsoKk0KLU1fP0M7SlEjXU8nOTUyMipaTzc+J1RFRFlMTEFgKkwkOChYSiQhVD5fSFlTP0c9V1IxMUUoJC0wMjFGTVMKLU1CW05YQUpeQ1FWR084N1tCQF5JNlRISFctJVo4JVBUSCZCQ09eLltAS19OUzhSVlRFN0NFJk1BXTZDQD4KLU1FRElETSZUXi40MT9GKFxYJFotNVs1NDckSEM9JypcPjhgYCJbOS5JSFQpK1ssXkxaP182KDZJXEwzMiMKLU1GLUpNN1UiLkw0P1gvOD1HKktGQTw+VEhKLTYyMlcsO0pgSVcyXk1MQkk/X088PEVDKSFWMV43XFUsWUsKLU03J0UmUl9dLmBDIyQjO1hdRV0xU1hAMDkyXVpFKEBDLTJNIVpBVy4jJUxeSlteJzEzQlkmU0dAYGBgYGAKLU1gYGBgYChIIWBgIipgMGBgJGBgYFdKVlokYGBgOSYwQyJgISVgYCVcYGAhYGAkYDFNJUdgYDAoN1BgJCIKLU1fQSY0JDkwITosS05gYGBgYClaKVxDQi9EK1A+IkcwVT8uLzFJK1woJCJgIUJXWikxUGBgYDVSTTomTjQKLU1RMTtXMTkrOzc3JUpFLCxIJzgmRjZJVEpNPVI1Tz5LTDElW10jRS9MSiMmLi9XRkpgIywzQyFIPUlfJyoKLU0zNC8pX0UrKShgIUEmVzAwKlRcIjlPOUpYME4iPiQjJyhaTDwkJ1xQPUdIQi4wOlxBWFQvIV5eKjxQMiEKLU08IUFcPiVVLic1IycySVg8UTs5K0k2R1JWUldfK1QsUz46Ny8yS1okJV4zVzslUjRbJjJUPic/MihARkYKLU0jVC89KzJPWz9RNC4oXEBRO10zVj1MNVEyWEZHKV5FKTBKOjFBWGBKNCVFM19ZXV42PSchUi1FTlklOSMKLU0zIVhEOjVLPy9WJi4hJlgjPklfJDk2WTtQXyE1J108RyhAPDpJOTRdWyIlMSNGM01ZKlUxViVXUVZMMV8KLU1SVCpaJFxLRVZXPjA3MChEM04jJDQ3IUFaXlZDVy0/ST9KVDJBTDVZT1dCTzVbRCEiT1YpNDYoRkspOSIKLU0kQzQwR05KNypBLFNFNiU2QSg0PktQRSgtJCk9TDY9MlZRTE8+WTEyTjhRQkgzViUoOTAuXDVZTGBSLE8KLU0xQGBgYGBgYGBgYGA4QGBgYCYoYGBgYDBgYCFEOSIsMGBgIz5LO0goYCQ0YGAlMGBgJGBgL1EmVkA8YCEKLU1gT1tgYDAoNyQ5MDFFYCFgS1E8YGBgYGBHSEdSLiheME8hWCo9IzVcWF0mRE9QQDAoYCYrP0hFJ2BgYGAKLU0tIjRbLDg4LjouUiQlOjFTNksvWDxFSF1ZWkgpLjIyRGBAYGBgYGBgYGBgYEtAYGBgKlhgYGBgMGBgIUQKLU05IiwwYGAjPks7SChgJDRgYCoiSk1gYGAvUSUrQDxgIWBPW2BgMCg3JDkwMUVgIixgYCNUV2BLRWBgYGAKLU1gP1NEIjwxMS1YXz1GQlg3SiZdJy9DW0I+O0JBMjNYIl5BOyhCQS9IOzhfXDAnVSxFQE0mOys9UiYqTFkKLU1BRi5OVDY8UFhSMzEhWlxNWEBXND4vKkouU0xbVVIyKStIXkE2IzU8MzhSOyFGWVw6QVZfNlpWKUZRMiEKLU0xVFxMOmBHUEs2VT9fP1RWSFNLWzYoV1NGP1EiWEY1Sy8wVSxBLlkrRFxSUF1HKGBgYGBgYGBgYGAiSGAKLU1gYGBKYGBgYCRgYGBXSlZaJGBgYDkmMEMiYDhgYDBAYCFAMGBgMWBgYCYxRChcYCFgQTxgYGBgYGBgI2AKLU1gMCteYGBgYGBgYGBgYGBKYGBgYCpAYGBgIWBgYCYxRChRYGBgLVpNTkBAJmBgJChgYDgkYGAoMGBgIz4KLU1LO0tgYDArXiRgYGA5JjBDUGAkIiVQYGBgYGBgYGBgYEJAJGBgKEghYGBgMGBgIz5LO0gwYGAhRDkiLCgKLU1gJDRgYDdQYGAkYGAwISZUNjxgIWBBP2BgMCteJDkwMUVgJUhSTlhgYGBgYEdIR1IuKF4wTyFYKj0jNVwKLU1YXSZET1BAMChgJis/SEUnYGBgITcqVUg6WTMlJU89JURNTT08Nko0UFJAPUA6OTpHMkpVVyk2XVpOUSQKLU03T1QuNF5SSCw4WF8+OkhgLFEuLCZBVkdcPEktMFxHXjRMREBgJiQ7PSFgSzNQKUZdRktBIlgpWDAsPEMKLU1KUVAwP1MhVj5CKFkhS1InQzBcJ1tYSVMhKCVQJidRWDc0WD00LD0qR0FTJU1ETkU6Pys7Kz9cTzBTLVkKLU1JPF0qT0gwN1kvPUw3KTNMOSsxWD1dKEIiOjgvMF1UTSpfTV8lMFhDUiMlT1UvOVZRNyUrQjo8R1o0RSIKLU1JSSYnQCJJMDY1L19HV1k5VDwnKFY2W0Q1RC0sJ0IxSTZNXF84OFgkO0AtWkdcMUU7RU8jXCU0P1VSPEIKLU0hUUpFRTNXTCg1JC45LldESzUnODc/JzpRJ18rMEtIM1JONzs9WSE9YEIxLlgsMTE8JidLWzovPFVeRV4KLU1LMSomUTdGXz4qXTdOMCQqXzhFMThCOkxFRCgyLTEiPlpJPEokUy41ODU6JEExWk8iNEBUMEVWUTlVKzsKLU0mUl1bRSUqWUMmKkEvODRBRWBbUTdGUCMoUl0mYGBgYGBgYGBgYCFCYGBgYDhAYGBgIWBgYCYxRChRYGAKLU1gLVpNTkBAYDEwYGA1YGBgMGBgXyQ7OiFQYCQiX0xgIWBBPDFFISY0YCQiTyVQYGBgYCI+Qj8oWENZIlwKLU0nQElULTdTQ1Q6Ml8iIWBAYDhNXkI0PGBgYGBUKTNMUUFAWUhbKDA1SSctOkxfQVI2Q1dHSkBEWSkqMCIKLU1gYGBgYGBgYGBgIk5gYGBgS0BgYGAhYGBgJjFEKFFgYGAtWk1OQEBgMTBgYEgqSlVgYGBfJDROYFBgJCIKLU1fTGAhYEE8MUUhJjRgKFBgYC8zPCJONGBgYGAiOzVfXV8zOkMuT004Qz8uOV8kK0I5O0tVL1IrRCJVXi0KLU1MR0IpPiI0MFpDTVc6K15BNCVVSTFZKVwuTzRCXWA0NFQoMlhTXFM9MltbW1guNkEtUENEWlAqM1hGQUQKLU0yOTQ+K1c6TSUlK1xgKT9YUCNbOjZdTkhHPiM7RkZGLVJNQUE3RCJLUS0mT1g8RShHTlJTLzYqJVA4P0IKLU0+M1o1UydDQllDIjc0MGBgYGBgYGBgYGAqUGBgYCJMYGBgYDBgYCFEOSIsMGBgIz5LO0goYCQ0YGAhVGAKLU1gJGBgL1EmVk4sYCFgT1tgYDAoNyQ5MDFFYGApNilPX2BgYGBgYGBgYGAiTmBgYGBLQGBgYCFgYGAmMUQKLU0oUWBgYC1aTU5AQGAxMGBgSCpKVmBgYF8kNE1fUGAkIl9MYCFgQTwxRSEmNGAoUGBgLzM8Ik40YGBgYCMKLU03RCJLUS0mT1g8RShHTlJTLzYqJVA2TS1EW01KR1UpUklbRUEzKUxEL1deOlMyViExUDwyWS8wSTpfYCUKLU1GMy1gTFNBMyZRTThERF5cPjFGMCNGJF5JQDFWNUU+LmAqIUg9Wj8oJiosLk1TXUU0SCNQKzxKQi9DPVEKLU1TMjZJQk4+MiJeTU1HPyVAWTMqTCVEJzckPkxMT0EsSFVFQjNJQjs4NyxcOi0wYGBgYGBgYGBgYEJAJGAKLU1gKEghYGBgMGBgIz5LO0gwYGAhRDkiLChgJDRgYDdQYGAkYGAwISZUNjxgIWBBP2BgMCteJDkwMUVgJUgKLU1STlhgYGBgYEdIR1IuKF4wTyFYKj0jNVxYXSZET1BAMChgJis/SEUnYGBgITcqVUg6WTMlJU89JURNTT0KLU08Nko0UFJAPUA6OTpHMkpVVyk2XVpOUSQ3T1QuNF5SSCw4WF8+OkhgLFEuLCZBVkdcPEktMFxHXjRMREAKLU1gJiQ7PSFgSzNQKUZdRktBIlgpWDAsPENKUVAwP1MhVj5CKFkhS1InQzBcJ1tYSVMhKCVQJidRWDc0WD0KLU00LD0qR0FTJU1ETkU6Pys7Kz9cTzBTLVlJPF0qT0gwN1kvPUw3KTNMOSsxWD1dKEIiOjgvMF1UTSpfTV8KLU0lMFhDUiMlT1UvOVZRNyUrQjo8R1o0RSJJSSYnQCJJMDY1L19HV1k5VDwnKFY2W0Q1RC0sJ0IxSTZNXF8KLU04OFgkO0AtWkdcMUU7RU8jXCU0P1VSPEIhUUpFRTNXTCg1JC45LldESzUnODc/JzpRJ18rMEtIM1JONzsKLU09WSE9YEIxLlgsMTE8JidLWzovPFVeRV5LMSomUTdGXz4qXTdOMCQqXzhFMThCOkxFRCgyLTEiPlpJPEoKLU0kUy41ODU6JEExWk8iNEBUMEVWUTlVKzsmUl1bRSUqWUMmKkEvODRBRWBbUTdGUCMoUl0mYGBgYGBgYGAKLU1gYCFCYGBgYDhAYGBgIWBgYCYxRChRYGBgLVpNTkBAYDEwYGA1YGBgMGBgXyQ7OiFQYCQiX0xgIWBBPDEKLU1FISY0YCQiTyVQYGBgYCI+Qj8oWENZIlwnQElULTdTQ1Q6Ml8iIWBAYDhNXkI0PGBgYGBUKTNMUUFAWUgKLU1bKDA1SSctOkxfQVI2Q1dHSkBEWSkqMCJgYGBgYGBgYGBgIk5gYGBgS0BgYGAhYGBgJjFEKFFgYGAtWk0KLU1OQEBgMTBgYEgqSldgYGBfJDRNXlBgJCJfTGAhYEE8MUUhJjRgKFBgYC8zPCJONGBgYGAkIl5NTUc/JUAKLU1ZMypMJUQnNyQ+TExPSEZYSCw2QjM8J00vXUFfVVQlWC5NUDtGYFpUQD1cNjIqXVcnL1k1QDEsKDgrYFcKLU1USVooQzs8TV4lKUcuOVIkTjEpNkpfN1pfIUdUJVxVTVE6WFFQTThdPjhHJ1ZDPCIrJ1ZNOiRLLz06VkkKLU1EIzpLQl4vRyRCQkA6Kz1UU1ZcUylUNS1FI1VPQktaIkU1XywlUGBgYGBgYGBgYGAqUGBgYCJMYGBgYDAKLU1gYCFEOSIsMGBgIz5LO0goYCQ0YGAhVGBgJGBgL1EmVk4sYCFgT1tgYDAoNyQ5MDFFYGApNilPX2BgYGAKLU1gYGBgYGAiTmBgYGBLQGBgYCFgYGAmMUQoUWBgYC1aTU5AQGAxMGBgSCpKWGBgYF8kNE1dUGAkIl9MYCEKLU1gQTwxRSEmNGAoUGBgLzM8Ik40YGBgYCVEIzpLQl4vRyRCQkA6Kz1UU1ZcUylYWj5YLFlBT0kvVzFfQlMKLU03Ok4lTU8/M0orMVxJPT5PLTxSXkhJWlUtLSFYJjZgJF1VIypKQDtSQDY0JVNLUS5CL15eSUdCPCY4OFcKLU1bOClGUztINiU0KU05TlZdXCNRKzNeXicuLFBRWTc8U0M2T0c4PjM2TjFHQkREK0hNUl1EOFUpRyhPSl0KLU1NWCE+PCQzJ1UwYGBgYGBgYGBgYEtAYGBgKlhgYGBgMGBgIUQ5IiwwYGAjPks7SChgJDRgYCoiSk4wYGAKLU0vUSUrPyxgIWBPW2BgMCg3JDkwMUVgIixgYCNUV2BLRWBgYGAhSFVLWVYnRFVLRDlYSSkiWis8TzkmLDUKLU1fWDFSJ2AxQD5APjM6OTYzOF5JSF8yXDhDVkUtQkwyJjQzLDNaQVkzJzFAM1o6K1wpWFNYRFNPXUwsQD8KLU1DT0w2PEk3LipdTCNOPkBdKyYrWF4jSChELlg+QjspPCVbRTQ6UzojLkQ3MDohIzw4UVxRWkZIYDxDJl4KLU1HJ2BKUTBfRiJLXEw/Rl1cSFVHJDhHLGBgYGBgYGBgYGAiSGBgYGBKYGBgYCRgYGA5JjBDJGBgYFdKVloKLU0iYDhgYDBAYCFAMGBgMWBgYC1aTU5MYCFgT1hgYGBgYGBgI2BgMCg3YGBgYGBgYGBgYGBKYGBgYCpAYGAKLU1gIWBgYC1aTU5BYGBgJjFEKFBAJmBgJChgYDgkYGAoMGBgIUQ5Ii9gYDAoNyRgYGBXSlZaUGAkIl9AYGAKLU1gYGBgYGBgYCpQYGBgIkxgYGBgMGBgIUQ5IiwwYGAjPks7SChgJDRgYCFUYGAkYGAvUSZWTixgIWBPW2AKLU1gMCg3JDkwMUVgYCk2KU9fYGBgYGBgYGBgYCJOYGBgYEtAYGBgIWBgYCYxRChRYGBgLVpNTkBAYDEwYGAKLU1IKkpaYGBgXyQ0TVtQYCQiX0xgIWBBPDFFISY0YChQYGAvMzwiTjRgYGBgJyQtUUMnUydKOkAhUiw7WjwKLU08IkslI1NUIS04XE8yO0YqKlIvOVolSEFaYDIjS1FJVyo5J0hJOUMwNjdaSy1HXlhBTF5PMEk3Wi8nSCgKLU08LmA3UDxRRzM8PD83UjdaISEzTVExTVk1Qj1GOU4iLEpATC5gXT9NIVU1KVRCYDwiXVc1Q1ssYFtZJzIKLU1UNlxOJENEQDYnIkNQJDNGYEFFRVI+QC9QJy9FMEBgYGBgYGBgYGBgQkAkYGAoSCFgYGAwYGAjPks7SDAKLU1gYCFEOSIsKGAkNGBgN1BgYCRgYDAhJlQ2PGAhYEE/YGAwK14kOTAxRWAlSFJOWGBgYGBgR0hHUi4oXjAKLU1PIVgqPSM1XFhdJkRPUEAwKGAmKz9IRSdgYGAhNypVSDpZMyUlTz0lRE1NPTw2SjRQUkA9QDo5OkcySlUKLU1XKTZdWk5RJDdPVC40XlJILDhYXz46SGAsUS4sJkFWR1w8SS0wXEdeNExEQGAmJDs9IWBLM1ApRl1GS0EKLU0iWClYMCw8Q0pRUDA/UyFWPkIoWSFLUidDMFwnW1hJUyEoJVAmJ1FYNzRYPTQsPSpHQVMlTURORTo/KzsKLU0rP1xPMFMtWUk8XSpPSDA3WS89TDcpM0w5KzFYPV0oQiI6OC8wXVRNKl9NXyUwWENSIyVPVS85VlE3JSsKLU1COjxHWjRFIklJJidAIkkwNjUvX0dXWTlUPCcoVjZbRDVELSwnQjFJNk1cXzg4WCQ7QC1aR1wxRTtFTyMKLU1cJTQ/VVI8QiFRSkVFM1dMKDUkLjkuV0RLNSc4Nz8nOlEnXyswS0gzUk43Oz1ZIT1gQjEuWCwxMTwmJ0sKLU1bOi88VV5FXksxKiZRN0ZfPipdN04wJCpfOEUxOEI6TEVEKDItMSI+Wkk8SiRTLjU4NTokQTFaTyI0QFQKLU0wRVZROVUrOyZSXVtFJSpZQyYqQS84NEFFYFtRN0ZQIyhSXSZgYGBgYGBgYGBgIk5gYGBgS0BgYGAhYGAKLU1gJjFEKFFgYGAtWk1OQEBgMTBgYEgqSltgYGBfJDRNWlBgJCJfTGAhYEE8MUUhJjRgKFBgYC8zPCJONGAKLU1gYGAoQ1ssYFtZJzJUNlxOJENEQDYnIkNQKkBDQk5DOSEsLEhKKksjKFI4TjU/KiVOKDxYWCs+R1ZKK0YKLU0jTS9HX0ZQJk5BTk1bV0BgKVk5XFxaP0Y0U1glJ0UuXjJCQ1BcOSshL2AyNVBLJStHJ1VAJCYxKz1AJSgKLU0jOVJWXlUiQjgtNSxFWEowLVFaVExPSi9MXkZcKS5CQ0ArK1hRR09MOEpDX2BMOyc9YGBgYGBgYGBgYGAKLU0qQGBgYCJIYGBgYDBgYCM+SztIMGBgIUQ5IiwoIUBgISJgYCYhYGAhJGBgYDkmMENQYCQiJVBgYGBgYGAKLU1gLGAhYE9YYGBgYGBgYGBgYCJIYGBgYEpgYGBgJGBgYDkmMEMkYGBgV0pWWiJgOGBgMEBgIUAwYGBBYGAKLU1gLVpNTkxgIWBPWDBgYCFEOSIvYGAwKDdgYGBgYGBgYGBgYEtgYGBgKlBgYGAhYGBgJjFEKFFgYGAtWk0KLU1OQEBgMTBgYCcwYGAwYGBfJDs6WFBgJCJfTGAhYEE8MUUhJjRgYEU4Rl9cYGBgYGBgYGBgYCdIYGBgIVoKLU1gYGBgJGBgYFdKVlokYGBgOSYwQyJgISVgYCFMYGAhYGAkYDFNNkdgYDAoN1BgJCJfQSY0JDkwYDYsRyMKLU1gYGBgYClaKVxDQi9EK1A+IkcwVT8uLzFJK1woJGA0IWBLVyYzUGBgYCRTX1RcXjEoXD8oSVZDUURBXUoKLUMyMFNGQC5ePCZdMicxRChfM0ZISEtXN1BLUUonISEuMDFRVj4/XSQ5S19FTmBOPGAKLWAKLWVuZApkaWZmIC0tZ2l0IGEvdGVzdHMvaXNpcy1pbmZpbml0ZS1sb29wLnBjYXAgYi90ZXN0cy9pc2lzLWluZmluaXRlLWxvb3AucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ4MmZjOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9pc2lzLWluZmluaXRlLWxvb3AucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2xkcC1pbmZpbml0ZS1sb29wLnBjYXAgYi90ZXN0cy9sZHAtaW5maW5pdGUtbG9vcC5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMxZjBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2xkcC1pbmZpbml0ZS1sb29wLnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9sbXAubmV3IGIvdGVzdHMvbG1wLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzN2JjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9sbXAubmV3CisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDg0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQmVnaW4gVmVyaWZ5LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA1NgotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IFJlbW90ZSAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCi0JICBWZXJpZnkgQmVnaW4gT2JqZWN0ICg4KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtuZWdvdGlhYmxlXSwgbGVuZ3RoOiAyNAotCSAgICBGbGFnczogbm9uZQotCSAgICBWZXJpZnkgSW50ZXJ2YWw6IDIwCi0JICAgIERhdGEgbGlua3M6IDMwCi0JICAgIEVuY29kaW5nIHR5cGU6IExhbWJkYSAocGhvdG9uaWMpCi0JICAgIFZlcmlmeSBUcmFucG9ydCBNZWNoYW5pc206IDMyNzY4ICgweDgwMDApIAotCSAgICBUcmFuc21pc3Npb24gUmF0ZTogMTAwLjAwMCBNYnBzCi0JICAgIFdhdmVsZW5ndGg6IDgKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDU2KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogSGVsbG8sIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI4Ci0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQotCSAgSGVsbG8gT2JqZWN0ICg3KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMTIKLQkgICAgVHhTZXFOdW06IDUwCi0JICAgIFJjdlNlcU51bTogNjAKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMiwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDg0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQ29uZmlnIE5BQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDU2Ci0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQotCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBOb2RlIElEOiAxMC4wLjUwLjEgKDB4MGEwMDMyMDEpCi0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMiAoMHgwMDAwMDAwMikKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKLQkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE5vZGUgSUQ6IDEwLjAuNTAuMiAoMHgwYTAwMzIwMikKLQkgIENvbmZpZ3VyYXRpb24gT2JqZWN0ICg2KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtuZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIEhlbGxvIEludGVydmFsOiA1Ci0JICAgIEhlbGxvIERlYWQgSW50ZXJ2YWw6IDE1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzMsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3NikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IENvbmZpZyBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDQ4Ci0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQotCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBOb2RlIElEOiAxMC4wLjUwLjEgKDB4MGEwMDMyMDEpCi0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMiAoMHgwMDAwMDAwMikKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKLQkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE5vZGUgSUQ6IDEwLjAuNTAuMiAoMHgwYTAwMzIwMikKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzNCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDY4KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQ29uZmlnLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA0MAotCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMSAoMHgwMDAwMDAwMSkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBOb2RlIElEOiAxMC4wLjUwLjEgKDB4MGEwMDMyMDEpCi0JICBDb25maWd1cmF0aW9uIE9iamVjdCAoNiksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBIZWxsbyBJbnRlcnZhbDogNQotCSAgICBIZWxsbyBEZWFkIEludGVydmFsOiAxNQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM1LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNDQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBMaW5rIFN1bW1hcnkgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAxNgotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAxICgweDAwMDAwMDAxKQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM2LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogMTI0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogTGluayBTdW1tYXJ5IE5BQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDk2Ci0JICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgTWVzc2FnZSBJRCBBY2s6IDEgKDB4MDAwMDAwMDEpCi0JICBFcnJvciBDb2RlIE9iamVjdCAoMjApLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIEVycm9yIENvZGU6IAotCQlVbmFjY2VwdGFibGUgbm9uLW5lZ290aWFibGUgTElOS19TVU1NQVJZIHBhcmFtZXRlcnMsIAotCQlSZW5lZ290aWF0ZSBMSU5LX1NVTU1BUlkgcGFyYW1ldGVycywgCi0JCUludmFsaWQgREFUQS1MSU5LIE9iamVjdCwgCi0JCVVua25vd24gVEUtTElOSyBPYmplY3QgYy10eXBlLCAKLQkJVW5rbm93biBEQVRBLUxJTksgT2JqZWN0IGMtdHlwZQotCSAgRGF0YSBMaW5rIE9iamVjdCAoMTIpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAzNgotCSAgICBGbGFnczogW25vbmVdCi0JICAgIExvY2FsIEludGVyZmFjZSBJRDogMTkyLjE2OC4xLjEgKDB4YzBhODAxMDEpIAkJCQotCSAgICBSZW1vdGUgSW50ZXJmYWNlIElEOiAxOTIuMTY4LjEuMiAoMHhjMGE4MDEwMikKLQkgICAgU3Vib2JqZWN0LCBUeXBlOiBJbnRlcmZhY2UgU3dpdGNoaW5nIFR5cGUgKDEpLCBMZW5ndGg6IDEyCi0JCSAgICBTd2l0Y2hpbmcgVHlwZTogTGFtYmRhLVN3aXRjaCBDYXBhYmxlICgxNTApCi0JCSAgICBFbmNvZGluZyBUeXBlOiBMYW1iZGEgKHBob3RvbmljKSAoOCkKLQkJICAgIE1pbiBSZXNlcnZhYmxlIEJhbmR3aWR0aDogMTAwLjAwMCBNYnBzCi0JCSAgICBNYXggUmVzZXJ2YWJsZSBCYW5kd2lkdGg6IDEwMC4wMDAgTWJwcwotCSAgICBTdWJvYmplY3QsIFR5cGU6IFdhdmVsZW5ndGggKDIpLCBMZW5ndGg6IDgKLQkJICAgIFdhdmVsZW5ndGg6IDYKLQkgIERhdGEgTGluayBPYmplY3QgKDEyKSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMzYKLQkgICAgRmxhZ3M6IFtub25lXQotCSAgICBMb2NhbCBJbnRlcmZhY2UgSUQ6IDEwLjEuMS4xICgweDBhMDEwMTAxKSAJCQkKLQkgICAgUmVtb3RlIEludGVyZmFjZSBJRDogMTAuMS4xLjIgKDB4MGEwMTAxMDIpCi0JICAgIFN1Ym9iamVjdCwgVHlwZTogSW50ZXJmYWNlIFN3aXRjaGluZyBUeXBlICgxKSwgTGVuZ3RoOiAxMgotCQkgICAgU3dpdGNoaW5nIFR5cGU6IExhbWJkYS1Td2l0Y2ggQ2FwYWJsZSAoMTUwKQotCQkgICAgRW5jb2RpbmcgVHlwZTogQU5TSS9FVFNJIFBESCAoMykKLQkJICAgIE1pbiBSZXNlcnZhYmxlIEJhbmR3aWR0aDogMTIzNDczNjc2OC4wMDAgTWJwcwotCQkgICAgTWF4IFJlc2VydmFibGUgQmFuZHdpZHRoOiAxMjkwNjkzMzc2LjAwMCBNYnBzCi0JICAgIFN1Ym9iamVjdCwgVHlwZTogV2F2ZWxlbmd0aCAoMiksIExlbmd0aDogOAotCQkgICAgV2F2ZWxlbmd0aDogMzUzCi1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzcsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2OCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IEJlZ2luIFZlcmlmeSBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDQwCi0JICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAxICgweDAwMDAwMDAxKQotCSAgVmVyaWZ5IEJlZ2luIEFDSyBPYmplY3QgKDkpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IERlYWQgSW50ZXJ2YWw6IDUwIAkJCQkKLQkgICAgVmVyaWZ5IFRyYW5zcG9ydCBSZXNwb25zZTogMTAwCi0JICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IElEOiA1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzgsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2MCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IEJlZ2luIFZlcmlmeSBOQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAzMgotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMTAuMC4wLjAgKDB4MGEwMDAwMDApCi0JICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCi0JICBFcnJvciBDb2RlIE9iamVjdCAoMjApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIEVycm9yIENvZGU6IAotCQlMaW5rIFZlcmlmaWNhdGlvbiBQcm9jZWR1cmUgTm90IHN1cHBvcnRlZCwgCi0JCVVud2lsbGluZyB0byB2ZXJpZnksIAotCQlVbnN1cHBvcnRlZCB2ZXJpZmljYXRpb24gdHJhbnNwb3J0IG1lY2hhbmlzbQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM5LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBFbmQgVmVyaWZ5LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQ6IDMgKDB4MDAwMDAwMDMpCi0JICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IElEOiA1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDAsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IEVuZCBWZXJpZnkgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQotCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIFZlcmlmeSBJRDogNQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQxLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBUZXN0LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgSW50ZXJmYWNlIElEIE9iamVjdCAoNCksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQotCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIFZlcmlmeSBJRDogNQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQyLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBUZXN0IFN0YXR1cyBGYWlsdXJlLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQ6IDEgKDB4MDAwMDAwMDEpCi0JICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IElEOiA1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDMsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IFRlc3QgU3RhdHVzIEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjQKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMSAoMHgwMDAwMDAwMSkKLQkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBWZXJpZnkgSUQ6IDUKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0NCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDQ0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQ2hhbm5lbCBTdGF0dXMgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAxNgotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQ1LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBDaGFubmVsIFN0YXR1cyBSZXF1ZXN0LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAzNgotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgQ2hhbm5lbCBTdGF0dXMgUmVxdWVzdCBPYmplY3QgKDE0KSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMTIKLQkgICAgSW50ZXJmYWNlIElEOiAyLjAuMC4wICgweDAyMDAwMDAwKQotCSAgICBJbnRlcmZhY2UgSUQ6IDIuMC4wLjAgKDB4MDIwMDAwMDApCi1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDYsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IENoYW5uZWwgU3RhdHVzLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA0NAotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgQ2hhbm5lbCBTdGF0dXMgT2JqZWN0ICgxMyksIENsYXNzLVR5cGU6IElQdjQgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDIwCi0JICAgIEludGVyZmFjZSBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkJICAgIEFjdGl2ZTogQWxsb2NhdGVkICgxKQotCQkgICAgRGlyZWN0aW9uOiBUcmFuc21pdCAoMSkKLQkJICAgIENoYW5uZWwgU3RhdHVzOiBTaWduYWwgRmFpbCAoMykKLQkgICAgSW50ZXJmYWNlIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQotCQkgICAgQWN0aXZlOiBBbGxvY2F0ZWQgKDEpCi0JCSAgICBEaXJlY3Rpb246IFJlY2VpdmUgKDApCi0JCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIERlZ3JhZGVkICgyKQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQ3LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBDaGFubmVsIFN0YXR1cyBSZXNwb25zZSwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMzYKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKLQkgIENoYW5uZWwgU3RhdHVzIE9iamVjdCAoMTMpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAyMAotCSAgICBJbnRlcmZhY2UgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCi0JCSAgICBBY3RpdmU6IEFsbG9jYXRlZCAoMSkKLQkJICAgIERpcmVjdGlvbjogVHJhbnNtaXQgKDEpCi0JCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIERlZ3JhZGVkICgyKQotCSAgICBJbnRlcmZhY2UgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCi0JCSAgICBBY3RpdmU6IEFsbG9jYXRlZCAoMSkKLQkJICAgIERpcmVjdGlvbjogVHJhbnNtaXQgKDEpCi0JCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIE9rYXkgKDEpCmRpZmYgLS1naXQgYS90ZXN0cy9sbXAub3V0IGIvdGVzdHMvbG1wLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzN2JjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9sbXAub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDg0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQmVnaW4gVmVyaWZ5LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA1NgotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IFJlbW90ZSAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBJUHY0IExpbmsgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCi0JICBWZXJpZnkgQmVnaW4gT2JqZWN0ICg4KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtuZWdvdGlhYmxlXSwgbGVuZ3RoOiAyNAotCSAgICBGbGFnczogbm9uZQotCSAgICBWZXJpZnkgSW50ZXJ2YWw6IDIwCi0JICAgIERhdGEgbGlua3M6IDMwCi0JICAgIEVuY29kaW5nIHR5cGU6IExhbWJkYSAocGhvdG9uaWMpCi0JICAgIFZlcmlmeSBUcmFucG9ydCBNZWNoYW5pc206IDMyNzY4ICgweDgwMDApIAotCSAgICBUcmFuc21pc3Npb24gUmF0ZTogMTAwLjAwMCBNYnBzCi0JICAgIFdhdmVsZW5ndGg6IDgKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDU2KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogSGVsbG8sIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDI4Ci0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQotCSAgSGVsbG8gT2JqZWN0ICg3KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMTIKLQkgICAgVHhTZXFOdW06IDUwCi0JICAgIFJjdlNlcU51bTogNjAKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzMiwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDg0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQ29uZmlnIE5BQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDU2Ci0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQotCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBOb2RlIElEOiAxMC4wLjUwLjEgKDB4MGEwMDMyMDEpCi0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMiAoMHgwMDAwMDAwMikKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKLQkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE5vZGUgSUQ6IDEwLjAuNTAuMiAoMHgwYTAwMzIwMikKLQkgIENvbmZpZ3VyYXRpb24gT2JqZWN0ICg2KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtuZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIEhlbGxvIEludGVydmFsOiA1Ci0JICAgIEhlbGxvIERlYWQgSW50ZXJ2YWw6IDE1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzMsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3NikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IENvbmZpZyBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDQ4Ci0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgQ29udHJvbCBDaGFubmVsIElEOiAxICgweDAwMDAwMDAxKQotCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBOb2RlIElEOiAxMC4wLjUwLjEgKDB4MGEwMDMyMDEpCi0JICBDb250cm9sIENoYW5uZWwgSUQgT2JqZWN0ICgxKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMiAoMHgwMDAwMDAwMikKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKLQkgIE5vZGUgSUQgT2JqZWN0ICgyKSwgQ2xhc3MtVHlwZTogUmVtb3RlICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE5vZGUgSUQ6IDEwLjAuNTAuMiAoMHgwYTAwMzIwMikKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDUzNCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDY4KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQ29uZmlnLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA0MAotCSAgQ29udHJvbCBDaGFubmVsIElEIE9iamVjdCAoMSksIENsYXNzLVR5cGU6IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIENvbnRyb2wgQ2hhbm5lbCBJRDogMSAoMHgwMDAwMDAwMSkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgTm9kZSBJRCBPYmplY3QgKDIpLCBDbGFzcy1UeXBlOiBMb2NhbCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBOb2RlIElEOiAxMC4wLjUwLjEgKDB4MGEwMDMyMDEpCi0JICBDb25maWd1cmF0aW9uIE9iamVjdCAoNiksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBIZWxsbyBJbnRlcnZhbDogNQotCSAgICBIZWxsbyBEZWFkIEludGVydmFsOiAxNQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM1LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNDQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBMaW5rIFN1bW1hcnkgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAxNgotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAxICgweDAwMDAwMDAxKQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM2LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogMTI0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogTGluayBTdW1tYXJ5IE5BQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDk2Ci0JICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgTWVzc2FnZSBJRCBBY2s6IDEgKDB4MDAwMDAwMDEpCi0JICBFcnJvciBDb2RlIE9iamVjdCAoMjApLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIEVycm9yIENvZGU6IAotCQlVbmFjY2VwdGFibGUgbm9uLW5lZ290aWFibGUgTElOS19TVU1NQVJZIHBhcmFtZXRlcnMsIAotCQlSZW5lZ290aWF0ZSBMSU5LX1NVTU1BUlkgcGFyYW1ldGVycywgCi0JCUludmFsaWQgREFUQS1MSU5LIE9iamVjdCwgCi0JCVVua25vd24gVEUtTElOSyBPYmplY3QgYy10eXBlLCAKLQkJVW5rbm93biBEQVRBLUxJTksgT2JqZWN0IGMtdHlwZQotCSAgRGF0YSBMaW5rIE9iamVjdCAoMTIpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAzNgotCSAgICBGbGFnczogW25vbmVdCi0JICAgIExvY2FsIEludGVyZmFjZSBJRDogMTkyLjE2OC4xLjEgKDB4YzBhODAxMDEpIAkJCQotCSAgICBSZW1vdGUgSW50ZXJmYWNlIElEOiAxOTIuMTY4LjEuMiAoMHhjMGE4MDEwMikKLQkgICAgU3Vib2JqZWN0LCBUeXBlOiBJbnRlcmZhY2UgU3dpdGNoaW5nIFR5cGUgKDEpLCBMZW5ndGg6IDEyCi0JCSAgICBTd2l0Y2hpbmcgVHlwZTogTGFtYmRhLVN3aXRjaCBDYXBhYmxlICgxNTApCi0JCSAgICBFbmNvZGluZyBUeXBlOiBMYW1iZGEgKHBob3RvbmljKSAoOCkKLQkJICAgIE1pbiBSZXNlcnZhYmxlIEJhbmR3aWR0aDogMTAwLjAwMCBNYnBzCi0JCSAgICBNYXggUmVzZXJ2YWJsZSBCYW5kd2lkdGg6IDEwMC4wMDAgTWJwcwotCSAgICBTdWJvYmplY3QsIFR5cGU6IFdhdmVsZW5ndGggKDIpLCBMZW5ndGg6IDgKLQkJICAgIFdhdmVsZW5ndGg6IDYKLQkgIERhdGEgTGluayBPYmplY3QgKDEyKSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMzYKLQkgICAgRmxhZ3M6IFtub25lXQotCSAgICBMb2NhbCBJbnRlcmZhY2UgSUQ6IDEwLjEuMS4xICgweDBhMDEwMTAxKSAJCQkKLQkgICAgUmVtb3RlIEludGVyZmFjZSBJRDogMTAuMS4xLjIgKDB4MGEwMTAxMDIpCi0JICAgIFN1Ym9iamVjdCwgVHlwZTogSW50ZXJmYWNlIFN3aXRjaGluZyBUeXBlICgxKSwgTGVuZ3RoOiAxMgotCQkgICAgU3dpdGNoaW5nIFR5cGU6IExhbWJkYS1Td2l0Y2ggQ2FwYWJsZSAoMTUwKQotCQkgICAgRW5jb2RpbmcgVHlwZTogQU5TSS9FVFNJIFBESCAoMykKLQkJICAgIE1pbiBSZXNlcnZhYmxlIEJhbmR3aWR0aDogMTIzNDczNjc2OC4wMDAgTWJwcwotCQkgICAgTWF4IFJlc2VydmFibGUgQmFuZHdpZHRoOiAxMjkwNjkzMzc2LjAwMCBNYnBzCi0JICAgIFN1Ym9iamVjdCwgVHlwZTogV2F2ZWxlbmd0aCAoMiksIExlbmd0aDogOAotCQkgICAgV2F2ZWxlbmd0aDogMzUzCi1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzcsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2OCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IEJlZ2luIFZlcmlmeSBBQ0ssIEZsYWdzOiBbQ29udHJvbCBDaGFubmVsIERvd25dLCBsZW5ndGg6IDQwCi0JICBMaW5rIElEIE9iamVjdCAoMyksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAxICgweDAwMDAwMDAxKQotCSAgVmVyaWZ5IEJlZ2luIEFDSyBPYmplY3QgKDkpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IERlYWQgSW50ZXJ2YWw6IDUwIAkJCQkKLQkgICAgVmVyaWZ5IFRyYW5zcG9ydCBSZXNwb25zZTogMTAwCi0JICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IElEOiA1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1MzgsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA2MCkgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IEJlZ2luIFZlcmlmeSBOQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAzMgotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMTAuMC4wLjAgKDB4MGEwMDAwMDApCi0JICBNZXNzYWdlIElEIE9iamVjdCAoNSksIENsYXNzLVR5cGU6IDIgKDIpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgTWVzc2FnZSBJRCBBY2s6IDMgKDB4MDAwMDAwMDMpCi0JICBFcnJvciBDb2RlIE9iamVjdCAoMjApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIEVycm9yIENvZGU6IAotCQlMaW5rIFZlcmlmaWNhdGlvbiBQcm9jZWR1cmUgTm90IHN1cHBvcnRlZCwgCi0JCVVud2lsbGluZyB0byB2ZXJpZnksIAotCQlVbnN1cHBvcnRlZCB2ZXJpZmljYXRpb24gdHJhbnNwb3J0IG1lY2hhbmlzbQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTM5LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBFbmQgVmVyaWZ5LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQ6IDMgKDB4MDAwMDAwMDMpCi0JICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IElEOiA1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDAsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IEVuZCBWZXJpZnkgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQotCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIFZlcmlmeSBJRDogNQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQxLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBUZXN0LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgSW50ZXJmYWNlIElEIE9iamVjdCAoNCksIENsYXNzLVR5cGU6IElQdjQgTG9jYWwgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgSVB2NCBMaW5rIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQotCSAgVmVyaWZ5IElEIE9iamVjdCAoMTApLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIFZlcmlmeSBJRDogNQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQyLCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNTIpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBUZXN0IFN0YXR1cyBGYWlsdXJlLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAyNAotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAxICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQ6IDEgKDB4MDAwMDAwMDEpCi0JICBWZXJpZnkgSUQgT2JqZWN0ICgxMCksIENsYXNzLVR5cGU6IDEgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDgKLQkgICAgVmVyaWZ5IElEOiA1Ci1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDMsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA1MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IFRlc3QgU3RhdHVzIEFDSywgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMjQKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMSAoMHgwMDAwMDAwMSkKLQkgIFZlcmlmeSBJRCBPYmplY3QgKDEwKSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBWZXJpZnkgSUQ6IDUKLUlQICh0b3MgMHgwLCB0dGwgICAxLCBpZCA0NDU0NCwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDQ0KSAxMC4wLjEyLjEuNDk5OTggPiAxMC4wLjEyLjIuNDk5OTg6IAotCUxNUHYxLCBtc2ctdHlwZTogQ2hhbm5lbCBTdGF0dXMgQUNLLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAxNgotCSAgTWVzc2FnZSBJRCBPYmplY3QgKDUpLCBDbGFzcy1UeXBlOiAyICgyKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIE1lc3NhZ2UgSUQgQWNrOiAzICgweDAwMDAwMDAzKQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQ1LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBDaGFubmVsIFN0YXR1cyBSZXF1ZXN0LCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiAzNgotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgQ2hhbm5lbCBTdGF0dXMgUmVxdWVzdCBPYmplY3QgKDE0KSwgQ2xhc3MtVHlwZTogSVB2NCAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogMTIKLQkgICAgSW50ZXJmYWNlIElEOiAyLjAuMC4wICgweDAyMDAwMDAwKQotCSAgICBJbnRlcmZhY2UgSUQ6IDIuMC4wLjAgKDB4MDIwMDAwMDApCi1JUCAodG9zIDB4MCwgdHRsICAgMSwgaWQgNDQ1NDYsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3MikgMTAuMC4xMi4xLjQ5OTk4ID4gMTAuMC4xMi4yLjQ5OTk4OiAKLQlMTVB2MSwgbXNnLXR5cGU6IENoYW5uZWwgU3RhdHVzLCBGbGFnczogW0NvbnRyb2wgQ2hhbm5lbCBEb3duXSwgbGVuZ3RoOiA0NAotCSAgTGluayBJRCBPYmplY3QgKDMpLCBDbGFzcy1UeXBlOiBJUHY0IExvY2FsICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiA4Ci0JICAgIElQdjQgTGluayBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMSAoMSkgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEOiAzICgweDAwMDAwMDAzKQotCSAgQ2hhbm5lbCBTdGF0dXMgT2JqZWN0ICgxMyksIENsYXNzLVR5cGU6IElQdjQgKDEpIEZsYWdzOiBbbm9uLW5lZ290aWFibGVdLCBsZW5ndGg6IDIwCi0JICAgIEludGVyZmFjZSBJRDogMS4wLjAuMCAoMHgwMTAwMDAwMCkKLQkJICAgIEFjdGl2ZTogQWxsb2NhdGVkICgxKQotCQkgICAgRGlyZWN0aW9uOiBUcmFuc21pdCAoMSkKLQkJICAgIENoYW5uZWwgU3RhdHVzOiBTaWduYWwgRmFpbCAoMykKLQkgICAgSW50ZXJmYWNlIElEOiAxLjAuMC4wICgweDAxMDAwMDAwKQotCQkgICAgQWN0aXZlOiBBbGxvY2F0ZWQgKDEpCi0JCSAgICBEaXJlY3Rpb246IFJlY2VpdmUgKDApCi0JCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIERlZ3JhZGVkICgyKQotSVAgKHRvcyAweDAsIHR0bCAgIDEsIGlkIDQ0NTQ3LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogVURQICgxNyksIGxlbmd0aDogNjQpIDEwLjAuMTIuMS40OTk5OCA+IDEwLjAuMTIuMi40OTk5ODogCi0JTE1QdjEsIG1zZy10eXBlOiBDaGFubmVsIFN0YXR1cyBSZXNwb25zZSwgRmxhZ3M6IFtDb250cm9sIENoYW5uZWwgRG93bl0sIGxlbmd0aDogMzYKLQkgIE1lc3NhZ2UgSUQgT2JqZWN0ICg1KSwgQ2xhc3MtVHlwZTogMiAoMikgRmxhZ3M6IFtub24tbmVnb3RpYWJsZV0sIGxlbmd0aDogOAotCSAgICBNZXNzYWdlIElEIEFjazogMyAoMHgwMDAwMDAwMykKLQkgIENoYW5uZWwgU3RhdHVzIE9iamVjdCAoMTMpLCBDbGFzcy1UeXBlOiBJUHY0ICgxKSBGbGFnczogW25vbi1uZWdvdGlhYmxlXSwgbGVuZ3RoOiAyMAotCSAgICBJbnRlcmZhY2UgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCi0JCSAgICBBY3RpdmU6IEFsbG9jYXRlZCAoMSkKLQkJICAgIERpcmVjdGlvbjogVHJhbnNtaXQgKDEpCi0JCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIERlZ3JhZGVkICgyKQotCSAgICBJbnRlcmZhY2UgSUQ6IDEuMC4wLjAgKDB4MDEwMDAwMDApCi0JCSAgICBBY3RpdmU6IEFsbG9jYXRlZCAoMSkKLQkJICAgIERpcmVjdGlvbjogVHJhbnNtaXQgKDEpCi0JCSAgICBDaGFubmVsIFN0YXR1czogU2lnbmFsIE9rYXkgKDEpCmRpZmYgLS1naXQgYS90ZXN0cy9sbXAucGNhcCBiL3Rlc3RzL2xtcC5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDdlM2JiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2xtcC5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbG1wLnB1dSBiL3Rlc3RzL2xtcC5wdXUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNGNkNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbG1wLnB1dQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLWJlZ2luIDY0NCBsbXAucGNhcAotTVUsLlJIMChgIWBgYGBgYGBgYGBgYC9fX2BgYCFgYGBgSSFKLTAmO0pgYCFCYGBgYDhAYGBgYGAlNzVTSgotTVFAYCQ9PSImMkBAYDEwYGA1KldSYGBgISQ9XkQiQGAsYDBIYCNgKyMzTC0uYCRgYGAhYGBgYDRgLmBgYAotTWAwLGAiYCRgYGBgISEwYChgYGBgYFAoI2BgQCFgYGBgQDBAYCZgYGBgITBgYGBgPiIpKmBgJCsoYGBgYAotTWBgYChJIUotMCNTUWBgISZgYGBgMUBgYGBgYCU3NVNKUUBgJD09IiYyQEBgMTBgYC4qV1NgYGAhJD1eXwotTSJAYCxgMEhgI2ArIzNMLS5gIjBgYCFgYGBgMGAnYGBgYDAkYCJgYGBgYCQhIVBgLGBgYGAsQGBgYCNSRAotTSZIVWBALyhgYCYoYGBgIUJgYGBgYGA1PTcuSyZgYDFVVCg5KiJgISVgYCE0Sz8wYGBgJDFXWigqYGBQIQotTSJAYCxgTC0uUFRYYDBgYGAkYGBgYFBgWGBgYCFgMGAoYGBgYGAwJCJgYEAqYCMoIWBAJGAiYGBgYGAoIgotTSEwYChgYGBgYFAoImBgQCpgIygiQDA4YCJgYCVgYF5EJkhVYD9fLGBgJUhgYGAhOmBgYGBgYDU9Ny5LJgotTWBgMVVUKDkqImAhJWBgISxLPzRgYGAkMVdaRCpgYFAhIkBgLGBMLS5QVFhgLmBgYCRgYGBgQGBQYGBgIQotTWAwYChgYGBgYDAkImBgQCpgIyghYEAkYCJgYGBgYCgiITBgKGBgYGBgUCgiYGBAKmAjKCJJIUotMCcrVAotTWBgITJgYGBgNEBgYGBgYCU3NVNKUUBgJD09IiYyQEBgMTBgYDEqV1ZgYGAhJD1eUCJAYCxgMEhgI2ArIwotTTNMLS5gI2BgYCFgYGBgJGAqYGBgYDAkYCJgYGBgYCQhITBgKGBgYGBgUCQiYGBAKmAjKCFAMDhgImBgJQotTWBgXkQmSFVgMF80YGAjSGBgYGBaYGBgYGBgNT03LksmYGAxVVQoOSoiYCElYGBgTEs/PGBgYCQxV1w8KgotTWBgUCEiQGAsYEwtLlBUWGAmYGBgJGBgYCNQYDBgYGAiITBgKGBgYGBgOjA6QzQiRV1QYGBCQGBgYChIYAotTWBgYGAhNVU8Wkw4YCEnNzBBREgoYCQ0YGAnUk1eYGBgYDEnPz1ASGAjYCQqYGBQIlBUWyMzQCFIYGBgMAotTWBgYDBgJmBgYGAoJWBgQGBgYGAhYEEwYCJgYGBgI0whI2BgRGBgYGBgLCJIYDAnYEpgJCJgMFI2IiQrKAotTWBgISJSYGBgYEBAYGBgYGBgYDghI2BgRGBgYGBgYEghYDAkKmAwJCJgMFI2YFRaMywyVS5GPVM2YEBAYAotTWBgYGBgNiZEJkhVYEMvQGBgJShgYGAhMmBgYGBgYDU9Ny5LJmBgMVVUKDkqImAhJWBgISRLP0RgYGAkMQotTVdaVCpgYFAhIkBgLGBMLS5QVFhgLGBgYCRgYGAhQGBIYGBgIWBQYChgMGBgYGAoJWBgQGBgYGAhQDBEYAotTSJgYFJgJjAhIkBgKGBgYGAhOjA6QzQhRV4wYGAyQGBgYCRIYGBgYGAhNVU8Wkw4YCEnNzBBREgoYCQ0YAotTWAjUk1eQGBgYDEnP01gSGAjYCQqYGBQIlBUWyMzQGBIYGBgMGBgYCdgImBgYGAkI2BgQCpgYGBgYEA0YAotTSJgYGBgYCwhJWBgKGBgYGAhWjA6QzRgUV5AYGAwQGBgYCQoYGBgYGAhNVU8Wkw4YCEnNzBBREgoYCQ0YAotTWAjMk1eUGBgYDEnP05QSGAjYCQqYGBQIlBUWyMzQGBAYGBgMGBgYChgIUBgYGAkJWBgQGBgYGAjYDBIYAotTSJgYGBgYDZEJkhVYGBfTGBgJChgYGAhImBgYGBgYDU9Ny5LJmBgMVVUKDkqImAhJWBgYFRLP1BgYGAkMQotTVdbSCpgYFAhIkBgLGBMLS5QVFhgKGBgYCRgYGAiMGA4YGBgIiEwYChgYGBgYFAkKmBgQGBgYGAlSSFKLQotTTAtI1tgYCEiYGBgYDBAYGBgYGAlNzVTSlFAYCQ9PSImMkBAYDEwYGAtKlddYGBgISQ9XlkiQGAsYDBIYAotTSNgKyMzTC0uYCJgYGAhYGBgYEhgJmBgYGAwMGAiYCRgYGBgISJAYChgYGBgITowOkM0Ij1fYGBgMEBgYAotTWAkKGBgYGBgITVVPFpMOGAhJzcwQURIKGAkNGBgIzJNX0BgYGAxJz9OYEhgI2AkKmBgUCJQVFsjM0BgQAotTWBgYDBgYGAsYCFAYGBgJCVgYEBgYGBgIWAwSGAiYGBgYGA2RCZIVWA6P1RgYCQoYGBgISJgYGBgYGA1PQotTTcuSyZgYDFVVCg5KiJgISVgYGBUSz9cYGBgJDFXWzwqYGBQISJAYCxgTC0uUFRYYChgYGAkYGBgIzBgOAotTWBgYCIhMGAoYGBgYGAwJCpgYEBgYGBgJUkhSi0wI0NeYGBgWmBgYGAuQGBgYGBgJTc1U0pRQGAkPT0iJgotTTJAQGAxMGBgKypYYGBgYCEkPV5eIkBgLGAwSGAjYCsjM0wtLmAhQGBgIWBgYCEoYCRgYGBgQDRgImBgYAotTWBgLkQmSFVgKT9cYGAkWGBgYCEuYGBgYGBgNT03LksmYGAxVVQoOSoiYCElYGAhYEtAJGBgYCQxV1pEKgotTWBgUCEiQGAsYEwtLlBUWGArYGBgJGBgYCRQYERgYGAhYFBgKGAwYGBgYCQlYGBAYGBgYCNgMFhgI2AoYAotTWBgYCJgYGBgSSFKLTBgOGBgMCE2YGBgYDVAYGBgYGAlNzVTSlFAYCQ9PSImMkBAYDEwYGAyKlgiYGBgIQotTSQ9XkAiQGAsYDBIYCNgKyMzTC0uYCMwYGAhYGBgISRgK2BgYGAwLGAiYCRgYGBgISEwYChgYGBgYFAkLQotTWAhMCFgYGBgUGBgYGBQJGBgYCJgYGBgIkkhSi0wLTRgYDAhLmBgYGAzQGBgYGBgJTc1U0pRQGAkPT0iJgotTTJAQGAxMGBgMCpYI2BgYCEkPV5HIkBgLGAwSGAjYCsjM0wtLmAiUGBgIWBgYCEwYClgYGBgQDRgImBgYAotNmBgLCEjMGA0YDBgYGAsYGBgYCghYGBgYFBgYGBgMGBgCi1gCi1lbmQKZGlmZiAtLWdpdCBhL3Rlc3RzL2xtcC5zaCBiL3Rlc3RzL2xtcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTkxOTA0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9sbXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIS9iaW4vc2gKLQotdXVkZWNvZGUgbG1wLnB1dQotCi1lY2hvIC1uIHRlc3QgbG1wIC4uLgotLi4vdGNwZHVtcCAtdCAtbiAtdiAtciBsbXAucGNhcCA+bG1wLm5ldwotaWYgZGlmZiBsbXAubmV3IGxtcC5vdXQKLXRoZW4KLQllY2hvIHBhc3NlZC4KLWVsc2UKLQllY2hvIGZhaWxlZC4KLWZpCi0JCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL2xzcHBpbmctZmVjLWxkcC5wY2FwIGIvdGVzdHMvbHNwcGluZy1mZWMtbGRwLnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTg2YzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbHNwcGluZy1mZWMtbGRwLnBjYXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9sc3BwaW5nLWZlYy1yc3ZwLnBjYXAgYi90ZXN0cy9sc3BwaW5nLWZlYy1yc3ZwLnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGNmNTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvbHNwcGluZy1mZWMtcnN2cC5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBscy1sZHAtaGVsbG8ubmV3IGIvdGVzdHMvbXBscy1sZHAtaGVsbG8ubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTYyMWNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL21wbHMtbGRwLWhlbGxvLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotSVAgKHRvcyAweGMwLCB0dGwgICAxLCBpZCAxNTU3OSwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IFVEUCAoMTcpLCBsZW5ndGg6IDcwKSAxMC4xLjEuMy42NDYgPiAyMjQuMC4wLjIuNjQ2OiAKLQlMRFAsIExhYmVsLVNwYWNlLUlEOiAxMC4xLjAuMjowLCBwZHUtbGVuZ3RoOiAzOAotCSAgSGVsbG8gTWVzc2FnZSAoMHgwMTAwKSwgbGVuZ3RoOiAyOCwgTWVzc2FnZSBJRDogMHgwMDAxMTk3MCwgRmxhZ3M6IFtpZ25vcmUgaWYgdW5rbm93bl0KLQkgICAgQ29tbW9uIEhlbGxvIFBhcmFtZXRlcnMgVExWICgweDA0MDApLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCi0JICAgICAgSG9sZCBUaW1lOiAxNXMsIEZsYWdzOiBbTGluayBIZWxsb10KLQkgICAgSVB2NCBUcmFuc3BvcnQgQWRkcmVzcyBUTFYgKDB4MDQwMSksIGxlbmd0aDogNCwgRmxhZ3M6IFtpZ25vcmUgYW5kIGRvbid0IGZvcndhcmQgaWYgdW5rbm93bl0KLQkgICAgICBJUHY0IFRyYW5zcG9ydCBBZGRyZXNzOiAxMC4xLjAuMgotCSAgICBDb25maWd1cmF0aW9uIFNlcXVlbmNlIE51bWJlciBUTFYgKDB4MDQwMiksIGxlbmd0aDogNCwgRmxhZ3M6IFtpZ25vcmUgYW5kIGRvbid0IGZvcndhcmQgaWYgdW5rbm93bl0KLQkgICAgICBTZXF1ZW5jZSBOdW1iZXI6IDEKZGlmZiAtLWdpdCBhL3Rlc3RzL21wbHMtbGRwLWhlbGxvLm91dCBiL3Rlc3RzL21wbHMtbGRwLWhlbGxvLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE2MjFjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUlQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgMTU1NzksIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBVRFAgKDE3KSwgbGVuZ3RoOiA3MCkgMTAuMS4xLjMuNjQ2ID4gMjI0LjAuMC4yLjY0NjogCi0JTERQLCBMYWJlbC1TcGFjZS1JRDogMTAuMS4wLjI6MCwgcGR1LWxlbmd0aDogMzgKLQkgIEhlbGxvIE1lc3NhZ2UgKDB4MDEwMCksIGxlbmd0aDogMjgsIE1lc3NhZ2UgSUQ6IDB4MDAwMTE5NzAsIEZsYWdzOiBbaWdub3JlIGlmIHVua25vd25dCi0JICAgIENvbW1vbiBIZWxsbyBQYXJhbWV0ZXJzIFRMViAoMHgwNDAwKSwgbGVuZ3RoOiA0LCBGbGFnczogW2lnbm9yZSBhbmQgZG9uJ3QgZm9yd2FyZCBpZiB1bmtub3duXQotCSAgICAgIEhvbGQgVGltZTogMTVzLCBGbGFnczogW0xpbmsgSGVsbG9dCi0JICAgIElQdjQgVHJhbnNwb3J0IEFkZHJlc3MgVExWICgweDA0MDEpLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCi0JICAgICAgSVB2NCBUcmFuc3BvcnQgQWRkcmVzczogMTAuMS4wLjIKLQkgICAgQ29uZmlndXJhdGlvbiBTZXF1ZW5jZSBOdW1iZXIgVExWICgweDA0MDIpLCBsZW5ndGg6IDQsIEZsYWdzOiBbaWdub3JlIGFuZCBkb24ndCBmb3J3YXJkIGlmIHVua25vd25dCi0JICAgICAgU2VxdWVuY2UgTnVtYmVyOiAxCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5wY2FwIGIvdGVzdHMvbXBscy1sZHAtaGVsbG8ucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRhNDJiNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvbXBscy1sZHAtaGVsbG8ucHV1IGIvdGVzdHMvbXBscy1sZHAtaGVsbG8ucHV1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2YzYjYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL21wbHMtbGRwLWhlbGxvLnB1dQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmVnaW4gNjQ0IG1wbHMtbGRwLWhlbGxvLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGAuSCVgYGApYGBgYDFVRlovRTInI2AhKmBgYGAyQGBgYC9cI2AiJSUKLU1QYCEmLy1MYGBgJDFEMDgqYDAkI1hgYGBgQComYEg4YCxNMj5gYCRgKUBIIWBgKGBgYCRgYCFQYGAxRVAKLTghYGBgIWBgL2BgYCRgMGAkIkAkYGBAMCJgYDBgYGBgIQotYAotZW5kCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLWxkcC1oZWxsby5zaCBiL3Rlc3RzL21wbHMtbGRwLWhlbGxvLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiMWE1YjE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL21wbHMtbGRwLWhlbGxvLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIG1wbHMtbGRwLWhlbGxvLnB1dQotCi1lY2hvIC1uIHRlc3QgbXBscy1sZHAtaGVsbG8gLi4uCi0uLi90Y3BkdW1wIC10IC1uIC12IC1yIG1wbHMtbGRwLWhlbGxvLnBjYXAgPm1wbHMtbGRwLWhlbGxvLm5ldwotaWYgZGlmZiBtcGxzLWxkcC1oZWxsby5uZXcgbXBscy1sZHAtaGVsbG8ub3V0Ci10aGVuCi0JZWNobyBwYXNzZWQuCi1lbHNlCi0JZWNobyBmYWlsZWQuCi1maQotCQotCmRpZmYgLS1naXQgYS90ZXN0cy9tcGxzLXRyYWNlcm91dGUucGNhcCBiL3Rlc3RzL21wbHMtdHJhY2Vyb3V0ZS5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzBiNmIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL21wbHMtdHJhY2Vyb3V0ZS5wY2FwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NwZi1nbXBscy5uZXcgYi90ZXN0cy9vc3BmLWdtcGxzLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1YWZmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vc3BmLWdtcGxzLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLUlQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgNDA1Miwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IE9TUEYgKDg5KSwgbGVuZ3RoOiAxNzIpIDQwLjM1LjEuMiA+IDIyNC4wLjAuNTogT1NQRnYyLCBMUy1VcGRhdGUsIGxlbmd0aDogMTUyCi0JUm91dGVyLUlEOiAxMC4yNTUuMjQ1LjM1LCBCYWNrYm9uZSBBcmVhLCBBdXRoZW50aWNhdGlvbiBUeXBlOiBub25lICgwKSwgMSBMU0EKLQkgIExTQSAjMQotCSAgQWR2ZXJ0aXNpbmcgUm91dGVyOiAxMC4yNTUuMjQ1LjM3LCBzZXEgMHg4MDAwMDAwMiwgYWdlIDlzLCBsZW5ndGg6IDEwNAotCSAgICBBcmVhIExvY2FsIE9wYXF1ZSBMU0EgKDEwKSwgT3BhcXVlLVR5cGU6IFRyYWZmaWMgRW5naW5lZXJpbmcgTFNBICgxKSwgT3BhcXVlLUlEOiA4Ci0JICAgIE9wdGlvbnM6IFtFeHRlcm5hbF0KLQkgICAgTGluayBUTFYgKDIpLCBsZW5ndGg6IDEwMAotCSAgICAgIExpbmsgVHlwZSBzdWJUTFYgKDEpLCBsZW5ndGg6IDEsIFBvaW50LXRvLXBvaW50ICgxKQotCSAgICAgIExpbmsgSUQgc3ViVExWICgyKSwgbGVuZ3RoOiA0LCAxMC4yNTUuMjQ1LjY5ICgweDBhZmZmNTQ1KQotCSAgICAgIExvY2FsIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoMyksIGxlbmd0aDogNCwgMTAuOS4xNDIuMQotCSAgICAgIFJlbW90ZSBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDQpLCBsZW5ndGg6IDQsIDEwLjkuMTQyLjIKLQkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyA2MwotCSAgICAgIE1heGltdW0gQmFuZHdpZHRoIHN1YlRMViAoNiksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCi0JICAgICAgTWF4aW11bSBSZXNlcnZhYmxlIEJhbmR3aWR0aCBzdWJUTFYgKDcpLCBsZW5ndGg6IDQsIDYyMi4wODAgTWJwcwotCSAgICAgIFVucmVzZXJ2ZWQgQmFuZHdpZHRoIHN1YlRMViAoOCksIGxlbmd0aDogMzIKLQkJVEUtQ2xhc3MgMDogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDE6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyAyOiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgMzogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDQ6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyA1OiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgNjogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDc6IDYyMi4wODAgTWJwcwotCSAgICAgIEFkbWluaXN0cmF0aXZlIEdyb3VwIHN1YlRMViAoOSksIGxlbmd0aDogNCwgMHgwMDAwMDAwMAotSVAgKHRvcyAweGMwLCB0dGwgICAxLCBpZCA0MTA2LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogT1NQRiAoODkpLCBsZW5ndGg6IDE3MikgNDAuMzUuMS4yID4gMjI0LjAuMC41OiBPU1BGdjIsIExTLVVwZGF0ZSwgbGVuZ3RoOiAxNTIKLQlSb3V0ZXItSUQ6IDEwLjI1NS4yNDUuMzUsIEJhY2tib25lIEFyZWEsIEF1dGhlbnRpY2F0aW9uIFR5cGU6IG5vbmUgKDApLCAxIExTQQotCSAgTFNBICMxCi0JICBBZHZlcnRpc2luZyBSb3V0ZXI6IDEwLjI1NS4yNDUuMzcsIHNlcSAweDgwMDAwMDAyLCBhZ2UgOXMsIGxlbmd0aDogMTA0Ci0JICAgIEFyZWEgTG9jYWwgT3BhcXVlIExTQSAoMTApLCBPcGFxdWUtVHlwZTogVHJhZmZpYyBFbmdpbmVlcmluZyBMU0EgKDEpLCBPcGFxdWUtSUQ6IDkKLQkgICAgT3B0aW9uczogW0V4dGVybmFsXQotCSAgICBMaW5rIFRMViAoMiksIGxlbmd0aDogMTAwCi0JICAgICAgTGluayBUeXBlIHN1YlRMViAoMSksIGxlbmd0aDogMSwgUG9pbnQtdG8tcG9pbnQgKDEpCi0JICAgICAgTGluayBJRCBzdWJUTFYgKDIpLCBsZW5ndGg6IDQsIDEwLjI1NS4yNDUuNjkgKDB4MGFmZmY1NDUpCi0JICAgICAgTG9jYWwgSW50ZXJmYWNlIElQIGFkZHJlc3Mgc3ViVExWICgzKSwgbGVuZ3RoOiA0LCAxMC45LjE0My4xCi0JICAgICAgUmVtb3RlIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoNCksIGxlbmd0aDogNCwgMTAuOS4xNDMuMgotCSAgICAgIFRyYWZmaWMgRW5naW5lZXJpbmcgTWV0cmljIHN1YlRMViAoNSksIGxlbmd0aDogNCwgTWV0cmljIDYzCi0JICAgICAgTWF4aW11bSBCYW5kd2lkdGggc3ViVExWICg2KSwgbGVuZ3RoOiA0LCA2MjIuMDgwIE1icHMKLQkgICAgICBNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIHN1YlRMViAoNyksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCi0JICAgICAgVW5yZXNlcnZlZCBCYW5kd2lkdGggc3ViVExWICg4KSwgbGVuZ3RoOiAzMgotCQlURS1DbGFzcyAwOiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgMTogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDI6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyAzOiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgNDogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDU6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyA2OiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgNzogNjIyLjA4MCBNYnBzCi0JICAgICAgQWRtaW5pc3RyYXRpdmUgR3JvdXAgc3ViVExWICg5KSwgbGVuZ3RoOiA0LCAweDAwMDAwMDAwCi1JUCAodG9zIDB4YzAsIHR0bCAgIDEsIGlkIDQxNjAsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBPU1BGICg4OSksIGxlbmd0aDogMjEyKSA0MC4zNS4xLjIgPiAyMjQuMC4wLjU6IE9TUEZ2MiwgTFMtVXBkYXRlLCBsZW5ndGg6IDE5MgotCVJvdXRlci1JRDogMTAuMjU1LjI0NS4zNSwgQmFja2JvbmUgQXJlYSwgQXV0aGVudGljYXRpb24gVHlwZTogbm9uZSAoMCksIDEgTFNBCi0JICBMU0EgIzEKLQkgIEFkdmVydGlzaW5nIFJvdXRlcjogMTAuMjU1LjI0NS4zNSwgc2VxIDB4ODAwMDAwMDMsIGFnZSAzcywgbGVuZ3RoOiAxNDQKLQkgICAgQXJlYSBMb2NhbCBPcGFxdWUgTFNBICgxMCksIE9wYXF1ZS1UeXBlOiBUcmFmZmljIEVuZ2luZWVyaW5nIExTQSAoMSksIE9wYXF1ZS1JRDogMwotCSAgICBPcHRpb25zOiBbRXh0ZXJuYWxdCi0JICAgIExpbmsgVExWICgyKSwgbGVuZ3RoOiAxNDAKLQkgICAgICBMaW5rIFR5cGUgc3ViVExWICgxKSwgbGVuZ3RoOiAxLCBQb2ludC10by1wb2ludCAoMSkKLQkgICAgICBMaW5rIElEIHN1YlRMViAoMiksIGxlbmd0aDogNCwgMTAuMjU1LjI0NS40MCAoMHgwYWZmZjUyOCkKLQkgICAgICBMb2NhbCBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDMpLCBsZW5ndGg6IDQsIDEwLjQwLjM1LjE0Ci0JICAgICAgUmVtb3RlIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoNCksIGxlbmd0aDogNCwgMTAuNDAuMzUuMTMKLQkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyAxCi0JICAgICAgTWF4aW11bSBCYW5kd2lkdGggc3ViVExWICg2KSwgbGVuZ3RoOiA0LCAxMDAuMDAwIE1icHMKLQkgICAgICBNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIHN1YlRMViAoNyksIGxlbmd0aDogNCwgMTAwLjAwMCBNYnBzCi0JICAgICAgVW5yZXNlcnZlZCBCYW5kd2lkdGggc3ViVExWICg4KSwgbGVuZ3RoOiAzMgotCQlURS1DbGFzcyAwOiAwLjAwMCBNYnBzCi0JCVRFLUNsYXNzIDE6IDAuMDAwIE1icHMKLQkJVEUtQ2xhc3MgMjogMC4wMDAgTWJwcwotCQlURS1DbGFzcyAzOiAwLjAwMCBNYnBzCi0JCVRFLUNsYXNzIDQ6IDAuMDAwIE1icHMKLQkJVEUtQ2xhc3MgNTogMC4wMDAgTWJwcwotCQlURS1DbGFzcyA2OiAwLjAwMCBNYnBzCi0JCVRFLUNsYXNzIDc6IDAuMDAwIE1icHMKLQkgICAgICBJbnRlcmZhY2UgU3dpdGNoaW5nIENhcGFiaWxpdHkgc3ViVExWICgxNSksIGxlbmd0aDogNDQKLQkJSW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5OiBQYWNrZXQtU3dpdGNoIENhcGFibGUtMQotCQlMU1AgRW5jb2Rpbmc6IEV0aGVybmV0IFYyL0RJWAotCQlNYXggTFNQIEJhbmR3aWR0aDoKLQkJICBwcmlvcml0eSBsZXZlbCAwOiAwLjAwMCBNYnBzCi0JCSAgcHJpb3JpdHkgbGV2ZWwgMTogMC4wMDAgTWJwcwotCQkgIHByaW9yaXR5IGxldmVsIDI6IDAuMDAwIE1icHMKLQkJICBwcmlvcml0eSBsZXZlbCAzOiAwLjAwMCBNYnBzCi0JCSAgcHJpb3JpdHkgbGV2ZWwgNDogMC4wMDAgTWJwcwotCQkgIHByaW9yaXR5IGxldmVsIDU6IDAuMDAwIE1icHMKLQkJICBwcmlvcml0eSBsZXZlbCA2OiAwLjAwMCBNYnBzCi0JCSAgcHJpb3JpdHkgbGV2ZWwgNzogMC4wMDAgTWJwcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NwZi1nbXBscy5vdXQgYi90ZXN0cy9vc3BmLWdtcGxzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1YWZmYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vc3BmLWdtcGxzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLUlQICh0b3MgMHhjMCwgdHRsICAgMSwgaWQgNDA1Miwgb2Zmc2V0IDAsIGZsYWdzIFtub25lXSwgcHJvdG86IE9TUEYgKDg5KSwgbGVuZ3RoOiAxNzIpIDQwLjM1LjEuMiA+IDIyNC4wLjAuNTogT1NQRnYyLCBMUy1VcGRhdGUsIGxlbmd0aDogMTUyCi0JUm91dGVyLUlEOiAxMC4yNTUuMjQ1LjM1LCBCYWNrYm9uZSBBcmVhLCBBdXRoZW50aWNhdGlvbiBUeXBlOiBub25lICgwKSwgMSBMU0EKLQkgIExTQSAjMQotCSAgQWR2ZXJ0aXNpbmcgUm91dGVyOiAxMC4yNTUuMjQ1LjM3LCBzZXEgMHg4MDAwMDAwMiwgYWdlIDlzLCBsZW5ndGg6IDEwNAotCSAgICBBcmVhIExvY2FsIE9wYXF1ZSBMU0EgKDEwKSwgT3BhcXVlLVR5cGU6IFRyYWZmaWMgRW5naW5lZXJpbmcgTFNBICgxKSwgT3BhcXVlLUlEOiA4Ci0JICAgIE9wdGlvbnM6IFtFeHRlcm5hbF0KLQkgICAgTGluayBUTFYgKDIpLCBsZW5ndGg6IDEwMAotCSAgICAgIExpbmsgVHlwZSBzdWJUTFYgKDEpLCBsZW5ndGg6IDEsIFBvaW50LXRvLXBvaW50ICgxKQotCSAgICAgIExpbmsgSUQgc3ViVExWICgyKSwgbGVuZ3RoOiA0LCAxMC4yNTUuMjQ1LjY5ICgweDBhZmZmNTQ1KQotCSAgICAgIExvY2FsIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoMyksIGxlbmd0aDogNCwgMTAuOS4xNDIuMQotCSAgICAgIFJlbW90ZSBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDQpLCBsZW5ndGg6IDQsIDEwLjkuMTQyLjIKLQkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyA2MwotCSAgICAgIE1heGltdW0gQmFuZHdpZHRoIHN1YlRMViAoNiksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCi0JICAgICAgTWF4aW11bSBSZXNlcnZhYmxlIEJhbmR3aWR0aCBzdWJUTFYgKDcpLCBsZW5ndGg6IDQsIDYyMi4wODAgTWJwcwotCSAgICAgIFVucmVzZXJ2ZWQgQmFuZHdpZHRoIHN1YlRMViAoOCksIGxlbmd0aDogMzIKLQkJVEUtQ2xhc3MgMDogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDE6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyAyOiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgMzogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDQ6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyA1OiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgNjogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDc6IDYyMi4wODAgTWJwcwotCSAgICAgIEFkbWluaXN0cmF0aXZlIEdyb3VwIHN1YlRMViAoOSksIGxlbmd0aDogNCwgMHgwMDAwMDAwMAotSVAgKHRvcyAweGMwLCB0dGwgICAxLCBpZCA0MTA2LCBvZmZzZXQgMCwgZmxhZ3MgW25vbmVdLCBwcm90bzogT1NQRiAoODkpLCBsZW5ndGg6IDE3MikgNDAuMzUuMS4yID4gMjI0LjAuMC41OiBPU1BGdjIsIExTLVVwZGF0ZSwgbGVuZ3RoOiAxNTIKLQlSb3V0ZXItSUQ6IDEwLjI1NS4yNDUuMzUsIEJhY2tib25lIEFyZWEsIEF1dGhlbnRpY2F0aW9uIFR5cGU6IG5vbmUgKDApLCAxIExTQQotCSAgTFNBICMxCi0JICBBZHZlcnRpc2luZyBSb3V0ZXI6IDEwLjI1NS4yNDUuMzcsIHNlcSAweDgwMDAwMDAyLCBhZ2UgOXMsIGxlbmd0aDogMTA0Ci0JICAgIEFyZWEgTG9jYWwgT3BhcXVlIExTQSAoMTApLCBPcGFxdWUtVHlwZTogVHJhZmZpYyBFbmdpbmVlcmluZyBMU0EgKDEpLCBPcGFxdWUtSUQ6IDkKLQkgICAgT3B0aW9uczogW0V4dGVybmFsXQotCSAgICBMaW5rIFRMViAoMiksIGxlbmd0aDogMTAwCi0JICAgICAgTGluayBUeXBlIHN1YlRMViAoMSksIGxlbmd0aDogMSwgUG9pbnQtdG8tcG9pbnQgKDEpCi0JICAgICAgTGluayBJRCBzdWJUTFYgKDIpLCBsZW5ndGg6IDQsIDEwLjI1NS4yNDUuNjkgKDB4MGFmZmY1NDUpCi0JICAgICAgTG9jYWwgSW50ZXJmYWNlIElQIGFkZHJlc3Mgc3ViVExWICgzKSwgbGVuZ3RoOiA0LCAxMC45LjE0My4xCi0JICAgICAgUmVtb3RlIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoNCksIGxlbmd0aDogNCwgMTAuOS4xNDMuMgotCSAgICAgIFRyYWZmaWMgRW5naW5lZXJpbmcgTWV0cmljIHN1YlRMViAoNSksIGxlbmd0aDogNCwgTWV0cmljIDYzCi0JICAgICAgTWF4aW11bSBCYW5kd2lkdGggc3ViVExWICg2KSwgbGVuZ3RoOiA0LCA2MjIuMDgwIE1icHMKLQkgICAgICBNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIHN1YlRMViAoNyksIGxlbmd0aDogNCwgNjIyLjA4MCBNYnBzCi0JICAgICAgVW5yZXNlcnZlZCBCYW5kd2lkdGggc3ViVExWICg4KSwgbGVuZ3RoOiAzMgotCQlURS1DbGFzcyAwOiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgMTogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDI6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyAzOiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgNDogNjIyLjA4MCBNYnBzCi0JCVRFLUNsYXNzIDU6IDYyMi4wODAgTWJwcwotCQlURS1DbGFzcyA2OiA2MjIuMDgwIE1icHMKLQkJVEUtQ2xhc3MgNzogNjIyLjA4MCBNYnBzCi0JICAgICAgQWRtaW5pc3RyYXRpdmUgR3JvdXAgc3ViVExWICg5KSwgbGVuZ3RoOiA0LCAweDAwMDAwMDAwCi1JUCAodG9zIDB4YzAsIHR0bCAgIDEsIGlkIDQxNjAsIG9mZnNldCAwLCBmbGFncyBbbm9uZV0sIHByb3RvOiBPU1BGICg4OSksIGxlbmd0aDogMjEyKSA0MC4zNS4xLjIgPiAyMjQuMC4wLjU6IE9TUEZ2MiwgTFMtVXBkYXRlLCBsZW5ndGg6IDE5MgotCVJvdXRlci1JRDogMTAuMjU1LjI0NS4zNSwgQmFja2JvbmUgQXJlYSwgQXV0aGVudGljYXRpb24gVHlwZTogbm9uZSAoMCksIDEgTFNBCi0JICBMU0EgIzEKLQkgIEFkdmVydGlzaW5nIFJvdXRlcjogMTAuMjU1LjI0NS4zNSwgc2VxIDB4ODAwMDAwMDMsIGFnZSAzcywgbGVuZ3RoOiAxNDQKLQkgICAgQXJlYSBMb2NhbCBPcGFxdWUgTFNBICgxMCksIE9wYXF1ZS1UeXBlOiBUcmFmZmljIEVuZ2luZWVyaW5nIExTQSAoMSksIE9wYXF1ZS1JRDogMwotCSAgICBPcHRpb25zOiBbRXh0ZXJuYWxdCi0JICAgIExpbmsgVExWICgyKSwgbGVuZ3RoOiAxNDAKLQkgICAgICBMaW5rIFR5cGUgc3ViVExWICgxKSwgbGVuZ3RoOiAxLCBQb2ludC10by1wb2ludCAoMSkKLQkgICAgICBMaW5rIElEIHN1YlRMViAoMiksIGxlbmd0aDogNCwgMTAuMjU1LjI0NS40MCAoMHgwYWZmZjUyOCkKLQkgICAgICBMb2NhbCBJbnRlcmZhY2UgSVAgYWRkcmVzcyBzdWJUTFYgKDMpLCBsZW5ndGg6IDQsIDEwLjQwLjM1LjE0Ci0JICAgICAgUmVtb3RlIEludGVyZmFjZSBJUCBhZGRyZXNzIHN1YlRMViAoNCksIGxlbmd0aDogNCwgMTAuNDAuMzUuMTMKLQkgICAgICBUcmFmZmljIEVuZ2luZWVyaW5nIE1ldHJpYyBzdWJUTFYgKDUpLCBsZW5ndGg6IDQsIE1ldHJpYyAxCi0JICAgICAgTWF4aW11bSBCYW5kd2lkdGggc3ViVExWICg2KSwgbGVuZ3RoOiA0LCAxMDAuMDAwIE1icHMKLQkgICAgICBNYXhpbXVtIFJlc2VydmFibGUgQmFuZHdpZHRoIHN1YlRMViAoNyksIGxlbmd0aDogNCwgMTAwLjAwMCBNYnBzCi0JICAgICAgVW5yZXNlcnZlZCBCYW5kd2lkdGggc3ViVExWICg4KSwgbGVuZ3RoOiAzMgotCQlURS1DbGFzcyAwOiAwLjAwMCBNYnBzCi0JCVRFLUNsYXNzIDE6IDAuMDAwIE1icHMKLQkJVEUtQ2xhc3MgMjogMC4wMDAgTWJwcwotCQlURS1DbGFzcyAzOiAwLjAwMCBNYnBzCi0JCVRFLUNsYXNzIDQ6IDAuMDAwIE1icHMKLQkJVEUtQ2xhc3MgNTogMC4wMDAgTWJwcwotCQlURS1DbGFzcyA2OiAwLjAwMCBNYnBzCi0JCVRFLUNsYXNzIDc6IDAuMDAwIE1icHMKLQkgICAgICBJbnRlcmZhY2UgU3dpdGNoaW5nIENhcGFiaWxpdHkgc3ViVExWICgxNSksIGxlbmd0aDogNDQKLQkJSW50ZXJmYWNlIFN3aXRjaGluZyBDYXBhYmlsaXR5OiBQYWNrZXQtU3dpdGNoIENhcGFibGUtMQotCQlMU1AgRW5jb2Rpbmc6IEV0aGVybmV0IFYyL0RJWAotCQlNYXggTFNQIEJhbmR3aWR0aDoKLQkJICBwcmlvcml0eSBsZXZlbCAwOiAwLjAwMCBNYnBzCi0JCSAgcHJpb3JpdHkgbGV2ZWwgMTogMC4wMDAgTWJwcwotCQkgIHByaW9yaXR5IGxldmVsIDI6IDAuMDAwIE1icHMKLQkJICBwcmlvcml0eSBsZXZlbCAzOiAwLjAwMCBNYnBzCi0JCSAgcHJpb3JpdHkgbGV2ZWwgNDogMC4wMDAgTWJwcwotCQkgIHByaW9yaXR5IGxldmVsIDU6IDAuMDAwIE1icHMKLQkJICBwcmlvcml0eSBsZXZlbCA2OiAwLjAwMCBNYnBzCi0JCSAgcHJpb3JpdHkgbGV2ZWwgNzogMC4wMDAgTWJwcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NwZi1nbXBscy5wY2FwIGIvdGVzdHMvb3NwZi1nbXBscy5wY2FwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY5ODJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29zcGYtZ21wbHMucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29zcGYtZ21wbHMucHV1IGIvdGVzdHMvb3NwZi1nbXBscy5wdXUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MWUzOGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3NwZi1nbXBscy5wdXUKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1iZWdpbiA2NDQgb3NwZi1nbXBscy5wY2FwCi1NVSwuUkgwKGAhYGBgYGBgYGBgYGBgJzgxYGBgYGBgYGBLTUU8L182RCEwIlBgYGBgTGBgYGBgKGBgYCElCi1NUGAiTCNdMGBgYCU5R1NMSChQJCJYYGBgITAoJGApQCpfXzRDYGBgYGAqRipgYGBgYGBgYGBgYGBgYGBgCi1NYGAkYCIwKCpgMGBgImBLX10yNmBgYGAiPiNYYD9gYCJgJjBgYDBgIWAwYGBgYGAiYGAwKl9fNSVgYCxgCi1NIWBIKUNAJGAhYGAkIkBGLmBAYCVgYDBgYGBgX2BgOGAhJFI0NCxgYCFQYCQzKTEwUGBgKGAiISxFJSNgCi1NMykxMFAkUjQ0LCEsRSUjYDMpMTBQJFI0NCwhLEUlI2AzKTEwUGBgKWBgMGBgYGBgWS1FPC9QOywjMCJQCi1NYGBgYExgYGBgYChgYGAhJVBgIkwkYEhgYGAlOUdQNEgoUCQiWGBgYCEwKCRgKUAqX180Q2BgYGBgJl8kCi1NYGBgYGBgYGBgYGBgYGBgYGBgJGAiMCgqYDBgYCIwS19dMjZgYGBgIkxgLGA/YGAiYCYwYGAwYCFgMGBgCi1NYGBgImBgMCpfXzUlYGAsYCFgSClDUCRgIWBgJCJARi9gQGAlYGAwYGBgYF9gYDhgISRSNDQsYGAhUGAkCi1NMykxMFBgYChgIiEsRSUjYDMpMTBQJFI0NCwhLEUlI2AzKTEwUCRSNDQsISxFJSNgMykxMFBgYClgYDBgCi1NYGBgYCY9STwvUzRcIUAjOGBgYGBWYGBgYGAoYGBgISVQYCM0JCRgYGBgJTlHSjxIKFAkIlhgYGAhMCgkCi1NYCxgKl9fNENgYGBgYC1IV2BgYGBgYGBgYGBgYGBgYGBgYCRgYFAoKmAwYGBgUEtfXTIuYGBgYCMoMDBgCi1NSWBgImAoUGBgMGAhYDBgYGBgYCJgYDAqX180SGBgLGAhYEhIKFBYYCFgYCQiQkBDIzBgJWBgMGBgYGAhCi1NYGA4YCEkTF5PImBgIVBgJDJTWlwoYGAoYCJgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi1NYGBgYGBgYGBgYGAvYCJQIWBAYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgCi0qYGAhKy9LUEAiQkBgYGBgYAotYAotZW5kCmRpZmYgLS1naXQgYS90ZXN0cy9vc3BmLWdtcGxzLnNoIGIvdGVzdHMvb3NwZi1nbXBscy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGEyZGQzYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vc3BmLWdtcGxzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIG9zcGYtZ21wbHMucHV1IAotCi1lY2hvIC1uIHRlc3Qgb3NwZi1nbXBscy4uLgotLi4vdGNwZHVtcCAtdCAtbiAtdiAtciBvc3BmLWdtcGxzLnBjYXAgPiBvc3BmLWdtcGxzLm5ldwotaWYgZGlmZiBvc3BmLWdtcGxzLm5ldyBvc3BmLWdtcGxzLm91dAotdGhlbgotCWVjaG8gcGFzc2VkLgotZWxzZQotCWVjaG8gZmFpbGVkLgotZmkKLQkKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQtQS5uZXcgYi90ZXN0cy9wcmludC1BLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjYmE2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wcmludC1BLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0yMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgotRS4uPC5oQC5ALiFSLi4uLi4uLi4ucC5QN1gufi4uLi4uLi4uLiEuLi4uQC4uLi4KLU0uLi4uLi4uLi4uLgotMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgotRS4uPC4uQC5ALjwuLi4uLi4uLi4uUC5wN3ouLjdYLi4uLi4ubi4uLi4uQC4uLi4KLU0uLi5NLi4uLi4uLgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotRS4uNC5qQC5ALiFYLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuNy4uLi4uLgotTS4uLk0uLi4KLTIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgotRS4uLi5sQC5ALiAuLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuLi4uLi4uLgotTS4uLk0uLi5HRVQgLyBIVFRQLzEuMQotSG9zdDogbG9jYWxob3N0Ci1Vc2VyLUFnZW50OiBFTGlua3MvMC4xMC40LTctZGViaWFuICh0ZXh0bW9kZTsgTGludXggMi42LjExLTEtNjg2LXNtcCBpNjg2OyAxMzJ4NTYtMikKLUFjY2VwdDogKi8qCi1BY2NlcHQtRW5jb2Rpbmc6IGd6aXAKLUFjY2VwdC1MYW5ndWFnZTogZW4KLUNvbm5lY3Rpb246IEtlZXAtQWxpdmUKLQotCi0yMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KLUUuLjQuLkAuQC4uLi4uLi4uLi4uLlAucDd6Li43WC5JLi4gLjcuLi4uLi4KLU0uLi5NLi4uCi0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci1FLi4uLi5ALkAuLiUuLi4uLi4uLi5QLnA3ei4uN1guSS4uIC4uLi4uLi4uCi1NLi4uTS4uLkhUVFAvMS4xIDIwMCBPSwotRGF0ZTogV2VkLCAwNiBKdWwgMjAwNSAwMzo1NzozNSBHTVQKLVNlcnZlcjogQXBhY2hlLzEuMy4zMwotTGFzdC1Nb2RpZmllZDogU3VuLCAxNSBBdWcgMjAwNCAwMDo0Mzo0MSBHTVQKLUVUYWc6ICI2ZTgwZjAtMTQ4YS00MTFlYjFiZCIKLUFjY2VwdC1SYW5nZXM6IGJ5dGVzCi1Db250ZW50LUxlbmd0aDogNTI1OAotS2VlcC1BbGl2ZTogdGltZW91dD0xNSwgbWF4PTEwMAotQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQotQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQotCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci0gICA8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxNRVRBIE5BTUU9IkRlc2NyaXB0aW9uIiBDT05URU5UPSJUaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgRGViaWFuIGFwYWNoZS4iPgotICAgPFRJVExFPlBsYWNlaG9sZGVyIHBhZ2U8L1RJVExFPgotPC9IRUFEPgotPEJPRFkgVEVYVD0iIzAwMDAwMCIgQkdDT0xPUj0iI0ZGRkZGRiIgTElOSz0iIzAwMDBFRiIgVkxJTks9IiM1NTE4OEEiIEFMSU5LPSIjRkYwMDAwIj4KLQotPEgxPlBsYWNlaG9sZGVyIHBhZ2U8L0gxPgotPEgyPklmIHlvdSBhcmUganVzdCBicm93c2luZyB0aGUgd2ViPC9oMj4KLQotPFA+VGhlIG93bmVyIG9mIHRoaXMgd2ViIHNpdGUgaGFzIG5vdCBwdXQgdXAgYW55IHdlYiBwYWdlcyB5ZXQuCi1QbGVhc2UgY29tZSBiYWNrIGxhdGVyLjwvUD4KLQotPFA+PFNNQUxMPjxDSVRFPk1vdmUgYWxvbmcsIG5vdGhpbmcgdG8gc2VlIGhlcmUuLi48L0NJVEU+IDotKTwvU01BTEw+PC9QPgotCi08SDI+SWYgeW91IGFyZSB0cnlpbmcgdG8gbG9jYXRlIHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgbWFjaGluZTwvSDI+Ci0KLTxQPklmIHlvdSB3YW50IHRvIHJlcG9ydCBzb21ldGhpbmcgYWJvdXQgdGhpcyBob3N0J3MgYmVoYXZpb3IsIHBsZWFzZQotY29udGFjdCB0aGUgSW50ZXJuZXQgU2VydmljZSBQcm92aWRlciAoSVNQKSBpbnZvbHZlZCBkaXJlY3RseS48L1A+Ci0KLTxQPlNlZSB0aGUgPEEgaHJlZj0iaHR0cDovL3d3dy5hYnVzZS5uZXQvIj5OZXR3b3JrIEFidXNlCi1DbGVhcmluZ2hvdXNlPC9BPiBmb3IgaG93IHRvIGRvIHRoaXMuPC9QPgotCi08SDI+SWYgeW91IGFyZSB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIG1hY2hpbmU8L0gyPgotCi08UD5UaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgPEEgaHJlZj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+RGViaWFuJ3MKLWFwYWNoZTwvQT4gd2ViIHNlcnZlciBwYWNrYWdlIHdhcyBzdWNjZXNzZnVsLjwvUD4KLQotPFA+PFNUUk9ORz5Zb3Ugc2hvdWxkIHJlcGxhY2UgdGhpcyBwYWdlIHdpdGggeW91ciBvd24gd2ViIHBhZ2VzIGFzCi1zb29uIGFzIHBvc3NpYmxlLjwvU1RST05HPjwvUD4KLQotPFA+VW5sZXNzIHlvdSBjaGFuZ2VkIGl0cyBjb25maWd1cmF0aW9uLCB5b3VyIG5ldyBzZXJ2ZXIgaXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotPFVMPgotPExJPgotQ29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYmUgZm91bmQgaW4gPFRUPi9ldGMvYXBhY2hlPC9UVD4uPC9MST4KLQotPExJPgotVGhlIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPiwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBhbGwgeW91cgotSFRNTCBmaWxlcyBzaG91bGQgZXhpc3QsIGlzIHNldCB0byA8VFQ+L3Zhci93d3c8L1RUPi48L0xJPgotCi08TEk+Ci1DR0kgc2NyaXB0cyBhcmUgbG9va2VkIGZvciBpbiA8VFQ+L3Vzci9saWIvY2dpLWJpbjwvVFQ+LCB3aGljaCBpcyB3aGVyZQotRGViaWFuIHBhY2thZ2VzIHdpbGwgcGxhY2UgdGhlaXIgc2NyaXB0cy48L0xJPgotCi08TEk+Ci1Mb2cgZmlsZXMgYXJlIHBsYWNlZCBpbiA8VFQ+L3Zhci9sb2cvYXBhY2hlPC9UVD4sIGFuZCB3aWxsIGJlIHJvdGF0ZWQKLXdlZWtseS4gIFRoZSBmcmVxdWVuY3kgb2Ygcm90YXRpb24gY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGJ5IGVkaXRpbmcKLTxUVD4vZXRjL2xvZ3JvdGF0ZS5kL2FwYWNoZTwvVFQ+LjwvTEk+Ci0KLTxMST4KLVRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpbmRleCBpcyA8VFQ+aW5kZXguaHRtbDwvVFQ+LCBtZWFuaW5nIHRoYXQgcmVxdWVzdHMKLWZvciBhIGRpcmVjdG9yeSA8VFQ+L2Zvby9iYXIvPC9UVD4gd2lsbCBnaXZlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSA8VFQ+L3Zhci93d3cvZm9vL2Jhci9pbmRleC5odG1sPC9UVD4KLWlmIGl0IGV4aXN0cyAoYXNzdW1pbmcgdGhhdCA8VFQ+L3Zhci93d3c8L1RUPiBpcyB5b3VyIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPikuPC9MST4KLQotPExJPgotVXNlciBkaXJlY3RvcmllcyBhcmUgZW5hYmxlZCwgYW5kIHVzZXIgZG9jdW1lbnRzIHdpbGwgYmUgbG9va2VkIGZvcgotaW4gdGhlIDxUVD5wdWJsaWNfaHRtbDwvVFQ+IGRpcmVjdG9yeSBvZiB0aGUgdXNlcnMnIGhvbWVzLiAgVGhlc2UgZGlycwotc2hvdWxkIGJlIHVuZGVyIDxUVD4vaG9tZTwvVFQ+LCBhbmQgdXNlcnMgd2lsbCBub3QgYmUgYWJsZSB0byBzeW1saW5rCi10byBmaWxlcyB0aGV5IGRvbid0IG93bi48L0xJPgotCi08L1VMPgotQWxsIHRoZSBzdGFuZGFyZCBhcGFjaGUgbW9kdWxlcyBhcmUgYXZhaWxhYmxlIHdpdGggdGhpcyByZWxlYXNlIGFuZCBhcmUKLW5vdyBtYW5hZ2VkIHdpdGggZGViY29uZi4gIFR5cGUgPFRUPmRwa2ctcmVjb25maWd1cmUgYXBhY2hlPC9UVD4gdG8KLXNlbGVjdCB3aGljaCBtb2R1bGVzIHlvdSB3YW50IGVuYWJsZWQuICBNYW55IG90aGVyIG1vZHVsZXMgYXJlIGF2YWlsYWJsZQotdGhyb3VnaCB0aGUgRGViaWFuIHBhY2thZ2Ugc3lzdGVtIHdpdGggdGhlIG5hbWVzIDxUVD5saWJhcGFjaGUtbW9kLSo8L1RUPi4KLUlmIHlvdSBuZWVkIHRvIGNvbXBpbGUgYSBtb2R1bGUgeW91cnNlbGYsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUKLTxUVD5hcGFjaGUtZGV2PC9UVD4gcGFja2FnZS4KLQotPFA+TW9yZSBkb2N1bWVudGF0aW9uIG9uIEFwYWNoZSBjYW4gYmUgZm91bmQgb246Ci08VUw+Ci08TEk+Ci1UaGUgPEEgSFJFRj0iL2RvYy9hcGFjaGUtZG9jL21hbnVhbC8iPkFwYWNoZSBkb2N1bWVudGF0aW9uPC9BPiBzdG9yZWQgb24geW91ciBzZXJ2ZXIuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBQcm9qZWN0PC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLXNzbC5vcmcvIj5BcGFjaGUtU1NMPC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly9wZXJsLmFwYWNoZS5vcmcvIj5tb2QgcGVybDwvQT4gaG9tZSBzaXRlLjwvTEk+Ci0KLTxMST4KLVRoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tLyI+QXBhY2hlV2VlazwvQT4gbmV3c2xldHRlci48L0xJPgotCi08TEk+Ci1UaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy8iPkRlYmlhbiBQcm9qZWN0Ci1Eb2N1bWVudGF0aW9uPC9BPiB3aGljaCBjb250YWlucyBIT1dUT3MsIEZBUXMsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzLjwvTEk+Ci08L1VMPgotCi08UD5Zb3UgY2FuIGFsc28gY29uc3VsdCB0aGUgbGlzdCBvZiA8QSBIUkVGPSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2ZhcS8iPldvcmxkCi1XaWRlIFdlYiBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvQT4gZm9yIGluZm9ybWF0aW9uLgotCi08SDI+TGV0IG90aGVyIHBlb3BsZSBrbm93IGFib3V0IHRoaXMgc2VydmVyPC9IMj4KLQotPEEgSFJFRj0iaHR0cDovL25ldGNyYWZ0LmNvbS8iPk5ldGNyYWZ0PC9BPiBwcm92aWRlcyBhbiBpbnRlcmVzdGluZyBmcmVlCi1zZXJ2aWNlIGZvciB3ZWIgc2l0ZSBtb25pdG9yaW5nIGFuZCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KLVlvdSBjYW4gbGV0IHRoZW0ga25vdyBhYm91dCB5b3VyIHNlcnZlciB1c2luZyB0aGVpcgotPEEgSFJFRj0iaHR0cDovL3VwdGltZS5uZXRjcmFmdC5jb20vIj5pbnRlcmZhY2U8L0E+LgotRW5hYmxpbmcgdGhlIG1vbml0b3Jpbmcgb2YgeW91ciBzZXJ2ZXIgd2lsbCBwcm92aWRlIGEgYmV0dGVyIGdsb2JhbCBvdmVydmlldwotb2Ygd2hvIGlzIHVzaW5nIHdoYXQgYW5kIHdoZXJlLCBhbmQgaXQgd291bGQgZ2l2ZSBEZWJpYW4gYSBiZXR0ZXIKLW92ZXJ2aWV3IG9mIHRoZSBhcGFjaGUgcGFja2FnZSB1c2FnZS4KLQotPEgyPkFib3V0IHRoaXMgcGFnZTwvSDI+Ci0KLTxJTUcgQUxJR049InJpZ2h0IiBBTFQ9IiIgSEVJR0hUPSIyNDciIFdJRFRIPSIyNzgiIFNSQz0iaWNvbnMvamhlMDYxLnBuZyI+Ci0KLTxQPlRoaXMgaXMgYSBwbGFjZWhvbGRlciBwYWdlIGluc3RhbGxlZCBieSB0aGUgPEEKLUhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPkRlYmlhbjwvQT4KLXJlbGVhc2Ugb2YgdGhlIGFwYWNoZSBXZWIgc2VydmVyIHBhY2thZ2UuCi0KLTxQPlRoaXMgY29tcHV0ZXIgaGFzIGluc3RhbGxlZCB0aGUgRGViaWFuIEdOVS9MaW51eCBvcGVyYXRpbmcgc3lzdGVtLAotYnV0IGl0IGhhcyA8c3Ryb25nPm5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgRGViaWFuCi1Qcm9qZWN0PC9zdHJvbmc+LiBQbGVhc2UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gY29udGFjdCB0aGUgRGViaWFuCi1Qcm9qZWN0IGFib3V0IGl0LjwvUD4KLQotPFA+SWYgeW91IGZpbmQgYSBidWcgaW4gdGhpcyBhcGFjaGUgcGFja2FnZSwgb3IgaW4gQXBhY2hlIGl0c2VsZiwKLXBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBvbiBpdC4gIEluc3RydWN0aW9ucyBvbiBkb2luZyB0aGlzLCBhbmQgdGhlCi1saXN0IG9mIDxBIEhSRUY9Imh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvc3JjOmFwYWNoZSI+a25vd24gYnVnczwvQT4gb2YgdGhpcwotcGFja2FnZSwgY2FuIGJlIGZvdW5kIGluIHRoZSAKLTxBIEhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy9CdWdzL1JlcG9ydGluZyI+RGViaWFuIEJ1ZyBUcmFja2luZyBTeXN0ZW08L0E+LgotCi08UD5UaGFua3MgZm9yIHVzaW5nIHRoaXMgcGFja2FnZSwgYW5kIGNvbmdyYXR1bGF0aW9ucyBmb3IgeW91ciBjaG9pY2Ugb2YKLWEgRGViaWFuIHN5c3RlbSE8L1A+Ci0KLTxESVYgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj4KLTxJTUcgYWxpZ249Im1pZGRsZSIgaGVpZ2h0PSIzMCIgd2lkdGg9IjI1IiBzcmM9Imljb25zL2RlYmlhbi9vcGVubG9nby0yNS5qcGciIGFsdD0iRGViaWFuIj4KLTwvYT4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPgotPElNRyBhbGlnbj0ibWlkZGxlIiBoZWlnaHQ9IjMyIiB3aWR0aD0iMjU5IiBzcmM9Imljb25zL2FwYWNoZV9wYi5wbmciIGFsdD0iQXBhY2hlIj4KLTwvYT4KLTwvRElWPgotCi08IS0tCi0gIFRoaXMgcGFnZSB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQgYnkgSm9obmllIEluZ3JhbSAoaHR0cDovL25ldGdvZC5uZXQvKQotICBJdCB3YXMgbGF0ZXIgZWRpdGVkIGJ5IE1hdHRoZXcgV2lsY294IGFuZCBKb3NpcCBSb2Rpbi4KLSAgTGFzdCBtb2RpZmllZDogJERhdGU6IDIwMDQvMDYvMjAgMTU6MzM6NTcgJC4KLSAgLS0+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLQotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLUUuLjQubkAuQC4hVC4uLi4uLi4uLnAuUDdYLkk3ei4uLi4wXy4uLi4uLi4KLU0uLi5NLi4uCi0yMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+Ci1FLi40LnBALkAuIVIuLi4uLi4uLi5wLlA3WC5JN3ouLi4uMF8uLi4uLi4uCi1NLi4hTS4uLgotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotRS4uNC4uQC5ALi4uLi4uLi4uLi4uUC5wN3ouLjdYLkouLiAuLjUuLi4uLgotTS4uI00uLiEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci1FLi40LnJALkAuIVAuLi4uLi4uLi5wLlA3WC5KN3ouLi4uMF8uLi4uLi4uCi1NLi4jTS4uIwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQtQS5vdXQgYi90ZXN0cy9wcmludC1BLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFjYmE2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9wcmludC1BLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0yMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgotRS4uPC5oQC5ALiFSLi4uLi4uLi4ucC5QN1gufi4uLi4uLi4uLiEuLi4uQC4uLi4KLU0uLi4uLi4uLi4uLgotMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgotRS4uPC4uQC5ALjwuLi4uLi4uLi4uUC5wN3ouLjdYLi4uLi4ubi4uLi4uQC4uLi4KLU0uLi5NLi4uLi4uLgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotRS4uNC5qQC5ALiFYLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuNy4uLi4uLgotTS4uLk0uLi4KLTIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgotRS4uLi5sQC5ALiAuLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuLi4uLi4uLgotTS4uLk0uLi5HRVQgLyBIVFRQLzEuMQotSG9zdDogbG9jYWxob3N0Ci1Vc2VyLUFnZW50OiBFTGlua3MvMC4xMC40LTctZGViaWFuICh0ZXh0bW9kZTsgTGludXggMi42LjExLTEtNjg2LXNtcCBpNjg2OyAxMzJ4NTYtMikKLUFjY2VwdDogKi8qCi1BY2NlcHQtRW5jb2Rpbmc6IGd6aXAKLUFjY2VwdC1MYW5ndWFnZTogZW4KLUNvbm5lY3Rpb246IEtlZXAtQWxpdmUKLQotCi0yMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KLUUuLjQuLkAuQC4uLi4uLi4uLi4uLlAucDd6Li43WC5JLi4gLjcuLi4uLi4KLU0uLi5NLi4uCi0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci1FLi4uLi5ALkAuLiUuLi4uLi4uLi5QLnA3ei4uN1guSS4uIC4uLi4uLi4uCi1NLi4uTS4uLkhUVFAvMS4xIDIwMCBPSwotRGF0ZTogV2VkLCAwNiBKdWwgMjAwNSAwMzo1NzozNSBHTVQKLVNlcnZlcjogQXBhY2hlLzEuMy4zMwotTGFzdC1Nb2RpZmllZDogU3VuLCAxNSBBdWcgMjAwNCAwMDo0Mzo0MSBHTVQKLUVUYWc6ICI2ZTgwZjAtMTQ4YS00MTFlYjFiZCIKLUFjY2VwdC1SYW5nZXM6IGJ5dGVzCi1Db250ZW50LUxlbmd0aDogNTI1OAotS2VlcC1BbGl2ZTogdGltZW91dD0xNSwgbWF4PTEwMAotQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQotQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQotCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci0gICA8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxNRVRBIE5BTUU9IkRlc2NyaXB0aW9uIiBDT05URU5UPSJUaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgRGViaWFuIGFwYWNoZS4iPgotICAgPFRJVExFPlBsYWNlaG9sZGVyIHBhZ2U8L1RJVExFPgotPC9IRUFEPgotPEJPRFkgVEVYVD0iIzAwMDAwMCIgQkdDT0xPUj0iI0ZGRkZGRiIgTElOSz0iIzAwMDBFRiIgVkxJTks9IiM1NTE4OEEiIEFMSU5LPSIjRkYwMDAwIj4KLQotPEgxPlBsYWNlaG9sZGVyIHBhZ2U8L0gxPgotPEgyPklmIHlvdSBhcmUganVzdCBicm93c2luZyB0aGUgd2ViPC9oMj4KLQotPFA+VGhlIG93bmVyIG9mIHRoaXMgd2ViIHNpdGUgaGFzIG5vdCBwdXQgdXAgYW55IHdlYiBwYWdlcyB5ZXQuCi1QbGVhc2UgY29tZSBiYWNrIGxhdGVyLjwvUD4KLQotPFA+PFNNQUxMPjxDSVRFPk1vdmUgYWxvbmcsIG5vdGhpbmcgdG8gc2VlIGhlcmUuLi48L0NJVEU+IDotKTwvU01BTEw+PC9QPgotCi08SDI+SWYgeW91IGFyZSB0cnlpbmcgdG8gbG9jYXRlIHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgbWFjaGluZTwvSDI+Ci0KLTxQPklmIHlvdSB3YW50IHRvIHJlcG9ydCBzb21ldGhpbmcgYWJvdXQgdGhpcyBob3N0J3MgYmVoYXZpb3IsIHBsZWFzZQotY29udGFjdCB0aGUgSW50ZXJuZXQgU2VydmljZSBQcm92aWRlciAoSVNQKSBpbnZvbHZlZCBkaXJlY3RseS48L1A+Ci0KLTxQPlNlZSB0aGUgPEEgaHJlZj0iaHR0cDovL3d3dy5hYnVzZS5uZXQvIj5OZXR3b3JrIEFidXNlCi1DbGVhcmluZ2hvdXNlPC9BPiBmb3IgaG93IHRvIGRvIHRoaXMuPC9QPgotCi08SDI+SWYgeW91IGFyZSB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIG1hY2hpbmU8L0gyPgotCi08UD5UaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgPEEgaHJlZj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+RGViaWFuJ3MKLWFwYWNoZTwvQT4gd2ViIHNlcnZlciBwYWNrYWdlIHdhcyBzdWNjZXNzZnVsLjwvUD4KLQotPFA+PFNUUk9ORz5Zb3Ugc2hvdWxkIHJlcGxhY2UgdGhpcyBwYWdlIHdpdGggeW91ciBvd24gd2ViIHBhZ2VzIGFzCi1zb29uIGFzIHBvc3NpYmxlLjwvU1RST05HPjwvUD4KLQotPFA+VW5sZXNzIHlvdSBjaGFuZ2VkIGl0cyBjb25maWd1cmF0aW9uLCB5b3VyIG5ldyBzZXJ2ZXIgaXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotPFVMPgotPExJPgotQ29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYmUgZm91bmQgaW4gPFRUPi9ldGMvYXBhY2hlPC9UVD4uPC9MST4KLQotPExJPgotVGhlIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPiwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBhbGwgeW91cgotSFRNTCBmaWxlcyBzaG91bGQgZXhpc3QsIGlzIHNldCB0byA8VFQ+L3Zhci93d3c8L1RUPi48L0xJPgotCi08TEk+Ci1DR0kgc2NyaXB0cyBhcmUgbG9va2VkIGZvciBpbiA8VFQ+L3Vzci9saWIvY2dpLWJpbjwvVFQ+LCB3aGljaCBpcyB3aGVyZQotRGViaWFuIHBhY2thZ2VzIHdpbGwgcGxhY2UgdGhlaXIgc2NyaXB0cy48L0xJPgotCi08TEk+Ci1Mb2cgZmlsZXMgYXJlIHBsYWNlZCBpbiA8VFQ+L3Zhci9sb2cvYXBhY2hlPC9UVD4sIGFuZCB3aWxsIGJlIHJvdGF0ZWQKLXdlZWtseS4gIFRoZSBmcmVxdWVuY3kgb2Ygcm90YXRpb24gY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGJ5IGVkaXRpbmcKLTxUVD4vZXRjL2xvZ3JvdGF0ZS5kL2FwYWNoZTwvVFQ+LjwvTEk+Ci0KLTxMST4KLVRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpbmRleCBpcyA8VFQ+aW5kZXguaHRtbDwvVFQ+LCBtZWFuaW5nIHRoYXQgcmVxdWVzdHMKLWZvciBhIGRpcmVjdG9yeSA8VFQ+L2Zvby9iYXIvPC9UVD4gd2lsbCBnaXZlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSA8VFQ+L3Zhci93d3cvZm9vL2Jhci9pbmRleC5odG1sPC9UVD4KLWlmIGl0IGV4aXN0cyAoYXNzdW1pbmcgdGhhdCA8VFQ+L3Zhci93d3c8L1RUPiBpcyB5b3VyIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPikuPC9MST4KLQotPExJPgotVXNlciBkaXJlY3RvcmllcyBhcmUgZW5hYmxlZCwgYW5kIHVzZXIgZG9jdW1lbnRzIHdpbGwgYmUgbG9va2VkIGZvcgotaW4gdGhlIDxUVD5wdWJsaWNfaHRtbDwvVFQ+IGRpcmVjdG9yeSBvZiB0aGUgdXNlcnMnIGhvbWVzLiAgVGhlc2UgZGlycwotc2hvdWxkIGJlIHVuZGVyIDxUVD4vaG9tZTwvVFQ+LCBhbmQgdXNlcnMgd2lsbCBub3QgYmUgYWJsZSB0byBzeW1saW5rCi10byBmaWxlcyB0aGV5IGRvbid0IG93bi48L0xJPgotCi08L1VMPgotQWxsIHRoZSBzdGFuZGFyZCBhcGFjaGUgbW9kdWxlcyBhcmUgYXZhaWxhYmxlIHdpdGggdGhpcyByZWxlYXNlIGFuZCBhcmUKLW5vdyBtYW5hZ2VkIHdpdGggZGViY29uZi4gIFR5cGUgPFRUPmRwa2ctcmVjb25maWd1cmUgYXBhY2hlPC9UVD4gdG8KLXNlbGVjdCB3aGljaCBtb2R1bGVzIHlvdSB3YW50IGVuYWJsZWQuICBNYW55IG90aGVyIG1vZHVsZXMgYXJlIGF2YWlsYWJsZQotdGhyb3VnaCB0aGUgRGViaWFuIHBhY2thZ2Ugc3lzdGVtIHdpdGggdGhlIG5hbWVzIDxUVD5saWJhcGFjaGUtbW9kLSo8L1RUPi4KLUlmIHlvdSBuZWVkIHRvIGNvbXBpbGUgYSBtb2R1bGUgeW91cnNlbGYsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUKLTxUVD5hcGFjaGUtZGV2PC9UVD4gcGFja2FnZS4KLQotPFA+TW9yZSBkb2N1bWVudGF0aW9uIG9uIEFwYWNoZSBjYW4gYmUgZm91bmQgb246Ci08VUw+Ci08TEk+Ci1UaGUgPEEgSFJFRj0iL2RvYy9hcGFjaGUtZG9jL21hbnVhbC8iPkFwYWNoZSBkb2N1bWVudGF0aW9uPC9BPiBzdG9yZWQgb24geW91ciBzZXJ2ZXIuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBQcm9qZWN0PC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLXNzbC5vcmcvIj5BcGFjaGUtU1NMPC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly9wZXJsLmFwYWNoZS5vcmcvIj5tb2QgcGVybDwvQT4gaG9tZSBzaXRlLjwvTEk+Ci0KLTxMST4KLVRoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tLyI+QXBhY2hlV2VlazwvQT4gbmV3c2xldHRlci48L0xJPgotCi08TEk+Ci1UaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy8iPkRlYmlhbiBQcm9qZWN0Ci1Eb2N1bWVudGF0aW9uPC9BPiB3aGljaCBjb250YWlucyBIT1dUT3MsIEZBUXMsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzLjwvTEk+Ci08L1VMPgotCi08UD5Zb3UgY2FuIGFsc28gY29uc3VsdCB0aGUgbGlzdCBvZiA8QSBIUkVGPSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2ZhcS8iPldvcmxkCi1XaWRlIFdlYiBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvQT4gZm9yIGluZm9ybWF0aW9uLgotCi08SDI+TGV0IG90aGVyIHBlb3BsZSBrbm93IGFib3V0IHRoaXMgc2VydmVyPC9IMj4KLQotPEEgSFJFRj0iaHR0cDovL25ldGNyYWZ0LmNvbS8iPk5ldGNyYWZ0PC9BPiBwcm92aWRlcyBhbiBpbnRlcmVzdGluZyBmcmVlCi1zZXJ2aWNlIGZvciB3ZWIgc2l0ZSBtb25pdG9yaW5nIGFuZCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KLVlvdSBjYW4gbGV0IHRoZW0ga25vdyBhYm91dCB5b3VyIHNlcnZlciB1c2luZyB0aGVpcgotPEEgSFJFRj0iaHR0cDovL3VwdGltZS5uZXRjcmFmdC5jb20vIj5pbnRlcmZhY2U8L0E+LgotRW5hYmxpbmcgdGhlIG1vbml0b3Jpbmcgb2YgeW91ciBzZXJ2ZXIgd2lsbCBwcm92aWRlIGEgYmV0dGVyIGdsb2JhbCBvdmVydmlldwotb2Ygd2hvIGlzIHVzaW5nIHdoYXQgYW5kIHdoZXJlLCBhbmQgaXQgd291bGQgZ2l2ZSBEZWJpYW4gYSBiZXR0ZXIKLW92ZXJ2aWV3IG9mIHRoZSBhcGFjaGUgcGFja2FnZSB1c2FnZS4KLQotPEgyPkFib3V0IHRoaXMgcGFnZTwvSDI+Ci0KLTxJTUcgQUxJR049InJpZ2h0IiBBTFQ9IiIgSEVJR0hUPSIyNDciIFdJRFRIPSIyNzgiIFNSQz0iaWNvbnMvamhlMDYxLnBuZyI+Ci0KLTxQPlRoaXMgaXMgYSBwbGFjZWhvbGRlciBwYWdlIGluc3RhbGxlZCBieSB0aGUgPEEKLUhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPkRlYmlhbjwvQT4KLXJlbGVhc2Ugb2YgdGhlIGFwYWNoZSBXZWIgc2VydmVyIHBhY2thZ2UuCi0KLTxQPlRoaXMgY29tcHV0ZXIgaGFzIGluc3RhbGxlZCB0aGUgRGViaWFuIEdOVS9MaW51eCBvcGVyYXRpbmcgc3lzdGVtLAotYnV0IGl0IGhhcyA8c3Ryb25nPm5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgRGViaWFuCi1Qcm9qZWN0PC9zdHJvbmc+LiBQbGVhc2UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gY29udGFjdCB0aGUgRGViaWFuCi1Qcm9qZWN0IGFib3V0IGl0LjwvUD4KLQotPFA+SWYgeW91IGZpbmQgYSBidWcgaW4gdGhpcyBhcGFjaGUgcGFja2FnZSwgb3IgaW4gQXBhY2hlIGl0c2VsZiwKLXBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBvbiBpdC4gIEluc3RydWN0aW9ucyBvbiBkb2luZyB0aGlzLCBhbmQgdGhlCi1saXN0IG9mIDxBIEhSRUY9Imh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvc3JjOmFwYWNoZSI+a25vd24gYnVnczwvQT4gb2YgdGhpcwotcGFja2FnZSwgY2FuIGJlIGZvdW5kIGluIHRoZSAKLTxBIEhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy9CdWdzL1JlcG9ydGluZyI+RGViaWFuIEJ1ZyBUcmFja2luZyBTeXN0ZW08L0E+LgotCi08UD5UaGFua3MgZm9yIHVzaW5nIHRoaXMgcGFja2FnZSwgYW5kIGNvbmdyYXR1bGF0aW9ucyBmb3IgeW91ciBjaG9pY2Ugb2YKLWEgRGViaWFuIHN5c3RlbSE8L1A+Ci0KLTxESVYgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj4KLTxJTUcgYWxpZ249Im1pZGRsZSIgaGVpZ2h0PSIzMCIgd2lkdGg9IjI1IiBzcmM9Imljb25zL2RlYmlhbi9vcGVubG9nby0yNS5qcGciIGFsdD0iRGViaWFuIj4KLTwvYT4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPgotPElNRyBhbGlnbj0ibWlkZGxlIiBoZWlnaHQ9IjMyIiB3aWR0aD0iMjU5IiBzcmM9Imljb25zL2FwYWNoZV9wYi5wbmciIGFsdD0iQXBhY2hlIj4KLTwvYT4KLTwvRElWPgotCi08IS0tCi0gIFRoaXMgcGFnZSB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQgYnkgSm9obmllIEluZ3JhbSAoaHR0cDovL25ldGdvZC5uZXQvKQotICBJdCB3YXMgbGF0ZXIgZWRpdGVkIGJ5IE1hdHRoZXcgV2lsY294IGFuZCBKb3NpcCBSb2Rpbi4KLSAgTGFzdCBtb2RpZmllZDogJERhdGU6IDIwMDQvMDYvMjAgMTU6MzM6NTcgJC4KLSAgLS0+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLQotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLUUuLjQubkAuQC4hVC4uLi4uLi4uLnAuUDdYLkk3ei4uLi4wXy4uLi4uLi4KLU0uLi5NLi4uCi0yMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+Ci1FLi40LnBALkAuIVIuLi4uLi4uLi5wLlA3WC5JN3ouLi4uMF8uLi4uLi4uCi1NLi4hTS4uLgotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotRS4uNC4uQC5ALi4uLi4uLi4uLi4uUC5wN3ouLjdYLkouLiAuLjUuLi4uLgotTS4uI00uLiEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci1FLi40LnJALkAuIVAuLi4uLi4uLi5wLlA3WC5KN3ouLi4uMF8uLi4uLi4uCi1NLi4jTS4uIwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQtQUEubmV3IGIvdGVzdHMvcHJpbnQtQUEubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDk5YzZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3ByaW50LUFBLm5ldworKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0yMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgotLi4uLi4uLi4uLi4uLi5FLi48LmhALkAuIVIuLi4uLi4uLi5wLlA3WC5+Li4uLi4uLi4uIS4uLi5ALi4uLgotTS4uLi4uLi4uLi4uCi0yMzo1NzozNS45MzgxMjIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBTIDkzMDc3ODYwOTo5MzA3Nzg2MDkoMCkgYWNrIDkyODU0OTI0NyB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MCxub3Asd3NjYWxlIDI+Ci0uLi4uLi4uLi4uLi4uLkUuLjwuLkAuQC48Li4uLi4uLi4uLlAucDd6Li43WC4uLi4uLm4uLi4uLkAuLi4uCi1NLi4uTS4uLi4uLi4KLTIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KLS4uLi4uLi4uLi4uLi4uRS4uNC5qQC5ALiFYLi4uLi4uLi4ucC5QN1guLjd6Li4uLiAuNy4uLi4uLgotTS4uLk0uLi4KLTIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgotLi4uLi4uLi4uLi4uLi5FLi4uLmxALkAuIC4uLi4uLi4uLi5wLlA3WC4uN3ouLi4uIC4uLi4uLi4uCi1NLi4uTS4uLkdFVCAvIEhUVFAvMS4xCi1Ib3N0OiBsb2NhbGhvc3QKLVVzZXItQWdlbnQ6IEVMaW5rcy8wLjEwLjQtNy1kZWJpYW4gKHRleHRtb2RlOyBMaW51eCAyLjYuMTEtMS02ODYtc21wIGk2ODY7IDEzMng1Ni0yKQotQWNjZXB0OiAqLyoKLUFjY2VwdC1FbmNvZGluZzogZ3ppcAotQWNjZXB0LUxhbmd1YWdlOiBlbgotQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQotCi0KLTIzOjU3OjM1Ljk0MDQ3NCBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IC4gYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MiAxMzA2MzAwOTUxPgotLi4uLi4uLi4uLi4uLi5FLi40Li5ALkAuLi4uLi4uLi4uLi5QLnA3ei4uN1guSS4uIC43Li4uLi4uCi1NLi4uTS4uLgotMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgotLi4uLi4uLi4uLi4uLi5FLi4uLi5ALkAuLiUuLi4uLi4uLi5QLnA3ei4uN1guSS4uIC4uLi4uLi4uCi1NLi4uTS4uLkhUVFAvMS4xIDIwMCBPSwotRGF0ZTogV2VkLCAwNiBKdWwgMjAwNSAwMzo1NzozNSBHTVQKLVNlcnZlcjogQXBhY2hlLzEuMy4zMwotTGFzdC1Nb2RpZmllZDogU3VuLCAxNSBBdWcgMjAwNCAwMDo0Mzo0MSBHTVQKLUVUYWc6ICI2ZTgwZjAtMTQ4YS00MTFlYjFiZCIKLUFjY2VwdC1SYW5nZXM6IGJ5dGVzCi1Db250ZW50LUxlbmd0aDogNTI1OAotS2VlcC1BbGl2ZTogdGltZW91dD0xNSwgbWF4PTEwMAotQ29ubmVjdGlvbjogS2VlcC1BbGl2ZQotQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQotCi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci0gICA8TUVUQSBIVFRQLUVRVUlWPSJDb250ZW50LVR5cGUiIENPTlRFTlQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxNRVRBIE5BTUU9IkRlc2NyaXB0aW9uIiBDT05URU5UPSJUaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgRGViaWFuIGFwYWNoZS4iPgotICAgPFRJVExFPlBsYWNlaG9sZGVyIHBhZ2U8L1RJVExFPgotPC9IRUFEPgotPEJPRFkgVEVYVD0iIzAwMDAwMCIgQkdDT0xPUj0iI0ZGRkZGRiIgTElOSz0iIzAwMDBFRiIgVkxJTks9IiM1NTE4OEEiIEFMSU5LPSIjRkYwMDAwIj4KLQotPEgxPlBsYWNlaG9sZGVyIHBhZ2U8L0gxPgotPEgyPklmIHlvdSBhcmUganVzdCBicm93c2luZyB0aGUgd2ViPC9oMj4KLQotPFA+VGhlIG93bmVyIG9mIHRoaXMgd2ViIHNpdGUgaGFzIG5vdCBwdXQgdXAgYW55IHdlYiBwYWdlcyB5ZXQuCi1QbGVhc2UgY29tZSBiYWNrIGxhdGVyLjwvUD4KLQotPFA+PFNNQUxMPjxDSVRFPk1vdmUgYWxvbmcsIG5vdGhpbmcgdG8gc2VlIGhlcmUuLi48L0NJVEU+IDotKTwvU01BTEw+PC9QPgotCi08SDI+SWYgeW91IGFyZSB0cnlpbmcgdG8gbG9jYXRlIHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgbWFjaGluZTwvSDI+Ci0KLTxQPklmIHlvdSB3YW50IHRvIHJlcG9ydCBzb21ldGhpbmcgYWJvdXQgdGhpcyBob3N0J3MgYmVoYXZpb3IsIHBsZWFzZQotY29udGFjdCB0aGUgSW50ZXJuZXQgU2VydmljZSBQcm92aWRlciAoSVNQKSBpbnZvbHZlZCBkaXJlY3RseS48L1A+Ci0KLTxQPlNlZSB0aGUgPEEgaHJlZj0iaHR0cDovL3d3dy5hYnVzZS5uZXQvIj5OZXR3b3JrIEFidXNlCi1DbGVhcmluZ2hvdXNlPC9BPiBmb3IgaG93IHRvIGRvIHRoaXMuPC9QPgotCi08SDI+SWYgeW91IGFyZSB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIG1hY2hpbmU8L0gyPgotCi08UD5UaGUgaW5pdGlhbCBpbnN0YWxsYXRpb24gb2YgPEEgaHJlZj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+RGViaWFuJ3MKLWFwYWNoZTwvQT4gd2ViIHNlcnZlciBwYWNrYWdlIHdhcyBzdWNjZXNzZnVsLjwvUD4KLQotPFA+PFNUUk9ORz5Zb3Ugc2hvdWxkIHJlcGxhY2UgdGhpcyBwYWdlIHdpdGggeW91ciBvd24gd2ViIHBhZ2VzIGFzCi1zb29uIGFzIHBvc3NpYmxlLjwvU1RST05HPjwvUD4KLQotPFA+VW5sZXNzIHlvdSBjaGFuZ2VkIGl0cyBjb25maWd1cmF0aW9uLCB5b3VyIG5ldyBzZXJ2ZXIgaXMgY29uZmlndXJlZCBhcyBmb2xsb3dzOgotPFVMPgotPExJPgotQ29uZmlndXJhdGlvbiBmaWxlcyBjYW4gYmUgZm91bmQgaW4gPFRUPi9ldGMvYXBhY2hlPC9UVD4uPC9MST4KLQotPExJPgotVGhlIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPiwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeSB1bmRlciB3aGljaCBhbGwgeW91cgotSFRNTCBmaWxlcyBzaG91bGQgZXhpc3QsIGlzIHNldCB0byA8VFQ+L3Zhci93d3c8L1RUPi48L0xJPgotCi08TEk+Ci1DR0kgc2NyaXB0cyBhcmUgbG9va2VkIGZvciBpbiA8VFQ+L3Vzci9saWIvY2dpLWJpbjwvVFQ+LCB3aGljaCBpcyB3aGVyZQotRGViaWFuIHBhY2thZ2VzIHdpbGwgcGxhY2UgdGhlaXIgc2NyaXB0cy48L0xJPgotCi08TEk+Ci1Mb2cgZmlsZXMgYXJlIHBsYWNlZCBpbiA8VFQ+L3Zhci9sb2cvYXBhY2hlPC9UVD4sIGFuZCB3aWxsIGJlIHJvdGF0ZWQKLXdlZWtseS4gIFRoZSBmcmVxdWVuY3kgb2Ygcm90YXRpb24gY2FuIGJlIGVhc2lseSBjaGFuZ2VkIGJ5IGVkaXRpbmcKLTxUVD4vZXRjL2xvZ3JvdGF0ZS5kL2FwYWNoZTwvVFQ+LjwvTEk+Ci0KLTxMST4KLVRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpbmRleCBpcyA8VFQ+aW5kZXguaHRtbDwvVFQ+LCBtZWFuaW5nIHRoYXQgcmVxdWVzdHMKLWZvciBhIGRpcmVjdG9yeSA8VFQ+L2Zvby9iYXIvPC9UVD4gd2lsbCBnaXZlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSA8VFQ+L3Zhci93d3cvZm9vL2Jhci9pbmRleC5odG1sPC9UVD4KLWlmIGl0IGV4aXN0cyAoYXNzdW1pbmcgdGhhdCA8VFQ+L3Zhci93d3c8L1RUPiBpcyB5b3VyIDxUVD5Eb2N1bWVudFJvb3Q8L1RUPikuPC9MST4KLQotPExJPgotVXNlciBkaXJlY3RvcmllcyBhcmUgZW5hYmxlZCwgYW5kIHVzZXIgZG9jdW1lbnRzIHdpbGwgYmUgbG9va2VkIGZvcgotaW4gdGhlIDxUVD5wdWJsaWNfaHRtbDwvVFQ+IGRpcmVjdG9yeSBvZiB0aGUgdXNlcnMnIGhvbWVzLiAgVGhlc2UgZGlycwotc2hvdWxkIGJlIHVuZGVyIDxUVD4vaG9tZTwvVFQ+LCBhbmQgdXNlcnMgd2lsbCBub3QgYmUgYWJsZSB0byBzeW1saW5rCi10byBmaWxlcyB0aGV5IGRvbid0IG93bi48L0xJPgotCi08L1VMPgotQWxsIHRoZSBzdGFuZGFyZCBhcGFjaGUgbW9kdWxlcyBhcmUgYXZhaWxhYmxlIHdpdGggdGhpcyByZWxlYXNlIGFuZCBhcmUKLW5vdyBtYW5hZ2VkIHdpdGggZGViY29uZi4gIFR5cGUgPFRUPmRwa2ctcmVjb25maWd1cmUgYXBhY2hlPC9UVD4gdG8KLXNlbGVjdCB3aGljaCBtb2R1bGVzIHlvdSB3YW50IGVuYWJsZWQuICBNYW55IG90aGVyIG1vZHVsZXMgYXJlIGF2YWlsYWJsZQotdGhyb3VnaCB0aGUgRGViaWFuIHBhY2thZ2Ugc3lzdGVtIHdpdGggdGhlIG5hbWVzIDxUVD5saWJhcGFjaGUtbW9kLSo8L1RUPi4KLUlmIHlvdSBuZWVkIHRvIGNvbXBpbGUgYSBtb2R1bGUgeW91cnNlbGYsIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUKLTxUVD5hcGFjaGUtZGV2PC9UVD4gcGFja2FnZS4KLQotPFA+TW9yZSBkb2N1bWVudGF0aW9uIG9uIEFwYWNoZSBjYW4gYmUgZm91bmQgb246Ci08VUw+Ci08TEk+Ci1UaGUgPEEgSFJFRj0iL2RvYy9hcGFjaGUtZG9jL21hbnVhbC8iPkFwYWNoZSBkb2N1bWVudGF0aW9uPC9BPiBzdG9yZWQgb24geW91ciBzZXJ2ZXIuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZSBQcm9qZWN0PC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hlLXNzbC5vcmcvIj5BcGFjaGUtU1NMPC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly9wZXJsLmFwYWNoZS5vcmcvIj5tb2QgcGVybDwvQT4gaG9tZSBzaXRlLjwvTEk+Ci0KLTxMST4KLVRoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmFwYWNoZXdlZWsuY29tLyI+QXBhY2hlV2VlazwvQT4gbmV3c2xldHRlci48L0xJPgotCi08TEk+Ci1UaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnL2RvYy8iPkRlYmlhbiBQcm9qZWN0Ci1Eb2N1bWVudGF0aW9uPC9BPiB3aGljaCBjb250YWlucyBIT1dUT3MsIEZBUXMsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzLjwvTEk+Ci08L1VMPgotCi08UD5Zb3UgY2FuIGFsc28gY29uc3VsdCB0aGUgbGlzdCBvZiA8QSBIUkVGPSJodHRwOi8vd3d3LmJvdXRlbGwuY29tL2ZhcS8iPldvcmxkCi1XaWRlIFdlYiBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9uczwvQT4gZm9yIGluZm9ybWF0aW9uLgotCi08SDI+TGV0IG90aGVyIHBlb3BsZSBrbm93IGFib3V0IHRoaXMgc2VydmVyPC9IMj4KLQotPEEgSFJFRj0iaHR0cDovL25ldGNyYWZ0LmNvbS8iPk5ldGNyYWZ0PC9BPiBwcm92aWRlcyBhbiBpbnRlcmVzdGluZyBmcmVlCi1zZXJ2aWNlIGZvciB3ZWIgc2l0ZSBtb25pdG9yaW5nIGFuZCBzdGF0aXN0aWMgY29sbGVjdGlvbi4KLVlvdSBjYW4gbGV0IHRoZW0ga25vdyBhYm91dCB5b3VyIHNlcnZlciB1c2luZyB0aGVpcgotPEEgSFJFRj0iaHR0cDovL3VwdGltZS5uZXRjcmFmdC5jb20vIj5pbnRlcmZhY2U8L0E+LgotRW5hYmxpbmcgdGhlIG1vbml0b3Jpbmcgb2YgeW91ciBzZXJ2ZXIgd2lsbCBwcm92aWRlIGEgYmV0dGVyIGdsb2JhbCBvdmVydmlldwotb2Ygd2hvIGlzIHVzaW5nIHdoYXQgYW5kIHdoZXJlLCBhbmQgaXQgd291bGQgZ2l2ZSBEZWJpYW4gYSBiZXR0ZXIKLW92ZXJ2aWV3IG9mIHRoZSBhcGFjaGUgcGFja2FnZSB1c2FnZS4KLQotPEgyPkFib3V0IHRoaXMgcGFnZTwvSDI+Ci0KLTxJTUcgQUxJR049InJpZ2h0IiBBTFQ9IiIgSEVJR0hUPSIyNDciIFdJRFRIPSIyNzgiIFNSQz0iaWNvbnMvamhlMDYxLnBuZyI+Ci0KLTxQPlRoaXMgaXMgYSBwbGFjZWhvbGRlciBwYWdlIGluc3RhbGxlZCBieSB0aGUgPEEKLUhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPkRlYmlhbjwvQT4KLXJlbGVhc2Ugb2YgdGhlIGFwYWNoZSBXZWIgc2VydmVyIHBhY2thZ2UuCi0KLTxQPlRoaXMgY29tcHV0ZXIgaGFzIGluc3RhbGxlZCB0aGUgRGViaWFuIEdOVS9MaW51eCBvcGVyYXRpbmcgc3lzdGVtLAotYnV0IGl0IGhhcyA8c3Ryb25nPm5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgRGViaWFuCi1Qcm9qZWN0PC9zdHJvbmc+LiBQbGVhc2UgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gY29udGFjdCB0aGUgRGViaWFuCi1Qcm9qZWN0IGFib3V0IGl0LjwvUD4KLQotPFA+SWYgeW91IGZpbmQgYSBidWcgaW4gdGhpcyBhcGFjaGUgcGFja2FnZSwgb3IgaW4gQXBhY2hlIGl0c2VsZiwKLXBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCBvbiBpdC4gIEluc3RydWN0aW9ucyBvbiBkb2luZyB0aGlzLCBhbmQgdGhlCi1saXN0IG9mIDxBIEhSRUY9Imh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvc3JjOmFwYWNoZSI+a25vd24gYnVnczwvQT4gb2YgdGhpcwotcGFja2FnZSwgY2FuIGJlIGZvdW5kIGluIHRoZSAKLTxBIEhSRUY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy9CdWdzL1JlcG9ydGluZyI+RGViaWFuIEJ1ZyBUcmFja2luZyBTeXN0ZW08L0E+LgotCi08UD5UaGFua3MgZm9yIHVzaW5nIHRoaXMgcGFja2FnZSwgYW5kIGNvbmdyYXR1bGF0aW9ucyBmb3IgeW91ciBjaG9pY2Ugb2YKLWEgRGViaWFuIHN5c3RlbSE8L1A+Ci0KLTxESVYgYWxpZ249ImNlbnRlciI+Ci08YSBocmVmPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj4KLTxJTUcgYWxpZ249Im1pZGRsZSIgaGVpZ2h0PSIzMCIgd2lkdGg9IjI1IiBzcmM9Imljb25zL2RlYmlhbi9vcGVubG9nby0yNS5qcGciIGFsdD0iRGViaWFuIj4KLTwvYT4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPgotPElNRyBhbGlnbj0ibWlkZGxlIiBoZWlnaHQ9IjMyIiB3aWR0aD0iMjU5IiBzcmM9Imljb25zL2FwYWNoZV9wYi5wbmciIGFsdD0iQXBhY2hlIj4KLTwvYT4KLTwvRElWPgotCi08IS0tCi0gIFRoaXMgcGFnZSB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQgYnkgSm9obmllIEluZ3JhbSAoaHR0cDovL25ldGdvZC5uZXQvKQotICBJdCB3YXMgbGF0ZXIgZWRpdGVkIGJ5IE1hdHRoZXcgV2lsY294IGFuZCBKb3NpcCBSb2Rpbi4KLSAgTGFzdCBtb2RpZmllZDogJERhdGU6IDIwMDQvMDYvMjAgMTU6MzM6NTcgJC4KLSAgLS0+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KLQotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLS4uLi4uLi4uLi4uLi4uRS4uNC5uQC5ALiFULi4uLi4uLi4ucC5QN1guSTd6Li4uLjBfLi4uLi4uLgotTS4uLk0uLi4KLTIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KLS4uLi4uLi4uLi4uLi4uRS4uNC5wQC5ALiFSLi4uLi4uLi4ucC5QN1guSTd6Li4uLjBfLi4uLi4uLgotTS4uIU0uLi4KLTIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KLS4uLi4uLi4uLi4uLi4uRS4uNC4uQC5ALi4uLi4uLi4uLi4uUC5wN3ouLjdYLkouLiAuLjUuLi4uLgotTS4uI00uLiEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci0uLi4uLi4uLi4uLi4uLkUuLjQuckAuQC4hUC4uLi4uLi4uLnAuUDdYLko3ei4uLi4wXy4uLi4uLi4KLU0uLiNNLi4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1BQS5vdXQgYi90ZXN0cy9wcmludC1BQS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTljNmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcHJpbnQtQUEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLTIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+Ci0uLi4uLi4uLi4uLi4uLkUuLjwuaEAuQC4hUi4uLi4uLi4uLnAuUDdYLn4uLi4uLi4uLi4hLi4uLkAuLi4uCi1NLi4uLi4uLi4uLi4KLTIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KLS4uLi4uLi4uLi4uLi4uRS4uPC4uQC5ALjwuLi4uLi4uLi4uUC5wN3ouLjdYLi4uLi4ubi4uLi4uQC4uLi4KLU0uLi5NLi4uLi4uLgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotLi4uLi4uLi4uLi4uLi5FLi40LmpALkAuIVguLi4uLi4uLi5wLlA3WC4uN3ouLi4uIC43Li4uLi4uCi1NLi4uTS4uLgotMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+Ci0uLi4uLi4uLi4uLi4uLkUuLi4ubEAuQC4gLi4uLi4uLi4uLnAuUDdYLi43ei4uLi4gLi4uLi4uLi4KLU0uLi5NLi4uR0VUIC8gSFRUUC8xLjEKLUhvc3Q6IGxvY2FsaG9zdAotVXNlci1BZ2VudDogRUxpbmtzLzAuMTAuNC03LWRlYmlhbiAodGV4dG1vZGU7IExpbnV4IDIuNi4xMS0xLTY4Ni1zbXAgaTY4NjsgMTMyeDU2LTIpCi1BY2NlcHQ6ICovKgotQWNjZXB0LUVuY29kaW5nOiBnemlwCi1BY2NlcHQtTGFuZ3VhZ2U6IGVuCi1Db25uZWN0aW9uOiBLZWVwLUFsaXZlCi0KLQotMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+Ci0uLi4uLi4uLi4uLi4uLkUuLjQuLkAuQC4uLi4uLi4uLi4uLlAucDd6Li43WC5JLi4gLjcuLi4uLi4KLU0uLi5NLi4uCi0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci0uLi4uLi4uLi4uLi4uLkUuLi4uLkAuQC4uJS4uLi4uLi4uLlAucDd6Li43WC5JLi4gLi4uLi4uLi4KLU0uLi5NLi4uSFRUUC8xLjEgMjAwIE9LCi1EYXRlOiBXZWQsIDA2IEp1bCAyMDA1IDAzOjU3OjM1IEdNVAotU2VydmVyOiBBcGFjaGUvMS4zLjMzCi1MYXN0LU1vZGlmaWVkOiBTdW4sIDE1IEF1ZyAyMDA0IDAwOjQzOjQxIEdNVAotRVRhZzogIjZlODBmMC0xNDhhLTQxMWViMWJkIgotQWNjZXB0LVJhbmdlczogYnl0ZXMKLUNvbnRlbnQtTGVuZ3RoOiA1MjU4Ci1LZWVwLUFsaXZlOiB0aW1lb3V0PTE1LCBtYXg9MTAwCi1Db25uZWN0aW9uOiBLZWVwLUFsaXZlCi1Db250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xCi0KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPEhUTUw+Ci08SEVBRD4KLSAgIDxNRVRBIEhUVFAtRVFVSVY9IkNvbnRlbnQtVHlwZSIgQ09OVEVOVD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPE1FVEEgTkFNRT0iRGVzY3JpcHRpb24iIENPTlRFTlQ9IlRoZSBpbml0aWFsIGluc3RhbGxhdGlvbiBvZiBEZWJpYW4gYXBhY2hlLiI+Ci0gICA8VElUTEU+UGxhY2Vob2xkZXIgcGFnZTwvVElUTEU+Ci08L0hFQUQ+Ci08Qk9EWSBURVhUPSIjMDAwMDAwIiBCR0NPTE9SPSIjRkZGRkZGIiBMSU5LPSIjMDAwMEVGIiBWTElOSz0iIzU1MTg4QSIgQUxJTks9IiNGRjAwMDAiPgotCi08SDE+UGxhY2Vob2xkZXIgcGFnZTwvSDE+Ci08SDI+SWYgeW91IGFyZSBqdXN0IGJyb3dzaW5nIHRoZSB3ZWI8L2gyPgotCi08UD5UaGUgb3duZXIgb2YgdGhpcyB3ZWIgc2l0ZSBoYXMgbm90IHB1dCB1cCBhbnkgd2ViIHBhZ2VzIHlldC4KLVBsZWFzZSBjb21lIGJhY2sgbGF0ZXIuPC9QPgotCi08UD48U01BTEw+PENJVEU+TW92ZSBhbG9uZywgbm90aGluZyB0byBzZWUgaGVyZS4uLjwvQ0lURT4gOi0pPC9TTUFMTD48L1A+Ci0KLTxIMj5JZiB5b3UgYXJlIHRyeWluZyB0byBsb2NhdGUgdGhlIGFkbWluaXN0cmF0b3Igb2YgdGhpcyBtYWNoaW5lPC9IMj4KLQotPFA+SWYgeW91IHdhbnQgdG8gcmVwb3J0IHNvbWV0aGluZyBhYm91dCB0aGlzIGhvc3QncyBiZWhhdmlvciwgcGxlYXNlCi1jb250YWN0IHRoZSBJbnRlcm5ldCBTZXJ2aWNlIFByb3ZpZGVyIChJU1ApIGludm9sdmVkIGRpcmVjdGx5LjwvUD4KLQotPFA+U2VlIHRoZSA8QSBocmVmPSJodHRwOi8vd3d3LmFidXNlLm5ldC8iPk5ldHdvcmsgQWJ1c2UKLUNsZWFyaW5naG91c2U8L0E+IGZvciBob3cgdG8gZG8gdGhpcy48L1A+Ci0KLTxIMj5JZiB5b3UgYXJlIHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgbWFjaGluZTwvSDI+Ci0KLTxQPlRoZSBpbml0aWFsIGluc3RhbGxhdGlvbiBvZiA8QSBocmVmPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvIj5EZWJpYW4ncwotYXBhY2hlPC9BPiB3ZWIgc2VydmVyIHBhY2thZ2Ugd2FzIHN1Y2Nlc3NmdWwuPC9QPgotCi08UD48U1RST05HPllvdSBzaG91bGQgcmVwbGFjZSB0aGlzIHBhZ2Ugd2l0aCB5b3VyIG93biB3ZWIgcGFnZXMgYXMKLXNvb24gYXMgcG9zc2libGUuPC9TVFJPTkc+PC9QPgotCi08UD5Vbmxlc3MgeW91IGNoYW5nZWQgaXRzIGNvbmZpZ3VyYXRpb24sIHlvdXIgbmV3IHNlcnZlciBpcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6Ci08VUw+Ci08TEk+Ci1Db25maWd1cmF0aW9uIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiA8VFQ+L2V0Yy9hcGFjaGU8L1RUPi48L0xJPgotCi08TEk+Ci1UaGUgPFRUPkRvY3VtZW50Um9vdDwvVFQ+LCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIGFsbCB5b3VyCi1IVE1MIGZpbGVzIHNob3VsZCBleGlzdCwgaXMgc2V0IHRvIDxUVD4vdmFyL3d3dzwvVFQ+LjwvTEk+Ci0KLTxMST4KLUNHSSBzY3JpcHRzIGFyZSBsb29rZWQgZm9yIGluIDxUVD4vdXNyL2xpYi9jZ2ktYmluPC9UVD4sIHdoaWNoIGlzIHdoZXJlCi1EZWJpYW4gcGFja2FnZXMgd2lsbCBwbGFjZSB0aGVpciBzY3JpcHRzLjwvTEk+Ci0KLTxMST4KLUxvZyBmaWxlcyBhcmUgcGxhY2VkIGluIDxUVD4vdmFyL2xvZy9hcGFjaGU8L1RUPiwgYW5kIHdpbGwgYmUgcm90YXRlZAotd2Vla2x5LiAgVGhlIGZyZXF1ZW5jeSBvZiByb3RhdGlvbiBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgYnkgZWRpdGluZwotPFRUPi9ldGMvbG9ncm90YXRlLmQvYXBhY2hlPC9UVD4uPC9MST4KLQotPExJPgotVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGluZGV4IGlzIDxUVD5pbmRleC5odG1sPC9UVD4sIG1lYW5pbmcgdGhhdCByZXF1ZXN0cwotZm9yIGEgZGlyZWN0b3J5IDxUVD4vZm9vL2Jhci88L1RUPiB3aWxsIGdpdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIDxUVD4vdmFyL3d3dy9mb28vYmFyL2luZGV4Lmh0bWw8L1RUPgotaWYgaXQgZXhpc3RzIChhc3N1bWluZyB0aGF0IDxUVD4vdmFyL3d3dzwvVFQ+IGlzIHlvdXIgPFRUPkRvY3VtZW50Um9vdDwvVFQ+KS48L0xJPgotCi08TEk+Ci1Vc2VyIGRpcmVjdG9yaWVzIGFyZSBlbmFibGVkLCBhbmQgdXNlciBkb2N1bWVudHMgd2lsbCBiZSBsb29rZWQgZm9yCi1pbiB0aGUgPFRUPnB1YmxpY19odG1sPC9UVD4gZGlyZWN0b3J5IG9mIHRoZSB1c2VycycgaG9tZXMuICBUaGVzZSBkaXJzCi1zaG91bGQgYmUgdW5kZXIgPFRUPi9ob21lPC9UVD4sIGFuZCB1c2VycyB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bWxpbmsKLXRvIGZpbGVzIHRoZXkgZG9uJ3Qgb3duLjwvTEk+Ci0KLTwvVUw+Ci1BbGwgdGhlIHN0YW5kYXJkIGFwYWNoZSBtb2R1bGVzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGlzIHJlbGVhc2UgYW5kIGFyZQotbm93IG1hbmFnZWQgd2l0aCBkZWJjb25mLiAgVHlwZSA8VFQ+ZHBrZy1yZWNvbmZpZ3VyZSBhcGFjaGU8L1RUPiB0bwotc2VsZWN0IHdoaWNoIG1vZHVsZXMgeW91IHdhbnQgZW5hYmxlZC4gIE1hbnkgb3RoZXIgbW9kdWxlcyBhcmUgYXZhaWxhYmxlCi10aHJvdWdoIHRoZSBEZWJpYW4gcGFja2FnZSBzeXN0ZW0gd2l0aCB0aGUgbmFtZXMgPFRUPmxpYmFwYWNoZS1tb2QtKjwvVFQ+LgotSWYgeW91IG5lZWQgdG8gY29tcGlsZSBhIG1vZHVsZSB5b3Vyc2VsZiwgeW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIHRoZQotPFRUPmFwYWNoZS1kZXY8L1RUPiBwYWNrYWdlLgotCi08UD5Nb3JlIGRvY3VtZW50YXRpb24gb24gQXBhY2hlIGNhbiBiZSBmb3VuZCBvbjoKLTxVTD4KLTxMST4KLVRoZSA8QSBIUkVGPSIvZG9jL2FwYWNoZS1kb2MvbWFudWFsLyI+QXBhY2hlIGRvY3VtZW50YXRpb248L0E+IHN0b3JlZCBvbiB5b3VyIHNlcnZlci48L0xJPgotCi08TEk+Ci1UaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+QXBhY2hlIFByb2plY3Q8L0E+IGhvbWUgc2l0ZS48L0xJPgotCi08TEk+Ci1UaGUgPEEgSFJFRj0iaHR0cDovL3d3dy5hcGFjaGUtc3NsLm9yZy8iPkFwYWNoZS1TU0w8L0E+IGhvbWUgc2l0ZS48L0xJPgotCi08TEk+Ci1UaGUgPEEgSFJFRj0iaHR0cDovL3BlcmwuYXBhY2hlLm9yZy8iPm1vZCBwZXJsPC9BPiBob21lIHNpdGUuPC9MST4KLQotPExJPgotVGhlIDxBIEhSRUY9Imh0dHA6Ly93d3cuYXBhY2hld2Vlay5jb20vIj5BcGFjaGVXZWVrPC9BPiBuZXdzbGV0dGVyLjwvTEk+Ci0KLTxMST4KLVRoZSA8QSBIUkVGPSJodHRwOi8vd3d3LmRlYmlhbi5vcmcvZG9jLyI+RGViaWFuIFByb2plY3QKLURvY3VtZW50YXRpb248L0E+IHdoaWNoIGNvbnRhaW5zIEhPV1RPcywgRkFRcywgYW5kIHNvZnR3YXJlIHVwZGF0ZXMuPC9MST4KLTwvVUw+Ci0KLTxQPllvdSBjYW4gYWxzbyBjb25zdWx0IHRoZSBsaXN0IG9mIDxBIEhSRUY9Imh0dHA6Ly93d3cuYm91dGVsbC5jb20vZmFxLyI+V29ybGQKLVdpZGUgV2ViIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zPC9BPiBmb3IgaW5mb3JtYXRpb24uCi0KLTxIMj5MZXQgb3RoZXIgcGVvcGxlIGtub3cgYWJvdXQgdGhpcyBzZXJ2ZXI8L0gyPgotCi08QSBIUkVGPSJodHRwOi8vbmV0Y3JhZnQuY29tLyI+TmV0Y3JhZnQ8L0E+IHByb3ZpZGVzIGFuIGludGVyZXN0aW5nIGZyZWUKLXNlcnZpY2UgZm9yIHdlYiBzaXRlIG1vbml0b3JpbmcgYW5kIHN0YXRpc3RpYyBjb2xsZWN0aW9uLgotWW91IGNhbiBsZXQgdGhlbSBrbm93IGFib3V0IHlvdXIgc2VydmVyIHVzaW5nIHRoZWlyCi08QSBIUkVGPSJodHRwOi8vdXB0aW1lLm5ldGNyYWZ0LmNvbS8iPmludGVyZmFjZTwvQT4uCi1FbmFibGluZyB0aGUgbW9uaXRvcmluZyBvZiB5b3VyIHNlcnZlciB3aWxsIHByb3ZpZGUgYSBiZXR0ZXIgZ2xvYmFsIG92ZXJ2aWV3Ci1vZiB3aG8gaXMgdXNpbmcgd2hhdCBhbmQgd2hlcmUsIGFuZCBpdCB3b3VsZCBnaXZlIERlYmlhbiBhIGJldHRlcgotb3ZlcnZpZXcgb2YgdGhlIGFwYWNoZSBwYWNrYWdlIHVzYWdlLgotCi08SDI+QWJvdXQgdGhpcyBwYWdlPC9IMj4KLQotPElNRyBBTElHTj0icmlnaHQiIEFMVD0iIiBIRUlHSFQ9IjI0NyIgV0lEVEg9IjI3OCIgU1JDPSJpY29ucy9qaGUwNjEucG5nIj4KLQotPFA+VGhpcyBpcyBhIHBsYWNlaG9sZGVyIHBhZ2UgaW5zdGFsbGVkIGJ5IHRoZSA8QQotSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnLyI+RGViaWFuPC9BPgotcmVsZWFzZSBvZiB0aGUgYXBhY2hlIFdlYiBzZXJ2ZXIgcGFja2FnZS4KLQotPFA+VGhpcyBjb21wdXRlciBoYXMgaW5zdGFsbGVkIHRoZSBEZWJpYW4gR05VL0xpbnV4IG9wZXJhdGluZyBzeXN0ZW0sCi1idXQgaXQgaGFzIDxzdHJvbmc+bm90aGluZyB0byBkbyB3aXRoIHRoZSBEZWJpYW4KLVByb2plY3Q8L3N0cm9uZz4uIFBsZWFzZSBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBjb250YWN0IHRoZSBEZWJpYW4KLVByb2plY3QgYWJvdXQgaXQuPC9QPgotCi08UD5JZiB5b3UgZmluZCBhIGJ1ZyBpbiB0aGlzIGFwYWNoZSBwYWNrYWdlLCBvciBpbiBBcGFjaGUgaXRzZWxmLAotcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IG9uIGl0LiAgSW5zdHJ1Y3Rpb25zIG9uIGRvaW5nIHRoaXMsIGFuZCB0aGUKLWxpc3Qgb2YgPEEgSFJFRj0iaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9zcmM6YXBhY2hlIj5rbm93biBidWdzPC9BPiBvZiB0aGlzCi1wYWNrYWdlLCBjYW4gYmUgZm91bmQgaW4gdGhlIAotPEEgSFJFRj0iaHR0cDovL3d3dy5kZWJpYW4ub3JnL0J1Z3MvUmVwb3J0aW5nIj5EZWJpYW4gQnVnIFRyYWNraW5nIFN5c3RlbTwvQT4uCi0KLTxQPlRoYW5rcyBmb3IgdXNpbmcgdGhpcyBwYWNrYWdlLCBhbmQgY29uZ3JhdHVsYXRpb25zIGZvciB5b3VyIGNob2ljZSBvZgotYSBEZWJpYW4gc3lzdGVtITwvUD4KLQotPERJViBhbGlnbj0iY2VudGVyIj4KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZGViaWFuLm9yZy8iPgotPElNRyBhbGlnbj0ibWlkZGxlIiBoZWlnaHQ9IjMwIiB3aWR0aD0iMjUiIHNyYz0iaWNvbnMvZGViaWFuL29wZW5sb2dvLTI1LmpwZyIgYWx0PSJEZWJpYW4iPgotPC9hPgotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyI+Ci08SU1HIGFsaWduPSJtaWRkbGUiIGhlaWdodD0iMzIiIHdpZHRoPSIyNTkiIHNyYz0iaWNvbnMvYXBhY2hlX3BiLnBuZyIgYWx0PSJBcGFjaGUiPgotPC9hPgotPC9ESVY+Ci0KLTwhLS0KLSAgVGhpcyBwYWdlIHdhcyBpbml0aWFsbHkgY3JlYXRlZCBieSBKb2huaWUgSW5ncmFtIChodHRwOi8vbmV0Z29kLm5ldC8pCi0gIEl0IHdhcyBsYXRlciBlZGl0ZWQgYnkgTWF0dGhldyBXaWxjb3ggYW5kIEpvc2lwIFJvZGluLgotICBMYXN0IG1vZGlmaWVkOiAkRGF0ZTogMjAwNC8wNi8yMCAxNTozMzo1NyAkLgotICAtLT4KLQotPC9CT0RZPgotPC9IVE1MPgotCi0yMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgotLi4uLi4uLi4uLi4uLi5FLi40Lm5ALkAuIVQuLi4uLi4uLi5wLlA3WC5JN3ouLi4uMF8uLi4uLi4uCi1NLi4uTS4uLgotMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgotLi4uLi4uLi4uLi4uLi5FLi40LnBALkAuIVIuLi4uLi4uLi5wLlA3WC5JN3ouLi4uMF8uLi4uLi4uCi1NLi4hTS4uLgotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotLi4uLi4uLi4uLi4uLi5FLi40Li5ALkAuLi4uLi4uLi4uLi5QLnA3ei4uN1guSi4uIC4uNS4uLi4uCi1NLi4jTS4uIQotMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KLS4uLi4uLi4uLi4uLi4uRS4uNC5yQC5ALiFQLi4uLi4uLi4ucC5QN1guSjd6Li4uLjBfLi4uLi4uLgotTS4uI00uLiMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LVgubmV3IGIvdGVzdHMvcHJpbnQtWC5uZXcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTQ0ZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcHJpbnQtWC5uZXcKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KLQkweDAwMDA6ICA0NTAwIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgIEUuLjwuaEAuQC4hUi4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAgIC4uLi4ucC5QN1gufi4uLi4KLQkweDAwMjA6ICBhMDAyIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgIC4uLi4uIS4uLi5ALi4uLi4KLQkweDAwMzA6ICA0ZGRjIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMiAgICAgICAgICAgIE0uLi4uLi4uLi4uLgotMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgotCTB4MDAwMDogIDQ1MDAgMDAzYyAwMDAwIDQwMDAgNDAwNiAzY2JhIDdmMDAgMDAwMSAgRS4uPC4uQC5ALjwuLi4uLgotCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYxIDM3NTggODk3ZiAgLi4uLi5QLnA3ei4uN1guLgotCTB4MDAyMDogIGEwMTIgN2ZmZiA2ZWIxIDAwMDAgMDIwNCA0MDBjIDA0MDIgMDgwYSAgLi4uLm4uLi4uLkAuLi4uLgotCTB4MDAzMDogIDRkZGMgOTIxNiA0ZGRjIDkyMTYgMDEwMyAwMzAyICAgICAgICAgICAgTS4uLk0uLi4uLi4uCi0yMzo1NzozNS45MzgxNjcgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTA+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFiNmEgNDAwMCA0MDA2IDIxNTggN2YwMCAwMDAxICBFLi40LmpALkAuIVguLi4uCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyICAuLi4uLnAuUDdYLi43ei4uCi0JMHgwMDIwOiAgODAxMCAyMDAwIDM3ZDAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE2ICAuLi4uNy4uLi4uLi5NLi4uCi0JMHgwMDMwOiAgNGRkYyA5MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLi4uCi0yMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KLQkweDAwMDA6ICA0NTAwIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEgIEUuLi4ubEAuQC4uLi4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgIC4uLi4ucC5QN1guLjd6Li4KLQkweDAwMjA6ICA4MDE4IDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcgIC4uLi4uLi4uLi4uLk0uLi4KLQkweDAwMzA6ICA0ZGRjIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEgIE0uLi5HRVQuLy5IVFRQLzEKLQkweDAwNDA6ICAyZTMxIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjggIC4xLi5Ib3N0Oi5sb2NhbGgKLQkweDAwNTA6ICA2ZjczIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EgIG9zdC4uVXNlci1BZ2VudDoKLQkweDAwNjA6ICAyMDQ1IDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcgIC5FTGlua3MvMC4xMC40LTcKLQkweDAwNzA6ICAyZDY0IDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQgIC1kZWJpYW4uKHRleHRtb2QKLQkweDAwODA6ICA2NTNiIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQgIGU7LkxpbnV4LjIuNi4xMS0KLQkweDAwOTA6ICAzMTJkIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAgIDEtNjg2LXNtcC5pNjg2Oy4KLQkweDAwYTA6ICAzMTMzIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAgIDEzMng1Ni0yKS4uQWNjZXAKLQkweDAwYjA6ICA3NDNhIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUgIHQ6LiovKi4uQWNjZXB0LUUKLQkweDAwYzA6ICA2ZTYzIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEgIG5jb2Rpbmc6Lmd6aXAuLkEKLQkweDAwZDA6ICA2MzYzIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAgIGNjZXB0LUxhbmd1YWdlOi4KLQkweDAwZTA6ICA2NTZlIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAgIGVuLi5Db25uZWN0aW9uOi4KLQkweDAwZjA6ICA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhICAgICAgIEtlZXAtQWxpdmUuLi4uCi0yMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWZlNCA0MDAwIDQwMDYgMWNkZSA3ZjAwIDAwMDEgIEUuLjQuLkAuQC4uLi4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgIC4uLi4uUC5wN3ouLjdYLkkKLQkweDAwMjA6ICA4MDEwIDIwMDAgMzcwMyAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTggIC4uLi43Li4uLi4uLk0uLi4KLQkweDAwMzA6ICA0ZGRjIDkyMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLi4KLTIzOjU3OjM1Ljk0MTIzMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFAgMTo1NTYwKDU1NTkpIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICA0NTAwIDE1ZWIgMWZlNiA0MDAwIDQwMDYgMDcyNSA3ZjAwIDAwMDEgIEUuLi4uLkAuQC4uJS4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgIC4uLi4uUC5wN3ouLjdYLkkKLQkweDAwMjA6ICA4MDE4IDIwMDAgMTNlMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgIC4uLi4uLi4uLi4uLk0uLi4KLQkweDAwMzA6ICA0ZGRjIDkyMTcgNDg1NCA1NDUwIDJmMzEgMmUzMSAyMDMyIDMwMzAgIE0uLi5IVFRQLzEuMS4yMDAKLQkweDAwNDA6ICAyMDRmIDRiMGQgMGE0NCA2MTc0IDY1M2EgMjA1NyA2NTY0IDJjMjAgIC5PSy4uRGF0ZTouV2VkLC4KLQkweDAwNTA6ICAzMDM2IDIwNGEgNzU2YyAyMDMyIDMwMzAgMzUyMCAzMDMzIDNhMzUgIDA2Lkp1bC4yMDA1LjAzOjUKLQkweDAwNjA6ICAzNzNhIDMzMzUgMjA0NyA0ZDU0IDBkMGEgNTM2NSA3Mjc2IDY1NzIgIDc6MzUuR01ULi5TZXJ2ZXIKLQkweDAwNzA6ICAzYTIwIDQxNzAgNjE2MyA2ODY1IDJmMzEgMmUzMyAyZTMzIDMzMGQgIDouQXBhY2hlLzEuMy4zMy4KLQkweDAwODA6ICAwYTRjIDYxNzMgNzQyZCA0ZDZmIDY0NjkgNjY2OSA2NTY0IDNhMjAgIC5MYXN0LU1vZGlmaWVkOi4KLQkweDAwOTA6ICA1Mzc1IDZlMmMgMjAzMSAzNTIwIDQxNzUgNjcyMCAzMjMwIDMwMzQgIFN1biwuMTUuQXVnLjIwMDQKLQkweDAwYTA6ICAyMDMwIDMwM2EgMzQzMyAzYTM0IDMxMjAgNDc0ZCA1NDBkIDBhNDUgIC4wMDo0Mzo0MS5HTVQuLkUKLQkweDAwYjA6ICA1NDYxIDY3M2EgMjAyMiAzNjY1IDM4MzAgNjYzMCAyZDMxIDM0MzggIFRhZzouIjZlODBmMC0xNDgKLQkweDAwYzA6ICA2MTJkIDM0MzEgMzE2NSA2MjMxIDYyNjQgMjIwZCAwYTQxIDYzNjMgIGEtNDExZWIxYmQiLi5BY2MKLQkweDAwZDA6ICA2NTcwIDc0MmQgNTI2MSA2ZTY3IDY1NzMgM2EyMCA2Mjc5IDc0NjUgIGVwdC1SYW5nZXM6LmJ5dGUKLQkweDAwZTA6ICA3MzBkIDBhNDMgNmY2ZSA3NDY1IDZlNzQgMmQ0YyA2NTZlIDY3NzQgIHMuLkNvbnRlbnQtTGVuZ3QKLQkweDAwZjA6ICA2ODNhIDIwMzUgMzIzNSAzODBkIDBhNGIgNjU2NSA3MDJkIDQxNmMgIGg6LjUyNTguLktlZXAtQWwKLQkweDAxMDA6ICA2OTc2IDY1M2EgMjA3NCA2OTZkIDY1NmYgNzU3NCAzZDMxIDM1MmMgIGl2ZToudGltZW91dD0xNSwKLQkweDAxMTA6ICAyMDZkIDYxNzggM2QzMSAzMDMwIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgIC5tYXg9MTAwLi5Db25uZWMKLQkweDAxMjA6ICA3NDY5IDZmNmUgM2EyMCA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgIHRpb246LktlZXAtQWxpdmUKLQkweDAxMzA6ICAwZDBhIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDNhMjAgIC4uQ29udGVudC1UeXBlOi4KLQkweDAxNDA6ICA3NDY1IDc4NzQgMmY2OCA3NDZkIDZjM2IgMjA2MyA2ODYxIDcyNzMgIHRleHQvaHRtbDsuY2hhcnMKLQkweDAxNTA6ICA2NTc0IDNkNjkgNzM2ZiAyZDM4IDM4MzUgMzkyZCAzMTBkIDBhMGQgIGV0PWlzby04ODU5LTEuLi4KLQkweDAxNjA6ICAwYTNjIDIxNDQgNGY0MyA1NDU5IDUwNDUgMjA0OCA1NDRkIDRjMjAgIC48IURPQ1RZUEUuSFRNTC4KLQkweDAxNzA6ICA1MDU1IDQyNGMgNDk0MyAyMDIyIDJkMmYgMmY1NyAzMzQzIDJmMmYgIFBVQkxJQy4iLS8vVzNDLy8KLQkweDAxODA6ICA0NDU0IDQ0MjAgNDg1NCA0ZDRjIDIwMzQgMmUzMCAzMTIwIDU0NzIgIERURC5IVE1MLjQuMDEuVHIKLQkweDAxOTA6ICA2MTZlIDczNjkgNzQ2OSA2ZjZlIDYxNmMgMmYyZiA0NTRlIDIyM2UgIGFuc2l0aW9uYWwvL0VOIj4KLQkweDAxYTA6ICAwYTNjIDQ4NTQgNGQ0YyAzZTBhIDNjNDggNDU0MSA0NDNlIDBhMjAgIC48SFRNTD4uPEhFQUQ+Li4KLQkweDAxYjA6ICAyMDIwIDNjNGQgNDU1NCA0MTIwIDQ4NTQgNTQ1MCAyZDQ1IDUxNTUgIC4uPE1FVEEuSFRUUC1FUVUKLQkweDAxYzA6ICA0OTU2IDNkMjIgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgIElWPSJDb250ZW50LVR5cGUKLQkweDAxZDA6ICAyMjIwIDQzNGYgNGU1NCA0NTRlIDU0M2QgMjI3NCA2NTc4IDc0MmYgICIuQ09OVEVOVD0idGV4dC8KLQkweDAxZTA6ICA2ODc0IDZkNmMgM2IyMCA2MzY4IDYxNzIgNzM2NSA3NDNkIDY5NzMgIGh0bWw7LmNoYXJzZXQ9aXMKLQkweDAxZjA6ICA2ZjJkIDM4MzggMzUzOSAyZDMxIDIyM2UgMGEyMCAyMDIwIDNjNGQgIG8tODg1OS0xIj4uLi4uPE0KLQkweDAyMDA6ICA0NTU0IDQxMjAgNGU0MSA0ZDQ1IDNkMjIgNDQ2NSA3MzYzIDcyNjkgIEVUQS5OQU1FPSJEZXNjcmkKLQkweDAyMTA6ICA3MDc0IDY5NmYgNmUyMiAyMDQzIDRmNGUgNTQ0NSA0ZTU0IDNkMjIgIHB0aW9uIi5DT05URU5UPSIKLQkweDAyMjA6ICA1NDY4IDY1MjAgNjk2ZSA2OTc0IDY5NjEgNmMyMCA2OTZlIDczNzQgIFRoZS5pbml0aWFsLmluc3QKLQkweDAyMzA6ICA2MTZjIDZjNjEgNzQ2OSA2ZjZlIDIwNmYgNjYyMCA0NDY1IDYyNjkgIGFsbGF0aW9uLm9mLkRlYmkKLQkweDAyNDA6ICA2MTZlIDIwNjEgNzA2MSA2MzY4IDY1MmUgMjIzZSAwYTIwIDIwMjAgIGFuLmFwYWNoZS4iPi4uLi4KLQkweDAyNTA6ICAzYzU0IDQ5NTQgNGM0NSAzZTUwIDZjNjEgNjM2NSA2ODZmIDZjNjQgIDxUSVRMRT5QbGFjZWhvbGQKLQkweDAyNjA6ICA2NTcyIDIwNzAgNjE2NyA2NTNjIDJmNTQgNDk1NCA0YzQ1IDNlMGEgIGVyLnBhZ2U8L1RJVExFPi4KLQkweDAyNzA6ICAzYzJmIDQ4NDUgNDE0NCAzZTBhIDNjNDIgNGY0NCA1OTIwIDU0NDUgIDwvSEVBRD4uPEJPRFkuVEUKLQkweDAyODA6ICA1ODU0IDNkMjIgMjMzMCAzMDMwIDMwMzAgMzAyMiAyMDQyIDQ3NDMgIFhUPSIjMDAwMDAwIi5CR0MKLQkweDAyOTA6ICA0ZjRjIDRmNTIgM2QyMiAyMzQ2IDQ2NDYgNDY0NiA0NjIyIDIwNGMgIE9MT1I9IiNGRkZGRkYiLkwKLQkweDAyYTA6ICA0OTRlIDRiM2QgMjIyMyAzMDMwIDMwMzAgNDU0NiAyMjIwIDU2NGMgIElOSz0iIzAwMDBFRiIuVkwKLQkweDAyYjA6ICA0OTRlIDRiM2QgMjIyMyAzNTM1IDMxMzggMzg0MSAyMjIwIDQxNGMgIElOSz0iIzU1MTg4QSIuQUwKLQkweDAyYzA6ICA0OTRlIDRiM2QgMjIyMyA0NjQ2IDMwMzAgMzAzMCAyMjNlIDBhMGEgIElOSz0iI0ZGMDAwMCI+Li4KLQkweDAyZDA6ICAzYzQ4IDMxM2UgNTA2YyA2MTYzIDY1NjggNmY2YyA2NDY1IDcyMjAgIDxIMT5QbGFjZWhvbGRlci4KLQkweDAyZTA6ICA3MDYxIDY3NjUgM2MyZiA0ODMxIDNlMGEgM2M0OCAzMjNlIDQ5NjYgIHBhZ2U8L0gxPi48SDI+SWYKLQkweDAyZjA6ICAyMDc5IDZmNzUgMjA2MSA3MjY1IDIwNmEgNzU3MyA3NDIwIDYyNzIgIC55b3UuYXJlLmp1c3QuYnIKLQkweDAzMDA6ICA2Zjc3IDczNjkgNmU2NyAyMDc0IDY4NjUgMjA3NyA2NTYyIDNjMmYgIG93c2luZy50aGUud2ViPC8KLQkweDAzMTA6ICA2ODMyIDNlMGEgMGEzYyA1MDNlIDU0NjggNjUyMCA2Zjc3IDZlNjUgIGgyPi4uPFA+VGhlLm93bmUKLQkweDAzMjA6ICA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNzc2NSA2MjIwIDczNjkgIHIub2YudGhpcy53ZWIuc2kKLQkweDAzMzA6ICA3NDY1IDIwNjggNjE3MyAyMDZlIDZmNzQgMjA3MCA3NTc0IDIwNzUgIHRlLmhhcy5ub3QucHV0LnUKLQkweDAzNDA6ICA3MDIwIDYxNmUgNzkyMCA3NzY1IDYyMjAgNzA2MSA2NzY1IDczMjAgIHAuYW55LndlYi5wYWdlcy4KLQkweDAzNTA6ICA3OTY1IDc0MmUgMGE1MCA2YzY1IDYxNzMgNjUyMCA2MzZmIDZkNjUgIHlldC4uUGxlYXNlLmNvbWUKLQkweDAzNjA6ICAyMDYyIDYxNjMgNmIyMCA2YzYxIDc0NjUgNzIyZSAzYzJmIDUwM2UgIC5iYWNrLmxhdGVyLjwvUD4KLQkweDAzNzA6ICAwYTBhIDNjNTAgM2UzYyA1MzRkIDQxNGMgNGMzZSAzYzQzIDQ5NTQgIC4uPFA+PFNNQUxMPjxDSVQKLQkweDAzODA6ICA0NTNlIDRkNmYgNzY2NSAyMDYxIDZjNmYgNmU2NyAyYzIwIDZlNmYgIEU+TW92ZS5hbG9uZywubm8KLQkweDAzOTA6ICA3NDY4IDY5NmUgNjcyMCA3NDZmIDIwNzMgNjU2NSAyMDY4IDY1NzIgIHRoaW5nLnRvLnNlZS5oZXIKLQkweDAzYTA6ICA2NTJlIDJlMmUgM2MyZiA0MzQ5IDU0NDUgM2UyMCAzYTJkIDI5M2MgIGUuLi48L0NJVEU+LjotKTwKLQkweDAzYjA6ICAyZjUzIDRkNDEgNGM0YyAzZTNjIDJmNTAgM2UwYSAwYTNjIDQ4MzIgIC9TTUFMTD48L1A+Li48SDIKLQkweDAzYzA6ICAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCA3NDcyIDc5NjkgID5JZi55b3UuYXJlLnRyeWkKLQkweDAzZDA6ICA2ZTY3IDIwNzQgNmYyMCA2YzZmIDYzNjEgNzQ2NSAyMDc0IDY4NjUgIG5nLnRvLmxvY2F0ZS50aGUKLQkweDAzZTA6ICAyMDYxIDY0NmQgNjk2ZSA2OTczIDc0NzIgNjE3NCA2ZjcyIDIwNmYgIC5hZG1pbmlzdHJhdG9yLm8KLQkweDAzZjA6ICA2NjIwIDc0NjggNjk3MyAyMDZkIDYxNjMgNjg2OSA2ZTY1IDNjMmYgIGYudGhpcy5tYWNoaW5lPC8KLQkweDA0MDA6ICA0ODMyIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNzcgIEgyPi4uPFA+SWYueW91LncKLQkweDA0MTA6ICA2MTZlIDc0MjAgNzQ2ZiAyMDcyIDY1NzAgNmY3MiA3NDIwIDczNmYgIGFudC50by5yZXBvcnQuc28KLQkweDA0MjA6ICA2ZDY1IDc0NjggNjk2ZSA2NzIwIDYxNjIgNmY3NSA3NDIwIDc0NjggIG1ldGhpbmcuYWJvdXQudGgKLQkweDA0MzA6ICA2OTczIDIwNjggNmY3MyA3NDI3IDczMjAgNjI2NSA2ODYxIDc2NjkgIGlzLmhvc3Qncy5iZWhhdmkKLQkweDA0NDA6ICA2ZjcyIDJjMjAgNzA2YyA2NTYxIDczNjUgMGE2MyA2ZjZlIDc0NjEgIG9yLC5wbGVhc2UuY29udGEKLQkweDA0NTA6ICA2Mzc0IDIwNzQgNjg2NSAyMDQ5IDZlNzQgNjU3MiA2ZTY1IDc0MjAgIGN0LnRoZS5JbnRlcm5ldC4KLQkweDA0NjA6ICA1MzY1IDcyNzYgNjk2MyA2NTIwIDUwNzIgNmY3NiA2OTY0IDY1NzIgIFNlcnZpY2UuUHJvdmlkZXIKLQkweDA0NzA6ICAyMDI4IDQ5NTMgNTAyOSAyMDY5IDZlNzYgNmY2YyA3NjY1IDY0MjAgIC4oSVNQKS5pbnZvbHZlZC4KLQkweDA0ODA6ICA2NDY5IDcyNjUgNjM3NCA2Yzc5IDJlM2MgMmY1MCAzZTBhIDBhM2MgIGRpcmVjdGx5LjwvUD4uLjwKLQkweDA0OTA6ICA1MDNlIDUzNjUgNjUyMCA3NDY4IDY1MjAgM2M0MSAyMDY4IDcyNjUgIFA+U2VlLnRoZS48QS5ocmUKLQkweDA0YTA6ICA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNjIgIGY9Imh0dHA6Ly93d3cuYWIKLQkweDA0YjA6ICA3NTczIDY1MmUgNmU2NSA3NDJmIDIyM2UgNGU2NSA3NDc3IDZmNzIgIHVzZS5uZXQvIj5OZXR3b3IKLQkweDA0YzA6ICA2YjIwIDQxNjIgNzU3MyA2NTBhIDQzNmMgNjU2MSA3MjY5IDZlNjcgIGsuQWJ1c2UuQ2xlYXJpbmcKLQkweDA0ZDA6ICA2ODZmIDc1NzMgNjUzYyAyZjQxIDNlMjAgNjY2ZiA3MjIwIDY4NmYgIGhvdXNlPC9BPi5mb3IuaG8KLQkweDA0ZTA6ICA3NzIwIDc0NmYgMjA2NCA2ZjIwIDc0NjggNjk3MyAyZTNjIDJmNTAgIHcudG8uZG8udGhpcy48L1AKLQkweDA0ZjA6ICAzZTBhIDBhM2MgNDgzMiAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgID4uLjxIMj5JZi55b3UuYXIKLQkweDA1MDA6ICA2NTIwIDc0NjggNjUyMCA2MTY0IDZkNjkgNmU2OSA3Mzc0IDcyNjEgIGUudGhlLmFkbWluaXN0cmEKLQkweDA1MTA6ICA3NDZmIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA2ZDYxIDYzNjggIHRvci5vZi50aGlzLm1hY2gKLQkweDA1MjA6ICA2OTZlIDY1M2MgMmY0OCAzMjNlIDBhMGEgM2M1MCAzZTU0IDY4NjUgIGluZTwvSDI+Li48UD5UaGUKLQkweDA1MzA6ICAyMDY5IDZlNjkgNzQ2OSA2MTZjIDIwNjkgNmU3MyA3NDYxIDZjNmMgIC5pbml0aWFsLmluc3RhbGwKLQkweDA1NDA6ICA2MTc0IDY5NmYgNmUyMCA2ZjY2IDIwM2MgNDEyMCA2ODcyIDY1NjYgIGF0aW9uLm9mLjxBLmhyZWYKLQkweDA1NTA6ICAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgID0iaHR0cDovL3d3dy5kZWIKLQkweDA1NjA6ICA2OTYxIDZlMmUgNmY3MiA2NzJmIDIyM2UgNDQ2NSA2MjY5IDYxNmUgIGlhbi5vcmcvIj5EZWJpYW4KLQkweDA1NzA6ICAyNzczIDBhNjEgNzA2MSA2MzY4IDY1M2MgMmY0MSAzZTIwIDc3NjUgICdzLmFwYWNoZTwvQT4ud2UKLQkweDA1ODA6ICA2MjIwIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgIGIuc2VydmVyLnBhY2thZ2UKLQkweDA1OTA6ICAyMDc3IDYxNzMgMjA3MyA3NTYzIDYzNjUgNzM3MyA2Njc1IDZjMmUgIC53YXMuc3VjY2Vzc2Z1bC4KLQkweDA1YTA6ICAzYzJmIDUwM2UgMGEwYSAzYzUwIDNlM2MgNTM1NCA1MjRmIDRlNDcgIDwvUD4uLjxQPjxTVFJPTkcKLQkweDA1YjA6ICAzZTU5IDZmNzUgMjA3MyA2ODZmIDc1NmMgNjQyMCA3MjY1IDcwNmMgID5Zb3Uuc2hvdWxkLnJlcGwKLQkweDA1YzA6ICA2MTYzIDY1MjAgNzQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjkgIGFjZS50aGlzLnBhZ2Uud2kKLQkweDA1ZDA6ICA3NDY4IDIwNzkgNmY3NSA3MjIwIDZmNzcgNmUyMCA3NzY1IDYyMjAgIHRoLnlvdXIub3duLndlYi4KLQkweDA1ZTA6ICA3MDYxIDY3NjUgNzMyMCA2MTczIDBhNzMgNmY2ZiA2ZTIwIDYxNzMgIHBhZ2VzLmFzLnNvb24uYXMKLQkweDA1ZjA6ICAyMDcwIDZmNzMgNzM2OSA2MjZjIDY1MmUgM2MyZiA1MzU0IDUyNGYgIC5wb3NzaWJsZS48L1NUUk8KLQkweDA2MDA6ICA0ZTQ3IDNlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSA1NTZlIDZjNjUgIE5HPjwvUD4uLjxQPlVubGUKLQkweDA2MTA6ICA3MzczIDIwNzkgNmY3NSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjkgIHNzLnlvdS5jaGFuZ2VkLmkKLQkweDA2MjA6ICA3NDczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2MSA3NDY5IDZmNmUgIHRzLmNvbmZpZ3VyYXRpb24KLQkweDA2MzA6ICAyYzIwIDc5NmYgNzU3MiAyMDZlIDY1NzcgMjA3MyA2NTcyIDc2NjUgICwueW91ci5uZXcuc2VydmUKLQkweDA2NDA6ICA3MjIwIDY5NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjY1IDY0MjAgIHIuaXMuY29uZmlndXJlZC4KLQkweDA2NTA6ICA2MTczIDIwNjYgNmY2YyA2YzZmIDc3NzMgM2EwYSAzYzU1IDRjM2UgIGFzLmZvbGxvd3M6LjxVTD4KLQkweDA2NjA6ICAwYTNjIDRjNDkgM2UwYSA0MzZmIDZlNjYgNjk2NyA3NTcyIDYxNzQgIC48TEk+LkNvbmZpZ3VyYXQKLQkweDA2NzA6ICA2OTZmIDZlMjAgNjY2OSA2YzY1IDczMjAgNjM2MSA2ZTIwIDYyNjUgIGlvbi5maWxlcy5jYW4uYmUKLQkweDA2ODA6ICAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNjUgIC5mb3VuZC5pbi48VFQ+L2UKLQkweDA2OTA6ICA3NDYzIDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgIHRjL2FwYWNoZTwvVFQ+LjwKLQkweDA2YTA6ICAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgIC9MST4uLjxMST4uVGhlLjwKLQkweDA2YjA6ICA1NDU0IDNlNDQgNmY2MyA3NTZkIDY1NmUgNzQ1MiA2ZjZmIDc0M2MgIFRUPkRvY3VtZW50Um9vdDwKLQkweDA2YzA6ICAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCA2OTczIDIwNzQgIC9UVD4sLndoaWNoLmlzLnQKLQkweDA2ZDA6ICA2ODY1IDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDc1IDZlNjQgIGhlLmRpcmVjdG9yeS51bmQKLQkweDA2ZTA6ICA2NTcyIDIwNzcgNjg2OSA2MzY4IDIwNjEgNmM2YyAyMDc5IDZmNzUgIGVyLndoaWNoLmFsbC55b3UKLQkweDA2ZjA6ICA3MjBhIDQ4NTQgNGQ0YyAyMDY2IDY5NmMgNjU3MyAyMDczIDY4NmYgIHIuSFRNTC5maWxlcy5zaG8KLQkweDA3MDA6ICA3NTZjIDY0MjAgNjU3OCA2OTczIDc0MmMgMjA2OSA3MzIwIDczNjUgIHVsZC5leGlzdCwuaXMuc2UKLQkweDA3MTA6ICA3NDIwIDc0NmYgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcgIHQudG8uPFRUPi92YXIvd3cKLQkweDA3MjA6ICA3NzNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgIHc8L1RUPi48L0xJPi4uPEwKLQkweDA3MzA6ICA0OTNlIDBhNDMgNDc0OSAyMDczIDYzNzIgNjk3MCA3NDczIDIwNjEgIEk+LkNHSS5zY3JpcHRzLmEKLQkweDA3NDA6ICA3MjY1IDIwNmMgNmY2ZiA2YjY1IDY0MjAgNjY2ZiA3MjIwIDY5NmUgIHJlLmxvb2tlZC5mb3IuaW4KLQkweDA3NTA6ICAyMDNjIDU0NTQgM2UyZiA3NTczIDcyMmYgNmM2OSA2MjJmIDYzNjcgIC48VFQ+L3Vzci9saWIvY2cKLQkweDA3NjA6ICA2OTJkIDYyNjkgNmUzYyAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgIGktYmluPC9UVD4sLndoaWMKLQkweDA3NzA6ICA2ODIwIDY5NzMgMjA3NyA2ODY1IDcyNjUgMGE0NCA2NTYyIDY5NjEgIGguaXMud2hlcmUuRGViaWEKLQkweDA3ODA6ICA2ZTIwIDcwNjEgNjM2YiA2MTY3IDY1NzMgMjA3NyA2OTZjIDZjMjAgIG4ucGFja2FnZXMud2lsbC4KLQkweDA3OTA6ICA3MDZjIDYxNjMgNjUyMCA3NDY4IDY1NjkgNzIyMCA3MzYzIDcyNjkgIHBsYWNlLnRoZWlyLnNjcmkKLQkweDA3YTA6ICA3MDc0IDczMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgIHB0cy48L0xJPi4uPExJPi4KLQkweDA3YjA6ICA0YzZmIDY3MjAgNjY2OSA2YzY1IDczMjAgNjE3MiA2NTIwIDcwNmMgIExvZy5maWxlcy5hcmUucGwKLQkweDA3YzA6ICA2MTYzIDY1NjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgIGFjZWQuaW4uPFRUPi92YXIKLQkweDA3ZDA6ICAyZjZjIDZmNjcgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgIC9sb2cvYXBhY2hlPC9UVD4KLQkweDA3ZTA6ICAyYzIwIDYxNmUgNjQyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDcyNmYgICwuYW5kLndpbGwuYmUucm8KLQkweDA3ZjA6ICA3NDYxIDc0NjUgNjQwYSA3NzY1IDY1NmIgNmM3OSAyZTIwIDIwNTQgIHRhdGVkLndlZWtseS4uLlQKLQkweDA4MDA6ICA2ODY1IDIwNjYgNzI2NSA3MTc1IDY1NmUgNjM3OSAyMDZmIDY2MjAgIGhlLmZyZXF1ZW5jeS5vZi4KLQkweDA4MTA6ICA3MjZmIDc0NjEgNzQ2OSA2ZjZlIDIwNjMgNjE2ZSAyMDYyIDY1MjAgIHJvdGF0aW9uLmNhbi5iZS4KLQkweDA4MjA6ICA2NTYxIDczNjkgNmM3OSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjIgIGVhc2lseS5jaGFuZ2VkLmIKLQkweDA4MzA6ICA3OTIwIDY1NjQgNjk3NCA2OTZlIDY3MGEgM2M1NCA1NDNlIDJmNjUgIHkuZWRpdGluZy48VFQ+L2UKLQkweDA4NDA6ICA3NDYzIDJmNmMgNmY2NyA3MjZmIDc0NjEgNzQ2NSAyZTY0IDJmNjEgIHRjL2xvZ3JvdGF0ZS5kL2EKLQkweDA4NTA6ICA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgIHBhY2hlPC9UVD4uPC9MST4KLQkweDA4NjA6ICAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjA2NCA2NTY2IDYxNzUgIC4uPExJPi5UaGUuZGVmYXUKLQkweDA4NzA6ICA2Yzc0IDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDY5IDZlNjQgIGx0LmRpcmVjdG9yeS5pbmQKLQkweDA4ODA6ICA2NTc4IDIwNjkgNzMyMCAzYzU0IDU0M2UgNjk2ZSA2NDY1IDc4MmUgIGV4LmlzLjxUVD5pbmRleC4KLQkweDA4OTA6ICA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMmMgMjA2ZCA2NTYxIDZlNjkgIGh0bWw8L1RUPiwubWVhbmkKLQkweDA4YTA6ICA2ZTY3IDIwNzQgNjg2MSA3NDIwIDcyNjUgNzE3NSA2NTczIDc0NzMgIG5nLnRoYXQucmVxdWVzdHMKLQkweDA4YjA6ICAwYTY2IDZmNzIgMjA2MSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgIC5mb3IuYS5kaXJlY3RvcnkKLQkweDA4YzA6ICAyMDNjIDU0NTQgM2UyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDNjMmYgIC48VFQ+L2Zvby9iYXIvPC8KLQkweDA4ZDA6ICA1NDU0IDNlMjAgNzc2OSA2YzZjIDIwNjcgNjk3NiA2NTIwIDc0NjggIFRUPi53aWxsLmdpdmUudGgKLQkweDA4ZTA6ICA2NTIwIDYzNmYgNmU3NCA2NTZlIDc0NzMgMjA2ZiA2NjIwIDc0NjggIGUuY29udGVudHMub2YudGgKLQkweDA4ZjA6ICA2NTIwIDY2NjkgNmM2NSAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgIGUuZmlsZS48VFQ+L3Zhci8KLQkweDA5MDA6ICA3Nzc3IDc3MmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiA2OTZlIDY0NjUgIHd3dy9mb28vYmFyL2luZGUKLQkweDA5MTA6ICA3ODJlIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UwYSA2OTY2IDIwNjkgIHguaHRtbDwvVFQ+LmlmLmkKLQkweDA5MjA6ICA3NDIwIDY1NzggNjk3MyA3NDczIDIwMjggNjE3MyA3Mzc1IDZkNjkgIHQuZXhpc3RzLihhc3N1bWkKLQkweDA5MzA6ICA2ZTY3IDIwNzQgNjg2MSA3NDIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgIG5nLnRoYXQuPFRUPi92YXIKLQkweDA5NDA6ICAyZjc3IDc3NzcgM2MyZiA1NDU0IDNlMjAgNjk3MyAyMDc5IDZmNzUgIC93d3c8L1RUPi5pcy55b3UKLQkweDA5NTA6ICA3MjIwIDNjNTQgNTQzZSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDUyNmYgIHIuPFRUPkRvY3VtZW50Um8KLQkweDA5NjA6ICA2Zjc0IDNjMmYgNTQ1NCAzZTI5IDJlM2MgMmY0YyA0OTNlIDBhMGEgIG90PC9UVD4pLjwvTEk+Li4KLQkweDA5NzA6ICAzYzRjIDQ5M2UgMGE1NSA3MzY1IDcyMjAgNjQ2OSA3MjY1IDYzNzQgIDxMST4uVXNlci5kaXJlY3QKLQkweDA5ODA6ICA2ZjcyIDY5NjUgNzMyMCA2MTcyIDY1MjAgNjU2ZSA2MTYyIDZjNjUgIG9yaWVzLmFyZS5lbmFibGUKLQkweDA5OTA6ICA2NDJjIDIwNjEgNmU2NCAyMDc1IDczNjUgNzIyMCA2NDZmIDYzNzUgIGQsLmFuZC51c2VyLmRvY3UKLQkweDA5YTA6ICA2ZDY1IDZlNzQgNzMyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDZjNmYgIG1lbnRzLndpbGwuYmUubG8KLQkweDA5YjA6ICA2ZjZiIDY1NjQgMjA2NiA2ZjcyIDBhNjkgNmUyMCA3NDY4IDY1MjAgIG9rZWQuZm9yLmluLnRoZS4KLQkweDA5YzA6ICAzYzU0IDU0M2UgNzA3NSA2MjZjIDY5NjMgNWY2OCA3NDZkIDZjM2MgIDxUVD5wdWJsaWNfaHRtbDwKLQkweDA5ZDA6ICAyZjU0IDU0M2UgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNmYgIC9UVD4uZGlyZWN0b3J5Lm8KLQkweDA5ZTA6ICA2NjIwIDc0NjggNjUyMCA3NTczIDY1NzIgNzMyNyAyMDY4IDZmNmQgIGYudGhlLnVzZXJzJy5ob20KLQkweDA5ZjA6ICA2NTczIDJlMjAgMjA1NCA2ODY1IDczNjUgMjA2NCA2OTcyIDczMGEgIGVzLi4uVGhlc2UuZGlycy4KLQkweDBhMDA6ICA3MzY4IDZmNzUgNmM2NCAyMDYyIDY1MjAgNzU2ZSA2NDY1IDcyMjAgIHNob3VsZC5iZS51bmRlci4KLQkweDBhMTA6ICAzYzU0IDU0M2UgMmY2OCA2ZjZkIDY1M2MgMmY1NCA1NDNlIDJjMjAgIDxUVD4vaG9tZTwvVFQ+LC4KLQkweDBhMjA6ICA2MTZlIDY0MjAgNzU3MyA2NTcyIDczMjAgNzc2OSA2YzZjIDIwNmUgIGFuZC51c2Vycy53aWxsLm4KLQkweDBhMzA6ICA2Zjc0IDIwNjIgNjUyMCA2MTYyIDZjNjUgMjA3NCA2ZjIwIDczNzkgIG90LmJlLmFibGUudG8uc3kKLQkweDBhNDA6ICA2ZDZjIDY5NmUgNmIwYSA3NDZmIDIwNjYgNjk2YyA2NTczIDIwNzQgIG1saW5rLnRvLmZpbGVzLnQKLQkweDBhNTA6ICA2ODY1IDc5MjAgNjQ2ZiA2ZTI3IDc0MjAgNmY3NyA2ZTJlIDNjMmYgIGhleS5kb24ndC5vd24uPC8KLQkweDBhNjA6ICA0YzQ5IDNlMGEgMGEzYyAyZjU1IDRjM2UgMGE0MSA2YzZjIDIwNzQgIExJPi4uPC9VTD4uQWxsLnQKLQkweDBhNzA6ICA2ODY1IDIwNzMgNzQ2MSA2ZTY0IDYxNzIgNjQyMCA2MTcwIDYxNjMgIGhlLnN0YW5kYXJkLmFwYWMKLQkweDBhODA6ICA2ODY1IDIwNmQgNmY2NCA3NTZjIDY1NzMgMjA2MSA3MjY1IDIwNjEgIGhlLm1vZHVsZXMuYXJlLmEKLQkweDBhOTA6ICA3NjYxIDY5NmMgNjE2MiA2YzY1IDIwNzcgNjk3NCA2ODIwIDc0NjggIHZhaWxhYmxlLndpdGgudGgKLQkweDBhYTA6ICA2OTczIDIwNzIgNjU2YyA2NTYxIDczNjUgMjA2MSA2ZTY0IDIwNjEgIGlzLnJlbGVhc2UuYW5kLmEKLQkweDBhYjA6ICA3MjY1IDBhNmUgNmY3NyAyMDZkIDYxNmUgNjE2NyA2NTY0IDIwNzcgIHJlLm5vdy5tYW5hZ2VkLncKLQkweDBhYzA6ICA2OTc0IDY4MjAgNjQ2NSA2MjYzIDZmNmUgNjYyZSAyMDIwIDU0NzkgIGl0aC5kZWJjb25mLi4uVHkKLQkweDBhZDA6ICA3MDY1IDIwM2MgNTQ1NCAzZTY0IDcwNmIgNjcyZCA3MjY1IDYzNmYgIHBlLjxUVD5kcGtnLXJlY28KLQkweDBhZTA6ICA2ZTY2IDY5NjcgNzU3MiA2NTIwIDYxNzAgNjE2MyA2ODY1IDNjMmYgIG5maWd1cmUuYXBhY2hlPC8KLQkweDBhZjA6ICA1NDU0IDNlMjAgNzQ2ZiAwYTczIDY1NmMgNjU2MyA3NDIwIDc3NjggIFRUPi50by5zZWxlY3Qud2gKLQkweDBiMDA6ICA2OTYzIDY4MjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCA3OTZmIDc1MjAgIGljaC5tb2R1bGVzLnlvdS4KLQkweDBiMTA6ICA3NzYxIDZlNzQgMjA2NSA2ZTYxIDYyNmMgNjU2NCAyZTIwIDIwNGQgIHdhbnQuZW5hYmxlZC4uLk0KLQkweDBiMjA6ICA2MTZlIDc5MjAgNmY3NCA2ODY1IDcyMjAgNmQ2ZiA2NDc1IDZjNjUgIGFueS5vdGhlci5tb2R1bGUKLQkweDBiMzA6ICA3MzIwIDYxNzIgNjUyMCA2MTc2IDYxNjkgNmM2MSA2MjZjIDY1MGEgIHMuYXJlLmF2YWlsYWJsZS4KLQkweDBiNDA6ICA3NDY4IDcyNmYgNzU2NyA2ODIwIDc0NjggNjUyMCA0NDY1IDYyNjkgIHRocm91Z2gudGhlLkRlYmkKLQkweDBiNTA6ICA2MTZlIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3MyA3OTczIDc0NjUgIGFuLnBhY2thZ2Uuc3lzdGUKLQkweDBiNjA6ICA2ZDIwIDc3NjkgNzQ2OCAyMDc0IDY4NjUgMjA2ZSA2MTZkIDY1NzMgIG0ud2l0aC50aGUubmFtZXMKLQkweDBiNzA6ICAyMDNjIDU0NTQgM2U2YyA2OTYyIDYxNzAgNjE2MyA2ODY1IDJkNmQgIC48VFQ+bGliYXBhY2hlLW0KLQkweDBiODA6ICA2ZjY0IDJkMmEgM2MyZiA1NDU0IDNlMmUgMGE0OSA2NjIwIDc5NmYgIG9kLSo8L1RUPi4uSWYueW8KLQkweDBiOTA6ICA3NTIwIDZlNjUgNjU2NCAyMDc0IDZmMjAgNjM2ZiA2ZDcwIDY5NmMgIHUubmVlZC50by5jb21waWwKLQkweDBiYTA6ICA2NTIwIDYxMjAgNmQ2ZiA2NDc1IDZjNjUgMjA3OSA2Zjc1IDcyNzMgIGUuYS5tb2R1bGUueW91cnMKLQkweDBiYjA6ICA2NTZjIDY2MmMgMjA3OSA2Zjc1IDIwNzcgNjk2YyA2YzIwIDZlNjUgIGVsZiwueW91LndpbGwubmUKLQkweDBiYzA6ICA2NTY0IDIwNzQgNmYyMCA2OTZlIDczNzQgNjE2YyA2YzIwIDc0NjggIGVkLnRvLmluc3RhbGwudGgKLQkweDBiZDA6ICA2NTBhIDNjNTQgNTQzZSA2MTcwIDYxNjMgNjg2NSAyZDY0IDY1NzYgIGUuPFRUPmFwYWNoZS1kZXYKLQkweDBiZTA6ICAzYzJmIDU0NTQgM2UyMCA3MDYxIDYzNmIgNjE2NyA2NTJlIDBhMGEgIDwvVFQ+LnBhY2thZ2UuLi4KLQkweDBiZjA6ICAzYzUwIDNlNGQgNmY3MiA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgIDxQPk1vcmUuZG9jdW1lbnQKLQkweDBjMDA6ICA2MTc0IDY5NmYgNmUyMCA2ZjZlIDIwNDEgNzA2MSA2MzY4IDY1MjAgIGF0aW9uLm9uLkFwYWNoZS4KLQkweDBjMTA6ICA2MzYxIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDZmIDZlM2EgIGNhbi5iZS5mb3VuZC5vbjoKLQkweDBjMjA6ICAwYTNjIDU1NGMgM2UwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgIC48VUw+LjxMST4uVGhlLjwKLQkweDBjMzA6ICA0MTIwIDQ4NTIgNDU0NiAzZDIyIDJmNjQgNmY2MyAyZjYxIDcwNjEgIEEuSFJFRj0iL2RvYy9hcGEKLQkweDBjNDA6ICA2MzY4IDY1MmQgNjQ2ZiA2MzJmIDZkNjEgNmU3NSA2MTZjIDJmMjIgIGNoZS1kb2MvbWFudWFsLyIKLQkweDBjNTA6ICAzZTQxIDcwNjEgNjM2OCA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgID5BcGFjaGUuZG9jdW1lbnQKLQkweDBjNjA6ICA2MTc0IDY5NmYgNmUzYyAyZjQxIDNlMjAgNzM3NCA2ZjcyIDY1NjQgIGF0aW9uPC9BPi5zdG9yZWQKLQkweDBjNzA6ICAyMDZmIDZlMjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMmUgIC5vbi55b3VyLnNlcnZlci4KLQkweDBjODA6ICAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgIDwvTEk+Li48TEk+LlRoZS4KLQkweDBjOTA6ICAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgIDxBLkhSRUY9Imh0dHA6Ly8KLQkweDBjYTA6ICA3Nzc3IDc3MmUgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgIHd3dy5hcGFjaGUub3JnLyIKLQkweDBjYjA6ICAzZTQxIDcwNjEgNjM2OCA2NTIwIDUwNzIgNmY2YSA2NTYzIDc0M2MgID5BcGFjaGUuUHJvamVjdDwKLQkweDBjYzA6ICAyZjQxIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgIC9BPi5ob21lLnNpdGUuPC8KLQkweDBjZDA6ICA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgIExJPi4uPExJPi5UaGUuPEEKLQkweDBjZTA6ICAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgIC5IUkVGPSJodHRwOi8vd3cKLQkweDBjZjA6ICA3NzJlIDYxNzAgNjE2MyA2ODY1IDJkNzMgNzM2YyAyZTZmIDcyNjcgIHcuYXBhY2hlLXNzbC5vcmcKLQkweDBkMDA6ICAyZjIyIDNlNDEgNzA2MSA2MzY4IDY1MmQgNTM1MyA0YzNjIDJmNDEgIC8iPkFwYWNoZS1TU0w8L0EKLQkweDBkMTA6ICAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkgID4uaG9tZS5zaXRlLjwvTEkKLQkweDBkMjA6ICAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDggID4uLjxMST4uVGhlLjxBLkgKLQkweDBkMzA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3MDY1IDcyNmMgIFJFRj0iaHR0cDovL3BlcmwKLQkweDBkNDA6ICAyZTYxIDcwNjEgNjM2OCA2NTJlIDZmNzIgNjcyZiAyMjNlIDZkNmYgIC5hcGFjaGUub3JnLyI+bW8KLQkweDBkNTA6ICA2NDIwIDcwNjUgNzI2YyAzYzJmIDQxM2UgMjA2OCA2ZjZkIDY1MjAgIGQucGVybDwvQT4uaG9tZS4KLQkweDBkNjA6ICA3MzY5IDc0NjUgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgIHNpdGUuPC9MST4uLjxMST4KLQkweDBkNzA6ICAwYTU0IDY4NjUgMjAzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgIC5UaGUuPEEuSFJFRj0iaHQKLQkweDBkODA6ICA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjEgNzA2MSA2MzY4IDY1NzcgIHRwOi8vd3d3LmFwYWNoZXcKLQkweDBkOTA6ICA2NTY1IDZiMmUgNjM2ZiA2ZDJmIDIyM2UgNDE3MCA2MTYzIDY4NjUgIGVlay5jb20vIj5BcGFjaGUKLQkweDBkYTA6ICA1NzY1IDY1NmIgM2MyZiA0MTNlIDIwNmUgNjU3NyA3MzZjIDY1NzQgIFdlZWs8L0E+Lm5ld3NsZXQKLQkweDBkYjA6ICA3NDY1IDcyMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgIHRlci48L0xJPi4uPExJPi4KLQkweDBkYzA6ICA1NDY4IDY1MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgIFRoZS48QS5IUkVGPSJodHQKLQkweDBkZDA6ICA3MDNhIDJmMmYgNzc3NyA3NzJlIDY0NjUgNjI2OSA2MTZlIDJlNmYgIHA6Ly93d3cuZGViaWFuLm8KLQkweDBkZTA6ICA3MjY3IDJmNjQgNmY2MyAyZjIyIDNlNDQgNjU2MiA2OTYxIDZlMjAgIHJnL2RvYy8iPkRlYmlhbi4KLQkweDBkZjA6ICA1MDcyIDZmNmEgNjU2MyA3NDBhIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgIFByb2plY3QuRG9jdW1lbnQKLQkweDBlMDA6ICA2MTc0IDY5NmYgNmUzYyAyZjQxIDNlMjAgNzc2OCA2OTYzIDY4MjAgIGF0aW9uPC9BPi53aGljaC4KLQkweDBlMTA6ICA2MzZmIDZlNzQgNjE2OSA2ZTczIDIwNDggNGY1NyA1NDRmIDczMmMgIGNvbnRhaW5zLkhPV1RPcywKLQkweDBlMjA6ICAyMDQ2IDQxNTEgNzMyYyAyMDYxIDZlNjQgMjA3MyA2ZjY2IDc0NzcgIC5GQVFzLC5hbmQuc29mdHcKLQkweDBlMzA6ICA2MTcyIDY1MjAgNzU3MCA2NDYxIDc0NjUgNzMyZSAzYzJmIDRjNDkgIGFyZS51cGRhdGVzLjwvTEkKLQkweDBlNDA6ICAzZTBhIDNjMmYgNTU0YyAzZTBhIDBhM2MgNTAzZSA1OTZmIDc1MjAgID4uPC9VTD4uLjxQPllvdS4KLQkweDBlNTA6ICA2MzYxIDZlMjAgNjE2YyA3MzZmIDIwNjMgNmY2ZSA3Mzc1IDZjNzQgIGNhbi5hbHNvLmNvbnN1bHQKLQkweDBlNjA6ICAyMDc0IDY4NjUgMjA2YyA2OTczIDc0MjAgNmY2NiAyMDNjIDQxMjAgIC50aGUubGlzdC5vZi48QS4KLQkweDBlNzA6ICA0ODUyIDQ1NDYgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgIEhSRUY9Imh0dHA6Ly93d3cKLQkweDBlODA6ICAyZTYyIDZmNzUgNzQ2NSA2YzZjIDJlNjMgNmY2ZCAyZjY2IDYxNzEgIC5ib3V0ZWxsLmNvbS9mYXEKLQkweDBlOTA6ICAyZjIyIDNlNTcgNmY3MiA2YzY0IDBhNTcgNjk2NCA2NTIwIDU3NjUgIC8iPldvcmxkLldpZGUuV2UKLQkweDBlYTA6ICA2MjIwIDQ2NzIgNjU3MSA3NTY1IDZlNzQgNmM3OSAyMDQxIDczNmIgIGIuRnJlcXVlbnRseS5Bc2sKLQkweDBlYjA6ICA2NTY0IDIwNTEgNzU2NSA3Mzc0IDY5NmYgNmU3MyAzYzJmIDQxM2UgIGVkLlF1ZXN0aW9uczwvQT4KLQkweDBlYzA6ICAyMDY2IDZmNzIgMjA2OSA2ZTY2IDZmNzIgNmQ2MSA3NDY5IDZmNmUgIC5mb3IuaW5mb3JtYXRpb24KLQkweDBlZDA6ICAyZTBhIDBhM2MgNDgzMiAzZTRjIDY1NzQgMjA2ZiA3NDY4IDY1NzIgIC4uLjxIMj5MZXQub3RoZXIKLQkweDBlZTA6ICAyMDcwIDY1NmYgNzA2YyA2NTIwIDZiNmUgNmY3NyAyMDYxIDYyNmYgIC5wZW9wbGUua25vdy5hYm8KLQkweDBlZjA6ICA3NTc0IDIwNzQgNjg2OSA3MzIwIDczNjUgNzI3NiA2NTcyIDNjMmYgIHV0LnRoaXMuc2VydmVyPC8KLQkweDBmMDA6ICA0ODMyIDNlMGEgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgIEgyPi4uPEEuSFJFRj0iaHQKLQkweDBmMTA6ICA3NDcwIDNhMmYgMmY2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgIHRwOi8vbmV0Y3JhZnQuY28KLQkweDBmMjA6ICA2ZDJmIDIyM2UgNGU2NSA3NDYzIDcyNjEgNjY3NCAzYzJmIDQxM2UgIG0vIj5OZXRjcmFmdDwvQT4KLQkweDBmMzA6ICAyMDcwIDcyNmYgNzY2OSA2NDY1IDczMjAgNjE2ZSAyMDY5IDZlNzQgIC5wcm92aWRlcy5hbi5pbnQKLQkweDBmNDA6ICA2NTcyIDY1NzMgNzQ2OSA2ZTY3IDIwNjYgNzI2NSA2NTBhIDczNjUgIGVyZXN0aW5nLmZyZWUuc2UKLQkweDBmNTA6ICA3Mjc2IDY5NjMgNjUyMCA2NjZmIDcyMjAgNzc2NSA2MjIwIDczNjkgIHJ2aWNlLmZvci53ZWIuc2kKLQkweDBmNjA6ICA3NDY1IDIwNmQgNmY2ZSA2OTc0IDZmNzIgNjk2ZSA2NzIwIDYxNmUgIHRlLm1vbml0b3JpbmcuYW4KLQkweDBmNzA6ICA2NDIwIDczNzQgNjE3NCA2OTczIDc0NjkgNjMyMCA2MzZmIDZjNmMgIGQuc3RhdGlzdGljLmNvbGwKLQkweDBmODA6ICA2NTYzIDc0NjkgNmY2ZSAyZTBhIDU5NmYgNzUyMCA2MzYxIDZlMjAgIGVjdGlvbi4uWW91LmNhbi4KLQkweDBmOTA6ICA2YzY1IDc0MjAgNzQ2OCA2NTZkIDIwNmIgNmU2ZiA3NzIwIDYxNjIgIGxldC50aGVtLmtub3cuYWIKLQkweDBmYTA6ICA2Zjc1IDc0MjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMjAgIG91dC55b3VyLnNlcnZlci4KLQkweDBmYjA6ICA3NTczIDY5NmUgNjcyMCA3NDY4IDY1NjkgNzIwYSAzYzQxIDIwNDggIHVzaW5nLnRoZWlyLjxBLkgKLQkweDBmYzA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3NTcwIDc0NjkgIFJFRj0iaHR0cDovL3VwdGkKLQkweDBmZDA6ICA2ZDY1IDJlNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYgIG1lLm5ldGNyYWZ0LmNvbS8KLQkweDBmZTA6ICAyMjNlIDY5NmUgNzQ2NSA3MjY2IDYxNjMgNjUzYyAyZjQxIDNlMmUgICI+aW50ZXJmYWNlPC9BPi4KLQkweDBmZjA6ICAwYTQ1IDZlNjEgNjI2YyA2OTZlIDY3MjAgNzQ2OCA2NTIwIDZkNmYgIC5FbmFibGluZy50aGUubW8KLQkweDEwMDA6ICA2ZTY5IDc0NmYgNzI2OSA2ZTY3IDIwNmYgNjYyMCA3OTZmIDc1NzIgIG5pdG9yaW5nLm9mLnlvdXIKLQkweDEwMTA6ICAyMDczIDY1NzIgNzY2NSA3MjIwIDc3NjkgNmM2YyAyMDcwIDcyNmYgIC5zZXJ2ZXIud2lsbC5wcm8KLQkweDEwMjA6ICA3NjY5IDY0NjUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjIwIDY3NmMgIHZpZGUuYS5iZXR0ZXIuZ2wKLQkweDEwMzA6ICA2ZjYyIDYxNmMgMjA2ZiA3NjY1IDcyNzYgNjk2NSA3NzBhIDZmNjYgIG9iYWwub3ZlcnZpZXcub2YKLQkweDEwNDA6ICAyMDc3IDY4NmYgMjA2OSA3MzIwIDc1NzMgNjk2ZSA2NzIwIDc3NjggIC53aG8uaXMudXNpbmcud2gKLQkweDEwNTA6ICA2MTc0IDIwNjEgNmU2NCAyMDc3IDY4NjUgNzI2NSAyYzIwIDYxNmUgIGF0LmFuZC53aGVyZSwuYW4KLQkweDEwNjA6ICA2NDIwIDY5NzQgMjA3NyA2Zjc1IDZjNjQgMjA2NyA2OTc2IDY1MjAgIGQuaXQud291bGQuZ2l2ZS4KLQkweDEwNzA6ICA0NDY1IDYyNjkgNjE2ZSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMGEgIERlYmlhbi5hLmJldHRlci4KLQkweDEwODA6ICA2Zjc2IDY1NzIgNzY2OSA2NTc3IDIwNmYgNjYyMCA3NDY4IDY1MjAgIG92ZXJ2aWV3Lm9mLnRoZS4KLQkweDEwOTA6ICA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzUgIGFwYWNoZS5wYWNrYWdlLnUKLQkweDEwYTA6ICA3MzYxIDY3NjUgMmUwYSAwYTNjIDQ4MzIgM2U0MSA2MjZmIDc1NzQgIHNhZ2UuLi48SDI+QWJvdXQKLQkweDEwYjA6ICAyMDc0IDY4NjkgNzMyMCA3MDYxIDY3NjUgM2MyZiA0ODMyIDNlMGEgIC50aGlzLnBhZ2U8L0gyPi4KLQkweDEwYzA6ICAwYTNjIDQ5NGQgNDcyMCA0MTRjIDQ5NDcgNGUzZCAyMjcyIDY5NjcgIC48SU1HLkFMSUdOPSJyaWcKLQkweDEwZDA6ICA2ODc0IDIyMjAgNDE0YyA1NDNkIDIyMjIgMjA0OCA0NTQ5IDQ3NDggIGh0Ii5BTFQ9IiIuSEVJR0gKLQkweDEwZTA6ICA1NDNkIDIyMzIgMzQzNyAyMjIwIDU3NDkgNDQ1NCA0ODNkIDIyMzIgIFQ9IjI0NyIuV0lEVEg9IjIKLQkweDEwZjA6ICAzNzM4IDIyMjAgNTM1MiA0MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNmEgIDc4Ii5TUkM9Imljb25zL2oKLQkweDExMDA6ICA2ODY1IDMwMzYgMzEyZSA3MDZlIDY3MjIgM2UwYSAwYTNjIDUwM2UgIGhlMDYxLnBuZyI+Li48UD4KLQkweDExMTA6ICA1NDY4IDY5NzMgMjA2OSA3MzIwIDYxMjAgNzA2YyA2MTYzIDY1NjggIFRoaXMuaXMuYS5wbGFjZWgKLQkweDExMjA6ICA2ZjZjIDY0NjUgNzIyMCA3MDYxIDY3NjUgMjA2OSA2ZTczIDc0NjEgIG9sZGVyLnBhZ2UuaW5zdGEKLQkweDExMzA6ICA2YzZjIDY1NjQgMjA2MiA3OTIwIDc0NjggNjUyMCAzYzQxIDBhNDggIGxsZWQuYnkudGhlLjxBLkgKLQkweDExNDA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgIFJFRj0iaHR0cDovL3d3dy4KLQkweDExNTA6ICA2NDY1IDYyNjkgNjE2ZSAyZTZmIDcyNjcgMmYyMiAzZTQ0IDY1NjIgIGRlYmlhbi5vcmcvIj5EZWIKLQkweDExNjA6ICA2OTYxIDZlM2MgMmY0MSAzZTBhIDcyNjUgNmM2NSA2MTczIDY1MjAgIGlhbjwvQT4ucmVsZWFzZS4KLQkweDExNzA6ICA2ZjY2IDIwNzQgNjg2NSAyMDYxIDcwNjEgNjM2OCA2NTIwIDU3NjUgIG9mLnRoZS5hcGFjaGUuV2UKLQkweDExODA6ICA2MjIwIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgIGIuc2VydmVyLnBhY2thZ2UKLQkweDExOTA6ICAyZTBhIDBhM2MgNTAzZSA1NDY4IDY5NzMgMjA2MyA2ZjZkIDcwNzUgIC4uLjxQPlRoaXMuY29tcHUKLQkweDExYTA6ICA3NDY1IDcyMjAgNjg2MSA3MzIwIDY5NmUgNzM3NCA2MTZjIDZjNjUgIHRlci5oYXMuaW5zdGFsbGUKLQkweDExYjA6ICA2NDIwIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAyMDQ3IDRlNTUgIGQudGhlLkRlYmlhbi5HTlUKLQkweDExYzA6ICAyZjRjIDY5NmUgNzU3OCAyMDZmIDcwNjUgNzI2MSA3NDY5IDZlNjcgIC9MaW51eC5vcGVyYXRpbmcKLQkweDExZDA6ICAyMDczIDc5NzMgNzQ2NSA2ZDJjIDBhNjIgNzU3NCAyMDY5IDc0MjAgIC5zeXN0ZW0sLmJ1dC5pdC4KLQkweDExZTA6ICA2ODYxIDczMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0NjggIGhhcy48c3Ryb25nPm5vdGgKLQkweDExZjA6ICA2OTZlIDY3MjAgNzQ2ZiAyMDY0IDZmMjAgNzc2OSA3NDY4IDIwNzQgIGluZy50by5kby53aXRoLnQKLQkweDEyMDA6ICA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhIDY1NjMgIGhlLkRlYmlhbi5Qcm9qZWMKLQkweDEyMTA6ICA3NDNjIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMmUyMCA1MDZjIDY1NjEgIHQ8L3N0cm9uZz4uLlBsZWEKLQkweDEyMjA6ICA3MzY1IDIwNjQgNmYyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgIHNlLmRvLjxzdHJvbmc+bm8KLQkweDEyMzA6ICA3NDNjIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMjA2MyA2ZjZlIDc0NjEgIHQ8L3N0cm9uZz4uY29udGEKLQkweDEyNDA6ICA2Mzc0IDIwNzQgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgIGN0LnRoZS5EZWJpYW4uUHIKLQkweDEyNTA6ICA2ZjZhIDY1NjMgNzQyMCA2MTYyIDZmNzUgNzQyMCA2OTc0IDJlM2MgIG9qZWN0LmFib3V0Lml0LjwKLQkweDEyNjA6ICAyZjUwIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNjYgIC9QPi4uPFA+SWYueW91LmYKLQkweDEyNzA6ICA2OTZlIDY0MjAgNjEyMCA2Mjc1IDY3MjAgNjk2ZSAyMDc0IDY4NjkgIGluZC5hLmJ1Zy5pbi50aGkKLQkweDEyODA6ICA3MzIwIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgIHMuYXBhY2hlLnBhY2thZ2UKLQkweDEyOTA6ICAyYzIwIDZmNzIgMjA2OSA2ZTIwIDQxNzAgNjE2MyA2ODY1IDIwNjkgICwub3IuaW4uQXBhY2hlLmkKLQkweDEyYTA6ICA3NDczIDY1NmMgNjYyYyAwYTcwIDZjNjUgNjE3MyA2NTIwIDY2NjkgIHRzZWxmLC5wbGVhc2UuZmkKLQkweDEyYjA6ICA2YzY1IDIwNjEgMjA2MiA3NTY3IDIwNzIgNjU3MCA2ZjcyIDc0MjAgIGxlLmEuYnVnLnJlcG9ydC4KLQkweDEyYzA6ICA2ZjZlIDIwNjkgNzQyZSAyMDIwIDQ5NmUgNzM3NCA3Mjc1IDYzNzQgIG9uLml0Li4uSW5zdHJ1Y3QKLQkweDEyZDA6ICA2OTZmIDZlNzMgMjA2ZiA2ZTIwIDY0NmYgNjk2ZSA2NzIwIDc0NjggIGlvbnMub24uZG9pbmcudGgKLQkweDEyZTA6ICA2OTczIDJjMjAgNjE2ZSA2NDIwIDc0NjggNjUwYSA2YzY5IDczNzQgIGlzLC5hbmQudGhlLmxpc3QKLQkweDEyZjA6ICAyMDZmIDY2MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgIC5vZi48QS5IUkVGPSJodHQKLQkweDEzMDA6ICA3MDNhIDJmMmYgNjI3NSA2NzczIDJlNjQgNjU2MiA2OTYxIDZlMmUgIHA6Ly9idWdzLmRlYmlhbi4KLQkweDEzMTA6ICA2ZjcyIDY3MmYgNzM3MiA2MzNhIDYxNzAgNjE2MyA2ODY1IDIyM2UgIG9yZy9zcmM6YXBhY2hlIj4KLQkweDEzMjA6ICA2YjZlIDZmNzcgNmUyMCA2Mjc1IDY3NzMgM2MyZiA0MTNlIDIwNmYgIGtub3duLmJ1Z3M8L0E+Lm8KLQkweDEzMzA6ICA2NjIwIDc0NjggNjk3MyAwYTcwIDYxNjMgNmI2MSA2NzY1IDJjMjAgIGYudGhpcy5wYWNrYWdlLC4KLQkweDEzNDA6ICA2MzYxIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgIGNhbi5iZS5mb3VuZC5pbi4KLQkweDEzNTA6ICA3NDY4IDY1MjAgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgIHRoZS4uPEEuSFJFRj0iaHQKLQkweDEzNjA6ICA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxIDZlMmUgIHRwOi8vd3d3LmRlYmlhbi4KLQkweDEzNzA6ICA2ZjcyIDY3MmYgNDI3NSA2NzczIDJmNTIgNjU3MCA2ZjcyIDc0NjkgIG9yZy9CdWdzL1JlcG9ydGkKLQkweDEzODA6ICA2ZTY3IDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjA0MiA3NTY3IDIwNTQgIG5nIj5EZWJpYW4uQnVnLlQKLQkweDEzOTA6ICA3MjYxIDYzNmIgNjk2ZSA2NzIwIDUzNzkgNzM3NCA2NTZkIDNjMmYgIHJhY2tpbmcuU3lzdGVtPC8KLQkweDEzYTA6ICA0MTNlIDJlMGEgMGEzYyA1MDNlIDU0NjggNjE2ZSA2YjczIDIwNjYgIEE+Li4uPFA+VGhhbmtzLmYKLQkweDEzYjA6ICA2ZjcyIDIwNzUgNzM2OSA2ZTY3IDIwNzQgNjg2OSA3MzIwIDcwNjEgIG9yLnVzaW5nLnRoaXMucGEKLQkweDEzYzA6ICA2MzZiIDYxNjcgNjUyYyAyMDYxIDZlNjQgMjA2MyA2ZjZlIDY3NzIgIGNrYWdlLC5hbmQuY29uZ3IKLQkweDEzZDA6ICA2MTc0IDc1NmMgNjE3NCA2OTZmIDZlNzMgMjA2NiA2ZjcyIDIwNzkgIGF0dWxhdGlvbnMuZm9yLnkKLQkweDEzZTA6ICA2Zjc1IDcyMjAgNjM2OCA2ZjY5IDYzNjUgMjA2ZiA2NjBhIDYxMjAgIG91ci5jaG9pY2Uub2YuYS4KLQkweDEzZjA6ICA0NDY1IDYyNjkgNjE2ZSAyMDczIDc5NzMgNzQ2NSA2ZDIxIDNjMmYgIERlYmlhbi5zeXN0ZW0hPC8KLQkweDE0MDA6ICA1MDNlIDBhMGEgM2M0NCA0OTU2IDIwNjEgNmM2OSA2NzZlIDNkMjIgIFA+Li48RElWLmFsaWduPSIKLQkweDE0MTA6ICA2MzY1IDZlNzQgNjU3MiAyMjNlIDBhM2MgNjEyMCA2ODcyIDY1NjYgIGNlbnRlciI+LjxhLmhyZWYKLQkweDE0MjA6ICAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgID0iaHR0cDovL3d3dy5kZWIKLQkweDE0MzA6ICA2OTYxIDZlMmUgNmY3MiA2NzJmIDIyM2UgMGEzYyA0OTRkIDQ3MjAgIGlhbi5vcmcvIj4uPElNRy4KLQkweDE0NDA6ICA2MTZjIDY5NjcgNmUzZCAyMjZkIDY5NjQgNjQ2YyA2NTIyIDIwNjggIGFsaWduPSJtaWRkbGUiLmgKLQkweDE0NTA6ICA2NTY5IDY3NjggNzQzZCAyMjMzIDMwMjIgMjA3NyA2OTY0IDc0NjggIGVpZ2h0PSIzMCIud2lkdGgKLQkweDE0NjA6ICAzZDIyIDMyMzUgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmIDZlNzMgID0iMjUiLnNyYz0iaWNvbnMKLQkweDE0NzA6ICAyZjY0IDY1NjIgNjk2MSA2ZTJmIDZmNzAgNjU2ZSA2YzZmIDY3NmYgIC9kZWJpYW4vb3BlbmxvZ28KLQkweDE0ODA6ICAyZDMyIDM1MmUgNmE3MCA2NzIyIDIwNjEgNmM3NCAzZDIyIDQ0NjUgIC0yNS5qcGciLmFsdD0iRGUKLQkweDE0OTA6ICA2MjY5IDYxNmUgMjIzZSAwYTNjIDJmNjEgM2UwYSAzYzYxIDIwNjggIGJpYW4iPi48L2E+LjxhLmgKLQkweDE0YTA6ICA3MjY1IDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgIHJlZj0iaHR0cDovL3d3dy4KLQkweDE0YjA6ICA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTBhIDNjNDkgIGFwYWNoZS5vcmcvIj4uPEkKLQkweDE0YzA6ICA0ZDQ3IDIwNjEgNmM2OSA2NzZlIDNkMjIgNmQ2OSA2NDY0IDZjNjUgIE1HLmFsaWduPSJtaWRkbGUKLQkweDE0ZDA6ICAyMjIwIDY4NjUgNjk2NyA2ODc0IDNkMjIgMzMzMiAyMjIwIDc3NjkgICIuaGVpZ2h0PSIzMiIud2kKLQkweDE0ZTA6ICA2NDc0IDY4M2QgMjIzMiAzNTM5IDIyMjAgNzM3MiA2MzNkIDIyNjkgIGR0aD0iMjU5Ii5zcmM9ImkKLQkweDE0ZjA6ICA2MzZmIDZlNzMgMmY2MSA3MDYxIDYzNjggNjU1ZiA3MDYyIDJlNzAgIGNvbnMvYXBhY2hlX3BiLnAKLQkweDE1MDA6ICA2ZTY3IDIyMjAgNjE2YyA3NDNkIDIyNDEgNzA2MSA2MzY4IDY1MjIgIG5nIi5hbHQ9IkFwYWNoZSIKLQkweDE1MTA6ICAzZTBhIDNjMmYgNjEzZSAwYTNjIDJmNDQgNDk1NiAzZTBhIDBhM2MgID4uPC9hPi48L0RJVj4uLjwKLQkweDE1MjA6ICAyMTJkIDJkMGEgMjAyMCA1NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgICEtLS4uLlRoaXMucGFnZS4KLQkweDE1MzA6ICA3NzYxIDczMjAgNjk2ZSA2OTc0IDY5NjEgNmM2YyA3OTIwIDYzNzIgIHdhcy5pbml0aWFsbHkuY3IKLQkweDE1NDA6ICA2NTYxIDc0NjUgNjQyMCA2Mjc5IDIwNGEgNmY2OCA2ZTY5IDY1MjAgIGVhdGVkLmJ5LkpvaG5pZS4KLQkweDE1NTA6ICA0OTZlIDY3NzIgNjE2ZCAyMDI4IDY4NzQgNzQ3MCAzYTJmIDJmNmUgIEluZ3JhbS4oaHR0cDovL24KLQkweDE1NjA6ICA2NTc0IDY3NmYgNjQyZSA2ZTY1IDc0MmYgMjkwYSAyMDIwIDQ5NzQgIGV0Z29kLm5ldC8pLi4uSXQKLQkweDE1NzA6ICAyMDc3IDYxNzMgMjA2YyA2MTc0IDY1NzIgMjA2NSA2NDY5IDc0NjUgIC53YXMubGF0ZXIuZWRpdGUKLQkweDE1ODA6ICA2NDIwIDYyNzkgMjA0ZCA2MTc0IDc0NjggNjU3NyAyMDU3IDY5NmMgIGQuYnkuTWF0dGhldy5XaWwKLQkweDE1OTA6ICA2MzZmIDc4MjAgNjE2ZSA2NDIwIDRhNmYgNzM2OSA3MDIwIDUyNmYgIGNveC5hbmQuSm9zaXAuUm8KLQkweDE1YTA6ICA2NDY5IDZlMmUgMGEyMCAyMDRjIDYxNzMgNzQyMCA2ZDZmIDY0NjkgIGRpbi4uLi5MYXN0Lm1vZGkKLQkweDE1YjA6ICA2NjY5IDY1NjQgM2EyMCAyNDQ0IDYxNzQgNjUzYSAyMDMyIDMwMzAgIGZpZWQ6LiREYXRlOi4yMDAKLQkweDE1YzA6ICAzNDJmIDMwMzYgMmYzMiAzMDIwIDMxMzUgM2EzMyAzMzNhIDM1MzcgIDQvMDYvMjAuMTU6MzM6NTcKLQkweDE1ZDA6ICAyMDI0IDJlMGEgMjAyMCAyZDJkIDNlMGEgMGEzYyAyZjQyIDRmNDQgIC4kLi4uLi0tPi4uPC9CT0QKLQkweDE1ZTA6ICA1OTNlIDBhM2MgMmY0OCA1NDRkIDRjM2UgMGEgICAgICAgICAgICAgIFk+LjwvSFRNTD4uCi0yMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZlIDQwMDAgNDAwNiAyMTU0IDdmMDAgMDAwMSAgRS4uNC5uQC5ALiFULi4uLgotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSAgLi4uLi5wLlA3WC5JN3ouLgotCTB4MDAyMDogIDgwMTAgMzA1ZiAxMGVhIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSAgLi4wXy4uLi4uLi4uTS4uLgotCTB4MDAzMDogIDRkZGMgOTIxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uLgotMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSAgRS4uNC5wQC5ALiFSLi4uLgotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSAgLi4uLi5wLlA3WC5JN3ouLgotCTB4MDAyMDogIDgwMTEgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMSAgLi4wXy4uLi4uLi4uTS4uIQotCTB4MDAzMDogIDRkZGMgOTIxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uLgotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxZmU4IDQwMDAgNDAwNiAxY2RhIDdmMDAgMDAwMSAgRS4uNC4uQC5ALi4uLi4uLgotCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSBhM2E5IDM3NTggOGE0YSAgLi4uLi5QLnA3ei4uN1guSgotCTB4MDAyMDogIDgwMTEgMjAwMCAxNzM1IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyAgLi4uLi41Li4uLi4uTS4uIwotCTB4MDAzMDogIDRkZGMgOTcyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uIQotMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MiA0MDAwIDQwMDYgMjE1MCA3ZjAwIDAwMDEgIEUuLjQuckAuQC4hUC4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0YSAzNzdhIGEzYWEgIC4uLi4ucC5QN1guSjd6Li4KLQkweDAwMjA6ICA4MDEwIDMwNWYgMDZkNCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgIC4uMF8uLi4uLi4uLk0uLiMKLQkweDAwMzA6ICA0ZGRjIDk3MjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLiMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LVhYLm5ldyBiL3Rlc3RzL3ByaW50LVhYLm5ldwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyMWEwMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9wcmludC1YWC5uZXcKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxIDdmMDAgIC48LmhALkAuIVIuLi4uLi4KLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwIGEwMDIgIC4uLnAuUDdYLn4uLi4uLi4KLQkweDAwMzA6ICA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhIDRkZGMgIC4uLiEuLi4uQC4uLi4uTS4KLQkweDAwNDA6ICA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIgICAgICAgICAgICAgICAgIC4uLi4uLi4uLi4KLTIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMDNjIDAwMDAgNDAwMCA0MDA2IDNjYmEgN2YwMCAwMDAxIDdmMDAgIC48Li5ALkAuPC4uLi4uLi4KLQkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjEgMzc1OCA4OTdmIGEwMTIgIC4uLlAucDd6Li43WC4uLi4KLQkweDAwMzA6ICA3ZmZmIDZlYjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhIDRkZGMgIC4ubi4uLi4uQC4uLi4uTS4KLQkweDAwNDA6ICA5MjE2IDRkZGMgOTIxNiAwMTAzIDAzMDIgICAgICAgICAgICAgICAgIC4uTS4uLi4uLi4KLTIzOjU3OjM1LjkzODE2NyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MD4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMDM0IDFiNmEgNDAwMCA0MDA2IDIxNTggN2YwMCAwMDAxIDdmMDAgIC40LmpALkAuIVguLi4uLi4KLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyIDgwMTAgIC4uLnAuUDdYLi43ei4uLi4KLQkweDAwMzA6ICAyMDAwIDM3ZDAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE2IDRkZGMgIC4uNy4uLi4uLi5NLi4uTS4KLQkweDAwNDA6ICA5MjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uCi0yMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxIDdmMDAgIC4uLmxALkAuLi4uLi4uLi4KLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyIDgwMTggIC4uLnAuUDdYLi43ei4uLi4KLQkweDAwMzA6ICAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3IDRkZGMgIC4uLi4uLi4uLi5NLi4uTS4KLQkweDAwNDA6ICA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxIDJlMzEgIC4uR0VULi8uSFRUUC8xLjEKLQkweDAwNTA6ICAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4IDZmNzMgIC4uSG9zdDoubG9jYWxob3MKLQkweDAwNjA6ICA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhIDIwNDUgIHQuLlVzZXItQWdlbnQ6LkUKLQkweDAwNzA6ICA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3IDJkNjQgIExpbmtzLzAuMTAuNC03LWQKLQkweDAwODA6ICA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0IDY1M2IgIGViaWFuLih0ZXh0bW9kZTsKLQkweDAwOTA6ICAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkIDMxMmQgIC5MaW51eC4yLjYuMTEtMS0KLQkweDAwYTA6ICAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwIDMxMzMgIDY4Ni1zbXAuaTY4NjsuMTMKLQkweDAwYjA6ICAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwIDc0M2EgIDJ4NTYtMikuLkFjY2VwdDoKLQkweDAwYzA6ICAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1IDZlNjMgIC4qLyouLkFjY2VwdC1FbmMKLQkweDAwZDA6ICA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxIDYzNjMgIG9kaW5nOi5nemlwLi5BY2MKLQkweDAwZTA6ICA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwIDY1NmUgIGVwdC1MYW5ndWFnZTouZW4KLQkweDAwZjA6ICAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwIDRiNjUgIC4uQ29ubmVjdGlvbjouS2UKLQkweDAxMDA6ICA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYSAgICAgICAgICAgIGVwLUFsaXZlLi4uLgotMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzNCAxZmU0IDQwMDAgNDAwNiAxY2RlIDdmMDAgMDAwMSA3ZjAwICAuNC4uQC5ALi4uLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDEwICAuLi5QLnA3ei4uN1guSS4uCi0JMHgwMDMwOiAgMjAwMCAzNzAzIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOCA0ZGRjICAuLjcuLi4uLi4uTS4uLk0uCi0JMHgwMDQwOiAgOTIxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLgotMjM6NTc6MzUuOTQxMjMyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUCAxOjU1NjAoNTU1OSkgYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUxPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgotCTB4MDAxMDogIDE1ZWIgMWZlNiA0MDAwIDQwMDYgMDcyNSA3ZjAwIDAwMDEgN2YwMCAgLi4uLkAuQC4uJS4uLi4uLgotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgODAxOCAgLi4uUC5wN3ouLjdYLkkuLgotCTB4MDAzMDogIDIwMDAgMTNlMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgNGRkYyAgLi4uLi4uLi4uLk0uLi5NLgotCTB4MDA0MDogIDkyMTcgNDg1NCA1NDUwIDJmMzEgMmUzMSAyMDMyIDMwMzAgMjA0ZiAgLi5IVFRQLzEuMS4yMDAuTwotCTB4MDA1MDogIDRiMGQgMGE0NCA2MTc0IDY1M2EgMjA1NyA2NTY0IDJjMjAgMzAzNiAgSy4uRGF0ZTouV2VkLC4wNgotCTB4MDA2MDogIDIwNGEgNzU2YyAyMDMyIDMwMzAgMzUyMCAzMDMzIDNhMzUgMzczYSAgLkp1bC4yMDA1LjAzOjU3OgotCTB4MDA3MDogIDMzMzUgMjA0NyA0ZDU0IDBkMGEgNTM2NSA3Mjc2IDY1NzIgM2EyMCAgMzUuR01ULi5TZXJ2ZXI6LgotCTB4MDA4MDogIDQxNzAgNjE2MyA2ODY1IDJmMzEgMmUzMyAyZTMzIDMzMGQgMGE0YyAgQXBhY2hlLzEuMy4zMy4uTAotCTB4MDA5MDogIDYxNzMgNzQyZCA0ZDZmIDY0NjkgNjY2OSA2NTY0IDNhMjAgNTM3NSAgYXN0LU1vZGlmaWVkOi5TdQotCTB4MDBhMDogIDZlMmMgMjAzMSAzNTIwIDQxNzUgNjcyMCAzMjMwIDMwMzQgMjAzMCAgbiwuMTUuQXVnLjIwMDQuMAotCTB4MDBiMDogIDMwM2EgMzQzMyAzYTM0IDMxMjAgNDc0ZCA1NDBkIDBhNDUgNTQ2MSAgMDo0Mzo0MS5HTVQuLkVUYQotCTB4MDBjMDogIDY3M2EgMjAyMiAzNjY1IDM4MzAgNjYzMCAyZDMxIDM0MzggNjEyZCAgZzouIjZlODBmMC0xNDhhLQotCTB4MDBkMDogIDM0MzEgMzE2NSA2MjMxIDYyNjQgMjIwZCAwYTQxIDYzNjMgNjU3MCAgNDExZWIxYmQiLi5BY2NlcAotCTB4MDBlMDogIDc0MmQgNTI2MSA2ZTY3IDY1NzMgM2EyMCA2Mjc5IDc0NjUgNzMwZCAgdC1SYW5nZXM6LmJ5dGVzLgotCTB4MDBmMDogIDBhNDMgNmY2ZSA3NDY1IDZlNzQgMmQ0YyA2NTZlIDY3NzQgNjgzYSAgLkNvbnRlbnQtTGVuZ3RoOgotCTB4MDEwMDogIDIwMzUgMzIzNSAzODBkIDBhNGIgNjU2NSA3MDJkIDQxNmMgNjk3NiAgLjUyNTguLktlZXAtQWxpdgotCTB4MDExMDogIDY1M2EgMjA3NCA2OTZkIDY1NmYgNzU3NCAzZDMxIDM1MmMgMjA2ZCAgZToudGltZW91dD0xNSwubQotCTB4MDEyMDogIDYxNzggM2QzMSAzMDMwIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSAgYXg9MTAwLi5Db25uZWN0aQotCTB4MDEzMDogIDZmNmUgM2EyMCA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAgb246LktlZXAtQWxpdmUuLgotCTB4MDE0MDogIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDNhMjAgNzQ2NSAgQ29udGVudC1UeXBlOi50ZQotCTB4MDE1MDogIDc4NzQgMmY2OCA3NDZkIDZjM2IgMjA2MyA2ODYxIDcyNzMgNjU3NCAgeHQvaHRtbDsuY2hhcnNldAotCTB4MDE2MDogIDNkNjkgNzM2ZiAyZDM4IDM4MzUgMzkyZCAzMTBkIDBhMGQgMGEzYyAgPWlzby04ODU5LTEuLi4uPAotCTB4MDE3MDogIDIxNDQgNGY0MyA1NDU5IDUwNDUgMjA0OCA1NDRkIDRjMjAgNTA1NSAgIURPQ1RZUEUuSFRNTC5QVQotCTB4MDE4MDogIDQyNGMgNDk0MyAyMDIyIDJkMmYgMmY1NyAzMzQzIDJmMmYgNDQ1NCAgQkxJQy4iLS8vVzNDLy9EVAotCTB4MDE5MDogIDQ0MjAgNDg1NCA0ZDRjIDIwMzQgMmUzMCAzMTIwIDU0NzIgNjE2ZSAgRC5IVE1MLjQuMDEuVHJhbgotCTB4MDFhMDogIDczNjkgNzQ2OSA2ZjZlIDYxNmMgMmYyZiA0NTRlIDIyM2UgMGEzYyAgc2l0aW9uYWwvL0VOIj4uPAotCTB4MDFiMDogIDQ4NTQgNGQ0YyAzZTBhIDNjNDggNDU0MSA0NDNlIDBhMjAgMjAyMCAgSFRNTD4uPEhFQUQ+Li4uLgotCTB4MDFjMDogIDNjNGQgNDU1NCA0MTIwIDQ4NTQgNTQ1MCAyZDQ1IDUxNTUgNDk1NiAgPE1FVEEuSFRUUC1FUVVJVgotCTB4MDFkMDogIDNkMjIgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgMjIyMCAgPSJDb250ZW50LVR5cGUiLgotCTB4MDFlMDogIDQzNGYgNGU1NCA0NTRlIDU0M2QgMjI3NCA2NTc4IDc0MmYgNjg3NCAgQ09OVEVOVD0idGV4dC9odAotCTB4MDFmMDogIDZkNmMgM2IyMCA2MzY4IDYxNzIgNzM2NSA3NDNkIDY5NzMgNmYyZCAgbWw7LmNoYXJzZXQ9aXNvLQotCTB4MDIwMDogIDM4MzggMzUzOSAyZDMxIDIyM2UgMGEyMCAyMDIwIDNjNGQgNDU1NCAgODg1OS0xIj4uLi4uPE1FVAotCTB4MDIxMDogIDQxMjAgNGU0MSA0ZDQ1IDNkMjIgNDQ2NSA3MzYzIDcyNjkgNzA3NCAgQS5OQU1FPSJEZXNjcmlwdAotCTB4MDIyMDogIDY5NmYgNmUyMiAyMDQzIDRmNGUgNTQ0NSA0ZTU0IDNkMjIgNTQ2OCAgaW9uIi5DT05URU5UPSJUaAotCTB4MDIzMDogIDY1MjAgNjk2ZSA2OTc0IDY5NjEgNmMyMCA2OTZlIDczNzQgNjE2YyAgZS5pbml0aWFsLmluc3RhbAotCTB4MDI0MDogIDZjNjEgNzQ2OSA2ZjZlIDIwNmYgNjYyMCA0NDY1IDYyNjkgNjE2ZSAgbGF0aW9uLm9mLkRlYmlhbgotCTB4MDI1MDogIDIwNjEgNzA2MSA2MzY4IDY1MmUgMjIzZSAwYTIwIDIwMjAgM2M1NCAgLmFwYWNoZS4iPi4uLi48VAotCTB4MDI2MDogIDQ5NTQgNGM0NSAzZTUwIDZjNjEgNjM2NSA2ODZmIDZjNjQgNjU3MiAgSVRMRT5QbGFjZWhvbGRlcgotCTB4MDI3MDogIDIwNzAgNjE2NyA2NTNjIDJmNTQgNDk1NCA0YzQ1IDNlMGEgM2MyZiAgLnBhZ2U8L1RJVExFPi48LwotCTB4MDI4MDogIDQ4NDUgNDE0NCAzZTBhIDNjNDIgNGY0NCA1OTIwIDU0NDUgNTg1NCAgSEVBRD4uPEJPRFkuVEVYVAotCTB4MDI5MDogIDNkMjIgMjMzMCAzMDMwIDMwMzAgMzAyMiAyMDQyIDQ3NDMgNGY0YyAgPSIjMDAwMDAwIi5CR0NPTAotCTB4MDJhMDogIDRmNTIgM2QyMiAyMzQ2IDQ2NDYgNDY0NiA0NjIyIDIwNGMgNDk0ZSAgT1I9IiNGRkZGRkYiLkxJTgotCTB4MDJiMDogIDRiM2QgMjIyMyAzMDMwIDMwMzAgNDU0NiAyMjIwIDU2NGMgNDk0ZSAgSz0iIzAwMDBFRiIuVkxJTgotCTB4MDJjMDogIDRiM2QgMjIyMyAzNTM1IDMxMzggMzg0MSAyMjIwIDQxNGMgNDk0ZSAgSz0iIzU1MTg4QSIuQUxJTgotCTB4MDJkMDogIDRiM2QgMjIyMyA0NjQ2IDMwMzAgMzAzMCAyMjNlIDBhMGEgM2M0OCAgSz0iI0ZGMDAwMCI+Li48SAotCTB4MDJlMDogIDMxM2UgNTA2YyA2MTYzIDY1NjggNmY2YyA2NDY1IDcyMjAgNzA2MSAgMT5QbGFjZWhvbGRlci5wYQotCTB4MDJmMDogIDY3NjUgM2MyZiA0ODMxIDNlMGEgM2M0OCAzMjNlIDQ5NjYgMjA3OSAgZ2U8L0gxPi48SDI+SWYueQotCTB4MDMwMDogIDZmNzUgMjA2MSA3MjY1IDIwNmEgNzU3MyA3NDIwIDYyNzIgNmY3NyAgb3UuYXJlLmp1c3QuYnJvdwotCTB4MDMxMDogIDczNjkgNmU2NyAyMDc0IDY4NjUgMjA3NyA2NTYyIDNjMmYgNjgzMiAgc2luZy50aGUud2ViPC9oMgotCTB4MDMyMDogIDNlMGEgMGEzYyA1MDNlIDU0NjggNjUyMCA2Zjc3IDZlNjUgNzIyMCAgPi4uPFA+VGhlLm93bmVyLgotCTB4MDMzMDogIDZmNjYgMjA3NCA2ODY5IDczMjAgNzc2NSA2MjIwIDczNjkgNzQ2NSAgb2YudGhpcy53ZWIuc2l0ZQotCTB4MDM0MDogIDIwNjggNjE3MyAyMDZlIDZmNzQgMjA3MCA3NTc0IDIwNzUgNzAyMCAgLmhhcy5ub3QucHV0LnVwLgotCTB4MDM1MDogIDYxNmUgNzkyMCA3NzY1IDYyMjAgNzA2MSA2NzY1IDczMjAgNzk2NSAgYW55LndlYi5wYWdlcy55ZQotCTB4MDM2MDogIDc0MmUgMGE1MCA2YzY1IDYxNzMgNjUyMCA2MzZmIDZkNjUgMjA2MiAgdC4uUGxlYXNlLmNvbWUuYgotCTB4MDM3MDogIDYxNjMgNmIyMCA2YzYxIDc0NjUgNzIyZSAzYzJmIDUwM2UgMGEwYSAgYWNrLmxhdGVyLjwvUD4uLgotCTB4MDM4MDogIDNjNTAgM2UzYyA1MzRkIDQxNGMgNGMzZSAzYzQzIDQ5NTQgNDUzZSAgPFA+PFNNQUxMPjxDSVRFPgotCTB4MDM5MDogIDRkNmYgNzY2NSAyMDYxIDZjNmYgNmU2NyAyYzIwIDZlNmYgNzQ2OCAgTW92ZS5hbG9uZywubm90aAotCTB4MDNhMDogIDY5NmUgNjcyMCA3NDZmIDIwNzMgNjU2NSAyMDY4IDY1NzIgNjUyZSAgaW5nLnRvLnNlZS5oZXJlLgotCTB4MDNiMDogIDJlMmUgM2MyZiA0MzQ5IDU0NDUgM2UyMCAzYTJkIDI5M2MgMmY1MyAgLi48L0NJVEU+LjotKTwvUwotCTB4MDNjMDogIDRkNDEgNGM0YyAzZTNjIDJmNTAgM2UwYSAwYTNjIDQ4MzIgM2U0OSAgTUFMTD48L1A+Li48SDI+SQotCTB4MDNkMDogIDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCA3NDcyIDc5NjkgNmU2NyAgZi55b3UuYXJlLnRyeWluZwotCTB4MDNlMDogIDIwNzQgNmYyMCA2YzZmIDYzNjEgNzQ2NSAyMDc0IDY4NjUgMjA2MSAgLnRvLmxvY2F0ZS50aGUuYQotCTB4MDNmMDogIDY0NmQgNjk2ZSA2OTczIDc0NzIgNjE3NCA2ZjcyIDIwNmYgNjYyMCAgZG1pbmlzdHJhdG9yLm9mLgotCTB4MDQwMDogIDc0NjggNjk3MyAyMDZkIDYxNjMgNjg2OSA2ZTY1IDNjMmYgNDgzMiAgdGhpcy5tYWNoaW5lPC9IMgotCTB4MDQxMDogIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNzcgNjE2ZSAgPi4uPFA+SWYueW91LndhbgotCTB4MDQyMDogIDc0MjAgNzQ2ZiAyMDcyIDY1NzAgNmY3MiA3NDIwIDczNmYgNmQ2NSAgdC50by5yZXBvcnQuc29tZQotCTB4MDQzMDogIDc0NjggNjk2ZSA2NzIwIDYxNjIgNmY3NSA3NDIwIDc0NjggNjk3MyAgdGhpbmcuYWJvdXQudGhpcwotCTB4MDQ0MDogIDIwNjggNmY3MyA3NDI3IDczMjAgNjI2NSA2ODYxIDc2NjkgNmY3MiAgLmhvc3Qncy5iZWhhdmlvcgotCTB4MDQ1MDogIDJjMjAgNzA2YyA2NTYxIDczNjUgMGE2MyA2ZjZlIDc0NjEgNjM3NCAgLC5wbGVhc2UuY29udGFjdAotCTB4MDQ2MDogIDIwNzQgNjg2NSAyMDQ5IDZlNzQgNjU3MiA2ZTY1IDc0MjAgNTM2NSAgLnRoZS5JbnRlcm5ldC5TZQotCTB4MDQ3MDogIDcyNzYgNjk2MyA2NTIwIDUwNzIgNmY3NiA2OTY0IDY1NzIgMjAyOCAgcnZpY2UuUHJvdmlkZXIuKAotCTB4MDQ4MDogIDQ5NTMgNTAyOSAyMDY5IDZlNzYgNmY2YyA3NjY1IDY0MjAgNjQ2OSAgSVNQKS5pbnZvbHZlZC5kaQotCTB4MDQ5MDogIDcyNjUgNjM3NCA2Yzc5IDJlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSAgcmVjdGx5LjwvUD4uLjxQPgotCTB4MDRhMDogIDUzNjUgNjUyMCA3NDY4IDY1MjAgM2M0MSAyMDY4IDcyNjUgNjYzZCAgU2VlLnRoZS48QS5ocmVmPQotCTB4MDRiMDogIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNjIgNzU3MyAgImh0dHA6Ly93d3cuYWJ1cwotCTB4MDRjMDogIDY1MmUgNmU2NSA3NDJmIDIyM2UgNGU2NSA3NDc3IDZmNzIgNmIyMCAgZS5uZXQvIj5OZXR3b3JrLgotCTB4MDRkMDogIDQxNjIgNzU3MyA2NTBhIDQzNmMgNjU2MSA3MjY5IDZlNjcgNjg2ZiAgQWJ1c2UuQ2xlYXJpbmdobwotCTB4MDRlMDogIDc1NzMgNjUzYyAyZjQxIDNlMjAgNjY2ZiA3MjIwIDY4NmYgNzcyMCAgdXNlPC9BPi5mb3IuaG93LgotCTB4MDRmMDogIDc0NmYgMjA2NCA2ZjIwIDc0NjggNjk3MyAyZTNjIDJmNTAgM2UwYSAgdG8uZG8udGhpcy48L1A+LgotCTB4MDUwMDogIDBhM2MgNDgzMiAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCAgLjxIMj5JZi55b3UuYXJlLgotCTB4MDUxMDogIDc0NjggNjUyMCA2MTY0IDZkNjkgNmU2OSA3Mzc0IDcyNjEgNzQ2ZiAgdGhlLmFkbWluaXN0cmF0bwotCTB4MDUyMDogIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA2ZDYxIDYzNjggNjk2ZSAgci5vZi50aGlzLm1hY2hpbgotCTB4MDUzMDogIDY1M2MgMmY0OCAzMjNlIDBhMGEgM2M1MCAzZTU0IDY4NjUgMjA2OSAgZTwvSDI+Li48UD5UaGUuaQotCTB4MDU0MDogIDZlNjkgNzQ2OSA2MTZjIDIwNjkgNmU3MyA3NDYxIDZjNmMgNjE3NCAgbml0aWFsLmluc3RhbGxhdAotCTB4MDU1MDogIDY5NmYgNmUyMCA2ZjY2IDIwM2MgNDEyMCA2ODcyIDY1NjYgM2QyMiAgaW9uLm9mLjxBLmhyZWY9IgotCTB4MDU2MDogIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSAgaHR0cDovL3d3dy5kZWJpYQotCTB4MDU3MDogIDZlMmUgNmY3MiA2NzJmIDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjc3MyAgbi5vcmcvIj5EZWJpYW4ncwotCTB4MDU4MDogIDBhNjEgNzA2MSA2MzY4IDY1M2MgMmY0MSAzZTIwIDc3NjUgNjIyMCAgLmFwYWNoZTwvQT4ud2ViLgotCTB4MDU5MDogIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NyAgc2VydmVyLnBhY2thZ2UudwotCTB4MDVhMDogIDYxNzMgMjA3MyA3NTYzIDYzNjUgNzM3MyA2Njc1IDZjMmUgM2MyZiAgYXMuc3VjY2Vzc2Z1bC48LwotCTB4MDViMDogIDUwM2UgMGEwYSAzYzUwIDNlM2MgNTM1NCA1MjRmIDRlNDcgM2U1OSAgUD4uLjxQPjxTVFJPTkc+WQotCTB4MDVjMDogIDZmNzUgMjA3MyA2ODZmIDc1NmMgNjQyMCA3MjY1IDcwNmMgNjE2MyAgb3Uuc2hvdWxkLnJlcGxhYwotCTB4MDVkMDogIDY1MjAgNzQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjkgNzQ2OCAgZS50aGlzLnBhZ2Uud2l0aAotCTB4MDVlMDogIDIwNzkgNmY3NSA3MjIwIDZmNzcgNmUyMCA3NzY1IDYyMjAgNzA2MSAgLnlvdXIub3duLndlYi5wYQotCTB4MDVmMDogIDY3NjUgNzMyMCA2MTczIDBhNzMgNmY2ZiA2ZTIwIDYxNzMgMjA3MCAgZ2VzLmFzLnNvb24uYXMucAotCTB4MDYwMDogIDZmNzMgNzM2OSA2MjZjIDY1MmUgM2MyZiA1MzU0IDUyNGYgNGU0NyAgb3NzaWJsZS48L1NUUk9ORwotCTB4MDYxMDogIDNlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSA1NTZlIDZjNjUgNzM3MyAgPjwvUD4uLjxQPlVubGVzcwotCTB4MDYyMDogIDIwNzkgNmY3NSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjkgNzQ3MyAgLnlvdS5jaGFuZ2VkLml0cwotCTB4MDYzMDogIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2MSA3NDY5IDZmNmUgMmMyMCAgLmNvbmZpZ3VyYXRpb24sLgotCTB4MDY0MDogIDc5NmYgNzU3MiAyMDZlIDY1NzcgMjA3MyA2NTcyIDc2NjUgNzIyMCAgeW91ci5uZXcuc2VydmVyLgotCTB4MDY1MDogIDY5NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjY1IDY0MjAgNjE3MyAgaXMuY29uZmlndXJlZC5hcwotCTB4MDY2MDogIDIwNjYgNmY2YyA2YzZmIDc3NzMgM2EwYSAzYzU1IDRjM2UgMGEzYyAgLmZvbGxvd3M6LjxVTD4uPAotCTB4MDY3MDogIDRjNDkgM2UwYSA0MzZmIDZlNjYgNjk2NyA3NTcyIDYxNzQgNjk2ZiAgTEk+LkNvbmZpZ3VyYXRpbwotCTB4MDY4MDogIDZlMjAgNjY2OSA2YzY1IDczMjAgNjM2MSA2ZTIwIDYyNjUgMjA2NiAgbi5maWxlcy5jYW4uYmUuZgotCTB4MDY5MDogIDZmNzUgNmU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNjUgNzQ2MyAgb3VuZC5pbi48VFQ+L2V0YwotCTB4MDZhMDogIDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyAgL2FwYWNoZTwvVFQ+LjwvTAotCTB4MDZiMDogIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgNTQ1NCAgST4uLjxMST4uVGhlLjxUVAotCTB4MDZjMDogIDNlNDQgNmY2MyA3NTZkIDY1NmUgNzQ1MiA2ZjZmIDc0M2MgMmY1NCAgPkRvY3VtZW50Um9vdDwvVAotCTB4MDZkMDogIDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCA2OTczIDIwNzQgNjg2NSAgVD4sLndoaWNoLmlzLnRoZQotCTB4MDZlMDogIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDc1IDZlNjQgNjU3MiAgLmRpcmVjdG9yeS51bmRlcgotCTB4MDZmMDogIDIwNzcgNjg2OSA2MzY4IDIwNjEgNmM2YyAyMDc5IDZmNzUgNzIwYSAgLndoaWNoLmFsbC55b3VyLgotCTB4MDcwMDogIDQ4NTQgNGQ0YyAyMDY2IDY5NmMgNjU3MyAyMDczIDY4NmYgNzU2YyAgSFRNTC5maWxlcy5zaG91bAotCTB4MDcxMDogIDY0MjAgNjU3OCA2OTczIDc0MmMgMjA2OSA3MzIwIDczNjUgNzQyMCAgZC5leGlzdCwuaXMuc2V0LgotCTB4MDcyMDogIDc0NmYgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcgNzczYyAgdG8uPFRUPi92YXIvd3d3PAotCTB4MDczMDogIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAgL1RUPi48L0xJPi4uPExJPgotCTB4MDc0MDogIDBhNDMgNDc0OSAyMDczIDYzNzIgNjk3MCA3NDczIDIwNjEgNzI2NSAgLkNHSS5zY3JpcHRzLmFyZQotCTB4MDc1MDogIDIwNmMgNmY2ZiA2YjY1IDY0MjAgNjY2ZiA3MjIwIDY5NmUgMjAzYyAgLmxvb2tlZC5mb3IuaW4uPAotCTB4MDc2MDogIDU0NTQgM2UyZiA3NTczIDcyMmYgNmM2OSA2MjJmIDYzNjcgNjkyZCAgVFQ+L3Vzci9saWIvY2dpLQotCTB4MDc3MDogIDYyNjkgNmUzYyAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCAgYmluPC9UVD4sLndoaWNoLgotCTB4MDc4MDogIDY5NzMgMjA3NyA2ODY1IDcyNjUgMGE0NCA2NTYyIDY5NjEgNmUyMCAgaXMud2hlcmUuRGViaWFuLgotCTB4MDc5MDogIDcwNjEgNjM2YiA2MTY3IDY1NzMgMjA3NyA2OTZjIDZjMjAgNzA2YyAgcGFja2FnZXMud2lsbC5wbAotCTB4MDdhMDogIDYxNjMgNjUyMCA3NDY4IDY1NjkgNzIyMCA3MzYzIDcyNjkgNzA3NCAgYWNlLnRoZWlyLnNjcmlwdAotCTB4MDdiMDogIDczMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNGM2ZiAgcy48L0xJPi4uPExJPi5MbwotCTB4MDdjMDogIDY3MjAgNjY2OSA2YzY1IDczMjAgNjE3MiA2NTIwIDcwNmMgNjE2MyAgZy5maWxlcy5hcmUucGxhYwotCTB4MDdkMDogIDY1NjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgMmY2YyAgZWQuaW4uPFRUPi92YXIvbAotCTB4MDdlMDogIDZmNjcgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmMyMCAgb2cvYXBhY2hlPC9UVD4sLgotCTB4MDdmMDogIDYxNmUgNjQyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDcyNmYgNzQ2MSAgYW5kLndpbGwuYmUucm90YQotCTB4MDgwMDogIDc0NjUgNjQwYSA3NzY1IDY1NmIgNmM3OSAyZTIwIDIwNTQgNjg2NSAgdGVkLndlZWtseS4uLlRoZQotCTB4MDgxMDogIDIwNjYgNzI2NSA3MTc1IDY1NmUgNjM3OSAyMDZmIDY2MjAgNzI2ZiAgLmZyZXF1ZW5jeS5vZi5ybwotCTB4MDgyMDogIDc0NjEgNzQ2OSA2ZjZlIDIwNjMgNjE2ZSAyMDYyIDY1MjAgNjU2MSAgdGF0aW9uLmNhbi5iZS5lYQotCTB4MDgzMDogIDczNjkgNmM3OSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjIgNzkyMCAgc2lseS5jaGFuZ2VkLmJ5LgotCTB4MDg0MDogIDY1NjQgNjk3NCA2OTZlIDY3MGEgM2M1NCA1NDNlIDJmNjUgNzQ2MyAgZWRpdGluZy48VFQ+L2V0YwotCTB4MDg1MDogIDJmNmMgNmY2NyA3MjZmIDc0NjEgNzQ2NSAyZTY0IDJmNjEgNzA2MSAgL2xvZ3JvdGF0ZS5kL2FwYQotCTB4MDg2MDogIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAgY2hlPC9UVD4uPC9MST4uLgotCTB4MDg3MDogIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjA2NCA2NTY2IDYxNzUgNmM3NCAgPExJPi5UaGUuZGVmYXVsdAotCTB4MDg4MDogIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDY5IDZlNjQgNjU3OCAgLmRpcmVjdG9yeS5pbmRleAotCTB4MDg5MDogIDIwNjkgNzMyMCAzYzU0IDU0M2UgNjk2ZSA2NDY1IDc4MmUgNjg3NCAgLmlzLjxUVD5pbmRleC5odAotCTB4MDhhMDogIDZkNmMgM2MyZiA1NDU0IDNlMmMgMjA2ZCA2NTYxIDZlNjkgNmU2NyAgbWw8L1RUPiwubWVhbmluZwotCTB4MDhiMDogIDIwNzQgNjg2MSA3NDIwIDcyNjUgNzE3NSA2NTczIDc0NzMgMGE2NiAgLnRoYXQucmVxdWVzdHMuZgotCTB4MDhjMDogIDZmNzIgMjA2MSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjAzYyAgb3IuYS5kaXJlY3RvcnkuPAotCTB4MDhkMDogIDU0NTQgM2UyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDNjMmYgNTQ1NCAgVFQ+L2Zvby9iYXIvPC9UVAotCTB4MDhlMDogIDNlMjAgNzc2OSA2YzZjIDIwNjcgNjk3NiA2NTIwIDc0NjggNjUyMCAgPi53aWxsLmdpdmUudGhlLgotCTB4MDhmMDogIDYzNmYgNmU3NCA2NTZlIDc0NzMgMjA2ZiA2NjIwIDc0NjggNjUyMCAgY29udGVudHMub2YudGhlLgotCTB4MDkwMDogIDY2NjkgNmM2NSAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NyAgZmlsZS48VFQ+L3Zhci93dwotCTB4MDkxMDogIDc3MmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiA2OTZlIDY0NjUgNzgyZSAgdy9mb28vYmFyL2luZGV4LgotCTB4MDkyMDogIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UwYSA2OTY2IDIwNjkgNzQyMCAgaHRtbDwvVFQ+LmlmLml0LgotCTB4MDkzMDogIDY1NzggNjk3MyA3NDczIDIwMjggNjE3MyA3Mzc1IDZkNjkgNmU2NyAgZXhpc3RzLihhc3N1bWluZwotCTB4MDk0MDogIDIwNzQgNjg2MSA3NDIwIDNjNTQgNTQzZSAyZjc2IDYxNzIgMmY3NyAgLnRoYXQuPFRUPi92YXIvdwotCTB4MDk1MDogIDc3NzcgM2MyZiA1NDU0IDNlMjAgNjk3MyAyMDc5IDZmNzUgNzIyMCAgd3c8L1RUPi5pcy55b3VyLgotCTB4MDk2MDogIDNjNTQgNTQzZSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDUyNmYgNmY3NCAgPFRUPkRvY3VtZW50Um9vdAotCTB4MDk3MDogIDNjMmYgNTQ1NCAzZTI5IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyAgPC9UVD4pLjwvTEk+Li48TAotCTB4MDk4MDogIDQ5M2UgMGE1NSA3MzY1IDcyMjAgNjQ2OSA3MjY1IDYzNzQgNmY3MiAgST4uVXNlci5kaXJlY3RvcgotCTB4MDk5MDogIDY5NjUgNzMyMCA2MTcyIDY1MjAgNjU2ZSA2MTYyIDZjNjUgNjQyYyAgaWVzLmFyZS5lbmFibGVkLAotCTB4MDlhMDogIDIwNjEgNmU2NCAyMDc1IDczNjUgNzIyMCA2NDZmIDYzNzUgNmQ2NSAgLmFuZC51c2VyLmRvY3VtZQotCTB4MDliMDogIDZlNzQgNzMyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDZjNmYgNmY2YiAgbnRzLndpbGwuYmUubG9vawotCTB4MDljMDogIDY1NjQgMjA2NiA2ZjcyIDBhNjkgNmUyMCA3NDY4IDY1MjAgM2M1NCAgZWQuZm9yLmluLnRoZS48VAotCTB4MDlkMDogIDU0M2UgNzA3NSA2MjZjIDY5NjMgNWY2OCA3NDZkIDZjM2MgMmY1NCAgVD5wdWJsaWNfaHRtbDwvVAotCTB4MDllMDogIDU0M2UgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNmYgNjYyMCAgVD4uZGlyZWN0b3J5Lm9mLgotCTB4MDlmMDogIDc0NjggNjUyMCA3NTczIDY1NzIgNzMyNyAyMDY4IDZmNmQgNjU3MyAgdGhlLnVzZXJzJy5ob21lcwotCTB4MGEwMDogIDJlMjAgMjA1NCA2ODY1IDczNjUgMjA2NCA2OTcyIDczMGEgNzM2OCAgLi4uVGhlc2UuZGlycy5zaAotCTB4MGExMDogIDZmNzUgNmM2NCAyMDYyIDY1MjAgNzU2ZSA2NDY1IDcyMjAgM2M1NCAgb3VsZC5iZS51bmRlci48VAotCTB4MGEyMDogIDU0M2UgMmY2OCA2ZjZkIDY1M2MgMmY1NCA1NDNlIDJjMjAgNjE2ZSAgVD4vaG9tZTwvVFQ+LC5hbgotCTB4MGEzMDogIDY0MjAgNzU3MyA2NTcyIDczMjAgNzc2OSA2YzZjIDIwNmUgNmY3NCAgZC51c2Vycy53aWxsLm5vdAotCTB4MGE0MDogIDIwNjIgNjUyMCA2MTYyIDZjNjUgMjA3NCA2ZjIwIDczNzkgNmQ2YyAgLmJlLmFibGUudG8uc3ltbAotCTB4MGE1MDogIDY5NmUgNmIwYSA3NDZmIDIwNjYgNjk2YyA2NTczIDIwNzQgNjg2NSAgaW5rLnRvLmZpbGVzLnRoZQotCTB4MGE2MDogIDc5MjAgNjQ2ZiA2ZTI3IDc0MjAgNmY3NyA2ZTJlIDNjMmYgNGM0OSAgeS5kb24ndC5vd24uPC9MSQotCTB4MGE3MDogIDNlMGEgMGEzYyAyZjU1IDRjM2UgMGE0MSA2YzZjIDIwNzQgNjg2NSAgPi4uPC9VTD4uQWxsLnRoZQotCTB4MGE4MDogIDIwNzMgNzQ2MSA2ZTY0IDYxNzIgNjQyMCA2MTcwIDYxNjMgNjg2NSAgLnN0YW5kYXJkLmFwYWNoZQotCTB4MGE5MDogIDIwNmQgNmY2NCA3NTZjIDY1NzMgMjA2MSA3MjY1IDIwNjEgNzY2MSAgLm1vZHVsZXMuYXJlLmF2YQotCTB4MGFhMDogIDY5NmMgNjE2MiA2YzY1IDIwNzcgNjk3NCA2ODIwIDc0NjggNjk3MyAgaWxhYmxlLndpdGgudGhpcwotCTB4MGFiMDogIDIwNzIgNjU2YyA2NTYxIDczNjUgMjA2MSA2ZTY0IDIwNjEgNzI2NSAgLnJlbGVhc2UuYW5kLmFyZQotCTB4MGFjMDogIDBhNmUgNmY3NyAyMDZkIDYxNmUgNjE2NyA2NTY0IDIwNzcgNjk3NCAgLm5vdy5tYW5hZ2VkLndpdAotCTB4MGFkMDogIDY4MjAgNjQ2NSA2MjYzIDZmNmUgNjYyZSAyMDIwIDU0NzkgNzA2NSAgaC5kZWJjb25mLi4uVHlwZQotCTB4MGFlMDogIDIwM2MgNTQ1NCAzZTY0IDcwNmIgNjcyZCA3MjY1IDYzNmYgNmU2NiAgLjxUVD5kcGtnLXJlY29uZgotCTB4MGFmMDogIDY5NjcgNzU3MiA2NTIwIDYxNzAgNjE2MyA2ODY1IDNjMmYgNTQ1NCAgaWd1cmUuYXBhY2hlPC9UVAotCTB4MGIwMDogIDNlMjAgNzQ2ZiAwYTczIDY1NmMgNjU2MyA3NDIwIDc3NjggNjk2MyAgPi50by5zZWxlY3Qud2hpYwotCTB4MGIxMDogIDY4MjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCA3OTZmIDc1MjAgNzc2MSAgaC5tb2R1bGVzLnlvdS53YQotCTB4MGIyMDogIDZlNzQgMjA2NSA2ZTYxIDYyNmMgNjU2NCAyZTIwIDIwNGQgNjE2ZSAgbnQuZW5hYmxlZC4uLk1hbgotCTB4MGIzMDogIDc5MjAgNmY3NCA2ODY1IDcyMjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCAgeS5vdGhlci5tb2R1bGVzLgotCTB4MGI0MDogIDYxNzIgNjUyMCA2MTc2IDYxNjkgNmM2MSA2MjZjIDY1MGEgNzQ2OCAgYXJlLmF2YWlsYWJsZS50aAotCTB4MGI1MDogIDcyNmYgNzU2NyA2ODIwIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAgcm91Z2gudGhlLkRlYmlhbgotCTB4MGI2MDogIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3MyA3OTczIDc0NjUgNmQyMCAgLnBhY2thZ2Uuc3lzdGVtLgotCTB4MGI3MDogIDc3NjkgNzQ2OCAyMDc0IDY4NjUgMjA2ZSA2MTZkIDY1NzMgMjAzYyAgd2l0aC50aGUubmFtZXMuPAotCTB4MGI4MDogIDU0NTQgM2U2YyA2OTYyIDYxNzAgNjE2MyA2ODY1IDJkNmQgNmY2NCAgVFQ+bGliYXBhY2hlLW1vZAotCTB4MGI5MDogIDJkMmEgM2MyZiA1NDU0IDNlMmUgMGE0OSA2NjIwIDc5NmYgNzUyMCAgLSo8L1RUPi4uSWYueW91LgotCTB4MGJhMDogIDZlNjUgNjU2NCAyMDc0IDZmMjAgNjM2ZiA2ZDcwIDY5NmMgNjUyMCAgbmVlZC50by5jb21waWxlLgotCTB4MGJiMDogIDYxMjAgNmQ2ZiA2NDc1IDZjNjUgMjA3OSA2Zjc1IDcyNzMgNjU2YyAgYS5tb2R1bGUueW91cnNlbAotCTB4MGJjMDogIDY2MmMgMjA3OSA2Zjc1IDIwNzcgNjk2YyA2YzIwIDZlNjUgNjU2NCAgZiwueW91LndpbGwubmVlZAotCTB4MGJkMDogIDIwNzQgNmYyMCA2OTZlIDczNzQgNjE2YyA2YzIwIDc0NjggNjUwYSAgLnRvLmluc3RhbGwudGhlLgotCTB4MGJlMDogIDNjNTQgNTQzZSA2MTcwIDYxNjMgNjg2NSAyZDY0IDY1NzYgM2MyZiAgPFRUPmFwYWNoZS1kZXY8LwotCTB4MGJmMDogIDU0NTQgM2UyMCA3MDYxIDYzNmIgNjE2NyA2NTJlIDBhMGEgM2M1MCAgVFQ+LnBhY2thZ2UuLi48UAotCTB4MGMwMDogIDNlNGQgNmY3MiA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NCAgPk1vcmUuZG9jdW1lbnRhdAotCTB4MGMxMDogIDY5NmYgNmUyMCA2ZjZlIDIwNDEgNzA2MSA2MzY4IDY1MjAgNjM2MSAgaW9uLm9uLkFwYWNoZS5jYQotCTB4MGMyMDogIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDZmIDZlM2EgMGEzYyAgbi5iZS5mb3VuZC5vbjouPAotCTB4MGMzMDogIDU1NGMgM2UwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MgNDEyMCAgVUw+LjxMST4uVGhlLjxBLgotCTB4MGM0MDogIDQ4NTIgNDU0NiAzZDIyIDJmNjQgNmY2MyAyZjYxIDcwNjEgNjM2OCAgSFJFRj0iL2RvYy9hcGFjaAotCTB4MGM1MDogIDY1MmQgNjQ2ZiA2MzJmIDZkNjEgNmU3NSA2MTZjIDJmMjIgM2U0MSAgZS1kb2MvbWFudWFsLyI+QQotCTB4MGM2MDogIDcwNjEgNjM2OCA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NCAgcGFjaGUuZG9jdW1lbnRhdAotCTB4MGM3MDogIDY5NmYgNmUzYyAyZjQxIDNlMjAgNzM3NCA2ZjcyIDY1NjQgMjA2ZiAgaW9uPC9BPi5zdG9yZWQubwotCTB4MGM4MDogIDZlMjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMmUgM2MyZiAgbi55b3VyLnNlcnZlci48LwotCTB4MGM5MDogIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAgTEk+Li48TEk+LlRoZS48QQotCTB4MGNhMDogIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyAgLkhSRUY9Imh0dHA6Ly93dwotCTB4MGNiMDogIDc3MmUgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2U0MSAgdy5hcGFjaGUub3JnLyI+QQotCTB4MGNjMDogIDcwNjEgNjM2OCA2NTIwIDUwNzIgNmY2YSA2NTYzIDc0M2MgMmY0MSAgcGFjaGUuUHJvamVjdDwvQQotCTB4MGNkMDogIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OSAgPi5ob21lLnNpdGUuPC9MSQotCTB4MGNlMDogIDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OCAgPi4uPExJPi5UaGUuPEEuSAotCTB4MGNmMDogIDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSAgUkVGPSJodHRwOi8vd3d3LgotCTB4MGQwMDogIDYxNzAgNjE2MyA2ODY1IDJkNzMgNzM2YyAyZTZmIDcyNjcgMmYyMiAgYXBhY2hlLXNzbC5vcmcvIgotCTB4MGQxMDogIDNlNDEgNzA2MSA2MzY4IDY1MmQgNTM1MyA0YzNjIDJmNDEgM2UyMCAgPkFwYWNoZS1TU0w8L0E+LgotCTB4MGQyMDogIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkgM2UwYSAgaG9tZS5zaXRlLjwvTEk+LgotCTB4MGQzMDogIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDggNTI0NSAgLjxMST4uVGhlLjxBLkhSRQotCTB4MGQ0MDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3MDY1IDcyNmMgMmU2MSAgRj0iaHR0cDovL3BlcmwuYQotCTB4MGQ1MDogIDcwNjEgNjM2OCA2NTJlIDZmNzIgNjcyZiAyMjNlIDZkNmYgNjQyMCAgcGFjaGUub3JnLyI+bW9kLgotCTB4MGQ2MDogIDcwNjUgNzI2YyAzYzJmIDQxM2UgMjA2OCA2ZjZkIDY1MjAgNzM2OSAgcGVybDwvQT4uaG9tZS5zaQotCTB4MGQ3MDogIDc0NjUgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCAgdGUuPC9MST4uLjxMST4uVAotCTB4MGQ4MDogIDY4NjUgMjAzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAgaGUuPEEuSFJFRj0iaHR0cAotCTB4MGQ5MDogIDNhMmYgMmY3NyA3Nzc3IDJlNjEgNzA2MSA2MzY4IDY1NzcgNjU2NSAgOi8vd3d3LmFwYWNoZXdlZQotCTB4MGRhMDogIDZiMmUgNjM2ZiA2ZDJmIDIyM2UgNDE3MCA2MTYzIDY4NjUgNTc2NSAgay5jb20vIj5BcGFjaGVXZQotCTB4MGRiMDogIDY1NmIgM2MyZiA0MTNlIDIwNmUgNjU3NyA3MzZjIDY1NzQgNzQ2NSAgZWs8L0E+Lm5ld3NsZXR0ZQotCTB4MGRjMDogIDcyMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCAgci48L0xJPi4uPExJPi5UaAotCTB4MGRkMDogIDY1MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAgZS48QS5IUkVGPSJodHRwOgotCTB4MGRlMDogIDJmMmYgNzc3NyA3NzJlIDY0NjUgNjI2OSA2MTZlIDJlNmYgNzI2NyAgLy93d3cuZGViaWFuLm9yZwotCTB4MGRmMDogIDJmNjQgNmY2MyAyZjIyIDNlNDQgNjU2MiA2OTYxIDZlMjAgNTA3MiAgL2RvYy8iPkRlYmlhbi5QcgotCTB4MGUwMDogIDZmNmEgNjU2MyA3NDBhIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNjE3NCAgb2plY3QuRG9jdW1lbnRhdAotCTB4MGUxMDogIDY5NmYgNmUzYyAyZjQxIDNlMjAgNzc2OCA2OTYzIDY4MjAgNjM2ZiAgaW9uPC9BPi53aGljaC5jbwotCTB4MGUyMDogIDZlNzQgNjE2OSA2ZTczIDIwNDggNGY1NyA1NDRmIDczMmMgMjA0NiAgbnRhaW5zLkhPV1RPcywuRgotCTB4MGUzMDogIDQxNTEgNzMyYyAyMDYxIDZlNjQgMjA3MyA2ZjY2IDc0NzcgNjE3MiAgQVFzLC5hbmQuc29mdHdhcgotCTB4MGU0MDogIDY1MjAgNzU3MCA2NDYxIDc0NjUgNzMyZSAzYzJmIDRjNDkgM2UwYSAgZS51cGRhdGVzLjwvTEk+LgotCTB4MGU1MDogIDNjMmYgNTU0YyAzZTBhIDBhM2MgNTAzZSA1OTZmIDc1MjAgNjM2MSAgPC9VTD4uLjxQPllvdS5jYQotCTB4MGU2MDogIDZlMjAgNjE2YyA3MzZmIDIwNjMgNmY2ZSA3Mzc1IDZjNzQgMjA3NCAgbi5hbHNvLmNvbnN1bHQudAotCTB4MGU3MDogIDY4NjUgMjA2YyA2OTczIDc0MjAgNmY2NiAyMDNjIDQxMjAgNDg1MiAgaGUubGlzdC5vZi48QS5IUgotCTB4MGU4MDogIDQ1NDYgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2MiAgRUY9Imh0dHA6Ly93d3cuYgotCTB4MGU5MDogIDZmNzUgNzQ2NSA2YzZjIDJlNjMgNmY2ZCAyZjY2IDYxNzEgMmYyMiAgb3V0ZWxsLmNvbS9mYXEvIgotCTB4MGVhMDogIDNlNTcgNmY3MiA2YzY0IDBhNTcgNjk2NCA2NTIwIDU3NjUgNjIyMCAgPldvcmxkLldpZGUuV2ViLgotCTB4MGViMDogIDQ2NzIgNjU3MSA3NTY1IDZlNzQgNmM3OSAyMDQxIDczNmIgNjU2NCAgRnJlcXVlbnRseS5Bc2tlZAotCTB4MGVjMDogIDIwNTEgNzU2NSA3Mzc0IDY5NmYgNmU3MyAzYzJmIDQxM2UgMjA2NiAgLlF1ZXN0aW9uczwvQT4uZgotCTB4MGVkMDogIDZmNzIgMjA2OSA2ZTY2IDZmNzIgNmQ2MSA3NDY5IDZmNmUgMmUwYSAgb3IuaW5mb3JtYXRpb24uLgotCTB4MGVlMDogIDBhM2MgNDgzMiAzZTRjIDY1NzQgMjA2ZiA3NDY4IDY1NzIgMjA3MCAgLjxIMj5MZXQub3RoZXIucAotCTB4MGVmMDogIDY1NmYgNzA2YyA2NTIwIDZiNmUgNmY3NyAyMDYxIDYyNmYgNzU3NCAgZW9wbGUua25vdy5hYm91dAotCTB4MGYwMDogIDIwNzQgNjg2OSA3MzIwIDczNjUgNzI3NiA2NTcyIDNjMmYgNDgzMiAgLnRoaXMuc2VydmVyPC9IMgotCTB4MGYxMDogIDNlMGEgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAgPi4uPEEuSFJFRj0iaHR0cAotCTB4MGYyMDogIDNhMmYgMmY2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZiAgOi8vbmV0Y3JhZnQuY29tLwotCTB4MGYzMDogIDIyM2UgNGU2NSA3NDYzIDcyNjEgNjY3NCAzYzJmIDQxM2UgMjA3MCAgIj5OZXRjcmFmdDwvQT4ucAotCTB4MGY0MDogIDcyNmYgNzY2OSA2NDY1IDczMjAgNjE2ZSAyMDY5IDZlNzQgNjU3MiAgcm92aWRlcy5hbi5pbnRlcgotCTB4MGY1MDogIDY1NzMgNzQ2OSA2ZTY3IDIwNjYgNzI2NSA2NTBhIDczNjUgNzI3NiAgZXN0aW5nLmZyZWUuc2VydgotCTB4MGY2MDogIDY5NjMgNjUyMCA2NjZmIDcyMjAgNzc2NSA2MjIwIDczNjkgNzQ2NSAgaWNlLmZvci53ZWIuc2l0ZQotCTB4MGY3MDogIDIwNmQgNmY2ZSA2OTc0IDZmNzIgNjk2ZSA2NzIwIDYxNmUgNjQyMCAgLm1vbml0b3JpbmcuYW5kLgotCTB4MGY4MDogIDczNzQgNjE3NCA2OTczIDc0NjkgNjMyMCA2MzZmIDZjNmMgNjU2MyAgc3RhdGlzdGljLmNvbGxlYwotCTB4MGY5MDogIDc0NjkgNmY2ZSAyZTBhIDU5NmYgNzUyMCA2MzYxIDZlMjAgNmM2NSAgdGlvbi4uWW91LmNhbi5sZQotCTB4MGZhMDogIDc0MjAgNzQ2OCA2NTZkIDIwNmIgNmU2ZiA3NzIwIDYxNjIgNmY3NSAgdC50aGVtLmtub3cuYWJvdQotCTB4MGZiMDogIDc0MjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMjAgNzU3MyAgdC55b3VyLnNlcnZlci51cwotCTB4MGZjMDogIDY5NmUgNjcyMCA3NDY4IDY1NjkgNzIwYSAzYzQxIDIwNDggNTI0NSAgaW5nLnRoZWlyLjxBLkhSRQotCTB4MGZkMDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3NTcwIDc0NjkgNmQ2NSAgRj0iaHR0cDovL3VwdGltZQotCTB4MGZlMDogIDJlNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYgMjIzZSAgLm5ldGNyYWZ0LmNvbS8iPgotCTB4MGZmMDogIDY5NmUgNzQ2NSA3MjY2IDYxNjMgNjUzYyAyZjQxIDNlMmUgMGE0NSAgaW50ZXJmYWNlPC9BPi4uRQotCTB4MTAwMDogIDZlNjEgNjI2YyA2OTZlIDY3MjAgNzQ2OCA2NTIwIDZkNmYgNmU2OSAgbmFibGluZy50aGUubW9uaQotCTB4MTAxMDogIDc0NmYgNzI2OSA2ZTY3IDIwNmYgNjYyMCA3OTZmIDc1NzIgMjA3MyAgdG9yaW5nLm9mLnlvdXIucwotCTB4MTAyMDogIDY1NzIgNzY2NSA3MjIwIDc3NjkgNmM2YyAyMDcwIDcyNmYgNzY2OSAgZXJ2ZXIud2lsbC5wcm92aQotCTB4MTAzMDogIDY0NjUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjIwIDY3NmMgNmY2MiAgZGUuYS5iZXR0ZXIuZ2xvYgotCTB4MTA0MDogIDYxNmMgMjA2ZiA3NjY1IDcyNzYgNjk2NSA3NzBhIDZmNjYgMjA3NyAgYWwub3ZlcnZpZXcub2YudwotCTB4MTA1MDogIDY4NmYgMjA2OSA3MzIwIDc1NzMgNjk2ZSA2NzIwIDc3NjggNjE3NCAgaG8uaXMudXNpbmcud2hhdAotCTB4MTA2MDogIDIwNjEgNmU2NCAyMDc3IDY4NjUgNzI2NSAyYzIwIDYxNmUgNjQyMCAgLmFuZC53aGVyZSwuYW5kLgotCTB4MTA3MDogIDY5NzQgMjA3NyA2Zjc1IDZjNjQgMjA2NyA2OTc2IDY1MjAgNDQ2NSAgaXQud291bGQuZ2l2ZS5EZQotCTB4MTA4MDogIDYyNjkgNjE2ZSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMGEgNmY3NiAgYmlhbi5hLmJldHRlci5vdgotCTB4MTA5MDogIDY1NzIgNzY2OSA2NTc3IDIwNmYgNjYyMCA3NDY4IDY1MjAgNjE3MCAgZXJ2aWV3Lm9mLnRoZS5hcAotCTB4MTBhMDogIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzUgNzM2MSAgYWNoZS5wYWNrYWdlLnVzYQotCTB4MTBiMDogIDY3NjUgMmUwYSAwYTNjIDQ4MzIgM2U0MSA2MjZmIDc1NzQgMjA3NCAgZ2UuLi48SDI+QWJvdXQudAotCTB4MTBjMDogIDY4NjkgNzMyMCA3MDYxIDY3NjUgM2MyZiA0ODMyIDNlMGEgMGEzYyAgaGlzLnBhZ2U8L0gyPi4uPAotCTB4MTBkMDogIDQ5NGQgNDcyMCA0MTRjIDQ5NDcgNGUzZCAyMjcyIDY5NjcgNjg3NCAgSU1HLkFMSUdOPSJyaWdodAotCTB4MTBlMDogIDIyMjAgNDE0YyA1NDNkIDIyMjIgMjA0OCA0NTQ5IDQ3NDggNTQzZCAgIi5BTFQ9IiIuSEVJR0hUPQotCTB4MTBmMDogIDIyMzIgMzQzNyAyMjIwIDU3NDkgNDQ1NCA0ODNkIDIyMzIgMzczOCAgIjI0NyIuV0lEVEg9IjI3OAotCTB4MTEwMDogIDIyMjAgNTM1MiA0MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNmEgNjg2NSAgIi5TUkM9Imljb25zL2poZQotCTB4MTExMDogIDMwMzYgMzEyZSA3MDZlIDY3MjIgM2UwYSAwYTNjIDUwM2UgNTQ2OCAgMDYxLnBuZyI+Li48UD5UaAotCTB4MTEyMDogIDY5NzMgMjA2OSA3MzIwIDYxMjAgNzA2YyA2MTYzIDY1NjggNmY2YyAgaXMuaXMuYS5wbGFjZWhvbAotCTB4MTEzMDogIDY0NjUgNzIyMCA3MDYxIDY3NjUgMjA2OSA2ZTczIDc0NjEgNmM2YyAgZGVyLnBhZ2UuaW5zdGFsbAotCTB4MTE0MDogIDY1NjQgMjA2MiA3OTIwIDc0NjggNjUyMCAzYzQxIDBhNDggNTI0NSAgZWQuYnkudGhlLjxBLkhSRQotCTB4MTE1MDogIDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjQ2NSAgRj0iaHR0cDovL3d3dy5kZQotCTB4MTE2MDogIDYyNjkgNjE2ZSAyZTZmIDcyNjcgMmYyMiAzZTQ0IDY1NjIgNjk2MSAgYmlhbi5vcmcvIj5EZWJpYQotCTB4MTE3MDogIDZlM2MgMmY0MSAzZTBhIDcyNjUgNmM2NSA2MTczIDY1MjAgNmY2NiAgbjwvQT4ucmVsZWFzZS5vZgotCTB4MTE4MDogIDIwNzQgNjg2NSAyMDYxIDcwNjEgNjM2OCA2NTIwIDU3NjUgNjIyMCAgLnRoZS5hcGFjaGUuV2ViLgotCTB4MTE5MDogIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUgMmUwYSAgc2VydmVyLnBhY2thZ2UuLgotCTB4MTFhMDogIDBhM2MgNTAzZSA1NDY4IDY5NzMgMjA2MyA2ZjZkIDcwNzUgNzQ2NSAgLjxQPlRoaXMuY29tcHV0ZQotCTB4MTFiMDogIDcyMjAgNjg2MSA3MzIwIDY5NmUgNzM3NCA2MTZjIDZjNjUgNjQyMCAgci5oYXMuaW5zdGFsbGVkLgotCTB4MTFjMDogIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAyMDQ3IDRlNTUgMmY0YyAgdGhlLkRlYmlhbi5HTlUvTAotCTB4MTFkMDogIDY5NmUgNzU3OCAyMDZmIDcwNjUgNzI2MSA3NDY5IDZlNjcgMjA3MyAgaW51eC5vcGVyYXRpbmcucwotCTB4MTFlMDogIDc5NzMgNzQ2NSA2ZDJjIDBhNjIgNzU3NCAyMDY5IDc0MjAgNjg2MSAgeXN0ZW0sLmJ1dC5pdC5oYQotCTB4MTFmMDogIDczMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0NjggNjk2ZSAgcy48c3Ryb25nPm5vdGhpbgotCTB4MTIwMDogIDY3MjAgNzQ2ZiAyMDY0IDZmMjAgNzc2OSA3NDY4IDIwNzQgNjg2NSAgZy50by5kby53aXRoLnRoZQotCTB4MTIxMDogIDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhIDY1NjMgNzQzYyAgLkRlYmlhbi5Qcm9qZWN0PAotCTB4MTIyMDogIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMmUyMCA1MDZjIDY1NjEgNzM2NSAgL3N0cm9uZz4uLlBsZWFzZQotCTB4MTIzMDogIDIwNjQgNmYyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQzYyAgLmRvLjxzdHJvbmc+bm90PAotCTB4MTI0MDogIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMjA2MyA2ZjZlIDc0NjEgNjM3NCAgL3N0cm9uZz4uY29udGFjdAotCTB4MTI1MDogIDIwNzQgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSAgLnRoZS5EZWJpYW4uUHJvagotCTB4MTI2MDogIDY1NjMgNzQyMCA2MTYyIDZmNzUgNzQyMCA2OTc0IDJlM2MgMmY1MCAgZWN0LmFib3V0Lml0LjwvUAotCTB4MTI3MDogIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNjYgNjk2ZSAgPi4uPFA+SWYueW91LmZpbgotCTB4MTI4MDogIDY0MjAgNjEyMCA2Mjc1IDY3MjAgNjk2ZSAyMDc0IDY4NjkgNzMyMCAgZC5hLmJ1Zy5pbi50aGlzLgotCTB4MTI5MDogIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMmMyMCAgYXBhY2hlLnBhY2thZ2UsLgotCTB4MTJhMDogIDZmNzIgMjA2OSA2ZTIwIDQxNzAgNjE2MyA2ODY1IDIwNjkgNzQ3MyAgb3IuaW4uQXBhY2hlLml0cwotCTB4MTJiMDogIDY1NmMgNjYyYyAwYTcwIDZjNjUgNjE3MyA2NTIwIDY2NjkgNmM2NSAgZWxmLC5wbGVhc2UuZmlsZQotCTB4MTJjMDogIDIwNjEgMjA2MiA3NTY3IDIwNzIgNjU3MCA2ZjcyIDc0MjAgNmY2ZSAgLmEuYnVnLnJlcG9ydC5vbgotCTB4MTJkMDogIDIwNjkgNzQyZSAyMDIwIDQ5NmUgNzM3NCA3Mjc1IDYzNzQgNjk2ZiAgLml0Li4uSW5zdHJ1Y3RpbwotCTB4MTJlMDogIDZlNzMgMjA2ZiA2ZTIwIDY0NmYgNjk2ZSA2NzIwIDc0NjggNjk3MyAgbnMub24uZG9pbmcudGhpcwotCTB4MTJmMDogIDJjMjAgNjE2ZSA2NDIwIDc0NjggNjUwYSA2YzY5IDczNzQgMjA2ZiAgLC5hbmQudGhlLmxpc3QubwotCTB4MTMwMDogIDY2MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAgZi48QS5IUkVGPSJodHRwOgotCTB4MTMxMDogIDJmMmYgNjI3NSA2NzczIDJlNjQgNjU2MiA2OTYxIDZlMmUgNmY3MiAgLy9idWdzLmRlYmlhbi5vcgotCTB4MTMyMDogIDY3MmYgNzM3MiA2MzNhIDYxNzAgNjE2MyA2ODY1IDIyM2UgNmI2ZSAgZy9zcmM6YXBhY2hlIj5rbgotCTB4MTMzMDogIDZmNzcgNmUyMCA2Mjc1IDY3NzMgM2MyZiA0MTNlIDIwNmYgNjYyMCAgb3duLmJ1Z3M8L0E+Lm9mLgotCTB4MTM0MDogIDc0NjggNjk3MyAwYTcwIDYxNjMgNmI2MSA2NzY1IDJjMjAgNjM2MSAgdGhpcy5wYWNrYWdlLC5jYQotCTB4MTM1MDogIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgNzQ2OCAgbi5iZS5mb3VuZC5pbi50aAotCTB4MTM2MDogIDY1MjAgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQgNzQ3MCAgZS4uPEEuSFJFRj0iaHR0cAotCTB4MTM3MDogIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxIDZlMmUgNmY3MiAgOi8vd3d3LmRlYmlhbi5vcgotCTB4MTM4MDogIDY3MmYgNDI3NSA2NzczIDJmNTIgNjU3MCA2ZjcyIDc0NjkgNmU2NyAgZy9CdWdzL1JlcG9ydGluZwotCTB4MTM5MDogIDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjA0MiA3NTY3IDIwNTQgNzI2MSAgIj5EZWJpYW4uQnVnLlRyYQotCTB4MTNhMDogIDYzNmIgNjk2ZSA2NzIwIDUzNzkgNzM3NCA2NTZkIDNjMmYgNDEzZSAgY2tpbmcuU3lzdGVtPC9BPgotCTB4MTNiMDogIDJlMGEgMGEzYyA1MDNlIDU0NjggNjE2ZSA2YjczIDIwNjYgNmY3MiAgLi4uPFA+VGhhbmtzLmZvcgotCTB4MTNjMDogIDIwNzUgNzM2OSA2ZTY3IDIwNzQgNjg2OSA3MzIwIDcwNjEgNjM2YiAgLnVzaW5nLnRoaXMucGFjawotCTB4MTNkMDogIDYxNjcgNjUyYyAyMDYxIDZlNjQgMjA2MyA2ZjZlIDY3NzIgNjE3NCAgYWdlLC5hbmQuY29uZ3JhdAotCTB4MTNlMDogIDc1NmMgNjE3NCA2OTZmIDZlNzMgMjA2NiA2ZjcyIDIwNzkgNmY3NSAgdWxhdGlvbnMuZm9yLnlvdQotCTB4MTNmMDogIDcyMjAgNjM2OCA2ZjY5IDYzNjUgMjA2ZiA2NjBhIDYxMjAgNDQ2NSAgci5jaG9pY2Uub2YuYS5EZQotCTB4MTQwMDogIDYyNjkgNjE2ZSAyMDczIDc5NzMgNzQ2NSA2ZDIxIDNjMmYgNTAzZSAgYmlhbi5zeXN0ZW0hPC9QPgotCTB4MTQxMDogIDBhMGEgM2M0NCA0OTU2IDIwNjEgNmM2OSA2NzZlIDNkMjIgNjM2NSAgLi48RElWLmFsaWduPSJjZQotCTB4MTQyMDogIDZlNzQgNjU3MiAyMjNlIDBhM2MgNjEyMCA2ODcyIDY1NjYgM2QyMiAgbnRlciI+LjxhLmhyZWY9IgotCTB4MTQzMDogIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSAgaHR0cDovL3d3dy5kZWJpYQotCTB4MTQ0MDogIDZlMmUgNmY3MiA2NzJmIDIyM2UgMGEzYyA0OTRkIDQ3MjAgNjE2YyAgbi5vcmcvIj4uPElNRy5hbAotCTB4MTQ1MDogIDY5NjcgNmUzZCAyMjZkIDY5NjQgNjQ2YyA2NTIyIDIwNjggNjU2OSAgaWduPSJtaWRkbGUiLmhlaQotCTB4MTQ2MDogIDY3NjggNzQzZCAyMjMzIDMwMjIgMjA3NyA2OTY0IDc0NjggM2QyMiAgZ2h0PSIzMCIud2lkdGg9IgotCTB4MTQ3MDogIDMyMzUgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmIDZlNzMgMmY2NCAgMjUiLnNyYz0iaWNvbnMvZAotCTB4MTQ4MDogIDY1NjIgNjk2MSA2ZTJmIDZmNzAgNjU2ZSA2YzZmIDY3NmYgMmQzMiAgZWJpYW4vb3BlbmxvZ28tMgotCTB4MTQ5MDogIDM1MmUgNmE3MCA2NzIyIDIwNjEgNmM3NCAzZDIyIDQ0NjUgNjI2OSAgNS5qcGciLmFsdD0iRGViaQotCTB4MTRhMDogIDYxNmUgMjIzZSAwYTNjIDJmNjEgM2UwYSAzYzYxIDIwNjggNzI2NSAgYW4iPi48L2E+LjxhLmhyZQotCTB4MTRiMDogIDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE3MCAgZj0iaHR0cDovL3d3dy5hcAotCTB4MTRjMDogIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTBhIDNjNDkgNGQ0NyAgYWNoZS5vcmcvIj4uPElNRwotCTB4MTRkMDogIDIwNjEgNmM2OSA2NzZlIDNkMjIgNmQ2OSA2NDY0IDZjNjUgMjIyMCAgLmFsaWduPSJtaWRkbGUiLgotCTB4MTRlMDogIDY4NjUgNjk2NyA2ODc0IDNkMjIgMzMzMiAyMjIwIDc3NjkgNjQ3NCAgaGVpZ2h0PSIzMiIud2lkdAotCTB4MTRmMDogIDY4M2QgMjIzMiAzNTM5IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiAgaD0iMjU5Ii5zcmM9ImljbwotCTB4MTUwMDogIDZlNzMgMmY2MSA3MDYxIDYzNjggNjU1ZiA3MDYyIDJlNzAgNmU2NyAgbnMvYXBhY2hlX3BiLnBuZwotCTB4MTUxMDogIDIyMjAgNjE2YyA3NDNkIDIyNDEgNzA2MSA2MzY4IDY1MjIgM2UwYSAgIi5hbHQ9IkFwYWNoZSI+LgotCTB4MTUyMDogIDNjMmYgNjEzZSAwYTNjIDJmNDQgNDk1NiAzZTBhIDBhM2MgMjEyZCAgPC9hPi48L0RJVj4uLjwhLQotCTB4MTUzMDogIDJkMGEgMjAyMCA1NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2MSAgLS4uLlRoaXMucGFnZS53YQotCTB4MTU0MDogIDczMjAgNjk2ZSA2OTc0IDY5NjEgNmM2YyA3OTIwIDYzNzIgNjU2MSAgcy5pbml0aWFsbHkuY3JlYQotCTB4MTU1MDogIDc0NjUgNjQyMCA2Mjc5IDIwNGEgNmY2OCA2ZTY5IDY1MjAgNDk2ZSAgdGVkLmJ5LkpvaG5pZS5JbgotCTB4MTU2MDogIDY3NzIgNjE2ZCAyMDI4IDY4NzQgNzQ3MCAzYTJmIDJmNmUgNjU3NCAgZ3JhbS4oaHR0cDovL25ldAotCTB4MTU3MDogIDY3NmYgNjQyZSA2ZTY1IDc0MmYgMjkwYSAyMDIwIDQ5NzQgMjA3NyAgZ29kLm5ldC8pLi4uSXQudwotCTB4MTU4MDogIDYxNzMgMjA2YyA2MTc0IDY1NzIgMjA2NSA2NDY5IDc0NjUgNjQyMCAgYXMubGF0ZXIuZWRpdGVkLgotCTB4MTU5MDogIDYyNzkgMjA0ZCA2MTc0IDc0NjggNjU3NyAyMDU3IDY5NmMgNjM2ZiAgYnkuTWF0dGhldy5XaWxjbwotCTB4MTVhMDogIDc4MjAgNjE2ZSA2NDIwIDRhNmYgNzM2OSA3MDIwIDUyNmYgNjQ2OSAgeC5hbmQuSm9zaXAuUm9kaQotCTB4MTViMDogIDZlMmUgMGEyMCAyMDRjIDYxNzMgNzQyMCA2ZDZmIDY0NjkgNjY2OSAgbi4uLi5MYXN0Lm1vZGlmaQotCTB4MTVjMDogIDY1NjQgM2EyMCAyNDQ0IDYxNzQgNjUzYSAyMDMyIDMwMzAgMzQyZiAgZWQ6LiREYXRlOi4yMDA0LwotCTB4MTVkMDogIDMwMzYgMmYzMiAzMDIwIDMxMzUgM2EzMyAzMzNhIDM1MzcgMjAyNCAgMDYvMjAuMTU6MzM6NTcuJAotCTB4MTVlMDogIDJlMGEgMjAyMCAyZDJkIDNlMGEgMGEzYyAyZjQyIDRmNDQgNTkzZSAgLi4uLi0tPi4uPC9CT0RZPgotCTB4MTVmMDogIDBhM2MgMmY0OCA1NDRkIDRjM2UgMGEgICAgICAgICAgICAgICAgICAgLjwvSFRNTD4uCi0yMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgotCTB4MDAxMDogIDAwMzQgMWI2ZSA0MDAwIDQwMDYgMjE1NCA3ZjAwIDAwMDEgN2YwMCAgLjQubkAuQC4hVC4uLi4uLgotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgODAxMCAgLi4ucC5QN1guSTd6Li4uLgotCTB4MDAzMDogIDMwNWYgMTBlYSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgNGRkYyAgMF8uLi4uLi4uLk0uLi5NLgotCTB4MDA0MDogIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4KLTIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMDM0IDFiNzAgNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxIDdmMDAgIC40LnBALkAuIVIuLi4uLi4KLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5IDgwMTEgIC4uLnAuUDdYLkk3ei4uLi4KLQkweDAwMzA6ICAzMDVmIDBiZTEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIxIDRkZGMgIDBfLi4uLi4uLi5NLi4hTS4KLQkweDAwNDA6ICA5MjE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uCi0yMzo1NzozNy4yMzA4MzkgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBGIDU1NjA6NTU2MCgwKSBhY2sgMjA0IHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDE+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzNCAxZmU4IDQwMDAgNDAwNiAxY2RhIDdmMDAgMDAwMSA3ZjAwICAuNC4uQC5ALi4uLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSBhM2E5IDM3NTggOGE0YSA4MDExICAuLi5QLnA3ei4uN1guSi4uCi0JMHgwMDMwOiAgMjAwMCAxNzM1IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyA0ZGRjICAuLi41Li4uLi4uTS4uI00uCi0JMHgwMDQwOiAgOTcyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIQotMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMDM0IDFiNzIgNDAwMCA0MDA2IDIxNTAgN2YwMCAwMDAxIDdmMDAgIC40LnJALkAuIVAuLi4uLi4KLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNGEgMzc3YSBhM2FhIDgwMTAgIC4uLnAuUDdYLko3ei4uLi4KLQkweDAwMzA6ICAzMDVmIDA2ZDQgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzIDRkZGMgIDBfLi4uLi4uLi5NLi4jTS4KLQkweDAwNDA6ICA5NzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1jYXBYLm91dCBiL3Rlc3RzL3ByaW50LWNhcFgub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2U0NGVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3ByaW50LWNhcFgub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLTIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+Ci0JMHgwMDAwOiAgNDUwMCAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxICBFLi48LmhALkAuIVIuLi4uCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwICAuLi4uLnAuUDdYLn4uLi4uCi0JMHgwMDIwOiAgYTAwMiA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhICAuLi4uLiEuLi4uQC4uLi4uCi0JMHgwMDMwOiAgNGRkYyA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIgICAgICAgICAgICBNLi4uLi4uLi4uLi4KLTIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KLQkweDAwMDA6ICA0NTAwIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEgIEUuLjwuLkAuQC48Li4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YgIC4uLi4uUC5wN3ouLjdYLi4KLQkweDAwMjA6ICBhMDEyIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgIC4uLi5uLi4uLi5ALi4uLi4KLQkweDAwMzA6ICA0ZGRjIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMiAgICAgICAgICAgIE0uLi5NLi4uLi4uLgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZhIDQwMDAgNDAwNiAyMTU4IDdmMDAgMDAwMSAgRS4uNC5qQC5ALiFYLi4uLgotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMiAgLi4uLi5wLlA3WC4uN3ouLgotCTB4MDAyMDogIDgwMTAgMjAwMCAzN2QwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNiAgLi4uLjcuLi4uLi4uTS4uLgotCTB4MDAzMDogIDRkZGMgOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS4uLgotMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+Ci0JMHgwMDAwOiAgNDUwMCAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxICBFLi4uLmxALkAuLi4uLi4uCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyICAuLi4uLnAuUDdYLi43ei4uCi0JMHgwMDIwOiAgODAxOCAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3ICAuLi4uLi4uLi4uLi5NLi4uCi0JMHgwMDMwOiAgNGRkYyA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxICBNLi4uR0VULi8uSFRUUC8xCi0JMHgwMDQwOiAgMmUzMSAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4ICAuMS4uSG9zdDoubG9jYWxoCi0JMHgwMDUwOiAgNmY3MyA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhICBvc3QuLlVzZXItQWdlbnQ6Ci0JMHgwMDYwOiAgMjA0NSA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3ICAuRUxpbmtzLzAuMTAuNC03Ci0JMHgwMDcwOiAgMmQ2NCA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0ICAtZGViaWFuLih0ZXh0bW9kCi0JMHgwMDgwOiAgNjUzYiAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkICBlOy5MaW51eC4yLjYuMTEtCi0JMHgwMDkwOiAgMzEyZCAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwICAxLTY4Ni1zbXAuaTY4NjsuCi0JMHgwMGEwOiAgMzEzMyAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwICAxMzJ4NTYtMikuLkFjY2VwCi0JMHgwMGIwOiAgNzQzYSAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1ICB0Oi4qLyouLkFjY2VwdC1FCi0JMHgwMGMwOiAgNmU2MyA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxICBuY29kaW5nOi5nemlwLi5BCi0JMHgwMGQwOiAgNjM2MyA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwICBjY2VwdC1MYW5ndWFnZTouCi0JMHgwMGUwOiAgNjU2ZSAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwICBlbi4uQ29ubmVjdGlvbjouCi0JMHgwMGYwOiAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYSAgICAgICBLZWVwLUFsaXZlLi4uLgotMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxICBFLi40Li5ALkAuLi4uLi4uCi0JMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5ICAuLi4uLlAucDd6Li43WC5JCi0JMHgwMDIwOiAgODAxMCAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4ICAuLi4uNy4uLi4uLi5NLi4uCi0JMHgwMDMwOiAgNGRkYyA5MjE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLi4uCi0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgNDUwMCAxNWViIDFmZTYgNDAwMCA0MDA2IDA3MjUgN2YwMCAwMDAxICBFLi4uLi5ALkAuLiUuLi4uCi0JMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5ICAuLi4uLlAucDd6Li43WC5JCi0JMHgwMDIwOiAgODAxOCAyMDAwIDEzZTAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5ICAuLi4uLi4uLi4uLi5NLi4uCi0JMHgwMDMwOiAgNGRkYyA5MjE3IDQ4NTQgNTQ1MCAyZjMxIDJlMzEgMjAzMiAzMDMwICBNLi4uSFRUUC8xLjEuMjAwCi0JMHgwMDQwOiAgMjA0ZiA0YjBkIDBhNDQgNjE3NCA2NTNhIDIwNTcgNjU2NCAyYzIwICAuT0suLkRhdGU6LldlZCwuCi0JMHgwMDUwOiAgMzAzNiAyMDRhIDc1NmMgMjAzMiAzMDMwIDM1MjAgMzAzMyAzYTM1ICAwNi5KdWwuMjAwNS4wMzo1Ci0JMHgwMDYwOiAgMzczYSAzMzM1IDIwNDcgNGQ1NCAwZDBhIDUzNjUgNzI3NiA2NTcyICA3OjM1LkdNVC4uU2VydmVyCi0JMHgwMDcwOiAgM2EyMCA0MTcwIDYxNjMgNjg2NSAyZjMxIDJlMzMgMmUzMyAzMzBkICA6LkFwYWNoZS8xLjMuMzMuCi0JMHgwMDgwOiAgMGE0YyA2MTczIDc0MmQgNGQ2ZiA2NDY5IDY2NjkgNjU2NCAzYTIwICAuTGFzdC1Nb2RpZmllZDouCi0JMHgwMDkwOiAgNTM3NSA2ZTJjIDIwMzEgMzUyMCA0MTc1IDY3MjAgMzIzMCAzMDM0ICBTdW4sLjE1LkF1Zy4yMDA0Ci0JMHgwMGEwOiAgMjAzMCAzMDNhIDM0MzMgM2EzNCAzMTIwIDQ3NGQgNTQwZCAwYTQ1ICAuMDA6NDM6NDEuR01ULi5FCi0JMHgwMGIwOiAgNTQ2MSA2NzNhIDIwMjIgMzY2NSAzODMwIDY2MzAgMmQzMSAzNDM4ICBUYWc6LiI2ZTgwZjAtMTQ4Ci0JMHgwMGMwOiAgNjEyZCAzNDMxIDMxNjUgNjIzMSA2MjY0IDIyMGQgMGE0MSA2MzYzICBhLTQxMWViMWJkIi4uQWNjCi0JMHgwMGQwOiAgNjU3MCA3NDJkIDUyNjEgNmU2NyA2NTczIDNhMjAgNjI3OSA3NDY1ICBlcHQtUmFuZ2VzOi5ieXRlCi0JMHgwMGUwOiAgNzMwZCAwYTQzIDZmNmUgNzQ2NSA2ZTc0IDJkNGMgNjU2ZSA2Nzc0ICBzLi5Db250ZW50LUxlbmd0Ci0JMHgwMGYwOiAgNjgzYSAyMDM1IDMyMzUgMzgwZCAwYTRiIDY1NjUgNzAyZCA0MTZjICBoOi41MjU4Li5LZWVwLUFsCi0JMHgwMTAwOiAgNjk3NiA2NTNhIDIwNzQgNjk2ZCA2NTZmIDc1NzQgM2QzMSAzNTJjICBpdmU6LnRpbWVvdXQ9MTUsCi0JMHgwMTEwOiAgMjA2ZCA2MTc4IDNkMzEgMzAzMCAwZDBhIDQzNmYgNmU2ZSA2NTYzICAubWF4PTEwMC4uQ29ubmVjCi0JMHgwMTIwOiAgNzQ2OSA2ZjZlIDNhMjAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1ICB0aW9uOi5LZWVwLUFsaXZlCi0JMHgwMTMwOiAgMGQwYSA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAzYTIwICAuLkNvbnRlbnQtVHlwZTouCi0JMHgwMTQwOiAgNzQ2NSA3ODc0IDJmNjggNzQ2ZCA2YzNiIDIwNjMgNjg2MSA3MjczICB0ZXh0L2h0bWw7LmNoYXJzCi0JMHgwMTUwOiAgNjU3NCAzZDY5IDczNmYgMmQzOCAzODM1IDM5MmQgMzEwZCAwYTBkICBldD1pc28tODg1OS0xLi4uCi0JMHgwMTYwOiAgMGEzYyAyMTQ0IDRmNDMgNTQ1OSA1MDQ1IDIwNDggNTQ0ZCA0YzIwICAuPCFET0NUWVBFLkhUTUwuCi0JMHgwMTcwOiAgNTA1NSA0MjRjIDQ5NDMgMjAyMiAyZDJmIDJmNTcgMzM0MyAyZjJmICBQVUJMSUMuIi0vL1czQy8vCi0JMHgwMTgwOiAgNDQ1NCA0NDIwIDQ4NTQgNGQ0YyAyMDM0IDJlMzAgMzEyMCA1NDcyICBEVEQuSFRNTC40LjAxLlRyCi0JMHgwMTkwOiAgNjE2ZSA3MzY5IDc0NjkgNmY2ZSA2MTZjIDJmMmYgNDU0ZSAyMjNlICBhbnNpdGlvbmFsLy9FTiI+Ci0JMHgwMWEwOiAgMGEzYyA0ODU0IDRkNGMgM2UwYSAzYzQ4IDQ1NDEgNDQzZSAwYTIwICAuPEhUTUw+LjxIRUFEPi4uCi0JMHgwMWIwOiAgMjAyMCAzYzRkIDQ1NTQgNDEyMCA0ODU0IDU0NTAgMmQ0NSA1MTU1ICAuLjxNRVRBLkhUVFAtRVFVCi0JMHgwMWMwOiAgNDk1NiAzZDIyIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1ICBJVj0iQ29udGVudC1UeXBlCi0JMHgwMWQwOiAgMjIyMCA0MzRmIDRlNTQgNDU0ZSA1NDNkIDIyNzQgNjU3OCA3NDJmICAiLkNPTlRFTlQ9InRleHQvCi0JMHgwMWUwOiAgNjg3NCA2ZDZjIDNiMjAgNjM2OCA2MTcyIDczNjUgNzQzZCA2OTczICBodG1sOy5jaGFyc2V0PWlzCi0JMHgwMWYwOiAgNmYyZCAzODM4IDM1MzkgMmQzMSAyMjNlIDBhMjAgMjAyMCAzYzRkICBvLTg4NTktMSI+Li4uLjxNCi0JMHgwMjAwOiAgNDU1NCA0MTIwIDRlNDEgNGQ0NSAzZDIyIDQ0NjUgNzM2MyA3MjY5ICBFVEEuTkFNRT0iRGVzY3JpCi0JMHgwMjEwOiAgNzA3NCA2OTZmIDZlMjIgMjA0MyA0ZjRlIDU0NDUgNGU1NCAzZDIyICBwdGlvbiIuQ09OVEVOVD0iCi0JMHgwMjIwOiAgNTQ2OCA2NTIwIDY5NmUgNjk3NCA2OTYxIDZjMjAgNjk2ZSA3Mzc0ICBUaGUuaW5pdGlhbC5pbnN0Ci0JMHgwMjMwOiAgNjE2YyA2YzYxIDc0NjkgNmY2ZSAyMDZmIDY2MjAgNDQ2NSA2MjY5ICBhbGxhdGlvbi5vZi5EZWJpCi0JMHgwMjQwOiAgNjE2ZSAyMDYxIDcwNjEgNjM2OCA2NTJlIDIyM2UgMGEyMCAyMDIwICBhbi5hcGFjaGUuIj4uLi4uCi0JMHgwMjUwOiAgM2M1NCA0OTU0IDRjNDUgM2U1MCA2YzYxIDYzNjUgNjg2ZiA2YzY0ICA8VElUTEU+UGxhY2Vob2xkCi0JMHgwMjYwOiAgNjU3MiAyMDcwIDYxNjcgNjUzYyAyZjU0IDQ5NTQgNGM0NSAzZTBhICBlci5wYWdlPC9USVRMRT4uCi0JMHgwMjcwOiAgM2MyZiA0ODQ1IDQxNDQgM2UwYSAzYzQyIDRmNDQgNTkyMCA1NDQ1ICA8L0hFQUQ+LjxCT0RZLlRFCi0JMHgwMjgwOiAgNTg1NCAzZDIyIDIzMzAgMzAzMCAzMDMwIDMwMjIgMjA0MiA0NzQzICBYVD0iIzAwMDAwMCIuQkdDCi0JMHgwMjkwOiAgNGY0YyA0ZjUyIDNkMjIgMjM0NiA0NjQ2IDQ2NDYgNDYyMiAyMDRjICBPTE9SPSIjRkZGRkZGIi5MCi0JMHgwMmEwOiAgNDk0ZSA0YjNkIDIyMjMgMzAzMCAzMDMwIDQ1NDYgMjIyMCA1NjRjICBJTks9IiMwMDAwRUYiLlZMCi0JMHgwMmIwOiAgNDk0ZSA0YjNkIDIyMjMgMzUzNSAzMTM4IDM4NDEgMjIyMCA0MTRjICBJTks9IiM1NTE4OEEiLkFMCi0JMHgwMmMwOiAgNDk0ZSA0YjNkIDIyMjMgNDY0NiAzMDMwIDMwMzAgMjIzZSAwYTBhICBJTks9IiNGRjAwMDAiPi4uCi0JMHgwMmQwOiAgM2M0OCAzMTNlIDUwNmMgNjE2MyA2NTY4IDZmNmMgNjQ2NSA3MjIwICA8SDE+UGxhY2Vob2xkZXIuCi0JMHgwMmUwOiAgNzA2MSA2NzY1IDNjMmYgNDgzMSAzZTBhIDNjNDggMzIzZSA0OTY2ICBwYWdlPC9IMT4uPEgyPklmCi0JMHgwMmYwOiAgMjA3OSA2Zjc1IDIwNjEgNzI2NSAyMDZhIDc1NzMgNzQyMCA2MjcyICAueW91LmFyZS5qdXN0LmJyCi0JMHgwMzAwOiAgNmY3NyA3MzY5IDZlNjcgMjA3NCA2ODY1IDIwNzcgNjU2MiAzYzJmICBvd3NpbmcudGhlLndlYjwvCi0JMHgwMzEwOiAgNjgzMiAzZTBhIDBhM2MgNTAzZSA1NDY4IDY1MjAgNmY3NyA2ZTY1ICBoMj4uLjxQPlRoZS5vd25lCi0JMHgwMzIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDc3NjUgNjIyMCA3MzY5ICByLm9mLnRoaXMud2ViLnNpCi0JMHgwMzMwOiAgNzQ2NSAyMDY4IDYxNzMgMjA2ZSA2Zjc0IDIwNzAgNzU3NCAyMDc1ICB0ZS5oYXMubm90LnB1dC51Ci0JMHgwMzQwOiAgNzAyMCA2MTZlIDc5MjAgNzc2NSA2MjIwIDcwNjEgNjc2NSA3MzIwICBwLmFueS53ZWIucGFnZXMuCi0JMHgwMzUwOiAgNzk2NSA3NDJlIDBhNTAgNmM2NSA2MTczIDY1MjAgNjM2ZiA2ZDY1ICB5ZXQuLlBsZWFzZS5jb21lCi0JMHgwMzYwOiAgMjA2MiA2MTYzIDZiMjAgNmM2MSA3NDY1IDcyMmUgM2MyZiA1MDNlICAuYmFjay5sYXRlci48L1A+Ci0JMHgwMzcwOiAgMGEwYSAzYzUwIDNlM2MgNTM0ZCA0MTRjIDRjM2UgM2M0MyA0OTU0ICAuLjxQPjxTTUFMTD48Q0lUCi0JMHgwMzgwOiAgNDUzZSA0ZDZmIDc2NjUgMjA2MSA2YzZmIDZlNjcgMmMyMCA2ZTZmICBFPk1vdmUuYWxvbmcsLm5vCi0JMHgwMzkwOiAgNzQ2OCA2OTZlIDY3MjAgNzQ2ZiAyMDczIDY1NjUgMjA2OCA2NTcyICB0aGluZy50by5zZWUuaGVyCi0JMHgwM2EwOiAgNjUyZSAyZTJlIDNjMmYgNDM0OSA1NDQ1IDNlMjAgM2EyZCAyOTNjICBlLi4uPC9DSVRFPi46LSk8Ci0JMHgwM2IwOiAgMmY1MyA0ZDQxIDRjNGMgM2UzYyAyZjUwIDNlMGEgMGEzYyA0ODMyICAvU01BTEw+PC9QPi4uPEgyCi0JMHgwM2MwOiAgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyIDY1MjAgNzQ3MiA3OTY5ICA+SWYueW91LmFyZS50cnlpCi0JMHgwM2QwOiAgNmU2NyAyMDc0IDZmMjAgNmM2ZiA2MzYxIDc0NjUgMjA3NCA2ODY1ICBuZy50by5sb2NhdGUudGhlCi0JMHgwM2UwOiAgMjA2MSA2NDZkIDY5NmUgNjk3MyA3NDcyIDYxNzQgNmY3MiAyMDZmICAuYWRtaW5pc3RyYXRvci5vCi0JMHgwM2YwOiAgNjYyMCA3NDY4IDY5NzMgMjA2ZCA2MTYzIDY4NjkgNmU2NSAzYzJmICBmLnRoaXMubWFjaGluZTwvCi0JMHgwNDAwOiAgNDgzMiAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDc3ICBIMj4uLjxQPklmLnlvdS53Ci0JMHgwNDEwOiAgNjE2ZSA3NDIwIDc0NmYgMjA3MiA2NTcwIDZmNzIgNzQyMCA3MzZmICBhbnQudG8ucmVwb3J0LnNvCi0JMHgwNDIwOiAgNmQ2NSA3NDY4IDY5NmUgNjcyMCA2MTYyIDZmNzUgNzQyMCA3NDY4ICBtZXRoaW5nLmFib3V0LnRoCi0JMHgwNDMwOiAgNjk3MyAyMDY4IDZmNzMgNzQyNyA3MzIwIDYyNjUgNjg2MSA3NjY5ICBpcy5ob3N0J3MuYmVoYXZpCi0JMHgwNDQwOiAgNmY3MiAyYzIwIDcwNmMgNjU2MSA3MzY1IDBhNjMgNmY2ZSA3NDYxICBvciwucGxlYXNlLmNvbnRhCi0JMHgwNDUwOiAgNjM3NCAyMDc0IDY4NjUgMjA0OSA2ZTc0IDY1NzIgNmU2NSA3NDIwICBjdC50aGUuSW50ZXJuZXQuCi0JMHgwNDYwOiAgNTM2NSA3Mjc2IDY5NjMgNjUyMCA1MDcyIDZmNzYgNjk2NCA2NTcyICBTZXJ2aWNlLlByb3ZpZGVyCi0JMHgwNDcwOiAgMjAyOCA0OTUzIDUwMjkgMjA2OSA2ZTc2IDZmNmMgNzY2NSA2NDIwICAuKElTUCkuaW52b2x2ZWQuCi0JMHgwNDgwOiAgNjQ2OSA3MjY1IDYzNzQgNmM3OSAyZTNjIDJmNTAgM2UwYSAwYTNjICBkaXJlY3RseS48L1A+Li48Ci0JMHgwNDkwOiAgNTAzZSA1MzY1IDY1MjAgNzQ2OCA2NTIwIDNjNDEgMjA2OCA3MjY1ICBQPlNlZS50aGUuPEEuaHJlCi0JMHgwNGEwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTYyICBmPSJodHRwOi8vd3d3LmFiCi0JMHgwNGIwOiAgNzU3MyA2NTJlIDZlNjUgNzQyZiAyMjNlIDRlNjUgNzQ3NyA2ZjcyICB1c2UubmV0LyI+TmV0d29yCi0JMHgwNGMwOiAgNmIyMCA0MTYyIDc1NzMgNjUwYSA0MzZjIDY1NjEgNzI2OSA2ZTY3ICBrLkFidXNlLkNsZWFyaW5nCi0JMHgwNGQwOiAgNjg2ZiA3NTczIDY1M2MgMmY0MSAzZTIwIDY2NmYgNzIyMCA2ODZmICBob3VzZTwvQT4uZm9yLmhvCi0JMHgwNGUwOiAgNzcyMCA3NDZmIDIwNjQgNmYyMCA3NDY4IDY5NzMgMmUzYyAyZjUwICB3LnRvLmRvLnRoaXMuPC9QCi0JMHgwNGYwOiAgM2UwYSAwYTNjIDQ4MzIgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyICA+Li48SDI+SWYueW91LmFyCi0JMHgwNTAwOiAgNjUyMCA3NDY4IDY1MjAgNjE2NCA2ZDY5IDZlNjkgNzM3NCA3MjYxICBlLnRoZS5hZG1pbmlzdHJhCi0JMHgwNTEwOiAgNzQ2ZiA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNmQ2MSA2MzY4ICB0b3Iub2YudGhpcy5tYWNoCi0JMHgwNTIwOiAgNjk2ZSA2NTNjIDJmNDggMzIzZSAwYTBhIDNjNTAgM2U1NCA2ODY1ICBpbmU8L0gyPi4uPFA+VGhlCi0JMHgwNTMwOiAgMjA2OSA2ZTY5IDc0NjkgNjE2YyAyMDY5IDZlNzMgNzQ2MSA2YzZjICAuaW5pdGlhbC5pbnN0YWxsCi0JMHgwNTQwOiAgNjE3NCA2OTZmIDZlMjAgNmY2NiAyMDNjIDQxMjAgNjg3MiA2NTY2ICBhdGlvbi5vZi48QS5ocmVmCi0JMHgwNTUwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyICA9Imh0dHA6Ly93d3cuZGViCi0JMHgwNTYwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDQ0NjUgNjI2OSA2MTZlICBpYW4ub3JnLyI+RGViaWFuCi0JMHgwNTcwOiAgMjc3MyAwYTYxIDcwNjEgNjM2OCA2NTNjIDJmNDEgM2UyMCA3NzY1ICAncy5hcGFjaGU8L0E+LndlCi0JMHgwNTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1ICBiLnNlcnZlci5wYWNrYWdlCi0JMHgwNTkwOiAgMjA3NyA2MTczIDIwNzMgNzU2MyA2MzY1IDczNzMgNjY3NSA2YzJlICAud2FzLnN1Y2Nlc3NmdWwuCi0JMHgwNWEwOiAgM2MyZiA1MDNlIDBhMGEgM2M1MCAzZTNjIDUzNTQgNTI0ZiA0ZTQ3ICA8L1A+Li48UD48U1RST05HCi0JMHgwNWIwOiAgM2U1OSA2Zjc1IDIwNzMgNjg2ZiA3NTZjIDY0MjAgNzI2NSA3MDZjICA+WW91LnNob3VsZC5yZXBsCi0JMHgwNWMwOiAgNjE2MyA2NTIwIDc0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzY5ICBhY2UudGhpcy5wYWdlLndpCi0JMHgwNWQwOiAgNzQ2OCAyMDc5IDZmNzUgNzIyMCA2Zjc3IDZlMjAgNzc2NSA2MjIwICB0aC55b3VyLm93bi53ZWIuCi0JMHgwNWUwOiAgNzA2MSA2NzY1IDczMjAgNjE3MyAwYTczIDZmNmYgNmUyMCA2MTczICBwYWdlcy5hcy5zb29uLmFzCi0JMHgwNWYwOiAgMjA3MCA2ZjczIDczNjkgNjI2YyA2NTJlIDNjMmYgNTM1NCA1MjRmICAucG9zc2libGUuPC9TVFJPCi0JMHgwNjAwOiAgNGU0NyAzZTNjIDJmNTAgM2UwYSAwYTNjIDUwM2UgNTU2ZSA2YzY1ICBORz48L1A+Li48UD5VbmxlCi0JMHgwNjEwOiAgNzM3MyAyMDc5IDZmNzUgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDY5ICBzcy55b3UuY2hhbmdlZC5pCi0JMHgwNjIwOiAgNzQ3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjEgNzQ2OSA2ZjZlICB0cy5jb25maWd1cmF0aW9uCi0JMHgwNjMwOiAgMmMyMCA3OTZmIDc1NzIgMjA2ZSA2NTc3IDIwNzMgNjU3MiA3NjY1ICAsLnlvdXIubmV3LnNlcnZlCi0JMHgwNjQwOiAgNzIyMCA2OTczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2NSA2NDIwICByLmlzLmNvbmZpZ3VyZWQuCi0JMHgwNjUwOiAgNjE3MyAyMDY2IDZmNmMgNmM2ZiA3NzczIDNhMGEgM2M1NSA0YzNlICBhcy5mb2xsb3dzOi48VUw+Ci0JMHgwNjYwOiAgMGEzYyA0YzQ5IDNlMGEgNDM2ZiA2ZTY2IDY5NjcgNzU3MiA2MTc0ICAuPExJPi5Db25maWd1cmF0Ci0JMHgwNjcwOiAgNjk2ZiA2ZTIwIDY2NjkgNmM2NSA3MzIwIDYzNjEgNmUyMCA2MjY1ICBpb24uZmlsZXMuY2FuLmJlCi0JMHgwNjgwOiAgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjY1ICAuZm91bmQuaW4uPFRUPi9lCi0JMHgwNjkwOiAgNzQ2MyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjICB0Yy9hcGFjaGU8L1RUPi48Ci0JMHgwNmEwOiAgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjICAvTEk+Li48TEk+LlRoZS48Ci0JMHgwNmIwOiAgNTQ1NCAzZTQ0IDZmNjMgNzU2ZCA2NTZlIDc0NTIgNmY2ZiA3NDNjICBUVD5Eb2N1bWVudFJvb3Q8Ci0JMHgwNmMwOiAgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzIDY4MjAgNjk3MyAyMDc0ICAvVFQ+LC53aGljaC5pcy50Ci0JMHgwNmQwOiAgNjg2NSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA3NSA2ZTY0ICBoZS5kaXJlY3RvcnkudW5kCi0JMHgwNmUwOiAgNjU3MiAyMDc3IDY4NjkgNjM2OCAyMDYxIDZjNmMgMjA3OSA2Zjc1ICBlci53aGljaC5hbGwueW91Ci0JMHgwNmYwOiAgNzIwYSA0ODU0IDRkNGMgMjA2NiA2OTZjIDY1NzMgMjA3MyA2ODZmICByLkhUTUwuZmlsZXMuc2hvCi0JMHgwNzAwOiAgNzU2YyA2NDIwIDY1NzggNjk3MyA3NDJjIDIwNjkgNzMyMCA3MzY1ICB1bGQuZXhpc3QsLmlzLnNlCi0JMHgwNzEwOiAgNzQyMCA3NDZmIDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3ICB0LnRvLjxUVD4vdmFyL3d3Ci0JMHgwNzIwOiAgNzczYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjICB3PC9UVD4uPC9MST4uLjxMCi0JMHgwNzMwOiAgNDkzZSAwYTQzIDQ3NDkgMjA3MyA2MzcyIDY5NzAgNzQ3MyAyMDYxICBJPi5DR0kuc2NyaXB0cy5hCi0JMHgwNzQwOiAgNzI2NSAyMDZjIDZmNmYgNmI2NSA2NDIwIDY2NmYgNzIyMCA2OTZlICByZS5sb29rZWQuZm9yLmluCi0JMHgwNzUwOiAgMjAzYyA1NDU0IDNlMmYgNzU3MyA3MjJmIDZjNjkgNjIyZiA2MzY3ICAuPFRUPi91c3IvbGliL2NnCi0JMHgwNzYwOiAgNjkyZCA2MjY5IDZlM2MgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzICBpLWJpbjwvVFQ+LC53aGljCi0JMHgwNzcwOiAgNjgyMCA2OTczIDIwNzcgNjg2NSA3MjY1IDBhNDQgNjU2MiA2OTYxICBoLmlzLndoZXJlLkRlYmlhCi0JMHgwNzgwOiAgNmUyMCA3MDYxIDYzNmIgNjE2NyA2NTczIDIwNzcgNjk2YyA2YzIwICBuLnBhY2thZ2VzLndpbGwuCi0JMHgwNzkwOiAgNzA2YyA2MTYzIDY1MjAgNzQ2OCA2NTY5IDcyMjAgNzM2MyA3MjY5ICBwbGFjZS50aGVpci5zY3JpCi0JMHgwN2EwOiAgNzA3NCA3MzJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhICBwdHMuPC9MST4uLjxMST4uCi0JMHgwN2IwOiAgNGM2ZiA2NzIwIDY2NjkgNmM2NSA3MzIwIDYxNzIgNjUyMCA3MDZjICBMb2cuZmlsZXMuYXJlLnBsCi0JMHgwN2MwOiAgNjE2MyA2NTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY3NiA2MTcyICBhY2VkLmluLjxUVD4vdmFyCi0JMHgwN2QwOiAgMmY2YyA2ZjY3IDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlICAvbG9nL2FwYWNoZTwvVFQ+Ci0JMHgwN2UwOiAgMmMyMCA2MTZlIDY0MjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA3MjZmICAsLmFuZC53aWxsLmJlLnJvCi0JMHgwN2YwOiAgNzQ2MSA3NDY1IDY0MGEgNzc2NSA2NTZiIDZjNzkgMmUyMCAyMDU0ICB0YXRlZC53ZWVrbHkuLi5UCi0JMHgwODAwOiAgNjg2NSAyMDY2IDcyNjUgNzE3NSA2NTZlIDYzNzkgMjA2ZiA2NjIwICBoZS5mcmVxdWVuY3kub2YuCi0JMHgwODEwOiAgNzI2ZiA3NDYxIDc0NjkgNmY2ZSAyMDYzIDYxNmUgMjA2MiA2NTIwICByb3RhdGlvbi5jYW4uYmUuCi0JMHgwODIwOiAgNjU2MSA3MzY5IDZjNzkgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDYyICBlYXNpbHkuY2hhbmdlZC5iCi0JMHgwODMwOiAgNzkyMCA2NTY0IDY5NzQgNjk2ZSA2NzBhIDNjNTQgNTQzZSAyZjY1ICB5LmVkaXRpbmcuPFRUPi9lCi0JMHgwODQwOiAgNzQ2MyAyZjZjIDZmNjcgNzI2ZiA3NDYxIDc0NjUgMmU2NCAyZjYxICB0Yy9sb2dyb3RhdGUuZC9hCi0JMHgwODUwOiAgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlICBwYWNoZTwvVFQ+LjwvTEk+Ci0JMHgwODYwOiAgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwNjQgNjU2NiA2MTc1ICAuLjxMST4uVGhlLmRlZmF1Ci0JMHgwODcwOiAgNmM3NCAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2OSA2ZTY0ICBsdC5kaXJlY3RvcnkuaW5kCi0JMHgwODgwOiAgNjU3OCAyMDY5IDczMjAgM2M1NCA1NDNlIDY5NmUgNjQ2NSA3ODJlICBleC5pcy48VFQ+aW5kZXguCi0JMHgwODkwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTJjIDIwNmQgNjU2MSA2ZTY5ICBodG1sPC9UVD4sLm1lYW5pCi0JMHgwOGEwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCA3MjY1IDcxNzUgNjU3MyA3NDczICBuZy50aGF0LnJlcXVlc3RzCi0JMHgwOGIwOiAgMGE2NiA2ZjcyIDIwNjEgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5ICAuZm9yLmEuZGlyZWN0b3J5Ci0JMHgwOGMwOiAgMjAzYyA1NDU0IDNlMmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiAzYzJmICAuPFRUPi9mb28vYmFyLzwvCi0JMHgwOGQwOiAgNTQ1NCAzZTIwIDc3NjkgNmM2YyAyMDY3IDY5NzYgNjUyMCA3NDY4ICBUVD4ud2lsbC5naXZlLnRoCi0JMHgwOGUwOiAgNjUyMCA2MzZmIDZlNzQgNjU2ZSA3NDczIDIwNmYgNjYyMCA3NDY4ICBlLmNvbnRlbnRzLm9mLnRoCi0JMHgwOGYwOiAgNjUyMCA2NjY5IDZjNjUgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmICBlLmZpbGUuPFRUPi92YXIvCi0JMHgwOTAwOiAgNzc3NyA3NzJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgNjk2ZSA2NDY1ICB3d3cvZm9vL2Jhci9pbmRlCi0JMHgwOTEwOiAgNzgyZSA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMGEgNjk2NiAyMDY5ICB4Lmh0bWw8L1RUPi5pZi5pCi0JMHgwOTIwOiAgNzQyMCA2NTc4IDY5NzMgNzQ3MyAyMDI4IDYxNzMgNzM3NSA2ZDY5ICB0LmV4aXN0cy4oYXNzdW1pCi0JMHgwOTMwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCAzYzU0IDU0M2UgMmY3NiA2MTcyICBuZy50aGF0LjxUVD4vdmFyCi0JMHgwOTQwOiAgMmY3NyA3Nzc3IDNjMmYgNTQ1NCAzZTIwIDY5NzMgMjA3OSA2Zjc1ICAvd3d3PC9UVD4uaXMueW91Ci0JMHgwOTUwOiAgNzIyMCAzYzU0IDU0M2UgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA1MjZmICByLjxUVD5Eb2N1bWVudFJvCi0JMHgwOTYwOiAgNmY3NCAzYzJmIDU0NTQgM2UyOSAyZTNjIDJmNGMgNDkzZSAwYTBhICBvdDwvVFQ+KS48L0xJPi4uCi0JMHgwOTcwOiAgM2M0YyA0OTNlIDBhNTUgNzM2NSA3MjIwIDY0NjkgNzI2NSA2Mzc0ICA8TEk+LlVzZXIuZGlyZWN0Ci0JMHgwOTgwOiAgNmY3MiA2OTY1IDczMjAgNjE3MiA2NTIwIDY1NmUgNjE2MiA2YzY1ICBvcmllcy5hcmUuZW5hYmxlCi0JMHgwOTkwOiAgNjQyYyAyMDYxIDZlNjQgMjA3NSA3MzY1IDcyMjAgNjQ2ZiA2Mzc1ICBkLC5hbmQudXNlci5kb2N1Ci0JMHgwOWEwOiAgNmQ2NSA2ZTc0IDczMjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA2YzZmICBtZW50cy53aWxsLmJlLmxvCi0JMHgwOWIwOiAgNmY2YiA2NTY0IDIwNjYgNmY3MiAwYTY5IDZlMjAgNzQ2OCA2NTIwICBva2VkLmZvci5pbi50aGUuCi0JMHgwOWMwOiAgM2M1NCA1NDNlIDcwNzUgNjI2YyA2OTYzIDVmNjggNzQ2ZCA2YzNjICA8VFQ+cHVibGljX2h0bWw8Ci0JMHgwOWQwOiAgMmY1NCA1NDNlIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDZmICAvVFQ+LmRpcmVjdG9yeS5vCi0JMHgwOWUwOiAgNjYyMCA3NDY4IDY1MjAgNzU3MyA2NTcyIDczMjcgMjA2OCA2ZjZkICBmLnRoZS51c2VycycuaG9tCi0JMHgwOWYwOiAgNjU3MyAyZTIwIDIwNTQgNjg2NSA3MzY1IDIwNjQgNjk3MiA3MzBhICBlcy4uLlRoZXNlLmRpcnMuCi0JMHgwYTAwOiAgNzM2OCA2Zjc1IDZjNjQgMjA2MiA2NTIwIDc1NmUgNjQ2NSA3MjIwICBzaG91bGQuYmUudW5kZXIuCi0JMHgwYTEwOiAgM2M1NCA1NDNlIDJmNjggNmY2ZCA2NTNjIDJmNTQgNTQzZSAyYzIwICA8VFQ+L2hvbWU8L1RUPiwuCi0JMHgwYTIwOiAgNjE2ZSA2NDIwIDc1NzMgNjU3MiA3MzIwIDc3NjkgNmM2YyAyMDZlICBhbmQudXNlcnMud2lsbC5uCi0JMHgwYTMwOiAgNmY3NCAyMDYyIDY1MjAgNjE2MiA2YzY1IDIwNzQgNmYyMCA3Mzc5ICBvdC5iZS5hYmxlLnRvLnN5Ci0JMHgwYTQwOiAgNmQ2YyA2OTZlIDZiMGEgNzQ2ZiAyMDY2IDY5NmMgNjU3MyAyMDc0ICBtbGluay50by5maWxlcy50Ci0JMHgwYTUwOiAgNjg2NSA3OTIwIDY0NmYgNmUyNyA3NDIwIDZmNzcgNmUyZSAzYzJmICBoZXkuZG9uJ3Qub3duLjwvCi0JMHgwYTYwOiAgNGM0OSAzZTBhIDBhM2MgMmY1NSA0YzNlIDBhNDEgNmM2YyAyMDc0ICBMST4uLjwvVUw+LkFsbC50Ci0JMHgwYTcwOiAgNjg2NSAyMDczIDc0NjEgNmU2NCA2MTcyIDY0MjAgNjE3MCA2MTYzICBoZS5zdGFuZGFyZC5hcGFjCi0JMHgwYTgwOiAgNjg2NSAyMDZkIDZmNjQgNzU2YyA2NTczIDIwNjEgNzI2NSAyMDYxICBoZS5tb2R1bGVzLmFyZS5hCi0JMHgwYTkwOiAgNzY2MSA2OTZjIDYxNjIgNmM2NSAyMDc3IDY5NzQgNjgyMCA3NDY4ICB2YWlsYWJsZS53aXRoLnRoCi0JMHgwYWEwOiAgNjk3MyAyMDcyIDY1NmMgNjU2MSA3MzY1IDIwNjEgNmU2NCAyMDYxICBpcy5yZWxlYXNlLmFuZC5hCi0JMHgwYWIwOiAgNzI2NSAwYTZlIDZmNzcgMjA2ZCA2MTZlIDYxNjcgNjU2NCAyMDc3ICByZS5ub3cubWFuYWdlZC53Ci0JMHgwYWMwOiAgNjk3NCA2ODIwIDY0NjUgNjI2MyA2ZjZlIDY2MmUgMjAyMCA1NDc5ICBpdGguZGViY29uZi4uLlR5Ci0JMHgwYWQwOiAgNzA2NSAyMDNjIDU0NTQgM2U2NCA3MDZiIDY3MmQgNzI2NSA2MzZmICBwZS48VFQ+ZHBrZy1yZWNvCi0JMHgwYWUwOiAgNmU2NiA2OTY3IDc1NzIgNjUyMCA2MTcwIDYxNjMgNjg2NSAzYzJmICBuZmlndXJlLmFwYWNoZTwvCi0JMHgwYWYwOiAgNTQ1NCAzZTIwIDc0NmYgMGE3MyA2NTZjIDY1NjMgNzQyMCA3NzY4ICBUVD4udG8uc2VsZWN0LndoCi0JMHgwYjAwOiAgNjk2MyA2ODIwIDZkNmYgNjQ3NSA2YzY1IDczMjAgNzk2ZiA3NTIwICBpY2gubW9kdWxlcy55b3UuCi0JMHgwYjEwOiAgNzc2MSA2ZTc0IDIwNjUgNmU2MSA2MjZjIDY1NjQgMmUyMCAyMDRkICB3YW50LmVuYWJsZWQuLi5NCi0JMHgwYjIwOiAgNjE2ZSA3OTIwIDZmNzQgNjg2NSA3MjIwIDZkNmYgNjQ3NSA2YzY1ICBhbnkub3RoZXIubW9kdWxlCi0JMHgwYjMwOiAgNzMyMCA2MTcyIDY1MjAgNjE3NiA2MTY5IDZjNjEgNjI2YyA2NTBhICBzLmFyZS5hdmFpbGFibGUuCi0JMHgwYjQwOiAgNzQ2OCA3MjZmIDc1NjcgNjgyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5ICB0aHJvdWdoLnRoZS5EZWJpCi0JMHgwYjUwOiAgNjE2ZSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzMgNzk3MyA3NDY1ICBhbi5wYWNrYWdlLnN5c3RlCi0JMHgwYjYwOiAgNmQyMCA3NzY5IDc0NjggMjA3NCA2ODY1IDIwNmUgNjE2ZCA2NTczICBtLndpdGgudGhlLm5hbWVzCi0JMHgwYjcwOiAgMjAzYyA1NDU0IDNlNmMgNjk2MiA2MTcwIDYxNjMgNjg2NSAyZDZkICAuPFRUPmxpYmFwYWNoZS1tCi0JMHgwYjgwOiAgNmY2NCAyZDJhIDNjMmYgNTQ1NCAzZTJlIDBhNDkgNjYyMCA3OTZmICBvZC0qPC9UVD4uLklmLnlvCi0JMHgwYjkwOiAgNzUyMCA2ZTY1IDY1NjQgMjA3NCA2ZjIwIDYzNmYgNmQ3MCA2OTZjICB1Lm5lZWQudG8uY29tcGlsCi0JMHgwYmEwOiAgNjUyMCA2MTIwIDZkNmYgNjQ3NSA2YzY1IDIwNzkgNmY3NSA3MjczICBlLmEubW9kdWxlLnlvdXJzCi0JMHgwYmIwOiAgNjU2YyA2NjJjIDIwNzkgNmY3NSAyMDc3IDY5NmMgNmMyMCA2ZTY1ICBlbGYsLnlvdS53aWxsLm5lCi0JMHgwYmMwOiAgNjU2NCAyMDc0IDZmMjAgNjk2ZSA3Mzc0IDYxNmMgNmMyMCA3NDY4ICBlZC50by5pbnN0YWxsLnRoCi0JMHgwYmQwOiAgNjUwYSAzYzU0IDU0M2UgNjE3MCA2MTYzIDY4NjUgMmQ2NCA2NTc2ICBlLjxUVD5hcGFjaGUtZGV2Ci0JMHgwYmUwOiAgM2MyZiA1NDU0IDNlMjAgNzA2MSA2MzZiIDYxNjcgNjUyZSAwYTBhICA8L1RUPi5wYWNrYWdlLi4uCi0JMHgwYmYwOiAgM2M1MCAzZTRkIDZmNzIgNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0ICA8UD5Nb3JlLmRvY3VtZW50Ci0JMHgwYzAwOiAgNjE3NCA2OTZmIDZlMjAgNmY2ZSAyMDQxIDcwNjEgNjM2OCA2NTIwICBhdGlvbi5vbi5BcGFjaGUuCi0JMHgwYzEwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2ZiA2ZTNhICBjYW4uYmUuZm91bmQub246Ci0JMHgwYzIwOiAgMGEzYyA1NTRjIDNlMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjICAuPFVMPi48TEk+LlRoZS48Ci0JMHgwYzMwOiAgNDEyMCA0ODUyIDQ1NDYgM2QyMiAyZjY0IDZmNjMgMmY2MSA3MDYxICBBLkhSRUY9Ii9kb2MvYXBhCi0JMHgwYzQwOiAgNjM2OCA2NTJkIDY0NmYgNjMyZiA2ZDYxIDZlNzUgNjE2YyAyZjIyICBjaGUtZG9jL21hbnVhbC8iCi0JMHgwYzUwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0ICA+QXBhY2hlLmRvY3VtZW50Ci0JMHgwYzYwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDczNzQgNmY3MiA2NTY0ICBhdGlvbjwvQT4uc3RvcmVkCi0JMHgwYzcwOiAgMjA2ZiA2ZTIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjJlICAub24ueW91ci5zZXJ2ZXIuCi0JMHgwYzgwOiAgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwICA8L0xJPi4uPExJPi5UaGUuCi0JMHgwYzkwOiAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmICA8QS5IUkVGPSJodHRwOi8vCi0JMHgwY2EwOiAgNzc3NyA3NzJlIDYxNzAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyICB3d3cuYXBhY2hlLm9yZy8iCi0JMHgwY2IwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA1MDcyIDZmNmEgNjU2MyA3NDNjICA+QXBhY2hlLlByb2plY3Q8Ci0JMHgwY2MwOiAgMmY0MSAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmICAvQT4uaG9tZS5zaXRlLjwvCi0JMHgwY2QwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxICBMST4uLjxMST4uVGhlLjxBCi0JMHgwY2UwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3ICAuSFJFRj0iaHR0cDovL3d3Ci0JMHgwY2YwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZDczIDczNmMgMmU2ZiA3MjY3ICB3LmFwYWNoZS1zc2wub3JnCi0JMHgwZDAwOiAgMmYyMiAzZTQxIDcwNjEgNjM2OCA2NTJkIDUzNTMgNGMzYyAyZjQxICAvIj5BcGFjaGUtU1NMPC9BCi0JMHgwZDEwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5ICA+LmhvbWUuc2l0ZS48L0xJCi0JMHgwZDIwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4ICA+Li48TEk+LlRoZS48QS5ICi0JMHgwZDMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzA2NSA3MjZjICBSRUY9Imh0dHA6Ly9wZXJsCi0JMHgwZDQwOiAgMmU2MSA3MDYxIDYzNjggNjUyZSA2ZjcyIDY3MmYgMjIzZSA2ZDZmICAuYXBhY2hlLm9yZy8iPm1vCi0JMHgwZDUwOiAgNjQyMCA3MDY1IDcyNmMgM2MyZiA0MTNlIDIwNjggNmY2ZCA2NTIwICBkLnBlcmw8L0E+LmhvbWUuCi0JMHgwZDYwOiAgNzM2OSA3NDY1IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlICBzaXRlLjwvTEk+Li48TEk+Ci0JMHgwZDcwOiAgMGE1NCA2ODY1IDIwM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0ICAuVGhlLjxBLkhSRUY9Imh0Ci0JMHgwZDgwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYxIDcwNjEgNjM2OCA2NTc3ICB0cDovL3d3dy5hcGFjaGV3Ci0JMHgwZDkwOiAgNjU2NSA2YjJlIDYzNmYgNmQyZiAyMjNlIDQxNzAgNjE2MyA2ODY1ICBlZWsuY29tLyI+QXBhY2hlCi0JMHgwZGEwOiAgNTc2NSA2NTZiIDNjMmYgNDEzZSAyMDZlIDY1NzcgNzM2YyA2NTc0ICBXZWVrPC9BPi5uZXdzbGV0Ci0JMHgwZGIwOiAgNzQ2NSA3MjJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhICB0ZXIuPC9MST4uLjxMST4uCi0JMHgwZGMwOiAgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0ICBUaGUuPEEuSFJFRj0iaHR0Ci0JMHgwZGQwOiAgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1IDYyNjkgNjE2ZSAyZTZmICBwOi8vd3d3LmRlYmlhbi5vCi0JMHgwZGUwOiAgNzI2NyAyZjY0IDZmNjMgMmYyMiAzZTQ0IDY1NjIgNjk2MSA2ZTIwICByZy9kb2MvIj5EZWJpYW4uCi0JMHgwZGYwOiAgNTA3MiA2ZjZhIDY1NjMgNzQwYSA0NDZmIDYzNzUgNmQ2NSA2ZTc0ICBQcm9qZWN0LkRvY3VtZW50Ci0JMHgwZTAwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDc3NjggNjk2MyA2ODIwICBhdGlvbjwvQT4ud2hpY2guCi0JMHgwZTEwOiAgNjM2ZiA2ZTc0IDYxNjkgNmU3MyAyMDQ4IDRmNTcgNTQ0ZiA3MzJjICBjb250YWlucy5IT1dUT3MsCi0JMHgwZTIwOiAgMjA0NiA0MTUxIDczMmMgMjA2MSA2ZTY0IDIwNzMgNmY2NiA3NDc3ICAuRkFRcywuYW5kLnNvZnR3Ci0JMHgwZTMwOiAgNjE3MiA2NTIwIDc1NzAgNjQ2MSA3NDY1IDczMmUgM2MyZiA0YzQ5ICBhcmUudXBkYXRlcy48L0xJCi0JMHgwZTQwOiAgM2UwYSAzYzJmIDU1NGMgM2UwYSAwYTNjIDUwM2UgNTk2ZiA3NTIwICA+LjwvVUw+Li48UD5Zb3UuCi0JMHgwZTUwOiAgNjM2MSA2ZTIwIDYxNmMgNzM2ZiAyMDYzIDZmNmUgNzM3NSA2Yzc0ICBjYW4uYWxzby5jb25zdWx0Ci0JMHgwZTYwOiAgMjA3NCA2ODY1IDIwNmMgNjk3MyA3NDIwIDZmNjYgMjAzYyA0MTIwICAudGhlLmxpc3Qub2YuPEEuCi0JMHgwZTcwOiAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3ICBIUkVGPSJodHRwOi8vd3d3Ci0JMHgwZTgwOiAgMmU2MiA2Zjc1IDc0NjUgNmM2YyAyZTYzIDZmNmQgMmY2NiA2MTcxICAuYm91dGVsbC5jb20vZmFxCi0JMHgwZTkwOiAgMmYyMiAzZTU3IDZmNzIgNmM2NCAwYTU3IDY5NjQgNjUyMCA1NzY1ICAvIj5Xb3JsZC5XaWRlLldlCi0JMHgwZWEwOiAgNjIyMCA0NjcyIDY1NzEgNzU2NSA2ZTc0IDZjNzkgMjA0MSA3MzZiICBiLkZyZXF1ZW50bHkuQXNrCi0JMHgwZWIwOiAgNjU2NCAyMDUxIDc1NjUgNzM3NCA2OTZmIDZlNzMgM2MyZiA0MTNlICBlZC5RdWVzdGlvbnM8L0E+Ci0JMHgwZWMwOiAgMjA2NiA2ZjcyIDIwNjkgNmU2NiA2ZjcyIDZkNjEgNzQ2OSA2ZjZlICAuZm9yLmluZm9ybWF0aW9uCi0JMHgwZWQwOiAgMmUwYSAwYTNjIDQ4MzIgM2U0YyA2NTc0IDIwNmYgNzQ2OCA2NTcyICAuLi48SDI+TGV0Lm90aGVyCi0JMHgwZWUwOiAgMjA3MCA2NTZmIDcwNmMgNjUyMCA2YjZlIDZmNzcgMjA2MSA2MjZmICAucGVvcGxlLmtub3cuYWJvCi0JMHgwZWYwOiAgNzU3NCAyMDc0IDY4NjkgNzMyMCA3MzY1IDcyNzYgNjU3MiAzYzJmICB1dC50aGlzLnNlcnZlcjwvCi0JMHgwZjAwOiAgNDgzMiAzZTBhIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0ICBIMj4uLjxBLkhSRUY9Imh0Ci0JMHgwZjEwOiAgNzQ3MCAzYTJmIDJmNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmICB0cDovL25ldGNyYWZ0LmNvCi0JMHgwZjIwOiAgNmQyZiAyMjNlIDRlNjUgNzQ2MyA3MjYxIDY2NzQgM2MyZiA0MTNlICBtLyI+TmV0Y3JhZnQ8L0E+Ci0JMHgwZjMwOiAgMjA3MCA3MjZmIDc2NjkgNjQ2NSA3MzIwIDYxNmUgMjA2OSA2ZTc0ICAucHJvdmlkZXMuYW4uaW50Ci0JMHgwZjQwOiAgNjU3MiA2NTczIDc0NjkgNmU2NyAyMDY2IDcyNjUgNjUwYSA3MzY1ICBlcmVzdGluZy5mcmVlLnNlCi0JMHgwZjUwOiAgNzI3NiA2OTYzIDY1MjAgNjY2ZiA3MjIwIDc3NjUgNjIyMCA3MzY5ICBydmljZS5mb3Iud2ViLnNpCi0JMHgwZjYwOiAgNzQ2NSAyMDZkIDZmNmUgNjk3NCA2ZjcyIDY5NmUgNjcyMCA2MTZlICB0ZS5tb25pdG9yaW5nLmFuCi0JMHgwZjcwOiAgNjQyMCA3Mzc0IDYxNzQgNjk3MyA3NDY5IDYzMjAgNjM2ZiA2YzZjICBkLnN0YXRpc3RpYy5jb2xsCi0JMHgwZjgwOiAgNjU2MyA3NDY5IDZmNmUgMmUwYSA1OTZmIDc1MjAgNjM2MSA2ZTIwICBlY3Rpb24uLllvdS5jYW4uCi0JMHgwZjkwOiAgNmM2NSA3NDIwIDc0NjggNjU2ZCAyMDZiIDZlNmYgNzcyMCA2MTYyICBsZXQudGhlbS5rbm93LmFiCi0JMHgwZmEwOiAgNmY3NSA3NDIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjIwICBvdXQueW91ci5zZXJ2ZXIuCi0JMHgwZmIwOiAgNzU3MyA2OTZlIDY3MjAgNzQ2OCA2NTY5IDcyMGEgM2M0MSAyMDQ4ICB1c2luZy50aGVpci48QS5ICi0JMHgwZmMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzU3MCA3NDY5ICBSRUY9Imh0dHA6Ly91cHRpCi0JMHgwZmQwOiAgNmQ2NSAyZTZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmICBtZS5uZXRjcmFmdC5jb20vCi0JMHgwZmUwOiAgMjIzZSA2OTZlIDc0NjUgNzI2NiA2MTYzIDY1M2MgMmY0MSAzZTJlICAiPmludGVyZmFjZTwvQT4uCi0JMHgwZmYwOiAgMGE0NSA2ZTYxIDYyNmMgNjk2ZSA2NzIwIDc0NjggNjUyMCA2ZDZmICAuRW5hYmxpbmcudGhlLm1vCi0JMHgxMDAwOiAgNmU2OSA3NDZmIDcyNjkgNmU2NyAyMDZmIDY2MjAgNzk2ZiA3NTcyICBuaXRvcmluZy5vZi55b3VyCi0JMHgxMDEwOiAgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NzY5IDZjNmMgMjA3MCA3MjZmICAuc2VydmVyLndpbGwucHJvCi0JMHgxMDIwOiAgNzY2OSA2NDY1IDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIyMCA2NzZjICB2aWRlLmEuYmV0dGVyLmdsCi0JMHgxMDMwOiAgNmY2MiA2MTZjIDIwNmYgNzY2NSA3Mjc2IDY5NjUgNzcwYSA2ZjY2ICBvYmFsLm92ZXJ2aWV3Lm9mCi0JMHgxMDQwOiAgMjA3NyA2ODZmIDIwNjkgNzMyMCA3NTczIDY5NmUgNjcyMCA3NzY4ICAud2hvLmlzLnVzaW5nLndoCi0JMHgxMDUwOiAgNjE3NCAyMDYxIDZlNjQgMjA3NyA2ODY1IDcyNjUgMmMyMCA2MTZlICBhdC5hbmQud2hlcmUsLmFuCi0JMHgxMDYwOiAgNjQyMCA2OTc0IDIwNzcgNmY3NSA2YzY0IDIwNjcgNjk3NiA2NTIwICBkLml0LndvdWxkLmdpdmUuCi0JMHgxMDcwOiAgNDQ2NSA2MjY5IDYxNmUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjBhICBEZWJpYW4uYS5iZXR0ZXIuCi0JMHgxMDgwOiAgNmY3NiA2NTcyIDc2NjkgNjU3NyAyMDZmIDY2MjAgNzQ2OCA2NTIwICBvdmVydmlldy5vZi50aGUuCi0JMHgxMDkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc1ICBhcGFjaGUucGFja2FnZS51Ci0JMHgxMGEwOiAgNzM2MSA2NzY1IDJlMGEgMGEzYyA0ODMyIDNlNDEgNjI2ZiA3NTc0ICBzYWdlLi4uPEgyPkFib3V0Ci0JMHgxMGIwOiAgMjA3NCA2ODY5IDczMjAgNzA2MSA2NzY1IDNjMmYgNDgzMiAzZTBhICAudGhpcy5wYWdlPC9IMj4uCi0JMHgxMGMwOiAgMGEzYyA0OTRkIDQ3MjAgNDE0YyA0OTQ3IDRlM2QgMjI3MiA2OTY3ICAuPElNRy5BTElHTj0icmlnCi0JMHgxMGQwOiAgNjg3NCAyMjIwIDQxNGMgNTQzZCAyMjIyIDIwNDggNDU0OSA0NzQ4ICBodCIuQUxUPSIiLkhFSUdICi0JMHgxMGUwOiAgNTQzZCAyMjMyIDM0MzcgMjIyMCA1NzQ5IDQ0NTQgNDgzZCAyMjMyICBUPSIyNDciLldJRFRIPSIyCi0JMHgxMGYwOiAgMzczOCAyMjIwIDUzNTIgNDMzZCAyMjY5IDYzNmYgNmU3MyAyZjZhICA3OCIuU1JDPSJpY29ucy9qCi0JMHgxMTAwOiAgNjg2NSAzMDM2IDMxMmUgNzA2ZSA2NzIyIDNlMGEgMGEzYyA1MDNlICBoZTA2MS5wbmciPi4uPFA+Ci0JMHgxMTEwOiAgNTQ2OCA2OTczIDIwNjkgNzMyMCA2MTIwIDcwNmMgNjE2MyA2NTY4ICBUaGlzLmlzLmEucGxhY2VoCi0JMHgxMTIwOiAgNmY2YyA2NDY1IDcyMjAgNzA2MSA2NzY1IDIwNjkgNmU3MyA3NDYxICBvbGRlci5wYWdlLmluc3RhCi0JMHgxMTMwOiAgNmM2YyA2NTY0IDIwNjIgNzkyMCA3NDY4IDY1MjAgM2M0MSAwYTQ4ICBsbGVkLmJ5LnRoZS48QS5ICi0JMHgxMTQwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlICBSRUY9Imh0dHA6Ly93d3cuCi0JMHgxMTUwOiAgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3IDJmMjIgM2U0NCA2NTYyICBkZWJpYW4ub3JnLyI+RGViCi0JMHgxMTYwOiAgNjk2MSA2ZTNjIDJmNDEgM2UwYSA3MjY1IDZjNjUgNjE3MyA2NTIwICBpYW48L0E+LnJlbGVhc2UuCi0JMHgxMTcwOiAgNmY2NiAyMDc0IDY4NjUgMjA2MSA3MDYxIDYzNjggNjUyMCA1NzY1ICBvZi50aGUuYXBhY2hlLldlCi0JMHgxMTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1ICBiLnNlcnZlci5wYWNrYWdlCi0JMHgxMTkwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2OTczIDIwNjMgNmY2ZCA3MDc1ICAuLi48UD5UaGlzLmNvbXB1Ci0JMHgxMWEwOiAgNzQ2NSA3MjIwIDY4NjEgNzMyMCA2OTZlIDczNzQgNjE2YyA2YzY1ICB0ZXIuaGFzLmluc3RhbGxlCi0JMHgxMWIwOiAgNjQyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5IDYxNmUgMjA0NyA0ZTU1ICBkLnRoZS5EZWJpYW4uR05VCi0JMHgxMWMwOiAgMmY0YyA2OTZlIDc1NzggMjA2ZiA3MDY1IDcyNjEgNzQ2OSA2ZTY3ICAvTGludXgub3BlcmF0aW5nCi0JMHgxMWQwOiAgMjA3MyA3OTczIDc0NjUgNmQyYyAwYTYyIDc1NzQgMjA2OSA3NDIwICAuc3lzdGVtLC5idXQuaXQuCi0JMHgxMWUwOiAgNjg2MSA3MzIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDY4ICBoYXMuPHN0cm9uZz5ub3RoCi0JMHgxMWYwOiAgNjk2ZSA2NzIwIDc0NmYgMjA2NCA2ZjIwIDc3NjkgNzQ2OCAyMDc0ICBpbmcudG8uZG8ud2l0aC50Ci0JMHgxMjAwOiAgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSA2NTYzICBoZS5EZWJpYW4uUHJvamVjCi0JMHgxMjEwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDJlMjAgNTA2YyA2NTYxICB0PC9zdHJvbmc+Li5QbGVhCi0JMHgxMjIwOiAgNzM2NSAyMDY0IDZmMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmICBzZS5kby48c3Ryb25nPm5vCi0JMHgxMjMwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDIwNjMgNmY2ZSA3NDYxICB0PC9zdHJvbmc+LmNvbnRhCi0JMHgxMjQwOiAgNjM3NCAyMDc0IDY4NjUgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyICBjdC50aGUuRGViaWFuLlByCi0JMHgxMjUwOiAgNmY2YSA2NTYzIDc0MjAgNjE2MiA2Zjc1IDc0MjAgNjk3NCAyZTNjICBvamVjdC5hYm91dC5pdC48Ci0JMHgxMjYwOiAgMmY1MCAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDY2ICAvUD4uLjxQPklmLnlvdS5mCi0JMHgxMjcwOiAgNjk2ZSA2NDIwIDYxMjAgNjI3NSA2NzIwIDY5NmUgMjA3NCA2ODY5ICBpbmQuYS5idWcuaW4udGhpCi0JMHgxMjgwOiAgNzMyMCA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1ICBzLmFwYWNoZS5wYWNrYWdlCi0JMHgxMjkwOiAgMmMyMCA2ZjcyIDIwNjkgNmUyMCA0MTcwIDYxNjMgNjg2NSAyMDY5ICAsLm9yLmluLkFwYWNoZS5pCi0JMHgxMmEwOiAgNzQ3MyA2NTZjIDY2MmMgMGE3MCA2YzY1IDYxNzMgNjUyMCA2NjY5ICB0c2VsZiwucGxlYXNlLmZpCi0JMHgxMmIwOiAgNmM2NSAyMDYxIDIwNjIgNzU2NyAyMDcyIDY1NzAgNmY3MiA3NDIwICBsZS5hLmJ1Zy5yZXBvcnQuCi0JMHgxMmMwOiAgNmY2ZSAyMDY5IDc0MmUgMjAyMCA0OTZlIDczNzQgNzI3NSA2Mzc0ICBvbi5pdC4uLkluc3RydWN0Ci0JMHgxMmQwOiAgNjk2ZiA2ZTczIDIwNmYgNmUyMCA2NDZmIDY5NmUgNjcyMCA3NDY4ICBpb25zLm9uLmRvaW5nLnRoCi0JMHgxMmUwOiAgNjk3MyAyYzIwIDYxNmUgNjQyMCA3NDY4IDY1MGEgNmM2OSA3Mzc0ICBpcywuYW5kLnRoZS5saXN0Ci0JMHgxMmYwOiAgMjA2ZiA2NjIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0ICAub2YuPEEuSFJFRj0iaHR0Ci0JMHgxMzAwOiAgNzAzYSAyZjJmIDYyNzUgNjc3MyAyZTY0IDY1NjIgNjk2MSA2ZTJlICBwOi8vYnVncy5kZWJpYW4uCi0JMHgxMzEwOiAgNmY3MiA2NzJmIDczNzIgNjMzYSA2MTcwIDYxNjMgNjg2NSAyMjNlICBvcmcvc3JjOmFwYWNoZSI+Ci0JMHgxMzIwOiAgNmI2ZSA2Zjc3IDZlMjAgNjI3NSA2NzczIDNjMmYgNDEzZSAyMDZmICBrbm93bi5idWdzPC9BPi5vCi0JMHgxMzMwOiAgNjYyMCA3NDY4IDY5NzMgMGE3MCA2MTYzIDZiNjEgNjc2NSAyYzIwICBmLnRoaXMucGFja2FnZSwuCi0JMHgxMzQwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwICBjYW4uYmUuZm91bmQuaW4uCi0JMHgxMzUwOiAgNzQ2OCA2NTIwIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0ICB0aGUuLjxBLkhSRUY9Imh0Ci0JMHgxMzYwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSA2ZTJlICB0cDovL3d3dy5kZWJpYW4uCi0JMHgxMzcwOiAgNmY3MiA2NzJmIDQyNzUgNjc3MyAyZjUyIDY1NzAgNmY3MiA3NDY5ICBvcmcvQnVncy9SZXBvcnRpCi0JMHgxMzgwOiAgNmU2NyAyMjNlIDQ0NjUgNjI2OSA2MTZlIDIwNDIgNzU2NyAyMDU0ICBuZyI+RGViaWFuLkJ1Zy5UCi0JMHgxMzkwOiAgNzI2MSA2MzZiIDY5NmUgNjcyMCA1Mzc5IDczNzQgNjU2ZCAzYzJmICByYWNraW5nLlN5c3RlbTwvCi0JMHgxM2EwOiAgNDEzZSAyZTBhIDBhM2MgNTAzZSA1NDY4IDYxNmUgNmI3MyAyMDY2ICBBPi4uLjxQPlRoYW5rcy5mCi0JMHgxM2IwOiAgNmY3MiAyMDc1IDczNjkgNmU2NyAyMDc0IDY4NjkgNzMyMCA3MDYxICBvci51c2luZy50aGlzLnBhCi0JMHgxM2MwOiAgNjM2YiA2MTY3IDY1MmMgMjA2MSA2ZTY0IDIwNjMgNmY2ZSA2NzcyICBja2FnZSwuYW5kLmNvbmdyCi0JMHgxM2QwOiAgNjE3NCA3NTZjIDYxNzQgNjk2ZiA2ZTczIDIwNjYgNmY3MiAyMDc5ICBhdHVsYXRpb25zLmZvci55Ci0JMHgxM2UwOiAgNmY3NSA3MjIwIDYzNjggNmY2OSA2MzY1IDIwNmYgNjYwYSA2MTIwICBvdXIuY2hvaWNlLm9mLmEuCi0JMHgxM2YwOiAgNDQ2NSA2MjY5IDYxNmUgMjA3MyA3OTczIDc0NjUgNmQyMSAzYzJmICBEZWJpYW4uc3lzdGVtITwvCi0JMHgxNDAwOiAgNTAzZSAwYTBhIDNjNDQgNDk1NiAyMDYxIDZjNjkgNjc2ZSAzZDIyICBQPi4uPERJVi5hbGlnbj0iCi0JMHgxNDEwOiAgNjM2NSA2ZTc0IDY1NzIgMjIzZSAwYTNjIDYxMjAgNjg3MiA2NTY2ICBjZW50ZXIiPi48YS5ocmVmCi0JMHgxNDIwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyICA9Imh0dHA6Ly93d3cuZGViCi0JMHgxNDMwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDBhM2MgNDk0ZCA0NzIwICBpYW4ub3JnLyI+LjxJTUcuCi0JMHgxNDQwOiAgNjE2YyA2OTY3IDZlM2QgMjI2ZCA2OTY0IDY0NmMgNjUyMiAyMDY4ICBhbGlnbj0ibWlkZGxlIi5oCi0JMHgxNDUwOiAgNjU2OSA2NzY4IDc0M2QgMjIzMyAzMDIyIDIwNzcgNjk2NCA3NDY4ICBlaWdodD0iMzAiLndpZHRoCi0JMHgxNDYwOiAgM2QyMiAzMjM1IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiA2ZTczICA9IjI1Ii5zcmM9Imljb25zCi0JMHgxNDcwOiAgMmY2NCA2NTYyIDY5NjEgNmUyZiA2ZjcwIDY1NmUgNmM2ZiA2NzZmICAvZGViaWFuL29wZW5sb2dvCi0JMHgxNDgwOiAgMmQzMiAzNTJlIDZhNzAgNjcyMiAyMDYxIDZjNzQgM2QyMiA0NDY1ICAtMjUuanBnIi5hbHQ9IkRlCi0JMHgxNDkwOiAgNjI2OSA2MTZlIDIyM2UgMGEzYyAyZjYxIDNlMGEgM2M2MSAyMDY4ICBiaWFuIj4uPC9hPi48YS5oCi0JMHgxNGEwOiAgNzI2NSA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlICByZWY9Imh0dHA6Ly93d3cuCi0JMHgxNGIwOiAgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2UwYSAzYzQ5ICBhcGFjaGUub3JnLyI+LjxJCi0JMHgxNGMwOiAgNGQ0NyAyMDYxIDZjNjkgNjc2ZSAzZDIyIDZkNjkgNjQ2NCA2YzY1ICBNRy5hbGlnbj0ibWlkZGxlCi0JMHgxNGQwOiAgMjIyMCA2ODY1IDY5NjcgNjg3NCAzZDIyIDMzMzIgMjIyMCA3NzY5ICAiLmhlaWdodD0iMzIiLndpCi0JMHgxNGUwOiAgNjQ3NCA2ODNkIDIyMzIgMzUzOSAyMjIwIDczNzIgNjMzZCAyMjY5ICBkdGg9IjI1OSIuc3JjPSJpCi0JMHgxNGYwOiAgNjM2ZiA2ZTczIDJmNjEgNzA2MSA2MzY4IDY1NWYgNzA2MiAyZTcwICBjb25zL2FwYWNoZV9wYi5wCi0JMHgxNTAwOiAgNmU2NyAyMjIwIDYxNmMgNzQzZCAyMjQxIDcwNjEgNjM2OCA2NTIyICBuZyIuYWx0PSJBcGFjaGUiCi0JMHgxNTEwOiAgM2UwYSAzYzJmIDYxM2UgMGEzYyAyZjQ0IDQ5NTYgM2UwYSAwYTNjICA+LjwvYT4uPC9ESVY+Li48Ci0JMHgxNTIwOiAgMjEyZCAyZDBhIDIwMjAgNTQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwICAhLS0uLi5UaGlzLnBhZ2UuCi0JMHgxNTMwOiAgNzc2MSA3MzIwIDY5NmUgNjk3NCA2OTYxIDZjNmMgNzkyMCA2MzcyICB3YXMuaW5pdGlhbGx5LmNyCi0JMHgxNTQwOiAgNjU2MSA3NDY1IDY0MjAgNjI3OSAyMDRhIDZmNjggNmU2OSA2NTIwICBlYXRlZC5ieS5Kb2huaWUuCi0JMHgxNTUwOiAgNDk2ZSA2NzcyIDYxNmQgMjAyOCA2ODc0IDc0NzAgM2EyZiAyZjZlICBJbmdyYW0uKGh0dHA6Ly9uCi0JMHgxNTYwOiAgNjU3NCA2NzZmIDY0MmUgNmU2NSA3NDJmIDI5MGEgMjAyMCA0OTc0ICBldGdvZC5uZXQvKS4uLkl0Ci0JMHgxNTcwOiAgMjA3NyA2MTczIDIwNmMgNjE3NCA2NTcyIDIwNjUgNjQ2OSA3NDY1ICAud2FzLmxhdGVyLmVkaXRlCi0JMHgxNTgwOiAgNjQyMCA2Mjc5IDIwNGQgNjE3NCA3NDY4IDY1NzcgMjA1NyA2OTZjICBkLmJ5Lk1hdHRoZXcuV2lsCi0JMHgxNTkwOiAgNjM2ZiA3ODIwIDYxNmUgNjQyMCA0YTZmIDczNjkgNzAyMCA1MjZmICBjb3guYW5kLkpvc2lwLlJvCi0JMHgxNWEwOiAgNjQ2OSA2ZTJlIDBhMjAgMjA0YyA2MTczIDc0MjAgNmQ2ZiA2NDY5ICBkaW4uLi4uTGFzdC5tb2RpCi0JMHgxNWIwOiAgNjY2OSA2NTY0IDNhMjAgMjQ0NCA2MTc0IDY1M2EgMjAzMiAzMDMwICBmaWVkOi4kRGF0ZTouMjAwCi0JMHgxNWMwOiAgMzQyZiAzMDM2IDJmMzIgMzAyMCAzMTM1IDNhMzMgMzMzYSAzNTM3ICA0LzA2LzIwLjE1OjMzOjU3Ci0JMHgxNWQwOiAgMjAyNCAyZTBhIDIwMjAgMmQyZCAzZTBhIDBhM2MgMmY0MiA0ZjQ0ICAuJC4uLi4tLT4uLjwvQk9ECi0JMHgxNWUwOiAgNTkzZSAwYTNjIDJmNDggNTQ0ZCA0YzNlIDBhICAgICAgICAgICAgICBZPi48L0hUTUw+LgotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWI2ZSA0MDAwIDQwMDYgMjE1NCA3ZjAwIDAwMDEgIEUuLjQubkAuQC4hVC4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgIC4uLi4ucC5QN1guSTd6Li4KLQkweDAwMjA6ICA4MDEwIDMwNWYgMTBlYSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkgIC4uMF8uLi4uLi4uLk0uLi4KLQkweDAwMzA6ICA0ZGRjIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLi4KLTIzOjU3OjM3LjIyOTU3NSBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IEYgMjAzOjIwMygwKSBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDEgMTMwNjMwMDk1Mz4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgIEUuLjQucEAuQC4hUi4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0OSAzNzdhIGEzYTkgIC4uLi4ucC5QN1guSTd6Li4KLQkweDAwMjA6ICA4MDExIDMwNWYgMGJlMSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjEgIC4uMF8uLi4uLi4uLk0uLiEKLQkweDAwMzA6ICA0ZGRjIDkyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLi4KLTIzOjU3OjM3LjIzMDgzOSBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IEYgNTU2MDo1NTYwKDApIGFjayAyMDQgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0MT4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEgIEUuLjQuLkAuQC4uLi4uLi4KLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEgIC4uLi4uUC5wN3ouLjdYLkoKLQkweDAwMjA6ICA4MDExIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgIC4uLi4uNS4uLi4uLk0uLiMKLQkweDAwMzA6ICA0ZGRjIDk3MjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE0uLiEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFiNzIgNDAwMCA0MDA2IDIxNTAgN2YwMCAwMDAxICBFLi40LnJALkAuIVAuLi4uCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNGEgMzc3YSBhM2FhICAuLi4uLnAuUDdYLko3ei4uCi0JMHgwMDIwOiAgODAxMCAzMDVmIDA2ZDQgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzICAuLjBfLi4uLi4uLi5NLi4jCi0JMHgwMDMwOiAgNGRkYyA5NzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNLi4jCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1jYXBYWC5vdXQgYi90ZXN0cy9wcmludC1jYXBYWC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjFhMDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcHJpbnQtY2FwWFgub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLTIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzYyAxYjY4IDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSA3ZjAwICAuPC5oQC5ALiFSLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdlIDAwMDAgMDAwMCBhMDAyICAuLi5wLlA3WC5+Li4uLi4uCi0JMHgwMDMwOiAgN2ZmZiAxNDIxIDAwMDAgMDIwNCA0MDBjIDA0MDIgMDgwYSA0ZGRjICAuLi4hLi4uLkAuLi4uLk0uCi0JMHgwMDQwOiAgOTIxNiAwMDAwIDAwMDAgMDEwMyAwMzAyICAgICAgICAgICAgICAgICAuLi4uLi4uLi4uCi0yMzo1NzozNS45MzgxMjIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBTIDkzMDc3ODYwOTo5MzA3Nzg2MDkoMCkgYWNrIDkyODU0OTI0NyB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMTMwNjMwMDk1MCxub3Asd3NjYWxlIDI+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzYyAwMDAwIDQwMDAgNDAwNiAzY2JhIDdmMDAgMDAwMSA3ZjAwICAuPC4uQC5ALjwuLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYxIDM3NTggODk3ZiBhMDEyICAuLi5QLnA3ei4uN1guLi4uCi0JMHgwMDMwOiAgN2ZmZiA2ZWIxIDAwMDAgMDIwNCA0MDBjIDA0MDIgMDgwYSA0ZGRjICAuLm4uLi4uLkAuLi4uLk0uCi0JMHgwMDQwOiAgOTIxNiA0ZGRjIDkyMTYgMDEwMyAwMzAyICAgICAgICAgICAgICAgICAuLk0uLi4uLi4uCi0yMzo1NzozNS45MzgxNjcgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTA+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzNCAxYjZhIDQwMDAgNDAwNiAyMTU4IDdmMDAgMDAwMSA3ZjAwICAuNC5qQC5ALiFYLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMiA4MDEwICAuLi5wLlA3WC4uN3ouLi4uCi0JMHgwMDMwOiAgMjAwMCAzN2QwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNiA0ZGRjICAuLjcuLi4uLi4uTS4uLk0uCi0JMHgwMDQwOiAgOTIxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLgotMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDBmZSAxYjZjIDQwMDAgNDAwNiAyMDhjIDdmMDAgMDAwMSA3ZjAwICAuLi5sQC5ALi4uLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMiA4MDE4ICAuLi5wLlA3WC4uN3ouLi4uCi0JMHgwMDMwOiAgMjAwMCBmZWYyIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNyA0ZGRjICAuLi4uLi4uLi4uTS4uLk0uCi0JMHgwMDQwOiAgOTIxNiA0NzQ1IDU0MjAgMmYyMCA0ODU0IDU0NTAgMmYzMSAyZTMxICAuLkdFVC4vLkhUVFAvMS4xCi0JMHgwMDUwOiAgMGQwYSA0ODZmIDczNzQgM2EyMCA2YzZmIDYzNjEgNmM2OCA2ZjczICAuLkhvc3Q6LmxvY2FsaG9zCi0JMHgwMDYwOiAgNzQwZCAwYTU1IDczNjUgNzIyZCA0MTY3IDY1NmUgNzQzYSAyMDQ1ICB0Li5Vc2VyLUFnZW50Oi5FCi0JMHgwMDcwOiAgNGM2OSA2ZTZiIDczMmYgMzAyZSAzMTMwIDJlMzQgMmQzNyAyZDY0ICBMaW5rcy8wLjEwLjQtNy1kCi0JMHgwMDgwOiAgNjU2MiA2OTYxIDZlMjAgMjg3NCA2NTc4IDc0NmQgNmY2NCA2NTNiICBlYmlhbi4odGV4dG1vZGU7Ci0JMHgwMDkwOiAgMjA0YyA2OTZlIDc1NzggMjAzMiAyZTM2IDJlMzEgMzEyZCAzMTJkICAuTGludXguMi42LjExLTEtCi0JMHgwMGEwOiAgMzYzOCAzNjJkIDczNmQgNzAyMCA2OTM2IDM4MzYgM2IyMCAzMTMzICA2ODYtc21wLmk2ODY7LjEzCi0JMHgwMGIwOiAgMzI3OCAzNTM2IDJkMzIgMjkwZCAwYTQxIDYzNjMgNjU3MCA3NDNhICAyeDU2LTIpLi5BY2NlcHQ6Ci0JMHgwMGMwOiAgMjAyYSAyZjJhIDBkMGEgNDE2MyA2MzY1IDcwNzQgMmQ0NSA2ZTYzICAuKi8qLi5BY2NlcHQtRW5jCi0JMHgwMGQwOiAgNmY2NCA2OTZlIDY3M2EgMjA2NyA3YTY5IDcwMGQgMGE0MSA2MzYzICBvZGluZzouZ3ppcC4uQWNjCi0JMHgwMGUwOiAgNjU3MCA3NDJkIDRjNjEgNmU2NyA3NTYxIDY3NjUgM2EyMCA2NTZlICBlcHQtTGFuZ3VhZ2U6LmVuCi0JMHgwMGYwOiAgMGQwYSA0MzZmIDZlNmUgNjU2MyA3NDY5IDZmNmUgM2EyMCA0YjY1ICAuLkNvbm5lY3Rpb246LktlCi0JMHgwMTAwOiAgNjU3MCAyZDQxIDZjNjkgNzY2NSAwZDBhIDBkMGEgICAgICAgICAgICBlcC1BbGl2ZS4uLi4KLTIzOjU3OjM1Ljk0MDQ3NCBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IC4gYWNrIDIwMyB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MiAxMzA2MzAwOTUxPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgotCTB4MDAxMDogIDAwMzQgMWZlNCA0MDAwIDQwMDYgMWNkZSA3ZjAwIDAwMDEgN2YwMCAgLjQuLkAuQC4uLi4uLi4uLgotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkgODAxMCAgLi4uUC5wN3ouLjdYLkkuLgotCTB4MDAzMDogIDIwMDAgMzcwMyAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTggNGRkYyAgLi43Li4uLi4uLk0uLi5NLgotCTB4MDA0MDogIDkyMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4KLTIzOjU3OjM1Ljk0MTIzMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFAgMTo1NTYwKDU1NTkpIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAxNWViIDFmZTYgNDAwMCA0MDA2IDA3MjUgN2YwMCAwMDAxIDdmMDAgIC4uLi5ALkAuLiUuLi4uLi4KLQkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5IDgwMTggIC4uLlAucDd6Li43WC5JLi4KLQkweDAwMzA6ICAyMDAwIDEzZTAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5IDRkZGMgIC4uLi4uLi4uLi5NLi4uTS4KLQkweDAwNDA6ICA5MjE3IDQ4NTQgNTQ1MCAyZjMxIDJlMzEgMjAzMiAzMDMwIDIwNGYgIC4uSFRUUC8xLjEuMjAwLk8KLQkweDAwNTA6ICA0YjBkIDBhNDQgNjE3NCA2NTNhIDIwNTcgNjU2NCAyYzIwIDMwMzYgIEsuLkRhdGU6LldlZCwuMDYKLQkweDAwNjA6ICAyMDRhIDc1NmMgMjAzMiAzMDMwIDM1MjAgMzAzMyAzYTM1IDM3M2EgIC5KdWwuMjAwNS4wMzo1NzoKLQkweDAwNzA6ICAzMzM1IDIwNDcgNGQ1NCAwZDBhIDUzNjUgNzI3NiA2NTcyIDNhMjAgIDM1LkdNVC4uU2VydmVyOi4KLQkweDAwODA6ICA0MTcwIDYxNjMgNjg2NSAyZjMxIDJlMzMgMmUzMyAzMzBkIDBhNGMgIEFwYWNoZS8xLjMuMzMuLkwKLQkweDAwOTA6ICA2MTczIDc0MmQgNGQ2ZiA2NDY5IDY2NjkgNjU2NCAzYTIwIDUzNzUgIGFzdC1Nb2RpZmllZDouU3UKLQkweDAwYTA6ICA2ZTJjIDIwMzEgMzUyMCA0MTc1IDY3MjAgMzIzMCAzMDM0IDIwMzAgIG4sLjE1LkF1Zy4yMDA0LjAKLQkweDAwYjA6ICAzMDNhIDM0MzMgM2EzNCAzMTIwIDQ3NGQgNTQwZCAwYTQ1IDU0NjEgIDA6NDM6NDEuR01ULi5FVGEKLQkweDAwYzA6ICA2NzNhIDIwMjIgMzY2NSAzODMwIDY2MzAgMmQzMSAzNDM4IDYxMmQgIGc6LiI2ZTgwZjAtMTQ4YS0KLQkweDAwZDA6ICAzNDMxIDMxNjUgNjIzMSA2MjY0IDIyMGQgMGE0MSA2MzYzIDY1NzAgIDQxMWViMWJkIi4uQWNjZXAKLQkweDAwZTA6ICA3NDJkIDUyNjEgNmU2NyA2NTczIDNhMjAgNjI3OSA3NDY1IDczMGQgIHQtUmFuZ2VzOi5ieXRlcy4KLQkweDAwZjA6ICAwYTQzIDZmNmUgNzQ2NSA2ZTc0IDJkNGMgNjU2ZSA2Nzc0IDY4M2EgIC5Db250ZW50LUxlbmd0aDoKLQkweDAxMDA6ICAyMDM1IDMyMzUgMzgwZCAwYTRiIDY1NjUgNzAyZCA0MTZjIDY5NzYgIC41MjU4Li5LZWVwLUFsaXYKLQkweDAxMTA6ICA2NTNhIDIwNzQgNjk2ZCA2NTZmIDc1NzQgM2QzMSAzNTJjIDIwNmQgIGU6LnRpbWVvdXQ9MTUsLm0KLQkweDAxMjA6ICA2MTc4IDNkMzEgMzAzMCAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgIGF4PTEwMC4uQ29ubmVjdGkKLQkweDAxMzA6ICA2ZjZlIDNhMjAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgIG9uOi5LZWVwLUFsaXZlLi4KLQkweDAxNDA6ICA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAzYTIwIDc0NjUgIENvbnRlbnQtVHlwZToudGUKLQkweDAxNTA6ICA3ODc0IDJmNjggNzQ2ZCA2YzNiIDIwNjMgNjg2MSA3MjczIDY1NzQgIHh0L2h0bWw7LmNoYXJzZXQKLQkweDAxNjA6ICAzZDY5IDczNmYgMmQzOCAzODM1IDM5MmQgMzEwZCAwYTBkIDBhM2MgID1pc28tODg1OS0xLi4uLjwKLQkweDAxNzA6ICAyMTQ0IDRmNDMgNTQ1OSA1MDQ1IDIwNDggNTQ0ZCA0YzIwIDUwNTUgICFET0NUWVBFLkhUTUwuUFUKLQkweDAxODA6ICA0MjRjIDQ5NDMgMjAyMiAyZDJmIDJmNTcgMzM0MyAyZjJmIDQ0NTQgIEJMSUMuIi0vL1czQy8vRFQKLQkweDAxOTA6ICA0NDIwIDQ4NTQgNGQ0YyAyMDM0IDJlMzAgMzEyMCA1NDcyIDYxNmUgIEQuSFRNTC40LjAxLlRyYW4KLQkweDAxYTA6ICA3MzY5IDc0NjkgNmY2ZSA2MTZjIDJmMmYgNDU0ZSAyMjNlIDBhM2MgIHNpdGlvbmFsLy9FTiI+LjwKLQkweDAxYjA6ICA0ODU0IDRkNGMgM2UwYSAzYzQ4IDQ1NDEgNDQzZSAwYTIwIDIwMjAgIEhUTUw+LjxIRUFEPi4uLi4KLQkweDAxYzA6ICAzYzRkIDQ1NTQgNDEyMCA0ODU0IDU0NTAgMmQ0NSA1MTU1IDQ5NTYgIDxNRVRBLkhUVFAtRVFVSVYKLQkweDAxZDA6ICAzZDIyIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDIyMjAgID0iQ29udGVudC1UeXBlIi4KLQkweDAxZTA6ICA0MzRmIDRlNTQgNDU0ZSA1NDNkIDIyNzQgNjU3OCA3NDJmIDY4NzQgIENPTlRFTlQ9InRleHQvaHQKLQkweDAxZjA6ICA2ZDZjIDNiMjAgNjM2OCA2MTcyIDczNjUgNzQzZCA2OTczIDZmMmQgIG1sOy5jaGFyc2V0PWlzby0KLQkweDAyMDA6ICAzODM4IDM1MzkgMmQzMSAyMjNlIDBhMjAgMjAyMCAzYzRkIDQ1NTQgIDg4NTktMSI+Li4uLjxNRVQKLQkweDAyMTA6ICA0MTIwIDRlNDEgNGQ0NSAzZDIyIDQ0NjUgNzM2MyA3MjY5IDcwNzQgIEEuTkFNRT0iRGVzY3JpcHQKLQkweDAyMjA6ICA2OTZmIDZlMjIgMjA0MyA0ZjRlIDU0NDUgNGU1NCAzZDIyIDU0NjggIGlvbiIuQ09OVEVOVD0iVGgKLQkweDAyMzA6ICA2NTIwIDY5NmUgNjk3NCA2OTYxIDZjMjAgNjk2ZSA3Mzc0IDYxNmMgIGUuaW5pdGlhbC5pbnN0YWwKLQkweDAyNDA6ICA2YzYxIDc0NjkgNmY2ZSAyMDZmIDY2MjAgNDQ2NSA2MjY5IDYxNmUgIGxhdGlvbi5vZi5EZWJpYW4KLQkweDAyNTA6ICAyMDYxIDcwNjEgNjM2OCA2NTJlIDIyM2UgMGEyMCAyMDIwIDNjNTQgIC5hcGFjaGUuIj4uLi4uPFQKLQkweDAyNjA6ICA0OTU0IDRjNDUgM2U1MCA2YzYxIDYzNjUgNjg2ZiA2YzY0IDY1NzIgIElUTEU+UGxhY2Vob2xkZXIKLQkweDAyNzA6ICAyMDcwIDYxNjcgNjUzYyAyZjU0IDQ5NTQgNGM0NSAzZTBhIDNjMmYgIC5wYWdlPC9USVRMRT4uPC8KLQkweDAyODA6ICA0ODQ1IDQxNDQgM2UwYSAzYzQyIDRmNDQgNTkyMCA1NDQ1IDU4NTQgIEhFQUQ+LjxCT0RZLlRFWFQKLQkweDAyOTA6ICAzZDIyIDIzMzAgMzAzMCAzMDMwIDMwMjIgMjA0MiA0NzQzIDRmNGMgID0iIzAwMDAwMCIuQkdDT0wKLQkweDAyYTA6ICA0ZjUyIDNkMjIgMjM0NiA0NjQ2IDQ2NDYgNDYyMiAyMDRjIDQ5NGUgIE9SPSIjRkZGRkZGIi5MSU4KLQkweDAyYjA6ICA0YjNkIDIyMjMgMzAzMCAzMDMwIDQ1NDYgMjIyMCA1NjRjIDQ5NGUgIEs9IiMwMDAwRUYiLlZMSU4KLQkweDAyYzA6ICA0YjNkIDIyMjMgMzUzNSAzMTM4IDM4NDEgMjIyMCA0MTRjIDQ5NGUgIEs9IiM1NTE4OEEiLkFMSU4KLQkweDAyZDA6ICA0YjNkIDIyMjMgNDY0NiAzMDMwIDMwMzAgMjIzZSAwYTBhIDNjNDggIEs9IiNGRjAwMDAiPi4uPEgKLQkweDAyZTA6ICAzMTNlIDUwNmMgNjE2MyA2NTY4IDZmNmMgNjQ2NSA3MjIwIDcwNjEgIDE+UGxhY2Vob2xkZXIucGEKLQkweDAyZjA6ICA2NzY1IDNjMmYgNDgzMSAzZTBhIDNjNDggMzIzZSA0OTY2IDIwNzkgIGdlPC9IMT4uPEgyPklmLnkKLQkweDAzMDA6ICA2Zjc1IDIwNjEgNzI2NSAyMDZhIDc1NzMgNzQyMCA2MjcyIDZmNzcgIG91LmFyZS5qdXN0LmJyb3cKLQkweDAzMTA6ICA3MzY5IDZlNjcgMjA3NCA2ODY1IDIwNzcgNjU2MiAzYzJmIDY4MzIgIHNpbmcudGhlLndlYjwvaDIKLQkweDAzMjA6ICAzZTBhIDBhM2MgNTAzZSA1NDY4IDY1MjAgNmY3NyA2ZTY1IDcyMjAgID4uLjxQPlRoZS5vd25lci4KLQkweDAzMzA6ICA2ZjY2IDIwNzQgNjg2OSA3MzIwIDc3NjUgNjIyMCA3MzY5IDc0NjUgIG9mLnRoaXMud2ViLnNpdGUKLQkweDAzNDA6ICAyMDY4IDYxNzMgMjA2ZSA2Zjc0IDIwNzAgNzU3NCAyMDc1IDcwMjAgIC5oYXMubm90LnB1dC51cC4KLQkweDAzNTA6ICA2MTZlIDc5MjAgNzc2NSA2MjIwIDcwNjEgNjc2NSA3MzIwIDc5NjUgIGFueS53ZWIucGFnZXMueWUKLQkweDAzNjA6ICA3NDJlIDBhNTAgNmM2NSA2MTczIDY1MjAgNjM2ZiA2ZDY1IDIwNjIgIHQuLlBsZWFzZS5jb21lLmIKLQkweDAzNzA6ICA2MTYzIDZiMjAgNmM2MSA3NDY1IDcyMmUgM2MyZiA1MDNlIDBhMGEgIGFjay5sYXRlci48L1A+Li4KLQkweDAzODA6ICAzYzUwIDNlM2MgNTM0ZCA0MTRjIDRjM2UgM2M0MyA0OTU0IDQ1M2UgIDxQPjxTTUFMTD48Q0lURT4KLQkweDAzOTA6ICA0ZDZmIDc2NjUgMjA2MSA2YzZmIDZlNjcgMmMyMCA2ZTZmIDc0NjggIE1vdmUuYWxvbmcsLm5vdGgKLQkweDAzYTA6ICA2OTZlIDY3MjAgNzQ2ZiAyMDczIDY1NjUgMjA2OCA2NTcyIDY1MmUgIGluZy50by5zZWUuaGVyZS4KLQkweDAzYjA6ICAyZTJlIDNjMmYgNDM0OSA1NDQ1IDNlMjAgM2EyZCAyOTNjIDJmNTMgIC4uPC9DSVRFPi46LSk8L1MKLQkweDAzYzA6ICA0ZDQxIDRjNGMgM2UzYyAyZjUwIDNlMGEgMGEzYyA0ODMyIDNlNDkgIE1BTEw+PC9QPi4uPEgyPkkKLQkweDAzZDA6ICA2NjIwIDc5NmYgNzUyMCA2MTcyIDY1MjAgNzQ3MiA3OTY5IDZlNjcgIGYueW91LmFyZS50cnlpbmcKLQkweDAzZTA6ICAyMDc0IDZmMjAgNmM2ZiA2MzYxIDc0NjUgMjA3NCA2ODY1IDIwNjEgIC50by5sb2NhdGUudGhlLmEKLQkweDAzZjA6ICA2NDZkIDY5NmUgNjk3MyA3NDcyIDYxNzQgNmY3MiAyMDZmIDY2MjAgIGRtaW5pc3RyYXRvci5vZi4KLQkweDA0MDA6ICA3NDY4IDY5NzMgMjA2ZCA2MTYzIDY4NjkgNmU2NSAzYzJmIDQ4MzIgIHRoaXMubWFjaGluZTwvSDIKLQkweDA0MTA6ICAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDc3IDYxNmUgID4uLjxQPklmLnlvdS53YW4KLQkweDA0MjA6ICA3NDIwIDc0NmYgMjA3MiA2NTcwIDZmNzIgNzQyMCA3MzZmIDZkNjUgIHQudG8ucmVwb3J0LnNvbWUKLQkweDA0MzA6ICA3NDY4IDY5NmUgNjcyMCA2MTYyIDZmNzUgNzQyMCA3NDY4IDY5NzMgIHRoaW5nLmFib3V0LnRoaXMKLQkweDA0NDA6ICAyMDY4IDZmNzMgNzQyNyA3MzIwIDYyNjUgNjg2MSA3NjY5IDZmNzIgIC5ob3N0J3MuYmVoYXZpb3IKLQkweDA0NTA6ICAyYzIwIDcwNmMgNjU2MSA3MzY1IDBhNjMgNmY2ZSA3NDYxIDYzNzQgICwucGxlYXNlLmNvbnRhY3QKLQkweDA0NjA6ICAyMDc0IDY4NjUgMjA0OSA2ZTc0IDY1NzIgNmU2NSA3NDIwIDUzNjUgIC50aGUuSW50ZXJuZXQuU2UKLQkweDA0NzA6ICA3Mjc2IDY5NjMgNjUyMCA1MDcyIDZmNzYgNjk2NCA2NTcyIDIwMjggIHJ2aWNlLlByb3ZpZGVyLigKLQkweDA0ODA6ICA0OTUzIDUwMjkgMjA2OSA2ZTc2IDZmNmMgNzY2NSA2NDIwIDY0NjkgIElTUCkuaW52b2x2ZWQuZGkKLQkweDA0OTA6ICA3MjY1IDYzNzQgNmM3OSAyZTNjIDJmNTAgM2UwYSAwYTNjIDUwM2UgIHJlY3RseS48L1A+Li48UD4KLQkweDA0YTA6ICA1MzY1IDY1MjAgNzQ2OCA2NTIwIDNjNDEgMjA2OCA3MjY1IDY2M2QgIFNlZS50aGUuPEEuaHJlZj0KLQkweDA0YjA6ICAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTYyIDc1NzMgICJodHRwOi8vd3d3LmFidXMKLQkweDA0YzA6ICA2NTJlIDZlNjUgNzQyZiAyMjNlIDRlNjUgNzQ3NyA2ZjcyIDZiMjAgIGUubmV0LyI+TmV0d29yay4KLQkweDA0ZDA6ICA0MTYyIDc1NzMgNjUwYSA0MzZjIDY1NjEgNzI2OSA2ZTY3IDY4NmYgIEFidXNlLkNsZWFyaW5naG8KLQkweDA0ZTA6ICA3NTczIDY1M2MgMmY0MSAzZTIwIDY2NmYgNzIyMCA2ODZmIDc3MjAgIHVzZTwvQT4uZm9yLmhvdy4KLQkweDA0ZjA6ICA3NDZmIDIwNjQgNmYyMCA3NDY4IDY5NzMgMmUzYyAyZjUwIDNlMGEgIHRvLmRvLnRoaXMuPC9QPi4KLQkweDA1MDA6ICAwYTNjIDQ4MzIgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyIDY1MjAgIC48SDI+SWYueW91LmFyZS4KLQkweDA1MTA6ICA3NDY4IDY1MjAgNjE2NCA2ZDY5IDZlNjkgNzM3NCA3MjYxIDc0NmYgIHRoZS5hZG1pbmlzdHJhdG8KLQkweDA1MjA6ICA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNmQ2MSA2MzY4IDY5NmUgIHIub2YudGhpcy5tYWNoaW4KLQkweDA1MzA6ICA2NTNjIDJmNDggMzIzZSAwYTBhIDNjNTAgM2U1NCA2ODY1IDIwNjkgIGU8L0gyPi4uPFA+VGhlLmkKLQkweDA1NDA6ICA2ZTY5IDc0NjkgNjE2YyAyMDY5IDZlNzMgNzQ2MSA2YzZjIDYxNzQgIG5pdGlhbC5pbnN0YWxsYXQKLQkweDA1NTA6ICA2OTZmIDZlMjAgNmY2NiAyMDNjIDQxMjAgNjg3MiA2NTY2IDNkMjIgIGlvbi5vZi48QS5ocmVmPSIKLQkweDA1NjA6ICA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgIGh0dHA6Ly93d3cuZGViaWEKLQkweDA1NzA6ICA2ZTJlIDZmNzIgNjcyZiAyMjNlIDQ0NjUgNjI2OSA2MTZlIDI3NzMgIG4ub3JnLyI+RGViaWFuJ3MKLQkweDA1ODA6ICAwYTYxIDcwNjEgNjM2OCA2NTNjIDJmNDEgM2UyMCA3NzY1IDYyMjAgIC5hcGFjaGU8L0E+LndlYi4KLQkweDA1OTA6ICA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzcgIHNlcnZlci5wYWNrYWdlLncKLQkweDA1YTA6ICA2MTczIDIwNzMgNzU2MyA2MzY1IDczNzMgNjY3NSA2YzJlIDNjMmYgIGFzLnN1Y2Nlc3NmdWwuPC8KLQkweDA1YjA6ICA1MDNlIDBhMGEgM2M1MCAzZTNjIDUzNTQgNTI0ZiA0ZTQ3IDNlNTkgIFA+Li48UD48U1RST05HPlkKLQkweDA1YzA6ICA2Zjc1IDIwNzMgNjg2ZiA3NTZjIDY0MjAgNzI2NSA3MDZjIDYxNjMgIG91LnNob3VsZC5yZXBsYWMKLQkweDA1ZDA6ICA2NTIwIDc0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzY5IDc0NjggIGUudGhpcy5wYWdlLndpdGgKLQkweDA1ZTA6ICAyMDc5IDZmNzUgNzIyMCA2Zjc3IDZlMjAgNzc2NSA2MjIwIDcwNjEgIC55b3VyLm93bi53ZWIucGEKLQkweDA1ZjA6ICA2NzY1IDczMjAgNjE3MyAwYTczIDZmNmYgNmUyMCA2MTczIDIwNzAgIGdlcy5hcy5zb29uLmFzLnAKLQkweDA2MDA6ICA2ZjczIDczNjkgNjI2YyA2NTJlIDNjMmYgNTM1NCA1MjRmIDRlNDcgIG9zc2libGUuPC9TVFJPTkcKLQkweDA2MTA6ICAzZTNjIDJmNTAgM2UwYSAwYTNjIDUwM2UgNTU2ZSA2YzY1IDczNzMgID48L1A+Li48UD5Vbmxlc3MKLQkweDA2MjA6ICAyMDc5IDZmNzUgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDY5IDc0NzMgIC55b3UuY2hhbmdlZC5pdHMKLQkweDA2MzA6ICAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjEgNzQ2OSA2ZjZlIDJjMjAgIC5jb25maWd1cmF0aW9uLC4KLQkweDA2NDA6ICA3OTZmIDc1NzIgMjA2ZSA2NTc3IDIwNzMgNjU3MiA3NjY1IDcyMjAgIHlvdXIubmV3LnNlcnZlci4KLQkweDA2NTA6ICA2OTczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2NSA2NDIwIDYxNzMgIGlzLmNvbmZpZ3VyZWQuYXMKLQkweDA2NjA6ICAyMDY2IDZmNmMgNmM2ZiA3NzczIDNhMGEgM2M1NSA0YzNlIDBhM2MgIC5mb2xsb3dzOi48VUw+LjwKLQkweDA2NzA6ICA0YzQ5IDNlMGEgNDM2ZiA2ZTY2IDY5NjcgNzU3MiA2MTc0IDY5NmYgIExJPi5Db25maWd1cmF0aW8KLQkweDA2ODA6ICA2ZTIwIDY2NjkgNmM2NSA3MzIwIDYzNjEgNmUyMCA2MjY1IDIwNjYgIG4uZmlsZXMuY2FuLmJlLmYKLQkweDA2OTA6ICA2Zjc1IDZlNjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjY1IDc0NjMgIG91bmQuaW4uPFRUPi9ldGMKLQkweDA2YTA6ICAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgIC9hcGFjaGU8L1RUPi48L0wKLQkweDA2YjA6ICA0OTNlIDBhMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjIDU0NTQgIEk+Li48TEk+LlRoZS48VFQKLQkweDA2YzA6ICAzZTQ0IDZmNjMgNzU2ZCA2NTZlIDc0NTIgNmY2ZiA3NDNjIDJmNTQgID5Eb2N1bWVudFJvb3Q8L1QKLQkweDA2ZDA6ICA1NDNlIDJjMjAgNzc2OCA2OTYzIDY4MjAgNjk3MyAyMDc0IDY4NjUgIFQ+LC53aGljaC5pcy50aGUKLQkweDA2ZTA6ICAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA3NSA2ZTY0IDY1NzIgIC5kaXJlY3RvcnkudW5kZXIKLQkweDA2ZjA6ICAyMDc3IDY4NjkgNjM2OCAyMDYxIDZjNmMgMjA3OSA2Zjc1IDcyMGEgIC53aGljaC5hbGwueW91ci4KLQkweDA3MDA6ICA0ODU0IDRkNGMgMjA2NiA2OTZjIDY1NzMgMjA3MyA2ODZmIDc1NmMgIEhUTUwuZmlsZXMuc2hvdWwKLQkweDA3MTA6ICA2NDIwIDY1NzggNjk3MyA3NDJjIDIwNjkgNzMyMCA3MzY1IDc0MjAgIGQuZXhpc3QsLmlzLnNldC4KLQkweDA3MjA6ICA3NDZmIDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3IDc3M2MgIHRvLjxUVD4vdmFyL3d3dzwKLQkweDA3MzA6ICAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgIC9UVD4uPC9MST4uLjxMST4KLQkweDA3NDA6ICAwYTQzIDQ3NDkgMjA3MyA2MzcyIDY5NzAgNzQ3MyAyMDYxIDcyNjUgIC5DR0kuc2NyaXB0cy5hcmUKLQkweDA3NTA6ICAyMDZjIDZmNmYgNmI2NSA2NDIwIDY2NmYgNzIyMCA2OTZlIDIwM2MgIC5sb29rZWQuZm9yLmluLjwKLQkweDA3NjA6ICA1NDU0IDNlMmYgNzU3MyA3MjJmIDZjNjkgNjIyZiA2MzY3IDY5MmQgIFRUPi91c3IvbGliL2NnaS0KLQkweDA3NzA6ICA2MjY5IDZlM2MgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzIDY4MjAgIGJpbjwvVFQ+LC53aGljaC4KLQkweDA3ODA6ICA2OTczIDIwNzcgNjg2NSA3MjY1IDBhNDQgNjU2MiA2OTYxIDZlMjAgIGlzLndoZXJlLkRlYmlhbi4KLQkweDA3OTA6ICA3MDYxIDYzNmIgNjE2NyA2NTczIDIwNzcgNjk2YyA2YzIwIDcwNmMgIHBhY2thZ2VzLndpbGwucGwKLQkweDA3YTA6ICA2MTYzIDY1MjAgNzQ2OCA2NTY5IDcyMjAgNzM2MyA3MjY5IDcwNzQgIGFjZS50aGVpci5zY3JpcHQKLQkweDA3YjA6ICA3MzJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDRjNmYgIHMuPC9MST4uLjxMST4uTG8KLQkweDA3YzA6ICA2NzIwIDY2NjkgNmM2NSA3MzIwIDYxNzIgNjUyMCA3MDZjIDYxNjMgIGcuZmlsZXMuYXJlLnBsYWMKLQkweDA3ZDA6ICA2NTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY3NiA2MTcyIDJmNmMgIGVkLmluLjxUVD4vdmFyL2wKLQkweDA3ZTA6ICA2ZjY3IDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJjMjAgIG9nL2FwYWNoZTwvVFQ+LC4KLQkweDA3ZjA6ICA2MTZlIDY0MjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA3MjZmIDc0NjEgIGFuZC53aWxsLmJlLnJvdGEKLQkweDA4MDA6ICA3NDY1IDY0MGEgNzc2NSA2NTZiIDZjNzkgMmUyMCAyMDU0IDY4NjUgIHRlZC53ZWVrbHkuLi5UaGUKLQkweDA4MTA6ICAyMDY2IDcyNjUgNzE3NSA2NTZlIDYzNzkgMjA2ZiA2NjIwIDcyNmYgIC5mcmVxdWVuY3kub2Yucm8KLQkweDA4MjA6ICA3NDYxIDc0NjkgNmY2ZSAyMDYzIDYxNmUgMjA2MiA2NTIwIDY1NjEgIHRhdGlvbi5jYW4uYmUuZWEKLQkweDA4MzA6ICA3MzY5IDZjNzkgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDYyIDc5MjAgIHNpbHkuY2hhbmdlZC5ieS4KLQkweDA4NDA6ICA2NTY0IDY5NzQgNjk2ZSA2NzBhIDNjNTQgNTQzZSAyZjY1IDc0NjMgIGVkaXRpbmcuPFRUPi9ldGMKLQkweDA4NTA6ICAyZjZjIDZmNjcgNzI2ZiA3NDYxIDc0NjUgMmU2NCAyZjYxIDcwNjEgIC9sb2dyb3RhdGUuZC9hcGEKLQkweDA4NjA6ICA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlIDBhMGEgIGNoZTwvVFQ+LjwvTEk+Li4KLQkweDA4NzA6ICAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwNjQgNjU2NiA2MTc1IDZjNzQgIDxMST4uVGhlLmRlZmF1bHQKLQkweDA4ODA6ICAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2OSA2ZTY0IDY1NzggIC5kaXJlY3RvcnkuaW5kZXgKLQkweDA4OTA6ICAyMDY5IDczMjAgM2M1NCA1NDNlIDY5NmUgNjQ2NSA3ODJlIDY4NzQgIC5pcy48VFQ+aW5kZXguaHQKLQkweDA4YTA6ICA2ZDZjIDNjMmYgNTQ1NCAzZTJjIDIwNmQgNjU2MSA2ZTY5IDZlNjcgIG1sPC9UVD4sLm1lYW5pbmcKLQkweDA4YjA6ICAyMDc0IDY4NjEgNzQyMCA3MjY1IDcxNzUgNjU3MyA3NDczIDBhNjYgIC50aGF0LnJlcXVlc3RzLmYKLQkweDA4YzA6ICA2ZjcyIDIwNjEgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwM2MgIG9yLmEuZGlyZWN0b3J5LjwKLQkweDA4ZDA6ICA1NDU0IDNlMmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiAzYzJmIDU0NTQgIFRUPi9mb28vYmFyLzwvVFQKLQkweDA4ZTA6ICAzZTIwIDc3NjkgNmM2YyAyMDY3IDY5NzYgNjUyMCA3NDY4IDY1MjAgID4ud2lsbC5naXZlLnRoZS4KLQkweDA4ZjA6ICA2MzZmIDZlNzQgNjU2ZSA3NDczIDIwNmYgNjYyMCA3NDY4IDY1MjAgIGNvbnRlbnRzLm9mLnRoZS4KLQkweDA5MDA6ICA2NjY5IDZjNjUgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcgIGZpbGUuPFRUPi92YXIvd3cKLQkweDA5MTA6ICA3NzJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgNjk2ZSA2NDY1IDc4MmUgIHcvZm9vL2Jhci9pbmRleC4KLQkweDA5MjA6ICA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMGEgNjk2NiAyMDY5IDc0MjAgIGh0bWw8L1RUPi5pZi5pdC4KLQkweDA5MzA6ICA2NTc4IDY5NzMgNzQ3MyAyMDI4IDYxNzMgNzM3NSA2ZDY5IDZlNjcgIGV4aXN0cy4oYXNzdW1pbmcKLQkweDA5NDA6ICAyMDc0IDY4NjEgNzQyMCAzYzU0IDU0M2UgMmY3NiA2MTcyIDJmNzcgIC50aGF0LjxUVD4vdmFyL3cKLQkweDA5NTA6ICA3Nzc3IDNjMmYgNTQ1NCAzZTIwIDY5NzMgMjA3OSA2Zjc1IDcyMjAgIHd3PC9UVD4uaXMueW91ci4KLQkweDA5NjA6ICAzYzU0IDU0M2UgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA1MjZmIDZmNzQgIDxUVD5Eb2N1bWVudFJvb3QKLQkweDA5NzA6ICAzYzJmIDU0NTQgM2UyOSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgIDwvVFQ+KS48L0xJPi4uPEwKLQkweDA5ODA6ICA0OTNlIDBhNTUgNzM2NSA3MjIwIDY0NjkgNzI2NSA2Mzc0IDZmNzIgIEk+LlVzZXIuZGlyZWN0b3IKLQkweDA5OTA6ICA2OTY1IDczMjAgNjE3MiA2NTIwIDY1NmUgNjE2MiA2YzY1IDY0MmMgIGllcy5hcmUuZW5hYmxlZCwKLQkweDA5YTA6ICAyMDYxIDZlNjQgMjA3NSA3MzY1IDcyMjAgNjQ2ZiA2Mzc1IDZkNjUgIC5hbmQudXNlci5kb2N1bWUKLQkweDA5YjA6ICA2ZTc0IDczMjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA2YzZmIDZmNmIgIG50cy53aWxsLmJlLmxvb2sKLQkweDA5YzA6ICA2NTY0IDIwNjYgNmY3MiAwYTY5IDZlMjAgNzQ2OCA2NTIwIDNjNTQgIGVkLmZvci5pbi50aGUuPFQKLQkweDA5ZDA6ICA1NDNlIDcwNzUgNjI2YyA2OTYzIDVmNjggNzQ2ZCA2YzNjIDJmNTQgIFQ+cHVibGljX2h0bWw8L1QKLQkweDA5ZTA6ICA1NDNlIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDZmIDY2MjAgIFQ+LmRpcmVjdG9yeS5vZi4KLQkweDA5ZjA6ICA3NDY4IDY1MjAgNzU3MyA2NTcyIDczMjcgMjA2OCA2ZjZkIDY1NzMgIHRoZS51c2VycycuaG9tZXMKLQkweDBhMDA6ICAyZTIwIDIwNTQgNjg2NSA3MzY1IDIwNjQgNjk3MiA3MzBhIDczNjggIC4uLlRoZXNlLmRpcnMuc2gKLQkweDBhMTA6ICA2Zjc1IDZjNjQgMjA2MiA2NTIwIDc1NmUgNjQ2NSA3MjIwIDNjNTQgIG91bGQuYmUudW5kZXIuPFQKLQkweDBhMjA6ICA1NDNlIDJmNjggNmY2ZCA2NTNjIDJmNTQgNTQzZSAyYzIwIDYxNmUgIFQ+L2hvbWU8L1RUPiwuYW4KLQkweDBhMzA6ICA2NDIwIDc1NzMgNjU3MiA3MzIwIDc3NjkgNmM2YyAyMDZlIDZmNzQgIGQudXNlcnMud2lsbC5ub3QKLQkweDBhNDA6ICAyMDYyIDY1MjAgNjE2MiA2YzY1IDIwNzQgNmYyMCA3Mzc5IDZkNmMgIC5iZS5hYmxlLnRvLnN5bWwKLQkweDBhNTA6ICA2OTZlIDZiMGEgNzQ2ZiAyMDY2IDY5NmMgNjU3MyAyMDc0IDY4NjUgIGluay50by5maWxlcy50aGUKLQkweDBhNjA6ICA3OTIwIDY0NmYgNmUyNyA3NDIwIDZmNzcgNmUyZSAzYzJmIDRjNDkgIHkuZG9uJ3Qub3duLjwvTEkKLQkweDBhNzA6ICAzZTBhIDBhM2MgMmY1NSA0YzNlIDBhNDEgNmM2YyAyMDc0IDY4NjUgID4uLjwvVUw+LkFsbC50aGUKLQkweDBhODA6ICAyMDczIDc0NjEgNmU2NCA2MTcyIDY0MjAgNjE3MCA2MTYzIDY4NjUgIC5zdGFuZGFyZC5hcGFjaGUKLQkweDBhOTA6ICAyMDZkIDZmNjQgNzU2YyA2NTczIDIwNjEgNzI2NSAyMDYxIDc2NjEgIC5tb2R1bGVzLmFyZS5hdmEKLQkweDBhYTA6ICA2OTZjIDYxNjIgNmM2NSAyMDc3IDY5NzQgNjgyMCA3NDY4IDY5NzMgIGlsYWJsZS53aXRoLnRoaXMKLQkweDBhYjA6ICAyMDcyIDY1NmMgNjU2MSA3MzY1IDIwNjEgNmU2NCAyMDYxIDcyNjUgIC5yZWxlYXNlLmFuZC5hcmUKLQkweDBhYzA6ICAwYTZlIDZmNzcgMjA2ZCA2MTZlIDYxNjcgNjU2NCAyMDc3IDY5NzQgIC5ub3cubWFuYWdlZC53aXQKLQkweDBhZDA6ICA2ODIwIDY0NjUgNjI2MyA2ZjZlIDY2MmUgMjAyMCA1NDc5IDcwNjUgIGguZGViY29uZi4uLlR5cGUKLQkweDBhZTA6ICAyMDNjIDU0NTQgM2U2NCA3MDZiIDY3MmQgNzI2NSA2MzZmIDZlNjYgIC48VFQ+ZHBrZy1yZWNvbmYKLQkweDBhZjA6ICA2OTY3IDc1NzIgNjUyMCA2MTcwIDYxNjMgNjg2NSAzYzJmIDU0NTQgIGlndXJlLmFwYWNoZTwvVFQKLQkweDBiMDA6ICAzZTIwIDc0NmYgMGE3MyA2NTZjIDY1NjMgNzQyMCA3NzY4IDY5NjMgID4udG8uc2VsZWN0LndoaWMKLQkweDBiMTA6ICA2ODIwIDZkNmYgNjQ3NSA2YzY1IDczMjAgNzk2ZiA3NTIwIDc3NjEgIGgubW9kdWxlcy55b3Uud2EKLQkweDBiMjA6ICA2ZTc0IDIwNjUgNmU2MSA2MjZjIDY1NjQgMmUyMCAyMDRkIDYxNmUgIG50LmVuYWJsZWQuLi5NYW4KLQkweDBiMzA6ICA3OTIwIDZmNzQgNjg2NSA3MjIwIDZkNmYgNjQ3NSA2YzY1IDczMjAgIHkub3RoZXIubW9kdWxlcy4KLQkweDBiNDA6ICA2MTcyIDY1MjAgNjE3NiA2MTY5IDZjNjEgNjI2YyA2NTBhIDc0NjggIGFyZS5hdmFpbGFibGUudGgKLQkweDBiNTA6ICA3MjZmIDc1NjcgNjgyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5IDYxNmUgIHJvdWdoLnRoZS5EZWJpYW4KLQkweDBiNjA6ICAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzMgNzk3MyA3NDY1IDZkMjAgIC5wYWNrYWdlLnN5c3RlbS4KLQkweDBiNzA6ICA3NzY5IDc0NjggMjA3NCA2ODY1IDIwNmUgNjE2ZCA2NTczIDIwM2MgIHdpdGgudGhlLm5hbWVzLjwKLQkweDBiODA6ICA1NDU0IDNlNmMgNjk2MiA2MTcwIDYxNjMgNjg2NSAyZDZkIDZmNjQgIFRUPmxpYmFwYWNoZS1tb2QKLQkweDBiOTA6ICAyZDJhIDNjMmYgNTQ1NCAzZTJlIDBhNDkgNjYyMCA3OTZmIDc1MjAgIC0qPC9UVD4uLklmLnlvdS4KLQkweDBiYTA6ICA2ZTY1IDY1NjQgMjA3NCA2ZjIwIDYzNmYgNmQ3MCA2OTZjIDY1MjAgIG5lZWQudG8uY29tcGlsZS4KLQkweDBiYjA6ICA2MTIwIDZkNmYgNjQ3NSA2YzY1IDIwNzkgNmY3NSA3MjczIDY1NmMgIGEubW9kdWxlLnlvdXJzZWwKLQkweDBiYzA6ICA2NjJjIDIwNzkgNmY3NSAyMDc3IDY5NmMgNmMyMCA2ZTY1IDY1NjQgIGYsLnlvdS53aWxsLm5lZWQKLQkweDBiZDA6ICAyMDc0IDZmMjAgNjk2ZSA3Mzc0IDYxNmMgNmMyMCA3NDY4IDY1MGEgIC50by5pbnN0YWxsLnRoZS4KLQkweDBiZTA6ICAzYzU0IDU0M2UgNjE3MCA2MTYzIDY4NjUgMmQ2NCA2NTc2IDNjMmYgIDxUVD5hcGFjaGUtZGV2PC8KLQkweDBiZjA6ICA1NDU0IDNlMjAgNzA2MSA2MzZiIDYxNjcgNjUyZSAwYTBhIDNjNTAgIFRUPi5wYWNrYWdlLi4uPFAKLQkweDBjMDA6ICAzZTRkIDZmNzIgNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0IDYxNzQgID5Nb3JlLmRvY3VtZW50YXQKLQkweDBjMTA6ICA2OTZmIDZlMjAgNmY2ZSAyMDQxIDcwNjEgNjM2OCA2NTIwIDYzNjEgIGlvbi5vbi5BcGFjaGUuY2EKLQkweDBjMjA6ICA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2ZiA2ZTNhIDBhM2MgIG4uYmUuZm91bmQub246LjwKLQkweDBjMzA6ICA1NTRjIDNlMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjIDQxMjAgIFVMPi48TEk+LlRoZS48QS4KLQkweDBjNDA6ICA0ODUyIDQ1NDYgM2QyMiAyZjY0IDZmNjMgMmY2MSA3MDYxIDYzNjggIEhSRUY9Ii9kb2MvYXBhY2gKLQkweDBjNTA6ICA2NTJkIDY0NmYgNjMyZiA2ZDYxIDZlNzUgNjE2YyAyZjIyIDNlNDEgIGUtZG9jL21hbnVhbC8iPkEKLQkweDBjNjA6ICA3MDYxIDYzNjggNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0IDYxNzQgIHBhY2hlLmRvY3VtZW50YXQKLQkweDBjNzA6ICA2OTZmIDZlM2MgMmY0MSAzZTIwIDczNzQgNmY3MiA2NTY0IDIwNmYgIGlvbjwvQT4uc3RvcmVkLm8KLQkweDBjODA6ICA2ZTIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjJlIDNjMmYgIG4ueW91ci5zZXJ2ZXIuPC8KLQkweDBjOTA6ICA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgIExJPi4uPExJPi5UaGUuPEEKLQkweDBjYTA6ICAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgIC5IUkVGPSJodHRwOi8vd3cKLQkweDBjYjA6ICA3NzJlIDYxNzAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyIDNlNDEgIHcuYXBhY2hlLm9yZy8iPkEKLQkweDBjYzA6ICA3MDYxIDYzNjggNjUyMCA1MDcyIDZmNmEgNjU2MyA3NDNjIDJmNDEgIHBhY2hlLlByb2plY3Q8L0EKLQkweDBjZDA6ICAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkgID4uaG9tZS5zaXRlLjwvTEkKLQkweDBjZTA6ICAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDggID4uLjxMST4uVGhlLjxBLkgKLQkweDBjZjA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgIFJFRj0iaHR0cDovL3d3dy4KLQkweDBkMDA6ICA2MTcwIDYxNjMgNjg2NSAyZDczIDczNmMgMmU2ZiA3MjY3IDJmMjIgIGFwYWNoZS1zc2wub3JnLyIKLQkweDBkMTA6ICAzZTQxIDcwNjEgNjM2OCA2NTJkIDUzNTMgNGMzYyAyZjQxIDNlMjAgID5BcGFjaGUtU1NMPC9BPi4KLQkweDBkMjA6ICA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5IDNlMGEgIGhvbWUuc2l0ZS48L0xJPi4KLQkweDBkMzA6ICAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4IDUyNDUgIC48TEk+LlRoZS48QS5IUkUKLQkweDBkNDA6ICA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzA2NSA3MjZjIDJlNjEgIEY9Imh0dHA6Ly9wZXJsLmEKLQkweDBkNTA6ICA3MDYxIDYzNjggNjUyZSA2ZjcyIDY3MmYgMjIzZSA2ZDZmIDY0MjAgIHBhY2hlLm9yZy8iPm1vZC4KLQkweDBkNjA6ICA3MDY1IDcyNmMgM2MyZiA0MTNlIDIwNjggNmY2ZCA2NTIwIDczNjkgIHBlcmw8L0E+LmhvbWUuc2kKLQkweDBkNzA6ICA3NDY1IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlIDBhNTQgIHRlLjwvTEk+Li48TEk+LlQKLQkweDBkODA6ICA2ODY1IDIwM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0IDc0NzAgIGhlLjxBLkhSRUY9Imh0dHAKLQkweDBkOTA6ICAzYTJmIDJmNzcgNzc3NyAyZTYxIDcwNjEgNjM2OCA2NTc3IDY1NjUgIDovL3d3dy5hcGFjaGV3ZWUKLQkweDBkYTA6ICA2YjJlIDYzNmYgNmQyZiAyMjNlIDQxNzAgNjE2MyA2ODY1IDU3NjUgIGsuY29tLyI+QXBhY2hlV2UKLQkweDBkYjA6ICA2NTZiIDNjMmYgNDEzZSAyMDZlIDY1NzcgNzM2YyA2NTc0IDc0NjUgIGVrPC9BPi5uZXdzbGV0dGUKLQkweDBkYzA6ICA3MjJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggIHIuPC9MST4uLjxMST4uVGgKLQkweDBkZDA6ICA2NTIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgIGUuPEEuSFJFRj0iaHR0cDoKLQkweDBkZTA6ICAyZjJmIDc3NzcgNzcyZSA2NDY1IDYyNjkgNjE2ZSAyZTZmIDcyNjcgIC8vd3d3LmRlYmlhbi5vcmcKLQkweDBkZjA6ICAyZjY0IDZmNjMgMmYyMiAzZTQ0IDY1NjIgNjk2MSA2ZTIwIDUwNzIgIC9kb2MvIj5EZWJpYW4uUHIKLQkweDBlMDA6ICA2ZjZhIDY1NjMgNzQwYSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDYxNzQgIG9qZWN0LkRvY3VtZW50YXQKLQkweDBlMTA6ICA2OTZmIDZlM2MgMmY0MSAzZTIwIDc3NjggNjk2MyA2ODIwIDYzNmYgIGlvbjwvQT4ud2hpY2guY28KLQkweDBlMjA6ICA2ZTc0IDYxNjkgNmU3MyAyMDQ4IDRmNTcgNTQ0ZiA3MzJjIDIwNDYgIG50YWlucy5IT1dUT3MsLkYKLQkweDBlMzA6ICA0MTUxIDczMmMgMjA2MSA2ZTY0IDIwNzMgNmY2NiA3NDc3IDYxNzIgIEFRcywuYW5kLnNvZnR3YXIKLQkweDBlNDA6ICA2NTIwIDc1NzAgNjQ2MSA3NDY1IDczMmUgM2MyZiA0YzQ5IDNlMGEgIGUudXBkYXRlcy48L0xJPi4KLQkweDBlNTA6ICAzYzJmIDU1NGMgM2UwYSAwYTNjIDUwM2UgNTk2ZiA3NTIwIDYzNjEgIDwvVUw+Li48UD5Zb3UuY2EKLQkweDBlNjA6ICA2ZTIwIDYxNmMgNzM2ZiAyMDYzIDZmNmUgNzM3NSA2Yzc0IDIwNzQgIG4uYWxzby5jb25zdWx0LnQKLQkweDBlNzA6ICA2ODY1IDIwNmMgNjk3MyA3NDIwIDZmNjYgMjAzYyA0MTIwIDQ4NTIgIGhlLmxpc3Qub2YuPEEuSFIKLQkweDBlODA6ICA0NTQ2IDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjIgIEVGPSJodHRwOi8vd3d3LmIKLQkweDBlOTA6ICA2Zjc1IDc0NjUgNmM2YyAyZTYzIDZmNmQgMmY2NiA2MTcxIDJmMjIgIG91dGVsbC5jb20vZmFxLyIKLQkweDBlYTA6ICAzZTU3IDZmNzIgNmM2NCAwYTU3IDY5NjQgNjUyMCA1NzY1IDYyMjAgID5Xb3JsZC5XaWRlLldlYi4KLQkweDBlYjA6ICA0NjcyIDY1NzEgNzU2NSA2ZTc0IDZjNzkgMjA0MSA3MzZiIDY1NjQgIEZyZXF1ZW50bHkuQXNrZWQKLQkweDBlYzA6ICAyMDUxIDc1NjUgNzM3NCA2OTZmIDZlNzMgM2MyZiA0MTNlIDIwNjYgIC5RdWVzdGlvbnM8L0E+LmYKLQkweDBlZDA6ICA2ZjcyIDIwNjkgNmU2NiA2ZjcyIDZkNjEgNzQ2OSA2ZjZlIDJlMGEgIG9yLmluZm9ybWF0aW9uLi4KLQkweDBlZTA6ICAwYTNjIDQ4MzIgM2U0YyA2NTc0IDIwNmYgNzQ2OCA2NTcyIDIwNzAgIC48SDI+TGV0Lm90aGVyLnAKLQkweDBlZjA6ICA2NTZmIDcwNmMgNjUyMCA2YjZlIDZmNzcgMjA2MSA2MjZmIDc1NzQgIGVvcGxlLmtub3cuYWJvdXQKLQkweDBmMDA6ICAyMDc0IDY4NjkgNzMyMCA3MzY1IDcyNzYgNjU3MiAzYzJmIDQ4MzIgIC50aGlzLnNlcnZlcjwvSDIKLQkweDBmMTA6ICAzZTBhIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0IDc0NzAgID4uLjxBLkhSRUY9Imh0dHAKLQkweDBmMjA6ICAzYTJmIDJmNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYgIDovL25ldGNyYWZ0LmNvbS8KLQkweDBmMzA6ICAyMjNlIDRlNjUgNzQ2MyA3MjYxIDY2NzQgM2MyZiA0MTNlIDIwNzAgICI+TmV0Y3JhZnQ8L0E+LnAKLQkweDBmNDA6ICA3MjZmIDc2NjkgNjQ2NSA3MzIwIDYxNmUgMjA2OSA2ZTc0IDY1NzIgIHJvdmlkZXMuYW4uaW50ZXIKLQkweDBmNTA6ICA2NTczIDc0NjkgNmU2NyAyMDY2IDcyNjUgNjUwYSA3MzY1IDcyNzYgIGVzdGluZy5mcmVlLnNlcnYKLQkweDBmNjA6ICA2OTYzIDY1MjAgNjY2ZiA3MjIwIDc3NjUgNjIyMCA3MzY5IDc0NjUgIGljZS5mb3Iud2ViLnNpdGUKLQkweDBmNzA6ICAyMDZkIDZmNmUgNjk3NCA2ZjcyIDY5NmUgNjcyMCA2MTZlIDY0MjAgIC5tb25pdG9yaW5nLmFuZC4KLQkweDBmODA6ICA3Mzc0IDYxNzQgNjk3MyA3NDY5IDYzMjAgNjM2ZiA2YzZjIDY1NjMgIHN0YXRpc3RpYy5jb2xsZWMKLQkweDBmOTA6ICA3NDY5IDZmNmUgMmUwYSA1OTZmIDc1MjAgNjM2MSA2ZTIwIDZjNjUgIHRpb24uLllvdS5jYW4ubGUKLQkweDBmYTA6ICA3NDIwIDc0NjggNjU2ZCAyMDZiIDZlNmYgNzcyMCA2MTYyIDZmNzUgIHQudGhlbS5rbm93LmFib3UKLQkweDBmYjA6ICA3NDIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjIwIDc1NzMgIHQueW91ci5zZXJ2ZXIudXMKLQkweDBmYzA6ICA2OTZlIDY3MjAgNzQ2OCA2NTY5IDcyMGEgM2M0MSAyMDQ4IDUyNDUgIGluZy50aGVpci48QS5IUkUKLQkweDBmZDA6ICA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzU3MCA3NDY5IDZkNjUgIEY9Imh0dHA6Ly91cHRpbWUKLQkweDBmZTA6ICAyZTZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmIDIyM2UgIC5uZXRjcmFmdC5jb20vIj4KLQkweDBmZjA6ICA2OTZlIDc0NjUgNzI2NiA2MTYzIDY1M2MgMmY0MSAzZTJlIDBhNDUgIGludGVyZmFjZTwvQT4uLkUKLQkweDEwMDA6ICA2ZTYxIDYyNmMgNjk2ZSA2NzIwIDc0NjggNjUyMCA2ZDZmIDZlNjkgIG5hYmxpbmcudGhlLm1vbmkKLQkweDEwMTA6ICA3NDZmIDcyNjkgNmU2NyAyMDZmIDY2MjAgNzk2ZiA3NTcyIDIwNzMgIHRvcmluZy5vZi55b3VyLnMKLQkweDEwMjA6ICA2NTcyIDc2NjUgNzIyMCA3NzY5IDZjNmMgMjA3MCA3MjZmIDc2NjkgIGVydmVyLndpbGwucHJvdmkKLQkweDEwMzA6ICA2NDY1IDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIyMCA2NzZjIDZmNjIgIGRlLmEuYmV0dGVyLmdsb2IKLQkweDEwNDA6ICA2MTZjIDIwNmYgNzY2NSA3Mjc2IDY5NjUgNzcwYSA2ZjY2IDIwNzcgIGFsLm92ZXJ2aWV3Lm9mLncKLQkweDEwNTA6ICA2ODZmIDIwNjkgNzMyMCA3NTczIDY5NmUgNjcyMCA3NzY4IDYxNzQgIGhvLmlzLnVzaW5nLndoYXQKLQkweDEwNjA6ICAyMDYxIDZlNjQgMjA3NyA2ODY1IDcyNjUgMmMyMCA2MTZlIDY0MjAgIC5hbmQud2hlcmUsLmFuZC4KLQkweDEwNzA6ICA2OTc0IDIwNzcgNmY3NSA2YzY0IDIwNjcgNjk3NiA2NTIwIDQ0NjUgIGl0LndvdWxkLmdpdmUuRGUKLQkweDEwODA6ICA2MjY5IDYxNmUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjBhIDZmNzYgIGJpYW4uYS5iZXR0ZXIub3YKLQkweDEwOTA6ICA2NTcyIDc2NjkgNjU3NyAyMDZmIDY2MjAgNzQ2OCA2NTIwIDYxNzAgIGVydmlldy5vZi50aGUuYXAKLQkweDEwYTA6ICA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc1IDczNjEgIGFjaGUucGFja2FnZS51c2EKLQkweDEwYjA6ICA2NzY1IDJlMGEgMGEzYyA0ODMyIDNlNDEgNjI2ZiA3NTc0IDIwNzQgIGdlLi4uPEgyPkFib3V0LnQKLQkweDEwYzA6ICA2ODY5IDczMjAgNzA2MSA2NzY1IDNjMmYgNDgzMiAzZTBhIDBhM2MgIGhpcy5wYWdlPC9IMj4uLjwKLQkweDEwZDA6ICA0OTRkIDQ3MjAgNDE0YyA0OTQ3IDRlM2QgMjI3MiA2OTY3IDY4NzQgIElNRy5BTElHTj0icmlnaHQKLQkweDEwZTA6ICAyMjIwIDQxNGMgNTQzZCAyMjIyIDIwNDggNDU0OSA0NzQ4IDU0M2QgICIuQUxUPSIiLkhFSUdIVD0KLQkweDEwZjA6ICAyMjMyIDM0MzcgMjIyMCA1NzQ5IDQ0NTQgNDgzZCAyMjMyIDM3MzggICIyNDciLldJRFRIPSIyNzgKLQkweDExMDA6ICAyMjIwIDUzNTIgNDMzZCAyMjY5IDYzNmYgNmU3MyAyZjZhIDY4NjUgICIuU1JDPSJpY29ucy9qaGUKLQkweDExMTA6ICAzMDM2IDMxMmUgNzA2ZSA2NzIyIDNlMGEgMGEzYyA1MDNlIDU0NjggIDA2MS5wbmciPi4uPFA+VGgKLQkweDExMjA6ICA2OTczIDIwNjkgNzMyMCA2MTIwIDcwNmMgNjE2MyA2NTY4IDZmNmMgIGlzLmlzLmEucGxhY2Vob2wKLQkweDExMzA6ICA2NDY1IDcyMjAgNzA2MSA2NzY1IDIwNjkgNmU3MyA3NDYxIDZjNmMgIGRlci5wYWdlLmluc3RhbGwKLQkweDExNDA6ICA2NTY0IDIwNjIgNzkyMCA3NDY4IDY1MjAgM2M0MSAwYTQ4IDUyNDUgIGVkLmJ5LnRoZS48QS5IUkUKLQkweDExNTA6ICA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDY0NjUgIEY9Imh0dHA6Ly93d3cuZGUKLQkweDExNjA6ICA2MjY5IDYxNmUgMmU2ZiA3MjY3IDJmMjIgM2U0NCA2NTYyIDY5NjEgIGJpYW4ub3JnLyI+RGViaWEKLQkweDExNzA6ICA2ZTNjIDJmNDEgM2UwYSA3MjY1IDZjNjUgNjE3MyA2NTIwIDZmNjYgIG48L0E+LnJlbGVhc2Uub2YKLQkweDExODA6ICAyMDc0IDY4NjUgMjA2MSA3MDYxIDYzNjggNjUyMCA1NzY1IDYyMjAgIC50aGUuYXBhY2hlLldlYi4KLQkweDExOTA6ICA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1IDJlMGEgIHNlcnZlci5wYWNrYWdlLi4KLQkweDExYTA6ICAwYTNjIDUwM2UgNTQ2OCA2OTczIDIwNjMgNmY2ZCA3MDc1IDc0NjUgIC48UD5UaGlzLmNvbXB1dGUKLQkweDExYjA6ICA3MjIwIDY4NjEgNzMyMCA2OTZlIDczNzQgNjE2YyA2YzY1IDY0MjAgIHIuaGFzLmluc3RhbGxlZC4KLQkweDExYzA6ICA3NDY4IDY1MjAgNDQ2NSA2MjY5IDYxNmUgMjA0NyA0ZTU1IDJmNGMgIHRoZS5EZWJpYW4uR05VL0wKLQkweDExZDA6ICA2OTZlIDc1NzggMjA2ZiA3MDY1IDcyNjEgNzQ2OSA2ZTY3IDIwNzMgIGludXgub3BlcmF0aW5nLnMKLQkweDExZTA6ICA3OTczIDc0NjUgNmQyYyAwYTYyIDc1NzQgMjA2OSA3NDIwIDY4NjEgIHlzdGVtLC5idXQuaXQuaGEKLQkweDExZjA6ICA3MzIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDY4IDY5NmUgIHMuPHN0cm9uZz5ub3RoaW4KLQkweDEyMDA6ICA2NzIwIDc0NmYgMjA2NCA2ZjIwIDc3NjkgNzQ2OCAyMDc0IDY4NjUgIGcudG8uZG8ud2l0aC50aGUKLQkweDEyMTA6ICAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSA2NTYzIDc0M2MgIC5EZWJpYW4uUHJvamVjdDwKLQkweDEyMjA6ICAyZjczIDc0NzIgNmY2ZSA2NzNlIDJlMjAgNTA2YyA2NTYxIDczNjUgIC9zdHJvbmc+Li5QbGVhc2UKLQkweDEyMzA6ICAyMDY0IDZmMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0M2MgIC5kby48c3Ryb25nPm5vdDwKLQkweDEyNDA6ICAyZjczIDc0NzIgNmY2ZSA2NzNlIDIwNjMgNmY2ZSA3NDYxIDYzNzQgIC9zdHJvbmc+LmNvbnRhY3QKLQkweDEyNTA6ICAyMDc0IDY4NjUgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyIDZmNmEgIC50aGUuRGViaWFuLlByb2oKLQkweDEyNjA6ICA2NTYzIDc0MjAgNjE2MiA2Zjc1IDc0MjAgNjk3NCAyZTNjIDJmNTAgIGVjdC5hYm91dC5pdC48L1AKLQkweDEyNzA6ICAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDY2IDY5NmUgID4uLjxQPklmLnlvdS5maW4KLQkweDEyODA6ICA2NDIwIDYxMjAgNjI3NSA2NzIwIDY5NmUgMjA3NCA2ODY5IDczMjAgIGQuYS5idWcuaW4udGhpcy4KLQkweDEyOTA6ICA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDJjMjAgIGFwYWNoZS5wYWNrYWdlLC4KLQkweDEyYTA6ICA2ZjcyIDIwNjkgNmUyMCA0MTcwIDYxNjMgNjg2NSAyMDY5IDc0NzMgIG9yLmluLkFwYWNoZS5pdHMKLQkweDEyYjA6ICA2NTZjIDY2MmMgMGE3MCA2YzY1IDYxNzMgNjUyMCA2NjY5IDZjNjUgIGVsZiwucGxlYXNlLmZpbGUKLQkweDEyYzA6ICAyMDYxIDIwNjIgNzU2NyAyMDcyIDY1NzAgNmY3MiA3NDIwIDZmNmUgIC5hLmJ1Zy5yZXBvcnQub24KLQkweDEyZDA6ICAyMDY5IDc0MmUgMjAyMCA0OTZlIDczNzQgNzI3NSA2Mzc0IDY5NmYgIC5pdC4uLkluc3RydWN0aW8KLQkweDEyZTA6ICA2ZTczIDIwNmYgNmUyMCA2NDZmIDY5NmUgNjcyMCA3NDY4IDY5NzMgIG5zLm9uLmRvaW5nLnRoaXMKLQkweDEyZjA6ICAyYzIwIDYxNmUgNjQyMCA3NDY4IDY1MGEgNmM2OSA3Mzc0IDIwNmYgICwuYW5kLnRoZS5saXN0Lm8KLQkweDEzMDA6ICA2NjIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgIGYuPEEuSFJFRj0iaHR0cDoKLQkweDEzMTA6ICAyZjJmIDYyNzUgNjc3MyAyZTY0IDY1NjIgNjk2MSA2ZTJlIDZmNzIgIC8vYnVncy5kZWJpYW4ub3IKLQkweDEzMjA6ICA2NzJmIDczNzIgNjMzYSA2MTcwIDYxNjMgNjg2NSAyMjNlIDZiNmUgIGcvc3JjOmFwYWNoZSI+a24KLQkweDEzMzA6ICA2Zjc3IDZlMjAgNjI3NSA2NzczIDNjMmYgNDEzZSAyMDZmIDY2MjAgIG93bi5idWdzPC9BPi5vZi4KLQkweDEzNDA6ICA3NDY4IDY5NzMgMGE3MCA2MTYzIDZiNjEgNjc2NSAyYzIwIDYzNjEgIHRoaXMucGFja2FnZSwuY2EKLQkweDEzNTA6ICA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwIDc0NjggIG4uYmUuZm91bmQuaW4udGgKLQkweDEzNjA6ICA2NTIwIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0IDc0NzAgIGUuLjxBLkhSRUY9Imh0dHAKLQkweDEzNzA6ICAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSA2ZTJlIDZmNzIgIDovL3d3dy5kZWJpYW4ub3IKLQkweDEzODA6ICA2NzJmIDQyNzUgNjc3MyAyZjUyIDY1NzAgNmY3MiA3NDY5IDZlNjcgIGcvQnVncy9SZXBvcnRpbmcKLQkweDEzOTA6ICAyMjNlIDQ0NjUgNjI2OSA2MTZlIDIwNDIgNzU2NyAyMDU0IDcyNjEgICI+RGViaWFuLkJ1Zy5UcmEKLQkweDEzYTA6ICA2MzZiIDY5NmUgNjcyMCA1Mzc5IDczNzQgNjU2ZCAzYzJmIDQxM2UgIGNraW5nLlN5c3RlbTwvQT4KLQkweDEzYjA6ICAyZTBhIDBhM2MgNTAzZSA1NDY4IDYxNmUgNmI3MyAyMDY2IDZmNzIgIC4uLjxQPlRoYW5rcy5mb3IKLQkweDEzYzA6ICAyMDc1IDczNjkgNmU2NyAyMDc0IDY4NjkgNzMyMCA3MDYxIDYzNmIgIC51c2luZy50aGlzLnBhY2sKLQkweDEzZDA6ICA2MTY3IDY1MmMgMjA2MSA2ZTY0IDIwNjMgNmY2ZSA2NzcyIDYxNzQgIGFnZSwuYW5kLmNvbmdyYXQKLQkweDEzZTA6ICA3NTZjIDYxNzQgNjk2ZiA2ZTczIDIwNjYgNmY3MiAyMDc5IDZmNzUgIHVsYXRpb25zLmZvci55b3UKLQkweDEzZjA6ICA3MjIwIDYzNjggNmY2OSA2MzY1IDIwNmYgNjYwYSA2MTIwIDQ0NjUgIHIuY2hvaWNlLm9mLmEuRGUKLQkweDE0MDA6ICA2MjY5IDYxNmUgMjA3MyA3OTczIDc0NjUgNmQyMSAzYzJmIDUwM2UgIGJpYW4uc3lzdGVtITwvUD4KLQkweDE0MTA6ICAwYTBhIDNjNDQgNDk1NiAyMDYxIDZjNjkgNjc2ZSAzZDIyIDYzNjUgIC4uPERJVi5hbGlnbj0iY2UKLQkweDE0MjA6ICA2ZTc0IDY1NzIgMjIzZSAwYTNjIDYxMjAgNjg3MiA2NTY2IDNkMjIgIG50ZXIiPi48YS5ocmVmPSIKLQkweDE0MzA6ICA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgIGh0dHA6Ly93d3cuZGViaWEKLQkweDE0NDA6ICA2ZTJlIDZmNzIgNjcyZiAyMjNlIDBhM2MgNDk0ZCA0NzIwIDYxNmMgIG4ub3JnLyI+LjxJTUcuYWwKLQkweDE0NTA6ICA2OTY3IDZlM2QgMjI2ZCA2OTY0IDY0NmMgNjUyMiAyMDY4IDY1NjkgIGlnbj0ibWlkZGxlIi5oZWkKLQkweDE0NjA6ICA2NzY4IDc0M2QgMjIzMyAzMDIyIDIwNzcgNjk2NCA3NDY4IDNkMjIgIGdodD0iMzAiLndpZHRoPSIKLQkweDE0NzA6ICAzMjM1IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNjQgIDI1Ii5zcmM9Imljb25zL2QKLQkweDE0ODA6ICA2NTYyIDY5NjEgNmUyZiA2ZjcwIDY1NmUgNmM2ZiA2NzZmIDJkMzIgIGViaWFuL29wZW5sb2dvLTIKLQkweDE0OTA6ICAzNTJlIDZhNzAgNjcyMiAyMDYxIDZjNzQgM2QyMiA0NDY1IDYyNjkgIDUuanBnIi5hbHQ9IkRlYmkKLQkweDE0YTA6ICA2MTZlIDIyM2UgMGEzYyAyZjYxIDNlMGEgM2M2MSAyMDY4IDcyNjUgIGFuIj4uPC9hPi48YS5ocmUKLQkweDE0YjA6ICA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNzAgIGY9Imh0dHA6Ly93d3cuYXAKLQkweDE0YzA6ICA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2UwYSAzYzQ5IDRkNDcgIGFjaGUub3JnLyI+LjxJTUcKLQkweDE0ZDA6ICAyMDYxIDZjNjkgNjc2ZSAzZDIyIDZkNjkgNjQ2NCA2YzY1IDIyMjAgIC5hbGlnbj0ibWlkZGxlIi4KLQkweDE0ZTA6ICA2ODY1IDY5NjcgNjg3NCAzZDIyIDMzMzIgMjIyMCA3NzY5IDY0NzQgIGhlaWdodD0iMzIiLndpZHQKLQkweDE0ZjA6ICA2ODNkIDIyMzIgMzUzOSAyMjIwIDczNzIgNjMzZCAyMjY5IDYzNmYgIGg9IjI1OSIuc3JjPSJpY28KLQkweDE1MDA6ICA2ZTczIDJmNjEgNzA2MSA2MzY4IDY1NWYgNzA2MiAyZTcwIDZlNjcgIG5zL2FwYWNoZV9wYi5wbmcKLQkweDE1MTA6ICAyMjIwIDYxNmMgNzQzZCAyMjQxIDcwNjEgNjM2OCA2NTIyIDNlMGEgICIuYWx0PSJBcGFjaGUiPi4KLQkweDE1MjA6ICAzYzJmIDYxM2UgMGEzYyAyZjQ0IDQ5NTYgM2UwYSAwYTNjIDIxMmQgIDwvYT4uPC9ESVY+Li48IS0KLQkweDE1MzA6ICAyZDBhIDIwMjAgNTQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjEgIC0uLi5UaGlzLnBhZ2Uud2EKLQkweDE1NDA6ICA3MzIwIDY5NmUgNjk3NCA2OTYxIDZjNmMgNzkyMCA2MzcyIDY1NjEgIHMuaW5pdGlhbGx5LmNyZWEKLQkweDE1NTA6ICA3NDY1IDY0MjAgNjI3OSAyMDRhIDZmNjggNmU2OSA2NTIwIDQ5NmUgIHRlZC5ieS5Kb2huaWUuSW4KLQkweDE1NjA6ICA2NzcyIDYxNmQgMjAyOCA2ODc0IDc0NzAgM2EyZiAyZjZlIDY1NzQgIGdyYW0uKGh0dHA6Ly9uZXQKLQkweDE1NzA6ICA2NzZmIDY0MmUgNmU2NSA3NDJmIDI5MGEgMjAyMCA0OTc0IDIwNzcgIGdvZC5uZXQvKS4uLkl0LncKLQkweDE1ODA6ICA2MTczIDIwNmMgNjE3NCA2NTcyIDIwNjUgNjQ2OSA3NDY1IDY0MjAgIGFzLmxhdGVyLmVkaXRlZC4KLQkweDE1OTA6ICA2Mjc5IDIwNGQgNjE3NCA3NDY4IDY1NzcgMjA1NyA2OTZjIDYzNmYgIGJ5Lk1hdHRoZXcuV2lsY28KLQkweDE1YTA6ICA3ODIwIDYxNmUgNjQyMCA0YTZmIDczNjkgNzAyMCA1MjZmIDY0NjkgIHguYW5kLkpvc2lwLlJvZGkKLQkweDE1YjA6ICA2ZTJlIDBhMjAgMjA0YyA2MTczIDc0MjAgNmQ2ZiA2NDY5IDY2NjkgIG4uLi4uTGFzdC5tb2RpZmkKLQkweDE1YzA6ICA2NTY0IDNhMjAgMjQ0NCA2MTc0IDY1M2EgMjAzMiAzMDMwIDM0MmYgIGVkOi4kRGF0ZTouMjAwNC8KLQkweDE1ZDA6ICAzMDM2IDJmMzIgMzAyMCAzMTM1IDNhMzMgMzMzYSAzNTM3IDIwMjQgIDA2LzIwLjE1OjMzOjU3LiQKLQkweDE1ZTA6ICAyZTBhIDIwMjAgMmQyZCAzZTBhIDBhM2MgMmY0MiA0ZjQ0IDU5M2UgIC4uLi4tLT4uLjwvQk9EWT4KLQkweDE1ZjA6ICAwYTNjIDJmNDggNTQ0ZCA0YzNlIDBhICAgICAgICAgICAgICAgICAgIC48L0hUTUw+LgotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAgIC4uLi4uLi4uLi4uLi4uRS4KLQkweDAwMTA6ICAwMDM0IDFiNmUgNDAwMCA0MDA2IDIxNTQgN2YwMCAwMDAxIDdmMDAgIC40Lm5ALkAuIVQuLi4uLi4KLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5IDgwMTAgIC4uLnAuUDdYLkk3ei4uLi4KLQkweDAwMzA6ICAzMDVmIDEwZWEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5IDRkZGMgIDBfLi4uLi4uLi5NLi4uTS4KLQkweDAwNDA6ICA5MjE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uCi0yMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSA3ZjAwICAuNC5wQC5ALiFSLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSA4MDExICAuLi5wLlA3WC5JN3ouLi4uCi0JMHgwMDMwOiAgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMSA0ZGRjICAwXy4uLi4uLi4uTS4uIU0uCi0JMHgwMDQwOiAgOTIxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLgotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMCAgLi4uLi4uLi4uLi4uLi5FLgotCTB4MDAxMDogIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEgN2YwMCAgLjQuLkAuQC4uLi4uLi4uLgotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEgODAxMSAgLi4uUC5wN3ouLjdYLkouLgotCTB4MDAzMDogIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgNGRkYyAgLi4uNS4uLi4uLk0uLiNNLgotCTB4MDA0MDogIDk3MjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwICAuLi4uLi4uLi4uLi4uLkUuCi0JMHgwMDEwOiAgMDAzNCAxYjcyIDQwMDAgNDAwNiAyMTUwIDdmMDAgMDAwMSA3ZjAwICAuNC5yQC5ALiFQLi4uLi4uCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTRhIDM3N2EgYTNhYSA4MDEwICAuLi5wLlA3WC5KN3ouLi4uCi0JMHgwMDMwOiAgMzA1ZiAwNmQ0IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyA0ZGRjICAwXy4uLi4uLi4uTS4uI00uCi0JMHgwMDQwOiAgOTcyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQtZmxhZ3MucGNhcCBiL3Rlc3RzL3ByaW50LWZsYWdzLnBjYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OThjNjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcHJpbnQtZmxhZ3MucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LWZsYWdzLnB1dSBiL3Rlc3RzL3ByaW50LWZsYWdzLnB1dQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkOGI5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9wcmludC1mbGFncy5wdXUKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotYmVnaW4gNjQ0IHByaW50LWZsYWdzLnBjYXAKLU1VLC5SSDAoYCFgYGBgYGBgYGBgYGAvX19gYGAhYGBgYEtVOyswRSkwI0AhKmBgYGAyQGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgQGAxMGBgLyFNSDBgIWAhQiUyP1BgYGA3XGBgYCc6PGAhMC1VQik/QGBgYGAiQGBHX18KLU0lIiRgYGAoJDBgUCRgQEAqMz1SMiVAYGBgYGAhYFAsIktVOyswSEkwI0AhKmBgYGAyQGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgQGAxMGBgL2BgYDBgIWAhQ1JaP1BgYGA3XGBgYCRgNC1JUC1XSi1cMz04QjdeQCRHX18KLU07SyRgYGAoJDBgUCRgQEAqMz1SMiVEVzxEQTghYFAsIktVOyswSz0wI0AhImBgYGAwQGBgYGBgYGBgYGAKLU1gYGBgYGBgYGBgQGAxMGBgLSFNSjBgIWAhQiU4P1BgYGA3XGBgYCc6PGAhMC1VQik/Uz1aQz8qYCQiYGAKLU0tXWBgYGAkISJgSS1XKSg2Mz1SMiVKXTZSVCo/NTBYYCNgJGBgYFAhYGBgYGBgYGBgYGBgYGBgYGBgYCgKLU1gJDRgYC9YOzskYGAwYDhAQydcYGBgJV9gYGAhVkdgYDQjPThCN1xXPkhXUkAhQEBgL1tSYGBgIWAwQCoKLU0zPVIyJVRXPERBOScxNTBAK1IhKDUlMTArUyROLDBUKjImXVM9I0hAOyZdQzg2UUg7Vy1UIzBJNTxWNVIKLU0rNCVHOTZZVC5CISUzJkVOOlcsTywiWFEsIlhUKzM8TTkmNUI6NiVOKCJBVDk3QVQ7Nl1EOTNMQDMmRU4KLU09N0BALEJYVitDJFErMyRNLUNAVis3LU08IiFJLUNAVi5SYFEsUylYLTM4TSxCRC0iRCVDOFY1UD0jSEAKLU0qQlxKIzBJIThWLUU8JzBNMTZZQztWMUk7RjxaKCY9Wjo3YC0iRCVDOFY1UD0iVSw4NllHPTYlRzkzSEAKLU05NlgtIkQtTztGWUU4VzFJO1ZYWigkTUU5N2BNMDZRST1GNC0iQFQqS1U7KzBLSTkjQCEiYGBgYDBAYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBAYDEwYGAtIV9EMGAhYCFBUz4/UGBgYDdcYGBgJGA0LUlQLVdKLVxDPTgKLU1CREZgJCJgYC1QLGBgYCQhImBJLVcpKDgzPVIyJVpdNlJUKlA3YFhgXjE0YGAvRDVgYGBgYGBgYGBgYGAKLU1gYGBgYGBgKGAkNGAlPkw/WURgYDBgOCcpN1xgYGAlX2BgYCFgJSM6PCM9WkM/KFc2KEkpQCFAQGAhL0AKLU1gYGAhYDBAKjM9UjImNFc8REE9KDUlMTArUyROLDJgUiwjYEAzVEwtIkQxQT0mNFooJT1FOSJQQCwjOEAKLU0yRzVMKCMoUCwjNEAsIyxaLTM8WixTNEAxVFU0IzBJMzk3KVY5NyhaKCQlUDg2LUg5MlxRK0MsTixTLC0KLU0iRFFBPFcwTTM2XUQ6NjlJOTYwWiglLVU7QlBALDM0QDA3NUcoIyhQLCMwQCwjYFotIyxaLSMkQDFUVTQKLU0jMEklNSYlRy5CYEItRjRYLCY4UCszJFQuJiRNLSMkUTk2KFE4RjBCIzBJIThWLUU8JzBNNEYlTjlWNVMKLU0uQiFCPjcxRTxQVCowVl1OPSY1Tj0iVSw5NllHPSZAWigjNFItM0AtIkRNRTk3YE0wNlFJPUY0WignMUkKLU07NjVPPTcwXSwzNEwoJlVBPiNUUSwjYC0iRC1PO0ZZRThXMUk7VlhaKCRNRTk3YE0wNlFJPUY0LSJELU8KLU07RzFFO0cwTTUnRVA5M0hAPSY1WD0iXUg9JlVMLlIhQzomJVI8VjVULzZFUztSVFguIzRZKzMkLSJAVCoKLU0vIiUkM1QtNDY1ISUoJEE0MzRQQDQlNSIzJEUjKCIoTStSXTcsVCxPK1QxNDEiISg1JFUsKCMwTiwjJEAKLU01JylBO0ctST0mRU87RiVMK1JdJTNCKF4iQ1EoNSRVLC9ASFwyJDUhMSNYKigiYEAvJFUlNSQkQDIlMTQKLU00IlUlNDU1KTVDVEIwVl1OPSY1Tj0iVTQ+NyFFKEIhIzNUWTQxNFk0LzIpVDk3QVQrVkFUOzZQWygmLUgKLU04NylTOTcwXTo3LU8rM0BYLTNETSwyKF4iQmBAKCNRLTE1MSEoJFkhMzQ0XShEMUU8Vi1SOjchVDo2XU4KLU0oQiEjM1RZNDE0WTQvMik0OiY0QDo2WUk9JkVBOyIhSTtHLVQ4NlFMODcxSTtWWEA7VjhAMSY1Qjo2JU4KLU0oJiVQODYtSDkyWEIvQEhAKCJgXDUkRTQzJDReNCZRQThWNUg7VlFEOTcoQDwmJUc5M1BPNSRFNDMkNF4KLU0iQ1BPMiQ1ITEjWCovJCkvMSVEQDUkNTg1I1RCKFNgUCwjYFAsIihAMEQ9IzNUUS80Q1RCKFQ5JjFEOSYKLU0xQihAMyRFLjJTVEIoU2BQLCMhJTFCKEA1RFEpM0RMXShCLFUtMyRYLiQkQigkJSwyNFkrLzIoQzFEOFAKLU0sI2BQKENYKiJDUSgsM1kwOyYlQzk2QU87JjFFPEIhUDg2PUUvIl0oLDNYKi8kQFIvREVGKCdFTz0yIUEKLU08RjRAOkc1Uz0iIUI8Rl1XPFZFTjlSIVQ6JjRAPVY1Qi8iXUgsQ1gqIkNRMC9FMUg5MiFPPVZZRTxCIU8KLU05QiFUOiZFUygnPUU4QiFTOjcxRSgmQUE8UiFOO1cwQDwnNVQoJzVQKCYlTj4yIVc5NihAPCYlRzk3LEAKLU0+NjVUK0BJMDsmNUE8VjRAOFZdTTkyIUI4Ni1LKCZRQT0mNVIrQ1BPNCNYKiJDUTAvQ1EzMzQlLDMjWFwKLU0wVEU0MTNZLTtXOUUoJiVMO1ZZRysiIU47VzFIOjZZRygnMU8oJy1FOTIhSDk3KUUrQlhOLyJdIzI1MSUKLU0vQmBaKzJEXCtVLS0wNFEsL0NQTzQjWCoiQ1EoLENZKTlCIVk7VzRAODcpRSgnMVI+NkVOOVIhVDtSIUwKLU07Vi1BPSY0QD0mQUUoJiVEOzZFTjo3LVQ8RiVUO1coQDtWOEA9JkFJPFIhTTg2LUg6NllFLyJdKCxDWCoKLU0iQ1EwL0RFRignRU89MiFXODZZVCgnMU8oJylFPCZdUj0iIVM7VlVFPSZBSTtGPEA4NilPPTcwQD0mQUkKLU08UiFIO1ctVClXLEA4RjVIODc5STtXKEwoJyFMOTYlUzkwSUM7VllUODYtVCgnMUg5MiEpO0cxRTxGWUUKLU09IiEzOTcpVjo2LUUoJSFSO1c5STkmNVIoIkEpNFVgSSgmRU49Rl1MPUY1RCgmMUk8RjVDPSZRWStDUE8KLU00I1gqIkNRMC9FLUU5MiFUOiY0QC8kJEA6JylFOUNUQjonMVQ8I0hPK1c9Vz1SWUE4RzVTOTJZTjk3ME8KLU0oQ1kuOTcxVztXKUsoJCVCPTctRSJELUw5NiVSOjZZRzomXVU8VjRcK1QkXigmOU88QiFIO1c8QD0mXEAKLU05JlxAPSZBSTxSWFwrVWBeIkBIXDIjKF4yNjhAPjZdVSgmJVI5MiFUOiY0QDg2MU06NllJPFcxUjg3MU8KLU08QiFPOUIhVDomRVMoJlVBOFZBSTtGNFwrVEBSL0BIKi8lYF41JkFFKCZFTjo3MUk4NlBAOjZZUz0mJUwKLU07JiVUOjZdTigmXUYoI1EhKCZBUjk2OF0oRkFUPSdgWitSXVc9VzxOOSY1Qjo2JU4rRl1SOVJcQi9EMUUKLU04RkVBO0I9UyJGJVA4Ni1IOTNQTzAzWEA9VjVCKCctRTxHOUU8QiFQODYtSzg2PUUoJz1BPFIhUz02LUMKLU05Ny1TOUc1TCtDUE80I1gqIkNRMC9DUTM1JSkvM0Q8XjY2XVUoJy1IO1c1TDkiIVI5NyFMODYtRSgnMUgKLU06NyxAPCYlRzkyIVc6NzFIKCdFTz03KEA7Vz1OKCc9RThCIVA4Nj1FPFIhQTxQSVM7Vl1OKCYlUygnIU8KLU08Vy1JOEZRRStDUE80VTEyM1RZJy9DUE80I1gqIkNRMC9FNU47JjVTPFIhWTtXNEA4VkFBO0Y9RTkiIUkKLU09JyxAOFZdTjlGRUc9NylBPSZFTztCUEA+Nl1VPEIhTjk3PEA8VjVSPUY1UigmRVMoJi1PO0Y5STlXNVIKLU05NjBAODcsQDlGXUw7Jl1XPFNIKi8lNSwvQEhcMyREXiJELU87RjlJOVc1Ujg3MUk7VlhAOUZFTDk3LEAKLU04ViVOKCYpRSgmOU89NllEKCZFTigjUTQ1I1hPOTcxQytWJVA4Ni1IOTNQTzUlMF4rQ1BPMyREXiJASFwKLU0zJEReIkUxSDkyYFw1JTBeMSZdQz02VUU7RzEyO1ZdVC8iXTQ1I1hMKCc9SDo2LUgoJkVTKCcxSDkyIUQKLU06NylFOFcxTzxHREA9NllEOTcoQD1WQUk4VkBAODZRTCgnRU89NygqMiUxLTMiIUY6NlFFPFIhUzomXVUKLU07JjBAOTdBSTxXMEwoJkVTKCctRT0iIVQ7UmBcNSUwXitXOUE8Ql1XPVc8XCtVMTQvQlhcK1RRKS9ASCoKLU0vJFEpL0BJIzFUREA8Vi1SOjchVDxSIUE8RjRAOyZdTzpWNUQoJjlPPEIhSTtCYFw1JTBeK1c1UzxCXUwKLU06NihPOFY9SSs2KUk7Q1BPNSUwXisiIVc6JkVDOiIhSTxSIVc6JjVSOTBJJDk2KUk4NlhAPCYlQzpWJUcKLU05NyxAPVZFTDsiIVA7JiVDOTIhVDomNUk8QiFTOFcpSTwnMVMrQ1BPMyREXiJASFwzJEReIkRRTzlSIUYKLU06NlFFPFIhQTxGNEA8JlFBOFY1RCgmRU4oI1E0NSNYTz1GJVIrVlFPOVJdQTwmJUM6JjRcK1UxNC9CUEAKLU04NllEKCc9STsmUEA4RjRAPEZdVDg3MUU5YElXOTY1SzsnRE4oIiE0OiY0QDlHKUU8NzVFO0YtWSgmXUYKLU0oJylPPSYlVDo2XU4oJi1BO0IhQjkyIUU4Ny1JOydEQDhWQUE7Rj1FOSIhQj4yIUU5JkVUOjZZRyJDUTQKLU01I1hPOTcxQytWUU85VylPPSYlVDkyWUQrViVQODYtSDkzUE81JTBeK0NQTzMkRF4iQEhcMyREXiJFMUgKLU05MiFEOTY5QT02UVQoJjFJPEY1Qz0mXVI+MiFJO0YxRT4iIUk8UmBcNSUwXjo2WUQ5N0BOOicxTTsjUE8KLU01JTBeKyIhTTk2JU46NllHKCcxSDg3MEA8RjVRPTY1Uz0nLCo5Rl1SKCYkQDkmRVI5Ni1UO1cpWSgjUTQKLU01I1hPOUZdTytWKUE8QlxcK1UxNC9CIVc6NlFMKCY9ST1GNEA9JkFFKCYtTztHMUU7RzFTKCZdRignMUgKLU05MiFGOjZRRSgjUTQ1I1hPPUYlUitXPVc9Ul1GO1ZcTzhGJVIrVkVOOSY1WCtGQVQ7NlBcK1UxNC9ASUkKLU05QiFJPSIhRT4mRVM9JyxAKiYlUzxXNU06NllHKCcxSDg3MEAvJTE0L0JdVjg3KE89Vz1XLyJdNDUjWEAKLU06NyxAPjZdVTxCYFw1JTBeMSZdQz02VUU7RzEyO1ZdVC8iXTQ1I1hJK0NQTzMkRF4iQEhcMyREXiJFNVMKLU05NyhAOSZFUjk2LVQ7VylJOTcsQDg3KUUoJjVOODYpTDk2MEwoJiVOOSIhVTxWNVIoJjFPOFc1TTk2WVQKLU08UiFXOjZRTCgmKUUoJlFPO1ZNRTkiIUY7VygqOjZYQD0mQUUoI1E0NSNZUD02KUw6Ni0/OicxTTsjUE8KLU01JTBeKCYxSTxGNUM9Jl1SPjIhTzlCIVQ6JjRAPTctRTxHLEcoJkFPOzY1UytCYEA1JkFFPFY0QDkmRVIKLU08UElTOiZdVTsmMEA4RjRAPTZZRDk3KEAvJTE0L0JdSDtWVUUvIl00NSNYTCgmJU45IiFVPFY1UjxSIVcKLU06NlFMKCZZTz0iIUI5MiFBOEZRRSgnMU8oJy1ZOzZRSTtGTCo9JlxAOUZFTDk3LEA9JkFFPjIhRDtWWEcKLU09IiFPPVZYTi8iXSwyM1gqIkNQTzU0UF4iRCVMOyIhVDomNEA8VzFBO0YxQTxGMEA4NyFBOFZBRSgmVU8KLU05JzVMOTcsQDg3KUUoJiVWODZFTDg2KUw5MiFXOjcxSCgnMUg6NyxAPEY1TDk2JVM5MiFBO0YwQDg3KUUKLU0iRllPPVIhTTg2WUE5VjVEKCc9ST0mQEA5JjVCOFZdTjlCWEAoJTFZPCY0QC8lMTQvRjFQOlY8TTxGNUMKLU07VllGOjY9VTxGNEA4NyFBOFZBRS8iXTQ1I1hAPSZcKjxWNUw5Ni1UKCc9SDo2LUgoJlVPOSc1TDk3LEAKLU0+Nl1VKCc9QTtHMEA5NllBOEZRRTkiWEAoJFVBO0dEQDtXMUg5NyhAOzZdRD02UUU8UiFBPEY0QDg3OUEKLU06NlFBOEZRRSJHMUg8Rl1VOVZAQD0mQUUoJDFFOEZFQTtCIVA4Ni1LODY9RSgnLVk8VzFFOzIhVzo3MUgKLU0oJzFIOTIhTjg2VUU8UmBcNSUwXjsmRUI4NyFBOFZBRSs2VU85IlRKLyJdNDUjWE4iREVGKCdFTz0yIU4KLU05NjVEKCcxTygmLU87NyFJOyY0QDgyIU07VjFVOyY0QD42XVU8Ry1FOyY4TCgnRU89MiFXOjZRTCgmWUUKLU05NjBAPSZcQDo2WVM9JiVMOyIhVDomNCovJTE0L0YlUDg2LUg5MlVEOTc4XCtVMTQvQiFQODYtSzg2PUUKLU0rQEgqLyVgXjM2XVI5MiFEO1YtVTs2NU49JiVUOjZdTigmXU4oJCVQODYtSDkyIUM4NlhAOEY0QDlGXVUKLU07RjBAO1ZYWiJDUTUzI1gqLyRRKS9ASTQ6JjRALyQkQDIlKSUxQ1RCK1YxTzhSXUE8JiVDOiY0TTkmXUMKLU0rVlVBO0c1QTsiXEIvRCVQODYtSDkyIUQ7Vi1VOzY1Tj0mJVQ6Nl1OLyJdIS9CIVM9Jl1SOTYwQDtWWEAKLU0+Nl1VPEIhUzk3KVY5NyhOLyJdLDIzWCoiQ1EsMjNYKjUmQUUoI1EhKCRBMjE0OF0oRkFUPSdgWitSXVcKLU09VzxOODchQThWQUUrRl1SOVJcQi9EJVA4Ni1IOTIhMDxGXUo5Ni1ULyJdIS9CIUg7VlVFKCctST0mNE4KLU0vIl0sMjNYKiJDUSwyM1gqNSZBRSgjUSEoJEEyMTQ4XShGQVQ9J2BaK1JdVz1XPE44NyFBOFZBRSs3LVMKLU07IllPPEY8TyhDWSE8JiVDOiY0TTRVLSwvIl0hL0IhSDtWVUUoJy1JPSY0Ti8iXSwyM1gqIkNRLDIzWCoKLU01JkFFKCNRISgkQTIxNDhdKEZBVD0nYForUl1QOTcpTCtGJVA4Ni1IOTJZTzxGPE8oQ1lNO1YwQDwmNVIKLU07I1BPMDNYQDomXU05MiFTOjcxRStDUE8zJEReIkBIXDMkRF4iRTFIOTJgXDAyISg0RDUmLzIpSD0nMVAKLU0uQlxPPVc9VytGJVA4Ni1IOTc9RTk2TE44Vl1NK1IoXjA3IUE4VkFFNVY1RTpTUE8wM1hAO0Y1VzxWUUUKLU09JzFFPEJYXCtUUSkvQEgqLyRRKS9ASTQ6JjRALyQkQDIlKSUxQ1RCOicxVDwjSE8rVz1XPVJZRDk2KUkKLU04NlhOO1cpRytWMU84UlxCL0QxRThGRUE7QiEwPEZdSjk2LVQiRDFPOFc1TTk2WVQ4NzFJO1ZYXCtUJF4KLU0oJz1IOjYtSCgmLU87RzFBOjZZUygkQS81VTEvPFJQQDFEJTE8UlBAODZZRCgnLU85RzFXODcpRSgnNVAKLU05JiVUOTcsTi8iXSwyM1gqLyJdNTMjWCoiQ1EwL0VFTz0yIUM4NlhAODZRUztSIUM7VllTPTZRVCgnMUgKLU05MiFMOjctVCgmXUYoI1EhKCRBMjE0OF0oRkFUPSdgWitSXVc9VzxOOEZdVT0mNUw7IllDO1ZUTzlGJVEKLU0rUiheNVZdUjsmMCo1VkVEOTIhNzk2KEAxRylFPDc1RTtHMUw+MiEhPFZNRTkiITE9NjVTPSZFTztHLFwKLU0rVCReKCY5TzxCIUk7RjlPPEZVQT0mRU87QlgqIkNRKCxDWSw5NzBAO1cxSDk3KEA8JjVPPCZRRSgmTU4KLU07VzxAODYpTz03MEA9JkFJPFIhUzk3KVY5NyhcK1RAUi9ASCovJCRAMiUpJTFDVEI6JzFUPCNITytWWUUKLU09Ji1SODY5VCtGLU87MlxCL0RZRT0mLVI4NjlULyJdIS9CIVA8Rl1WOjYxRTxSIUE7QiFJO0cxRTxGNVMKLU09JkVOOVIhRjxGNUUiRy1FPEc5SThWNEA5Rl1SKCc9RThCIVM6NzFFKCZVTztGRVQ7VylJO0Y8QDg2WUQKLU0oJy1UODcxSTxXMUk4UiFDO1ZRTDk2LVQ6Nl1OK0BJOTtXNEA4ViVOKCZRRT0iIVQ6JjVNKCZNTjtXPEAKLU04NilPPTcwQD42XVU8QiFTOTcpVjk3KEA9Ny1JO0Y8QD0mQUU6NygqLyQkQDIlKSUxQ1RCOicxVDwjSE8KLU0rVzVQPSZFTTkyWU45NzFDPEYlRj0iWUM7VlRPKENZSTtHMUU8RjlBOFY0XCtUJF4rQEklO0YlQjsmRU4KLU05UiFUOiY0QDs2XU46NzFPPEZFTjlSIU85QiFZO1c1UignLUU8RzlFPEIhVzo2UUwoJyFSO1c5STkmNEAKLU04MiFCOTcxVDk3KEA5VlFPOEYlTCgmXVY5NylWOjY1VyJGXUYoJz1IO1IhSTxSIVU8VkVOOVIhVzomJVQKLU0oJiVOOSIhVzomNVI5MlBAODZZRCgmRVQoJz1PPTZRRCgmPUk9RjRAMSY1Qjo2JU4oJiRAOEY1VD0mNVIKLU0iRl1WOTcpVjo2NVcoJl1GKCcxSDkyIUE8JiVDOiY0QDwmJUM6ViVHOTIhVTxWJUc5MlgqIkNRKCxDWSEKLU04Rl1VPSIhVDomRVMoJyFBOVY0XCtUQFIvQEgqLyRFLTFSISEzJEUnM0NUQjxGRUc6JzBCKCQlLDUjVEIKLU0oQiEoMTRFJzIlMF0oQyhULVIoQDVURSQ1JEBdKEMoVy4iKEA0VSkjLzIpSThWXU48Ul1KOiY0UC1DJE4KLU08JllHKENYKiJDUTAvRTFIOjcsQDo3LEA4MiFQOyYlQzk2QU87JjFFPEIhUDg2PUUoJkVOPFcxQTsmUUUKLU05IiFCPjIhVDomNEAvJCQqMiUpJTFDVEI6JzFUPCNITytXPVc9UllEOTYpSTg2WE47VylHK1IoXjEmNUIKLU06NiVOLyJdIS9ASVI5NlFFODctRSgmXUYoJzFIOTIhQTwmJUM6JjRANVY1QignLUU8RzlFPEIhUDg2LUsKLU04Nj1FK0BIKi8lYF41JkFJPFIhQztWVVA9NzFFPEIhSDg3LEA6NllTPSYlTDsmNUQoJzFIOTIhJDk2KUkKLU04NlhAMVRZNStUUUk7RzVYKCZdUDk3KUE9JkVOOVIhUz43LVQ5NlRMIkYpVT0iIUk9IiFIODcsQC8nLVQKLU08Rl1OOVNZTjtXMUg6NllHKCcxTygmMU8oJz1JPSZAQD0mQUUoJDFFOEZFQTtASTA8Rl1KOTYtVC8iXVMKLU09JylPO0Y8XitCITA7JjVBPFY0QDkmXEAvJy1UPEZdTjlTWU47VzBcK1ctVDxGXU45U1hAOFZdTj0mJUMKLU09IiFUOiY0QDEmNUI6NiVOIkUhUjtWSUU4VzBAODYpTz03MEA6NzBOLyJdMC9ASCovJWBeMjY4QD42XVUKLU0oJjlJO0YwQDgyIUI9NjxAOjZYQD0mQUk8UiFBPCYlQzomNEA8JiVDOlYlRzkyUEA7VyhAOjZYQDA3IUEKLU04VkFFKCZFVDxWNUw5QlAqPCZRRTg3LUUoJjlJOyY0QDgyIUI9NjxAPEY1UDtXKVQoJl1OKCZFVCtCYEAKLU0yNllTPScpVThXMUk7VllTKCZdTigmMU86NllHKCcxSDo3LEwoJiVOOSIhVDomNCo7JkVTPSIhTzlCYFwKLU0wMiEoNEQ1Ji8yKUg9JzFQLkJcTzhHNUc8UllEOTYpSTg2WE47VylHK1ctUjhTSUE8JiVDOiY0Qi9GTU4KLU07Vz1OKCYpVTlXLFwrVCReKCZdRignMUg6NywqPCYlQzpWJUc5MlBAOFYlTigmKUUoJjlPPTZZRCgmRU4KLU0oJzFIOTJgKi8kJEAyJSklMUNUQjonMVQ8I0hPK1c9Vz1SWUQ5NilJODZYTjtXKUcrVClVOVcsTzRGNVAKLU07VylUOjZZRyhDWSQ5NilJODZYQDBHNUcoJTFSODYtSzo2WUcoJS1ZPFcxRTszUE8wM1hOIkBIXDQjWTQKLU06JiVOOlcsQDlGXVIoJzVTOjZZRygnMUg6NyxAPCYlQzpWJUc5MlBAODZZRCgmLU87Rj1SODcxVTsmJVQKLU06Nl1OPFIhRjtXKEA+Nl1VPEIhQzomXUk4VjRAO1Y4KjgyISQ5NilJODZYQDxXRVM9JjVNKDNQTzQjWCoKLU0iQ1EkMjU4QDg2UUk5VlhdKEYtRTtHMUU8QiheIkNRQSgmQVI5NjhdKEZBVD0nYForUl1XPVc8TjkmNUIKLU06NiVOK0ZdUjlSXEIvQEhcMjRVJygmJUw6Nj1OLzIpTTo2MUQ7JjRCKCZBRTo2PUg9I1RCLFNgQignPUkKLU05JzFILzIoUi0yKEA8VylDLzIpSThWXU48Ul1EOTYpSTg2WE87VyFFO0ZRTzlWXE0sQzROOkchRyhCIUEKLU07JzBdKEQxRThGRUE7QiheIkNQTzgzWCovJiRAOicpRTlDVEI6JzFUPCNITytXPVc9UllBPCYlQzomNE4KLU07VylHK1IoXiJDUSkzNDxAODZRSTlWWF0oRlVJOSYxTDkyKEA6JjVJOVZBVC8yKFMsQihAPVZFRD0mQF0KLU0oQyhVLjIoQDxXKUMvMilJOFZdTjxSXUE8JiVDOiY1PzwmKE48JllHKEIhQTsnMF0oRCVQODYtSDkyKF4KLU0iQ1BPODNYKi8iXSQyNTheIkBIXCgyVE0iQmBANSZBSTxSIVA4Nj1FKCc9QTxSIUk7RkVUOjYlTDsnREAKLU04VylFODcxRTkiIUI+MiEqO1ZBTjo2NEAyNllHPEYlTSgiQUg9JzFQLkJcTztGNVQ5Vl1EK0ZZRT0iXEkKLU0iQmBAMjcwQD1WJVMoJlFBPSY1UigmNUQ6NzFFOSIhQj4yIS04NzFUOiY1VyglPUk7Ji1PPiIhQTtGMEAKLU0yRl1TOjdgQDRGXUQ6NlhOIkJgQDMmJVM9IiFNO1YxSTlGRUU5I0hAKSQxQT0mNFooIyhQLCMwTywjOE8KLU0sQ2BALDM0WixTLFotMzxAKSJYKigiYE0rM1gqIkNQTzBEXSQ2M1gqLyJdKDUkVSwvQEpPNUxNIlMlUC4KLU1gJChgYGAhImBgYGBgYGBgYGBgYGBgYGBgYGBgImAhJWBgYFQmVllgYCRgJig1MV9gYGAhP1BgYGA9SVAKLU1gJWBXNihJKS1XSkNKOGAwLCVcMFpAYGBgMCQoIkRXPERBRS1XKSg5TDU7KzBMPmBgUCEiYGBgYDBAYGAKLU1gYGBgYGBgYGBgYGBgYGBgYGBAYDEwYGAtIU1QMGAhYCFCJTI/UGBgYDdcYGBgJzo8YCEwLVVCKjIzPVoKLU1IWkZgJDMhPyJeJGBgYCQhImBJLVcpPEEzPVIyJjslNlJUKldBMCxgMEBgYGAkKGBgYGBgYGBgYGBgYGAKLU1gYGBgYGBgKGAkNGBgIzA/WiRgYDBgODxWR1xgYGAlX2BgYCFgJSM6PCM9WkhaRFc2KEkqQCEkQGAhPFUKLU1gYGAhYDBAKjM9UjcoVFc8RVImUTVMTSJdKDQjYCQoYGBgISJgYGBgYGBgYGBgYGBgYGBgYGBgYCJgISUKLU1gYGBUJlcpYGAkYCYoNSFfYGBgIT9QYGBgPUlQYCVgVzYoSSotV0pDSkhgMCwlXCZVYGBgYDAkKCJEVzwKLSZFUi0tVyk8QwotYAotZW5kCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC1mbGFncy5zaCBiL3Rlc3RzL3ByaW50LWZsYWdzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTlmNzgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3ByaW50LWZsYWdzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyEvYmluL3NoCi0KLXV1ZGVjb2RlIHByaW50LWZsYWdzLnB1dQotCi1mb3IgaSBpbiB4IHh4IFggWFggQSBBQTsgZG8KLQlpZiAoLi4vdGNwZHVtcCAtJGkgLXMwIC1uciBwcmludC1mbGFncy5wY2FwIHwgdGVlIHByaW50LSRpLm5ldyB8IGRpZmYgLSBwcmludC0kaS5vdXQpCi0JdGhlbgotCQllY2hvIHByaW50LSRpIHBhc3NlZC4KLQllbHNlCi0JCWVjaG8gcHJpbnQtJGkgZmFpbGVkLgotCWZpCi1kb25lCmRpZmYgLS1naXQgYS90ZXN0cy9wcmludC14Lm5ldyBiL3Rlc3RzL3ByaW50LXgubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjI1YmY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3ByaW50LXgubmV3CisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLTIzOjU3OjM1LjkzODA2NiBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFMgOTI4NTQ5MjQ2OjkyODU0OTI0NigwKSB3aW4gMzI3NjcgPG1zcyAxNjM5NixzYWNrT0ssdGltZXN0YW1wIDEzMDYzMDA5NTAgMCxub3Asd3NjYWxlIDI+Ci0JMHgwMDAwOiAgNDUwMCAwMDNjIDFiNjggNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2UgMDAwMCAwMDAwCi0JMHgwMDIwOiAgYTAwMiA3ZmZmIDE0MjEgMDAwMCAwMjA0IDQwMGMgMDQwMiAwODBhCi0JMHgwMDMwOiAgNGRkYyA5MjE2IDAwMDAgMDAwMCAwMTAzIDAzMDIKLTIzOjU3OjM1LjkzODEyMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFMgOTMwNzc4NjA5OjkzMDc3ODYwOSgwKSBhY2sgOTI4NTQ5MjQ3IHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwLG5vcCx3c2NhbGUgMj4KLQkweDAwMDA6ICA0NTAwIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEKLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YKLQkweDAwMjA6ICBhMDEyIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEKLQkweDAwMzA6ICA0ZGRjIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZhIDQwMDAgNDAwNiAyMTU4IDdmMDAgMDAwMQotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4OTdmIDM3N2EgOGRmMgotCTB4MDAyMDogIDgwMTAgMjAwMCAzN2QwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxNgotCTB4MDAzMDogIDRkZGMgOTIxNgotMjM6NTc6MzUuOTM5NDIzIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUCAxOjIwMygyMDIpIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUxIDEzMDYzMDA5NTA+Ci0JMHgwMDAwOiAgNDUwMCAwMGZlIDFiNmMgNDAwMCA0MDA2IDIwOGMgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyCi0JMHgwMDIwOiAgODAxOCAyMDAwIGZlZjIgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE3Ci0JMHgwMDMwOiAgNGRkYyA5MjE2IDQ3NDUgNTQyMCAyZjIwIDQ4NTQgNTQ1MCAyZjMxCi0JMHgwMDQwOiAgMmUzMSAwZDBhIDQ4NmYgNzM3NCAzYTIwIDZjNmYgNjM2MSA2YzY4Ci0JMHgwMDUwOiAgNmY3MyA3NDBkIDBhNTUgNzM2NSA3MjJkIDQxNjcgNjU2ZSA3NDNhCi0JMHgwMDYwOiAgMjA0NSA0YzY5IDZlNmIgNzMyZiAzMDJlIDMxMzAgMmUzNCAyZDM3Ci0JMHgwMDcwOiAgMmQ2NCA2NTYyIDY5NjEgNmUyMCAyODc0IDY1NzggNzQ2ZCA2ZjY0Ci0JMHgwMDgwOiAgNjUzYiAyMDRjIDY5NmUgNzU3OCAyMDMyIDJlMzYgMmUzMSAzMTJkCi0JMHgwMDkwOiAgMzEyZCAzNjM4IDM2MmQgNzM2ZCA3MDIwIDY5MzYgMzgzNiAzYjIwCi0JMHgwMGEwOiAgMzEzMyAzMjc4IDM1MzYgMmQzMiAyOTBkIDBhNDEgNjM2MyA2NTcwCi0JMHgwMGIwOiAgNzQzYSAyMDJhIDJmMmEgMGQwYSA0MTYzIDYzNjUgNzA3NCAyZDQ1Ci0JMHgwMGMwOiAgNmU2MyA2ZjY0IDY5NmUgNjczYSAyMDY3IDdhNjkgNzAwZCAwYTQxCi0JMHgwMGQwOiAgNjM2MyA2NTcwIDc0MmQgNGM2MSA2ZTY3IDc1NjEgNjc2NSAzYTIwCi0JMHgwMGUwOiAgNjU2ZSAwZDBhIDQzNmYgNmU2ZSA2NTYzIDc0NjkgNmY2ZSAzYTIwCi0JMHgwMGYwOiAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1IDBkMGEgMGQwYQotMjM6NTc6MzUuOTQwNDc0IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogLiBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUyIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5Ci0JMHgwMDIwOiAgODAxMCAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4Ci0JMHgwMDMwOiAgNGRkYyA5MjE3Ci0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgNDUwMCAxNWViIDFmZTYgNDAwMCA0MDA2IDA3MjUgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5Ci0JMHgwMDIwOiAgODAxOCAyMDAwIDEzZTAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5Ci0JMHgwMDMwOiAgNGRkYyA5MjE3IDQ4NTQgNTQ1MCAyZjMxIDJlMzEgMjAzMiAzMDMwCi0JMHgwMDQwOiAgMjA0ZiA0YjBkIDBhNDQgNjE3NCA2NTNhIDIwNTcgNjU2NCAyYzIwCi0JMHgwMDUwOiAgMzAzNiAyMDRhIDc1NmMgMjAzMiAzMDMwIDM1MjAgMzAzMyAzYTM1Ci0JMHgwMDYwOiAgMzczYSAzMzM1IDIwNDcgNGQ1NCAwZDBhIDUzNjUgNzI3NiA2NTcyCi0JMHgwMDcwOiAgM2EyMCA0MTcwIDYxNjMgNjg2NSAyZjMxIDJlMzMgMmUzMyAzMzBkCi0JMHgwMDgwOiAgMGE0YyA2MTczIDc0MmQgNGQ2ZiA2NDY5IDY2NjkgNjU2NCAzYTIwCi0JMHgwMDkwOiAgNTM3NSA2ZTJjIDIwMzEgMzUyMCA0MTc1IDY3MjAgMzIzMCAzMDM0Ci0JMHgwMGEwOiAgMjAzMCAzMDNhIDM0MzMgM2EzNCAzMTIwIDQ3NGQgNTQwZCAwYTQ1Ci0JMHgwMGIwOiAgNTQ2MSA2NzNhIDIwMjIgMzY2NSAzODMwIDY2MzAgMmQzMSAzNDM4Ci0JMHgwMGMwOiAgNjEyZCAzNDMxIDMxNjUgNjIzMSA2MjY0IDIyMGQgMGE0MSA2MzYzCi0JMHgwMGQwOiAgNjU3MCA3NDJkIDUyNjEgNmU2NyA2NTczIDNhMjAgNjI3OSA3NDY1Ci0JMHgwMGUwOiAgNzMwZCAwYTQzIDZmNmUgNzQ2NSA2ZTc0IDJkNGMgNjU2ZSA2Nzc0Ci0JMHgwMGYwOiAgNjgzYSAyMDM1IDMyMzUgMzgwZCAwYTRiIDY1NjUgNzAyZCA0MTZjCi0JMHgwMTAwOiAgNjk3NiA2NTNhIDIwNzQgNjk2ZCA2NTZmIDc1NzQgM2QzMSAzNTJjCi0JMHgwMTEwOiAgMjA2ZCA2MTc4IDNkMzEgMzAzMCAwZDBhIDQzNmYgNmU2ZSA2NTYzCi0JMHgwMTIwOiAgNzQ2OSA2ZjZlIDNhMjAgNGI2NSA2NTcwIDJkNDEgNmM2OSA3NjY1Ci0JMHgwMTMwOiAgMGQwYSA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAzYTIwCi0JMHgwMTQwOiAgNzQ2NSA3ODc0IDJmNjggNzQ2ZCA2YzNiIDIwNjMgNjg2MSA3MjczCi0JMHgwMTUwOiAgNjU3NCAzZDY5IDczNmYgMmQzOCAzODM1IDM5MmQgMzEwZCAwYTBkCi0JMHgwMTYwOiAgMGEzYyAyMTQ0IDRmNDMgNTQ1OSA1MDQ1IDIwNDggNTQ0ZCA0YzIwCi0JMHgwMTcwOiAgNTA1NSA0MjRjIDQ5NDMgMjAyMiAyZDJmIDJmNTcgMzM0MyAyZjJmCi0JMHgwMTgwOiAgNDQ1NCA0NDIwIDQ4NTQgNGQ0YyAyMDM0IDJlMzAgMzEyMCA1NDcyCi0JMHgwMTkwOiAgNjE2ZSA3MzY5IDc0NjkgNmY2ZSA2MTZjIDJmMmYgNDU0ZSAyMjNlCi0JMHgwMWEwOiAgMGEzYyA0ODU0IDRkNGMgM2UwYSAzYzQ4IDQ1NDEgNDQzZSAwYTIwCi0JMHgwMWIwOiAgMjAyMCAzYzRkIDQ1NTQgNDEyMCA0ODU0IDU0NTAgMmQ0NSA1MTU1Ci0JMHgwMWMwOiAgNDk1NiAzZDIyIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1Ci0JMHgwMWQwOiAgMjIyMCA0MzRmIDRlNTQgNDU0ZSA1NDNkIDIyNzQgNjU3OCA3NDJmCi0JMHgwMWUwOiAgNjg3NCA2ZDZjIDNiMjAgNjM2OCA2MTcyIDczNjUgNzQzZCA2OTczCi0JMHgwMWYwOiAgNmYyZCAzODM4IDM1MzkgMmQzMSAyMjNlIDBhMjAgMjAyMCAzYzRkCi0JMHgwMjAwOiAgNDU1NCA0MTIwIDRlNDEgNGQ0NSAzZDIyIDQ0NjUgNzM2MyA3MjY5Ci0JMHgwMjEwOiAgNzA3NCA2OTZmIDZlMjIgMjA0MyA0ZjRlIDU0NDUgNGU1NCAzZDIyCi0JMHgwMjIwOiAgNTQ2OCA2NTIwIDY5NmUgNjk3NCA2OTYxIDZjMjAgNjk2ZSA3Mzc0Ci0JMHgwMjMwOiAgNjE2YyA2YzYxIDc0NjkgNmY2ZSAyMDZmIDY2MjAgNDQ2NSA2MjY5Ci0JMHgwMjQwOiAgNjE2ZSAyMDYxIDcwNjEgNjM2OCA2NTJlIDIyM2UgMGEyMCAyMDIwCi0JMHgwMjUwOiAgM2M1NCA0OTU0IDRjNDUgM2U1MCA2YzYxIDYzNjUgNjg2ZiA2YzY0Ci0JMHgwMjYwOiAgNjU3MiAyMDcwIDYxNjcgNjUzYyAyZjU0IDQ5NTQgNGM0NSAzZTBhCi0JMHgwMjcwOiAgM2MyZiA0ODQ1IDQxNDQgM2UwYSAzYzQyIDRmNDQgNTkyMCA1NDQ1Ci0JMHgwMjgwOiAgNTg1NCAzZDIyIDIzMzAgMzAzMCAzMDMwIDMwMjIgMjA0MiA0NzQzCi0JMHgwMjkwOiAgNGY0YyA0ZjUyIDNkMjIgMjM0NiA0NjQ2IDQ2NDYgNDYyMiAyMDRjCi0JMHgwMmEwOiAgNDk0ZSA0YjNkIDIyMjMgMzAzMCAzMDMwIDQ1NDYgMjIyMCA1NjRjCi0JMHgwMmIwOiAgNDk0ZSA0YjNkIDIyMjMgMzUzNSAzMTM4IDM4NDEgMjIyMCA0MTRjCi0JMHgwMmMwOiAgNDk0ZSA0YjNkIDIyMjMgNDY0NiAzMDMwIDMwMzAgMjIzZSAwYTBhCi0JMHgwMmQwOiAgM2M0OCAzMTNlIDUwNmMgNjE2MyA2NTY4IDZmNmMgNjQ2NSA3MjIwCi0JMHgwMmUwOiAgNzA2MSA2NzY1IDNjMmYgNDgzMSAzZTBhIDNjNDggMzIzZSA0OTY2Ci0JMHgwMmYwOiAgMjA3OSA2Zjc1IDIwNjEgNzI2NSAyMDZhIDc1NzMgNzQyMCA2MjcyCi0JMHgwMzAwOiAgNmY3NyA3MzY5IDZlNjcgMjA3NCA2ODY1IDIwNzcgNjU2MiAzYzJmCi0JMHgwMzEwOiAgNjgzMiAzZTBhIDBhM2MgNTAzZSA1NDY4IDY1MjAgNmY3NyA2ZTY1Ci0JMHgwMzIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDc3NjUgNjIyMCA3MzY5Ci0JMHgwMzMwOiAgNzQ2NSAyMDY4IDYxNzMgMjA2ZSA2Zjc0IDIwNzAgNzU3NCAyMDc1Ci0JMHgwMzQwOiAgNzAyMCA2MTZlIDc5MjAgNzc2NSA2MjIwIDcwNjEgNjc2NSA3MzIwCi0JMHgwMzUwOiAgNzk2NSA3NDJlIDBhNTAgNmM2NSA2MTczIDY1MjAgNjM2ZiA2ZDY1Ci0JMHgwMzYwOiAgMjA2MiA2MTYzIDZiMjAgNmM2MSA3NDY1IDcyMmUgM2MyZiA1MDNlCi0JMHgwMzcwOiAgMGEwYSAzYzUwIDNlM2MgNTM0ZCA0MTRjIDRjM2UgM2M0MyA0OTU0Ci0JMHgwMzgwOiAgNDUzZSA0ZDZmIDc2NjUgMjA2MSA2YzZmIDZlNjcgMmMyMCA2ZTZmCi0JMHgwMzkwOiAgNzQ2OCA2OTZlIDY3MjAgNzQ2ZiAyMDczIDY1NjUgMjA2OCA2NTcyCi0JMHgwM2EwOiAgNjUyZSAyZTJlIDNjMmYgNDM0OSA1NDQ1IDNlMjAgM2EyZCAyOTNjCi0JMHgwM2IwOiAgMmY1MyA0ZDQxIDRjNGMgM2UzYyAyZjUwIDNlMGEgMGEzYyA0ODMyCi0JMHgwM2MwOiAgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyIDY1MjAgNzQ3MiA3OTY5Ci0JMHgwM2QwOiAgNmU2NyAyMDc0IDZmMjAgNmM2ZiA2MzYxIDc0NjUgMjA3NCA2ODY1Ci0JMHgwM2UwOiAgMjA2MSA2NDZkIDY5NmUgNjk3MyA3NDcyIDYxNzQgNmY3MiAyMDZmCi0JMHgwM2YwOiAgNjYyMCA3NDY4IDY5NzMgMjA2ZCA2MTYzIDY4NjkgNmU2NSAzYzJmCi0JMHgwNDAwOiAgNDgzMiAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDc3Ci0JMHgwNDEwOiAgNjE2ZSA3NDIwIDc0NmYgMjA3MiA2NTcwIDZmNzIgNzQyMCA3MzZmCi0JMHgwNDIwOiAgNmQ2NSA3NDY4IDY5NmUgNjcyMCA2MTYyIDZmNzUgNzQyMCA3NDY4Ci0JMHgwNDMwOiAgNjk3MyAyMDY4IDZmNzMgNzQyNyA3MzIwIDYyNjUgNjg2MSA3NjY5Ci0JMHgwNDQwOiAgNmY3MiAyYzIwIDcwNmMgNjU2MSA3MzY1IDBhNjMgNmY2ZSA3NDYxCi0JMHgwNDUwOiAgNjM3NCAyMDc0IDY4NjUgMjA0OSA2ZTc0IDY1NzIgNmU2NSA3NDIwCi0JMHgwNDYwOiAgNTM2NSA3Mjc2IDY5NjMgNjUyMCA1MDcyIDZmNzYgNjk2NCA2NTcyCi0JMHgwNDcwOiAgMjAyOCA0OTUzIDUwMjkgMjA2OSA2ZTc2IDZmNmMgNzY2NSA2NDIwCi0JMHgwNDgwOiAgNjQ2OSA3MjY1IDYzNzQgNmM3OSAyZTNjIDJmNTAgM2UwYSAwYTNjCi0JMHgwNDkwOiAgNTAzZSA1MzY1IDY1MjAgNzQ2OCA2NTIwIDNjNDEgMjA2OCA3MjY1Ci0JMHgwNGEwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTYyCi0JMHgwNGIwOiAgNzU3MyA2NTJlIDZlNjUgNzQyZiAyMjNlIDRlNjUgNzQ3NyA2ZjcyCi0JMHgwNGMwOiAgNmIyMCA0MTYyIDc1NzMgNjUwYSA0MzZjIDY1NjEgNzI2OSA2ZTY3Ci0JMHgwNGQwOiAgNjg2ZiA3NTczIDY1M2MgMmY0MSAzZTIwIDY2NmYgNzIyMCA2ODZmCi0JMHgwNGUwOiAgNzcyMCA3NDZmIDIwNjQgNmYyMCA3NDY4IDY5NzMgMmUzYyAyZjUwCi0JMHgwNGYwOiAgM2UwYSAwYTNjIDQ4MzIgM2U0OSA2NjIwIDc5NmYgNzUyMCA2MTcyCi0JMHgwNTAwOiAgNjUyMCA3NDY4IDY1MjAgNjE2NCA2ZDY5IDZlNjkgNzM3NCA3MjYxCi0JMHgwNTEwOiAgNzQ2ZiA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNmQ2MSA2MzY4Ci0JMHgwNTIwOiAgNjk2ZSA2NTNjIDJmNDggMzIzZSAwYTBhIDNjNTAgM2U1NCA2ODY1Ci0JMHgwNTMwOiAgMjA2OSA2ZTY5IDc0NjkgNjE2YyAyMDY5IDZlNzMgNzQ2MSA2YzZjCi0JMHgwNTQwOiAgNjE3NCA2OTZmIDZlMjAgNmY2NiAyMDNjIDQxMjAgNjg3MiA2NTY2Ci0JMHgwNTUwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyCi0JMHgwNTYwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDQ0NjUgNjI2OSA2MTZlCi0JMHgwNTcwOiAgMjc3MyAwYTYxIDcwNjEgNjM2OCA2NTNjIDJmNDEgM2UyMCA3NzY1Ci0JMHgwNTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1Ci0JMHgwNTkwOiAgMjA3NyA2MTczIDIwNzMgNzU2MyA2MzY1IDczNzMgNjY3NSA2YzJlCi0JMHgwNWEwOiAgM2MyZiA1MDNlIDBhMGEgM2M1MCAzZTNjIDUzNTQgNTI0ZiA0ZTQ3Ci0JMHgwNWIwOiAgM2U1OSA2Zjc1IDIwNzMgNjg2ZiA3NTZjIDY0MjAgNzI2NSA3MDZjCi0JMHgwNWMwOiAgNjE2MyA2NTIwIDc0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzY5Ci0JMHgwNWQwOiAgNzQ2OCAyMDc5IDZmNzUgNzIyMCA2Zjc3IDZlMjAgNzc2NSA2MjIwCi0JMHgwNWUwOiAgNzA2MSA2NzY1IDczMjAgNjE3MyAwYTczIDZmNmYgNmUyMCA2MTczCi0JMHgwNWYwOiAgMjA3MCA2ZjczIDczNjkgNjI2YyA2NTJlIDNjMmYgNTM1NCA1MjRmCi0JMHgwNjAwOiAgNGU0NyAzZTNjIDJmNTAgM2UwYSAwYTNjIDUwM2UgNTU2ZSA2YzY1Ci0JMHgwNjEwOiAgNzM3MyAyMDc5IDZmNzUgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDY5Ci0JMHgwNjIwOiAgNzQ3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjEgNzQ2OSA2ZjZlCi0JMHgwNjMwOiAgMmMyMCA3OTZmIDc1NzIgMjA2ZSA2NTc3IDIwNzMgNjU3MiA3NjY1Ci0JMHgwNjQwOiAgNzIyMCA2OTczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2NSA2NDIwCi0JMHgwNjUwOiAgNjE3MyAyMDY2IDZmNmMgNmM2ZiA3NzczIDNhMGEgM2M1NSA0YzNlCi0JMHgwNjYwOiAgMGEzYyA0YzQ5IDNlMGEgNDM2ZiA2ZTY2IDY5NjcgNzU3MiA2MTc0Ci0JMHgwNjcwOiAgNjk2ZiA2ZTIwIDY2NjkgNmM2NSA3MzIwIDYzNjEgNmUyMCA2MjY1Ci0JMHgwNjgwOiAgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjY1Ci0JMHgwNjkwOiAgNzQ2MyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjCi0JMHgwNmEwOiAgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjCi0JMHgwNmIwOiAgNTQ1NCAzZTQ0IDZmNjMgNzU2ZCA2NTZlIDc0NTIgNmY2ZiA3NDNjCi0JMHgwNmMwOiAgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzIDY4MjAgNjk3MyAyMDc0Ci0JMHgwNmQwOiAgNjg2NSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA3NSA2ZTY0Ci0JMHgwNmUwOiAgNjU3MiAyMDc3IDY4NjkgNjM2OCAyMDYxIDZjNmMgMjA3OSA2Zjc1Ci0JMHgwNmYwOiAgNzIwYSA0ODU0IDRkNGMgMjA2NiA2OTZjIDY1NzMgMjA3MyA2ODZmCi0JMHgwNzAwOiAgNzU2YyA2NDIwIDY1NzggNjk3MyA3NDJjIDIwNjkgNzMyMCA3MzY1Ci0JMHgwNzEwOiAgNzQyMCA3NDZmIDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3Ci0JMHgwNzIwOiAgNzczYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjCi0JMHgwNzMwOiAgNDkzZSAwYTQzIDQ3NDkgMjA3MyA2MzcyIDY5NzAgNzQ3MyAyMDYxCi0JMHgwNzQwOiAgNzI2NSAyMDZjIDZmNmYgNmI2NSA2NDIwIDY2NmYgNzIyMCA2OTZlCi0JMHgwNzUwOiAgMjAzYyA1NDU0IDNlMmYgNzU3MyA3MjJmIDZjNjkgNjIyZiA2MzY3Ci0JMHgwNzYwOiAgNjkyZCA2MjY5IDZlM2MgMmY1NCA1NDNlIDJjMjAgNzc2OCA2OTYzCi0JMHgwNzcwOiAgNjgyMCA2OTczIDIwNzcgNjg2NSA3MjY1IDBhNDQgNjU2MiA2OTYxCi0JMHgwNzgwOiAgNmUyMCA3MDYxIDYzNmIgNjE2NyA2NTczIDIwNzcgNjk2YyA2YzIwCi0JMHgwNzkwOiAgNzA2YyA2MTYzIDY1MjAgNzQ2OCA2NTY5IDcyMjAgNzM2MyA3MjY5Ci0JMHgwN2EwOiAgNzA3NCA3MzJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhCi0JMHgwN2IwOiAgNGM2ZiA2NzIwIDY2NjkgNmM2NSA3MzIwIDYxNzIgNjUyMCA3MDZjCi0JMHgwN2MwOiAgNjE2MyA2NTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY3NiA2MTcyCi0JMHgwN2QwOiAgMmY2YyA2ZjY3IDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlCi0JMHgwN2UwOiAgMmMyMCA2MTZlIDY0MjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA3MjZmCi0JMHgwN2YwOiAgNzQ2MSA3NDY1IDY0MGEgNzc2NSA2NTZiIDZjNzkgMmUyMCAyMDU0Ci0JMHgwODAwOiAgNjg2NSAyMDY2IDcyNjUgNzE3NSA2NTZlIDYzNzkgMjA2ZiA2NjIwCi0JMHgwODEwOiAgNzI2ZiA3NDYxIDc0NjkgNmY2ZSAyMDYzIDYxNmUgMjA2MiA2NTIwCi0JMHgwODIwOiAgNjU2MSA3MzY5IDZjNzkgMjA2MyA2ODYxIDZlNjcgNjU2NCAyMDYyCi0JMHgwODMwOiAgNzkyMCA2NTY0IDY5NzQgNjk2ZSA2NzBhIDNjNTQgNTQzZSAyZjY1Ci0JMHgwODQwOiAgNzQ2MyAyZjZjIDZmNjcgNzI2ZiA3NDYxIDc0NjUgMmU2NCAyZjYxCi0JMHgwODUwOiAgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlCi0JMHgwODYwOiAgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwNjQgNjU2NiA2MTc1Ci0JMHgwODcwOiAgNmM3NCAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2OSA2ZTY0Ci0JMHgwODgwOiAgNjU3OCAyMDY5IDczMjAgM2M1NCA1NDNlIDY5NmUgNjQ2NSA3ODJlCi0JMHgwODkwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTJjIDIwNmQgNjU2MSA2ZTY5Ci0JMHgwOGEwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCA3MjY1IDcxNzUgNjU3MyA3NDczCi0JMHgwOGIwOiAgMGE2NiA2ZjcyIDIwNjEgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5Ci0JMHgwOGMwOiAgMjAzYyA1NDU0IDNlMmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiAzYzJmCi0JMHgwOGQwOiAgNTQ1NCAzZTIwIDc3NjkgNmM2YyAyMDY3IDY5NzYgNjUyMCA3NDY4Ci0JMHgwOGUwOiAgNjUyMCA2MzZmIDZlNzQgNjU2ZSA3NDczIDIwNmYgNjYyMCA3NDY4Ci0JMHgwOGYwOiAgNjUyMCA2NjY5IDZjNjUgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmCi0JMHgwOTAwOiAgNzc3NyA3NzJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgNjk2ZSA2NDY1Ci0JMHgwOTEwOiAgNzgyZSA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMGEgNjk2NiAyMDY5Ci0JMHgwOTIwOiAgNzQyMCA2NTc4IDY5NzMgNzQ3MyAyMDI4IDYxNzMgNzM3NSA2ZDY5Ci0JMHgwOTMwOiAgNmU2NyAyMDc0IDY4NjEgNzQyMCAzYzU0IDU0M2UgMmY3NiA2MTcyCi0JMHgwOTQwOiAgMmY3NyA3Nzc3IDNjMmYgNTQ1NCAzZTIwIDY5NzMgMjA3OSA2Zjc1Ci0JMHgwOTUwOiAgNzIyMCAzYzU0IDU0M2UgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA1MjZmCi0JMHgwOTYwOiAgNmY3NCAzYzJmIDU0NTQgM2UyOSAyZTNjIDJmNGMgNDkzZSAwYTBhCi0JMHgwOTcwOiAgM2M0YyA0OTNlIDBhNTUgNzM2NSA3MjIwIDY0NjkgNzI2NSA2Mzc0Ci0JMHgwOTgwOiAgNmY3MiA2OTY1IDczMjAgNjE3MiA2NTIwIDY1NmUgNjE2MiA2YzY1Ci0JMHgwOTkwOiAgNjQyYyAyMDYxIDZlNjQgMjA3NSA3MzY1IDcyMjAgNjQ2ZiA2Mzc1Ci0JMHgwOWEwOiAgNmQ2NSA2ZTc0IDczMjAgNzc2OSA2YzZjIDIwNjIgNjUyMCA2YzZmCi0JMHgwOWIwOiAgNmY2YiA2NTY0IDIwNjYgNmY3MiAwYTY5IDZlMjAgNzQ2OCA2NTIwCi0JMHgwOWMwOiAgM2M1NCA1NDNlIDcwNzUgNjI2YyA2OTYzIDVmNjggNzQ2ZCA2YzNjCi0JMHgwOWQwOiAgMmY1NCA1NDNlIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDZmCi0JMHgwOWUwOiAgNjYyMCA3NDY4IDY1MjAgNzU3MyA2NTcyIDczMjcgMjA2OCA2ZjZkCi0JMHgwOWYwOiAgNjU3MyAyZTIwIDIwNTQgNjg2NSA3MzY1IDIwNjQgNjk3MiA3MzBhCi0JMHgwYTAwOiAgNzM2OCA2Zjc1IDZjNjQgMjA2MiA2NTIwIDc1NmUgNjQ2NSA3MjIwCi0JMHgwYTEwOiAgM2M1NCA1NDNlIDJmNjggNmY2ZCA2NTNjIDJmNTQgNTQzZSAyYzIwCi0JMHgwYTIwOiAgNjE2ZSA2NDIwIDc1NzMgNjU3MiA3MzIwIDc3NjkgNmM2YyAyMDZlCi0JMHgwYTMwOiAgNmY3NCAyMDYyIDY1MjAgNjE2MiA2YzY1IDIwNzQgNmYyMCA3Mzc5Ci0JMHgwYTQwOiAgNmQ2YyA2OTZlIDZiMGEgNzQ2ZiAyMDY2IDY5NmMgNjU3MyAyMDc0Ci0JMHgwYTUwOiAgNjg2NSA3OTIwIDY0NmYgNmUyNyA3NDIwIDZmNzcgNmUyZSAzYzJmCi0JMHgwYTYwOiAgNGM0OSAzZTBhIDBhM2MgMmY1NSA0YzNlIDBhNDEgNmM2YyAyMDc0Ci0JMHgwYTcwOiAgNjg2NSAyMDczIDc0NjEgNmU2NCA2MTcyIDY0MjAgNjE3MCA2MTYzCi0JMHgwYTgwOiAgNjg2NSAyMDZkIDZmNjQgNzU2YyA2NTczIDIwNjEgNzI2NSAyMDYxCi0JMHgwYTkwOiAgNzY2MSA2OTZjIDYxNjIgNmM2NSAyMDc3IDY5NzQgNjgyMCA3NDY4Ci0JMHgwYWEwOiAgNjk3MyAyMDcyIDY1NmMgNjU2MSA3MzY1IDIwNjEgNmU2NCAyMDYxCi0JMHgwYWIwOiAgNzI2NSAwYTZlIDZmNzcgMjA2ZCA2MTZlIDYxNjcgNjU2NCAyMDc3Ci0JMHgwYWMwOiAgNjk3NCA2ODIwIDY0NjUgNjI2MyA2ZjZlIDY2MmUgMjAyMCA1NDc5Ci0JMHgwYWQwOiAgNzA2NSAyMDNjIDU0NTQgM2U2NCA3MDZiIDY3MmQgNzI2NSA2MzZmCi0JMHgwYWUwOiAgNmU2NiA2OTY3IDc1NzIgNjUyMCA2MTcwIDYxNjMgNjg2NSAzYzJmCi0JMHgwYWYwOiAgNTQ1NCAzZTIwIDc0NmYgMGE3MyA2NTZjIDY1NjMgNzQyMCA3NzY4Ci0JMHgwYjAwOiAgNjk2MyA2ODIwIDZkNmYgNjQ3NSA2YzY1IDczMjAgNzk2ZiA3NTIwCi0JMHgwYjEwOiAgNzc2MSA2ZTc0IDIwNjUgNmU2MSA2MjZjIDY1NjQgMmUyMCAyMDRkCi0JMHgwYjIwOiAgNjE2ZSA3OTIwIDZmNzQgNjg2NSA3MjIwIDZkNmYgNjQ3NSA2YzY1Ci0JMHgwYjMwOiAgNzMyMCA2MTcyIDY1MjAgNjE3NiA2MTY5IDZjNjEgNjI2YyA2NTBhCi0JMHgwYjQwOiAgNzQ2OCA3MjZmIDc1NjcgNjgyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5Ci0JMHgwYjUwOiAgNjE2ZSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzMgNzk3MyA3NDY1Ci0JMHgwYjYwOiAgNmQyMCA3NzY5IDc0NjggMjA3NCA2ODY1IDIwNmUgNjE2ZCA2NTczCi0JMHgwYjcwOiAgMjAzYyA1NDU0IDNlNmMgNjk2MiA2MTcwIDYxNjMgNjg2NSAyZDZkCi0JMHgwYjgwOiAgNmY2NCAyZDJhIDNjMmYgNTQ1NCAzZTJlIDBhNDkgNjYyMCA3OTZmCi0JMHgwYjkwOiAgNzUyMCA2ZTY1IDY1NjQgMjA3NCA2ZjIwIDYzNmYgNmQ3MCA2OTZjCi0JMHgwYmEwOiAgNjUyMCA2MTIwIDZkNmYgNjQ3NSA2YzY1IDIwNzkgNmY3NSA3MjczCi0JMHgwYmIwOiAgNjU2YyA2NjJjIDIwNzkgNmY3NSAyMDc3IDY5NmMgNmMyMCA2ZTY1Ci0JMHgwYmMwOiAgNjU2NCAyMDc0IDZmMjAgNjk2ZSA3Mzc0IDYxNmMgNmMyMCA3NDY4Ci0JMHgwYmQwOiAgNjUwYSAzYzU0IDU0M2UgNjE3MCA2MTYzIDY4NjUgMmQ2NCA2NTc2Ci0JMHgwYmUwOiAgM2MyZiA1NDU0IDNlMjAgNzA2MSA2MzZiIDYxNjcgNjUyZSAwYTBhCi0JMHgwYmYwOiAgM2M1MCAzZTRkIDZmNzIgNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0Ci0JMHgwYzAwOiAgNjE3NCA2OTZmIDZlMjAgNmY2ZSAyMDQxIDcwNjEgNjM2OCA2NTIwCi0JMHgwYzEwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2ZiA2ZTNhCi0JMHgwYzIwOiAgMGEzYyA1NTRjIDNlMGEgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDNjCi0JMHgwYzMwOiAgNDEyMCA0ODUyIDQ1NDYgM2QyMiAyZjY0IDZmNjMgMmY2MSA3MDYxCi0JMHgwYzQwOiAgNjM2OCA2NTJkIDY0NmYgNjMyZiA2ZDYxIDZlNzUgNjE2YyAyZjIyCi0JMHgwYzUwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA2NDZmIDYzNzUgNmQ2NSA2ZTc0Ci0JMHgwYzYwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDczNzQgNmY3MiA2NTY0Ci0JMHgwYzcwOiAgMjA2ZiA2ZTIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjJlCi0JMHgwYzgwOiAgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwCi0JMHgwYzkwOiAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmCi0JMHgwY2EwOiAgNzc3NyA3NzJlIDYxNzAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyCi0JMHgwY2IwOiAgM2U0MSA3MDYxIDYzNjggNjUyMCA1MDcyIDZmNmEgNjU2MyA3NDNjCi0JMHgwY2MwOiAgMmY0MSAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmCi0JMHgwY2QwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxCi0JMHgwY2UwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3Ci0JMHgwY2YwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZDczIDczNmMgMmU2ZiA3MjY3Ci0JMHgwZDAwOiAgMmYyMiAzZTQxIDcwNjEgNjM2OCA2NTJkIDUzNTMgNGMzYyAyZjQxCi0JMHgwZDEwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5Ci0JMHgwZDIwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4Ci0JMHgwZDMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzA2NSA3MjZjCi0JMHgwZDQwOiAgMmU2MSA3MDYxIDYzNjggNjUyZSA2ZjcyIDY3MmYgMjIzZSA2ZDZmCi0JMHgwZDUwOiAgNjQyMCA3MDY1IDcyNmMgM2MyZiA0MTNlIDIwNjggNmY2ZCA2NTIwCi0JMHgwZDYwOiAgNzM2OSA3NDY1IDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlCi0JMHgwZDcwOiAgMGE1NCA2ODY1IDIwM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0Ci0JMHgwZDgwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYxIDcwNjEgNjM2OCA2NTc3Ci0JMHgwZDkwOiAgNjU2NSA2YjJlIDYzNmYgNmQyZiAyMjNlIDQxNzAgNjE2MyA2ODY1Ci0JMHgwZGEwOiAgNTc2NSA2NTZiIDNjMmYgNDEzZSAyMDZlIDY1NzcgNzM2YyA2NTc0Ci0JMHgwZGIwOiAgNzQ2NSA3MjJlIDNjMmYgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhCi0JMHgwZGMwOiAgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0Ci0JMHgwZGQwOiAgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1IDYyNjkgNjE2ZSAyZTZmCi0JMHgwZGUwOiAgNzI2NyAyZjY0IDZmNjMgMmYyMiAzZTQ0IDY1NjIgNjk2MSA2ZTIwCi0JMHgwZGYwOiAgNTA3MiA2ZjZhIDY1NjMgNzQwYSA0NDZmIDYzNzUgNmQ2NSA2ZTc0Ci0JMHgwZTAwOiAgNjE3NCA2OTZmIDZlM2MgMmY0MSAzZTIwIDc3NjggNjk2MyA2ODIwCi0JMHgwZTEwOiAgNjM2ZiA2ZTc0IDYxNjkgNmU3MyAyMDQ4IDRmNTcgNTQ0ZiA3MzJjCi0JMHgwZTIwOiAgMjA0NiA0MTUxIDczMmMgMjA2MSA2ZTY0IDIwNzMgNmY2NiA3NDc3Ci0JMHgwZTMwOiAgNjE3MiA2NTIwIDc1NzAgNjQ2MSA3NDY1IDczMmUgM2MyZiA0YzQ5Ci0JMHgwZTQwOiAgM2UwYSAzYzJmIDU1NGMgM2UwYSAwYTNjIDUwM2UgNTk2ZiA3NTIwCi0JMHgwZTUwOiAgNjM2MSA2ZTIwIDYxNmMgNzM2ZiAyMDYzIDZmNmUgNzM3NSA2Yzc0Ci0JMHgwZTYwOiAgMjA3NCA2ODY1IDIwNmMgNjk3MyA3NDIwIDZmNjYgMjAzYyA0MTIwCi0JMHgwZTcwOiAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3Ci0JMHgwZTgwOiAgMmU2MiA2Zjc1IDc0NjUgNmM2YyAyZTYzIDZmNmQgMmY2NiA2MTcxCi0JMHgwZTkwOiAgMmYyMiAzZTU3IDZmNzIgNmM2NCAwYTU3IDY5NjQgNjUyMCA1NzY1Ci0JMHgwZWEwOiAgNjIyMCA0NjcyIDY1NzEgNzU2NSA2ZTc0IDZjNzkgMjA0MSA3MzZiCi0JMHgwZWIwOiAgNjU2NCAyMDUxIDc1NjUgNzM3NCA2OTZmIDZlNzMgM2MyZiA0MTNlCi0JMHgwZWMwOiAgMjA2NiA2ZjcyIDIwNjkgNmU2NiA2ZjcyIDZkNjEgNzQ2OSA2ZjZlCi0JMHgwZWQwOiAgMmUwYSAwYTNjIDQ4MzIgM2U0YyA2NTc0IDIwNmYgNzQ2OCA2NTcyCi0JMHgwZWUwOiAgMjA3MCA2NTZmIDcwNmMgNjUyMCA2YjZlIDZmNzcgMjA2MSA2MjZmCi0JMHgwZWYwOiAgNzU3NCAyMDc0IDY4NjkgNzMyMCA3MzY1IDcyNzYgNjU3MiAzYzJmCi0JMHgwZjAwOiAgNDgzMiAzZTBhIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0Ci0JMHgwZjEwOiAgNzQ3MCAzYTJmIDJmNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmCi0JMHgwZjIwOiAgNmQyZiAyMjNlIDRlNjUgNzQ2MyA3MjYxIDY2NzQgM2MyZiA0MTNlCi0JMHgwZjMwOiAgMjA3MCA3MjZmIDc2NjkgNjQ2NSA3MzIwIDYxNmUgMjA2OSA2ZTc0Ci0JMHgwZjQwOiAgNjU3MiA2NTczIDc0NjkgNmU2NyAyMDY2IDcyNjUgNjUwYSA3MzY1Ci0JMHgwZjUwOiAgNzI3NiA2OTYzIDY1MjAgNjY2ZiA3MjIwIDc3NjUgNjIyMCA3MzY5Ci0JMHgwZjYwOiAgNzQ2NSAyMDZkIDZmNmUgNjk3NCA2ZjcyIDY5NmUgNjcyMCA2MTZlCi0JMHgwZjcwOiAgNjQyMCA3Mzc0IDYxNzQgNjk3MyA3NDY5IDYzMjAgNjM2ZiA2YzZjCi0JMHgwZjgwOiAgNjU2MyA3NDY5IDZmNmUgMmUwYSA1OTZmIDc1MjAgNjM2MSA2ZTIwCi0JMHgwZjkwOiAgNmM2NSA3NDIwIDc0NjggNjU2ZCAyMDZiIDZlNmYgNzcyMCA2MTYyCi0JMHgwZmEwOiAgNmY3NSA3NDIwIDc5NmYgNzU3MiAyMDczIDY1NzIgNzY2NSA3MjIwCi0JMHgwZmIwOiAgNzU3MyA2OTZlIDY3MjAgNzQ2OCA2NTY5IDcyMGEgM2M0MSAyMDQ4Ci0JMHgwZmMwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzU3MCA3NDY5Ci0JMHgwZmQwOiAgNmQ2NSAyZTZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmCi0JMHgwZmUwOiAgMjIzZSA2OTZlIDc0NjUgNzI2NiA2MTYzIDY1M2MgMmY0MSAzZTJlCi0JMHgwZmYwOiAgMGE0NSA2ZTYxIDYyNmMgNjk2ZSA2NzIwIDc0NjggNjUyMCA2ZDZmCi0JMHgxMDAwOiAgNmU2OSA3NDZmIDcyNjkgNmU2NyAyMDZmIDY2MjAgNzk2ZiA3NTcyCi0JMHgxMDEwOiAgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NzY5IDZjNmMgMjA3MCA3MjZmCi0JMHgxMDIwOiAgNzY2OSA2NDY1IDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIyMCA2NzZjCi0JMHgxMDMwOiAgNmY2MiA2MTZjIDIwNmYgNzY2NSA3Mjc2IDY5NjUgNzcwYSA2ZjY2Ci0JMHgxMDQwOiAgMjA3NyA2ODZmIDIwNjkgNzMyMCA3NTczIDY5NmUgNjcyMCA3NzY4Ci0JMHgxMDUwOiAgNjE3NCAyMDYxIDZlNjQgMjA3NyA2ODY1IDcyNjUgMmMyMCA2MTZlCi0JMHgxMDYwOiAgNjQyMCA2OTc0IDIwNzcgNmY3NSA2YzY0IDIwNjcgNjk3NiA2NTIwCi0JMHgxMDcwOiAgNDQ2NSA2MjY5IDYxNmUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjBhCi0JMHgxMDgwOiAgNmY3NiA2NTcyIDc2NjkgNjU3NyAyMDZmIDY2MjAgNzQ2OCA2NTIwCi0JMHgxMDkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc1Ci0JMHgxMGEwOiAgNzM2MSA2NzY1IDJlMGEgMGEzYyA0ODMyIDNlNDEgNjI2ZiA3NTc0Ci0JMHgxMGIwOiAgMjA3NCA2ODY5IDczMjAgNzA2MSA2NzY1IDNjMmYgNDgzMiAzZTBhCi0JMHgxMGMwOiAgMGEzYyA0OTRkIDQ3MjAgNDE0YyA0OTQ3IDRlM2QgMjI3MiA2OTY3Ci0JMHgxMGQwOiAgNjg3NCAyMjIwIDQxNGMgNTQzZCAyMjIyIDIwNDggNDU0OSA0NzQ4Ci0JMHgxMGUwOiAgNTQzZCAyMjMyIDM0MzcgMjIyMCA1NzQ5IDQ0NTQgNDgzZCAyMjMyCi0JMHgxMGYwOiAgMzczOCAyMjIwIDUzNTIgNDMzZCAyMjY5IDYzNmYgNmU3MyAyZjZhCi0JMHgxMTAwOiAgNjg2NSAzMDM2IDMxMmUgNzA2ZSA2NzIyIDNlMGEgMGEzYyA1MDNlCi0JMHgxMTEwOiAgNTQ2OCA2OTczIDIwNjkgNzMyMCA2MTIwIDcwNmMgNjE2MyA2NTY4Ci0JMHgxMTIwOiAgNmY2YyA2NDY1IDcyMjAgNzA2MSA2NzY1IDIwNjkgNmU3MyA3NDYxCi0JMHgxMTMwOiAgNmM2YyA2NTY0IDIwNjIgNzkyMCA3NDY4IDY1MjAgM2M0MSAwYTQ4Ci0JMHgxMTQwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCi0JMHgxMTUwOiAgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3IDJmMjIgM2U0NCA2NTYyCi0JMHgxMTYwOiAgNjk2MSA2ZTNjIDJmNDEgM2UwYSA3MjY1IDZjNjUgNjE3MyA2NTIwCi0JMHgxMTcwOiAgNmY2NiAyMDc0IDY4NjUgMjA2MSA3MDYxIDYzNjggNjUyMCA1NzY1Ci0JMHgxMTgwOiAgNjIyMCA3MzY1IDcyNzYgNjU3MiAyMDcwIDYxNjMgNmI2MSA2NzY1Ci0JMHgxMTkwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2OTczIDIwNjMgNmY2ZCA3MDc1Ci0JMHgxMWEwOiAgNzQ2NSA3MjIwIDY4NjEgNzMyMCA2OTZlIDczNzQgNjE2YyA2YzY1Ci0JMHgxMWIwOiAgNjQyMCA3NDY4IDY1MjAgNDQ2NSA2MjY5IDYxNmUgMjA0NyA0ZTU1Ci0JMHgxMWMwOiAgMmY0YyA2OTZlIDc1NzggMjA2ZiA3MDY1IDcyNjEgNzQ2OSA2ZTY3Ci0JMHgxMWQwOiAgMjA3MyA3OTczIDc0NjUgNmQyYyAwYTYyIDc1NzQgMjA2OSA3NDIwCi0JMHgxMWUwOiAgNjg2MSA3MzIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDY4Ci0JMHgxMWYwOiAgNjk2ZSA2NzIwIDc0NmYgMjA2NCA2ZjIwIDc3NjkgNzQ2OCAyMDc0Ci0JMHgxMjAwOiAgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIgNmY2YSA2NTYzCi0JMHgxMjEwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDJlMjAgNTA2YyA2NTYxCi0JMHgxMjIwOiAgNzM2NSAyMDY0IDZmMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmCi0JMHgxMjMwOiAgNzQzYyAyZjczIDc0NzIgNmY2ZSA2NzNlIDIwNjMgNmY2ZSA3NDYxCi0JMHgxMjQwOiAgNjM3NCAyMDc0IDY4NjUgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyCi0JMHgxMjUwOiAgNmY2YSA2NTYzIDc0MjAgNjE2MiA2Zjc1IDc0MjAgNjk3NCAyZTNjCi0JMHgxMjYwOiAgMmY1MCAzZTBhIDBhM2MgNTAzZSA0OTY2IDIwNzkgNmY3NSAyMDY2Ci0JMHgxMjcwOiAgNjk2ZSA2NDIwIDYxMjAgNjI3NSA2NzIwIDY5NmUgMjA3NCA2ODY5Ci0JMHgxMjgwOiAgNzMyMCA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1Ci0JMHgxMjkwOiAgMmMyMCA2ZjcyIDIwNjkgNmUyMCA0MTcwIDYxNjMgNjg2NSAyMDY5Ci0JMHgxMmEwOiAgNzQ3MyA2NTZjIDY2MmMgMGE3MCA2YzY1IDYxNzMgNjUyMCA2NjY5Ci0JMHgxMmIwOiAgNmM2NSAyMDYxIDIwNjIgNzU2NyAyMDcyIDY1NzAgNmY3MiA3NDIwCi0JMHgxMmMwOiAgNmY2ZSAyMDY5IDc0MmUgMjAyMCA0OTZlIDczNzQgNzI3NSA2Mzc0Ci0JMHgxMmQwOiAgNjk2ZiA2ZTczIDIwNmYgNmUyMCA2NDZmIDY5NmUgNjcyMCA3NDY4Ci0JMHgxMmUwOiAgNjk3MyAyYzIwIDYxNmUgNjQyMCA3NDY4IDY1MGEgNmM2OSA3Mzc0Ci0JMHgxMmYwOiAgMjA2ZiA2NjIwIDNjNDEgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0Ci0JMHgxMzAwOiAgNzAzYSAyZjJmIDYyNzUgNjc3MyAyZTY0IDY1NjIgNjk2MSA2ZTJlCi0JMHgxMzEwOiAgNmY3MiA2NzJmIDczNzIgNjMzYSA2MTcwIDYxNjMgNjg2NSAyMjNlCi0JMHgxMzIwOiAgNmI2ZSA2Zjc3IDZlMjAgNjI3NSA2NzczIDNjMmYgNDEzZSAyMDZmCi0JMHgxMzMwOiAgNjYyMCA3NDY4IDY5NzMgMGE3MCA2MTYzIDZiNjEgNjc2NSAyYzIwCi0JMHgxMzQwOiAgNjM2MSA2ZTIwIDYyNjUgMjA2NiA2Zjc1IDZlNjQgMjA2OSA2ZTIwCi0JMHgxMzUwOiAgNzQ2OCA2NTIwIDBhM2MgNDEyMCA0ODUyIDQ1NDYgM2QyMiA2ODc0Ci0JMHgxMzYwOiAgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIgNjk2MSA2ZTJlCi0JMHgxMzcwOiAgNmY3MiA2NzJmIDQyNzUgNjc3MyAyZjUyIDY1NzAgNmY3MiA3NDY5Ci0JMHgxMzgwOiAgNmU2NyAyMjNlIDQ0NjUgNjI2OSA2MTZlIDIwNDIgNzU2NyAyMDU0Ci0JMHgxMzkwOiAgNzI2MSA2MzZiIDY5NmUgNjcyMCA1Mzc5IDczNzQgNjU2ZCAzYzJmCi0JMHgxM2EwOiAgNDEzZSAyZTBhIDBhM2MgNTAzZSA1NDY4IDYxNmUgNmI3MyAyMDY2Ci0JMHgxM2IwOiAgNmY3MiAyMDc1IDczNjkgNmU2NyAyMDc0IDY4NjkgNzMyMCA3MDYxCi0JMHgxM2MwOiAgNjM2YiA2MTY3IDY1MmMgMjA2MSA2ZTY0IDIwNjMgNmY2ZSA2NzcyCi0JMHgxM2QwOiAgNjE3NCA3NTZjIDYxNzQgNjk2ZiA2ZTczIDIwNjYgNmY3MiAyMDc5Ci0JMHgxM2UwOiAgNmY3NSA3MjIwIDYzNjggNmY2OSA2MzY1IDIwNmYgNjYwYSA2MTIwCi0JMHgxM2YwOiAgNDQ2NSA2MjY5IDYxNmUgMjA3MyA3OTczIDc0NjUgNmQyMSAzYzJmCi0JMHgxNDAwOiAgNTAzZSAwYTBhIDNjNDQgNDk1NiAyMDYxIDZjNjkgNjc2ZSAzZDIyCi0JMHgxNDEwOiAgNjM2NSA2ZTc0IDY1NzIgMjIzZSAwYTNjIDYxMjAgNjg3MiA2NTY2Ci0JMHgxNDIwOiAgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyCi0JMHgxNDMwOiAgNjk2MSA2ZTJlIDZmNzIgNjcyZiAyMjNlIDBhM2MgNDk0ZCA0NzIwCi0JMHgxNDQwOiAgNjE2YyA2OTY3IDZlM2QgMjI2ZCA2OTY0IDY0NmMgNjUyMiAyMDY4Ci0JMHgxNDUwOiAgNjU2OSA2NzY4IDc0M2QgMjIzMyAzMDIyIDIwNzcgNjk2NCA3NDY4Ci0JMHgxNDYwOiAgM2QyMiAzMjM1IDIyMjAgNzM3MiA2MzNkIDIyNjkgNjM2ZiA2ZTczCi0JMHgxNDcwOiAgMmY2NCA2NTYyIDY5NjEgNmUyZiA2ZjcwIDY1NmUgNmM2ZiA2NzZmCi0JMHgxNDgwOiAgMmQzMiAzNTJlIDZhNzAgNjcyMiAyMDYxIDZjNzQgM2QyMiA0NDY1Ci0JMHgxNDkwOiAgNjI2OSA2MTZlIDIyM2UgMGEzYyAyZjYxIDNlMGEgM2M2MSAyMDY4Ci0JMHgxNGEwOiAgNzI2NSA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCi0JMHgxNGIwOiAgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIgM2UwYSAzYzQ5Ci0JMHgxNGMwOiAgNGQ0NyAyMDYxIDZjNjkgNjc2ZSAzZDIyIDZkNjkgNjQ2NCA2YzY1Ci0JMHgxNGQwOiAgMjIyMCA2ODY1IDY5NjcgNjg3NCAzZDIyIDMzMzIgMjIyMCA3NzY5Ci0JMHgxNGUwOiAgNjQ3NCA2ODNkIDIyMzIgMzUzOSAyMjIwIDczNzIgNjMzZCAyMjY5Ci0JMHgxNGYwOiAgNjM2ZiA2ZTczIDJmNjEgNzA2MSA2MzY4IDY1NWYgNzA2MiAyZTcwCi0JMHgxNTAwOiAgNmU2NyAyMjIwIDYxNmMgNzQzZCAyMjQxIDcwNjEgNjM2OCA2NTIyCi0JMHgxNTEwOiAgM2UwYSAzYzJmIDYxM2UgMGEzYyAyZjQ0IDQ5NTYgM2UwYSAwYTNjCi0JMHgxNTIwOiAgMjEyZCAyZDBhIDIwMjAgNTQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwCi0JMHgxNTMwOiAgNzc2MSA3MzIwIDY5NmUgNjk3NCA2OTYxIDZjNmMgNzkyMCA2MzcyCi0JMHgxNTQwOiAgNjU2MSA3NDY1IDY0MjAgNjI3OSAyMDRhIDZmNjggNmU2OSA2NTIwCi0JMHgxNTUwOiAgNDk2ZSA2NzcyIDYxNmQgMjAyOCA2ODc0IDc0NzAgM2EyZiAyZjZlCi0JMHgxNTYwOiAgNjU3NCA2NzZmIDY0MmUgNmU2NSA3NDJmIDI5MGEgMjAyMCA0OTc0Ci0JMHgxNTcwOiAgMjA3NyA2MTczIDIwNmMgNjE3NCA2NTcyIDIwNjUgNjQ2OSA3NDY1Ci0JMHgxNTgwOiAgNjQyMCA2Mjc5IDIwNGQgNjE3NCA3NDY4IDY1NzcgMjA1NyA2OTZjCi0JMHgxNTkwOiAgNjM2ZiA3ODIwIDYxNmUgNjQyMCA0YTZmIDczNjkgNzAyMCA1MjZmCi0JMHgxNWEwOiAgNjQ2OSA2ZTJlIDBhMjAgMjA0YyA2MTczIDc0MjAgNmQ2ZiA2NDY5Ci0JMHgxNWIwOiAgNjY2OSA2NTY0IDNhMjAgMjQ0NCA2MTc0IDY1M2EgMjAzMiAzMDMwCi0JMHgxNWMwOiAgMzQyZiAzMDM2IDJmMzIgMzAyMCAzMTM1IDNhMzMgMzMzYSAzNTM3Ci0JMHgxNWQwOiAgMjAyNCAyZTBhIDIwMjAgMmQyZCAzZTBhIDBhM2MgMmY0MiA0ZjQ0Ci0JMHgxNWUwOiAgNTkzZSAwYTNjIDJmNDggNTQ0ZCA0YzNlIDBhCi0yMzo1NzozNS45NDEyNjAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MyAxMzA2MzAwOTUzPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjZlIDQwMDAgNDAwNiAyMTU0IDdmMDAgMDAwMQotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOQotCTB4MDAyMDogIDgwMTAgMzA1ZiAxMGVhIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOQotCTB4MDAzMDogIDRkZGMgOTIxOQotMjM6NTc6MzcuMjI5NTc1IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogRiAyMDM6MjAzKDApIGFjayA1NTYwIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MSAxMzA2MzAwOTUzPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMQotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOQotCTB4MDAyMDogIDgwMTEgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMQotCTB4MDAzMDogIDRkZGMgOTIxOQotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxZmU4IDQwMDAgNDAwNiAxY2RhIDdmMDAgMDAwMQotCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSBhM2E5IDM3NTggOGE0YQotCTB4MDAyMDogIDgwMTEgMjAwMCAxNzM1IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMwotCTB4MDAzMDogIDRkZGMgOTcyMQotMjM6NTc6MzcuMjMwOTAwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MSB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDIyNDMgMTMwNjMwMjI0Mz4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWI3MiA0MDAwIDQwMDYgMjE1MCA3ZjAwIDAwMDEKLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggOGE0YSAzNzdhIGEzYWEKLQkweDAwMjA6ICA4MDEwIDMwNWYgMDZkNCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMKLQkweDAwMzA6ICA0ZGRjIDk3MjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3ByaW50LXgub3V0IGIvdGVzdHMvcHJpbnQteC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjViZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcHJpbnQteC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotMjM6NTc6MzUuOTM4MDY2IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogUyA5Mjg1NDkyNDY6OTI4NTQ5MjQ2KDApIHdpbiAzMjc2NyA8bXNzIDE2Mzk2LHNhY2tPSyx0aW1lc3RhbXAgMTMwNjMwMDk1MCAwLG5vcCx3c2NhbGUgMj4KLQkweDAwMDA6ICA0NTAwIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEKLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAKLQkweDAwMjA6ICBhMDAyIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEKLQkweDAwMzA6ICA0ZGRjIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMgotMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgotCTB4MDAwMDogIDQ1MDAgMDAzYyAwMDAwIDQwMDAgNDAwNiAzY2JhIDdmMDAgMDAwMQotCTB4MDAxMDogIDdmMDAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYxIDM3NTggODk3ZgotCTB4MDAyMDogIGEwMTIgN2ZmZiA2ZWIxIDAwMDAgMDIwNCA0MDBjIDA0MDIgMDgwYQotCTB4MDAzMDogIDRkZGMgOTIxNiA0ZGRjIDkyMTYgMDEwMyAwMzAyCi0yMzo1NzozNS45MzgxNjcgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayAxIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTA+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFiNmEgNDAwMCA0MDA2IDIxNTggN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDg5N2YgMzc3YSA4ZGYyCi0JMHgwMDIwOiAgODAxMCAyMDAwIDM3ZDAgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE2Ci0JMHgwMDMwOiAgNGRkYyA5MjE2Ci0yMzo1NzozNS45Mzk0MjMgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBQIDE6MjAzKDIwMikgYWNrIDEgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTEgMTMwNjMwMDk1MD4KLQkweDAwMDA6ICA0NTAwIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEKLQkweDAwMTA6ICA3ZjAwIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIKLQkweDAwMjA6ICA4MDE4IDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcKLQkweDAwMzA6ICA0ZGRjIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEKLQkweDAwNDA6ICAyZTMxIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjgKLQkweDAwNTA6ICA2ZjczIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EKLQkweDAwNjA6ICAyMDQ1IDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcKLQkweDAwNzA6ICAyZDY0IDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQKLQkweDAwODA6ICA2NTNiIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQKLQkweDAwOTA6ICAzMTJkIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAKLQkweDAwYTA6ICAzMTMzIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAKLQkweDAwYjA6ICA3NDNhIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUKLQkweDAwYzA6ICA2ZTYzIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEKLQkweDAwZDA6ICA2MzYzIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAKLQkweDAwZTA6ICA2NTZlIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAKLQkweDAwZjA6ICA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhCi0yMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICA0NTAwIDAwMzQgMWZlNCA0MDAwIDQwMDYgMWNkZSA3ZjAwIDAwMDEKLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkKLQkweDAwMjA6ICA4MDEwIDIwMDAgMzcwMyAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTgKLQkweDAwMzA6ICA0ZGRjIDkyMTcKLTIzOjU3OjM1Ljk0MTIzMiBJUCAxMjcuMC4wLjEuODAgPiAxMjcuMC4wLjEuNTU5MjA6IFAgMTo1NTYwKDU1NTkpIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICA0NTAwIDE1ZWIgMWZlNiA0MDAwIDQwMDYgMDcyNSA3ZjAwIDAwMDEKLQkweDAwMTA6ICA3ZjAwIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMiAzNzU4IDhhNDkKLQkweDAwMjA6ICA4MDE4IDIwMDAgMTNlMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTkKLQkweDAwMzA6ICA0ZGRjIDkyMTcgNDg1NCA1NDUwIDJmMzEgMmUzMSAyMDMyIDMwMzAKLQkweDAwNDA6ICAyMDRmIDRiMGQgMGE0NCA2MTc0IDY1M2EgMjA1NyA2NTY0IDJjMjAKLQkweDAwNTA6ICAzMDM2IDIwNGEgNzU2YyAyMDMyIDMwMzAgMzUyMCAzMDMzIDNhMzUKLQkweDAwNjA6ICAzNzNhIDMzMzUgMjA0NyA0ZDU0IDBkMGEgNTM2NSA3Mjc2IDY1NzIKLQkweDAwNzA6ICAzYTIwIDQxNzAgNjE2MyA2ODY1IDJmMzEgMmUzMyAyZTMzIDMzMGQKLQkweDAwODA6ICAwYTRjIDYxNzMgNzQyZCA0ZDZmIDY0NjkgNjY2OSA2NTY0IDNhMjAKLQkweDAwOTA6ICA1Mzc1IDZlMmMgMjAzMSAzNTIwIDQxNzUgNjcyMCAzMjMwIDMwMzQKLQkweDAwYTA6ICAyMDMwIDMwM2EgMzQzMyAzYTM0IDMxMjAgNDc0ZCA1NDBkIDBhNDUKLQkweDAwYjA6ICA1NDYxIDY3M2EgMjAyMiAzNjY1IDM4MzAgNjYzMCAyZDMxIDM0MzgKLQkweDAwYzA6ICA2MTJkIDM0MzEgMzE2NSA2MjMxIDYyNjQgMjIwZCAwYTQxIDYzNjMKLQkweDAwZDA6ICA2NTcwIDc0MmQgNTI2MSA2ZTY3IDY1NzMgM2EyMCA2Mjc5IDc0NjUKLQkweDAwZTA6ICA3MzBkIDBhNDMgNmY2ZSA3NDY1IDZlNzQgMmQ0YyA2NTZlIDY3NzQKLQkweDAwZjA6ICA2ODNhIDIwMzUgMzIzNSAzODBkIDBhNGIgNjU2NSA3MDJkIDQxNmMKLQkweDAxMDA6ICA2OTc2IDY1M2EgMjA3NCA2OTZkIDY1NmYgNzU3NCAzZDMxIDM1MmMKLQkweDAxMTA6ICAyMDZkIDYxNzggM2QzMSAzMDMwIDBkMGEgNDM2ZiA2ZTZlIDY1NjMKLQkweDAxMjA6ICA3NDY5IDZmNmUgM2EyMCA0YjY1IDY1NzAgMmQ0MSA2YzY5IDc2NjUKLQkweDAxMzA6ICAwZDBhIDQzNmYgNmU3NCA2NTZlIDc0MmQgNTQ3OSA3MDY1IDNhMjAKLQkweDAxNDA6ICA3NDY1IDc4NzQgMmY2OCA3NDZkIDZjM2IgMjA2MyA2ODYxIDcyNzMKLQkweDAxNTA6ICA2NTc0IDNkNjkgNzM2ZiAyZDM4IDM4MzUgMzkyZCAzMTBkIDBhMGQKLQkweDAxNjA6ICAwYTNjIDIxNDQgNGY0MyA1NDU5IDUwNDUgMjA0OCA1NDRkIDRjMjAKLQkweDAxNzA6ICA1MDU1IDQyNGMgNDk0MyAyMDIyIDJkMmYgMmY1NyAzMzQzIDJmMmYKLQkweDAxODA6ICA0NDU0IDQ0MjAgNDg1NCA0ZDRjIDIwMzQgMmUzMCAzMTIwIDU0NzIKLQkweDAxOTA6ICA2MTZlIDczNjkgNzQ2OSA2ZjZlIDYxNmMgMmYyZiA0NTRlIDIyM2UKLQkweDAxYTA6ICAwYTNjIDQ4NTQgNGQ0YyAzZTBhIDNjNDggNDU0MSA0NDNlIDBhMjAKLQkweDAxYjA6ICAyMDIwIDNjNGQgNDU1NCA0MTIwIDQ4NTQgNTQ1MCAyZDQ1IDUxNTUKLQkweDAxYzA6ICA0OTU2IDNkMjIgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUKLQkweDAxZDA6ICAyMjIwIDQzNGYgNGU1NCA0NTRlIDU0M2QgMjI3NCA2NTc4IDc0MmYKLQkweDAxZTA6ICA2ODc0IDZkNmMgM2IyMCA2MzY4IDYxNzIgNzM2NSA3NDNkIDY5NzMKLQkweDAxZjA6ICA2ZjJkIDM4MzggMzUzOSAyZDMxIDIyM2UgMGEyMCAyMDIwIDNjNGQKLQkweDAyMDA6ICA0NTU0IDQxMjAgNGU0MSA0ZDQ1IDNkMjIgNDQ2NSA3MzYzIDcyNjkKLQkweDAyMTA6ICA3MDc0IDY5NmYgNmUyMiAyMDQzIDRmNGUgNTQ0NSA0ZTU0IDNkMjIKLQkweDAyMjA6ICA1NDY4IDY1MjAgNjk2ZSA2OTc0IDY5NjEgNmMyMCA2OTZlIDczNzQKLQkweDAyMzA6ICA2MTZjIDZjNjEgNzQ2OSA2ZjZlIDIwNmYgNjYyMCA0NDY1IDYyNjkKLQkweDAyNDA6ICA2MTZlIDIwNjEgNzA2MSA2MzY4IDY1MmUgMjIzZSAwYTIwIDIwMjAKLQkweDAyNTA6ICAzYzU0IDQ5NTQgNGM0NSAzZTUwIDZjNjEgNjM2NSA2ODZmIDZjNjQKLQkweDAyNjA6ICA2NTcyIDIwNzAgNjE2NyA2NTNjIDJmNTQgNDk1NCA0YzQ1IDNlMGEKLQkweDAyNzA6ICAzYzJmIDQ4NDUgNDE0NCAzZTBhIDNjNDIgNGY0NCA1OTIwIDU0NDUKLQkweDAyODA6ICA1ODU0IDNkMjIgMjMzMCAzMDMwIDMwMzAgMzAyMiAyMDQyIDQ3NDMKLQkweDAyOTA6ICA0ZjRjIDRmNTIgM2QyMiAyMzQ2IDQ2NDYgNDY0NiA0NjIyIDIwNGMKLQkweDAyYTA6ICA0OTRlIDRiM2QgMjIyMyAzMDMwIDMwMzAgNDU0NiAyMjIwIDU2NGMKLQkweDAyYjA6ICA0OTRlIDRiM2QgMjIyMyAzNTM1IDMxMzggMzg0MSAyMjIwIDQxNGMKLQkweDAyYzA6ICA0OTRlIDRiM2QgMjIyMyA0NjQ2IDMwMzAgMzAzMCAyMjNlIDBhMGEKLQkweDAyZDA6ICAzYzQ4IDMxM2UgNTA2YyA2MTYzIDY1NjggNmY2YyA2NDY1IDcyMjAKLQkweDAyZTA6ICA3MDYxIDY3NjUgM2MyZiA0ODMxIDNlMGEgM2M0OCAzMjNlIDQ5NjYKLQkweDAyZjA6ICAyMDc5IDZmNzUgMjA2MSA3MjY1IDIwNmEgNzU3MyA3NDIwIDYyNzIKLQkweDAzMDA6ICA2Zjc3IDczNjkgNmU2NyAyMDc0IDY4NjUgMjA3NyA2NTYyIDNjMmYKLQkweDAzMTA6ICA2ODMyIDNlMGEgMGEzYyA1MDNlIDU0NjggNjUyMCA2Zjc3IDZlNjUKLQkweDAzMjA6ICA3MjIwIDZmNjYgMjA3NCA2ODY5IDczMjAgNzc2NSA2MjIwIDczNjkKLQkweDAzMzA6ICA3NDY1IDIwNjggNjE3MyAyMDZlIDZmNzQgMjA3MCA3NTc0IDIwNzUKLQkweDAzNDA6ICA3MDIwIDYxNmUgNzkyMCA3NzY1IDYyMjAgNzA2MSA2NzY1IDczMjAKLQkweDAzNTA6ICA3OTY1IDc0MmUgMGE1MCA2YzY1IDYxNzMgNjUyMCA2MzZmIDZkNjUKLQkweDAzNjA6ICAyMDYyIDYxNjMgNmIyMCA2YzYxIDc0NjUgNzIyZSAzYzJmIDUwM2UKLQkweDAzNzA6ICAwYTBhIDNjNTAgM2UzYyA1MzRkIDQxNGMgNGMzZSAzYzQzIDQ5NTQKLQkweDAzODA6ICA0NTNlIDRkNmYgNzY2NSAyMDYxIDZjNmYgNmU2NyAyYzIwIDZlNmYKLQkweDAzOTA6ICA3NDY4IDY5NmUgNjcyMCA3NDZmIDIwNzMgNjU2NSAyMDY4IDY1NzIKLQkweDAzYTA6ICA2NTJlIDJlMmUgM2MyZiA0MzQ5IDU0NDUgM2UyMCAzYTJkIDI5M2MKLQkweDAzYjA6ICAyZjUzIDRkNDEgNGM0YyAzZTNjIDJmNTAgM2UwYSAwYTNjIDQ4MzIKLQkweDAzYzA6ICAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIgNjUyMCA3NDcyIDc5NjkKLQkweDAzZDA6ICA2ZTY3IDIwNzQgNmYyMCA2YzZmIDYzNjEgNzQ2NSAyMDc0IDY4NjUKLQkweDAzZTA6ICAyMDYxIDY0NmQgNjk2ZSA2OTczIDc0NzIgNjE3NCA2ZjcyIDIwNmYKLQkweDAzZjA6ICA2NjIwIDc0NjggNjk3MyAyMDZkIDYxNjMgNjg2OSA2ZTY1IDNjMmYKLQkweDA0MDA6ICA0ODMyIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNzcKLQkweDA0MTA6ICA2MTZlIDc0MjAgNzQ2ZiAyMDcyIDY1NzAgNmY3MiA3NDIwIDczNmYKLQkweDA0MjA6ICA2ZDY1IDc0NjggNjk2ZSA2NzIwIDYxNjIgNmY3NSA3NDIwIDc0NjgKLQkweDA0MzA6ICA2OTczIDIwNjggNmY3MyA3NDI3IDczMjAgNjI2NSA2ODYxIDc2NjkKLQkweDA0NDA6ICA2ZjcyIDJjMjAgNzA2YyA2NTYxIDczNjUgMGE2MyA2ZjZlIDc0NjEKLQkweDA0NTA6ICA2Mzc0IDIwNzQgNjg2NSAyMDQ5IDZlNzQgNjU3MiA2ZTY1IDc0MjAKLQkweDA0NjA6ICA1MzY1IDcyNzYgNjk2MyA2NTIwIDUwNzIgNmY3NiA2OTY0IDY1NzIKLQkweDA0NzA6ICAyMDI4IDQ5NTMgNTAyOSAyMDY5IDZlNzYgNmY2YyA3NjY1IDY0MjAKLQkweDA0ODA6ICA2NDY5IDcyNjUgNjM3NCA2Yzc5IDJlM2MgMmY1MCAzZTBhIDBhM2MKLQkweDA0OTA6ICA1MDNlIDUzNjUgNjUyMCA3NDY4IDY1MjAgM2M0MSAyMDY4IDcyNjUKLQkweDA0YTA6ICA2NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlIDYxNjIKLQkweDA0YjA6ICA3NTczIDY1MmUgNmU2NSA3NDJmIDIyM2UgNGU2NSA3NDc3IDZmNzIKLQkweDA0YzA6ICA2YjIwIDQxNjIgNzU3MyA2NTBhIDQzNmMgNjU2MSA3MjY5IDZlNjcKLQkweDA0ZDA6ICA2ODZmIDc1NzMgNjUzYyAyZjQxIDNlMjAgNjY2ZiA3MjIwIDY4NmYKLQkweDA0ZTA6ICA3NzIwIDc0NmYgMjA2NCA2ZjIwIDc0NjggNjk3MyAyZTNjIDJmNTAKLQkweDA0ZjA6ICAzZTBhIDBhM2MgNDgzMiAzZTQ5IDY2MjAgNzk2ZiA3NTIwIDYxNzIKLQkweDA1MDA6ICA2NTIwIDc0NjggNjUyMCA2MTY0IDZkNjkgNmU2OSA3Mzc0IDcyNjEKLQkweDA1MTA6ICA3NDZmIDcyMjAgNmY2NiAyMDc0IDY4NjkgNzMyMCA2ZDYxIDYzNjgKLQkweDA1MjA6ICA2OTZlIDY1M2MgMmY0OCAzMjNlIDBhMGEgM2M1MCAzZTU0IDY4NjUKLQkweDA1MzA6ICAyMDY5IDZlNjkgNzQ2OSA2MTZjIDIwNjkgNmU3MyA3NDYxIDZjNmMKLQkweDA1NDA6ICA2MTc0IDY5NmYgNmUyMCA2ZjY2IDIwM2MgNDEyMCA2ODcyIDY1NjYKLQkweDA1NTA6ICAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIKLQkweDA1NjA6ICA2OTYxIDZlMmUgNmY3MiA2NzJmIDIyM2UgNDQ2NSA2MjY5IDYxNmUKLQkweDA1NzA6ICAyNzczIDBhNjEgNzA2MSA2MzY4IDY1M2MgMmY0MSAzZTIwIDc3NjUKLQkweDA1ODA6ICA2MjIwIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUKLQkweDA1OTA6ICAyMDc3IDYxNzMgMjA3MyA3NTYzIDYzNjUgNzM3MyA2Njc1IDZjMmUKLQkweDA1YTA6ICAzYzJmIDUwM2UgMGEwYSAzYzUwIDNlM2MgNTM1NCA1MjRmIDRlNDcKLQkweDA1YjA6ICAzZTU5IDZmNzUgMjA3MyA2ODZmIDc1NmMgNjQyMCA3MjY1IDcwNmMKLQkweDA1YzA6ICA2MTYzIDY1MjAgNzQ2OCA2OTczIDIwNzAgNjE2NyA2NTIwIDc3NjkKLQkweDA1ZDA6ICA3NDY4IDIwNzkgNmY3NSA3MjIwIDZmNzcgNmUyMCA3NzY1IDYyMjAKLQkweDA1ZTA6ICA3MDYxIDY3NjUgNzMyMCA2MTczIDBhNzMgNmY2ZiA2ZTIwIDYxNzMKLQkweDA1ZjA6ICAyMDcwIDZmNzMgNzM2OSA2MjZjIDY1MmUgM2MyZiA1MzU0IDUyNGYKLQkweDA2MDA6ICA0ZTQ3IDNlM2MgMmY1MCAzZTBhIDBhM2MgNTAzZSA1NTZlIDZjNjUKLQkweDA2MTA6ICA3MzczIDIwNzkgNmY3NSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjkKLQkweDA2MjA6ICA3NDczIDIwNjMgNmY2ZSA2NjY5IDY3NzUgNzI2MSA3NDY5IDZmNmUKLQkweDA2MzA6ICAyYzIwIDc5NmYgNzU3MiAyMDZlIDY1NzcgMjA3MyA2NTcyIDc2NjUKLQkweDA2NDA6ICA3MjIwIDY5NzMgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjY1IDY0MjAKLQkweDA2NTA6ICA2MTczIDIwNjYgNmY2YyA2YzZmIDc3NzMgM2EwYSAzYzU1IDRjM2UKLQkweDA2NjA6ICAwYTNjIDRjNDkgM2UwYSA0MzZmIDZlNjYgNjk2NyA3NTcyIDYxNzQKLQkweDA2NzA6ICA2OTZmIDZlMjAgNjY2OSA2YzY1IDczMjAgNjM2MSA2ZTIwIDYyNjUKLQkweDA2ODA6ICAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNjUKLQkweDA2OTA6ICA3NDYzIDJmNjEgNzA2MSA2MzY4IDY1M2MgMmY1NCA1NDNlIDJlM2MKLQkweDA2YTA6ICAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MKLQkweDA2YjA6ICA1NDU0IDNlNDQgNmY2MyA3NTZkIDY1NmUgNzQ1MiA2ZjZmIDc0M2MKLQkweDA2YzA6ICAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMgNjgyMCA2OTczIDIwNzQKLQkweDA2ZDA6ICA2ODY1IDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDc1IDZlNjQKLQkweDA2ZTA6ICA2NTcyIDIwNzcgNjg2OSA2MzY4IDIwNjEgNmM2YyAyMDc5IDZmNzUKLQkweDA2ZjA6ICA3MjBhIDQ4NTQgNGQ0YyAyMDY2IDY5NmMgNjU3MyAyMDczIDY4NmYKLQkweDA3MDA6ICA3NTZjIDY0MjAgNjU3OCA2OTczIDc0MmMgMjA2OSA3MzIwIDczNjUKLQkweDA3MTA6ICA3NDIwIDc0NmYgMjAzYyA1NDU0IDNlMmYgNzY2MSA3MjJmIDc3NzcKLQkweDA3MjA6ICA3NzNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMKLQkweDA3MzA6ICA0OTNlIDBhNDMgNDc0OSAyMDczIDYzNzIgNjk3MCA3NDczIDIwNjEKLQkweDA3NDA6ICA3MjY1IDIwNmMgNmY2ZiA2YjY1IDY0MjAgNjY2ZiA3MjIwIDY5NmUKLQkweDA3NTA6ICAyMDNjIDU0NTQgM2UyZiA3NTczIDcyMmYgNmM2OSA2MjJmIDYzNjcKLQkweDA3NjA6ICA2OTJkIDYyNjkgNmUzYyAyZjU0IDU0M2UgMmMyMCA3NzY4IDY5NjMKLQkweDA3NzA6ICA2ODIwIDY5NzMgMjA3NyA2ODY1IDcyNjUgMGE0NCA2NTYyIDY5NjEKLQkweDA3ODA6ICA2ZTIwIDcwNjEgNjM2YiA2MTY3IDY1NzMgMjA3NyA2OTZjIDZjMjAKLQkweDA3OTA6ICA3MDZjIDYxNjMgNjUyMCA3NDY4IDY1NjkgNzIyMCA3MzYzIDcyNjkKLQkweDA3YTA6ICA3MDc0IDczMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEKLQkweDA3YjA6ICA0YzZmIDY3MjAgNjY2OSA2YzY1IDczMjAgNjE3MiA2NTIwIDcwNmMKLQkweDA3YzA6ICA2MTYzIDY1NjQgMjA2OSA2ZTIwIDNjNTQgNTQzZSAyZjc2IDYxNzIKLQkweDA3ZDA6ICAyZjZjIDZmNjcgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UKLQkweDA3ZTA6ICAyYzIwIDYxNmUgNjQyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDcyNmYKLQkweDA3ZjA6ICA3NDYxIDc0NjUgNjQwYSA3NzY1IDY1NmIgNmM3OSAyZTIwIDIwNTQKLQkweDA4MDA6ICA2ODY1IDIwNjYgNzI2NSA3MTc1IDY1NmUgNjM3OSAyMDZmIDY2MjAKLQkweDA4MTA6ICA3MjZmIDc0NjEgNzQ2OSA2ZjZlIDIwNjMgNjE2ZSAyMDYyIDY1MjAKLQkweDA4MjA6ICA2NTYxIDczNjkgNmM3OSAyMDYzIDY4NjEgNmU2NyA2NTY0IDIwNjIKLQkweDA4MzA6ICA3OTIwIDY1NjQgNjk3NCA2OTZlIDY3MGEgM2M1NCA1NDNlIDJmNjUKLQkweDA4NDA6ICA3NDYzIDJmNmMgNmY2NyA3MjZmIDc0NjEgNzQ2NSAyZTY0IDJmNjEKLQkweDA4NTA6ICA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjIDQ5M2UKLQkweDA4NjA6ICAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjA2NCA2NTY2IDYxNzUKLQkweDA4NzA6ICA2Yzc0IDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDY5IDZlNjQKLQkweDA4ODA6ICA2NTc4IDIwNjkgNzMyMCAzYzU0IDU0M2UgNjk2ZSA2NDY1IDc4MmUKLQkweDA4OTA6ICA2ODc0IDZkNmMgM2MyZiA1NDU0IDNlMmMgMjA2ZCA2NTYxIDZlNjkKLQkweDA4YTA6ICA2ZTY3IDIwNzQgNjg2MSA3NDIwIDcyNjUgNzE3NSA2NTczIDc0NzMKLQkweDA4YjA6ICAwYTY2IDZmNzIgMjA2MSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkKLQkweDA4YzA6ICAyMDNjIDU0NTQgM2UyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDNjMmYKLQkweDA4ZDA6ICA1NDU0IDNlMjAgNzc2OSA2YzZjIDIwNjcgNjk3NiA2NTIwIDc0NjgKLQkweDA4ZTA6ICA2NTIwIDYzNmYgNmU3NCA2NTZlIDc0NzMgMjA2ZiA2NjIwIDc0NjgKLQkweDA4ZjA6ICA2NTIwIDY2NjkgNmM2NSAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYKLQkweDA5MDA6ICA3Nzc3IDc3MmYgNjY2ZiA2ZjJmIDYyNjEgNzIyZiA2OTZlIDY0NjUKLQkweDA5MTA6ICA3ODJlIDY4NzQgNmQ2YyAzYzJmIDU0NTQgM2UwYSA2OTY2IDIwNjkKLQkweDA5MjA6ICA3NDIwIDY1NzggNjk3MyA3NDczIDIwMjggNjE3MyA3Mzc1IDZkNjkKLQkweDA5MzA6ICA2ZTY3IDIwNzQgNjg2MSA3NDIwIDNjNTQgNTQzZSAyZjc2IDYxNzIKLQkweDA5NDA6ICAyZjc3IDc3NzcgM2MyZiA1NDU0IDNlMjAgNjk3MyAyMDc5IDZmNzUKLQkweDA5NTA6ICA3MjIwIDNjNTQgNTQzZSA0NDZmIDYzNzUgNmQ2NSA2ZTc0IDUyNmYKLQkweDA5NjA6ICA2Zjc0IDNjMmYgNTQ1NCAzZTI5IDJlM2MgMmY0YyA0OTNlIDBhMGEKLQkweDA5NzA6ICAzYzRjIDQ5M2UgMGE1NSA3MzY1IDcyMjAgNjQ2OSA3MjY1IDYzNzQKLQkweDA5ODA6ICA2ZjcyIDY5NjUgNzMyMCA2MTcyIDY1MjAgNjU2ZSA2MTYyIDZjNjUKLQkweDA5OTA6ICA2NDJjIDIwNjEgNmU2NCAyMDc1IDczNjUgNzIyMCA2NDZmIDYzNzUKLQkweDA5YTA6ICA2ZDY1IDZlNzQgNzMyMCA3NzY5IDZjNmMgMjA2MiA2NTIwIDZjNmYKLQkweDA5YjA6ICA2ZjZiIDY1NjQgMjA2NiA2ZjcyIDBhNjkgNmUyMCA3NDY4IDY1MjAKLQkweDA5YzA6ICAzYzU0IDU0M2UgNzA3NSA2MjZjIDY5NjMgNWY2OCA3NDZkIDZjM2MKLQkweDA5ZDA6ICAyZjU0IDU0M2UgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNmYKLQkweDA5ZTA6ICA2NjIwIDc0NjggNjUyMCA3NTczIDY1NzIgNzMyNyAyMDY4IDZmNmQKLQkweDA5ZjA6ICA2NTczIDJlMjAgMjA1NCA2ODY1IDczNjUgMjA2NCA2OTcyIDczMGEKLQkweDBhMDA6ICA3MzY4IDZmNzUgNmM2NCAyMDYyIDY1MjAgNzU2ZSA2NDY1IDcyMjAKLQkweDBhMTA6ICAzYzU0IDU0M2UgMmY2OCA2ZjZkIDY1M2MgMmY1NCA1NDNlIDJjMjAKLQkweDBhMjA6ICA2MTZlIDY0MjAgNzU3MyA2NTcyIDczMjAgNzc2OSA2YzZjIDIwNmUKLQkweDBhMzA6ICA2Zjc0IDIwNjIgNjUyMCA2MTYyIDZjNjUgMjA3NCA2ZjIwIDczNzkKLQkweDBhNDA6ICA2ZDZjIDY5NmUgNmIwYSA3NDZmIDIwNjYgNjk2YyA2NTczIDIwNzQKLQkweDBhNTA6ICA2ODY1IDc5MjAgNjQ2ZiA2ZTI3IDc0MjAgNmY3NyA2ZTJlIDNjMmYKLQkweDBhNjA6ICA0YzQ5IDNlMGEgMGEzYyAyZjU1IDRjM2UgMGE0MSA2YzZjIDIwNzQKLQkweDBhNzA6ICA2ODY1IDIwNzMgNzQ2MSA2ZTY0IDYxNzIgNjQyMCA2MTcwIDYxNjMKLQkweDBhODA6ICA2ODY1IDIwNmQgNmY2NCA3NTZjIDY1NzMgMjA2MSA3MjY1IDIwNjEKLQkweDBhOTA6ICA3NjYxIDY5NmMgNjE2MiA2YzY1IDIwNzcgNjk3NCA2ODIwIDc0NjgKLQkweDBhYTA6ICA2OTczIDIwNzIgNjU2YyA2NTYxIDczNjUgMjA2MSA2ZTY0IDIwNjEKLQkweDBhYjA6ICA3MjY1IDBhNmUgNmY3NyAyMDZkIDYxNmUgNjE2NyA2NTY0IDIwNzcKLQkweDBhYzA6ICA2OTc0IDY4MjAgNjQ2NSA2MjYzIDZmNmUgNjYyZSAyMDIwIDU0NzkKLQkweDBhZDA6ICA3MDY1IDIwM2MgNTQ1NCAzZTY0IDcwNmIgNjcyZCA3MjY1IDYzNmYKLQkweDBhZTA6ICA2ZTY2IDY5NjcgNzU3MiA2NTIwIDYxNzAgNjE2MyA2ODY1IDNjMmYKLQkweDBhZjA6ICA1NDU0IDNlMjAgNzQ2ZiAwYTczIDY1NmMgNjU2MyA3NDIwIDc3NjgKLQkweDBiMDA6ICA2OTYzIDY4MjAgNmQ2ZiA2NDc1IDZjNjUgNzMyMCA3OTZmIDc1MjAKLQkweDBiMTA6ICA3NzYxIDZlNzQgMjA2NSA2ZTYxIDYyNmMgNjU2NCAyZTIwIDIwNGQKLQkweDBiMjA6ICA2MTZlIDc5MjAgNmY3NCA2ODY1IDcyMjAgNmQ2ZiA2NDc1IDZjNjUKLQkweDBiMzA6ICA3MzIwIDYxNzIgNjUyMCA2MTc2IDYxNjkgNmM2MSA2MjZjIDY1MGEKLQkweDBiNDA6ICA3NDY4IDcyNmYgNzU2NyA2ODIwIDc0NjggNjUyMCA0NDY1IDYyNjkKLQkweDBiNTA6ICA2MTZlIDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3MyA3OTczIDc0NjUKLQkweDBiNjA6ICA2ZDIwIDc3NjkgNzQ2OCAyMDc0IDY4NjUgMjA2ZSA2MTZkIDY1NzMKLQkweDBiNzA6ICAyMDNjIDU0NTQgM2U2YyA2OTYyIDYxNzAgNjE2MyA2ODY1IDJkNmQKLQkweDBiODA6ICA2ZjY0IDJkMmEgM2MyZiA1NDU0IDNlMmUgMGE0OSA2NjIwIDc5NmYKLQkweDBiOTA6ICA3NTIwIDZlNjUgNjU2NCAyMDc0IDZmMjAgNjM2ZiA2ZDcwIDY5NmMKLQkweDBiYTA6ICA2NTIwIDYxMjAgNmQ2ZiA2NDc1IDZjNjUgMjA3OSA2Zjc1IDcyNzMKLQkweDBiYjA6ICA2NTZjIDY2MmMgMjA3OSA2Zjc1IDIwNzcgNjk2YyA2YzIwIDZlNjUKLQkweDBiYzA6ICA2NTY0IDIwNzQgNmYyMCA2OTZlIDczNzQgNjE2YyA2YzIwIDc0NjgKLQkweDBiZDA6ICA2NTBhIDNjNTQgNTQzZSA2MTcwIDYxNjMgNjg2NSAyZDY0IDY1NzYKLQkweDBiZTA6ICAzYzJmIDU0NTQgM2UyMCA3MDYxIDYzNmIgNjE2NyA2NTJlIDBhMGEKLQkweDBiZjA6ICAzYzUwIDNlNGQgNmY3MiA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQKLQkweDBjMDA6ICA2MTc0IDY5NmYgNmUyMCA2ZjZlIDIwNDEgNzA2MSA2MzY4IDY1MjAKLQkweDBjMTA6ICA2MzYxIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDZmIDZlM2EKLQkweDBjMjA6ICAwYTNjIDU1NGMgM2UwYSAzYzRjIDQ5M2UgMGE1NCA2ODY1IDIwM2MKLQkweDBjMzA6ICA0MTIwIDQ4NTIgNDU0NiAzZDIyIDJmNjQgNmY2MyAyZjYxIDcwNjEKLQkweDBjNDA6ICA2MzY4IDY1MmQgNjQ2ZiA2MzJmIDZkNjEgNmU3NSA2MTZjIDJmMjIKLQkweDBjNTA6ICAzZTQxIDcwNjEgNjM2OCA2NTIwIDY0NmYgNjM3NSA2ZDY1IDZlNzQKLQkweDBjNjA6ICA2MTc0IDY5NmYgNmUzYyAyZjQxIDNlMjAgNzM3NCA2ZjcyIDY1NjQKLQkweDBjNzA6ICAyMDZmIDZlMjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMmUKLQkweDBjODA6ICAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAKLQkweDBjOTA6ICAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYKLQkweDBjYTA6ICA3Nzc3IDc3MmUgNjE3MCA2MTYzIDY4NjUgMmU2ZiA3MjY3IDJmMjIKLQkweDBjYjA6ICAzZTQxIDcwNjEgNjM2OCA2NTIwIDUwNzIgNmY2YSA2NTYzIDc0M2MKLQkweDBjYzA6ICAyZjQxIDNlMjAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYKLQkweDBjZDA6ICA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEKLQkweDBjZTA6ICAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcKLQkweDBjZjA6ICA3NzJlIDYxNzAgNjE2MyA2ODY1IDJkNzMgNzM2YyAyZTZmIDcyNjcKLQkweDBkMDA6ICAyZjIyIDNlNDEgNzA2MSA2MzY4IDY1MmQgNTM1MyA0YzNjIDJmNDEKLQkweDBkMTA6ICAzZTIwIDY4NmYgNmQ2NSAyMDczIDY5NzQgNjUyZSAzYzJmIDRjNDkKLQkweDBkMjA6ICAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxIDIwNDgKLQkweDBkMzA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3MDY1IDcyNmMKLQkweDBkNDA6ICAyZTYxIDcwNjEgNjM2OCA2NTJlIDZmNzIgNjcyZiAyMjNlIDZkNmYKLQkweDBkNTA6ICA2NDIwIDcwNjUgNzI2YyAzYzJmIDQxM2UgMjA2OCA2ZjZkIDY1MjAKLQkweDBkNjA6ICA3MzY5IDc0NjUgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjIDQ5M2UKLQkweDBkNzA6ICAwYTU0IDY4NjUgMjAzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQKLQkweDBkODA6ICA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjEgNzA2MSA2MzY4IDY1NzcKLQkweDBkOTA6ICA2NTY1IDZiMmUgNjM2ZiA2ZDJmIDIyM2UgNDE3MCA2MTYzIDY4NjUKLQkweDBkYTA6ICA1NzY1IDY1NmIgM2MyZiA0MTNlIDIwNmUgNjU3NyA3MzZjIDY1NzQKLQkweDBkYjA6ICA3NDY1IDcyMmUgM2MyZiA0YzQ5IDNlMGEgMGEzYyA0YzQ5IDNlMGEKLQkweDBkYzA6ICA1NDY4IDY1MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQKLQkweDBkZDA6ICA3MDNhIDJmMmYgNzc3NyA3NzJlIDY0NjUgNjI2OSA2MTZlIDJlNmYKLQkweDBkZTA6ICA3MjY3IDJmNjQgNmY2MyAyZjIyIDNlNDQgNjU2MiA2OTYxIDZlMjAKLQkweDBkZjA6ICA1MDcyIDZmNmEgNjU2MyA3NDBhIDQ0NmYgNjM3NSA2ZDY1IDZlNzQKLQkweDBlMDA6ICA2MTc0IDY5NmYgNmUzYyAyZjQxIDNlMjAgNzc2OCA2OTYzIDY4MjAKLQkweDBlMTA6ICA2MzZmIDZlNzQgNjE2OSA2ZTczIDIwNDggNGY1NyA1NDRmIDczMmMKLQkweDBlMjA6ICAyMDQ2IDQxNTEgNzMyYyAyMDYxIDZlNjQgMjA3MyA2ZjY2IDc0NzcKLQkweDBlMzA6ICA2MTcyIDY1MjAgNzU3MCA2NDYxIDc0NjUgNzMyZSAzYzJmIDRjNDkKLQkweDBlNDA6ICAzZTBhIDNjMmYgNTU0YyAzZTBhIDBhM2MgNTAzZSA1OTZmIDc1MjAKLQkweDBlNTA6ICA2MzYxIDZlMjAgNjE2YyA3MzZmIDIwNjMgNmY2ZSA3Mzc1IDZjNzQKLQkweDBlNjA6ICAyMDc0IDY4NjUgMjA2YyA2OTczIDc0MjAgNmY2NiAyMDNjIDQxMjAKLQkweDBlNzA6ICA0ODUyIDQ1NDYgM2QyMiA2ODc0IDc0NzAgM2EyZiAyZjc3IDc3NzcKLQkweDBlODA6ICAyZTYyIDZmNzUgNzQ2NSA2YzZjIDJlNjMgNmY2ZCAyZjY2IDYxNzEKLQkweDBlOTA6ICAyZjIyIDNlNTcgNmY3MiA2YzY0IDBhNTcgNjk2NCA2NTIwIDU3NjUKLQkweDBlYTA6ICA2MjIwIDQ2NzIgNjU3MSA3NTY1IDZlNzQgNmM3OSAyMDQxIDczNmIKLQkweDBlYjA6ICA2NTY0IDIwNTEgNzU2NSA3Mzc0IDY5NmYgNmU3MyAzYzJmIDQxM2UKLQkweDBlYzA6ICAyMDY2IDZmNzIgMjA2OSA2ZTY2IDZmNzIgNmQ2MSA3NDY5IDZmNmUKLQkweDBlZDA6ICAyZTBhIDBhM2MgNDgzMiAzZTRjIDY1NzQgMjA2ZiA3NDY4IDY1NzIKLQkweDBlZTA6ICAyMDcwIDY1NmYgNzA2YyA2NTIwIDZiNmUgNmY3NyAyMDYxIDYyNmYKLQkweDBlZjA6ICA3NTc0IDIwNzQgNjg2OSA3MzIwIDczNjUgNzI3NiA2NTcyIDNjMmYKLQkweDBmMDA6ICA0ODMyIDNlMGEgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQKLQkweDBmMTA6ICA3NDcwIDNhMmYgMmY2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYKLQkweDBmMjA6ICA2ZDJmIDIyM2UgNGU2NSA3NDYzIDcyNjEgNjY3NCAzYzJmIDQxM2UKLQkweDBmMzA6ICAyMDcwIDcyNmYgNzY2OSA2NDY1IDczMjAgNjE2ZSAyMDY5IDZlNzQKLQkweDBmNDA6ICA2NTcyIDY1NzMgNzQ2OSA2ZTY3IDIwNjYgNzI2NSA2NTBhIDczNjUKLQkweDBmNTA6ICA3Mjc2IDY5NjMgNjUyMCA2NjZmIDcyMjAgNzc2NSA2MjIwIDczNjkKLQkweDBmNjA6ICA3NDY1IDIwNmQgNmY2ZSA2OTc0IDZmNzIgNjk2ZSA2NzIwIDYxNmUKLQkweDBmNzA6ICA2NDIwIDczNzQgNjE3NCA2OTczIDc0NjkgNjMyMCA2MzZmIDZjNmMKLQkweDBmODA6ICA2NTYzIDc0NjkgNmY2ZSAyZTBhIDU5NmYgNzUyMCA2MzYxIDZlMjAKLQkweDBmOTA6ICA2YzY1IDc0MjAgNzQ2OCA2NTZkIDIwNmIgNmU2ZiA3NzIwIDYxNjIKLQkweDBmYTA6ICA2Zjc1IDc0MjAgNzk2ZiA3NTcyIDIwNzMgNjU3MiA3NjY1IDcyMjAKLQkweDBmYjA6ICA3NTczIDY5NmUgNjcyMCA3NDY4IDY1NjkgNzIwYSAzYzQxIDIwNDgKLQkweDBmYzA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3NTcwIDc0NjkKLQkweDBmZDA6ICA2ZDY1IDJlNmUgNjU3NCA2MzcyIDYxNjYgNzQyZSA2MzZmIDZkMmYKLQkweDBmZTA6ICAyMjNlIDY5NmUgNzQ2NSA3MjY2IDYxNjMgNjUzYyAyZjQxIDNlMmUKLQkweDBmZjA6ICAwYTQ1IDZlNjEgNjI2YyA2OTZlIDY3MjAgNzQ2OCA2NTIwIDZkNmYKLQkweDEwMDA6ICA2ZTY5IDc0NmYgNzI2OSA2ZTY3IDIwNmYgNjYyMCA3OTZmIDc1NzIKLQkweDEwMTA6ICAyMDczIDY1NzIgNzY2NSA3MjIwIDc3NjkgNmM2YyAyMDcwIDcyNmYKLQkweDEwMjA6ICA3NjY5IDY0NjUgMjA2MSAyMDYyIDY1NzQgNzQ2NSA3MjIwIDY3NmMKLQkweDEwMzA6ICA2ZjYyIDYxNmMgMjA2ZiA3NjY1IDcyNzYgNjk2NSA3NzBhIDZmNjYKLQkweDEwNDA6ICAyMDc3IDY4NmYgMjA2OSA3MzIwIDc1NzMgNjk2ZSA2NzIwIDc3NjgKLQkweDEwNTA6ICA2MTc0IDIwNjEgNmU2NCAyMDc3IDY4NjUgNzI2NSAyYzIwIDYxNmUKLQkweDEwNjA6ICA2NDIwIDY5NzQgMjA3NyA2Zjc1IDZjNjQgMjA2NyA2OTc2IDY1MjAKLQkweDEwNzA6ICA0NDY1IDYyNjkgNjE2ZSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMGEKLQkweDEwODA6ICA2Zjc2IDY1NzIgNzY2OSA2NTc3IDIwNmYgNjYyMCA3NDY4IDY1MjAKLQkweDEwOTA6ICA2MTcwIDYxNjMgNjg2NSAyMDcwIDYxNjMgNmI2MSA2NzY1IDIwNzUKLQkweDEwYTA6ICA3MzYxIDY3NjUgMmUwYSAwYTNjIDQ4MzIgM2U0MSA2MjZmIDc1NzQKLQkweDEwYjA6ICAyMDc0IDY4NjkgNzMyMCA3MDYxIDY3NjUgM2MyZiA0ODMyIDNlMGEKLQkweDEwYzA6ICAwYTNjIDQ5NGQgNDcyMCA0MTRjIDQ5NDcgNGUzZCAyMjcyIDY5NjcKLQkweDEwZDA6ICA2ODc0IDIyMjAgNDE0YyA1NDNkIDIyMjIgMjA0OCA0NTQ5IDQ3NDgKLQkweDEwZTA6ICA1NDNkIDIyMzIgMzQzNyAyMjIwIDU3NDkgNDQ1NCA0ODNkIDIyMzIKLQkweDEwZjA6ICAzNzM4IDIyMjAgNTM1MiA0MzNkIDIyNjkgNjM2ZiA2ZTczIDJmNmEKLQkweDExMDA6ICA2ODY1IDMwMzYgMzEyZSA3MDZlIDY3MjIgM2UwYSAwYTNjIDUwM2UKLQkweDExMTA6ICA1NDY4IDY5NzMgMjA2OSA3MzIwIDYxMjAgNzA2YyA2MTYzIDY1NjgKLQkweDExMjA6ICA2ZjZjIDY0NjUgNzIyMCA3MDYxIDY3NjUgMjA2OSA2ZTczIDc0NjEKLQkweDExMzA6ICA2YzZjIDY1NjQgMjA2MiA3OTIwIDc0NjggNjUyMCAzYzQxIDBhNDgKLQkweDExNDA6ICA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUKLQkweDExNTA6ICA2NDY1IDYyNjkgNjE2ZSAyZTZmIDcyNjcgMmYyMiAzZTQ0IDY1NjIKLQkweDExNjA6ICA2OTYxIDZlM2MgMmY0MSAzZTBhIDcyNjUgNmM2NSA2MTczIDY1MjAKLQkweDExNzA6ICA2ZjY2IDIwNzQgNjg2NSAyMDYxIDcwNjEgNjM2OCA2NTIwIDU3NjUKLQkweDExODA6ICA2MjIwIDczNjUgNzI3NiA2NTcyIDIwNzAgNjE2MyA2YjYxIDY3NjUKLQkweDExOTA6ICAyZTBhIDBhM2MgNTAzZSA1NDY4IDY5NzMgMjA2MyA2ZjZkIDcwNzUKLQkweDExYTA6ICA3NDY1IDcyMjAgNjg2MSA3MzIwIDY5NmUgNzM3NCA2MTZjIDZjNjUKLQkweDExYjA6ICA2NDIwIDc0NjggNjUyMCA0NDY1IDYyNjkgNjE2ZSAyMDQ3IDRlNTUKLQkweDExYzA6ICAyZjRjIDY5NmUgNzU3OCAyMDZmIDcwNjUgNzI2MSA3NDY5IDZlNjcKLQkweDExZDA6ICAyMDczIDc5NzMgNzQ2NSA2ZDJjIDBhNjIgNzU3NCAyMDY5IDc0MjAKLQkweDExZTA6ICA2ODYxIDczMjAgM2M3MyA3NDcyIDZmNmUgNjczZSA2ZTZmIDc0NjgKLQkweDExZjA6ICA2OTZlIDY3MjAgNzQ2ZiAyMDY0IDZmMjAgNzc2OSA3NDY4IDIwNzQKLQkweDEyMDA6ICA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhIDY1NjMKLQkweDEyMTA6ICA3NDNjIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMmUyMCA1MDZjIDY1NjEKLQkweDEyMjA6ICA3MzY1IDIwNjQgNmYyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYKLQkweDEyMzA6ICA3NDNjIDJmNzMgNzQ3MiA2ZjZlIDY3M2UgMjA2MyA2ZjZlIDc0NjEKLQkweDEyNDA6ICA2Mzc0IDIwNzQgNjg2NSAyMDQ0IDY1NjIgNjk2MSA2ZTBhIDUwNzIKLQkweDEyNTA6ICA2ZjZhIDY1NjMgNzQyMCA2MTYyIDZmNzUgNzQyMCA2OTc0IDJlM2MKLQkweDEyNjA6ICAyZjUwIDNlMGEgMGEzYyA1MDNlIDQ5NjYgMjA3OSA2Zjc1IDIwNjYKLQkweDEyNzA6ICA2OTZlIDY0MjAgNjEyMCA2Mjc1IDY3MjAgNjk2ZSAyMDc0IDY4NjkKLQkweDEyODA6ICA3MzIwIDYxNzAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUKLQkweDEyOTA6ICAyYzIwIDZmNzIgMjA2OSA2ZTIwIDQxNzAgNjE2MyA2ODY1IDIwNjkKLQkweDEyYTA6ICA3NDczIDY1NmMgNjYyYyAwYTcwIDZjNjUgNjE3MyA2NTIwIDY2NjkKLQkweDEyYjA6ICA2YzY1IDIwNjEgMjA2MiA3NTY3IDIwNzIgNjU3MCA2ZjcyIDc0MjAKLQkweDEyYzA6ICA2ZjZlIDIwNjkgNzQyZSAyMDIwIDQ5NmUgNzM3NCA3Mjc1IDYzNzQKLQkweDEyZDA6ICA2OTZmIDZlNzMgMjA2ZiA2ZTIwIDY0NmYgNjk2ZSA2NzIwIDc0NjgKLQkweDEyZTA6ICA2OTczIDJjMjAgNjE2ZSA2NDIwIDc0NjggNjUwYSA2YzY5IDczNzQKLQkweDEyZjA6ICAyMDZmIDY2MjAgM2M0MSAyMDQ4IDUyNDUgNDYzZCAyMjY4IDc0NzQKLQkweDEzMDA6ICA3MDNhIDJmMmYgNjI3NSA2NzczIDJlNjQgNjU2MiA2OTYxIDZlMmUKLQkweDEzMTA6ICA2ZjcyIDY3MmYgNzM3MiA2MzNhIDYxNzAgNjE2MyA2ODY1IDIyM2UKLQkweDEzMjA6ICA2YjZlIDZmNzcgNmUyMCA2Mjc1IDY3NzMgM2MyZiA0MTNlIDIwNmYKLQkweDEzMzA6ICA2NjIwIDc0NjggNjk3MyAwYTcwIDYxNjMgNmI2MSA2NzY1IDJjMjAKLQkweDEzNDA6ICA2MzYxIDZlMjAgNjI2NSAyMDY2IDZmNzUgNmU2NCAyMDY5IDZlMjAKLQkweDEzNTA6ICA3NDY4IDY1MjAgMGEzYyA0MTIwIDQ4NTIgNDU0NiAzZDIyIDY4NzQKLQkweDEzNjA6ICA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxIDZlMmUKLQkweDEzNzA6ICA2ZjcyIDY3MmYgNDI3NSA2NzczIDJmNTIgNjU3MCA2ZjcyIDc0NjkKLQkweDEzODA6ICA2ZTY3IDIyM2UgNDQ2NSA2MjY5IDYxNmUgMjA0MiA3NTY3IDIwNTQKLQkweDEzOTA6ICA3MjYxIDYzNmIgNjk2ZSA2NzIwIDUzNzkgNzM3NCA2NTZkIDNjMmYKLQkweDEzYTA6ICA0MTNlIDJlMGEgMGEzYyA1MDNlIDU0NjggNjE2ZSA2YjczIDIwNjYKLQkweDEzYjA6ICA2ZjcyIDIwNzUgNzM2OSA2ZTY3IDIwNzQgNjg2OSA3MzIwIDcwNjEKLQkweDEzYzA6ICA2MzZiIDYxNjcgNjUyYyAyMDYxIDZlNjQgMjA2MyA2ZjZlIDY3NzIKLQkweDEzZDA6ICA2MTc0IDc1NmMgNjE3NCA2OTZmIDZlNzMgMjA2NiA2ZjcyIDIwNzkKLQkweDEzZTA6ICA2Zjc1IDcyMjAgNjM2OCA2ZjY5IDYzNjUgMjA2ZiA2NjBhIDYxMjAKLQkweDEzZjA6ICA0NDY1IDYyNjkgNjE2ZSAyMDczIDc5NzMgNzQ2NSA2ZDIxIDNjMmYKLQkweDE0MDA6ICA1MDNlIDBhMGEgM2M0NCA0OTU2IDIwNjEgNmM2OSA2NzZlIDNkMjIKLQkweDE0MTA6ICA2MzY1IDZlNzQgNjU3MiAyMjNlIDBhM2MgNjEyMCA2ODcyIDY1NjYKLQkweDE0MjA6ICAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTY0IDY1NjIKLQkweDE0MzA6ICA2OTYxIDZlMmUgNmY3MiA2NzJmIDIyM2UgMGEzYyA0OTRkIDQ3MjAKLQkweDE0NDA6ICA2MTZjIDY5NjcgNmUzZCAyMjZkIDY5NjQgNjQ2YyA2NTIyIDIwNjgKLQkweDE0NTA6ICA2NTY5IDY3NjggNzQzZCAyMjMzIDMwMjIgMjA3NyA2OTY0IDc0NjgKLQkweDE0NjA6ICAzZDIyIDMyMzUgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmIDZlNzMKLQkweDE0NzA6ICAyZjY0IDY1NjIgNjk2MSA2ZTJmIDZmNzAgNjU2ZSA2YzZmIDY3NmYKLQkweDE0ODA6ICAyZDMyIDM1MmUgNmE3MCA2NzIyIDIwNjEgNmM3NCAzZDIyIDQ0NjUKLQkweDE0OTA6ICA2MjY5IDYxNmUgMjIzZSAwYTNjIDJmNjEgM2UwYSAzYzYxIDIwNjgKLQkweDE0YTA6ICA3MjY1IDY2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUKLQkweDE0YjA6ICA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTBhIDNjNDkKLQkweDE0YzA6ICA0ZDQ3IDIwNjEgNmM2OSA2NzZlIDNkMjIgNmQ2OSA2NDY0IDZjNjUKLQkweDE0ZDA6ICAyMjIwIDY4NjUgNjk2NyA2ODc0IDNkMjIgMzMzMiAyMjIwIDc3NjkKLQkweDE0ZTA6ICA2NDc0IDY4M2QgMjIzMiAzNTM5IDIyMjAgNzM3MiA2MzNkIDIyNjkKLQkweDE0ZjA6ICA2MzZmIDZlNzMgMmY2MSA3MDYxIDYzNjggNjU1ZiA3MDYyIDJlNzAKLQkweDE1MDA6ICA2ZTY3IDIyMjAgNjE2YyA3NDNkIDIyNDEgNzA2MSA2MzY4IDY1MjIKLQkweDE1MTA6ICAzZTBhIDNjMmYgNjEzZSAwYTNjIDJmNDQgNDk1NiAzZTBhIDBhM2MKLQkweDE1MjA6ICAyMTJkIDJkMGEgMjAyMCA1NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAKLQkweDE1MzA6ICA3NzYxIDczMjAgNjk2ZSA2OTc0IDY5NjEgNmM2YyA3OTIwIDYzNzIKLQkweDE1NDA6ICA2NTYxIDc0NjUgNjQyMCA2Mjc5IDIwNGEgNmY2OCA2ZTY5IDY1MjAKLQkweDE1NTA6ICA0OTZlIDY3NzIgNjE2ZCAyMDI4IDY4NzQgNzQ3MCAzYTJmIDJmNmUKLQkweDE1NjA6ICA2NTc0IDY3NmYgNjQyZSA2ZTY1IDc0MmYgMjkwYSAyMDIwIDQ5NzQKLQkweDE1NzA6ICAyMDc3IDYxNzMgMjA2YyA2MTc0IDY1NzIgMjA2NSA2NDY5IDc0NjUKLQkweDE1ODA6ICA2NDIwIDYyNzkgMjA0ZCA2MTc0IDc0NjggNjU3NyAyMDU3IDY5NmMKLQkweDE1OTA6ICA2MzZmIDc4MjAgNjE2ZSA2NDIwIDRhNmYgNzM2OSA3MDIwIDUyNmYKLQkweDE1YTA6ICA2NDY5IDZlMmUgMGEyMCAyMDRjIDYxNzMgNzQyMCA2ZDZmIDY0NjkKLQkweDE1YjA6ICA2NjY5IDY1NjQgM2EyMCAyNDQ0IDYxNzQgNjUzYSAyMDMyIDMwMzAKLQkweDE1YzA6ICAzNDJmIDMwMzYgMmYzMiAzMDIwIDMxMzUgM2EzMyAzMzNhIDM1MzcKLQkweDE1ZDA6ICAyMDI0IDJlMGEgMjAyMCAyZDJkIDNlMGEgMGEzYyAyZjQyIDRmNDQKLQkweDE1ZTA6ICA1OTNlIDBhM2MgMmY0OCA1NDRkIDRjM2UgMGEKLTIzOjU3OjM1Ljk0MTI2MCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTM+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFiNmUgNDAwMCA0MDA2IDIxNTQgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5Ci0JMHgwMDIwOiAgODAxMCAzMDVmIDEwZWEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5Ci0JMHgwMDMwOiAgNGRkYyA5MjE5Ci0yMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFiNzAgNDAwMCA0MDA2IDIxNTIgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5Ci0JMHgwMDIwOiAgODAxMSAzMDVmIDBiZTEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIxCi0JMHgwMDMwOiAgNGRkYyA5MjE5Ci0yMzo1NzozNy4yMzA4MzkgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBGIDU1NjA6NTU2MCgwKSBhY2sgMjA0IHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDE+Ci0JMHgwMDAwOiAgNDUwMCAwMDM0IDFmZTggNDAwMCA0MDA2IDFjZGEgN2YwMCAwMDAxCi0JMHgwMDEwOiAgN2YwMCAwMDAxIDAwNTAgZGE3MCAzNzdhIGEzYTkgMzc1OCA4YTRhCi0JMHgwMDIwOiAgODAxMSAyMDAwIDE3MzUgMDAwMCAwMTAxIDA4MGEgNGRkYyA5NzIzCi0JMHgwMDMwOiAgNGRkYyA5NzIxCi0yMzo1NzozNy4yMzA5MDAgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiAuIGFjayA1NTYxIHdpbiAxMjM4MyA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQzPgotCTB4MDAwMDogIDQ1MDAgMDAzNCAxYjcyIDQwMDAgNDAwNiAyMTUwIDdmMDAgMDAwMQotCTB4MDAxMDogIDdmMDAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTRhIDM3N2EgYTNhYQotCTB4MDAyMDogIDgwMTAgMzA1ZiAwNmQ0IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMwotCTB4MDAzMDogIDRkZGMgOTcyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQteHgubmV3IGIvdGVzdHMvcHJpbnQteHgubmV3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMyM2Q0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3ByaW50LXh4Lm5ldworKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0yMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAgYTAwMgotCTB4MDAzMDogIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYwotCTB4MDA0MDogIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMgotMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YgYTAxMgotCTB4MDAzMDogIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYwotCTB4MDA0MDogIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwMzQgMWI2YSA0MDAwIDQwMDYgMjE1OCA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxMAotCTB4MDAzMDogIDIwMDAgMzdkMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTYgNGRkYwotCTB4MDA0MDogIDkyMTYKLTIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxOAotCTB4MDAzMDogIDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcgNGRkYwotCTB4MDA0MDogIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEgMmUzMQotCTB4MDA1MDogIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjggNmY3MwotCTB4MDA2MDogIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EgMjA0NQotCTB4MDA3MDogIDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcgMmQ2NAotCTB4MDA4MDogIDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQgNjUzYgotCTB4MDA5MDogIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQgMzEyZAotCTB4MDBhMDogIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAgMzEzMwotCTB4MDBiMDogIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAgNzQzYQotCTB4MDBjMDogIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUgNmU2MwotCTB4MDBkMDogIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEgNjM2MwotCTB4MDBlMDogIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAgNjU2ZQotCTB4MDBmMDogIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAgNGI2NQotCTB4MDEwMDogIDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhCi0yMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKLQkweDAwMTA6ICAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxIDdmMDAKLQkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5IDgwMTAKLQkweDAwMzA6ICAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4IDRkZGMKLQkweDAwNDA6ICA5MjE3Ci0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCi0JMHgwMDEwOiAgMTVlYiAxZmU2IDQwMDAgNDAwNiAwNzI1IDdmMDAgMDAwMSA3ZjAwCi0JMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDE4Ci0JMHgwMDMwOiAgMjAwMCAxM2UwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSA0ZGRjCi0JMHgwMDQwOiAgOTIxNyA0ODU0IDU0NTAgMmYzMSAyZTMxIDIwMzIgMzAzMCAyMDRmCi0JMHgwMDUwOiAgNGIwZCAwYTQ0IDYxNzQgNjUzYSAyMDU3IDY1NjQgMmMyMCAzMDM2Ci0JMHgwMDYwOiAgMjA0YSA3NTZjIDIwMzIgMzAzMCAzNTIwIDMwMzMgM2EzNSAzNzNhCi0JMHgwMDcwOiAgMzMzNSAyMDQ3IDRkNTQgMGQwYSA1MzY1IDcyNzYgNjU3MiAzYTIwCi0JMHgwMDgwOiAgNDE3MCA2MTYzIDY4NjUgMmYzMSAyZTMzIDJlMzMgMzMwZCAwYTRjCi0JMHgwMDkwOiAgNjE3MyA3NDJkIDRkNmYgNjQ2OSA2NjY5IDY1NjQgM2EyMCA1Mzc1Ci0JMHgwMGEwOiAgNmUyYyAyMDMxIDM1MjAgNDE3NSA2NzIwIDMyMzAgMzAzNCAyMDMwCi0JMHgwMGIwOiAgMzAzYSAzNDMzIDNhMzQgMzEyMCA0NzRkIDU0MGQgMGE0NSA1NDYxCi0JMHgwMGMwOiAgNjczYSAyMDIyIDM2NjUgMzgzMCA2NjMwIDJkMzEgMzQzOCA2MTJkCi0JMHgwMGQwOiAgMzQzMSAzMTY1IDYyMzEgNjI2NCAyMjBkIDBhNDEgNjM2MyA2NTcwCi0JMHgwMGUwOiAgNzQyZCA1MjYxIDZlNjcgNjU3MyAzYTIwIDYyNzkgNzQ2NSA3MzBkCi0JMHgwMGYwOiAgMGE0MyA2ZjZlIDc0NjUgNmU3NCAyZDRjIDY1NmUgNjc3NCA2ODNhCi0JMHgwMTAwOiAgMjAzNSAzMjM1IDM4MGQgMGE0YiA2NTY1IDcwMmQgNDE2YyA2OTc2Ci0JMHgwMTEwOiAgNjUzYSAyMDc0IDY5NmQgNjU2ZiA3NTc0IDNkMzEgMzUyYyAyMDZkCi0JMHgwMTIwOiAgNjE3OCAzZDMxIDMwMzAgMGQwYSA0MzZmIDZlNmUgNjU2MyA3NDY5Ci0JMHgwMTMwOiAgNmY2ZSAzYTIwIDRiNjUgNjU3MCAyZDQxIDZjNjkgNzY2NSAwZDBhCi0JMHgwMTQwOiAgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgM2EyMCA3NDY1Ci0JMHgwMTUwOiAgNzg3NCAyZjY4IDc0NmQgNmMzYiAyMDYzIDY4NjEgNzI3MyA2NTc0Ci0JMHgwMTYwOiAgM2Q2OSA3MzZmIDJkMzggMzgzNSAzOTJkIDMxMGQgMGEwZCAwYTNjCi0JMHgwMTcwOiAgMjE0NCA0ZjQzIDU0NTkgNTA0NSAyMDQ4IDU0NGQgNGMyMCA1MDU1Ci0JMHgwMTgwOiAgNDI0YyA0OTQzIDIwMjIgMmQyZiAyZjU3IDMzNDMgMmYyZiA0NDU0Ci0JMHgwMTkwOiAgNDQyMCA0ODU0IDRkNGMgMjAzNCAyZTMwIDMxMjAgNTQ3MiA2MTZlCi0JMHgwMWEwOiAgNzM2OSA3NDY5IDZmNmUgNjE2YyAyZjJmIDQ1NGUgMjIzZSAwYTNjCi0JMHgwMWIwOiAgNDg1NCA0ZDRjIDNlMGEgM2M0OCA0NTQxIDQ0M2UgMGEyMCAyMDIwCi0JMHgwMWMwOiAgM2M0ZCA0NTU0IDQxMjAgNDg1NCA1NDUwIDJkNDUgNTE1NSA0OTU2Ci0JMHgwMWQwOiAgM2QyMiA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAyMjIwCi0JMHgwMWUwOiAgNDM0ZiA0ZTU0IDQ1NGUgNTQzZCAyMjc0IDY1NzggNzQyZiA2ODc0Ci0JMHgwMWYwOiAgNmQ2YyAzYjIwIDYzNjggNjE3MiA3MzY1IDc0M2QgNjk3MyA2ZjJkCi0JMHgwMjAwOiAgMzgzOCAzNTM5IDJkMzEgMjIzZSAwYTIwIDIwMjAgM2M0ZCA0NTU0Ci0JMHgwMjEwOiAgNDEyMCA0ZTQxIDRkNDUgM2QyMiA0NDY1IDczNjMgNzI2OSA3MDc0Ci0JMHgwMjIwOiAgNjk2ZiA2ZTIyIDIwNDMgNGY0ZSA1NDQ1IDRlNTQgM2QyMiA1NDY4Ci0JMHgwMjMwOiAgNjUyMCA2OTZlIDY5NzQgNjk2MSA2YzIwIDY5NmUgNzM3NCA2MTZjCi0JMHgwMjQwOiAgNmM2MSA3NDY5IDZmNmUgMjA2ZiA2NjIwIDQ0NjUgNjI2OSA2MTZlCi0JMHgwMjUwOiAgMjA2MSA3MDYxIDYzNjggNjUyZSAyMjNlIDBhMjAgMjAyMCAzYzU0Ci0JMHgwMjYwOiAgNDk1NCA0YzQ1IDNlNTAgNmM2MSA2MzY1IDY4NmYgNmM2NCA2NTcyCi0JMHgwMjcwOiAgMjA3MCA2MTY3IDY1M2MgMmY1NCA0OTU0IDRjNDUgM2UwYSAzYzJmCi0JMHgwMjgwOiAgNDg0NSA0MTQ0IDNlMGEgM2M0MiA0ZjQ0IDU5MjAgNTQ0NSA1ODU0Ci0JMHgwMjkwOiAgM2QyMiAyMzMwIDMwMzAgMzAzMCAzMDIyIDIwNDIgNDc0MyA0ZjRjCi0JMHgwMmEwOiAgNGY1MiAzZDIyIDIzNDYgNDY0NiA0NjQ2IDQ2MjIgMjA0YyA0OTRlCi0JMHgwMmIwOiAgNGIzZCAyMjIzIDMwMzAgMzAzMCA0NTQ2IDIyMjAgNTY0YyA0OTRlCi0JMHgwMmMwOiAgNGIzZCAyMjIzIDM1MzUgMzEzOCAzODQxIDIyMjAgNDE0YyA0OTRlCi0JMHgwMmQwOiAgNGIzZCAyMjIzIDQ2NDYgMzAzMCAzMDMwIDIyM2UgMGEwYSAzYzQ4Ci0JMHgwMmUwOiAgMzEzZSA1MDZjIDYxNjMgNjU2OCA2ZjZjIDY0NjUgNzIyMCA3MDYxCi0JMHgwMmYwOiAgNjc2NSAzYzJmIDQ4MzEgM2UwYSAzYzQ4IDMyM2UgNDk2NiAyMDc5Ci0JMHgwMzAwOiAgNmY3NSAyMDYxIDcyNjUgMjA2YSA3NTczIDc0MjAgNjI3MiA2Zjc3Ci0JMHgwMzEwOiAgNzM2OSA2ZTY3IDIwNzQgNjg2NSAyMDc3IDY1NjIgM2MyZiA2ODMyCi0JMHgwMzIwOiAgM2UwYSAwYTNjIDUwM2UgNTQ2OCA2NTIwIDZmNzcgNmU2NSA3MjIwCi0JMHgwMzMwOiAgNmY2NiAyMDc0IDY4NjkgNzMyMCA3NzY1IDYyMjAgNzM2OSA3NDY1Ci0JMHgwMzQwOiAgMjA2OCA2MTczIDIwNmUgNmY3NCAyMDcwIDc1NzQgMjA3NSA3MDIwCi0JMHgwMzUwOiAgNjE2ZSA3OTIwIDc3NjUgNjIyMCA3MDYxIDY3NjUgNzMyMCA3OTY1Ci0JMHgwMzYwOiAgNzQyZSAwYTUwIDZjNjUgNjE3MyA2NTIwIDYzNmYgNmQ2NSAyMDYyCi0JMHgwMzcwOiAgNjE2MyA2YjIwIDZjNjEgNzQ2NSA3MjJlIDNjMmYgNTAzZSAwYTBhCi0JMHgwMzgwOiAgM2M1MCAzZTNjIDUzNGQgNDE0YyA0YzNlIDNjNDMgNDk1NCA0NTNlCi0JMHgwMzkwOiAgNGQ2ZiA3NjY1IDIwNjEgNmM2ZiA2ZTY3IDJjMjAgNmU2ZiA3NDY4Ci0JMHgwM2EwOiAgNjk2ZSA2NzIwIDc0NmYgMjA3MyA2NTY1IDIwNjggNjU3MiA2NTJlCi0JMHgwM2IwOiAgMmUyZSAzYzJmIDQzNDkgNTQ0NSAzZTIwIDNhMmQgMjkzYyAyZjUzCi0JMHgwM2MwOiAgNGQ0MSA0YzRjIDNlM2MgMmY1MCAzZTBhIDBhM2MgNDgzMiAzZTQ5Ci0JMHgwM2QwOiAgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwIDc0NzIgNzk2OSA2ZTY3Ci0JMHgwM2UwOiAgMjA3NCA2ZjIwIDZjNmYgNjM2MSA3NDY1IDIwNzQgNjg2NSAyMDYxCi0JMHgwM2YwOiAgNjQ2ZCA2OTZlIDY5NzMgNzQ3MiA2MTc0IDZmNzIgMjA2ZiA2NjIwCi0JMHgwNDAwOiAgNzQ2OCA2OTczIDIwNmQgNjE2MyA2ODY5IDZlNjUgM2MyZiA0ODMyCi0JMHgwNDEwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA3NyA2MTZlCi0JMHgwNDIwOiAgNzQyMCA3NDZmIDIwNzIgNjU3MCA2ZjcyIDc0MjAgNzM2ZiA2ZDY1Ci0JMHgwNDMwOiAgNzQ2OCA2OTZlIDY3MjAgNjE2MiA2Zjc1IDc0MjAgNzQ2OCA2OTczCi0JMHgwNDQwOiAgMjA2OCA2ZjczIDc0MjcgNzMyMCA2MjY1IDY4NjEgNzY2OSA2ZjcyCi0JMHgwNDUwOiAgMmMyMCA3MDZjIDY1NjEgNzM2NSAwYTYzIDZmNmUgNzQ2MSA2Mzc0Ci0JMHgwNDYwOiAgMjA3NCA2ODY1IDIwNDkgNmU3NCA2NTcyIDZlNjUgNzQyMCA1MzY1Ci0JMHgwNDcwOiAgNzI3NiA2OTYzIDY1MjAgNTA3MiA2Zjc2IDY5NjQgNjU3MiAyMDI4Ci0JMHgwNDgwOiAgNDk1MyA1MDI5IDIwNjkgNmU3NiA2ZjZjIDc2NjUgNjQyMCA2NDY5Ci0JMHgwNDkwOiAgNzI2NSA2Mzc0IDZjNzkgMmUzYyAyZjUwIDNlMGEgMGEzYyA1MDNlCi0JMHgwNGEwOiAgNTM2NSA2NTIwIDc0NjggNjUyMCAzYzQxIDIwNjggNzI2NSA2NjNkCi0JMHgwNGIwOiAgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE2MiA3NTczCi0JMHgwNGMwOiAgNjUyZSA2ZTY1IDc0MmYgMjIzZSA0ZTY1IDc0NzcgNmY3MiA2YjIwCi0JMHgwNGQwOiAgNDE2MiA3NTczIDY1MGEgNDM2YyA2NTYxIDcyNjkgNmU2NyA2ODZmCi0JMHgwNGUwOiAgNzU3MyA2NTNjIDJmNDEgM2UyMCA2NjZmIDcyMjAgNjg2ZiA3NzIwCi0JMHgwNGYwOiAgNzQ2ZiAyMDY0IDZmMjAgNzQ2OCA2OTczIDJlM2MgMmY1MCAzZTBhCi0JMHgwNTAwOiAgMGEzYyA0ODMyIDNlNDkgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwCi0JMHgwNTEwOiAgNzQ2OCA2NTIwIDYxNjQgNmQ2OSA2ZTY5IDczNzQgNzI2MSA3NDZmCi0JMHgwNTIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDZkNjEgNjM2OCA2OTZlCi0JMHgwNTMwOiAgNjUzYyAyZjQ4IDMyM2UgMGEwYSAzYzUwIDNlNTQgNjg2NSAyMDY5Ci0JMHgwNTQwOiAgNmU2OSA3NDY5IDYxNmMgMjA2OSA2ZTczIDc0NjEgNmM2YyA2MTc0Ci0JMHgwNTUwOiAgNjk2ZiA2ZTIwIDZmNjYgMjAzYyA0MTIwIDY4NzIgNjU2NiAzZDIyCi0JMHgwNTYwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxCi0JMHgwNTcwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyNzczCi0JMHgwNTgwOiAgMGE2MSA3MDYxIDYzNjggNjUzYyAyZjQxIDNlMjAgNzc2NSA2MjIwCi0JMHgwNTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc3Ci0JMHgwNWEwOiAgNjE3MyAyMDczIDc1NjMgNjM2NSA3MzczIDY2NzUgNmMyZSAzYzJmCi0JMHgwNWIwOiAgNTAzZSAwYTBhIDNjNTAgM2UzYyA1MzU0IDUyNGYgNGU0NyAzZTU5Ci0JMHgwNWMwOiAgNmY3NSAyMDczIDY4NmYgNzU2YyA2NDIwIDcyNjUgNzA2YyA2MTYzCi0JMHgwNWQwOiAgNjUyMCA3NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2OSA3NDY4Ci0JMHgwNWUwOiAgMjA3OSA2Zjc1IDcyMjAgNmY3NyA2ZTIwIDc3NjUgNjIyMCA3MDYxCi0JMHgwNWYwOiAgNjc2NSA3MzIwIDYxNzMgMGE3MyA2ZjZmIDZlMjAgNjE3MyAyMDcwCi0JMHgwNjAwOiAgNmY3MyA3MzY5IDYyNmMgNjUyZSAzYzJmIDUzNTQgNTI0ZiA0ZTQ3Ci0JMHgwNjEwOiAgM2UzYyAyZjUwIDNlMGEgMGEzYyA1MDNlIDU1NmUgNmM2NSA3MzczCi0JMHgwNjIwOiAgMjA3OSA2Zjc1IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2OSA3NDczCi0JMHgwNjMwOiAgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjYxIDc0NjkgNmY2ZSAyYzIwCi0JMHgwNjQwOiAgNzk2ZiA3NTcyIDIwNmUgNjU3NyAyMDczIDY1NzIgNzY2NSA3MjIwCi0JMHgwNjUwOiAgNjk3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjUgNjQyMCA2MTczCi0JMHgwNjYwOiAgMjA2NiA2ZjZjIDZjNmYgNzc3MyAzYTBhIDNjNTUgNGMzZSAwYTNjCi0JMHgwNjcwOiAgNGM0OSAzZTBhIDQzNmYgNmU2NiA2OTY3IDc1NzIgNjE3NCA2OTZmCi0JMHgwNjgwOiAgNmUyMCA2NjY5IDZjNjUgNzMyMCA2MzYxIDZlMjAgNjI2NSAyMDY2Ci0JMHgwNjkwOiAgNmY3NSA2ZTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY2NSA3NDYzCi0JMHgwNmEwOiAgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjCi0JMHgwNmIwOiAgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA1NDU0Ci0JMHgwNmMwOiAgM2U0NCA2ZjYzIDc1NmQgNjU2ZSA3NDUyIDZmNmYgNzQzYyAyZjU0Ci0JMHgwNmQwOiAgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwIDY5NzMgMjA3NCA2ODY1Ci0JMHgwNmUwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNzUgNmU2NCA2NTcyCi0JMHgwNmYwOiAgMjA3NyA2ODY5IDYzNjggMjA2MSA2YzZjIDIwNzkgNmY3NSA3MjBhCi0JMHgwNzAwOiAgNDg1NCA0ZDRjIDIwNjYgNjk2YyA2NTczIDIwNzMgNjg2ZiA3NTZjCi0JMHgwNzEwOiAgNjQyMCA2NTc4IDY5NzMgNzQyYyAyMDY5IDczMjAgNzM2NSA3NDIwCi0JMHgwNzIwOiAgNzQ2ZiAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NyA3NzNjCi0JMHgwNzMwOiAgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlCi0JMHgwNzQwOiAgMGE0MyA0NzQ5IDIwNzMgNjM3MiA2OTcwIDc0NzMgMjA2MSA3MjY1Ci0JMHgwNzUwOiAgMjA2YyA2ZjZmIDZiNjUgNjQyMCA2NjZmIDcyMjAgNjk2ZSAyMDNjCi0JMHgwNzYwOiAgNTQ1NCAzZTJmIDc1NzMgNzIyZiA2YzY5IDYyMmYgNjM2NyA2OTJkCi0JMHgwNzcwOiAgNjI2OSA2ZTNjIDJmNTQgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwCi0JMHgwNzgwOiAgNjk3MyAyMDc3IDY4NjUgNzI2NSAwYTQ0IDY1NjIgNjk2MSA2ZTIwCi0JMHgwNzkwOiAgNzA2MSA2MzZiIDYxNjcgNjU3MyAyMDc3IDY5NmMgNmMyMCA3MDZjCi0JMHgwN2EwOiAgNjE2MyA2NTIwIDc0NjggNjU2OSA3MjIwIDczNjMgNzI2OSA3MDc0Ci0JMHgwN2IwOiAgNzMyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA0YzZmCi0JMHgwN2MwOiAgNjcyMCA2NjY5IDZjNjUgNzMyMCA2MTcyIDY1MjAgNzA2YyA2MTYzCi0JMHgwN2QwOiAgNjU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjZjCi0JMHgwN2UwOiAgNmY2NyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyYzIwCi0JMHgwN2YwOiAgNjE2ZSA2NDIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNzI2ZiA3NDYxCi0JMHgwODAwOiAgNzQ2NSA2NDBhIDc3NjUgNjU2YiA2Yzc5IDJlMjAgMjA1NCA2ODY1Ci0JMHgwODEwOiAgMjA2NiA3MjY1IDcxNzUgNjU2ZSA2Mzc5IDIwNmYgNjYyMCA3MjZmCi0JMHgwODIwOiAgNzQ2MSA3NDY5IDZmNmUgMjA2MyA2MTZlIDIwNjIgNjUyMCA2NTYxCi0JMHgwODMwOiAgNzM2OSA2Yzc5IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2MiA3OTIwCi0JMHgwODQwOiAgNjU2NCA2OTc0IDY5NmUgNjcwYSAzYzU0IDU0M2UgMmY2NSA3NDYzCi0JMHgwODUwOiAgMmY2YyA2ZjY3IDcyNmYgNzQ2MSA3NDY1IDJlNjQgMmY2MSA3MDYxCi0JMHgwODYwOiAgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhCi0JMHgwODcwOiAgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDY0IDY1NjYgNjE3NSA2Yzc0Ci0JMHgwODgwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNjkgNmU2NCA2NTc4Ci0JMHgwODkwOiAgMjA2OSA3MzIwIDNjNTQgNTQzZSA2OTZlIDY0NjUgNzgyZSA2ODc0Ci0JMHgwOGEwOiAgNmQ2YyAzYzJmIDU0NTQgM2UyYyAyMDZkIDY1NjEgNmU2OSA2ZTY3Ci0JMHgwOGIwOiAgMjA3NCA2ODYxIDc0MjAgNzI2NSA3MTc1IDY1NzMgNzQ3MyAwYTY2Ci0JMHgwOGMwOiAgNmY3MiAyMDYxIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDNjCi0JMHgwOGQwOiAgNTQ1NCAzZTJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgM2MyZiA1NDU0Ci0JMHgwOGUwOiAgM2UyMCA3NzY5IDZjNmMgMjA2NyA2OTc2IDY1MjAgNzQ2OCA2NTIwCi0JMHgwOGYwOiAgNjM2ZiA2ZTc0IDY1NmUgNzQ3MyAyMDZmIDY2MjAgNzQ2OCA2NTIwCi0JMHgwOTAwOiAgNjY2OSA2YzY1IDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3Ci0JMHgwOTEwOiAgNzcyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDY5NmUgNjQ2NSA3ODJlCi0JMHgwOTIwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTBhIDY5NjYgMjA2OSA3NDIwCi0JMHgwOTMwOiAgNjU3OCA2OTczIDc0NzMgMjAyOCA2MTczIDczNzUgNmQ2OSA2ZTY3Ci0JMHgwOTQwOiAgMjA3NCA2ODYxIDc0MjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjc3Ci0JMHgwOTUwOiAgNzc3NyAzYzJmIDU0NTQgM2UyMCA2OTczIDIwNzkgNmY3NSA3MjIwCi0JMHgwOTYwOiAgM2M1NCA1NDNlIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNTI2ZiA2Zjc0Ci0JMHgwOTcwOiAgM2MyZiA1NDU0IDNlMjkgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjCi0JMHgwOTgwOiAgNDkzZSAwYTU1IDczNjUgNzIyMCA2NDY5IDcyNjUgNjM3NCA2ZjcyCi0JMHgwOTkwOiAgNjk2NSA3MzIwIDYxNzIgNjUyMCA2NTZlIDYxNjIgNmM2NSA2NDJjCi0JMHgwOWEwOiAgMjA2MSA2ZTY0IDIwNzUgNzM2NSA3MjIwIDY0NmYgNjM3NSA2ZDY1Ci0JMHgwOWIwOiAgNmU3NCA3MzIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNmM2ZiA2ZjZiCi0JMHgwOWMwOiAgNjU2NCAyMDY2IDZmNzIgMGE2OSA2ZTIwIDc0NjggNjUyMCAzYzU0Ci0JMHgwOWQwOiAgNTQzZSA3MDc1IDYyNmMgNjk2MyA1ZjY4IDc0NmQgNmMzYyAyZjU0Ci0JMHgwOWUwOiAgNTQzZSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2ZiA2NjIwCi0JMHgwOWYwOiAgNzQ2OCA2NTIwIDc1NzMgNjU3MiA3MzI3IDIwNjggNmY2ZCA2NTczCi0JMHgwYTAwOiAgMmUyMCAyMDU0IDY4NjUgNzM2NSAyMDY0IDY5NzIgNzMwYSA3MzY4Ci0JMHgwYTEwOiAgNmY3NSA2YzY0IDIwNjIgNjUyMCA3NTZlIDY0NjUgNzIyMCAzYzU0Ci0JMHgwYTIwOiAgNTQzZSAyZjY4IDZmNmQgNjUzYyAyZjU0IDU0M2UgMmMyMCA2MTZlCi0JMHgwYTMwOiAgNjQyMCA3NTczIDY1NzIgNzMyMCA3NzY5IDZjNmMgMjA2ZSA2Zjc0Ci0JMHgwYTQwOiAgMjA2MiA2NTIwIDYxNjIgNmM2NSAyMDc0IDZmMjAgNzM3OSA2ZDZjCi0JMHgwYTUwOiAgNjk2ZSA2YjBhIDc0NmYgMjA2NiA2OTZjIDY1NzMgMjA3NCA2ODY1Ci0JMHgwYTYwOiAgNzkyMCA2NDZmIDZlMjcgNzQyMCA2Zjc3IDZlMmUgM2MyZiA0YzQ5Ci0JMHgwYTcwOiAgM2UwYSAwYTNjIDJmNTUgNGMzZSAwYTQxIDZjNmMgMjA3NCA2ODY1Ci0JMHgwYTgwOiAgMjA3MyA3NDYxIDZlNjQgNjE3MiA2NDIwIDYxNzAgNjE2MyA2ODY1Ci0JMHgwYTkwOiAgMjA2ZCA2ZjY0IDc1NmMgNjU3MyAyMDYxIDcyNjUgMjA2MSA3NjYxCi0JMHgwYWEwOiAgNjk2YyA2MTYyIDZjNjUgMjA3NyA2OTc0IDY4MjAgNzQ2OCA2OTczCi0JMHgwYWIwOiAgMjA3MiA2NTZjIDY1NjEgNzM2NSAyMDYxIDZlNjQgMjA2MSA3MjY1Ci0JMHgwYWMwOiAgMGE2ZSA2Zjc3IDIwNmQgNjE2ZSA2MTY3IDY1NjQgMjA3NyA2OTc0Ci0JMHgwYWQwOiAgNjgyMCA2NDY1IDYyNjMgNmY2ZSA2NjJlIDIwMjAgNTQ3OSA3MDY1Ci0JMHgwYWUwOiAgMjAzYyA1NDU0IDNlNjQgNzA2YiA2NzJkIDcyNjUgNjM2ZiA2ZTY2Ci0JMHgwYWYwOiAgNjk2NyA3NTcyIDY1MjAgNjE3MCA2MTYzIDY4NjUgM2MyZiA1NDU0Ci0JMHgwYjAwOiAgM2UyMCA3NDZmIDBhNzMgNjU2YyA2NTYzIDc0MjAgNzc2OCA2OTYzCi0JMHgwYjEwOiAgNjgyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwIDc5NmYgNzUyMCA3NzYxCi0JMHgwYjIwOiAgNmU3NCAyMDY1IDZlNjEgNjI2YyA2NTY0IDJlMjAgMjA0ZCA2MTZlCi0JMHgwYjMwOiAgNzkyMCA2Zjc0IDY4NjUgNzIyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwCi0JMHgwYjQwOiAgNjE3MiA2NTIwIDYxNzYgNjE2OSA2YzYxIDYyNmMgNjUwYSA3NDY4Ci0JMHgwYjUwOiAgNzI2ZiA3NTY3IDY4MjAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlCi0JMHgwYjYwOiAgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDczIDc5NzMgNzQ2NSA2ZDIwCi0JMHgwYjcwOiAgNzc2OSA3NDY4IDIwNzQgNjg2NSAyMDZlIDYxNmQgNjU3MyAyMDNjCi0JMHgwYjgwOiAgNTQ1NCAzZTZjIDY5NjIgNjE3MCA2MTYzIDY4NjUgMmQ2ZCA2ZjY0Ci0JMHgwYjkwOiAgMmQyYSAzYzJmIDU0NTQgM2UyZSAwYTQ5IDY2MjAgNzk2ZiA3NTIwCi0JMHgwYmEwOiAgNmU2NSA2NTY0IDIwNzQgNmYyMCA2MzZmIDZkNzAgNjk2YyA2NTIwCi0JMHgwYmIwOiAgNjEyMCA2ZDZmIDY0NzUgNmM2NSAyMDc5IDZmNzUgNzI3MyA2NTZjCi0JMHgwYmMwOiAgNjYyYyAyMDc5IDZmNzUgMjA3NyA2OTZjIDZjMjAgNmU2NSA2NTY0Ci0JMHgwYmQwOiAgMjA3NCA2ZjIwIDY5NmUgNzM3NCA2MTZjIDZjMjAgNzQ2OCA2NTBhCi0JMHgwYmUwOiAgM2M1NCA1NDNlIDYxNzAgNjE2MyA2ODY1IDJkNjQgNjU3NiAzYzJmCi0JMHgwYmYwOiAgNTQ1NCAzZTIwIDcwNjEgNjM2YiA2MTY3IDY1MmUgMGEwYSAzYzUwCi0JMHgwYzAwOiAgM2U0ZCA2ZjcyIDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0Ci0JMHgwYzEwOiAgNjk2ZiA2ZTIwIDZmNmUgMjA0MSA3MDYxIDYzNjggNjUyMCA2MzYxCi0JMHgwYzIwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNmYgNmUzYSAwYTNjCi0JMHgwYzMwOiAgNTU0YyAzZTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA0MTIwCi0JMHgwYzQwOiAgNDg1MiA0NTQ2IDNkMjIgMmY2NCA2ZjYzIDJmNjEgNzA2MSA2MzY4Ci0JMHgwYzUwOiAgNjUyZCA2NDZmIDYzMmYgNmQ2MSA2ZTc1IDYxNmMgMmYyMiAzZTQxCi0JMHgwYzYwOiAgNzA2MSA2MzY4IDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0Ci0JMHgwYzcwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3Mzc0IDZmNzIgNjU2NCAyMDZmCi0JMHgwYzgwOiAgNmUyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyZSAzYzJmCi0JMHgwYzkwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxCi0JMHgwY2EwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3Ci0JMHgwY2IwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTQxCi0JMHgwY2MwOiAgNzA2MSA2MzY4IDY1MjAgNTA3MiA2ZjZhIDY1NjMgNzQzYyAyZjQxCi0JMHgwY2QwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5Ci0JMHgwY2UwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4Ci0JMHgwY2YwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCi0JMHgwZDAwOiAgNjE3MCA2MTYzIDY4NjUgMmQ3MyA3MzZjIDJlNmYgNzI2NyAyZjIyCi0JMHgwZDEwOiAgM2U0MSA3MDYxIDYzNjggNjUyZCA1MzUzIDRjM2MgMmY0MSAzZTIwCi0JMHgwZDIwOiAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OSAzZTBhCi0JMHgwZDMwOiAgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1Ci0JMHgwZDQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDcwNjUgNzI2YyAyZTYxCi0JMHgwZDUwOiAgNzA2MSA2MzY4IDY1MmUgNmY3MiA2NzJmIDIyM2UgNmQ2ZiA2NDIwCi0JMHgwZDYwOiAgNzA2NSA3MjZjIDNjMmYgNDEzZSAyMDY4IDZmNmQgNjUyMCA3MzY5Ci0JMHgwZDcwOiAgNzQ2NSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0Ci0JMHgwZDgwOiAgNjg2NSAyMDNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCi0JMHgwZDkwOiAgM2EyZiAyZjc3IDc3NzcgMmU2MSA3MDYxIDYzNjggNjU3NyA2NTY1Ci0JMHgwZGEwOiAgNmIyZSA2MzZmIDZkMmYgMjIzZSA0MTcwIDYxNjMgNjg2NSA1NzY1Ci0JMHgwZGIwOiAgNjU2YiAzYzJmIDQxM2UgMjA2ZSA2NTc3IDczNmMgNjU3NCA3NDY1Ci0JMHgwZGMwOiAgNzIyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4Ci0JMHgwZGQwOiAgNjUyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhCi0JMHgwZGUwOiAgMmYyZiA3Nzc3IDc3MmUgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3Ci0JMHgwZGYwOiAgMmY2NCA2ZjYzIDJmMjIgM2U0NCA2NTYyIDY5NjEgNmUyMCA1MDcyCi0JMHgwZTAwOiAgNmY2YSA2NTYzIDc0MGEgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0Ci0JMHgwZTEwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3NzY4IDY5NjMgNjgyMCA2MzZmCi0JMHgwZTIwOiAgNmU3NCA2MTY5IDZlNzMgMjA0OCA0ZjU3IDU0NGYgNzMyYyAyMDQ2Ci0JMHgwZTMwOiAgNDE1MSA3MzJjIDIwNjEgNmU2NCAyMDczIDZmNjYgNzQ3NyA2MTcyCi0JMHgwZTQwOiAgNjUyMCA3NTcwIDY0NjEgNzQ2NSA3MzJlIDNjMmYgNGM0OSAzZTBhCi0JMHgwZTUwOiAgM2MyZiA1NTRjIDNlMGEgMGEzYyA1MDNlIDU5NmYgNzUyMCA2MzYxCi0JMHgwZTYwOiAgNmUyMCA2MTZjIDczNmYgMjA2MyA2ZjZlIDczNzUgNmM3NCAyMDc0Ci0JMHgwZTcwOiAgNjg2NSAyMDZjIDY5NzMgNzQyMCA2ZjY2IDIwM2MgNDEyMCA0ODUyCi0JMHgwZTgwOiAgNDU0NiAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYyCi0JMHgwZTkwOiAgNmY3NSA3NDY1IDZjNmMgMmU2MyA2ZjZkIDJmNjYgNjE3MSAyZjIyCi0JMHgwZWEwOiAgM2U1NyA2ZjcyIDZjNjQgMGE1NyA2OTY0IDY1MjAgNTc2NSA2MjIwCi0JMHgwZWIwOiAgNDY3MiA2NTcxIDc1NjUgNmU3NCA2Yzc5IDIwNDEgNzM2YiA2NTY0Ci0JMHgwZWMwOiAgMjA1MSA3NTY1IDczNzQgNjk2ZiA2ZTczIDNjMmYgNDEzZSAyMDY2Ci0JMHgwZWQwOiAgNmY3MiAyMDY5IDZlNjYgNmY3MiA2ZDYxIDc0NjkgNmY2ZSAyZTBhCi0JMHgwZWUwOiAgMGEzYyA0ODMyIDNlNGMgNjU3NCAyMDZmIDc0NjggNjU3MiAyMDcwCi0JMHgwZWYwOiAgNjU2ZiA3MDZjIDY1MjAgNmI2ZSA2Zjc3IDIwNjEgNjI2ZiA3NTc0Ci0JMHgwZjAwOiAgMjA3NCA2ODY5IDczMjAgNzM2NSA3Mjc2IDY1NzIgM2MyZiA0ODMyCi0JMHgwZjEwOiAgM2UwYSAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCi0JMHgwZjIwOiAgM2EyZiAyZjZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmCi0JMHgwZjMwOiAgMjIzZSA0ZTY1IDc0NjMgNzI2MSA2Njc0IDNjMmYgNDEzZSAyMDcwCi0JMHgwZjQwOiAgNzI2ZiA3NjY5IDY0NjUgNzMyMCA2MTZlIDIwNjkgNmU3NCA2NTcyCi0JMHgwZjUwOiAgNjU3MyA3NDY5IDZlNjcgMjA2NiA3MjY1IDY1MGEgNzM2NSA3Mjc2Ci0JMHgwZjYwOiAgNjk2MyA2NTIwIDY2NmYgNzIyMCA3NzY1IDYyMjAgNzM2OSA3NDY1Ci0JMHgwZjcwOiAgMjA2ZCA2ZjZlIDY5NzQgNmY3MiA2OTZlIDY3MjAgNjE2ZSA2NDIwCi0JMHgwZjgwOiAgNzM3NCA2MTc0IDY5NzMgNzQ2OSA2MzIwIDYzNmYgNmM2YyA2NTYzCi0JMHgwZjkwOiAgNzQ2OSA2ZjZlIDJlMGEgNTk2ZiA3NTIwIDYzNjEgNmUyMCA2YzY1Ci0JMHgwZmEwOiAgNzQyMCA3NDY4IDY1NmQgMjA2YiA2ZTZmIDc3MjAgNjE2MiA2Zjc1Ci0JMHgwZmIwOiAgNzQyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NTczCi0JMHgwZmMwOiAgNjk2ZSA2NzIwIDc0NjggNjU2OSA3MjBhIDNjNDEgMjA0OCA1MjQ1Ci0JMHgwZmQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc1NzAgNzQ2OSA2ZDY1Ci0JMHgwZmUwOiAgMmU2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZiAyMjNlCi0JMHgwZmYwOiAgNjk2ZSA3NDY1IDcyNjYgNjE2MyA2NTNjIDJmNDEgM2UyZSAwYTQ1Ci0JMHgxMDAwOiAgNmU2MSA2MjZjIDY5NmUgNjcyMCA3NDY4IDY1MjAgNmQ2ZiA2ZTY5Ci0JMHgxMDEwOiAgNzQ2ZiA3MjY5IDZlNjcgMjA2ZiA2NjIwIDc5NmYgNzU3MiAyMDczCi0JMHgxMDIwOiAgNjU3MiA3NjY1IDcyMjAgNzc2OSA2YzZjIDIwNzAgNzI2ZiA3NjY5Ci0JMHgxMDMwOiAgNjQ2NSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMjAgNjc2YyA2ZjYyCi0JMHgxMDQwOiAgNjE2YyAyMDZmIDc2NjUgNzI3NiA2OTY1IDc3MGEgNmY2NiAyMDc3Ci0JMHgxMDUwOiAgNjg2ZiAyMDY5IDczMjAgNzU3MyA2OTZlIDY3MjAgNzc2OCA2MTc0Ci0JMHgxMDYwOiAgMjA2MSA2ZTY0IDIwNzcgNjg2NSA3MjY1IDJjMjAgNjE2ZSA2NDIwCi0JMHgxMDcwOiAgNjk3NCAyMDc3IDZmNzUgNmM2NCAyMDY3IDY5NzYgNjUyMCA0NDY1Ci0JMHgxMDgwOiAgNjI2OSA2MTZlIDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIwYSA2Zjc2Ci0JMHgxMDkwOiAgNjU3MiA3NjY5IDY1NzcgMjA2ZiA2NjIwIDc0NjggNjUyMCA2MTcwCi0JMHgxMGEwOiAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NSA3MzYxCi0JMHgxMGIwOiAgNjc2NSAyZTBhIDBhM2MgNDgzMiAzZTQxIDYyNmYgNzU3NCAyMDc0Ci0JMHgxMGMwOiAgNjg2OSA3MzIwIDcwNjEgNjc2NSAzYzJmIDQ4MzIgM2UwYSAwYTNjCi0JMHgxMGQwOiAgNDk0ZCA0NzIwIDQxNGMgNDk0NyA0ZTNkIDIyNzIgNjk2NyA2ODc0Ci0JMHgxMGUwOiAgMjIyMCA0MTRjIDU0M2QgMjIyMiAyMDQ4IDQ1NDkgNDc0OCA1NDNkCi0JMHgxMGYwOiAgMjIzMiAzNDM3IDIyMjAgNTc0OSA0NDU0IDQ4M2QgMjIzMiAzNzM4Ci0JMHgxMTAwOiAgMjIyMCA1MzUyIDQzM2QgMjI2OSA2MzZmIDZlNzMgMmY2YSA2ODY1Ci0JMHgxMTEwOiAgMzAzNiAzMTJlIDcwNmUgNjcyMiAzZTBhIDBhM2MgNTAzZSA1NDY4Ci0JMHgxMTIwOiAgNjk3MyAyMDY5IDczMjAgNjEyMCA3MDZjIDYxNjMgNjU2OCA2ZjZjCi0JMHgxMTMwOiAgNjQ2NSA3MjIwIDcwNjEgNjc2NSAyMDY5IDZlNzMgNzQ2MSA2YzZjCi0JMHgxMTQwOiAgNjU2NCAyMDYyIDc5MjAgNzQ2OCA2NTIwIDNjNDEgMGE0OCA1MjQ1Ci0JMHgxMTUwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1Ci0JMHgxMTYwOiAgNjI2OSA2MTZlIDJlNmYgNzI2NyAyZjIyIDNlNDQgNjU2MiA2OTYxCi0JMHgxMTcwOiAgNmUzYyAyZjQxIDNlMGEgNzI2NSA2YzY1IDYxNzMgNjUyMCA2ZjY2Ci0JMHgxMTgwOiAgMjA3NCA2ODY1IDIwNjEgNzA2MSA2MzY4IDY1MjAgNTc2NSA2MjIwCi0JMHgxMTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyZTBhCi0JMHgxMWEwOiAgMGEzYyA1MDNlIDU0NjggNjk3MyAyMDYzIDZmNmQgNzA3NSA3NDY1Ci0JMHgxMWIwOiAgNzIyMCA2ODYxIDczMjAgNjk2ZSA3Mzc0IDYxNmMgNmM2NSA2NDIwCi0JMHgxMWMwOiAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlIDIwNDcgNGU1NSAyZjRjCi0JMHgxMWQwOiAgNjk2ZSA3NTc4IDIwNmYgNzA2NSA3MjYxIDc0NjkgNmU2NyAyMDczCi0JMHgxMWUwOiAgNzk3MyA3NDY1IDZkMmMgMGE2MiA3NTc0IDIwNjkgNzQyMCA2ODYxCi0JMHgxMWYwOiAgNzMyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQ2OCA2OTZlCi0JMHgxMjAwOiAgNjcyMCA3NDZmIDIwNjQgNmYyMCA3NzY5IDc0NjggMjA3NCA2ODY1Ci0JMHgxMjEwOiAgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyIDZmNmEgNjU2MyA3NDNjCi0JMHgxMjIwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyZTIwIDUwNmMgNjU2MSA3MzY1Ci0JMHgxMjMwOiAgMjA2NCA2ZjIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDNjCi0JMHgxMjQwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyMDYzIDZmNmUgNzQ2MSA2Mzc0Ci0JMHgxMjUwOiAgMjA3NCA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhCi0JMHgxMjYwOiAgNjU2MyA3NDIwIDYxNjIgNmY3NSA3NDIwIDY5NzQgMmUzYyAyZjUwCi0JMHgxMjcwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA2NiA2OTZlCi0JMHgxMjgwOiAgNjQyMCA2MTIwIDYyNzUgNjcyMCA2OTZlIDIwNzQgNjg2OSA3MzIwCi0JMHgxMjkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyYzIwCi0JMHgxMmEwOiAgNmY3MiAyMDY5IDZlMjAgNDE3MCA2MTYzIDY4NjUgMjA2OSA3NDczCi0JMHgxMmIwOiAgNjU2YyA2NjJjIDBhNzAgNmM2NSA2MTczIDY1MjAgNjY2OSA2YzY1Ci0JMHgxMmMwOiAgMjA2MSAyMDYyIDc1NjcgMjA3MiA2NTcwIDZmNzIgNzQyMCA2ZjZlCi0JMHgxMmQwOiAgMjA2OSA3NDJlIDIwMjAgNDk2ZSA3Mzc0IDcyNzUgNjM3NCA2OTZmCi0JMHgxMmUwOiAgNmU3MyAyMDZmIDZlMjAgNjQ2ZiA2OTZlIDY3MjAgNzQ2OCA2OTczCi0JMHgxMmYwOiAgMmMyMCA2MTZlIDY0MjAgNzQ2OCA2NTBhIDZjNjkgNzM3NCAyMDZmCi0JMHgxMzAwOiAgNjYyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhCi0JMHgxMzEwOiAgMmYyZiA2Mjc1IDY3NzMgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyCi0JMHgxMzIwOiAgNjcyZiA3MzcyIDYzM2EgNjE3MCA2MTYzIDY4NjUgMjIzZSA2YjZlCi0JMHgxMzMwOiAgNmY3NyA2ZTIwIDYyNzUgNjc3MyAzYzJmIDQxM2UgMjA2ZiA2NjIwCi0JMHgxMzQwOiAgNzQ2OCA2OTczIDBhNzAgNjE2MyA2YjYxIDY3NjUgMmMyMCA2MzYxCi0JMHgxMzUwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNjkgNmUyMCA3NDY4Ci0JMHgxMzYwOiAgNjUyMCAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCi0JMHgxMzcwOiAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyCi0JMHgxMzgwOiAgNjcyZiA0Mjc1IDY3NzMgMmY1MiA2NTcwIDZmNzIgNzQ2OSA2ZTY3Ci0JMHgxMzkwOiAgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyMDQyIDc1NjcgMjA1NCA3MjYxCi0JMHgxM2EwOiAgNjM2YiA2OTZlIDY3MjAgNTM3OSA3Mzc0IDY1NmQgM2MyZiA0MTNlCi0JMHgxM2IwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2MTZlIDZiNzMgMjA2NiA2ZjcyCi0JMHgxM2MwOiAgMjA3NSA3MzY5IDZlNjcgMjA3NCA2ODY5IDczMjAgNzA2MSA2MzZiCi0JMHgxM2QwOiAgNjE2NyA2NTJjIDIwNjEgNmU2NCAyMDYzIDZmNmUgNjc3MiA2MTc0Ci0JMHgxM2UwOiAgNzU2YyA2MTc0IDY5NmYgNmU3MyAyMDY2IDZmNzIgMjA3OSA2Zjc1Ci0JMHgxM2YwOiAgNzIyMCA2MzY4IDZmNjkgNjM2NSAyMDZmIDY2MGEgNjEyMCA0NDY1Ci0JMHgxNDAwOiAgNjI2OSA2MTZlIDIwNzMgNzk3MyA3NDY1IDZkMjEgM2MyZiA1MDNlCi0JMHgxNDEwOiAgMGEwYSAzYzQ0IDQ5NTYgMjA2MSA2YzY5IDY3NmUgM2QyMiA2MzY1Ci0JMHgxNDIwOiAgNmU3NCA2NTcyIDIyM2UgMGEzYyA2MTIwIDY4NzIgNjU2NiAzZDIyCi0JMHgxNDMwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxCi0JMHgxNDQwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSAwYTNjIDQ5NGQgNDcyMCA2MTZjCi0JMHgxNDUwOiAgNjk2NyA2ZTNkIDIyNmQgNjk2NCA2NDZjIDY1MjIgMjA2OCA2NTY5Ci0JMHgxNDYwOiAgNjc2OCA3NDNkIDIyMzMgMzAyMiAyMDc3IDY5NjQgNzQ2OCAzZDIyCi0JMHgxNDcwOiAgMzIzNSAyMjIwIDczNzIgNjMzZCAyMjY5IDYzNmYgNmU3MyAyZjY0Ci0JMHgxNDgwOiAgNjU2MiA2OTYxIDZlMmYgNmY3MCA2NTZlIDZjNmYgNjc2ZiAyZDMyCi0JMHgxNDkwOiAgMzUyZSA2YTcwIDY3MjIgMjA2MSA2Yzc0IDNkMjIgNDQ2NSA2MjY5Ci0JMHgxNGEwOiAgNjE2ZSAyMjNlIDBhM2MgMmY2MSAzZTBhIDNjNjEgMjA2OCA3MjY1Ci0JMHgxNGIwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTcwCi0JMHgxNGMwOiAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyIDNlMGEgM2M0OSA0ZDQ3Ci0JMHgxNGQwOiAgMjA2MSA2YzY5IDY3NmUgM2QyMiA2ZDY5IDY0NjQgNmM2NSAyMjIwCi0JMHgxNGUwOiAgNjg2NSA2OTY3IDY4NzQgM2QyMiAzMzMyIDIyMjAgNzc2OSA2NDc0Ci0JMHgxNGYwOiAgNjgzZCAyMjMyIDM1MzkgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmCi0JMHgxNTAwOiAgNmU3MyAyZjYxIDcwNjEgNjM2OCA2NTVmIDcwNjIgMmU3MCA2ZTY3Ci0JMHgxNTEwOiAgMjIyMCA2MTZjIDc0M2QgMjI0MSA3MDYxIDYzNjggNjUyMiAzZTBhCi0JMHgxNTIwOiAgM2MyZiA2MTNlIDBhM2MgMmY0NCA0OTU2IDNlMGEgMGEzYyAyMTJkCi0JMHgxNTMwOiAgMmQwYSAyMDIwIDU0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzYxCi0JMHgxNTQwOiAgNzMyMCA2OTZlIDY5NzQgNjk2MSA2YzZjIDc5MjAgNjM3MiA2NTYxCi0JMHgxNTUwOiAgNzQ2NSA2NDIwIDYyNzkgMjA0YSA2ZjY4IDZlNjkgNjUyMCA0OTZlCi0JMHgxNTYwOiAgNjc3MiA2MTZkIDIwMjggNjg3NCA3NDcwIDNhMmYgMmY2ZSA2NTc0Ci0JMHgxNTcwOiAgNjc2ZiA2NDJlIDZlNjUgNzQyZiAyOTBhIDIwMjAgNDk3NCAyMDc3Ci0JMHgxNTgwOiAgNjE3MyAyMDZjIDYxNzQgNjU3MiAyMDY1IDY0NjkgNzQ2NSA2NDIwCi0JMHgxNTkwOiAgNjI3OSAyMDRkIDYxNzQgNzQ2OCA2NTc3IDIwNTcgNjk2YyA2MzZmCi0JMHgxNWEwOiAgNzgyMCA2MTZlIDY0MjAgNGE2ZiA3MzY5IDcwMjAgNTI2ZiA2NDY5Ci0JMHgxNWIwOiAgNmUyZSAwYTIwIDIwNGMgNjE3MyA3NDIwIDZkNmYgNjQ2OSA2NjY5Ci0JMHgxNWMwOiAgNjU2NCAzYTIwIDI0NDQgNjE3NCA2NTNhIDIwMzIgMzAzMCAzNDJmCi0JMHgxNWQwOiAgMzAzNiAyZjMyIDMwMjAgMzEzNSAzYTMzIDMzM2EgMzUzNyAyMDI0Ci0JMHgxNWUwOiAgMmUwYSAyMDIwIDJkMmQgM2UwYSAwYTNjIDJmNDIgNGY0NCA1OTNlCi0JMHgxNWYwOiAgMGEzYyAyZjQ4IDU0NGQgNGMzZSAwYQotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKLQkweDAwMTA6ICAwMDM0IDFiNmUgNDAwMCA0MDA2IDIxNTQgN2YwMCAwMDAxIDdmMDAKLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5IDgwMTAKLQkweDAwMzA6ICAzMDVmIDEwZWEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5IDRkZGMKLQkweDAwNDA6ICA5MjE5Ci0yMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCi0JMHgwMDEwOiAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSA3ZjAwCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSA4MDExCi0JMHgwMDMwOiAgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMSA0ZGRjCi0JMHgwMDQwOiAgOTIxOQotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEgODAxMQotCTB4MDAzMDogIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgNGRkYwotCTB4MDA0MDogIDk3MjEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCi0JMHgwMDEwOiAgMDAzNCAxYjcyIDQwMDAgNDAwNiAyMTUwIDdmMDAgMDAwMSA3ZjAwCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTRhIDM3N2EgYTNhYSA4MDEwCi0JMHgwMDMwOiAgMzA1ZiAwNmQ0IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyA0ZGRjCi0JMHgwMDQwOiAgOTcyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcHJpbnQteHgub3V0IGIvdGVzdHMvcHJpbnQteHgub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjMyM2Q0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL3ByaW50LXh4Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0yMzo1NzozNS45MzgwNjYgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBTIDkyODU0OTI0Njo5Mjg1NDkyNDYoMCkgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDAsbm9wLHdzY2FsZSAyPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwM2MgMWI2OCA0MDAwIDQwMDYgMjE1MiA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZSAwMDAwIDAwMDAgYTAwMgotCTB4MDAzMDogIDdmZmYgMTQyMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYwotCTB4MDA0MDogIDkyMTYgMDAwMCAwMDAwIDAxMDMgMDMwMgotMjM6NTc6MzUuOTM4MTIyIElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogUyA5MzA3Nzg2MDk6OTMwNzc4NjA5KDApIGFjayA5Mjg1NDkyNDcgd2luIDMyNzY3IDxtc3MgMTYzOTYsc2Fja09LLHRpbWVzdGFtcCAxMzA2MzAwOTUwIDEzMDYzMDA5NTAsbm9wLHdzY2FsZSAyPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwM2MgMDAwMCA0MDAwIDQwMDYgM2NiYSA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgOGRmMSAzNzU4IDg5N2YgYTAxMgotCTB4MDAzMDogIDdmZmYgNmViMSAwMDAwIDAyMDQgNDAwYyAwNDAyIDA4MGEgNGRkYwotCTB4MDA0MDogIDkyMTYgNGRkYyA5MjE2IDAxMDMgMDMwMgotMjM6NTc6MzUuOTM4MTY3IElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MCAxMzA2MzAwOTUwPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwMzQgMWI2YSA0MDAwIDQwMDYgMjE1OCA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxMAotCTB4MDAzMDogIDIwMDAgMzdkMCAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTYgNGRkYwotCTB4MDA0MDogIDkyMTYKLTIzOjU3OjM1LjkzOTQyMyBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IFAgMToyMDMoMjAyKSBhY2sgMSB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMDk1MSAxMzA2MzAwOTUwPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwZmUgMWI2YyA0MDAwIDQwMDYgMjA4YyA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgZGE3MCAwMDUwIDM3NTggODk3ZiAzNzdhIDhkZjIgODAxOAotCTB4MDAzMDogIDIwMDAgZmVmMiAwMDAwIDAxMDEgMDgwYSA0ZGRjIDkyMTcgNGRkYwotCTB4MDA0MDogIDkyMTYgNDc0NSA1NDIwIDJmMjAgNDg1NCA1NDUwIDJmMzEgMmUzMQotCTB4MDA1MDogIDBkMGEgNDg2ZiA3Mzc0IDNhMjAgNmM2ZiA2MzYxIDZjNjggNmY3MwotCTB4MDA2MDogIDc0MGQgMGE1NSA3MzY1IDcyMmQgNDE2NyA2NTZlIDc0M2EgMjA0NQotCTB4MDA3MDogIDRjNjkgNmU2YiA3MzJmIDMwMmUgMzEzMCAyZTM0IDJkMzcgMmQ2NAotCTB4MDA4MDogIDY1NjIgNjk2MSA2ZTIwIDI4NzQgNjU3OCA3NDZkIDZmNjQgNjUzYgotCTB4MDA5MDogIDIwNGMgNjk2ZSA3NTc4IDIwMzIgMmUzNiAyZTMxIDMxMmQgMzEyZAotCTB4MDBhMDogIDM2MzggMzYyZCA3MzZkIDcwMjAgNjkzNiAzODM2IDNiMjAgMzEzMwotCTB4MDBiMDogIDMyNzggMzUzNiAyZDMyIDI5MGQgMGE0MSA2MzYzIDY1NzAgNzQzYQotCTB4MDBjMDogIDIwMmEgMmYyYSAwZDBhIDQxNjMgNjM2NSA3MDc0IDJkNDUgNmU2MwotCTB4MDBkMDogIDZmNjQgNjk2ZSA2NzNhIDIwNjcgN2E2OSA3MDBkIDBhNDEgNjM2MwotCTB4MDBlMDogIDY1NzAgNzQyZCA0YzYxIDZlNjcgNzU2MSA2NzY1IDNhMjAgNjU2ZQotCTB4MDBmMDogIDBkMGEgNDM2ZiA2ZTZlIDY1NjMgNzQ2OSA2ZjZlIDNhMjAgNGI2NQotCTB4MDEwMDogIDY1NzAgMmQ0MSA2YzY5IDc2NjUgMGQwYSAwZDBhCi0yMzo1NzozNS45NDA0NzQgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiAuIGFjayAyMDMgd2luIDgxOTIgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTIgMTMwNjMwMDk1MT4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKLQkweDAwMTA6ICAwMDM0IDFmZTQgNDAwMCA0MDA2IDFjZGUgN2YwMCAwMDAxIDdmMDAKLQkweDAwMjA6ICAwMDAxIDAwNTAgZGE3MCAzNzdhIDhkZjIgMzc1OCA4YTQ5IDgwMTAKLQkweDAwMzA6ICAyMDAwIDM3MDMgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE4IDRkZGMKLQkweDAwNDA6ICA5MjE3Ci0yMzo1NzozNS45NDEyMzIgSVAgMTI3LjAuMC4xLjgwID4gMTI3LjAuMC4xLjU1OTIwOiBQIDE6NTU2MCg1NTU5KSBhY2sgMjAzIHdpbiA4MTkyIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAwOTUzIDEzMDYzMDA5NTE+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCi0JMHgwMDEwOiAgMTVlYiAxZmU2IDQwMDAgNDAwNiAwNzI1IDdmMDAgMDAwMSA3ZjAwCi0JMHgwMDIwOiAgMDAwMSAwMDUwIGRhNzAgMzc3YSA4ZGYyIDM3NTggOGE0OSA4MDE4Ci0JMHgwMDMwOiAgMjAwMCAxM2UwIDAwMDAgMDEwMSAwODBhIDRkZGMgOTIxOSA0ZGRjCi0JMHgwMDQwOiAgOTIxNyA0ODU0IDU0NTAgMmYzMSAyZTMxIDIwMzIgMzAzMCAyMDRmCi0JMHgwMDUwOiAgNGIwZCAwYTQ0IDYxNzQgNjUzYSAyMDU3IDY1NjQgMmMyMCAzMDM2Ci0JMHgwMDYwOiAgMjA0YSA3NTZjIDIwMzIgMzAzMCAzNTIwIDMwMzMgM2EzNSAzNzNhCi0JMHgwMDcwOiAgMzMzNSAyMDQ3IDRkNTQgMGQwYSA1MzY1IDcyNzYgNjU3MiAzYTIwCi0JMHgwMDgwOiAgNDE3MCA2MTYzIDY4NjUgMmYzMSAyZTMzIDJlMzMgMzMwZCAwYTRjCi0JMHgwMDkwOiAgNjE3MyA3NDJkIDRkNmYgNjQ2OSA2NjY5IDY1NjQgM2EyMCA1Mzc1Ci0JMHgwMGEwOiAgNmUyYyAyMDMxIDM1MjAgNDE3NSA2NzIwIDMyMzAgMzAzNCAyMDMwCi0JMHgwMGIwOiAgMzAzYSAzNDMzIDNhMzQgMzEyMCA0NzRkIDU0MGQgMGE0NSA1NDYxCi0JMHgwMGMwOiAgNjczYSAyMDIyIDM2NjUgMzgzMCA2NjMwIDJkMzEgMzQzOCA2MTJkCi0JMHgwMGQwOiAgMzQzMSAzMTY1IDYyMzEgNjI2NCAyMjBkIDBhNDEgNjM2MyA2NTcwCi0JMHgwMGUwOiAgNzQyZCA1MjYxIDZlNjcgNjU3MyAzYTIwIDYyNzkgNzQ2NSA3MzBkCi0JMHgwMGYwOiAgMGE0MyA2ZjZlIDc0NjUgNmU3NCAyZDRjIDY1NmUgNjc3NCA2ODNhCi0JMHgwMTAwOiAgMjAzNSAzMjM1IDM4MGQgMGE0YiA2NTY1IDcwMmQgNDE2YyA2OTc2Ci0JMHgwMTEwOiAgNjUzYSAyMDc0IDY5NmQgNjU2ZiA3NTc0IDNkMzEgMzUyYyAyMDZkCi0JMHgwMTIwOiAgNjE3OCAzZDMxIDMwMzAgMGQwYSA0MzZmIDZlNmUgNjU2MyA3NDY5Ci0JMHgwMTMwOiAgNmY2ZSAzYTIwIDRiNjUgNjU3MCAyZDQxIDZjNjkgNzY2NSAwZDBhCi0JMHgwMTQwOiAgNDM2ZiA2ZTc0IDY1NmUgNzQyZCA1NDc5IDcwNjUgM2EyMCA3NDY1Ci0JMHgwMTUwOiAgNzg3NCAyZjY4IDc0NmQgNmMzYiAyMDYzIDY4NjEgNzI3MyA2NTc0Ci0JMHgwMTYwOiAgM2Q2OSA3MzZmIDJkMzggMzgzNSAzOTJkIDMxMGQgMGEwZCAwYTNjCi0JMHgwMTcwOiAgMjE0NCA0ZjQzIDU0NTkgNTA0NSAyMDQ4IDU0NGQgNGMyMCA1MDU1Ci0JMHgwMTgwOiAgNDI0YyA0OTQzIDIwMjIgMmQyZiAyZjU3IDMzNDMgMmYyZiA0NDU0Ci0JMHgwMTkwOiAgNDQyMCA0ODU0IDRkNGMgMjAzNCAyZTMwIDMxMjAgNTQ3MiA2MTZlCi0JMHgwMWEwOiAgNzM2OSA3NDY5IDZmNmUgNjE2YyAyZjJmIDQ1NGUgMjIzZSAwYTNjCi0JMHgwMWIwOiAgNDg1NCA0ZDRjIDNlMGEgM2M0OCA0NTQxIDQ0M2UgMGEyMCAyMDIwCi0JMHgwMWMwOiAgM2M0ZCA0NTU0IDQxMjAgNDg1NCA1NDUwIDJkNDUgNTE1NSA0OTU2Ci0JMHgwMWQwOiAgM2QyMiA0MzZmIDZlNzQgNjU2ZSA3NDJkIDU0NzkgNzA2NSAyMjIwCi0JMHgwMWUwOiAgNDM0ZiA0ZTU0IDQ1NGUgNTQzZCAyMjc0IDY1NzggNzQyZiA2ODc0Ci0JMHgwMWYwOiAgNmQ2YyAzYjIwIDYzNjggNjE3MiA3MzY1IDc0M2QgNjk3MyA2ZjJkCi0JMHgwMjAwOiAgMzgzOCAzNTM5IDJkMzEgMjIzZSAwYTIwIDIwMjAgM2M0ZCA0NTU0Ci0JMHgwMjEwOiAgNDEyMCA0ZTQxIDRkNDUgM2QyMiA0NDY1IDczNjMgNzI2OSA3MDc0Ci0JMHgwMjIwOiAgNjk2ZiA2ZTIyIDIwNDMgNGY0ZSA1NDQ1IDRlNTQgM2QyMiA1NDY4Ci0JMHgwMjMwOiAgNjUyMCA2OTZlIDY5NzQgNjk2MSA2YzIwIDY5NmUgNzM3NCA2MTZjCi0JMHgwMjQwOiAgNmM2MSA3NDY5IDZmNmUgMjA2ZiA2NjIwIDQ0NjUgNjI2OSA2MTZlCi0JMHgwMjUwOiAgMjA2MSA3MDYxIDYzNjggNjUyZSAyMjNlIDBhMjAgMjAyMCAzYzU0Ci0JMHgwMjYwOiAgNDk1NCA0YzQ1IDNlNTAgNmM2MSA2MzY1IDY4NmYgNmM2NCA2NTcyCi0JMHgwMjcwOiAgMjA3MCA2MTY3IDY1M2MgMmY1NCA0OTU0IDRjNDUgM2UwYSAzYzJmCi0JMHgwMjgwOiAgNDg0NSA0MTQ0IDNlMGEgM2M0MiA0ZjQ0IDU5MjAgNTQ0NSA1ODU0Ci0JMHgwMjkwOiAgM2QyMiAyMzMwIDMwMzAgMzAzMCAzMDIyIDIwNDIgNDc0MyA0ZjRjCi0JMHgwMmEwOiAgNGY1MiAzZDIyIDIzNDYgNDY0NiA0NjQ2IDQ2MjIgMjA0YyA0OTRlCi0JMHgwMmIwOiAgNGIzZCAyMjIzIDMwMzAgMzAzMCA0NTQ2IDIyMjAgNTY0YyA0OTRlCi0JMHgwMmMwOiAgNGIzZCAyMjIzIDM1MzUgMzEzOCAzODQxIDIyMjAgNDE0YyA0OTRlCi0JMHgwMmQwOiAgNGIzZCAyMjIzIDQ2NDYgMzAzMCAzMDMwIDIyM2UgMGEwYSAzYzQ4Ci0JMHgwMmUwOiAgMzEzZSA1MDZjIDYxNjMgNjU2OCA2ZjZjIDY0NjUgNzIyMCA3MDYxCi0JMHgwMmYwOiAgNjc2NSAzYzJmIDQ4MzEgM2UwYSAzYzQ4IDMyM2UgNDk2NiAyMDc5Ci0JMHgwMzAwOiAgNmY3NSAyMDYxIDcyNjUgMjA2YSA3NTczIDc0MjAgNjI3MiA2Zjc3Ci0JMHgwMzEwOiAgNzM2OSA2ZTY3IDIwNzQgNjg2NSAyMDc3IDY1NjIgM2MyZiA2ODMyCi0JMHgwMzIwOiAgM2UwYSAwYTNjIDUwM2UgNTQ2OCA2NTIwIDZmNzcgNmU2NSA3MjIwCi0JMHgwMzMwOiAgNmY2NiAyMDc0IDY4NjkgNzMyMCA3NzY1IDYyMjAgNzM2OSA3NDY1Ci0JMHgwMzQwOiAgMjA2OCA2MTczIDIwNmUgNmY3NCAyMDcwIDc1NzQgMjA3NSA3MDIwCi0JMHgwMzUwOiAgNjE2ZSA3OTIwIDc3NjUgNjIyMCA3MDYxIDY3NjUgNzMyMCA3OTY1Ci0JMHgwMzYwOiAgNzQyZSAwYTUwIDZjNjUgNjE3MyA2NTIwIDYzNmYgNmQ2NSAyMDYyCi0JMHgwMzcwOiAgNjE2MyA2YjIwIDZjNjEgNzQ2NSA3MjJlIDNjMmYgNTAzZSAwYTBhCi0JMHgwMzgwOiAgM2M1MCAzZTNjIDUzNGQgNDE0YyA0YzNlIDNjNDMgNDk1NCA0NTNlCi0JMHgwMzkwOiAgNGQ2ZiA3NjY1IDIwNjEgNmM2ZiA2ZTY3IDJjMjAgNmU2ZiA3NDY4Ci0JMHgwM2EwOiAgNjk2ZSA2NzIwIDc0NmYgMjA3MyA2NTY1IDIwNjggNjU3MiA2NTJlCi0JMHgwM2IwOiAgMmUyZSAzYzJmIDQzNDkgNTQ0NSAzZTIwIDNhMmQgMjkzYyAyZjUzCi0JMHgwM2MwOiAgNGQ0MSA0YzRjIDNlM2MgMmY1MCAzZTBhIDBhM2MgNDgzMiAzZTQ5Ci0JMHgwM2QwOiAgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwIDc0NzIgNzk2OSA2ZTY3Ci0JMHgwM2UwOiAgMjA3NCA2ZjIwIDZjNmYgNjM2MSA3NDY1IDIwNzQgNjg2NSAyMDYxCi0JMHgwM2YwOiAgNjQ2ZCA2OTZlIDY5NzMgNzQ3MiA2MTc0IDZmNzIgMjA2ZiA2NjIwCi0JMHgwNDAwOiAgNzQ2OCA2OTczIDIwNmQgNjE2MyA2ODY5IDZlNjUgM2MyZiA0ODMyCi0JMHgwNDEwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA3NyA2MTZlCi0JMHgwNDIwOiAgNzQyMCA3NDZmIDIwNzIgNjU3MCA2ZjcyIDc0MjAgNzM2ZiA2ZDY1Ci0JMHgwNDMwOiAgNzQ2OCA2OTZlIDY3MjAgNjE2MiA2Zjc1IDc0MjAgNzQ2OCA2OTczCi0JMHgwNDQwOiAgMjA2OCA2ZjczIDc0MjcgNzMyMCA2MjY1IDY4NjEgNzY2OSA2ZjcyCi0JMHgwNDUwOiAgMmMyMCA3MDZjIDY1NjEgNzM2NSAwYTYzIDZmNmUgNzQ2MSA2Mzc0Ci0JMHgwNDYwOiAgMjA3NCA2ODY1IDIwNDkgNmU3NCA2NTcyIDZlNjUgNzQyMCA1MzY1Ci0JMHgwNDcwOiAgNzI3NiA2OTYzIDY1MjAgNTA3MiA2Zjc2IDY5NjQgNjU3MiAyMDI4Ci0JMHgwNDgwOiAgNDk1MyA1MDI5IDIwNjkgNmU3NiA2ZjZjIDc2NjUgNjQyMCA2NDY5Ci0JMHgwNDkwOiAgNzI2NSA2Mzc0IDZjNzkgMmUzYyAyZjUwIDNlMGEgMGEzYyA1MDNlCi0JMHgwNGEwOiAgNTM2NSA2NTIwIDc0NjggNjUyMCAzYzQxIDIwNjggNzI2NSA2NjNkCi0JMHgwNGIwOiAgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3IDc3MmUgNjE2MiA3NTczCi0JMHgwNGMwOiAgNjUyZSA2ZTY1IDc0MmYgMjIzZSA0ZTY1IDc0NzcgNmY3MiA2YjIwCi0JMHgwNGQwOiAgNDE2MiA3NTczIDY1MGEgNDM2YyA2NTYxIDcyNjkgNmU2NyA2ODZmCi0JMHgwNGUwOiAgNzU3MyA2NTNjIDJmNDEgM2UyMCA2NjZmIDcyMjAgNjg2ZiA3NzIwCi0JMHgwNGYwOiAgNzQ2ZiAyMDY0IDZmMjAgNzQ2OCA2OTczIDJlM2MgMmY1MCAzZTBhCi0JMHgwNTAwOiAgMGEzYyA0ODMyIDNlNDkgNjYyMCA3OTZmIDc1MjAgNjE3MiA2NTIwCi0JMHgwNTEwOiAgNzQ2OCA2NTIwIDYxNjQgNmQ2OSA2ZTY5IDczNzQgNzI2MSA3NDZmCi0JMHgwNTIwOiAgNzIyMCA2ZjY2IDIwNzQgNjg2OSA3MzIwIDZkNjEgNjM2OCA2OTZlCi0JMHgwNTMwOiAgNjUzYyAyZjQ4IDMyM2UgMGEwYSAzYzUwIDNlNTQgNjg2NSAyMDY5Ci0JMHgwNTQwOiAgNmU2OSA3NDY5IDYxNmMgMjA2OSA2ZTczIDc0NjEgNmM2YyA2MTc0Ci0JMHgwNTUwOiAgNjk2ZiA2ZTIwIDZmNjYgMjAzYyA0MTIwIDY4NzIgNjU2NiAzZDIyCi0JMHgwNTYwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxCi0JMHgwNTcwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyNzczCi0JMHgwNTgwOiAgMGE2MSA3MDYxIDYzNjggNjUzYyAyZjQxIDNlMjAgNzc2NSA2MjIwCi0JMHgwNTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDc3Ci0JMHgwNWEwOiAgNjE3MyAyMDczIDc1NjMgNjM2NSA3MzczIDY2NzUgNmMyZSAzYzJmCi0JMHgwNWIwOiAgNTAzZSAwYTBhIDNjNTAgM2UzYyA1MzU0IDUyNGYgNGU0NyAzZTU5Ci0JMHgwNWMwOiAgNmY3NSAyMDczIDY4NmYgNzU2YyA2NDIwIDcyNjUgNzA2YyA2MTYzCi0JMHgwNWQwOiAgNjUyMCA3NDY4IDY5NzMgMjA3MCA2MTY3IDY1MjAgNzc2OSA3NDY4Ci0JMHgwNWUwOiAgMjA3OSA2Zjc1IDcyMjAgNmY3NyA2ZTIwIDc3NjUgNjIyMCA3MDYxCi0JMHgwNWYwOiAgNjc2NSA3MzIwIDYxNzMgMGE3MyA2ZjZmIDZlMjAgNjE3MyAyMDcwCi0JMHgwNjAwOiAgNmY3MyA3MzY5IDYyNmMgNjUyZSAzYzJmIDUzNTQgNTI0ZiA0ZTQ3Ci0JMHgwNjEwOiAgM2UzYyAyZjUwIDNlMGEgMGEzYyA1MDNlIDU1NmUgNmM2NSA3MzczCi0JMHgwNjIwOiAgMjA3OSA2Zjc1IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2OSA3NDczCi0JMHgwNjMwOiAgMjA2MyA2ZjZlIDY2NjkgNjc3NSA3MjYxIDc0NjkgNmY2ZSAyYzIwCi0JMHgwNjQwOiAgNzk2ZiA3NTcyIDIwNmUgNjU3NyAyMDczIDY1NzIgNzY2NSA3MjIwCi0JMHgwNjUwOiAgNjk3MyAyMDYzIDZmNmUgNjY2OSA2Nzc1IDcyNjUgNjQyMCA2MTczCi0JMHgwNjYwOiAgMjA2NiA2ZjZjIDZjNmYgNzc3MyAzYTBhIDNjNTUgNGMzZSAwYTNjCi0JMHgwNjcwOiAgNGM0OSAzZTBhIDQzNmYgNmU2NiA2OTY3IDc1NzIgNjE3NCA2OTZmCi0JMHgwNjgwOiAgNmUyMCA2NjY5IDZjNjUgNzMyMCA2MzYxIDZlMjAgNjI2NSAyMDY2Ci0JMHgwNjkwOiAgNmY3NSA2ZTY0IDIwNjkgNmUyMCAzYzU0IDU0M2UgMmY2NSA3NDYzCi0JMHgwNmEwOiAgMmY2MSA3MDYxIDYzNjggNjUzYyAyZjU0IDU0M2UgMmUzYyAyZjRjCi0JMHgwNmIwOiAgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA1NDU0Ci0JMHgwNmMwOiAgM2U0NCA2ZjYzIDc1NmQgNjU2ZSA3NDUyIDZmNmYgNzQzYyAyZjU0Ci0JMHgwNmQwOiAgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwIDY5NzMgMjA3NCA2ODY1Ci0JMHgwNmUwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNzUgNmU2NCA2NTcyCi0JMHgwNmYwOiAgMjA3NyA2ODY5IDYzNjggMjA2MSA2YzZjIDIwNzkgNmY3NSA3MjBhCi0JMHgwNzAwOiAgNDg1NCA0ZDRjIDIwNjYgNjk2YyA2NTczIDIwNzMgNjg2ZiA3NTZjCi0JMHgwNzEwOiAgNjQyMCA2NTc4IDY5NzMgNzQyYyAyMDY5IDczMjAgNzM2NSA3NDIwCi0JMHgwNzIwOiAgNzQ2ZiAyMDNjIDU0NTQgM2UyZiA3NjYxIDcyMmYgNzc3NyA3NzNjCi0JMHgwNzMwOiAgMmY1NCA1NDNlIDJlM2MgMmY0YyA0OTNlIDBhMGEgM2M0YyA0OTNlCi0JMHgwNzQwOiAgMGE0MyA0NzQ5IDIwNzMgNjM3MiA2OTcwIDc0NzMgMjA2MSA3MjY1Ci0JMHgwNzUwOiAgMjA2YyA2ZjZmIDZiNjUgNjQyMCA2NjZmIDcyMjAgNjk2ZSAyMDNjCi0JMHgwNzYwOiAgNTQ1NCAzZTJmIDc1NzMgNzIyZiA2YzY5IDYyMmYgNjM2NyA2OTJkCi0JMHgwNzcwOiAgNjI2OSA2ZTNjIDJmNTQgNTQzZSAyYzIwIDc3NjggNjk2MyA2ODIwCi0JMHgwNzgwOiAgNjk3MyAyMDc3IDY4NjUgNzI2NSAwYTQ0IDY1NjIgNjk2MSA2ZTIwCi0JMHgwNzkwOiAgNzA2MSA2MzZiIDYxNjcgNjU3MyAyMDc3IDY5NmMgNmMyMCA3MDZjCi0JMHgwN2EwOiAgNjE2MyA2NTIwIDc0NjggNjU2OSA3MjIwIDczNjMgNzI2OSA3MDc0Ci0JMHgwN2IwOiAgNzMyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA0YzZmCi0JMHgwN2MwOiAgNjcyMCA2NjY5IDZjNjUgNzMyMCA2MTcyIDY1MjAgNzA2YyA2MTYzCi0JMHgwN2QwOiAgNjU2NCAyMDY5IDZlMjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjZjCi0JMHgwN2UwOiAgNmY2NyAyZjYxIDcwNjEgNjM2OCA2NTNjIDJmNTQgNTQzZSAyYzIwCi0JMHgwN2YwOiAgNjE2ZSA2NDIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNzI2ZiA3NDYxCi0JMHgwODAwOiAgNzQ2NSA2NDBhIDc3NjUgNjU2YiA2Yzc5IDJlMjAgMjA1NCA2ODY1Ci0JMHgwODEwOiAgMjA2NiA3MjY1IDcxNzUgNjU2ZSA2Mzc5IDIwNmYgNjYyMCA3MjZmCi0JMHgwODIwOiAgNzQ2MSA3NDY5IDZmNmUgMjA2MyA2MTZlIDIwNjIgNjUyMCA2NTYxCi0JMHgwODMwOiAgNzM2OSA2Yzc5IDIwNjMgNjg2MSA2ZTY3IDY1NjQgMjA2MiA3OTIwCi0JMHgwODQwOiAgNjU2NCA2OTc0IDY5NmUgNjcwYSAzYzU0IDU0M2UgMmY2NSA3NDYzCi0JMHgwODUwOiAgMmY2YyA2ZjY3IDcyNmYgNzQ2MSA3NDY1IDJlNjQgMmY2MSA3MDYxCi0JMHgwODYwOiAgNjM2OCA2NTNjIDJmNTQgNTQzZSAyZTNjIDJmNGMgNDkzZSAwYTBhCi0JMHgwODcwOiAgM2M0YyA0OTNlIDBhNTQgNjg2NSAyMDY0IDY1NjYgNjE3NSA2Yzc0Ci0JMHgwODgwOiAgMjA2NCA2OTcyIDY1NjMgNzQ2ZiA3Mjc5IDIwNjkgNmU2NCA2NTc4Ci0JMHgwODkwOiAgMjA2OSA3MzIwIDNjNTQgNTQzZSA2OTZlIDY0NjUgNzgyZSA2ODc0Ci0JMHgwOGEwOiAgNmQ2YyAzYzJmIDU0NTQgM2UyYyAyMDZkIDY1NjEgNmU2OSA2ZTY3Ci0JMHgwOGIwOiAgMjA3NCA2ODYxIDc0MjAgNzI2NSA3MTc1IDY1NzMgNzQ3MyAwYTY2Ci0JMHgwOGMwOiAgNmY3MiAyMDYxIDIwNjQgNjk3MiA2NTYzIDc0NmYgNzI3OSAyMDNjCi0JMHgwOGQwOiAgNTQ1NCAzZTJmIDY2NmYgNmYyZiA2MjYxIDcyMmYgM2MyZiA1NDU0Ci0JMHgwOGUwOiAgM2UyMCA3NzY5IDZjNmMgMjA2NyA2OTc2IDY1MjAgNzQ2OCA2NTIwCi0JMHgwOGYwOiAgNjM2ZiA2ZTc0IDY1NmUgNzQ3MyAyMDZmIDY2MjAgNzQ2OCA2NTIwCi0JMHgwOTAwOiAgNjY2OSA2YzY1IDIwM2MgNTQ1NCAzZTJmIDc2NjEgNzIyZiA3Nzc3Ci0JMHgwOTEwOiAgNzcyZiA2NjZmIDZmMmYgNjI2MSA3MjJmIDY5NmUgNjQ2NSA3ODJlCi0JMHgwOTIwOiAgNjg3NCA2ZDZjIDNjMmYgNTQ1NCAzZTBhIDY5NjYgMjA2OSA3NDIwCi0JMHgwOTMwOiAgNjU3OCA2OTczIDc0NzMgMjAyOCA2MTczIDczNzUgNmQ2OSA2ZTY3Ci0JMHgwOTQwOiAgMjA3NCA2ODYxIDc0MjAgM2M1NCA1NDNlIDJmNzYgNjE3MiAyZjc3Ci0JMHgwOTUwOiAgNzc3NyAzYzJmIDU0NTQgM2UyMCA2OTczIDIwNzkgNmY3NSA3MjIwCi0JMHgwOTYwOiAgM2M1NCA1NDNlIDQ0NmYgNjM3NSA2ZDY1IDZlNzQgNTI2ZiA2Zjc0Ci0JMHgwOTcwOiAgM2MyZiA1NDU0IDNlMjkgMmUzYyAyZjRjIDQ5M2UgMGEwYSAzYzRjCi0JMHgwOTgwOiAgNDkzZSAwYTU1IDczNjUgNzIyMCA2NDY5IDcyNjUgNjM3NCA2ZjcyCi0JMHgwOTkwOiAgNjk2NSA3MzIwIDYxNzIgNjUyMCA2NTZlIDYxNjIgNmM2NSA2NDJjCi0JMHgwOWEwOiAgMjA2MSA2ZTY0IDIwNzUgNzM2NSA3MjIwIDY0NmYgNjM3NSA2ZDY1Ci0JMHgwOWIwOiAgNmU3NCA3MzIwIDc3NjkgNmM2YyAyMDYyIDY1MjAgNmM2ZiA2ZjZiCi0JMHgwOWMwOiAgNjU2NCAyMDY2IDZmNzIgMGE2OSA2ZTIwIDc0NjggNjUyMCAzYzU0Ci0JMHgwOWQwOiAgNTQzZSA3MDc1IDYyNmMgNjk2MyA1ZjY4IDc0NmQgNmMzYyAyZjU0Ci0JMHgwOWUwOiAgNTQzZSAyMDY0IDY5NzIgNjU2MyA3NDZmIDcyNzkgMjA2ZiA2NjIwCi0JMHgwOWYwOiAgNzQ2OCA2NTIwIDc1NzMgNjU3MiA3MzI3IDIwNjggNmY2ZCA2NTczCi0JMHgwYTAwOiAgMmUyMCAyMDU0IDY4NjUgNzM2NSAyMDY0IDY5NzIgNzMwYSA3MzY4Ci0JMHgwYTEwOiAgNmY3NSA2YzY0IDIwNjIgNjUyMCA3NTZlIDY0NjUgNzIyMCAzYzU0Ci0JMHgwYTIwOiAgNTQzZSAyZjY4IDZmNmQgNjUzYyAyZjU0IDU0M2UgMmMyMCA2MTZlCi0JMHgwYTMwOiAgNjQyMCA3NTczIDY1NzIgNzMyMCA3NzY5IDZjNmMgMjA2ZSA2Zjc0Ci0JMHgwYTQwOiAgMjA2MiA2NTIwIDYxNjIgNmM2NSAyMDc0IDZmMjAgNzM3OSA2ZDZjCi0JMHgwYTUwOiAgNjk2ZSA2YjBhIDc0NmYgMjA2NiA2OTZjIDY1NzMgMjA3NCA2ODY1Ci0JMHgwYTYwOiAgNzkyMCA2NDZmIDZlMjcgNzQyMCA2Zjc3IDZlMmUgM2MyZiA0YzQ5Ci0JMHgwYTcwOiAgM2UwYSAwYTNjIDJmNTUgNGMzZSAwYTQxIDZjNmMgMjA3NCA2ODY1Ci0JMHgwYTgwOiAgMjA3MyA3NDYxIDZlNjQgNjE3MiA2NDIwIDYxNzAgNjE2MyA2ODY1Ci0JMHgwYTkwOiAgMjA2ZCA2ZjY0IDc1NmMgNjU3MyAyMDYxIDcyNjUgMjA2MSA3NjYxCi0JMHgwYWEwOiAgNjk2YyA2MTYyIDZjNjUgMjA3NyA2OTc0IDY4MjAgNzQ2OCA2OTczCi0JMHgwYWIwOiAgMjA3MiA2NTZjIDY1NjEgNzM2NSAyMDYxIDZlNjQgMjA2MSA3MjY1Ci0JMHgwYWMwOiAgMGE2ZSA2Zjc3IDIwNmQgNjE2ZSA2MTY3IDY1NjQgMjA3NyA2OTc0Ci0JMHgwYWQwOiAgNjgyMCA2NDY1IDYyNjMgNmY2ZSA2NjJlIDIwMjAgNTQ3OSA3MDY1Ci0JMHgwYWUwOiAgMjAzYyA1NDU0IDNlNjQgNzA2YiA2NzJkIDcyNjUgNjM2ZiA2ZTY2Ci0JMHgwYWYwOiAgNjk2NyA3NTcyIDY1MjAgNjE3MCA2MTYzIDY4NjUgM2MyZiA1NDU0Ci0JMHgwYjAwOiAgM2UyMCA3NDZmIDBhNzMgNjU2YyA2NTYzIDc0MjAgNzc2OCA2OTYzCi0JMHgwYjEwOiAgNjgyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwIDc5NmYgNzUyMCA3NzYxCi0JMHgwYjIwOiAgNmU3NCAyMDY1IDZlNjEgNjI2YyA2NTY0IDJlMjAgMjA0ZCA2MTZlCi0JMHgwYjMwOiAgNzkyMCA2Zjc0IDY4NjUgNzIyMCA2ZDZmIDY0NzUgNmM2NSA3MzIwCi0JMHgwYjQwOiAgNjE3MiA2NTIwIDYxNzYgNjE2OSA2YzYxIDYyNmMgNjUwYSA3NDY4Ci0JMHgwYjUwOiAgNzI2ZiA3NTY3IDY4MjAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlCi0JMHgwYjYwOiAgMjA3MCA2MTYzIDZiNjEgNjc2NSAyMDczIDc5NzMgNzQ2NSA2ZDIwCi0JMHgwYjcwOiAgNzc2OSA3NDY4IDIwNzQgNjg2NSAyMDZlIDYxNmQgNjU3MyAyMDNjCi0JMHgwYjgwOiAgNTQ1NCAzZTZjIDY5NjIgNjE3MCA2MTYzIDY4NjUgMmQ2ZCA2ZjY0Ci0JMHgwYjkwOiAgMmQyYSAzYzJmIDU0NTQgM2UyZSAwYTQ5IDY2MjAgNzk2ZiA3NTIwCi0JMHgwYmEwOiAgNmU2NSA2NTY0IDIwNzQgNmYyMCA2MzZmIDZkNzAgNjk2YyA2NTIwCi0JMHgwYmIwOiAgNjEyMCA2ZDZmIDY0NzUgNmM2NSAyMDc5IDZmNzUgNzI3MyA2NTZjCi0JMHgwYmMwOiAgNjYyYyAyMDc5IDZmNzUgMjA3NyA2OTZjIDZjMjAgNmU2NSA2NTY0Ci0JMHgwYmQwOiAgMjA3NCA2ZjIwIDY5NmUgNzM3NCA2MTZjIDZjMjAgNzQ2OCA2NTBhCi0JMHgwYmUwOiAgM2M1NCA1NDNlIDYxNzAgNjE2MyA2ODY1IDJkNjQgNjU3NiAzYzJmCi0JMHgwYmYwOiAgNTQ1NCAzZTIwIDcwNjEgNjM2YiA2MTY3IDY1MmUgMGEwYSAzYzUwCi0JMHgwYzAwOiAgM2U0ZCA2ZjcyIDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0Ci0JMHgwYzEwOiAgNjk2ZiA2ZTIwIDZmNmUgMjA0MSA3MDYxIDYzNjggNjUyMCA2MzYxCi0JMHgwYzIwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNmYgNmUzYSAwYTNjCi0JMHgwYzMwOiAgNTU0YyAzZTBhIDNjNGMgNDkzZSAwYTU0IDY4NjUgMjAzYyA0MTIwCi0JMHgwYzQwOiAgNDg1MiA0NTQ2IDNkMjIgMmY2NCA2ZjYzIDJmNjEgNzA2MSA2MzY4Ci0JMHgwYzUwOiAgNjUyZCA2NDZmIDYzMmYgNmQ2MSA2ZTc1IDYxNmMgMmYyMiAzZTQxCi0JMHgwYzYwOiAgNzA2MSA2MzY4IDY1MjAgNjQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0Ci0JMHgwYzcwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3Mzc0IDZmNzIgNjU2NCAyMDZmCi0JMHgwYzgwOiAgNmUyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyZSAzYzJmCi0JMHgwYzkwOiAgNGM0OSAzZTBhIDBhM2MgNGM0OSAzZTBhIDU0NjggNjUyMCAzYzQxCi0JMHgwY2EwOiAgMjA0OCA1MjQ1IDQ2M2QgMjI2OCA3NDc0IDcwM2EgMmYyZiA3Nzc3Ci0JMHgwY2IwOiAgNzcyZSA2MTcwIDYxNjMgNjg2NSAyZTZmIDcyNjcgMmYyMiAzZTQxCi0JMHgwY2MwOiAgNzA2MSA2MzY4IDY1MjAgNTA3MiA2ZjZhIDY1NjMgNzQzYyAyZjQxCi0JMHgwY2QwOiAgM2UyMCA2ODZmIDZkNjUgMjA3MyA2OTc0IDY1MmUgM2MyZiA0YzQ5Ci0JMHgwY2UwOiAgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4IDY1MjAgM2M0MSAyMDQ4Ci0JMHgwY2YwOiAgNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhIDJmMmYgNzc3NyA3NzJlCi0JMHgwZDAwOiAgNjE3MCA2MTYzIDY4NjUgMmQ3MyA3MzZjIDJlNmYgNzI2NyAyZjIyCi0JMHgwZDEwOiAgM2U0MSA3MDYxIDYzNjggNjUyZCA1MzUzIDRjM2MgMmY0MSAzZTIwCi0JMHgwZDIwOiAgNjg2ZiA2ZDY1IDIwNzMgNjk3NCA2NTJlIDNjMmYgNGM0OSAzZTBhCi0JMHgwZDMwOiAgMGEzYyA0YzQ5IDNlMGEgNTQ2OCA2NTIwIDNjNDEgMjA0OCA1MjQ1Ci0JMHgwZDQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDcwNjUgNzI2YyAyZTYxCi0JMHgwZDUwOiAgNzA2MSA2MzY4IDY1MmUgNmY3MiA2NzJmIDIyM2UgNmQ2ZiA2NDIwCi0JMHgwZDYwOiAgNzA2NSA3MjZjIDNjMmYgNDEzZSAyMDY4IDZmNmQgNjUyMCA3MzY5Ci0JMHgwZDcwOiAgNzQ2NSAyZTNjIDJmNGMgNDkzZSAwYTBhIDNjNGMgNDkzZSAwYTU0Ci0JMHgwZDgwOiAgNjg2NSAyMDNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCi0JMHgwZDkwOiAgM2EyZiAyZjc3IDc3NzcgMmU2MSA3MDYxIDYzNjggNjU3NyA2NTY1Ci0JMHgwZGEwOiAgNmIyZSA2MzZmIDZkMmYgMjIzZSA0MTcwIDYxNjMgNjg2NSA1NzY1Ci0JMHgwZGIwOiAgNjU2YiAzYzJmIDQxM2UgMjA2ZSA2NTc3IDczNmMgNjU3NCA3NDY1Ci0JMHgwZGMwOiAgNzIyZSAzYzJmIDRjNDkgM2UwYSAwYTNjIDRjNDkgM2UwYSA1NDY4Ci0JMHgwZGQwOiAgNjUyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhCi0JMHgwZGUwOiAgMmYyZiA3Nzc3IDc3MmUgNjQ2NSA2MjY5IDYxNmUgMmU2ZiA3MjY3Ci0JMHgwZGYwOiAgMmY2NCA2ZjYzIDJmMjIgM2U0NCA2NTYyIDY5NjEgNmUyMCA1MDcyCi0JMHgwZTAwOiAgNmY2YSA2NTYzIDc0MGEgNDQ2ZiA2Mzc1IDZkNjUgNmU3NCA2MTc0Ci0JMHgwZTEwOiAgNjk2ZiA2ZTNjIDJmNDEgM2UyMCA3NzY4IDY5NjMgNjgyMCA2MzZmCi0JMHgwZTIwOiAgNmU3NCA2MTY5IDZlNzMgMjA0OCA0ZjU3IDU0NGYgNzMyYyAyMDQ2Ci0JMHgwZTMwOiAgNDE1MSA3MzJjIDIwNjEgNmU2NCAyMDczIDZmNjYgNzQ3NyA2MTcyCi0JMHgwZTQwOiAgNjUyMCA3NTcwIDY0NjEgNzQ2NSA3MzJlIDNjMmYgNGM0OSAzZTBhCi0JMHgwZTUwOiAgM2MyZiA1NTRjIDNlMGEgMGEzYyA1MDNlIDU5NmYgNzUyMCA2MzYxCi0JMHgwZTYwOiAgNmUyMCA2MTZjIDczNmYgMjA2MyA2ZjZlIDczNzUgNmM3NCAyMDc0Ci0JMHgwZTcwOiAgNjg2NSAyMDZjIDY5NzMgNzQyMCA2ZjY2IDIwM2MgNDEyMCA0ODUyCi0JMHgwZTgwOiAgNDU0NiAzZDIyIDY4NzQgNzQ3MCAzYTJmIDJmNzcgNzc3NyAyZTYyCi0JMHgwZTkwOiAgNmY3NSA3NDY1IDZjNmMgMmU2MyA2ZjZkIDJmNjYgNjE3MSAyZjIyCi0JMHgwZWEwOiAgM2U1NyA2ZjcyIDZjNjQgMGE1NyA2OTY0IDY1MjAgNTc2NSA2MjIwCi0JMHgwZWIwOiAgNDY3MiA2NTcxIDc1NjUgNmU3NCA2Yzc5IDIwNDEgNzM2YiA2NTY0Ci0JMHgwZWMwOiAgMjA1MSA3NTY1IDczNzQgNjk2ZiA2ZTczIDNjMmYgNDEzZSAyMDY2Ci0JMHgwZWQwOiAgNmY3MiAyMDY5IDZlNjYgNmY3MiA2ZDYxIDc0NjkgNmY2ZSAyZTBhCi0JMHgwZWUwOiAgMGEzYyA0ODMyIDNlNGMgNjU3NCAyMDZmIDc0NjggNjU3MiAyMDcwCi0JMHgwZWYwOiAgNjU2ZiA3MDZjIDY1MjAgNmI2ZSA2Zjc3IDIwNjEgNjI2ZiA3NTc0Ci0JMHgwZjAwOiAgMjA3NCA2ODY5IDczMjAgNzM2NSA3Mjc2IDY1NzIgM2MyZiA0ODMyCi0JMHgwZjEwOiAgM2UwYSAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCi0JMHgwZjIwOiAgM2EyZiAyZjZlIDY1NzQgNjM3MiA2MTY2IDc0MmUgNjM2ZiA2ZDJmCi0JMHgwZjMwOiAgMjIzZSA0ZTY1IDc0NjMgNzI2MSA2Njc0IDNjMmYgNDEzZSAyMDcwCi0JMHgwZjQwOiAgNzI2ZiA3NjY5IDY0NjUgNzMyMCA2MTZlIDIwNjkgNmU3NCA2NTcyCi0JMHgwZjUwOiAgNjU3MyA3NDY5IDZlNjcgMjA2NiA3MjY1IDY1MGEgNzM2NSA3Mjc2Ci0JMHgwZjYwOiAgNjk2MyA2NTIwIDY2NmYgNzIyMCA3NzY1IDYyMjAgNzM2OSA3NDY1Ci0JMHgwZjcwOiAgMjA2ZCA2ZjZlIDY5NzQgNmY3MiA2OTZlIDY3MjAgNjE2ZSA2NDIwCi0JMHgwZjgwOiAgNzM3NCA2MTc0IDY5NzMgNzQ2OSA2MzIwIDYzNmYgNmM2YyA2NTYzCi0JMHgwZjkwOiAgNzQ2OSA2ZjZlIDJlMGEgNTk2ZiA3NTIwIDYzNjEgNmUyMCA2YzY1Ci0JMHgwZmEwOiAgNzQyMCA3NDY4IDY1NmQgMjA2YiA2ZTZmIDc3MjAgNjE2MiA2Zjc1Ci0JMHgwZmIwOiAgNzQyMCA3OTZmIDc1NzIgMjA3MyA2NTcyIDc2NjUgNzIyMCA3NTczCi0JMHgwZmMwOiAgNjk2ZSA2NzIwIDc0NjggNjU2OSA3MjBhIDNjNDEgMjA0OCA1MjQ1Ci0JMHgwZmQwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc1NzAgNzQ2OSA2ZDY1Ci0JMHgwZmUwOiAgMmU2ZSA2NTc0IDYzNzIgNjE2NiA3NDJlIDYzNmYgNmQyZiAyMjNlCi0JMHgwZmYwOiAgNjk2ZSA3NDY1IDcyNjYgNjE2MyA2NTNjIDJmNDEgM2UyZSAwYTQ1Ci0JMHgxMDAwOiAgNmU2MSA2MjZjIDY5NmUgNjcyMCA3NDY4IDY1MjAgNmQ2ZiA2ZTY5Ci0JMHgxMDEwOiAgNzQ2ZiA3MjY5IDZlNjcgMjA2ZiA2NjIwIDc5NmYgNzU3MiAyMDczCi0JMHgxMDIwOiAgNjU3MiA3NjY1IDcyMjAgNzc2OSA2YzZjIDIwNzAgNzI2ZiA3NjY5Ci0JMHgxMDMwOiAgNjQ2NSAyMDYxIDIwNjIgNjU3NCA3NDY1IDcyMjAgNjc2YyA2ZjYyCi0JMHgxMDQwOiAgNjE2YyAyMDZmIDc2NjUgNzI3NiA2OTY1IDc3MGEgNmY2NiAyMDc3Ci0JMHgxMDUwOiAgNjg2ZiAyMDY5IDczMjAgNzU3MyA2OTZlIDY3MjAgNzc2OCA2MTc0Ci0JMHgxMDYwOiAgMjA2MSA2ZTY0IDIwNzcgNjg2NSA3MjY1IDJjMjAgNjE2ZSA2NDIwCi0JMHgxMDcwOiAgNjk3NCAyMDc3IDZmNzUgNmM2NCAyMDY3IDY5NzYgNjUyMCA0NDY1Ci0JMHgxMDgwOiAgNjI2OSA2MTZlIDIwNjEgMjA2MiA2NTc0IDc0NjUgNzIwYSA2Zjc2Ci0JMHgxMDkwOiAgNjU3MiA3NjY5IDY1NzcgMjA2ZiA2NjIwIDc0NjggNjUyMCA2MTcwCi0JMHgxMGEwOiAgNjE2MyA2ODY1IDIwNzAgNjE2MyA2YjYxIDY3NjUgMjA3NSA3MzYxCi0JMHgxMGIwOiAgNjc2NSAyZTBhIDBhM2MgNDgzMiAzZTQxIDYyNmYgNzU3NCAyMDc0Ci0JMHgxMGMwOiAgNjg2OSA3MzIwIDcwNjEgNjc2NSAzYzJmIDQ4MzIgM2UwYSAwYTNjCi0JMHgxMGQwOiAgNDk0ZCA0NzIwIDQxNGMgNDk0NyA0ZTNkIDIyNzIgNjk2NyA2ODc0Ci0JMHgxMGUwOiAgMjIyMCA0MTRjIDU0M2QgMjIyMiAyMDQ4IDQ1NDkgNDc0OCA1NDNkCi0JMHgxMGYwOiAgMjIzMiAzNDM3IDIyMjAgNTc0OSA0NDU0IDQ4M2QgMjIzMiAzNzM4Ci0JMHgxMTAwOiAgMjIyMCA1MzUyIDQzM2QgMjI2OSA2MzZmIDZlNzMgMmY2YSA2ODY1Ci0JMHgxMTEwOiAgMzAzNiAzMTJlIDcwNmUgNjcyMiAzZTBhIDBhM2MgNTAzZSA1NDY4Ci0JMHgxMTIwOiAgNjk3MyAyMDY5IDczMjAgNjEyMCA3MDZjIDYxNjMgNjU2OCA2ZjZjCi0JMHgxMTMwOiAgNjQ2NSA3MjIwIDcwNjEgNjc2NSAyMDY5IDZlNzMgNzQ2MSA2YzZjCi0JMHgxMTQwOiAgNjU2NCAyMDYyIDc5MjAgNzQ2OCA2NTIwIDNjNDEgMGE0OCA1MjQ1Ci0JMHgxMTUwOiAgNDYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2NDY1Ci0JMHgxMTYwOiAgNjI2OSA2MTZlIDJlNmYgNzI2NyAyZjIyIDNlNDQgNjU2MiA2OTYxCi0JMHgxMTcwOiAgNmUzYyAyZjQxIDNlMGEgNzI2NSA2YzY1IDYxNzMgNjUyMCA2ZjY2Ci0JMHgxMTgwOiAgMjA3NCA2ODY1IDIwNjEgNzA2MSA2MzY4IDY1MjAgNTc2NSA2MjIwCi0JMHgxMTkwOiAgNzM2NSA3Mjc2IDY1NzIgMjA3MCA2MTYzIDZiNjEgNjc2NSAyZTBhCi0JMHgxMWEwOiAgMGEzYyA1MDNlIDU0NjggNjk3MyAyMDYzIDZmNmQgNzA3NSA3NDY1Ci0JMHgxMWIwOiAgNzIyMCA2ODYxIDczMjAgNjk2ZSA3Mzc0IDYxNmMgNmM2NSA2NDIwCi0JMHgxMWMwOiAgNzQ2OCA2NTIwIDQ0NjUgNjI2OSA2MTZlIDIwNDcgNGU1NSAyZjRjCi0JMHgxMWQwOiAgNjk2ZSA3NTc4IDIwNmYgNzA2NSA3MjYxIDc0NjkgNmU2NyAyMDczCi0JMHgxMWUwOiAgNzk3MyA3NDY1IDZkMmMgMGE2MiA3NTc0IDIwNjkgNzQyMCA2ODYxCi0JMHgxMWYwOiAgNzMyMCAzYzczIDc0NzIgNmY2ZSA2NzNlIDZlNmYgNzQ2OCA2OTZlCi0JMHgxMjAwOiAgNjcyMCA3NDZmIDIwNjQgNmYyMCA3NzY5IDc0NjggMjA3NCA2ODY1Ci0JMHgxMjEwOiAgMjA0NCA2NTYyIDY5NjEgNmUwYSA1MDcyIDZmNmEgNjU2MyA3NDNjCi0JMHgxMjIwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyZTIwIDUwNmMgNjU2MSA3MzY1Ci0JMHgxMjMwOiAgMjA2NCA2ZjIwIDNjNzMgNzQ3MiA2ZjZlIDY3M2UgNmU2ZiA3NDNjCi0JMHgxMjQwOiAgMmY3MyA3NDcyIDZmNmUgNjczZSAyMDYzIDZmNmUgNzQ2MSA2Mzc0Ci0JMHgxMjUwOiAgMjA3NCA2ODY1IDIwNDQgNjU2MiA2OTYxIDZlMGEgNTA3MiA2ZjZhCi0JMHgxMjYwOiAgNjU2MyA3NDIwIDYxNjIgNmY3NSA3NDIwIDY5NzQgMmUzYyAyZjUwCi0JMHgxMjcwOiAgM2UwYSAwYTNjIDUwM2UgNDk2NiAyMDc5IDZmNzUgMjA2NiA2OTZlCi0JMHgxMjgwOiAgNjQyMCA2MTIwIDYyNzUgNjcyMCA2OTZlIDIwNzQgNjg2OSA3MzIwCi0JMHgxMjkwOiAgNjE3MCA2MTYzIDY4NjUgMjA3MCA2MTYzIDZiNjEgNjc2NSAyYzIwCi0JMHgxMmEwOiAgNmY3MiAyMDY5IDZlMjAgNDE3MCA2MTYzIDY4NjUgMjA2OSA3NDczCi0JMHgxMmIwOiAgNjU2YyA2NjJjIDBhNzAgNmM2NSA2MTczIDY1MjAgNjY2OSA2YzY1Ci0JMHgxMmMwOiAgMjA2MSAyMDYyIDc1NjcgMjA3MiA2NTcwIDZmNzIgNzQyMCA2ZjZlCi0JMHgxMmQwOiAgMjA2OSA3NDJlIDIwMjAgNDk2ZSA3Mzc0IDcyNzUgNjM3NCA2OTZmCi0JMHgxMmUwOiAgNmU3MyAyMDZmIDZlMjAgNjQ2ZiA2OTZlIDY3MjAgNzQ2OCA2OTczCi0JMHgxMmYwOiAgMmMyMCA2MTZlIDY0MjAgNzQ2OCA2NTBhIDZjNjkgNzM3NCAyMDZmCi0JMHgxMzAwOiAgNjYyMCAzYzQxIDIwNDggNTI0NSA0NjNkIDIyNjggNzQ3NCA3MDNhCi0JMHgxMzEwOiAgMmYyZiA2Mjc1IDY3NzMgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyCi0JMHgxMzIwOiAgNjcyZiA3MzcyIDYzM2EgNjE3MCA2MTYzIDY4NjUgMjIzZSA2YjZlCi0JMHgxMzMwOiAgNmY3NyA2ZTIwIDYyNzUgNjc3MyAzYzJmIDQxM2UgMjA2ZiA2NjIwCi0JMHgxMzQwOiAgNzQ2OCA2OTczIDBhNzAgNjE2MyA2YjYxIDY3NjUgMmMyMCA2MzYxCi0JMHgxMzUwOiAgNmUyMCA2MjY1IDIwNjYgNmY3NSA2ZTY0IDIwNjkgNmUyMCA3NDY4Ci0JMHgxMzYwOiAgNjUyMCAwYTNjIDQxMjAgNDg1MiA0NTQ2IDNkMjIgNjg3NCA3NDcwCi0JMHgxMzcwOiAgM2EyZiAyZjc3IDc3NzcgMmU2NCA2NTYyIDY5NjEgNmUyZSA2ZjcyCi0JMHgxMzgwOiAgNjcyZiA0Mjc1IDY3NzMgMmY1MiA2NTcwIDZmNzIgNzQ2OSA2ZTY3Ci0JMHgxMzkwOiAgMjIzZSA0NDY1IDYyNjkgNjE2ZSAyMDQyIDc1NjcgMjA1NCA3MjYxCi0JMHgxM2EwOiAgNjM2YiA2OTZlIDY3MjAgNTM3OSA3Mzc0IDY1NmQgM2MyZiA0MTNlCi0JMHgxM2IwOiAgMmUwYSAwYTNjIDUwM2UgNTQ2OCA2MTZlIDZiNzMgMjA2NiA2ZjcyCi0JMHgxM2MwOiAgMjA3NSA3MzY5IDZlNjcgMjA3NCA2ODY5IDczMjAgNzA2MSA2MzZiCi0JMHgxM2QwOiAgNjE2NyA2NTJjIDIwNjEgNmU2NCAyMDYzIDZmNmUgNjc3MiA2MTc0Ci0JMHgxM2UwOiAgNzU2YyA2MTc0IDY5NmYgNmU3MyAyMDY2IDZmNzIgMjA3OSA2Zjc1Ci0JMHgxM2YwOiAgNzIyMCA2MzY4IDZmNjkgNjM2NSAyMDZmIDY2MGEgNjEyMCA0NDY1Ci0JMHgxNDAwOiAgNjI2OSA2MTZlIDIwNzMgNzk3MyA3NDY1IDZkMjEgM2MyZiA1MDNlCi0JMHgxNDEwOiAgMGEwYSAzYzQ0IDQ5NTYgMjA2MSA2YzY5IDY3NmUgM2QyMiA2MzY1Ci0JMHgxNDIwOiAgNmU3NCA2NTcyIDIyM2UgMGEzYyA2MTIwIDY4NzIgNjU2NiAzZDIyCi0JMHgxNDMwOiAgNjg3NCA3NDcwIDNhMmYgMmY3NyA3Nzc3IDJlNjQgNjU2MiA2OTYxCi0JMHgxNDQwOiAgNmUyZSA2ZjcyIDY3MmYgMjIzZSAwYTNjIDQ5NGQgNDcyMCA2MTZjCi0JMHgxNDUwOiAgNjk2NyA2ZTNkIDIyNmQgNjk2NCA2NDZjIDY1MjIgMjA2OCA2NTY5Ci0JMHgxNDYwOiAgNjc2OCA3NDNkIDIyMzMgMzAyMiAyMDc3IDY5NjQgNzQ2OCAzZDIyCi0JMHgxNDcwOiAgMzIzNSAyMjIwIDczNzIgNjMzZCAyMjY5IDYzNmYgNmU3MyAyZjY0Ci0JMHgxNDgwOiAgNjU2MiA2OTYxIDZlMmYgNmY3MCA2NTZlIDZjNmYgNjc2ZiAyZDMyCi0JMHgxNDkwOiAgMzUyZSA2YTcwIDY3MjIgMjA2MSA2Yzc0IDNkMjIgNDQ2NSA2MjY5Ci0JMHgxNGEwOiAgNjE2ZSAyMjNlIDBhM2MgMmY2MSAzZTBhIDNjNjEgMjA2OCA3MjY1Ci0JMHgxNGIwOiAgNjYzZCAyMjY4IDc0NzQgNzAzYSAyZjJmIDc3NzcgNzcyZSA2MTcwCi0JMHgxNGMwOiAgNjE2MyA2ODY1IDJlNmYgNzI2NyAyZjIyIDNlMGEgM2M0OSA0ZDQ3Ci0JMHgxNGQwOiAgMjA2MSA2YzY5IDY3NmUgM2QyMiA2ZDY5IDY0NjQgNmM2NSAyMjIwCi0JMHgxNGUwOiAgNjg2NSA2OTY3IDY4NzQgM2QyMiAzMzMyIDIyMjAgNzc2OSA2NDc0Ci0JMHgxNGYwOiAgNjgzZCAyMjMyIDM1MzkgMjIyMCA3MzcyIDYzM2QgMjI2OSA2MzZmCi0JMHgxNTAwOiAgNmU3MyAyZjYxIDcwNjEgNjM2OCA2NTVmIDcwNjIgMmU3MCA2ZTY3Ci0JMHgxNTEwOiAgMjIyMCA2MTZjIDc0M2QgMjI0MSA3MDYxIDYzNjggNjUyMiAzZTBhCi0JMHgxNTIwOiAgM2MyZiA2MTNlIDBhM2MgMmY0NCA0OTU2IDNlMGEgMGEzYyAyMTJkCi0JMHgxNTMwOiAgMmQwYSAyMDIwIDU0NjggNjk3MyAyMDcwIDYxNjcgNjUyMCA3NzYxCi0JMHgxNTQwOiAgNzMyMCA2OTZlIDY5NzQgNjk2MSA2YzZjIDc5MjAgNjM3MiA2NTYxCi0JMHgxNTUwOiAgNzQ2NSA2NDIwIDYyNzkgMjA0YSA2ZjY4IDZlNjkgNjUyMCA0OTZlCi0JMHgxNTYwOiAgNjc3MiA2MTZkIDIwMjggNjg3NCA3NDcwIDNhMmYgMmY2ZSA2NTc0Ci0JMHgxNTcwOiAgNjc2ZiA2NDJlIDZlNjUgNzQyZiAyOTBhIDIwMjAgNDk3NCAyMDc3Ci0JMHgxNTgwOiAgNjE3MyAyMDZjIDYxNzQgNjU3MiAyMDY1IDY0NjkgNzQ2NSA2NDIwCi0JMHgxNTkwOiAgNjI3OSAyMDRkIDYxNzQgNzQ2OCA2NTc3IDIwNTcgNjk2YyA2MzZmCi0JMHgxNWEwOiAgNzgyMCA2MTZlIDY0MjAgNGE2ZiA3MzY5IDcwMjAgNTI2ZiA2NDY5Ci0JMHgxNWIwOiAgNmUyZSAwYTIwIDIwNGMgNjE3MyA3NDIwIDZkNmYgNjQ2OSA2NjY5Ci0JMHgxNWMwOiAgNjU2NCAzYTIwIDI0NDQgNjE3NCA2NTNhIDIwMzIgMzAzMCAzNDJmCi0JMHgxNWQwOiAgMzAzNiAyZjMyIDMwMjAgMzEzNSAzYTMzIDMzM2EgMzUzNyAyMDI0Ci0JMHgxNWUwOiAgMmUwYSAyMDIwIDJkMmQgM2UwYSAwYTNjIDJmNDIgNGY0NCA1OTNlCi0JMHgxNWYwOiAgMGEzYyAyZjQ4IDU0NGQgNGMzZSAwYQotMjM6NTc6MzUuOTQxMjYwIElQIDEyNy4wLjAuMS41NTkyMCA+IDEyNy4wLjAuMS44MDogLiBhY2sgNTU2MCB3aW4gMTIzODMgPG5vcCxub3AsdGltZXN0YW1wIDEzMDYzMDA5NTMgMTMwNjMwMDk1Mz4KLQkweDAwMDA6ICAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwODAwIDQ1MDAKLQkweDAwMTA6ICAwMDM0IDFiNmUgNDAwMCA0MDA2IDIxNTQgN2YwMCAwMDAxIDdmMDAKLQkweDAwMjA6ICAwMDAxIGRhNzAgMDA1MCAzNzU4IDhhNDkgMzc3YSBhM2E5IDgwMTAKLQkweDAwMzA6ICAzMDVmIDEwZWEgMDAwMCAwMTAxIDA4MGEgNGRkYyA5MjE5IDRkZGMKLQkweDAwNDA6ICA5MjE5Ci0yMzo1NzozNy4yMjk1NzUgSVAgMTI3LjAuMC4xLjU1OTIwID4gMTI3LjAuMC4xLjgwOiBGIDIwMzoyMDMoMCkgYWNrIDU1NjAgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQxIDEzMDYzMDA5NTM+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCi0JMHgwMDEwOiAgMDAzNCAxYjcwIDQwMDAgNDAwNiAyMTUyIDdmMDAgMDAwMSA3ZjAwCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTQ5IDM3N2EgYTNhOSA4MDExCi0JMHgwMDMwOiAgMzA1ZiAwYmUxIDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMSA0ZGRjCi0JMHgwMDQwOiAgOTIxOQotMjM6NTc6MzcuMjMwODM5IElQIDEyNy4wLjAuMS44MCA+IDEyNy4wLjAuMS41NTkyMDogRiA1NTYwOjU1NjAoMCkgYWNrIDIwNCB3aW4gODE5MiA8bm9wLG5vcCx0aW1lc3RhbXAgMTMwNjMwMjI0MyAxMzA2MzAyMjQxPgotCTB4MDAwMDogIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDA4MDAgNDUwMAotCTB4MDAxMDogIDAwMzQgMWZlOCA0MDAwIDQwMDYgMWNkYSA3ZjAwIDAwMDEgN2YwMAotCTB4MDAyMDogIDAwMDEgMDA1MCBkYTcwIDM3N2EgYTNhOSAzNzU4IDhhNGEgODAxMQotCTB4MDAzMDogIDIwMDAgMTczNSAwMDAwIDAxMDEgMDgwYSA0ZGRjIDk3MjMgNGRkYwotCTB4MDA0MDogIDk3MjEKLTIzOjU3OjM3LjIzMDkwMCBJUCAxMjcuMC4wLjEuNTU5MjAgPiAxMjcuMC4wLjEuODA6IC4gYWNrIDU1NjEgd2luIDEyMzgzIDxub3Asbm9wLHRpbWVzdGFtcCAxMzA2MzAyMjQzIDEzMDYzMDIyNDM+Ci0JMHgwMDAwOiAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDgwMCA0NTAwCi0JMHgwMDEwOiAgMDAzNCAxYjcyIDQwMDAgNDAwNiAyMTUwIDdmMDAgMDAwMSA3ZjAwCi0JMHgwMDIwOiAgMDAwMSBkYTcwIDAwNTAgMzc1OCA4YTRhIDM3N2EgYTNhYSA4MDEwCi0JMHgwMDMwOiAgMzA1ZiAwNmQ0IDAwMDAgMDEwMSAwODBhIDRkZGMgOTcyMyA0ZGRjCi0JMHgwMDQwOiAgOTcyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcnN2cC1pbmZpbml0ZS1sb29wLnBjYXAgYi90ZXN0cy9yc3ZwLWluZmluaXRlLWxvb3AucGNhcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwM2RhYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9yc3ZwLWluZmluaXRlLWxvb3AucGNhcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RmdHAuaCBiL3RmdHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwODMwNC4uMDAwMDAwMAotLS0gYS90ZnRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3RmdHAuaCx2IDEuMS4yLjEgMjAwNy8wOS8xNCAwMTowMzoxMiBndXkgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKXRmdHAuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKLSAqLwotCi0jaWZuZGVmIF9URlRQX0hfCi0jZGVmaW5lCV9URlRQX0hfCi0KLS8qCi0gKiBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgKElFTi0xMzMpCi0gKi8KLSNkZWZpbmUJU0VHU0laRQkJNTEyCQkvKiBkYXRhIHNlZ21lbnQgc2l6ZSAqLwotCi0vKgotICogUGFja2V0IHR5cGVzLgotICovCi0jZGVmaW5lCVJSUQkwMQkJCS8qIHJlYWQgcmVxdWVzdCAqLwotI2RlZmluZQlXUlEJMDIJCQkvKiB3cml0ZSByZXF1ZXN0ICovCi0jZGVmaW5lCURBVEEJMDMJCQkvKiBkYXRhIHBhY2tldCAqLwotI2RlZmluZQlBQ0sJMDQJCQkvKiBhY2tub3dsZWRnZW1lbnQgKi8KLSNkZWZpbmUJRVJST1IJMDUJCQkvKiBlcnJvciBjb2RlICovCi0jZGVmaW5lIE9BQ0sJMDYJCQkvKiBvcHRpb24gYWNrbm93bGVkZ2VtZW50ICovCi0KLXN0cnVjdAl0ZnRwaGRyIHsKLQl1bnNpZ25lZCBzaG9ydAl0aF9vcGNvZGU7CQkvKiBwYWNrZXQgdHlwZSAqLwotCXVuaW9uIHsKLQkJdW5zaWduZWQgc2hvcnQJdHVfYmxvY2s7CS8qIGJsb2NrICMgKi8KLQkJdW5zaWduZWQgc2hvcnQJdHVfY29kZTsJLyogZXJyb3IgY29kZSAqLwotCQljaGFyCXR1X3N0dWZmWzFdOwkvKiByZXF1ZXN0IHBhY2tldCBzdHVmZiAqLwotCX0gdGhfdTsKLQljaGFyCXRoX2RhdGFbMV07CQkvKiBkYXRhIG9yIGVycm9yIHN0cmluZyAqLwotfTsKLQotI2RlZmluZQl0aF9ibG9jawl0aF91LnR1X2Jsb2NrCi0jZGVmaW5lCXRoX2NvZGUJCXRoX3UudHVfY29kZQotI2RlZmluZQl0aF9zdHVmZgl0aF91LnR1X3N0dWZmCi0jZGVmaW5lCXRoX21zZwkJdGhfZGF0YQotCi0vKgotICogRXJyb3IgY29kZXMuCi0gKi8KLSNkZWZpbmUJRVVOREVGCQkwCQkvKiBub3QgZGVmaW5lZCAqLwotI2RlZmluZQlFTk9URk9VTkQJMQkJLyogZmlsZSBub3QgZm91bmQgKi8KLSNkZWZpbmUJRUFDQ0VTUwkJMgkJLyogYWNjZXNzIHZpb2xhdGlvbiAqLwotI2RlZmluZQlFTk9TUEFDRQkzCQkvKiBkaXNrIGZ1bGwgb3IgYWxsb2NhdGlvbiBleGNlZWRlZCAqLwotI2RlZmluZQlFQkFET1AJCTQJCS8qIGlsbGVnYWwgVEZUUCBvcGVyYXRpb24gKi8KLSNkZWZpbmUJRUJBRElECQk1CQkvKiB1bmtub3duIHRyYW5zZmVyIElEICovCi0jZGVmaW5lCUVFWElTVFMJCTYJCS8qIGZpbGUgYWxyZWFkeSBleGlzdHMgKi8KLSNkZWZpbmUJRU5PVVNFUgkJNwkJLyogbm8gc3VjaCB1c2VyICovCi0KLSNlbmRpZiAvKiAhX1RGVFBfSF8gKi8KZGlmZiAtLWdpdCBhL3RpbWVkLmggYi90aW1lZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVjNWZlLi4wMDAwMDAwCi0tLSBhL3RpbWVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3RpbWVkLmgsdiAxLjUgMjAwMi8xMi8xMSAwNzoxNDoxMiBndXkgRXhwICQgKExCTCkgKi8KLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKLSAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCi0gKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCi0gKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KLSAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKLSAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwotICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCi0gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQotICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKgotICoJQCgjKXRpbWVkLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCi0gKi8KLQotI2lmbmRlZglfUFJPVE9DT0xTX1RJTUVEX0hfCi0jZGVmaW5lCV9QUk9UT0NPTFNfVElNRURfSF8KLQotLyoKLSAqIFRpbWUgU3luY2hyb25pemF0aW9uIFByb3RvY29sCi0gKi8KLQotI2RlZmluZQlUU1BWRVJTSU9OCTEKLSNkZWZpbmUgQU5ZQUREUiAJTlVMTAotCi1zdHJ1Y3QgdHNwIHsKLQl1X2ludDhfdAl0c3BfdHlwZTsKLQl1X2ludDhfdAl0c3BfdmVyczsKLQl1X2ludDE2X3QJdHNwX3NlcTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB0aW1ldmFsIHRzcHVfdGltZTsKLQkJaW50OF90IHRzcHVfaG9wY250OwotCX0gdHNwX3U7Ci0JaW50OF90IHRzcF9uYW1lWzI1Nl07Ci19OwotCi0jZGVmaW5lCXRzcF90aW1lCXRzcF91LnRzcHVfdGltZQotI2RlZmluZQl0c3BfaG9wY250CXRzcF91LnRzcHVfaG9wY250Ci0KLS8qCi0gKiBDb21tYW5kIHR5cGVzLgotICovCi0jZGVmaW5lCVRTUF9BTlkJCQkwCS8qIG1hdGNoIGFueSB0eXBlcyAqLwotI2RlZmluZQlUU1BfQURKVElNRQkJMQkvKiBzZW5kIGFkanRpbWUgKi8KLSNkZWZpbmUJVFNQX0FDSwkJCTIJLyogZ2VuZXJpYyBhY2tub3dsZWRnZW1lbnQgKi8KLSNkZWZpbmUJVFNQX01BU1RFUlJFUQkJMwkvKiBhc2sgZm9yIG1hc3RlcidzIG5hbWUgKi8KLSNkZWZpbmUJVFNQX01BU1RFUkFDSwkJNAkvKiBhY2tub3dsZWRnZSBtYXN0ZXIgcmVxdWVzdCAqLwotI2RlZmluZQlUU1BfU0VUVElNRQkJNQkvKiBzZW5kIG5ldHdvcmsgdGltZSAqLwotI2RlZmluZQlUU1BfTUFTVEVSVVAJCTYJLyogaW5mb3JtIHNsYXZlcyB0aGF0IG1hc3RlciBpcyB1cCAqLwotI2RlZmluZQlUU1BfU0xBVkVVUAkJNwkvKiBzbGF2ZSBpcyB1cCBidXQgbm90IHBvbGxlZCAqLwotI2RlZmluZQlUU1BfRUxFQ1RJT04JCTgJLyogYWR2YW5jZSBjYW5kaWRhdHVyZSBmb3IgbWFzdGVyICovCi0jZGVmaW5lCVRTUF9BQ0NFUFQJCTkJLyogc3VwcG9ydCBjYW5kaWRhdHVyZSBvZiBtYXN0ZXIgKi8KLSNkZWZpbmUJVFNQX1JFRlVTRQkJMTAJLyogcmVqZWN0IGNhbmRpZGF0dXJlIG9mIG1hc3RlciAqLwotI2RlZmluZQlUU1BfQ09ORkxJQ1QJCTExCS8qIHR3byBvciBtb3JlIG1hc3RlcnMgcHJlc2VudCAqLwotI2RlZmluZQlUU1BfUkVTT0xWRQkJMTIJLyogbWFzdGVycycgY29uZmxpY3QgcmVzb2x1dGlvbiAqLwotI2RlZmluZQlUU1BfUVVJVAkJMTMJLyogcmVqZWN0IGNhbmRpZGF0dXJlIGlmIG1hc3RlciBpcyB1cCAqLwotI2RlZmluZQlUU1BfREFURQkJMTQJLyogcmVzZXQgdGhlIHRpbWUgKGRhdGUgY29tbWFuZCkgKi8KLSNkZWZpbmUJVFNQX0RBVEVSRVEJCTE1CS8qIHJlbW90ZSByZXF1ZXN0IHRvIHJlc2V0IHRoZSB0aW1lICovCi0jZGVmaW5lCVRTUF9EQVRFQUNLCQkxNgkvKiBhY2tub3dsZWRnZSB0aW1lIHNldHRpbmcgICovCi0jZGVmaW5lCVRTUF9UUkFDRU9OCQkxNwkvKiB0dXJuIHRyYWNpbmcgb24gKi8KLSNkZWZpbmUJVFNQX1RSQUNFT0ZGCQkxOAkvKiB0dXJuIHRyYWNpbmcgb2ZmICovCi0jZGVmaW5lCVRTUF9NU0lURQkJMTkJLyogZmluZCBvdXQgbWFzdGVyJ3Mgc2l0ZSAqLwotI2RlZmluZQlUU1BfTVNJVEVSRVEJCTIwCS8qIHJlbW90ZSBtYXN0ZXIncyBzaXRlIHJlcXVlc3QgKi8KLSNkZWZpbmUJVFNQX1RFU1QJCTIxCS8qIGZvciB0ZXN0aW5nIGVsZWN0aW9uIGFsZ28gKi8KLSNkZWZpbmUJVFNQX1NFVERBVEUJCTIyCS8qIE5ldyBmcm9tIGRhdGUgY29tbWFuZCAqLwotI2RlZmluZQlUU1BfU0VUREFURVJFUQkJMjMJLyogTmV3IHJlbW90ZSBmb3IgYWJvdmUgKi8KLSNkZWZpbmUJVFNQX0xPT1AJCTI0CS8qIGxvb3AgZGV0ZWN0aW9uIHBhY2tldCAqLwotCi0jZGVmaW5lCVRTUFRZUEVOVU1CRVIJCTI1Ci0KLSNlbmRpZiAvKiAhX1RJTUVEX0hfICovCmRpZmYgLS1naXQgYS90b2tlbi5oIGIvdG9rZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZmQ2ZC4uMDAwMDAwMAotLS0gYS90b2tlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvdGNwZHVtcC90b2tlbi5oLHYgMS42IDIwMDIvMTIvMTEgMDc6MTQ6MTIgZ3V5IEV4cCAkIChMQkwpICovCi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk4LCBMYXJyeSBMaWxlCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSB1bm1vZGlmaWVkLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECi0gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKi8KLQotI2RlZmluZSBUT0tFTl9IRFJMRU4JCTE0Ci0jZGVmaW5lIFRPS0VOX1JJTkdfTUFDX0xFTgk2Ci0jZGVmaW5lIFJPVVRJTkdfU0VHTUVOVF9NQVgJMTYKLSNkZWZpbmUgSVNfU09VUkNFX1JPVVRFRCh0cnApCSgodHJwKS0+dG9rZW5fc2hvc3RbMF0gJiAweDgwKQotI2RlZmluZSBGUkFNRV9UWVBFKHRycCkJCSgoKHRycCktPnRva2VuX2ZjICYgMHhDMCkgPj4gNikKLSNkZWZpbmUgVE9LRU5fRkNfTExDCQkxCi0KLSNkZWZpbmUgQlJPQURDQVNUKHRycCkJCSgobnRvaHMoKHRycCktPnRva2VuX3JjZikgJiAweEUwMDApID4+IDEzKQotI2RlZmluZSBSSUZfTEVOR1RIKHRycCkJCSgobnRvaHMoKHRycCktPnRva2VuX3JjZikgJiAweDFmMDApID4+IDgpCi0jZGVmaW5lIERJUkVDVElPTih0cnApCQkoKG50b2hzKCh0cnApLT50b2tlbl9yY2YpICYgMHgwMDgwKSA+PiA3KQotI2RlZmluZSBMQVJHRVNUX0ZSQU1FKHRycCkJKChudG9ocygodHJwKS0+dG9rZW5fcmNmKSAmIDB4MDA3MCkgPj4gNCkKLSNkZWZpbmUgUklOR19OVU1CRVIodHJwLCB4KQkoKG50b2hzKCh0cnApLT50b2tlbl9yc2VnW3hdKSAmIDB4ZmZmMCkgPj4gNCkKLSNkZWZpbmUgQlJJREdFX05VTUJFUih0cnAsIHgpCSgobnRvaHMoKHRycCktPnRva2VuX3JzZWdbeF0pICYgMHgwMDBmKSkKLSNkZWZpbmUgU0VHTUVOVF9DT1VOVCh0cnApCSgoaW50KSgoUklGX0xFTkdUSCh0cnApIC0gMikgLyAyKSkKLQotc3RydWN0IHRva2VuX2hlYWRlciB7Ci0JdV9pbnQ4X3QgIHRva2VuX2FjOwotCXVfaW50OF90ICB0b2tlbl9mYzsKLQl1X2ludDhfdCAgdG9rZW5fZGhvc3RbVE9LRU5fUklOR19NQUNfTEVOXTsKLQl1X2ludDhfdCAgdG9rZW5fc2hvc3RbVE9LRU5fUklOR19NQUNfTEVOXTsKLQl1X2ludDE2X3QgdG9rZW5fcmNmOwotCXVfaW50MTZfdCB0b2tlbl9yc2VnW1JPVVRJTkdfU0VHTUVOVF9NQVhdOwotfTsKZGlmZiAtLWdpdCBhL3VkcC5oIGIvdWRwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZGM5YzEuLjAwMDAwMDAKLS0tIGEvdWRwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3VkcC5oLHYgMS44LjIuMiAyMDA3LzAzLzI4IDA3OjQ1OjQ2IGhhbm5lcyBFeHAgJCAoTEJMKSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MiwgMTk4NiwgMTk5MwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqCi0gKglAKCMpdWRwLmgJOC4xIChCZXJrZWxleSkgNi8xMC85MwotICovCi0KLS8qCi0gKiBVZHAgcHJvdG9jb2wgaGVhZGVyLgotICogUGVyIFJGQyA3NjgsIFNlcHRlbWJlciwgMTk4MS4KLSAqLwotc3RydWN0IHVkcGhkciB7Ci0JdV9pbnQxNl90CXVoX3Nwb3J0OwkJLyogc291cmNlIHBvcnQgKi8KLQl1X2ludDE2X3QJdWhfZHBvcnQ7CQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCi0JdV9pbnQxNl90CXVoX3VsZW47CQkvKiB1ZHAgbGVuZ3RoICovCi0JdV9pbnQxNl90CXVoX3N1bTsJCQkvKiB1ZHAgY2hlY2tzdW0gKi8KLX07Ci0KLSNkZWZpbmUgVEZUUF9QT1JUIDY5CQkvKlhYWCovCi0jZGVmaW5lIEtFUkJFUk9TX1BPUlQgODgJLypYWFgqLwotI2RlZmluZSBTVU5SUENfUE9SVCAxMTEJCS8qWFhYKi8KLSNkZWZpbmUgU05NUF9QT1JUIDE2MQkJLypYWFgqLwotI2RlZmluZSBOVFBfUE9SVCAxMjMJCS8qWFhYKi8KLSNkZWZpbmUgU05NUFRSQVBfUE9SVCAxNjIJLypYWFgqLwotI2RlZmluZSBJU0FLTVBfUE9SVCA1MDAJCS8qWFhYKi8KLSNkZWZpbmUgU1lTTE9HX1BPUlQgNTE0ICAgICAgICAgLyogcmZjMzE2NCAqLwotI2RlZmluZSBUSU1FRF9QT1JUIDUyNQkJLypYWFgqLwotI2RlZmluZSBSSVBfUE9SVCA1MjAJCS8qWFhYKi8KLSNkZWZpbmUgTERQX1BPUlQgNjQ2Ci0jZGVmaW5lIEFPRFZfUE9SVCA2NTQJCS8qWFhYKi8KLSNkZWZpbmUgT0xTUl9QT1JUIDY5OCAgICAgICAgICAgLyogcmZjMzYyNiAqLwotI2RlZmluZSBLRVJCRVJPU19TRUNfUE9SVCA3NTAJLypYWFgqLwotI2RlZmluZSBMMlRQX1BPUlQgMTcwMQkJLypYWFgqLwotI2RlZmluZSBTSVBfUE9SVCA1MDYwCi0jZGVmaW5lIElTQUtNUF9QT1JUX05BVFQgIDQ1MDAgIC8qIHJmYzM5NDggKi8KLSNkZWZpbmUgSVNBS01QX1BPUlRfVVNFUjEgNzUwMAkvKlhYWCAtIG5vbnN0YW5kYXJkKi8KLSNkZWZpbmUgSVNBS01QX1BPUlRfVVNFUjIgODUwMAkvKlhYWCAtIG5vbnN0YW5kYXJkKi8KLSNkZWZpbmUgUlhfUE9SVF9MT1cgNzAwMAkvKlhYWCovCi0jZGVmaW5lIFJYX1BPUlRfSElHSCA3MDA5CS8qWFhYKi8KLSNkZWZpbmUgTkVUQklPU19OU19QT1JUICAgMTM3Ci0jZGVmaW5lIE5FVEJJT1NfREdSQU1fUE9SVCAgIDEzOAotI2RlZmluZSBDSVNDT19BVVRPUlBfUE9SVCA0OTYJLypYWFgqLwotI2RlZmluZSBSQURJVVNfUE9SVCAxNjQ1Ci0jZGVmaW5lIFJBRElVU19ORVdfUE9SVCAxODEyCi0jZGVmaW5lIFJBRElVU19BQ0NPVU5USU5HX1BPUlQgMTY0NgotI2RlZmluZSBSQURJVVNfTkVXX0FDQ09VTlRJTkdfUE9SVCAxODEzCi0jZGVmaW5lIEhTUlBfUE9SVCAxOTg1CQkvKlhYWCovCi0jZGVmaW5lIExNUF9QT1JUICAgICAgICAgICAgICAgIDcwMSAvKiByZmM0MjA0ICovCi0jZGVmaW5lIExXUkVTX1BPUlQJCTkyMQotI2RlZmluZSBaRVBIWVJfU1JWX1BPUlQJCTIxMDMKLSNkZWZpbmUgWkVQSFlSX0NMVF9QT1JUCQkyMTA0Ci0jZGVmaW5lIE1QTFNfTFNQX1BJTkdfUE9SVCAgICAgIDM1MDMgLyogZHJhZnQtaWV0Zi1tcGxzLWxzcC1waW5nLTAyLnR4dCAqLwotI2RlZmluZSBCRkRfQ09OVFJPTF9QT1JUICAgICAgICAzNzg0IC8qIGRyYWZ0LWthdHotd2FyZC1iZmQtdjR2Ni0xaG9wLTAwLnR4dCAqLwotI2RlZmluZSBCRkRfRUNIT19QT1JUICAgICAgICAgICAzNzg1IC8qIGRyYWZ0LWthdHotd2FyZC1iZmQtdjR2Ni0xaG9wLTAwLnR4dCAqLwotCi0jaWZkZWYgSU5FVDYKLSNkZWZpbmUgUklQTkdfUE9SVCA1MjEJCS8qWFhYKi8KLSNkZWZpbmUgREhDUDZfU0VSVl9QT1JUIDU0NgkvKlhYWCovCi0jZGVmaW5lIERIQ1A2X0NMSV9QT1JUIDU0NwkvKlhYWCovCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3V0aWwuYyBiL3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEyZjZmMy4uMDAwMDAwMAotLS0gYS91dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NwotICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKLSAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKLSAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCi0gKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCi0gKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCi0gKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCi0gKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKLSAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCi0gKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLSNpZm5kZWYgbGludAotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQotICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci90Y3BkdW1wL3V0aWwuYyx2IDEuOTUuMi42IDIwMDYvMDIvMDggMDE6NDA6MDkgaGFubmVzIEV4cCAkIChMQkwpIjsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0Y3BkdW1wLXN0ZGluYy5oPgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgSEFWRV9GQ05UTF9ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHBjYXAuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLS8qCi0gKiBQcmludCBvdXQgYSBudWxsLXRlcm1pbmF0ZWQgZmlsZW5hbWUgKG9yIG90aGVyIGFzY2lpIHN0cmluZykuCi0gKiBJZiBlcCBpcyBOVUxMLCBhc3N1bWUgbm8gdHJ1bmNhdGlvbiBjaGVjayBpcyBuZWVkZWQuCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0cnVuY2F0ZWQuCi0gKi8KLWludAotZm5fcHJpbnQocmVnaXN0ZXIgY29uc3QgdV9jaGFyICpzLCByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQotewotCXJlZ2lzdGVyIGludCByZXQ7Ci0JcmVnaXN0ZXIgdV9jaGFyIGM7Ci0KLQlyZXQgPSAxOwkJCS8qIGFzc3VtZSB0cnVuY2F0ZWQgKi8KLQl3aGlsZSAoZXAgPT0gTlVMTCB8fCBzIDwgZXApIHsKLQkJYyA9ICpzKys7Ci0JCWlmIChjID09ICdcMCcpIHsKLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIWlzYXNjaWkoYykpIHsKLQkJCWMgPSB0b2FzY2lpKGMpOwotCQkJcHV0Y2hhcignTScpOwotCQkJcHV0Y2hhcignLScpOwotCQl9Ci0JCWlmICghaXNwcmludChjKSkgewotCQkJYyBePSAweDQwOwkvKiBERUwgdG8gPywgb3RoZXJzIHRvIGFscGhhICovCi0JCQlwdXRjaGFyKCdeJyk7Ci0JCX0KLQkJcHV0Y2hhcihjKTsKLQl9Ci0JcmV0dXJuKHJldCk7Ci19Ci0KLS8qCi0gKiBQcmludCBvdXQgYSBjb3VudGVkIGZpbGVuYW1lIChvciBvdGhlciBhc2NpaSBzdHJpbmcpLgotICogSWYgZXAgaXMgTlVMTCwgYXNzdW1lIG5vIHRydW5jYXRpb24gY2hlY2sgaXMgbmVlZGVkLgotICogUmV0dXJuIHRydWUgaWYgdHJ1bmNhdGVkLgotICovCi1pbnQKLWZuX3ByaW50bihyZWdpc3RlciBjb25zdCB1X2NoYXIgKnMsIHJlZ2lzdGVyIHVfaW50IG4sCi0JICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQotewotCXJlZ2lzdGVyIHVfY2hhciBjOwotCi0Jd2hpbGUgKG4gPiAwICYmIChlcCA9PSBOVUxMIHx8IHMgPCBlcCkpIHsKLQkJbi0tOwotCQljID0gKnMrKzsKLQkJaWYgKCFpc2FzY2lpKGMpKSB7Ci0JCQljID0gdG9hc2NpaShjKTsKLQkJCXB1dGNoYXIoJ00nKTsKLQkJCXB1dGNoYXIoJy0nKTsKLQkJfQotCQlpZiAoIWlzcHJpbnQoYykpIHsKLQkJCWMgXj0gMHg0MDsJLyogREVMIHRvID8sIG90aGVycyB0byBhbHBoYSAqLwotCQkJcHV0Y2hhcignXicpOwotCQl9Ci0JCXB1dGNoYXIoYyk7Ci0JfQotCXJldHVybiAobiA9PSAwKSA/IDAgOiAxOwotfQotCi0vKgotICogUHJpbnQgb3V0IGEgbnVsbC1wYWRkZWQgZmlsZW5hbWUgKG9yIG90aGVyIGFzY2lpIHN0cmluZykuCi0gKiBJZiBlcCBpcyBOVUxMLCBhc3N1bWUgbm8gdHJ1bmNhdGlvbiBjaGVjayBpcyBuZWVkZWQuCi0gKiBSZXR1cm4gdHJ1ZSBpZiB0cnVuY2F0ZWQuCi0gKi8KLWludAotZm5fcHJpbnR6cChyZWdpc3RlciBjb25zdCB1X2NoYXIgKnMsIHJlZ2lzdGVyIHVfaW50IG4sCi0JICByZWdpc3RlciBjb25zdCB1X2NoYXIgKmVwKQotewotCXJlZ2lzdGVyIGludCByZXQ7Ci0JcmVnaXN0ZXIgdV9jaGFyIGM7Ci0KLQlyZXQgPSAxOwkJCS8qIGFzc3VtZSB0cnVuY2F0ZWQgKi8KLQl3aGlsZSAobiA+IDAgJiYgKGVwID09IE5VTEwgfHwgcyA8IGVwKSkgewotCQluLS07Ci0JCWMgPSAqcysrOwotCQlpZiAoYyA9PSAnXDAnKSB7Ci0JCQlyZXQgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCFpc2FzY2lpKGMpKSB7Ci0JCQljID0gdG9hc2NpaShjKTsKLQkJCXB1dGNoYXIoJ00nKTsKLQkJCXB1dGNoYXIoJy0nKTsKLQkJfQotCQlpZiAoIWlzcHJpbnQoYykpIHsKLQkJCWMgXj0gMHg0MDsJLyogREVMIHRvID8sIG90aGVycyB0byBhbHBoYSAqLwotCQkJcHV0Y2hhcignXicpOwotCQl9Ci0JCXB1dGNoYXIoYyk7Ci0JfQotCXJldHVybiAobiA9PSAwKSA/IDAgOiByZXQ7Ci19Ci0KLS8qCi0gKiBQcmludCB0aGUgdGltZXN0YW1wCi0gKi8KLXZvaWQKLXRzX3ByaW50KHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB0aW1ldmFsICp0dnApCi17Ci0JcmVnaXN0ZXIgaW50IHM7Ci0Jc3RydWN0IHRtICp0bTsKLQl0aW1lX3QgVGltZTsKLQlzdGF0aWMgdW5zaWduZWQgYl9zZWM7Ci0Jc3RhdGljIHVuc2lnbmVkIGJfdXNlYzsKLQotCXN3aXRjaCAodGZsYWcpIHsKLQotCWNhc2UgMDogLyogRGVmYXVsdCAqLwotCQlzID0gKHR2cC0+dHZfc2VjICsgdGhpc3pvbmUpICUgODY0MDA7Ci0JCSh2b2lkKXByaW50ZigiJTAyZDolMDJkOiUwMmQuJTA2dSAiLAotCQkJICAgICBzIC8gMzYwMCwgKHMgJSAzNjAwKSAvIDYwLCBzICUgNjAsCi0JCQkgICAgICh1bnNpZ25lZCl0dnAtPnR2X3VzZWMpOwotCQlicmVhazsKLQotCWNhc2UgMTogLyogTm8gdGltZSBzdGFtcCAqLwotCQlicmVhazsKLQotCWNhc2UgMjogLyogVW5peCB0aW1ldmFsIHN0eWxlICovCi0JCSh2b2lkKXByaW50ZigiJXUuJTA2dSAiLAotCQkJICAgICAodW5zaWduZWQpdHZwLT50dl9zZWMsCi0JCQkgICAgICh1bnNpZ25lZCl0dnAtPnR2X3VzZWMpOwotCQlicmVhazsKLQotCWNhc2UgMzogLyogTWljcm9zZWNvbmRzIHNpbmNlIHByZXZpb3VzIHBhY2tldCAqLwotCQlpZiAoYl9zZWMgPT0gMCkgewotCQkJcHJpbnRmKCIwMDAwMDAgIik7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgZF91c2VjID0gdHZwLT50dl91c2VjIC0gYl91c2VjOwotCQkJaW50IGRfc2VjID0gdHZwLT50dl9zZWMgLSBiX3NlYzsKLQotCQkJd2hpbGUgKGRfdXNlYyA8IDApIHsKLQkJCQlkX3VzZWMgKz0gMTAwMDAwMDsKLQkJCQlkX3NlYy0tOwotCQkJfQotCQkJaWYgKGRfc2VjKQotCQkJCXByaW50ZigiJWQuICIsIGRfc2VjKTsKLQkJCXByaW50ZigiJTA2ZCAiLCBkX3VzZWMpOwotCQl9Ci0JCWJfc2VjID0gdHZwLT50dl9zZWM7Ci0JCWJfdXNlYyA9IHR2cC0+dHZfdXNlYzsKLQkJYnJlYWs7Ci0KLQljYXNlIDQ6IC8qIERlZmF1bHQgKyBEYXRlKi8KLQkJcyA9ICh0dnAtPnR2X3NlYyArIHRoaXN6b25lKSAlIDg2NDAwOwotCQlUaW1lID0gKHR2cC0+dHZfc2VjICsgdGhpc3pvbmUpIC0gczsKLQkJdG0gPSBnbXRpbWUgKCZUaW1lKTsKLQkJaWYgKCF0bSkKLQkJCXByaW50ZigiRGF0ZSBmYWlsICAiKTsKLQkJZWxzZQotCQkJcHJpbnRmKCIlMDRkLSUwMmQtJTAyZCAiLAotCQkJCSAgIHRtLT50bV95ZWFyKzE5MDAsIHRtLT50bV9tb24rMSwgdG0tPnRtX21kYXkpOwotCQlwcmludGYoIiUwMmQ6JTAyZDolMDJkLiUwNnUgIiwKLQkJCSAgIHMgLyAzNjAwLCAocyAlIDM2MDApIC8gNjAsIHMgJSA2MCwgKHVuc2lnbmVkKXR2cC0+dHZfdXNlYyk7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIFByaW50IGEgcmVsYXRpdmUgbnVtYmVyIG9mIHNlY29uZHMgKGUuZy4gaG9sZCB0aW1lLCBwcnVuZSB0aW1lcikKLSAqIGluIHRoZSBmb3JtIDVtMXMuICBUaGlzIGRvZXMgbm8gdHJ1bmNhdGlvbiwgc28gMzIyMzA4NjEgc2Vjb25kcwotICogaXMgcmVwcmVzZW50ZWQgYXMgMXkxdzFkMWgxbTFzLgotICovCi12b2lkCi1yZWx0c19wcmludChpbnQgc2VjcykKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqbGVuZ3Roc1tdID0geyJ5IiwgInciLCAiZCIsICJoIiwgIm0iLCAicyJ9OwotCXN0YXRpYyBjb25zdCBpbnQgc2Vjb25kc1tdID0gezMxNTM2MDAwLCA2MDQ4MDAsIDg2NDAwLCAzNjAwLCA2MCwgMX07Ci0JY29uc3QgY2hhciAqKmwgPSBsZW5ndGhzOwotCWNvbnN0IGludCAqcyA9IHNlY29uZHM7Ci0KLQlpZiAoc2VjcyA9PSAwKSB7Ci0JCSh2b2lkKXByaW50ZigiMHMiKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoc2VjcyA8IDApIHsKLQkJKHZvaWQpcHJpbnRmKCItIik7Ci0JCXNlY3MgPSAtc2VjczsKLQl9Ci0Jd2hpbGUgKHNlY3MgPiAwKSB7Ci0JCWlmIChzZWNzID49ICpzKSB7Ci0JCQkodm9pZClwcmludGYoIiVkJXMiLCBzZWNzIC8gKnMsICpsKTsKLQkJCXNlY3MgLT0gKHNlY3MgLyAqcykgKiAqczsKLQkJfQotCQlzKys7Ci0JCWwrKzsKLQl9Ci19Ci0KLS8qCi0gKiAgdGhpcyBpcyBhIGdlbmVyaWMgcm91dGluZSBmb3IgcHJpbnRpbmcgdW5rbm93biBkYXRhOwotICogIHdlIHBhc3Mgb24gdGhlIGxpbmVmZWVkIHBsdXMgaW5kZW50YXRpb24gc3RyaW5nIHRvCi0gKiAgZ2V0IGEgcHJvcGVyIG91dHB1dCAtIHJldHVybnMgMCBvbiBlcnJvcgotICovCi0KLWludAotcHJpbnRfdW5rbm93bl9kYXRhKGNvbnN0IHVfY2hhciAqY3AsY29uc3QgY2hhciAqaWRlbnQsaW50IGxlbikKLXsKLQlpZiAobGVuIDwgMCkgewotCQlwcmludGYoIiVzRGlzc2VjdG9yIGVycm9yOiBwcmludF91bmtub3duX2RhdGEgY2FsbGVkIHdpdGggbmVnYXRpdmUgbGVuZ3RoIiwKLQkJICAgIGlkZW50KTsKLQkJcmV0dXJuKDApOwotCX0KLQlpZiAoc25hcGVuZCAtIGNwIDwgbGVuKQotCQlsZW4gPSBzbmFwZW5kIC0gY3A7Ci0JaWYgKGxlbiA8IDApIHsKLQkJcHJpbnRmKCIlc0Rpc3NlY3RvciBlcnJvcjogcHJpbnRfdW5rbm93bl9kYXRhIGNhbGxlZCB3aXRoIHBvaW50ZXIgcGFzdCBlbmQgb2YgcGFja2V0IiwKLQkJICAgIGlkZW50KTsKLQkJcmV0dXJuKDApOwotCX0KLSAgICAgICAgaGV4X3ByaW50KGlkZW50LGNwLGxlbik7Ci0JcmV0dXJuKDEpOyAvKiBldmVyeXRoaW5nIGlzIG9rICovCi19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgdG9rZW4gdmFsdWUgdG8gYSBzdHJpbmc7IHVzZSAiZm10IiBpZiBub3QgZm91bmQuCi0gKi8KLWNvbnN0IGNoYXIgKgotdG9rMnN0cmJ1ZihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9rICpscCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10LAotCSAgIHJlZ2lzdGVyIGludCB2LCBjaGFyICpidWYsIHNpemVfdCBidWZzaXplKQotewotCWlmIChscCAhPSBOVUxMKSB7Ci0JCXdoaWxlIChscC0+cyAhPSBOVUxMKSB7Ci0JCQlpZiAobHAtPnYgPT0gdikKLQkJCQlyZXR1cm4gKGxwLT5zKTsKLQkJCSsrbHA7Ci0JCX0KLQl9Ci0JaWYgKGZtdCA9PSBOVUxMKQotCQlmbXQgPSAiIyVkIjsKLQotCSh2b2lkKXNucHJpbnRmKGJ1ZiwgYnVmc2l6ZSwgZm10LCB2KTsKLQlyZXR1cm4gKGNvbnN0IGNoYXIgKilidWY7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgdG9rZW4gdmFsdWUgdG8gYSBzdHJpbmc7IHVzZSAiZm10IiBpZiBub3QgZm91bmQuCi0gKi8KLWNvbnN0IGNoYXIgKgotdG9rMnN0cihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9rICpscCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10LAotCXJlZ2lzdGVyIGludCB2KQotewotCXN0YXRpYyBjaGFyIGJ1Zls0XVsxMjhdOwotCXN0YXRpYyBpbnQgaWR4ID0gMDsKLQljaGFyICpyZXQ7Ci0KLQlyZXQgPSBidWZbaWR4XTsKLQlpZHggPSAoaWR4KzEpICYgMzsKLQlyZXR1cm4gdG9rMnN0cmJ1ZihscCwgZm10LCB2LCByZXQsIHNpemVvZihidWZbMF0pKTsKLX0KLQotLyoKLSAqIENvbnZlcnQgYSBiaXQgdG9rZW4gdmFsdWUgdG8gYSBzdHJpbmc7IHVzZSAiZm10IiBpZiBub3QgZm91bmQuCi0gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgcGFyc2luZyBiaXRmaWVsZHMsIHRoZSBvdXRwdXQgc3RyaW5ncyBhcmUgY29tbWEgc2VwZXJhdGVkCi0gKi8KLWNoYXIgKgotYml0dG9rMnN0cihyZWdpc3RlciBjb25zdCBzdHJ1Y3QgdG9rICpscCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqZm10LAotCSAgIHJlZ2lzdGVyIGludCB2KQotewotICAgICAgICBzdGF0aWMgY2hhciBidWZbMjU2XTsgLyogb3VyIHN0cmluZ2J1ZmZlciAqLwotICAgICAgICBpbnQgYnVmbGVuPTA7Ci0gICAgICAgIHJlZ2lzdGVyIGludCByb3RiaXQ7IC8qIHRoaXMgaXMgdGhlIGJpdCB3ZSByb3RhdGUgdGhyb3VnaCBhbGwgYml0cG9zaXRpb25zICovCi0gICAgICAgIHJlZ2lzdGVyIGludCB0b2t2YWw7Ci0KLQl3aGlsZSAobHAtPnMgIT0gTlVMTCAmJiBscCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB0b2t2YWw9bHAtPnY7ICAgLyogbG9hZCBvdXIgZmlyc3QgdmFsdWUgKi8KLSAgICAgICAgICAgIHJvdGJpdD0xOwotICAgICAgICAgICAgd2hpbGUgKHJvdGJpdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBsZXRzIEFORCB0aGUgcm90YXRpbmcgYml0IHdpdGggb3VyIHRva2VuIHZhbHVlCi0gICAgICAgICAgICAgICAgICogYW5kIHNlZSBpZiB3ZSBoYXZlIGdvdCBhIG1hdGNoCi0gICAgICAgICAgICAgICAgICovCi0JCWlmICh0b2t2YWwgPT0gKHYmcm90Yml0KSkgewotICAgICAgICAgICAgICAgICAgICAvKiBvayB3ZSBoYXZlIGZvdW5kIHNvbWV0aGluZyAqLwotICAgICAgICAgICAgICAgICAgICBidWZsZW4rPXNucHJpbnRmKGJ1ZitidWZsZW4sIHNpemVvZihidWYpLWJ1ZmxlbiwgIiVzLCAiLGxwLT5zKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJvdGJpdD1yb3RiaXQ8PDE7IC8qIG5vIG1hdGNoIC0gbGV0cyBzaGlmdCBhbmQgdHJ5IGFnYWluICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBscCsrOwotCX0KLQotICAgICAgICBpZiAoYnVmbGVuICE9IDApIHsgLyogZGlkIHdlIGZpbmQgYW55dGhpbmcgKi8KLSAgICAgICAgICAgIC8qIHllcCwgc2V0IHRoZSB0aGUgdHJhaWxpbmcgemVybyAyIGJ5dGVzIGJlZm9yZSB0byBlbGltaW5hdGUgdGhlIGxhc3QgY29tbWEgJiB3aGl0ZXNwYWNlICovCi0gICAgICAgICAgICBidWZbYnVmbGVuLTJdID0gJ1wwJzsKLSAgICAgICAgICAgIHJldHVybiAoYnVmKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGJ1bW1lciAtIGxldHMgcHJpbnQgdGhlICJ1bmtub3duIiBtZXNzYWdlIGFzIGFkdmlzZWQgaW4gdGhlIGZtdCBzdHJpbmcgaWYgd2UgZ290IG9uZSAqLwotICAgICAgICAgICAgaWYgKGZtdCA9PSBOVUxMKQotCQlmbXQgPSAiIyVkIjsKLSAgICAgICAgICAgICh2b2lkKXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgdik7Ci0gICAgICAgICAgICByZXR1cm4gKGJ1Zik7Ci0gICAgICAgIH0KLX0KLQotLyoKLSAqIENvbnZlcnQgYSB2YWx1ZSB0byBhIHN0cmluZyB1c2luZyBhbiBhcnJheTsgdGhlIG1hY3JvCi0gKiB0b2syc3RyYXJ5KCkgaW4gPGludGVyZmFjZS5oPiBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0bwotICogdGhpcyBmdW5jdGlvbiBhbmQgZW5zdXJlcyB0aGF0IHRoZSBzZWNvbmQgYXJndW1lbnQgaXMKLSAqIGNvcnJlY3QgZm9yIGJvdW5kcy1jaGVja2luZy4KLSAqLwotY29uc3QgY2hhciAqCi10b2syc3RyYXJ5X2ludGVybmFsKHJlZ2lzdGVyIGNvbnN0IGNoYXIgKipscCwgaW50IG4sIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmZtdCwKLQlyZWdpc3RlciBpbnQgdikKLXsKLQlzdGF0aWMgY2hhciBidWZbMTI4XTsKLQotCWlmICh2ID49IDAgJiYgdiA8IG4gJiYgbHBbdl0gIT0gTlVMTCkKLQkJcmV0dXJuIGxwW3ZdOwotCWlmIChmbXQgPT0gTlVMTCkKLQkJZm10ID0gIiMlZCI7Ci0JKHZvaWQpc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCB2KTsKLQlyZXR1cm4gKGJ1Zik7Ci19Ci0KLS8qCi0gKiBDb252ZXJ0IGEgMzItYml0IG5ldG1hc2sgdG8gcHJlZml4bGVuIGlmIHBvc3NpYmxlCi0gKiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJlZml4LWxlbjsgaWYgcGxlbiA9PSAtMQotICogdGhlbiBjb252ZXJzaW9uIHdhcyBub3QgcG9zc2libGU7Ci0gKi8KLQotaW50Ci1tYXNrMnBsZW4gKHVfaW50MzJfdCBtYXNrKQotewotCXVfaW50MzJfdCBiaXRtYXNrc1szM10gPSB7Ci0JCTB4MDAwMDAwMDAsCi0JCTB4ODAwMDAwMDAsIDB4YzAwMDAwMDAsIDB4ZTAwMDAwMDAsIDB4ZjAwMDAwMDAsCi0JCTB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIDB4ZmUwMDAwMDAsIDB4ZmYwMDAwMDAsCi0JCTB4ZmY4MDAwMDAsIDB4ZmZjMDAwMDAsIDB4ZmZlMDAwMDAsIDB4ZmZmMDAwMDAsCi0JCTB4ZmZmODAwMDAsIDB4ZmZmYzAwMDAsIDB4ZmZmZTAwMDAsIDB4ZmZmZjAwMDAsCi0JCTB4ZmZmZjgwMDAsIDB4ZmZmZmMwMDAsIDB4ZmZmZmUwMDAsIDB4ZmZmZmYwMDAsCi0JCTB4ZmZmZmY4MDAsIDB4ZmZmZmZjMDAsIDB4ZmZmZmZlMDAsIDB4ZmZmZmZmMDAsCi0JCTB4ZmZmZmZmODAsIDB4ZmZmZmZmYzAsIDB4ZmZmZmZmZTAsIDB4ZmZmZmZmZjAsCi0JCTB4ZmZmZmZmZjgsIDB4ZmZmZmZmZmMsIDB4ZmZmZmZmZmUsIDB4ZmZmZmZmZmYKLQl9OwotCWludCBwcmVmaXhfbGVuID0gMzI7Ci0KLQkvKiBsZXQncyBzZWUgaWYgd2UgY2FuIHRyYW5zZm9ybSB0aGUgbWFzayBpbnRvIGEgcHJlZml4bGVuICovCi0Jd2hpbGUgKHByZWZpeF9sZW4gPj0gMCkgewotCQlpZiAoYml0bWFza3NbcHJlZml4X2xlbl0gPT0gbWFzaykKLQkJCWJyZWFrOwotCQlwcmVmaXhfbGVuLS07Ci0JfQotCXJldHVybiAocHJlZml4X2xlbik7Ci19Ci0KLS8qIFZBUkFSR1MgKi8KLXZvaWQKLWVycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0KLQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQlpZiAoKmZtdCkgewotCQlmbXQgKz0gc3RybGVuKGZtdCk7Ci0JCWlmIChmbXRbLTFdICE9ICdcbicpCi0JCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOwotCX0KLQlleGl0KDEpOwotCS8qIE5PVFJFQUNIRUQgKi8KLX0KLQotLyogVkFSQVJHUyAqLwotdm9pZAotd2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKLXsKLQl2YV9saXN0IGFwOwotCi0JKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogV0FSTklORzogIiwgcHJvZ3JhbV9uYW1lKTsKLQl2YV9zdGFydChhcCwgZm10KTsKLQkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOwotCXZhX2VuZChhcCk7Ci0JaWYgKCpmbXQpIHsKLQkJZm10ICs9IHN0cmxlbihmbXQpOwotCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQotCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKLQl9Ci19Ci0KLS8qCi0gKiBDb3B5IGFyZyB2ZWN0b3IgaW50byBhIG5ldyBidWZmZXIsIGNvbmNhdGVuYXRpbmcgYXJndW1lbnRzIHdpdGggc3BhY2VzLgotICovCi1jaGFyICoKLWNvcHlfYXJndihyZWdpc3RlciBjaGFyICoqYXJndikKLXsKLQlyZWdpc3RlciBjaGFyICoqcDsKLQlyZWdpc3RlciB1X2ludCBsZW4gPSAwOwotCWNoYXIgKmJ1ZjsKLQljaGFyICpzcmMsICpkc3Q7Ci0KLQlwID0gYXJndjsKLQlpZiAoKnAgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoKnApCi0JCWxlbiArPSBzdHJsZW4oKnArKykgKyAxOwotCi0JYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCWVycm9yKCJjb3B5X2FyZ3Y6IG1hbGxvYyIpOwotCi0JcCA9IGFyZ3Y7Ci0JZHN0ID0gYnVmOwotCXdoaWxlICgoc3JjID0gKnArKykgIT0gTlVMTCkgewotCQl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLQkJCTsKLQkJZHN0Wy0xXSA9ICcgJzsKLQl9Ci0JZHN0Wy0xXSA9ICdcMCc7Ci0KLQlyZXR1cm4gYnVmOwotfQotCi0vKgotICogT24gV2luZG93cywgd2UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLCBzbyB0aGF0Ci0gKiB3ZSBnZXQgYWxsIHRoZSBieXRlcyBzcGVjaWZpZWQgYnkgdGhlIHNpemUgd2UgZ2V0IGZyb20gImZzdGF0KCkiLgotICogT24gVU5JWCwgdGhhdCdzIG5vdCBuZWNlc3NhcnkuICBPX0JJTkFSWSBpcyBkZWZpbmVkIG9uIFdpbmRvd3M7Ci0gKiB3ZSBkZWZpbmUgaXQgYXMgMCBpZiBpdCdzIG5vdCBkZWZpbmVkLCBzbyBpdCBkb2VzIG5vdGhpbmcuCi0gKi8KLSNpZm5kZWYgT19CSU5BUlkKLSNkZWZpbmUgT19CSU5BUlkJMAotI2VuZGlmCi0KLWNoYXIgKgotcmVhZF9pbmZpbGUoY2hhciAqZm5hbWUpCi17Ci0JcmVnaXN0ZXIgaW50IGksIGZkLCBjYzsKLQlyZWdpc3RlciBjaGFyICpjcDsKLQlzdHJ1Y3Qgc3RhdCBidWY7Ci0KLQlmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZfE9fQklOQVJZKTsKLQlpZiAoZmQgPCAwKQotCQllcnJvcigiY2FuJ3Qgb3BlbiAlczogJXMiLCBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCi0JaWYgKGZzdGF0KGZkLCAmYnVmKSA8IDApCi0JCWVycm9yKCJjYW4ndCBzdGF0ICVzOiAlcyIsIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7Ci0KLQljcCA9IG1hbGxvYygodV9pbnQpYnVmLnN0X3NpemUgKyAxKTsKLQlpZiAoY3AgPT0gTlVMTCkKLQkJZXJyb3IoIm1hbGxvYyglZCkgZm9yICVzOiAlcyIsICh1X2ludClidWYuc3Rfc2l6ZSArIDEsCi0JCQlmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOwotCWNjID0gcmVhZChmZCwgY3AsICh1X2ludClidWYuc3Rfc2l6ZSk7Ci0JaWYgKGNjIDwgMCkKLQkJZXJyb3IoInJlYWQgJXM6ICVzIiwgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKLQlpZiAoY2MgIT0gYnVmLnN0X3NpemUpCi0JCWVycm9yKCJzaG9ydCByZWFkICVzICglZCAhPSAlZCkiLCBmbmFtZSwgY2MsIChpbnQpYnVmLnN0X3NpemUpOwotCi0JY2xvc2UoZmQpOwotCS8qIHJlcGxhY2UgIiMgY29tbWVudCIgd2l0aCBzcGFjZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2M7IGkrKykgewotCQlpZiAoY3BbaV0gPT0gJyMnKQotCQkJd2hpbGUgKGkgPCBjYyAmJiBjcFtpXSAhPSAnXG4nKQotCQkJCWNwW2krK10gPSAnICc7Ci0JfQotCWNwW2NjXSA9ICdcMCc7Ci0JcmV0dXJuIChjcCk7Ci19Ci0KLXZvaWQKLXNhZmVwdXRzKGNvbnN0IGNoYXIgKnMsIGludCBtYXhsZW4pCi17Ci0gICAgaW50IGlkeCA9IDA7Ci0Jd2hpbGUgKCpzICYmIGlkeCA8IG1heGxlbikgewotCQlzYWZlcHV0Y2hhcigqcyk7Ci0gICAgICAgICAgICAgICAgaWR4Kys7Ci0JCXMrKzsKLQl9Ci19Ci0KLXZvaWQKLXNhZmVwdXRjaGFyKGludCBjKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0KLQljaCA9ICh1bnNpZ25lZCBjaGFyKShjICYgMHhmZik7Ci0JaWYgKGNoIDwgMHg4MCAmJiBpc3ByaW50KGNoKSkKLQkJcHJpbnRmKCIlYyIsIGNoKTsKLQllbHNlCi0JCXByaW50ZigiXFwlMDNvIiwgY2gpOwotfQpkaWZmIC0tZ2l0IGEvdmVyc2lvbi5jIGIvdmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmExYmE1Li4wMDAwMDAwCi0tLSBhL3ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNoYXIgdmVyc2lvbltdID0gIjMuOS44IjsKZGlmZiAtLWdpdCBhL3ZmcHJpbnRmLmMgYi92ZnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQ0MDZjLi4wMDAwMDAwCi0tLSBhL3ZmcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk1Ci0gKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucwotICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQotICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLSAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKLSAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6Ci0gKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKLSAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgotICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKLSAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLQotI2lmbmRlZiBsaW50Ci1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9Ci0gICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL3RjcGR1bXAvdmZwcmludGYuYyx2IDEuNiAyMDAzLzExLzE2IDA5OjM2OjQ1IGd1eSBFeHAgJCAoTEJMKSI7Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotCi0jaW5jbHVkZSAiaW50ZXJmYWNlLmgiCi0KLS8qCi0gKiBTdG9jayA0LjMgZG9lc24ndCBoYXZlIHZmcHJpbnRmLgotICogVGhpcyByb3V0aW5lIGlzIGR1ZSB0byBDaHJpcyBUb3Jlay4KLSAqLwotdmZwcmludGYoZiwgZm10LCBhcmdzKQotCUZJTEUgKmY7Ci0JY2hhciAqZm10OwotCXZhX2xpc3QgYXJnczsKLXsKLQlpbnQgcmV0OwotCi0JaWYgKChmLT5fZmxhZyAmIF9JT1dSVCkgPT0gMCkgewotCQlpZiAoZi0+X2ZsYWcgJiBfSU9SVykKLQkJCWYtPl9mbGFnIHw9IF9JT1dSVDsKLQkJZWxzZQotCQkJcmV0dXJuIEVPRjsKLQl9Ci0JcmV0ID0gX2RvcHJudChmbXQsIGFyZ3MsIGYpOwotCXJldHVybiBmZXJyb3IoZikgPyBFT0YgOiByZXQ7Ci19Cg==