VXBkYXRlIGF1dG90b29scyBpbmZyYXN0cnVjdHVyZSAoaW5jbHVkaW5nIGdldHRleHQpIHRvIG1vZGVybiB2ZXJzaW9ucy4KClVwc3RyZWFtLVN0YXR1czogSW5hcHByb3ByaWF0ZSBbdXBzdHJlYW0gaGFzbid0IGJlZW4gYWN0aXZlIHNpbmNlIDE5OThdClNpZ25lZC1vZmYtYnk6IFBoaWwgQmx1bmRlbGwgPHBiQHBiY2wubmV0PgoKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2NvbmZpZ3VyZS5pbiBscnpzei0wLjEyLjIwL2NvbmZpZ3VyZS5pbgotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9jb25maWd1cmUuaW4JMTk5OC0xMi0zMCAwNzo1MDowNy4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvY29uZmlndXJlLmluCTIwMTktMTEtMjUgMTY6MjI6MzcuMDAwMDAwMDAwICswMDAwCkBAIC05Miw3ICs5Miw2IEBAIEFDX1BST0dfUkFOTElCCiBBQ19JU0NfUE9TSVgKIEFDX0FJWAogQUNfTUlOSVgKLUFNX0NfUFJPVE9UWVBFUwogQUNfQ19DT05TVAogQUNfQ19JTkxJTkUKIApAQCAtMjUzLDE4ICsyNTIsMTMgQEAgaWhhdmUkbG9va3VwX2ZhY2lsaXR5CiBmaQogCiAKLUFDX1NVQlNUKENGTEFHUykKLUFDX1NVQlNUKExERkxBR1MpCiBBQ19TVUJTVChMSUJTKQogCi1BTV9HTlVfR0VUVEVYVAorQU1fR05VX0dFVFRFWFQoW2V4dGVybmFsXSkKIAotQUNfREVGSU5FX1VOUVVPVEVEKExPQ0FMRURJUiwiJHByZWZpeC8kREFUQURJUk5BTUUiKQotQUNfTElOS19GSUxFUygkbmxzX2N2X2hlYWRlcl9saWJndCwgJG5sc19jdl9oZWFkZXJfaW50bCkKLQotQUNfT1VUUFVUKFtNYWtlZmlsZSBpbnRsL01ha2VmaWxlIGxpYi9NYWtlZmlsZSB0ZXN0c3VpdGUvTWFrZWZpbGUgXAorQUNfT1VUUFVUKFtNYWtlZmlsZSBsaWIvTWFrZWZpbGUgdGVzdHN1aXRlL01ha2VmaWxlIFwKIG1hbi9NYWtlZmlsZSBwby9NYWtlZmlsZS5pbiBzcmMvTWFrZWZpbGUgZGViaWFuL3J1bGVzIFNwZWNmaWxlIHN5c3R5cGUgXAogc3JjL2xyenN6YnVnXSwKLVtzZWQgLWUgIi9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMiIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGU7IAorWwogY2htb2QgK3ggZGViaWFuL3J1bGVzOwogdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWhdKQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9iaW5kdGV4dGRvbS5jIGxyenN6LTAuMTIuMjAvaW50bC9iaW5kdGV4dGRvbS5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvYmluZHRleHRkb20uYwkxOTk4LTA0LTI2IDE0OjIyOjM2LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2JpbmR0ZXh0ZG9tLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTk5ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBiaW5kdGV4dGRvbWFpbigzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi1leHRlcm4gY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW107Ci0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIF9fYmluZHRleHRkb21haW4KLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jZWxzZQotIyBkZWZpbmUgQklORFRFWFRET01BSU4gYmluZHRleHRkb21haW5fXwotI2VuZGlmCi0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotY2hhciAqCi1CSU5EVEVYVERPTUFJTiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSAgc3RydWN0IGJpbmRpbmcgKmJpbmRpbmc7Ci0KLSAgLyogU29tZSBzYW5pdHkgY2hlY2tzLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCB8fCBkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0gICAgICBpZiAoY29tcGFyZSA9PSAwKQotCS8qIFdlIGZvdW5kIGl0ISAgKi8KLQlicmVhazsKLSAgICAgIGlmIChjb21wYXJlIDwgMCkKLQl7Ci0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgYmluZGluZyA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChkaXJuYW1lID09IE5VTEwpCi0gICAgLyogVGhlIGN1cnJlbnQgYmluZGluZyBoYXMgYmUgdG8gcmV0dXJuZWQuICAqLwotICAgIHJldHVybiBiaW5kaW5nID09IE5VTEwgPyAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lIDogYmluZGluZy0+ZGlybmFtZTsKLQotICBpZiAoYmluZGluZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSBkb21haW4gaXMgYWxyZWFkeSBib3VuZC4gIElmIHRoZSBuZXcgdmFsdWUgYW5kIHRoZSBvbGQKLQkgb25lIGFyZSBlcXVhbCB3ZSBzaW1wbHkgZG8gbm90aGluZy4gIE90aGVyd2lzZSByZXBsYWNlIHRoZQotCSBvbGQgYmluZGluZy4gICovCi0gICAgICBpZiAoc3RyY21wIChkaXJuYW1lLCBiaW5kaW5nLT5kaXJuYW1lKSAhPSAwKQotCXsKLQkgIGNoYXIgKm5ld19kaXJuYW1lOwotCi0JICBpZiAoc3RyY21wIChkaXJuYW1lLCBfbmxfZGVmYXVsdF9kaXJuYW1lKSA9PSAwKQotCSAgICBuZXdfZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0JICBlbHNlCi0JICAgIHsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLQkgICAgICBuZXdfZGlybmFtZSA9IHN0cmR1cCAoZGlybmFtZSk7Ci0JICAgICAgaWYgKG5ld19kaXJuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotI2Vsc2UKLQkgICAgICBzaXplX3QgbGVuID0gc3RybGVuIChkaXJuYW1lKSArIDE7Ci0JICAgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICAgICAgaWYgKG5ld19kaXJuYW1lID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JICAgICAgbWVtY3B5IChuZXdfZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKLSNlbmRpZgotCSAgICB9Ci0KLQkgIGlmIChiaW5kaW5nLT5kaXJuYW1lICE9IF9ubF9kZWZhdWx0X2Rpcm5hbWUpCi0JICAgIGZyZWUgKGJpbmRpbmctPmRpcm5hbWUpOwotCi0JICBiaW5kaW5nLT5kaXJuYW1lID0gbmV3X2Rpcm5hbWU7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IGJpbmRpbmcuICAqLwotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHN0cnVjdCBiaW5kaW5nICpuZXdfYmluZGluZyA9Ci0JKHN0cnVjdCBiaW5kaW5nICopIG1hbGxvYyAoc2l6ZW9mICgqbmV3X2JpbmRpbmcpKTsKLQotICAgICAgaWYgKG5ld19iaW5kaW5nID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gc3RyZHVwIChkb21haW5uYW1lKTsKLSAgICAgIGlmIChuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotI2Vsc2UKLSAgICAgIGxlbiA9IHN0cmxlbiAoZG9tYWlubmFtZSkgKyAxOwotICAgICAgbmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIG1lbWNweSAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUsIGRvbWFpbm5hbWUsIGxlbik7Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQluZXdfYmluZGluZy0+ZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0gICAgICBlbHNlCi0JewotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSBzdHJkdXAgKGRpcm5hbWUpOwotCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotI2Vsc2UKLQkgIGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCSAgbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0JICBpZiAobmV3X2JpbmRpbmctPmRpcm5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kaXJuYW1lLCBkaXJuYW1lLCBsZW4pOwotI2VuZGlmCi0JfQotCi0gICAgICAvKiBOb3cgZW5xdWV1ZSBpdC4gICovCi0gICAgICBpZiAoX25sX2RvbWFpbl9iaW5kaW5ncyA9PSBOVUxMCi0JICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kb21haW5fYmluZGluZ3MtPmRvbWFpbm5hbWUpIDwgMCkKLQl7Ci0JICBuZXdfYmluZGluZy0+bmV4dCA9IF9ubF9kb21haW5fYmluZGluZ3M7Ci0JICBfbmxfZG9tYWluX2JpbmRpbmdzID0gbmV3X2JpbmRpbmc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotCSAgd2hpbGUgKGJpbmRpbmctPm5leHQgIT0gTlVMTAotCQkgJiYgc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5uZXh0LT5kb21haW5uYW1lKSA+IDApCi0JICAgIGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0OwotCi0JICBuZXdfYmluZGluZy0+bmV4dCA9IGJpbmRpbmctPm5leHQ7Ci0JICBiaW5kaW5nLT5uZXh0ID0gbmV3X2JpbmRpbmc7Ci0JfQotCi0gICAgICBiaW5kaW5nID0gbmV3X2JpbmRpbmc7Ci0gICAgfQotCi0gIHJldHVybiBiaW5kaW5nLT5kaXJuYW1lOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19iaW5kdGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOwotI2VuZGlmCmRpZmYgLXVwck4gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2NhdC1jb21wYXQuYyBscnpzei0wLjEyLjIwL2ludGwvY2F0LWNvbXBhdC5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvY2F0LWNvbXBhdC5jCTE5OTgtMDQtMjYgMTQ6MjI6MzcuMDAwMDAwMDAwICswMTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvY2F0LWNvbXBhdC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDI2MiArMCwwIEBACi0vKiBDb21wYXRpYmlsaXR5IGNvZGUgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX05MX1RZUEVTX0gKLSMgaW5jbHVkZSA8bmxfdHlwZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICBgYERpcmVjdHMgYHNldGxvY2FsZSgpJyB0byBxdWVyeSBgY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAgc2V0dGluZyBvZiBgbG9jYWwnLicnCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIEFuZCBldmVuIHdvcnNlOiBQT1NJWAotICAgZGVmaW5lcyB0aGlzIG5vdCBhdCBhbGwuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkCi0gICBzeXN0ZW0gKGUuZy4gdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBIQVZFX0xPQ0FMRV9OVUxMCi0jZW5kaWYKLQotLyogVGhlIGNhdGFsb2cgZGVzY3JpcHRvci4gICovCi1zdGF0aWMgbmxfY2F0ZCBjYXRhbG9nID0gKG5sX2NhdGQpIC0xOwotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdF9jYXRhbG9nX25hbWVbXSA9ICJtZXNzYWdlcyI7Ci0KLS8qIE5hbWUgb2YgY3VycmVudGx5IHVzZWQgY2F0YWxvZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY2F0YWxvZ19uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7Ci0KLS8qIEdldCBJRCBmb3IgZ2l2ZW4gc3RyaW5nLiAgSWYgbm90IGZvdW5kIHJldHVybiAtMS4gICovCi1zdGF0aWMgaW50IG1zZ190b19jYXRfaWQgUEFSQU1TICgoY29uc3QgY2hhciAqbXNnKSk7Ci0KLS8qIFN1YnN0aXR1dGlvbiBmb3Igc3lzdGVtcyBsYWNraW5nIHRoaXMgZnVuY3Rpb24gaW4gdGhlaXIgQyBsaWJyYXJ5LiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotI2VuZGlmCi0KLQotLyogU2V0IGN1cnJlbnRseSB1c2VkIGRvbWFpbi9jYXRhbG9nLiAgKi8KLWNoYXIgKgotdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgbmxfY2F0ZCBuZXdfY2F0YWxvZzsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIHNpemVfdCBuZXdfbmFtZV9sZW47Ci0gIGNoYXIgKmxhbmc7Ci0KLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyBcCi0gICAgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0gIGxhbmcgPSBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCBOVUxMKTsKLSNlbHNlCi0gIGxhbmcgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0gICAgewotICAgICAgbGFuZyA9IGdldGVudiAoIkxDX01FU1NBR0VTIik7Ci0gICAgICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLQlsYW5nID0gZ2V0ZW52ICgiTEFORyIpOwotICAgIH0KLSNlbmRpZgotICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLSAgICBsYW5nID0gIkMiOwotCi0gIC8qIFNlZSB3aGV0aGVyIG5hbWUgb2YgY3VycmVudGx5IHVzZWQgZG9tYWluIGlzIGFza2VkLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotCi0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgZG9tYWlubmFtZSA9IGRlZmF1bHRfY2F0YWxvZ19uYW1lOwotCi0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gICovCi0gIG5ld19uYW1lX2xlbiA9IHNpemVvZiAoTE9DQUxFRElSKSAtIDEgKyAxICsgc3RybGVuIChsYW5nKQotCQkgKyBzaXplb2YgKCIvTENfTUVTU0FHRVMvIikgLSAxICsgc2l6ZW9mIChQQUNLQUdFKSAtIDEKLQkJICsgc2l6ZW9mICgiLmNhdCIpOwotCi0gIG5ld19uYW1lID0gKGNoYXIgKikgbWFsbG9jIChuZXdfbmFtZV9sZW4pOwotICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld19uYW1lLCBQQUNLQUdFKTsKLSAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7Ci0KLSAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKLSAgICB7Ci0gICAgICAvKiBOTFNQQVRIIHNlYXJjaCBkaWRuJ3Qgd29yaywgdHJ5IGFic29sdXRlIHBhdGggKi8KLSAgICAgIHNwcmludGYgKG5ld19uYW1lLCAiJXMvJXMvTENfTUVTU0FHRVMvJXMuY2F0IiwgTE9DQUxFRElSLCBsYW5nLAotCSAgICAgICBQQUNLQUdFKTsKLSAgICAgIG5ld19jYXRhbG9nID0gY2F0b3BlbiAobmV3X25hbWUsIDApOwotCi0gICAgICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotCXsKLQkgIGZyZWUgKG5ld19uYW1lKTsKLQkgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci0JfQotICAgIH0KLQotICAvKiBDbG9zZSBvbGQgY2F0YWxvZy4gICovCi0gIGlmIChjYXRhbG9nICE9IChubF9jYXRkKSAtMSkKLSAgICBjYXRjbG9zZSAoY2F0YWxvZyk7Ci0gIGlmIChjYXRhbG9nX25hbWUgIT0gZGVmYXVsdF9jYXRhbG9nX25hbWUpCi0gICAgZnJlZSAoKGNoYXIgKikgY2F0YWxvZ19uYW1lKTsKLQotICBjYXRhbG9nID0gbmV3X2NhdGFsb2c7Ci0gIGNhdGFsb2dfbmFtZSA9IG5ld19uYW1lOwotCi0gIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci19Ci0KLWNoYXIgKgotYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0jaWYgSEFWRV9TRVRFTlYgfHwgSEFWRV9QVVRFTlYKLSAgY2hhciAqb2xkX3ZhbCwgKm5ld192YWwsICpjcDsKLSAgc2l6ZV90IG5ld192YWxfbGVuOwotCi0gIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGhlcmUgYnV0IHRvIGJlIGNvbXBhdGlibGUgZG8gaXQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gIElmIHdlIHVzZSBzZXRlbnYgd2UgZG9uJ3QgbmVlZAotICAgICB0aGUgZmlyc3QgYnl0cyBmb3IgTkxTUEFUSD0sIGJ1dCB3aHkgY29tcGxpY2F0ZSB0aGUgY29kZSBmb3IgdGhpcwotICAgICBwZWFudXRzLiAgKi8KLSAgbmV3X3ZhbF9sZW4gPSBzaXplb2YgKCJOTFNQQVRIPSIpIC0gMSArIHN0cmxlbiAoZGlybmFtZSkKLQkJKyBzaXplb2YgKCIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0KLSAgb2xkX3ZhbCA9IGdldGVudiAoIk5MU1BBVEgiKTsKLSAgaWYgKG9sZF92YWwgPT0gTlVMTCB8fCBvbGRfdmFsWzBdID09ICdcMCcpCi0gICAgewotICAgICAgb2xkX3ZhbCA9IE5VTEw7Ci0gICAgICBuZXdfdmFsX2xlbiArPSAxICsgc2l6ZW9mIChMT0NBTEVESVIpIC0gMQotCSAgICAgICAgICAgICArIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBuZXdfdmFsX2xlbiArPSBzdHJsZW4gKG9sZF92YWwpOwotCi0gIG5ld192YWwgPSAoY2hhciAqKSBtYWxsb2MgKG5ld192YWxfbGVuKTsKLSAgaWYgKG5ld192YWwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotIyBpZiBIQVZFX1NFVEVOVgotICBjcCA9IG5ld192YWw7Ci0jIGVsc2UKLSAgY3AgPSBzdHBjcHkgKG5ld192YWwsICJOTFNQQVRIPSIpOwotIyBlbmRpZgotCi0gIGNwID0gc3RwY3B5IChjcCwgZGlybmFtZSk7Ci0gIGNwID0gc3RwY3B5IChjcCwgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQ6Iik7Ci0KLSAgaWYgKG9sZF92YWwgPT0gTlVMTCkKLSAgICB7Ci0jIGlmIF9fU1REQ19fCi0gICAgICBzdHBjcHkgKGNwLCBMT0NBTEVESVIgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSMgZWxzZQotCi0gICAgICBjcCA9IHN0cGNweSAoY3AsIExPQ0FMRURJUik7Ci0gICAgICBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotIyBlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHN0cGNweSAoY3AsIG9sZF92YWwpOwotCi0jIGlmIEhBVkVfU0VURU5WCi0gIHNldGVudiAoIk5MU1BBVEgiLCBuZXdfdmFsLCAxKTsKLSAgZnJlZSAobmV3X3ZhbCk7Ci0jIGVsc2UKLSAgcHV0ZW52IChuZXdfdmFsKTsKLSAgLyogRG8gKm5vdCogZnJlZSB0aGUgZW52aXJvbm1lbnQgZW50cnkgd2UganVzdCBlbnRlcmVkLiAgSXQgaXMgdXNlZAotICAgICBmcm9tIG5vdyBvbi4gICAqLwotIyBlbmRpZgotCi0jZW5kaWYKLQotICByZXR1cm4gKGNoYXIgKikgZG9tYWlubmFtZTsKLX0KLQotI3VuZGVmIGdldHRleHQKLWNoYXIgKgotZ2V0dGV4dCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBtc2dpZDsKLQotICBpZiAobXNnID09IE5VTEwgfHwgY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0gICAgcmV0dXJuIChjaGFyICopIG1zZzsKLQotICAvKiBHZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY2F0YWxvZy4gIFdlIGFsd2F5cyB1c2Ugc2V0IG51bWJlciAxLgotICAgICBUaGUgbWVzc2FnZSBJRCBpcyBjb21wdXRlZCBieSB0aGUgZnVuY3Rpb24gYG1zZ190b19jYXRfaWQnCi0gICAgIHdoaWNoIHdvcmtzIG9uIHRoZSB0YWJsZSBnZW5lcmF0ZWQgYnkgYHBvLXRvLXRibCcuICAqLwotICBtc2dpZCA9IG1zZ190b19jYXRfaWQgKG1zZyk7Ci0gIGlmIChtc2dpZCA9PSAtMSkKLSAgICByZXR1cm4gKGNoYXIgKikgbXNnOwotCi0gIHJldHVybiBjYXRnZXRzIChjYXRhbG9nLCAxLCBtc2dpZCwgKGNoYXIgKikgbXNnKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSB0YWJsZSBgX21zZ190YmwnIHdoaWNoIGhhcyBgX21zZ190YmxfbGVuZ3RoJyBlbnRyaWVzCi0gICBmb3IgdGhlIG9uZSBlcXVhbCB0byBtc2cuICBJZiBpdCBpcyBmb3VuZCByZXR1cm4gdGhlIElELiAgSW4gY2FzZSB3aGVuCi0gICB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLwotc3RhdGljIGludAotbXNnX3RvX2NhdF9pZCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBfbXNnX3RibF9sZW5ndGg7ICsrY250KQotICAgIGlmIChzdHJjbXAgKG1zZywgX21zZ190YmxbY250XS5fbXNnKSA9PSAwKQotICAgICAgcmV0dXJuIF9tc2dfdGJsW2NudF0uX21zZ19udW1iZXI7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvQ2hhbmdlTG9nIGxyenN6LTAuMTIuMjAvaW50bC9DaGFuZ2VMb2cKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9DaGFuZ2VMb2cJMTk5OC0wNC0yNiAxNDoyMjozNS4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9DaGFuZ2VMb2cJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTAyMiArMCwwIEBACi0xOTk3LTA5LTA2IDAyOjEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbjogUmVmb3JtYXQgY29weXJpZ2h0LgotCi0xOTk3LTA4LTE5IDE1OjIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFJlbW92ZSB3cm9uZyBjb21tZW50LgotCi0xOTk3LTA4LTE2IDAwOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IERvbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gaW5zdGFsbC4KLQotMTk5Ny0wOC0wMSAxNDozMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNhdC1jb21wYXQuYzogRml4IGNvcHlyaWdodC4KLQotCSogbG9jYWxlYWxpYXMuYzogRG9uJ3QgZGVmaW5lIHN0cmNociB1bmxlc3MgIUhBVkVfU1RSQ0hSLgotCi0JKiBsb2FkbXNnY2F0LmM6IFVwZGF0ZSBjb3B5cmlnaHQuICBGaXggdHlwb3MuCi0KLQkqIGwxMG5mbGlzdC5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCi0JKF9ubF9tYWtlX2wxMG5mbGlzdCk6IEhhbmRsZSBzcG9uc29yIGFuZCByZXZpc2lvbiBjb3JyZWN0bHkuCi0KLQkqIGdldHRleHQuYzogVXBkYXRlIGNvcHlyaWdodC4KLQkqIGdldHRleHQuaDogTGlrZXdpc2UuCi0JKiBoYXNoLXN0cmluZy5oOiBMaWtld2lzZS4KLQotCSogZmluZGRvbWFpbi5jOiBSZW1vYXZlIGRlYWQgY29kZS4gIERlZmluZSBzdHJjaHIgb25seSBpZgotCSFIQVZFX1NUUkNIUi4KLQotCSogZXhwbG9kZW5hbWUuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCi0JKiBleHBsb2RlbmFtZS5jOiBSZWZvcm1hdCBjb3B5cmlnaHQgdGV4dC4KLQkoX25sX2V4cGxvZGVfbmFtZSk6IEZpeCB0eXBvLgotCi0JKiBkY2dldHRleHQuYzogRGVmaW5lIGFuZCB1c2UgX19zZXRfZXJybm8uCi0JKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgdXNlIHNldGxvY2FsZSBpZiBIQVZFX0xDX01FU1NBR0VTIGlzCi0Jbm90IGRlZmluZWQuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IFByZXR0eSBwcmludGluZy4KLQotMTk5Ny0wNS0wMSAwMjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IGRlcGVuZCBvbgotCUhBVkVfTENfTUVTU0FHRVMuICBXZSBkb24ndCBuZWVkIHRoZSBtYWNybyBoZXJlLgotCVBhdGNoIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGlsb2cuZnI+LgotCi0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOiBEb04ndCByZWZlciB0byBIQVZFX1NFVExPQ0FMRV9OVUxMCi0JbWFjcm8uICBJbnN0ZWFkIHVzZSBIQVZFX0xPQ0FMRV9OVUxMIGFuZCBkZWZpbmUgaXQgd2hlbiB1c2luZwotCWdsaWJjLCBhcyBpbiBkY2dldHRleHQuYy4KLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KLQotCSogTWFrZWZpbGUuaW4gKENQUEZMQUdTKTogTmV3IHZhcmlhYmxlLiAgUmVwb3J0ZWQgYnkgRnJhbmMsb2lzCi0JUGluYXJkLgotCi1Nb24gTWFyIDEwIDA2OjUxOjE3IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogSW1wbGVtZW50IGhhbmRsaW5nIG9mIGxpYnRvb2wuCi0KLQkqIGdldHRleHRQLmg6IENoYW5nZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHVzZSBvZiBnZW5lcmljIGxvd2xldmVsCi0JaTE4biBmaWxlIGhhbmRsaW5nLgotCi1XZWQgRGVjICA0IDIwOjIxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiB0ZXh0ZG9tYWluLmM6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgYXJndW1lbnRzIG9mIG1lbWNweSBtYWNybwotCWRlZmluaXRpb24uCi0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KLQkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KLQkqIGZpbmRkb21haW4uYzogTGlrZXdpc2UuCi0JKiBiaW5kdGV4dGRvbS5jOiBMaWtld2lzZS4KLQlSZXBvcnRlZCBieSBUaG9tYXMgRXNrZW4uCi0KLU1vbiBOb3YgMjUgMjI6NTc6NTEgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHRleHRkb21haW4uYzogTW92ZSBkZWZpbml0aW9uIG9mIGBtZW1jcHlgIG1hY3JvIHRvIHJpZ2h0Ci0JcG9zaXRpb24uCi0KLUZyaSBOb3YgMjIgMDQ6MDE6NTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGZpbmRkb21haW4uYyBbIUhBVkVfU1RSSU5HX0ggJiYgIV9MSUJDXTogRGVmaW5lIG1lbWNweSB1c2luZwotIAliY29weSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgotCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCi0JKiBsMTBuZmxpc3QuYzogTGlrZXdpc2UuCi0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KLQkqIHRleHRkb21haW4uYzogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMjkgMTE6MTA6MjcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsaWJkaXIpOiBDaGFuZ2UgdG8gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YKLSAJcHJlZml4LiAgUmVwb3J0ZWQgYnkgS251dC1I5XZhcmRBa3NuZXMgPGV0b2tuYUBldG8uZXJpY3Nzb24uc2U+LgotCi1TYXQgQXVnIDMxIDAzOjA3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYyAoX25sX25vcm1hbGl6ZV9jb2Rlc2V0KTogV2UgY29udmVydCB0byBsb3dlciBjYXNlLAotCXNvIGRvbid0IHByZXBlbmQgdXBwZXJjYXNlIGBJU08nIGZvciBvbmx5IG51bWVyaWMgYXJnLgotCi1GcmkgSnVsIDE5IDAwOjE1OjQ2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogTW92ZSBpbmNsdXNpb24gb2YgYXJnei5oLCBjdHlwZS5oLCBzdGRsaWIuaCBhZnRlcgotCWRlZmluaXRpb24gb2YgX0dOVV9TT1VSQ0UuICBQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KLQotCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IEZpeCBhbm90aGVyIGJ1ZyB3aXRoIGBmb3InIGxvb3AgYW5kCi0JZW1wdHkgYXJndW1lbnRzLiAgUGF0Y2ggYnkgSmltIE1leWVyaW5nLiAgQ29ycmVjdCBuYW1lIG9zCi0JdW5pbnN0YWxsZWQgZmlsZXM6IG5vIGludGwtIHByZWZpeCBhbnltb3JlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogQWdhaW4gd29yayBhcm91bmQgc2hlbGxzIHdoaWNoCi0JY2Fubm90IGhhbmRsZSBtcHR5IGZvciBsaXN0LiAgUmVwb3J0ZWQgYnkgSmltIE1leWVyaW5nLgotCi1TYXQgSnVsIDEzIDE4OjExOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFNwbGl0IGdvYWwuICBOb3cgZGVwZW5kIG9uIGluc3RhbGwtZXhlYwotICAgICAgICBhbmQgaW5zdGFsbC1kYXRhLgotCShpbnN0YWxsLWV4ZWMsIGluc3RhbGwtZGF0YSk6IE5ldyBnb2Fscy4gIENyZWF0ZWQgZnJvbSBmb3JtZXIKLQlpbnN0YWxsIGdvYWwuCi0JUmVwb3J0ZWQgYnkgS2FybCBCZXJyeS4KLQotU2F0IEp1biAyMiAwNDo1ODoxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1LSU5TVEFMTERJUlMpOiBOZXcgdmFyaWFibGUuICBQYXRoIHRvCi0gICAgICAgIG1raW5zdGFsbGRpcnMgc2NyaXB0LgotCShpbnN0YWxsKTogdXNlIE1LSU5TVEFMTERJUlMgdmFyaWFibGUgb3IgaWYgdGhlIHNjcmlwdCBpcyBub3QgcHJlc2VudAotCXRyeSB0byBmaW5kIGl0IGluIHRoZSAkdG9wX3NjcmRpcikuCi0KLVdlZCBKdW4gMTkgMDI6NTY6NTYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBMaW51eCBsaWJjICpwYXJ0bHkqIGluY2x1ZGVzIHRoZSBhcmd6XyogZnVuY3Rpb25zLgotCUdyci4gIFdvcmsgYXJvdW5kIGJ5IHJlbmFtaW5nIHRoZSBzdGF0aWMgdmVyc2lvbiBhbmQgdXNlIG1hY3JvcwotCWZvciByZW5hbWluZy4KLQotVHVlIEp1biAxOCAyMDoxMToxNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgcHJlc2VuY2UgdGVzdCBtYWNyb3Mgb2YgX19hcmd6XyogZnVuY3Rpb25zLgotCi0JKiBsMTBuZmxpc3QuYzogSW5jbHVkZSA8YXJnei5oPiBiYXNlZCBvbiB0ZXN0IG9mIGl0IGluc3RlYWQgd2hlbgotCV9fYXJnel8qIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLgotCVJlcG9ydGVkIGJ5IEFuZHJlYXMgU2Nod2FiLgotCi1UaHUgSnVuIDEzIDE1OjE3OjQ0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBleHBsb2RlbmFtZS5jLCBsMTBuZmxpc3QuYzogRGVmaW5lIE5VTEwgZm9yIGR1bWIgc3lzdGVtcy4KLQotVHVlIEp1biAxMSAxNzowNToxMyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oIChkY2dldHRleHQpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUKLQlyZXN1bHQgdG8gX19yZXN1bHQgdG8gcHJldmVudCBuYW1lIGNsYXNoLgotCi0JKiBsMTBuZmxpc3QuYywgbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmM6IERlZmluZSBfR05VX1NPVVJDRSB0bwotICAgICAgICBnZXQgcHJvdG90eXBlIGZvciBzdHBjcHkgYW5kIHN0cmNhc2VjbXAuCi0KLQkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaDogTW92ZSBkZWNsYXJhdGlvbiBvZgotCWBfbmxfbXNnX2NhdF9jbnRyJyBvdXRzaWRlIF9fZXh0ZW5zaW9uX18gYmxvY2sgdG8gcHJldmVudCB3YXJuaW5nCi0JZnJvbSBnY2MncyAtV25lc3RlZC1leHRlcm4gb3B0aW9uLgotCi1GcmkgSnVuICA3IDAxOjU4OjAwIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSBjb21tZW50LgotCi1UaHUgSnVuICA2IDE3OjI4OjE3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFdvcmsgYXJvdW5kIGZvciBhbm90aGVyIEJ1Z2xpeCBzdHVwaWRpdHkuCi0JQWx3YXlzIHVzZSBhbiBgZWxzZScgY2xvc2UgZm9yIGBpZidzLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW50bGguaW5zdCk6IENvcnJlY3QgdHlwbyBpbiBwaG9ueSBydWxlLgotCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotVGh1IEp1biAgNiAwMTo0OTo1MiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJpYWJsZSBhbGxvY2FfbGlzdCB0bwotCWJsb2NrX2xpc3QgYXMgdGhlIG1hY3JvIGNhbGxzIGFzc3VtZS4KLQlQYXRjaCBieSBFcmljIEJhY2t1cy4KLQotCSogbG9jYWxlYWxpYXMuYyBbIUhBVkVfQUxMT0NBXTogRGVmaW5lIGFsbG9jYSBhcyBtYWNybyB1c2luZwotICAgICAgICBtYWxsb2MuCi0JKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJyaWFiZSBhbGxvY2FfbGlzdCB0byBibG9ja19saXN0IGFzIHRoZQotCW1hY3JvIGNhbGxzIGFzc3VtZS4KLQlQYXRjaCBieSBFcmljIEJhY2t1cy4KLQotCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgY29uZGl0aW9uYWwgZm9yIDxhcmd6Lmg+IGluY2x1c2lvbi4KLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQCwgbm90Ci0gICAgICAgIGFsbC1AVVNFX05MU0AuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaW50bGguaW5zdCBjb21lcyBmcm9tIGxvY2FsIGRpciwgbm90Ci0gICAgICAgICQoc3JjZGlyKS4KLQotCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBTcGVjaWFsIGhhbmRsaW5nIG9mIHRoaXMgZ29hbC4gIElmCi0JdXNlZCBpbiBnZXR0ZXh0LCB0aGlzIGlzIHJlYWxseSBhIHJ1bCB0byBjb25zdHJ1Y3QgdGhpcyBmaWxlLiAgSWYKLQl1c2VkIGluIGFueSBvdGhlciBwYWNrYWdlIGl0IGlzIGRlZmluZWQgYXMgYSAuUEhPTlkgcnVsZSB3aXRoCi0JZW1wdHkgYm9keS4KLQotCSogZmluZGRvbWFpbi5jOiBFeHRyYWN0IGxvY2FsZSBmaWxlIGluZm9ybWF0aW9uIGhhbmRsaW5nIGludG8KLQlsMTBuZmlsZS5jLiAgUmVuYW1lIGxvY2FsIHN0cGNweV9fIGZ1bmN0aW9uIHRvIHN0cGNweS4KLQotCSogZGNnZXR0ZXh0LmMgKHN0cGNweSk6IEFkZCBsb2NhbCBkZWZpbml0aW9uLgotCi0JKiBsMTBuZmxpc3QuYzogU29sdmUgc29tZSBwb3J0YWJpbGl0eSBwcm9ibGVtcy4gIFBhdGNoZXMgcGFydGx5IGJ5Ci0JVGhvbWFzIEVza2VuLiAgQWRkIGxvY2FsIGRlZmluaXRpb24gb2Ygc3RwY3B5LgotCi1UdWUgSnVuICA0IDAyOjQ3OjQ5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluOiBEb24ndCBkZXBlbmQgaW5jbHVkaW5nIDxsb2NhbGUuaD4gb24KLQlIQVZFX0xPQ0FMRV9ILiAgSW5zdGVhZCBjb25maWd1cmUgbXVzdCByZXdyaXRlIHRoaXMgZmlpbGUKLQlkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgY29uZmlndXJlIHJ1bi4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBsaWJpbnRsLmluc3QgaXMgbm93IGNhbGxlZCBpbnRsaC5pbnN0LgotCUFkZCBydWxlcyBmb3IgdXBkYXRpbmcgaW50bGguaW5zdCBmcm9tIGludGxoLmluc3QuaW4uCi0KLQkqIGxpYmludGwuaW5zdDogUmVuYW1lZCB0byBpbnRsaC5pbnN0LmluLgotCi0JKiBsb2NhbGVhbGlhcy5jLCBkY2dldHRleHQuYyBbX19HTlVDX19dOiBEZWZpbmUgSEFWRV9BTExPQ0EgdG8gMQotICAgICAgICBiZWNhdXNlIGdjYyBoYXMgX19idWl0bGluX2FsbG9jYS4KLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotTW9uIEp1biAgMyAwMDozMjoxNiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxjaGVjayk6IE5ldyBnb2FsIHRvIGZ1bGZpbGwgbmVlZHMgb2YKLSAgICAgICAgYXV0b21ha2UncyBkaXN0Y2hlY2suCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVvcmRlciBjb21tYW5kcyBzbyB0aGF0IFZFUlNJT04gaXMKLSAgICAgICAgZm91bmQuCi0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKTogTm93IHVzZSBzdWJkaXJlY3RvcnkgaW50bC8gaW4KLSAgICAgICAgQGRhdGFkaXJAL2dldHRleHQuCi0JKENPTVNSQ1MpOiBBZGQgbDEwbmZpbGUuYy4KLQkoT0JKRUNUUyk6IEFkZCBsMTBuZmlsZS5vLgotCShESVNURklMRVMpOiBSZW5hbWUgdG8gRElTVEZJTEUubm9ybWFsLiAgUmVtb3ZlICQoRElTVEZJTEVTLmNvbW1vbikuCi0JKERJU1RGSUxFLmdldHRleHQpOiBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KLQkoYWxsLWdldHRleHQpOiBSZW1vdmUgZ29hbC4KLQkoaW5zdGFsbCk6IElmICQoUEFDS0FHRSkgPSBnZXR0ZXh0IGluc3RhbGwsIG90aGVyd29zZSBkbyBub3RoaW5nLiAgTm8KLQlwYWNrYWdlIGJ1dCBnZXR0ZXh0IGl0c2VsZiBzaG91bGQgaW5zdGFsbCBsaWJpbnRsLmggKyBoZWFkZXJzLgotCShkaXN0KTogRXh0ZW5kIGdvYWwgdG8gd29yayBmb3IgZ2V0dGV4dCwgdG9vLgotCShkaXN0LWdldHRleHQpOiBSZW1vdmUgZ29hbC4KLQotCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBtYWNybyBhbGxvY2EgYnkgdXNpbmcgbWFsbG9jLgotCi1TdW4gSnVuICAyIDE3OjMzOjA2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFBhcmFtZXRlciBpcyBub3cgY29tZXMgZnJvbQotICAgICAgICBmaW5kX2wxMG5maWxlLgotCi1TYXQgSnVuICAxIDAyOjIzOjAzIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYyAoX19hcmd6X25leHQpOiBBZGQgZGVmaW5pdGlvbi4KLQotCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nIGFsbG9jYQotCWNvZGUuICBVc2UgbmV3IGwxMG5maWxlIGhhbmRsaW5nLgotCi0JKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZwotICAgICAgICBhbGxvY2EgY29kZS4KLQotCSogbDEwbmZsaXN0LmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLVR1ZSBBcHIgIDIgMTg6NTE6MTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0KTogTmV3IGdvYWwuICBTYW1lIGFzIGFsbC15ZXMuCi0KLVRodSBNYXIgMjggMjM6MDE6MjIgMTk5NiAgS2FybCBFaWNod2FsZGVyICA8a2VAa2UuY2VudHJhbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOiBEZWZpbmUgdXNpbmcgQGRhdGFkaXJALgotCi1UdWUgTWFyIDI2IDEyOjM5OjE0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSA8Y3R5cGUuaD4uICBSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotU2F0IE1hciAyMyAwMjowMDozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6IFJlbmFtZSB0byBzdHBjcHlfXyB0byBwcmV2ZW50IGNsYXNoaW5nCi0gICAgICAgIHdpdGggZXh0ZXJuYWwgZGVjbGFyYXRpb24uCi0KLVNhdCBNYXIgIDIgMDA6NDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1ubyk6IFJlbmFtZSBmcm9tIGFsbF9uby4KLQotU2F0IEZlYiAxNyAwMDoyNTo1OSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIFtsb2FkZWRfZG9tYWluXTogQXJyYXkgYHN1Y2Nlc3NvcicgbXVzdCBub3cgY29udGFpbiB1cAotICAgICAgICB0byA2MyBlbGVtZW50cyAoYmVjYXVzZSBvZiBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbikuCi0KLQkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uLgotCi1UaHUgRmViIDE1IDA0OjM5OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZWZpbmUgdG8gYGFsbC1AVVNFX05MU0AnLgotCShhbGwteWVzLCBhbGxfbm8pOiBOZXcgZ29hbHMuICBgYWxsLW5vJyBpcyBub29wLCBgYWxsLXllcycKLQlpcyBmb3JtZXIgYWxsLgotCi1Nb24gSmFuIDE1IDIxOjQ2OjAxIDE5OTYgIEhvd2FyZCBHYXlsZSAgPGhvd2FyZEBoYWwuY29tPgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKTogSW5jcmVtZW50IHN0cmluZyBwb2ludGVycyBpbiBsb29wCi0gICAgICAgIG9mIHN0cmNhc2VjbXAgcmVwbGFjZW1lbnQuCi0KLUZyaSBEZWMgMjkgMjE6MTY6MzQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogV2hvIGNvbW1lbnRlZCB0aGlzIGdvYWwgb3V0ID8gOi0pCi0KLUZyaSBEZWMgMjkgMTU6MDg6MTYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFNhdmUgYGVycm5vJy4gIEZhaWxpbmcgc3lzdGVtIGNhbGxzCi0Jc2hvdWxkIG5vdCBlZmZlY3QgaXQgYmVjYXVzZSBhIG1pc3NpbmcgY2F0YWxvZyBpcyBubyBlcnJvci4KLQlSZXBvcnRlZCBieSBIYXJhbGQgSzxvOj5uaWcgPGtvZW5pZ0B0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGU+LgotCi1UdWUgRGVjIDE5IDIyOjA5OjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEV4cGxpY2l0bHkgdXNlICQoU0hFTEwpIGZvciBydW5uaW5nCi0gICAgICAgIHNoZWxsIHNjcmlwdHMuCi0KLUZyaSBEZWMgMTUgMTc6MzQ6NTkgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IE9ubHkgaW5zdGFsbCBsaWJyYXJ5IGFuZCBoZWFkZXIgd2hlbgotCXdlIHVzZSB0aGUgb3duIGltcGxlbWVudGF0aW9uLiAgRG9uJ3QgZG8gaXQgd2hlbiB1c2luZyB0aGUKLQlzeXN0ZW0ncyBnZXR0ZXh0IG9yIGNhdGdldHMgZnVuY3Rpb25zLgotCi0JKiBkY2dldHRleHQuYyAoZmluZF9tc2cpOiBNdXN0IG5vdCBzd2FwIGRvbWFpbi0+aGFzaF9zaXplIGhlcmUuCi0KLVNhdCBEZWMgIDkgMTY6MjQ6MzcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYywgbGliaW50bC5pbnN0LCBsaWJnZXR0ZXh0LmgsIGhhc2gtc3RyaW5nLmgsCi0JZ2V0dGV4dFAuaCwgZmluZGRvbWFpbi5jLCBkY2dldHRleHQuYywgY2F0LWNvbXBhdC5jOgotCVVzZSBQQVJBTVMgaW5zdGVhZCBvZiBfX1AuICBTdWdnZXN0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLVR1ZSBEZWMgIDUgMTE6Mzk6MTQgMTk5NSAgTGFycnkgU2Nod2ltbWVyICA8cm9zZWJ1ZEBjeWNsb25lLnN0YW5mb3JkLmVkdT4KLQotCSogbGliZ2V0dGV4dC5oOiBVc2UgYCNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCknIGluc3RlYWQgb2YgYCNpZgotCSFfTElCSU5UTF9IJyBiZWNhdXNlIFNvbGFyaXMgZGVmaW5lcyBfTElCSU5UTF9IIGFzIGVtcHR5LgotCi1Nb24gRGVjICA0IDE1OjQyOjA3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6Ci0JSW5zdGFsbCBsaWJpbnRsLmluc3QgaW5zdGVhZCBvZiBsaWJpbnRsLmguaW5zdGFsbC4KLQotU2F0IERlYyAgMiAyMjo1MTozOCAxOTk1ICBNYXJjdXMgRGFuaWVscyAgPG1hcmN1c0BzeXNjLnBkeC5lZHU+Ci0KLQkqIGNhdC1jb21wYXQuYyAodGV4dGRvbWFpbik6Ci0JUmV2ZXJzZSBvcmRlciBpbiB3aGljaCBmaWxlcyBhcmUgdHJpZWQgeW91IGxvYWQuICBGaXJzdAotCXRyeSBsb2NhbCBmaWxlLCB3aGVuIHRoaXMgZmFpbGVkIGFic29sdXRlIHBhdGguCi0KLVdlZCBOb3YgMjkgMDI6MDM6NTMgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6IEFkZCBtaXNzaW5nIHsgfS4KLQotU3VuIE5vdiAyNiAxODoyMTo0MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJpbnRsLmluc3Q6IEFkZCBtaXNzaW5nIF9fUCBkZWZpbml0aW9uLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi0JKiBNYWtlZmlsZS5pbjoKLQlBZGQgZHVtbXkgYGFsbCcgYW5kIGBkdmknIGdvYWxzLiAgUmVwb3J0ZWQgYnkgVG9tIFRyb21leS4KLQotU2F0IE5vdiAyNSAxNjoxMjowMSAxOTk1ICBGcmFuYyxvaXMgUGluYXJkICA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+Ci0KLQkqIGhhc2gtc3RyaW5nLmg6IENhcGl0YWxpemUgYXJndW1lbnRzIG9mIG1hY3Jvcy4KLQotU2F0IE5vdiAyNSAxMjowMTozNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogUHJldmVudCBmaWxlcyBuYW1lcyBsb25nZXIgdGhhbiAxMwotCWNoYXJhY3RlcnMuICBsaWJpbnRsLmguZ2xpYmMtPmxpYmludGwuZ2xpYmMsCi0JbGliaW50bC5oLmluc3RhbGwtPmxpYmludGwuaW5zdC4gIFJlcG9ydGVkIGJ5IEpvc2h1YSBSLiBQb3Vsc29uLgotCi1TYXQgTm92IDI1IDExOjMxOjEyIDE5OTUgIEVyaWMgQmFja3VzICA8ZXJpY2JAbHNpZC5ocC5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jOiBGaXggYnVnIGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCi0KLVNhdCBOb3YgMjUgMDI6MzU6MjcgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KLQotCSogbGliZ2V0dGV4dC5oOiBTb2xhcmlzIGNjIGRvZXMgbm90IHVuZGVyc3RhbmQKLQkgI2lmICFTWU1CT0wxICYmICFTWU1CT0wyLiAgU2FkCWJ1dCB0cnVlLgotCi1UaHUgTm92IDIzIDE2OjIyOjE0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKToKLQlGaXggZm9yIG1hY2hpbmUgd2l0aCA+MzIgYml0IGB1bnNpZ25lZCBsb25nJ3MuCi0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOgotCUZpeCBob3JyaWJsZSBidWcgaW4gbG9vcCBmb3IgYWx0ZXJuYXRpdmUgdHJhbnNsYXRpb24uCi0KLVRodSBOb3YgMjMgMDE6NDU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbiwgbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKLQlTb21lIGZ1cnRoZXIgc2ltcGxpZmljYXRpb25zIGluIG1lc3NhZ2UgbnVtYmVyIGdlbmVyYXRpb24uCi0KLU1vbiBOb3YgMjAgMjE6MDg6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliaW50bC5oLmdsaWJjOiBVc2UgX19jb25zdCBpbnN0ZWFkIG9mIGNvbnN0IGluIHByb3RvdHlwZXMuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6Ci0JSW5zdGFsbCBsaWJpbnRsLmguaW5zdGFsbCBpbnN0ZWFkIG9mIGxpYmludGwuaC4gIFRoaXMKLQlpcyBhIHN0cmlwcGVkLWRvd24gdmVyc2lvbi4gIFN1Z2dlc3RlZCBieSBQZXRlciBNaWxsZXIuCi0KLQkqIGxpYmludGwuaC5pbnN0YWxsLCBsaWJpbnRsLmguZ2xpYmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMsIHJlYWRfYWxpYXNfZmlsZSk6Ci0JUHJvdGVjdCBwcm90b3R5cGVzIGluIHR5cGUgY2FzdHMgYnkgX19QLgotCi1UdWUgTm92IDE0IDE2OjQzOjU4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmg6IENvcnJlY3QgcHJvdG90eXBlIGZvciBoYXNoX3N0cmluZy4KLQotU3VuIE5vdiAxMiAxMjo0MjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGdldHRleHRQLmg6IEZpeCBjb3B5cmlnaHQuCi0JKFNXQVApOiBBZGQgcHJvdG90eXBlLgotCi1XZWQgTm92ICA4IDIyOjU2OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6IEZvcmdvdCBzaXplb2YuCi0JQXZvaWQgY2FsbGluZyAqcHJpbnRmIGZ1bmN0aW9uLiAgVGhpcyBpbnRyb2R1Y2VzIGEgYmlnIG92ZXJoZWFkLgotCVBhdGNoIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1UdWUgTm92ICA3IDE0OjIxOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYywgY2F0LWNvbXBhdC5jOiBXcm9uZyBpbmRlbnRhdGlvbiBpbiAjaWYgZm9yIHN0cGNweS4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOgotCURlZmluZSBzdWJzdGl0dXRpb24gZnVuY3Rpb24gbG9jYWwuICBUaGUgbWFjcm8gd2FzIHRvIGZsYWt5LgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvLgotCi0JKiB4b3Blbi1tc2cuc2VkLCBsaW51eC1tc2cuc2VkOgotCVdoaWxlIGJyaW5naW5nIG1lc3NhZ2UgbnVtYmVyIHRvIHJpZ2h0IHBsYWNlIG9ubHkgYWNjZXB0IGRpZ2l0cy4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogTm93IHRoYXQgdGhlIGNvdW50ZXIgZG9lcyBub3QgaGF2ZQotCWxlYWRpbmcgMHMgd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgdGhlbS4gIFJlcG9ydGVkIGJ5IE1hcmN1cwotCURhbmllbHMuCi0KLQkqIE1ha2VmaWxlLmluICguLi9wby9jYXQtaWQtdGJsLm8pOiBVc2UgJCh0b3Bfc3JkaXIpIGluCi0JZGVwZW5kZW5jeS4gIFJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBjYXQtY29tcGF0LmM6IChzdHBjcHkpIFshX0xJQkMgJiYgIUhBVkVfU1RQQ1BZXTogRGVmaW5lIHJlcGxhY2VtZW50LgotCUdlbmVyYWxseSBjbGVhbnVwIHVzaW5nICNpZiBpbnN0ZWFkIG9mICNpZm5kZWYuCi0KLQkqIE1ha2VmaWxlLmluOiBDb3JyZWN0IHR5cG9zIGluIGNvbW1lbnQuICBCeSBGcmFuYyxvaXMgUGluYXJkLgotCi1Nb24gTm92ICA2IDAwOjI3OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IERvbid0IGluc3RhbGwgbGliaW50bC5oIGFuZCBsaWJpbnRsLmEKLQlpZiB3ZSB1c2UgYW4gYXZhaWxhYmxlIGdldHRleHQgaW1wbGVtZW50YXRpb24uCi0KLVN1biBOb3YgIDUgMjI6MDI6MDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oOiBGaXggdHlwbzogSEFWRV9DQVRHRVRUUyAtPiBIQVZFX0NBVEdFVFMuICBSZXBvcnRlZAotCWJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLQkqIGxpYmdldHRleHQuaDogVXNlICNpZiBpbnN0ZWFkIG9mICNpZmRlZi8jaWZuZGVmLgotCi0JKiBmaW5kZG9tYWluLmM6Ci0JQ29tbWVudHMgZGVzY3JpYmluZyB3aGF0IGhhcyB0byBiZSBkb25lIHNob3VsZCBzdGFydCB3aXRoIEZJWE1FLgotCi1TdW4gTm92ICA1IDE5OjM4OjAxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBTcGxpdC4gIFVzZSBESVNURklMRVMgd2l0aCBub3JtYWwgbWVhbmluZy4KLQlESVNURklMRVMuY29tbW9uIG5hbWVzIHRoZSBmaWxlcyBjb21tb24gdG8gYm90aCBkaXN0IGdvYWxzLgotCURJU1RGSUxFUy5nZXR0ZXh0IGFyZSB0aGUgZmlsZXMgb25seSBkaXN0cmlidXRlZCBpbiBHTlUgZ2V0dGV4dC4KLQotU3VuIE5vdiAgNSAxNzozMjo1NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogQ29ycmVjdCBzZWFyY2hpbmcgaW4gZGVyaXZlZCBsb2NhbGVzLgotCVRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSBhIGNoYW5nZSBpbiBfbmxfZmluZF9tc2cgc2V2ZXJhbCB3ZWVrcwotCWFnby4gIEkgcmVhbGx5IGRvbid0IGtub3cgdGhpcyBpcyBzdGlsbCBub3QgZml4ZWQuCi0KLVN1biBOb3YgIDUgMTI6NDM6MTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOiBUZXN0IGZvciBGSUxFTkFNRSA9PSBOVUxMLiAgVGhpcwotCW1pZ2h0IG1hcmsgYSBzcGVjaWFsIGNvbmRpdGlvbi4KLQotCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6IERvbid0IG1ha2UgaWxsZWdhbCBlbnRyeSBhcyBkZWNpZGVkLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFN1cHByZXNzIGVycm9yIG1lc3NhZ2Ugd2hlbiBsbiBmYWlsZWQuCi0JR2V0IGZpbGVzIGZyb20gJChzcmNkaXIpIGV4cGxpY2l0bHkuCi0KLQkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IFJlbmFtZSB0byBnZXR0ZXh0X25vb3AuCi0KLUZyaSBOb3YgIDMgMDc6MzY6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6Ci0JUHJvdGVjdCBhZ2FpbnN0IHdyb25nIGxvY2FsZSBuYW1lcyBieSB0ZXN0aW5nIG1hc2suCi0KLQkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IEFkZCBtYWNybyBkZWZpbml0aW9uLgotCUNhcGl0YWxpemUgbWFjcm8gYXJndW1lbnRzLgotCi1UaHUgTm92ICAyIDIzOjE1OjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlUZXN0IGZvciBwb2ludGVyICE9IE5VTEwgYmVmb3JlIGFjY2Vzc2luZyB2YWx1ZS4KLQlSZXBvcnRlZCBieSBUb20gVHJvbWV5LgotCi0JKiBnZXR0ZXh0LmMgKE5VTEwpOgotCURlZmluZSBhcyAodm9pZCopMCBpbnN0YWQgb2YgMC4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLU1vbiBPY3QgMzAgMjE6Mjg6NTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbjogU2VyaW91cyB0eXBvIGJ1ZyBmaXhlZCBieSBKaW0gTWV5ZXJpbmcuCi0KLVNhdCBPY3QgMjggMjM6MjA6NDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oOiBEaXNhYmxlIGRjZ2V0dGV4dCBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKLQlQZXRlciBNaWxsZXIgcmVwb3J0ZWQgdGhhdCB0b2xvd2VyIGluIHNvbWUgc3lzdGVtcyBpcwotCWV2ZW4gZHVtYmVyIHRoYW4gSSB0aG91Z2h0LiAgUHJvdGVjdCBjYWxsIGJ5IGBpc3VwcGVyJy4KLQotRnJpIE9jdCAyNyAyMjoyMjo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAobGliZGlyLCBpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoaW5zdGFsbC1zcmMpOiBJbnN0YWxsIGxpYmludGwuYSBhbmQgbGliaW50bC5oIGluIGNvcnJlY3QgZGlycy4KLQotRnJpIE9jdCAyNyAyMjowNzoyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEZpeCB0eXBvOiBpbnRybC5jb21wYXQuYyAtPiBpbnRsLWNvbXBhdC5jLgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBQYXRjaCBmb3IgYnVnZ3kgU0VEcyBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KLQotCSogbG9jYWxlYWxpYXMuYzoKLQlGaXggdHlwbyBhbmQgc3VwZXJmbG91cyB0ZXN0LiAgUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCi0KLUZyaSBPY3QgIDYgMTE6NTI6MDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCUNvcnJlY3Qgc29tZSByZW1haW5kZXIgZnJvbSB0aGUgcHJlLUNFTiBzeW50YXguICBOb3cKLQl3ZSBkb24ndCBoYXZlIGEgY29uc3RhbnQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgYW55bW9yZS4KLQotV2VkIFNlcCAyNyAyMTo0MToxMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogQWRkIGxpYmludGwuaC5nbGliYy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QtbGliYyk6IEFkZCBnb2FsIGZvciBwYWNraW5nIHNvdXJjZXMgZm9yIGdsaWJjLgotCShDT01TUkNTLCBDT01IRFJTKTogU3BsaXR0ZWQgdG8gc2VwYXJhdGUgc291cmNlcyBzaGFyZWQgd2l0aCBnbGliYy4KLQotCSogbG9hZG1zZ2NhdC5jOiBGb3JnZXQgdG8gY29udGludWUgI2lmIGxpbmUuCi0KLQkqIGxvY2FsZWFsaWFzLmM6Ci0JW19MSUJDXTogUmVuYW1lIHN0cmNhc2VjbXAgdG8gX19zdHJjYXNlY21wIHRvIGtlZXAgQU5TSSBDIG5hbWUKLQlzcGFjZSBjbGVhbi4KLQotCSogZGNnZXR0ZXh0LmMsIGZpbmRkb21haW4uYzogQmV0dGVyIGNvbW1lbnQgdG8gbGFzdCBjaGFuZ2UuCi0KLQkqIGxvYWRtc2djYXQuYzoKLQlbX0xJQkNdOiBSZW5hbWUgZnN0YXQsIG9wZW4sIGNsb3NlLCByZWFkLCBtbWFwLCBhbmQgbXVubWFwIHRvCi0JX19mc3RhdCwgX19vcGVuLCBfX2Nsb3NlLCBfX3JlYWQsIF9fbW1hcCwgYW5kIF9fbXVubWFwIHJlc3AKLQl0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBmaW5kZG9tYWluLmM6Ci0JW19MSUJDXTogUmVuYW1lIHN0cGNweSB0byBfX3N0cGNweSB0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBkY2dldHRleHQuYzoKLQlbX0xJQkNdOiBSZW5hbWUgZ2V0Y2VkIGFuZCBzdHBjcHkgdG8gX19nZXRjd2QgYW5kIF9fc3RwY3B5IHJlc3AgdG8KLQlrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBsaWJnZXR0ZXh0Lmg6Ci0JSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgdGhvc2Ugb2xkIFN5c1Ygc3lzdGVtcyBvdXQgdGhlcmUuCi0JUmVwb3J0ZWQgYnkgRnJhbmNlc2NvIFBvdG9ydGlgLgotCi0JKiBsb2FkbXNnY2F0LmMgKHVzZV9tbWFwKTogRGVmaW5lIGlmIGNvbXBpbGVkIGZvciBnbGliYy4KLQotCSogYmluZHRleHRkb20uYzogSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBmaW5kZG9tYWluLmM6IEZpeCAyIHRpbWVzIGRlZmllbmQgLT4gZGVmaW5lZC4KLQotCSogdGV4dGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCi0JY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogbG9jYWxlYWxpYXMuYywgbG9hZG1zZ2NhdC5jOiBQcmVwYXJlIHRvIGJlIGNvbXBpbGVkIGluIGdsaWJjLgotCi0JKiBnZXR0ZXh0LmM6Ci0JSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCUdldCBOVUxMIGZyb20gc3RkZGVmLmggaWYgd2UgY29tcGlsZSBmb3IgZ2xpYmMuCi0KLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbgotCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGRjZ2V0dGV4dC5jOiBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzIHVuY29uZGl0aW9uYWxseQotCWlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGRnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKLQlsaWJnZXR0ZXh0LmguCi0JKGxvY2FsZS5oKTogRG9uJ3QgcmVseSBvbiBIQVZFX0xPQ0FMRV9IIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQotCSogZGNnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKLQlsaWJnZXR0ZXh0LmguCi0JKGdldGN3ZCk6IERvbid0IHJlbHkgb24gSEFWRV9HRVRDV0Qgd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCi0JKiBiaW5kdGV4dGRvbS5jOgotCUlmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oLgotCi1Nb24gU2VwIDI1IDIyOjIzOjA2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMpOiBEb24ndCBjYWxsIGJzZWFyY2ggaWYgTk1BUCA8PSAwLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlTdHJpbmcgdXNlZCBpbiBwdXRlbnYgbXVzdCBub3QgYmUgcmVjeWNsZWQuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGxpYmdldHRleHQuaCAoX19VU0VfR05VX0dFVFRFWFQpOgotCUFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSBHTlUgZ2V0dGV4dAotCWxpYnJhcnkuCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCUZpeCBidWcgd2l0aCB0aGUgc3RyYW5nZSBzdHBjcHkgcmVwbGFjZW1lbnQuCi0JUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi1TYXQgU2VwIDIzIDA4OjIzOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGNhdC1jb21wYXQuYzogSW5jbHVkZSA8c3RyaW5nLmg+IGZvciBzdHBjcHkgcHJvdG90eXBlLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCVdoaWxlIGV4cGFuZCBzdHJkdXAgY29kZSB0ZW1wb3JhcnkgdmFyaWFibGUgYGNwJyBoaWRlZAotCWhpZ2hlciBsZXZlbCB2YXJpYWJsZSB3aXRoIHNhbWUgbmFtZS4gIFJlbmFtZSB0byBgdHAnLgotCi0JKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOgotCUF2b2lkIHdhcm5pbmcgYnkgdXNpbmcgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHN0cmR1cCBjb2RlLgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGFwcGxpY2F0aW9uJy4KLQotVGh1IFNlcCAyMSAxNTo1MTo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKLQlVc2Ugc3RyY2FzZWNtcCgpIG9ubHkgaWYgYXZhaWxhYmxlLiAgRWxzZSB1c2UKLQlpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZS4KLQotCSogaW50bC1jb21wYXQuYzoKLQlXcmFwcGVyIGZ1bmN0aW9ucyBub3cgY2FsbCAqX18gZnVuY3Rpb25zIGluc3RlYWQgb2YgX18qLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IERlY2xhcmUgcHJvdG90eXBlcyBmb3IgKl9fIGZ1bmN0aW9ucyBpbnN0ZWFkIGZvciBfXyouCi0KLQkqIGNhdC1jb21wYXQuYywgbG9hZG1zZ2NhdC5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCi0JKiBiaW5kdGV4dGRvbS5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCVJlbmFtZSB0byBiaW5kdGV4dGRvbWFpbl9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGRnZXR0ZXh0LmM6Ci0JUmVuYW1lIGZ1bmN0aW9uIHRvIGRnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZ2V0dGV4dC5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCUZ1bmN0aW9ucyBub3cgY2FsbGVkIGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBkY2dldHRleHQuYywgbG9jYWxlYWxpYXMuYywgdGV4dGRvbWFpbi5jLCBmaW5kZG9tYWluLmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0KLVN1biBTZXAgMTcgMjM6MTQ6NDkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBDb3JyZWN0IHNvbWUgYnVncyBpbiBoYW5kbGluZyBvZiBDRU4gc3RhbmRhcmQKLSAJbG9jYWxlIGRlZmluaXRpb25zLgotCi1UaHUgU2VwICA3IDAxOjQ5OjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IENFTiBzeW50YXguCi0KLQkqIGdldHRleHRQLmggKGxvYWRlZF9kb21haW4pOiBFeHRlbmQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgdG8gMzEuCi0KLVNhdCBBdWcgMTkgMTk6MjU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IFJlbW92ZSBwYXRoIHRvIFgxMSBsb2NhbGUgZGlyLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBpbnN0YWxsLXNyYyBkZXBlbmQgb24gaW5zdGFsbC4gIFRoaXMgaGVscHMKLSAJZ2V0dGV4dCB0byBpbnN0YWxsIHRoZSBzb3VyY2VzIGFuZCBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRoZQotIAlpbnN0YWxsIGdvYWwuCi0KLVNhdCBBdWcgMTkgMTU6MTk6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IFJlbW92ZSBzdHVmZiBpbnN0YWxsZWQgYnkgaW5zdGFsbC1zcmMuCi0KLVR1ZSBBdWcgMTUgMTM6MTM6NTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogVkVSU0lPTi5pbjogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6Ci0JQWRkIFZFUlNJT04gZmlsZS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgZ2V0dGV4dCwgYnV0Ci0JZm9yIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoaXMgbGlicmFyeS4KLQotVHVlIEF1ZyAxNSAwNjoxNjo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIChfbmxfZmluZF9kb21haW4pOgotCU5ldyBwcm90b3R5cGUgYWZ0ZXIgY2hhbmdpbmcgc2VhcmNoIHN0cmF0ZWd5LgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JV2Ugbm93IHRyeSBvbmx5IHRvIGZpbmQgYSBzcGVjaWZpZWQgY2F0YWxvZy4gIEZhbGwgYmFjayB0byBvdGhlcgotCWNhdGFsb2dzIGxpc3RlZCBpbiB0aGUgbG9jYWxlIGxpc3QgaXMgbm93IGRvbmUgaW4gX19kY2dldHRleHQuCi0KLQkqIGRjZ2V0dGV4dC5jIChfX2RjZ2V0dGV4dCk6Ci0JTm93IHdlIHByb3ZpZGUgbWVzc2FnZSBmYWxsIGJhY2sgZXZlbiB0byBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgotCUkuZS4gaWYgYSBtZXNzYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gb25lIGxhbmd1YWdlIGFsbCB0aGUgb3RoZXIKLSAJaW4gdGhlIGxvY2FsZSBsaXN0IGEgdHJpZWQuICBGb3JtZXJseSBmYWxsIGJhY2sgd2FzIG9ubHkgcG9zc2libGUKLSAJd2l0aGluIG9uZSBsYW5ndWFnZS4gIEltcGxlbWVudGVkIGJ5IG1vdmluZyBvbmUgbG9vcCBmcm9tCi0gCV9ubF9maW5kX2RvbWFpbiB0byBoZXJlLgotCi1Nb24gQXVnIDE0IDIzOjQ1OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKToKLQlEaXJlY3Rvcnkgd2hlcmUgc291cmNlIG9mIEdOVSBnZXR0ZXh0IGxpYnJhcnkgYXJlIG1hZGUKLQlhdmFpbGFibGUuCi0JKElOU1RBTEwsIElOU1RBTExfREFUQSk6IFByb2dyYW1zIHVzZWQgZm9yIGluc3RhbGxpbmcgc291cmNlcy4KLQkoZ2V0dGV4dC1zcmMpOiBOZXcuICBSdWxlIHRvIGluc3RhbGwgR05VIGdldHRleHQgc291cmNlcyBmb3IgdXNlIGluCi0JZ2V0dGV4dGl6ZSBzaGVsbCBzY3JpcHQuCi0KLVN1biBBdWcgMTMgMTQ6NDA6NDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOgotCVVzZSBtbWFwIGZvciBsb2FkaW5nIG9ubHkgd2hlbiBtdW5tYXAgZnVuY3Rpb24gaXMKLQlhbHNvIGF2YWlsYWJsZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgb24gYGFsbCcgZ29hbC4KLQotV2VkIEF1ZyAgOSAxMTowNDozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCURvIG5vdCBvdmVyd3JpdGUgJ1xuJyB3aGVuIHRlcm1pbmF0aW5nIGFsaWFzIHZhbHVlIHN0cmluZy4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlIYW5kbGUgbG9uZyBsaW5lcy4gIElnbm9yZSB0aGUgcmVzdCBub3QgZml0dGluZyBpbgotCXRoZSBidWZmZXIgYWZ0ZXIgdGhlIGluaXRpYWwgYGZnZXRzJyBjYWxsLgotCi1XZWQgQXVnICA5IDAwOjU0OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggKF9ubF9sb2FkX2RvbWFpbik6Ci0JQWRkIHByb3RvdHlwZSwgcmVwbGFjaW5nIHByb3RvdHlwZSBmb3IgX25sX2xvYWRfbXNnX2NhdC4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZSBmaWxlbmFtZSBhbmQgZmlsZW5hbWVfbGVuLgotCShleHBhbmRfYWxpYXMpOiBSZW1vdmUgcHJvdG90eXBlIGJlY2F1c2UgZnVuY3Rpb25zIGRvZXMgbm90Ci0gCWV4aXN0IGFueW1vcmUuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JQ2hhbmdlIHR5cGUgb2YgZm5hbWVfbGVuIHBhcmFtZXRlciB0byBpbnQuCi0JKHhtYWxsb2MpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBsb2FkbXNnY2F0LmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jLgotCi1UdWUgQXVnICA4IDIyOjMwOjM5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlBbGxvdyBhbGlhcyBuYW1lIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGZvdXIgY29tcG9uZW50cy4KLQotCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IE5ldyB2YXJpYWJsZS4gIFNldCB0byBwcmVsaW1pbmFyeSB2YWx1ZS4KLQkoU09VUkNFUyk6IEFkZCBsb2NhbGVhbGlhcy5jLgotCShPQkpFQ1RTKTogQWRkIGxvY2FsZWFsaWFzLm8uCi0KLQkqIGdldHRleHRQLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9ubF9leHBhbmRfYWxpYXMuCi0KLQkqIGZpbmRkb21haW4uYzogQWxpYXNpbmcgaGFuZGxlZCBpbiBpbnRsL2xvY2FsZWFsaWFzLmMuCi0KLQkqIGxvY2FsZWFsaWFzLmM6IEFsaWFzaW5nIGZvciBsb2NhbGUgbmFtZXMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jIGFuZCB4c3RyZHVwLgotCi1Nb24gQXVnICA3IDIzOjQ3OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBnZXR0ZXh0LnBlcmwgaXMgbm93IGZvdW5kIGluIG1pc2MvLgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlDb3JyZWN0IGltcGxlbWVudGF0aW9uLiAgZGlybmFtZSBwYXJhbWV0ZXIgd2FzIG5vdCB1c2VkLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKToKLQlOZXcgZmllbGRzIGBzdWNjZXNzb3InIGFuZCBgZGVjaWRlZCcgZm9yIG9vLCBsYXp5Ci0JbWVzc2FnZSBoYW5kbGluZyBpbXBsZW1lbnRhdGlvbi4KLQotCSogZGNnZXR0ZXh0LmM6Ci0JQWRvcHQgZm9yIG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpaW5nLgotICAJTm93IHdlIGNhbiBpbmhlcml0IHRyYW5zbGF0aW9ucyBmcm9tIGxlc3Mgc3BlY2lmaWMgbG9jYWxlcy4KLQkoZmluZF9tc2cpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGxvYWRtc2djYXQuYywgZmluZGRvbWFpbi5jOgotCUNvbXBsZXRlIHJld3JpdGUuICBJbXBsZW1lbnQgb28sIGxhenkgbWVzc2FnZSBoYW5kbGluZyA6LSkuCi0gIAlXZSBub3cgaGF2ZSBhbiBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlIGBMQU5HVUFHRScgd2l0aAotIAlhIGhpZ2hlciBwcmlvcml0eSB0aGFuIExDX0FMTCBmb3IgdGhlIExDX01FU1NBR0UgbG9jYWxlLgotICAJSGVyZSB3ZSBjYW4gc2V0IGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2Ygc3BlY2lmaWNhdGlvbnMgZWFjaAotIAlvZiB0aGUgZm9ybSBgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0nLgotCi1TYXQgQXVnICA1IDA5OjU1OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAodW5pc3RkLmgpOgotCUluY2x1ZGUgdG8gZ2V0IF9QQ19QQVRIX01BWCBkZWZpbmVkIG9uIHN5c3RlbSBoYXZpbmcgaXQuCi0KLUZyaSBBdWcgIDQgMjI6NDI6MDAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBJbmNsdWRlIHByb3RvdHlwZS4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBSZW1vdmUgYGNvcHlpbmcgaW5zdGVhZCcgbWVzc2FnZS4KLQotV2VkIEF1ZyAgMiAxODo1MjowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoSUQsIFRBR1MpOiBEbyBub3QgdXNlICReLgotCi1UdWUgQXVnICAxIDIwOjA3OjExIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChUQUdTLCBJRCk6IFVzZSAkXiBhcyBjb21tYW5kIGFyZ3VtZW50LgotCShUQUdTKTogR2l2ZSBldGFncyAtbyBvcHRpb24gdCB3cml0ZSB0byBjdXJyZW50IGRpcmVjdG9yeSwKLSAJbm90ICQoc3JjZGlyKS4KLQkoSUQpOiBVc2UgJChzcmNkaXIpIGluc3RlYWQgb3MgJCh0b3Bfc3JjZGlyKS9zcmMuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBJRC4KLQotU3VuIEp1bCAzMCAxMTo1MTo0NiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ251bG9jYWxlZGlyKToKLQlOZXcgdmFyaWFibGUsIGFsd2F5cyB1c2luZyBzaGFyZS8gZm9yIGRhdGEgZGlyZWN0b3J5LgotCShERUZTKTogQWRkIEdOVUxPQ0FMRURJUiwgdXNlZCBpbiBmaW5kZG9tYWluLmMuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2RlZmF1bHRfZGlybmFtZSk6Ci0JU2V0IHRvIEdOVUxPQ0FMRURJUiwgYmVjYXVzZSBpdCBhbHdheXMgaGFzIHRvIHBvaW50Ci0JdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBHTlUgZ2V0dGV4dCBMaWJyYXJ5IHdyaXRlcyBpdCB0by4KLQotCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOgotCVVuZGVmaW5lIG1hY3JvcyBiZWZvcmUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQotU2F0IEp1bCAyMiAwMToxMDowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0LmggKF9MSUJJTlRMX0gpOgotCVByb3RlY3QgZGVmaW5pdGlvbiBpbiBjYXNlIHdoZXJlIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBhcwotCWxpYmdldHRleHQuaCBvbiBTb2xhcmlzIG1hY2hpbmVzLiAgQWRkIGNvbW1lbnQgYWJvdXQgdGhpcy4KLQotV2VkIEp1bCAxOSAwMjozNjo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluKTogQ29ycmVjdCB0eXBvLgotCi1XZWQgSnVsIDE5IDAxOjUxOjM1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChkY2dldHRleHQpOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fZGNnZXR0ZXh0LgotCi0JKiBkZ2V0dGV4dC5jIChkZ2V0dGV4dCk6IE5vdyBjYWxsZWQgX19kZ2V0dGV4dCBhbmQgY2FsbHMKLSAJX19kY2dldHRleHQuCi0KLQkqIGdldHRleHQuYyAoZ2V0dGV4dCk6Ci0JRnVuY3Rpb24gbm93IGNhbGxlZCBfX2dldHRleHQgYW5kIGNhbGxzIF9fZGdldHRleHQuCi0KLQkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX190ZXh0ZG9tYWluLgotCi0JKiBiaW5kdGV4dGRvbS5jIChiaW5kdGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQKLSAJX19iaW5kdGV4dGRvbWFpbi4KLQotCSogaW50bC1jb21wYXQuYzogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogTWFrZWZpbGUuaW4gKFNPVVJDRVMpOiBBZGQgaW50bC1jb21wYXQuYy4KLQkoT0JKRUNUUyk6IFdlIGFsd2F5cyBjb21waWxlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSAgCU9CSkVDVFMgY29udGFpbnMgYWxsIG9iamVjdHMgYnV0IGNhdC1jb21wYXQubywgLi4vcG8vY2F0LWlmLXRibC5vLAotIAlhbmQgaW50bC1jb21wYXQuby4KLSAgCShHRVRUT0JKUyk6IENvbnRhaW5zIG5vdyBvbmx5IGludGwtY29tcGF0Lm8uCi0KLQkqIGxpYmdldHRleHQuaDoKLQlSZS1pbmNsdWRlIHByb3RlY3Rpb24gbWF0Y2hlcyBkdWFsaXN0aWMgY2hhcmFjdGVyIG9mIGxpYmdldHRleHQuaC4KLQlGb3IgYWxsIGZ1bmN0aW9ucyBpbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGRlZmluZSBfXyBjb3VudGVyIHBhcnQuCi0KLQkqIGZpbmRkb21haW4uYyAoc3RyY2hyKTogRGVmaW5lIGFzIGluZGV4IGlmIG5vdCBmb3VuZCBpbiBDIGxpYnJhcnkuCi0JKF9ubF9maW5kX2RvbWFpbik6IEZvciByZWxhdGl2ZSBwYXRocyBwYXN0ZSAvIGluIGJldHdlZW4uCi0KLVR1ZSBKdWwgMTggMTY6Mzc6NDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jLCBmaW5kZG9tYWluLmM6IEFkZCBpbmNsdXNpb24gb2Ygc3lzL3R5cGVzLmguCi0KLQkqIHhvcGVuLW1zZy5zZWQ6IEZpeCBidWcgd2l0aCBgbXNnc3RyICIiJyBsaW5lcy4KLQlBIGxpdHRsZSBiaXQgYmV0dGVyIGNvbW1lbnRzLgotCi1UdWUgSnVsIDE4IDAxOjE4OjI3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOgotCXBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCBhcmUgbm93IGZvdW5kIGluIC4uL21pc2MuCi0KLQkqIHBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCwgZWxpc3AtY29tcDoKLQlNb3ZlZCB0byAuLi9taXNjLy4KLQotCSogbGliZ2V0dGV4dC5oLCBnZXR0ZXh0UC5oLCBnZXR0ZXh0Lmg6IFVuaWZvcm0gdGVzdCBmb3IgX19TVERDX18uCi0KLVN1biBKdWwgMTYgMjI6MzM6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwsIElOU1RBTExfREFUQSk6IE5ldyB2YXJpYWJsZXMuCi0JKGluc3RhbGwtZGF0YSwgdW5pbnN0YWxsKTogSW5zdGFsbC91bmluc3RhbGwgLmVsYyBmaWxlLgotCi0JKiBwby1tb2RlLmVsIChJbnN0YWxsYXRpb24gY29tbWVudCk6Ci0JQWRkIC5wb3ggYXMgcG9zc2libGUgZXh0ZW5zaW9uIG9mIC5wbyBmaWxlcy4KLQotU3VuIEp1bCAxNiAxMzoyMzoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBlbGlzcC1jb21wOiBDb21wbGV0ZSBuZXcgdmVyc2lvbiBieSBGcmFuYyxvaXM6IFRoaXMgZG9lcyBub3QKLSAJZmFpbCB3aGVuIG5vdCBjb21waWxpbmcgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLVN1biBKdWwgMTYgMDA6MTI6MTcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKC4uL3BvL2NhdC1pZC10Ymwubyk6Ci0JVXNlICQoTUFLRSkgaW5zdGVhZCBvZiBtYWtlIGZvciByZWN1cnNpdmUgbWFrZS4KLQotCSogTWFrZWZpbGUuaW4gKC5lbC5lbGMpOiBVc2UgJChTSEVMTCkgaW5zdGVhZCBvZiAvYmluL3NoLgotCShpbnN0YWxsLWV4ZWMpOiBBZGQgbWlzc2luZyBkdW1teSBnb2FsLgotCShpbnN0YWxsLWRhdGEsIHVuaW5zdGFsbCk6IEAgaW4gbXVsdGktbGluZSBzaGVsbCBjb21tYW5kIGF0Ci0gCWJlZ2lubmluZywgbm90IGluIGZyb250IG9mIGVjaG8uICBSZXBvcnRlZCBieSBFcmljIEJhY2t1cy4KLQotU2F0IEp1bCAxNSAwMDoyMToyOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKLQlSZW5hbWUgbGliZ2V0dGV4dC5wZXJsIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMKLQlmaWxlIHN5c3RlbXMuCi0KLQkqIGdldHRleHQucGVybDoKLSAJUmVuYW1lIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMgZmlsZSBzeXN0ZW1zLgotCi1UaHUgSnVsIDEzIDIzOjE3OjIwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGNhdC1jb21wYXQuYzogSWYgIVNURENfSEVBREVSUyB0cnkgdG8gaW5jbHVkZSBtYWxsb2MuaC4KLQotVGh1IEp1bCAxMyAyMDo1NTowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBQcmV0dHkgcHJpbnRpbmcuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6Ci0JQ29ycmVjdCBidWdzIHdpdGggaGFuZGxpbmcgc3Vic3RpdHV0ZSBmbGFncyBpbiBicmFuY2hlcy4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgotCU9sZCBLJlIgY29tcGlsZXJzIGRvbid0IHVuZGVyIHN0YW5kIGB1bnNpZ25lZCBjaGFyJy4KLQotCSogZ2V0dGV4dC5oIChubHNfdWludDMyKToKLQlTb21lIG9sZCBLJlIgY29tcGlsZXJzIChlZyBIUCkgZG9uJ3QgdW5kZXJzdGFuZCBgdW5zaWduZWQgaW50Jy4KLQotCSogY2F0LWNvbXBhdC5jIChtc2dfdG9fY2F0X2lkKTogRGUtQU5TSS1meSBwcm90b3R5cGVzLgotCi1UaHUgSnVsIDEzIDAxOjM0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChFTENGSUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoRElTVEZJTEVTKTogQWRkIGVsaXNwLWNvbXAuCi0JQWRkIGltcGxpY2l0IHJ1bGUgZm9yIC5lbCAtPiAuZWxjIGNvbXBpbGF0aW9uLgotCShpbnN0YWxsLWRhdGEpOiBpbnN0YWxsICRFTENGSUxFUwotCShjbGVhbik6IHJlbmFtZWQgcG8tdG8tdGJsIGFuZCBwby10by1tc2cgdG8gcG8ydGJsIGFuZCBwbzJtc2cgcmVzcC4KLQotCSogZWxpc3AtY29tcDogSW5pdGlhbCByZXZpc2lvbgotCi1XZWQgSnVsIDEyIDE2OjE0OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOgotCWNhdC1pZC10YmwuYyBpcyBub3cgZm91bmQgaW4gcG8vLiAgVGhpcyBlbmFibGVzIHVzIHRvIHVzZSBhbiBpZGVudGljYWwKLQlpbnRsLyBkaXJlY3RvcnkgaW4gYWxsIHBhY2thZ2VzLgotCi0JKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogaGFzaGluZyBkb2VzIG5vdCB3b3JrIGZvciB0YWJsZSBzaXplIDw9IDIuCi0KLQkqIHRleHRkb21haW4uYzogZml4IHR5cG8gKCNpZiBkZWYgLT4gI2lmIGRlZmluZWQpCi0KLVR1ZSBKdWwgMTEgMTg6NDQ6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWNhdC1pZCk6IHVzZSB0b3Bfc3JjZGlyIHRvIGFkZHJlc3Mgc291cmNlIGZpbGVzCi0JKERJU1RGSUxFUyxkaXN0Y2xlYW4pOiBtb3ZlIHR1cGRhdGUucGVybCB0byBzcmMvCi0KLQkqIHBvLXRvLXRibC5zZWQuaW46Ci0JYWRkIGFkZGl0aW9uYWwganVtcCB0byBjbGVhciBjaGFuZ2UgZmxhZyB0byByZWNvZ25pemUgbXVsdGlsaW5lIHN0cmluZ3MKLQotVHVlIEp1bCAxMSAwMTozMjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0ZXh0ZG9tYWluLmM6IFByb3RlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oIGFuZCBzdHJpbmcuaC4KLQotCSogbG9hZG1zZ2NhdC5jOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBzdGRsaWIuaC4KLQotCSogbGliZ2V0dGV4dC5oOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBsb2NhbGUuaC4KLQlBbGxvdyB1c2UgaW4gQysrIHByb2dyYW1zLgotCURlZmluZSBOVUxMIGlzIG5vdCBoYXBwZW5lZCBhbHJlYWR5LgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogc2hpcCBwby10by10Ymwuc2VkLmluIGluc3RlYWQgb2YKLQlwby10by10Ymwuc2VkLgotCShkaXN0Y2xlYW4pOiByZW1vdmUgcG8tdG8tdGJsLnNlZCBhbmQgdHVwZGF0ZS5wZXJsLgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IFN1YnN0aXR1dGUgUGVybCBwYXRoIGV2ZW4gaW4gZXhlYyBsaW5lLgotCURvbid0IGluY2x1ZGUgZW50cmllcyB3aXRob3V0IHRyYW5zbGF0aW9uIGZyb20gb2xkIC5wbyBmaWxlLgotCi1UdWUgSnVsICA0IDAwOjQxOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHR1cGRhdGUucGVybC5pbjogdXNlICJVcGRhdGVkOiAiIGluIG1zZ2lkICIiLgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvIChMT0NBTERJUiAtPiBMT0NBTEVESVIpLgotIAlEZWZpbmUgZ2V0ZW52IGlmICFfX1NURENfXy4KLQotCSogYmluZHRleHRkb20uYzogUHJvdGVjdCBzdGRsaWIuaCBhbmQgc3RyaW5nLmggaW5jbHVzaW9uLgotIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCi0KLQkqIGZpbmRkb21haW4uYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCi0gCURlZmluZSBmcmVlIGlmICFfX1NURENfXy4KLQotCSogY2F0LWNvbXBhdC5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KLQotTW9uIEp1bCAgMyAyMzo1NjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjogVXNlIExPQ0FMRURJUiBpbnN0ZWFkIG9mIERFRl9NU0dfRE9NX0RJUi4KLQlSZW1vdmUgdW5uZWVkZWQgJChzcmNkaXIpIGZyb20gTWFrZWZpbGUuaW4gZGVwZW5kZW5jeS4KLQotCSogbWFrZWxpbmtzOiBBZGQgY29weXJpZ2h0IGFuZCBzaG9ydCBkZXNjcmlwdGlvbi4KLQotCSogcG8tbW9kZS5lbDogTGFzdCB2ZXJzaW9uIGZvciAwLjcuCi0KLQkqIHR1cGRhdGUucGVybC5pbjogRml4IGRpZSBtZXNzYWdlLgotCi0JKiBkY2dldHRleHQuYzogUHJvdGVjdCBpbmNsdWRlIG9mIHN0cmluZy5oLgotCi0JKiBnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdGRsaWIuaCBhbmQgZnVydGhlciB0cmllcyB0byBnZXQgTlVMTC4KLQotCSogZmluZGRvbWFpbi5jOiBTb21lIGNvcnJlY3Rpb25zIGluIGluY2x1ZGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBQcnVuZSBsaXN0IGNvcnJlY3QgcGF0aCB0byBNYWtlZmlsZS5pbi4KLQotCSogcG8tdG8tdGJsLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6IEFkb3B0IGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi1TdW4gSnVsICAyIDIzOjU1OjAzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHR1cGRhdGUucGVybC5pbjogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotU3VuIEp1bCAgMiAwMjowNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBGaXJzdCBvZmZpY2lhbCByZWxlYXNlLiAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBjb2RlCi0JbmVlZGVkIHRvIGludGVybmF0aW9uYWxpemUgb3duIHBhY2thZ2VzLiAgSXQgcHJvdmlkZXMgZnVuY3Rpb25zCi0Jd2hpY2ggYWxsb3cgdG8gdXNlIHRoZSBYL09wZW4gY2F0Z2V0cyBmdW5jdGlvbiB3aXRoIGFuIGludGVyZmFjZQotCWxpa2UgdGhlIFVuaWZvcnVtIGdldHRleHQgZnVuY3Rpb24uICBGb3Igc3lzdGVtIHdoaWNoIGRvZXMgbm90Ci0JaGF2ZSBuZWl0aGVyIG9mIHRob3NlIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQuCmRpZmYgLXVwck4gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2RjZ2V0dGV4dC5jIGxyenN6LTAuMTIuMjAvaW50bC9kY2dldHRleHQuYwotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2RjZ2V0dGV4dC5jCTE5OTgtMDQtMjYgMTQ6MjI6MzYuMDAwMDAwMDAwICswMTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvZGNnZXR0ZXh0LmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsNTkzICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkY2dldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLSNpZm5kZWYgX19zZXRfZXJybm8KLSMgZGVmaW5lIF9fc2V0X2Vycm5vKHZhbCkgZXJybm8gPSAodmFsKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLWNoYXIgKmdldGVudiAoKTsKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIF9HTlVfU09VUkNFCi0jICBkZWZpbmUgX0dOVV9TT1VSQ0UJMQotIyBlbmRpZgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJoYXNoLXN0cmluZy5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gQU5TSSBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgQU5TSSBDIGZ1bmN0aW9ucyB3aWxsIHJlcXVpcmUgbGlua2luZyB3aXRoIHRoaXMgb2JqZWN0Ci0gICBmaWxlIGFuZCB0aGUgbmFtZSBzcGFjZSBtdXN0IG5vdCBiZSBwb2xsdXRlZC4gICovCi0jIGRlZmluZSBnZXRjd2QgX19nZXRjd2QKLSMgZGVmaW5lIHN0cGNweSBfX3N0cGNweQotI2Vsc2UKLSMgaWYgIWRlZmluZWQgSEFWRV9HRVRDV0QKLWNoYXIgKmdldHdkICgpOwotIyAgZGVmaW5lIGdldGN3ZChidWYsIG1heCkgZ2V0d2QgKGJ1ZikKLSMgZWxzZQotY2hhciAqZ2V0Y3dkICgpOwotIyBlbmRpZgotIyBpZm5kZWYgSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICpzdHBjcHkgUEFSQU1TICgoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKSk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotLyogQW1vdW50IHRvIGluY3JlYXNlIGJ1ZmZlciBzaXplIGJ5IGluIGVhY2ggdHJ5LiAgKi8KLSNkZWZpbmUgUEFUSF9JTkNSIDMyCi0KLS8qIFRoZSBmb2xsb3dpbmcgaXMgZnJvbSBwYXRobWF4LmguICAqLwotLyogTm9uLVBPU0lYIEJTRCBzeXN0ZW1zIG1pZ2h0IGhhdmUgZ2NjJ3MgbGltaXRzLmgsIHdoaWNoIGRvZXNuJ3QgZGVmaW5lCi0gICBQQVRIX01BWCBidXQgbWlnaHQgY2F1c2UgcmVkZWZpbml0aW9uIHdhcm5pbmdzIHdoZW4gc3lzL3BhcmFtLmggaXMKLSAgIGxhdGVyIGluY2x1ZGVkIChhcyBvbiBNT1JFL0JTRCA0LjMpLiAgKi8KLSNpZiBkZWZpbmVkKF9QT1NJWF9WRVJTSU9OKSB8fCAoZGVmaW5lZChIQVZFX0xJTUlUU19IKSAmJiAhZGVmaW5lZChfX0dOVUNfXykpCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0KLSNpZm5kZWYgX1BPU0lYX1BBVEhfTUFYCi0jIGRlZmluZSBfUE9TSVhfUEFUSF9NQVggMjU1Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKF9QQ19QQVRIX01BWCkKLSMgZGVmaW5lIFBBVEhfTUFYIChwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpIDwgMSA/IDEwMjQgOiBwYXRoY29uZiAoIi8iLCBfUENfUEFUSF9NQVgpKQotI2VuZGlmCi0KLS8qIERvbid0IGluY2x1ZGUgc3lzL3BhcmFtLmggaWYgaXQgYWxyZWFkeSBoYXMgYmVlbi4gICovCi0jaWYgZGVmaW5lZChIQVZFX1NZU19QQVJBTV9IKSAmJiAhZGVmaW5lZChQQVRIX01BWCkgJiYgIWRlZmluZWQoTUFYUEFUSExFTikKLSMgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBBVEhfTUFYKSAmJiBkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGRlZmluZSBQQVRIX01BWCBNQVhQQVRITEVOCi0jZW5kaWYKLQotI2lmbmRlZiBQQVRIX01BWAotIyBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCi0jZW5kaWYKLQotLyogWFBHMyBkZWZpbmVzIHRoZSByZXN1bHQgb2YgYHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpJyBhczoKLSAgIGBgRGlyZWN0cyBgc2V0bG9jYWxlKCknIHRvIHF1ZXJ5IGBjYXRlZ29yeScgYW5kIHJldHVybiB0aGUgY3VycmVudAotICAgICBzZXR0aW5nIG9mIGBsb2NhbCcuJycKLSAgIEhvd2V2ZXIgaXQgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZXhhY3QgZm9ybWF0LiAgQW5kIGV2ZW4gd29yc2U6IFBPU0lYCi0gICBkZWZpbmVzIHRoaXMgbm90IGF0IGFsbC4gIFNvIHdlIGNhbiB1c2UgdGhpcyBmZWF0dXJlIG9ubHkgb24gc2VsZWN0ZWQKLSAgIHN5c3RlbSAoZS5nLiB0aG9zZSB1c2luZyBHTlUgQyBMaWJyYXJ5KS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEhBVkVfTE9DQUxFX05VTEwKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGRvbWFpbiB1c2VkIGZvciBnZXR0ZXh0KDMpIHByaW9yIGFueSBjYWxsIHRvCi0gICB0ZXh0ZG9tYWluKDMpLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgaXMgIm1lc3NhZ2VzIi4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW10gPSAibWVzc2FnZXMiOwotCi0vKiBWYWx1ZSB1c2VkIGFzIHRoZSBkZWZhdWx0IGRvbWFpbiBmb3IgZ2V0dGV4dCgzKS4gICovCi1jb25zdCBjaGFyICpfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbiA9IF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluOwotCi0vKiBDb250YWlucyB0aGUgZGVmYXVsdCBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSBjYXRhbG9ncy4gICovCi1jb25zdCBjaGFyIF9ubF9kZWZhdWx0X2Rpcm5hbWVbXSA9IEdOVUxPQ0FMRURJUjsKLQotLyogTGlzdCB3aXRoIGJpbmRpbmdzIG9mIHNwZWNpZmljIGRvbWFpbnMgY3JlYXRlZCBieSBiaW5kdGV4dGRvbWFpbigpCi0gICBjYWxscy4gICovCi1zdHJ1Y3QgYmluZGluZyAqX25sX2RvbWFpbl9iaW5kaW5nczsKLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBjaGFyICpmaW5kX21zZyBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZSwKLQkJCSAgICAgICBjb25zdCBjaGFyICptc2dpZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmNhdGVnb3J5X3RvX25hbWUgUEFSQU1TICgoaW50IGNhdGVnb3J5KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqZ3Vlc3NfY2F0ZWdvcnlfdmFsdWUgUEFSQU1TICgoaW50IGNhdGVnb3J5LAotCQkJCQkJIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZSkpOwotCi0KLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLwotI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KLQotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudCBDQVRFR09SWQotICAgbG9jYWxlLiAgKi8KLWNoYXIgKgotRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0jaWZuZGVmIEhBVkVfQUxMT0NBCi0gIHN0cnVjdCBibG9ja19saXN0ICpibG9ja19saXN0ID0gTlVMTDsKLSNlbmRpZgotICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW47Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci0gIGNvbnN0IGNoYXIgKmNhdGVnb3J5dmFsdWU7Ci0gIGNoYXIgKmRpcm5hbWUsICp4ZG9tYWlubmFtZTsKLSAgY2hhciAqc2luZ2xlX2xvY2FsZTsKLSAgY2hhciAqcmV0dmFsOwotICBpbnQgc2F2ZWRfZXJybm8gPSBlcnJubzsKLQotICAvKiBJZiBubyByZWFsIE1TR0lEIGlzIGdpdmVuIHJldHVybiBOVUxMLiAgKi8KLSAgaWYgKG1zZ2lkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogSWYgRE9NQUlOTkFNRSBpcyBOVUxMLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGVmYXVsdCBkb21haW4uICBJZgotICAgICBDQVRFR09SWSBpcyBub3QgTENfTUVTU0FHRVMgdGhpcyBtaWdodCBub3QgbWFrZSBtdWNoIHNlbnNlIGJ1dCB0aGUKLSAgICAgZGVmaW50aW9uIGxlZnQgdGhpcyB1bmRlZmluZWQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIGRvbWFpbm5hbWUgPSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBGaXJzdCBmaW5kIG1hdGNoaW5nIGJpbmRpbmcuICAqLwotICBmb3IgKGJpbmRpbmcgPSBfbmxfZG9tYWluX2JpbmRpbmdzOyBiaW5kaW5nICE9IE5VTEw7IGJpbmRpbmcgPSBiaW5kaW5nLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBjb21wYXJlID0gc3RyY21wIChkb21haW5uYW1lLCBiaW5kaW5nLT5kb21haW5uYW1lKTsKLSAgICAgIGlmIChjb21wYXJlID09IDApCi0JLyogV2UgZm91bmQgaXQhICAqLwotCWJyZWFrOwotICAgICAgaWYgKGNvbXBhcmUgPCAwKQotCXsKLQkgIC8qIEl0IGlzIG5vdCBpbiB0aGUgbGlzdC4gICovCi0JICBiaW5kaW5nID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJpbmRpbmcgPT0gTlVMTCkKLSAgICBkaXJuYW1lID0gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZTsKLSAgZWxzZSBpZiAoYmluZGluZy0+ZGlybmFtZVswXSA9PSAnLycpCi0gICAgZGlybmFtZSA9IGJpbmRpbmctPmRpcm5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgcmVsYXRpdmUgcGF0aC4gIE1ha2UgaXQgYWJzb2x1dGUgbm93LiAgKi8KLSAgICAgIHNpemVfdCBkaXJuYW1lX2xlbiA9IHN0cmxlbiAoYmluZGluZy0+ZGlybmFtZSkgKyAxOwotICAgICAgc2l6ZV90IHBhdGhfbWF4OwotICAgICAgY2hhciAqcmV0OwotCi0gICAgICBwYXRoX21heCA9ICh1bnNpZ25lZCkgUEFUSF9NQVg7Ci0gICAgICBwYXRoX21heCArPSAyOwkJLyogVGhlIGdldGN3ZCBkb2NzIHNheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0gICAgICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOwotCi0gICAgICBfX3NldF9lcnJubyAoMCk7Ci0gICAgICB3aGlsZSAoKHJldCA9IGdldGN3ZCAoZGlybmFtZSwgcGF0aF9tYXgpKSA9PSBOVUxMICYmIGVycm5vID09IEVSQU5HRSkKLQl7Ci0JICBwYXRoX21heCArPSBQQVRIX0lOQ1I7Ci0JICBkaXJuYW1lID0gKGNoYXIgKikgYWxsb2NhIChwYXRoX21heCArIGRpcm5hbWVfbGVuKTsKLQkgIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgZGlybmFtZSk7Ci0JICBfX3NldF9lcnJubyAoMCk7Ci0JfQotCi0gICAgICBpZiAocmV0ID09IE5VTEwpCi0JewotCSAgLyogV2UgY2Fubm90IGdldCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIERvbid0IHNpZ25hbCBhbgotCSAgICAgZXJyb3IgYnV0IHNpbXBseSByZXR1cm4gdGhlIGRlZmF1bHQgc3RyaW5nLiAgKi8KLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7Ci0JfQotCi0gICAgICBzdHBjcHkgKHN0cGNweSAoc3RyY2hyIChkaXJuYW1lLCAnXDAnKSwgIi8iKSwgYmluZGluZy0+ZGlybmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBkZXRlcm1pbmUgdGhlIHN5bWJvbGljIG5hbWUgb2YgQ0FURUdPUlkgYW5kIGl0cyB2YWx1ZS4gICovCi0gIGNhdGVnb3J5bmFtZSA9IGNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KTsKLSAgY2F0ZWdvcnl2YWx1ZSA9IGd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKTsKLQotICB4ZG9tYWlubmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChjYXRlZ29yeW5hbWUpCi0JCQkJICsgc3RybGVuIChkb21haW5uYW1lKSArIDUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIHhkb21haW5uYW1lKTsKLQotICBzdHBjcHkgKHN0cGNweSAoc3RwY3B5IChzdHBjcHkgKHhkb21haW5uYW1lLCBjYXRlZ29yeW5hbWUpLCAiLyIpLAotCQkgIGRvbWFpbm5hbWUpLAotCSAgIi5tbyIpOwotCi0gIC8qIENyZWF0aW5nIHdvcmtpbmcgYXJlYS4gICovCi0gIHNpbmdsZV9sb2NhbGUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnl2YWx1ZSkgKyAxKTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCBzaW5nbGVfbG9jYWxlKTsKLQotCi0gIC8qIFNlYXJjaCBmb3IgdGhlIGdpdmVuIHN0cmluZy4gIFRoaXMgaXMgYSBsb29wIGJlY2F1c2Ugd2UgcGVyaGFwcwotICAgICBnb3QgYW4gb3JkZXJlZCBsaXN0IG9mIGxhbmd1YWdlcyB0byBjb25zaWRlciBmb3IgdGggdHJhbnNsYXRpb24uICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIENBVEVHT1JZVkFMVUUgcG9pbnQgdG8gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgbGlzdC4gICovCi0gICAgICB3aGlsZSAoY2F0ZWdvcnl2YWx1ZVswXSAhPSAnXDAnICYmIGNhdGVnb3J5dmFsdWVbMF0gPT0gJzonKQotCSsrY2F0ZWdvcnl2YWx1ZTsKLSAgICAgIGlmIChjYXRlZ29yeXZhbHVlWzBdID09ICdcMCcpCi0JewotCSAgLyogVGhlIHdob2xlIGNvbnRlbnRzIG9mIENBVEVHT1JZVkFMVUUgaGFzIGJlZW4gc2VhcmNoZWQgYnV0Ci0JICAgICBubyB2YWxpZCBlbnRyeSBoYXMgYmVlbiBmb3VuZC4gIFdlIHNvbHZlIHRoaXMgc2l0dWF0aW9uCi0JICAgICBieSBpbXBsaWNpdGx5IGFwcGVuZGluZyBhICJDIiBlbnRyeSwgaS5lLiBubyB0cmFuc2xhdGlvbgotCSAgICAgd2lsbCB0YWtlIHBsYWNlLiAgKi8KLQkgIHNpbmdsZV9sb2NhbGVbMF0gPSAnQyc7Ci0JICBzaW5nbGVfbG9jYWxlWzFdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqY3AgPSBzaW5nbGVfbG9jYWxlOwotCSAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdICE9ICc6JykKLQkgICAgKmNwKysgPSAqY2F0ZWdvcnl2YWx1ZSsrOwotCSAgKmNwID0gJ1wwJzsKLQl9Ci0KLSAgICAgIC8qIElmIHRoZSBjdXJyZW50IGxvY2FsZSB2YWx1ZSBpcyBDIChvciBQT1NJWCkgd2UgZG9uJ3QgbG9hZCBhCi0JIGRvbWFpbi4gIFJldHVybiB0aGUgTVNHSUQuICAqLwotICAgICAgaWYgKHN0cmNtcCAoc2luZ2xlX2xvY2FsZSwgIkMiKSA9PSAwCi0JICB8fCBzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJQT1NJWCIpID09IDApCi0JewotCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCSAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgIHJldHVybiAoY2hhciAqKSBtc2dpZDsKLQl9Ci0KLQotICAgICAgLyogRmluZCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIG1hdGNoaW5nIHRoZQotCSBET01BSU5OQU1FIGFuZCBDQVRFR09SWS4gICovCi0gICAgICBkb21haW4gPSBfbmxfZmluZF9kb21haW4gKGRpcm5hbWUsIHNpbmdsZV9sb2NhbGUsIHhkb21haW5uYW1lKTsKLQotICAgICAgaWYgKGRvbWFpbiAhPSBOVUxMKQotCXsKLQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4sIG1zZ2lkKTsKLQotCSAgaWYgKHJldHZhbCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaW50IGNudDsKLQotCSAgICAgIGZvciAoY250ID0gMDsgZG9tYWluLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQkJewotCQkgIHJldHZhbCA9IGZpbmRfbXNnIChkb21haW4tPnN1Y2Nlc3NvcltjbnRdLCBtc2dpZCk7Ci0KLQkJICBpZiAocmV0dmFsICE9IE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgICAgICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgICAgIHJldHVybiByZXR2YWw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi19Ci0KLSNpZmRlZiBfTElCQwotLyogQWxpYXMgZm9yIGZ1bmN0aW9uIG5hbWUgaW4gR05VIEMgTGlicmFyeS4gICovCi13ZWFrX2FsaWFzIChfX2RjZ2V0dGV4dCwgZGNnZXR0ZXh0KTsKLSNlbmRpZgotCi0KLXN0YXRpYyBjaGFyICoKLWZpbmRfbXNnIChkb21haW5fZmlsZSwgbXNnaWQpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgc2l6ZV90IHRvcCwgYWN0LCBib3R0b207Ci0gIHN0cnVjdCBsb2FkZWRfZG9tYWluICpkb21haW47Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSk7Ci0KLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotCi0gIC8qIExvY2F0ZSB0aGUgTVNHSUQgYW5kIGl0cyB0cmFuc2xhdGlvbi4gICovCi0gIGlmIChkb21haW4tPmhhc2hfc2l6ZSA+IDIgJiYgZG9tYWluLT5oYXNoX3RhYiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFVzZSB0aGUgaGFzaGluZyB0YWJsZS4gICovCi0gICAgICBubHNfdWludDMyIGxlbiA9IHN0cmxlbiAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBoYXNoX3ZhbCA9IGhhc2hfc3RyaW5nIChtc2dpZCk7Ci0gICAgICBubHNfdWludDMyIGlkeCA9IGhhc2hfdmFsICUgZG9tYWluLT5oYXNoX3NpemU7Ci0gICAgICBubHNfdWludDMyIGluY3IgPSAxICsgKGhhc2hfdmFsICUgKGRvbWFpbi0+aGFzaF9zaXplIC0gMikpOwotICAgICAgbmxzX3VpbnQzMiBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0KLSAgICAgIGlmIChuc3RyID09IDApCi0JLyogSGFzaCB0YWJsZSBlbnRyeSBpcyBlbXB0eS4gICovCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KLQkgICYmIHN0cmNtcCAobXNnaWQsCi0JCSAgICAgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgICAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpID09IDApCi0JcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgIGRvbWFpbi0+dHJhbnNfdGFiW25zdHIgLSAxXS5vZmZzZXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAoaWR4ID49IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcikKLQkgICAgaWR4IC09IGRvbWFpbi0+aGFzaF9zaXplIC0gaW5jcjsKLQkgIGVsc2UKLQkgICAgaWR4ICs9IGluY3I7Ci0KLQkgIG5zdHIgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5oYXNoX3RhYltpZHhdKTsKLQkgIGlmIChuc3RyID09IDApCi0JICAgIC8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgaWYgKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5sZW5ndGgpID09IGxlbgotCSAgICAgICYmIHN0cmNtcCAobXNnaWQsCi0JCQkgZG9tYWluLT5kYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJCSAgIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLm9mZnNldCkpCi0JICAgICAgICAgPT0gMCkKLQkgICAgcmV0dXJuIChjaGFyICopIGRvbWFpbi0+ZGF0YQotCSAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+dHJhbnNfdGFiW25zdHIgLSAxXS5vZmZzZXQpOwotCX0KLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogTm93IHdlIHRyeSB0aGUgZGVmYXVsdCBtZXRob2Q6ICBiaW5hcnkgc2VhcmNoIGluIHRoZSBzb3J0ZWQKLSAgICAgYXJyYXkgb2YgbWVzc2FnZXMuICAqLwotICBib3R0b20gPSAwOwotICB0b3AgPSBkb21haW4tPm5zdHJpbmdzOwotICB3aGlsZSAoYm90dG9tIDwgdG9wKQotICAgIHsKLSAgICAgIGludCBjbXBfdmFsOwotCi0gICAgICBhY3QgPSAoYm90dG9tICsgdG9wKSAvIDI7Ci0gICAgICBjbXBfdmFsID0gc3RyY21wIChtc2dpZCwgZG9tYWluLT5kYXRhCi0JCQkgICAgICAgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkgICAgZG9tYWluLT5vcmlnX3RhYlthY3RdLm9mZnNldCkpOwotICAgICAgaWYgKGNtcF92YWwgPCAwKQotCXRvcCA9IGFjdDsKLSAgICAgIGVsc2UgaWYgKGNtcF92YWwgPiAwKQotCWJvdHRvbSA9IGFjdCArIDE7Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIC8qIElmIGFuIHRyYW5zbGF0aW9uIGlzIGZvdW5kIHJldHVybiB0aGlzLiAgKi8KLSAgcmV0dXJuIGJvdHRvbSA+PSB0b3AgPyBOVUxMIDogKGNoYXIgKikgZG9tYWluLT5kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgICBkb21haW4tPnRyYW5zX3RhYlthY3RdLm9mZnNldCk7Ci19Ci0KLQotLyogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBsb2NhbGUgQ0FURUdPUlkuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKgotY2F0ZWdvcnlfdG9fbmFtZSAoY2F0ZWdvcnkpCi0gICAgIGludCBjYXRlZ29yeTsKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIHN3aXRjaCAoY2F0ZWdvcnkpCi0gIHsKLSNpZmRlZiBMQ19DT0xMQVRFCi0gIGNhc2UgTENfQ09MTEFURToKLSAgICByZXR2YWwgPSAiTENfQ09MTEFURSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19DVFlQRQotICBjYXNlIExDX0NUWVBFOgotICAgIHJldHZhbCA9ICJMQ19DVFlQRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NT05FVEFSWQotICBjYXNlIExDX01PTkVUQVJZOgotICAgIHJldHZhbCA9ICJMQ19NT05FVEFSWSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19OVU1FUklDCi0gIGNhc2UgTENfTlVNRVJJQzoKLSAgICByZXR2YWwgPSAiTENfTlVNRVJJQyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19USU1FCi0gIGNhc2UgTENfVElNRToKLSAgICByZXR2YWwgPSAiTENfVElNRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19NRVNTQUdFUwotICBjYXNlIExDX01FU1NBR0VTOgotICAgIHJldHZhbCA9ICJMQ19NRVNTQUdFUyI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19SRVNQT05TRQotICBjYXNlIExDX1JFU1BPTlNFOgotICAgIHJldHZhbCA9ICJMQ19SRVNQT05TRSI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBMQ19BTEwKLSAgY2FzZSBMQ19BTEw6Ci0gICAgLyogVGhpcyBtaWdodCBub3QgbWFrZSBzZW5zZSBidXQgaXMgcGVyaGFwcyBiZXR0ZXIgdGhhbiBhbnkgb3RoZXIKLSAgICAgICB2YWx1ZS4gICovCi0gICAgcmV0dmFsID0gIkxDX0FMTCI7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICAvKiBJZiB5b3UgaGF2ZSBhIGJldHRlciBpZGVhIGZvciBhIGRlZmF1bHQgdmFsdWUgbGV0IG1lIGtub3cuICAqLwotICAgIHJldHZhbCA9ICJMQ19YWFgiOwotICB9Ci0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotLyogR3Vlc3MgdmFsdWUgb2YgY3VycmVudCBsb2NhbGUgZnJvbSB2YWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWd1ZXNzX2NhdGVnb3J5X3ZhbHVlIChjYXRlZ29yeSwgY2F0ZWdvcnluYW1lKQotICAgICBpbnQgY2F0ZWdvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKmNhdGVnb3J5bmFtZTsKLXsKLSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0gIC8qIFRoZSBoaWdoZXN0IHByaW9yaXR5IHZhbHVlIGlzIHRoZSBgTEFOR1VBR0UnIGVudmlyb25tZW50Ci0gICAgIHZhcmlhYmxlLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQU5HVUFHRSIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBgTEFOR1VBR0UnIGlzIG5vdCBzZXQuICBTbyB3ZSBoYXZlIHRvIHByb2NlZWQgd2l0aCB0aGUgUE9TSVgKLSAgICAgbWV0aG9kcyBvZiBsb29raW5nIHRvIGBMQ19BTEwnLCBgTENfeHh4JywgYW5kIGBMQU5HJy4gIE9uIHNvbWUKLSAgICAgc3lzdGVtcyB0aGlzIGNhbiBiZSBkb25lIGJ5IHRoZSBgc2V0bG9jYWxlJyBmdW5jdGlvbiBpdHNlbGYuICAqLwotI2lmIGRlZmluZWQgSEFWRV9TRVRMT0NBTEUgJiYgZGVmaW5lZCBIQVZFX0xDX01FU1NBR0VTICYmIGRlZmluZWQgSEFWRV9MT0NBTEVfTlVMTAotICByZXR1cm4gc2V0bG9jYWxlIChjYXRlZ29yeSwgTlVMTCk7Ci0jZWxzZQotICAvKiBTZXR0aW5nIG9mIExDX0FMTCBvdmVyd3JpdGVzIGFsbCBvdGhlci4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxDX0FMTCIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBOZXh0IGNvbWVzIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIGNhdGVnb3J5LiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52IChjYXRlZ29yeW5hbWUpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBMYXN0IHBvc3NpYmlsaXR5IGlzIHRoZSBMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFORyIpOwotICBpZiAocmV0dmFsICE9IE5VTEwgJiYgcmV0dmFsWzBdICE9ICdcMCcpCi0gICAgcmV0dXJuIHJldHZhbDsKLQotICAvKiBXZSB1c2UgQyBhcyB0aGUgZGVmYXVsdCBkb21haW4uICBQT1NJWCBzYXlzIHRoaXMgaXMgaW1wbGVtZW50YXRpb24KLSAgICAgZGVmaW5lZC4gICovCi0gIHJldHVybiAiQyI7Ci0jZW5kaWYKLX0KLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLS8qIFdlIGRvbid0IHdhbnQgbGliaW50bC5hIHRvIGRlcGVuZCBvbiBhbnkgb3RoZXIgbGlicmFyeS4gIFNvIHdlCi0gICBhdm9pZCB0aGUgbm9uLXN0YW5kYXJkIGZ1bmN0aW9uIHN0cGNweS4gIEluIEdOVSBDIExpYnJhcnkgdGhpcwotICAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCB0aG91Z2guICBBbHNvIGFsbG93IHRoZSBzeW1ib2wgSEFWRV9TVFBDUFkKLSAgIHRvIGJlIGRlZmluZWQuICAqLwotI2lmICFfTElCQyAmJiAhSEFWRV9TVFBDUFkKLXN0YXRpYyBjaGFyICoKLXN0cGNweSAoZGVzdCwgc3JjKQotICAgICBjaGFyICpkZXN0OwotICAgICBjb25zdCBjaGFyICpzcmM7Ci17Ci0gIHdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKLSAgICAvKiBEbyBub3RoaW5nLiAqLyA7Ci0gIHJldHVybiBkZXN0IC0gMTsKLX0KLSNlbmRpZgpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9kZ2V0dGV4dC5jIGxyenN6LTAuMTIuMjAvaW50bC9kZ2V0dGV4dC5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvZGdldHRleHQuYwkxOTk4LTA0LTI2IDE0OjIwOjUyLjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2RnZXR0ZXh0LmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsNTkgKzAsMCBAQAotLyogZGdldHRleHQuYyAtLSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGdldHRleHQoMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfTE9DQUxFX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0Ci0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLSNlbHNlCi0jIGRlZmluZSBER0VUVEVYVCBkZ2V0dGV4dF9fCi0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBvZiB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWNoYXIgKgotREdFVFRFWFQgKGRvbWFpbm5hbWUsIG1zZ2lkKQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLXsKLSAgcmV0dXJuIERDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZGdldHRleHQsIGRnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9leHBsb2RlbmFtZS5jIGxyenN6LTAuMTIuMjAvaW50bC9leHBsb2RlbmFtZS5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvZXhwbG9kZW5hbWUuYwkxOTk4LTA0LTI2IDE0OjIyOjM3LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2V4cGxvZGVuYW1lLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTgxICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0jaWZuZGVmIE5VTEwKLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLWludAotX25sX2V4cGxvZGVfbmFtZSAobmFtZSwgbGFuZ3VhZ2UsIG1vZGlmaWVyLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0JCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBzcGVjaWFsLCBzcG9uc29yLCByZXZpc2lvbikKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKmxhbmd1YWdlOwotICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXI7Ci0gICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICoqc3BlY2lhbDsKLSAgICAgY29uc3QgY2hhciAqKnNwb25zb3I7Ci0gICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbjsKLXsKLSAgZW51bSB7IHVuZGVjaWRlZCwgeHBnLCBjZW4gfSBzeW50YXg7Ci0gIGNoYXIgKmNwOwotICBpbnQgbWFzazsKLQotICAqbW9kaWZpZXIgPSBOVUxMOwotICAqdGVycml0b3J5ID0gTlVMTDsKLSAgKmNvZGVzZXQgPSBOVUxMOwotICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gTlVMTDsKLSAgKnNwZWNpYWwgPSBOVUxMOwotICAqc3BvbnNvciA9IE5VTEw7Ci0gICpyZXZpc2lvbiA9IE5VTEw7Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCi0gICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLwotICBtYXNrID0gMDsKLSAgc3ludGF4ID0gdW5kZWNpZGVkOwotICAqbGFuZ3VhZ2UgPSBjcCA9IG5hbWU7Ci0gIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJyAmJiBjcFswXSAhPSAnQCcKLQkgJiYgY3BbMF0gIT0gJysnICYmIGNwWzBdICE9ICcsJykKLSAgICArK2NwOwotCi0gIGlmICgqbGFuZ3VhZ2UgPT0gY3ApCi0gICAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlOiBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiAgVXNlCi0gICAgICAgdGhpcyBlbnRyeSBhcyBpdCBpcyB3aXRob3V0IGV4cGxvZGluZy4gIFBlcmhhcHMgaXQgaXMgYW4gYWxpYXMuICAqLwotICAgIGNwID0gc3RyY2hyICgqbGFuZ3VhZ2UsICdcMCcpOwotICBlbHNlIGlmIChjcFswXSA9PSAnXycpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAgKi8KLSAgICAgIGNwWzBdID0gJ1wwJzsKLSAgICAgICp0ZXJyaXRvcnkgPSArK2NwOwotCi0gICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnCi0JICAgICAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkrK2NwOwotCi0gICAgICBtYXNrIHw9IFRFUlJJVE9SWTsKLQotICAgICAgaWYgKGNwWzBdID09ICcuJykKLQl7Ci0JICAvKiBOZXh0IGlzIHRoZSBjb2Rlc2V0LiAgKi8KLQkgIHN5bnRheCA9IHhwZzsKLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpjb2Rlc2V0ID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ0AnKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IFhQR19DT0RFU0VUOwotCi0JICBpZiAoKmNvZGVzZXQgIT0gY3AgJiYgKCpjb2Rlc2V0KVswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IF9ubF9ub3JtYWxpemVfY29kZXNldCAoKmNvZGVzZXQsCi0JCQkJCQkJICAgY3AgLSAqY29kZXNldCk7Ci0JICAgICAgaWYgKHN0cmNtcCAoKmNvZGVzZXQsICpub3JtYWxpemVkX2NvZGVzZXQpID09IDApCi0JCWZyZWUgKChjaGFyICopICpub3JtYWxpemVkX2NvZGVzZXQpOwotCSAgICAgIGVsc2UKLQkJbWFzayB8PSBYUEdfTk9STV9DT0RFU0VUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoY3BbMF0gPT0gJ0AnIHx8IChzeW50YXggIT0geHBnICYmIGNwWzBdID09ICcrJykpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLwotICAgICAgc3ludGF4ID0gY3BbMF0gPT0gJ0AnID8geHBnIDogY2VuOwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKm1vZGlmaWVyID0gKytjcDsKLQotICAgICAgd2hpbGUgKHN5bnRheCA9PSBjZW4gJiYgY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnKycKLQkgICAgICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JKytjcDsKLQotICAgICAgbWFzayB8PSBYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0U7Ci0gICAgfQotCi0gIGlmIChzeW50YXggIT0geHBnICYmIChjcFswXSA9PSAnKycgfHwgY3BbMF0gPT0gJywnIHx8IGNwWzBdID09ICdfJykpCi0gICAgewotICAgICAgc3ludGF4ID0gY2VuOwotCi0gICAgICBpZiAoY3BbMF0gPT0gJysnKQotCXsKLSAJICAvKiBOZXh0IGlzIHNwZWNpYWwgYXBwbGljYXRpb24gKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpzcGVjaWFsID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBDRU5fU1BFQ0lBTDsKLQl9Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnLCcpCi0JewotIAkgIC8qIE5leHQgaXMgc3BvbnNvciAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnNwb25zb3IgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1NQT05TT1I7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJ18nKQotCXsKLSAJICAvKiBOZXh0IGlzIHJldmlzaW9uIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqcmV2aXNpb24gPSArK2NwOwotCi0JICBtYXNrIHw9IENFTl9SRVZJU0lPTjsKLQl9Ci0gICAgfQotCi0gIC8qIEZvciBDRU4gc3ludGF4IHZhbHVlcyBpdCBtaWdodCBiZSBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUKLSAgICAgc2VwYXJhdG9yIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBuYW1lLCBub3QgZm9yIFhQRyBzeW50YXguICAqLwotICBpZiAoc3ludGF4ID09IHhwZykKLSAgICB7Ci0gICAgICBpZiAoKnRlcnJpdG9yeSAhPSBOVUxMICYmICgqdGVycml0b3J5KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflRFUlJJVE9SWTsKLQotICAgICAgaWYgKCpjb2Rlc2V0ICE9IE5VTEwgJiYgKCpjb2Rlc2V0KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflhQR19DT0RFU0VUOwotCi0gICAgICBpZiAoKm1vZGlmaWVyICE9IE5VTEwgJiYgKCptb2RpZmllcilbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5YUEdfTU9ESUZJRVI7Ci0gICAgfQotCi0gIHJldHVybiBtYXNrOwotfQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9maW5kZG9tYWluLmMgbHJ6c3otMC4xMi4yMC9pbnRsL2ZpbmRkb21haW4uYwotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2ZpbmRkb21haW4uYwkxOTk4LTA0LTI2IDE0OjIyOjM2LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2ZpbmRkb21haW4uYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSwxODkgKzAsMCBAQAotLyogSGFuZGxlIGxpc3Qgb2YgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZiBkZWZpbmVkIFNURENfSEVBREVSUyB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotI2Vsc2UKLSMgaWZkZWYgSEFWRV9NQUxMT0NfSAotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jIGVsc2UKLXZvaWQgZnJlZSAoKTsKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1NUUklOR19IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLS8qIExpc3Qgb2YgYWxyZWFkeSBsb2FkZWQgZG9tYWlucy4gICovCi1zdGF0aWMgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX25sX2xvYWRlZF9kb21haW5zOwotCi0KLS8qIFJldHVybiBhIGRhdGEgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBkZXNjcmliZWQgYnkKLSAgIHRoZSBET01BSU5OQU1FIGFuZCBDQVRFR09SWSBwYXJhbWV0ZXJzIHdpdGggcmVzcGVjdCB0byB0aGUgY3VycmVudGx5Ci0gICBlc3RhYmxpc2hlZCBiaW5kaW5ncy4gICovCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoKLV9ubF9maW5kX2RvbWFpbiAoZGlybmFtZSwgbG9jYWxlLCBkb21haW5uYW1lKQotICAgICBjb25zdCBjaGFyICpkaXJuYW1lOwotICAgICBjaGFyICpsb2NhbGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLSAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gIGNvbnN0IGNoYXIgKm1vZGlmaWVyOwotICBjb25zdCBjaGFyICp0ZXJyaXRvcnk7Ci0gIGNvbnN0IGNoYXIgKmNvZGVzZXQ7Ci0gIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldDsKLSAgY29uc3QgY2hhciAqc3BlY2lhbDsKLSAgY29uc3QgY2hhciAqc3BvbnNvcjsKLSAgY29uc3QgY2hhciAqcmV2aXNpb247Ci0gIGNvbnN0IGNoYXIgKmFsaWFzX3ZhbHVlOwotICBpbnQgbWFzazsKLQotICAvKiBMT0NBTEUgY2FuIGNvbnNpc3Qgb2YgdXAgdG8gZm91ciByZWNvZ25pemVkIHBhcnRzIGZvciB0aGUgWFBHIHN5bnRheDoKLQotCQlsYW5ndWFnZVtfdGVycml0b3J5Wy5jb2Rlc2V0XV1bQG1vZGlmaWVyXQotCi0gICAgIGFuZCBzaXggcGFydHMgZm9yIHRoZSBDRU4gc3ludGF4OgotCi0JbGFuZ3VhZ2VbX3RlcnJpdG9yeV1bK2F1ZGllbmNlXVsrc3BlY2lhbF1bLFtzcG9uc29yXVtfcmV2aXNpb25dXQotCi0gICAgIEJlc2lkZSB0aGUgZmlyc3QgYWxsIG9mIHRoZW0gYXJlIGFsbG93ZWQgdG8gYmUgbWlzc2luZy4gIElmIHRoZQotICAgICBmdWxsIHNwZWNpZmllZCBsb2NhbGUgaXMgbm90IGZvdW5kLCB0aGUgbGVzcyBzcGVjaWZpYyBvbmUgYXJlCi0gICAgIGxvb2tlZCBmb3IuICBUaGUgdmFyaW91cyBwYXJ0IHdpbGwgYmUgc3RyaXBwZWQgb2YgYWNjb3JkaW5nIHRvCi0gICAgIHRoZSBmb2xsb3dpbmcgb3JkZXI6Ci0JCSgxKSByZXZpc2lvbgotCQkoMikgc3BvbnNvcgotCQkoMykgc3BlY2lhbAotCQkoNCkgY29kZXNldAotCQkoNSkgbm9ybWFsaXplZCBjb2Rlc2V0Ci0JCSg2KSB0ZXJyaXRvcnkKLQkJKDcpIGF1ZGllbmNlL21vZGlmaWVyCi0gICAqLwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSB0ZXN0ZWQgZm9yIHRoaXMgbG9jYWxlIGVudHJ5IHRoZXJlIGhhcyB0bwotICAgICBiZSBvbmUgZGF0YSBzZXQgaW4gdGhlIGxpc3Qgb2YgbG9hZGVkIGRvbWFpbnMuICAqLwotICByZXR2YWwgPSBfbmxfbWFrZV9sMTBuZmxpc3QgKCZfbmxfbG9hZGVkX2RvbWFpbnMsIGRpcm5hbWUsCi0JCQkgICAgICAgc3RybGVuIChkaXJuYW1lKSArIDEsIDAsIGxvY2FsZSwgTlVMTCwgTlVMTCwKLQkJCSAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBkb21haW5uYW1lLCAwKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgc29tZXRoaW5nIGFib3V0IHRoaXMgbG9jYWxlLiAgKi8KLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLQlfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7Ci0KLSAgICAgIGlmIChyZXR2YWwtPmRhdGEgIT0gTlVMTCkKLQlyZXR1cm4gcmV0dmFsOwotCi0gICAgICBmb3IgKGNudCA9IDA7IHJldHZhbC0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JewotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRlY2lkZWQgPT0gMCkKLQkgICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdKTsKLQotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgcmV0dXJuIGNudCA+PSAwID8gcmV0dmFsIDogTlVMTDsKLSAgICAgIC8qIE5PVFJFQUNIRUQgKi8KLSAgICB9Ci0KLSAgLyogU2VlIHdoZXRoZXIgdGhlIGxvY2FsZSB2YWx1ZSBpcyBhbiBhbGlhcy4gIElmIHllcyBpdHMgdmFsdWUKLSAgICAgKm92ZXJ3cml0ZXMqIHRoZSBhbGlhcyBuYW1lLiAgTm8gdGVzdCBmb3IgdGhlIG9yaWdpbmFsIHZhbHVlIGlzCi0gICAgIGRvbmUuICAqLwotICBhbGlhc192YWx1ZSA9IF9ubF9leHBhbmRfYWxpYXMgKGxvY2FsZSk7Ci0gIGlmIChhbGlhc192YWx1ZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGFsaWFzX3ZhbHVlKSArIDE7Ci0gICAgICBsb2NhbGUgPSAoY2hhciAqKSBtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAobG9jYWxlID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIG1lbWNweSAobG9jYWxlLCBhbGlhc192YWx1ZSwgbGVuKTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCi0gICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLwotICBtYXNrID0gX25sX2V4cGxvZGVfbmFtZSAobG9jYWxlLCAmbGFuZ3VhZ2UsICZtb2RpZmllciwgJnRlcnJpdG9yeSwKLQkJCSAgICZjb2Rlc2V0LCAmbm9ybWFsaXplZF9jb2Rlc2V0LCAmc3BlY2lhbCwKLQkJCSAgICZzcG9uc29yLCAmcmV2aXNpb24pOwotCi0gIC8qIENyZWF0ZSBhbGwgcG9zc2libGUgbG9jYWxlIGVudHJpZXMgd2hpY2ggbWlnaHQgYmUgaW50ZXJlc3RlZCBpbgotICAgICBnZW5lcmFsaXphdGlvbi4gICovCi0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgbWFzaywgbGFuZ3VhZ2UsIHRlcnJpdG9yeSwKLQkJCSAgICAgICBjb2Rlc2V0LCBub3JtYWxpemVkX2NvZGVzZXQsIG1vZGlmaWVyLCBzcGVjaWFsLAotCQkJICAgICAgIHNwb25zb3IsIHJldmlzaW9uLCBkb21haW5uYW1lLCAxKTsKLSAgaWYgKHJldHZhbCA9PSBOVUxMKQotICAgIC8qIFRoaXMgbWVhbnMgd2UgYXJlIG91dCBvZiBjb3JlLiAgKi8KLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAocmV0dmFsLT5kZWNpZGVkID09IDApCi0gICAgX25sX2xvYWRfZG9tYWluIChyZXR2YWwpOwotICBpZiAocmV0dmFsLT5kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgaW50IGNudDsKLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQl7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQotCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOwotCSAgaWYgKHJldHZhbC0+c3VjY2Vzc29yW2NudF0tPmRhdGEgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgcm9vbSBmb3IgYW4gYWxpYXMgd2FzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gIEZyZWUgaXQgbm93LiAgKi8KLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0gICAgZnJlZSAobG9jYWxlKTsKLQotICByZXR1cm4gcmV0dmFsOwotfQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9nZXR0ZXh0LmMgbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuYwotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuYwkxOTk4LTA0LTI2IDE0OjIyOjM2LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuYwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSw3MCArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgX19uZWVkX05VTEwKLSMgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotIyBpZmRlZiBTVERDX0hFQURFUlMKLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgkJLyogSnVzdCBmb3IgTlVMTC4gICovCi0jIGVsc2UKLSMgIGlmZGVmIEhBVkVfU1RSSU5HX0gKLSMgICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGVsc2UKLSMgICBkZWZpbmUgTlVMTCAoKHZvaWQgKikgMCkKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9MSUJDCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSNlbHNlCi0jIGluY2x1ZGUgImxpYmdldHRleHQuaCIKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgR0VUVEVYVCBfX2dldHRleHQKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSNlbHNlCi0jIGRlZmluZSBHRVRURVhUIGdldHRleHRfXwotIyBkZWZpbmUgREdFVFRFWFQgZGdldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotY2hhciAqCi1HRVRURVhUIChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBER0VUVEVYVCAoTlVMTCwgbXNnaWQpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19nZXR0ZXh0LCBnZXR0ZXh0KTsKLSNlbmRpZgpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9nZXR0ZXh0LmggbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuaAotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuaAkxOTk4LTA0LTI2IDE0OjIyOjM1LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHQuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSwxMDUgKzAsMCBAQAotLyogSW50ZXJuYWwgaGVhZGVyIGZvciBHTlUgZ2V0dGV4dCBpbnRlcm5hdGlvbmFsaXphdGlvbiBmdW5jdGlvbnMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUX0gKLSNkZWZpbmUgX0dFVFRFWFRfSCAxCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgSEFWRV9MSU1JVFNfSCB8fCBfTElCQwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KLSNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKLSNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQotCi0vKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCi0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udG9ydGlvbnMgYXJlIGFuIGF0dGVtcHQgdG8gdXNlIHRoZSBDIHByZXByb2Nlc3NvcgotICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgotICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKLSAgIGRvaW5nIHRoYXQgd291bGQgcmVxdWlyZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBpbGUgYW5kICpydW4qCi0gICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUuICBMb2NhbGx5IHJ1bm5pbmcgY3Jvc3MtY29tcGlsZWQgZXhlY3V0YWJsZXMKLSAgIGlzIHVzdWFsbHkgbm90IHBvc3NpYmxlLiAgKi8KLQotI2lmIF9fU1REQ19fCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCi0jZWxzZQotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyAweEZGRkZGRkZGCi0jZW5kaWYKLQotLyogSWYgVUlOVF9NQVggaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIGl0J3MgYSAzMi1iaXQgdHlwZS4KLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQotICAgdGhhdCBkb2Vzbid0IGluY2x1ZGUgMTYtYml0IHN5c3RlbXMsIGFuZCBvbmx5IG1vZGVybiBzeXN0ZW1zCi0gICAodGhhdCBjZXJ0YWlubHkgaGF2ZSA8bGltaXRzLmg+KSBoYXZlIDY0Ky1iaXQgaW50ZWdyYWwgdHlwZXMuICAqLwotCi0jaWZuZGVmIFVJTlRfTUFYCi0jIGRlZmluZSBVSU5UX01BWCBVSU5UX01BWF8zMl9CSVRTCi0jZW5kaWYKLQotI2lmIFVJTlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKLSNlbHNlCi0jIGlmIFVTSFJUX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7Ci0jIGVsc2UKLSMgIGlmIFVMT05HX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKLSMgIGVsc2UKLSAgLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGludGVuZGVkIHRvIHRocm93IGFuIGVycm9yLiAgVXNpbmcgI2Vycm9yIGlzCi0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLwotICAiQ2Fubm90IGRldGVybWluZSB1bnNpZ25lZCAzMi1iaXQgZGF0YSB0eXBlLiIKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBIZWFkZXIgZm9yIGJpbmFyeSAubW8gZmlsZSBmb3JtYXQuICAqLwotc3RydWN0IG1vX2ZpbGVfaGVhZGVyCi17Ci0gIC8qIFRoZSBtYWdpYyBudW1iZXIuICAqLwotICBubHNfdWludDMyIG1hZ2ljOwotICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCi0gIG5sc191aW50MzIgcmV2aXNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCi0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0aW9uIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7Ci0gIC8qIFNpemUgb2YgaGFzaGluZyB0YWJsZS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKLSAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2hpbmcgZW50cnkuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKLX07Ci0KLXN0cnVjdCBzdHJpbmdfZGVzYwotewotICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZy4gICovCi0gIG5sc191aW50MzIgbGVuZ3RoOwotICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLwotICBubHNfdWludDMyIG9mZnNldDsKLX07Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYJLyogZ2V0dGV4dC5oICAqLwpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9nZXR0ZXh0UC5oIGxyenN6LTAuMTIuMjAvaW50bC9nZXR0ZXh0UC5oCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvZ2V0dGV4dFAuaAkxOTk4LTA0LTI2IDE0OjIyOjM1LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2dldHRleHRQLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsNzMgKzAsMCBAQAotLyogSGVhZGVyIGRlc2NyaWJpbmcgaW50ZXJuYWxzIG9mIGdldHRleHQgbGlicmFyeQotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUUF9ICi0jZGVmaW5lIF9HRVRURVhUUF9ICi0KLSNpbmNsdWRlICJsb2FkaW5mby5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpIGFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgVwotIyBkZWZpbmUgVyhmbGFnLCBkYXRhKSAoKGZsYWcpID8gU1dBUCAoZGF0YSkgOiAoZGF0YSkpCi0jZW5kaWYKLQotCi1zdGF0aWMgbmxzX3VpbnQzMiBTV0FQIFBBUkFNUyAoKG5sc191aW50MzIgaSkpOwotCi1zdGF0aWMgaW5saW5lIG5sc191aW50MzIKLVNXQVAgKGkpCi0gICAgIG5sc191aW50MzIgaTsKLXsKLSAgcmV0dXJuIChpIDw8IDI0KSB8ICgoaSAmIDB4ZmYwMCkgPDwgOCkgfCAoKGkgPj4gOCkgJiAweGZmMDApIHwgKGkgPj4gMjQpOwotfQotCi0KLXN0cnVjdCBsb2FkZWRfZG9tYWluCi17Ci0gIGNvbnN0IGNoYXIgKmRhdGE7Ci0gIGludCBtdXN0X3N3YXA7Ci0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqb3JpZ190YWI7Ci0gIHN0cnVjdCBzdHJpbmdfZGVzYyAqdHJhbnNfdGFiOwotICBubHNfdWludDMyIGhhc2hfc2l6ZTsKLSAgbmxzX3VpbnQzMiAqaGFzaF90YWI7Ci19OwotCi1zdHJ1Y3QgYmluZGluZwotewotICBzdHJ1Y3QgYmluZGluZyAqbmV4dDsKLSAgY2hhciAqZG9tYWlubmFtZTsKLSAgY2hhciAqZGlybmFtZTsKLX07Ci0KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKl9ubF9maW5kX2RvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2Rpcm5hbWUsCi0JCQkJCQkgY2hhciAqX19sb2NhbGUsCi0JCQkJCQkgY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci12b2lkIF9ubF9sb2FkX2RvbWFpbiBQQVJBTVMgKChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfX2RvbWFpbikpOwotCi0vKiBAQCBiZWdpbiBvZiBlcGlsb2cgQEAgKi8KLQotI2VuZGlmIC8qIGdldHRleHRQLmggICovCmRpZmYgLXVwck4gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2hhc2gtc3RyaW5nLmggbHJ6c3otMC4xMi4yMC9pbnRsL2hhc2gtc3RyaW5nLmgKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9oYXNoLXN0cmluZy5oCTE5OTgtMDQtMjYgMTQ6MjI6MzYuMDAwMDAwMDAwICswMTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvaGFzaC1zdHJpbmcuaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSw2MyArMCwwIEBACi0vKiBJbXBsZW1lbnRzIGEgc3RyaW5nIGhhc2hpbmcgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfVkFMVUVTX0gKLSMgaW5jbHVkZSA8dmFsdWVzLmg+Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSBBcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoQXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBXZSBhc3N1bWUgdG8gaGF2ZSBgdW5zaWduZWQgbG9uZyBpbnQnIHZhbHVlIHdpdGggYXQgbGVhc3QgMzIgYml0cy4gICovCi0jZGVmaW5lIEhBU0hXT1JEQklUUyAzMgotCi0KLS8qIERlZmluZXMgdGhlIHNvIGNhbGxlZCBgaGFzaHBqdycgZnVuY3Rpb24gYnkgUC5KLiBXZWluYmVyZ2VyCi0gICBbc2VlIEFoby9TZXRoaS9VbGxtYW4sIENPTVBJTEVSUzogUHJpbmNpcGxlcywgVGVjaG5pcXVlcyBhbmQgVG9vbHMsCi0gICAxOTg2LCAxOTg3IEJlbGwgVGVsZXBob25lIExhYm9yYXRvcmllcywgSW5jLl0gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX3N0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICpfX3N0cl9wYXJhbSkpOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLWhhc2hfc3RyaW5nIChzdHJfcGFyYW0pCi0gICAgIGNvbnN0IGNoYXIgKnN0cl9wYXJhbTsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgaHZhbCwgZzsKLSAgY29uc3QgY2hhciAqc3RyID0gc3RyX3BhcmFtOwotCi0gIC8qIENvbXB1dGUgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBzdHJpbmcuICAqLwotICBodmFsID0gMDsKLSAgd2hpbGUgKCpzdHIgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBodmFsIDw8PSA0OwotICAgICAgaHZhbCArPSAodW5zaWduZWQgbG9uZykgKnN0cisrOwotICAgICAgZyA9IGh2YWwgJiAoKHVuc2lnbmVkIGxvbmcpIDB4ZiA8PCAoSEFTSFdPUkRCSVRTIC0gNCkpOwotICAgICAgaWYgKGcgIT0gMCkKLQl7Ci0JICBodmFsIF49IGcgPj4gKEhBU0hXT1JEQklUUyAtIDgpOwotCSAgaHZhbCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBodmFsOwotfQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9pbnRsLWNvbXBhdC5jIGxyenN6LTAuMTIuMjAvaW50bC9pbnRsLWNvbXBhdC5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvaW50bC1jb21wYXQuYwkxOTk4LTA0LTI2IDE0OjIwOjUyLjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2ludGwtY29tcGF0LmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsNzYgKzAsMCBAQAotLyogaW50bC1jb21wYXQuYyAtIFN0dWIgZnVuY3Rpb25zIHRvIGNhbGwgZ2V0dGV4dCBmdW5jdGlvbnMgZnJvbSBHTlUgZ2V0dGV4dAotICAgTGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotCi0jdW5kZWYgZ2V0dGV4dAotI3VuZGVmIGRnZXR0ZXh0Ci0jdW5kZWYgZGNnZXR0ZXh0Ci0jdW5kZWYgdGV4dGRvbWFpbgotI3VuZGVmIGJpbmR0ZXh0ZG9tYWluCi0KLQotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSAgcmV0dXJuIGJpbmR0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOwotfQotCi0KLWNoYXIgKgotZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0gIHJldHVybiBkY2dldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KTsKLX0KLQotCi1jaGFyICoKLWRnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBkZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCk7Ci19Ci0KLQotY2hhciAqCi1nZXR0ZXh0IChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBnZXR0ZXh0X18gKG1zZ2lkKTsKLX0KLQotCi1jaGFyICoKLXRleHRkb21haW4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIHJldHVybiB0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUpOwotfQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9sMTBuZmxpc3QuYyBscnpzei0wLjEyLjIwL2ludGwvbDEwbmZsaXN0LmMKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9sMTBuZmxpc3QuYwkxOTk4LTA0LTI2IDE0OjIyOjM3LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2wxMG5mbGlzdC5jCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDQwOSArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKLSMgaW5jbHVkZSA8YXJnei5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotI2lmbmRlZiBOVUxMCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQotI2Vsc2UKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZSBmdW5jdGlvbiB3aGljaCBhcmUgdXN1YWxseSBub3QgYXZhaWxhYmxlLiAgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX0NPVU5UCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBBUkdaLiAgKi8KLXN0YXRpYyBzaXplX3QgYXJnel9jb3VudF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pKTsKLQotc3RhdGljIHNpemVfdAotYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCi0gICAgIGNvbnN0IGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotIyB1bmRlZiBfX2FyZ3pfY291bnQKLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQotLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncwotICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLwotc3RhdGljIHZvaWQgYXJnel9zdHJpbmdpZnlfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKSk7Ci0KLXN0YXRpYyB2b2lkCi1hcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGxlbjsKLSAgICAgaW50IHNlcDsKLXsKLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKLSAgICAgIGFyZ3ogKz0gcGFydF9sZW47Ci0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotICAgICAgaWYgKGxlbiA+IDApCi0JKmFyZ3orKyA9IHNlcDsKLSAgICB9Ci19Ci0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCi1zdGF0aWMgY2hhciAqYXJnel9uZXh0X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLAotCQkJCSAgY29uc3QgY2hhciAqZW50cnkpKTsKLQotc3RhdGljIGNoYXIgKgotYXJnel9uZXh0X18gKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGFyZ3pfbGVuOwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLXsKLSAgaWYgKGVudHJ5KQotICAgIHsKLSAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKLSAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7Ci0KLSAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7Ci0gICAgfQotICBlbHNlCi0gICAgaWYgKGFyZ3pfbGVuID4gMCkKLSAgICAgIHJldHVybiBhcmd6OwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotfQotIyB1bmRlZiBfX2FyZ3pfbmV4dAotIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCi0KLQotLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KLXN0YXRpYyBpbnQgcG9wIFBBUkFNUyAoKGludCB4KSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3AgKHgpCi0gICAgIGludCB4OwotewotICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCi0gIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKLSAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOwotICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7Ci0gIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLQwKLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgbWFzaywgbGFuZ3VhZ2UsCi0JCSAgICB0ZXJyaXRvcnksIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCSAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIGRvX2FsbG9jYXRlKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdDsKLSAgICAgY29uc3QgY2hhciAqZGlybGlzdDsKLSAgICAgc2l6ZV90IGRpcmxpc3RfbGVuOwotICAgICBpbnQgbWFzazsKLSAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gICAgIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKLSAgICAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICptb2RpZmllcjsKLSAgICAgY29uc3QgY2hhciAqc3BlY2lhbDsKLSAgICAgY29uc3QgY2hhciAqc3BvbnNvcjsKLSAgICAgY29uc3QgY2hhciAqcmV2aXNpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBpbnQgZG9fYWxsb2NhdGU7Ci17Ci0gIGNoYXIgKmFic19maWxlbmFtZTsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbGFzdCA9IE5VTEw7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLSAgY2hhciAqY3A7Ci0gIHNpemVfdCBlbnRyaWVzOwotICBpbnQgY250OwotCi0gIC8qIEFsbG9jYXRlIHJvb20gZm9yIHRoZSBmdWxsIGZpbGUgbmFtZS4gICovCi0gIGFic19maWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlybGlzdF9sZW4KLQkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKLQkJCQkgICsgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAodGVycml0b3J5KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKGNvZGVzZXQpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChub3JtYWxpemVkX2NvZGVzZXQpICsgMSA6IDApCi0JCQkJICArICgoKG1hc2sgJiBYUEdfTU9ESUZJRVIpICE9IDAKLQkJCQkgICAgICB8fCAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCkKLQkJCQkgICAgID8gc3RybGVuIChtb2RpZmllcikgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChzcGVjaWFsKSArIDEgOiAwKQotCQkJCSAgKyAoKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKLQkJCQkgICAgICB8fCAobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKLQkJCQkgICAgID8gKDEgKyAoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAotCQkJCQkgICAgID8gc3RybGVuIChzcG9uc29yKSArIDEgOiAwKQotCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAotCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCi0JCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotCi0gIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR2YWwgPSBOVUxMOwotICBsYXN0ID0gTlVMTDsKLQotICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KLSAgbWVtY3B5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3QsIGRpcmxpc3RfbGVuKTsKLSAgX19hcmd6X3N0cmluZ2lmeSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0X2xlbiwgJzonKTsKLSAgY3AgPSBhYnNfZmlsZW5hbWUgKyAoZGlybGlzdF9sZW4gLSAxKTsKLSAgKmNwKysgPSAnLyc7Ci0gIGNwID0gc3RwY3B5IChjcCwgbGFuZ3VhZ2UpOwotCi0gIGlmICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICdfJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgdGVycml0b3J5KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJy4nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiAoWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFKSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgcGFydCBvZiBib3RoIHN5bnRhY2VzIGJ1dCBoYXMgZGlmZmVyZW50Ci0JIGxlYWRpbmcgY2hhcmFjdGVycy4gIEZvciBDRU4gd2UgdXNlIGArJywgZWxzZSBgQCcuICAqLwotICAgICAgKmNwKysgPSAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCA/ICcrJyA6ICdAJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOwotICAgIH0KLSAgaWYgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnKyc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIHNwZWNpYWwpOwotICAgIH0KLSAgaWYgKChtYXNrICYgKENFTl9TUE9OU09SIHwgQ0VOX1JFVklTSU9OKSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcsJzsKLSAgICAgIGlmICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwKQotCWNwID0gc3RwY3B5IChjcCwgc3BvbnNvcik7Ci0gICAgICBpZiAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCi0JewotCSAgKmNwKysgPSAnXyc7Ci0JICBjcCA9IHN0cGNweSAoY3AsIHJldmlzaW9uKTsKLQl9Ci0gICAgfQotCi0gICpjcCsrID0gJy8nOwotICBzdHBjcHkgKGNwLCBmaWxlbmFtZSk7Ci0KLSAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5Ci0gICAgIGF2YWlsYWJsZS4gICovCi0gIGxhc3QgPSBOVUxMOwotICBmb3IgKHJldHZhbCA9ICpsMTBuZmlsZV9saXN0OyByZXR2YWwgIT0gTlVMTDsgcmV0dmFsID0gcmV0dmFsLT5uZXh0KQotICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgICB7Ci0JaW50IGNvbXBhcmUgPSBzdHJjbXAgKHJldHZhbC0+ZmlsZW5hbWUsIGFic19maWxlbmFtZSk7Ci0JaWYgKGNvbXBhcmUgPT0gMCkKLQkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KLQkgIGJyZWFrOwotCWlmIChjb21wYXJlIDwgMCkKLQkgIHsKLQkgICAgLyogSXQncyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgICByZXR2YWwgPSBOVUxMOwotCSAgICBicmVhazsKLQkgIH0KLQotCWxhc3QgPSByZXR2YWw7Ci0gICAgICB9Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCi0gICAgewotICAgICAgZnJlZSAoYWJzX2ZpbGVuYW1lKTsKLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gIHJldHZhbCA9IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCi0gICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpICsgKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pCi0JCQkJKiAoMSA8PCBwb3AgKG1hc2spKQotCQkJCSogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR2YWwtPmZpbGVuYW1lID0gYWJzX2ZpbGVuYW1lOwotICByZXR2YWwtPmRlY2lkZWQgPSAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgIT0gMQotCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0JCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7Ci0gIHJldHZhbC0+ZGF0YSA9IE5VTEw7Ci0KLSAgaWYgKGxhc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR2YWwtPm5leHQgPSAqbDEwbmZpbGVfbGlzdDsKLSAgICAgICpsMTBuZmlsZV9saXN0ID0gcmV0dmFsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHZhbC0+bmV4dCA9IGxhc3QtPm5leHQ7Ci0gICAgICBsYXN0LT5uZXh0ID0gcmV0dmFsOwotICAgIH0KLQotICBlbnRyaWVzID0gMDsKLSAgLyogSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgdGhlIFJFVFZBTCBlbnRyeSBjb3JyZXNwb25kcyBub3QgdG8KLSAgICAgYSByZWFsIGZpbGUuICBTbyB3ZSBoYXZlIHRvIHVzZSB0aGUgRElSTElTVCBzZXBhcmF0aW9uIG1lY2hhbmlzbQotICAgICBvZiB0aGUgaW5uZXIgbG9vcC4gICovCi0gIGNudCA9IF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pID09IDEgPyBtYXNrIC0gMSA6IG1hc2s7Ci0gIGZvciAoOyBjbnQgPj0gMDsgLS1jbnQpCi0gICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAotCSYmICgoY250ICYgQ0VOX1NQRUNJRklDKSA9PSAwIHx8IChjbnQgJiBYUEdfU1BFQ0lGSUMpID09IDApCi0JJiYgKChjbnQgJiBYUEdfQ09ERVNFVCkgPT0gMCB8fCAoY250ICYgWFBHX05PUk1fQ09ERVNFVCkgPT0gMCkpCi0gICAgICB7Ci0JLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCi0JY2hhciAqZGlyID0gTlVMTDsKLQotCXdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQotCSAgICAgICAhPSBOVUxMKQotCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQotCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLCBjbnQsCi0JCQkJICBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7Ci0gICAgICB9Ci0gIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXNdID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLSAgIG5hbWVzLiAgKi8KLWNvbnN0IGNoYXIgKgotX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb2Rlc2V0LCBuYW1lX2xlbikKLSAgICAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgICAgc2l6ZV90IG5hbWVfbGVuOwotewotICBpbnQgbGVuID0gMDsKLSAgaW50IG9ubHlfZGlnaXQgPSAxOwotICBjaGFyICpyZXR2YWw7Ci0gIGNoYXIgKndwOwotICBzaXplX3QgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotICAgIGlmIChpc2FsbnVtIChjb2Rlc2V0W2NudF0pKQotICAgICAgewotCSsrbGVuOwotCi0JaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCi0JICBvbmx5X2RpZ2l0ID0gMDsKLSAgICAgIH0KLQotICByZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKChvbmx5X2RpZ2l0ID8gMyA6IDApICsgbGVuICsgMSk7Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvbmx5X2RpZ2l0KQotCXdwID0gc3RwY3B5IChyZXR2YWwsICJpc28iKTsKLSAgICAgIGVsc2UKLQl3cCA9IHJldHZhbDsKLQotICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0JaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IHRvbG93ZXIgKGNvZGVzZXRbY250XSk7Ci0JZWxzZSBpZiAoaXNkaWdpdCAoY29kZXNldFtjbnRdKSkKLQkgICp3cCsrID0gY29kZXNldFtjbnRdOwotCi0gICAgICAqd3AgPSAnXDAnOwotICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgcmV0dmFsOwotfQotCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvbGliZ2V0dGV4dC5oIGxyenN6LTAuMTIuMjAvaW50bC9saWJnZXR0ZXh0LmgKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9saWJnZXR0ZXh0LmgJMTk5OC0wNC0yNiAxNDoyMjozNi4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9saWJnZXR0ZXh0LmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTgyICswLDAgQEAKLS8qIE1lc3NhZ2UgY2F0YWxvZ3MgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBCZWNhdXNlIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzKSB3ZSBzb21ldGltZXMgaGF2ZSB0byBpbmNsdWRlCi0gICB0aGUgc3lzdGVtcyBsaWJpbnRsLmggYXMgd2VsbCBhcyB0aGlzIGZpbGUgd2UgaGF2ZSBtb3JlIGNvbXBsZXgKLSAgIGluY2x1ZGUgcHJvdGVjdGlvbiBhYm92ZS4gIEJ1dCB0aGUgc3lzdGVtcyBoZWFkZXIgbWlnaHQgcGVyaGFwcyBhbHNvCi0gICBkZWZpbmUgX0xJQklOVExfSCBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHJvdGVjdCB0aGUgZGVmaW5pdGlvbiBoZXJlLiAgKi8KLQotI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKSB8fCAhZGVmaW5lZCAoX0xJQkdFVFRFWFRfSCkKLSNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCkKLSMgZGVmaW5lIF9MSUJJTlRMX0gJMQotI2VuZGlmCi0jZGVmaW5lIF9MSUJHRVRURVhUX0gJMQotCi0vKiBXZSBkZWZpbmUgYW4gYWRkaXRpb25hbCBzeW1ib2wgdG8gc2lnbmFsIHRoYXQgd2UgdXNlIHRoZSBHTlUKLSAgIGltcGxlbWVudGF0aW9uIG9mIGdldHRleHQuICAqLwotI2RlZmluZSBfX1VTRV9HTlVfR0VUVEVYVCAxCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBOVUxMCi0jIGlmICFkZWZpbmVkIF9fY3BsdXNwbHVzIHx8IGRlZmluZWQgX19HTlVDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAoMCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgIUhBVkVfTENfTUVTU0FHRVMKLS8qIFRoaXMgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBnZXR0ZXh0KCkgYW5kIGRnZXR0ZXh0KCkKLSAgIGZ1bmN0aW9uLiAgQnV0IHNvbWUgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhpcyBkZWZpbmVkLiAgRGVmaW5lIGl0Ci0gICB0byBhIGRlZmF1bHQgdmFsdWUuICAqLwotIyBkZWZpbmUgTENfTUVTU0FHRVMgKC0xKQotI2VuZGlmCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBnZXR0ZXh0LXVzaW5nLWNhdGdldHMgaW50ZXJmYWNlLiAgRGVyaXZlZCBmcm9tCi0gICBKaW0gTWV5ZXJpbmcncyBsaWJpbnRsLmguICAqLwotc3RydWN0IF9tc2dfZW50Ci17Ci0gIGNvbnN0IGNoYXIgKl9tc2c7Ci0gIGludCBfbXNnX251bWJlcjsKLX07Ci0KLQotI2lmIEhBVkVfQ0FUR0VUUwotLyogVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiB0aGUgYXV0b21hdGljYWxseSBieSBwby10by10Ymwuc2VkCi0gICBnZW5lcmF0ZWQgZmlsZSBgY2F0LWlkLXRibC5jJy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW107Ci1leHRlcm4gaW50IF9tc2dfdGJsX2xlbmd0aDsKLSNlbmRpZgotCi0KLS8qIEZvciBhdXRvbWF0aWNhbCBleHRyYWN0aW9uIG9mIG1lc3NhZ2VzIHNvbWV0aW1lcyBubyByZWFsCi0gICB0cmFuc2xhdGlvbiBpcyBuZWVkZWQuICBJbnN0ZWFkIHRoZSBzdHJpbmcgaXRzZWxmIGlzIHRoZSByZXN1bHQuICAqLwotI2RlZmluZSBnZXR0ZXh0X25vb3AoU3RyKSAoU3RyKQotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpnZXR0ZXh0X18gUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQKLSAgIExDX01FU1NBR0VTIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLCBjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci1leHRlcm4gY2hhciAqZGdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQsCi0JCQkJaW50IF9fY2F0ZWdvcnkpKTsKLWV4dGVybiBjaGFyICpkY2dldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci1leHRlcm4gY2hhciAqdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLWV4dGVybiBjaGFyICpiaW5kdGV4dGRvbWFpbl9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqX19kaXJuYW1lKSk7Ci0KLSNpZiBFTkFCTEVfTkxTCi0KLS8qIFNvbGFyaXMgMi4zIGhhcyB0aGUgZ2V0dGV4dCBmdW5jdGlvbiBidXQgZGNnZXR0ZXh0IGlzIG1pc3NpbmcuCi0gICBTbyB3ZSBvbWl0IHRoaXMgb3B0aW1pemF0aW9uIGZvciBTb2xhcmlzIDIuMy4gIEJUVywgU29sYXJpcyAyLjQKLSAgIGhhcyBkY2dldHRleHQuICAqLwotIyBpZiAhSEFWRV9DQVRHRVRTICYmICghSEFWRV9HRVRURVhUIHx8IEhBVkVfRENHRVRURVhUKQotCi0jICBkZWZpbmUgZ2V0dGV4dChNc2dpZCkJCQkJCQkgICAgICBcCi0gICAgIGRnZXR0ZXh0IChOVUxMLCBNc2dpZCkKLQotIyAgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKQkJCQkJICAgICAgXAotICAgICBkY2dldHRleHQgKERvbWFpbm5hbWUsIE1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyAgaWYgZGVmaW5lZCBfX0dOVUNfXyAmJiBfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fID49IDcKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gbG9hZG1zZ2NhdC5jLiAgV2UgbmVlZCBhIHNpZ24sCi0gICB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwKLSAgIHRyYW5zbGF0aW9ucy4gICovCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLSMgICBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkJCQkgICAgICBcCi0gIChfX2V4dGVuc2lvbl9fCQkJCQkJCSAgICAgIFwKLSAgICh7CQkJCQkJCQkJICAgICAgXAotICAgICBjaGFyICpfX3Jlc3VsdDsJCQkJCQkJICAgICAgXAotICAgICBpZiAoX19idWlsdGluX2NvbnN0YW50X3AgKE1zZ2lkKSkJCQkJCSAgICAgIFwKLSAgICAgICB7CQkJCQkJCQkgICAgICBcCi0JIHN0YXRpYyBjaGFyICpfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0JIHN0YXRpYyBpbnQgX19jYXRhbG9nX2NvdW50ZXJfXzsJCQkJICAgICAgXAotCSBpZiAoISBfX3RyYW5zbGF0aW9uX18gfHwgX19jYXRhbG9nX2NvdW50ZXJfXyAhPSBfbmxfbXNnX2NhdF9jbnRyKSAgICBcCi0JICAgewkJCQkJCQkJICAgICAgXAotCSAgICAgX190cmFuc2xhdGlvbl9fID0JCQkJCQkgICAgICBcCi0JICAgICAgIGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAotCSAgICAgX19jYXRhbG9nX2NvdW50ZXJfXyA9IF9ubF9tc2dfY2F0X2NudHI7CQkJICAgICAgXAotCSAgIH0JCQkJCQkJCSAgICAgIFwKLQkgX19yZXN1bHQgPSBfX3RyYW5zbGF0aW9uX187CQkJCQkgICAgICBcCi0gICAgICAgfQkJCQkJCQkJICAgICAgXAotICAgICBlbHNlCQkJCQkJCQkgICAgICBcCi0gICAgICAgX19yZXN1bHQgPSBkY2dldHRleHRfXyAoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KTsJCSAgICAgIFwKLSAgICAgX19yZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jICBlbmRpZgotIyBlbmRpZgotCi0jZWxzZQotCi0jIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW5uYW1lLCBNc2dpZCkgKE1zZ2lkKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSkgKE1zZ2lkKQotIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgd2hpbGUgKDApIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvbGludXgtbXNnLnNlZCBscnpzei0wLjEyLjIwL2ludGwvbGludXgtbXNnLnNlZAotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2xpbnV4LW1zZy5zZWQJMTk5OC0wNC0yNiAxNDoyMDo1Mi4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9saW51eC1tc2cuc2VkCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDEwMCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIExpbnV4IHN0eWxlIC5tc2cgZmlsZQotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMKLSMgVGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgLm1zZyBzaG91bGQgYmUgdGhlIGRlZmluaXRpb24gb2YgdGhlCi0jIG1lc3NhZ2Ugc2V0IG51bWJlci4gIFdlIHVzZSBhbHdheXMgc2V0IG51bWJlciAxLgotIwotMSB7Ci0gIGlcCi0kc2V0IDEgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgcG8ybXNnLnNlZAotICBoCi0gIHMvLiovMC8KLSAgeAotfQotIwotIyBNaXRjaCdzIG9sZCBjYXRhbG9nIGZvcm1hdCBkb2VzIG5vdCBhbGxvdyBjb21tZW50cy4KLSMKLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgotIwotL15tc2dpZC8gewotICBzL21zZ2lkWyAJXSoiLy8KLSMKLSMgVGhpcyBkb2VzIG5vdCB3b3JrIG5vdyB3aXRoIHRoZSBuZXcgZm9ybWF0LgotIyAvIiQvISB7Ci0jICAgcy9cXCQvLwotIyAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLwotIyB9Ci0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0gIEcKLSAgcy9cKC4qXCkiXG5cKFswLTldKlwpLyQgI1wyIE9yaWdpbmFsIE1lc3NhZ2U6KFwxKS9wCi19Ci0jCi0jIFRoZSAubXNnIGZpbGUgY29udGFpbnMsIG90aGVyIHRoZW4gdGhlIC5wbyBmaWxlLCBvbmx5IHRoZSB0cmFuc2xhdGlvbnMKLSMgYnV0IGVhY2ggZ2l2ZW4gYSB1bmlxdWUgSUQuICBTdGFydGluZyBmcm9tIDEgYW5kIGluY3JlbWVudGluZyBieSAxIGZvcgotIyBlYWNoIG1lc3NhZ2Ugd2UgYXNzaWduIHRoZW0gdG8gdGhlIG1lc3NhZ2VzLgotIyBJdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGUgLnBvIGZpbGUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY2F0LWlkLXRibC5jIGZpbGUKLSMgKHdpdGggcG8tdG8tdGJsKSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHVzZWQgaGVyZS4gIChBdCBsZWFzdCB0aGUgb3JkZXIKLSMgb2YgZGVjbGFyYXRpb25zIG11c3Qgbm90IGJlIGNoYW5nZWQuKQotIwotL15tc2dzdHIvIHsKLSAgcy9tc2dzdHJbIAldKiJcKC4qXCkiLyMgXDEvCi0jIENsZWFyIHN1YnN0aXR1dGlvbiBmbGFnLgotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlxuXCkiXCguKlwpIi9cMVwyLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotICBQCi0gIEQKLSMgTm90ZSB0aGF0IEQgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0gIHRiCi19Ci1kCmRpZmYgLXVwck4gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL2xvYWRpbmZvLmggbHJ6c3otMC4xMi4yMC9pbnRsL2xvYWRpbmZvLmgKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9sb2FkaW5mby5oCTE5OTgtMDQtMjYgMTQ6MjA6NTIuMDAwMDAwMDAwICswMTAwCisrKyBscnpzei0wLjEyLjIwL2ludGwvbG9hZGluZm8uaAkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSw1OCArMCwwIEBACi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBFbmNvZGluZyBvZiBsb2NhbGUgbmFtZSBwYXJ0cy4gICovCi0jZGVmaW5lIENFTl9SRVZJU0lPTgkJMQotI2RlZmluZSBDRU5fU1BPTlNPUgkJMgotI2RlZmluZSBDRU5fU1BFQ0lBTAkJNAotI2RlZmluZSBYUEdfTk9STV9DT0RFU0VUCTgKLSNkZWZpbmUgWFBHX0NPREVTRVQJCTE2Ci0jZGVmaW5lIFRFUlJJVE9SWQkJMzIKLSNkZWZpbmUgQ0VOX0FVRElFTkNFCQk2NAotI2RlZmluZSBYUEdfTU9ESUZJRVIJCTEyOAotCi0jZGVmaW5lIENFTl9TUEVDSUZJQwkoQ0VOX1JFVklTSU9OfENFTl9TUE9OU09SfENFTl9TUEVDSUFMfENFTl9BVURJRU5DRSkKLSNkZWZpbmUgWFBHX1NQRUNJRklDCShYUEdfQ09ERVNFVHxYUEdfTk9STV9DT0RFU0VUfFhQR19NT0RJRklFUikKLQotCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlCi17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBpbnQgZGVjaWRlZDsKLQotICBjb25zdCB2b2lkICpkYXRhOwotCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnN1Y2Nlc3NvclsxXTsKLX07Ci0KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCBQQVJBTVMgKChjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJCQkJICBzaXplX3QgbmFtZV9sZW4pKTsKLQotZXh0ZXJuIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAotCQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCi0JCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLQkJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKLQkJCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKLQkJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKSk7Ci0KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1leHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgUEFSQU1TICgoY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmxhbmd1YWdlLAotCQkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAotCQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnNwb25zb3IsCi0JCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pKTsKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvbG9hZG1zZ2NhdC5jIGxyenN6LTAuMTIuMjAvaW50bC9sb2FkbXNnY2F0LmMKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9sb2FkbXNnY2F0LmMJMTk5OC0wNC0yNiAxNDoyMjozNy4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9sb2FkbXNnY2F0LmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTk5ICswLDAgQEAKLS8qIExvYWQgbmVlZGVkIG1lc3NhZ2UgY2F0YWxvZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCkgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIElTTyBDIGZ1bmN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkCi0gICBiZWNhdXNlIHNvbWUgSVNPIEMgZnVuY3Rpb25zIHdpbGwgcmVxdWlyZSBsaW5raW5nIHdpdGggdGhpcyBvYmplY3QKLSAgIGZpbGUgYW5kIHRoZSBuYW1lIHNwYWNlIG11c3Qgbm90IGJlIHBvbGx1dGVkLiAgKi8KLSMgZGVmaW5lIGZzdGF0ICBfX2ZzdGF0Ci0jIGRlZmluZSBvcGVuICAgX19vcGVuCi0jIGRlZmluZSBjbG9zZSAgX19jbG9zZQotIyBkZWZpbmUgcmVhZCAgIF9fcmVhZAotIyBkZWZpbmUgbW1hcCAgIF9fbW1hcAotIyBkZWZpbmUgbXVubWFwIF9fbXVubWFwCi0jZW5kaWYKLQotLyogV2UgbmVlZCBhIHNpZ24sIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZAotICAgd2l0aCBhbGwgdHJhbnNsYXRpb25zLiAgVGhpcyBpcyBpbXBvcnRhbnQgaWYgdGhlIHRyYW5zbGF0aW9ucyBhcmUKLSAgIGNhY2hlZCBieSBvbmUgb2YgR0NDJ3MgZmVhdHVyZXMuICAqLwotaW50IF9ubF9tc2dfY2F0X2NudHIgPSAwOwotCi0KLS8qIExvYWQgdGhlIG1lc3NhZ2UgY2F0YWxvZ3Mgc3BlY2lmaWVkIGJ5IEZJTEVOQU1FLiAgSWYgaXQgaXMgbm8gdmFsaWQKLSAgIG1lc3NhZ2UgY2F0YWxvZyBkbyBub3RoaW5nLiAgKi8KLXZvaWQKLV9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpCi0gICAgIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKmRvbWFpbl9maWxlOwotewotICBpbnQgZmQ7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKmRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xOwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gIGludCB1c2VfbW1hcCA9IDA7Ci0jZW5kaWYKLSAgc3RydWN0IGxvYWRlZF9kb21haW4gKmRvbWFpbjsKLQotICBkb21haW5fZmlsZS0+ZGVjaWRlZCA9IDE7Ci0gIGRvbWFpbl9maWxlLT5kYXRhID0gTlVMTDsKLQotICAvKiBJZiB0aGUgcmVjb3JkIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGxvY2FsZSB0aGUgRklMRU5BTUUKLSAgICAgbWlnaHQgYmUgTlVMTC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KLSAgICAgc3BlY2lmaWNhdGlvbiB0aGUgbG9jYWxlIGZpbGUgbmFtZSBpcyBkaWZmZXJlbnQgZm9yIFhQRyBhbmQgQ0VOCi0gICAgIHN5bnRheC4gICovCi0gIGlmIChkb21haW5fZmlsZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogVHJ5IHRvIG9wZW4gdGhlIGFkZHJlc3NlZCBmaWxlLiAgKi8KLSAgZmQgPSBvcGVuIChkb21haW5fZmlsZS0+ZmlsZW5hbWUsIE9fUkRPTkxZKTsKLSAgaWYgKGZkID09IC0xKQotICAgIHJldHVybjsKLQotICAvKiBXZSBtdXN0IGtub3cgYWJvdXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuICAqLwotICBpZiAoZnN0YXQgKGZkLCAmc3QpICE9IDAKLSAgICAgICYmIHN0LnN0X3NpemUgPCAob2ZmX3QpIHNpemVvZiAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyKSkKLSAgICB7Ci0gICAgICAvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gIC8qIE5vdyB3ZSBhcmUgcmVhZHkgdG8gbG9hZCB0aGUgZmlsZS4gIElmIG1tYXAoKSBpcyBhdmFpbGFibGUgd2UgdHJ5Ci0gICAgIHRoaXMgZmlyc3QuICBJZiBub3QgYXZhaWxhYmxlIG9yIGl0IGZhaWxlZCB3ZSB0cnkgdG8gbG9hZCBpdC4gICovCi0gIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1tYXAgKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwKLQkJCQkJIE1BUF9QUklWQVRFLCBmZCwgMCk7Ci0KLSAgaWYgKGRhdGEgIT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICAvKiBtbWFwKCkgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4gICovCi0gICAgICBjbG9zZSAoZmQpOwotICAgICAgdXNlX21tYXAgPSAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHRoZSBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIChpLmUuIG1tYXAnZWQpIHdlIHRyeSB0byBsb2FkCi0gICAgIGl0IG1hbnVhbGx5LiAgKi8KLSAgaWYgKGRhdGEgPT0gKHN0cnVjdCBtb19maWxlX2hlYWRlciAqKSAtMSkKLSAgICB7Ci0gICAgICBvZmZfdCB0b19yZWFkOwotICAgICAgY2hhciAqcmVhZF9wdHI7Ci0KLSAgICAgIGRhdGEgPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIG1hbGxvYyAoc3Quc3Rfc2l6ZSk7Ci0gICAgICBpZiAoZGF0YSA9PSBOVUxMKQotCXJldHVybjsKLQotICAgICAgdG9fcmVhZCA9IHN0LnN0X3NpemU7Ci0gICAgICByZWFkX3B0ciA9IChjaGFyICopIGRhdGE7Ci0gICAgICBkbwotCXsKLQkgIGxvbmcgaW50IG5iID0gKGxvbmcgaW50KSByZWFkIChmZCwgcmVhZF9wdHIsIHRvX3JlYWQpOwotCSAgaWYgKG5iID09IC0xKQotCSAgICB7Ci0JICAgICAgY2xvc2UgKGZkKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgcmVhZF9wdHIgKz0gbmI7Ci0JICB0b19yZWFkIC09IG5iOwotCX0KLSAgICAgIHdoaWxlICh0b19yZWFkID4gMCk7Ci0KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgfQotCi0gIC8qIFVzaW5nIHRoZSBtYWdpYyBudW1iZXIgd2UgY2FuIHRlc3Qgd2hldGhlciBpdCByZWFsbHkgaXMgYSBtZXNzYWdlCi0gICAgIGNhdGFsb2cgZmlsZS4gICovCi0gIGlmIChkYXRhLT5tYWdpYyAhPSBfTUFHSUMgJiYgZGF0YS0+bWFnaWMgIT0gX01BR0lDX1NXQVBQRUQpCi0gICAgewotICAgICAgLyogVGhlIG1hZ2ljIG51bWJlciBpcyB3cm9uZzogbm90IGEgbWVzc2FnZSBjYXRhbG9nIGZpbGUuICAqLwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gICAgICBpZiAodXNlX21tYXApCi0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc3Quc3Rfc2l6ZSk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlmcmVlIChkYXRhKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG9tYWluX2ZpbGUtPmRhdGEKLSAgICA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGxvYWRlZF9kb21haW4pKTsKLSAgaWYgKGRvbWFpbl9maWxlLT5kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKLSAgZG9tYWluLT5kYXRhID0gKGNoYXIgKikgZGF0YTsKLSAgZG9tYWluLT5tdXN0X3N3YXAgPSBkYXRhLT5tYWdpYyAhPSBfTUFHSUM7Ci0KLSAgLyogRmlsbCBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGF2YWlsYWJsZSB0YWJsZXMuICAqLwotICBzd2l0Y2ggKFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5yZXZpc2lvbikpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGRvbWFpbi0+bnN0cmluZ3MgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+bnN0cmluZ3MpOwotICAgICAgZG9tYWluLT5vcmlnX3RhYiA9IChzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5vcmlnX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+dHJhbnNfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnRyYW5zX3RhYl9vZmZzZXQpKTsKLSAgICAgIGRvbWFpbi0+aGFzaF9zaXplID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPmhhc2hfdGFiX3NpemUpOwotICAgICAgZG9tYWluLT5oYXNoX3RhYiA9IChubHNfdWludDMyICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfb2Zmc2V0KSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhpcyBpcyBhbiBpbGxlZ2FsIHJldmlzaW9uLiAgKi8KLSNpZiAoZGVmaW5lZCBIQVZFX01NQVAgJiYgZGVmaW5lZCBIQVZFX01VTk1BUCAmJiAhZGVmaW5lZCBESVNBTExPV19NTUFQKSBcCi0gICAgfHwgZGVmaW5lZCBfTElCQwotICAgICAgaWYgKHVzZV9tbWFwKQotCW11bm1hcCAoKGNhZGRyX3QpIGRhdGEsIHN0LnN0X3NpemUpOwotICAgICAgZWxzZQotI2VuZGlmCi0JZnJlZSAoZGF0YSk7Ci0gICAgICBmcmVlIChkb21haW4pOwotICAgICAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBTaG93IHRoYXQgb25lIGRvbWFpbiBpcyBjaGFuZ2VkLiAgVGhpcyBtaWdodCBtYWtlIHNvbWUgY2FjaGVkCi0gICAgIHRyYW5zbGF0aW9ucyBpbnZhbGlkLiAgKi8KLSAgKytfbmxfbXNnX2NhdF9jbnRyOwotfQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9sb2NhbGVhbGlhcy5jIGxyenN6LTAuMTIuMjAvaW50bC9sb2NhbGVhbGlhcy5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvbG9jYWxlYWxpYXMuYwkxOTk4LTA0LTI2IDE0OjIyOjM3LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL2xvY2FsZWFsaWFzLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMzc4ICswLDAgQEAKLS8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RyY2FzZWNtcCBfX3N0cmNhc2VjbXAKLSNlbmRpZgotCi0KLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLwotI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KLQotCi1zdHJ1Y3QgYWxpYXNfbWFwCi17Ci0gIGNvbnN0IGNoYXIgKmFsaWFzOwotICBjb25zdCBjaGFyICp2YWx1ZTsKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcDsKLXN0YXRpYyBzaXplX3Qgbm1hcCA9IDA7Ci1zdGF0aWMgc2l6ZV90IG1heG1hcCA9IDA7Ci0KLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKSk7Ci1zdGF0aWMgdm9pZCBleHRlbmRfYWxpYXNfdGFibGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBhbGlhc19jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKSk7Ci0KLQotY29uc3QgY2hhciAqCi1fbmxfZXhwYW5kX2FsaWFzIChuYW1lKQotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7Ci0gIHNpemVfdCBhZGRlZDsKLQotICBkbwotICAgIHsKLSAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKLQotICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7Ci0KLSAgICAgIGlmIChubWFwID4gMCkKLQlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAotCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkJCQkJICAgICAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwKLQkJCQkJCQkJIGNvbnN0IHZvaWQgKikpCi0JCQkJCQkpIGFsaWFzX2NvbXBhcmUpOwotICAgICAgZWxzZQotCXJldHZhbCA9IE5VTEw7Ci0KLSAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXJldHVybiByZXR2YWwtPnZhbHVlOwotCi0gICAgICAvKiBQZXJoYXBzIHdlIGNhbiBmaW5kIGFub3RoZXIgYWxpYXMgZmlsZS4gICovCi0gICAgICBhZGRlZCA9IDA7Ci0gICAgICB3aGlsZSAoYWRkZWQgPT0gMCAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnKQotCXsKLQkgIGNvbnN0IGNoYXIgKnN0YXJ0OwotCi0JICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gPT0gJzonKQotCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotCSAgc3RhcnQgPSBsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJzonKQotCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotCi0JICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKLQkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKLQl9Ci0gICAgfQotICB3aGlsZSAoYWRkZWQgIT0gMCk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHNpemVfdAotcmVhZF9hbGlhc19maWxlIChmbmFtZSwgZm5hbWVfbGVuKQotICAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICAgaW50IGZuYW1lX2xlbjsKLXsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCi0gIEZJTEUgKmZwOwotICBjaGFyICpmdWxsX2ZuYW1lOwotICBzaXplX3QgYWRkZWQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOwotCi0gIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGZ1bGxfZm5hbWUpOwotICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOwotICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0KLSAgZnAgPSBmb3BlbiAoZnVsbF9mbmFtZSwgInIiKTsKLSAgaWYgKGZwID09IE5VTEwpCi0gICAgewotICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFkZGVkID0gMDsKLSAgd2hpbGUgKCFmZW9mIChmcCkpCi0gICAgewotICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCi0JIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKLQkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90Ci0JICAgIGJlIHRoYXQgbG9uZwotICAgICAgICovCi0gICAgICBjaGFyIGJ1ZltCVUZTSVpdOwotICAgICAgY2hhciAqYWxpYXM7Ci0gICAgICBjaGFyICp2YWx1ZTsKLSAgICAgIGNoYXIgKmNwOwotCi0gICAgICBpZiAoZmdldHMgKGJ1ZiwgQlVGU0laLCBmcCkgPT0gTlVMTCkKLQkvKiBFT0YgcmVhY2hlZC4gICovCi0JYnJlYWs7Ci0KLSAgICAgIGNwID0gYnVmOwotICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKLQkrK2NwOwotCi0gICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLwotICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQotCXsKLQkgIGFsaWFzID0gY3ArKzsKLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCi0JICAgICsrY3A7Ci0JICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgKmNwKysgPSAnXDAnOwotCi0JICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKLQkgICAgKytjcDsKLQotCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBjaGFyICp0cDsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgdmFsdWUgPSBjcCsrOwotCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCi0JCSsrY3A7Ci0JICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KLQkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKLQkJewotCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKLQkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCi0JCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcbicgd2hpY2ggZG8gbm90IG92ZXJ3cml0ZSBoZXJlLiAgKi8KLQkJICAqY3ArKyA9ICdcMCc7Ci0JCSAgKmNwID0gJ1xuJzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCi0JCSpjcCsrID0gJ1wwJzsKLQotCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKLQkJZXh0ZW5kX2FsaWFzX3RhYmxlICgpOwotCi0JICAgICAgLyogV2UgY2Fubm90IGRlcGVuZCBvbiBzdHJkdXAgYXZhaWxhYmxlIGluIHRoZSBsaWJjLiAgU2lnaCEgICovCi0JICAgICAgbGVuID0gc3RybGVuIChhbGlhcykgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKLQkJfQotCSAgICAgIG1lbWNweSAodHAsIGFsaWFzLCBsZW4pOwotCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IHRwOwotCi0JICAgICAgbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKLQkJfQotCSAgICAgIG1lbWNweSAodHAsIHZhbHVlLCBsZW4pOwotCSAgICAgIG1hcFtubWFwXS52YWx1ZSA9IHRwOwotCi0JICAgICAgKytubWFwOwotCSAgICAgICsrYWRkZWQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQotCSB0aGUgcmVzdCBvZiB0aGUgbGluZS4gICovCi0gICAgICB3aGlsZSAoc3RyY2hyIChjcCwgJ1xuJykgPT0gTlVMTCkKLQl7Ci0JICBjcCA9IGJ1ZjsKLQkgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQotCSAgICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKLQkgICAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCi0JICAgICpjcCA9ICdcbic7Ci0JfQotICAgIH0KLQotICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCi0gICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KLSAgZmNsb3NlIChmcCk7Ci0KLSAgaWYgKGFkZGVkID4gMCkKLSAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCSAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkpIGFsaWFzX2NvbXBhcmUpOwotCi0gIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgcmV0dXJuIGFkZGVkOwotfQotCi0KLXN0YXRpYyB2b2lkCi1leHRlbmRfYWxpYXNfdGFibGUgKCkKLXsKLSAgc2l6ZV90IG5ld19zaXplOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOwotCi0gIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOwotICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgbWFsbG9jIChuZXdfc2l6ZQotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKLSAgaWYgKG5ld19tYXAgPT0gTlVMTCkKLSAgICAvKiBTaW1wbHkgZG9uJ3QgZXh0ZW5kOiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvcmUuICAqLwotICAgIHJldHVybjsKLQotICBtZW1jcHkgKG5ld19tYXAsIG1hcCwgbm1hcCAqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpOwotCi0gIGlmIChtYXhtYXAgIT0gMCkKLSAgICBmcmVlIChtYXApOwotCi0gIG1hcCA9IG5ld19tYXA7Ci0gIG1heG1hcCA9IG5ld19zaXplOwotfQotCi0KLXN0YXRpYyBpbnQKLWFsaWFzX2NvbXBhcmUgKG1hcDEsIG1hcDIpCi0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDE7Ci0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDI7Ci17Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSQ0FTRUNNUAotICByZXR1cm4gc3RyY2FzZWNtcCAobWFwMS0+YWxpYXMsIG1hcDItPmFsaWFzKTsKLSNlbHNlCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMS0+YWxpYXM7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMi0+YWxpYXM7Ci0gIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwotCi0gIGlmIChwMSA9PSBwMikKLSAgICByZXR1cm4gMDsKLQotICBkbwotICAgIHsKLSAgICAgIC8qIEkga25vdyB0aGlzIHNlZW1zIHRvIGJlIG9kZCBidXQgdGhlIHRvbG93ZXIoKSBmdW5jdGlvbiBpbgotCSBzb21lIHN5c3RlbXMgbGliYyBjYW5ub3QgaGFuZGxlIG5vbmFscGhhIGNoYXJhY3RlcnMuICAqLwotICAgICAgYzEgPSBpc3VwcGVyICgqcDEpID8gdG9sb3dlciAoKnAxKSA6ICpwMTsKLSAgICAgIGMyID0gaXN1cHBlciAoKnAyKSA/IHRvbG93ZXIgKCpwMikgOiAqcDI7Ci0gICAgICBpZiAoYzEgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgICsrcDE7Ci0gICAgICArK3AyOwotICAgIH0KLSAgd2hpbGUgKGMxID09IGMyKTsKLQotICByZXR1cm4gYzEgLSBjMjsKLSNlbmRpZgotfQpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9NYWtlZmlsZS5pbiBscnpzei0wLjEyLjIwL2ludGwvTWFrZWZpbGUuaW4KLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9NYWtlZmlsZS5pbgkxOTk4LTA0LTI2IDE0OjIyOjM1LjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL01ha2VmaWxlLmluCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDIxNCArMCwwIEBACi0jIE1ha2VmaWxlIGZvciBkaXJlY3Rvcnkgd2l0aCBtZXNzYWdlIGNhdGFsb2cgaGFuZGxpbmcgaW4gR05VIE5MUyBVdGlsaXRpZXMuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLXRvcF9idWlsZGRpciA9IC4uCi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotbGliZGlyID0gJChleGVjX3ByZWZpeCkvbGliCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSBAZGF0YWRpckAvZ2V0dGV4dC9pbnRsCi1hbGlhc3BhdGggPSAkKGxvY2FsZWRpcik6Lgotc3ViZGlyID0gaW50bAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1sID0gQGxACi0KLUFSID0gYXIKLUNDID0gQENDQAotTElCVE9PTCA9IEBMSUJUT09MQAotUkFOTElCID0gQFJBTkxJQkAKLQotREVGUyA9IC1ETE9DQUxFRElSPVwiJChsb2NhbGVkaXIpXCIgLURHTlVMT0NBTEVESVI9XCIkKGdudWxvY2FsZWRpcilcIiBcCi0tRExPQ0FMRV9BTElBU19QQVRIPVwiJChhbGlhc3BhdGgpXCIgQERFRlNACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLUhFQURFUlMgPSAkKENPTUhEUlMpIGxpYmdldHRleHQuaCBsb2FkaW5mby5oCi1DT01IRFJTID0gZ2V0dGV4dC5oIGdldHRleHRQLmggaGFzaC1zdHJpbmcuaAotU09VUkNFUyA9ICQoQ09NU1JDUykgaW50bC1jb21wYXQuYyBjYXQtY29tcGF0LmMKLUNPTVNSQ1MgPSBiaW5kdGV4dGRvbS5jIGRjZ2V0dGV4dC5jIGRnZXR0ZXh0LmMgZ2V0dGV4dC5jIFwKLWZpbmRkb21haW4uYyBsb2FkbXNnY2F0LmMgbG9jYWxlYWxpYXMuYyB0ZXh0ZG9tYWluLmMgbDEwbmZsaXN0LmMgXAotZXhwbG9kZW5hbWUuYwotT0JKRUNUUyA9IEBJTlRMT0JKU0AgYmluZHRleHRkb20uJGxvIGRjZ2V0dGV4dC4kbG8gZGdldHRleHQuJGxvIGdldHRleHQuJGxvIFwKLWZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvIGxvY2FsZWFsaWFzLiRsbyB0ZXh0ZG9tYWluLiRsbyBsMTBuZmxpc3QuJGxvIFwKLWV4cGxvZGVuYW1lLiRsbwotQ0FUT0JKUyA9IGNhdC1jb21wYXQuJGxvIC4uL3BvL2NhdC1pZC10YmwuJGxvCi1HRVRUT0JKUyA9IGludGwtY29tcGF0LiRsbwotRElTVEZJTEVTLmNvbW1vbiA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbiBsaW51eC1tc2cuc2VkIHBvMnRibC5zZWQuaW4gXAoteG9wZW4tbXNnLnNlZCAkKEhFQURFUlMpICQoU09VUkNFUykKLURJU1RGSUxFUy5ub3JtYWwgPSBWRVJTSU9OCi1ESVNURklMRVMuZ2V0dGV4dCA9IGxpYmludGwuZ2xpYmMgaW50bGguaW5zdC5pbgotCi0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5jIC5vIC5sbwotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgJDwKLQotSU5DTFVERVMgPSAtSS4uIC1JLiAtSSQodG9wX3NyY2RpcikvaW50bCAtSSQodG9wX3NyY2RpcikvbGliCi0KLWFsbDogYWxsLUBVU0VfSU5DTFVERURfTElCSU5UTEAKLQotYWxsLXllczogbGliaW50bC4kbGEgaW50bGguaW5zdAotYWxsLW5vOgotCi1saWJpbnRsLmE6ICQoT0JKRUNUUykKLQlybSAtZiAkQAotCSQoQVIpIGNydSAkQCAkKE9CSkVDVFMpCi0JJChSQU5MSUIpICRACi0KLWxpYmludGwubGE6ICQoT0JKRUNUUykKLQkkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0MpICQoTERGTEFHUykgLW8gJEAgJChPQkpFQ1RTKSBcCi0JCSAgIC12ZXJzaW9uLWluZm8gMTowIC1ycGF0aCAkKGxpYmRpcikKLQotLi4vcG8vY2F0LWlkLXRibC4kbG86IC4uL3BvL2NhdC1pZC10YmwuYyAkKHRvcF9zcmNkaXIpL3BvLyQoUEFDS0FHRSkucG90Ci0JY2QgLi4vcG8gJiYgJChNQUtFKSBjYXQtaWQtdGJsLiRsbwotCi1jaGVjazogYWxsCi0KLSMgVGhpcyBpbnN0YWxsYXRpb24gZ29hbCBpcyBvbmx5IHVzZWQgaW4gR05VIGdldHRleHQuICBQYWNrYWdlcyB3aGljaAotIyBvbmx5IHVzZSB0aGUgbGlicmFyeSBzaG91bGQgdXNlIGluc3RhbGwgaW5zdGVhZC4KLQotIyBXZSBtdXN0IG5vdCBpbnN0YWxsIHRoZSBsaWJpbnRsLmgvbGliaW50bC5hIGZpbGVzIGlmIHdlIGFyZSBvbiBhCi0jIHN5c3RlbSB3aGljaCBoYXMgdGhlIGdldHRleHQoKSBmdW5jdGlvbiBpbiBpdHMgQyBsaWJyYXJ5IG9yIGluIGEKLSMgc2VwYXJhdGUgbGlicmFyeSBvciB1c2UgdGhlIGNhdGdldHMgaW50ZXJmYWNlLiAgQSBzcGVjaWFsIGNhc2UgaXMKLSMgd2hlcmUgY29uZmlndXJlIGZvdW5kIGEgcHJldmlvdXNseSBpbnN0YWxsZWQgR05VIGdldHRleHQgbGlicmFyeS4KLSMgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmUgd2hpY2ggY29tZXMgd2l0aCB0aGlzIHZlcnNpb24gb2YgdGhlCi0jIHBhY2thZ2UsIHlvdSBoYXZlIHRvIHVzZSBgY29uZmlndXJlIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0Jy4KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzogYWxsCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCIgXAotCSAgICYmIHRlc3QgJ0BJTlRMT0JKU0AnID0gJyQoR0VUVE9CSlMpJzsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQobGliZGlyKSAkKGluY2x1ZGVkaXIpOyBcCi0JICBmaTsgXAotCSAgJChJTlNUQUxMX0RBVEEpIGludGxoLmluc3QgJChpbmNsdWRlZGlyKS9saWJpbnRsLmg7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBsaWJpbnRsLmEgJChsaWJkaXIpL2xpYmludGwuYTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotaW5zdGFsbC1kYXRhOiBhbGwKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBWRVJTSU9OICQoZ2V0dGV4dHNyY2RpcikvVkVSU0lPTjsgXAotCSAgZGlzdHM9IiQoRElTVEZJTEVTLmNvbW1vbikiOyBcCi0JICBmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRmaWxlICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWRpc3RzPSIkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIHJtIC1mICQoZ2V0dGV4dHNyY2RpcikvJCRmaWxlOyBcCi0JZG9uZQotCi1pbmZvIGR2aToKLQotJChPQkpFQ1RTKTogLi4vY29uZmlnLmggbGliZ2V0dGV4dC5oCi1iaW5kdGV4dGRvbS4kbG8gZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGxvYWRpbmZvLmgKLWRjZ2V0dGV4dC4kbG86IGdldHRleHRQLmggZ2V0dGV4dC5oIGhhc2gtc3RyaW5nLmggbG9hZGluZm8uaAotCi10YWdzOiBUQUdTCi0KLVRBR1M6ICQoSEVBREVSUykgJChTT1VSQ0VTKQotCWhlcmU9YHB3ZGA7IGNkICQoc3JjZGlyKSAmJiBldGFncyAtbyAkJGhlcmUvVEFHUyAkKEhFQURFUlMpICQoU09VUkNFUykKLQotaWQ6IElECi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgbWtpZCAtZiQkaGVyZS9JRCAkKEhFQURFUlMpICQoU09VUkNFUykKLQotCi1tb3N0bHljbGVhbjoKLQlybSAtZiAqLmEgKi5vICoubG8gY29yZSBjb3JlLioKLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBJRCBUQUdTIHBvMm1zZy5zZWQgcG8ydGJsLnNlZCBsaWJpbnRsLmgKLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLQotIyBHTlUgZ2V0dGV4dCBuZWVkcyBub3QgY29udGFpbiB0aGUgZmlsZSBgVkVSU0lPTicgYnV0IGNvbnRhaW5zIHNvbWUKLSMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IE1ha2VmaWxlICQoRElTVEZJTEVTKQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gZ2V0dGV4dDsgdGhlbiBcCi0JICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKLQllbHNlIFwKLQkgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCi0JZmk7IFwKLQlmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pICQkYWRkaXRpb25hbDsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotZGlzdC1saWJjOgotCXRhciB6Y3ZmIGludGwtZ2xpYmMudGFyLmd6ICQoQ09NU1JDUykgJChDT01IRFJTKSBsaWJpbnRsLmguZ2xpYmMKLQotTWFrZWZpbGU6IE1ha2VmaWxlLmluIC4uL2NvbmZpZy5zdGF0dXMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpLyRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUaGUgZGVwZW5kZW5jeSBmb3IgaW50bGguaW5zdCBpcyBkaWZmZXJlbnQgaW4gZ2V0dGV4dCBhbmQgYWxsIG90aGVyCi0jIHBhY2thZ2VzLiAgQmVjYXVzZSB3ZSBjYW5ub3QgeW91IEdOVSBtYWtlIGZlYXR1cmVzIHdlIGhhdmUgdG8gc29sdmUKLSMgdGhlIHByb2JsZW0gd2hpbGUgcmV3cml0aW5nIE1ha2VmaWxlLmluLgotQEdUX1lFU0BpbnRsaC5pbnN0OiBpbnRsaC5pbnN0LmluIC4uL2NvbmZpZy5zdGF0dXMKLUBHVF9ZRVNACWNkIC4uIFwKLUBHVF9ZRVNACSYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9IFwKLUBHVF9ZRVNACSAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi1AR1RfTk9ALlBIT05ZOiBpbnRsaC5pbnN0Ci1AR1RfTk9AaW50bGguaW5zdDoKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC9wbzJ0Ymwuc2VkLmluIGxyenN6LTAuMTIuMjAvaW50bC9wbzJ0Ymwuc2VkLmluCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvcG8ydGJsLnNlZC5pbgkxOTk4LTA0LTI2IDE0OjIwOjUyLjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9pbnRsL3BvMnRibC5zZWQuaW4JMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTAyICswLDAgQEAKLSMgcG8ydGJsLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gbG9va3VwIHRhYmxlIGZvciBjYXRnZXRzCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotMSB7Ci0gIGlcCi0vKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBwbzJ0Ymwuc2VkIGZyb20gQFBBQ0tBR0UgTkFNRUAucG90LiAgKi9cCi1cCi0jaWYgSEFWRV9DT05GSUdfSFwKLSMgaW5jbHVkZSA8Y29uZmlnLmg+XAotI2VuZGlmXAotXAotI2luY2x1ZGUgImxpYmdldHRleHQuaCJcCi1cCi1jb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV3JpdGUgbXNnaWQgZW50cmllcyBpbiBDIGFycmF5IGZvcm0uCi0jCi0vXm1zZ2lkLyB7Ci0gIHMvbXNnaWRbIAldKlwoIi4qIlwpLyAge1wxLwotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZQotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXCkiXChcblwpIlwoLioiXCkvXDFcMlwzLwotIyBZZXMsIHRoZW4gYnJhbmNoLgotICB0YQotIyBCZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBmaWxlIGNvcnJlY3RseSBmb3JtZWQgdGhlIGxpbmUKLSMganVzdCByZWFkIGNhbm5vdCBiZSBhZ2FpbiBiZSBhIG1zZ2lkIGxpbmUuICBTbyBpdCdzIHNhZmUgdG8gaWdub3JlCi0jIGl0LgotICBzL1woLipcKVxuLiovXDEvCi0gIGJjCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgRCBoZXJlLgotICBzLy4qXG5cKC4qXCkvXDEvCi0jIFNvbWUgYnVnZ3kgc2VkcyBkbyBub3QgY2xlYXIgdGhlIGBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBzaW5jZSBsYXN0IGBgdCcnJwotIyBmbGFnIG9uIGBOJywgc28gd2UgZG8gYSBgdCcgaGVyZSB0byBjbGVhciBpdC4KLSAgdGIKLSMgTm90IHJlYWNoZWQKLSAgOmMKLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSAgRwotICBzL1woLipcKVxuXChbMC05XSpcKS9cMSwgXDJ9LC8KLSAgcy9cKC4qXCkiJC9cMS8KLSAgcAotfQotIwotIyBMYXN0IGxpbmUuCi0jCi0kIHsKLSAgaVwKLX07XAotCi0gIGcKLSAgcy8wKlwoLipcKS9pbnQgX21zZ190YmxfbGVuZ3RoID0gXDE7L3AKLX0KLWQKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvdGV4dGRvbWFpbi5jIGxyenN6LTAuMTIuMjAvaW50bC90ZXh0ZG9tYWluLmMKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvaW50bC90ZXh0ZG9tYWluLmMJMTk5OC0wNC0yNiAxNDoyMjozNy4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC90ZXh0ZG9tYWluLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMTA2ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IHRleHQgZG9tYWluLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW107Ci0KLS8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgVEVYVERPTUFJTiBfX3RleHRkb21haW4KLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jZWxzZQotIyBkZWZpbmUgVEVYVERPTUFJTiB0ZXh0ZG9tYWluX18KLSNlbmRpZgotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWNoYXIgKgotVEVYVERPTUFJTiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgY2hhciAqb2xkOwotCi0gIC8qIEEgTlVMTCBwb2ludGVyIHJlcXVlc3RzIHRoZSBjdXJyZW50IHNldHRpbmcuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICBvbGQgPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBJZiBkb21haW4gbmFtZSBpcyB0aGUgbnVsbCBzdHJpbmcgc2V0IHRvIGRlZmF1bHQgZG9tYWluICJtZXNzYWdlcyIuICAqLwotICBpZiAoZG9tYWlubmFtZVswXSA9PSAnXDAnCi0gICAgICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKSA9PSAwKQotICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgZm9sbG93aW5nIG1hbGxvYyBmYWlscyBgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4nCi0JIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQotCSBhcmUgb3V0IG9mIGNvcmUuICAqLwotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBzdHJkdXAgKGRvbWFpbm5hbWUpOwotI2Vsc2UKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLSAgICAgIGNoYXIgKmNwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKGNwICE9IE5VTEwpCi0JbWVtY3B5IChjcCwgZG9tYWlubmFtZSwgbGVuKTsKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gY3A7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKG9sZCAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLSAgICBmcmVlIChvbGQpOwotCi0gIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fdGV4dGRvbWFpbiwgdGV4dGRvbWFpbik7Ci0jZW5kaWYKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwvVkVSU0lPTiBscnpzei0wLjEyLjIwL2ludGwvVkVSU0lPTgotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL1ZFUlNJT04JMTk5OC0wNC0yNiAxNDoyMjozNy4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC9WRVJTSU9OCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xICswLDAgQEAKLUdOVSBnZXR0ZXh0IGxpYnJhcnkgZnJvbSBnZXR0ZXh0LTAuMTAuMzIKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2ludGwveG9wZW4tbXNnLnNlZCBscnpzei0wLjEyLjIwL2ludGwveG9wZW4tbXNnLnNlZAotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9pbnRsL3hvcGVuLW1zZy5zZWQJMTk5OC0wNC0yNiAxNDoyMDo1Mi4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvaW50bC94b3Blbi1tc2cuc2VkCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDEwNCArMCwwIEBACi0jIHBvMm1zZy5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIFgvT3BlbiBzdHlsZSAubXNnIGZpbGUKLSMgQ29weXJpZ2h0IChDKSAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jCi0jIFRoZSBmaXJzdCBkaXJlY3RpdmUgaW4gdGhlIC5tc2cgc2hvdWxkIGJlIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotIyBtZXNzYWdlIHNldCBudW1iZXIuICBXZSB1c2UgYWx3YXlzIHNldCBudW1iZXIgMS4KLSMKLTEgewotICBpXAotJHNldCAxICMgQXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHBvMm1zZy5zZWQKLSAgaAotICBzLy4qLzAvCi0gIHgKLX0KLSMKLSMgV2UgY29weSBhbGwgY29tbWVudHMgaW50byB0aGUgLm1zZyBmaWxlLiAgUGVyaGFwcyB0aGV5IGNhbiBoZWxwLgotIwotL14jLyBzL14jWyAJXSovJCAvcAotIwotIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCi0jCi0vXm1zZ2lkLyB7Ci0jIERvZXMgbm90IHdvcmsgbm93Ci0jICAvIiQvISB7Ci0jICAgIHMvXFwkLy8KLSMgICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCi0jICB9Ci0gIHMvXm1zZ2lkWyAJXSoiXCguKlwpIiQvJCBPcmlnaW5hbCBNZXNzYWdlOiBcMS8KLSAgcAotfQotIwotIyBUaGUgLm1zZyBmaWxlIGNvbnRhaW5zLCBvdGhlciB0aGVuIHRoZSAucG8gZmlsZSwgb25seSB0aGUgdHJhbnNsYXRpb25zCi0jIGJ1dCBlYWNoIGdpdmVuIGEgdW5pcXVlIElELiAgU3RhcnRpbmcgZnJvbSAxIGFuZCBpbmNyZW1lbnRpbmcgYnkgMSBmb3IKLSMgZWFjaCBtZXNzYWdlIHdlIGFzc2lnbiB0aGVtIHRvIHRoZSBtZXNzYWdlcy4KLSMgSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIC5wbyBmaWxlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNhdC1pZC10YmwuYyBmaWxlCi0jICh3aXRoIHBvLXRvLXRibCkgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGhlcmUuICAoQXQgbGVhc3QgdGhlIG9yZGVyCi0jIG9mIGRlY2xhcmF0aW9ucyBtdXN0IG5vdCBiZSBjaGFuZ2VkLikKLSMKLS9ebXNnc3RyLyB7Ci0gIHMvbXNnc3RyWyAJXSoiXCguKlwpIi9cMS8KLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSMgQnJpbmcgdGhlIGxpbmUgaW4gdGhlIGZvcm1hdCBgPG51bWJlcj4gPG1lc3NhZ2U+JwotICBHCi0gIHMvXlteXG5dKiQvJiAvCi0gIHMvXCguKlwpXG5cKFswLTldKlwpL1wyIFwxLwotIyBDbGVhciBmbGFnIGZyb20gbGFzdCBzdWJzdGl0dXRpb24uCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBhIGNvbnRpbnVhdGlvbiBsaW5lLgotICBzL1woLipcblwpIlwoLipcKSIvXDFcMi8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSAgUAotICBECi0jIE5vdGUgdGhhdCBgRCcgaW5jbHVkZXMgYSBqdW1wIHRvIHRoZSBzdGFydCEhCi0jIFdlIGZvdW5kIGEgY29udGludWF0aW9uIGxpbmUuICBCdXQgYmVmb3JlIHByaW50aW5nIGluc2VydCAnXCcuCi0gIDphCi0gIHMvXCguKlwpXChcbi4qXCkvXDFcXFwyLwotICBQCi0jIFdlIGNhbm5vdCB1c2UgdGhlIHNlZCBjb21tYW5kIGBEJyBoZXJlCi0gIHMvLipcblwoLipcKS9cMS8KLSAgdGIKLX0KLWQKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL2xpYi9NYWtlZmlsZS5hbSBscnpzei0wLjEyLjIwL2xpYi9NYWtlZmlsZS5hbQotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9saWIvTWFrZWZpbGUuYW0JMTk5OC0xMi0yNyAxNjoyNToyNi4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvbGliL01ha2VmaWxlLmFtCTIwMTktMTEtMjUgMTY6MjI6MzQuMDAwMDAwMDAwICswMDAwCkBAIC0xLDYgKzEsNCBAQAogbm9pbnN0X0xJQlJBUklFUz1saWJ6bW9kZW0uYQotQ0ZMQUdTPUBDRkxBR1NACi1BVVRPTUFLRV9PUFRJT05TPWFuc2kya25yCiAKIEVYVFJBX0RJU1QgPSBhbGxvY2EuYyBhbnNpMmtuci4xIGFuc2kya25yLmMgXAogCWdldG9wdC5jIGdldG9wdDEuYyBta2Rpci5jIG1rdGltZS5jIFwKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL01ha2VmaWxlLmFtIGxyenN6LTAuMTIuMjAvTWFrZWZpbGUuYW0KLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvTWFrZWZpbGUuYW0JMTk5OC0xMi0zMCAxMToxOTo0MC4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvTWFrZWZpbGUuYW0JMjAxOS0xMS0yNiAxMTo0NzoyOS4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsNSArMSw1IEBACi1TVUJESVJTID0gbGliIGludGwgc3JjIHBvIG1hbiB0ZXN0c3VpdGUKLUVYVFJBX0RJU1QgPSBjaGVjay5scnpzeiBDT01QQVRBQklMSVRZIFJFQURNRS5jdnMgUkVBRE1FLmlzZG40bGludXggXAorU1VCRElSUyA9IGxpYiBzcmMgcG8gbWFuIHRlc3RzdWl0ZQorRVhUUkFfRElTVCA9IGNvbmZpZy5ycGF0aCBtNC9DaGFuZ2VMb2cgIGNoZWNrLmxyenN6IENPTVBBVEFCSUxJVFkgUkVBRE1FLmN2cyBSRUFETUUuaXNkbjRsaW51eCBcCiAJUkVBRE1FLmdldHRleHQgcnBtcmMgYnVpbGRycG0gc3lzdHlwZS5pbiBmYXN0Y2hlY2suc2ggUkVBRE1FLnRlc3RzIFwKIAliZW9zLXJ1bnBpcGVkLmMgZmFzdGNoZWNrLmJlb3MKIG5vaW5zdF9TQ1JJUFRTPXN5c3R5cGUKQEAgLTcsNyArNyw2IEBAIFBSPUBQQUNLQUdFQC1AVkVSU0lPTkAKIENMRUFOX0ZJTEVTPWZhc3RjaGVjay5kb25lCiAKIGRpc3QtaG9vazoKLQlta2RpciAkKGRpc3RkaXIpL2RlYmlhbgogCWNwIC1mYSAkKHNyY2RpcikvZGViaWFuL2NoYW5nZWxvZyAgJChkaXN0ZGlyKS9kZWJpYW4vCiAJY3AgLWZhICQoc3JjZGlyKS9kZWJpYW4vY29udHJvbCAgJChkaXN0ZGlyKS9kZWJpYW4vCiAJY3AgLWZhICQoc3JjZGlyKS9kZWJpYW4vY29weXJpZ2h0ICAkKGRpc3RkaXIpL2RlYmlhbi8KQEAgLTgzLDMgKzgyLDUgQEAgY3ZzLWRpc3Q6CiBycG06ICQoUFIpLnRhci5neiBTcGVjZmlsZQogCSQoc3JjZGlyKS9idWlsZHJwbSAkKHNyY2RpcikKIAorCitBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNApkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvcG8vY2F0LWlkLXRibC5jIGxyenN6LTAuMTIuMjAvcG8vY2F0LWlkLXRibC5jCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL3BvL2NhdC1pZC10YmwuYwkxOTk4LTEyLTI5IDA5OjI0OjI0LjAwMDAwMDAwMCArMDAwMAorKysgbHJ6c3otMC4xMi4yMC9wby9jYXQtaWQtdGJsLmMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKQEAgLTEsMjM0ICswLDAgQEAKLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHBvMnRibC5zZWQgZnJvbSBscnpzei5wb3QuICAqLwotCi0jaWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi1jb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXSA9IHsKLSAgeyIiLCAxfSwKLSAgeyJpb19tb2RlKCwyKSBpbiByYnNiLmMgbm90IGltcGxlbWVudGVkXG4iLCAyfSwKLSAgeyJjYXVnaHQgc2lnbmFsICVkOyBleGl0aW5nIiwgM30sCi0gIHsiY29tbWFuZCB0cmllcyIsIDR9LAotICB7InBhY2tldGxlbmd0aCIsIDV9LAotICB7InBhY2tldGxlbmd0aCBvdXQgb2YgcmFuZ2UgMjQuLiVsZCIsIDZ9LAotICB7ImZyYW1lbGVuZ3RoIiwgN30sCi0gIHsiZnJhbWVsZW5ndGggb3V0IG9mIHJhbmdlIDMyLi4lbGQiLCA4fSwKLSAgeyJtaW5fYnBzIiwgOX0sCi0gIHsibWluX2JwcyBtdXN0IGJlID49IDAiLCAxMH0sCi0gIHsibWluX2Jwc190aW1lIiwgMTF9LAotICB7Im1pbl9icHNfdGltZSBtdXN0IGJlID4gMSIsIDEyfSwKLSAgeyJob3VyIHRvIGxhcmdlICgwLi4yMykiLCAxM30sCi0gIHsidW5wYXJzYWJsZSBzdG9wIHRpbWVcbiIsIDE0fSwKLSAgeyJtaW51dGUgdG8gbGFyZ2UgKDAuLjU5KSIsIDE1fSwKLSAgeyJzdG9wIHRpbWUgdG8gc21hbGwiLCAxNn0sCi0gIHsic3RvcC1hdCIsIDE3fSwKLSAgeyJ0aW1lb3V0IiwgMTh9LAotICB7InRpbWVvdXQgb3V0IG9mIHJhbmdlIDEwLi4xMDAwIiwgMTl9LAotICB7InNlY3VyaXR5IHZpb2xhdGlvbjogY2FuJ3QgZG8gdGhhdCB1bmRlciByZXN0cmljdGVkIHNoZWxsXG4iLCAyMH0sCi0gIHsid2luZG93IHNpemUiLCAyMX0sCi0gIHsiY2Fubm90IHR1cm5vZmYgc3lzbG9nIiwgMjJ9LAotICB7InN0YXJ0dXAgZGVsYXkiLCAyM30sCi0gIHsib3V0IG9mIG1lbW9yeSIsIDI0fSwKLSAgeyJ0aGlzIHByb2dyYW0gd2FzIG5ldmVyIGludGVuZGVkIHRvIGJlIHVzZWQgc2V0dWlkXG4iLCAyNX0sCi0gIHsibmVlZCBhdCBsZWFzdCBvbmUgZmlsZSB0byBzZW5kIiwgMjZ9LAotICB7IkNhbid0IHNlbmQgY29tbWFuZCBpbiByZXN0cmljdGVkIG1vZGVcbiIsIDI3fSwKLSAgeyJob3N0bmFtZSB0b28gbG9uZ1xuIiwgMjh9LAotICB7ImlsbGVnYWwgc2VydmVyIGFkZHJlc3NcbiIsIDI5fSwKLSAgeyJjYW4gcmVhZCBvbmx5IG9uZSBmaWxlIGZyb20gc3RkaW4iLCAzMH0sCi0gIHsiVHJhbnNmZXIgaW5jb21wbGV0ZVxuIiwgMzF9LAotICB7IlRyYW5zZmVyIGNvbXBsZXRlXG4iLCAzMn0sCi0gIHsic2VuZF9wc2V1ZG8gJXM6IGNhbm5vdCBvcGVuIHRtcGZpbGUgJXM6ICVzIiwgMzN9LAotICB7InNlbmRfcHNldWRvICVzOiBjYW5ub3QgbHN0YXQgdG1wZmlsZSAlczogJXMiLCAzNH0sCi0gIHsic2VuZF9wc2V1ZG8gJXM6IGF2b2lkaW5nIHN5bWxpbmsgdHJhcCIsIDM1fSwKLSAgeyJzZW5kX3BzZXVkbyAlczogY2Fubm90IHdyaXRlIHRvIHRtcGZpbGUgJXM6ICVzIiwgMzZ9LAotICB7InNlbmRfcHNldWRvICVzOiBmYWlsZWQiLCAzN30sCi0gIHsic2VuZF9wc2V1ZG8gJXM6IG9rIiwgMzh9LAotICB7InRjcCBwcm90b2NvbCBpbml0IGZhaWxlZFxuIiwgMzl9LAotICB7IkFuc3dlcmluZyBUSU1FU1lOQyBhdCAlcyIsIDQwfSwKLSAgeyJ0aW1lem9uZSIsIDQxfSwKLSAgeyJ0aW1lem9uZSB1bmtub3duIiwgNDJ9LAotICB7IkNhbid0IG9wZW4gYW55IHJlcXVlc3RlZCBmaWxlcy4iLCA0M30sCi0gIHsic2VjdXJpdHkgdmlvbGF0aW9uOiBub3QgYWxsb3dlZCB0byB1cGxvYWQgZnJvbSAlcyIsIDQ0fSwKLSAgeyJjYW5ub3Qgb3BlbiAlcyIsIDQ1fSwKLSAgeyJpcyBub3QgYSBmaWxlOiAlcyIsIDQ2fSwKLSAgeyIlcy8lczogZXJyb3Igb2NjdXJlZCIsIDQ3fSwKLSAgeyJza2lwcGVkOiAlcyIsIDQ4fSwKLSAgeyIlcy8lczogc2tpcHBlZCIsIDQ5fSwKLSAgeyJCeXRlcyBTZW50OiU3bGQgICBCUFM6JS04bGQgICAgICAgICAgICAgICAgICAgICAgICBcbiIsIDUwfSwKLSAgeyJTZW5kaW5nICVzLCAlbGQgYmxvY2tzOiAiLCA1MX0sCi0gIHsiR2l2ZSB5b3VyIGxvY2FsIFhNT0RFTSByZWNlaXZlIGNvbW1hbmQgbm93LiIsIDUyfSwKLSAgeyJTZW5kaW5nOiAlc1xuIiwgNTN9LAotICB7IlRpbWVvdXQgb24gcGF0aG5hbWUiLCA1NH0sCi0gIHsiUmVjZWl2ZXIgQ2FuY2VsbGVkIiwgNTV9LAotICB7Ik5vIEFDSyBvbiBFT1QiLCA1Nn0sCi0gIHsiWG1vZGVtIHNlY3RvcnMva2J5dGVzIHNlbnQ6ICUzZC8lMmRrIiwgNTd9LAotICB7Illtb2RlbSBzZWN0b3JzL2tieXRlcyBzZW50OiAlM2QvJTJkayIsIDU4fSwKLSAgeyJDYW5jZWxsZWQiLCA1OX0sCi0gIHsiVGltZW91dCBvbiBzZWN0b3IgQUNLIiwgNjB9LAotICB7Ik5BSyBvbiBzZWN0b3IiLCA2MX0sCi0gIHsiR290IGJ1cnN0IGZvciBzZWN0b3IgQUNLIiwgNjJ9LAotICB7IkdvdCAlMDJ4IGZvciBzZWN0b3IgQUNLIiwgNjN9LAotICB7IlJldHJ5IENvdW50IEV4Y2VlZGVkIiwgNjR9LAotICB7IlRyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIsIDY1fSwKLSAgeyIlcyB2ZXJzaW9uICVzXG4iLCA2Nn0sCi0gIHsiVXNhZ2U6ICVzIFtvcHRpb25zXSBmaWxlIC4uLlxuIiwgNjd9LAotICB7IiAgIG9yOiAlcyBbb3B0aW9uc10gLXtjfGl9IENPTU1BTkRcbiIsIDY4fSwKLSAgeyJTZW5kIGZpbGUocykgd2l0aCBaTU9ERU0vWU1PREVNL1hNT0RFTSBwcm90b2NvbFxuIiwgNjl9LAotICB7IlwKLSAgICAoWCkgPSBvcHRpb24gYXBwbGllcyB0byBYTU9ERU0gb25seVxuXAotICAgIChZKSA9IG9wdGlvbiBhcHBsaWVzIHRvIFlNT0RFTSBvbmx5XG5cCi0gICAgKFopID0gb3B0aW9uIGFwcGxpZXMgdG8gWk1PREVNIG9ubHlcbiIsIDcwfSwKLSAgeyJcCi0gIC0rLCAtLWFwcGVuZCAgICAgICAgICAgICAgICBhcHBlbmQgdG8gZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSAoWilcblwKLSAgLTIsIC0tdHdvc3RvcCAgICAgICAgICAgICAgIHVzZSAyIHN0b3AgYml0c1xuXAotICAtNCwgLS10cnktNGsgICAgICAgICAgICAgICAgZ28gdXAgdG8gNEsgYmxvY2tzaXplXG5cCi0gICAgICAtLXN0YXJ0LTRrICAgICAgICAgICAgICBzdGFydCB3aXRoIDRLIGJsb2Nrc2l6ZSAoZG9lc24ndCB0cnkgOClcblwKLSAgLTgsIC0tdHJ5LThrICAgICAgICAgICAgICAgIGdvIHVwIHRvIDhLIGJsb2Nrc2l6ZVxuXAotICAgICAgLS1zdGFydC04ayAgICAgICAgICAgICAgc3RhcnQgd2l0aCA4SyBibG9ja3NpemVcblwKLSAgLWEsIC0tYXNjaWkgICAgICAgICAgICAgICAgIEFTQ0lJIHRyYW5zZmVyIChjaGFuZ2UgQ1IvTEYgdG8gTEYpXG5cCi0gIC1iLCAtLWJpbmFyeSAgICAgICAgICAgICAgICBiaW5hcnkgdHJhbnNmZXJcblwKLSAgLUIsIC0tYnVmc2l6ZSBOICAgICAgICAgICAgIGJ1ZmZlciBOIGJ5dGVzIChOPT1hdXRvOiBidWZmZXIgd2hvbGUgZmlsZSlcblwKLSAgLWMsIC0tY29tbWFuZCBDT01NQU5EICAgICAgIGV4ZWN1dGUgcmVtb3RlIGNvbW1hbmQgQ09NTUFORCAoWilcblwKLSAgLUMsIC0tY29tbWFuZC10cmllcyBOICAgICAgIHRyeSBOIHRpbWVzIHRvIGV4ZWN1dGUgYSBjb21tYW5kIChaKVxuXAotICAtZCwgLS1kb3QtdG8tc2xhc2ggICAgICAgICAgY2hhbmdlICcuJyB0byAnLycgaW4gcGF0aG5hbWVzIChZL1opXG5cCi0gICAgICAtLWRlbGF5LXN0YXJ0dXAgTiAgICAgICBzbGVlcCBOIHNlY29uZHMgYmVmb3JlIGRvaW5nIGFueXRoaW5nXG5cCi0gIC1lLCAtLWVzY2FwZSAgICAgICAgICAgICAgICBlc2NhcGUgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyAoWilcblwKLSAgLUUsIC0tcmVuYW1lICAgICAgICAgICAgICAgIGZvcmNlIHJlY2VpdmVyIHRvIHJlbmFtZSBmaWxlcyBpdCBhbHJlYWR5IGhhc1xuXAotICAtZiwgLS1mdWxsLXBhdGggICAgICAgICAgICAgc2VuZCBmdWxsIHBhdGhuYW1lIChZL1opXG5cCi0gIC1pLCAtLWltbWVkaWF0ZS1jb21tYW5kIENNRCBzZW5kIHJlbW90ZSBDTUQsIHJldHVybiBpbW1lZGlhdGVseSAoWilcblwKLSAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZVxuXAotICAtaywgLS0xayAgICAgICAgICAgICAgICAgICAgc2VuZCAxMDI0IGJ5dGUgcGFja2V0cyAoWClcblwKLSAgLUwsIC0tcGFja2V0bGVuIE4gICAgICAgICAgIGxpbWl0IHN1YnBhY2tldCBsZW5ndGggdG8gTiBieXRlcyAoWilcblwKLSAgLWwsIC0tZnJhbWVsZW4gTiAgICAgICAgICAgIGxpbWl0IGZyYW1lIGxlbmd0aCB0byBOIGJ5dGVzIChsPj1MKSAoWilcblwKLSAgLW0sIC0tbWluLWJwcyBOICAgICAgICAgICAgIHN0b3AgdHJhbnNtaXNzaW9uIGlmIEJQUyBiZWxvdyBOXG5cCi0gIC1NLCAtLW1pbi1icHMtdGltZSBOICAgICAgICAgIGZvciBhdCBsZWFzdCBOIHNlY29uZHMgKGRlZmF1bHQ6IDEyMClcbiIsIDcxfSwKLSAgeyJcCi0gIC1uLCAtLW5ld2VyICAgICAgICAgICAgICAgICBzZW5kIGZpbGUgaWYgc291cmNlIG5ld2VyIChaKVxuXAotICAtTiwgLS1uZXdlci1vci1sb25nZXIgICAgICAgc2VuZCBmaWxlIGlmIHNvdXJjZSBuZXdlciBvciBsb25nZXIgKFopXG5cCi0gIC1vLCAtLTE2LWJpdC1jcmMgICAgICAgICAgICB1c2UgMTYgYml0IENSQyBpbnN0ZWFkIG9mIDMyIGJpdCBDUkMgKFopXG5cCi0gIC1PLCAtLWRpc2FibGUtdGltZW91dHMgICAgICBkaXNhYmxlIHRpbWVvdXQgY29kZSwgd2FpdCBmb3JldmVyXG5cCi0gIC1wLCAtLXByb3RlY3QgICAgICAgICAgICAgICBwcm90ZWN0IGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUgKFopXG5cCi0gIC1yLCAtLXJlc3VtZSAgICAgICAgICAgICAgICByZXN1bWUgaW50ZXJydXB0ZWQgZmlsZSB0cmFuc2ZlciAoWilcblwKLSAgLVIsIC0tcmVzdHJpY3RlZCAgICAgICAgICAgIHJlc3RyaWN0ZWQsIG1vcmUgc2VjdXJlIG1vZGVcblwKLSAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgIHF1aWV0IChubyBwcm9ncmVzcyByZXBvcnRzKVxuXAotICAtcywgLS1zdG9wLWF0IHtISDpNTXwrTn0gICAgc3RvcCB0cmFuc21pc3Npb24gYXQgSEg6TU0gb3IgaW4gTiBzZWNvbmRzXG5cCi0gICAgICAtLXRjcCAgICAgICAgICAgICAgICAgICBidWlsZCBhIFRDUCBjb25uZWN0aW9uIHRvIHRyYW5zbWl0IGZpbGVzXG5cCi0gICAgICAtLXRjcC1zZXJ2ZXIgICAgICAgICAgICBvcGVuIHNvY2tldCwgd2FpdCBmb3IgY29ubmVjdGlvblxuXAotICAtdSwgLS11bmxpbmsgICAgICAgICAgICAgICAgdW5saW5rIGZpbGUgYWZ0ZXIgdHJhbnNtaXNzaW9uXG5cCi0gIC1VLCAtLXVucmVzdHJpY3QgICAgICAgICAgICB0dXJuIG9mZiByZXN0cmljdGVkIG1vZGUgKGlmIGFsbG93ZWQgdG8pXG5cCi0gIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICBiZSB2ZXJib3NlLCBwcm92aWRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuXAotICAtdywgLS13aW5kb3dzaXplIE4gICAgICAgICAgV2luZG93IGlzIE4gYnl0ZXMgKFopXG5cCi0gIC1YLCAtLXhtb2RlbSAgICAgICAgICAgICAgICB1c2UgWE1PREVNIHByb3RvY29sXG5cCi0gIC15LCAtLW92ZXJ3cml0ZSAgICAgICAgICAgICBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXNcblwKLSAgLVksIC0tb3ZlcndyaXRlLW9yLXNraXAgICAgIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcywgZWxzZSBza2lwXG5cCi0gICAgICAtLXltb2RlbSAgICAgICAgICAgICAgICB1c2UgWU1PREVNIHByb3RvY29sXG5cCi0gIC1aLCAtLXptb2RlbSAgICAgICAgICAgICAgICB1c2UgWk1PREVNIHByb3RvY29sXG5cCi1cblwKLXNob3J0IG9wdGlvbnMgdXNlIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUgbG9uZyBvbmVzXG4iLCA3Mn0sCi0gIHsiZ290IFpSUUlOSVQiLCA3M30sCi0gIHsiZ290IFpDQU4iLCA3NH0sCi0gIHsiYmxrbGVuIG5vdyAlZFxuIiwgNzV9LAotICB7InpzZW5kZmRhdGE6IGJwcyByYXRlICVsZCBiZWxvdyBtaW4gJWxkIiwgNzZ9LAotICB7InpzZW5kZmRhdGE6IHJlYWNoZWQgc3RvcCB0aW1lIiwgNzd9LAotICB7IkJ5dGVzIFNlbnQ6JTdsZC8lN2xkICAgQlBTOiUtOGxkIEVUQSAlMDJkOiUwMmQgICIsIDc4fSwKLSAgeyJjYWxjX2Jsa2xlbjogcmVkdWNlZCB0byAlZCBkdWUgdG8gZXJyb3JcbiIsIDc5fSwKLSAgeyJjYWxjX2Jsa2xlbjogcmV0dXJuZWQgb2xkIHZhbHVlICVkIGR1ZSB0byBsb3cgYnBlIGRpZmZcbiIsIDgwfSwKLSAgeyJjYWxjX2Jsa2xlbjogb2xkICVsZCwgbmV3ICVsZCwgZCAlbGRcbiIsIDgxfSwKLSAgeyJjYWxjX2Jsa2xlbjogY2FsYyB0b3RhbF9ieXRlcz0lbGQsIGJwZT0lbGQsIGVjPSVsZFxuIiwgODJ9LAotICB7ImNhbGNfYmxrbGVuOiBibGtsZW4gJWQsIG9rICVsZCwgZmFpbGVkICVsZCAtPiAlbHVcbiIsIDgzfSwKLSAgeyJjYWxjX2Jsa2xlbjogcmV0dXJuZWQgJWQgYXMgYmVzdFxuIiwgODR9LAotICB7IlwKLVxuXAotY291bnRlbTogVG90YWwgJWQgJWxkXG4iLCA4NX0sCi0gIHsiQmFkIGVzY2FwZSBzZXF1ZW5jZSAleCIsIDg2fSwKLSAgeyJTZW5kZXIgQ2FuY2VsZWQiLCA4N30sCi0gIHsiVElNRU9VVCIsIDg4fSwKLSAgeyJCYWQgZGF0YSBzdWJwYWNrZXQiLCA4OX0sCi0gIHsiRGF0YSBzdWJwYWNrZXQgdG9vIGxvbmciLCA5MH0sCi0gIHsiR2FyYmFnZSBjb3VudCBleGNlZWRlZCIsIDkxfSwKLSAgeyJHb3QgJXMiLCA5Mn0sCi0gIHsiUmV0cnkgJWQ6ICIsIDkzfSwKLSAgeyJkb24ndCBoYXZlIHNldHRpbWVvZmRheSwgd2lsbCBub3Qgc2V0IHRpbWVcbiIsIDk0fSwKLSAgeyJub3QgcnVubmluZyBhcyByb290ICh0aGlzIGlzIGdvb2QhKSwgY2FuIG5vdCBzZXQgdGltZVxuIiwgOTV9LAotICB7ImJ5dGVzX3Blcl9lcnJvciIsIDk2fSwKLSAgeyJieXRlcy1wZXItZXJyb3Igc2hvdWxkIGJlID4xMDAiLCA5N30sCi0gIHsiT19TWU5DIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCIsIDk4fSwKLSAgeyJnYXJiYWdlIG9uIGNvbW1hbmRsaW5lIiwgOTl9LAotICB7IlVzYWdlOiAlcyBbb3B0aW9uc10gW2ZpbGVuYW1lLmlmLnhtb2RlbV1cbiIsIDEwMH0sCi0gIHsiUmVjZWl2ZSBmaWxlcyB3aXRoIFpNT0RFTS9ZTU9ERU0vWE1PREVNIHByb3RvY29sXG4iLCAxMDF9LAotICB7IlwKLSAgLSssIC0tYXBwZW5kICAgICAgICAgICAgICAgIGFwcGVuZCB0byBleGlzdGluZyBmaWxlc1xuXAotICAtYSwgLS1hc2NpaSAgICAgICAgICAgICAgICAgQVNDSUkgdHJhbnNmZXIgKGNoYW5nZSBDUi9MRiB0byBMRilcblwKLSAgLWIsIC0tYmluYXJ5ICAgICAgICAgICAgICAgIGJpbmFyeSB0cmFuc2ZlclxuXAotICAtQiwgLS1idWZzaXplIE4gICAgICAgICAgICAgYnVmZmVyIE4gYnl0ZXMgKE49PWF1dG86IGJ1ZmZlciB3aG9sZSBmaWxlKVxuXAotICAtYywgLS13aXRoLWNyYyAgICAgICAgICAgICAgVXNlIDE2IGJpdCBDUkMgKFgpXG5cCi0gIC1DLCAtLWFsbG93LXJlbW90ZS1jb21tYW5kcyBhbGxvdyBleGVjdXRpb24gb2YgcmVtb3RlIGNvbW1hbmRzIChaKVxuXAotICAtRCwgLS1udWxsICAgICAgICAgICAgICAgICAgd3JpdGUgYWxsIHJlY2VpdmVkIGRhdGEgdG8gL2Rldi9udWxsXG5cCi0gICAgICAtLWRlbGF5LXN0YXJ0dXAgTiAgICAgICBzbGVlcCBOIHNlY29uZHMgYmVmb3JlIGRvaW5nIGFueXRoaW5nXG5cCi0gIC1lLCAtLWVzY2FwZSAgICAgICAgICAgICAgICBFc2NhcGUgY29udHJvbCBjaGFyYWN0ZXJzIChaKVxuXAotICAtRSwgLS1yZW5hbWUgICAgICAgICAgICAgICAgcmVuYW1lIGFueSBmaWxlcyBhbHJlYWR5IGV4aXN0aW5nXG5cCi0gICAgICAtLWVycm9ycyBOICAgICAgICAgICAgICBnZW5lcmF0ZSBDUkMgZXJyb3IgZXZlcnkgTiBieXRlcyAoZGVidWdnaW5nKVxuXAotICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgICAgSGVscCwgcHJpbnQgdGhpcyB1c2FnZSBtZXNzYWdlXG5cCi0gIC1tLCAtLW1pbi1icHMgTiAgICAgICAgICAgICBzdG9wIHRyYW5zbWlzc2lvbiBpZiBCUFMgYmVsb3cgTlxuXAotICAtTSwgLS1taW4tYnBzLXRpbWUgTiAgICAgICAgICBmb3IgYXQgbGVhc3QgTiBzZWNvbmRzIChkZWZhdWx0OiAxMjApXG5cCi0gIC1PLCAtLWRpc2FibGUtdGltZW91dHMgICAgICBkaXNhYmxlIHRpbWVvdXQgY29kZSwgd2FpdCBmb3JldmVyIGZvciBkYXRhXG5cCi0gICAgICAtLW8tc3luYyAgICAgICAgICAgICAgICBvcGVuIG91dHB1dCBmaWxlKHMpIGluIHN5bmNocm9ub3VzIHdyaXRlIG1vZGVcblwKLSAgLXAsIC0tcHJvdGVjdCAgICAgICAgICAgICAgIHByb3RlY3QgZXhpc3RpbmcgZmlsZXNcblwKLSAgLXEsIC0tcXVpZXQgICAgICAgICAgICAgICAgIHF1aWV0LCBubyBwcm9ncmVzcyByZXBvcnRzXG5cCi0gIC1yLCAtLXJlc3VtZSAgICAgICAgICAgICAgICB0cnkgdG8gcmVzdW1lIGludGVycnVwdGVkIGZpbGUgdHJhbnNmZXIgKFopXG5cCi0gIC1SLCAtLXJlc3RyaWN0ZWQgICAgICAgICAgICByZXN0cmljdGVkLCBtb3JlIHNlY3VyZSBtb2RlXG5cCi0gIC1zLCAtLXN0b3AtYXQge0hIOk1NfCtOfSAgICBzdG9wIHRyYW5zbWlzc2lvbiBhdCBISDpNTSBvciBpbiBOIHNlY29uZHNcblwKLSAgLVMsIC0tdGltZXN5bmMgICAgICAgICAgICAgIHJlcXVlc3QgcmVtb3RlIHRpbWUgKHR3aWNlOiBzZXQgbG9jYWwgdGltZSlcblwKLSAgICAgIC0tc3lzbG9nWz1vZmZdICAgICAgICAgIHR1cm4gc3lzbG9nIG9uIG9yIG9mZiwgaWYgcG9zc2libGVcblwKLSAgLXQsIC0tdGltZW91dCBOICAgICAgICAgICAgIHNldCB0aW1lb3V0IHRvIE4gdGVudGhzIG9mIGEgc2Vjb25kXG5cCi0gIC11LCAtLWtlZXAtdXBwZXJjYXNlICAgICAgICBrZWVwIHVwcGVyIGNhc2UgZmlsZW5hbWVzXG5cCi0gIC1VLCAtLXVucmVzdHJpY3QgICAgICAgICAgICBkaXNhYmxlIHJlc3RyaWN0ZWQgbW9kZSAoaWYgYWxsb3dlZCB0bylcblwKLSAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgIGJlIHZlcmJvc2UsIHByb3ZpZGUgZGVidWdnaW5nIGluZm9ybWF0aW9uXG5cCi0gIC13LCAtLXdpbmRvd3NpemUgTiAgICAgICAgICBXaW5kb3cgaXMgTiBieXRlcyAoWilcblwKLSAgLVggIC0teG1vZGVtICAgICAgICAgICAgICAgIHVzZSBYTU9ERU0gcHJvdG9jb2xcblwKLSAgLXksIC0tb3ZlcndyaXRlICAgICAgICAgICAgIFllcywgY2xvYmJlciBleGlzdGluZyBmaWxlIGlmIGFueVxuXAotICAgICAgLS15bW9kZW0gICAgICAgICAgICAgICAgdXNlIFlNT0RFTSBwcm90b2NvbFxuXAotICAtWiwgLS16bW9kZW0gICAgICAgICAgICAgICAgdXNlIFpNT0RFTSBwcm90b2NvbFxuXAotXG5cCi1zaG9ydCBvcHRpb25zIHVzZSB0aGUgc2FtZSBhcmd1bWVudHMgYXMgdGhlIGxvbmcgb25lc1xuIiwgMTAyfSwKLSAgeyIlcyB3YWl0aW5nIHRvIHJlY2VpdmUuIiwgMTAzfSwKLSAgeyJcckJ5dGVzIHJlY2VpdmVkOiAlN2xkLyU3bGQgICBCUFM6JS02bGQgICAgICAgICAgICAgICAgXHJcbiIsIDEwNH0sCi0gIHsiJXM6IHJlYWR5IHRvIHJlY2VpdmUgJXMiLCAxMDV9LAotICB7IlxyQnl0ZXMgcmVjZWl2ZWQ6ICU3bGQgICBCUFM6JS02bGQgICAgICAgICAgICAgICAgXHJcbiIsIDEwNn0sCi0gIHsiXAotXHJcblwKLSVzOiAlcyByZW1vdmVkLlxyXG4iLCAxMDd9LAotICB7IlBhdGhuYW1lIGZldGNoIHJldHVybmVkIEVPVCIsIDEwOH0sCi0gIHsiUmVjZWl2ZWQgZHVwIFNlY3RvciIsIDEwOX0sCi0gIHsiU3luYyBFcnJvciIsIDExMH0sCi0gIHsiQ1JDIiwgMTExfSwKLSAgeyJDaGVja3N1bSIsIDExMn0sCi0gIHsiU2VjdG9yIG51bWJlciBnYXJibGVkIiwgMTEzfSwKLSAgeyJTZW5kZXIgQ2FuY2VsbGVkIiwgMTE0fSwKLSAgeyJHb3QgMCVvIHNlY3RvciBoZWFkZXIiLCAxMTV9LAotICB7ImZpbGUgbmFtZSBlbmRzIHdpdGggYSAvLCBza2lwcGVkOiAlc1xuIiwgMTE2fSwKLSAgeyJ6bWFuYWc9JWQsIEx6bWFuYWc9JWRcbiIsIDExN30sCi0gIHsiemNvbnY9JWRcbiIsIDExOH0sCi0gIHsiZmlsZSBleGlzdHMsIHNraXBwZWQ6ICVzXG4iLCAxMTl9LAotICB7IlRJTUVTWU5DOiBoZXJlICVsZCwgcmVtb3RlICVsZCwgZGlmZiAlbGQgc2Vjb25kc1xuIiwgMTIwfSwKLSAgeyJUSU1FU1lOQzogY2Fubm90IHNldCB0aW1lOiAlc1xuIiwgMTIxfSwKLSAgeyJjYW5ub3QgdG1wZmlsZSgpIGZvciB0Y3AgcHJvdG9jb2wgc3luY2hyb25pemF0aW9uIiwgMTIyfSwKLSAgeyJUb3BpcGUiLCAxMjN9LAotICB7IlJlY2VpdmluZzogJXNcbiIsIDEyNH0sCi0gIHsiQmxvY2tzIHJlY2VpdmVkOiAlZCIsIDEyNX0sCi0gIHsiJXM6ICVzIGV4aXN0c1xuIiwgMTI2fSwKLSAgeyIlczpcdFNlY3VyaXR5IFZpb2xhdGlvbiIsIDEyN30sCi0gIHsicmVtb3RlIGNvbW1hbmQgZXhlY3V0aW9uIHJlcXVlc3RlZCIsIDEyOH0sCi0gIHsibm90IGV4ZWN1dGVkIiwgMTI5fSwKLSAgeyJnb3QgWlJJTklUIiwgMTMwfSwKLSAgeyJTa2lwcGVkIiwgMTMxfSwKLSAgeyJyemZpbGU6IGJwcyByYXRlICVsZCBiZWxvdyBtaW4gJWxkIiwgMTMyfSwKLSAgeyJyemZpbGU6IHJlYWNoZWQgc3RvcCB0aW1lIiwgMTMzfSwKLSAgeyJcckJ5dGVzIHJlY2VpdmVkOiAlN2xkLyU3bGQgICBCUFM6JS02bGQgRVRBICUwMmQ6JTAyZCAgIiwgMTM0fSwKLSAgeyJmZ2V0cyBmb3IgdGNwIHByb3RvY29sIHN5bmNocm9uaXphdGlvbiBmYWlsZWQ6ICIsIDEzNX0sCi0gIHsiZmlsZSBjbG9zZSBlcnJvciIsIDEzNn0sCi19OwotCi1pbnQgX21zZ190YmxfbGVuZ3RoID0gMTM2OwpCaW5hcnkgZmlsZXMgY2xlYW4vbHJ6c3otMC4xMi4yMC9wby9kZS5nbW8gYW5kIGxyenN6LTAuMTIuMjAvcG8vZGUuZ21vIGRpZmZlcgpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvcG8vZGUucG8gbHJ6c3otMC4xMi4yMC9wby9kZS5wbwotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9wby9kZS5wbwkxOTk4LTEyLTMwIDE2OjMxOjQ2LjAwMDAwMDAwMCArMDAwMAorKysgbHJ6c3otMC4xMi4yMC9wby9kZS5wbwkyMDE5LTExLTI2IDExOjQyOjA3LjAwMDAwMDAwMCArMDAwMApAQCAtNiwxMCArNiwxMiBAQAogbXNnaWQgIiIKIG1zZ3N0ciAiIgogIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTgtMTItMzAgMDg6NDkrMDEwMFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxOS0xMS0yNiAxMTozOSswMDAwXG4iCiAiUE8tUmV2aXNpb24tRGF0ZTogMTk5Ny0wNi0wMSAxOTowMCswMjAwXG4iCiAiTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPHV3ZUBvaHNlLmRlPlxuIgogIkxhbmd1YWdlLVRlYW06IG5vbmUuIHRyeSA8dXdlQG9oc2UuZGU+XG4iCisiTGFuZ3VhZ2U6IGRlXG4iCiAiTUlNRS1WZXJzaW9uOiAxLjBcbiIKICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMVxuIgogIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKQEAgLTE4LDcgKzIwLDcgQEAgbXNnc3RyICIiCiBtc2dpZCAiaW9fbW9kZSgsMikgaW4gcmJzYi5jIG5vdCBpbXBsZW1lbnRlZFxuIgogbXNnc3RyICJpb19tb2RlKDIpIGluIHJic2IuYyBuaWNodCBpbXBsZW1lbnRpZXJ0XG4iCiAKLSM6IHNyYy9scnouYzoyMDEgc3JjL2xzei5jOjIzMAorIzogc3JjL2xzei5jOjIzMCBzcmMvbHJ6LmM6MjAxCiAjLCBjLWZvcm1hdAogbXNnaWQgImNhdWdodCBzaWduYWwgJWQ7IGV4aXRpbmciCiBtc2dzdHIgImVyaGllbHQgU2lnbmFsICVkOyBQcm9ncmFtbWFiYnJ1Y2giCkBAIC00NSw3ICs0Nyw3IEBAIG1zZ3N0ciAiRnJhbWVs5G5nZSIKIG1zZ2lkICJmcmFtZWxlbmd0aCBvdXQgb2YgcmFuZ2UgMzIuLiVsZCIKIG1zZ3N0ciAiQXJndW1lbnQgZGVyIE9wdGlvbiBsIGF132VyaGFsYiBkZXMgQmVyZWljaHMgMzIuLiVsZCIKIAotIzogc3JjL2xyei5jOjMyMyBzcmMvbHN6LmM6NDUwCisjOiBzcmMvbHN6LmM6NDUwIHNyYy9scnouYzozMjMKIG1zZ2lkICJtaW5fYnBzIgogbXNnc3RyICJtaW5pbWFsZSBCUFMtUmF0ZSIKIApAQCAtNTMsNjUgKzU1LDY1IEBAIG1zZ3N0ciAibWluaW1hbGUgQlBTLVJhdGUiCiBtc2dpZCAibWluX2JwcyBtdXN0IGJlID49IDAiCiBtc2dzdHIgIm1pbmltYWxlIEJQUy1SYXRlIG113yA+PSAwIHNlaW4iCiAKLSM6IHNyYy9scnouYzozMjkgc3JjL2xzei5jOjQ1OAorIzogc3JjL2xzei5jOjQ1OCBzcmMvbHJ6LmM6MzI5CiBtc2dpZCAibWluX2Jwc190aW1lIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozMzEgc3JjL2xzei5jOjQ2MAorIzogc3JjL2xzei5jOjQ2MCBzcmMvbHJ6LmM6MzMxCiBtc2dpZCAibWluX2Jwc190aW1lIG11c3QgYmUgPiAxIgogbXNnc3RyICJaZWl0ZmVuc3RlciBm/HIgbWluaW1hbGUgQlBTLVJhdGUgbXXfID4gMSBTZWt1bmRlIHNlaW4iCiAKLSM6IHNyYy9scnouYzozNDcgc3JjL2xzei5jOjQ4NAorIzogc3JjL2xzei5jOjQ4NCBzcmMvbHJ6LmM6MzQ3CiBtc2dpZCAiaG91ciB0byBsYXJnZSAoMC4uMjMpIgogbXNnc3RyICJTdHVuZGUgenUgZ3Jvc3MgKDAuLjIzKSIKIAotIzogc3JjL2xyei5jOjM0OSBzcmMvbHN6LmM6NDg2CisjOiBzcmMvbHN6LmM6NDg2IHNyYy9scnouYzozNDkKIG1zZ2lkICJ1bnBhcnNhYmxlIHN0b3AgdGltZVxuIgogbXNnc3RyICJ1bnBhcnNiYXJlIEVuZHplaXRcbiIKIAotIzogc3JjL2xyei5jOjM1MyBzcmMvbHN6LmM6NDkwCisjOiBzcmMvbHN6LmM6NDkwIHNyYy9scnouYzozNTMKIG1zZ2lkICJtaW51dGUgdG8gbGFyZ2UgKDAuLjU5KSIKIG1zZ3N0ciAiTWludXRlIHp1IGdyb98gKDAuLjU5KSIKIAotIzogc3JjL2xyei5jOjM2MyBzcmMvbHJ6LmM6MzcwIHNyYy9sc3ouYzo1MDAgc3JjL2xzei5jOjUwNworIzogc3JjL2xzei5jOjUwMCBzcmMvbHN6LmM6NTA3IHNyYy9scnouYzozNjMgc3JjL2xyei5jOjM3MAogbXNnaWQgInN0b3AgdGltZSB0byBzbWFsbCIKIG1zZ3N0ciAiU3RvcHplaXQgenUga3VyeiIKIAotIzogc3JjL2xyei5jOjM2OCBzcmMvbHN6LmM6NTA1CisjOiBzcmMvbHN6LmM6NTA1IHNyYy9scnouYzozNjgKIG1zZ2lkICJzdG9wLWF0IgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozOTkgc3JjL2xzei5jOjUxNgorIzogc3JjL2xzei5jOjUxNiBzcmMvbHJ6LmM6Mzk5CiBtc2dpZCAidGltZW91dCIKIG1zZ3N0ciAiVGltZW91dCIKIAotIzogc3JjL2xyei5jOjQwMSBzcmMvbHN6LmM6NTE4CisjOiBzcmMvbHN6LmM6NTE4IHNyYy9scnouYzo0MDEKIG1zZ2lkICJ0aW1lb3V0IG91dCBvZiByYW5nZSAxMC4uMTAwMCIKIG1zZ3N0ciAiQXJndW1lbnQgZGVyIE9wdGlvbiB0IGF132VyaGFsYiBkZXMgQmVyZWljaHMgMTAuLjEwMDAiCiAKLSM6IHNyYy9scnouYzo0MTcgc3JjL2xzei5jOjUyNgorIzogc3JjL2xzei5jOjUyNiBzcmMvbHJ6LmM6NDE3CiBtc2dpZCAic2VjdXJpdHkgdmlvbGF0aW9uOiBjYW4ndCBkbyB0aGF0IHVuZGVyIHJlc3RyaWN0ZWQgc2hlbGxcbiIKIG1zZ3N0ciAiU2ljaGVyaGVpdHN2ZXJzdG/fOiBBdXNm/GhydW5nIHVudGVyIGVpbmdlc2NocuRua3RlciBTaGVsbCB2ZXJib3RlblxuIgogCi0jOiBzcmMvbHJ6LmM6NDA3IHNyYy9sc3ouYzo1MzMKKyM6IHNyYy9sc3ouYzo1MzMgc3JjL2xyei5jOjQwNwogbXNnaWQgIndpbmRvdyBzaXplIgogbXNnc3RyICJGZW5zdGVyZ3L232UiCiAKLSM6IHNyYy9scnouYzo0MzIgc3JjL2xyei5jOjQzOSBzcmMvbHN6LmM6NTU2IHNyYy9sc3ouYzo1NjMKKyM6IHNyYy9sc3ouYzo1NTYgc3JjL2xzei5jOjU2MyBzcmMvbHJ6LmM6NDMyIHNyYy9scnouYzo0MzkKIG1zZ2lkICJjYW5ub3QgdHVybm9mZiBzeXNsb2ciCiBtc2dzdHIgImthbm4gc3lzbG9nZ2luZyBuaWNodCBhYnNjaGFsdGVuIgogCi0jOiBzcmMvbHJ6LmM6NDU0IHNyYy9sc3ouYzo1NzEKKyM6IHNyYy9sc3ouYzo1NzEgc3JjL2xyei5jOjQ1NAogbXNnaWQgInN0YXJ0dXAgZGVsYXkiCiBtc2dzdHIgIlN0YXJ0dmVyevZnZXJ1bmciCiAKKyM6IHNyYy9sc3ouYzo1ODMgc3JjL2xzei5jOjY5MiBzcmMvbHN6LmM6ODMxIHNyYy9sc3ouYzoxMDgwIHNyYy96cmVhZGxpbmUuYzoxMjcKICM6IHNyYy9scnouYzo0NzAgc3JjL2xyei5jOjc1NSBzcmMvbHJ6LmM6MTExNyBzcmMvbHJ6LmM6MTI0MyBzcmMvbHJ6LmM6MTMwMAotIzogc3JjL2xyei5jOjEzMTcgc3JjL2xyei5jOjEzMzIgc3JjL2xyei5jOjE0MzEgc3JjL2xzei5jOjU4MyBzcmMvbHN6LmM6NjkyCi0jOiBzcmMvbHN6LmM6ODMxIHNyYy9sc3ouYzoxMDgwIHNyYy96cmVhZGxpbmUuYzoxMjcKKyM6IHNyYy9scnouYzoxMzE3IHNyYy9scnouYzoxMzMyIHNyYy9scnouYzoxNDMxCiBtc2dpZCAib3V0IG9mIG1lbW9yeSIKIG1zZ3N0ciAiS2VpbiBTcGVpY2hlciBtZWhyIGZyZWkiCiAKLSM6IHNyYy9scnouYzo0ODAgc3JjL2xzei5jOjU5NQorIzogc3JjL2xzei5jOjU5NSBzcmMvbHJ6LmM6NDgwCiBtc2dpZCAidGhpcyBwcm9ncmFtIHdhcyBuZXZlciBpbnRlbmRlZCB0byBiZSB1c2VkIHNldHVpZFxuIgogbXNnc3RyICJkaWVzZXMgUHJvZ3JhbW0gZGFyZiBuaWNodCBzZXR1aWQgbGF1ZmVuXG4iCiAKQEAgLTEyMCwxNCArMTIyLDE1IEBAIG1zZ2lkICJuZWVkIGF0IGxlYXN0IG9uZSBmaWxlIHRvIHNlbmQiCiBtc2dzdHIgImVzIG113yBtaW5kZXN0ZW5zIGVpbiBOYW1lIGVpbmVyIHp1IHNlbmRlbmRlbiBEYXRlaSBhbmdlZ2ViZW4gd2VyZGVuIgogCiAjOiBzcmMvbHN6LmM6NjI4CisjLCBjLWZvcm1hdAogbXNnaWQgIkNhbid0IHNlbmQgY29tbWFuZCBpbiByZXN0cmljdGVkIG1vZGVcbiIKIG1zZ3N0ciAiSW0gZWluZ2VzY2hy5G5rdGVuIE1vZHVzIGlzdCBkYXMgU2VuZGVuIHZvbiBLb21tYW5kb3MgdmVyYm90ZW5cbiIKIAotIzogc3JjL2xyei5jOjUyNCBzcmMvbHN6LmM6NjU1CisjOiBzcmMvbHN6LmM6NjU1IHNyYy9scnouYzo1MjQKIG1zZ2lkICJob3N0bmFtZSB0b28gbG9uZ1xuIgogbXNnc3RyICJIb3N0bmFtZSB6dSBsYW5nXG4iCiAKLSM6IHNyYy9scnouYzo1Mzkgc3JjL2xzei5jOjY3MAorIzogc3JjL2xzei5jOjY3MCBzcmMvbHJ6LmM6NTM5CiBtc2dpZCAiaWxsZWdhbCBzZXJ2ZXIgYWRkcmVzc1xuIgogbXNnc3RyICJJbGxlZ2FsZSBTZXJ2ZXJhZGRyZXNzZVxuIgogCkBAIC0xMzUsMTEgKzEzOCwxMSBAQCBtc2dzdHIgIklsbGVnYWxlIFNlcnZlcmFkZHJlc3NlXG4iCiBtc2dpZCAiY2FuIHJlYWQgb25seSBvbmUgZmlsZSBmcm9tIHN0ZGluIgogbXNnc3RyICJrYW5uIG51ciBlaW5lIERhdGVpIHZvbiBkZXIgU3RhbmRhcmRlaW5nYWJlIGxlc2VuIgogCi0jOiBzcmMvbHJ6LmM6NTcxIHNyYy9sc3ouYzo4MDYKKyM6IHNyYy9sc3ouYzo4MDYgc3JjL2xyei5jOjU3MQogbXNnaWQgIlRyYW5zZmVyIGluY29tcGxldGVcbiIKIG1zZ3N0ciAi3GJlcnRyYWd1bmcgbmljaHQgYWJnZXNjaGxvc3NlblxuIgogCi0jOiBzcmMvbHJ6LmM6NTczIHNyYy9sc3ouYzo4MDgKKyM6IHNyYy9sc3ouYzo4MDggc3JjL2xyei5jOjU3MwogbXNnaWQgIlRyYW5zZmVyIGNvbXBsZXRlXG4iCiBtc2dzdHIgItxiZXJ0cmFndW5nIGFiZ2VzY2hsb3NzZW5cbiIKIApAQCAtMTk3LDkgKzIwMCw5IEBAIG1zZ3N0ciAiS2FubiBrZWluZSBkZXIgYW5nZWZvcmRlcnRlbiBEYXQKICM6IHNyYy9sc3ouYzoxMDI4CiAjLCBjLWZvcm1hdAogbXNnaWQgInNlY3VyaXR5IHZpb2xhdGlvbjogbm90IGFsbG93ZWQgdG8gdXBsb2FkIGZyb20gJXMiCi1tc2dzdHIgIlNpY2hlcmhlaXRzdmVyc3Rv3zogQXVzZvxocnVuZyB1bnRlciBlaW5nZXNjaHLkbmt0ZXIgU2hlbGwgdmVyYm90ZW4iCittc2dzdHIgIlNpY2hlcmhlaXRzdmVyc3Rv3zogQXVzZvxocnVuZyB1bnRlciAlcyB2ZXJib3RlbiIKIAotIzogc3JjL2xyei5jOjEzOTIgc3JjL2xzei5jOjEwNDYKKyM6IHNyYy9sc3ouYzoxMDQ2IHNyYy9scnouYzoxMzkyCiAjLCBjLWZvcm1hdAogbXNnaWQgImNhbm5vdCBvcGVuICVzIgogbXNnc3RyICJrYW5uICVzIG5pY2h0IPZmZm5lbiIKQEAgLTI5MCwxMiArMjkzLDEyIEBAIG1zZ3N0ciAiRXJoaWVsdCAlMDJ4IGFscyBTZWt0b3JiZXN05HRpZ3UKIG1zZ2lkICJSZXRyeSBDb3VudCBFeGNlZWRlZCIKIG1zZ3N0ciAiTWF4aW1hbGUgV2llZGVyaG9sdW5nc2FuemFobCD8YmVyc2Nocml0dGVuIgogCi0jOiBzcmMvbHJ6LmM6NTkzIHNyYy9sc3ouYzoxNTIxCisjOiBzcmMvbHN6LmM6MTUyMSBzcmMvbHJ6LmM6NTkzCiAjLCBjLWZvcm1hdAogbXNnaWQgIlRyeSBgJXMgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIKIG1zZ3N0ciAiYCVzIC0taGVscCcgZ2lidCB3ZWl0ZXJlIEluZm9ybWF0aW9uZW4uXG4iCiAKLSM6IHNyYy9scnouYzo1OTggc3JjL2xzei5jOjE1MjYKKyM6IHNyYy9sc3ouYzoxNTI2IHNyYy9scnouYzo1OTgKICMsIGMtZm9ybWF0CiBtc2dpZCAiJXMgdmVyc2lvbiAlc1xuIgogbXNnc3RyICIlcyBWZXJzaW9uICVzXG4iCkBAIC0zMTUsNyArMzE4LDcgQEAgbXNnaWQgIlNlbmQgZmlsZShzKSB3aXRoIFpNT0RFTS9ZTU9ERU0vWAogbXNnc3RyICJEYXRlaWVuIG1pdCBaTU9ERU0vWU1PREVNL1hNT0RFTSD8YmVydHJhZ2VuXG4iCiAKICMgc3JjL2xyei5jOjQ3NSBzcmMvbHN6LmM6MTMzMCB4eAotIzogc3JjL2xyei5jOjYwNCBzcmMvbHN6LmM6MTUzNAorIzogc3JjL2xzei5jOjE1MzQgc3JjL2xyei5jOjYwNAogbXNnaWQgIiIKICIgICAgKFgpID0gb3B0aW9uIGFwcGxpZXMgdG8gWE1PREVNIG9ubHlcbiIKICIgICAgKFkpID0gb3B0aW9uIGFwcGxpZXMgdG8gWU1PREVNIG9ubHlcbiIKQEAgLTQzMSw3ICs0MzQsNyBAQCBtc2dzdHIgIiIKIG1zZ2lkICJnb3QgWlJRSU5JVCIKIG1zZ3N0ciAiZXJoaWVsdCBaUlFJTklUIgogCi0jOiBzcmMvbHJ6LmM6MTA3NCBzcmMvbHJ6LmM6MTc4NyBzcmMvbHN6LmM6MTc5MgorIzogc3JjL2xzei5jOjE3OTIgc3JjL2xyei5jOjEwNzQgc3JjL2xyei5jOjE3ODcKIG1zZ2lkICJnb3QgWkNBTiIKIG1zZ3N0ciAiZXJoaWVsdCBaQ0FOIgogCkBAIC00NzIsNyArNDc1LDcgQEAgbXNnc3RyICJjYWxjX2Jsa2xlbjogYWx0ICVsZCwgbmV1ICVsZCwgRAogIzogc3JjL2xzei5jOjIyNzIKICMsIGMtZm9ybWF0CiBtc2dpZCAiY2FsY19ibGtsZW46IGNhbGMgdG90YWxfYnl0ZXM9JWxkLCBicGU9JWxkLCBlYz0lbGRcbiIKLW1zZ3N0ciAiY2FsY19ibGtsZW46IGthbGt1bGllcmUgZ2VzYW10X2J5dGVzPSVsZCwgYnBlPSVsZSwgZWM9JWxkXG4iCittc2dzdHIgImNhbGNfYmxrbGVuOiBrYWxrdWxpZXJlIGdlc2FtdF9ieXRlcz0lbGQsIGJwZT0lbGQsIGVjPSVsZFxuIgogCiAjOiBzcmMvbHN6LmM6MjI4MwogIywgYy1mb3JtYXQKQEAgLTQ5Myw2ICs0OTYsMTAgQEAgbXNnc3RyICIiCiAiXG4iCiAiY291bnRlbTogR2VzYW10ICVkICVsZFxuIgogCisjOiBzcmMvem0uYzo5MQorbXNnaWQgIkJhZCBDUkMiCittc2dzdHIgIiIKKwogIzogc3JjL3ptLmM6MjQ0CiAjLCBjLWZvcm1hdAogbXNnaWQgIkJhZCBlc2NhcGUgc2VxdWVuY2UgJXgiCkBAIC01MDIsNyArNTA5LDcgQEAgbXNnc3RyICJGYWxzY2hlIEVzY2FwZXNlcXVlbnogJXgiCiBtc2dpZCAiU2VuZGVyIENhbmNlbGVkIgogbXNnc3RyICJTZW5kZXIgYnJhY2ggYWIiCiAKLSM6IHNyYy9scnouYzo5OTcgc3JjL3ptLmM6NTg1IHNyYy96bS5jOjY0NAorIzogc3JjL3ptLmM6NTg1IHNyYy96bS5jOjY0NCBzcmMvbHJ6LmM6OTk3CiBtc2dpZCAiVElNRU9VVCIKIG1zZ3N0ciAiVElNRU9VVCIKIApAQCAtNzcyLDEzICs3NzksMTEgQEAgbXNnc3RyICJFcmhpZWx0IHVuZXJ3YXJ0ZXRlcyBaUklOSVQiCiBtc2dpZCAiU2tpcHBlZCIKIG1zZ3N0ciAi3GJlcnNwcnVuZ2VuIgogCi0jLiB0b28gYmFkCiAjOiBzcmMvbHJ6LmM6MjA2NAogIywgYy1mb3JtYXQKIG1zZ2lkICJyemZpbGU6IGJwcyByYXRlICVsZCBiZWxvdyBtaW4gJWxkIgogbXNnc3RyICJyemZpbGU6IEJQUy1SYXRlICVsZCB1bnRlciBNaW5pbXVtICVsZCIKIAotIy4gdG9vIGJhZAogIzogc3JjL2xyei5jOjIwNzkKIG1zZ2lkICJyemZpbGU6IHJlYWNoZWQgc3RvcCB0aW1lIgogbXNnc3RyICJyemZpbGU6IEFiYnJ1Y2h6ZWl0IGVycmVpY2h0IgpkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvcG8vbHJ6c3oucG90IGxyenN6LTAuMTIuMjAvcG8vbHJ6c3oucG90Ci0tLSBjbGVhbi9scnpzei0wLjEyLjIwL3BvL2xyenN6LnBvdAkxOTk4LTEyLTMwIDA3OjUwOjAwLjAwMDAwMDAwMCArMDAwMAorKysgbHJ6c3otMC4xMi4yMC9wby9scnpzei5wb3QJMjAxOS0xMS0yNiAxMTozOToxMi4wMDAwMDAwMDAgKzAwMDAKQEAgLTEsMjQgKzEsMjcgQEAKICMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KICMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgbHJ6c3ogcGFja2FnZS4KICMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KICMKICMsIGZ1enp5CiBtc2dpZCAiIgogbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OC0xMi0zMCAwODo0OSswMTAwXG4iCisiUHJvamVjdC1JZC1WZXJzaW9uOiBscnpzeiAwLjEyLjIwXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDE5LTExLTI2IDExOjM5KzAwMDBcbiIKICJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKICJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKICJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgorIkxhbmd1YWdlOiBcbiIKICJNSU1FLVZlcnNpb246IDEuMFxuIgogIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCiAKICM6IHNyYy9sc3ouYzoyMjgKIG1zZ2lkICJpb19tb2RlKCwyKSBpbiByYnNiLmMgbm90IGltcGxlbWVudGVkXG4iCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjIwMSBzcmMvbHN6LmM6MjMwCisjOiBzcmMvbHN6LmM6MjMwIHNyYy9scnouYzoyMDEKICMsIGMtZm9ybWF0CiBtc2dpZCAiY2F1Z2h0IHNpZ25hbCAlZDsgZXhpdGluZyIKIG1zZ3N0ciAiIgpAQCAtNDUsNyArNDgsNyBAQCBtc2dzdHIgIiIKIG1zZ2lkICJmcmFtZWxlbmd0aCBvdXQgb2YgcmFuZ2UgMzIuLiVsZCIKIG1zZ3N0ciAiIgogCi0jOiBzcmMvbHJ6LmM6MzIzIHNyYy9sc3ouYzo0NTAKKyM6IHNyYy9sc3ouYzo0NTAgc3JjL2xyei5jOjMyMwogbXNnaWQgIm1pbl9icHMiCiBtc2dzdHIgIiIKIApAQCAtNTMsNjUgKzU2LDY1IEBAIG1zZ3N0ciAiIgogbXNnaWQgIm1pbl9icHMgbXVzdCBiZSA+PSAwIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozMjkgc3JjL2xzei5jOjQ1OAorIzogc3JjL2xzei5jOjQ1OCBzcmMvbHJ6LmM6MzI5CiBtc2dpZCAibWluX2Jwc190aW1lIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozMzEgc3JjL2xzei5jOjQ2MAorIzogc3JjL2xzei5jOjQ2MCBzcmMvbHJ6LmM6MzMxCiBtc2dpZCAibWluX2Jwc190aW1lIG11c3QgYmUgPiAxIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozNDcgc3JjL2xzei5jOjQ4NAorIzogc3JjL2xzei5jOjQ4NCBzcmMvbHJ6LmM6MzQ3CiBtc2dpZCAiaG91ciB0byBsYXJnZSAoMC4uMjMpIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozNDkgc3JjL2xzei5jOjQ4NgorIzogc3JjL2xzei5jOjQ4NiBzcmMvbHJ6LmM6MzQ5CiBtc2dpZCAidW5wYXJzYWJsZSBzdG9wIHRpbWVcbiIKIG1zZ3N0ciAiIgogCi0jOiBzcmMvbHJ6LmM6MzUzIHNyYy9sc3ouYzo0OTAKKyM6IHNyYy9sc3ouYzo0OTAgc3JjL2xyei5jOjM1MwogbXNnaWQgIm1pbnV0ZSB0byBsYXJnZSAoMC4uNTkpIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozNjMgc3JjL2xyei5jOjM3MCBzcmMvbHN6LmM6NTAwIHNyYy9sc3ouYzo1MDcKKyM6IHNyYy9sc3ouYzo1MDAgc3JjL2xzei5jOjUwNyBzcmMvbHJ6LmM6MzYzIHNyYy9scnouYzozNzAKIG1zZ2lkICJzdG9wIHRpbWUgdG8gc21hbGwiCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjM2OCBzcmMvbHN6LmM6NTA1CisjOiBzcmMvbHN6LmM6NTA1IHNyYy9scnouYzozNjgKIG1zZ2lkICJzdG9wLWF0IgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzozOTkgc3JjL2xzei5jOjUxNgorIzogc3JjL2xzei5jOjUxNiBzcmMvbHJ6LmM6Mzk5CiBtc2dpZCAidGltZW91dCIKIG1zZ3N0ciAiIgogCi0jOiBzcmMvbHJ6LmM6NDAxIHNyYy9sc3ouYzo1MTgKKyM6IHNyYy9sc3ouYzo1MTggc3JjL2xyei5jOjQwMQogbXNnaWQgInRpbWVvdXQgb3V0IG9mIHJhbmdlIDEwLi4xMDAwIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzo0MTcgc3JjL2xzei5jOjUyNgorIzogc3JjL2xzei5jOjUyNiBzcmMvbHJ6LmM6NDE3CiBtc2dpZCAic2VjdXJpdHkgdmlvbGF0aW9uOiBjYW4ndCBkbyB0aGF0IHVuZGVyIHJlc3RyaWN0ZWQgc2hlbGxcbiIKIG1zZ3N0ciAiIgogCi0jOiBzcmMvbHJ6LmM6NDA3IHNyYy9sc3ouYzo1MzMKKyM6IHNyYy9sc3ouYzo1MzMgc3JjL2xyei5jOjQwNwogbXNnaWQgIndpbmRvdyBzaXplIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzo0MzIgc3JjL2xyei5jOjQzOSBzcmMvbHN6LmM6NTU2IHNyYy9sc3ouYzo1NjMKKyM6IHNyYy9sc3ouYzo1NTYgc3JjL2xzei5jOjU2MyBzcmMvbHJ6LmM6NDMyIHNyYy9scnouYzo0MzkKIG1zZ2lkICJjYW5ub3QgdHVybm9mZiBzeXNsb2ciCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjQ1NCBzcmMvbHN6LmM6NTcxCisjOiBzcmMvbHN6LmM6NTcxIHNyYy9scnouYzo0NTQKIG1zZ2lkICJzdGFydHVwIGRlbGF5IgogbXNnc3RyICIiCiAKKyM6IHNyYy9sc3ouYzo1ODMgc3JjL2xzei5jOjY5MiBzcmMvbHN6LmM6ODMxIHNyYy9sc3ouYzoxMDgwIHNyYy96cmVhZGxpbmUuYzoxMjcKICM6IHNyYy9scnouYzo0NzAgc3JjL2xyei5jOjc1NSBzcmMvbHJ6LmM6MTExNyBzcmMvbHJ6LmM6MTI0MyBzcmMvbHJ6LmM6MTMwMAotIzogc3JjL2xyei5jOjEzMTcgc3JjL2xyei5jOjEzMzIgc3JjL2xyei5jOjE0MzEgc3JjL2xzei5jOjU4MyBzcmMvbHN6LmM6NjkyCi0jOiBzcmMvbHN6LmM6ODMxIHNyYy9sc3ouYzoxMDgwIHNyYy96cmVhZGxpbmUuYzoxMjcKKyM6IHNyYy9scnouYzoxMzE3IHNyYy9scnouYzoxMzMyIHNyYy9scnouYzoxNDMxCiBtc2dpZCAib3V0IG9mIG1lbW9yeSIKIG1zZ3N0ciAiIgogCi0jOiBzcmMvbHJ6LmM6NDgwIHNyYy9sc3ouYzo1OTUKKyM6IHNyYy9sc3ouYzo1OTUgc3JjL2xyei5jOjQ4MAogbXNnaWQgInRoaXMgcHJvZ3JhbSB3YXMgbmV2ZXIgaW50ZW5kZWQgdG8gYmUgdXNlZCBzZXR1aWRcbiIKIG1zZ3N0ciAiIgogCkBAIC0xMjAsMTQgKzEyMywxNSBAQCBtc2dpZCAibmVlZCBhdCBsZWFzdCBvbmUgZmlsZSB0byBzZW5kIgogbXNnc3RyICIiCiAKICM6IHNyYy9sc3ouYzo2MjgKKyMsIGMtZm9ybWF0CiBtc2dpZCAiQ2FuJ3Qgc2VuZCBjb21tYW5kIGluIHJlc3RyaWN0ZWQgbW9kZVxuIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzo1MjQgc3JjL2xzei5jOjY1NQorIzogc3JjL2xzei5jOjY1NSBzcmMvbHJ6LmM6NTI0CiBtc2dpZCAiaG9zdG5hbWUgdG9vIGxvbmdcbiIKIG1zZ3N0ciAiIgogCi0jOiBzcmMvbHJ6LmM6NTM5IHNyYy9sc3ouYzo2NzAKKyM6IHNyYy9sc3ouYzo2NzAgc3JjL2xyei5jOjUzOQogbXNnaWQgImlsbGVnYWwgc2VydmVyIGFkZHJlc3NcbiIKIG1zZ3N0ciAiIgogCkBAIC0xMzUsMTEgKzEzOSwxMSBAQCBtc2dzdHIgIiIKIG1zZ2lkICJjYW4gcmVhZCBvbmx5IG9uZSBmaWxlIGZyb20gc3RkaW4iCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjU3MSBzcmMvbHN6LmM6ODA2CisjOiBzcmMvbHN6LmM6ODA2IHNyYy9scnouYzo1NzEKIG1zZ2lkICJUcmFuc2ZlciBpbmNvbXBsZXRlXG4iCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjU3MyBzcmMvbHN6LmM6ODA4CisjOiBzcmMvbHN6LmM6ODA4IHNyYy9scnouYzo1NzMKIG1zZ2lkICJUcmFuc2ZlciBjb21wbGV0ZVxuIgogbXNnc3RyICIiCiAKQEAgLTE5OSw3ICsyMDMsNyBAQCBtc2dzdHIgIiIKIG1zZ2lkICJzZWN1cml0eSB2aW9sYXRpb246IG5vdCBhbGxvd2VkIHRvIHVwbG9hZCBmcm9tICVzIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzoxMzkyIHNyYy9sc3ouYzoxMDQ2CisjOiBzcmMvbHN6LmM6MTA0NiBzcmMvbHJ6LmM6MTM5MgogIywgYy1mb3JtYXQKIG1zZ2lkICJjYW5ub3Qgb3BlbiAlcyIKIG1zZ3N0ciAiIgpAQCAtMjkwLDEyICsyOTQsMTIgQEAgbXNnc3RyICIiCiBtc2dpZCAiUmV0cnkgQ291bnQgRXhjZWVkZWQiCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjU5MyBzcmMvbHN6LmM6MTUyMQorIzogc3JjL2xzei5jOjE1MjEgc3JjL2xyei5jOjU5MwogIywgYy1mb3JtYXQKIG1zZ2lkICJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjU5OCBzcmMvbHN6LmM6MTUyNgorIzogc3JjL2xzei5jOjE1MjYgc3JjL2xyei5jOjU5OAogIywgYy1mb3JtYXQKIG1zZ2lkICIlcyB2ZXJzaW9uICVzXG4iCiBtc2dzdHIgIiIKQEAgLTMxNCw3ICszMTgsNyBAQCBtc2dzdHIgIiIKIG1zZ2lkICJTZW5kIGZpbGUocykgd2l0aCBaTU9ERU0vWU1PREVNL1hNT0RFTSBwcm90b2NvbFxuIgogbXNnc3RyICIiCiAKLSM6IHNyYy9scnouYzo2MDQgc3JjL2xzei5jOjE1MzQKKyM6IHNyYy9sc3ouYzoxNTM0IHNyYy9scnouYzo2MDQKIG1zZ2lkICIiCiAiICAgIChYKSA9IG9wdGlvbiBhcHBsaWVzIHRvIFhNT0RFTSBvbmx5XG4iCiAiICAgIChZKSA9IG9wdGlvbiBhcHBsaWVzIHRvIFlNT0RFTSBvbmx5XG4iCkBAIC0zNzgsNyArMzgyLDcgQEAgbXNnc3RyICIiCiBtc2dpZCAiZ290IFpSUUlOSVQiCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjEwNzQgc3JjL2xyei5jOjE3ODcgc3JjL2xzei5jOjE3OTIKKyM6IHNyYy9sc3ouYzoxNzkyIHNyYy9scnouYzoxMDc0IHNyYy9scnouYzoxNzg3CiBtc2dpZCAiZ290IFpDQU4iCiBtc2dzdHIgIiIKIApAQCAtNDM4LDYgKzQ0MiwxMCBAQCBtc2dpZCAiIgogImNvdW50ZW06IFRvdGFsICVkICVsZFxuIgogbXNnc3RyICIiCiAKKyM6IHNyYy96bS5jOjkxCittc2dpZCAiQmFkIENSQyIKK21zZ3N0ciAiIgorCiAjOiBzcmMvem0uYzoyNDQKICMsIGMtZm9ybWF0CiBtc2dpZCAiQmFkIGVzY2FwZSBzZXF1ZW5jZSAleCIKQEAgLTQ0Nyw3ICs0NTUsNyBAQCBtc2dzdHIgIiIKIG1zZ2lkICJTZW5kZXIgQ2FuY2VsZWQiCiBtc2dzdHIgIiIKIAotIzogc3JjL2xyei5jOjk5NyBzcmMvem0uYzo1ODUgc3JjL3ptLmM6NjQ0CisjOiBzcmMvem0uYzo1ODUgc3JjL3ptLmM6NjQ0IHNyYy9scnouYzo5OTcKIG1zZ2lkICJUSU1FT1VUIgogbXNnc3RyICIiCiAKQEAgLTY3OCwxMyArNjg2LDExIEBAIG1zZ3N0ciAiIgogbXNnaWQgIlNraXBwZWQiCiBtc2dzdHIgIiIKIAotIy4gdG9vIGJhZAogIzogc3JjL2xyei5jOjIwNjQKICMsIGMtZm9ybWF0CiBtc2dpZCAicnpmaWxlOiBicHMgcmF0ZSAlbGQgYmVsb3cgbWluICVsZCIKIG1zZ3N0ciAiIgogCi0jLiB0b28gYmFkCiAjOiBzcmMvbHJ6LmM6MjA3OQogbXNnaWQgInJ6ZmlsZTogcmVhY2hlZCBzdG9wIHRpbWUiCiBtc2dzdHIgIiIKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL3BvL01ha2V2YXJzIGxyenN6LTAuMTIuMjAvcG8vTWFrZXZhcnMKLS0tIGNsZWFuL2xyenN6LTAuMTIuMjAvcG8vTWFrZXZhcnMJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGxyenN6LTAuMTIuMjAvcG8vTWFrZXZhcnMJMjAxOS0xMS0yNSAxODowOTo1Mi4wMDAwMDAwMDAgKzAwMDAKQEAgLTAsMCArMSw3OCBAQAorIyBNYWtlZmlsZSB2YXJpYWJsZXMgZm9yIFBPIGRpcmVjdG9yeSBpbiBhbnkgcGFja2FnZSB1c2luZyBHTlUgZ2V0dGV4dC4KKworIyBVc3VhbGx5IHRoZSBtZXNzYWdlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgcGFja2FnZSBuYW1lLgorRE9NQUlOID0gJChQQUNLQUdFKQorCisjIFRoZXNlIHR3byB2YXJpYWJsZXMgZGVwZW5kIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGRpcmVjdG9yeS4KK3N1YmRpciA9IHBvCit0b3BfYnVpbGRkaXIgPSAuLgorCisjIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byB4Z2V0dGV4dC4KK1hHRVRURVhUX09QVElPTlMgPSAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8KKworIyBUaGlzIGlzIHRoZSBjb3B5cmlnaHQgaG9sZGVyIHRoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgb2YgdGhlCisjICQoRE9NQUlOKS5wb3QgZmlsZS4gIFNldCB0aGlzIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBzdXJyb3VuZGluZworIyBwYWNrYWdlLiAgKE5vdGUgdGhhdCB0aGUgbXNnc3RyIHN0cmluZ3MsIGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrYWdlJ3MKKyMgc291cmNlcywgYmVsb25nIHRvIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9mIHRoZSBwYWNrYWdlLikgIFRyYW5zbGF0b3JzIGFyZQorIyBleHBlY3RlZCB0byB0cmFuc2ZlciB0aGUgY29weXJpZ2h0IGZvciB0aGVpciB0cmFuc2xhdGlvbnMgdG8gdGhpcyBwZXJzb24KKyMgb3IgZW50aXR5LCBvciB0byBkaXNjbGFpbSB0aGVpciBjb3B5cmlnaHQuICBUaGUgZW1wdHkgc3RyaW5nIHN0YW5kcyBmb3IKKyMgdGhlIHB1YmxpYyBkb21haW47IGluIHRoaXMgY2FzZSB0aGUgdHJhbnNsYXRvcnMgYXJlIGV4cGVjdGVkIHRvIGRpc2NsYWltCisjIHRoZWlyIGNvcHlyaWdodC4KK0NPUFlSSUdIVF9IT0xERVIgPSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHRlbGxzIHdoZXRoZXIgb3Igbm90IHRvIHByZXBlbmQgIkdOVSAiIHByZWZpeCB0byB0aGUgcGFja2FnZQorIyBuYW1lIHRoYXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBoZWFkZXIgb2YgdGhlICQoRE9NQUlOKS5wb3QgZmlsZS4KKyMgUG9zc2libGUgdmFsdWVzIGFyZSAieWVzIiwgIm5vIiwgb3IgZW1wdHkuICBJZiBpdCBpcyBlbXB0eSwgdHJ5IHRvCisjIGRldGVjdCBpdCBhdXRvbWF0aWNhbGx5IGJ5IHNjYW5uaW5nIHRoZSBmaWxlcyBpbiAkKHRvcF9zcmNkaXIpIGZvcgorIyAiR05VIHBhY2thZ2VuYW1lIiBzdHJpbmcuCitQQUNLQUdFX0dOVSA9CisKKyMgVGhpcyBpcyB0aGUgZW1haWwgYWRkcmVzcyBvciBVUkwgdG8gd2hpY2ggdGhlIHRyYW5zbGF0b3JzIHNoYWxsIHJlcG9ydAorIyBidWdzIGluIHRoZSB1bnRyYW5zbGF0ZWQgc3RyaW5nczoKKyMgLSBTdHJpbmdzIHdoaWNoIGFyZSBub3QgZW50aXJlIHNlbnRlbmNlcywgc2VlIHRoZSBtYWludGFpbmVyIGd1aWRlbGluZXMKKyMgICBpbiB0aGUgR05VIGdldHRleHQgZG9jdW1lbnRhdGlvbiwgc2VjdGlvbiAnUHJlcGFyaW5nIFN0cmluZ3MnLgorIyAtIFN0cmluZ3Mgd2hpY2ggdXNlIHVuY2xlYXIgdGVybXMgb3IgcmVxdWlyZSBhZGRpdGlvbmFsIGNvbnRleHQgdG8gYmUKKyMgICB1bmRlcnN0b29kLgorIyAtIFN0cmluZ3Mgd2hpY2ggbWFrZSBpbnZhbGlkIGFzc3VtcHRpb25zIGFib3V0IG5vdGF0aW9uIG9mIGRhdGUsIHRpbWUgb3IKKyMgICBtb25leS4KKyMgLSBQbHVyYWxpc2F0aW9uIHByb2JsZW1zLgorIyAtIEluY29ycmVjdCBFbmdsaXNoIHNwZWxsaW5nLgorIyAtIEluY29ycmVjdCBmb3JtYXR0aW5nLgorIyBJdCBjYW4gYmUgeW91ciBlbWFpbCBhZGRyZXNzLCBvciBhIG1haWxpbmcgbGlzdCBhZGRyZXNzIHdoZXJlIHRyYW5zbGF0b3JzCisjIGNhbiB3cml0ZSB0byB3aXRob3V0IGJlaW5nIHN1YnNjcmliZWQsIG9yIHRoZSBVUkwgb2YgYSB3ZWIgcGFnZSB0aHJvdWdoCisjIHdoaWNoIHRoZSB0cmFuc2xhdG9ycyBjYW4gY29udGFjdCB5b3UuCitNU0dJRF9CVUdTX0FERFJFU1MgPQorCisjIFRoaXMgaXMgdGhlIGxpc3Qgb2YgbG9jYWxlIGNhdGVnb3JpZXMsIGJleW9uZCBMQ19NRVNTQUdFUywgZm9yIHdoaWNoIHRoZQorIyBtZXNzYWdlIGNhdGFsb2dzIHNoYWxsIGJlIHVzZWQuICBJdCBpcyB1c3VhbGx5IGVtcHR5LgorRVhUUkFfTE9DQUxFX0NBVEVHT1JJRVMgPQorCisjIFRoaXMgdGVsbHMgd2hldGhlciB0aGUgJChET01BSU4pLnBvdCBmaWxlIGNvbnRhaW5zIG1lc3NhZ2VzIHdpdGggYW4gJ21zZ2N0eHQnCisjIGNvbnRleHQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlICJ5ZXMiIGFuZCAibm8iLiAgU2V0IHRoaXMgdG8geWVzIGlmIHRoZQorIyBwYWNrYWdlIHVzZXMgZnVuY3Rpb25zIHRha2luZyBhbHNvIGEgbWVzc2FnZSBjb250ZXh0LCBsaWtlIHBnZXR0ZXh0KCksIG9yCisjIGlmIGluICQoWEdFVFRFWFRfT1BUSU9OUykgeW91IGRlZmluZSBrZXl3b3JkcyB3aXRoIGEgY29udGV4dCBhcmd1bWVudC4KK1VTRV9NU0dDVFhUID0gbm8KKworIyBUaGVzZSBvcHRpb25zIGdldCBwYXNzZWQgdG8gbXNnbWVyZ2UuCisjIFVzZWZ1bCBvcHRpb25zIGFyZSBpbiBwYXJ0aWN1bGFyOgorIyAgIC0tcHJldmlvdXMgICAgICAgICAgICB0byBrZWVwIHByZXZpb3VzIG1zZ2lkcyBvZiB0cmFuc2xhdGVkIG1lc3NhZ2VzLAorIyAgIC0tcXVpZXQgICAgICAgICAgICAgICB0byByZWR1Y2UgdGhlIHZlcmJvc2l0eS4KK01TR01FUkdFX09QVElPTlMgPQorCisjIFRoZXNlIG9wdGlvbnMgZ2V0IHBhc3NlZCB0byBtc2dpbml0LgorIyBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIGxpbmUgd3JhcHBpbmcgd2hlbiB3cml0aW5nIFBPIGZpbGVzLCBhZGQKKyMgLS1uby13cmFwIHRvIE1TR01FUkdFX09QVElPTlMsIFhHRVRURVhUX09QVElPTlMsIGFuZAorIyBNU0dJTklUX09QVElPTlMuCitNU0dJTklUX09QVElPTlMgPQorCisjIFRoaXMgdGVsbHMgd2hldGhlciBvciBub3QgdG8gcmVnZW5lcmF0ZSBhIFBPIGZpbGUgd2hlbiAkKERPTUFJTikucG90CisjIGhhcyBjaGFuZ2VkLiAgUG9zc2libGUgdmFsdWVzIGFyZSAieWVzIiBhbmQgIm5vIi4gIFNldCB0aGlzIHRvIG5vIGlmCisjIHRoZSBQT1QgZmlsZSBpcyBjaGVja2VkIGluIHRoZSByZXBvc2l0b3J5IGFuZCB0aGUgdmVyc2lvbiBjb250cm9sCisjIHByb2dyYW0gaWdub3JlcyB0aW1lc3RhbXBzLgorUE9fREVQRU5EU19PTl9QT1QgPSB5ZXMKKworIyBUaGlzIHRlbGxzIHdoZXRoZXIgb3Igbm90IHRvIGZvcmNpYmx5IHVwZGF0ZSAkKERPTUFJTikucG90IGFuZAorIyByZWdlbmVyYXRlIFBPIGZpbGVzIG9uICJtYWtlIGRpc3QiLiAgUG9zc2libGUgdmFsdWVzIGFyZSAieWVzIiBhbmQKKyMgIm5vIi4gIFNldCB0aGlzIHRvIG5vIGlmIHRoZSBQT1QgZmlsZSBhbmQgUE8gZmlsZXMgYXJlIG1haW50YWluZWQKKyMgZXh0ZXJuYWxseS4KK0RJU1RfREVQRU5EU19PTl9VUERBVEVfUE8gPSB5ZXMKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL3BvL3N0YW1wLWNhdC1pZCBscnpzei0wLjEyLjIwL3BvL3N0YW1wLWNhdC1pZAotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9wby9zdGFtcC1jYXQtaWQJMTk5OC0xMi0zMCAwNzo1MDowMS4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvcG8vc3RhbXAtY2F0LWlkCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xICswLDAgQEAKLXRpbWVzdGFtcApkaWZmIC11cHJOIGNsZWFuL2xyenN6LTAuMTIuMjAvcG8vc3RhbXAtcG8gbHJ6c3otMC4xMi4yMC9wby9zdGFtcC1wbwotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9wby9zdGFtcC1wbwkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMAorKysgbHJ6c3otMC4xMi4yMC9wby9zdGFtcC1wbwkyMDE5LTExLTI2IDExOjQyOjA5LjAwMDAwMDAwMCArMDAwMApAQCAtMCwwICsxIEBACit0aW1lc3RhbXAKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL3NyYy9NYWtlZmlsZS5hbSBscnpzei0wLjEyLjIwL3NyYy9NYWtlZmlsZS5hbQotLS0gY2xlYW4vbHJ6c3otMC4xMi4yMC9zcmMvTWFrZWZpbGUuYW0JMTk5OC0xMi0yOCAwODozODo0Ny4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvc3JjL01ha2VmaWxlLmFtCTIwMTktMTEtMjUgMTY6MjI6NDkuMDAwMDAwMDAwICswMDAwCkBAIC0yLDEzICsyLDExIEBAIGJpbl9QUk9HUkFNUz1scnogbHN6CiBscnpfU09VUkNFUz1scnouYyB0aW1pbmcuYyB6cGVyci5jIHpyZWFkbGluZS5jIGNyY3RhYi5jIHJic2IuYyB6bS5jIHByb3RuYW1lLmMgdGNwLmMgbHN5c2xvZy5jIGNhbml0LmMKIGxzel9TT1VSQ0VTPWxzei5jIHRpbWluZy5jIHpwZXJyLmMgenJlYWRsaW5lLmMgY3JjdGFiLmMgcmJzYi5jIHptLmMgcHJvdG5hbWUuYyB0Y3AuYyBsc3lzbG9nLmMgY2FuaXQuYwogbm9pbnN0X0hFQURFUlMgPSB0aW1pbmcuaCB6Z2xvYmFsLmggem1vZGVtLmgKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAorZGF0YWRpciA9ICQocHJlZml4KS9zaGFyZQogbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLUNGTEFHUz1AQ0ZMQUdTQAogRElTVENMRUFOX0ZJTEVTPWxyenN6YnVnCiAKLUxEQUREID0gLi4vbGliL2xpYnptb2RlbS5hIEBJTlRMTElCU0AKLUFVVE9NQUtFX09QVElPTlM9YW5zaTJrbnIKK0xEQUREID0gLi4vbGliL2xpYnptb2RlbS5hIEBMSUJJTlRMQAogRVhUUkFfRElTVCA9IGFuc2kya25yLjEgYW5zaTJrbnIuYyBscnpzemJ1Zy5pbgogSU5DTFVERVMgPSAtSS4uIC1JJChzcmNkaXIpIC1JJCh0b3Bfc3JjZGlyKS9zcmMgLUkuLi9pbnRsIC1JJCh0b3Bfc3JjZGlyKS9saWIKICNERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtRE9TPVwiQGhvc3Rfb3NAXCIgLURDUFU9XCJAaG9zdF9jcHVAXCIKZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL3NyYy96Z2xvYmFsLmggbHJ6c3otMC4xMi4yMC9zcmMvemdsb2JhbC5oCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL3NyYy96Z2xvYmFsLmgJMTk5OC0xMi0yOSAxMjozNDo1OS4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvc3JjL3pnbG9iYWwuaAkyMDE5LTExLTI1IDE2OjMyOjQyLjAwMDAwMDAwMCArMDAwMApAQCAtMTgwLDkgKzE4MCw2IEBAIHN0cnVjdCB0ZXJtaW9zOwogI2lmIEhBVkVfTE9DQUxFX0gKICMgaW5jbHVkZSA8bG9jYWxlLmg+CiAjZW5kaWYKLSNpZiAhSEFWRV9TRVRMT0NBTEUKLSMgZGVmaW5lIHNldGxvY2FsZShDYXRlZ29yeSwgTG9jYWxlKSAvKiBlbXB0eSAqLwotI2VuZGlmCiAKICNpZiBFTkFCTEVfTkxTCiAjIGluY2x1ZGUgPGxpYmludGwuaD4KZGlmZiAtdXByTiBjbGVhbi9scnpzei0wLjEyLjIwL3N0YW1wLWguaW4gbHJ6c3otMC4xMi4yMC9zdGFtcC1oLmluCi0tLSBjbGVhbi9scnpzei0wLjEyLjIwL3N0YW1wLWguaW4JMTk5OC0xMi0zMCAwNzo1MTowNy4wMDAwMDAwMDAgKzAwMDAKKysrIGxyenN6LTAuMTIuMjAvc3RhbXAtaC5pbgkxOTcwLTAxLTAxIDAxOjAwOjAwLjAwMDAwMDAwMCArMDEwMApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAK