ZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmggYi9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfZWRpdC5oCmluZGV4IDBhMzYxN2YuLmQ5MmYyOTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9lZGl0LmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2VkaXQuaApAQCAtMTYyLDcgKzE2Miw3IEBACiAKIAl2aXJ0dWFsIH5DRlhfRWRpdF9SZWN0QXJyYXkoKQogCXsKLQkJdGhpcy0+RW1wdHkoKTsKKwkJRW1wdHkoKTsKIAl9CiAKIAl2b2lkIEVtcHR5KCkKQEAgLTE3MCw3ICsxNzAsNyBAQAogCQlmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9SZWN0cy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQogCQkJZGVsZXRlIG1fUmVjdHMuR2V0QXQoaSk7CiAKLQkJdGhpcy0+bV9SZWN0cy5SZW1vdmVBbGwoKTsKKwkJbV9SZWN0cy5SZW1vdmVBbGwoKTsKIAl9CiAKIAl2b2lkIEFkZChjb25zdCBDUERGX1JlY3QgJiByZWN0KQpAQCAtMjQyLDcgKzI0Miw3IEBACiAKIAlDUFZUX1dvcmRSYW5nZSBDb252ZXJ0VG9Xb3JkUmFuZ2UoKSBjb25zdAogCXsKLQkJcmV0dXJuIENQVlRfV29yZFJhbmdlKHRoaXMtPkJlZ2luUG9zLHRoaXMtPkVuZFBvcyk7CisJCXJldHVybiBDUFZUX1dvcmRSYW5nZShCZWdpblBvcywgRW5kUG9zKTsKIAl9CiAKIAl2b2lkIERlZmF1bHQoKQpAQCAtMjUzLDI4ICsyNTMsMjggQEAKIAogCXZvaWQgU2V0KGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4sY29uc3QgQ1BWVF9Xb3JkUGxhY2UgJiBlbmQpCiAJewotCQl0aGlzLT5CZWdpblBvcyA9IGJlZ2luOwotCQl0aGlzLT5FbmRQb3MgPSBlbmQ7CisJCUJlZ2luUG9zID0gYmVnaW47CisJCUVuZFBvcyA9IGVuZDsKIAl9CiAKIAl2b2lkIFNldEJlZ2luUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlICYgYmVnaW4pCiAJewotCQl0aGlzLT5CZWdpblBvcyA9IGJlZ2luOworCQlCZWdpblBvcyA9IGJlZ2luOwogCX0KIAogCXZvaWQgU2V0RW5kUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlICYgZW5kKQogCXsKLQkJdGhpcy0+RW5kUG9zID0gZW5kOworCQlFbmRQb3MgPSBlbmQ7CiAJfQogCiAJRlhfQk9PTCBJc0V4aXN0KCkgY29uc3QKIAl7Ci0JCXJldHVybiB0aGlzLT5CZWdpblBvcyAhPSB0aGlzLT5FbmRQb3M7CisJCXJldHVybiBCZWdpblBvcyAhPSBFbmRQb3M7CiAJfQogCiAJRlhfQk9PTCBvcGVyYXRvciAhPSAoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UgJiB3cikgY29uc3QKIAl7Ci0JCXJldHVybiB3ci5CZWdpblBvcyAhPSB0aGlzLT5CZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gdGhpcy0+RW5kUG9zOworCQlyZXR1cm4gd3IuQmVnaW5Qb3MgIT0gQmVnaW5Qb3MgfHwgd3IuRW5kUG9zICE9IEVuZFBvczsKIAl9CiAKIAlDUFZUX1dvcmRQbGFjZSBCZWdpblBvcyxFbmRQb3M7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oIGIvZnBkZnNkay9pbmNsdWRlL2Z4ZWRpdC9meGV0X2xpc3QuaAppbmRleCAwMjAyOGYyLi5mZTc1YjBmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2luY2x1ZGUvZnhlZGl0L2Z4ZXRfbGlzdC5oCisrKyBiL2ZwZGZzZGsvaW5jbHVkZS9meGVkaXQvZnhldF9saXN0LmgKQEAgLTE5LDEwICsxOSwxMCBAQAogCXsKIAl9CiAKLQlDTFNUX1NpemUoRlhfRkxPQVQgeCxGWF9GTE9BVCB5KQorCUNMU1RfU2l6ZShGWF9GTE9BVCBvdGhlcl94LCBGWF9GTE9BVCBvdGhlcl95KQogCXsKLQkJdGhpcy0+eCA9IHg7Ci0JCXRoaXMtPnkgPSB5OworCQl4ID0gb3RoZXJfeDsKKwkJeSA9IG90aGVyX3k7CiAJfQogCiAJdm9pZCBEZWZhdWx0KCkKQEAgLTQ3LDIyICs0NywyNCBAQAogCQlsZWZ0ID0gdG9wID0gcmlnaHQgPSBib3R0b20gPSAwLjBmOwogCX0KIAotCUNMU1RfUmVjdChGWF9GTE9BVCBsZWZ0LEZYX0ZMT0FUIHRvcCwKLQkJCQkJCUZYX0ZMT0FUIHJpZ2h0LEZYX0ZMT0FUIGJvdHRvbSkKLQl7Ci0JCXRoaXMtPmxlZnQgPSBsZWZ0OwotCQl0aGlzLT50b3AgPSB0b3A7Ci0JCXRoaXMtPnJpZ2h0ID0gcmlnaHQ7Ci0JCXRoaXMtPmJvdHRvbSA9IGJvdHRvbTsKLQl9CisgICAgQ0xTVF9SZWN0KEZYX0ZMT0FUIG90aGVyX2xlZnQsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3RvcCwKKyAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCisgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSkKKyAgICB7CisgICAgICAgIGxlZnQgPSBvdGhlcl9sZWZ0OworICAgICAgICB0b3AgPSBvdGhlcl90b3A7CisgICAgICAgIHJpZ2h0ID0gb3RoZXJfcmlnaHQ7CisgICAgICAgIGJvdHRvbSA9IG90aGVyX2JvdHRvbTsKKyAgICB9CiAKLQlDTFNUX1JlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKLQl7Ci0JCXRoaXMtPmxlZnQgPSByZWN0LmxlZnQ7Ci0JCXRoaXMtPnRvcCA9IHJlY3QudG9wOwotCQl0aGlzLT5yaWdodCA9IHJlY3QucmlnaHQ7Ci0JCXRoaXMtPmJvdHRvbSA9IHJlY3QuYm90dG9tOwotCX0KKyAgICBDTFNUX1JlY3QoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKKyAgICB7CisgICAgICAgIGxlZnQgPSByZWN0LmxlZnQ7CisgICAgICAgIHRvcCA9IHJlY3QudG9wOworICAgICAgICByaWdodCA9IHJlY3QucmlnaHQ7CisgICAgICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tOworICAgIH0KIAogCXZvaWQgRGVmYXVsdCgpCiAJewpAQCAtNzEsMTAgKzczLDEwIEBACiAKIAljb25zdCBDTFNUX1JlY3Qgb3BlcmF0b3IgPSAoY29uc3QgQ1BERl9SZWN0ICYgcmVjdCkKIAl7Ci0JCXRoaXMtPmxlZnQgPSByZWN0LmxlZnQ7Ci0JCXRoaXMtPnRvcCA9IHJlY3QudG9wOwotCQl0aGlzLT5yaWdodCA9IHJlY3QucmlnaHQ7Ci0JCXRoaXMtPmJvdHRvbSA9IHJlY3QuYm90dG9tOworCQlsZWZ0ID0gcmVjdC5sZWZ0OworCQl0b3AgPSByZWN0LnRvcDsKKwkJcmlnaHQgPSByZWN0LnJpZ2h0OworCQlib3R0b20gPSByZWN0LmJvdHRvbTsKIAogCQlyZXR1cm4gKnRoaXM7CiAJfQpAQCAtOTEsMTUgKzkzLDE0IEBACiAKIAlGWF9GTE9BVCBXaWR0aCgpIGNvbnN0CiAJewotCQlyZXR1cm4gdGhpcy0+cmlnaHQgLSB0aGlzLT5sZWZ0OworCQlyZXR1cm4gcmlnaHQgLSBsZWZ0OwogCX0KIAogCUZYX0ZMT0FUIEhlaWdodCgpIGNvbnN0CiAJewotCQlpZiAodGhpcy0+dG9wID4gdGhpcy0+Ym90dG9tKQotCQkJcmV0dXJuIHRoaXMtPnRvcCAtIHRoaXMtPmJvdHRvbTsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMtPmJvdHRvbSAtIHRoaXMtPnRvcDsKKwkJaWYgKHRvcCA+IGJvdHRvbSkKKwkJCXJldHVybiB0b3AgLSBib3R0b207CisJCXJldHVybiBib3R0b20gLSB0b3A7CiAJfQogCiAJQ1BERl9Qb2ludCBMZWZ0VG9wKCkgY29uc3QKQEAgLTExNCwyMCArMTE1LDIwIEBACiAKIAljb25zdCBDTFNUX1JlY3Qgb3BlcmF0b3IgKz0gKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKIAl7Ci0JCXRoaXMtPmxlZnQgKz0gcG9pbnQueDsKLQkJdGhpcy0+cmlnaHQgKz0gcG9pbnQueDsKLQkJdGhpcy0+dG9wICs9IHBvaW50Lnk7Ci0JCXRoaXMtPmJvdHRvbSArPSBwb2ludC55OworCQlsZWZ0ICs9IHBvaW50Lng7CisJCXJpZ2h0ICs9IHBvaW50Lng7CisJCXRvcCArPSBwb2ludC55OworCQlib3R0b20gKz0gcG9pbnQueTsKIAogCQlyZXR1cm4gKnRoaXM7CiAJfQogCiAJY29uc3QgQ0xTVF9SZWN0IG9wZXJhdG9yIC09IChjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCiAJewotCQl0aGlzLT5sZWZ0IC09IHBvaW50Lng7Ci0JCXRoaXMtPnJpZ2h0IC09IHBvaW50Lng7Ci0JCXRoaXMtPnRvcCAtPSBwb2ludC55OwotCQl0aGlzLT5ib3R0b20gLT0gcG9pbnQueTsKKwkJbGVmdCAtPSBwb2ludC54OworCQlyaWdodCAtPSBwb2ludC54OworCQl0b3AgLT0gcG9pbnQueTsKKwkJYm90dG9tIC09IHBvaW50Lnk7CiAKIAkJcmV0dXJuICp0aGlzOwogCX0KQEAgLTI2MywxMCArMjY0LDEwIEBACiAKIHN0cnVjdCBDUExTVF9TZWxlY3RfSXRlbQogewotCUNQTFNUX1NlbGVjdF9JdGVtKGludDMyX3Qgbkl0ZW1JbmRleCxpbnQzMl90IG5TdGF0ZSkKKwlDUExTVF9TZWxlY3RfSXRlbShpbnQzMl90IG90aGVyX25JdGVtSW5kZXgsIGludDMyX3Qgb3RoZXJfblN0YXRlKQogCXsKLQkJdGhpcy0+bkl0ZW1JbmRleCA9IG5JdGVtSW5kZXg7Ci0JCXRoaXMtPm5TdGF0ZSA9IG5TdGF0ZTsKKwkJbkl0ZW1JbmRleCA9IG90aGVyX25JdGVtSW5kZXg7CisJCW5TdGF0ZSA9IG90aGVyX25TdGF0ZTsKIAl9CiAKIAlpbnQzMl90CQluSXRlbUluZGV4OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oCmluZGV4IGJiYjlmMzUuLjk3YTQ1MjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaAorKysgYi9mcGRmc2RrL2luY2x1ZGUvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpZm5kZWYgRlBERlNES19JTkNMVURFX1BERldJTkRPV19QV0xfTElTVEJPWF9IXwpAQCAtMjEsMTEgKzIxLDExIEBACiAJQ1BXTF9MaXN0X05vdGlmeShDUFdMX0xpc3RCb3ggKiBwTGlzdCk7CiAJdmlydHVhbCB+Q1BXTF9MaXN0X05vdGlmeSgpOwogCi0Jdm9pZAkJCQkJCQlJT25TZXRTY3JvbGxJbmZvWChGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsIAorCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsSW5mb1goRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsCisJCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsCiAJCQkJCQkJCQkJCQlGWF9GTE9BVCBmU21hbGxTdGVwLCBGWF9GTE9BVCBmQmlnU3RlcCl7fQotCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLCBGWF9GTE9BVCBmUGxhdGVNYXgsIAotCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LCAKKwl2b2lkCQkJCQkJCUlPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LAorCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LAogCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApOwogCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCl7fQogCXZvaWQJCQkJCQkJSU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSk7CkBAIC0zNCw3ICszNCw3IEBACiAJdm9pZAkJCQkJCQlJT25JbnZhbGlkYXRlUmVjdChDUERGX1JlY3QgKiBwUmVjdCk7CiAKIHByaXZhdGU6Ci0JQ1BXTF9MaXN0Qm94KgkJCQkJbV9wTGlzdDsJCisJQ1BXTF9MaXN0Qm94KgkJCQkJbV9wTGlzdDsKIH07CiAKIGNsYXNzIFBXTF9DTEFTUyBDUFdMX0xpc3RCb3ggOiBwdWJsaWMgQ1BXTF9XbmQKQEAgLTU5LDE1ICs1OSwxNCBAQAogCiAJdmlydHVhbCB2b2lkCQkJCQlPbk5vdGlmeShDUFdMX1duZCogcFduZCwgRlhfRFdPUkQgbXNnLCBpbnRwdHJfdCB3UGFyYW0gPSAwLCBpbnRwdHJfdCBsUGFyYW0gPSAwKTsKIAl2aXJ0dWFsIHZvaWQJCQkJCVJlUG9zQ2hpbGRXbmQoKTsKLQl2aXJ0dWFsIHZvaWQJCQkJCVNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCxGWF9CT09MIGJSZWZyZXNoID0gVFJVRSk7Ci0JdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCUdldFRleHQoKSBjb25zdDsJCisJdmlydHVhbCBDRlhfV2lkZVN0cmluZwkJCUdldFRleHQoKSBjb25zdDsKIAl2aXJ0dWFsIENQREZfUmVjdAkJCQlHZXRGb2N1c1JlY3QoKSBjb25zdDsKIAl2aXJ0dWFsIHZvaWQJCQkJCVNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7CiAJdmlydHVhbCBGWF9GTE9BVAkJCQlHZXRGb250U2l6ZSgpIGNvbnN0OwogCiAJdm9pZAkJCQkJCQlPbk5vdGlmeVNlbENoYW5nZWQoRlhfQk9PTCBiS2V5RG93biwgRlhfQk9PTCAmIGJFeGl0ICwgRlhfRFdPUkQgbkZsYWcpOwogCi0Jdm9pZAkJCQkJCQlBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZyk7CQorCXZvaWQJCQkJCQkJQWRkU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBzdHJpbmcpOwogCXZvaWQJCQkJCQkJU2V0VG9wVmlzaWJsZUluZGV4KGludDMyX3Qgbkl0ZW1JbmRleCk7CiAJdm9pZAkJCQkJCQlTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCk7CiAJdm9pZAkJCQkJCQlSZXNldENvbnRlbnQoKTsKQEAgLTc1LDcgKzc0LDcgQEAKIAl2b2lkCQkJCQkJCVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOwogCXZvaWQJCQkJCQkJU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKIAl2b2lkCQkJCQkJCVNldEhvdmVyU2VsKEZYX0JPT0wgYkhvdmVyU2VsKTsKLQkKKwogCWludDMyX3QJCQkJCQlHZXRDb3VudCgpIGNvbnN0OwogCUZYX0JPT0wJCQkJCQkJSXNNdWx0aXBsZVNlbCgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRDYXJldEluZGV4KCkgY29uc3Q7CkBAIC04Myw3ICs4Miw3IEBACiAJRlhfQk9PTAkJCQkJCQlJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwogCWludDMyX3QJCQkJCQlHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKIAlpbnQzMl90CQkJCQkJRmluZE5leHQoaW50MzJfdCBuSW5kZXgsRlhfV0NIQVIgbkNoYXIpIGNvbnN0OwotCUNQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7CQorCUNQREZfUmVjdAkJCQkJCUdldENvbnRlbnRSZWN0KCkgY29uc3Q7CiAJRlhfRkxPQVQJCQkJCQlHZXRGaXJzdEhlaWdodCgpIGNvbnN0OwogCUNQREZfUmVjdAkJCQkJCUdldExpc3RSZWN0KCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaW5jbHVkZS9wZGZ3aW5kb3cvUFdMX1duZC5oIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgKaW5kZXggOWYwODllNi4uZTc0ZGM4OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgKKysrIGIvZnBkZnNkay9pbmNsdWRlL3BkZndpbmRvdy9QV0xfV25kLmgKQEAgLTEyNSw3ICsxMjUsNyBAQAogCQluQ29sb3JUeXBlKENPTE9SVFlQRV9SR0IpLCBmQ29sb3IxKHIvMjU1LjBmKSwgZkNvbG9yMihnLzI1NS4wZiksIGZDb2xvcjMoYi8yNTUuMGYpLCBmQ29sb3I0KDApCiAJe30KIAkKLQl2b2lkIENvbnZlcnRDb2xvclR5cGUoaW50MzJfdCBuQ29sb3JUeXBlKTsKKwl2b2lkIENvbnZlcnRDb2xvclR5cGUoaW50MzJfdCBvdGhlcl9uQ29sb3JUeXBlKTsKIAogCS8qCiAJQ09MT1JUWVBFX1RSQU5TUEFSRU5UCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Db21ib0JveC5jcHAKaW5kZXggM2M3NGM5Zi4uZTEwYzk4MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfQ29tYm9Cb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0NvbWJvQm94LmNwcApAQCAtMTYsNyArMTYsNiBAQAogQ0ZGTF9Db21ib0JveDo6Q0ZGTF9Db21ib0JveChDUERGRG9jX0Vudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpIDoKIAlDRkZMX0Zvcm1GaWxsZXIocEFwcCwgcEFubm90KSwgbV9wRm9udE1hcCggTlVMTCApCiB7Ci0JLy9tX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKCBwQW5ub3QsIEdldFN5c3RlbUhhbmRsZXIoKSApOwogICAgICAgICBtX1N0YXRlLm5JbmRleCA9IDA7CiAgICAgICAgIG1fU3RhdGUublN0YXJ0ID0gMDsKICAgICAgICAgbV9TdGF0ZS5uRW5kICAgPSAwOwpAQCAtMjksMTMgKzI4LDYgQEAKIAkJZGVsZXRlIG1fcEZvbnRNYXA7CiAJCW1fcEZvbnRNYXAgPSBOVUxMOwogCX0KLQotLy8gCWZvciAoaW50IGk9MCxzej1tX0lNQm94LkdldFNpemUoKTsgaTxzejsgaSsrKQotLy8gCXsKLS8vIAkJZGVsZXRlIG1fSU1Cb3guR2V0QXQoaSk7Ci0vLyAJfQotLy8gCi0vLyAJbV9JTUJveC5SZW1vdmVBbGwoKTsKIH0KIAogUFdMX0NSRUFURVBBUkFNIENGRkxfQ29tYm9Cb3g6OkdldENyZWF0ZVBhcmFtKCkKQEAgLTUxLDE2ICs0Myw4IEBACiAJCWNwLmR3RmxhZ3MgfD0gUENCU19BTExPV0NVU1RPTVRFWFQ7CiAJfQogCi0JLyoKLQlpZiAobkZsYWdzICYgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFKQotCXsJCQotCQltX2JDb21taXRPblNlbGVjdENoYW5nZSA9IFRSVUU7Ci0JfQotCSovCi0KIAlpZiAoIW1fcEZvbnRNYXApCiAJewotCQlBU1NFUlQodGhpcy0+bV9wQXBwICE9IE5VTEwpOwogCQltX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgR2V0U3lzdGVtSGFuZGxlcigpKTsKIAkJbV9wRm9udE1hcC0+SW5pdGlhbCgpOwogCX0KQEAgLTMxMSwxMCArMjk1LDEwIEBACiAJaWYgKGJSZXN0b3JlVmFsdWUpCiAJewogCQlSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLQkJcFJldCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKwkJcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKIAl9CiAJZWxzZQotCQlwUmV0ID0gdGhpcy0+R2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CisJCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKTsKIAkKIAltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAJCkBAIC0zMzEsNyArMzE1LDcgQEAKIAl7CiAJCWlmIChtX2JWYWxpZCkKIAkJewotCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKKwkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CiAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCiAJCQlpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0Zvcm1GaWxsZXIuY3BwIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKaW5kZXggMWUyZGI3MC4uZDlhOTg0OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfRm9ybUZpbGxlci5jcHAKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OlNldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDUERGX1JlY3QmIHJjV2luZG93KQogewotCWlmIChDUFdMX1duZCogcFduZCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewogCQlwV25kLT5Nb3ZlKENQREZfUmVjdChyY1dpbmRvdyksIFRSVUUsIEZBTFNFKTsKIAl9CkBAIC01Nyw3ICs1Nyw3IEBACiAKIENQREZfUmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkdldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KQogewotCWlmIChDUFdMX1duZCogcFduZCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewogCQlyZXR1cm4gcFduZC0+R2V0V2luZG93UmVjdCgpOwogCX0KQEAgLTcyLDE2ICs3MiwxNSBAQAogCiAJQ1BERl9SZWN0IHJjQW5ub3QgPSBtX3BXaWRnZXQtPkdldFJlY3QoKTsKIAotCWlmIChDUFdMX1duZCogcFduZCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKKwlpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewogCQlDUERGX1JlY3QgcmNXaW5kb3cgPSBwV25kLT5HZXRXaW5kb3dSZWN0KCk7CiAJCXJjQW5ub3QgPSBQV0x0b0ZGTChyY1dpbmRvdyk7CiAJfQogCiAJQ1BERl9SZWN0IHJjV2luID0gcmNBbm5vdDsKLS8vCXBQYWdlVmlldy0+RG9jVG9XaW5kb3cocmNBbm5vdCwgcmNXaW4pOwogCi0JQ1BERl9SZWN0IHJjRm9jdXMgPSB0aGlzLT5HZXRGb2N1c0JveChwUGFnZVZpZXcpOworCUNQREZfUmVjdCByY0ZvY3VzID0gR2V0Rm9jdXNCb3gocFBhZ2VWaWV3KTsKIAlpZiAoIXJjRm9jdXMuSXNFbXB0eSgpKQogCQlyY1dpbi5VbmlvbihyY0ZvY3VzKTsKIApAQCAtOTgsNyArOTcsNyBAQAogCiAJaWYgKENQV0xfV25kICogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKSkKIAl7Ci0JCUNQREZfTWF0cml4IG10ID0gdGhpcy0+R2V0Q3VyTWF0cml4KCk7CisJCUNQREZfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7CiAJCW10LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKIAkJcFduZC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwmbXQpOwogCX0KQEAgLTE0OSw4ICsxNDgsOCBAQAogCWlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKSkKIAl7CQkKIAkJbV9iVmFsaWQgPSBUUlVFOwotCQlGWF9SRUNUIHJlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKLQkJdGhpcy0+SW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOworCQlGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKKwkJSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwogCiAgCQlpZighcmVjdC5Db250YWlucygoaW50KXBvaW50LngsIChpbnQpcG9pbnQueSkpCiAgIAkJCXJldHVybiBGQUxTRTsKQEAgLTE2NSw4ICsxNjQsOCBAQAogewogCWlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCiAJewkKLQkJRlhfUkVDVCByY0ZGTCA9ICB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7Ci0JCXRoaXMtPkludmFsaWRhdGVSZWN0KHJjRkZMLmxlZnQsIHJjRkZMLnRvcCwgcmNGRkwucmlnaHQsIHJjRkZMLmJvdHRvbSk7CisJCUZYX1JFQ1QgcmNGRkwgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisJCUludmFsaWRhdGVSZWN0KHJjRkZMLmxlZnQsIHJjRkZMLnRvcCwgcmNGRkwucmlnaHQsIHJjRkZMLmJvdHRvbSk7CiAJCXBXbmQtPk9uTEJ1dHRvblVwKFduZHRvUFdMKHBQYWdlVmlldywgcG9pbnQpLG5GbGFncyk7CiAJCXJldHVybiBUUlVFOwogCX0KQEAgLTI1MCw3ICsyNDksNyBAQAogewogCWlmIChJc1ZhbGlkKCkpCiAJewotCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSB0aGlzLT5HZXRDdXJQYWdlVmlldygpOworCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCiAJCWlmIChDUFdMX1duZCAqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSkpCkBAIC0yNjYsNyArMjY1LDcgQEAKIHsKIAlpZiAoSXNWYWxpZCgpKQogCXsKLQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKKwkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKIAkJQVNTRVJUKHBQYWdlVmlldyAhPSBOVUxMKTsKIAogCQlpZiAoQ1BXTF9XbmQgKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpKQpAQCAtMzExLDggKzMxMCw4IEBACiAJCiAKIAltX2JWYWxpZCA9IFRSVUU7Ci0JRlhfUkVDVCByY1JlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKLQl0aGlzLT5JbnZhbGlkYXRlUmVjdChyY1JlY3QubGVmdCwgcmNSZWN0LnRvcCwgcmNSZWN0LnJpZ2h0LCByY1JlY3QuYm90dG9tKTsKKwlGWF9SRUNUIHJjUmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOworCUludmFsaWRhdGVSZWN0KHJjUmVjdC5sZWZ0LCByY1JlY3QudG9wLCByY1JlY3QucmlnaHQsIHJjUmVjdC5ib3R0b20pOwogCQogCXJldHVybiBUUlVFOwogfQpAQCAtMzIxLDcgKzMyMCw3IEBACiB7CiAJaWYgKElzVmFsaWQoKSkKIAl7Ci0JCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHRoaXMtPkdldEN1clBhZ2VWaWV3KCk7CisJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CiAJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAKIAkJQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKTsKQEAgLTQ0Niw3ICs0NDUsNyBAQAogCiAJCQlpZiAocFByaXZhdGVEYXRhLT5uV2lkZ2V0QWdlICE9IG1fcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQogCQkJewotCQkJCXJldHVybiB0aGlzLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG1fcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSA9PSBwUHJpdmF0ZURhdGEtPm5WYWx1ZUFnZSk7CisJCQkJcmV0dXJuIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgbV9wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IHBQcml2YXRlRGF0YS0+blZhbHVlQWdlKTsKIAkJCX0KIAkJfQogCQllbHNlCkBAIC02NzcsNyArNjc2LDcgQEAKIAkJaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKIAkJaWYgKCFiUkMpCiAJCXsKLQkJCXRoaXMtPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworCQkJUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CiAJCQlyZXR1cm4gVFJVRTsKIAkJfQogCkBAIC02ODUsNyArNjg0LDcgQEAKIAkJaWYgKGJFeGl0KSByZXR1cm4gVFJVRTsKIAkJaWYgKCFiUkMpCiAJCXsKLQkJCXRoaXMtPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgRkFMU0UpOworCQkJUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CiAJCQlyZXR1cm4gVFJVRTsKIAkJfQogCkBAIC03NjcsOCArNzY2LDggQEAKIHsKIAltX2JWYWxpZCA9IEZBTFNFOwogCQotCUZYX1JFQ1QgcmNSZWN0ID0gdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBtX3BXaWRnZXQpOwotCXRoaXMtPkludmFsaWRhdGVSZWN0KHJjUmVjdC5sZWZ0LCByY1JlY3QudG9wLCByY1JlY3QucmlnaHQsIHJjUmVjdC5ib3R0b20pOworCUZYX1JFQ1QgcmNSZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBtX3BXaWRnZXQpOworCUludmFsaWRhdGVSZWN0KHJjUmVjdC5sZWZ0LCByY1JlY3QudG9wLCByY1JlY3QucmlnaHQsIHJjUmVjdC5ib3R0b20pOwogCiAJaWYoYkRlc3Ryb3lQREZXaW5kb3cpCiAgCQlEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7CkBAIC04MjMsMjEgKzgyMiwxOCBAQAogdm9pZCBDRkZMX0J1dHRvbjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQogewogCW1fYk1vdXNlSW4gPSBUUlVFOwotCUZYX1JFQ1QgcmVjdCA9IHRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOwotCXRoaXMtPkludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKLS8vCTo6SW52YWxpZGF0ZVJlY3QocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCAmdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpLCBUUlVFKTsKKwlGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKKwlJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiB9CiAKIHZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90KQogewogCW1fYk1vdXNlSW4gPSBGQUxTRTsKIAotCUZYX1JFQ1QgcmVjdCA9IHRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldyxwQW5ub3QpOwotCXRoaXMtPkludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKLS8vCTo6SW52YWxpZGF0ZVJlY3QocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCAmdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpLCBUUlVFKTsKKwlGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcscEFubm90KTsKKwlJbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7CiAJRW5kVGltZXIoKTsKIAlBU1NFUlQobV9wV2lkZ2V0ICE9IE5VTEwpOwotLy8JbV9wV2lkZ2V0LT5IaWRlSGludCgpOwogfQogCiBGWF9CT09MIENGRkxfQnV0dG9uOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9VSU5UIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCkBAIC04NDgsOSArODQ0LDggQEAKIAogCW1fYk1vdXNlRG93biA9IFRSVUU7CiAJbV9iVmFsaWQgPSBUUlVFOwotCUZYX1JFQ1QgcmVjdCA9IHRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLQl0aGlzLT5JbnZhbGlkYXRlUmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSk7Ci0vLwk6OkludmFsaWRhdGVSZWN0KHBQYWdlVmlldy0+R2V0UGFnZVZpZXdXbmQoKSwgJnRoaXMtPkdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KSwgVFJVRSk7CisJRlhfUkVDVCByZWN0ID0gR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOworCUludmFsaWRhdGVSZWN0KHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtODY0LDkgKzg1OSw4IEBACiAJbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiAJCiAKLQlGWF9SRUNUIHJlY3QgPSB0aGlzLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7Ci0JdGhpcy0+SW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotLy8gCTo6SW52YWxpZGF0ZVJlY3QocFBhZ2VWaWV3LT5HZXRQYWdlVmlld1duZCgpLCAmdGhpcy0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpLCBUUlVFKTsKKwlGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisJSW52YWxpZGF0ZVJlY3QocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwogCXJldHVybiBUUlVFOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9MaXN0Qm94LmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCmluZGV4IDZiMGFhMWIuLjZlZTYwOGEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX0xpc3RCb3guY3BwCkBAIC00NSwxMSArNDUsNiBAQAogCQljcC5kd0ZsYWdzIHw9IFBMQlNfTVVMVElQTEVTRUw7CiAJfQogCi0JaWYgKGR3RmllbGRGbGFnICYgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFKQotCXsKLQkJLy9jcC5kd0ZsYWdzIHw9IFBMQlNfQ09NTUlUU0VMRUNURURWQUxVRTsKLQl9Ci0KIAljcC5kd0ZsYWdzIHw9IFBXU19WU0NST0xMOwogCiAJaWYgKGNwLmR3RmxhZ3MgJiBQV1NfQVVUT0ZPTlRTSVpFKQpAQCAtNTcsOCArNTIsNyBAQAogCiAJaWYgKCFtX3BGb250TWFwKQogCXsKLQkJQVNTRVJUKHRoaXMtPm1fcEFwcCAhPSBOVUxMKTsKLQkJbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCkpOy8vLCBJU3lzdGVtSGFuZGxlOjpHZXRTeXN0ZW1IYW5kbGVyKG1fcEFwcCkpOworCQltX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgbV9wQXBwLT5HZXRTeXNIYW5kbGVyKCkpOwogCQltX3BGb250TWFwLT5Jbml0aWFsKCk7CiAJfQogCWNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKQEAgLTI4MywxMCArMjc3LDEwIEBACiAJaWYgKGJSZXN0b3JlVmFsdWUpCiAJewogCQlSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLQkJcFJldCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKKwkJcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIEZBTFNFKTsKIAl9CiAJZWxzZQotCQlwUmV0ID0gdGhpcy0+R2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CisJCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBUUlVFKTsKIAkKIAltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAJCkBAIC0zMDMsNyArMjk3LDcgQEAKIAl7CiAJCWlmIChtX2JWYWxpZCkKIAkJewotCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKKwkJCUNQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KCk7CiAJCQlBU1NFUlQocFBhZ2VWaWV3ICE9IE5VTEwpOwogCiAJCQlpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9Ob3RpZnkuY3BwCmluZGV4IDQwNmFhOGQuLjRmZDJiZDggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX05vdGlmeS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfTm90aWZ5LmNwcApAQCAtMTExLDE1ICsxMTEsMTcgQEAKIAogRlhfQk9PTAlDRkZMX05vdGlmeTo6RG9BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgZUFBVCwgRlhfQk9PTCAmIGJFeGl0KQogewotCWlmICh0aGlzLT5tX2JEb0FjdGlvbmluZykgcmV0dXJuIEZBTFNFOwotCQotCUNQREZfQWN0aW9uIGFjdGlvbjsKLQlpZiAoIUZpbmRBQWN0aW9uKGVBQVQsYWN0aW9uKSkgcmV0dXJuIEZBTFNFOworICAgIGlmIChtX2JEb0FjdGlvbmluZykKKyAgICAgICAgcmV0dXJuIEZBTFNFOwogCi0JdGhpcy0+bV9iRG9BY3Rpb25pbmcgPSBUUlVFOwkKLQlFeGVjdXRlQWN0aW9uVHJlZShlQUFULGFjdGlvbixiRXhpdCk7CQotCXRoaXMtPm1fYkRvQWN0aW9uaW5nID0gRkFMU0U7Ci0JcmV0dXJuIFRSVUU7CisgICAgQ1BERl9BY3Rpb24gYWN0aW9uOworICAgIGlmICghRmluZEFBY3Rpb24oZUFBVCwgYWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgbV9iRG9BY3Rpb25pbmcgPSBUUlVFOworICAgIEV4ZWN1dGVBY3Rpb25UcmVlKGVBQVQsYWN0aW9uLGJFeGl0KTsKKyAgICBtX2JEb0FjdGlvbmluZyA9IEZBTFNFOworICAgIHJldHVybiBUUlVFOwogfQogCiBGWF9CT09MCUNGRkxfTm90aWZ5OjpFeGVjdXRlQWN0aW9uVHJlZShDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVBQVQsQ1BERl9BY3Rpb24gJiBhY3Rpb24sIEZYX0JPT0wmIGJFeGl0KQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcCBiL2ZwZGZzZGsvc3JjL2Zvcm1maWxsZXIvRkZMX1RleHRGaWVsZC5jcHAKaW5kZXggY2QwMjk5Yy4uMzNmYjc1MSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZm9ybWZpbGxlci9GRkxfVGV4dEZpZWxkLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mb3JtZmlsbGVyL0ZGTF9UZXh0RmllbGQuY3BwCkBAIC05MSw4ICs5MSw3IEBACiAKIAlpZiAoIW1fcEZvbnRNYXApCiAJewotCQlBU1NFUlQodGhpcy0+bV9wQXBwICE9IE5VTEwpOwotCQltX3BGb250TWFwID0gbmV3IENCQV9Gb250TWFwKG1fcFdpZGdldCwgLypJU3lzdGVtSGFuZGxlOjpHZXRTeXN0ZW1IYW5kbGVyKG1fcEFwcCkqL21fcEFwcC0+R2V0U3lzSGFuZGxlcigpKTsKKwkJbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIG1fcEFwcC0+R2V0U3lzSGFuZGxlcigpKTsKIAkJbV9wRm9udE1hcC0+SW5pdGlhbCgpOwogCX0KIAljcC5wRm9udE1hcCA9IG1fcEZvbnRNYXA7CkBAIC0xNDIsNyArMTQxLDcgQEAKIAljYXNlIEZXTF9WS0VZX1JldHVybjoKICAJCWlmICghKG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkpCiAgCQl7Ci0gCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gdGhpcy0+R2V0Q3VyUGFnZVZpZXcoKTsKKyAJCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldygpOwogIAkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAgCQkJbV9iVmFsaWQgPSAhbV9iVmFsaWQ7CiAJCQlDUERGX1JlY3QgcmNBbm5vdCA9IHBBbm5vdC0+R2V0UmVjdCgpOwpAQCAtMTY5LDcgKzE2OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgRldMX1ZLRVlfRXNjYXBlOgogCQl7Ci0JCQlDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSB0aGlzLT5HZXRDdXJQYWdlVmlldygpOworCQkJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcoKTsKIAkJCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7CiAJCQlFc2NhcGVGaWxsZXIocFBhZ2VWaWV3LFRSVUUpOwogCQkJcmV0dXJuIFRSVUU7CkBAIC0zMDgsMTAgKzMwNywxMCBAQAogCWlmIChiUmVzdG9yZVZhbHVlKQogCXsKIAkJUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0JCXBSZXQgPSB0aGlzLT5HZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CisJCXBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBGQUxTRSk7CiAJfQogCWVsc2UKLQkJcFJldCA9IHRoaXMtPkdldFBERldpbmRvdyhwUGFnZVZpZXcsIFRSVUUpOworCQlwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgVFJVRSk7CiAKIAltX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CiAJCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mcGRmcHBvLmNwcCBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCmluZGV4IDBiM2NhMDkuLmE1MTVlM2UgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZwZGZwcG8uY3BwCkBAIC0xODAsNyArMTgwLDcgQEAKIAkJCiAJCXBNYXBQdHJUb1B0ci0+U2V0QXQoKHZvaWQqKSh1aW50cHRyX3QpZHdPbGRQYWdlT2JqLCAodm9pZCopKHVpbnRwdHJfdClkd05ld1BhZ2VPYmopOwogCi0JCXRoaXMtPlVwZGF0ZVJlZmVyZW5jZShwQ3VyUGFnZURpY3QsIHBEZXN0UERGRG9jLCBwTWFwUHRyVG9QdHIpOworCQlVcGRhdGVSZWZlcmVuY2UocEN1clBhZ2VEaWN0LCBwRGVzdFBERkRvYywgcE1hcFB0clRvUHRyKTsKIAkJY3VycGFnZSsrOwogCX0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKaW5kZXggMWY2MWE4Yy4uYjc5MDU4NSAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19hY3Rpb25oYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL3NyYy9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCkBAIC0xMDYsMTQgKzEwNiwxNCBAQAogCQkJCQkJCUNQREZTREtfRG9jdW1lbnQqIHBEb2N1bWVudCkKIHsKIAlDRlhfUHRyTGlzdCBsaXN0OwotCXJldHVybiB0aGlzLT5FeGVjdXRlQm9va01hcmsoYWN0aW9uLCBwRG9jdW1lbnQsIHBCb29rTWFyaywgbGlzdCk7CisJcmV0dXJuIEV4ZWN1dGVCb29rTWFyayhhY3Rpb24sIHBEb2N1bWVudCwgcEJvb2tNYXJrLCBsaXN0KTsKIH0KIAogRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX1NjcmVlbihjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLCBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAJCQkJCQkJCQkJQ1BERlNES19Eb2N1bWVudCogcERvY3VtZW50LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKQogewogCUNGWF9QdHJMaXN0IGxpc3Q7Ci0JcmV0dXJuIHRoaXMtPkV4ZWN1dGVTY3JlZW5BY3Rpb24oYWN0aW9uLCB0eXBlLCBwRG9jdW1lbnQsIHBTY3JlZW4sIGxpc3QpOworCXJldHVybiBFeGVjdXRlU2NyZWVuQWN0aW9uKGFjdGlvbiwgdHlwZSwgcERvY3VtZW50LCBwU2NyZWVuLCBsaXN0KTsKIH0KIAogRlhfQk9PTAlDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0xpbmsoY29uc3QgQ1BERl9BY3Rpb24mIGFjdGlvbiwKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcCBiL2ZwZGZzZGsvc3JjL2ZzZGtfYW5ub3RoYW5kbGVyLmNwcAppbmRleCBhNDRiMzRiLi4zMGFiZDA4IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9mc2RrX2Fubm90aGFuZGxlci5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19hbm5vdGhhbmRsZXIuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9mc2RrX2RlZmluZS5oIgpAQCAtMzMsOSArMzMsOSBAQAogdm9pZAlDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6UmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpCiB7CiAJQVNTRVJUKHBBbm5vdEhhbmRsZXIgIT0gTlVMTCk7Ci0JCisKIAlBU1NFUlQoR2V0QW5ub3RIYW5kbGVyKHBBbm5vdEhhbmRsZXItPkdldFR5cGUoKSkgPT0gTlVMTCk7Ci0JCisKIAltX0hhbmRsZXJzLkFkZChwQW5ub3RIYW5kbGVyKTsKIAltX21hcFR5cGUySGFuZGxlci5TZXRBdChwQW5ub3RIYW5kbGVyLT5HZXRUeXBlKCksICh2b2lkKilwQW5ub3RIYW5kbGVyKTsKIH0KQEAgLTQzLDkgKzQzLDkgQEAKIHZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OlVuUmVnaXN0ZXJBbm5vdEhhbmRsZXIoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIpCiB7CiAJQVNTRVJUKHBBbm5vdEhhbmRsZXIgIT0gTlVMTCk7Ci0JCisKIAltX21hcFR5cGUySGFuZGxlci5SZW1vdmVLZXkocEFubm90SGFuZGxlci0+R2V0VHlwZSgpKTsKLQkKKwogCWZvciAoaW50IGk9MCwgc3o9bV9IYW5kbGVycy5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAl7CiAJCWlmIChtX0hhbmRsZXJzLkdldEF0KGkpID09IHBBbm5vdEhhbmRsZXIpCkBAIC02MCwyMSArNjAsMjEgQEAKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCUFTU0VSVChwUGFnZVZpZXcgIT0gTlVMTCk7Ci0JCisKIAlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90LT5HZXRTdWJUeXBlKCkpKQogCXsKIAkJcmV0dXJuIHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBBbm5vdCwgcFBhZ2VWaWV3KTsKIAl9Ci0JCisKIAlyZXR1cm4gbmV3IENQREZTREtfQW5ub3QocEFubm90LCBwUGFnZVZpZXcpOwogfQogCiB2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KQogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCisKIAlwQW5ub3QtPkdldFBERlBhZ2UoKTsKLQkKKwogCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogCXsKIAkJcEFubm90SGFuZGxlci0+T25SZWxlYXNlKHBBbm5vdCk7CkBAIC04OSwxMyArODksMTMgQEAKIHZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uQ3JlYXRlKENQREZTREtfQW5ub3QqIHBBbm5vdCkKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQorCiAJQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOwotCQorCiAJQ1BERlNES19EYXRlVGltZSBjdXJUaW1lOwogCXBQREZBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0U3RyaW5nKCJNIiwgY3VyVGltZS5Ub1BERkRhdGVUaW1lU3RyaW5nKCkpOwogCXBQREZBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldEF0TnVtYmVyKCJGIiwgMCk7Ci0JCisKIAlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKIAl7CiAJCXBBbm5vdEhhbmRsZXItPk9uQ3JlYXRlKHBBbm5vdCk7CkBAIC0xMDUsNyArMTA1LDcgQEAKIHZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKKwogCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogCXsKIAkJcEFubm90SGFuZGxlci0+T25Mb2FkKHBBbm5vdCk7CkBAIC0xMTUsMjQgKzExNSwyNCBAQAogSVBERlNES19Bbm5vdEhhbmRsZXIqIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpHZXRBbm5vdEhhbmRsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSBjb25zdAogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCisKIAlDUERGX0Fubm90KiBwUERGQW5ub3QgPSBwQW5ub3QtPkdldFBERkFubm90KCk7CiAJQVNTRVJUKHBQREZBbm5vdCAhPSBOVUxMKTsKLQkKKwogCXJldHVybiBHZXRBbm5vdEhhbmRsZXIocFBERkFubm90LT5HZXRTdWJUeXBlKCkpOwogfQogCiBJUERGU0RLX0Fubm90SGFuZGxlciogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldEFubm90SGFuZGxlcihjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1R5cGUpIGNvbnN0CiB7CiAJdm9pZCogcFJldCA9IE5VTEw7Ci0JbV9tYXBUeXBlMkhhbmRsZXIuTG9va3VwKHNUeXBlLCBwUmV0KTsJCisJbV9tYXBUeXBlMkhhbmRsZXIuTG9va3VwKHNUeXBlLCBwUmV0KTsKIAlyZXR1cm4gKElQREZTREtfQW5ub3RIYW5kbGVyKilwUmV0OwogfQogCiB2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UsRlhfRFdPUkQgZHdGbGFncykKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQorCiAJaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCiAJewogCQlwQW5ub3RIYW5kbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgZHdGbGFncyk7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIEZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCisKIAlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKIAl7CiAJCXJldHVybiBwQW5ub3RIYW5kbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25MQnV0dG9uRGJsQ2xrKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQorCiAJaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCiAJewogCQlyZXR1cm4gcEFubm90SGFuZGxlci0+T25MQnV0dG9uRGJsQ2xrKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKQEAgLTE3Nyw3ICsxNzcsNyBAQAogRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZU1vdmUoQ1BERlNES19QYWdlVmlldyAqIHBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7Ci0JCisKIAlpZiAoSVBERlNES19Bbm5vdEhhbmRsZXIqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXIocEFubm90KSkKIAl7CiAJCXJldHVybiBwQW5ub3RIYW5kbGVyLT5Pbk1vdXNlTW92ZShwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CkBAIC0xODcsNyArMTg3LDcgQEAKIEZYX0JPT0wgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VXaGVlbChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgc2hvcnQgekRlbHRhLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQorCiAJaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCiAJewogCQlyZXR1cm4gcEFubm90SGFuZGxlci0+T25Nb3VzZVdoZWVsKHBQYWdlVmlldywgcEFubm90LG5GbGFncyx6RGVsdGEsIHBvaW50KTsKQEAgLTE5Nyw3ICsxOTcsNyBAQAogRlhfQk9PTCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25SQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKKwogCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogCXsKIAkJcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uUkJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwpAQCAtMjA3LDcgKzIwNyw3IEBACiBGWF9CT09MIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFncywgY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKKwogCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogCXsKIAkJcmV0dXJuIHBBbm5vdEhhbmRsZXItPk9uUkJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LCBuRmxhZ3MsIHBvaW50KTsKQEAgLTIxOCw3ICsyMTgsNyBAQAogdm9pZCBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKKwogCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogCXsKIAkJcEFubm90SGFuZGxlci0+T25Nb3VzZUVudGVyKHBQYWdlVmlldywgcEFubm90LCBuRmxhZyk7CkBAIC0yMjksNyArMjI5LDcgQEAKIHZvaWQgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkFubm90X09uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcgKiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKKwogCWlmIChJUERGU0RLX0Fubm90SGFuZGxlciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlcihwQW5ub3QpKQogCXsKIAkJcEFubm90SGFuZGxlci0+T25Nb3VzZUV4aXQocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKQEAgLTMwMCwyNCArMzAwLDI0IEBACiAJCQlyZXR1cm4gRkFMU0U7CiAJCX0KIAl9Ci0JCisKIAlyZXR1cm4gRkFMU0U7CiB9CiAKIEZYX0JPT0wJCQlDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfT25LaWxsRm9jdXMoQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwotCQorCiAJaWYgKElQREZTREtfQW5ub3RIYW5kbGVyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCkpCiAJewogCQlpZiAocEFubm90SGFuZGxlci0+T25LaWxsRm9jdXMocEFubm90LCBuRmxhZykpCi0JCXsJCisJCXsKIAkJCXJldHVybiBUUlVFOwogCQl9CiAJCWVsc2UKIAkJCXJldHVybiBGQUxTRTsKIAl9Ci0JCisKIAlyZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTM0NCwxMyArMzQ0LDggQEAKIAogQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldE5leHRBbm5vdChDUERGU0RLX0Fubm90KiBwU0RLQW5ub3QsRlhfQk9PTCBiTmV4dCkKIHsKLQkgQ0JBX0Fubm90SXRlcmF0b3IgYWkocFNES0Fubm90LT5HZXRQYWdlVmlldygpLCAiV2lkZ2V0IiwgIiIpOwotCi0JIENQREZTREtfQW5ub3QqIHBOZXh0ID0gYk5leHQgPyAKLQkJIGFpLkdldE5leHRBbm5vdChwU0RLQW5ub3QpIDogCi0JCWFpLkdldFByZXZBbm5vdChwU0RLQW5ub3QpOwotCQotCQlyZXR1cm4gcE5leHQ7CisgICAgQ0JBX0Fubm90SXRlcmF0b3IgYWkocFNES0Fubm90LT5HZXRQYWdlVmlldygpLCAiV2lkZ2V0IiwgIiIpOworICAgIHJldHVybiBiTmV4dCA/IGFpLkdldE5leHRBbm5vdChwU0RLQW5ub3QpIDogYWkuR2V0UHJldkFubm90KHBTREtBbm5vdCk7CiB9CiAKIEZYX0JPT0wgQ1BERlNES19CRkFubm90SGFuZGxlcjo6Q2FuQW5zd2VyKENQREZTREtfQW5ub3QqIHBBbm5vdCkKQEAgLTM1OCw3ICszNTMsNyBAQAogCUFTU0VSVChwQW5ub3QpOwogCUFTU0VSVChwQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0Iik7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtMzc1LDEzICszNzAsMTMgQEAKIAkJewogCQkJQ1BERl9QYWdlKiBwUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKIAkJCUFTU0VSVChwUGFnZSAhPSBOVUxMKTsKLQkJCQorCiAJCQlDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CiAJCQlBU1NFUlQocERvY3VtZW50ICE9IE5VTEwpOwotCQkJCisKIAkJCUZYX0RXT1JEIGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOwotCQkJcmV0dXJuIChkd1Blcm1pc3Npb25zJkZQREZQRVJNX0ZJTExfRk9STSkgfHwgCi0JCQkJKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fQU5OT1RfRk9STSkgfHwgCisJCQlyZXR1cm4gKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fRklMTF9GT1JNKSB8fAorCQkJCShkd1Blcm1pc3Npb25zJkZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8CiAgCQkJKGR3UGVybWlzc2lvbnMmRlBERlBFUk1fQU5OT1RfRk9STSk7CiAJCX0KIAl9CkBAIC0zOTMsMTIgKzM4OCwxMiBAQAogewogCUFTU0VSVChwUGFnZSAhPSBOVUxMKTsKIAlwUGFnZS0+R2V0UERGRG9jdW1lbnQoKTsKLQkKKwogCUNQREZTREtfRG9jdW1lbnQqIHBTREtEb2MgID0gbV9wQXBwLT5HZXRDdXJyZW50RG9jKCk7CiAJQVNTRVJUKHBTREtEb2MpOwogCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gKENQREZTREtfSW50ZXJGb3JtKilwU0RLRG9jLT5HZXRJbnRlckZvcm0oKTsKIAlBU1NFUlQocEludGVyRm9ybSAhPSBOVUxMKTsKLQkKKwogCUNQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gTlVMTDsKIAlpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBDUERGU0RLX1dpZGdldDo6R2V0Rm9ybUNvbnRyb2wocEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCksIHBBbm5vdC0+R2V0QW5ub3REaWN0KCkpKQogCXsKQEAgLTQwOCw3ICs0MDMsNyBAQAogCQlpZihwUERGSW50ZXJGb3JtICYmIHBQREZJbnRlckZvcm0tPk5lZWRDb25zdHJ1Y3RBUCgpKQogCQkJcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKE5VTEwsRkFMU0UpOwogCX0KLQkKKwogCXJldHVybiBwV2lkZ2V0OwogfQogCkBAIC00MTgsMTQgKzQxMywxNCBAQAogCiAJaWYgKG1fcEZvcm1GaWxsZXIpCiAJCW1fcEZvcm1GaWxsZXItPk9uRGVsZXRlKHBBbm5vdCk7Ci0JCisKIAlDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwogCUNQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7CiAJQVNTRVJUKHBJbnRlckZvcm0gIT0gTlVMTCk7Ci0JCisKIAlDUERGX0Zvcm1Db250cm9sKiBwQ3Ryb2wgPSBwV2lkZ2V0LT5HZXRGb3JtQ29udHJvbCgpOwogCXBJbnRlckZvcm0tPlJlbW92ZU1hcChwQ3Ryb2wpOwotCQorCiAKIAlkZWxldGUgcFdpZGdldDsKIH0KQEAgLTQzNSw3ICs0MzAsNyBAQAogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJCXBBbm5vdC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIE5VTEwpOwpAQCAtNDQ5LDExICs0NDQsMTEgQEAKIAl9CiB9CiAKLXZvaWQgQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZykgCit2b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQorCiAJaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQogCXsKIAl9CkBAIC00NjIsMTQgKzQ1NywxNCBAQAogCQlpZiAobV9wRm9ybUZpbGxlcikKIAkJCSBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlRW50ZXIocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFnKTsKIAl9Ci0JCisKIAogfQotdm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpIAordm9pZCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWcpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQorCiAJaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQogCXsKIAl9CkBAIC00NzgsMTMgKzQ3MywxMyBAQAogCQlpZiAobV9wRm9ybUZpbGxlcikKIAkJCSBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlRXhpdChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWcpOwogCX0KLQkKKwogfQogRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbkxCdXR0b25Eb3duKENQREZTREtfUGFnZVZpZXcgKnBQYWdlVmlldywgQ1BERlNES19Bbm5vdCogcEFubm90LCBGWF9EV09SRCBuRmxhZ3MsIGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtNDkzLDcgKzQ4OCw3IEBACiAJCWlmIChtX3BGb3JtRmlsbGVyKQogCQkJcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uTEJ1dHRvbkRvd24ocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCX0KLQkKKwogCXJldHVybiBGQUxTRTsKIH0KIApAQCAtNTAxLDcgKzQ5Niw3IEBACiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQorCiAJaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQogCXsKIAl9CkBAIC01MTAsNyArNTA1LDcgQEAKIAkJaWYgKG1fcEZvcm1GaWxsZXIpCiAJCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCX0KLQkKKwogCXJldHVybiBGQUxTRTsKIH0KIApAQCAtNTE4LDcgKzUxMyw3IEBACiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQorCiAJaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQogCXsKIAl9CkBAIC01MjcsMTIgKzUyMiwxMiBAQAogCQlpZiAobV9wRm9ybUZpbGxlcikKIAkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkxCdXR0b25EYmxDbGsocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgcG9pbnQpOwogCX0KLQkKKwogCXJldHVybiBGQUxTRTsKIH0KIAogRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKLXsJCit7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwogCkBAIC01NTQsNyArNTQ5LDcgQEAKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCisKIAlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCiAJewogCX0KQEAgLTU2Myw3ICs1NTgsNyBAQAogCQlpZiAobV9wRm9ybUZpbGxlcikKIAkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5Pbk1vdXNlV2hlZWwocFBhZ2VWaWV3LCBwQW5ub3QsIG5GbGFncywgekRlbHRhLHBvaW50KTsKIAl9Ci0JCisKIAlyZXR1cm4gRkFMU0U7CiB9CiAKQEAgLTU3MSw3ICs1NjYsNyBAQAogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtNTgwLDE0ICs1NzUsMTQgQEAKIAkJaWYgKG1fcEZvcm1GaWxsZXIpCiAJCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25SQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAJfQotCQorCiAJcmV0dXJuIEZBTFNFOwogfQogRlhfQk9PTCBDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPblJCdXR0b25VcChDUERGU0RLX1BhZ2VWaWV3ICpwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCwgRlhfRFdPUkQgbkZsYWdzLCBjb25zdCBDUERGX1BvaW50JiBwb2ludCkKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCisKIAlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCiAJewogCX0KQEAgLTU5Niw3ICs1OTEsNyBAQAogCQlpZiAobV9wRm9ybUZpbGxlcikKIAkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PblJCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAJfQotCQorCiAJcmV0dXJuIEZBTFNFOwogfQogCkBAIC02MDQsNyArNTk5LDcgQEAKIHsKIAlBU1NFUlQocEFubm90ICE9IE5VTEwpOwogCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCisKIAlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCiAJewogCX0KQEAgLTYxMyw3ICs2MDgsNyBAQAogCQlpZiAobV9wRm9ybUZpbGxlcikKIAkJCXJldHVybiBtX3BGb3JtRmlsbGVyLT5PbkNoYXIocEFubm90LG5DaGFyLCBuRmxhZ3MpOwogCX0KLQkKKwogCXJldHVybiBGQUxTRTsKIH0KIApAQCAtNjIxLDcgKzYxNiw3IEBACiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKIAlDRlhfQnl0ZVN0cmluZyBzU3ViVHlwZSA9IHBBbm5vdC0+R2V0U3ViVHlwZSgpOwotCQorCiAJaWYgKHNTdWJUeXBlID09IEJGRlRfU0lHTkFUVVJFKQogCXsKIAl9CkBAIC02MzAsNyArNjI1LDcgQEAKIAkJaWYgKG1fcEZvcm1GaWxsZXIpCiAJCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25LZXlEb3duKHBBbm5vdCxuS2V5Q29kZSwgbkZsYWcpOwogCX0KLQkKKwogCXJldHVybiBGQUxTRTsKIH0KIApAQCAtNjM5LDExICs2MzQsMTEgQEAKIAogCXJldHVybiBGQUxTRTsKIH0KLXZvaWQJQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KSAKK3ZvaWQJQ1BERlNES19CRkFubm90SGFuZGxlcjo6T25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KQogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtNjU3LDkgKzY1Miw5IEBACiB2b2lkIENQREZTREtfQkZBbm5vdEhhbmRsZXI6Ok9uTG9hZChDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7CiAJQVNTRVJUKHBBbm5vdCAhPSBOVUxMKTsKLQkKKwogCUNGWF9CeXRlU3RyaW5nIHNTdWJUeXBlID0gcEFubm90LT5HZXRTdWJUeXBlKCk7Ci0JCisKIAlpZiAoc1N1YlR5cGUgPT0gQkZGVF9TSUdOQVRVUkUpCiAJewogCX0KQEAgLTY4OSw3ICs2ODQsNyBAQAogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtNjk4LDE0ICs2OTMsMTQgQEAKIAkJaWYgKG1fcEZvcm1GaWxsZXIpCiAJCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+T25TZXRGb2N1cyhwQW5ub3QsbkZsYWcpOwogCX0KLQkKKwogCXJldHVybiBUUlVFOwogfQogRlhfQk9PTAlDUERGU0RLX0JGQW5ub3RIYW5kbGVyOjpPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90KiBwQW5ub3QsIEZYX0RXT1JEIG5GbGFnKQogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtNzE0LDcgKzcwOSw3IEBACiAJCWlmIChtX3BGb3JtRmlsbGVyKQogCQkJcmV0dXJuIG1fcEZvcm1GaWxsZXItPk9uS2lsbEZvY3VzKHBBbm5vdCxuRmxhZyk7CiAJfQotCQorCiAJcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTcyMiw3ICs3MTcsNyBAQAogewogCUFTU0VSVChwQW5ub3QgIT0gTlVMTCk7CiAJQ0ZYX0J5dGVTdHJpbmcgc1N1YlR5cGUgPSBwQW5ub3QtPkdldFN1YlR5cGUoKTsKLQkKKwogCWlmIChzU3ViVHlwZSA9PSBCRkZUX1NJR05BVFVSRSkKIAl7CiAJfQpAQCAtNzMyLDcgKzcyNyw3IEBACiAJCQlyZXR1cm4gbV9wRm9ybUZpbGxlci0+R2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpOwogCiAJfQotCQorCiAJcmV0dXJuIENQREZfUmVjdCgwLDAsMCwwKTsKIH0KIApAQCAtNzYwLDEwNyArNzU1LDEwNiBAQAogCUluaXRJdGVyYXRvckFubm90TGlzdChwUGFnZVZpZXcscExpc3QpOwogfQogCi1DUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdCAoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIAorQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpOZXh0QW5ub3QgKGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KQogewotCQotCWludCBpbmRleD0tMTsKLQlpbnQgbkNvdW50PXRoaXMtPm1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTsKLQlpZihwQ3VycmVudCl7CisKKwlpbnQgaW5kZXggPSAtMTsKKwlpbnQgbkNvdW50ID0gbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOworCWlmIChwQ3VycmVudCkgewogCQlmb3IoaW50IGk9MDtpPG5Db3VudDtpKyspewogCQkJQ1BERlNES19Bbm5vdCAqIHBSZWFkZXJBbm5vdD0gKENQREZTREtfQW5ub3QgKiltX3BJdGVyYXRvckFubm90TGlzdC5HZXRBdChpKTsKLQkJCWlmKHBSZWFkZXJBbm5vdCA9PXBDdXJyZW50KXsJCQkKKwkJCWlmKHBSZWFkZXJBbm5vdCA9PXBDdXJyZW50KXsKIAkJCQlpbmRleD1pOwogCQkJCWJyZWFrOwotCQkJfQkJCQorCQkJfQogCQl9Ci0JfQkKKwl9CiAJcmV0dXJuIE5leHRBbm5vdChpbmRleCk7CiB9CiBDUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXZBbm5vdCAoY29uc3QgQ1BERlNES19Bbm5vdCpwQ3VycmVudCkKIHsKLQkKLQlpbnQgaW5kZXg9LTE7Ci0JaW50IG5Db3VudD10aGlzLT5tX3BJdGVyYXRvckFubm90TGlzdC5HZXRTaXplKCk7CisJaW50IGluZGV4ID0gLTE7CisJaW50IG5Db3VudCA9IG1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTsKIAlpZihwQ3VycmVudCl7CiAJCWZvcihpbnQgaT0wO2k8bkNvdW50O2krKyl7CiAJCQlDUERGU0RLX0Fubm90ICogcFJlYWRlckFubm90PSAoQ1BERlNES19Bbm5vdCopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaSk7Ci0JCQlpZihwUmVhZGVyQW5ub3QgPT1wQ3VycmVudCl7CQkJCisJCQlpZihwUmVhZGVyQW5ub3QgPT1wQ3VycmVudCl7CiAJCQkJaW5kZXg9aTsKIAkJCQlicmVhazsKLQkJCX0JCQkKLQkJfQkKKwkJCX0KKwkJfQogCX0KLQlyZXR1cm4gUHJldkFubm90KGluZGV4KTsJCisJcmV0dXJuIFByZXZBbm5vdChpbmRleCk7CiB9Ci1DUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6Ok5leHRBbm5vdCAoaW50JiBpbmRleCkgCi17CQotCQorQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpOZXh0QW5ub3QgKGludCYgaW5kZXgpCit7CisKIAlpbnQgbkNvdW50PW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldFNpemUoKTsKICAgICBpZihuQ291bnQ8PTApIGluZGV4PS0xOwogICAgIGVsc2V7CiAJCWlmKGluZGV4PDApewotCQkJaW5kZXg9MDsJCQorCQkJaW5kZXg9MDsKIAkJfQotCQllbHNlewkJCi0JCQlpZihtX2JDaXJjbGUpewkJCQotCQkJCWluZGV4PSggaW5kZXggPG5Db3VudC0xKSA/IChpbmRleCsxKSA6MDsJCQorCQllbHNleworCQkJaWYobV9iQ2lyY2xlKXsKKwkJCQlpbmRleD0oIGluZGV4IDxuQ291bnQtMSkgPyAoaW5kZXgrMSkgOjA7CiAJCQl9CiAJCQllbHNlewotCQkJCWluZGV4PSggaW5kZXggPG5Db3VudC0xKSA/IChpbmRleCsxKSA6LTE7CQkKKwkJCQlpbmRleD0oIGluZGV4IDxuQ291bnQtMSkgPyAoaW5kZXgrMSkgOi0xOwogCQkJfQotCQkJCi0JCX0JCisKKwkJfQogCX0KLQlyZXR1cm4gKGluZGV4IDwwKSA/IE5VTEwgOiAoQ1BERlNES19Bbm5vdCopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaW5kZXgpOwkJCisJcmV0dXJuIChpbmRleCA8MCkgPyBOVUxMIDogKENQREZTREtfQW5ub3QqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGluZGV4KTsKIH0KIAogCiBDUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXZBbm5vdCAoaW50JiBpbmRleCkKIHsKLQkKKwogCWludCBuQ291bnQ9bV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0U2l6ZSgpOwogICAgIGlmKG5Db3VudDw9MCkgaW5kZXg9LTE7Ci0JZWxzZXsJCisJZWxzZXsKIAkJaWYoaW5kZXg8MCl7Ci0JCQlpbmRleD1uQ291bnQtMTsJCSAKKwkJCWluZGV4PW5Db3VudC0xOwogCQl9Ci0JCWVsc2V7CQotCQkJaWYobV9iQ2lyY2xlKXsJCQkKLQkJCQlpbmRleCA9ICggaW5kZXggPjApID8gKGluZGV4LTEpIDpuQ291bnQtMTsJCQorCQllbHNleworCQkJaWYobV9iQ2lyY2xlKXsKKwkJCQlpbmRleCA9ICggaW5kZXggPjApID8gKGluZGV4LTEpIDpuQ291bnQtMTsKIAkJCX0KIAkJCWVsc2V7Ci0JCQkJaW5kZXggPSAoIGluZGV4ID4wKSA/IChpbmRleC0xKSA6LTE7CQotCQkJfQkJCQkKKwkJCQlpbmRleCA9ICggaW5kZXggPjApID8gKGluZGV4LTEpIDotMTsKKwkJCX0KIAkJfQogCX0KLQlyZXR1cm4gKGluZGV4IDwwKSA/IE5VTEwgOiAoQ1BERlNES19Bbm5vdCopbV9wSXRlcmF0b3JBbm5vdExpc3QuR2V0QXQoaW5kZXgpOwkJCisJcmV0dXJuIChpbmRleCA8MCkgPyBOVUxMIDogKENQREZTREtfQW5ub3QqKW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkdldEF0KGluZGV4KTsKIH0KIAogCi1DUERGU0RLX0Fubm90KkNQREZTREtfQW5ub3RJdGVyYXRvcjo6TmV4dChjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkgCitDUERGU0RLX0Fubm90KkNQREZTREtfQW5ub3RJdGVyYXRvcjo6TmV4dChjb25zdCBDUERGU0RLX0Fubm90KiBwQ3VycmVudCkKIHsKIAotCXJldHVybiAobV9iUmV2ZXJzZSkgPyBQcmV2QW5ub3QocEN1cnJlbnQpOk5leHRBbm5vdChwQ3VycmVudCk7CQkgCisJcmV0dXJuIChtX2JSZXZlcnNlKSA/IFByZXZBbm5vdChwQ3VycmVudCk6TmV4dEFubm90KHBDdXJyZW50KTsKIAogfQogCi1DUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXYoY29uc3QgQ1BERlNES19Bbm5vdCogcEN1cnJlbnQpIAorQ1BERlNES19Bbm5vdCoJQ1BERlNES19Bbm5vdEl0ZXJhdG9yOjpQcmV2KGNvbnN0IENQREZTREtfQW5ub3QqIHBDdXJyZW50KQogewogCi0JcmV0dXJuIChtX2JSZXZlcnNlKSA/IE5leHRBbm5vdChwQ3VycmVudCk6UHJldkFubm90KHBDdXJyZW50KTsJCSAKKwlyZXR1cm4gKG1fYlJldmVyc2UpID8gTmV4dEFubm90KHBDdXJyZW50KTpQcmV2QW5ub3QocEN1cnJlbnQpOwogfQogCiBDUERGU0RLX0Fubm90KkNQREZTREtfQW5ub3RJdGVyYXRvcjo6TmV4dChpbnQmIGluZGV4ICkKIHsKLQkKLQlyZXR1cm4gKG1fYlJldmVyc2UpID8gUHJldkFubm90KGluZGV4KTpOZXh0QW5ub3QoaW5kZXgpOwkJIAotCQorCisJcmV0dXJuIChtX2JSZXZlcnNlKSA/IFByZXZBbm5vdChpbmRleCk6TmV4dEFubm90KGluZGV4KTsKKwogfQogCiBDUERGU0RLX0Fubm90KglDUERGU0RLX0Fubm90SXRlcmF0b3I6OlByZXYoaW50JiBpbmRleCApCiB7Ci0JCi0JcmV0dXJuIChtX2JSZXZlcnNlKSA/IE5leHRBbm5vdChpbmRleCk6UHJldkFubm90KGluZGV4KTsJCSAKKworCXJldHVybiAobV9iUmV2ZXJzZSkgPyBOZXh0QW5ub3QoaW5kZXgpOlByZXZBbm5vdChpbmRleCk7CiB9CiAKIApAQCAtODcyLDcgKzg2Niw3IEBACiAJCXsKIAkJCWludCBqID0gaS0xOwogCQkJQ1BERlNES19Bbm5vdCogcFRlbXAgPSAoQ1BERlNES19Bbm5vdCopYXJyYXlMaXN0W2ldOwotCQkJCisKIAkJCWRvCiAJCQl7CiAJCQkJYXJyYXlMaXN0W2ogKyAxXSA9IGFycmF5TGlzdFtqXTsKQEAgLTg5NiwxNCArODkwLDEyIEBACiBGWF9CT09MIENQREZTREtfQW5ub3RJdGVyYXRvcjo6SW5pdEl0ZXJhdG9yQW5ub3RMaXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyxDRlhfUHRyQXJyYXkgKiBwQW5ub3RMaXN0KQogewogCUFTU0VSVChwUGFnZVZpZXcpOwotCQotCQogCi0JaWYocEFubm90TGlzdD09TlVMTCl7CQorCWlmKHBBbm5vdExpc3Q9PU5VTEwpewogCQlwQW5ub3RMaXN0PXBQYWdlVmlldy0+R2V0QW5ub3RMaXN0KCk7CiAJfQogCi0JdGhpcy0+bV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQWxsKCk7CisJbV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQWxsKCk7CiAJaWYoIXBBbm5vdExpc3QpIHJldHVybiBGQUxTRTsKIAogCUNQREZTREtfQW5ub3QgKiBwVG9wTW9zdEFubm90PSAobV9iSWdub3JlVG9wbW9zdCkgPyBOVUxMIDogcFBhZ2VWaWV3LT5HZXRGb2N1c0Fubm90KCk7CkBAIC05MTQsNyArOTA2LDcgQEAKIAlmb3IoaW50IGkgPSBuQ291bnQtIDEgO2kgPj0gMDtpLS0pCiAJewogCQlDUERGU0RLX0Fubm90ICogcFJlYWRlckFubm90PSAoQ1BERlNES19Bbm5vdCopcEFubm90TGlzdC0+R2V0QXQoaSk7Ci0JCW1fcEl0ZXJhdG9yQW5ub3RMaXN0LkFkZChwUmVhZGVyQW5ub3QpOwkKKwkJbV9wSXRlcmF0b3JBbm5vdExpc3QuQWRkKHBSZWFkZXJBbm5vdCk7CiAJfQogCiAJSW5zZXJ0U29ydChtX3BJdGVyYXRvckFubm90TGlzdCwmTHlPcmRlckNvbXBhcmUpOwpAQCAtOTI5LDcgKzkyMSw3IEBACiAJCQkJbV9wSXRlcmF0b3JBbm5vdExpc3QuUmVtb3ZlQXQoaSk7CiAJCQkJbV9wSXRlcmF0b3JBbm5vdExpc3QuSW5zZXJ0QXQoMCwgcFJlYWRlckFubm90KTsKIAkJCQlicmVhazsKLQkJCX0JCisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2ZzZGtfYmFzZWZvcm0uY3BwIGIvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAKaW5kZXggYzk0ZGExZC4uZjE4MTgwYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnNka19iYXNlZm9ybS5jcHAKQEAgLTcwLDcgKzcwLDcgQEAKIAkJewogCQkJQ1BERl9EaWN0aW9uYXJ5KiBwU3ViRGljdCA9IChDUERGX0RpY3Rpb25hcnkqKXBzdWI7CiAJCQkKLQkJCXJldHVybiBwU3ViRGljdC0+R2V0U3RyZWFtKHRoaXMtPkdldEFwcFN0YXRlKCkpICE9IE5VTEw7CisJCQlyZXR1cm4gcFN1YkRpY3QtPkdldFN0cmVhbShHZXRBcHBTdGF0ZSgpKSAhPSBOVUxMOwogCQl9CiAJCWVsc2UKIAkJCXJldHVybiBGQUxTRTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiBpbnQgQ1BERlNES19XaWRnZXQ6OkdldFJvdGF0ZSgpIGNvbnN0CiB7Ci0JQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSB0aGlzLT5HZXRGb3JtQ29udHJvbCgpOworCUNQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKIAlBU1NFUlQocEN0cmwgIT0gTlVMTCk7CiAJCiAJcmV0dXJuIHBDdHJsLT5HZXRSb3RhdGlvbigpICUgMzYwOwpAQCAtNDExLDExICs0MTEsMTEgQEAKIAkKIAlpZiAoKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8IG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSAmJgogCQltb2RlID09IENQREZfQW5ub3Q6Ok5vcm1hbCAmJiAKLQkJIXRoaXMtPklzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6Ok5vcm1hbCkpCisJCSFJc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpOb3JtYWwpKQogCXsKIAkJQ0ZYX1BhdGhEYXRhIHBhdGhEYXRhOwogCQkKLQkJQ1BERl9SZWN0IHJjQW5ub3QgPSB0aGlzLT5HZXRSZWN0KCk7CisJCUNQREZfUmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOwogCQkKIAkJcGF0aERhdGEuQXBwZW5kUmVjdChyY0Fubm90LmxlZnQsIHJjQW5ub3QuYm90dG9tLAogCQkJcmNBbm5vdC5yaWdodCwgcmNBbm5vdC50b3ApOwpAQCAtNjM0LDggKzYzNCw2IEBACiAKIAlDUERGX0ljb25GaXQgaWNvbkZpdCA9IHBDb250cm9sLT5HZXRJY29uRml0KCk7CiAKLS8vIAlBU1NFUlQodGhpcy0+bV9wQmFzZUZvcm0gIT0gTlVMTCk7Ci0JQVNTRVJUKHRoaXMtPm1fcEludGVyRm9ybSAhPSBOVUxMKTsKIAlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwogCUFTU0VSVChwRG9jICE9IE5VTEwpOwogCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKQEAgLTEwMzgsNyArMTAzNiw2IEBACiAJewogCQlwRWRpdC0+RW5hYmxlUmVmcmVzaChGQUxTRSk7CiAKLQkJQVNTRVJUKHRoaXMtPm1fcEludGVyRm9ybSAhPSBOVUxMKTsKIAkJQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKIAkJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CiAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKQEAgLTEwNTMsNyArMTA1MCw3IEBACiAJCXBFZGl0LT5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKIAkJcEVkaXQtPlNldEFsaWdubWVudFYoMSk7CiAKLQkJRlhfRkxPQVQgZkZvbnRTaXplID0gdGhpcy0+R2V0Rm9udFNpemUoKTsKKwkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKIAkJaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCiAJCQlwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKFRSVUUpOwogCQllbHNlCkBAIC0xMTE1LDggKzExMTIsNiBAQAogCXsKIAkJcEVkaXQtPkVuYWJsZVJlZnJlc2goRkFMU0UpOwogCi0vLwkJQVNTRVJUKHRoaXMtPm1fcEJhc2VGb3JtICE9IE5VTEwpOwotCQlBU1NFUlQodGhpcy0+bV9wSW50ZXJGb3JtICE9IE5VTEwpOwogCQlDUERGU0RLX0RvY3VtZW50KiBwRG9jID0gbV9wSW50ZXJGb3JtLT5HZXREb2N1bWVudCgpOwogCQlBU1NFUlQocERvYyAhPSBOVUxMKTsKIAkJQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IHBEb2MtPkdldEVudigpOwpAQCAtMTIwNyw4ICsxMjAyLDYgQEAKIAl7CiAJCXBFZGl0LT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKIAotLy8JCUFTU0VSVCh0aGlzLT5tX3BCYXNlRm9ybSAhPSBOVUxMKTsKLQkJQVNTRVJUKHRoaXMtPm1fcEludGVyRm9ybSAhPSBOVUxMKTsKIAkJQ1BERlNES19Eb2N1bWVudCogcERvYyA9IG1fcEludGVyRm9ybS0+R2V0RG9jdW1lbnQoKTsKIAkJQVNTRVJUKHBEb2MgIT0gTlVMTCk7CiAJCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBwRG9jLT5HZXRFbnYoKTsKQEAgLTE2MTcsNyArMTYxMCw3IEBACiAJY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgogCWNhc2UgQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGU6CiAJCXsKLQkJCUNQREZfRm9ybUZpZWxkKiBwRmllbGQgPSB0aGlzLT5HZXRGb3JtRmllbGQoKTsKKwkJCUNQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKIAkJCWlmIChDUERGX0FBY3Rpb24gYWEgPSBwRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKSkKIAkJCQlyZXR1cm4gYWEuR2V0QWN0aW9uKGVBQVQpOwogCkBAIC0xOTE3LDcgKzE5MTAsNyBAQAogCiAJbV9iQnVzeSA9IFRSVUU7CiAKLQlpZiAodGhpcy0+SXNDYWxjdWxhdGVFbmFibGVkKCkpCisJaWYgKElzQ2FsY3VsYXRlRW5hYmxlZCgpKQogCXsKIAkJSUZYSlNfUnVudGltZSogcFJ1bnRpbWUgPSBtX3BEb2N1bWVudC0+R2V0SnNSdW50aW1lKCk7CiAJCUFTU0VSVChwUnVudGltZSAhPSBOVUxMKTsKQEAgLTI1MDksMTQgKzI1MDIsMTQgQEAKIAogCWlmIChuVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgblR5cGUgPT0gRklFTERUWVBFX1RFWFRGSUVMRCkKIAl7Ci0JCXRoaXMtPk9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOworCQlPbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKIAkJRlhfQk9PTCBiRm9ybWF0ZWQgPSBGQUxTRTsKLQkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gdGhpcy0+T25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKKwkJQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gT25Gb3JtYXQocEZvcm1GaWVsZCwgYkZvcm1hdGVkKTsKIAkJaWYgKGJGb3JtYXRlZCkKLQkJCXRoaXMtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIHNWYWx1ZS5jX3N0cigpLCBUUlVFKTsKKwkJCVJlc2V0RmllbGRBcHBlYXJhbmNlKHBGb3JtRmllbGQsIHNWYWx1ZS5jX3N0cigpLCBUUlVFKTsKIAkJZWxzZQotCQkJdGhpcy0+UmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7Ci0JCXRoaXMtPlVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOworCQkJUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZvcm1GaWVsZCwgTlVMTCwgVFJVRSk7CisJCVVwZGF0ZUZpZWxkKHBGb3JtRmllbGQpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjU1Nyw5ICsyNTUwLDkgQEAKIAogCWlmIChuVHlwZSA9PSBGSUVMRFRZUEVfTElTVEJPWCkKIAl7Ci0JCXRoaXMtPk9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOwotCQl0aGlzLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBUUlVFKTsKLQkJdGhpcy0+VXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CisJCU9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOworCQlSZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMLCBUUlVFKTsKKwkJVXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yNTc0LDkgKzI1NjcsOCBAQAogCiAJaWYgKG5UeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fCBuVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCiAJewotCQl0aGlzLT5PbkNhbGN1bGF0ZShwRm9ybUZpZWxkKTsKLQkJLy90aGlzLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwRm9ybUZpZWxkLCBOVUxMKTsKLQkJdGhpcy0+VXBkYXRlRmllbGQocEZvcm1GaWVsZCk7CisJCU9uQ2FsY3VsYXRlKHBGb3JtRmllbGQpOworCQlVcGRhdGVGaWVsZChwRm9ybUZpZWxkKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI1ODksOSArMjU4MSw4IEBACiAKIGludAlDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJGb3JtUmVzZXQoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKQogewotCXRoaXMtPk9uQ2FsY3VsYXRlKE5VTEwpOwotCi0JcmV0dXJuIDA7CisgICAgT25DYWxjdWxhdGUobnVsbHB0cik7CisgICAgcmV0dXJuIDA7CiB9CiAKIGludAlDUERGU0RLX0ludGVyRm9ybTo6QmVmb3JlRm9ybUltcG9ydERhdGEoY29uc3QgQ1BERl9JbnRlckZvcm0qIHBGb3JtKQpAQCAtMjYwMSw5ICsyNTkyLDggQEAKIAogaW50CUNQREZTREtfSW50ZXJGb3JtOjpBZnRlckZvcm1JbXBvcnREYXRhKGNvbnN0IENQREZfSW50ZXJGb3JtKiBwRm9ybSkKIHsKLQl0aGlzLT5PbkNhbGN1bGF0ZShOVUxMKTsKLQotCXJldHVybiAwOworICAgIE9uQ2FsY3VsYXRlKG51bGxwdHIpOworICAgIHJldHVybiAwOwogfQogCiBGWF9CT09MIENQREZTREtfSW50ZXJGb3JtOjpJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAgYi9mcGRmc2RrL3NyYy9mc2RrX21nci5jcHAKaW5kZXggYThmZDVlZS4uMWU1N2RjNyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnNka19tZ3IuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2ZzZGtfbWdyLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL3B1YmxpYy9mcGRmX2V4dC5oIgpAQCAtMjksMTYgKzI5LDE2IEBACiAKIAl2aXJ0dWFsIENGWF9XaWRlU3RyaW5nCQlHZXRDbGlwYm9hcmRUZXh0KEZYX0hXTkQgaFduZCl7cmV0dXJuIEwiIjt9CiAJdmlydHVhbCBGWF9CT09MCQkJCVNldENsaXBib2FyZFRleHQoRlhfSFdORCBoV25kLCBDRlhfV2lkZVN0cmluZyBzdHJpbmcpIHtyZXR1cm4gRkFMU0U7fQotCQorCiAJdmlydHVhbCB2b2lkCQkJCUNsaWVudFRvU2NyZWVuKEZYX0hXTkQgaFduZCwgaW50MzJfdCYgeCwgaW50MzJfdCYgeSkge30KIAl2aXJ0dWFsIHZvaWQJCQkJU2NyZWVuVG9DbGllbnQoRlhfSFdORCBoV25kLCBpbnQzMl90JiB4LCBpbnQzMl90JiB5KSB7fQogCiAJLypjdXJzb3Igc3R5bGUKLQlGWENUX0FSUk9XCQotCUZYQ1RfTkVTVwkJCi0JRlhDVF9OV1NFCQkKLQlGWENUX1ZCRUFNCQkKLQlGWENUX0hCRUFNCQkKKwlGWENUX0FSUk9XCisJRlhDVF9ORVNXCisJRlhDVF9OV1NFCisJRlhDVF9WQkVBTQorCUZYQ1RfSEJFQU0KIAlGWENUX0hBTkQKIAkqLwogCXZpcnR1YWwgdm9pZAkJCQlTZXRDdXJzb3IoaW50MzJfdCBuQ3Vyc29yVHlwZSk7CkBAIC0xMDksNyArMTA5LDcgQEAKIAkJQ1BERl9Qb2ludCBsZWZ0Ym90dG9tID0gQ1BERl9Qb2ludChyZWN0LmxlZnQsIHJlY3QuYm90dG9tKTsKIAkJQ1BERl9Qb2ludCByaWdodHRvcCA9IENQREZfUG9pbnQocmVjdC5yaWdodCwgcmVjdC50b3ApOwogCQlDUERGX1BvaW50IHB0QSA9IHBGRkwtPlBXTHRvRkZMKGxlZnRib3R0b20pOwotCQlDUERGX1BvaW50IHB0QiA9IHBGRkwtPlBXTHRvRkZMKHJpZ2h0dG9wKTsJCisJCUNQREZfUG9pbnQgcHRCID0gcEZGTC0+UFdMdG9GRkwocmlnaHR0b3ApOwogCiAKIAkJQ1BERlNES19Bbm5vdCogcEFubm90ICA9IHBGRkwtPkdldFNES0Fubm90KCk7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJQVNTRVJUKHBQYWdlKTsKIAkJbV9wRW52LT5GRklfT3V0cHV0U2VsZWN0ZWRSZWN0KHBQYWdlLCBwdEEueCwgcHRCLnksIHB0Qi54LCBwdEEueSk7CiAJfQotCQorCiB9CiAKIEZYX0JPT0wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKQpAQCAtMTM3LDcgKzEzNyw3IEBACiAJcmV0dXJuICIiOwogfQogCi1GWF9CT09MCUNGWF9TeXN0ZW1IYW5kbGVyOjpGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KGludDMyX3QgbkNoYXJzZXQsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpIAorRlhfQk9PTAlDRlhfU3lzdGVtSGFuZGxlcjo6RmluZE5hdGl2ZVRydWVUeXBlRm9udChpbnQzMl90IG5DaGFyc2V0LCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKQogewogCUNGWF9Gb250TWdyKiBwRm9udE1nciA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKTsKIC8vCUZYRlRfRmFjZSBuRmFjZSA9IHBGb250TWdyLT5GaW5kU3Vic3RGb250KHNGb250RmFjZU5hbWUsVFJVRSwwLDAsMCwwLE5VTEwpOwpAQCAtMTQ3LDE0ICsxNDcsMTQgQEAKIAl7CiAJCUNGWF9Gb250TWFwcGVyKglwRm9udE1hcHBlciA9IHBGb250TWdyLT5tX3BCdWlsdGluTWFwcGVyOwogCQlpZihwRm9udE1hcHBlcikKLQkJewkKKwkJewogCQkJaW50IG5TaXplID0gcEZvbnRNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250cy5HZXRTaXplKCk7CiAJCQlpZihuU2l6ZSA9PTApCiAJCQl7CiAJCQkJcEZvbnRNYXBwZXItPkxvYWRJbnN0YWxsZWRGb250cygpOwogCQkJCW5TaXplID0gcEZvbnRNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250cy5HZXRTaXplKCk7CiAJCQl9Ci0JCQkKKwogCQkJZm9yKGludCBpPTA7IGk8blNpemU7IGkrKykKIAkJCXsKIAkJCQlpZihwRm9udE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldLkNvbXBhcmUoc0ZvbnRGYWNlTmFtZSkpCkBAIC0xODEsOCArMTgxLDggQEAKIAkJcmV0dXJuIDk1MDsKIAlyZXR1cm4gMDsKIH0KLUNQREZfRm9udCogQ0ZYX1N5c3RlbUhhbmRsZXI6OkFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsIAotCQkJCQkJCQkJCQkJCQkgdWludDhfdCBuQ2hhcnNldCkgCitDUERGX0ZvbnQqIENGWF9TeXN0ZW1IYW5kbGVyOjpBZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihDUERGX0RvY3VtZW50KiBwRG9jLCBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLAorCQkJCQkJCQkJCQkJCQkgdWludDhfdCBuQ2hhcnNldCkKIHsKIAlpZihwRG9jKQogCXsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCW1fcFN5c0hhbmRsZXIgPSBOVUxMOwogCW1fcFN5c0hhbmRsZXIgPSBuZXcgQ0ZYX1N5c3RlbUhhbmRsZXIodGhpcyk7CiAKLQkKKwogCW1fcEpTUnVudGltZUZhY3RvcnkgPSBOVUxMOwogCW1fcEpTUnVudGltZUZhY3RvcnkgPSBHZXRKU1J1bnRpbWVGYWN0b3J5KCk7CiAJbV9wSlNSdW50aW1lRmFjdG9yeS0+QWRkUmVmKCk7CkBAIC0yOTYsNyArMjk2LDcgQEAKIAogaW50IENQREZEb2NfRW52aXJvbm1lbnQ6OlJlZ0FwcEhhbmRsZShGUERGX0ZPUk1GSUxMSU5GTyogcEZGaW5mbykKIHsKLQltX3BJbmZvICA9IHBGRmluZm87IAorCW1fcEluZm8gID0gcEZGaW5mbzsKIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtMzg2LDEwICszODYsOCBAQAogCiBDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRDdXJyZW50VmlldygpCiB7Ci0JQ1BERl9QYWdlICogcFBhZ2UgPSAoQ1BERl9QYWdlICopbV9wRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jKTsKLQlpZihwUGFnZSkKLQkJcmV0dXJuIHRoaXMtPkdldFBhZ2VWaWV3KHBQYWdlLCBUUlVFKTsKLQlyZXR1cm4gTlVMTDsKKyAgICBDUERGX1BhZ2UqIHBQYWdlID0gKENQREZfUGFnZSopbV9wRW52LT5GRklfR2V0Q3VycmVudFBhZ2UobV9wRG9jKTsKKyAgICByZXR1cm4gcFBhZ2UgPyBHZXRQYWdlVmlldyhwUGFnZSwgVFJVRSkgOiBudWxscHRyOwogfQogCiBDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0RvY3VtZW50OjpHZXRQYWdlVmlldyhpbnQgbkluZGV4KQpAQCAtNDAwLDE1ICszOTgsMTUgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAltX3BhZ2VNYXAuTG9va3VwKHBUZW1wUGFnZSwgcFRlbXBQYWdlVmlldyk7Ci0JCisKIAlBU1NFUlQocFRlbXBQYWdlVmlldyAhPSBOVUxMKTsKLQkKKwogCXJldHVybiBwVGVtcFBhZ2VWaWV3OwogfQogCiB2b2lkIENQREZTREtfRG9jdW1lbnQ6OiBQcm9jSmF2YXNjcmlwdEZ1bigpCiB7Ci0JQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IHRoaXMtPkdldERvY3VtZW50KCk7CisJQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IEdldERvY3VtZW50KCk7CiAJQ1BERl9Eb2NKU0FjdGlvbnMgZG9jSlMocFBERkRvYyk7CiAJaW50IGlDb3VudCA9IGRvY0pTLkNvdW50SlNBY3Rpb25zKCk7CiAJaWYgKGlDb3VudCA8IDEpIHJldHVybjsKQEAgLTQxOSw3ICs0MTcsNyBAQAogCQlpZihtX3BFbnYtPkdldEFjdGlvbkhhbmRlcigpKQogCQkJbV9wRW52LT5HZXRBY3Rpb25IYW5kZXIoKS0+RG9BY3Rpb25fSmF2YVNjcmlwdChqc0FjdGlvbixDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNzSlNOYW1lKSx0aGlzKTsKIAl9Ci0JCisKIH0KIAogRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpQcm9jT3BlbkFjdGlvbigpCkBAIC00ODYsNyArNDg0LDcgQEAKIAogdm9pZCBDUERGU0RLX0RvY3VtZW50OjpVcGRhdGVBbGxWaWV3cyhDUERGU0RLX1BhZ2VWaWV3KiBwU2VuZGVyLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpCiB7Ci0JCisKIAlGWF9QT1NJVElPTiBwb3MgPSBtX3BhZ2VNYXAuR2V0U3RhcnRQb3NpdGlvbigpOwogCUNQREZfUGFnZSAqIHBQYWdlID0gTlVMTDsKIAlDUERGU0RLX1BhZ2VWaWV3ICogcFBhZ2VWaWV3ID0gTlVMTDsKQEAgLTUwMywxNyArNTAxLDE3IEBACiAKIENQREZTREtfQW5ub3QqIENQREZTREtfRG9jdW1lbnQ6OkdldEZvY3VzQW5ub3QoKQogewotCXJldHVybiB0aGlzLT5tX3BGb2N1c0Fubm90OwkKKyAgICByZXR1cm4gbV9wRm9jdXNBbm5vdDsKIH0KIAogRlhfQk9PTCBDUERGU0RLX0RvY3VtZW50OjpTZXRGb2N1c0Fubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCxGWF9VSU5UIG5GbGFnKQogewogCiAJaWYobV9wRm9jdXNBbm5vdD09cEFubm90KSByZXR1cm4gVFJVRTsKLQkKKwogCWlmKG1fcEZvY3VzQW5ub3QpCiAJewotCQlpZighdGhpcy0+S2lsbEZvY3VzQW5ub3QobkZsYWcpICkgcmV0dXJuIEZBTFNFOwkKKwkJaWYoIUtpbGxGb2N1c0Fubm90KG5GbGFnKSApIHJldHVybiBGQUxTRTsKIAl9CiAJQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogCWlmKHBBbm5vdCAmJiBwUGFnZVZpZXctPklzVmFsaWQoKSkKQEAgLTUyNiwxMCArNTI0LDEwIEBACiAJCQkJcmV0dXJuIEZBTFNFOwogCQkJaWYoIW1fcEZvY3VzQW5ub3QpCiAJCQl7Ci0JCQkJdGhpcy0+bV9wRm9jdXNBbm5vdD1wQW5ub3Q7CisJCQkJbV9wRm9jdXNBbm5vdD1wQW5ub3Q7CiAJCQkJcmV0dXJuIFRSVUU7CiAJCQl9Ci0JCX0JCQkKKwkJfQogCX0KIAlyZXR1cm4gRkFMU0U7CiB9CkBAIC01NDUsNyArNTQzLDcgQEAKIAkJCW1fcEZvY3VzQW5ub3QgPSBOVUxMOwogCQkJaWYocEFubm90SGFuZGxlci0+QW5ub3RfT25LaWxsRm9jdXMocEZvY3VzQW5ub3QsIG5GbGFnKSkKIAkJCXsKLQkJCQkKKwogCQkJCWlmKHBGb2N1c0Fubm90LT5HZXRUeXBlKCkgPT0gRlhfQlNUUkMoIldpZGdldCIpKQogCQkJCXsKIAkJCQkJQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBGb2N1c0Fubm90OwpAQCAtNjAyLDcgKzYwMCw3IEBACiAJcmV0dXJuIG1fcEVudi0+R2V0SlNSdW50aW1lKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nCUNQREZTREtfRG9jdW1lbnQ6OkdldFBhdGgoKSAKK0NGWF9XaWRlU3RyaW5nCUNQREZTREtfRG9jdW1lbnQ6OkdldFBhdGgoKQogewogCUFTU0VSVChtX3BFbnYgIT0gTlVMTCk7CiAJcmV0dXJuIG1fcEVudi0+SlNfZG9jR2V0RmlsZVBhdGgoKTsKQEAgLTYzMSw3ICs2MjksNyBAQAogCiBDUERGU0RLX1BhZ2VWaWV3Ojp+Q1BERlNES19QYWdlVmlldygpCiB7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7CQorCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogCWludCBuQW5ub3RDb3VudCA9IG1fZnhBbm5vdEFycmF5LkdldFNpemUoKTsKIAogCWZvciAoaW50IGk9MDsgaTxuQW5ub3RDb3VudDsgaSsrKQpAQCAtNjU4LDI1ICs2NTYsMjMgQEAKIAogdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpQYWdlVmlld19PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ1BERl9NYXRyaXgqIHBVc2VyMkRldmljZSxDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKQogewotCW1fY3VyTWF0cml4ID0gKnBVc2VyMkRldmljZTsKLQkKLQkvLwltX3BBbm5vdExpc3QtPkRpc3BsYXlBbm5vdHMobV9wYWdlLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIEZBTFNFLCBwT3B0aW9ucyk7Ci0JQ1BERkRvY19FbnZpcm9ubWVudCogcEVudiA9IG1fcFNES0RvYy0+R2V0RW52KCk7Ci0JQ1BERlNES19Bbm5vdEl0ZXJhdG9yIGFubm90SXRlcmF0b3IodGhpcywgVFJVRSk7Ci0JQ1BERlNES19Bbm5vdCAqIHBTREtBbm5vdD1OVUxMOwotCWludCBpbmRleD0tMTsKLQl3aGlsZSgocFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KSkpCi0JewotCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotCQlBU1NFUlQocEFubm90SGFuZGxlck1ncik7Ci0JCXBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uRHJhdyh0aGlzLCBwU0RLQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgMCk7Ci0JfQorICAgIG1fY3VyTWF0cml4ID0gKnBVc2VyMkRldmljZTsKIAorICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICAgIENQREZTREtfQW5ub3RJdGVyYXRvciBhbm5vdEl0ZXJhdG9yKHRoaXMsIFRSVUUpOworICAgIENQREZTREtfQW5ub3QqIHBTREtBbm5vdCA9IG51bGxwdHI7CisgICAgaW50IGluZGV4ID0gLTE7CisgICAgd2hpbGUgKChwU0RLQW5ub3QgPSBhbm5vdEl0ZXJhdG9yLk5leHQoaW5kZXgpKSkgeworICAgICAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICAgICAgICBBU1NFUlQocEFubm90SGFuZGxlck1ncik7CisgICAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uRHJhdygKKyAgICAgICAgICAgIHRoaXMsIHBTREtBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlLCAwKTsKKyAgICB9CiB9CiAKIENQREZfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkdldFBERkFubm90QXRQb2ludChGWF9GTE9BVCBwYWdlWCwgRlhfRkxPQVQgcGFnZVkpCiB7Ci0JCisKIAlpbnQgbkNvdW50ID0gbV9wQW5ub3RMaXN0LT5Db3VudCgpOwogCWZvcihpbnQgaSA9IDAgOyBpPG5Db3VudDsgaSsrKQogCXsKQEAgLTY5MSw3ICs2ODcsNyBAQAogCiBDUERGX0Fubm90KiBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQREZXaWRnZXRBdFBvaW50KEZYX0ZMT0FUIHBhZ2VYLCBGWF9GTE9BVCBwYWdlWSkKIHsKLQkKKwogCWludCBuQ291bnQgPSBtX3BBbm5vdExpc3QtPkNvdW50KCk7CiAJZm9yKGludCBpID0gMCA7IGk8bkNvdW50OyBpKyspCiAJewpAQCAtNzM2LDE1ICs3MzIsMTQgQEAKIAl3aGlsZSgocFNES0Fubm90ID0gYW5ub3RJdGVyYXRvci5OZXh0KGluZGV4KSkpCiAJewogCQlpZihwU0RLQW5ub3QtPkdldFR5cGUoKSA9PSAiV2lkZ2V0IikKLQkJewkKKwkJewogCQkJcEFubm90TWdyLT5Bbm5vdF9PbkdldFZpZXdCQm94KHRoaXMsIHBTREtBbm5vdCk7CiAJCQlDUERGX1BvaW50IHBvaW50KHBhZ2VYLCBwYWdlWSk7CiAJCQlpZiAocEFubm90TWdyLT5Bbm5vdF9PbkhpdFRlc3QodGhpcywgcFNES0Fubm90LCBwb2ludCkpCi0vLwkJCWlmKHJjLkNvbnRhaW5zKHBhZ2VYLCBwYWdlWSkpCiAJCQkJcmV0dXJuIHBTREtBbm5vdDsKIAkJfQogCX0KLQkKKwogCXJldHVybiBOVUxMOwogfQogCkBAIC03NjEsMjMgKzc1NiwyMyBAQAogewogCUNQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOwogCUFTU0VSVChwRW52KTsKLQlDUERGU0RLX0Fubm90SGFuZGxlck1nciAqIHBBbm5vdEhhbmRsZXI9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwkKLQkKKwlDUERGU0RLX0Fubm90SGFuZGxlck1nciAqIHBBbm5vdEhhbmRsZXI9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworCiAJQ1BERlNES19Bbm5vdCogcFNES0Fubm90ID1OVUxMOwotCQorCiAJaWYocEFubm90SGFuZGxlcikKIAl7CiAJCXBTREtBbm5vdCA9IHBBbm5vdEhhbmRsZXItPk5ld0Fubm90KHBQREZBbm5vdCwgdGhpcyk7CiAJfQotCWlmKCFwU0RLQW5ub3QpCSAKKwlpZighcFNES0Fubm90KQogCQlyZXR1cm4gTlVMTDsKIAotCW1fZnhBbm5vdEFycmF5LkFkZChwU0RLQW5ub3QpOwkKLQkJCisJbV9meEFubm90QXJyYXkuQWRkKHBTREtBbm5vdCk7CisKIAlpZihwQW5ub3RIYW5kbGVyKQotCXsJIAkJIAkgCisJewogCQlwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNyZWF0ZShwU0RLQW5ub3QpOwotCQkKKwogCX0KIAogCSByZXR1cm4gcFNES0Fubm90OwpAQCAtNzg1LDkgKzc4MCw3IEBACiAKIENQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KENQREZfRGljdGlvbmFyeSAqIHBEaWN0KQogewotCWlmKHBEaWN0KSAgCi0JCXJldHVybiB0aGlzLT5BZGRBbm5vdChwRGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIikscERpY3QpOwotCSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcERpY3QgPyBBZGRBbm5vdChwRGljdC0+R2V0U3RyaW5nKCJTdWJ0eXBlIiksIHBEaWN0KSA6IG51bGxwdHI7CiB9CiAKIENQREZTREtfQW5ub3QqIENQREZTREtfUGFnZVZpZXc6OkFkZEFubm90KGNvbnN0IEZYX0NIQVIqIGxwU3ViVHlwZSxDUERGX0RpY3Rpb25hcnkgKiBwRGljdCkKQEAgLTkxMiw3ICs5MDUsNyBAQAogCWVsc2UKIAl7CiAJCWlmKG1fYk9uV2lkZ2V0KQotCQl7CQorCQl7CiAJCQltX2JPbldpZGdldCA9IEZBTFNFOwogCQkJbV9iRXhpdFdpZGdldCA9IFRSVUU7CiAJCQltX2JFbnRlcldpZGdldCA9IEZBTFNFOwpAQCAtOTI0LDcgKzkxNyw3IEBACiAJCX0KIAkJcmV0dXJuIEZBTFNFOwogCX0KLQkKKwogCXJldHVybiBGQUxTRTs7CiB9CiAKQEAgLTk5Miw4ICs5ODUsOCBAQAogCWZvcihpbnQgaT0wOyBpPG5Db3VudDsgaSsrKQogCXsKIAkJQ1BERl9Bbm5vdCogcFBERkFubm90ID0gbV9wQW5ub3RMaXN0LT5HZXRBdChpKTsKLQkJQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSB0aGlzLT5HZXRQREZEb2N1bWVudCgpOwotCQkKKwkJQ1BERl9Eb2N1bWVudCAqIHBEb2MgPSBHZXRQREZEb2N1bWVudCgpOworCiAJCUNoZWNrVW5TdXBwb3J0QW5ub3QocERvYywgcFBERkFubm90KTsKIAogCQlDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9IHBFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwpAQCAtMTAyNSwxNCArMTAxOCwxMCBAQAogCiB2b2lkIENQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVZpZXcoQ1BERlNES19Bbm5vdCogcEFubm90KQogewotCUNQREZfUmVjdCByY1dpbmRvdzsKLQotIAlDUERGRG9jX0Vudmlyb25tZW50KiBwRW52ID0gbV9wU0RLRG9jLT5HZXRFbnYoKTsJCi0vLyAJQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXIgPSBwRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLQkKLQlyY1dpbmRvdyA9IHBBbm5vdC0+R2V0UmVjdCgpOy8vcEFubm90SGFuZGxlci0+QW5ub3RfT25HZXRWaWV3QkJveCh0aGlzLHBBbm5vdCk7CQotCXBFbnYtPkZGSV9JbnZhbGlkYXRlKG1fcGFnZSwgcmNXaW5kb3cubGVmdCwgcmNXaW5kb3cudG9wLCByY1dpbmRvdy5yaWdodCwgcmNXaW5kb3cuYm90dG9tKTsKLQorICAgIENQREZfUmVjdCByY1dpbmRvdyA9IHBBbm5vdC0+R2V0UmVjdCgpOworICAgIENQREZEb2NfRW52aXJvbm1lbnQqIHBFbnYgPSBtX3BTREtEb2MtPkdldEVudigpOworICAgIHBFbnYtPkZGSV9JbnZhbGlkYXRlKAorICAgICAgICBtX3BhZ2UsIHJjV2luZG93LmxlZnQsIHJjV2luZG93LnRvcCwgcmNXaW5kb3cucmlnaHQsIHJjV2luZG93LmJvdHRvbSk7CiB9CiAKIGludCBDUERGU0RLX1BhZ2VWaWV3OjpHZXRQYWdlSW5kZXgoKQpAQCAtMTA2Nyw3ICsxMDU2LDcgQEAKIAlDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IG1fcFNES0RvYy0+R2V0Rm9jdXNBbm5vdCgpOwogCWlmKCFwRm9jdXNBbm5vdCkKIAkJcmV0dXJuIE5VTEw7Ci0JCisKIAlmb3IoaW50IGk9MDsgaTxtX2Z4QW5ub3RBcnJheS5HZXRTaXplKCk7IGkrKykKIAl7CiAJCUNQREZTREtfQW5ub3QqIHBBbm5vdCA9IChDUERGU0RLX0Fubm90KiltX2Z4QW5ub3RBcnJheS5HZXRBdChpKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2VkaXQuY3BwIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKaW5kZXggYjQ1ZmM2OS4uMTljMDVkMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKKysrIGIvZnBkZnNkay9zcmMvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKQEAgLTExNDAsNyArMTE0MCw3IEBACiAJCX0KIAkJZWxzZSBpZiAoblN0YXJ0Q2hhciA8IDApCiAJCXsJCi0JCQl0aGlzLT5TZWxlY3ROb25lKCk7CisJCQlTZWxlY3ROb25lKCk7CiAJCX0KIAkJZWxzZQogCQl7CQkKQEAgLTE3ODIsNyArMTc4Miw3IEBACiAJCQkJCWNhc2UgRVBfRk9OVElOREVYOgkJCQkKIAkJCQkJCWlmICh3b3JkaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCAhPSBwV29yZFByb3BzLT5uRm9udEluZGV4KQogCQkJCQkJewotCQkJCQkJCWlmIChJRlhfRWRpdF9Gb250TWFwKiBwRm9udE1hcCA9IHRoaXMtPkdldEZvbnRNYXAoKSkKKwkJCQkJCQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCiAJCQkJCQkJewogCQkJCQkJCQl3b3JkaW5mby5Xb3JkUHJvcHMubkZvbnRJbmRleCA9IHBGb250TWFwLT5HZXRXb3JkRm9udEluZGV4KHdvcmRpbmZvLldvcmQsd29yZGluZm8ubkNoYXJzZXQscFdvcmRQcm9wcy0+bkZvbnRJbmRleCk7CiAJCQkJCQkJfQpAQCAtMjYxMyw3ICsyNjEzLDcgQEAKIAogdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRDaGFuZ2UoKQogewotCWlmICh0aGlzLT5tX3dwQ2FyZXQgPT0gdGhpcy0+bV93cE9sZENhcmV0KSByZXR1cm47CisJaWYgKG1fd3BDYXJldCA9PSBtX3dwT2xkQ2FyZXQpIHJldHVybjsKIAogCWlmIChtX2JOb3RpZnkgJiYgbV9wVlQtPklzUmljaFRleHQoKSAmJiBtX3BOb3RpZnkpCiAJewpAQCAtMzQ2MSwxNyArMzQ2MSwxNyBAQAogCiB2b2lkIENGWF9FZGl0OjpFbmFibGVVbmRvKEZYX0JPT0wgYlVuZG8pCiB7Ci0JdGhpcy0+bV9iRW5hYmxlVW5kbyA9IGJVbmRvOworICAgIG1fYkVuYWJsZVVuZG8gPSBiVW5kbzsKIH0KIAogdm9pZCBDRlhfRWRpdDo6RW5hYmxlTm90aWZ5KEZYX0JPT0wgYk5vdGlmeSkKIHsKLQl0aGlzLT5tX2JOb3RpZnkgPSBiTm90aWZ5OworICAgIG1fYk5vdGlmeSA9IGJOb3RpZnk7CiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU9wck5vdGlmeShGWF9CT09MIGJOb3RpZnkpCiB7Ci0JdGhpcy0+bV9iT3ByTm90aWZ5ID0gYk5vdGlmeTsKKyAgICBtX2JPcHJOb3RpZnkgPSBiTm90aWZ5OwogfQogCiBGWF9GTE9BVCBDRlhfRWRpdDo6R2V0TGluZVRvcChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0CkBAIC0zNTQ4LDEwICszNTQ4LDkgQEAKIAogaW50MzJfdCBDRlhfRWRpdDo6R2V0Q2hhclNldEZyb21Vbmljb2RlKEZYX1dPUkQgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCkKIHsKLQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSB0aGlzLT5HZXRGb250TWFwKCkpCi0JCXJldHVybiBwRm9udE1hcC0+Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIG5PbGRDaGFyc2V0KTsKLQllbHNlCi0JCXJldHVybiBuT2xkQ2hhcnNldDsKKyAgICBpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCisgICAgICAgIHJldHVybiBwRm9udE1hcC0+Q2hhclNldEZyb21Vbmljb2RlKHdvcmQsIG5PbGRDaGFyc2V0KTsKKyAgICByZXR1cm4gbk9sZENoYXJzZXQ7CiB9CiAKIHZvaWQgQ0ZYX0VkaXQ6OkJlZ2luR3JvdXBVbmRvKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGl0bGUpCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9meGVkaXQvZnhldF9saXN0LmNwcCBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2xpc3QuY3BwCmluZGV4IDZkNDhiMzAuLmQ5NGNjMTYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2xpc3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL2Z4ZWRpdC9meGV0X2xpc3QuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9meGVkaXQvZnhldF9zdHViLmgiCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogCWlmIChJRlhfRWRpdF9JdGVyYXRvcioJcEl0ZXJhdG9yID0gR2V0SXRlcmF0b3IoKSkKIAl7Ci0JCXBJdGVyYXRvci0+U2V0QXQoMSk7CQkKKwkJcEl0ZXJhdG9yLT5TZXRBdCgxKTsKIAkJcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpOwogCX0KIApAQCAtMTQ3LDcgKzE0Nyw3IEBACiB9CiAKIHZvaWQgQ0ZYX0xpc3Q6OkFkZEl0ZW0oY29uc3QgRlhfV0NIQVIqIHN0cikKLXsJCit7CiAJaWYgKENGWF9MaXN0SXRlbSAqIHBMaXN0SXRlbSA9IG5ldyBDRlhfTGlzdEl0ZW0oKSkKIAl7CiAJCXBMaXN0SXRlbS0+U2V0Rm9udE1hcChtX3BGb250TWFwKTsKQEAgLTE2MywxOCArMTYzLDE4IEBACiAKIAlpZiAoQ0ZYX0xpc3RJdGVtICogcFByZXZJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JdGVtSW5kZXggLSAxKSkKIAkJZlBvc1kgPSBwUHJldkl0ZW0tPkdldFJlY3QoKS5ib3R0b207Ci0JCisKIAlmb3IgKGludDMyX3QgaT1uSXRlbUluZGV4LHN6PW1fYUxpc3RJdGVtcy5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAl7CiAJCWlmIChDRlhfTGlzdEl0ZW0gKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpCiAJCXsKIAkJCUZYX0ZMT0FUIGZMaXN0SXRlbUhlaWdodCA9IHBMaXN0SXRlbS0+R2V0SXRlbUhlaWdodCgpOwogCQkJcExpc3RJdGVtLT5TZXRSZWN0KENMU1RfUmVjdCgwLjBmLGZQb3NZLDAuMGYsZlBvc1kgKyBmTGlzdEl0ZW1IZWlnaHQpKTsKLQkJCWZQb3NZICs9IGZMaXN0SXRlbUhlaWdodDsJCQkKKwkJCWZQb3NZICs9IGZMaXN0SXRlbUhlaWdodDsKIAkJfQogCX0KIAotCVNldENvbnRlbnRSZWN0KENMU1RfUmVjdCgwLjBmLDAuMGYsMC4wZixmUG9zWSkpOwkKKwlTZXRDb250ZW50UmVjdChDTFNUX1JlY3QoMC4wZiwwLjBmLDAuMGYsZlBvc1kpKTsKIH0KIAogSUZYX0VkaXQgKiBDRlhfTGlzdDo6R2V0SXRlbUVkaXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0CkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJCUNMU1RfUmVjdCByY0xpc3RJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7CiAKIAkJCWlmIChGWF9FRElUX0lzRmxvYXRCaWdnZXIocHQueSwgcmNMaXN0SXRlbS50b3ApKQotCQkJewkJCQorCQkJewogCQkJCWJGaXJzdCA9IEZBTFNFOwogCQkJfQogCkBAIC0zNDAsNyArMzQwLDcgQEAKIHsKIAlpZiAoQ0ZYX0xpc3RJdGVtICogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JdGVtSW5kZXgpKQogCXsKLQkJcExpc3RJdGVtLT5TZXRDYXJldChiQ2FyZXQpOwkJCisJCXBMaXN0SXRlbS0+U2V0Q2FyZXQoYkNhcmV0KTsKIAl9CiB9CiAKQEAgLTM4Nyw3ICszODcsNyBAQAogewogCWludDMyX3QgbkluZGV4ID0gRmluZChuSXRlbUluZGV4KTsKIAotCWlmIChuSW5kZXggPCAwKSAKKwlpZiAobkluZGV4IDwgMCkKIAkJbV9hSXRlbXMuQWRkKG5ldyBDUExTVF9TZWxlY3RfSXRlbShuSXRlbUluZGV4LDEpKTsKIAllbHNlCiAJewpAQCAtNDg4LDcgKzQ4OCw3IEBACiB2b2lkIENQTFNUX1NlbGVjdDo6RG9uZSgpCiB7CiAJZm9yIChpbnQzMl90IGk9bV9hSXRlbXMuR2V0U2l6ZSgpLTE7IGk+PTA7IGktLSkKLQl7CQorCXsKIAkJaWYgKENQTFNUX1NlbGVjdF9JdGVtICogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChpKSkKIAkJewogCQkJaWYgKHBJdGVtLT5uU3RhdGUgPT0gLTEpCkBAIC01NTksNyArNTU5LDcgQEAKIAogdm9pZCBDRlhfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewotCWludDMyX3QgbkhpdEluZGV4ID0gdGhpcy0+R2V0SXRlbUluZGV4KHBvaW50KTsKKwlpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7CiAKIAlpZiAoSXNNdWx0aXBsZVNlbCgpKQogCXsKQEAgLTU3Niw4ICs1NzYsOCBAQAogCQkJCW1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOwogCQkJCVNlbGVjdEl0ZW1zKCk7CiAJCQkJbV9iQ3RybFNlbCA9IFRSVUU7Ci0JCQl9CQkKLQkJCQorCQkJfQorCiAJCQltX25Gb290SW5kZXggPSBuSGl0SW5kZXg7CiAJCX0KIAkJZWxzZSBpZiAoYlNoaWZ0KQpAQCAtNjAyLDIzICs2MDIsMjMgQEAKIAkJU2V0U2luZ2xlU2VsZWN0KG5IaXRJbmRleCk7CiAJfQogCi0JaWYgKCF0aGlzLT5Jc0l0ZW1WaXNpYmxlKG5IaXRJbmRleCkpCi0JCXRoaXMtPlNjcm9sbFRvTGlzdEl0ZW0obkhpdEluZGV4KTsKKwlpZiAoIUlzSXRlbVZpc2libGUobkhpdEluZGV4KSkKKwkJU2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOwogfQogCiB2b2lkIENGWF9MaXN0Q3RybDo6T25Nb3VzZU1vdmUoY29uc3QgQ1BERl9Qb2ludCAmIHBvaW50LEZYX0JPT0wgYlNoaWZ0LEZYX0JPT0wgYkN0cmwpCiB7Ci0JaW50MzJfdCBuSGl0SW5kZXggPSB0aGlzLT5HZXRJdGVtSW5kZXgocG9pbnQpOworCWludDMyX3QgbkhpdEluZGV4ID0gR2V0SXRlbUluZGV4KHBvaW50KTsKIAogCWlmIChJc011bHRpcGxlU2VsKCkpCi0JewkJCQorCXsKIAkJaWYgKGJDdHJsKQogCQl7CiAJCQlpZiAobV9iQ3RybFNlbCkKIAkJCQltX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LG5IaXRJbmRleCk7CiAJCQllbHNlCi0JCQkJbV9hU2VsSXRlbXMuU3ViKG1fbkZvb3RJbmRleCxuSGl0SW5kZXgpOwkJCQotCQkJCisJCQkJbV9hU2VsSXRlbXMuU3ViKG1fbkZvb3RJbmRleCxuSGl0SW5kZXgpOworCiAJCQlTZWxlY3RJdGVtcygpOwogCQl9CiAJCWVsc2UKQEAgLTYzNSw4ICs2MzUsOCBAQAogCQlTZXRTaW5nbGVTZWxlY3QobkhpdEluZGV4KTsKIAl9CiAKLQlpZiAoIXRoaXMtPklzSXRlbVZpc2libGUobkhpdEluZGV4KSkKLQkJdGhpcy0+U2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOworCWlmICghSXNJdGVtVmlzaWJsZShuSGl0SW5kZXgpKQorCQlTY3JvbGxUb0xpc3RJdGVtKG5IaXRJbmRleCk7CiB9CiAKIHZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLKGludDMyX3Qgbkl0ZW1JbmRleCxGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQpAQCAtNjYyLDcgKzY2Miw3IEBACiAJCQkJbV9uRm9vdEluZGV4ID0gbkl0ZW1JbmRleDsKIAkJCX0KIAotCQkJU2V0Q2FyZXQobkl0ZW1JbmRleCk7CQorCQkJU2V0Q2FyZXQobkl0ZW1JbmRleCk7CiAJCX0KIAl9CiAJZWxzZQpAQCAtNjcwLDggKzY3MCw4IEBACiAJCVNldFNpbmdsZVNlbGVjdChuSXRlbUluZGV4KTsKIAl9CiAKLQlpZiAoIXRoaXMtPklzSXRlbVZpc2libGUobkl0ZW1JbmRleCkpCi0JCXRoaXMtPlNjcm9sbFRvTGlzdEl0ZW0obkl0ZW1JbmRleCk7CisJaWYgKCFJc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXgpKQorCQlTY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOwogfQogCiB2b2lkIENGWF9MaXN0Q3RybDo6T25WS19VUChGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQpAQCAtNzA2LDcgKzcwNiw3IEBACiAKIEZYX0JPT0wJQ0ZYX0xpc3RDdHJsOjpPbkNoYXIoRlhfV09SRCBuQ2hhcixGWF9CT09MIGJTaGlmdCxGWF9CT09MIGJDdHJsKQogewotCWludDMyX3QgbkluZGV4ID0gR2V0TGFzdFNlbGVjdGVkKCk7CQorCWludDMyX3QgbkluZGV4ID0gR2V0TGFzdFNlbGVjdGVkKCk7CiAJaW50MzJfdCBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LG5DaGFyKTsKIAogCWlmIChuRmluZEluZGV4ICE9IG5JbmRleCkKQEAgLTcyMyw3ICs3MjMsNyBAQAogewogCUNGWF9MaXN0Q29udGFpbmVyOjpTZXRQbGF0ZVJlY3QocmVjdCk7CiAJbV9wdFNjcm9sbFBvcy54ID0gcmVjdC5sZWZ0OwotCVNldFNjcm9sbFBvcyhDUERGX1BvaW50KHJlY3QubGVmdCxyZWN0LnRvcCkpOwkKKwlTZXRTY3JvbGxQb3MoQ1BERl9Qb2ludChyZWN0LmxlZnQscmVjdC50b3ApKTsKIAlSZUFycmFuZ2UoMCk7CiAJSW52YWxpZGF0ZUl0ZW0oLTEpOwogfQpAQCAtNzQzLDcgKzc0Myw3IEBACiB7CiAJaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47CiAKLQlpZiAoYlNlbGVjdGVkICE9IHRoaXMtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpKQorCWlmIChiU2VsZWN0ZWQgIT0gSXNJdGVtU2VsZWN0ZWQobkl0ZW1JbmRleCkpCiAJewogCQlpZiAoYlNlbGVjdGVkKQogCQl7CkBAIC03NjksMTAgKzc2OSwxMCBAQAogCQkJU2V0SXRlbVNlbGVjdChtX25TZWxJdGVtLEZBTFNFKTsKIAkJCUludmFsaWRhdGVJdGVtKG1fblNlbEl0ZW0pOwogCQl9Ci0JCQorCiAJCVNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCxUUlVFKTsKIAkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7Ci0JCW1fblNlbEl0ZW0gPSBuSXRlbUluZGV4OwkJCisJCW1fblNlbEl0ZW0gPSBuSXRlbUluZGV4OwogCX0KIH0KIApAQCAtNzgwLDggKzc4MCw4IEBACiB7CiAJaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47CiAKLQlpZiAodGhpcy0+SXNNdWx0aXBsZVNlbCgpKQotCXsJCQorCWlmIChJc011bHRpcGxlU2VsKCkpCisJewogCQlpbnQzMl90IG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7CiAKIAkJaWYgKG5PbGRJbmRleCAhPSBuSXRlbUluZGV4KQpAQCAtNzkyLDcgKzc5Miw3IEBACiAJCQlTZXRJdGVtQ2FyZXQobkl0ZW1JbmRleCxUUlVFKTsKIAogCQkJSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKLQkJCUludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwkJCQorCQkJSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7CiAJCX0KIAl9CiB9CkBAIC04MzksNyArODM5LDcgQEAKIAkJc3dpdGNoKG5TdGF0ZSkKIAkJewogCQljYXNlIDE6Ci0JCQlTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBUUlVFKTsJCQkKKwkJCVNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIFRSVUUpOwogCQkJYnJlYWs7CiAJCWNhc2UgLTE6CiAJCQlTZXRNdWx0aXBsZVNlbGVjdChuSXRlbUluZGV4LCBGQUxTRSk7CkBAIC04NTQsNyArODU0LDcgQEAKIHsKIAlpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpIHJldHVybjsKIAotCWlmICh0aGlzLT5Jc011bHRpcGxlU2VsKCkpCisJaWYgKElzTXVsdGlwbGVTZWwoKSkKIAl7CiAJCW1fYVNlbEl0ZW1zLkFkZChuSXRlbUluZGV4KTsKIAkJU2VsZWN0SXRlbXMoKTsKQEAgLTg2NSw4ICs4NjUsOCBAQAogCiBGWF9CT09MCUNGWF9MaXN0Q3RybDo6SXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0CiB7Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSB0aGlzLT5HZXRQbGF0ZVJlY3QoKTsKLQlDUERGX1JlY3QgcmNJdGVtID0gdGhpcy0+R2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CisJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKKwlDUERGX1JlY3QgcmNJdGVtID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CiAKIAlyZXR1cm4gcmNJdGVtLmJvdHRvbSA+PSByY1BsYXRlLmJvdHRvbSAmJiByY0l0ZW0udG9wIDw9IHJjUGxhdGUudG9wOwogfQpAQCAtODc1LDcgKzg3NSw3IEBACiB7CiAJaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKSByZXR1cm47CiAKLQlDUERGX1JlY3QgcmNQbGF0ZSA9IHRoaXMtPkdldFBsYXRlUmVjdCgpOworCUNQREZfUmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7CiAJQ1BERl9SZWN0IHJjSXRlbSA9IENGWF9MaXN0OjpHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKIAlDUERGX1JlY3QgcmNJdGVtQ3RybCA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwogCkBAIC05MDUsNyArOTA1LDcgQEAKIAkJaWYgKCFtX2JOb3RpZnlGbGFnKQogCQl7CiAJCQltX2JOb3RpZnlGbGFnID0gVFJVRTsKLQkJCW1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLCAKKwkJCW1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAogCQkJCQlyY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLCBHZXRGaXJzdEhlaWdodCgpLCByY1BsYXRlLkhlaWdodCgpKTsKIAkJCW1fYk5vdGlmeUZsYWcgPSBGQUxTRTsKIAkJfQpAQCAtOTIxLDcgKzkyMSw3IEBACiB7CiAJaWYgKCFGWF9FRElUX0lzRmxvYXRFcXVhbChtX3B0U2Nyb2xsUG9zLnksZnkpKQogCXsKLQkJQ1BERl9SZWN0IHJjUGxhdGUgPSB0aGlzLT5HZXRQbGF0ZVJlY3QoKTsKKwkJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRQbGF0ZVJlY3QoKTsKIAkJQ1BERl9SZWN0IHJjQ29udGVudCA9IENGWF9MaXN0OjpHZXRDb250ZW50UmVjdCgpOwogCiAJCWlmIChyY1BsYXRlLkhlaWdodCgpID4gcmNDb250ZW50LkhlaWdodCgpKQpAQCAtOTQzLDcgKzk0Myw3IEBACiAJCW1fcHRTY3JvbGxQb3MueSA9IGZ5OwogCQlJbnZhbGlkYXRlSXRlbSgtMSk7CiAKLQkJaWYgKG1fcE5vdGlmeSkgCisJCWlmIChtX3BOb3RpZnkpCiAJCXsKIAkJCWlmICghbV9iTm90aWZ5RmxhZykKIAkJCXsKQEAgLTk3MCw3ICs5NzAsNyBAQAogewogCWlmIChJc1ZhbGlkKG5JbmRleCkpCiAJewotCQl0aGlzLT5HZXRQbGF0ZVJlY3QoKTsKKwkJR2V0UGxhdGVSZWN0KCk7CiAJCUNQREZfUmVjdCByY0l0ZW0gPSBDRlhfTGlzdDo6R2V0SXRlbVJlY3QobkluZGV4KTsKIAkJU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKIAl9CkBAIC05NzgsNyArOTc4LDcgQEAKIAogaW50MzJfdCBDRlhfTGlzdEN0cmw6OkdldFRvcEl0ZW0oKSBjb25zdAogewotCWludDMyX3Qgbkl0ZW1JbmRleCA9IHRoaXMtPkdldEl0ZW1JbmRleCh0aGlzLT5HZXRCVFBvaW50KCkpOworCWludDMyX3Qgbkl0ZW1JbmRleCA9IEdldEl0ZW1JbmRleChHZXRCVFBvaW50KCkpOwogCiAJaWYgKCFJc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXgpICYmIElzSXRlbVZpc2libGUobkl0ZW1JbmRleCArIDEpKQogCQkJbkl0ZW1JbmRleCArPSAxOwpAQCAtMTAwNCw5ICsxMDA0LDggQEAKIAogQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xpc3RDdHJsOjpHZXRUZXh0KCkgY29uc3QKIHsKLQlpZiAodGhpcy0+SXNNdWx0aXBsZVNlbCgpKQotCQlyZXR1cm4gdGhpcy0+R2V0SXRlbVRleHQodGhpcy0+bV9uQ2FyZXRJbmRleCk7CQotCWVsc2UKLQkJcmV0dXJuIHRoaXMtPkdldEl0ZW1UZXh0KHRoaXMtPm1fblNlbEl0ZW0pOworICAgIGlmIChJc011bHRpcGxlU2VsKCkpCisgICAgICAgIHJldHVybiBHZXRJdGVtVGV4dChtX25DYXJldEluZGV4KTsKKyAgICByZXR1cm4gR2V0SXRlbVRleHQobV9uU2VsSXRlbSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvRmllbGQuY3BwIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAKaW5kZXggYTQ1ZTk2Ni4uNTc2ZTEyYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAKKysrIGIvZnBkZnNkay9zcmMvamF2YXNjcmlwdC9GaWVsZC5jcHAKQEAgLTM2NDAsNyArMzY0MCw3IEBACiAJCUZpZWxkKiBwRmllbGQgPSAoRmllbGQqKXBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpOyAKIAkJQVNTRVJUKHBGaWVsZCAhPSBOVUxMKTsKIAotCQlwRmllbGQtPkF0dGFjaEZpZWxkKHRoaXMtPm1fcEpTRG9jLCAqcFN0cik7CisJCXBGaWVsZC0+QXR0YWNoRmllbGQobV9wSlNEb2MsICpwU3RyKTsKIAkKIAkJQ0pTX1ZhbHVlIEZvcm1GaWVsZFZhbHVlKG1faXNvbGF0ZSk7CiAJCUZvcm1GaWVsZFZhbHVlID0gcEpTRmllbGQ7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKaW5kZXggYmJlNWMwMi4uYzNhMzM3MDIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL2phdmFzY3JpcHQvZ2xvYmFsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKQEAgLTI5NSwxNyArMjk1LDE3IEBACiAJCXN3aXRjaCAocERhdGEtPmRhdGEublR5cGUpCiAJCXsKIAkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVNQkVSOgotCQkJdGhpcy0+U2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9OVU1CRVIsIHBEYXRhLT5kYXRhLmREYXRhLCBmYWxzZSwgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisJCQlTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX05VTUJFUiwgcERhdGEtPmRhdGEuZERhdGEsIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKIAkJCUpTX1B1dE9iamVjdE51bWJlcihOVUxMLChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpLAogCQkJCQkJCSAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksIHBEYXRhLT5kYXRhLmREYXRhKTsKIAkJCWJyZWFrOwogCQljYXNlIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOOgotCQkJdGhpcy0+U2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOLCAwLCAoYm9vbCkocERhdGEtPmRhdGEuYkRhdGEgPT0gMSksICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOworCQkJU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9CT09MRUFOLCAwLCAoYm9vbCkocERhdGEtPmRhdGEuYkRhdGEgPT0gMSksICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwogCQkJSlNfUHV0T2JqZWN0Qm9vbGVhbihOVUxMLChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpLAogCQkJCQkJCQlwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLCAoYm9vbCkocERhdGEtPmRhdGEuYkRhdGEgPT0gMSkpOwogCQkJYnJlYWs7CiAJCWNhc2UgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORzoKLQkJCXRoaXMtPlNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgcERhdGEtPmRhdGEuc0RhdGEsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisJCQlTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX1NUUklORywgMCwgZmFsc2UsIHBEYXRhLT5kYXRhLnNEYXRhLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwogCQkJSlNfUHV0T2JqZWN0U3RyaW5nKE5VTEwsIChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpLAogCQkJCQkJCSAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCksCiAJCQkJCQkJICAgcERhdGEtPmRhdGEuc0RhdGEuVVRGOERlY29kZSgpLmNfc3RyKCkpOwpAQCAtMzE3LDE0ICszMTcsMTQgQEAKIAogCQkJCVB1dE9iamVjdFByb3BlcnR5KHBPYmosICZwRGF0YS0+ZGF0YSk7CiAKLQkJCQl0aGlzLT5TZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLCAKKwkJCQlTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR0xPQkFMREFUQV9UWVBFX09CSkVDVCwgMCwgZmFsc2UsICIiLAogCQkJCQkoSlNPYmplY3QpcE9iaiwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwogCQkJCUpTX1B1dE9iamVjdE9iamVjdChOVUxMLChKU0ZYT2JqZWN0KSgqbV9wSlNPYmplY3QpLAogCQkJCQkJCQkgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKS5jX3N0cigpLCAoSlNPYmplY3QpcE9iaik7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTDoKLQkJCXRoaXMtPlNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HTE9CQUxEQVRBX1RZUEVfTlVMTCwgMCwgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOworCQkJU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dMT0JBTERBVEFfVFlQRV9OVUxMLCAwLCBmYWxzZSwgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CiAJCQlKU19QdXRPYmplY3ROdWxsKE5VTEwsKEpTRlhPYmplY3QpKCptX3BKU09iamVjdCksCiAJCQkJCQkJIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLmNfc3RyKCkpOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwCmluZGV4IGNkYzdkNTcuLmUwNTBmMzQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwCkBAIC0xMzEsNyArMTMxLDcgQEAKIHsKIAlyZXR1cm4gQ1BERl9SZWN0KG1fcHRGb290LngsCiAJCQltX3B0Rm9vdC55LAotCQkJbV9wdEhlYWQueCArIHRoaXMtPm1fZldpZHRoLAorCQkJbV9wdEhlYWQueCArIG1fZldpZHRoLAogCQkJbV9wdEhlYWQueSk7CiB9CiAKQEAgLTE0NCw4ICsxNDQsOCBAQAogCQkJaWYgKG1fcHRIZWFkLnggIT0gcHRIZWFkLnggfHwgbV9wdEhlYWQueSAhPSBwdEhlYWQueSB8fCAKIAkJCQkJbV9wdEZvb3QueCAhPSBwdEZvb3QueCB8fCBtX3B0Rm9vdC55ICE9IHB0Rm9vdC55KQogCQkJewotCQkJCXRoaXMtPm1fcHRIZWFkID0gcHRIZWFkOwotCQkJCXRoaXMtPm1fcHRGb290ID0gcHRGb290OworCQkJCW1fcHRIZWFkID0gcHRIZWFkOworCQkJCW1fcHRGb290ID0gcHRGb290OwogCiAJCQkJbV9iRmxhc2ggPSBUUlVFOwogCQkJCS8vTW92ZShHZXRDYXJldFJlY3QoKSxGQUxTRSxUUlVFKTsKQEAgLTE1NCw4ICsxNTQsOCBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJdGhpcy0+bV9wdEhlYWQgPSBwdEhlYWQ7Ci0JCQl0aGlzLT5tX3B0Rm9vdCA9IHB0Rm9vdDsKKwkJCW1fcHRIZWFkID0gcHRIZWFkOworCQkJbV9wdEZvb3QgPSBwdEZvb3Q7CiAKIAkJCUVuZFRpbWVyKCk7CiAJCQlCZWdpblRpbWVyKFBXTF9DQVJFVF9GTEFTSElOVEVSVkFMKTsKQEAgLTE2OSw4ICsxNjksOCBAQAogCX0KIAllbHNlCiAJewotCQl0aGlzLT5tX3B0SGVhZCA9IENQREZfUG9pbnQoMCwwKTsKLQkJdGhpcy0+bV9wdEZvb3QgPSBDUERGX1BvaW50KDAsMCk7CisJCW1fcHRIZWFkID0gQ1BERl9Qb2ludCgwLCAwKTsKKwkJbV9wdEZvb3QgPSBDUERGX1BvaW50KDAsIDApOwogCiAJCW1fYkZsYXNoID0gRkFMU0U7CiAJCWlmIChJc1Zpc2libGUoKSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAKaW5kZXggNmVkNjRhNC4uYmRlNWQyMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Db21ib0JveC5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKIAkJUmVsZWFzZUNhcHR1cmUoKTsKIAkJbV9iTW91c2VEb3duID0gRkFMU0U7CQogCi0JCWlmICh0aGlzLT5DbGllbnRIaXRUZXN0KHBvaW50KSkKKwkJaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKQogCQl7CiAJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQl7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAl7CiAJCUNGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOwkKIAotCQlDUERGX1BvaW50IHB0Q2VudGVyID0gdGhpcy0+R2V0Q2VudGVyUG9pbnQoKTsKKwkJQ1BERl9Qb2ludCBwdENlbnRlciA9IEdldENlbnRlclBvaW50KCk7CiAKIAkJQ1BERl9Qb2ludCBwdDEocHRDZW50ZXIueCAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwogCQlDUERGX1BvaW50IHB0MihwdENlbnRlci54ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4scHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkKIAlpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKQogCXsKLQkJQ1BERl9Qb2ludCBwdENlbnRlciA9IHRoaXMtPkdldENlbnRlclBvaW50KCk7CisJCUNQREZfUG9pbnQgcHRDZW50ZXIgPSBHZXRDZW50ZXJQb2ludCgpOwogCiAJCUNQREZfUG9pbnQgcHQxKHB0Q2VudGVyLnggLSBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTixwdENlbnRlci55ICsgUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKIAkJQ1BERl9Qb2ludCBwdDIocHRDZW50ZXIueCArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKaW5kZXggNjJmMDllZi4uODU2YWRjZiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9FZGl0LmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXQuY3BwCkBAIC04MywxOCArODMsMTQgQEAKIAogdm9pZCBDUFdMX0VkaXQ6OlJlUG9zQ2hpbGRXbmQoKQogewotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCi0JewotCQkvL2lmIChwVlNCLT5Jc1Zpc2libGUoKSkKLQkJewotCQkJQ1BERl9SZWN0IHJjV2luZG93ID0gbV9yY09sZFdpbmRvdzsJCQotCQkJQ1BERl9SZWN0IHJjVlNjcm9sbCA9IENQREZfUmVjdChyY1dpbmRvdy5yaWdodCwKLQkJCQkJCQkJcmNXaW5kb3cuYm90dG9tLAotCQkJCQkJCQlyY1dpbmRvdy5yaWdodCArIFBXTF9TQ1JPTExCQVJfV0lEVEgsCi0JCQkJCQkJCXJjV2luZG93LnRvcCk7Ci0JCQlwVlNCLT5Nb3ZlKHJjVlNjcm9sbCwgVFJVRSwgRkFMU0UpOwotCQl9Ci0JfQorICAgIGlmIChDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKKyAgICAgICAgQ1BERl9SZWN0IHJjV2luZG93ID0gbV9yY09sZFdpbmRvdzsKKyAgICAgICAgQ1BERl9SZWN0IHJjVlNjcm9sbCA9IENQREZfUmVjdChyY1dpbmRvdy5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3cucmlnaHQgKyBQV0xfU0NST0xMQkFSX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjV2luZG93LnRvcCk7CisgICAgICAgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCBUUlVFLCBGQUxTRSk7CisgICAgfQogCiAJaWYgKG1fcEVkaXRDYXJldCAmJiAhSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSkKIAkJbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRDbGllbnRSZWN0KCksMS4wZikpOyAvLysxIGZvciBjYXJldCBiZXNpZGUgYm9yZGVyCkBAIC0xMDYsNyArMTAyLDcgQEAKIHsKIAlDUERGX1JlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpK0dldElubmVyQm9yZGVyV2lkdGgoKSkpOwogCQotCWlmIChDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCisJaWYgKENQV0xfU2Nyb2xsQmFyICogcFZTQiA9IEdldFZTY3JvbGxCYXIoKSkKIAl7CiAJCWlmIChwVlNCLT5Jc1Zpc2libGUoKSkKIAkJewpAQCAtMzkxLDcgKzM4Nyw3IEBACiAKIAlpZiAoc1RleHQuR2V0TGVuZ3RoKCkgPiAwKQogCXsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOworCQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAJCXNBcHBTdHJlYW0gPDwgInFcbi9UeCBCTUNcbiI7CiAJCQogCQlpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCkBAIC00NzksMTQgKzQ3NSwxNCBAQAogCX0KIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKIAlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSxwVXNlcjJEZXZpY2UsbV9wRWRpdCwKLQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpLAotCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSx0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSksCisJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRTdHJva2VDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCiAJCXJjQ2xpcCxDUERGX1BvaW50KDAuMGYsMC4wZikscFJhbmdlLCBwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlcik7CiAKIAlpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpCiAJewogCQlDUFdMX1V0aWxzOjpEcmF3RWRpdFNwZWxsQ2hlY2socERldmljZSxwVXNlcjJEZXZpY2UsbV9wRWRpdCxyY0NsaXAsCi0JCQlDUERGX1BvaW50KDAuMGYsMC4wZikscFJhbmdlLCB0aGlzLT5HZXRDcmVhdGlvblBhcmFtKCkucFNwZWxsQ2hlY2spOworCQkJQ1BERl9Qb2ludCgwLjBmLDAuMGYpLHBSYW5nZSwgR2V0Q3JlYXRpb25QYXJhbSgpLnBTcGVsbENoZWNrKTsKIAl9CiB9CiAKQEAgLTQ5Nyw3ICs0OTMsNyBAQAogCWlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKQogCXsKIAkJaWYgKG1fYk1vdXNlRG93bikKLQkJCXRoaXMtPkludmFsaWRhdGVSZWN0KCk7CisJCQlJbnZhbGlkYXRlUmVjdCgpOwogCiAJCW1fYk1vdXNlRG93biA9IFRSVUU7CQkKIAkJU2V0Q2FwdHVyZSgpOwpAQCAtNTQwLDcgKzUzNiw3IEBACiAJSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKTsKIAlpZiAoIXBTSCkgcmV0dXJuIEZBTFNFOwogCi0JdGhpcy0+U2V0Rm9jdXMoKTsKKwlTZXRGb2N1cygpOwogCiAJQ1BWVF9Xb3JkUmFuZ2Ugd3JMYXRpbiA9IEdldExhdGluV29yZHNSYW5nZShwb2ludCk7CiAJQ0ZYX1dpZGVTdHJpbmcgc3dMYXRpbiA9IG1fcEVkaXQtPkdldFJhbmdlVGV4dCh3ckxhdGluKTsKQEAgLTU3OSw3ICs1NzUsNyBAQAogCQl9CiAJfQogCi0JSVBXTF9Qcm92aWRlciogcFByb3ZpZGVyID0gdGhpcy0+R2V0UHJvdmlkZXIoKTsKKwlJUFdMX1Byb3ZpZGVyKiBwUHJvdmlkZXIgPSBHZXRQcm92aWRlcigpOwogCiAJaWYgKEhhc0ZsYWcoUEVTX1VORE8pKQogCXsKQEAgLTYwNCw3ICs2MDAsNyBAQAogCXBTSC0+QXBwZW5kTWVudUl0ZW0oaFBvcHVwLCBXTV9QV0xFRElUX0RFTEVURSwgCiAJCXBQcm92aWRlciA/IHBQcm92aWRlci0+TG9hZFBvcHVwTWVudVN0cmluZyg1KSA6IEwiJkRlbGV0ZSIpOwogCi0JQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gcFNILT5HZXRDbGlwYm9hcmRUZXh0KHRoaXMtPkdldEF0dGFjaGVkSFduZCgpKTsKKwlDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBwU0gtPkdldENsaXBib2FyZFRleHQoR2V0QXR0YWNoZWRIV25kKCkpOwogCWlmIChzd1RleHQuSXNFbXB0eSgpKQogCQlwU0gtPkVuYWJsZU1lbnVJdGVtKGhQb3B1cCwgV01fUFdMRURJVF9QQVNURSwgRkFMU0UpOwogCkBAIC02NjIsMTkgKzY1OCwxOSBAQAogCQlSZWRvKCk7CiAJCWJyZWFrOwogCWNhc2UgV01fUFdMRURJVF9DVVQ6Ci0JCXRoaXMtPkN1dFRleHQoKTsKKwkJQ3V0VGV4dCgpOwogCQlicmVhazsKIAljYXNlIFdNX1BXTEVESVRfQ09QWToKLQkJdGhpcy0+Q29weVRleHQoKTsKKwkJQ29weVRleHQoKTsKIAkJYnJlYWs7CiAJY2FzZSBXTV9QV0xFRElUX1BBU1RFOgotCQl0aGlzLT5QYXN0ZVRleHQoKTsKKwkJUGFzdGVUZXh0KCk7CiAJCWJyZWFrOwogCWNhc2UgV01fUFdMRURJVF9ERUxFVEU6Ci0JCXRoaXMtPkNsZWFyKCk7CisJCUNsZWFyKCk7CiAJCWJyZWFrOwogCWNhc2UgV01fUFdMRURJVF9TRUxFQ1RBTEw6Ci0JCXRoaXMtPlNlbGVjdEFsbCgpOworCQlTZWxlY3RBbGwoKTsKIAkJYnJlYWs7CiAJY2FzZSBXTV9QV0xFRElUX1NVR0dFU1QgKyAwOgogCQlTZXRTZWwobV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5CZWdpblBvcyksbV9wRWRpdC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgod3JMYXRpbi5FbmRQb3MpKTsKQEAgLTg0Nyw3ICs4NDMsNyBAQAogCiAJCWlmIChIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKQogCQl7Ci0JCQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSB0aGlzLT5HZXRGb250TWFwKCkpCisJCQlpZiAoSUZYX0VkaXRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCiAJCQl7CiAJCQkJRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKHBGb250TWFwLT5HZXRQREZGb250KDApLCBHZXRDbGllbnRSZWN0KCksIG5DaGFyQXJyYXkpOwogCQkJCWlmIChmRm9udFNpemUgPiAwLjBmKQpAQCAtMTA3NywxMyArMTA3MywxMyBAQAogCiAJCWlmICh6RGVsdGEgPiAwKQogCQl7Ci0JCQlwdFNjcm9sbC55ICs9IHRoaXMtPkdldEZvbnRTaXplKCk7CisJCQlwdFNjcm9sbC55ICs9IEdldEZvbnRTaXplKCk7CiAJCX0KIAkJZWxzZQogCQl7Ci0JCQlwdFNjcm9sbC55IC09IHRoaXMtPkdldEZvbnRTaXplKCk7CisJCQlwdFNjcm9sbC55IC09IEdldEZvbnRTaXplKCk7CiAJCX0KLQkJdGhpcy0+U2V0U2Nyb2xsUG9zKHB0U2Nyb2xsKTsKKwkJU2V0U2Nyb2xsUG9zKHB0U2Nyb2xsKTsKIAogCQlyZXR1cm4gVFJVRTsKIAl9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuY3BwCmluZGV4IDU3YjBjMDEuLmY1NjIwNzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCkBAIC00Myw5ICs0Myw5IEBACiAKIHZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGVkKCkKIHsKLQlTZXRGb250U2l6ZSh0aGlzLT5HZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKKwlTZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKIAotCW1fcEVkaXQtPlNldEZvbnRNYXAodGhpcy0+R2V0Rm9udE1hcCgpKTsKKwltX3BFZGl0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7CiAJbV9wRWRpdC0+U2V0Tm90aWZ5KHRoaXMpOwogCW1fcEVkaXQtPkluaXRpYWxpemUoKTsKIH0KQEAgLTY0LDcgKzY0LDcgQEAKIAogdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDdXJzb3IoKQogewotCWlmIChJc1ZhbGlkKCkpIAorCWlmIChJc1ZhbGlkKCkpCiAJewogCQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKIAkJewpAQCAtOTgsNyArOTgsNyBAQAogCQkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwotCQljYXNlIFBOTV9TRVRTQ1JPTExQT1M6CQkJCisJCWNhc2UgUE5NX1NFVFNDUk9MTFBPUzoKIAkJCXN3aXRjaCAod1BhcmFtKQogCQkJewogCQkJCWNhc2UgU0JUX1ZTQ1JPTEw6CkBAIC0xMjQsOSArMTI0LDkgQEAKIAkJCXsKIAkJCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwQ2FyZXRJbmZvID0gKFBXTF9DQVJFVF9JTkZPICopd1BhcmFtKQogCQkJCXsKLQkJCQkJdGhpcy0+U2V0Q2FyZXQocENhcmV0SW5mby0+YlZpc2libGUsCisJCQkJCVNldENhcmV0KHBDYXJldEluZm8tPmJWaXNpYmxlLAogCQkJCQkJcENhcmV0SW5mby0+cHRIZWFkLAotCQkJCQkJcENhcmV0SW5mby0+cHRGb290KTsJCQkJCQorCQkJCQkJcENhcmV0SW5mby0+cHRGb290KTsKIAkJCQl9CiAJCQl9CiAJCQlicmVhazsKQEAgLTE0Myw3ICsxNDMsNyBAQAogewogCWlmICghbV9wRWRpdENhcmV0KQogCXsKLQkJbV9wRWRpdENhcmV0ID0gbmV3IENQV0xfQ2FyZXQ7CQorCQltX3BFZGl0Q2FyZXQgPSBuZXcgQ1BXTF9DYXJldDsKIAkJbV9wRWRpdENhcmV0LT5TZXRJbnZhbGlkUmVjdChHZXRDbGllbnRSZWN0KCkpOwogCiAJCVBXTF9DUkVBVEVQQVJBTQllY3AgPSBjcDsKQEAgLTIwNyw3ICsyMDcsNyBAQAogCiAJc3dpdGNoIChuQ2hhcikKIAl7Ci0JCWNhc2UgRldMX1ZLRVlfRGVsZXRlOgkKKwkJY2FzZSBGV0xfVktFWV9EZWxldGU6CiAJCQlEZWxldGUoKTsKIAkJCXJldHVybiBUUlVFOwogCQljYXNlIEZXTF9WS0VZX0luc2VydDoKQEAgLTI0MSw3ICsyNDEsNyBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJfQotCQorCiAJcmV0dXJuIGJSZXQ7CiB9CiAKQEAgLTI1Niw3ICsyNTYsNyBAQAogCXsKIAkJY2FzZSAweDBBOgogCQljYXNlIDB4MUI6Ci0JCQlyZXR1cm4gRkFMU0U7CQkKKwkJCXJldHVybiBGQUxTRTsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCX0KQEAgLTI3MiwxNiArMjcyLDE2IEBACiAJCXN3aXRjaCAobkNoYXIpCiAJCXsKIAkJCWNhc2UgJ0MnIC0gJ0EnICsgMToKLQkJCQl0aGlzLT5Db3B5VGV4dCgpOworCQkJCUNvcHlUZXh0KCk7CiAJCQkJcmV0dXJuIFRSVUU7CiAJCQljYXNlICdWJyAtICdBJyArIDE6Ci0JCQkJdGhpcy0+UGFzdGVUZXh0KCk7CisJCQkJUGFzdGVUZXh0KCk7CiAJCQkJcmV0dXJuIFRSVUU7CiAJCQljYXNlICdYJyAtICdBJyArIDE6Ci0JCQkJdGhpcy0+Q3V0VGV4dCgpOworCQkJCUN1dFRleHQoKTsKIAkJCQlyZXR1cm4gVFJVRTsKIAkJCWNhc2UgJ0EnIC0gJ0EnICsgMToKLQkJCQl0aGlzLT5TZWxlY3RBbGwoKTsKKwkJCQlTZWxlY3RBbGwoKTsKIAkJCQlyZXR1cm4gVFJVRTsKIAkJCWNhc2UgJ1onIC0gJ0EnICsgMToKIAkJCQlpZiAoYlNoaWZ0KQpAQCAtMzA3LDcgKzMwNyw3IEBACiAJY2FzZSBGV0xfVktFWV9CYWNrOgogCQlCYWNrc3BhY2UoKTsKIAkJYnJlYWs7Ci0JY2FzZSBGV0xfVktFWV9SZXR1cm46CQorCWNhc2UgRldMX1ZLRVlfUmV0dXJuOgogCQlJbnNlcnRSZXR1cm4oKTsKIAkJYnJlYWs7CiAJY2FzZSBGV0xfVktFWV9Vbmtub3duOgpAQCAtMzE1LDcgKzMxNSw3IEBACiAJZGVmYXVsdDoKIAkJaWYgKElzSU5TRVJUcHJlc3NlZChuRmxhZykpCiAJCQlEZWxldGUoKTsKLQkJSW5zZXJ0V29yZCh3b3JkLCB0aGlzLT5HZXRDaGFyU2V0KCkpOworCQlJbnNlcnRXb3JkKHdvcmQsIEdldENoYXJTZXQoKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzI3LDExICszMjcsMTEgQEAKIAlDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCxuRmxhZyk7CiAKIAlpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkpCi0JewkJCisJewogCQlpZiAobV9iTW91c2VEb3duKQotCQkJdGhpcy0+SW52YWxpZGF0ZVJlY3QoKTsKKwkJCUludmFsaWRhdGVSZWN0KCk7CiAKLQkJbV9iTW91c2VEb3duID0gVFJVRTsJCQorCQltX2JNb3VzZURvd24gPSBUUlVFOwogCQlTZXRDYXB0dXJlKCk7CiAKIAkJbV9wRWRpdC0+T25Nb3VzZURvd24ocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKQEAgLTM0Nyw4ICszNDcsOCBAQAogCWlmIChtX2JNb3VzZURvd24pCiAJewogCQkvL2NhbiByZWNlaXZlIGtleWJvcmQgbWVzc2FnZQotCQlpZiAoQ2xpZW50SGl0VGVzdChwb2ludCkgJiYgIXRoaXMtPklzRm9jdXNlZCgpKQotCQkJU2V0Rm9jdXMoKTsJCisJCWlmIChDbGllbnRIaXRUZXN0KHBvaW50KSAmJiAhSXNGb2N1c2VkKCkpCisJCQlTZXRGb2N1cygpOwogCiAJCVJlbGVhc2VDYXB0dXJlKCk7CiAJCW1fYk1vdXNlRG93biA9IEZBTFNFOwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJfQogCiAJQ1BWVF9Xb3JkUGxhY2Ugd3BUZW1wID0gbV9wRWRpdC0+R2V0Q2FyZXRXb3JkUGxhY2UoKTsKLQl0aGlzLT5JT25TZXRDYXJldChiVmlzaWJsZSxwdEhlYWQscHRGb290LHdwVGVtcCk7CisJSU9uU2V0Q2FyZXQoYlZpc2libGUscHRIZWFkLHB0Rm9vdCx3cFRlbXApOwogfQogCiB2b2lkIENQV0xfRWRpdEN0cmw6OkdldENhcmV0SW5mbyhDUERGX1BvaW50ICYgcHRIZWFkLCBDUERGX1BvaW50ICYgcHRGb290KSBjb25zdApAQCAtNDAwLDcgKzQwMCw3IEBACiAJCQlwdEZvb3QueSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50OwogCQl9CiAJCWVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkKLQkJewkJCQkKKwkJewogCQkJcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OwogCQkJcHRIZWFkLnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKIAkJCXB0Rm9vdC54ID0gbGluZS5wdExpbmUueDsKQEAgLTUyNCw3ICs1MjQsNyBAQAogCQllbHNlIGlmIChIYXNGbGFnKFBFU19SSUNIKSkKIAkJewogCQkJaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKSkKLQkJCXsJCQkJCisJCQl7CiAJCQkJbkZvbnRJbmRleCA9IHNlY3Rpb24uV29yZFByb3BzLm5Gb250SW5kZXg7CiAJCQl9CiAJCX0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCQllbHNlIGlmIChIYXNGbGFnKFBFU19SSUNIKSkKIAkJewogCQkJaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKSkKLQkJCXsJCQkJCisJCQl7CiAJCQkJZkZvbnRTaXplID0gc2VjdGlvbi5Xb3JkUHJvcHMuZkZvbnRTaXplOwogCQkJfQogCQl9CkBAIC02MzQsOCArNjM0LDggQEAKIAkJbV9wRWRpdC0+VW5kbygpOwogfQogCi12b2lkIENQV0xfRWRpdEN0cmw6OklPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LCAKLQkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwgCit2b2lkIENQV0xfRWRpdEN0cmw6OklPblNldFNjcm9sbEluZm9ZKEZYX0ZMT0FUIGZQbGF0ZU1pbiwgRlhfRkxPQVQgZlBsYXRlTWF4LAorCQkJCQkJCQkJCQkJRlhfRkxPQVQgZkNvbnRlbnRNaW4sIEZYX0ZMT0FUIGZDb250ZW50TWF4LAogCQkJCQkJCQkJCQkJRlhfRkxPQVQgZlNtYWxsU3RlcCwgRlhfRkxPQVQgZkJpZ1N0ZXApCiB7CiAJUFdMX1NDUk9MTF9JTkZPIEluZm87CkBAIC02NDYsMjUgKzY0NiwyMiBAQAogCUluZm8uZlNtYWxsU3RlcCA9IGZTbWFsbFN0ZXA7CiAJSW5mby5mQmlnU3RlcCA9IGZCaWdTdGVwOwogCi0JdGhpcy0+T25Ob3RpZnkodGhpcyxQTk1fU0VUU0NST0xMSU5GTyxTQlRfVlNDUk9MTCwoaW50cHRyX3QpJkluZm8pOwotCi0vLwlQV0xfVFJBQ0UoInNldCBzY3JvbGwgaW5mbzolZlxuIixmQ29udGVudE1heCAtIGZDb250ZW50TWluKTsKKwlPbk5vdGlmeSh0aGlzLFBOTV9TRVRTQ1JPTExJTkZPLFNCVF9WU0NST0xMLChpbnRwdHJfdCkmSW5mbyk7CiAKIAlpZiAoSXNGbG9hdEJpZ2dlcihJbmZvLmZQbGF0ZVdpZHRoLEluZm8uZkNvbnRlbnRNYXgtSW5mby5mQ29udGVudE1pbikKIAkJfHwgSXNGbG9hdEVxdWFsKEluZm8uZlBsYXRlV2lkdGgsSW5mby5mQ29udGVudE1heC1JbmZvLmZDb250ZW50TWluKSkKIAl7Ci0JCXRoaXMtPlNob3dWU2Nyb2xsQmFyKEZBTFNFKTsJCQorCQlTaG93VlNjcm9sbEJhcihGQUxTRSk7CiAJfQogCWVsc2UKIAl7Ci0JCXRoaXMtPlNob3dWU2Nyb2xsQmFyKFRSVUUpOworCQlTaG93VlNjcm9sbEJhcihUUlVFKTsKIAl9CiB9CiAKIHZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkKIHsKLS8vCVBXTF9UUkFDRSgic2V0IHNjcm9sbCBwb3NpdGlvbjolZlxuIixmeSk7Ci0JdGhpcy0+T25Ob3RpZnkodGhpcyxQTk1fU0VUU0NST0xMUE9TLFNCVF9WU0NST0xMLChpbnRwdHJfdCkmZnkpOworICAgIE9uTm90aWZ5KHRoaXMsIFBOTV9TRVRTQ1JPTExQT1MsU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmZnkpOwogfQogCiB2b2lkIENQV0xfRWRpdEN0cmw6OklPblNldENhcmV0KEZYX0JPT0wgYlZpc2libGUsIGNvbnN0IENQREZfUG9pbnQgJiBwdEhlYWQsIGNvbnN0IENQREZfUG9pbnQgJiBwdEZvb3QsIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkKQEAgLTY3NCw3ICs2NzEsNyBAQAogCWNJbmZvLnB0SGVhZCA9IHB0SGVhZDsKIAljSW5mby5wdEZvb3QgPSBwdEZvb3Q7CiAKLQl0aGlzLT5Pbk5vdGlmeSh0aGlzLFBOTV9TRVRDQVJFVElORk8sKGludHB0cl90KSZjSW5mbywoaW50cHRyX3QpTlVMTCk7CisJT25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKGludHB0cl90KSZjSW5mbywgKGludHB0cl90KU5VTEwpOwogfQogCiB2b2lkIENQV0xfRWRpdEN0cmw6OklPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMgJiBzZWNQcm9wcywgY29uc3QgQ1BWVF9Xb3JkUHJvcHMgJiB3b3JkUHJvcHMpCkBAIC02ODMsNyArNjgwLDcgQEAKIAogdm9pZCBDUFdMX0VkaXRDdHJsOjpJT25Db250ZW50Q2hhbmdlKGNvbnN0IENQREZfUmVjdCYgcmNDb250ZW50KQogewotCWlmICh0aGlzLT5Jc1ZhbGlkKCkpCisJaWYgKElzVmFsaWQoKSkKIAl7CiAJCWlmIChtX3BFZGl0Tm90aWZ5KQogCQl7CkBAIC02OTQsMTUgKzY5MSwxMiBAQAogCiB2b2lkIENQV0xfRWRpdEN0cmw6OklPbkludmFsaWRhdGVSZWN0KENQREZfUmVjdCAqIHBSZWN0KQogewotCXRoaXMtPkludmFsaWRhdGVSZWN0KHBSZWN0KTsKKyAgICBJbnZhbGlkYXRlUmVjdChwUmVjdCk7CiB9CiAKIGludDMyX3QgQ1BXTF9FZGl0Q3RybDo6R2V0Q2hhclNldCgpIGNvbnN0CiB7Ci0JaWYgKG1fbkNoYXJTZXQgPCAwKQotCQlyZXR1cm4gREVGQVVMVF9DSEFSU0VUOyAKLQllbHNlCi0JCXJldHVybiBtX25DaGFyU2V0OworICAgIHJldHVybiBtX25DaGFyU2V0IDwgMCA/IERFRkFVTFRfQ0hBUlNFVCA6IG1fbkNoYXJTZXQ7CiB9CiAKIHZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dFJhbmdlKGNvbnN0IENQREZfUmVjdCYgcmVjdCwgaW50MzJfdCAmIG5TdGFydENoYXIsIGludDMyX3QgJiBuRW5kQ2hhcikgY29uc3QKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCmluZGV4IDNkMzgxZjYuLjhkZmY0ZWEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgpAQCAtMTIsNyArMTIsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Gb250TWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0ZvbnRNYXA6OkNQV0xfRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpIDogCQorQ1BXTF9Gb250TWFwOjpDUFdMX0ZvbnRNYXAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKSA6CiAJbV9wUERGRG9jKE5VTEwpLAogCW1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpCiB7CkBAIC04MCw3ICs4MCw3IEBACiAJaWYgKG5Gb250SW5kZXggPj0wICYmIG5Gb250SW5kZXggPCBtX2FEYXRhLkdldFNpemUoKSkKIAl7CiAJCWlmIChtX2FEYXRhLkdldEF0KG5Gb250SW5kZXgpKQotCQl7CQorCQl7CiAJCQlyZXR1cm4gQ2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCB3b3JkKSA+PSAwOwogCQl9CiAJfQpAQCAtOTksOCArOTksOCBAQAogCXsKIAkJaWYgKGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IEdldEZvbnRNYXBEYXRhKDApKQogCQl7Ci0JCQlpZiAobkNoYXJzZXQgPT0gREVGQVVMVF9DSEFSU0VUIHx8IAotCQkJCXBEYXRhLT5uQ2hhcnNldCA9PSBTWU1CT0xfQ0hBUlNFVCB8fCAKKwkJCWlmIChuQ2hhcnNldCA9PSBERUZBVUxUX0NIQVJTRVQgfHwKKwkJCQlwRGF0YS0+bkNoYXJzZXQgPT0gU1lNQk9MX0NIQVJTRVQgfHwKIAkJCQluQ2hhcnNldCA9PSBwRGF0YS0+bkNoYXJzZXQpCiAJCQl7CiAJCQkJaWYgKEtub3dXb3JkKDAsIHdvcmQpKQpAQCAtMTEzLDE0ICsxMTMsMTQgQEAKIAogCWludDMyX3Qgbk5ld0ZvbnRJbmRleCA9IC0xOwogCi0Jbk5ld0ZvbnRJbmRleCA9IHRoaXMtPkdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCBUUlVFKTsKKwluTmV3Rm9udEluZGV4ID0gR2V0Rm9udEluZGV4KEdldE5hdGl2ZUZvbnROYW1lKG5DaGFyc2V0KSwgbkNoYXJzZXQsIFRSVUUpOwogCWlmIChuTmV3Rm9udEluZGV4ID49IDApCiAJewogCQlpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCiAJCQlyZXR1cm4gbk5ld0ZvbnRJbmRleDsKIAl9CiAKLQluTmV3Rm9udEluZGV4ID0gdGhpcy0+R2V0Rm9udEluZGV4KCJBcmlhbCBVbmljb2RlIE1TIiwgREVGQVVMVF9DSEFSU0VULCBGQUxTRSk7CisJbk5ld0ZvbnRJbmRleCA9IEdldEZvbnRJbmRleCgiQXJpYWwgVW5pY29kZSBNUyIsIERFRkFVTFRfQ0hBUlNFVCwgRkFMU0UpOwogCWlmIChuTmV3Rm9udEluZGV4ID49IDApCiAJewogCQlpZiAoS25vd1dvcmQobk5ld0ZvbnRJbmRleCwgd29yZCkpCkBAIC0yMDMsMTAgKzIwMyw4IEBACiAJCXNGb250TmFtZSA9IERFRkFVTFRfRk9OVF9OQU1FOwogCiAJR2V0Rm9udEluZGV4KHNGb250TmFtZSwgQU5TSV9DSEFSU0VULCBGQUxTRSk7Ci0KLQkvL0dldEZvbnRJbmRleCh0aGlzLT5HZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0KTsKIH0KLQkKKwogCiAvKgogTGlzdCBvZiBjdXJyZW50bHkgc3VwcG9ydGVkIHN0YW5kYXJkIGZvbnRzOgpAQCAtMjc3LDcgKzI3NSw3IEBACiAJCSovCiAJCXsKIAkJCXNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOwotCQl9CQkKKwkJfQogCX0KIAogCUFkZGVkRm9udChwRm9udCwgc0FsaWFzKTsKQEAgLTQwNiw3ICs0MDQsNyBAQAogCiAJaWYgKG1fcFN5c3RlbUhhbmRsZXIpCiAJCXJldHVybiBtX3BTeXN0ZW1IYW5kbGVyLT5BZGROYXRpdmVUcnVlVHlwZUZvbnRUb1BERihwRG9jLCBzRm9udE5hbWUsIG5DaGFyc2V0KTsKLQkKKwogCXJldHVybiBOVUxMOwogfQogCkBAIC01MzQsOSArNTMyLDkgQEAKIAlpZiAobk9sZENoYXJzZXQgIT0gREVGQVVMVF9DSEFSU0VUKSByZXR1cm4gbk9sZENoYXJzZXQ7CiAKIAkvL2ZpbmQgbmV3IGNoYXJzZXQKLQlpZiAoKHdvcmQgPj0gMHg0RTAwICYmIHdvcmQgPD0gMHg5RkE1KSB8fCAKKwlpZiAoKHdvcmQgPj0gMHg0RTAwICYmIHdvcmQgPD0gMHg5RkE1KSB8fAogCQkod29yZCA+PSAweEU3QzcgJiYgd29yZCA8PSAweEU3RjMpIHx8Ci0JCSh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgfHwgLy+jqSKhtiIgIqG3IiAioaMiICKhoiIgCisJCSh3b3JkID49IDB4MzAwMCAmJiB3b3JkIDw9IDB4MzAzRikgfHwKIAkJKHdvcmQgPj0gMHgyMDAwICYmIHdvcmQgPD0gMHgyMDZGKSkKIAl7CiAJCXJldHVybiBHQjIzMTJfQ0hBUlNFVDsKQEAgLTU4NSw3ICs1ODMsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Eb2NGb250TWFwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0RvY0ZvbnRNYXA6OkNQV0xfRG9jRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIENQREZfRG9jdW1lbnQqIHBBdHRhY2hlZERvYykgCitDUFdMX0RvY0ZvbnRNYXA6OkNQV0xfRG9jRm9udE1hcChJRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsIENQREZfRG9jdW1lbnQqIHBBdHRhY2hlZERvYykKIAk6IENQV0xfRm9udE1hcChwU3lzdGVtSGFuZGxlciksCiAJbV9wQXR0YWNoZWREb2MocEF0dGFjaGVkRG9jKQogewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKaW5kZXggZjg1MTU2ZC4uZjI2NmRhMCAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9JY29uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiB7CiAJQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07CiAKLQlDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSB0aGlzLT5HZXRJbWFnZUFsaWFzKCk7CisJQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzID0gR2V0SW1hZ2VBbGlhcygpOwogCUNQREZfUmVjdCByY1BsYXRlID0gR2V0Q2xpZW50UmVjdCgpOwogCUNQREZfTWF0cml4IG10OwogCW10LlNldFJldmVyc2UoR2V0SW1hZ2VNYXRyaXgoKSk7CkBAIC01OCw3ICs1OCw3IEBACiAKIENQREZfU3RyZWFtICogQ1BXTF9JbWFnZTo6R2V0UERGU3RyZWFtKCkKIHsKLQlyZXR1cm4gdGhpcy0+bV9wUERGU3RyZWFtOworCXJldHVybiBtX3BQREZTdHJlYW07CiB9CiAKIHZvaWQgQ1BXTF9JbWFnZTo6R2V0SW1hZ2VTaXplKEZYX0ZMT0FUICYgZldpZHRoLEZYX0ZMT0FUICYgZkhlaWdodCkKQEAgLTE5MywyMyArMTkzLDEzIEBACiAJCUZYX0ZMT0FUIGZJbWFnZVdpZHRoLGZJbWFnZUhlaWdodDsKIAkJRlhfRkxPQVQgZlBsYXRlV2lkdGgsZlBsYXRlSGVpZ2h0OwogCi0JCUNQREZfUmVjdCByY1BsYXRlID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOwkKKwkJQ1BERl9SZWN0IHJjUGxhdGUgPSBHZXRDbGllbnRSZWN0KCk7CiAJCWZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKIAkJZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKIAogCQlHZXRJbWFnZVNpemUoZkltYWdlV2lkdGgsZkltYWdlSGVpZ2h0KTsKIAotCQlpbnQzMl90IG5TY2FsZU1ldGhvZCA9IHRoaXMtPkdldFNjYWxlTWV0aG9kKCk7Ci0KLQkJLyoKLQkJZW51bSBTY2FsZU1ldGhvZAotCQl7Ci0JCQlBbHdheXMgPSAwLAkvL0EsIEFsd2F5cyBzY2FsZQotCQkJQmlnZ2VyLAkJLy9CLCBTY2FsZSBvbmx5IHdoZW4gdGhlIGljb24gaXMgYmlnZ2VyIHRoYW4gdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlCi0JCQlTbWFsbGVyLAkvL1MsIFNjYWxlIG9ubHkgd2hlbiB0aGUgaWNvbiBpcyBzbWFsbGVyIHRoZW4gdGhlIGFubm90YXRpb24gcmVjdGFuZ2xlCi0JCQlOZXZlcgkJLy9OLCBOZXZlciBzY2FsZQotCQl9OwotCQkqLworCQlpbnQzMl90IG5TY2FsZU1ldGhvZCA9IEdldFNjYWxlTWV0aG9kKCk7CiAKIAkJc3dpdGNoIChuU2NhbGVNZXRob2QpCiAJCXsKQEAgLTI0OCw3ICsyMzgsNyBAQAogewogCUZYX0ZMT0FUIGZMZWZ0LGZCb3R0b207CiAKLQl0aGlzLT5HZXRJY29uUG9zaXRpb24oZkxlZnQsZkJvdHRvbSk7CisJR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKIAl4ID0gMC4wZjsKIAl5ID0gMC4wZjsKIApAQCAtMjYyLDcgKzI1Miw3IEBACiAJRlhfRkxPQVQgZkltYWdlRmFjdEhlaWdodCA9IGZJbWFnZUhlaWdodCAqIGZWU2NhbGU7CiAKIAlGWF9GTE9BVCBmUGxhdGVXaWR0aCxmUGxhdGVIZWlnaHQ7Ci0JQ1BERl9SZWN0IHJjUGxhdGUgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CQorCUNQREZfUmVjdCByY1BsYXRlID0gR2V0Q2xpZW50UmVjdCgpOwogCWZQbGF0ZVdpZHRoID0gcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdDsKIAlmUGxhdGVIZWlnaHQgPSByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tOwogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0ljb25MaXN0LmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwCmluZGV4IGNiYjk0ZDIuLjE1N2ViYTYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfSWNvbkxpc3QuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCkBAIC0xOSw4ICsxOSw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ljb25MaXN0X0l0ZW0gLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0ljb25MaXN0X0l0ZW06OkNQV0xfSWNvbkxpc3RfSXRlbSgpIDogCi0JbV9uSWNvbkluZGV4KC0xKSwgCitDUFdMX0ljb25MaXN0X0l0ZW06OkNQV0xfSWNvbkxpc3RfSXRlbSgpIDoKKwltX25JY29uSW5kZXgoLTEpLAogCW1fcERhdGEoTlVMTCksCiAJbV9iU2VsZWN0ZWQoRkFMU0UpLAogCW1fcFRleHQoTlVMTCkKQEAgLTQ3LDE1ICs0NywxNSBAQAogCiAJaWYgKG1fYlNlbGVjdGVkKQogCXsKLQkJaWYgKHRoaXMtPklzRW5hYmxlZCgpKQorCQlpZiAoSXNFbmFibGVkKCkpCiAJCXsKLQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjQ2xpZW50LCAKLQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9TRUxCQUNLQ09MT1IsdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpKTsKKwkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjQ2xpZW50LAorCQkJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX1NFTEJBQ0tDT0xPUiwgR2V0VHJhbnNwYXJlbmN5KCkpKTsKIAkJfQogCQllbHNlCiAJCXsKLQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjQ2xpZW50LCAKLQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9MSUdIVEdSQVlDT0xPUix0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSkpOworCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNDbGllbnQsCisJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfTElHSFRHUkFZQ09MT1IsIEdldFRyYW5zcGFyZW5jeSgpKSk7CiAJCX0KIAl9CiAKQEAgLTYzLDggKzYzLDggQEAKIAlyY0ljb24ubGVmdCArPSBQV0xfSWNvbkxpc3RfSVRFTV9JQ09OX0xFRlRNQVJHSU47CiAJcmNJY29uLnJpZ2h0ID0gcmNJY29uLmxlZnQgKyBQV0xfSWNvbkxpc3RfSVRFTV9XSURUSDsKIAotCUNQV0xfVXRpbHM6OkRyYXdJY29uQXBwU3RyZWFtKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9uSWNvbkluZGV4LCByY0ljb24sIAotCQltX2NySWNvbiwgbV9wVGV4dC0+R2V0VGV4dENvbG9yKCksIHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKTsKKwlDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fbkljb25JbmRleCwgcmNJY29uLAorCQltX2NySWNvbiwgbV9wVGV4dC0+R2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKIH0KIAogdm9pZCBDUFdMX0ljb25MaXN0X0l0ZW06OlNldFNlbGVjdChGWF9CT09MIGJTZWxlY3RlZCkKQEAgLTEzNiwxOSArMTM2LDE5IEBACiAJZWxzZQogCQltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUik7CiAKLQl0aGlzLT5JbnZhbGlkYXRlUmVjdCgpOworCUludmFsaWRhdGVSZWN0KCk7CiB9CiAKIHZvaWQgQ1BXTF9JY29uTGlzdF9JdGVtOjpPbkRpc2FibGVkKCkKIHsKIAltX3BUZXh0LT5TZXRUZXh0Q29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IpOwogCi0JdGhpcy0+SW52YWxpZGF0ZVJlY3QoKTsKKwlJbnZhbGlkYXRlUmVjdCgpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ljb25MaXN0X0NvbnRlbnQgLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9JY29uTGlzdF9Db250ZW50OjpDUFdMX0ljb25MaXN0X0NvbnRlbnQoaW50MzJfdCBuTGlzdENvdW50KSA6IAorQ1BXTF9JY29uTGlzdF9Db250ZW50OjpDUFdMX0ljb25MaXN0X0NvbnRlbnQoaW50MzJfdCBuTGlzdENvdW50KSA6CiAJbV9uU2VsZWN0SW5kZXgoLTEpLAogCW1fcE5vdGlmeShOVUxMKSwKIAltX2JFbmFibGVOb3RpZnkoVFJVRSksCkBAIC0xNzMsMTMgKzE3MywxMyBAQAogCQlwTmV3SXRlbS0+Q3JlYXRlKGljcCk7CiAJfQogCi0JdGhpcy0+U2V0SXRlbVNwYWNlKFBXTF9JY29uTGlzdF9JVEVNX1NQQUNFKTsKLQl0aGlzLT5SZXNldENvbnRlbnQoMCk7CisJU2V0SXRlbVNwYWNlKFBXTF9JY29uTGlzdF9JVEVNX1NQQUNFKTsKKwlSZXNldENvbnRlbnQoMCk7CiAKLQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCisJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCXsKLQkJQ1BERl9SZWN0IHJjU2Nyb2xsID0gdGhpcy0+R2V0U2Nyb2xsQXJlYSgpOwotCQl0aGlzLT5HZXRTY3JvbGxQb3MoKTsKKwkJQ1BERl9SZWN0IHJjU2Nyb2xsID0gR2V0U2Nyb2xsQXJlYSgpOworCQlHZXRTY3JvbGxQb3MoKTsKIAogCQlQV0xfU0NST0xMX0lORk8gc0luZm87CiAJCXNJbmZvLmZDb250ZW50TWluID0gcmNTY3JvbGwuYm90dG9tOwpAQCAtMjg5LDEzICsyODksMTMgQEAKIAkJCX0KIAkJCWVsc2UgaWYgKHJjV25kLmJvdHRvbSA8IHJjQ2xpZW50LmJvdHRvbSkKIAkJCXsKLQkJCQlwdFNjcm9sbC55ID0gcmNPcmlnaW4uYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCk7CQkJCQkKKwkJCQlwdFNjcm9sbC55ID0gcmNPcmlnaW4uYm90dG9tICsgcmNDbGllbnQuSGVpZ2h0KCk7CiAJCQl9CiAKLQkJCXRoaXMtPlNldFNjcm9sbFBvcyhwdFNjcm9sbCk7Ci0JCQl0aGlzLT5SZXNldEZhY2UoKTsKLQkJCXRoaXMtPkludmFsaWRhdGVSZWN0KCk7Ci0JCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKKwkJCVNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CisJCQlSZXNldEZhY2UoKTsKKwkJCUludmFsaWRhdGVSZWN0KCk7CisJCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJCXsKIAkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdFNjcm9sbC55KTsKIAkJCX0KQEAgLTM0Myw3ICszNDMsNyBAQAogCWlmIChDUFdMX0ljb25MaXN0X0l0ZW0qIHBJdGVtID0gR2V0TGlzdEl0ZW0obkl0ZW1JbmRleCkpCiAJewogCQlwSXRlbS0+U2V0U2VsZWN0KGJTZWxlY3QpOwotCQlwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsJCQorCQlwSXRlbS0+SW52YWxpZGF0ZVJlY3QoKTsKIAl9CiB9CiAKQEAgLTQwOCw3ICs0MDgsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLSBDUFdMX0ljb25MaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0ljb25MaXN0OjpDUFdMX0ljb25MaXN0KGludDMyX3Qgbkxpc3RDb3VudCkgOiAKK0NQV0xfSWNvbkxpc3Q6OkNQV0xfSWNvbkxpc3QoaW50MzJfdCBuTGlzdENvdW50KSA6CiAJbV9wTGlzdENvbnRlbnQoTlVMTCksCiAJbV9uTGlzdENvdW50KG5MaXN0Q291bnQpCiB7CkBAIC00MzgsNyArNDM4LDcgQEAKIAogdm9pZCBDUFdMX0ljb25MaXN0OjpPbkNyZWF0ZWQoKQogewotCWlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbEJhciA9IHRoaXMtPkdldFZTY3JvbGxCYXIoKSkKKwlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpCiAJewogCQlwU2Nyb2xsQmFyLT5SZW1vdmVGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpOwogCQlwU2Nyb2xsQmFyLT5TZXRUcmFuc3BhcmVuY3koMjU1KTsKQEAgLTQ1MSwyMCArNDUxLDIwIEBACiAJQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCiAJaWYgKHdQYXJhbSA9PSBTQlRfVlNDUk9MTCkKLQl7CQkKKwl7CiAJCXN3aXRjaCAobXNnKQogCQl7CiAJCWNhc2UgUE5NX1NFVFNDUk9MTElORk86CiAJCQlpZiAoUFdMX1NDUk9MTF9JTkZPKiBwSW5mbyA9IChQV0xfU0NST0xMX0lORk8qKWxQYXJhbSkKIAkJCXsKLQkJCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCkpCisJCQkJaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gR2V0VlNjcm9sbEJhcigpKQogCQkJCXsKIAkJCQkJaWYgKHBJbmZvLT5mQ29udGVudE1heCAtIHBJbmZvLT5mQ29udGVudE1pbiA+IHBJbmZvLT5mUGxhdGVXaWR0aCkKIAkJCQkJewogCQkJCQkJaWYgKCFwU2Nyb2xsQmFyLT5Jc1Zpc2libGUoKSkKIAkJCQkJCXsKIAkJCQkJCQlwU2Nyb2xsQmFyLT5TZXRWaXNpYmxlKFRSVUUpOwotCQkJCQkJCVJlUG9zQ2hpbGRXbmQoKTsJCQkKKwkJCQkJCQlSZVBvc0NoaWxkV25kKCk7CiAJCQkJCQl9CiAJCQkJCQllbHNlCiAJCQkJCQl7CkBAIC00ODEsNyArNDgxLDcgQEAKIAkJCQkJCWlmIChtX3BMaXN0Q29udGVudCkKIAkJCQkJCQltX3BMaXN0Q29udGVudC0+U2V0U2Nyb2xsUG9zKENQREZfUG9pbnQoMC4wZiwwLjBmKSk7CiAJCQkJCX0KLQkJCQkJCisKIAkJCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkocFduZCxQTk1fU0VUU0NST0xMSU5GTyx3UGFyYW0sbFBhcmFtKTsKIAkJCQl9CiAJCQl9CkBAIC00OTUsNyArNDk1LDcgQEAKIAkJCX0KIAkJCXJldHVybjsKIAkJY2FzZSBQTk1fU0VUU0NST0xMUE9TOgotCQkJaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gdGhpcy0+R2V0VlNjcm9sbEJhcigpKQorCQkJaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gR2V0VlNjcm9sbEJhcigpKQogCQkJCXBTY3JvbGxCYXItPk9uTm90aWZ5KHBXbmQsUE5NX1NFVFNDUk9MTFBPUyx3UGFyYW0sbFBhcmFtKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNTc5LDggKzU3OSw4IEBACiAJCQltX3BMaXN0Q29udGVudC0+U2V0U2Nyb2xsUG9zKHB0TmV3KTsKIAkJCW1fcExpc3RDb250ZW50LT5SZXNldEZhY2UoKTsKIAkJCW1fcExpc3RDb250ZW50LT5JbnZhbGlkYXRlUmVjdChOVUxMKTsKLQkJCQotCQkJaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsQmFyID0gdGhpcy0+R2V0VlNjcm9sbEJhcigpKQorCisJCQlpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIgPSBHZXRWU2Nyb2xsQmFyKCkpCiAJCQkJcFNjcm9sbEJhci0+T25Ob3RpZnkodGhpcywgUE5NX1NFVFNDUk9MTFBPUywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmcHROZXcueSk7CiAKIAkJCXJldHVybiBUUlVFOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MYWJlbC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcAppbmRleCA5ODc1MDAyLi4zNWFmM2VlIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xhYmVsLmNwcApAQCAtMzEsOSArMzEsOSBAQAogdm9pZCBDUFdMX0xhYmVsOjpPbkNyZWF0ZWQoKQogewogCVNldFBhcmFtQnlGbGFnKCk7Ci0JU2V0Rm9udFNpemUodGhpcy0+R2V0Q3JlYXRpb25QYXJhbSgpLmZGb250U2l6ZSk7CisJU2V0Rm9udFNpemUoR2V0Q3JlYXRpb25QYXJhbSgpLmZGb250U2l6ZSk7CiAKLQltX3BFZGl0LT5TZXRGb250TWFwKHRoaXMtPkdldEZvbnRNYXAoKSk7CisJbV9wRWRpdC0+U2V0Rm9udE1hcChHZXRGb250TWFwKCkpOwogCW1fcEVkaXQtPkluaXRpYWxpemUoKTsKIAogCWlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQpAQCAtMTI3LDggKzEyNyw4IEBACiAJfQogSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXNIYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpOwogCUlGWF9FZGl0OjpEcmF3RWRpdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fcEVkaXQsCi0JCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCB0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSksCi0JCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRTdHJva2VDb2xvcigpLCB0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSksCisJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCisJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRTdHJva2VDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksCiAJCXJjQ2xpcCwgQ1BERl9Qb2ludCgwLjBmLDAuMGYpLCBwUmFuZ2UscFN5c0hhbmRsZXIsIE5VTEwpOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcAppbmRleCBlY2Y5ZTEyLi4wMzI4ZWU1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKQEAgLTI4LDggKzI4LDggQEAKIHsKIH0KIAotdm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwgCi0JCQkJCQkJCQkJCQlGWF9GTE9BVCBmQ29udGVudE1pbiwgRlhfRkxPQVQgZkNvbnRlbnRNYXgsIAordm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sIEZYX0ZMT0FUIGZQbGF0ZU1heCwKKwkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZDb250ZW50TWluLCBGWF9GTE9BVCBmQ29udGVudE1heCwKIAkJCQkJCQkJCQkJCUZYX0ZMT0FUIGZTbWFsbFN0ZXAsIEZYX0ZMT0FUIGZCaWdTdGVwKQogewogCVBXTF9TQ1JPTExfSU5GTyBJbmZvOwpAQCAtNTEsMTcgKzUxLDE3IEBACiAJCQl7CiAJCQkJcFNjcm9sbC0+U2V0VmlzaWJsZShGQUxTRSk7CiAJCQkJbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwotCQkJfQkJCQorCQkJfQogCQl9CiAJCWVsc2UKIAkJewogCQkJaWYgKCFwU2Nyb2xsLT5Jc1Zpc2libGUoKSkKIAkJCXsKLQkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKFRSVUUpOwkKKwkJCQlwU2Nyb2xsLT5TZXRWaXNpYmxlKFRSVUUpOwogCQkJCW1fcExpc3QtPlJlUG9zQ2hpbGRXbmQoKTsKIAkJCX0KIAkJfQotCX0JCisJfQogfQogCiB2b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpCkBAIC05MSw3ICs5MSw3IEBACiBDUFdMX0xpc3RCb3g6On5DUFdMX0xpc3RCb3goKQogewogCUlGWF9MaXN0OjpEZWxMaXN0KG1fcExpc3QpOwotCQorCiAJaWYgKG1fcExpc3ROb3RpZnkpCiAJewogCQlkZWxldGUgbV9wTGlzdE5vdGlmeTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogfQogCiBDRlhfQnl0ZVN0cmluZyBDUFdMX0xpc3RCb3g6OkdldENsYXNzTmFtZSgpIGNvbnN0Ci17CQorewogCXJldHVybiAiQ1BXTF9MaXN0Qm94IjsKIH0KIApAQCAtMTEyLDEwICsxMTIsMTAgQEAKIAogCQltX3BMaXN0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7CiAJCW1fcExpc3QtPlNldE5vdGlmeShtX3BMaXN0Tm90aWZ5ID0gbmV3IENQV0xfTGlzdF9Ob3RpZnkodGhpcykpOwotCQotCQlTZXRIb3ZlclNlbChIYXNGbGFnKFBMQlNfSE9WRVJTRUwpKTsJCisKKwkJU2V0SG92ZXJTZWwoSGFzRmxhZyhQTEJTX0hPVkVSU0VMKSk7CiAJCW1fcExpc3QtPlNldE11bHRpcGxlU2VsKEhhc0ZsYWcoUExCU19NVUxUSVBMRVNFTCkpOwotCQltX3BMaXN0LT5TZXRGb250U2l6ZSh0aGlzLT5HZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsJCisJCW1fcExpc3QtPlNldEZvbnRTaXplKEdldENyZWF0aW9uUGFyYW0oKS5mRm9udFNpemUpOwogCiAJCW1fYkhvdmVyU2VsID0gSGFzRmxhZyhQTEJTX0hPVkVSU0VMKTsKIAl9CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkJCUNQREZfUmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKIAogCQkJaWYgKHJjSXRlbS5ib3R0b20gPiByY1BsYXRlLnRvcCB8fCByY0l0ZW0udG9wIDwgcmNQbGF0ZS5ib3R0b20pIGNvbnRpbnVlOwotCQkJCisKIAkJCUNQREZfUG9pbnQgcHRPZmZzZXQocmNJdGVtLmxlZnQsIChyY0l0ZW0udG9wICsgcmNJdGVtLmJvdHRvbSkgKiAwLjVmKTsKIAkJCWlmIChtX3BMaXN0LT5Jc0l0ZW1TZWxlY3RlZChpKSkKIAkJCXsKQEAgLTE2OCw4ICsxNjgsOCBAQAogCiAJaWYgKHNMaXN0SXRlbXMuR2V0TGVuZ3RoKCkgPiAwKQogCXsKLQkJQ0ZYX0J5dGVUZXh0QnVmIHNDbGlwOwkJCQotCQlDUERGX1JlY3QgcmNDbGllbnQgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CisJCUNGWF9CeXRlVGV4dEJ1ZiBzQ2xpcDsKKwkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCiAJCXNDbGlwIDw8ICJxXG4iOwogCQlzQ2xpcCA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJewogCQkJQ1BERl9SZWN0IHJjSXRlbSA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KGkpOwogCQkJaWYgKHJjSXRlbS5ib3R0b20gPiByY1BsYXRlLnRvcCB8fCByY0l0ZW0udG9wIDwgcmNQbGF0ZS5ib3R0b20pIGNvbnRpbnVlOwotCQkJCisKIAkJCUNQREZfUG9pbnQgcHRPZmZzZXQocmNJdGVtLmxlZnQsIChyY0l0ZW0udG9wICsgcmNJdGVtLmJvdHRvbSkgKiAwLjVmKTsKIAkJCWlmIChJRlhfRWRpdCogcEVkaXQgPSBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSkKIAkJCXsKQEAgLTIyNiw3ICsyMjYsNyBAQAogCQkJZWxzZQogCQkJewogCQkJCUlGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLQkJCQlJRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwgCisJCQkJSUZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCiAJCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSksCiAJCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0U3Ryb2tlQ29sb3IoKSksCiAJCQkJCQlyY0xpc3QsIHB0T2Zmc2V0LCBOVUxMLHBTeXNIYW5kbGVyLCBOVUxMKTsKQEAgLTI1Miw3ICsyNTIsNyBAQAogCWNhc2UgRldMX1ZLRVlfTGVmdDoKIAljYXNlIEZXTF9WS0VZX0VuZDoKIAljYXNlIEZXTF9WS0VZX1JpZ2h0OgotCQlicmVhazsJCisJCWJyZWFrOwogCX0KIAogCXN3aXRjaCAobkNoYXIpCkBAIC0zNTEsNyArMzUxLDcgQEAKIAl7CiAJCWlmIChtX3BMaXN0KQogCQkJbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsSXNTSElGVHByZXNzZWQobkZsYWcpLElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQl9CQorCX0KIAogCXJldHVybiBUUlVFOwogfQpAQCAtMzYwLDggKzM2MCw4IEBACiB7CiAJQ1BXTF9XbmQ6Ok9uTm90aWZ5KHBXbmQsbXNnLHdQYXJhbSxsUGFyYW0pOwogCi0JRlhfRkxPQVQgZlBvczsJCi0JCisJRlhfRkxPQVQgZlBvczsKKwogCXN3aXRjaCAobXNnKQogCXsKIAljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgpAQCAtMzc1LDcgKzM3NSw3IEBACiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQljYXNlIFBOTV9TRVRTQ1JPTExQT1M6CQkJCisJY2FzZSBQTk1fU0VUU0NST0xMUE9TOgogCQlzd2l0Y2ggKHdQYXJhbSkKIAkJewogCQljYXNlIFNCVF9WU0NST0xMOgpAQCAtNDAxLDI5ICs0MDEsNyBAQAogCiB2b2lkIENQV0xfTGlzdEJveDo6S2lsbEZvY3VzKCkKIHsKLQlDUFdMX1duZDo6S2lsbEZvY3VzKCk7Ci0KLQkvKgotCWlmICh0aGlzLT5Jc011bHRpcGxlU2VsKCkpCi0JewotCQlmb3IoaW50MzJfdCBpPTA7aTx0aGlzLT5HZXRDb3VudCgpO2krKykKLQkJewotCQkJaWYgKHRoaXMtPklzTGlzdEl0ZW1TZWxlY3RlZChpKSkKLQkJCXsKLQkJCQlpZiAoIUlzTGlzdEl0ZW1WaXNpYmxlKGkpKQotCQkJCQl0aGlzLT5TY3JvbGxUb0xpc3RJdGVtKGkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmICghSXNMaXN0SXRlbVZpc2libGUodGhpcy0+R2V0Q3VyU2VsKCkpKQotCQkJdGhpcy0+U2Nyb2xsVG9MaXN0SXRlbSh0aGlzLT5HZXRDdXJTZWwoKSk7Ci0JfQotCi0JU2V0TGlzdEl0ZW1DYXJldChtX25DYXJldEluZGV4LEZBTFNFKTsKLQkqLworICAgIENQV0xfV25kOjpLaWxsRm9jdXMoKTsKIH0KIAogdm9pZCBDUFdMX0xpc3RCb3g6OlJlUG9zQ2hpbGRXbmQoKQpAQCAtNDM3LDcgKzQxNSw3IEBACiB2b2lkIENQV0xfTGlzdEJveDo6T25Ob3RpZnlTZWxDaGFuZ2VkKEZYX0JPT0wgYktleURvd24sIEZYX0JPT0wgJiBiRXhpdCwgIEZYX0RXT1JEIG5GbGFnKQogewogCWlmIChtX3BGaWxsZXJOb3RpZnkpCi0JewkJCisJewogCQlGWF9CT09MIGJSQyA9IFRSVUU7CiAJCUNGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlID0gR2V0VGV4dCgpOwogCQlDRlhfV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKQEAgLTQ1OCwyMyArNDM2LDE4IEBACiAJCXJjQ2FyZXQuSW50ZXJzZWN0KEdldENsaWVudFJlY3QoKSk7CiAJCXJldHVybiByY0NhcmV0OwogCX0KLQkKKwogCXJldHVybiBDUFdMX1duZDo6R2V0Rm9jdXNSZWN0KCk7CiB9CiAKIHZvaWQgQ1BXTF9MaXN0Qm94OjpBZGRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHN0cmluZykKIHsKIAlpZiAobV9wTGlzdCkKLQl7CQkKKwl7CiAJCW1fcExpc3QtPkFkZFN0cmluZyhzdHJpbmcpOwogCX0KIH0KIAotdm9pZCBDUFdMX0xpc3RCb3g6OlNldFRleHQoY29uc3QgRlhfV0NIQVIqIGNzVGV4dCxGWF9CT09MIGJSZWZyZXNoKQotewotCS8vcmV0dXJuIENQREZfTGlzdDo6U2V0VGV4dChjc1RleHQsYlJlZnJlc2gpOwotfQotCiBDRlhfV2lkZVN0cmluZyBDUFdMX0xpc3RCb3g6OkdldFRleHQoKSBjb25zdAogewogCWlmIChtX3BMaXN0KQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9MaXN0Q3RybC5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcAppbmRleCAxN2Q4NDIxLi4zMDc3ZTYyIDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX0xpc3RDdHJsLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgpAQCAtMTAsOSArMTAsOSBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTGlzdEN0cmwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1DUFdMX0xpc3RDdHJsOjpDUFdMX0xpc3RDdHJsKCkgOiAKK0NQV0xfTGlzdEN0cmw6OkNQV0xfTGlzdEN0cmwoKSA6CiAJbV9yY0NvbnRlbnQoMCwwLDAsMCksCi0JbV9wdFNjcm9sbCgwLDApLCAKKwltX3B0U2Nyb2xsKDAsMCksCiAJbV9mSXRlbVNwYWNlKDAuMGYpLAogCW1fZlRvcFNwYWNlKDAuMGYpLAogCW1fZkJvdHRvbVNwYWNlKDAuMGYpCkBAIC0zNyw3ICszNyw3IEBACiAJCW1fcHRTY3JvbGwueSA9IG1fcmNDb250ZW50LnRvcDsKIAogCWlmIChtX3B0U2Nyb2xsLnkgPCBtX3JjQ29udGVudC5ib3R0b20pCi0JCW1fcHRTY3JvbGwueSA9IG1fcmNDb250ZW50LmJvdHRvbTsJCisJCW1fcHRTY3JvbGwueSA9IG1fcmNDb250ZW50LmJvdHRvbTsKIH0KIAogQ1BERl9Qb2ludCBDUFdMX0xpc3RDdHJsOjpHZXRTY3JvbGxQb3MoKSBjb25zdApAQCAtNjcsNyArNjcsNyBAQAogewogCUZYX0ZMT0FUIGZSZXQgPSBtX2ZUb3BTcGFjZTsKIAotCUZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVCl0aGlzLT5HZXRCb3JkZXJXaWR0aCgpOworCUZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpOwogCiAJaWYgKGZMaW1pdFdpZHRoID4gZkJvcmRlcldpZHRoKiAyKQogCXsKQEAgLTExMSw4ICsxMTEsOCBAQAogCQkJRlhfRkxPQVQgZlJpZ2h0ID0gcENoaWxkLT5HZXRJdGVtUmlnaHRNYXJnaW4oKTsKIAogCQkJcENoaWxkLT5TZXRDaGlsZE1hdHJpeCgKLQkJCQlDUERGX01hdHJpeCgxLDAsMCwxLCAKLQkJCQlyY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LCAKKwkJCQlDUERGX01hdHJpeCgxLDAsMCwxLAorCQkJCXJjQ2xpZW50LmxlZnQgLSBtX3B0U2Nyb2xsLngsCiAJCQkJcmNDbGllbnQudG9wIC0gbV9wdFNjcm9sbC55KQogCQkJCSk7CiAKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQkJfQogCQl9CiAJfQotCQorCiAJcERldmljZS0+UmVzdG9yZVN0YXRlKCk7CiB9CiAKQEAgLTIxMSw3ICsyMTEsNyBAQAogewogCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCXJldHVybiBDUERGX1BvaW50KHBvaW50LnggKyByY0NsaWVudC5sZWZ0IC0gbV9wdFNjcm9sbC54LCAKKwlyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54ICsgcmNDbGllbnQubGVmdCAtIG1fcHRTY3JvbGwueCwKIAkJcG9pbnQueSArIHJjQ2xpZW50LnRvcCAtIG1fcHRTY3JvbGwueSk7CiB9CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogewogCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAotCXJldHVybiBDUERGX1BvaW50KHBvaW50LnggLSByY0NsaWVudC5sZWZ0ICsgbV9wdFNjcm9sbC54LCAKKwlyZXR1cm4gQ1BERl9Qb2ludChwb2ludC54IC0gcmNDbGllbnQubGVmdCArIG1fcHRTY3JvbGwueCwKIAkJcG9pbnQueSAtIHJjQ2xpZW50LnRvcCArIG1fcHRTY3JvbGwueSk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX05vdGUuY3BwCmluZGV4IDEzZTE1YTAuLjdlZDExMTUgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfTm90ZS5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9Ob3RlLmNwcApAQCAtMSw3ICsxLDcgQEAKIC8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLSAKKwogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvcGRmd2luZG93L1BERldpbmRvdy5oIgpAQCAtNTEsNyArNTEsNyBAQAogCiB2b2lkIENQV0xfTm90ZV9PcHRpb25zOjpSZVBvc0NoaWxkV25kKCkKIHsKLQlpZiAodGhpcy0+SXNWYWxpZCgpKQorCWlmIChJc1ZhbGlkKCkpCiAJewogCQlBU1NFUlQobV9wVGV4dCAhPSBOVUxMKTsKIApAQCAtMTA2LDggKzEwNiw4IEBACiAJcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKIAlwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOwogCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwgCi0JCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLEdldFRyYW5zcGFyZW5jeSgpKSwgCisJcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgTlVMTCwKKwkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksR2V0VHJhbnNwYXJlbmN5KCkpLAogCQkwLCBGWEZJTExfQUxURVJOQVRFKTsKIH0KIApAQCAtMTM2LDM1ICsxMzYsMzUgQEAKIAogdm9pZCBDUFdMX05vdGVfRWRpdDo6UmVQb3NDaGlsZFduZCgpCiB7Ci0JbV9iRW5hYmxlTm90aWZ5ID0gRkFMU0U7CQorCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwogCUNQV0xfRWRpdDo6UmVQb3NDaGlsZFduZCgpOwogCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CiAKLQltX2ZPbGRJdGVtSGVpZ2h0ID0gdGhpcy0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKwltX2ZPbGRJdGVtSGVpZ2h0ID0gR2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIH0KIAogdm9pZCBDUFdMX05vdGVfRWRpdDo6U2V0VGV4dChjb25zdCBGWF9XQ0hBUiogY3NUZXh0KQogewogCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwogCUNQV0xfRWRpdDo6U2V0VGV4dChjc1RleHQpOwotCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CQotCW1fZk9sZEl0ZW1IZWlnaHQgPSB0aGlzLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOworCW1fYkVuYWJsZU5vdGlmeSA9IFRSVUU7CisJbV9mT2xkSXRlbUhlaWdodCA9IEdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlX0VkaXQ6Ok9uU2V0Rm9jdXMoKQogewotCW1fYkVuYWJsZU5vdGlmeSA9IEZBTFNFOwkKKwltX2JFbmFibGVOb3RpZnkgPSBGQUxTRTsKIAlDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKTsKLQltX2JFbmFibGVOb3RpZnkgPSBUUlVFOwkKKwltX2JFbmFibGVOb3RpZnkgPSBUUlVFOwogCi0JdGhpcy0+RW5hYmxlU3BlbGxDaGVjayhUUlVFKTsKKwlFbmFibGVTcGVsbENoZWNrKFRSVUUpOwogfQogCiB2b2lkIENQV0xfTm90ZV9FZGl0OjpPbktpbGxGb2N1cygpCiB7Ci0JdGhpcy0+RW5hYmxlU3BlbGxDaGVjayhGQUxTRSk7CisJRW5hYmxlU3BlbGxDaGVjayhGQUxTRSk7CiAKLQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKKwlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAl7CiAJCWlmIChDUFdMX1duZCogcEdyYW5kID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCkpCiAJCXsKQEAgLTE4NywxNCArMTg3LDE0IEBACiAJCXsKIAkJCXN3aXRjaCAobXNnKQogCQkJewotCQkJY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoJCisJCQljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgogCQkJCWlmIChQV0xfU0NST0xMX0lORk8qIHBJbmZvID0gKFBXTF9TQ1JPTExfSU5GTyopbFBhcmFtKQotCQkJCXsJCi0JCQkJCWlmICghSXNGbG9hdEVxdWFsKHBJbmZvLT5mQ29udGVudE1heCwgbV9mT2xkTWF4KSB8fCAKKwkJCQl7CisJCQkJCWlmICghSXNGbG9hdEVxdWFsKHBJbmZvLT5mQ29udGVudE1heCwgbV9mT2xkTWF4KSB8fAogCQkJCQkJIUlzRmxvYXRFcXVhbChwSW5mby0+ZkNvbnRlbnRNaW4sIG1fZk9sZE1pbikpCiAJCQkJCXsKLQkJCQkJCW1fYlNpemVDaGFuZ2VkID0gVFJVRTsJCQkJCi0JCQkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCisJCQkJCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CisJCQkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQkJCQl7CiAJCQkJCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CiAJCQkJCQl9CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCX0KLQkJfQkJCisJCX0KIAl9CiAKIAlDUFdMX0VkaXQ6Ok9uTm90aWZ5KHBXbmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwpAQCAtMjE5LDEwICsyMTksMTAgQEAKIAkJCXsKIAkJCQlQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOwogCQkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOwotCQkJCW5ld0luZm8ucHRIZWFkID0gdGhpcy0+Q2hpbGRUb1BhcmVudChwSW5mby0+cHRIZWFkKTsKLQkJCQluZXdJbmZvLnB0Rm9vdCA9IHRoaXMtPkNoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CisJCQkJbmV3SW5mby5wdEhlYWQgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOworCQkJCW5ld0luZm8ucHRGb290ID0gQ2hpbGRUb1BhcmVudChwSW5mby0+cHRGb290KTsKIAotCQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKKwkJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQkJewogCQkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOwogCQkJCX0KQEAgLTIzOSwyMiArMjM5LDE4IEBACiAJCWlmICghbV9iU2l6ZUNoYW5nZWQpCiAJCQlyZXR1cm4gbV9mT2xkSXRlbUhlaWdodDsKIAotCQltX2JTaXplQ2hhbmdlZCA9IEZBTFNFOwkKKwkJbV9iU2l6ZUNoYW5nZWQgPSBGQUxTRTsKIAotCQl0aGlzLT5FbmFibGVOb3RpZnkoRkFMU0UpOwotCQl0aGlzLT5FbmFibGVSZWZyZXNoKEZBTFNFKTsKKwkJRW5hYmxlTm90aWZ5KEZBTFNFKTsKKwkJRW5hYmxlUmVmcmVzaChGQUxTRSk7CiAJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CiAKLQkJLy9DUERGX1JlY3QgcmNPbGQgPSB0aGlzLT5HZXRXaW5kb3dSZWN0KCk7Ci0KLQkJdGhpcy0+TW92ZShDUERGX1JlY3QoMCwwLGZMaW1pdFdpZHRoLDApLCBUUlVFLCBGQUxTRSk7Ci0JCUZYX0ZMT0FUIGZSZXQgPSB0aGlzLT5HZXRDb250ZW50UmVjdCgpLkhlaWdodCgpOwotCi0JCS8vdGhpcy0+TW92ZShyY09sZCwgVFJVRSwgRkFMU0UpOworCQlNb3ZlKENQREZfUmVjdCgwLDAsZkxpbWl0V2lkdGgsMCksIFRSVUUsIEZBTFNFKTsKKwkJRlhfRkxPQVQgZlJldCA9IEdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CiAKIAkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwotCQl0aGlzLT5FbmFibGVOb3RpZnkoVFJVRSk7Ci0JCXRoaXMtPkVuYWJsZVJlZnJlc2goVFJVRSk7CisJCUVuYWJsZU5vdGlmeShUUlVFKTsKKwkJRW5hYmxlUmVmcmVzaChUUlVFKTsKIAogCQlyZXR1cm4gZlJldDsKIAl9CkBAIC0yODQsNyArMjgwLDcgQEAKIAogdm9pZCBDUFdMX05vdGVfTEJCb3g6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQogewotCUNQREZfUmVjdCByY0NsaWVudCA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKKwlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAKIAlDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwogCWdzZC5tX0xpbmVXaWR0aCA9IDEuMGY7CkBAIC0yOTYsOSArMjkyLDkgQEAKIAlwYXRoQ3Jvc3MuU2V0UG9pbnQoMSwgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOwogCXBhdGhDcm9zcy5TZXRQb2ludCgyLCByY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20gKyByY0NsaWVudC5IZWlnaHQoKSAqIDAuNWYsIEZYUFRfTU9WRVRPKTsKIAlwYXRoQ3Jvc3MuU2V0UG9pbnQoMywgcmNDbGllbnQubGVmdCArIHJjQ2xpZW50LldpZHRoKCkgKiAwLjVmLCByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKLQkKLQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aENyb3NzLCBwVXNlcjJEZXZpY2UsICZnc2QsIAotCQkwLCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSx0aGlzLT5HZXRUcmFuc3BhcmVuY3koKSksIEZYRklMTF9BTFRFUk5BVEUpOworCisJcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zcywgcFVzZXIyRGV2aWNlLCAmZ3NkLAorCQkwLCBDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihHZXRUZXh0Q29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpLCBGWEZJTExfQUxURVJOQVRFKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX1JCQm94IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTMxMyw3ICszMDksNyBAQAogCiB2b2lkIENQV0xfTm90ZV9SQkJveDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENQREZfTWF0cml4KiBwVXNlcjJEZXZpY2UpCiB7Ci0JQ1BERl9SZWN0IHJjQ2xpZW50ID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOworCUNQREZfUmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAogCUNGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CiAJZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKQEAgLTMyNSw5ICszMjEsOSBAQAogCXBhdGhDcm9zcy5TZXRQb2ludCgxLCByY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sIEZYUFRfTElORVRPKTsKIAlwYXRoQ3Jvc3MuU2V0UG9pbnQoMiwgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSArIHJjQ2xpZW50LkhlaWdodCgpICogMC41ZiwgRlhQVF9NT1ZFVE8pOwogCXBhdGhDcm9zcy5TZXRQb2ludCgzLCByY0NsaWVudC5sZWZ0ICsgcmNDbGllbnQuV2lkdGgoKSAqIDAuNWYsIHJjQ2xpZW50LmJvdHRvbSwgRlhQVF9MSU5FVE8pOwotCQotCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoQ3Jvc3MsIHBVc2VyMkRldmljZSwgJmdzZCwgCi0JCTAsIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CisKKwlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aENyb3NzLCBwVXNlcjJEZXZpY2UsICZnc2QsCisJCTAsIENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKEdldFRleHRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSksIEZYRklMTF9BTFRFUk5BVEUpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlX0ljb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzQ3LDggKzM0Myw4IEBACiAKIHZvaWQgQ1BXTF9Ob3RlX0ljb246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQogewotCUNQV0xfVXRpbHM6OkRyYXdJY29uQXBwU3RyZWFtKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9uVHlwZSwgR2V0Q2xpZW50UmVjdCgpLCAKLQkJdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCksIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsIHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpKTsKKwlDUFdMX1V0aWxzOjpEcmF3SWNvbkFwcFN0cmVhbShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fblR5cGUsIEdldENsaWVudFJlY3QoKSwKKwkJR2V0QmFja2dyb3VuZENvbG9yKCksIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsIEdldFRyYW5zcGFyZW5jeSgpKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENQV0xfTm90ZV9DbG9zZUJveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNjUsNyArMzYxLDcgQEAKIHsKIAlDUFdMX0J1dHRvbjo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7CiAKLQlDUERGX1JlY3QgcmNDbGllbnQgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CisJQ1BERl9SZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCXJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNDbGllbnQsIDIuMGYpOwogCiAJQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKQEAgLTM4Niw5ICszODIsOSBAQAogCXBhdGhDcm9zcy5TZXRQb2ludCgxLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wLCBGWFBUX0xJTkVUTyk7CiAJcGF0aENyb3NzLlNldFBvaW50KDIsIHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCwgRlhQVF9NT1ZFVE8pOwogCXBhdGhDcm9zcy5TZXRQb2ludCgzLCByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tLCBGWFBUX0xJTkVUTyk7Ci0JCi0JcERldmljZS0+RHJhd1BhdGgoJnBhdGhDcm9zcywgcFVzZXIyRGV2aWNlLCAmZ3NkLCAKLQkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCkpLCBGWEZJTExfQUxURVJOQVRFKTsKKworCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoQ3Jvc3MsIHBVc2VyMkRldmljZSwgJmdzZCwKKwkJMCwgQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoR2V0VGV4dENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKSwgRlhGSUxMX0FMVEVSTkFURSk7CiB9CiAKIEZYX0JPT0wgQ1BXTF9Ob3RlX0Nsb3NlQm94OjpPbkxCdXR0b25Eb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCwgRlhfRFdPUkQgbkZsYWcpCkBAIC00NjAsMjMgKzQ1NiwyMyBAQAogQ1BXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlX0NvbnRlbnRzOjpDcmVhdGVTdWJJdGVtKCkKIHsKIAlDUFdMX05vdGVJdGVtKiBwTm90ZUl0ZW0gPSBuZXcgQ1BXTF9Ob3RlSXRlbTsKLQlQV0xfQ1JFQVRFUEFSQU0gaWNwID0gdGhpcy0+R2V0Q3JlYXRpb25QYXJhbSgpOworCVBXTF9DUkVBVEVQQVJBTSBpY3AgPSBHZXRDcmVhdGlvblBhcmFtKCk7CiAJaWNwLnBQYXJlbnRXbmQgPSB0aGlzOwogCWljcC5kd0ZsYWdzID0gIFBXU19DSElMRCB8IFBXU19WSVNJQkxFIHwgUFdTX0JBQ0tHUk9VTkQ7CiAJcE5vdGVJdGVtLT5DcmVhdGUoaWNwKTsKIAogCXBOb3RlSXRlbS0+T25DcmVhdGVOb3RlSXRlbSgpOwotCQorCiAJcE5vdGVJdGVtLT5SZXNldFN1YmplY3ROYW1lKG1fYUNoaWxkcmVuLkdldFNpemUoKSAtIDEpOwogCiAJRlhfU1lTVEVNVElNRSBzdDsKLQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IHRoaXMtPkdldFN5c3RlbUhhbmRsZXIoKSkKKwlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKIAkJc3QgPSBwU0gtPkdldExvY2FsVGltZSgpOwogCXBOb3RlSXRlbS0+U2V0RGF0ZVRpbWUoc3QpOwogCiAJcE5vdGVJdGVtLT5TZXRDb250ZW50cyhMIiIpOwogCi0JdGhpcy0+T25Ob3RpZnkocE5vdGVJdGVtLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsJCisJT25Ob3RpZnkocE5vdGVJdGVtLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAogCXJldHVybiBwTm90ZUl0ZW07CiB9CkBAIC01MDIsNyArNDk4LDcgQEAKIAogdm9pZCBDUFdMX05vdGVfQ29udGVudHM6OkRlbGV0ZVN1Ykl0ZW0oSVBXTF9Ob3RlSXRlbSogcE5vdGVJdGVtKQogewotCWludDMyX3QgbkluZGV4ID0gdGhpcy0+R2V0SXRlbUluZGV4KChDUFdMX05vdGVJdGVtKilwTm90ZUl0ZW0pOworCWludDMyX3QgbkluZGV4ID0gR2V0SXRlbUluZGV4KChDUFdMX05vdGVJdGVtKilwTm90ZUl0ZW0pOwogCiAJaWYgKG5JbmRleCA+IDApCiAJewpAQCAtNTIzLDEzICs1MTksMTMgQEAKIAkJCX0KIAkJfQogCi0JCXRoaXMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOworCQlPbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAl9CiB9CiAKIElQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZV9Db250ZW50czo6R2V0SGl0Tm90ZUl0ZW0oY29uc3QgQ1BERl9Qb2ludCYgcG9pbnQpCiB7Ci0JQ1BERl9Qb2ludCBwdCA9IHRoaXMtPlBhcmVudFRvQ2hpbGQocG9pbnQpOworCUNQREZfUG9pbnQgcHQgPSBQYXJlbnRUb0NoaWxkKHBvaW50KTsKIAogCWZvciAoaW50MzJfdCBpPTAsc3o9bV9hQ2hpbGRyZW4uR2V0U2l6ZSgpOyBpPHN6OyBpKyspCiAJewpAQCAtNTUyLDExICs1NDgsMTEgQEAKIAl7CiAJY2FzZSBQTk1fTk9URUVESVRDSEFOR0VEOgogCQl7Ci0JCQlpbnQzMl90IG5JbmRleCA9IHRoaXMtPkdldEl0ZW1JbmRleChwV25kKTsKKwkJCWludDMyX3QgbkluZGV4ID0gR2V0SXRlbUluZGV4KHBXbmQpOwogCQkJaWYgKG5JbmRleCA8IDApIG5JbmRleCA9IDA7CiAKLQkJCW1fcEVkaXQtPkVuYWJsZU5vdGlmeShGQUxTRSk7CQotCQkJdGhpcy0+UmVzZXRDb250ZW50KG5JbmRleCk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworCQkJUmVzZXRDb250ZW50KG5JbmRleCk7CiAJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoVFJVRSk7CiAKIAkJCWZvciAoaW50MzJfdCBpPW5JbmRleCsxLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKQEAgLTU2NSwyNiArNTYxLDI2IEBACiAJCQkJCXBDaGlsZC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVSRVNFVCwgMCwgMCk7CiAJCQl9CiAKLQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKKwkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJCXsKIAkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKIAkJCX0KIAkJfQogCQlyZXR1cm47CiAJY2FzZSBQTk1fU0NST0xMV0lORE9XOgotCQl0aGlzLT5TZXRTY3JvbGxQb3MoQ1BERl9Qb2ludCgwLjBmLCAqKEZYX0ZMT0FUKilsUGFyYW0pKTsKLQkJdGhpcy0+UmVzZXRGYWNlKCk7CisJCVNldFNjcm9sbFBvcyhDUERGX1BvaW50KDAuMGYsICooRlhfRkxPQVQqKWxQYXJhbSkpOworCQlSZXNldEZhY2UoKTsKIAkJSW52YWxpZGF0ZVJlY3QoTlVMTCk7Ci0JCXJldHVybjsJCQorCQlyZXR1cm47CiAJY2FzZSBQTk1fU0VUQ0FSRVRJTkZPOgogCQlpZiAoUFdMX0NBUkVUX0lORk8gKiBwSW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKQogCQl7CiAJCQlQV0xfQ0FSRVRfSU5GTyBuZXdJbmZvID0gKnBJbmZvOwogCQkJbmV3SW5mby5iVmlzaWJsZSA9IFRSVUU7Ci0JCQluZXdJbmZvLnB0SGVhZCA9IHRoaXMtPkNoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7Ci0JCQluZXdJbmZvLnB0Rm9vdCA9IHRoaXMtPkNoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CisJCQluZXdJbmZvLnB0SGVhZCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0SGVhZCk7CisJCQluZXdJbmZvLnB0Rm9vdCA9IENoaWxkVG9QYXJlbnQocEluZm8tPnB0Rm9vdCk7CiAKLQkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSB0aGlzLT5HZXRQYXJlbnRXaW5kb3coKSkKKwkJCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJCXsKIAkJCQlwUGFyZW50LT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUQ0FSRVRJTkZPLCAoaW50cHRyX3QpJm5ld0luZm8sIDApOwogCQkJfQpAQCAtNTkyLDE4ICs1ODgsMTggQEAKIAkJcmV0dXJuOwogCWNhc2UgUE5NX05PVEVSRVNFVDoKIAkJewotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsJCi0JCQl0aGlzLT5SZXNldENvbnRlbnQoMCk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworCQkJUmVzZXRDb250ZW50KDApOwogCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogCiAJCQlmb3IgKGludDMyX3QgaT0xLCBzej1tX2FDaGlsZHJlbi5HZXRTaXplKCk7IGk8c3o7IGkrKykKIAkJCXsKIAkJCQlpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IG1fYUNoaWxkcmVuLkdldEF0KGkpKQogCQkJCQlwQ2hpbGQtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwotCQkJfQkKKwkJCX0KIAotCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KEZBTFNFKTsJCi0JCQl0aGlzLT5SZXNldENvbnRlbnQoMCk7CisJCQltX3BFZGl0LT5FbmFibGVOb3RpZnkoRkFMU0UpOworCQkJUmVzZXRDb250ZW50KDApOwogCQkJbV9wRWRpdC0+RW5hYmxlTm90aWZ5KFRSVUUpOwogCQl9CiAJCXJldHVybjsKQEAgLTcwNSw3ICs3MDEsNyBAQAogewogCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKIAotCWlmIChDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZSh0aGlzLT5HZXRCYWNrZ3JvdW5kQ29sb3IoKSkpCisJaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKIAkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7CiAJZWxzZQogCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKQEAgLTczOCw3ICs3MzQsNyBAQAogCiB2b2lkIENQV0xfTm90ZUl0ZW06OlJlUG9zQ2hpbGRXbmQoKQogewotCWlmICh0aGlzLT5Jc1ZhbGlkKCkpCisJaWYgKElzVmFsaWQoKSkKIAl7CiAJCUFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOwogCQlBU1NFUlQobV9wRGF0ZVRpbWUgIT0gTlVMTCk7CkBAIC03ODQsNyArNzgwLDcgQEAKIHZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0QmtDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikKIHsKIAlDUFdMX0NvbG9yIHNCSyA9IGNvbG9yOwotCXRoaXMtPlNldEJhY2tncm91bmRDb2xvcihzQkspOworCVNldEJhY2tncm91bmRDb2xvcihzQkspOwogCiAJQ1BXTF9Db2xvciBzVGV4dENvbG9yOwogCkBAIC03OTMsMTMgKzc4OSwxMyBAQAogCWVsc2UKIAkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7CiAKLQl0aGlzLT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CisJU2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwogCWlmIChtX3BTdWJqZWN0KQogCQltX3BTdWJqZWN0LT5TZXRUZXh0Q29sb3Ioc1RleHRDb2xvcik7CiAJaWYgKG1fcERhdGVUaW1lKQogCQltX3BEYXRlVGltZS0+U2V0VGV4dENvbG9yKHNUZXh0Q29sb3IpOwogCi0JdGhpcy0+SW52YWxpZGF0ZVJlY3QoTlVMTCk7CisJSW52YWxpZGF0ZVJlY3QobnVsbHB0cik7CiAKIAlpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKQogCXsKQEAgLTgyMyw3ICs4MTksNyBAQAogdm9pZCBDUFdMX05vdGVJdGVtOjpTZXRBdXRob3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSkKIHsKIAltX3NBdXRob3IgPSBzTmFtZTsKLQlSZXNldFN1YmplY3ROYW1lKC0xKTsJCisJUmVzZXRTdWJqZWN0TmFtZSgtMSk7CiAKIAlpZiAoSVBXTF9Ob3RlTm90aWZ5KiBwTm90aWZ5ID0gR2V0Tm90ZU5vdGlmeSgpKQogCXsKQEAgLTgzNSw3ICs4MzEsNyBAQAogewogCWlmIChuSXRlbUluZGV4IDwgMCkKIAl7Ci0JCWlmIChDUFdMX1duZCogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQorCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJewogCQkJQVNTRVJUKHBQYXJlbnQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVfQ29udGVudHMiKTsKIApAQCAtODU1LDggKzg1MSw4IEBACiAJCXNTdWJqZWN0ICs9IEwiIC0gIjsKIAkJc1N1YmplY3QgKz0gbV9zQXV0aG9yOwogCX0KLQl0aGlzLT5TZXRTdWJqZWN0TmFtZShzU3ViamVjdCk7Ci0JdGhpcy0+UmVQb3NDaGlsZFduZCgpOworCVNldFN1YmplY3ROYW1lKHNTdWJqZWN0KTsKKwlSZVBvc0NoaWxkV25kKCk7CiB9CiAKIHZvaWQgQ1BXTF9Ob3RlSXRlbTo6U2V0RGF0ZVRpbWUoRlhfU1lTVEVNVElNRSB0aW1lKQpAQCAtODcwLDcgKzg2Niw3IEBACiAJCW1fcERhdGVUaW1lLT5TZXRUZXh0KHN3VGltZS5jX3N0cigpKTsKIAl9CiAKLQl0aGlzLT5SZVBvc0NoaWxkV25kKCk7CisJUmVQb3NDaGlsZFduZCgpOwogCiAJaWYgKElQV0xfTm90ZU5vdGlmeSogcE5vdGlmeSA9IEdldE5vdGVOb3RpZnkoKSkKIAl7CkBAIC04OTMsNyArODg5LDcgQEAKIAogQ1BXTF9Ob3RlSXRlbSogQ1BXTF9Ob3RlSXRlbTo6R2V0UGFyZW50Tm90ZUl0ZW0oKSBjb25zdAogewotCWlmIChDUFdMX1duZCogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQorCWlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCXsKIAkJaWYgKENQV0xfV25kKiBwR3JhbmQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKSkKIAkJewpAQCAtOTI0LDEyICs5MjAsMTIgQEAKIAogQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9Ob3RlSXRlbTo6R2V0QXV0aG9yTmFtZSgpIGNvbnN0CiB7Ci0JcmV0dXJuIG1fc0F1dGhvcjsgCisJcmV0dXJuIG1fc0F1dGhvcjsKIH0KIAogQ1BXTF9Db2xvciBDUFdMX05vdGVJdGVtOjpHZXRCa0NvbG9yKCkgY29uc3QKIHsKLQlyZXR1cm4gdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCk7CisJcmV0dXJuIEdldEJhY2tncm91bmRDb2xvcigpOwogfQogCiBDRlhfV2lkZVN0cmluZyBDUFdMX05vdGVJdGVtOjpHZXRDb250ZW50cygpIGNvbnN0CkBAIC05ODQsNyArOTgwLDcgQEAKIAogdm9pZCBDUFdMX05vdGVJdGVtOjpEZWxldGVTdWJJdGVtKElQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSkKIHsKLQl0aGlzLT5LaWxsRm9jdXMoKTsKKwlLaWxsRm9jdXMoKTsKIAogCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCiAJewpAQCAtOTk3LDkgKzk5Myw5IEBACiAKIElQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldEhpdE5vdGVJdGVtKGNvbnN0IENQREZfUG9pbnQmIHBvaW50KQogewotCUNQREZfUG9pbnQgcHQgPSB0aGlzLT5QYXJlbnRUb0NoaWxkKHBvaW50KTsKKwlDUERGX1BvaW50IHB0ID0gUGFyZW50VG9DaGlsZChwb2ludCk7CiAKLQlpZiAodGhpcy0+V25kSGl0VGVzdChwdCkpCisJaWYgKFduZEhpdFRlc3QocHQpKQogCXsKIAkJaWYgKG1fcENvbnRlbnRzKQogCQl7CkBAIC0xMDE1LDE3ICsxMDExLDE3IEBACiAKIElQV0xfTm90ZUl0ZW0qIENQV0xfTm90ZUl0ZW06OkdldEZvY3VzZWROb3RlSXRlbSgpIGNvbnN0CiB7Ci0JaWYgKGNvbnN0IENQV0xfV25kKiBwV25kID0gdGhpcy0+R2V0Rm9jdXNlZCgpKQorCWlmIChjb25zdCBDUFdMX1duZCogcFduZCA9IEdldEZvY3VzZWQoKSkKIAl7CiAJCWlmIChwV25kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9FZGl0IikKIAkJewogCQkJaWYgKENQV0xfV25kKiBwUGFyZW50ID0gcFduZC0+R2V0UGFyZW50V2luZG93KCkpCiAJCQl7CiAJCQkJQVNTRVJUKHBQYXJlbnQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVfQ29udGVudHMiKTsKLQkJCQkKKwogCQkJCWlmIChDUFdMX1duZCogcEdyYW5kID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCkpCiAJCQkJewotCQkJCQlBU1NFUlQocEdyYW5kLT5HZXRDbGFzc05hbWUoKSA9PSAiQ1BXTF9Ob3RlSXRlbSIpOwkJCQkJCisJCQkJCUFTU0VSVChwR3JhbmQtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIik7CiAJCQkJCXJldHVybiAoQ1BXTF9Ob3RlSXRlbSopcEdyYW5kOwogCQkJCX0KIAkJCX0KQEAgLTEwNDksNyArMTA0NSw3IEBACiAJCUFTU0VSVChtX3BDb250ZW50cyAhPSBOVUxMKTsKIAogCQlGWF9GTE9BVCBmUmV0ID0gbV9wRGF0ZVRpbWUtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0JCUZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVCl0aGlzLT5HZXRCb3JkZXJXaWR0aCgpOworCQlGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKIAkJaWYgKGZMaW1pdFdpZHRoID4gZkJvcmRlcldpZHRoICogMikKIAkJCWZSZXQgKz0gbV9wQ29udGVudHMtPkdldENvbnRlbnRzSGVpZ2h0KGZMaW1pdFdpZHRoIC0gZkJvcmRlcldpZHRoICogMik7CiAJCWZSZXQgKz0gUE9QVVBfSVRFTV9IRUFEX0JPVFRPTSArIFBPUFVQX0lURU1fQk9UVE9NV0lEVEggKyBmQm9yZGVyV2lkdGggKiAyOwpAQCAtMTA5OSwyMyArMTA5NSwyMyBAQAogewogCXN3aXRjaCAobXNnKQogCXsKLQljYXNlIFBOTV9OT1RFRURJVENIQU5HRUQ6CQorCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKIAkJbV9iU2l6ZUNoYW5nZWQgPSBUUlVFOwogCi0JCWlmIChDUFdMX1duZCogcFBhcmVudCA9IHRoaXMtPkdldFBhcmVudFdpbmRvdygpKQorCQlpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKIAkJewogCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX05PVEVFRElUQ0hBTkdFRCwgMCwgMCk7CiAJCX0KLQkJcmV0dXJuOwkKKwkJcmV0dXJuOwogCWNhc2UgUE5NX1NFVENBUkVUSU5GTzoKIAkJaWYgKFBXTF9DQVJFVF9JTkZPICogcEluZm8gPSAoUFdMX0NBUkVUX0lORk8qKXdQYXJhbSkKIAkJewogCQkJUFdMX0NBUkVUX0lORk8gbmV3SW5mbyA9ICpwSW5mbzsKIAkJCW5ld0luZm8uYlZpc2libGUgPSBUUlVFOwotCQkJbmV3SW5mby5wdEhlYWQgPSB0aGlzLT5DaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOwotCQkJbmV3SW5mby5wdEZvb3QgPSB0aGlzLT5DaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOworCQkJbmV3SW5mby5wdEhlYWQgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEhlYWQpOworCQkJbmV3SW5mby5wdEZvb3QgPSBDaGlsZFRvUGFyZW50KHBJbmZvLT5wdEZvb3QpOwogCi0JCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCisJCQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCiAJCQl7CiAJCQkJcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKGludHB0cl90KSZuZXdJbmZvLCAwKTsKIAkJCX0KQEAgLTExMjQsNyArMTEyMCw3IEBACiAJY2FzZSBQTk1fTk9URVJFU0VUOgogCQltX2JTaXplQ2hhbmdlZCA9IFRSVUU7CiAJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKLQkJCisKIAkJcmV0dXJuOwogCX0KIApAQCAtMTE0NSw3ICsxMTQxLDcgQEAKIAogY29uc3QgQ1BXTF9Ob3RlKiBDUFdMX05vdGVJdGVtOjpHZXROb3RlKCkgY29uc3QKIHsKLQlpZiAoY29uc3QgQ1BXTF9XbmQqIHBSb290ID0gdGhpcy0+R2V0Um9vdFduZCgpKQorCWlmIChjb25zdCBDUFdMX1duZCogcFJvb3QgPSBHZXRSb290V25kKCkpCiAJewogCQlBU1NFUlQocFJvb3QtPkdldENsYXNzTmFtZSgpID09ICJDUFdMX05vdGVJdGVtIik7CiAJCUNQV0xfTm90ZUl0ZW0qIHBOb3RlSXRlbSA9IChDUFdMX05vdGVJdGVtKilwUm9vdDsKQEAgLTEyMDAsNyArMTE5Niw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9Ob3RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotQ1BXTF9Ob3RlOjpDUFdMX05vdGUoSVBvcHVwX05vdGUqIHBQb3B1cE5vdGUsIElQV0xfTm90ZU5vdGlmeSogcE5vdGVOb3RpZnksIElQV0xfTm90ZUhhbmRsZXIqIHBOb3RlSGFuZGxlcikgOiAKK0NQV0xfTm90ZTo6Q1BXTF9Ob3RlKElQb3B1cF9Ob3RlKiBwUG9wdXBOb3RlLCBJUFdMX05vdGVOb3RpZnkqIHBOb3RlTm90aWZ5LCBJUFdMX05vdGVIYW5kbGVyKiBwTm90ZUhhbmRsZXIpIDoKIAltX3BBdXRob3IoTlVMTCksCiAJbV9wSWNvbihOVUxMKSwKIAltX3BDbG9zZUJveChOVUxMKSwKQEAgLTEyMzYsOSArMTIzMiw4IEBACiAJbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwogCVJlc2V0U2Nyb2xsQmFyKCk7CiAJbV9wQ29udGVudHMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFUkVTRVQsIDAsIDApOwotCXRoaXMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIDApOwotCS8vzayyvQotCWlmIChjb25zdCBDUFdMX1duZCogcFduZCA9IHRoaXMtPkdldEZvY3VzZWQoKSkKKwlPbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCAwKTsKKwlpZiAoY29uc3QgQ1BXTF9XbmQqIHBXbmQgPSBHZXRGb2N1c2VkKCkpCiAJewogCQlpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gIkNQV0xfRWRpdCIpCiAJCXsKQEAgLTEyNDYsOCArMTI0MSw2IEBACiAJCQlwRWRpdC0+U2V0Q2FyZXQocEVkaXQtPkdldENhcmV0KCkpOwogCQl9CiAJfQotCS8vQ1BERl9Qb2ludCBwdE5ldyA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxQb3MoKTsKLQkvL21fcENvbnRlbnRzQmFyLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdE5ldy55KTsKIH0KIAogRlhfQk9PTCBDUFdMX05vdGU6OlJlc2V0U2Nyb2xsQmFyKCkKQEAgLTEyNjQsNyArMTI1Nyw3IEBACiAJCQkJbV9wQ29udGVudHNCYXItPkludmFsaWRhdGVSZWN0KE5VTEwpOwogCQkJCWJTY3JvbGxDaGFuZ2VkID0gVFJVRTsKIAkJCX0KLQkJfQkKKwkJfQogCX0KIAllbHNlCiAJewpAQCAtMTI3OSw3ICsxMjcyLDcgQEAKIAogCWlmIChiU2Nyb2xsQ2hhbmdlZCkKIAl7Ci0JCUNQREZfUmVjdCByY05vdGUgPSB0aGlzLT5HZXRDbGllbnRSZWN0KCk7CisJCUNQREZfUmVjdCByY05vdGUgPSBHZXRDbGllbnRSZWN0KCk7CiAJCUNQREZfUmVjdCByY0NvbnRlbnRzID0gbV9wQ29udGVudHMtPkdldFdpbmRvd1JlY3QoKTsKIAkJcmNDb250ZW50cy5yaWdodCA9IHJjTm90ZS5yaWdodCAtIDMuMGY7CiAJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCkBAIC0xMjk3LDcgKzEyOTAsNyBAQAogCUNQREZfUmVjdCByY0NvbnRlbnRzRmFjdCA9IG1fcENvbnRlbnRzLT5HZXRTY3JvbGxBcmVhKCk7CiAJQ1BERl9SZWN0IHJjQ29udGVudHNDbGllbnQgPSBtX3BDb250ZW50cy0+R2V0Q2xpZW50UmVjdCgpOwogCi0JcmV0dXJuIHJjQ29udGVudHNGYWN0LkhlaWdodCgpID4gcmNDb250ZW50c0NsaWVudC5IZWlnaHQoKTsJCisJcmV0dXJuIHJjQ29udGVudHNGYWN0LkhlaWdodCgpID4gcmNDb250ZW50c0NsaWVudC5IZWlnaHQoKTsKIH0KIAogdm9pZCBDUFdMX05vdGU6OlNldE9wdGlvbnNUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkKQEAgLTEzMTQsNyArMTMwNyw3IEBACiAKIAltX2JSZXNpemluZyA9IFRSVUU7CiAKLQlpZiAodGhpcy0+SXNWYWxpZCgpKQorCWlmIChJc1ZhbGlkKCkpCiAJewogCQlBU1NFUlQobV9wU3ViamVjdCAhPSBOVUxMKTsKIAkJQVNTRVJUKG1fcERhdGVUaW1lICE9IE5VTEwpOwpAQCAtMTM2MSw3ICsxMzU0LDcgQEAKIAkJcmNTdWJqZWN0LnJpZ2h0ID0gUFdMX01JTihyY1N1YmplY3QubGVmdCArIG1fcFN1YmplY3QtPkdldENvbnRlbnRSZWN0KCkuV2lkdGgoKSArIDEuMGYsIHJjRGF0ZS5sZWZ0IC0gMS4wZik7CiAJCXJjU3ViamVjdC5ib3R0b20gPSByY1N1YmplY3QudG9wIC0gbV9wU3ViamVjdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKIAkJcmNTdWJqZWN0Lk5vcm1hbGl6ZSgpOwotCQltX3BTdWJqZWN0LT5Nb3ZlKHJjU3ViamVjdCwgVFJVRSwgRkFMU0UpOwkKKwkJbV9wU3ViamVjdC0+TW92ZShyY1N1YmplY3QsIFRSVUUsIEZBTFNFKTsKIAkJbV9wU3ViamVjdC0+U2V0VmlzaWJsZShDUFdMX1V0aWxzOjpDb250YWluc1JlY3QocmNDbGllbnQsIHJjU3ViamVjdCkpOwogCiAJCUNQREZfUmVjdCByY09wdGlvbnMgPSByY0NsaWVudDsKQEAgLTE0MTEsNyArMTQwNCw3IEBACiAJCXJjQ29udGVudHNCYXIubGVmdCA9IHJjQ29udGVudHNCYXIucmlnaHQgLSBQV0xfU0NST0xMQkFSX1dJRFRIOwogCQlyY0NvbnRlbnRzQmFyLk5vcm1hbGl6ZSgpOwogCQltX3BDb250ZW50c0Jhci0+TW92ZShyY0NvbnRlbnRzQmFyLCBUUlVFLCBGQUxTRSk7Ci0JCQorCiAJCW1fcmNDYXB0aW9uID0gcmNDbGllbnQ7CiAJCW1fcmNDYXB0aW9uLmJvdHRvbSA9IHJjQ29udGVudHMudG9wOwogCX0KQEAgLTE0MTksNyArMTQxMiw3IEBACiAJbV9iUmVzaXppbmcgPSBGQUxTRTsKIH0KIAotLy8wLW5vcm1hbCAvIDEtY2FwdGlvbiAvIDItbGVmdGJvdHRvbSBjb3JuZXIgLyAzLXJpZ2h0Ym90dG9tIGNvcm5lciAvIDQtY2xvc2UgLyA1LW9wdGlvbnMgCisvLzAtbm9ybWFsIC8gMS1jYXB0aW9uIC8gMi1sZWZ0Ym90dG9tIGNvcm5lciAvIDMtcmlnaHRib3R0b20gY29ybmVyIC8gNC1jbG9zZSAvIDUtb3B0aW9ucwogaW50MzJfdCBDUFdMX05vdGU6Ok5vdGVIaXRUZXN0KGNvbnN0IENQREZfUG9pbnQmIHBvaW50KSBjb25zdAogewogCUFTU0VSVChtX3BTdWJqZWN0ICE9IE5VTEwpOwpAQCAtMTQ1OCw3ICsxNDUxLDcgQEAKIAogCUNQV0xfQ29sb3Igc1RleHRDb2xvcjsKIAotCWlmIChDUFdMX1V0aWxzOjpJc0JsYWNrT3JXaGl0ZSh0aGlzLT5HZXRCYWNrZ3JvdW5kQ29sb3IoKSkpCisJaWYgKENQV0xfVXRpbHM6OklzQmxhY2tPcldoaXRlKEdldEJhY2tncm91bmRDb2xvcigpKSkKIAkJc1RleHRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7CiAJZWxzZQogCQlzVGV4dENvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKQEAgLTE0NjgsNyArMTQ2MSw3IEBACiAJYWNwLnBQYXJlbnRXbmQgPSB0aGlzOwogCWFjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQRVNfTEVGVCB8IFBFU19UT1A7CiAJYWNwLnNUZXh0Q29sb3IgPSBzVGV4dENvbG9yOwotCW1fcEF1dGhvci0+Q3JlYXRlKGFjcCk7CSAKKwltX3BBdXRob3ItPkNyZWF0ZShhY3ApOwogCiAJbV9wQ2xvc2VCb3ggPSBuZXcgQ1BXTF9Ob3RlX0Nsb3NlQm94OwogCVBXTF9DUkVBVEVQQVJBTSBjY3AgPSBjcDsKQEAgLTE1NzAsNyArMTU2Myw3IEBACiAJCWlmIChwdE5ldy55ICE9IHB0U2Nyb2xsLnkpCiAJCXsKIAkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKLQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdE5ldy55KTsJCQkKKwkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0NST0xMV0lORE9XLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdE5ldy55KTsKIAkJCW1fcENvbnRlbnRzQmFyLT5Pbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZwdE5ldy55KTsKIAogCQkJcmV0dXJuIFRSVUU7CkBAIC0xNTg3LDcgKzE1ODAsNyBAQAogCWNhc2UgUE5NX05PVEVFRElUQ0hBTkdFRDoKIAkJewogCQkJQ1BERl9SZWN0IHJjU2Nyb2xsID0gbV9wQ29udGVudHMtPkdldFNjcm9sbEFyZWEoKTsKLQkJCQorCiAKIAkJCVBXTF9TQ1JPTExfSU5GTyBzSW5mbzsKIAkJCXNJbmZvLmZDb250ZW50TWluID0gcmNTY3JvbGwuYm90dG9tOwpAQCAtMTYwNywxMCArMTYwMCwxMCBAQAogCQkJCQl7CiAJCQkJCQlsUGFyYW0rKzsKIAkJCQkJCW1fcENvbnRlbnRzLT5Pbk5vdGlmeSh0aGlzLCBQTk1fTk9URVJFU0VULCAwLCAwKTsKLQkJCQkJCXRoaXMtPk9uTm90aWZ5KHRoaXMsIFBOTV9OT1RFRURJVENIQU5HRUQsIDAsIGxQYXJhbSk7CisJCQkJCQlPbk5vdGlmeSh0aGlzLCBQTk1fTk9URUVESVRDSEFOR0VELCAwLCBsUGFyYW0pOwogCQkJCQl9CiAJCQkJfQotCQkJCQorCiAJCQkJaWYgKCFiU2Nyb2xsQ2hhbmdlZCkKIAkJCQl7CiAJCQkJCWlmIChtX3BDb250ZW50c0Jhci0+SXNWaXNpYmxlKCkpCkBAIC0xNjY5LDcgKzE2NjIsNyBAQAogCiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQkJCisKIAkJCQlpZiAocEluZm8tPnB0Rm9vdC55IDwgcmNDbGllbnQuYm90dG9tKQogCQkJCXsKIAkJCQkJQ1BERl9Qb2ludCBwdCA9IG1fcENvbnRlbnRzLT5PdXRUb0luKHBJbmZvLT5wdEZvb3QpOwpAQCAtMTcxNSwxMyArMTcwOCwxMyBAQAogewogCWlmIChtX3BPcHRpb25zLT5XbmRIaXRUZXN0KG1fcE9wdGlvbnMtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkKIAl7Ci0JCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSB0aGlzLT5HZXROb3RlTm90aWZ5KCkpCisJCWlmIChJUFdMX05vdGVOb3RpZnkqIHBOb3RpZnkgPSBHZXROb3RlTm90aWZ5KCkpCiAJCXsKIAkJCWludDMyX3QgeCwgeTsKIAkJCVBXTHRvV25kKHBvaW50LCB4LCB5KTsKIAkJCWlmIChJRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKQogCQkJCXBTSC0+Q2xpZW50VG9TY3JlZW4oR2V0QXR0YWNoZWRIV25kKCksIHgsIHkpOwotCQkJdGhpcy0+S2lsbEZvY3VzKCk7CisJCQlLaWxsRm9jdXMoKTsKIAkJCXBOb3RpZnktPk9uUG9wdXBNZW51KHgsIHkpOwogCiAJCQlyZXR1cm4gVFJVRTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcAppbmRleCBhZDI5M2JjLi42ZDYxNzA1IDEwMDY0NAotLS0gYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAKKysrIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCkBAIC0xLDcgKzEsNyBAQAogLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotIAorCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9wZGZ3aW5kb3cvUERGV2luZG93LmgiCkBAIC00OSw3ICs0OSw3IEBACiAKIEZYX0JPT0wJUFdMX0ZMT0FUUkFOR0U6OkluKEZYX0ZMT0FUIHgpIGNvbnN0CiB7Ci0JcmV0dXJuIChJc0Zsb2F0QmlnZ2VyKHgsZk1pbikgfHwgSXNGbG9hdEVxdWFsKHgsIGZNaW4pKSAmJiAKKwlyZXR1cm4gKElzRmxvYXRCaWdnZXIoeCxmTWluKSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1pbikpICYmCiAJCShJc0Zsb2F0U21hbGxlcih4LCBmTWF4KSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1heCkpOwogfQogCkBAIC04MSw3ICs4MSw3IEBACiAJaWYgKElzRmxvYXRTbWFsbGVyKGZTY3JvbGxQb3MsIFNjcm9sbFJhbmdlLmZNaW4pKQogCQlmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKIAlpZiAoSXNGbG9hdEJpZ2dlcihmU2Nyb2xsUG9zLCBTY3JvbGxSYW5nZS5mTWF4KSkKLQkJZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNYXg7CQkKKwkJZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNYXg7CiB9CiAKIHZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0Q2xpZW50V2lkdGgoRlhfRkxPQVQgd2lkdGgpCkBAIC0xMjQsNyArMTI0LDcgQEAKIHZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkQmlnKCkKIHsKIAlpZiAoIVNldFBvcyhmU2Nyb2xsUG9zICsgZkJpZ1N0ZXApKQotCQlTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1heCk7CQkKKwkJU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwogfQogCiB2b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlN1YkJpZygpCkBAIC0xNzIsMTIgKzE3MiwxMiBAQAogCiAJc0FwcFN0cmVhbSA8PCAicVxuIjsKIAotCUNQREZfUG9pbnQgcHRDZW50ZXIgPSB0aGlzLT5HZXRDZW50ZXJQb2ludCgpOworCUNQREZfUG9pbnQgcHRDZW50ZXIgPSBHZXRDZW50ZXJQb2ludCgpOwogCi0Jc3dpdGNoICh0aGlzLT5tX2VTY3JvbGxCYXJUeXBlKQorCXN3aXRjaCAobV9lU2Nyb2xsQmFyVHlwZSkKIAl7CiAJCWNhc2UgU0JUX0hTQ1JPTEw6Ci0JCQlzd2l0Y2ggKHRoaXMtPm1fZVNCQnV0dG9uVHlwZSkKKwkJCXN3aXRjaCAobV9lU0JCdXR0b25UeXBlKQogCQkJewogCQkJCWNhc2UgUFNCVF9NSU46CiAJCQkJCXsKQEAgLTE5NCw3ICsxOTQsNyBAQAogCQkJCQkJCXNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKIAkJCQkJCQlzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKIAotCQkJCQkJCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsJCisJCQkJCQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJCWJyZWFrOwpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCQkJCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwogCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOwogCi0JCQkJCQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwkKKwkJCQkJCQlzQXBwU3RyZWFtIDw8IHNCdXR0b247CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJYnJlYWs7CkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFNCVF9WU0NST0xMOgotCQkJc3dpdGNoKHRoaXMtPm1fZVNCQnV0dG9uVHlwZSkKKwkJCXN3aXRjaCAobV9lU0JCdXR0b25UeXBlKQogCQkJewogCQkJCWNhc2UgUFNCVF9NSU46CiAJCQkJCXsKQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJCQkJCXNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKIAkJCQkJCQlzQnV0dG9uIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGwgZlxuIjsKIAotCQkJCQkJCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsJCisJCQkJCQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwogCQkJCQkJfQogCQkJCQl9CiAJCQkJCWJyZWFrOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCQkJCQkJc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwogCQkJCQkJCXNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOwogCi0JCQkJCQkJc0FwcFN0cmVhbSA8PCBzQnV0dG9uOwkKKwkJCQkJCQlzQXBwU3RyZWFtIDw8IHNCdXR0b247CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQkJYnJlYWs7CkBAIC0yODAsMTQgKzI4MCwxNCBAQAogCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwogCWlmIChyZWN0V25kLklzRW1wdHkoKSkgcmV0dXJuOwogCi0JQ1BERl9Qb2ludCBwdENlbnRlciA9IHRoaXMtPkdldENlbnRlclBvaW50KCk7Ci0JaW50MzJfdCBuVHJhbnNwYXJhbmN5ID0gdGhpcy0+R2V0VHJhbnNwYXJlbmN5KCk7CisJQ1BERl9Qb2ludCBwdENlbnRlciA9IEdldENlbnRlclBvaW50KCk7CisJaW50MzJfdCBuVHJhbnNwYXJhbmN5ID0gR2V0VHJhbnNwYXJlbmN5KCk7CiAKLQlzd2l0Y2ggKHRoaXMtPm1fZVNjcm9sbEJhclR5cGUpCisJc3dpdGNoIChtX2VTY3JvbGxCYXJUeXBlKQogCXsKIAljYXNlIFNCVF9IU0NST0xMOgogCQlDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UscFVzZXIyRGV2aWNlKTsKLQkJc3dpdGNoICh0aGlzLT5tX2VTQkJ1dHRvblR5cGUpCisJCXN3aXRjaCAobV9lU0JCdXR0b25UeXBlKQogCQl7CiAJCWNhc2UgUFNCVF9NSU46CiAJCQl7CkBAIC0zMDYsOCArMzA2LDggQEAKIAkJCQkJcGF0aC5TZXRQb2ludCgyLCBwdDMueCwgcHQzLnksIEZYUFRfTElORVRPKTsKIAkJCQkJcGF0aC5TZXRQb2ludCgzLCBwdDEueCwgcHQxLnksIEZYUFRfTElORVRPKTsKIAotCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLCAKLQkJCQkJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IsblRyYW5zcGFyYW5jeSksIAorCQkJCQlwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBOVUxMLAorCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUixuVHJhbnNwYXJhbmN5KSwKIAkJCQkJCTAsIEZYRklMTF9BTFRFUk5BVEUpOwogCQkJCX0KIAkJCX0KQEAgLTMyOSw5ICszMjksOSBAQAogCQkJCQlwYXRoLlNldFBvaW50KDIsIHB0My54LCBwdDMueSwgRlhQVF9MSU5FVE8pOwogCQkJCQlwYXRoLlNldFBvaW50KDMsIHB0MS54LCBwdDEueSwgRlhQVF9MSU5FVE8pOwogCi0JCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsIAotCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUixuVHJhbnNwYXJhbmN5KSwgCi0JCQkJCQkwLCBGWEZJTExfQUxURVJOQVRFKTsJCisJCQkJCXBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIE5VTEwsCisJCQkJCQlDUFdMX1V0aWxzOjpQV0xDb2xvclRvRlhDb2xvcihQV0xfREVGQVVMVF9CTEFDS0NPTE9SLG5UcmFuc3BhcmFuY3kpLAorCQkJCQkJMCwgRlhGSUxMX0FMVEVSTkFURSk7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CkBAIC0zNDAsMjUgKzM0MCwyNSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCXN3aXRjaCh0aGlzLT5tX2VTQkJ1dHRvblR5cGUpCisJCXN3aXRjaCAobV9lU0JCdXR0b25UeXBlKQogCQl7CiAJCWNhc2UgUFNCVF9NSU46CiAJCQl7CiAJCQkJLy9kcmF3IGJvcmRlcgogCQkJCUNQREZfUmVjdCByY0RyYXcgPSByZWN0V25kOwotCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCAKKwkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKIAkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDEwMCwxMDAsMTAwKSwwLjBmKTsKIAogCQkJCS8vZHJhdyBpbm5lciBib3JkZXIKIAkJCQlyY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLDAuNWYpOwotCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCAKKwkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKIAkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI1NSwyNTUsMjU1KSwxLjBmKTsKIAogCQkJCS8vZHJhdyBiYWNrZ3JvdW5kCiAKIAkJCQlyY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLDEuMGYpOwogCi0JCQkJaWYgKHRoaXMtPklzRW5hYmxlZCgpKQorCQkJCWlmIChJc0VuYWJsZWQoKSkKIAkJCQkJQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIFRSVUUsIEZBTFNFLCByY0RyYXcsIG5UcmFuc3BhcmFuY3ksIDgwLCAyMjApOwogCQkJCWVsc2UKIAkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCBBcmdiRW5jb2RlKDI1NSwyNTUsMjU1LDI1NSkpOwpAQCAtMzc3LDEyICszNzcsMTIgQEAKIAkJCQkJCQkJQ1BERl9Qb2ludChmWCs2LjVmLCBmWSs0LjBmKSwKIAkJCQkJCQkJQ1BERl9Qb2ludChmWCs0LjVmLCBmWSs2LjBmKSwKIAkJCQkJCQkJQ1BERl9Qb2ludChmWCsyLjVmLCBmWSs0LjBmKX07Ci0JCQkJCQogCi0JCQkJCWlmICh0aGlzLT5Jc0VuYWJsZWQoKSkKKworCQkJCQlpZiAoSXNFbmFibGVkKCkpCiAJCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsIEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNTUsMjU1LDI1NSkpOwogCQkJCQllbHNlCi0JCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsIAorCQkJCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxBcmVhKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LAogCQkJCQkJCUNQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLDI1NSkpOwogCQkJCX0KIAkJCX0KQEAgLTM5MSwxNyArMzkxLDE3IEBACiAJCQl7CiAJCQkJLy9kcmF3IGJvcmRlcgogCQkJCUNQREZfUmVjdCByY0RyYXcgPSByZWN0V25kOwotCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCAKKwkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKIAkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDEwMCwxMDAsMTAwKSwwLjBmKTsKLQkJCQkKKwogCQkJCS8vZHJhdyBpbm5lciBib3JkZXIKIAkJCQlyY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLDAuNWYpOwotCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LCAKKwkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKIAkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI1NSwyNTUsMjU1KSwxLjBmKTsKIAogCQkJCS8vZHJhdyBiYWNrZ3JvdW5kCiAJCQkJcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwxLjBmKTsKLQkJCQlpZiAodGhpcy0+SXNFbmFibGVkKCkpCisJCQkJaWYgKElzRW5hYmxlZCgpKQogCQkJCQlDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgVFJVRSwgRkFMU0UsIHJjRHJhdywgblRyYW5zcGFyYW5jeSwgODAsIDIyMCk7CiAJCQkJZWxzZQogCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsIEFyZ2JFbmNvZGUoMjU1LDI1NSwyNTUsMjU1KSk7CkBAIC00MjEsMTIgKzQyMSwxMiBAQAogCQkJCQkJCQlDUERGX1BvaW50KGZYKzYuNWYsIGZZKzUuMGYpLAogCQkJCQkJCQlDUERGX1BvaW50KGZYKzQuNWYsIGZZKzMuMGYpLAogCQkJCQkJCQlDUERGX1BvaW50KGZYKzIuNWYsIGZZKzUuMGYpfTsKLQkJCQkJCiAKLQkJCQkJaWYgKHRoaXMtPklzRW5hYmxlZCgpKQorCisJCQkJCWlmIChJc0VuYWJsZWQoKSkKIAkJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywgQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDI1NSwyNTUsMjU1KSk7CiAJCQkJCWVsc2UKLQkJCQkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywgCisJCQkJCQlDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdHMsIDcsCiAJCQkJCQkJQ1BXTF9VdGlsczo6UFdMQ29sb3JUb0ZYQ29sb3IoUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IsMjU1KSk7CiAJCQkJfQogCQkJfQpAQCAtNDM3LDc5ICs0MzcsNzkgQEAKIAogCQkJCS8vZHJhdyBib3JkZXIKIAkJCQlDUERGX1JlY3QgcmNEcmF3ID0gcmVjdFduZDsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgCisJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCiAJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxMDAsMTAwLDEwMCksMC4wZik7Ci0JCQkJCisKIAkJCQkvL2RyYXcgaW5uZXIgYm9yZGVyCiAJCQkJcmNEcmF3ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdFduZCwwLjVmKTsKLQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywgCisJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZVJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0RyYXcsCiAJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNTUsMjU1LDI1NSksMS4wZik7CiAKLQkJCQlpZiAodGhpcy0+SXNFbmFibGVkKCkpCisJCQkJaWYgKElzRW5hYmxlZCgpKQogCQkJCXsKLQkJCQkJLy9kcmF3IHNoYWRvdyBlZmZlY3QJCQkJCQkKLQkJCQkJCisJCQkJCS8vZHJhdyBzaGFkb3cgZWZmZWN0CisKIAkJCQkJQ1BERl9Qb2ludCBwdFRvcCA9IENQREZfUG9pbnQocmVjdFduZC5sZWZ0LHJlY3RXbmQudG9wLTEuMGYpOwogCQkJCQlDUERGX1BvaW50IHB0Qm90dG9tID0gQ1BERl9Qb2ludChyZWN0V25kLmxlZnQscmVjdFduZC5ib3R0b20rMS4wZik7CiAKIAkJCQkJcHRUb3AueCArPSAxLjVmOwogCQkJCQlwdEJvdHRvbS54ICs9IDEuNWY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCisKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCiAJCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjEwLDIxMCwyMTApLDEuMGYpOwogCiAJCQkJCXB0VG9wLnggKz0gMS4wZjsKIAkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCQkJCQkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sIAorCisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAogCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDIyMCwyMjAsMjIwKSwxLjBmKTsKIAogCQkJCQlwdFRvcC54ICs9IDEuMGY7CiAJCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQkJCQkJCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCAKKworCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKIAkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwyNDAsMjQwLDI0MCksMS4wZik7CiAKIAkJCQkJcHRUb3AueCArPSAxLjBmOwogCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCisKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCiAJCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjQwLDI0MCwyNDApLDEuMGYpOwogCiAJCQkJCXB0VG9wLnggKz0gMS4wZjsKIAkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCQkJCQkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sIAorCisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAogCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDIxMCwyMTAsMjEwKSwxLjBmKTsKIAogCQkJCQlwdFRvcC54ICs9IDEuMGY7CiAJCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQkJCQkJCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCAKKworCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKIAkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxODAsMTgwLDE4MCksMS4wZik7CiAKIAkJCQkJcHRUb3AueCArPSAxLjBmOwogCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCisKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCiAJCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMTUwLDE1MCwxNTApLDEuMGYpOwogCiAJCQkJCXB0VG9wLnggKz0gMS4wZjsKIAkJCQkJcHRCb3R0b20ueCArPSAxLjBmOwotCQkJCQkKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sIAorCisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLAogCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDE1MCwxNTAsMTUwKSwxLjBmKTsKIAogCQkJCQlwdFRvcC54ICs9IDEuMGY7CiAJCQkJCXB0Qm90dG9tLnggKz0gMS4wZjsKLQkJCQkJCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCAKKworCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwKIAkJCQkJCUFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxODAsMTgwLDE4MCksMS4wZik7CiAKIAkJCQkJcHRUb3AueCArPSAxLjBmOwogCQkJCQlwdEJvdHRvbS54ICs9IDEuMGY7Ci0JCQkJCQotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0VG9wLCBwdEJvdHRvbSwgCisKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCiAJCQkJCQlBcmdiRW5jb2RlKG5UcmFuc3BhcmFuY3ksMjEwLDIxMCwyMTApLDEuMGYpOwogCQkJCX0KIAkJCQllbHNlCkBAIC01MjIsNyArNTIyLDcgQEAKIAkJCQlpZiAocmVjdFduZC5IZWlnaHQoKSA+IDguMGYpCiAJCQkJewogCQkJCQlGWF9DT0xPUlJFRiBjclN0cm9rZSA9IEFyZ2JFbmNvZGUoblRyYW5zcGFyYW5jeSwxMjAsMTIwLDEyMCk7Ci0JCQkJCWlmICghdGhpcy0+SXNFbmFibGVkKCkpCisJCQkJCWlmICghSXNFbmFibGVkKCkpCiAJCQkJCQljclN0cm9rZSA9IENQV0xfVXRpbHM6OlBXTENvbG9yVG9GWENvbG9yKFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLDI1NSk7CiAKIAkJCQkJRlhfRkxPQVQgbkZyaWN0aW9uV2lkdGggPSA1LjBmOwpAQCAtNTMxLDI2ICs1MzEsMjYgQEAKIAkJCQkJQ1BERl9Qb2ludCBwdExlZnQgPSBDUERGX1BvaW50KHB0Q2VudGVyLnggLSBuRnJpY3Rpb25XaWR0aCAvIDIuMGYsIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7CiAJCQkJCUNQREZfUG9pbnQgcHRSaWdodCA9IENQREZfUG9pbnQocHRDZW50ZXIueCArIG5GcmljdGlvbldpZHRoIC8gMi4wZiwgcHRDZW50ZXIueSAtIG5GcmljdGlvbkhlaWdodCAvIDIuMGYgKyAwLjVmKTsKIAotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwgCisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAogCQkJCQkJY3JTdHJva2UsMS4wZik7CiAKIAkJCQkJcHRMZWZ0LnkgKz0gMi4wZjsKIAkJCQkJcHRSaWdodC55ICs9IDIuMGY7CiAKLQkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsIAorCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwKIAkJCQkJCWNyU3Ryb2tlLDEuMGYpOwogCiAJCQkJCXB0TGVmdC55ICs9IDIuMGY7CiAJCQkJCXB0UmlnaHQueSArPSAyLjBmOwogCi0JCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LCAKKwkJCQkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdExlZnQsIHB0UmlnaHQsCiAJCQkJCQljclN0cm9rZSwxLjBmKTsKIAogCQkJCQkvKgogCQkJCQlwdExlZnQueSArPSAxLjVmOwogCQkJCQlwdFJpZ2h0LnkgKz0gMS41ZjsKIAotCQkJCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0TGVmdCwgcHRSaWdodCwgCisJCQkJCUNQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAogCQkJCQkJQXJnYkVuY29kZShuVHJhbnNwYXJhbmN5LDE1MCwxNTAsMTUwKSwxLjBmKTsKIAkJCQkJCSovCiAJCQkJfQpAQCAtNTk2LDcgKzU5Niw3IEBACiAJQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LG5GbGFnKTsKIAogCWlmIChDUFdMX1duZCAqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkKLQl7CQkKKwl7CiAJCXBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsUE5NX01PVVNFTU9WRSwwLChpbnRwdHJfdCkmcG9pbnQpOwogCiAJCS8qCkBAIC02NDAsMjkgKzY0MCw4IEBACiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6OlJlUG9zQ2hpbGRXbmQoKQogewotCUNQREZfUmVjdCByY0NsaWVudCA9IHRoaXMtPkdldENsaWVudFJlY3QoKTsKLQotLyoKLQlzd2l0Y2gobV9zYlR5cGUpCi0JewotCQljYXNlIFNCVF9IU0NST0xMOgotCQkJaWYgKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA8IFBXTF9TQ1JPTExCQVJfV0lEVEggfHwKLQkJCQlyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gPCBQV0xfU0NST0xMQkFSX1dJRFRIKQotCQkJewotCQkJCVNldFZpc2libGUoRkFMU0UpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgU0JUX1ZTQ1JPTEw6Ci0JCQlpZiAocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IDwgUFdMX1NDUk9MTEJBUl9XSURUSCB8fAotCQkJCXJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSA8IFBXTF9TQ1JPTExCQVJfV0lEVEgpCi0JCQl7Ci0JCQkJU2V0VmlzaWJsZShGQUxTRSk7Ci0JCQl9Ci0JCQlicmVhazsKLQl9CQotKi8KKwlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAJQ1BERl9SZWN0IHJjTWluQnV0dG9uLHJjTWF4QnV0dG9uOwotCiAJRlhfRkxPQVQgZkJXaWR0aCA9IDA7CiAKIAlzd2l0Y2ggKG1fc2JUeXBlKQpAQCAtNzExLDE4ICs2OTAsMTMgQEAKIAkJCWVsc2UgU2V0VmlzaWJsZShGQUxTRSk7CiAJCX0KIAkJYnJlYWs7Ci0JfQkKLQkKLS8vCWlmIChJc1Zpc2libGUoKSkKLQl7Ci0JCWlmIChtX3BNaW5CdXR0b24pCi0JCQltX3BNaW5CdXR0b24tPk1vdmUocmNNaW5CdXR0b24sVFJVRSxGQUxTRSk7Ci0JCQotCQlpZiAobV9wTWF4QnV0dG9uKQotCQkJbV9wTWF4QnV0dG9uLT5Nb3ZlKHJjTWF4QnV0dG9uLFRSVUUsRkFMU0UpOwotCi0JCU1vdmVQb3NCdXR0b24oRkFMU0UpOwogCX0KKworICAgIGlmIChtX3BNaW5CdXR0b24pCisgICAgICAgIG1fcE1pbkJ1dHRvbi0+TW92ZShyY01pbkJ1dHRvbiwgVFJVRSwgRkFMU0UpOworICAgIGlmIChtX3BNYXhCdXR0b24pCisgICAgICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgVFJVRSwgRkFMU0UpOworICAgIE1vdmVQb3NCdXR0b24oRkFMU0UpOwogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYgJiBzQXBwU3RyZWFtKQpAQCAtNzMxLDMzICs3MDUsMzIgQEAKIAogCWlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpCiAJewotCQlDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsJCQorCQlDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsKIAogCQlzQnV0dG9uIDw8ICJxXG4iOwogCQlzQnV0dG9uIDw8ICIwIHdcbiIgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0QmFja2dyb3VuZENvbG9yKCksVFJVRSk7CiAJCXNCdXR0b24gPDwgcmVjdFduZC5sZWZ0IDw8ICIgIiA8PCByZWN0V25kLmJvdHRvbSA8PCAiICIKLQkJCQk8PCByZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0IDw8ICIgIiA8PCByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tIDw8ICIgcmUgYiBRXG4iOwkKKwkJCQk8PCByZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0IDw8ICIgIiA8PCByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tIDw8ICIgcmUgYiBRXG4iOwogCi0JCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsJCisJCXNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKIAl9CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLCBDUERGX01hdHJpeCogcFVzZXIyRGV2aWNlKQogewotLy8JQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLHBVc2VyMkRldmljZSk7CiAJQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7CiAKIAlpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKQogCXsKLQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmVjdFduZCwgdGhpcy0+R2V0QmFja2dyb3VuZENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKKwkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmVjdFduZCwgR2V0QmFja2dyb3VuZENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKIAotCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIAotCQkJQ1BERl9Qb2ludChyZWN0V25kLmxlZnQrMi4wZixyZWN0V25kLnRvcC0yLjBmKSwgQ1BERl9Qb2ludChyZWN0V25kLmxlZnQrMi4wZixyZWN0V25kLmJvdHRvbSsyLjBmKSwgCi0JCQlBcmdiRW5jb2RlKHRoaXMtPkdldFRyYW5zcGFyZW5jeSgpLDEwMCwxMDAsMTAwKSwxLjBmKTsKKwkJQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLAorCQkJQ1BERl9Qb2ludChyZWN0V25kLmxlZnQrMi4wZixyZWN0V25kLnRvcC0yLjBmKSwgQ1BERl9Qb2ludChyZWN0V25kLmxlZnQrMi4wZixyZWN0V25kLmJvdHRvbSsyLjBmKSwKKwkJCUFyZ2JFbmNvZGUoR2V0VHJhbnNwYXJlbmN5KCksIDEwMCwgMTAwLCAxMDApLCAxLjBmKTsKIAotCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIAotCQkJQ1BERl9Qb2ludChyZWN0V25kLnJpZ2h0LTIuMGYscmVjdFduZC50b3AtMi4wZiksIENQREZfUG9pbnQocmVjdFduZC5yaWdodC0yLjBmLHJlY3RXbmQuYm90dG9tKzIuMGYpLCAKLQkJCUFyZ2JFbmNvZGUodGhpcy0+R2V0VHJhbnNwYXJlbmN5KCksMTAwLDEwMCwxMDApLDEuMGYpOworCQlDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCisJCQlDUERGX1BvaW50KHJlY3RXbmQucmlnaHQtMi4wZixyZWN0V25kLnRvcC0yLjBmKSwgQ1BERl9Qb2ludChyZWN0V25kLnJpZ2h0LTIuMGYscmVjdFduZC5ib3R0b20rMi4wZiksCisJCQlBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwxLjBmKTsKIAl9CiB9CiAKQEAgLTc2NSw4ICs3MzgsNiBAQAogewogCUNQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LG5GbGFnKTsKIAotCS8vU2V0Rm9jdXMoKTsKLQogCWlmIChIYXNGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpKQogCXsKIAkJaWYgKEdldFRyYW5zcGFyZW5jeSgpICE9IDI1NSkKQEAgLTc4MCw3ICs3NTEsNyBAQAogCiAJaWYgKG1fcFBvc0J1dHRvbiAmJiBtX3BQb3NCdXR0b24tPklzVmlzaWJsZSgpKQogCXsKLQkJQ1BERl9SZWN0IHJjQ2xpZW50ID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOworCQlDUERGX1JlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CiAJCUNQREZfUmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOwogCiAJCXN3aXRjaCAobV9zYlR5cGUpCkBAIC04NDYsNyArODE3LDcgQEAKIAogCXN3aXRjaCAobXNnKQogCXsKLQljYXNlIFBOTV9MQlVUVE9ORE9XTjoJCQkKKwljYXNlIFBOTV9MQlVUVE9ORE9XTjoKIAkJaWYgKHBXbmQgPT0gbV9wTWluQnV0dG9uKQogCQl7CiAJCQlPbk1pbkJ1dHRvbkxCRG93bigqKENQREZfUG9pbnQqKWxQYXJhbSk7CkBAIC04NTksMjMgKzgzMCwyMyBAQAogCiAJCWlmIChwV25kID09IG1fcFBvc0J1dHRvbikKIAkJewotCQkJT25Qb3NCdXR0b25MQkRvd24oKihDUERGX1BvaW50KilsUGFyYW0pOwkJCQkKKwkJCU9uUG9zQnV0dG9uTEJEb3duKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFBOTV9MQlVUVE9OVVA6CiAJCWlmIChwV25kID09IG1fcE1pbkJ1dHRvbikKIAkJewotCQkJT25NaW5CdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsJCQorCQkJT25NaW5CdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKIAkJfQogCiAJCWlmIChwV25kID09IG1fcE1heEJ1dHRvbikKIAkJewotCQkJT25NYXhCdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsJCQkJCisJCQlPbk1heEJ1dHRvbkxCVXAoKihDUERGX1BvaW50KilsUGFyYW0pOwogCQl9CiAKIAkJaWYgKHBXbmQgPT0gbV9wUG9zQnV0dG9uKQogCQl7Ci0JCQlPblBvc0J1dHRvbkxCVXAoKihDUERGX1BvaW50KilsUGFyYW0pOwkJCQorCQkJT25Qb3NCdXR0b25MQlVwKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFBOTV9NT1VTRU1PVkU6CkBAIC04ODYsMTIgKzg1NywxMiBAQAogCiAJCWlmIChwV25kID09IG1fcE1heEJ1dHRvbikKIAkJewotCQkJT25NYXhCdXR0b25Nb3VzZU1vdmUoKihDUERGX1BvaW50KilsUGFyYW0pOwkJCQkKKwkJCU9uTWF4QnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKIAkJfQogCiAJCWlmIChwV25kID09IG1fcFBvc0J1dHRvbikKIAkJewotCQkJT25Qb3NCdXR0b25Nb3VzZU1vdmUoKihDUERGX1BvaW50KilsUGFyYW0pOwkJCQkKKwkJCU9uUG9zQnV0dG9uTW91c2VNb3ZlKCooQ1BERl9Qb2ludCopbFBhcmFtKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFBOTV9TRVRTQ1JPTExJTkZPOgpAQCAtOTAzLDggKzg3NCw4IEBACiAJCQkJCW1fT3JpZ2luSW5mbyA9ICpwSW5mbzsKIAkJCQkJRlhfRkxPQVQgZk1heCA9IHBJbmZvLT5mQ29udGVudE1heCAtIHBJbmZvLT5mQ29udGVudE1pbiAtIHBJbmZvLT5mUGxhdGVXaWR0aDsKIAkJCQkJZk1heCA9IGZNYXggPiAwLjBmID8gZk1heCA6IDAuMGY7Ci0JCQkJCXRoaXMtPlNldFNjcm9sbFJhbmdlKDAsZk1heCwgcEluZm8tPmZQbGF0ZVdpZHRoKTsKLQkJCQkJdGhpcy0+U2V0U2Nyb2xsU3RlcChwSW5mby0+ZkJpZ1N0ZXAscEluZm8tPmZTbWFsbFN0ZXApOworCQkJCQlTZXRTY3JvbGxSYW5nZSgwLCBmTWF4LCBwSW5mby0+ZlBsYXRlV2lkdGgpOworCQkJCQlTZXRTY3JvbGxTdGVwKHBJbmZvLT5mQmlnU3RlcCwgcEluZm8tPmZTbWFsbFN0ZXApOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtOTEyLDcgKzg4Myw3IEBACiAJY2FzZSBQTk1fU0VUU0NST0xMUE9TOgogCQl7CiAJCQlGWF9GTE9BVCBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOwotCQkJc3dpdGNoICh0aGlzLT5tX3NiVHlwZSkKKwkJCXN3aXRjaCAobV9zYlR5cGUpCiAJCQl7CiAJCQljYXNlIFNCVF9IU0NST0xMOgogCQkJCWZQb3MgPSBmUG9zIC0gbV9PcmlnaW5JbmZvLmZDb250ZW50TWluOwpAQCAtOTIxLDcgKzg5Miw3IEBACiAJCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIGZQb3M7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQl0aGlzLT5TZXRTY3JvbGxQb3MoZlBvcyk7CisJCQlTZXRTY3JvbGxQb3MoZlBvcyk7CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtOTMzLDEwICs5MDQsMTAgQEAKIAlzY3AucFBhcmVudFduZCA9IHRoaXM7CiAJc2NwLmR3Qm9yZGVyV2lkdGggPSAyOwogCXNjcC5uQm9yZGVyU3R5bGUgPSBQQlNfQkVWRUxFRDsKLQkKKwogCXNjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKIAotCWlmICghbV9wTWluQnV0dG9uKSAKKwlpZiAoIW1fcE1pbkJ1dHRvbikKIAl7CiAJCW1fcE1pbkJ1dHRvbiA9IG5ldyBDUFdMX1NCQnV0dG9uKG1fc2JUeXBlLFBTQlRfTUlOKTsKIAkJbV9wTWluQnV0dG9uLT5DcmVhdGUoc2NwKTsKQEAgLTk3Niw3ICs5NDcsNyBAQAogCQl9CiAJCWVsc2UKIAkJewotCQkJbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKFRSVUUpOwkKKwkJCW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShUUlVFKTsKIAkJCU1vdmVQb3NCdXR0b24oVFJVRSk7CiAJCX0KIAl9CkBAIC0xMDExLDkgKzk4Miw5IEBACiAKIAogCQlDUERGX1JlY3QgcmNDbGllbnQ7Ci0JCUNQREZfUmVjdCByY1Bvc0FyZWEscmNQb3NCdXR0b247CQorCQlDUERGX1JlY3QgcmNQb3NBcmVhLHJjUG9zQnV0dG9uOwogCi0JCXJjQ2xpZW50ID0gdGhpcy0+R2V0Q2xpZW50UmVjdCgpOworCQlyY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIAkJcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOwogCiAJCUZYX0ZMT0FUIGZMZWZ0LGZSaWdodCxmVG9wLGZCb3R0b207CkBAIC0xMDM3LDcgKzEwMDgsNyBAQAogCQkJCQkJCQlyY1Bvc0FyZWEuYm90dG9tLAogCQkJCQkJCQlmUmlnaHQgLAogCQkJCQkJCQlyY1Bvc0FyZWEudG9wKTsKLQkJCQorCiAJCQlicmVhazsKIAkJY2FzZSBTQlRfVlNDUk9MTDoKIAkJCWZCb3R0b20gPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyArIG1fc0RhdGEuZkNsaWVudFdpZHRoKTsKQEAgLTEwNDUsNyArMTAxNiw3IEBACiAKIAkJCWlmIChJc0Zsb2F0U21hbGxlcihmVG9wIC0gZkJvdHRvbSwgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEgpKQogCQkJCWZCb3R0b20gPSBmVG9wIC0gUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEg7Ci0JCQkKKwogCQkJaWYgKElzRmxvYXRTbWFsbGVyKGZCb3R0b20sIHJjUG9zQXJlYS5ib3R0b20pKQogCQkJewogCQkJCWZCb3R0b20gPSByY1Bvc0FyZWEuYm90dG9tOwpAQCAtMTA1MywxMCArMTAyNCwxMCBAQAogCQkJfQogCiAJCQlyY1Bvc0J1dHRvbiA9IENQREZfUmVjdChyY1Bvc0FyZWEubGVmdCwKLQkJCQkJCQkJZkJvdHRvbSwJCQkJCQkJCQorCQkJCQkJCQlmQm90dG9tLAogCQkJCQkJCQlyY1Bvc0FyZWEucmlnaHQsCiAJCQkJCQkJCWZUb3ApOwotCQkJCisKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTEwODEsNyArMTA1Miw3IEBACiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWluQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKLXsJCit7CiB9CiAKIHZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENQREZfUG9pbnQgJiBwb2ludCkKQEAgLTEwOTEsNyArMTA2Miw3IEBACiAJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAKIAltX2JNaW5Pck1heCA9IEZBTFNFOwotCQorCiAJRW5kVGltZXIoKTsKIAlCZWdpblRpbWVyKDEwMCk7CiB9CkBAIC0xMTAxLDcgKzEwNzIsNyBAQAogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1heEJ1dHRvbk1vdXNlTW92ZShjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCi17CQorewogfQogCiB2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCRG93bihjb25zdCBDUERGX1BvaW50ICYgcG9pbnQpCkBAIC0xMTcxLDEwICsxMTQyLDEwIEBACiAJCQl9CiAKIAkJCW1fc0RhdGEuU2V0UG9zKGZOZXdQb3MpOwotCQkJCisKIAkJCWJyZWFrOwogCQljYXNlIFNCVF9WU0NST0xMOgotCQkKKwogCQkJaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpCiAJCQl7CiAJCQkJZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbjsKQEAgLTExODMsMTUgKzExNTQsMTUgQEAKIAkJCWlmIChJc0Zsb2F0QmlnZ2VyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heCkpCiAJCQl7CiAJCQkJZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heDsKLQkJCX0JCisJCQl9CiAKIAkJCW1fc0RhdGEuU2V0UG9zKGZOZXdQb3MpOwotCQkKKwogCQkJYnJlYWs7Ci0JCX0JCi0JCQorCQl9CisKIAkJaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkKLQkJewkJCQorCQl7CiAJCQlNb3ZlUG9zQnV0dG9uKFRSVUUpOwogCiAJCQlpZiAobV9iTm90aWZ5Rm9yZXZlcikKQEAgLTEyMDIsMTAgKzExNzMsMTAgQEAKIAogdm9pZCBDUFdMX1Njcm9sbEJhcjo6Tm90aWZ5U2Nyb2xsV2luZG93KCkKIHsKLQlpZiAoQ1BXTF9XbmQgKiBwUGFyZW50ID0gdGhpcy0+R2V0UGFyZW50V2luZG93KCkpCisJaWYgKENQV0xfV25kICogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQogCXsKIAkJRlhfRkxPQVQgZlBvczsKLQkJc3dpdGNoICh0aGlzLT5tX3NiVHlwZSkKKwkJc3dpdGNoIChtX3NiVHlwZSkKIAkJewogCQljYXNlIFNCVF9IU0NST0xMOgogCQkJZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1pbiArIG1fc0RhdGEuZlNjcm9sbFBvczsKQEAgLTEyMTMsNyArMTE4NCw3IEBACiAJCWNhc2UgU0JUX1ZTQ1JPTEw6CiAJCQlmUG9zID0gbV9PcmlnaW5JbmZvLmZDb250ZW50TWF4IC0gbV9zRGF0YS5mU2Nyb2xsUG9zOwogCQkJYnJlYWs7Ci0JCX0JCisJCX0KIAkJcFBhcmVudC0+T25Ob3RpZnkodGhpcyxQTk1fU0NST0xMV0lORE9XLChpbnRwdHJfdCltX3NiVHlwZSwoaW50cHRyX3QpJmZQb3MpOwogCX0KIH0KQEAgLTEyNjAsNyArMTIzMSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCQorCiAJcmNBcmVhLk5vcm1hbGl6ZSgpOwogCiAJcmV0dXJuIHJjQXJlYTsKQEAgLTEyNjgsNyArMTIzOSw3IEBACiAKIEZYX0ZMT0FUIENQV0xfU2Nyb2xsQmFyOjpUcnVlVG9GYWNlKEZYX0ZMT0FUIGZUcnVlKQogewotCUNQREZfUmVjdCByY1Bvc0FyZWE7CQorCUNQREZfUmVjdCByY1Bvc0FyZWE7CiAJcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOwogCiAJRlhfRkxPQVQgZkZhY3RXaWR0aCA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSArIG1fc0RhdGEuZkNsaWVudFdpZHRoOwpAQCAtMTI4NCwxNCArMTI1NSwxNCBAQAogCWNhc2UgU0JUX1ZTQ1JPTEw6CiAJCWZGYWNlID0gcmNQb3NBcmVhLnRvcCAtIGZUcnVlICogKHJjUG9zQXJlYS50b3AgLSByY1Bvc0FyZWEuYm90dG9tKSAvIGZGYWN0V2lkdGg7CiAJCWJyZWFrOwotCX0JCisJfQogCiAJcmV0dXJuIGZGYWNlOwogfQogCiBGWF9GTE9BVCBDUFdMX1Njcm9sbEJhcjo6RmFjZVRvVHJ1ZShGWF9GTE9BVCBmRmFjZSkKIHsKLQlDUERGX1JlY3QgcmNQb3NBcmVhOwkKKwlDUERGX1JlY3QgcmNQb3NBcmVhOwogCXJjUG9zQXJlYSA9IEdldFNjcm9sbEFyZWEoKTsKIAogCUZYX0ZMT0FUIGZGYWN0V2lkdGggPSBtX3NEYXRhLlNjcm9sbFJhbmdlLkdldFdpZHRoKCkgKyBtX3NEYXRhLmZDbGllbnRXaWR0aDsKQEAgLTEzMDcsNyArMTI3OCw3IEBACiAJY2FzZSBTQlRfVlNDUk9MTDoKIAkJZlRydWUgPSAocmNQb3NBcmVhLnRvcCAtIGZGYWNlKSAqIGZGYWN0V2lkdGggLyAocmNQb3NBcmVhLnRvcCAtIHJjUG9zQXJlYS5ib3R0b20pOwogCQlicmVhazsKLQl9CQorCX0KIAogCXJldHVybiBmVHJ1ZTsKIH0KQEAgLTEzMjEsNyArMTI5Miw3IEBACiB7CiAJUFdMX1NDUk9MTF9QUklWQVRFREFUQSBzVGVtcCA9IG1fc0RhdGE7CiAKLQlpZiAobV9iTWluT3JNYXgpbV9zRGF0YS5TdWJTbWFsbCgpOwkKKwlpZiAobV9iTWluT3JNYXgpbV9zRGF0YS5TdWJTbWFsbCgpOwogCWVsc2UgbV9zRGF0YS5BZGRTbWFsbCgpOwogCiAJaWYgKEZYU1lTX21lbWNtcCgmbV9zRGF0YSwgJnNUZW1wLCBzaXplb2YoUFdMX1NDUk9MTF9QUklWQVRFREFUQSkpICE9IDApCkBAIC0xMzMwLDI0ICsxMzAxLDMgQEAKIAkJTm90aWZ5U2Nyb2xsV2luZG93KCk7CiAJfQogfQotCi0vKgotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25TZXRGb2N1cygpCi17Ci0JaWYgKEdldFRyYW5zcGFyZW5jeSgpICE9IDI1NSkKLQl7Ci0JCVNldFRyYW5zcGFyZW5jeSgyNTUpOwotCQlJbnZhbGlkYXRlUmVjdCgpOwotCX0KLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25LaWxsRm9jdXMoKQotewotCWlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSkKLQl7Ci0JCVNldFRyYW5zcGFyZW5jeShQV0xfU0NST0xMQkFSX1RSQU5TUEFSQU5DWSk7Ci0JCUludmFsaWRhdGVSZWN0KCk7Ci0JfQotfQotKi8KLQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKaW5kZXggNjA5YmVlYi4uNmVhZGUyNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAKIENQREZfUmVjdCBDUFdMX1B1c2hCdXR0b246OkdldEZvY3VzUmVjdCgpIGNvbnN0CiB7Ci0JcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHRoaXMtPkdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSk7CisgICAgcmV0dXJuIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwgKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCkpOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ1BXTF9DaGVja0JveCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcCBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwCmluZGV4IDg4NDgwNzMuLmIyMjg0NjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwCisrKyBiL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwCkBAIC0yNzczLDIwICsyNzczLDYgQEAKIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gucmlnaHQsIGNySW5Cb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gucmlnaHQsIGNySW5Cb3gudG9wKSwgUFdMUFRfTElORVRPKSwKIAkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNySW5Cb3gubGVmdCArIGZXaWR0aCowLjkwZiwgY3JJbkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAotCi0JCS8qCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCwgY3JCQm94LnRvcCksIFBXTFBUX01PVkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gucmlnaHQsIGNyQkJveC50b3ApLCBQV0xQVF9MSU5FVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0LCBjckJCb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0LCBjckJCb3guYm90dG9tKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5sZWZ0LCBjckJCb3gudG9wKSwgUFdMUFRfTElORVRPKSwKLQotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LmxlZnQrZk91dFdpZHRoKjAuMDRmLCBjckJCb3gudG9wLWZPdXRIZWlnaHQqMC4wNGYpLCBQV0xQVF9NT1ZFVE8pLAotCQlDUFdMX1BhdGhEYXRhKENQV0xfUG9pbnQoY3JCQm94LnJpZ2h0LWZPdXRXaWR0aCowLjA0ZiwgY3JCQm94LnRvcC1mT3V0SGVpZ2h0KjAuMDRmKSwgUFdMUFRfTElORVRPKSwKLQkJQ1BXTF9QYXRoRGF0YShDUFdMX1BvaW50KGNyQkJveC5yaWdodC1mT3V0V2lkdGgqMC4wNGYsIGNyQkJveC5ib3R0b20rZk91dEhlaWdodCowLjA0ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCtmT3V0V2lkdGgqMC4wNGYsIGNyQkJveC5ib3R0b20rZk91dEhlaWdodCowLjA0ZiksIFBXTFBUX0xJTkVUTyksCi0JCUNQV0xfUGF0aERhdGEoQ1BXTF9Qb2ludChjckJCb3gubGVmdCtmT3V0V2lkdGgqMC4wNGYsIGNyQkJveC50b3AtZk91dEhlaWdodCowLjA0ZiksIFBXTFBUX0xJTkVUTyksCi0JCSovCiAJfTsKIAogCWlmKHR5cGUgPT0gUFdMUFRfU1RSRUFNKQpAQCAtMjc5NSw0NyArMjc4MSw0NyBAQAogCQlHZXRQYXRoRGF0YUZyb21BcnJheShwYXRoLCBQYXRoQXJyYXksIDIzKTsKIH0KIAotdm9pZCBDUFdMX0NvbG9yOjpDb252ZXJ0Q29sb3JUeXBlKGludDMyX3QgbkNvbG9yVHlwZSkKK3ZvaWQgQ1BXTF9Db2xvcjo6Q29udmVydENvbG9yVHlwZShpbnQzMl90IG90aGVyX25Db2xvclR5cGUpCiB7Ci0Jc3dpdGNoICh0aGlzLT5uQ29sb3JUeXBlKQorCXN3aXRjaCAob3RoZXJfbkNvbG9yVHlwZSkKIAl7CiAJY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6CiAJCWJyZWFrOwogCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCXN3aXRjaCAobkNvbG9yVHlwZSkKKwkJc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKQogCQl7CiAJCWNhc2UgQ09MT1JUWVBFX1JHQjoKLQkJCUNQV0xfVXRpbHM6OkNvbnZlcnRHUkFZMlJHQih0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzKTsKKwkJCUNQV0xfVXRpbHM6OkNvbnZlcnRHUkFZMlJHQihmQ29sb3IxLCBmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTE9SVFlQRV9DTVlLOgotCQkJQ1BXTF9VdGlsczo6Q29udmVydEdSQVkyQ01ZSyh0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzLCB0aGlzLT5mQ29sb3I0KTsKKwkJCUNQV0xfVXRpbHM6OkNvbnZlcnRHUkFZMkNNWUsoZkNvbG9yMSwgZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yNCk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCXN3aXRjaCAobkNvbG9yVHlwZSkKKwkJc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKQogCQl7CiAJCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkdSQVkodGhpcy0+ZkNvbG9yMSwgdGhpcy0+ZkNvbG9yMiwgdGhpcy0+ZkNvbG9yMywgdGhpcy0+ZkNvbG9yMSk7CisJCQlDUFdMX1V0aWxzOjpDb252ZXJ0UkdCMkdSQVkoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yMSk7CiAJCQlicmVhazsKIAkJY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLQkJCUNQV0xfVXRpbHM6OkNvbnZlcnRSR0IyQ01ZSyh0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzLCB0aGlzLT5mQ29sb3IxLCB0aGlzLT5mQ29sb3IyLCB0aGlzLT5mQ29sb3IzLCB0aGlzLT5mQ29sb3I0KTsKKwkJCUNQV0xfVXRpbHM6OkNvbnZlcnRSR0IyQ01ZSyhmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3I0KTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0JCXN3aXRjaCAobkNvbG9yVHlwZSkKKwkJc3dpdGNoIChvdGhlcl9uQ29sb3JUeXBlKQogCQl7CiAJCWNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJHUkFZKHRoaXMtPmZDb2xvcjEsIHRoaXMtPmZDb2xvcjIsIHRoaXMtPmZDb2xvcjMsIHRoaXMtPmZDb2xvcjQsIHRoaXMtPmZDb2xvcjEpOworCQkJQ1BXTF9VdGlsczo6Q29udmVydENNWUsyR1JBWShmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3I0LCBmQ29sb3IxKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTE9SVFlQRV9SR0I6Ci0JCQlDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJSR0IodGhpcy0+ZkNvbG9yMSwgdGhpcy0+ZkNvbG9yMiwgdGhpcy0+ZkNvbG9yMywgdGhpcy0+ZkNvbG9yNCwgdGhpcy0+ZkNvbG9yMSwgdGhpcy0+ZkNvbG9yMiwgdGhpcy0+ZkNvbG9yMyk7CisJCQlDUFdMX1V0aWxzOjpDb252ZXJ0Q01ZSzJSR0IoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yNCwgZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMyk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAl9Ci0JdGhpcy0+bkNvbG9yVHlwZSA9IG5Db2xvclR5cGU7CisJbkNvbG9yVHlwZSA9IG90aGVyX25Db2xvclR5cGU7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9zcmMvcGRmd2luZG93L1BXTF9XbmQuY3BwCmluZGV4IGM2MjE1MDguLjhlZTk5NjcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvc3JjL3BkZndpbmRvdy9QV0xfV25kLmNwcAorKysgYi9mcGRmc2RrL3NyYy9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKQEAgLTEsNyArMSw3IEBACiAvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0gCisKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL3BkZndpbmRvdy9QREZXaW5kb3cuaCIKQEAgLTE4LDcgKzE4LDcgQEAKICAgcmV0dXJuICp0aW1lTWFwOwogfQogCi1DUFdMX1RpbWVyOjpDUFdMX1RpbWVyKENQV0xfVGltZXJIYW5kbGVyKiBwQXR0YWNoZWQsIElGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikgOiAKK0NQV0xfVGltZXI6OkNQV0xfVGltZXIoQ1BXTF9UaW1lckhhbmRsZXIqIHBBdHRhY2hlZCwgSUZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKSA6CiAJbV9uVGltZXJJRCgwKSwKIAltX3BBdHRhY2hlZChwQXR0YWNoZWQpLAogCW1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpCkBAIC0zMyw3ICszMyw3IEBACiB9CiAKIGludDMyX3QgQ1BXTF9UaW1lcjo6U2V0UFdMVGltZXIoaW50MzJfdCBuRWxhcHNlKQotewkKK3sKIAlpZiAobV9uVGltZXJJRCAhPSAwKSBLaWxsUFdMVGltZXIoKTsKIAltX25UaW1lcklEID0gbV9wU3lzdGVtSGFuZGxlci0+U2V0VGltZXIobkVsYXBzZSwgVGltZXJQcm9jKTsKIAlHZXRQV0xUaW1lTWFwKCkuU2V0QXQobV9uVGltZXJJRCwgdGhpcyk7CkBAIC01Niw4ICs1Niw4IEBACiAJaWYgKEdldFBXTFRpbWVNYXAoKS5Mb29rdXAoaWRFdmVudCwgcFRpbWVyKSkKIAl7CiAJCWlmIChwVGltZXIpCi0JCXsJCQkKLQkJCWlmIChwVGltZXItPm1fcEF0dGFjaGVkKSAKKwkJeworCQkJaWYgKHBUaW1lci0+bV9wQXR0YWNoZWQpCiAJCQkJcFRpbWVyLT5tX3BBdHRhY2hlZC0+VGltZXJQcm9jKCk7CiAJCX0KIAl9CkBAIC0xNTMsNyArMTUzLDcgQEAKIAkJCWZvciggaW50MzJfdCBpPTAsc3o9bV9hS2V5Ym9hcmRQYXRoLkdldFNpemUoKTsgaTxzejsgaSsrKQogCQkJCWlmIChtX2FLZXlib2FyZFBhdGguR2V0QXQoaSkgPT0gcFduZCkKIAkJCQkJcmV0dXJuIFRSVUU7Ci0JCQorCiAJCXJldHVybiBGQUxTRTsKIAl9CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCW1fcFZTY3JvbGxCYXIoTlVMTCksCiAJbV9yY1dpbmRvdygpLAogCW1fcmNDbGlwKCksCi0JbV9iQ3JlYXRlZChGQUxTRSksCQkJCisJbV9iQ3JlYXRlZChGQUxTRSksCiAJbV9iVmlzaWJsZShGQUxTRSksCiAJbV9iTm90aWZ5aW5nKEZBTFNFKSwKIAltX2JFbmFibGVkKFRSVUUpCkBAIC0yNjEsOSArMjYxLDkgQEAKIAogCQljY3AuZHdGbGFncyAmPSAweEZGRkYwMDAwTDsgLy9yZW1vdmUgc3ViIHN0eWxlcwogCQljY3AubXRDaGlsZCA9IENQREZfTWF0cml4KDEsMCwwLDEsMCwwKTsKLQkJCisKIAkJQ3JlYXRlU2Nyb2xsQmFyKGNjcCk7Ci0JCUNyZWF0ZUNoaWxkV25kKGNjcCk7IAorCQlDcmVhdGVDaGlsZFduZChjY3ApOwogCiAJCW1fYlZpc2libGUgPSBIYXNGbGFnKFBXU19WSVNJQkxFKTsKIApAQCAtMzEyLDcgKzMxMiw3IEBACiAJRGVzdHJveU1zZ0NvbnRyb2woKTsKIAogCUZYU1lTX21lbXNldCgmbV9zUHJpdmF0ZVBhcmFtLCAwLCBzaXplb2YoUFdMX0NSRUFURVBBUkFNKSk7Ci0JbV9hQ2hpbGRyZW4uUmVtb3ZlQWxsKCk7CQorCW1fYUNoaWxkcmVuLlJlbW92ZUFsbCgpOwogCW1fcFZTY3JvbGxCYXIgPSBOVUxMOwogfQogCkBAIC0zMjAsMjMgKzMyMCwyMiBAQAogewogCWlmIChJc1ZhbGlkKCkpCiAJewotCQlDUERGX1JlY3QgcmNPbGQgPSB0aGlzLT5HZXRXaW5kb3dSZWN0KCk7CisJCUNQREZfUmVjdCByY09sZCA9IEdldFdpbmRvd1JlY3QoKTsKIAogCQltX3JjV2luZG93ID0gcmNOZXc7CiAJCW1fcmNXaW5kb3cuTm9ybWFsaXplKCk7Ci0JCS8vbV9yY0NsaXAgPSBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChtX3JjV2luZG93LDEuMGYpOyAvL2ZvciBzcGVjaWFsIGNhcmV0IAogCiAJCWlmIChyY09sZC5sZWZ0ICE9IHJjTmV3LmxlZnQgfHwgcmNPbGQucmlnaHQgIT0gcmNOZXcucmlnaHQgfHwKIAkJCXJjT2xkLnRvcCAhPSByY05ldy50b3AgfHwgcmNPbGQuYm90dG9tICE9IHJjTmV3LmJvdHRvbSkKIAkJewogCQkJaWYgKGJSZXNldCkKIAkJCXsKLQkJCQlSZVBvc0NoaWxkV25kKCk7CQotCQkJfQkKKwkJCQlSZVBvc0NoaWxkV25kKCk7CisJCQl9CiAKIAkJfQogCQlpZiAoYlJlZnJlc2gpCi0JCXsJCisJCXsKIAkJCUludmFsaWRhdGVSZWN0TW92ZShyY09sZCxyY05ldyk7CiAJCX0KIApAQCAtMzUwLDMyICszNDksNiBAQAogCXJjVW5pb24uVW5pb24ocmNOZXcpOwogCiAJSW52YWxpZGF0ZVJlY3QoJnJjVW5pb24pOwotCi0JLyoKLQlDUERGX1JlY3QgU3ViQXJyYXlbNF07IAotCi0JcmNPbGQuU3Vic3RyYWN0NChyY05ldyxTdWJBcnJheSk7Ci0JZm9yIChpbnQzMl90IGk9MDtpPDQ7aSsrKQotCXsKLQkJaWYgKFN1YkFycmF5W2ldLmxlZnQgPT0gMCAmJgotCQkJU3ViQXJyYXlbaV0ucmlnaHQgPT0gMCAmJgotCQkJU3ViQXJyYXlbaV0udG9wID09IDAgJiYKLQkJCVN1YkFycmF5W2ldLmJvdHRvbSA9PSAwKWNvbnRpbnVlOwotCi0JCUludmFsaWRhdGVSZWN0KCZDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChTdWJBcnJheVtpXSwyKSk7Ci0JfQotCi0JcmNOZXcuU3Vic3RyYWN0NChyY09sZCxTdWJBcnJheSk7Ci0JZm9yIChpbnQzMl90IGo9MDtqPDQ7aisrKQotCXsKLQkJaWYgKFN1YkFycmF5W2pdLmxlZnQgPT0gMCAmJgotCQkJU3ViQXJyYXlbal0ucmlnaHQgPT0gMCAmJgotCQkJU3ViQXJyYXlbal0udG9wID09IDAgJiYKLQkJCVN1YkFycmF5W2pdLmJvdHRvbSA9PSAwKWNvbnRpbnVlOwotCi0JCUludmFsaWRhdGVSZWN0KCZDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChTdWJBcnJheVtqXSwyKSk7Ci0JfQotCSovCiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OkdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVTdHJpbmcgJiBzQXBwU3RyZWFtKQpAQCAtNDAwLDI1ICszNzMsMjYgQEAKIC8vaWYgZG9uJ3Qgc2V0LEdldCBkZWZhdWx0IGFwcGVyYW5jZSBzdHJlYW0KIHZvaWQgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCiB7Ci0JQ1BERl9SZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7Ci0JaWYgKCFyZWN0V25kLklzRW1wdHkoKSkKLQl7Ci0JCUNGWF9CeXRlVGV4dEJ1ZiBzVGhpczsKKyAgICBDUERGX1JlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgICBpZiAoIXJlY3RXbmQuSXNFbXB0eSgpKSB7CisgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiBzVGhpczsKIAotCQlpZiAoSGFzRmxhZyhQV1NfQkFDS0dST1VORCkpCi0JCQlzVGhpcyA8PCBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyZWN0V25kLHRoaXMtPkdldEJhY2tncm91bmRDb2xvcigpKTsKKyAgICAgICAgaWYgKEhhc0ZsYWcoUFdTX0JBQ0tHUk9VTkQpKQorICAgICAgICAgICAgc1RoaXMgPDwgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmVjdFduZCwgR2V0QmFja2dyb3VuZENvbG9yKCkpOwogCi0JCWlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotCQkJc1RoaXMgPDwgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJlY3RXbmQsCi0JCQkJCQkJCQkoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSwKLQkJCQkJCQkJCUdldEJvcmRlckNvbG9yKCksCi0JCQkJCQkJCQl0aGlzLT5HZXRCb3JkZXJMZWZ0VG9wQ29sb3IodGhpcy0+R2V0Qm9yZGVyU3R5bGUoKSksCi0JCQkJCQkJCQl0aGlzLT5HZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKHRoaXMtPkdldEJvcmRlclN0eWxlKCkpLAotCQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyU3R5bGUoKSwKLQkJCQkJCQkJCXRoaXMtPkdldEJvcmRlckRhc2goKSk7CisgICAgICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKSB7CisgICAgICAgICAgICBzVGhpcyA8PCBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0oCisgICAgICAgICAgICAgICAgcmVjdFduZCwKKyAgICAgICAgICAgICAgICAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKSwKKyAgICAgICAgICAgICAgICBHZXRCb3JkZXJDb2xvcigpLAorICAgICAgICAgICAgICAgIEdldEJvcmRlckxlZnRUb3BDb2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKKyAgICAgICAgICAgICAgICBHZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKEdldEJvcmRlclN0eWxlKCkpLAorICAgICAgICAgICAgICAgIEdldEJvcmRlclN0eWxlKCksCisgICAgICAgICAgICAgICAgR2V0Qm9yZGVyRGFzaCgpKTsKKyAgICAgICAgfQogCi0JCXNBcHBTdHJlYW0gPDwgc1RoaXM7Ci0JfQorICAgICAgICBzQXBwU3RyZWFtIDw8IHNUaGlzOworICAgIH0KIH0KIAogdm9pZCBDUFdMX1duZDo6R2V0Q2hpbGRBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiAmIHNBcHBTdHJlYW0pCkBAIC00NDUsMTEgKzQxOSwxMSBAQAogewogCUNQREZfUmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwogCWlmICghcmVjdFduZC5Jc0VtcHR5KCkpCi0JewkJCisJewogCQlpZiAoSGFzRmxhZyhQV1NfQkFDS0dST1VORCkpCiAJCXsKIAkJCUNQREZfUmVjdCByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpK0dldElubmVyQm9yZGVyV2lkdGgoKSkpOwotCQkJQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UscFVzZXIyRGV2aWNlLHJjQ2xpZW50LHRoaXMtPkdldEJhY2tncm91bmRDb2xvcigpLEdldFRyYW5zcGFyZW5jeSgpKTsKKwkJCUNQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLHBVc2VyMkRldmljZSxyY0NsaWVudCwgR2V0QmFja2dyb3VuZENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKIAkJfQogCiAJCWlmIChIYXNGbGFnKFBXU19CT1JERVIpKQpAQCAtNDU4LDExICs0MzIsMTEgQEAKIAkJCQkJCQkJcmVjdFduZCwKIAkJCQkJCQkJKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCksCiAJCQkJCQkJCUdldEJvcmRlckNvbG9yKCksCi0JCQkJCQkJCXRoaXMtPkdldEJvcmRlckxlZnRUb3BDb2xvcih0aGlzLT5HZXRCb3JkZXJTdHlsZSgpKSwKLQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcih0aGlzLT5HZXRCb3JkZXJTdHlsZSgpKSwKLQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyU3R5bGUoKSwKLQkJCQkJCQkJdGhpcy0+R2V0Qm9yZGVyRGFzaCgpLAotCQkJCQkJCQlHZXRUcmFuc3BhcmVuY3koKSk7CQkJCQkJCQkKKwkJCQkJCQkJR2V0Qm9yZGVyTGVmdFRvcENvbG9yKEdldEJvcmRlclN0eWxlKCkpLAorCQkJCQkJCQlHZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKEdldEJvcmRlclN0eWxlKCkpLAorCQkJCQkJCQlHZXRCb3JkZXJTdHlsZSgpLAorCQkJCQkJCQlHZXRCb3JkZXJEYXNoKCksCisJCQkJCQkJCUdldFRyYW5zcGFyZW5jeSgpKTsKIAl9CiB9CiAKQEAgLTQ5NCw3ICs0NjgsNyBAQAogCiAJCWlmICghSGFzRmxhZyhQV1NfTk9SRUZSRVNIQ0xJUCkpCiAJCXsKLQkJCUNQREZfUmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOwkJCisJCQlDUERGX1JlY3QgcmNDbGlwID0gR2V0Q2xpcFJlY3QoKTsKIAkJCWlmICghcmNDbGlwLklzRW1wdHkoKSkKIAkJCXsKIAkJCQlyY1JlZnJlc2guSW50ZXJzZWN0KHJjQ2xpcCk7CkBAIC01NzAsNyArNTQ0LDcgQEAKIAkJCQkJfVwKIAkJCQl9XAogCQkJfVwKLQkJCWlmICh0aGlzLT5XbmRIaXRUZXN0KHBvaW50KSlcCisJCQlpZiAoV25kSGl0VGVzdChwb2ludCkpXAogCQkJCVNldEN1cnNvcigpO1wKIAkJfVwKIAl9XApAQCAtNjM5LDEwICs2MTMsMTAgQEAKIAlzd2l0Y2ggKG1zZykKIAl7CiAJY2FzZSBQTk1fQUREQ0hJTEQ6Ci0JCXRoaXMtPkFkZENoaWxkKHBXbmQpOworCQlBZGRDaGlsZChwV25kKTsKIAkJYnJlYWs7CiAJY2FzZSBQTk1fUkVNT1ZFQ0hJTEQ6Ci0JCXRoaXMtPlJlbW92ZUNoaWxkKHBXbmQpOworCQlSZW1vdmVDaGlsZChwV25kKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC02NzksNyArNjUzLDcgQEAKIAlDUERGX1JlY3QgcmNXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CiAJQ1BERl9SZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpK0dldElubmVyQm9yZGVyV2lkdGgoKSkpOwogCi0JaWYgKENQV0xfU2Nyb2xsQmFyICogcFZTQiA9IHRoaXMtPkdldFZTY3JvbGxCYXIoKSkKKwlpZiAoQ1BXTF9TY3JvbGxCYXIgKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKQogCQlyY0NsaWVudC5yaWdodCAtPSBwVlNCLT5HZXRTY3JvbGxCYXJXaWR0aCgpOwogCiAJcmNDbGllbnQuTm9ybWFsaXplKCk7CkBAIC04NDIsNyArODE2LDcgQEAKIAogCQkvL2ZsYWdzCiAJCXNjcC5kd0ZsYWdzID0gUFdTX0NISUxEfCBQV1NfQkFDS0dST1VORCB8IFBXU19BVVRPVFJBTlNQQVJFTlQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKLQkJCisKIAkJc2NwLnBQYXJlbnRXbmQgPSB0aGlzOwogCQlzY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7CiAJCXNjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CkBAIC05MjksOSArOTAzLDkgQEAKIAkJaWYgKGJWaXNpYmxlICE9IG1fYlZpc2libGUpCiAJCXsKIAkJCW1fYlZpc2libGUgPSBiVmlzaWJsZTsKLQkJCVJlUG9zQ2hpbGRXbmQoKTsJCQorCQkJUmVQb3NDaGlsZFduZCgpOwogCQkJSW52YWxpZGF0ZVJlY3QoKTsKLQkJfQkKKwkJfQogCX0KIH0KIApAQCAtOTU1LDcgKzkyOSw3IEBACiB7CiAJQ1BERl9SZWN0IHJjQ29udGVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KEdldFdpbmRvd1JlY3QoKSwoRlhfRkxPQVQpKEdldEJvcmRlcldpZHRoKCkrR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7CiAKLQlDUFdMX1Njcm9sbEJhciAqIHBWU0IgPSB0aGlzLT5HZXRWU2Nyb2xsQmFyKCk7CisJQ1BXTF9TY3JvbGxCYXIgKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpOwogCiAJQ1BERl9SZWN0IHJjVlNjcm9sbCA9IENQREZfUmVjdChyY0NvbnRlbnQucmlnaHQgLSBQV0xfU0NST0xMQkFSX1dJRFRILAogCQkJCQkJCXJjQ29udGVudC5ib3R0b20sCkBAIC05NzEsMTEgKzk0NSwxMSBAQAogCiB2b2lkIENQV0xfV25kOjpTZXRDdXJzb3IoKQogewotCWlmIChJc1ZhbGlkKCkpIAorCWlmIChJc1ZhbGlkKCkpCiAJewogCQlpZiAoSUZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkKIAkJewotCQkJaW50MzJfdCBuQ3Vyc29yVHlwZSA9IHRoaXMtPkdldENyZWF0aW9uUGFyYW0oKS5lQ3Vyc29yVHlwZTsKKwkJCWludDMyX3QgbkN1cnNvclR5cGUgPSBHZXRDcmVhdGlvblBhcmFtKCkuZUN1cnNvclR5cGU7CiAJCQlwU0gtPlNldEN1cnNvcihuQ3Vyc29yVHlwZSk7CiAJCX0KIAl9CkBAIC0xMDMwLDE3ICsxMDA0LDE3IEBACiAKIENQREZfUmVjdCBDUFdMX1duZDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QKIHsKLQlyZXR1cm4gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QodGhpcy0+R2V0V2luZG93UmVjdCgpLDEpOworCXJldHVybiBDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksMSk7CiB9CiAKIEZYX0ZMT0FUIENQV0xfV25kOjpHZXRGb250U2l6ZSgpIGNvbnN0CiB7Ci0JcmV0dXJuIHRoaXMtPm1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemU7CisJcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemU7CiB9CiAKIHZvaWQgQ1BXTF9XbmQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkKIHsKLQl0aGlzLT5tX3NQcml2YXRlUGFyYW0uZkZvbnRTaXplID0gZkZvbnRTaXplOworCW1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemUgPSBmRm9udFNpemU7CiB9CiAKIElGWF9TeXN0ZW1IYW5kbGVyKiBDUFdMX1duZDo6R2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0CkBAIC0xMTMxLDcgKzExMDUsNyBAQAogCiBDUERGX01hdHJpeAlDUFdMX1duZDo6R2V0V2luZG93TWF0cml4KCkgY29uc3QKIHsKLQlDUERGX01hdHJpeCBtdCA9IHRoaXMtPkdldENoaWxkVG9Sb290KCk7CisJQ1BERl9NYXRyaXggbXQgPSBHZXRDaGlsZFRvUm9vdCgpOwogCiAJaWYgKElQV0xfUHJvdmlkZXIqIHBQcm92aWRlciA9IEdldFByb3ZpZGVyKCkpCiAJewpAQCAtMTEzOSwxOSArMTExMyw2IEBACiAJCXJldHVybiBtdDsKIAl9CiAKLS8qCi0JaWYgKENSZWFkZXJfQXBwKiBwQXBwID0gQ1BXTF9Nb2R1bGU6OkdldFJlYWRlckFwcCgpKQotCQlpZiAoQ1JlYWRlcl9Eb2N1bWVudCogcERvY3VtZW50ID0gcEFwcC0+R2V0Q3VycmVudERvY3VtZW50KCkpCi0JCQlpZiAoQ1JlYWRlcl9Eb2NWaWV3KiBwRG9jVmlldyA9IHBEb2N1bWVudC0+R2V0Q3VycmVudERvY1ZpZXcoKSkKLQkJCXsKLQkJCQlDUERGX01hdHJpeCBtdFBhZ2VWaWV3OwotCQkJCXBEb2NWaWV3LT5HZXRDdXJyZW50TWF0cml4KG10UGFnZVZpZXcpOwotCQkJCW10LkNvbmNhdChtdFBhZ2VWaWV3KTsKLQkJCQlyZXR1cm4gbXQ7Ci0JCQl9CQkKLQkJCQotKi8KLQogCXJldHVybiBtdDsKIH0KIApAQCAtMTE2OCw3ICsxMTI5LDcgQEAKIHsKIAlDUERGX1JlY3QgcmNUZW1wID0gcmVjdDsKIAlDUERGX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwotCW10LlRyYW5zZm9ybVJlY3QocmNUZW1wKTsJCisJbXQuVHJhbnNmb3JtUmVjdChyY1RlbXApOwogCXJldHVybiBGWF9SRUNUKChpbnQzMl90KShyY1RlbXAubGVmdCswLjUpLCAoaW50MzJfdCkocmNUZW1wLmJvdHRvbSswLjUpLCAoaW50MzJfdCkocmNUZW1wLnJpZ2h0KzAuNSksIChpbnQzMl90KShyY1RlbXAudG9wKzAuNSkpOwogfQogCkBAIC0xMjM0LDcgKzExOTUsNyBAQAogQ1BERl9NYXRyaXggQ1BXTF9XbmQ6OkdldENoaWxkVG9Sb290KCkgY29uc3QKIHsKIAlDUERGX01hdHJpeCBtdCgxLDAsMCwxLDAsMCk7Ci0JCisKIAlpZiAoSGFzRmxhZyhQV1NfQ0hJTEQpKQogCXsKIAkJY29uc3QgQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzOwpAQCAtMTI4MywxMiArMTI0NCwxMiBAQAogCQkJfQogCQl9CiAKLQkJdGhpcy0+bV9iRW5hYmxlZCA9IGJFbmFibGU7CisJCW1fYkVuYWJsZWQgPSBiRW5hYmxlOwogCiAJCWlmIChiRW5hYmxlKQotCQkJdGhpcy0+T25FbmFibGVkKCk7CisJCQlPbkVuYWJsZWQoKTsKIAkJZWxzZQotCQkJdGhpcy0+T25EaXNhYmxlZCgpOworCQkJT25EaXNhYmxlZCgpOwogCX0KIH0KIAo=