ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGRmM2YyMzQuLmIxMGU5MTkgMTAwNzU1Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMywxMCArMyw4IEBACiAjIHN1YmRpcmVjdG9yaWVzIGhlcmUuIEFkZCB0aGVtIGluIHRoZSAiLmdpdGlnbm9yZSIgZmlsZQogIyBpbiB0aGF0IHN1YmRpcmVjdG9yeSBpbnN0ZWFkLgogIwotIyBOb3JtYWwgcnVsZXMKKyMgCU5vcm1hbCBydWxlcwogIwotb21yaS5wbAotY29tcmkucGwKIC5naXRpZ25vcmUKICoucmVqCiAqLm9yaWcKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggNGQ0MTJkNy4uMDdkZWJjNCAxMDA3NTUKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTE3OCw3ICsxNzgsNyBAQAogCiAjIGxvYWQgQVJDSCwgQk9BUkQsIGFuZCBDUFUgY29uZmlndXJhdGlvbgogaW5jbHVkZSAkKG9iailpbmNsdWRlL2NvbmZpZy5tawotZXhwb3J0CUFSQ0ggQ1BVIEJPQVJEIFZFTkRPUiBTT0MgRERSM0xJQiBERFJUWVBFCitleHBvcnQJQVJDSCBDUFUgQk9BUkQgVkVORE9SIFNPQyBERFIzTElCIEREUlRZUEUgRERSNFNVQkxJQgogCiAjIHNldCBkZWZhdWx0IHRvIG5vdGhpbmcgZm9yIG5hdGl2ZSBidWlsZHMKIGlmZXEgKCQoSE9TVEFSQ0gpLCQoQVJDSCkpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvYm9vdG0uYyBiL2FyY2gvYXJtL2xpYi9ib290bS5jCmluZGV4IDVmZjc3MTkuLmMwYTgxZTMgMTAwNzU1Ci0tLSBhL2FyY2gvYXJtL2xpYi9ib290bS5jCisrKyBiL2FyY2gvYXJtL2xpYi9ib290bS5jCkBAIC05MSwxMyArOTEsMTQgQEAKIH0KIAogI2lmIGRlZmluZWQgKENPTkZJR19PRl9MSUJGRFQpIHx8IGRlZmluZWQgKE1WX0REUl9MMl9BTElHTk1FTlQpCi11NjQgbDJfYmFzZSA9IChfNEcgLSBfMUcpOwkvKiB1c2VkIGZvciBtZW1vcnkgbm9kZSB1cGRhdGUgaW4gRGV2aWNlIHRyZWUgb3IgZm9yIG1lbW9yeSB0YWdzICovCit1NjQgbDJfYmFzZSA9IChfNEcgLSBfMUcpOwkvKiB1c2VkIGZvciBtZW1vcnkgbm9kZSB1cGRhdGUgaW4gRGV2aWNlIHRyZWUsIG9yIGZvciBtZW1vcnkgdGFncyAqLwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfT0ZfTElCRkRUCiBleHRlcm4gdm9pZCBtdkNwdUlmTWJ1c1dpbmRvd1NldCh1MzIgYmFzZSwgdTMyIHNpemUpOwogaW50IGZpeHVwX21lbW9yeV9ub2RlKHZvaWQgKmJsb2IpCiB7CisJY2hhciAqZW52OwogI2lmbmRlZiBDT05GSUdfTUFSVkVMTAogCWJkX3QJKmJkID0gZ2QtPmJkOwogI2VuZGlmCkBAIC0xMDUsMjMgKzEwNiwzMCBAQAogCXU2NCBzdGFydFtDT05GSUdfTlJfRFJBTV9CQU5LU107CiAJdTY0IHNpemVbQ09ORklHX05SX0RSQU1fQkFOS1NdOwogCisJLyogLSBCaW5hcnkgaGVhZGVyIHByaW9yaXRpemUgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4wR0IsIGluIG9yZGVyCisJICogICB0byBlbnN1cmUgJ2hpdCcgb24gaW50ZXJuYWwgcmVnaXN0ZXJzIElPIGFjY2VzcyAobG9jYXRlZCBhdCAweGQwMDAwMDAwIGJ5IGRlZmF1bHQpCisJICogLSBBbHRob3VnaCBVLUJvb3QgdXBkYXRlcyBpbnRlcm5hbCByZWdpc3RlciBiYXNlIHRvIDB4ZjEwMDAwMDAgKDMuNzVHQiksIEFkZHJlc3MKKwkgKiAgIGRlY29kaW5nIHN1cHBvcnRzIG9ubHkgd2luZG93cyBzaXplIGFsaWduZWQgdG8gcG93ZXIgb2YgMi4KKwkgKi8KKwllbnYgPSBnZXRlbnYoImxpbWl0X2RyYW1fc2l6ZSIpOworCWlmIChlbnYgJiYgKChzdHJjbXAoZW52LCAieWVzIikgPT0gMCkgfHwgIChzdHJjbXAoZW52LCAiWWVzIikgPT0gMCkpKQorCXsKKwkJcHJpbnRmKCJcbkxpbWl0IEREUiBzaXplIGF0IDNHQiBkdWUgdG8gcG93ZXIgb2YgMiByZXF1aXJlbWVudCBvZiBBZGRyZXNzIGRlY29kaW5nXG4iKTsKKwkJbDJfYmFzZSA9IChfNEcgLSBfMUcpOworCX0gZWxzZQorCQlsMl9iYXNlID0gKF80RyAtIF8yNTZNKTsKIAogI2lmZGVmIENPTkZJR19NQVJWRUxMCiAJZm9yIChiYW5rID0gMDsgYmFuayA8IENPTkZJR19OUl9EUkFNX0JBTktTOyBiYW5rKyspIHsKIAkJc3RhcnRbYmFua10gPSBnZC0+ZHJhbV9od19pbmZvW2JhbmtdLnN0YXJ0OwogCQlzaXplW2JhbmtdID0gZ2QtPmRyYW1faHdfaW5mb1tiYW5rXS5zaXplOwogCi0JCS8qIC0gQmluYXJ5IGhlYWRlciBwcmVzZXJ2ZXMgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4yNUdCLCBpbiBvcmRlcgotCQkgKiAgIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggaW50ZXJuYWwgcmVnaXN0ZXJzIElPIGxvY2F0ZWQgMHhkMDAwMDAwMC4KLQkJICogLSBVLUJvb3QgdXBkYXRlcyBpbnRlcm5hbCByZWdpc3RlciBiYXNlIHRvIDB4ZjEwMDAwMDAgKDMuNzVHQikKLQkJICogLSBpZiBEUkFNIENTIHNpemUgcmVhY2hlcyA0RyAtLT4gYWxzbyBsaW1pdCBDUyBtZW1vcnkgbm9kZSB0byAzLjc1R0IgKi8KLQotCQkvKiBkdWUgdG8gTFNQIGlzc3VlIHdpdGggdW5hbGlnbmVkIHdpbmRvdyBzaXplcyB0byBwb3dlciBvZiAyICgzLjc1R0IpLAotCQkgKiBMMiBpcyB0ZW1wb3Jhcnkgc2V0IHRvIDNHQjogdXBkYXRlIERUIG1lbW9yeSBub2RlIGFjY29yZGluZ2x5ICovCisJCSAvKiAtIElmIG1lbW9yeSBzaXplIHJlYWNoZWQgNEdCLCBsaW1pdCBsYXN0IENTIHNpemUgYWNjb3JkaW5nIHRvIGhpZ2hlc3QgcG93ZXIgb2YgMi4KKwkJICogICAod2hlbiB1c2luZyAyeDJHQiwgbGFzdCBDUyB3aWxsIGJlIGxpbWl0ZWQgdG8gMUdCKSAqLwogCQlpZiAoKHN0YXJ0W2JhbmtdICsgc2l6ZVtiYW5rXSkgPT0gXzRHKSB7CiAJCQlzaXplW2JhbmtdID0gKGwyX2Jhc2UgLSBzdGFydFtiYW5rXSk7Ci0JCQkvKiBMU1AgaXMgdGVtcG9yYXJpbHkgd3JvbmdseSBkZXJpdmluZyBEUkFNIHdpbmRvd3MgbGltaXRhdGlvbiBmcm9tIE1CdXMuCi0JCQkgKiBhcyBhIHRlbXAgV0EsIGFsaWduIE1idXMgYnJpZGdlIHdpdGggTDIgYmFzZSAqLworCQkJLyogc2V0IElPIGFyZWEgdG8gaGlnaGVyIHByaW9yaXR5IHRoYW4gRFJBTSB3aW5kb3csIGJ5IGFsaWduaW5nIE1CVVMgYnJpZGdlIHdpdGggTDIgYmFzZS4KKwkJCSAqIChMaW51eCBtYWlubGluZSBNQlVTIGRyaXZlciB1c2VzIE1CVVMgY29uZmlndXJhdGlvbiB0byBkZXJpdmUgTDIgZmlsdGVyaW5nKSAqLwogCQkJbXZDcHVJZk1idXNXaW5kb3dTZXQobDJfYmFzZSwgXzRHIC0gbDJfYmFzZSk7CiAJCX0KIAl9CkBAIC0yMjEsMTUgKzIyOSwxNSBAQAogCQkJaWYgKChzdGFydCAtIDEgKyBzaXplKSA9PSAweEZGRkZGRkZGKSB7CiAJCQkJcGFyYW1zLT51Lm1lbS5zdGFydCA9IHN0YXJ0OwogI2lmZGVmIE1WX0REUl9MMl9BTElHTk1FTlQKLS8qIC0gQmluYXJ5IGhlYWRlciBwcmVzZXJ2ZXMgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4yNUdCLCBpbiBvcmRlcgotICogICB0byBhdm9pZCBjb25mbGljdCB3aXRoIGludGVybmFsIHJlZ2lzdGVycyBJTyBsb2NhdGVkIDB4ZDAwMDAwMDAuCi0gKiAtIFUtQm9vdCB1cGRhdGVzIGludGVybmFsIHJlZ2lzdGVyIGJhc2UgdG8gMHhmMTAwMDAwMCAoMy43NUdCKQotICogLSBpZiBEUkFNIENTIHNpemUgcmVhY2hlcyA0RyAtLT4gYWxzbyBsaW1pdCBtZW1vcnkgdGFncyB0byAzLjc1R0IgKi8KLQotLyogVGVtcG9yYXJ5OiBkdWUgdG8gTFNQICgzLjEwKSBpc3N1ZSB3aXRoIHVuYWxpZ25lZCB3aW5kb3cgc2l6ZXMgdG8gcG93ZXIgb2YgMiAoMy43NUdCKSwKLSAqIEwyIGlzIHNldCB0byAzR0I6IHVwZGF0ZSBtZW1vcnkgdGFncyBhY2NvcmRpbmdseSAqLworCQkJLyogLSBCaW5hcnkgaGVhZGVyIHByaW9yaXRpemUgSU8gbWVtb3J5IHNwYWNlIHZpYSBMMiBmaWx0ZXJpbmcgYXQgMy4wR0IsIGluIG9yZGVyCisJCQkgKiAgIHRvIGVuc3VyZSAnaGl0JyBvbiBpbnRlcm5hbCByZWdpc3RlcnMgSU8gYWNjZXNzIChsb2NhdGVkIGF0IDB4ZDAwMDAwMDAgYnkgZGVmYXVsdCkKKwkJCSAqIC0gQWx0aG91Z2ggVS1Cb290IHVwZGF0ZXMgaW50ZXJuYWwgcmVnaXN0ZXIgYmFzZSB0byAweGYxMDAwMDAwICgzLjc1R0IpLCBBZGRyZXNzCisJCQkgKiAgIGRlY29kaW5nIHN1cHBvcnRzIG9ubHkgd2luZG93cyBzaXplIGFsaWduZWQgdG8gcG93ZXIgb2YgMi4KKwkJCSAqIC0gSWYgbWVtb3J5IHNpemUgcmVhY2hlZCA0R0IsIGxpbWl0IGxhc3QgQ1Mgc2l6ZSBhY2NvcmRpbmcgdG8gaGlnaGVzdCBwb3dlciBvZiAyLgorCQkJICogICAod2hlbiB1c2luZyAyeDJHQiwgbGFzdCBDUyB3aWxsIGJlIGxpbWl0ZWQgdG8gMUdCKSAqLwogCQkJCXBhcmFtcy0+dS5tZW0uc2l6ZSA9IChsMl9iYXNlIC0gc3RhcnQpOwotLyogYWxpZ24gTWJ1cyBicmlkZ2Ugd2l0aCBMMiBiYXNlICovCisKKwkJCQkvKiBzZXQgSU8gYXJlYSB0byBoaWdoZXIgcHJpb3JpdHkgdGhhbiBEUkFNIHdpbmRvdywgYnkgYWxpZ25pbmcgTUJVUyBicmlkZ2Ugd2l0aCBMMiBiYXNlKi8KIAkJCQltdkNwdUlmTWJ1c1dpbmRvd1NldChsMl9iYXNlLCBfNEcgLSBsMl9iYXNlKTsKICNlbHNlCiAJCQkJcGFyYW1zLT51Lm1lbS5zaXplID0gKDB4RjAwMDAwMDAgLSBzdGFydCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMgYi9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKaW5kZXggYzcwOGUwMy4uODI4MjM3NSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYwpAQCAtMTQ4Nyw2ICsxNDg3LDI4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHJldHVybnMgcG9ydCdzIGNvbm5lY3Rpb24gc3RhdHVzLCB0aGlzIHJvdXRlIHByb3ZpZGUgYSB1bmlmaWVkIGluZXJmYWNlCisqICAgICAgIGZvciBvdGhlciBtb2R1bGVzIHRvIGNhbGwgd2l0aG91dCBjYXJlIG9mIHRoZSBzd2l0Y2ggY29ubnRlY3Rpb24gbW9kZSAtIGV4dGVybmFsIG9yIGludGVybmFsCisqICAgICAgIGlmIHRoZSBzd2l0Y2ggaXMgY29ubmVjdGVkCisqIElOUFVUOgorKiAgICAgICBldGhQb3J0TnVtIC0gRXRoZXJuZXQgcG9ydCBudW1iZXIuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICAxIC0gaWYgZXRoUG9ydE51bSBpcyBjb25uZWN0ZWQgdG8gc3dpdGNoLCAwIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gbXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZCb2FyZEZyZXFNb2Rlc051bUdldAogKgogKiBERVNDUklQVElPTjoKQEAgLTMwNTAsNyArMzA3Miw4IEBACiBNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpCiB7CiAJTVZfVTMyIGk7Ci0KKwlpZiAodXNiUG9ydE51bWJlciA+PSBtdkN0cmxVc2JNYXhHZXQoKSkKKwkJcmV0dXJuIE1WX0ZBTFNFOwogCS8qIEdvIG92ZXIgZXhpc3RpbmcgVVNCIHBvcnRzIGluIGJvYXJkIHN0cnVjdHVyZXM6IHRlc3QgZXhpc3RlbmNlIG9mIHJlcXVlc3RlZCBVU0IgVHlwZS9wb3J0ICovCiAJZm9yIChpID0gMDsgaSA8IGJvYXJkLT5udW1Cb2FyZFVzYkluZm87IGkrKykKIAkJaWYgKGJvYXJkLT5wQm9hcmRVc2JJbmZvW2ldLmlzQWN0aXZlICYmIGJvYXJkLT5wQm9hcmRVc2JJbmZvW2ldLnVzYlR5cGUgPT0gdXNiVHlwZUlEICYmCkBAIC0zMDg1LDMgKzMxMDgsNDAgQEAKIAogCXJldHVybiBib2FyZC0+bnVtUGljR3Bpb0luZm87CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNUZG1Db25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIE1WX1RSVUUgaWYgVERNIG1vZHVsZSBpcyBjb25uZWN0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIC0gVERNIGlzIGNvbm5lY3RlZAorKiAgICAgICBNVl9GQUxTRSAtIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpCit7CisJLyogVERNIGlzIG5vdCBzdXBwb3J0ZWQgb24gYTM3NSAqLworCXJldHVybiBNVl9GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElzVXNiM1BvcnREZXZpY2UKKyogREVTQ1JJUFRJT046IHJldHVybiB0cnVlIFVTQjMgcG9ydCBpcyBpbiBkZXZpY2UgbW9kZQorKgorKiBJTlBVVDogIHBvcnQJCS0gcG9ydCBudW1iZXIKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUU6IGlmIHBvcnQgaXMgc2V0IHRvIGRldmljZSBtb2RlCisqICAgICAgICAgTVZfRkFMU0U6IG90aGVyd2lzZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZElzVXNiM1BvcnREZXZpY2UoTVZfVTMyIHBvcnQpCit7CisJLyogU2luY2UgdXNiMyBkZXZpY2UgaXMgbm90IHN1cHBvcnRlZCBvbiBjdXJyZW50IGJvYXJkIHJldHVybiBmYWxzZSAqLworCXJldHVybiBNVl9GQUxTRTsKK30KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaCBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaAppbmRleCAxZjIwZThhLi5lMTczOWRlIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCkBAIC00OTMsNiArNDkzLDcgQEAKIE1WX1NUQVRVUyBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZFRvUG9ydChNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl9TVEFUVVMgbXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQodm9pZCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaFBvcnRGb3JjZUxpbmtHZXQoTVZfVTMyIHN3aXRjaElkeCk7CitNVl9TVEFUVVMgbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKHZvaWQpOwogTVZfQk9PTCBtdkJvYXJkSXNMdmRzTW9kdWxlQ29ubmVjdGVkKHZvaWQpOwogTVZfQk9PTCBtdkJvYXJkSXNMY2REdmlNb2R1bGVDb25uZWN0ZWQodm9pZCk7CiBNVl9TVEFUVVMgbXZCb2FyZFR3c2lNdXhDaGFubmVsU2V0KE1WX1U4IG11eENoTnVtKTsKQEAgLTUyMCw2ICs1MjEsOCBAQAogTVZfTkFORF9JRl9NT0RFIG12Qm9hcmROYW5kSWZHZXQodm9pZCk7CiBNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpOwogTVZfVTggbXZCb2FyZFBJQ0dwaW9HZXQoTVZfVTMyICpwaWNHcGlvTXBwSW5mbyk7CitNVl9CT09MIG12Qm9hcmRJc1RkbUNvbm5lY3RlZCh2b2lkKTsKK01WX0JPT0wgbXZCb2FyZElzVXNiM1BvcnREZXZpY2UoTVZfVTMyIHBvcnQpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmggYi9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCmluZGV4IGIwMWI5NzMuLjk0OTQxNzEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaApAQCAtMTQ4LDcgKzE0OCw3IEBACiAjZGVmaW5lIERCXzg4RjY3MjBfR1BQX1BPTF9NSUQJCTB4MAogI2RlZmluZSBEQl84OEY2NzIwX0dQUF9QT0xfSElHSAkJMHgwCiAKLQorI2RlZmluZSBNVl9URE1fT0ZGU0VUCQkJCSgweEIwMDAwKQogI2VuZGlmICAvKiBNVl9BU01MQU5HVUFHRSAqLwogCiAjZW5kaWYgIC8qIF9fSU5DbXZCb2FyZEVudlNwZWNoICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYwppbmRleCAwY2ExY2VhLi4zNDg0MjM2IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKQEAgLTIyOCw3ICsyMjgsMzAgQEAKIAogCWJvYXJkUGV4SW5mby0+Ym9hcmRQZXhJZk51bSA9IHBleElmTnVtOwogfQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkCisqCisqIERFU0NSSVBUSU9OOmRldGVjdCB1c2IzIHBvcnQgaWYgY29ubmVjdGVkIHRvIHNlcmRlcy4KKyogICAgICAgY2hlY2sgaWYgU2VyRGVzIGxhbmUgaXMgY29ubmVjdGVkIHRvIFVTQjMgaG9zdAorKgorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOnJldHVybiB0cnVlIGlmIHVzYiBwaHlzaWNhbCBwb3J0IGlzIGNvbm5lY3RlZCAsIGZhbHNlIG90aGVyd2lzZS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkKE1WX1UzMiB1c2JQb3J0KQoreworICAgICAgICBpbnQgdXNiM0hvc3ROdW0gPSBtdkN0cmxVc2IzSG9zdE1heEdldCgpOworICAgICAgICBpbnQgbWF4U2VyRGVzTGFuZXMgPSBtdkN0cmxVc2IzTWF4R2V0KCk7CisgICAgICAgIGlmICh1c2JQb3J0ID49IG1heFNlckRlc0xhbmVzICYmIHVzYjNIb3N0TnVtID4gbWF4U2VyRGVzTGFuZXMpeworICAgICAgICAgICAgICAgIHJldHVybiBNVl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTVZfVFJVRTsKK30KIAogTVZfVU5JVF9JRCBtdkN0cmxTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01WXzY3eHhfSU5ERVhfTUFYXSA9IHsKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICA2NzIwICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oIGIvYm9hcmQvbXZfZWJ1L2EzNzUvYXJtYWRhXzM3NV9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAppbmRleCA1YWQxMDkwLi4xMjgyZGMwIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmgKQEAgLTI4Miw2ICsyODIsNyBAQAogTVZfVk9JRCBtdkN0cmxTeXNDb25maWdJbml0KE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybFN5c0NvbmZpZ0dldChNVl9DT05GSUdfVFlQRV9JRCBjb25maWdGaWVsZCk7CiBNVl9VMzIgbXZDdHJsR2V0Q3B1TnVtKE1WX1ZPSUQpOworTVZfQk9PTCBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZChNVl9VMzIgdXNiUG9ydCk7CiBNVl9VMzIgbXZDdHJsR2V0UXVhZE51bShNVl9WT0lEKTsKIE1WX1NUQVRVUyBtdkN0cmxVcGRhdGVQZXhJZChNVl9WT0lEKTsKIE1WX0JPT0wgbXZDdHJsSXNWYWxpZFNhdFIoTVZfVk9JRCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM3NS9hcm1hZGFfMzc1X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaCBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCmluZGV4IDVmYmQzMWEuLjQyMGRlZGEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCisrKyBiL2JvYXJkL212X2VidS9hMzc1L2FybWFkYV8zNzVfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCkBAIC0xMzAsNiArMTMwLDggQEAKICNkZWZpbmUgTVZfVVNCM19QSFlTX09GRlNFVChkZXYpICAgICAgICAgICAgICAgICgweDU4MDAwKQogI2RlZmluZSBNVl9VU0IyX1VTQjNfUkVHU19PRkZTRVQodW5pdFR5cGUsIGRldikgKHVuaXRUeXBlID09IFVTQl9VTklUX0lEID8gXAogCQkJCQkJCU1WX1VTQl9SRUdTX09GRlNFVChkZXYpIDogTVZfVVNCM19QSFlTX09GRlNFVChkZXYpKQorI2RlZmluZSBNVl9VU0IzX0RFVklDRV9SRUdTX09GRlNFVAkJTVZfVVNCX1JFR1NfT0ZGU0VUKDApCisjZGVmaW5lIE1WX1VTQjNfREVWSUNFX1VTQjJfUkVHU19PRkZTRVQJCSgweDU0MTAwKQogI2RlZmluZSBNVl9YT1JfUkVHU19PRkZTRVQodW5pdCkgICAgICAgICAgICAgICAgKDB4NjA4MDApCiAjZGVmaW5lIE1WX0NFU0FfVERNQV9SRUdTX09GRlNFVChjaGFuTnVtKSAgICAgICAoMHg5MDAwMCArIChjaGFuTnVtICogMHgyMDAwKSkKICNkZWZpbmUgTVZfQ0VTQV9SRUdTX09GRlNFVChjaGFuTnVtKSAgICAgICAgICAgICgweDlEMDAwICsgKGNoYW5OdW0gKiAweDIwMDApKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzNzUvbXZfbWFpbl9hMzc1LmMgYi9ib2FyZC9tdl9lYnUvYTM3NS9tdl9tYWluX2EzNzUuYwppbmRleCBiNWYyYTNlLi4zODQwMTEzIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvYTM3NS9tdl9tYWluX2EzNzUuYworKysgYi9ib2FyZC9tdl9lYnUvYTM3NS9tdl9tYWluX2EzNzUuYwpAQCAtMjk0LDcgKzI5NCw2IEBACiAJCQkqKHVuc2lnbmVkIGludCopKENPTkZJR19TWVNfVEVYVF9CQVNFICsgaSk7CiAKIAltdkJvYXJkRGVidWdMZWQoNCk7Ci0JbXZfcHJpbnRfbWFwKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMSw3ICszMTAsNyBAQAogCWVudiA9IGdldGVudigibXRkaWRzIik7CiAJaWYgKCFlbnYpIHsKICNpZiBkZWZpbmVkKE1WX05BTkQpICYmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0JCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kO3NwaTA9c3BpX2ZsYXNoIik7CisJCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kLHNwaTA9c3BpX2ZsYXNoIik7CiAjZWxpZiBkZWZpbmVkKE1WX05BTkQpCiAJCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kIik7CiAjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQpAQCAtNDkyLDYgKzQ5MSwxMiBAQAogCWlmICghZW52KQogCQlzZXRlbnYoImluaXRyZF9uYW1lIiwgInVJbml0cmQiKTsKIAorI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisJZW52ID0gZ2V0ZW52KCJydW5fc2NyaXB0Iik7CisJaWYgKCFlbnYpCisJCXNldGVudigicnVuX3NjcmlwdCIsICJubyIpOworI2VuZGlmCisKIAkvKiBuZXRic2QgYm9vdCBhcmd1bWVudHMgKi8KIAllbnYgPSBnZXRlbnYoIm5ldGJzZF9lbiIpOwogCWlmICggIWVudiB8fCAoICgoc3RyY21wKGVudiwgIm5vIikgPT0gMCkgfHwgKHN0cmNtcChlbnYsICJObyIpID09IDApICkpKQpAQCAtMTAyNCw2ICsxMDI5LDcgQEAKICNlbmRpZgogCS8qIGluaXQgdGhlIHVuaXRzIGRlY29kZSB3aW5kb3dzICovCiAJbWlzY19pbml0X3JfZGVjX3dpbigpOworCW12X3ByaW50X21hcCgpOwogCW1lbXNldCgodm9pZCopQ09ORklHX1NZU19MT0FEX0FERFIsIDAsIENPTkZJR19TWVNfTUlOX0hEUl9ERUxfU0laRSk7CiAJbXZCb2FyZERlYnVnTGVkKDYpOwogCkBAIC0xMDQ0LDcgKzEwNTAsMTIgQEAKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVU5NX0VUSCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpCiAJbXZCb2FyZEVnaWdhUGh5SW5pdCgpOwogI2VuZGlmCi0KKyNpZmRlZiBDT05GSUdfQ01EX1NPVVJDRQorCS8qIHJ1biBzYXZlZCBzY3JpcHQgKi8KKwllbnYgPSBnZXRlbnYoInJ1bl9zY3JpcHQiKTsKKwlpZiAoZW52ICYmIHN0cmNtcChlbnYsICJ5ZXMiKSA9PSAwKQorCQlydW5fY29tbWFuZCgibXZzb3VyY2UgcnVuIiwgMCk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCmluZGV4IGRkYjM1NmUuLjc2NmVjNGQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYworKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKQEAgLTIxNCw2ICsyMTQsMTAgQEAKIAlNVl9SRUdfQklUX1NFVChHUFBfREFUQV9PVVRfUkVHKDEpLCBCSVQwKTsJLy8gODh4MjAxMV9SU1RfbgogCU1WX1JFR19CSVRfU0VUKEdQUF9EQVRBX09VVF9SRUcoMSksIEJJVDE1KTsJLy8gU0RfUlNUX24KICNlbmRpZgorCisJLyogQ2FsbCBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYm9hcmQgc3BlY2lmaWMgcG9zdCBHUFAgY29uZmlndXJhdGlvbiAqLworCWlmIChib2FyZC0+Z3BwUG9zdENvbmZpZ0NhbGxCYWNrKQorCQlib2FyZC0+Z3BwUG9zdENvbmZpZ0NhbGxCYWNrKGJvYXJkKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU3MCw3ICs1NzQsMTAgQEAKIAl0Y2xrID0gKCh0Y2xrICYgKDEgPDwgMTUpKSA+PiAxNSk7CiAJc3dpdGNoICh0Y2xrKSB7CiAJY2FzZSAwOgotCQlyZXR1cm4gTVZfQk9BUkRfVENMS18yNTBNSFo7CisJCWlmIChtdkN0cmxNb2RlbEdldCgpID09IE1WXzY4MTFfREVWX0lEKQorCQkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMTY2TUhaOwkvKiBkZXZpY2UgMzgxLzIgKDY4MTEvMjEpIHVzZSAxNjZNSHogaW5zdGVhZCBvZiAyNTBNSHogKi8KKwkJZWxzZQorCQkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjUwTUhaOwogCWNhc2UgMToKIAkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjAwTUhaOwogCWRlZmF1bHQ6CkBAIC02NjQsNyArNjcxLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+bnVtQm9hcmRHcHBJbmZvOyBpKyspIHsKIAkJaWYgKGJvYXJkLT5wQm9hcmRHcHBJbmZvW2ldLmRldkNsYXNzID09IGdwcENsYXNzKSB7Ci0JCQlpZiAoaW5kZXhGb3VuZCA9PSBpbmRleCkKKwkJCWlmIChpbmRleEZvdW5kID09IGluZGV4ICYmIChNVl9VMzIpYm9hcmQtPnBCb2FyZEdwcEluZm9baV0uZ3BwUGluTnVtICE9IC0xKQogCQkJCXJldHVybiAoTVZfVTMyKWJvYXJkLT5wQm9hcmRHcHBJbmZvW2ldLmdwcFBpbk51bTsKIAkJCWVsc2UKIAkJCQlpbmRleEZvdW5kKys7CkBAIC03MjUsNiArNzMyLDExMCBAQAogCXJldHVybiBtdkJvYXJHcGlvUGluTnVtR2V0KEJPQVJEX0dQUF9SRVNFVCwgMCk7CiB9CiAKKyNpZmRlZiBNVl9VU0JfVkJVU19DWUNMRQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0CisqCisqIERFU0NSSVBUSU9OOgorKglSZXR1cm4gdGhlIENvbmZpZyB0eXBlIGZpZWxkcyBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBDb25maWcgdHlwZSBjbGFzcy4KKyoKKyogSU5QVVQ6CisqCWNvbmZpZ0NsYXNzIC0gVGhlIENvbmZpZyB0eXBlIGZpZWxkIHRvIHJldHVybiB0aGUgaW5mb3JtYXRpb24gZm9yLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyoJTVZfQk9BUkRfQ09ORklHX1RZUEVfSU5GTyBzdHJ1Y3Qgd2l0aCBtYXNrLCBvZmZzZXQgYW5kIHJlZ2lzdGVyIG51bWJlci4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0KE1WX0lPX0VYUEFOREVSX1RZUEVfSUQgaW9DbGFzcywKKwkJTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPICppb0luZm8pCit7CisJTVZfVTMyIGk7CisKKwkvKiB2ZXJpZnkgZXhpc3RlbmNlIG9mIHJlcXVlc3RlZCBjb25maWcgdHlwZSwgcHVsbCBpdHMgZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+bnVtQm9hcmRJb0V4cFBpbkluZm87IGkrKykKKwkJaWYgKGJvYXJkLT5wQm9hcmRJb0V4cFBpbkluZm9baV0uaW9GaWVsZGlkID09IGlvQ2xhc3MpIHsKKwkJCSppb0luZm8gPSBib2FyZC0+cEJvYXJkSW9FeHBQaW5JbmZvW2ldOworCQkJcmV0dXJuIE1WX09LOworCQl9CisKKwlEQihtdk9zUHJpbnRmKCIlczogRXJyb3I6IHJlcXVlc3RlZCBJTyBleHBhbmRlciBJRCB3YXMgbm90IGZvdW5kICglZClcbiIsCisJCQlfX2Z1bmNfXywgaW9DbGFzcykpOworCXJldHVybiBNVl9FUlJPUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElvRXhwVmFsU2V0IC0gd3JpdGUgYSBzcGVjaWZpZWQgdmFsdWUgdG8gSU8gRXhwYW5kZXJzCisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBzcGVjaWZpZWQgdmFsdWUgdG8gSU8gRXhwYW5kZXJzCisqCisqIElOUFVUOgorKiAgICAgICBpb0luZm8gIC0gcmVsZXZhbnQgSU8gRXhwYW5kZXIgaW5mb3JtYXRpb24KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1U4ICA6cmV0dXJuIHJlcXVlc3RlZCB2YWx1ZSAsIGlmIFRXU0kgcmVhZCB3YXMgc3VjY2VzZnVsbCwgZWxzZSAweEZGLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkSW9FeHBWYWxTZXQoTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPICppb0luZm8sIE1WX1U4IHZhbHVlLCBNVl9CT09MIGlzT3V0cHV0KQoreworCU1WX1U4IHJlYWRWYWwsIGNvbmZpZ1ZhbDsKKworCWlmIChpb0luZm8gPT0gTlVMTCkgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFdyaXRlIHRvIElPIEV4cGFuZGVyIGZhaWxlZCAoaW52YWxpZCBFeHBhbmRlciBpbmZvKVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogUmVhZCBkaXJlY3Rpb24gKG91dHB1dC9pbnB1dCkgVmFsdWUgKi8KKwlpZiAobXZCb2FyZFR3c2lHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSwKKwkJCQkJaW9JbmZvLT5yZWdOdW0gKyA0LCAmY29uZmlnVmFsLCAxKSAhPSBNVl9PSykgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFJlYWQgQ29uZmlndXJhdGlvbiBmcm9tIElPIEV4cGFuZGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogTW9kaWZ5IGRpcmVjdGlvbiAob3V0cHV0L2lucHV0KSB2YWx1ZSBvZiByZXF1ZXN0ZWQgcGluICovCisJaWYgKGlzT3V0cHV0KQorCQljb25maWdWYWwgJj0gfigxIDw8IGlvSW5mby0+b2Zmc2V0KTsJLyogb3V0cHV0IG1hcmtlZCBhcyAwOiBjbGVhbiBiaXQgb2Ygb2xkIHZhbHVlICAqLworCWVsc2UKKwkJY29uZmlnVmFsIHw9ICgxIDw8IGlvSW5mby0+b2Zmc2V0KTsJLyogaW5wdXQgbWFya2VkIGFzIDE6IHNldCBiaXQgb2Ygb2xkIHZhbHVlICAqLworCWlmIChtdkJvYXJkVHdzaVNldChCT0FSRF9UV1NJX0lPX0VYUEFOREVSLCBpb0luZm8tPmV4cGFuZGVyTnVtLAorCQkJCQlpb0luZm8tPnJlZ051bSArIDQsICZjb25maWdWYWwsIDEpICE9IE1WX09LKSB7CisJCW12T3NQcmludGYoIiVzOiBFcnJvcjogRW5hYmxlIFdyaXRlIHRvIElPIEV4cGFuZGVyIGF0IDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXworCQkJICAgLCBtdkJvYXJkVHdzaUFkZHJHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSkpOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogY29uZmlndXJlIG91dHB1dCB2YWx1ZSwgb25seSBmb3Igb3V0cHV0IGRpcmVjdGVkIElPICovCisJaWYgKCFpc091dHB1dCkKKwkJcmV0dXJuIE1WX09LOworCisJLyogUmVhZCBPdXRwdXQgVmFsdWUgKi8KKwlpZiAobXZCb2FyZFR3c2lHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSwKKwkJCQkJaW9JbmZvLT5yZWdOdW0sICZyZWFkVmFsLCAxKSAhPSBNVl9PSykgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFJlYWQgT3V0cHV0IHZhbHVlIGZyb20gSU8gRXhwYW5kZXIgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKwkvKiBNb2RpZnkgKi8KKwlyZWFkVmFsICY9IH4oMSA8PCBpb0luZm8tPm9mZnNldCk7CS8qIGNsZWFuIGJpdCBvZiBvbGQgdmFsdWUgICovCisJcmVhZFZhbCB8PSAodmFsdWUgPDwgaW9JbmZvLT5vZmZzZXQpOworCisJLyogV3JpdGUgb3V0cHV0IHZhbHVlKi8KKwlpZiAobXZCb2FyZFR3c2lTZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSwKKwkJCQkJaW9JbmZvLT5yZWdOdW0sICZyZWFkVmFsLCAxKSAhPSBNVl9PSykgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFdyaXRlIHRvIElPIEV4cGFuZGVyIGF0IDB4JXggZmFpbGVkXG4iLCBfX2Z1bmNfXworCQkJICAgLCBtdkJvYXJkVHdzaUFkZHJHZXQoQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwgaW9JbmZvLT5leHBhbmRlck51bSkpOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJcmV0dXJuIE1WX09LOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkVVNCVmJ1c0dwaW9QaW5HZXQgLSByZXR1cm4gVmJ1cyBpbnB1dCBHUFAKICoKQEAgLTc0NiwyNiArODU3LDY4IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIG12Qm9hcmRVU0JWYnVzRW5HcGlvUGluR2V0IC0gcmV0dXJuIFZidXMgRW5hYmxlIG91dHB1dCBHUFAKKyogbXZVc2JWYnVzR3BwU2V0IC0gU0VUIFVTQiBWQlVTIHNpZ25hbCB2aWEgR1BJTwogKgogKiBERVNDUklQVElPTjoKLSoKLSogSU5QVVQ6Ci0qCQlpbnQgIGRldk5vLgotKgotKiBPVVRQVVQ6Ci0qCQlOb25lLgotKgotKiBSRVRVUk46Ci0qICAgICAgIEdQSU8gcGluIG51bWJlci4gVGhlIGZ1bmN0aW9uIHJldHVybiAtMSBmb3IgYmFkIHBhcmFtZXRlcnMuCi0qCisqKiBJTlBVVDoJZ3BwTm8gLSBncHAgcGluIE51bWJlci4KKyoqIE9VVFBVVDoJTm9uZS4KKyoqIFJFVFVSTjoJTm9uZS4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1NVl8zMiBtdkJvYXJkVVNCVmJ1c0VuR3Bpb1BpbkdldChNVl8zMiBkZXZJZCkKK01WX1ZPSUQgbXZVc2JWYnVzR3BwU2V0KGludCBncHBObykKIHsKLQlyZXR1cm4gbXZCb2FyR3Bpb1Bpbk51bUdldChCT0FSRF9HUFBfVVNCX1ZCVVNfRU4sIGRldklkKTsKKwlNVl9VMzIgcmVnVmFsOworCisJLyogTVBQIENvbnRyb2wgUmVnaXN0ZXIgLSBzZXQgbXBwIGFzIEdQUCAodmFsdWUgPSAwKSovCisJcmVnVmFsID0gTVZfUkVHX1JFQUQobXZDdHJsTXBwUmVnR2V0KCh1bnNpZ25lZCBpbnQpKGdwcE5vIC8gOCkpKTsKKwlyZWdWYWwgJj0gfigweGYgPDwgKChncHBObyAlIDgpICogNCkpOworCU1WX1JFR19XUklURShtdkN0cmxNcHBSZWdHZXQoKHVuc2lnbmVkIGludCkoZ3BwTm8gLyA4KSksIHJlZ1ZhbCk7CisKKwlpZiAoZ3BwTm8gPCAzMikgeworCQkvKiBHUElPIERhdGEgT3V0IEVuYWJsZSBDb250cm9sIFJlZ2lzdGVyIC0gc2V0IHRvIG91dHB1dCAqLworCQltdkdwcFR5cGVTZXQoMCwgKDEgPDwgZ3BwTm8pLCBNVl9HUFBfT1VUICYgKDEgPDwgZ3BwTm8pKTsKKwkJLyogR1BJTyBvdXRwdXQgRGF0YSBWYWx1ZSBSZWdpc3RlciAtIHNldCBhcyBoaWdoICovCisJCW12R3BwVmFsdWVTZXQoMCwgKDEgPDwgZ3BwTm8pLCAoMSA8PCBncHBObykpOworCX0gZWxzZSB7CisJCS8qIEdQSU8gRGF0YSBPdXQgRW5hYmxlIENvbnRyb2wgUmVnaXN0ZXIgLSBzZXQgdG8gb3V0cHV0ICovCisJCW12R3BwVHlwZVNldCgxLCAoMSA8PCAoZ3BwTm8gLSAzMikpLCBNVl9HUFBfT1VUICYgKDEgPDwgKGdwcE5vIC0gMzIpKSk7CisJCS8qIEdQSU8gb3V0cHV0IERhdGEgVmFsdWUgUmVnaXN0ZXIgLSBzZXQgYXMgaGlnaCAqLworCQltdkdwcFZhbHVlU2V0KDEsICgxIDw8IChncHBObyAtIDMyKSksICgxIDw8IChncHBObyAtIDMyKSkpOworCX0KIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFVzYlZidXNTZXQgLSBTZXQgVVNCIFZCVVMgc2lnbmFsIGJlZm9yZSBkZXRlY3Rpb24KKyoKKyogREVTQ1JJUFRJT046CisqIHRoaXMgcm91dGluZSBzZXRzIFZCVVMgc2lnbmFsIHZpYSBHUElPIG9yIHZpYSBJMkMgSU8gZXhwYW5kZXIKKyoKKyoqIElOUFVUOglpbnQgIGRldiAtIFVTQiBIb3N0IG51bWJlcgorKiogT1VUUFVUOglOb25lLgorKiogUkVUVVJOOglOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1ZPSUQgbXZCb2FyZFVzYlZidXNTZXQoaW50IGRldikKK3sKKwlNVl8zMiBncHBObyA9IG12Qm9hcmRVU0JWYnVzR3Bpb1BpbkdldChkZXYpOworCisJLyogU29tZSBvZiBNYXJ2ZWxsIGJvYXJkcyBjb250cm9sIFZCVVMgc2lnbmFsIHZpYSBJMkMgSU8gZXhwYW5kZXIgdW5pdCAqLworI2lmbmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAorCU1WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTyBpb0luZm87CisKKwkvKiBpZiBWQlVTIHNpZ25hbCBpcyBDb250cm9sbGVkIHZpYSBJMkMgSU8gRXhwYW5kZXIgb24gYm9hcmQqLworCWlmIChtdkJvYXJkSW9FeHBhbmRlclR5cGVHZXQoTVZfSU9fRVhQQU5ERVJfVVNCX1ZCVVMsICZpb0luZm8pICE9IE1WX0VSUk9SKSB7CisJCW12Qm9hcmRJb0V4cFZhbFNldCgmaW9JbmZvLCAxLCBNVl9UUlVFKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogZWxzZSBpZiBWQlVTIHNpZ25hbCBpcyBDb250cm9sbGVkIHZpYSBHUElPIG9uIGJvYXJkKi8KKwlpZiAoZ3BwTm8gIT0gTVZfRVJST1IpCisJCW12VXNiVmJ1c0dwcFNldChncHBObyk7CisKK30KKyNlbmRpZiAvKiBNVl9VU0JfVkJVU19DWUNMRSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkR3Bpb0ludE1hc2tHZXQgLSBHZXQgR1BJTyBtYXNrIGZvciBpbnRlcnJ1cHQgcGlucwogKgogKiBERVNDUklQVElPTjoKQEAgLTkzMSw4ICsxMDg0LDE0IEBACiAJYm9vdFNyYyA9IG12Qm9hcmRCb290RGV2aWNlR3JvdXBTZXQoKTsKIAlpZiAoTVNBUl8wX0JPT1RfTkFORF9ORVcgPT0gYm9vdFNyYykKIAkJbXZCb2FyZE1vZHVsZUNvbmZpZ1NldChNVl9NT0RVTEVfTkFORF9PTl9CT0FSRCk7Ci0JZWxzZSBpZiAoTVNBUl8wX0JPT1RfU0RJTyA9PSBib290U3JjKQorCWVsc2UgaWYgKE1TQVJfMF9CT09UX1NESU8gPT0gYm9vdFNyYykgewogCQltdkJvYXJkTW9kdWxlQ29uZmlnU2V0KE1WX01PRFVMRV9EQjM4MV9NTUNfOEJJVF9PTl9CT0FSRCk7CisJCS8qIEVuYWJsZSBOQU5EIGFjY2VzcyBpZiB0aGUgU0RJTyBpcyBub3QgdXNpbmcgTkFORCBNUFBzLgorCQkgICBUaGUgU0RJTyBNUFBzIG92ZXJsYXAgTkFORCBvbmVzIGluIFNESU8tOGJpdCBhY2Nlc3MgbW9kZSwKKwkJICAgd2hlbiBib290IGF0dHIyID09IDQwICovCisJCWlmIChtdkJvYXJkQm9vdEF0dHJHZXQobXZCb2FyZEJvb3REZXZpY2VHZXQoKSwgMikgIT0gNDApCisJCQltdkJvYXJkTW9kdWxlQ29uZmlnU2V0KE1WX01PRFVMRV9OQU5EX09OX0JPQVJEKTsKKwl9CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDA5LDggKzExNjgsNyBAQAogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBuYW5kTW9kdWxlWzZdID0gTVBQX05BTkRfTU9EVUxFOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBzZGlvTW9kdWxlWzRdID0gTVBQX1NESU9fTU9EVUxFOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSB0ZG1Nb2R1bGVbMl0gPSBNUFBfVERNX01PRFVMRTsKLQlzdHJ1Y3QgX212Qm9hcmRNcHBNb2R1bGUgaTJzTW9kdWxlID0gTVBQX0kyU19NT0RVTEU7Ci0Jc3RydWN0IF9tdkJvYXJkTXBwTW9kdWxlIHNwZGlmTW9kdWxlID0gTVBQX1NQRElGX01PRFVMRTsKKwlzdHJ1Y3QgX212Qm9hcmRNcHBNb2R1bGUgYXVkaW9Nb2R1bGUgPSBNUFBfQVVESU9fTU9EVUxFOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBuYW5kT25Cb2FyZFs0XSA9IE1QUF9OQU5EX09OX0JPQVJEOwogCXN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSBtaW5pX3BjaWUwX09uQm9hcmQgPSBNUFBfR1BfTUlOSV9QQ0lFMDsKIAlzdHJ1Y3QgX212Qm9hcmRNcHBNb2R1bGUgbWluaV9wY2llMV9PbkJvYXJkID0gTVBQX0dQX01JTklfUENJRTE7CkBAIC0xMDM4LDE3ICsxMTk2LDIwIEBACiAJCWlmIChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX1NESU8pKQogCQkJbXZNb2R1bGVNcHBVcGRhdGUoNCwgc2Rpb01vZHVsZSk7CiAKKwkJLyogTWljcm9zZW1pIExFODgyNjZETEMgKFZFODgwIHNlcmllcykgKi8KIAkJaWYgKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfU0xJQ19URE1fREVWSUNFKSkKIAkJCW12TW9kdWxlTXBwVXBkYXRlKDIsIHRkbU1vZHVsZSk7CiAKLQkJaWYgKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfSTJTX0RFVklDRSkpCi0JCQltdk1vZHVsZU1wcFVwZGF0ZSgxLCAmaTJzTW9kdWxlKTsKLQotCQlpZiAobXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9TUERJRl9ERVZJQ0UpKQotCQkJbXZNb2R1bGVNcHBVcGRhdGUoMSwgJnNwZGlmTW9kdWxlKTsKKwkJaWYgKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfSTJTX0RFVklDRSkgfHwKKwkJCQltdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX1NQRElGX0RFVklDRSkpCisJCQltdk1vZHVsZU1wcFVwZGF0ZSgxLCAmYXVkaW9Nb2R1bGUpOwogCiAJCWlmIChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX05BTkRfT05fQk9BUkQpKQogCQkJbXZNb2R1bGVNcHBVcGRhdGUoNCwgbmFuZE9uQm9hcmQpOworCisJCS8qIFNpbGxhYiBTSTMyMjYxLUYgKi8KKwkJaWYgKG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpID09IE1WX1RSVUUpCisJCQltdk1vZHVsZU1wcFVwZGF0ZSgyLCB0ZG1Nb2R1bGUpOwogCQlicmVhazsKIAljYXNlIERCX0dQXzY4WFhfSUQ6CiAJCW1pbmlQY2llMF9zYXRhMF9zZWxlY3RvciA9IG12Qm9hcmRTYXRSUmVhZChNVl9TQVRSX0dQX1NFUkRFUzFfQ0ZHKTsgLyogMCA9IFNBVEEwICwgMSA9IFBDSWUwICovCkBAIC0xMjgxLDcgKzE0NDIsNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZAorKiBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQKICoKICogREVTQ1JJUFRJT046CiAqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHBvcnQncyBjb25uZWN0aW9uIHN0YXR1cwpAQCAtMTI5Niw5ICsxNDU3LDEyIEBACiAqICAgICAgIDEgLSBpZiBldGhQb3J0TnVtIGlzIGNvbm5lY3RlZCB0byBzd2l0Y2gsIDAgb3RoZXJ3aXNlCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTVZfU1RBVFVTIG12Qm9hcmRJc0ludGVybmFsU3dpdGNoQ29ubmVjdGVkKHZvaWQpCitNVl9TVEFUVVMgbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKHZvaWQpCiB7Ci0JcmV0dXJuIE1WX0ZBTFNFOworCWlmICgoYm9hcmQgPT0gKChNVl9CT0FSRF9JTkZPICopLTEpKSB8fCAoYm9hcmQtPnN3aXRjaEluZm9OdW0gPT0gMCkgfHwgKGJvYXJkLT5wU3dpdGNoSW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuIE1WX0ZBTFNFOworCisJcmV0dXJuIGJvYXJkLT5wU3dpdGNoSW5mb1swXS5pc0VuYWJsZWQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDAyLDEwICsxNTY2LDExIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfQk9PTCBtdkJvYXJkSXNHYkVQb3J0Q29ubmVjdGVkKE1WX1UzMiBldGhQb3J0TnVtKQogewotCS8qIHBvcnQgaXMgY29ubmVjdGVkLCBpZiBpdCdzIGlkZW50aWZpZWQgYXMgUi9TR01JSSwgYW5kIGhhcyBhIHZhbGlkIGNvcnJlc3BvbmRpbmcgTUFDIGluZm8gZW50cnkgKi8KKwkvKiBwb3J0IGlzIGNvbm5lY3RlZCwgaWYgaXQncyBlbmFibGVkLCBpZGVudGlmaWVkIGFzIFIvU0dNSUksIGFuZCBoYXMgYSB2YWxpZCBjb3JyZXNwb25kaW5nIE1BQyBpbmZvIGVudHJ5ICovCiAKIAogCWlmICgoZXRoUG9ydE51bSA8PSBib2FyZC0+bnVtQm9hcmRNYWNJbmZvKSAmJgorCQkoYm9hcmQtPnBCb2FyZE1hY0luZm9bZXRoUG9ydE51bV0uYm9hcmRNYWNFbmFibGVkID09IE1WX1RSVUUpICYmCiAJCSgobXZDdHJsUG9ydElzU2VyZGVzU2dtaWkoZXRoUG9ydE51bSkgfHwKIAkJKG12Q3RybFBvcnRJc1JnbWlpKGV0aFBvcnROdW0pICYmIG12Qm9hcmRQaHlBZGRyR2V0KGV0aFBvcnROdW0pICE9IC0xKSkgfHwKIAkJKG12Q3RybFBvcnRJc1NlcmRlc1J4YXVpKGV0aFBvcnROdW0pICYmIG12Qm9hcmRQaHlBZGRyR2V0KGV0aFBvcnROdW0pICE9IC0xKSkpCkBAIC0yMDc1LDYgKzIyNDAsOCBAQAogCQlnQm9hcmRJZCA9IENVU1RPTUVSX0JPQVJEX0lEMDsKIAkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQogCQlnQm9hcmRJZCA9IENVU1RPTUVSX0JPQVJEX0lEMTsKKwkjZWxpZiBDT05GSUdfQ0xFQVJGT0dfQk9BUkQKKwkJZ0JvYXJkSWQgPSBBMzhYX0NMRUFSRk9HX0JPQVJEX0lEOwogCSNlbGlmIENPTkZJR19HRkNIMTAwCiAJCWdCb2FyZElkID0gR0ZDSDEwMF9JRDsKIAkjZW5kaWYKQEAgLTIzMjUsNyArMjQ5MiwxMCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WXzMyIG12Qm9hcmRTbWlTY2FuTW9kZUdldChNVl9VMzIgc3dpdGNoSWR4KQogewotCXJldHVybiBCT0FSRF9FVEhfU1dJVENIX1NNSV9TQ0FOX01PREU7CisJaWYgKCFtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIGJvYXJkLT5wU3dpdGNoSW5mb1tzd2l0Y2hJZHhdLnNtaVNjYW5Nb2RlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjM0Niw3ICsyNTE2LDExOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdkJvYXJkU3dpdGNoQ3B1UG9ydEdldChNVl9VMzIgc3dpdGNoSWR4KQogewotCXJldHVybiAtMTsKKwlpZiAoIW12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYm9hcmQtPnBTd2l0Y2hJbmZvW3N3aXRjaElkeF0uY3B1UG9ydDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFN3aXRjaElzUmdtaWkgLSBDaGVjayBpZiB0aGUgU3dpdGNoIGNvbm5lY3RlZCB0byBSR01JSSBwb3J0CisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBpZiB0aGUgc3dpdGNoIGNvbm5lY3RlZCB0byBSR01JSSBwb3J0CisqCisqIElOUFVUOgorKiAgICAgICBzd2l0Y2hJZHggLSBpbmRleCBvZiB0aGUgc3dpdGNoLiBPbmx5IDAgaXMgc3VwcG9ydGVkLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgU3RhdHVzIG9mIHN3aXRjaCB0eXBlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkU3dpdGNoQ3B1UG9ydElzUmdtaWkoTVZfVTMyIHN3aXRjaElkeCkKK3sKKwlpZiAoIW12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKQorCQlyZXR1cm4gTVZfRkFMU0U7CisKKwlyZXR1cm4gYm9hcmQtPnBTd2l0Y2hJbmZvW3N3aXRjaElkeF0uaXNDcHVQb3J0UmdtaWk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRTd2l0Y2hQaHlBZGRyR2V0IC0gR2V0IHRoZSB0aGUgRXRoZXJuZXQgU3dpdGNoIFBIWSBhZGRyZXNzCisqCisqIERFU0NSSVBUSU9OOgorKglUaGlzIHJvdXRpbmUgcmV0dXJucyB0aGUgU3dpdGNoIFBIWSBhZGRyZXNzLCAtMSBlbHNlLgorKgorKiBJTlBVVDoKKyoJc3dpdGNoSWR4IC0gaW5kZXggb2YgdGhlIHN3aXRjaC4gT25seSAwIGlzIHN1cHBvcnRlZC4KKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCXRoZSBTd2l0Y2ggUEhZIGFkZHJlc3MsIC0xIGlmIHRoZSBzd2l0Y2ggaXMgbm90IGNvbm5lY3RlZC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl8zMiBtdkJvYXJkU3dpdGNoUGh5QWRkckdldChNVl9VMzIgc3dpdGNoSWR4KQoreworCWlmICghbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKCkpCisJCXJldHVybiAtMTsKKworCXJldHVybiBib2FyZC0+cFN3aXRjaEluZm9bc3dpdGNoSWR4XS5xdWFkUGh5QWRkcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFN3aXRjaENvbm5lY3RlZFBvcnRHZXQgLQorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyByb3V0aW5lIHJldHVybnMgdGhlIHN3aXRjaCBwb3J0IGNvbm5lY3RlZCB0byB0aGUgZXRoUG9ydAorKgorKiBJTlBVVDoKKyogICAgICAgZXRoUG9ydE51bSAtIEV0aGVybmV0IHBvcnQgbnVtYmVyLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl8zMiBtdkJvYXJkU3dpdGNoQ29ubmVjdGVkUG9ydEdldChNVl9VMzIgZXRoUG9ydCkKK3sKKwlpZiAoIW12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYm9hcmQtPnBTd2l0Y2hJbmZvWzBdLmNvbm5lY3RlZFBvcnRbZXRoUG9ydF07Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRNb2R1bGVTd2l0Y2hJbmZvVXBkYXRlIC0gVXBkYXRlIEJvYXJkIGluZm9ybWF0aW9uIHN3aXRjaCBtb2R1bGUgc3RydWN0dXJlcworKgorKiBERVNDUklQVElPTjoKKyoJVXBkYXRlIGJvYXJkIGluZm9ybWF0aW9uIHN3aXRjaCBtb2R1bGUgc3RydWN0dXJlcyBhY2NvcmRpbmcgdG8gc3dpdGNoIGRldGVjdGlvbgorKgorKiBJTlBVVDoKKyoJc3dpdGNoRGV0ZWN0ZWQgLSBzd2l0Y2ggbW9kdWxlIGlzIGRldGVjdGVkIG9yIG5vdAorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyoJTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9WT0lEIG12Qm9hcmRNb2R1bGVTd2l0Y2hJbmZvVXBkYXRlKE1WX0JPT0wgc3dpdGNoRGV0ZWN0ZWQpCit7CisJaW50IGkgPSAwOworCisJaWYgKChib2FyZCA9PSAoKE1WX0JPQVJEX0lORk8gKiktMSkpKSB7CisJCW12T3NQcmludGYoIiVzICVkOkJvYXJkIHVua25vd24uXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHN3aXRjaERldGVjdGVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+c3dpdGNoSW5mb051bTsgaSsrKQorCQkJaWYgKGJvYXJkLT5wU3dpdGNoSW5mbyAhPSBOVUxMKQorCQkJCWJvYXJkLT5wU3dpdGNoSW5mb1tpXS5pc0VuYWJsZWQgPSBNVl9UUlVFOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBib2FyZC0+c3dpdGNoSW5mb051bTsgaSsrKQorCQkJaWYgKGJvYXJkLT5wU3dpdGNoSW5mbyAhPSBOVUxMKQorCQkJCWJvYXJkLT5wU3dpdGNoSW5mb1tpXS5pc0VuYWJsZWQgPSBNVl9GQUxTRTsKKworCQlib2FyZC0+c3dpdGNoSW5mb051bSA9IDA7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzM4NCw4ICszNjY2LDQ5IEBACiAJCXJldHVybiBib2FyZC0+bmFuZElmTW9kZTsKIAl9CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNUZG1Db25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIE1WX1RSVUUgaWYgVERNIG1vZHVsZSBpcyBjb25uZWN0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIC0gVERNIGlzIGNvbm5lY3RlZAorKiAgICAgICBNVl9GQUxTRSAtIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpCit7CisJcmV0dXJuIGJvYXJkLT5pc1RkbUNvbm5lY3RlZDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFRkbUNvbm5lY3Rpb25TZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIGlmIFRETSBtb2R1bGUgaXMgY29ubmVjdGVkIG9yIG5vdC4KKyoKKyogSU5QVVQ6CisqCWlzQ29ubmVjdGVkIC0gaW5kaWNhdGVkIGlmIFRETSBtb2R1bGUgaXMgY29ubmVjdGVkLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIG12Qm9hcmRUZG1Db25uZWN0aW9uU2V0KE1WX0JPT0wgaXNDb25uZWN0ZWQpCit7CisJYm9hcmQtPmlzVGRtQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkaXNTZGlvQ29ubmVjdGVkCiAqIERFU0NSSVBUSU9OOiByZXR1cm4gdHJ1ZSBpZiBTRElPIGNvbm5lY3RlZCBvbiBib2FyZAogKgpAQCAtMzQ1MiwzICszNzc1LDQ1IEBACiAKIAlyZXR1cm4gTVZfRkFMU0U7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkQXVkaW9Db25uZWN0aW9uR2V0CisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBNVl9UUlVFIGlmIFNQRElGL0kyUyBpcyBjb25uZWN0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIC0gU1BESUYvSTJTIGlzIGNvbm5lY3RlZAorKiAgICAgICBNVl9GQUxTRSAtIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc0F1ZGlvQ29ubmVjdGVkKCkKK3sKKwlyZXR1cm4gYm9hcmQtPmlzQXVkaW9Db25uZWN0ZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRBdWRpb0Nvbm5lY3Rpb25TZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSBzZXRzIGlmIFNQRElGL0kyUyBtb2R1bGUgaXMgY29ubmVjdGVkIG9yIG5vdC4KKyoKKyogSU5QVVQ6CisqCWlzQ29ubmVjdGVkIC0gaW5kaWNhdGVkIGlmIFNQRElGL0kyUyBpcyBjb25uZWN0ZWQuCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZCb2FyZEF1ZGlvQ29ubmVjdGlvblNldChNVl9CT09MIGlzQ29ubmVjdGVkKQoreworCWJvYXJkLT5pc0F1ZGlvQ29ubmVjdGVkID0gaXNDb25uZWN0ZWQ7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKaW5kZXggNjhlZDMyMi4uOTIyNWYzMyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaApAQCAtMTc1LDEwICsxNzUsMTEgQEAKIAlNVl9NT0RVTEVfU0RJTwkJCQk9IEJJVDYsCS8qIFNESU8gYm9hcmQgU0xNIDEzNjEJKi8KIAlNVl9NT0RVTEVfU0dNSUkJCQkJPSBCSVQ3LAkvKiBTR01JSSBib2FyZCBTTE0gMTM2NAkqLwogCU1WX01PRFVMRV9EQjM4MV9TR01JSQkJCT0gQklUOCwJLyogREItMzgxIFNHTUlJIFNMTSAxNDI2ICovCi0JTVZfTU9EVUxFX05BTkRfT05fQk9BUkQJCQk9IEJJVDksCS8qIE9OIGJvYXJkIG5hbmQgLSBkZXRlY3RlZCB2aWEgU0BSIGJvb3RzcmMgKi8KLQlNVl9NT0RVTEVfREIzODFfTU1DXzhCSVRfT05fQk9BUkQJPSBCSVQxMCwvKiBPTiBib2FyZCBNTUMgOGJpdCAtIGRldGVjdGVkIHZpYSBTQFIgYm9vdHNyYyAqLwotCU1WX01PRFVMRV9UWVBFX01BWF9NT0RVTEUJCT0gOSwKLQlNVl9NT0RVTEVfVFlQRV9NQVhfT1BUSU9OCQk9IDEwCisJTVZfTU9EVUxFX1NXSVRDSAkJCT0gQklUOSwvKiBTV0lUQ0ggYm9hcmQgU0xNIDEzNzUJKi8KKwlNVl9NT0RVTEVfTkFORF9PTl9CT0FSRAkJCT0gQklUMTAsCS8qIE9OIGJvYXJkIG5hbmQgLSBkZXRlY3RlZCB2aWEgU0BSIGJvb3RzcmMgKi8KKwlNVl9NT0RVTEVfREIzODFfTU1DXzhCSVRfT05fQk9BUkQJPSBCSVQxMSwvKiBPTiBib2FyZCBNTUMgOGJpdCAtIGRldGVjdGVkIHZpYSBTQFIgYm9vdHNyYyAqLworCU1WX01PRFVMRV9UWVBFX01BWF9NT0RVTEUJCT0gMTAsCisJTVZfTU9EVUxFX1RZUEVfTUFYX09QVElPTgkJPSAxMQogfSBNVl9NT0RVTEVfVFlQRV9JRDsKIAogdHlwZWRlZiBzdHJ1Y3QgX2RldkNzSW5mbyB7CkBAIC0xOTEsNiArMTkyLDE4IEBACiAJTVZfQk9PTCBhY3RpdmU7CiB9IE1WX0RFVl9DU19JTkZPOwogCitzdHJ1Y3QgTVZfQk9BUkRfU1dJVENIX0lORk8geworCU1WX0JPT0wgaXNFbmFibGVkOworCU1WX0JPT0wgaXNDcHVQb3J0UmdtaWk7CisJTVZfMzIgc3dpdGNoSXJxOworCU1WXzMyIHN3aXRjaFBvcnRbQk9BUkRfRVRIX1NXSVRDSF9QT1JUX05VTV07CisJTVZfMzIgY3B1UG9ydDsKKwlNVl8zMiBjb25uZWN0ZWRQb3J0W01WX0VUSF9NQVhfUE9SVFNdOworCU1WXzMyIHNtaVNjYW5Nb2RlOworCU1WXzMyIHF1YWRQaHlBZGRyOworCU1WX1UzMiBmb3JjZUxpbmtNYXNrOyAvKiBCaXRtYXNrIG9mIHN3aXRjaCBwb3J0cyB0byBoYXZlIGZvcmNlIGxpbmsgKDFHYnBzKSAqLworfTsKKwogdHlwZWRlZiBlbnVtIF9TYXRSc3RhdHVzIHsKIAlTQVRSX1JFQURfT05MWSA9IDB4MDEsCiAJU0FUUl9TV0FQX0JJVCAgPSAweDAyLApAQCAtMjA3LDYgKzIyMCwxOCBAQAogCU1WX1U4IGdwcFBpbk51bTsKIH0gTVZfQk9BUkRfR1BQX0lORk87CiAKK3R5cGVkZWYgZW51bSBfbXZJb0V4cGFuZGVyVHlwZUlEIHsKKwlNVl9JT19FWFBBTkRFUl9VU0JfVkJVUywKKwlNVl9JT19FWFBBTkRFUl9NQVhfT1BUSU9OCit9IE1WX0lPX0VYUEFOREVSX1RZUEVfSUQ7CisKK3R5cGVkZWYgc3RydWN0IF9ib2FyZElvRXhhcG5kZXJUeXBlc0luZm8geworCU1WX0lPX0VYUEFOREVSX1RZUEVfSUQgaW9GaWVsZGlkOworCU1WX1UzMiBvZmZzZXQ7CisJTVZfVTMyIGV4cGFuZGVyTnVtOworCU1WX1UzMiByZWdOdW07Cit9IE1WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTzsKKwogdHlwZWRlZiBzdHJ1Y3QgX2JvYXJkVHdzaUluZm8gewogCU1WX0JPQVJEX1RXU0lfQ0xBU1MgZGV2Q2xhc3M7CiAJTVZfVTggZGV2Q2xhc3NJZDsKQEAgLTMyNCw2ICszNDksOSBAQAogCU1WX0JPQVJEX01BQ19JTkZPICpwQm9hcmRNYWNJbmZvOwogCU1WX1U4IG51bUJvYXJkR3BwSW5mbzsKIAlNVl9CT0FSRF9HUFBfSU5GTyAqcEJvYXJkR3BwSW5mbzsKKwlNVl9VOCBudW1Cb2FyZElvRXhwUGluSW5mbzsKKwlNVl9CT0FSRF9JT19FWFBBTkRFUl9UWVBFX0lORk8gKnBCb2FyZElvRXhwUGluSW5mbzsKKwogCU1WX1U4IGFjdGl2ZUxlZHNOdW1iZXI7CiAJTVZfVTggKnBMZWRHcHBQaW47CiAJTVZfVTggbGVkc1BvbGFyaXR5OyAgICAgLyogJzAnIG9yICcxJyB0byB0dXJuIG9uIGxlZCAqLwpAQCAtMzQwLDYgKzM2OCw3IEBACiAJTVZfVTMyIGdwcFBvbGFyaXR5VmFsTG93OwogCU1WX1UzMiBncHBQb2xhcml0eVZhbE1pZDsKIAlNVl9VMzIgZ3BwUG9sYXJpdHlWYWxIaWdoOworCU1WX1ZPSUQgKCpncHBQb3N0Q29uZmlnQ2FsbEJhY2spIChzdHJ1Y3QgX2JvYXJkSW5mbyAqKTsKIAogCU1WX0JPQVJEX1VTQl9JTkZPICpwQm9hcmRVc2JJbmZvOwkvKiB1c2IyLjAgYW5kIHVzYjMuMCBwaHlzaWNhbCBwb3J0IG1hcHBpbmcgb24gYm9hcmQgKi8KIAlNVl9VOCBudW1Cb2FyZFVzYkluZm87CkBAIC0zODYsNiArNDE1LDEyIEBACiAJTVZfVTMyCW51bUlvRXhwOwogCXN0cnVjdCBNVl9CT0FSRF9JT19FWFBBTkRFUiAqcElvRXhwOwogCU1WX1UzMiAgYm9hcmRPcHRpb25zTW9kdWxlOworCU1WX0JPT0wgaXNBbWM7CQkJLyogQU1DIGFjdGl2ZTogdXNlZCBmb3IgRFQgdXBkYXRlICYgc3dpdGNoaW5nIHNlcnZpY2VzICovCisJTVZfQk9PTCBpc0F1ZGlvQ29ubmVjdGVkOwkvKiBpbmRpY2F0ZXMgaWYgU1BESUYvSTJTIGlzIGNvbm5lY3RlZCAqLworCU1WX0JPT0wgaXNUZG1Db25uZWN0ZWQ7CQkvKiBpbmRpY2F0ZXMgaWYgVERNIG1vZHVsZSBpcyBjb25uZWN0ZWQgKi8KKwkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLworCXN0cnVjdCBNVl9CT0FSRF9TV0lUQ0hfSU5GTyAqcFN3aXRjaEluZm87CisJTVZfVTMyIHN3aXRjaEluZm9OdW07CiB9IE1WX0JPQVJEX0lORk87CiAKIHN0cnVjdCBfbXZCb2FyZE1wcE1vZHVsZSB7CkBAIC0zOTUsOSArNDMwLDggQEAKIAogCiAjZGVmaW5lIE1QUF9NSUlfTU9EVUxFCQl7IHswLCAweDEwMTExMTExfSwgezEsIDB4MTExMTExMTF9LCB7MiwgMHgxMTIxMTExMX0gfQotI2RlZmluZSBNUFBfVERNX01PRFVMRQkJeyB7NiwgMHg0NTMzMzMzM30sIHs3LCAweDAwMDA0NDQ0fSB9Ci0jZGVmaW5lIE1QUF9JMlNfTU9EVUxFCQl7NiwgMHg1NTU0NDU1NH0KLSNkZWZpbmUgTVBQX1NQRElGX01PRFVMRQl7NiwgMHg1NTQ0NDQ0NH0KKyNkZWZpbmUgTVBQX1RETV9NT0RVTEUJCXsgezYsIDB4NTUzMzMzMzN9LCB7NywgMHgwMDAwNDQ0NH0gfQorI2RlZmluZSBNUFBfQVVESU9fTU9EVUxFCXs2LCAweDU1NDQ0NDQ0fQogI2RlZmluZSBNUFBfTk9SX01PRFVMRQkJeyB7MCwgMHg1NTExMTExMX0sIHsxLCAweDE1NTU1NTU1fSwgezIsIDB4NTU1NjYwMTF9LCBcCiAJCQkJICB7MywgMHg1NTU1NTA1NX0sIHs0LCAweDU1NTU1NTU1fSwgezUsIDB4NDAwNDU1MjUgfSB9CiAjZGVmaW5lIE1QUF9OQU5EX01PRFVMRQkJeyB7MCwgMHg1NTExMTExMX0sIHsxLCAweDE1NTU1NTU1fSwgezIsIDB4NTUyNjYwMTF9LCBcCkBAIC00MzYsNiArNDcwLDExIEBACiAjZGVmaW5lIE1TQVJfMF9TUEkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1TQVJfMF9TUEkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCiAKKy8qIGRlZmluaXRpb24gZm9yIHN3aXRjaCBkZXZpY2Ugc2NhbiBtb2RlICovCisjZGVmaW5lIE1WX1NXSVRDSF9TTUlfQVVUT19TQ0FOX01PREUgICAgICAgICAwICAgIC8qIFNjYW4gMCBvciAweDEwIGJhc2UgYWRkcmVzcyB0byBmaW5kIHRoZSBRRCAqLworI2RlZmluZSBNVl9TV0lUQ0hfU01JX01BTlVBTF9NT0RFICAgICAgICAgICAgMSAgICAvKiBVc2UgUUQgbG9jYXRlZCBhdCBtYW51YWxseSBkZWZpbmVkIGJhc2UgYWRkciAqLworI2RlZmluZSBNVl9TV0lUQ0hfU01JX01VTFRJX0FERFJfTU9ERSAgICAgICAgMiAgICAvKiBVc2UgUUQgYXQgYmFzZSBhZGRyIGFuZCB1c2UgaW5kaXJlY3QgYWNjZXNzICovCisKIE1WX1ZPSUQgbXZCb2FyZEVudkluaXQoTVZfVk9JRCk7CiBNVl9VMTYgbXZCb2FyZE1vZGVsR2V0KE1WX1ZPSUQpOwogTVZfVTMyIG12Qm9hcmRSZXZHZXQoTVZfVk9JRCk7CkBAIC00NjYsOCArNTA1LDExIEBACiBNVl9WT0lEIG12Qm9hcmRSZXNldChNVl9WT0lEKTsKIE1WX0JPQVJEX1BFWF9JTkZPICptdkJvYXJkUGV4SW5mb0dldCh2b2lkKTsKIE1WXzMyIG12Qm9hcmRSZXNldEdwaW9QaW5HZXQoTVZfVk9JRCk7CisjaWZkZWYgTVZfVVNCX1ZCVVNfQ1lDTEUKIE1WXzMyIG12Qm9hcmRVU0JWYnVzR3Bpb1BpbkdldChNVl8zMiBkZXZJZCk7Ci1NVl8zMiBtdkJvYXJkVVNCVmJ1c0VuR3Bpb1BpbkdldChNVl8zMiBkZXZJZCk7CitNVl9TVEFUVVMgbXZCb2FyZElvRXhwYW5kZXJUeXBlR2V0KE1WX0lPX0VYUEFOREVSX1RZUEVfSUQgaW9DbGFzcywgTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPICppb0luZm8pOworTVZfVk9JRCBtdkJvYXJkVXNiVmJ1c1NldChpbnQgZGV2KTsKKyNlbmRpZgogTVZfQk9PTCBtdkJvYXJkSXNPdXJQY2lTbG90KE1WX1UzMiBidXNOdW0sIE1WX1UzMiBzbG90TnVtKTsKIE1WX1UzMiBtdkJvYXJkR3Bpb0ludE1hc2tHZXQoTVZfVTMyIGdwcEdycCk7CiBNVl9VMzIgbXZCb2FyZFNsaWNVbml0VHlwZUdldChNVl9WT0lEKTsKQEAgLTUwOSw3ICs1NTEsNyBAQAogTVZfU1RBVFVTIG12Qm9hcmRUd3NpU2V0KE1WX0JPQVJEX1RXU0lfQ0xBU1MgdHdzaUNsYXNzLCBNVl9VOCBkZXZOdW0sIE1WX1U4IHJlZ051bSwgTVZfVTggKnJlZ1ZhbCwgTVZfVTMyIGxlbik7CiBNVl9VOCBtdkJvYXJkQ3B1RnJlcUdldChNVl9WT0lEKTsKIE1WX1NUQVRVUyBtdkJvYXJkQ3B1RnJlcVNldChNVl9VOCBmcmVxVmFsKTsKLU1WX1NUQVRVUyBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZCh2b2lkKTsKK01WX1NUQVRVUyBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQodm9pZCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaFBvcnRGb3JjZUxpbmtHZXQoTVZfVTMyIHN3aXRjaElkeCk7CiBNVl9VMzIgbXZCb2FyZEZyZXFNb2Rlc051bUdldCh2b2lkKTsKIE1WXzMyIG12Qm9hcmRTbWlTY2FuTW9kZUdldChNVl9VMzIgc3dpdGNoSWR4KTsKQEAgLTUxNyw2ICs1NTksMTAgQEAKIE1WX1ZPSUQgbXZCb2FyZE1hY1NwZWVkU2V0KE1WX1UzMiBldGhQb3J0TnVtLCBNVl9CT0FSRF9NQUNfU1BFRUQgc3BlZWQpOwogTVZfVk9JRCBtdkJvYXJkTWFjU3BlZWRTZXQoTVZfVTMyIGV0aFBvcnROdW0sIE1WX0JPQVJEX01BQ19TUEVFRCBtYWNTcGVlZCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaENwdVBvcnRHZXQoTVZfVTMyIHN3aXRjaElkeCk7CitNVl8zMiBtdkJvYXJkU3dpdGNoUGh5QWRkckdldChNVl9VMzIgc3dpdGNoSWR4KTsKK01WXzMyIG12Qm9hcmRTd2l0Y2hDb25uZWN0ZWRQb3J0R2V0KE1WX1UzMiBldGhQb3J0KTsKK01WX0JPT0wgbXZCb2FyZFN3aXRjaENwdVBvcnRJc1JnbWlpKE1WX1UzMiBzd2l0Y2hJZHgpOworTVZfVk9JRCBtdkJvYXJkTW9kdWxlU3dpdGNoSW5mb1VwZGF0ZShNVl9CT09MIHN3aXRjaERldGVjdGVkKTsKIE1WX1UzMiBtdkJvYXJkTWFjQ3B1UG9ydEdldChNVl9WT0lEKTsKIE1WX0JPT0wgbXZCb2FyZElzRXRoQ29ubmVjdGVkKE1WX1UzMiBldGhOdW0pOwogTVZfQk9PTCBtdkJvYXJkSXNFdGhBY3RpdmUoTVZfVTMyIGV0aE51bSk7CkBAIC01NjksMTEgKzYxNSwyMCBAQAogTVZfU1RBVFVTIG12Qm9hcmRTeXNDb25maWdTZXQoTVZfQ09ORklHX1RZUEVfSUQgY29uZmlnRmllbGQsIE1WX1U4IHZhbHVlKTsKIHZvaWQgbXZCb2FyZEVlcHJvbVZhbGlkU2V0KHZvaWQpOwogI2VuZGlmIC8qIENPTkZJR19DTURfQk9BUkRDRkcgKi8KK01WX0JPT0wgbXZCb2FyZElzVGRtQ29ubmVjdGVkKHZvaWQpOwordm9pZCBtdkJvYXJkVGRtQ29ubmVjdGlvblNldChNVl9CT09MIGlzQ29ubmVjdGVkKTsKIE1WX05BTkRfSUZfTU9ERSBtdkJvYXJkTmFuZElmR2V0KHZvaWQpOwogTVZfQk9PTCBtdkJvYXJkaXNTZGlvQ29ubmVjdGVkKHZvaWQpOwogTVZfVk9JRCBtdkJvYXJkU2Rpb0Nvbm5lY3Rpb25TZXQoTVZfQk9PTCBzdGF0dXMpOwogTVZfQk9PTCBtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKE1WX1VOSVRfSUQgdXNiVHlwZUlELCBNVl9VOCB1c2JQb3J0TnVtYmVyKTsKIE1WX0JPQVJEX0lORk8gKm12Qm9hcmRJbmZvU3RydWN0dXJlR2V0KE1WX1ZPSUQpOworTVZfQk9PTCBtdkJvYXJkSXNBdWRpb0Nvbm5lY3RlZCh2b2lkKTsKK3ZvaWQgbXZCb2FyZEF1ZGlvQ29ubmVjdGlvblNldChNVl9CT09MIGlzQ29ubmVjdGVkKTsKK01WX0JPT0wgbXZCb2FyZElzVXNiM1BvcnREZXZpY2UoTVZfVTMyIHBvcnQpOworCisjaWZkZWYgQ09ORklHX1NXSVRDSElOR19TRVJWSUNFUworTVZfQk9PTCBtdkJvYXJkaXNBbWModm9pZCk7CisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmMKaW5kZXggZmIyNzc1MS4uNGMyZWQ5NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM4eC5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOHguYwpAQCAtOTksNiArOTksNTYgQEAKIAlyZXR1cm4gTVZfUE9SVF9UWVBFX1VOS05PV047CiB9CiAKKyNpZmRlZiBDT05GSUdfU1dJVENISU5HX1NFUlZJQ0VTCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkaXNBbWMKKyogREVTQ1JJUFRJT046IHJldHVybiB0cnVlIGlmIGJvYXJkIGlzIEFNQworKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE1WX1RSVUU6IGlmIGJvYXJkIGlzIEFNQworKiAgICAgICAgIE1WX0ZBTFNFOiBlbHNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkaXNBbWModm9pZCkKK3sKKwlNVl9CT0FSRF9JTkZPICpib2FyZCA9IG12Qm9hcmRJbmZvU3RydWN0dXJlR2V0KCk7CisJaWYgKGJvYXJkKQorCQlyZXR1cm4gYm9hcmQtPmlzQW1jOworCisJREIobXZPc1ByaW50ZigiJXM6IEVycm9yOiBib2FyZCBzdHJ1Y3R1cmUgbm90IGluaXRpYWxpemVkXG4iLCBfX2Z1bmNfXykpOworCXJldHVybiBNVl9GQUxTRTsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNVc2IzUG9ydERldmljZQorKiBERVNDUklQVElPTjogcmV0dXJuIHRydWUgVVNCMyBwb3J0IGlzIGluIGRldmljZSBtb2RlCisqCisqIElOUFVUOiAgcG9ydAkJLSBwb3J0IG51bWJlcgorKiBPVVRQVVQ6IE5vbmUuCisqIFJFVFVSTjogTVZfVFJVRTogaWYgcG9ydCBpcyBzZXQgdG8gZGV2aWNlIG1vZGUKKyogICAgICAgICBNVl9GQUxTRTogb3RoZXJ3aXNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkSXNVc2IzUG9ydERldmljZShNVl9VMzIgcG9ydCkKK3sKKwlNVl9VMzIgYm9hcmRJZCwgc2F0clJlYWRSZXN1bHQ7CisKKwlpZiAocG9ydCA8IDAgfHwgcG9ydCA+PSBNVl9VU0IzX01BWF9IT1NUX1BPUlRTKQorCQlyZXR1cm4gTVZfRkFMU0U7CisKKwlib2FyZElkID0gbXZCb2FyZElkR2V0KCk7CisJLyogc2luY2UgJ3VzYjNwb3J0MCcgYW5kICd1c2IzcG9ydDEnIGFyZSBvbmx5IHN1cHBvcnRlZCBvbgorCSAqIERCLUJQIGFuZCBEQi02ODIxLUJQLCByZXR1cm4gTVZfRkFMU0UgaWYgd2UgYXJlIG5vdCBvbiB0aGVzZSBib2FyZHMgKi8KKwlpZiAoIShib2FyZElkID09IERCXzY4WFhfSUQgfHwgYm9hcmRJZCA9PSBEQl9CUF82ODIxX0lEKSkKKwkJcmV0dXJuIE1WX0ZBTFNFOworCisJc2F0clJlYWRSZXN1bHQgPSBtdkJvYXJkU2F0UlJlYWQoKE1WX1UzMilNVl9TQVRSX0RCX1VTQjNfUE9SVDAgKyBwb3J0KTsKKwlpZiAoc2F0clJlYWRSZXN1bHQgIT0gTVZfRVJST1IgJiYgc2F0clJlYWRSZXN1bHQpCisJCXJldHVybiBNVl9UUlVFOworCisJcmV0dXJuIE1WX0ZBTFNFOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkSXNQb3J0SW5TZ21paSAtCiAqCkBAIC0zMjgsOCArMzc4LDYgQEAKIAogCQlpZiAoKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfREIzODFfTU1DXzhCSVRfT05fQk9BUkQpKSkKIAkJCW12Qm9hcmRTZGlvQ29ubmVjdGlvblNldChNVl9UUlVFKTsKLQkJZWxzZQotCQkJbXZCb2FyZFNkaW9Db25uZWN0aW9uU2V0KE1WX0ZBTFNFKTsKIAogCQltdkJvYXJkSW9FeHBhbmRlclVwZGF0ZSgpOwogCQltdkJvYXJkUGNpZU1vZHVsZXNJbmZvVXBkYXRlKCk7CS8qIGlmIFBDSWUgbW9kdWxlcyBhcmUgY29uZmlndXJlZCAodmlhICdTYXRSJykgKi8KQEAgLTM1Myw2ICs0MDEsMjUgQEAKIAkJaWYgKChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoTVZfTU9EVUxFX01JSSkpKQkvKiBNSUkgTW9kdWxlIHVzZXMgZGlmZmVyZW50IFBIWSBhZGRyZXNzICovCiAJCQltdkJvYXJkUGh5QWRkclNldCgwLCA4KTsJLypzZXQgU01JIGFkZHJlc3MgOCBmb3IgcG9ydCAwKi8KIAorCQlpZiAobXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9TUERJRl9ERVZJQ0UpIHx8CisJCQkJbXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9JMlNfREVWSUNFKSkgeworCQkJLyogVERNLCBBdWRpbyBhbmQgU2RpbyBoYXZlIG1wcCdzIGNvbmZsaWN0CisJCQkgKiAtLT4gZGlzYWJsZSBTZGlvIGFuZCBURE0gd2hlbiBTUERJRiBpcyBjb25uZWN0ZWQgKi8KKwkJCW12Qm9hcmRBdWRpb0Nvbm5lY3Rpb25TZXQoTVZfVFJVRSk7CisJCQltdkJvYXJkU2Rpb0Nvbm5lY3Rpb25TZXQoTVZfRkFMU0UpOworCQkJbXZCb2FyZFRkbUNvbm5lY3Rpb25TZXQoTVZfRkFMU0UpOworCQl9IGVsc2UgaWYgKG12Qm9hcmRTYXRSUmVhZChNVl9TQVRSX1RETV9DT05ORUNURUQpID09IDApIHsKKwkJCS8qIGlmIEF1ZGlvIG1vZHVsZXMgZGV0ZWN0ZWQsIHNraXAgcmVhZGluZyBURE0gZnJvbSBTYXRSICovCisKKwkJCS8qIFRETSwgQXVkaW8gYW5kIFNkaW8gaGF2ZSBtcHAncyBjb25mbGljdAorCQkJICogLS0+IGRpc2FibGUgQXVkaW8gYW5kIFNkaW8gd2hlbiBURE0gaXMgY29ubmVjdGVkICovCisJCQltdkJvYXJkVGRtQ29ubmVjdGlvblNldChNVl9UUlVFKTsKKwkJCW12Qm9hcmRBdWRpb0Nvbm5lY3Rpb25TZXQoTVZfRkFMU0UpOworCQkJbXZCb2FyZFNkaW9Db25uZWN0aW9uU2V0KE1WX0ZBTFNFKTsKKwkJCS8qIHVwZGF0ZSBEVDogdXNlZCBmb3IgTGludXggb25seSAqLworCQkJbXZCb2FyZFNldERldlN0YXRlKDEsIEJPQVJEX0RFVl9TUElfRkxBU0gsIE1WX1RSVUUpOworCQl9CisKIAkJLyogVXBkYXRlIE1QUCBncm91cCB0eXBlcyBhbmQgdmFsdWVzIGFjY29yZGluZyB0byBib2FyZCBjb25maWd1cmF0aW9uICovCiAJCW12Qm9hcmRNcHBJZFVwZGF0ZSgpOwogCQkvKiBib2FyZCBvbiB0ZXN0IG1vZGUgICovCkBAIC0zNjYsNiArNDMzLDggQEAKIAogCQltdkJvYXJkUGNpZU1vZHVsZXNJbmZvVXBkYXRlKCk7CS8qIGlmIFBDSWUgbW9kdWxlcyBhcmUgY29uZmlndXJlZCAodmlhICdTYXRSJykgKi8KIAkJbXZCb2FyZEZsYXNoRGV2aWNlVXBkYXRlKCk7CisJCW12Qm9hcmRNb2R1bGVTd2l0Y2hJbmZvVXBkYXRlKG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfU1dJVENIKSk7CisJCW12Qm9hcmRJb0V4cGFuZGVyVXBkYXRlKCk7CiAJCWJyZWFrOwogCWNhc2UgREJfQU1DXzY4MjBfSUQ6CiAJCS8qIG5vdGhpbmcgdG8gYmUgdXBkYXRlZCBhdCBydW4tdGltZSBmb3IgQU1DIGJvYXJkICovCkBAIC00MjUsMTIgKzQ5NCwxMyBAQAogCQkiU0RJTyA0Yml0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCSJTR01JSSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkiREItMzgxIFNMTS0xNDI2IChTR01JSS0yKSIsICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkiU1dJVENIIiwJCQlcCiAJfTsKIAltdk9zT3V0cHV0KCJCb2FyZCBjb25maWd1cmF0aW9uIGRldGVjdGVkOlxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVZfTU9EVUxFX1RZUEVfTUFYX01PRFVMRTsgaSsrKSB7CiAJCWlmIChtdkJvYXJkSXNNb2R1bGVDb25uZWN0ZWQoMSA8PCBpKSkKIAkJCW12T3NPdXRwdXQoIiAgICAgICAlcyBtb2R1bGUuXG4iLCBtb2R1bGVTdHJbaV0pOwotCiAJfQogfQorCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzh4LmgKaW5kZXggZjIyMDY3Yi4uYWI4YjQyMCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM4eC5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOHguaApAQCAtNzksNiArNzksNyBAQAogCU1WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkOwogCU1WXzMyIGJvYXJkRXRoU21pQWRkcjsKIAlNVl8zMiBib2FyZEV0aFNtaUFkZHIwOworCU1WX0JPT0wgYm9hcmRNYWNFbmFibGVkOwogfSBNVl9CT0FSRF9NQUNfSU5GTzsKIAogZW51bSB7CkBAIC05OSw2ICsxMDAsNyBAQAogeyBNVl9NT0RVTEVfU0RJTywJCTB4NCwJMCwJIDB4MiwJeyAwLCAxLCAwLCAwLCAwLCAwLCAwfSB9LCBcCiB7IE1WX01PRFVMRV9TR01JSSwJCTB4MiwJMCwJIDB4RiwJeyAwLCAxLCAwLCAwLCAwLCAwLCAwfSB9LCBcCiB7IE1WX01PRFVMRV9EQjM4MV9TR01JSSwJMHgwLAkwLAkgMHgyLAl7IDAsIDAsIDAsIDAsIDAsIDEsIDB9IH0sIFwKK3sgTVZfTU9EVUxFX1NXSVRDSCwJCTB4NSwJMCwJIDB4RSwJeyAwLCAxLCAwLCAwLCAwLCAwLCAwfSB9LCBcCiB9OwogCiB0eXBlZGVmIGVudW0gX212U2F0UlR5cGVJRCB7CkBAIC0xMjgsNiArMTMwLDExIEBACiAJTVZfU0FUUl9ERVZJQ0VfSUQyLAogCU1WX1NBVFJfR1BfU0VSREVTMV9DRkcsCiAJTVZfU0FUUl9HUF9TRVJERVMyX0NGRywKKwlNVl9TQVRSX0ZVTExfRkxBVk9SLAorCU1WX1NBVFJfVERNX0NPTk5FQ1RFRCwKKwlNVl9TQVRSX1RETV9QTEFDRV9IT0xERVIsCisJTVZfU0FUUl9CT0FSRF9TUEVFRCwKKwlNVl9TQVRSX0FWU19TS0lQLAogCU1WX1NBVFJfTUFYX09QVElPTiwKIH0gTVZfU0FUUl9UWVBFX0lEOwogCkBAIC0xNDIsNyArMTQ5LDcgQEAKIHsiZGRyYnVzd2lkdGgiLAlNVl9TQVRSX0REUl9CVVNfV0lEVEgsCQkweDA4LAkzLAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMCwgMX0sIDB9LFwKIHsiZGRyZWNjZW5hYmxlIiwJTVZfU0FUUl9ERFJfRUNDX0VOQUJMRSwJMHgxMCwJNCwJMCwJMCwJezEsIDEsIDEsIDEsIDEsIDEsIDF9LCAwfSxcCiB7ImRkcmVjY3B1cHNlbGVjdCIsCU1WX1NBVFJfRERSX0VDQ19QVVBfU0VMLCAweDIwLAk1LAkwLAkwLAl7MCwgMSwgMCwgMCwgMCwgMCwgMX0sIDB9LFwKLXsic2dtaWlzcGVlZCIsIE1WX1NBVFJfU0dNSUlfU1BFRUQsCQkweDQwLAk2LAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMSwgMX0sIDB9LFwKK3sic2dtaWlzcGVlZCIsIE1WX1NBVFJfU0dNSUlfU1BFRUQsCQkweDQwLAk2LAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMSwgMH0sIDB9LFwKIHsiYm9vdHNyYyIsCU1WX1NBVFJfQk9PVF9ERVZJQ0UsCQkweDMsCTAsCTMsCTAsCXswLCAxLCAwLCAwLCAwLCAxLCAwfSwgU0FUUl9TV0FQX0JJVH0sXAogeyJib2Fyc3JjMiIsCU1WX1NBVFJfQk9PVDJfREVWSUNFLAkJMHgxRSwJMSwJMiwJMCwJezAsIDEsIDAsIDAsIDAsIDEsIDB9LCBTQVRSX1NXQVBfQklUfSxcCiB7ImJvYXJkaWQiLAlNVl9TQVRSX0JPQVJEX0lELAkJMHg3LAkwLAkwLAkwLAl7MSwgMSwgMSwgMSwgMSwgMSwgMX0sIDB9LFwKQEAgLTE1OCw4ICsxNjUsMTYgQEAKIHsic2dtaWltb2RlIiwJTVZfU0FUUl9TR01JSV9NT0RFLAkJMHg0MCwJNiwJMCwJMSwJezAsIDEsIDAsIDAsIDEsIDEsIDF9LCAwfSxcCiB7ImRldmlkIiwJTVZfU0FUUl9ERVZJQ0VfSUQsCQkweDEsCTAsCTIsCTAsCXswLCAxLCAwLCAwLCAwLCAwLCAwfSwgMH0sXAogeyJkZXZpZDIiLAlNVl9TQVRSX0RFVklDRV9JRDIsCQkweDEwLAk0LAkzLAkwLAl7MCwgMSwgMCwgMCwgMCwgMCwgMH0sIDB9LFwKK3siZmxhdm9yIiwJTVZfU0FUUl9GVUxMX0ZMQVZPUiwJCTB4MTAsCTQsCTAsCTIsCXswLCAxLCAwLCAxLCAxLCAxLCAwfSwgMH0sXAoreyJ0ZG0iLAkJTVZfU0FUUl9URE1fQ09OTkVDVEVELAkJMHgyMCwJNSwJMCwJMiwJezAsIDEsIDAsIDAsIDAsIDAsIDB9LCAwfSxcCit7InRkbXBsYWNlaG9sZGVyIiwJTVZfU0FUUl9URE1fUExBQ0VfSE9MREVSLAkweDQwLAk2LAkwLAkyLAl7MCwgMCwgMCwgMCwgMCwgMCwgMH0sIDB9LFwKK3siYXZzc2tpcCIsCU1WX1NBVFJfQVZTX1NLSVAsCQkweDgwLAk3LAkwLAkyLAl7MCwgMSwgMCwgMSwgMSwgMSwgMX0sIDB9LFwKK3siYm9hcmRzcGVlZCIsCU1WX1NBVFJfQk9BUkRfU1BFRUQsCQkweDMsCTAsCTAsCTMsCXswLCAxLCAwLCAxLCAxLCAwLCAxfSwgU0FUUl9SRUFEX09OTFl9LFwKIHsibWF4X29wdGlvbiIsCU1WX1NBVFJfTUFYX09QVElPTiwJCTB4MCwJMCwJMCwJMCwJezAsIDAsIDAsIDAsIDAsIDAsIDB9LCAwfSxcCiB9OworLyogdGRtIHBsYWNlIGhvbGRlciBpcyB1c2VkIGZvciBmdXR1cmUgc3VwcG9ydCBmb3IgbXVsdGlwbGUgdGRtIGRldmljZXMgKi8KKy8qIGF2c3NraXAgaXMgdXNlZCB0byBza2lwIHNlbGVjdGluZyBBVlMgZnJvbSBFRlVTRToKKyAqCS0gdXNlZCBpbiBiaW5hcnkgaGVhZGVyIGJ5IE1hcnZlbGwgYm9hcmRzIG9ubHkqLwogCiAvKiBleHRyYSBTQVIgdGFibGUsIGZvciBkaWZmZXJlbnQgYm9hcmQgaW1wbGVtZW50YXRpb25zOgogICogaW4gY2FzZSBhIGZpZWxkIGlzIHVzZWQgb24gMiBib2FyZHMgd2l0aCBkaWZmZXJlbnQgaTJjIG1hcHBpbmcgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOXguYyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOXguYwppbmRleCAxOTI4ZWRmLi43ZGUxYWMxIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzl4LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM5eC5jCkBAIC02MjUsMyArNjI1LDE4IEBACiAJCQltdk9zT3V0cHV0KCJ8ICAgICBJbi1CYW5kICB8XG4iKTsKIAl9CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRJc1VzYjNQb3J0RGV2aWNlCisqIERFU0NSSVBUSU9OOiByZXR1cm4gdHJ1ZSBVU0IzIHBvcnQgaXMgaW4gZGV2aWNlIG1vZGUKKyoKKyogSU5QVVQ6ICBwb3J0CQktIHBvcnQgbnVtYmVyCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiBNVl9UUlVFOiBpZiBwb3J0IGlzIHNldCB0byBkZXZpY2UgbW9kZQorKiAgICAgICAgIE1WX0ZBTFNFOiBvdGhlcndpc2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1VzYjNQb3J0RGV2aWNlKE1WX1UzMiBwb3J0KQoreworCS8qIFNpbmNlIHVzYjMgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgb24gY3VycmVudCBib2FyZCByZXR1cm4gZmFsc2UgKi8KKwlyZXR1cm4gTVZfRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzl4LmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliMzl4LmgKaW5kZXggMTJkNDNlZi4uYTVhMmI5MCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYjM5eC5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIzOXguaApAQCAtODgsNiArODgsNyBAQAogCU1WXzMyIGJvYXJkRXRoU21pQWRkcjsKIAlNVl8zMiBib2FyZEV0aFNtaUFkZHIwOwogCU1WX1BIWV9ORUdPVElBVElPTl9QT1JUX1RZUEUgbmVnVHlwZTsKKwlNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDsKIH0gTVZfQk9BUkRfTUFDX0lORk87CiAKIHR5cGVkZWYgZW51bSB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaAppbmRleCA0NWRlOWI0Li5hNjkyMGE1IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKQEAgLTgzLDggKzgzLDkgQEAKICNkZWZpbmUgQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UJCTB4MAogI2RlZmluZSBBMzhYX0NVU1RPTUVSX0JPQVJEX0lEMAkJCShBMzhYX0NVVE9NRVJfQk9BUkRfSURfQkFTRSArIDApCiAjZGVmaW5lIEEzOFhfQ1VTVE9NRVJfQk9BUkRfSUQxCQkJKEEzOFhfQ1VUT01FUl9CT0FSRF9JRF9CQVNFICsgMSkKLSNkZWZpbmUgQTM4WF9HRkNIMTAwX0lECQkJCShBMzhYX0NVVE9NRVJfQk9BUkRfSURfQkFTRSArIDIpCi0jZGVmaW5lIEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lECQkoQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UgKyAzKQorI2RlZmluZSBBMzhYX0NMRUFSRk9HX0JPQVJEX0lECQkJKEEzOFhfQ1VUT01FUl9CT0FSRF9JRF9CQVNFICsgMikKKyNkZWZpbmUgQTM4WF9HRkNIMTAwX0lECQkJCShBMzhYX0NVVE9NRVJfQk9BUkRfSURfQkFTRSArIDMpCisjZGVmaW5lIEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lECQkoQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UgKyA0KQogI2RlZmluZSBBMzhYX01WX0NVU1RPTUVSX0JPQVJEX05VTQkJKEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lEIC0gQTM4WF9DVVRPTUVSX0JPQVJEX0lEX0JBU0UpCiAKIC8qIEFybWFkYS0zOHggTWFydmVsbCBib2FyZHMgKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYzM4eC5jCmluZGV4IGZjNTM0ZjcuLmE1ZTFlNGQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzh4LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOHguYwpAQCAtNjYsNiArNjYsNyBAQAogI2luY2x1ZGUgImJvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgiCiAjaW5jbHVkZSAidHdzaS9tdlR3c2kuaCIKICNpbmNsdWRlICJwZXgvbXZQZXhSZWdzLmgiCisjaW5jbHVkZSAiZ3BwL212R3BwUmVncy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3VzdG9tZXIgQm9hcmRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTgxLDE1ICs4MiwxNyBAQAogCiBNVl9CT0FSRF9UV1NJX0lORk8gYXJtYWRhXzM4eF9jdXN0b21lcl8wX0JvYXJkVHdzaURldltdID0gewogCS8qIHt7TVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzLCBNVl9VOCBkZXZDbGFzc0lkLCAgTVZfVTggdHdzaURldkFkZHIsIE1WX1U4IHR3c2lEZXZBZGRyVHlwZX19ICovCi0JeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkwLAkweDU3LCBBRERSN19CSVQsIE1WX1RSVUV9LCAgLyogcmVhZCBvbmx5IGZvciBIVyBjb25maWd1cmF0aW9uICovCi0JeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkxLAkweDRDLCBBRERSN19CSVQsIE1WX0ZBTFNFfSwKLQl7IEJPQVJEX1RXU0lfSU9fRVhQQU5ERVIsCTAsCTB4MjAsIEFERFI3X0JJVCwgTVZfRkFMU0V9LAotCXsgQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwJMSwJMHgyMSwgQUREUjdfQklULCBNVl9GQUxTRX0sCisJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMCwJMHg1NywJQUREUjdfQklULCBNVl9UUlVFfSwgIC8qIHJlYWQgb25seSBmb3IgSFcgY29uZmlndXJhdGlvbiAqLworCXsgQk9BUkRfREVWX1RXU0lfU0FUUiwJCTEsCTB4NEMsCUFERFI3X0JJVCwgTVZfRkFMU0V9LAorCXsgQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwJMCwJMHgyMSwJQUREUjdfQklULCBNVl9GQUxTRX0sCiB9OworCiBNVl9CT0FSRF9NQUNfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwKKwkgICBNVl8zMiBib2FyZEV0aFNtaUFkZHIwICwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9GQUxTRX0sCiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfQm9hcmREZUNzSW5mb1tdID0gewpAQCAtMTIzLDE2ICsxMjYsMzIgQEAKIH07CiAKIHN0cnVjdCBNVl9CT0FSRF9JT19FWFBBTkRFUiBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfSW9FeHBhbmRlckluZm9bXSA9IHsKLQl7MCwgNiwgMHhGNH0sIC8qIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzOiBCaXQgb24gLS0+IElucHV0IGJpdHMgICovCi0JezAsIDcsIDB4QzN9LCAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczogQml0IG9uIC0tPiBJbnB1dCBiaXRzICAqLwotCXswLCAyLCAweDBCfSwgLyogT3V0cHV0IERhdGEsIHJlZ2lzdGVyIzAgKi8KLQl7MCwgMywgMHgxOH0sIC8qIE91dHB1dCBEYXRhLCByZWdpc3RlciMxICovCi0JezEsIDYsIDB4RTd9LCAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczogQml0IG9uIC0tPiBJbnB1dCBiaXRzICAqLwotCXsxLCA3LCAweEY5fSwgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlcnM6IEJpdCBvbiAtLT4gSW5wdXQgYml0cyAgKi8KLQl7MSwgMiwgMHgwOH0sIC8qIE91dHB1dCBEYXRhLCByZWdpc3RlciMwICovCi0JezEsIDMsIDB4MDB9ICAvKiBPdXRwdXQgRGF0YSwgcmVnaXN0ZXIjMSAqLworCXswLCA2LCAweEZGfSwgLyogQ29uZmlnIHJlZyMwOiBhbGwgYml0cyBhcyBpbnB1dCAoQklUIG9uID0gSW5wdXQpICovCisJezAsIDcsIDB4RkN9LCAvKiBDb25maWcgcmVnIzE6IEJJVDAoVVNCMy4wIGN1cnJlbnQgbGltaXQpLCBCSVQxKFVTQjMuMSBjdXJyZW50IGxpbWl0KSovCisJezAsIDIsIDB4RkZ9LCAvKiBPdXRwdXQgRGF0YSwgcmVnIzAgIC0gbm8gb3V0cHV0IGJpdHMqLworCXswLCAzLCAweEZGfSwgLyogT3V0cHV0IERhdGEsIHJlZyMxOiAgQklUMCxVU0IzLjBfQ1VSUkVOVD0xLCBCSVQxLFVTQjMuMV9DVVJSRU5UPTEgKi8KIH07CiAKK01WX0JPQVJEX0dQUF9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfMF9HcHBJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9HUFBfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CWdwcFBpbk51bX19ICovCisvKiBVU0JfSG9zdDAgKi8gLyoge0JPQVJEX0dQUF9VU0JfVkJVUywgICAgNDR9LCAqLyAvKiBmcm9tIE1QUCBtYXAgKi8KK307CisKK01WX0JPQVJEX1VTQl9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfMF9JbmZvQm9hcmRVc2JJbmZvW10gPSB7CisvKiB7TVZfVU5JVF9JRCB1c2JUeXBlLCBNVl9VOCB1c2JQb3J0TnVtLCBNVl9CT09MRUFOIGlzQWN0aXZlfSAqLworCXsgVVNCM19VTklUX0lELCAwLCBNVl9UUlVFfSwKKwl7IFVTQjNfVU5JVF9JRCwgMSwgTVZfVFJVRX0sCisJeyBVU0JfVU5JVF9JRCwgMCwgTVZfVFJVRX0sCit9OworCisvKiBncHBfY2FsbGJhY2sgaXMgYSBnZW5lcmljIHBsYWNlIGhvbGRlciByb3V0aW5lIGZvciBzcGVjaWFsIEdQSU8gcHVsbC11cC9zb3duIHNlcXVlbmNlCisgKiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGFzIHRoZSBmaW5hbCBzdGVwIG9mIG12Qm9hcmRFbnZJbml0IGZsb3cKKyAqIGZvciBleGFtcGxlIHNlZSBpbXBsZW1lbnRhdGlvbiBmb3IgU29saWRSdW4ncyBjbGVhckZvZyBib2FyZDogQTM4eF9DTEVBUkZPR19CT0FSRF9ncHBfY2FsbGJhY2sqLwordm9pZCBBMzh4X0NVU1RPTUVSX0JPQVJEXzBfZ3BwX2NhbGxiYWNrKE1WX0JPQVJEX0lORk8gKmJvYXJkKSB7CisKKwkvKiBpbXBsZW1lbnQgc3BlY2lhbCBHUElPL01QUCBwb3N0IGNvbmZpZ3VyYXRpb24gaGVyZSAqLworfQorCiBNVl9CT0FSRF9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfYm9hcmRfMF9pbmZvID0gewogCS5ib2FyZE5hbWUJCQk9ICJBMzh4LUN1c3RvbWVyLUJvYXJkLTAiLAogCS5udW1Cb2FyZE5ldENvbXBsZXhWYWx1ZQkJPSAwLApAQCAtMTQ3LDggKzE2NiwxMCBAQAogCS5wQm9hcmRUd3NpRGV2CQkJPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfQm9hcmRUd3NpRGV2LAogCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0JvYXJkTWFjSW5mbyksCiAJLnBCb2FyZE1hY0luZm8JCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMF9Cb2FyZE1hY0luZm8sCi0JLm51bUJvYXJkR3BwSW5mbwkJPSAwLAotCS5wQm9hcmRHcHBJbmZvCQkJPSAwLAorCS5udW1Cb2FyZEdwcEluZm8JCT0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0dwcEluZm8pLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfR3BwSW5mbywKKwkubnVtQm9hcmRJb0V4cFBpbkluZm8JCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCQk9IDAsCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKIAkucExlZEdwcFBpbgkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLApAQCAtMTY0LDEyICsxODUsMTYgQEAKIAkuZ3BwT3V0VmFsTWlkCQkJPSBBMzh4X0NVU1RPTUVSX0JPQVJEXzBfR1BQX09VVF9WQUxfTUlELAogCS5ncHBQb2xhcml0eVZhbExvdwkJPSBBMzh4X0NVU1RPTUVSX0JPQVJEXzBfR1BQX1BPTF9MT1csCiAJLmdwcFBvbGFyaXR5VmFsTWlkCQk9IEEzOHhfQ1VTVE9NRVJfQk9BUkRfMF9HUFBfUE9MX01JRCwKKwkuZ3BwUG9zdENvbmZpZ0NhbGxCYWNrCQk9IEEzOHhfQ1VTVE9NRVJfQk9BUkRfMF9ncHBfY2FsbGJhY2ssCiAKIAkvKiBURE0gKi8KIAkubnVtQm9hcmRUZG1JbmZvCQk9IHt9LAogCS5wQm9hcmRUZG1JbnQyQ3NJbmZvCQk9IHt9LAogCS5ib2FyZFRkbUluZm9JbmRleAkJPSAtMSwKIAorCS5wQm9hcmRVc2JJbmZvICAgICAgICAgICAgICAgICAgPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzBfSW5mb0JvYXJkVXNiSW5mbywKKwkubnVtQm9hcmRVc2JJbmZvICAgICAgICAgICAgICAgID0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0luZm9Cb2FyZFVzYkluZm8pLAorCiAJLnBCb2FyZFNwZWNJbml0CQkJPSBOVUxMLAogCiAJLyogTkFORCBpbml0IHBhcmFtcyAqLwpAQCAtMTg3LDcgKzIxMiwxMCBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX0ZBTFNFLAogCS5udW1Jb0V4cAkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jdXN0b21lcl8wX0lvRXhwYW5kZXJJbmZvKSwKIAkucElvRXhwCQkJCT0gYXJtYWRhXzM4eF9jdXN0b21lcl8wX0lvRXhwYW5kZXJJbmZvLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQkJPSBNVl9GQUxTRSwKKwkucFN3aXRjaEluZm8JCQk9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0JCQk9IDAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMDIsMTAgKzIzMCwxMSBAQAogCXsgQk9BUkRfVFdTSV9JT19FWFBBTkRFUiwJMSwJMHgyMSwgQUREUjdfQklULCBNVl9GQUxTRX0sCiB9OwogTVZfQk9BUkRfTUFDX0lORk8gYXJtYWRhXzM4eF9jdXN0b21lcl8xX0JvYXJkTWFjSW5mb1tdID0gewotCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sICAtMSwgIC0xfQorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCAsIE1WX0JPT0wgYm9hcmRNYWNFbmFibGVkO319ICovCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAgLTEsICAtMSwgTVZfVFJVRX0KIH07CiAKIE1WX0RFVl9DU19JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfMV9Cb2FyZERlQ3NJbmZvW10gPSB7CkBAIC0yNDksNiArMjc4LDI0IEBACiAJezEsIDMsIDB4QzB9ICAvKiBPdXRwdXQgRGF0YSwgcmVnaXN0ZXIjMSAqLwogfTsKIAorCitNVl9CT0FSRF9HUFBfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfR3BwSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfR1BQX0NMQVNTCWRldkNsYXNzLCBNVl9VOAlncHBQaW5OdW19fSAqLworLyogVVNCX0hvc3QwICovLyogLy97Qk9BUkRfR1BQX1VTQl9WQlVTLCAgICA0NH0sKi8gLyogZnJvbSBNUFAgbWFwICovCit9OworCitNVl9CT0FSRF9VU0JfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW5mb0JvYXJkVXNiSW5mb1tdID0geworLyoge01WX1VOSVRfSUQgdXNiVHlwZSwgTVZfVTggdXNiUG9ydE51bSwgTVZfQk9PTCBpc0FjdGl2ZX0gKi8KKwl7IFVTQjNfVU5JVF9JRCwgMCwgTVZfVFJVRX0sCisJeyBVU0IzX1VOSVRfSUQsIDEsIE1WX1RSVUV9LCAgICAvKiB4SENJIHBvcnQjMSBjb25uZWN0ZWQgb25seSB2aWEgVVNCMi4wIFVUTUkgKG5vdCB2aWEgVVNCMy4wIFNlckRlcyBsYW5lKSAqLworCXsgVVNCX1VOSVRfSUQsICAwLCBNVl9UUlVFfSwKK307CisKK01WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTyBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfaW9FeHBQaW5JbmZvW10gPSB7CisvKgl7IElPIFR5cGUgZW51bSwJCQliaXQgb2Zmc2V0LCBJby5leHAgbnVtLAkJcmVnIE51bSAqLworCXsgTVZfSU9fRVhQQU5ERVJfVVNCX1ZCVVMsCTcsCQkxLAkJM30gLyogVkJVU19FTjogSU8uZXhwIzEgKDB4MjEpLCByZWcgIzMsIGJpdCA3ICovCit9OworCiBNVl9CT0FSRF9JTkZPIGFybWFkYV8zOHhfY3VzdG9tZXJfYm9hcmRfMV9pbmZvID0gewogCS5ib2FyZE5hbWUJCQk9ICJBMzh4LUN1c3RvbWVyLUJvYXJkLTEiLAogCS5udW1Cb2FyZE5ldENvbXBsZXhWYWx1ZQk9IDAsCkBAIC0yNjMsOCArMzEwLDEwIEBACiAJLnBCb2FyZFR3c2lEZXYJCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMV9Cb2FyZFR3c2lEZXYsCiAJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfQm9hcmRNYWNJbmZvKSwKIAkucEJvYXJkTWFjSW5mbwkJCT0gYXJtYWRhXzM4eF9jdXN0b21lcl8xX0JvYXJkTWFjSW5mbywKLQkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCi0JLnBCb2FyZEdwcEluZm8JCQk9IDAsCisJLm51bUJvYXJkR3BwSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfR3BwSW5mbyksCisJLnBCb2FyZEdwcEluZm8JCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMV9HcHBJbmZvLAorCS5udW1Cb2FyZElvRXhwUGluSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfaW9FeHBQaW5JbmZvKSwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCQk9IGFybWFkYV8zOHhfY3VzdG9tZXJfMV9pb0V4cFBpbkluZm8sCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKIAkucExlZEdwcFBpbgkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLApAQCAtMjg4LDYgKzMzNyw5IEBACiAKIAkucEJvYXJkU3BlY0luaXQJCQk9IE5VTEwsCiAKKwkucEJvYXJkVXNiSW5mbwkJCT0gYXJtYWRhXzM4eF9jdXN0b21lcl8xX0luZm9Cb2FyZFVzYkluZm8sCisJLm51bUJvYXJkVXNiSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW5mb0JvYXJkVXNiSW5mbyksCisKIAkvKiBOQU5EIGluaXQgcGFyYW1zICovCiAJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gQTM4eF9DVVNUT01FUl9CT0FSRF8wX05BTkRfUkVBRF9QQVJBTVMsCiAJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IEEzOHhfQ1VTVE9NRVJfQk9BUkRfMF9OQU5EX1dSSVRFX1BBUkFNUywKQEAgLTMwMyw3ICszNTUsMTcyIEBACiAJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfRkFMU0UsCiAJLm51bUlvRXhwCQkJPSBBUlJTWihhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW9FeHBhbmRlckluZm8pLAogCS5wSW9FeHAJCQkJPSBhcm1hZGFfMzh4X2N1c3RvbWVyXzFfSW9FeHBhbmRlckluZm8sCi0JLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFCisJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEEzOHggU29saWRSdW4gQ2xlYXJGb2cKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9BUkRfVFdTSV9JTkZPIGFybWFkYV8zOHhfY2xlYXJmb2dfQm9hcmRUd3NpRGV2W10gPSB7CisJLyoge3tNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MsIE1WX1U4IGRldkNsYXNzSWQsICBNVl9VOCB0d3NpRGV2QWRkciwgTVZfVTggdHdzaURldkFkZHJUeXBlfX0gKi8KKwl7IEJPQVJEX1RXU0lfSU9fRVhQQU5ERVIsCTAsCTB4MjAsIEFERFI3X0JJVCwgTVZfRkFMU0V9LAorfTsKK01WX0JPQVJEX01BQ19JTkZPIGFybWFkYV8zOHhfY2xlYXJmb2dfQm9hcmRNYWNJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwKKwkgICBNVl8zMiBib2FyZEV0aFNtaUFkZHIwICwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfMTAwME0sIC0xLCAtMSwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgIC0xLCAgLTEsIE1WX1RSVUV9Cit9OworCitNVl9ERVZfQ1NfSU5GTyBhcm1hZGFfMzh4X2NsZWFyZm9nX0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLworCXsgREVWSUNFX0NTMCwJTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwJOCwJOCwJMCwJTVZfRkFMU0UgfSwJLyogTkFORCBERVYgKi8KKwl7IERFVklDRV9DUzEsCU5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsCTgsCTgsCTAsCU1WX0ZBTFNFIH0sCS8qIE5BTkQgREVWICovCisJeyBERVZJQ0VfQ1MyLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBOQU5EIERFViAqLworCXsgREVWSUNFX0NTMywJTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwJOCwJOCwJMCwJTVZfRkFMU0UgfSwJLyogTkFORCBERVYgKi8KKwl7IERFVl9CT09DUywJTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILAkxNiwJMTYsCTAsCU1WX0ZBTFNFIH0sCS8qIE5PUiBERVYgKi8KKwl7IFNQSTBfQ1MwLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLworCXsgU1BJMF9DUzEsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX0ZBTFNFIH0sCS8qIFNQSTAgREVWICovCisJeyBTUEkwX0NTMiwJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMCwJTVZfRkFMU0UgfSwJLyogU1BJMCBERVYgKi8KKwl7IFNQSTBfQ1MzLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLworCXsgU1BJMV9DUzAsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTEsCU1WX1RSVUUgfSwJLyogU1BJMSBERVYgKi8KKwl7IFNQSTFfQ1MxLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkxLAlNVl9GQUxTRSB9LAkvKiBTUEkxIERFViAqLworCXsgU1BJMV9DUzIsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTEsCU1WX0ZBTFNFIH0sCS8qIFNQSTEgREVWICovCisJeyBTUEkxX0NTMywJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMSwJTVZfRkFMU0UgfQkvKiBTUEkxIERFViAqLworfTsKKworTVZfQk9BUkRfTVBQX0lORk8gYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZE1wcENvbmZpZ1ZhbHVlW10gPSB7CisJeyB7CisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMF83LAorCQlBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDhfMTUsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMTZfMjMsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMjRfMzEsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMzJfMzksCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNDBfNDcsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNDhfNTUsCisJCUEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNTZfNjMsCisJfSB9Cit9OworCitzdHJ1Y3QgTVZfQk9BUkRfSU9fRVhQQU5ERVIgYXJtYWRhXzM4eF9jbGVhcmZvZ19Jb0V4cGFuZGVySW5mb1tdID0geworCXswLCAyLCAweDQwfSwgLyogRGVhc3NlcnQgYm90aCBtaW5pIHBjaWUgcmVzZXQgc2lnbmFscyAqLworCXswLCA2LCAweGY5fSwKKwl7MCwgMiwgMHg0Nn0sIC8qIEFzc2VydCByZXNldCBzaWduYWxzIGFuZCBlbmFibGUgVVNCMyBjdXJyZW50IGxpbWl0ZXIgKi8KKwl7MCwgNiwgMHhiOX0sCisJezAsIDMsIDB4MH0sIC8qIFNldCBTRlBfVFhfRElTIHRvIHplcm8gKi8KKwl7MCwgNywgMHhiZn0sIC8qIERyaXZlIFNGUF9UWF9ESVMgdG8gemVybyAqLworfTsKKworTVZfQk9BUkRfVVNCX0lORk8gYXJtYWRhXzM4eF9jbGVhcmZvZ19JbmZvQm9hcmRVc2JJbmZvW10gPSB7CisvKiB7TVZfVU5JVF9JRCB1c2JUeXBlLCBNVl9VOCB1c2JQb3J0TnVtLCBNVl9CT09MIGlzQWN0aXZlfSAqLworCXsgVVNCM19VTklUX0lELCAwLCBNVl9UUlVFfSwKKwl7IFVTQjNfVU5JVF9JRCwgMSwgTVZfVFJVRX0sICAgIC8qIHhIQ0kgcG9ydCMxIGNvbm5lY3RlZCBvbmx5IHZpYSBVU0IyLjAgVVRNSSAobm90IHZpYSBVU0IzLjAgU2VyRGVzIGxhbmUpICovCisJeyBVU0JfVU5JVF9JRCwgIDAsIE1WX1RSVUV9LAorfTsKKworc3RydWN0IE1WX0JPQVJEX1NXSVRDSF9JTkZPIGFybWFkYV8zOHhfY2xlYXJmb2dfSW5mb1N3aXRjaEluZm9bXSA9IHsKKwl7CisJCS5pc0VuYWJsZWQgPSBNVl9UUlVFLAorCQkuaXNDcHVQb3J0UmdtaWkgPSBNVl9GQUxTRSwKKwkJLnN3aXRjaElycSA9IC0xLAkvKiBzZXQgdG8gLTEgZm9yIHVzaW5nIFBQVSovCisJCS5zd2l0Y2hQb3J0ID0gezAsIDEsIDIsIDMsIDQsIDUsIDZ9LAorCQkuY3B1UG9ydCA9IDUsCisJCS5jb25uZWN0ZWRQb3J0ID0gey0xLCA1LCAtMX0sCisJCS5zbWlTY2FuTW9kZSA9IE1WX1NXSVRDSF9TTUlfTVVMVElfQUREUl9NT0RFLAorCQkucXVhZFBoeUFkZHIgPSA0LAorCQkuZm9yY2VMaW5rTWFzayA9IDB4NjAKKwl9Cit9OworCitNVl9CT0FSRF9JT19FWFBBTkRFUl9UWVBFX0lORk8gYXJtYWRhXzM4eF9jbGVhcmZvZ19pb0V4cFBpbkluZm9bXSA9IHsKKy8qCXsgSU8gVHlwZSBlbnVtLAkJCWJpdCBvZmZzZXQsIElvLmV4cCBudW0sCQlyZWcgTnVtICovCisJeyBNVl9JT19FWFBBTkRFUl9VU0JfVkJVUywJNiwJCTAsCQkyfSAvKiBWQlVTX0VOOiBJTy5leHAjMSAoMHgyMSksIHJlZyAjMywgYml0IDcgKi8KK307CisKK3ZvaWQgQTM4eF9DTEVBUkZPR19CT0FSRF9ncHBfY2FsbGJhY2soTVZfQk9BUkRfSU5GTyAqYm9hcmQpIHsKKwkvKiBUb2dnbGUgR1BJTzQxIHRvIHJlc2V0IG9uLWJvYXJkIHN3aXRjaCBhbmQgcGh5ICovCisJLyogU2V0IEdQSU80MSBhcyBvdXRwdXQgZW5hYmxlZCAqLworCU1WX1JFR19CSVRfUkVTRVQgKEdQUF9EQVRBX09VVF9SRUcoMSksIEJJVDkpOworCS8qIHJlc2V0IG91dHB1dCB2YWx1ZSAqLworCU1WX1JFR19CSVRfUkVTRVQgKEdQUF9EQVRBX09VVF9FTl9SRUcoMSksIEJJVDkpOworCS8qIHNldCBvdXRwdXQgdmFsdWUgKi8KKwltdk9zRGVsYXkoMSk7CisJTVZfUkVHX0JJVF9TRVQgKEdQUF9EQVRBX09VVF9FTl9SRUcoMSksIEJJVDkpOworCW12T3NEZWxheSgxMCk7CisKKwkvKiB1cGRhdGUgb24tQm9hcmQgSU8gZXhwYW5kZXIgd2l0aCBwcmUtZGVmaW5lZCB2YWx1ZXM6CisJICogVVNCMyBjdXJyZW50IGxpbWl0ZXIsIGFuZCBTRlBfVFhfRElTLCBEZWFzc2VydCBhbmQgYXNzZXJ0IDIqbWluaSBQQ0llIHJlc2V0IHNpZ25hbHMsICovCisJbXZCb2FyZElvRXhwYW5kZXJVcGRhdGUoKTsKK30KKworTVZfQk9BUkRfSU5GTyBhcm1hZGFfMzh4X2NsZWFyZm9nX2JvYXJkX2luZm8gPSB7CisJLmJvYXJkTmFtZQkJCQk9ICJTb2xpZFJ1biBDbGVhckZvZy1BMSBSRVYyLjAiLAorCS5udW1Cb2FyZE5ldENvbXBsZXhWYWx1ZQkJPSAwLAorCS5wQm9hcmROZXRDb21wbGV4SW5mbwkJCT0gTlVMTCwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCQk9IGFybWFkYV8zOHhfY2xlYXJmb2dfQm9hcmRNcHBDb25maWdWYWx1ZSwKKwkuaW50c0dwcE1hc2tMb3cJCQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCQk9IDAsCisJLmludHNHcHBNYXNrSGlnaAkJCT0gMCwKKwkubnVtQm9hcmREZXZpY2VJZgkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZERlQ3NJbmZvKSwKKwkucERldkNzSW5mbwkJCQkJPSBhcm1hZGFfMzh4X2NsZWFyZm9nX0JvYXJkRGVDc0luZm8sCisJLm51bUJvYXJkVHdzaURldgkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJCT0gYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZE1hY0luZm8pLAorCS5wQm9hcmRNYWNJbmZvCQkJCT0gYXJtYWRhXzM4eF9jbGVhcmZvZ19Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJCT0gMCwKKwkucEJvYXJkR3BwSW5mbwkJCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCQkJPSBBUlJTWihhcm1hZGFfMzh4X2NsZWFyZm9nX2lvRXhwUGluSW5mbyksCisJLnBCb2FyZElvRXhwUGluSW5mbwkJCT0gYXJtYWRhXzM4eF9jbGVhcmZvZ19pb0V4cFBpbkluZm8sCisJLmFjdGl2ZUxlZHNOdW1iZXIJCQk9IDAsCisJLnBMZWRHcHBQaW4JCQkJPSBOVUxMLAorCS5sZWRzUG9sYXJpdHkJCQkJPSAwLAorCisJLyogUE1VIFBvd2VyICovCisJLnBtdVB3clVwUG9sYXJpdHkJCQk9IDAsCisJLnBtdVB3clVwRGVsYXkJCQkJPSA4MDAwMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQkJPSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9PVVRfRU5BX0xPVywKKwkuZ3BwT3V0RW5WYWxNaWQJCQkJPSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0VmFsTG93CQkJCT0gQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfT1VUX1ZBTF9MT1csCisJLmdwcE91dFZhbE1pZAkJCQk9IEEzOHhfQ0xFQVJGT0dfQk9BUkRfR1BQX09VVF9WQUxfTUlELAorCS5ncHBQb2xhcml0eVZhbExvdwkJCT0gQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfUE9MX0xPVywKKwkuZ3BwUG9sYXJpdHlWYWxNaWQJCQk9IEEzOHhfQ0xFQVJGT0dfQk9BUkRfR1BQX1BPTF9NSUQsCisJLmdwcFBvc3RDb25maWdDYWxsQmFjawkJCT0gQTM4eF9DTEVBUkZPR19CT0FSRF9ncHBfY2FsbGJhY2ssCisKKwkvKiBURE0gKi8KKwkubnVtQm9hcmRUZG1JbmZvCQkJPSB7fSwKKwkucEJvYXJkVGRtSW50MkNzSW5mbwkJCT0ge30sCisJLmJvYXJkVGRtSW5mb0luZGV4CQkJPSAtMSwKKworCS5wQm9hcmRTcGVjSW5pdAkJCQk9IE5VTEwsCisKKwkucEJvYXJkVXNiSW5mbwkJCQk9IGFybWFkYV8zOHhfY2xlYXJmb2dfSW5mb0JvYXJkVXNiSW5mbywKKwkubnVtQm9hcmRVc2JJbmZvCQkJPSBBUlJTWihhcm1hZGFfMzh4X2NsZWFyZm9nX0luZm9Cb2FyZFVzYkluZm8pLAorCisJLyogTkFORCBpbml0IHBhcmFtcyAqLworCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQkJPSAwLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJCT0gMCwKKwkubmFuZEZsYXNoQ29udHJvbAkJCT0gMCwKKwkubmFuZElmTW9kZQkJCQkJPSBOQU5EX0lGX05GQywKKworCS5pc1NkTW1jQ29ubmVjdGVkCQkJPSBNVl9UUlVFLAorCisJLyogTk9SIGluaXQgcGFyYW1zICovCisJLm5vckZsYXNoUmVhZFBhcmFtcwkJCT0gMCwKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJCT0gMCwKKwkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkuY29uZmlnQXV0b0RldGVjdAkJCT0gTVZfRkFMU0UsCisJLm51bUlvRXhwCQkJCT0gQVJSU1ooYXJtYWRhXzM4eF9jbGVhcmZvZ19Jb0V4cGFuZGVySW5mbyksCisJLnBJb0V4cAkJCQkJPSBhcm1hZGFfMzh4X2NsZWFyZm9nX0lvRXhwYW5kZXJJbmZvLAorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCQk9IE1WX01PRFVMRV9OT19NT0RVTEUsCisJLmlzQW1jCQkJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCQk9IGFybWFkYV8zOHhfY2xlYXJmb2dfSW5mb1N3aXRjaEluZm8sCisJLnN3aXRjaEluZm9OdW0JCQkJPSBBUlJTWihhcm1hZGFfMzh4X2NsZWFyZm9nX0luZm9Td2l0Y2hJbmZvKQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMxOCw5ICs1MzUsMTAgQEAKICNkZWZpbmUgQTM4eF9HRkNIMTAwX05PUl9XUklURV9QQVJBTVMJCTB4MDAwRjBGMEYKIAogTVZfQk9BUkRfTUFDX0lORk8gYXJtYWRhXzM4eF9nZmNoMTAwX0JvYXJkTWFjSW5mb1tdID0gewotCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7IEJPQVJEX01BQ19TUEVFRF8xMDAwTSwgMHhmZiwgMHgwfSwJLyogc3dpdGNoLCBubyBwaHksIG5vIGFkZHIgKi8KLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDMsIDB4MH0sCS8qIGNyYWZ0LCBwaHkgcG9ydCAzLCBubyBhZGRyICovCisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwKKwkgICBNVl8zMiBib2FyZEV0aFNtaUFkZHIwICwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF8xMDAwTSwgLTEsIC0xLCBNVl9UUlVFfSwJLyogc3dpdGNoLCBubyBwaHksIG5vIGFkZHIgKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDMsIDB4MCwgTVZfVFJVRX0sCS8qIGNyYWZ0LCBwaHkgcG9ydCAzLCBubyBhZGRyICovCiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBhcm1hZGFfMzh4X2dmY2gxMDBfQm9hcmREZUNzSW5mb1tdID0gewpAQCAtMzk3LDYgKzYxNSwxMCBAQAogCiAJLnBCb2FyZFNwZWNJbml0CQkJPSBOVUxMLAogCisJLyogVVNCICovCisJLm51bUJvYXJkVXNiSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2dmY2gxMDBfVXNiSW5mbyksCisJLnBCb2FyZFVzYkluZm8JCQk9IGFybWFkYV8zOHhfZ2ZjaDEwMF9Vc2JJbmZvLAorCiAJLyogTkFORCBpbml0IHBhcmFtcyAqLwogCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQk9IEEzOHhfR0ZDSDEwMF9OQU5EX1JFQURfUEFSQU1TLAogCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBBMzh4X0dGQ0gxMDBfTkFORF9XUklURV9QQVJBTVMsCkBAIC00MTMsMTAgKzYzNSw2IEBACiAJLm51bUlvRXhwCQkJPSBBUlJTWihhcm1hZGFfMzh4X2dmY2gxMDBfSW9FeHBhbmRlckluZm8pLAogCS5wSW9FeHAJCQkJPSBhcm1hZGFfMzh4X2dmY2gxMDBfSW9FeHBhbmRlckluZm8sCiAJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAotCi0JLyogVVNCICovCi0JLm51bUJvYXJkVXNiSW5mbwkJPSBBUlJTWihhcm1hZGFfMzh4X2dmY2gxMDBfVXNiSW5mbyksCi0JLnBCb2FyZFVzYkluZm8JCQk9IGFybWFkYV8zOHhfZ2ZjaDEwMF9Vc2JJbmZvLAogfTsKIAogLyoKQEAgLTQyNSw2ICs2NDMsNyBAQAogTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJCb2FyZEluZm9UYmxbXSA9IHsKIAkmYXJtYWRhXzM4eF9jdXN0b21lcl9ib2FyZF8wX2luZm8sCiAJJmFybWFkYV8zOHhfY3VzdG9tZXJfYm9hcmRfMV9pbmZvLAorCSZhcm1hZGFfMzh4X2NsZWFyZm9nX2JvYXJkX2luZm8sCiAJJmFybWFkYV8zOHhfZ2ZjaDEwMF9pbmZvLAogfTsKIApAQCAtNDYwLDcgKzY3OSw3IEBACiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMSwJMHg0YywJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMiwJMHg0ZCwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMywJMHg0ZSwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCi0JeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJNCwJMHgyMSwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCisJeyBCT0FSRF9UV1NJX0lPX0VYUEFOREVSLAkwLAkweDIxLAkgICBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIAl7IEJPQVJEX1RXU0lfTU9EVUxFX0RFVEVDVCwJMCwJMHgyMCwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sICAgLyogbW9kdWxlcyAqLwogCXsgQk9BUkRfVFdTSV9NT0RVTEVfREVURUNULAkxLAkweDIzLAkgICBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIAl7IEJPQVJEX1RXU0lfTU9EVUxFX0RFVEVDVCwJMiwJMHgyNCwJICAgQUREUjdfQklULCBNVl9GQUxTRX0sCkBAIC00NjksMTAgKzY4OCwxMSBAQAogCXsgQk9BUkRfVFdTSV9NT0RVTEVfREVURUNULAk1LAkweDI3LAkgICBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIH07CiBNVl9CT0FSRF9NQUNfSU5GTyBkYjg4ZjY4eHhJbmZvQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKIH07CiAKIE1WX0JPQVJEX1VTQl9JTkZPIGRiODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKQEAgLTQ4NywxMyArNzA3LDM0IEBACiAJeyBERVZJQ0VfQ1MwLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBOQU5EIERFViAqLwogCXsgREVWX0JPT0NTLAlOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsCTE2LAkxNiwJMCwJTVZfRkFMU0UgfSwJLyogTk9SIERFViAqLwogCXsgU1BJMF9DUzAsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX1RSVUUgfSwJLyogU1BJMCBERVYgKi8KLQl7IFNQSTBfQ1MxLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9CS8qIFNQSTAgREVWICovCisJeyBTUEkxX0NTMCwJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMSwJTVZfRkFMU0UgfQkvKiBTUEkxIERFViAqLwogfTsKIAogTVZfQk9BUkRfVERNX0lORk8gZGI4OGY2OHh4VGRtODgwW10gPSB7IHswfSB9OwogCiBNVl9CT0FSRF9URE1fU1BJX0lORk8gZGI4OGY2OHh4VGRtU3BpSW5mb1tdID0geyB7MX0gfTsKIAorc3RydWN0IE1WX0JPQVJEX1NXSVRDSF9JTkZPIGRiODhmNjh4eFN3aXRjaEluZm9bXSA9IHsKKwl7CisJCS5pc0VuYWJsZWQgPSBNVl9GQUxTRSwKKwkJLmlzQ3B1UG9ydFJnbWlpID0gTVZfVFJVRSwKKwkJLnN3aXRjaElycSA9IC0xLAkvKiBzZXQgdG8gLTEgZm9yIHVzaW5nIFBQVSovCisJCS5zd2l0Y2hQb3J0ID0gezAsIDEsIDIsIDMsIDQsIDUsIDZ9LAorCQkuY3B1UG9ydCA9IDYsCisJCS5jb25uZWN0ZWRQb3J0ID0gezUsIDYsIC0xfSwKKwkJLnNtaVNjYW5Nb2RlID0gTVZfU1dJVENIX1NNSV9NVUxUSV9BRERSX01PREUsCisJCS5xdWFkUGh5QWRkciA9IDIsCisJCS5mb3JjZUxpbmtNYXNrID0gMHg2MAorCX0KK307CisKK3N0cnVjdCBNVl9CT0FSRF9JT19FWFBBTkRFUiBkYjg4ZjY4eHhJbmZvQm9hcmRpb0V4cFZhbHVlW10gPSB7CisJezAsIDYsIDB4RkZ9LCAvKiBDb25maWcgcmVnIzA6IGFsbCBiaXRzIGFzIGlucHV0IChCSVQgb24gPSBJbnB1dCkgKi8KKwl7MCwgNywgMHhGQ30sIC8qIENvbmZpZyByZWcjMTogQklUMChVU0IzLjAgY3VycmVudCBsaW1pdCksIEJJVDEoVVNCMy4xIGN1cnJlbnQgbGltaXQpKi8KKwl7MCwgMiwgMHhGRn0sIC8qIE91dHB1dCBEYXRhLCByZWcjMCAgLSBubyBvdXRwdXQgYml0cyovCisJezAsIDMsIDB4RkZ9LCAvKiBPdXRwdXQgRGF0YSwgcmVnIzE6ICBCSVQwLFVTQjMuMF9DVVJSRU5UPTEsIEJJVDEsVVNCMy4xX0NVUlJFTlQ9MSAqLworfTsKKwogTVZfQk9BUkRfSU5GTyBkYjg4ZjY4eHhfYm9hcmRfaW5mbyA9IHsKIAkuYm9hcmROYW1lCQk9ICJEQi04OEY2ODIwLUJQIiwKIAkuY29tcGF0aWJsZURUTmFtZQk9ICJhMzg1LWRiIiwKQEAgLTUxMSw2ICs3NTIsOCBAQAogCS5wQm9hcmRNYWNJbmZvCQk9IGRiODhmNjh4eEluZm9Cb2FyZE1hY0luZm8sCiAJLm51bUJvYXJkR3BwSW5mbwk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCT0gMCwKKwkubnVtQm9hcmRJb0V4cFBpbkluZm8JPSAwLAorCS5wQm9hcmRJb0V4cFBpbkluZm8JPSAwLAogCS5hY3RpdmVMZWRzTnVtYmVyCT0gMCwKIAkucExlZEdwcFBpbgkJPSBOVUxMLAogCS5sZWRzUG9sYXJpdHkJCT0gMCwKQEAgLTU1Nyw5ICs4MDAsMTQgQEAKIAogCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLwogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCi0JLm51bUlvRXhwCQkJPSAwLAotCS5wSW9FeHAJCQkJPSBOVUxMLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5udW1Jb0V4cAkJCT0gQVJSU1ooZGI4OGY2OHh4SW5mb0JvYXJkaW9FeHBWYWx1ZSksCisJLnBJb0V4cAkJCQk9IGRiODhmNjh4eEluZm9Cb2FyZGlvRXhwVmFsdWUsCisJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCQk9IE1WX0ZBTFNFLAorCS5pc0F1ZGlvQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5pc1RkbUNvbm5lY3RlZAkJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQkJPSBkYjg4ZjY4eHhTd2l0Y2hJbmZvLAorCS5zd2l0Y2hJbmZvTnVtCQkJPSBBUlJTWihkYjg4ZjY4eHhTd2l0Y2hJbmZvKQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU3Myw5ICs4MjEsMTAgQEAKIAl7IEJPQVJEX1RXU0lfSU9fRVhQQU5ERVIsCTEsCTB4MjEsIEFERFI3X0JJVCwgTVZfRkFMU0V9LAogfTsKIE1WX0JPQVJEX01BQ19JTkZPIHJkODhGNjhYWEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKLQkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDF9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfQorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCwgTVZfQk9PTCBib2FyZE1hY0VuYWJsZWQ7fX0gKi8KKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MSwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9CiB9OwogCiBNVl9ERVZfQ1NfSU5GTyByZDg4RjY4WFhJbmZvQm9hcmREZUNzSW5mb1tdID0gewpAQCAtNjIzLDYgKzg3Miw4IEBACiAJLnBCb2FyZE1hY0luZm8JCQk9IHJkODhGNjhYWEluZm9Cb2FyZE1hY0luZm8sCiAJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAogCS5wQm9hcmRHcHBJbmZvCQkJPSAwLAorCS5udW1Cb2FyZElvRXhwUGluSW5mbwk9IDAsCisJLnBCb2FyZElvRXhwUGluSW5mbwk9IDAsCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKIAkucExlZEdwcFBpbgkJCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQkJPSAwLApAQCAtNjYyLDcgKzkxMywxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQkJPSBBUlJTWihpb0V4cE5hcyksCiAJLnBJb0V4cAkJCQk9IGlvRXhwTmFzLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQkJPSBNVl9GQUxTRSwKKwkuaXNBdWRpb0Nvbm5lY3RlZAkJPSBNVl9GQUxTRSwKKwkuaXNUZG1Db25uZWN0ZWQJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAogfTsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBBMzgwIFJELVdBUC04OEY2OFhYIGJvYXJkICovCkBAIC03MDYsNiArOTYyLDggQEAKIAkucEJvYXJkTWFjSW5mbwkJCT0gcmQ4OEY2OFhYSW5mb0JvYXJkTWFjSW5mbywKIAkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlcgkJPSAwLAogCS5wTGVkR3BwUGluCQkJPSBOVUxMLAogCS5sZWRzUG9sYXJpdHkJCQk9IDAsCkBAIC03NDUsNyArMTAwMywxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQkJPSBBUlJTWihpb0V4cFdhcCksCiAJLnBJb0V4cAkJCQk9IGlvRXhwV2FwLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQkJPSBNVl9GQUxTRSwKKwkuaXNBdWRpb0Nvbm5lY3RlZAkJPSBNVl9GQUxTRSwKKwkuaXNUZG1Db25uZWN0ZWQJCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc4NSwxMCArMTA0OCwxMSBAQAogfTsKIAogTVZfQk9BUkRfTUFDX0lORk8gZGJBUDg4ZjY4eHhJbmZvQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDYsIDB4NH0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHg0LCAweDR9LAorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCAsIE1WX0JPT0wgYm9hcmRNYWNFbmFibGVkO319ICovCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4NiwgMHg0LCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgTVZfVFJVRX0sCiB9OwogCiBNVl9CT0FSRF9VU0JfSU5GTyBkYkFQODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKQEAgLTgwMCw5ICsxMDY0LDEyIEBACiBNVl9ERVZfQ1NfSU5GTyBkYkFQODhmNjh4eEluZm9Cb2FyZERlQ3NJbmZvW10gPSB7CiAJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoLCBidXNOdW0sIGFjdGl2ZSB9Ki8KIAl7IERFVklDRV9DUzAsCU5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsCTgsCTgsCTAsCU1WX1RSVUUgfSwJLyogTkFORCBERVYgKi8KLQl7IERFVl9CT09DUywJTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILAkxNiwJMTYsCTAsCU1WX0ZBTFNFIH0sCS8qIE5PUiBERVYgKi8KLQl7IFNQSTBfQ1MwLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLwotCXsgU1BJMF9DUzEsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX0ZBTFNFIH0JLyogU1BJMCBERVYgKi8KKwl7IERFVl9CT09DUywJTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILAkxNiwJMTYsCTAsCU1WX0ZBTFNFIH0JLyogTk9SIERFViAqLworfTsKKworTVZfQk9BUkRfR1BQX0lORk8gZGJBUDg4ZjY4eHhJbmZvQm9hcmRHcHBJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9HUFBfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CWdwcFBpbk51bX19ICovCisvKiBVU0JfSG9zdDAgKi8Je0JPQVJEX0dQUF9VU0JfVkJVUywgICAgNDR9LCAvKiBmcm9tIE1QUCBtYXAgKi8KIH07CiAKIE1WX0JPQVJEX1RETV9JTkZPIGRiQVA4OGY2OHh4VGRtODgwW10gPSB7IHswfSB9OwpAQCAtODI2LDggKzEwOTMsMTAgQEAKIAkucEJvYXJkVHdzaURldiAgICAgICAgICA9IGRiQVA4OGY2OHh4SW5mb0JvYXJkVHdzaURldiwKIAkubnVtQm9hcmRNYWNJbmZvICAgICAgICA9IEFSUlNaKGRiQVA4OGY2OHh4SW5mb0JvYXJkTWFjSW5mbyksCiAJLnBCb2FyZE1hY0luZm8gICAgICAgICAgPSBkYkFQODhmNjh4eEluZm9Cb2FyZE1hY0luZm8sCi0JLm51bUJvYXJkR3BwSW5mbyAgICAgICAgPSAwLAotCS5wQm9hcmRHcHBJbmZvICAgICAgICAgID0gMCwKKwkubnVtQm9hcmRHcHBJbmZvCT0gQVJSU1ooZGJBUDg4ZjY4eHhJbmZvQm9hcmRHcHBJbmZvKSwKKwkucEJvYXJkR3BwSW5mbwkJPSBkYkFQODhmNjh4eEluZm9Cb2FyZEdwcEluZm8sCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlciAgICAgICA9IDAsCiAJLnBMZWRHcHBQaW4gICAgICAgICAgICAgPSBOVUxMLAogCS5sZWRzUG9sYXJpdHkgICAgICAgICAgID0gMCwJLyogUE1VIFBvd2VyICovCkBAIC04NjMsNyArMTEzMiwxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0ICAgICAgICAgICAgICAgPSBNVl9GQUxTRSwKIAkubnVtSW9FeHAgICAgICAgICAgICAgICAgICAgICAgID0gMCwKIAkucElvRXhwICAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTCwKLQkuYm9hcmRPcHRpb25zTW9kdWxlICAgICAgICAgICAgID0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUgICAgICAgICAgICAgPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCQk9IE1WX0ZBTFNFLAorCS5pc0F1ZGlvQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5pc1RkbUNvbm5lY3RlZAkJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQkJPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtCQkJPSAwCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODc4LDEwICsxMTUyLDExIEBACiAJeyBCT0FSRF9UV1NJX0lPX0VYUEFOREVSLAkxLAkweDIxLCBBRERSN19CSVQsIE1WX0ZBTFNFfSwKIH07CiBNVl9CT0FSRF9NQUNfSU5GTyBkYkdQODhGNjhYWEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKLQkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDF9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAgLTEsICAtMX0KKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLAorCSAgIE1WXzMyIGJvYXJkRXRoU21pQWRkcjAgLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgIC0xLCAgLTEsIE1WX1RSVUV9CiB9OwogCiBNVl9CT0FSRF9VU0JfSU5GTyBkYkdQODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKQEAgLTkxNyw3ICsxMTkyLDEyIEBACiAJezEsIDYsIDB4QzN9LCAvKiBDb25maWd1cmF0aW9uIHJlZ2lzdGVyczogQml0IG9uIC0tPiBJbnB1dCBiaXRzICAqLwogCXsxLCA3LCAweDMxfSwgLyogQ29uZmlndXJhdGlvbiByZWdpc3RlcnM6IEJpdCBvbiAtLT4gSW5wdXQgYml0cyAgKi8KIAl7MSwgMiwgMHgwOH0sIC8qIE91dHB1dCBEYXRhLCByZWdpc3RlciMwICovCi0JezEsIDMsIDB4QzB9ICAvKiBPdXRwdXQgRGF0YSwgcmVnaXN0ZXIjMSAqLworCXsxLCAzLCAweDQwfSAgLyogT3V0cHV0IERhdGEsIHJlZ2lzdGVyIzEgKi8KK307CisKK01WX0JPQVJEX0lPX0VYUEFOREVSX1RZUEVfSU5GTyBkYkdQODhmNjhYWEluZm9Cb2FyZGlvRXhwUGluSW5mb1tdID0geworLyoJeyBJTyBUeXBlIGVudW0sCQkJYml0IG9mZnNldCwgSW8uZXhwIG51bSwJCXJlZyBOdW0gKi8KKwl7IE1WX0lPX0VYUEFOREVSX1VTQl9WQlVTLAk3LAkJMSwJCTN9IC8qIFZCVVNfRU46IElPLmV4cCMxICgweDIxKSwgcmVnICMzLCBiaXQgNyAqLwogfTsKIAogTVZfVTggZGJHUDg4ZjY4WFhJbmZvQm9hcmRQaWNHcGlvW10gPSB7MzMsIDM0LCAzNX07CkBAIC05MzksNiArMTIxOSw4IEBACiAJLnBCb2FyZE1hY0luZm8JCQk9IGRiR1A4OEY2OFhYSW5mb0JvYXJkTWFjSW5mbywKIAkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCQk9IEFSUlNaKGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBQaW5JbmZvKSwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCQk9IGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBQaW5JbmZvLAogCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCiAJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCiAJLmxlZHNQb2xhcml0eQkJCT0gMCwKQEAgLTk4NCw3ICsxMjY2LDEyIEBACiAJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwKIAkubnVtSW9FeHAJCQk9IEFSUlNaKGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBWYWx1ZSksCiAJLnBJb0V4cAkJCQk9IGRiR1A4OGY2OFhYSW5mb0JvYXJkaW9FeHBWYWx1ZSwKLQkuYm9hcmRPcHRpb25zTW9kdWxlCQk9IE1WX01PRFVMRV9OT19NT0RVTEUKKwkuYm9hcmRPcHRpb25zTW9kdWxlCQk9IE1WX01PRFVMRV9OT19NT0RVTEUsCisJLmlzQW1jCQkJCT0gTVZfRkFMU0UsCisJLmlzQXVkaW9Db25uZWN0ZWQJCT0gTVZfRkFMU0UsCisJLmlzVGRtQ29ubmVjdGVkCQkJPSBNVl9GQUxTRSwKKwkucFN3aXRjaEluZm8JCQk9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0JCQk9IDAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDExLDEwICsxMjk4LDExIEBACiAJeyBCT0FSRF9UV1NJX01PRFVMRV9ERVRFQ1QsCTAsCTB4NTYsCUFERFI3X0JJVCwgTVZfVFJVRX0sICAgLyogU0xNIDE0MjYvMTQyNyBtb2R1bGUgKi8KIH07CiBNVl9CT0FSRF9NQUNfSU5GTyBkYjg4ZjY4MjFJbmZvQm9hcmRNYWNJbmZvW10gPSB7Ci0JLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAorCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsCisJICAgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMCAsIE1WX0JPT0wgYm9hcmRNYWNFbmFibGVkO319ICovCisJeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCiB9OwogCiBNVl9CT0FSRF9VU0JfSU5GTyBkYjg4ZjY4MjFJbmZvQm9hcmRVc2JJbmZvW10gPSB7CkBAIC0xMDI2LDggKzEzMTQsNyBAQAogCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCiAJeyBERVZJQ0VfQ1MwLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBOQU5EIERFViAqLwogCXsgREVWX0JPT0NTLAlOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsCTE2LAkxNiwJMCwJTVZfRkFMU0UgfSwJLyogTk9SIERFViAqLwotCXsgU1BJMF9DUzAsCQlOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsCTgsCTgsCTAsCU1WX1RSVUUgfSwJLyogU1BJMCBERVYgKi8KLQl7IFNQSTBfQ1MxLAkJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9CS8qIFNQSTAgREVWICovCisJeyBTUEkwX0NTMCwJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMCwJTVZfVFJVRSB9CS8qIFNQSTAgREVWICovCiB9OwogCiBzdHJ1Y3QgTVZfQk9BUkRfSU9fRVhQQU5ERVIgZGI4OGY2ODIxSW5mb0JvYXJkaW9FeHBWYWx1ZVtdID0gewpAQCAtMTA1NCw2ICsxMzQxLDggQEAKIAkucEJvYXJkTWFjSW5mbwkJPSBkYjg4ZjY4MjFJbmZvQm9hcmRNYWNJbmZvLAogCS5udW1Cb2FyZEdwcEluZm8JPSAwLAogCS5wQm9hcmRHcHBJbmZvCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlcgk9IDAsCiAJLnBMZWRHcHBQaW4JCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQk9IDAsCkBAIC0xMDgxLDcgKzEzNzAsNyBAQAogCS5uYW5kRmxhc2hDb250cm9sCT0gREJfODhGNjhYWF9CT0FSRF9OQU5EX0NPTlRST0wsCiAJLm5hbmRJZk1vZGUJCT0gTkFORF9JRl9ORkMsCiAKLQkuaXNTZE1tY0Nvbm5lY3RlZAk9IE1WX0ZBTFNFLAorCS5pc1NkTW1jQ29ubmVjdGVkCT0gTVZfVFJVRSwKIAkuaXNTZE1tY18xXzh2X0Nvbm5lY3RlZAk9IE1WX0ZBTFNFLAogCiAJLyogTk9SIGluaXQgcGFyYW1zICovCkBAIC0xMDkyLDcgKzEzODEsMTIgQEAKIAkuY29uZmlnQXV0b0RldGVjdAk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQk9IEFSUlNaKGRiODhmNjgyMUluZm9Cb2FyZGlvRXhwVmFsdWUpLAogCS5wSW9FeHAJCQk9IGRiODhmNjgyMUluZm9Cb2FyZGlvRXhwVmFsdWUsCi0JLmJvYXJkT3B0aW9uc01vZHVsZQk9IE1WX01PRFVMRV9OT19NT0RVTEUKKwkuYm9hcmRPcHRpb25zTW9kdWxlCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkuaXNBbWMJCQk9IE1WX0ZBTFNFLAorCS5pc0F1ZGlvQ29ubmVjdGVkCT0gTVZfRkFMU0UsCisJLmlzVGRtQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5wU3dpdGNoSW5mbwkJPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtCQk9IDAKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTE3LDI4ICsxNDExLDI4IEBACiAJeyBCT0FSRF9ERVZfVFdTSV9TQVRSLAkJMSwJMHg0YywJQUREUjdfQklULCBNVl9GQUxTRX0sCiB9OwogTVZfQk9BUkRfTUFDX0lORk8gZGJBbWM4OGY2OHh4SW5mb0JvYXJkTWFjSW5mb1tdID0gewotCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MX0sCi0JeyBCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDB9LAotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwfSwKKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLAorCSAgIE1WXzMyIGJvYXJkRXRoU21pQWRkcjAgLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MSwgMHgxLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfRkFMU0V9LAorCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKIH07CiAKIE1WX0JPQVJEX1VTQl9JTkZPIGRiQW1jODhmNjh4eEluZm9Cb2FyZFVzYkluZm9bXSA9IHsKIC8qIHtNVl9VTklUX0lEIHVzYlR5cGUsIE1WX1U4IHVzYlBvcnROdW0sIE1WX0JPT0wgaXNBY3RpdmV9ICovCi0JeyBVU0JfVU5JVF9JRCwgMSwgTVZfVFJVRX0sCisJeyBVU0JfVU5JVF9JRCwgMCwgTVZfVFJVRX0sCiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBkYkFtYzg4ZjY4eHhJbmZvQm9hcmREZUNzSW5mb1tdID0gewogCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCwgYnVzTnVtLCBhY3RpdmUgfSovCiAJeyBERVZJQ0VfQ1MwLAlOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILAk4LAk4LAkwLAlNVl9UUlVFIH0sCS8qIE5BTkQgREVWICovCiAJeyBERVZfQk9PQ1MsCU5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwJMTYsCTE2LAkwLAlNVl9GQUxTRSB9LAkvKiBOT1IgREVWICovCi0JeyBTUEkwX0NTMCwJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkwLAlNVl9GQUxTRSB9LAkvKiBTUEkwIERFViAqLwotCXsgU1BJMF9DUzEsCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMCwJTVZfVFJVRSB9CS8qIFNQSTAgREVWICovCisJeyBTUEkxX0NTMCwJTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILAk4LAk4LAkxLAlNVl9UUlVFIH0JLyogU1BJMCBERVYgKi8KIH07CiAKIE1WX0JPQVJEX0lORk8gZGJBbWM4OGY2OHh4X2JvYXJkX2luZm8gPSB7CiAJLmJvYXJkTmFtZQkJPSAiREItODhGNjgyMC1BTUMiLAotCS5jb21wYXRpYmxlRFROYW1lCT0gImEzODUtYW1jIiwKKwkuY29tcGF0aWJsZURUTmFtZQk9ICJhMzg1LWRiLWFtYyIsCiAJLm51bUJvYXJkTmV0Q29tcGxleFZhbHVlID0gMCwKIAkucEJvYXJkTmV0Q29tcGxleEluZm8JPSBOVUxMLAogCS5wQm9hcmRNcHBDb25maWdWYWx1ZQk9IGRiQW1jODhmNjh4eEluZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLApAQCAtMTE1Myw2ICsxNDQ3LDggQEAKIAkucEJvYXJkTWFjSW5mbwkJPSBkYkFtYzg4ZjY4eHhJbmZvQm9hcmRNYWNJbmZvLAogCS5udW1Cb2FyZEdwcEluZm8JPSAwLAogCS5wQm9hcmRHcHBJbmZvCQk9IDAsCisJLm51bUJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKKwkucEJvYXJkSW9FeHBQaW5JbmZvCT0gMCwKIAkuYWN0aXZlTGVkc051bWJlcgk9IDAsCiAJLnBMZWRHcHBQaW4JCT0gTlVMTCwKIAkubGVkc1BvbGFyaXR5CQk9IDAsCkBAIC0xMTkxLDcgKzE0ODcsMTIgQEAKIAkuY29uZmlnQXV0b0RldGVjdAk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQk9IDAsCiAJLnBJb0V4cAkJCT0gTlVMTCwKLQkuYm9hcmRPcHRpb25zTW9kdWxlCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5pc0FtYwkJCT0gTVZfVFJVRSwJLyogZm9yIERUIHVwZGF0ZSBhbmQgc3dpdGNoaW5nIHNlcnZpY2VzICovCisJLmlzQXVkaW9Db25uZWN0ZWQJPSBNVl9GQUxTRSwKKwkuaXNUZG1Db25uZWN0ZWQJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQk9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0JCT0gMAogfTsKIAogTVZfQk9BUkRfSU5GTyAqbWFydmVsbEJvYXJkSW5mb1RibFtdID0gewpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOHguaCBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzh4LmgKaW5kZXggMWE0ZmI5My4uZWViNTg2OCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOHguaAorKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYzM4eC5oCkBAIC0xMjAsNiArMTIwLDI4IEBACiAjZGVmaW5lIEEzOHhfQ1VTVE9NRVJfQk9BUkRfMV9HUFBfUE9MX0xPVwkJMHgwCiAjZGVmaW5lIEEzOHhfQ1VTVE9NRVJfQk9BUkRfMV9HUFBfUE9MX01JRAkJMHgwCiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU29saWRSdW4gQm9hcmQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTb2xpZFJ1biBDbGVhckZvZy1BMSBSRVYyLjAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMF83CQkJMHgxMTExMTExMQorI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDhfMTUJCQkweDExMTExMTExCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQMTZfMjMJCTB4MTA0NjAwMTEKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9NUFAyNF8zMQkJMHgyMjA0MzMzMworI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDMyXzM5CQkweDQ0NDAwMDAyCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfTVBQNDBfNDcJCTB4NDExNDQwMDQKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9NUFA0OF81NQkJMHg0NTMzMzMzMworI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX01QUDU2XzYzCQkweDAwMDA0NDQ0CisKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfT1VUX0VOQV9MT1cJMHhGRkZGRkZGRgorI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9PVVRfRU5BX01JRAkweEZGRkZGRkZGCisKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfT1VUX1ZBTF9MT1cJMHgwCisjZGVmaW5lIEEzOHhfQ0xFQVJGT0dfQk9BUkRfR1BQX09VVF9WQUxfTUlECTB4MAorI2RlZmluZSBBMzh4X0NMRUFSRk9HX0JPQVJEX0dQUF9QT0xfTE9XCQkweDAKKyNkZWZpbmUgQTM4eF9DTEVBUkZPR19CT0FSRF9HUFBfUE9MX01JRAkJMHgwCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBBMzh4IEdGQ0gxMDAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjUyLDE3ICsyNzQsMTggQEAKICNkZWZpbmUgREJfQVBfODhGNjhYWF9NUFAwXzcgICAgICAgICAgICAweDExMTExMTExCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQOF8xNSAgICAgICAgICAgMHgxMTExMTExMQogI2RlZmluZSBEQl9BUF84OEY2OFhYX01QUDE2XzIzICAgICAgICAgIDB4NTUwNjYwMTEKLSNkZWZpbmUgREJfQVBfODhGNjhYWF9NUFAyNF8zMSAgICAgICAgICAweDA1MDUwMDUwCisjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQMjRfMzEgICAgICAgICAgMHgwNTA1MDA1MCAvKiAzNzogVVNCM19DZmdDdXJyZW50TGltKG91dDEpICovCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQMzJfMzkgICAgICAgICAgMHgwNTA1NTU1NQotI2RlZmluZSBEQl9BUF84OEY2OFhYX01QUDQwXzQ3ICAgICAgICAgIDB4MDExMDA1NjUKKyNkZWZpbmUgREJfQVBfODhGNjhYWF9NUFA0MF80NyAgICAgICAgICAweDAxMTAwNTY1IC8qIDQzOiBVU0IzX09DU24oaW4pLCA0NDogVVNCM19WQlVTX0VOKG91dDEpICovCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfTVBQNDhfNTUgICAgICAgICAgMHgwMDAwMDAwMAogI2RlZmluZSBEQl9BUF84OEY2OFhYX01QUDU2XzYzICAgICAgICAgIDB4MDAwMDQ0NDQKIAogI2RlZmluZSBEQl9BUF84OEY2OFhYX0dQUF9PVVRfRU5BX0xPVwkofihCSVQyMSkpIC8qIFBJQyAoU1RSKSBHUElPID0gMjEsIDQ3ICovCi0jZGVmaW5lIERCX0FQXzg4RjY4WFhfR1BQX09VVF9FTkFfTUlECSh+KEJJVDEgfCBCSVQyIHwgQklUMyB8IEJJVDE1KSkKKyNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfT1VUX0VOQV9NSUQJKH4oQklUMSB8IEJJVDIgfCBCSVQzIHwgQklUNSB8IEJJVDE1KSkKKwkgICAgICAgLypHUFBfT1VUX0VOQV9NSUQ6IEJJVDUoMzcpOlVTQjNfQ2ZnID0gSGlnaCwgQklUMTIoNDQpOlVTQjNfVkJVU19FTiA9IExvdyAqLwogI2RlZmluZSBEQl9BUF84OEY2OFhYX0dQUF9PVVRfRU5BX0hJR0gJKH4oQklUMSkpCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfR1BQX09VVF9WQUxfTE9XCTB4MAotI2RlZmluZSBEQl9BUF84OEY2OFhYX0dQUF9PVVRfVkFMX01JRAkweDAKKyNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfT1VUX1ZBTF9NSUQJKEJJVDUpCiAjZGVmaW5lIERCX0FQXzg4RjY4WFhfR1BQX09VVF9WQUxfSElHSAkweDAKICNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfUE9MX0xPVwkweDAKICNkZWZpbmUgREJfQVBfODhGNjhYWF9HUFBfUE9MX01JRAkweDAKQEAgLTMyNCw3ICszNDcsNyBAQAogI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfT1VUX0VOQV9NSUQJKH4oQklUMTIgfCBCSVQxNyB8IEJJVDE4IHwgQklUMjAgfCBCSVQyMSkpIC8qIDQ0OkkyQ19FWFRfRU4sIDQ5LDUwLDUyLDUzOkxlZHMqLwogI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfT1VUX0VOQV9ISUdICTB4RkZGRkZGRkYKICNkZWZpbmUgREJfQU1DXzg4RjY4WFhfR1BQX09VVF9WQUxfTE9XCShCSVQyOSkgLyogR1BJTzI5OiBRU19TTUlfRU5BID0gT1VUIFZBTCBIaWdoICovCi0jZGVmaW5lIERCX0FNQ184OEY2OFhYX0dQUF9PVVRfVkFMX01JRAkoQklUMTIpIC8qIEdQSU80NDogSTJDX0VYVF9FTiA9IE9VVCBWQUwgSGlnaCAqLworI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfT1VUX1ZBTF9NSUQJKEJJVDEyKSAvKiAod2FzIEJJVDEyKTogR1BJTzQ0IEkyQ19FWFRfRU4gPSBGQUxTRSAoRmFsc2UgPSBPVVQgVkFMIEhpZ2gpICovCiAjZGVmaW5lIERCX0FNQ184OEY2OFhYX0dQUF9PVVRfVkFMX0hJR0gJMHgwCiAjZGVmaW5lIERCX0FNQ184OEY2OFhYX0dQUF9QT0xfTE9XCTB4MAogI2RlZmluZSBEQl9BTUNfODhGNjhYWF9HUFBfUE9MX01JRAkweDAKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzl4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYzM5eC5jCmluZGV4IGI5MGJhNjMuLmIxODZiZmUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjMzl4LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMzOXguYwpAQCAtODgsMTEgKzg4LDExIEBACiAKIE1WX0JPQVJEX01BQ19JTkZPIGFybWFkYV8zOXhfY3VzdG9tZXJfMF9Cb2FyZE1hY0luZm9bXSA9IHsKIAkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl84IGJvYXJkRXRoU21pQWRkciwgTVZfOAotCSAqIGJvYXJkRXRoU21pQWRkcjAsIE1WX1BIWV9QT1JUX1RZUEUgcG9ydFR5cGV9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSX0KKwkgKiBib2FyZEV0aFNtaUFkZHIwLCBNVl9QSFlfUE9SVF9UWVBFIHBvcnRUeXBlLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSSwgTVZfVFJVRX0KIH07CiAKIE1WX0JPQVJEX05FVF9DT01QTEVYX0lORk8gYXJtYWRhXzM5eF9jdXN0b21lcl8wX0luZm9Cb2FyZE5ldENvbXBsZXhJbmZvW10gPSB7CkBAIC0xMjAsNiArMTIwLDE0IEBACiAJeyBTUEkxX0NTMywJCU5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwJOCwJOCwJMSwJTVZfRkFMU0UgfQkvKiBTUEkxIERFViAqLwogfTsKIAorTVZfQk9BUkRfVVNCX0lORk8gYXJtYWRhXzM5eF9jdXN0b21lcl8wX0JvYXJkVXNiSW5mb1tdID0geworLyoge01WX1VOSVRfSUQgdXNiVHlwZSwgTVZfVTggdXNiUG9ydE51bSwgTVZfQk9PTCBpc0FjdGl2ZX0gKi8KKwl7IFVTQjNfVU5JVF9JRCwgMCwgTVZfRkFMU0V9LAorCXsgVVNCM19VTklUX0lELCAxLCBNVl9UUlVFfSwKKwl7IFVTQl9VTklUX0lELCAgMCwgTVZfRkFMU0V9LAorfTsKKworCiBNVl9CT0FSRF9NUFBfSU5GTyBhcm1hZGFfMzl4X2N1c3RvbWVyXzBfQm9hcmRNcHBDb25maWdWYWx1ZVtdID0gewogCXsgewogCQlBMzlYX0NVU1RPTUVSX0JPQVJEXzBfTVBQMF83LApAQCAtMTMzLDYgKzE0MSwxNCBAQAogCX0gfQogfTsKIAorLyogZ3BwX2NhbGxiYWNrIGlzIGEgZ2VuZXJpYyBwbGFjZSBob2xkZXIgcm91dGluZSBmb3Igc3BlY2lhbCBHUElPIHB1bGwtdXAvc293biBzZXF1ZW5jZQorICogdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhcyB0aGUgZmluYWwgc3RlcCBvZiBtdkJvYXJkRW52SW5pdCBmbG93CisgKiBmb3IgZXhhbXBsZSBzZWUgaW1wbGVtZW50YXRpb24gZm9yIFNvbGlkUnVuJ3MgY2xlYXJGb2cgYm9hcmQ6IEEzOHhfQ0xFQVJGT0dfQk9BUkRfZ3BwX2NhbGxiYWNrKi8KK3ZvaWQgQTM5eF9DVVNUT01FUl9CT0FSRF8wX2dwcF9jYWxsYmFjayhNVl9CT0FSRF9JTkZPICpib2FyZCkgeworCisJLyogaW1wbGVtZW50IHNwZWNpYWwgR1BJTy9NUFAgcG9zdCBjb25maWd1cmF0aW9uIGhlcmUgKi8KK30KKwogTVZfQk9BUkRfSU5GTyBhcm1hZGFfMzl4X2N1c3RvbWVyX2JvYXJkXzBfaW5mbyA9IHsKIAkuYm9hcmROYW1lCQkJPSAiQTM5eC1DdXN0b21lci1Cb2FyZC0wIiwKIAkubnVtQm9hcmROZXRDb21wbGV4VmFsdWUJPSBBUlJTWihhcm1hZGFfMzl4X2N1c3RvbWVyXzBfSW5mb0JvYXJkTmV0Q29tcGxleEluZm8pLApAQCAtMTY0LDcgKzE4MCwxMCBAQAogCS5ncHBPdXRWYWxNaWQJCQk9IEEzOVhfQ1VTVE9NRVJfQk9BUkRfMF9HUFBfT1VUX1ZBTF9NSUQsCiAJLmdwcFBvbGFyaXR5VmFsTG93CQk9IEEzOVhfQ1VTVE9NRVJfQk9BUkRfMF9HUFBfUE9MX0xPVywKIAkuZ3BwUG9sYXJpdHlWYWxNaWQJCT0gQTM5WF9DVVNUT01FUl9CT0FSRF8wX0dQUF9QT0xfTUlELAorCS5ncHBQb3N0Q29uZmlnQ2FsbEJhY2sJCT0gQTM5eF9DVVNUT01FUl9CT0FSRF8wX2dwcF9jYWxsYmFjaywKIAorCS5wQm9hcmRVc2JJbmZvCQk9IGFybWFkYV8zOXhfY3VzdG9tZXJfMF9Cb2FyZFVzYkluZm8sCisJLm51bUJvYXJkVXNiSW5mbwk9IEFSUlNaKGFybWFkYV8zOXhfY3VzdG9tZXJfMF9Cb2FyZFVzYkluZm8pLAogCS8qIFRETSAqLwogCS5udW1Cb2FyZFRkbUluZm8JCT0ge30sCiAJLnBCb2FyZFRkbUludDJDc0luZm8JCT0ge30sCkBAIC0xODQsNyArMjAzLDkgQEAKIAkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9GQUxTRSwKIAkubnVtSW9FeHAJCQk9IDAsCiAJLnBJb0V4cAkJCQk9IE5VTEwsCi0JLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFCisJLmJvYXJkT3B0aW9uc01vZHVsZQkJPSBNVl9NT0RVTEVfTk9fTU9EVUxFLAorCS5wU3dpdGNoSW5mbwkJCT0gTlVMTCwKKwkuc3dpdGNoSW5mb051bQkJCT0gMAogfTsKIAogLyoKQEAgLTIzOSwxMSArMjYwLDExIEBACiAKIE1WX0JPQVJEX01BQ19JTkZPIGRiODhmNjl4eEluZm9Cb2FyZE1hY0luZm9bXSA9IHsKIAkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl84IGJvYXJkRXRoU21pQWRkciwgTVZfOAotCSAqIGJvYXJkRXRoU21pQWRkcjAsIE1WX1BIWV9QT1JUX1RZUEUgcG9ydFR5cGV9fSAqLwotCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JfSwKLQl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSX0KKwkgKiBib2FyZEV0aFNtaUFkZHIwLCBNVl9QSFlfUE9SVF9UWVBFIHBvcnRUeXBlLCBNVl9CT09MIGJvYXJkTWFjRW5hYmxlZDt9fSAqLworCXsgQk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBYU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDUsIDB4NSwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDQsIDB4NCwgU01JLCBNVl9UUlVFfSwKKwl7IEJPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgWFNNSSwgTVZfVFJVRX0KIH07CiAKIE1WX0JPQVJEX05FVF9DT01QTEVYX0lORk8gZGI4OGY2OXh4SW5mb0JvYXJOZXRDb21wbGV4SW5mb1tdID0gewpAQCAtMzMxLDcgKzM1MiwxMiBAQAogCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCiAJLm51bUlvRXhwCQkJPSAwLAogCS5wSW9FeHAJCQkJPSBOVUxMLAotCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRQorCS5ib2FyZE9wdGlvbnNNb2R1bGUJCT0gTVZfTU9EVUxFX05PX01PRFVMRSwKKwkvKiBBdWRpbyAqLworCS5pc0F1ZGlvQ29ubmVjdGVkCQk9IE1WX0ZBTFNFLAorCS5pc1RkbUNvbm5lY3RlZAkJCT0gTVZfRkFMU0UsCisJLnBTd2l0Y2hJbmZvCQkJPSBOVUxMLAorCS5zd2l0Y2hJbmZvTnVtCQkJPSAwCiB9OwogCiBNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQm9hcmRJbmZvVGJsW10gPSB7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYwppbmRleCBjOTRiMjg3Li42ZTc3ZDQxIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKQEAgLTExNywzOCArMTE3LDQ1IEBACiAjZGVmaW5lIE1WXzY4MTBfSU5ERVgJCTEKICNkZWZpbmUgTVZfNjgxMV9JTkRFWAkJMgogI2RlZmluZSBNVl82ODI4X0lOREVYCQkzCisjZGVmaW5lIE1WXzZXMjJfSU5ERVgJCTQgLyogNlcyMj1BMzgzICovCisjZGVmaW5lIE1WXzZXMjNfSU5ERVgJCTUgLyogNlcyMz1BMzg0ICovCiAKICNkZWZpbmUgTVZfNjkyMF9JTkRFWAkJMAogI2RlZmluZSBNVl82OTI4X0lOREVYCQkxCiAKLSNkZWZpbmUgTUFYX0RFVl9JRF9OVU0JCTQKKyNkZWZpbmUgTUFYX0RFVl9JRF9OVU0JCTYKIAogI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCiBNVl9VTklUX0lEIG12Q3RybFNvY1VuaXROdW1zW01BWF9VTklUU19JRF1bTUFYX0RFVl9JRF9OVU1dID0gewotLyoJCQkJNjgyMAk2ODEwCTY4MTEJNjgyOAkqLwotLyogRFJBTV9VTklUX0lEICAgICAqLwkJeyAxLAkxLAkxLAkxfSwKLS8qIFBFWF9VTklUX0lEICAgICAgKi8JCXsgNCwJMywJMywJNH0sCi0vKiBFVEhfR0lHX1VOSVRfSUQgICovCQl7IDMsCTIsCTIsCTN9LAkvKiB0b3RhbCBTb0MgTUFDIHVuaXQgY291bnQgKE5vdCB1cGRhdGVkKSAqLwotLyogRVRIX0dJR19BQ1RJVkVfVU5JVF9JRCAqLwl7IDMsCTIsCTIsCTN9LAkvKiBhY3RpdmUgTUFDIHVuaXQgY291bnQgKHVwZGF0ZWQgYnkgZXRoQ29tUGh5KSAqLwotLyogVVNCX1VOSVRfSUQgICAgICAqLwkJeyAxLAkxLAkwLAkxfSwKLS8qIFVTQjNfVU5JVF9JRCAgICAgKi8JCXsgMiwJMiwJMiwJMn0sCi0vKiBJRE1BX1VOSVRfSUQgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogWE9SX1VOSVRfSUQgICAgICAqLwkJeyAyLAkyLAkyLAkyfSwKLS8qIFNBVEFfVU5JVF9JRCAgICAgKi8JCXsgMiwJMiwJMiwJNH0sCi0vKiBURE1fMzJDSF9VTklUX0lEICovCQl7IDEsCTEsCTAsCTF9LAotLyogVUFSVF9VTklUX0lEICAgICAqLwkJeyA0LAk0LAk0LAk0fSwKLS8qIENFU0FfVU5JVF9JRCAgICAgKi8JCXsgMiwJMiwJMiwJMn0sCi0vKiBTUElfVU5JVF9JRCAgICAgICovCQl7IDIsCTIsCTIsCTJ9LAotLyogQVVESU9fVU5JVF9JRCAgICAqLwkJeyAxLAkxLAkwLAkxfSwKLS8qIFNESU9fVU5JVF9JRCAgICAgKi8JCXsgMSwJMSwJMSwJMX0sCi0vKiBUU19VTklUX0lEICAgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogWFBPTl9VTklUX0lEICAgICAqLwkJeyAwLAkwLAkwLAkwfSwKLS8qIEJNX1VOSVRfSUQgICAgICAgKi8JCXsgMCwJMCwJMCwJMH0sCi0vKiBQTkNfVU5JVF9JRCAgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogSTJDX1VOSVRfSUQgICAgICAqLwkJeyAyLAkyLAkyLAkyfSwKLS8qIFFTR01JSV9VTklUX0lEICAgKi8JCXsgMSwJMCwJMCwJMX0sCi0vKiBYQVVJX1VOSVRfSUQgICAgICovCQl7IDAsCTAsCTAsCTB9LAotLyogVVNCM19IT1NUX1VOSVRfSUQqLwkJeyAyLAkyLAkyLAkyfSwKKy8qCQkJCTY4MjAJNjgxMAk2ODExCTY4MjgJNlcyMgk2VzIzICovCisvKgkJCQlBMzg1CUEzODAJQTM4MS8yCUEzODgJQTM4MwlBMzg0ICovCisvKgkJCQl8PT09PT09PSBIVyBGbGF2b3JzID09PT09PT18CXw9PVZpcnR1YWw9PXwqLworLyogRFJBTV9VTklUX0lEICAgICAqLwkJeyAxLAkxLAkxLAkxLAkxLAkxfSwKKy8qIFBFWF9VTklUX0lEICAgICAgKi8JCXsgNCwJMywJMywJNCwJMiwJMn0sCisvKiBFVEhfR0lHX1VOSVRfSUQgICovCQl7IDMsCTIsCTIsCTMsCTIsCTJ9LAorLyoJRVRIX0dJR19VTklUX0lEIC0+IHRvdGFsIFNvQyBNQUMgdW5pdCBjb3VudCAoTm90IHVwZGF0ZWQpICovCisvKiBFVEhfR0lHX0FDVElWRV9VTklUX0lEICovCXsgMywJMiwJMiwJMywJMiwJMn0sCisvKglFVEhfR0lHX0FDVElWRV9VTklUX0lEIC0+IGFjdGl2ZSBNQUMgdW5pdCBjb3VudCAodXBkYXRlZCBieSBldGhDb21QaHkpICovCisvKiBVU0JfVU5JVF9JRCAgICAgICovCQl7IDEsCTEsCTAsCTEsCTEsCTF9LAorLyogVVNCM19VTklUX0lEICAgICAqLwkJeyAyLAkyLAkyLAkyLAkxLAkxfSwKKy8qIElETUFfVU5JVF9JRCAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBYT1JfVU5JVF9JRCAgICAgICovCQl7IDIsCTIsCTIsCTIsCTIsCTJ9LAorLyogU0FUQV9VTklUX0lEICAgICAqLwkJeyAyLAkyLAkyLAk0LAkxLAkxfSwKKy8qIFRETV8zMkNIX1VOSVRfSUQgKi8JCXsgMSwJMSwJMCwJMSwJMCwJMX0sCisvKiBVQVJUX1VOSVRfSUQgICAgICovCQl7IDQsCTQsCTQsCTQsCTEsCTF9LAorLyogQ0VTQV9VTklUX0lEICAgICAqLwkJeyAyLAkyLAkyLAkyLAkyLAkyfSwKKy8qIFNQSV9VTklUX0lEICAgICAgKi8JCXsgMiwJMiwJMiwJMiwJMiwJMn0sCisvKiBBVURJT19VTklUX0lEICAgICovCQl7IDEsCTEsCTAsCTEsCTAsCTF9LAorLyogU0RJT19VTklUX0lEICAgICAqLwkJeyAxLAkxLAkxLAkxLAkxLAkxfSwKKy8qIFRTX1VOSVRfSUQgICAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBYUE9OX1VOSVRfSUQgICAgICovCQl7IDAsCTAsCTAsCTAsCTAsCTB9LAorLyogQk1fVU5JVF9JRCAgICAgICAqLwkJeyAwLAkwLAkwLAkwLAkwLAkwfSwKKy8qIFBOQ19VTklUX0lEICAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBJMkNfVU5JVF9JRCAgICAgICovCQl7IDIsCTIsCTIsCTIsCTEsCTF9LAorLyogUVNHTUlJX1VOSVRfSUQgICAqLwkJeyAxLAkwLAkwLAkxLAkwLAkwfSwKKy8qIFhBVUlfVU5JVF9JRCAgICAgKi8JCXsgMCwJMCwJMCwJMCwJMCwJMH0sCisvKiBVU0IzX0hPU1RfVU5JVF9JRCovCQl7IDIsCTIsCTIsCTIsCTEsCTF9LAorLyogU0VSREVTX1VOSVRfSUQgICAqLwkJeyA2LAk1LAk0LAk2LAk0LAk0fSwKIH07CiAjZWxzZSAgLyogaWYgKENPTkZJR19BUk1BREFfMzlYKSAqLwogTVZfVU5JVF9JRCBtdkN0cmxTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01BWF9ERVZfSURfTlVNXSA9IHsKQEAgLTE3Niw2ICsxODMsNyBAQAogLyogUVNHTUlJX1VOSVRfSUQJCSovIHsgMCwJMX0sCiAvKiBYQVVJX1VOSVRfSUQJCQkqLyB7IDEsCTF9LAogLyogVVNCM19IT1NUX1VOSVRfSUQJCSovIHsgMSwJMn0sCisvKiBTRVJERVNfVU5JVF9JRAkJKi8geyA3LAk3fSwKIH07CiAjZW5kaWYKIApAQCAtMTg5LDYgKzE5NywxMCBAQAogI2RlZmluZSBTRVJERVNfUlhBVUkoeCkJCSgweDEwMCA8PCB4KQkvKiBiaXRzIDggICAgICAgOiBSWEFVSSBwb3J0IDAgaW5kaWNhdGlvbiAqLwogc3RhdGljIE1WX1UzMiBldGhDb21QaHk7CiAKKy8qIHVzYkNvbVBoeTogYml0IGRlc2NyaXB0aW9uIGZvciBVU0IgcG9ydCBwZXIgU2VyRGVzIExhbmUsCisgICBpZiBTZXJEZXMgbGFuZSBjb25uZWN0ZWQgdG8gVVNCIGhvc3QgI1gsIGVuYWJsZSBiaXQgI1ggdXNiQ29tUGh5ICovCitzdGF0aWMgTVZfVTMyIHVzYkNvbVBoeTsKKwogLyogT25seSB0aGUgZmlyc3QgdW5pdCwgb25seSB0aGUgc2Vjb25kIHVuaXQgb3IgYm90aCBjYW4gYmUgYWN0aXZlIG9uIHRoZSBzcGVjaWZpYyBib2FyZCAqLwogc3RhdGljIE1WX0JPT0wgc2F0YVVuaXRBY3RpdmVbTVZfU0FUQV9NQVhfVU5JVF0gPSB7TVZfRkFMU0UsIE1WX0ZBTFNFfTsKIApAQCAtMzAwLDYgKzMxMiw3IEBACiBNVl9VMzIgbXZDdHJsRGV2SWRJbmRleEdldChNVl9VMzIgY3RybE1vZGVsKQogewogCXN3aXRjaCAoY3RybE1vZGVsKSB7CisJLyogSFcgZmxhdm9ycyAqLwogCWNhc2UgTVZfNjgyMF9ERVZfSUQ6CiAJCXJldHVybiBNVl82ODIwX0lOREVYOwogCWNhc2UgTVZfNjgxMF9ERVZfSUQ6CkBAIC0zMTIsNiArMzI1LDExIEBACiAJCXJldHVybiBNVl82OTIwX0lOREVYOwogCWNhc2UgTVZfNjkyOF9ERVZfSUQ6CiAJCXJldHVybiBNVl82OTI4X0lOREVYOworCS8qIFZpcnR1YWwgZmxhdm9ycyAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCQlyZXR1cm4gTVZfNlcyMl9JTkRFWDsKKwljYXNlIE1WXzZXMjNfREVWX0lEOiAvKiA2VzIzPUEzODQgKi8KKwkJcmV0dXJuIE1WXzZXMjNfSU5ERVg7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIE1WXzY4MjBfSU5ERVg7CiAJfQpAQCAtNDEyLDcgKzQzMCwyNiBAQAogCX0gZWxzZQogCQlyZXR1cm4gc2VyZGVzTnVtOwogfQotCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkCisqCisqIERFU0NSSVBUSU9OOiBjaGVjayBpZiBTZXJEZXMgbGFuZSBpcyBjb25uZWN0ZWQgdG8gVVNCMyBob3N0LgorKgorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOnJldHVybiB0cnVlIGlmIFNlckRlcyBsYW5lIGlzIGNvbm5lY3RlZCB0byBVU0IzIGhvc3QsIGZhbHNlIG90aGVyd2lzZS4KKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkKE1WX1UzMiB1c2JQb3J0KQoreworCWlmICgoKHVzYkNvbVBoeSA+PiB1c2JQb3J0KSAmIDBYMSkgPT0gMSkKKwkJcmV0dXJuIE1WX1RSVUU7CisJcmV0dXJuIE1WX0ZBTFNFOworfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZDdHJsU2VyZGVzQ29uZmlnRGV0ZWN0CiAqCkBAIC00NDAsMTAgKzQ3Nyw4IEBACiAKIAlNVl9CT0FSRF9QRVhfSU5GTyAqYm9hcmRQZXhJbmZvID0gbXZCb2FyZFBleEluZm9HZXQoKTsKIAotCW1heFNlcmRlc0xhbmUgPSBNVl9TRVJERVNfTUFYX0xBTkVTOwotCWlmIChNVl82ODEwX0RFVl9JRCA9PSBtdkN0cmxNb2RlbEdldCgpKQotCQltYXhTZXJkZXNMYW5lID0gTVZfU0VSREVTX01BWF9MQU5FU182ODEwOwotCisJbWF4U2VyZGVzTGFuZSA9IG12Q3RybFNvY1VuaXRJbmZvTnVtR2V0KFNFUkRFU19VTklUX0lEKTsKKwl1c2JDb21QaHkgPSAwOwogCW1lbXNldChib2FyZFBleEluZm8sIDAsIHNpemVvZihNVl9CT0FSRF9QRVhfSU5GTykpOwogCWNvbW1QaHlDZmdSZWcgPSBNVl9SRUdfUkVBRChDT01NX1BIWV9TRUxFQ1RPUl9SRUcpOwogCURCKHByaW50ZigibXZDdHJsU2VyZGVzQ29uZmlnOiBjb21tUGh5Q2ZnUmVnPTB4JXhcbiIsIGNvbW1QaHlDZmdSZWcpKTsKQEAgLTQ1NiwxMiArNDkxLDE3IEBACiAJCWlmTm8gPSBjb21QaHlDZmcgJiAweDBmOwogCQlzd2l0Y2ggKGNvbVBoeUNmZyAmIDB4RjApIHsKIAkJY2FzZSBTRVJERVNfVU5JVF9QRVg6Ci0JCQlpZiAoKGlmTm8gPT0gUEVYMF9JRikgJiYgKGNvbW1QaHlDZmdSZWcgJiBQQ0lFMF9YNF9FTl9NQVNLKSkKLQkJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbaWZOb10gPSBQRVhfQlVTX01PREVfWDQ7Ci0JCQllbHNlCisJCQlpZiAoKGlmTm8gPT0gUEVYMF9JRikgJiYgKGNvbW1QaHlDZmdSZWcgJiBQQ0lFMF9YNF9FTl9NQVNLKSkgeworCQkJCWlmIChzZXJkZXNOdW0gPT0gMCkgeworCQkJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbaWZOb10gPSBQRVhfQlVTX01PREVfWDQ7CisJCQkJCWJvYXJkUGV4SW5mby0+cGV4TWFwcGluZ1tib2FyZFBleEluZm8tPmJvYXJkUGV4SWZOdW1dID0gaWZObzsKKwkJCQkJYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtKys7CisJCQkJfQorCQkJfSBlbHNlIHsKIAkJCQlib2FyZFBleEluZm8tPnBleFVuaXRDZmdbaWZOb10gPSBQRVhfQlVTX01PREVfWDE7Ci0JCQlib2FyZFBleEluZm8tPnBleE1hcHBpbmdbYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtXSA9IGlmTm87Ci0JCQlib2FyZFBleEluZm8tPmJvYXJkUGV4SWZOdW0rKzsKKwkJCQlib2FyZFBleEluZm8tPnBleE1hcHBpbmdbYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtXSA9IGlmTm87CisJCQkJYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtKys7CisJCQl9CiAJCQlEQihwcmludGYoIlBFWCwgaWY9JWRcbiIsIGlmTm8pKTsKIAkJCWJyZWFrOwogCQljYXNlIFNFUkRFU19VTklUX1NBVEE6CkBAIC00OTQsNiArNTM0LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIFNFUkRFU19VTklUX1VTQl9IOgogCQkJREIocHJpbnRmKCJVU0JfSCwgaWY9JWRcbiIsIGlmTm8pKTsKKwkJCXVzYkNvbVBoeSB8PSAwWDEgPDwgaWZObzsKIAkJCXVzYkhJZkNvdW50Kys7CiAJCQlicmVhazsKIAkJY2FzZSBTRVJERVNfVU5JVF9VU0I6CkBAIC01OTQsOCArNjM1LDEwIEBACiAJaWYgKCEobXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9OT1IpIHx8CiAJICAgIG12Qm9hcmRJc01vZHVsZUNvbm5lY3RlZChNVl9NT0RVTEVfTkFORCkgfHwKIAkJbXZCb2FyZElzTW9kdWxlQ29ubmVjdGVkKE1WX01PRFVMRV9OQU5EX09OX0JPQVJEKSB8fAotCQltdkN0cmxNb2RlbEdldCgpID09IE1WXzY4MTFfREVWX0lEKSkKLQkJZXRoQ29tUGh5IHw9IE9OX0JPQVJEX1JHTUlJKDEpOyAvKiBOT1IvTkFORCBtb2R1bGVzIG92ZXJpZGVzIFJHTUlJLTEgTVBQJ3MgKi8KKwkJbXZDdHJsTW9kZWxHZXQoKSA9PSBNVl82ODExX0RFVl9JRCB8fAorCQkobXZDdHJsTW9kZWxHZXQoKSA9PSBNVl82VzIyX0RFVl9JRCAmJiBtdkJvYXJkSWRHZXQoKSA9PSBEQl9CUF82ODIxX0lEKSkpIHsKKwkJCWV0aENvbVBoeSB8PSBPTl9CT0FSRF9SR01JSSgxKTsgLyogTk9SL05BTkQgbW9kdWxlcyBvdmVyaWRlcyBSR01JSS0xIE1QUCdzICovCisJCX0KIAogCW12Q3RybFNlcmRlc0NvbmZpZ0RldGVjdCgpOwogCkBAIC02NDAsOSArNjgzLDE0IEBACiAJLypTRElPIFBVUCBFbmFibGUgKEJJVDYpICovCiAJTVZfUkVHX0JJVF9TRVQoUFVQX0VOX1JFRywgQklUNik7CiAKKwkvKlNESU8gQ2xrIFBVUCBFbmFibGUgKEJJVDcpICovCisJTVZfUkVHX0JJVF9TRVQoUFVQX0VOX1JFRywgQklUNyk7CisKIAkvKiBTZGlvX2p0YWdfY2VsbF9vZV9zbXBfZW4gKi8KIAlNVl9SRUdfQklUX1NFVChQVVBfRU5fUkVHLCBCSVQxNCk7CiAKKwkvKiBTZGlvIENsayBqdGFnIGNlbGwgb2Ugc21wIGVuICovCisJTVZfUkVHX0JJVF9TRVQoUFVQX0VOX1JFRywgQklUMTUpOwogCiAJLyogWFhYOiBGb2xsb3dpbmcgc2V0dGluZyBzaG91bGQgYmUgY29uZmlndXJlZCBieSB1LWJvb3QgKi8KIAlNVl9SRUdfQklUX1NFVChTT0NfREVWX01VWF9SRUcsIEJJVDApOyAvKiBDb25maWd1cmUgTkFORCBmbHVzaCBlbmFibGVkICovCkBAIC03MDcsMTEgKzc1NSwyMyBAQAogTVZfVTMyIG12Q3RybGJvb3RTcmNHZXQodm9pZCkKIHsKIAlNVl9VMzIgc2F0clZhbCwgYm9vdFNyYzsKKwlNVl9VMzIgc2VjQm9vdEN0cmwgPSBNVl9SRUdfUkVBRChTRUNVUkVfQk9PVF9SRUcpOwogCi0Jc2F0clZhbCA9IE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQpOwotCWJvb3RTcmMgPSAoc2F0clZhbCAmIFNBVFJfQk9PVF9TUkNfTUFTSykgPj4gU0FUUl9CT09UX1NSQ19PRkZTOworCWlmICgoc2VjQm9vdEN0cmwgJiBTRUNVUkVfQk9PVF9FTkFfTUFTSykgIT0gMCkgeworCQkvKiBTZWN1cmUgbW9kZQorCQkgT25jZSB0aGUgc2VjdXJlIG1vZGUgYWN0aXZhdGVkIGJ5IGVmdXNlLCB0aGUgYWN0dWFsCisJCSBib290IGRldmljZSBpcyBhbHdheXMgdGFrZW4gZnJvbSB0aGUgZWZ1c2UgYnkgdGhlIEhXCisJCSBhbmQgYW55IG90aGVyIGJvb3QgZGV2aWNlIGNvbmZpZ3VyZWQgYnkgU2F0UiBpcyBpZ25vcmVkLgorCQkqLworCQlib290U3JjID0gKHNlY0Jvb3RDdHJsICYgU0VDVVJFX0JPT1RfREVWSUNFX01BU0spID4+IFNFQ1VSRV9CT09UX0RFVklDRV9PRkZTOworCX0gZWxzZSB7CiAKLQlEQihtdk9zUHJpbnRmKCIlczogUmVhZCBmcm9tIFNAUiBCT09UU1JDID0gMHglWFxuIiwgX19mdW5jX18sIGJvb3RTcmMpKTsKKwkJc2F0clZhbCA9IE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQpOworCQlib290U3JjID0gKHNhdHJWYWwgJiBTQVRSX0JPT1RfU1JDX01BU0spID4+IFNBVFJfQk9PVF9TUkNfT0ZGUzsKKworCQlEQihtdk9zUHJpbnRmKCIlczogUmVhZCBmcm9tIFNAUiBCT09UU1JDID0gMHglWFxuIiwgX19mdW5jX18sIGJvb3RTcmMpKTsKKwl9CisKIAlyZXR1cm4gYm9vdFNyYzsKIH0KIApAQCAtMTI5NiwxMiArMTM1NiwxNiBAQAogCU1WX1UzMiBkZWZhdWx0Q3RybElkLCBjdHJsSWQgPSAoTVZfUkVHX1JFQUQoREVWX0lEX1JFRykgJiAoREVWSUNFX0lEX01BU0spKSA+PiBERVZJQ0VfSURfT0ZGUzsKIAogCXN3aXRjaCAoY3RybElkKSB7CisJLyogSFcgZmxhdm9ycyAqLwogCWNhc2UgTVZfNjgyMF9ERVZfSUQ6CiAJY2FzZSBNVl82ODEwX0RFVl9JRDoKIAljYXNlIE1WXzY4MTFfREVWX0lEOgogCWNhc2UgTVZfNjgyOF9ERVZfSUQ6CiAJY2FzZSBNVl82OTIwX0RFVl9JRDoKIAljYXNlIE1WXzY5MjhfREVWX0lEOgorCS8qIFZpcnR1YWwgZmxhdm9ycyAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCWNhc2UgTVZfNlcyM19ERVZfSUQ6IC8qIDZXMjM9QTM4NCAqLwogCQlyZXR1cm4gY3RybElkOwogCWRlZmF1bHQ6CiAJCS8qRGV2aWNlIElEIERlZmF1bHQgZm9yIEEzOHg6IDY4MjAgLCBmb3IgQTM5eDogNjkyMCAqLwpAQCAtMTMzMiw2ICsxMzk2LDcgQEAKIE1WX1UxNiBtdkN0cmxEZXZpY2VJZEdldChNVl9WT0lEKQogewogCXN3aXRjaCAobXZDdHJsTW9kZWxHZXQoKSkgeworCS8qIEhXIGZsYXZvcnMgKi8KIAljYXNlIE1WXzY4MTBfREVWX0lEOgogCQlyZXR1cm4gMHgzODA7CiAJY2FzZSBNVl82ODExX0RFVl9JRDoKQEAgLTEzNDAsNiArMTQwNSwxMSBAQAogCQlyZXR1cm4gMHgzODU7CiAJY2FzZSBNVl82ODI4X0RFVl9JRDoKIAkJcmV0dXJuIDB4Mzg4OworCS8qIFZpcnR1YWwgZmxhdm9ycyAqLworCWNhc2UgTVZfNlcyMl9ERVZfSUQ6IC8qIDZXMjI9QTM4MyAqLworCQlyZXR1cm4gMHgzODM7CisJY2FzZSBNVl82VzIzX0RFVl9JRDogLyogNlcyMz1BMzg0ICovCisJCXJldHVybiAweDM4NDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMHgzODA7CS8qIHVzZSBsb3dlciBkZXZpY2UgYXMgZGVmYXVsdCBpbiBjYXNlIG9mIGVycm9yICovCiAJfQpAQCAtMTM4OCw3ICsxNDU4LDE2IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12Q3RybE5hbWVHZXQoY2hhciAqcE5hbWVCdWZmKQogewotCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiVzJXgiLCBTT0NfTkFNRV9QUkVGSVgsIG12Q3RybE1vZGVsR2V0KCkpOworCU1WX1UxNiBjdHJsTW9kZWwgPSBtdkN0cmxNb2RlbEdldCgpOworCS8qIFZpcnR1YWwgRmxhdm9ycyBoYXMgZGlmZmVyZW50IGN0cmxNb2RlbCB2YWx1ZXMgdGhhbgorCSAqIGl0J3MgQ29udHJvbGxlciBuYW1lczogNlcyMjogMHg2ODIzIHwgNlcyMzogMHg2ODI0ICovCisJaWYgKGN0cmxNb2RlbCA9PSBNVl82VzIyX0RFVl9JRCkKKwkJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiJXMlcyIsIFNPQ19OQU1FX1BSRUZJWCwgTVZfNlcyMl9ERVZfTkFNRSk7CisJZWxzZSBpZiAoY3RybE1vZGVsID09IE1WXzZXMjNfREVWX0lEKQorCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIlcyVzIiwgU09DX05BTUVfUFJFRklYLCBNVl82VzIzX0RFVl9OQU1FKTsKKwllbHNlCisJCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiVzJXgiLCBTT0NfTkFNRV9QUkVGSVgsIGN0cmxNb2RlbCk7CisKIAlyZXR1cm4gTVZfT0s7CiB9CiAKQEAgLTIxNDYsOCArMjIyNSwxNCBAQAogCU1WXzMyIHJlZyA9IDA7CiAKIAkvKiBJbml0aWF0ZXMgVFNFTiBoYXJkd2FyZSByZXNldCBvbmNlICovCi0JaWYgKChNVl9SRUdfUkVBRChUU0VOX0NPTkZfUkVHKSAmIFRTRU5fQ09ORl9SU1RfTUFTSykgPT0gMCkKLQkJTVZfUkVHX0JJVF9TRVQoVFNFTl9DT05GX1JFRywgVFNFTl9DT05GX1JTVF9NQVNLKTsKKwlpZiAoKE1WX1JFR19SRUFEKFRTRU5fQ09OVFJPTF9NU0JfUkVHKSAmIFRTRU5fQ09OVFJPTF9NU0JfUlNUX01BU0spID09IDApIHsKKwkJTVZfUkVHX0JJVF9TRVQoVFNFTl9DT05UUk9MX01TQl9SRUcsIFRTRU5fQ09OVFJPTF9NU0JfUlNUX01BU0spOworCQkvKiBzZXQgVHNlbiBUYyBUcmltIHRvIGNvcnJlY3QgZGVmYXVsdCB2YWx1ZSAoZXJyYXRhICMxMzI2OTgpICovCisJCXJlZyA9IE1WX1JFR19SRUFEKFRTRU5fQ09OVFJPTF9MU0JfUkVHKTsKKwkJcmVnICY9IH5UU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fTUFTSzsKKwkJcmVnIHw9IDB4MyA8PCBUU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fT0ZGU0VUOworCQlNVl9SRUdfV1JJVEUoVFNFTl9DT05UUk9MX0xTQl9SRUcsIHJlZyk7CisJfQogCW12T3NEZWxheSgxMCk7CiAKIAkvKiBDaGVjayBpZiB0aGUgcmVhZG91dCBmaWVsZCBpcyB2YWxpZCAqLwpAQCAtMjE1OCw4ICsyMjQzLDkgQEAKIAlyZWcgPSBNVl9SRUdfUkVBRChUU0VOX1NUQVRVU19SRUcpOwogCXJlZyA9IChyZWcgJiBUU0VOX1NUQVRVU19URU1QX09VVF9NQVNLKSA+PiBUU0VOX1NUQVRVU19URU1QX09VVF9PRkZTRVQ7CiAKLQlyZXR1cm4gKCgoKDEwMDAwICogcmVnKSAvIDIxNDQ1KSAqIDEwMDApIC0gMjcyNjc0KSAvIDEwMDA7CisJcmV0dXJuICgoNDc2MSAqIHJlZykgLSAyNzkxMDAwKSAvIDEwMDAwOwogfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxOYW5kQ2xrU2V0CiAqCkBAIC0yMjE4LDY2ICsyMzA0LDIxIEBACiAqIG12Q3RybFVzYk1hcEdldAogKgogKiBERVNDUklQVElPTjoKLSogICAgICAgR2V0IHRoZSBtYXAgb2YgVVNCIHBvcnRzIGlmIGV4aXN0cworKglDb250cm9sbGVyIFVTQiBtYXBwaW5nIGlzIG5vdCB2YWxpZCBmb3IgQTM4eC9hMzl4IFBvcnQgYXJlIG1hcHBlZCBwZXIgYm9hcmQgdmlhIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQuCiAqCiAqIElOUFVUOgogKgl0aGUgY3VycmVudCBVU0IgdW5pdChVU0IzLjAgb3IgVVNCMi4wKQogKgl0aGUgY3VycmVudCB1c2JBY3RpdmUobm90IHVzZWQsIHJlbGV2YW50IGZvciBvdGhlciBTb0MpCiAqCiAqIE9VVFBVVDoKLSogICAgICAgTWFwcGVkIHVzYkFjdGl2ZS4KKyoJTWFwcGVkIHVzYkFjdGl2ZS4KICoKICogUkVUVVJOOgogKiAgICAgICBOb25lCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12Q3RybFVzYk1hcEdldChNVl9VMzIgdXNiVW5pdElkLCBNVl9VMzIgdXNiQWN0aXZlKQogewotCU1WX1UzMiBsYW5lNUNmZywgbGFuZTNDZmcsIHBoeVNlbGVjdG9yOwotCi0JLyogT24gQTM5eCBhbmQgQTM4eCBBMCByZXZpc2lvbiwgdGhlcmUgYXJlIDIgVVNCMy4wIE1BQ3MsIGFuZCB0aGUgY29ubmVjdGl2aXR5IG9mIHRoZQotCSAgIFVTQjMuMCBkZXBlbmRzIG9uIHRoZSBTZXJEZXMgY29uZmlndXJhdGlvbjoKLQkJMiBTZXJEZXMgbGFuZXMgZm9yIFVTQjMuMDoKLQkJfCB1c2JBY3RpdmUJfCAgVVNCIHBvcnQJCXwKLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJfAkwCXwgVVNCMy4wIEhvc3QgUG9ydCAjMAl8Ci0JCXwJMQl8IFVTQjMuMCBIb3N0IFBvcnQgIzEJfAotCi0JCXNpbmdsZSBTZXJEZXMgbGFuZSM1IE9yIHNpbmdsZSBTZXJEZXMgbGFuZSMzIGZvciBVU0IzLjAKLQkJfCB1c2JBY3RpdmUJfCAgVVNCIHBvcnQJCQkJfAotCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJfAkwCXwgVVNCMy4wIEhvc3QgUG9ydCAjMQkJCXwKLQkJfAkxCXwgVVNCMi4wIHZpYSBVU0IzLjAgIEhvc3QgUG9ydCAjMAl8Ci0KLQkJV2hlbiBvbmx5IHNpbmdsZSBVU0IzLjAgSG9zdCBwb3J0ICMxIGlzIGNvbm5lY3RlZCB2aWEgU2VyRGVzIExhbmUgMyBvciA1LAotCQltYXAgdGhlIFVTQiBwb3J0ICMxIHRvIGJlIHVzYkFjdGl2ZT0wCi0JCSovCi0KLQkvKiBpZiBhMzh4IFowIHJldiwgcmV0dXJuIG9yaWdpbmFsIG1hcHBpbmcgKi8KLQlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfODhGNjhYWCAmJiBtdkN0cmxSZXZHZXQoKSA9PSBNVl84OEY2OFhYX1oxX0lEKQotCQlyZXR1cm4gdXNiQWN0aXZlOwotCi0JLyogaWYgb25seSBzaW5nbGUgVVNCMy4wIFNlckRlcywgdmlhIExhbmU1IG9yIHZpYSBsYW5lMyAqLwotCWlmICh1c2JVbml0SWQgPT0gVVNCM19VTklUX0lEICYmIG12Q3RybFVzYjNNYXhHZXQoKSA9PSAxKSB7Ci0JCXBoeVNlbGVjdG9yID0gTVZfUkVHX1JFQUQoQ09NTV9QSFlfU0VMRUNUT1JfUkVHKTsKLQkJbGFuZTVDZmcgPSAocGh5U2VsZWN0b3IgJiBDT01QSFlfU0VMRUNUX01BU0soNSkpID4+IENPTVBIWV9TRUxFQ1RfT0ZGUyg1KTsKLQkJbGFuZTNDZmcgPSAocGh5U2VsZWN0b3IgJiBDT01QSFlfU0VMRUNUX01BU0soMykpID4+IENPTVBIWV9TRUxFQ1RfT0ZGUygzKTsKLQkJaWYgKGxhbmU1Q2ZnID09IENPTVBIWV9TRUxFQ1RfTEFORTVfVVNCM19WQUwgfHwKLQkJCWxhbmUzQ2ZnID09IENPTVBIWV9TRUxFQ1RfTEFORTNfVVNCM19WQUwpCi0JCQlyZXR1cm4gMSAtIHVzYkFjdGl2ZTsKLQl9Ci0jaWZkZWYgQ09ORklHX0FSTUFEQV8zOVgKLQkvKiB0ZW1wb3JlcnkgZml4IGZvciBBMzl4OgotCSAgIEluIG9yZGVyIHRvIGtlZXAgdGhlIHNhbWUgVVNCIG1hcHBpbmcgZm9yIHhIQ0kgdXNhZ2UsCi0JICAgbmV2ZXJtaW5kIGlmIHBvcnQgaXMgY29ubmVjdGVkIHdpdGggU2VyRGVzIGxhbmUsIG9yIHdpdGhvdXQsCi0JICAgcmV0dXJuIHRoZSBzYW1lIG1hcHBpbmcgZm9yIGFsbCB4SENJL1VTQjMuMCB1c2FnZS4KLQlUT0RPOiByZW1vdmUgVVNCIG1hcHBpbmcgYW5kIHVzZSBVU0IgYm9hcmQgc3RydWN0cmUgaW5mb3JtYXRpb24gKi8KLQlpZiAodXNiVW5pdElkID09IFVTQjNfVU5JVF9JRCkKLQkJcmV0dXJuIDEgLSB1c2JBY3RpdmU7Ci0jZW5kaWYKLQkvKiBJZiBBMzl4IG9yIEEzOHggQTAgcmV2LCBidXQgdGhlIG5vIG1hcHBpbmcgbmVlZGVkOgotCSAqIC0gc2luZ2xlIFVTQiMwIGluIHVzZQotCSAqIC0gYm90aCBVU0IgdW5pdHMgYXJlIGluIHVzZSAqLwotCisJLypObyBjb250cm9sbGVyIHBvcnQgbWFwcGluZyBmb3IgYTM4eC9hMzl4Ki8KIAlyZXR1cm4gdXNiQWN0aXZlOwogfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAppbmRleCBmMjJhOWJlLi4xNDBiMjRjIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmgKQEAgLTEyNiwxMyArMTI2LDEzIEBACiAvKiBMYW5lIDAgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfU0FUQSB8IDAsCVNFUkRFU19VTklUX0dCRSAgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUsCQlTRVJERVNfVU5JVF9OQSwJCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsCQkgICBTRVJERVNfVU5JVF9OQX0sICAgICBcCi0vKiBMYW5lIDEgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDAsXAorLyogTGFuZSAxICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsCVNFUkRFU19VTklUX1NBVEEgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAwLAlTRVJERVNfVU5JVF9HQkUgfCAxLAkgICBTRVJERVNfVU5JVF9VU0JfSCB8IDAsCVNFUkRFU19VTklUX1FTR01JSSB8IDAsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDAsCVNFUkRFU19VTklUX0dCRSB8IDAsCSAgIFNFUkRFU19VTklUX05BfSwgICAgIFwKLS8qIExhbmUgMiAqLyB7U0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9QRVggfCBQRVgxX0lGLCBTRVJERVNfVU5JVF9QRVggfCBQRVgyX0lGLAlTRVJERVNfVU5JVF9TQVRBIHwgMSxcCisvKiBMYW5lIDIgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDEsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDEsCVNFUkRFU19VTklUX0dCRSB8IDEsCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsICAgICAgICAgICAgU0VSREVTX1VOSVRfTkF9LCAgICAgXAotLyogTGFuZSAzICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsICBTRVJERVNfVU5JVF9TQVRBIHwgMyxcCisvKiBMYW5lIDMgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYM19JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgIFNFUkRFU19VTklUX1NBVEEgfCAzLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAyLAlTRVJERVNfVU5JVF9VU0JfSCB8IDEsICAgICBTRVJERVNfVU5JVF9VU0IsICAgICAgICAgICAgU0VSREVTX1VOSVRfR0JFIHwgMixcCiAJICAgICAgU0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9OQSwgICAgICAgICAgICBTRVJERVNfVU5JVF9OQX0sICAgICBcCiAvKiBMYW5lIDQgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwgU0VSREVTX1VOSVRfTkEsICAgICAgICAgICAgIFNFUkRFU19VTklUX0dCRSAgfCAxLFwKQEAgLTE0NywxMyArMTQ3LDEzIEBACiAvKiBMYW5lIDAgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfU0FUQSB8IDAsCVNFUkRFU19VTklUX0dCRSAgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUsCQlTRVJERVNfVU5JVF9OQSwJCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsCQkgICBTRVJERVNfVU5JVF9OQX0sICAgICBcCi0vKiBMYW5lIDEgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDAsXAorLyogTGFuZSAxICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDBfSUYsCVNFUkRFU19VTklUX1NBVEEgfCAwLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAwLAlTRVJERVNfVU5JVF9HQkUgfCAxLAkgICBTRVJERVNfVU5JVF9VU0JfSCB8IDAsCVNFUkRFU19VTklUX1FTR01JSSB8IDAsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDAsCVNFUkRFU19VTklUX0dCRSB8IDAsCSAgIFNFUkRFU19VTklUX05BfSwgICAgIFwKLS8qIExhbmUgMiAqLyB7U0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9QRVggfCBQRVgxX0lGLCBTRVJERVNfVU5JVF9QRVggfCBQRVgyX0lGLAlTRVJERVNfVU5JVF9TQVRBIHwgMSxcCisvKiBMYW5lIDIgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYMV9JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwJU0VSREVTX1VOSVRfU0FUQSB8IDEsXAogCSAgICAgIFNFUkRFU19VTklUX0dCRSB8IDEsCVNFUkRFU19VTklUX0dCRSB8IDEsCSAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsXAogCSAgICAgIFNFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfTkEsICAgICAgICAgICAgU0VSREVTX1VOSVRfTkF9LCAgICAgXAotLyogTGFuZSAzICovIHtTRVJERVNfVU5JVF9OQSwJCVNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsIFNFUkRFU19VTklUX1BFWCB8IFBFWDNfSUYsICBTRVJERVNfVU5JVF9TQVRBIHwgMyxcCisvKiBMYW5lIDMgKi8ge1NFUkRFU19VTklUX05BLAkJU0VSREVTX1VOSVRfUEVYIHwgUEVYM19JRiwgU0VSREVTX1VOSVRfUEVYIHwgUEVYMF9JRiwgIFNFUkRFU19VTklUX1NBVEEgfCAzLFwKIAkgICAgICBTRVJERVNfVU5JVF9HQkUgfCAyLAlTRVJERVNfVU5JVF9VU0JfSCB8IDEsICAgICBTRVJERVNfVU5JVF9VU0IsICAgICAgICAgICAgU0VSREVTX1VOSVRfR0JFIHwgMixcCiAJICAgICAgU0VSREVTX1VOSVRfWEFVSSB8IDMsCVNFUkRFU19VTklUX05BLCAgICAgICAgICAgIFNFUkRFU19VTklUX05BfSwgICAgIFwKIC8qIExhbmUgNCAqLyB7U0VSREVTX1VOSVRfTkEsCQlTRVJERVNfVU5JVF9QRVggfCBQRVgxX0lGLCBTRVJERVNfVU5JVF9OQSwgICAgICAgICAgICAgU0VSREVTX1VOSVRfR0JFICB8IDEsXApAQCAtMTcwLDEzICsxNzAsMTMgQEAKIAogCiAvKiBUZXJtYWwgU2Vuc29yIFJlZ2lzdGVycyAqLwotI2RlZmluZSBUU0VOX1NUQVRFX1JFRwkJCQkJCTB4RTQwNzAKLSNkZWZpbmUgVFNFTl9TVEFURV9PRkZTRVQJCQkJCTMxCi0jZGVmaW5lIFRTRU5fU1RBVEVfTUFTSwkJCQkJCSgweDEgPDwgVFNFTl9TVEFURV9PRkZTRVQpCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfUkVHCQkJCQkweEU0MDcwCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQJCQkJMAorI2RlZmluZSBUU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fTUFTSwkJCQkoMHg3IDw8IFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQpCiAKLSNkZWZpbmUgVFNFTl9DT05GX1JFRwkJCQkJCTB4RTQwNzQKLSNkZWZpbmUgVFNFTl9DT05GX1JTVF9PRkZTRVQJCQkJCTgKLSNkZWZpbmUgVFNFTl9DT05GX1JTVF9NQVNLCQkJCQkoMHgxIDw8IFRTRU5fQ09ORl9SU1RfT0ZGU0VUKQorI2RlZmluZSBUU0VOX0NPTlRST0xfTVNCX1JFRwkJCQkJMHhFNDA3NAorI2RlZmluZSBUU0VOX0NPTlRST0xfTVNCX1JTVF9PRkZTRVQJCQkJOAorI2RlZmluZSBUU0VOX0NPTlRST0xfTVNCX1JTVF9NQVNLCQkJCSgweDEgPDwgVFNFTl9DT05UUk9MX01TQl9SU1RfT0ZGU0VUKQogCiAjZGVmaW5lIFRTRU5fU1RBVFVTX1JFRwkJCQkJCTB4RTQwNzgKICNkZWZpbmUgVFNFTl9TVEFUVVNfUkVBRE9VVF9WQUxJRF9PRkZTRVQJCQkxMApAQCAtMjA5LDYgKzIwOSw3IEBACiBNVl9CT09MIG12Q3RybFNTQ0dJbml0KHZvaWQpOwogTVZfQk9PTCBtdkN0cmxQb3J0SXNTZXJkZXNTZ21paShNVl9VMzIgZXRoUG9ydCk7CiBNVl9CT09MIG12Q3RybFBvcnRJc1NlcmRlc1J4YXVpKE1WX1UzMiBldGhQb3J0KTsKK01WX0JPT0wgbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQoTVZfVTMyIHVzYlBvcnQpOwogTVZfQk9PTCBtdkN0cmxQb3J0SXNSZ21paShNVl9VMzIgZXRoUG9ydCk7CiBNVl9VMzIgbXZDdHJsR2V0Q3B1TnVtKE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybERldklkSW5kZXhHZXQoTVZfVTMyIGN0cmxNb2RlbCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlJlZ3MuaCBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oCmluZGV4IGEzMGViM2MuLjJiNGM5NGEgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oCkBAIC0yMjgsNiArMjI4LDE1IEBACiAjZGVmaW5lIEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDFfUkVHCQkweDE4MkU0CiAjZGVmaW5lIEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDFfREVGQVVMVF9WQUxVRQkofkJJVDE3KQogCisvKioqKioqKioqKioqKioqKiovCisvKiBTZWN1cmUgYm9vdCAqLworLyoqKioqKioqKioqKioqKioqLworI2RlZmluZSBTRUNVUkVfQk9PVF9SRUcJCQkJMHgxODI4MAorI2RlZmluZSBTRUNVUkVfQk9PVF9FTkFfT0ZGUwkJCTAKKyNkZWZpbmUgU0VDVVJFX0JPT1RfRU5BX01BU0sJCQkoMSA8PCBTRUNVUkVfQk9PVF9FTkFfT0ZGUykKKyNkZWZpbmUgU0VDVVJFX0JPT1RfREVWSUNFX09GRlMJCQk4CisjZGVmaW5lIFNFQ1VSRV9CT09UX0RFVklDRV9NQVNLCQkJKDB4RkYgPDwgU0VDVVJFX0JPT1RfREVWSUNFX09GRlMpCisKIC8qIFVTQjMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE1WX1VTQjNfV0lOX0JBU0UoZGV2KQkJKE1WX1VTQjNfUkVHU19CQVNFKGRldikgKyAweDQwMDApCiAKQEAgLTM2OSw2ICszNzgsNyBAQAogCU1WX1UzMiBkZHJGcmVxOwogCU1WX1UzMiBsMkZyZXE7CiAJTVZfQk9PTAlpc0Rpc3BsYXk7CisJTVZfQk9PTCBpc0xpbWl0ZWQ7CiB9IE1WX0ZSRVFfTU9ERTsKIAogLyogRW5kIG9mIFRhYmxlIGluZGljYXRvciAtIFNob3VsZCBiZSBpbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBTQVIgVGFibGUgKi8KQEAgLTM3OSwzMSArMzg5LDM3IEBACiAKICNpZmRlZiBDT05GSUdfRERSNAogI2RlZmluZSBNVl9TQVJfRlJFUV9NT0RFUyB7IFwKLQkJeyAweDYsICAgMTIwMCwgNjAwLCA2MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDgsICAgMTMzMiwgNjY2LCA2NjYsIE1WX1RSVUUgIH0sIFwKLQkJeyAweEMsICAgMTYwMCwgODAwLCA4MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDEyLCAgMTgwMCwgOTAwLCA5MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyBNVl9TQVJfRlJFUV9NT0RFU19FT1QsICAwLCAgICAwLCAgIDAsIE1WX0ZBTFNFIH0gXAorCQkvKklELAkgQ1BVLCAgRERSLCAgTEAsICBpc0Rpc2FwbHk/LCBpc0xpbWl0ZWQ/ICovXAorCQl7IDB4NiwgICAxMjAwLCA2MDAsICA2MDAsICBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4OCwgICAxMzMyLCA2NjYsICA2NjYsICBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4QywgICAxNjAwLCA4MDAsICA4MDAsICBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4MTAsICAxODY2LCA5MzMsICA5MzMsICBNVl9UUlVFICAsIE1WX1RSVUV9LCBcCisJCXsgMHgxMywgIDIwMDAsIDkzMywgIDEwMDAsICBNVl9UUlVFICAsIE1WX1RSVUV9LCBcCisJCXsgTVZfU0FSX0ZSRVFfTU9ERVNfRU9ULCAgMCwgICAgMCwgICAwLCBNVl9GQUxTRSwgTVZfRkFMU0UgfSBcCiB9OwogCiAjZWxzZQogI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCiAjZGVmaW5lIE1WX1NBUl9GUkVRX01PREVTIHsgXAotCQl7IDB4MCwgICA2NjYsICAzMzMsIDMzMywgTVZfVFJVRSAgfSwgXAotCQl7IDB4MiwgICA4MDAsICA0MDAsIDQwMCwgTVZfVFJVRSAgfSwgXAotCQl7IDB4NCwgICAxMDY2LCA1MzMsIDUzMywgTVZfVFJVRSAgfSwgXAotCQl7IDB4NiwgICAxMjAwLCA2MDAsIDYwMCwgTVZfVFJVRSAgfSwgXAotCQl7IDB4OCwgICAxMzMyLCA2NjYsIDY2NiwgTVZfVFJVRSAgfSwgXAotCQl7IDB4QywgICAxNjAwLCA4MDAsIDgwMCwgTVZfVFJVRSAgfSwgXAotCQl7IE1WX1NBUl9GUkVRX01PREVTX0VPVCwgIDAsICAgIDAsICAgMCwgTVZfRkFMU0UgfSBcCisJCS8qSUQsCSBDUFUsICBERFIsICBMMiwgIGlzRGlzYXBseT8sIGlzTGltaXRlZD8gKi9cCisJCXsgMHgwLCAgIDY2NiwgIDMzMywgIDMzMywgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHgyLCAgIDgwMCwgIDQwMCwgIDQwMCwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg0LCAgIDEwNjYsIDUzMywgIDUzMywgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg2LCAgIDEyMDAsIDYwMCwgIDYwMCwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg4LCAgIDEzMzIsIDY2NiwgIDY2NiwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHhDLCAgIDE2MDAsIDgwMCwgIDgwMCwgIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHgxMCwgIDE4NjYsIDkzMywgIDkzMywgIE1WX1RSVUUgICwgTVZfVFJVRX0sIFwKKwkJeyAweDEzLCAgMjAwMCwgOTMzLCAgMTAwMCwgIE1WX1RSVUUgICwgTVZfVFJVRX0sIFwKKwkJeyBNVl9TQVJfRlJFUV9NT0RFU19FT1QsICAwLCAgICAwLCAgIDAsIE1WX0ZBTFNFLCBNVl9GQUxTRSB9IFwKIH07CiAjZWxzZQogI2RlZmluZSBNVl9TQVJfRlJFUV9NT0RFUyB7IFwKLQkJeyAweDQsICAgMTA2NiwgNTMzLCA1MzMsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDYsICAgMTIwMCwgNjAwLCA2MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyAweDgsICAgMTMzMiwgNjY2LCA2NjYsIE1WX1RSVUUgIH0sIFwKLQkJeyAweEMsICAgMTYwMCwgODAwLCA4MDAsIE1WX1RSVUUgIH0sIFwKLQkJeyBNVl9TQVJfRlJFUV9NT0RFU19FT1QsICAwLCAgICAwLCAgIDAsIE1WX0ZBTFNFIH0gXAorCQkvKklELAkgQ1BVLCAgRERSLCAgTEAsIGlzRGlzYXBseT8saXNMaW1pdGVkPyAqL1wKKwkJeyAweDQsICAgMTA2NiwgNTMzLCA1MzMsIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgMHg2LCAgIDEyMDAsIDYwMCwgNjAwLCBNVl9UUlVFICAsIE1WX0ZBTFNFfSwgXAorCQl7IDB4OCwgICAxMzMyLCA2NjYsIDY2NiwgTVZfVFJVRSAgLCBNVl9GQUxTRX0sIFwKKwkJeyAweEMsICAgMTYwMCwgODAwLCA4MDAsIE1WX1RSVUUgICwgTVZfRkFMU0V9LCBcCisJCXsgTVZfU0FSX0ZSRVFfTU9ERVNfRU9ULCAgMCwgICAgMCwgICAwLCBNVl9GQUxTRSwgTVZfRkFMU0V9IFwKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZTcGVjLmggYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaAppbmRleCA0MWU3NWI3Li5lMWYwZDRjIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaAorKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaApAQCAtMTE4LDExICsxMTgsMTQgQEAKIAkJCQkJCShNVl9FVEhfQkFTRV9BRERSX1BPUlQxXzIgKyAoKChwKSAtIDEpICogMHg0MDAwKSkpCiAjZGVmaW5lIE1WX0VUSF9TR01JSV9QSFlfUkVHU19PRkZTRVQocCkJCShNVl9FVEhfUkVHU19PRkZTRVQocCkrMHgyMDAwKQogCisjZGVmaW5lIE1WX1RETV9PRkZTRVQJCQkJKDB4QjAwMDApCiAjZGVmaW5lIE1WX1BFWF9JRl9SRUdTX09GRlNFVChwZXhJZikgICAgICAgICAgICAoKChwZXhJZikgPT0gMCkgPyAweDgwMDAwIDogKDB4NDAwMDAgKyAoKHBleElmLTEpICogMHg0MDAwKSkpCiAjZGVmaW5lIE1WX1VTQl9SRUdTX09GRlNFVChkZXYpICAgICAgICAgICAgICAgICAoMHg1ODAwMCkKICNkZWZpbmUgTVZfVVNCM19SRUdTX09GRlNFVChkZXYpICAgICAgICAgICAgICAgICgweEYwMDAwICsgKGRldiAqIDB4ODAwMCkpCiAjZGVmaW5lIE1WX1VTQjJfVVNCM19SRUdTX09GRlNFVCh1bml0VHlwZSwgZGV2KSAodW5pdFR5cGUgPT0gVVNCX1VOSVRfSUQgPyBcCiAJCQkJCQkJTVZfVVNCX1JFR1NfT0ZGU0VUKGRldikgOiBNVl9VU0IzX1JFR1NfT0ZGU0VUKGRldikpCisjZGVmaW5lIE1WX1VTQjNfREVWSUNFX1JFR1NfT0ZGU0VUCQkoMHg1MDAwMCkKKyNkZWZpbmUgTVZfVVNCM19ERVZJQ0VfVVNCMl9SRUdTX09GRlNFVAkJKDB4NTQxMDApCiAjZGVmaW5lIE1WX1hPUl9SRUdTX09GRlNFVCh1bml0KSAgICAgICAgICAgICAgICAoMHg2MDgwMCArICh1bml0KSoweDEwMCkKICNkZWZpbmUgTVZfQ0VTQV9URE1BX1JFR1NfT0ZGU0VUKGNoYW5OdW0pICAgICAgICgweDkwMDAwICsgKGNoYW5OdW0gKiAweDIwMDApKQogI2RlZmluZSBNVl9DRVNBX1JFR1NfT0ZGU0VUKGNoYW5OdW0pICAgICAgICAgICAgKDB4OUQwMDAgKyAoY2hhbk51bSAqIDB4MjAwMCkpCkBAIC0xMzMsNiArMTM2LDcgQEAKICNkZWZpbmUgTVZfTkZDX1JFR1NfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICgweEQwMDAwKQogI2RlZmluZSBNVl9TRE1NQ19SRUdTX09GRlNFVAkJCSgweEQ4MDAwKQogI2RlZmluZSBNVl9TRE1NQ19XSU5ET1dTX1JFR1NfT0ZGU0VUCQkoMHhEQzAwMCkKKyNkZWZpbmUgTVZfQVVESU9fT0ZGU0VUCQkJCSgweEU4MDAwKQogCiAjZGVmaW5lIFNBVEEzX05VTV9PRl9QT1JUUwkJCTIKICNkZWZpbmUgU0FUQTNfTUFYX1BPUlRTX1BFUl9VTklUCQkyCkBAIC0yMzksNiArMjQzLDcgQEAKICNkZWZpbmUgTVZfRVRIX01BWF9SWFEJCQkJOAogI2RlZmluZSBNVl9FVEhfTUFYX1RYUQkJCQk4CiAjZGVmaW5lIE1WX0VUSF9UWF9DU1VNX01BWF9TSVpFCQkJOTgwMAorI2RlZmluZSBNVl9FVEhfVFhfQ1NVTV9NSU5fU0laRQkJCTIwNDgKICNkZWZpbmUgTVZfRVRIX1RYX0NTVU1fTUFYX1NJWkVfU01BTEwJCTIwNDgKICNkZWZpbmUgTVZfUE5DX1RDQU1fTElORVMJCQkxMDI0CS8qIFRDQU0gbnVtIG9mIGVudHJpZXMgKi8KIApAQCAtMzA2LDYgKzMxMSw3IEBACiAJUVNHTUlJX1VOSVRfSUQsCiAJWEFVSV9VTklUX0lELAogCVVTQjNfSE9TVF9VTklUX0lELAkvKiBVU0IzLjAgSE9TVCBwb3J0cyAqLworCVNFUkRFU19VTklUX0lELAogCU1BWF9VTklUU19JRAogfSBNVl9VTklUX0lEOwogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L3N5cy9tdkFoYlRvTWJ1c1JlZ3MuaCBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oCmluZGV4IDQ2NjBjNTAuLjM1YjM3MTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oCkBAIC0xMzEsNyArMTMxLDcgQEAKICNkZWZpbmUgU1JBTVdDUl9TSVpFX01BU0sJCQkoMHg3IDw8IFNSQU1XQ1JfU0laRV9PRkZTKQogI2RlZmluZSBTUkFNV0NSX0JBU0VfT0ZGUwkJCTE2CiAjZGVmaW5lIFNSQU1XQ1JfQkFTRV9NQVNLCQkJKDB4RkZGRiA8PCBTUkFNV0NSX0JBU0VfT0ZGUykKLQorI2RlZmluZSBMMl9GSUxURVJfQkFTRV9SRUcJCQkweDhjMDQKIC8qKioqKioqKioqKioqKioqKioqKioqLwogLyogTUJVUyBCUklER0UgV0lORE9XICovCiAvKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0MSw0ICsxNDEsNiBAQAogI2RlZmluZSBCUklER1dDUl9TSVpFX01BU0sJCQkoMHhGRkZGIDw8IEJSSURHV0NSX1NJWkVfT0ZGUykKICNkZWZpbmUgTUJVU19CUklER0VfV0lOX0JBU0VfUkVHCQkoTVZfTUJVU19SRUdTX09GRlNFVCArIDB4MjU0KQogCisKKwogI2VuZGlmIC8qIF9fSU5DbXZBaGJUb01idXNSZWdzaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvYXJtYWRhXzM4eF9mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jCmluZGV4IGY1ZWJiMmQuLjczZThmOTAgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hMzh4L2FybWFkYV8zOHhfZmFtaWx5L2N0cmxFbnYvc3lzL212Q3B1SWYuYworKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9hcm1hZGFfMzh4X2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmLmMKQEAgLTk1Nyw2ICs5NTcsMzMgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDcHVJZkwyRmlsdGVyU2V0CisqCisqIERFU0NSSVBUSU9OOgorKglTZXQgTDIgRmlsdGVyIGJhc2UgLSBJTyBwcmlvcml0aXphdGlvbiBmaWx0ZXIKKyoKKyogSU5QVVQ6CisqCUwyIGJhc2UgdmFsdWUKKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIE5vbmUuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdkNwdUlmTDJGaWx0ZXJTZXQoTVZfVTMyIGJhc2UpCit7CisJLyogMC4yNUdCIHJlc2VydmVkIGZvciBJTyAtIHZlcmlmeSBubyBjb2xsaXNpb24gd2l0aCBJTyBAIDMuNzVHQiAoMHhmMDAwMDAwKSAqLworCWlmIChiYXNlID4gMHhmMDAwMDAwMCkgeworCQltdk9zUHJpbnRmKCJFcnJvcjogUmVxdWVzdGVkIEwyIGJhc2UgKCV4KSBvdmVybGFwcyB3aXRoIElPIGF0IDMuNzVHQlxuIiwgYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwlNVl9SRUdfV1JJVEUoTDJfRklMVEVSX0JBU0VfUkVHLCBiYXNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZDcHVJZk1idXNXaW5kb3dTZXQKICoKICogREVTQ1JJUFRJT046CkBAIC05NzYsNiArMTAwMyw5IEBACiB7CiAJTVZfVTMyIHJlZzsKIAorCS8qIEFsaWduIEwyIChJTykgZmlsdGVyIHdpdGggTUJVUyBiYXNlICovCisJbXZDcHVJZkwyRmlsdGVyU2V0KGJhc2UpOworCiAJTVZfUkVHX1dSSVRFKE1CVVNfQlJJREdFX1dJTl9CQVNFX1JFRywgYmFzZSk7CiAJLyogQWxpZ24gd2luZG93IHNpemUgdG8gNjRLQiAqLwogCXNpemUgPSAoKHNpemUgLyBfNjRLKSAtIDEpIDw8IEJSSURHV0NSX1NJWkVfT0ZGUzsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L2NtZF9lZnVzZS5jIGIvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX2VmdXNlLmMKaW5kZXggYjcwZmI3ZC4uZmFmZWVjMCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX2VmdXNlLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX2VmdXNlLmMKQEAgLTI1MSwxMyArMjUxLDE5IEBACiAJCQkJdmFsWzJdID0gTVZfRUZVU0VfUkVHX1JFQUQoRUZVU0VfQklUXzY0X0FERFIobGluZSkpOwogCQkJCURCUFIoIlJlYWQgZnJvbSAlMDhYOiBbJTA4WF1cbiIsIEVGVVNFX0JJVF82NF9BRERSKGxpbmUpLCB2YWxbMl0pOwogCi0JCQkJTVZfRUZVU0VfUkVHX1dSSVRFKEVGVVNFX0JJVF8zMV8wX0FERFIobGluZSksIHZhbFswXSk7Ci0JCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzMxXzBfQUREUihsaW5lKSwgdmFsWzBdKTsKLQkJCQlNVl9FRlVTRV9SRUdfV1JJVEUoRUZVU0VfQklUXzYzXzMyX0FERFIobGluZSksIHZhbFsxXSk7Ci0JCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzYzXzMyX0FERFIobGluZSksIHZhbFsxXSk7Ci0JCQkJTVZfRUZVU0VfUkVHX0JJVF9TRVQoRUZVU0VfQklUXzY0X0FERFIobGluZSksIDB4MSk7Ci0JCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzY0X0FERFIobGluZSksIDB4MSk7Ci0JCQkJbXZPc0RlbGF5KDUpOworCQkJCWlmICh2YWxbMl0gPT0gMCkgeyAvKiBJZiB0aGUgZUZ1c2Ugbm90IHlldCBidXJuZWQgYnkgdGVzdGVyICovCisJCQkJCS8qIGludmFsaWRhdGUgZUZ1c2UgZGF0YSBiZWZvcmUgdmFsaWRhdGluZyB0aGUgcm93ICovCisJCQkJCXZhbFswXSA9IDB4RkZGRkZGRkY7CisJCQkJCXZhbFsxXSA9IDB4MDBGRkZGRkY7CisKKwkJCQkJTVZfRUZVU0VfUkVHX1dSSVRFKEVGVVNFX0JJVF8zMV8wX0FERFIobGluZSksIHZhbFswXSk7CisJCQkJCURCUFIoIldyaXRlIHRvICAlMDhYOiBbJTA4WF1cbiIsIEVGVVNFX0JJVF8zMV8wX0FERFIobGluZSksIHZhbFswXSk7CisJCQkJCU1WX0VGVVNFX1JFR19XUklURShFRlVTRV9CSVRfNjNfMzJfQUREUihsaW5lKSwgdmFsWzFdKTsKKwkJCQkJREJQUigiV3JpdGUgdG8gICUwOFg6IFslMDhYXVxuIiwgRUZVU0VfQklUXzYzXzMyX0FERFIobGluZSksIHZhbFsxXSk7CisJCQkJCU1WX0VGVVNFX1JFR19CSVRfU0VUKEVGVVNFX0JJVF82NF9BRERSKGxpbmUpLCAweDEpOworCQkJCQlEQlBSKCJXcml0ZSB0byAgJTA4WDogWyUwOFhdXG4iLCBFRlVTRV9CSVRfNjRfQUREUihsaW5lKSwgMHgxKTsKKwkJCQkJbXZPc0RlbGF5KDUpOworCQkJCX0KIAkJCX0KIAkJfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzh4LmMKaW5kZXggZWY1MTRmOS4uZmYzNjA2NiAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX3NhcjM4eC5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2NtZF9zYXIzOHguYwpAQCAtMjMsMTIgKzIzLDEzIEBACiAjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZSZWdzLmgiCiAjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZMaWIuaCIKICNpbmNsdWRlICJib2FyZEVudi9tdkJvYXJkRW52TGliLmgiCisjaW5jbHVkZSAic3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuaCIKIAogZW51bSB7CiAJQ01EX0RVTVAgPSBNVl9TQVRSX01BWF9PUFRJT04rMSwKIAlDTURfREVGQVVMVCwKIAlDTURfVU5LTk9XTiwKLQlDTURfTk9UX0FDVElWRQkvLyBDb21tYW5kIHRoYXQgcmVxdWVzdHMgdmFsaWQgYnV0IG5vdCBhY3RpdmUgZmllbGQgb24gY3VycmVudCBib2FyZCAKKwlDTURfTk9UX0FDVElWRQkvLyBDb21tYW5kIHRoYXQgcmVxdWVzdHMgdmFsaWQgYnV0IG5vdCBhY3RpdmUgZmllbGQgb24gY3VycmVudCBib2FyZAogfTsKIAogTVZfRlJFUV9NT0RFIGNwdURkckNsa1RibFtdID0gTVZfU0FSX0ZSRVFfTU9ERVM7CkBAIC00Niw3ICs0Nyw3IEBACiAJTVZfU0FUUl9UWVBFX0lEIHNhdHJJZDsKIAlNVl9VMzIgZGVmYXVsZVZhbHVlRm9yQm9hcmRbTVZfTUFSVkVMTF9CT0FSRF9OVU1dOwogfSBNVl9CT0FSRF9TQVRSX0RFRkFVTFQ7Ci0jZGVmaW5lIE1BWF9ERUZBVUxUX0VOVFJZCTE2CisjZGVmaW5lIE1BWF9ERUZBVUxUX0VOVFJZCTIzCiBNVl9CT0FSRF9TQVRSX0RFRkFVTFQgYm9hcmRTYXRyRGVmYXVsdFtNQVhfREVGQVVMVF9FTlRSWV0gPSB7CiAvKiAJZGVmYXVsZVZhbHVlRm9yQm9hcmRbXSA9IFJEX05BU182OHh4LAlEQl9CUF82OHh4LAlSRF9XQVBfNjh4eCwJREJfQVBfNjh4eCAsIERCX0dQXzY4eHgsICBEQl9CUF82ODIxLAlEQi1BTUMgKi8KIHsgTVZfU0FUUl9DUFVfRERSX0wyX0ZSRVEsCXsweDBjLAkJMHgwYywJCTB4MGMsCQkweDBjLAkJMHgwYywJICAweDQsCQkweDBjfX0sCkBAIC02NSw2ICs2NiwxMyBAQAogeyBNVl9TQVRSX0RCX1VTQjNfUE9SVDEsCXswLAkJMCwJCTAsCQkwLAkJMCwJICAwLAkJMH19LAogeyBNVl9TQVRSX0REUl9FQ0NfRU5BQkxFLAl7MCwJCTAsCQkwLAkJMCwJCTAsCSAgMCwJCTF9fSwKIHsgTVZfU0FUUl9ERFJfRUNDX1BVUF9TRUwsCXswLAkJMCwJCTAsCQkwLAkJMCwJICAwLAkJMX19LAoreyBNVl9TQVRSX0ZVTExfRkxBVk9SLAkJezAsCQkxLAkJMCwJCTEsCQkxLAkgIDEsCQkwfSB9LAoreyBNVl9TQVRSX1RETV9DT05ORUNURUQsCXswLAkJMSwJCTAsCQkwLAkJMCwJICAwLAkJMH0gfSwKK3sgTVZfU0FUUl9URE1fUExBQ0VfSE9MREVSLAl7MCwJCTEsCQkwLAkJMCwJCTAsCSAgMCwJCTB9IH0sCit7IE1WX1NBVFJfQk9BUkRfU1BFRUQsCQl7MCwJCTB4MSwJCTAsCQkweDEsCQkweDEsCSAgMCwJCTB4MX0gfSwKK3sgTVZfU0FUUl9BVlNfU0tJUCwJCXswLAkJMHgxLAkJMCwJCTB4MSwJCTB4MSwJICAweDEsCQkweDF9IH0sCit7TVZfU0FUUl9CT09UX0RFVklDRSwgICAgICAgICAgIHswLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMCwJCTAsCQkwLAkgIDAsCQkwfSB9LC8qIER1bW15IGVudHJ5OiBkZWZhdWx0IHZhbHVlIHRha2VuIGZyb20gU0BSIHJlZ2lzdGVyICovCit7TVZfU0FUUl9CT09UMl9ERVZJQ0UsICAgICAgICAgIHswLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgMCwJCTAsCQkwLAkgIDAsCQkwfSB9LC8qIER1bW15IGVudHJ5OiBkZWZhdWx0IHZhbHVlIHRha2VuIGZyb20gU0BSIHJlZ2lzdGVyICovCiB9OwogCiBjaGFyICpsYW5lMUFycls3XSA9IHsJIlVuY29ubmVjdGVkIiAsCkBAIC04MywxNyArOTEsNDkgQEAKIGNoYXIgKmRldklkQXJyWzRdID0gewogCQkJIjY4MTAgKEEzODApIiwKIAkJCSI2ODIwIChBMzg1KSIsCi0JCQkiNjgxMSAoQTM4MS8yKSIsCisJCQkiTi9BIiwKIAkJCSI2ODI4IChBMzg4KSIgfTsKIAotTVZfQk9PTCBtdlZlcmlmeVJlcXVlc3Qodm9pZCkKK3N0YXRpYyBNVl9VMzIgZ2V0Qm9hcmRTcGVlZChNVl9VMzIgYm9hcmRzcGVlZCkKIHsKLQlyZWFkbGluZSgiICIpOwotCWlmKHN0cmxlbihjb25zb2xlX2J1ZmZlcikgPT0gMCB8fCAvKiBpZiBwcmVzc2VkIEVudGVyICovCi0JCXN0cmNtcChjb25zb2xlX2J1ZmZlciwibiIpID09IDAgfHwKLQkJc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJOIikgPT0gMCApIHsKLQkJcHJpbnRmKCJcbiIpOwotCQlyZXR1cm4gTVZfRkFMU0U7CisJc3dpdGNoIChib2FyZHNwZWVkKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gMjAwMDsKKwljYXNlIDI6CisJCXJldHVybiAxODY2OworCWNhc2UgMzoKKwkJcmV0dXJuIDE2MDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorLyoKKyAqIHdoZW4gZWFjaCBDUFUgaXMgY2hlY2tlZCwgbWF4IENQVSBzcGVlZCBpcyBkZXRlcm1pbmVkIGZvciBlYWNoIGJvYXJkCisgKiBUbyBlbmFibGUgdGhlIHNwZWVkIGxpbWl0YXRpb24gZm9yIGVhY2ggYm9hcmQsIHRoZSBhY2NvcmRpbmcgdmFsdWUgaXMgd3JpdHRlbgorICogaW4gU2F0UiBmaWVsZCAnYm9hcmRzcGVlZCc6CisgKiAtMHgxIGZvciBtYXggdmFsdWUgMjAwME1oegorICogLTB4MiBmb3IgbWF4IHZhbHVlIDE4NjZNSHoKKyAqIC0weDMgZm9yIG1heCB2YWx1ZSAxNjAwTUh6CisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgTVZfVFJVRSBpZiB0aGUgY3B1TW9kZSBpcyBub3QgbGltaXRlZCBvbiB0aGlzIGJvYXJkCisgKiBieSBjaGVja2luZyB0aGUgJ2JvYXJkc3BlZWQnIGZpZWxkLCBvdGhlcndpc2UgcmV0dXJucyBNVl9GQUxTRQorICovCitzdGF0aWMgTVZfQk9PTCBpc0NwdU1vZGVTdXBwb3J0ZWRGb3JCb2FyZChpbnQgaW5kZXgsIE1WX0JPT0wgcHJpbnRFcnJvcikKK3sKKwlNVl9VMzIgdG1wOworCisJaWYgKGNwdURkckNsa1RibFtpbmRleF0uaXNMaW1pdGVkID09IE1WX1RSVUUpIHsKKwkJdG1wID0gbXZCb2FyZFNhdFJSZWFkKE1WX1NBVFJfQk9BUkRfU1BFRUQpOworCQlpZiAodG1wID09IE1WX0VSUk9SKSB7CisJCQltdk9zUHJpbnRmKCJGYWlsZWQgcmVhZGluZyAnYm9hcmRzcGVlZCcgU2F0UiBmaWVsZFxuIik7CisJCQlyZXR1cm4gTVZfRkFMU0U7CisJCX0KKworCQlpZiAoY3B1RGRyQ2xrVGJsW2luZGV4XS5jcHVGcmVxID4gZ2V0Qm9hcmRTcGVlZCh0bXApKSB7CisJCQlpZiAocHJpbnRFcnJvciA9PSBNVl9UUlVFKQorCQkJCW12T3NQcmludGYoIk1heGltdW0gc3VwcG9ydGVkIENQVSBzcGVlZCBpcyAldU1IelxuIiwgZ2V0Qm9hcmRTcGVlZCh0bXApKTsKKwkJCXJldHVybiBNVl9GQUxTRTsKKwkJfQogCX0KIAlyZXR1cm4gTVZfVFJVRTsKIH0KQEAgLTEwMywxMSArMTQzLDE3IEBACiAJTVZfVTMyIGksIHJjLCBkZWZhdWx0VmFsdWUsIGJvYXJkSWQgPSBtdkJvYXJkSWRJbmRleEdldChtdkJvYXJkSWRHZXQoKSk7CiAJTVZfU0FUUl9UWVBFX0lEIHNhdHJDbGFzc0lkOwogCU1WX0JPQVJEX1NBVFJfSU5GTyBzYXRySW5mbzsKLQorCU1WX1UzMiBzYXRyQm9vdERldmljZVZhbHVlID0gbXZDdHJsYm9vdFNyY0dldCgpLCB0bXA7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9ERUZBVUxUX0VOVFJZOyBpKyspIHsKIAkJc2F0ckNsYXNzSWQgPSBib2FyZFNhdHJEZWZhdWx0W2ldLnNhdHJJZDsKIAkJaWYgKG12Qm9hcmRTYXRySW5mb0NvbmZpZyhzYXRyQ2xhc3NJZCwgJnNhdHJJbmZvKSAhPSBNVl9PSykKIAkJCWNvbnRpbnVlOworCQlpZiAoc2F0ckNsYXNzSWQgPT0gTVZfU0FUUl9CT09UX0RFVklDRSkKKwkJCWJvYXJkU2F0ckRlZmF1bHRbaV0uZGVmYXVsZVZhbHVlRm9yQm9hcmRbYm9hcmRJZF0gPSBzYXRyQm9vdERldmljZVZhbHVlICYgc2F0ckluZm8ubWFzazsKKwkJaWYgKHNhdHJDbGFzc0lkID09IE1WX1NBVFJfQk9PVDJfREVWSUNFKSB7CisJCQl0bXAgPSBzYXRyQm9vdERldmljZVZhbHVlID4+IE1WX1NBVFJfQk9PVDJfVkFMVUVfT0ZGU0VUOworCQkJYm9hcmRTYXRyRGVmYXVsdFtpXS5kZWZhdWxlVmFsdWVGb3JCb2FyZFtib2FyZElkXSA9IHRtcCAmIE1WX1NBVFJfQk9PVDJfVkFMVUVfTUFTSzsKKwkJfQogCQlkZWZhdWx0VmFsdWUgPSBib2FyZFNhdHJEZWZhdWx0W2ldLmRlZmF1bGVWYWx1ZUZvckJvYXJkW2JvYXJkSWRdOwogCQlyYyA9IG12Qm9hcmRTYXRSV3JpdGUoc2F0ckNsYXNzSWQsIGRlZmF1bHRWYWx1ZSk7CiAJCWlmIChyYyA9PSBNVl9FUlJPUikgewpAQCAtMTE2LDExICsxNjIsMTYgQEAKIAl9CiAKIAkvKiBzZXQgZGVmYXVsdCBEZXZpY2UgSUQgLSBpZiBNVl9TQVRSX0RFVklDRV9JRCBmaWVsZCBpcyByZWxldmFudCBvbiBib2FyZCAqLwotCWlmIChtdkJvYXJkU2F0ckluZm9Db25maWcoTVZfU0FUUl9ERVZJQ0VfSUQsICZzYXRySW5mbykgPT0gTVZfT0spIHsKLQkJaWYgKG12Qm9hcmRTYXRSV3JpdGUoTVZfU0FUUl9ERVZJQ0VfSUQsIG12Q3RybERldklkSW5kZXhHZXQobXZDdHJsTW9kZWxHZXQoKSkpID09IE1WX0VSUk9SKQotCQkJbXZPc1ByaW50ZigiRXJyb3Igd3JpdGluZyBkZWZhdWx0IERldmljZSBJRCAoJ2RldmlkJykgPSVkXG4iLCBpKTsKLQl9CisJLyogQTM4My9BMzg0IGFyZSB2aXJ0dWFsIGRldmljZSBJRCdzIC0gbm90IHJlcHJlc2VudGVkIGFzIEhXIGRldmljZSBJRCB2YWx1ZXMgaW4gU0BSQDB4MTg2MDAuCisJQTM4My9BMzg0IGFyZSBjb25maWd1cmVkIGluIFNXIEVFUFJPTSB3aXRoIEZVTExfRkxBVk9SIGZpZWxkOiBpZiBmYWxzZSBvdmVycmlkZSBkZXZpY2UgSUQgKi8KIAorCWlmICghKG12Q3RybE1vZGVsR2V0KCkgPT0gTVZfNlcyMl9ERVZfSUQKKwkJCXx8IG12Q3RybE1vZGVsR2V0KCkgPT0gIE1WXzZXMjNfREVWX0lEKSkgeyAvKiA2VzIyPUEzODMsIDZXMjM9QTM4NCAqLworCQlpZiAobXZCb2FyZFNhdHJJbmZvQ29uZmlnKE1WX1NBVFJfREVWSUNFX0lELCAmc2F0ckluZm8pID09IE1WX09LKSB7CisJCQlpZiAobXZCb2FyZFNhdFJXcml0ZShNVl9TQVRSX0RFVklDRV9JRCwgbXZDdHJsRGV2SWRJbmRleEdldChtdkN0cmxNb2RlbEdldCgpKSkgPT0gTVZfRVJST1IpCisJCQkJbXZPc1ByaW50ZigiRXJyb3Igd3JpdGluZyBkZWZhdWx0IERldmljZSBJRCAoJ2RldmlkJykgPSVkXG4iLCBpKTsKKwkJfQorCX0KIAlwcmludGYoIlxuU2FtcGxlIGF0IFJlc2V0IHZhbHVlcyB3ZXJlIHJlc3RvcmVkIHRvIGRlZmF1bHQuXG4iKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1NiwyMyArMjA3LDI2IEBACiAJc3dpdGNoIChzYXRySW5mby0+c2F0cklkKSB7CiAJY2FzZSBNVl9TQVRSX0NQVV9ERFJfTDJfRlJFUToKIAkJbXZPc1ByaW50ZigiY3B1ZnJlcSBvcHRpb25zIC0gRGV0ZXJtaW5lcyB0aGUgZnJlcXVlbmN5IG9mIENQVS9ERFIvTDI6XG5cbiIpOwotCQltdk9zUHJpbnRmKCJ8IElEIHwgQ1BVIEZyZXEgKE1IeikgfCBMMiBGcmVxIChNSHopICAgfCBTRFJBTSBGcmVxIChNSHopICB8XG4iKTsKLQkJbXZPc1ByaW50ZigifC0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7CisJCW12T3NQcmludGYoInwgSUQgfCBDUFUgRnJlcSAoTUh6KSB8IEREUiBGcmVxIChNSHopICAgfCAgTDIgZnJlcShNSHopICB8XG4iKTsKKwkJbXZPc1ByaW50ZigifC0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXxcbiIpOwogCQlmb3IgKGk9MDsgaSA8PSBNVl9TQVJfRlJFUV9NT0RFU19FT1Q7IGkrKykgewogCQkJaWYgKGNwdURkckNsa1RibFtpXS5pZCA9PSBNVl9TQVJfRlJFUV9NT0RFU19FT1QpCiAJCQkJYnJlYWs7Ci0JCQlpZiAoY3B1RGRyQ2xrVGJsW2ldLmlzRGlzcGxheSkKLQkJCQltdk9zUHJpbnRmKCJ8ICUyZCB8ICAgICAgJTRkICAgICAgfCAgICAgICU0ZCAgICAgICB8ICAgICAgJTRkICAgICAgICAgfCBcbiIsCisJCQlpZiAoY3B1RGRyQ2xrVGJsW2ldLmlzRGlzcGxheSAmJiBpc0NwdU1vZGVTdXBwb3J0ZWRGb3JCb2FyZChpLCBNVl9GQUxTRSkgPT0gTVZfVFJVRSkKKwkJCQltdk9zUHJpbnRmKCJ8ICUyZCB8ICAgICAgJTRkICAgICAgfCAgICAgICU0ZCAgICAgICAgfCAgICAgICU0ZCAgICAgIHwgXG4iLAogCQkJCQkgICBjcHVEZHJDbGtUYmxbaV0uaWQsCiAJCQkJCSAgIGNwdURkckNsa1RibFtpXS5jcHVGcmVxLAogCQkJCQkgICBjcHVEZHJDbGtUYmxbaV0uZGRyRnJlcSwKIAkJCQkJICAgY3B1RGRyQ2xrVGJsW2ldLmwyRnJlcSk7CiAJCX0KLQkJbXZPc1ByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCW12T3NQcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBNVl9TQVRSX0NPUkVfQ0xLX1NFTEVDVDoKIAkJbXZPc1ByaW50ZigiRGV0ZXJtaW5lcyB0aGUgQ29yZSBjbG9jayBmcmVxdWVuY3k6XG4iKTsKLQkJbXZPc1ByaW50ZigiXHQwID0gMjUwTUh6XG4iKTsKKwkJaWYgKG12Q3RybE1vZGVsR2V0KCkgPT0gTVZfNjgxMV9ERVZfSUQpCisJCQltdk9zUHJpbnRmKCJcdDAgPSAxNjZNSHpcbiIpOwkvKiBkZXZpY2UgMzgxLzIgKDY4MTEvMjEpIHVzZSAxNjZNSHogaW5zdGVhZCBvZiAyNTBNSHogKi8KKwkJZWxzZQorCQkJbXZPc1ByaW50ZigiXHQwID0gMjUwTUh6XG4iKTsKIAkJbXZPc1ByaW50ZigiXHQxID0gMjAwTUh6XG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBNVl9TQVRSX0NQVTFfRU5BQkxFOgpAQCAtMjgwLDYgKzMzNCwyNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZXZJZEFycik7IGkrKykKIAkJCW12T3NQcmludGYoIlx0ICVkID0gJXNcbiIsIGksIGRldklkQXJyW2ldKTsKIAkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX0ZVTExfRkxBVk9SOgorCQltdk9zUHJpbnRmKCJEZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIGZ1bGwgZmxhdm9yIGNhcGFiaWxpdGVzOlxuIik7CisJCW12T3NQcmludGYoIlx0MCA9IFJlZHVjZWQgRmxhdm9yXG4iKTsKKwkJbXZPc1ByaW50ZigiXHQxID0gRnVsbCBGbGF2b3JcbiAiKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX1RETV9DT05ORUNURUQ6CisJCW12T3NQcmludGYoIkluZGljYXRlcyB3aGV0aGVyIFRETSBtb2R1bGUgaXMgY29ubmVjdGVkIG9yIG5vdDpcbiIpOworCQltdk9zUHJpbnRmKCJcdDAgPSBDb25uZWN0ZWRcbiIpOworCQltdk9zUHJpbnRmKCJcdDEgPSBOb3QgY29ubmVjdGVkXG4gIik7CisJCWJyZWFrOworCWNhc2UgTVZfU0FUUl9BVlNfU0tJUDoKKwkJbXZPc1ByaW50ZigiSW5kaWNhdGVzIHdoZXRoZXIgdG8gc2tpcCBBVlMgdXBkYXRlIGZyb20gRUZVU0Ugb3Igbm90OlxuIik7CisJCW12T3NQcmludGYoIlx0MCA9IERvIG5vdCBza2lwIEFWUyB1cGRhdGUgZnJvbSBFRlVTRVxuIik7CisJCW12T3NQcmludGYoIlx0MSA9IFNraXAgQVZTIHVwZGF0ZSBmcm9tIEVGVVNFXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX0JPQVJEX1NQRUVEOgorCQltdk9zUHJpbnRmKCJEZXRlcm1pbmVzIHRoZSBtYXggc3VwcG9ydGVkIENQVSBzcGVlZDpcbiIpOworCQltdk9zUHJpbnRmKCJcdDEgPSAldU1IelxuIiwgZ2V0Qm9hcmRTcGVlZCgxKSk7CisJCW12T3NQcmludGYoIlx0MiA9ICV1TUh6XG4iLCBnZXRCb2FyZFNwZWVkKDIpKTsKKwkJbXZPc1ByaW50ZigiXHQzID0gJXVNSHpcbiIsIGdldEJvYXJkU3BlZWQoMykpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltdk9zUHJpbnRmKCJVc2FnZTogc2FyIGxpc3QgW29wdGlvbnNdIChzZWUgaGVscClcbiIpOwogCQlyZXR1cm4gMTsKQEAgLTI5MCw2ICszNjUsNyBAQAogaW50IGRvX3Nhcl9yZWFkKE1WX1UzMiBtb2RlLCBNVl9CT0FSRF9TQVRSX0lORk8gKnNhdHJJbmZvKQogewogCU1WX1UzMiBpLCB0bXA7CisJY2hhciBjb3JlX2Nsa192YWx1ZTBbNF07CiAKIAlpZiAobW9kZSAhPSBDTURfRFVNUCkgewogCSAgICB0bXAgPSBtdkJvYXJkU2F0UlJlYWQoc2F0ckluZm8tPnNhdHJJZCk7CkBAIC0zMDUsMjAgKzM4MSwyMiBAQAogCQkJCWJyZWFrOwogCQkJaWYgKGNwdURkckNsa1RibFtpXS5pZCA9PSB0bXApIHsKIAkJCQltdk9zUHJpbnRmKCJcbkN1cnJlbnQgZnJlcSBjb25maWd1cmF0aW9uOlxuIik7Ci0JCQkJbXZPc1ByaW50ZigifCBJRCB8IENQVSBGcmVxIChNSHopIHwgTDIgRnJlcSAoTUh6KSAgIHwgU0RSQU0gRnJlcSAoTUh6KSAgfFxuIik7Ci0JCQkJbXZPc1ByaW50ZigifC0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfFxuIik7Ci0JCQkJbXZPc1ByaW50ZigifCAlMmQgfCAgICAgICU0ZCAgICAgIHwgICAgICAlNGQgICAgICAgfCAgICAgICU0ZCAgICAgICAgIHxcbiIsCisJCQkJbXZPc1ByaW50ZigifCBJRCB8IENQVSBGcmVxIChNSHopIHwgRERSIEZyZXEgKE1IeikgICB8ICBMMiBmcmVxKE1IeikgIHxcbiIpOworCQkJCW12T3NQcmludGYoInwtLS0tfC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS18XG4iKTsKKwkJCQltdk9zUHJpbnRmKCJ8ICUyZCB8ICAgICAgJTRkICAgICAgfCAgICAgICU0ZCAgICAgICAgfCAgICAgICU0ZCAgICAgIHxcbiIsCiAJCQkJCSAgIGNwdURkckNsa1RibFtpXS5pZCwKIAkJCQkJICAgY3B1RGRyQ2xrVGJsW2ldLmNwdUZyZXEsCiAJCQkJCSAgIGNwdURkckNsa1RibFtpXS5kZHJGcmVxLAogCQkJCQkgICBjcHVEZHJDbGtUYmxbaV0ubDJGcmVxKTsKLQkJCQltdk9zUHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCQltdk9zUHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBNVl9TQVRSX0NPUkVfQ0xLX1NFTEVDVDoKLQkJbXZPc1ByaW50ZigiXG5jb3JlY2xvY2tcdD0gJWQgID09PiAlc01oelxuIiwgdG1wLCAodG1wID09IDB4MCkgPyAiMjUwIiA6ICIyMDAiKTsKKwkJLyogZGV2aWNlIDM4MS8yICg2ODExLzIxKSB1c2UgMTY2TUh6IGluc3RlYWQgb2YgMjUwTUh6ICovCisJCXNwcmludGYoY29yZV9jbGtfdmFsdWUwLCBtdkN0cmxNb2RlbEdldCgpID09IE1WXzY4MTFfREVWX0lEID8gIjE2NiIgOiAiMjUwIik7CisJCW12T3NQcmludGYoIlxuY29yZWNsb2NrXHQ9ICVkICA9PT4gJXNNaHpcbiIsIHRtcCwgKHRtcCA9PSAweDApID8gY29yZV9jbGtfdmFsdWUwIDogIjIwMCIpOwogCQlicmVhazsKIAljYXNlIE1WX1NBVFJfQ1BVMV9FTkFCTEU6CiAJCW12T3NQcmludGYoImNwdXNudW1cdFx0PSAlZCAgPT0+ICVzIENQVVxuIiwgdG1wLCAodG1wID09IDApID8gIlNpbmdsZSIgOiAiRHVhbCIpOwpAQCAtMzgwLDYgKzQ1OCwyNSBAQAogCWNhc2UgTVZfU0FUUl9ERVZJQ0VfSUQ6CiAJCW12T3NQcmludGYoImRldmlkXHRcdD0gJWQgID09PiBEZXZpY2UgSUQ6ICVzXG4iLCB0bXAsIGRldklkQXJyW3RtcF0pOwogCQlicmVhazsKKwljYXNlIE1WX1NBVFJfRlVMTF9GTEFWT1I6CisJCW12T3NQcmludGYoImZsYXZvclx0XHQ9ICVkICA9PT4gJXMgRmxhdm9yIiwgdG1wLCAodG1wID09IDApID8gIlJlZHVjZWQiIDogIkZ1bGwiKTsKKwkJaWYgKCF0bXApIHsKKwkJCWlmIChtdkJvYXJkSWRHZXQoKSA9PSBEQl9HUF82OFhYX0lEKQorCQkJCW12T3NQcmludGYoIiAoQTM4NCBvbiBEQi1HUCkiKTsKKwkJCWVsc2UgaWYgKG12Qm9hcmRJZEdldCgpID09IERCX0JQXzY4MjFfSUQpCisJCQkJbXZPc1ByaW50ZigiIChBMzgzIG9uIERCLTg4RjY4MjEtQlApIik7CisJCX0KKwkJbXZPc1ByaW50ZigiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX1RETV9DT05ORUNURUQ6CisJCW12T3NQcmludGYoInRkbVx0XHQ9ICVkICA9PT4gVERNIG1vZHVsZSBpcyAlc1xuIiwgdG1wLCAodG1wID09IDApID8gImNvbm5lY3RlZCIgOiAibm90IGNvbm5lY3RlZCIpOworCQlicmVhazsKKwljYXNlIE1WX1NBVFJfQVZTX1NLSVA6CisJCW12T3NQcmludGYoImF2c3NraXBcdFx0PSAlZCAgPT0+ICVzc2tpcCBBVlMgdXBkYXRlIGZyb20gRUZVU0VcbiIsIHRtcCwgKHRtcCA9PSAwKSA/ICJEbyBub3QgIiA6ICIiKTsKKwkJYnJlYWs7CisJY2FzZSBNVl9TQVRSX0JPQVJEX1NQRUVEOgorCQltdk9zUHJpbnRmKCJib2FyZHNwZWVkXHRcdD0gJWQgID09PiBNYXggQ1BVIHNwZWVkIGlzICV1TUh6XG4iLCB0bXAsIGdldEJvYXJkU3BlZWQodG1wKSk7CisJCWJyZWFrOwogCWNhc2UgQ01EX0RVTVA6CiAJCXsKIAkJCU1WX0JPQVJEX1NBVFJfSU5GTyBzYXRySW5mbzsKQEAgLTQyNyw2ICs1MjQsMTEgQEAKIAl9CiAKIAlpZiAoc2F0ckluZm8tPnNhdHJJZCA9PSBNVl9TQVRSX0NQVV9ERFJfTDJfRlJFUSkgeworCQkvKiBEQi02ODIxLUJQIG1heGltdW0gQ1BVL0REUiBmcmVxdWVuY3kgbW9kZSBpcyA4IDogMTMzMi82NjYgTUh6ICovCisJCWlmIChib2FyZElkID09IERCX0JQXzY4MjFfSUQgJiYgdmFsdWUgPiAweDgpIHsKKwkJCW12T3NQcmludGYoIk1heGltdW0gc3VwcG9ydGVkIENQVS9ERFIgbW9kZSBmb3IgREItNjgyMS1CUCBpcyAweDhcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KIAkJZnJlcVZhbHVlSW52YWxpZCA9IDE7CiAJCWZvciAoaT0wOyBpIDw9IE1WX1NBUl9GUkVRX01PREVTX0VPVDsgaSsrKSB7CiAJCQlpZiAoY3B1RGRyQ2xrVGJsW2ldLmlkID09IE1WX1NBUl9GUkVRX01PREVTX0VPVCkKQEAgLTQ0MSwxMiArNTQzLDE0IEBACiAJCQltdk9zUHJpbnRmKCJXcml0ZSBTQFIgZmFpbGVkIVxuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQorCQlpZiAoaXNDcHVNb2RlU3VwcG9ydGVkRm9yQm9hcmQoaSwgTVZfVFJVRSkgPT0gTVZfRkFMU0UpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiB2ZXJpZnkgcmVxdWVzdGVkIGVudHJ5IGlzIHZhbGlkIGFuZCBtYXAgaXQncyBJRCB2YWx1ZSAqLwogCWlmIChzYXRySW5mby0+c2F0cklkID09IE1WX1NBVFJfREVWSUNFX0lEKSB7Ci0JCWlmICh2YWx1ZSA+IEFSUkFZX1NJWkUoZGV2SWRBcnIpKSB7Ci0JCQlwcmludGYoIiVzOiBFcnJvcjogcmVxdWVzdGVkIGludmFsaWQgREVWSUNFX0lEIHZhbHVlICgleClcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CisJCWlmICh2YWx1ZSA+IEFSUkFZX1NJWkUoZGV2SWRBcnIpIHx8IHZhbHVlID09IDIpIHsgLyogZGV2aWQgPSAyICg2ODExLzIxKSA6IG5vdCBzdXBwb3J0ZWQgdmlhIFNhdFIgKi8KKwkJCXByaW50ZigiJXM6IEVycm9yOiByZXF1ZXN0ZWQgaW52YWxpZCBEZXZpY2UgSUQgdmFsdWUgKCV4KVxuIiwgX19mdW5jX18sIHZhbHVlKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQpAQCAtNDYwLDcgKzU2NCwxMCBAQAogCWlmIChNVl9TQVRSX0JPQVJEX0lEID09IHNhdHJJbmZvLT5zYXRySWQpIHsKIAkJbXZPc1ByaW50ZigiXG5Cb2FyZCBJRCB1cGRhdGUgcmVxdWlyZXMgbmV3IGRlZmF1bHQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuIik7CiAJCW12T3NQcmludGYoIiBSZXNldCBlbnZpcm9ubWVudCBmb3IgJXMgPyBbeS9OXSIgLG1hcnZlbGxCb2FyZEluZm9UYmxbdmFsdWVdLT5ib2FyZE5hbWUpOwotCQlpZiAobXZWZXJpZnlSZXF1ZXN0KCkgPT0gTVZfVFJVRSkKKwkJcmVhZGxpbmUoIiAiKTsKKwkJaWYoc3RybGVuKGNvbnNvbGVfYnVmZmVyKSAhPSAwICYmIC8qIGlmIHByZXNzZWQgRW50ZXIgKi8KKwkJCXN0cmNtcChjb25zb2xlX2J1ZmZlciwibiIpICE9IDAgJiYKKwkJCXN0cmNtcChjb25zb2xlX2J1ZmZlciwiTiIpICE9IDAgKQogCQkJcnVuX2NvbW1hbmQoInJlc2V0ZW52IiwgMCk7CiAJfQogCXJldHVybiAwOwpAQCAtNDgxLDYgKzU4OCwxNiBAQAogCQlyZXR1cm4gMTsKIAl9CiAKKwkvKiBDaGVjayBpZiBzd2l0Y2ggaXMgY29ubmVjdGVkIHRvIEFNQyBib2FyZCAqLworCWlmIChib2FyZElkID09IERCX0FNQ182ODIwX0lEKSB7CisJCXN0YXRpYyBTSUxJQ09OX1RZUEUgc2lsdCA9IFNJTFRfTk9UX0RFVEVDVDsKKworCQlpZiAoc2lsdCA9PSBTSUxUX05PVF9ERVRFQ1QpCisJCQlzaWx0ID0gZ2V0X2F0dGFjaGVkX3NpbGljb25fdHlwZSgpOworCQlpZiAoc2lsdCA9PSBTSUxUX0JDMikKKwkJCXJldHVybiBkb19zYXJfYmMyKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwl9CisKIAkvKiBpcyByZXF1ZXN0ZWQgJ1NhdFIgcmVhZCcgLS0+IER1bXAgYWxsICovCiAJaWYgKGFyZ2MgPiAxICYmIGFyZ2MgPCAzICYmIHN0cmNtcChjbWQsICJyZWFkIikgPT0gMCkKIAkJbW9kZSA9IENNRF9EVU1QOwpAQCAtNTUyLDYgKzY2OSw4IEBACiAiZGRyNHNlbGVjdAkJICAgLSBEQi04OEY2ODIwLUJQOiBERFIzLzQJCShyZWFkIG9ubHkpXG4iCiAiZWNvdmVyc2lvbgkJICAgLSBEQi04OEY2ODIwLUJQOiBFQ08gdmVyc2lvbgkocmVhZCBvbmx5KVxuIgogImJvYXJkaWQJCQkgICAtIGJvYXJkIElECQkocmVhZCBvbmx5KVxuIgorImJvYXJkc3BlZWQJCQkgICAtIE1BWCB2YWxpZGF0ZWQgQ1BVIG1vZGUgZm9yIGN1cnJlbnQgY2hpcAkJKHJlYWQgb25seSlcbiIKKyJhdnNza2lwCQkJICAgLSBTa2lwIEFWUyBmcm9tIEVGVVNFIHVwZGF0ZVxuIgogCiAiXG5cdCBCb2FyZCBTcGVjaWZpYyBTVyBmaWVsZHNcbiIKICJcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgpAQCAtNTYxLDcgKzY4MCwxMCBAQAogImRic2VyZGVzMQkJICAgLSBEQi1HUCwgREItODhGNjgyMS1CUDoJU2VyRGVzIGxhbmUgIzFcbiIKICJkYnNlcmRlczIJCSAgIC0gREItR1AsIERCLTg4RjY4MjEtQlA6CVNlckRlcyBsYW5lICMyXG4iCiAidXNiM3BvcnQwCQkgICAtIERCLUdQLCBEQi04OEY2ODIxLUJQOglVU0IzLVBvcnQwIG1vZGVcbiIKLSJ1c2IzcG9ydDEJCSAgIC0gREItR1AsIERCLTg4RjY4MjEtQlA6CVVTQjMtUG9ydDEgbW9kZVxuXG4iCisidXNiM3BvcnQxCQkgICAtIERCLUdQLCBEQi04OEY2ODIxLUJQOglVU0IzLVBvcnQxIG1vZGVcbiIKKyJmbGF2b3IJCQkgICAtIERCLUdQLCBEQi04OEY2ODIxLUJQOiBJcyBmdWxsIGZsYXZvciAoZm9yIEEzODMvNCBzaW11bGF0aW9uKVxuIgorInRkbQkJCSAgIC0gREItQlA6CQkJaXMgVERNIG1vZHVsZSBjb25uZWN0ZWRcblxuIgorCiAKICk7CiAjZW5kaWYgLypkZWZpbmVkKENPTkZJR19DTURfU0FSKSovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzl4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9jbWRfc2FyMzl4LmMKaW5kZXggMjcxMDI4NC4uYTcxODVlMiAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2EzOHgvY21kX3NhcjM5eC5jCisrKyBiL2JvYXJkL212X2VidS9hMzh4L2NtZF9zYXIzOXguYwpAQCAtNDUsMTIgKzQ1LDE0IEBACiAJTVZfU0FUUl9UWVBFX0lEIHNhdHJJZDsKIAlNVl9VMzIgZGVmYXVsZVZhbHVlRm9yQm9hcmRbTVZfTUFSVkVMTF9CT0FSRF9OVU1dOwogfSBNVl9CT0FSRF9TQVRSX0RFRkFVTFQ7Ci0jZGVmaW5lIE1BWF9ERUZBVUxUX0VOVFJZCTIKKyNkZWZpbmUgTUFYX0RFRkFVTFRfRU5UUlkJNAogCiBNVl9CT0FSRF9TQVRSX0RFRkFVTFQgYm9hcmRTYXRyRGVmYXVsdFtNQVhfREVGQVVMVF9FTlRSWV0gPSB7CiAvKiAJZGVmYXVsZVZhbHVlRm9yQm9hcmRbXSA9IFJEXzY5eHgsCURCXzY4eHggKi8KLXsgTVZfU0FUUl9DUFVfRERSX0wyX0ZSRVEsCXsweDBjLAkJMHgwYywJCX0gfSwKLXsgTVZfU0FUUl9DT1JFX0NMS19TRUxFQ1QsCXswLAkJMCwJCX0gfSwKK3tNVl9TQVRSX0NQVV9ERFJfTDJfRlJFUSwJezB4MGMsCQkweDBjLAkJfSB9LAore01WX1NBVFJfQ09SRV9DTEtfU0VMRUNULAl7MCwJCTAsCQl9IH0sCit7TVZfU0FUUl9CT09UX0RFVklDRSwJCXswLAkJMCwJCX0gfSwvKiBEdW1teSBlbnRyeTogZGVmYXVsdCB2YWx1ZSB0YWtlbiBmcm9tIFNAUiByZWdpc3RlciAqLwore01WX1NBVFJfQk9PVDJfREVWSUNFLAkJezAsCQkwLAkJfSB9LC8qIER1bW15IGVudHJ5OiBkZWZhdWx0IHZhbHVlIHRha2VuIGZyb20gU0BSIHJlZ2lzdGVyICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfZGV2aWNlSWRFbnRyeSB7CkBAIC02NSwyOCArNjcsMjIgQEAKIHsgIjY5MjggKEEzOTgpIiwJMHg2OTI4LAkJMHg2IH0sCiB9OwogCi1NVl9CT09MIG12VmVyaWZ5UmVxdWVzdCh2b2lkKQotewotCXJlYWRsaW5lKCIgIik7Ci0JaWYoc3RybGVuKGNvbnNvbGVfYnVmZmVyKSA9PSAwIHx8IC8qIGlmIHByZXNzZWQgRW50ZXIgKi8KLQkJc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJuIikgPT0gMCB8fAotCQlzdHJjbXAoY29uc29sZV9idWZmZXIsIk4iKSA9PSAwICkgewotCQlwcmludGYoIlxuIik7Ci0JCXJldHVybiBNVl9GQUxTRTsKLQl9Ci0JcmV0dXJuIE1WX1RSVUU7Ci19Ci0KIGludCBkb19zYXJfZGVmYXVsdCh2b2lkKQogewogCU1WX1UzMiBpLCByYywgZGVmYXVsdFZhbHVlLCBib2FyZElkID0gbXZCb2FyZElkSW5kZXhHZXQobXZCb2FyZElkR2V0KCkpOwogCU1WX1NBVFJfVFlQRV9JRCBzYXRyQ2xhc3NJZDsKIAlNVl9CT0FSRF9TQVRSX0lORk8gc2F0ckluZm87Ci0KKwlNVl9VMzIgc2F0ckJvb3REZXZpY2VWYWx1ZSA9IG12Q3RybGJvb3RTcmNHZXQoKSwgdG1wOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfREVGQVVMVF9FTlRSWTsgaSsrKSB7CiAJCXNhdHJDbGFzc0lkID0gYm9hcmRTYXRyRGVmYXVsdFtpXS5zYXRySWQ7CiAJCWlmIChtdkJvYXJkU2F0ckluZm9Db25maWcoc2F0ckNsYXNzSWQsICZzYXRySW5mbykgIT0gTVZfT0spCiAJCQljb250aW51ZTsKKwkJaWYgKHNhdHJDbGFzc0lkID09IE1WX1NBVFJfQk9PVF9ERVZJQ0UpCisJCQlib2FyZFNhdHJEZWZhdWx0W2ldLmRlZmF1bGVWYWx1ZUZvckJvYXJkW2JvYXJkSWRdID0gc2F0ckJvb3REZXZpY2VWYWx1ZSAmIHNhdHJJbmZvLm1hc2s7CisJCWlmIChzYXRyQ2xhc3NJZCA9PSBNVl9TQVRSX0JPT1QyX0RFVklDRSkgeworCQkJdG1wID0gc2F0ckJvb3REZXZpY2VWYWx1ZSA+PiBNVl9TQVRSX0JPT1QyX1ZBTFVFX09GRlNFVDsKKwkJCWJvYXJkU2F0ckRlZmF1bHRbaV0uZGVmYXVsZVZhbHVlRm9yQm9hcmRbYm9hcmRJZF0gPSB0bXAgJiBNVl9TQVRSX0JPT1QyX1ZBTFVFX01BU0s7CisJCX0KIAkJZGVmYXVsdFZhbHVlID0gYm9hcmRTYXRyRGVmYXVsdFtpXS5kZWZhdWxlVmFsdWVGb3JCb2FyZFtib2FyZElkXTsKIAkJcmMgPSBtdkJvYXJkU2F0UldyaXRlKHNhdHJDbGFzc0lkLCBkZWZhdWx0VmFsdWUpOwogCQlpZiAocmMgPT0gTVZfRVJST1IpIHsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9hMzh4L212U3lzSHdDb25maWcuaCBiL2JvYXJkL212X2VidS9hMzh4L212U3lzSHdDb25maWcuaAppbmRleCBlNmY3MDRjLi45Y2RjNzEzIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9tdlN5c0h3Q29uZmlnLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2EzOHgvbXZTeXNId0NvbmZpZy5oCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIE1WX0lOQ0xVREVfVFdTSQogI2RlZmluZSBNVl9JTkNMVURFX1VBUlQKICNkZWZpbmUgTVZfSU5DTFVERV9URE0KKyNkZWZpbmUgTVZfSU5DTFVERV9BVURJTwogI2RlZmluZSBNVl9JTkNMVURFX1hPUgogI2RlZmluZSBDT05GSUdfU0FUQV9BSENJX01WIC8qIHNoYXJlZCBmb3IgdS1ib290IGFuZCBsaW51eCovCiAjZGVmaW5lIE1WX0lOQ0xVREVfU0FUQSAvKiBvbmx5IG9uIHUtYm9vdCAqLwpAQCAtNDAsNiArNDEsNyBAQAogI2RlZmluZSBNVl9JTkNMVURFX1JUQwogCiAjZGVmaW5lIE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTAorI2RlZmluZSBNVl9JTkNMVURFX1NXSVRDSAogCiAvKgogICogQm9hcmQgZGV2aWNlcwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2EzOHgvbXZfbWFpbl9hMzh4LmMgYi9ib2FyZC9tdl9lYnUvYTM4eC9tdl9tYWluX2EzOHguYwppbmRleCA2YzFmYzNkLi41ZjVmNThjIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvYTM4eC9tdl9tYWluX2EzOHguYworKysgYi9ib2FyZC9tdl9lYnUvYTM4eC9tdl9tYWluX2EzOHguYwpAQCAtMTAzLDYgKzEwMywxMSBAQAogI2luY2x1ZGUgPHNkaGNpLmg+CiBpbnQgbXZfc2RoX2luaXQodTMyIHJlZ2Jhc2UsIHUzMiBtYXhfY2xrLCB1MzIgbWluX2NsaywgdTMyIHF1aXJrcyk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19TV0lUQ0hJTkdfU0VSVklDRVMKKyNpbmNsdWRlICJzd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5oIgorI2VuZGlmCisKIC8qICNkZWZpbmUgTVZfREVCVUcgKi8KICNpZmRlZiBNVl9ERUJVRwogI2RlZmluZSBEQih4KSB4CkBAIC0zMDYsNyArMzExLDYgQEAKIAkJCSoodW5zaWduZWQgaW50KikoQ09ORklHX1NZU19URVhUX0JBU0UgKyBpKTsKIAogCW12Qm9hcmREZWJ1Z0xlZCg0KTsKLQltdl9wcmludF9tYXAoKTsKICNpZiBkZWZpbmVkKENPTkZJR19DTURfQk9BUkRDRkcpCiAJbXZCb2FyZEVlcHJvbVZhbGlkU2V0KCk7CiAjZW5kaWYKQEAgLTMxOSw2ICszMjMsMTAgQEAKIAljaGFyIHRtcF9idWZbMTBdOwogCXVuc2lnbmVkIGludCBtYWxsb2NfbGVuOwogCisJZW52ID0gZ2V0ZW52KCJsaW1pdF9kcmFtX3NpemUiKTsKKwlpZiAoIWVudikKKwkJc2V0ZW52KCJsaW1pdF9kcmFtX3NpemUiLCAieWVzIik7CisKIAllbnYgPSBnZXRlbnYoImNvbnNvbGUiKTsKIAlpZiAoIWVudikKIAkJc2V0ZW52KCJjb25zb2xlIiwgImNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CkBAIC0zMjYsNyArMzM0LDcgQEAKIAllbnYgPSBnZXRlbnYoIm10ZGlkcyIpOwogCWlmICghZW52KSB7CiAjaWYgZGVmaW5lZChNVl9OQU5EKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCQlzZXRlbnYoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZDtzcGkwPXNwaV9mbGFzaCIpOworCQlzZXRlbnYoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZCxzcGkwPXNwaV9mbGFzaCIpOwogI2VsaWYgZGVmaW5lZChNVl9OQU5EKQogCQlzZXRlbnYoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZCIpOwogI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKQEAgLTMzNiwxNSArMzQ0LDIzIEBACiAJZW52ID0gZ2V0ZW52KCJtdGRwYXJ0cyIpOwogCWlmICghZW52KSB7CiAjaWYgZGVmaW5lZChNVl9OQU5EKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCQlzZXRlbnYoIm10ZHBhcnRzIiwgIidtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpO210ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpJyIpOworCQkvKiBTaW5jZSBvbmx5IEFNQyBib2FyZCBzdXBwb3J0cyBib3RoIE5BTkQgYW5kIFNQSSwgYW5kIGl0IHVzZXMgU1BJMQorCQkgKiAic3BpMS4wIiBpcyB1c2VkIGluIG10ZHBhcnRzIGluc3RlYWQgb2YgInNwaTAuMCIgKi8KKwkJc2V0ZW52KCJtdGRwYXJ0cyIsICInbXRkcGFydHM9YXJtYWRhLW5hbmQ6OG0oYm9vdClybyw4bUA4bShrZXJuZWwpLC0ocm9vdGZzKTtzcGkxLjA6NG0oYm9vdCksLShzcGktcm9vdGZzKTsiCisJCQkJInB4YTN4eF9uYW5kLTA6OG0oYm9vdClybyw4bUA4bShrZXJuZWwpLC0ocm9vdGZzKSciKTsKKwkJc2V0ZW52KCJtdGRwYXJ0c19sZ2N5IiwgIidtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpO3NwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpOyIKKwkJCQkicHhhM3h4X25hbmQtMDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpJyIpOwogI2VsaWYgZGVmaW5lZChNVl9OQU5EKQotCQlzZXRlbnYoIm10ZHBhcnRzIiwgIm10ZHBhcnRzPWFybWFkYS1uYW5kOjhtKGJvb3Qpcm8sOG1AOG0oa2VybmVsKSwtKHJvb3RmcykiKTsKKwkJc2V0ZW52KCJtdGRwYXJ0cyIsICJtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpOyIKKwkJCQkicHhhM3h4X25hbmQtMDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpIik7CisJCXNldGVudigibXRkcGFydHNfbGdjeSIsIGdldGVudigibXRkcGFydHMiKSk7CiAjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQogI2lmZGVmIENPTkZJR19HRkNIMTAwCiAJCXNldGVudigibXRkcGFydHMiLCAibXRkcGFydHM9c3BpX2ZsYXNoOjFtKGJvb3QpLDY0a0AxbShlbnYpLC0ocmVzZXJ2ZWQpIik7CiAjZWxzZQotCQlzZXRlbnYoIm10ZHBhcnRzIiwgIm10ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpIik7CisJCXNldGVudigibXRkcGFydHMiLCAibXRkcGFydHM9c3BpMC4wOjRtKGJvb3QpLC0oc3BpLXJvb3RmcykiKTsKICNlbmRpZgorCQlzZXRlbnYoIm10ZHBhcnRzX2xnY3kiLCAibXRkcGFydHM9c3BpX2ZsYXNoOjRtKGJvb3QpLC0oc3BpLXJvb3RmcykiKTsKICNlbmRpZgogCX0KIApAQCAtNDkyLDExICs1MDgsMTEgQEAKIAllbnYgPSBnZXRlbnYoImJvb3RhcmdzX2RmbHQiKTsKIAlpZiAoIWVudikKICNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotCQlzZXRlbnYoImJvb3RhcmdzX2RmbHQiLCAiJGNvbnNvbGUgJG5hbmRFY2MgJG10ZHBhcnRzICRib290YXJnc19yb290IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCisJCXNldGVudigiYm9vdGFyZ3NfZGZsdCIsICIkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHNfbGdjeSAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgogCQkJICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAkbXZOZXRDb25maWcgdmlkZW89ZG92ZWZiOmxjZDA6JGxjZDBfcGFyYW1zICIKIAkJCSAgICJjbGNkLmxjZDBfZW5hYmxlPSRsY2QwX2VuYWJsZSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsICRuc3NfZW1hY19tYXAiKTsKICNlbHNlCi0JCXNldGVudigiYm9vdGFyZ3NfZGZsdCIsICIkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgJGJvb3RhcmdzX3Jvb3QgbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIKKwkJc2V0ZW52KCJib290YXJnc19kZmx0IiwgIiRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0c19sZ2N5ICRib290YXJnc19yb290IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCiAJCQkgICAiaXA9JGlwYWRkcjokc2VydmVyaXAkYm9vdGFyZ3NfZW5kICRtdk5ldENvbmZpZyB2aWRlbz1kb3ZlZmI6bGNkMDokbGNkMF9wYXJhbXMgIgogCQkJICAgImNsY2QubGNkMF9lbmFibGU9JGxjZDBfZW5hYmxlIGNsY2QubGNkX3BhbmVsPSRsY2RfcGFuZWwiKTsKICNlbmRpZgpAQCAtNTA1LDcgKzUyMSwxMSBAQAogCQlzZXRlbnYoImJvb3RjbWRfYXV0byIsICJzdGFnZV9ib290ICRib290X29yZGVyIik7CiAJZW52ID0gZ2V0ZW52KCJib290Y21kX2xnY3kiKTsKIAlpZiAoIWVudikKLQkJc2V0ZW52KCJib290Y21kX2xnY3kiLCAidGZ0cGJvb3QgMHgyMDAwMDAwICRpbWFnZV9uYW1lOyBzZXRlbnYgYm9vdGFyZ3MgJGJvb3RhcmdzX2RmbHQ7IGJvb3RtIDB4MjAwMDAwMDsgIik7CisJCXNldGVudigiYm9vdGNtZF9sZ2N5IiwgInRmdHBib290IDB4MjAwMDAwMCAkaW1hZ2VfbmFtZTsiCisJCQkgICAic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0c19sZ2N5IgorCQkJICAgIiAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgorCQkJICAgImlwPSRpcGFkZHI6JHNlcnZlcmlwJGJvb3RhcmdzX2VuZCAgdmlkZW89ZG92ZWZiOmxjZDA6JGxjZDBfcGFyYW1zICIKKwkJCSAgICJjbGNkLmxjZDBfZW5hYmxlPSRsY2QwX2VuYWJsZSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsOyAgYm9vdG0gJGxvYWRhZGRyOyAiKTsKICNlbmRpZgogCWVudiA9IGdldGVudigicHhlX2ZpbGVzX2xvYWQiKTsKIAlpZiAoIWVudikKQEAgLTUzMCw2ICs1NTAsMjIgQEAKIAkJc2V0ZW52KCJib290YXJnc19kZWJ1ZyIsICJkZWJ1Zz0xIGxvZ2luPTEgZWFybHlwcmludGsiKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NNRF9TT1VSQ0UKKwllbnYgPSBnZXRlbnYoInJ1bl9zY3JpcHQiKTsKKwlpZiAoIWVudikKKwkJc2V0ZW52KCJydW5fc2NyaXB0IiwgIm5vIik7CisjZW5kaWYKKwllbnYgPSBnZXRlbnYoInNkX2RldGVjdGlvbl9kYXQzIik7CisJaWYgKCFlbnYpIHsKKwkJLyogYnkgZGVmYXVsdCBEQi1HUCBpcyB0aGUgb25seSBtYXJ2ZWxsIGJvYXJkIHdpdGggREFUMyBkZXRlY3Rpb24gbWV0aG9kIHN1cHBvcnQuCisJCQlUaGlzIHN1cHBvcnQgd2FzIGFkZGVkIGluIEVDTyAxLjUgYW5kIGFib3ZlLCBzbyBhZGRlZCBlbnYuCisJCQl2YXJpYWJsZSB0byBjb250cm9sIGRldGVjdGlvbiBtZXRob2QgYWNjb3JkaW5nIHRvIEVDTyB2ZXIuICovCisJCWlmIChtdkJvYXJkSWRHZXQoKSA9PSBEQl9HUF82OFhYX0lEKQorCQkJc2V0ZW52KCJzZF9kZXRlY3Rpb25fZGF0MyIsICJ5ZXMiKTsKKwkJZWxzZQorCQkJc2V0ZW52KCJzZF9kZXRlY3Rpb25fZGF0MyIsICJubyIpOworCX0KKwogCS8qIG5ldGJzZCBib290IGFyZ3VtZW50cyAqLwogCWVudiA9IGdldGVudigibmV0YnNkX2VuIik7CiAJaWYgKCAhZW52IHx8ICggKChzdHJjbXAoZW52LCAibm8iKSA9PSAwKSB8fCAoc3RyY21wKGVudiwgIk5vIikgPT0gMCkgKSkpCkBAIC02MjQsMTEgKzY2MCw3IEBACiAJfSBlbHNlIHsKIAkJZW52ID0gZ2V0ZW52KCJib290YXJnc19lbmQiKTsKIAkJaWYgKCFlbnYpCi0jaWYgZGVmaW5lZChNVl9JTkNfQk9BUkRfUURfU1dJVENIKQotCQkJc2V0ZW52KCJib290YXJnc19lbmQiLCBNVl9CT09UQVJHU19FTkRfU1dJVENIKTsKLSNlbHNlCiAJCQlzZXRlbnYoImJvb3RhcmdzX2VuZCIsIE1WX0JPT1RBUkdTX0VORCk7Ci0jZW5kaWYKIAl9CiAKIAllbnYgPSBnZXRlbnYoImltYWdlX25hbWUiKTsKQEAgLTcwNCw5ICs3MzYsNyBAQAogI2lmIChDT05GSUdfQk9PVERFTEFZID49IDApCiAJZW52ID0gZ2V0ZW52KCJib290Y21kIik7CiAJaWYgKCFlbnYpCi0jaWYgZGVmaW5lZChDT05GSUdfT0ZfTElCRkRUKSAmJiBkZWZpbmVkIChDT05GSUdfT0ZfTElCRkRUX0lTX0RFRkFVTFQpCi0JCXNldGVudigiYm9vdGNtZCIsYm9vdGNtZF9mZHQpOwotI2VsaWYgZGVmaW5lZChDT05GSUdfR0ZDSDEwMCkKKyNpZiBkZWZpbmVkKENPTkZJR19HRkNIMTAwKQogCQlzZXRlbnYoImdmcGFyYW1zIiwKIAkJCSJpZiB0ZXN0ICRITlZfQUNUSVZBVEVEX0tFUk5FTF9OQU1FID0ga2VybmVsMTsgIgogCQkJInRoZW4gZ2ZrZXJuZWw9MHg5MDQ4IGdmcm9vdD1yb290PXJvb3RmczE7ICIKQEAgLTcxOCw0MiArNzQ4LDE4IEBACiAJCQkic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRtdGRwYXJ0cyAkZ2Zyb290ICRib290YXJnc19leHRyYTsgIgogCQkJImJvb3RtICRsb2FkYWRkcjsgIgogCQkpOwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ01EX1NUQUdFX0JPT1QpCi0vLwkJc2V0ZW52KCJib290Y21kIiwic3RhZ2VfYm9vdCAkYm9vdF9vcmRlciIpOwotLy8gVGVtcG9yYXJ5IHdvcmthcm91bmQgdGlsbCBzdGFnZV9ib290IGdldHMgc3RhYmxlLgotCQlzZXRlbnYoImJvb3RjbWQiLCAidGZ0cGJvb3QgMHgyMDAwMDAwICRpbWFnZV9uYW1lOyIKLQkJCSAgICJzZXRlbnYgYm9vdGFyZ3MgJGNvbnNvbGUgJG5hbmRFY2MgJG10ZHBhcnRzICRib290YXJnc19yb290IG5mc3Jvb3Q9JHNlcnZlcmlwOiRyb290cGF0aCAiCi0JCQkgICAiaXA9JGlwYWRkcjokc2VydmVyaXAkYm9vdGFyZ3NfZW5kICB2aWRlbz1kb3ZlZmI6bGNkMDokbGNkMF9wYXJhbXMgIgotCQkJICAgImNsY2QubGNkMF9lbmFibGU9JGxjZDBfZW5hYmxlIGNsY2QubGNkX3BhbmVsPSRsY2RfcGFuZWw7ICBib290bSAkbG9hZGFkZHI7ICIpOwotCi0jZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVERNKSB8fCBkZWZpbmVkKE1WX0lOQ19CT0FSRF9RRF9TV0lUQ0gpCi0JCXNldGVudigiYm9vdGNtZCIsICJ0ZnRwYm9vdCAweDIwMDAwMDAgJGltYWdlX25hbWU7IgotCQkJICAgInNldGVudiBib290YXJncyAkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgJGJvb3RhcmdzX3Jvb3QgbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIKLQkJCSAgICJpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQgJG12TmV0Q29uZmlnIHZpZGVvPWRvdmVmYjpsY2QwOiRsY2QwX3BhcmFtcyAiCi0JCQkgICAiY2xjZC5sY2QwX2VuYWJsZT0kKGxjZDBfZW5hYmxlKSBjbGNkLmxjZF9wYW5lbD0kbGNkX3BhbmVsOyAgYm9vdG0gJGxvYWRhZGRyOyAiKTsKICNlbHNlCi0JCXNldGVudigiYm9vdGNtZCIsICJ0ZnRwYm9vdCAweDIwMDAwMDAgJGltYWdlX25hbWU7IgotCQkJICAgInNldGVudiBib290YXJncyAkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgJGJvb3RhcmdzX3Jvb3QgbmZzcm9vdD0kc2VydmVyaXA6JHJvb3RwYXRoICIKLQkJCSAgICJpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQgIHZpZGVvPWRvdmVmYjpsY2QwOiRsY2QwX3BhcmFtcyAiCi0JCQkgICAiY2xjZC5sY2QwX2VuYWJsZT0kbGNkMF9lbmFibGUgY2xjZC5sY2RfcGFuZWw9JGxjZF9wYW5lbDsgIGJvb3RtICRsb2FkYWRkcjsgIik7CisJCXNldGVudigiYm9vdGNtZCIsICJ0ZnRwYm9vdCAweDIwMDAwMDAgJGltYWdlX25hbWU7dGZ0cGJvb3QgJGZkdGFkZHIgJGZkdGZpbGU7IgorCQkic2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAkYm9vdGFyZ3Nfcm9vdCBuZnNyb290PSRzZXJ2ZXJpcDokcm9vdHBhdGggIgorCQkiaXA9JGlwYWRkcjokc2VydmVyaXAkYm9vdGFyZ3NfZW5kICRtdk5ldENvbmZpZyB2aWRlbz1kb3ZlZmI6bGNkMDokbGNkMF9wYXJhbXMgIgorCQkiY2xjZC5sY2QwX2VuYWJsZT0kbGNkMF9lbmFibGUgY2xjZC5sY2RfcGFuZWw9JGxjZF9wYW5lbDsgYm9vdHogMHgyMDAwMDAwIC0gJGZkdGFkZHI7Iik7CiAjZW5kaWYKICNlbmRpZiAgLyogKENPTkZJR19CT09UREVMQVkgPj0gMCkgKi8KIAogCWVudiA9IGdldGVudigic3RhbmRhbG9uZSIpOwogCWlmICghZW52KQotI2lmIGRlZmluZWQoTVZfSU5DTFVERV9URE0pICYmIGRlZmluZWQoTVZfSU5DX0JPQVJEX1FEX1NXSVRDSCkKLQkJc2V0ZW52KCJzdGFuZGFsb25lIiwgImZzbG9hZCAweDIwMDAwMDAgJGltYWdlX25hbWU7c2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAiCi0JCQkgICAicm9vdD0vZGV2L210ZGJsb2NrMCBydyBpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQgJG12TmV0Q29uZmlnOyBib290bSAweDIwMDAwMDA7Iik7Ci0jZWxpZiBkZWZpbmVkKE1WX0lOQ19CT0FSRF9RRF9TV0lUQ0gpCi0JCXNldGVudigic3RhbmRhbG9uZSIsICJmc2xvYWQgMHgyMDAwMDAwICRpbWFnZV9uYW1lO3NldGVudiBib290YXJncyAkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgIgotCQkJICAgInJvb3Q9L2Rldi9tdGRibG9jazAgcncgaXA9JGlwYWRkcjokc2VydmVyaXAkYm9vdGFyZ3NfZW5kICRtdk5ldENvbmZpZzsgYm9vdG0gMHgyMDAwMDAwOyIpOwotI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX1RETSkKLQkJc2V0ZW52KCJzdGFuZGFsb25lIiwgImZzbG9hZCAweDIwMDAwMDAgJGltYWdlX25hbWU7c2V0ZW52IGJvb3RhcmdzICRjb25zb2xlICRuYW5kRWNjICRtdGRwYXJ0cyAiCisJCXNldGVudigic3RhbmRhbG9uZSIsICJmc2xvYWQgMHgyMDAwMDAwICRpbWFnZV9uYW1lO3NldGVudiBib290YXJncyAkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHNfbGdjeSAiCiAJCQkgICAicm9vdD0vZGV2L210ZGJsb2NrMCBydyBpcD0kaXBhZGRyOiRzZXJ2ZXJpcCRib290YXJnc19lbmQ7IGJvb3RtIDB4MjAwMDAwMDsiKTsKLSNlbHNlCi0JCXNldGVudigic3RhbmRhbG9uZSIsICJmc2xvYWQgMHgyMDAwMDAwICRpbWFnZV9uYW1lO3NldGVudiBib290YXJncyAkY29uc29sZSAkbmFuZEVjYyAkbXRkcGFydHMgIgotCQkJICAgInJvb3Q9L2Rldi9tdGRibG9jazAgcncgaXA9JGlwYWRkcjokc2VydmVyaXAkYm9vdGFyZ3NfZW5kOyBib290bSAweDIwMDAwMDA7Iik7Ci0jZW5kaWYKIAogCS8qIFNldCBib29kZWxheSB0byAzIHNlYywgaWYgTW9uaXRvciBleHRlbnNpb24gYXJlIGRpc2FibGVkICovCiAJaWYgKCFlbmFNb25FeHQoKSkKQEAgLTk4Niw2ICs5OTIsMTEgQEAKIAkJa2lja19uZXh0KCk7CiAKIAltdkJvYXJkRGVidWdMZWQoMCk7CisjaWZkZWYgQ09ORklHX1NXSVRDSElOR19TRVJWSUNFUworCS8qIFNvbWUgYWRkaXRpb25hbCB0YXNrcyBtYXliZSByZXF1aXJlZCBmb3Igc2xhdmUgQkMyIGRldmljZSwgbGlrZSBRU0dNSUkgc2VsZWN0ICovCisJaWYgKG12Qm9hcmRpc0FtYygpICYmIChnZXRfYXR0YWNoZWRfc2lsaWNvbl90eXBlKCkgPT0gU0lMVF9CQzIpKQorCQlod1NlcnZpY2VzTGF0ZUluaXQoKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0xMDYwLDYgKzEwNzEsNyBAQAogaW50IGxhdGVfcHJpbnRfY3B1aW5mbyh2b2lkKQogewogCWNoYXIgbmFtZVs1MF07CisJaW50IGRkclR5cGUgPSA0OwogCiAJbXZDdHJsVXBkYXRlUGV4SWQoKTsKIApAQCAtMTA4MCw5ICsxMDkyLDEyIEBACiAJcHJpbnRmKCIgICAgICAgQ1BVICAgIEAgJWQgW01Iel1cbiIsIG12Q3B1UGNsa0dldCgpLzEwMDAwMDApOwogCXByaW50ZigiICAgICAgIEwyICAgICBAICVkIFtNSHpdXG4iLCBtdkNwdUwyQ2xrR2V0KCkvMTAwMDAwMCk7CiAJcHJpbnRmKCIgICAgICAgVENsb2NrIEAgJWQgW01Iel1cbiIsIG12VGNsa0dldCgpLzEwMDAwMDApOwotCXByaW50ZigiICAgICAgIEREUiAgICBAICVkIFtNSHpdXG4iLCBDT05GSUdfU1lTX0JVU19DTEsvMTAwMDAwMCk7Ci0JcHJpbnRmKCIgICAgICAgRERSICVkIEJpdCBXaWR0aCwgJXMgTWVtb3J5IEFjY2VzcywgRExCICVzLCBFQ0MgJXMiLAotCQkJbXZDdHJsRERSQnVkV2lkdGgoKSwKKyNpZmRlZiBDT05GSUdfRERSMy8qRERSMyovCisJZGRyVHlwZSA9IDM7CisjZW5kaWYKKwlwcmludGYoIiAgICAgICBERFIlZCAgICBAICVkIFtNSHpdXG4iLCBkZHJUeXBlLCBDT05GSUdfU1lTX0JVU19DTEsvMTAwMDAwMCk7CisJcHJpbnRmKCIgICAgICAgRERSJWQgJWQgQml0IFdpZHRoLCVzIE1lbW9yeSBBY2Nlc3MsIERMQiAlcywgRUNDICVzIiwKKwkJCWRkclR5cGUsIG12Q3RybEREUkJ1ZFdpZHRoKCksCiAJCQltdkN0cmxERFJUaHJ1WGJhcigpID8gIlhCQVIiIDogIkZhc3RQYXRoIiwKIAkJCW12Q3RybElzRExCRW5hYmxlZCgpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKIAkJCW12Q3RybEREUkVDQygpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CkBAIC0xMTI0LDYgKzExMzksNyBAQAogI2VuZGlmCiAJLyogaW5pdCB0aGUgdW5pdHMgZGVjb2RlIHdpbmRvd3MgKi8KIAltaXNjX2luaXRfcl9kZWNfd2luKCk7CisJbXZfcHJpbnRfbWFwKCk7CiAJbWVtc2V0KCh2b2lkKilDT05GSUdfU1lTX0xPQURfQUREUiwgMCwgQ09ORklHX1NZU19NSU5fSERSX0RFTF9TSVpFKTsKIAltdkJvYXJkRGVidWdMZWQoNik7CiAKQEAgLTExNDMsMTMgKzExNTksMjAgQEAKIAogCXNldGVudigicGNpZVR1bmUiLCAibm8iKTsKIAorCisKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVU5NX0VUSCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpCiAJbXZCb2FyZEVnaWdhUGh5SW5pdCgpOwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfQ01EX0RBVEUpCiAJcnRjX2luaXQoKTsgLyogRW5zdXJlIHRoZSBidXMgYnJpZGdlIHBhcmFtZXRlcnMgYXJlIHJlYWR5IGZvciBSVEMgYWNjZXNzICovCiAjZW5kaWYKLQorI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisJLyogcnVuIHNhdmVkIHNjcmlwdCAqLworCWVudiA9IGdldGVudigicnVuX3NjcmlwdCIpOworCWlmIChlbnYgJiYgc3RyY21wKGVudiwgInllcyIpID09IDApCisJCXJ1bl9jb21tYW5kKCJtdnNvdXJjZSBydW4iLCAwKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYwppbmRleCA4MjdkYjdjLi5hNGQwMzA3IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKQEAgLTEwMyw2ICsxMDMsMzIgQEAKIE1WX1UzMiBib2FyZE9wdGlvbnNDb25maWdbTVZfQ09ORklHX1RZUEVfTUFYX09QVElPTl07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRpc1VzYlBvcnRDb25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIHJldHVybiBUcnVlIGlmIHJlcXVlc3RlZCBVU0IgdHlwZSBhbmQgcG9ydCBudW0gZXhpc3RzIG9uIGN1cnJlbnQgYm9hcmQKKyoKKyogSU5QVVQ6CisqICAgICAgIHVzYlR5cGVJRCAgICAgICAtIHJlcXVlc3RlZCBVU0IgdHlwZSA6IFVTQjNfVU5JVF9JRCAvIFVTQl9VTklUX0lECisqICAgICAgIHVzYlBvcnROdW1iZGVyICAtIHJlcXVlc3RlZCBVU0IgcG9ydCBudW1iZXIgKGFjY29yZGluZyB0byB4SENJIE1BQyBwb3J0IG51bSkKKyoKKyogT1VUUFVUOiBOb25lCisqCisqIFJFVFVSTjogTVZfVFJVRSBpZiByZXF1ZXN0ZWQgcG9ydC90eXBlIGV4aXN0IG9uIGJvYXJkCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpCit7CisJLyogVVNCIFBvcnQgYm9hcmQgbWFwcGluZyBpcyBub3Qgc3VwcG9ydGVkIGJ5IEF2YW50YS1MUAorCSAgQ29udHJvbGxlciBtYXBwaW5nIGlzIGRvbmUgdmlhIG12Q3RybFVzYk1hcEdldC4qLworCWlmICh1c2JQb3J0TnVtYmVyID49IG12Q3RybFVzYk1heEdldCgpKQorCQlyZXR1cm4gTVZfRkFMU0U7CisJcmV0dXJuIE1WX1RSVUU7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkSWRJbmRleEdldAogKgogKiBERVNDUklQVElPTjoKQEAgLTE3MDIsNiArMTcyOCw0MSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSByZXR1cm5zIHBvcnQncyBjb25uZWN0aW9uIHN0YXR1cywgdGhpcyByb3V0ZSBwcm92aWRlIGEgdW5pZmllZCBpbmVyZmFjZQorKiAgICAgICBmb3Igb3RoZXIgbW9kdWxlcyB0byBjYWxsIHdpdGhvdXQgY2FyZSBvZiB0aGUgc3dpdGNoIGNvbm50ZWN0aW9uIG1vZGUgLSBleHRlcm5hbCBvciBpbnRlcm5hbAorKiAgICAgICBpZiB0aGUgc3dpdGNoIGlzIGNvbm5lY3RlZAorKgorKiBJTlBVVDoKKyogICAgICAgZXRoUG9ydE51bSAtIEV0aGVybmV0IHBvcnQgbnVtYmVyLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgMSAtIGlmIGV0aFBvcnROdW0gaXMgY29ubmVjdGVkIHRvIHN3aXRjaCwgMCBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKHZvaWQpCit7CisJcmV0dXJuIG12Qm9hcmRJc0ludGVybmFsU3dpdGNoQ29ubmVjdGVkKCk7CisKK30KKworLyogdGhpcyB0ZW1wb3JhcnkgZnVuY3Rpb25zIHRvIGNvbXBpbGUgc3dpdGNoIGNvZGUuCisgICBtdkV0aEU2MTcxU3dpdGNoQmFzaWNJbml0IGlzIG5vdCB1c2VkIGJ5IGFscCBjb2RlICovCitNVl9CT09MIG12Qm9hcmRTd2l0Y2hDcHVQb3J0SXNSZ21paShNVl9VMzIgc3dpdGNoSWR4KQoreworCXJldHVybiBNVl9GQUxTRTsKK30KK01WXzMyIG12Qm9hcmRTd2l0Y2hQaHlBZGRyR2V0KE1WX1UzMiBzd2l0Y2hJZHgpCit7CisJcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkRnJlcU1vZGVzTnVtR2V0CiAqCiAqIERFU0NSSVBUSU9OOiBSZXR1cm4gdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgZnJlcXVlbmN5IG1vZGVzIGZvciB0aGlzIFNvQwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaCBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKaW5kZXggZjIxNTQ3My4uZjY3Y2EzZCAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaAorKysgYi9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCkBAIC02MTMsNyArNjEzLDEwIEBACiBNVl9VOCBtdkJvYXJkQ3B1RnJlcUdldChNVl9WT0lEKTsKIE1WX1NUQVRVUyBtdkJvYXJkQ3B1RnJlcVNldChNVl9VOCBmcmVxVmFsKTsKIE1WX1NUQVRVUyBtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZCh2b2lkKTsKK01WX0JPT0wgbXZCb2FyZFN3aXRjaENwdVBvcnRJc1JnbWlpKE1WX1UzMiBzd2l0Y2hJZHgpOworTVZfMzIgbXZCb2FyZFN3aXRjaFBoeUFkZHJHZXQoTVZfVTMyIHN3aXRjaElkeCk7CiBNVl9VMzIgbXZCb2FyZFN3aXRjaFBvcnRGb3JjZUxpbmtHZXQoTVZfVTMyIHN3aXRjaElkeCk7CitNVl9TVEFUVVMgbXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKHZvaWQpOwogTVZfVTMyIG12Qm9hcmRGcmVxTW9kZXNOdW1HZXQodm9pZCk7CiBNVl8zMiBtdkJvYXJkU21pU2Nhbk1vZGVHZXQoTVZfVTMyIHN3aXRjaElkeCk7CiBNVl9CT0FSRF9NQUNfU1BFRUQgbXZCb2FyZE1hY1NwZWVkR2V0KE1WX1UzMiBldGhQb3J0TnVtKTsKQEAgLTYzOCw2ICs2NDEsNyBAQAogTVZfTkZDX0VDQ19NT0RFIG12Qm9hcmROYW5kRUNDTW9kZUdldCh2b2lkKTsKIE1WX1NUQVRVUyBtdkJvYXJkRWVwcm9tV3JpdGVEZWZhdWx0Q2ZnKHZvaWQpOwogTVZfTkFORF9JRl9NT0RFIG12Qm9hcmROYW5kSWZHZXQodm9pZCk7CitNVl9CT09MIG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoTVZfVU5JVF9JRCB1c2JUeXBlSUQsIE1WX1U4IHVzYlBvcnROdW1iZXIpOwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYyBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCmluZGV4IGYwYTlmMWMuLjU4MWRhMzggMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCisrKyBiL2JvYXJkL212X2VidS9hbHAvYXZhbnRhX2xwX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCkBAIC0yMTcsNiArMjE3LDI4IEBACiAKIAlyZXR1cm4gTVZfRVJST1I7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybElzVXNiU2VyRGVzQ29ubmVjdGVkCisqCisqIERFU0NSSVBUSU9OOmNoZWNrIGlmIFNlckRlcyBsYW5lIGlzIGNvbm5lY3RlZCB0byBVU0IzIGhvc3QuCisqCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46cmV0dXJuIHRydWUgaWYgU2VyRGVzIGxhbmUgaXMgY29ubmVjdGVkIHRvIFVTQjMgaG9zdCwgZmFsc2Ugb3RoZXJ3aXNlLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQoTVZfVTMyIHVzYlBvcnQpCit7CisJaW50IHVzYjNIb3N0TnVtID0gbXZDdHJsVXNiM0hvc3RNYXhHZXQoKTsKKwlpbnQgbWF4U2VyRGVzTGFuZXMgPSBtdkN0cmxVc2IzTWF4R2V0KCk7CisJaWYgKHVzYlBvcnQgPj0gbWF4U2VyRGVzTGFuZXMgJiYgdXNiM0hvc3ROdW0gPiBtYXhTZXJEZXNMYW5lcykKKwkJcmV0dXJuIE1WX0ZBTFNFOworCXJldHVybiBNVl9UUlVFOworfQogCiAjaWZkZWYgTVZfSU5DTFVERV9QRVgKIE1WX1NUQVRVUyBtdkN0cmxVcGRhdGVQZXhJZChNVl9WT0lEKQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2FscC9hdmFudGFfbHBfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmggYi9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAppbmRleCAxMDc4NGNkLi5hMmQ1MWYxIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAorKysgYi9ib2FyZC9tdl9lYnUvYWxwL2F2YW50YV9scF9mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaApAQCAtMjY1LDYgKzI2NSw3IEBACiBNVl9TVEFUVVMgbXZDdHJsU2F0UldyaXRlKE1WX1NBVFJfVFlQRV9JRCBzYXRyUmVhZEZpZWxkLCBNVl9VOCB2YWwsIE1WX0JPT0wgcmVzdG9yZURlZmF1bHQpOwogTVZfU1RBVFVTIG12Q3RybFNhdFJSZWFkKE1WX1NBVFJfVFlQRV9JRCBzYXRyRmllbGQsIE1WX1UzMiAqdmFsdWUpOwogTVZfU1RBVFVTIG12Q3RybENwdURkckwyRnJlcUdldChNVl9GUkVRX01PREUgKmZyZXFNb2RlKTsKK01WX0JPT0wgbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQoTVZfVTMyIHVzYlBvcnQpOwogTVZfVk9JRCBtdkN0cmxTYXRySW5pdChNVl9WT0lEKTsKIE1WX1UzMiBtdkN0cmxHZXRDcHVOdW0oTVZfVk9JRCk7CiBNVl9CT09MIG12Q3RybElzU3NjZ0VuYWJsZWQoTVZfVk9JRCk7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvYWxwL212X21haW5fYWxwLmMgYi9ib2FyZC9tdl9lYnUvYWxwL212X21haW5fYWxwLmMKaW5kZXggN2U4NjMyMC4uMzIwOTY5YSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2FscC9tdl9tYWluX2FscC5jCisrKyBiL2JvYXJkL212X2VidS9hbHAvbXZfbWFpbl9hbHAuYwpAQCAtMzAyLDcgKzMwMiw2IEBACiAJCQkqKHVuc2lnbmVkIGludCopKENPTkZJR19TWVNfVEVYVF9CQVNFICsgaSk7CiAKIAltdkJvYXJkRGVidWdMZWQoNCk7Ci0JbXZfcHJpbnRfbWFwKCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxOSw3ICszMTgsNyBAQAogCWVudiA9IGdldGVudigibXRkaWRzIik7CiAJaWYgKCFlbnYpIHsKICNpZiBkZWZpbmVkKE1WX05BTkQpICYmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0JCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kO3NwaTA9c3BpX2ZsYXNoIik7CisJCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kLHNwaTA9c3BpX2ZsYXNoIik7CiAjZWxpZiBkZWZpbmVkKE1WX05BTkQpCiAJCXNldGVudigibXRkaWRzIiwgIm5hbmQwPWFybWFkYS1uYW5kIik7CiAjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQpAQCAtNDk1LDYgKzQ5NCwxMiBAQAogCWlmICghZW52KQogCQlzZXRlbnYoImluaXRyZF9uYW1lIiwgInVJbml0cmQiKTsKIAorI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisJZW52ID0gZ2V0ZW52KCJydW5fc2NyaXB0Iik7CisJaWYgKCFlbnYpCisJCXNldGVudigicnVuX3NjcmlwdCIsICJubyIpOworI2VuZGlmCisKIAkvKiBuZXRic2QgYm9vdCBhcmd1bWVudHMgKi8KIAllbnYgPSBnZXRlbnYoIm5ldGJzZF9lbiIpOwogCWlmICggIWVudiB8fCAoICgoc3RyY21wKGVudiwgIm5vIikgPT0gMCkgfHwgKHN0cmNtcChlbnYsICJObyIpID09IDApICkpKQpAQCAtMTA0NSw2ICsxMDUwLDcgQEAKICNpZiAhZGVmaW5lZChDT05GSUdfTUFDSF9BVkFOVEFfTFBfRlBHQSkKIAkvKiBpbml0IHRoZSB1bml0cyBkZWNvZGUgd2luZG93cyAqLwogCW1pc2NfaW5pdF9yX2RlY193aW4oKTsKKwltdl9wcmludF9tYXAoKTsKIAltZW1zZXQoKHZvaWQqKUNPTkZJR19TWVNfTE9BRF9BRERSLCAwLCBDT05GSUdfU1lTX01JTl9IRFJfREVMX1NJWkUpOwogCW12Qm9hcmREZWJ1Z0xlZCg2KTsKIApAQCAtMTA2OSw3ICsxMDc1LDEyIEBACiAJbXZCb2FyZEVnaWdhUGh5SW5pdCgpOwogI2VuZGlmCiAjZW5kaWYKLQorI2lmZGVmIENPTkZJR19DTURfU09VUkNFCisJLyogcnVuIHNhdmVkIHNjcmlwdCAqLworCWVudiA9IGdldGVudigicnVuX3NjcmlwdCIpOworCWlmIChlbnYgJiYgc3RyY21wKGVudiwgInllcyIpID09IDApCisJCXJ1bl9jb21tYW5kKCJtdnNvdXJjZSBydW4iLCAwKTsKKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL01ha2VmaWxlIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9NYWtlZmlsZQppbmRleCA5YzQ2YmYwLi40ZjY4OTY5IDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL01ha2VmaWxlCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIE1BS0VfUFBWMiA9IHllcwogTUFLRV9HRU5FUkFMX1VfQk9PVF9UT09MUyA9IHllcwogTUFLRV9TUElfTkFORCA9IHllcworTUFLRV9TV0lUQ0ggPSB5ZXMKIGVuZGlmCiAKIGlmZXEgKCQoQk9BUkQpLGEzNzUpCkBAIC0zMyw2ICszNCwxMCBAQAogTUFLRV9HRU5FUkFMX1VfQk9PVF9UT09MUyA9IHllcwogTUFLRV9TUElfTkFORCA9IHllcwogTUFLRV9SVEMyID0geWVzCitpZmRlZiBDT05GSUdfQVJNQURBXzM4WAorTUFLRV9TV0lUQ0hfU0VSVklDRVMgPSB5ZXMKK2VuZGlmCitNQUtFX1NXSVRDSCA9IHllcwogZW5kaWYKIAogaWZlcSAoJChCT0FSRCksbXN5cykKQEAgLTk5LDYgKzEwNCw3IEBACiAJCSQoVVNQX0RJUikvbXZfY21kLm8JCVwKIAkJJChVU1BfRElSKS9tdl9kcmFtLm8JCVwKIAkJJChVU1BfRElSKS9jbWRfYnVidC5vCQlcCisJCSQoVVNQX0RJUikvY21kX212c291cmNlLm8JXAogCQkkKFVTUF9ESVIpL2NtZF9yZXNldGVudi5vCVwKIAkJJChVU1BfRElSKS9tdkRyYW1TY3J1YmJpbmcubwlcCiAJCSQoVVNQX0RJUikvY21kX2Rkci5vCQlcCkBAIC0xMTksMTIgKzEyNSwxMyBAQAogCQkkKEhBTF9QUDJfQ0xTX0RJUikvbXZQcDJDbGFzc2lmaWVyLm8JXAogCQkkKEhBTF9QUDJfQ09NTU9OX0RJUikvbXZQcDJDb21tb24ubwlcCiAJCSQoVVNQX0RJUikvbXZfZWdpZ2FfcHAyLm8KLQotVVNQX09CSlMgKz0JJChVU1BfRVRIX1NXSVRDSF9ESVIpL212U3dpdGNoLm8KIGVuZGlmCiAKIGlmZGVmIE1BS0VfU1dJVENIX1NFUlZJQ0VTCi1VU1BfT0JKUyArPSAgICAgJChVU1BfRElSKS9zd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5vCitVU1BfT0JKUyArPQkkKFVTUF9ESVIpL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLm8KK2lmZXEgKCQoQk9BUkQpLGEzOHgpCitVU1BfT0JKUyArPQkkKFVTUF9ESVIpL3N3aXRjaGluZ1NlcnZpY2VzL3Nhcl9iYzIubworZW5kaWYKIGVuZGlmCiAKIGlmZGVmIE1BS0VfTkVUQQpAQCAtMTM1LDYgKzE0Miw5IEBACiAJCSQoVVNQX0RJUikvbXZfZWdpZ2FfbmV0YS5vCiBlbmRpZgogCitpZmRlZiBNQUtFX1NXSVRDSAorVVNQX09CSlMgKz0JJChVU1BfRVRIX1NXSVRDSF9ESVIpL212U3dpdGNoLm8KK2VuZGlmCiAKIGlmZGVmIE1BS0VfVVNCCiBIQUxfSUZfT0JKUyArPSAJJChIQUxfSUZfRElSKS9tdlN5c1VzYi5vCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9jbWRfYnVidC5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvY21kX2J1YnQuYwppbmRleCA2Mzg1MmFkLi42Zjc2YmYxIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9jbWRfYnVidC5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2NtZF9idWJ0LmMKQEAgLTMxLDYgKzMxLDggQEAKIAogI2luY2x1ZGUgPGZzLmg+CiAKKyNkZWZpbmUJREVTVElOQVRJT05fU1RSSU5HCTEwCisKICNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKICNpbmNsdWRlIDxuYW5kLmg+CiBleHRlcm4gbmFuZF9pbmZvX3QgbmFuZF9pbmZvW107ICAgICAgIC8qIGluZm8gZm9yIE5BTkQgY2hpcHMgKi8KQEAgLTEzMSwxMSArMTMzLDEzIEBACiAvKgogICogRXh0cmFjdCBhcmd1bWVudHMgZnJvbSBidWJ0IGNvbW1hbmQgbGluZQogICogYXJnYywgYXJndiBhcmUgdGhlIGlucHV0IGFyZ3VtZW50cyBvZiBidWJ0IGNvbW1hbmQgbGluZQotICogbG9hZGZyb20gaXMgcG9pbnRlciB0byB0aGUgZXh0cmFjdGVkIGFyZ3VtZW50OiBmcm9tIHdoZXJlIHRvIGxvYWQgdGhlIHUtYm9vdCBiaW4gZmlsZQorICogbG9hZGZyb20gaXMgYSBwb2ludGVyIHRvIHRoZSBleHRyYWN0ZWQgYXJndW1lbnQ6IGZyb20gd2hlcmUgdG8gbG9hZCB0aGUgdS1ib290IGJpbiBmaWxlCisgKiBkZXN0aW5hdGlvbl9idXJuIGlzIGEgcG9pbnRlciB0byBhIHN0cmluZyB3aGljaCBkZW5vdGVzIHRoZSBidWJ0IGludGVyZmFjZSAKICAqLwotTVZfU1RBVFVTIGZldGNoX2J1YnRfY21kX2FyZ3MoaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10sIE1WX1UzMiAqbG9hZGZyb20pCitNVl9TVEFUVVMgZmV0Y2hfYnVidF9jbWRfYXJncyhpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgaW50ICpsb2FkZnJvbSwgY2hhciAqZGVzdGluYXRpb25fYnVybikKIHsKIAkqbG9hZGZyb20gPSAwOworCXN0cmNweShkZXN0aW5hdGlvbl9idXJuLCJkZWZhdWx0Iik7CiAJLyogYnVidCAqLwogCWlmIChhcmdjIDwgMikgewogCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgInUtYm9vdC5iaW4iLCBzaXplb2YoQm9vdEZpbGUpKTsKQEAgLTE0Niw2ICsxNTAsNyBAQAogCQlpZiAoKDAgPT0gc3RyY21wKGFyZ3ZbMV0sICJzcGkiKSkgfHwgKDAgPT0gc3RyY21wKGFyZ3ZbMV0sICJuYW5kIikpCiAJCQkJfHwgKDAgPT0gc3RyY21wKGFyZ3ZbMV0sICJub3IiKSkpCiAJCXsKKwkJCXN0cmNweShkZXN0aW5hdGlvbl9idXJuLCBhcmd2WzFdKTsKIAkJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCAidS1ib290LmJpbiIsIHNpemVvZihCb290RmlsZSkpOwogCQkJcHJpbnRmKCJVc2luZyBkZWZhdWx0IGZpbGVuYW1lIFwidS1ib290LmJpblwiIFxuIik7CiAJCX0KQEAgLTE1OSw2ICsxNjQsNyBAQAogCQlpZiAoKDAgPT0gc3RyY21wKGFyZ3ZbMV0sICJzcGkiKSkgfHwgKDAgPT0gc3RyY21wKGFyZ3ZbMV0sICJuYW5kIikpCiAJCQkJfHwgKDAgPT0gc3RyY21wKGFyZ3ZbMV0sICJub3IiKSkpCiAJCXsKKwkJCXN0cmNweShkZXN0aW5hdGlvbl9idXJuLCBhcmd2WzFdKTsKIAkJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCAidS1ib290LmJpbiIsIHNpemVvZihCb290RmlsZSkpOwogCQkJcHJpbnRmKCJVc2luZyBkZWZhdWx0IGZpbGVuYW1lIFwidS1ib290LmJpblwiIFxuIik7CiAKQEAgLTE3NCwxMiArMTgwLDE2IEBACiAJCX0KIAkJZWxzZQogCQl7CisJCQlzdHJjcHkoZGVzdGluYXRpb25fYnVybiwgYXJndlsyXSk7CisKIAkJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBhcmd2WzFdLCBzaXplb2YoQm9vdEZpbGUpKTsKIAkJfQogCX0KIAkvKiAiYnVidCBmaWxlbmFtZSBkZXN0aW5hdGlvbiBzb3VyY2UiICovCiAJZWxzZQogCXsKKwkJc3RyY3B5KGRlc3RpbmF0aW9uX2J1cm4sIGFyZ3ZbMl0pOworCiAJCWNvcHlfZmlsZW5hbWUgKEJvb3RGaWxlLCBhcmd2WzFdLCBzaXplb2YoQm9vdEZpbGUpKTsKIAogCQlpZiAoMCA9PSBzdHJjbXAoInVzYiIsIGFyZ3ZbM10pKSB7CkBAIC0yMzAsMjAgKzI0MCwxOSBAQAogCXJldHVybiBmaWxlc2l6ZTsKIH0KIAotI2lmIGRlZmluZWQoTVZfTkFORF9CT09UKQorI2lmIGRlZmluZWQoTVZfTkFORF9CT09UKSB8fCBkZWZpbmVkKE1WX05BTkQpCiAvKiBCb290IGZyb20gTkFORCBmbGFzaCAqLwogLyogV3JpdGUgdS1ib290IGltYWdlIGludG8gdGhlIG5hbmQgZmxhc2ggKi8KLWludCBuYW5kX2J1cm5fdWJvb3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK2ludCBuYW5kX2J1cm5fdWJvb3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgbG9hZGZyb20sIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewogCWludCBmaWxlc2l6ZSA9IDA7CiAJTVZfVTMyIHJldCA9IDA7CiAJZXh0ZXJuIGNoYXIgY29uc29sZV9idWZmZXJbXTsKIAluYW5kX2luZm9fdCAqbmFuZCA9ICZuYW5kX2luZm9bMF07CiAJc2l6ZV90IGJsb2Nrc2l6ZSA9IG5hbmRfaW5mb1swXS5lcmFzZXNpemU7Ci0Jc2l6ZV90IGVudl9vZmZzZXQgPSBDT05GSUdfRU5WX09GRlNFVDsKKwlzaXplX3QgZW52X29mZnNldCA9IENPTkZJR19FTlZfT0ZGU0VUX05BTkQ7CiAJc2l6ZV90IHNpemUgPSBDT05GSUdfVUJPT1RfU0laRTsKIAlzaXplX3Qgb2Zmc2V0ID0gMDsKLQlNVl9VMzIgbG9hZGZyb20gPSAwOyAvKiAwIC0gZnJvbSB0ZnRwLCAxIC0gZnJvbSBVU0IgKi8KIAogCS8qIEFsaWduIFUtQm9vdCBzaXplIHRvIGN1cnJlbnRseSB1c2VkIGJsb2Nrc2l6ZSAqLwogCXNpemUgPSAoKHNpemUgKyAoYmxvY2tzaXplIC0gMSkpICYgKH4oYmxvY2tzaXplLTEpKSk7CkBAIC0yNjcsOSArMjc2LDYgQEAKICNlbmRpZgogCiAJLyogdmVyaWZ5IHJlcXVlc3RlZCBzb3VyY2UgaXMgdmFsaWQgKi8KLQlpZiAoZmV0Y2hfYnVidF9jbWRfYXJncyhhcmdjLCBhcmd2LCAmbG9hZGZyb20pICE9IE1WX09LKQotCQlyZXR1cm4gMDsKLQogCWlmICgoZmlsZXNpemUgPSBmZXRjaF91Ym9vdF9maWxlIChsb2FkZnJvbSkpIDw9IDApCiAJCXJldHVybiAwOwogCkBAIC0yODQsOCArMjkwLDggQEAKIAkgICAgc3RyY21wKGNvbnNvbGVfYnVmZmVyLCJ5ZXMiKSA9PSAwIHx8CiAJICAgIHN0cmNtcChjb25zb2xlX2J1ZmZlciwieSIpID09IDAgKSB7CiAKLQkJcHJpbnRmKCJFcmFzaW5nIDB4JXggLSAweCV4OiIsZW52X29mZnNldCwgZW52X29mZnNldCArIENPTkZJR19FTlZfUkFOR0UpOwotCQluYW5kX2VyYXNlKG5hbmQsIGVudl9vZmZzZXQsIENPTkZJR19FTlZfUkFOR0UpOworCQlwcmludGYoIkVyYXNpbmcgMHgleCAtIDB4JXg6IixlbnZfb2Zmc2V0LCBlbnZfb2Zmc2V0ICsgQ09ORklHX0VOVl9SQU5HRV9OQU5EKTsKKwkJbmFuZF9lcmFzZShuYW5kLCBlbnZfb2Zmc2V0LCBDT05GSUdfRU5WX1JBTkdFX05BTkQpOwogCQlwcmludGYoIlx0W0RvbmVdXG4iKTsKIAl9CiAKQEAgLTMwMywyNyArMzA5LDE4IEBACiAJcmV0dXJuIDE7CiB9CiAKLVVfQk9PVF9DTUQoCi0JCWJ1YnQsICAgICAgNCwgICAgIDEsICAgICAgbmFuZF9idXJuX3Vib290X2NtZCwKLQkJImJ1YnQJLSBCdXJuIGFuIGltYWdlIG9uIHRoZSBCb290IE5hbmQgRmxhc2guXG4iLAotCQkiW2ZpbGUtbmFtZV0gW2Rlc3RpbmF0aW9uIFtzb3VyY2VdXSBcbiIKLQkJIlx0QnVybiBhIGJpbmFyeSBpbWFnZSBvbiB0aGUgQm9vdCBGbGFzaCwgZGVmYXVsdCBmaWxlLW5hbWUgaXMgdS1ib290LmJpbiAuXG4iCi0JCSJcdGRlc3RpbmF0aW9uIGlzIG5hbmQsIHNwaSBvciBub3IuXG4iCi0JCSJcdHNvdXJjZSBjYW4gYmUgdGZ0cCBvciB1c2IsIGRlZmF1bHQgaXMgdGZ0cC5cbiIKLSk7CiAjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfTkFORF9CT09UKSAqLwogCi0jaWYgZGVmaW5lZChNVl9TUElfQk9PVCkKKyNpZiBkZWZpbmVkKE1WX1NQSV9CT09UKSB8fCBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQogCiAvKiBCb290IGZyb20gU1BJIGZsYXNoICovCiAvKiBXcml0ZSB1LWJvb3QgaW1hZ2UgaW50byB0aGUgU1BJIGZsYXNoICovCi1pbnQgc3BpX2J1cm5fdWJvb3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK2ludCBzcGlfYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBsb2FkZnJvbSwgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCiB7CiAJaW50IGZpbGVzaXplID0gMDsKIAlNVl9VMzIgcmV0ID0gMDsKIAlleHRlcm4gY2hhciBjb25zb2xlX2J1ZmZlcltdOwogCWxvYWRfYWRkciA9IENPTkZJR19TWVNfTE9BRF9BRERSOwotCU1WX1UzMiBsb2FkZnJvbSA9IDA7IC8qIDAgLSBmcm9tIHRmdHAsIDEgLSBmcm9tIFVTQiAqLwogCiAJaWYoIWZsYXNoKSB7CiAJCWZsYXNoID0gc3BpX2ZsYXNoX3Byb2JlKENPTkZJR19FTlZfU1BJX0JVUywgQ09ORklHX0VOVl9TUElfQ1MsCkBAIC0zMzYsOSArMzMzLDYgQEAKIAl9CiAKIAkvKiB2ZXJpZnkgcmVxdWVzdGVkIHNvdXJjZSBpcyB2YWxpZCAqLwotCWlmIChmZXRjaF9idWJ0X2NtZF9hcmdzKGFyZ2MsIGFyZ3YsICZsb2FkZnJvbSkgIT0gTVZfT0spCi0JCXJldHVybiAwOwotCiAJaWYgKChmaWxlc2l6ZSA9IGZldGNoX3Vib290X2ZpbGUgKGxvYWRmcm9tKSkgPD0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTM1NSwxNyArMzQ5LDE3IEBACiAJICAgIHN0cmNtcChjb25zb2xlX2J1ZmZlciwieWVzIikgPT0gMCB8fAogCSAgICBzdHJjbXAoY29uc29sZV9idWZmZXIsInkiKSA9PSAwICkgewogCi0JCXByaW50ZigiRXJhc2luZyAweCV4IC0gMHgleDoiLENPTkZJR19FTlZfT0ZGU0VULCBDT05GSUdfRU5WX09GRlNFVCArIENPTkZJR19FTlZfU0laRSk7Ci0JCXNwaV9mbGFzaF9lcmFzZShmbGFzaCwgQ09ORklHX0VOVl9PRkZTRVQsIENPTkZJR19FTlZfU0laRSk7CisJCXByaW50ZigiRXJhc2luZyAweCV4IC0gMHgleDoiLENPTkZJR19FTlZfT0ZGU0VUX1NQSSwgQ09ORklHX0VOVl9PRkZTRVRfU1BJICsgQ09ORklHX0VOVl9TSVpFX1NQSSk7CisJCXNwaV9mbGFzaF9lcmFzZShmbGFzaCwgQ09ORklHX0VOVl9PRkZTRVRfU1BJLCBDT05GSUdfRU5WX1NJWkVfU1BJKTsKIAkJcHJpbnRmKCJcdFtEb25lXVxuIik7CiAJfQotCWlmIChmaWxlc2l6ZSA+IENPTkZJR19FTlZfT0ZGU0VUKQorCWlmIChmaWxlc2l6ZSA+IENPTkZJR19FTlZfT0ZGU0VUX1NQSSkKIAl7CiAJCXByaW50ZigiRXJyb3I6IEltYWdlIHNpemUgKCV4KSBleGNlZWRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBvZmZzZXQgKCV4KS4gIixmaWxlc2l6ZSxDT05GSUdfRU5WX09GRlNFVCk7CiAJCXJldHVybiAwOwogCX0KLQlwcmludGYoIkVyYXNpbmcgMHgleCAtIDB4JXg6ICIsMCwgMCArIENPTkZJR19FTlZfT0ZGU0VUKTsKLQlzcGlfZmxhc2hfZXJhc2UoZmxhc2gsIDAsIENPTkZJR19FTlZfT0ZGU0VUKTsKKwlwcmludGYoIkVyYXNpbmcgMHgleCAtIDB4JXg6ICIsMCwgMCArIENPTkZJR19FTlZfT0ZGU0VUX1NQSSk7CisJc3BpX2ZsYXNoX2VyYXNlKGZsYXNoLCAwLCBDT05GSUdfRU5WX09GRlNFVF9TUEkpOwogCXByaW50ZigiXHRcdFtEb25lXVxuIik7CiAKIAlwcmludGYoIldyaXRpbmcgaW1hZ2UgdG8gZmxhc2g6Iik7CkBAIC0zODQsMjIgKzM3OCwxMyBAQAogCXJldHVybiAxOwogfQogCi1VX0JPT1RfQ01EKAotCQlidWJ0LCAgICAgIDQsICAgICAxLCAgICAgIHNwaV9idXJuX3Vib290X2NtZCwKLQkJImJ1YnQJLSBCdXJuIGFuIGltYWdlIG9uIHRoZSBCb290IFNQSSBGbGFzaC5cbiIsCi0JCSIgZmlsZS1uYW1lIFxuIgotCQkiW2ZpbGUtbmFtZV0gW2Rlc3RpbmF0aW9uIFtzb3VyY2VdXSBcbiIKLQkJIlx0QnVybiBhIGJpbmFyeSBpbWFnZSBvbiB0aGUgQm9vdCBGbGFzaCwgZGVmYXVsdCBmaWxlLW5hbWUgaXMgdS1ib290LmJpbiAuXG4iCi0JCSJcdGRlc3RpbmF0aW9uIGlzIG5hbmQsIHNwaSBvciBub3IuXG4iCi0JCSJcdHNvdXJjZSBjYW4gYmUgdGZ0cCBvciB1c2IsIGRlZmF1bHQgaXMgdGZ0cC5cbiIKLSk7CiAjZW5kaWYKIAogCi0jaWYgZGVmaW5lZChNVl9OT1JfQk9PVCkKKyNpZiBkZWZpbmVkKE1WX05PUl9CT09UKSB8fCAoTVZfSU5DTFVERV9OT1IpCiAKIC8qIEJvb3QgZnJvbSBOb3IgZmxhc2ggKi8KLWludCBub3JfYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoraW50IG5vcl9idXJuX3Vib290X2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGxvYWRmcm9tLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKIHsKIAlpbnQgZmlsZXNpemUgPSAwOwogCU1WX1UzMiByZXQgPSAwOwpAQCAtNDE0LDEyICszOTksOCBAQAogLy8Jc19lbmQgPSBmbGFzaF9pbl93aGljaF9zZWMoJmZsYXNoX2luZm9bMF0sIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFICsgQ09ORklHX1NZU19NT05JVE9SX0xFTiAtMSk7CiAvLwllbnZfc2VjID0gZmxhc2hfaW5fd2hpY2hfc2VjKCZmbGFzaF9pbmZvWzBdLCBDT05GSUdfRU5WX0FERFIpOwogCi0JTVZfVTMyIGxvYWRmcm9tID0gMDsgLyogMCAtIGZyb20gdGZ0cCwgMSAtIGZyb20gVVNCICovCiAKIAkvKiB2ZXJpZnkgcmVxdWVzdGVkIHNvdXJjZSBpcyB2YWxpZCAqLwotCWlmIChmZXRjaF9idWJ0X2NtZF9hcmdzKGFyZ2MsIGFyZ3YsICZsb2FkZnJvbSkgIT0gTVZfT0spCi0JCXJldHVybiAwOwotCiAJaWYgKChmaWxlc2l6ZSA9IGZldGNoX3Vib290X2ZpbGUgKGxvYWRmcm9tKSkgPD0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTQ2MywyNyArNDQ0LDE3IEBACiAJcmV0dXJuIDE7CiB9CiAKLVVfQk9PVF9DTUQoCi0JCWJ1YnQsICAgICAgNCwgICAgIDEsICAgICAgbm9yX2J1cm5fdWJvb3RfY21kLAotCQkiYnVidAktIEJ1cm4gYW4gaW1hZ2Ugb24gdGhlIEJvb3QgRmxhc2guXG4iLAotCQkiIGZpbGUtbmFtZSBcbiIKLQkJIltmaWxlLW5hbWVdIFtkZXN0aW5hdGlvbiBbc291cmNlXV0gXG4iCi0JCSJcdEJ1cm4gYSBiaW5hcnkgaW1hZ2Ugb24gdGhlIEJvb3QgRmxhc2gsIGRlZmF1bHQgZmlsZS1uYW1lIGlzIHUtYm9vdC5iaW4gLlxuIgotCQkiXHRkZXN0aW5hdGlvbiBpcyBuYW5kLCBzcGkgb3Igbm9yLlxuIgotCQkiXHRzb3VyY2UgY2FuIGJlIHRmdHAgb3IgdXNiLCBkZWZhdWx0IGlzIHRmdHAuXG4iCi0pOwogI2VuZGlmIC8qIE1WX05PUl9CT09UICovCiAKICNpZiBkZWZpbmVkKE1WX01NQ19CT09UKQogCiAvKiBCb290IGZyb20gU0QvTU1DL2VNTUMgKi8KIC8qIFdyaXRlIHUtYm9vdCBpbWFnZSBpbnRvIFNEL01NQy9lTU1DIGRldmljZSAqLwotaW50IG1tY19idXJuX3Vib290X2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCitpbnQgbW1jX2J1cm5fdWJvb3RfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgbG9hZGZyb20sIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewogCWludCBmaWxlc2l6ZSA9IDA7CiAJZXh0ZXJuIGNoYXIgY29uc29sZV9idWZmZXJbXTsKIAlsb2FkX2FkZHIgPSBDT05GSUdfU1lTX0xPQURfQUREUjsKLQlNVl9VMzIgbG9hZGZyb20gPSAwOyAvKiAwIC0gZnJvbSB0ZnRwLCAxIC0gZnJvbSBVU0IgKi8KIAlsYmFpbnRfdAlzdGFydF9sYmE7CiAJbGJhaW50X3QJYmxrX2NvdW50OwogCXVsb25nCQlibGtfd3JpdHRlbjsKQEAgLTUxNCw5ICs0ODUsNiBAQAogI2VuZGlmCiAKIAkvKiB2ZXJpZnkgcmVxdWVzdGVkIHNvdXJjZSBpcyB2YWxpZCAqLwotCWlmIChmZXRjaF9idWJ0X2NtZF9hcmdzKGFyZ2MsIGFyZ3YsICZsb2FkZnJvbSkgIT0gTVZfT0spCi0JCXJldHVybiAwOwotCiAJaWYgKChmaWxlc2l6ZSA9IGZldGNoX3Vib290X2ZpbGUgKGxvYWRmcm9tKSkgPD0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTU2NSwxMiArNTMzLDc2IEBACiAJcmV0dXJuIDE7CiB9CiAKKyNlbmRpZgorCitpbnQgYnVybl91Ym9vdF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCWNoYXIJZGVzdGluYXRpb25fYnVybltERVNUSU5BVElPTl9TVFJJTkddOworCWludAlsb2FkZnJvbSA9IDA7IC8qIDAgLSBmcm9tIHRmdHAsIDEgLSBmcm9tIFVTQiAqLworCisJbWVtc2V0KGRlc3RpbmF0aW9uX2J1cm4sICdcMCcsIHNpemVvZihkZXN0aW5hdGlvbl9idXJuKSk7CisKKwlpZihmZXRjaF9idWJ0X2NtZF9hcmdzKGFyZ2MsIGFyZ3YsICZsb2FkZnJvbSxkZXN0aW5hdGlvbl9idXJuKSAhPSBNVl9PSykKKwkJcmV0dXJuIDA7CisKKyNpZiBkZWZpbmVkKE1WX0NST1NTX0ZMQVNIX0JPT1QpCisJaWYgKDAgPT0gc3RyY21wKGRlc3RpbmF0aW9uX2J1cm4sICJuYW5kIikpIHsKKyNpZiBkZWZpbmVkKE1WX05BTkQpIHx8IGRlZmluZWQoTVZfTkFORF9CT09UKQorCQlyZXR1cm4gbmFuZF9idXJuX3Vib290X2NtZChjbWR0cCwgZmxhZywgbG9hZGZyb20sIGFyZ2MsIGFyZ3YpOworI2VuZGlmCisJCXByaW50ZigiXHRbRkFJTF0gLSB1LWJvb3QgZG9lcyBub3Qgc3VwcG9ydCBhIHdyaXRlIHRvICVzIGludGVyZmFjZS5cbiIsZGVzdGluYXRpb25fYnVybik7CisJCXJldHVybiAwOworCX0KKworCWlmICgwID09IHN0cmNtcChkZXN0aW5hdGlvbl9idXJuLCAic3BpIikpIHsKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKSB8fCBkZWZpbmVkIChNVl9TUElfQk9PVCkKKwkJcmV0dXJuIHNwaV9idXJuX3Vib290X2NtZChjbWR0cCwgZmxhZywgbG9hZGZyb20sIGFyZ2MsIGFyZ3YpOworI2VuZGlmCisJCXByaW50ZigiXHRbRkFJTF0gLSB1LWJvb3QgZG9lcyBub3Qgc3VwcG9ydCBhIHdyaXRlIHRvICVzIGludGVyZmFjZS5cbiIsZGVzdGluYXRpb25fYnVybik7CisJCXJldHVybiAwOworCX0KKworCWlmICgwID09IHN0cmNtcChkZXN0aW5hdGlvbl9idXJuLCAibm9yIikpIHsKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKSB8fCBkZWZpbmVkIChNVl9OT1JfQk9PVCkKKwkJcmV0dXJuIG5vcl9idXJuX3Vib290X2NtZChjbWR0cCwgZmxhZywgbG9hZGZyb20sIGFyZ2MsIGFyZ3YpOworI2VuZGlmCisJCXByaW50ZigiXHRbRkFJTF0gLSB1LWJvb3QgZG9lcyBub3Qgc3VwcG9ydCBhIHdyaXRlIHRvICVzIGludGVyZmFjZS5cbiIsZGVzdGluYXRpb25fYnVybik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChNVl9OQU5EX0JPT1QpCisJCXJldHVybiBuYW5kX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX1NQSV9CT09UKQorCQlyZXR1cm4gc3BpX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX05PUl9CT09UKQorCQlyZXR1cm4gbm9yX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX01NQ19CT09UKQorCQlyZXR1cm4gbW1jX2J1cm5fdWJvb3RfY21kKGNtZHRwLCBmbGFnLCBsb2FkZnJvbSwgYXJnYywgYXJndik7CisjZW5kaWYKKworCQlyZXR1cm4gMTsKK30KKworI2lmIGRlZmluZWQoTVZfTU1DX0JPT1QpCiBVX0JPT1RfQ01EKAotCQlidWJ0LCAgICAgIDMsICAgICAxLCAgICAgIG1tY19idXJuX3Vib290X2NtZCwKLQkJImJ1YnQJLSBCdXJuIGFuIGltYWdlIG9uIHRoZSBCb290IFNEL01NQy9lTU1DIGRldmljZS5cbiIsCisJCWJ1YnQsICAgICAgMywgICAgIDAsICAgICAgYnVybl91Ym9vdF9jbWQsCisJCSJidWJ0CS0gQnVybiBhbiBpbWFnZSBvbiB0aGUgQm9vdCBkZXZpY2UuXG4iLAogCQkiIGZpbGUtbmFtZSBcbiIKIAkJIltmaWxlLW5hbWVdIFtzb3VyY2VdIFxuIgogCQkiXHRCdXJuIGEgYmluYXJ5IGltYWdlIG9uIHRoZSBCb290IERldmljZSwgZGVmYXVsdCBmaWxlLW5hbWUgaXMgdS1ib290LmJpbiAuXG4iCiAJCSJcdHNvdXJjZSBjYW4gYmUgdGZ0cCBvciB1c2IsIGRlZmF1bHQgaXMgdGZ0cC5cbiIKICk7CisjZWxzZQorVV9CT09UX0NNRCgKKwkJYnVidCwgICAgICA0LCAgICAgMCwgICAgICBidXJuX3Vib290X2NtZCwKKwkJImJ1YnQJLSBCdXJuIGFuIGltYWdlIG9uIHRoZSBCb290IGZsYXNoIGRldmljZS5cbiIsCisJCSJbZmlsZS1uYW1lXSBbZGVzdGluYXRpb24gW3NvdXJjZV1dIFxuIgorCQkiXHRCdXJuIGEgYmluYXJ5IGltYWdlIG9uIHRoZSBCb290IERldmljZSwgZGVmYXVsdCBmaWxlLW5hbWUgaXMgdS1ib290LmJpbiAuXG4iCisJCSJcdHNvdXJjZSBjYW4gYmUgdGZ0cCBvciB1c2IsIGRlZmF1bHQgaXMgdGZ0cC5cbiIKKwkJIlx0ZXhhbXBsZTogYnVidCB1LWJvb3QuYmluIG5hbmQgdGZ0cFxuIgorCQkpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9jbWRfbXZzb3VyY2UuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2NtZF9tdnNvdXJjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNTAyYjAKLS0tIC9kZXYvbnVsbAorKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9jbWRfbXZzb3VyY2UuYwpAQCAtMCwwICsxLDUzOCBAQAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgIm12Q29tbW9uLmgiCisjaW5jbHVkZSA8Y29tbWFuZC5oPgorI2luY2x1ZGUgPG5ldC5oPgorI2luY2x1ZGUgPGVudmlyb25tZW50Lmg+CisKKyNpZmRlZiBDT05GSUdfQ01EX1NPVVJDRQorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VU0IpCisjaW5jbHVkZSA8dXNiLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGZzLmg+CisKKyNkZWZpbmUJREVTVElOQVRJT05fU1RSSU5HCTEwCisKKyNpZiBkZWZpbmVkKENPTkZJR19DTURfTkFORCkKKyNpbmNsdWRlIDxuYW5kLmg+CitleHRlcm4gbmFuZF9pbmZvX3QgbmFuZF9pbmZvW107ICAgICAgIC8qIGluZm8gZm9yIE5BTkQgY2hpcHMgKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0NNRF9TRgorI2luY2x1ZGUgPHNwaV9mbGFzaC5oPgorZXh0ZXJuIHN0cnVjdCBzcGlfZmxhc2ggKmZsYXNoOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ01EX0ZMQVNICisjaW5jbHVkZSA8Zmxhc2guaD4KK2V4dGVybiBmbGFzaF9pbmZvX3QgZmxhc2hfaW5mb1tdOyAgICAgICAvKiBpbmZvIGZvciBGTEFTSCBjaGlwcyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxpbWFnZS5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCitpbnQgZGVzdF9mbGFzaDsgLyogZGVzdGluYXRpb24gZmxhc2ggdG8gYnVybiB0aGUgc2NyaXB0ICgwID0gU1BJLCAxID0gTkFORCkgKi8KKworI2lmZGVmIE1WX0lOQ0xVREVfVVNCCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBsb2FkX2Zyb21fdXNiCisqCisqIERFU0NSSVBUSU9OOgorKiBMb2FkIHNjcmlwdCBmaWxlIGZyb20gdXNiIGRldmljZQorKgorKiBJTlBVVDoKKyoJZmlsZV9uYW1lCS0gaW1nIGZpbGUgbmFtZS4KKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCS0gZmlsZSBzaXplIG9uIHN1Y2Nlc3MKKyoJLSAwLCBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGxvYWRfZnJvbV91c2IoY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworCWNvbnN0IGNoYXIgKmFkZHJfc3RyOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlpbnQgZmlsZXNpemUgPSAwOworCisJdXNiX3N0b3AoKTsKKwlwcmludGYoIihSZSlzdGFydCBVU0IuLi5cbiIpOworCisJaWYgKHVzYl9pbml0KCkgPCAwKSB7CisJCXByaW50ZigidXNiX2luaXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdHJ5IHRvIHJlY29nbml6ZSBzdG9yYWdlIGRldmljZXMgaW1tZWRpYXRlbHkgKi8KKwkvKiB0aGUgcGFyYW1ldGVyICcxJywgdGVsbHMgdGhlIGZ1bmN0aW9uIHRvIHJlcG9ydHMgdG8gdGhlCisJICogdXNlciB3aGlsZSBzY2FubmluZyBmb3IgZGV2aWNlICovCisJaWYgKC0xID09IHVzYl9zdG9yX3NjYW4oMSkpIHsKKwkJcHJpbnRmKCJVU0Igc3RvcmFnZSBkZXZpY2Ugbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYWx3YXlzIGxvYWQgZnJvbSB1c2IgMCAqLworCWlmIChmc19zZXRfYmxrX2RldigidXNiIiwgIjAiLCBGU19UWVBFX0FOWSkpIHsKKwkJcHJpbnRmKCJVU0IgMCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhZGRyX3N0ciA9IGdldGVudigibG9hZGFkZHIiKTsKKwlpZiAoYWRkcl9zdHIgIT0gTlVMTCkKKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFkZHJfc3RyLCBOVUxMLCAxNik7CisJZWxzZQorCQlhZGRyID0gQ09ORklHX1NZU19MT0FEX0FERFI7CisKKwlmaWxlc2l6ZSA9IGZzX3JlYWQoZmlsZV9uYW1lLCBhZGRyLCAwLCAwKTsKKwlyZXR1cm4gZmlsZXNpemU7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZmV0Y2hfc2NyaXB0X2ZpbGUKKyoKKyogREVTQ1JJUFRJT046CisqIExvYWQgc2NyaXB0IGZpbGUgaW50byByYW0gZnJvbSBleHRlcm5hbCBkZXZpY2U6IHRmdHAsIHVzYgorKgorKiBJTlBVVDoKKyoJbG9hZGZyb20JLSBzcGVjaWZpZXMgdGhlIHNvdXJjZSBkZXZpY2U6CisqCQkJICAwIC0gVEZUUCwgMSAtIFVTQgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJLSBmaWxlIHNpemUgb24gc3VjY2VzcworKgktIDAsIG90aGVyd2lzZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZmV0Y2hfc2NyaXB0X2ZpbGUoaW50IGxvYWRmcm9tKQoreworCWludCBmaWxlc2l6ZSA9IDA7CisJc3dpdGNoIChsb2FkZnJvbSkgeworI2lmZGVmIE1WX0lOQ0xVREVfVVNCCisJY2FzZSAxOgorCQlmaWxlc2l6ZSA9IGxvYWRfZnJvbV91c2IoQm9vdEZpbGUpOworCQlpZiAoZmlsZXNpemUgPD0gMCkgeworCQkJcHJpbnRmKCJGYWlsZWQgdG8gcmVhZCBmaWxlICVzXG4iLCBCb290RmlsZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCWNhc2UgMDoKKwkJZmlsZXNpemUgPSBOZXRMb29wKFRGVFBHRVQpOworCQlwcmludGYoIkNoZWNraW5nIGZpbGUgc2l6ZToiKTsKKwkJaWYgKGZpbGVzaXplID09IC0xKSB7CisJCQlwcmludGYoIlx0W0ZhaWxdXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBmaWxlc2l6ZTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZmV0Y2hfbXZzb3VyY2VfY21kX2FyZ3MKKyoKKyogREVTQ1JJUFRJT046CisqIGZldGNoIGNvbW1hbmQgYXJndW1lbnRzIGZyb20gYXJndiBhbmQgcmV0dXJuIHRoZW0gaW4gdmFyaWFibGVzCisqCisqIElOUFVUOgorKglhcmdjCQktIGNvbW1hbmQgYXJndW1lbnRzJyBudW1iZXIKKyoJYXJndgkJLSBjb21tYW5kIGFyZ3VtZW50cycgdmFsdWVzCisqCisqIE9VVFBVVDoKKyoJY29tbWFuZAkJLSBjb21tYW5kIHRvIHJ1biAoMCA9IGJ1cm4sIDEgPSBydW4pCisqCW9mZnNldAkJLSBvZmZzZXQgaW4gZmxhc2ggdG8gYnVybiB0aGUgc2NyaXB0CisqCWxvYWRmcm9tCS0gc291cmNlIGludGVyZmFjZSAoMCA9IFRGVFAsIDEgPSBVU0IpCisqCWRlc3QJCS0gZGVzdGluYXRpb24gZmxhc2ggaWYgbXVsdGlwbGUgZmxhc2hlcyBzdXBwb3J0ZWQKKyoJCQkgICgwID0gU1BJLCAxID0gTkFORCkKKyoKKyogUkVUVVJOOgorKgktIE1WX09LIG9uIHN1Y2Nlc3MKKyoJLSBNVl9GQUlMLCBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTVZfU1RBVFVTIGZldGNoX212c291cmNlX2NtZF9hcmdzKGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdLAorCQlpbnQgKmNvbW1hbmQsIE1WX1UzMiAqb2Zmc2V0LCBpbnQgKmxvYWRmcm9tLCBpbnQgKmRlc3QpIHsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpkZWZhdWx0X25hbWUgPSAic2NyaXB0LmltZyI7CisKKwkqY29tbWFuZCA9IC0xOwkJLyogMCA9IGJ1cm47IDEgPSBydW47IC0xID0gaW52YWxpZCBjb21tYW5kICovCisJKm9mZnNldCA9IDB4MzAwMDAwOworCSpsb2FkZnJvbSA9IDA7CQkvKiAwID0gVEZUUDsgMSA9IFVTQiAqLworCSpkZXN0ID0gMDsJCS8qIDAgPSBTUEk7IDEgPSBOQU5EICovCisKKwkvKiBmZXRjaCBkZXN0aW5hdGlvbiBpbnRlcmZhY2UgKGlmIGV4aXN0cyksIGVsc2UgdXNlIFNQSSBhcyBkZWZhdWx0ICovCisJZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgeworCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICJzcGkiKSA9PSAwKSB7CisJCQkqZGVzdCA9IDA7CisJCQlhcmdjLS07CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIm5hbmQiKSA9PSAwKSB7CisJCQkqZGVzdCA9IDE7CisJCQlhcmdjLS07CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChhcmdjIDwgMikgeyAvKiBlbXB0eSBjb21tYW5kIGlzIHVuYWNjZXB0YWJsZSAqLworCQlwcmludGYoIkVycm9yOiB0b28gZmV3IGFyZ3VtZW50c1xuIik7CisJCXJldHVybiBNVl9GQUlMOworCX0KKworCS8qIHNraXAgbWFpbiBjb21tYW5kIG5hbWUgKi8KKwlhcmdjLS07CisJYXJndisrOworCWlmIChzdHJjbXAoYXJndlswXSwgImJ1cm4iKSA9PSAwKSB7CisJCSpjb21tYW5kID0gMDsKKwkJLyogb25seSBidXJuIGNvbW1hbmQgaGF2ZSBmaWxlbmFtZSBhcyAxc3QgcGFyYW1ldGVyICovCisJCWlmIChhcmdjID4gMSkgeworCQkJc3RybmNweShCb290RmlsZSwgYXJndlsxXSwgc3RybGVuKGFyZ3ZbMV0pKTsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJfSBlbHNlIHsKKwkJCXN0cm5jcHkoQm9vdEZpbGUsIGRlZmF1bHRfbmFtZSwgc3RybGVuKGRlZmF1bHRfbmFtZSkpOworCQkJcHJpbnRmKCJ1c2luZyBkZWZhdWx0IGZpbGVuYW1lIFwiJXNcIlxuIiwgZGVmYXVsdF9uYW1lKTsKKwkJfQorCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJydW4iKSA9PSAwKQorCQkqY29tbWFuZCA9IDE7CisJZWxzZSB7CisJCXByaW50ZigiRXJyb3I6IHVua25vd24gY29tbWFuZFxuIik7CisJCXJldHVybiBNVl9GQUlMOworCX0KKworCS8qIHNraXAgaW50ZXJuYWwgY29tbWFuZCBuYW1lICgnYnVybicgb3IgJ3J1bicpICovCisJYXJnYy0tOworCWFyZ3YrKzsKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCWlmIChzdHJjbXAoYXJndlsxXSwgInRmdHAiKSA9PSAwKQorCQkJKmxvYWRmcm9tID0gMDsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMV0sICJ1c2IiKSA9PSAwKQorCQkJKmxvYWRmcm9tID0gMTsKKwkJZWxzZQorCQkJcmV0dXJuIE1WX0ZBSUw7CisJY2FzZSAxOgorCQkqb2Zmc2V0ID0gc2ltcGxlX3N0cnRvdWwoYXJndlswXSwgTlVMTCwgMTYpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTVZfT0s7Cit9CisKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaW5pdF9zcGkKKyoKKyogREVTQ1JJUFRJT046CisqIGluaXQgc3BpIGZsYXNoIGlmIG5vdCBpbml0aWF0ZWQKKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKgkwCW9uIHN1Y2Nlc3MKKyoJLTEJb3RoZXJ3aXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0X3NwaSh2b2lkKXsKKwlpZiAoIWZsYXNoKSB7CisJCWZsYXNoID0gc3BpX2ZsYXNoX3Byb2JlKENPTkZJR19FTlZfU1BJX0JVUywgQ09ORklHX0VOVl9TUElfQ1MsCisJCQkJCQkJCUNPTkZJR19TRl9ERUZBVUxUX1NQRUVELCBDT05GSUdfU0ZfREVGQVVMVF9NT0RFKTsKKwkJaWYgKCFmbGFzaCkgeworCQkJcHJpbnRmKCJGYWlsZWQgdG8gcHJvYmUgU1BJIEZsYXNoXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogc3BpX2J1cm5fc2NyaXB0CisqCisqIERFU0NSSVBUSU9OOgorKiBidXJuIHNjcmlwdCBpbWFnZSB0byB0aGUgU1BJIGZsYXNoCisqCisqIElOUFVUOgorKglvZmZzZXQJCS0gb2Zmc2V0IGluIGZsYXNoIHRvIGJ1cm4gdGhlIHNjcmlwdAorKglsb2FkZnJvbQktIHNvdXJjZSBpbnRlcmZhY2UgdG8gZmV0Y2ggdGhlIGZpbGUgKDAgPSBURlRQLCAxID0gVVNCKQorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJTm9uZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzcGlfYnVybl9zY3JpcHQoTVZfVTMyIG9mZnNldCwgaW50IGxvYWRmcm9tKQoreworCWludCBmaWxlc2l6ZSA9IDA7CisJTVZfVTMyIHJldCA9IDA7CisJbG9hZF9hZGRyID0gQ09ORklHX1NZU19MT0FEX0FERFI7CisJdTMyIHNlY3Rvcl9zaXplLCBhbGlnbmVkX3NpemU7CisKKwlpZiAoaW5pdF9zcGkoKSkKKwkJcmV0dXJuOworCisJc2VjdG9yX3NpemUgPSAgZmxhc2gtPnNlY3Rvcl9zaXplOworCisJLyogdmVyaWZ5IHJlcXVlc3RlZCBzb3VyY2UgaXMgdmFsaWQgKi8KKwlmaWxlc2l6ZSA9IGZldGNoX3NjcmlwdF9maWxlKGxvYWRmcm9tKTsKKwlpZiAoZmlsZXNpemUgPD0gMCkKKwkJcmV0dXJuOworCisJYWxpZ25lZF9zaXplID0gKChmaWxlc2l6ZSArIChzZWN0b3Jfc2l6ZSAtIDEpKSAmICh+KHNlY3Rvcl9zaXplIC0gMSkpKTsKKwlwcmludGYoIkVyYXNpbmcgMHgleCAtIDB4JXg6ICIsIG9mZnNldCwgb2Zmc2V0ICsgYWxpZ25lZF9zaXplKTsKKwlzcGlfZmxhc2hfZXJhc2UoZmxhc2gsIG9mZnNldCwgYWxpZ25lZF9zaXplKTsKKwlwcmludGYoIlx0XHRbRG9uZV1cbiIpOworCisJcHJpbnRmKCJXcml0aW5nIGltYWdlIHRvIGZsYXNoOiIpOworCXJldCA9IHNwaV9mbGFzaF93cml0ZShmbGFzaCwgb2Zmc2V0LCBmaWxlc2l6ZSwgKGNvbnN0IHZvaWQgKilsb2FkX2FkZHIpOworCisJaWYgKHJldCkKKwkJcHJpbnRmKCJcdFx0W0VyciFdXG4iKTsKKwllbHNlCisJCXByaW50ZigiXHRcdFtEb25lXVxuIik7Cit9CisjZW5kaWYgLyogTVZfSU5DTFVERV9TUEkgKi8KKworI2lmIGRlZmluZWQoTVZfTkFORCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHNwaV9idXJuX3NjcmlwdAorKgorKiBERVNDUklQVElPTjoKKyogYnVybiBzY3JpcHQgaW1hZ2UgdG8gdGhlIE5BTkQgZmxhc2gKKyoKKyogSU5QVVQ6CisqCW9mZnNldAkJLSBvZmZzZXQgaW4gZmxhc2ggdG8gYnVybiB0aGUgc2NyaXB0CisqCWxvYWRmcm9tCS0gc291cmNlIGludGVyZmFjZSB0byBmZXRjaCB0aGUgZmlsZSAoMCA9IFRGVFAsIDEgPSBVU0IpCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKglOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG5hbmRfYnVybl9zY3JpcHQoTVZfVTMyIG9mZnNldCwgaW50IGxvYWRmcm9tKQoreworCWludCBmaWxlc2l6ZSA9IDA7CisJTVZfVTMyIHJldCA9IDAsIGFsaWduZWRfc2l6ZTsKKwluYW5kX2luZm9fdCAqbmFuZCA9ICZuYW5kX2luZm9bMF07CisJc2l6ZV90IGVyYXNlc2l6ZSA9IG5hbmRfaW5mb1swXS5lcmFzZXNpemU7CisKKwlpZiAobmFuZF9ibG9ja19pc2JhZCgmbmFuZF9pbmZvWzBdLCBvZmZzZXQpKSB7CisJCXByaW50ZigiRmFpbGVkIHRvIGJ1cm46IEJhZCBibG9jayBhdCBvZmZzZXQgJVhcbiIsIG9mZnNldCk7CisJCXJldHVybjsKKwl9CisKKwkvKiB2ZXJpZnkgcmVxdWVzdGVkIHNvdXJjZSBpcyB2YWxpZCAqLworCWZpbGVzaXplID0gZmV0Y2hfc2NyaXB0X2ZpbGUobG9hZGZyb20pOworCWlmIChmaWxlc2l6ZSA8PSAwKQorCQlyZXR1cm47CisKKwlhbGlnbmVkX3NpemUgPSAoKGZpbGVzaXplICsgKGVyYXNlc2l6ZSAtIDEpKSAmICh+KGVyYXNlc2l6ZSAtIDEpKSk7CisJcHJpbnRmKCJcdFtEb25lXVxuIik7CisJcHJpbnRmKCJFcmFzaW5nIDB4JXggLSAweCV4OiAiLCBvZmZzZXQsIG9mZnNldCArIGFsaWduZWRfc2l6ZSk7CisJbmFuZF9lcmFzZShuYW5kLCBvZmZzZXQsIGFsaWduZWRfc2l6ZSk7CisJcHJpbnRmKCJcdFtEb25lXVxuIik7CisKKwlwcmludGYoIldyaXRpbmcgaW1hZ2UgdG8gTkFORDoiKTsKKwlyZXQgPSBuYW5kX3dyaXRlKG5hbmQsIG9mZnNldCwgKHNpemVfdCAqKSZmaWxlc2l6ZSwgKHVfY2hhciAqKWxvYWRfYWRkcik7CisJaWYgKHJldCkKKwkJcHJpbnRmKCJcdFtGYWlsXVxuIik7CisJZWxzZQorCQlwcmludGYoIlx0W0RvbmVdXG4iKTsKK30KKyNlbmRpZiAvKiBkZWZpbmVkKE1WX05BTkQpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlzX21hZ2ljX3ZhbGlkCisqCisqIERFU0NSSVBUSU9OOgorKiBjaGVja3MgaWYgdGhlIG1hZ2ljIHZhbHVlIGluIHNjcmlwdCBoZWFkZXIgaXMgdmFsaWQKKyoKKyogSU5QVVQ6CisqCWhlYWRlcgkJLSBzY3JpcHQgaGVhZGVyCisqCisqIFJFVFVSTjoKKyoJTVZfVFJVRSBpZiBtYWdpYyB2YWx1ZSBpbiBoZWFkZXIgaXMgdmFsaWQKKyoJTVZfRkFMU0Ugb3RoZXJ3aXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBpc19tYWdpY192YWxpZChpbWFnZV9oZWFkZXJfdCAqaGVhZGVyKQoreworCS8qIGNoZWNrIGlmIGltYWdlIHR5cGUgaXMgSU1BR0VfRk9STUFUX0xFR0FDWSAqLworCWlmIChiZTMyX3RvX2NwdShoZWFkZXItPmloX21hZ2ljKSAhPSBJSF9NQUdJQykKKwkJcmV0dXJuIE1WX0ZBTFNFOworCisJcmV0dXJuIE1WX1RSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGdldF9pbWFnZV9zaXplCisqCisqIERFU0NSSVBUSU9OOgorKiBmZXRjaCBzY3JpcHQgc2l6ZSAoaW4gYnl0ZXMpIGZyb20gc2NyaXB0IGhlYWRlcgorKgorKiBJTlBVVDoKKyoJb2Zmc2V0CQktIHNjcmlwdCBvZmZzZXQgaW4gZmxhc2gKKyoKKyogT1VUUFVUOgorKglzaXplCQktIHNjcmlwdCBzaXplIChpbiBieXRlcykKKyoKKyogUkVUVVJOOgorKglNVl9PSyBvbiBzdWNjZXNzIGZldGNoaW5nIHRoZSBzaXplCisqCU1WX0ZBSUwgb3RoZXJ3aXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIGdldF9pbWFnZV9zaXplKE1WX1UzMiBvZmZzZXQsIE1WX1UzMiAqc2l6ZSkKK3sKKwlzaXplX3QgYnVmZl9zaXplID0gc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwlpbWFnZV9oZWFkZXJfdCBoZWFkZXI7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwlpZiAoaW5pdF9zcGkoKSkKKwkJcmV0dXJuIE1WX0ZBSUw7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKSAmJiBkZWZpbmVkKE1WX05BTkQpCisJCWlmIChkZXN0X2ZsYXNoID09IDApCisJCQlzcGlfZmxhc2hfcmVhZChmbGFzaCwgb2Zmc2V0LCBidWZmX3NpemUgLCAmaGVhZGVyKTsKKwkJZWxzZSBpZiAoZGVzdF9mbGFzaCA9PSAxKQorCQkJbmFuZF9yZWFkKCZuYW5kX2luZm9bMF0sIG9mZnNldCwgJmJ1ZmZfc2l6ZSwgKHVfY2hhciAqKSZoZWFkZXIpOworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwlzcGlfZmxhc2hfcmVhZChmbGFzaCwgb2Zmc2V0LCBidWZmX3NpemUgLCAmaGVhZGVyKTsKKyNlbGlmIGRlZmluZWQoTVZfTkFORCkKKwluYW5kX3JlYWQoJm5hbmRfaW5mb1swXSwgb2Zmc2V0LCAmYnVmZl9zaXplLCAodV9jaGFyICopJmhlYWRlcik7CisjZWxzZQorCXJldHVybiBNVl9GQUlMOworI2VuZGlmCisJaWYgKGlzX21hZ2ljX3ZhbGlkKCZoZWFkZXIpID09IE1WX0ZBTFNFKQorCQlyZXR1cm4gTVZfRkFJTDsKKworCSpzaXplID0gYmUzMl90b19jcHUoaGVhZGVyLmloX3NpemUpICsgc2l6ZW9mKGltYWdlX2hlYWRlcl90KTsKKwlyZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGdldF9ibG9ja19zaXplCisqCisqIERFU0NSSVBUSU9OOgorKiBnZXQgYmxvY2sgc2l6ZSBvZiBmbGFzaAorKgorKiBJTlBVVDoKKyoJTm9uZS4KKyoKKyogT1VUUFVUOgorKglOb25lLgorKgorKiBSRVRVUk46CisqCWJsb2NrIHNpemUsIG9uIHN1Y2Nlc3MKKyoJMCwgb3RoZXJ3aXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVTMyIGdldF9ibG9ja19zaXplKHZvaWQpCit7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkgJiYgZGVmaW5lZChNVl9OQU5EKQorCQlpZiAoZGVzdF9mbGFzaCA9PSAwKQorCQkJcmV0dXJuIGZsYXNoLT5zZWN0b3Jfc2l6ZTsKKwkJZWxzZSBpZiAoZGVzdF9mbGFzaCA9PSAxKQorCQkJcmV0dXJuIG5hbmRfaW5mb1swXS5lcmFzZXNpemU7CisJCWVsc2UKKwkJCXJldHVybiAwOworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwlyZXR1cm4gZmxhc2gtPnNlY3Rvcl9zaXplOworCisjZWxpZiBkZWZpbmVkKE1WX05BTkQpCisJcmV0dXJuIG5hbmRfaW5mb1swXS5lcmFzZXNpemU7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK2ludCBtdnNvdXJjZV9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCWludCBjb21tYW5kLCBsb2FkZnJvbTsKKwlNVl9VMzIgb2Zmc2V0OworCWNoYXIgKmJ1ZmZlcjsKKwljaGFyIGJ1ZmZlcl9hZGRyZXNzX3N0clszMF07CS8qIHRvIHBhc3MgdG8gJ3NvdXJjZScgYXJndW1lbnQgKi8KKwlNVl9VMzIgc2l6ZTsKKwljaGFyICpzb3VyY2VfYXJndlsyXTsKKworCWlmIChmZXRjaF9tdnNvdXJjZV9jbWRfYXJncyhhcmdjLCBhcmd2LCAmY29tbWFuZCwKKwkJCQkmb2Zmc2V0LCAmbG9hZGZyb20sICZkZXN0X2ZsYXNoKSAhPSBNVl9PSykKKwkJcmV0dXJuIDE7CisKKworCWlmIChjb21tYW5kID09IDApIHsgLyogMCA9IGJ1cm4gKi8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKSAmJiBkZWZpbmVkKE1WX05BTkQpCisJCWlmIChkZXN0X2ZsYXNoID09IDApCisJCQlzcGlfYnVybl9zY3JpcHQob2Zmc2V0LCBsb2FkZnJvbSk7CisJCWVsc2UgaWYgKGRlc3RfZmxhc2ggPT0gMSkKKwkJCW5hbmRfYnVybl9zY3JpcHQob2Zmc2V0LCBsb2FkZnJvbSk7CisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCQlzcGlfYnVybl9zY3JpcHQob2Zmc2V0LCBsb2FkZnJvbSk7CisjZWxpZiBkZWZpbmVkKE1WX05BTkQpCisJCW5hbmRfYnVybl9zY3JpcHQob2Zmc2V0LCBsb2FkZnJvbSk7CisjZW5kaWYKKwl9IGVsc2UgaWYgKGNvbW1hbmQgPT0gMSkgeyAvKiAxID0gcnVuICovCisJCWlmIChnZXRfaW1hZ2Vfc2l6ZShvZmZzZXQsICZzaXplKSAhPSBNVl9PSykgeworCQkJcHJpbnRmKCJFcnJvcjogRmFpbGVkIHRvIGZldGNoIHNjcmlwdCBzaXplXG4iKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJYnVmZmVyID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisJCQlpZiAoIWJ1ZmZlcikgeworCQkJCXByaW50ZigiRXJyb3I6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkgJiYgZGVmaW5lZChNVl9OQU5EKQorCQlpZiAoZGVzdF9mbGFzaCA9PSAwKQorCQkJc3BpX2ZsYXNoX3JlYWQoZmxhc2gsIG9mZnNldCwgc2l6ZSAsIGJ1ZmZlcik7CisJCWVsc2UgaWYgKGRlc3RfZmxhc2ggPT0gMSkKKwkJCW5hbmRfcmVhZCgmbmFuZF9pbmZvWzBdLCBvZmZzZXQsICZzaXplLCAodV9jaGFyICopYnVmZmVyKTsKKyNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJCXNwaV9mbGFzaF9yZWFkKGZsYXNoLCBvZmZzZXQsIHNpemUgLCBidWZmZXIpOworI2VsaWYgZGVmaW5lZChNVl9OQU5EKQorCQluYW5kX3JlYWQoJm5hbmRfaW5mb1swXSwgb2Zmc2V0LCAmc2l6ZSwgKHVfY2hhciAqKWJ1ZmZlcik7CisjZWxzZQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCQlzcHJpbnRmKGJ1ZmZlcl9hZGRyZXNzX3N0ciwgIiVseCIsICh1bnNpZ25lZCBsb25nKWJ1ZmZlcik7CisJCXNvdXJjZV9hcmd2WzBdID0gInNvdXJjZSI7CisJCXNvdXJjZV9hcmd2WzFdID0gYnVmZmVyX2FkZHJlc3Nfc3RyOworCQlkb19zb3VyY2UoY21kdHAsIDAsIDIsIHNvdXJjZV9hcmd2KTsKKwkJZnJlZShidWZmZXIpOworCX0KKwlyZXR1cm4gMDsKK30KKworVV9CT09UX0NNRCgKKwkJbXZzb3VyY2UsICAgICAgNSwgICAgIDEsICAgICAgbXZzb3VyY2VfY21kLAorCQkibXZzb3VyY2UJLSBCdXJuIGEgc2NyaXB0IGltYWdlIG9uIGZsYXNoIGRldmljZS5cbiIsCisJCSJidXJuIFtmaWxlLW5hbWUgW29mZnNldCBbc3JjX2ludGVyZmFjZV1dXSBbZHN0X2ZsYXNoXSIKKwkJIlxuXHRCdXJuIHNjcmlwdCA8ZmlsZS1uYW1lPiB0byBmbGFzaCBhdCA8b2Zmc2V0PiBmcm9tIDxzcmNfaW50ZXJmYWNlPiBcbiIKKwkJIm12c291cmNlIHJ1biBbb2Zmc2V0XSIKKwkJIlxuXHRSdW4gc2NyaXB0IGZyb20gZmxhc2ggYXQgPG9mZnNldD5cbiIKKwkJIlxuQXJndW1lbnRzIChvcHRpb25hbCk6XG4iCisJCSJcdC0gZmlsZS1uYW1lOiBzY3JpcHQgZmlsZSBuYW1lXHRcdFx0KGRlZmF1bHQgPSBzY3JpcHQuYmluKVxuIgorCQkiXHQtIG9mZnNldDogc2NyaXB0IGFkZHJlc3MgaW4gZmxhc2hcdFx0KGRlZmF1bHQgPSAzMDAwMDApXG4iCisJCSJcdC0gc3JjX2ludGVyZmFjZTogc2NyaXB0IHNvdXJjZTogdGZ0cC91c2JcdChkZWZhdWx0ID0gdGZ0cClcbiIKKwkJIlx0LSBkc3RfZmxhc2g6IGZsYXNoIGRlc3RpbmF0aW9uOiBzcGkvbmFuZFx0KGRlZmF1bHQgPSBzcGkpXG4iCisJCSJFeGFtcGxlczpcbiIKKwkJIlx0bXZzb3VyY2UgYnVybiBzY3JpcHQuaW1nIDMwMDAwMCB0ZnRwIHNwaVxuIgorCQkiXHRtdnNvdXJjZSBidXJuXG4iCisJCSJcdG12c291cmNlIHJ1biAzMDAwMDBcbiIKKwkJIlx0bXZzb3VyY2UgcnVuXG4iCisJCSk7CisKKyNlbmRpZiAvKiBDT05GSUdfQ01EX1NPVVJDRSAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDc3YWYyZWEuLjFiODQ3N2EKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoLmMKQEAgLTY5LDEyICs2OSwxMyBAQAogI2luY2x1ZGUgIm12Q3RybEVudkxpYi5oIgogI2luY2x1ZGUgIm12Qm9hcmRFbnZMaWIuaCIKIAotCiBzdGF0aWMgdm9pZCBzd2l0Y2hWbGFuSW5pdChNVl9VMzIgZXRoUG9ydE51bSwKIAkJCQkJCSAgIE1WX1UzMiBzd2l0Y2hDcHVQb3J0LAogCQkJCQkgICBNVl9VMzIgc3dpdGNoTWF4UG9ydHNOdW0sCiAJCQkJCSAgIE1WX1UzMiBzd2l0Y2hQb3J0c09mZnNldCwKIAkJCQkJICAgTVZfVTMyIHN3aXRjaEVuYWJsZWRQb3J0c01hc2spOworc3RhdGljIE1WX1UxNiBtdkV0aFN3aXRjaEdldERldmljZUlESW5NdWx0aW9yTWFudWFsTW9kZSh2b2lkKTsKK3N0YXRpYyBNVl9VMTYgbXZFdGhTd2l0Y2hHZXREZXZpY2VJREluQXV0b1NjYW5Nb2RlKE1WX0JPT0wgKmhpZ2hTbWlEZXZBZGRyKTsKIAogdm9pZCBtdkV0aFN3aXRjaFJlZ1dyaXRlKE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMzIgcGh5QWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX1UzMiByZWdPZmZzLCBNVl9VMTYgZGF0YSk7CkBAIC04NCw2ICs4NSwyNTQgQEAKIAogaW50IHN3aXRjaE11bHRpQ2hpcE1vZGUgPSAweGRlYWRiZWVmOwogCitzdGF0aWMgTVZfMzIgc3dpdGNoRGV2aWNlSUQgPSAtMTsJLyotMSA6IGluaXRpYWxpemVkLCAwIDogbm8gc3dpdGNoLCBvdGhlciB2YWx1ZXMgYXJlIHN3aXRjaCBkZXZpY2UgSUQqLworc3RhdGljIE1WX1UzMiBzd2l0Y2hBY2Nlc3NNb2RlID0gU01JX01BTlVBTF9NT0RFOworI2lmZGVmIE1WX1NXSVRDSF9TTUlfQUNDRVNTCitzdGF0aWMgTVZfMzIgc3dpdGNoUGh5QWRkciA9IC0xOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12RXRoU3dpdGNoR2V0RGV2aWNlSURJbk11bHRpQWRkTW9kZSAtCisqCisqIERFU0NSSVBUSU9OOgorKglnZXQgc3dpdGNoIGRldmljZSBJRCBpZiBzd2l0Y2ggaXMgaW4gU01JIG11dGkgYWRkcmVzcyBhY2Nlc3MgbW9kZQorKgorKiBJTlBVVDoKKyoJTm9uZQorKgorKiBPVVRQVVQ6CisqCU5vbmUKKyoKKyogUkVUVVJOOiAgIHN3aXRjaCBkZXZpY2UgSUQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTVZfVTE2IG12RXRoU3dpdGNoR2V0RGV2aWNlSURJbk11bHRpb3JNYW51YWxNb2RlKHZvaWQpCit7CisJTVZfVTE2IGRhdGE7CisKKwkvKnJlYWQgc3dpdGNoIGRldmljZSBJRCwgZmlyc3QgdHJ5IHRoZSBjYXNlIHRoYXQgcG9ydCByZWdpc3RlciBvZmZzZXQgaXMgOCovCisJZGF0YSA9IDA7CisJbXZFdGhTd2l0Y2hSZWdSZWFkKDAsIFBPUlRfUkVHU19TVEFSVF9BRERSLCBRRF9SRUdfU1dJVENIX0lELCAmZGF0YSk7CisKKwlzd2l0Y2ggKGRhdGEgJiAweEZGMDApIHsKKwljYXNlIDB4MDIwMDoKKwljYXNlIDB4MDMwMDoKKwljYXNlIDB4MDUwMDoKKwljYXNlIDB4MDYwMDoKKwljYXNlIDB4MTUwMDoKKwljYXNlIDB4RjUwMDoKKwljYXNlIDB4RjkwMDoKKwljYXNlIDB4MDcwMDoJICAgIC8qIFNwaW5uYWtlciAqLworCWNhc2UgMHgyMjAwOgkgICAgLyogU3Bpbm5ha2VyICovCisJY2FzZSAweDI1MDA6CSAgICAvKiBTcGlubmFrZXIgKi8KKwkJcmV0dXJuIGRhdGE7CisJY2FzZSAweEMwMDA6CSAgICAvKiBNZWxvZHksIE5vdyBpdCBjb3VsZCBiZSAweGMwMCAtIDB4YzA3ICovCisJCXJldHVybiBkYXRhJjB4RkYwRjsKKwlkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisKKwkvKnJlYWQgc3dpdGNoIGRldmljZSBJRCwgc2Vjb25kIHRyeSB0aGUgY2FzZSB0aGF0IHBvcnQgcmVnaXN0ZXIgb2Zmc2V0IGlzIDB4MTAqLworCWRhdGEgPSAwOworCW12RXRoU3dpdGNoUmVnUmVhZCgwLCBQT1JUX1JFR1NfU1RBUlRfQUREUl84UE9SVCwgUURfUkVHX1NXSVRDSF9JRCwgJmRhdGEpOworCisJc3dpdGNoIChkYXRhICYgMHhGRjAwKSB7CisJY2FzZSAweDA4MDA6CisJY2FzZSAweDFBMDA6CisJY2FzZSAweDEwMDA6CisJY2FzZSAweDA5MDA6CisJY2FzZSAweDA0MDA6CisJY2FzZSAweDEyMDA6CisJY2FzZSAweDE0MDA6CisJY2FzZSAweDE2MDA6CisJY2FzZSAweDMyMDA6CisJY2FzZSAweDE3MDA6CisJY2FzZSAweDM3MDA6CisJY2FzZSAweDI0MDA6CS8qIEFnYXRlICovCisJY2FzZSAweDM1MDA6CS8qIEFnYXRlICovCisJY2FzZSAweDExMDA6CS8qIFBlYXJsICovCisJY2FzZSAweDMxMDA6CS8qIFBlYXJsICovCisJY2FzZSAweGMxMDA6CS8qIEFMUCBGaXggKi8KKwkJcmV0dXJuIGRhdGE7CisJZGVmYXVsdDoKKwkgICAgYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12RXRoU3dpdGNoR2V0RGV2SURCeVBvcnRSZWdTdGFydEluQXV0byAtCisqCisqIERFU0NSSVBUSU9OOgorKglnZXQgc3dpdGNoIGRldmljZSBJRCBieSB0aGUgc3dpdGNoIHBvcnQgcmVnaXN0ZXIgc3RhcnQgYWRkcmVzcyBpZiBzd2l0Y2ggaXMgaW4gU01JIGF1dG8gc2NhbiBhY2Nlc3MgbW9kZQorKgorKiBJTlBVVDoKKyoJcG9ydFJlZ3NTdGFydEFkZHIgLSBzd2l0Y2ggcG9ydCByZWdpc3RlciBzdGFydCBhZGRyZXNzCisqCisqIE9VVFBVVDoKKyoJTm9uZQorKgorKiBSRVRVUk46ICAgc3dpdGNoIGRldmljZSBJRAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBNVl9VMTYgbXZFdGhTd2l0Y2hHZXREZXZJREJ5UG9ydFJlZ1N0YXJ0SW5BdXRvKE1WX1UzMiBwb3J0UmVnc1N0YXJ0QWRkcikKK3sKKwlNVl9VMTYgZGF0YSwgZGF0YTE7CisKKwkvKnJlYWQgc3dpdGNoIGRldmljZSBJRCBmcm9tIHN3aXRjaCBwb3J0IDAgYW5kIDEsIGlmIHRoZSAyIHZhbHVlcyBhcmUgZXF1YWwgYW5kIG1lYW5pbmdmdWwsIHRoZW4gaXQncyB2YWxpZCovCisJZGF0YSA9IDA7CisJbXZFdGhTd2l0Y2hSZWdSZWFkKDAsIHBvcnRSZWdzU3RhcnRBZGRyLCBRRF9SRUdfU1dJVENIX0lELCAmZGF0YSk7CisJZGF0YTEgPSAwOworCW12RXRoU3dpdGNoUmVnUmVhZCgwLCBwb3J0UmVnc1N0YXJ0QWRkciArIDEsIFFEX1JFR19TV0lUQ0hfSUQsICZkYXRhMSk7CisKKwlzd2l0Y2ggKGRhdGEgJiAweEZGMDApIHsKKwljYXNlIDB4MDIwMDoKKwljYXNlIDB4MDMwMDoKKwljYXNlIDB4MDUwMDoKKwljYXNlIDB4MDYwMDoKKwljYXNlIDB4MTUwMDoKKwljYXNlIDB4QzAwMDoJCS8qIE1lbG9keSAqLworCWNhc2UgMHgwNzAwOgkJLyogU3Bpbm5ha2VyICovCisJY2FzZSAweDIyMDA6CQkvKiBTcGlubmFrZXIgKi8KKwljYXNlIDB4MjUwMDoJCS8qIFNwaW5uYWtlciAqLworCWNhc2UgMHhGNTAwOgorCWNhc2UgMHhGOTAwOgorCQlpZiAoZGF0YSA9PSBkYXRhMSkKKwkJCXJldHVybiBkYXRhOworCWRlZmF1bHQ6CisJICAgIGJyZWFrOworCX0KKworCXJldHVybiAwOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12RXRoU3dpdGNoR2V0RGV2aWNlSURJbkF1dG9TY2FuTW9kZSAtCisqCisqIERFU0NSSVBUSU9OOgorKglnZXQgc3dpdGNoIGRldmljZSBJRCBpZiBzd2l0Y2ggaXMgaW4gU01JIGF1dG8gc2NhbiBhY2Nlc3MgbW9kZQorKgorKiBJTlBVVDoKKyoJTm9uZQorKgorKiBPVVRQVVQ6CisqCWhpZ2hTbWlEZXZBZGRyIC0gd2hldGhlciBoaWdoIFNNSSBkZXZpY2UgYWRkcmVzcyBpcyB1c2VkCisqCisqIFJFVFVSTjogICBzd2l0Y2ggZGV2aWNlIElECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIE1WX1UxNiBtdkV0aFN3aXRjaEdldERldmljZUlESW5BdXRvU2Nhbk1vZGUoTVZfQk9PTCAqaGlnaFNtaURldkFkZHIpCit7CisJTVZfVTE2IGRhdGEsIGRhdGExOworCisJLypyZWFkIHN3aXRjaCBkZXZpY2UgSUQsIGZpcnN0IHRyeSB0aGUgY2FzZSB0aGF0IHBvcnQgcmVnaXN0ZXIgb2Zmc2V0IGlzIDgqLworCWRhdGEgPSBtdkV0aFN3aXRjaEdldERldklEQnlQb3J0UmVnU3RhcnRJbkF1dG8oUE9SVF9SRUdTX1NUQVJUX0FERFIpOworCWlmIChkYXRhICE9IDApIHsKKwkJKmhpZ2hTbWlEZXZBZGRyID0gTVZfRkFMU0U7CisJCXJldHVybiBkYXRhOworCX0KKworCS8qcmVhZCBzd2l0Y2ggZGV2aWNlIElELCBzZWNvbmQgdHJ5IHRoZSBjYXNlIHRoYXQgcG9ydCByZWdpc3RlciBvZmZzZXQgaXMgMHgxOCovCisJZGF0YSA9IG12RXRoU3dpdGNoR2V0RGV2SURCeVBvcnRSZWdTdGFydEluQXV0byhQT1JUX1JFR1NfU1RBUlRfQUREUiArIDB4MTApOworCWlmIChkYXRhICE9IDApIHsKKwkJKmhpZ2hTbWlEZXZBZGRyID0gTVZfVFJVRTsKKwkJcmV0dXJuIGRhdGE7CisJfQorCisJLypyZWFkIHN3aXRjaCBkZXZpY2UgSUQsIGZpbmFsbHkgdHJ5IHRoZSBjYXNlIHRoYXQgcG9ydCByZWdpc3RlciBvZmZzZXQgaXMgMHgxMCovCisJZGF0YSA9IDA7CisJbXZFdGhTd2l0Y2hSZWdSZWFkKDAsIFBPUlRfUkVHU19TVEFSVF9BRERSXzhQT1JULCBRRF9SRUdfU1dJVENIX0lELCAmZGF0YSk7CisJZGF0YTEgPSAwOworCW12RXRoU3dpdGNoUmVnUmVhZCgwLCBQT1JUX1JFR1NfU1RBUlRfQUREUl84UE9SVCArIDEsIFFEX1JFR19TV0lUQ0hfSUQsICZkYXRhMSk7CisKKwlzd2l0Y2ggKGRhdGEgJiAweEZGMDApIHsKKwljYXNlIDB4MDgwMDoKKwljYXNlIDB4MUEwMDoKKwljYXNlIDB4MTAwMDoKKwljYXNlIDB4MDkwMDoKKwljYXNlIDB4MDQwMDoKKwljYXNlIDB4MTIwMDoKKwljYXNlIDB4MTQwMDoKKwljYXNlIDB4MTYwMDoKKwljYXNlIDB4MTcwMDoKKwljYXNlIDB4MzIwMDoKKwljYXNlIDB4MzcwMDoKKwljYXNlIDB4MjQwMDogICAgLyogQWdhdGUgKi8KKwljYXNlIDB4MzUwMDogICAgLyogQWdhdGUgKi8KKwljYXNlIDB4MTEwMDogICAgLyogUGVhcmwgKi8KKwljYXNlIDB4MzEwMDogICAgLyogUGVhcmwgKi8KKwkJaWYgKGRhdGEgPT0gZGF0YTEpIHsKKwkJCSpoaWdoU21pRGV2QWRkciA9IE1WX0ZBTFNFOworCQkJcmV0dXJuIGRhdGE7CisJCX0KKwlkZWZhdWx0OgorCSAgICBicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkV0aFN3aXRjaEdldERldmljZUlEIC0KKyoKKyogREVTQ1JJUFRJT046CisqCUlmIHN3aXRjaCBkZXZpY2UgSUQgaXMgbm90IGluaXRpYWxpemVkLCB0aGVuIGRldGVjdCBzd2l0Y2ggZGV2aWNlLCBmaW5kIG91dCBzd2l0Y2ggZGV2aWNlIElELAorKglhY2Nlc3MgbW9kZSBhbmQgUEhZIGFkZHJlc3MsIG90aGVyd2lzZSByZXR1cm4gc3dpdGNoIGRldmljZSBJRCBkaXJlY3RseQorKgorKiBJTlBVVDoKKyoJTm9uZQorKgorKiBPVVRQVVQ6CisqCWhpZ2hTbWlEZXZBZGRyIC0gSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIHRoZSBoaWdoIGRldmljZSByZWdpc3RlcgorKgkJYWRkcmVzc2VzIHdoZW4gYWNjZXNzaW5nIHN3aXRjaCdzIHJlZ2lzdGVycyAob2YgYWxsIGtpbmRzKQorKgkJaS5lLCB0aGUgZGV2aWNlcyByZWdpc3RlcnMgcmFuZ2UgaXMgMHgxMCB0byAweDFGLCBvciB0bworKgkJdXNlIHRoZSBsb3cgZGV2aWNlIHJlZ2lzdGVyIGFkZHJlc3NlcyAocmFuZ2UgMHgwIHRvIDB4RikuCisqCQlHVF9UUlVFICAgICAtIHVzZSBoaWdoIGFkZHJlc3NlcyAoMHgxMCB0byAweDFGKS4KKyoJCUdUX0ZBTFNFICAgIC0gdXNlIGxvdyBhZGRyZXNzZXMgKDB4MCB0byAweEYpLgorKgorKiBSRVRVUk46ICAgc3dpdGNoIGRldmljZSBJRCwgMCBtZWFucyBubyBzd2l0Y2ggZGV0ZWN0ZWQKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMTYgbXZFdGhTd2l0Y2hHZXREZXZpY2VJRCh2b2lkKQoreworCU1WX0JPT0wJCWhpZ2hTbWlEZXZBZGRyOworCisJLyppZiBzd2l0Y2hEZXZpY2VJRCBoYXMgYmVlbiBpbml0aWFsaXplZCwgdGhlbiByZXR1cm4gaXQgZGlyZWN0bHkqLworCWlmIChzd2l0Y2hEZXZpY2VJRCA+PSAwKQorCQlyZXR1cm4gKE1WX1UxNilzd2l0Y2hEZXZpY2VJRDsKKworCS8qaWYgc3dpdGNoIG1vZHVsZSBpcyBub3QgZGV0ZWN0ZWQsIHRoZW4gcmV1cm4gMCAtIG5vIHN3aXRjaCBkZXRlY3RlZCovCisJaWYgKG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpID09IE1WX0ZBTFNFKSB7CisJCXN3aXRjaERldmljZUlEID0gMDsKKwkJcmV0dXJuIChNVl9VMTYpc3dpdGNoRGV2aWNlSUQ7CisJfQorCisJc3dpdGNoQWNjZXNzTW9kZSA9IG12Qm9hcmRTbWlTY2FuTW9kZUdldCgwKTsKKyNpZmRlZiBNVl9TV0lUQ0hfU01JX0FDQ0VTUworCXN3aXRjaFBoeUFkZHIgPSBtdkJvYXJkU3dpdGNoUGh5QWRkckdldCgwKTsKKwlpZiAoKHN3aXRjaFBoeUFkZHIgPT0gLTEpICYmIChzd2l0Y2hBY2Nlc3NNb2RlID09IFNNSV9NQU5VQUxfTU9ERSkpIHsKKwkJbXZPc1ByaW50Zigic3dpdGNoUGh5QWRkciB2YWx1ZSAlZCBpcyBlcnJvciFcbiIsIHN3aXRjaFBoeUFkZHIpOworCQlzd2l0Y2hEZXZpY2VJRCA9IDA7CisJCXJldHVybiBzd2l0Y2hEZXZpY2VJRDsKKwl9CisjZW5kaWYKKworCWlmIChzd2l0Y2hBY2Nlc3NNb2RlID09IFNNSV9NVUxUSV9BRERSX01PREUgfHwgc3dpdGNoQWNjZXNzTW9kZSA9PSBTTUlfTUFOVUFMX01PREUpIHsKKwkJc3dpdGNoRGV2aWNlSUQgPSBtdkV0aFN3aXRjaEdldERldmljZUlESW5NdWx0aW9yTWFudWFsTW9kZSgpOworCQlyZXR1cm4gKE1WX1UxNilzd2l0Y2hEZXZpY2VJRDsKKwl9IGVsc2UgaWYgKHN3aXRjaEFjY2Vzc01vZGUgPT0gU01JX0FVVE9fU0NBTl9NT0RFKSB7CisJCXN3aXRjaERldmljZUlEID0gbXZFdGhTd2l0Y2hHZXREZXZpY2VJREluQXV0b1NjYW5Nb2RlKCZoaWdoU21pRGV2QWRkcik7CisJCXJldHVybiAoTVZfVTE2KXN3aXRjaERldmljZUlEOworCX0gZWxzZSB7CisJCXN3aXRjaERldmljZUlEID0gMDsKKwkJcmV0dXJuIChNVl9VMTYpc3dpdGNoRGV2aWNlSUQ7CisJfQorfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12RXRoRTYwNjVfNjFQaHlCYXNpY0luaXQgLQogKgpAQCAtMjk4LDMxICs1NDcsNDMgQEAKIH0KICNlbmRpZiAvKiBNVjg4RjY2WFggKi8KIAorLyogVGhpcyBpbml0aWFsIGZ1bmN0aW9uIGlzIHZhbGlkIGZvciBFNjE3NiBzd2l0Y2ggKi8KIE1WX1ZPSUQJbXZFdGhFNjE3MVN3aXRjaEJhc2ljSW5pdChNVl9VMzIgZXRoUG9ydE51bSkKIHsKIAogCU1WX1UzMiBwcnQ7CiAJTVZfVTE2IHJlZzsKIAl2b2xhdGlsZSBNVl9VMzIgdGltZW91dDsKLQlNVl8zMiBjcHVQb3J0ID0gIG12Qm9hcmRTd2l0Y2hDcHVQb3J0R2V0KDApOworCU1WX1UzMiBjcHVQb3J0ID0gIG12Qm9hcmRTd2l0Y2hDcHVQb3J0R2V0KDApOworCU1WX1UzMiBzd2ljdGhQaHlBZGRyID0gbXZCb2FyZFN3aXRjaFBoeUFkZHJHZXQoMCk7CiAJLyogVGhlIDYxNzEgbmVlZHMgYSBkZWxheSAqLwogCW12T3NEZWxheSgxMDAwKTsKIAogCS8qIEluaXQgdmxhbiBvZiBzd2l0Y2ggMSBhbmQgZW5hYmxlIGFsbCBwb3J0cyAqLwotCXN3aXRjaFZsYW5Jbml0KGV0aFBvcnROdW0sIE1WX0U2MTcxX0NQVV9QT1JULCBNVl9FNjE3MV9NQVhfUE9SVFNfTlVNLCBNVl9FNjE3MV9QT1JUU19PRkZTRVQsCi0JCQkJICAgTVZfRTYxNzFfRU5BQkxFRF9QT1JUUyk7CisJc3dpdGNoVmxhbkluaXQoZXRoUG9ydE51bSwgY3B1UG9ydCwgTVZfRTYxNzFfTUFYX1BPUlRTX05VTSwgc3dpY3RoUGh5QWRkciwgTVZfRTYxNzFfRU5BQkxFRF9QT1JUUyk7CiAKLQkvKiBFbmFibGUgUkdNSUkgZGVsYXkgb24gVHggYW5kIFJ4IGZvciBwb3J0IDUgc3dpdGNoIDEgKi8KLQltdkV0aFN3aXRjaFJlZ1JlYWQoZXRoUG9ydE51bSwgTVZfRTYxNzFfUE9SVFNfT0ZGU0VUICsgY3B1UG9ydCwgTVZfRTYxNzFfU1dJVENIX1BISVlTSUNBTF9DVFJMX1JFRywgJnJlZyk7Ci0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9QT1JUU19PRkZTRVQgKyBjcHVQb3J0LCBNVl9FNjE3MV9TV0lUQ0hfUEhJWVNJQ0FMX0NUUkxfUkVHLAotCQkJCQkJIChyZWd8MHhDMDAwKSk7CisJaWYgKG12Qm9hcmRTd2l0Y2hDcHVQb3J0SXNSZ21paSgwKSkgeworCQkvKiBFbmFibGUgUkdNSUkgZGVsYXkgb24gVHggYW5kIFJ4IGZvciBwb3J0IDUgc3dpdGNoIDEgKi8KKwkJbXZFdGhTd2l0Y2hSZWdSZWFkKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIgKyBjcHVQb3J0LCBNVl9FNjE3MV9TV0lUQ0hfUEhJWVNJQ0FMX0NUUkxfUkVHLCAmcmVnKTsKKwkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBzd2ljdGhQaHlBZGRyICsgY3B1UG9ydCwgTVZfRTYxNzFfU1dJVENIX1BISVlTSUNBTF9DVFJMX1JFRywKKwkJCQkocmVnfDB4QzAwMCkpOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSBDUFUgcG9ydCBpcyBub3QgY29ubmVjdGVkIHRvIFJHTUlJLCBzbyBpdCBjb25uZWN0ZWQKKwkJICAgdG8gU0dNSUkgdmlhIFNlckRlcyBsYW5lLCB0aGlzIGNvZGUgcG93ZXItdXAgdGhlIFNlckRlcyBpbiBzd2l0Y2ggKi8KKwkJLyogQ2hhbmdlIHRvIHBhZ2UgIzEgdG8gYWNjZXNzIFNlckRlcyBjb250cm9sIHJlZ2lzdGVyICovCisJCW12RXRoU3dpdGNoUGh5UmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNzFfU0VSREVTX1JFRywgTVZfRTYxNzFfUEFHRV9SRUcsIEJJVDApOworCQkvKiBSZWFkIFNlckRlcyBwb3dlciBkb3duIHN0YXR1cyBvZiB0aGUgc3dpdGNoICovCisJCW12RXRoU3dpdGNoUGh5UmVnUmVhZChldGhQb3J0TnVtLCBNVl9FNjE3MV9TRVJERVNfUkVHLCBNVl9FNjE3MV9TRVJERVNfQ09OVFJPTF9SRUcsICZyZWcpOworCQkvKiBDbGVhciBCaXQgMTEgdG8gcG93ZXIgdXAgdGhlIHN3aXRjaCBTZXJEZXMgKi8KKwkJcmVnICY9IH5CSVQxMTsKKwkJbXZFdGhTd2l0Y2hQaHlSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9TRVJERVNfUkVHLCBNVl9FNjE3MV9TRVJERVNfQ09OVFJPTF9SRUcsIHJlZyk7CisJfQogCiAJLyogUG93ZXIgdXAgUEhZcyAqLwotCWZvcihwcnQ9MDsgcHJ0IDwgTVZfRTYxNzFfTUFYX1BPUlRTX05VTSAtIDI7IHBydCsrKQl7Ci0JCWlmIChwcnQgIT0gTVZfRTYxNzFfQ1BVX1BPUlQpIHsKKwlmb3IgKHBydCA9IDA7IHBydCA8IE1WX0U2MTcxX01BWF9QT1JUU19OVU0gLSAyOyBwcnQrKykJeworCQlpZiAocHJ0ICE9IGNwdVBvcnQpIHsKIAkJCS8qRW5hYmxlIFBoeSBwb3dlciB1cCBmb3Igc3dpdGNoIDEqLwotCQkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9HTE9CQUxfMl9SRUdfREVWX0FERFIsCi0JCQkJCQkJCSBNVl9FNjE3MV9TTUlfUEhZX0RBVEEsIDB4MzM2MCk7CisJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUiwgTVZfRTYxNzFfU01JX1BIWV9EQVRBLCAweDMzNjApOwogCQkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9HTE9CQUxfMl9SRUdfREVWX0FERFIsIE1WX0U2MTcxX1NNSV9QSFlfQ09NTUFORCwKIAkJCQkJCQkJKDB4OTQxMCB8IChwcnQgPDwgNSkpKTsKIAkJCS8qTWFrZSBzdXJlIFNNSUJ1c3kgYml0IGNsZWFyZWQgYmVmb3JlIGFub3RoZXIgU01JIG9wZXJhdGlvbiBjYW4gdGFrZSBwbGFjZSovCkBAIC0zMzAsMjQgKzU5MSwyMyBAQAogCiAJCQlkbyB7CiAJCQkJbXZFdGhTd2l0Y2hSZWdSZWFkKGV0aFBvcnROdW0sIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUiwgTVZfRTYxNzFfU01JX1BIWV9DT01NQU5ELCZyZWcpOwotCQkJCWlmKHRpbWVvdXQtLSA9PSAwKSB7CisJCQkJaWYgKHRpbWVvdXQtLSA9PSAwKSB7CiAJCQkJCW12T3NQcmludGYoIm12RXRoUGh5UmVnUmVhZDogU01JIGJ1c3kgdGltZW91dFxuIik7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQl9IHdoaWxlIChyZWcgJiBFNjE3MV9QSFlfU01JX0JVU1lfTUFTSyk7IAorCQkJfSB3aGlsZSAocmVnICYgRTYxNzFfUEhZX1NNSV9CVVNZX01BU0spOwogIAogCQkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9HTE9CQUxfMl9SRUdfREVWX0FERFIsIE1WX0U2MTcxX1NNSV9QSFlfREFUQSwweDkxNDApOwogCQkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3MV9HTE9CQUxfMl9SRUdfREVWX0FERFIsCiAJCQkJCQkJCU1WX0U2MTcxX1NNSV9QSFlfQ09NTUFORCwoMHg5NDAwIHwgKHBydCA8PCA1KSkpOwogCi0KIAkJCS8qTWFrZSBzdXJlIFNNSUJ1c3kgYml0IGNsZWFyZWQgYmVmb3JlIGFub3RoZXIgU01JIG9wZXJhdGlvbiBjYW4gdGFrZSBwbGFjZSovCiAJCQl0aW1lb3V0ID0gRTYxNzFfUEhZX1RJTUVPVVQ7CiAKIAkJCWRvIHsKIAkJCQltdkV0aFN3aXRjaFJlZ1JlYWQoZXRoUG9ydE51bSwgTVZfRTYxNzFfR0xPQkFMXzJfUkVHX0RFVl9BRERSLAogCQkJCQkJCQkgICBNVl9FNjE3MV9TTUlfUEhZX0NPTU1BTkQsJnJlZyk7Ci0JCQkJaWYodGltZW91dC0tID09IDApIHsKKwkJCQlpZiAodGltZW91dC0tID09IDApIHsKIAkJCQkJbXZPc1ByaW50ZigibXZFdGhQaHlSZWdSZWFkOiBTTUkgYnVzeSB0aW1lb3V0XG4iKTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KQEAgLTM1NSwzMSArNjE1LDEwMyBAQAogCQl9CiAJfQogCi0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQgKyBjcHVQb3J0LCAweDQsIDB4N2YpOwotCQorCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciArIGNwdVBvcnQsIDB4NCwgMHg3Zik7CisKIAkvKiBJbml0IExFRHMgb24gUkQtNjI4MiAqLwogCS8qIE1vdmUgYWxsIExFRHMgdG8gc3BlY2lhbCAqLwotCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNjFfUE9SVFNfT0ZGU0VULCAweDE2LCAoQklUMTV8MHg2NykpOwotCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgTVZfRTYxNjFfUE9SVFNfT0ZGU0VULCAweDE2LCAoQklUMTV8QklUMTJ8MHgzMikpOworCW12RXRoU3dpdGNoUmVnV3JpdGUoZXRoUG9ydE51bSwgc3dpY3RoUGh5QWRkciwgTVZfRTYxNzFfTEVEX0NPTlRST0wsIChCSVQxNXwweDY3KSk7CisJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBzd2ljdGhQaHlBZGRyLCBNVl9FNjE3MV9MRURfQ09OVFJPTCwgKEJJVDE1fEJJVDEyfDB4MzIpKTsKIAogCS8qIFBvcnQgMCBMRUQgc3BlY2lhbCBhY3Rpdml0eSBsaW5rICovCi0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQsIDB4MTYsIChCSVQxNXxCSVQxNHxCSVQxM3xCSVQxMnxCSVQwKSk7CisJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBzd2ljdGhQaHlBZGRyLCBNVl9FNjE3MV9MRURfQ09OVFJPTCwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDApKTsKIAogCS8qIFBvcnQgMSBMRUQgc3BlY2lhbCBhY3Rpdml0eSBsaW5rICovCi0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQrMSwgMHgxNiwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDEpKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIgKyAxLCBNVl9FNjE3MV9MRURfQ09OVFJPTCwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDEpKTsKIAogCS8qIFBvcnQgMiBMRUQgc3BlY2lhbCBhY3Rpdml0eSBsaW5rICovCi0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQrMiwgMHgxNiwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDIpKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIgKyAyLCBNVl9FNjE3MV9MRURfQ09OVFJPTCwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDIpKTsKIAogCS8qIFBvcnQgMyBMRUQgc3BlY2lhbCBhY3Rpdml0eSBsaW5rICovCi0JbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE2MV9QT1JUU19PRkZTRVQrMywgMHgxNiwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDMpKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIgKyAzLCBNVl9FNjE3MV9MRURfQ09OVFJPTCwgKEJJVDE1fEJJVDE0fEJJVDEzfEJJVDEyfEJJVDMpKTsKIAogI2lmZGVmIFJEXzg4RjY3MTAKLQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTYxX1BPUlRTX09GRlNFVCwgMHgxNiwgMHhmMDBmKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIHN3aWN0aFBoeUFkZHIsIE1WX0U2MTcxX0xFRF9DT05UUk9MLCAweGYwMGYpOwogI2VuZGlmCiAKIH0KIAorTVZfVk9JRAltdkV0aEU2MTcyU3dpdGNoQmFzaWNJbml0KE1WX1UzMiBldGhQb3J0TnVtKQoreworCisJTVZfVTMyIHBydDsKKwlNVl9VMTYgcmVnOworCU1WX1UzMiB0aW1lb3V0OworCU1WXzMyIGNwdVBvcnQgPSAgTVZfRTYxNzJfQ1BVX1BPUlQ7LyptdkJvYXJkU3dpdGNoQ3B1UG9ydEdldCgwKTsqLworCU1WX1UxNiBzbWlSZWcsIGRhdGE7CisKKwkvKiBUaGUgNjE3MiBuZWVkcyBhIGRlbGF5ICovCisJbXZPc0RlbGF5KDEwMDApOworCisJLyogSW5pdCB2bGFuIG9mIHN3aXRjaCAxIGFuZCBlbmFibGUgYWxsIHBvcnRzICovCisJc3dpdGNoVmxhbkluaXQoZXRoUG9ydE51bSwgTVZfRTYxNzJfQ1BVX1BPUlQsIE1WX0U2MTcyX01BWF9QT1JUU19OVU0sIE1WX0U2MTcyX1BPUlRTX09GRlNFVCwKKwkJCQkgICBNVl9FNjE3Ml9FTkFCTEVEX1BPUlRTKTsKKworCS8qIEVuYWJsZSBSR01JSSBkZWxheSBvbiBUeCBhbmQgUnggZm9yIGNwdSBwb3J0LCBmb3JjZSBkdXBsZXgsIGxpbmsgdXAsICBmbG93IGNvbnRyb2wsIGFuZCBzcGVlZCB0byAxR3BzKi8KKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcyX1BPUlRTX09GRlNFVCArIGNwdVBvcnQsIE1WX0U2MTcyX1NXSVRDSF9QSElZU0lDQUxfQ1RSTF9SRUcsCisJUURfUENTX1JHTUlJX1JYX1RJTUlOR19NQVNLIHwgUURfUENTX1JHTUlJX1RYX1RJTUlOR19NQVNLIHwgUURfUENTX0ZMT1dfQ09OVFJPTF9WQUxVRV9NQVNLCisJfCBRRF9QQ1NfRk9SQ0VEX0ZMT1dfQ09OVFJPTF9NQVNLIHwgUURfUENTX0xJTktfVkFMVUVfTUFTSyB8IFFEX1BDU19GT1JDRURfTElOS19NQVNLCisJfCBRRF9QQ1NfRFVQTEVYX1ZBTFVFX01BU0sgfCBRRF9QQ1NfRk9SQ0VEX0RVUExFWF9NQVNLIHwgUURfUENTX0ZPUkNFX1NQRUVEXzFHKTsKKwltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcyX1BPUlRTX09GRlNFVCArIGNwdVBvcnQsIE1WX0U2MTcyX1NXSVRDSF9QT1JUX0NUUkxfUkVHLAorCVFEX1BDX1ZMQU5fVFVOTkVMX0JZX1BBU1MgfCBRRF9QQ19JTklUSUFMX1BSSV9JUCB8IFFEX1BDX0VHUkVTU19GTE9PRFNfQUxMIHwgUURfUENfUE9SVF9TVEFURV9GT1JXQVJESU5HKTsKKworCS8qIFBvd2VyIHVwIFBIWXMgKi8KKwlmb3IgKHBydCA9IDA7IHBydCA8IE1WX0U2MTcyX01BWF9QT1JUU19OVU0gLSAyOyBwcnQrKykJeworCQlpZiAocHJ0ICE9IE1WX0U2MTcyX0NQVV9QT1JUKSB7CisJCQkvKkVuYWJsZSBQaHkgcG93ZXIgdXAgZm9yIHN3aXRjaCAxKi8KKwkJCWRhdGEgPSBRRF9QSFlfTURJX0NST1NTX0FVVE8gfCBRRF9QSFlfRU5FUkdZX0RFVEVDVF9TRU5TRV9QRVJJT0RJQ19UWF9OTFAgfAorCQkJUURfUEhZX0RPV05TSElGVF9DT1VOVEVSOworCQkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3Ml9HTE9CQUxfMl9SRUdfREVWX0FERFIsCisJCQkJCQkJCU1WX0U2MTcyX1NNSV9QSFlfREFUQSwgZGF0YSk7CisJCQlzbWlSZWcgPSAoUURfU01JX0JVU1kgfCAocHJ0IDw8IFFEX1NNSV9ERVZfQUREUl9CSVQpIHwgKFFEX1NNSV9XUklURSA8PCBRRF9TTUlfT1BfQklUKSB8CisJCQkoUURfUEhZX1NQRUNfQ09OVFJPTF9SRUcgPDwgUURfU01JX1JFR19BRERSX0JJVCkgfCAoUURfU01JX0NMQVVTRTIyIDw8IFFEX1NNSV9NT0RFX0JJVCkpOworCQkJbXZFdGhTd2l0Y2hSZWdXcml0ZShldGhQb3J0TnVtLCBNVl9FNjE3Ml9HTE9CQUxfMl9SRUdfREVWX0FERFIsCisJCQkJCQkJCU1WX0U2MTcyX1NNSV9QSFlfQ09NTUFORCwgc21pUmVnKTsKKwkJCS8qTWFrZSBzdXJlIFNNSUJ1c3kgYml0IGNsZWFyZWQgYmVmb3JlIGFub3RoZXIgU01JIG9wZXJhdGlvbiBjYW4gdGFrZSBwbGFjZSovCisJCQl0aW1lb3V0ID0gRTYxNzJfUEhZX1RJTUVPVVQ7CisKKwkJCWRvIHsKKwkJCQltdkV0aFN3aXRjaFJlZ1JlYWQoZXRoUG9ydE51bSwgTVZfRTYxNzJfR0xPQkFMXzJfUkVHX0RFVl9BRERSLAorCQkJCQlNVl9FNjE3Ml9TTUlfUEhZX0NPTU1BTkQsICZyZWcpOworCQkJCWlmICh0aW1lb3V0LS0gPT0gMCkgeworCQkJCQltdk9zUHJpbnRmKCJtdkV0aFBoeVJlZ1JlYWQ6IFNNSSBidXN5IHRpbWVvdXRcbiIpOworCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSB3aGlsZSAocmVnICYgRTYxNzJfUEhZX1NNSV9CVVNZX01BU0spOworCisJCQlkYXRhID0gUURfUEhZX1JFU0VUIHwgUURfUEhZX0FVVE9ORUdPIHwgUURfUEhZX0RVUExFWCB8IFFEX1BIWV9TUEVFRF9NU0I7CisJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcyX0dMT0JBTF8yX1JFR19ERVZfQUREUiwgTVZfRTYxNzJfU01JX1BIWV9EQVRBLAorCQkJCWRhdGEpOworCQkJc21pUmVnID0gKFFEX1NNSV9CVVNZIHwgKHBydCA8PCBRRF9TTUlfREVWX0FERFJfQklUKSB8IChRRF9TTUlfV1JJVEUgPDwgUURfU01JX09QX0JJVCkgfAorCQkJKFFEX1BIWV9DT05UUk9MX1JFRyA8PCBRRF9TTUlfUkVHX0FERFJfQklUKSB8IChRRF9TTUlfQ0xBVVNFMjIgPDwgUURfU01JX01PREVfQklUKSk7CisJCQltdkV0aFN3aXRjaFJlZ1dyaXRlKGV0aFBvcnROdW0sIE1WX0U2MTcyX0dMT0JBTF8yX1JFR19ERVZfQUREUiwKKwkJCQkJCQkJTVZfRTYxNzJfU01JX1BIWV9DT01NQU5ELCBzbWlSZWcpOworCisJCQkvKk1ha2Ugc3VyZSBTTUlCdXN5IGJpdCBjbGVhcmVkIGJlZm9yZSBhbm90aGVyIFNNSSBvcGVyYXRpb24gY2FuIHRha2UgcGxhY2UqLworCQkJdGltZW91dCA9IEU2MTcyX1BIWV9USU1FT1VUOworCisJCQlkbyB7CisJCQkJbXZFdGhTd2l0Y2hSZWdSZWFkKGV0aFBvcnROdW0sIE1WX0U2MTcyX0dMT0JBTF8yX1JFR19ERVZfQUREUiwKKwkJCQkJTVZfRTYxNzJfU01JX1BIWV9DT01NQU5ELCAmcmVnKTsKKwkJCQlpZiAodGltZW91dC0tID09IDApIHsKKwkJCQkJbXZPc1ByaW50ZigibXZFdGhQaHlSZWdSZWFkOiBTTUkgYnVzeSB0aW1lb3V0XG4iKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCX0gd2hpbGUgKHJlZyAmIEU2MTcyX1BIWV9TTUlfQlVTWV9NQVNLKTsKKwkJfQorCX0KKworfQorCiBzdGF0aWMgdm9pZCBzd2l0Y2hWbGFuSW5pdChNVl9VMzIgZXRoUG9ydE51bSwgTVZfVTMyIHN3aXRjaENwdVBvcnQsIE1WX1UzMiBzd2l0Y2hNYXhQb3J0c051bSwKIAkJCSAgIE1WX1UzMiBzd2l0Y2hQb3J0c09mZnNldCwgTVZfVTMyIHN3aXRjaEVuYWJsZWRQb3J0c01hc2spCiB7CkBAIC00MDUsMTIgKzczNywxMyBAQAogCX0KIH0KIAorI2lmZGVmIE1WX1NXSVRDSF9ESVJFQ1RfQUNDRVNTCiB2b2lkIG12RXRoU3dpdGNoUmVnV3JpdGUoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UzMiBzd2l0Y2hQb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVTMyIHN3aXRjaFJlZywgTVZfVTE2IGRhdGEpCisJCQkJTVZfVTMyIHN3aXRjaFJlZywgTVZfVTE2IGRhdGEpCiB7CiAJTVZfVTMyIG9mZnNldCA9IDA7CiAKLQlpZiAobXZCb2FyZElzSW50ZXJuYWxTd2l0Y2hDb25uZWN0ZWQoKSA9PSBNVl9GQUxTRSkgeworCWlmIChtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSA9PSBNVl9GQUxTRSkgewogCQltdk9zUHJpbnRmKCJObyBTd2l0Y2guXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQyMywxMSArNzU2LDExIEBACiB9CiAKIHZvaWQgbXZFdGhTd2l0Y2hSZWdSZWFkKE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMzIgc3dpdGNoUG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVTMyIHN3aXRjaFJlZywgTVZfVTE2ICpkYXRhKQorCQkJCU1WX1UzMiBzd2l0Y2hSZWcsIE1WX1UxNiAqZGF0YSkKIHsKIAlNVl9VMzIgcmVzdWx0LCByZWcgPSAwOwogCi0JaWYgKG12Qm9hcmRJc0ludGVybmFsU3dpdGNoQ29ubmVjdGVkKCkgPT0gTVZfRkFMU0UpIHsKKwlpZiAobXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKCkgPT0gTVZfRkFMU0UpIHsKIAkJbXZPc1ByaW50ZigiTm8gU3dpdGNoLlxuIik7CiAJCXJldHVybjsKIAl9CkBAIC00NDAsNiArNzczLDExOCBAQAogCSpkYXRhID0gcmVzdWx0OwogfQogCisjZWxzZQkvKmRlZmluZWQoTVZfU1dJVENIX1NNSV9BQ0NFU1MpKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12RXRoU3dpdGNoV2FpdFNNSUNvbW1hbmRSZWdGcmVlIC0KKyoKKyogREVTQ1JJUFRJT046CisqCXdhaXQgU01JIGNvbW1hbmQgcmVnaXN0ZXIgdG8gYmUgZnJlZQorKgorKiBJTlBVVDoKKyoJdGltZU91dCAtIHRoZSB3YWl0IHRpbWUsIGluIDEwME1TIHVuaXRzCisqCisqIE9VVFBVVDoKKyoJTm9uZQorKgorKiBSRVRVUk46ICAgdHJ1ZSAtIFNNSSBjb21tYW5kIHJlZ2lzdGVyIGlzIGZyZWUsIGZhbHNlIC0gU01JIGNvbW1hbmQgcmVnaXN0ZXIgaXMgbm90IGZyZWUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTVZfQk9PTCBtdkV0aFN3aXRjaFdhaXRTTUlDb21tYW5kUmVnRnJlZShNVl9VMzIgdGltZU91dCkKK3sKKwlNVl9VMTYgc21pUmVnOworCWludCBpOworCisJLyogZmlyc3QgY2hlY2sgdGhhdCBpdCBpcyBub3QgYnVzeSAqLworCWlmIChtdkV0aFBoeVJlZ1JlYWQoc3dpdGNoUGh5QWRkciwgKE1WX1UzMilRRF9SRUdfU01JX0NPTU1BTkQsICZzbWlSZWcpICE9IE1WX09LKQorCQlyZXR1cm4gTVZfRkFMU0U7CisKKwl0aW1lT3V0ID0gUURfU01JX0FDQ0VTU19MT09QOyAvKiBpbml0aWFsaXplIHRoZSBsb29wIGNvdW50ICovCisKKwlpZiAoc21pUmVnICYgUURfU01JX0JVU1kpIHsKKwkJZm9yIChpID0gMDsgaSA8IFFEX1NNSV9USU1FT1VUOyBpKyspCisJCQk7CisJCWRvIHsKKwkJCWlmICh0aW1lT3V0LS0gPCAxKQorCQkJCXJldHVybiBNVl9GQUxTRTsKKwkJCWlmIChtdkV0aFBoeVJlZ1JlYWQoc3dpdGNoUGh5QWRkciwgKE1WX1UzMilRRF9SRUdfU01JX0NPTU1BTkQsICZzbWlSZWcpICE9IE1WX09LKQorCQkJCXJldHVybiBNVl9GQUxTRTsKKwkJfSB3aGlsZSAoc21pUmVnICYgUURfU01JX0JVU1kpOworCX0KKworCXJldHVybiBNVl9UUlVFOworfQorCit2b2lkIG12RXRoU3dpdGNoUmVnV3JpdGUoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UzMiBzd2l0Y2hQb3J0LAorCQkJCU1WX1UzMiBzd2l0Y2hSZWcsIE1WX1UxNiBkYXRhKQoreworCU1WX1UxNiBzbWlSZWc7CisKKwlpZiAobXZCb2FyZElzU3dpdGNoQ29ubmVjdGVkKCkgPT0gTVZfRkFMU0UpIHsKKwkJbXZPc1ByaW50ZigiTm8gU3dpdGNoLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3dpdGNoQWNjZXNzTW9kZSAhPSBTTUlfTVVMVElfQUREUl9NT0RFKSB7CisJCW12RXRoUGh5UmVnV3JpdGUoc3dpdGNoUG9ydCwgc3dpdGNoUmVnLCBkYXRhKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHdhaXQgU01JIGNvbW1hbmQgcmVnaXN0ZXIgdG8gYmUgZnJlZSAqLworCWlmIChtdkV0aFN3aXRjaFdhaXRTTUlDb21tYW5kUmVnRnJlZShRRF9TTUlfQUNDRVNTX0xPT1ApID09IE1WX0ZBTFNFKQorCQlyZXR1cm47CisKKwlpZiAobXZFdGhQaHlSZWdXcml0ZShzd2l0Y2hQaHlBZGRyLCAoTVZfVTMyKVFEX1JFR19TTUlfREFUQSwgZGF0YSkgIT0gTVZfT0spCisJCXJldHVybjsKKworCXNtaVJlZyA9IFFEX1NNSV9CVVNZIHwgKHN3aXRjaFBvcnQgPDwgUURfU01JX0RFVl9BRERSX0JJVCkgfCAoUURfU01JX1dSSVRFIDw8IFFEX1NNSV9PUF9CSVQpIHwKKwkJKHN3aXRjaFJlZyA8PCBRRF9TTUlfUkVHX0FERFJfQklUKSB8IChRRF9TTUlfQ0xBVVNFMjIgPDwgUURfU01JX01PREVfQklUKTsKKworCWlmIChtdkV0aFBoeVJlZ1dyaXRlKHN3aXRjaFBoeUFkZHIsIChNVl9VMzIpUURfUkVHX1NNSV9DT01NQU5ELCBzbWlSZWcpICE9IE1WX09LKQorCQlyZXR1cm47CisKKwlyZXR1cm47Cit9CisKKwordm9pZCBtdkV0aFN3aXRjaFJlZ1JlYWQoTVZfVTMyIGV0aFBvcnROdW0sIE1WX1UzMiBzd2l0Y2hQb3J0LAorCQkJCU1WX1UzMiBzd2l0Y2hSZWcsIE1WX1UxNiAqZGF0YSkKK3sKKwlNVl9VMTYgc21pUmVnOworCisJaWYgKG12Qm9hcmRJc1N3aXRjaENvbm5lY3RlZCgpID09IE1WX0ZBTFNFKSB7CisJCW12T3NQcmludGYoIk5vIFN3aXRjaC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHN3aXRjaEFjY2Vzc01vZGUgIT0gU01JX01VTFRJX0FERFJfTU9ERSkgeworCQltdkV0aFBoeVJlZ1JlYWQoc3dpdGNoUG9ydCwgc3dpdGNoUmVnLCAmc21pUmVnKTsKKwkJKmRhdGEgPSBzbWlSZWc7CisJCXJldHVybjsKKwl9CisKKwkvKiB3YWl0IFNNSSBjb21tYW5kIHJlZ2lzdGVyIHRvIGJlIGZyZWUgKi8KKwlpZiAobXZFdGhTd2l0Y2hXYWl0U01JQ29tbWFuZFJlZ0ZyZWUoUURfU01JX0FDQ0VTU19MT09QKSA9PSBNVl9GQUxTRSkKKwkJcmV0dXJuOworCisJc21pUmVnID0gIFFEX1NNSV9CVVNZIHwgKHN3aXRjaFBvcnQgPDwgUURfU01JX0RFVl9BRERSX0JJVCkgfCAoUURfU01JX1JFQUQgPDwgUURfU01JX09QX0JJVCkgfAorCQkoc3dpdGNoUmVnIDw8IFFEX1NNSV9SRUdfQUREUl9CSVQpIHwgKFFEX1NNSV9DTEFVU0UyMiA8PCBRRF9TTUlfTU9ERV9CSVQpOworCisJaWYgKG12RXRoUGh5UmVnV3JpdGUoc3dpdGNoUGh5QWRkciwgKE1WX1UzMilRRF9SRUdfU01JX0NPTU1BTkQsIHNtaVJlZykgIT0gTVZfT0spCisJCXJldHVybjsKKworCS8qIHdhaXQgU01JIGNvbW1hbmQgcmVnaXN0ZXIgdG8gYmUgZnJlZSAqLworCWlmIChtdkV0aFN3aXRjaFdhaXRTTUlDb21tYW5kUmVnRnJlZShRRF9TTUlfQUNDRVNTX0xPT1ApID09IE1WX0ZBTFNFKQorCQlyZXR1cm47CisKKwlpZiAobXZFdGhQaHlSZWdSZWFkKHN3aXRjaFBoeUFkZHIsIChNVl9VMzIpUURfUkVHX1NNSV9EQVRBLCAmc21pUmVnKSAhPSBNVl9PSykKKwkJcmV0dXJuOworCisJKmRhdGEgPSBzbWlSZWc7CisKKwlyZXR1cm47Cit9CisjZW5kaWYKKwogdm9pZCBtdkV0aFN3aXRjaFBoeVJlZ1dyaXRlKE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMTYgcHJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVTE2IHJlZ09mZnMsIE1WX1UxNiBkYXRhKQogewpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoLmggYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9ldGhTd2l0Y2gvbXZTd2l0Y2guaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZWNmZDkuLjYyMWE4NDMKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoLmgKQEAgLTY3LDYgKzY3LDExIEBACiAKICNpbmNsdWRlICJtdlR5cGVzLmgiCiAKKy8qIGRlZmluaXRpb24gZm9yIGRldmljZSBzY2FuIG1vZGUgKi8KKyNkZWZpbmUgU01JX0FVVE9fU0NBTl9NT0RFICAgICAgICAwICAgIC8qIFNjYW4gMCBvciAweDEwIGJhc2UgYWRkcmVzcyB0byBmaW5kIHRoZSBRRCAqLworI2RlZmluZSBTTUlfTUFOVUFMX01PREUgICAgICAgICAgICAxICAgIC8qIFVzZSBRRCBsb2NhdGVkIGF0IG1hbnVhbGx5IGRlZmluZWQgYmFzZSBhZGRyICovCisjZGVmaW5lIFNNSV9NVUxUSV9BRERSX01PREUgICAgICAgIDIgICAgLyogVXNlIFFEIGF0IGJhc2UgYWRkciBhbmQgdXNlIGluZGlyZWN0IGFjY2VzcyAqLworCiBNVl9WT0lECW12RXRoRTYwNjNTd2l0Y2hCYXNpY0luaXQoTVZfVTMyIGV0aFBvcnROdW0pOwogTVZfVk9JRAltdkV0aEU2MDY1XzYxU3dpdGNoQmFzaWNJbml0KE1WX1UzMiBldGhQb3J0TnVtKTsKIE1WX1ZPSUQJbXZFdGhFNjEzMVN3aXRjaEJhc2ljSW5pdChNVl9VMzIgZXRoUG9ydE51bSk7CkBAIC03Niw5ICs4MSwxMCBAQAogdm9pZCBtdkV0aFN3aXRjaFJlZ1dyaXRlKE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMzIgcGh5QWRkciwgTVZfVTMyIHJlZ09mZnMsIE1WX1UxNiBkYXRhKTsKIHZvaWQgbXZFdGhTd2l0Y2hQaHlSZWdSZWFkKE1WX1UzMiBldGhQb3J0TnVtLCBNVl9VMTYgcHJ0LCBNVl9VMTYgcmVnT2ZmcywgTVZfVTE2ICpkYXRhKTsKIHZvaWQgbXZFdGhTd2l0Y2hQaHlSZWdXcml0ZShNVl9VMzIgZXRoUG9ydE51bSwgTVZfVTE2IHBydCwgTVZfVTE2IHJlZ09mZnMsIE1WX1UxNiBkYXRhKTsKLQorTVZfVTE2IG12RXRoU3dpdGNoR2V0RGV2aWNlSUQodm9pZCk7CiAjaWZkZWYgTVY4OEY2NlhYCiBNVl9WT0lEIG12QWxwQm9hcmRTd2l0Y2hCYXNpY0luaXQoTVZfVTMyIGVuYWJsZWRQb3J0cyk7CiAjZW5kaWYKK01WX1ZPSUQJbXZFdGhFNjE3MlN3aXRjaEJhc2ljSW5pdChNVl9VMzIgZXRoUG9ydE51bSk7CiAKICNlbmRpZiAvKiBfX0lOQ0VUSFNXSVRDSEggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL2V0aFN3aXRjaC9tdlN3aXRjaFJlZ3MuaCBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2V0aFN3aXRjaC9tdlN3aXRjaFJlZ3MuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDc1MjlmMmIuLmM3NGZiNDgKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvZXRoU3dpdGNoL212U3dpdGNoUmVncy5oCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL2V0aFN3aXRjaC9tdlN3aXRjaFJlZ3MuaApAQCAtMTEwLDE4ICsxMTAsMzkgQEAKICNkZWZpbmUgRTYxNjFfUEhZX1NNSV9CVVNZX01BU0sJCQkJCSgxIDw8IEVUSF9QSFlfU01JX0JVU1lfQklUKQogCiAvKiBFNjE3MSByZWxhdGVkICovCi0jZGVmaW5lIE1WX0U2MTcxX0NQVV9QT1JUCQkJCQkJMHg2Ci0jZGVmaW5lIE1WX0U2MTcxX1BPUlRTX09GRlNFVAkJCQkJMHgxMAotI2RlZmluZSBNVl9FNjE3MV9TV0lUQ0hfUEhJWVNJQ0FMX0NUUkxfUkVHCQkweDEKLSNkZWZpbmUgTVZfRTYxNzFfU1dJVENIX1BPUlRfQ1RSTF9SRUcJCSAgICAweDQKKyNkZWZpbmUgTVZfRTYxNzFfUFJPRFVDVF9OVU0JCQkJCTB4MTcxCisjZGVmaW5lIE1WX0U2MTc2X1BST0RVQ1RfTlVNCQkJCQkweDE3NgorI2RlZmluZSBNVl9FNjE3MV9NQVhfUE9SVFNfTlVNCQkJCQk3CisvKiBQSFkgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1WX0U2MTcxX1NFUkRFU19SRUcJCQkJCTB4ZgorI2RlZmluZSBNVl9FNjE3MV9TRVJERVNfQ09OVFJPTF9SRUcJCQkJMHgwCisjZGVmaW5lIE1WX0U2MTcxX1BBR0VfUkVHCQkJCQkweDE2CisjZGVmaW5lIE1WX0U2MTcxX1NXSVRDSF9QSElZU0lDQUxfQ1RSTF9SRUcJCQkweDEKKy8qIFBvcnQgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1WX0U2MTcxX0xFRF9DT05UUk9MCQkJCQkweDE2CisjZGVmaW5lIE1WX0U2MTcxX0dMT0JBTF8yX1JFR19ERVZfQUREUgkJCQkweDFDCisvKiBTTUkgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE1WX0U2MTcxX1NNSV9QSFlfQ09NTUFORAkJCQkweDE4CiAjZGVmaW5lIE1WX0U2MTcxX1NNSV9QSFlfREFUQQkJCQkJMHgxOQotI2RlZmluZSBNVl9FNjE3MV9HTE9CQUxfMl9SRUdfREVWX0FERFIJCQkweDFDCi0jZGVmaW5lIE1WX0U2MTcxX01BWF9QT1JUU19OVU0JCQkJCTcKLSNkZWZpbmUgTVZfRTYxNzFfRU5BQkxFRF9QT1JUUwkJCQkJKCgxIDw8IDApfCgxIDw8IDEpfCgxIDw8IDIpfCgxIDw8IDMpfCgxIDw8IDQpfCgxIDw8IDYpKQotI2RlZmluZSBFNjE3MV9QSFlfVElNRU9VVAkJCQkJICAgIDEwMDAwCi0jZGVmaW5lIEU2MTcxX1BIWV9TTUlfQlVTWV9CSVQJCSAgICAJCTE1ICAvKiBCdXN5ICovCi0jZGVmaW5lIEU2MTcxX1BIWV9TTUlfQlVTWV9NQVNLCQkgICAgCQkoMSA8PCBFVEhfUEhZX1NNSV9CVVNZX0JJVCkKKyNkZWZpbmUgRTYxNzFfUEhZX1NNSV9CVVNZX0JJVAkJICAgIAkJCTE1ICAvKiBCdXN5ICovCisjZGVmaW5lIEU2MTcxX1BIWV9TTUlfQlVTWV9NQVNLCQkJCQkoMSA8PCBFNjE3MV9QSFlfU01JX0JVU1lfQklUKQorI2RlZmluZSBFNjE3MV9QSFlfVElNRU9VVAkJCQkJMTAwMDAKKyNkZWZpbmUgTVZfRTYxNzFfRU5BQkxFRF9QT1JUUwkJCQkJKCgxIDw8IDApfCgxIDw8IDEpfCgxIDw8IDIpfCgxIDw8IDMpfCgxIDw8IDQpfCgxIDw8IDUpfCgxIDw8IDYpKQorCisvKiBFNjE3MiByZWxhdGVkICovCisjZGVmaW5lIE1WX0U2MTcyX1BST0RVQ1RfTlVNCQkJCQkweDE3MgorI2RlZmluZSBNVl9FNjE3Ml9DUFVfUE9SVAkJCQkJMHg2CisjZGVmaW5lIE1WX0U2MTcyX1BPUlRTX09GRlNFVAkJCQkJMHgxMAorI2RlZmluZSBNVl9FNjE3Ml9TV0lUQ0hfUEhJWVNJQ0FMX0NUUkxfUkVHCQkJMHgxCisjZGVmaW5lIE1WX0U2MTcyX1NXSVRDSF9QT1JUX0NUUkxfUkVHCQkJCTB4NAorI2RlZmluZSBNVl9FNjE3Ml9TTUlfUEhZX0NPTU1BTkQJCQkJMHgxOAorI2RlZmluZSBNVl9FNjE3Ml9TTUlfUEhZX0RBVEEJCQkJCTB4MTkKKyNkZWZpbmUgTVZfRTYxNzJfR0xPQkFMXzJfUkVHX0RFVl9BRERSCQkJCTB4MUMKKyNkZWZpbmUgTVZfRTYxNzJfTUFYX1BPUlRTX05VTQkJCQkJNworI2RlZmluZSBNVl9FNjE3Ml9FTkFCTEVEX1BPUlRTCQkJCQkoKDEgPDwgMCl8KDEgPDwgMSl8KDEgPDwgMil8KDEgPDwgMyl8KDEgPDwgNCl8KDEgPDwgNikpCisjZGVmaW5lIEU2MTcyX1BIWV9USU1FT1VUCQkJCQkxMDAwMAorI2RlZmluZSBFNjE3Ml9QSFlfU01JX0JVU1lfQklUCQkJCQkxNSAgLyogQnVzeSAqLworI2RlZmluZSBFNjE3Ml9QSFlfU01JX0JVU1lfTUFTSwkJCQkJKDEgPDwgRTYxNzJfUEhZX1NNSV9CVVNZX0JJVCkKIAogLyogQXJtYWRhIDM3MCBpbnRlcm5hbCByZWxhdGVkICovCiAjZGVmaW5lIE1WX1NXX0NQVV9QT1JUCQkJCQkJCTB4NgpAQCAtMTU1LDQgKzE3Niw5MSBAQAogI2RlZmluZSBNVl9BTFBfU1dfUE9SVFNfT0ZGU0VUCQkJCQkweDEwCiAjZGVmaW5lIE1WX0FMUF9TV19NQVhfUE9SVFNfTlVNCQkJCQk3CiAKKy8qIFN0YXJ0IGFkZHJlc3Mgb2YgcG9ydHMgcmVsYXRlZCByZWdpc3Rlci4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgUE9SVF9SRUdTX1NUQVJUX0FERFIgICAgICAgIDB4OAorI2RlZmluZSBQT1JUX1JFR1NfU1RBUlRfQUREUl84UE9SVCAgICAweDEwCisKKyNkZWZpbmUgUURfU01JX0FDQ0VTU19MT09QICAgICAgICAxMDAwCisjZGVmaW5lIFFEX1NNSV9USU1FT1VUICAgICAgICAgICAgMgorCisvKiBEZWZpbml0aW9uIGZvciBNdWx0aSBBZGRyZXNzIE1vZGUgKi8KKyNkZWZpbmUgUURfUkVHX1NNSV9DT01NQU5EICAgICAgICAweDAKKyNkZWZpbmUgUURfUkVHX1NNSV9EQVRBICAgICAgICAgICAgMHgxCisKKyNkZWZpbmUgUURfUkVHX1NXSVRDSF9JRAkJCTB4MworI2RlZmluZSBRRF9SRUdfU1dJVENIX0lEX1BST0RVQ1RfTlVNX09GRlNFVAk0CisKKyNkZWZpbmUgUURfUEhZX0NPTlRST0xfUkVHCQkwCisjZGVmaW5lIFFEX1BIWV9TUEVDX0NPTlRST0xfUkVHCQkxNgorCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgUURfUEhZX0NPTlRST0xfUkVHICovCisjZGVmaW5lIFFEX1BIWV9SRVNFVCAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBRRF9QSFlfTE9PUEJBQ0sgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgUURfUEhZX1NQRUVEICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIFFEX1BIWV9BVVRPTkVHTyAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBRRF9QSFlfUE9XRVIgICAgICAgICAgICAweDgwMAorI2RlZmluZSBRRF9QSFlfSVNPTEFURSAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIFFEX1BIWV9SRVNUQVJUX0FVVE9ORUdPICAgICAgICAweDIwMAorI2RlZmluZSBRRF9QSFlfRFVQTEVYICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgUURfUEhZX1NQRUVEX01TQiAgICAgICAgMHg0MAorCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgUURfUEhZX1NQRUNfQ09OVFJPTF9SRUcgKi8KKyNkZWZpbmUgUURfUEhZX01ESV9DUk9TU19BVVRPCQkJCTB4NjAKKyNkZWZpbmUgUURfUEhZX0VORVJHWV9ERVRFQ1RfU0VOU0VfUEVSSU9ESUNfVFhfTkxQCTB4MzAwCisjZGVmaW5lIFFEX1BIWV9ET1dOU0hJRlRfQ09VTlRFUgkJCTB4MzAwMAorCisvKiBCaXQgRGVmaW5pdGlvbiBmb3IgTVZfU1dJVENIX1BIWVNfQ09OVFJPTF9SRUcoc3dpdGNoIHBvcnQgMSkgKi8KKyNkZWZpbmUgUURfUENTX1JHTUlJX1JYX1RJTUlOR19PRkZTRVQJCQkxNQorI2RlZmluZSBRRF9QQ1NfUkdNSUlfVFhfVElNSU5HX09GRlNFVAkJCTE0CisjZGVmaW5lIFFEX1BDU19GTE9XX0NPTlRST0xfVkFMVUVfT0ZGU0VUCQk3CisjZGVmaW5lIFFEX1BDU19GT1JDRURfRkxPV19DT05UUk9MX09GRlNFVAkJNgorI2RlZmluZSBRRF9QQ1NfTElOS19WQUxVRV9PRkZTRVQJCQk1CisjZGVmaW5lIFFEX1BDU19GT1JDRURfTElOS19PRkZTRVQJCQk0CisjZGVmaW5lIFFEX1BDU19EVVBMRVhfVkFMVUVfT0ZGU0VUCQkJMworI2RlZmluZSBRRF9QQ1NfRk9SQ0VEX0RVUExFWF9PRkZTRVQJCQkyCisjZGVmaW5lIFFEX1BDU19GT1JDRV9TUEVFRF9PRkZTRVQJCQkwCisKKyNkZWZpbmUgUURfUENTX1JHTUlJX1JYX1RJTUlOR19NQVNLCQkJKDEgPDwgUURfUENTX1JHTUlJX1JYX1RJTUlOR19PRkZTRVQpCisjZGVmaW5lIFFEX1BDU19SR01JSV9UWF9USU1JTkdfTUFTSwkJCSgxIDw8IFFEX1BDU19SR01JSV9UWF9USU1JTkdfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ1NfRkxPV19DT05UUk9MX1ZBTFVFX01BU0sJCQkoMSA8PCBRRF9QQ1NfRkxPV19DT05UUk9MX1ZBTFVFX09GRlNFVCkKKyNkZWZpbmUgUURfUENTX0ZPUkNFRF9GTE9XX0NPTlRST0xfTUFTSwkJCSgxIDw8IFFEX1BDU19GT1JDRURfRkxPV19DT05UUk9MX09GRlNFVCkKKyNkZWZpbmUgUURfUENTX0xJTktfVkFMVUVfTUFTSwkJCQkoMSA8PCBRRF9QQ1NfTElOS19WQUxVRV9PRkZTRVQpCisjZGVmaW5lIFFEX1BDU19GT1JDRURfTElOS19NQVNLCQkJCSgxIDw8IFFEX1BDU19GT1JDRURfTElOS19PRkZTRVQpCisjZGVmaW5lIFFEX1BDU19EVVBMRVhfVkFMVUVfTUFTSwkJCSgxIDw8IFFEX1BDU19EVVBMRVhfVkFMVUVfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ1NfRk9SQ0VEX0RVUExFWF9NQVNLCQkJKDEgPDwgUURfUENTX0ZPUkNFRF9EVVBMRVhfT0ZGU0VUKQorCisjZGVmaW5lIFFEX1BDU19GT1JDRV9TUEVFRF8xRwkJCQkoMiA8PCBRRF9QQ1NfRk9SQ0VfU1BFRURfT0ZGU0VUKQorI2RlZmluZSBRRF9QQ1NfRk9SQ0VfU1BFRURfTk9UX0ZPUkNFRAkJCSgzIDw8IFFEX1BDU19GT1JDRV9TUEVFRF9PRkZTRVQpCisKKy8qIEJpdCBEZWZpbml0aW9uIGZvciBNVl9TV0lUQ0hfUE9SVF9DT05UUk9MX1JFRyhzd2l0Y2ggcG9ydCA0KSAqLworI2RlZmluZSBRRF9QQ19QT1JUX1NUQVRFX09GRlNFVAkJCQkwCisjZGVmaW5lIFFEX1BDX0VHUkVTU19GTE9PRFNfT0ZGU0VUCQkJMgorI2RlZmluZSBRRF9QQ19JTklUSUFMX1BSSV9PRkZTRVQJCQk0CisjZGVmaW5lIFFEX1BDX1ZMQU5fVFVOTkVMX09GRlNFVAkJCTcKKworI2RlZmluZSBRRF9QQ19QT1JUX1NUQVRFX0ZPUldBUkRJTkcJCQkoMyA8PCBRRF9QQ19QT1JUX1NUQVRFX09GRlNFVCkKKyNkZWZpbmUgUURfUENfRUdSRVNTX0ZMT09EU19BTEwJCQkJKDMgPDwgUURfUENfRUdSRVNTX0ZMT09EU19PRkZTRVQpCisjZGVmaW5lIFFEX1BDX0lOSVRJQUxfUFJJX0lQCQkJCSgyIDw8IFFEX1BDX0lOSVRJQUxfUFJJX09GRlNFVCkKKyNkZWZpbmUgUURfUENfVkxBTl9UVU5ORUxfQllfUEFTUwkJCSgxIDw8IFFEX1BDX1ZMQU5fVFVOTkVMX09GRlNFVCkKKworCisKKworLyogQml0IGRlZmluaXRpb24gZm9yIFFEX1JFR19TTUlfQ09NTUFORCAqLworI2RlZmluZSBRRF9TTUlfQlVTWSAgICAgICAgICAgICAgICAweDgwMDAKKyNkZWZpbmUgUURfU01JX01PREUgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFFEX1NNSV9NT0RFX0JJVCAgICAgICAgICAgIDEyCisjZGVmaW5lIFFEX1NNSV9PUF9CSVQgICAgICAgICAgICAxMAorI2RlZmluZSBRRF9TTUlfT1BfU0laRSAgICAgICAgICAgIDIKKyNkZWZpbmUgUURfU01JX0RFVl9BRERSX0JJVCAgICAgICAgNQorI2RlZmluZSBRRF9TTUlfREVWX0FERFJfU0laRSAgICA1CisjZGVmaW5lIFFEX1NNSV9SRUdfQUREUl9CSVQgICAgICAgIDAKKyNkZWZpbmUgUURfU01JX1JFR19BRERSX1NJWkUgICAgNQorCisjZGVmaW5lIFFEX1NNSV9DTEFVU0U0NSAgICAgICAgICAgIDAKKyNkZWZpbmUgUURfU01JX0NMQVVTRTIyICAgICAgICAgICAgMQorCisjZGVmaW5lIFFEX1NNSV9XUklURSAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUURfU01JX1JFQUQgICAgICAgICAgICAgICAgMHgwMgorCiAjZW5kaWYgLyogX19JTkNldGhzd2l0Y2hyZWdzaCAqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfY21kLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9jbWQuYwppbmRleCBmYzkwMDNhLi45NjYxMGQxIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9jbWQuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9jbWQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImN0cmxFbnYvbXZDdHJsRW52TGliLmgiCiAjaW5jbHVkZSAiYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oIgogI2luY2x1ZGUgImNwdS9tdkNwdS5oIgorI2luY2x1ZGUgImN0cmxFbnYvc3lzL212QWhiVG9NYnVzUmVncy5oIgogCiAjaWYgZGVmaW5lZChNVl9JTkNfQk9BUkRfTk9SX0ZMQVNIKQogI2luY2x1ZGUgIm5vcmZsYXNoL212Rmxhc2guaCIKQEAgLTk5Miw3ICs5OTMsNiBAQAogCiAJcmV0dXJuIDE7CiB9Ci0KIFVfQk9PVF9DTUQoCiAJcGh5V3JpdGUsICAgICAgNCwgICAgIDQsICAgICAgcGh5X3dyaXRlX2NtZCwKIAkicGh5V3JpdGUJLSBXcml0ZSBQaHkgcmVnaXN0ZXJcbiIsCkBAIC0xMDAyLDcgKzEwMDIsNiBAQAogCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NXSVRDSCkKICNpbmNsdWRlICJldGhTd2l0Y2gvbXZTd2l0Y2guaCIKLQogaW50IHN3aXRjaF9yZWFkX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCiB7CiAJTVZfVTE2IHBoeVJlZzsKQEAgLTEwMzksNiArMTAzOCw3IEBACiAJIlx0V3JpdGUgdG8gdGhlIHN3aXRjaCByZWdpc3Rlci5cbiIKICk7CiAKKwogaW50IHN3aXRjaF9waHlfcmVhZF9jbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQogewogCU1WX1UxNiBwaHlSZWc7CkBAIC0xMTE1LDcgKzExMTUsMTQ0IEBACiAJIiBNQUNfUG9ydC4gXG4iCiAJIlx0UmVhZCB0aGUgc3dpdGNoIHBvcnRzIGNvdW50ZXJzLiBcbiIKICk7Ci0jZW5kaWYKKyNlbGlmIGRlZmluZWQoTVZfU1dJVENIX0FERFJFU1NfQ09NUExFVElPTikgLyogTVZfSU5DTFVERV9TV0lUQ0ggKi8KKworI2RlZmluZSBTV0lUQ0hfUkVHU19CQVNFX0FERFJfTUFTSwkJMHhGQzAwMDAwMAorI2RlZmluZSBTV0lUQ0hfQUREUl9DT01QTF9NU0JfVkFMKGFkZHIpCSgoYWRkciA+PiAyNCkgJiAweEZGKQorI2RlZmluZSBTV0lUQ0hfQUREUl9DT01QTF9TSElGVChhZGRyKQkoKChhZGRyID4+IDI0KSAmIDB4MykgPDwgMykKKyNkZWZpbmUgU1dJVENIX0JVU19BRERSKGFkZHIpCQkJKCh+U1dJVENIX1JFR1NfQkFTRV9BRERSX01BU0sgJiBhZGRyKSB8XAorCQkJCQkJCShTV0lUQ0hfV0lOX0JBU0VfQUREUl9HRVQoKSAmIFNXSVRDSF9SRUdTX0JBU0VfQUREUl9NQVNLKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU1dJVENIX1dJTl9CQVNFX0FERFJfR0VUCisqCisqIERFU0NSSVBUSU9OOgorKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiBzd2l0Y2ggcmVnaXN0ZXJzIHdpbmRvdworKgorKgorKiBSRVRVUk46CisqCWJhc2UgYWRkcmVzcyBvZiBzd2l0Y2ggcmVnaXN0ZXJzIHdpbmRvdworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSBNVl9VMzIgU1dJVENIX1dJTl9CQVNFX0FERFJfR0VUKE1WX1ZPSUQpCit7CisJc3RhdGljIE1WX1UzMgliYXNlQWRkcjsKKwliYXNlQWRkciA9IE1WX1JFR19SRUFEKEFIQl9UT19NQlVTX1dJTl9CQVNFX1JFRyhTV0lUQ0hfV0lOX0lEKSk7CisJcmV0dXJuIGJhc2VBZGRyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBTV0lUQ0hfQUREUl9DT01QTF9TRVQKKyoKKyogREVTQ1JJUFRJT046CisqIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyBhZGRyZXNzIGNvbXBsZXRpb24gcmVnaXN0ZXIKKyoKKyogSU5QVVQ6CisqCWFkZHIJLSB0aGUgYWRkcmVzcyB0byBhY2Nlc3MgaW5kaXJlY3RseQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBfX2lubGluZSBNVl9TVEFUVVMgU1dJVENIX0FERFJfQ09NUExfU0VUKE1WX1UzMiBhZGRyKQoreworCU1WX1UzMglyVmFsOworCS8qIENvbmZpZ3VyZSBhZGRyZXNzIGNvbXBsZXRpb24gcmVnaW9uIFJFRyB1c2luZyBTRVJERVMgbWVtb3J5IHdpbmRvdyAqLworCXJWYWwgID0gTVZfTUVNSU8zMl9SRUFEKFNXSVRDSF9XSU5fQkFTRV9BRERSX0dFVCgpKTsKKwlyVmFsICY9IH4oMHhGRiA8PCBTV0lUQ0hfQUREUl9DT01QTF9TSElGVChhZGRyKSk7CisJclZhbCB8PSBTV0lUQ0hfQUREUl9DT01QTF9NU0JfVkFMKGFkZHIpIDw8IFNXSVRDSF9BRERSX0NPTVBMX1NISUZUKGFkZHIpOworCU1WX01FTUlPMzJfV1JJVEUoU1dJVENIX1dJTl9CQVNFX0FERFJfR0VUKCksIHJWYWwpOworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZTd2l0Y2hSZWdpc3RlckdldAorKgorKiBERVNDUklQVElPTjoKKyogVGhpcyBmdW5jdGlvbiByZWFkcyBzd2l0Y2ggcmVnaXN0ZXIgd2l0aCBhZGRyZXNzIGNvbXBsZXRpb24KKyoKKyogSU5QVVQ6CisqCWFkZHJlc3MJCS0gdGhlIGFkZHJlc3MgdG8gcmVhZCBpbmRpcmVjdGx5CisqCW1hc2sJCS0gbWFzayBvZiB0aGUgcmVhZCBkYXRhCisqCisqIE9VVFBVVDoKKyoJZGF0YQkJLSB0aGUgcmVnaXN0ZXIncyBkYXRhIHZhbHVlCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdlN3aXRjaFJlZ2lzdGVyR2V0KE1WX1UzMiBhZGRyZXNzLCBNVl9VMzIgKmRhdGEsIE1WX1UzMiBtYXNrKQoreworCVNXSVRDSF9BRERSX0NPTVBMX1NFVChhZGRyZXNzKTsgLyogT25seSBNU0IgaXMgaW1wb3J0YW50LCBzZXJkZXMgbnVtYmVyIG9mZnNldCBkb2VzIG5vdCBtYXR0ZXIgKi8KKwkqZGF0YSAgPSBNVl9NRU1JTzMyX1JFQUQoU1dJVENIX0JVU19BRERSKGFkZHJlc3MpKSAmIG1hc2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHN3aXRjaFJlZ1JlYWQKKyoKKyogREVTQ1JJUFRJT046CisqIFRoaXMgY29tbWFuZCByZWFkcyBzd2l0Y2ggcmVnaXN0ZXIgd2l0aCBhZGRyZXNzIGNvbXBsZXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgc3dpdGNoX3JlYWRfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwlNVl9VMzIgcmVnVmFsOworCisJbXZTd2l0Y2hSZWdpc3RlckdldChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNiksICZyZWdWYWwsIDB4RkZGRik7CisJcHJpbnRmICgiMHgleFxuIiwgcmVnVmFsKTsKKworCXJldHVybiAxOworfQorVV9CT09UX0NNRCgKKwlzd2l0Y2hSZWdSZWFkLCAgICAgIDIsICAgICAyLCAgICAgIHN3aXRjaF9yZWFkX2NtZCwKKyJzd2l0Y2hSZWdSZWFkCS0gUmVhZCBzd2l0Y2ggcmVnaXN0ZXIsIHVzaW5nIEFkZHJlc3MgY29tcGxldGlvblxuIiwKKyIgUmVnX29mZnNldC4gXG4iCisiXHRSZWFkIHRoZSBzd2l0Y2ggcmVnaXN0ZXIsIHVzaW5nIEFkZHJlc3MgY29tcGxldGlvbi4gXG4iCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN3aXRjaFJlZ2lzdGVyU2V0CisqCisqIERFU0NSSVBUSU9OOgorKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0byBzd2l0Y2ggcmVnaXN0ZXIgd2l0aCBhZGRyZXNzIGNvbXBsZXRpb24KKyoKKyoJYWRkcmVzcwkJLSB0aGUgYWRkcmVzcyB0byB3cml0ZSB0byBpbmRpcmVjdGx5CisqCWRhdGEJCS0gdGhlIGRhdGEgdG8gd3JpdGUKKyoJbWFzawkJLSBtYXNrIG9mIHRoZSB3cml0ZSBkYXRhCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdlN3aXRjaFJlZ2lzdGVyU2V0KE1WX1UzMiBhZGRyZXNzLCBNVl9VMzIgZGF0YSwgTVZfVTMyIG1hc2spCit7CisJTVZfVTMyIHJlZ0RhdGE7CisKKwlpZiAoKG1hc2sgJiAweEZGRkYpICE9IDB4RkZGRikgeyAvKiBzaW5jZSBzd2l0Y2ggcmVnaXN0ZXJzIGFyZSAxNiBiaXRzIC0gY2hlY2sgb25seSB0aGUgcmVsZXZhbnQgYml0cyAqLworCQltdlN3aXRjaFJlZ2lzdGVyR2V0KGFkZHJlc3MsICZyZWdEYXRhLCB+bWFzayk7CisJCXJlZ0RhdGEgfD0gKGRhdGEgJiBtYXNrKTsKKwl9IGVsc2UKKwkJcmVnRGF0YSA9IGRhdGE7CisKKwlTV0lUQ0hfQUREUl9DT01QTF9TRVQoYWRkcmVzcyk7IC8qIE9ubHkgTVNCIGlzIGltcG9ydGFudCwgc2VyZGVzIG51bWJlciBvZmZzZXQgZG9lcyBub3QgbWF0dGVyICovCisKKwlNVl9NRU1JTzMyX1dSSVRFKFNXSVRDSF9CVVNfQUREUihhZGRyZXNzKSwgcmVnRGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHN3aXRjaFJlZ1dyaXRlCisqCisqIERFU0NSSVBUSU9OOgorKiBUaGlzIGNvbW1hbmQgd3JpdGVzIHRvIHN3aXRjaCByZWdpc3RlciB3aXRoIGFkZHJlc3MgY29tcGxldGlvbgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzd2l0Y2hfd3JpdGVfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwltdlN3aXRjaFJlZ2lzdGVyU2V0KHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSwgc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpLCAweEZGRkYpOworCisJcmV0dXJuIDE7Cit9CisKK1VfQk9PVF9DTUQoCisJc3dpdGNoUmVnV3JpdGUsICAgICAgMywgICAgIDMsICAgICAgc3dpdGNoX3dyaXRlX2NtZCwKKyJzd2l0Y2hSZWdXcml0ZQktIFdyaXRlIHRvIHN3aXRjaCByZWdpc3RlciwgdXNpbmcgQWRkcmVzcyBjb21wbGV0aW9uXG4iLAorIiBSZWdfb2Zmc2V0IFJlZ19kYXRhLiBcbiIKKyJcdFdyaXRlIHRvIHRoZSBzd2l0Y2ggcmVnaXN0ZXIsIHVzaW5nIEFkZHJlc3MgY29tcGxldGlvbi4gXG4iCispOworI2VuZGlmIC8qIE1WX1NXSVRDSF9BRERSRVNTX0NPTVBMRVRJT04gKi8KICNlbmRpZiAvKiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpICovCiAKICNkZWZpbmUgUkVHX1NEUkFNX0NPTkZJR19BRERSCQkJCQkweDE0MDAKQEAgLTExMjMsNiArMTI2MCw4IEBACiAjZGVmaW5lIFJFR19SRUFEX0RBVEFfU0FNUExFX0RFTEFZU19BRERSCQkweDE1MzgKICNkZWZpbmUgUkVHX1JFQURfREFUQV9SRUFEWV9ERUxBWVNfQUREUgkJCTB4MTUzQwogI2RlZmluZSBSRUdfUEhZX1JFR0lTVFJZX0ZJTEVfQUNDRVNTX0FERFIJCTB4MTZBMAorI2RlZmluZSBSRUdfUEhZX0RBVEEJCTAKKyNkZWZpbmUgUkVHX1BIWV9DVFJMCQkxCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ2F0ZWdvcnkgICAgIC0gRERSMyBUcmFpbmluZwpAQCAtMTEzMCwxMyArMTI2OSwxMyBAQAogKiBOZWVkIG1vZGlmaWNhdGlvbnMgKFllcy9ObykgLSBubwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgTVZfRERSX1RSQUlOSU5HX0NNRF9ORVdfVElQCi11bnNpZ25lZCBpbnQgdHJhaW5pbmdSZWFkUGh5UmVnKGludCB1aVJlZ0FkZHIsIGludCB1aVB1cCkKK3Vuc2lnbmVkIGludCB0cmFpbmluZ1JlYWRQaHlSZWcoaW50IHVpUmVnQWRkciwgaW50IHVpUHVwLCBpbnQgdHlwZSkKIHsKIAl1bnNpZ25lZCBpbnQgdWlSZWc7CiAgICAgdW5zaWduZWQgaW50IGFkZHJMb3cgPSAweDNGICYgdWlSZWdBZGRyOwogICAgIHVuc2lnbmVkIGludCBhZGRySGkgPSAoKDB4QzAgJiB1aVJlZ0FkZHIpID4+IDYpOwogCi0JdWlSZWcgPSAoMSA8PCAzMSkgKyAodWlQdXAgPDwgMjIpICsgKGFkZHJIaSA8PCAyOCkgKyAoYWRkckxvdyA8PCAxNik7CisJdWlSZWcgPSAoMSA8PCAzMSkgKyAodWlQdXAgPDwgMjIpICsgKHR5cGUgPDwgMjYpICsgKGFkZHJIaSA8PCAyOCkgKyAoYWRkckxvdyA8PCAxNik7CiAJTVZfUkVHX1dSSVRFKFJFR19QSFlfUkVHSVNUUllfRklMRV9BQ0NFU1NfQUREUix1aVJlZyYweDdGRkZGRkZGKTsKIAlNVl9SRUdfV1JJVEUoUkVHX1BIWV9SRUdJU1RSWV9GSUxFX0FDQ0VTU19BRERSLHVpUmVnKTsKIApAQCAtMTE2Niw3ICsxMzA1LDcgQEAKIAkJCXByaW50ZigiQ1M6ICVkIFxuIiwgdWlDcyk7CiAJCQlmb3IodWlQdXAgPSAwOyB1aVB1cCA8IHVpUHVwTnVtOyB1aVB1cCsrKSB7CiAKLQkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygwICsgdWlDcyo0LHVpUHVwKTsKKwkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygwICsgdWlDcyo0LHVpUHVwLCBSRUdfUEhZX0RBVEEpOwogCQkJCXVpUGhhc2UgPSAodWlSZWcgPj4gNikgJiAweDc7CiAJCQkJdWlEZWxheSA9IHVpUmVnICYgMHgxRjsKIAkJCQlwcmludGYoIldyaXRlIExldmVsaW5nOiBQVVA6ICVkLCBQaGFzZTogJWQsIERlbGF5OiAlZFxuIix1aVB1cCx1aVBoYXNlLHVpRGVsYXkpOwpAQCAtMTE3NCw3ICsxMzEzLDcgQEAKIAogCQkJZm9yICh1aVB1cCA9IDA7IHVpUHVwIDwgdWlQdXBOdW07IHVpUHVwKyspIHsKIAotCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDIgKyB1aUNzKjQsdWlQdXApOworCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDIgKyB1aUNzKjQsdWlQdXAsIFJFR19QSFlfREFUQSk7CiAJCQkJdWlQaGFzZSA9ICh1aVJlZyA+PiA2KSAmIDB4NzsKIAkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOwogCQkJCXByaW50ZigiUmVhZCBMZXZlbGluZzogUFVQOiAlZCwgUGhhc2U6ICVkLCBEZWxheTogJWRcbiIsdWlQdXAsIHVpUGhhc2UsIHVpRGVsYXkpOwpAQCAtMTE5Miw3ICsxMzMxLDcgQEAKIAkJCQkJCWlmICh1aURxID09IDkpCiAJCQkJCQkJdWlEcSsrOwogCi0JCQkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygweDEwK3VpRHErdWlDcyoweDEyLHVpUHVwKTsKKwkJCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4MTArdWlEcSt1aUNzKjB4MTIsdWlQdXAsIFJFR19QSFlfREFUQSk7CiAJCQkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOwogCiAJCQkJCQlpZiAodWlEcSA9PSAwKQpAQCAtMTIwMyw3ICsxMzQyLDcgQEAKIAkJCQl9CiAJCQkJZm9yKHVpUHVwPTA7IHVpUHVwIDwgdWlQdXBOdW07IHVpUHVwKyspIHsKIAkJCQkJZm9yKHVpRHEgPSAwOyB1aURxIDwgOTsgdWlEcSsrKSB7Ci0JCQkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygweDUwK3VpRHErdWlDcyoweDEyLHVpUHVwKTsKKwkJCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4NTArdWlEcSt1aUNzKjB4MTIsdWlQdXAsIFJFR19QSFlfREFUQSk7CiAJCQkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOwogCiAJCQkJCQlpZiAodWlEcSA9PSAwKQpAQCAtMTIxNyw3ICsxMzU2LDcgQEAKIAkJCS8qUmVhZCBDZW50cmFsaXphdGlvbiB3aW5kb3dzIHNpemVzIGZvciBTY3JhdGNoIFBIWSByZWdpc3RlcnMqLwogCQkJZm9yKHVpUHVwID0gMDsgdWlQdXAgPCB1aVB1cE51bTsgdWlQdXArKykKIAkJCXsKLQkJCQl1aVJlZyA9IHRyYWluaW5nUmVhZFBoeVJlZygweEMwK3VpQ3MsdWlQdXApOworCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4QzArdWlDcyx1aVB1cCwgUkVHX1BIWV9EQVRBKTsKIAkJCQl1aUNlbnRyYWxSeFJlcyA9IHVpUmVnID4+IDU7CiAJCQkJdWlDZW50cmFsVHhSZXMgPSB1aVJlZyAmIDB4MUY7CiAJCQkJcHJpbnRmKCJDZW50cmFsIHdpbmRvdyBzaXplIGZvciBQVVAgJWQgaXMgJWQoUlgpIGFuZCAlZChUWClcbiIsIHVpUHVwLCB1aUNlbnRyYWxSeFJlcywgdWlDZW50cmFsVHhSZXMpOwpAQCAtMTM3OCwxMSArMTUxNywzMSBAQAogKiBGdW5jdGlvbmFsaXR5LSBUaGUgY29tbWFuZHMgcHJpbnRzIHRoZSByb3cgZGF0YSBvZiBzdGFiaWxpdHkgcmVzdWx0cyBmb3IgRERSMyBUcmFpbmluZwogKiBOZWVkIG1vZGlmaWNhdGlvbnMgKFllcy9ObykgLSBubwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMzIgZG1pblBoeVJlZ1RhYmxlWzIwXVsyXSA9IHsKKwkJCQkJezAJLDB4QzB9LAorCQkJCQl7MAksMHhDMX0sCisJCQkJCXswCSwweEMyfSwKKwkJCQkJezAJLDB4QzN9LAorCQkJCQl7MAksMHhDNH0sCisJCQkJCXsxCSwweEMwfSwKKwkJCQkJezEJLDB4QzF9LAorCQkJCQl7MQksMHhDMn0sCisJCQkJCXsxCSwweEMzfSwKKwkJCQkJezEJLDB4QzR9LAorCQkJCQl7MgksMHhDMH0sCisJCQkJCXsyCSwweEMxfSwKKwkJCQkJezIJLDB4QzJ9LAorCQkJCQl7MgksMHhDM30sCisJCQkJCXsyCSwweEM0fSwKKwkJCQkJezAJLDB4QzV9LAorCQkJCQl7MQksMHhDNX0sCisJCQkJCXsyCSwweEM1fSwKKwkJCQkJezAJLDB4QzZ9LAorCQkJCQl7MQksMHhDNn19OwogaW50IHRyYWluaW5nU3RhYmlsaXR5X2NtZCggY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdICkKIHsKLQlNVl9VMzIgdWlDc0VuYSwgaW50ZXJmYWNlSWQ9MCxjc2luZGV4ID0gMCxidXNJZD0wLHBhZEluZGV4PTA7Ci0JTVZfVTMyIHJlZ0RhdGE7Ci0JTVZfVTMyIHJlYWREYXRhOworCU1WX1UzMiB1aUNzRW5hLCBpbnRlcmZhY2VJZD0wLCBjc2luZGV4ID0gMCxidXNJZD0wLCBwYWRJbmRleD0wOworCU1WX1UzMiByZWdEYXRhLCByZWdEYXRhMTsKIAogCXVpQ3NFbmEgPSBNVl9SRUdfUkVBRChSRUdfRERSM19SQU5LX0NUUkxfQUREUikgJiAweEY7CiAKQEAgLTE0MjUsMTIgKzE1ODQsMTIgQEAKIAlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IDE7IGludGVyZmFjZUlkKyspCiAJewogCQlwcmludGYoIkRhdGE6ICVkLCVkLCIsaW50ZXJmYWNlSWQsbXZDdHJsR2V0SnVuY1RlbXAoKSk7Ly9hZGQgSnVuY3Rpb24gVGVtcGVyYXR1cmUKLQkJcmVhZERhdGEgPSBNVl9SRUdfUkVBRCgweDE0QzgpOwotCQlwcmludGYoIiVkLCVkLCIsKChyZWFkRGF0YSYweDNGMCk+PjQpLCgocmVhZERhdGEmMHhGQzAwKT4+MTApKTsKLQkJcmVhZERhdGEgPSBNVl9SRUdfUkVBRCgweDE3QzgpOwotCQlwcmludGYoIiVkLCVkLCIsKChyZWFkRGF0YSYweDNGMCk+PjQpLCgocmVhZERhdGEmMHhGQzAwKT4+MTApKTsKLQkJcmVhZERhdGEgPSBNVl9SRUdfUkVBRCgweDFEQzgpOwotCQlwcmludGYoIiVkLCVkLCIsKChyZWFkRGF0YSYweDNGMDAwMCk+PjE2KSwoKHJlYWREYXRhJjB4RkMwMDAwMCk+PjIyKSk7CisJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRCgweDE0QzgpOworCQlwcmludGYoIiVkLCVkLCIsKChyZWdEYXRhJjB4M0YwKT4+NCksKChyZWdEYXRhJjB4RkMwMCk+PjEwKSk7CisJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRCgweDE3QzgpOworCQlwcmludGYoIiVkLCVkLCIsKChyZWdEYXRhJjB4M0YwKT4+NCksKChyZWdEYXRhJjB4RkMwMCk+PjEwKSk7CisJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRCgweDFEQzgpOworCQlwcmludGYoIiVkLCVkLCIsKChyZWdEYXRhJjB4M0YwMDAwKT4+MTYpLCgocmVnRGF0YSYweEZDMDAwMDApPj4yMikpOwogCQlmb3IoY3NpbmRleCA9IDA7IGNzaW5kZXggPCA0OyBjc2luZGV4KyspCiAJCXsKIAkJCWlmICghKHVpQ3NFbmEgJiAoMSA8PCBjc2luZGV4KSkpIGNvbnRpbnVlOwpAQCAtMTQzOCw0OCArMTU5Nyw1MiBAQAogCQkJZm9yKGJ1c0lkID0gMDsgYnVzSWQgPDU7IGJ1c0lkKyspCiAJCQl7CiAJCQkJI2lmZGVmIENPTkZJR19ERFIzLypERFIzKi8KLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCxidXNJZCk7CisJCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZyhSRVNVTFRfREJfUEhZX1JFR19BRERSK2NzaW5kZXgsYnVzSWQsIFJFR19QSFlfREFUQSk7CiAJCQkJcHJpbnRmKCIlZCwlZCwiLChyZWdEYXRhJjB4MUYpLCgocmVnRGF0YSYweDNFMCk+PjUpKTsKIAkJCQkjZWxzZS8qRERSNCovCi0JCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZyhSRVNVTFRfREJfUEhZX1JFR19BRERSK2NzaW5kZXgsYnVzSWQpOwotCQkJCXByaW50ZigiJWQsJWQsIiwocmVnRGF0YSYweDFGKSo0LDIqKChyZWdEYXRhJjB4RkZFMCk+PjUpKTsKLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCArIDQsYnVzSWQpOwotCQkJCXByaW50ZigiJWQsJWQsIiwocmVnRGF0YSYweDFGKSo0LDIqKChyZWdEYXRhJjB4RkZFMCk+PjUpKTsKKwkJCQkvKkRtaW5UeCwgYXJlYVRYKi8KKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKKwkJCQlyZWdEYXRhMSA9IHRyYWluaW5nUmVhZFBoeVJlZyhkbWluUGh5UmVnVGFibGVbY3NpbmRleCo1K2J1c0lkXVsxXSxkbWluUGh5UmVnVGFibGVbY3NpbmRleCo1K2J1c0lkXVswXSwgUkVHX1BIWV9DVFJMKTsKKwkJCQlwcmludGYoIiVkLCVkLCIsMioocmVnRGF0YTEmMHhGRikscmVnRGF0YSk7CisJCQkJLypEbWluUngsIGFyZWFSWCovCisJCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZyhSRVNVTFRfREJfUEhZX1JFR19BRERSK2NzaW5kZXgrNCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKKwkJCQlyZWdEYXRhMSA9IHRyYWluaW5nUmVhZFBoeVJlZyhkbWluUGh5UmVnVGFibGVbY3NpbmRleCo1K2J1c0lkXVsxXSxkbWluUGh5UmVnVGFibGVbY3NpbmRleCo1K2J1c0lkXVswXSwgUkVHX1BIWV9DVFJMKTsKKwkJCQlwcmludGYoIiVkLCVkLCIsMioocmVnRGF0YTE+PjgpLHJlZ0RhdGEpOwogCQkJCSNlbmRpZgogCQkJCS8qV0wqLwotCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoV0xfUEhZX1JFRytjc2luZGV4KjQsYnVzSWQpOworCQkJCXJlZ0RhdGEgPSB0cmFpbmluZ1JlYWRQaHlSZWcoV0xfUEhZX1JFRytjc2luZGV4KjQsYnVzSWQsIFJFR19QSFlfREFUQSk7CiAJCQkJcHJpbnRmKCIlZCwlZCwlZCwiLChyZWdEYXRhJjB4MUYpKygocmVnRGF0YSYweDFDMCk+PjYpKjMyLChyZWdEYXRhJjB4MUYpLChyZWdEYXRhJjB4MUMwKT4+Nik7CiAJCQkJLypSTCovCi0JCQkJcmVhZERhdGEgPSBNVl9SRUdfUkVBRChSRUdfUkVBRF9EQVRBX1NBTVBMRV9ERUxBWVNfQUREUik7Ci0JCQkJcmVhZERhdGEgPSAocmVhZERhdGEmKDB4Rjw8KDQqY3NpbmRleCkpKSA+PiAoNCpjc2luZGV4KTsKLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJMX1BIWV9SRUcrY3NpbmRleCo0LGJ1c0lkKTsKLQkJCQlwcmludGYoIiVkLCVkLCVkLCVkLCIsKHJlZ0RhdGEmMHgxRikrKChyZWdEYXRhJjB4MUMwKT4+NikqMzIgKyByZWFkRGF0YSo2NCwocmVnRGF0YSYweDFGKSwoKHJlZ0RhdGEmMHgxQzApPj42KSxyZWFkRGF0YSk7CisJCQkJcmVnRGF0YTEgPSBNVl9SRUdfUkVBRChSRUdfUkVBRF9EQVRBX1NBTVBMRV9ERUxBWVNfQUREUik7CisJCQkJcmVnRGF0YTEgPSAocmVnRGF0YTEmKDB4Rjw8KDQqY3NpbmRleCkpKSA+PiAoNCpjc2luZGV4KTsKKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJMX1BIWV9SRUcrY3NpbmRleCo0LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOworCQkJCXByaW50ZigiJWQsJWQsJWQsJWQsIiwocmVnRGF0YSYweDFGKSsoKHJlZ0RhdGEmMHgxQzApPj42KSozMiArIHJlZ0RhdGExKjY0LChyZWdEYXRhJjB4MUYpLCgocmVnRGF0YSYweDFDMCk+PjYpLHJlZ0RhdGExKTsKIAkJCQkvKkNlbnRyYWxpemF0aW9uKi8KLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcrY3NpbmRleCo0LGJ1c0lkKTsKKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcrY3NpbmRleCo0LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOwogCQkJCXByaW50ZigiJWQsIiwocmVnRGF0YSYweDNGKSk7Ci0JCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZyhSRUFEX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcrY3NpbmRleCo0LGJ1c0lkKTsKKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRytjc2luZGV4KjQsYnVzSWQsIFJFR19QSFlfREFUQSk7CiAJCQkJcHJpbnRmKCIlZCwiLChyZWdEYXRhJjB4MUYpKTsKIAkJCQkvKlZyZWYgKi8KLQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFBBRF9DT05GSUdfUEhZX1JFRytjc2luZGV4LGJ1c0lkKTsKKwkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKFBBRF9DT05GSUdfUEhZX1JFRytjc2luZGV4LGJ1c0lkLCBSRUdfUEhZX0RBVEEpOwogCQkJCXByaW50ZigiJWQsIiwocmVnRGF0YSYweDcpKTsKIAkJCQkvKkRRVnJlZiovCiAJCQkJLyogTmVlZCB0byBhZGQgdGhlIFJlYWQgRnVuY3Rpb24gZnJvbSBkZXZpY2UqLwogCQkJCXByaW50ZigiJWQsIiwwKTsKIAkJCQkjaWZuZGVmIENPTkZJR19ERFIzCi0JCQkJZm9yKHBhZEluZGV4ID0gMDsgcGFkSW5kZXggPCAxMDsgcGFkSW5kZXgrKykKKwkJCQlmb3IocGFkSW5kZXggPSAwOyBwYWRJbmRleCA8IDExOyBwYWRJbmRleCsrKQogCQkJCXsKLQkJCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZygweEQwKzEyKmNzaW5kZXgrcGFkSW5kZXgsYnVzSWQpOworCQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4RDArMTIqY3NpbmRleCtwYWRJbmRleCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKIAkJCQkJcHJpbnRmKCIlZCwiLChyZWdEYXRhJjB4M0YpKTsKIAkJCQl9CiAJCQkJI2VuZGlmCi0JCQkJZm9yKHBhZEluZGV4ID0gMDsgcGFkSW5kZXggPCAxMDsgcGFkSW5kZXgrKykKKwkJCQlmb3IocGFkSW5kZXggPSAwOyBwYWRJbmRleCA8IDExOyBwYWRJbmRleCsrKQogCQkJCXsKLQkJCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZygweDEwKzE2KmNzaW5kZXgrcGFkSW5kZXgsYnVzSWQpOworCQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4MTArMTYqY3NpbmRleCtwYWRJbmRleCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKIAkJCQkJcHJpbnRmKCIlZCwiLChyZWdEYXRhJjB4M0YpKTsKIAkJCQl9Ci0JCQkJZm9yKHBhZEluZGV4ID0gMDsgcGFkSW5kZXggPCAxMDsgcGFkSW5kZXgrKykKKwkJCQlmb3IocGFkSW5kZXggPSAwOyBwYWRJbmRleCA8IDExOyBwYWRJbmRleCsrKQogCQkJCXsKLQkJCQkJcmVnRGF0YSA9IHRyYWluaW5nUmVhZFBoeVJlZygweDUwKzE2KmNzaW5kZXgrcGFkSW5kZXgsYnVzSWQpOworCQkJCQlyZWdEYXRhID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4NTArMTYqY3NpbmRleCtwYWRJbmRleCxidXNJZCwgUkVHX1BIWV9EQVRBKTsKIAkJCQkJcHJpbnRmKCIlZCwiLChyZWdEYXRhJjB4M0YpKTsKIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9sZWdhY3kuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX2xlZ2FjeS5jCmluZGV4IDM4MjdiMTIuLjA0MDFhMTkgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX2xlZ2FjeS5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX2xlZ2FjeS5jCkBAIC0xNTMsNiArMTUzLDcgQEAKIAlkZXYtPmhhbHQgPSAodm9pZCopbXZFZ2lnYUhhbHQ7CiAJZGV2LT5zZW5kID0gKHZvaWQqKW12RWdpZ2FUeDsKIAlkZXYtPnJlY3YgPSAodm9pZCopbXZFZ2lnYVJ4OworCWRldi0+aW5kZXggPSBwb3J0OwogCWRldi0+cHJpdiA9IHByaXY7CiAJZGV2LT5pb2Jhc2UgPSAwOwogCWRldi0+cG9ydCA9IHBvcnQ7CkBAIC01MTgsNCArNTE5LDQgQEAKIH0KIAogI2VuZGlmICAvKiBsZWdhY3kgKi8KLSNlbmRpZiAgLyogI2lmIGRlZmluZWQgKE1WX0lOQ0xVREVfR0lHX0VUSCkgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYgIC8qICNpZiBkZWZpbmVkIChNVl9JTkNMVURFX0dJR19FVEgpICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9uZXRhLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9lZ2lnYV9uZXRhLmMKaW5kZXggNTUyMTVlNS4uMmVhNTAzZCAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfbmV0YS5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX25ldGEuYwpAQCAtMTYyLDYgKzE2Miw3IEBACiAJZGV2LT5wcml2ID0gcHJpdjsKIAlkZXYtPmlvYmFzZSA9IDA7CiAJZGV2LT53cml0ZV9od2FkZHIgPSAwOworCWRldi0+aW5kZXggPSBwb3J0OwogCXByaXYtPnBvcnQgPSBwb3J0OwogCXByaXYtPmRldkluaXQgPSBNVl9GQUxTRTsKIAlwcml2LT5kZXZFbmFibGUgPSBNVl9GQUxTRTsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2VnaWdhX3BwMi5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfcHAyLmMKaW5kZXggYTc0MTkzMC4uMGE5ZjkwMyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfcHAyLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZWdpZ2FfcHAyLmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCWVnaWdhUHJpdiAqcHJpdiA9IE5VTEw7CiAKIAkvKiBGaXJzdCBkaXNhYmxlIEdNQUMgKi8KLQltdkdtYWNQb3J0RGlzYWJsZShwcml2LT5wb3J0KTsKKwltdkdtYWNQb3J0RGlzYWJsZShwb3J0KTsKIAogCWRldiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGV0aF9kZXZpY2UpKTsKIAlpZiAoIWRldikgewpAQCAtMjU5LDYgKzI1OSw3IEBACiAJZGV2LT5wcml2ID0gcHJpdjsKIAlkZXYtPmlvYmFzZSA9IDA7CiAJZGV2LT53cml0ZV9od2FkZHIgPSAwOworCWRldi0+aW5kZXggPSBwb3J0OwogCXByaXYtPnBvcnQgPSBwb3J0OwogCXByaXYtPmRldkluaXQgPSBNVl9GQUxTRTsKIAlwcml2LT5kZXZFbmFibGUgPSBNVl9GQUxTRTsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X2ZkdC5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZmR0LmMKaW5kZXggN2JkMDM1MS4uYWQ1NzE0MyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZmR0LmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfZmR0LmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlICJsaWJmZHQuaCIKICNpbmNsdWRlICJmZHRfc3VwcG9ydC5oIgogI2luY2x1ZGUgIm12Qm9hcmRFbnZMaWIuaCIKKyNpbmNsdWRlICJldGhTd2l0Y2gvbXZTd2l0Y2hSZWdzLmgiCisjaW5jbHVkZSAiZXRoU3dpdGNoL212U3dpdGNoLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGZkdF9lbnZfc2V0dXAKQEAgLTgzLDYgKzg1LDEyIEBACiAJaWYgKCFlbnYpCiAJCXNldGVudigiYm9vdGNtZF9mZHQiLGJvb3RjbWRfZmR0KTsKIAorI2lmIGRlZmluZWQgKENPTkZJR19PRl9MSUJGRFRfSVNfREVGQVVMVCkKKwllbnYgPSBnZXRlbnYoImJvb3RjbWQiKTsKKwlpZiAoIWVudikKKwkJc2V0ZW52KCJib290Y21kIiwgYm9vdGNtZF9mZHQpOworI2VuZGlmIC8qIChDT05GSUdfT0ZfTElCRkRUX0lTX0RFRkFVTFQpICovCisKICNpZmRlZiBDT05GSUdfR0ZDSDEwMAogCWVudiA9IGdldGVudigiZmR0Y29udGludWVvbmVycm9yIik7CiAJaWYgKCFlbnYpCkBAIC0xMDMsMTEgKzExMSwxOSBAQAogc3RhdGljIGludCBtdl9mZHRfZmluZF9ub2RlKHZvaWQgKmZkdCwgY29uc3QgY2hhciAqbmFtZSk7CiBzdGF0aWMgaW50IG12X2ZkdF9ib2FyZF9jb21wYXRpYmxlX25hbWVfdXBkYXRlKHZvaWQgKmZkdCk7CiBzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfc2VyaWFsKHZvaWQgKmZkdCk7CisjaWZkZWYgQ09ORklHX1BJQ19HUElPCiBzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfcGljX2dwaW8odm9pZCAqZmR0KTsKKyNlbmRpZgogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX2NwdXModm9pZCAqZmR0KTsKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9wZXgodm9pZCAqZmR0KTsKKyNpZmRlZiBNVl9JTkNMVURFX1NBVEEKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9zYXRhKHZvaWQgKmZkdCk7CisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1VTQgogc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3VzYih2b2lkICpmZHQsIE1WX1VOSVRfSUQgdW5pdFR5cGUpOworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3VzYjIodm9pZCAqZmR0KTsKK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV91c2IzKHZvaWQgKmZkdCk7CisjZW5kaWYKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9ldGhudW0odm9pZCAqZmR0KTsKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9mbGFzaCh2b2lkICpmZHQpOwogc3RhdGljIGludCBtdl9mZHRfc2V0X25vZGVfcHJvcCh2b2lkICpmZHQsIGNvbnN0IGNoYXIgKm5vZGUsIGNvbnN0IGNoYXIgKnByb3AsIGNvbnN0IGNoYXIgKnByb3BfdmFsKTsKQEAgLTExNSwxNiArMTMxLDc4IEBACiBzdGF0aWMgaW50IG12X2ZkdF9zY2FuX2FuZF9zZXRfYWxpYXModm9pZCAqZmR0LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphbGlhcyk7CiBzdGF0aWMgaW50IG12X2ZkdF9uYW5kX21vZGVfZml4dXAodm9pZCAqZmR0KTsKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9waW5jdHJsKHZvaWQgKmZkdCk7CisjaWZkZWYgTVZfSU5DTFVERV9BVURJTworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX2F1ZGlvKHZvaWQgKmZkdCk7CisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAorc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3N3aXRjaCh2b2lkICpmZHQpOworI2VuZGlmCiBzdGF0aWMgaW50IG12X2ZkdF9kZWJ1ZzsKICNpZmRlZiBDT05GSUdfTVZfU0RIQ0kKIHN0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9zZGhjaSh2b2lkICpmZHQpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX1NXSVRDSElOR19TRVJWSUNFUworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3ByZXN0ZXJhKHZvaWQgKmZkdCk7CisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1RETQorc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3RkbSh2b2lkICpmZHQpOworI2VuZGlmCisjaWZkZWYgTVZfVVNCX1ZCVVNfQ1lDTEUKK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV91c2JfdmJ1cyh2b2lkICpmZHQpOworI2VuZGlmCisjaWZkZWYgTVZfSU5DTFVERV9VU0JfREVWSUNFCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdXNiX2RldmljZSh2b2lkICpmZHQpOworI2VuZGlmCiAKICNpZiAwIC8qIG5vdCBjb21waWxlZCwgc2luY2UgdGhpcyByb3V0aW5lIGlzIGN1cnJlbnRseSBub3QgaW4gdXNlICAqLwogc3RhdGljIGludCBtdl9mZHRfcmVtb3ZlX3Byb3Aodm9pZCAqZmR0LCBjb25zdCBjaGFyICpwYXRoLAogCQkJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBub2Rlb2ZmKTsKICNlbmRpZgogCit0eXBlZGVmIGludCAodXBkYXRlX2ZuY190KSh2b2lkICopOwordXBkYXRlX2ZuY190ICp1cGRhdGVfc2VxdWVuY2VbXSA9IHsKKwltdl9mZHRfdXBkYXRlX2NwdXMsCQkJLyogR2V0IG51bWJlciBvZiBDUFVzIGFuZCB1cGRhdGUgZHQgKi8KKwltdl9mZHRfdXBkYXRlX3BleCwJCQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBQRVggcG9ydCBhbmQgdXBkYXRlIERUICovCisjaWZkZWYgTVZfSU5DTFVERV9TQVRBCisJbXZfZmR0X3VwZGF0ZV9zYXRhLAkJCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIFNBVEEgdW5pdHMgYW5kIHVwZGF0ZSBEVCAqLworI2VuZGlmCisjaWZkZWYgTVZfSU5DTFVERV9VU0IKKwltdl9mZHRfdXBkYXRlX3VzYjIsCQkJLyogR2V0IG51bWJlciBvZiBhY3RpdmUgVVNCMi4wIHVuaXRzIGFuZCB1cGRhdGUgRFQgKi8KKwltdl9mZHRfdXBkYXRlX3VzYjMsCQkJLyogR2V0IG51bWJlciBvZiBhY3RpdmUgVVNCMy4wIHVuaXRzIGFuZCB1cGRhdGUgRFQgKi8KKyNlbmRpZgorCW12X2ZkdF91cGRhdGVfZXRobnVtLAkJCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIEVUSCBwb3J0IGFuZCB1cGRhdGUgRFQgKi8KKyNpZmRlZiBDT05GSUdfTVZfU0RIQ0kKKwltdl9mZHRfdXBkYXRlX3NkaGNpLAkJCS8qIFVwZGF0ZSBTREhDSSBkcml2ZXIgc2V0dGluZ3MgaW4gRFQgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TV0lUQ0hJTkdfU0VSVklDRVMKKwltdl9mZHRfdXBkYXRlX3ByZXN0ZXJhLAkJCS8qIFVwZGF0ZSBwcmVzdGVyYSBkcml2ZXIgRFQgc2V0dGluZ3MgLSBmb3IgQU1DIGJvYXJkICovCisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1RETQorCW12X2ZkdF91cGRhdGVfdGRtLAkJCS8qIFVwZGF0ZSB0ZG0gbm9kZSBpbiBEVCAqLworI2VuZGlmCisjaWZkZWYgTVZfVVNCX1ZCVVNfQ1lDTEUKKwltdl9mZHRfdXBkYXRlX3VzYl92YnVzLAorI2VuZGlmCisJbXZfZmR0X3VwZGF0ZV9mbGFzaCwJCQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBmbGFzaCBkZXZpY2VzIGFuZCB1cGRhdGUgRFQgKi8KKwltdl9mZHRfbmFuZF9tb2RlX2ZpeHVwLAkJCS8qIFVwZGF0ZSBOQU5EIGNvbnRyb2xsZXIgRUNDIHNldHRpbmdzIGluIERUICovCisJbXZfZmR0X3VwZGF0ZV9waW5jdHJsLAkJCS8qIFVwZGF0ZSBwaW5jdHJsIGRyaXZlciBzZXR0aW5ncyBpbiBEVCAqLworCW12X2ZkdF9ib2FyZF9jb21wYXRpYmxlX25hbWVfdXBkYXRlLAkvKiBVcGRhdGUgY29tcGF0aWJsZSAoYm9hcmQgbmFtZSkgaW4gRFQgKi8KKwltdl9mZHRfdXBkYXRlX3NlcmlhbCwJCQkvKiBVcGRhdGUgc2VyaWFsL1VBUlQgbm9kZXMgaW4gRFQgKi8KKyNpZmRlZiBDT05GSUdfUElDX0dQSU8KKwltdl9mZHRfdXBkYXRlX3BpY19ncGlvLAorI2VuZGlmCisjaWZkZWYgTVZfSU5DTFVERV9BVURJTworCW12X2ZkdF91cGRhdGVfYXVkaW8sCQkJLyogVXBkYXRlIGF1ZGlvLWNvbnRyb2xsZXIrc291bmQgbm9kZXMgaW4gRFQgKi8KKyNlbmRpZgorI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICisJbXZfZmR0X3VwZGF0ZV9zd2l0Y2gsCisjZW5kaWYKKyNpZmRlZiBNVl9JTkNMVURFX1VTQl9ERVZJQ0UKKwltdl9mZHRfdXBkYXRlX3VzYl9kZXZpY2UsCisjZW5kaWYKKwlOVUxMLAorfTsKKwogZW51bSBuZmNfZHJpdmVyX3R5cGUgewogCU1WX0ZEVF9ORkNfUFhBM1hYLAkvKiBtYWlubGluZSBweGEzeHgtbmFuZCAqLwogCU1WX0ZEVF9ORkNfSEFMLAkJLyogbXZlYnUgSEFMLWJhc2VkIE5GQyAqLwpAQCAtMTc1LDYgKzI1Myw3IEBACiB7CiAJaW50IGVycjsJCS8qIGVycm9yIG51bWJlciAqLwogCWNoYXIgKmVudjsJCS8qIGVudiB2YWx1ZSAqLworCXVwZGF0ZV9mbmNfdCAqKnVwZGF0ZV9mbmNfcHRyOwogCWludCBjb3VudGVyID0gMDsJLyogZXJyb3IgY291bnRlciAqLwogCWludCBmb3JjZSA9IDA7CQkvKiBjb250aW51ZSBvbiBlcnJvciBpZiBzZXQgKi8KIApAQCAtMjEwLDc1ICsyODksMTQgQEAKIAlmaXh1cF9tZW1vcnlfbm9kZShibG9iKTsKIAltdl9mZHRfZHByaW50ZigiTWVtb3J5IG5vZGUgdXBkYXRlZFxuIik7CiAKLQkvKiBHZXQgbnVtYmVyIG9mIENQVXMgYW5kIHVwZGF0ZSBkdCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfY3B1cyhibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIGNwdXMgZmFpbGVkXG4iKTsKLQotCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIFBFWCBwb3J0IGFuZCB1cGRhdGUgRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX3BleChibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIHBleCBmYWlsZWRcbiIpOwotCi0JLyogR2V0IG51bWJlciBvZiBhY3RpdmUgU0FUQSB1bml0cyBhbmQgdXBkYXRlIERUICovCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV9zYXRhKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgcGV4IGZhaWxlZFxuIik7Ci0KLQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBVU0IyLjAgdW5pdHMgYW5kIHVwZGF0ZSBEVCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfdXNiKGJsb2IsIFVTQl9VTklUX0lEKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIHVzYiAyLjAgZmFpbGVkXG4iKTsKLQotCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIFVTQjMuMCB1bml0cyBhbmQgdXBkYXRlIERUICovCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV91c2IoYmxvYiwgVVNCM19VTklUX0lEKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIHVzYiAzLjAgZmFpbGVkXG4iKTsKLQotCS8qIEdldCBudW1iZXIgb2YgYWN0aXZlIEVUSCBwb3J0IGFuZCB1cGRhdGUgRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX2V0aG51bShibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIGV0aG51bSBmYWlsZWRcbiIpOwotCi0jaWZkZWYgQ09ORklHX01WX1NESENJCi0JLyogVXBkYXRlIFNESENJIGRyaXZlciBzZXR0aW5ncyBpbiBEVCAqLwotCWVyciA9IG12X2ZkdF91cGRhdGVfc2RoY2koYmxvYik7Ci0JaWYgKGVyciA8IDApCi0JCXJlcG9ydF9lcnJvcigmY291bnRlciwgZm9yY2UsICJVcGRhdGluZyBzZGhjaSBmYWlsZWRcbiIpOwotI2VuZGlmCi0KLQkvKiBHZXQgbnVtYmVyIG9mIGFjdGl2ZSBmbGFzaCBkZXZpY2VzIGFuZCB1cGRhdGUgRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX2ZsYXNoKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgZmxhc2ggZmFpbGVkXG4iKTsKLQotCS8qIFVwZGF0ZSBOQU5EIGNvbnRyb2xsZXIgRUNDIHNldHRpbmdzIGluIERUICovCi0JZXJyID0gbXZfZmR0X25hbmRfbW9kZV9maXh1cChibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIG5hbmQgbW9kZSBmYWlsZWRcbiIpOwotCi0JLyogVXBkYXRlIHBpbmN0cmwgZHJpdmVyIHNldHRpbmdzIGluIERUICovCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV9waW5jdHJsKGJsb2IpOwotCWlmIChlcnIgPCAwKQotCQlyZXBvcnRfZXJyb3IoJmNvdW50ZXIsIGZvcmNlLCAiVXBkYXRpbmcgcGluY3RybCBmYWlsZWRcbiIpOwotCi0JLyogVXBkYXRlIGNvbXBhdGlibGUgKGJvYXJkIG5hbWUpIGluIERUICovCi0JZXJyID0gbXZfZmR0X2JvYXJkX2NvbXBhdGlibGVfbmFtZV91cGRhdGUoYmxvYik7Ci0JaWYgKGVyciA8IDApCi0JCXJlcG9ydF9lcnJvcigmY291bnRlciwgZm9yY2UsICJVcGRhdGluZyBib2FyZCBuYW1lIGZhaWxlZFxuIik7Ci0KLQkvKiBVcGRhdGUgc2VyaWFsL1VBUlQgbm9kZXMgaW4gRFQgKi8KLQllcnIgPSBtdl9mZHRfdXBkYXRlX3NlcmlhbChibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIHNlcmlhbCBmYWlsZWRcbiIpOwotCi0JZXJyID0gbXZfZmR0X3VwZGF0ZV9waWNfZ3BpbyhibG9iKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmVwb3J0X2Vycm9yKCZjb3VudGVyLCBmb3JjZSwgIlVwZGF0aW5nIHBpYyBncGlvIGZhaWxlZFxuIik7Ci0KLQlpZiAoY291bnRlciA+IDApIHsKLQkJbXZfZmR0X2RwcmludGYoIkVuY291bnRlcmVkICVkIGVycm9ycyB3aGlsZSB1cGRhdGluZyBkZXZpY2UgdHJlZVxuIiwgY291bnRlcik7Ci0JCWdvdG8gYnNfZmFpbDsKKwkvKiBNYWtlIHVwZGF0ZXMgb2YgZnVuY3Rpb25zIGluIHVwZGF0ZV9zZXF1ZW5jZSAqLworCWZvciAodXBkYXRlX2ZuY19wdHIgPSB1cGRhdGVfc2VxdWVuY2U7ICp1cGRhdGVfZm5jX3B0cjsgKyt1cGRhdGVfZm5jX3B0cikgeworCQllcnIgPSAoKnVwZGF0ZV9mbmNfcHRyKShibG9iKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXJlcG9ydF9lcnJvcigmY291bnRlciwgZm9yY2UsCisJCQkJIlVwZGF0aW5nIGZ1bmN0aW9uIDB4JTA4eCBmYWlsZWRcbiIsIHVwZGF0ZV9mbmNfcHRyKTsKKwkJCS8qIHJlcG9ydF9lcnJvciB3aWxsICJnb3RvIGJzX2ZhaWwiIG9uICFmb3JjZSAqLworCQl9CiAJfQogCiAJcHJpbnRmKCJVcGRhdGluZyBkZXZpY2UgdHJlZSBzdWNjZXNzZnVsXG4iKTsKQEAgLTM2Myw2ICszODEsOSBAQAogKiBtdl9mZHRfdXBkYXRlX2NwdXMKICoKICogREVTQ1JJUFRJT046CisqIHRhcmdldAkJOiByZW1vdmUgZXhjZXNzaWNlIGNwdSBub2Rlcy4KKyogbm9kZQkJCTogY3B1cworKiBkZXBlbmRlbmNpZXMJCTogQ1BVIGNvcmUgbnVtIGluIFNPQ19DT0hFUkVOQ1lfRkFCUklDX0NGR19SRUcuCiAqCiAqIElOUFVUOgogKglmZHQuCkBAIC00MjQsMTAgKzQ0NSwxNCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgTVZfSU5DTFVERV9TQVRBCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdl9mZHRfdXBkYXRlX3NhdGEKICoKICogREVTQ1JJUFRJT046CisqIHRhcmdldCAgICAgICAgICAgICAgICA6IFVwZGF0ZSBzdGF0dXMgZmllbGQgb2YgU0FUQSBub2Rlcy4KKyogbm9kZSwgcHJvcGVydGllcyAgICAgIDogLXByb3BlcnR5IHN0YXR1cyBAIG5vZGUgU0FUQQorKiBkZXBlbmRlbmNpZXMgICAgICAgICAgOiBzYXRhIHVuaXQgc3RhdHVzIGluIHNhdGFVbml0QWN0aXZlIGFycmF5LgogKgogKiBJTlBVVDoKICoJZmR0LgpAQCAtNDU3LDE4ICs0ODIsMTYwIEBACiAJCXNwcmludGYobm9kZSwgInNhdGFAJXgiLCBtdkN0cmxTYXRhUmVnQmFzZUdldChpKSk7CiAJCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZiAvKiBNVl9JTkNMVURFX1NBVEEgKi8KKworI2lmZGVmIE1WX0lOQ0xVREVfVERNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX3RkbQorKgorKiBERVNDUklQVElPTjoKKyogdGFyZ2V0CQk6IHVwZGF0ZSBzdGF0dXMgZmllbGQgb2YgdGRtQFggbm9kZS4KKyogbm9kZSwgcHJvcGVydGllcwk6IC1wcm9wZXJ0eSBzdGF0dXMgQCBub2RlIHRkbUB4LgorKiBkZXBlbmRlbmNpZXMJCTogaXNUZG1Db25uZWN0ZWQgZW50cnkgaW4gYm9hcmQgc3RydWN0dXJlLgorKgorKiBJTlBVVDoKKyoJZmR0LgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJLTEgb24gZXJyb3Igb3MgMCBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3RkbSh2b2lkICpmZHQpCit7CisJaW50IGVyciwgbm9kZW9mZnNldDsJCQkJLyogbm9kZW9mZnNldDogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwljaGFyIHByb3B2YWxbMTBdOwkJCQkvKiBwcm9wZXJ0eSB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKnByb3AgPSAic3RhdHVzIjsJCQkvKiBwcm9wZXJ0eSBuYW1lICovCisJY2hhciBub2RlWzY0XTsJCQkJCS8qIG5vZGUgbmFtZSAqLworCisJaWYgKG12Qm9hcmRJc1RkbUNvbm5lY3RlZCgpID09IE1WX1RSVUUpCisJCXNwcmludGYocHJvcHZhbCwgIm9rYXkiKTsKKwllbHNlCisJCXNwcmludGYocHJvcHZhbCwgImRpc2FibGVkIik7CisKKwlzcHJpbnRmKG5vZGUsICJ0ZG1AJXgiLCBNVl9URE1fT0ZGU0VUKTsKKwlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIG5vZGUpOworCisJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJuY21wKGZkdF9nZXRfbmFtZShmZHQsIG5vZGVvZmZzZXQsIE5VTEwpLCBub2RlLCBzdHJsZW4obm9kZSkpID09IDApIHsKKwkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLAorCQkJCQkJcHJvcHZhbCwgc3RybGVuKHByb3B2YWwpKzEpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLCBwcm9wLCBub2RlKTsKKwkJCXJldHVybiAwOworCQl9CisJCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnIGluICclcycgbm9kZVxuIiwgcHJvcCwgcHJvcHZhbCwgbm9kZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1WX1VTQl9WQlVTX0NZQ0xFCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX3VzYl92YnVzCisqCisqIERFU0NSSVBUSU9OOgorKiB0YXJnZXQJCTogdXBkYXRlIHN0YXR1cyBmaWVsZCBvZiB1c2IzX3BoeSBhbmQgdXNiMy12YnVzLWdwaW8vdXNiMy12YnVzLWV4cDEgbm9kZS4KKyogbm9kZSwgcHJvcGVydGllcwk6IC1wcm9wZXJ0eSBzdGF0dXMgQCBub2RlIHVzYjNfcGh5IGFuZCB1c2IzLXZidXMtZ3Bpby91c2IzLXZidXMtZXhwMSBub2RlLgorKiBkZXBlbmRlbmNpZXMJCTogQk9BUkRfR1BQX1VTQl9WQlVTIGVudHJ5IGluIEJvYXJkR3BwSW5mbyAtLT4gdXNiMy12YnVzLWdwaW8gbm9kZQorKiAJCQkgIE1WX0lPX0VYUEFOREVSX1VTQl9WQlVTIGVudHJ5IGluIEJvYXJkSW9FeHBQaW5JbmZvIC0tPiB1c2IzLXZidXMtZXhwMQorKgorKiBJTlBVVDoKKyoJZmR0LgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJLTEgb24gZXJyb3Igb3MgMCBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3VzYl92YnVzKHZvaWQgKmZkdCkKK3sKKwlpbnQgZXJyLCBub2Rlb2Zmc2V0OwkJCQkvKiBub2Rlb2Zmc2V0OiBub2RlIG9mZnNldCBmcm9tIGxpYmZkdCAqLworCWNoYXIgcHJvcHZhbFsxMF07CQkJCS8qIHByb3BlcnR5IHZhbHVlICovCisJY29uc3QgY2hhciAqcHJvcCA9ICJzdGF0dXMiOwkJCS8qIHByb3BlcnR5IG5hbWUgKi8KKwljb25zdCBjaGFyICpub2RlID0gTlVMTCwgKnBoeV9ub2RlID0gTlVMTDsJLyogbm9kZSBuYW1lICovCisJTVZfQk9BUkRfSU9fRVhQQU5ERVJfVFlQRV9JTkZPIGlvSW5mbzsJCS8qIGVtcHR5IHN0dWIgLSBub3QgdG8gYmUgdXNlZCAqLworCisJc3ByaW50Zihwcm9wdmFsLCAib2theSIpOworCisJaWYgKG12Qm9hcmRJb0V4cGFuZGVyVHlwZUdldChNVl9JT19FWFBBTkRFUl9VU0JfVkJVUywgJmlvSW5mbykgIT0gTVZfRVJST1IpIHsKKwkJbm9kZSA9ICJ1c2IzLXZidXMtZXhwMSI7CisJCXBoeV9ub2RlID0gInVzYjMtcGh5LWV4cDEiOworCX0gZWxzZSB7CisJCS8qIHJlbW92ZSBpbnZhbGlkIGkyYyBwaW5zIGluZm9ybWF0aW9uLCB0byBhdm9pZCB1bmV4cGVjdGVkIExpbnV4IGJlaGF2aW91ciovCisJCW12X2ZkdF9yZW1vdmVfbm9kZShmZHQsICJpMmMtcGlucy0wIik7CisJfQorCWlmIChtdkJvYXJkVVNCVmJ1c0dwaW9QaW5HZXQoMCkgIT0gTVZfRVJST1IpIHsKKwkJCW5vZGUgPSAidXNiMy12YnVzLWdwaW8iOworCQkJcGh5X25vZGUgPSAidXNiMy1waHktZ3BpbyI7CisJfSBlbHNlIHsKKwkJLyogcmVtb3ZlIGludmFsaWQgdmJ1cyBncGlvIHBpbnMgaW5mb3JtYXRpb24sIHRvIGF2b2lkIHVuZXhwZWN0ZWQgTGludXggYmVoYXZpb3VyKi8KKwkJbXZfZmR0X3JlbW92ZV9ub2RlKGZkdCwgInhoY2kwLXZidXMtcGlucyIpOworCX0KKworCWlmICghbm9kZSAmJiAhcGh5X25vZGUpCisJCXJldHVybiAwOworCisJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBub2RlKTsKKworCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQltdl9mZHRfZHByaW50ZigiTGFjayBvZiAnJXMnIG5vZGUgaW4gZGV2aWNlIHRyZWVcbiIsIG5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cm5jbXAoZmR0X2dldF9uYW1lKGZkdCwgbm9kZW9mZnNldCwgTlVMTCksIG5vZGUsIHN0cmxlbihub2RlKSkgPT0gMCkgeworCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsCisJCQkJCQlwcm9wdmFsLCBzdHJsZW4ocHJvcHZhbCkrMSkpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLCBwcm9wdmFsLCBub2RlKTsKKwl9CisKKwkvKiBlbmFibGUgJ3VzYjNfcGh5JyBub2RlIC0gZm9yIExpbnV4IHJlZ3VsYXRvciB1c2FnZSAqLworCW5vZGVvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgcGh5X25vZGUpOworCisJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgcGh5X25vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RybmNtcChmZHRfZ2V0X25hbWUoZmR0LCBub2Rlb2Zmc2V0LCBOVUxMKSwgcGh5X25vZGUsIHN0cmxlbihwaHlfbm9kZSkpID09IDApIHsKKwkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLAorCQkJCQkJcHJvcHZhbCwgc3RybGVuKHByb3B2YWwpKzEpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLCBwcm9wLCBwaHlfbm9kZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQltdl9mZHRfZHByaW50ZigiU2V0ICclcycgcHJvcGVydHkgdG8gJyVzJyBpbiAnJXMnIG5vZGVcbiIsIHByb3AsIHByb3B2YWwsIHBoeV9ub2RlKTsKKwl9CXJldHVybiAwOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIE1WX1VTQl9WQlVTX0NZQ0xFICovCiAKICNpZmRlZiBDT05GSUdfTVZfU0RIQ0kKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12X2ZkdF91cGRhdGVfc2RoY2kKICoKICogREVTQ1JJUFRJT046CisqIHRhcmdldAkJOiB1cGRhdGUgc3RhdHVzIGFuZCBkYXQzLWNkIGZpZWxkcyBvZiBNTUMgbm9kZS4KKyogbm9kZSwgcHJvcGVydGllcwk6IC1wcm9wZXJ0eSBzdGF0dXMgYW5kIGRhdDMtY2QgQCBub2RlIHNkaGNpQFguCisqIGRlcGVuZGVuY2llcwkJOiBzdGF0dXMgb2YgTU1DIGluIGlzU2RNbWNDb25uZWN0ZWQgZW50cnkgaW4gYm9hcmQgc3RydWN0dXJlLgogKgogKiBJTlBVVDoKICoJZmR0LgpAQCAtNDg2LDYgKzY1Myw3IEBACiAJY2hhciBwcm9wdmFsWzEwXTsJCQkJLyogcHJvcGVydHkgdmFsdWUgKi8KIAljb25zdCBjaGFyICpwcm9wID0gInN0YXR1cyI7CQkJLyogcHJvcGVydHkgbmFtZSAqLwogCWNoYXIgbm9kZVs2NF07CQkJCQkvKiBub2RlIG5hbWUgKi8KKwljaGFyICplbnY7CiAKIAlpZiAobXZCb2FyZGlzU2Rpb0Nvbm5lY3RlZCgpKQogCQlzcHJpbnRmKHByb3B2YWwsICJva2F5Iik7CkBAIC00OTcsNyArNjY1LDcgQEAKIAogCWlmIChub2Rlb2Zmc2V0IDwgMCkgewogCQltdl9mZHRfZHByaW50ZigiTGFjayBvZiAnJXMnIG5vZGUgaW4gZGV2aWNlIHRyZWVcbiIsIG5vZGUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAogCWlmIChzdHJuY21wKGZkdF9nZXRfbmFtZShmZHQsIG5vZGVvZmZzZXQsIE5VTEwpLCBub2RlLCBzdHJsZW4obm9kZSkpID09IDApIHsKQEAgLTUwNSwxMSArNjczLDEyMiBAQAogCQkJCQkJcHJvcHZhbCwgc3RybGVuKHByb3B2YWwpKzEpKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLCBwcm9wLCBub2RlKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAwOwogCQl9CiAJCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnIGluICclcycgbm9kZVxuIiwgcHJvcCwgcHJvcHZhbCwgbm9kZSk7CiAJfQogCisJLyogYWRkIERBVDMgZGV0ZWN0aW9uICovCisJZW52ID0gZ2V0ZW52KCJzZF9kZXRlY3Rpb25fZGF0MyIpOworCisJaWYgKCFlbnYgfHwgc3RyY21wKGVudiwgInllcyIpICE9IDApCisJCXJldHVybiAwOworCisJcHJvcCA9ICJkYXQzLWNkIjsKKworCS8qIGFkZCBlbXB0eSBwcm9wZXJ0eSAnZGF0My1jZCcgKi8KKwlpZiAoZmR0X2FwcGVuZHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCBOVUxMLCAwKSA8IDApCisJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBNVl9JTkNMVURFX0FVRElPCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX2F1ZGlvCisqCisqIERFU0NSSVBUSU9OOiB1cGRhdGUgYXVkaW8tY29udHJvbGxlciBhbmQgc291bmQgbm9kZXMgKFNQRElGL0kyUykKKyoKKyogSU5QVVQ6IGZkdC4KKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IC0xIG9uIGVycm9yIG9zIDAgb3RoZXJ3aXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV9hdWRpbyh2b2lkICpmZHQpCit7CisJaW50IGVyciwgbm9kZW9mZnNldCwgaTsJCQkJLyogbm9kZW9mZnNldDogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwljaGFyIHByb3B2YWxbMTBdOwkJCQkvKiBwcm9wZXJ0eSB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKnByb3AgPSAic3RhdHVzIjsJCQkvKiBwcm9wZXJ0eSBuYW1lICovCisJY2hhciBub2Rlc1syXVs2NF07CQkJCS8qIG5vZGUgbmFtZXMgKi8KKworCWlmIChtdkJvYXJkSXNBdWRpb0Nvbm5lY3RlZCgpID09IE1WX1RSVUUpCisJCXNwcmludGYocHJvcHZhbCwgIm9rYXkiKTsKKwllbHNlCisJCXNwcmludGYocHJvcHZhbCwgImRpc2FibGVkIik7CisKKwlzcHJpbnRmKG5vZGVzWzBdLCAiYXVkaW8tY29udHJvbGxlckAleCIsIE1WX0FVRElPX09GRlNFVCk7CisJc3ByaW50Zihub2Rlc1sxXSwgInNvdW5kIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7CisJCW5vZGVvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgbm9kZXNbaV0pOworCQlpZiAobm9kZW9mZnNldCA8IDApIHsKKwkJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZXNbaV0pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoc3RybmNtcChmZHRfZ2V0X25hbWUoZmR0LCBub2Rlb2Zmc2V0LCBOVUxMKSwgbm9kZXNbaV0sIHN0cmxlbihub2Rlc1tpXSkpID09IDApIHsKKwkJCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwKKwkJCQkJCQlwcm9wdmFsLCBzdHJsZW4ocHJvcHZhbCkrMSkpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgcHJvcCwgbm9kZXNbaV0pOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLCBwcm9wdmFsLCBub2Rlc1tpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NXSVRDSElOR19TRVJWSUNFUworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfZmR0X3VwZGF0ZV9wcmVzdGVyYQorKgorKiBERVNDUklQVElPTjoKKyogdGFyZ2V0CQk6IHVwZGF0ZSBzdGF0dXMgZmllbGQgb2YgcHJlc3RlcmEgbm9kZSBieSBjaGVja2luZyBpZiB0aGUgYm9hcmQgaXMgQU1DLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogLXByb3BlcnR5IHN0YXR1cyBAIG5vZGUgcHJlc3RlcmEuCisqIGRlcGVuZGVuY2llcwkJOiBBTUMgc3RhdHVzIHNhdmVkIGluIGlzQW1jIGVudHJ5IGluIGJvYXJkIHN0cnVjdHVyZQorKgorKiBJTlBVVDoKKyoJZmR0LgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJLTEgb24gZXJyb3Igb3MgMCBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3ByZXN0ZXJhKHZvaWQgKmZkdCkKK3sKKwlpbnQgZXJyLCBub2Rlb2Zmc2V0OwkJCQkJLyogbm9kZW9mZnNldDogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwljaGFyIHByb3B2YWxbMTBdOwkJCQkJLyogcHJvcGVydHkgdmFsdWUgKi8KKwljb25zdCBjaGFyICpwcm9wID0gInN0YXR1cyI7CQkJCS8qIHByb3BlcnR5IG5hbWUgKi8KKwljb25zdCBjaGFyICpub2RlID0gInByZXN0ZXJhIjsJCQkJLyogbm9kZSBuYW1lICovCisJTVZfQk9PTCBpc0FtYzsKKworCWlzQW1jID0gbXZCb2FyZGlzQW1jKCk7CisJaWYgKGlzQW1jKQorCQlzcHJpbnRmKHByb3B2YWwsICJva2F5Iik7CisJZWxzZQorCQlzcHJpbnRmKHByb3B2YWwsICJkaXNhYmxlZCIpOworCisJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBub2RlKTsKKworCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQltdl9mZHRfZHByaW50ZigiTGFjayBvZiAnJXMnIG5vZGUgaW4gZGV2aWNlIHRyZWVcbiIsIG5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisKKwltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsCisJCQkJCXByb3B2YWwsIHN0cmxlbihwcm9wdmFsKSsxKSk7CisJaWYgKGVyciA8IDApIHsKKwkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOworCQlyZXR1cm4gLTE7CisJfQorCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnIGluICclcycgbm9kZVxuIiwgcHJvcCwgcHJvcHZhbCwgbm9kZSk7CisKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtNTE4LDYgKzc5Nyw5IEBACiAqIG12X2ZkdF91cGRhdGVfcGV4CiAqCiAqIERFU0NSSVBUSU9OOgorKiB0YXJnZXQJCTogdXBkYXRlIHN0YXR1cyBmaWVsZHMgb2YgcGNpZVggbm9kZXMuCisqIG5vZGUsIHByb3BlcnRpZXMJOiAtcHJvcGVydHkgc3RhdHVzIEAgbm9kZSBwY2llWC4KKyogZGVwZW5kZW5jaWVzCQk6IGJvYXJkUGV4SW5mbyBzdHJ1Y3R1cmUgZW50cnkgaW4gYm9hcmQgc3RydWN0dXJlLgogKgogKiBJTlBVVDoKICoJZmR0LgpAQCAtNTU1LDcgKzgzNyw3IEBACiAJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBub2RlKTsKIAlpZiAobm9kZW9mZnNldCA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBub2RlKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKIAl9CiAJd2hpbGUgKHN0cm5jbXAobm9kZSwgInBjaWUiLCA0KSA9PSAwKSB7CiAJCWZvciAoayA9IDA7IGsgPD0gcGV4bnVtOyBrKyspCkBAIC01NzIsNyArODU0LDcgQEAKIAkJaWYgKGVyciA8IDApIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLAogCQkJCSAgICAgICBwcm9wLCBub2RlKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAwOwogCQl9CiAJCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSB0byAnJXMnIGluICclcycgbm9kZVxuIiwgcHJvcCwKIAkJCSAgICAgICBwcm9wdmFsLCBub2RlKTsKQEAgLTU4MCwxMyArODYyLDEzIEBACiAJCWlmIChub2Rlb2Zmc2V0IDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsCiAJCQkJICAgICAgIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJbm9kZSA9IGZkdF9nZXRfbmFtZShmZHQsIG5vZGVvZmZzZXQsIE5VTEwpOwogCX0KIAlyZXR1cm4gMDsKIH0KLQorI2lmZGVmIE1WX0lOQ0xVREVfVVNCCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdl9mZHRfdXBkYXRlX3VzYgogKgpAQCAtNjEzLDcgKzg5NSw3IEBACiAJCXNwcmludGYobm9kZSwgInVzYiVzQCV4IiwgdW5pdFR5cGUgPT0gVVNCX1VOSVRfSUQgPyAiIiA6ICIzIiwgTVZfVVNCMl9VU0IzX1JFR1NfT0ZGU0VUKHVuaXRUeXBlLCBpKSk7CiAJCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKQEAgLTYyMSw5ICs5MDMsOTYgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZfZmR0X3VwZGF0ZV91c2IyCisqCisqIERFU0NSSVBUSU9OOiB1cGRhdGUgVVNCMi4wKGVIQ0kpIHN0YXR1cywgdGhpcyBmdW5jdGlvbiBpcyB3cmFwcGVyIGZ1bmN0aW9uCisqIHRvIG12X2ZkdF91cGRhdGVfdXNiLCBJbiBvcmRlciB0byBhZGQgaXQgdG8gdXBkYXRlX3NlcXVlbmNlIGFycmF5CisqCisqIElOUFVUOiBmZHQuCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiAtMSBvbiBlcnJvciBvcyAwIG90aGVyd2lzZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdXNiMih2b2lkICpmZHQpCit7CisJcmV0dXJuIG12X2ZkdF91cGRhdGVfdXNiKGZkdCwgVVNCX1VOSVRfSUQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX3VzYjMKKyoKKyogREVTQ1JJUFRJT046IHVwZGF0ZSBVU0IzLjAoeEhDSSkgc3RhdHVzLCB0aGlzIGZ1bmN0aW9uIGlzIHdyYXBwZXIgZnVuY3Rpb24KKyogdG8gbXZfZmR0X3VwZGF0ZV91c2IsIEluIG9yZGVyIHRvIGFkZCBpdCB0byB1cGRhdGVfc2VxdWVuY2UgYXJyYXkKKyoKKyogSU5QVVQ6IGZkdC4KKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IC0xIG9uIGVycm9yIG9zIDAgb3RoZXJ3aXNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbXZfZmR0X3VwZGF0ZV91c2IzKHZvaWQgKmZkdCkKK3sKKwlyZXR1cm4gbXZfZmR0X3VwZGF0ZV91c2IoZmR0LCBVU0IzX1VOSVRfSUQpOworfQorI2VuZGlmIC8qIE1WX0lOQ0xVREVfVVNCICovCisKKyNpZmRlZiBNVl9JTkNMVURFX1VTQl9ERVZJQ0UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12X2ZkdF91cGRhdGVfdXNiX2RldmljZQorKgorKiBERVNDUklQVElPTjogdXNiMyBkZXZpY2Ugc3RhdHVzCisqIHRhcmdldAkJOiB1cGRhdGUgc3RhdHVzIGZpZWxkIG9mIHUzZCBhbmQgdWRjIG5vZGVzLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogcHJvcGVydHkgc3RhdHVzIEAgbm9kZXMgdXNiM0BYLCB1ZGNAWCBhbmQgdWRjQFguCisqIGRlcGVuZGVuY2llcwkJOiBTQFIgZmllbGQgJ3VzYjNwb3J0MCcgb3IgJ3VzYjNwb3J0MScuCisqCisqIElOUFVUOiBmZHQuCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiAtMSBvbiBlcnJvciBvcyAwIG90aGVyd2lzZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IG12X2ZkdF91cGRhdGVfdXNiX2RldmljZSh2b2lkICpmZHQpCit7CisJY2hhciBwcm9wdmFsWzEwXTsJCQkJLyogcHJvcGVydHkgdmFsdWUgKi8KKwljb25zdCBjaGFyICpwcm9wID0gInN0YXR1cyI7CQkJLyogcHJvcGVydHkgbmFtZSAqLworCWNoYXIgbm9kZVs2NF07CQkJCQkvKiBub2RlIG5hbWUgKi8KKwlpbnQgaTsKKwlNVl9CT09MIGlzRGV2aWNlID0gTVZfRkFMU0U7CisKKwkvKiBkaXNhYmxlIHVzYjMgbm9kZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTVZfVVNCM19NQVhfSE9TVF9QT1JUUzsgaSsrKSB7CisJCWlmIChtdkJvYXJkSXNVc2IzUG9ydERldmljZShpKSkgeworCQkJLyogaWYgUG9ydCBpcyBEZXZpY2UsIGRpc2FibGUgY29ycmVzcG9uZGluZyBIb3N0IG5vZGUgKi8KKwkJCXNwcmludGYocHJvcHZhbCwgImRpc2FibGVkIik7CisJCQlpc0RldmljZSA9IE1WX1RSVUU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpc0RldmljZSA9PSBNVl9GQUxTRSkKKwkJcmV0dXJuIDA7CisKKwlzcHJpbnRmKG5vZGUsICJ1c2IzQCV4IiwgTVZfVVNCMl9VU0IzX1JFR1NfT0ZGU0VUKFVTQjNfVU5JVF9JRCwgaSkpOworCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkKKwkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOworCisJLyogZW5hYmxlICd1M2QnIGFuZCAndWRjJyBub2RlcyAqLworCXNwcmludGYocHJvcHZhbCwgIm9rYXkiKTsKKwlzcHJpbnRmKG5vZGUsICJ1M2RAJXgiLCBNVl9VU0IzX0RFVklDRV9SRUdTX09GRlNFVCk7CisJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CisJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCXNwcmludGYobm9kZSwgInVkY0AleCIsIE1WX1VTQjNfREVWSUNFX1VTQjJfUkVHU19PRkZTRVQpOworCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgeworCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBNVl9JTkNMVURFX1VTQl9ERVZJQ0UgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12X2ZkdF91cGRhdGVfcGluY3RybAogKgogKiBERVNDUklQVElPTjoKKyogdGFyZ2V0CQk6IHVwZGF0ZSBjb21wYXRpYmxlIGZpZWxkIG9mIHBpbmN0cmwgbm9kZS4KKyogbm9kZSwgcHJvcGVydGllcwk6IC1wcm9wZXJ0eSBjb21wYXRpYmxlIEAgbm9kZSBwaW5jdHJsLgorKiBkZXBlbmRlbmNpZXMJCTpERVZfSURfUkVHIHZhbHVlICJkZXZpY2UgbW9kZWwgdHlwZSIuCiAqCiAqIElOUFVUOgogKglmZHQuCkBAIC02NDUsMTEgKzEwMTQsMTEgQEAKIAljb25zdCBjaGFyICpub2RlID0gInBpbmN0cmwiOwkJCS8qIG5vZGUgbmFtZSAqLwogI2VuZGlmCiAKLQkvKiB1cGRhdGUgcGluY3RybCBkcml2ZXIgJ2NvbXBhdGlibGUnIHByb3BlcnQsIGFjY29yZGluZyB0byBkZXZpY2UgbW9kZWwgdHlwZSAqLworCS8qIHVwZGF0ZSBwaW5jdHJsIGRyaXZlciAnY29tcGF0aWJsZScgcHJvcGVydHksIGFjY29yZGluZyB0byBkZXZpY2UgbW9kZWwgdHlwZSAqLwogCXNwcmludGYocHJvcHZhbCwgIm1hcnZlbGwsbXY4OGYleC1waW5jdHJsIiwgbXZDdHJsTW9kZWxHZXQoKSk7CiAJaWYgKG12X2ZkdF9zZXRfbm9kZV9wcm9wKGZkdCwgbm9kZSwgcHJvcCwgcHJvcHZhbCkgPCAwKSB7CiAJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTY1OSw2ICsxMDI4LDE0IEBACiAqIG12X2ZkdF91cGRhdGVfZXRobnVtCiAqCiAqIERFU0NSSVBUSU9OOgorKiB0YXJnZXQJCTogdXBkYXRlIGV0aGVybmV0IG5vZGVzIGZvciBQUDMvTmV0YSBkcml2ZXJzLgorKiBub2RlLCBwcm9wZXJ0aWVzCTogUFAzIERyaXZlcgk6IC1wcm9wZXJ0eSBzdGF0dXMgQCBub2RlIG5pY0BYLgorKgkJCQkJICAtcHJvcGVydHkgcGh5LW1vZGUgYW5kIHBoeS1pZCBAIG5vZGUgbWFjWC4KKyoJCQkgIE5ldGEgRHJpdmVyCTogLXByb3BlcnR5IHN0YXR1cyBhbmQgcGh5LW1vZGUgQCBub2RlIGV0aGVybmV0QFguCisqCQkJCQkgIC1wcm9wZXJ0eSByZWcgQCBub2RlIGV0aGVybmV0LXBoeUBYLgorKiBkZXBlbmRlbmNpZXMJCTogcEJvYXJkTmV0Q29tcGxleEluZm8gZW50cnkgaW4gYm9hcmQgc3RydWN0dXJlLgorKgkJCSAgcEJvYXJkTWFjSW5mbyBlbnRyeSBpbiBib2FyZCBzdHJ1Y3R1cmUuCisqCSAgICAgCQkgIEZvciBQUDMvTmV0YSBkcml2ZXIgd2UgZ2V0IGV0aGVybmV0IG5vZGVzIHZpYSAibmljQC9ldGhlcm5ldEAiIGFsaWFzc2VzLgogKgogKiBJTlBVVDoKICoJZmR0LgpAQCAtNjkxLDcgKzEwNjgsNyBAQAogCWFsaWFzZXNvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgImFsaWFzZXMiKTsKIAlpZiAoYWxpYXNlc29mZnNldCA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJ2FsaWFzZXMnIG5vZGUgaW4gZGV2aWNlIHRyZWVcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAogCS8qIFdhbGsgdHJvdWdoIGFsbCBhbGlhc2VzIGFuZCBjb3VudCBFdGhlcm5ldCBwb3J0cyBlbnRyaWVzICovCkBAIC03MTMsMTEgKzEwOTAsMTEgQEAKIAkJbm9kZSA9IGZkdF9nZXRwcm9wKGZkdCwgYWxpYXNlc29mZnNldCwgcHJvcCwgJmxlbik7CiAJCWlmIChub2RlID09IE5VTEwpIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgcHJvcGVydHkgaW4gJ2FsaWFzZXMnIG5vZGVcbiIsIHByb3ApOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJaWYgKGxlbiA9PSAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiRW1wdHkgcHJvcGVydHkgdmFsdWVcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAkJLyogQWxpYXMgcG9pbnRzIHRvIHRoZSBFVEggcG9ydCBub2RlIHVzaW5nIGZ1bGwgRFQgcGF0aCAqLwogCQlub2Rlb2Zmc2V0ID0gZmR0X3BhdGhfb2Zmc2V0KGZkdCwgbm9kZSk7CkBAIC03MzgsMTIgKzExMTUsMTIgQEAKIAkJCXBoYW5kbGUgPSBmZHRfZ2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJwaHkiLCAmbGVuKTsKIAkJCWlmIChsZW4gPT0gMCkgewogCQkJCW12X2ZkdF9kcHJpbnRmKCJFbXB0eSBcInBoeVwiIHByb3BlcnR5IHZhbHVlXG4iKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlwaHlvZmZzZXQgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcGhhbmRsZShmZHQsIG50b2hsKCpwaGFuZGxlKSk7CiAJCQlpZiAocGh5b2Zmc2V0IDwgMCkgewogCQkJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gZ2V0IFBIWSBub2RlIGJ5IHBoYW5kbGUgJXhcbiIsIG50b2hsKCpwaGFuZGxlKSk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAwOwogCQkJfQogCiAJCQkvKiBTZXR1cCBQSFkgYWRkcmVzcyBpbiBEVCBpbiAicmVnIiBwcm9wZXJ0eSBvZiBhbiBhcHByb3ByaWF0ZSBQSFkgbm9kZS4KQEAgLTc1NCw3ICsxMTMxLDcgQEAKIAkJCWlmIChlcnIgPCAwKSB7CiAJCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsCiAJCQkJCQkJICAgcHJvcCwgZmR0X2dldF9uYW1lKGZkdCwgcGh5b2Zmc2V0LCBOVUxMKSk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAwOwogCQkJfQogCQkJbXZfZmR0X2RwcmludGYoIlNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyB0byAlIzAxMHhcbiIsCiAJCQkJCQkgICBwcm9wLCBmZHRfZ2V0X25hbWUoZmR0LCBwaHlvZmZzZXQsIE5VTEwpLCBudG9obChwaHlBZGRyKSk7CkBAIC03NzEsNyArMTE0OCw3IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCW12X2ZkdF9kcHJpbnRmKCJCYWQgcG9ydCB0eXBlIHJlY2VpdmVkIGZvciBpbnRlcmZhY2UgJWRcbiIsIHBvcnQpOwotCQkJCXJldHVybiAtMTsKKwkJCQlyZXR1cm4gMDsKIAkJCX0KIAogCQkJLyogU2V0dXAgUEhZIGNvbm5lY3Rpb24gdHlwZSBpbiBEVCAqLwpAQCAtNzc5LDcgKzExNTYsNyBAQAogCQkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCBwcm9wdmFsLCBzdHJsZW4ocHJvcHZhbCkrMSkpOwogCQkJaWYgKGVyciA8IDApIHsKIAkJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAwOwogCQkJfQogCQkJbXZfZmR0X2RwcmludGYoIlNldCAnJXMnIHByb3BlcnR5IHRvICclcycgaW4gJyVzJyBub2RlXG4iLCBwcm9wLCBwcm9wdmFsLCBub2RlKTsKIApAQCAtNzkxLDcgKzExNjgsNyBAQAogCQltdl9mZHRfbW9kaWZ5KGZkdCwgZXJyLCBmZHRfc2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsIHByb3AsIHByb3B2YWwsIHN0cmxlbihwcm9wdmFsKSsxKSk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCQltdl9mZHRfZHByaW50ZigiU2V0ICclcycgcHJvcGVydHkgdG8gJyVzJyBpbiAnJXMnIG5vZGVcbiIsIHByb3AsIHByb3B2YWwsIG5vZGUpOwogCkBAIC04NTUsNyArMTIzMiw3IEBACiAJCXNwcmludGYobm9kZSwgInNwaUAleCIsIE1WX1NQSV9SRUdTX09GRlNFVCh1bml0KSk7CiAJCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9IC8qIFNQSSB1bml0cy9idXNlcyAqLwogCkBAIC04ODIsNyArMTI1OSw3IEBACiAjZW5kaWYKIAlpZiAobXZfZmR0X3NldF9ub2RlX3Byb3AoZmR0LCBub2RlLCBwcm9wLCBwcm9wdmFsKSA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAogCS8qIGhhbmRsZSBOT1IgZmxhc2hlcyAtIHRoZXJlIGlzIG9ubHkgb25lIE5PUiB1bml0LCBidXQgZGlmZmVyZW50IENTIGFyZSBwb3NzaWJsZSAqLwpAQCAtOTE2LDEwICsxMjkzLDkgQEAKIAogCQlpZiAobXZfZmR0X3NldF9ub2RlX3Byb3AoZmR0LCBub2RlLCBwcm9wLCBwcm9wdmFsKSA8IDApIHsKIAkJCW12X2ZkdF9kcHJpbnRmKCJGYWlsZWQgdG8gc2V0IHByb3BlcnR5ICclcycgb2Ygbm9kZSAnJXMnIGluIGRldmljZSB0cmVlXG4iLCBwcm9wLCBub2RlKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAwOwogCQl9CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwNzIsOCArMTQ0OCw4IEBACiAJaW50IGVyciA9IDA7CQkvKiBlcnJvciBudW1iZXIgKi8KIAlpbnQgbGV2ZWwgPSAwOwkJLyogY3VycmVudCBmZHQgc2Nhbm5pbmcgZGVwdGggKi8KIAljaGFyIGFsaWFzbmFtZVsxMjhdOwkvKiBhbGlhcyBuYW1lIHRvIGJlIHN0b3JlZCBpbiAnL2FsaWFzZXMnIG5vZGUgKi8KLQljaGFyIHBhdGhbMTI4XSA9ICIiOwkvKiBmdWxsIHBhdGggdG8gY3VycmVudCBub2RlICovCi0JY2hhciB0bXBbMTI4XTsJCS8qIGF1eGlsaWFyeSBjaGFyIGFycmF5IGZvciBleHRlbmRlZCBub2RlIG5hbWUqLworCWNoYXIgcGF0aFsyNTZdID0gIiI7CS8qIGZ1bGwgcGF0aCB0byBjdXJyZW50IG5vZGUgKi8KKwljaGFyIHRtcFsyNTZdOwkJLyogYXV4aWxpYXJ5IGNoYXIgYXJyYXkgZm9yIGV4dGVuZGVkIG5vZGUgbmFtZSovCiAJY2hhciAqY3V0OwkJLyogYXV4aWxpYXJ5IGNoYXIgcG9pbnRlciAqLwogCWNvbnN0IGNoYXIgKm5vZGU7CS8qIG5vZGUgbmFtZSAqLwogCXVpbnQzMl90IHRhZzsJCS8qIGRldmljZSB0cmVlIHRhZyBhdCBnaXZlbiBvZmZzZXQgKi8KQEAgLTEyODYsNyArMTY2Miw3IEBACiAJCWlmIChlcnIgPCAwKSB7CiAJCQltdl9mZHRfZHByaW50ZigiTkZDIHVwZGF0ZTogZmFpbCB0byBtb2RpZnkgJyVzJ1xuIiwKIAkJCQkgICAgICAgcHJvcCk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKIAkJfQogCQltdl9mZHRfZHByaW50ZigiTkZDIHVwZGF0ZTogc2V0ICclcycgcHJvcGVydHkgdG8gJyVzJ1xuIiwKIAkJCSAgICAgICBwcm9wLCBwcm9wdmFsKTsKQEAgLTEzNDMsNyArMTcxOSw3IEBACiAJCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwwICwgcHJvcCwgcHJvcHZhbCwgbGVuKSk7CiAJaWYgKGxlbiA8PSAwIHx8IGVyciA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAltdl9mZHRfZHByaW50ZigiU2V0ICclcycgcHJvcGVydHkgdG8gUm9vdCBub2RlXG4iLCBwcm9wKTsKIApAQCAtMTM1NCw2ICsxNzMwLDkgQEAKICogbXZfZmR0X3VwZGF0ZV9zZXJpYWwKICoKICogREVTQ1JJUFRJT046CisqIHRhcmdldAkJOiBVcGRhdGUgc3RhdHVzIGZpZWxkIG9mIHNlcmlhbCBub2Rlcy4KKyogbm9kZSwgcHJvcGVydGllczoJOiAtcHJvcGVydHkgc3RhdHVzIEAgbm9kZSBzZXJpYWwKKyogZGVwZW5kZW5jaWVzCQk6IGNoZWNrcyBpZiBpdCBpcyBhIGFjdGl2ZSBzZXJpYWwgcG9ydCB2aWEgbXZVYXJ0UG9ydEdldCBmdW5jdGlvbi4KICoKICogSU5QVVQ6CiAqCWZkdC4KQEAgLTEzODEsMTMgKzE3NjAsMTMgQEAKIAkJc3ByaW50Zihub2RlLCAic2VyaWFsQCV4IiwgTVZfVUFSVF9SRUdTX09GRlNFVChpKSk7CiAJCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgewogCQkJbXZfZmR0X2RwcmludGYoIkZhaWxlZCB0byBzZXQgcHJvcGVydHkgJyVzJyBvZiBub2RlICclcycgaW4gZGV2aWNlIHRyZWVcbiIsIHByb3AsIG5vZGUpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIDA7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KLQorI2lmZGVmIENPTkZJR19QSUNfR1BJTwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZfZmR0X3VwZGF0ZV9waWNfZ3BpbwogKgpAQCAtMTM5Nyw3ICsxNzc2LDcgQEAKICogMS4gcGluY3RybC9waWMtcGlucy0wL21hcnZlbGwscGlucyA9ICJtcHAzMyIsICJtcHAzNCI7CiAqIDIuIHBtX3BpYy9jdHJsLWdwaW9zID0gPDB4MDAwMDAwMGMgMHgwMDAwMDAwMSAweDAwMDAwMDAxIDB4MDAwMDAwMGMgMHgwMDAwMDAwMiAweDAwMDAwMDAxPjsKICogICAgRWFjaCBHUElPIGlzIHJlcHJlc2VudGVkIGluICdjdHJsLWdwaW9zJyBwcm9wZXJ0eSB3aXRoIDMgdmFsdWVzIG9mIDMyIGJpdHM6Ci0qICAgICc8cGluY3RybC0wX2Jhc2UgKyBncGlvX2dyb3VwX251bSAgIGdwaW9fcGluX251bV9pbl9ncm91cCAgIEFDVElWRV9MT1c+JworKiAgICAnPGdwaW9zX3BoYW5kbGVbZ3Bpb19ncm91cF9udW1dICAgZ3Bpb19waW5fbnVtX2luX2dyb3VwICAgQUNUSVZFX0xPVz4nCiAqICAgIGkuZSA6IGZvciBtcHAgMzMsIGFuZCBnaXZlbiBwaW5jdHJsLTAgPSA8MHgwMDAwMDAwYj4gOgogKiAgICBncGlvX2dyb3VwX251bQk9IDMzLzMyID0gMQogKiAgICBncGlvX3Bpbl9udW1faW5fZ3JvdXA9IDMzJTMyID0gMQpAQCAtMTQyMSwxMSArMTgwMCwxMyBAQAogCWNvbnN0IGNoYXIgKm1hcnZlbGxfcGluc19wcm9wIAk9ICJtYXJ2ZWxsLHBpbnMiOwogCWNvbnN0IGNoYXIgKnBtX3BpY05vZGUgIAk9ICJwbV9waWMiOwogCWNvbnN0IGNoYXIgKmN0cmxfZ3Bpb3NfcHJvcCAJPSAiY3RybC1ncGlvcyI7Ci0JY29uc3Qgdm9pZCAqcGluY3RybF8wX2Jhc2U7Ci0JTVZfVTMyIHBpbmN0cmxfMF9iYXNlX3ZhbCwgcGljR3Bpb0luZm9bTUFYX0dQSU9fTlVNXTsKKwlNVl9VMzIgcGljR3Bpb0luZm9bTUFYX0dQSU9fTlVNXTsKIAlNVl9VMzIgY3RybF9ncGlvc19wcm9wX3ZhbHVlWzMqTUFYX0dQSU9fTlVNXTsgLyogMyozMmJpdCBpcyByZXF1aXJlZCBwZXIgR1BJTyAqLwogCWNoYXIgcHJvcHZhbFsyNTZdID0gIiI7CiAJaW50IGVyciwgbGVuID0gMCwgbm9kZW9mZnNldCwgaSwgZ3Bpb01heE51bSA9IG12Qm9hcmRQSUNHcGlvR2V0KHBpY0dwaW9JbmZvKTsKKwlNVl9VMzIgZ3Bpb3NfcGhhbmRsZVsyXTsJLyogcGhhbmRsZSB2YWx1ZXMgb2YgZ3BpbyBub2RlcyAqLworCU1WX1UzMiBncGlvX29mZnNldDsKKwljaGFyIGdwaW9fbm9kZVszMF0gPSAiIjsKIAogCS8qIGlmIGJvYXJkIGhhcyBubyBkZWRpY2F0ZWQgUElDIE1QUCBQaW5zOiByZW1vdmUgJ3BtX3BpYycgJiAncGluY3RybC9waWMtcGlucy0wJyAqLwogCWlmIChncGlvTWF4TnVtIDw9IDApIHsKQEAgLTE0MzcsNiArMTgxOCwyMSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBmZXRjaCBncGlvIG5vZGVzJyBwaGFuZGxlLgorCSAqIGV2ZXJ5IEdQSU8gZ3JvdXAgaGF2ZSBHUElPIG5vZGUgaWQgRFQKKwkgKiBhbmQgZm9yIGVhY2ggR1BJTyBwaW4sIGFuIGVudHJ5IGlzIGFkZGVkIHRvIHRoZSBjdHJsLWdwaW9zLAorCSAqIGluIG9yZGVyIHRvIGxpbmsgYmV0d2VlbiB0aGUgZW50cnkgYW5kIHRoZSByZWxldmFudCBncGlvIG5vZGUgZm9yIHRoZSByZWxldmFudAorCSAqIGdyb3VwLCB0aGUgcGhhbmRsZSBvZiB0aGUgZ3BpbyBub2RlIGlzIGFkZGVkIHRvIHRoZSBlbnRyeSAqLworCWZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKwkJc3ByaW50ZihncGlvX25vZGUsICJncGlvQCVYIiwgTVZfR1BQX1JFR1NfT0ZGU0VUKGkpKTsKKwkJZ3Bpb19vZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgZ3Bpb19ub2RlKTsKKwkJZ3Bpb3NfcGhhbmRsZVtpXSA9IGZkdF9nZXRfcGhhbmRsZShmZHQsIGdwaW9fb2Zmc2V0KTsKKwkJaWYgKCFncGlvc19waGFuZGxlW2ldKSB7CisJCQltdk9zUHJpbnRmKCJGYWlsZWQgdXBkYXRpbmcgc3VzcGVuZC1yZXN1bWUgR1BJTyBwaW4gc2V0dGluZ3MgaW4gRFRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKIAkvKiBzZXQgcGluY3RybC9waWMtcGlucy0wL21hcnZlbGwscGlucyBwcm9wZXJ0eSBhcyBjb25jYXRlbmF0ZWQgc3RyaW5ncy4KIAkgKiAoaS5lIDogbWFydmVsbCxwaW5zID0gIm1wcDMzIiwgIm1wcDM0IiwgIm1wcDM1IikKIAkgKiBhcHBlbmQgbmV4dCBzdHJpbmcgYWZ0ZXIgdGhlIE5VTEwgY2hhcmFjdGVyIHRoYXQgdGhlIHByZXZpb3VzCkBAIC0xNDQ4LDI5ICsxODQ0LDI4IEBACiAJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBtYXJ2ZWxsX3BpbnNfcHJvcCwgcHJvcHZhbCwgbGVuKSk7CiAJaWYgKGVyciA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIG1hcnZlbGxfcGluc19wcm9wLCBwaWNQaW5zTm9kZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQogCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSBpbiAnJXMnIG5vZGVcbiIsIG1hcnZlbGxfcGluc19wcm9wLCBwaWNQaW5zTm9kZSk7CiAKIAogCS8qIHNldCBwbV9waWMvY3RybC1ncGlvcyBwcm9wZXJ0eTogKi8KIAlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIHBtX3BpY05vZGUpOyAJLyogZmluZCAncG1fcGljJyBub2RlICovCi0JcGluY3RybF8wX2Jhc2UgPSBmZHRfZ2V0cHJvcChmZHQsIG5vZGVvZmZzZXQsICJwaW5jdHJsLTAiLCAmbGVuKTsKKwogCWlmIChsZW4gPT0gMCkgewogCQlwcmludGYoIkVtcHR5IHByb3BlcnR5IHZhbHVlXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gMDsKIAl9CiAJLyogRWFjaCBHUElPIGlzIHJlcHJlc2VudGVkIGluICdjdHJsLWdwaW9zJyBwcm9wZXJ0eSB3aXRoIDMgdmFsdWVzIG9mIDMyIGJpdHM6Ci0JICogJzxwaW5jdHJsLTBfYmFzZSArIGdwaW9fZ3JvdXBfbnVtICAgZ3Bpb19waW5fbnVtX2luX2dyb3VwICAgQUNUSVZFX0xPVz4nCisJICogJzxncGlvc19waGFuZGxlW2dwaW9fZ3JvdXBfbnVtXSAgIGdwaW9fcGluX251bV9pbl9ncm91cCAgIEFDVElWRV9MT1c+JwogCSAqIGkuZSA6IGZvciBtcHAgMzMsIGFuZCBnaXZlbiBwaW5jdHJsLTAgPSA8MHgwMDAwMDAwYj4gOgogCSAqIGdwaW9fZ3JvdXBfbnVtCT0gMzMvMzIgPSAxCiAJICogZ3Bpb19waW5fbnVtX2luX2dyb3VwPSAzMyUzMiA9IDEKIAkgKiBBQ1RJVkVfTE9XID0gMQogCSAqIERUIGVudHJ5IGlzIDogJzwweDAwMDAwMDBjIDB4MDAwMDAwMDEgMHgwMDAwMDAwMT4nOyAqLwotCXBpbmN0cmxfMF9iYXNlX3ZhbCA9IG50b2hsKCooKHVuc2lnbmVkIGludCopcGluY3RybF8wX2Jhc2UpKTsJLyogRFQgaW50ZWdlciB2YWx1ZXMgYXJlIGluIEJFIGZvcm1hdCAqLwogCWZvciAoaSA9IDAgOyBpIDwgZ3Bpb01heE51bSA7IGkrKykgewogCQkvKiBwaW5jdHJsXzBfYmFzZSArZ3BpbyBHcm91cCBudW0gKi8KLQkJY3RybF9ncGlvc19wcm9wX3ZhbHVlWzMqaV0gPSBodG9ubChwaW5jdHJsXzBfYmFzZV92YWwgKyBwaWNHcGlvSW5mb1tpXSAvIDMyKTsKKwkJY3RybF9ncGlvc19wcm9wX3ZhbHVlWzMqaV0gPSBodG9ubChncGlvc19waGFuZGxlW3BpY0dwaW9JbmZvW2ldIC8gMzJdKTsKIAogCQkvKiAzMiBwaW5zIGluIGVhY2ggZ3JvdXAgKi8KIAkJY3RybF9ncGlvc19wcm9wX3ZhbHVlWzMqaSArIDFdID0gaHRvbmwocGljR3Bpb0luZm9baV0gJSAzMik7CkBAIC0xNDgyLDExICsxODc3LDEzNSBAQAogCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgY3RybF9ncGlvc19wcm9wLCBjdHJsX2dwaW9zX3Byb3BfdmFsdWUsIDQqZ3Bpb01heE51bSozKSk7CiAJaWYgKGVyciA8IDApIHsKIAkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIGN0cmxfZ3Bpb3NfcHJvcCwgcG1fcGljTm9kZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDA7CiAJfQogCW12X2ZkdF9kcHJpbnRmKCJTZXQgJyVzJyBwcm9wZXJ0eSBpbiAnJXMnIG5vZGVcbiIsIGN0cmxfZ3Bpb3NfcHJvcCwgcG1fcGljTm9kZSk7CiAKIAlyZXR1cm4gMDsKLX0KIAorfQorI2VuZGlmIC8qIENPTkZJR19QSUNfR1BJTyAqLworI2lmZGVmIE1WX0lOQ0xVREVfU1dJVENICisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdl9mZHRfdXBkYXRlX3N3aXRjaAorKgorKiBERVNDUklQVElPTjoKKyogIFRoaXMgcm91dGluZXMgdXBkYXRlcyBzd2l0Y2ggbm9kZSBhbmQgZXRoZXJuZXQtcGh5IG5vZGUgb24gc3RhdHVzIGFuZCByZ21paV8odClyeF90aW1pbmdfZGVsYXkgcHJvcGVydGllcworKiAgYWNjb3JkaW5nIHRvIFN3aXRjaCBleGlzdGVuY2UgYW5kIERldmljZSBJRCBkZXRlY3Rpb24sIHRoaXMgcm91dGUgYWxzbyBzZXQgZXRoZXJuZXQtcGh5QGkgbm9kZSBvbiByZWcgcHJvcGVydHkKKyogIGlmIGV0aGkgaXMgY29ubmVjdGVkIHRvIHN3aXRjaAorKgorKiBJTlBVVDoKKyoJZmR0LgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJLTEgb24gZXJyb3Igb3MgMCBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdl9mZHRfdXBkYXRlX3N3aXRjaCh2b2lkICpmZHQpCit7CisJY2hhciBwcm9wdmFsWzEwXTsJCQkJLyogcHJvcGVydHkgdmFsdWUgKi8KKwl1MzIgcHJvcHZhbF91MzIgPSAwOworCWNoYXIgcHJvcFs1MF07CQkJCQkvKiBwcm9wZXJ0eSBuYW1lICovCisJY2hhciBub2RlWzY0XTsJCQkJCS8qIG5vZGUgbmFtZSAqLworCU1WX1UxNiBzd2l0Y2hfZGV2aWNlX2lkOworCWludCBub2Rlb2Zmc2V0OwkJCQkJLyogbm9kZSBvZmZzZXQgZnJvbSBsaWJmZHQgKi8KKwlpbnQgZXJyOworCisJc3dpdGNoX2RldmljZV9pZCA9IG12RXRoU3dpdGNoR2V0RGV2aWNlSUQoKTsKKworCS8qaWYgc3dpdGNoIG1vZHVsZSBpcyBjb25uZWN0ZWQgYW5kIGRldGVjdCBjb3JyZWN0IHN3aXRjaCBkZXZpY2UgSUQsIGVuYWJsZSBzd2l0Y2ggaW4gZmR0Ki8KKwlpZiAoc3dpdGNoX2RldmljZV9pZCA+IDApCisJCXNwcmludGYocHJvcHZhbCwgIm9rYXkiKTsKKwllbHNlCisJCXNwcmludGYocHJvcHZhbCwgImRpc2FibGVkIik7CisKKwlzcHJpbnRmKG5vZGUsICJzd2l0Y2giKTsKKwlzcHJpbnRmKHByb3AsICJzdGF0dXMiKTsKKworCWlmIChtdl9mZHRfc2V0X25vZGVfcHJvcChmZHQsIG5vZGUsIHByb3AsIHByb3B2YWwpIDwgMCkgeworCQltdl9mZHRfZHByaW50ZigiRmFpbGVkIHRvIHNldCBwcm9wZXJ0eSAnJXMnIG9mIG5vZGUgJyVzJyBpbiBkZXZpY2UgdHJlZVxuIiwgcHJvcCwgbm9kZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSkgeworCQlpbnQgaSA9IDA7CisJCXN3aXRjaF9kZXZpY2VfaWQgPj49IFFEX1JFR19TV0lUQ0hfSURfUFJPRFVDVF9OVU1fT0ZGU0VUOworCisJCWZvciAoaSA9IDA7IGkgPCBtdkN0cmxFdGhNYXhQb3J0R2V0KCk7IGkrKykgeworCQkJLypjaGFuZ2UgdGhlIHN3aXRjaCBjb25uZWN0ZWQgZXRoIHBvcnRzJyBwaHkgdG8gOTk5Ki8KKwkJCS8qOTk5IG1lYW4gdGhhdCBldGhlcm5ldCBpcyBub3QgY29ubmVjdGVkIHRvIHBoeSovCisJCQlpZiAobXZCb2FyZFN3aXRjaENvbm5lY3RlZFBvcnRHZXQoaSkgIT0gLTEpIHsKKwkJCQlzcHJpbnRmKG5vZGUsICJldGhlcm5ldC1waHlAJWQiLCBpKTsKKwkJCQlzcHJpbnRmKHByb3AsICJyZWciKTsKKwkJCQlwcm9wdmFsX3UzMiA9IDk5OTsKKworCQkJCW5vZGVvZmZzZXQgPSBtdl9mZHRfZmluZF9ub2RlKGZkdCwgbm9kZSk7CisJCQkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCQkJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisKKwkJCQkvKiBTZXR1cCBQSFkgYWRkcmVzcyBpbiBEVCBpbiAicmVnIiBwcm9wZXJ0eSBvZiBhbiBhcHByb3ByaWF0ZSBQSFkgbm9kZS4KKwkJCQlUaGlzIHZhbHVlIGlzIEhFWCBudW1iZXIsIG5vdCBhIHN0cmluZywgYW5kIHVzZXMgbmV0d29yayBieXRlIG9yZGVyICovCisJCQkJcHJvcHZhbF91MzIgPSBodG9ubChwcm9wdmFsX3UzMik7CisJCQkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLAorCQkJCQkmcHJvcHZhbF91MzIsIHNpemVvZihwcm9wdmFsX3UzMikpKTsKKwkJCQlpZiAoZXJyIDwgMCkgeworCQkJCQltdl9mZHRfZHByaW50ZigiTW9kaWZ5aW5nICclcycgaW4gJyVzJyBub2RlIGZhaWxlZFxuIiwgcHJvcCwgbm9kZSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKmZvciBFNjE3MiBzd2l0Y2gsIHJnbWlpX3J4X3RpbWluZ19kZWxheSBhbmQgcmdtaWlfdHhfdGltaW5nX2RlbGF5IHNob3VsZCBiZSBlbmFibGVkKi8KKwkJaWYgKHN3aXRjaF9kZXZpY2VfaWQgPT0gTVZfRTYxNzJfUFJPRFVDVF9OVU0pIHsKKwkJCS8qc2V0IHJnbWlpX3J4X3RpbWluZ19kZWxheSBhbmQgcmdtaWlfdHhfdGltaW5nX2RlbGF5IHRvIGJlIGVuYWJsZWQqLworCQkJc3ByaW50Zihub2RlLCAic3dpdGNoIik7CisJCQlzcHJpbnRmKHByb3AsICJyZ21paV9yeF90aW1pbmdfZGVsYXkiKTsKKwkJCS8qZW5hYmxlIGRlbGF5IHRvIFJYQ0xLIGZvciBJTkQgaW5wdXRzIHdoZW4gcG9ydCBpcyBpbiBSR01JSSBtb2RlKi8KKwkJCXByb3B2YWxfdTMyID0gMTsKKworCQkJbm9kZW9mZnNldCA9IG12X2ZkdF9maW5kX25vZGUoZmR0LCBub2RlKTsKKwkJCWlmIChub2Rlb2Zmc2V0IDwgMCkgeworCQkJCW12X2ZkdF9kcHJpbnRmKCJMYWNrIG9mICclcycgbm9kZSBpbiBkZXZpY2UgdHJlZVxuIiwgbm9kZSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQkvKiBTZXR1cCByZ21paV9yeF90aW1pbmdfZGVsYXkgaW4gRFQuCisJCQlUaGlzIHZhbHVlIGlzIEhFWCBudW1iZXIsIG5vdCBhIHN0cmluZywgYW5kIHVzZXMgbmV0d29yayBieXRlIG9yZGVyICovCisJCQlwcm9wdmFsX3UzMiA9IGh0b25sKHByb3B2YWxfdTMyKTsKKwkJCW12X2ZkdF9tb2RpZnkoZmR0LCBlcnIsIGZkdF9zZXRwcm9wKGZkdCwgbm9kZW9mZnNldCwgcHJvcCwgJnByb3B2YWxfdTMyLCBzaXplb2YocHJvcHZhbF91MzIpKSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCW12X2ZkdF9kcHJpbnRmKCJNb2RpZnlpbmcgJyVzJyBpbiAnJXMnIG5vZGUgZmFpbGVkXG4iLCBwcm9wLCBub2RlKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCXNwcmludGYobm9kZSwgInN3aXRjaCIpOworCQkJc3ByaW50Zihwcm9wLCAicmdtaWlfdHhfdGltaW5nX2RlbGF5Iik7CisJCQkvKmVuYWJsZSBkZWxheSB0byBHVFhDTEsgZm9yIE9VVEQgb3V0cHV0cyB3aGVuIHBvcnQgaXMgaW4gUkdNSUkgbW9kZSovCisJCQlwcm9wdmFsX3UzMiA9IDE7CisJCQlub2Rlb2Zmc2V0ID0gbXZfZmR0X2ZpbmRfbm9kZShmZHQsIG5vZGUpOworCQkJaWYgKG5vZGVvZmZzZXQgPCAwKSB7CisJCQkJbXZfZmR0X2RwcmludGYoIkxhY2sgb2YgJyVzJyBub2RlIGluIGRldmljZSB0cmVlXG4iLCBub2RlKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCS8qIFNldHVwIHJnbWlpX3R4X3RpbWluZ19kZWxheSBpbiBEVC4KKwkJCVRoaXMgdmFsdWUgaXMgSEVYIG51bWJlciwgbm90IGEgc3RyaW5nLCBhbmQgdXNlcyBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwkJCXByb3B2YWxfdTMyID0gaHRvbmwocHJvcHZhbF91MzIpOworCQkJbXZfZmR0X21vZGlmeShmZHQsIGVyciwgZmR0X3NldHByb3AoZmR0LCBub2Rlb2Zmc2V0LCBwcm9wLCAmcHJvcHZhbF91MzIsIHNpemVvZihwcm9wdmFsX3UzMikpKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJbXZfZmR0X2RwcmludGYoIk1vZGlmeWluZyAnJXMnIGluICclcycgbm9kZSBmYWlsZWRcbiIsIHByb3AsIG5vZGUpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQogI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfbWFpbi5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfbWFpbi5jCmluZGV4IGRiZjIxNTkuLjJhYWE0MzkgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X21haW4uYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9tYWluLmMKQEAgLTk4LDcgKzk4LDcgQEAKICNlbHNlCiAjZGVmaW5lIERCKHgpCiAjZW5kaWYKLQorZXh0ZXJuIHZvaWQgZmR0X2Vudl9zZXR1cChjaGFyICpmZHRmaWxlLCBNVl9CT09MIHJ1blVwZGF0ZSk7CiBleHRlcm4gaW50IGRpc3BsYXlfZHJhbV9jb25maWcoaW50IHByaW50KTsKIGludCBsYXRlX3ByaW50X2NwdWluZm8odm9pZCk7CiAvKiBDUFUgYWRkcmVzcyBkZWNvZGUgdGFibGUuICovCkBAIC0yOTEsNyArMjkxLDYgQEAKIAkJKih1bnNpZ25lZCBpbnQgKikoMHgwICsgaSkgPSAqKHVuc2lnbmVkIGludCopKENPTkZJR19TWVNfVEVYVF9CQVNFICsgaSk7CiAJfQogCW12Qm9hcmREZWJ1Z0xlZCg0KTsKLQltdl9wcmludF9tYXAoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzAzLDggKzMwMiw4IEBACiAKIAllbnZTZXREZWZhdWx0KCJjb25zb2xlIiwgImNvbnNvbGU9dHR5UzAsMTE1MjAwIik7CiAjaWYgZGVmaW5lZChNVl9OQU5EKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCWVudlNldERlZmF1bHQoIm10ZHBhcnRzIiwgIidtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpO210ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpJyIpOwotCWVudlNldERlZmF1bHQoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZDtzcGkwPXNwaV9mbGFzaCIpOworCWVudlNldERlZmF1bHQoIm10ZHBhcnRzIiwgIidtdGRwYXJ0cz1hcm1hZGEtbmFuZDo4bShib290KXJvLDhtQDhtKGtlcm5lbCksLShyb290ZnMpO3NwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpJyIpOworCWVudlNldERlZmF1bHQoIm10ZGlkcyIsICJuYW5kMD1hcm1hZGEtbmFuZCxzcGkwPXNwaV9mbGFzaCIpOwogI2VsaWYgZGVmaW5lZChNVl9OQU5EKQogCWVudlNldERlZmF1bHQoIm10ZHBhcnRzIiwgIm10ZHBhcnRzPWFybWFkYS1uYW5kOjhtKGJvb3Qpcm8sOG1AOG0oa2VybmVsKSwtKHJvb3RmcykiKTsKIAllbnZTZXREZWZhdWx0KCJtdGRpZHMiLCAibmFuZDA9YXJtYWRhLW5hbmQiKTsKQEAgLTM5Myw2ICszOTIsOSBAQAogCWVudlNldERlZmF1bHQoImJvb3RjbWRfbGdjeSIsICJ0ZnRwYm9vdCAweDIwMDAwMDAgJGltYWdlX25hbWU7IHNldGVudiBib290YXJncyAkYm9vdGFyZ3NfZGZsdDsgYm9vdG0gMHgyMDAwMDAwOyAiKTsKICNlbmRpZiAvKiAjaWYgZGVmaW5lZCAoQ09ORklHX0NNRF9TVEFHRV9CT09UKSAqLwogCisjaWZkZWYgQ09ORklHX0NNRF9TT1VSQ0UKKwllbnZTZXREZWZhdWx0KCJydW5fc2NyaXB0IiwgIm5vIik7CisjZW5kaWYKIAkvKiBuZXRic2QgYm9vdCBhcmd1bWVudHMgKi8KIAllbnYgPSBnZXRlbnYoIm5ldGJzZF9lbiIpOwogCWlmKCAhZW52IHx8ICggKChzdHJjbXAoZW52LCJubyIpID09IDApIHx8IChzdHJjbXAoZW52LCJObyIpID09IDApICkpKSB7CkBAIC00NjMsNiArNDY1LDEzIEBACiAJZW52U2V0RGVmYXVsdCgiZW5hTFBBRSIsICJubyIpOzsKICNlbmRpZgogCisJLyogRmxhdHRlbiBEZXZpY2UgVHJlZSBlbnZpcm9ubWVudCBzZXR1cCAqLworI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisJZmR0X2Vudl9zZXR1cCgibXN5cy5kdGIiLCBNVl9GQUxTRSk7IC8qIHN0YXRpYyBzZXR1cDogU2tpcCBEVCB1cGRhdGUgZm9yIGN1c3RvbWVyICovCisjZWxzZQorCWZkdF9lbnZfc2V0dXAoIm1zeXMuZHRiIiwgTVZfRkFMU0UpOyAvKiBkeW5hbWljIHNldHVwOiBydW4gRFQgdXBkYXRlIChmYWxzZSBzaW5jZSBub3Qgc3VwcG9ydGVkIHlldCkgKi8KKyNlbmRpZgorCiAjaWYgKENPTkZJR19CT09UREVMQVkgPj0gMCkKIAllbnYgPSBnZXRlbnYoImJvb3RjbWQiKTsKIAlpZighZW52KQpAQCAtNjgxLDcgKzY5MCw3IEBACiAKIAkvKiBpbml0IHRoZSB1bml0cyBkZWNvZGUgd2luZG93cyAqLwogCW1pc2NfaW5pdF9yX2RlY193aW4oKTsKLQorCW12X3ByaW50X21hcCgpOwogCS8qIENsZWFyIG9sZCBrZXJuZWwgaW1hZ2VzIHdoaWNoIHJlbWFpbmVkIHN0b3JlZCBpbiBtZW1vcnkgKi8KIAltZW1zZXQgKCh2b2lkICopQ09ORklHX1NZU19MT0FEX0FERFIsIDAsIENPTkZJR19TWVNfTUlOX0hEUl9ERUxfU0laRSk7CiAJbXZCb2FyZERlYnVnTGVkKDYpOwpAQCAtNjk4LDcgKzcwNywxMiBAQAogCS8qIEluaXQgdGhlIFBIWSBvciBTd2l0Y2ggb2YgdGhlIGJvYXJkICovCiAJbXZCb2FyZEVnaWdhUGh5SW5pdCgpOwogI2VuZGlmIC8qICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVU5NX0VUSCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpICovCi0KKyNpZmRlZiBDT05GSUdfQ01EX1NPVVJDRQorCS8qIHJ1biBzYXZlZCBzY3JpcHQgKi8KKwllbnYgPSBnZXRlbnYoInJ1bl9zY3JpcHQiKTsKKwlpZiAoZW52ICYmIHN0cmNtcChlbnYsICJ5ZXMiKSA9PSAwKQorCQlydW5fY29tbWFuZCgibXZzb3VyY2UgcnVuIiwgMCk7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfcGh5LmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9waHkuYwppbmRleCA0MTFlNzM5Li5kMjg5ZTJlIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9waHkuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9waHkuYwpAQCAtODAsNiArODAsNyBAQAogI2luY2x1ZGUgImV0aC9nYmUvbXZFdGhSZWdzLmgiCiAjZW5kaWYKICNpbmNsdWRlICJtdlN5c0V0aFBoeUFwaS5oIgorI2luY2x1ZGUgImV0aFN3aXRjaC9tdlN3aXRjaFJlZ3MuaCIKICNpbmNsdWRlICJldGhTd2l0Y2gvbXZTd2l0Y2guaCIKIAogI2lmIGRlZmluZWQgKE1WODhGNjZYWCkKQEAgLTE5MSw3ICsxOTIsOSBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgbXZCb2FyZExlZE1hdHJpeEluaXQodm9pZCkKIHsKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAogCU1WX1U4IGk7CisjZW5kaWYKIAogCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl84OEY2N1gwKQogCQkvKiBMZWQgbWF0cml4IG1vZGUgaW4gN0JpdCAqLwpAQCAtMjA1LDYgKzIwOCw3IEBACiAJCS8qIFVzZSBhbiBpbnRlcm5hbCBkZXZpY2Ugc2lnbmFsIHRvIGRyaXZlIHRoZSBMRUQgTWF0cml4IENvbnRyb2wgKi8KIAkJTVZfUkVHX1dSSVRFKExFRF9NQVRSSVhfQ09OVFJPTF9SRUcoMiksIEJJVDAgfCBCSVQyIHwgQklUMyB8IEJJVDUpOwogCisjaWZkZWYgTVZfSU5DTFVERV9TV0lUQ0gKIAkJLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCBQSFlzIGNvbnRyb2xsZWQgYnkgc3dpdGNoICovCiAJCWlmIChtdkJvYXJkSXNJbnRlcm5hbFN3aXRjaENvbm5lY3RlZCgpID09IE1WX1RSVUUpIHsKIAkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKQEAgLTIxOCw2ICsyMjIsNyBAQAogCQkJCW12RXRoU3dpdGNoUGh5UmVnV3JpdGUoMHgwLCBpLCAweDE2LCAweDApOwogCQkJfQogCQl9CisjZW5kaWYKIAl9CiAKIAkvKiBpbml0aWFsaXplIEV4dGVybmFsIFJHTUlJLTAgUEhZIChTTUkgY29udHJvbGxlZCBieSBNQUMwIEBhZGRyZXNzIDB4MSkgKi8KQEAgLTI4Niw2ICsyOTEsOSBAQAogCWludCBpOwogCU1WX1NUQVRVUyAgIHN0YXR1czsKIAlNVl9VMzIgcGh5QWRkcjsKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAorCU1WX1UxNiBzd2l0Y2hEZXZpY2VJRDsKKyNlbmRpZgogCiAJZm9yIChpID0gMDsgaSA8IG12Q3RybEV0aE1heFBvcnRHZXQoKTsgaSsrKSB7CiAJCWlmIChNVl9GQUxTRSA9PSBtdkN0cmxQd3JDbGNrR2V0KEVUSF9HSUdfVU5JVF9JRCwgaSkpCkBAIC0zMjEsNiArMzI5LDI3IEBACiAJCX0KIAl9CiAKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAorCXN3aXRjaERldmljZUlEID0gbXZFdGhTd2l0Y2hHZXREZXZpY2VJRCgpOworCWlmIChtdkJvYXJkSXNTd2l0Y2hDb25uZWN0ZWQoKSkgeworCQlzd2l0Y2hEZXZpY2VJRCA+Pj0gUURfUkVHX1NXSVRDSF9JRF9QUk9EVUNUX05VTV9PRkZTRVQ7CisJCWZvciAoaSA9IDA7IGkgPCBtdkN0cmxFdGhNYXhQb3J0R2V0KCk7IGkrKykgeworCQkJLypmb3JjZSB0aGUgc3dpdGNoIGNvbm5lY3RlZCBldGggcG9ydCBsaW5rIHVwIGFuZCBkaXNhYmxlIGF1dG8tbmVnLCBiaXQgMTUgbXVzdCBzZXQgdG8gMSovCisJCQlpZiAobXZCb2FyZFN3aXRjaENvbm5lY3RlZFBvcnRHZXQoaSkgIT0gLTEpCisJCQkJTVZfUkVHX1dSSVRFKChORVRBX0dNQUNfQU5fQ1RSTF9SRUcoaSkgKyBJTlRFUl9SRUdTX0JBU0UpLAorCQkJCQkoTkVUQV9GT1JDRV9MSU5LX1BBU1NfTUFTSyB8IE5FVEFfU0VUX0dNSUlfU1BFRURfMTAwMF9NQVNLIHwKKwkJCQkJTkVUQV9TRVRfRkxPV19DT05UUk9MX01BU0sgfCBORVRBX0ZMT1dfQ09OVFJPTF9BRFZFUlRJU0VfTUFTSyB8CisJCQkJCU5FVEFfU0VUX0ZVTExfRFVQTEVYX01BU0sgfCBCSVQxNSkvKjB4OTM0MiovKTsKKwkJfQorCisJCS8qbm93IG9ubHkgRTYxNzIgc3dpdGNoIHdvcmtzIGZvciBORVRBLCBzbyBoZXJlIG5vIG90aGVyIHN3aXRjaCBpbml0aWFsaXphdGlvbiBpcyBjYWxsZWQqLworCQlpZiAoc3dpdGNoRGV2aWNlSUQgPT0gTVZfRTYxNzJfUFJPRFVDVF9OVU0pCisJCQltdkV0aEU2MTcyU3dpdGNoQmFzaWNJbml0KDApOworCQlpZiAoc3dpdGNoRGV2aWNlSUQgPT0gTVZfRTYxNzZfUFJPRFVDVF9OVU0pCisJCQltdkV0aEU2MTcxU3dpdGNoQmFzaWNJbml0KDApOworCX0KKyNlbmRpZgorCiAjZWxpZiBkZWZpbmVkIChNVjg4RjY2WFgpIC8qIEF2YW50YS1MUDogZHluYW1pYyBQUHYyIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgICAgTVZfVTMyIGV0aENvbXBsZXggPSBtdkJvYXJkRXRoQ29tcGxleENvbmZpZ0dldCgpOwogCWNoYXIgKmVlZUVuYWJsZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9ydGMyLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl9ydGMyLmMKaW5kZXggMDNiODEyMC4uYzYxYjQwNSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfcnRjMi5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3J0YzIuYwpAQCAtNzAsMzggKzcwLDEwMCBAQAogI2luY2x1ZGUgIm12X3J0YzIuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX0NNRF9EQVRFKQotCisvKiBUaGlzIGRlZmluZSBmb3IgV0EgaW4gcnRjIHJlYWQgKi8KKyNkZWZpbmUgU0FNUExFX05SIDEwMAogc3RhdGljIGludCBydGNfcmVhZHkgPSAtMTsKIAorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgcnRjX2luaXQodm9pZCkKIHsKIAkvKiBVcGRhdGUgUlRDLU1CVVMgYnJpZGdlIHRpbWluZyBwYXJhbWV0ZXJzICovCisJI2lmZGVmIEVSUkFUQV9GRV8zMTI0MDY0CisJLyogRnVuY3Rpb25hbCBFcnJhdGEgUmVmICM6IEZFLTMxMjQwNjQgLSAgV0EgZm9yIGZhaWxpbmcgdGltZSByZWFkIGF0dGVtcHRzLgorCSAqIERlc2NyaXB0aW9uOgorCSAqIAlUaGUgZGV2aWNlIHN1cHBvcnRzIENQVSB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MgdG8gdGhlIFJUQyBUaW1lIHJlZ2lzdGVyLgorCSAqIAlIb3dldmVyLCBkdWUgdG8gdGhpcyBlcnJhdHVtLCBXcml0ZSB0byBSVEMgVElNRSByZWdpc3RlciBtYXkgZmFpbC4KKwkgKiAJUmVhZCBmcm9tIFJUQyBUSU1FIHJlZ2lzdGVyIG1heSBmYWlsLgorCSAqIFdvcmthcm91bmQ6CisJICogCUJlZm9yZSB3cml0aW5nIHRvIFJUQyBUSU1FIHJlZ2lzdGVyLCBpc3N1ZSBhIGR1bW15IHdyaXRlIG9mIDB4MCB0d2ljZSB0byBSVEMgU3RhdHVzIHJlZ2lzdGVyLgorCSAqIAlSVEMgVElNRSByZWdpc3RlciBzaG91bGQgYmUgcmVhZCB0d2ljZSwgdGhlIHNlY29uZCByZWFkIHdpbGwgcmV0dXJuIGEgcHJvcGVyIHZhbHVlLgorCSAqIAlDb25maWd1cmUgbWF4aW11bSB2YWx1ZSAoMHgzRkYpIGluIHdyaXRlIGNsb2NrIHBlcmlvZCBpbiBSVEMgTWJ1cyBCcmlkZ2UgVGltaW5nIENvbnRyb2wgcmVnaXN0ZXIuCisJICogRnVuY3Rpb25hbCBJbXBhY3QgQWZ0ZXIgV29ya2Fyb3VuZCBpcyBhcHBsaWVkOgorCSAqIAlObyBmdW5jdGlvbmFsIGltcGFjdCBhZnRlciBXQSBpcyBhcHBsaWVkCisJICovCisJTVZfUkVHX1dSSVRFKE1WX1JUQzJfU09DX09GRlNFVCwgMHhGRDRENEZGRik7CisjZWxzZQogCU1WX1JFR19XUklURShNVl9SVEMyX1NPQ19PRkZTRVQsIDB4RkQ0RDRDRkEpOworI2VuZGlmCiAJcnRjX3JlYWR5ID0gMTsKIH0KIAorI2lmZGVmIEVSUkFUQV9GRV8zMTI0MDY0CitzdHJ1Y3QgX3N0clRpbWUyRnJlcSB7CisJdW5zaWduZWQgbG9uZyBuVGltZTsKKwl1bnNpZ25lZCBpbnQgIG5GcmVxOworCit9OworI2VuZGlmCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IHJ0Y19nZXQoc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWUsIHRpbWVfY2hlY2s7CisjaWZkZWYgRVJSQVRBX0ZFXzMxMjQwNjQKKwkvKiBGdW5jdGlvbmFsIEVycmF0YSBSZWYgIzogRkUtMzEyNDA2NCAtIFdBIGZvciBmYWlsaW5nIHRpbWUgcmVhZCBhdHRlbXB0cy4KKwkgKiBEZXNjcmlwdGlvbjoKKwkgKiAgICAgIFRoZSBkZXZpY2Ugc3VwcG9ydHMgQ1BVIHdyaXRlIGFuZCByZWFkIGFjY2VzcyB0byB0aGUgUlRDIFRpbWUgcmVnaXN0ZXIuCisJICoJSG93ZXZlciwgZHVlIHRvIHRoaXMgZXJyYXR1bSwgV3JpdGUgdG8gUlRDIFRJTUUgcmVnaXN0ZXIgbWF5IGZhaWwuCisJICoJUmVhZCBmcm9tIFJUQyBUSU1FIHJlZ2lzdGVyIG1heSBmYWlsLgorCSAqIFdvcmthcm91bmQ6CisJICoJQmVmb3JlIHdyaXRpbmcgdG8gUlRDIFRJTUUgcmVnaXN0ZXIsIGlzc3VlIGEgZHVtbXkgd3JpdGUgb2YgMHgwIHR3aWNlIHRvCisJICoJUlRDIFN0YXR1cyByZWdpc3Rlci4KKwkgKglDb25maWd1cmUgbWF4aW11bSB2YWx1ZSAoMHgzRkYpIGluIHdyaXRlIGNsb2NrIHBlcmlvZCBpbiBSVEMgTWJ1cyBCcmlkZ2UKKwkgKglUaW1pbmcgQ29udHJvbCByZWdpc3Rlci4KKwkgKglCZWZvcmUgd3JpdGluZyB0byBSVEMgVElNRSByZWdpc3RlciwgaXNzdWUgYSBkdW1teSB3cml0ZSBvZiAweDAgdHdpY2UgdG8KKwkgKglSVEMgU3RhdHVzIHJlZ2lzdGVyLgorCSAqICAgICAgUlRDIFRJTUUgcmVnaXN0ZXIgc2hvdWxkIGJlIHJlYWQgMTAwIHRpbWVzLCB0aGVuIGZpbmQgdGhlIHJlc3VsdAorCSAqCXRoYXQgYXBwZWFyIG1vc3QgZnJlcXVlbnRseSwgdXNlIHRoaXMgcmVzdWx0IGFzIHRoZSBjb3JyZWN0IHZhbHVlLgorCSAqLworCXVuc2lnbmVkIGxvbmcgblRpbWVBcnJheVtTQU1QTEVfTlJdLCBpLCBqLCBuVGltZSwgbk1heCA9IDAsIGluZGV4TWF4ID0gU0FNUExFX05SIC0gMTsKKwlzdHJ1Y3QgX3N0clRpbWUyRnJlcSBzVGltZVRvRnJlcVtTQU1QTEVfTlJdOworI2VuZGlmCiAKIAlpZiAocnRjX3JlYWR5ICE9IDEpCiAJCXJ0Y19pbml0KCk7CisjaWZkZWYgRVJSQVRBX0ZFXzMxMjQwNjQKKwkvKiByZWFkIFJUQyBUSU1FIHJlZ2lzdGVyIDEwMCB0aW1lcyBhbmQgc2F2ZSB0aGUgdmFsdWVzIGluIGFycmF5LAorCSAgIGluaXRpYWxpemUgdGhlIGNvdW50ZXJzIHRvIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgU0FNUExFX05SOyBpKyspIHsKKwkJc1RpbWVUb0ZyZXFbaV0ubkZyZXEgPSAwOworCQluVGltZUFycmF5W2ldID0gUlRDX1JFQURfUkVHKFJUQ19USU1FX1JFR19PRkZTKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IFNBTVBMRV9OUjsgaSsrKSB7CisJCW5UaW1lID0gblRpbWVBcnJheVtpXTsKKwkJLyogaWYgblRpbWUgYXBwZWFycyBpbiBzVGltZVRvRnJlcSBhcnJheSBzbyBhZGQgdGhlIGNvdW50ZXIgb2YgblRpbWUgdmFsdWUsCisJCSAgIGlmIGRpZG4ndCBhcHBlYXIgeWV0IGluIGNvdW50ZXJzIGFycmF5IHRoZW4gYWxsb2NhdGUgbmV3IG1lbWJlciBvZgorCQkgICBzVGltZVRvRnJlcSBhcnJheSB3aXRoIGNvdW50ZXIgPSAxICovCisJCWZvciAoaiA9IDA7IGogPCBTQU1QTEVfTlI7IGorKykgeworCQkJaWYgKHNUaW1lVG9GcmVxW2pdLm5GcmVxID09IDAgfHwgc1RpbWVUb0ZyZXFbal0ublRpbWUgPT0gblRpbWUpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNUaW1lVG9GcmVxW2pdLm5GcmVxID09IDApCisJCQlzVGltZVRvRnJlcVtqXS5uVGltZSA9IG5UaW1lOworCQlzVGltZVRvRnJlcVtqXS5uRnJlcSsrOworCQkvKmZpbmQgdGhlIG1vc3QgY29tbW9uIHJlc3VsdCovCisJCWlmIChuTWF4IDwgc1RpbWVUb0ZyZXFbal0ubkZyZXEpIHsKKwkJCWluZGV4TWF4ID0gajsKKwkJCW5NYXggPSBzVGltZVRvRnJlcVtqXS5uRnJlcTsKKwkJfQorCX0KIAotCXRpbWUgPSBSVENfUkVBRF9SRUcoUlRDX1RJTUVfUkVHX09GRlMpOwotCS8qIFdBIGZvciBmYWlsaW5nIHRpbWUgcmVhZCBhdHRlbXB0cy4gVGhlIEhXIEVSUkFUQSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgYWRkZWQgaGVyZSAqLwotCS8qIGlmIGRldGVjdGVkIG1vcmUgdGhhbiBvbmUgc2Vjb25kIGJldHdlZW4gdHdvIHRpbWUgcmVhZHMsIHJlYWQgb25jZSBhZ2FpbiAqLwotCXRpbWVfY2hlY2sgPSBSVENfUkVBRF9SRUcoUlRDX1RJTUVfUkVHX09GRlMpOwotCWlmICgodGltZV9jaGVjayAtIHRpbWUpID4gMSkKLQkJdGltZV9jaGVjayA9IFJUQ19SRUFEX1JFRyhSVENfVElNRV9SRUdfT0ZGUyk7Ci0JLyogRW5kIG9mIFdBICovCi0KLQl0b190bSh0aW1lX2NoZWNrLCB0bSk7Ci0KKwl0b190bShzVGltZVRvRnJlcVtpbmRleE1heF0ublRpbWUsIHRtKTsKKyNlbHNlCisJdG9fdG0oUlRDX1JFQURfUkVHKFJUQ19USU1FX1JFR19PRkZTKSwgdG0pOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IHJ0Y19zZXQoc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKQEAgLTExMywxMCArMTc1LDIyIEBACiAJdGltZSA9IG1rdGltZSh0bS0+dG1feWVhciwgdG0tPnRtX21vbiwKIAkJCQkgIHRtLT50bV9tZGF5LCB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CiAKLQkvKiBXQSBmb3IgZmFpbGluZyB0aW1lIHNldCBhdHRlbXB0cy4gVGhlIEhXIEVSUkFUQSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgYWRkZWQgaGVyZSAqLworI2lmZGVmIEVSUkFUQV9GRV8zMTI0MDY0CisJLyogRnVuY3Rpb25hbCBFcnJhdGEgUmVmICM6IEZFLTMxMjQwNjQgLSAgV0EgZm9yIGZhaWxpbmcgdGltZSByZWFkIGF0dGVtcHRzLgorCSAqIERlc2NyaXB0aW9uOgorCSAqIAlUaGUgZGV2aWNlIHN1cHBvcnRzIENQVSB3cml0ZSBhbmQgcmVhZCBhY2Nlc3MgdG8gdGhlIFJUQyBUaW1lIHJlZ2lzdGVyLgorCSAqIAlIb3dldmVyLCBkdWUgdG8gdGhpcyBlcnJhdHVtLCBXcml0ZSB0byBSVEMgVElNRSByZWdpc3RlciBtYXkgZmFpbC4KKwkgKiAJUmVhZCBmcm9tIFJUQyBUSU1FIHJlZ2lzdGVyIG1heSBmYWlsLgorCSAqIFdvcmthcm91bmQ6CisJICogCUJlZm9yZSB3cml0aW5nIHRvIFJUQyBUSU1FIHJlZ2lzdGVyLCBpc3N1ZSBhIGR1bW15IHdyaXRlIG9mIDB4MCB0d2ljZSB0byBSVEMgU3RhdHVzIHJlZ2lzdGVyLgorCSAqIAlSVEMgVElNRSByZWdpc3RlciBzaG91bGQgYmUgcmVhZCB0d2ljZSwgdGhlIHNlY29uZCByZWFkIHdpbGwgcmV0dXJuIGEgcHJvcGVyIHZhbHVlLgorCSAqIAlDb25maWd1cmUgbWF4aW11bSB2YWx1ZSAoMHgzRkYpIGluIHdyaXRlIGNsb2NrIHBlcmlvZCBpbiBSVEMgTWJ1cyBCcmlkZ2UgVGltaW5nIENvbnRyb2wgcmVnaXN0ZXIuCisJICogRnVuY3Rpb25hbCBJbXBhY3QgQWZ0ZXIgV29ya2Fyb3VuZCBpcyBhcHBsaWVkOgorCSAqIAlObyBmdW5jdGlvbmFsIGltcGFjdCBhZnRlciBXQSBpcyBhcHBsaWVkCisJICovCiAJUlRDX1dSSVRFX1JFRygwLCBSVENfU1RBVFVTX1JFR19PRkZTKTsKLQltZGVsYXkoMTAwKTsKLQkvKiBFbmQgb2YgU1cgV0EgKi8KKwlSVENfV1JJVEVfUkVHKDAsIFJUQ19TVEFUVVNfUkVHX09GRlMpOworI2VuZGlmCiAJUlRDX1dSSVRFX1JFRyh0aW1lLCBSVENfVElNRV9SRUdfT0ZGUyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3NlcmlhbC5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfc2VyaWFsLmMKaW5kZXggODllYTI5Yi4uMWU0OWVmOSAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfc2VyaWFsLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1AvbXZfc2VyaWFsLmMKQEAgLTQwLDcgKzQwLDExIEBACiAgKi8KIF9fd2VhayBNVl9VMzIgbXZVYXJ0UG9ydEdldCh2b2lkKQogeworI2lmZGVmIENPTkZJR19BTVBfU1VQUE9SVAorCXJldHVybiB3aG9BbUkoKTsKKyNlbHNlCiAJcmV0dXJuIENPTkZJR19TWVNfRFVBUlRfQ0hBTjsKKyNlbmRpZgogfQogCiBpbnQgbXZfc2VyaWFsX2luaXQgKHZvaWQpCkBAIC02NiwxOCArNzAsMTggQEAKIHsKIAlpZiAoYyA9PSAnXG4nKQogCi0JbXZVYXJ0UHV0Yyh3aG9BbUkoKSwgJ1xyJyk7Ci0JbXZVYXJ0UHV0Yyh3aG9BbUkoKSwgYyk7CisJbXZVYXJ0UHV0YyhtdlVhcnRQb3J0R2V0KCksICdccicpOworCW12VWFydFB1dGMobXZVYXJ0UG9ydEdldCgpLCBjKTsKIH0KIAogaW50IG12X3NlcmlhbF9nZXRjKHZvaWQpCiB7Ci0JcmV0dXJuIG12VWFydEdldGMod2hvQW1JKCkpOworCXJldHVybiBtdlVhcnRHZXRjKG12VWFydFBvcnRHZXQoKSk7CiB9CiAKIGludCBtdl9zZXJpYWxfdHN0Yyh2b2lkKQogewotCXJldHVybiBtdlVhcnRUc3RjKHdob0FtSSgpKTsKKwlyZXR1cm4gbXZVYXJ0VHN0YyhtdlVhcnRQb3J0R2V0KCkpOwogfQogCiB2b2lkIG12X3NlcmlhbF9zZXRicmcgKHZvaWQpCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9tdl91c2IuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3VzYi5jCmluZGV4IDM3OTRkZDAuLmJkMjRiNjUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3VzYi5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL212X3VzYi5jCkBAIC0zNSw0MiArMzUsNiBAQAogI2VuZGlmCiAjaW5jbHVkZSAibXZTeXNVc2JDb25maWcuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogZ2V0VXNiQWN0aXZlIC0gcmVhZCAndXNiQWN0aXZlJyBlbnYgdmFyaWFibGUgYW5kIHNldCBhY3RpdmUgcG9ydAotKgotKiBJTlBVVDoKLSogCU1WX1UzMiB1c2JVbml0SWQgLSBVU0IgaW50ZXJmYWNlIGluZGljYXRpb24gKFVTQjIuMCAvIFVTQjMuMCkKLSoKLSogT1VUUFVUOgotKiAJcHJpbnRzIHNlbGVjdGVkIGFjdGl2ZSBwb3J0IG51bWJlciwgYW5kIHNlbGVjdGVkIGludGVyZmFjZQotKgotKiBSRVRVUk46Ci0qICAgICAgIE51bSBvZiByZXF1ZXN0ZWQgaW50ZXJmYWNlIFVTQjIvMwotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX1NUQVRVUyBnZXRVc2JBY3RpdmUoTVZfVTMyIHVzYlVuaXRJZCwgTVZfVTMyIG1heFVzYkhvc3RQb3J0cywgTVZfVTMyIG1heFNlckRlc0xhbmVzLCBNVl9CT09MIHByaW50RW4pCi17Ci0JY2hhciAqZW52ID0gZ2V0ZW52KCJ1c2JBY3RpdmUiKTsKLQlpbnQgdXNiQWN0aXZlID0gc2ltcGxlX3N0cnRvdWwoZW52LCBOVUxMLCAxMCk7Ci0KLQkvKiAgaWYgcmVxdWVzdGVkIFVTQjMuMCBpcyBub3QgY29ubmVjdGVkIHZpYSBTZXJEZXMsIGJ1dCB0aGVyZSBhcmUgZW5vdWdoIFVTQjMuMCBwb3J0cyAqLwotCWlmIChwcmludEVuKSB7Ci0JCWlmICh1c2JVbml0SWQgPT0gVVNCM19VTklUX0lEICYmICh1c2JBY3RpdmUgPj0gbWF4U2VyRGVzTGFuZXMgJiYgbWF4VXNiSG9zdFBvcnRzID4gbWF4U2VyRGVzTGFuZXMpKSB7Ci0JCQltdk9zUHJpbnRmKCJcbid1c2JBY3RpdmUnIHdhcm5pbmcgKCVkKTogSW52YWxpZCBVU0IzLjAgcG9ydCAobm8gdmFsaWQgU2VyRGVzKS4uIiwgdXNiQWN0aXZlKTsKLQkJCW12T3NQcmludGYoIlRyeWluZyBVU0IyLjAgSG9zdCB2aWEgVVNCMy4wXG4iKTsKLQkJfSBlbHNlIGlmICh1c2JBY3RpdmUgPj0gbWF4VXNiSG9zdFBvcnRzICYmIHVzYlVuaXRJZCA9PSBVU0JfVU5JVF9JRCkgewotCQkJbXZPc1ByaW50ZigiXG4ndXNiQWN0aXZlJyB3YXJuaW5nICglZCk6IEludmFsaWQgVVNCMi4wIHBvcnRcbiIsIHVzYkFjdGl2ZSk7Ci0JCX0KLQotCQltdk9zUHJpbnRmKCJQb3J0ICh1c2JBY3RpdmUpIDogJWRcdEludGVyZmFjZSAodXNiVHlwZSA9ICVkKSA6ICIsIHVzYkFjdGl2ZSwKLQkJCQkoKHVzYlVuaXRJZCA9PSBVU0IzX1VOSVRfSUQpID8gMyA6IDIpKTsKLQl9Ci0JLyogRmV0Y2ggU29DIFVTQiBtYXBwaW5nOgotCSAgIEZvciBTb21lIFNvQ3MsIHdoZW4gdXNpbmcgc2luZ2xlIFVTQiBwb3J0LCB1bml0IDEgaXMgYWN0aXZlIGFuZCBub3QgMCAqLwotCXVzYkFjdGl2ZSA9IG12Q3RybFVzYk1hcEdldCh1c2JVbml0SWQsIHVzYkFjdGl2ZSk7Ci0KLQlyZXR1cm4gdXNiQWN0aXZlOwotfQogCiAjaWYgZGVmaW5lZCAoQ09ORklHX1VTQl9YSENJKQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5Nyw2ICsxNjEsNDQgQEAKIAkuaW50ZXJmYWNlX3N1cHBvcnRlZCA9IE1WX0ZBTFNFCiAjZW5kaWYKIH07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBwcmludFVzYkVycm9yICAtIFRoaXMgZnVuY3Rpb24gdXNlZCB0byBwcmludCBlcnJvciBtZXNzYWdlIHdoZW4gVVNCIGVycm9yIGRlZGVjdGVkLgorKgkJCSBjYWxsZWQgZnJvbSAidXNiX2xvd2xldmVsX2luaXQiIGFuZCAidXNiX2xvd2xldmVsX3N0b3AiIGZ1bmN0aW9ucy4KKyoKKyogSU5QVVQ6CisqCU1WX0JPT0wgdmFsdWUgLSBNVl9UUlVFIGlmIHVzYiBjb25uZWN0ZWQgb24gY3VycmVudCBib2FyZCAsTVZfRkFMU0Ugb3RoZXJ3aXNlLgorKgorKiBPVVRQVVQ6CisqCXByaW50cyBVU0IgZXJyb3IgbWVzc2FnZXMuCisqCisqIFJFVFVSTjoKKyoJLTEKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHByaW50VXNiRXJyb3IoTVZfQk9PTCBtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkICxpbnQgcG9ydCkKK3sKKyAgICAgICAgaW50IHVzYlR5cGUgPSBzaW1wbGVfc3RydG91bChnZXRlbnYoInVzYlR5cGUiKSwgTlVMTCwgMTApOworICAgICAgICBpbnQgdXNiM0hvc3ROdW0gPSBtdkN0cmxVc2IzSG9zdE1heEdldCgpOworICAgICAgICBpbnQgdXNiMkhvc3ROdW0gPSBtdkN0cmxVc2JNYXhHZXQoKTsKKworCWlmKG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQgPT0gTVZfRkFMU0UpCisJCW12T3NQcmludGYoIlxuRXJyb3I6IHJlcXVlc3RlZCAndXNiQWN0aXZlJyAoJWQpIGlzIG5vdCBjb25uZWN0ZWQgb24gY3VycmVudCBib2FyZFxuIixwb3J0KTsKKwllbHNlIHsKKwkJbXZPc1ByaW50ZigiRXJyb3I6IHJlcXVlc3RlZCAndXNiVHlwZScgKFR5cGUgJWQpIGlzIG5vdCBzdXBwb3J0ZWQuIiwgdXNiVHlwZSk7CisJCWlmICgodXNiVHlwZSA9PSAyICYmIHVzYjJIb3N0TnVtIDwgMSkgfHwgKHVzYlR5cGUgPT0zICYmIHVzYjNIb3N0TnVtIDwgMSkpCisJCW12T3NQcmludGYoIiAobm8gYXZhaWxhYmxlIFVTQiVkIHBvcnRzIG9uIGN1cnJlbnQgU29jKS5cbiIsdXNiVHlwZSk7CisJfQorCWlmICgoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMkhvc3ROdW0gPiAwKSB8fAorCQkJKGhjX3hoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjNIb3N0TnVtID4gMCkpCisJCW12T3NQcmludGYoIlxuXG5cdCBTdXBwb3J0ZWQgVW5pdHM6XG4iKTsKKwlpZiAoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMkhvc3ROdW0gPiAwKQorCQltdk9zUHJpbnRmKCJcblx0VVNCMi4wOiAlZCBwb3J0czogc2V0IHVzYlR5cGUgPSAyIC0tPiBFSENJIFN0YWNrIHdpbGwgYmUgdXNlZFxuIiwgdXNiMkhvc3ROdW0pOworCWlmIChoY194aGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IzSG9zdE51bSA+IDApCisJCW12T3NQcmludGYoIlx0VVNCMy4wOiAlZCBwb3J0czogc2V0IHVzYlR5cGUgPSAzIC0tPiB4SENJIFN0YWNrIHdpbGwgYmUgdXNlZFxuIiwgdXNiM0hvc3ROdW0pOworCXJldHVybiAtMTsKKworfQorCiAKIC8qIHVzYl9sb3dsZXZlbF9pbml0OgogKgl0aGlzIHJvdXRpbmUgbmF2aWdhdGUgYmV0d2VlbiBjdXJyZW50bHkgc2VsZWN0ZWQgc3RhY2sgKGVIQ0kveEhDSSkKQEAgLTIwNSwxMCArMjA3LDE0IEBACiAqCSAgdXNiVHlwZSA9IDMgLS0gPiB4SENJCiAqCS0gQ2FsbCB1c2JfbG93bGV2ZWxfaW5pdCBmcm9tIHNlbGVjdGVkIHN0YWNrCiAqLworCisvKiBtYXJrIGRldGVjdGVkIHVzYiBwb3J0LCB0byBlbnN1cmUgcHJvcGVyICdzdG9wJworICogcHJvY2VzcyBiZWZvcmUgbmV4dCBkZXRlY3Rpb24gcmVxdWVzdCAqLworaW50IGN1cnJlbnRVc2JBY3RpdmUgPSAtMTsKIGludCB1c2JfbG93bGV2ZWxfaW5pdChpbnQgaW5kZXgsIHZvaWQgKipjb250cm9sbGVyKQogewogCWludCB1c2IySG9zdE51bSwgdXNiM0hvc3ROdW0sIHVzYlR5cGUsIHVzYkFjdGl2ZSA9IDA7Ci0KKwl1c2JBY3RpdmUgPSBzaW1wbGVfc3RydG91bChnZXRlbnYoInVzYkFjdGl2ZSIpLCBOVUxMLCAxMCk7CiAJdXNiVHlwZSA9IHNpbXBsZV9zdHJ0b3VsKGdldGVudigidXNiVHlwZSIpLCBOVUxMLCAxMCk7CiAJdXNiM0hvc3ROdW0gPSBtdkN0cmxVc2IzSG9zdE1heEdldCgpOwogCXVzYjJIb3N0TnVtID0gbXZDdHJsVXNiTWF4R2V0KCk7CkBAIC0yMTYsOTUgKzIyMiw3MCBAQAogCXN3aXRjaCAodXNiVHlwZSkgewogCWNhc2UgMjoKIAkJaWYgKGhjX2VoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjJIb3N0TnVtID4gMCkgewotCQkJdXNiQWN0aXZlID0gZ2V0VXNiQWN0aXZlKFVTQl9VTklUX0lELCB1c2IySG9zdE51bSwgMCwgTVZfVFJVRSk7IC8qIHJlYWQgcmVxdWVzdGVkIGFjdGl2ZSBwb3J0ICovCisJCQl1c2JBY3RpdmUgPSBtdkN0cmxVc2JNYXBHZXQoVVNCX1VOSVRfSUQsIHVzYkFjdGl2ZSk7CisJCQlpZiAobXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZChVU0JfVU5JVF9JRCwgdXNiQWN0aXZlKSA9PSBNVl9GQUxTRSkKKwkJCQlyZXR1cm4gcHJpbnRVc2JFcnJvcihNVl9GQUxTRSwgdXNiQWN0aXZlKTsKIAkJCWhjID0gJmhjX2VoY2k7IC8qIHNldCBIb3N0IENvbnRyb2xsZXIgc3RydWN0IGZvciBmdW5jdGlvbiBwb2ludGVycyAgKi8KIAkJfSBlbHNlCi0JCQlnb3RvIGlucHV0X2Vycm9yOworCQkJIHJldHVybiBwcmludFVzYkVycm9yKE1WX1RSVUUsIHVzYkFjdGl2ZSk7CiAJCWJyZWFrOwogCWNhc2UgMzoKIAkJaWYgKGhjX3hoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjNIb3N0TnVtID4gMCkgewotCQkJdXNiQWN0aXZlID0gZ2V0VXNiQWN0aXZlKFVTQjNfVU5JVF9JRCwgdXNiM0hvc3ROdW0gLCBtdkN0cmxVc2IzTWF4R2V0KCksCi0JCQkJCU1WX1RSVUUpOyAvKiByZWFkIHJlcXVlc3RlZCBhY3RpdmUgcG9ydCAqLworCQkJLyogbXZDdHJsVXNiTWFwR2V0IHVzZWQgb25seSBmb3IgbGVnYWN5IGRldmljZXMgQUxQL0EzNzUgKi8KKwkJCXVzYkFjdGl2ZSA9IG12Q3RybFVzYk1hcEdldChVU0IzX1VOSVRfSUQsIHVzYkFjdGl2ZSk7CisJCQlpZiAobXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZChVU0IzX1VOSVRfSUQsIHVzYkFjdGl2ZSkgPT0gTVZfRkFMU0UpCisJCQkJcmV0dXJuIHByaW50VXNiRXJyb3IoTVZfRkFMU0UsIHVzYkFjdGl2ZSk7CisJCQlpZiAobXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQodXNiQWN0aXZlKSA9PSBNVl9GQUxTRSkgeworCQkJCW12T3NQcmludGYoIlxuJ3VzYkFjdGl2ZScgd2FybmluZyAoJWQpOiBJbnZhbGlkIFVTQjMuMCBwb3J0IChubyB2YWxpZCBTZXJEZXMpLi4iLCB1c2JBY3RpdmUpOworCQkJCW12T3NQcmludGYoIlRyeWluZyBVU0IyLjAgSG9zdCB2aWEgVVNCMy4wXG4iKTsKKwkJCX0KKyNpZmRlZiBNVl9VU0JfVkJVU19DWUNMRQorCQkJLyogVkJVUyBzaWduYWwgaXMgbG93ZXJlZCBwcmlvciB0byBTZXJEZXMgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UsCisJCQkgKiBiZWZvcmUgaW5pdGlhbGl6aW5nIGFuZCBkZXRlY3RpbmcgZGV2aWNlLCBzZXQgVkJVUyBlbmFibGVkICovCisJCQltdkJvYXJkVXNiVmJ1c1NldCh1c2JBY3RpdmUpOworI2VuZGlmCiAJCQloYyA9ICZoY194aGNpOyAvKiBzZXQgSG9zdCBDb250cm9sbGVyIHN0cnVjdCBmb3IgZnVuY3Rpb24gcG9pbnRlcnMgICovCiAJCX0gZWxzZQotCQkJZ290byBpbnB1dF9lcnJvcjsKKwkJCXJldHVybiBwcmludFVzYkVycm9yKE1WX1RSVUUsIHVzYkFjdGl2ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWdvdG8gaW5wdXRfZXJyb3I7CisJCXJldHVybiBwcmludFVzYkVycm9yKE1WX1RSVUUsIHVzYkFjdGl2ZSk7CisJfQorCW12T3NQcmludGYoIlBvcnQgKHVzYkFjdGl2ZSkgOiAlZFx0SW50ZXJmYWNlICh1c2JUeXBlID0gJWQpIDogIiwgdXNiQWN0aXZlLAorICAgICAgICAgICAgICAgICgodXNiVHlwZSA9PSAzKSA/IDMgOiAyKSk7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB1c2JBY3RpdmUgbmV2ZXIgZXhlZWRzIHRoZSBjb25maWd1cmVkIG1heCBjb250cm9sbGVycyBjb3VudAorCSAgIFRoZSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0NPVU5UIGNhbiBiZSBjaGFuZ2VkIGZvciBkaWZmZXJlbnQgYm9hcmRzICovCisJaWYgKHVzYkFjdGl2ZSA+PSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0hPU1RfQ09VTlQpIHsKKwkJbXZPc1ByaW50ZigidXNiQWN0aXZlPSVkIGlzIG91dCBvZiBzdXBwb3J0ZWQgcmFuZ2VcbiIsdXNiQWN0aXZlKTsKKwkJcmV0dXJuIC0xOwogCX0KIAorCS8qIE1hcnZlbGwgVVNCIGNvZGUgc3VwcG9ydHMgb25seSBvbmUgYWN0aXZlIGNvbnRyb2xsZXIgKFVTQjApLCB3aGlsZSB0aGUgYWN0dWFsIGhvc3QKKwkgICBkZXZpY2UgaXMgc2VsZWN0ZWQgYnkgdXNiQWN0aXZlIGVudmlyb25tZW50IHZhcmlhYmxlICovCisJaWYgKGluZGV4ID4gMCkgeworCQltdk9zUHJpbnRmKCJcbk9ubHkgb25lIGFjdGl2ZSBjb250cm9sbGVyIHN1cHBvcnRlZCEgU2tpcHBpbmcgVVNCJWQgaW5pdGlhbGl6YXRpb24uXG4iLCBpbmRleCk7CisJCXJldHVybiAtMTsKKwl9CisKKwljdXJyZW50VXNiQWN0aXZlID0gdXNiQWN0aXZlOwogCXJldHVybiBoYy0+aGNfdXNiX2xvd2xldmVsX2luaXQodXNiQWN0aXZlLCBjb250cm9sbGVyKTsKLQotaW5wdXRfZXJyb3I6Ci0JbXZPc1ByaW50ZigiRXJyb3I6IHJlcXVlc3RlZCAndXNiVHlwZScgKFR5cGUgJWQpIGlzIG5vdCBzdXBwb3J0ZWQiLCB1c2JUeXBlKTsKLQlpZiAoKHVzYlR5cGUgPT0gMiAmJiB1c2IySG9zdE51bSA8IDEpIHx8ICh1c2JUeXBlID09MyAmJiB1c2IzSG9zdE51bSA8IDEpKQotCQltdk9zUHJpbnRmKCIgKG5vIGF2YWlsYWJsZSBVU0IgcG9ydHMpLlxuIik7Ci0KLQlpZiAoKGhjX2VoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjJIb3N0TnVtID4gMCkgfHwKLQkJKGhjX3hoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjNIb3N0TnVtID4gMCkpCi0JCW12T3NQcmludGYoIlxuXG5cdCBTdXBwb3J0ZWQgVW5pdHM6XG4iKTsKLQlpZiAoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMkhvc3ROdW0gPiAwKQotCQltdk9zUHJpbnRmKCJcblx0VVNCMi4wOiAlZCBwb3J0czogc2V0IHVzYlR5cGUgPSAyIC0tPiBFSENJIFN0YWNrIHdpbGwgYmUgdXNlZFxuIiwgdXNiMkhvc3ROdW0pOwotCWlmIChoY194aGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IzSG9zdE51bSA+IDApCi0JCW12T3NQcmludGYoIlx0VVNCMy4wOiAlZCBwb3J0czogc2V0IHVzYlR5cGUgPSAzIC0tPiB4SENJIFN0YWNrIHdpbGwgYmUgdXNlZFxuIiwgdXNiM0hvc3ROdW0pOwotCXJldHVybiAtMTsKIH0KIAogaW50IHVzYl9sb3dsZXZlbF9zdG9wKGludCBpbmRleCkKIHsKLQlpbnQgdXNiMlVuaXROdW0sIHVzYjNVbml0TnVtLCB1c2JUeXBlLCB1c2JBY3RpdmUgPSAwOworCWludCB1c2JBY3RpdmUgPSBjdXJyZW50VXNiQWN0aXZlLCByZXQ7CiAKIAlpZiAoIWhjKSB7CiAJCW12T3NQcmludGYoIiVzOiBFcnJvcjogcnVuICd1c2IgcmVzZXQnIHRvIHNldCBob3N0IGNvbnRyb2xsZXIgaW50ZXJmYWNlLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JdXNiVHlwZSA9IHNpbXBsZV9zdHJ0b3VsKGdldGVudigidXNiVHlwZSIpLCBOVUxMLCAxMCk7Ci0JdXNiM1VuaXROdW0gPSBtdkN0cmxVc2IzTWF4R2V0KCk7Ci0JdXNiMlVuaXROdW0gPSBtdkN0cmxVc2JNYXhHZXQoKTsKLQotCXN3aXRjaCAodXNiVHlwZSkgewotCWNhc2UgMjoKLQkJaWYgKGhjICE9ICZoY19laGNpKSB7Ci0JCQltdk9zUHJpbnRmKCJFcnJvciAtIFBsZWFzZSBydW4gXCJ1c2Igc3RvcFwiIGJlZm9yZSBjaGFuZ2luZyBcInVzYlR5cGVcIi5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaWYgKGhjX2VoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjJVbml0TnVtID4gMCkKLQkJCXVzYkFjdGl2ZSA9IGdldFVzYkFjdGl2ZShVU0JfVU5JVF9JRCwgdXNiMlVuaXROdW0sIDAsCi0JCQkJCU1WX0ZBTFNFKTsgLyogcmVhZCByZXF1ZXN0ZWQgYWN0aXZlIHBvcnQgKi8KLQkJZWxzZQotCQkJZ290byBpbnB1dF9lcnJvcjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoaGMgIT0gJmhjX3hoY2kpIHsKLQkJCW12T3NQcmludGYoIkVycm9yIC0gUGxlYXNlIHJ1biBcInVzYiBzdG9wXCIgYmVmb3JlIGNoYW5naW5nIFwidXNiVHlwZVwiLlxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpZiAoaGNfeGhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiM1VuaXROdW0gPiAwKQotCQkJdXNiQWN0aXZlID0gZ2V0VXNiQWN0aXZlKFVTQjNfVU5JVF9JRCwgdXNiM1VuaXROdW0sIG12Q3RybFVzYjNNYXhHZXQoKSwKLQkJCQkJTVZfRkFMU0UpOyAvKiByZWFkIHJlcXVlc3RlZCBhY3RpdmUgcG9ydCAqLwotCQllbHNlCi0JCQlnb3RvIGlucHV0X2Vycm9yOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIGlucHV0X2Vycm9yOwotCX0KLQotCXJldHVybiBoYy0+aGNfdXNiX2xvd2xldmVsX3N0b3AodXNiQWN0aXZlKTsKLWlucHV0X2Vycm9yOgotCW12T3NQcmludGYoIkVycm9yOiByZXF1ZXN0ZWQgJ3VzYlR5cGUnIChUeXBlICVkKSBpcyBub3Qgc3VwcG9ydGVkIiwgdXNiVHlwZSk7Ci0JaWYgKCh1c2JUeXBlID09IDIgJiYgdXNiMlVuaXROdW0gPCAxKSB8fCAodXNiVHlwZSA9PSAzICYmIHVzYjNVbml0TnVtIDwgMSkpCi0JCW12T3NQcmludGYoIiAobm8gYXZhaWxhYmxlIFVTQiBwb3J0cykuXG4iKTsKLQotCWlmICgoaGNfZWhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiMlVuaXROdW0gPiAwKSB8fAotCQkoaGNfeGhjaS5pbnRlcmZhY2Vfc3VwcG9ydGVkID09IE1WX1RSVUUgJiYgdXNiM1VuaXROdW0gPiAwKSkKLQkJbXZPc1ByaW50ZigiXG5cblx0IFN1cHBvcnRlZCBVbml0czpcbiIpOwotCWlmIChoY19laGNpLmludGVyZmFjZV9zdXBwb3J0ZWQgPT0gTVZfVFJVRSAmJiB1c2IyVW5pdE51bSA+IDApCi0JCW12T3NQcmludGYoIlxuXHRVU0IyLjA6ICVkIHBvcnRzOiBzZXQgdXNiVHlwZSA9IDIgLS0+IEVIQ0kgU3RhY2sgd2lsbCBiZSB1c2VkXG4iLCB1c2IyVW5pdE51bSk7Ci0JaWYgKGhjX3hoY2kuaW50ZXJmYWNlX3N1cHBvcnRlZCA9PSBNVl9UUlVFICYmIHVzYjNVbml0TnVtID4gMCkKLQkJbXZPc1ByaW50ZigiXHRVU0IzLjA6ICVkIHBvcnRzOiBzZXQgdXNiVHlwZSA9IDMgLS0+IHhIQ0kgU3RhY2sgd2lsbCBiZSB1c2VkXG4iLCB1c2IzVW5pdE51bSk7Ci0JcmV0dXJuIC0xOwotCisJLyogTWFyayB0aGF0IHRoZXJlIGlzIG5vIGN1cnJlbnQgdXNiQWN0aXZlIHRvIHN0b3AgKi8KKwljdXJyZW50VXNiQWN0aXZlID0gLTE7CisJcmV0ID0gaGMtPmhjX3VzYl9sb3dsZXZlbF9zdG9wKHVzYkFjdGl2ZSk7CisJaGMgPSBOVUxMOworCXJldHVybiByZXQ7CiB9CiAKIGludCBzdWJtaXRfaW50X21zZyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHBpcGUsIHZvaWQgKmJ1ZmZlciwKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3Nhcl9iYzIuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3Nhcl9iYzIuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MTQ4NjVkCi0tLSAvZGV2L251bGwKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc2FyX2JjMi5jCkBAIC0wLDAgKzEsNDc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQorZGlzY2xhaW1lci4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGNvbW1vbi5oPgorI2luY2x1ZGUgPGNvbW1hbmQuaD4KKyNpbmNsdWRlIDxwY2kuaD4KKyNpbmNsdWRlIDxuZXQuaD4KKyNpbmNsdWRlIDxzcGlfZmxhc2guaD4KKyNpbmNsdWRlIDxiemxpYi5oPgorCisjaW5jbHVkZSAibXZDb21tb24uaCIKKyNpbmNsdWRlICJjdHJsRW52L212Q3RybEVudkxpYi5oIgorI2luY2x1ZGUgImJvYXJkRW52L212Qm9hcmRFbnZMaWIuaCIKKyNpbmNsdWRlICJjcHUvbXZDcHUuaCIKKworI2lmIGRlZmluZWQoTVZfSU5DX0JPQVJEX05PUl9GTEFTSCkKKyNpbmNsdWRlICJub3JmbGFzaC9tdkZsYXNoLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9HSUdfRVRIKQorI2luY2x1ZGUgImV0aC1waHkvbXZFdGhQaHkuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BFWCkKKyNpbmNsdWRlICJwZXgvbXZQZXguaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BETUEpCisjaW5jbHVkZSAicGRtYS9tdlBkbWEuaCIKKyNpbmNsdWRlICJtdlN5c1BkbWFBcGkuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1hPUikKKyNpbmNsdWRlICJ4b3IvbXZYb3JSZWdzLmgiCisjaW5jbHVkZSAieG9yL212WG9yLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9QTVUpCisjaW5jbHVkZSAicG11L212UG11UmVncy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJjbnRtci9tdkNudG1yUmVncy5oIgorI2luY2x1ZGUgInN3aXRjaGluZ1NlcnZpY2VzLmgiCisKKy8qIGRlZmluZXMgICovCisjdW5kZWYgTVZfREVCVUcKKyNpZmRlZiBNVl9ERUJVRworI2RlZmluZSBEQih4KSB4CisjZGVmaW5lIERCMSh4KSAgeAorI2Vsc2UKKyNkZWZpbmUgREIoeCkKKyNkZWZpbmUgREIxKHgpCisjZW5kaWYKKworLyogU0FSIGRlZmluZXMgd2hlbiBDb25uZWN0ZWQgdG8gQmMyKi8KKyNkZWZpbmUgTVZfQk9BUkRfQ1RSTF9JMkNfQUREUl9CQzIJMHgwCisjZGVmaW5lIFRXU0lfQ0hBTk5FTF9CQzIJCQkwCisjZGVmaW5lIFRXU0lfU1BFRURfQkMyCQkJCTIwMDAwIC8vIHdhIGZvciBiaXRzIDEsMiBpbiAweDRjLiBNbXVzdCBsb3dlciAxMDAwMDAgLT4gMjAwMDAgLiBhZGl5LCBlcmV6Cit0eXBlZGVmIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgVlVMOworCitzdGF0aWMgTVZfVTggdHJlYWRfYmMyKE1WX1U4IGFkZHIsIGludCByZWcpCit7CisJCU1WX1RXU0lfU0xBVkUgdHdzaVNsYXZlOworCQlNVl9UV1NJX0FERFIgc2xhdmU7CisJCU1WX1U4IGRhdGE7CisKKwkJREIocHJpbnRmKCJ0cmVhZF9iYzIsIERldkFkZHIgPSAweCV4XG4iLCBhZGRyKSk7CisKKwkJLyogVFdTSSBpbml0ICovCisJCXNsYXZlLmFkZHJlc3MgPSBNVl9CT0FSRF9DVFJMX0kyQ19BRERSX0JDMjsKKwkJc2xhdmUudHlwZSA9IEFERFI3X0JJVDsKKworCQltdlR3c2lJbml0IChUV1NJX0NIQU5ORUxfQkMyLCBUV1NJX1NQRUVEX0JDMiwgbXZCb2FyZFRjbGtHZXQoKSwgJnNsYXZlLCAwKTsKKworCQkvKiByZWFkIFNhdFIgKi8KKwkJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOworCQl0d3NpU2xhdmUuc2xhdmVBZGRyLmFkZHJlc3MgPSBhZGRyIDsKKwkJdHdzaVNsYXZlLnZhbGlkT2Zmc2V0ID0gTVZfVFJVRTsKKwkJdHdzaVNsYXZlLm9mZnNldCA9IHJlZzsKKwkJdHdzaVNsYXZlLm1vcmVUaGVuMjU2ID0gTVZfRkFMU0U7CisKKwkJaWYgKE1WX09LICE9IG12VHdzaVJlYWQoVFdTSV9DSEFOTkVMX0JDMiwgJnR3c2lTbGF2ZSwgJmRhdGEsIDEpKSB7CisJCQkJREIocHJpbnRmKCJ0cmVhZF9iYzIgOiB0d3NpIHJlYWQgZmFpbFxuIikpOworCQkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCQlEQihwcmludGYoInRyZWFkX2JjMjogdHdzaSByZWFkIHN1Y2NlZWRlZCwgZGF0YSA9IDB4JXhcbiIsIGRhdGEpKTsKKworCQlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIE1WX1NUQVRVUyB0d3JpdGVfYmMyKE1WX1U4IGFkZHIsIGludCByZWcsIE1WX1U4IHJlZ1ZhbCkKK3sKKwkJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CisJCU1WX1RXU0lfQUREUiBzbGF2ZTsKKwkJTVZfVTggZGF0YTsKKworCQkvLyAgcHJpbnRmKCI+Pj4gaW4gdHdyaXRlX2JjMiwgYWRkcj0weCV4LCByZWcgPSAweCV4LCB2YWw9MHgleFxuIiwgYWRkciwgcmVnLCByZWdWYWwpOworCQkvKiBUV1NJIGluaXQgKi8KKwkJc2xhdmUuYWRkcmVzcyA9IE1WX0JPQVJEX0NUUkxfSTJDX0FERFJfQkMyOworCQlzbGF2ZS50eXBlID0gQUREUjdfQklUOworCisJCW12VHdzaUluaXQgKFRXU0lfQ0hBTk5FTF9CQzIsIFRXU0lfU1BFRURfQkMyLCBtdkJvYXJkVGNsa0dldCgpLCAmc2xhdmUsIDApOworCisJCS8qIHdyaXRlIFNhdFIgKi8KKwkJdHdzaVNsYXZlLnNsYXZlQWRkci5hZGRyZXNzID0gYWRkcjsKKwkJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOworCQl0d3NpU2xhdmUudmFsaWRPZmZzZXQgPSBNVl9UUlVFOworCQl0d3NpU2xhdmUub2Zmc2V0ID0gcmVnOworCQl0d3NpU2xhdmUubW9yZVRoZW4yNTYgPSBNVl9GQUxTRTsKKworCQlkYXRhID0gcmVnVmFsOworCQlpZiAoTVZfT0sgIT0gbXZUd3NpV3JpdGUoVFdTSV9DSEFOTkVMX0JDMiwgJnR3c2lTbGF2ZSwgJmRhdGEsIDEpKSB7CisJCQkJREIobXZPc1ByaW50ZigidHdyaXRlX2JjMjogdHdzaSB3cml0ZSBmYWlsXG4iKSk7CisJCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJCURCKG12T3NQcmludGYoInR3cml0ZV9iYzI6IHR3c2kgd3JpdGUgc3VjY2VlZGVkXG4iKSk7CisKKwkJcmV0dXJuIE1WX09LOworfQorCitzdGF0aWMgaW50IGRvX3Nhcl9saXN0X2JjMihpbnQgYXJnYywgY2hhciAqY29uc3QgYXJndltdKQoreworCQljb25zdCBjaGFyICpjbWQ7CisJCWludCBhbGwgPSAwOworCisJCWlmIChhcmdjIDwgMSkKKwkJCQlnb3RvIHVzYWdlOworCQljbWQgPSBhcmd2WzBdOworCisJCWlmIChzdHJjbXAoY21kLCAiYWxsIikgPT0gMCkKKwkJCQlhbGwgPSAxOworCisJCWlmICgoc3RyY21wKGNtZCwgImNvcmVmcmVxIikgPT0gMCkgfHwgYWxsKSB7CisJCQkJcHJpbnRmKCJjb3JlZnJlcSAoMHg0ZCAwOjMpOiBEZXRlcm1pbmVzIHRoZSBDT1JFIGZyZXF1ZW5jeTpcbiIpOworCQkJCXByaW50ZigiXHQweDAgPSAzNjBNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDEgPSAyMjBNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDIgPSAyNTBNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDMgPSA0MDBNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDQgPSA1MDBNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDUgPSA1MjBNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDYgPSA0NTBNSHpcbiIpOworCQkJCXByaW50ZigiXG4iKTsKKwkJfQorCisJCWlmICgoc3RyY21wKGNtZCwgImNwdWZyZXEiKSA9PSAwKSAgfHwgYWxsKSB7CisJCQkJcHJpbnRmKCJjcHVmcmVxICgweDRkIDM6NCArIDB4NGUgMDowKTogRGV0ZXJtaW5lcyB0aGUgQ1BVIGFuZCBERFIgZnJlcXVlbmNpZXM6XG4iKTsKKwkJCQlwcmludGYoIlx0MHgwID0gQ1BVIDQwME1IeiwgRERSIDQwME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4MiA9IENQVSA2NjdNSHosIEREUiA2NjdNSHpcbiIpOworCQkJCXByaW50ZigiXHQweDMgPSBDUFUgODAwTUh6LCBERFIgODAwTUh6XG4iKTsKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKworCQlpZiAoKHN0cmNtcChjbWQsICJ0bWZyZXEiKSA9PSAwKSAgfHwgYWxsKSB7CisJCQkJcHJpbnRmKCJ0bWZyZXEgKDB4NGUgMTozKTogRGV0ZXJtaW5lcyB0aGUgYm9vdCBzZWxlY3Rpb246XG4iKTsKKwkJCQlwcmludGYoIlx0MHgwID0gVE0gY2xvY2sgaXMgZGlzYWJsZWRcbiIpOworCQkJCXByaW50ZigiXHQweDEgPSBUTSBydW5zIDQwME1IWiwgRERSMyBydW5zIDgwME1IelxuIik7CisJCQkJcHJpbnRmKCJcdDB4MiA9IFRNIHJ1bnMgNDY2TUhaLCBERFIzIHJ1bnMgOTMzTUh6XG4iKTsKKwkJCQlwcmludGYoIlx0MHgzID0gVE0gcnVucyAzMzNNSFosIEREUjMgcnVucyA2NjdNSHpcbiIpOworCQkJCXByaW50ZigiXG4iKTsKKwkJfQorCisJCWlmICgoc3RyY21wKGNtZCwgImJvb3RzZWwiKSA9PSAwKSB8fCBhbGwpIHsKKwkJCQlwcmludGYoImJvb3RzZWwgKDB4NGYgMDoyKTogRGV0ZXJtaW5lcyB0aGUgVE0gZnJlcXVlbmN5OlxuIik7CisJCQkJcHJpbnRmKCJcdDB4MCA9IEJvb3RST00gZW5hYmxlZCwgQm9vdCBmcm9tIERldmljZShOT1IpIGZsYXNoXG4iKTsKKwkJCQlwcmludGYoIlx0MHgxID0gQm9vdFJPTSBlbmFibGVkLCBCb290IGZyb20gTkFORCBmbGFzaCAobmV3IE5GIGNvbnRyb2xsZXIgb24gREVWX0NTblswXSlcbiIpOworCQkJCXByaW50ZigiXHQweDIgPSBCb290Uk9NIGVuYWJsZWQsIGJvb3QgZnJvbSBVQVJUXG4iKTsKKwkJCQlwcmludGYoIlx0MHgzID0gQm9vdFJPTSBlbmFibGVkLCBib290IGZyb20gU1BJMChDUzApXG4iKTsKKwkJCQlwcmludGYoIlx0MHg1ID0gQm9vdFJPTSBlbmFibGVkLCBTdGFuZGJ5IHNsYXZlLiBNdXN0IHNldCBQQ0lzIGFzIGVuZHBvaW50IChpLmUuIENQVSBJRExFKVxuIik7CisJCQkJcHJpbnRmKCJcdDB4NiA9IEJvb3RST00gZW5hYmxlZCwgVUFSVCBkZWJ1ZyBwcm9tcHQgbW9kZVxuIik7CisJCQkJcHJpbnRmKCJcbiIpOworCQl9CisKKwkJaWYgKChzdHJjbXAoY21kLCAianRhZ2NwdSIpID09IDApIHx8IGFsbCkgeworCQkJCXByaW50ZigianRhZ2NwdSAoMHg0ZiAzOjMpOiBEZXRlcm1pbmVzIHRoZSBKVEFHIHRvIENQVSBjb25uZWN0aW9uOlxuIik7CisJCQkJcHJpbnRmKCJcdDB4MCA9IEpUQUcgaXMgY29ubmVjdGVkIHRvIEMzTSBDUFVcbiIpOworCQkJCXByaW50ZigiXHQweDEgPSBKVEFHIGlzIGNvbm5lY3RlZCB0byBNU1lTIENQVVxuIik7CisJCQkJcHJpbnRmKCJcbiIpOworCQl9CisKKwkJaWYgKChzdHJjbXAoY21kLCAicHRwcGxsIikgPT0gMCkgfHwgYWxsKSB7CisJCQkJcHJpbnRmKCJwdHBwbGwgKDB4NGYgNDo0KTogRGV0ZXJtaW5lcyB0aGUgcHRwcGxsOlxuIik7CisJCQkJcHJpbnRmKCJcdDB4MSA9IE11c3Qgd3JpdGUgMHgxLiBQVFAgUExMIHJ1bnMgQCAxMDkzLjc1TUh6LCBQVFAgQ2xvY2sgPSA1NDYuODc1TUh6XG4iKTsKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKworCQlpZiAoKHN0cmNtcChjbWQsICJwY2llZ2VuMSIpID09IDApIHx8IGFsbCkgeworCQkJCXByaW50ZigicGNpZWdlbjEgKDB4NGMuMSA0OjQpOiBEZXRlcm1pbmVzIHRoZSBwY2llZ2VuMTpcbiIpOworCQkJCXByaW50ZigiXHQweDAgPSBEbyBub3QgZm9yY2UgQkMyIFBDSWUgY29ubmVjdGlvbiB0byBHRU4xXG4iKTsKKwkJCQlwcmludGYoIlx0MHgxID0gRm9yY2UgQkMyIFBDSWUgY29ubmVjdGlvbiB0byBHRU4xXG4iKTsKKwkJCQlwcmludGYoIlxuIik7CisJCX0KKworCQlyZXR1cm4gMDsKKworCQl1c2FnZToKKwkJcHJpbnRmKCJVc2FnZTogU2F0ciAtIHNlZSBvcHRpb25zXG4iKTsKKwkJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZG9fc2FyX3JlYWRfYmMyKGludCBhcmdjLCBjaGFyICpjb25zdCBhcmd2W10pCit7CisKKy8qCisgICBiYzIgc2FtcGxlIGFuZCByZXNldCByZWdpc3RlcgorCisjICAgICA0ZiAgICAgICAjICAgICA0ZSAgICAgICAjICAgICA0ZCAgICAgICAjICAgICAgNGMgICAgICAjCisjICAgICAgICAgICAgICAjICAgICAgICAgICAgICAjICAgICAgICAgICAgICAjICAgICAgICAgICAgICAjCisjLS18LS18LS18LS18LS0jLS18LS18LS18LS18LS0jLS18LS18LS18LS18LS0jLS18LS18LS18LS18LS0jCisjICB8ICB8ICB8ICB8ICAjICB8ICB8ICB8ICB8ICAjICB8ICB8ICB8ICB8ICAjICB8ICB8ICB8ICB8ICAjCisjLS18LS18LS18LS18LS0jLS18LS18LS18LS18LS0jLS18LS18LS18LS18LS0jLS18LS18LS18LS18LS0jCisjICB8ICAgICAgICAgICAjICB8ICAgICAgICB8ICAjICAgICB8ICAgICAgICAjICAgICAgICAgICAgICAjCisjLVB8LVJ8Ym9vdHNlbC0jLVJ8LVRNLWYtLS18LUNQVS1mLS18LUNPUkUtZi0jLS0tLS1kZXZpZC0tLS0jCisKKworKi8KKworCQljb25zdCBjaGFyICpjbWQ7CisJCXZvbGF0aWxlIHVpbnQgc2F0cl9yZWc7CisKKwkJY21kID0gYXJndlswXTsKKworCQlpZiAoc3RyY21wKGNtZCwgImR1bXAiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPQorCQkJCSgodHJlYWRfYmMyKDB4NGMsIDApJjB4MWYpIDw8IDApIHwJLy8gNSBiaXRzCisJCQkJKCh0cmVhZF9iYzIoMHg0ZCwgMCkmMHgxZikgPDwgNSkgfAorCQkJCSgodHJlYWRfYmMyKDB4NGUsIDApJjB4MWYpIDw8IDEwKSB8CisJCQkJKCh0cmVhZF9iYzIoMHg0ZiwgMCkmMHgxZikgPDwgMTUpOworCQkJCXByaW50ZigiQkMyIFNAUiByYXcgcmVnaXN0ZXIgPSAweCUwOHhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJkZXZpZCIpID09IDApIHsKKwkJCQlzYXRyX3JlZyA9IHRyZWFkX2JjMigweDRjLCAwKSAmIDB4MWY7CisJCQkJcHJpbnRmKCJCQzIgU0BSIGRldmlkID0gMHglMDJ4XG4iLCBzYXRyX3JlZyk7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAiY29yZWZyZXEiKSA9PSAwKSB7CisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZCwgMCkgJiAweDA3OworCQkJCXByaW50ZigiQkMyIFNAUiBjb3JlZnJlcSA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJjcHVmcmVxIikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gKCh0cmVhZF9iYzIoMHg0ZCwgMCkgJiAweDE4KSA+PiAzKSB8ICgodHJlYWRfYmMyKDB4NGUsIDApICYgMHgwMSkgPDwgMik7CisJCQkJcHJpbnRmKCJCQzIgU0BSIGNwdWZyZXEgPSAweCV4XG4iLCBzYXRyX3JlZyk7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAidG1mcmVxIikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gKHRyZWFkX2JjMigweDRlLCAwKSAmIDB4MGUpID4+IDE7CisJCQkJcHJpbnRmKCJCQzIgU0BSIHRtZnJlcSA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJib290c2VsIikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGYsIDApICYgMHgwNzsKKwkJCQlwcmludGYoIkJDMiBTQFIgYm9vdHNlbCA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJqdGFnY3B1IikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gKHRyZWFkX2JjMigweDRmLCAwKSAmIDB4MDgpID4+IDM7CisJCQkJcHJpbnRmKCJCQzIgU0BSIGp0YWdjcHUgPSAweCV4XG4iLCBzYXRyX3JlZyk7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAicHRwcGxsIikgPT0gMCkgeworCQkJCXNhdHJfcmVnID0gKHRyZWFkX2JjMigweDRmLCAwKSAmIDB4MTApID4+IDQ7CisJCQkJcHJpbnRmKCJCQzIgU0BSIHB0cHBsbCA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJwY2llZ2VuMSIpID09IDApIHsKKwkJCQlzYXRyX3JlZyA9ICh0cmVhZF9iYzIoMHg0YywgMSkgJiAweDEwKSA+PiA0OworCQkJCXByaW50ZigiQkMyIFNAUiBwY2llZ2VuMSA9IDB4JXhcbiIsIHNhdHJfcmVnKTsKKwkJfQorCisJCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX3Nhcl93cml0ZV9iYzIoaW50IGFyZ2MsIGNoYXIgKmNvbnN0IGFyZ3ZbXSkKK3sKKwkJY29uc3QgY2hhciAqY21kOworCQl2b2xhdGlsZSB1aW50IHNhdHJfcmVnOworCQl2b2xhdGlsZSBpbnQgYml0X21hc2s7CisKKwkJY21kID0gYXJndlswXTsKKworCQlpZiAoc3RyY21wKGNtZCwgImRldmlkIikgPT0gMCkgeworCQkJCWJpdF9tYXNrID0gKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSAmIDB4MWYpOworCQkJCXR3cml0ZV9iYzIoMHg0YywgMCwgKE1WX1U4KWJpdF9tYXNrKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJjb3JlZnJlcSIpID09IDApIHsKKwkJCQliaXRfbWFzayA9IChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNikgJiAweDA3KTsKKwkJCQlzYXRyX3JlZyA9IHRyZWFkX2JjMigweDRkLCAwKSAmIDB4MWY7CisJCQkJc2F0cl9yZWcgPSAoc2F0cl9yZWcgJiAweDE4KSB8IGJpdF9tYXNrOworCQkJCXR3cml0ZV9iYzIoMHg0ZCwgMCwgKE1WX1U4KXNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJjcHVmcmVxIikgPT0gMCkgeworCQkJCWJpdF9tYXNrID0gKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSAmIDB4MDcpOworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGQsIDApICYgMHgxZjsKKwkJCQlzYXRyX3JlZyA9IChzYXRyX3JlZyAmIDB4MDcpIHwgKChiaXRfbWFzayAmIDB4MDMpIDw8IDMpOworCQkJCXR3cml0ZV9iYzIoMHg0ZCwgMCwgKE1WX1U4KXNhdHJfcmVnKTsKKworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGUsIDApICYgMHgxZjsKKwkJCQlzYXRyX3JlZyA9IChzYXRyX3JlZyAmIDB4MWUpIHwgKChiaXRfbWFzayAmIDB4MDQpID4+IDIpOworCQkJCXR3cml0ZV9iYzIoMHg0ZSwgMCwgKE1WX1U4KXNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJ0bWZyZXEiKSA9PSAwKSB7CisJCQkJYml0X21hc2sgPSAoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpICYgMHgwNyk7CisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZSwgMCkgJiAweDFmOworCQkJCXNhdHJfcmVnID0gKHNhdHJfcmVnICYgMHgxMSkgfCAoYml0X21hc2sgIDw8IDEpOworCQkJCXR3cml0ZV9iYzIoMHg0ZSwgMCwgKE1WX1U4KXNhdHJfcmVnKTsKKwkJfQorCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJib290c2VsIikgPT0gMCkgeworCQkJCWJpdF9tYXNrID0gKHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KSAmIDB4MDcpOworCQkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGYsIDApICYgMHgxZjsKKwkJCQlzYXRyX3JlZyA9IChzYXRyX3JlZyAmIDB4MTgpIHwgYml0X21hc2s7CisJCQkJdHdyaXRlX2JjMigweDRmLCAwLCAoTVZfVTgpc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgImp0YWdjcHUiKSA9PSAwKSB7CisJCQkJYml0X21hc2sgPSAoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpICYgMHgwMSk7CisJCQkJc2F0cl9yZWcgPSB0cmVhZF9iYzIoMHg0ZiwgMCkgJiAweDFmOworCQkJCXNhdHJfcmVnID0gKHNhdHJfcmVnICYgMHgxNykgfCAoYml0X21hc2sgPDwgMyk7CisJCQkJdHdyaXRlX2JjMigweDRmLCAwLCAoTVZfVTgpc2F0cl9yZWcpOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgInB0cHBsbCIpID09IDApIHsKKwkJCQliaXRfbWFzayA9IChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNikgJiAweDAxKTsKKwkJCQlzYXRyX3JlZyA9IHRyZWFkX2JjMigweDRmLCAwKSAmIDB4MWY7CisJCQkJc2F0cl9yZWcgPSAoc2F0cl9yZWcgJiAweDBmKSB8IChiaXRfbWFzayA8PCA0KTsKKwkJCQl0d3JpdGVfYmMyKDB4NGYsIDAsIChNVl9VOClzYXRyX3JlZyk7CisJCX0KKworCQllbHNlIGlmIChzdHJjbXAoY21kLCAicGNpZWdlbjEiKSA9PSAwKSB7CisJCQliaXRfbWFzayA9IChzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNikgJiAweDAxKTsKKwkJCXNhdHJfcmVnID0gdHJlYWRfYmMyKDB4NGMsIDEpICYgMHgxZjsKKwkJCXNhdHJfcmVnID0gKHNhdHJfcmVnICYgMHgwZikgfCAoYml0X21hc2sgPDwgNCk7CisJCQl0d3JpdGVfYmMyKDB4NGMsIDEsIChNVl9VOClzYXRyX3JlZyk7CisJCX0KKworCQlyZXR1cm4gMDsKK30KKworCisKK01WX1NUQVRVUyBjaGVja190d3NpX2JjMih2b2lkKQoreworCQlNVl9VOCByZWcgPSB0cmVhZF9iYzIoMHg0YywgMCk7CisJCURCKHByaW50ZigiXG5jaGVja190d3NpX2JjMjogcmVhZF9CQzI9IDB4JXhcbiIsIHJlZykpOworCQlpZiAocmVnID09IDB4ZmYpCisJCQkJcmV0dXJuIE1WX0VSUk9SOworCQllbHNlCisJCQkJcmV0dXJuIE1WX09LOworfQorCitpbnQgZG9fc2FyX2JjMihjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCisJCWNvbnN0IGNoYXIgKmNtZDsKKworCQkvKiBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KKwkJaWYgKGFyZ2MgPCAyKQorCQkJCWdvdG8gdXNhZ2U7CisKKwkJY21kID0gYXJndlsxXTsKKworCQlpZiAoY2hlY2tfdHdzaV9iYzIoKSA9PSBNVl9FUlJPUikgeworCQkJCXByaW50ZigiQkMyIHR3c2kgY2hhbm5lbCBub3QgY29ubmVjdGVkXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJfQorCisKKwkJaWYgKHN0cmNtcChjbWQsICJsaXN0IikgPT0gMCkKKwkJCQlyZXR1cm4gZG9fc2FyX2xpc3RfYmMyKGFyZ2MgLSAyLCBhcmd2ICsgMik7CisKKwkJZWxzZSBpZiAoc3RyY21wKGNtZCwgInJlYWQiKSA9PSAwKQorCQkJCXJldHVybiBkb19zYXJfcmVhZF9iYzIoYXJnYyAtIDIsIGFyZ3YgKyAyKTsKKworCisJCWVsc2UgaWYgKHN0cmNtcChjbWQsICJ3cml0ZSIpID09IDApIHsKKwkJCQlpZiAoZG9fc2FyX3dyaXRlX2JjMihhcmdjIC0gMiwgYXJndiArIDIpID09IDApIHsKKwkJCQkJCWRvX3Nhcl9yZWFkX2JjMihhcmdjIC0gMiwgYXJndiArIDIpOworCQkJCX0KKwkJCQlyZXR1cm4gMDsKKworCQl9CisKKwkJdXNhZ2U6CisJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCJCQzIgU2FtcGxlIEF0IFJlc2V0IHN1Yi1zeXN0ZW1cbiIpOworCQlwcmludGYoIlNhdFIgbGlzdCBjb3JlZnJlcSAgLSBwcmludCBjb3JlZnJlcSBsaXN0XG4iKTsKKwkJcHJpbnRmKCJTYXRSIGxpc3QgY3B1ZnJlcSAgIC0gcHJpbnQgY3B1ZnJlcSBsaXN0XG4iKTsKKwkJcHJpbnRmKCJTYXRSIGxpc3QgdG1mcmVxICAgIC0gcHJpbnQgdG1mcmVxIGxpc3RcbiIpOworCQlwcmludGYoIlNhdFIgbGlzdCBib290c2VsICAgLSBwcmludCBib29sc2VsIGxpc3RcbiIpOworCQlwcmludGYoIlNhdFIgbGlzdCBqdGFnY3B1ICAgLSBwcmludCBqdGFnY3B1IGxpc3RcbiIpOworCQlwcmludGYoIlNhdFIgbGlzdCBwdHBwbGwgICAgLSBwcmludCBwdHBwbGwgbGlzdFxuIik7CisJCXByaW50ZigiU2F0UiBsaXN0IHBjaWVnZW4xICAtIHByaW50IHBjaWVnZW4xIGxpc3RcbiIpOworCisJCXByaW50ZigiXG4iKTsKKworCQlwcmludGYoIlNhdFIgcmVhZCBkZXZpZCAgICAgLSByZWFkIGRldmljZSBpZFxuIik7CisJCXByaW50ZigiU2F0UiByZWFkIGNvcmVmcmVxICAtIHJlYWQgQ09SRSBmcmVxdWVuY3lcbiIpOworCQlwcmludGYoIlNhdFIgcmVhZCBjcHVmcmVxICAgLSByZWFkIENQVSBmcmVxdWVuY3lcbiIpOworCQlwcmludGYoIlNhdFIgcmVhZCB0bWZyZXEgICAgLSByZWFkIFRNIGZyZXF1ZW5jeVxuIik7CisJCXByaW50ZigiU2F0UiByZWFkIGJvb3RzZWwgICAtIHJlYWQgQm9vdCBzZWxlY3RcbiIpOworCQlwcmludGYoIlNhdFIgcmVhZCBqdGFnY3B1ICAgLSByZWFkIEpUQUcgQ1BVIHNlbGVjdGlvblxuIik7CisJCXByaW50ZigiU2F0UiByZWFkIHB0cHBsbCAgICAtIHJlYWQgUFRQIFBMTCBzZXR0aW5nXG4iKTsKKwkJcHJpbnRmKCJTYXRSIHJlYWQgcGNpZWdlbjEgIC0gcmVhZCBGb3JjZSBQQ0llIEdFTjEgc2V0dGluZ1xuIik7CisJCXByaW50ZigiU2F0UiByZWFkIGR1bXAgICAgICAtIHJlYWQgYWxsIHZhbHVlc1xuIik7CisJCXByaW50ZigiXG4iKTsKKworCQlwcmludGYoIlNhdFIgd3JpdGUgZGV2aWQgICAgPHZhbD4gLSB3cml0ZSBkZXZpY2UgaWRcbiIpOworCQlwcmludGYoIlNhdFIgd3JpdGUgY29yZWZyZXEgPHZhbD4gLSB3cml0ZSBDT1JFIGZyZXF1ZW5jeVxuIik7CisJCXByaW50ZigiU2F0UiB3cml0ZSBjcHVmcmVxICA8dmFsPiAtIHdyaXRlIENQVSAgZnJlcXVlbmN5XG4iKTsKKwkJcHJpbnRmKCJTYXRSIHdyaXRlIHRtZnJlcSAgIDx2YWw+IC0gd3JpdGUgVE0gZnJlcXVlbmN5XG4iKTsKKwkJcHJpbnRmKCJTYXRSIHdyaXRlIGJvb3RzZWwgIDx2YWw+IC0gd3JpdGUgQm9vdCBzZWxlY3RcbiIpOworCQlwcmludGYoIlNhdFIgd3JpdGUganRhZ2NwdSAgPHZhbD4gLSB3cml0ZSBKVEFHIENQVSBzZWxlY3Rpb25cbiIpOworCQlwcmludGYoIlNhdFIgd3JpdGUgcHRwcGxsICAgPHZhbD4gLSB3cml0ZSBQVFAgUExMIHNldHRpbmdcbiIpOworCQlwcmludGYoIlNhdFIgd3JpdGUgcGNpZWdlbjEgPHZhbD4gLSB3cml0ZSBGb3JjZSBQQ0llIEdFTjEgc2V0dGluZ1xuIik7CisKKwkJcmV0dXJuIDE7Cit9CisKKyNpZm5kZWYgTVZfTVNZUworLyogVGhpcyBmdW5jdGlvbiB1c2VkIGZvciBBTUMgKyByZW1vdGUgTVNZUyBjYXNlLiBUaGUgTVNZUyBzdGFuZGFsb25lIGltcGxlbWVudGF0aW9uIGRpZmZlcnMgKi8KK3N0YXRpYyBpbnQgZG9fcXNnbWlpX3NlbChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisKKwkJaW50IGJpdF9tYXNrOworCisJCWlmIChhcmdjIDwgMikKKwkJCQlnb3RvIHVzYWdlOworCisJCWlmIChjaGVja190d3NpX2JjMigpID09IE1WX0VSUk9SKSB7CisJCQkJcHJpbnRmKCJCQzIgdHdzaSBjaGFubmVsIG5vdCBjb25uZWN0ZWRcbiIpOworCQkJCXJldHVybiAxOworCQl9CisKKwkJYml0X21hc2sgPSAoc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpICYgMHgwMDAwZmZmZik7CisKKwkJdHdyaXRlX2JjMigweDIwLCAyLCAoTVZfVTgpKChiaXRfbWFzayA+PiAwKSAmIDB4ZmYpKTsKKwkJdHdyaXRlX2JjMigweDIwLCAzLCAoTVZfVTgpKChiaXRfbWFzayA+PiA4KSAmIDB4ZmYpKTsKKwkJdHdyaXRlX2JjMigweDIwLCA2LCAweDApOworCQl0d3JpdGVfYmMyKDB4MjAsIDcsIDB4MCk7CisJCXJldHVybiAxOworCisJCXVzYWdlOgorCQljbWRfdXNhZ2UoY21kdHApOworCQlyZXR1cm4gMTsKK30KKworCitVX0JPT1RfQ01EKAorCQkgIHFzZ21paV9zZWwsICAgICAgMiwgICAgIDEsICAgICAgZG9fcXNnbWlpX3NlbCwKKwkJICAiIFNlbGVjdCBTRlAgb3IgUVNHTUlJIG1vZGVzIG9uIGJjMi5cbiIsCisJCSAgIiBhcHBseSAxNiBiaXQgYXJyYXkgdG8gc2VsZWN0IFNGUCBvciBRU0dNSUkgbW9kZXMiCisJCSAgKTsKKworI2VuZGlmCisKKwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuYyBiL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLmMKaW5kZXggNTg4NWFhZi4uOGE1YjVjYyAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9zd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5jCkBAIC0yNDYsNiArMjQ2LDE5IEBACiAJIlxuICAgIC0gcHJpbnQgaW5mb3JtYXRpb24gZm9yIGFsbCBTUEkgRkxBU0ggbWVtb3J5IGJhbmtzXG4iCiApOwogCitzdGF0aWMgaW50IGlzU3dpdGNoaW5nU2VydmljZXNTdXBwb3J0ZWQodm9pZCkKK3sKKwlNVl9VMzIgZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CisKKwkvKiBlbmFibGUgY29tbWFuZCBvbmx5IGZvciBBQzMgJiBCQzIgJiBBTUMgYm9hcmRzICAqLworCWlmICghKChmYW1pbHkgPj0gTVZfQUxMRVlDQVQzX0RFVl9JRCAmJiBmYW1pbHkgPD0gTVZfQUxMRVlDQVQzX01BWF9ERVZfSUQpCisJCXx8IGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCB8fCBtdkJvYXJkaXNBbWMoKSkpIHsKKwkJcHJpbnRmKCJDb21tYW5kIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgU29DL0JvYXJkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBkb19jcHNzX2VudiAtIFNhdmUgQ1BTUyBlbnZpcm9tZW50IG9uIGZsYXNoCiAqCkBAIC0yNjMsNiArMjc2LDkgQEAKIHsKIAljaGFyIGJ1ZlsxMDI0XTsKIAorCWlmICghaXNTd2l0Y2hpbmdTZXJ2aWNlc1N1cHBvcnRlZCgpKQorCQlyZXR1cm4gMDsKKwogCXByaW50ZigiU2F2aW5nIGNwc3MgZW52aXJvbm1lbnQgdmFyaWFibGVcbiIpOwogCXNldGVudigic3RhbmRhbG9uZSIsICIiKTsKIAlzZXRlbnYoImJvb3RjbWQiLCAicnVuIHN0YW5kYWxvbmVfbXRkIik7CkBAIC0yNzcsNyArMjkzLDcgQEAKIAkJCQkJICJjb25zb2xlPSR7Y29uc29sZWRldn0sJHtiYXVkcmF0ZX0gJHtvdGhib290YXJnc30gJHtsaW51eF9wYXJ0c307IHRmdHAgJHtsaW51eF9sb2FkYWRkcn0gIgogCQkJCQkgIiR7aW1hZ2VfbmFtZX07Ym9vdG0gJHtsaW51eF9sb2FkYWRkcn0iKTsKIAotCXNwcmludGYoYnVmLCInc3BpX2ZsYXNoOiVkbShzcGlfdWJvb3Qpcm8sJWRtKHNwaV9rZXJuZWwpLCVkbShzcGlfcm9vdGZzKSwtKHJlbWFpbmRlcikiCisJc3ByaW50ZihidWYsIidtdGRwYXJ0cz1zcGlfZmxhc2g6JWRtKHNwaV91Ym9vdClybywlZG0oc3BpX2tlcm5lbCksJWRtKHNwaV9yb290ZnMpLC0ocmVtYWluZGVyKSIKIAkJIjthcm1hZGEtbmFuZDolZG0obmFuZF9rZXJuZWwpLC0obmFuZF9yb290ZnMpJyIsIENGR19BUFBMX0ZMQVNIX1BBUlRfVUJPT1RfU0laRSAvIF8xTSwKIAkJQ0ZHX0FQUExfU1BJX0ZMQVNIX1BBUlRfS0VSTkVMX1NJWkUgLyBfMU0sIENGR19BUFBMX1NQSV9GTEFTSF9QQVJUX1JPT1RGU19TSVpFIC8gXzFNLAogCQlDRkdfQVBQTF9OQU5EX0ZMQVNIX1BBUlRfS0VSTkVMX1NJWkUgLyBfMU0pOwpAQCAtMjkwLDcgKzMwNiw3IEBACiAJc3ByaW50ZihidWYsCiAJCSJzZiBwcm9iZTsgc2YgcmVhZCAke2xvYWRhZGRyfSAweCV4IDB4JXg7IHNldGVudiBib290YXJncyAke2NvbnNvbGV9ICIKIAkJImlwPSR7aXBhZGRyfToke3NlcnZlcmlwfToke2dhdGV3YXlpcH06JHtuZXRtYXNrfToke2hvc3RuYW1lfToke25ldGRldn06b2ZmICIKLQkJInJvb3Q9L2Rldi9tdGRibG9jazIgcncgaW5pdD0vbGludXhyYyByb290ZnN0eXBlPWpmZnMyIHJvb3R3YWl0IG10ZHBhcnRzPSR7bXRkcGFydHN9ICIKKwkJInJvb3Q9L2Rldi9tdGRibG9jazIgcncgaW5pdD0vbGludXhyYyByb290ZnN0eXBlPWpmZnMyIHJvb3R3YWl0ICR7bXRkcGFydHN9ICIKIAkJIiR7bXZOZXRDb25maWd9OyBib290bSAke2xvYWRhZGRyfSAiLAogCQlDRkdfQVBQTF9TUElfRkxBU0hfUEFSVF9LRVJORUxfU1RBUlQsIENGR19BUFBMX1NQSV9GTEFTSF9QQVJUX0tFUk5FTF9TSVpFKTsKICNpZm5kZWYgTVZfTkFORApAQCAtMzA0LDcgKzMyMCw3IEBACiAKICNpZmRlZiBNVl9OQU5ECiAJc3ByaW50ZihidWYsCi0JCSJuYW5kIHJlYWQgJHtsb2FkYWRkcn0gMHgleCAweCV4OyBzZXRlbnYgYm9vdGFyZ3MgJHtjb25zb2xlfSBtdGRwYXJ0cz0ke210ZHBhcnRzfSAiCisJCSJuYW5kIHJlYWQgJHtsb2FkYWRkcn0gMHgleCAweCV4OyBzZXRlbnYgYm9vdGFyZ3MgJHtjb25zb2xlfSAke210ZHBhcnRzfSAiCiAJCSJpcD0ke2lwYWRkcn06JHtzZXJ2ZXJpcH06JHtnYXRld2F5aXB9OiR7bmV0bWFza306JHtob3N0bmFtZX06JHtuZXRkZXZ9Om9mZiAiCiAJCSJ1YmkubXRkPTUgcm9vdD11YmkwOnJvb3Rmc19uYW5kIHJvIHJvb3Rmc3R5cGU9dWJpZnMgJHttdk5ldENvbmZpZ307IGJvb3RtIDB4MjAwMDAwMDsiICwKIAkJQ0ZHX0FQUExfTkFORF9GTEFTSF9QQVJUX0tFUk5FTF9TVEFSVCwKQEAgLTMyNCw3ICszNDAsOSBAQAogCSIiCiApOwogCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKIGV4dGVybiBzdHJ1Y3Qgc3BpX2ZsYXNoICpmbGFzaDsKKyNlbmRpZgogCiBzdHJ1Y3QgcGFydGl0aW9uSW5mb3JtYXRpb24gbmFuZEluZm8gPSB7CiAJLmRlZmF1bHRJbWFnZSA9ICJ1Ymlmc19hcm1fbmFuZC5pbWFnZSIsCkBAIC0zNTUsOCArMzczLDExIEBACiAJCXNwcmludGYoY21kQnVmLCAibmFuZCB3cml0ZS50cmltZmZzICV4ICV4ICV4XG4iLCBzb3VyY2UsIGRlc3RpbmF0aW9uLCBsZW4pOwogCQlwcmludGYoY21kQnVmKTsKIAkJcnVuX2NvbW1hbmQoY21kQnVmLCAwKTsKLQl9IGVsc2UKKwl9CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwllbHNlCiAJCXNwaV9mbGFzaF93cml0ZShmbGFzaCwgZGVzdGluYXRpb24sIGxlbiwgKGNvbnN0IHZvaWQgKilzb3VyY2UpOworI2VuZGlmCiB9CiAKIHZvaWQgZmxhc2hFcmFzZSAoTVZfVTMyIGRlc3RpbmF0aW9uLCBNVl9VMzIgbGVuLCBNVl9CT09MIGlzTmFuZCkKQEAgLTM2NiwxNCArMzg3LDE2IEBACiAJCXNwcmludGYoY21kQnVmLCAibmFuZCBlcmFzZSAleCAleFxuIiwgZGVzdGluYXRpb24sIGxlbik7CiAJCXByaW50ZihjbWRCdWYpOwogCQlydW5fY29tbWFuZChjbWRCdWYsIDApOwotCX0gZWxzZQorCX0KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQorCWVsc2UKIAkJc3BpX2ZsYXNoX2VyYXNlKGZsYXNoLCBkZXN0aW5hdGlvbiwgbGVuKTsKLQorI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgZG9fbXRkYnVybihjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCiB7Ci0JTVZfVTMyIGksIGZpbGVzaXplLCBhZGRyLCBzcmNfYWRkciwgZGVzdF9hZGRyOworCU1WX1UzMiBpLCBhZGRyLCBzcmNfYWRkciwgZGVzdF9hZGRyOwogCU1WX1UzMiBrZXJuZWxfdW5jX2xlbiwgcm9vdGZzX3VuY19sZW4gPSAwLCB1bmNfbGVuLCBzcmNfbGVuOwogCU1WX1UzMiBrZXJuZWxfYWRkciA9IENGR19ERUZfS0VSTkVMX0RFU1RfQUREUjsKIAlNVl9VMzIgcm9vdGZzX2FkZHIgPSBDRkdfREVGX1JPT1RGU19ERVNUX0FERFI7CkBAIC0zODUsNyArNDA4LDEwIEBACiAJTVZfVTMyIGZzeXMgPSBGU19UWVBFX0ZBVDsJCQkJLyogZGVmYXVsdCBGUyA9IEZBVCAqLwogCU1WX0JPT0wgaXNOYW5kID0gTVZfVFJVRTsJCQkJLyogZGVmYXVsdCBkZXN0aW5hdGlvbiA9IE5BTkQgKi8KIAlhZGRyID0gbG9hZF9hZGRyID0gQ0ZHX0RFRl9TT1VSQ0VfTE9BRF9BRERSOwotCWludCBmaWxlU2l6ZUZyb21SYW0gPSAtMTsKKwlpbnQgZmlsZXNpemUsIGZpbGVTaXplRnJvbVJhbSA9IC0xOworCisJaWYgKCFpc1N3aXRjaGluZ1NlcnZpY2VzU3VwcG9ydGVkKCkpCisJCXJldHVybiAwOwogCiAJLyogc2NhbiBmb3IgZmxhc2ggZGVzdGluYXRpb24gaW4gYXJndW1lbnRzIChhbGxvd2luZyB1c2FnZSBvZiBvbmx5ICdtdGRidXJuIHNwaScpICovCiAJZm9yIChpID0gMSA7IGkgPCBhcmdjIDsgaSsrKSB7CkBAIC00MDMsMzAgKzQyOSwyOSBAQAogCQlmaWxlU2l6ZUZyb21SYW0gPSBzaW1wbGVfc3RydG91bChhcmd2WzZdLCBOVUxMLCAxNik7CiAJY2FzZSA2Oi8qIGFyZyM2IGlzIGZsYXNoIGRlc3RpbmF0aW9uLCBzY2FubmVkIHByZXZpb3VzbHkgLS0+IGZhbGwgdG8gNSovCiAJY2FzZSA1OgotCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgYXJndls0XSwgc2l6ZW9mKEJvb3RGaWxlKSk7CisJCWlmKHN0cmNtcChhcmd2WzRdLCAiRVhUMiIpID09IDApCisJCQlmc3lzID0gRlNfVFlQRV9FWFQ7CiAJCS8qIGZhbGwgdG8gNCovCiAJY2FzZSA0OgotCQlpZihzdHJjbXAoYXJndlszXSwgIkVYVDIiKSA9PSAwKQotCQkJZnN5cyA9IEZTX1RZUEVfRVhUOworCQlkZXZQYXJ0ID0gYXJndlszXTsKIAkJLyogZmFsbCB0byAzKi8KIAljYXNlIDM6Ci0JCWRldlBhcnQgPSBhcmd2WzJdOwotCQkvKiBmYWxsIHRvIDIqLwotCWNhc2UgMjoKLQkJaWYoc3RyY21wKGFyZ3ZbMV0sICJ1c2IiKSA9PSAwKQorCQlpZihzdHJjbXAoYXJndlsyXSwgInVzYiIpID09IDApCiAJCQlsb2FkZnJvbSA9IDE7Ci0JCWVsc2UgaWYoc3RyY21wKGFyZ3ZbMV0sICJtbWMiKSA9PSAwKQorCQllbHNlIGlmKHN0cmNtcChhcmd2WzJdLCAibW1jIikgPT0gMCkKIAkJCWxvYWRmcm9tID0gMjsKLQkJZWxzZSBpZihzdHJjbXAoYXJndlsxXSwgInJhbSIpID09IDApIHsKKwkJZWxzZSBpZihzdHJjbXAoYXJndlsyXSwgInJhbSIpID09IDApIHsKIAkJCWxvYWRmcm9tID0gMzsKIAkJCWlmIChkZXZQYXJ0ICE9IE5VTEwpCiAJCQkJYWRkciA9IGxvYWRfYWRkciA9ICh1bnNpZ25lZCBpbnQpc2ltcGxlX3N0cnRvdWwoZGV2UGFydCwgTlVMTCwgMTYpOwogCQl9CiAJCWlmICgobG9hZGZyb20gPT0gMSB8fCBsb2FkZnJvbSA9PSAyKSAmJiBkZXZQYXJ0ID09IE5VTEwpIC8qIGlmIHVzaW5nIFVTQi9NTUMsIGFuZCBub3Qgc2VsZWN0ZWQgaW50ZXJmYWNlIG51bSAqLwogCQkJZGV2UGFydCA9ICIwIjsJCQkJCSAvKiBkZWZhdWx0IGludGVyZmFjZSBudW1iZXIgaXMgMCAqLwotCQkvKiBmYWxsIHRvIDEqLworCQkvKiBmYWxsIHRvIDIqLworCWNhc2UgMjoKKwkJY29weV9maWxlbmFtZSAoQm9vdEZpbGUsIGFyZ3ZbMV0sIHNpemVvZihCb290RmlsZSkpOwogCWNhc2UgMTogICAgLyogbm8gcGFyYW1ldGVyIGFsbCBkZWZhdWx0ICovCi0JCWlmKGFyZ2MgPCA0KQorCQlpZiAoYXJnYyA8IDIpCiAJCQljb3B5X2ZpbGVuYW1lIChCb290RmlsZSwgcGFydGl0aW9uSW5mby0+ZGVmYXVsdEltYWdlLCBzaXplb2YoQm9vdEZpbGUpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQ1MSwxMiArNDc2LDE5IEBACiAJaWYgKG12VmVyaWZ5UmVxdWVzdCgpID09IE1WX0ZBTFNFKQogCQlyZXR1cm4gMDsKIAotCWlmIChpc05hbmQgPT0gTVZfRkFMU0UgJiYgIWZsYXNoKSB7Ci0JCWZsYXNoID0gc3BpX2ZsYXNoX3Byb2JlKDAsIDAsIENPTkZJR19TRl9ERUZBVUxUX1NQRUVELCBDT05GSUdfU0ZfREVGQVVMVF9NT0RFKTsKKwlpZiAoaXNOYW5kID09IE1WX0ZBTFNFKSB7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKIAkJaWYgKCFmbGFzaCkgewotCQkJcHJpbnRmKCJGYWlsZWQgdG8gcHJvYmUgU1BJIEZsYXNoXG4iKTsKLQkJCXJldHVybiAwOworCQkJZmxhc2ggPSBzcGlfZmxhc2hfcHJvYmUoMCwgMCwgQ09ORklHX1NGX0RFRkFVTFRfU1BFRUQsIENPTkZJR19TRl9ERUZBVUxUX01PREUpOworCQkJaWYgKCFmbGFzaCkgeworCQkJCXByaW50ZigiRmFpbGVkIHRvIHByb2JlIFNQSSBGbGFzaFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KKyNlbHNlCisJCXByaW50ZigiU1BJIEZsYXNoIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gMDsKKyNlbmRpZgogCX0KIAogCS8qIEZldGNoIHJlcXVlc3RlZCBmaWxlLCBmaWxlc2l6ZSBpcyBuZWVkZWQgZm9yIHNpbmdsZSBpbWFnZSBvbmx5ICovCkBAIC01NTEsMTAgKzU4MywxMSBAQAogCX0KIAogCS8qIEVyYXNlIGVudGlyZSBOQU5EIGZsYXNoIC0gYXZvaWQgaW52YWxpZCBmaWxlIHN5c3RlbSBwcmVwYXJhdGlvbnMgKi8KLQlwcmludGYoIlxuR29pbmcgdG8gZXJhc2UgdGhlIGVudGlyZSBOQU5EIGZsYXNoLiAiKTsKLQlpZiAobXZWZXJpZnlSZXF1ZXN0KCkgPT0gTVZfVFJVRSkKLQkJcnVuX2NvbW1hbmQoIm5hbmQgZXJhc2UuY2hpcCIsIDApOwotCisJaWYgKGlzTmFuZCA9PSBNVl9UUlVFKSB7CisJCXByaW50ZigiXG5Hb2luZyB0byBlcmFzZSB0aGUgZW50aXJlIE5BTkQgZmxhc2guICIpOworCQlpZiAobXZWZXJpZnlSZXF1ZXN0KCkgPT0gTVZfVFJVRSkKKwkJCXJ1bl9jb21tYW5kKCJuYW5kIGVyYXNlLmNoaXAiLCAwKTsKKwl9CiAJcHJpbnRmKCJcbkJ1cm5pbmcgJXMgb24gZmxhc2ggYXQgMHglMDh4LCBsZW5ndGg9JWRLXG4iLAogCQkoc2luZ2xlX2ZpbGUpID8gInNpbmdsZSBpbWFnZSIgOiAia2VybmVsIiwKIAkJcGFydGl0aW9uSW5mby0+S0VSTkVMX1NUQVJULCBrZXJuZWxfdW5jX2xlbi9fMUspOwpAQCAtNTkzLDE0ICs2MjYsMTUgQEAKIFVfQk9PVF9DTUQoCiAJbXRkYnVybiwgICAgICA2LCAgICAgMSwgICAgICBkb19tdGRidXJuLAogCSJCdXJuIGEgTGludXggaW1hZ2UgYW5kIEZpbGVzeXN0ZW1gIG9uIHRoZSBOQU5EL1NQSSBmbGFzaC5cbiIsCi0JIltpbnRlcmZhY2UgWzxkZXZbOnBhcnRdPiAgW0ZpbGUgc3lzdGVtIFtmaWxlbmFtZV1dXV0gW2ZsYXNoIGRlc3RpbmF0aW9uXSBbc2luZ2xlIGZpbGUgc2l6ZSBvbiBSQU1dXG4iCisJIltmaWxlbmFtZSBbaW50ZXJmYWNlIFs8ZGV2WzpwYXJ0XT4gW0ZpbGUgc3lzdGVtXV1dXSBbZmxhc2ggZGVzdGluYXRpb25dIFtzaW5nbGUgZmlsZSBzaXplIG9uIFJBTV1cbiIKIAkiXHRpbnRlcmZhY2UgIDogcmFtIDxsb2FkIGFkZHJlc3M+LCB0ZnRwLCBvciBtbWMvdXNiIDxpbnRlcmZhY2VfbnVtPiAoZGVmYXVsdCBpcyB0ZnRwKVxuIgogCSJcdEZpbGUgc3lzdGVtOiBGQVQgb3IgRVhUMiAoZGVmYXVsdCBpcyBGQVQpLlxuIgogCSJcdE5BTkQgZGVmYXVsdCBmaWxlLW5hbWUgaXMgdWJpZnNfYXJtX25hbmQuaW1hZ2UuXG4iCiAJIlx0U1BJIGRlZmF1bHQgZmlsZS1uYW1lIGlzIGpmZnMyX2FybS5pbWFnZS5cbiIKIAkiXHRGbGFzaCBEZXN0aW5hdGlvbjogbmFuZCBvciBzcGkgKGRlZmF1bHQgaXMgbmFuZCkuIFxuIgotCSJcdGUuZy4gTU1DOiAnbXRkYnVybiBtbWMgMCBGQVQgdWJpZnNfYXJtX25hbmQuaW1hZ2UgbmFuZCdcbiIKLQkiXHRlLmcuIFJBTTogJ210ZGJ1cm4gcmFtIDUwMDAwMDAgbmFuZCdcbiIKKwkiXHRlLmcuIFRGVFA6ICdtdGRidXJuIHViaWZzX2FybV9uYW5kLmltYWdlJ1xuIgorCSJcdGUuZy4gTU1DOiAnbXRkYnVybiB1Ymlmc19hcm1fbmFuZC5pbWFnZSBtbWMgMCBGQVQgbmFuZCdcbiIKKwkiXHRlLmcuIFJBTTogJ210ZGJ1cm4gdWJpZnNfYXJtX25hbmQuaW1hZ2UgcmFtIDUwMDAwMDAgbmFuZCdcbiIKIAogKTsKIApAQCAtNzkxLDYgKzgyNSw3IEBACiAJCXJldHVybiBzaWx0OwogfQogCisjaWZkZWYgTVZfTVNZUwogc3RhdGljIGludCBkb19xc2dtaWlfc2VsKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKIHsKIApAQCAtODIxLDYgKzg1Niw3IEBACiAJCSAgIiBTZWxlY3QgU0ZQIG9yIFFTR01JSSBtb2RlcyBvbiBiYzIuXG4iLAogCQkgICIgYXBwbHkgMTYgYml0IGFycmF5IHRvIHNlbGVjdCBTRlAgb3IgUVNHTUlJIG1vZGVzIgogCQkgICk7CisjZW5kaWYKIAogdm9pZCBod1NlcnZpY2VzTGF0ZUluaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLmggYi9ib2FyZC9tdl9lYnUvY29tbW9uL1VTUC9zd2l0Y2hpbmdTZXJ2aWNlcy9zd2l0Y2hpbmdTZXJ2aWNlcy5oCmluZGV4IGFiNDBkYWEuLjM4ZTIxZDQgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vVVNQL3N3aXRjaGluZ1NlcnZpY2VzL3N3aXRjaGluZ1NlcnZpY2VzLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9VU1Avc3dpdGNoaW5nU2VydmljZXMvc3dpdGNoaW5nU2VydmljZXMuaApAQCAtMTQzLDEwICsxNDMsMTAgQEAKIAkJU0lMVF9OUDUsCiAJCVNJTFRfQkMyLAogCQlTSUxUX09USEVSLAotCQlTTElDX05PVF9ERVRFQ1QgPSAweDVhNWEKKwkJU0lMVF9OT1RfREVURUNUID0gMHg1YTVhCiB9IFNJTElDT05fVFlQRTsKIAogU0lMSUNPTl9UWVBFIGdldF9hdHRhY2hlZF9zaWxpY29uX3R5cGUodm9pZCk7CiBpbnQgZG9fc2FyX2JjMihjbWRfdGJsX3QgKiBjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKLQordm9pZCBod1NlcnZpY2VzTGF0ZUluaXQodm9pZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vY29tbW9uL212Q29tbW9uLmggYi9ib2FyZC9tdl9lYnUvY29tbW9uL2NvbW1vbi9tdkNvbW1vbi5oCmluZGV4IDQwNWZkM2MuLmJjNWVmODQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vY29tbW9uL212Q29tbW9uLmgKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9jb21tb24vbXZDb21tb24uaApAQCAtMjMxLDYgKzIzMSw3IEBACiAjZGVmaW5lIF8yRyAgICAgICAgIDB4ODAwMDAwMDAKIAogLyogVGNsb2NrIGFuZCBTeXMgY2xvY2sgZGVmaW5lICovCisjZGVmaW5lIF81ME1IeiAgICAgIDUwMDAwMDAwCiAjZGVmaW5lIF8xMDBNSHogICAgIDEwMDAwMDAwMAogI2RlZmluZSBfMTI1TUh6ICAgICAxMjUwMDAwMDAKICNkZWZpbmUgXzEzM01IeiAgICAgMTMzMzMzMzM0CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL2NvbW1vbi9tdkRldmljZUlkLmggYi9ib2FyZC9tdl9lYnUvY29tbW9uL2NvbW1vbi9tdkRldmljZUlkLmgKaW5kZXggNGM4NGUxNS4uZGRjYjUwMyAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9jb21tb24vbXZEZXZpY2VJZC5oCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vY29tbW9uL212RGV2aWNlSWQuaApAQCAtNDAwLDYgKzQwMCwxMCBAQAogI2RlZmluZSBNVl82ODExX0RFVl9JRAkJMHg2ODExCiAjZGVmaW5lIE1WXzY4MjBfREVWX0lECQkweDY4MjAKICNkZWZpbmUgTVZfNjgyOF9ERVZfSUQJCTB4NjgyOAorI2RlZmluZSBNVl82VzIyX0RFVl9JRAkJMHg2ODIzIC8qIDZXMjI9QTM4MyAqLworI2RlZmluZSBNVl82VzIzX0RFVl9JRAkJMHg2ODI0IC8qIDZXMjM9QTM4NCAqLworI2RlZmluZSBNVl82VzIyX0RFVl9OQU1FCSI2VzIyIgorI2RlZmluZSBNVl82VzIzX0RFVl9OQU1FCSI2VzIzIgogCiAvKiBBMzh4IHJldmlzaW9ucyAqLwogI2RlZmluZSBNVl84OEY2OFhYX1oxX0lECQkweDAKQEAgLTQzOCwxMSArNDQyLDQ2IEBACiAJTVZfQk9CQ0FUMl9CMF9OQU1FLFwKIH0KIAorLyogQm9iSyAgRmFtaWx5ICovCisjZGVmaW5lIE1WX0JPQktfREVWX0lECQkweEJDMDAKKworLyogQm9iSyBkZWl2Y2VzIG1hdHJpeCAqLworI2RlZmluZSBNVl9CT0JLX0NFVFVTXzk4RFg0MjM1X0RFVl9JRAkJMHhCRTAwCisjZGVmaW5lIE1WX0JPQktfQ0FFTFVNXzk4RFg0MjAzX0RFVl9JRAkJMHhCQzAwCisjZGVmaW5lIE1WX0JPQktfTEVXSVNfOThEWDgyMTJfREVWX0lECQkweEJFMTAKKworLyogQm9iSyAgUmV2aXNpb25zICovCisjZGVmaW5lIE1WX0JPQktfQTBfSUQJCTB4MAorI2RlZmluZSBNVl9CT0JLX0EwX05BTUUJCSJBMCIKKworI2RlZmluZSBNVl9CT0JLX0lEX0FSUkFZIHsgXAorCSBNVl9CT0JLX0EwX05BTUUsXAorfQorCiAgLyogTGlvbjIgIEZhbWlseSAqLwogI2RlZmluZSBNVl9MSU9OMl9ERVZfSUQJCTB4ODAwMAogCiAvKiBBbGxleUNhdDMgIEZhbWlseSAqLwogI2RlZmluZSBNVl9BTExFWUNBVDNfREVWX0lECQkweEY0MDAKKyNkZWZpbmUgTVZfQUxMRVlDQVQzX01BWF9ERVZfSUQJCTB4RjRGRgorCisvKiBBbGxleUNhdDMvUG9tY2F0MyBkZWl2Y2VzIG1hdHJpeCAqLworI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMzMzZfREVWX0lECTB4RjQwMAorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMzMzVfREVWX0lECTB4RjQwMQorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMzMzRfREVWX0lECTB4RjQwMgorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMzMzNfREVWX0lECTB4RjQwMworI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDEyMzNfREVWX0lECTB4RjQwOAorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDEyMzVfREVWX0lECTB4RjQwOQorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMyMzZfREVWX0lECTB4RjQxMAorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMyMzVfREVWX0lECTB4RjQxMQorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMyMzRfREVWX0lECTB4RjQxMgorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDMyMzNfREVWX0lECTB4RjQxMworI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWEgzMzNfREVWX0lECTB4RjQxNAorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDEzMzNfREVWX0lECTB4RjQxOAorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDEzMzVfREVWX0lECTB4RjQxOQorI2RlZmluZSBNVl9BTExFWUNBVDNfOThEWDEzMzZfREVWX0lECTB4RjQxQQorCisjZGVmaW5lIE1WX01BWF9ERVZfSUQJCQkweEZGRkYKIAogLyogQWxsZXlDYXQzICBSZXZpc2lvbnMgKi8KICNkZWZpbmUgTVZfQUxMRVlDQVQzX0EwX0lECQkweDMKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL2Nlc2EvbXZDZXNhLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9jZXNhL212Q2VzYS5jCmluZGV4IGIzOWE4YzUuLjk5NzNlMGMgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL2Nlc2EvbXZDZXNhLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvY2VzYS9tdkNlc2EuYwpAQCAtMTAyNiwyNiArMTAyNiwxNCBAQAogCQkJCXJldHVybiBNVl9PVVRfT0ZfQ1BVX01FTTsKIAkJCX0KIAkJCXN0YXR1cyA9IG12Q2VzYUZyYWdSZXFQcm9jZXNzKGNoYW4sIHBSZXEsIGZyYWcpOwotCQkJaWYgKHN0YXR1cyA9PSBNVl9PSykgewotI2lmIGRlZmluZWQoTVZfQ0VTQV9DSEFJTl9NT0RFKSB8fCBkZWZpbmVkKE1WX0NFU0FfSU5UX0NPQUxFU0NJTkdfU1VQUE9SVCkgfHwgXAotCQkJCQkJCSAgICAgZGVmaW5lZChDT05GSUdfT0YpCi0jaWZkZWYgQ09ORklHX09GCi0JCQkJaWYgKChtdl9jZXNhX2ZlYXR1cmUgPT0gSU5UX0NPQUxFU0NJTkcpIHx8Ci0JCQkJCQkobXZfY2VzYV9mZWF0dXJlID09IENIQUlOKSkgewotI2VuZGlmIC8qIENPTkZJR19PRiAqLwotCQkJCQlpZiAoZnJhZykgewotCQkJCQkJcFJlcS0+ZG1hW2ZyYWcgLSAxXS5wRG1hTGFzdC0+cGh5TmV4dERlc2NQdHIgPQotCQkJCQkJICAgIE1WXzMyQklUX0xFKG12Q2VzYVZpcnRUb1BoeXMoJnBSZXEtPmRtYURlc2NCdWYsCi0JCQkJCQkJcFJlcS0+ZG1hW2ZyYWddLnBEbWFGaXJzdCkpOwotCQkJCQkJbXZPc0NhY2hlRmx1c2goY2VzYU9zSGFuZGxlLCBwUmVxLT5kbWFbZnJhZyAtIDFdLnBEbWFMYXN0LAotCQkJCQkJICAgIHNpemVvZihNVl9ETUFfREVTQykpOwotCQkJCQl9Ci0jaWZkZWYgQ09ORklHX09GCi0JCQkJfQotI2VuZGlmIC8qIENPTkZJR19PRiAqLwotI2VuZGlmIC8qIE1WX0NFU0FfQ0hBSU5fTU9ERSB8fCBNVl9DRVNBX0lOVF9DT0FMRVNDSU5HX1NVUFBPUlQgfHwgQ09ORklHX09GKi8KLQkJCQlmcmFnKys7CisJCQlpZiAoc3RhdHVzID09IE1WX09LICYmIGZyYWcpIHsKKwkJCQlwUmVxLT5kbWFbZnJhZyAtIDFdLnBEbWFMYXN0LT5waHlOZXh0RGVzY1B0ciA9CisJCQkJCU1WXzMyQklUX0xFKG12Q2VzYVZpcnRUb1BoeXMoJnBSZXEtPmRtYURlc2NCdWYsCisJCQkJCQkgICAgcFJlcS0+ZG1hW2ZyYWddLnBEbWFGaXJzdCkpOworCQkJCW12T3NDYWNoZUZsdXNoKGNlc2FPc0hhbmRsZSwgcFJlcS0+ZG1hW2ZyYWcgLSAxXS5wRG1hTGFzdCwKKwkJCQkJICAgICAgIHNpemVvZihNVl9ETUFfREVTQykpOwogCQkJfQorCQkJZnJhZysrOwogCQl9CiAJCXBSZXEtPmZyYWdzLm51bUZyYWcgPSBmcmFnOwogCkBAIC0xMjgyLDEyICsxMjcwLDggQEAKIAkJTVZfVTggKnBOZXdEaWdlc3Q7CiAJCWludCBmcmFnOwogCi0jaWYgZGVmaW5lZChNVl9DRVNBX0NIQUlOX01PREUpIHx8IGRlZmluZWQoTVZfQ0VTQV9JTlRfQ09BTEVTQ0lOR19TVVBQT1JUKSB8fCBcCi0JCQkJCQkJICAgICBkZWZpbmVkKENPTkZJR19PRikKIAkJcFJlcS0+ZnJhZ3MubmV4dEZyYWcgPSAxOwogCQl3aGlsZSAocFJlcS0+ZnJhZ3MubmV4dEZyYWcgPD0gcFJlcS0+ZnJhZ3MubnVtRnJhZykgewotI2VuZGlmCi0KIAkJCWZyYWcgPSAocFJlcS0+ZnJhZ3MubmV4dEZyYWcgLSAxKTsKIAogCQkJLyogUmVzdG9yZSBETUEgZGVzY3JpcHRvciBsaXN0ICovCkBAIC0xMzI5LDE5ICsxMzEzLDggQEAKIAkJCQl9CiAJCQkJcmVhZHlTdGF0dXMgPSBNVl9PSzsKIAkJCX0KLSNpZiBkZWZpbmVkKE1WX0NFU0FfQ0hBSU5fTU9ERSkgfHwgZGVmaW5lZChNVl9DRVNBX0lOVF9DT0FMRVNDSU5HX1NVUFBPUlQpIHx8IFwKLQkJCQkJCQkgICAgIGRlZmluZWQoQ09ORklHX09GKQotI2lmZGVmIENPTkZJR19PRgotCQlpZiAoKG12X2Nlc2FfZmVhdHVyZSA9PSBJTlRfQ09BTEVTQ0lORykgfHwKLQkJCQkJKG12X2Nlc2FfZmVhdHVyZSA9PSBDSEFJTikpCiAJCQlwUmVxLT5mcmFncy5uZXh0RnJhZysrOwotCQllbHNlCi0JCQlicmVhazsKLSNlbHNlIC8qIENPTkZJR19PRiAqLwotCQkJcFJlcS0+ZnJhZ3MubmV4dEZyYWcrKzsKLSNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAkJfQotI2VuZGlmIC8qIE1WX0NFU0FfQ0hBSU5fTU9ERSB8fCBNVl9DRVNBX0lOVF9DT0FMRVNDSU5HX1NVUFBPUlQgfHwgQ09ORklHX09GICovCiAJfSBlbHNlIHsKIAkJbXZDZXNhTWJ1ZkNhY2hlVW5tYXAocFJlcS0+cENtZC0+cERzdCwgMCwgcFJlcS0+cENtZC0+cERzdC0+bWJ1ZlNpemUpOwogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9uZXRhL2diZS9tdk5ldGEuaCBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YS5oCmluZGV4IDEyNTE5ZTUuLjQ0OTI4MTQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YS5oCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YS5oCkBAIC0zNDYsNiArMzQ2LDkgQEAKICNkZWZpbmUgTVZfTkVUQV9RVUVVRV9QUkVWX0RFU0MocFF1ZXVlQ3RybCwgZGVzY0lkeCkgIFwKICAgICAoKChkZXNjSWR4KSA+IDApID8gKChkZXNjSWR4KSAtIDEpIDogKHBRdWV1ZUN0cmwpLT5sYXN0RGVzYykKIAorI2RlZmluZSBNVl9ORVRBX1JYX0xBU1RfREVTQ19QVFIocFF1ZXVlQ3RybCkgIFwKKwkoKChORVRBX1JYX0RFU0MgKilwUXVldWVDdHJsLnBGaXJzdCkgKyBwUXVldWVDdHJsLmxhc3REZXNjKQorCiB0eXBlZGVmIHN0cnVjdCB7CiAJTVZfTkVUQV9RVUVVRV9DVFJMIHF1ZXVlQ3RybDsKIApAQCAtNjIyLDYgKzYyNSwxOSBAQAogCXJldHVybiBwUnhEZXNjOwogfQogCisvKiBHZXQgdGhlIG5leHQgZGVzYyBwb2ludGVyIGZvbGxvd2luZyBjdXJyZW50IGRlc2MgKi8KK3N0YXRpYyBJTkxJTkUgTkVUQV9SWF9ERVNDICptdk5ldGFSeHFOZXh0RGVzY1B0cihNVl9ORVRBX1JYUV9DVFJMICpwUnhxLCBORVRBX1JYX0RFU0MgKnBSeERlc2MpCit7CisJTkVUQV9SWF9ERVNDICpwTmV4dERlc2M7CisKKwlpZiAocFJ4RGVzYyA9PSBNVl9ORVRBX1JYX0xBU1RfREVTQ19QVFIocFJ4cS0+cXVldWVDdHJsKSkKKwkJcE5leHREZXNjID0gKE5FVEFfUlhfREVTQyAqKXBSeHEtPnF1ZXVlQ3RybC5wRmlyc3Q7CisJZWxzZQorCQlwTmV4dERlc2MgPSArK3BSeERlc2M7CisKKwlyZXR1cm4gcE5leHREZXNjOworfQorCiBzdGF0aWMgSU5MSU5FIE5FVEFfUlhfREVTQyAqbXZOZXRhUnhxRGVzY0dldChNVl9ORVRBX1JYUV9DVFJMICpwUnhxKQogewogCU5FVEFfUlhfREVTQwkqcFJ4RGVzYzsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YURlYnVnLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9uZXRhL2diZS9tdk5ldGFEZWJ1Zy5jCmluZGV4IDM2OGU5YTUuLjM3ZjVlNjkgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvZ2JlL212TmV0YURlYnVnLmMKKysrIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9nYmUvbXZOZXRhRGVidWcuYwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJCQkJICAgaSwgcFJ4RGVzYywgcFJ4RGVzYy0+c3RhdHVzLAogCQkJCSAgIHBSeERlc2MtPmRhdGFTaXplLCAoTVZfVTMyKSBwUnhEZXNjLT5idWZQaHlzQWRkciwgKE1WX1UzMikgcFJ4RGVzYy0+YnVmQ29va2llKTsKIAotCQkJbXZPc0NhY2hlTGluZUludihOVUxMLCBwUnhEZXNjKTsKKwkJCW12T3NDYWNoZUxpbmVJbnYocFBvcnRDdHJsLT5vc0hhbmRsZSwgcFJ4RGVzYyk7CiAJCX0KIAl9CiB9CkBAIC01NDEsNyArNTQxLDcgQEAKIAkJCQkgICBpLCBwVHhEZXNjLCBwVHhEZXNjLT5jb21tYW5kLCBwVHhEZXNjLT5kYXRhU2l6ZSwKIAkJCQkgICAoTVZfVTMyKSBwVHhEZXNjLT5idWZQaHlzQWRkciwgcFR4RGVzYy0+aHdfY21kKTsKIAotCQkJbXZPc0NhY2hlTGluZUludihOVUxMLCBwVHhEZXNjKTsKKwkJCW12T3NDYWNoZUxpbmVJbnYocFBvcnRDdHJsLT5vc0hhbmRsZSwgcFR4RGVzYyk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9uZXRhL3BuYy9tdlBuYy5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvbmV0YS9wbmMvbXZQbmMuYwppbmRleCA2NDhkNmUzLi40OTNlYzUwIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9uZXRhL3BuYy9tdlBuYy5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL25ldGEvcG5jL212UG5jLmMKQEAgLTEzOCwxMCArMTM4LDcgQEAKIAkJfHwgY3RybF9tb2RlbCA9PSBNVjg4RjY1NjBfREVWX0lEKSB7CiAJCS8qIEFybWFkYSBLVzIgSUQgKi8KIAkJbWVtY3B5KCZnYmVfcG5jX21hcCwgJmdiZV9wbmNfbWFwX2t3Miwgc2l6ZW9mKGdiZV9wbmNfbWFwX2t3MikpOwotCX0gZWxzZSBpZiAoY3RybF9tb2RlbCA9PSBNVjg4RjY4MTBfREVWX0lECi0JCXx8IGN0cmxfbW9kZWwgPT0gTVY4OEY2ODExX0RFVl9JRAotCQl8fCBjdHJsX21vZGVsID09IE1WODhGNjgyMF9ERVZfSUQKLQkJfHwgY3RybF9tb2RlbCA9PSBNVjg4RjY4MjhfREVWX0lEKSB7CisJfSBlbHNlIGlmICgoY3RybF9tb2RlbCAmIH4weEZGKSA9PSBNVl84OEY2OFhYKSB7CiAJCS8qIEFybWFkYSBBMzh4IElEICovCiAJCW1lbWNweSgmZ2JlX3BuY19tYXAsICZnYmVfcG5jX21hcF8zOHgsIHNpemVvZihnYmVfcG5jX21hcF8zOHgpKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvcWQtZHNkdC0zLjMvc3JjL21zYXBpL2d0U3lzQ29uZmlnLmMgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9xZC1kc2R0LTMuMy9zcmMvbXNhcGkvZ3RTeXNDb25maWcuYwppbmRleCBiZmYwMjBmLi4xMGQzYzdiIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9xZC1kc2R0LTMuMy9zcmMvbXNhcGkvZ3RTeXNDb25maWcuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9xZC1kc2R0LTMuMy9zcmMvbXNhcGkvZ3RTeXNDb25maWcuYwpAQCAtNzYyLDYgKzc2Miw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgR1RfODhFNjE3MjoKICAgICAgICAgICAgICAgICBkZXYtPm51bU9mUG9ydHMgPSA3OworCQlkZXYtPm1heFBvcnRzID0gNzsKKwkJZGV2LT5tYXhQaHlOdW0gPSA1OwogICAgICAgICAgICAgICAgIGRldi0+dmFsaWRQb3J0VmVjID0gKDEgPDwgZGV2LT5udW1PZlBvcnRzKSAtIDE7CiAgICAgICAgICAgICAgICAgZGV2LT52YWxpZFBoeVZlYyA9IDB4MUY7CiAgICAgICAgICAgICAgICAgZGV2LT52YWxpZFNlcmRlc1ZlYyA9IDB4ODAwMDsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NhdGEvc2F0YTMvbXZTYXRhM0FkZHJEZWMuYyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NhdGEvc2F0YTMvbXZTYXRhM0FkZHJEZWMuYwppbmRleCBiMzBkMmJlMC4uN2I3Njc0NCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvc2F0YS9zYXRhMy9tdlNhdGEzQWRkckRlYy5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NhdGEvc2F0YTMvbXZTYXRhM0FkZHJEZWMuYwpAQCAtOTIsNyArOTIsNyBAQAogI2RlZmluZSBNVl9TQVRBM19XSU5fQkFTRV9PRkZTRVQgICAgICAgICAgICAgIDQKICNkZWZpbmUgTVZfU0FUQTNfV0lOX0JBU0VfTUFTSyAgICAgICAgICAgICAgICAoMHhGRkZGRkZGPDxNVl9TQVRBM19XSU5fQkFTRV9PRkZTRVQpCiAKLSNkZWZpbmUgTVZfU0FUQTNfV0lOX1NJWkVfQUxJR04JCSAgICBfNjRLCisjZGVmaW5lIE1WX1NBVEEzX1dJTl9TSVpFX0FMSUdOCQkgICAgXzFNCiAKIE1WX1RBUkdFVCBzYXRhM0FkZHJEZWNQcmlvVGFiW10gPSB7CiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NEUkFNX0NTMCkKQEAgLTIxMywxOSArMjEzLDE0IEBACiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CiAKLQliYXNlUmVnID0gcEFkZHJEZWNXaW4tPmFkZHJXaW4uYmFzZUxvdyAmIE1WX1NBVEEzX1dJTl9CQVNFX01BU0s7CisJYmFzZVJlZyA9IChwQWRkckRlY1dpbi0+YWRkcldpbi5iYXNlTG93IC8gTVZfU0FUQTNfV0lOX1NJWkVfQUxJR04pOworCWJhc2VSZWcgPSAoYmFzZVJlZyA8PCBNVl9TQVRBM19XSU5fQkFTRV9PRkZTRVQpICYgTVZfU0FUQTNfV0lOX0JBU0VfTUFTSzsKIAlzaXplUmVnID0gKHBBZGRyRGVjV2luLT5hZGRyV2luLnNpemUgLyBNVl9TQVRBM19XSU5fU0laRV9BTElHTikgLSAxOwogCXNpemVSZWcgPSBzaXplUmVnIDw8IE1WX1NBVEEzX1dJTl9TSVpFX09GRlNFVDsKIAogCS8qIHNldCBhdHRyaWJ1dGVzICovCiAJY3RybFJlZyA9IChwQWRkckRlY1dpbi0+YXR0cmliIDw8IE1WX1NBVEEzX1dJTl9BVFRSX09GRlNFVCk7CiAKLSNpZmRlZiBNVjg4RjY4WFgKLQkvKiBUZW1wIFdBIGZvciBBMzh4OiBzZXQgYXR0cmlidXRlIHdpdGggSU9DQyBiaXQgZW5hYmxlZDoKLQkgKiBXaGVuIHVzaW5nIER1YWwgQ1MsIGRpc2sgZGV0ZWN0aW9uIGZhaWxzIHdpdGhvdXQgdXNpbmcgSU9DQyBiaXQgZW5hYmxlZCAqLwotCWN0cmxSZWcgfD0gQklUMTI7Ci0jZW5kaWYKLQogCS8qIHNldCB0YXJnZXQgSUQgKi8KIAljdHJsUmVnICY9IH5NVl9TQVRBM19XSU5fVEFSR0VUX01BU0s7CiAJY3RybFJlZyB8PSAocEFkZHJEZWNXaW4tPnRhcmdldElkIDw8IE1WX1NBVEEzX1dJTl9UQVJHRVRfT0ZGU0VUKTsKQEAgLTI3Niw3ICsyNzEsOCBAQAogCS8qIEV4dHJhY3QgYmFzZSBhZGRyZXNzIGFuZCBzaXplICAgICovCiAJc2l6ZVJlZ1ZhbCA9IChzaXplUmVnICYgTVZfU0FUQTNfV0lOX1NJWkVfTUFTSykgPj4gTVZfU0FUQTNfV0lOX1NJWkVfT0ZGU0VUOwogCXBBZGRyRGVjV2luLT5hZGRyV2luLnNpemUgPSAoc2l6ZVJlZ1ZhbCArIDEpICogTVZfU0FUQTNfV0lOX1NJWkVfQUxJR047Ci0JcEFkZHJEZWNXaW4tPmFkZHJXaW4uYmFzZUxvdyA9IGJhc2VSZWcgJiBNVl9TQVRBM19XSU5fQkFTRV9NQVNLOworCXBBZGRyRGVjV2luLT5hZGRyV2luLmJhc2VMb3cgPSAoYmFzZVJlZyAmIE1WX1NBVEEzX1dJTl9CQVNFX01BU0spID4+IE1WX1NBVEEzX1dJTl9TSVpFX09GRlNFVDsKKwlwQWRkckRlY1dpbi0+YWRkcldpbi5iYXNlTG93ICo9IE1WX1NBVEEzX1dJTl9TSVpFX0FMSUdOOwogCXBBZGRyRGVjV2luLT5hZGRyV2luLmJhc2VIaWdoID0gMDsKIAogCS8qIGF0dHJpYiBhbmQgdGFyZ2V0SWQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC9zcGkvbXZTcGkuYyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NwaS9tdlNwaS5jCmluZGV4IDYyZTIzNjQuLjhhMGZiZjMgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NwaS9tdlNwaS5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3NwaS9tdlNwaS5jCkBAIC00NzUsNiArNDc1LDI1IEBACiAJCShzcGlIYWxEYXRhLmN0cmxNb2RlbCA9PSBNVl82MzIxX0RFVl9JRCkpCiAJCQlNVl9TUElfUkVHX0JJVF9TRVQoTVZfU1BJX0lGX0NPTkZJR19SRUcoc3BpSWQpLCBCSVQxNCk7CiAKKwkvKiBzZXQgcmVsYXhlZCBTUElfVE1JU09fU0FNUExFIHNldHRpbmdzLCBpbiAxIG9mIHRoZSBmb2xsb3dpbmc6CisJICogMS4gQXJtYWRhIDM4eC8zOXg6IEVSUkFUQSBGRS05MTQ0NTcyOiBUY2xvY2sgQCAyNTBNSHogJiBTUEkgY2xvY2sgQCA1ME1IeiAmIGNsa1BoYXNlPWNsb2NrUG9sTG93PTEKKwkgKiAyLiBBbGxleS1DYXQzOiBhbHdheXMsIHRvIGF2b2lkIHRpbWluZyB2aW9sYXRpb24gd2l0aCBTQ0xLID0gNDAvNTBNaHoqLworI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykKKwkJTVZfVTMyIHRpbWluZ1JlZzsKKyNpZm5kZWYgQ09ORklHX0FMTEVZQ0FUMworCQlpZiAoc3BpSGFsRGF0YS50Y2xrID09IE1WX0JPQVJEX1RDTEtfMjUwTUhaICYmIHNlcmlhbEJhdWRSYXRlID09IF81ME1IegorCQkJJiYgc3BpVHlwZXNbU1BJX1RZUEVfRkxBU0hdLmNsb2NrUG9sTG93ID09IDEKKwkJCSYmIHNwaVR5cGVzW1NQSV9UWVBFX0ZMQVNIXS5jbGtQaGFzZSA9PSAxKQorI2VuZGlmIC8qIGlmbmRlZiBDT05GSUdfQUxMRVlDQVQzICovCisJCQl7CisJCS8qIHNldCBUTUlTT19TQU1QTEUgdG8gMHgyOiBNSVNPIHNhbXBsZSBvY2N1cnMgMiBjb3JlX2NsayBhZnRlciBTUElfQ0xLIGVkZ2UgKi8KKwkJCXRpbWluZ1JlZyA9IE1WX1JFR19SRUFEKE1WX1NQSV9UTU5HX1BBUkFNU19SRUcoc3BpSWQpKTsKKwkJCXRpbWluZ1JlZyAmPSB+TVZfU1BJX1RNSVNPX1NBTVBMRV9NQVNLOworCQkJdGltaW5nUmVnIHw9ICgweDIpIDw8IE1WX1NQSV9UTUlTT19TQU1QTEVfT0ZGU0VUOworCQkJTVZfUkVHX1dSSVRFKE1WX1NQSV9UTU5HX1BBUkFNU19SRUcoc3BpSWQpLCB0aW1pbmdSZWcpOworCQkJfQorI2VuZGlmIC8qIENPTkZJR19BUk1BREFfMzhYIHx8IENPTkZJR19BUk1BREFfMzlYIHx8IENPTkZJR19BTExFWUNBVDMgKi8KKwogICAgIC8qIFZlcmlmeSB0aGF0IHRoZSBDUyBpcyBkZWFzc2VydGVkICovCiAgICAgbXZTcGlDc0RlYXNzZXJ0KHNwaUlkKTsKIApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvdHdzaS9tdlR3c2kuYyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsL3R3c2kvbXZUd3NpLmMKaW5kZXggNmJlNjkwNi4uNjI5MjBkNSAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWwvdHdzaS9tdlR3c2kuYworKysgYi9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbC90d3NpL212VHdzaS5jCkBAIC0zNTQsNyArMzU0LDcgQEAKIAlNVl9VMzIgYWN0dWFsRnJlcSA9IDAsIGFjdHVhbE4gPSAwLCBhY3R1YWxNID0gMCwgdmFsOwogCiAJaWYgKGZyZXF1YW5jeSA+IDEwMDAwMCkKLQkJbXZPc1ByaW50ZigiV2FybmluZyBUV1NJIGZyZXF1YW5jeSBpcyB0b28gaGlnaCwgcGxlYXNlIHVzZSB1cCB0byAxMDBLaHouXG4iKTsKKwkJbXZPc1ByaW50ZigiV2FybmluZyBUV1NJIGZyZXF1ZW5jeSBpcyB0b28gaGlnaCwgcGxlYXNlIHVzZSB1cCB0byAxMDBLaHouXG4iKTsKIAogCURCKG12T3NQcmludGYoIlRXU0k6IG12VHdzaUluaXQgLSBUY2xrID0gJWQgZnJlcSA9ICVkXG4iLCBUY2xrLCBmcmVxdWFuY3kpKTsKIAkvKiBDYWx1Y2FsdGUgTiBhbmQgTSBmb3IgdGhlIFRXU0kgY2xvY2sgYmF1ZCByYXRlICovCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbF9pZi9tdlN5c1VzYi5jIGIvYm9hcmQvbXZfZWJ1L2NvbW1vbi9tdl9oYWxfaWYvbXZTeXNVc2IuYwppbmRleCAxMzUyYjBjLi41ZGQ5MjUzIDEwMDc1NQotLS0gYS9ib2FyZC9tdl9lYnUvY29tbW9uL212X2hhbF9pZi9tdlN5c1VzYi5jCisrKyBiL2JvYXJkL212X2VidS9jb21tb24vbXZfaGFsX2lmL212U3lzVXNiLmMKQEAgLTY4LDcgKzY4LDggQEAKICNpbmNsdWRlICJ1c2IvbXZVc2IuaCIKICNpbmNsdWRlICJjdHJsRW52L212Q3RybEVudkFkZHJEZWMuaCIKICNpbmNsdWRlICJ1c2IvbXZVc2JSZWdzLmgiCi0KKyNpbmNsdWRlICJib2FyZEVudi9tdkJvYXJkRW52TGliLmgiCisjaW5jbHVkZSAiY3RybEVudi9tdkN0cmxFbnZTcGVjLmgiCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdlN5c1VzYkhhbEluaXQgLSBJbml0aWFsaXplIHRoZSBVU0Igc3Vic3lzdGVtCiAqCkBAIC04OCw3ICs4OSw2IEBACiAJTVZfU1RBVFVTIHN0YXR1cyA9IE1WX09LOwogCU1WX1UzMiBkZXY7CiAJTVZfVU5JVF9XSU5fSU5GTyBhZGRyV2luTWFwW01BWF9UQVJHRVRTICsgMV07Ci0KIAloYWxEYXRhLmN0cmxNb2RlbCA9IG12Q3RybE1vZGVsR2V0KCk7CiAJaGFsRGF0YS5jdHJsUmV2ID0gbXZDdHJsUmV2R2V0KCk7CiAJaGFsRGF0YS5jdHJsRmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoaGFsRGF0YS5jdHJsTW9kZWwpOwpAQCAtMTA0LDcgKzEwNCw5IEBACiAJCSBNQUMgSUQwICh1c2JBY3RpdmUgPTApIGlzIGNvbm5lY3RlZCB0byBQaHlzaWNhbCBNQUMgSUQxICovCiAJCWludCBpZCwgbWFjX2lkWzJdID0gezEsIDB9OwogCi0JCWZvciAoaWQgPSAwOyBpZCA8IG12Q3RybFVzYk1heEdldCgpOyBpZCsrKSB7CisJCSBmb3IgKGlkID0gMDsgaWQgPCBtYXhVc2JQb3J0cyA7IGlkKyspIHsKKwkJCWlmIChtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKFVTQl9VTklUX0lELGlkKSA9PSBNVl9GQUxTRSkKKwkJCQljb250aW51ZTsKIAkJCWlmIChtYXhVc2JQb3J0cyA9PSAxICYmIChoYWxEYXRhLmN0cmxGYW1pbHkgPT0gTVZfODhGNjdYMCB8fAogCQkJCQkoaGFsRGF0YS5jdHJsUmV2ID09IE1WXzg4RjY2WFhfQTBfSUQgJiYgaGFsRGF0YS5jdHJsRmFtaWx5ID09IE1WXzg4RjY2WDApKSkKIAkJCQlkZXYgPSBtYWNfaWRbaWRdOwpAQCAtMTM2LDcgKzEzOCw5IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVVNCX1hIQ0kKIAkJTVZfVTMyIHJlZzsKLQkJZm9yIChkZXYgPSAwOyBkZXYgPCBtdkN0cmxVc2IzSG9zdE1heEdldCgpIDsgZGV2KyspIHsKKwkJZm9yIChkZXYgPSAwOyBkZXYgPCBtdkN0cmxVc2IzSG9zdE1heEdldCgpOyBkZXYrKykgeworCQkJaWYgKG12Qm9hcmRJc1VzYlBvcnRDb25uZWN0ZWQoVVNCM19VTklUX0lELGRldikgPT0gTVZfRkFMU0UpCisJCQkJY29udGludWU7CiAJCQlzdGF0dXMgPSBtdlVzYlV0bWlQaHlJbml0KGRldiwgJmhhbERhdGEpOwogCQkJaWYgKGhhbERhdGEuY3RybEZhbWlseSA9PSBNVl84OEY2NlgwIHx8IGhhbERhdGEuY3RybEZhbWlseSA9PSBNVl84OEY2N1gwKSB7CiAJCQkJLyogQUxQL0EzNzU6IFNldCBVVE1JIFBIWSBTZWxlY3RvcjoKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL2NtZF9zYXIuYyBiL2JvYXJkL212X2VidS9tc3lzL2NtZF9zYXIuYwppbmRleCBkZjYyNTkyLi4zMGQ2NTcyIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9jbWRfc2FyLmMKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvY21kX3Nhci5jCkBAIC0yNCw4ICsyNCwxMyBAQAogI2luY2x1ZGUgImN0cmxFbnYvbXZDdHJsRW52TGliLmgiCiAjaW5jbHVkZSAiYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oIgogCi1leHRlcm4gTVZfQk9BUkRfSU5GTyAqbWFydmVsbEFDM0JvYXJkSW5mb1RibFtdOwotCisjaWYgZGVmaW5lZCBDT05GSUdfQUxMRVlDQVQzCisJZXh0ZXJuIE1WX0JPQVJEX0lORk8gKm1hcnZlbGxBQzNCb2FyZEluZm9UYmxbXTsKKwlNVl9CT0FSRF9JTkZPICoqbXZNc3lzQm9hcmRJbmZvVGJsID0gbWFydmVsbEFDM0JvYXJkSW5mb1RibDsKKyNlbHNlCisJZXh0ZXJuIE1WX0JPQVJEX0lORk8gKm1hcnZlbGxCQzJCb2FyZEluZm9UYmxbXTsKKwlNVl9CT0FSRF9JTkZPICoqbXZNc3lzQm9hcmRJbmZvVGJsID0gbWFydmVsbEJDMkJvYXJkSW5mb1RibDsKKyNlbmRpZgogLyoKICAgIGJjMiBzYW1wbGUgYW5kIHJlc2V0IHJlZ2lzdGVyCiAjICAgICA0ZiAgICAgICAjICAgICA0ZSAgICAgICAjICAgICA0ZCAgICAgICAjICAgICAgNGMgICAgICAjCkBAIC01Myw5ICs1OCw5IEBACiAJQ01EX0FWU19NT0RFLAogCUNNRF9TTEFWRV9BRERSLAogCUNNRF9ERVZJQ0VfTlVNLAotCUNNRF9CT0FSRF9JRCwKIAlDTURfRERSX0VDQ19FTiwKICNlbmRpZgorCUNNRF9CT0FSRF9JRCwKIAlDTURfUENJRV9NT0RFLAogCUNNRF9CT09UU1JDLAogCUNNRF9ERVZJQ0VfSUQsCkBAIC03NCw3ICs3OSw4IEBACiAJCQkJCQkgICAwLAkvKiBPT0IwIGNvbm5lY3Rpb24gKi8KIAkJCQkJCSAgIDAsCS8qIE9PQjEgY29ubmVjdGlvbiAqLwogCQkJCQkJICAgMCwJLyogRm9yY2UgQU1DIFJDIEdFTjEgUENJZSAqLwotCQkJCQkJICAgMSwJLyogUENJZSBtb2RlICovCisJCQkJCQkgICAwLAkvKiBCb2FyZCBJRCAqLworCQkJCQkJICAgMCwJLyogUENJZSBtb2RlICovCiAJCQkJCQkgICAzLAkvKiBCb290IHNvdXJjZSAqLwogCQkJCQkJICAgMCB9OwkvKiBEZXZpY2UgSUQgKi8KIAlNVl9VMzIgY29yZUNsb2NrVGJsW10gPSBNVl9DT1JFX0NMS19UQkxfQkMyOwpAQCAtODcsOCArOTMsOCBAQAogCQkJCQkJICAgMSwJLyogQVZTIE1vZGUgKi8KIAkJCQkJCSAgIDEsCS8qIEkyQy9TTUkgU2xhdmUgYWRkcmVzcyAqLwogCQkJCQkJICAgMCwJLyogRGV2aWNlIG51bWJlciAqLwotCQkJCQkJICAgMCwJLyogQm9hcmQgSUQgKi8KIAkJCQkJCSAgIDAsCS8qIEREUiBFQ0MgZW5hYmxlICovCisJCQkJCQkgICAwLAkvKiBCb2FyZCBJRCAqLwogCQkJCQkJICAgMCwJLyogUENJZSBtb2RlICovCiAJCQkJCQkgICAzLAkvKiBCb290IHNvdXJjZSAqLwogCQkJCQkJICAgMCB9OwkvKiBEZXZpY2UgSUQgKi8KQEAgLTE1NiwxMSArMTYyLDExIEBACiAJCXJldHVybiBDTURfU0xBVkVfQUREUjsKIAlpZiAoc3RyY21wKGNtZCwgImRldmljZW51bSIpID09IDApCiAJCXJldHVybiBDTURfREVWSUNFX05VTTsKLQlpZiAoc3RyY21wKGNtZCwgImJvYXJkaWQiKSA9PSAwKQotCQlyZXR1cm4gQ01EX0JPQVJEX0lEOwogCWlmIChzdHJjbXAoY21kLCAiZGRyZWNjZW5hYmxlIikgPT0gMCkKIAkJcmV0dXJuIENNRF9ERFJfRUNDX0VOOwogI2VuZGlmCisJaWYgKHN0cmNtcChjbWQsICJib2FyZGlkIikgPT0gMCkKKwkJcmV0dXJuIENNRF9CT0FSRF9JRDsKIAlpZiAoc3RyY21wKGNtZCwgInBjaW1vZGUiKSA9PSAwKQogCQlyZXR1cm4gQ01EX1BDSUVfTU9ERTsKIAlpZiAoc3RyY21wKGNtZCwgImJvb3RzcmMiKSA9PSAwKQpAQCAtMzAxLDE4ICszMDcsMTggQEAKIAkJcHJpbnRmKCJcdHwgIDEgIHwgICAgICAgICAgMSAgICAgICAgICB8XG4iKTsKIAkJcHJpbnRmKCJcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJYnJlYWs7Ci0JY2FzZSBDTURfQk9BUkRfSUQ6Ci0JCXByaW50ZigiRGV0ZXJtaW5lcyB0aGUgYm9hcmQgSUQgKDAtNylcbiIpOwotCQlwcmludGYoIlx0fCBJRCAgfCAgICAgIEJvYXJkICAgICAgICAgICAgICAgfFxuIik7Ci0JCXByaW50ZigiXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IEFDM19NQVJWRUxMX0JPQVJEX05VTSA7IGkrKykKLQkJCXByaW50ZigiXHR8ICAlZCAgfCAgJS0yMnMgIHxcbiIsIGksIG1hcnZlbGxBQzNCb2FyZEluZm9UYmxbaV0tPmJvYXJkTmFtZSApOwotCQlwcmludGYoIlx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JCWJyZWFrOwogCWNhc2UgQ01EX0RFVklDRV9OVU06CiAJCXByaW50ZigiRGV0ZXJtaW5lcyB0aGUgZGV2aWNlIG51bWJlciAoMC0zKVxuIik7CiAJCWJyZWFrOwogI2VuZGlmCisJY2FzZSBDTURfQk9BUkRfSUQ6CisJCXByaW50ZigiRGV0ZXJtaW5lcyB0aGUgYm9hcmQgSUQgKDAtNylcbiIpOworCQlwcmludGYoIlx0fCBJRCAgfCAgICAgIEJvYXJkICAgICAgICAgICAgICAgfFxuIik7CisJCXByaW50ZigiXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IE1WX01BUlZFTExfQk9BUkRfTlVNIDsgaSsrKQorCQkJcHJpbnRmKCJcdHwgICVkICB8ICAlLTIycyAgfFxuIiwgaSwgbXZNc3lzQm9hcmRJbmZvVGJsW2ldLT5ib2FyZE5hbWUgKTsKKwkJcHJpbnRmKCJcdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlicmVhazsKIAljYXNlIENNRF9QQ0lFX01PREU6CiAJCXByaW50ZigiRGV0ZXJtaW5lcyB0aGUgUENJLUUgbW9kZTpcbiIpOwogCQlwcmludGYoIlx0fCBJRCAgfCAgICAgICBNb2RlICAgICB8XG4iKTsKQEAgLTQ1OSwxNCArNDY1LDE0IEBACiAJCQlwcmludGYoImRldmljZW51bSBFcnJvcjogZmFpbGVkIHJlYWRpbmcgZGV2aWNlbnVtXG4iKTsKIAkJYnJlYWs7CiAKKyNlbmRpZgogCWNhc2UgQ01EX0JPQVJEX0lEOgogCQlpZiAobXZCb2FyZFNhckJvYXJkSWRHZXQoJnRtcCkgPT0gTVZfT0spCi0JCQlwcmludGYoImJvYXJkaWRcdFx0XHQ9ICVkID09PiAgJXNcbiIsIHRtcCwgbWFydmVsbEFDM0JvYXJkSW5mb1RibFt0bXBdLT5ib2FyZE5hbWUpOworCQkJcHJpbnRmKCJib2FyZGlkXHRcdFx0PSAlZCA9PT4gICVzXG4iLCB0bXAsIG12TXN5c0JvYXJkSW5mb1RibFt0bXBdLT5ib2FyZE5hbWUpOwogCQllbHNlCiAJCQlwcmludGYoImJvYXJkaWQgRXJyb3I6IGZhaWxlZCByZWFkaW5nIGJvYXJkaWRcbiIpOwogCQlicmVhazsKIAotI2VuZGlmCiAJY2FzZSBDTURfUENJRV9NT0RFOgogCQlpZiAobXZCb2FyZFBjaWVNb2RlR2V0KCZ0bXApID09IE1WX09LKQogCQkJcHJpbnRmKCJwY2ltb2RlIFx0XHQ9ICVkID09PiAgJXNcbiIsIHRtcCwgKCh0bXAgPT0gMCkgPyAiRW5kcG9pbnQiIDogIlJvb3QgQ29tcGxleCIpKTsKQEAgLTU2NSwxMyArNTcxLDEzIEBACiAJY2FzZSBDTURfU0xBVkVfQUREUjoKIAkJcmMgPSBtdkJvYXJkU21pSTJjMkFkZHJTZXQodG1wKTsKIAkJYnJlYWs7Ci0JY2FzZSBDTURfQk9BUkRfSUQ6Ci0JCXJjID0gbXZCb2FyZFNhckJvYXJkSWRTZXQodG1wKTsKLQkJYnJlYWs7CiAJY2FzZSBDTURfREVWSUNFX05VTToKIAkJcmMgPSBtdkJvYXJkRGV2aWNlTnVtU2V0KHRtcCk7CiAJCWJyZWFrOwogI2VuZGlmCisJY2FzZSBDTURfQk9BUkRfSUQ6CisJCXJjID0gbXZCb2FyZFNhckJvYXJkSWRTZXQodG1wKTsKKwkJYnJlYWs7CiAJY2FzZSBDTURfUENJRV9NT0RFOgogCQlyYyA9IG12Qm9hcmRQY2llTW9kZVNldCh0bXApOwogCQlicmVhazsKQEAgLTU4MywxNSArNTg5LDEzIEBACiAJCWJyZWFrOwogCWNhc2UgQ01EX0RFRkFVTFQ6CiAJCWZvciAoaSA9IDAgOyBpIDwgQ01EX0RVTVA7IGkrKykgewotI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMwogCQkJaWYgKGkgPT0gQ01EX0JPQVJEX0lEKSB7CiAJCQkJTVZfVTMyIGJyZElkID0gbXZCb2FyZElkR2V0KCk7Ci0JCQkJaWYgKChicmRJZCA8IEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UpIHx8IChicmRJZCA+PSBBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQpKQorCQkJCWlmICgoYnJkSWQgPCBNQVJWRUxMX0JPQVJEX0lEX0JBU0UpIHx8IChicmRJZCA+PSBNVl9NQVhfTUFSVkVMTF9CT0FSRF9JRCkpCiAJCQkJCW12T3NQcmludGYoIkJhZCBCb2FyZCBJRCByZXR1cm5lZCAtICVkISBBc3NpZ25pbmcgZGVmYXVsdCB2YWx1ZSFcbiIsIGJyZElkKTsKIAkJCQllbHNlCi0JCQkJCWRlZmF1bHRWYWx1ZVtpXSA9IGJyZElkIC0gQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRTsgLyogVXBkYXRlIGRlZmF1bHQgdmFsdWUgd2l0aCByZWFsIGJvYXJkIElEKi8KKwkJCQkJZGVmYXVsdFZhbHVlW2ldID0gYnJkSWQgLSBNQVJWRUxMX0JPQVJEX0lEX0JBU0U7IC8qIFVwZGF0ZSBkZWZhdWx0IHZhbHVlIHdpdGggcmVhbCBib2FyZCBJRCovCiAJCQl9Ci0jZW5kaWYgLyogQ09ORklHX0FMTEVZQ0FUMyAqLwogCQkJaWYgKDEgPT0gZG9fc2FyX3dyaXRlKGksIGRlZmF1bHRWYWx1ZVtpXSkpCiAJCQkJcmMgPSBNVl9GQUxTRTsKIAkJCWRvX3Nhcl9yZWFkKGkpOwpAQCAtNjIzLDEyICs2MjcsMTAgQEAKIAljbWQgPSBhcmd2WzFdOwogCW1vZGUgPSBzYXJfY21kX2dldChhcmd2WzJdKTsKIAotI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMwotCWlmKG12Qm9hcmRJZEdldCgpICE9IERCX0FDM19JRCAmJiBtb2RlICE9IENNRF9CT0FSRF9JRCkgeworCWlmKG12Qm9hcmRJZEdldCgpICE9IE1WX0RFRkFVTFRfQk9BUkRfSUQgJiYgbW9kZSAhPSBDTURfQk9BUkRfSUQpIHsKIAkJbXZPc1ByaW50ZigiRXJyb3I6IFNhbXBsZSBhdCByZXNldCBzdXBwb3J0cyBtb2RpZnlpbmcgb25seSAnYm9hcmRpZCcgZmllbGQgZm9yIGN1cnJlbnQgYm9hcmRcblxuIik7CiAJCWdvdG8gdXNhZ2U7CiAJfQotI2VuZGlmCiAKIAlpZiAoc3RyY21wKGNtZCwgImxpc3QiKSA9PSAwKQogCQlyZXR1cm4gZG9fc2FyX2xpc3QobW9kZSk7CkBAIC02NzQsMTMgKzY3NiwxMyBAQAogI2VuZGlmCiAiYm9vdHNyYyAgICAgICAgICAgICAgICAgICAgLSBCb290IHNvdXJjZVxuIgogImRldmljZWlkICAgICAgICAgICAgICAgICAgIC0gRGV2aWNlIElEXG4iCi0jaWZkZWYgQ09ORklHX0FMTEVZQ0FUMwotIlx0LS0tLUxlZ2FjeSBmaWxlZHMtLS0tXG4iCi0icGxsY2xvY2sgICAgICAgICAgICAgICAgICAgLSBQTEwyIFZDTyBjbG9jayBmcmVxdWVuY3kuIFZhbGlkIGZvciByZXYuQTAgb25seVxuIgogIlxuXHRTVyBTYXRSIGZpZWxkc1xuIgogIlx0LS0tLS0tLS0tLS0tLS1cbiIKLSJkZHJlY2NlbmFibGUgICAgICAgICAgICAgICAtIEREUiBFQ0MgbW9kZXNcbiIKICJib2FyZGlkICAgICAgICAgICAgICAgICAgICAtIEJvYXJkIElEXG4iCisjaWZkZWYgQ09ORklHX0FMTEVZQ0FUMworImRkcmVjY2VuYWJsZSAgICAgICAgICAgICAgIC0gRERSIEVDQyBtb2Rlc1xuIgorIlx0LS0tLUxlZ2FjeSBmaWxlZHMtLS0tXG4iCisicGxsY2xvY2sgICAgICAgICAgICAgICAgICAgLSBQTEwyIFZDTyBjbG9jayBmcmVxdWVuY3kuIFZhbGlkIGZvciByZXYuQTAgb25seVxuIgogI2VuZGlmCiApOwogI2VuZGlmIC8qZGVmaW5lZChDT05GSUdfQ01EX1NBUikqLwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5jCmluZGV4IDMzMjc0OWMuLjUzMDFhZmYgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmMKQEAgLTk0LDEyICs5NCwzOSBAQAogZXh0ZXJuIE1WX0JPQVJEX0lORk8gKmN1c3RvbWVyQkMyQm9hcmRJbmZvVGJsW107CiBleHRlcm4gTVZfQk9BUkRfSU5GTyAqbWFydmVsbEFDM0JvYXJkSW5mb1RibFtdOwogZXh0ZXJuIE1WX0JPQVJEX0lORk8gKmN1c3RvbWVyQUMzQm9hcmRJbmZvVGJsW107CitleHRlcm4gTVZfQk9BUkRfSU5GTyAqbWFydmVsbEJPQktCb2FyZEluZm9UYmxbXTsKK2V4dGVybiBNVl9CT0FSRF9JTkZPICpjdXN0b21lckJPQktCb2FyZEluZm9UYmxbXTsKIC8qIEdsb2JhbCB2YXJpYWJsZXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBCU1MgKHNldCB0byBhIG5vbi16ZXJvIHZhbHVlKQogICAgZm9yIGF2b2lkaW5nIG1lbW9yeSBjb3JydXB0aW9uIGR1cmluZyBlYXJseSBhY2Nlc3MgdXBvbiBjb2RlIHJlbG9jYXRpb24gKi8KIHN0YXRpYyBNVl9CT0FSRF9JTkZPICpib2FyZCA9IChNVl9CT0FSRF9JTkZPICopLTE7CiAKIC8qIExvY2FscyAqLwogc3RhdGljIE1WX0RFVl9DU19JTkZPICptdkJvYXJkR2V0RGV2RW50cnkoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZGlzVXNiUG9ydENvbm5lY3RlZAorKgorKiBERVNDUklQVElPTjoKKyoJcmV0dXJuIFRydWUgaWYgcmVxdWVzdGVkIFVTQiB0eXBlIGFuZCBwb3J0IG51bSBleGlzdHMgb24gY3VycmVudCBib2FyZAorKgorKiBJTlBVVDoKKyoJdXNiVHlwZUlEICAgICAgIC0gcmVxdWVzdGVkIFVTQiB0eXBlIDogVVNCM19VTklUX0lEIC8gVVNCX1VOSVRfSUQKKyoJdXNiUG9ydE51bWJkZXIgIC0gcmVxdWVzdGVkIFVTQiBwb3J0IG51bWJlciAoYWNjb3JkaW5nIHRvIHhIQ0kgTUFDIHBvcnQgbnVtKQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOiBNVl9UUlVFIGlmIHJlcXVlc3RlZCBwb3J0L3R5cGUgZXhpc3Qgb24gYm9hcmQKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZElzVXNiUG9ydENvbm5lY3RlZChNVl9VTklUX0lEIHVzYlR5cGVJRCwgTVZfVTggdXNiUG9ydE51bWJlcikKK3sKKwkvKkJvYkNhdDIgU29DIGhhdmUgbm8gdXNiIHBvcnQKKwlBbGxleUNhdDMgJiBCb2JLIFNvQyBib2FyZCBoYXMgb25seSBvbmUgdXNiMiBwb3J0ICovCisjaWZkZWYgTVZfVVNCCisJaWYgKHVzYlR5cGVJRCA9PSBVU0JfVU5JVF9JRCAmJiB1c2JQb3J0TnVtYmVyID09IDApCisJCXJldHVybiBNVl9UUlVFOworI2VuZGlmCisJcmV0dXJuIE1WX0ZBTFNFOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkSWRJbmRleEdldApAQCAtMTc2LDYgKzIwMywxMiBAQAogCW12R3BwVHlwZVNldCgwLCAweEZGRkZGRkZGLCBib2FyZC0+Z3BwT3V0RW5WYWxMb3cpOwogCW12R3BwVHlwZVNldCgxLCAweEZGRkZGRkZGLCBib2FyZC0+Z3BwT3V0RW5WYWxNaWQpOwogCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkgeworCQlNVl9SRUdfV1JJVEUoR1BQX0RBVEFfT1VUX1JFRygyKSwgYm9hcmQtPmdwcE91dFZhbEhpZ2gpOworCQltdkdwcFBvbGFyaXR5U2V0KDIsIDB4RkZGRkZGRkYsIGJvYXJkLT5ncHBQb2xhcml0eVZhbEhpZ2gpOworCQltdkdwcFR5cGVTZXQoMiwgMHhGRkZGRkZGRiwgYm9hcmQtPmdwcE91dEVuVmFsSGlnaCk7CisJfQorCiAjaWZuZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCiAJbXZCb2FyZE9vYlBvcnRDZmdTZXQoKTsKICNlbmRpZgpAQCAtMjc1LDEwICszMDgsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0JPT0wgbXZCb2FyZElzRXRoQ29ubmVjdGVkKE1WX1UzMiBldGhOdW0pCiB7Ci0JaWYgKGV0aE51bSA8PSBtdkN0cmxFdGhNYXhQb3J0R2V0KCkpCi0JCXJldHVybiBNVl9UUlVFOwotCi0JcmV0dXJuIE1WX0ZBTFNFOworCXJldHVybiBtdkJvYXJkSXNHYkVQb3J0Q29ubmVjdGVkKGV0aE51bSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zMjQsNiArMzU0LDEwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfQk9PTCBtdkJvYXJkSXNQb3J0SW5TZ21paShNVl9VMzIgZXRoUG9ydE51bSkKIHsKKwlNVl9VMzIgYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOworCisJaWYgKGJvYXJkSWQgPT0gREJfNzhYNjBfQU1DX0lEICYmIGV0aFBvcnROdW0gPT0gMCkKKwkJcmV0dXJuIE1WX0ZBTFNFOwogCXJldHVybiBNVl9UUlVFOwogfQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM1MCw2ICszODQsMzAgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZFBvcnRUeXBlR2V0CisqCisqIERFU0NSSVBUSU9OOgorKiAgICAgICBUaGlzIHJvdXRpbmUgcmV0dXJucyBwb3J0IHR5cGUKKyoKKyogSU5QVVQ6CisqICAgICAgIGV0aFBvcnROdW0gLSBFdGhlcm5ldCBwb3J0IG51bWJlci4KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lCisqCisqIFJFVFVSTjoKKyogICAgICAgTW9kZSBvZiB0aGUgcG9ydAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UzMiBtdkJvYXJkUG9ydFR5cGVHZXQoTVZfVTMyIGV0aFBvcnROdW0pCit7CisJaWYgKG12Qm9hcmRJc1BvcnRJblNnbWlpKGV0aFBvcnROdW0pKQorCQlyZXR1cm4gTVZfUE9SVF9UWVBFX1NHTUlJOworCWVsc2UKKwkJcmV0dXJuIE1WX1BPUlRfVFlQRV9SR01JSTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZCb2FyZElzUG9ydEluTWlpCiAqCiAqIERFU0NSSVBUSU9OOgpAQCAtNDE4LDYgKzQ3Niw4IEBACiAKIE1WX0JPT0wgbXZCb2FyZElzUG9ydEluUmdtaWkoTVZfVTMyIGV0aFBvcnROdW0pCiB7CisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuICFtdkJvYXJkSXNQb3J0SW5HbWlpKGV0aFBvcnROdW0pOwogCXJldHVybiAhbXZCb2FyZElzUG9ydEluR21paShldGhQb3J0TnVtKSAmJiAhbXZCb2FyZElzUG9ydEluU2dtaWkoZXRoUG9ydE51bSk7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDg5LDcgKzU0OSw2MyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdkJvYXJkVGNsa0dldChNVl9WT0lEKQogewotCXJldHVybiAyMDAwMDAwMDA7IC8qIGNvbnN0YW50IFRjbG9jayBAIDIwME1IeiAobm90IFNhbXBsZWRAUmVzZXQpICAqLworCS8qIFUtQm9vdCBmbG93IGZvciBNU1lTIGNhbiBub3QgcmVhZCBGYW1pbHlJZEdldCB0byBkZXJyaXZlIFRjbGssCisJc2luY2UgRmFtaWx5SWRHZXQgbmVlZHMgQm9hcmQgSUQsIHZpYSBUV1NJIHRyYXNhY3Rpb24sIHdoaWNoIGRlcGVuZHMgb24gVGNsayByZWFkaW5nLgorCU1TWVMgcGxhdGZvcm1zIHVzZSBzdGF0aWMgVGNsaz0yMDBNSHogKG5vdCBTYW1wbGVkQFJlc2V0KSovCisjaWZkZWYgTVZfTVNZUyAvKiBNVl9NU1lTIGlzIGRlZmluZWQgb25seSBpbiBVLWJvb3QgZm9yIE1TWVMgcGxhdGZvcm1zOiBBQzMvQkMyL0JvYksgKi8KKwlyZXR1cm4gTVZfQk9BUkRfVENMS18yMDBNSFo7CisjZWxzZQorCisJLyogZm9yIExpbnV4IGZsb3csIEZhbWlseUlkR2V0IGNhbiB1c2UgQm9hcmRJREdldCwgc2luY2UgQm9hcmQgaWQgaXMgbm90IHJlYWRlbiBmcm9tIFRXU0ksCisJYnV0IHBhc3NlZCBmcm9tIFUtQm9vdCB0YWdzIGluc3RlYWQgKi8KKworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSAhPSBNVl83ODQ2MF9ERVZfSUQpCisJCS8qIGNvbnN0YW50IFRjbG9jayBAIDIwME1IeiAobm90IFNhbXBsZWRAUmVzZXQpICovCisJCXJldHVybiBNVl9CT0FSRF9UQ0xLXzIwME1IWjsKKworCWlmICgoTVZfUkVHX1JFQUQoTVBQX1NBTVBMRV9BVF9SRVNFVCgwKSkgJiBNU0FSX1RDTEtfTUFTSykgIT0gMCkKKwkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjAwTUhaOworCWVsc2UKKwkJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjUwTUhaOworI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRTeXNDbGtHZXRBeHAgLSBHZXQgdGhlIGJvYXJkIFN5c0NsayBvZiBBWFAgKENQVSBidXMgY2xvY2sgLCBpLmUuIEREUiBjbG9jaykKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgcm91dGluZSBleHRyYWN0IHRoZSBDUFUgYnVzIGNsb2NrLgorKgorKiBJTlBVVDoKKyogICAgICAgY291bnROdW0gLSBDb3VudGVyIG51bWJlci4KKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUk46CisqICAgICAgIDMyYml0IGNsb2NrIGN5Y2xlcyBpbiBIZXJ0ei4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMzIgbXZCb2FyZFN5c0Nsa0dldEF4cChNVl9WT0lEKQoreworCU1WX1UzMiBpZHg7CisJTVZfVTMyIGNwdUZyZXFNaHosIGRkckZyZXFNaHo7CisJTVZfQ1BVX0FSTV9DTEtfUkFUSU8gY2xvY2tSYXRpb1RibFtdID0gTVZfRERSX0wyX0NMS19SQVRJT19UQkxfQVhQOworCisJaWR4ID0gTVNBUl9ERFJfTDJfQ0xLX1JBVElPX0lEWChNVl9SRUdfUkVBRChNUFBfU0FNUExFX0FUX1JFU0VUKDApKSwKKwkJCQkJTVZfUkVHX1JFQUQoTVBQX1NBTVBMRV9BVF9SRVNFVCgxKSkpOworCisJaWYgKGNsb2NrUmF0aW9UYmxbaWR4XS52Y28yY3B1ICE9IDApIHsJCQkvKiB2YWxpZCByYXRpbyA/ICovCisJCWNwdUZyZXFNaHogPSBtdkNwdVBjbGtHZXQoKSAvIDEwMDAwMDA7CQkvKiBvYnRhaW4gQ1BVIGZyZXEgKi8KKwkJY3B1RnJlcU1oeiAqPSBjbG9ja1JhdGlvVGJsW2lkeF0udmNvMmNwdTsJLyogY29tcHV0ZSBWQ08gZnJlcSAqLworCQlkZHJGcmVxTWh6ID0gY3B1RnJlcU1oeiAvIGNsb2NrUmF0aW9UYmxbaWR4XS52Y28yZGRyOworCQkvKiByb3VuZCB1cCB0byBpbnRlZ2VyIE1IeiAqLworCQlpZiAoKChjcHVGcmVxTWh6ICUgY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJkZHIpICogMTAgLyBjbG9ja1JhdGlvVGJsW2lkeF0udmNvMmRkcikgPj0gNSkKKwkJCWRkckZyZXFNaHorKzsKKworCQlyZXR1cm4gZGRyRnJlcU1oeiAqIDEwMDAwMDA7CisJfSBlbHNlCisJCXJldHVybiAweEZGRkZGRkZGOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNTEzLDggKzYyOSwxMiBAQAogCU1WX1UzMgkJaWR4OwogCU1WX1UzMgkJZnJlcV90YmxfYmMyW10gPSBNVl9DT1JFX0NMS19UQkxfQkMyOwogCU1WX1UzMgkJZnJlcV90YmxfYWMzW10gPSBNVl9DT1JFX0NMS19UQkxfQUMzOworCU1WX1UzMgkJZnJlcV90YmxfYm9ia19jZXR1c1tdID0gTVZfQ09SRV9DTEtfVEJMX0JPQktfQ0VUVVM7CisJTVZfVTMyCQlmcmVxX3RibF9ib2JrX2NhZWx1bVtdID0gTVZfQ09SRV9DTEtfVEJMX0JPQktfQ0FFTFVNOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKKwlpZiAoZmFtaWx5ID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuIG12Qm9hcmRTeXNDbGtHZXRBeHAoKTsKIAlpZHggPSBNU0FSX0NPUkVfQ0xLKE1WX0RGWF9SRUdfUkVBRChERlhfREVWSUNFX1NBUl9SRUcoMCkpLCBNVl9ERlhfUkVHX1JFQUQoREZYX0RFVklDRV9TQVJfUkVHKDEpKSk7CiAKIAlpZiAoaWR4ID49IDcpCkBAIC01MjQsNyArNjQ0LDIwIEBACiAJCXJldHVybiBmcmVxX3RibF9iYzJbaWR4XSAqIDEwMDAwMDA7CiAJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpCiAJCXJldHVybiBmcmVxX3RibF9hYzNbaWR4XSAqIDEwMDAwMDA7Ci0JZWxzZQorCWVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCQkvKiBCb2JLIGZhbWlseSBoYXMgdHdvIGRpZmZlcmVudCBmbGF2b3JzKENldHVzL0NhZWx1bSkgd2l0aCBkaWZmZXJlbnQgc2V0dGluZ3MgKi8KKwkJc3dpdGNoIChtdkN0cmxNb2RlbEdldCgpICYgfkJPQktfRkxBVk9SX01BU0spIHsKKwkJY2FzZSBNVl9CT0JLX0NFVFVTXzk4RFg0MjM1X0RFVl9JRDoKKwkJCXJldHVybiBmcmVxX3RibF9ib2JrX2NldHVzW2lkeF0gKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWNhc2UgTVZfQk9CS19DQUVMVU1fOThEWDQyMDNfREVWX0lEOgorCQkJcmV0dXJuIGZyZXFfdGJsX2JvYmtfY2FlbHVtW2lkeF0gKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltdk9zUHJpbnRmKCJFUlJPUjogVW5rbm93biBEZXZpY2UgSUQgJWQsIENPUkUgZnJlcSBnZXQgZmFpbGVkXG4iLCBtdkN0cmxNb2RlbEdldCgpKTsKKwkJCXJldHVybiAweEZGRkZGRkZGOworCQl9CisJfSBlbHNlCiAJCXJldHVybiAweEZGRkZGRkZGOwogfQogCkBAIC03NDcsNyArODgwLDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9CT09MIG12Qm9hcmRJc0diRVBvcnRDb25uZWN0ZWQoTVZfVTMyIGV0aFBvcnROdW0pCiB7Ci0JaWYgKChldGhQb3J0TnVtICsgMSkgPD0gYm9hcmQtPm51bUJvYXJkTWFjSW5mbykKKwlpZiAoKGV0aFBvcnROdW0gPCBib2FyZC0+bnVtQm9hcmRNYWNJbmZvKSAmJgorCQkoYm9hcmQtPnBCb2FyZE1hY0luZm9bZXRoUG9ydE51bV0uYm9hcmRNYWNFbmFibGVkID09IE1WX1RSVUUpKQogCQlyZXR1cm4gTVZfVFJVRTsKIAllbHNlCiAJCXJldHVybiBNVl9GQUxTRTsKQEAgLTc3MiwzMCArOTA2LDM3IEBACiBNVl9WT0lEIG12Qm9hcmRDcGxkQ29uZmlndXJhdGlvbkdldChjaGFyICpzdHIpCiB7CiAJTVZfVTggY3BsZFR3c2lEZXYsIGNwbGRDb25maWc7CisJTVZfVTggY3BsZEJvYXJkUmV2UmVnID0gQ1BMRF9CT0FSRF9SRVZfUkVHOworCU1WX1UxNiBib2FyZE1vZGVsOwogCi0JLyogQ1BMRCBib2FyZCBjb25maWd1cmF0aW9uIHByaW50IGZvciBBQzMgKi8KLQlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkKLQkJcmV0dXJuOworCS8qIFByZXZlbnQgdGhlIGNhbGxlciBmdW5jdGlvbiBmcm9tIHByaW50aW5nIHRoZSBzYW1lIHN0cmluZyB0d2ljZSBpZiB0aGlzIGZ1bmN0aW9uIGZhaWxzICovCisJKnN0ciA9IDA7CisKIAljcGxkVHdzaURldiA9IG12Qm9hcmRUd3NpQWRkckdldChCT0FSRF9ERVZfVFdTSV9QTEQsIDApOwogCiAJLyogdmVyaWZ5IHRoYXQgQ1BMRCBkZXZpY2UgaXMgYXZhaWxhYmxlIG9uIGN1cnJlbnQgYm9hcmQsIGVsc2UgcmV0dXJuKi8KIAlpZiAoY3BsZFR3c2lEZXYgPT0gMHhmZiB8fCBtdlR3c2lQcm9iZShjcGxkVHdzaURldiwgbXZCb2FyZFRjbGtHZXQoKSkgIT0gTVZfVFJVRSkKIAkJcmV0dXJuOwogCisJYm9hcmRNb2RlbCA9IG12Qm9hcmRNb2RlbEdldCgpOworCWlmIChib2FyZE1vZGVsID09IFJEX01UTF9CQzJfUENCX0lEKQorCQljcGxkQm9hcmRSZXZSZWcgPSBDUExEX1JEX01UTF9CQzJfQk9BUkRfUkVWX1JFRzsKKwogCS8qIFJlYWQgQm9hcmQgUmV2aXNpb24gKi8KLQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lSZWFkKEJPQVJEX0RFVl9UV1NJX1BMRCwgMCwgQ1BMRF9CT0FSRF9SRVZfUkVHLCAmY3BsZENvbmZpZykpIHsKKwlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lSZWFkKEJPQVJEX0RFVl9UV1NJX1BMRCwgMCwgY3BsZEJvYXJkUmV2UmVnLCAmY3BsZENvbmZpZykpIHsKIAkJbXZPc1ByaW50ZigiXG4lczogRXJyb3I6IGZhaWxlZCByZWFkaW5nIGJvYXJkIFJldmlzaW9uIGZyb20gQ1BMRC5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAlzcHJpbnRmKHN0ciwgIiwgUmV2ICVkIiAsIGNwbGRDb25maWcgJiBDUExEX0JPQVJEX1JFVl9NQVNLKTsKIAogCS8qIFJlYWQgQ1BMRCBSZXZpc2lvbiAqLwotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVJlYWQoQk9BUkRfREVWX1RXU0lfUExELCAwLCBDUExEX1JFVl9SRUcsICZjcGxkQ29uZmlnKSkgewotCQltdk9zUHJpbnRmKCJcbiVzOiBFcnJvcjogZmFpbGVkIHJlYWRpbmcgQ1BMRCBSZXZpc2lvbiBmcm9tIENQTEQuXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwlpZiAoYm9hcmRNb2RlbCAhPSBSRF9NVExfQkMyX1BDQl9JRCkgeworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lSZWFkKEJPQVJEX0RFVl9UV1NJX1BMRCwgMCwgQ1BMRF9SRVZfUkVHLCAmY3BsZENvbmZpZykpIHsKKwkJCW12T3NQcmludGYoIlxuJXM6IEVycm9yOiBmYWlsZWQgcmVhZGluZyBDUExEIFJldmlzaW9uIGZyb20gQ1BMRC5cbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybjsKKwkJfQorCQlzcHJpbnRmKHN0ciwgIiVzLCBDUExEIFJldiAlZCIsIHN0ciwgY3BsZENvbmZpZyAmIENQTERfQk9BUkRfUkVWX01BU0spOwogCX0KLQotCXNwcmludGYoc3RyLCAiJXMsIENQTEQgUmV2ICVkIiwgc3RyLCBjcGxkQ29uZmlnICYgQ1BMRF9CT0FSRF9SRVZfTUFTSyk7CiB9CiAKIC8qIEJvYXJkIGRldmljZXMgQVBJIG1hbmFnbWVudHMgKi8KQEAgLTEwMDgsNiArMTE0OSw5MiBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkR2V0RGV2QnVzTnVtCisqCisqIERFU0NSSVBUSU9OOgorKglSZXR1cm4gdGhlIGRldmljZSdzIGJ1cyBudW1iZXIuCisqCisqIElOUFVUOgorKglkZXZJbmRleCAtIFRoZSBkZXZpY2Ugc2VxdWVudGlhbCBudW1iZXIgb24gdGhlIGJvYXJkCisqCWRldlR5cGUgLSBUaGUgZGV2aWNlIHR5cGUgKCBGbGFzaCxSVEMgLCBldGMgLi4gKQorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJSWYgdGhlIGRldmljZSBpcyBmb3VuZCBvbiB0aGUgYm9hcmQgdGhlIHRoZW4gdGhlIGZ1bmN0aW9ucyByZXR1cm5zIHRoZQorKglkZXYgYnVzIG51bWJlciBlbHNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIDB4RkZGRkZGRkYKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VMzIgbXZCb2FyZEdldERldkJ1c051bShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcykKK3sKKwlNVl9ERVZfQ1NfSU5GTyAqZGV2RW50cnkgPSBtdkJvYXJkR2V0RGV2RW50cnkoZGV2TnVtLCBkZXZDbGFzcyk7CisKKwlpZiAoZGV2RW50cnkpCisJCXJldHVybiBkZXZFbnRyeS0+YnVzTnVtOworCisJcmV0dXJuIDB4RkZGRkZGRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRHZXREZXZTdGF0ZQorKgorKiBERVNDUklQVElPTjoKKyoJUmV0dXJuIHRoZSBkZXZpY2UncyBhY3Rpdml0eSBzdGF0ZS4KKyoKKyogSU5QVVQ6CisqCWRldkluZGV4IC0gVGhlIGRldmljZSBzZXF1ZW50aWFsIG51bWJlciBvbiB0aGUgYm9hcmQKKyoJZGV2VHlwZSAtIFRoZSBkZXZpY2UgdHlwZSAoIEZsYXNoLFJUQyAsIGV0YyAuLiApCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKglJZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIHRoZSBib2FyZCB0aGUgdGhlbiB0aGUgZnVuY3Rpb25zIHJldHVybnMgdGhlCisqCWRldiBhY3Rpdml0eSBzdGF0ZSBlbHNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIDB4RkZGRkZGRkYKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRHZXREZXZTdGF0ZShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcykKK3sKKwlNVl9ERVZfQ1NfSU5GTyAqZGV2RW50cnkgPSBtdkJvYXJkR2V0RGV2RW50cnkoZGV2TnVtLCBkZXZDbGFzcyk7CisKKwlpZiAoZGV2RW50cnkpCisJCXJldHVybiBkZXZFbnRyeS0+YWN0aXZlOworCisJcmV0dXJuIDB4RkZGRkZGRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRTZXREZXZTdGF0ZQorKgorKiBERVNDUklQVElPTjoKKyoJU2V0cyB0aGUgZGV2aWNlJ3MgYWN0aXZpdHkgc3RhdGUuCisqCisqIElOUFVUOgorKglkZXZJbmRleCAtIFRoZSBkZXZpY2Ugc2VxdWVudGlhbCBudW1iZXIgb24gdGhlIGJvYXJkCisqICAgZGV2VHlwZSAtIFRoZSBkZXZpY2UgdHlwZSAoIEZsYXNoLFJUQyAsIGV0YyAuLiApCisqICAgbmV3U3RhdGUgLSByZXF1ZXN0ZWQgZGVldmljZSBzdGF0ZQorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJSWYgdGhlIGRldmljZSBpcyBmb3VuZCBvbiB0aGUgYm9hcmQgdGhlIHRoZW4gdGhlIGZ1bmN0aW9ucyByZXR1cm5zCisqCU1WX09LIGVsc2UgTVZfRVJST1IKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZCb2FyZFNldERldlN0YXRlKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzLCBNVl9CT09MIG5ld1N0YXRlKQoreworCU1WX0RFVl9DU19JTkZPICpkZXZFbnRyeSA9IG12Qm9hcmRHZXREZXZFbnRyeShkZXZOdW0sIGRldkNsYXNzKTsKKworCWlmIChkZXZFbnRyeSkgeworCQlkZXZFbnRyeS0+YWN0aXZlID0gbmV3U3RhdGU7CisJCXJldHVybiBNVl9PSzsKKwl9IGVsc2UKKwkJcmV0dXJuIE1WX0VSUk9SOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkJvYXJkVHdzaUFkZHJUeXBlR2V0IC0KICoKICogREVTQ1JJUFRJT046CkBAIC0xMTI3LDE0ICsxMzU0LDIyIEBACiBzdGF0aWMgTVZfVTMyIGdCb2FyZElkID0gLTE7CiBNVl9WT0lEIG12Qm9hcmRTZXQoTVZfVTMyIGJvYXJkSWQpCiB7CisJLyogTWFydmVsbCBCb2JLIEJvYXJkcyAqLworCWlmIChib2FyZElkID49IEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCT0JLX01BUlZFTExfTUFYX0JPQVJEX0lEKSB7IC8qIE1hcnZlbGwgQm9hcmQgKi8KKwkJYm9hcmQgPSBtYXJ2ZWxsQk9CS0JvYXJkSW5mb1RibFttdkJvYXJkSWRJbmRleEdldChib2FyZElkKV07CisJCWdCb2FyZElkID0gYm9hcmRJZDsKIAkvKiBNYXJ2ZWxsIEJvYmNhdDIgQm9hcmRzICovCi0JaWYgKGJvYXJkSWQgPj0gQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSAmJiBib2FyZElkIDwgQkMyX01BUlZFTExfTUFYX0JPQVJEX0lEKSB7IC8qIE1hcnZlbGwgQm9hcmQgKi8KKwl9IGVsc2UgaWYgKGJvYXJkSWQgPj0gQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSAmJiBib2FyZElkIDwgQkMyX01BUlZFTExfTUFYX0JPQVJEX0lEKSB7IC8qIE1hcnZlbGwgQm9hcmQgKi8KIAkJYm9hcmQgPSBtYXJ2ZWxsQkMyQm9hcmRJbmZvVGJsW212Qm9hcmRJZEluZGV4R2V0KGJvYXJkSWQpXTsKIAkJZ0JvYXJkSWQgPSBib2FyZElkOwogCS8qIE1hcnZlbGwgQWxsZXlDYXQzIEJvYXJkcyAqLwogCX0gZWxzZSBpZiAoYm9hcmRJZCA+PSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsgLyogTWFydmVsbCBCb2FyZCAqLwogCQlib2FyZCA9IG1hcnZlbGxBQzNCb2FyZEluZm9UYmxbbXZCb2FyZElkSW5kZXhHZXQoYm9hcmRJZCldOwogCQlnQm9hcmRJZCA9IGJvYXJkSWQ7CisJLyogQ3VzdG9tZXIgQm9iSyBCb2FyZHMgKi8KKwl9IGVsc2UgaWYgKGJvYXJkSWQgPj0gQk9CS19DVVNUT01FUl9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCT0JLX0NVU1RPTUVSX01BWF9CT0FSRF9JRCkgey8qQ3VzdG9tZXIgQm9hcmQqLworCQlib2FyZCA9IGN1c3RvbWVyQk9CS0JvYXJkSW5mb1RibFttdkJvYXJkSWRJbmRleEdldChib2FyZElkKV07CisJCWdCb2FyZElkID0gYm9hcmRJZDsKIAkvKiBDdXN0b21lciBCb2JjYXQyIEJvYXJkcyAqLwogCX0gZWxzZSBpZiAoYm9hcmRJZCA+PSBCQzJfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSAmJiBib2FyZElkIDwgQkMyX0NVU1RPTUVSX01BWF9CT0FSRF9JRCkgeyAvKiBDdXN0b21lciBCb2FyZCAqLwogCQlib2FyZCA9IGN1c3RvbWVyQkMyQm9hcmRJbmZvVGJsW212Qm9hcmRJZEluZGV4R2V0KGJvYXJkSWQpXTsKQEAgLTExNDMsMTQgKzEzNzgsMjQgQEAKIAl9IGVsc2UgaWYgKGJvYXJkSWQgPj0gQUMzX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UgJiYgYm9hcmRJZCA8IEFDM19DVVNUT01FUl9NQVhfQk9BUkRfSUQpIHsgLyogQ3VzdG9tZXIgQm9hcmQgKi8KIAkJYm9hcmQgPSBjdXN0b21lckFDM0JvYXJkSW5mb1RibFttdkJvYXJkSWRJbmRleEdldChib2FyZElkKV07CiAJCWdCb2FyZElkID0gYm9hcmRJZDsKKwkvKiBNYXJ2ZWxsIEFYUC1BTUMgQm9hcmQgKi8KKwl9IGVsc2UgaWYgKGJvYXJkSWQgPT0gREJfNzhYNjBfQU1DX0lEKSB7CisJCS8qIFRoaXMgY2FzZSBzaG91bGQgZW50ZXIgb25seSBmb3IgTFNQIDMuMi8zLjQgZmxvdzoKKwkJICogVGhpcyBib2FyZCBJRCBpcyBwYXNzZWQgZnJvbSBBWFAtQU1DIFUtQm9vdCAyMDExLjEyLCBhbmQgc2hhcmVkIGhlcmUgb25seQorCQkgKiBmb3IgTGludXggdXNhZ2UgKEFYUCBmYW1pbHkgaXMgc2hhcmVkIHdpdGggTVNZUyBmYW1pbHkgaW4gTFNQKSAqLworCQlib2FyZCA9IG1hcnZlbGxBWFBib2FyZEluZm9UYmxbMF07CisJCWdCb2FyZElkID0gYm9hcmRJZDsKIAl9IGVsc2UgewogCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IHdyb25nIGJvYXJkIElkICglZClcbiIsIF9fZnVuY19fLCBib2FyZElkKTsKICNpZmRlZiBDT05GSUdfQUxMRVlDQVQzCiAJCWdCb2FyZElkID0gQUMzX0NVU1RPTUVSX0JPQVJEX0lEMDsKIAkJYm9hcmQgPSBjdXN0b21lckFDM0JvYXJkSW5mb1RibFtnQm9hcmRJZF07Ci0jZWxzZQorI2VsaWYgZGVmaW5lZCBDT05GSUdfQk9CQ0FUMgogCQlnQm9hcmRJZCA9IEJDMl9DVVNUT01FUl9CT0FSRF9JRDA7CiAJCWJvYXJkID0gY3VzdG9tZXJCQzJCb2FyZEluZm9UYmxbZ0JvYXJkSWRdOworI2Vsc2UKKwkJZ0JvYXJkSWQgPSBCT0JLX0NFVFVTX0NVU1RPTUVSX0JPQVJEX0lEMDsKKwkJYm9hcmQgPSBjdXN0b21lckJPQktCb2FyZEluZm9UYmxbZ0JvYXJkSWRdOwogI2VuZGlmCiAJCW12T3NQcmludGYoIkFwcGx5aW5nIGRlZmF1bHQgQ3VzdG9tZXIgYm9hcmQgSUQgKCVkOiAlcylcbiIsIGdCb2FyZElkLCBib2FyZC0+Ym9hcmROYW1lKTsKIAl9CkBAIC0xMTc5LDU1ICsxNDI0LDU5IEBACiAJaWYgKGdCb2FyZElkICE9IC0xKQogCQlyZXR1cm4gZ0JvYXJkSWQ7CiAKLSNpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKKyNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAogCi0JI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisJI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMwogCQkjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzAKIAkJCWdCb2FyZElkID0gQUMzX0NVU1RPTUVSX0JPQVJEX0lEMDsKIAkJI2VsaWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzEKIAkJCWdCb2FyZElkID0gQUMzX0NVU1RPTUVSX0JPQVJEX0lEMTsKIAkJI2VuZGlmCi0JI2Vsc2UJLyogIUNPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCi0KLQkvKiBGb3IgTWFydmVsbCBCb2FyZHM6IFRlbXBvcmFyaWx5IHNldCBnZW5lcmljIGJvYXJkIHN0cnVjdCBwb2ludGVyIHRvCi0JICAgdXNlIFNAUiBUV1NJIGFkZHJlc3MsIGFuZCByZWFkIGJvYXJkIElEICovCi0JYm9hcmQgPSBtYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsW212Qm9hcmRJZEluZGV4R2V0KERCX0FDM19JRCldOwotCWdCb2FyZElkID0gREJfQUMzX0lEOyAvKiBUZXJwb3JhcnkgZm9yIHVzYWdlIGJ5IG12Q3RybERldkZhbWlseUlkR2V0ICovCi0JTVZfVTggcmVhZFZhbHVlOwotCi0JaWYgKG12Qm9hcmRTYXJCb2FyZElkR2V0KCZyZWFkVmFsdWUpICE9IE1WX09LIHx8IHJlYWRWYWx1ZSA+PSBBQzNfTUFSVkVMTF9CT0FSRF9OVU0pIHsKLQkJbXZPc1ByaW50ZigiJXM6IEVycm9yIG9idGFpbmluZyBCb2FyZCBJRCBmcm9tIEVFUFJPTSAoJWQpXG4iLCBfX2Z1bmNfXywgcmVhZFZhbHVlKTsKLQkJbXZPc1ByaW50ZigiJXM6IFNldHRpbmcgZGVmYXVsdCBib2FyZDogREItRFhBQzMtTU1cbiIsIF9fZnVuY19fKTsKLQkJcmVhZFZhbHVlID0gREJfQUMzX0lEIC0gQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRTsKLQl9Ci0KLQlnQm9hcmRJZCA9IEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyByZWFkVmFsdWU7Ci0JI2VuZGlmCS8qIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCi0KLSNlbHNlIC8qIENPTkZJR19CT0JDQVQyICovCi0KLQkjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKwkjZWxpZiBkZWZpbmVkIENPTkZJR19CT0JDQVQyCiAJCSNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMAogCQkJZ0JvYXJkSWQgPSBCQzJfQ1VTVE9NRVJfQk9BUkRfSUQwOwogCQkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQogCQkJZ0JvYXJkSWQgPSBCQzJfQ1VTVE9NRVJfQk9BUkRfSUQxOwogCQkjZW5kaWYKLQkjZWxzZQkvKiAhQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KLQotCQkjaWYgZGVmaW5lZChEQl9CT0JDQVQyKQotCQkJZ0JvYXJkSWQgPSBEQl9EWF9CQzJfSUQ7Ci0JCSNlbGlmIGRlZmluZWQoUkRfQk9CQ0FUMikKLQkJCWdCb2FyZElkID0gUkRfRFhfQkMyX0lEOwotCQkjZWxpZiBkZWZpbmVkKFJEX01UTF9CT0JDQVQyKQotCQkJZ0JvYXJkSWQgPSBSRF9NVExfQkMyOwotCQkjZWxzZQotCQkJbXZPc1ByaW50ZigiJXM6IEJvYXJkIElEIG11c3QgYmUgZGVmaW5lZCFcbiIsIF9fZnVuY19fKTsKLQkJCXdoaWxlICgxKQotCQkJCWNvbnRpbnVlOworCSNlbHNlIC8qIEJPQksgKi8KKwkJI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF8wCisJCQlnQm9hcmRJZCA9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfQk9BUkRfSUQwOworCQkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQorCQkJZ0JvYXJkSWQgPSBCT0JLX0NBRUxVTV9DVVNUT01FUl9CT0FSRF9JRDE7CiAJCSNlbmRpZgotCSNlbmRpZiAvKiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLworCSNlbmRpZgogCi0jZW5kaWYKKyNlbHNlCS8qICFDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLworCisJTVZfVTggcmVhZFZhbHVlOworCU1WX0JPQVJEX0lORk8gKiptdkJvYXJkSW5mb1RibCA9CisJI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworCQltYXJ2ZWxsQUMzQm9hcmRJbmZvVGJsOworCSNlbGlmIGRlZmluZWQgQ09ORklHX0JPQkNBVDIKKwkJbWFydmVsbEJDMkJvYXJkSW5mb1RibDsKKwkjZWxzZSAvKiBCT0JLICovCisJCW1hcnZlbGxCT0JLQm9hcmRJbmZvVGJsOworCSNlbmRpZgorCisJLyogVGVtcG9yYXJpbHkgc2V0IGdlbmVyaWMgYm9hcmQgc3RydWN0IHBvaW50ZXIsIHRvIHNldC9nZXQgRUVQUk9NIGkyYyBhZGRyZXNzLCBhbmQgcmVhZCBib2FyZCBJRCAqLworCWJvYXJkID0gbXZCb2FyZEluZm9UYmxbbXZCb2FyZElkSW5kZXhHZXQoTVZfREVGQVVMVF9CT0FSRF9JRCldOworCWdCb2FyZElkID0gTVZfREVGQVVMVF9CT0FSRF9JRDsgLyogVGVycG9yYXJ5IGZvciB1c2FnZSBieSBtdkN0cmxEZXZGYW1pbHlJZEdldCAqLworCisJaWYgKG12Qm9hcmRTYXJCb2FyZElkR2V0KCZyZWFkVmFsdWUpICE9IE1WX09LKSB7CisJCW12T3NQcmludGYoIiVzOiBFcnJvciBvYnRhaW5pbmcgQm9hcmQgSUQgZnJvbSBFRVBST00gKCVkKVxuIiwgX19mdW5jX18sIHJlYWRWYWx1ZSk7CisJCW12T3NQcmludGYoIiVzOiBTZXR0aW5nIGRlZmF1bHQgYm9hcmQgdG86ICVzXG4iLCBfX2Z1bmNfXywgYm9hcmQtPmJvYXJkTmFtZSk7CisJCXJldHVybiBNVl9ERUZBVUxUX0JPQVJEX0lEOworCX0KKwlyZWFkVmFsdWUgPSByZWFkVmFsdWUgJiAoQk9BUkRfSURfSU5ERVhfTUFTSyAtIDEpOworCisJaWYgKHJlYWRWYWx1ZSA+PSBNVl9NQVJWRUxMX0JPQVJEX05VTSkgeworCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IHJlYWQgd3JvbmcgYm9hcmQgSUQgKCVkKVxuIiwgX19mdW5jX18sIHJlYWRWYWx1ZSk7CisJCW12T3NQcmludGYoIiVzOiBTZXR0aW5nIGRlZmF1bHQgYm9hcmQgdG86ICVzXG4iLCBfX2Z1bmNfXywgYm9hcmQtPmJvYXJkTmFtZSk7CisJCXJldHVybiBNVl9ERUZBVUxUX0JPQVJEX0lEOworCX0KKwlnQm9hcmRJZCA9IE1BUlZFTExfQk9BUkRfSURfQkFTRSArIHJlYWRWYWx1ZTsKKworI2VuZGlmIC8qIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCiAKIAlyZXR1cm4gZ0JvYXJkSWQ7CiB9CkBAIC0xNDMwLDkgKzE2NzksOSBAQAogCU1WX1U4CQlzYXIwOwogCU1WX1NUQVRVUwlyYzE7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VMzIJCWZpZWxkT2ZmcyA9IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpID8gMCA6IDI7CisJTVZfVTMyCQlmaWVsZE9mZnMgPSAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpID8gMiA6IDA7CiAKLQlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBDb250cm9sbGVyIGZhbWlseSAoMHglMDR4KSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgZmFtaWx5KSk7CiAJCXJldHVybiBNVl9FUlJPUjsKIAl9CkBAIC0xNDUyLDkgKzE3MDEsMTAgQEAKIAlNVl9VOAkJc2FyMDsKIAlNVl9TVEFUVVMJcmMxOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0JTVZfVTMyCQlmaWVsZE9mZnMgPSAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSA/IDAgOiAyOworCU1WX1UzMgkJZmllbGRPZmZzID0gKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSA/IDIgOiAwOwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKQorCQkmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQpAQCAtMTQ3NSw2ICsxNzI1LDc1IEBACiAJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIGNvcmUgRnJlcU9wdCBTQFIgc3VjY2VlZGVkXG4iKSk7CiAJcmV0dXJuIE1WX09LOwogfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBSZWFkIHRoZSBuZXcgU1cgU2F0UiBmaWVsZCAiYnlwYXNzX2NvcmVjbG9jayIgZnJvbSBFRVBST00oMHg1MCksIHJlZyM2IGJpdHNbMjowXQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkQnlwYXNzQ29yZUZyZXFHZXQoTVZfVTggKnZhbHVlKQoreworCU1WX1U4CQlzYXIwOworCU1WX1NUQVRVUwlyYzE7CisJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKKworCWlmIChmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpIHsKKwkJREIobXZPc1ByaW50ZigiJXM6IENvbnRyb2xsZXIgZmFtaWx5ICgweCUwNHgpIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCBmYW1pbHkpKTsKKwkJcmV0dXJuIE1WX0VSUk9SOworCX0KKworCS8qIFRoZSBDb3JlIEZyZXF1ZW5jeSBpbiBCeXBhc3MgbW9kZSBpcyB0YWtlbiBmcm9tIHRoZSBmaXJzdCBhZGRyZXNzLXZhbHVlIHBhaXIgb2YgdGhlIEVFUFJPTQorCSAgIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLCBJbiBvcmRlciB0byBzdXBwb3J0IG5vcm1hbCBUV1NJIGluaXQgc2VxdWVuY2UgZmxvdywgdGhlIGZpcnN0IHBhaXIKKwkgICBvZiBEV09SRFMgb24gRUVQUk9NIHNob3VsZCBjb250YWluIGFuIGFkZHJlc3MgKGJ5dGVzIDAtMykgb2Ygc29tZSBzY3JhdGNoIHBhZCByZWdpc3RlcgorCSAgIChmb3IgaW5zdGFuY2UgYW4gVUFSVCBTQ1IpIGFuZCBhIHZhbHVlIChieXRlcyA0LTcpLCB3aGljaCB3aWxsIGJlIHBhcnRpYWxseSBpbnRlcnByZXRlZAorCSAgIGFzIENvcmUgRnJlcSBpbiBieXBhc3MgbW9kZSAoYml0c1syOjBdIG9mIGJ5dGUgNikKKwkqLworCisJcmMxID0gbXZCb2FyZFR3c2lSZWFkKEJPQVJEX0RFVl9UV1NJX0lOSVRfRVBST00sIDAsIDYsICZzYXIwKTsKKwlpZiAoTVZfRVJST1IgPT0gcmMxKQorCQlyZXR1cm4gTVZfRVJST1I7CisKKwkqdmFsdWUgPSAoc2FyMCAmIDB4Nyk7CisKKwlyZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFdyaXRlIHRoZSBuZXcgU1cgU2F0UiBmaWVsZCAiYnlwYXNzX2NvcmVjbG9jayIgdG8gRUVQUk9NKDB4NTApLCByZWcjNiBiaXRzWzI6MF0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgbXZCb2FyZEJ5cGFzc0NvcmVGcmVxU2V0KE1WX1U4IGZyZXFWYWwpCit7CisJTVZfVTgJCXNhcjA7CisJTVZfU1RBVFVTCXJjMTsKKwlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOworCisJaWYgKGZhbWlseSAhPSBNVl9CT0JLX0RFVl9JRCkgeworCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogVGhlIENvcmUgRnJlcXVlbmN5IGluIEJ5cGFzcyBtb2RlIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IGFkZHJlc3MtdmFsdWUgcGFpciBvZiB0aGUgRUVQUk9NCisJICAgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UsIEluIG9yZGVyIHRvIHN1cHBvcnQgbm9ybWFsIFRXU0kgaW5pdCBzZXF1ZW5jZSBmbG93LCB0aGUgZmlyc3QgcGFpcgorCSAgIG9mIERXT1JEUyBvbiBFRVBST00gc2hvdWxkIGNvbnRhaW4gYW4gYWRkcmVzcyAoYnl0ZXMgMC0zKSBvZiBzb21lIHNjcmF0Y2ggcGFkIHJlZ2lzdGVyCisJICAgKGZvciBpbnN0YW5jZSBhbiBVQVJUIFNDUikgYW5kIGEgdmFsdWUgKGJ5dGVzIDQtNyksIHdoaWNoIHdpbGwgYmUgcGFydGlhbGx5IGludGVycHJldGVkCisJICAgYXMgQ29yZSBGcmVxIGluIGJ5cGFzcyBtb2RlIChiaXRzWzI6MF0gb2YgYnl0ZSA2KQorCSovCisKKwlyYzEgPSBtdkJvYXJkVHdzaVJlYWQoQk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMCwgNiwgJnNhcjApOworCWlmIChNVl9FUlJPUiA9PSByYzEpCisJCXJldHVybiBNVl9FUlJPUjsKKworCXNhcjAgJj0gfjB4NzsKKwlzYXIwIHw9IChmcmVxVmFsICYgMHg3KTsKKworCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVdyaXRlKEJPQVJEX0RFVl9UV1NJX0lOSVRfRVBST00sIDAsIDYsIHNhcjApKSB7CisJCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBCeXBhc3MgY29yZSBGcmVxIFNAUiBmYWlsXG4iKSk7CisJCXJldHVybiBNVl9FUlJPUjsKKwl9CisKKworCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBCeXBzcyBjb3JlIEZyZXFPcHQgU0BSIHN1Y2NlZWRlZFxuIikpOworCXJldHVybiBNVl9PSzsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgbXZCb2FyZENwdUZyZXFHZXQoTVZfVTggKnZhbHVlKQogewpAQCAtMTQ4OSw3ICsxODA4LDE3IEBACiAJCQkoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDIsIDAsICZzYXIyKSkpCiAJCQlyZXR1cm4gTVZfRVJST1I7CiAKLQkJKnZhbHVlID0gKCgoKHNhcjIgJiAweDEpKSA8PCAzKSB8ICgoc2FyICYgMHgxOCkgPj4gMykpOworCQkqdmFsdWUgPSAoKCgoc2FyMiAmIDB4MSkpIDw8IDIpIHwgKChzYXIgJiAweDE4KSA+PiAzKSk7CisKKwl9IGVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCQlNVl9VOAkJc2FyMjsKKworCQkvKiBCT0JLICovCisJCWlmICgoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDAsIDAsICZzYXIpKSB8fAorCQkJKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgzLCAwLCAmc2FyMikpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCSp2YWx1ZSA9ICgoKChzYXIyICYgMHgxKSkgPDwgMikgfCAoKHNhciAmIDB4MTgpID4+IDMpKTsKIAogCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpIHsKIApAQCAtMTUzNCw2ICsxODYzLDI3IEBACiAJCQlyZXR1cm4gTVZfRVJST1I7CiAJCX0KIAorCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCU1WX1U4CQlzYXIyOworCQkvKiBCT0JLICovCisJCWlmICgoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDAsIDAsICZzYXIpKSB8fAorCQkJKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgzLCAwLCAmc2FyMikpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCXNhciAgJj0gfjB4MTg7CisJCXNhcjIgJj0gfjB4MTsKKwkJc2FyICB8PSAoKGZyZXFWYWwgJiAweDAzKSA8PCAzKTsKKwkJc2FyMiB8PSAoKGZyZXFWYWwgJiAweDA0KSA+PiAyKTsKKworCQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDAsIDAsIHNhcikpIHsKKwkJCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBDcHVGcmVxKDEpIFNAUiBmYWlsXG4iKSk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgzLCAwLCBzYXIyKSkgeworCQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIENwdUZyZXEoMikgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCiAJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgewogCiAJCS8qIEFDMyAqLwpAQCAtMTU2MywxNiArMTkxMywyNyBAQAogCU1WX1U4CQlzYXIyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKLQlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSB7CisJaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCAmJiBmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpIHsKIAkJREIobXZPc1ByaW50ZigiJXM6IEFDMyBjb250cm9sbGVyIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMyAqLwogCX0KIAotCS8qIEJDMiAqLwotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcjIpKQotCQlyZXR1cm4gTVZfRVJST1I7CisJaWYgKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkgewogCi0JKnZhbHVlID0gKChzYXIyICYgMHgwRSkgPj4gMSk7CisJCS8qIEJDMiAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDIsIDAsICZzYXIyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKKworCQkqdmFsdWUgPSAoKHNhcjIgJiAweDBFKSA+PiAxKTsKKworCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisKKwkJLyogQk9CSyAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDAsIDAsICZzYXIyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKKworCQkqdmFsdWUgPSAoc2FyMiAmIDB4MDcpOworCX0KIAogCXJldHVybiBNVl9PSzsKIH0KQEAgLTE1ODMsMjIgKzE5NDQsNDEgQEAKIAlNVl9VOAkJc2FyMjsKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwogCi0JaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkgeworCWlmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQgJiYgZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBBQzMgY29udHJvbGxlciBmYW1pbHkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE1WX0VSUk9SOyAvKiBBQzMgKi8KIAl9CiAKLQkvKiBCQzIgKi8KLQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDIsIDAsICZzYXIyKSkKLQkJcmV0dXJuIE1WX0VSUk9SOworCWlmIChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKIAotCXNhcjIgJj0gfjB4RTsKLQlzYXIyIHw9ICgoZnJlcVZhbCAmIDB4MDcpIDw8IDEpOworCQkvKiBCQzIgKi8KKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgyLCAwLCAmc2FyMikpCisJCQlyZXR1cm4gTVZfRVJST1I7CiAKLQlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KDIsIDAsIHNhcjIpKSB7Ci0JCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBUTS1GcmVxIFNAUiBmYWlsXG4iKSk7Ci0JCXJldHVybiBNVl9FUlJPUjsKKwkJc2FyMiAmPSB+MHhFOworCQlzYXIyIHw9ICgoZnJlcVZhbCAmIDB4MDcpIDw8IDEpOworCisJCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMiwgMCwgc2FyMikpIHsKKwkJCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBUTS1GcmVxIFNAUiBmYWlsXG4iKSk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKwl9IGVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCisJCS8qIEJPQksgKi8KKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgwLCAwLCAmc2FyMikpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJc2FyMiAmPSB+MHg3OworCQlzYXIyIHw9IChmcmVxVmFsICYgMHgwNyk7CisKKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgwLCAwLCBzYXIyKSkgeworCQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIFRNLUZyZXEgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQogCX0KKworCS8qIEJDMiBvciBCT0JLKi8KKwogCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBUTS1GcmVxIFNAUiBzdWNjZWVkZWRcbiIpKTsKIAogCXJldHVybiBNVl9PSzsKQEAgLTE2MTAsMTYgKzE5OTAsMjcgQEAKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKLQlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSB7CisJaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCAmJiBmYW1pbHkgIT0gTVZfQk9CS19ERVZfSUQpIHsKIAkJREIobXZPc1ByaW50ZigiJXM6IEFDMyBjb250cm9sbGVyIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOwogCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMyAqLwogCX0KIAotCS8qIEJDMiAqLwotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMywgMCwgJnNhcikpCi0JCXJldHVybiBNVl9FUlJPUjsKKwlpZiAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSB7CiAKLQkqdmFsdWUgPSAoc2FyICYgMHg4KSA+PiAzOworCQkvKiBCQzIgKi8KKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgzLCAwLCAmc2FyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKKworCQkqdmFsdWUgPSAoc2FyICYgMHg4KSA+PiAzOworCisJfSBlbHNlIGlmIChmYW1pbHkgPT0gTVZfQk9CS19ERVZfSUQpIHsKKworCQkvKiBCT0JLICovCisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMSwgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJKnZhbHVlID0gKHNhciAmIDB4OCkgPj4gMzsKKwl9CiAKIAlyZXR1cm4gTVZfT0s7CiB9CkBAIC0xNjMwLDIxICsyMDIxLDM4IEBACiAJTVZfVTgJCXNhcjsKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwogCi0JaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkgeworCWlmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQgJiYgZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSB7CiAJCURCKG12T3NQcmludGYoIiVzOiBBQzMgY29udHJvbGxlciBmYW1pbHkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pKTsKIAkJcmV0dXJuIE1WX0VSUk9SOyAvKiBBQzMgKi8KIAl9CiAKLQkvKiBCQzIgKi8KLQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDMsIDAsICZzYXIpKQotCQlyZXR1cm4gTVZfRVJST1I7CisJaWYgKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkgewogCi0Jc2FyICY9IH4oMHg4KTsKLQlzYXIgfD0gKChjcHUgJiAweDEpIDw8IDMpOworCQkvKiBCQzIgKi8KKwkJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgzLCAwLCAmc2FyKSkKKwkJCXJldHVybiBNVl9FUlJPUjsKIAotCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMywgMCwgc2FyKSkgewotCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgSlRBRyBDUFUgU0BSIGZhaWxcbiIpKTsKLQkJcmV0dXJuIE1WX0VSUk9SOworCQlzYXIgJj0gfigweDgpOworCQlzYXIgfD0gKChjcHUgJiAweDEpIDw8IDMpOworCisJCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMywgMCwgc2FyKSkgeworCQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIEpUQUcgQ1BVIFNAUiBmYWlsXG4iKSk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKworCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisKKwkJLyogQk9CSyAqLworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDEsIDAsICZzYXIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCXNhciAmPSB+KDB4OCk7CisJCXNhciB8PSAoKGNwdSAmIDB4MSkgPDwgMyk7CisKKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgxLCAwLCBzYXIpKSB7CisJCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgSlRBRyBDUFUgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQogCX0KIAogCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBKVEFHIENQVSAgU0BSIHN1Y2NlZWRlZFxuIikpOwpAQCAtMTY1OCw4ICsyMDY2LDggQEAKIAlNVl9VMTYJCWZhbWlseSA9IG12Q3RybERldkZhbWlseUlkR2V0KDApOwogCiAJaWYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkgewotCQlEQihtdk9zUHJpbnRmKCIlczogQUMzIGNvbnRyb2xsZXIgZmFtaWx5IGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiBNVl9FUlJPUjsgLyogQUMzICovCisJCURCKG12T3NQcmludGYoIiVzOiBPbmx5IFN1cHBvcnQgQkMyIGNvbnRyb2xsZXIgZmFtaWx5XG4iLCBfX2Z1bmNfXykpOworCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMy9CT0JLICovCiAJfQogCiAJLyogQkMyICovCkBAIC0xNjc4LDggKzIwODYsOCBAQAogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAKIAlpZiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSB7Ci0JCURCKG12T3NQcmludGYoIiVzOiBBQzMgY29udHJvbGxlciBmYW1pbHkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuIE1WX0VSUk9SOyAvKiBBQzMgKi8KKwkJREIobXZPc1ByaW50ZigiJXM6IE9ubHkgU3VwcG9ydCBCQzIgY29udHJvbGxlciBmYW1pbHlcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBNVl9FUlJPUjsgLyogQUMzL0JPQksgKi8KIAl9CiAKIAkvKiBCQzIgKi8KQEAgLTE3MDUsOCArMjExMyw4IEBACiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAogCWlmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpIHsKLQkJREIobXZPc1ByaW50ZigiJXM6IEFDMyBjb250cm9sbGVyIGZhbWlseSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gTVZfRVJST1I7IC8qIEFDMyAqLworCQlEQihtdk9zUHJpbnRmKCIlczogT25seSBTdXBwb3J0IEJDMiBjb250cm9sbGVyIGZhbWlseVxuIiwgX19mdW5jX18pKTsKKwkJcmV0dXJuIE1WX0VSUk9SOyAvKiBBQzMvQk9CSyAqLwogCX0KIAogCWlmIChwb3J0ID4gMSkgewpAQCAtMTgwOSw5ICsyMjE3LDkgQEAKIHsKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0JTVZfVTgJCXR3c2lEZXZpY2UgPSAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSA/IDMgOiAyOworCU1WX1U4CQl0d3NpRGV2aWNlID0gKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSA/IDIgOiAzOwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQpAQCAtMTgxOSw3ICsyMjI3LDEwIEBACiAJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCh0d3NpRGV2aWNlLCAwLCAmc2FyKSkKIAkJcmV0dXJuIE1WX0VSUk9SOwogCi0JKnZhbHVlID0gKHNhciAmIDB4Nyk7CisJaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkKKwkJKnZhbHVlID0gKChzYXIgJiAweDBFKSA+PiAxKTsKKwllbHNlCisJCSp2YWx1ZSA9IChzYXIgJiAweDcpOwogCiAJcmV0dXJuIE1WX09LOwogfQpAQCAtMTgyOSw5ICsyMjQwLDkgQEAKIHsKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0JTVZfVTgJCXR3c2lEZXZpY2UgPSAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSA/IDMgOiAyOworCU1WX1U4CQl0d3NpRGV2aWNlID0gKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSA/IDIgOiAzOwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQpAQCAtMTgzOSw4ICsyMjUwLDEzIEBACiAJaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCh0d3NpRGV2aWNlLCAwLCAmc2FyKSkKIAkJcmV0dXJuIE1WX0VSUk9SOwogCi0Jc2FyICY9IH4oMHg3KTsKLQlzYXIgfD0gKHZhbCAmIDB4Nyk7CisJaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCQlzYXIgJj0gfigweEUpOworCQlzYXIgfD0gKCh2YWwgJiAweDcpIDw8IDEpOworCX0gZWxzZSB7CisJCXNhciAmPSB+KDB4Nyk7CisJCXNhciB8PSAodmFsICYgMHg3KTsKKwl9CiAKIAlpZiAoTVZfT0sgIT0gbXZCb2FyZFR3c2lTYXRSU2V0KHR3c2lEZXZpY2UsIDAsIHNhcikpIHsKIAkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIEJvb3REZXYgU0BSIGZhaWxcbiIpKTsKQEAgLTE4NTUsMTYgKzIyNzEsMTcgQEAKIHsKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CisJTVZfVTgJCXR3c2lEZXZpY2UgPSAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSA/IDIgOiAwOwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQogCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgwLCAwLCAmc2FyKSkKLQkJcmV0dXJuIE1WX0VSUk9SOworCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQodHdzaURldmljZSwgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CiAKLQkqdmFsdWUgPSAoc2FyICYgMHgxRik7CisJCSp2YWx1ZSA9IChzYXIgJiAweDFGKTsKIAogCXJldHVybiBNVl9PSzsKIH0KQEAgLTE4NzQsMTkgKzIyOTEsMjAgQEAKIHsKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CisJTVZfVTgJCXR3c2lEZXZpY2UgPSAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSA/IDIgOiAwOwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQogCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgwLCAwLCAmc2FyKSkKKwlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KHR3c2lEZXZpY2UsIDAsICZzYXIpKQogCQlyZXR1cm4gTVZfRVJST1I7CiAKIAlzYXIgJj0gfigweDFGKTsKIAlzYXIgfD0gKHZhbCAmIDB4MUYpOwogCi0JaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgwLCAwLCBzYXIpKSB7CisJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCh0d3NpRGV2aWNlLCAwLCBzYXIpKSB7CiAJCURCKG12T3NQcmludGYoIkJvYXJkOiBXcml0ZSBkZXZpY2UtaWQgU0BSIGZhaWxcbiIpKTsKIAkJcmV0dXJuIE1WX0VSUk9SOwogCX0KQEAgLTE5NDUsMTcgKzIzNjMsMjQgQEAKIHsKIAlNVl9VOAkJc2FyOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0JTVZfVTgJCWJpdE9mZnNldCA9IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpID8gNCA6IDM7CisJTVZfVTgJCWJpdE9mZnNldCA9IChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgPyAzIDogNDsKIAotCWlmICgoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpICYmIChmYW1pbHkgIT0gTVZfQk9CQ0FUMl9ERVZfSUQpKSB7CisJaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JLX0RFVl9JRCkpIHsKIAkJREIobXZPc1ByaW50ZigiJXM6IENvbnRyb2xsZXIgZmFtaWx5ICgweCUwNHgpIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCBmYW1pbHkpKTsKIAkJcmV0dXJuIE1WX0VSUk9SOwogCX0KIAotCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcikpCi0JCXJldHVybiBNVl9FUlJPUjsKKwlpZiAoKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSB8fCAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSkgeworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDIsIDAsICZzYXIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOwogCi0JKnZhbCA9IChzYXIgJiAoMHgxIDw8IGJpdE9mZnNldCkpID4+IGJpdE9mZnNldDsKKwkJKnZhbCA9IChzYXIgJiAoMHgxIDw8IGJpdE9mZnNldCkpID4+IGJpdE9mZnNldDsKKwl9IGVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCQlpZiAoTVZfRVJST1IgPT0gbXZCb2FyZFR3c2lTYXRSR2V0KDMsIDAsICZzYXIpKQorCQkJcmV0dXJuIE1WX0VSUk9SOworCisJCSp2YWwgPSAoc2FyICYgKDB4MSA8PCBiaXRPZmZzZXQpKSA+PiBiaXRPZmZzZXQ7CisJfQogCiAJcmV0dXJuIE1WX09LOwogfQpAQCAtMTk2NSwyMiArMjM5MCwzNSBAQAogewogCU1WX1U4CQlzYXI7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKLQlNVl9VOAkJYml0T2Zmc2V0ID0gKGZhbWlseSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkgPyA0IDogMzsKKwlNVl9VOAkJYml0T2Zmc2V0ID0gKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKSA/IDMgOiA0OwogCi0JaWYgKChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgJiYgKGZhbWlseSAhPSBNVl9CT0JDQVQyX0RFVl9JRCkpIHsKKwlpZiAoKGZhbWlseSAhPSBNVl9BTExFWUNBVDNfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQkNBVDJfREVWX0lEKSAmJiAoZmFtaWx5ICE9IE1WX0JPQktfREVWX0lEKSkgewogCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwogCQlyZXR1cm4gTVZfRVJST1I7CiAJfQogCi0JaWYgKE1WX0VSUk9SID09IG12Qm9hcmRUd3NpU2F0UkdldCgyLCAwLCAmc2FyKSkKLQkJcmV0dXJuIE1WX0VSUk9SOworCWlmICgoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpIHx8IChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpKSB7CisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMiwgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CiAKLQlzYXIgJj0gfigweDEgPDwgYml0T2Zmc2V0KTsKLQlzYXIgfD0gKHZhbCAmIDB4MSkgPDwgYml0T2Zmc2V0OworCQlzYXIgJj0gfigweDEgPDwgYml0T2Zmc2V0KTsKKwkJc2FyIHw9ICh2YWwgJiAweDEpIDw8IGJpdE9mZnNldDsKIAotCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMiwgMCwgc2FyKSkgewotCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgcGNpbW9kZSBTQFIgZmFpbFxuIikpOwotCQlyZXR1cm4gTVZfRVJST1I7CisJCWlmIChNVl9PSyAhPSBtdkJvYXJkVHdzaVNhdFJTZXQoMiwgMCwgc2FyKSkgeworCQkJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIHBjaW1vZGUgU0BSIGZhaWxcbiIpKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCWlmIChNVl9FUlJPUiA9PSBtdkJvYXJkVHdzaVNhdFJHZXQoMywgMCwgJnNhcikpCisJCQlyZXR1cm4gTVZfRVJST1I7CisKKwkJc2FyICY9IH4oMHgxIDw8IGJpdE9mZnNldCk7CisJCXNhciB8PSAodmFsICYgMHgxKSA8PCBiaXRPZmZzZXQ7CisKKwkJaWYgKE1WX09LICE9IG12Qm9hcmRUd3NpU2F0UlNldCgzLCAwLCBzYXIpKSB7CisJCQlEQihtdk9zUHJpbnRmKCJCb2FyZDogV3JpdGUgcGNpbW9kZSBTQFIgZmFpbFxuIikpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CiAJfQogCiAJREIobXZPc1ByaW50ZigiQm9hcmQ6IFdyaXRlIHBjaW1vZGUgU0BSIHN1Y2NlZWRlZFxuIikpOwpAQCAtMjE4MiwxMiArMjYyMCw2IEBACiBNVl9TVEFUVVMgbXZCb2FyZFNhckJvYXJkSWRHZXQoTVZfVTggKnZhbHVlKQogewogCU1WX1U4CQlib2FyZElkOwotCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0KLQlpZiAoZmFtaWx5ICE9IE1WX0FMTEVZQ0FUM19ERVZfSUQpIHsKLQkJREIobXZPc1ByaW50ZigiJXM6IENvbnRyb2xsZXIgZmFtaWx5ICgweCUwNHgpIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIF9fZnVuY19fLCBmYW1pbHkpKTsKLQkJcmV0dXJuIE1WX0VSUk9SOwotCX0KIAogCS8qIFRoZSBCb2FyZCBJZCBpcyB0YWtlbiBmcm9tIHRoZSBmaXJzdCBhZGRyZXNzLXZhbHVlIHBhaXIgb2YgdGhlIEVFUFJPTSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZQogCSAgIEluIG9yZGVyIHRvIHN1cHBvcnQgbm9ybWFsIFRXU0kgaW5pdCBzZXF1ZW5jZSBmbG93LCB0aGUgZmlyc3QgcGFpciBvZiBEV09SRFMgb24gRUVQUk9NCkBAIC0yMjA4LDE0ICsyNjQwLDIxIEBACiAJTVZfVTgJCWJvYXJkSWQ7CiAJTVZfVTE2CQlmYW1pbHkgPSBtdkN0cmxEZXZGYW1pbHlJZEdldCgwKTsKIAotCWlmIChmYW1pbHkgIT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgewotCQlEQihtdk9zUHJpbnRmKCIlczogQ29udHJvbGxlciBmYW1pbHkgKDB4JTA0eCkgaXMgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIGZhbWlseSkpOwotCQlyZXR1cm4gTVZfRVJST1I7Ci0JfQotCi0JaWYgKHZhbCA+PSBBQzNfTUFSVkVMTF9CT0FSRF9OVU0pIHsKLQkJbXZPc1ByaW50ZigiJXM6IEVycm9yOiBVbnN1cHBvcnRlZCBib2FyZCBJRCAoJWQpXG4iLCBfX2Z1bmNfXywgdmFsKTsKLQkJcmV0dXJuIE1WX0VSUk9SOworCWlmIChmYW1pbHkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkgeworCQlpZiAodmFsID49IEFDM19NQVJWRUxMX0JPQVJEX05VTSkgeworCQkJbXZPc1ByaW50ZigiJXM6IEVycm9yOiBVbnN1cHBvcnRlZCBib2FyZCBJRCAoJWQpXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCWlmICh2YWwgPj0gQk9CS19NQVJWRUxMX0JPQVJEX05VTSkgeworCQkJbXZPc1ByaW50ZigiJXM6IEVycm9yOiBVbnN1cHBvcnRlZCBib2FyZCBJRCAoJWQpXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCX0gZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQkNBVDJfREVWX0lEKSB7CisJCWlmICh2YWwgPj0gQkMyX01BUlZFTExfQk9BUkRfTlVNKSB7CisJCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IFVuc3VwcG9ydGVkIGJvYXJkIElEICglZClcbiIsIF9fZnVuY19fLCB2YWwpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CiAJfQogCiAJLyogVGhlIEJvYXJkIElkIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IGFkZHJlc3MtdmFsdWUgcGFpciBvZiB0aGUgRUVQUk9NIGluaXRhbGl6YXRpb24gc2VxdW5jZQpAQCAtMjM2Nyw2ICsyODA2LDI5IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRDb25maWdBdXRvRGV0ZWN0RW5hYmxlZAorKgorKiBERVNDUklQVElPTjoKKyoJSW5kaWNhdGUgaWYgdGhlIGJvYXJkIHN1cHBvcnRzIGF1dG8gY29uZmlndXJhdGlvbiBhbmQgZGV0ZWN0aW9uIG9mCisqCW1vZHVsZXMuIFRoaXMgaXMgdXN1YWxseSBlbmFibGVkIGZvciBEQiBib2FyZHMgb25seS4KKyoKKyogSU5QVVQ6CisqCU5vbmUuCisqCisqIE9VVFBVVDoKKyoJTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9UUlVFIGlmIGF1dG8tY29uZmlnL2RldGVjdGlvbiBpcyBlbmFibGVkLgorKglNVl9GQUxTRSBvdGhlcndpc2UuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkQ29uZmlnQXV0b0RldGVjdEVuYWJsZWQoKQoreworCXJldHVybiBib2FyZC0+Y29uZmlnQXV0b0RldGVjdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZCb2FyZERlYnVnTGVnIC0gU2V0IHRoZSBib2FyZCBkZWJ1ZyBMZWRzCiAqCiAqIERFU0NSSVBUSU9OOiB0dXJuIG9uL29mZiBzdGF0dXMgbGVkcy4KQEAgLTI0NjAsNiArMjkyMiw1MyBAQAogCXJldHVybiBNVl9ORkNfRUNDX0RJU0FCTEU7CiAjZW5kaWYKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRDb21wYXRpYmxlTmFtZUdldAorKgorKiBERVNDUklQVElPTjogcmV0dXJuIHN0cmluZyBjb250YWluaW5nICdjb21wYXRpYmxlJyBwcm9wZXJ0eSB2YWx1ZQorKgkJbmVlZGVkIGZvciBEZXZpY2UgVHJlZSBhdXRvLXVwZGF0ZSBwYXJzaW5nIHNlcXVlbmNlCisqCisqIElOUFVUOiAgTm9uZQorKiBPVVRQVVQ6IE5vbmUuCisqCisqIFJFVFVSTjogbGVuZ3RoIG9mIHJldHVybmVkIHN0cmluZyAoaW5jbHVkaW5nIHNwZWNpYWwgZGVsaW1pdGVycykKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9VOCBtdkJvYXJkQ29tcGF0aWJsZU5hbWVHZXQoY2hhciAqcE5hbWVCdWZmKQoreworCU1WX1U4IGxlbiA9IDA7CisJTVZfVTMyIGJvYXJkSWQ7CisJLyogaS5lOiBjb21wYXRpYmxlID0gIm1hcnZlbGwsbXN5cyIsICJtYXJ2ZWxsLG1zeXMtYmMyIiwgIm1hcnZlbGwsbXN5cy1iYzItZGIiLCAibWFydmVsbCxhcm1hZGEtMzcwLXhwIjsgKi8KKwlsZW4gPSBzcHJpbnRmKHBOYW1lQnVmZiwgIm1hcnZlbGwsbXN5cyIpICsgMTsKKwkvKgorCSAqIGFwcGVuZCBuZXh0IHN0cmluZ3MgYWZ0ZXIgdGhlIE5VTEwgY2hhcmFjdGVyIHRoYXQgdGhlIHByZXZpb3VzCisJICogc3ByaW50ZiB3cm90ZS4gIFRoaXMgaXMgaG93IGEgZGV2aWNlIHRyZWUgc3RvcmVzIG11bHRpcGxlCisJICogc3RyaW5ncyBpbiBhIHByb3BlcnR5LgorCSAqLworCWJvYXJkSWQgPSBtdkJvYXJkSWRHZXQoKTsKKwlpZiAoYm9hcmRJZCA+PSBCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQpIHsKKwkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJjMiIpICsgMTsKKwkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJjMi1kYiIpICsgMTsKKwl9IGVsc2UgaWYgKGJvYXJkSWQgPj0gQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSAmJiBib2FyZElkIDwgQUMzX01BUlZFTExfTUFYX0JPQVJEX0lEKSB7CisJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1hYzMiKSArIDE7CisJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1hYzMtZGIiKSArIDE7CisJfSBlbHNlIGlmIChib2FyZElkID49IEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICYmIGJvYXJkSWQgPCBCT0JLX01BUlZFTExfTUFYX0JPQVJEX0lEKSB7CisJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1ib2JrIikgKyAxOworCQlpZiAoYm9hcmRJZCA9PSBCT0JLX0NFVFVTX0RCX0lEKSB7CisJCQlsZW4gKz0gc3ByaW50ZihwTmFtZUJ1ZmYgKyBsZW4sICJtYXJ2ZWxsLG1zeXMtYm9iay1jZXR1cyIpICsgMTsKKwkJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1ib2JrLWNldHVzLWRiIikgKyAxOworCQl9IGVsc2UgaWYgKGJvYXJkSWQgPT0gQk9CS19DQUVMVU1fREJfSUQpIHsKKwkJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1ib2JrLWNhZWx1bSIpICsgMTsKKwkJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1ib2JrLWNhZWx1bS1kYiIpICsgMTsKKwkJfSBlbHNlIGlmIChib2FyZElkID09IEJPQktfTEVXSVNfUkRfSUQpIHsKKwkJCWxlbiArPSBzcHJpbnRmKHBOYW1lQnVmZiArIGxlbiwgIm1hcnZlbGwsbXN5cy1ib2JrLWxld2lzIikgKyAxOworCQkJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxtc3lzLWJvYmstbGV3aXMtcmQiKSArIDE7CisJCX0KKwl9CisJbGVuICs9IHNwcmludGYocE5hbWVCdWZmICsgbGVuLCAibWFydmVsbCxhcm1hZGEtMzcwLXhwIikgKyAxOworCisJcmV0dXJuIGxlbjsKK30KIAogTVZfTkFORF9JRl9NT0RFIG12Qm9hcmROYW5kSWZHZXQoKQogewpAQCAtMjUzMCwzICszMDM5LDE0MSBAQAogCiAJcmV0dXJuIE1WX09LOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZGlzQW1jCisqIERFU0NSSVBUSU9OOiBNU1lTIHBsYXRmb3JtIGFyZSBub3QgQU1DIGNvbXBsaWFudCAtIHJldHVybiBhbHdheXMgZmFsc2UKKyoKKyogSU5QVVQ6ICBOb25lCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiBNVl9GQUxTRQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZCb2FyZGlzQW1jKHZvaWQpCit7CisJcmV0dXJuIE1WX0ZBTFNFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkUFBTbWlJbmRleEdldAorKiBERVNDUklQVElPTjogR2V0IHRoZSBQUCBTTUkgaW5kZXggZm9yIHRoZSBib2FyZAorKgorKiBJTlBVVDogIE5vbmUKKyogT1VUUFVUOiBQUCBTTUkgaW5kZXguCisqIFJFVFVSTjogTVZfVFJVRQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdkJvYXJkUFBTbWlJbmRleEdldChNVl9VMzIgKmluZGV4KQoreworCSppbmRleCA9IGJvYXJkLT5zbWlFeHRlcm5hbFBwSW5kZXg7CisJcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkVXBkYXRlQ29uZmlnZm9yRFQKKyogREVTQ1JJUFRJT046IFVwZGF0ZSBib2FyZCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSBmb3IgRFQgdXBkYXRlCisqCisqIElOUFVUOiAgTm9uZS4KKyogT1VUUFVUOiBOb25lLgorKiBSRVRVUk46IE5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdkJvYXJkVXBkYXRlQ29uZmlnZm9yRFQoTVZfVk9JRCkKK3sKKworfQorCisjaWZkZWYgQ09ORklHX01NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZGlzU2Rpb0Nvbm5lY3RlZAorKiBERVNDUklQVElPTjogcmV0dXJuIHRydWUgaWYgU0RJTyBjb25uZWN0ZWQgb24gYm9hcmQKKyoKKyogSU5QVVQ6ICBOb25lCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiBNVl9UUlVFOlNESU8gY29ubmVjdGVkIG9uIGJvYXJkCisqICAgICAgICAgTVZfRkFMU0U6IGVsc2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRpc1NkaW9Db25uZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gYm9hcmQtPmlzU2RNbWNDb25uZWN0ZWQ7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZEdldE1vZGVsTmFtZQorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGJvYXJkIG1vZGVsLgorKgorKiBPVVRQVVQ6CisqICAgICAgIHBOYW1lQnVmZiAtIEJ1ZmZlciB0byBjb250YWluIGJvYXJkIG1vZGVsIG5hbWUgc3RyaW5nLiBNaW5pbXVtIHNpemUgMTI4IGNoYXJzLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZCb2FyZEdldE1vZGVsTmFtZShjaGFyICpwTmFtZUJ1ZmYpCit7CisJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiTWFydmVsbCBNU1lTICVzICVzIiwgYm9hcmQtPm1vZGVsTmFtZSwgYm9hcmQtPmJvYXJkTmFtZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRJc1BwU21pCisqIERFU0NSSVBUSU9OOgorKgljaGVja3Mgd2hldGhlciBQUF9TTUkgaXMgdXNlZCBvciBub3QKKyoKKyogSU5QVVQ6ICBOb25lCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiBNVl9UUlVFIFBQX1NNSSBpcyB1c2VkCisqCSAgTVZfRkFMU0Ugb3RoZXJ3aXNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkSXNQcFNtaSh2b2lkKQoreworCXJldHVybiBib2FyZC0+aXNTbWlFeHRlcm5hbFBwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkUGluQ3RybE5hbWVHZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29tcGF0aWJsZSBzdHJpbmcgb2YgcGluY3RybAorKgorKiBPVVRQVVQ6CisqICAgICAgIGNvbXBhdGlibGVCdWYgLSBCdWZmZXIgdG8gY29udGFpbiBwaW5jdHJsIGNvbXBhdGlibGUgc3RyaW5nCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBtdkJvYXJkUGluQ3RybE5hbWVHZXQoY2hhciAqY29tcGF0aWJsZUJ1ZikKK3sKKwltdk9zU1ByaW50Zihjb21wYXRpYmxlQnVmLCAibWFydmVsbCxiYzItYWMzLXBpbmN0cmwiKTsKK30KKworI2lmZGVmIE1WX0NNMworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZElzQ20zCisqIERFU0NSSVBUSU9OOgorKgljaGVja3Mgd2hldGhlciBDTTMgaXMgdXNlZCBvciBub3QKKyoKKyogSU5QVVQ6ICBOb25lCisqIE9VVFBVVDogTm9uZS4KKyogUkVUVVJOOiBNVl9UUlVFIENNMyBpcyB1c2VkCisqCSAgTVZfRkFMU0Ugb3RoZXJ3aXNlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfQk9PTCBtdkJvYXJkSXNDbTModm9pZCkKK3sKKwlyZXR1cm4gYm9hcmQtPmlzQ20zOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkJvYXJkQ20zQ29tcGF0aWJsZU5hbWVHZXQKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29tcGF0aWJsZSBzdHJpbmcgb2YgY20zCisqCisqIE9VVFBVVDoKKyogICAgICAgY29tcGF0aWJsZUJ1ZiAtIEJ1ZmZlciB0byBjb250YWluIGNtMyBjb21wYXRpYmxlIHN0cmluZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgbXZCb2FyZENtM0NvbXBhdGlibGVOYW1lR2V0KGNoYXIgKmNvbXBhdGlibGVCdWYpCit7CisJaWYgKGdCb2FyZElkID49ICBCT0JLX01BUlZFTExfQk9BUkRfSURfQkFTRSAmJgorCQkJZ0JvYXJkSWQgPCBCT0JLX01BUlZFTExfTUFYX0JPQVJEX0lEKQorCQltdk9zU1ByaW50Zihjb21wYXRpYmxlQnVmLCAibWFydmVsbCxtc3lzLWJvYmstY20zIik7CisJZWxzZSBpZiAoZ0JvYXJkSWQgPj0gIEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgJiYKKwkJCWdCb2FyZElkIDwgQkMyX01BUlZFTExfTUFYX0JPQVJEX0lEKQorCQltdk9zU1ByaW50Zihjb21wYXRpYmxlQnVmLCAibWFydmVsbCxtc3lzLWJjMi1jbTMiKTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmggYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52TGliLmgKaW5kZXggNmM3OTYzNi4uOTA0ZmVhOCAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudkxpYi5oCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZMaWIuaApAQCAtODMsNiArODMsMTQgQEAKIAogI2RlZmluZSBNVl9CT0FSRF9NQVhfTVBQCQk5CS8qIG51bWJlciBvZiBNUFAgY29uZiByZWdpc3RlcnMgKi8KICNkZWZpbmUgTVZfQk9BUkRfTkFNRV9MRU4gIAkJMHgyMAorI2RlZmluZSBNVl9CT0FSRF9NT0RFTF9OQU1FX0xFTgkJMHg1MAorCitlbnVtIHsKKwlNVl9QT1JUX1RZUEVfU0dNSUksCisJTVZfUE9SVF9UWVBFX1FTR01JSSwKKwlNVl9QT1JUX1RZUEVfUkdNSUksCisJTVZfUE9SVF9UWVBFX1VOS05PV04gPSAtMSwKK307CiAKIHR5cGVkZWYgZW51bSBfZGV2Qm9hcmRNcHBUeXBlQ2xhc3MgewogCU1WX0JPQVJEX0FVVE8gPSAwLApAQCAtMTUzLDYgKzE2MSw4IEBACiAJTVZfVTMyIGRldkNsYXNzOwkvKiBNVl9CT0FSRF9ERVZfQ0xBU1MgKi8KIAlNVl9VOCBkZXZXaWR0aDsKIAlNVl9VOCBidXNXaWR0aDsKKwlNVl9VOCBidXNOdW07CisJTVZfQk9PTCBhY3RpdmU7CiB9IE1WX0RFVl9DU19JTkZPOwogCiB0eXBlZGVmIHN0cnVjdCBfYm9hcmRTd2l0Y2hJbmZvIHsKQEAgLTE4Nyw2ICsxOTcsNyBAQAogCU1WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkOwogCU1WXzMyCWJvYXJkRXRoU21pQWRkcjsKIAlNVl8zMiBib2FyZEV0aFNtaUFkZHIwOworCU1WX0JPT0wgYm9hcmRNYWNFbmFibGVkOwogfSBNVl9CT0FSRF9NQUNfSU5GTzsKIAogdHlwZWRlZiBzdHJ1Y3QgX2JvYXJkTXBwSW5mbyB7CkBAIC0yNTUsNyArMjY2LDE2IEBACiAJTVZfQk9BUkRfUEVYX0lORk8JYm9hcmRQZXhJbmZvOwkvKiBmaWxsZWQgaW4gcnVudGltZSAqLwogCU1WX1UzMiBub3JGbGFzaFJlYWRQYXJhbXM7CiAJTVZfVTMyIG5vckZsYXNoV3JpdGVQYXJhbXM7CisJTVZfQk9PTCBpc1NtaUV4dGVybmFsUHA7CisJTVZfVTMyIHNtaUV4dGVybmFsUHBJbmRleDsKKwlNVl9CT09MIGlzU2RNbWNDb25uZWN0ZWQ7CiAKKwkvKiBJbmRpY2F0ZXMgaWYgYXV0by1kZXRlY3Rpb24gb2YgbW9kdWxlcyBpcyBlbmFibGVkIG9uIHRoaXMgYm9hcmQuICovCisJLyogU2V0IHRvIE1WX0ZBTFNFIGZvciBhbnkgYm9hcmQgdGhhdCBpcyBub3QgYSBEQi4gKi8KKwlNVl9CT09MIGNvbmZpZ0F1dG9EZXRlY3Q7CisKKwljaGFyIG1vZGVsTmFtZVtNVl9CT0FSRF9NT0RFTF9OQU1FX0xFTl07CisJTVZfQk9PTCBpc0NtMzsKIH0gTVZfQk9BUkRfSU5GTzsKIAogTVZfVk9JRCBtdkJvYXJkRW52SW5pdChNVl9WT0lEKTsKQEAgLTI2NiwxMSArMjg2LDEzIEBACiBNVl9CT09MIG12Qm9hcmRJc0V0aEFjdGl2ZShNVl9VMzIgZXRoTnVtKTsKIE1WX0JPT0wgbXZCb2FyZElzUG9ydEluU2dtaWkoTVZfVTMyIGV0aFBvcnROdW0pOwogTVZfQk9PTCBtdkJvYXJkSXNQb3J0SW5HbWlpKE1WX1UzMiBldGhQb3J0TnVtKTsKK01WX1UzMiBtdkJvYXJkUG9ydFR5cGVHZXQoTVZfVTMyIGV0aFBvcnROdW0pOwogTVZfQk9PTCBtdkJvYXJkSXNQb3J0SW5NaWkoTVZfVTMyIGV0aFBvcnROdW0pOwogTVZfQk9PTCBtdkJvYXJkSXNQb3J0SW5SZ21paShNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl8zMiBtdkJvYXJkUGh5QWRkckdldChNVl9VMzIgZXRoUG9ydE51bSk7CiBNVl8zMiBtdkJvYXJkUXVhZFBoeUFkZHIwR2V0KE1WX1UzMiBldGhQb3J0TnVtKTsKIE1WXzMyIG12Qm9hcmRTd2l0Y2hDcHVQb3J0R2V0KE1WX1UzMiBzd2l0Y2hJZHgpOworTVZfQk9PTCBtdkJvYXJkQ29uZmlnQXV0b0RldGVjdEVuYWJsZWQodm9pZCk7CiBNVl8zMiBtdkJvYXJkU21pU2Nhbk1vZGVHZXQoTVZfVTMyIHN3aXRjaElkeCk7CiBNVl9VMzIgbXZCb2FyZFRjbGtHZXQoTVZfVk9JRCk7CiBNVl9VMzIgbXZCb2FyZFN5c0Nsa0dldChNVl9WT0lEKTsKQEAgLTI4OSw2ICszMTEsOSBAQAogTVZfMzIgbXZCb2FyZEdldERldmljZVdpZHRoKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzKTsKIE1WXzMyIG12Qm9hcmRHZXREZXZpY2VXaW5TaXplKE1WXzMyIGRldk51bSwgTVZfQk9BUkRfREVWX0NMQVNTIGRldkNsYXNzKTsKIE1WX1UzMiBtdkJvYXJkR2V0RGV2Q1NOdW0oTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOworTVZfVTMyIG12Qm9hcmRHZXREZXZCdXNOdW0oTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOworTVZfQk9PTCBtdkJvYXJkR2V0RGV2U3RhdGUoTVZfMzIgZGV2TnVtLCBNVl9CT0FSRF9ERVZfQ0xBU1MgZGV2Q2xhc3MpOworTVZfU1RBVFVTIG12Qm9hcmRTZXREZXZTdGF0ZShNVl8zMiBkZXZOdW0sIE1WX0JPQVJEX0RFVl9DTEFTUyBkZXZDbGFzcywgTVZfQk9PTCBuZXdTdGF0ZSk7CiBNVl9VOCBtdkJvYXJkVHdzaUFkZHJUeXBlR2V0KE1WX0JPQVJEX1RXU0lfQ0xBU1MgdHdzaUNsYXNzLCBNVl9VMzIgaW5kZXgpOwogTVZfVTggbXZCb2FyZFR3c2lBZGRyR2V0KE1WX0JPQVJEX1RXU0lfQ0xBU1MgdHdzaUNsYXNzLCBNVl9VMzIgaW5kZXgpOwogTVZfMzIgbXZCb2FyZE5hbmRXaWR0aEdldCh2b2lkKTsKQEAgLTMzMCw2ICszNTUsOCBAQAogTVZfU1RBVFVTIG12Qm9hcmREcmFtQnVzV2lkdGhTZXQoTVZfVTE2IGNvbmYpOwogTVZfVTE2IG12Qm9hcmREcmFtQnVzV2lkdGhHZXQoTVZfVk9JRCk7CiBNVl9TVEFUVVMgbXZCb2FyZENvcmVGcmVxR2V0KE1WX1U4ICp2YWx1ZSk7CitNVl9TVEFUVVMgbXZCb2FyZEJ5cGFzc0NvcmVGcmVxR2V0KE1WX1U4ICp2YWx1ZSk7CitNVl9TVEFUVVMgbXZCb2FyZEJ5cGFzc0NvcmVGcmVxU2V0KE1WX1U4IGZyZXFWYWwpOwogTVZfU1RBVFVTIG12Qm9hcmRUbUZyZXFHZXQoTVZfVTggKnZhbHVlKTsKIE1WX1NUQVRVUyBtdkJvYXJkVG1GcmVxU2V0KE1WX1U4IGZyZXFWYWwpOwogTVZfU1RBVFVTIG12Qm9hcmRKdGFnQ3B1R2V0KE1WX1U4ICp2YWx1ZSk7CkBAIC0zNjIsMTIgKzM4OSwyOCBAQAogTVZfVk9JRCBtdkJvYXJkRGVidWdMZWQoTVZfVTMyIGhleE51bSk7CiBNVl9ORkNfRUNDX01PREUgbXZCb2FyZE5hbmRFQ0NNb2RlR2V0KHZvaWQpOwogTVZfVTMyIG12Qm9hcmRDcHNzQm9hcmRJZFNldChNVl9VOCk7CitNVl9VOCBtdkJvYXJkQ29tcGF0aWJsZU5hbWVHZXQoY2hhciAqcE5hbWVCdWZmKTsKIE1WX05BTkRfSUZfTU9ERSBtdkJvYXJkTmFuZElmR2V0KHZvaWQpOwogTVZfU1RBVFVTIG12Qm9hcmRPb2JQb3J0Q2ZnU2V0KE1WX1ZPSUQpOworTVZfQk9PTCBtdkJvYXJkSXNVc2JQb3J0Q29ubmVjdGVkKE1WX1VOSVRfSUQgdXNiVHlwZUlELCBNVl9VOCB1c2JQb3J0TnVtYmVyKTsKK01WX0JPT0wgbXZCb2FyZGlzQW1jKHZvaWQpOworTVZfU1RBVFVTIG12Qm9hcmRQUFNtaUluZGV4R2V0KE1WX1UzMiAqaW5kZXgpOworTVZfVk9JRCBtdkJvYXJkVXBkYXRlQ29uZmlnZm9yRFQoTVZfVk9JRCk7CisjaWZkZWYgQ09ORklHX01NQworTVZfQk9PTCBtdkJvYXJkaXNTZGlvQ29ubmVjdGVkKHZvaWQpOworI2VuZGlmCit2b2lkIG12Qm9hcmRHZXRNb2RlbE5hbWUoY2hhciAqcE5hbWVCdWZmKTsKK01WX0JPT0wgbXZCb2FyZElzUHBTbWkodm9pZCk7Cit2b2lkIG12Qm9hcmRQaW5DdHJsTmFtZUdldChjaGFyICpjb21wYXRpYmxlQnVmKTsKKyNpZmRlZiBNVl9DTTMKK01WX0JPT0wgbXZCb2FyZElzQ20zKHZvaWQpOwordm9pZCBtdkJvYXJkQ20zQ29tcGF0aWJsZU5hbWVHZXQoY2hhciAqY29tcGF0aWJsZUJ1Zik7CisjZW5kaWYKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAorZXh0ZXJuIE1WX0JPQVJEX0lORk8gKm1hcnZlbGxBWFBib2FyZEluZm9UYmxbXTsKIAogI2VuZGlmIC8qIF9fSU5DbXZCb2FyZEVudkxpYmggKi8KZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmMgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5jCmluZGV4IDc0NTBiZjguLjU1NzIxZjUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmMKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuYwpAQCAtOTgsOCArOTgsOCBAQAogCiBNVl9CT0FSRF9NQUNfSU5GTyBib2JjYXQyX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTWFjSW5mb1tdID0gewogCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwIH0sCi0Je0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MSB9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgxLCAweDEsIE1WX1RSVUV9LAogfTsKIAogTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBib2JjYXQyX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKQEAgLTEwOSwxMiArMTA5LDE3IEBACiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBib2JjYXQyX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKLQkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGggfSovCisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoLCBidXNOdW0sIGFjdGl2ZSB9Ki8KICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDh9LCAvKiBTUEkgREVWICovCisJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KICNlbmRpZgotI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCi0Je0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTZ9IC8qIE5PUiBERVYgKi8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIE5BTkQgREVWICovCisJe0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTYsIDAsIE1WX1RSVUV9IC8qIE5PUiBERVYgKi8KKyNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLwogI2VuZGlmCiB9OwogCkBAIC0xNzAsNyArMTc1LDggQEAKIAkubmFuZEZsYXNoQ29udHJvbAkJPSBCT0JDQVQyX0NVU1RPTUVSXzBfQk9BUkRfTkFORF9DT05UUk9MLAogCS8qIE5PUiBpbml0IHBhcmFtcyAqLwogCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gQk9CQ0FUMl9DVVNUT01FUl8wX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBCT0JDQVQyX0NVU1RPTUVSXzBfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUworCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IEJPQkNBVDJfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX0ZBTFNFCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLwogfTsKIAogTVZfQk9BUkRfSU5GTyAqY3VzdG9tZXJCQzJCb2FyZEluZm9UYmxbXSA9IHsKQEAgLTE3OCw2ICsxODQsMjMwIEBACiAJJmJvYmNhdDJfY3VzdG9tZXJfYm9hcmRfMF9JbmZvLAogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlCb2JLIENldHVzIGN1c3RvbWVyIGJvYXJkIC0gQmFzZWQgb24gQk9CSy1DRVRVUy1EQi05OERYNDIzNS0xMlhHCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfQk9BUkRfTkFORF9SRUFEX1BBUkFNUwkweDAwMEMwMjgyCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUwkweDAwMDEwMzA1CisvKk5BTkQgY2FyZSBzdXBwb3J0IGZvciBzbWFsbCBwYWdlIGNoaXBzKi8KKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05BTkRfQ09OVFJPTAkJMHgwMWMwMDU0MworCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfUkVBRF9QQVJBTVMJMHg0MDNFMDdDRgorI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUwkweDAwMEYwRjBGCisKK01WX0JPQVJEX1RXU0lfSU5GTwlib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkVHdzaURldltdID0geworLyoge3tNVl9CT0FSRF9ERVZfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CXR3c2lEZXZBZGRyLCBNVl9VOCB0d3NpRGV2QWRkclR5cGV9fSAqLworCXtCT0FSRF9ERVZfVFdTSV9QTEQsIDB4MTgsIEFERFI3X0JJVH0sCQkvKiBBY2Nlc3MgdG8gY29udHJvbCBQTEQgcmVnIGZpbGUgKi8KKwl7Qk9BUkRfREVWX1RXU0lfWkFSTElOSywgMHgxQiwgQUREUjdfQklUfSwJCS8qIEFjY2VzcyB0byBaYXJsaW5rCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEMsIEFERFI3X0JJVH0sICAgICAgICAgLyogU2F0UiBiaW9zIDAJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEQsIEFERFI3X0JJVH0sICAgICAgICAgLyogU2F0UiBiaW9zIDEJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEUsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNhdFIgYmlvcyAyCQkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRGLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTYXRSIGJpb3MgMwkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMHg1MCwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2VyaWFsIEluaXQgRVBST00JKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAwCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDcxLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3NSwgQUREUjdfQklUfSAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMgkqLworfTsKKworTVZfQk9BUkRfTUFDX0lORk8gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZE1hY0luZm9bXSA9IHsKKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX0ZBTFNFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKK307CisKK01WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZE1vZFR5cGVJbmZvW10gPSB7CisJeworCQkuYm9hcmRNcHBNb2QJCT0gTVZfQk9BUkRfQVVUTywKKwl9Cit9OworCitNVl9ERVZfQ1NfSU5GTyBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCQl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VuZGlmCit9OworCitNVl9CT0FSRF9NUFBfSU5GTyBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWVbXSA9IHsKKwl7IHsKKwlCT0JLX0NFVFVTX0NVU1RPTUVSXzBfTVBQMF83LAorCUJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFA4XzE1LAorCUJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFAxNl8yMywKKwlCT0JLX0NFVFVTX0NVU1RPTUVSXzBfTVBQMjRfMzEsCisJQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDMyXzM5LAorCX0gfSwKK307CisKK01WX0JPQVJEX0lORk8gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm8gPSB7CisJLmJvYXJkTmFtZQkJCT0gIkJPQkstQ2V0dXMtQ3VzdG9tZXItQm9hcmQtMCIsCisJLm51bUJvYXJkTXBwVHlwZVZhbHVlCQk9IEFSUlNaKGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNb2RUeXBlSW5mbyksCisJLnBCb2FyZE1vZFR5cGVWYWx1ZQkJPSBib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTW9kVHlwZUluZm8sCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLAorCS5pbnRzR3BwTWFza0xvdwkJCT0gMCwKKwkuaW50c0dwcE1hc2tNaWQJCQk9IDAsCisJLmludHNHcHBNYXNrSGlnaAkJPSAwLAorCS5udW1Cb2FyZERldmljZUlmCQk9IEFSUlNaKGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmREZUNzSW5mbyksCisJLnBEZXZDc0luZm8JCQk9IGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmREZUNzSW5mbywKKwkubnVtQm9hcmRUd3NpRGV2CQk9IEFSUlNaKGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRUd3NpRGV2KSwKKwkucEJvYXJkVHdzaURldgkJCT0gYm9ia19jZXR1c19jdXN0b21lcl9ib2FyZF8wX0luZm9Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTWFjSW5mbyksCisJLnBCb2FyZE1hY0luZm8JCQk9IGJvYmtfY2V0dXNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmRNYWNJbmZvLAorCS5udW1Cb2FyZEdwcEluZm8JCT0gMCwKKwkucEJvYXJkR3BwSW5mbwkJCT0gTlVMTCwKKwkuYWN0aXZlTGVkc051bWJlcgkJPSAwLAorCS5wTGVkR3BwUGluCQkJPSBOVUxMLAorCS5sZWRzUG9sYXJpdHkJCQk9IDAsCisKKwkvKiBHUFAgdmFsdWVzICovCisJLmdwcE91dEVuVmFsTG93CQkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX09VVF9FTkFfTE9XLAorCS5ncHBPdXRFblZhbE1pZAkJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0RW5WYWxIaWdoCQk9IDAsCisJLmdwcE91dFZhbExvdwkJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9PVVRfVkFMX0xPVywKKwkuZ3BwT3V0VmFsTWlkCQkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX09VVF9WQUxfTUlELAorCS5ncHBPdXRWYWxIaWdoCQkJPSAwLAorCS5ncHBQb2xhcml0eVZhbExvdwkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX1BPTF9MT1csCisJLmdwcFBvbGFyaXR5VmFsTWlkCQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfUE9MX01JRCwKKwkuZ3BwUG9sYXJpdHlWYWxIaWdoCQk9IDAsCisKKwkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLworCS5wU3dpdGNoSW5mbyA9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0gPSAwLAorCisJLyogTkFORCBpbml0IHBhcmFtcyAqLworCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfQk9BUkRfTkFORF9XUklURV9QQVJBTVMsCisJLm5hbmRGbGFzaENvbnRyb2wJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05BTkRfQ09OVFJPTCwKKwkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KKwkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gQk9CS19DRVRVU19DVVNUT01FUl8wX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9UUlVFLAorCS5zbWlFeHRlcm5hbFBwSW5kZXgJCT0gMCwKKwkuaXNTZE1tY0Nvbm5lY3RlZAkJPSBNVl9UUlVFLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX0ZBTFNFCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwlCb2JLIENhZWx1bSBjdXN0b21lciBib2FyZCAtIEJhc2VkIG9uIEJPQkstQ0FFTFVNLURCLTk4RFg0MjAzLTQ4RzEyWEcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTkFORF9SRUFEX1BBUkFNUwkweDAwMEMwMjgyCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTkFORF9XUklURV9QQVJBTVMJMHgwMDAxMDMwNQorLypOQU5EIGNhcmUgc3VwcG9ydCBmb3Igc21hbGwgcGFnZSBjaGlwcyovCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTkFORF9DT05UUk9MCQkweDAxYzAwNTQzCisKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OT1JfUkVBRF9QQVJBTVMJMHg0MDNFMDdDRgorI2RlZmluZSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0JPQVJEX05PUl9XUklURV9QQVJBTVMJMHgwMDBGMEYwRgorCitNVl9CT0FSRF9UV1NJX0lORk8JYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRUd3NpRGV2W10gPSB7CisvKiB7e01WX0JPQVJEX0RFVl9DTEFTUwlkZXZDbGFzcywgTVZfVTgJdHdzaURldkFkZHIsIE1WX1U4IHR3c2lEZXZBZGRyVHlwZX19ICovCisJe0JPQVJEX0RFVl9UV1NJX1BMRCwgMHgxOCwgQUREUjdfQklUfSwJCS8qIEFjY2VzcyB0byBjb250cm9sIFBMRCByZWcgZmlsZSAqLworCXtCT0FSRF9ERVZfVFdTSV9aQVJMSU5LLCAweDFCLCBBRERSN19CSVR9LAkJLyogQWNjZXNzIHRvIFphcmxpbmsJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0QywgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMAkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RCwgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMQkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RSwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2F0UiBiaW9zIDIJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEYsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNhdFIgYmlvcyAzCQkqLworCXtCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAweDUwLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTZXJpYWwgSW5pdCBFUFJPTQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTU1X0lPX0VYUEFOREVSLCAweDIwLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBRc2dtaWkvc2ZwIG11eCBjb250cm9sIFBDQTk1NTUgSU8gZXhwYW5kZXIgKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAwCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDcxLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3NSwgQUREUjdfQklUfSAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMgkqLworfTsKKworTVZfQk9BUkRfTUFDX0lORk8gYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRNYWNJbmZvW10gPSB7CisJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLworCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9GQUxTRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCit9OworCitNVl9CT0FSRF9NT0RVTEVfVFlQRV9JTkZPIGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKKwl7CisJCS5ib2FyZE1wcE1vZAkJPSBNVl9CT0FSRF9BVVRPLAorCX0KK307CisKK01WX0RFVl9DU19JTkZPIGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCQl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VuZGlmCit9OworCitNVl9CT0FSRF9NUFBfSU5GTyBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlW10gPSB7CisJeyB7CisJQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFAwXzcsCisJQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFA4XzE1LAorCUJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfTVBQMTZfMjMsCisJQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFAyNF8zMSwKKwlCT0JLX0NBRUxVTV9DVVNUT01FUl8xX01QUDMyXzM5LAorCX0gfSwKK307CisKK01WX0JPQVJEX0lORk8gYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvID0geworCS5ib2FyZE5hbWUJCQk9ICJCT0JLLUNhZWx1bS1DdXN0b21lci1Cb2FyZC0xIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRNb2RUeXBlSW5mbyksCisJLnBCb2FyZE1vZFR5cGVWYWx1ZQkJPSBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1vZFR5cGVJbmZvLAorCS5udW1Cb2FyZE1wcENvbmZpZ1ZhbHVlCQk9IEFSUlNaKGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLAorCS5pbnRzR3BwTWFza0xvdwkJCT0gMCwKKwkuaW50c0dwcE1hc2tNaWQJCQk9IDAsCisJLmludHNHcHBNYXNrSGlnaAkJPSAwLAorCS5udW1Cb2FyZERldmljZUlmCQk9IEFSUlNaKGJvYmtfY2FlbHVtX2N1c3RvbWVyX2JvYXJkXzFfSW5mb0JvYXJkRGVDc0luZm8pLAorCS5wRGV2Q3NJbmZvCQkJPSBib2JrX2NhZWx1bV9jdXN0b21lcl9ib2FyZF8xX0luZm9Cb2FyZERlQ3NJbmZvLAorCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1ooYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRUd3NpRGV2KSwKKwkucEJvYXJkVHdzaURldgkJCT0gYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRUd3NpRGV2LAorCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1ooYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRNYWNJbmZvKSwKKwkucEJvYXJkTWFjSW5mbwkJCT0gYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvQm9hcmRNYWNJbmZvLAorCS5udW1Cb2FyZEdwcEluZm8JCT0gMCwKKwkucEJvYXJkR3BwSW5mbwkJCT0gTlVMTCwKKwkuYWN0aXZlTGVkc051bWJlcgkJPSAwLAorCS5wTGVkR3BwUGluCQkJPSBOVUxMLAorCS5sZWRzUG9sYXJpdHkJCQk9IDAsCisKKwkvKiBHUFAgdmFsdWVzICovCisJLmdwcE91dEVuVmFsTG93CQkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9PVVRfRU5BX0xPVywKKwkuZ3BwT3V0RW5WYWxNaWQJCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9FTkFfTUlELAorCS5ncHBPdXRFblZhbEhpZ2gJCT0gMCwKKwkuZ3BwT3V0VmFsTG93CQkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9PVVRfVkFMX0xPVywKKwkuZ3BwT3V0VmFsTWlkCQkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0dQUF9PVVRfVkFMX01JRCwKKwkuZ3BwT3V0VmFsSGlnaAkJCT0gMCwKKwkuZ3BwUG9sYXJpdHlWYWxMb3cJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfUE9MX0xPVywKKwkuZ3BwUG9sYXJpdHlWYWxNaWQJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfUE9MX01JRCwKKwkuZ3BwUG9sYXJpdHlWYWxIaWdoCQk9IDAsCisKKwkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLworCS5wU3dpdGNoSW5mbyA9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0gPSAwLAorCisJLyogTkFORCBpbml0IHBhcmFtcyAqLworCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKKwkubmFuZEZsYXNoV3JpdGVQYXJhbXMJCT0gQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKKwkubmFuZEZsYXNoQ29udHJvbAkJPSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX0JPQVJEX05BTkRfQ09OVFJPTCwKKwkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KKwkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAorCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX1RSVUUsCisJLnNtaUV4dGVybmFsUHBJbmRleAkJPSAxLAorCS5pc1NkTW1jQ29ubmVjdGVkCQk9IE1WX1RSVUUsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfRkFMU0UJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCit9OworCisKK01WX0JPQVJEX0lORk8gKmN1c3RvbWVyQk9CS0JvYXJkSW5mb1RibFtdID0geworCSZib2JrX2NldHVzX2N1c3RvbWVyX2JvYXJkXzBfSW5mbywKKwkmYm9ia19jYWVsdW1fY3VzdG9tZXJfYm9hcmRfMV9JbmZvLAorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAlBbGxleWNhdDMgYm9hcmQgLSBCYXNlZCBvbiBCT0JDQVQyLURCLURYCkBAIC0yMDcsOCArNDM3LDggQEAKIAogTVZfQk9BUkRfTUFDX0lORk8gYWxsZXljYXQzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTWFjSW5mb1tdID0gewogLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xIH0sCi0Je0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEgfQorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9UUlVFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSwgTVZfVFJVRX0KIH07CiAKIE1WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gYWxsZXljYXQzX2N1c3RvbWVyX2JvYXJkXzBfSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKQEAgLTIxOCwxMiArNDQ4LDE3IEBACiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBhbGxleWNhdDNfY3VzdG9tZXJfYm9hcmRfMF9JbmZvQm9hcmREZUNzSW5mb1tdID0gewotCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCB9Ki8KKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0Je1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOH0sIC8qIFNQSSBERVYgKi8KKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLwogI2VuZGlmCi0jaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKLQl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNn0gLyogTk9SIERFViAqLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpICYmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogTkFORCBERVYgKi8KKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZWxpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCXtERVZfQk9PQ1MsIE5fQSwgQk9BUkRfREVWX05PUl9GTEFTSCwgMTYsIDE2LCAwLCBNVl9UUlVFfSAvKiBOT1IgREVWICovCiAjZW5kaWYKIH07CiAKQEAgLTI3OSw3ICs1MTQsOCBAQAogCS5uYW5kRmxhc2hDb250cm9sCQk9IEFMTEVZQ0FUM19DVVNUT01FUl8wX0JPQVJEX05BTkRfQ09OVFJPTCwKIAkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KIAkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IEFMTEVZQ0FUM19DVVNUT01FUl8wX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBBTExFWUNBVDNfQ1VTVE9NRVJfMF9CT0FSRF9OT1JfV1JJVEVfUEFSQU1TCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gQUxMRVlDQVQzX0NVU1RPTUVSXzBfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9GQUxTRQkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KIH07CiAKIE1WX0JPQVJEX0lORk8gKmN1c3RvbWVyQUMzQm9hcmRJbmZvVGJsW10gPSB7CkBAIC0zMTYsOCArNTUyLDggQEAKIAogTVZfQk9BUkRfTUFDX0lORk8gZGJfZHhfYmMySW5mb0JvYXJkTWFjSW5mb1tdID0gewogCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KLQl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSB9LAotCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xIH0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX1RSVUV9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9UUlVFfSwKIH07CiAKIE1WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gZGJfZHhfYmMySW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKQEAgLTMyNywxMiArNTYzLDE3IEBACiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBkYl9keF9iYzJJbmZvQm9hcmREZUNzSW5mb1tdID0gewotCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNXaWR0aCB9Ki8KKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGgsIGJ1c051bSwgYWN0aXZlIH0qLwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0Je1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOH0sIC8qIFNQSSBERVYgKi8KKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLwogI2VuZGlmCi0jaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKLQl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDgsIDh9IC8qIE5PUiBERVYgKi8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIE5BTkQgREVWICovCisJe0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTYsIDAsIE1WX1RSVUV9IC8qIE5PUiBERVYgKi8KKyNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLwogI2VuZGlmCiB9OwogCkBAIC0zOTMsNyArNjM0LDEyIEBACiAJLm5hbmRGbGFzaENvbnRyb2wJCT0gREJfRFhfQkMyX0JPQVJEX05BTkRfQ09OVFJPTCwKIAkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KIAkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IERCX0RYX0JDMl9CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCi0JLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQkMyX0JPQVJEX05PUl9XUklURV9QQVJBTVMKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CQzJfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkubW9kZWxOYW1lCQkJPSAiQm9iQ2F0MiBEZXZlbG9wbWVudCBCb2FyZCIsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9GQUxTRSwKKwkuaXNTZE1tY0Nvbm5lY3RlZAkJPSBNVl9UUlVFLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5pc0NtMwkJCQk9IE1WX1RSVUUKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDA3LDggKzY1Myw3IEBACiAKIE1WX0JPQVJEX01BQ19JTkZPIHJkX2R4X2JjMkluZm9Cb2FyZE1hY0luZm9bXSA9IHsKIAkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCi0Je0JPQVJEX01BQ19TUEVFRF8xMDAwTSwgMHgwLCAweDAgfSwKLQl7Qk9BUkRfTUFDX1NQRUVEXzEwMDBNLCAweDEsIDB4MSB9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAogfTsKIAogTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyByZF9keF9iYzJJbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0gewpAQCAtNDE4LDkgKzY2MywxMiBAQAogfTsKIAogTVZfREVWX0NTX0lORk8gcmRfZHhfYmMySW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKLQkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aH0qLworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNOdW0sIGFjdGl2ZX0qLwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0Je1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOH0gLyogU1BJIERFViAqLworCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0gLyogTkFORCBERVYgKi8KICNlbmRpZgogfTsKIApAQCAtNDczLDcgKzcyMSwxMiBAQAogCSAvKiBOQU5EIGluaXQgcGFyYW1zICovCiAJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gUkRfRFhfQkMyX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCiAJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IFJEX0RYX0JDMl9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKLQkubmFuZEZsYXNoQ29udHJvbAkJPSBSRF9EWF9CQzJfQk9BUkRfTkFORF9DT05UUk9MCisJLm5hbmRGbGFzaENvbnRyb2wJCT0gUkRfRFhfQkMyX0JPQVJEX05BTkRfQ09OVFJPTCwKKwkubW9kZWxOYW1lCQkJPSAiQm9iQ2F0MiBSZWZlcmVuY2UgRGVzaWduIEJvYXJkIiwKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX0ZBTFNFLAorCS5pc1NkTW1jQ29ubmVjdGVkCQk9IE1WX1RSVUUsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLmlzQ20zCQkJCT0gTVZfVFJVRQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00ODUsMTAgKzczOCwxNSBAQAogLypOQU5EIGNhcmUgc3VwcG9ydCBmb3Igc21hbGwgcGFnZSBjaGlwcyovCiAjZGVmaW5lIFJEX01UTF9CQzJfQk9BUkRfTkFORF9DT05UUk9MCQkJMHgwMWMwMDU0MwogCitNVl9CT0FSRF9UV1NJX0lORk8JYmMyX3JkX210bEluZm9Cb2FyZFR3c2lEZXZbXSA9IHsKKy8qIHt7TVZfQk9BUkRfREVWX0NMQVNTCWRldkNsYXNzLCBNVl9VOAl0d3NpRGV2QWRkciwgTVZfVTggdHdzaURldkFkZHJUeXBlfX0gKi8KKwl7Qk9BUkRfREVWX1RXU0lfUExELCAweDc3LCBBRERSN19CSVR9LAkJCQkvKiBBY2Nlc3MgdG8gY29udHJvbCBQTEQgcmVnIGZpbGUgKi8KKwl7Qk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMHg1MCwgQUREUjdfQklUfSwJCS8qIFNlcmlhbCBJbmkgRVBST00JKi8KK307CisKIE1WX0JPQVJEX01BQ19JTkZPIGJjMl9yZF9tdGxJbmZvQm9hcmRNYWNJbmZvW10gPSB7CiAJLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXtCT0FSRF9NQUNfU1BFRURfMTAwME0sIDB4MCwgMHgwIH0sCi0Je0JPQVJEX01BQ19TUEVFRF8xMDAwTSwgMHgxLCAweDEgfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKIH07CiAKIE1WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gYmMyX3JkX210bEluZm9Cb2FyZE1vZFR5cGVJbmZvW10gPSB7CkBAIC00OTgsOSArNzU2LDEyIEBACiB9OwogCiBNVl9ERVZfQ1NfSU5GTyBiYzJfcmRfbXRsSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKLQkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aH0qLworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRoLCBidXNOdW0sIGFjdGl2ZX0qLwogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCi0Je1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOH0gLyogU1BJIERFViAqLworCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9LCAvKiBTUEkgREVWICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0gLyogTkFORCBERVYgKi8KICNlbmRpZgogfTsKIApAQCAtNTE1LDI0ICs3NzYsMjQgQEAKIH07CiAKIE1WX0JPQVJEX0lORk8gYmMyX3JkX210bEluZm8gPSB7Ci0JLmJvYXJkTmFtZQkJCT0gIlJELUJDMi1NVEwtUG9FLTJRU0ZQLTZTRlAiLAorCS5ib2FyZE5hbWUJCQkJCT0gIlJELU1UTC1CQzItNDhHLTEyWEcyWExHIiwKIAkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooYmMyX3JkX210bEluZm9Cb2FyZE1vZFR5cGVJbmZvKSwKLQkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IGJjMl9yZF9tdGxJbmZvQm9hcmRNb2RUeXBlSW5mbywKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQkJPSBiYzJfcmRfbXRsSW5mb0JvYXJkTW9kVHlwZUluZm8sCiAJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooYmMyX3JkX210bEluZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKIAkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gYmMyX3JkX210bEluZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLAogCS5pbnRzR3BwTWFza0xvdwkJCT0gMCwKIAkuaW50c0dwcE1hc2tNaWQJCQk9IDAsCiAJLmludHNHcHBNYXNrSGlnaAkJPSAwLAogCS5udW1Cb2FyZERldmljZUlmCQk9IEFSUlNaKGJjMl9yZF9tdGxJbmZvQm9hcmREZUNzSW5mbyksCi0JLnBEZXZDc0luZm8JCQk9IGJjMl9yZF9tdGxJbmZvQm9hcmREZUNzSW5mbywKLQkubnVtQm9hcmRUd3NpRGV2CQk9IDAsCi0JLnBCb2FyZFR3c2lEZXYJCQk9IE5VTEwsCisJLnBEZXZDc0luZm8JCQkJPSBiYzJfcmRfbXRsSW5mb0JvYXJkRGVDc0luZm8sCisJLm51bUJvYXJkVHdzaURldgkJPSBBUlJTWihiYzJfcmRfbXRsSW5mb0JvYXJkVHdzaURldiksCisJLnBCb2FyZFR3c2lEZXYJCQk9IGJjMl9yZF9tdGxJbmZvQm9hcmRUd3NpRGV2LAogCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1ooYmMyX3JkX210bEluZm9Cb2FyZE1hY0luZm8pLAogCS5wQm9hcmRNYWNJbmZvCQkJPSBiYzJfcmRfbXRsSW5mb0JvYXJkTWFjSW5mbywKIAkubnVtQm9hcmRHcHBJbmZvCQk9IDAsCiAJLnBCb2FyZEdwcEluZm8JCQk9IE5VTEwsCiAJLmFjdGl2ZUxlZHNOdW1iZXIJCT0gMCwKLQkucExlZEdwcFBpbgkJCT0gTlVMTCwKKwkucExlZEdwcFBpbgkJCQk9IE5VTEwsCiAJLmxlZHNQb2xhcml0eQkJCT0gMCwKIAogCS8qIEdQUCB2YWx1ZXMgKi8KQEAgLTU1MSw5ICs4MTIsMzM5IEBACiAJLnN3aXRjaEluZm9OdW0gPSAwLAogCiAJLyogTkFORCBpbml0IHBhcmFtcyAqLwotCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQk9IFJEX01UTF9CQzJfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKLQkubmFuZEZsYXNoV3JpdGVQYXJhbXMJCT0gUkRfTVRMX0JDMl9CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKLQkubmFuZEZsYXNoQ29udHJvbAkJPSBSRF9NVExfQkMyX0JPQVJEX05BTkRfQ09OVFJPTAorCS5uYW5kRmxhc2hSZWFkUGFyYW1zCT0gUkRfTVRMX0JDMl9CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwk9IFJEX01UTF9CQzJfQk9BUkRfTkFORF9XUklURV9QQVJBTVMsCisJLm5hbmRGbGFzaENvbnRyb2wJCT0gUkRfTVRMX0JDMl9CT0FSRF9OQU5EX0NPTlRST0wsCisJLm1vZGVsTmFtZQkJCT0gIkJvYkNhdDIgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCIsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9GQUxTRSwKKwkuaXNTZE1tY0Nvbm5lY3RlZAkJPSBNVl9UUlVFLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5pc0NtMwkJCQk9IE1WX1RSVUUKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJPQkstQ0VUVVMtREItOThEWDQyMzUtMTJYRyBCT0FSRCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERCX0RYX0JPQktfQk9BUkRfTkFORF9SRUFEX1BBUkFNUwkweDAwMEMwMjgyCisjZGVmaW5lIERCX0RYX0JPQktfQk9BUkRfTkFORF9XUklURV9QQVJBTVMJMHgwMDAxMDMwNQorLypOQU5EIGNhcmUgc3VwcG9ydCBmb3Igc21hbGwgcGFnZSBjaGlwcyovCisjZGVmaW5lIERCX0RYX0JPQktfQk9BUkRfTkFORF9DT05UUk9MCQkweDAxYzAwNTQzCisKKyNkZWZpbmUgREJfRFhfQk9CS19CT0FSRF9OT1JfUkVBRF9QQVJBTVMJMHg0MDNFMDdDRgorI2RlZmluZSBEQl9EWF9CT0JLX0JPQVJEX05PUl9XUklURV9QQVJBTVMJMHgwMDBGMEYwRgorCisvKiBUT0RPICovCitNVl9CT0FSRF9UV1NJX0lORk8JZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkVHdzaURldltdID0geworLyoge3tNVl9CT0FSRF9ERVZfQ0xBU1MJZGV2Q2xhc3MsIE1WX1U4CXR3c2lEZXZBZGRyLCBNVl9VOCB0d3NpRGV2QWRkclR5cGV9fSAqLworCXtCT0FSRF9ERVZfVFdTSV9QTEQsIDB4MTgsIEFERFI3X0JJVH0sCQkvKiBBY2Nlc3MgdG8gY29udHJvbCBQTEQgcmVnIGZpbGUgKi8KKwl7Qk9BUkRfREVWX1RXU0lfWkFSTElOSywgMHgxQiwgQUREUjdfQklUfSwJCS8qIEFjY2VzcyB0byBaYXJsaW5rCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEMsIEFERFI3X0JJVH0sICAgICAgICAgLyogU2F0UiBiaW9zIDAJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEQsIEFERFI3X0JJVH0sICAgICAgICAgLyogU2F0UiBiaW9zIDEJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEUsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNhdFIgYmlvcyAyCQkqLworCXtCT0FSRF9ERVZfVFdTSV9TQVRSLCAweDRGLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTYXRSIGJpb3MgMwkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMHg1MCwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2VyaWFsIEluaXQgRVBST00JKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAwCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDcxLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3NSwgQUREUjdfQklUfSAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMgkqLworfTsKKworTVZfQk9BUkRfTUFDX0lORk8gZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTWFjSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVEIGJvYXJkTWFjU3BlZWQsIE1WXzMyIGJvYXJkRXRoU21pQWRkciAsIE1WXzMyIGJvYXJkRXRoU21pQWRkcjA7fX0gKi8KKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSwgTVZfRkFMU0V9LAorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgMHgwLCAweDAsIE1WX1RSVUV9LAorfTsKKworTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRNb2RUeXBlSW5mb1tdID0geworCXsKKwkJLmJvYXJkTXBwTW9kCQk9IE1WX0JPQVJEX0FVVE8sCisJfQorfTsKKworLyogVE8gREUgKi8KK01WX0RFVl9DU19JTkZPIGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZERlQ3NJbmZvW10gPSB7CisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoIH0qLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJe0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTYsIDAsIE1WX1RSVUV9IC8qIE5PUiBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VuZGlmCit9OworCitNVl9CT0FSRF9NUFBfSU5GTyBkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZVtdID0geworCXsgeworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJREJfRFhfQk9CS19DRVRVU19OT1JfTVBQMF83LAorCURCX0RYX0JPQktfQ0VUVVNfTk9SX01QUDhfMTUsCisjZWxzZQorCURCX0RYX0JPQktfQ0VUVVNfTVBQMF83LAorCURCX0RYX0JPQktfQ0VUVVNfTVBQOF8xNSwKKyNlbmRpZgorCURCX0RYX0JPQktfQ0VUVVNfTVBQMTZfMjMsCisJREJfRFhfQk9CS19DRVRVU19NUFAyNF8zMSwKKwlEQl9EWF9CT0JLX0NFVFVTX01QUDMyXzM5LAorCX0gfSwKK307CisKK01WX0JPQVJEX0lORk8gZGJfZHhfYm9ia0NldHVzSW5mbyA9IHsKKwkuYm9hcmROYW1lCQkJPSAiREItOThEWDQyMzUtMTJYRyIsCisJLm51bUJvYXJkTXBwVHlwZVZhbHVlCQk9IEFSUlNaKGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZE1vZFR5cGVJbmZvKSwKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZE1vZFR5cGVJbmZvLAorCS5udW1Cb2FyZE1wcENvbmZpZ1ZhbHVlCQk9IEFSUlNaKGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLmludHNHcHBNYXNrTG93CQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKKwkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCisJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1ooZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkRGVDc0luZm8pLAorCS5wRGV2Q3NJbmZvCQkJPSBkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmREZUNzSW5mbywKKwkubnVtQm9hcmRUd3NpRGV2CQk9IEFSUlNaKGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJPSBkYl9keF9ib2JrQ2V0dXNJbmZvQm9hcmRUd3NpRGV2LAorCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1ooZGJfZHhfYm9ia0NldHVzSW5mb0JvYXJkTWFjSW5mbyksCisJLnBCb2FyZE1hY0luZm8JCQk9IGRiX2R4X2JvYmtDZXR1c0luZm9Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBOVUxMLAorCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCisJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCisJLmxlZHNQb2xhcml0eQkJCT0gMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQk9IERCX0RYX0JPQktfQ0VUVVNfR1BQX09VVF9FTkFfTE9XLAorCS5ncHBPdXRFblZhbE1pZAkJCT0gREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX0VOQV9NSUQsCisJLmdwcE91dEVuVmFsSGlnaAkJPSAwLAorCS5ncHBPdXRWYWxMb3cJCQk9IERCX0RYX0JPQktfQ0VUVVNfR1BQX09VVF9WQUxfTE9XLAorCS5ncHBPdXRWYWxNaWQJCQk9IERCX0RYX0JPQktfQ0VUVVNfR1BQX09VVF9WQUxfTUlELAorCS5ncHBPdXRWYWxIaWdoCQkJPSAwLAorCS5ncHBQb2xhcml0eVZhbExvdwkJPSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9QT0xfTE9XLAorCS5ncHBQb2xhcml0eVZhbE1pZAkJPSBEQl9EWF9CT0JLX0NFVFVTX0dQUF9QT0xfTUlELAorCS5ncHBQb2xhcml0eVZhbEhpZ2gJCT0gMCwKKworCS8qIEV4dGVybmFsIFN3aXRjaCBDb25maWd1cmF0aW9uICovCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCisKKwkvKiBOQU5EIGluaXQgcGFyYW1zICovCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAorCS5uYW5kRmxhc2hDb250cm9sCQk9IERCX0RYX0JPQktfQk9BUkRfTkFORF9DT05UUk9MLAorCS8qIE5PUiBpbml0IHBhcmFtcyAqLworCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfVFJVRSwKKwkuc21pRXh0ZXJuYWxQcEluZGV4CQk9IDAsCisJLm1vZGVsTmFtZQkJCT0gIkJvYksgQ2V0dXMgRGV2ZWxvcG1lbnQgQm9hcmQiLAorCS5pc1NkTW1jQ29ubmVjdGVkCQk9IE1WX1RSVUUsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLmlzQ20zCQkJCT0gTVZfVFJVRQorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEJPQkstQ0FFTFVNLURCLTk4RFg0MjAzLTQ4RzEyWEcgQk9BUkQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTVZfQk9BUkRfVFdTSV9JTkZPCWRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRUd3NpRGV2W10gPSB7CisvKiB7e01WX0JPQVJEX0RFVl9DTEFTUwlkZXZDbGFzcywgTVZfVTgJdHdzaURldkFkZHIsIE1WX1U4IHR3c2lEZXZBZGRyVHlwZX19ICovCisJe0JPQVJEX0RFVl9UV1NJX1BMRCwgMHgxOCwgQUREUjdfQklUfSwJCS8qIEFjY2VzcyB0byBjb250cm9sIFBMRCByZWcgZmlsZSAqLworCXtCT0FSRF9ERVZfVFdTSV9aQVJMSU5LLCAweDFCLCBBRERSN19CSVR9LAkJLyogQWNjZXNzIHRvIFphcmxpbmsJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0QywgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMAkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RCwgQUREUjdfQklUfSwgICAgICAgICAvKiBTYXRSIGJpb3MgMQkJKi8KKwl7Qk9BUkRfREVWX1RXU0lfU0FUUiwgMHg0RSwgQUREUjdfQklUfSwgICAgICAgICAgLyogU2F0UiBiaW9zIDIJCSovCisJe0JPQVJEX0RFVl9UV1NJX1NBVFIsIDB4NEYsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFNhdFIgYmlvcyAzCQkqLworCXtCT0FSRF9ERVZfVFdTSV9JTklUX0VQUk9NLCAweDUwLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBTZXJpYWwgSW5pdCBFUFJPTQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTU1X0lPX0VYUEFOREVSLCAweDIwLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBRc2dtaWkvc2ZwIG11eCBjb250cm9sIFBDQTk1NTUgSU8gZXhwYW5kZXIgKi8KKwl7Qk9BUkRfREVWX1RXU0lfUENBOTU0OF9JT19NVVgsIDB4NzAsIEFERFI3X0JJVH0sICAgICAgICAgIC8qIFBDQTk1NDggSTJDIG11eCAwCSovCisJe0JPQVJEX0RFVl9UV1NJX1BDQTk1NDhfSU9fTVVYLCAweDcxLCBBRERSN19CSVR9LCAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMQkqLworCXtCT0FSRF9ERVZfVFdTSV9QQ0E5NTQ4X0lPX01VWCwgMHg3NSwgQUREUjdfQklUfSAgICAgICAgICAvKiBQQ0E5NTQ4IEkyQyBtdXggMgkqLworfTsKKworTVZfQk9BUkRfTUFDX0lORk8gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZE1hY0luZm9bXSA9IHsKKwkvKiB7e01WX0JPQVJEX01BQ19TUEVFRCBib2FyZE1hY1NwZWVkLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIgLCBNVl8zMiBib2FyZEV0aFNtaUFkZHIwO319ICovCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEsIE1WX0ZBTFNFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIDB4MCwgMHgwLCBNVl9UUlVFfSwKK307CisKK01WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZE1vZFR5cGVJbmZvW10gPSB7CisJeworCQkuYm9hcmRNcHBNb2QJCT0gTVZfQk9BUkRfQVVUTywKKwl9Cit9OworCisvKiBUTyBERSAqLworTVZfREVWX0NTX0lORk8gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZERlQ3NJbmZvW10gPSB7CisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoIH0qLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TUEkpCisJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCisJe0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTYsIDAsIE1WX1RSVUV9IC8qIE5PUiBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VuZGlmCit9OworCitNVl9CT0FSRF9NUFBfSU5GTyBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWVbXSA9IHsKKwl7IHsKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKQorCURCX0RYX0JPQktfQ0FFTFVNX05PUl9NUFAwXzcsCisJREJfRFhfQk9CS19DQUVMVU1fTk9SX01QUDhfMTUsCisjZWxzZQorCURCX0RYX0JPQktfQ0FFTFVNX01QUDBfNywKKwlEQl9EWF9CT0JLX0NBRUxVTV9NUFA4XzE1LAorI2VuZGlmCisJREJfRFhfQk9CS19DQUVMVU1fTVBQMTZfMjMsCisJREJfRFhfQk9CS19DQUVMVU1fTVBQMjRfMzEsCisJREJfRFhfQk9CS19DQUVMVU1fTVBQMzJfMzksCisJfSB9LAorfTsKKworTVZfQk9BUkRfSU5GTyBkYl9keF9ib2JrQ2FlbHVtSW5mbyA9IHsKKwkuYm9hcmROYW1lCQkJPSAiREItOThEWDQyMDMtNDhHMTJYRyIsCisJLm51bUJvYXJkTXBwVHlwZVZhbHVlCQk9IEFSUlNaKGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRNb2RUeXBlSW5mbyksCisJLnBCb2FyZE1vZFR5cGVWYWx1ZQkJPSBkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTW9kVHlwZUluZm8sCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLAorCS5pbnRzR3BwTWFza0xvdwkJCT0gMCwKKwkuaW50c0dwcE1hc2tNaWQJCQk9IDAsCisJLmludHNHcHBNYXNrSGlnaAkJPSAwLAorCS5udW1Cb2FyZERldmljZUlmCQk9IEFSUlNaKGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmREZUNzSW5mbyksCisJLnBEZXZDc0luZm8JCQk9IGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmREZUNzSW5mbywKKwkubnVtQm9hcmRUd3NpRGV2CQk9IEFSUlNaKGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRUd3NpRGV2KSwKKwkucEJvYXJkVHdzaURldgkJCT0gZGJfZHhfYm9ia0NhZWx1bUluZm9Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihkYl9keF9ib2JrQ2FlbHVtSW5mb0JvYXJkTWFjSW5mbyksCisJLnBCb2FyZE1hY0luZm8JCQk9IGRiX2R4X2JvYmtDYWVsdW1JbmZvQm9hcmRNYWNJbmZvLAorCS5udW1Cb2FyZEdwcEluZm8JCT0gMCwKKwkucEJvYXJkR3BwSW5mbwkJCT0gTlVMTCwKKwkuYWN0aXZlTGVkc051bWJlcgkJPSAwLAorCS5wTGVkR3BwUGluCQkJPSBOVUxMLAorCS5sZWRzUG9sYXJpdHkJCQk9IDAsCisKKwkvKiBHUFAgdmFsdWVzICovCisJLmdwcE91dEVuVmFsTG93CQkJPSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfT1VUX0VOQV9MT1csCisJLmdwcE91dEVuVmFsTWlkCQkJPSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfT1VUX0VOQV9NSUQsCisJLmdwcE91dEVuVmFsSGlnaAkJPSAwLAorCS5ncHBPdXRWYWxMb3cJCQk9IERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfVkFMX0xPVywKKwkuZ3BwT3V0VmFsTWlkCQkJPSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfT1VUX1ZBTF9NSUQsCisJLmdwcE91dFZhbEhpZ2gJCQk9IDAsCisJLmdwcFBvbGFyaXR5VmFsTG93CQk9IERCX0RYX0JPQktfQ0FFTFVNX0dQUF9QT0xfTE9XLAorCS5ncHBQb2xhcml0eVZhbE1pZAkJPSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfUE9MX01JRCwKKwkuZ3BwUG9sYXJpdHlWYWxIaWdoCQk9IDAsCisKKwkvKiBFeHRlcm5hbCBTd2l0Y2ggQ29uZmlndXJhdGlvbiAqLworCS5wU3dpdGNoSW5mbyA9IE5VTEwsCisJLnN3aXRjaEluZm9OdW0gPSAwLAorCisJLyogTkFORCBpbml0IHBhcmFtcyAqLworCS5uYW5kRmxhc2hSZWFkUGFyYW1zCQk9IERCX0RYX0JPQktfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKKwkubmFuZEZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKKwkubmFuZEZsYXNoQ29udHJvbAkJPSBEQl9EWF9CT0JLX0JPQVJEX05BTkRfQ09OVFJPTCwKKwkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KKwkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IERCX0RYX0JPQktfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAorCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0JPQktfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX1RSVUUsCisJLnNtaUV4dGVybmFsUHBJbmRleAkJPSAxLAorCS5tb2RlbE5hbWUJCQk9ICJCb2JLIENhZWx1bSBEZXZlbG9wbWVudCBCb2FyZCIsCisJLmlzU2RNbWNDb25uZWN0ZWQJCT0gTVZfVFJVRSwKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkuaXNDbTMJCQkJPSBNVl9UUlVFCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQk9CSy1MRVdJUy1SRC1MV1MtMTJYRy1BIEJPQVJEICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworTVZfQk9BUkRfVFdTSV9JTkZPCXJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZFR3c2lEZXZbXSA9IHsKKy8qIHt7TVZfQk9BUkRfREVWX0NMQVNTCWRldkNsYXNzLCBNVl9VOAl0d3NpRGV2QWRkciwgTVZfVTggdHdzaURldkFkZHJUeXBlfX0gKi8KKwl7Qk9BUkRfREVWX1RXU0lfSU5JVF9FUFJPTSwgMHg1MCwgQUREUjdfQklUfSwJLyogU2VyaWFsIEluaXQgRVBST00JKi8KK307CisKKworTVZfQk9BUkRfTUFDX0lORk8gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTWFjSW5mb1tdID0geworLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLworCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9GQUxTRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0sCit9OworCitNVl9CT0FSRF9NT0RVTEVfVFlQRV9JTkZPIHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZE1vZFR5cGVJbmZvW10gPSB7CisJeworCQkuYm9hcmRNcHBNb2QJCT0gTVZfQk9BUkRfQVVUTywKKwl9Cit9OworCisvKiBUTyBERSAqLworTVZfREVWX0NTX0lORk8gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKKwkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGggfSovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwl7U1BJX0NTMCwgTl9BLCBCT0FSRF9ERVZfU1BJX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSwgLyogU1BJIERFViAqLworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX05BTkQpCisJe0RFVklDRV9DUzAsIE5fQSwgQk9BUkRfREVWX05BTkRfRkxBU0gsIDgsIDgsIDAsIE1WX1RSVUV9IC8qIE5BTkQgREVWICovCisjZW5kaWYKK307CisKK01WX0JPQVJEX01QUF9JTkZPIHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlW10gPSB7CisJeyB7CisJUkRfRFhfQk9CS19MRVdJU19NUFAwXzcsCisJUkRfRFhfQk9CS19MRVdJU19NUFA4XzE1LAorCVJEX0RYX0JPQktfTEVXSVNfTVBQMTZfMjMsCisJUkRfRFhfQk9CS19MRVdJU19NUFAyNF8zMSwKKwlSRF9EWF9CT0JLX0xFV0lTX01QUDMyXzM5LAorCX0gfSwKK307CisKK01WX0JPQVJEX0lORk8gcmRfZHhfYm9ia0xld2lzSW5mbyA9IHsKKwkuYm9hcmROYW1lCQkJPSAiUkQtTFdTLTEyWEctQSIsCisJLm51bUJvYXJkTXBwVHlwZVZhbHVlCQk9IEFSUlNaKHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZE1vZFR5cGVJbmZvKSwKKwkucEJvYXJkTW9kVHlwZVZhbHVlCQk9IHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZE1vZFR5cGVJbmZvLAorCS5udW1Cb2FyZE1wcENvbmZpZ1ZhbHVlCQk9IEFSUlNaKHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gcmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLmludHNHcHBNYXNrTG93CQkJPSAwLAorCS5pbnRzR3BwTWFza01pZAkJCT0gMCwKKwkuaW50c0dwcE1hc2tIaWdoCQk9IDAsCisJLm51bUJvYXJkRGV2aWNlSWYJCT0gQVJSU1oocmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkRGVDc0luZm8pLAorCS5wRGV2Q3NJbmZvCQkJPSByZF9keF9ib2JrTGV3aXNJbmZvQm9hcmREZUNzSW5mbywKKwkubnVtQm9hcmRUd3NpRGV2CQk9IEFSUlNaKHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZFR3c2lEZXYpLAorCS5wQm9hcmRUd3NpRGV2CQkJPSByZF9keF9ib2JrTGV3aXNJbmZvQm9hcmRUd3NpRGV2LAorCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1oocmRfZHhfYm9ia0xld2lzSW5mb0JvYXJkTWFjSW5mbyksCisJLnBCb2FyZE1hY0luZm8JCQk9IHJkX2R4X2JvYmtMZXdpc0luZm9Cb2FyZE1hY0luZm8sCisJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBOVUxMLAorCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCisJLnBMZWRHcHBQaW4JCQk9IE5VTEwsCisJLmxlZHNQb2xhcml0eQkJCT0gMCwKKworCS8qIEdQUCB2YWx1ZXMgKi8KKwkuZ3BwT3V0RW5WYWxMb3cJCQk9IFJEX0RYX0JPQktfTEVXSVNfR1BQX09VVF9FTkFfTE9XLAorCS5ncHBPdXRFblZhbE1pZAkJCT0gUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX0VOQV9NSUQsCisJLmdwcE91dEVuVmFsSGlnaAkJPSAwLAorCS5ncHBPdXRWYWxMb3cJCQk9IFJEX0RYX0JPQktfTEVXSVNfR1BQX09VVF9WQUxfTE9XLAorCS5ncHBPdXRWYWxNaWQJCQk9IFJEX0RYX0JPQktfTEVXSVNfR1BQX09VVF9WQUxfTUlELAorCS5ncHBPdXRWYWxIaWdoCQkJPSAwLAorCS5ncHBQb2xhcml0eVZhbExvdwkJPSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9QT0xfTE9XLAorCS5ncHBQb2xhcml0eVZhbE1pZAkJPSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9QT0xfTUlELAorCS5ncHBQb2xhcml0eVZhbEhpZ2gJCT0gMCwKKworCS8qIEV4dGVybmFsIFN3aXRjaCBDb25maWd1cmF0aW9uICovCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCisKKwkvKiBOQU5EIGluaXQgcGFyYW1zICovCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OQU5EX1JFQURfUEFSQU1TLAorCS5uYW5kRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9CT0JLX0JPQVJEX05BTkRfV1JJVEVfUEFSQU1TLAorCS5uYW5kRmxhc2hDb250cm9sCQk9IERCX0RYX0JPQktfQk9BUkRfTkFORF9DT05UUk9MLAorCS8qIE5PUiBpbml0IHBhcmFtcyAqLworCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQk9CS19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfVFJVRSwKKwkuc21pRXh0ZXJuYWxQcEluZGV4CQk9IDAsCisJLm1vZGVsTmFtZQkJCT0gIkJvYksgTGV3aXMgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCIsCisJLmlzU2RNbWNDb25uZWN0ZWQJCT0gTVZfVFJVRQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTU4NCw4ICsxMTc1LDggQEAKIAogTVZfQk9BUkRfTUFDX0lORk8gZGJfZHhfYWMzSW5mb0JvYXJkTWFjSW5mb1tdID0gewogLyoge3tNVl9CT0FSRF9NQUNfU1BFRUQgYm9hcmRNYWNTcGVlZCwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyICwgTVZfMzIgYm9hcmRFdGhTbWlBZGRyMDt9fSAqLwotCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xIH0sCi0Je0JPQVJEX01BQ19TUEVFRF9BVVRPLCAtMSwgLTEgfQorCXtCT0FSRF9NQUNfU1BFRURfQVVUTywgLTEsIC0xLCBNVl9UUlVFfSwKKwl7Qk9BUkRfTUFDX1NQRUVEX0FVVE8sIC0xLCAtMSwgTVZfVFJVRX0KIH07CiAKIE1WX0JPQVJEX01PRFVMRV9UWVBFX0lORk8gZGJfZHhfYWMzSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKQEAgLTU5NSwxMiArMTE4NiwxNyBAQAogfTsKIAogTVZfREVWX0NTX0lORk8gZGJfZHhfYWMzSW5mb0JvYXJkRGVDc0luZm9bXSA9IHsKLQkvKntkZXZpY2VDUywgcGFyYW1zLCBkZXZUeXBlLCBkZXZXaWR0aCwgYnVzV2lkdGggfSovCisJLyp7ZGV2aWNlQ1MsIHBhcmFtcywgZGV2VHlwZSwgZGV2V2lkdGgsIGJ1c1dpZHRoLCBidXNOdW0sIGFjdGl2ZSB9Ki8KICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU1BJKQotCXtTUElfQ1MwLCBOX0EsIEJPQVJEX0RFVl9TUElfRkxBU0gsIDgsIDh9LCAvKiBTUEkgREVWICovCisJe1NQSV9DUzAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KICNlbmRpZgotI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OT1IpCi0Je0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTZ9IC8qIE5PUiBERVYgKi8KKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfTk9SKSAmJiBkZWZpbmVkKE1WX0lOQ0xVREVfTkFORCkKKwl7REVWSUNFX0NTMCwgTl9BLCBCT0FSRF9ERVZfTkFORF9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIE5BTkQgREVWICovCisJe0RFVl9CT09DUywgTl9BLCBCT0FSRF9ERVZfTk9SX0ZMQVNILCAxNiwgMTYsIDAsIE1WX1RSVUV9IC8qIE5PUiBERVYgKi8KKyNlbGlmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VsaWYgZGVmaW5lZChNVl9JTkNMVURFX05PUikKKwl7REVWX0JPT0NTLCBOX0EsIEJPQVJEX0RFVl9OT1JfRkxBU0gsIDE2LCAxNiwgMCwgTVZfVFJVRX0gLyogTk9SIERFViAqLwogI2VuZGlmCiB9OwogCkBAIC02NTYsNyArMTI1MiwxMCBAQAogCS5uYW5kRmxhc2hDb250cm9sCQk9IERCX0RYX0FDM19CT0FSRF9OQU5EX0NPTlRST0wsCiAJLyogTk9SIGluaXQgcGFyYW1zICovCiAJLm5vckZsYXNoUmVhZFBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1JFQURfUEFSQU1TLAotCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLm1vZGVsTmFtZQkJCT0gIkFsbGV5Q2F0MyBEZXZlbG9wbWVudCBCb2FyZCIsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9GQUxTRQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTcxNSw3ICsxMzE0LDEwIEBACiAJLm5hbmRGbGFzaENvbnRyb2wJCT0gREJfRFhfQUMzX0JPQVJEX05BTkRfQ09OVFJPTCwKIAkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KIAkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCi0JLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkubW9kZWxOYW1lCQkJPSAiQWxsZXlDYXQzIFJlZmVyZW5jZSBEZXNpZ24gQm9hcmQiLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfRkFMU0UKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzczLDEyICsxMzc1LDE1IEBACiAJLm5hbmRGbGFzaENvbnRyb2wJCT0gREJfRFhfQUMzX0JPQVJEX05BTkRfQ09OVFJPTCwKIAkvKiBOT1IgaW5pdCBwYXJhbXMgKi8KIAkubm9yRmxhc2hSZWFkUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfUkVBRF9QQVJBTVMsCi0JLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMKKwkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUywKKwkuY29uZmlnQXV0b0RldGVjdAkJPSBNVl9UUlVFLAkvKiBFbmFibGUgbW9kdWxlcyBhdXRvLWRldGVjdGlvbi4gKi8KKwkubW9kZWxOYW1lCQkJPSAiQWxsZXlDYXQzIFJlZmVyZW5jZSBEZXNpZ24gQm9hcmQiLAorCS5pc1NtaUV4dGVybmFsUHAJCT0gTVZfRkFMU0UKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBBTExFWUNBVDMtREItTUlTTC0yNEcgQk9BUkQgICAgICovCisvKiBBTExFWUNBVDMtUkQtTVRMLTJYWEctMlhHIEJPQVJEICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9CT0FSRF9NUFBfSU5GTyBkYl9taXNsXzI0R180Nl9hYzNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZVtdID0gewogCXsgewpAQCAtNzkxLDExICsxMzk2LDExIEBACiB9OwogCiBNVl9CT0FSRF9JTkZPIGRiX21pc2xfMjRHXzR4Z19hYzNJbmZvID0gewotCS5ib2FyZE5hbWUJCQkJPSAiREItWEMzLTI0Ry00RyIsCi0JLm51bUJvYXJkTXBwVHlwZVZhbHVlCT0gQVJSU1ooZGJfZHhfYWMzSW5mb0JvYXJkTW9kVHlwZUluZm8pLAorCS5ib2FyZE5hbWUJCQk9ICJEQi1YQzMtMjRHLTRHIiwKKwkubnVtQm9hcmRNcHBUeXBlVmFsdWUJCT0gQVJSU1ooZGJfZHhfYWMzSW5mb0JvYXJkTW9kVHlwZUluZm8pLAogCS5wQm9hcmRNb2RUeXBlVmFsdWUJCT0gZGJfZHhfYWMzSW5mb0JvYXJkTW9kVHlwZUluZm8sCi0JLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJPSBBUlJTWihkYl9taXNsXzI0R180Nl9hYzNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZSksCi0JLnBCb2FyZE1wcENvbmZpZ1ZhbHVlCT0gZGJfbWlzbF8yNEdfNDZfYWMzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUsCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooZGJfbWlzbF8yNEdfNDZfYWMzSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWUpLAorCS5wQm9hcmRNcHBDb25maWdWYWx1ZQkJPSBkYl9taXNsXzI0R180Nl9hYzNJbmZvQm9hcmRNcHBDb25maWdWYWx1ZSwKIAkuaW50c0dwcE1hc2tMb3cJCQk9IDAsCiAJLmludHNHcHBNYXNrTWlkCQkJPSAwLAogCS5pbnRzR3BwTWFza0hpZ2gJCT0gMCwKQEAgLTgzMiw3ICsxNDM3LDEwIEBACiAJLm5hbmRGbGFzaENvbnRyb2wJCQk9IERCX0RYX0FDM19CT0FSRF9OQU5EX0NPTlRST0wsCiAJLyogTk9SIGluaXQgcGFyYW1zICovCiAJLm5vckZsYXNoUmVhZFBhcmFtcwkJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwkJPSBEQl9EWF9BQzNfQk9BUkRfTk9SX1dSSVRFX1BBUkFNUworCS5ub3JGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5tb2RlbE5hbWUJCQk9ICJBbGxleUNhdDMgUmVmZXJlbmNlIERlc2lnbiBCb2FyZCIsCisJLmlzU21pRXh0ZXJuYWxQcAkJPSBNVl9GQUxTRQogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTg2Miw4ICsxNDcwLDggQEAKIAkucERldkNzSW5mbwkJCQk9IGRiX2R4X2FjM0luZm9Cb2FyZERlQ3NJbmZvLAogCS5udW1Cb2FyZFR3c2lEZXYJCT0gQVJSU1ooZGJfZHhfYWMzSW5mb0JvYXJkVHdzaURldiksCiAJLnBCb2FyZFR3c2lEZXYJCQk9IGRiX2R4X2FjM0luZm9Cb2FyZFR3c2lEZXYsCi0JLm51bUJvYXJkTWFjSW5mbwkJPSAwLAotCS5wQm9hcmRNYWNJbmZvCQkJPSBOVUxMLAorCS5udW1Cb2FyZE1hY0luZm8JCT0gQVJSU1ooZGJfZHhfYWMzSW5mb0JvYXJkTWFjSW5mbyksCisJLnBCb2FyZE1hY0luZm8JCQk9IGRiX2R4X2FjM0luZm9Cb2FyZE1hY0luZm8sCiAJLm51bUJvYXJkR3BwSW5mbwkJPSAwLAogCS5wQm9hcmRHcHBJbmZvCQkJPSBOVUxMLAogCS5hY3RpdmVMZWRzTnVtYmVyCQk9IDAsCkBAIC04ODIsMTggKzE0OTAsMTIyIEBACiAJLmdwcFBvbGFyaXR5VmFsSGlnaAkJPSAwLAogCiAJLyogRXh0ZXJuYWwgU3dpdGNoIENvbmZpZ3VyYXRpb24gKi8KLQkucFN3aXRjaEluZm8JCQk9IE5VTEwsCi0JLnN3aXRjaEluZm9OdW0JCQk9IDAsCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCiAKIAkvKiBOQU5EIGluaXQgcGFyYW1zICovCi0JLm5hbmRGbGFzaFJlYWRQYXJhbXMJPSBEQl9EWF9BQzNfQk9BUkRfTkFORF9SRUFEX1BBUkFNUywKLQkubmFuZEZsYXNoV3JpdGVQYXJhbXMJPSBEQl9EWF9BQzNfQk9BUkRfTkFORF9XUklURV9QQVJBTVMsCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCisJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IERCX0RYX0FDM19CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKIAkubmFuZEZsYXNoQ29udHJvbAkJPSBEQl9EWF9BQzNfQk9BUkRfTkFORF9DT05UUk9MLAogCS8qIE5PUiBpbml0IHBhcmFtcyAqLwogCS5ub3JGbGFzaFJlYWRQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9SRUFEX1BBUkFNUywKLQkubm9yRmxhc2hXcml0ZVBhcmFtcwk9IERCX0RYX0FDM19CT0FSRF9OT1JfV1JJVEVfUEFSQU1TCisJLm5vckZsYXNoV3JpdGVQYXJhbXMJCT0gREJfRFhfQUMzX0JPQVJEX05PUl9XUklURV9QQVJBTVMsCisJLmNvbmZpZ0F1dG9EZXRlY3QJCT0gTVZfVFJVRSwJLyogRW5hYmxlIG1vZHVsZXMgYXV0by1kZXRlY3Rpb24uICovCisJLm1vZGVsTmFtZQkJCT0gIkFsbGV5Q2F0MyBSZWZlcmVuY2UgRGVzaWduIEJvYXJkIiwKKwkuaXNTbWlFeHRlcm5hbFBwCQk9IE1WX0ZBTFNFCiB9OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQVJNQURBLVhQIEFNQyBCT0FSRCAtICBvbmx5IGZvciBMaW51eCB1c2FnZSAoQVhQIGZhbWlseSBpcyBzaGFyZWQgd2l0aCBNU1lTIGluIExTUCkgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERCXzc4WDYwX0FNQ19CT0FSRF9OQU5EX1JFQURfUEFSQU1TCQkweDAwMEMwMjgyCisjZGVmaW5lIERCXzc4WDYwX0FNQ19CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUwkJMHgwMDAxMDMwNQorLypOQU5EIGNhcmUgc3VwcG9ydCBmb3Igc21hbGwgcGFnZSBjaGlwcyovCisjZGVmaW5lIERCXzc4WDYwX0FNQ19CT0FSRF9OQU5EX0NPTlRST0wJCQkweDAxYzAwNTQzCisKK01WX1U4CWRiNzhYNjBhbWNJbmZvQm9hcmREZWJ1Z0xlZElmW10gPSB7NTMsIDU0LCA1NSwgNTZ9OyAvKiA3IHNlZ21lbnQgTVBQcyovCisKK01WX0JPQVJEX1RXU0lfSU5GTwlkYjc4WDYwYW1jSW5mb0JvYXJkVHdzaURldltdID0geworCS8qIE5vIFRXU0kgZGV2aWNlcyBvbiBib2FyZCovCit9OworCitNVl9CT0FSRF9NQUNfSU5GTyBkYjc4WDYwYW1jSW5mb0JvYXJkTWFjSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfTUFDX1NQRUVECWJvYXJkTWFjU3BlZWQsIE1WX1U4IGJvYXJkRXRoU21pQWRkcn19ICovCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDEsIDB4MCwgTVZfVFJVRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweEQsIDB4MCwgTVZfVFJVRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweEMsIDB4MCwgTVZfVFJVRX0sCisJe0JPQVJEX01BQ19TUEVFRF9BVVRPLCAweDAsIDB4MCwgTVZfVFJVRX0KK307CisKKworTVZfQk9BUkRfTU9EVUxFX1RZUEVfSU5GTyBkYjc4WDYwYW1jSW5mb0JvYXJkTW9kVHlwZUluZm9bXSA9IHsKKwkvKiBObyBNb2R1bGVzICovCit9OworCitNVl9CT0FSRF9HUFBfSU5GTyBkYjc4WDYwYW1jSW5mb0JvYXJkR3BwSW5mb1tdID0geworCS8qIHt7TVZfQk9BUkRfR1BQX0NMQVNTCWRldkNsYXNzLCBNVl9VOAlncHBQaW5OdW19fSAqLworCXtCT0FSRF9HUFBfVVNCX1ZCVVMsICAgIDQ2fSAvKiBmcm9tIE1QUCBtYXAgKi8KK307CisKK01WX0RFVl9DU19JTkZPIGRiNzhYNjBhbWNJbmZvQm9hcmREZUNzSW5mb1tdID0geworCS8qe2RldmljZUNTLCBwYXJhbXMsIGRldlR5cGUsIGRldldpZHRofSovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NQSSkKKwl7U1BJX0NTMF9BWFAsIE5fQSwgQk9BUkRfREVWX1NQSV9GTEFTSCwgOCwgOCwgMCwgTVZfVFJVRX0sIC8qIFNQSSBERVYgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9OQU5EKQorCXtERVZJQ0VfQ1MwLCBOX0EsIEJPQVJEX0RFVl9OQU5EX0ZMQVNILCA4LCA4LCAwLCBNVl9UUlVFfSAvKiBOQU5EIERFViAqLworI2VuZGlmCit9OworCitNVl9CT0FSRF9NUFBfSU5GTyBkYjc4WDYwYW1jSW5mb0JvYXJkTXBwQ29uZmlnVmFsdWVbXSA9IHsKKwl7IHsKKwkJREJfNzhYNjBfQU1DX01QUDBfNywKKwkJREJfNzhYNjBfQU1DX01QUDhfMTUsCisJCURCXzc4WDYwX0FNQ19NUFAxNl8yMywKKwkJREJfNzhYNjBfQU1DX01QUDI0XzMxLAorCQlEQl83OFg2MF9BTUNfTVBQMzJfMzksCisJCURCXzc4WDYwX0FNQ19NUFA0MF80NywKKwkJREJfNzhYNjBfQU1DX01QUDQ4XzU1LAorCQlEQl83OFg2MF9BTUNfTVBQNTZfNjMsCisJCURCXzc4WDYwX0FNQ19NUFA2NF82NywKKwl9IH0KK307CisKK01WX0JPQVJEX0lORk8gZGI3OFg2MGFtY0luZm8gPSB7CisJLmJvYXJkTmFtZQkJCT0gIkRCLTc4NDYwLUFNQyIsCisJLm51bUJvYXJkTXBwVHlwZVZhbHVlCQk9IEFSUlNaKGRiNzhYNjBhbWNJbmZvQm9hcmRNb2RUeXBlSW5mbyksCisJLnBCb2FyZE1vZFR5cGVWYWx1ZQkJPSBkYjc4WDYwYW1jSW5mb0JvYXJkTW9kVHlwZUluZm8sCisJLm51bUJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gQVJSU1ooZGI3OFg2MGFtY0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlKSwKKwkucEJvYXJkTXBwQ29uZmlnVmFsdWUJCT0gZGI3OFg2MGFtY0luZm9Cb2FyZE1wcENvbmZpZ1ZhbHVlLAorCS5pbnRzR3BwTWFza0xvdwkJCT0gMCwKKwkuaW50c0dwcE1hc2tNaWQJCQk9IDAsCisJLmludHNHcHBNYXNrSGlnaAkJPSAwLAorCS5udW1Cb2FyZERldmljZUlmCQk9IEFSUlNaKGRiNzhYNjBhbWNJbmZvQm9hcmREZUNzSW5mbyksCisJLnBEZXZDc0luZm8JCQk9IGRiNzhYNjBhbWNJbmZvQm9hcmREZUNzSW5mbywKKwkubnVtQm9hcmRUd3NpRGV2CQk9IEFSUlNaKGRiNzhYNjBhbWNJbmZvQm9hcmRUd3NpRGV2KSwKKwkucEJvYXJkVHdzaURldgkJCT0gZGI3OFg2MGFtY0luZm9Cb2FyZFR3c2lEZXYsCisJLm51bUJvYXJkTWFjSW5mbwkJPSBBUlJTWihkYjc4WDYwYW1jSW5mb0JvYXJkTWFjSW5mbyksCisJLnBCb2FyZE1hY0luZm8JCQk9IGRiNzhYNjBhbWNJbmZvQm9hcmRNYWNJbmZvLAorCS5udW1Cb2FyZEdwcEluZm8JCT0gQVJSU1ooZGI3OFg2MGFtY0luZm9Cb2FyZEdwcEluZm8pLAorCS5wQm9hcmRHcHBJbmZvCQkJPSBkYjc4WDYwYW1jSW5mb0JvYXJkR3BwSW5mbywKKwkuYWN0aXZlTGVkc051bWJlcgkJPSBBUlJTWihkYjc4WDYwYW1jSW5mb0JvYXJkRGVidWdMZWRJZiksCisJLnBMZWRHcHBQaW4JCQk9IGRiNzhYNjBhbWNJbmZvQm9hcmREZWJ1Z0xlZElmLAorCS5sZWRzUG9sYXJpdHkJCQk9IDAsCisKKwkvKiBHUFAgdmFsdWVzICovCisJLmdwcE91dEVuVmFsTG93CQkJPSBEQl83OFg2MF9BTUNfR1BQX09VVF9FTkFfTE9XLAorCS5ncHBPdXRFblZhbE1pZAkJCT0gREJfNzhYNjBfQU1DX0dQUF9PVVRfRU5BX01JRCwKKwkuZ3BwT3V0RW5WYWxIaWdoCQk9IERCXzc4WDYwX0FNQ19HUFBfT1VUX0VOQV9ISUdILAorCS5ncHBPdXRWYWxMb3cJCQk9IERCXzc4WDYwX0FNQ19HUFBfT1VUX1ZBTF9MT1csCisJLmdwcE91dFZhbE1pZAkJCT0gREJfNzhYNjBfQU1DX0dQUF9PVVRfVkFMX01JRCwKKwkuZ3BwT3V0VmFsSGlnaAkJCT0gREJfNzhYNjBfQU1DX0dQUF9PVVRfVkFMX0hJR0gsCisJLmdwcFBvbGFyaXR5VmFsTG93CQk9IERCXzc4WDYwX0FNQ19HUFBfUE9MX0xPVywKKwkuZ3BwUG9sYXJpdHlWYWxNaWQJCT0gREJfNzhYNjBfQU1DX0dQUF9QT0xfTUlELAorCS5ncHBQb2xhcml0eVZhbEhpZ2gJCT0gREJfNzhYNjBfQU1DX0dQUF9QT0xfSElHSCwKKworCS8qIEV4dGVybmFsIFN3aXRjaCBDb25maWd1cmF0aW9uICovCisJLnBTd2l0Y2hJbmZvID0gTlVMTCwKKwkuc3dpdGNoSW5mb051bSA9IDAsCisKKwkvKiBOQU5EIGluaXQgcGFyYW1zICovCisJLm5hbmRGbGFzaFJlYWRQYXJhbXMJCT0gREJfNzhYNjBfQU1DX0JPQVJEX05BTkRfUkVBRF9QQVJBTVMsCisJLm5hbmRGbGFzaFdyaXRlUGFyYW1zCQk9IERCXzc4WDYwX0FNQ19CT0FSRF9OQU5EX1dSSVRFX1BBUkFNUywKKwkubmFuZEZsYXNoQ29udHJvbAkJPSBEQl83OFg2MF9BTUNfQk9BUkRfTkFORF9DT05UUk9MLAorCS5jb25maWdBdXRvRGV0ZWN0CQk9IE1WX1RSVUUsCS8qIEVuYWJsZSBtb2R1bGVzIGF1dG8tZGV0ZWN0aW9uLiAqLworCS5tb2RlbE5hbWUJCQk9ICJBTUMgRGV2ZWxvcG1lbnQgQm9hcmQiCit9OworCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIE1WX0JPQVJEX0lORk8gKm1hcnZlbGxCQzJCb2FyZEluZm9UYmxbXSA9IHsKQEAgLTkwMiw2ICsxNjE0LDEyIEBACiAJJmJjMl9yZF9tdGxJbmZvCiB9OwogCitNVl9CT0FSRF9JTkZPICptYXJ2ZWxsQk9CS0JvYXJkSW5mb1RibFtdID0geworCSZkYl9keF9ib2JrQ2V0dXNJbmZvLAorCSZkYl9keF9ib2JrQ2FlbHVtSW5mbywKKwkmcmRfZHhfYm9ia0xld2lzSW5mbworfTsKKwogTVZfQk9BUkRfSU5GTyAqbWFydmVsbEFDM0JvYXJkSW5mb1RibFtdID0gewogCSZkYl9keF9hYzNJbmZvLAogCSZyZF9tdGxfNHhnX2FjM0luZm8sCkBAIC05MDksMyArMTYyNyw4IEBACiAJJmRiX21pc2xfMjRHXzR4Z19hYzNJbmZvLAogCSZyZF9tdGxfMjRHX2FjM0luZm8KIH07CisKKy8qIG9ubHkgZm9yIExpbnV4IHVzYWdlIChBWFAgZmFtaWx5IGlzIHNoYXJlZCB3aXRoIE1TWVMgaW4gTFNQKSAqLworTVZfQk9BUkRfSU5GTyAqbWFydmVsbEFYUGJvYXJkSW5mb1RibFtdID0geworCSZkYjc4WDYwYW1jSW5mbworfTsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmggYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9ib2FyZEVudi9tdkJvYXJkRW52U3BlYy5oCmluZGV4IDM0MzQ2MjQuLmZiYTYzZGUgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2JvYXJkRW52L212Qm9hcmRFbnZTcGVjLmgKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvYm9hcmRFbnYvbXZCb2FyZEVudlNwZWMuaApAQCAtODAsOSArODAsOSBAQAogCiAvKiBCb2JjYXQyIE1hcnZlbGwgYm9hcmRzICovCiAjZGVmaW5lIEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UJMHgxMAotI2RlZmluZSBEQl9EWF9CQzJfSUQJCQkJKEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAwKQotI2RlZmluZSBSRF9EWF9CQzJfSUQJCQkJKEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAxKQotI2RlZmluZSBSRF9NVExfQkMyCQkJCQkoQkMyX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDIpCisjZGVmaW5lIERCX0RYX0JDMl9JRAkJCShCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMCkKKyNkZWZpbmUgUkRfRFhfQkMyX0lECQkJKEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAxKQorI2RlZmluZSBSRF9NVExfQkMyCQkJKEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAyKQogI2RlZmluZSBCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQJKEJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAzKQogI2RlZmluZSBCQzJfTUFSVkVMTF9CT0FSRF9OVU0JCShCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQgLSBCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFKQogCkBAIC05NiwxNyArOTYsNTIgQEAKIAogLyogQWxsZXlDYXQzIE1hcnZlbGwgYm9hcmRzICovCiAjZGVmaW5lIEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UJMHgzMAotI2RlZmluZSBEQl9BQzNfSUQJCQkJCShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMCkKLSNkZWZpbmUgUkRfTVRMXzRYR19BQzNfSUQJCQkoQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDEpCisjZGVmaW5lIERCX0FDM19JRAkJCShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMCkKKyNkZWZpbmUgUkRfTVRMXzRYR19BQzNfSUQJCShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMSkKICNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19JRAkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAyKQogI2RlZmluZSBEQl9NSVNMXzI0RzRHX0FDM19JRAkJKEFDM19NQVJWRUxMX0JPQVJEX0lEX0JBU0UgKyAzKQotI2RlZmluZSBSRF9NVExfMjRHX0FDM19JRAkJCShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgNCkKKyNkZWZpbmUgUkRfTVRMXzI0R19BQzNfSUQJCShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgNCkKICNkZWZpbmUgQUMzX01BUlZFTExfTUFYX0JPQVJEX0lECShBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgNSkKICNkZWZpbmUgQUMzX01BUlZFTExfQk9BUkRfTlVNCQkoQUMzX01BUlZFTExfTUFYX0JPQVJEX0lEIC0gQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRSkKIAotI2RlZmluZSBJTlZBTElEX0JPQVJEX0lECQkJMHhGRkZGCisvKiBCb2JLIEN1c3RvbWVyIEJvYXJkcyAqLworI2RlZmluZSBCT0JLX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UJMHg0MAorI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSX0JPQVJEX0lEMAkJKEJPQktfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDApCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSX0JPQVJEX0lEMQkJKEJPQktfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDEpCisjZGVmaW5lIEJPQktfQ1VTVE9NRVJfTUFYX0JPQVJEX0lECQkJKEJPQktfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDIpCisjZGVmaW5lIEJPQktfQ1VTVE9NRVJfQk9BUkRfTlVNCQkJKEJPQktfQ1VTVE9NRVJfTUFYX0JPQVJEX0lEIC0gQk9CS19DVVNUT01FUl9CT0FSRF9JRF9CQVNFKQogCisvKiBCb2JLIE1hcnZlbGwgQm9hcmRzICovCisjZGVmaW5lIEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFCTB4NTAKKyNkZWZpbmUgQk9CS19DRVRVU19EQl9JRAkJCShCT0JLX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDApCisjZGVmaW5lIEJPQktfQ0FFTFVNX0RCX0lECQkJKEJPQktfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgMSkKKyNkZWZpbmUgQk9CS19MRVdJU19SRF9JRAkJCShCT0JLX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDIpCisjZGVmaW5lIEJPQktfTUFSVkVMTF9NQVhfQk9BUkRfSUQJCShCT0JLX01BUlZFTExfQk9BUkRfSURfQkFTRSArIDMpCisjZGVmaW5lIEJPQktfTUFSVkVMTF9CT0FSRF9OVU0JCShCT0JLX01BUlZFTExfTUFYX0JPQVJEX0lEIC0gQk9CS19NQVJWRUxMX0JPQVJEX0lEX0JBU0UpCisKKy8qIEFYUC1BTUMgYm9hcmQ6IGZvciBMaW51eCAyLjYvMy40IHVzYWdlIG9ubHkgKEFYUCBmYW1pbHkgaXMgc2hhcmVkIHdpdGggTVNZUyBpbiBMU1ApICovCisjZGVmaW5lIERCXzc4WDYwX0FNQ19JRAkJCTB4NgorCisjZGVmaW5lIElOVkFMSURfQk9BUkRfSUQJCTB4RkZGRgogI2RlZmluZSBCT0FSRF9JRF9JTkRFWF9NQVNLCQkweDEwCS8qIE1hc2sgdXNlZCB0byByZXR1cm4gYm9hcmQgaW5kZXggdmlhIGJvYXJkIElkICovCisjZGVmaW5lIFJEX01UTF9CQzJfUENCX0lECQkweDcwCisKKyNpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKKwkjZGVmaW5lIE1BUlZFTExfQk9BUkRfSURfQkFTRQkJQUMzX01BUlZFTExfQk9BUkRfSURfQkFTRQorCSNkZWZpbmUgTVZfTUFYX01BUlZFTExfQk9BUkRfSUQJCUFDM19NQVJWRUxMX01BWF9CT0FSRF9JRAorCSNkZWZpbmUgTVZfTUFSVkVMTF9CT0FSRF9OVU0JCUFDM19NQVJWRUxMX0JPQVJEX05VTQorCSNkZWZpbmUgTVZfREVGQVVMVF9CT0FSRF9JRAkJREJfQUMzX0lECisjZWxpZiBkZWZpbmVkIENPTkZJR19CT0JDQVQyCisJI2RlZmluZSBNQVJWRUxMX0JPQVJEX0lEX0JBU0UJCUJDMl9NQVJWRUxMX0JPQVJEX0lEX0JBU0UKKwkjZGVmaW5lIE1WX01BWF9NQVJWRUxMX0JPQVJEX0lECQlCQzJfTUFSVkVMTF9NQVhfQk9BUkRfSUQKKwkjZGVmaW5lIE1WX01BUlZFTExfQk9BUkRfTlVNCQlCQzJfTUFSVkVMTF9CT0FSRF9OVU0KKwkjZGVmaW5lIE1WX0RFRkFVTFRfQk9BUkRfSUQJCURCX0RYX0JDMl9JRAorI2Vsc2UKKwkjZGVmaW5lIE1BUlZFTExfQk9BUkRfSURfQkFTRQkJQk9CS19NQVJWRUxMX0JPQVJEX0lEX0JBU0UKKwkjZGVmaW5lIE1WX01BWF9NQVJWRUxMX0JPQVJEX0lECQlCT0JLX01BUlZFTExfTUFYX0JPQVJEX0lECisJI2RlZmluZSBNVl9NQVJWRUxMX0JPQVJEX05VTQkJQk9CS19NQVJWRUxMX0JPQVJEX05VTQorCSNkZWZpbmUgTVZfREVGQVVMVF9CT0FSRF9JRAkJQk9CS19DRVRVU19EQl9JRAorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQm9iY2F0MiBCb2FyZHMKQEAgLTI3NCw2ICszMDksMjM4IEBACiAjZGVmaW5lIFJEX01UTF9CQzJfR1BQX1BPTF9NSUQJCTB4MAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJCUJvYmsgQm9hcmRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBCb2JLIENldHVzIEN1c3RvbWVyIGJvYXJkIC0gQmFzZWQgb24gQk9CSy1DRVRVUy1EQi05OERYNDIzNS0xMlhHCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFAwXzcJCTB4MjIyNDIyMjIKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDhfMTUJCTB4MTExMjIyMjIKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX01QUDE2XzIzCQkweDQ0NDQ0MDQ0CisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9NUFAyNF8zMQkJMHgxNDQ0NDQ0NAorI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfTVBQMzJfMzkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBCT0JLX0NFVFVTX0NVU1RPTUVSXzBfR1BQX09VVF9FTkFfTE9XCSh+KEJJVDAgfCBCSVQyIHwgQklUMyB8IEJJVDQgfCBCSVQ2IHwgQklUMTJcCisJCQkJCQkJIHwgQklUMTMgfCBCSVQxNiB8IEJJVDE3IHwgQklUMjAgfCBCSVQyOSAgfCBCSVQzMCkpCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfT1VUX0VOQV9NSUQJKH4oMCkpCisKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9PVVRfVkFMX0xPVwkoQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJCQl8IEJJVDEzIHwgQklUMTYgfCBCSVQxNyB8IEJJVDIwIHwgQklUMjkgIHwgQklUMzApCisjZGVmaW5lIEJPQktfQ0VUVVNfQ1VTVE9NRVJfMF9HUFBfT1VUX1ZBTF9NSUQJMHgwCisKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9QT0xfTE9XCQkweDAKKyNkZWZpbmUgQk9CS19DRVRVU19DVVNUT01FUl8wX0dQUF9QT0xfTUlECQkweDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQm9iSyBDYWVsdW0gQ3VzdG9tZXIgYm9hcmQgLSBCYXNlZCBvbiBCT0JLLUNBRUxVTS1EQi05OERYNDIwMy00OEcxMlhHCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfTVBQMF83CQkweDIyMjQyMjIyCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfTVBQOF8xNQkJMHgxMTEyMjIyMgorI2RlZmluZSBCT0JLX0NBRUxVTV9DVVNUT01FUl8xX01QUDE2XzIzCQkweDQ0NDQ0MDQ0CisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfTVBQMjRfMzEJCTB4MTQ0NDQ0NDQKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9NUFAzMl8zOQkJMHgwMDAwMDAwMQorCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9FTkFfTE9XCSh+KEJJVDAgfCBCSVQyIHwgQklUMyB8IEJJVDQgfCBCSVQ2IHwgQklUMTJcCisJCQkJCQkJIHwgQklUMTMgfCBCSVQxNiB8IEJJVDE3IHwgQklUMjAgfCBCSVQyOSAgfCBCSVQzMCkpCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9FTkFfTUlECSh+KDApKQorCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX09VVF9WQUxfTE9XCShCSVQwIHwgQklUMiB8IEJJVDMgfCBCSVQ0IHwgQklUNiB8IEJJVDEyXAorCQkJCQkJCXwgQklUMTMgfCBCSVQxNiB8IEJJVDE3IHwgQklUMjAgfCBCSVQyOSAgfCBCSVQzMCkKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfT1VUX1ZBTF9NSUQJMHgwCisKKyNkZWZpbmUgQk9CS19DQUVMVU1fQ1VTVE9NRVJfMV9HUFBfUE9MX0xPVwkJMHgwCisjZGVmaW5lIEJPQktfQ0FFTFVNX0NVU1RPTUVSXzFfR1BQX1BPTF9NSUQJCTB4MAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgIEJPQkstQ0VUVVMtREItOThEWDQyMzUtMTJYRyAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19NUFAwXzcJMHgyMjI0MjIyMgorI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX01QUDhfMTUJMHgxMTEyMjIyMgorI2RlZmluZSBEQl9EWF9CT0JLX0NFVFVTX01QUDE2XzIzCTB4NDQ0NDQwNDQKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19NUFAyNF8zMQkweDE0NDQ0NDQ0CisjZGVmaW5lIERCX0RYX0JPQktfQ0VUVVNfTVBQMzJfMzkJMHgwMDAwMDAwMQorCisjZGVmaW5lIERCX0RYX0JPQktfQ0VUVVNfTk9SX01QUDBfNwkweDQ0NDQ0NDQ0CisjZGVmaW5lIERCX0RYX0JPQktfQ0VUVVNfTk9SX01QUDhfMTUJMHgxMTEyMjI0NAorCisvKiBHUFBzCitNUFAjCU5BTUUJCQlJTi9PVVQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAJU1BJX01PU0kJCShvdXQpCisxCVNQSV9NSVNPCQkoaW4pCisyCVNQSV9TQ0sJCQkob3V0KQorMwlTUElfQ1MwbgkJKG91dCkKKzQJREVWX0NTblswXQkJKG91dCkgTkYgQ1MgKEJvb3QpCis1CVNEX0NNRAkJCShpbi9vdXQpCis2CVNEX0NMSwkJCShvdXQpCis3CVNEX0RbMF0JCQkoaW4vb3V0KQorOAlTRF9EWzFdCQkJKGluL291dCkKKzkJU0RfRFsyXQkJCShpbi9vdXQpCisxMAlTRF9EWzNdCQkJKGluL291dCkKKzExCVVBUlQxX1JYRAkJKGluKQorMTIJVUFSVDFfVFhECQkob3V0KQorMTMJSU5URVJSVVBUX09VVG4JCShvdXQpCisxNAlJMkNfU0NMCQkJKGluL291dCkKKzE1CUkyQ19TREEJCQkoaW4vb3V0KQorCisxNglERVZfT2VuX05GX1JlbgkJKG91dCkKKzE3CURFVl9DTEtfT1VUCQkob3V0KSBUZXN0IHBvaW50CisxOAlHUElPWzE4XQkJKGluL291dCkgSU5UX2luIC8gU0RfV1AgLyBWQzJfR1BQCisxOQlORl9SQm4JCQkoaW4pCisyMAlERVZfV0VuWzBdCQkob3V0KQorMjEJREVWX0FEWzBdCQkoaW4vb3V0KQorMjIJREVWX0FEWzFdCQkoaW4vb3V0KQorMjMJREVWX0FEWzJdCQkoaW4vb3V0KQorMjQJREVWX0FEWzNdCQkoaW4vb3V0KQorMjUJREVWX0FEWzRdCQkoaW4vb3V0KQorMjYJREVWX0FEWzVdCQkoaW4vb3V0KQorMjcJREVWX0FEWzZdCQkoaW4vb3V0KQorMjgJREVWX0FEWzddCQkoaW4vb3V0KQorMjkJTkZfQ0xFX0RFVl9BWzBdCQkob3V0KQorMzAJTkZfQUxFX0RFVl9BWzFdCQkob3V0KQorMzEJU0xWX1NNSV9NREMJCShpbikKKzMyCVNMVl9TTUlfTURJTwkJKGluL291dCkKKworKi8KKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX0VOQV9MT1cJKH4oQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKSkKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX0VOQV9NSUQJKH4oMCkpCisKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX1ZBTF9MT1cJKEJJVDAgfCBCSVQyIHwgQklUMyB8IEJJVDQgfCBCSVQ2IHwgQklUMTJcCisJCQkJCXwgQklUMTMgfCBCSVQxNiB8IEJJVDE3IHwgQklUMjAgfCBCSVQyOSAgfCBCSVQzMCkKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19HUFBfT1VUX1ZBTF9NSUQJMHgwCisKKyNkZWZpbmUgREJfRFhfQk9CS19DRVRVU19HUFBfUE9MX0xPVwkJMHgwCisjZGVmaW5lIERCX0RYX0JPQktfQ0VUVVNfR1BQX1BPTF9NSUQJCTB4MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgQk9CSy1DQUVMVU0tREItOThEWDQyMDMtNDhHMTJYRyAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX01QUDBfNwkweDIyMjQyMjIyCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX01QUDhfMTUJMHgxMTEyMjIyMgorI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9NUFAxNl8yMwkweDQ0NDQ0MDQ0CisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX01QUDI0XzMxCTB4MTQ0NDQ0NDQKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fTVBQMzJfMzkJMHgwMDAwMDAwMQorCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX05PUl9NUFAwXzcJMHg0NDQ0NDQ0NAorI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9OT1JfTVBQOF8xNQkweDExMTIyMjQ0CisKKy8qIEdQUHMKK01QUCMJTkFNRQkJCUlOL09VVAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMAlTUElfTU9TSQkJKG91dCkKKzEJU1BJX01JU08JCShpbikKKzIJU1BJX1NDSwkJCShvdXQpCiszCVNQSV9DUzBuCQkob3V0KQorNAlERVZfQ1NuWzBdCQkob3V0KSBORiBDUyAoQm9vdCkKKzUJU0RfQ01ECQkJKGluL291dCkKKzYJU0RfQ0xLCQkJKG91dCkKKzcJU0RfRFswXQkJCShpbi9vdXQpCis4CVNEX0RbMV0JCQkoaW4vb3V0KQorOQlTRF9EWzJdCQkJKGluL291dCkKKzEwCVNEX0RbM10JCQkoaW4vb3V0KQorMTEJVUFSVDFfUlhECQkoaW4pCisxMglVQVJUMV9UWEQJCShvdXQpCisxMwlJTlRFUlJVUFRfT1VUbgkJKG91dCkKKzE0CUkyQ19TQ0wJCQkoaW4vb3V0KQorMTUJSTJDX1NEQQkJCShpbi9vdXQpCisKKzE2CURFVl9PZW5fTkZfUmVuCQkob3V0KQorMTcJREVWX0NMS19PVVQJCShvdXQpIFRlc3QgcG9pbnQKKzE4CUdQSU9bMThdCQkoaW4vb3V0KSBJTlRfaW4gLyBTRF9XUCAvIFZDMl9HUFAKKzE5CU5GX1JCbgkJCShpbikKKzIwCURFVl9XRW5bMF0JCShvdXQpCisyMQlERVZfQURbMF0JCShpbi9vdXQpCisyMglERVZfQURbMV0JCShpbi9vdXQpCisyMwlERVZfQURbMl0JCShpbi9vdXQpCisyNAlERVZfQURbM10JCShpbi9vdXQpCisyNQlERVZfQURbNF0JCShpbi9vdXQpCisyNglERVZfQURbNV0JCShpbi9vdXQpCisyNwlERVZfQURbNl0JCShpbi9vdXQpCisyOAlERVZfQURbN10JCShpbi9vdXQpCisyOQlORl9DTEVfREVWX0FbMF0JCShvdXQpCiszMAlORl9BTEVfREVWX0FbMV0JCShvdXQpCiszMQlTTFZfU01JX01EQwkJKGluKQorMzIJU0xWX1NNSV9NRElPCQkoaW4vb3V0KQorCisqLworI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfT1VUX0VOQV9MT1cJKH4oQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKSkKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fR1BQX09VVF9FTkFfTUlECSh+KDApKQorCisjZGVmaW5lIERCX0RYX0JPQktfQ0FFTFVNX0dQUF9PVVRfVkFMX0xPVwkoQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQxMlwKKwkJCQkJfCBCSVQxMyB8IEJJVDE2IHwgQklUMTcgfCBCSVQyMCB8IEJJVDI5ICB8IEJJVDMwKQorI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfT1VUX1ZBTF9NSUQJMHgwCisKKyNkZWZpbmUgREJfRFhfQk9CS19DQUVMVU1fR1BQX1BPTF9MT1cJCTB4MAorI2RlZmluZSBEQl9EWF9CT0JLX0NBRUxVTV9HUFBfUE9MX01JRAkJMHgwCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgQk9CSy1MRVdJUy1SRC1MV1MtMTJYRy1BICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX01QUDBfNwkweDAwMDQyMjIyIC8qIDAtMzpTUEksIDQ6TkZfQ0VuLCA1OlNGUF9EYXRhLCA2OkRJQUcgTEVELCA3OlRXU0lfU0VMMSAqLworI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX01QUDhfMTUJMHgxMTAwMDAwMCAvKiA4OlRXU0lfU0VMMiw5OlNGUF9UWCwxMCxUTVBfSU5ULDExOklOSVRfRG9uZSwxMjpNUFAxMiwKKwkJCQkJCQkxMzpVU0JfT0MsMTQtMTU6STJDX1tTQ0xLLFNEQV0gKi8KKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19NUFAxNl8yMwkweDQ0NDQ0MDA0IC8qIDE2Ok5GX1JFbiwgMTc6VFdTSV9TRUwwLCAxODpOQSwgMTktMjM6TkZfW0J1c3ksV0VuLElPWzAsMSwyXV0gKi8KKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19NUFAyNF8zMQkweDE0NDQ0NDQ0IC8qIDI0LTMwOiBORl9JT1szLDQsNSw2LDddLE5GX0NMRSxORl9BTEUsIDMxOiBTTUlfTVNUX01EQyhTTUkpICovCisjZGVmaW5lIFJEX0RYX0JPQktfTEVXSVNfTVBQMzJfMzkJMHgwMDAwMDAwMSAvKiAzMjogU01JX01TVF9NRElPKFNNSSkgKi8KKworCisvKiBHUFBzCitNUFAjCU5BTUUJCQlJTi9PVVQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAJU1BJX1NJCQkJKGluL291dCkKKzEJU1BJX1NPCQkJKGluL291dCkKKzIJU1BJX1NDSwkJCShpbi9vdXQpCiszCVNQSV9DUzBuCQkJKGluL291dCkKKzQJTkZfQ0VuCQkJKGluL291dCkgTkFORCBGbGFzaAorNQlTRlBfRGF0YQkJCShpbikKKzYJRElBRyBMRUQJCQkob3V0KQorNwlUV1NJX1NFTDEJCShvdXQpCis4CVRXU0lfU0VMMgkJKG91dCkKKzkJU0ZQX1RYX0RJUwkJKG91dCkKKzEwCVRNUF9JTlQJCQkoaW4pCisxMQlJTklUX0RvbmUJCShpbikKKzEyCU1QUDEyCQkJKE4vQSkKKzEzCVVTQl9PQwkJCShpbikKKzE0CUkyQ19TQ0xLCQkJKG91dCkKKzE1CUkyQ19TREEJCQkoaW4vb3V0KQorCisxNglORl9SRW4JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzE3CVRXU0lfU0VMMAkJKG91dCkKKzE4CU5BCQkJKE5BKQorMTkJTkZfQnVzeQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjAJTkZfV0VuCQkJKGluL291dClOQU5EIEZsYXNoCisyMQlORl9JT1swXQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjIJTkZfSU9bMV0JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzIzCU5GX0lPWzJdCQkJKGluL291dClOQU5EIEZsYXNoCisyNAlORl9JT1szXQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjUJTkZfSU9bNF0JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzI2CU5GX0lPWzVdCQkJKGluL291dClOQU5EIEZsYXNoCisyNwlORl9JT1s2XQkJCShpbi9vdXQpTkFORCBGbGFzaAorMjgJTkZfSU9bN10JCQkoaW4vb3V0KU5BTkQgRmxhc2gKKzI5CU5GX0NMRQkJCShpbi9vdXQpTkFORCBGbGFzaAorMzAJTkZfQUxFCQkJKGluL291dClOQU5EIEZsYXNoCiszMQlTTUlfTVNUX01EQwkJKG91dCkKKzMyCVNNSV9NU1RfTURJTwkJKGluL291dCkKKworKi8KKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX0VOQV9MT1cJKH4oQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQ3IHwgQklUOFwKKwkJCQkJfCBCSVQ5IHwgQklUMTQgfCBCSVQxNyB8IEJJVDMxKSkKKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX0VOQV9NSUQJKH4oMCkpCisKKyNkZWZpbmUgUkRfRFhfQk9CS19MRVdJU19HUFBfT1VUX1ZBTF9MT1cJKH4oQklUMCB8IEJJVDIgfCBCSVQzIHwgQklUNCB8IEJJVDYgfCBCSVQ5XAorCQkJCQl8IEJJVDE0IHwgQklUMTcgfCBCSVQzMSkpCisjZGVmaW5lIFJEX0RYX0JPQktfTEVXSVNfR1BQX09VVF9WQUxfTUlECTB4MAorCisjZGVmaW5lIFJEX0RYX0JPQktfTEVXSVNfR1BQX1BPTF9MT1cJCTB4MAorI2RlZmluZSBSRF9EWF9CT0JLX0xFV0lTX0dQUF9QT0xfTUlECQkweDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlBbGxleUNhdDMgQm9hcmRzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDI0LDggKzY5MSw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICBSRF9EWF8yWFhHXzJYR19BQzMgKE1UTDIpICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfTVBQMF83CQkJCVJEX01UTF80WEdfQUMzX01QUDBfNwotI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX01QUDhfMTUJCQkJUkRfTVRMXzRYR19BQzNfTVBQOF8xNQorI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX01QUDBfNwkJCVJEX01UTF80WEdfQUMzX01QUDBfNworI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX01QUDhfMTUJCQlSRF9NVExfNFhHX0FDM19NUFA4XzE1CiAjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfTVBQMTZfMjMJCQlSRF9NVExfNFhHX0FDM19NUFAxNl8yMwogI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX01QUDI0XzMxCQkJUkRfTVRMXzRYR19BQzNfTVBQMjRfMzEKICNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19NUFAzMl8zOQkJCVJEX01UTF80WEdfQUMzX01QUDMyXzM5CkBAIC00MzQsOCArNzAxLDggQEAKICNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19HUFBfT1VUX0VOQV9NSUQJCVJEX01UTF80WEdfQUMzX0dQUF9PVVRfRU5BX01JRAogI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX0dQUF9PVVRfVkFMX0xPVwkJUkRfTVRMXzRYR19BQzNfR1BQX09VVF9WQUxfTE9XCiAjZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfR1BQX09VVF9WQUxfTUlECQlSRF9NVExfNFhHX0FDM19HUFBfT1VUX1ZBTF9NSUQKLSNkZWZpbmUgUkRfTVRMXzJYWEdfMlhHX0FDM19HUFBfUE9MX0xPVwkJCVJEX01UTF80WEdfQUMzX0dQUF9QT0xfTE9XCi0jZGVmaW5lIFJEX01UTF8yWFhHXzJYR19BQzNfR1BQX1BPTF9NSUQJCQlSRF9NVExfNFhHX0FDM19HUFBfUE9MX01JRAorI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX0dQUF9QT0xfTE9XCQlSRF9NVExfNFhHX0FDM19HUFBfUE9MX0xPVworI2RlZmluZSBSRF9NVExfMlhYR18yWEdfQUMzX0dQUF9QT0xfTUlECQlSRF9NVExfNFhHX0FDM19HUFBfUE9MX01JRAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgIERCLVhDMy0yNEc0R18yWEdfQUMzICAoUkRfTUlTTCkgICovCkBAIC00NjksNSArNzM2LDU2IEBACiAjZGVmaW5lIFJEX01UTF8yNEdfQUMzX0dQUF9QT0xfTE9XCQkJUkRfTVRMXzRYR19BQzNfR1BQX1BPTF9MT1cKICNkZWZpbmUgUkRfTVRMXzI0R19BQzNfR1BQX1BPTF9NSUQJCQlSRF9NVExfNFhHX0FDM19HUFBfUE9MX01JRAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEFybWFkYVhQIEJvYXJkcyA6IG9ubHkgZm9yIExpbnV4IHVzYWdlIChBWFAgZmFtaWx5IGlzIHNoYXJlZCB3aXRoIE1TWVMgaW4gTFNQKSAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKiovCisvKiBEQi03ODQ2MC1BTUMgICAgICovCisvKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDBfNwkJCTB4MTExMTExMTEKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDhfMTUJCQkweDAwMDAxMTExCisjZGVmaW5lIERCXzc4WDYwX0FNQ19NUFAxNl8yMwkJCTB4MDAwMDAwMDAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDI0XzMxCQkJMHgwMDAwMDAwMAorI2RlZmluZSBEQl83OFg2MF9BTUNfTVBQMzJfMzkJCQkweDExMTEwMDAwCisjZGVmaW5lIERCXzc4WDYwX0FNQ19NUFA0MF80NwkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX01QUDQ4XzU1CQkJMHgwMDAwMTExMworI2RlZmluZSBEQl83OFg2MF9BTUNfTVBQNTZfNjMJCQkweDExMTExMTEwCisjZGVmaW5lIERCXzc4WDYwX0FNQ19NUFA2NF82NwkJCTB4MDAwMDAxMTEKKworLyogR1BQcworTVBQIwlOQU1FCQlJTi9PVVQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzE2CU1CX0lOVCMJCUlOCisxNwlQaHkxX0lOVCMJSU4KKzE4CVBoeTJfSU5UIwlJTgorMTkJQnJkX0xlZF8wCUlOIChmb3IgbmV4dCBib2FyZCkKKzIxCUJyZF9MZWRfMQlPVVQKKzIzCUJyZF9MZWRfMglPVVQKKzI5CUJyZF9MZWRfMwlPVVQKKzMwCUJyZF9MZWRfNAlPVVQKKzM0CURiZ19KUDAJCUlOCiszNQlEYmdfSlAxCQlJTgorNDAJRGJnX0pQMgkJSU4KKzQxCURiZ19KUDMJCUlOCis0MglEYmdfSlA0CQlJTgorNTMJNyBTZWdtZW50IDAJT1VUCis1NAk3IFNlZ21lbnQgMQlPVVQKKzU1CTcgU2VnbWVudCAyCU9VVAorNTYJNyBTZWdtZW50IDMJT1VUCisqLworCisjZGVmaW5lIERCXzc4WDYwX0FNQ19HUFBfT1VUX0VOQV9MT1cJCSh+KEJJVDE5IHwgQklUMjEgfCBCSVQyMiB8IEJJVDIzIHwgQklUMjkgfCBCSVQzMCkpCisjZGVmaW5lIERCXzc4WDYwX0FNQ19HUFBfT1VUX0VOQV9NSUQJCSh+KEJJVDIxIHwgQklUMjIgfCBCSVQyMyB8IEJJVDI0KSkKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9PVVRfRU5BX0hJR0gJCSh+KDB4MCkpCisKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9PVVRfVkFMX0xPVwkJMHgwCisjZGVmaW5lIERCXzc4WDYwX0FNQ19HUFBfT1VUX1ZBTF9NSUQJCTB4MAorI2RlZmluZSBEQl83OFg2MF9BTUNfR1BQX09VVF9WQUxfSElHSAkJMHgwCisKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9QT0xfTE9XCQkweDAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9QT0xfTUlECQkweDAKKyNkZWZpbmUgREJfNzhYNjBfQU1DX0dQUF9QT0xfSElHSAkJMHgwCisKICNlbmRpZiAvKiBfX0lOQ212Qm9hcmRFbnZTcGVjaCAqLwogCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jcHUvbXZDcHUuYyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2NwdS9tdkNwdS5jCmluZGV4IDYzY2Y3NmEuLmE3YTE0M2YgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2NwdS9tdkNwdS5jCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2NwdS9tdkNwdS5jCkBAIC05NiwxNyArOTYsNDIgQEAKIHsKIAlNVl9VMzIJCQlpZHg7CiAJTVZfVTMyCQkJZnJlcU1oejsKKwlNVl9VMzIJCQljcHVDbGtbXSA9IE1WX0NQVV9DTEtfVEJMX0FYUDsKIAlNVl9DUFVERFJfTU9ERQliYzJDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JDMjsKIAlNVl9DUFVERFJfTU9ERQlhYzNDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0FDMzsKKwlNVl9DUFVERFJfTU9ERQlib2JrQ2V0dXNDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JPQktfQ0VUVVM7CisJTVZfQ1BVRERSX01PREUJYm9ia0NhZWx1bUNsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQk9CS19DQUVMVU07CiAJTVZfVTE2CQkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0JTVZfVTMyCQkJc2FyMiA9IE1WX0RGWF9SRUdfUkVBRChERlhfREVWSUNFX1NBUl9SRUcoMSkpOworCU1WX1UzMgkJCXNhcjI7CisKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKSB7CisJCWlkeCA9IE1TQVJfQ1BVX0NMS19JRFgoTVZfUkVHX1JFQUQoTVBQX1NBTVBMRV9BVF9SRVNFVCgwKSksCisJCQkJICAgICAgIE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQoMSkpKTsKKwkJcmV0dXJuIGNwdUNsa1tpZHhdICogMTAwMDAwMDsKKwl9CisKKwlzYXIyID0gTVZfREZYX1JFR19SRUFEKERGWF9ERVZJQ0VfU0FSX1JFRygxKSk7CiAKIAlpZHggPSBNU0FSX0NQVV9ERFJfQ0xLKDAsIHNhcjIpOwogCWlmIChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpCiAJCWZyZXFNaHogPSBiYzJDbG9ja1JhdGlvVGJsW2lkeF0uY3B1RnJlcSAqIDEwMDAwMDA7CiAJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpCiAJCWZyZXFNaHogPSBhYzNDbG9ja1JhdGlvVGJsW2lkeF0uY3B1RnJlcSAqIDEwMDAwMDA7Ci0JZWxzZQorCWVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCQlzd2l0Y2ggKG12Q3RybE1vZGVsR2V0KCkpIHsKKwkJY2FzZSBNVl9CT0JLX0NFVFVTXzk4RFg0MjM1X0RFVl9JRDoKKwkJY2FzZSBNVl9CT0JLX0xFV0lTXzk4RFg4MjEyX0RFVl9JRDoKKwkJCS8qIExFV0lTIFJEIGJvYXJkJ3MgQ1BVIGZyZXEgc2V0dGluZyBpcyB0aGUgc2FtZSBhcyBDRVRVUyBib2FyZCAqLworCQkJZnJlcU1oeiA9IGJvYmtDZXR1c0Nsb2NrUmF0aW9UYmxbaWR4XS5jcHVGcmVxICogMTAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIE1WX0JPQktfQ0FFTFVNXzk4RFg0MjAzX0RFVl9JRDoKKwkJCWZyZXFNaHogPSBib2JrQ2FlbHVtQ2xvY2tSYXRpb1RibFtpZHhdLmNwdUZyZXEgKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltdk9zUHJpbnRmKCJFUlJPUjogVW5rbm93biBEZXZpY2VJRCAlZCwgQ1BVIGZyZXEgZ2V0IGZhaWxlZFxuIiwgbXZDdHJsTW9kZWxHZXQoKSk7CisJCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwkJfQorCX0gZWxzZQogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAogCXJldHVybiBmcmVxTWh6OwpAQCAtMTM0LDYgKzE1OSw4IEBACiAJTVZfVTMyCQkJZnJlcU1oejsKIAlNVl9DUFVERFJfTU9ERQliYzJDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JDMjsKIAlNVl9DUFVERFJfTU9ERQlhYzNDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0FDMzsKKwlNVl9DUFVERFJfTU9ERQlib2JrQ2V0dXNDbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JPQktfQ0VUVVM7CisJTVZfQ1BVRERSX01PREUJYm9ia0NhZWx1bUNsb2NrUmF0aW9UYmxbOF0gPSBNVl9DUFVfRERSX0NMS19UQkxfQk9CS19DQUVMVU07CiAJTVZfVTE2CQkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7CiAJTVZfVTMyCQkJc2FyMiA9IE1WX0RGWF9SRUdfUkVBRChERlhfREVWSUNFX1NBUl9SRUcoMSkpOwogCkBAIC0xNDIsNyArMTY5LDIxIEBACiAJCWZyZXFNaHogPSBiYzJDbG9ja1JhdGlvVGJsW2lkeF0uZGRyRnJlcSAqIDEwMDAwMDA7CiAJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpCiAJCWZyZXFNaHogPSBhYzNDbG9ja1JhdGlvVGJsW2lkeF0uZGRyRnJlcSAqIDEwMDAwMDA7Ci0JZWxzZQorCWVsc2UgaWYgKGZhbWlseSA9PSBNVl9CT0JLX0RFVl9JRCkgeworCQlzd2l0Y2ggKG12Q3RybE1vZGVsR2V0KCkpIHsKKwkJY2FzZSBNVl9CT0JLX0NFVFVTXzk4RFg0MjM1X0RFVl9JRDoKKwkJY2FzZSBNVl9CT0JLX0xFV0lTXzk4RFg4MjEyX0RFVl9JRDoKKwkJCS8qIExFV0lTIFJEIGJvYXJkJ3MgQ1BVIGZyZXEgc2V0dGluZyBpcyB0aGUgc2FtZSBhcyBDRVRVUyBib2FyZCAqLworCQkJZnJlcU1oeiA9IGJvYmtDZXR1c0Nsb2NrUmF0aW9UYmxbaWR4XS5kZHJGcmVxICogMTAwMDAwMDsKKwkJCWJyZWFrOworCQljYXNlIE1WX0JPQktfQ0FFTFVNXzk4RFg0MjAzX0RFVl9JRDoKKwkJCWZyZXFNaHogPSBib2JrQ2FlbHVtQ2xvY2tSYXRpb1RibFtpZHhdLmRkckZyZXEgKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltdk9zUHJpbnRmKCJFUlJPUjogVW5rbm93biBEZXZpY2VJRCAlZCwgRERSIGZyZXEgZ2V0IGZhaWxlZFxuIiwgbXZDdHJsTW9kZWxHZXQoKSk7CisJCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwkJfQorCX0gZWxzZQogCQlyZXR1cm4gMHhGRkZGRkZGRjsKIAogCXJldHVybiBmcmVxTWh6OwpAQCAtMTcwLDIwICsyMTEsMzcgQEAKIAlNVl9VMzIJCWZyZXFNaHo7CiAJTVZfQ1BVRERSX01PREUJYmMyQ2xvY2tSYXRpb1RibFs4XSA9IE1WX0NQVV9ERFJfQ0xLX1RCTF9CQzI7CiAJTVZfQ1BVRERSX01PREUJYWMzQ2xvY2tSYXRpb1RibFs4XSA9IE1WX0NQVV9ERFJfQ0xLX1RCTF9BQzM7CisJTVZfQ1BVRERSX01PREUJYm9ia0NldHVzQ2xvY2tSYXRpb1RibFs4XSA9IE1WX0NQVV9ERFJfQ0xLX1RCTF9CT0JLX0NFVFVTOworCU1WX0NQVUREUl9NT0RFCWJvYmtDYWVsdW1DbG9ja1JhdGlvVGJsWzhdID0gTVZfQ1BVX0REUl9DTEtfVEJMX0JPQktfQ0FFTFVNOwogCU1WX1UxNgkJZmFtaWx5ID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCk7Ci0JTVZfVTMyCQlzYXIyID0gTVZfREZYX1JFR19SRUFEKERGWF9ERVZJQ0VfU0FSX1JFRygxKSk7CisJTVZfVTMyCQlzYXIyOworCisJaWYgKGZhbWlseSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCXJldHVybiBBWFBfUExMX0lOX0NMSzsKKworCXNhcjIgPSBNVl9ERlhfUkVHX1JFQUQoREZYX0RFVklDRV9TQVJfUkVHKDEpKTsKIAogCWlkeCA9IE1TQVJfQ1BVX0REUl9DTEsoMCwgc2FyMik7Ci0Jc3dpdGNoIChmYW1pbHkpIHsKLQljYXNlIE1WX0JPQkNBVDJfREVWX0lEOgorCWlmIChmYW1pbHkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpCiAJCWZyZXFNaHogPSBiYzJDbG9ja1JhdGlvVGJsW2lkeF0ucGxsQ2xrICogMTAwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBNVl9BTExFWUNBVDNfREVWX0lEOgorCWVsc2UgaWYgKGZhbWlseSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKQogCQlmcmVxTWh6ID0gYWMzQ2xvY2tSYXRpb1RibFtpZHhdLnBsbENsayAqIDEwMDAwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJZWxzZSBpZiAoZmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CisJCXN3aXRjaCAobXZDdHJsTW9kZWxHZXQoKSkgeworCQljYXNlIE1WX0JPQktfQ0VUVVNfOThEWDQyMzVfREVWX0lEOgorCQljYXNlIE1WX0JPQktfTEVXSVNfOThEWDgyMTJfREVWX0lEOgorCQkJLyogTEVXSVMgUkQgYm9hcmQncyBDUFUgZnJlcSBzZXR0aW5nIGlzIHRoZSBzYW1lIGFzIENFVFVTIGJvYXJkICovCisJCQlmcmVxTWh6ID0gYm9ia0NldHVzQ2xvY2tSYXRpb1RibFtpZHhdLnBsbENsayAqIDEwMDAwMDA7CisJCQlicmVhazsKKwkJY2FzZSBNVl9CT0JLX0NBRUxVTV85OERYNDIwM19ERVZfSUQ6CisJCQlmcmVxTWh6ID0gYm9ia0NhZWx1bUNsb2NrUmF0aW9UYmxbaWR4XS5wbGxDbGsgKiAxMDAwMDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltdk9zUHJpbnRmKCJFUlJPUjogVW5rbm93biBEZXZpY2VJRCAlZCwgUExMIGZyZXEgZ2V0IGZhaWxlZFxuIiwgbXZDdHJsTW9kZWxHZXQoKSk7CisJCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwkJfQorCX0gZWxzZQogCQlyZXR1cm4gMHhGRkZGRkZGRjsKLQl9CiAKIAlyZXR1cm4gZnJlcU1oejsKIH0KQEAgLTIwMCw2ICsyNTgsMTAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9VMzIgbXZDcHVMMkNsa0dldChNVl9WT0lEKQogeworCU1WX1UzMiBpZHg7CisJTVZfVTMyIGZyZXFNaHosIGwyRnJlcU1oejsKKwlNVl9DUFVfQVJNX0NMS19SQVRJTyBjbG9ja1JhdGlvVGJsW10gPSBNVl9ERFJfTDJfQ0xLX1JBVElPX1RCTF9BWFA7CisKIC8qCU1WX1UzMiBpZHg7CiAJTVZfVTMyIGZyZXFNaHo7CiAJTVZfQ1BVRERSX01PREUgY2xvY2tSYXRpb1RibFs4XSA9IE1WX0NQVV9ERFJfQ0xLX1RCTDsKQEAgLTIwNyw3ICsyNjksMjQgQEAKIAogCWlkeCA9IE1TQVJfQ1BVX0REUl9DTEsoMCwgc2FyMik7CiAJZnJlcU1oeiA9IGNsb2NrUmF0aW9UYmxbaWR4XS5jcHVGcmVxICogMTAwMDAwMDsgKi8KLQlyZXR1cm4gMjAwMDAwMDAwOworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSAhPSBNVl83ODQ2MF9ERVZfSUQpCisJCXJldHVybiAyMDAwMDAwMDA7CisKKwlpZHggPSBNU0FSX0REUl9MMl9DTEtfUkFUSU9fSURYKE1WX1JFR19SRUFEKE1QUF9TQU1QTEVfQVRfUkVTRVQoMCkpLAorCQkJCQlNVl9SRUdfUkVBRChNUFBfU0FNUExFX0FUX1JFU0VUKDEpKSk7CisKKwlpZiAoY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJjcHUgIT0gMCkgeworCQlmcmVxTWh6ID0gbXZDcHVQY2xrR2V0KCkgLyAxMDAwMDAwOwkvKiBDUFUgZnJlcSAqLworCQlmcmVxTWh6ICo9IGNsb2NrUmF0aW9UYmxbaWR4XS52Y28yY3B1OwkvKiBWQ08gZnJlcSAqLworCQlsMkZyZXFNaHogPSBmcmVxTWh6IC8gY2xvY2tSYXRpb1RibFtpZHhdLnZjbzJsMmM7CisJCS8qIHJvdW5kIHVwIHRvIGludGVnZXIgTUh6ICovCisJCWlmICgoKGZyZXFNaHogJSBjbG9ja1JhdGlvVGJsW2lkeF0udmNvMmwyYykgKiAxMCAvIGNsb2NrUmF0aW9UYmxbaWR4XS52Y28ybDJjKSA+PSA1KQorCQkJbDJGcmVxTWh6Kys7CisKKwkJcmV0dXJuIGwyRnJlcU1oeiAqIDEwMDAwMDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIChNVl9VMzIpLTE7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZBZGRyRGVjLmMgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkFkZHJEZWMuYwppbmRleCBhMzRkYmE0Li43MTE1MzFmIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkFkZHJEZWMuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkFkZHJEZWMuYwpAQCAtOTEsNyArOTEsOCBAQAogI2VuZGlmCiAKIC8qIERlZmF1bHQgQXR0cmlidXRlcyBhcnJheSAqLwotTVZfVEFSR0VUX0FUVFJJQiBtdlRhcmdldERlZmF1bHRzQXJyYXlbXSA9IFRBUkdFVFNfREVGX0FSUkFZOworTVZfVEFSR0VUX0FUVFJJQiBtdlRhcmdldERlZmF1bHRzQXJyYXlNc3lzW10gPSBUQVJHRVRTX0RFRl9BUlJBWTsKK01WX1RBUkdFVF9BVFRSSUIgbXZUYXJnZXREZWZhdWx0c0FycmF5QXhwW10gPSBUQVJHRVRTX0RFRl9BUlJBWV9BWFA7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12Q3RybEF0dHJpYkdldCAtCkBAIC0xMDcsNiArMTA4LDEzIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12Q3RybEF0dHJpYkdldChNVl9UQVJHRVQgdGFyZ2V0LCBNVl9UQVJHRVRfQVRUUklCICp0YXJnZXRBdHRyaWIpCiB7CisJTVZfVEFSR0VUX0FUVFJJQiAqbXZUYXJnZXREZWZhdWx0c0FycmF5OworCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5QXhwOworCWVsc2UKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5TXN5czsKKwogCXRhcmdldEF0dHJpYi0+YXR0cmliID0gbXZUYXJnZXREZWZhdWx0c0FycmF5W01WX0NIQU5HRV9CT09UX0NTKHRhcmdldCldLmF0dHJpYjsKIAl0YXJnZXRBdHRyaWItPnRhcmdldElkID0gbXZUYXJnZXREZWZhdWx0c0FycmF5W01WX0NIQU5HRV9CT09UX0NTKHRhcmdldCldLnRhcmdldElkOwogCkBAIC0xMTUsNiArMTIzLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBtdkN0cmxBdHRyaWJTZXQoTVZfVEFSR0VUIHRhcmdldCwgTVZfVEFSR0VUX0FUVFJJQiAqdGFyZ2V0QXR0cmliKQogeworCU1WX1RBUkdFVF9BVFRSSUIgKm12VGFyZ2V0RGVmYXVsdHNBcnJheTsKKworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCW12VGFyZ2V0RGVmYXVsdHNBcnJheSA9IG12VGFyZ2V0RGVmYXVsdHNBcnJheUF4cDsKKwllbHNlCisJCW12VGFyZ2V0RGVmYXVsdHNBcnJheSA9IG12VGFyZ2V0RGVmYXVsdHNBcnJheU1zeXM7CisKIAltdlRhcmdldERlZmF1bHRzQXJyYXlbTVZfQ0hBTkdFX0JPT1RfQ1ModGFyZ2V0KV0uYXR0cmliICA9IHRhcmdldEF0dHJpYi0+YXR0cmliOwogCW12VGFyZ2V0RGVmYXVsdHNBcnJheVtNVl9DSEFOR0VfQk9PVF9DUyh0YXJnZXQpXS50YXJnZXRJZD0gdGFyZ2V0QXR0cmliLT50YXJnZXRJZDsKIApAQCAtMTM3LDYgKzE1MiwxMyBAQAogewogCU1WX1RBUkdFVCB0YXJnZXQ7CiAJTVZfVEFSR0VUIHg7CisJTVZfVEFSR0VUX0FUVFJJQiAqbXZUYXJnZXREZWZhdWx0c0FycmF5OworCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5QXhwOworCWVsc2UKKwkJbXZUYXJnZXREZWZhdWx0c0FycmF5ID0gbXZUYXJnZXREZWZhdWx0c0FycmF5TXN5czsKKwogCWZvciAodGFyZ2V0ID0gU0RSQU1fQ1MwOyB0YXJnZXQgPCBNQVhfVEFSR0VUUzsgdGFyZ2V0KyspIHsKIAkJeCA9IE1WX0NIQU5HRV9CT09UX0NTKHRhcmdldCk7CiAJCWlmICgobXZUYXJnZXREZWZhdWx0c0FycmF5W3hdLmF0dHJpYiA9PSB0YXJnZXRBdHRyaWItPmF0dHJpYikgJiYKQEAgLTE2NSw2ICsxODcsMTMgQEAKIHsKIAlNVl9UQVJHRVQgdGFyZ2V0OwogCU1WX1RBUkdFVCB4OworCU1WX1RBUkdFVF9BVFRSSUIgKm12VGFyZ2V0RGVmYXVsdHNBcnJheTsKKworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCW12VGFyZ2V0RGVmYXVsdHNBcnJheSA9IG12VGFyZ2V0RGVmYXVsdHNBcnJheUF4cDsKKwllbHNlCisJCW12VGFyZ2V0RGVmYXVsdHNBcnJheSA9IG12VGFyZ2V0RGVmYXVsdHNBcnJheU1zeXM7CisKIAlmb3IgKHRhcmdldCA9IFNEUkFNX0NTMDsgdGFyZ2V0IDwgTUFYX1RBUkdFVFM7IHRhcmdldCsrKSB7CiAJCXggPSBNVl9DSEFOR0VfQk9PVF9DUyh0YXJnZXQpOwogCQlpZiAoKG12VGFyZ2V0RGVmYXVsdHNBcnJheVt4XS5hdHRyaWIgPT0gdW5pdFdpbkluZm8tPmF0dHJpYikgJiYKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5jCmluZGV4IGJlMTYxNmQuLjE3Y2VjMjcgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmMKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuYwpAQCAtODksNiArODksOCBAQAogI2luY2x1ZGUgImRkcjJfMy9tdkRyYW1JZlJlZ3MuaCIKIAogI2luY2x1ZGUgInR3c2kvbXZUd3NpU3BlYy5oIgorI2luY2x1ZGUgImRldmljZS9tdkRldmljZS5oIgorI2luY2x1ZGUgIm12RGV2aWNlSWQuaCIKIAogLyogZGVmaW5lcyAgKi8KICN1bmRlZiBNVl9ERUJVRwpAQCAtMTAxLDIyICsxMDMsNjIgQEAKIC8qIE1TWVMgZmFtaWx5IGxpbmVhciBpZCAqLwogI2RlZmluZSBNVl9NU1lTX0JDMl9JTkRFWAkJMAogI2RlZmluZSBNVl9NU1lTX0FDM19JTkRFWAkJMQotI2RlZmluZSBNVl9NU1lTX0lOREVYX01BWAkJMgorI2RlZmluZSBNVl83ODQ2MF9JTkRFWAkJCTIKKyNkZWZpbmUgTVZfTVNZU19CT0JLX0lOREVYCQkJMworI2RlZmluZSBNVl9NU1lTX0FYUF9JTkRFWF9NQVgJCTQKIAotTVZfVU5JVF9JRCBtdkN0cmxTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01WX01TWVNfSU5ERVhfTUFYXSA9IHsKLS8qCQkJICAgIEJDMgkJQUMzICovCi0vKiBEUkFNX1VOSVRfSUQgICAgICAgICAqLyB7IDEsCQkxLCB9LAotLyogUEVYX1VOSVRfSUQgICAgICAgICAgKi8geyAxLAkJMSwgfSwKLS8qIEVUSF9HSUdfVU5JVF9JRCAgICAgICovIHsgMiwJCTIsIH0sCi0vKiBYT1JfVU5JVF9JRCAgICAgICAgICAqLyB7IDEsCQkxLCB9LAotLyogVUFSVF9VTklUX0lEICAgICAgICAgKi8geyAyLAkJMiwgfSwKLS8qIFNQSV9VTklUX0lEICAgICAgICAgICovIHsgMiwJCTEsIH0sCi0vKiBTRElPX1VOSVRfSUQgICAgICAgICAqLyB7IDEsCQkxLCB9LAotLyogSTJDX1VOSVRfSUQgICAgICAgICAgKi8geyAyLAkJMiwgfSwKLS8qIFVTQl9VTklUX0lEICAgICAgICAgICovIHsgMCwJCTEsIH0sCi0vKiBVU0IzX1VOSVRfSUQgICAgICAgICAqLyB7IDAsCQkwLCB9LAorTVZfVU5JVF9JRCBtdkN0cmxTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01WX01TWVNfQVhQX0lOREVYX01BWF0gPSB7CisvKgkJCSAgICAgQkMyCUFDMwkJNzg0NjAJCUJPQksqLworLyogRFJBTV9VTklUX0lECQkqLyB7IDEsCQkxLAkJMSwJCTEsfSwKKy8qIFBFWF9VTklUX0lECQkqLyB7IDEsCQkxLAkJNCwJCTEsfSwKKy8qIEVUSF9HSUdfVU5JVF9JRAkqLyB7IDIsCQkyLAkJNCwJCTIsfSwKKy8qIFhPUl9VTklUX0lECQkqLyB7IDEsCQkxLAkJNCwJCTEsfSwKKy8qIFVBUlRfVU5JVF9JRAkJKi8geyAyLAkJMiwJCTQsCQkyLH0sCisvKiBTUElfVU5JVF9JRAkJKi8geyAxLAkJMSwJCTIsCQkxLH0sCisvKiBTRElPX1VOSVRfSUQJCSovIHsgMSwJCTEsCQkxLAkJMSx9LAorLyogSTJDX1VOSVRfSUQJCSovIHsgMiwJCTIsCQkyLAkJMix9LAorLyogVVNCX1VOSVRfSUQJCSovIHsgMCwJCTEsCQkzLAkJMSx9LAorLyogVVNCM19VTklUX0lECQkqLyB7IDAsCQkwLAkJMCwJCTAsfSwKKy8qIE5BTkRfVU5JVF9JRAkJKi8geyAxLAkJMSwJCTEsCQkxLH0sCisvKiBERVZCVVNfVU5JVF9JRAkqLyB7IDAsCQkwLAkJMCwJCTAsfSwKKy8qIElETUFfVU5JVF9JRAkJKi8geyAwLAkJMCwJCTQsCQkwLH0sCisvKiBTQVRBX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkyLAkJMCx9LAorLyogVERNX1VOSVRfSUQJCSovIHsgMCwJCTAsCQkxLAkJMCx9LAorLyogQ0VTQV9VTklUX0lECQkqLyB7IDAsCQkwLAkJMiwJCTAsfSwKKy8qIEFVRElPX1VOSVRfSUQJKi8geyAwLAkJMCwJCTAsCQkwLH0sCisvKiBUU19VTklUX0lECQkqLyB7IDAsCQkwLAkJMCwJCTAsfSwKKy8qIFhQT05fVU5JVF9JRAkJKi8geyAwLAkJMCwJCTAsCQkwLH0sCisvKiBCTV9VTklUX0lECQkqLyB7IDAsCQkwLAkJMSwJCTAsfSwKKy8qIFBOQ19VTklUX0lECQkqLyB7IDAsCQkwLAkJMSwJCTAsfSwKIH07CiAKK01WX1UzMiAgbXZEZXYyQ3B1TWFwVGFibGVbMjBdWzJdID0geworLyoJRGV2IElECQkJY29yZXMjICAgKi8KKwl7TVZfQk9CQ0FUMl9ERVZfSUQsCQkyfSwKKwl7TVZfQk9CS19DRVRVU185OERYNDIzNV9ERVZfSUQsCQkyfSwKKwl7TVZfQk9CS19DQUVMVU1fOThEWDQyMDNfREVWX0lELAkyfSwKKwl7TVZfQk9CS19MRVdJU185OERYODIxMl9ERVZfSUQsCTJ9LAorCXtNVl9BTExFWUNBVDNfOThEWDMzMzZfREVWX0lELAkyfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgzMzM1X0RFVl9JRCwJMn0sCisJe01WX0FMTEVZQ0FUM185OERYMzMzNF9ERVZfSUQsCTJ9LAorCXtNVl9BTExFWUNBVDNfOThEWDMzMzNfREVWX0lELAkyfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgxMjMzX0RFVl9JRCwJMX0sCisJe01WX0FMTEVZQ0FUM185OERYMTIzNV9ERVZfSUQsCTF9LAorCXtNVl9BTExFWUNBVDNfOThEWDMyMzZfREVWX0lELAkxfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgzMjM1X0RFVl9JRCwJMX0sCisJe01WX0FMTEVZQ0FUM185OERYMzIzNF9ERVZfSUQsCTF9LAorCXtNVl9BTExFWUNBVDNfOThEWDMyMzNfREVWX0lELAkxfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFhIMzMzX0RFVl9JRCwJMn0sCisJe01WX0FMTEVZQ0FUM185OERYMTMzM19ERVZfSUQsCTJ9LAorCXtNVl9BTExFWUNBVDNfOThEWDEzMzVfREVWX0lELAkyfSwKKwl7TVZfQUxMRVlDQVQzXzk4RFgxMzM2X0RFVl9JRCwJMn0sCisJe01WXzc4NDYwX0RFVl9JRCwJCTR9LAorCXtNVl9NQVhfREVWX0lELAkJCTB9LAorfTsKKworCisKKwogc3RhdGljIE1WX1UzMiBtdkN0cmxEZXZJZEluZGV4R2V0KE1WX1UzMiBkZXZJZCkKIHsKIAlNVl9VMzIgaW5kZXg7CkBAIC0xMjgsMTIgKzE3MCwzNiBAQAogCWNhc2UgTVZfQUxMRVlDQVQzX0RFVl9JRDoKIAkJaW5kZXggPSBNVl9NU1lTX0FDM19JTkRFWDsKIAkJYnJlYWs7CisJY2FzZSBNVl83ODQ2MF9ERVZfSUQ6CisJCWluZGV4ID0gTVZfNzg0NjBfSU5ERVg7CisJCWJyZWFrOworCWNhc2UgTVZfQk9CS19ERVZfSUQ6CisJCWluZGV4ID0gTVZfTVNZU19CT0JLX0lOREVYOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlpbmRleCA9IE1WX01TWVNfQUMzX0lOREVYOwogCX0KIAogCXJldHVybiBpbmRleDsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQKKyoKKyogREVTQ1JJUFRJT046IGNoZWNrIGlmIFNlckRlcyBsYW5lIGlzIGNvbm5lY3RlZCB0byBVU0IzIGhvc3QuCisqCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46cmV0dXJuIHRydWUgaWYgU2VyRGVzIGxhbmUgaXMgY29ubmVjdGVkIHRvIFVTQjMgaG9zdCwgZmFsc2Ugb3RoZXJ3aXNlLgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgbXZDdHJsSXNVc2JTZXJEZXNDb25uZWN0ZWQoTVZfVTMyIHVzYlBvcnQpCit7CisJcmV0dXJuIE1WX0ZBTFNFOy8qcmV0dXJuIGZhbHNlIGJlY2F1c2UgaW4gbXN5cyB0aGVyZSBpcyBubyB1c2IzKi8KK30KIAogTVZfVTMyIG12Q3RybFNvY1VuaXRJbmZvTnVtR2V0KE1WX1VOSVRfSUQgdW5pdCkKIHsKQEAgLTE0NywxMSArMjEzLDM0IEBACiAJZGV2SWRJbmRleCA9IG12Q3RybERldklkSW5kZXhHZXQobXZDdHJsTW9kZWxHZXQoKSk7CiAJcmV0dXJuIG12Q3RybFNvY1VuaXROdW1zW3VuaXRdW2RldklkSW5kZXhdOwogfQotCi1NVl9VMzIgbXZDdHJsR2V0Q3B1TnVtKE1WX1ZPSUQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybEdldENwdU51bQorKgorKiBERVNDUklQVElPTjogR2V0IHRoZSBudW1iZXIgb2YgQ1BVIGNvcmVzCisqCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46Y3B1IGNvcmVzIG51bWJlciBvciAwIGlmIHRoZSBkZXZpY2VJRCBub3QgZm91bmQgaW4gZGV2aWNlIElEcyB0YWJsZQorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UzMiAgbXZDdHJsR2V0Q3B1TnVtKE1WX1ZPSUQpCiB7CisJTVZfVTMyCXRhYmxlX2luZGV4ID0gMDsKKwlNVl9VMzIJZGV2aWNlSWQgPSBtdkN0cmxNb2RlbEdldCgpOworCisJd2hpbGUgKG12RGV2MkNwdU1hcFRhYmxlW3RhYmxlX2luZGV4XVswXSAhPSBNVl9NQVhfREVWX0lEKSB7CisJCWlmIChkZXZpY2VJZCA9PSBtdkRldjJDcHVNYXBUYWJsZVt0YWJsZV9pbmRleF1bMF0pCisJCQlyZXR1cm4gbXZEZXYyQ3B1TWFwVGFibGVbdGFibGVfaW5kZXhdWzFdOworCQl0YWJsZV9pbmRleCsrOworCX0KKwltdk9zUHJpbnRmKCIlczogRXJyb3I6IERldklEICglI1gpIGlzIG5vdCBmb3VuZCBpbiBDUFUgY29yZXMgY291bnQgcGVyIGRldmljZSB0YWJsZSFcbiIsIF9fZnVuY19fLCBkZXZpY2VJZCk7CiAJcmV0dXJuIDA7CiB9CisKIE1WX0JPT0wgbXZDdHJsSXNWYWxpZFNhdFIoTVZfVk9JRCkKIHsKIAlyZXR1cm4gTVZfVFJVRTsKQEAgLTI0OCw3ICszMzcsOSBAQAogCU1WX1UzMiBtcHBHcm91cDsKIAlNVl9VMzIgbXBwVmFsOwogCU1WX1UzMiBpLCBncHBNYXNrOwotCisJTVZfVTMyIG1heEdyb3VwID0gbXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEID8KKwkJTVZfTVBQX01BWF9HUk9VUF9BWFAgOiBNVl9NUFBfTUFYX0dST1VQOworCU1WX1NUQVRVUyBzdGF0dXM7CiAKIAkvKiBEaXNhYmxlIE1CdXMgRXJyb3IgUHJvcGFnYXRpb24gKi8KIAlNVl9SRUdfQklUX1JFU0VUKFNPQ19DT0hFUkVOQ1lfRkFCUklDX0NUUkxfUkVHLCBCSVQ4KTsKQEAgLTI2MCwyMyArMzUxLDIzIEBACiAJbXZCb2FyZE1wcE1vZHVsZXNTY2FuKCk7CiAKIAkvKiBSZWFkIE1QUCBjb25maWcgdmFsdWVzIGZyb20gYm9hcmQgbGV2ZWwgYW5kIHdyaXRlIE1QUCBvcHRpb25zIHRvIEhXICovCi0JZm9yIChtcHBHcm91cCA9IDA7IG1wcEdyb3VwIDwgTVZfTVBQX01BWF9HUk9VUDsgbXBwR3JvdXArKykgeworCWZvciAobXBwR3JvdXAgPSAwOyBtcHBHcm91cCA8IG1heEdyb3VwOyBtcHBHcm91cCsrKSB7CiAJCW1wcFZhbCA9IG12Qm9hcmRNcHBHZXQobXBwR3JvdXApOwkvKiBnZXQgcHJlLWRlZmluZWQgdmFsdWVzICovCiAJCU1WX1JFR19XUklURShtdkN0cmxNcHBSZWdHZXQobXBwR3JvdXApLCBtcHBWYWwpOwogCX0KIAogCS8qIGRpc2FibGUgYWxsIEdQSU8gaW50ZXJydXB0cyAqLwotCWZvciAoaSA9IDA7IGkgPCBNVl9HUFBfTUFYX0dST1VQOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4R3JvdXA7IGkrKykgewogCQlNVl9SRUdfV1JJVEUoR1BQX0lOVF9NQVNLX1JFRyhpKSwgMHgwKTsKIAkJTVZfUkVHX1dSSVRFKEdQUF9JTlRfTFZMX1JFRyhpKSwgMHgwKTsKIAl9CiAKIAkvKiBjbGVhciBhbGwgaW50ICovCi0JZm9yIChpID0gMDsgaSA8IE1WX0dQUF9NQVhfR1JPVVA7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbWF4R3JvdXA7IGkrKykKIAkJTVZfUkVHX1dSSVRFKEdQUF9JTlRfQ0FVU0VfUkVHKGkpLCAweDApOwogCiAJLyogU2V0IGdwcCBpbnRlcnJ1cHRzIGFzIG5lZWRlZCAqLwotCWZvciAoaSA9IDA7IGkgPCBNVl9HUFBfTUFYX0dST1VQOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4R3JvdXA7IGkrKykgewogCQlncHBNYXNrID0gbXZCb2FyZEdwaW9JbnRNYXNrR2V0KGkpOwogCQltdkdwcFR5cGVTZXQoaSwgZ3BwTWFzayAsIChNVl9HUFBfSU4gJiBncHBNYXNrKSk7CiAJCW12R3BwUG9sYXJpdHlTZXQoaSwgZ3BwTWFzayAsIChNVl9HUFBfSU5fSU5WRVJUICYgZ3BwTWFzaykpOwpAQCAtMjg2LDE1ICszNzcsMjIgQEAKIAltdkJvYXJkT3RoZXJNb2R1bGVzU2NhbigpOwogCiAJLyogVXBkYXRlIGludGVyZmFjZXMgY29uZmlndXJhdGlvbiBiYXNlZCBvbiBhYm92ZSBzY2FuICovCi0JaWYgKE1WX09LICE9IG12Q3RybFNlcmRlc1BoeUNvbmZpZygpKQorCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCXN0YXR1cyA9IG12Q3RybFNlcmRlc1BoeUNvbmZpZ0F4cCgpOworCWVsc2UKKwkJc3RhdHVzID0gbXZDdHJsU2VyZGVzUGh5Q29uZmlnKCk7CisKKwlpZiAoc3RhdHVzICE9IE1WX09LKQogCQltdk9zUHJpbnRmKCJtdkN0cmxFbnZJbml0OiBDYW4ndCBpbml0IHNvbWUgb3IgYWxsIFNFUkRFUyBsYW5lc1xuIik7CiAKLQltdkN0cmxEZXZCdXNJbml0KCk7CisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApICE9IE1WXzc4NDYwX0RFVl9JRCkgeworCQltdkN0cmxEZXZCdXNJbml0KCk7CiAKICNpZmRlZiBFUlJBVEFfR0xfNTk1NjgwMgogCQkvKiBTVyBXQSBmb3IgRVJSQVRBIDU5NTY4MDIgLSBkaXNhYmxlIHRoZSBleHRlcm5hbCBpMmMgZGVidWdnZXIgYWNjZXNzICovCiAJCU1WX1JFR19CSVRfUkVTRVQoVFdTSV9DT05GSUdfREVCVUdfUkVHLCBUV1NJX0RFQlVHX1NMQVZFX1BPUlQwX0VOKTsKICNlbmRpZgorCX0KIAogCW12T3NEZWxheSgxMDApOwogCkBAIC0zMTgsOSArNDE2LDE0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfVTMyIG12Q3RybE1wcFJlZ0dldChNVl9VMzIgbXBwR3JvdXApCiB7Ci0JTVZfVTMyIHJldDsKKwlNVl9VMzIgcmV0LCBtYXhHcm91cDsKIAotCWlmIChtcHBHcm91cCA+PSBNVl9NUFBfTUFYX0dST1VQKQorCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCW1heEdyb3VwID0gTVZfTVBQX01BWF9HUk9VUF9BWFA7CisJZWxzZQorCQltYXhHcm91cCA9IE1WX01QUF9NQVhfR1JPVVA7CisKKwlpZiAobXBwR3JvdXAgPj0gbWF4R3JvdXApCiAJCW1wcEdyb3VwID0gMDsKIAogCXJldCA9IE1QUF9DT05UUk9MX1JFRyhtcHBHcm91cCk7CkBAIC0zNDgsNiArNDUxLDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9VMzIgbXZDdHJsUGV4TWF4SWZHZXQoTVZfVk9JRCkKIHsKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQlyZXR1cm4gTVZfUEVYX01BWF9JRjsKIAlyZXR1cm4gbXZDdHJsU29jVW5pdEluZm9OdW1HZXQoUEVYX1VOSVRfSUQpOwogfQogCkBAIC00MzcsNiArNTQyLDggQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9VOCBtdkN0cmxFdGhNYXhDUFVzR2V0KE1WX1ZPSUQpCiB7CisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuIG12Q3RybEV0aE1heFBvcnRHZXQoKTsKIAlyZXR1cm4gMjsKIH0KIApAQCAtNTU4LDYgKzY2NSw2NCBAQAogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybE1vZGVsR2V0QXhwIC0gR2V0IE1hcnZlbGwgY29udHJvbGxlciBkZXZpY2UgbW9kZWwgKElkKSBmb3IgQVhQIGRldmljZXMKKyoKKyogREVTQ1JJUFRJT046CisqICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxNmJpdCBkZXNjcmliaW5nIHRoZSBkZXZpY2UgbW9kZWwgKElEKSBhcyBkZWZpbmVkCisqICAgICAgIGluIFBDSSBEZXZpY2UgYW5kIFZlbmRvciBJRCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIG9mZnNldCAweDAuCisqCisqIElOUFVUOgorKiAgICAgICBOb25lLgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjoKKyogICAgICAgMTZiaXQgZGVzc2NyaWJpbmcgTWFydmVsbCBjb250cm9sbGVyIElECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVTE2IG12Q3RybE1vZGVsR2V0QXhwKE1WX1ZPSUQpCit7CisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NMS19QV1JfQ05UUkwpCisJTVZfVTMyIHBleFBvd2VyOworI2VuZGlmCisJTVZfVTMyIGRldklkOworCU1WX1UxNiBtb2RlbCA9IDA7CisJTVZfVTMyIHJlZywgcmVnMjsKKwlzdGF0aWMgTVZfVTE2IG1vZGVsSWQgPSAweGZmZmY7CisKKwlpZiAobW9kZWxJZCAhPSAweGZmZmYpCisJCXJldHVybiBtb2RlbElkOworCisJLyogaWYgUEVYMCBjbG9ja3MgYXJlIGRpc2FibGVkIC0gZW5hYmxlZCBpdCB0byByZWFkICovCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NMS19QV1JfQ05UUkwpCisJLyogQ2hlY2sgcGV4IHBvd2VyIHN0YXRlICovCisJcGV4UG93ZXIgPSBtdkN0cmxQd3JDbGNrR2V0KFBFWF9VTklUX0lELCAwKTsKKwlpZiAocGV4UG93ZXIgPT0gTVZfRkFMU0UpCisJCW12Q3RybFB3ckNsY2tTZXQoUEVYX1VOSVRfSUQsIDAsIE1WX1RSVUUpOworI2VuZGlmCisJcmVnID0gTVZfUkVHX1JFQUQoUE9XRVJfTU5HX0NUUkxfUkVHKTsKKwlpZiAoKHJlZyAmIEFYUF9QTUNfUEVYU1RPUENMT0NLX01BU0soMCkpID09IEFYUF9QTUNfUEVYU1RPUENMT0NLX1NUT1AoMCkpIHsKKwkJcmVnMiA9ICgocmVnICYgfkFYUF9QTUNfUEVYU1RPUENMT0NLX01BU0soMCkpIHwgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfRU4oMCkpOworCQlNVl9SRUdfV1JJVEUoUE9XRVJfTU5HX0NUUkxfUkVHLCByZWcyKTsKKwl9CisKKwlkZXZJZCA9IE1WX1JFR19SRUFEKFBFWF9DRkdfRElSRUNUX0FDQ0VTUygwLCBQRVhfREVWSUNFX0FORF9WRU5ET1JfSUQpKTsKKworCS8qIFJlc2V0IHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgUEVYMCBjbG9jayAqLworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9DTEtfUFdSX0NOVFJMKQorCS8qIFJldHVybiB0byBwb3dlciBvZmYgc3RhdGUgKi8KKwlpZiAocGV4UG93ZXIgPT0gTVZfRkFMU0UpCisJCW12Q3RybFB3ckNsY2tTZXQoUEVYX1VOSVRfSUQsIDAsIE1WX0ZBTFNFKTsKKyNlbmRpZgorCisJbW9kZWwgPSAoTVZfVTE2KSAoKGRldklkID4+IDE2KSAmIDB4RkZGRik7CisKKwltb2RlbElkID0gbW9kZWw7CisJcmV0dXJuIG1vZGVsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxNb2RlbEdldCAtIEdldCBNYXJ2ZWxsIGNvbnRyb2xsZXIgZGV2aWNlIG1vZGVsIChJZCkKICoKICogREVTQ1JJUFRJT046CkBAIC01NzgsMTEgKzc0MywxNSBAQAogewogCU1WX1UzMgljdHJsSWQgPSBNVl9SRUdfUkVBRChERVZfSURfUkVHKTsKIAorCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCXJldHVybiBtdkN0cmxNb2RlbEdldEF4cCgpOworCiAJY3RybElkID0gKGN0cmxJZCAmIChERVZJQ0VfSURfTUFTSykpID4+IERFVklDRV9JRF9PRkZTOwogCiAJc3dpdGNoIChjdHJsSWQgJiB+REVWSUNFX0ZMQVZPUl9NQVNLKSB7CiAJY2FzZSBNVl9CT0JDQVQyX0RFVl9JRDoKIAljYXNlIE1WX0FMTEVZQ0FUM19ERVZfSUQ6CisJY2FzZSBNVl9CT0JLX0RFVl9JRDoKIAkJcmV0dXJuIGN0cmxJZDsKIAlkZWZhdWx0OgogCQltdk9zUHJpbnRmKCIlczogRXJyb3I6IEZhaWxlZCB0byBvYnRhaW4gQ29udHJvbGxlciBEZXZpY2UgSURcbiIsIF9fZnVuY19fKTsKQEAgLTYwOSw4ICs3NzgsMzAgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9VOCBtdkN0cmxSZXZHZXQoTVZfVk9JRCkKIHsKLQlNVl9VMzIgdmFsdWUgPSBNVl9ERlhfUkVHX1JFQUQoREVWX1JFVl9JRF9SRUcpOwotCXJldHVybiAodmFsdWUgJiAoUkVWSVNPTl9JRF9NQVNLKSkgPj4gUkVWSVNPTl9JRF9PRkZTOworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9DTEtfUFdSX0NOVFJMKQorCU1WX1UzMiBwZXhQb3dlcjsKKyNlbmRpZgorCU1WX1UzMiB2YWx1ZTsKKwlNVl9VOCByZXZOdW07CisKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgIT0gTVZfNzg0NjBfREVWX0lEKSB7CisJCXZhbHVlID0gTVZfREZYX1JFR19SRUFEKERFVl9SRVZfSURfUkVHKTsKKwkJcmV0dXJuICh2YWx1ZSAmIChSRVZJU09OX0lEX01BU0spKSA+PiBSRVZJU09OX0lEX09GRlM7CisJfQorCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NMS19QV1JfQ05UUkwpCisJLyogQ2hlY2sgcGV4IHBvd2VyIHN0YXRlICovCisJcGV4UG93ZXIgPSBtdkN0cmxQd3JDbGNrR2V0KFBFWF9VTklUX0lELCAwKTsKKwlpZiAocGV4UG93ZXIgPT0gTVZfRkFMU0UpCisJCW12Q3RybFB3ckNsY2tTZXQoUEVYX1VOSVRfSUQsIDAsIE1WX1RSVUUpOworI2VuZGlmCisJcmV2TnVtID0gKE1WX1U4KU1WX1JFR19SRUFEKFBFWF9DRkdfRElSRUNUX0FDQ0VTUygwLCBQQ0lfQ0xBU1NfQ09ERV9BTkRfUkVWSVNJT05fSUQpKTsKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTCkKKwkvKiBSZXR1cm4gdG8gcG93ZXIgb2ZmIHN0YXRlICovCisJaWYgKHBleFBvd2VyID09IE1WX0ZBTFNFKQorCQltdkN0cmxQd3JDbGNrU2V0KFBFWF9VTklUX0lELCAwLCBNVl9GQUxTRSk7CisjZW5kaWYKKwlyZXR1cm4gKHJldk51bSAmIFBDQ1JJUl9SRVZJRF9NQVNLKSA+PiBQQ0NSSVJfUkVWSURfT0ZGUzsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYzMSw3ICs4MjIsMTEgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9TVEFUVVMgbXZDdHJsTmFtZUdldChjaGFyICpwTmFtZUJ1ZmYpCiB7Ci0JbXZPc1NQcmludGYocE5hbWVCdWZmLCAiJXMiLCBTT0NfTkFNRV9QUkVGSVgpOworCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCW12T3NTUHJpbnRmKHBOYW1lQnVmZiwgIiVzIiwgIiIpOworCWVsc2UKKwkJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiJXMiLCBTT0NfTkFNRV9QUkVGSVgpOworCiAJcmV0dXJuIE1WX09LOwogfQogCkBAIC03MDEsNyArODk2LDI2IEBACiAJCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIgUmV2ICVzIiwgcmV2QXJyYXlBQzNbcmV2SWRdKTsKIAkJCXJldHVybjsKIAkJfQorCX0gZWxzZSBpZiAoY3RybEZhbWlseSA9PSBNVl83ODQ2MF9ERVZfSUQpIHsKKwkJc3dpdGNoIChtdkN0cmxNb2RlbFJldkdldCgpKSB7CisJCWNhc2UgTVZfNzg0NjBfQTBfSUQ6CisJCQltdk9zU1ByaW50ZihwTmFtZUJ1ZmYsICIlcyIsIE1WXzc4NDYwX0EwX05BTUUpOworCQkJcmV0dXJuOworCQljYXNlIE1WXzc4NDYwX0IwX0lEOgorCQkJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiJXMiLCBNVl83ODQ2MF9CMF9OQU1FKTsKKwkJCXJldHVybjsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChjdHJsRmFtaWx5ID09IE1WX0JPQktfREVWX0lEKSB7CiAKKwkJY2hhciAqcmV2QXJyYXlCT0JLW10gPSBNVl9CT0JLX0lEX0FSUkFZOworCisJCXN3aXRjaCAocmV2SWQpIHsKKwkJY2FzZSBNVl9CT0JLX0EwX0lEOgorCQkJbXZPc1NQcmludGYocE5hbWVCdWZmLCAiIFJldiAlcyIsIHJldkFycmF5Qk9CS1tyZXZJZF0pOworCQkJcmV0dXJuOworCQl9CiAJfSBlbHNlCiAJCW12T3NQcmludGYoIiVzOiBFcnJvcjogV3JvbmcgY29udHJvbGxlciBtb2RlbCAlI3hcbiIsIF9fZnVuY19fLCBjdHJsRmFtaWx5KTsKIApAQCAtNzUxLDE3ICs5NjUsMjIgQEAKIHsKIAlNVl9VMzIJYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOwogCi0JaWYgKChib2FyZElkID49IEJDMl9DVVNUT01FUl9CT0FSRF9JRF9CQVNFKSAmJiAoYm9hcmRJZCA8IEJDMl9NQVJWRUxMX01BWF9CT0FSRF9JRCkpCisJaWYgKGJvYXJkSWQgPT0gREJfNzhYNjBfQU1DX0lEKQorCQlyZXR1cm4gTVZfNzg0NjBfREVWX0lEOworCWVsc2UgaWYgKChib2FyZElkID49IEJDMl9DVVNUT01FUl9CT0FSRF9JRF9CQVNFKSAmJiAoYm9hcmRJZCA8IEJDMl9NQVJWRUxMX01BWF9CT0FSRF9JRCkpCiAJCXJldHVybiBNVl9CT0JDQVQyX0RFVl9JRDsKIAllbHNlIGlmICgoYm9hcmRJZCA+PSBBQzNfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSkgJiYgKGJvYXJkSWQgPCBBQzNfTUFSVkVMTF9NQVhfQk9BUkRfSUQpKQogCQlyZXR1cm4gTVZfQUxMRVlDQVQzX0RFVl9JRDsKKwllbHNlIGlmICgoYm9hcmRJZCA+PSBCT0JLX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UpICYmIChib2FyZElkIDwgQk9CS19NQVJWRUxMX01BWF9CT0FSRF9JRCkpCisJCXJldHVybiBNVl9CT0JLX0RFVl9JRDsKIAllbHNlIHsKIAkJbXZPc1ByaW50ZigiJXM6IEVSUi4gSW52YWxpZCBCb2FyZCBJRCAoJWQpICxVc2luZyBCQzIgYXMgZGVmYXVsdCBmYW1pbHlcbiIsIF9fZnVuY19fLCBib2FyZElkKTsKIAkJcmV0dXJuIE1WX0JPQkNBVDJfREVWX0lEOwogCX0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKmNudHJsTmFtZVtdID0gVEFSR0VUU19OQU1FX0FSUkFZOworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjbnRybE5hbWVNc3lzW10gPSBUQVJHRVRTX05BTUVfQVJSQVk7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNudHJsTmFtZUF4cFtdID0gVEFSR0VUU19OQU1FX0FSUkFZX0FYUDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZDdHJsVGFyZ2V0TmFtZUdldCAtIEdldCBNYXJ2ZWxsIGNvbnRyb2xsZXIgdGFyZ2V0IG5hbWUKQEAgLTc4Myw3ICsxMDAyLDEwIEBACiAJaWYgKHRhcmdldCA+PSBNQVhfVEFSR0VUUykKIAkJcmV0dXJuICJ0YXJnZXQgdW5rbm93biI7CiAKLQlyZXR1cm4gY250cmxOYW1lW3RhcmdldF07CisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkKKwkJcmV0dXJuIGNudHJsTmFtZUF4cFt0YXJnZXRdOworCWVsc2UKKwkJcmV0dXJuIGNudHJsTmFtZU1zeXNbdGFyZ2V0XTsKIH0KIAogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9QRVgpCkBAIC0xMTYxLDggKzEzODMsMTAgQEAKIAogCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl9CT0JDQVQyX0RFVl9JRCkKIAkJc2F0ciA9IE1TQVJfQkMyX0JPT1RfTU9ERShzYXRyLCAwKTsKLQllbHNlCisJZWxzZSBpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfQUxMRVlDQVQzX0RFVl9JRCkKIAkJc2F0ciA9IE1TQVJfQUMzX0JPT1RfTU9ERShzYXRyLCAwKTsKKwllbHNlCisJCXNhdHIgPSBNU0FSX0JPQktfQk9PVF9NT0RFKHNhdHIsIDApOwogCiAJaWYgKHNhdHIgPT0gU0FSMV9CT09UX0ZST01fTk9SKQogCQlyZXR1cm4gTVZfVFJVRTsKQEAgLTExOTIsOCArMTQxNiwxMCBAQAogCiAJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WX0JPQkNBVDJfREVWX0lEKQogCQlzYXRyID0gTVNBUl9CQzJfQk9PVF9NT0RFKHNhdHIsIDApOwotCWVsc2UKKwllbHNlIGlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl9BTExFWUNBVDNfREVWX0lEKQogCQlzYXRyID0gTVNBUl9BQzNfQk9PVF9NT0RFKHNhdHIsIDApOworCWVsc2UKKwkJc2F0ciA9IE1TQVJfQk9CS19CT09UX01PREUoc2F0ciwgMCk7CiAKIAlpZiAoc2F0ciA9PSBTQVIxX0JPT1RfRlJPTV9TUEkpCiAJCXJldHVybiBNVl9UUlVFOwpAQCAtMTIyMyw4ICsxNDQ5LDEwIEBACiAKIAlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfQk9CQ0FUMl9ERVZfSUQpCiAJCXNhdHIgPSBNU0FSX0JDMl9CT09UX01PREUoc2F0ciwgMCk7Ci0JZWxzZQorCWVsc2UgaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WX0FMTEVZQ0FUM19ERVZfSUQpCiAJCXNhdHIgPSBNU0FSX0FDM19CT09UX01PREUoc2F0ciwgMCk7CisJZWxzZQorCQlzYXRyID0gTVNBUl9CT0JLX0JPT1RfTU9ERShzYXRyLCAwKTsKIAogCWlmIChzYXRyID09IFNBUjFfQk9PVF9GUk9NX05BTkQpCiAJCXJldHVybiBNVl9UUlVFOwpAQCAtMTI2NiwzMyArMTQ5NCw4NCBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1ZPSUQgbXZDdHJsUHdyQ2xja1NldChNVl9VTklUX0lEIHVuaXRJZCwgTVZfVTMyIGluZGV4LCBNVl9CT09MIGVuYWJsZSkKIHsKKwlNVl9VMzIgbWFzazsKIAogCXN3aXRjaCAodW5pdElkKSB7CiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BFWCkKIAljYXNlIFBFWF9VTklUX0lEOgotCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQotCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIFBNQ19QRVhTVE9QQ0xPQ0tfTUFTSyk7CisJCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCQltYXNrID0gQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfTUFTSyhpbmRleCk7CiAJCWVsc2UKLQkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgUE1DX1BFWFNUT1BDTE9DS19NQVNLKTsKKwkJCW1hc2sgPSBQTUNfUEVYU1RPUENMT0NLX01BU0s7CisKKwkJaWYgKGVuYWJsZSA9PSBNVl9GQUxTRSkKKwkJCU1WX1JFR19CSVRfUkVTRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBtYXNrKTsKKwkJZWxzZQorCQkJTVZfUkVHX0JJVF9TRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBtYXNrKTsKIAogCQlicmVhazsKICNlbmRpZgogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9HSUdfRVRIKQogCWNhc2UgRVRIX0dJR19VTklUX0lEOgotCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQotCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIFBNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KSk7CisJCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCQltYXNrID0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KTsKIAkJZWxzZQotCQkJTVZfUkVHX0JJVF9TRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBQTUNfR0VTVE9QQ0xPQ0tfTUFTSyhpbmRleCkpOworCQkJbWFzayA9IFBNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KTsKKworCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQorCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIG1hc2spOworCQllbHNlCisJCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIG1hc2spOwogCiAJCWJyZWFrOwogI2VuZGlmCiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1NESU8pCiAJY2FzZSBTRElPX1VOSVRfSUQ6Ci0JCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCi0JCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgUE1DX1NESU9TVE9QQ0xPQ0tfTUFTSyk7CisJCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCQltYXNrID0gQVhQX1BNQ19TRElPU1RPUENMT0NLX01BU0s7CiAJCWVsc2UKLQkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgUE1DX1NESU9TVE9QQ0xPQ0tfTUFTSyk7CisJCQltYXNrID0gUE1DX1NESU9TVE9QQ0xPQ0tfTUFTSzsKIAorCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQorCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIG1hc2spOworCQllbHNlCisJCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIG1hc2spOworCisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NFU0EpCisJY2FzZSBDRVNBX1VOSVRfSUQ6CisJCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCisJCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgQVhQX1BNQ19DRVNBU1RPUENMT0NLX01BU0spOworCQllbHNlCisJCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19NQVNLKTsKKworCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VU0IpCisJY2FzZSBVU0JfVU5JVF9JRDoKKwkJaWYgKGVuYWJsZSA9PSBNVl9GQUxTRSkKKwkJCU1WX1JFR19CSVRfUkVTRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBBWFBfUE1DX1VTQlNUT1BDTE9DS19NQVNLKGluZGV4KSk7CisJCWVsc2UKKwkJCU1WX1JFR19CSVRfU0VUKFBPV0VSX01OR19DVFJMX1JFRywgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfTUFTSyhpbmRleCkpOworCisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0lOVEVHX1NBVEEpCisJY2FzZSBTQVRBX1VOSVRfSUQ6CisJCWlmIChlbmFibGUgPT0gTVZfRkFMU0UpCisJCQlNVl9SRUdfQklUX1JFU0VUKFBPV0VSX01OR19DVFJMX1JFRywgQVhQX1BNQ19TQVRBU1RPUENMT0NLX01BU0soaW5kZXgpKTsKKwkJZWxzZQorCQkJTVZfUkVHX0JJVF9TRVQoUE9XRVJfTU5HX0NUUkxfUkVHLCBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSyhpbmRleCkpOworCisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX1RETSkKKwljYXNlIFRETV9VTklUX0lEOgorCQlpZiAoZW5hYmxlID09IE1WX0ZBTFNFKQorCQkJTVZfUkVHX0JJVF9SRVNFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIEFYUF9QTUNfVERNU1RPUENMT0NLX01BU0spOworCQllbHNlCisJCQlNVl9SRUdfQklUX1NFVChQT1dFUl9NTkdfQ1RSTF9SRUcsIEFYUF9QTUNfVERNU1RPUENMT0NLX01BU0spOwogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6CkBAIC0xMzE1LDEzICsxNTk0LDIyIEBACiB7CiAjaWYgZGVmaW5lZChNVl9JTkNMVURFX1BFWCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX1BFWCkgfHwgZGVmaW5lZChNVl9JTkNMVURFX0dJR19FVEgpIHx8IGRlZmluZWQoTVZfSU5DTFVERV9TRElPKQogCU1WX1UzMiByZWcgPSBNVl9SRUdfUkVBRChQT1dFUl9NTkdfQ1RSTF9SRUcpOworCU1WX1UzMiBtYXNrLCBzdG9wOwogI2VuZGlmCiAJTVZfQk9PTCBzdGF0ZSA9IE1WX1RSVUU7CiAKIAlzd2l0Y2ggKHVuaXRJZCkgewogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9QRVgpCiAJY2FzZSBQRVhfVU5JVF9JRDoKLQkJaWYgKChyZWcgJiBQTUNfUEVYU1RPUENMT0NLX01BU0spID09IFBNQ19QRVhTVE9QQ0xPQ0tfU1RPUCkKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCkgeworCQkJbWFzayA9IEFYUF9QTUNfUEVYU1RPUENMT0NLX01BU0soaW5kZXgpOworCQkJc3RvcCA9IEFYUF9QTUNfUEVYU1RPUENMT0NLX1NUT1AoaW5kZXgpOworCQl9IGVsc2UgeworCQkJbWFzayA9IFBNQ19QRVhTVE9QQ0xPQ0tfTUFTSzsKKwkJCXN0b3AgPSBQTUNfUEVYU1RPUENMT0NLX1NUT1A7CisJCX0KKworCQlpZiAoKHJlZyAmIG1hc2spID09IHN0b3ApCiAJCQlzdGF0ZSA9IE1WX0ZBTFNFOwogCQllbHNlCiAJCQlzdGF0ZSA9IE1WX1RSVUU7CkBAIC0xMzI5LDcgKzE2MTcsMTUgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9HSUdfRVRIKQogCWNhc2UgRVRIX0dJR19VTklUX0lEOgotCQlpZiAoKHJlZyAmIFBNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KSkgPT0gUE1DX0dFU1RPUENMT0NLX1NUT1AoaW5kZXgpKQorCQlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKSB7CisJCQltYXNrID0gQVhQX1BNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KTsKKwkJCXN0b3AgPSBBWFBfUE1DX0dFU1RPUENMT0NLX1NUT1AoaW5kZXgpOworCQl9IGVsc2UgeworCQkJbWFzayA9IFBNQ19HRVNUT1BDTE9DS19NQVNLKGluZGV4KTsKKwkJCXN0b3AgPSBQTUNfR0VTVE9QQ0xPQ0tfU1RPUChpbmRleCk7CisJCX0KKworCQlpZiAoKHJlZyAmIG1hc2spID09IHN0b3ApCiAJCQlzdGF0ZSA9IE1WX0ZBTFNFOwogCQllbHNlCiAJCQlzdGF0ZSA9IE1WX1RSVUU7CkBAIC0xMzM3LDcgKzE2MzMsNDkgQEAKICNlbmRpZgogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9TRElPKQogCWNhc2UgU0RJT19VTklUX0lEOgotCQlpZiAoKHJlZyAmIFBNQ19TRElPU1RPUENMT0NLX01BU0spID09IFBNQ19TRElPU1RPUENMT0NLX1NUT1ApCisJCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpIHsKKwkJCW1hc2sgPSBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfTUFTSzsKKwkJCXN0b3AgPSBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfU1RPUDsKKwkJfSBlbHNlIHsKKwkJCW1hc2sgPSBQTUNfU0RJT1NUT1BDTE9DS19NQVNLOworCQkJc3RvcCA9IFBNQ19TRElPU1RPUENMT0NLX1NUT1A7CisJCX0KKworCQlpZiAoKHJlZyAmIG1hc2spID09IHN0b3ApCisJCQlzdGF0ZSA9IE1WX0ZBTFNFOworCQllbHNlCisJCQlzdGF0ZSA9IE1WX1RSVUU7CisJCWJyZWFrOworI2VuZGlmCisjaWYgZGVmaW5lZChNVl9JTkNMVURFX0NFU0EpCisJY2FzZSBDRVNBX1VOSVRfSUQ6CisJCWlmICgocmVnICYgQVhQX1BNQ19DRVNBU1RPUENMT0NLX01BU0spID09IEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19TVE9QKQorCQkJc3RhdGUgPSBNVl9GQUxTRTsKKwkJZWxzZQorCQkJc3RhdGUgPSBNVl9UUlVFOworCQlicmVhazsKKyNlbmRpZgorI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VU0IpCisJY2FzZSBVU0JfVU5JVF9JRDoKKwkJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApICE9IE1WXzc4NDYwX0RFVl9JRCkKKwkJCXN0YXRlID0gTVZfVFJVRTsKKwkJZWxzZSBpZiAoKHJlZyAmIEFYUF9QTUNfVVNCU1RPUENMT0NLX01BU0soaW5kZXgpKSA9PSBBWFBfUE1DX1VTQlNUT1BDTE9DS19TVE9QKGluZGV4KSkKKwkJCXN0YXRlID0gTVZfRkFMU0U7CisJCWVsc2UKKwkJCXN0YXRlID0gTVZfVFJVRTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfU0FUQSkKKwljYXNlIFNBVEFfVU5JVF9JRDoKKwkJaWYgKChyZWcgJiBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSyhpbmRleCkpID09IEFYUF9QTUNfU0FUQVNUT1BDTE9DS19TVE9QKGluZGV4KSkKKwkJCXN0YXRlID0gTVZfRkFMU0U7CisJCWVsc2UKKwkJCXN0YXRlID0gTVZfVFJVRTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfVERNKQorCWNhc2UgVERNX1VOSVRfSUQ6CisJCWlmICgocmVnICYgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfTUFTSykgPT0gQVhQX1BNQ19URE1TVE9QQ0xPQ0tfU1RPUCkKIAkJCXN0YXRlID0gTVZfRkFMU0U7CiAJCWVsc2UKIAkJCXN0YXRlID0gTVZfVFJVRTsKQEAgLTEzNjYsOSArMTcwNCwxNiBAQAogTVZfVTMyIG12Q3RybEREUkJ1ZFdpZHRoKE1WX1ZPSUQpCiB7CiAJTVZfVTMyIHJlZzsKLQlyZWcgPSBNVl9SRUdfUkVBRChSRUdfU0RSQU1fQ09ORklHX0FERFIpOwogCi0JcmV0dXJuIChyZWcgJiAoMSA8PCBSRUdfU0RSQU1fQ09ORklHX0REUl9CVVNfT0ZGUykpID8gMzIgOiAxNjsKKwlyZWcgPSBNVl9SRUdfUkVBRChSRUdfU0RSQU1fQ09ORklHX0FERFIpOworCXJlZyA9IHJlZyAmICgxIDw8IFJFR19TRFJBTV9DT05GSUdfRERSX0JVU19PRkZTKTsKKworCS8qIEJvYmNhdDIgYW5kIEJvYksgaGF2ZSA2NC8xNiBERFIgQnVzIHdpZHRoICovCisJaWYgKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WX0JPQkNBVDJfREVWX0lEIHx8IG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WX0JPQktfREVWX0lEKQorCQlyZXR1cm4gcmVnID8gNjQgOiAzMjsKKwllbHNlCS8qIEFsbGV5LUNhdDMgaGF2ZSAzMi8xNiBERFIgQnVzIHdpZHRoICovCisJCXJldHVybiByZWcgPyAzMiA6IDE2OworCiB9CiBNVl9CT09MIG12Q3RybEREUlRocnVYYmFyKE1WX1ZPSUQpCiB7CkBAIC0xMzg2LDYgKzE3MzEsMTY2IEBACiAJcmV0dXJuIChyZWcgJiAoMHgxIDw8IFJFR19TRFJBTV9DT05GSUdfRUNDX09GRlMpKSA/IE1WX1RSVUUgOiBNVl9GQUxTRTsKIH0KIAorc3RhdGljIGNvbnN0IE1WX1U4IHNlcmRlc0NmZ1tdWzhdID0gU0VSREVTX0NGR19BWFA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Q3RybFNlcmRlc1BoeUNvbmZpZ0F4cAorKgorKiBERVNDUklQVElPTjoKKyoJQ29uZmlndXJlIFNlcmRlcyBNVVggYW5kIGluaXQgUEhZcyBjb25uZWN0ZWQgdG8gU0VSREVTIGxpbmVzIGZvciBBWFAuCisqCisqIElOUFVUOgorKglOb25lLgorKgorKiBPVVRQVVQ6CisqCU5vbmUuCisqCisqIFJFVFVSTjoKKyoJU3RhdHVzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12Q3RybFNlcmRlc1BoeUNvbmZpZ0F4cChNVl9WT0lEKQoreworCU1WX1UzMgkJc29jQ3RybFJlZywgUmVnWDQsIHNlcmRlc0xpbmUwXzc7CisJTVZfVTMyCQlzZXJkZXNMaW5lQ2ZnOworCU1WX1U4CQlzZXJkZXNMaW5lTnVtOworCU1WX1U4CQlwZXhJZjsKKwlNVl9VOAkJcGV4VW5pdDsKKwlNVl9TVEFUVVMJc3RhdHVzID0gTVZfT0s7CisJTVZfVTMyCQlwZXhJZk51bSA9IG12Q3RybFBleE1heElmR2V0KCk7CisJTVZfVTgJCW1heFNlcmRlc0xpbmVzID0gMTY7CS8qIFZhbGlkIGZvciBNVl83ODQ2MF9ERVZfSUQgKi8KKwlNVl9CT0FSRF9QRVhfSU5GTwkqYm9hcmRQZXhJbmZvID0gbXZCb2FyZFBleEluZm9HZXQoKTsKKworCS8qIFRoaXMgaXMgYSBtYXBwaW5nIG9mIHRoZSBmaW5hbCBwb3dlciBtYW5hZ2VtZW50IGNsb2NrCisJICogZ2F0aW5nIGNvbnRyb2wgcmVnaXN0ZXIgdmFsdWUgQCAweDE4MjIwCisJICovCisJTVZfVTMyCXBvd2VybW5nbW50Y3RybHJlZ21hcCA9IDB4MDsKKwlNVl9VMzIJdG1wY291bnRlciA9IDA7CisKKwkvKiBDaGVjayBpZiBubyBTRVJERVNzIGF2YWlsYWJsZSAtIEZQR0EgKi8KKwlpZiAobWF4U2VyZGVzTGluZXMgPT0gMCkKKwkJcmV0dXJuIE1WX09LOworCisJbWVtc2V0KGJvYXJkUGV4SW5mbywgMCwgc2l6ZW9mKE1WX0JPQVJEX1BFWF9JTkZPKSk7CisJc29jQ3RybFJlZyA9IE1WX1JFR19SRUFEKFNPQ19DVFJMX1JFRyk7CisJUmVnWDQgPSBNVl9SRUdfUkVBRChHRU5fUFVSUF9SRVNfMl9SRUcpOworCWJvYXJkUGV4SW5mby0+cGV4VW5pdENmZ1swXS5wZXhDZmcgPSAoKFJlZ1g0ICYgMHgwRikgPT0gMHgwRikgPyBQRVhfQlVTX01PREVfWDQgOiBQRVhfQlVTX01PREVfWDE7CisJYm9hcmRQZXhJbmZvLT5wZXhVbml0Q2ZnWzFdLnBleENmZyA9ICgoUmVnWDQgJiAweDBGMCkgPT0gMHgwRjApID8gUEVYX0JVU19NT0RFX1g0IDogUEVYX0JVU19NT0RFX1gxOworCWJvYXJkUGV4SW5mby0+cGV4VW5pdENmZ1syXS5wZXhDZmcgPSAoKFJlZ1g0ICYgMHgwRjAwKSA9PSAweDBGMDApID8gUEVYX0JVU19NT0RFX1g0IDogUEVYX0JVU19NT0RFX1gxOworCWJvYXJkUGV4SW5mby0+cGV4VW5pdENmZ1szXS5wZXhDZmcgPSAoKFJlZ1g0ICYgMHgwRjAwMCkgPT0gMHgwRjAwMCkgPyBQRVhfQlVTX01PREVfWDQgOiBQRVhfQlVTX01PREVfWDE7CisKKwlzZXJkZXNMaW5lMF83ID0gTVZfUkVHX1JFQUQoU0VSREVTX0xJTkVfTVVYX1JFR18wXzcpOworCS8qIFByZXBhcmUgUEhZIHBhcmFtZXRlcnMgZm9yIGVhY2ggc3RlcCBhY2NvcmRpbmcgdG8gIE1VWCBzZWxlY3Rpb24gKi8KKwlmb3IgKHBleElmID0gMDsgcGV4SWYgPCBwZXhJZk51bTsgcGV4SWYrKykgeworCQkvKiBGb3IgZWFjaCBzZXJkZXMgbGFuZSAqLworCQlwZXhVbml0ID0gKHBleElmIDwgOSkgPyAocGV4SWYgPj4gMikgOiAzOworCQlpZiAoKHNvY0N0cmxSZWcgJiAoMSA8PCBwZXhVbml0KSkgPT0gMCkgeworCQkJYm9hcmRQZXhJbmZvLT5wZXhVbml0Q2ZnW3BleFVuaXRdLnBleENmZyA9IFBFWF9CVVNfRElTQUJMRUQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocGV4SWYgPCA4KSB7CisJCQlzZXJkZXNMaW5lQ2ZnID0gKHNlcmRlc0xpbmUwXzcgPj4gKHBleElmIDw8IDIpKSAmIDB4RjsKKwkJCWlmIChzZXJkZXNMaW5lQ2ZnICE9IHNlcmRlc0NmZ1twZXhJZl1bU0VSREVTX1VOSVRfUEVYXSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlib2FyZFBleEluZm8tPnBleE1hcHBpbmdbYm9hcmRQZXhJbmZvLT5ib2FyZFBleElmTnVtXSA9IHBleElmOworCQlib2FyZFBleEluZm8tPmJvYXJkUGV4SWZOdW0rKzsKKwkJYm9hcmRQZXhJbmZvLT5wZXhVbml0Q2ZnW3BleFVuaXRdLnBleExhbmVTdGF0W3BleElmXSA9IDB4MTsKKwkJcG93ZXJtbmdtbnRjdHJscmVnbWFwID0gcG93ZXJtbmdtbnRjdHJscmVnbWFwIHwgKDB4MSA8PCAocGV4SWYgKyA1KSk7CisJCWlmIChwZXhJZiA8IDgpIHsKKwkJCWlmIChib2FyZFBleEluZm8tPnBleFVuaXRDZmdbcGV4VW5pdF0ucGV4Q2ZnID09IFBFWF9CVVNfTU9ERV9YNCkgeworCQkJCXBvd2VybW5nbW50Y3RybHJlZ21hcCB8PSAoMHhmIDw8IChwZXhJZiArIDUpKTsKKwkJCQlwZXhJZiArPSAzOworCQkJfSBlbHNlCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9ICgweDEgPDwgKHBleElmICsgNSkpOworCQl9IGVsc2UKKwkJCXBvd2VybW5nbW50Y3RybHJlZ21hcCB8PSAoMHgxIDw8ICgxOCArIHBleElmKSk7CisJfQorCisJZm9yIChzZXJkZXNMaW5lTnVtID0gMDsgc2VyZGVzTGluZU51bSA8IDg7IHNlcmRlc0xpbmVOdW0rKykgeworCQlzZXJkZXNMaW5lQ2ZnID0gKHNlcmRlc0xpbmUwXzcgPj4gKHNlcmRlc0xpbmVOdW0gPDwgMikpICYgMHhGOworCQlpZiAoc2VyZGVzTGluZUNmZyA9PSBzZXJkZXNDZmdbc2VyZGVzTGluZU51bV1bU0VSREVTX1VOSVRfU0FUQV0pIHsKKwkJCWlmICgoc2VyZGVzTGluZU51bSA9PSA0KSB8fCAoc2VyZGVzTGluZU51bSA9PSA2KSkKKwkJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgfD0gQVhQX1BNQ19TQVRBU1RPUENMT0NLX01BU0soMCk7CisJCQllbHNlIGlmIChzZXJkZXNMaW5lTnVtID09IDUpCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9IEFYUF9QTUNfU0FUQVNUT1BDTE9DS19NQVNLKDEpOworCQkJZWxzZQorCQkJCWdvdG8gZXJyX2NmZzsKKworCQl9IGVsc2UgaWYgKHNlcmRlc0xpbmVDZmcgPT0gc2VyZGVzQ2ZnW3NlcmRlc0xpbmVOdW1dW1NFUkRFU19VTklUX1NHTUlJMF0pCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygwKTsKKwkJCWVsc2UgaWYgKHNlcmRlc0xpbmVDZmcgPT0gc2VyZGVzQ2ZnW3NlcmRlc0xpbmVOdW1dW1NFUkRFU19VTklUX1NHTUlJMV0pCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygxKTsKKwkJCWVsc2UgaWYgKHNlcmRlc0xpbmVDZmcgPT0gc2VyZGVzQ2ZnW3NlcmRlc0xpbmVOdW1dW1NFUkRFU19VTklUX1NHTUlJMl0pCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygyKTsKKwkJCWVsc2UgaWYgKHNlcmRlc0xpbmVDZmcgPT0gc2VyZGVzQ2ZnW3NlcmRlc0xpbmVOdW1dW1NFUkRFU19VTklUX1NHTUlJM10pCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygzKTsKKwkJCWVsc2UgaWYgKHNlcmRlc0xpbmVDZmcgPT0gc2VyZGVzQ2ZnW3NlcmRlc0xpbmVOdW1dW1NFUkRFU19VTklUX1FTR01JSV0pCisJCQkJcG93ZXJtbmdtbnRjdHJscmVnbWFwIHw9IEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygwKSB8CisJCQkJCQkJIEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygxKSB8CisJCQkJCQkJIEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygyKSB8CisJCQkJCQkJIEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSygzKTsKKwl9CisKKyNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfQ0xLX1BXUl9DTlRSTCkKKwkvKiBFbmFibGluZyBwb3J0IEdFMCBhbHdheXMgc2luY2Ugd2UgbmVlZCBTTUkgMCB0byBhY2Nlc3Mgb3RoZXIgUEhZcyovCisJcG93ZXJtbmdtbnRjdHJscmVnbWFwID0gcG93ZXJtbmdtbnRjdHJscmVnbWFwIHwgQklUNDsKKwkvKiBDaGVjayBpZiBHRTEgaXMgbm90IGVuYWJsZWQgdmlhIE1QUHMgYW5kIG5vdCBTZXJkZXMgLSBpZiB5ZXMgeW91IGhhdmUgdG8gZW5hYmxlIHRoZSBjbG9jayovCisJCWlmIChNVl9UUlVFID09IG12Qm9hcmRJc0diRVBvcnRDb25uZWN0ZWQoMSkpCisJCQlwb3dlcm1uZ21udGN0cmxyZWdtYXAgPSBwb3dlcm1uZ21udGN0cmxyZWdtYXAgfCBBWFBfUE1DX0dFU1RPUENMT0NLX01BU0soMSk7CisKKwkvKiBIYXJkIGNvcmUgZW5hYmxlIEREUiwgVVNCLCBTRElPLCBMQ0QsIFhPUiwgSURNQSwgQ0VTQSBjYXVzZSB3ZSBkb24ndCBzdXBwb3J0IHRoaXMgYXQgdGhpcyBtb21lbXQqLworCXBvd2VybW5nbW50Y3RybHJlZ21hcCA9IHBvd2VybW5nbW50Y3RybHJlZ21hcCB8IChCSVQwICB8IEJJVDEzIHwgKDB4MUZGPDwxNikgfAorCQkJCUJJVDI0IHwgQklUMjUgfCBCSVQyOCB8IEJJVDMxKTsKKwlEQihtdk9zUHJpbnRmKCIlczpTaHV0dGluZyBkb3duIHVudXNlZCBpbnRlcmZhY2VzOlxuIiwgX19mdW5jX18pKTsKKwkvKiBOb3cgcmVwb3J0IGV2ZXJ5dGhpbmcgdG8gdGhlIHNjcmVlbiovCisJaWYgKCEocG93ZXJtbmdtbnRjdHJscmVnbWFwICYgQVhQX1BNQ19TQVRBU1RPUENMT0NLX01BU0soMCkpKSB7CisJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBTQVRBMFxuIiwgX19mdW5jX18pKTsKKwkJbXZDdHJsUHdyQ2xja1NldChTQVRBX1VOSVRfSUQsIDAsIE1WX0ZBTFNFKTsKKwl9CisJaWYgKCEocG93ZXJtbmdtbnRjdHJscmVnbWFwICYgQVhQX1BNQ19TQVRBU1RPUENMT0NLX01BU0soMSkpKSB7CisJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBTQVRBMVxuIiwgX19mdW5jX18pKTsKKwkJbXZDdHJsUHdyQ2xja1NldChTQVRBX1VOSVRfSUQsIDEsIE1WX0ZBTFNFKTsKKwl9CisJZm9yICh0bXBjb3VudGVyID0gMDsgdG1wY291bnRlciA8IDQ7IHRtcGNvdW50ZXIrKykgeworCQlpZiAoIShwb3dlcm1uZ21udGN0cmxyZWdtYXAgJiAoMSA8PCAoNCAtIHRtcGNvdW50ZXIpKSkpIHsKKwkJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBHQkUlZFxuIiwgX19mdW5jX18sIHRtcGNvdW50ZXIpKTsKKwkJCW12Q3RybFB3ckNsY2tTZXQoRVRIX0dJR19VTklUX0lELCB0bXBjb3VudGVyLCBNVl9GQUxTRSk7CisJCX0KKwl9CisJZm9yICh0bXBjb3VudGVyID0gMDsgdG1wY291bnRlciA8IDg7IHRtcGNvdW50ZXIrKykgeworCQlpZiAoIShwb3dlcm1uZ21udGN0cmxyZWdtYXAgJiAoMSA8PCAoNSArIHRtcGNvdW50ZXIpKSkpIHsKKwkJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBQRVglZC4lZFxuIiwgX19mdW5jX18sIHRtcGNvdW50ZXI+PjIsIHRtcGNvdW50ZXIgJSA0KSk7CisJCQltdkN0cmxQd3JDbGNrU2V0KFBFWF9VTklUX0lELCB0bXBjb3VudGVyLCBNVl9GQUxTRSk7CisJCX0KKwl9CisJaWYgKCEocG93ZXJtbmdtbnRjdHJscmVnbWFwICYgQklUMjYpKSB7CisJCURCKG12T3NQcmludGYoIiVzOiAgICAgICBQRVgyXG4iLCBfX2Z1bmNfXykpOworCQltdkN0cmxQd3JDbGNrU2V0KFBFWF9VTklUX0lELCA4LCBNVl9GQUxTRSk7CisJfQorCWlmICghKHBvd2VybW5nbW50Y3RybHJlZ21hcCAmIEJJVDI3KSkgeworCQlEQihtdk9zUHJpbnRmKCIlczogICAgICAgUEVYM1xuIiwgX19mdW5jX18pKTsKKwkJbXZDdHJsUHdyQ2xja1NldChQRVhfVU5JVF9JRCwgOSwgTVZfRkFMU0UpOworCX0KKworCWlmICghKHBvd2VybW5nbW50Y3RybHJlZ21hcCAmIEJJVDI1KSkgeworCQlEQihtdk9zUHJpbnRmKCIlczogICAgICAgVERNXG4iLCBfX2Z1bmNfXykpOworCQltdkN0cmxQd3JDbGNrU2V0KFRETV9VTklUX0lELCAwLCBNVl9GQUxTRSk7CisJfQorCisJLyogQXBwbHkgY2xvY2sgZ2F0aW5nICovCisJTVZfUkVHX1dSSVRFKFBPV0VSX01OR19DVFJMX1JFRywgTVZfUkVHX1JFQUQoUE9XRVJfTU5HX0NUUkxfUkVHKSAmIHBvd2VybW5nbW50Y3RybHJlZ21hcCk7CisJLyogVGhlIFNhdGEgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBjbG9jayBnYXRpbmcgYXQgdGhpcyBwb2ludCBzbyB3ZSBlbmFibGUgdGhlIGxvZ2ljIHRvIHRoZSBibG9jayovCisJTVZfUkVHX1dSSVRFKFBPV0VSX01OR19DVFJMX1JFRywgTVZfUkVHX1JFQUQoUE9XRVJfTU5HX0NUUkxfUkVHKSB8IChCSVQxNSB8IEJJVDMwKSk7CisjZW5kaWYgLyogZGVmaW5lZChNVl9JTkNMVURFX0NMS19QV1JfQ05UUkwpICovCisKKwlyZXR1cm4gc3RhdHVzOworZXJyX2NmZzoKKwlEQihtdk9zUHJpbnRmKCIlczogV3JvbmcgQ0ZHICglI3gpIGZvciBTRVJERVMgbGluZSAlZC5cbiIsCisJCV9fZnVuY19fLCBzZXJkZXNMaW5lQ2ZnLCBzZXJkZXNMaW5lTnVtKSk7CisJcmV0dXJuIE1WX0VSUk9SOworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxTZXJkZXNQaHlDb25maWcKICoKQEAgLTE1NDgsNiArMjA1Myw1MyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkN0cmxOYW5kQ2xrU2V0QXhwCisqCisqIERFU0NSSVBUSU9OOgorKglTZXQgdGhlIGRpdmlzaW9uIHJhdGlvIG9mIEVDQyBDbG9jayBmb3IgQVhQCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBtdkN0cmxOYW5kQ2xrU2V0QXhwKGludCBuZmNfY2xrX2ZyZXEsIE1WX1UzMiBwbGxfY2xrKQoreworCWludCBkaXZpZGVyOworCisJLyogU2V0IHRoZSBkaXZpc2lvbiByYXRpbyBvZiBFQ0MgQ2xvY2sgMHgwMDAxODc0OFsxMzo4XSAoYnkgZGVmYXVsdCBpdCdzCisJICogZG91YmxlIG9mIGNvcmUgY2xvY2spCisJICovCisJTVZfVTMyIG5WYWwgPSBNVl9SRUdfUkVBRChBWFBfQ09SRV9ESVZfQ0xLX0NUUkwoMSkpOworCisJLyogQ2FsY3VsYXRlIG5hbmQgZGl2aWRlciBmb3IgcmVxdWVzdGVkIG5mY19jbGtfZnJlcS4gSWYgaW50ZWdlciBkaXZpZGVyCisJICogY2Fubm90IGJlIGFjaGlldmVkLCBpdCB3aWxsIGJlIHJvdW5kZWQtdXAsIHdoaWNoIHdpbGwgcmVzdWx0IGluCisJICogc2V0dGluZyB0aGUgY2xvc2VzdCBsb3dlciBmcmVxdWVuY3kuCisJICogRUNDIGVuZ2luZSBjbG9jayA9IChQTEwgZnJlcXVlbmN5IC8gZGl2aWRlcikKKwkgKiBORkMgY2xvY2sgPSBFQ0MgY2xvY2sgLyAyCisJICovCisJZGl2aWRlciA9IERJVl9ST1VORF9VUChwbGxfY2xrLCAoMiAqIG5mY19jbGtfZnJlcSkpOworCURCKG12T3NQcmludGYoIiVzOiBkaXZpZGVyICVkXG4iLCBfX2Z1bmNfXywgZGl2aWRlcikpOworCisJblZhbCAmPSB+KEFYUF9OQU5EX0VDQ19ESVZDTEtfUkFUSU9fTUFTSyk7CisJblZhbCB8PSAoZGl2aWRlciA8PCBBWFBfTkFORF9FQ0NfRElWQ0xLX1JBVElPX09GRlMpOworCU1WX1JFR19XUklURShBWFBfQ09SRV9ESVZfQ0xLX0NUUkwoMSksIG5WYWwpOworCisJLyogU2V0IHJlbG9hZCBmb3JjZSBvZiBFQ0MgY2xvY2sgMHgwMDAxODc0MFs3OjBdIHRvIDB4MiAobWVhbmluZyB5b3UKKwkgKiB3aWxsIGZvcmNlIG9ubHkgdGhlIEVDQyBjbG9jaykKKwkgKi8KKwluVmFsID0gTVZfUkVHX1JFQUQoQVhQX0NPUkVfRElWX0NMS19DVFJMKDApKTsKKwluVmFsICY9IH4oQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9GT1JDRV9NQVNLKTsKKwluVmFsIHw9IEFYUF9DT1JFX0RJVkNMS19SRUxPQURfRk9SQ0VfVkFMOworCU1WX1JFR19XUklURShBWFBfQ09SRV9ESVZfQ0xLX0NUUkwoMCksIG5WYWwpOworCisJLyogU2V0IHJlbG9hZCByYXRpbyBiaXQgMHgwMDAxODc0MFs4XSB0byAxJ2IxICovCisJTVZfUkVHX0JJVF9TRVQoQVhQX0NPUkVfRElWX0NMS19DVFJMKDApLCBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX1JBVElPX01BU0spOworCW12T3NEZWxheSgxKTsgLyogIG1zZWMgKi8KKwkvKiBTZXQgcmVsb2FkIHJhdGlvIGJpdCAweDAwMDE4NzQwWzhdIHRvIDAnYjEgKi8KKwlNVl9SRUdfQklUX1JFU0VUKEFYUF9DT1JFX0RJVl9DTEtfQ1RSTCgwKSwgQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9SQVRJT19NQVNLKTsKKworCS8qIFJldHVybiBjYWxjdWxhdGVkIG5hbmQgY2xvY2sgZnJlcXVlbmN5ICovCisJcmV0dXJuIChwbGxfY2xrKS8oMiAqIGRpdmlkZXIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxOYW5kQ2xrU2V0CiAqCiAqIERFU0NSSVBUSU9OOgpAQCAtMTU2NSw5ICsyMTE3LDE0IEBACiBpbnQgbXZDdHJsTmFuZENsa1NldChpbnQgbmZjX2Nsa19mcmVxKQogewogCWludCBkaXZpZGVyOwotCU1WX1UzMiBuVmFsID0gTVZfREZYX1JFR19SRUFEKENPUkVfRElWX0NMS19DVFJMKDIpKTsKKwlNVl9VMzIgblZhbDsKIAlNVl9VMzIgcGxsX2NsayA9IG12Q3B1UGxsQ2xrR2V0KCk7CiAKKwlpZiAobXZDdHJsRGV2RmFtaWx5SWRHZXQoMCkgPT0gTVZfNzg0NjBfREVWX0lEKQorCQlyZXR1cm4gbXZDdHJsTmFuZENsa1NldEF4cChuZmNfY2xrX2ZyZXEsIHBsbF9jbGspOworCisJblZhbCA9IE1WX0RGWF9SRUdfUkVBRChDT1JFX0RJVl9DTEtfQ1RSTCgyKSk7CisKIAkvKgogCSAqIENhbGN1bGF0ZSBuYW5kIGRpdmlkZXIgZm9yIHJlcXVlc3RlZCBuZmNfY2xrX2ZyZXEuIElmIGludGVnZXIgZGl2aWRlcgogCSAqIGNhbm5vdCBiZSBhY2hpZXZlZCwgaXQgd2lsbCBiZSByb3VuZGVkLXVwLCB3aGljaCB3aWxsIHJlc3VsdCBpbgpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaCBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52TGliLmgKaW5kZXggNjI0ZDE0OS4uMWUxMTM3OSAxMDA3NTUKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZMaWIuaAorKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudkxpYi5oCkBAIC04Miw2ICs4MiwxOCBAQAogLyogdHlwZWRlZnMgKi8KIHR5cGVkZWYgTVZfU1RBVFVTKCpNVl9XSU5fR0VUX0ZVTkNfUFRSKShNVl9VMzIsIE1WX1UzMiwgTVZfVU5JVF9XSU5fSU5GTyopOwogCisvKiBTRVJERVMgZGVzY3JpcHRpb24gLSBBWFAgb25seSAqLwordHlwZWRlZiBlbnVtIHsKKwlTRVJERVNfVU5JVF9VTkNPTk5FQ1RFRAk9IDB4MCwKKwlTRVJERVNfVU5JVF9QRVgJCT0gMHgxLAorCVNFUkRFU19VTklUX1NBVEEJPSAweDIsCisJU0VSREVTX1VOSVRfU0dNSUkwCT0gMHgzLAorCVNFUkRFU19VTklUX1NHTUlJMQk9IDB4NCwKKwlTRVJERVNfVU5JVF9TR01JSTIJPSAweDUsCisJU0VSREVTX1VOSVRfU0dNSUkzCT0gMHg2LAorCVNFUkRFU19VTklUX1FTR01JSQk9IDB4NywKKwlTRVJERVNfVU5JVF9MQVNUCit9IE1WX1NFUkRFU19VTklUX0lORFg7CiAKIHR5cGVkZWYgZW51bSB7CiAJUEVYX0JVU19ESVNBQkxFRAk9IDAsCkBAIC0xNjIsMTEgKzE3NCwxMiBAQAogCiBNVl9VMzIJICBtdkN0cmxFdGhNYXhQb3J0R2V0KE1WX1ZPSUQpOwogTVZfVTgJICBtdkN0cmxFdGhNYXhDUFVzR2V0KE1WX1ZPSUQpOwotI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VU0IpCiBNVl9VMzIgbXZDdHJsVXNiTWF4R2V0KE1WX1ZPSUQpOworI2lmIGRlZmluZWQoTVZfSU5DTFVERV9VU0IpCiBNVl9VMzIgbXZDdHJsVXNiM01heEdldChNVl9WT0lEKTsKIE1WX1UzMiBtdkN0cmxVc2IzSG9zdE1heEdldChNVl9WT0lEKTsKIE1WX1ZPSUQgbXZDdHJsVXRtaVBoeVNlbGVjdG9yU2V0KE1WX1UzMiB1c2JVbml0SWQpOworTVZfQk9PTCBtdkN0cmxJc1VzYlNlckRlc0Nvbm5lY3RlZChNVl9VMzIgdXNiUG9ydCk7CiAjZW5kaWYKICNpZiBkZWZpbmVkKE1WX0lOQ0xVREVfWE9SKQogTVZfVTMyIG12Q3RybFhvck1heENoYW5HZXQoTVZfVk9JRCk7CkBAIC0xOTcsNiArMjEwLDcgQEAKIE1WX0JPT0wJICBtdkN0cmxJc0Jvb3RGcm9tTkFORChNVl9WT0lEKTsKIE1WX0JPT0wJICBtdkN0cmxQd3JNZW1HZXQoTVZfVU5JVF9JRCB1bml0SWQsIE1WX1UzMiBpbmRleCk7CiBNVl9TVEFUVVMgbXZDdHJsU2VyZGVzUGh5Q29uZmlnKE1WX1ZPSUQpOworTVZfU1RBVFVTIG12Q3RybFNlcmRlc1BoeUNvbmZpZ0F4cChNVl9WT0lEKTsKIE1WX0JPT0wgbXZDdHJsSXNETEJFbmFibGVkKE1WX1ZPSUQpOwogTVZfVTMyIG12Q3RybEREUkJ1ZFdpZHRoKE1WX1ZPSUQpOwogTVZfQk9PTCBtdkN0cmxERFJUaHJ1WGJhcihNVl9WT0lEKTsKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52UmVncy5oIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZSZWdzLmgKaW5kZXggZjFkMjYzMi4uYmM3YzQ2OCAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZSZWdzLmgKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdkN0cmxFbnZSZWdzLmgKQEAgLTE1MSw2ICsxNTEsNzMgQEAKICNkZWZpbmUgUE1DX0dFU1RPUENMT0NLX0VOKHBvcnQpCQkoMSA8PCBQTUNfR0VTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKICNkZWZpbmUgUE1DX0dFU1RPUENMT0NLX1NUT1AocG9ydCkJCSgwIDw8IFBNQ19HRVNUT1BDTE9DS19PRkZTKHBvcnQpKQogCisvKiAgUG93ZXIgTWFuYWdlbWVudCBDbG9jayBHYXRpbmcgQ29udHJvbCBSZWdpc3RlciAtIEFYUCBvbmx5ICovCisKKyNkZWZpbmUgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfT0ZGUwkJMjUKKyNkZWZpbmUgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfTUFTSwkJKDEgPDwgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19URE1TVE9QQ0xPQ0tfRU4JCQkoMSA8PCBBWFBfUE1DX1RETVNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1RETVNUT1BDTE9DS19TVE9QCQkoMCA8PCBBWFBfUE1DX1RETVNUT1BDTE9DS19PRkZTKQorCisjZGVmaW5lIEFYUF9QTUNfUEVYU1RPUENMT0NLX09GRlMocG9ydCkJCSgocG9ydCkgPCA4ID8gKDUgKyAocG9ydCkpIDogKDE4ICsgKHBvcnQpKSkKKyNkZWZpbmUgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfTUFTSyhwb3J0KQkJKDEgPDwgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKyNkZWZpbmUgQVhQX1BNQ19QRVhTVE9QQ0xPQ0tfRU4ocG9ydCkJCSgxIDw8IEFYUF9QTUNfUEVYU1RPUENMT0NLX09GRlMocG9ydCkpCisjZGVmaW5lIEFYUF9QTUNfUEVYU1RPUENMT0NLX1NUT1AocG9ydCkJCSgwIDw8IEFYUF9QTUNfUEVYU1RPUENMT0NLX09GRlMocG9ydCkpCisKKyNkZWZpbmUgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfT0ZGUyhwb3J0KQkJKChwb3J0KSA8IDMgPyAoMTggKyAocG9ydCkpIDogMCkKKyNkZWZpbmUgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfTUFTSyhwb3J0KQkJKDEgPDwgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfT0ZGUyhwb3J0KSkKKyNkZWZpbmUgQVhQX1BNQ19VU0JTVE9QQ0xPQ0tfRU4ocG9ydCkJCSgxIDw8IEFYUF9QTUNfVVNCU1RPUENMT0NLX09GRlMocG9ydCkpCisjZGVmaW5lIEFYUF9QTUNfVVNCU1RPUENMT0NLX1NUT1AocG9ydCkJCSgwIDw8IEFYUF9QTUNfVVNCU1RPUENMT0NLX09GRlMocG9ydCkpCisKKyNkZWZpbmUgQVhQX1BNQ19TRElPU1RPUENMT0NLX09GRlMJCTE3CisjZGVmaW5lIEFYUF9QTUNfU0RJT1NUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19TRElPU1RPUENMT0NLX0VOCQkoMSA8PCBBWFBfUE1DX1NESU9TVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19TRElPU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfU0RJT1NUT1BDTE9DS19PRkZTKQorCisjZGVmaW5lIEFYUF9QTUNfUlVOSVRTVE9QQ0xPQ0tfT0ZGUwkJMjQKKyNkZWZpbmUgQVhQX1BNQ19SVU5JVFNUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX1JVTklUU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfUlVOSVRTVE9QQ0xPQ0tfRU4JCSgxIDw8IEFYUF9QTUNfUlVOSVRTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19SVU5JVFNUT1BDTE9DS19TVE9QCQkoMCA8PCBBWFBfUE1DX1JVTklUU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19YT1JTVE9QQ0xPQ0tfT0ZGUwkJMjIKKyNkZWZpbmUgQVhQX1BNQ19YT1JTVE9QQ0xPQ0tfTUFTSwkJKDEgPDwgQVhQX1BNQ19YT1JTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19YT1JTVE9QQ0xPQ0tfRU4JCQkoMSA8PCBBWFBfUE1DX1hPUlNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX1hPUlNUT1BDTE9DS19TVE9QCQkoMCA8PCBBWFBfUE1DX1hPUlNUT1BDTE9DS19PRkZTKQorCisjZGVmaW5lIEFYUF9QTUNfU0FUQVNUT1BDTE9DS19PRkZTKGNoKQkJKGNoID09IDAgPyAxNCA6IDI5KQorI2RlZmluZSBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfTUFTSyhjaCkJCSgzIDw8IEFYUF9QTUNfU0FUQVNUT1BDTE9DS19PRkZTKGNoKSkKKyNkZWZpbmUgQVhQX1BNQ19TQVRBU1RPUENMT0NLX0VOKGNoKQkJKDMgPDwgQVhQX1BNQ19TQVRBU1RPUENMT0NLX09GRlMoY2gpKQorI2RlZmluZSBBWFBfUE1DX1NBVEFTVE9QQ0xPQ0tfU1RPUChjaCkJCSgwIDw8IEFYUF9QTUNfU0FUQVNUT1BDTE9DS19PRkZTKGNoKSkKKworI2RlZmluZSBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfT0ZGUwkJMjMKKyNkZWZpbmUgQVhQX1BNQ19DRVNBU1RPUENMT0NLX01BU0sJCSgxIDw8IEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfRU4JCSgxIDw8IEFYUF9QTUNfQ0VTQVNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX0NFU0FTVE9QQ0xPQ0tfU1RPUAkJKDAgPDwgQVhQX1BNQ19DRVNBU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19HRVNUT1BDTE9DS19PRkZTKHBvcnQpCQkoKHBvcnQpIDwgNCA/ICg0IC0gKHBvcnQpKSA6IDApCisjZGVmaW5lIEFYUF9QTUNfR0VTVE9QQ0xPQ0tfTUFTSyhwb3J0KQkJKDEgPDwgQVhQX1BNQ19HRVNUT1BDTE9DS19PRkZTKHBvcnQpKQorI2RlZmluZSBBWFBfUE1DX0dFU1RPUENMT0NLX0VOKHBvcnQpCQkoMSA8PCBBWFBfUE1DX0dFU1RPUENMT0NLX09GRlMocG9ydCkpCisjZGVmaW5lIEFYUF9QTUNfR0VTVE9QQ0xPQ0tfU1RPUChwb3J0KQkJKDAgPDwgQVhQX1BNQ19HRVNUT1BDTE9DS19PRkZTKHBvcnQpKQorCisjZGVmaW5lIEFYUF9QTUNfTkVUQVNUT1BDTE9DS19PRkZTCQkxMworI2RlZmluZSBBWFBfUE1DX05FVEFTVE9QQ0xPQ0tfTUFTSwkJKDEgPDwgQVhQX1BNQ19ORVRBU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfTkVUQVNUT1BDTE9DS19FTgkJKDEgPDwgQVhQX1BNQ19ORVRBU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfTkVUQVNUT1BDTE9DS19TVE9QCQkoMCA8PCBBWFBfUE1DX05FVEFTVE9QQ0xPQ0tfT0ZGUykKKworI2RlZmluZSBBWFBfUE1DX0xDRFNUT1BDTE9DS19PRkZTCQkxNgorI2RlZmluZSBBWFBfUE1DX0xDRFNUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX0xDRFNUT1BDTE9DS19PRkZTKQorI2RlZmluZSBBWFBfUE1DX0xDRFNUT1BDTE9DS19FTgkJCSgxIDw8IEFYUF9QTUNfTENEU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfTENEU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfTENEU1RPUENMT0NLX09GRlMpCisKKyNkZWZpbmUgQVhQX1BNQ19JRE1BU1RPUENMT0NLX09GRlMJCTIxCisjZGVmaW5lIEFYUF9QTUNfSURNQVNUT1BDTE9DS19NQVNLCQkoMSA8PCBBWFBfUE1DX0lETUFTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19JRE1BU1RPUENMT0NLX0VOCQkoMSA8PCBBWFBfUE1DX0lETUFTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19JRE1BU1RPUENMT0NLX1NUT1AJCSgwIDw8IEFYUF9QTUNfSURNQVNUT1BDTE9DS19PRkZTKQorCisjZGVmaW5lIEFYUF9QTUNfRERSU1RPUENMT0NLX09GRlMJCTI4CisjZGVmaW5lIEFYUF9QTUNfRERSU1RPUENMT0NLX01BU0sJCSgxIDw8IEFYUF9QTUNfRERSU1RPUENMT0NLX09GRlMpCisjZGVmaW5lIEFYUF9QTUNfRERSU1RPUENMT0NLX0VOCQkJKDEgPDwgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfT0ZGUykKKyNkZWZpbmUgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfU1RPUAkJKDAgPDwgQVhQX1BNQ19ERFJTVE9QQ0xPQ0tfT0ZGUykKKwogLyogZHVtbXkgZGVmZW5pdGlvbiwgdXNlZCBmb3IgU0dNSUkgY2FwYWJsZSBpbnRlcmZhY2VzICovCiAjZGVmaW5lIFNHTUlJX1NFUkRFU19DRkdfUkVHKHBvcnQpCQkoMCkKIApAQCAtMTU4LDYgKzIyNSwyNyBAQAogCiAjZGVmaW5lIE1QUF9DT05UUk9MX1JFRyhpZCkJCQkoMHgxODAwMCArIChpZCAqIDQpKQogCisvKiBTd2l0Y2ggY29yZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVZfUFBfQUREQ09NUF9DTkNUUkwgMHgwMDAwMDE0MAorI2RlZmluZSBNVl9QUF9BRERDT01QX1JFRyhuKSAoMHgwMDAwMDEyMCArIDQqbikKKyNkZWZpbmUgTVZfUFBfQUREQ09NUF9NT0RFX0JJVAkJCTE2CisjZGVmaW5lIE1WX1BQX0FERENPTVBfTU9ERV9NQVNLCQkJKDEgPDwgTVZfUFBfQUREQ09NUF9NT0RFX0JJVCkKKworI2RlZmluZSBNVl9QUF9TTUlfTUlTQ19DT05GSUdfT0ZGU0VUIDB4NAorI2RlZmluZSBNVl9QUF9TTUlfSU5WRVJUX01EQ19CSVQgICAgICAgICAgMTEKKyNkZWZpbmUgTVZfUFBfU01JX0lOVkVSVF9NRENfTUFTSyAgICAgICAgICgxIDw8IE1WX1BQX1NNSV9JTlZFUlRfTURDX0JJVCkKKworI2RlZmluZSBNVl9QUF9FVEhfQUREQ09NUF9JTkRFWCAxCisjZGVmaW5lIE1WX1BQX0VUSF9SRUdfQkFTRV9OT1JOQUwgKFNXSVRDSF9SRUdTX1ZJUlRfQkFTRSB8IE1WX1BQX0VUSF9BRERDT01QX0lOREVYPDwxOSkKKyNkZWZpbmUgTVZfUFBfRVRIX1JFR19CQVNFX0xFR0FDWSAoU1dJVENIX1JFR1NfVklSVF9CQVNFIHwgTVZfUFBfRVRIX0FERENPTVBfSU5ERVg8PDI0KQorCisvKiBTYW1wbGUgYXQgUmVzZXQgLSBBWFAgb25seSAqLworI2RlZmluZSBNUFBfU0FNUExFX0FUX1JFU0VUKGlkKQkJCSgweDE4MjMwICsgKGlkICogNCkpCisKKy8qIENvbnRyb2xsZXIgZW52aXJvbm1lbnQgYW5kIFNFUkRFUlMgcmVnaXN0ZXJzIC0gQVhQIG9ubHkgKi8KKyNkZWZpbmUgU0VSREVTX0xJTkVfTVVYX1JFR18wXzcJCQkweDE4MjcwCisjZGVmaW5lIEdFTl9QVVJQX1JFU18yX1JFRwkJCTB4MTgyRjgKKwogLyogRHJhZ29uaXRlIFJlZ2lzdGVyICovCiAjZGVmaW5lIERSQUdPTklURV9DVFJMX1JFRwkJCTB4MWMKICNkZWZpbmUgRFJBR09OSVRFX1BPRV9DQVVTRV9JUlFfUkVHCQkweDY0CkBAIC0xNzgsNiArMjY2LDkgQEAKICNkZWZpbmUgTVNBUl9BQzNfQk9PVF9NT0RFKHNhcjEsIHNhcjIpCSgoKHNhcjEpID4+IDExKSAmIDB4NykJCS8qIGJvb3QgZnJvbSAqLwogI2RlZmluZSBNU0FSX0FDM19UTV9DTEsoc2FyMSwgc2FyMikJKCgoc2FyMikgPj4gMTcpICYgMHgxKQkJLyogUExMIDIgY29uZmlnICovCiAKKyNkZWZpbmUgTVNBUl9CT0JLX0JPT1RfTU9ERShzYXIxLCBzYXIyKQkoKChzYXIxKSA+PiAxMykgJiAweDcpCQkvKiBib290IGZyb20gKi8KKyNkZWZpbmUgTVNBUl9CT0JLX1RNX0NMSyhzYXIxLCBzYXIyKQkoKChzYXIyKSA+PiAxNSkgJiAweDcpCQkvKiBQTEwgMiBjb25maWcgKi8KKwogI2RlZmluZSBTQVIxX0JPT1RfRlJPTV9OT1IJCQkwCiAjZGVmaW5lIFNBUjFfQk9PVF9GUk9NX05BTkQJCQkxCiAjZGVmaW5lIFNBUjFfQk9PVF9GUk9NX1VBUlQJCQkyCkBAIC0yMDksMTAgKzMwMCwyMyBAQAogCiAjZGVmaW5lIENPUkVfRElWX0NMS19DVFJMKG51bSkJCQkoREZYX0NPUkVfRElWQ0xLX0NPTlRST0wwX1JFRyArICgobnVtKSAqIDB4NCkpCiAKLQogI2RlZmluZSBERlhfVEVNUEVSQVRVUkVfU0VOU09SX0xTQl9DVFJMX1JFRwkJMHhGODA3MAogI2RlZmluZSBERlhfVEVNUEVSQVRVUkVfU0VOU09SX01TQl9DVFJMX1JFRwkJMHhGODA3NAogI2RlZmluZSBERlhfVEVNUEVSQVRVUkVfU0VOU09SX1NUQVRVU19SRUcJCTB4RjgwNzgKKworLyogQ29yZSBEaXZpZGVyIENsb2NrIENvbnRyb2wgLSBBWFAgb25seSAqLworI2RlZmluZSBBWFBfQ09SRV9ESVZfQ0xLX0NUUkwobnVtKQkJKDB4MTg3NDAgKyAoKG51bSkgKiAweDgpKQorCisjZGVmaW5lIEFYUF9DT1JFX0RJVkNMS19SRUxPQURfRk9SQ0VfT0ZGUwkwCisjZGVmaW5lIEFYUF9DT1JFX0RJVkNMS19SRUxPQURfRk9SQ0VfTUFTSwkoMHhGRiA8PCBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX0ZPUkNFX09GRlMpCisjZGVmaW5lIEFYUF9DT1JFX0RJVkNMS19SRUxPQURfRk9SQ0VfVkFMCSgweDIgPDwgQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9GT1JDRV9PRkZTKQorCisjZGVmaW5lIEFYUF9OQU5EX0VDQ19ESVZDTEtfUkFUSU9fT0ZGUwkJOAorI2RlZmluZSBBWFBfTkFORF9FQ0NfRElWQ0xLX1JBVElPX01BU0sJCSgweDNGIDw8IEFYUF9OQU5EX0VDQ19ESVZDTEtfUkFUSU9fT0ZGUykKKworI2RlZmluZSBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX1JBVElPX09GRlMJOAorI2RlZmluZSBBWFBfQ09SRV9ESVZDTEtfUkVMT0FEX1JBVElPX01BU0sJKDEgPDwgQVhQX0NPUkVfRElWQ0xLX1JFTE9BRF9SQVRJT19PRkZTKQorCiAvKiBkZWZpbml0aW9uIGZvciBjYWN1bGF0ZSBUZW1wZXJhdHVyZSAqLwogI2RlZmluZSBURU1QRVJBVFVSRV9PRkZTRVQgICAgICAgICg1OTYpCiAjZGVmaW5lIFRFTVBFUkFUVVJFX0ZBQ1RPUiAgICAgICAgKDIxNTQpCkBAIC0yNTUsNiArMzU5LDcgQEAKICNkZWZpbmUJSUNEUl9VSU5JVF9JRF9NQVNLCTB4MEYKICNkZWZpbmUgSUNEUl9VTklUX0lEXzRfREZYCTB4MGYKIAorI2RlZmluZSBDUExEX1JEX01UTF9CQzJfQk9BUkRfUkVWX1JFRwkyCiAjZGVmaW5lIENQTERfQk9BUkRfUkVWX1JFRwkxCiAjZGVmaW5lIENQTERfQk9BUkRfUkVWX01BU0sJMHg3CiAjZGVmaW5lIENQTERfUkVWX1JFRwkJMgpAQCAtMjYzLDI3ICszNjgsMTE0IEBACiAjZGVmaW5lIERFVl9JRF9SRUcJCQkJMHgxODIzQwogI2RlZmluZSBERVZJQ0VfSURfT0ZGUwkJCTAKICNkZWZpbmUgREVWSUNFX0lEX01BU0sJCQkweEZGRkYKLSNkZWZpbmUgREVWSUNFX0ZMQVZPUl9NQVNLCQkweEZGCisKKy8qIGZvciBCb2JLIGRldklELCBDZXR1czogMHhCRTAwIENhZWx1bToweEJDMDAsIHRoZSBoaWdoZXIgNmJpdHMgYXJlIHRoZSBzYW1lLgorc28gdXBkYXRlIG1hc2sgdG8gMHgzRkYsIGZvciBCQzIgZmxhdm9yKDB4RjRYWCksIGFuZCBBQzMgZmxhdm9yKDB4RkMwMCksCit0aGUgaGlnaGVyIDZiaXRzIGFyZSBhbHNvIHRoZSBzYW1lLCBzbyBjYW4gd29yayBub3JtYWxseSAqLworI2RlZmluZSBERVZJQ0VfRkxBVk9SX01BU0sJCTB4M0ZGCisKKyNkZWZpbmUgQk9CS19GTEFWT1JfTUFTSwkJMHhGRgkvKiBvbmx5IGZvciBDZXR1cyAmIENhZWx1bSBmbGF2b3IgKi8KICNkZWZpbmUgREVWX1JFVl9JRF9SRUcJCQkweEY4MjQ0CiAjZGVmaW5lIFJFVklTT05fSURfT0ZGUwkJCTI4CiAjZGVmaW5lIFJFVklTT05fSURfTUFTSwkJCTB4RjAwMDAwMDAKIAogLyogRXh0cmFjdCBDUFUsIEwyLCBERFIgY2xvY2tzIFNBUiB2YWx1ZSBmcm9tCi0qKiBTQVIgYml0cyAyNC0yNwotKi8KKyAqIFNBUiBiaXRzIDI0LTI3IC0gQVhQIG9ubHkKKyAqLworI2RlZmluZSBNU0FSX0NQVV9DTEtfSURYKHNhcjAsIHNhcjEpCQkoKCgoc2FyMCkgPj4gMjEpICYgMHg3KSArICgoKChzYXIxKSA+PiAyMCkgJiAxKSA8PCAzKSkKKyNkZWZpbmUgTVNBUl9DUFVfQ0xLX1RXU0koc2FyMCwgc2FyMSkJCSgoKChzYXIwKSA+PiAyKSAgJiAweDcpICsgKCgoc2FyMSkgJiAxKSA8PCAzKSkKKyNkZWZpbmUgTVNBUl9ERFJfTDJfQ0xLX1JBVElPX0lEWChzYXIwLCBzYXIxKQkoKCgoc2FyMCkgPj4gMjQpICYgMHhGKSArICgoKChzYXIxKSA+PiAxOSkgJiAxKSA8PCA0KSkKKyNkZWZpbmUgTVNBUl9ERFJfTDJfQ0xLX1JBVElPX1RXU0koc2FyMCkJKCgoc2FyMCkgPj4gMSkgICYgMHhGKQogCisvKiBTQVIgVENMSyBiaXQgLSBBWFAgb25seSAqLworI2RlZmluZSBNU0FSX1RDTEtfT0ZGUwkJCQkyOAorI2RlZmluZSBNU0FSX1RDTEtfTUFTSwkJCQkoMHgxIDw8IE1TQVJfVENMS19PRkZTKQorCisvKiBQTEwoQ1BVKSBpbnB1dCBjbG9jayAtIEFYUCBvbmx5ICovCisjZGVmaW5lIEFYUF9QTExfSU5fQ0xLCQkJXzJHSHoKIAogI2lmbmRlZiBNVl9BU01MQU5HVUFHRQogCisjZGVmaW5lIE1WX0NQVV9DTEtfVEJMX0FYUCB7IDEwMDAsIDEwNjYsIDEyMDAsIDEzMzMsIDE1MDAsIDE2NjYsIDE4MDAsIDIwMDAsXAorCQkJICAgICAgNjAwLCAgNjY3LCAgODAwLCAxNjAwLCAyMTMzLCAyMjAwLCAyNDAwLCAwIH0KIAorLyoJCWNwdQlsMmMJaGNsawlkZHIJKi8KKyNkZWZpbmUgTVZfRERSX0wyX0NMS19SQVRJT19UQkxfQVhQIHsgXAorLyowMCovCXsJMSwJMSwJNCwJMgl9LFwKKy8qMDEqLwl7CTEsCTIsCTIsCTIJfSxcCisvKjAyKi8JewkyLAkyLAk2LAkzCX0sXAorLyowMyovCXsJMiwJMiwJMywJMwl9LFwKKy8qMDQqLwl7CTEsCTIsCTMsCTMJfSxcCisvKjA1Ki8JewkxLAkyLAk0LAkyCX0sXAorLyowNiovCXsJMSwJMSwJMiwJMgl9LFwKKy8qMDcqLwl7CTIsCTMsCTYsCTYJfSxcCisvKjA4Ki8JewkyLAkzLAk1LAk1CX0sXAorLyowOSovCXsJMSwJMiwJNiwJMwl9LFwKKy8qMTAqLwl7CTIsCTQsCTEwLAk1CX0sXAorLyoxMSovCXsJMSwJMywJNiwJNgl9LFwKKy8qMTIqLwl7CTEsCTIsCTQsCTQJfSxcCisvKjEzKi8JewkxLAkzLAk2LAkzCX0sXAorLyoxNCovCXsJMSwJMiwJNSwJNQl9LFwKKy8qMTUqLwl7CTIsCTIsCTUsCTUJfSxcCisvKjE2Ki8JewkxLAkxLAkzLAkzCX0sXAorLyoxNyovCXsJMiwJNSwJMTAsCTEwCX0sXAorLyoxOCovCXsJMSwJMywJOCwJNAl9LFwKKy8qMTkqLwl7CTEsCTEsCTIsCTEJfSxcCisvKjIwKi8JewkyLAkzLAk2LAkzCX0sXAorLyoyMSovCXsJMSwJMiwJOCwJNAl9LFwKKy8qMjIqLwl7CTIsCTUsCTEwLAk1CX0gXAorfQorCisvKiBUaGlzIHN0cnVjdHVyZSByZWZyZWN0IHJlZ2lzdGVyczoKKyAqIFNlcmRlcyAwLTcgc2VsZWN0b3JzCQkweDE4MjcwCisgKiBhbmQgU2VyZGVzIDgtMTUgc2VsZWN0b3JzCTB4MTgyNzQKKyAqIEFYUCBvbmx5CisgKi8KKworI2RlZmluZSBTRVJERVNfQ0ZHX0FYUCB7IFwKKwl7MCwgMSwgLTEgLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAvKiBMYW5lIDAgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMSAqLwlcCisJezAsIDEsIC0xICwgIDIsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSAyICovCVwKKwl7MCwgMSwgLTEgLCAtMSwgIDIsIC0xLCAtMSwgIDN9LCAvKiBMYW5lIDMgKi8JXAorCXswLCAxLCAgMiAsIC0xLCAtMSwgIDMsIC0xLCAtMX0sIC8qIExhbmUgNCAqLwlcCisJezAsIDEsICAyICwgLTEsICAzLCAtMSwgLTEsICA0fSwgLyogTGFuZSA1ICovCVwKKwl7MCwgMSwgIDIgLCAgNCwgLTEsICAzLCAtMSwgLTF9LCAvKiBMYW5lIDYgKi8JXAorCXswLCAxLCAtMSAsICAyLCAtMSwgLTEsICAzLCAtMX0sIC8qIExhbmUgNyAqLwlcCisJezAsIDEsIC0xICwgLTEsIC0xLCAtMSwgLTEsIC0xfSwgLyogTGFuZSA4ICovCVwKKwl7MCwgMSwgLTEgLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAvKiBMYW5lIDkgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMTAgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMTEgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMTIgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMTMgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0sIC8qIExhbmUgMTQgKi8JXAorCXswLCAxLCAtMSAsIC0xLCAtMSwgLTEsIC0xLCAtMX0JIC8qIExhbmUgMTUgKi8JXAorfQogLyogVGhlc2UgbWFjcm9zIGhlbHAgdW5pdHMgdG8gaWRlbnRpZnkgYSB0YXJnZXQgTXBvcnQgQXJiaXRlciBncm91cCAqLwogI2RlZmluZSBNVl9UQVJHRVRfSVNfRFJBTSh0YXJnZXQpICAgXAogCQkoKHRhcmdldCA+PSBTRFJBTV9DUzApICYmICh0YXJnZXQgPD0gU0RSQU1fQ1MzKSkKIAogI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYMCh0YXJnZXQpICAgXAogCQkoKHRhcmdldCA+PSBQRVgwX01FTSkgJiYgKHRhcmdldCA8PSBQRVgwX0lPKSkKKyNkZWZpbmUgTVZfVEFSR0VUX0lTX1BFWDEodGFyZ2V0KSAgIFwKKwkJKCh0YXJnZXQgPj0gKE1WXzgpUEVYMV9NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYMV9JTykpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVgyKHRhcmdldCkgICBcCisJCSgodGFyZ2V0ID49IChNVl84KVBFWDJfTUVNKSAmJiAodGFyZ2V0IDw9IChNVl84KVBFWDJfSU8pKQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYMyh0YXJnZXQpICAgXAorCQkoKHRhcmdldCA+PSAoTVZfOClQRVgzX01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVgzX0lPKSkKKyNkZWZpbmUgTVZfVEFSR0VUX0lTX1BFWDQodGFyZ2V0KSAgIFwKKwkJKCh0YXJnZXQgPj0gKE1WXzgpUEVYNF9NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYNF9JTykpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVg1KHRhcmdldCkgICBcCisJCSgodGFyZ2V0ID49IChNVl84KVBFWDVfTUVNKSAmJiAodGFyZ2V0IDw9IChNVl84KVBFWDVfSU8pKQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYNih0YXJnZXQpICAgXAorCQkoKHRhcmdldCA+PSAoTVZfOClQRVg2X01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVg2X0lPKSkKKyNkZWZpbmUgTVZfVEFSR0VUX0lTX1BFWDcodGFyZ2V0KSAgIFwKKwkJKCh0YXJnZXQgPj0gKE1WXzgpUEVYN19NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYN19JTykpCisjZGVmaW5lIE1WX1RBUkdFVF9JU19QRVg4KHRhcmdldCkgICBcCisJCSgodGFyZ2V0ID49IChNVl84KVBFWDhfTUVNKSAmJiAodGFyZ2V0IDw9IChNVl84KVBFWDhfSU8pKQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYOSh0YXJnZXQpICAgXAorCQkoKHRhcmdldCA+PSAoTVZfOClQRVg5X01FTSkgJiYgKHRhcmdldCA8PSAoTVZfOClQRVg5X0lPKSkKIAotI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYKHRhcmdldCkJTVZfVEFSR0VUX0lTX1BFWDAodGFyZ2V0KQorI2RlZmluZSBNVl9UQVJHRVRfSVNfUEVYKHRhcmdldCkJKCh0YXJnZXQgPj0gUEVYMF9NRU0pICYmICh0YXJnZXQgPD0gKE1WXzgpUEVYOV9JTykpCiAKICNkZWZpbmUgTVZfVEFSR0VUX0lTX0RFVklDRSh0YXJnZXQpCSgodGFyZ2V0ID49IERFVklDRV9DUzApICYmICh0YXJnZXQgPD0gREVWSUNFX0NTMykpCiAKQEAgLTMyMSw3ICs1MTMsMTYgQEAKIAogdHlwZWRlZiBlbnVtIHsKIAlQRVgwXzB4NAk9IDAsCi0JUEVYSUZfTUFYCT0gMQorCVBFWDBfMXg0CT0gMSwKKwlQRVgwXzJ4NAk9IDIsCisJUEVYMF8zeDQJPSAzLAorCVBFWDFfMHg0CT0gNCwKKwlQRVgxXzF4NAk9IDUsCisJUEVYMV8yeDQJPSA2LAorCVBFWDFfM3g0CT0gNywKKwlQRVgyXzB4NAk9IDgsCisJUEVYM18weDQJPSA5LAorCVBFWElGX01BWAk9IDEwCiB9IE1WX1BFWElGX0lORFg7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTM0NCw2ICs1NDUsMjQgQEAKIAkJNDUwCQkJCQlcCiAJfQogCisjZGVmaW5lIE1WX0NPUkVfQ0xLX1RCTF9CT0JLX0NFVFVTCXsJXAorCQkzNjUsIDIyMCwJCQlcCisJCTI1MCwgMjAwLAkJCVwKKwkJMTY3CQkJCQlcCisJfQorCisjZGVmaW5lIE1WX0NPUkVfQ0xLX1RCTF9CT0JLX0NBRUxVTQl7CVwKKwkJMzY1LCAyMjAsCQkJXAorCQkyNTAsIDIwMCwJCQlcCisJCTE2NywgMTMzCQkJXAorCX0KKworI2RlZmluZSBNVl9CWVBBU1NfQ09SRV9DTEtfVEJMX0JPQksJewlcCisJCTM2NSwgMjIwLAkJCVwKKwkJMjUwLCAyMDAsCQkJXAorCQkxNjcJCQkJCVwKKwl9CisKICNkZWZpbmUgTVZfQ09SRV9DTEtfVEJMX0FDMwl7CVwKIAkJMjkwLCAyNTAsCQkJXAogCQkyMjIsIDE2NywJCQlcCkBAIC0zNjIsNiArNTgxLDI2IEBACiAJezEzMzMsIDY2NiwgMTYwMCwgTVZfVFJVRX0JXAogfQogCisjZGVmaW5lIE1WX0NQVV9ERFJfQ0xLX1RCTF9CT0JLX0NFVFVTIHsJXAorCXsgNDAwLCA0MDAsICA0MDAsIE1WX0ZBTFNFfSwJXAorCXsxMDAwLCA2NjcsIDIwMDAsIE1WX0ZBTFNFfSwJXAorCXsgNjY3LCA2NjcsIDIwMDAsIE1WX0ZBTFNFfSwJXAorCXsgODAwLCA4MDAsICA4MDAsIE1WX0ZBTFNFfSwJXAorCXsxMjAwLCA4MDAsIDI0MDAsIE1WX0ZBTFNFfSwJXAorCXsgODAwLCA0MDAsICA4MDAsIE1WX0ZBTFNFfSwJXAorCXsgODAwLCA4MDAsICA4MDAsIE1WX1RSVUV9CVwKK30KKworI2RlZmluZSBNVl9DUFVfRERSX0NMS19UQkxfQk9CS19DQUVMVU0gewlcCisJeyA0MDAsIDQwMCwgIDQwMCwgTVZfRkFMU0V9LAlcCisJezEwMDAsIDY2NywgMjAwMCwgTVZfVFJVRX0sCVwKKwl7IDY2NywgNjY3LCAyMDAwLCBNVl9GQUxTRX0sCVwKKwl7IDgwMCwgODAwLCAgODAwLCBNVl9GQUxTRX0sCVwKKwl7MTIwMCwgODAwLCAyNDAwLCBNVl9UUlVFfSwJXAorCXsgODAwLCA0MDAsICA4MDAsIE1WX0ZBTFNFfSwJXAorCXsgODAwLCA4MDAsICA4MDAsIE1WX1RSVUV9CVwKK30KKwogI2RlZmluZSBNVl9DUFVfRERSX0NMS19UQkxfQUMzIHsJXAogCXsgNTMzLCA1MzMsICA1MzMsIE1WX1RSVUV9LAlcCiAJeyA2NjcsIDY2NywgMjAwMCwgTVZfRkFMU0V9LAlcCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212Q3RybEVudlNwZWMuaCBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCmluZGV4IDIxMDI2ZTkuLjY4NTRiOTUgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZDdHJsRW52U3BlYy5oCkBAIC03MCwxOSArNzAsMjMgQEAKIAogI2luY2x1ZGUgImN0cmxFbnYvc3lzL212Q3B1SWZSZWdzLmgiCiAKKyNkZWZpbmUgTUFYX1RBUkdFVFMJKG12Q3RybERldkZhbWlseUlkR2V0KDApID09IE1WXzc4NDYwX0RFVl9JRCA/IFwKKwkJCSBNQVhfVEFSR0VUU19BWFAgOiBNQVhfVEFSR0VUU19NU1lTKQogCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNkZWZpbmUgTVZfQVJNX1NPQwotI2lmZGVmIENPTkZJR19BTExFWUNBVDMKKyNpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKICNkZWZpbmUgU09DX05BTUVfUFJFRklYCQkJCSJBbGxleWNhdDMiCi0jZWxzZQorI2VsaWYgZGVmaW5lZCBDT05GSUdfQk9CQ0FUMgogI2RlZmluZSBTT0NfTkFNRV9QUkVGSVgJCQkJIkJvYmNhdDIiCisjZWxzZQorI2RlZmluZSBTT0NfTkFNRV9QUkVGSVgJCQkJIkJvYksiCiAjZW5kaWYKIC8qCi0gKiBCb2JjYXQyIFVuaXRzIEFkZHJlc3MgZGVjb2RpbmcKKyAqIEJvYmNhdDIvQVhQIFVuaXRzIEFkZHJlc3MgZGVjb2RpbmcKICAqLwogI2RlZmluZSBNVl9EUkFNX1JFR1NfT0ZGU0VUCQkJKDB4MCkKICNkZWZpbmUgTVZfQVVST1JBX0wyX1JFR1NfT0ZGU0VUCQkoMHg4MDAwKQpAQCAtOTIsOSArOTYsMTEgQEAKICNkZWZpbmUgTVZfVFdTSV9TTEFWRV9SRUdTX09GRlNFVChjaGFuTnVtKQkoMHgxMTAwMCArIChjaGFuTnVtICogMHgxMDApKQogCiAjZGVmaW5lIE1WX1VBUlRfUkVHU19PRkZTRVQoY2hhbk51bSkJCSgweDEyMDAwICsgKGNoYW5OdW0gKiAweDEwMCkpCisjZGVmaW5lIE1WX1JVTklUX1BNVV9SRUdTX09GRlNFVAkJKDB4MUMwMDApCiAKICNkZWZpbmUgTVZfTVBQX1JFR1NfT0ZGU0VUCQkJKDB4MTgwMDApCiAjZGVmaW5lIE1WX0dQUF9SRUdTX09GRlNFVCh1bml0KQkJKDB4MTgxMDAgKyAoKHVuaXQpICogMHg4MCkpCisjZGVmaW5lIE1WX0dQUF9SRUdTX09GRlNFVF9BWFAodW5pdCkJCSgweDE4MTAwICsgKCh1bml0KSAqIDB4NDApKQogCiAjZGVmaW5lIE1WX01JU0NfUkVHU19PRkZTRVQJCQkoMHgxODIwMCkKICNkZWZpbmUgTVZfQ0xLX0NNUExYX1JFR1NfT0ZGU0VUCQkoMHgxODcwMCkKQEAgLTEwOCwxNiArMTE0LDIxIEBACiAjZGVmaW5lIE1WX0NQVUlGX1JFR1NfT0ZGU0VUKGNwdSkJCSgweDIxODAwICsgKGNwdSkgKiAweDEwMCkKICNkZWZpbmUgTVZfUE1VX05GQUJSSUNfVU5JVF9TRVJWX09GRlNFVAkJKDB4MjIwMDApCiAjZGVmaW5lIE1WX0NQVV9QTVVfVU5JVF9TRVJWX09GRlNFVChjcHUpCSgweDIyMTAwICsgKGNwdSkgKiAweDEwMCkKKyNkZWZpbmUgTVZfQ1BVX0hXX1NFTV9PRkZTRVQJCQkoMHgyMDUwMCkKICNkZWZpbmUgTVZfRVRIX0JBU0VfQUREUgkJCSgweDcwMDAwKQotI2RlZmluZSBNVl9FVEhfUkVHU19PRkZTRVQocG9ydCkJCShNVl9FVEhfQkFTRV9BRERSICsgKHBvcnQpICogMHg0MDAwKQorI2RlZmluZSBNVl9FVEhfUkVHU19PRkZTRVQocG9ydCkJCShNVl9FVEhfQkFTRV9BRERSIC0gKChwb3J0KSAvIDIpICogMHg0MDAwMCArICgocG9ydCkgJSAyKSAqIDB4NDAwMCkKICNkZWZpbmUgTVZfUEVYX0lGX1JFR1NfT0ZGU0VUKHBleElmKVwKIAkJCShwZXhJZiA8IDggPyAoMHg0MDAwMCArICgocGV4SWYpIC8gNCkgKiAweDQwMDAwICsgKChwZXhJZikgJSA0KSAqIDB4NDAwMClcCiAJOiAoMFg0MjAwMCArICgocGV4SWYpICUgOCkgKiAweDQwMDAwKSkKICNkZWZpbmUgTVZfVVNCX1JFR1NfT0ZGU0VUKGRldikJCQkoMHg1MDAwMCArIChkZXYgKiAweDEwMDApKQorI2RlZmluZSBNVl9VU0IyX1VTQjNfUkVHU19PRkZTRVQodW5pdFR5cGUsIGRldikgKE1WX1VTQl9SRUdTX09GRlNFVChkZXYpKQogI2RlZmluZSBNVl9YT1JfUkVHU19PRkZTRVQodW5pdCkJCSgweEYwODAwKQorI2RlZmluZSBNVl9YT1JfUkVHU19PRkZTRVRfQVhQKHVuaXQpCQkodW5pdCA/IDB4RjA5MDAgOiAweDYwOTAwKQogI2lmIGRlZmluZWQoTVZfSU5DTFVERV9JRE1BKQogI2RlZmluZSBNVl9JRE1BX1JFR1NfT0ZGU0VUCQkJKDB4NjA4MDApCiAjZW5kaWYKKyNkZWZpbmUgTVZfQ0VTQV9URE1BX1JFR1NfT0ZGU0VUKGNoYW5OdW0pCSgweDkwMDAwICsgKGNoYW5OdW0gKiAweDIwMDApKQorI2RlZmluZSBNVl9DRVNBX1JFR1NfT0ZGU0VUKGNoYW5OdW0pCQkoMHg5RDAwMCArIChjaGFuTnVtICogMHgyMDAwKSkKICNkZWZpbmUgTVZfU0FUQV9SRUdTX09GRlNFVAkJCSgweEEwMDAwKQogI2RlZmluZSBNVl9DT01NX1VOSVRfUkVHU19PRkZTRVQJCSgweEIwMDAwKQogI2RlZmluZSBNVl9ORkNfUkVHU19PRkZTRVQJCQkoMHhEMDAwMCkKQEAgLTEyNiw4ICsxMzcsMTEgQEAKICNkZWZpbmUgTVZfU0RNTUNfUkVHU19PRkZTRVQJCQkoMHhENDAwMCkKIAogI2RlZmluZSBNVl9VU0IyX0NBUExFTkdUSF9PRkZTRVQoaW5kZXgpCQkoSU5URVJfUkVHU19CQVNFICsgTVZfVVNCX1JFR1NfT0ZGU0VUKGluZGV4KSArIDB4MTAwKQotCiAjZGVmaW5lIE1WX0VUSF9TTUlfUE9SVCAgIDAKKworI2RlZmluZSBNVl9QUF9TTUlfQkFTRShuKSAoMHg1NDAwMDAwMCArIDB4MDEwMDAwMDAqbikKKyNkZWZpbmUgTVZfUFBfRVRIX1NNSV9QT1JUIDAKKwogLyoKICAqIE1pc2NlbGxhbnVvdXMgQ29udHJvbGxlciBDb25maWd1cmF0aW9ucwogICovCkBAIC0xNDIsMTcgKzE1NiwxOSBAQAogI2RlZmluZSBUV1NJMF9DUFVfTUFJTl9JTlRfQklUKGNoKQkJKChjaCkgKyAzKQogI2RlZmluZSBUV1NJX1NQRUVECQkJCTEwMDAwMAogCi0jZGVmaW5lIE1WX0dQUF9NQVhfUElOUwkJCQkzMworI2RlZmluZSBNVl9HUFBfTUFYX1BJTlMJCQkJNjgKICNkZWZpbmUgTVZfR1BQX01BWF9HUk9VUCAgICAJCQkyIAkvKiBncm91cCA9PSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyPyAqLworI2RlZmluZSBNVl9HUFBfTUFYX0dST1VQX0FYUAkJCTMKICNkZWZpbmUgTVZfQ05UTVJfTUFYX0NPVU5URVIgCQkJOCAJLyogNCBnbG9iYWwgKyAxIGdsb2JhbCBXRCArIDIgY3VycmVudCBwcml2YXRlIENQVSArIDEgcHJpdmF0ZSBDUFUgV0QqLwogCiAjZGVmaW5lIE1WX1VBUlRfTUFYX0NIQU4JCQkyCiAKLSNkZWZpbmUgTVZfWE9SX01BWF9VTklUCQkJCTEgLyogWE9SIHVuaXQgPT0gWE9SIGVuZ2luZSAqLwotI2RlZmluZSBNVl9YT1JfTUFYX0NIQU4gICAgICAgICAJCTIgLyogdG90YWwgY2hhbm5lbHMgZm9yIGFsbCB1bml0cyB0b2dldGhlciovCisjZGVmaW5lIE1WX1hPUl9NQVhfVU5JVAkJCQkyIC8qIFhPUiB1bml0ID09IFhPUiBlbmdpbmUgKi8KKyNkZWZpbmUgTVZfWE9SX01BWF9DSEFOCQkJCTQgLyogdG90YWwgY2hhbm5lbHMgZm9yIGFsbCB1bml0cyB0b2dldGhlciovCiAjZGVmaW5lIE1WX1hPUl9NQVhfQ0hBTl9QRVJfVU5JVAkJMiAvKiBjaGFubmVscyBmb3IgdW5pdHMgKi8KIAogI2RlZmluZSBNVl9NUFBfTUFYX0dST1VQCQkJNQorI2RlZmluZSBNVl9NUFBfTUFYX0dST1VQX0FYUAkJCTkKIAogI2RlZmluZSBNVl9EUkFNX01BWF9DUwkJCQk0CiAjZGVmaW5lIE1WX1NQSV9NQVhfQ1MJCQkJOApAQCAtMTY4LDggKzE4NCw4IEBACiAjZW5kaWYKIAogLyogVGhpcyBkZWZpbmUgZGVzY3JpYmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgUEVYIEludGVyZmFjZXMgKi8KLSNkZWZpbmUgTVZfUEVYX01BWF9JRgkJCQkxCi0jZGVmaW5lIE1WX1BFWF9NQVhfVU5JVAkJCQkxCisjZGVmaW5lIE1WX1BFWF9NQVhfSUYJCQkJMTAJLyogMSBmb3IgTVNZUyAqLworI2RlZmluZSBNVl9QRVhfTUFYX1VOSVQJCQkJNAkvKiAxIGZvciBNU1lTICovCiAjaWZkZWYgTVZfSU5DTFVERV9QRVgKICNkZWZpbmUgTVZfSU5DTFVERV9QRVgwCiAjZGVmaW5lIE1WX0RJU0FCTEVfUEVYX0RFVklDRV9CQVIKQEAgLTE4NiwxNSArMjAyLDI3IEBACiAvKiBUaGlzIGRlZmluZSBkZXNjcmliZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBQQ0kgSW50ZXJmYWNlcyAJKi8KICNkZWZpbmUgTVZfREVWSUNFX01BWF9DUyAgICAgIAkJCTQKIAorLyogQ0VTQSB2ZXJzaW9uICMzOiBPbmUgY2hhbm5lbCwgMktCIFNSQU0sIFRETUEsIENIQUlOIE1vZGUgc3VwcG9ydCAqLworI2RlZmluZSBNVl9DRVNBX1ZFUlNJT04JCQkJMworI2RlZmluZSBNVl9DRVNBX1NSQU1fU0laRQkJCSgyICogMTAyNCkKKworI2lmZGVmIE1WX1VTQgorI2RlZmluZSBNVl9VU0JfTUFYX1BPUlRTIDEKKyNlbHNlCisjZGVmaW5lIE1WX1VTQl9NQVhfUE9SVFMgMAorI2VuZGlmCisjZGVmaW5lIE1WX1VTQjNfTUFYX0hPU1RfUE9SVFMgMAogCiAvKiBUaGlzIGRlZmluZSBkZXNjcmliZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBFdGhlcm5ldCBwb3J0cyAqLwogLyogVE9ETyAtIHZlcmlmeSBhbGwgdGhlc2UgbnVtYmVycyAqLwogI2RlZmluZSBNVl9FVEhfVkVSU0lPTiAJCQkJNCAvKiBmb3IgTGVnYWN5IG1vZGUgKi8KICNkZWZpbmUgTVZfTkVUQV9WRVJTSU9OCQkJCTEgLyogZm9yIE5FVEEgbW9kZSAqLwotI2RlZmluZSBNVl9FVEhfTUFYX1BPUlRTCQkJMgorI2RlZmluZSBNVl9FVEhfTUFYX1BPUlRTCQkJNAogI2RlZmluZSBNVl9FVEhfTUFYX1JYUSAgICAgICAgICAgICAgCQk4CiAjZGVmaW5lIE1WX0VUSF9NQVhfVFhRICAgICAgICAgICAgICAJCTgKICNkZWZpbmUgTVZfRVRIX1RYX0NTVU1fTUFYX1NJWkUgCQk5ODAwCisjZGVmaW5lIE1WX0VUSF9UWF9DU1VNX01JTl9TSVpFCQkJMjA0OAorI2RlZmluZSBNVl9QTkNfVENBTV9MSU5FUwkJCTEwMjQJLyogVENBTSBudW0gb2YgZW50cmllcyAqLwogI2RlZmluZSBCT0FSRF9FVEhfU1dJVENIX1BPUlRfTlVNCQkyCiAKIC8qIE5ldyBHTUFDIG1vZHVsZSBpcyB1c2VkICovCkBAIC0yMzUsNiArMjYzLDE3IEBACiAJSTJDX1VOSVRfSUQsCiAJVVNCX1VOSVRfSUQsCiAJVVNCM19VTklUX0lELAorCU5BTkRfVU5JVF9JRCwKKwlERVZCVVNfVU5JVF9JRCwKKwlJRE1BX1VOSVRfSUQsCisJU0FUQV9VTklUX0lELAorCVRETV9VTklUX0lELAorCUNFU0FfVU5JVF9JRCwKKwlBVURJT19VTklUX0lELAorCVRTX1VOSVRfSUQsCisJWFBPTl9VTklUX0lELAorCUJNX1VOSVRfSUQsCisJUE5DX1VOSVRfSUQsCiAJTUFYX1VOSVRTX0lECiB9IE1WX1VOSVRfSUQ7CiAKQEAgLTI4OCw5ICszMjcsNTcgQEAKIAlERVZfQk9PQ1MsCS8qIDIzIERFVl9CT09DUwkJCSovCiAJVVNCX1JFR1MsCS8qIDI0IFVTQiBJbnRlcm5hbCByZWdpc3RlcnMJKi8KIAlEUkFHT05JVEUsCS8qIDI1IERyYWdvbml0ZSBjby1wcm9jZXNzb3IJKi8KLQlNQVhfVEFSR0VUUworCU1BWF9UQVJHRVRTX01TWVMKIH0gTVZfVEFSR0VUOwogCitlbnVtIF9tdlRhcmdldF9heHAgeworCVNEUkFNX0NTMF9BWFAsCS8qMCBTRFJBTSBjaGlwIHNlbGVjdCAwCQkqLworCVNEUkFNX0NTMV9BWFAsCS8qMSBTRFJBTSBjaGlwIHNlbGVjdCAxCQkqLworCVNEUkFNX0NTMl9BWFAsCS8qMiBTRFJBTSBjaGlwIHNlbGVjdCAyCQkqLworCVNEUkFNX0NTM19BWFAsCS8qMyBTRFJBTSBjaGlwIHNlbGVjdCAzCQkqLworCURFVklDRV9DUzBfQVhQLAkvKjQgRGV2aWNlIGNoaXAgc2VsZWN0IDAJKi8KKwlERVZJQ0VfQ1MxX0FYUCwJLyo1IERldmljZSBjaGlwIHNlbGVjdCAxCSovCisJREVWSUNFX0NTMl9BWFAsCS8qNiBEZXZpY2UgY2hpcCBzZWxlY3QgMgkqLworCURFVklDRV9DUzNfQVhQLAkvKjcgRGV2aWNlIGNoaXAgc2VsZWN0IDMJKi8KKwlQRVgwX01FTV9BWFAsCS8qOCBQQ0kgRXhwcmVzcyAwIE1lbW9yeQkqLworCVBFWDBfSU9fQVhQLAkvKjkgUENJIEV4cHJlc3MgMCBJTwkJKi8KKwlQRVgxX01FTSwJLyoxMCBQQ0kgRXhwcmVzcyAxIE1lbW9yeQkqLworCVBFWDFfSU8sCS8qMTEgUENJIEV4cHJlc3MgMSBJTwkJKi8KKwlQRVgyX01FTSwJLyoxMiBQQ0kgRXhwcmVzcyAyIE1lbW9yeQkqLworCVBFWDJfSU8sCS8qMTMgUENJIEV4cHJlc3MgMiBJTwkJKi8KKwlQRVgzX01FTSwJLyoxNCBQQ0kgRXhwcmVzcyAzIE1lbW9yeQkqLworCVBFWDNfSU8sCS8qMTUgUENJIEV4cHJlc3MgMyBJTwkJKi8KKwlQRVg0X01FTSwJLyoxNiBQQ0kgRXhwcmVzcyA0IE1lbW9yeQkqLworCVBFWDRfSU8sCS8qMTcgUENJIEV4cHJlc3MgNCBJTwkJKi8KKwlQRVg1X01FTSwJLyoxOCBQQ0kgRXhwcmVzcyA1IE1lbW9yeQkqLworCVBFWDVfSU8sCS8qMTkgUENJIEV4cHJlc3MgNSBJTwkJKi8KKwlQRVg2X01FTSwJLyoyMCBQQ0kgRXhwcmVzcyA2IE1lbW9yeQkqLworCVBFWDZfSU8sCS8qMjEgUENJIEV4cHJlc3MgNiBJTwkJKi8KKwlQRVg3X01FTSwJLyoyMiBQQ0kgRXhwcmVzcyA3IE1lbW9yeQkqLworCVBFWDdfSU8sCS8qMjMgUENJIEV4cHJlc3MgNyBJTwkJKi8KKwlQRVg4X01FTSwJLyoyNCBQQ0kgRXhwcmVzcyA4IE1lbW9yeQkqLworCVBFWDhfSU8sCS8qMjUgUENJIEV4cHJlc3MgOCBJTwkJKi8KKwlQRVg5X01FTSwJLyoyNiBQQ0kgRXhwcmVzcyA5IE1lbW9yeQkqLworCVBFWDlfSU8sCS8qMjcgUENJIEV4cHJlc3MgOSBJTwkJKi8KKwlJTlRFUl9SRUdTX0FYUCwJLyoyOCBJbnRlcm5hbCByZWdpc3RlcnMJCSovCisJRE1BX1VBUlRfQVhQLAkvKjI5IERNQSBiYXNlZCBVQVJUIHJlcXVlc3QJKi8KKwlTUElfQ1MwX0FYUCwJLyozMCBTUElfQ1MwCQkJKi8KKwlTUElfQ1MxX0FYUCwJLyozMSBTUElfQ1MxCQkJKi8KKwlTUElfQ1MyX0FYUCwJLyozMiBTUElfQ1MyCQkJKi8KKwlTUElfQ1MzX0FYUCwJLyozMyBTUElfQ1MzCQkJKi8KKwlTUElfQ1M0X0FYUCwJLyozNCBTUElfQ1M0CQkJKi8KKwlTUElfQ1M1X0FYUCwJLyozNSBTUElfQ1M1CQkJKi8KKwlTUElfQ1M2X0FYUCwJLyozNiBTUElfQ1M2CQkJKi8KKwlTUElfQ1M3X0FYUCwJLyozNyBTUElfQ1M3CQkJKi8KKwlCT09UX1JPTV9DU19BWFAsIC8qMzggQk9PVF9ST01fQ1MJCSovCisJREVWX0JPT0NTX0FYUCwJLyozOSBERVZfQk9PQ1MJCQkqLworCVBNVV9TQ1JBVENIUEFELAkvKjQwIFBNVSBTY3JhdGNocGFkCQkqLworCUNSWVBUMF9FTkcsCS8qIDQxIENyeXB0bzAgRW5naW5lCQkqLworCUNSWVBUMV9FTkcsCS8qIDQyIENyeXB0bzEgRW5naW5lCQkqLworCVBOQ19CTSwJCS8qIDQzIFBOQyArIEJNCQkJKi8KKwlNQVhfVEFSR0VUU19BWFAKK307CisKICNpZmRlZiBBVVJPUkFfSU9fQ0FDSEVfQ09IRVJFTkNZCiAjZGVmaW5lIERSQU1fQ1MwX0FUVFIJCTB4MUUKICNkZWZpbmUgRFJBTV9DUzFfQVRUUgkJMHgxRApAQCAtMzY0LDYgKzQ1MSwxMDAgQEAKIAogCiAKKyNkZWZpbmUgVEFSR0VUU19ERUZfQVJSQVlfQVhQCXsJCQlcCisJe0RSQU1fQ1MwX0FUVFIsIERSQU1fVEFSR0VUX0lECX0sIC8qIFNEUkFNX0NTMCAqLwlcCisJe0RSQU1fQ1MxX0FUVFIsIERSQU1fVEFSR0VUX0lECX0sIC8qIFNEUkFNX0NTMSAqLwlcCisJe0RSQU1fQ1MyX0FUVFIsIERSQU1fVEFSR0VUX0lECX0sIC8qIFNEUkFNX0NTMCAqLwlcCisJe0RSQU1fQ1MzX0FUVFIsIERSQU1fVEFSR0VUX0lECX0sIC8qIFNEUkFNX0NTMSAqLwlcCisJezB4M0UsIERFVl9UQVJHRVRfSUQJfSwgLyogREVWSUNFX0NTMCAqLwlcCisJezB4M0QsIERFVl9UQVJHRVRfSUQJfSwgLyogREVWSUNFX0NTMSAqLwlcCisJezB4M0IsIERFVl9UQVJHRVRfSUQJfSwgLyogREVWSUNFX0NTMiAqLwlcCisJezB4MzcsIERFVl9UQVJHRVRfSUQJfSwgLyogREVWSUNFX0NTMyAqLwlcCisJezB4RTgsIFBFWDBfVEFSR0VUX0lECX0sIC8qIFBFWDBfTEFORTBfTUVNICovCVwKKwl7MHhFMCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FMF9JTyAqLwlcCisJezB4RDgsIFBFWDBfVEFSR0VUX0lECX0sIC8qIFBFWDBfTEFORTFfTUVNICovCVwKKwl7MHhEMCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FMV9JTyAqLwlcCisJezB4QjgsIFBFWDBfVEFSR0VUX0lECX0sIC8qIFBFWDBfTEFORTJfTUVNICovCVwKKwl7MHhCMCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FMl9JTyAqLwlcCisJezB4NzgsIFBFWDBfVEFSR0VUX0lECX0sIC8qIFBFWDBfTEFORTNfTUVNICovCVwKKwl7MHg3MCwgUEVYMF9UQVJHRVRfSUQJfSwgLyogUEVYMF9MQU5FM19JTyAqLwlcCisJezB4RTgsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYMV9MQU5FMF9NRU0gKi8JXAorCXsweEUwLCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDFfTEFORTBfSU8gKi8JXAorCXsweEQ4LCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDFfTEFORTFfTUVNICovCVwKKwl7MHhEMCwgREZYX1RBUkdFVF9JRAl9LCAvKiBQRVgxX0xBTkUxX0lPICovCVwKKwl7MHhCOCwgREZYX1RBUkdFVF9JRAl9LCAvKiBQRVgxX0xBTkUyX01FTSAqLwlcCisJezB4QjAsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYMV9MQU5FMl9JTyAqLwlcCisJezB4NzgsIERGWF9UQVJHRVRfSUQJfSwgLyogUEVYMV9MQU5FM19NRU0gKi8JXAorCXsweDcwLCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDFfTEFORTNfSU8gKi8JXAorCXsweEY4LCBQRVgwX1RBUkdFVF9JRAl9LCAvKiBQRVgyX0xBTkUwX01FTSAqLwlcCisJezB4RjAsIFBFWDBfVEFSR0VUX0lECX0sIC8qIFBFWDJfTEFORTBfSU8gKi8JXAorCXsweEY4LCBERlhfVEFSR0VUX0lECX0sIC8qIFBFWDNfTEFORTBfTUVNICovCVwKKwl7MHhGMCwgREZYX1RBUkdFVF9JRAl9LCAvKiBQRVgzX0xBTkUwX0lPICovCVwKKwl7MHhGRiwgMHhGRgkJfSwgLyogSU5URVJfUkVHUyAqLwlcCisJezB4MDEsIERFVl9UQVJHRVRfSUQJfSwgLyogRE1BX1VBUlQgKi8JXAorCXsweDFFLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzAgKi8JXAorCXsweDVFLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzEgKi8JXAorCXsweDlFLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzIgKi8JXAorCXsweERFLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzMgKi8JXAorCXsweDFGLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzQgKi8JXAorCXsweDVGLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzUgKi8JXAorCXsweDlGLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzYgKi8JXAorCXsweERGLCBERVZfVEFSR0VUX0lECX0sIC8qIFNQSV9DUzcgKi8JXAorCXsweDFELCBERVZfVEFSR0VUX0lECX0sIC8qIE1haW4gQm9vdCBkZXZpY2UgKi8JXAorCXsweDJGLCBERVZfVEFSR0VUX0lECX0sIC8qIFNlY29uZGFyeSBCb290IGRldmljZSwgKi8JXAorCXsweDJELCBERVZfVEFSR0VUX0lECX0sIC8qIFBNVV9TQ1JBVENIUEFEICovCVwKKwl7MHgwOSwgQ1JZUFRfVEFSR0VUX0lECX0sIC8qIENSWVBUX0VORzAgKi8JXAorCXsweDA1LCBDUllQVF9UQVJHRVRfSUQJfSwgLyogQ1JZUFRfRU5HMSAqLyAgICAgXAorCXsweDAwLCBQTkNfQk1fVEFSR0VUX0lECX0sIC8qIFBOQ19CTSAqLwkJXAorfQorCisjZGVmaW5lIFRBUkdFVFNfTkFNRV9BUlJBWV9BWFAJewkJXAorCSJTRFJBTV9DUzAiLAkvKiBTRFJBTV9DUzAgKi8JCVwKKwkiU0RSQU1fQ1MxIiwJLyogU0RSQU1fQ1MxICovCQlcCisJIlNEUkFNX0NTMiIsCS8qIFNEUkFNX0NTMSAqLwkJXAorCSJTRFJBTV9DUzMiLAkvKiBTRFJBTV9DUzEgKi8JCVwKKwkiREVWSUNFX0NTMCIsCS8qIERFVklDRV9DUzAgKi8JXAorCSJERVZJQ0VfQ1MxIiwJLyogREVWSUNFX0NTMSAqLwlcCisJIkRFVklDRV9DUzIiLAkvKiBERVZJQ0VfQ1MyICovCVwKKwkiREVWSUNFX0NTMyIsCS8qIERFVklDRV9DUzMgKi8JXAorCSJQRVgwX01FTSIsCS8qIFBFWDBfTUVNICovCQlcCisJIlBFWDBfSU8iLAkvKiBQRVgwX0lPICovCQlcCisJIlBFWDFfTUVNIiwJLyogUEVYMV9NRU0gKi8JCVwKKwkiUEVYMV9JTyIsCS8qIFBFWDFfSU8gKi8JCVwKKwkiUEVYMl9NRU0iLAkvKiBQRVgyX01FTSAqLwkJXAorCSJQRVgyX0lPIiwJLyogUEVYMl9JTyAqLwkJXAorCSJQRVgzX01FTSIsCS8qIFBFWDNfTUVNICovCQlcCisJIlBFWDNfSU8iLAkvKiBQRVgzX0lPICovCQlcCisJIlBFWDRfTUVNIiwJLyogUEVYNF9NRU0gKi8JCVwKKwkiUEVYNF9JTyIsCS8qIFBFWDRfSU8gKi8JCVwKKwkiUEVYNV9NRU0iLAkvKiBQRVg1X01FTSAqLwkJXAorCSJQRVg1X0lPIiwJLyogUEVYNV9JTyAqLwkJXAorCSJQRVg2X01FTSIsCS8qIFBFWDZfTUVNICovCQlcCisJIlBFWDZfSU8iLAkvKiBQRVg2X0lPICovCQlcCisJIlBFWDdfTUVNIiwJLyogUEVYN19NRU0gKi8JCVwKKwkiUEVYN19JTyIsCS8qIFBFWDdfSU8gKi8JCVwKKwkiUEVYOF9NRU0iLAkvKiBQRVg4X01FTSAqLwkJXAorCSJQRVg4X0lPIiwJLyogUEVYOF9JTyAqLwkJXAorCSJQRVg5X01FTSIsCS8qIFBFWDlfTUVNICovCQlcCisJIlBFWDlfSU8iLAkvKiBQRVg5X0lPICovCQlcCisJIklOVEVSX1JFR1MiLAkvKiBJTlRFUl9SRUdTICovCVwKKwkiRE1BX1VBUlQiLAkvKiBETUFfVUFSVCAqLwkJXAorCSJTUElfQ1MwIiwJLyogU1BJX0NTMCAqLwkJXAorCSJTUElfQ1MxIiwJLyogU1BJX0NTMSAqLwkJXAorCSJTUElfQ1MyIiwJLyogU1BJX0NTMiAqLwkJXAorCSJTUElfQ1MzIiwJLyogU1BJX0NTMyAqLwkJXAorCSJTUElfQ1M0IiwJLyogU1BJX0NTNCAqLwkJXAorCSJTUElfQ1M1IiwJLyogU1BJX0NTNSAqLwkJXAorCSJTUElfQ1M2IiwJLyogU1BJX0NTNiAqLwkJXAorCSJTUElfQ1M3IiwJLyogU1BJX0NTNyAqLwkJXAorCSJCT09UX1JPTV9DUyIsCS8qIEJPT1RfUk9NX0NTICovCVwKKwkiREVWX0JPT1RDUyIsCS8qIERFVl9CT09DUyAqLwkJXAorCSJQTVVfU0NSQVRDSFBBRCIsLyogUE1VX1NDUkFUQ0hQQUQgKi8JXAorCSJDUllQVDFfRU5HIiwJLyogQ1JZUFQxX0VORyAqLwlcCisJIkNSWVBUMl9FTkciLAkvKiBDUllQVDJfRU5HICovCVwKKwkiUE5DX0JNIgkvKiBQTkNfQk0gKi8JCVwKK30KKwogI2VuZGlmIC8qIE1WX0FTTUxBTkdVQUdFICovCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdlNlbWFwaG9yZS5jIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdlNlbWFwaG9yZS5jCmluZGV4IGQ3MWRmNGUuLmRlNmM0OTYgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZTZW1hcGhvcmUuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212U2VtYXBob3JlLmMKQEAgLTQyLDEyICs0MiwxMiBAQAogCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdlNlbWFwaG9yZS5oIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9tdlNlbWFwaG9yZS5oCmluZGV4IDhiODk5NGMuLjlhYzgxMzQgMTAwNjQ0Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvbXZTZW1hcGhvcmUuaAorKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L212U2VtYXBob3JlLmgKQEAgLTQyLDEyICs0MiwxMiBAQAogCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0gICAgICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZBaGJUb01idXMuYyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvc3lzL212QWhiVG9NYnVzLmMKaW5kZXggZTQ2MDhhYi4uMDIyOWQyMiAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZBaGJUb01idXMuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkFoYlRvTWJ1cy5jCkBAIC0yNTUsNyArMjU1LDEwIEBACiAKIAlpZiAod2luTnVtID09IE1WX0FIQl9UT19NQlVTX0lOVFJFR19XSU4pIHsKIAkJcEFkZHJEZWNXaW4tPmFkZHJXaW4uc2l6ZSA9IElOVEVSX1JFR1NfU0laRTsKLQkJcEFkZHJEZWNXaW4tPnRhcmdldCA9IElOVEVSX1JFR1M7CisJCWlmIChtdkN0cmxEZXZGYW1pbHlJZEdldCgwKSA9PSBNVl83ODQ2MF9ERVZfSUQpCisJCQlwQWRkckRlY1dpbi0+dGFyZ2V0ID0gKE1WX1U4KUlOVEVSX1JFR1NfQVhQOworCQllbHNlCisJCQlwQWRkckRlY1dpbi0+dGFyZ2V0ID0gSU5URVJfUkVHUzsKIAkJcEFkZHJEZWNXaW4tPmVuYWJsZSA9IE1WX1RSVUU7CiAKIAkJcmV0dXJuIE1WX09LOwpAQCAtMzAxLDcgKzMwNCw3IEBACiAJCXJldHVybiAweGZmZmZmZmZmOwogCX0KIAotCWlmIChJTlRFUl9SRUdTID09IHRhcmdldCkKKwlpZiAoSU5URVJfUkVHUyA9PSB0YXJnZXQgfHwgKE1WX1U4KUlOVEVSX1JFR1NfQVhQID09IHRhcmdldCkKIAkJcmV0dXJuIE1WX0FIQl9UT19NQlVTX0lOVFJFR19XSU47CiAKIAlmb3IgKHdpbk51bSA9IDA7IHdpbk51bSA8IE1BWF9BSEJfVE9fTUJVU19XSU5TOyB3aW5OdW0rKykgewpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZi5jCmluZGV4IDU4ZGIzNDkuLmI1ZDI2MzIgMTAwNzU1Ci0tLSBhL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvc3lzL212Q3B1SWYuYworKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmLmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCS8qIFNldCBJTyBCeXBhc3MgYmFzZSBhZGRyZXNzIGFuZCBzaXplIGFjY29yZGluZyB0byB0aGUgY3B1QWRkcldpbk1hcCAqLwogCWZvciAodGFyZ2V0ID0gMDsgY3B1QWRkcldpbk1hcFt0YXJnZXRdLmVuYWJsZSAhPSBUQkxfVEVSTTsgdGFyZ2V0KyspIHsKIAkJaWYgKChNVl9UQVJHRVRfSVNfRFJBTSh0YXJnZXQpKSB8fCAoRElTID09IGNwdUFkZHJXaW5NYXBbdGFyZ2V0XS5lbmFibGUpIHx8Ci0JCSAgICAodGFyZ2V0ID09IElOVEVSX1JFR1MpKQorCQkgICAgKHRhcmdldCA9PSBJTlRFUl9SRUdTKSB8fCAodGFyZ2V0ID09IChNVl9VOClJTlRFUl9SRUdTX0FYUCkpCiAJCQljb250aW51ZTsKIAkJaWYgKGNwdUFkZHJXaW5NYXBbdGFyZ2V0XS5hZGRyV2luLmJhc2VMb3cgPT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMTkwLDcgKzE5MCw4IEBACiAKIAkvKiBGaXJzdCBkaXNhYmxlIGFsbCBDUFUgdGFyZ2V0IHdpbmRvd3MgICovCiAJZm9yICh0YXJnZXQgPSAwOyBjcHVBZGRyV2luTWFwW3RhcmdldF0uZW5hYmxlICE9IFRCTF9URVJNOyB0YXJnZXQrKykgewotCQlpZiAoKE1WX1RBUkdFVF9JU19EUkFNKHRhcmdldCkpIHx8ICh0YXJnZXQgPT0gSU5URVJfUkVHUykpCisJCWlmICgoTVZfVEFSR0VUX0lTX0RSQU0odGFyZ2V0KSkgfHwgKHRhcmdldCA9PSBJTlRFUl9SRUdTKSB8fAorCQkgICAgKHRhcmdldCA9PSAoTVZfVTgpSU5URVJfUkVHU19BWFApKQogCQkJY29udGludWU7CiAKICNpZiBkZWZpbmVkKE1WX01FTV9PVkVSX1BFWF9XQSkgfHwgZGVmaW5lZChNVl9VQVJUX09WRVJfUEVYX1dBKQpAQCAtNzIwLDkgKzcyMSwyMyBAQAogCU1WX1UzMiB3aW5OdW07CiAKIAkvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0JaWYgKCFNVl9UQVJHRVRfSVNfUEVYMChwZXhUYXJnZXQpKSB7Ci0JCW12T3NQcmludGYoIm12Q3B1SWZQZXhSZW1hcDogdGFyZ2V0ICVkIGlzIGlsbGVnYWxcbiIsIHBleFRhcmdldCk7Ci0JCXJldHVybiAweGZmZmZmZmZmOworCWlmIChtdkN0cmxQZXhNYXhJZkdldCgpID4gMSkgeworCQlpZiAoKCFNVl9UQVJHRVRfSVNfUEVYMChwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYMShwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYMihwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYMyhwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYNChwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYNShwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYNihwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYNyhwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYOChwZXhUYXJnZXQpKSAmJgorCQkJKCFNVl9UQVJHRVRfSVNfUEVYOShwZXhUYXJnZXQpKSkgeworCQkJbXZPc1ByaW50ZigibXZDcHVJZlBleFJlbWFwOiB0YXJnZXQgJWQgaXMgaWxsZWdhbFxuIiwgcGV4VGFyZ2V0KTsKKwkJCXJldHVybiAweGZmZmZmZmZmOworCQl9CisJfSBlbHNlIGlmICghTVZfVEFSR0VUX0lTX1BFWDAocGV4VGFyZ2V0KSkgeworCQkJbXZPc1ByaW50ZigibXZDcHVJZlBleFJlbWFwOiB0YXJnZXQgJWQgaXMgaWxsZWdhbFxuIiwgcGV4VGFyZ2V0KTsKKwkJCXJldHVybiAweGZmZmZmZmZmOwogCX0KIAogCS8qIGdldCB0aGUgV2luZG93IG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YXJnZXQgKi8KQEAgLTk0MCwzICs5NTUsMzIgQEAKIAogCXJldHVybiBNVl9PSzsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZDcHVJZk1idXNXaW5kb3dTZXQKKyoKKyogREVTQ1JJUFRJT046CisqCVNldCBNYnVzIEJyaWRnZSBXaW5kb3cgcmVnaXN0ZXIKKyoKKyogSU5QVVQ6CisqCVdpbmRvd3MgQmFzZSBBZGRyZXNzCisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOgorKiAgICAgICBOb25lLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1ZPSUQgbXZDcHVJZk1idXNXaW5kb3dTZXQoTVZfVTMyIGJhc2UsIE1WX1UzMiBzaXplKQoreworCU1WX1UzMiByZWc7CisKKwlNVl9SRUdfV1JJVEUoTUJVU19CUklER0VfV0lOX0JBU0VfUkVHLCBiYXNlKTsKKwkvKiBBbGlnbiB3aW5kb3cgc2l6ZSB0byA2NEtCICovCisJc2l6ZSA9ICgoc2l6ZSAvIF82NEspIC0gMSkgPDwgQlJJREdXQ1JfU0laRV9PRkZTOworCXJlZyA9IE1WX1JFR19SRUFEKE1CVVNfQlJJREdFX1dJTl9DVFJMX1JFRyk7CisJcmVnICY9IH5CUklER1dDUl9TSVpFX01BU0s7CisJcmVnIHw9IChzaXplICYgQlJJREdXQ1JfU0laRV9NQVNLKTsKKwlNVl9SRUdfV1JJVEUoTUJVU19CUklER0VfV0lOX0NUUkxfUkVHLCByZWcpOworfQpkaWZmIC0tZ2l0IGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZlJlZ3MuaCBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2N0cmxFbnYvc3lzL212Q3B1SWZSZWdzLmgKaW5kZXggMGM2YzE0Zi4uZjc5NWVjZiAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvY3RybEVudi9zeXMvbXZDcHVJZlJlZ3MuaAorKysgYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9jdHJsRW52L3N5cy9tdkNwdUlmUmVncy5oCkBAIC0zNDgsNiArMzQ4LDE3IEBACiAjZGVmaW5lIENQVV9BUk1fVE9fSE9TVF9EUkJMX1JFRyhjcHUpCQkoTVZfQ1BVSUZfUkVHU19CQVNFKGNwdSkgKyAweDcwKQogI2RlZmluZSBDUFVfQVJNX1RPX0hPU1RfTUFTS19SRUcoY3B1KQkJKE1WX0NQVUlGX1JFR1NfQkFTRShjcHUpICsgMHg3NCkKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBDTE9DSyBDb21wbGV4IFJlZ2lzdGVycyBNYXAgLSBBWFAgb25seSAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENQVV9ESVZfQ0xLX0NUUkwwX1JFRwkJCShNVl9DTEtfQ01QTFhfUkVHU19PRkZTRVQpCisjZGVmaW5lIENQVV9ESVZfQ0xLX0NUUkwwX1JFU0VUX01BU0tfT0ZGUwk4CisjZGVmaW5lIENQVV9ESVZfQ0xLX0NUUkwyX1JBVElPX0ZVTEwwX1JFRwkoTVZfQ0xLX0NNUExYX1JFR1NfT0ZGU0VUICsgMHg4KQorI2RlZmluZSBDUFVfRElWX0NMS19DVFJMMl9OQl9SQVRJT19PRkZTCQkxNgorI2RlZmluZSBDUFVfRElWX0NMS19DVFJMM19SQVRJT19GVUxMMV9SRUcJKE1WX0NMS19DTVBMWF9SRUdTX09GRlNFVCArIDB4QykKKyNkZWZpbmUgQ1BVX0RJVl9DTEtfQ1RSTDNfQ1BVX1JBVElPX09GRlMJOAorCiAvKiBDUFUgY29udHJvbCByZWdpc3RlciBtYXAgKi8KIC8qIFNldCBiaXRzIG1lYW5zIHZhbHVlIGlzIGFib3V0IHRvIGNoYW5nZSBhY2NvcmRpbmcgdG8gbmV3IHZhbHVlICovCiAjZGVmaW5lIENQVV9DT05GSUdfREVGQVVMVF9NQVNLICAgICAgICAgCShDQ1JfVkVDX0lOSVRfTE9DX01BU0spCmRpZmYgLS1naXQgYS9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9kZXZpY2UvbXZEZXZpY2VSZWdzLmggYi9ib2FyZC9tdl9lYnUvbXN5cy9tc3lzX2ZhbWlseS9kZXZpY2UvbXZEZXZpY2VSZWdzLmgKaW5kZXggNDEzYWJkOC4uNjliZDhhYSAxMDA2NDQKLS0tIGEvYm9hcmQvbXZfZWJ1L21zeXMvbXN5c19mYW1pbHkvZGV2aWNlL212RGV2aWNlUmVncy5oCisrKyBiL2JvYXJkL212X2VidS9tc3lzL21zeXNfZmFtaWx5L2RldmljZS9tdkRldmljZVJlZ3MuaApAQCAtNzYsNiArNzYsOCBAQAogCXN3aXRjaCAobnVtKSB7CiAJY2FzZSAoREVWX0JPT0NTKToKIAkJcmV0dXJuIE1WX0RFVl9CVVNfUkVHU19PRkZTRVQgKyAweDAwOworCWNhc2UgKERFVl9CT09DU19BWFApOgorCQlyZXR1cm4gTVZfREVWX0JVU19SRUdTX09GRlNFVCArIDB4MDA7CiAJY2FzZSAoREVWSUNFX0NTMCk6CiAJCXJldHVybiBNVl9ERVZfQlVTX1JFR1NfT0ZGU0VUICsgMHgwODsKIAljYXNlIChERVZJQ0VfQ1MxKToKZGlmZiAtLWdpdCBhL2JvYXJkL212X2VidS9tc3lzL212U3lzSHdDb25maWcuaCBiL2JvYXJkL212X2VidS9tc3lzL212U3lzSHdDb25maWcuaAppbmRleCBlN2Q0OTBlLi5hYWYxODRlIDEwMDY0NAotLS0gYS9ib2FyZC9tdl9lYnUvbXN5cy9tdlN5c0h3Q29uZmlnLmgKKysrIGIvYm9hcmQvbXZfZWJ1L21zeXMvbXZTeXNId0NvbmZpZy5oCkBAIC0xMzUsNiArMTM1LDcgQEAKICNkZWZpbmUgU1dJVENIX1JFR1NfQkFTRQkJMHhBODAwMDAwMAogI2RlZmluZSBTV0lUQ0hfUkVHU19TSVpFCQlfNjRNCiAjZGVmaW5lIFNXSVRDSF9SRUdTX1ZJUlRfQkFTRQlTV0lUQ0hfUkVHU19CQVNFCisjZGVmaW5lIFNXSVRDSF9XSU5fSUQJCQk1CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogRGV2aWNlOiBDUzAgLSBOT1Igb3IgTkFORCwgQ1MxIC0gU1BJLCBDUzIgLSBCb290IFJPTSwgQ1MzIC0gQm9vdCBkZXZpY2UgKi8KIC8qIE5PUiBhbmQgTkFORCBhcmUgY29uZmlndXJlIHRvIENTMCBidXQgaXQgaXMgcG9zaWJsZSB0byBsb2FkCkBAIC0yNTIsNyArMjUzLDcgQEAKIAkJeyB7IFBFWDBfSU9fQkFTRSwgICAgICAgICAwLCAgICAgIFBFWDBfSU9fU0laRSAgICB9LCAgICAgIFRCTF9VTlVTRUQsICAgICBESVMgfSwgICAgICAgIC8qICA5IFBFWDBfSU8gKi8JXAogCQl7IHsgSU5URVJfUkVHU19CQVNFLCAgICAgIDAsIElOVEVSX1JFR1NfU0laRSB9LCBNVl9BSEJfVE9fTUJVU19JTlRSRUdfV0lOLCBFTiB9LCAgICAgICAgLyogMTAgSU5URVJfUkVHUyAqLyBcCiAJCXsgeyBERlhfUkVHU19CQVNFLCAgICAgICAgMCwgICAgICBERlhfUkVHU19TSVpFICAgfSwgICAgICAxLCAgICAgICAgICAgICAgIEVOIH0sICAgICAgICAvKiAxMSBERlhfUkVHUyAqLyBcCi0JCXsgeyBTV0lUQ0hfUkVHU19CQVNFLCAgICAgMCwgICAgIFNXSVRDSF9SRUdTX1NJWkUgfSwgICAgICA1LCAgICAgICAgICAgICAgIEVOIH0sICAgICAgICAvKiAxMiBTV0lUQ0ggICAqLyBcCisJCXsgeyBTV0lUQ0hfUkVHU19CQVNFLCAgICAgMCwgICAgIFNXSVRDSF9SRUdTX1NJWkUgfSwgICAgICBTV0lUQ0hfV0lOX0lELCAgIEVOIH0sICAgICAgICAvKiAxMiBTV0lUQ0ggICAqLyBcCiAJCXsgeyBUQkxfVU5VU0VELCAgICAgICAgICAgMCwgICAgICBUQkxfVU5VU0VEICAgICAgfSwgICAgICBUQkxfVU5VU0VELCAgICAgRElTIH0sICAgICAgICAvKiAxMyBETUFfVUFSVCAgICovIFwKIAkJeyB7IFNQSV9DU19CQVNFLCAgICAgICAgICAwLCAgICAgIFNQSV9DU19TSVpFICAgICB9LCAgICAgIDgsICAgICAgICAgICAgICAgRU4gfSwgICAgICAgIC8qIDE0IFNQSV9DUzAgKi8JXAogCQl7IHsgVEJMX1VOVVNFRCwgICAgICAgICAgIDAsICAgICAgVEJMX1VOVVNFRCAgICAgIH0sICAgICAgVEJMX1VOVVNFRCwgICAgIERJUyB9LCAgICAgICAgLyogMTUgU1BJX0NTMSAqLwlcCmRpZmYgLS1naXQgYS9ib2FyZHMuY2ZnIGIvYm9hcmRzLmNmZwppbmRleCBmNDk3Yjg5Li40YTAxNDMwIDEwMDY0NAotLS0gYS9ib2FyZHMuY2ZnCisrKyBiL2JvYXJkcy5jZmcKQEAgLTU0LDYgKzU0LDcgQEAKIGFybWFkYV8zOHggICAgICAgICAgICAgICAgICAgYXJtICAgICAgICAgYXJtdjcgICAgICAgYTM4eCAgICAgICAgICAgICAgICBtdl9lYnUgICAgICAgICBtdmNhOSAgICAgICAgYXJtYWRhXzM4eDpBUk1BREFfMzhYCiBhcm1hZGFfMzh4X2N1c3RvbWVyMCAgICAgICAgIGFybSAgICAgICAgIGFybXY3ICAgICAgIGEzOHggICAgICAgICAgICAgICAgbXZfZWJ1ICAgICAgICAgbXZjYTkgICAgICAgIGFybWFkYV8zOHg6Q1VTVE9NRVJfQk9BUkRfMCxBUk1BREFfMzhYCiBhcm1hZGFfMzh4X2N1c3RvbWVyMSAgICAgICAgIGFybSAgICAgICAgIGFybXY3ICAgICAgIGEzOHggICAgICAgICAgICAgICAgbXZfZWJ1ICAgICAgICAgbXZjYTkgICAgICAgIGFybWFkYV8zOHg6Q1VTVE9NRVJfQk9BUkRfMSxBUk1BREFfMzhYCithcm1hZGFfMzh4X2NsZWFyZm9nICAgICAgICAgIGFybSAgICAgICAgIGFybXY3ICAgICAgIGEzOHggICAgICAgICAgICAgICAgbXZfZWJ1ICAgICAgICAgbXZjYTkgICAgICAgIGFybWFkYV8zOHg6Q0xFQVJGT0dfQk9BUkQsQVJNQURBXzM4WAogYXJtYWRhXzM4eF9nZmNoMTAwICAgICAgICAgICBhcm0gICAgICAgICBhcm12NyAgICAgICBhMzh4ICAgICAgICAgICAgICAgIG12X2VidSAgICAgICAgIG12Y2E5ICAgICAgICBhcm1hZGFfMzh4OkdGQ0gxMDAsQVJNQURBXzM4WAogYXJtYWRhXzM5eCAgICAgICAgICAgICAgICAgICBhcm0gICAgICAgICBhcm12NyAgICAgICBhMzh4ICAgICAgICAgICAgICAgIG12X2VidSAgICAgICAgIG12Y2E5ICAgICAgICBhcm1hZGFfMzh4OkFSTUFEQV8zOVgKIGFybWFkYV8zOXhfY3VzdG9tZXIwICAgICAgICAgYXJtICAgICAgICAgYXJtdjcgICAgICAgYTM4eCAgICAgICAgICAgICAgICBtdl9lYnUgICAgICAgICBtdmNhOSAgICAgICAgYXJtYWRhXzM4eDpDVVNUT01FUl9CT0FSRF8wLEFSTUFEQV8zOVgKZGlmZiAtLWdpdCBhL2J1aWxkLnBsIGIvYnVpbGQucGwKaW5kZXggMTdiOTk2OC4uZDc4NmVlMSAxMDA3NTUKLS0tIGEvYnVpbGQucGwKKysrIGIvYnVpbGQucGwKQEAgLTEzLDE0ICsxMywxNCBAQAogCXByaW50ICJPcHRpb25zOlxuIjsKIAlwcmludCAiXHQtZlx0Qm9vdCBkZXZpY2UuIEFjY2VwdHMgc3BpLCBub3IsIG5hbmQsIG1tY1xuIjsKIAlwcmludCAiXHQtYlx0Qm9hcmQgdHlwZS4gQWNjZXB0czpcdGF2YW50YV9scCAsIGF2YW50YV9scF9jdXN0b21lcjAgLCBhdmFudGFfbHBfY3VzdG9tZXIxXG4iOwotCXByaW50ICJcdFx0XHRcdFx0YXJtYWRhXzM4eCwgYXJtYWRhXzM4eF9jdXN0b21lcjAsIGFybWFkYV8zOHhfY3VzdG9tZXIxXG4iOworCXByaW50ICJcdFx0XHRcdFx0YXJtYWRhXzM4eCwgYXJtYWRhXzM4eF9jbGVhcmZvZywgYXJtYWRhXzM4eF9jdXN0b21lcjAsIGFybWFkYV8zOHhfY3VzdG9tZXIxXG4iOwogCXByaW50ICJcdFx0XHRcdFx0YXJtYWRhXzM5eCwgYXJtYWRhXzM5eF9jdXN0b21lcjAsIGFybWFkYV8zOXhfY3VzdG9tZXIxXG4iOwogCXByaW50ICJcdFx0XHRcdFx0YXJtYWRhXzM3NSwgYXJtYWRhXzM3NV9jdXN0b21lcjAsIGFybWFkYV8zNzVfY3VzdG9tZXIxXG4iOwogCXByaW50ICJcdFx0XHRcdFx0Ym9iY2F0Ml9kYiwgYm9iY2F0Ml9yZCwgYm9iY2F0Ml9jdXN0b21lcjAsIGJvYmNhdDJfY3VzdG9tZXIxXG4iOwogCXByaW50ICJcdFx0XHRcdFx0YWMzX2RiLCBhYzNfcmQsIGFjM19jdXN0b21lcjAsIGFjM19jdXN0b21lcjFcbiI7CiAJcHJpbnQgIlx0LW9cdE91dHB1dCBkaXIvZmlsZS4gVGhlIGltYWdlIHdpbGwgYmUgY29waWVkIGludG8gdGhpcyBkaXIvZmlsZVxuIjsKIAlwcmludCAiXHQtZVx0QmlnIEVuZGlhbi4gSWYgbm90IHNwZWNpZmllZCBMaXR0bGUgZW5kaWFuIGlzIHVzZWRcbiI7Ci0JcHJpbnQgIlx0LW1cdEREUiB0eXBlKGRlZmF1bHQ6IEREUjMpLiBBY2NlcHRzOiAzIGZvciBERFIzLCA0IGZvciBERFI0XG4iOworIAlwcmludCAiXHQtbVx0RERSIHR5cGUoZGVmYXVsdDogRERSNCBmb3IgQTM5eCwgRERSMyBmb3IgdGhlIHJlc3QpLiBBY2NlcHRzOiAzIGZvciBERFIzLCA0IGZvciBERFI0XG4iOwogCXByaW50ICJcdC1pXHRTdXBwb3J0ZWQgaW50ZXJmYWNlcywgc2VwZXJhdGVkIGJ5IFwiOlwiIC0gIEFjY2VwdHMgW3NwaTpub3I6bmFuZF1cbiI7CiAJcHJpbnQgIlx0LXZcdFNXIHZlcnNpb24gKGluIGZpbGUgbmFtZTogdS1ib290LWFscC1YLlguWC1zcGkuYmluLCBlbHNlIHVzaW5nIGRhdGUgYnkgZGVmYXVsdClcbiI7CiAJcHJpbnQgIlx0XHRpbnRlcmZhY2VzLiBTdXBwb3J0cyBzcGksIG5vciwgbmFuZC4gdGhlIGJvb3QgXG4iOwpAQCAtOTQsNiArOTQsNyBAQAogCSgkb3B0X2IgZXEgImFybWFkYV8zNzVfY3VzdG9tZXIwIikgb3IKIAkoJG9wdF9iIGVxICJhcm1hZGFfMzc1X2N1c3RvbWVyMSIpIG9yCiAJKCRvcHRfYiBlcSAiYXJtYWRhXzM4eCIpIG9yCisJKCRvcHRfYiBlcSAiYXJtYWRhXzM4eF9jbGVhcmZvZyIpIG9yCiAJKCRvcHRfYiBlcSAiYXJtYWRhXzM4eF9jdXN0b21lcjAiKSBvcgogCSgkb3B0X2IgZXEgImFybWFkYV8zOHhfY3VzdG9tZXIxIikgb3IKIAkoJG9wdF9iIGVxICJhcm1hZGFfMzh4X2dmY2gxMDAiKSBvcgpAQCAtMTExLDE5ICsxMTIsMjQgQEAKIAkoJG9wdF9iIGVxICJhYzNfY3VzdG9tZXIxIikgKQogewogCSRib2FyZCA9ICRvcHRfYjsKKwkkZGRyM0xpYkJ1aWxkPSJ5ZXMiOwogCWlmKCAoc3Vic3RyICRib2FyZCw3ICwgMykgZXEgIjM3MCIgKSB7CiAJCSRib2FyZElEPSJhMzcwIjsKIAkJJHRhcmdldEJvYXJkID0gc3Vic3RyICRib2FyZCwgMTE7CisJCSRkZHIzTGliQnVpbGQ9Im5vIjsKIAl9CiAJZWxzaWYgKCAoc3Vic3RyICRib2FyZCw3ICwgMikgZXEgInhwIiApIHsKIAkJJGJvYXJkSUQ9ImF4cCI7CiAJCSR0YXJnZXRCb2FyZCA9IHN1YnN0ciAkYm9hcmQsIDEwOworCQkkZGRyM0xpYkJ1aWxkPSJubyI7CiAJfQogCWVsc2lmICggKHN1YnN0ciAkYm9hcmQsNyAsIDIpIGVxICJscCIgKSB7CiAJCSRib2FyZElEPSJhbHAiOworCQkkZGRyM0xpYkJ1aWxkPSJubyI7CiAJfQogCWVsc2lmICggKHN1YnN0ciAkYm9hcmQsNyAsIDMpIGVxICIzNzUiICkgewogCQkkYm9hcmRJRD0iYTM3NSI7CisJCSRkZHIzTGliQnVpbGQ9Im5vIjsKIAl9CiAJZWxzaWYgKCAoc3Vic3RyICRib2FyZCw3ICwgMykgZXEgIjM4eCIgKSB7CiAJCSRib2FyZElEPSJhMzh4IjsKQEAgLTEzOSwxMCArMTQ1LDEyIEBACiAJCSRib2FyZElEPSJtc3lzLWFjMyI7CiAJCSR0YXJnZXRCb2FyZCA9IHN1YnN0ciAkYm9hcmQsIDg7CiAJfQotCSMgaWYgYm9hcmQgc3RyaW5nIGNvbnRhaW5zICJjdXN0b21lciIsIHVzZSBjdXN0b21lciBkZWZpbmUgZm9yIGJpbmFyeV9oZWFkZXIKLQlpZiAoaW5kZXgoJGJvYXJkLCAiY3VzdG9tZXIiKSAhPSAtMSB8fCBpbmRleCgkYm9hcmQsICJnZmNoMTAwIikgIT0gLTEpewotCQlzeXN0ZW0oImVjaG8gXCIjZGVmaW5lIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUIDFcIiA+PiBpbmNsdWRlL2NvbmZpZy5oIik7CisJIyBpZiBib2FyZCBzdHJpbmcgY29udGFpbnMgImN1c3RvbWVyIiAoT3IgQTM4eC1Tb2xpZFJ1biBDbGVhciBmb2cgYm9hcmQpLCB1c2UgY3VzdG9tZXIgZGVmaW5lIGZvciBiaW5hcnlfaGVhZGVyCisJaWYgKChpbmRleCgkYm9hcmQsICJjdXN0b21lciIpICE9IC0xKSBvciAoaW5kZXgoJGJvYXJkLCAiY2xlYXJmb2ciKSAhPSAtMSkKKwkJb3IgKGluZGV4KCRib2FyZCwgImdmY2gxMDAiKSAhPSAtMSkpIHsKKwkJCXN5c3RlbSgiZWNobyBcIiNkZWZpbmUgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgMVwiID4+IGluY2x1ZGUvY29uZmlnLmgiKTsKIAl9CisKIH0KIGVsc2UKIHsKQEAgLTM0NCw2ICszNTIsMTkgQEAKIAlwcmludCAiXG4iOwogfQogCitpZigkb3B0X2QgZXEgNCkKK3sKKwlzeXN0ZW0oImVjaG8gXCJERFI0U1VCTElCID0geWVzXCIgPj4gaW5jbHVkZS9jb25maWcubWsiKTsKKwlwcmludCAiKiogUmVidWlsZCBERFI0IHN1YmxpYiAqKlxuIjsKKwkkb3B0X2QgPSAyOworfQorCisjYnkgZGVmYXVsdCAtZCAyIHdpbGwgYmUgZW5hYmxlZCBmb3IgbmV3IFRJUCBTb0NzCitpZigoJGRkcjNMaWJCdWlsZCBlcSAieWVzIikgJiYgISgoc3Vic3RyICRib2FyZCw3ICwgMykgZXEgIjM5eCIpKQoreworCSRvcHRfZCA9IDI7Cit9CisKIGlmKGRlZmluZWQgJG9wdF9kKQogewogCXN5c3RlbSgiZWNobyBcIkREUjNMSUIgPSAkb3B0X2RcIiA+PiBpbmNsdWRlL2NvbmZpZy5tayIpOwpAQCAtNDM5LDYgKzQ2MCw3IEBACiBwcmludCAiXG4qKioqIFtDcmVhdGluZyBJbWFnZV1cdCoqKioqXG5cbiI7CiAKICRmYWlsVWFydCA9IHN5c3RlbSgiLi90b29scy9tYXJ2ZWxsL2RvaW1hZ2UgLVQgdWFydCAtRCAwIC1FIDAgLUcgLi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvYmluX2hkci51YXJ0LmJpbiB1LWJvb3QuYmluIHUtYm9vdC0kYm9hcmRJRC0kb3B0X3YtJGZsYXNoX25hbWUkdGFyZ2V0Qm9hcmQtdWFydC5iaW4iKTsKKyRmYWlsRGVidWcgPSBzeXN0ZW0oIi4vdG9vbHMvbWFydmVsbC9kb2ltYWdlIC1UIHVhcnQgLUQgMCAtRSAwIC1IIDMgLUcgLi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvYmluX2hkci5kZWJ1Zy5iaW4gdS1ib290LmJpbiB1LWJvb3QtJGJvYXJkSUQtJG9wdF92LSRmbGFzaF9uYW1lJHRhcmdldEJvYXJkLWRlYnVnLmJpbiIpOwogJGZhaWwgPSBzeXN0ZW0oIi4vdG9vbHMvbWFydmVsbC9kb2ltYWdlIC1UICRpbWdfdHlwZSAtRCAweDAgLUUgMHgwICRpbWdfb3B0cyAkcnNhX29wdHMgJGlkX29wdHMgJGV4dHJhX29wdCAtRyAuL3Rvb2xzL21hcnZlbGwvYmluX2hkci8kYmluX2hkcl9uIHUtYm9vdC5iaW4gdS1ib290LSRib2FyZElELSRvcHRfdi0kZmxhc2hfbmFtZSR0YXJnZXRCb2FyZC5iaW4iKTsKIAogaWYoJGZhaWwpewpAQCAtNDQ5LDYgKzQ3MSwxMCBAQAogCXByaW50ICJcbiAqKiogRXJyb3I6IERvaW1hZ2UgZm9yIHVhcnQgaW1hZ2UgZmFpbGVkXG5cbiI7CiAJZXhpdCAxOwogfQoraWYoJGZhaWxEZWJ1Zyl7CisJcHJpbnQgIlxuICoqKiBFcnJvcjogRG9pbWFnZSBmb3IgZGVidWcgaW1hZ2UgZmFpbGVkXG5cbiI7CisJZXhpdCAxOworfQogCiBpZihkZWZpbmVkICRvcHRfbykKIHsKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfZGlzay5jIGIvY29tbW9uL2NtZF9kaXNrLmMKaW5kZXggZWU0ZTIxNS4uOGM0ZDBiZCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9kaXNrLmMKKysrIGIvY29tbW9uL2NtZF9kaXNrLmMKQEAgLTY3LDcgKzY3LDggQEAKIAkgICAgICAgIk5hbWU6ICUuMzJzICBUeXBlOiAlLjMyc1xuIiwgaW50ZiwgZGV2LCBwYXJ0LCBpbmZvLm5hbWUsCiAJICAgICAgIGluZm8udHlwZSk7CiAKLQlkZWJ1ZygiRmlyc3QgQmxvY2s6ICVsZCwgICMgb2YgYmxvY2tzOiAlbGQsIEJsb2NrIFNpemU6ICVsZFxuIiwKKwlkZWJ1ZygiRmlyc3QgQmxvY2s6ICIgTEJBRlUgIiwgICMgb2YgYmxvY2tzOiAiIExCQUZVCisJICAgICAgIiwgQmxvY2sgU2l6ZTogJWxkXG4iLAogCSAgICAgIGluZm8uc3RhcnQsIGluZm8uc2l6ZSwgaW5mby5ibGtzeik7CiAKIAlpZiAoZGV2X2Rlc2MtPmJsb2NrX3JlYWQoZGV2LCBpbmZvLnN0YXJ0LCAxLCAodWxvbmcgKikgYWRkcikgIT0gMSkgewpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9pMmMuYyBiL2NvbW1vbi9jbWRfaTJjLmMKaW5kZXggNDM4MDc5NC4uNmI1NWNhOCAxMDA2NDQKLS0tIGEvY29tbW9uL2NtZF9pMmMuYworKysgYi9jb21tb24vY21kX2kyYy5jCkBAIC0xNTc2LDYgKzE1NzYsOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBDT05GSUdfU1lTX0xPTkdIRUxQCiBzdGF0aWMgY2hhciBpMmNfaGVscF90ZXh0W10gPQorCSJhZGRyZXNzLlsuMCwgLjJdID0gQWRkcmVzcyBsZW5ndGggW2J5dGUsIDJieXRlXSIKKwkieHguWy5iLCAudywgLmxdICA9IFJldHVybmVkIERhdGEgbGVuZ3RoIFtieXRlLCAyYnl0ZSwgNGJ5dGVdIgogI2lmIGRlZmluZWQoQ09ORklHX0kyQ19NVVgpCiAJImJ1cyBbbXV4dHlwZTptdXhhZGRyOm11eGNoYW5uZWxdIC0gYWRkIGEgbmV3IGJ1cyByZWFjaGVkIG92ZXIgbXV4ZXNcbmkyYyAiCiAjZW5kaWYgIC8qIENPTkZJR19JMkNfTVVYICovCkBAIC0xNTg4LDkgKzE1OTAsOSBAQAogI2VuZGlmICAvKiBDT05GSUdfSTJDX0VESUQgKi8KIAkiaTJjIGxvb3AgY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIFsjIG9mIG9iamVjdHNdIC0gbG9vcGluZyByZWFkIG9mIGRldmljZVxuIgogCSJpMmMgbWQgY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIFsjIG9mIG9iamVjdHNdIC0gcmVhZCBmcm9tIEkyQyBkZXZpY2VcbiIKLQkiaTJjIG1tIGNoaXAgYWRkcmVzc1suMCwgLjEsIC4yXSAtIHdyaXRlIHRvIEkyQyBkZXZpY2UgKGF1dG8taW5jcmVtZW50aW5nKVxuIgotCSJpMmMgbXcgY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIHZhbHVlIFtjb3VudF0gLSB3cml0ZSB0byBJMkMgZGV2aWNlIChmaWxsKVxuIgotCSJpMmMgbm0gY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIC0gd3JpdGUgdG8gSTJDIGRldmljZSAoY29uc3RhbnQgYWRkcmVzcylcbiIKKwkiaTJjIG1tWy5iLCAudywgLmxdIGNoaXAgYWRkcmVzc1suMCwgLjEsIC4yXSAtIHdyaXRlIHRvIEkyQyBkZXZpY2UgKGF1dG8taW5jcmVtZW50aW5nKVxuIgorCSJpMmMgbm1bLmIsIC53LCAubF0gY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIC0gd3JpdGUgdG8gSTJDIGRldmljZSAoY29uc3RhbnQgYWRkcmVzcylcbiIKKwkiaTJjIG13IGNoaXAgYWRkcmVzc1suMCwgLjEsIC4yXSB2YWx1ZSBbY291bnRdIC0gd3JpdGUgdG8gSTJDIGRldmljZSAoZmlsbCBjb25zdGFudCB2YWx1ZSlcbiIKIAkiaTJjIHByb2JlIFthZGRyZXNzXSAtIHRlc3QgZm9yIGFuZCBzaG93IGRldmljZShzKSBvbiB0aGUgSTJDIGJ1c1xuIgogCSJpMmMgcmVhZCBjaGlwIGFkZHJlc3NbLjAsIC4xLCAuMl0gbGVuZ3RoIG1lbWFkZHJlc3MgLSByZWFkIHRvIG1lbW9yeSBcbiIKIAkiaTJjIHdyaXRlIG1lbWFkZHJlc3MgY2hpcCBhZGRyZXNzWy4wLCAuMSwgLjJdIGxlbmd0aCAtIHdyaXRlIG1lbW9yeSB0byBpMmNcbiIKZGlmZiAtLWdpdCBhL2NvbW1vbi9jbWRfbXRkcGFydHMuYyBiL2NvbW1vbi9jbWRfbXRkcGFydHMuYwppbmRleCA2NDJlZDRiLi4xODI2ZTFlIDEwMDc1NQotLS0gYS9jb21tb24vY21kX210ZHBhcnRzLmMKKysrIGIvY29tbW9uL2NtZF9tdGRwYXJ0cy5jCkBAIC04NjYsNiArODY2LDE5IEBACiAJLyogdmVyaWZ5IGlmIHdlIGhhdmUgYSB2YWxpZCBkZXZpY2Ugc3BlY2lmaWVkICovCiAJaWYgKChpZCA9IGlkX2ZpbmRfYnlfbXRkX2lkKG10ZF9pZCwgbXRkX2lkX2xlbiAtIDEpKSA9PSBOVUxMKSB7CiAJCXByaW50ZigiaW52YWxpZCBtdGQgZGV2aWNlICclLipzJ1xuIiwgbXRkX2lkX2xlbiAtIDEsIG10ZF9pZCk7CisJCS8qIGxldCAncCcgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGRldmljZSBpbiBvcmRlcgorCQkgKiB0byB0cnkgdG8gcGFyc2UgaXQgaW4gdGhlIG5leHQgaXRlcmF0aW9uCisJCSAqIGV4YW1wbGU6IG10ZHBhcnRzPXNwaV9mbGFzaDo0bShib290KSwtKHNwaS1yb290ZnMpO2FybWFkYS1uYW5kOjhtLi4uCisJCSAqIHdoZW4gZmFpbGluZyB0byByZWNvZ25pemUgJ3NwaV9mbGFzaCcsIGxldCAncCcgcG9pbnQgdG8gdGhlIHN0YXJ0CisJCSAqIG9mICdhcm1hZGEtbmFuZCcKKwkJICogKi8KKwkJcCA9IHN0cmNocihwLCAnOycpOworCQlpZiAocmV0KSB7CisJCQlpZiAocCkKKwkJCQkqcmV0ID0gKytwOworCQkJZWxzZQorCQkJCSpyZXQgPSBOVUxMOworCQl9CiAJCXJldHVybiAxOwogCX0KIApAQCAtOTI4LDcgKzk0MSwxMiBAQAogCQlpZiAoKnAgPT0gJzsnKSB7CiAJCQlpZiAocmV0KQogCQkJCSpyZXQgPSArK3A7Ci0JCX0gZWxzZSBpZiAoKnAgPT0gJ1wwJykgeworCQl9IGVsc2UgaWYgKCpwID09ICdcMCcgfHwgKCpwID09ICdcJycgJiYgKihwKzEpID09ICdcMCcpKSB7CisJCQkvKiBpZ25vcmUgJyBpZiBpdCBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIsIGluIGNhc2UgJ210ZHBhcnRzJyBpcyB3cmFwcGVkCisJCQkgKiB3aXRoIHF1b3RhdGlvbiBtYXJrcy4KKwkJCSAqIGV4YW1wbGU6IG10ZHBhcnRzPSdtdGRwYXJ0cz1zcGlfZmxhc2g6NG0oYm9vdCksLShzcGktcm9vdGZzKTthcm1hZGEtbmFuZDo4bS4uLicKKwkJCSAqIGlnbm9yZSB0aGUgbGFzdCBjaGFyYWN0ZXIgKHF1b3RhdGlvbiBtYXJrICcpLCBhbmQgZG9uJ3QgcHJpbnQgZXJyb3IgbWVzc2FnZSBvbiBpdAorCQkJICogKi8KIAkJCWlmIChyZXQpCiAJCQkJKnJldCA9IHA7CiAJCX0gZWxzZSB7CkBAIC0xNTUxLDYgKzE1NjksMTQgQEAKIAkvKiByZS1yZWFkICdtdGRwYXJ0cycgdmFyaWFibGUsIG10ZF9kZXZpY2VzX2luaXQgbWF5IGJlIHVwZGF0aW5nIGVudiAqLwogCXAgPSBnZXRlbnYoIm10ZHBhcnRzIik7CiAKKwkvKiBpZ25vcmUgJyBpZiBpdCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCBpbiBjYXNlICdtdGRwYXJ0cycgaXMgd3JhcHBlZAorCSAqIHdpdGggcXVvdGF0aW9uIG1hcmtzLgorCSAqIGV4YW1wbGU6IG10ZHBhcnRzPSdtdGRwYXJ0cz1zcGlfZmxhc2g6NG0oYm9vdCksLShzcGktcm9vdGZzKTthcm1hZGEtbmFuZDo4bS4uLicKKwkgKiBpZ25vcmUgdGhlIGZpcnN0IGNoYXJhY3RlciAocXVvdGF0aW9uIG1hcmsgJyksIGFuZCBkb24ndCBwcmludCBlcnJvcgorCSAqICovCisJaWYgKCpwID09ICdcJycpCisJCXArKzsKKwogCWlmIChzdHJuY21wKHAsICJtdGRwYXJ0cz0iLCA5KSAhPSAwKSB7CiAJCXByaW50ZigibXRkcGFydHMgdmFyaWFibGUgZG9lc24ndCBzdGFydCB3aXRoICdtdGRwYXJ0cz0nXG4iKTsKIAkJcmV0dXJuIGVycjsKQEAgLTE1NTksOCArMTU4NSwxMiBAQAogCiAJd2hpbGUgKHAgJiYgKCpwICE9ICdcMCcpKSB7CiAJCWVyciA9IDE7Ci0JCWlmICgoZGV2aWNlX3BhcnNlKHAsICZwLCAmZGV2KSAhPSAwKSB8fCAoIWRldikpCi0JCQlicmVhazsKKwkJaWYgKChkZXZpY2VfcGFyc2UocCwgJnAsICZkZXYpICE9IDApIHx8ICghZGV2KSkgeworCQkJLyogdHJ5IHRvIHBhcnNlIG5leHQgZGV2aWNlIGlmIHRoZSBjdXJyZW50IGRldmljZSBmYWlscworCQkJICogJ3AnIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgZGV2aWNlICovCisJCQllcnIgPSAwOworCQkJY29udGludWU7CisJCX0KIAogCQlkZWJ1ZygiKyBkZXZpY2U6ICVzXHQlZFx0JXNcbiIsIE1URF9ERVZfVFlQRShkZXYtPmlkLT50eXBlKSwKIAkJCQlkZXYtPmlkLT5udW0sIGRldi0+aWQtPm10ZF9pZCk7CkBAIC0xNjE5LDggKzE2NDksMTcgQEAKIAogCQlyZXQgPSAxOwogCQkvKiBwYXJzZSAnbm9yJ3wnbmFuZCd8J29uZW5hbmQnPGRldi1udW0+ICovCi0JCWlmIChtdGRfaWRfcGFyc2UocCwgJnAsICZ0eXBlLCAmbnVtKSAhPSAwKQotCQkJYnJlYWs7CisJCWlmIChtdGRfaWRfcGFyc2UocCwgJnAsICZ0eXBlLCAmbnVtKSAhPSAwKSB7CisJCQkvKiBsZXQgJ3AnIHBvaW50IHRvIHRoZSBuZXh0IDxpZG1hcD4sIHdoZW4gdGhlIGN1cnJlbnQgPGlkbWFwPiBwYXJzaW5nIGZhaWxzLgorCQkJICogZXhhbXBsZTogbXRkaWRzPXNwaTA9c3BpX2ZsYXNoLG5hbmQwPWFybWFkYS1uYW5kCisJCQkgKiB3aGVuIGZhaWxpbmcgdG8gcGFyc2Ugc3BpMCwgbGV0ICdwJyBwb2ludCB0byB0aGUgc3RhcnQgb2YgbmFuZDA9YXJtYWRhLW5hbmQKKwkJCSAqLworCQkJcCA9IHN0cmNocihwLCAnLCcpOworCQkJaWYgKHApCisJCQkJcCsrOworCQkJcmV0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CiAKIAkJaWYgKCpwICE9ICc9JykgewogCQkJcHJpbnRmKCJtdGRpZHM6IGluY29ycmVjdCA8ZGV2LW51bT5cbiIpOwpkaWZmIC0tZ2l0IGEvY29tbW9uL2NtZF9zY3NpLmMgYi9jb21tb24vY21kX3Njc2kuYwppbmRleCA2MmYyMDQyLi45NzdiZGU5IDEwMDY0NAotLS0gYS9jb21tb24vY21kX3Njc2kuYworKysgYi9jb21tb24vY21kX3Njc2kuYwpAQCAtMTEyLDYgKzExMiwxNCBAQAogCWxiYWludF90IGNhcGFjaXR5OwogCXVuc2lnbmVkIGxvbmcgYmxrc3o7CiAJY2NiKiBwY2NiPShjY2IgKikmdGVtcGNjYjsKKwlzdGF0aWMgaW50IHNjc2lfZGV0ZWN0ZWQgPSAwOworCisJaWYgKHNjc2lfZGV0ZWN0ZWQpIHsKKwkJcHJpbnRmKCIqKiBzY3NpIGRldGVjdGlvbiBjYW4gcnVuIG9ubHkgb25jZSAtIHBsZWFzZSIpOworCQlwcmludGYoIiByZXNldCBib2FyZCBiZWZvcmUgcnVubmluZyBkZXRlY3Rpb24gYWdhaW4gKipcbiIpOworCQlyZXR1cm47CisJfQorCXNjc2lfZGV0ZWN0ZWQgPSAxOwogCiAJaWYobW9kZT09MSkgewogCQlwcmludGYoInNjYW5uaW5nIGJ1cyBmb3IgZGV2aWNlcy4uLlxuIik7CkBAIC01MTcsNyArNTI1LDcgQEAKIAkJICAgICAgX19mdW5jX18sIHN0YXJ0LCBzbWFsbGJsa3MsIGJ1Zl9hZGRyKTsKIAkJaWYgKHNjc2lfZXhlYyhwY2NiKSAhPSBUUlVFKSB7CiAJCQlzY3NpX3ByaW50X2Vycm9yKHBjY2IpOwotCQkJYmxrY250IC09IGJsa3M7CisJCQlibGtjbnQgLT0gKGJsa3MgKyBzbWFsbGJsa3MpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnVmX2FkZHIgKz0gcGNjYi0+ZGF0YWxlbjsKZGlmZiAtLWdpdCBhL2Rpc2svcGFydF9lZmkuYyBiL2Rpc2svcGFydF9lZmkuYwpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDExMmI0MzguLjZmYjVkNDYKLS0tIGEvZGlzay9wYXJ0X2VmaS5jCisrKyBiL2Rpc2svcGFydF9lZmkuYwpAQCAtMjA2LDggKzIwNiw4IEBACiAJdXVpZF9zdHJpbmcoZ3B0X3B0ZVtwYXJ0IC0gMV0udW5pcXVlX3BhcnRpdGlvbl9ndWlkLmIsIGluZm8tPnV1aWQpOwogI2VuZGlmCiAKLQlkZWJ1ZygiJXM6IHN0YXJ0IDB4JWxYLCBzaXplIDB4JWxYLCBuYW1lICVzIiwgX19mdW5jX18sCi0JCWluZm8tPnN0YXJ0LCBpbmZvLT5zaXplLCBpbmZvLT5uYW1lKTsKKwlkZWJ1ZygiJXM6IHN0YXJ0IDB4IiBMQkFGICIsIHNpemUgMHgiIExCQUYgIiwgbmFtZSAlcyIsIF9fZnVuY19fLAorCSAgICAgIGluZm8tPnN0YXJ0LCBpbmZvLT5zaXplLCBpbmZvLT5uYW1lKTsKIAogCS8qIFJlbWVtYmVyIHRvIGZyZWUgcHRlICovCiAJZnJlZShncHRfcHRlKTsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCQkJZ3B0X2VbaV0ucGFydGl0aW9uX25hbWVba10gPQogCQkJCShlZmlfY2hhcjE2X3QpKHBhcnRpdGlvbnNbaV0ubmFtZVtrXSk7CiAKLQkJZGVidWcoIiVzOiBuYW1lOiAlcyBvZmZzZXRbJWRdOiAweCV4IHNpemVbJWRdOiAweCVseFxuIiwKKwkJZGVidWcoIiVzOiBuYW1lOiAlcyBvZmZzZXRbJWRdOiAweCV4IHNpemVbJWRdOiAweCIgTEJBRiAiXG4iLAogCQkgICAgICBfX2Z1bmNfXywgcGFydGl0aW9uc1tpXS5uYW1lLCBpLAogCQkgICAgICBvZmZzZXQsIGksIHBhcnRpdGlvbnNbaV0uc2l6ZSk7CiAJfQpkaWZmIC0tZ2l0IGEvZGlzay9wYXJ0X2lzby5jIGIvZGlzay9wYXJ0X2lzby5jCmluZGV4IGJhZWNlZDcuLjQ5YmZmMTUgMTAwNjQ0Ci0tLSBhL2Rpc2svcGFydF9pc28uYworKysgYi9kaXNrL3BhcnRfaXNvLmMKQEAgLTI2MSw4ICsyNjEsOCBAQAogCXByaW50ZigiUGFydCAgIFN0YXJ0ICAgICBTZWN0IHggU2l6ZSBUeXBlXG4iKTsKIAlpPTA7CiAJZG8gewotCQlwcmludGYgKCIgJTJkICU4bGQgJThsZCAlNmxkICUuMzJzXG4iLAotCQkJaSwgaW5mby5zdGFydCwgaW5mby5zaXplLCBpbmZvLmJsa3N6LCBpbmZvLnR5cGUpOworCQlwcmludGYoIiAlMmQgIiBMQkFGVSAiICIgTEJBRlUgIiAlNmxkICUuMzJzXG4iLAorCQkgICAgICAgaSwgaW5mby5zdGFydCwgaW5mby5zaXplLCBpbmZvLmJsa3N6LCBpbmZvLnR5cGUpOwogCQlpKys7CiAJfSB3aGlsZSAoZ2V0X3BhcnRpdGlvbl9pbmZvX2lzb192ZXJiKGRldl9kZXNjLGksJmluZm8sMCkhPS0xKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYWhjaS5jIGIvZHJpdmVycy9ibG9jay9haGNpLmMKaW5kZXggZDk3NjdiMy4uMDRjMTcyOSAxMDA3NTUKLS0tIGEvZHJpdmVycy9ibG9jay9haGNpLmMKKysrIGIvZHJpdmVycy9ibG9jay9haGNpLmMKQEAgLTUwMyw2ICs1MDMsMjAgQEAKIAlwcC0+Y21kX3Nsb3QtPnRibF9hZGRyX2hpID0gMDsKIH0KIAorc3RhdGljIGludCB3YWl0X3NwaW51cCh2b2xhdGlsZSB1OCAqcG9ydF9tbWlvKQoreworCXVsb25nIHN0YXJ0OworCXUzMiB0Zl9kYXRhOworCisJc3RhcnQgPSBnZXRfdGltZXIoMCk7CisJZG8geworCQl0Zl9kYXRhID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9URkRBVEEpOworCQlpZiAoISh0Zl9kYXRhICYgQVRBX0JVU1kpKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAoZ2V0X3RpbWVyKHN0YXJ0KSA8IFdBSVRfTVNfU1BJTlVQKTsKKworCXJldHVybiAtRVRJTUVET1VUOworfQogCiAjaWZkZWYgQ09ORklHX0FIQ0lfU0VURkVBVFVSRVNfWEZFUgogc3RhdGljIHZvaWQgYWhjaV9zZXRfZmVhdHVyZShzdHJ1Y3QgYWhjaV9wcm9iZV9lbnQgKnByb2JlX2VudCwgdTggcG9ydCkKQEAgLTU5NSw3ICs2MDksMTEgQEAKIAogCWRlYnVnKCJFeGl0IHN0YXJ0IHBvcnQgJWRcbiIsIHBvcnQpOwogCi0JcmV0dXJuIDA7CisJLyoKKwkgKiBNYWtlIHN1cmUgaW50ZXJmYWNlIGlzIG5vdCBidXN5IGJhc2VkIG9uIGVycm9yIGFuZCBzdGF0dXMKKwkgKiBpbmZvcm1hdGlvbiBmcm9tIHRhc2sgZmlsZSBkYXRhIHJlZ2lzdGVyIGJlZm9yZSBwcm9jZWVkaW5nCisJICovCisJcmV0dXJuIHdhaXRfc3BpbnVwKHBvcnRfbW1pbyk7CiB9CiAKIApAQCAtMTA2NSw2ICsxMDgzLDE0IEBACiAJZmlzWzFdID0gMSA8PCA3OwkgLyogQ29tbWFuZCBGSVMuICovCiAJZmlzWzJdID0gQVRBX0NNRF9GTFVTSF9FWFQ7CiAKKwkvKiBDbGVhciBJUlEgc3RhdHVzIHJlZ2lzdGVyCisJICogYmVmb3JlIGlzc3VpbmcgdGhlIGZsdXNoIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIsIG1ha2UKKwkgKiBzdXJlIElSUSBzdGF0dXMgcmVnaXN0ZXIgaXMgZmx1c2hlZCAoaW4gY2FzZSBhIHByZXZpb3VzCisJICogdHJhbnNhY3Rpb24gZW5kZWQsIHdpdGhvdXQgY2xlYXJpbmcgaXQpLiAqKiBGbHVzaCBjb21tYW5kCisJICogd2lsbCBub3Qgc3RhcnQvY29tcGxldGUgdW5sZXNzIGNsZWFyaW5nIElSUSAqKgorCSAqICovCisJd3JpdGVsX3dpdGhfZmx1c2goMHhmZmZmZmZmZiwgcG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CisKIAltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKilwcC0+Y21kX3RibCwgZmlzLCAyMCk7CiAJYWhjaV9maWxsX2NtZF9zbG90KHBwLCBjbWRfZmlzX2xlbik7CiAJd3JpdGVsX3dpdGhfZmx1c2goMSwgcG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL3NkaGNpLmMKaW5kZXggM2JhYjczOS4uNzIyN2JmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9zZGhjaS5jCkBAIC0xNDksOCArMTQ5LDggQEAKIAlpbnQgdHJhbnNfYnl0ZXMgPSAwLCBpc19hbGlnbmVkID0gMTsKIAl1MzIgbWFzaywgZmxhZ3MsIG1vZGU7CiAJdW5zaWduZWQgaW50IHRpbWUgPSAwLCBzdGFydF9hZGRyID0gMDsKLQl1bnNpZ25lZCBpbnQgcmV0cnkgPSAxMDAwMDsKIAlpbnQgbW1jX2RldiA9IG1tYy0+YmxvY2tfZGV2LmRldjsKKwl1bnNpZ25lZCBzdGFydCA9IGdldF90aW1lcigwKTsKIAogCS8qIFRpbWVvdXQgdW5pdCAtIG1zICovCiAJc3RhdGljIHVuc2lnbmVkIGludCBjbWRfdGltZW91dCA9IENPTkZJR19TREhDSV9DTURfREVGQVVMVF9USU1FT1VUOwpAQCAtMjM2LDYgKzIzNiw3IEBACiAJZmx1c2hfY2FjaGUoc3RhcnRfYWRkciwgdHJhbnNfYnl0ZXMpOwogI2VuZGlmCiAJc2RoY2lfd3JpdGV3KGhvc3QsIFNESENJX01BS0VfQ01EKGNtZC0+Y21kaWR4LCBmbGFncyksIFNESENJX0NPTU1BTkQpOworCXN0YXJ0ID0gZ2V0X3RpbWVyKDApOwogCWRvIHsKIAkJc3RhdCA9IHNkaGNpX3JlYWRsKGhvc3QsIFNESENJX0lOVF9TVEFUVVMpOwogCQlpZiAoc3RhdCAmIFNESENJX0lOVF9FUlJPUikKQEAgLTI0NywxMSArMjQ4LDEwIEBACiAJCQljbWQtPmNtZGlkeCA9PSBNTUNfQ01EX1NUT1BfVFJBTlNNSVNTSU9OKQogCQkJdWRlbGF5KDUpOwogI2VuZGlmCi0JCWlmICgtLXJldHJ5ID09IDApCi0JCQlicmVhazsKLQl9IHdoaWxlICgoc3RhdCAmIG1hc2spICE9IG1hc2spOworCX0gd2hpbGUgKCgoc3RhdCAmIG1hc2spICE9IG1hc2spICYmCisJCSAoZ2V0X3RpbWVyKHN0YXJ0KSA8IENPTkZJR19TREhDSV9DTURfREVGQVVMVF9USU1FT1VUKSk7CiAKLQlpZiAocmV0cnkgPT0gMCkgeworCWlmIChnZXRfdGltZXIoc3RhcnQpID49IENPTkZJR19TREhDSV9DTURfREVGQVVMVF9USU1FT1VUKSB7CiAJCWlmIChob3N0LT5xdWlya3MgJiBTREhDSV9RVUlSS19CUk9LRU5fUjFCKQogCQkJcmV0dXJuIDA7CiAJCWVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL25hbmQuYwppbmRleCBkNzliYzFjLi5lZDQwYWI2IDEwMDc1NQotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25hbmQuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25hbmQuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAJYm9hcmRfbmFuZF9zZWxlY3RfZGV2aWNlKG5hbmRfaW5mb1tuYW5kX2N1cnJfZGV2aWNlXS5wcml2LCBuYW5kX2N1cnJfZGV2aWNlKTsKICNlbmRpZgogfQotI2lmIGRlZmluZWQoQ09ORklHX0VOVl9JU19JTl9OQU5EKQorCiBpbnQgbmFuZF9nZXRfZW52X29mZnModm9pZCkKIHsKIAlzaXplX3Qgb2Zmc2V0ID0gMDsKQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGkgKyAxKSAqIGJsb2Nrc2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGlmIChzdW0gPj0gQ09ORklHX0VOVl9SQU5HRSkKKyAgICAgICAgICAgICAgICBpZiAoc3VtID49IENPTkZJR19FTlZfUkFOR0VfTkFORCkKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIH0KQEAgLTE2NiwxMSArMTY2LDEwIEBACiAJc2l6ZV90IGVudl9zaXplID0gMDsKIAlzaXplX3QgYmxvY2tzaXplID0gbmFuZF9pbmZvWzBdLmVyYXNlc2l6ZTsKIAotCWlmIChibG9ja3NpemUgPCBDT05GSUdfRU5WX1NJWkUpIHsKLQkJZW52X3NpemUgPSAoKENPTkZJR19FTlZfU0laRSArIChibG9ja3NpemUgLSAxKSkgJiAofihibG9ja3NpemUtMSkpKTsKKwlpZiAoYmxvY2tzaXplIDwgQ09ORklHX0VOVl9TSVpFX05BTkQpIHsKKwkJZW52X3NpemUgPSAoKENPTkZJR19FTlZfU0laRV9OQU5EICsgKGJsb2Nrc2l6ZSAtIDEpKSAmICh+KGJsb2Nrc2l6ZS0xKSkpOwogCQlyZXR1cm4gZW52X3NpemU7CiAJfSBlbHNlCiAJCXJldHVybiBibG9ja3NpemU7CiB9Ci0jZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrYWRkci5oIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9oL3NrYWRkci5oCmluZGV4IGJjNGZjZGIuLmUyMTYzZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NrOThsaW4vaC9za2FkZHIuaAorKysgYi9kcml2ZXJzL25ldC9zazk4bGluL2gvc2thZGRyLmgKQEAgLTE1Niw2ICsxNTYsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBzX01hY0FkZHIgewogCVNLX1U4CWFbU0tfTUFDX0FERFJfTEVOXTsKKwlTS19VMTYJRHVtbXlBbGlnbldvcmQ7IC8qIER1bW15IGVudHJ5IGZvciAzMmJpdCBhbGlnbm1lbnQgb25seS4gKi8KIH0gU0tfTUFDX0FERFI7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCA1OTgxMjAwLi5jNTUzMDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgeGhjaV9jdHJsIHhoY2ljW0NPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfQ09VTlRdOworc3RhdGljIHN0cnVjdCB4aGNpX2N0cmwgeGhjaWNbQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9IT1NUX0NPVU5UXTsKIAogLyoqCiAgKiBXYWl0cyBmb3IgYXMgcGVyIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9kZXYuYyBiL2ZzL2V4dDQvZGV2LmMKaW5kZXggNDY0YTY3ZC4uZGNiYjE3ZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9kZXYuYworKysgYi9mcy9leHQ0L2Rldi5jCkBAIC00MSw3ICs0MSw3IEBACiAjaW5jbHVkZSA8ZXh0NGZzLmg+CiAjaW5jbHVkZSA8ZXh0X2NvbW1vbi5oPgogCi11bnNpZ25lZCBsb25nIHBhcnRfb2Zmc2V0OworbGJhaW50X3QgcGFydF9vZmZzZXQ7CiAKIHN0YXRpYyBibG9ja19kZXZfZGVzY190ICpleHQ0ZnNfYmxvY2tfZGV2X2Rlc2M7CiBzdGF0aWMgZGlza19wYXJ0aXRpb25fdCAqcGFydF9pbmZvOwpAQCAtNTUsNyArNTUsNyBAQAogCWdldF9mcygpLT5kZXZfZGVzYyA9IHJiZGQ7CiB9CiAKLWludCBleHQ0ZnNfZGV2cmVhZChpbnQgc2VjdG9yLCBpbnQgYnl0ZV9vZmZzZXQsIGludCBieXRlX2xlbiwgY2hhciAqYnVmKQoraW50IGV4dDRmc19kZXZyZWFkKGxiYWludF90IHNlY3RvciwgaW50IGJ5dGVfb2Zmc2V0LCBpbnQgYnl0ZV9sZW4sIGNoYXIgKmJ1ZikKIHsKIAlBTExPQ19DQUNIRV9BTElHTl9CVUZGRVIoY2hhciwgc2VjX2J1ZiwgU0VDVE9SX1NJWkUpOwogCXVuc2lnbmVkIGJsb2NrX2xlbjsKQEAgLTY0LDcgKzY0LDcgQEAKIAlpZiAoKHNlY3RvciA8IDApCiAJICAgIHx8ICgoc2VjdG9yICsgKChieXRlX29mZnNldCArIGJ5dGVfbGVuIC0gMSkgPj4gU0VDVE9SX0JJVFMpKSA+PQogCQlwYXJ0X2luZm8tPnNpemUpKSB7Ci0JCXByaW50ZigiJXMgcmVhZCBvdXRzaWRlIHBhcnRpdGlvbiAlZFxuIiwgX19mdW5jX18sIHNlY3Rvcik7CisJCXByaW50ZigiJXMgcmVhZCBvdXRzaWRlIHBhcnRpdGlvbiAiIExCQUZVICJcbiIsIF9fZnVuY19fLCBzZWN0b3IpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTcyLDcgKzcyLDcgQEAKIAlzZWN0b3IgKz0gYnl0ZV9vZmZzZXQgPj4gU0VDVE9SX0JJVFM7CiAJYnl0ZV9vZmZzZXQgJj0gU0VDVE9SX1NJWkUgLSAxOwogCi0JZGVidWcoIiA8JWQsICVkLCAlZD5cbiIsIHNlY3RvciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuKTsKKwlkZWJ1ZygiIDwiIExCQUZVICIsICVkLCAlZD5cbiIsIHNlY3RvciwgYnl0ZV9vZmZzZXQsIGJ5dGVfbGVuKTsKIAogCWlmIChleHQ0ZnNfYmxvY2tfZGV2X2Rlc2MgPT0gTlVMTCkgewogCQlwcmludGYoIioqIEludmFsaWQgQmxvY2sgRGV2aWNlIERlc2NyaXB0b3IgKE5VTEwpXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9jb21tb24uYyBiL2ZzL2V4dDQvZXh0NF9jb21tb24uYwppbmRleCBiY2M5ZGM4Li5jNjE4NWNhIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfY29tbW9uLmMKKysrIGIvZnMvZXh0NC9leHQ0X2NvbW1vbi5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAlpZiAoKHN0YXJ0YmxvY2sgKyAoc2l6ZSAvIFNFQ1RPUl9TSVpFKSkgPgogCSAgICAocGFydF9vZmZzZXQgKyBmcy0+dG90YWxfc2VjdCkpIHsKLQkJcHJpbnRmKCJwYXJ0X29mZnNldCBpcyAlbHVcbiIsIHBhcnRfb2Zmc2V0KTsKKwkJcHJpbnRmKCJwYXJ0X29mZnNldCBpcyAiIExCQUZVICJcbiIsIHBhcnRfb2Zmc2V0KTsKIAkJcHJpbnRmKCJ0b3RhbF9zZWN0b3IgaXMgJWxsdVxuIiwgZnMtPnRvdGFsX3NlY3QpOwogCQlwcmludGYoImVycm9yOiBvdmVyZmxvdyBvY2N1cnNcbiIpOwogCQlyZXR1cm47CkBAIC00MDUsNyArNDA1LDcgQEAKIAkJcHJldmlvdXNfYmxrbnIgPSByb290X2Jsa25yOwogCX0KIAotCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGZpcnN0X2Jsb2NrX25vX29mX3Jvb3QKKwlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpZmlyc3RfYmxvY2tfbm9fb2Zfcm9vdAogCQkJCSogZnMtPnNlY3RfcGVyYmxrLAogCQkJCTAsIGZzLT5ibGtzeiwgcm9vdF9maXJzdF9ibG9ja19idWZmZXIpOwogCWlmIChzdGF0dXMgPT0gMCkKQEAgLTQ1Nyw5ICs0NTcsOSBAQAogCQkJCQlnb3RvIGZhaWw7CiAJCQkJfQogCQkJCXB1dF9leHQ0KCgodWludDY0X3QpCi0JCQkJCSAgKGdfcGFyZW50X2lub2RlLT5iLgorCQkJCQkgICgodWludDY0X3QpZ19wYXJlbnRfaW5vZGUtPmIuCiAJCQkJCSAgIGJsb2Nrcy5kaXJfYmxvY2tzW2RpcmVjdF9ibGtfaWR4XSAqCi0JCQkJCSAgIGZzLT5ibGtzeikpLCB6ZXJvX2J1ZmZlciwgZnMtPmJsa3N6KTsKKwkJCQkJICAgKHVpbnQ2NF90KWZzLT5ibGtzeikpLCB6ZXJvX2J1ZmZlciwgZnMtPmJsa3N6KTsKIAkJCQlnX3BhcmVudF9pbm9kZS0+c2l6ZSA9CiAJCQkJICAgIGdfcGFyZW50X2lub2RlLT5zaXplICsgZnMtPmJsa3N6OwogCQkJCWdfcGFyZW50X2lub2RlLT5ibG9ja2NudCA9CkBAIC01NDUsNyArNTQ1LDcgQEAKIAkJaWYgKCFibG9ja19idWZmZXIpCiAJCQlnb3RvIGZhaWw7CiAKLQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssCisJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtuciAqIGZzLT5zZWN0X3BlcmJsaywKIAkJCQkJMCwgZnMtPmJsa3N6LCAoY2hhciAqKWJsb2NrX2J1ZmZlcik7CiAJCWlmIChzdGF0dXMgPT0gMCkKIAkJCWdvdG8gZmFpbDsKQEAgLTc4Myw3ICs3ODMsNyBAQAogCWlmICghcm9vdF9maXJzdF9ibG9ja19idWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCXJvb3RfZmlyc3RfYmxvY2tfYWRkciA9IHJvb3RfZmlyc3RfYmxvY2tfYnVmZmVyOwotCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGZpcnN0X2Jsb2NrX25vX29mX3Jvb3QgKgorCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClmaXJzdF9ibG9ja19ub19vZl9yb290ICoKIAkJCQlmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkJZnMtPmJsa3N6LCByb290X2ZpcnN0X2Jsb2NrX2J1ZmZlcik7CiAJaWYgKHN0YXR1cyA9PSAwKQpAQCAtODc2LDggKzg3Niw4IEBACiAJCWZvciAoaSA9IDA7IGkgPCBmcy0+bm9fYmxrZ3JwOyBpKyspIHsKIAkJCWlmIChiZ2RbaV0uZnJlZV9ibG9ja3MpIHsKIAkJCQlpZiAoYmdkW2ldLmJnX2ZsYWdzICYgRVhUNF9CR19CTE9DS19VTklOSVQpIHsKLQkJCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKGJnZFtpXS5ibG9ja19pZCAqCi0JCQkJCQkJICAgICAgZnMtPmJsa3N6KSksCisJCQkJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpYmdkW2ldLmJsb2NrX2lkICoKKwkJCQkJCQkgICAgICAodWludDY0X3QpZnMtPmJsa3N6KSksCiAJCQkJCQkgemVyb19idWZmZXIsIGZzLT5ibGtzeik7CiAJCQkJCWJnZFtpXS5iZ19mbGFncyA9CiAJCQkJCSAgICBiZ2RbaV0uCkBAIC04OTUsNyArODk1LDggQEAKIAkJCQlmcy0+Zmlyc3RfcGFzc19iYm1hcCsrOwogCQkJCWJnZFtpXS5mcmVlX2Jsb2Nrcy0tOwogCQkJCWZzLT5zYi0+ZnJlZV9ibG9ja3MtLTsKLQkJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChiZ2RbaV0uYmxvY2tfaWQgKgorCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdCkKKwkJCQkJCQliZ2RbaV0uYmxvY2tfaWQgKgogCQkJCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkJCQlmcy0+Ymxrc3osCiAJCQkJCQkJam91cm5hbF9idWZmZXIpOwpAQCAtOTQwLDggKzk0MSw4IEBACiAKIAkJaWYgKGJnZFtiZ19pZHhdLmJnX2ZsYWdzICYgRVhUNF9CR19CTE9DS19VTklOSVQpIHsKIAkJCW1lbXNldCh6ZXJvX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJCXB1dF9leHQ0KCgodWludDY0X3QpIChiZ2RbYmdfaWR4XS5ibG9ja19pZCAqCi0JCQkJCWZzLT5ibGtzeikpLCB6ZXJvX2J1ZmZlciwgZnMtPmJsa3N6KTsKKwkJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpYmdkW2JnX2lkeF0uYmxvY2tfaWQgKgorCQkJCQkodWludDY0X3QpZnMtPmJsa3N6KSksIHplcm9fYnVmZmVyLCBmcy0+Ymxrc3opOwogCQkJbWVtY3B5KGZzLT5ibGtfYm1hcHNbYmdfaWR4XSwgemVyb19idWZmZXIsIGZzLT5ibGtzeik7CiAJCQliZ2RbYmdfaWR4XS5iZ19mbGFncyA9IGJnZFtiZ19pZHhdLmJnX2ZsYWdzICYKIAkJCQkJCX5FWFQ0X0JHX0JMT0NLX1VOSU5JVDsKQEAgLTk1Nyw3ICs5NTgsNyBAQAogCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQlpZiAocHJldl9iZ19iaXRtYXBfaW5kZXggIT0gYmdfaWR4KSB7CiAJCQltZW1zZXQoam91cm5hbF9idWZmZXIsICdcMCcsIGZzLT5ibGtzeik7Ci0JCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChiZ2RbYmdfaWR4XS5ibG9ja19pZAorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkCiAJCQkJCQkqIGZzLT5zZWN0X3BlcmJsaywKIAkJCQkJCTAsIGZzLT5ibGtzeiwgam91cm5hbF9idWZmZXIpOwogCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtMTAwNyw4ICsxMDA4LDggQEAKIAkJCQkJCWJnZFtpXS5mcmVlX2lub2RlczsKIAkJCQlpZiAoYmdkW2ldLmJnX2ZsYWdzICYgRVhUNF9CR19JTk9ERV9VTklOSVQpIHsKIAkJCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkKLQkJCQkJCSAgKGJnZFtpXS5pbm9kZV9pZCAqCi0JCQkJCQkJZnMtPmJsa3N6KSksCisJCQkJCQkgICgodWludDY0X3QpYmdkW2ldLmlub2RlX2lkICoKKwkJCQkJCQkodWludDY0X3QpZnMtPmJsa3N6KSksCiAJCQkJCQkgemVyb19idWZmZXIsIGZzLT5ibGtzeik7CiAJCQkJCWJnZFtpXS5iZ19mbGFncyA9IGJnZFtpXS5iZ19mbGFncyAmCiAJCQkJCQkJfkVYVDRfQkdfSU5PREVfVU5JTklUOwpAQCAtMTAyNiw3ICsxMDI3LDggQEAKIAkJCQliZ2RbaV0uZnJlZV9pbm9kZXMtLTsKIAkJCQliZ2RbaV0uYmdfaXRhYmxlX3VudXNlZC0tOwogCQkJCWZzLT5zYi0+ZnJlZV9pbm9kZXMtLTsKLQkJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChiZ2RbaV0uaW5vZGVfaWQgKgorCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdCkKKwkJCQkJCQliZ2RbaV0uaW5vZGVfaWQgKgogCQkJCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkJCQlmcy0+Ymxrc3osCiAJCQkJCQkJam91cm5hbF9idWZmZXIpOwpAQCAtMTA0Nyw4ICsxMDQ5LDggQEAKIAkJaWJtYXBfaWR4ID0gZnMtPmN1cnJfaW5vZGVfbm8gLyBpbm9kZXNfcGVyX2dycDsKIAkJaWYgKGJnZFtpYm1hcF9pZHhdLmJnX2ZsYWdzICYgRVhUNF9CR19JTk9ERV9VTklOSVQpIHsKIAkJCW1lbXNldCh6ZXJvX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJCXB1dF9leHQ0KCgodWludDY0X3QpIChiZ2RbaWJtYXBfaWR4XS5pbm9kZV9pZCAqCi0JCQkJCSAgICAgIGZzLT5ibGtzeikpLCB6ZXJvX2J1ZmZlciwKKwkJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpYmdkW2libWFwX2lkeF0uaW5vZGVfaWQgKgorCQkJCQkgICAgICAodWludDY0X3QpZnMtPmJsa3N6KSksIHplcm9fYnVmZmVyLAogCQkJCSBmcy0+Ymxrc3opOwogCQkJYmdkW2libWFwX2lkeF0uYmdfZmxhZ3MgPQogCQkJICAgIGJnZFtpYm1hcF9pZHhdLmJnX2ZsYWdzICYgfkVYVDRfQkdfSU5PREVfVU5JTklUOwpAQCAtMTA2Nyw3ICsxMDY5LDggQEAKIAkJLyogam91cm5hbCBiYWNrdXAgKi8KIAkJaWYgKHByZXZfaW5vZGVfYml0bWFwX2luZGV4ICE9IGlibWFwX2lkeCkgewogCQkJbWVtc2V0KGpvdXJuYWxfYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoYmdkW2libWFwX2lkeF0uaW5vZGVfaWQKKwkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdCkKKwkJCQkJCWJnZFtpYm1hcF9pZHhdLmlub2RlX2lkCiAJCQkJCQkqIGZzLT5zZWN0X3BlcmJsaywKIAkJCQkJCTAsIGZzLT5ibGtzeiwgam91cm5hbF9idWZmZXIpOwogCQkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtMTEyOSw3ICsxMTMyLDcgQEAKIAkJKCpub19ibGtzX3JlcWQpKys7CiAJCWRlYnVnKCJTSVBCICVsZDogJXVcbiIsIHNpX2Jsb2Nrbm8sICp0b3RhbF9yZW1haW5pbmdfYmxvY2tzKTsKIAotCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChzaV9ibG9ja25vICogZnMtPnNlY3RfcGVyYmxrLAorCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3Qpc2lfYmxvY2tubyAqIGZzLT5zZWN0X3BlcmJsaywKIAkJCQkJMCwgZnMtPmJsa3N6LCAoY2hhciAqKXNpX2J1ZmZlcik7CiAJCW1lbXNldChzaV9idWZmZXIsICdcMCcsIGZzLT5ibGtzeik7CiAJCWlmIChzdGF0dXMgPT0gMCkKQEAgLTExNTIsNyArMTE1NSw3IEBACiAJCX0KIAogCQkvKiB3cml0ZSB0aGUgYmxvY2sgdG8gZGlzayAqLwotCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoc2lfYmxvY2tubyAqIGZzLT5ibGtzeikpLAorCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoKHVpbnQ2NF90KXNpX2Jsb2Nrbm8gKiAodWludDY0X3QpZnMtPmJsa3N6KSksCiAJCQkgc2lfc3RhcnRfYWRkciwgZnMtPmJsa3N6KTsKIAkJZmlsZV9pbm9kZS0+Yi5ibG9ja3MuaW5kaXJfYmxvY2sgPSBzaV9ibG9ja25vOwogCX0KQEAgLTExOTMsNyArMTE5Niw3IEBACiAJCWRlYnVnKCJESVBCICVsZDogJXVcbiIsIGRpX2Jsb2Nrbm9fcGFyZW50LAogCQkgICAgICAqdG90YWxfcmVtYWluaW5nX2Jsb2Nrcyk7CiAKLQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoZGlfYmxvY2tub19wYXJlbnQgKgorCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpZGlfYmxvY2tub19wYXJlbnQgKgogCQkJCQlmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkJCWZzLT5ibGtzeiwgKGNoYXIgKilkaV9wYXJlbnRfYnVmZmVyKTsKIApAQCAtMTIyNCw3ICsxMjI3LDcgQEAKIAkJCWRlYnVnKCJESUNCICVsZDogJXVcbiIsIGRpX2Jsb2Nrbm9fY2hpbGQsCiAJCQkgICAgICAqdG90YWxfcmVtYWluaW5nX2Jsb2Nrcyk7CiAKLQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGRpX2Jsb2Nrbm9fY2hpbGQgKgorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWRpX2Jsb2Nrbm9fY2hpbGQgKgogCQkJCQkJZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCQkJZnMtPmJsa3N6LAogCQkJCQkJKGNoYXIgKilkaV9jaGlsZF9idWZmKTsKQEAgLTEyNTEsNyArMTI1NCw3IEBACiAJCQkJCWJyZWFrOwogCQkJfQogCQkJLyogd3JpdGUgdGhlIGJsb2NrICB0YWJsZSAqLwotCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKGRpX2Jsb2Nrbm9fY2hpbGQgKiBmcy0+Ymxrc3opKSwKKwkJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpZGlfYmxvY2tub19jaGlsZCAqICh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCQkgZGlfY2hpbGRfYnVmZl9zdGFydCwgZnMtPmJsa3N6KTsKIAkJCWZyZWUoZGlfY2hpbGRfYnVmZl9zdGFydCk7CiAJCQlkaV9jaGlsZF9idWZmX3N0YXJ0ID0gTlVMTDsKQEAgLTEyNTksNyArMTI2Miw3IEBACiAJCQlpZiAoKnRvdGFsX3JlbWFpbmluZ19ibG9ja3MgPT0gMCkKIAkJCQlicmVhazsKIAkJfQotCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoZGlfYmxvY2tub19wYXJlbnQgKiBmcy0+Ymxrc3opKSwKKwkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKCh1aW50NjRfdClkaV9ibG9ja25vX3BhcmVudCAqICh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCSBkaV9ibG9ja19zdGFydF9hZGRyLCBmcy0+Ymxrc3opOwogCQlmaWxlX2lub2RlLT5iLmJsb2Nrcy5kb3VibGVfaW5kaXJfYmxvY2sgPSBkaV9ibG9ja25vX3BhcmVudDsKIAl9CkBAIC0xMzU3LDggKzEzNjAsOCBAQAogCQkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCS8qIHdyaXRlIHRoZSBjaGlsZCBibG9jayAqLwotCQkJCXB1dF9leHQ0KCgodWludDY0X3QpICh0aV9jaGlsZF9ibG9ja25vICoKLQkJCQkJCSAgICAgIGZzLT5ibGtzeikpLAorCQkJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpdGlfY2hpbGRfYmxvY2tubyAqCisJCQkJCQkgICAgICAodWludDY0X3QpZnMtPmJsa3N6KSksCiAJCQkJCSB0aV9jYnVmZl9zdGFydF9hZGRyLCBmcy0+Ymxrc3opOwogCQkJCWZyZWUodGlfY2J1ZmZfc3RhcnRfYWRkcik7CiAKQEAgLTEzNjYsNyArMTM2OSw3IEBACiAJCQkJCWJyZWFrOwogCQkJfQogCQkJLyogd3JpdGUgdGhlIHBhcmVudCBibG9jayAqLwotCQkJcHV0X2V4dDQoKCh1aW50NjRfdCkgKHRpX3BhcmVudF9ibG9ja25vICogZnMtPmJsa3N6KSksCisJCQlwdXRfZXh0NCgoKHVpbnQ2NF90KSAoKHVpbnQ2NF90KXRpX3BhcmVudF9ibG9ja25vICogKHVpbnQ2NF90KWZzLT5ibGtzeikpLAogCQkJCSB0aV9wYnVmZl9zdGFydF9hZGRyLCBmcy0+Ymxrc3opOwogCQkJZnJlZSh0aV9wYnVmZl9zdGFydF9hZGRyKTsKIApAQCAtMTM3NCw3ICsxMzc3LDcgQEAKIAkJCQlicmVhazsKIAkJfQogCQkvKiB3cml0ZSB0aGUgZ3JhbmQgcGFyZW50IGJsb2NrICovCi0JCXB1dF9leHQ0KCgodWludDY0X3QpICh0aV9ncF9ibG9ja25vICogZnMtPmJsa3N6KSksCisJCXB1dF9leHQ0KCgodWludDY0X3QpICgodWludDY0X3QpdGlfZ3BfYmxvY2tubyAqICh1aW50NjRfdClmcy0+Ymxrc3opKSwKIAkJCSB0aV9ncF9idWZmX3N0YXJ0X2FkZHIsIGZzLT5ibGtzeik7CiAJCWZpbGVfaW5vZGUtPmIuYmxvY2tzLnRyaXBsZV9pbmRpcl9ibG9jayA9IHRpX2dwX2Jsb2Nrbm87CiAJfQpAQCAtMTQ0Nyw3ICsxNDUwLDggQEAKIAkJYmxvY2sgPSBsZTMyX3RvX2NwdShpbmRleFtpXS5laV9sZWFmX2hpKTsKIAkJYmxvY2sgPSAoYmxvY2sgPDwgMzIpICsgbGUzMl90b19jcHUoaW5kZXhbaV0uZWlfbGVhZl9sbyk7CiAKLQkJaWYgKGV4dDRmc19kZXZyZWFkKGJsb2NrIDw8IGxvZzJfYmxrc3osIDAsIGZzLT5ibGtzeiwgYnVmKSkKKwkJaWYgKGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibG9jayA8PCBsb2cyX2Jsa3N6LCAwLCBmcy0+Ymxrc3osCisJCQkJICAgYnVmKSkKIAkJCWV4dF9ibG9jayA9IChzdHJ1Y3QgZXh0NF9leHRlbnRfaGVhZGVyICopYnVmOwogCQllbHNlCiAJCQlyZXR1cm4gMDsKQEAgLTE0NjksNyArMTQ3Myw3IEBACiAJZGVidWcoImV4dDRmcyByZWFkICVkIGdyb3VwIGRlc2NyaXB0b3IgKGJsa25vICVsZCBibGtvZmYgJXUpXG4iLAogCSAgICAgIGdyb3VwLCBibGtubywgYmxrb2ZmKTsKIAotCXJldHVybiBleHQ0ZnNfZGV2cmVhZChibGtubyA8PCBMT0cyX0VYVDJfQkxPQ0tfU0laRShkYXRhKSwKKwlyZXR1cm4gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25vIDw8IExPRzJfRVhUMl9CTE9DS19TSVpFKGRhdGEpLAogCQkJICAgICAgYmxrb2ZmLCBzaXplb2Yoc3RydWN0IGV4dDJfYmxvY2tfZ3JvdXApLAogCQkJICAgICAgKGNoYXIgKilibGtncnApOwogfQpAQCAtMTQ5NSw3ICsxNDk5LDcgQEAKIAkgICAgKGlubyAlIF9fbGUzMl90b19jcHUoc2Jsb2NrLT5pbm9kZXNfcGVyX2dyb3VwKSkgLyBpbm9kZXNfcGVyX2Jsb2NrOwogCWJsa29mZiA9IChpbm8gJSBpbm9kZXNfcGVyX2Jsb2NrKSAqIGZzLT5pbm9kZXN6OwogCS8qIFJlYWQgdGhlIGlub2RlLiAqLwotCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJsa25vIDw8IExPRzJfRVhUMl9CTE9DS19TSVpFKGRhdGEpLCBibGtvZmYsCisJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25vIDw8IExPRzJfRVhUMl9CTE9DS19TSVpFKGRhdGEpLCBibGtvZmYsCiAJCQkJc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKSwgKGNoYXIgKilpbm9kZSk7CiAJaWYgKHN0YXR1cyA9PSAwKQogCQlyZXR1cm4gMDsKQEAgLTE1OTIsNyArMTU5Niw3IEBACiAJCWlmICgoX19sZTMyX3RvX2NwdShpbm9kZS0+Yi5ibG9ja3MuaW5kaXJfYmxvY2spIDw8CiAJCSAgICAgbG9nMl9ibGtzeikgIT0gZXh0NGZzX2luZGlyMV9ibGtubykgewogCQkJc3RhdHVzID0KLQkJCSAgICBleHQ0ZnNfZGV2cmVhZChfX2xlMzJfdG9fY3B1CisJCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KV9fbGUzMl90b19jcHUKIAkJCQkJICAgKGlub2RlLT5iLmJsb2Nrcy4KIAkJCQkJICAgIGluZGlyX2Jsb2NrKSA8PCBsb2cyX2Jsa3N6LCAwLAogCQkJCQkgICBibGtzeiwgKGNoYXIgKilleHQ0ZnNfaW5kaXIxX2Jsb2NrKTsKQEAgLTE2NDEsNyArMTY0NSw3IEBACiAJCWlmICgoX19sZTMyX3RvX2NwdShpbm9kZS0+Yi5ibG9ja3MuZG91YmxlX2luZGlyX2Jsb2NrKSA8PAogCQkgICAgIGxvZzJfYmxrc3opICE9IGV4dDRmc19pbmRpcjFfYmxrbm8pIHsKIAkJCXN0YXR1cyA9Ci0JCQkgICAgZXh0NGZzX2RldnJlYWQoX19sZTMyX3RvX2NwdQorCQkJICAgIGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClfX2xlMzJfdG9fY3B1CiAJCQkJCSAgIChpbm9kZS0+Yi5ibG9ja3MuCiAJCQkJCSAgICBkb3VibGVfaW5kaXJfYmxvY2spIDw8IGxvZzJfYmxrc3osCiAJCQkJCSAgIDAsIGJsa3N6LApAQCAtMTY4MSw3ICsxNjg1LDcgQEAKIAkJfQogCQlpZiAoKF9fbGUzMl90b19jcHUoZXh0NGZzX2luZGlyMV9ibG9ja1tyYmxvY2sgLyBwZXJibG9ja10pIDw8CiAJCSAgICAgbG9nMl9ibGtzeikgIT0gZXh0NGZzX2luZGlyMl9ibGtubykgewotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoX19sZTMyX3RvX2NwdQorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KV9fbGUzMl90b19jcHUKIAkJCQkJCShleHQ0ZnNfaW5kaXIxX2Jsb2NrCiAJCQkJCQkgW3JibG9jayAvCiAJCQkJCQkgIHBlcmJsb2NrXSkgPDwgbG9nMl9ibGtzeiwgMCwKQEAgLTE3MzMsNyArMTczNyw4IEBACiAJCWlmICgoX19sZTMyX3RvX2NwdShpbm9kZS0+Yi5ibG9ja3MudHJpcGxlX2luZGlyX2Jsb2NrKSA8PAogCQkgICAgIGxvZzJfYmxrc3opICE9IGV4dDRmc19pbmRpcjFfYmxrbm8pIHsKIAkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkCi0JCQkgICAgKF9fbGUzMl90b19jcHUoaW5vZGUtPmIuYmxvY2tzLnRyaXBsZV9pbmRpcl9ibG9jaykKKwkJCSAgICAoKGxiYWludF90KQorCQkJICAgICBfX2xlMzJfdG9fY3B1KGlub2RlLT5iLmJsb2Nrcy50cmlwbGVfaW5kaXJfYmxvY2spCiAJCQkgICAgIDw8IGxvZzJfYmxrc3osIDAsIGJsa3N6LAogCQkJICAgICAoY2hhciAqKWV4dDRmc19pbmRpcjFfYmxvY2spOwogCQkJaWYgKHN0YXR1cyA9PSAwKSB7CkBAIC0xNzczLDcgKzE3NzgsNyBAQAogCQkJCQkJICAgICAgIHBlcmJsb2NrX3BhcmVudF0pIDw8CiAJCSAgICAgbG9nMl9ibGtzeikKIAkJICAgICE9IGV4dDRmc19pbmRpcjJfYmxrbm8pIHsKLQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKF9fbGUzMl90b19jcHUKKwkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClfX2xlMzJfdG9fY3B1CiAJCQkJCQkoZXh0NGZzX2luZGlyMV9ibG9jawogCQkJCQkJIFtyYmxvY2sgLwogCQkJCQkJICBwZXJibG9ja19wYXJlbnRdKSA8PApAQCAtMTgxOCw3ICsxODIzLDcgQEAKIAkJCQkJCSAgICAgICBwZXJibG9ja19jaGlsZF0pIDw8CiAJCSAgICAgbG9nMl9ibGtzeikgIT0gZXh0NGZzX2luZGlyM19ibGtubykgewogCQkJc3RhdHVzID0KLQkJCSAgICBleHQ0ZnNfZGV2cmVhZChfX2xlMzJfdG9fY3B1CisJCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KV9fbGUzMl90b19jcHUKIAkJCQkJICAgKGV4dDRmc19pbmRpcjJfYmxvY2sKIAkJCQkJICAgIFsocmJsb2NrIC8gcGVyYmxvY2tfY2hpbGQpCiAJCQkJCSAgICAgJSAoYmxrc3ogLyA0KV0pIDw8IGxvZzJfYmxrc3osIDAsCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDRfam91cm5hbC5jIGIvZnMvZXh0NC9leHQ0X2pvdXJuYWwuYwppbmRleCA5ZjAxNzA4Li5iYWZkNzkzIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDRfam91cm5hbC5jCisrKyBiL2ZzL2V4dDQvZXh0NF9qb3VybmFsLmMKQEAgLTM2MCw3ICszNjAsOCBAQAogCQkJICAoc3RydWN0IGV4dDJfaW5vZGUgKikmaW5vZGVfam91cm5hbCk7CiAJYmxrbnIgPSByZWFkX2FsbG9jYXRlZF9ibG9jaygoc3RydWN0IGV4dDJfaW5vZGUgKikKIAkJCQkgICAgICZpbm9kZV9qb3VybmFsLCBpKTsKLQlleHQ0ZnNfZGV2cmVhZChibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LCB0ZW1wX2J1ZmYpOworCWV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAorCQkgICAgICAgdGVtcF9idWZmKTsKIAlwX2pkYiA9IChjaGFyICopdGVtcF9idWZmOwogCWpkYiA9IChzdHJ1Y3Qgam91cm5hbF9oZWFkZXJfdCAqKSB0ZW1wX2J1ZmY7CiAJb2ZzID0gc2l6ZW9mKHN0cnVjdCBqb3VybmFsX2hlYWRlcl90KTsKQEAgLTM4NCw5ICszODUsOSBAQAogCQkJCWNvbnRpbnVlOwogCQl9CiAJCWJsa25yID0gcmVhZF9hbGxvY2F0ZWRfYmxvY2soJmlub2RlX2pvdXJuYWwsIGkpOwotCQlleHQ0ZnNfZGV2cmVhZChibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwKKwkJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJICAgICAgIGZzLT5ibGtzeiwgbWV0YWRhdGFfYnVmZik7Ci0JCXB1dF9leHQ0KCh1aW50NjRfdCkoYmUzMl90b19jcHUodGFnLT5ibG9jaykgKiBmcy0+Ymxrc3opLAorCQlwdXRfZXh0NCgodWludDY0X3QpKCh1aW50NjRfdCliZTMyX3RvX2NwdSh0YWctPmJsb2NrKSAqICh1aW50NjRfdClmcy0+Ymxrc3opLAogCQkJIG1ldGFkYXRhX2J1ZmYsICh1aW50MzJfdCkgZnMtPmJsa3N6KTsKIAl9IHdoaWxlICghKGZsYWdzICYgRVhUM19KT1VSTkFMX0ZMQUdfTEFTVF9UQUcpKTsKIGZhaWw6CkBAIC00MzEsNyArNDMyLDggQEAKIAogCWV4dDRmc19yZWFkX2lub2RlKGV4dDRmc19yb290LCBFWFQyX0pPVVJOQUxfSU5PLCAmaW5vZGVfam91cm5hbCk7CiAJYmxrbnIgPSByZWFkX2FsbG9jYXRlZF9ibG9jaygmaW5vZGVfam91cm5hbCwgRVhUMl9KT1VSTkFMX1NVUEVSQkxPQ0spOwotCWV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osIHRlbXBfYnVmZik7CisJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCisJCSAgICAgICB0ZW1wX2J1ZmYpOwogCWpzYiA9IChzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3QgKikgdGVtcF9idWZmOwogCiAJaWYgKGZzLT5zYi0+ZmVhdHVyZV9pbmNvbXBhdCAmIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSB7CkBAIC00NTUsNyArNDU3LDcgQEAKIAl3aGlsZSAoMSkgewogCQlibGtuciA9IHJlYWRfYWxsb2NhdGVkX2Jsb2NrKCZpbm9kZV9qb3VybmFsLCBpKTsKIAkJbWVtc2V0KHRlbXBfYnVmZjEsICdcMCcsIGZzLT5ibGtzeik7Ci0JCWV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLAorCQlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssCiAJCQkgICAgICAgMCwgZnMtPmJsa3N6LCB0ZW1wX2J1ZmYxKTsKIAkJamRiID0gKHN0cnVjdCBqb3VybmFsX2hlYWRlcl90ICopIHRlbXBfYnVmZjE7CiAKQEAgLTU0Nyw3ICs1NDksNyBAQAogCiAJCWJsa25yID0gcmVhZF9hbGxvY2F0ZWRfYmxvY2soJmlub2RlX2pvdXJuYWwsCiAJCQkJCSBFWFQyX0pPVVJOQUxfU1VQRVJCTE9DSyk7Ci0JCXB1dF9leHQ0KCh1aW50NjRfdCkgKGJsa25yICogZnMtPmJsa3N6KSwKKwkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoKHVpbnQ2NF90KWJsa25yICogKHVpbnQ2NF90KWZzLT5ibGtzeiksCiAJCQkgKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfdCAqKXRlbXBfYnVmZiwKIAkJCSAodWludDMyX3QpIGZzLT5ibGtzeik7CiAJCWV4dDRmc19mcmVlX3Jldm9rZV9ibGtzKCk7CkBAIC01NzYsNyArNTc4LDggQEAKIAlleHQ0ZnNfcmVhZF9pbm9kZShleHQ0ZnNfcm9vdCwgRVhUMl9KT1VSTkFMX0lOTywgJmlub2RlX2pvdXJuYWwpOwogCWpzYl9ibGtuciA9IHJlYWRfYWxsb2NhdGVkX2Jsb2NrKCZpbm9kZV9qb3VybmFsLAogCQkJCQkgRVhUMl9KT1VSTkFMX1NVUEVSQkxPQ0spOwotCWV4dDRmc19kZXZyZWFkKGpzYl9ibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LCB0ZW1wX2J1ZmYpOworCWV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClqc2JfYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKKwkJICAgICAgIHRlbXBfYnVmZik7CiAJanNiID0gKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfdCAqKSB0ZW1wX2J1ZmY7CiAKIAlqZGIuaF9ibG9ja3R5cGUgPSBjcHVfdG9fYmUzMihFWFQzX0pPVVJOQUxfREVTQ1JJUFRPUl9CTE9DSyk7CkBAIC02MDUsNyArNjA4LDcgQEAKIAl0YWcuZmxhZ3MgPSBjcHVfdG9fYmUzMihFWFQzX0pPVVJOQUxfRkxBR19MQVNUX1RBRyk7CiAJbWVtY3B5KHRlbXAgLSBzaXplb2Yoc3RydWN0IGV4dDNfam91cm5hbF9ibG9ja190YWcpLCAmdGFnLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGV4dDNfam91cm5hbF9ibG9ja190YWcpKTsKLQlwdXRfZXh0NCgodWludDY0X3QpIChibGtuciAqIGZzLT5ibGtzeiksIGJ1ZiwgKHVpbnQzMl90KSBmcy0+Ymxrc3opOworCXB1dF9leHQ0KCh1aW50NjRfdCkgKCh1aW50NjRfdClibGtuciAqICh1aW50NjRfdClmcy0+Ymxrc3opLCBidWYsICh1aW50MzJfdCkgZnMtPmJsa3N6KTsKIAogCWZyZWUodGVtcF9idWZmKTsKIAlmcmVlKGJ1Zik7CkBAIC02MjMsMTAgKzYyNiwxMiBAQAogCWlmICghdGVtcF9idWZmKQogCQlyZXR1cm47CiAKLQlleHQ0ZnNfcmVhZF9pbm9kZShleHQ0ZnNfcm9vdCwgRVhUMl9KT1VSTkFMX0lOTywgJmlub2RlX2pvdXJuYWwpOworCWV4dDRmc19yZWFkX2lub2RlKGV4dDRmc19yb290LCBFWFQyX0pPVVJOQUxfSU5PLAorCQkJICAmaW5vZGVfam91cm5hbCk7CiAJanNiX2Jsa25yID0gcmVhZF9hbGxvY2F0ZWRfYmxvY2soJmlub2RlX2pvdXJuYWwsCiAJCQkJCSBFWFQyX0pPVVJOQUxfU1VQRVJCTE9DSyk7Ci0JZXh0NGZzX2RldnJlYWQoanNiX2Jsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osIHRlbXBfYnVmZik7CisJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWpzYl9ibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAorCQkgICAgICAgdGVtcF9idWZmKTsKIAlqc2IgPSAoc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja190ICopIHRlbXBfYnVmZjsKIAogCWpkYi5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEVYVDNfSk9VUk5BTF9DT01NSVRfQkxPQ0spOwpAQCAtNjM4LDcgKzY0Myw3IEBACiAJCXJldHVybjsKIAl9CiAJbWVtY3B5KGJ1ZiwgJmpkYiwgc2l6ZW9mKHN0cnVjdCBqb3VybmFsX2hlYWRlcl90KSk7Ci0JcHV0X2V4dDQoKHVpbnQ2NF90KSAoYmxrbnIgKiBmcy0+Ymxrc3opLCBidWYsICh1aW50MzJfdCkgZnMtPmJsa3N6KTsKKwlwdXRfZXh0NCgodWludDY0X3QpICgodWludDY0X3QpYmxrbnIgKiAodWludDY0X3QpZnMtPmJsa3N6KSwgYnVmLCAodWludDMyX3QpIGZzLT5ibGtzeik7CiAKIAlmcmVlKHRlbXBfYnVmZik7CiAJZnJlZShidWYpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0ZnMuYyBiL2ZzL2V4dDQvZXh0NGZzLmMKaW5kZXggYjJmODRiMS4uMmQ3OWY3NiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0ZnMuYworKysgYi9mcy9leHQ0L2V4dDRmcy5jCkBAIC02NiwxNSArNjYsMTUgQEAKIAkJdW5zaWduZWQgaW50IGxlbiwgY2hhciAqYnVmKQogewogCWludCBpOwotCWludCBibG9ja2NudDsKKwlsYmFpbnRfdCBibG9ja2NudDsKIAlpbnQgbG9nMmJsb2Nrc2l6ZSA9IExPRzJfRVhUMl9CTE9DS19TSVpFKG5vZGUtPmRhdGEpOwogCWludCBibG9ja3NpemUgPSAxIDw8IChsb2cyYmxvY2tzaXplICsgRElTS19TRUNUT1JfQklUUyk7CiAJdW5zaWduZWQgaW50IGZpbGVzaXplID0gX19sZTMyX3RvX2NwdShub2RlLT5pbm9kZS5zaXplKTsKLQlpbnQgcHJldmlvdXNfYmxvY2tfbnVtYmVyID0gLTE7Ci0JaW50IGRlbGF5ZWRfc3RhcnQgPSAwOwotCWludCBkZWxheWVkX2V4dGVudCA9IDA7Ci0JaW50IGRlbGF5ZWRfc2tpcGZpcnN0ID0gMDsKLQlpbnQgZGVsYXllZF9uZXh0ID0gMDsKKwlsYmFpbnRfdCBwcmV2aW91c19ibG9ja19udW1iZXIgPSAtMTsKKwlsYmFpbnRfdCBkZWxheWVkX3N0YXJ0ID0gMDsKKwlsYmFpbnRfdCBkZWxheWVkX2V4dGVudCA9IDA7CisJbGJhaW50X3QgZGVsYXllZF9za2lwZmlyc3QgPSAwOworCWxiYWludF90IGRlbGF5ZWRfbmV4dCA9IDA7CiAJY2hhciAqZGVsYXllZF9idWYgPSBOVUxMOwogCXNob3J0IHN0YXR1czsKIApAQCAtODUsNyArODUsNyBAQAogCWJsb2NrY250ID0gKChsZW4gKyBwb3MpICsgYmxvY2tzaXplIC0gMSkgLyBibG9ja3NpemU7CiAKIAlmb3IgKGkgPSBwb3MgLyBibG9ja3NpemU7IGkgPCBibG9ja2NudDsgaSsrKSB7Ci0JCWludCBibGtucjsKKwkJbGJhaW50X3QgYmxrbnI7CiAJCWludCBibG9ja29mZiA9IHBvcyAlIGJsb2Nrc2l6ZTsKIAkJaW50IGJsb2NrZW5kID0gYmxvY2tzaXplOwogCQlpbnQgc2tpcGZpcnN0ID0gMDsKQEAgLTIxMSwxOCArMjExLDE4IEBACiAJLyogdXBkYXRlIGJsb2NrIGdyb3VwcyAqLwogCWZvciAoaSA9IDA7IGkgPCBmcy0+bm9fYmxrZ3JwOyBpKyspIHsKIAkJZnMtPmJnZFtpXS5iZ19jaGVja3N1bSA9IGV4dDRmc19jaGVja3N1bV91cGRhdGUoaSk7Ci0JCXB1dF9leHQ0KCh1aW50NjRfdCkoZnMtPmJnZFtpXS5ibG9ja19pZCAqIGZzLT5ibGtzeiksCisJCXB1dF9leHQ0KCh1aW50NjRfdCkoKHVpbnQ2NF90KWZzLT5iZ2RbaV0uYmxvY2tfaWQgKiAodWludDY0X3QpZnMtPmJsa3N6KSwKIAkJCSBmcy0+YmxrX2JtYXBzW2ldLCBmcy0+Ymxrc3opOwogCX0KIAogCS8qIHVwZGF0ZSBpbm9kZSB0YWJsZSBncm91cHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZnMtPm5vX2Jsa2dycDsgaSsrKSB7Ci0JCXB1dF9leHQ0KCh1aW50NjRfdCkgKGZzLT5iZ2RbaV0uaW5vZGVfaWQgKiBmcy0+Ymxrc3opLAorCQlwdXRfZXh0NCgodWludDY0X3QpICgodWludDY0X3QpZnMtPmJnZFtpXS5pbm9kZV9pZCAqICh1aW50NjRfdClmcy0+Ymxrc3opLAogCQkJIGZzLT5pbm9kZV9ibWFwc1tpXSwgZnMtPmJsa3N6KTsKIAl9CiAKIAkvKiB1cGRhdGUgdGhlIGJsb2NrIGdyb3VwIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlwdXRfZXh0NCgodWludDY0X3QpKGZzLT5nZHRhYmxlX2Jsa25vICogZnMtPmJsa3N6KSwKKwlwdXRfZXh0NCgodWludDY0X3QpKCh1aW50NjRfdClmcy0+Z2R0YWJsZV9ibGtubyAqICh1aW50NjRfdClmcy0+Ymxrc3opLAogCQkgKHN0cnVjdCBleHQyX2Jsb2NrX2dyb3VwICopZnMtPmdkdGFibGUsCiAJCSAoZnMtPmJsa3N6ICogZnMtPm5vX2Jsa19wZXJnZHQpKTsKIApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJaWYgKCFmcy0+Z2R0YWJsZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJLyogcmVhZCB0aGUgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSAqLwotCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGZzLT5nZHRhYmxlX2Jsa25vICogZnMtPnNlY3RfcGVyYmxrLCAwLAorCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClmcy0+Z2R0YWJsZV9ibGtubyAqIGZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQlmcy0+Ymxrc3ogKiBmcy0+bm9fYmxrX3BlcmdkdCwgZnMtPmdkdGFibGUpOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJZ290byBmYWlsOwpAQCAtMzAxLDcgKzMwMSw3IEBACiAJCS8qIGpvdXJuYWwgYmFja3VwICovCiAJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewogCQkJc3RhdHVzID0KLQkJCSAgICBleHQ0ZnNfZGV2cmVhZChiZ2RbYmdfaWR4XS5ibG9ja19pZCAqCisJCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkICoKIAkJCQkJICAgZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCiAJCQkJCSAgIGpvdXJuYWxfYnVmZmVyKTsKIAkJCWlmIChzdGF0dXMgPT0gMCkKQEAgLTM0NSw3ICszNDUsNyBAQAogCQl9CiAJCURJQl9zdGFydF9hZGRyID0gKHVuc2lnbmVkIGludCAqKWRpX2J1ZmZlcjsKIAkJYmxrbnIgPSBpbm9kZS0+Yi5ibG9ja3MuZG91YmxlX2luZGlyX2Jsb2NrOwotCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAorCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKIAkJCQkJKGNoYXIgKilkaV9idWZmZXIpOwogCQlmb3IgKGkgPSAwOyBpIDwgZnMtPmJsa3N6IC8gc2l6ZW9mKGludCk7IGkrKykgewogCQkJaWYgKCpkaV9idWZmZXIgPT0gMCkKQEAgLTM2Nyw3ICszNjcsNyBAQAogCQkJZnMtPnNiLT5mcmVlX2Jsb2NrcysrOwogCQkJLyogam91cm5hbCBiYWNrdXAgKi8KIAkJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewotCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkCisJCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkCiAJCQkJCQkJKiBmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkJCQkJZnMtPmJsa3N6LAogCQkJCQkJCWpvdXJuYWxfYnVmZmVyKTsKQEAgLTM5Nyw3ICszOTcsNyBAQAogCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQlpZiAocHJldl9iZ19ibWFwX2lkeCAhPSBiZ19pZHgpIHsKIAkJCW1lbXNldChqb3VybmFsX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkICoKKwkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdCliZ2RbYmdfaWR4XS5ibG9ja19pZCAqCiAJCQkJCQlmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKIAkJCQkJCWpvdXJuYWxfYnVmZmVyKTsKIAkJCWlmIChzdGF0dXMgPT0gMCkKQEAgLTQ0Niw3ICs0NDYsNyBAQAogCQl9CiAJCXRpYl9zdGFydF9hZGRyID0gKHVuc2lnbmVkIGludCAqKXRpZ3BfYnVmZmVyOwogCQlibGtuciA9IGlub2RlLT5iLmJsb2Nrcy50cmlwbGVfaW5kaXJfYmxvY2s7Ci0JCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJsa25yICogZnMtPnNlY3RfcGVyYmxrLCAwLCBmcy0+Ymxrc3osCisJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAogCQkJCQkoY2hhciAqKXRpZ3BfYnVmZmVyKTsKIAkJZm9yIChpID0gMDsgaSA8IGZzLT5ibGtzeiAvIHNpemVvZihpbnQpOyBpKyspIHsKIAkJCWlmICgqdGlncF9idWZmZXIgPT0gMCkKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCQkJaWYgKCF0aXBfYnVmZmVyKQogCQkJCWdvdG8gZmFpbDsKIAkJCXRpcGJfc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBpbnQgKil0aXBfYnVmZmVyOwotCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKCp0aWdwX2J1ZmZlcikgKgorCQkJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KSgqdGlncF9idWZmZXIpICoKIAkJCQkJCWZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAogCQkJCQkJKGNoYXIgKil0aXBfYnVmZmVyKTsKIAkJCWZvciAoaiA9IDA7IGogPCBmcy0+Ymxrc3ogLyBzaXplb2YoaW50KTsgaisrKSB7CkBAIC00ODQsNiArNDg0LDcgQEAKIAkJCQlpZiAocHJldl9iZ19ibWFwX2lkeCAhPSBiZ19pZHgpIHsKIAkJCQkJc3RhdHVzID0KIAkJCQkJICAgIGV4dDRmc19kZXZyZWFkKAorCQkJCQkJCShsYmFpbnRfdCkKIAkJCQkJCQliZ2RbYmdfaWR4XS5ibG9ja19pZCAqCiAJCQkJCQkJZnMtPnNlY3RfcGVyYmxrLCAwLAogCQkJCQkJCWZzLT5ibGtzeiwKQEAgLTUyNCw3ICs1MjUsNyBAQAogCQkJaWYgKHByZXZfYmdfYm1hcF9pZHggIT0gYmdfaWR4KSB7CiAJCQkJbWVtc2V0KGpvdXJuYWxfYnVmZmVyLCAnXDAnLCBmcy0+Ymxrc3opOwogCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkICoKKwkJCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkICoKIAkJCQkJCSAgIGZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkJCSAgIGZzLT5ibGtzeiwgam91cm5hbF9idWZmZXIpOwogCQkJCWlmIChzdGF0dXMgPT0gMCkKQEAgLTU1Myw3ICs1NTQsNyBAQAogCQkvKiBqb3VybmFsIGJhY2t1cCAqLwogCQlpZiAocHJldl9iZ19ibWFwX2lkeCAhPSBiZ19pZHgpIHsKIAkJCW1lbXNldChqb3VybmFsX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkICoKKwkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdCliZ2RbYmdfaWR4XS5ibG9ja19pZCAqCiAJCQkJCQlmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKIAkJCQkJCWpvdXJuYWxfYnVmZmVyKTsKIAkJCWlmIChzdGF0dXMgPT0gMCkKQEAgLTYzOSw3ICs2NDAsNyBAQAogCQkJLyogam91cm5hbCBiYWNrdXAgKi8KIAkJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewogCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGV4dDRmc19kZXZyZWFkKGJnZFtiZ19pZHhdLmJsb2NrX2lkICoKKwkJCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtiZ19pZHhdLmJsb2NrX2lkICoKIAkJCQkJCSAgIGZzLT5zZWN0X3BlcmJsaywgMCwKIAkJCQkJCSAgIGZzLT5ibGtzeiwgam91cm5hbF9idWZmZXIpOwogCQkJCWlmIChzdGF0dXMgPT0gMCkKQEAgLTY4Myw3ICs2ODQsNyBAQAogCQkJLyogam91cm5hbCBiYWNrdXAgKi8KIAkJCWlmIChwcmV2X2JnX2JtYXBfaWR4ICE9IGJnX2lkeCkgewogCQkJCW1lbXNldChqb3VybmFsX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJCQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChiZ2RbYmdfaWR4XS5ibG9ja19pZAorCQkJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdCliZ2RbYmdfaWR4XS5ibG9ja19pZAogCQkJCQkJCSogZnMtPnNlY3RfcGVyYmxrLAogCQkJCQkJCTAsIGZzLT5ibGtzeiwKIAkJCQkJCQlqb3VybmFsX2J1ZmZlcik7CkBAIC03MTQsNyArNzE1LDcgQEAKIAlpZiAoIXJlYWRfYnVmZmVyKQogCQlnb3RvIGZhaWw7CiAJc3RhcnRfYmxvY2tfYWRkcmVzcyA9IHJlYWRfYnVmZmVyOwotCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGJsa25vICogZnMtPnNlY3RfcGVyYmxrLAorCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClibGtubyAqIGZzLT5zZWN0X3BlcmJsaywKIAkJCQkwLCBmcy0+Ymxrc3osIHJlYWRfYnVmZmVyKTsKIAlpZiAoc3RhdHVzID09IDApCiAJCWdvdG8gZmFpbDsKQEAgLTczNyw3ICs3MzgsNyBAQAogCWZzLT5zYi0+ZnJlZV9pbm9kZXMrKzsKIAkvKiBqb3VybmFsIGJhY2t1cCAqLwogCW1lbXNldChqb3VybmFsX2J1ZmZlciwgJ1wwJywgZnMtPmJsa3N6KTsKLQlzdGF0dXMgPSBleHQ0ZnNfZGV2cmVhZChiZ2RbaWJtYXBfaWR4XS5pbm9kZV9pZCAqCisJc3RhdHVzID0gZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWJnZFtpYm1hcF9pZHhdLmlub2RlX2lkICoKIAkJCQlmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwgam91cm5hbF9idWZmZXIpOwogCWlmIChzdGF0dXMgPT0gMCkKIAkJZ290byBmYWlsOwpAQCAtODEzLDcgKzgxNCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZnMtPm5vX2Jsa2dycDsgaSsrKSB7CiAJCXN0YXR1cyA9Ci0JCSAgICBleHQ0ZnNfZGV2cmVhZChmcy0+YmdkW2ldLmJsb2NrX2lkICogZnMtPnNlY3RfcGVyYmxrLCAwLAorCQkgICAgZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWZzLT5iZ2RbaV0uYmxvY2tfaWQgKiBmcy0+c2VjdF9wZXJibGssIDAsCiAJCQkJICAgZnMtPmJsa3N6LCAoY2hhciAqKWZzLT5ibGtfYm1hcHNbaV0pOwogCQlpZiAoc3RhdHVzID09IDApCiAJCQlnb3RvIGZhaWw7CkBAIC04MzAsNyArODMxLDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZnMtPm5vX2Jsa2dycDsgaSsrKSB7Ci0JCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKGZzLT5iZ2RbaV0uaW5vZGVfaWQgKiBmcy0+c2VjdF9wZXJibGssCisJCXN0YXR1cyA9IGV4dDRmc19kZXZyZWFkKChsYmFpbnRfdClmcy0+YmdkW2ldLmlub2RlX2lkICogZnMtPnNlY3RfcGVyYmxrLAogCQkJCQkwLCBmcy0+Ymxrc3osCiAJCQkJCShjaGFyICopZnMtPmlub2RlX2JtYXBzW2ldKTsKIAkJaWYgKHN0YXR1cyA9PSAwKQpAQCAtODcwLDExICs4NzEsMTEgQEAKIAkJCQkgICZpbm9kZV9qb3VybmFsKTsKIAkJYmxrbnIgPSByZWFkX2FsbG9jYXRlZF9ibG9jaygmaW5vZGVfam91cm5hbCwKIAkJCQkJRVhUMl9KT1VSTkFMX1NVUEVSQkxPQ0spOwotCQlleHQ0ZnNfZGV2cmVhZChibGtuciAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LAorCQlleHQ0ZnNfZGV2cmVhZCgobGJhaW50X3QpYmxrbnIgKiBmcy0+c2VjdF9wZXJibGssIDAsIGZzLT5ibGtzeiwKIAkJCSAgICAgICB0ZW1wX2J1ZmYpOwogCQlqc2IgPSAoc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja190ICopdGVtcF9idWZmOwogCQlqc2ItPnNfc3RhcnQgPSBjcHVfdG9fYmUzMigwKTsKLQkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoYmxrbnIgKiBmcy0+Ymxrc3opLAorCQlwdXRfZXh0NCgodWludDY0X3QpICgodWludDY0X3QpYmxrbnIgKiAodWludDY0X3QpZnMtPmJsa3N6KSwKIAkJCSAoc3RydWN0IGpvdXJuYWxfc3VwZXJibG9ja190ICopdGVtcF9idWZmLCBmcy0+Ymxrc3opOwogCQlmcmVlKHRlbXBfYnVmZik7CiAJfQpAQCAtOTU2LDggKzk1Nyw4IEBACiAJCQkJCWRlbGF5ZWRfZXh0ZW50ICs9IGJsb2NrZW5kOwogCQkJCQlkZWxheWVkX25leHQgKz0gYmxvY2tlbmQgPj4gU0VDVE9SX0JJVFM7CiAJCQkJfSBlbHNlIHsJLyogc3BpbGwgKi8KLQkJCQkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoZGVsYXllZF9zdGFydCAqCi0JCQkJCQkJICAgICBTRUNUT1JfU0laRSksCisJCQkJCXB1dF9leHQ0KCh1aW50NjRfdCkgZGVsYXllZF9zdGFydCAqCisJCQkJCQkJICAgICBTRUNUT1JfU0laRSwKIAkJCQkJCSBkZWxheWVkX2J1ZiwKIAkJCQkJCSAodWludDMyX3QpIGRlbGF5ZWRfZXh0ZW50KTsKIAkJCQkJcHJldmlvdXNfYmxvY2tfbnVtYmVyID0gYmxrbnI7CkBAIC05NzgsOCArOTc5LDggQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChwcmV2aW91c19ibG9ja19udW1iZXIgIT0gLTEpIHsKIAkJCQkvKiBzcGlsbCAqLwotCQkJCXB1dF9leHQ0KCh1aW50NjRfdCkgKGRlbGF5ZWRfc3RhcnQgKgotCQkJCQkJICAgICBTRUNUT1JfU0laRSksIGRlbGF5ZWRfYnVmLAorCQkJCXB1dF9leHQ0KCh1aW50NjRfdCkgZGVsYXllZF9zdGFydCAqCisJCQkJCQkgICAgIFNFQ1RPUl9TSVpFLCBkZWxheWVkX2J1ZiwKIAkJCQkJICh1aW50MzJfdCkgZGVsYXllZF9leHRlbnQpOwogCQkJCXByZXZpb3VzX2Jsb2NrX251bWJlciA9IC0xOwogCQkJfQpAQCAtOTg5LDcgKzk5MCw3IEBACiAJfQogCWlmIChwcmV2aW91c19ibG9ja19udW1iZXIgIT0gLTEpIHsKIAkJLyogc3BpbGwgKi8KLQkJcHV0X2V4dDQoKHVpbnQ2NF90KSAoZGVsYXllZF9zdGFydCAqIFNFQ1RPUl9TSVpFKSwKKwkJcHV0X2V4dDQoKHVpbnQ2NF90KSBkZWxheWVkX3N0YXJ0ICogU0VDVE9SX1NJWkUsCiAJCQkgZGVsYXllZF9idWYsICh1aW50MzJfdCkgZGVsYXllZF9leHRlbnQpOwogCQlwcmV2aW91c19ibG9ja19udW1iZXIgPSAtMTsKIAl9CkBAIC0xMDkxLDcgKzEwOTIsNyBAQAogCQkJKGlub2Rlbm8gJSBfX2xlMzJfdG9fY3B1KHNibG9jay0+aW5vZGVzX3Blcl9ncm91cCkpIC8KIAkJCWlub2Rlc19wZXJfYmxvY2s7CiAJYmxrb2ZmID0gKGlub2Rlbm8gJSBpbm9kZXNfcGVyX2Jsb2NrKSAqIGZzLT5pbm9kZXN6OwotCWV4dDRmc19kZXZyZWFkKGl0YWJsZV9ibGtubyAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LCB0ZW1wX3B0cik7CisJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KWl0YWJsZV9ibGtubyAqIGZzLT5zZWN0X3BlcmJsaywgMCwgZnMtPmJsa3N6LCB0ZW1wX3B0cik7CiAJaWYgKGV4dDRmc19sb2dfam91cm5hbCh0ZW1wX3B0ciwgaXRhYmxlX2Jsa25vKSkKIAkJZ290byBmYWlsOwogCkBAIC0xMTExLDcgKzExMTIsNyBAQAogCWJsa29mZiA9IChwYXJlbnRfaW5vZGVubyAlIGlub2Rlc19wZXJfYmxvY2spICogZnMtPmlub2Rlc3o7CiAJaWYgKHBhcmVudF9pdGFibGVfYmxrbm8gIT0gaXRhYmxlX2Jsa25vKSB7CiAJCW1lbXNldCh0ZW1wX3B0ciwgJ1wwJywgZnMtPmJsa3N6KTsKLQkJZXh0NGZzX2RldnJlYWQocGFyZW50X2l0YWJsZV9ibGtubyAqIGZzLT5zZWN0X3BlcmJsaywKKwkJZXh0NGZzX2RldnJlYWQoKGxiYWludF90KXBhcmVudF9pdGFibGVfYmxrbm8gKiBmcy0+c2VjdF9wZXJibGssCiAJCQkgICAgICAgMCwgZnMtPmJsa3N6LCB0ZW1wX3B0cik7CiAJCWlmIChleHQ0ZnNfbG9nX2pvdXJuYWwodGVtcF9wdHIsIHBhcmVudF9pdGFibGVfYmxrbm8pKQogCQkJZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FybWFkYV8zNzUuaCBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGFfMzc1LmgKaW5kZXggMGM0NWUzYy4uNDQ2Y2JlYyAxMDA3NTUKLS0tIGEvaW5jbHVkZS9jb25maWdzL2FybWFkYV8zNzUuaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRhXzM3NS5oCkBAIC0yNjUsMjAgKzI2NSwyNiBAQAogI2RlZmluZSBDT05GSUdfU0ZfREVGQVVMVF9CVVMJCUNPTkZJR19FTlZfU1BJX0JVUwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKE1WX1NFQ182NEspCisjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQkweDEwMDAwCisjZWxpZiBkZWZpbmVkKE1WX1NFQ18xMjhLKQorI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJMHgyMDAwMAorI2VsaWYgZGVmaW5lZChNVl9TRUNfMjU2SykKKyNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCTB4NDAwMDAKKyNlbmRpZgorCisjZGVmaW5lCUNPTkZJR19FTlZfT0ZGU0VUX1NQSQkJMHgxMDAwMDAKKyNkZWZpbmUJQ09ORklHX0VOVl9TSVpFX1NQSQkJQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCisKKwogLyogQm9vdCBmcm9tIFNQSSBzZXR0aW5ncyAqLwogCSNpZiBkZWZpbmVkKE1WX1NQSV9CT09UKQogCQkjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fU1BJX0ZMQVNICiAKLQkJI2lmIGRlZmluZWQoTVZfU0VDXzY0SykKLQkJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAweDEwMDAwCi0JCSNlbGlmIGRlZmluZWQoTVZfU0VDXzEyOEspCi0JCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAgMHgyMDAwMAotCQkjZWxpZiBkZWZpbmVkKE1WX1NFQ18yNTZLKQotCQkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIDB4NDAwMDAKLQkJI2VuZGlmCisJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUJCQlDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkKIAotCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgc2VjdG9yICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwICAgICAgICAgICAgICAgIC8qICgxTUIgRm9yIEltYWdlKSBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJICAgIC8qIGVudmlyb25tZW50IHRha2VzIG9uZSBzZWN0b3IgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVRfU1BJICAgLyogKDFNQiBGb3IgSW1hZ2UpIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLwogCQkjZGVmaW5lIENPTkZJR19FTlZfQUREUiAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVAogCQkjZGVmaW5lIE1PTklUT1JfSEVBREVSX0xFTiAgICAgICAgICAgICAgICAgICAgICAweDIwMAogCQkjZGVmaW5lIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFICAgICAgICAgICAgICAgICAwCkBAIC0zMDEsNiArMzA3LDkgQEAKIC8qIE5BTkQtRkxBU0ggc3R1ZmYgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIE1WX05BTkQKKwkjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGludCBuYW5kX2dldF9lbnZfb2Zmcyh2b2lkKTsKKwkjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAJI2RlZmluZSBNVl9OQU5EX1BJT19NT0RFCiAJI2RlZmluZSBNVl9OQU5EXzFDU19NT0RFCiAJLyoKQEAgLTMyNCwxNyArMzMzLDIxIEBACiAJI3VuZGVmIE1WX05GQ19EQkcKIAkjZGVmaW5lIENPTkZJR19KRkZTMl9OQU5ECiAKKwkjZGVmaW5lCUNPTkZJR19FTlZfU0laRV9OQU5ECQkJMHg4MDAwMAorCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVRfTkFORAkJCW5hbmRfZ2V0X2Vudl9vZmZzKCkKKwkjZGVmaW5lCUNPTkZJR19FTlZfUkFOR0VfTkFORAkJCUNPTkZJR19FTlZfU0laRV9OQU5EICogOAorCiAvKiBCb290IGZyb20gTkFORCBzZXR0aW5ncyAqLwogCSNpZiBkZWZpbmVkKE1WX05BTkRfQk9PVCkKIAkJI2RlZmluZSBDT05GSUdfRU5WX0lTX0lOX05BTkQKIAotCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgMHg4MDAwMCAgICAgICAgICAgICAgICAgLyogZW52aXJvbm1lbnQgdGFrZXMgb25lIGVyYXNlIGJsb2NrICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQgICAgICAgICAgICAgICBuYW5kX2dldF9lbnZfb2ZmcygpICAgICAvKiBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfU0laRV9OQU5EICAgICAgICAgICAgICAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgZXJhc2UgYmxvY2sgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUX05BTkQgICAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLwogCQkjZGVmaW5lIENPTkZJR19FTlZfQUREUiAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVQKIAkJI2RlZmluZSBNT05JVE9SX0hFQURFUl9MRU4gICAgICAgICAgICAgIDB4MjAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0xFTiAgICAgICAgICAweDgwMDAwICAgICAgICAgICAvKiBSZXNlcnZlIDUxMiBrQiBmb3IgTW9uaXRvciAqLwotCQkjZGVmaW5lIENPTkZJR19FTlZfUkFOR0UgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TSVpFICogOAorCQkjZGVmaW5lIENPTkZJR19FTlZfUkFOR0UgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9SQU5HRV9OQU5ECiAKIAkJI2RlZmluZSBNVl9OQk9PVF9CQVNFICAgICAgICAgICAgICAgICAgIDAKIAkJI2RlZmluZSBNVl9OQk9PVF9MRU4gICAgICAgICAgICAgICAgICAgICg0IDw8IDEwKSAgICAgICAvKiBSZXNlcnZlZCA0S0IgZm9yIGJvb3Qgc3RyYXAgKi8KQEAgLTQ0Myw2ICs0NTYsMTMgQEAKIAkjZGVmaW5lIEVOVl9VU0IwX01PREUgICAiaG9zdCIKIAkjZGVmaW5lIEVOVl9VU0JfQUNUSVZFICAgICAgICAiMCIKIAkjZGVmaW5lIEVOVl9VU0JfTU9ERSAgICAgICAgICAiMyIJLyogMyA9IFVTQjMuMCB8IDIgPSBVU0IyLjAgKi8KKwkvKiBNYXJ2ZWxsIGVuY2Fwc3VsYXRlIGl0J3MgVVNCIHVzYWdlIHdpdGggdXNiQWN0aXZlIGludGVybmFsIGluZGV4LAorCSAqIHRoZSB1c2Igc3RhY2sgdXNlcyAxIGNvbnRyb2xsZXIgc2ltdWx0YW5lb3VzbHkgKi8KKwkjZGVmaW5lIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfQ09VTlQJCTEKKwkvKiB4SENJIGNvZGUgcmVsaWVzIG9uIGluZGV4IHJlY2VpdmluZyBmcm9tIHRoYXQgdXNiQWN0aXZlLAorCSAqIHdoaWNoIGNvdWxkIGdvIHVwIHRvIDIgZm9yIHNldmVyYWwgU29Dcy4gdGhpcyByZXF1aXJlcyB4SENJIGFycmF5cyB0byBiZSBhcyBiaWcgYXMKKwkgKiB0aGUgYWN0dWFsIFVTQiBob3N0IGNvdW50ICovCisJI2RlZmluZSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0hPU1RfQ09VTlQJMQogI2lmIGRlZmluZWQoQ09ORklHX1VTQl9YSENJKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfRUhDSSkKIAkjZGVmaW5lIENPTkZJR19VU0JfWEhDSV9IQ0QgLyogc2V0IGtlcm5lbCBkZWZpbmUgLSBmb3IgbXZfaGFsL3VzYiB1c2FnZSAqLwogI2VuZGlmIC8qIENPTkZJR19VU0JfWEhDSSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL2FybWFkYV8zOHguaCBiL2luY2x1ZGUvY29uZmlncy9hcm1hZGFfMzh4LmgKaW5kZXggNzVlZmFhMi4uMTYyMzhiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL2FybWFkYV8zOHguaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvYXJtYWRhXzM4eC5oCkBAIC01Nyw2ICs1Nyw3IEBACiAgKi8KICNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAogCSNkZWZpbmUgTVY4OEY2OFhYCisJI2RlZmluZSBDT05GSUdfU1dJVENISU5HX1NFUlZJQ0VTCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJNQURBXzM5WAogCSNkZWZpbmUgTVY4OEY2OVhYCkBAIC02NywxNCArNjgsMjEgQEAKICNkZWZpbmUgTVZfRERSXzY0QklUCiAjZGVmaW5lIE1WX0JPT1RST00KIAotI2lmIGRlZmluZWQgKENPTkZJR19DVVNUT01FUl9CT0FSRF8wKSB8fCBkZWZpbmVkIChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMSkgfHwgZGVmaW5lZCAoQ09ORklHX0dGQ0gxMDApCisjaWYgZGVmaW5lZCAoQ09ORklHX0NVU1RPTUVSX0JPQVJEXzApIHx8IGRlZmluZWQgKENPTkZJR19DVVNUT01FUl9CT0FSRF8xKSB8fCBkZWZpbmVkIChDT05GSUdfQ0xFQVJGT0dfQk9BUkQpIHx8IGRlZmluZWQgKENPTkZJR19HRkNIMTAwKQogI2RlZmluZSBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAogI2VuZGlmCiAKKyNpZmRlZiBNVl9JTkNMVURFX1NXSVRDSAorLypBUk1BREEzOHggc3dpdGNoIHJlc2dpdGVycyBhcmUgYWNjZXNzZWQgYnkgU01JKi8KKy8qd2UgcHJvdmlkZSBuYW1lIHVuaWZpZWQgc3dpdGNoIHJlZ2lzdGVyIGFjY2VzcyBBUElzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGFjY2VzcyB3YXkqLworI2RlZmluZSBNVl9TV0lUQ0hfU01JX0FDQ0VTUworI2VuZGlmCisKICNkZWZpbmUgTVZfVVNCCiAjZGVmaW5lIE1WX0ZTCiAjZGVmaW5lIENPTkZJR19DTURfREFURQogI2RlZmluZSBDT05GSUdfQk9BUkRfRUFSTFlfSU5JVF9GCisjZGVmaW5lIENPTkZJR19QSUNfR1BJTyAJCS8qICBzdXBwb3J0IEdQSU8gc2lnbmFscyBmb3IgUElDIChwcm9ncmFtbWFibGUgaW50ZXJmYWNlIGNpcmN1aXQpICovCiAKICNkZWZpbmUgTVZfRERSX1RSQUlOSU5HX0NNRF9ORVdfVElQCiAKQEAgLTE1NiwxMSArMTY0LDEzIEBACiAjZGVmaW5lIENPTkZJR19DTURfQk9PVF9NRU5VCiAjZGVmaW5lIENPTkZJR19DTURfU1lTX1JFU1RPUkUKICNkZWZpbmUgQ09ORklHX0NNRF9ITlZSQU0KKwogLyogT3BlbiB0aGlzIGRlZmluZSBmb3IgZW5hYmxpbmcgU2VjdXJlIEJvb3QgTW9kZSBlRnVzZXMgbW9kaWZpY2F0aW9uCiAjZGVmaW5lIENPTkZJR19DTURfRUZVU0UKICovCiAjaWZkZWYgQ09ORklHX0FSTUFEQV8zOVgKIAkjaWZuZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisJCSNkZWZpbmUgTVZfQ1JPU1NfRkxBU0hfQk9PVAogCQkjZGVmaW5lIENPTkZJR19DTURfQk9BUkRDRkcKIAkjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KICNlbmRpZiAvKiBDT05GSUdfQVJNQURBXzM5WCAqLwpAQCAtMjg2LDYgKzI5NiwxNyBAQAogCSNkZWZpbmUgQ09ORklHX0VOVl9TUElfQ1MgICAgICAgICAgICAgICAwCiAJI2RlZmluZSBDT05GSUdfRU5WX1NQSV9CVVMgICAgICAgICAgICAgIG12Qm9hcmRTcGlCdXNHZXQoKQogCisjaWYgZGVmaW5lZChNVl9TRUNfNjRLKQorCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCQkweDEwMDAwCisjZWxpZiBkZWZpbmVkKE1WX1NFQ18xMjhLKQorCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCQkweDIwMDAwCisjZWxpZiBkZWZpbmVkKE1WX1NFQ18yNTZLKQorCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCQkweDQwMDAwCisjZW5kaWYKKworI2RlZmluZSBDT05GSUdfRU5WX1NJWkVfU1BJCQlDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJLyogZW52aXJvbm1lbnQgdGFrZXMgb25lIHNlY3RvciAqLworI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVF9TUEkJCTB4MTAwMDAwCQkJLyogKDFNQiBGb3IgSW1hZ2UpIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLworCiAjaWZuZGVmIENPTkZJR19TRl9ERUZBVUxUX1NQRUVECiAjIGRlZmluZSBDT05GSUdfU0ZfREVGQVVMVF9TUEVFRCAgICAgICAgQ09ORklHX0VOVl9TUElfTUFYX0haCiAjZW5kaWYKQEAgLTMwMywxNiArMzI0LDEwIEBACiAJI2lmIGRlZmluZWQoTVZfU1BJX0JPT1QpCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9TUElfRkxBU0gKIAotCQkjaWYgZGVmaW5lZChNVl9TRUNfNjRLKQotCQkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIDB4MTAwMDAKLQkJI2VsaWYgZGVmaW5lZChNVl9TRUNfMTI4SykKLQkJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAweDIwMDAwCi0JCSNlbGlmIGRlZmluZWQoTVZfU0VDXzI1NkspCi0JCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAgMHg0MDAwMAotCQkjZW5kaWYKKwkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgCQlDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkKIAogCQkjZGVmaW5lIENPTkZJR19FTlZfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgc2VjdG9yICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAwICAgICAgICAgICAgICAgIC8qICgxTUIgRm9yIEltYWdlKSBlbnZpcm9ubWVudCBzdGFydHMgaGVyZSAgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVRfU1BJCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUCiAJCSNkZWZpbmUgTU9OSVRPUl9IRUFERVJfTEVOICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAgICAgICAgIDAKQEAgLTMzNSw2ICszNTAsMTAgQEAKIC8qIE5BTkQtRkxBU0ggc3R1ZmYgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIE1WX05BTkQKKwkjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGludCBuYW5kX2dldF9lbnZfb2Zmcyh2b2lkKTsKKwkjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKIAkjZGVmaW5lIE1WX05BTkRfUElPX01PREUKIAkjZGVmaW5lIE1WX05BTkRfMUNTX01PREUKIAkvKiBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIG1hc2tlZCBmb3IgYTM4eDoKQEAgLTM2NCwxNyArMzgzLDIyIEBACiAJI3VuZGVmIE1WX05GQ19EQkcKIAkjZGVmaW5lIENPTkZJR19KRkZTMl9OQU5ECiAKKworCSNkZWZpbmUgQ09ORklHX0VOVl9TSVpFX05BTkQJCQkweDgwMDAwCisJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVF9OQU5ECQkJbmFuZF9nZXRfZW52X29mZnMoKQorCSNkZWZpbmUgQ09ORklHX0VOVl9SQU5HRV9OQU5ECQkJQ09ORklHX0VOVl9TSVpFX05BTkQgKiA4CisKIC8qIEJvb3QgZnJvbSBOQU5EIHNldHRpbmdzICovCiAJI2lmIGRlZmluZWQoTVZfTkFORF9CT09UKQogCQkjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fTkFORAogCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9TSVpFICAgICAgICAgICAgICAgICAweDgwMDAwICAgICAgICAgICAgICAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgZXJhc2UgYmxvY2sgKi8KKwkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfU0laRV9OQU5EICAgICAgICAgICAgICAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgZXJhc2UgYmxvY2sgKi8KIAkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgIG5hbmRfZ2V0X2Vudl9vZmZzKCkgICAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLwogCQkjZGVmaW5lIENPTkZJR19FTlZfQUREUiAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVQKIAkJI2RlZmluZSBNT05JVE9SX0hFQURFUl9MRU4gICAgICAgICAgICAgIDB4MjAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0JBU0UgICAgICAgICAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0xFTiAgICAgICAgICAweDgwMDAwICAgICAgICAgICAvKiBSZXNlcnZlIDUxMiBrQiBmb3IgTW9uaXRvciAqLwotCQkjZGVmaW5lIENPTkZJR19FTlZfUkFOR0UgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TSVpFICogOAorCQkjZGVmaW5lIENPTkZJR19FTlZfUkFOR0UgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9SQU5HRV9OQU5ECiAKIAkJI2RlZmluZSBNVl9OQk9PVF9CQVNFICAgICAgICAgICAgICAgICAgIDAKIAkJI2RlZmluZSBNVl9OQk9PVF9MRU4gICAgICAgICAgICAgICAgICAgICg0IDw8IDEwKSAgICAgICAvKiBSZXNlcnZlZCA0S0IgZm9yIGJvb3Qgc3RyYXAgKi8KQEAgLTQ5MywxNyArNTE3LDMyIEBACiAJI2RlZmluZSBDT05GSUdfVVNCX1hIQ0kKIAkjZGVmaW5lIENPTkZJR19TWVNfVVNCX1hIQ0lfTUFYX1JPT1RfUE9SVFMgIDEKIAkjZGVmaW5lIE1WX0lOQ0xVREVfVVNCCisJI2RlZmluZSBNVl9JTkNMVURFX1VTQl9ERVZJQ0UKIAkjZGVmaW5lIENPTkZJR19DTURfVVNCCiAJI2RlZmluZSBDT05GSUdfVVNCX1NUT1JBR0UKIAkjZGVmaW5lIENPTkZJR19FSENJX0lTX1RESQogCSNkZWZpbmUgQ09ORklHX0RPU19QQVJUSVRJT04KIAkjZGVmaW5lIENPTkZJR19JU09fUEFSVElUSU9OCiAJI2RlZmluZSBFTlZfVVNCMF9NT0RFICAgImhvc3QiCisjaWZkZWYgQ09ORklHX0NMRUFSRk9HX0JPQVJECisJI2RlZmluZSBFTlZfVVNCX0FDVElWRSAgICAgICAgIjEiCisJI2RlZmluZSBFTlZfVVNCX01PREUgICAgICAgICAgIjMiCS8qIDMgPSBVU0IzLjAgfCAyID0gVVNCMi4wICovCisjZWxzZQogCSNkZWZpbmUgRU5WX1VTQl9BQ1RJVkUgICAgICAgICIwIgogCSNkZWZpbmUgRU5WX1VTQl9NT0RFICAgICAgICAgICIzIgkvKiAzID0gVVNCMy4wIHwgMiA9IFVTQjIuMCAqLworI2VuZGlmCiAKIAkjZGVmaW5lIENPTkZJR19VU0JfSE9TVF9FVEhFUgogCSNkZWZpbmUgQ09ORklHX1VTQl9FVEhFUl9BU0lYCisJLyogTWFydmVsbCBlbmNhcHN1bGF0ZSBpdCdzIFVTQiB1c2FnZSB3aXRoIHVzYkFjdGl2ZSBpbnRlcm5hbCBpbmRleCwKKwkgKiB0aGUgdXNiIHN0YWNrIHVzZXMgMSBjb250cm9sbGVyIHNpbXVsdGFuZW91c2x5ICovCisJI2RlZmluZSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0NPVU5UCQkxCisJLyogeEhDSSBjb2RlIHJlbGllcyBvbiBpbmRleCByZWNlaXZpbmcgZnJvbSB0aGF0IHVzYkFjdGl2ZSwKKwkgKiB3aGljaCBjb3VsZCBnbyB1cCB0byAyLiB0aGlzIHJlcXVpcmVzIHhIQ0kgYXJyYXlzIHRvIGJlIGFzIGJpZyBhcworCSAqIHRoZSBhY3R1YWwgVVNCIGhvc3QgY291bnQgKi8KKwkjZGVmaW5lIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfSE9TVF9DT1VOVAkyCisKKwkjZGVmaW5lIE1WX1VTQl9WQlVTX0NZQ0xFCiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfWEhDSSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX0VIQ0kpCiAJI2RlZmluZSBDT05GSUdfVVNCX1hIQ0lfSENEIC8qIHNldCBrZXJuZWwgZGVmaW5lIC0gZm9yIG12X2hhbC91c2IgdXNhZ2UgKi8KQEAgLTUzOSw2ICs1NzgsMTQgQEAKIC8vI2RlZmluZSBDT05GSUdfTU1DX1RSQUNFCiAvKiBCb290IGZyb20gTU1DIHNldHRpbmdzICovCiAjaWYgZGVmaW5lZChNVl9NTUNfQk9PVCkKKy8qIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBvbmx5IHdpdGggU1BJL05BTkQgaW50ZXJmYWNlcyAqLworI2lmICghZGVmaW5lZChNVl9JTkNMVURFX1NQSSkgJiYgIWRlZmluZWQoTVZfTkFORCkpCisJI3VuZGVmIENPTkZJR19DTURfU09VUkNFCS8qIGNtZF9tdnNvdXJjZS5jIHN1cHBvcnRzIHNjcmlwdCBidXJuaW5nIHRvIFNQSS9OQU5EIG9ubHkgKi8KKwkjdW5kZWYgQ09ORklHX0NNRF9TVEFHRV9CT09UCisJI3VuZGVmIENPTkZJR19DTURfUkNWUgorCSN1bmRlZiBDT05GSUdfQ01EX0JPT1RfTUVOVQorCSN1bmRlZiBDT05GSUdfQ01EX1NZU19SRVNUT1JFCisjZW5kaWYKIAkjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fTU1DCS8qIEVudmlyb25tZW50IGlzIGF0IGFic29sdXRlIGxvY2F0aW9uIChSQVcpICovCiAvLwkjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fRkFUCS8qIEVudmlyb25tZW50IGlzIGluIGZpbGUgb24gRkFUIHBhcnRpdGlvbiAqLwogLy8JI2RlZmluZSBDT05GSUdfRkFUX1dSSVRFCkBAIC01NjcsMTEgKzYxNCw5IEBACiAgKi8KICNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAogI2RlZmluZSBNVl9CT09UQVJHU19FTkQgICAgICAgICAiOjEwLjQuNTAuMjU0OjI1NS4yNTUuMjU1LjA6QXJtYWRhMzh4OmV0aDA6bm9uZSIKLSNkZWZpbmUgTVZfQk9PVEFSR1NfRU5EX1NXSVRDSCAgIjo6OkFybWFkYTM4eDpldGgwOm5vbmUiCiAjZGVmaW5lIE1WX0REUl9MMl9BTElHTk1FTlQKICNlbGlmIGRlZmluZWQgQ09ORklHX0FSTUFEQV8zOVgKICNkZWZpbmUgTVZfQk9PVEFSR1NfRU5EICAgICAgICAgIjoxMC40LjUwLjI1NDoyNTUuMjU1LjI1NS4wOkFybWFkYTM5eDpldGgwOm5vbmUiCi0jZGVmaW5lIE1WX0JPT1RBUkdTX0VORF9TV0lUQ0ggICI6OjpBcm1hZGEzOXg6ZXRoMDpub25lIgogI2VuZGlmCiAjZGVmaW5lIFJDVlJfSVBfQUREUiAgICAgICAgICAgICIxNjkuMjU0LjEwMC4xMDAiCiAJI2RlZmluZSBSQ1ZSX0xPQURfQUREUiAgICAgICAgICAiMHgwMjAwMDAwMCIKQEAgLTYyNyw3ICs2NzIsNiBAQAogLyogUG5QIFBDSSBOZXR3b3JrIGNhcmRzICovCiAJI2RlZmluZSBDT05GSUdfRUVQUk8xMDAgLyogU3VwcG9ydCBmb3IgSW50ZWwgODI1NTcvODI1NTkvODI1NTlFUiBjaGlwcyAqLwogCSNkZWZpbmUgQ09ORklHX0UxMDAwCi0JI2RlZmluZSBDT05GSUdfU0s5OAogCSNkZWZpbmUgWVVLX0VUSEFERFIgICAgICAgICAgICAgICAgICAgICAiMDA6MDA6MDA6RUU6NTE6ODEiCiAjZW5kaWYKIApAQCAtNjk1LDcgKzczOSwxMyBAQAogI2RlZmluZSBCT0FSRF9MQVRFX0lOSVQKICNkZWZpbmUgQ09ORklHX0JPQVJEX0xBVEVfSU5JVAogI3VuZGVmICBDT05GSUdfVVNFX0lSUQorI2RlZmluZSBDT05GSUdfQlpJUDIKIAogI2RlZmluZSBDT05GSUdfU1RBQ0tTSVpFICAgICAgICAoMSA8PCAyMCkgICAgICAgLyogcmVndWxhciBzdGFjayAtIHVwIHRvIDRNIChpbiBjYXNlIG9mIGV4Y2VwdGlvbikqLwogCisvKgorICogRVJSQVRBCisgKi8KKyNkZWZpbmUgRVJSQVRBX0ZFXzMxMjQwNjQKKwogI2VuZGlmIC8qIF9fQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29uZmlncy9hdmFudGFfbHAuaCBiL2luY2x1ZGUvY29uZmlncy9hdmFudGFfbHAuaApvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGJjODNmMDMuLjQzZjU5YjMKLS0tIGEvaW5jbHVkZS9jb25maWdzL2F2YW50YV9scC5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9hdmFudGFfbHAuaApAQCAtNTMsNiArNTMsMTIgQEAKIAogI2luY2x1ZGUgIi4uLy4uL2JvYXJkL212X2VidS9hbHAvbXZTeXNId0NvbmZpZy5oIgogCisjaWZkZWYgTVZfSU5DTFVERV9TV0lUQ0gKKy8qQXZhbnRhIExQIHN3aXRjaCByZXNnaXRlcnMgYXJlIGFjY2Vzc2VkIGJ5IENQVSBkaXJlY3RseSovCisvKndlIHByb3ZpZGUgbmFtZSB1bmlmaWVkIHN3aXRjaCByZWdpc3RlciBhY2Nlc3MgQVBJcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgYWNjb3JkaW5nIHRvIHRoZSBhY2Nlc3Mgd2F5Ki8KKyNkZWZpbmUgTVZfU1dJVENIX0RJUkVDVF9BQ0NFU1MKKyNlbmRpZgorCiAvKiBWZXJzaW9uIG51bWJlciBwYXNzZWQgdG8ga2VybmVsICovCiAjZGVmaW5lIFZFUl9OVU0gMHgxMTEyMDAwMCAgICAgICAgICAgICAgLyogMjAxMS4xMiAqLwogCkBAIC0yNjUsMjEgKzI3MSwyNyBAQAogI2RlZmluZSBDT05GSUdfU0ZfREVGQVVMVF9CVVMJCUNPTkZJR19FTlZfU1BJX0JVUwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKE1WX1NFQ182NEspCisjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFX1NQSQkweDEwMDAwCisjZWxpZiBkZWZpbmVkKE1WX1NFQ18xMjhLKQorI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRV9TUEkJMHgyMDAwMAorI2VsaWYgZGVmaW5lZChNVl9TRUNfMjU2SykKKyNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCTB4NDAwMDAKKyNlbmRpZgorCisjZGVmaW5lCUNPTkZJR19FTlZfT0ZGU0VUX1NQSQkJMHgxMDAwMDAKKyNkZWZpbmUJQ09ORklHX0VOVl9TSVpFX1NQSQkJQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCisKKwogLyogQm9vdCBmcm9tIFNQSSBzZXR0aW5ncyAqLwogCSNpZiBkZWZpbmVkKE1WX1NQSV9CT09UKQogCQkjZGVmaW5lIENPTkZJR19FTlZfSVNfSU5fU1BJX0ZMQVNICiAKLQkJI2lmIGRlZmluZWQoTVZfU0VDXzY0SykKLQkJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAweDEwMDAwCi0JCSNlbGlmIGRlZmluZWQoTVZfU0VDXzEyOEspCi0JCQkjZGVmaW5lIENPTkZJR19FTlZfU0VDVF9TSVpFICAgICAgICAgICAgMHgyMDAwMAotCQkjZWxpZiBkZWZpbmVkKE1WX1NFQ18yNTZLKQotCQkJI2RlZmluZSBDT05GSUdfRU5WX1NFQ1RfU0laRSAgICAgICAgICAgIDB4NDAwMDAKLQkJI2VuZGlmCisJCSNkZWZpbmUgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgICAgICAgICAJQ09ORklHX0VOVl9TRUNUX1NJWkVfU1BJCiAKLQkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9TRUNUX1NJWkUgICAgLyogZW52aXJvbm1lbnQgdGFrZXMgb25lIHNlY3RvciAqLwotCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMCAgICAgICAgICAgICAgICAvKiAoMU1CIEZvciBJbWFnZSkgZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCi0JCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUCisJCSNkZWZpbmUgQ09ORklHX0VOVl9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfU0VDVF9TSVpFX1NQSSAgICAvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgc2VjdG9yICovCisJCSNkZWZpbmUgQ09ORklHX0VOVl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUX1NQSSAgICAgICAvKiAoMU1CIEZvciBJbWFnZSkgZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisJCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfT0ZGU0VUX1NQSQogCQkjZGVmaW5lIE1PTklUT1JfSEVBREVSX0xFTiAgICAgICAgICAgICAgICAgICAgICAweDIwMAogCQkjZGVmaW5lIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFICAgICAgICAgICAgICAgICAwCiAJCSNkZWZpbmUgQ09ORklHX1NZU19NT05JVE9SX0xFTiAgICAgICAgICAgICAgICAgIDB4ODAwMDAgICAgICAgICAgICAgICAgIC8qKDUxMiA8PCAxMCkgUmVzZXJ2ZSA1MTIga0IgZm9yIE1vbml0b3IgKi8KQEAgLTMwMSw2ICszMTMsMTAgQEAKIC8qIE5BTkQtRkxBU0ggc3R1ZmYgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIE1WX05BTkQKKwkjaWZuZGVmIF9fQVNTRU1CTFlfXworZXh0ZXJuIGludCBuYW5kX2dldF9lbnZfb2Zmcyh2b2lkKTsKK2V4dGVybiBpbnQgbmFuZF9nZXRfZW52X3JhbmdlKHZvaWQpOworCSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAkjZGVmaW5lIE1WX05BTkRfUElPX01PREUKIAkjZGVmaW5lIE1WX05BTkRfMUNTX01PREUKIAkjZGVmaW5lIE1WX05BTkRfNEJJVF9NT0RFCkBAIC0zMTksMTcgKzMzNSwyMSBAQAogCSN1bmRlZiBDT05GSUdfQ01EX05BTkRfWUFGRlMyCiAJI3VuZGVmIENPTkZJR19NVERfTkFORF9ZQUZGUzIKIAorCSNkZWZpbmUJQ09ORklHX0VOVl9TSVpFX05BTkQJCQkweDEwMDAwCisJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVF9OQU5ECQkJbmFuZF9nZXRfZW52X29mZnMoKQorCSNkZWZpbmUJQ09ORklHX0VOVl9SQU5HRV9OQU5ECQkJbmFuZF9nZXRfZW52X3JhbmdlKCkKKwogLyogQm9vdCBmcm9tIE5BTkQgc2V0dGluZ3MgKi8KIAkjaWYgZGVmaW5lZChNVl9OQU5EX0JPT1QpCiAJCSNkZWZpbmUgQ09ORklHX0VOVl9JU19JTl9OQU5ECiAKLQkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgIDB4MTAwMDAJCQkvKiBlbnZpcm9ubWVudCB0YWtlcyBvbmUgZXJhc2UgYmxvY2sgKi8KLQkJI2RlZmluZSBDT05GSUdfRU5WX09GRlNFVCAgICAgICAgICAgICAgIG5hbmRfZ2V0X2Vudl9vZmZzKCkgICAgIC8qIGVudmlyb25tZW50IHN0YXJ0cyBoZXJlICAqLwotCQkjZGVmaW5lIENPTkZJR19FTlZfQUREUiAgICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVQKKwkJI2RlZmluZSBDT05GSUdfRU5WX1NJWkUgICAgICAgICAgICAgICAgIENPTkZJR19FTlZfU0laRV9OQU5ECS8qIGVudmlyb25tZW50IHRha2VzIG9uZSBlcmFzZSBibG9jayAqLworCQkjZGVmaW5lIENPTkZJR19FTlZfT0ZGU0VUICAgICAgICAgICAgICAgQ09ORklHX0VOVl9PRkZTRVRfTkFORCAgLyogZW52aXJvbm1lbnQgc3RhcnRzIGhlcmUgICovCisJCSNkZWZpbmUgQ09ORklHX0VOVl9BRERSICAgICAgICAgICAgICAgICBDT05GSUdfRU5WX09GRlNFVF9OQU5ECiAJCSNkZWZpbmUgTU9OSVRPUl9IRUFERVJfTEVOICAgICAgICAgICAgICAweDIwMAogCQkjZGVmaW5lIENPTkZJR19TWVNfTU9OSVRPUl9CQVNFICAgICAgICAgMAogCQkjZGVmaW5lIENPTkZJR19TWVNfTU9OSVRPUl9MRU4gICAgICAgICAgMHg4MDAwMCAgICAgICAgICAgLyogUmVzZXJ2ZSA1MTIga0IgZm9yIE1vbml0b3IgKi8KLQkJI2RlZmluZSBDT05GSUdfRU5WX1JBTkdFICAgICAgICAgICAgICAgIG5hbmRfZ2V0X2Vudl9yYW5nZSgpCisJCSNkZWZpbmUgQ09ORklHX0VOVl9SQU5HRSAgICAgICAgICAgICAgICBDT05GSUdfRU5WX1JBTkdFX05BTkQKIAogCQkjZGVmaW5lIE1WX05CT09UX0JBU0UgICAgICAgICAgICAgICAgICAgMAogCQkjZGVmaW5lIE1WX05CT09UX0xFTiAgICAgICAgICAgICAgICAgICAgKDQgPDwgMTApICAgICAgIC8qIFJlc2VydmVkIDRLQiBmb3IgYm9vdCBzdHJhcCAqLwpAQCAtNDQzLDYgKzQ2MywxMyBAQAogCSNkZWZpbmUgRU5WX1VTQjFfTU9ERSAgICJob3N0IgogCSNkZWZpbmUgRU5WX1VTQl9BQ1RJVkUgICAgICAgICIwIgogCSNkZWZpbmUgRU5WX1VTQl9NT0RFICAgICAgICAgICIzIgkvKiAzID0gVVNCMy4wIHwgMiA9IFVTQjIuMCAqLworCS8qIE1hcnZlbGwgZW5jYXBzdWxhdGUgaXQncyBVU0IgdXNhZ2Ugd2l0aCB1c2JBY3RpdmUgaW50ZXJuYWwgaW5kZXgsCisJICogdGhlIHVzYiBzdGFjayB1c2VzIDEgY29udHJvbGxlciBzaW11bHRhbmVvdXNseSAqLworCSNkZWZpbmUgQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9DT1VOVAkJMQorCS8qIHhIQ0kgY29kZSByZWxpZXMgb24gaW5kZXggcmVjZWl2aW5nIGZyb20gdGhhdCB1c2JBY3RpdmUsCisJICogd2hpY2ggY291bGQgZ28gdXAgdG8gMiBmb3Igc2V2ZXJhbCBTb0NzLiB0aGlzIHJlcXVpcmVzIHhIQ0kgYXJyYXlzIHRvIGJlIGFzIGJpZyBhcworCSAqIHRoZSBhY3R1YWwgVVNCIGhvc3QgY291bnQgKi8KKwkjZGVmaW5lIENPTkZJR19VU0JfTUFYX0NPTlRST0xMRVJfSE9TVF9DT1VOVAkxCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX1hIQ0kpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9FSENJKQogCSNkZWZpbmUgQ09ORklHX1VTQl9YSENJX0hDRCAvKiBzZXQga2VybmVsIGRlZmluZSAtIGZvciBtdl9oYWwvdXNiIHVzYWdlICovCiAjZW5kaWYgLyogQ09ORklHX1VTQl9YSENJICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvbmZpZ3MvbXN5cy5oIGIvaW5jbHVkZS9jb25maWdzL21zeXMuaAppbmRleCAzN2I3ODA0Li44Y2QxMzdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbmZpZ3MvbXN5cy5oCisrKyBiL2luY2x1ZGUvY29uZmlncy9tc3lzLmgKQEAgLTExNCw2ICsxMTQsNyBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAlleHRlcm4gdW5zaWduZWQgaW50IG12Q3B1RGRyQ2xrR2V0KHZvaWQpOwogCWV4dGVybiB1bnNpZ25lZCBpbnQgbXZUY2xrR2V0KHZvaWQpOworCWV4dGVybiB1bnNpZ25lZCBpbnQgbXZVYXJ0UG9ydEdldCh2b2lkKTsKIAkjZGVmaW5lIFVCT09UX0NOVFIJCTAJCS8qIGNvdW50ZXIgdG8gdXNlIGZvciB1Ym9vdCB0aW1lciAqLwogCSNkZWZpbmUgTVZfVENMS19DTlRSCQkxCQkvKiBjb3VudGVyIHRvIHVzZSBmb3IgdWJvb3QgdGltZXIgKi8KIAkjZGVmaW5lIE1WX1JFRl9DTEtfREVWX0JJVAkxMDAwCQkvKiBOdW1iZXIgb2YgY3ljbGUgdG8gZWFuYmxlIHRpbWVyICovCkBAIC0yMDQsNiArMjA1LDExIEBACiAjZGVmaW5lIENPTkZJR19CT09UUF9QWEVfQ0xJRU5UQVJDSAkweDEwMAogI2RlZmluZSBDT05GSUdfQk9PVFBfVkNJX1NUUklORwkJIlUtYm9vdC5hcm12Ny5hcm1hZGFfeHAiCiAKKy8qIEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSAoRkRUKSBzdXBwb3J0ICovCisjZGVmaW5lIENPTkZJR19PRl9MSUJGRFQgICAgICAgICAgICAgICAxCisjZGVmaW5lIENPTkZJR19PRl9CT0FSRF9TRVRVUAorI3VuZGVmIENPTkZJR19PRl9MSUJGRFRfSVNfREVGQVVMVCAgIC8qIGRmdCBpcyB0aGUgZGVmYXVsdCBmb3IgYm9vdGNtZCAqLworCiAvKiBGUyBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgQ09ORklHX0NNRF9FWFQyCiAjZGVmaW5lIENPTkZJR19DTURfRVhUNApAQCAtMzMwLDcgKzMzNiw3IEBACiAgKi8KICNkZWZpbmUgQ09ORklHX0JBVURSQVRFICAgICAgICAgCTExNTIwMCAgIC8qIGNvbnNvbGUgYmF1ZHJhdGUgPSAxMTUyMDAgICAgKi8KICNkZWZpbmUgQ09ORklHX1NZU19CQVVEUkFURV9UQUJMRQl7IDk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsIDkyMTYwMCB9Ci0jZGVmaW5lIENPTkZJR19TWVNfRFVBUlRfQ0hBTgkJMQkJLyogY2hhbm5lbCB0byB1c2UgZm9yIGNvbnNvbGUgKi8KKyNkZWZpbmUgQ09ORklHX1NZU19EVUFSVF9DSEFOCQkwCQkvKiBjaGFubmVsIHRvIHVzZSBmb3IgY29uc29sZSAqLwogCiAKICNkZWZpbmUgQ09ORklHX1NZU19JTklUX0NIQU4xCkBAIC0zOTgsNiArNDA0LDEzIEBACiAJI2RlZmluZSBFTlZfVVNCMV9NT0RFICAgImhvc3QiCiAJI2RlZmluZSBFTlZfVVNCX0FDVElWRSAgICAgICAgIjAiCiAJI2RlZmluZSBFTlZfVVNCX01PREUgICAgICAgICAgIjIiIC8qIDMgPSBVU0IzLjAgfCAyID0gVVNCMi4wICovCisJLyogTWFydmVsbCBlbmNhcHN1bGF0ZSBpdCdzIFVTQiB1c2FnZSB3aXRoIHVzYkFjdGl2ZSBpbnRlcm5hbCBpbmRleCwKKwkgKiB0aGUgdXNiIHN0YWNrIHVzZXMgMSBjb250cm9sbGVyIHNpbXVsdGFuZW91c2x5ICovCisJI2RlZmluZSBDT05GSUdfVVNCX01BWF9DT05UUk9MTEVSX0NPVU5UCQkxCisJLyogeEhDSSBjb2RlIHJlbGllcyBvbiBpbmRleCByZWNlaXZpbmcgZnJvbSB0aGF0IHVzYkFjdGl2ZSwKKwkgKiB3aGljaCBjb3VsZCBnbyB1cCB0byAyIGZvciBzZXZlcmFsIFNvQ3MuIHRoaXMgcmVxdWlyZXMgeEhDSSBhcnJheXMgdG8gYmUgYXMgYmlnIGFzCisJICogdGhlIGFjdHVhbCBVU0IgaG9zdCBjb3VudCAqLworCSNkZWZpbmUgQ09ORklHX1VTQl9NQVhfQ09OVFJPTExFUl9IT1NUX0NPVU5UCTEKIAogCSNkZWZpbmUgQ09ORklHX1VTQl9IT1NUX0VUSEVSCiAJI2RlZmluZSBDT05GSUdfVVNCX0VUSEVSX0FTSVgKQEAgLTU3OSw2ICs1OTIsMTEgQEAKIAkjZGVmaW5lIENPTkZJR19TWVNfTkFORF9NQVhfQ0hJUFMgMQogCiAjaWYgZGVmaW5lZChNVl9OQU5EKQorCisJI2lmbmRlZiBfX0FTU0VNQkxZX18KK2V4dGVybiBpbnQgbmFuZF9nZXRfZW52X29mZnModm9pZCk7CisJI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAJI2RlZmluZSBNVl9OQU5EX1BJT19NT0RFCiAJI2RlZmluZSBNVl9OQU5EXzFDU19NT0RFCiAJI2RlZmluZSBNVl9OQU5EXzRCSVRfTU9ERQpAQCAtNjY2LDYgKzY4NCw3IEBACiAjZGVmaW5lIENPTkZJR19CT0FSRF9MQVRFX0lOSVQKICN1bmRlZiBDT05GSUdfVVNFX0lSUQogI2RlZmluZSBDT05GSUdfQlpJUDIKKyNkZWZpbmUgTVZfU1dJVENIX0FERFJFU1NfQ09NUExFVElPTgogCiAvKiBmb3IgcnVubmluZyBmcm9tIEwyIFNSQU0KICNkZWZpbmUgQ09ORklHX1NUQUNLU0laRQkoMTI4IDw8IDEwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb25maWdzL212X3ZlcnNpb24uaCBiL2luY2x1ZGUvY29uZmlncy9tdl92ZXJzaW9uLmgKaW5kZXggZTM1OTBhNS4uNDU4OTM2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jb25maWdzL212X3ZlcnNpb24uaAorKysgYi9pbmNsdWRlL2NvbmZpZ3MvbXZfdmVyc2lvbi5oCkBAIC0zOSw2ICszOSw2IEBACiAvKgogICogVmVyc2lvbgogICovCi0jZGVmaW5lIENPTkZJR19JREVOVF9TVFJJTkcJIiBNYXJ2ZWxsIHZlcnNpb246IDIwMTVfVDEuMCIKKyNkZWZpbmUgQ09ORklHX0lERU5UX1NUUklORwkiIE1hcnZlbGwgdmVyc2lvbjogMjAxNV9UMS4wcDE2IgogCiAjZW5kaWYgLyogX19NVl9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZXh0NGZzLmggYi9pbmNsdWRlL2V4dDRmcy5oCmluZGV4IDA5YmEzN2UuLjUyNmJkYmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZXh0NGZzLmgKKysrIGIvaW5jbHVkZS9leHQ0ZnMuaApAQCAtMTM1LDcgKzEzNSw3IEBACiB2b2lkIGV4dDRmc19jbG9zZSh2b2lkKTsKIGludCBleHQ0ZnNfbHMoY29uc3QgY2hhciAqZGlybmFtZSwgY2hhciAqb3V0YnVmZiwgaW50IG91dHNpemUpOwogdm9pZCBleHQ0ZnNfZnJlZV9ub2RlKHN0cnVjdCBleHQyZnNfbm9kZSAqbm9kZSwgc3RydWN0IGV4dDJmc19ub2RlICpjdXJycm9vdCk7Ci1pbnQgZXh0NGZzX2RldnJlYWQoaW50IHNlY3RvciwgaW50IGJ5dGVfb2Zmc2V0LCBpbnQgYnl0ZV9sZW4sIGNoYXIgKmJ1Zik7CitpbnQgZXh0NGZzX2RldnJlYWQobGJhaW50X3Qgc2VjdG9yLCBpbnQgYnl0ZV9vZmZzZXQsIGludCBieXRlX2xlbiwgY2hhciAqYnVmKTsKIHZvaWQgZXh0NGZzX3NldF9ibGtfZGV2KGJsb2NrX2Rldl9kZXNjX3QgKnJiZGQsIGRpc2tfcGFydGl0aW9uX3QgKmluZm8pOwogbG9uZyBpbnQgcmVhZF9hbGxvY2F0ZWRfYmxvY2soc3RydWN0IGV4dDJfaW5vZGUgKmlub2RlLCBpbnQgZmlsZWJsb2NrKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9leHRfY29tbW9uLmggYi9pbmNsdWRlL2V4dF9jb21tb24uaAppbmRleCA4NjM3M2E2Li44N2IzM2FjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2V4dF9jb21tb24uaAorKysgYi9pbmNsdWRlL2V4dF9jb21tb24uaApAQCAtMTg2LDcgKzE4Niw3IEBACiAJc3RydWN0IGV4dDJmc19ub2RlIGRpcm9wZW47CiB9OwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwYXJ0X29mZnNldDsKK2V4dGVybiBsYmFpbnRfdCBwYXJ0X29mZnNldDsKIAogaW50IGRvX2V4dDJscyhjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOwogaW50IGRvX2V4dDJsb2FkKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2lkZS5oIGIvaW5jbHVkZS9pZGUuaAppbmRleCA3NTQxY2I4Li5mNmY5NjU0IDEwMDc1NQotLS0gYS9pbmNsdWRlL2lkZS5oCisrKyBiL2luY2x1ZGUvaWRlLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpZmRlZiBDT05GSUdfU1lTXzY0QklUX0xCQQogdHlwZWRlZiB1aW50NjRfdCBsYmFpbnRfdDsKICNkZWZpbmUgTEJBRiAiJWxseCIKKyNkZWZpbmUgTEJBRlUgIiVsbHUiCiAjZGVmaW5lIElERV9CTE9DS19OVU1CRVJfTUFTSyAweDAwMDBmZmZmZjAwMDAwMDAKICNkZWZpbmUgTEJBX0xPV19SRUdfU0hJRlQJMjQKICNkZWZpbmUgTEJBX01JRF9SRUdfU0hJRlQJMzIKQEAgLTUxLDYgKzUyLDcgQEAKICNlbHNlCiB0eXBlZGVmIHVsb25nIGxiYWludF90OwogI2RlZmluZSBMQkFGICIlbHgiCisjZGVmaW5lIExCQUZVICIlbHUiCiAjZGVmaW5lIElERV9CTE9DS19OVU1CRVJfTUFTSyAweGYwMDAwMDAwCiAjZGVmaW5lIExCQV9MT1dfUkVHX1NISUZUCTI0CiAjZGVmaW5lIExCQV9NSURfUkVHX1NISUZUCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGFydC5oIGIvaW5jbHVkZS9wYXJ0LmgKaW5kZXggMzVjMWM1Yi4uOGUzMWU3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wYXJ0LmgKKysrIGIvaW5jbHVkZS9wYXJ0LmgKQEAgLTk3LDggKzk3LDggQEAKICNkZWZpbmUgREVWX1RZUEVfT1BESVNLCQkweDA3CS8qIG9wdGljYWwgZGlzayAqLwogCiB0eXBlZGVmIHN0cnVjdCBkaXNrX3BhcnRpdGlvbiB7Ci0JdWxvbmcJc3RhcnQ7CQkvKiAjIG9mIGZpcnN0IGJsb2NrIGluIHBhcnRpdGlvbgkqLwotCXVsb25nCXNpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHBhcnRpdGlvbgkqLworCWxiYWludF90CXN0YXJ0OwkvKiAjIG9mIGZpcnN0IGJsb2NrIGluIHBhcnRpdGlvbgkqLworCWxiYWludF90CXNpemU7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gcGFydGl0aW9uCSovCiAJdWxvbmcJYmxrc3o7CQkvKiBibG9jayBzaXplIGluIGJ5dGVzCQkJKi8KIAl1Y2hhcgluYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUJCQkqLwogCXVjaGFyCXR5cGVbMzJdOwkvKiBzdHJpbmcgdHlwZSBkZXNjcmlwdGlvbgkJKi8KZGlmZiAtLWdpdCBhL25ldC9ldGguYyBiL25ldC9ldGguYwppbmRleCA0ZTRhODQ3Li5lOWQ5YjA2IDEwMDY0NAotLS0gYS9uZXQvZXRoLmMKKysrIGIvbmV0L2V0aC5jCkBAIC0yMzEsNyArMjMxLDYgQEAKIGludCBldGhfcmVnaXN0ZXIoc3RydWN0IGV0aF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZXRoX2RldmljZSAqZDsKLQlzdGF0aWMgaW50IGluZGV4OwogCiAJYXNzZXJ0KHN0cmxlbihkZXYtPm5hbWUpIDwgc2l6ZW9mKGRldi0+bmFtZSkpOwogCkBAIC0yNDYsNyArMjQ1LDYgQEAKIAogCWRldi0+c3RhdGUgPSBFVEhfU1RBVEVfSU5JVDsKIAlkZXYtPm5leHQgID0gZXRoX2RldmljZXM7Ci0JZGV2LT5pbmRleCA9IGluZGV4Kys7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvLmdpdGlnbm9yZSBiL3Rvb2xzL21hcnZlbGwvLmdpdGlnbm9yZQppbmRleCA2NzM2Njg4Li44NGNkOWNkIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsLy5naXRpZ25vcmUKKysrIGIvdG9vbHMvbWFydmVsbC8uZ2l0aWdub3JlCkBAIC0yOSw2ICsyOSw3IEBACiAvZ2RiL2dkYmNvbnQKIC9nZGIvZ2Ric2VuZAogL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGliLworL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvCiBkb2ltYWdlKgogbGlua2VyLnNjcgogbGlua2VyX3NlYy5zY3IKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9NYWtlZmlsZSBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9NYWtlZmlsZQppbmRleCBmMmUwNDM0Li43YzNjZmFjIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvTWFrZWZpbGUKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL01ha2VmaWxlCkBAIC04NSw2ICs4NSw4IEBACiBBT0JKID0gJChzdWJzdCAucywubywkKEFTUkMpKQogQ09CSiA9ICQoc3Vic3QgLmMsLm8sJChDU1JDKSkKIENVQVJUX09CSiA9ICQoc3Vic3QgLmMsLnVhcnQubywkKENTUkMpKQorQ0RFQlVHX09CSiA9ICQoc3Vic3QgLmMsLmRlYnVnLm8sJChDU1JDKSkgIyBkZWJ1ZyBvYmplY3QgZm9yIG12ZGlzcGF0Y2hlcgorCiAKIExJQl9QSFkgPSBwaHlfJChCT0FSRCkuYQogTElCX0REUiA9IGRkcl8kKEJPQVJEKS5hCkBAIC05OCwxNyArMTAwLDI3IEBACiBMSUJfU1dVUF9VQVJUID0gc3VzcGVuZFdVUC51YXJ0LmEKIExJQl9HRU5FUkFMX0lOSVRfVUFSVCA9IGdlbmVyYWxJbml0LnVhcnQuYQogCitMSUJfUExBVF9ERUJVRyA9IHBsYXQuZGVidWcuYSAjIHNwZWNpZmljIHBsYXRmb3JtIGxpYnJhcnkgd2l0aCBiaW4gaGVhZGVyIGRlYnVnIHRvb2wKKwogTElCR0NDID0gJChNQUlOKS9saWJnY2MubGliCiAKIGlmZXEgKCQoRERSVFlQRSksKQogRERSVFlQRSA9IGRkcjMKIGVuZGlmCiAKK2lmZXEgKCQoRERSVFlQRSksZGRyNCkKKwlUTElCUyA9ICQoVExJQikgJChURERSNFNVQkxJQikKK2Vsc2UKKwlUTElCUyA9ICQoVExJQikKK2VuZGlmCisKIFRMSUIgPSAuL3NyY19kZHIvbGliLyQoRERSVFlQRSlfdHJhaW5pbmdfJChMSUJOQU1FKS5saWIKK1RERFI0U1VCTElCID0gLi9zcmNfZGRyL2xpYi8kKEREUlRZUEUpX3RyYWluaW5nXyQoTElCTkFNRSlzdWIubGliCiAKIENPTVBPTkVOVF9TVUJESVJTID0gcGxhdGZvcm0gc3JjX3BoeSBzcmNfZGRyIHNyY19wbSBzcmNfaW5pdAotSERSX0NPTVBPTkVOVFMgPSAkKExJQl9QTEFUKSAkKExJQl9HRU5FUkFMX0lOSVQpICQoTElCX1BIWSkgJChMSUJfRERSKSAkKFRMSUIpICQoTElCX1NXVVApCi1IRFJfQ09NUE9ORU5UU19VQVJUID0gJChMSUJfUExBVF9VQVJUKSAkKExJQl9HRU5FUkFMX0lOSVRfVUFSVCkgJChMSUJfUEhZX1VBUlQpICQoTElCX0REUl9VQVJUKSAkKFRMSUIpICQoTElCX1NXVVBfVUFSVCkKK0hEUl9DT01QT05FTlRTID0gJChMSUJfUExBVCkgJChMSUJfR0VORVJBTF9JTklUKSAkKExJQl9QSFkpICQoTElCX0REUikgJChUTElCUykgJChMSUJfU1dVUCkKK0hEUl9DT01QT05FTlRTX1VBUlQgPSAkKExJQl9QTEFUX1VBUlQpICQoTElCX0dFTkVSQUxfSU5JVF9VQVJUKSAkKExJQl9QSFlfVUFSVCkgJChMSUJfRERSX1VBUlQpICQoVExJQlMpICQoTElCX1NXVVBfVUFSVCkKK0hEUl9DT01QT05FTlRTX0RFQlVHID0gJChMSUJfUExBVF9ERUJVRykgJChMSUJfR0VORVJBTF9JTklUKSAkKExJQl9QSFkpICQoTElCX0REUikgJChUTElCUykgJChMSUJfU1dVUCkKIAogI2hvdyB0byBhZGQgbmV3IGNvbXBvbmVudCB0byBiaW5hcnkgaGVhZGVyOgogI0VYQU1QTEVfQ09NUE9ORU5UPW5vCkBAIC0xMjUsNyArMTM3LDcgQEAKICQoaW5mbyApCiBlbmRpZgogCi1hbGw6ICAgc3ViZGlycyAkKFRHVCkuYmluICQoVEdUKV9zZWMuYmluICQoVEdUKS51YXJ0LmJpbiAgJChUR1QpLmRpcyAkKFRHVClfc2VjLmRpcyAkKFRHVCkudWFydC5kaXMgJChUR1QpLnNyZWMgJChUR1QpX3NlYy5zcmVjICQoVEdUKS51YXJ0LnNyZWMKK2FsbDogICBzdWJkaXJzICQoVEdUKS5iaW4gJChUR1QpX3NlYy5iaW4gJChUR1QpLnVhcnQuYmluICAkKFRHVCkuZGlzICQoVEdUKV9zZWMuZGlzICQoVEdUKS51YXJ0LmRpcyAkKFRHVCkuc3JlYyAkKFRHVClfc2VjLnNyZWMgJChUR1QpLnVhcnQuc3JlYyAkKFRHVCkuZGVidWcuYmluCiAKICUubzogJS5jCiAJJChDQykgJChDRkxBR1MpICQoQ1BQRkxBR1MpIC1jIC1vICRAICQ8CkBAIC0xMzMsNiArMTQ1LDkgQEAKICUudWFydC5vOiAlLmMKIAkkKENDKSAkKENGTEFHUykgLUROT1RfVVNFX1VBUlQgLURNVl9OT19JTlBVVCAtRE1WX05PX1BSSU5UICAkKENQUEZMQUdTKSAtYyAtbyAgJEAgJDwKIAorJS5kZWJ1Zy5vOiAlLmMKKwkkKENDKSAkKENGTEFHUykgLURNVl9ERUJVR19NT0RFICQoQ1BQRkxBR1MpIC1jIC1vICAkQCAkPAorCiAkKFRHVCkuYmluOiAkKFRHVCkuZWxmCiAJJChPQkpDT1BZKSAtUyAtTyBiaW5hcnkgJDwgJChhZGRzdWZmaXggLnRtcCwgJEApCiAJJChDQVQpICQoUEFSQU1TRklMRSkucmF3ICQoYWRkc3VmZml4IC50bXAsICRAKSA+ICRACkBAIC0xNDgsNiArMTYzLDExIEBACiAJJChDQVQpICQoUEFSQU1TRklMRSkucmF3ICQoYWRkc3VmZml4IC50bXAsICRAKSA+ICRACiAJJChSTSkgJChhZGRzdWZmaXggLnRtcCwgJEApCiAKKyQoVEdUKS5kZWJ1Zy5iaW46ICQoVEdUKS5kZWJ1Zy5lbGYKKwkkKE9CSkNPUFkpIC1TIC1PIGJpbmFyeSAkPCAkKGFkZHN1ZmZpeCAudG1wLCAkQCkKKwkkKENBVCkgJChQQVJBTVNGSUxFKS5yYXcgJChhZGRzdWZmaXggLnRtcCwgJEApID4gJEAKKwkkKFJNKSAkKGFkZHN1ZmZpeCAudG1wLCAkQCkKKwogJChUR1QpLnNyZWM6ICQoVEdUKS5lbGYKIAkkKE9CSkNPUFkpIC1PIHNyZWMgJDwgJEAKIApAQCAtMTc1LDYgKzE5NSw5IEBACiAkKFRHVCkudWFydC5lbGY6ICQoQU9CSikgJChDVUFSVF9PQkopIHN1YmRpcnMKIAkkKENDKSAkKExERkxBR1NCSU4pICQoQU9CSikgJChDVUFSVF9PQkopICQoSERSX0NPTVBPTkVOVFNfVUFSVCkgJChMSUJfUExBVF9VQVJUKSAkKExJQkdDQykgLW8gJEAKIAorJChUR1QpLmRlYnVnLmVsZjogJChBT0JKKSAkKENERUJVR19PQkopIHN1YmRpcnMKKwkkKENDKSAkKExERkxBR1NCSU4pICQoQU9CSikgJChDREVCVUdfT0JKKSAkKEhEUl9DT01QT05FTlRTX0RFQlVHKSAkKExJQl9QTEFUX0RFQlVHKSAkKExJQkdDQykgLW8gJEAKKwogJChMRFNDUklQVCk6ICQoU0VUUEFSQU1TKQogCS4vJChTRVRQQVJBTVMpIC1CICQoQk9BUkQpIC1QICQoUEFSQU1TRklMRSkudHh0IC1SICQoRFJBTVJFR1MpIC1kICQoREVCVUdfTU9ERV9GTEFHKSAkKFBBUkFNU0ZJTEUpLnJhdyAkQAogCkBAIC0xOTYsNyArMjE5LDcgQEAKIAlkb25lCiAKIGNsZWFuOgotCSQoUk0pICoucmF3ICouZWxmICouc3JlYyAqLmRpcyAqLmJpbiAqLmEgKi51YXJ0LmJpbiAqLnVhcnQuZWxmIC4vc3JjLyoubyAgJChMRFNDUklQVCkgJChMRFNFQ1NDUklQVCkgJChTRVRQQVJBTVMpCisJJChSTSkgKi5yYXcgKi5lbGYgKi5zcmVjICouZGlzICouYmluICouYSAqLnVhcnQuYmluICoudWFydC5lbGYgKi5kZWJ1Zy5iaW4gLi9zcmMvKi5vICAkKExEU0NSSVBUKSAkKExEU0VDU0NSSVBUKSAkKFNFVFBBUkFNUykKIAlAZm9yIGRpciBpbiAkKENPTVBPTkVOVF9TVUJESVJTKSA7IGRvIFwKIAkgICAgJChNQUtFKSBjbGVhbiAtcyAtQyAkJGRpciB8fCBleGl0IDEgOyBcCiAJZG9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2Jhc2UubWsgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvYmFzZS5tawppbmRleCAxZTVkYTYyLi42MDdiMjM2IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvYmFzZS5taworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvYmFzZS5tawpAQCAtODMsNiArODMsOSBAQAogaWZlcSAiJChDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMSkiICAieSIKICAgQ0ZMQUdTICs9IC1EQ09ORklHX0NVU1RPTUVSX0JPQVJEXzEKIGVuZGlmCitpZmVxICIkKENPTkZJR19DTEVBUkZPR19CT0FSRCkiICAieSIKKyAgQ0ZMQUdTICs9IC1EQ09ORklHX0NMRUFSRk9HX0JPQVJECitlbmRpZgogaWZlcSAiJChDT05GSUdfR0ZDSDEwMCkiICAieSIKICAgQ0ZMQUdTICs9IC1EQ09ORklHX0dGQ0gxMDAKIGVuZGlmCkBAIC0yMDYsNyArMjA5LDcgQEAKIAogQkhfUk9PVF9ESVIgID0gJChUT1BESVIpL3Rvb2xzL21hcnZlbGwvYmluX2hkcgogSU5DTFVERSAgICAgID0gLUkkKEJIX1JPT1RfRElSKS9zcmNfZGRyIC1JJChCSF9ST09UX0RJUikvc3JjX3BoeS8kKEJPQVJEKSAtSSQoQkhfUk9PVF9ESVIpL2luYy9jb21tb24gXAotCSAgICAgICAtSSQoQkhfUk9PVF9ESVIpL2luYy9kZHIzX3NvYy8kKElOQ05BTUUpICAtSSQoQkhfUk9PVF9ESVIpL2luYy9kZHIzX3NvYy8kKEJPQVJEKSAtSSQoQkhfUk9PVF9ESVIpL3BsYXRmb3JtL3N5c0Vudi8kKEJPQVJEKSAtSSQoVE9QRElSKS9pbmNsdWRlCisJICAgICAgIC1JJChCSF9ST09UX0RJUikvaW5jL2RkcjNfc29jLyQoSU5DTkFNRSkgIC1JJChCSF9ST09UX0RJUikvaW5jL2RkcjNfc29jLyQoQk9BUkQpIC1JJChCSF9ST09UX0RJUikvcGxhdGZvcm0vc3lzRW52LyQoQk9BUkQpIC1JJChUT1BESVIpL2luY2x1ZGUgLUkkKEJIX1JPT1RfRElSKS9zcmNfaW5pdC8kKEJPQVJEKQogSE9TVENGTEFHUyAgID0gLVdhbGwgJChJTkNMVURFKQogCiBpZmVxICgkKEJJTl9IRFJfREVCVUcpLDEpCkBAIC0yMjMsMTMgKzIyNiwxNSBAQAogZW5kaWYKIAogQ0ZMQUdTICAgKz0gLVdhbGwgJChJTkNMVURFKSAkKERFQlVHX0ZMQUdTKSAkKENQVU9QVFMpIC1tc29mdC1mbG9hdCAtbWFiaT1hYXBjcwotaWZlcSAoJChCT0FSRCksYTM4eCkKLUNGTEFHUyAgICs9IC1mZGF0YS1zZWN0aW9ucyAtZmZ1bmN0aW9uLXNlY3Rpb25zCi1FWFRSQV9MRF9GTEFHUyA9IC1XbCwtLWdjLXNlY3Rpb25zIC0tZW50cnk9X3N0YXJ0Ci1lbHNlCisKK2lmZXEgKCQoQk9BUkQpLG1zeXNfYmMyKQogQ0ZMQUdTICAgKz0gLWZQSUUgLWZuby16ZXJvLWluaXRpYWxpemVkLWluLWJzcyAtZm5vLXVud2luZC10YWJsZXMKK2Vsc2UKK0NGTEFHUyAgICs9IC1mZGF0YS1zZWN0aW9ucyAtZmZ1bmN0aW9uLXNlY3Rpb25zCiBlbmRpZgogCitFWFRSQV9MRF9GTEFHUyA9IC1XbCwtLWdjLXNlY3Rpb25zIC0tZW50cnk9X3N0YXJ0CisKIGlmZXEgKCQoRERSVFlQRSksZGRyNCkKIENGTEFHUyArPSAtRENPTkZJR19ERFI0CiBlbHNlCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9iaW5faGRyX3R3c2kuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2Jpbl9oZHJfdHdzaS5oCmluZGV4IGUwNGQ5OTMuLmU4M2U5M2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2Jpbl9oZHJfdHdzaS5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2Jpbl9oZHJfdHdzaS5oCkBAIC0xMTAsNyArMTEwLDEwIEBACiAvKgogKiogQmFzZSBhZGRyZXNzIGZvciBUV1NJIHJlZ2lzdGVycy4KICovCi0jZGVmaW5lIE1WX1RXU0lfU0xBVkVfUkVHU19CQVNFKHVuaXQpICAgICAgIChNVl9UV1NJX1NMQVZFX1JFR1NfT0ZGU0VUKHVuaXQpKQorI2RlZmluZSBNVl9UV1NJX1NMQVZFX1JFR1NfQkFTRSh1bml0KQkJKE1WX1RXU0lfU0xBVkVfUkVHU19PRkZTRVQodW5pdCkpCisjZGVmaW5lIFRXU0lfQ09ORklHX0RFQlVHX1JFRwkJCShNVl9UV1NJX1NMQVZFX1JFR1NfQkFTRSgwKSArIDB4OGMpCisjZGVmaW5lIFRXU0lfREVCVUdfU0xBVkVfUE9SVDBfRU4JCUJJVDE4CisjZGVmaW5lIFRXU0lfREVCVUdfU0xBVkVfUE9SVDFfRU4JCUJJVDE5CiAKIC8qCiAqKiBTcGVjaWZpYyBkZWZpbml0aW9uIGZvciBNYWluIENQVSBpbnRlcnJ1cHQgY2F1c2UgcmVnaXN0ZXIuCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9kZHIzX2h3c19od190cmFpbmluZ19kZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2RkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oCmluZGV4IDk4NDU1ZDcuLjA1MzEyOTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2RkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2RkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oCkBAIC00OSwxNiArNDksNiBAQAogI2RlZmluZSBNVl9NQVhfRERSM19TVEFUSUNfU0laRQkJCQkJNTAKICNkZWZpbmUgTVZfRERSM19NT0RFU19OVU1CRVIJCQkJCTMwCiAKLSNkZWZpbmUgUkVTVU1FX1JMX1BBVFRFUk5TX0FERFIgICAgICAgICAgICAgICAgCSgweEZFMDAwMCkKLSNkZWZpbmUgUkVTVU1FX1JMX1BBVFRFUk5TX1NJWkUgICAgICAgICAgICAgICAgICgweDEwMCkKLSNkZWZpbmUgUkVTVU1FX1RSQUlOSU5HX1ZBTFVFU19BRERSICAgICAgICAgICAgCShSRVNVTUVfUkxfUEFUVEVSTlNfQUREUiArIFJFU1VNRV9STF9QQVRURVJOU19TSVpFKQotI2RlZmluZSBSRVNVTUVfVFJBSU5JTkdfVkFMVUVTX01BWCAgICAgICAgICAgICAJKDB4Q0QwKQotI2RlZmluZSBCT09UX0lORk9fQUREUiAJCQkJCQkJKFJFU1VNRV9STF9QQVRURVJOU19BRERSICsgMHgxMDAwKQotI2RlZmluZSBDSEVDS1NVTV9SRVNVTFRfQUREUiAgICAgICAgICAgICAgICAgICAgKEJPT1RfSU5GT19BRERSICsgMHgxMDAwKQotI2RlZmluZSBOVU1fT0ZfUkVHSVNURVJfQUREUiAJCQkJCShDSEVDS1NVTV9SRVNVTFRfQUREUiArIDQpCi0jZGVmaW5lIFNVU1BFTkRfTUFHSUNfV09SRCAJCQkJCQkoMHhERUFEQjAwMikKLSNkZWZpbmUgUkVHSVNURVJfTElTVF9FTkQgCQkJCQkJKDB4RkZGRkZGRkYpCi0KIC8qIE1JU0MgKi8KICNkZWZpbmUgSU5URVJfUkVHU19CQVNFCQkJCQkJCTB4RDAwMDAwMDAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2RlYnVnLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmgKY29weSB0byB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9kZWJ1Zy5oCmluZGV4IGRhODJlMjQuLjYwNjkyMjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZGVidWcuaApAQCAtMSw0ICsxLDMgQEAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCiAKQEAgLTQzLDEyICs0MiwxMiBAQAogCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0JCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLQkJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotCQl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0JCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApAQCAtNjIsNzkgKzYxLDcgQEAKIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfTVZfRERSM19UT1BPTE9HWV9ERUZfSAotI2RlZmluZSBfTVZfRERSM19UT1BPTE9HWV9ERUZfSAogCisjZGVmaW5lIE1WX1VBUlRfWE1PREVNX0FDS19DSEFSIDB4NgogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKlRPUE9MT0dZKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBDT05GSUdfRERSMwotdHlwZWRlZiBlbnVtCi17Ci0gICBTUEVFRF9CSU5fRERSXzgwMEQsCi0gICBTUEVFRF9CSU5fRERSXzgwMEUsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZFLAotICAgU1BFRURfQklOX0REUl8xMDY2RiwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkcsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNGLAotICAgU1BFRURfQklOX0REUl8xMzMzRywKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0gsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNKLAotICAgU1BFRURfQklOX0REUl8xNjAwRywKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEgsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBKLAotICAgU1BFRURfQklOX0REUl8xNjAwSywKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkosCi0gICBTUEVFRF9CSU5fRERSXzE4NjZLLAotICAgU1BFRURfQklOX0REUl8xODY2TCwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2Nk0sCi0gICBTUEVFRF9CSU5fRERSXzIxMzNLLAotICAgU1BFRURfQklOX0REUl8yMTMzTCwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM00sCi0gICBTUEVFRF9CSU5fRERSXzIxMzNOLAotCi0gICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAotICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKLX1NVl9IV1NfU1BFRURfQklOOwotCi10eXBlZGVmIGVudW0gCi17Ci0gIEREUl9GUkVRX0xPV19GUkVRLAotICBERFJfRlJFUV80MDAsCi0gIEREUl9GUkVRXzUzMywKLSAgRERSX0ZSRVFfNjY3LAotICBERFJfRlJFUV84MDAsCi0gIEREUl9GUkVRXzkzMywKLSAgRERSX0ZSRVFfMTA2NiwKLSAgRERSX0ZSRVFfMzExLAotICBERFJfRlJFUV8zMzMsCi0gIEREUl9GUkVRXzQ2NywKLSAgRERSX0ZSRVFfODUwLAotICBERFJfRlJFUV82MDAsCi0gIEREUl9GUkVRXzMwMCwKLSAgRERSX0ZSRVFfOTAwLAotICBERFJfRlJFUV8zNjAsCi0gIEREUl9GUkVRXzEwMDAsCi0gICBERFJfRlJFUV9MSU1JVAotfU1WX0hXU19ERFJfRlJFUTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQ0QsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJBUywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFBELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJUUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190TU9ECi19c3BlZWRCaW5UYWJsZUVsZW1lbnRzOwotI2VuZGlmIC8qQ09ORklHX0REUjMgKi8KLSNlbmRpZiAvKiBfTVZfRERSM19UT1BPTE9HWV9ERUZfSCAqLwotCi0KK01WX1NUQVRVUyBtdkJpbkhlYWRlckRlYnVnUHJvbXB0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvZ3RPcy9ndEVudkRlcC5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9ndEVudkRlcC5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2d0T3MvZ3RFbnZEZXAuaApyZW5hbWUgdG8gdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9ndEVudkRlcC5oCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9ndE9zL2d0R2VuVHlwZXMuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2d0T3MvZ3RHZW5UeXBlcy5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2d0T3MvZ3RHZW5UeXBlcy5oCnJlbmFtZSB0byB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9ndE9zL2d0R2VuVHlwZXMuaApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvZ3RPcy9tdlhvci5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vZ3RPcy9tdlhvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9ndE9zL212WG9yLmgKcmVuYW1lIHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2d0T3MvbXZYb3IuaApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvZ3RPcy9tdlhvclJlZ3MuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2d0T3MvbXZYb3JSZWdzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2d0T3MvbXZYb3JSZWdzLmgKcmVuYW1lIHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL2d0T3MvbXZYb3JSZWdzLmgKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL212RGRyM1RvcG9sb2d5RGVmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9tdkRkcjNUb3BvbG9neURlZi5oCmluZGV4IDk1ODQ5MmYuLmRiZTYwNGEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL212RGRyM1RvcG9sb2d5RGVmLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9jb21tb24vbXZEZHIzVG9wb2xvZ3lEZWYuaApAQCAtMTUxLDYgKzE1MSw3IEBACiAgICAgRERSX0ZSRVFfOTMzLAogICAgIEREUl9GUkVRXzEwNjYsCiAJRERSX0ZSRVFfOTAwLAorCUREUl9GUkVRXzEwMDAsCiAgICAgRERSX0ZSRVFfTElNSVQKIH1NVl9IV1NfRERSX0ZSRVE7CiAKQEAgLTIxOCw3ICsyMTksNyBAQAogICAgLyogU3BlZWQgQmluIFRhYmxlKi8KICAgIE1WX0hXU19TUEVFRF9CSU4gICAgICBzcGVlZEJpbkluZGV4OwogCi0gICAvKiBidXMgd2lkdGggb2YgbWVtb3J5ICovCisgICAvKiBidXMgd2lkdGggb2YgbWVtb3J5IGRldmljZSovCiAgICBNVl9IV1NfQlVTX1dJRFRIICAgYnVzV2lkdGg7CiAKICAgIC8qIEJ1cyBtZW1vcnkgc2l6ZSAoTUJpdCkgKi8KQEAgLTI0OCwyMSArMjQ5LDI4IEBACiAgICAvKiBDb250cm9sbGVyIGNvbmZpZ3VyYXRpb24gcGVyIGludGVyZmFjZSAqLwogICAgSW50ZXJmYWNlUGFyYW1zICAgICAgaW50ZXJmYWNlUGFyYW1zW01BWF9JTlRFUkZBQ0VfTlVNXTsKIAotICAgLyogQlVTIHBlciBpbnRlcmZhY2UgKGRlZmF1bHQgaXMgNCkqLwotICAgTVZfVTggICAgICAgICAgICAgICBudW1PZkJ1c1BlckludGVyZmFjZTsKLQotICAgLyogQml0IG1hc2sgZm9yIGFjdGl2ZSBidXNlcyovCisgICAvKiBCaXQgbWFzayBmb3IgYWN0aXZlIGJ1c2VzIGRlZmluZWQgaW50ZXJmYWNlIHdpZHRoIGFuZCBFQ0MgY29uZmlndXJhdGlvbiovCiAgICBNVl9VOCAgICAgICAgICAgICAgIGFjdGl2ZUJ1c01hc2s7CiAKIH0gTVZfSFdTX1RPUE9MT0dZX01BUDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgIE1WX1UzMiAgICAgICAgICAgICAgY2tEZWxheTsKLSAgIE1WX1UzMiAgICAgICAgICAgICAgY2tEZWxheV8xNjsKLSAgIE1WX1UzMiAgICAgICAgICAgICAgUGZpbmdlcjsKLSAgIE1WX1UzMiAgICAgICAgICAgICAgTmZpbmdlcjsKLSAgIE1WX1UzMiAgICAgICAgICAgICAgUGh5UmVnM1ZhbDsKKwlNVl9VMzIJY2tEZWxheTsJLyp0aGUgZGVsYXkgYmV0d2VlbiBjbG9jayB0byBDL0EgZm9yIGJ5OCBkZXZpY2VzKi8KKwlNVl9VMzIJUGh5UmVnM1ZhbDsJLypJbml0aWFsIHZhbHVlIG9mIFJYIGNlbnRyYWxpemF0aW9uIHBoeSByZWcqLworCisJTVZfVTMyIGdacHJpRGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIFAgZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiBnWm5yaURhdGE7IAkvKkNvbnRyb2xsZXIgRGF0YSBOIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pwcmlDdHJsOyAJLypDb250cm9sbGVyIEMvQSBQIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pucmlDdHJsOyAJLypDb250cm9sbGVyIEMvQSBOIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pwb2R0RGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIFAgT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1pub2R0RGF0YTsgCS8qQ29udHJvbGxlciBEYXRhIE4gT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1pwb2R0Q3RybDsgCS8qQ29udHJvbGxlciBDL0EgUCBPRFQgYXQgdGhlIHJlY2VpdmUqLworCU1WX1UzMiBnWm5vZHRDdHJsOyAJLypDb250cm9sbGVyIEMvQSBOIE9EVCBhdCB0aGUgcmVjZWl2ZSovCisJTVZfVTMyIGdEaWM7IAkJLypNZW1vcnkgZHJpdmUgc3RyZW5ndGgqLworCU1WX1UzMiB1aU9EVENvbmZpZzsgLypPRFQgUGluIENvbmZpZ3VyYXRpb24qLworCU1WX1UzMiBnUnR0Tm9tOyAJLypNZW1vcnkgT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1J0dFdSOyAJCS8qTWVtb3J5IE9EVCBhdCB0aGUgcmVjZWl2ZSBkdXJpbmcgd3JpdGUqLwogfSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNUzsKIAogI2VuZGlmIC8qIF9ERFIzX1RPUE9MT0dZX0NPTkZJR19IICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9tdkRkclRvcG9sb2d5RGVmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2NvbW1vbi9tdkRkclRvcG9sb2d5RGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlNDRiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvY29tbW9uL212RGRyVG9wb2xvZ3lEZWYuaApAQCAtMCwwICsxLDI3NiBAQAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKKworVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbAorSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCithbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuICBPbmNlIHlvdSBoYXZlIG1hZGUgYW4gZWxlY3Rpb24gdG8gZGlzdHJpYnV0ZSB0aGUKK0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKK2ludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCitsaWNlbnNlIGFsdGVybmF0aXZlcyB0aGF0IHlvdSBoYXZlIG5vdCBlbGVjdGVkIHRvIHVzZSBhbmQgKGlpaSkgcHJlc2VydmUgdGhlCitNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwgYW5kIHlvdSBoYXZlIGVudGVyZWQgaW50byBhIGNvbW1lcmNpYWwKK2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCit0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKK21vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTEgKHRoZSAiR1BMIExpY2Vuc2UiKSwgYSBjb3B5IG9mIHdoaWNoIGlzCithdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCitvbiB0aGUgd29ybGR3aWRlIHdlYiBhdCBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KKworVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIEVYUFJFU1NMWQorRElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQorZGlzY2xhaW1lci4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCittb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLgorUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisJICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgICAqICAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKwkJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCQlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisJCXVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKwkJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CitMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KK0FOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9ERFIzX1RPUE9MT0dZX0NPTkZJR19ICisjZGVmaW5lIF9ERFIzX1RPUE9MT0dZX0NPTkZJR19ICisKKyNkZWZpbmUgICAgICBBRERSX1NJWkVfNTEyTWIgICAgMHgwNDAwMDAwMCAKKyNkZWZpbmUgICAgICBBRERSX1NJWkVfMUdiICAgICAgMHgwODAwMDAwMAorI2RlZmluZSAgICAgIEFERFJfU0laRV8yR2IgICAgICAweDEwMDAwMDAwCisjZGVmaW5lICAgICAgQUREUl9TSVpFXzRHYiAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgICAgICBBRERSX1NJWkVfOEdiICAgICAgMHg0MDAwMDAwMAorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqVE9QT0xPR1kqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIENPTkZJR19ERFIzCisKK3R5cGVkZWYgZW51bQoreworICAgU1BFRURfQklOX0REUl84MDBELAorICAgU1BFRURfQklOX0REUl84MDBFLAorICAgU1BFRURfQklOX0REUl8xMDY2RSwKKyAgIFNQRUVEX0JJTl9ERFJfMTA2NkYsCisgICBTUEVFRF9CSU5fRERSXzEwNjZHLAorICAgU1BFRURfQklOX0REUl8xMzMzRiwKKyAgIFNQRUVEX0JJTl9ERFJfMTMzM0csCisgICBTUEVFRF9CSU5fRERSXzEzMzNILAorICAgU1BFRURfQklOX0REUl8xMzMzSiwKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEcsCisgICBTUEVFRF9CSU5fRERSXzE2MDBILAorICAgU1BFRURfQklOX0REUl8xNjAwSiwKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEssCisgICBTUEVFRF9CSU5fRERSXzE4NjZKLAorICAgU1BFRURfQklOX0REUl8xODY2SywKKyAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCisgICBTUEVFRF9CSU5fRERSXzE4NjZNLAorICAgU1BFRURfQklOX0REUl8yMTMzSywKKyAgIFNQRUVEX0JJTl9ERFJfMjEzM0wsCisgICBTUEVFRF9CSU5fRERSXzIxMzNNLAorICAgU1BFRURfQklOX0REUl8yMTMzTiwKKworICAgU1BFRURfQklOX0REUl8xMzMzSF9FWFQsCisgICBTUEVFRF9CSU5fRERSXzE2MDBLX0VYVCwKKyAgIFNQRUVEX0JJTl9ERFJfMTg2Nk1fRVhUCit9TVZfSFdTX1NQRUVEX0JJTjsKKwordHlwZWRlZiBlbnVtIAoreworICBERFJfRlJFUV9MT1dfRlJFUSwKKyAgRERSX0ZSRVFfNDAwLAorICBERFJfRlJFUV81MzMsCisgIEREUl9GUkVRXzY2NywKKyAgRERSX0ZSRVFfODAwLAorICBERFJfRlJFUV85MzMsCisgIEREUl9GUkVRXzEwNjYsCisgIEREUl9GUkVRXzMxMSwKKyAgRERSX0ZSRVFfMzMzLAorICBERFJfRlJFUV80NjcsCisgIEREUl9GUkVRXzg1MCwKKyAgRERSX0ZSRVFfNjAwLAorICBERFJfRlJFUV8zMDAsCisgIEREUl9GUkVRXzkwMCwKKyAgRERSX0ZSRVFfMzYwLAorICBERFJfRlJFUV8xMDAwLAorICAgRERSX0ZSRVFfTElNSVQKK31NVl9IV1NfRERSX0ZSRVE7CisKKyNlbHNlCit0eXBlZGVmIGVudW0KK3sKKyAgICBTUEVFRF9CSU5fRERSXzE2MDBKLAorICAgIFNQRUVEX0JJTl9ERFJfMTYwMEssCisgICAgU1BFRURfQklOX0REUl8xNjAwTCwKKyAgICBTUEVFRF9CSU5fRERSXzE4NjZMLAorICAgIFNQRUVEX0JJTl9ERFJfMTg2Nk0sCisgICAgU1BFRURfQklOX0REUl8xODY2TiwKKyAgICBTUEVFRF9CSU5fRERSXzIxMzNOLAorICAgIFNQRUVEX0JJTl9ERFJfMjEzM1AsCisgICAgU1BFRURfQklOX0REUl8yMTMzUiwKKyAgICBTUEVFRF9CSU5fRERSXzI0MDBQLAorICAgIFNQRUVEX0JJTl9ERFJfMjQwMFIsCisgICAgU1BFRURfQklOX0REUl8yNDAwVSwKK31NVl9IV1NfU1BFRURfQklOOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBERFJfRlJFUV9MT1dfRlJFUSwKKyAgICBERFJfRlJFUV82NjcsCisgICAgRERSX0ZSRVFfODAwLAorICAgIEREUl9GUkVRXzkzMywKKyAgICBERFJfRlJFUV8xMDY2LAorCUREUl9GUkVRXzkwMCwKKyAgICBERFJfRlJFUV9MSU1JVAorfU1WX0hXU19ERFJfRlJFUTsKKworI2VuZGlmCisKK3R5cGVkZWYgZW51bQoreworICAgRERSX0JPQVJEX0VUUCwKKyAgIEREUl9CT0FSRF9GVU5DVElPTkFMLAorICAgRERSX0JPQVJEX0NVU1RPTUVSLAorICAgRERSX0JPQVJEX01BWAorCit9IE1WX0hXU19ERFJfQk9BUkQ7CisKKy8qIGJ1cyB3aWR0aCBpbiBiaXRzICovCit0eXBlZGVmIGVudW0gCit7CisgICBCVVNfV0lEVEhfNCwKKyAgIEJVU19XSURUSF84LAorICAgQlVTX1dJRFRIXzE2LAorICAgQlVTX1dJRFRIXzMyCisKK30gTVZfSFdTX0JVU19XSURUSDsKKwordHlwZWRlZiBlbnVtIAoreworICAgTUVNXzUxMk0sCisgICBNRU1fMUcsCisgICBNRU1fMkcsCisgICBNRU1fNEcsCisgICBNRU1fOEcsCisKKyAgIE1FTV9TSVpFX0xBU1QKK31NVl9IV1NfTUVNX1NJWkU7CisKK3R5cGVkZWYgZW51bQoreworICAgTVZfSFdTX1RFTVBfTE9XLAorICAgTVZfSFdTX1RFTVBfTk9STUFMLAorICAgTVZfSFdTX1RFTVBfSElHSAorCit9TVZfSFdTX1RFTVBFUlRVUkU7CisKK3R5cGVkZWYgc3RydWN0IAoreworICAgLyogQ2hpcCBTZWxlY3QgKENTKSBiaXRtYXNrIChiaXRzIDAtQ1MwLCBiaXQgMS0gQ1MxIC4uLikgKi8KKyAgIE1WX1U4ICAgICAgY3NCaXRtYXNrOworCisgICAvKiBtaXJyb3IgZW5hYmxlL2Rpc2FibGUgKGJpdHMgMC1DUzAgbWlycm9yaW5nLCBiaXQgMS0gQ1MxIG1pcnJvcmluZyAuLi4pKi8KKyAgIE1WX0JPT0wgICAgICBtaXJyb3JFbmFibGVCaXRtYXNrOworCisgICAvKiBEUVMgU3dhcCAocG9sYXJpdHkpIC0gdHJ1ZSBpZiBlbmFibGUqLworICAgTVZfQk9PTCAgICAgIGlzRHFzU3dhcDsKKworICAgLyogQ0sgc3dhcCAocG9sYXJpdHkpIC0gdHJ1ZSBpZiBlbmFibGUqLworICAgTVZfQk9PTCAgICAgIGlzQ2tTd2FwOworCit9IEJ1c1BhcmFtczsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIC8qIGJ1cyBjb25maWd1cmF0aW9uICovCisgICBCdXNQYXJhbXMgICBhc0J1c1BhcmFtc1tNQVhfQlVTX05VTV07CisKKyAgIC8qIFNwZWVkIEJpbiBUYWJsZSovCisgICBNVl9IV1NfU1BFRURfQklOICAgICAgc3BlZWRCaW5JbmRleDsKKworICAgLyogYnVzIHdpZHRoIG9mIG1lbW9yeSBkZXZpY2UqLworICAgTVZfSFdTX0JVU19XSURUSCAgIGJ1c1dpZHRoOworCisgICAvKiBCdXMgbWVtb3J5IHNpemUgKE1CaXQpICovCisgICBNVl9IV1NfTUVNX1NJWkUgICAgICBtZW1vcnlTaXplOworCisgICAvKiBUaGUgRERSIGZyZXF1ZW5jeSBmb3IgZWFjaCBpbnRlcmZhY2VzICovCisgICBNVl9IV1NfRERSX0ZSRVEgICAgICBtZW1vcnlGcmVxOworCisgICAvKiBkZWxheSBDQVMgV3JpdGUgTGF0ZW5jeSAtIDAgZm9yIHVzaW5nIGRlZmF1bHQgdmFsdWUgKGplZGVjIHN1Z2dlc3RlZCkgKi8KKyAgIE1WX1U4ICAgICAgY2FzV0w7CisKKyAgIC8qIGRlbGF5IENBUyBMYXRlbmN5IC0gMCBmb3IgdXNpbmcgZGVmYXVsdCB2YWx1ZSAoamVkZWMgc3VnZ2VzdGVkKSAqLworICAgTVZfVTggICAgICBjYXNMOworCisgICAvKiBvcGVyYXRpb24gdGVtcGVyYXR1cmUgKi8KKyAgIE1WX0hXU19URU1QRVJUVVJFICAgaW50ZXJmYWNlVGVtcDsKKworfSBJbnRlcmZhY2VQYXJhbXM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAvKiBOdW1iZXIgb2YgaW50ZXJmYWNlcyAoZGVmYXVsdCBpcyAxMikqLworICAgIE1WX1U4ICAgICAgICAgICAgICBpbnRlcmZhY2VBY3RpdmVNYXNrOworCisgICAvKiBDb250cm9sbGVyIGNvbmZpZ3VyYXRpb24gcGVyIGludGVyZmFjZSAqLworICAgSW50ZXJmYWNlUGFyYW1zICAgICAgaW50ZXJmYWNlUGFyYW1zW01BWF9JTlRFUkZBQ0VfTlVNXTsKKworICAgLyogQml0IG1hc2sgZm9yIGFjdGl2ZSBidXNlcyBkZWZpbmVkIGludGVyZmFjZSB3aWR0aCBhbmQgRUNDIGNvbmZpZ3VyYXRpb24qLworICAgTVZfVTggICAgICAgICAgICAgICBhY3RpdmVCdXNNYXNrOworCit9IE1WX0hXU19UT1BPTE9HWV9NQVA7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJTVZfVTMyCWNrRGVsYXk7CS8qdGhlIGRlbGF5IGJldHdlZW4gY2xvY2sgdG8gQy9BIGZvciBieTggZGV2aWNlcyovCisJTVZfVTMyCVBoeVJlZzNWYWw7CS8qSW5pdGlhbCB2YWx1ZSBvZiBSWCBjZW50cmFsaXphdGlvbiBwaHkgcmVnKi8KKworCU1WX1UzMiBnWnByaURhdGE7IAkvKkNvbnRyb2xsZXIgRGF0YSBQIGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgZ1pucmlEYXRhOyAJLypDb250cm9sbGVyIERhdGEgTiBkcml2ZSBzdHJlbmd0aCovCisJTVZfVTMyIGdacHJpQ3RybDsgCS8qQ29udHJvbGxlciBDL0EgUCBkcml2ZSBzdHJlbmd0aCovCisJTVZfVTMyIGdabnJpQ3RybDsgCS8qQ29udHJvbGxlciBDL0EgTiBkcml2ZSBzdHJlbmd0aCovCisJTVZfVTMyIGdacG9kdERhdGE7IAkvKkNvbnRyb2xsZXIgRGF0YSBQIE9EVCBhdCB0aGUgcmVjZWl2ZSovCisJTVZfVTMyIGdabm9kdERhdGE7IAkvKkNvbnRyb2xsZXIgRGF0YSBOIE9EVCBhdCB0aGUgcmVjZWl2ZSovCisJTVZfVTMyIGdacG9kdEN0cmw7IAkvKkNvbnRyb2xsZXIgQy9BIFAgT0RUIGF0IHRoZSByZWNlaXZlKi8KKwlNVl9VMzIgZ1pub2R0Q3RybDsgCS8qQ29udHJvbGxlciBDL0EgTiBPRFQgYXQgdGhlIHJlY2VpdmUqLworCU1WX1UzMiBnRGljOyAJCS8qTWVtb3J5IGRyaXZlIHN0cmVuZ3RoKi8KKwlNVl9VMzIgdWlPRFRDb25maWc7IC8qT0RUIFBpbiBDb25maWd1cmF0aW9uKi8KKwlNVl9VMzIgZ1J0dE5vbTsgCS8qTWVtb3J5IE9EVCBhdCB0aGUgcmVjZWl2ZSovCisJTVZfVTMyIGdSdHRXUjsgCQkvKk1lbW9yeSBPRFQgYXQgdGhlIHJlY2VpdmUgZHVyaW5nIHdyaXRlKi8KK30gTVZfVFVORV9UUkFJTklOR19QQVJBTVM7CisKKyNlbmRpZiAvKiBfRERSM19UT1BPTE9HWV9DT05GSUdfSCAqLworCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHguaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHguaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDI2NjMwY2IuLjkwNGEyZGUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eC5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHguaApAQCAtNzEsMjUgKzcxLDU2IEBACiAjaW5jbHVkZSAiZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgiCiAKIC8qQWxsb3cgdG9wb2xneSB1cGRhdGUgZnJvbSBib2FyZCBUV1NJIGRldmljZSovCi0jaWYgIWRlZmluZWQoQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQpCisjaWYgKCAoIWRlZmluZWQoQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQpKSAmJiBkZWZpbmVkKENPTkZJR19ERFIzKSApCisvKlRCRCAtIEN1cnJlbnRyeSAxNkJpdCBtb2RlIG5vdCBzdXBwb3J0ZWQgaW4gRERSNCwgb3BlbiB0aGlzIGRlZmluZSBhZnRlciAxNkJpdCBtb2RlIHZhbGlkYXRpb24qLwogI2RlZmluZSBNVl9ERFJfVE9QT0xPR1lfVVBEQVRFX0ZST01fVFdTSQogI2VuZGlmCiAKKyNkZWZpbmUgQ09ORklHX0FWU19GUk9NX0VGVVNFIC8qIFJlYWQgcHJlLWJ1cm50IEVGVVNFIHZhbHVlcywgdG8gZGVyaXZlIHJlcXVlc3RlZCBBVlMgdmFsdWUgZm9yIGN1cnJlbnQgY2hpcCAqLwogI2RlZmluZSBFQ0NfU1VQUE9SVAogCiAvKkNvbnRyb2xlciBidXMgZGl2aWRlciAxIGZvciAzMiBiaXQsIDIgZm9yIDY0IGJpdCovCiAjZGVmaW5lIE1WX0REUl9DT05UUk9MTEVSX0JVU19XSURUSF9NVUxUSVBMSUVSCQkxCiAKIC8qVHVuZSBpbnRlcm5hbCB0cmFpbmluZyBwYXJhbXMgdmFsdWVzKi8KLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVkgCQkxNjAKLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVlfMTYJCTE2MAotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QRklOR0VSCQkJNDEKLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTkZJTkdFUgkJCTQzCi0jZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BIWVJFRzNWQUwJCTB4QQorI2lmZGVmIENPTkZJR19DTEVBUkZPR19CT0FSRAorCS8qIFNvbGlkUnVuIEFybWFkYSAzOHggTWljcm9TT00gaGFzIHNob3J0IHRyYWNlcyBvbiBpdCdzIEREUiBjbG9jay4KKwkgICB1c2luZyBpbmNyZWFzZWQgaW50ZXJuYWwgZGVsYXkgaW5zaWRlIHRoZSBTb0MgdG8gY29tcGVuc2F0ZSBmb3IgdGhhdCAqLworCSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVkgCTI2MAorI2Vsc2UKKwkjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX0NLX0RFTEFZIAkxNjAKKyNlbmRpZgorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QSFlSRUczVkFMCTB4QQorCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BSSV9EQVRBCTEyMworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OUklfREFUQQkxMjMKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUFJJX0NUUkwJNzQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTlJJX0NUUkwJNzQKKworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9EQVRBCTQ1CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0RBVEEJNDUKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUF9PRFRfQ1RSTAk0NQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OX09EVF9DVFJMCTQ1CisKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfRElDCQkJCTB4MgorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHXzJDUwkweDEyMDAxMgorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHXzFDUwkweDEwMDAwCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9OT00JCQkweDQ0CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUl8xQ1MJCTB4MAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1JfMkNTCQkweDAKKworI2lmZGVmIENPTkZJR19ERFI0CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0RBVEFfRERSNAkweEQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfRElDX0REUjQJCTB4MAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHX0REUjQJMHgzMzAwMTIKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX05PTV9ERFI0CTB4NjAwIC8qUlpRLzMgPSAweDYwMCovCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUgkJCTB4NDAwIC8qUlpRLzEgPSAweDQwMCovCisjZWxzZQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1IJCTB4MCAvKm9mZiovCisjZW5kaWYKIAogI2RlZmluZSBNQVJWRUxMX0JPQVJEIE1BUlZFTExfQk9BUkRfSURfQkFTRQogCi0KICNkZWZpbmUgUkVHX0RFVklDRV9TQVIxX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweEU0MjA0CiAjZGVmaW5lIFJTVDJfQ1BVX0REUl9DTE9DS19TRUxFQ1RfSU5fT0ZGU0VUICAgICAgICAgMTcKICNkZWZpbmUgUlNUMl9DUFVfRERSX0NMT0NLX1NFTEVDVF9JTl9NQVNLICAgICAgICAgICAweDFGCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyM19hMzh4X3RvcG9sb2d5LmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyM19hMzh4X3RvcG9sb2d5LmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA0NmVkMTE5Li4zYWM1NTgwCi0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdG9wb2xvZ3kuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyM19hMzh4X3RvcG9sb2d5LmgKQEAgLTY4LDE1ICs2OCw0MSBAQAogI2luY2x1ZGUgIm12RGRyM0xvZ2dpbmdEZWYuaCIKIAogLypCdXMgbWFzayB2YXJpYW50cyovCi0jZGVmaW5lIEJVU19NQVNLXzMyQklUCQkJCTB4RgotI2RlZmluZSBCVVNfTUFTS18zMkJJVF9FQ0MJCQkweDFGCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUCQkJCTB4MwotI2RlZmluZSBCVVNfTUFTS18xNkJJVF9FQ0MJCQkweDEzCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUX0VDQ19QVVAzCQkweEIKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUCQkJCTB4RgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVRfRUNDCQkJMHgxRgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQJCQkJMHgzCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVF9FQ0MJCQkweDEzCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVF9FQ0NfUFVQMwkJMHhCCiAKICNkZWZpbmUgIERZTkFNSUNfQ1NfU0laRV9DT05GSUcKICNkZWZpbmUgIERJU0FCTEVfTDJfRklMVEVSSU5HX0RVUklOR19ERFJfVFJBSU5JTkcKIAorI2lmZGVmIENPTkZJR19ERFIzCisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0NVU1RfQk9BUkRfMQlTUEVFRF9CSU5fRERSXzE4NjZMCisJI2RlZmluZSBCVVNfV0lEVEhfQ1VTVF9CT0FSRF8xCQlCVVNfV0lEVEhfOAorCSNkZWZpbmUgU1BFRURfQklOX0REUl9DVVNUX0JPQVJEXzIJU1BFRURfQklOX0REUl8xODY2TAorCSNkZWZpbmUgQlVTX1dJRFRIX0NVU1RfQk9BUkRfMgkJQlVTX1dJRFRIXzgKKwkjZGVmaW5lIFNQRUVEX0JJTl9ERFJfQ0xFQVJGT0dfQk9BUkQJU1BFRURfQklOX0REUl8xNjAwSworCSNkZWZpbmUgQlVTX1dJRFRIX0NMRUFSRk9HX0JPQVJECUJVU19XSURUSF8xNgorCisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0RCXzY4WFgJCVNQRUVEX0JJTl9ERFJfMTg2NkwKKwkjZGVmaW5lIEJVU19XSURUSF9EQl82OFhYCQkJQlVTX1dJRFRIXzgKKwkjZGVmaW5lIFNQRUVEX0JJTl9ERFJfREJfQlBfNjgyMQlTUEVFRF9CSU5fRERSXzE4NjZMCisJI2RlZmluZSBCVVNfV0lEVEhfREJfQlBfNjgyMQkJQlVTX1dJRFRIXzgKKyNlbHNlCisvKkVscGlkYSBieSAxNiBpcyAyNDAwUiBNaWNyb24gYnkgOCBpcyAyMTMzUCBTYW1zdW5nIGJ5IDE2IGlzIDIxMzNQIEh5bnV4IGJ5MTYgaXMgMjEzM1AqLworCSNkZWZpbmUgU1BFRURfQklOX0REUl9DVVNUX0JPQVJEXzEJU1BFRURfQklOX0REUl8yNDAwUgorCSNkZWZpbmUgQlVTX1dJRFRIX0NVU1RfQk9BUkRfMQkJQlVTX1dJRFRIXzE2CisJI2RlZmluZSBTUEVFRF9CSU5fRERSX0NVU1RfQk9BUkRfMglTUEVFRF9CSU5fRERSXzI0MDBSCisJI2RlZmluZSBCVVNfV0lEVEhfQ1VTVF9CT0FSRF8yCQlCVVNfV0lEVEhfMTYKKworCSNkZWZpbmUgU1BFRURfQklOX0REUl9EQl82OFhYCQlTUEVFRF9CSU5fRERSXzI0MDBSCisJI2RlZmluZSBCVVNfV0lEVEhfREJfNjhYWAkJCUJVU19XSURUSF8xNgorCSNkZWZpbmUgU1BFRURfQklOX0REUl9EQl9CUF82ODIxCVNQRUVEX0JJTl9ERFJfMjQwMFIKKwkjZGVmaW5lIEJVU19XSURUSF9EQl9CUF82ODIxCQlCVVNfV0lEVEhfMTYKKyNlbmRpZgorCisKICNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3VzdG9tZXIgQm9hcmRzIFRvcG9sb2d5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9IV1NfVE9QT0xPR1lfTUFQIFRvcG9sb2d5TWFwW10gPQpAQCAtODQsMjYgKzExMCwzMCBAQAogICAgIC8qIDFzdCBDdXN0b21lciBib2FyZCAtIHJlZmVyZW5jZSBmcm9tIERCICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl9DVVNUX0JPQVJEXzEsIEJVU19XSURUSF9DVVNUX0JPQVJEXzEgLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCi0gICAgLyogMm5kIEN1c3RvbWVyIGJvYXJkICovCisgICAgLyogMm5kIEN1c3RvbWVyIGJvYXJkICAtIEdQIEJvYXJkKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0Je3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKwl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSX0NVU1RfQk9BUkRfMiwgQlVTX1dJRFRIX0NVU1RfQk9BUkRfMiAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgfSwKKyAgICAvKiAzcmQgQ3VzdG9tZXIgYm9hcmQgIC0gIFNvbGlkUnVuIENsZWFyRm9nLUExIFJFVjIuMCAqLworICAgIHsKKyAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl9DTEVBUkZPR19CT0FSRCwgQlVTX1dJRFRIX0NMRUFSRk9HX0JPQVJEICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogICAgIC8qIEdGQ0gxMDAgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xNjAwSywgQlVTX1dJRFRIXzggLCBNRU1fMkcsIEREUl9GUkVRXzQwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVRfRUNDICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUX0VDQyAgLyogQnVzZXMgbWFzayAqLwogICAgIH0KIH07CiAKQEAgLTExMiw3MiArMTQyLDU0IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNYXJ2ZWxsIEJvYXJkcyBUb3BvbG9neSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfSFdTX1RPUE9MT0dZX01BUCBUb3BvbG9neU1hcFtdID0KIHsKLSAgICAvKiAxc3QgTWFydmVsbCBib2FyZCAtIFJEX05BUyAqLworICAgIC8qIE1hcnZlbGwgYm9hcmQgLSBCb2FyZF9JRCA9IFJEX05BU182OFhYX0lEID0gMCovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKLSNpZmRlZiBDT05GSUdfRERSMwotICAgIC8qIDJuZCBNYXJ2ZWxsIGJvYXJkIC0gREIgKEREUjMpICovCisgICAgLyogTWFydmVsbCBib2FyZCAtIEJvYXJkX0lEID0gREJfNjhYWF9JRCA9IDEgKEREUjMvNCkqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLQl7e3t7MHgzLDIsMCwwfSwgezB4MywyLDAsMH0sIHsweDMsMiwwLDB9LCB7MHgzLDIsMCwwfSwgezB4MywyLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworCXt7e3sweDMsMiwwLDB9LCB7MHgzLDIsMCwwfSwgezB4MywyLDAsMH0sIHsweDMsMiwwLDB9LCB7MHgzLDIsMCwwfX0sIFNQRUVEX0JJTl9ERFJfREJfNjhYWCwgQlVTX1dJRFRIX0RCXzY4WFggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCi0jZWxzZQotICAgIC8qIDJuZCBNYXJ2ZWxsIGJvYXJkIC0gREIgKEREUjQpICovCisgICAgLyogTWFydmVsbCBib2FyZCAtIEJvYXJkX0lEID0gUkRfQVBfNjhYWF9JRCA9IDIgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0gICAge3t7ezB4MSwwLDAsMH0seyAweDEsMCwwLDB9LHsgMHgxLDAsMCwwfSx7IDB4MSwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM1AsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCi0gICAgfSwKLSNlbmRpZgotICAgIC8qIDNyZCBNYXJ2ZWxsIGJvYXJkIC0gUkRfQVAgKi8KLSAgICB7Ci0gICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAotICAgIC8qIDRyZCBNYXJ2ZWxsIGJvYXJkIC0gREJfQVAgKi8KKyAgICAvKiBNYXJ2ZWxsIGJvYXJkIC0gQm9hcmRfSUQgPSBEQl9BUF82OFhYX0lEID0gMyAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCi0gICAgLyogNXRoIE1hcnZlbGwgYm9hcmQgLSBEQl9HUCAqLworICAgIC8qIE1hcnZlbGwgYm9hcmQgLSBCb2FyZF9JRCA9IERCX0dQXzY4WFhfSUQgPSA0ICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKLSAgICAvKiA2dGggTWFydmVsbCBib2FyZCAtIEEzODEvMiBEQi1CUCAqLworICAgIC8qIE1hcnZlbGwgYm9hcmQgLSBCb2FyZF9JRCA9IERCX0JQXzY4MjFfSUQgPSA1IChERFIzLzQpICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotCXt7e3sweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfODAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworCXt7e3sweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH0sIHsweDEsMHgxLDAsMH19LCBTUEVFRF9CSU5fRERSX0RCX0JQXzY4MjEsIEJVU19XSURUSF9EQl9CUF82ODIxLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAorICAgIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCi0JLyogNnRoIE1hcnZlbGwgYm9hcmQgLSBEQl9BTUMgKi8KKwkvKiBNYXJ2ZWxsIGJvYXJkIC0gQm9hcmRfSUQgPSBEQl9BTUNfNjgyMF9JRCA9IDYgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0JQlVTX01BU0tfMzJCSVRfRUNDICAvKiBCdXNlcyBtYXNrICovCisJSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKIH07CiAjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdmFycy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2RkcjNfYTM4eF92YXJzLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAyMWYwZjI2Li43YjUxMTM1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdmFycy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHIzX2EzOHhfdmFycy5oCkBAIC02Niw3ICs2NiwxMCBAQAogI2RlZmluZSBfSU5DX0EzOFhfVkFSU19ICiAKICNpbmNsdWRlICJkZHIzX2EzOHhfbWNfc3RhdGljLmgiCi0jaW5jbHVkZSAibXZEZHIzVG9wb2xvZ3lEZWYuaCIKKyNpbmNsdWRlICJtdkRkclRvcG9sb2d5RGVmLmgiCisKKy8qIHRvIHJ1biBERFIgdmlld2VyIHRvb2wgKGluY2x1ZGluZyBCSVNUKSB1bmNvbW1lbnQgdGhlIGRlZmluZQorI2RlZmluZSBNVl9SVU5fV0lOX1ZBTElEQVRJT05fVEVTVCAqLwogCiB0eXBlZGVmIHN0cnVjdCBfX212RHJhbU1vZGVzIHsKICAgICBjaGFyICptb2RlX25hbWU7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyX2EzOHhfZGxiX2NvbmZpZy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzh4L2Rkcl9hMzh4X2RsYl9jb25maWcuaAppbmRleCA0NGEzYzZkLi5iMDMxODBmIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOHgvZGRyX2EzOHhfZGxiX2NvbmZpZy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM4eC9kZHJfYTM4eF9kbGJfY29uZmlnLmgKQEAgLTY1LDYyICs2NSw0MyBAQAogI2RlZmluZSBfSU5DX0EzOFhfRExCX0NPTkZJR19ICiAKICNpbmNsdWRlICJkZHIzX2h3c19od190cmFpbmluZ19kZWYuaCIKKwogI2lmZGVmIENPTkZJR19ERFI0Ci0vKiBmb3IgYTM5eCBaIGFuZCBBMzh4IEEwICovCi1NVl9EUkFNX0RMQl9DT05GSUcgZGRyM0RsYkNvbmZpZ1RhYmxlX0EwW10gPQorTVZfRFJBTV9ETEJfQ09ORklHIGRkcjNEbGJDb25maWdUYWJsZVtdID0KIHsKLSAgICAgIHtSRUdfU1RBVElDX0RSQU1fRExCX0NPTlRST0wsIAkgCTB4MjAwMDAwNUZ9LAotICAgICAge0RMQl9CVVNfT1BUSU1JWkFUSU9OX1dFSUdIVFNfUkVHLCAJMHgwMDg4MDAwMH0sCi0JICB7RExCX0FHSU5HX1JFR0lTVEVSLCAJCQkJCTB4M0Y3RjAwN0Z9LAotCSAge0RMQl9FVklDVElPTl9DT05UUk9MX1JFRywgCQkJMHgwMDAwMTI5Rn0sCi0gICAgICB7RExCX0VWSUNUSU9OX1RJTUVSU19SRUdJU1RFUl9SRUcsIAkweDAwRkYwMDAwfSwKLSAgICAgIHtETEJfQlVTX1dFSUdIVFNfRElGRl9DUywgCQkJMHgwNDAzMDgwM30sCi0gICAgICB7RExCX0JVU19XRUlHSFRTX0RJRkZfQkcsCQkJCTB4MDAwMDBBMDJ9LAotICAgICAge0RMQl9CVVNfV0VJR0hUU19TQU1FX0JHLCAJCQkweDA4MDAwOTAxfSwKLSAgICAgIHtETEJfQlVTX1dFSUdIVFNfUkRfV1IsICAJCQkJMHgwMDAyMDAwNX0sCi0gICAgICB7RExCX0JVU19XRUlHSFRTX0FUVFJfU1lTX1BSSU8sIAkJMHgwMDA2MEYxMH0sCi0gICAgICB7RExCX01BSU5fUVVFVUVfTUFQLAkJCQkJMHgwMDAwMDU0M30sCi0gICAgICB7RExCX0xJTkVfU1BMSVQsIAkJCQkJCTB4MDAwMDAwMEZ9LAotICAgICAge0RMQl9VU0VSX0NPTU1BTkRfUkVHLCAgCQkJCTB4MDAwMDAwMDB9LAotICAgICAgezB4MCwgMHgwfQorCXtSRUdfU1RBVElDX0RSQU1fRExCX0NPTlRST0wsIAkgCTB4MjAwMDAwNUZ9LAorCXtETEJfQlVTX09QVElNSVpBVElPTl9XRUlHSFRTX1JFRywgCTB4MDA4ODAwMDB9LAorCXtETEJfQUdJTkdfUkVHSVNURVIsIAkJCQkweDNGN0YwMDdGfSwKKwl7RExCX0VWSUNUSU9OX0NPTlRST0xfUkVHLCAJCQkweDAwMDAxMjlGfSwKKwl7RExCX0VWSUNUSU9OX1RJTUVSU19SRUdJU1RFUl9SRUcsIAkweDAwRkYwMDAwfSwKKwl7RExCX0JVU19XRUlHSFRTX0RJRkZfQ1MsIAkJCTB4MDQwMzA4MDN9LAorCXtETEJfQlVTX1dFSUdIVFNfRElGRl9CRywJCQkweDAwMDAwQTAyfSwKKwl7RExCX0JVU19XRUlHSFRTX1NBTUVfQkcsIAkJCTB4MDgwMDA5MDF9LAorCXtETEJfQlVTX1dFSUdIVFNfUkRfV1IsICAJCQkweDAwMDIwMDA1fSwKKwl7RExCX0JVU19XRUlHSFRTX0FUVFJfU1lTX1BSSU8sIAkweDAwMDYwRjEwfSwKKwl7RExCX01BSU5fUVVFVUVfTUFQLAkJCQkweDAwMDAwNTQzfSwKKwl7RExCX0xJTkVfU1BMSVQsIAkJCQkJMHgwMDAwMDAwRn0sCisJe0RMQl9VU0VSX0NPTU1BTkRfUkVHLCAgCQkJMHgwMDAwMDAwMH0sCisgICAgezB4MCwgMHgwfQogfTsKICNlbHNlCiBNVl9EUkFNX0RMQl9DT05GSUcgZGRyM0RsYkNvbmZpZ1RhYmxlW10gPQogewotCXtSRUdfU1RBVElDX0RSQU1fRExCX0NPTlRST0wsIDB4MjAwMDAwNUN9LAotCXtETEJfQlVTX09QVElNSVpBVElPTl9XRUlHSFRTX1JFRywgIDB4MDA4ODAwMDB9LAotCXtETEJfQUdJTkdfUkVHSVNURVIsICAweDBGN0YwMDdGfSwKLQl7RExCX0VWSUNUSU9OX0NPTlRST0xfUkVHLCAgIDB4MDAwMDEyOUZ9LAotCXtETEJfRVZJQ1RJT05fVElNRVJTX1JFR0lTVEVSX1JFRywgIDB4MDBGRjAwMDB9LAotCXtETEJfQlVTX1dFSUdIVFNfRElGRl9DUywgMHgwNDAzMDgwMn0sCi0Je0RMQl9CVVNfV0VJR0hUU19ESUZGX0JHLCAweDAwMDAwQTAyfSwKLQl7RExCX0JVU19XRUlHSFRTX1NBTUVfQkcsIDB4MDkwMDBBMDF9LAotCXtETEJfQlVTX1dFSUdIVFNfUkRfV1IsIDB4MDAwMjAwMDV9LAotCXtETEJfQlVTX1dFSUdIVFNfQVRUUl9TWVNfUFJJTywweDAwMDYwRjEwfSwKLQl7RExCX01BSU5fUVVFVUVfTUFQLCAweDAwMDAwNTQzfSwKLQl7RExCX0xJTkVfU1BMSVQsMHgwMDAwMDAwMH0sCi0Je0RMQl9VU0VSX0NPTU1BTkRfUkVHLCAweDAwMDAwMDAwfSwKLQl7MHgwLCAweDB9Ci19OwotCi1NVl9EUkFNX0RMQl9DT05GSUcgZGRyM0RsYkNvbmZpZ1RhYmxlX0EwW10gPQotewotCXtSRUdfU1RBVElDX0RSQU1fRExCX0NPTlRST0wsIDB4MjAwMDAwNUN9LAotCXtETEJfQlVTX09QVElNSVpBVElPTl9XRUlHSFRTX1JFRywgMHgwMDg4MDAwMH0sCi0Je0RMQl9BR0lOR19SRUdJU1RFUiwweDBGN0YwMDdGfSwKLQl7RExCX0VWSUNUSU9OX0NPTlRST0xfUkVHLDB4MDAwMDEyOUZ9LAotCXtETEJfRVZJQ1RJT05fVElNRVJTX1JFR0lTVEVSX1JFRywweDAwRkYwMDAwfSwKLQl7RExCX0JVU19XRUlHSFRTX0RJRkZfQ1MsMHgwNDAzMDgwMn0sCi0Je0RMQl9CVVNfV0VJR0hUU19ESUZGX0JHLDB4MDAwMDBBMDJ9LAotCXtETEJfQlVTX1dFSUdIVFNfU0FNRV9CRywweDA5MDAwQTAxfSwKLQl7RExCX0JVU19XRUlHSFRTX1JEX1dSLDB4MDAwMjAwMDV9LAotCXtETEJfQlVTX1dFSUdIVFNfQVRUUl9TWVNfUFJJTywweDAwMDYwRjEwfSwKLQl7RExCX01BSU5fUVVFVUVfTUFQLDB4MDAwMDA1NDN9LAotCXtETEJfTElORV9TUExJVCwweDAwMDAwMDAwfSwKLQl7RExCX1VTRVJfQ09NTUFORF9SRUcsMHgwMDAwMDAwMH0sCisJe1JFR19TVEFUSUNfRFJBTV9ETEJfQ09OVFJPTCwgCQkweDIwMDAwMDVDfSwKKwl7RExCX0JVU19PUFRJTUlaQVRJT05fV0VJR0hUU19SRUcsIAkweDAwODgwMDAwfSwKKwl7RExCX0FHSU5HX1JFR0lTVEVSLAkJCQkweDBGN0YwMDdGfSwKKwl7RExCX0VWSUNUSU9OX0NPTlRST0xfUkVHLAkJCTB4MDAwMDEyOUZ9LAorCXtETEJfRVZJQ1RJT05fVElNRVJTX1JFR0lTVEVSX1JFRywJMHgwMEZGMDAwMH0sCisJe0RMQl9CVVNfV0VJR0hUU19ESUZGX0NTLAkJCTB4MDQwMzA4MDJ9LAorCXtETEJfQlVTX1dFSUdIVFNfRElGRl9CRywJCQkweDAwMDAwQTAyfSwKKwl7RExCX0JVU19XRUlHSFRTX1NBTUVfQkcsCQkJMHgwOTAwMEEwMX0sCisJe0RMQl9CVVNfV0VJR0hUU19SRF9XUiwJCQkJMHgwMDAyMDAwNX0sCisJe0RMQl9CVVNfV0VJR0hUU19BVFRSX1NZU19QUklPLAkJMHgwMDA2MEYxMH0sCisJe0RMQl9NQUlOX1FVRVVFX01BUCwJCQkJMHgwMDAwMDU0M30sCisJe0RMQl9MSU5FX1NQTElULAkJCQkJMHgwMDAwMDAwMH0sCisJe0RMQl9VU0VSX0NPTU1BTkRfUkVHLAkJCQkweDAwMDAwMDAwfSwKIAl7MHgwLCAweDB9CiB9OwogI2VuZGlmCiAKLQogI2VuZGlmIC8qIF9JTkNfQTM4WF9ETEJfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM5eC9kZHIzX2EzOXhfdG9wb2xvZ3kuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvYTM5eC9kZHIzX2EzOXhfdG9wb2xvZ3kuaAppbmRleCA0NWYyNjZhLi5lNDU3ZmVjIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOXgvZGRyM19hMzl4X3RvcG9sb2d5LmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzl4L2RkcjNfYTM5eF90b3BvbG9neS5oCkBAIC02OCwxMSArNjgsMTEgQEAKICNpbmNsdWRlICJtdkRkcjNMb2dnaW5nRGVmLmgiCiAKIC8qQnVzIG1hc2sgdmFyaWFudHMqLwotI2RlZmluZSBCVVNfTUFTS18zMkJJVAkJCQkweEYKLSNkZWZpbmUgQlVTX01BU0tfMzJCSVRfRUNDCQkJMHgxRgotI2RlZmluZSBCVVNfTUFTS18xNkJJVAkJCQkweDMKLSNkZWZpbmUgQlVTX01BU0tfMTZCSVRfRUNDCQkJMHgxMwotI2RlZmluZSBCVVNfTUFTS18xNkJJVF9FQ0NfUFVQMwkJMHhCCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18zMkJJVAkJCQkweEYKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUX0VDQwkJCTB4MUYKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUCQkJCTB4MworI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVRfRUNDCQkJMHgxMworI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVRfRUNDX1BVUDMJCTB4QgogCiAjZGVmaW5lICBEWU5BTUlDX0NTX1NJWkVfQ09ORklHCiAjZGVmaW5lICBESVNBQkxFX0wyX0ZJTFRFUklOR19EVVJJTkdfRERSX1RSQUlOSU5HCkBAIC04NCwxOCArODQsMTYgQEAKICAgICAvKiAxc3QgQ3VzdG9tZXIgYm9hcmQgLSByZWZlcmVuY2UgZnJvbSBEQiAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSx7IDB4MSwwLDAsMH0seyAweDIsMSwwLDB9LHsgMHgyLDEsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogICAgIC8qIDJuZCBDdXN0b21lciBib2FyZCAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSx7IDB4MSwwLDAsMH0seyAweDIsMSwwLDB9LHsgMHgyLDEsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9CiB9OwogCkBAIC0xMDcsMjMgKzEwNSwyMSBAQAogICAgIC8qIDFzdCBNYXJ2ZWxsIGJvYXJkIC0gUkRfTkFTICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV84MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKICNlbHNlCiAgICAgLyogMm5kIE1hcnZlbGwgYm9hcmQgLSBEQiAoRERSNCkgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0vKkVscGlkYSBieSAxNiBpcyAyNDAwUgotCU1pY3JvbiBieSA4IGlzIDIxMzNQCi0Jc2Ftc3VuZyBieSAxNiBpcyBYWFgKLQlIeW51eCBieTE2IGlzIDIxMzNQKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKy8qCUVscGlkYSAJYnkxNiAJaXMgMjQwMFIKKwlNaWNyb24gCWJ5OCAJaXMgMjEzM1AKKwlzYW1zdW5nIGJ5MTYgCWlzIDIxMzNQCisJSHludXggCWJ5MTYgCWlzIDIxMzNQKi8KICAgICB7e3t7MHgzLDIsMCwwfSx7IDB4MywyLDAsMH0seyAweDMsMiwwLDB9LHsgMHgzLDIsMCwwfSwgezB4MywyICwwLDB9fSwgU1BFRURfQklOX0REUl8yNDAwUiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzgwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMzJCSVRfRUNDICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUX0VDQyAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9hMzl4L2RkcjNfYTM5eF92YXJzLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOXgvZGRyM19hMzl4X3ZhcnMuaAppbmRleCBiZDU3NWVlLi5kMDRkMWY3IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOXgvZGRyM19hMzl4X3ZhcnMuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL2EzOXgvZGRyM19hMzl4X3ZhcnMuaApAQCAtNjYsNyArNjYsNyBAQAogI2RlZmluZSBfSU5DX0EzOVhfVkFSU19ICiAKICNpbmNsdWRlICJkZHIzX2EzOXhfbWNfc3RhdGljLmgiCi0jaW5jbHVkZSAibXZEZHIzVG9wb2xvZ3lEZWYuaCIKKyNpbmNsdWRlICJtdkRkclRvcG9sb2d5RGVmLmgiCiAKIHR5cGVkZWYgc3RydWN0IF9fbXZEcmFtTW9kZXMgewogICAgIGNoYXIgKm1vZGVfbmFtZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjMy5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggMjlmYWZkNy4uYzU3NTNmZAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjMy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzLmgKQEAgLTY0LDEzICs2NCwxMyBAQAogI2lmbmRlZiBfRERSM19NU1lTX0FDM19ICiAjZGVmaW5lIF9ERFIzX01TWVNfQUMzX0gKIAotI2RlZmluZSBNQVhfSU5URVJGQUNFX05VTSAgCQkoMTIpCi0jZGVmaW5lIE1BWF9CVVNfTlVNICAgICAgICAJCSg4KQorI2RlZmluZSBNQVhfSU5URVJGQUNFX05VTSAgCQkoMSkKKyNkZWZpbmUgTUFYX0JVU19OVU0gICAgICAgIAkJKDUpCiAKICNpbmNsdWRlICJkZHIzX2h3c19od190cmFpbmluZ19kZWYuaCIKIAotLypDb250cm9sZXIgYnVzIGRpdmlkZXIgMSBmb3IgMzIgYml0LCAyIGZvciA2NCBiaXQqLwotI2RlZmluZSBNVl9ERFJfQ09OVFJPTExFUl9CVVNfV0lEVEhfTVVMVElQTElFUgkJMQorLypDb250cm9sZXIgYnVzIGRpdmlkZXIgMSBmb3IgMzIgYml0LCAyIGZvciA2NCBiaXQgKi8KKyNkZWZpbmUgTVZfRERSX0NPTlRST0xMRVJfQlVTX1dJRFRIX01VTFRJUExJRVIgICAgICAgICAxCiAKIC8qIE1JU0MgKi8KICNkZWZpbmUgSU5URVJfUkVHU19CQVNFCQkJCQkJCQkweEQwMDAwMDAwCkBAIC0xMDIsNyArMTAyLDcgQEAKICNkZWZpbmUJUkVHX1NBTVBMRV9SRVNFVF9DUFVfQVJDSF9PRkZTCQkJMzEKICNkZWZpbmUJUkVHX1NBTVBMRV9SRVNFVF9ISUdIX0NQVV9GUkVRX09GRlMJCTIwCiAKLSNkZWZpbmUgTVZfQk9BUkRfUkVGQ0xLCQkJMjUwMDAwMDAwCisjZGVmaW5lIE1WX0JPQVJEX1JFRkNMSwkJCW12Qm9hcmRUY2xrR2V0KCkKIAogLyogRERSMyBGcmVxdWVuY2llczogKi8KICNkZWZpbmUgRERSXzEwMAkJCQkJCQkJCTAKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX2NvbmZpZy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfY29uZmlnLmgKaW5kZXggNWE5Mzc4OS4uMzMxNGIwOSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfY29uZmlnLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfY29uZmlnLmgKQEAgLTYyLDEzICs2Miw5IEBACiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCiAjaWZuZGVmIF9ERFIzX01TWVNfQUMzX0NPTkZJR19ICiAjZGVmaW5lIF9ERFIzX01TWVNfQUMzX0NPTkZJR19ICiAKLSNkZWZpbmUgRERSM19GQVNUX1BBVEhfRU4JCQkxCi0jZGVmaW5lIFNVUFBPUlRfU1RBVElDX0RVTklUX0NPTkZJRwotCiAjZW5kaWYgLyogX0REUjNfTVNZU19BQzNfQ09ORklHX0ggKi8KIAorCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM190b3BvbG9neS5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfdG9wb2xvZ3kuaAppbmRleCA4NzIxZmVmLi40M2UwYjc5IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2FjM190b3BvbG9neS5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX3RvcG9sb2d5LmgKQEAgLTY4LDE1ICs2OCwxNiBAQAogI2luY2x1ZGUgIm12RGRyM0xvZ2dpbmdEZWYuaCIKIAogLypCdXMgbWFzayB2YXJpYW50cyovCi0jZGVmaW5lIEJVU19NQVNLXzMyQklUCQkJCTB4RgotI2RlZmluZSBCVVNfTUFTS18zMkJJVF9FQ0MJCQkweDFGCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUCQkJCTB4MwotI2RlZmluZSBCVVNfTUFTS18xNkJJVF9FQ0MJCQkweDEzCi0jZGVmaW5lIEJVU19NQVNLXzE2QklUX0VDQ19QVVAzCQkweEIKKyNkZWZpbmUgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUCQkJCTB4RgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVRfRUNDCQkJMHgxRgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQJCQkJMHgzCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVF9FQ0MJCQkweDEzCisjZGVmaW5lIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVF9FQ0NfUFVQMwkJMHhCCiAKICNkZWZpbmUgIERZTkFNSUNfQ1NfU0laRV9DT05GSUcKICNkZWZpbmUgIE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkUgICAgICAgICAgQUREUl9TSVpFXzJHYgogCisKICNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3VzdG9tZXIgQm9hcmRzIFRvcG9sb2d5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9IV1NfVE9QT0xPR1lfTUFQIFRvcG9sb2d5TWFwW10gPQpAQCAtODUsMTkgKzg2LDE3IEBACiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KIAkvKiBBVFRFTlRJT04gLSBjc19tYXNrIGFuZCBtaXJyb3IgIEhBVkUgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBQVVBzKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MywwLDAsMH0sIHsweDMsMCwwLDB9LCB7MHgwLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV80MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKICAgICAvKiAybmQgQ3VzdG9tZXIgYm9hcmQgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwogCS8qIEFUVEVOVElPTiAtIGNzX21hc2sgYW5kIG1pcnJvciAgSEFWRSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIFBVUHMqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0seyAweDEsMCwwLDB9LHsgMHgyLDEsMCwwfSx7IDB4MiwxLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV80MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfQogfTsKIApAQCAtMTA5LDQ2ICsxMDgsNDEgQEAKICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwogCS8qIEFUVEVOVElPTiAtIGNzX21hc2sgYW5kIG1pcnJvciAgSEFWRSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIFBVUHMqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDMsMiwwLDB9LCB7MHgzLDIsMCwwfSx7MHgzLDIsMCwwfSwgezB4MywyLDAsMH0sIHsweDMsMiwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzQwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogCS8qIDJyZCBNYXJ2ZWxsIGJvYXJkIC0gUkRfTVRMXzRYRyAgKEJvYXJkSWQgPSAweDEpICovCiAgICAgewogICAgIDB4MSwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KIAkvKiBBVFRFTlRJT04gLSBjc19tYXNrIGFuZCBtaXJyb3IgIEhBVkUgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBQVVBzKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICBzcGVlZF9iaW4gICAgICAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0seyAweDEsMCwwLDB9LHsweDEsMCwwLDB9LHsgMHgxLDAsMCwwfSx7IDB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfNDAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAJLyogM3JkIE1hcnZlbGwgYm9hcmQgLSBSRF9NVExfMlhYR18yWEc6IE5vIEVDQyAoQm9hcmRJZCA9IDB4MikgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwogCS8qIEFUVEVOVElPTiAtIGNzX21hc2sgYW5kIG1pcnJvciAgSEFWRSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIFBVUHMqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfZGV2aWNlX3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KIAl7e3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZMLCBCVVNfV0lEVEhfOCAsIE1FTV80RywgRERSX0ZSRVFfNDAwLCAwICwgICAwICwgTVZfSFdTX1RFTVBfTE9XfX0sCi0gICAgNSwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICBCVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLworICAgIElOVEVSRkFDRV9CVVNfTUFTS18xNkJJVCAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAgICAgLyogNHRoIE1hcnZlbGwgYm9hcmQgLSBEQl9NSVNMXzI0RzRHIC0gTm8gRUNDIChCb2FyZElkID0gMHgzKSAqLwogICAgIHsKICAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCiAJLyogQVRURU5USU9OIC0gY3NfbWFzayBhbmQgbWlycm9yICBIQVZFIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgUFVQcyovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgc3BlZWRfYmluICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X2RldmljZV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCiAJe3t7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TCwgQlVTX1dJRFRIXzggLCBNRU1fNEcsIEREUl9GUkVRXzQwMCwgMCAsICAgMCAsIE1WX0hXU19URU1QX0xPV319LAotICAgIDUsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMTZCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogICAgIC8qIDV0aCBNYXJ2ZWxsIGJvYXJkIC0gUkRfTVRMXzI0RyAtIE5vIEVDQyAoQm9hcmRJZCA9IDB4NCkgKi8KICAgICB7CiAgICAgMHgxLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwogCS8qIEFUVEVOVElPTiAtIGNzX21hc2sgYW5kIG1pcnJvciAgSEFWRSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIFBVUHMqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgIHNwZWVkX2JpbiAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgICAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICBzcGVlZF9iaW4gICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwogCXt7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgxLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2NkwsIEJVU19XSURUSF84ICwgTUVNXzRHLCBERFJfRlJFUV80MDAsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9MT1d9fSwKLSAgICA1LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIEJVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzE2QklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKIH07CiAjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX3ZhcnMuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX3ZhcnMuaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IGFmZDFiZDMuLmY4ZGQxODUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19hYzNfdmFycy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYWMzX3ZhcnMuaApAQCAtNjcsNyArNjcsNyBAQAogCiAjaW5jbHVkZSAiZGRyM19tc3lzX2FjM19jb25maWcuaCIKICNpbmNsdWRlICJkZHIzX21zeXNfYWMzX21jX3N0YXRpYy5oIgotI2luY2x1ZGUgIm12RGRyM1RvcG9sb2d5RGVmLmgiCisjaW5jbHVkZSAibXZEZHJUb3BvbG9neURlZi5oIgogCiAjaWYgIWRlZmluZWQoQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQpCiAjZGVmaW5lIE1WX0REUl9UT1BPTE9HWV9VUERBVEVfRlJPTV9UV1NJCkBAIC03NywxMSArNzcsMjUgQEAKIAogLypUdW5lIGludGVybmFsIHRyYWluaW5nIHBhcmFtcyB2YWx1ZXMqLwogI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWSAJCTIwMAotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19DS19ERUxBWV8xNgkJMjAwCi0jZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BGSU5HRVIJCQk0MQotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ORklOR0VSCQkJNDMKICNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUEhZUkVHM1ZBTAkJMHhBCiAKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUFJJX0RBVEEJMTIzCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05SSV9EQVRBCTEyMworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QUklfQ1RSTAk3NAorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OUklfQ1RSTAk3NAorCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0RBVEEJNDUKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTl9PRFRfREFUQQk0NQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9DVFJMCTQ1CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0NUUkwJNDUKKworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19ESUMJCQkJMHgyCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMkNTCTB4MTIwMDEyCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX09EVF9DT05GSUdfMUNTCTB4MTAwMDAKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX05PTQkJCTB4NDQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX1dSXzFDUwkJMHgwIC8qIG9mZiAqLworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1JfMkNTCQkweDAgLyogb2ZmICovCisKIHR5cGVkZWYgc3RydWN0IF9fbXZEcmFtTW9kZXMgewogICAgIGNoYXIgKm1vZGVfbmFtZTsKICAgICBNVl9VOCBjcHVGcmVxOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYmMyLmgKaW5kZXggYmZjM2NjNi4uNDMyNzYxMSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzIuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMi5oCkBAIC02NSwxMyArNjUsMTMgQEAKICNpZm5kZWYgX0REUjNfTVNZU19CQzJfSAogI2RlZmluZSBfRERSM19NU1lTX0JDMl9ICiAKLSNkZWZpbmUgTUFYX0lOVEVSRkFDRV9OVU0gIAkJKDEyKQotI2RlZmluZSBNQVhfQlVTX05VTSAgICAgICAgCQkoOCkKKyNkZWZpbmUgTUFYX0lOVEVSRkFDRV9OVU0gIAkJKDUpCisjZGVmaW5lIE1BWF9CVVNfTlVNICAgICAgICAJCSg1KQogCiAjaW5jbHVkZSAiZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgiCiAKLS8qQ29udHJvbGVyIGJ1cyBkaXZpZGVyIDEgZm9yIDMyIGJpdCwgMiBmb3IgNjQgYml0Ki8KLSNkZWZpbmUgTVZfRERSX0NPTlRST0xMRVJfQlVTX1dJRFRIX01VTFRJUExJRVIJCTIKKy8qQ29udHJvbGVyIGJ1cyBkaXZpZGVyIDEgZm9yIDMyIGJpdCwgMiBmb3IgNjQgIGJpdCAqLworI2RlZmluZSBNVl9ERFJfQ09OVFJPTExFUl9CVVNfV0lEVEhfTVVMVElQTElFUiAgICAgICAgIDIKIAogLyogTUlTQyAqLwogI2RlZmluZSBJTlRFUl9SRUdTX0JBU0UJCQkJCQkJCTB4RDAwMDAwMDAKQEAgLTEwNCw3ICsxMDQsNyBAQAogI2RlZmluZQlSRUdfU0FNUExFX1JFU0VUX0NQVV9BUkNIX09GRlMJCQkzMQogI2RlZmluZQlSRUdfU0FNUExFX1JFU0VUX0hJR0hfQ1BVX0ZSRVFfT0ZGUwkJMjAKIAotI2RlZmluZSBNVl9CT0FSRF9SRUZDTEsJCQkyNTAwMDAwMDAKKyNkZWZpbmUgTVZfQk9BUkRfUkVGQ0xLCQkJbXZCb2FyZFRjbGtHZXQoKQogCiAvKiBERFIzIEZyZXF1ZW5jaWVzOiAqLwogI2RlZmluZSBERFJfMTAwCQkJCQkJCQkJMApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzJfdG9wb2xvZ3kuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9pbmMvZGRyM19zb2MvbXN5cy9kZHIzX21zeXNfYmMyX3RvcG9sb2d5LmgKaW5kZXggOGM5ZjQ0Yy4uMDQ5ZmU4MCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzJfdG9wb2xvZ3kuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl90b3BvbG9neS5oCkBAIC02OCw0NyArNjgsMzQgQEAKICNpbmNsdWRlICJkZHIzX21zeXNfYmMyX2NvbmZpZy5oIgogI2luY2x1ZGUgIm12RGRyM0xvZ2dpbmdEZWYuaCIKIAotI2RlZmluZSBBQ1RVQUxfQlVTX1dJRFRICUJVU19XSURUSF8zMgorI2RlZmluZSBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgICAgICAgMHhGCisjZGVmaW5lIERZTkFNSUNfQ1NfU0laRV9DT05GSUcKIAogI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdXN0b21lciBCb2FyZHMgVG9wb2xvZ3kgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX0hXU19UT1BPTE9HWV9NQVAgVG9wb2xvZ3lNYXBbXSA9ICB7ewogICAgIC8qIDFzdCBDdXN0b21lciBib2FyZCAgcmVmZXJlbmNlZCBmcm9tIE1BcnZlbGwgREIgYm9hcmQqLwogICAgIDB4MTAsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCi0gICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KLSB7ICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCwgICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKLSAgICB7e3swLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBBQ1RVQUxfQlVTX1dJRFRILCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9fSAsCi0gICAgNCwgLyogTnVtIE9mIEJ1cyBQZXIgSW50ZXJmYWNlKi8KLSAgICAweEYgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyB9ICwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogICAgIC8qIDJuZCBDdXN0b21lciBib2FyZCAgcmVmZXJlbmNlIGZyb20gTUFydmVsbCBSRCBib2FyZCovCiB7CiAgICAgMHgxMCwgLyogYWN0aXZlIGludGVyZmFjZXMgIzEqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgICAgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0geyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAsICAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQUNUVUFMX0JVU19XSURUSCwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfX0gLAotICAgIDQsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCi0gICAgMHhGICAvKiBCdXNlcyBtYXNrICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworIHsgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCit9ICwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9LAogfTsKIApAQCAtMTE3LDQxICsxMDQsMzggQEAKIE1WX0hXU19UT1BPTE9HWV9NQVAgVG9wb2xvZ3lNYXBbXSA9ICB7ewogICAgIC8qIDFzdCBNYXJ2ZWxsIGJvYXJkICovCiAgICAgMHgxMCwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotIHsgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwLCAgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH19ICwKLSAgICA0LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIDB4RiAgLyogQnVzZXMgbWFzayAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyB7ICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMTg2Nk0sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorfSAsCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCiAgICAgfSwKICAgICAvKiAybmQgTWFydmVsbCBib2FyZCAqLwogewogICAgIDB4MTAsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICMxKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotIHsgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwLCAgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgICB7MCwwLDAsMH0sICAgezAsMCwwLDB9LCAgIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEFDVFVBTF9CVVNfV0lEVEgsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH19ICwKLSAgICA0LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIDB4RiAgLyogQnVzZXMgbWFzayAqLwotICAgIH0KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH0sIH0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB9LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgfSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyB9ICwKKyAgICBJTlRFUkZBQ0VfQlVTX01BU0tfMzJCSVQgIC8qIEJ1c2VzIG1hc2sgKi8KKyAgICB9LAorICAgIC8qIDNyZCBNYXJ2ZWxsIGJvYXJkICovCit7CisgICAgMHgxMCwgLyogYWN0aXZlIGludGVyZmFjZXMgIzEqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICAgIG1lbW9yeV9kZXZpY2Vfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworIHsgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMCwwLDB9LCB7MHgxLDAsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzIxMzNOLCBCVVNfV0lEVEhfMTYsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8yMTMzTiwgQlVTX1dJRFRIXzE2LCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9fSAsCisgICAgSU5URVJGQUNFX0JVU19NQVNLXzMyQklUICAvKiBCdXNlcyBtYXNrICovCisgICAgfSwKIH07CiAKICNlbmRpZiAvKiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzJfdmFycy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzJfdmFycy5oCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggZDE0MTdkYS4uNjM0YTY3MQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvaW5jL2RkcjNfc29jL21zeXMvZGRyM19tc3lzX2JjMl92YXJzLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL2luYy9kZHIzX3NvYy9tc3lzL2RkcjNfbXN5c19iYzJfdmFycy5oCkBAIC02NiwxNSArNjYsMjkgQEAKICNkZWZpbmUgX0lOQ19NU1lTX0JDMl9WQVJTX0gKIAogI2luY2x1ZGUgImRkcjNfbXN5c19iYzJfY29uZmlnLmgiCi0jaW5jbHVkZSAibXZEZHIzVG9wb2xvZ3lEZWYuaCIKKyNpbmNsdWRlICJtdkRkclRvcG9sb2d5RGVmLmgiCiAKIC8qVHVuZSBpbnRlcm5hbCB0cmFpbmluZyBwYXJhbXMgdmFsdWVzKi8KICNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVkgCQkxNTAKLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVlfMTYJCTE1MAotI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QRklOR0VSCQkJNDEKLSNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTkZJTkdFUgkJCTQzCiAjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BIWVJFRzNWQUwJCTB4QQogCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BSSV9EQVRBCTEyMworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OUklfREFUQQkxMjMKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUFJJX0NUUkwJNzQKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTlJJX0NUUkwJNzQKKworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9EQVRBCTQ1CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0RBVEEJNDUKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUF9PRFRfQ1RSTAk0NQorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OX09EVF9DVFJMCTQ1CisKKyNkZWZpbmUgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfRElDCQkJCTB4MgorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHXzJDUwkweDEyMDAxMgorI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHXzFDUwkweDEwMDAwCisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9OT00JCQkweDQ0CisjZGVmaW5lIE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9XUl8xQ1MJCTB4MjAwIC8qUlpRLzQqLworI2RlZmluZSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1JfMkNTCQkweDIwMCAvKlJaUS80Ki8KKwogdHlwZWRlZiBzdHJ1Y3QgX19tdkRyYW1NY0luaXQgewogCU1WX1UzMiByZWdfYWRkcjsKIAlNVl9VMzIgcmVnX3ZhbHVlOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL21haW4vbXZkaXNwYWNoZXIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9tYWluL212ZGlzcGFjaGVyLmMKaW5kZXggNDZjMWY4Yi4uZDIyMDEzZCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL21haW4vbXZkaXNwYWNoZXIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvbWFpbi9tdmRpc3BhY2hlci5jCkBAIC02NSwxNCArNjUsMzUgQEAKICNpbmNsdWRlICJtdl9vcy5oIgogI2luY2x1ZGUgIm12VWFydC5oIgogI2luY2x1ZGUgIm12QmluSGRyQ29tcG9uZW50cy5oIgorI2luY2x1ZGUgInByaW50Zi5oIgorCisjaWZkZWYgTVZfREVCVUdfTU9ERQorI2luY2x1ZGUgImRlYnVnLmgiCisjZW5kaWYKIAogTVZfQklOQVJZX0hFQURFUl9DT01QT05FTlRTIGNvbXBvbmVudFRhYmxlW109eyBCSU5fSEVBREVSX0NPTVBPTkVOVF9UQUJMRX07CiAKKyNpZmRlZiBNVl9ERUJVR19NT0RFCitzdGF0aWMgdm9pZCBwcmludF9tZW51KCkgeworCW12UHJpbnRmKCJcblBsZWFzZSBjaG9vc2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6XG4iKTsKKwltdlByaW50ZigiXHQxLlNFUkRFUyBpbml0aWFsaXphdGlvblxuIik7CisJbXZQcmludGYoIlx0Mi5EUkFNIGluaXRpYWxpemF0aW9uXG4iKTsKKwltdlByaW50ZigiXHQzLlN1c3BlbmQgd2FrZSB1cFxuIik7CisJbXZQcmludGYoIlx0NC5Qcm9tcHQgbW9kZVxuIik7CisJbXZQcmludGYoIlx0XHRTZWxlY3RlZCBjb21tYW5kIG51bWJlcjoiKTsKK30KKyNlbmRpZgorCiBpbnQgbXZCaW5IZHJEaXNwYXRjaGVyKHZvaWQpCiB7Ci0JTVZfU1RBVFVTIHJjOwogCU1WX0JJTkFSWV9IRUFERVJfQ09NUE9ORU5UUyAqcENvbXBvbmVudD0gY29tcG9uZW50VGFibGU7CisJTVZfU1RBVFVTIHJjOworI2lmZGVmIE1WX0RFQlVHX01PREUKKwlpbnQgaTsKKwljaGFyIGM7CisjZW5kaWYKIAorI2lmbmRlZiBNVl9ERUJVR19NT0RFCiAgICAgd2hpbGUgKHBDb21wb25lbnQtPkNvbXBvbmVudEZ1bmMpewogCQlyYyA9IHBDb21wb25lbnQtPkNvbXBvbmVudEZ1bmMoKTsKIAkJaWYgKHJjICE9IE1WX09LKQpAQCAtODUsNSArMTA2LDM3IEBACiAJCX0KIAkJcENvbXBvbmVudCsrOwogCX0KKyNlbHNlCisJLyogUnVuIEdlbmVyYWxJbml0IGNvbXBvbmVudAorCSAqIG5lZWRlZCBmb3IgZ2VuZXJlYWwgTVBQJ3MgKGkuZSBVQVJULCBJMkMsIGV0Yy4pICovCisJaWYgKHBDb21wb25lbnQtPkNvbXBvbmVudEZ1bmMpCisJCXBDb21wb25lbnQtPkNvbXBvbmVudEZ1bmMoKTsKKwkvKiBzZW5kIEFDS3MgdG8gdGhlIHNlbmRlciB0byBmaW5pc2ggc3gtYXQ5MSBwcm90b2NvbCBydW5uaW5nCisJICogYW5kIHN0YXJ0IHVzaW5nIFVBUlQgZm9yIHByaW50cworCSAqIDMgQUNLUyBhcmUgcmVxdWlyZWQgdG8gZmluaXNoIHRyYW5zYWN0aW9uICovCisJZm9yIChpID0gMDsgaSA8IDM7ICsraSkKKwkJbXZVYXJ0UHV0YyhNVl9VQVJUX1hNT0RFTV9BQ0tfQ0hBUik7CisJLyogZ2V0IHRoZSBsYXN0IGNoYXIgc2VudCBieSB0aGUgcHJvdG9jb2wgKEVPVCkgKi8KKwltdlVhcnRHZXRjKCk7CisKKwl3aGlsZSAoMSkgeworCQlwcmludF9tZW51KCk7CisJCWMgPSBtdlVhcnRHZXRjKCk7CisKKwkJaWYgKGMgPj0gJzEnICYmIGMgPD0gJzMnKSB7CisJCQlwQ29tcG9uZW50ID0gY29tcG9uZW50VGFibGUgKyAoYyAtICcwJyk7CisJCQlpZiAocENvbXBvbmVudC0+Q29tcG9uZW50RnVuYykgeworCQkJCXJjID0gcENvbXBvbmVudC0+Q29tcG9uZW50RnVuYygpOworCQkJCWlmIChyYyAhPSBNVl9PSykKKwkJCQkJbXZQcmludGYoIlxuXG4gKioqKioqKioqKiAlcyBmYWlsZWQhICoqKioqKioqKioiLCBwQ29tcG9uZW50LT5Db21wb25lbnROYW1lKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjID09ICc0JykgeworCQkJcmMgPSBtdkJpbkhlYWRlckRlYnVnUHJvbXB0KCk7CisJCQlpZiAocmMgIT0gTVZfT0spCisJCQkJbXZQcmludGYoIlxuXG4gKioqKioqKioqKiBCaW5hcnkgSGVhZGVyIERlYnVnIFByb21wdCBmYWlsZWQhICoqKioqKioqKioiKTsKKwkJfSBlbHNlCisJCQltdlByaW50ZigiXG5cbkludmFsaWQgY29tbWFuZCBudW1iZXJcbiIpOworCX0KKyNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL01ha2VmaWxlIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL01ha2VmaWxlCmluZGV4IDliYTFlYjAuLmMxOTZiZWYgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9NYWtlZmlsZQorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vTWFrZWZpbGUKQEAgLTcwLDE0ICs3MCwxNyBAQAogCiBUR1QgPSBwbGF0LmEKIFRHVF9VQVJUID0gcGxhdC51YXJ0LmEKK1RHVF9ERUJVRyA9IHBsYXQuZGVidWcuYQogCiBEUlYgPSBkcml2ZXJzCiBVVElMUyA9IHV0aWxzCiBTWVNfRU5WID0gc3lzRW52LyQoQk9BUkQpCitCSU5fSERSX0RFQlVHID0gJChVVElMUykvZGVidWcKIAogQ1NSQ19EUlYgPSAkKERSVikvbXZfdWFydC5jICQoRFJWKS9tdl90d3NpLmMgJChEUlYpL212X3RpbWUuYwogQ1NSQ19VVElMUyA9ICQoVVRJTFMpL3V0aWxzLmMgJChVVElMUykvcHJpbnRmLmMgJChVVElMUykvbXZId3NTaWxpY29uSWYuYwogQ1NSQ19TWVNfRU5WID0gJChTWVNfRU5WKS9tdlN5c0VudkxpYi5jCitDU1JDX0JJTl9IRFJfREVCVUcgPSAkKEJJTl9IRFJfREVCVUcpL2RlYnVnLmMgJChCSU5fSERSX0RFQlVHKS9saWJfdXRpbHMuYyAkKEJJTl9IRFJfREVCVUcpL2NvbW1hbmQuYyAkKEJJTl9IRFJfREVCVUcpL21lbS5jICQoQklOX0hEUl9ERUJVRykveG9yX21lbXRlc3QuYwogCiBpZmVxICIkKENPTkZJR19BTExFWUNBVDMpIiAgInkiCiAgIENTUkNfVVRJTFMgKz0gJChVVElMUykvbXZfc2VxX2V4ZWNfZXh0LmMKQEAgLTk4LDExICsxMDEsMTQgQEAKIGVuZGlmCiAKIENTUkMgPSAkKENTUkNfRFJWKSAkKENTUkNfVVRJTFMpICQoQ1NSQ19TWVNfRU5WKQorQ1NSQ19ERUJVRyA9ICQoQ1NSQykgJChDU1JDX0JJTl9IRFJfREVCVUcpCiAKIENPQkogPSAkKHN1YnN0IC5jLC5vLCQoQ1NSQykpCiBDVUFSVF9PQkogPSAkKHN1YnN0IC5jLC51YXJ0Lm8sJChDU1JDKSkKK0NERUJVR19PQkogPSAkKHN1YnN0IC5jLC5kZWJ1Zy5vLCQoQ1NSQ19ERUJVRykpCiAKLWFsbDogICAkKFRHVCkgJChUR1RfVUFSVCkKKworYWxsOiAgICQoVEdUKSAkKFRHVF9VQVJUKSAkKFRHVF9ERUJVRykKIAogJS5vOiAlLmMKIAkkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgLW8gJEAgJDwKQEAgLTExMCw2ICsxMTYsOSBAQAogJS51YXJ0Lm86ICUuYwogCSQoQ0MpICQoQ0ZMQUdTKSAtRE5PVF9VU0VfVUFSVCAtRE1WX05PX0lOUFVUIC1ETVZfTk9fUFJJTlQgICQoQ1BQRkxBR1MpIC1jIC1vICAkQCAkPAogCislLmRlYnVnLm86ICUuYworCSQoQ0MpICQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAtYyAtbyAgJEAgJDwKKwogJChUR1QpOiAkKENPQkopCiAJYXIgcmNzICQoVEdUKSAgJChDT0JKKQogCSQoQ1ApIC4vJEAgLi4vCkBAIC0xMTgsNiArMTI3LDEwIEBACiAJYXIgcmNzICQoVEdUX1VBUlQpICAkKENVQVJUX09CSikKIAkkKENQKSAuLyRAIC4uLwogCiskKFRHVF9ERUJVRyk6ICQoQ0RFQlVHX09CSikKKwlhciByY3MgJChUR1RfREVCVUcpICAkKENERUJVR19PQkopCisJJChDUCkgLi8kQCAuLi8KKwogc2V0cGFyYW1zOgogCSQoSE9TVENDKSAkKEJPQVJERkxBRykgLVdhbGwgJChJTkNMVURFKSAkKENQUEZMQUdTKSAtbyAkQCAgJChhZGRzdWZmaXggLmMsICQoVVRJTFMpLyRAKQogCSQoQ1ApICRAIC4uLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL2RyaXZlcnMvbXZfdGltZS5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL2RyaXZlcnMvbXZfdGltZS5jCmluZGV4IDcyZmNhNDUuLjc2NTY0N2IgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9kcml2ZXJzL212X3RpbWUuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vZHJpdmVycy9tdl90aW1lLmMKQEAgLTYzLDYgKzYzLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiY29uZmlnX21hcnZlbGwuaCIgICAgIC8qIFJlcXVpcmVkIHRvIGlkZW50aWZ5IFNPQyBhbmQgQm9hcmQgKi8KICNpbmNsdWRlICJtdl9vcy5oIgorI2luY2x1ZGUgIm12U3lzRW52TGliLmgiCiAjaWYgZGVmaW5lZChNVjg4Rjc4WDYwKQogI2luY2x1ZGUgImRkcjNfYXhwLmgiCiAjZWxpZiBkZWZpbmVkKE1WODhGNjcxMCkKQEAgLTg3LDcgKzg4LDYgQEAKICNlbmRpZgogI2RlZmluZSBVQk9PVF9DTlRSICAgICAgICAgICAgICAwICAgICAgIC8qIGNvdW50ZXIgdG8gdXNlIGZvciB1Ym9vdCB0aW1lciAgMCwxICovCiAKLQogdm9pZCBfX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCiB7CiAgICAgdW5zaWduZWQgbG9uZyBkZWxheXRpY2tzOwpAQCAtMTA0LDcgKzEwNCwxMSBAQAogICAgIGNudG1yQ3RybCA9IE1WX1JFR19SRUFEKENOVE1SX0NUUkxfUkVHKFVCT09UX0NOVFIpKTsKICAgICBjbnRtckN0cmwgJj0gfkNUQ1JfQVJNX1RJTUVSX0FVVE9fRU4oVUJPT1RfQ05UUik7CiAgICAgY250bXJDdHJsIHw9IENUQ1JfQVJNX1RJTUVSX0VOKFVCT09UX0NOVFIpOwotICAgIGNudG1yQ3RybCB8PSBDVENSX0FSTV9USU1FUl8yNU1oekZSUV9FTihVQk9PVF9DTlRSKTsKKworCS8qIGNoZWNrIGlmIDI1TWh6IGFzIHJlZiBjbG9jayBpcyBzdXBwb3J0ZWQgYnkgU29DICovCisJaWYgKG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KCkpCisJCWNudG1yQ3RybCB8PSBDVENSX0FSTV9USU1FUl8yNU1oekZSUV9FTihVQk9PVF9DTlRSKTsKKwogICAgIE1WX1JFR19XUklURShDTlRNUl9DVFJMX1JFRyhVQk9PVF9DTlRSKSxjbnRtckN0cmwpOwogCiAgICAgd2hpbGUoTVZfUkVHX1JFQUQoQ05UTVJfVkFMX1JFRyhVQk9PVF9DTlRSKSkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzcwL212U3lzRW52TGliLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzNzAvbXZTeXNFbnZMaWIuYwppbmRleCA3NDM3NDY3Li4yMDZhODVlIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzNzAvbXZTeXNFbnZMaWIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzNzAvbXZTeXNFbnZMaWIuYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzNzUvbXZTeXNFbnZMaWIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5jCmluZGV4IDFhMGRhZjAuLjlhMjEzYTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5jCkBAIC0zMDcsMyArMzA3LDExIEBACiAJdmFsdWUgPSBNVl9SRUdfUkVBRChERVZfVkVSU0lPTl9JRF9SRUcpOwogCXJldHVybiAgKCh2YWx1ZSAmIChSRVZJU09OX0lEX01BU0spICkgPj4gUkVWSVNPTl9JRF9PRkZTKTsKIH0KKworLyogbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHo6CisgKiBBMzc1IHN1cHBvcnQgMjVNaHogYXMgcmVmLmNsb2NrIGZvciB0aW1lcgorICovCitNVl9CT09MIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KHZvaWQpCit7CisJcmV0dXJuIE1WX1RSVUU7Cit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzNzUvbXZTeXNFbnZMaWIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5oCmluZGV4IDFlYzNiOWQuLjI5ODQ1MjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM3NS9tdlN5c0VudkxpYi5oCkBAIC0yNzcsNSArMjc3LDE1IEBACiBNVl9TVEFUVVMgbXZCb2FyZFR3c2lHZXQoTVZfVTMyIGFkZHJlc3MsIE1WX1U4IGRldk51bSwgTVZfVTggcmVnTnVtLCBNVl9VOCAqcERhdGEpOwogTVZfVTMyIG12Qm9hcmRJZEluZGV4R2V0KE1WX1UzMiBib2FyZElkKTsKIE1WX1UzMiBtdkJvYXJkSWRHZXQoTVZfVk9JRCk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6IC0KKyAqCisgKiBERVNDUklQVElPTjogICAgICAgICAgUm91dGluZSB0byBpbmRpY2F0ZSBpZiAyNU1oeiByZWYgY2xvY2sgZm9yIHRpbWVyIGlzIHN1cHBvcnRlZAorICogSU5QVVQ6ICAgICAgICAgICAgICAgIE5vbmUuCisgKiBPVVRQVVQ6ICAgICAgICAgICAgICAgTm9uZS4KKyAqIFJFVFVSTlM6ICAgICAgICAgICAgICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oeihNVl9WT0lEKTsKIAogI2VuZGlmIC8qIF9fSU5DbXZCSGJvYXJkRW52U3BlY2ggKi8KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hMzh4L212U3lzRW52TGliLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzOHgvbXZTeXNFbnZMaWIuYwppbmRleCBjMzJlYjA4Li4wYjZhNmQzIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzOHgvbXZTeXNFbnZMaWIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzOHgvbXZTeXNFbnZMaWIuYwpAQCAtNjgsNiArNjgsOCBAQAogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJtdl9zZXFfZXhlYy5oIgogI2luY2x1ZGUgInByaW50Zi5oIgorI2luY2x1ZGUgImdlbmVyYWxJbml0LmgiCisKICNpZmRlZiBNVjg4RjY5WFgKICAgICAgICAjaW5jbHVkZSAiZGRyM19hMzl4LmgiCiAjZWxzZQpAQCAtODAsMzEgKzgyLDI0MSBAQAogCiAjaWZkZWYgQ09ORklHX0FSTUFEQV8zOFgKIE1WX1VOSVRfSUQgbXZTeXNFbnZTb2NVbml0TnVtc1tNQVhfVU5JVFNfSURdW01BWF9ERVZfSURfTlVNXSA9IHsKLS8qICAgICAgICAgICAgICAgICAgICAgNjgyMCAgICA2ODEwICAgICA2ODExICAgICA2ODI4ICAgICAqLwotLyogUEVYX1VOSVRfSUQgICAgICAqLyB7IDQsICAgICAzLCAgICAgICAzLCAgICAgICA0fSwKLS8qIEVUSF9HSUdfVU5JVF9JRCAgKi8geyAzLAkJMiwgICAgICAgMywgICAgICAgM30sCi0vKiBVU0IzSF9VTklUX0lEICAgICovIHsgMiwgICAgIDIsICAgICAgIDIsICAgICAgIDJ9LAotLyogVVNCM0RfVU5JVF9JRCAgICAqLyB7IDEsICAgICAxLCAgICAgICAxLCAgICAgICAxfSwKLS8qIFNBVEFfVU5JVF9JRCAgICAgKi8geyAyLCAgICAgMiwgICAgICAgMiwgICAgICAgNH0sCi0vKiBRU0dNSUlfVU5JVF9JRCAgICovIHsgMSwgICAgIDAsICAgICAgIDAsICAgICAgIDF9LAotLyogWEFVSV9VTklUX0lEICAgICAqLyB7IDAsICAgICAwLCAgICAgICAwLCAgICAgICAwfSwKLS8qIFJYQVVJX1VOSVRfSUQgICAgKi8geyAwLCAgICAgMCwgICAgICAgMCwgICAgICAgMH0KKy8qICAgICAgICAgICAgICAgICAgICAgNjgyMCAgICA2ODEwICAgICA2ODExICAgICA2ODI4ICAgNlcyMiAgICA2VzIzICovCisvKiAgICAgICAgICAgICAgICAgICAgIEEzODUgICAgQTM4MCAgICAgQTM4MS8yICAgQTM4OCAgIEEzODMgICAgQTM4NCAqLworLyogICAgICAgICAgICAgICAgICAgICA9PT09PT09PT0gSFcgRmxhdm9ycyA9PT09PT09PT0gICA9PSBWaXJ0dWFsID09Ki8KKy8qIFBFWF9VTklUX0lEICAgICAgKi8geyA0LCAgICAgMywgICAgICAgMywgICAgICAgNCwJMiwJMn0sCisvKiBTR01JSV9VTklUX0lEKi8gICAgIHsgMywJMiwgICAgICAgMywgICAgICAgMywJMiwJMn0sCisvKiBVU0IzSF9VTklUX0lEICAgICovIHsgMiwgICAgIDIsICAgICAgIDIsICAgICAgIDIsCTEsCTF9LAorLyogVVNCM0RfVU5JVF9JRCAgICAqLyB7IDEsICAgICAxLCAgICAgICAxLCAgICAgICAxLAkwLAkwfSwKKy8qIFNBVEFfVU5JVF9JRCAgICAgKi8geyAyLCAgICAgMiwgICAgICAgMiwgICAgICAgNCwJMSwJMX0sCisvKiBRU0dNSUlfVU5JVF9JRCAgICovIHsgMSwgICAgIDAsICAgICAgIDAsICAgICAgIDEsCTAsCTB9LAorLyogWEFVSV9VTklUX0lEICAgICAqLyB7IDAsICAgICAwLCAgICAgICAwLCAgICAgICAwLAkwLAkwfSwKKy8qIFJYQVVJX1VOSVRfSUQgICAgKi8geyAwLCAgICAgMCwgICAgICAgMCwgICAgICAgMCwJMCwJMH0KIH07CiAjZWxzZSAgLyogaWYgKENPTkZJR19BUk1BREFfMzlYKSAqLwogTVZfVU5JVF9JRCBtdlN5c0VudlNvY1VuaXROdW1zW01BWF9VTklUU19JRF1bTUFYX0RFVl9JRF9OVU1dID0gewotLyogICAgICAgICAgICAgICAgICAgICAgNjkyMCAgICAgNjkyOCAgICAgKi8KLS8qIFBFWF9VTklUX0lEICAgICAgKi8geyA0LCAgICAgICA0fSwKLS8qIEVUSF9HSUdfVU5JVF9JRCAgKi8geyAzLCAgICAgICA0fSwKLS8qIFVTQjNIX1VOSVRfSUQgICAgKi8geyAxLCAgICAgICAyfSwKLS8qIFVTQjNEX1VOSVRfSUQgICAgKi8geyAwLCAgICAgICAxfSwKLS8qIFNBVEFfVU5JVF9JRCAgICAgKi8geyAwLCAgICAgICA0fSwKLS8qIFFTR01JSV9VTklUX0lEICAgKi8geyAwLCAgICAgICAxfSwKLS8qIFhBVUlfVU5JVF9JRCAgICAgKi8geyAxLCAgICAgICAxfSwKLS8qIFJYQVVJX1VOSVRfSUQgICAgKi8geyAxLAkJICAxfQorLyoJCQkJNjkyMCAgICAgNjkyOCAgICAgKi8KKy8qIFBFWF9VTklUX0lEICAgICAgKi8JCXsgNCwgICAgICAgNH0sCisvKiBTR01JSV9VTklUX0lEICAgICovCQl7IDMsICAgICAgIDR9LAorLyogVVNCM0hfVU5JVF9JRCAgICAqLwkJeyAxLCAgICAgICAyfSwKKy8qIFVTQjNEX1VOSVRfSUQgICAgKi8JCXsgMCwgICAgICAgMX0sCisvKiBTQVRBX1VOSVRfSUQgICAgICovCQl7IDAsICAgICAgIDR9LAorLyogUVNHTUlJX1VOSVRfSUQgICAqLwkJeyAwLCAgICAgICAxfSwKKy8qIFhBVUlfVU5JVF9JRCAgICAgKi8JCXsgMSwgICAgICAgMX0sCisvKiBSWEFVSV9VTklUX0lEICAgICovCQl7IDEsCSAgIDF9CiB9OwogI2VuZGlmCiAKK3N0YXRpYyBNVl9WT0lEIGdwcFJlZ1NldChNVl9VMzIgZ3JvdXAsIE1WX1UzMiByZWdPZmZzLCBNVl9VMzIgbWFzaywgTVZfVTMyIHZhbHVlKQoreworCU1WX1UzMiBncHBEYXRhOwogCisJZ3BwRGF0YSA9IE1WX1JFR19SRUFEKHJlZ09mZnMpOworCisJZ3BwRGF0YSAmPSB+bWFzazsKKworCWdwcERhdGEgfD0gKHZhbHVlICYgbWFzayk7CisKKwlNVl9SRUdfV1JJVEUocmVnT2ZmcywgZ3BwRGF0YSk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudklvRXhwVmFsU2V0IC0gU2V0IFVTQiBWQlVTIHNpZ25hbCB2aWEgR1BJTworKgorKiogSU5QVVQ6CWdwcE5vIC0gR1BJTyBwaW4gbnVtYmVyLgorKiogT1VUUFVUOglOb25lLgorKiogUkVUVVJOOglOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1ZPSUQgbXZTeXNFbnZVc2JWYnVzR3BwUmVzZXQoaW50IGdwcE5vKQoreworCU1WX1UzMiByZWdWYWw7CisKKwkvKiBNUFAgQ29udHJvbCBSZWdpc3RlciAtIHNldCBtcHAgYXMgR1BQICh2YWx1ZSA9IDApKi8KKwlyZWdWYWwgPSBNVl9SRUdfUkVBRChNUFBfQ09OVFJPTF9SRUcoKHVuc2lnbmVkIGludCkoZ3BwTm8gLyA4KSkpOworCXJlZ1ZhbCAmPSB+KDB4ZiA8PCAoKGdwcE5vICUgOCkgKiA0KSk7CisJTVZfUkVHX1dSSVRFKE1QUF9DT05UUk9MX1JFRygodW5zaWduZWQgaW50KShncHBObyAvIDgpKSwgcmVnVmFsKTsKKworCWlmIChncHBObyA8IDMyKSB7CisJCS8qIEdQSU8gRGF0YSBPdXQgRW5hYmxlIENvbnRyb2wgUmVnaXN0ZXIgLSBzZXQgdG8gb3V0cHV0ICovCisJCU1WX1JFR19XUklURShHUFBfREFUQV9PVVRfRU5fUkVHKDApLCAwKTsKKwkJLyogR1BJTyBvdXRwdXQgRGF0YSBWYWx1ZSBSZWdpc3RlciAtIHNldCBhcyBsb3cgKi8KKwkJTVZfUkVHX1dSSVRFKEdQUF9EQVRBX09VVF9SRUcoMCksIDApOworCX0gZWxzZSB7CisJCS8qIEdQSU8gRGF0YSBPdXQgRW5hYmxlIENvbnRyb2wgUmVnaXN0ZXIgLSBzZXQgdG8gb3V0cHV0ICovCisJCU1WX1JFR19XUklURShHUFBfREFUQV9PVVRfRU5fUkVHKDEpLCAwKTsKKwkJLyogR1BJTyBvdXRwdXQgRGF0YSBWYWx1ZSBSZWdpc3RlciAtIHNldCBhcyBsb3cgKi8KKwkJTVZfUkVHX1dSSVRFKEdQUF9EQVRBX09VVF9SRUcoMSksIDApOworCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzRW52SW9FeHBWYWxTZXQgLSBTZXQgVVNCIFZCVVMgc2lnbmFsIGZvciBEQi1HUCBib2FyZCB2aWEgSU8gZXhwYW5kZXIKKyoKKyoqIElOUFVUOglOb25lLgorKiogT1VUUFVUOglOb25lLgorKiogUkVUVVJOOglOb25lLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NUQVRVUyBtdlN5c0VudklvRXhwVXNiVmJ1c1NldChNVl9VOCB2YWx1ZSkKK3sKKwlNVl9VOCByZWFkVmFsLCBjb25maWdWYWwsIG9mZnNldCA9IDc7IC8qIElvIEV4cGFuZGVyIzEgKDB4MjEpLCByZWdpc3RlciMxLCBiaXQgNyAqLworCU1WX1RXU0lfU0xBVkUgdHdzaVNsYXZlOworCisJLyogUmVhZCBiaXRbNF0gaW4gQkMyIGJpb3MwIFNXIFNhdFIgKHJlZ2lzdGVyIDEpICovCisJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOworCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IE1WX0JPQVJEX0lPX0VYUEFOREVSMV9BRERSOworCXR3c2lTbGF2ZS52YWxpZE9mZnNldCA9IE1WX1RSVUU7CisJdHdzaVNsYXZlLm1vcmVUaGVuMjU2ID0gTVZfRkFMU0U7CisKKwl0d3NpU2xhdmUub2Zmc2V0ID0gNzsJLyogZGlyZWN0aW9uIHJlZyAjMSAocmVnaXN0ZXIgNykgZm9yIG91dHB1dC9pbnB1dCBzZXR0aW5nICovCisJaWYgKE1WX09LICE9IG12VHdzaVJlYWQoVFdTSV9DSEFOTkVMX0EzWFgsICZ0d3NpU2xhdmUsICZjb25maWdWYWwsIDEpKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3I6IFJlYWQgQ29uZmlndXJhdGlvbiBmcm9tIElPIEV4cGFuZGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogTW9kaWZ5IGRpcmVjdGlvbiAob3V0cHV0L2lucHV0KSB2YWx1ZSBvZiByZXF1ZXN0ZWQgcGluICovCisJY29uZmlnVmFsICY9IH4oMSA8PCBvZmZzZXQpOwkvKiBvdXRwdXQgbWFya2VkIGFzIDA6IGNsZWFuIGJpdCBvZiBvbGQgdmFsdWUgICovCisKKwlpZiAobXZUd3NpV3JpdGUoVFdTSV9DSEFOTkVMX0EzWFgsICZ0d3NpU2xhdmUsICZjb25maWdWYWwsIDEpICE9IE1WX09LKSB7CisJCS8qIFdyaXRlIGFnYWluIGluIGNhc2UgdGhlIGNvbnRyb2xsZXIgaXMgYnVzeSAqLworCQlpZiAobXZUd3NpV3JpdGUoVFdTSV9DSEFOTkVMX0EzWFgsICZ0d3NpU2xhdmUsICZjb25maWdWYWwsIDEpICE9IE1WX09LKSB7CisJCQltdlByaW50ZigiJXM6IEVycm9yOiBkaXJlY3Rpb24gV3JpdGUgdG8gSU8gRXhwYW5kZXIgYXQgMHgleCBmYWlsZWRcbiIsIF9fZnVuY19fCisJCQkgICAsIE1WX0JPQVJEX0lPX0VYUEFOREVSMV9BRERSKTsKKwkJCXJldHVybiBNVl9FUlJPUjsKKwkJfQorCX0KKworCXR3c2lTbGF2ZS5vZmZzZXQgPSAzOyAJLyogUmVhZCBPdXRwdXQgVmFsdWUgKi8KKwlpZiAoTVZfT0sgIT0gbXZUd3NpUmVhZChUV1NJX0NIQU5ORUxfQTNYWCwgJnR3c2lTbGF2ZSwgJnJlYWRWYWwsIDEpKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3I6IFJlYWQgQ29uZmlndXJhdGlvbiBmcm9tIElPIEV4cGFuZGVyIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogTW9kaWZ5ICovCisJcmVhZFZhbCAmPSB+KDEgPDwgb2Zmc2V0KTsJLyogY2xlYW4gYml0IG9mIG9sZCB2YWx1ZSAgKi8KKwlyZWFkVmFsIHw9ICh2YWx1ZSA8PCBvZmZzZXQpOworCisJaWYgKG12VHdzaVdyaXRlKFRXU0lfQ0hBTk5FTF9BM1hYLCAmdHdzaVNsYXZlLCAmcmVhZFZhbCwgMSkgIT0gTVZfT0spIHsKKwkJLyogV3JpdGUgYWdhaW4gaW4gY2FzZSB0aGUgY29udHJvbGxlciBpcyBidXN5ICovCisJCWlmIChtdlR3c2lXcml0ZShUV1NJX0NIQU5ORUxfQTNYWCwgJnR3c2lTbGF2ZSwgJnJlYWRWYWwsIDEpICE9IE1WX09LKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3I6IGRpcmVjdGlvbiBXcml0ZSB0byBJTyBFeHBhbmRlciBhdCAweCV4IGZhaWxlZFxuIiwgX19mdW5jX18KKwkJCSAgICwgTVZfQk9BUkRfSU9fRVhQQU5ERVIxX0FERFIpOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJfQorCisJcmV0dXJuIE1WX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudlVzYlZidXNSZXNldCAtIFNldCBVU0IgVkJVUyBzaWduYWwgYmVmb3JlIGRldGVjdGlvbgorKgorKiBERVNDUklQVElPTjoKKyogdGhpcyByb3V0aW5lIHNldHMgVkJVUyBzaWduYWwgdmlhIEdQSU8gb3IgdmlhIEkyQyBJTyBleHBhbmRlcgorKgorKiogSU5QVVQ6CWludCAgZGV2IC0gVVNCIEhvc3QgbnVtYmVyCisqKiBPVVRQVVQ6CU5vbmUuCisqKiBSRVRVUk46CU5vbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVk9JRCBtdlN5c0VudlVzYlZidXNSZXNldChNVl9WT0lEKQoreworCU1WXzMyIGksIGdwcE5vOworCU1WX0JPQVJEX1VTQl9WQlVTX0dQSU8gYm9hcmRVc2JWYnVzR3Bpb1tdID0gTVZfQk9BUkRfVVNCX1ZCVVNfR1BJT19JTkZPOworCU1WX1UzMiBib2FyZElkSW5kZXg7CisKKwkvKiBTb21lIG9mIE1hcnZlbGwgYm9hcmRzIGNvbnRyb2wgVkJVUyBzaWduYWwgdmlhIEkyQyBJTyBleHBhbmRlciB1bml0ICovCisjaWZuZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisJLyogaWYgVkJVUyBzaWduYWwgaXMgQ29udHJvbGxlZCB2aWEgSTJDIElPIEV4cGFuZGVyIG9uIGJvYXJkKi8KKwlpZiAobXZCb2FyZElkR2V0KCkgPT0gREJfR1BfNjhYWF9JRCkgeworCQltdlN5c0VudklvRXhwVXNiVmJ1c1NldCgwKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJYm9hcmRJZEluZGV4ID0gbXZCb2FyZElkSW5kZXhHZXQobXZCb2FyZElkR2V0KCkpOworCWlmICghKHNpemVvZihib2FyZFVzYlZidXNHcGlvKS9zaXplb2YoTVZfQk9BUkRfVVNCX1ZCVVNfR1BJTykgPiBib2FyZElkSW5kZXgpKSB7CisJCW12UHJpbnRmKCJcbkZhaWxlZCBsb2FkaW5nIFVTQiBWQlVTIEdQSU8gaW5mb3JtYXRpb24gKGludmFsaWQgYm9hcmQgSUQpXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtdlN5c0VudlVuaXRNYXhOdW1HZXQoVVNCM0hfVU5JVF9JRCk7IGkrKykgeworCQlncHBObyA9IGJvYXJkVXNiVmJ1c0dwaW9bYm9hcmRJZEluZGV4XS51c2JWYnVzR3Bpb1tpXTsKKwkJLyogaWYgVkJVUyBzaWduYWwgaXMgQ29udHJvbGxlZCB2aWEgR1BJTyBvbiBib2FyZCAqLworCQlpZiAoZ3BwTm8gIT0gTVZfRVJST1IpIHsKKwkJCW12U3lzRW52VXNiVmJ1c0dwcFJlc2V0KGdwcE5vKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorfQorCisvKiBtdkJvYXJkRGI2ODIwQW1jVHdzaUNvbmZpZzoKKyAqIGZvciBBTUMgYm9hcmQsIHRvIGFsbG93IGRldGVjdGlvbiBvZiByZW1vdGUgUENJZSBHRU4xL0dFTjIgZW5mb3JjZW1lbnQgc2V0dGluZ3M6CisgKiAxLiBFbmFibGUgZXh0ZXJuYWwgaTJjIGNoYW5uZWwgZm9yIHZpYSBHUElPCisgKiAyLiBEaXNhYmxlIEkyQyBTbGF2ZSBQb3J0MCBvZiBsb2NhbCBBTUMgZGV2aWNlLCB0byBhdm9pZCBidXMgYWRkcmVzcyBjb250ZW50aW9uCisgKi8KK3N0YXRpYyBNVl9WT0lEIG12Qm9hcmREYjY4MjBBbWNUd3NpQ29uZmlnKE1WX1ZPSUQpCit7CisJLyogRGlzYWJsZSBJMkMgU2xhdmUgUG9ydHMgb2YgbG9jYWwgQU1DIGRldmljZSwgdG8gYXZvaWQgYnVzIGFkZHJlc3MgY29udGVudGlvbiovCisJTVZfUkVHX0JJVF9SRVNFVChUV1NJX0NPTkZJR19ERUJVR19SRUcsIFRXU0lfREVCVUdfU0xBVkVfUE9SVDBfRU4pOworCU1WX1JFR19CSVRfUkVTRVQoVFdTSV9DT05GSUdfREVCVUdfUkVHLCBUV1NJX0RFQlVHX1NMQVZFX1BPUlQxX0VOKTsKKworCS8qIEdQUCBjb25maWd1cmF0aW9uIGlzIHJlcXVpcmVkIGZvciBkaXNhYmxpbmcgYWNjZXNzIHRvIGkyYyBjaGFubmVsIDEKKwkgICBPdXRwdXQgZnJvbSBHUFAtNDQgc2hvdWxkIHNldCB0byBiZSBISUdIIGZvciBkaXNhYmxpbmcgZXh0ZXJuYWwKKwkgICBpMmMgY2hhbm5lbCAxIGJ1ZmZlciBjaXJjdWl0CisJICAgVGhlIGVudGlyZSBHUFBzIGNvbmZpZ3VyYXRpb24gaXMgdGhlIHNhbWUgYXMgaW4gdS1ib290ICovCisJLyogU2V0IEdQUCBPdXQgdmFsdWUgKi8KKwlNVl9SRUdfV1JJVEUoR1BQX0RBVEFfT1VUX1JFRygwKSwgQklUMjkpOyAvKiBHUElPMjk6IFFTX1NNSV9FTkEgPSBPVVQgVkFMIEhpZ2ggKi8KKwlNVl9SRUdfV1JJVEUoR1BQX0RBVEFfT1VUX1JFRygxKSwgQklUMTIpOyAvKiBHUElPNDQgKEJJVDEyKSA6IEkyQ19FWFRfRU4gPSBGQUxTRSAoRmFsc2UgPSBPVVQgVkFMIEhpZ2gpICovCisJTVZfUkVHX1dSSVRFKEdQUF9EQVRBX09VVF9SRUcoMiksIDApOworCisJLyogc2V0IEdQUCBwb2xhcml0eSAqLworCWdwcFJlZ1NldCgwLCBHUFBfREFUQV9JTl9QT0xfUkVHKDApLCAweEZGRkZGRkZGLCAweDApOworCWdwcFJlZ1NldCgxLCBHUFBfREFUQV9JTl9QT0xfUkVHKDEpLCAweEZGRkZGRkZGLCAweDApOworCWdwcFJlZ1NldCgyLCBHUFBfREFUQV9JTl9QT0xfUkVHKDIpLCAweEZGRkZGRkZGLCAweDApOworCisJLyogU2V0IEdQUCBPdXQgRW5hYmxlICovCisJLyogR1BJTzI5OiBRU19TTUlfRU5BICovCisJZ3BwUmVnU2V0KDAsIEdQUF9EQVRBX09VVF9FTl9SRUcoMCksIDB4RkZGRkZGRkYsIH4oQklUMjkpKTsKKwkvKiA0NDpJMkNfRVhUX0VOLCA0OSw1MCw1Miw1MzpMZWRzKi8KKwlncHBSZWdTZXQoMSwgR1BQX0RBVEFfT1VUX0VOX1JFRygxKSwgMHhGRkZGRkZGRiwgfihCSVQxMiB8IEJJVDE3IHwgQklUMTggfCBCSVQyMCB8IEJJVDIxKSk7CisJZ3BwUmVnU2V0KDIsIEdQUF9EQVRBX09VVF9FTl9SRUcoMiksIDB4RkZGRkZGRkYsIH4oMHgwKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12Qm9hcmRGb3JjZVBjaWVHZW4xR2V0IC0gcmVhZCBNU1lTIEJDMi9BQzMgU2F0UiBiaW9zMCBiaXRbNF0gZm9yIFBDSWUgR0VOMS9HRU4yIG1vZGUKKyoKKyogREVTQ1JJUFRJT046CisqCisqIElOUFVUOgorKgorKiBPVVRQVVQ6CisqICAgICAgIE5vbmUuCisqCisqIFJFVFVSTjogVFJVRSBpZiBHRU4xIGNvbm5lY3Rpb24gaXMgZW5mb3JjZWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRGb3JjZVBjaWVHZW4xR2V0KE1WX1ZPSUQpCit7CisJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CisJTVZfVFdTSV9BRERSIHNsYXZlOworCU1WX1U4IGRhdGE7CisKKwkvKiBUV1NJIGluaXQgKi8KKwlzbGF2ZS5hZGRyZXNzID0gTVZfQk9BUkRfQ1RSTF9JMkNfQUREUl9CQzI7CisJc2xhdmUudHlwZSAgICA9IEFERFI3X0JJVDsKKwltdlR3c2lJbml0KFRXU0lfQ0hBTk5FTF9BM1hYLCBUV1NJX1NQRUVEX0JDMiwgbXZCb2FyZFRjbGtHZXQoKSwgJnNsYXZlLCAwKTsKKworCS8qIFJlYWQgYml0WzRdIGluIEJDMiBiaW9zMCBTVyBTYXRSIChyZWdpc3RlciAxKSAqLworCXR3c2lTbGF2ZS5zbGF2ZUFkZHIudHlwZSA9IEFERFI3X0JJVDsKKwl0d3NpU2xhdmUuc2xhdmVBZGRyLmFkZHJlc3MgPSBNVl9CT0FSRF9CSU9TMF9BRERSOworCXR3c2lTbGF2ZS5vZmZzZXQgPSAxOyAvKiByZWdpc3RlciAxLCBTVyBTYXRSIGZpZWxkcyAqLworCXR3c2lTbGF2ZS52YWxpZE9mZnNldCA9IE1WX1RSVUU7CisJdHdzaVNsYXZlLm1vcmVUaGVuMjU2ID0gTVZfRkFMU0U7CisKKwlpZiAoTVZfT0sgPT0gbXZUd3NpUmVhZChUV1NJX0NIQU5ORUxfQTNYWCwgJnR3c2lTbGF2ZSwgJmRhdGEsIDEpKSB7CisJCWlmICgoZGF0YSA+PiA0KSAmIDB4MSkKKwkJCXJldHVybiBNVl9UUlVFOworCX0KKworCXJldHVybiBNVl9GQUxTRTsKK30KIAogTVZfVTMyIGdCb2FyZElkID0gLTE7CiBNVl9VMzIgbXZCb2FyZElkR2V0KE1WX1ZPSUQpCkBAIC0xMTcsNiArMzI5LDggQEAKIAkJZ0JvYXJkSWQgPSBDVVNUT01FUl9CT0FSRF9JRDA7CiAJI2VsaWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzEKIAkJZ0JvYXJkSWQgPSBDVVNUT01FUl9CT0FSRF9JRDE7CisJI2VsaWYgQ09ORklHX0NMRUFSRk9HX0JPQVJECisJCWdCb2FyZElkID0gQTM4WF9DTEVBUkZPR19CT0FSRF9JRDsKIAkjZWxpZiBDT05GSUdfR0ZDSDEwMAogCQlnQm9hcmRJZCA9IEdGQ0gxMDBfSUQ7CiAJI2VuZGlmCkBAIC0xNjIsMTMgKzM3NiwyMSBAQAogCiBNVl9VMzIgbXZCb2FyZFRjbGtHZXQoTVZfVk9JRCkKIHsKLQlNVl9VMzIgdmFsdWU7CisJTVZfVTMyIHZhbHVlLCBkZXZJZDsKIAogCXZhbHVlID0gKE1WX01FTUlPX0xFMzJfUkVBRChJTlRFUl9SRUdTX0JBU0UgfCBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMV9SRUcpID4+IDE1KSAmIDB4MTsKIAogCXN3aXRjaCAodmFsdWUpIHsKIAljYXNlICgweDApOgotCQlyZXR1cm4gTVZfQk9BUkRfVENMS18yNTBNSFo7CisJCS8qIFJlYWQgSFcgZGV2aWNlIElEIGZyb20gU0BSOgorCQkgKiBub3RlOiBhdm9pZGluZyByZWFkaW5nIGRldmljZSBJRCBoZXJlIHdpdGggbXZTeXNFbnZEZXZpY2VJZEdldCgpLCBzaW5jZSBpdCBpbmNsdWRlCisJCSAqIHByaW50cywgYW5kIFRXU0kgcmVhZHMsIHdoaWNoIHJlcXVpcmUgVGNsayB2YWx1ZS0tPiByZWFkaW5nIFRjbGsgdmFsdWUgc3RyYWlnaHQgZnJvbSByZWdpc3RlciAqLworCQlkZXZJZCA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRyk7CisJCWRldklkID0gZGV2SWQgPj4gU0FSX0RFVl9JRF9PRkZTICYgU0FSX0RFVl9JRF9NQVNLOworCQlpZiAoZGV2SWQgPT0gTVZfNjgxMSkKKwkJCXJldHVybiBNVl9CT0FSRF9UQ0xLXzE2Nk1IWjsJLyogZGV2aWNlIDM4MS8yICg2ODExLzIxKSB1c2UgMTY2TUh6IGluc3RlYWQgb2YgMjUwTUh6ICovCisJCWVsc2UKKwkJCXJldHVybiBNVl9CT0FSRF9UQ0xLXzI1ME1IWjsKIAljYXNlICgweDEpOgogCQlyZXR1cm4gTVZfQk9BUkRfVENMS18yMDBNSFo7CiAJZGVmYXVsdDoKQEAgLTE4OCw2ICs0MTAsNyBAQAogewogCU1WX1RXU0lfQUREUiBzbGF2ZTsKIAlNVl9VMzIgdENsb2NrOworCiAJaWYgKGZsYWdUd3NpSW5pdCA9PSAtMSkgewogCQlERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NUd3NpSW5pdFdyYXBwZXIgIyMjXG4iKTsKIAkJc2xhdmUudHlwZSA9IEFERFI3X0JJVDsKQEAgLTIwMCw2ICs0MjMsMTIgQEAKIAogCQltdlR3c2lJbml0KDAsIFRXU0lfU1BFRUQsIHRDbG9jaywgJnNsYXZlLCAwKTsKIAkJZmxhZ1R3c2lJbml0ID0gMTsKKworCQkvKiBmb3IgQU1DIGJvYXJkLCB0byBhbGxvdyBkZXRlY3Rpb24gb2YgcmVtb3RlIFBDSWUgR0VOMS9HRU4yIGVuZm9yY2VtZW50IHNldHRpbmdzOgorCQkgICAxLiBFbmFibGUgZXh0ZXJuYWwgaTJjIGNoYW5uZWwgZm9yIHZpYSBHUElPCisJCSAgIDIuIERpc2FibGUgSTJDIFNsYXZlIFBvcnQwIG9mIGxvY2FsIEFNQyBkZXZpY2UsIHRvIGF2b2lkIGJ1cyBhZGRyZXNzIGNvbnRlbnRpb24gKi8KKwkJaWYgKG12Qm9hcmRJZEdldCgpID09IERCX0FNQ182ODIwX0lEKQorCQkJbXZCb2FyZERiNjgyMEFtY1R3c2lDb25maWcoKTsKIAl9CiAJcmV0dXJuIE1WX09LOwogfQpAQCAtMjUwLDYgKzQ3OSwzNCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZQorKgorKiBERVNDUklQVElPTjogQ2hlY2sgdGhlIG1hZ2ljIHdha2V1cCBlbmFibGVkCisqCisqIElOUFVUOiBOb25lCisqCisqIE9VVFBVVDogTm9uZQorKgorKiBSRVRVUk46CisqICAgICAgIE1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVEIG9yIE1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVECisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1VTUEVORF9XQUtFVVBfU1RBVFVTIG12U3lzRW52Q2hlY2tXYWtldXBEcmFtRW5hYmxlKHZvaWQpCit7CisJaW50ICpib290X2luZm8gPSAoaW50KikoQk9PVF9JTkZPX0FERFIpOworCWludCAgbWFnaWNfd29yZDsKKworCW1hZ2ljX3dvcmQgPSAgKihib290X2luZm8pOworCisJaWYobWFnaWNfd29yZCA9PSBTVVNQRU5EX01BR0lDX1dPUkQpIHsKKwkJcmV0dXJuIE1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVEOworCX0KKwllbHNleworCQlyZXR1cm4gTVZfU1VTUEVORF9XQUtFVVBfRElTQUJMRUQ7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdkN0cmxEZXZJZEluZGV4R2V0CiAqCiAqIERFU0NSSVBUSU9OOiByZXR1cm4gU09DIGRldmljZSBpbmRleApAQCAtMjY1LDYgKzUyMiw3IEBACiBNVl9VMzIgbXZTeXNFbnZJZEluZGV4R2V0KE1WX1UzMiBjdHJsTW9kZWwpCiB7CiAJc3dpdGNoIChjdHJsTW9kZWwpIHsKKwkvKiBIVyBmbGF2b3JzIC0gcmVwcmVzZW50ZWQgYnkgZGV2aWQgYml0cyBpbiBTQFIgQCAweDE4NjAwICovCiAJY2FzZSBNVl82ODIwX0RFVl9JRDoKIAkJcmV0dXJuIE1WXzY4MjBfSU5ERVg7CiAJY2FzZSBNVl82ODEwX0RFVl9JRDoKQEAgLTI3Nyw2ICs1MzUsMTEgQEAKIAkJcmV0dXJuIE1WXzY5MjBfSU5ERVg7CiAJY2FzZSBNVl82OTI4X0RFVl9JRDoKIAkJcmV0dXJuIE1WXzY5MjhfSU5ERVg7CisJLyogVmlydHVhbCBmbGF2b3JzIC0gbm90IHJlcHJlc2VudGVkIGJ5IGRldiBJRCBiaXRzIGluIFNAUiBAIDB4MTg2MDAgKi8KKwljYXNlIE1WXzZXMjJfREVWX0lEOiAvKiA2VzIyPUEzODMgKi8KKwkJcmV0dXJuIE1WXzZXMjJfSU5ERVg7CisJY2FzZSBNVl82VzIzX0RFVl9JRDogLyogNlcyMz1BMzg0ICovCisJCXJldHVybiBNVl82VzIzX0lOREVYOwogCWRlZmF1bHQ6CiAJCXJldHVybiBNVl82ODIwX0lOREVYOwogCX0KQEAgLTMwNiwxMiArNTY5LDE2IEBACiAJY3RybElkID0gKGN0cmxJZCAmIChERVZfSURfUkVHX0RFVklDRV9JRF9NQVNLKSkgPj4gREVWX0lEX1JFR19ERVZJQ0VfSURfT0ZGUzsKIAogCXN3aXRjaCAoY3RybElkKSB7CisJLyogSFcgZmxhdm9ycyAtIHJlcHJlc2VudGVkIGJ5IGRldmlkIGJpdHMgaW4gU0BSIEAgMHgxODYwMCAqLwogCWNhc2UgTVZfNjgyMF9ERVZfSUQ6CiAJY2FzZSBNVl82ODEwX0RFVl9JRDoKIAljYXNlIE1WXzY4MTFfREVWX0lEOgogCWNhc2UgTVZfNjgyOF9ERVZfSUQ6CiAJY2FzZSBNVl82OTIwX0RFVl9JRDoKIAljYXNlIE1WXzY5MjhfREVWX0lEOgorCS8qIFZpcnR1YWwgZmxhdm9ycyAtIG5vdCByZXByZXNlbnRlZCBieSBkZXYgSUQgYml0cyBpbiBTQFIgQCAweDE4NjAwICovCisJY2FzZSBNVl82VzIyX0RFVl9JRDogLyogNlcyMj1BMzgzICovCisJY2FzZSBNVl82VzIzX0RFVl9JRDogLyogNlcyMz1BMzg0ICovCiAJCXJldHVybiBjdHJsSWQ7CiAJZGVmYXVsdDogLypEZXZpY2UgSUQgRGVmYXVsdCBmb3IgQTM4eDogNjgyMCAsIGZvciBBMzl4OiA2OTIwICovCiAJI2lmZGVmIE1WODhGNjhYWApAQCAtMzIzLDI2ICs1OTAsOTQgQEAKIAkJcmV0dXJuIGRlZmF1bHRDdHJsSWQ7CiAJfQogfQorI2lmbmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlN5c0VudklzRmxhdm91clJlZHVjZWQKKyogREVTQ1JJUFRJT046CQlSZWR1Y2VkIEZsYXZvciBBMzgzL0EzODQgaXMgc2ltdWxhdGVkIG9uCisqCQkJREItR1AvREItMzgxLzIuIGNvbmZpZ3VyZWQgYnkgU2F0UiBmaWVsZCAnZmxhdm9yJworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WXzE2IGlzRmxhdm9yUmVkdWNlZCA9IC0xOworc3RhdGljIE1WXzE2IG12U3lzRW52SXNGbGF2b3VyUmVkdWNlZChNVl9WT0lEKQoreworCU1WX1RXU0lfU0xBVkUgdHdzaVNsYXZlOworCU1WX1U4IHJlZHVjZWRWYWw7CiAKKwlpZiAoaXNGbGF2b3JSZWR1Y2VkICE9IC0xKQorCQlyZXR1cm4gaXNGbGF2b3JSZWR1Y2VkOyAvKiByZWFkIGxhc3QgdmFsdWUgaWYgYWxyZWFkeSByZWFkIGZyb20gRUVQUk9NICovCisKKwl0d3NpU2xhdmUuc2xhdmVBZGRyLmFkZHJlc3MgPSBFRVBST01fSTJDX0FERFI7CisJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOworCXR3c2lTbGF2ZS52YWxpZE9mZnNldCA9IE1WX1RSVUU7CisJdHdzaVNsYXZlLm1vcmVUaGVuMjU2ID0gTVZfVFJVRTsKKwl0d3NpU2xhdmUub2Zmc2V0ID0gMjsJCS8qIFNXIEVFUFJPTSwgcmVnaXN0ZXIgMiwgYml0IDQgKi8KKworCWlmIChtdlR3c2lSZWFkKDAsICZ0d3NpU2xhdmUsICZyZWR1Y2VkVmFsLCAxKSAhPSBNVl9PSykgeworCQltdlByaW50ZigiJXM6IFRXU0kgUmVhZCBvZiAnZmxhdm9yJyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCWlzRmxhdm9yUmVkdWNlZCA9ICEoKHJlZHVjZWRWYWwgJiBTQVRSX0RFVklDRV9GTEFWT1JfTUFTSykgPj4gU0FUUl9ERVZJQ0VfRkxBVk9SX09GRlNFVCk7CisKKworCXJldHVybiBpc0ZsYXZvclJlZHVjZWQ7Cit9CisjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZTeXNFbnZEZXZpY2VJZEdldAotKiBERVNDUklQVElPTjoJIAlSZXR1cm5zIGVudW0gKDAuLjcpIGluZGV4IG9mIHRoZSBkZXZpY2UgbW9kZWwgKElEKQorKiBERVNDUklQVElPTjoJUmV0dXJucyBlbnVtOgorKgkJCSgwLi43KSBpbmRleCBvZiB0aGUgZGV2aWNlIG1vZGVsIChJRCkKKyoJCQkoOC4uKSBpbmRleCBvZiB0aGUgdmlydHVhbCBkZXZpY2UgbW9kZWwgKElEKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBnRGV2SWQgPSAtMTsKIE1WX1UzMiBtdlN5c0VudkRldmljZUlkR2V0KE1WX1ZPSUQpCiB7Ci0JY2hhciAqZGV2aWNlSWRTdHJbN10gPSB7ICI2ODEwIiwgIjY4MjAiLCAiNjgxMSIsICI2ODI4IiwKLQkJCQkiTk9ORSIsICI2OTIwIiwgIjY5MjgiIH07CisJY2hhciAqZGV2aWNlSWRTdHJbMTBdID0geyAiNjgxMCIsICI2ODIwIiwgIjY4MTEiLCAiNjgyOCIsCisJCQkJIk5PTkUiLCAiNjkyMCIsICI2OTI4IiwgIk1BWF9IV19ERVZfSUQiLAorCQkJCSI2VzIyIiwgIjZXMjMifTsgLyogNlcyMj1BMzgzLCA2VzIzPUEzODQgKi8KKyNpZm5kZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQKKwlNVl9VMzIgYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOworI2VuZGlmCiAKIAlpZiAoZ0RldklkICE9IC0xKQogCQlyZXR1cm4gZ0RldklkOwogCisJLyogcmVhZCBIVyBkZXZpY2UgSUQgdmFsdWUgKi8KIAlnRGV2SWQgPSBNVl9SRUdfUkVBRChERVZJQ0VfU0FNUExFX0FUX1JFU0VUMV9SRUcpOwogCWdEZXZJZCA9IGdEZXZJZCA+PiBTQVJfREVWX0lEX09GRlMgJiBTQVJfREVWX0lEX01BU0s7CisJLyogVmlydHVhbCBSZWR1Y2VkIGZsYXZvciBEZXZpY2UgSURzIDoKKwkJLSBIYXJkd2FyZSBEZXZpY2UgSUQncyByZXByZXNlbnRlZCBieSBpbmRleCAwLi43CisJCS0gVmlydHVhbCBEZXZpY2UgSUQncyByZXByZXNlbnRlZCBieSBpbmRleCA4Li4KKwkJLSBDdXN0b21lciBib2FyZHM6IHJlZHVjZWQgZmxhdm9yIElEIGRlZmluZWQgYnkgUkVEVUNFRF9GTEFWT1IgdmFsdWUuCisJCS0gTWFydmVsbCBib2FyZHM6IFJlZHVjZWQgRmxhdm9yIEEzODMvQTM4NCBpcyBzaW11bGF0ZWQgb24gREItR1AvREItMzgxLzIKKwkJICBvbmx5IChjb25maWd1cmVkIGJ5IFNhdFIgZmllbGQgJ2ZsYXZvcicpLgorCSAqLworI2lmIGRlZmluZWQoQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQpCisjaWZkZWYgUkVEVUNFRF9GTEFWT1IKKwlpZiAoUkVEVUNFRF9GTEFWT1IgPT0gMHgzODMpCisJCWdEZXZJZCA9IE1WXzZXMjI7CisJZWxzZSBpZiAoUkVEVUNFRF9GTEFWT1IgPT0gMHgzODQpCisJCWdEZXZJZCA9IE1WXzZXMjM7CisjZW5kaWYKKyNlbHNlCisJaWYgKG12U3lzRW52SXNGbGF2b3VyUmVkdWNlZCgpID09IDEpIHsKKwkJaWYgKGJvYXJkSWQgPT0gREJfR1BfNjhYWF9JRCB8fCBib2FyZElkID09IERCXzY4WFhfSUQKKwkJCQl8fCBib2FyZElkID09IERCX0FQXzY4WFhfSUQpIHsKKwkJCWlmIChnRGV2SWQgIT0gTVZfNjgxMCkgLyogc2ltdWxhdGUgNlcyMyhBMzg0KSBvbmx5IG9uIDY4MjAoQTM4NSkgb3IgNjgyOChBMzg4KSAqLworCQkJCWdEZXZJZCA9IE1WXzZXMjM7CisJCQllbHNlIHsKKwkJCQltdlByaW50ZigiJXM6IEVycm9yOiBBMzg0ICg2VzIzKSBjYW4gbm90IHJ1biB3aXRoIGRldmljZSAiLCBfX2Z1bmNfXyk7CisJCQkJbXZQcmludGYoImlkIEEzODAgKDY4MTApXG50byBzZXQgQTM4NCxydW4gJ1NhdFIgIik7CisJCQkJbXZQcmludGYoIndyaXRlIGRldmlkIDMnIE9SICdTYXRSIHdyaXRlIGRldmlkIDEnXG4iKTsKKwkJCX0KKwkJfQorCQllbHNlIGlmIChib2FyZElkID09IERCX0JQXzY4MjFfSUQpCisJCQlnRGV2SWQgPSBNVl82VzIyOworCX0KKyNlbmRpZgogCW12UHJpbnRmKCJEZXRlY3RlZCBEZXZpY2UgSUQgJXNcbiIgLGRldmljZUlkU3RyW2dEZXZJZF0pOwogCXJldHVybiBnRGV2SWQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZTeXNFbnZEZXZpY2VSZXZHZXQgLSBHZXQgTWFydmVsbCBjb250cm9sbGVyIGRldmljZSByZXZpc2lvbiBudW1iZXIKICoKQEAgLTM4MiwxNyArNzE3LDkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9EUkFNX0RMQl9DT05GSUcgICptdlN5c0VudkRsYkNvbmZpZ1B0ckdldChNVl9WT0lEKQogewotI2lmZGVmIE1WODhGNjlYWAotCXJldHVybiAoJmRkcjNEbGJDb25maWdUYWJsZV9BMFswXSk7Ci0jZWxzZQotCWlmIChtdlN5c0VudkRldmljZVJldkdldCgpID09IE1WXzg4RjY4WFhfQTBfSUQpCi0JCXJldHVybiAoJmRkcjNEbGJDb25maWdUYWJsZV9BMFswXSk7Ci0JZWxzZQotCQlyZXR1cm4gKCZkZHIzRGxiQ29uZmlnVGFibGVbMF0pOwotI2VuZGlmCisJcmV0dXJuICgmZGRyM0RsYkNvbmZpZ1RhYmxlWzBdKTsKIH0KIAotCiAjaWZkZWYgQ09ORklHX0NNRF9CT0FSRENGRwogTVZfQk9BUkRfQ09ORklHX1RZUEVfSU5GTyBib2FyZENvbmZpZ1R5cGVzSW5mb1tdID0gTVZfRUVQUk9NX0NPTkZJR19JTkZPOwogTVZfVTggYm9hcmRPcHRpb25zQ29uZmlnW01WX0NPTkZJR19UWVBFX01BWF9PUFRJT05dOwpAQCAtODMxLDcgKzExNTgsNyBAQAogewogCU1WX0JPQVJEX0NPTkZJR19UWVBFX0lORk8gY29uZmlnSW5mbzsKIAotCWlmIChjb25maWdGaWVsZCA8IE1WX0NPTkZJR19UWVBFX01BWF9PUFRJT04gJiYKKwlpZiAoY29uZmlnRmllbGQgPj1NVl9DT05GSUdfVFlQRV9NQVhfT1BUSU9OIHx8CiAJCW12U3lzRW52Q29uZmlnVHlwZUdldChjb25maWdGaWVsZCwgJmNvbmZpZ0luZm8pICE9IE1WX1RSVUUpIHsKIAkJREVCVUdfSU5JVF9TKCJtdlN5c0VudkNvbmZpZ0dldDogRXJyb3I6IFJlcXVlc3RlZCBib2FyZCBjb25maWcgaXMgaW52YWxpZCBmb3IgdGhpcyBib2FyZFxuIik7CiAJCXJldHVybiBNVl9FUlJPUjsKQEAgLTEwMTIsMyArMTMzOSwxMSBAQAogewogCXJldHVybiBNVl9SRUdfUkVBRChSRUdfRERSM19SQU5LX0NUUkxfQUREUikgJiBSRUdfRERSM19SQU5LX0NUUkxfQ1NfRU5BX01BU0s7CiB9CisKKy8qIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6OgorICogQTM4eC9BMzl4IHN1cHBvcnQgMjVNaHogYXMgcmVmLmNsb2NrIGZvciB0aW1lcgorICovCitNVl9CT09MIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KHZvaWQpCit7CisJcmV0dXJuIE1WX1RSVUU7Cit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2EzOHgvbXZTeXNFbnZMaWIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5oCmluZGV4IDc3OTgyZDUuLjU4MjllMzIgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYTM4eC9tdlN5c0VudkxpYi5oCkBAIC04NiwxNSArODYsMjUgQEAKICNkZWZpbmUgREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHICAgICAgICAgICAgIDB4MTg2MDQKICNkZWZpbmUgREVWX0lEX1JFRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgyMzgKIAorI2RlZmluZSBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUdfUkVGQ0xLX09GRlNFVAkwCisjZGVmaW5lIERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfMjVNSFoJMAorI2RlZmluZSBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUdfUkVGQ0xLXzQwTUhaCTEKKwogI2RlZmluZSBDT1JFX1BMTF9QQVJBTUVURVJTX1JFRyAgICAgICAgICAgICAgICAgMHhFNDJFMAogI2RlZmluZSBDT1JFX1BMTF9DT05GSUdfUkVHICAgICAgICAgICAgICAgICAgICAgMHhFNDJFNAogCiAjZGVmaW5lIFFTR01JSV9DT05UUk9MX1JFRzEgICAgICAgICAgICAgICAgICAgICAweDE4NDk0CiAKKyNkZWZpbmUgVVNCM19DT05GSUdfUkVHCQkJCTB4MTg0MjAKKworI2RlZmluZSBEQkdfUE9SVF9DT05GSUdfUkVHCQkJMHgxODZjMAorI2RlZmluZSBEQkdfUE9SVF9DT05GSUcyX1JFRwkJCTB4MTg2YzQKKwogI2RlZmluZSBERVZfSURfUkVHX0RFVklDRV9JRF9PRkZTICAgICAgICAgICAgICAgMTYKICNkZWZpbmUgREVWX0lEX1JFR19ERVZJQ0VfSURfTUFTSyAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKIAotCisjZGVmaW5lIFNBUl9GUkVRX09GRlNFVCAJCQkJCQkxMAorI2RlZmluZSBTQVJfRlJFUV9NQVNLICAJCQkJCQkJMHgxRgogI2RlZmluZSBTQVJfREVWX0lEX09GRlMgICAgICAgICAgICAgICAgICAgICAgICAgMjcKICNkZWZpbmUgU0FSX0RFVl9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4NwogCkBAIC0xMTAsNiArMTIwLDcgQEAKICNkZWZpbmUgTUlTQ19SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAxM0MKICNkZWZpbmUgR0xVRV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAxNDAKICNkZWZpbmUgR0VORVJBVElPTl9ESVZJREVSX0ZPUkNFX1JFRyAgICAgICAgICAgIDB4YTAxNDQKKyNkZWZpbmUgUExMSU5UUF9SRUcxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAxNTAKICNkZWZpbmUgUENJRV9SRUcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAxMjAKICNkZWZpbmUgTEFORV9BTElHTl9SRUcwICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTAxMjQKICNkZWZpbmUgU1FVRUxDSF9GRkVfU0VUVElOR19SRUcgICAgICAgICAgICAgICAgIDB4YTAwMTgKQEAgLTEzMywxMCArMTQ0LDEyIEBACiAjZGVmaW5lIFJYX1JFRzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwMTg4CiAjZGVmaW5lIFBDSUVfUkVHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwMjg4CiAjZGVmaW5lIFBDSUVfUkVHMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwMjkwCisjZGVmaW5lIExBTkVfQ0ZHMF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwNjAwCiAjZGVmaW5lIExBTkVfQ0ZHMV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwNjA0CiAjZGVmaW5lIExBTkVfQ0ZHNF9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwNjIwCiAjZGVmaW5lIExBTkVfQ0ZHNV9SRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEwNjI0CiAjZGVmaW5lIEdMT0JBTF9DTEtfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAweGEwNzA0CisjZGVmaW5lIEdMT0JBTF9URVNUX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAweGEwNzA4CiAjZGVmaW5lIEdMT0JBTF9NSVNDX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAweGEwNzE4CiAjZGVmaW5lIEdMT0JBTF9DTEtfU1JDX0hJICAgICAgICAgICAgICAgICAgICAgICAweGEwNzEwCiAKQEAgLTE3NCw3ICsxODcsNiBAQAogI2RlZmluZSBSRUZfQ0xLX1NFTEVDVE9SX1ZBTChyZWdWYWwpICAgICAgICAgICAgKHJlZ1ZhbCAmIDB4MSkKIAogI2RlZmluZSBNQVhfU0VMRUNUT1JfVkFMICAgICAgICAgICAgICAgICAgICAgICAgMTAKLQogLyogVFdTSSBhZGRyZXNzZXMgKi8KIC8qIHN0YXJ0aW5nIGZyb20gQTM4eCBBMCwgaTJjIGFkZHJlc3Mgb2YgRUVQUk9NIGlzIDB4NTcgKi8KICNpZmRlZiBNVjg4RjY5WFgKQEAgLTE4Nyw2ICsxOTksOSBAQAogI2RlZmluZSBEQl9HRVRfTU9ERV9TTE0xMzY0X0FERFIgICAgICAgICAgICAgICAgMHgyNAogI2RlZmluZSBEQjM4MV9HRVRfTU9ERV9TTE0xNDI2XzE0MjdfQUREUgkweDU2CiAKKyNkZWZpbmUgU0FUUl9ERVZJQ0VfRkxBVk9SX01BU0sJCQkweDEwIC8qIERCLUdQICYgREItMzgxLzIgYm9hcmRzIDogU2F0UiBmaWVsZCAnZmxhdm9yJyovCisjZGVmaW5lIFNBVFJfREVWSUNFX0ZMQVZPUl9PRkZTRVQJCTQKKwogLyogREItQlAgQm9hcmQgJ1NhdFInIG1hcHBpbmcgKi8KICNkZWZpbmUgU0FUUl9EQl9MQU5FMV9NQVhfT1BUSU9OUwkJNwogI2RlZmluZSBTQVRSX0RCX0xBTkUxX0NGR19NQVNLCQkJMHg3CkBAIC0yMTMsMTQgKzIyOCw2OCBAQAogI2RlZmluZSBBVlNfREVCVUdfQ05UUl9SRUcgICAgICAgICAgICAgIDB4RTQxMjQKICNkZWZpbmUgQVZTX0RFQlVHX0NOVFJfREVGQVVMVF9WQUxVRSAgICAweDA4MDA4MDczCiAKKyNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAorCSNkZWZpbmUgQVZTX0xJTUlUX1ZBTF9TTE9XCQkweDIzCS8qMS4xNVYqLworCSNkZWZpbmUgRUZVU0VfV0lOX0NUUkxfVkFMCQkoKDB4RiA8PCAxNikgfCAoMHgwQSA8PCA4KSB8ICgweEUgPDwgNCkgfCAweDEpCisJI2RlZmluZSBFRlVTRV9XSU5fQkFTRV9WQUwJCTB4QjAwMDAwMDAKKwkjZGVmaW5lIE1WX0VGVVNFX1JFR19SRUFEKG9mZnNldCkJXAorCQlNVl9NRU1JT19MRTMyX1JFQUQoRUZVU0VfV0lOX0JBU0VfVkFMIHwgKG9mZnNldCkpCisJI2RlZmluZSBFRlVTRV9XSU5fSUQJCQkJNQorCisJI2RlZmluZSBFRlVTRV9SRUdfQkFTRQkJCTB4RjhGMDAKKwkjZGVmaW5lIEVGVVNFX0FWU19BTkRfQklOX1JFRwkJKEVGVVNFX1JFR19CQVNFICsgMHhDKQorCSNkZWZpbmUgRUZVU0VfQVZTX1ZBTF9CQVNFCQk2CisJI2RlZmluZSBFRlVTRV9BVlNfVkFMX09GRlNFVAkJOAorCSNkZWZpbmUgRUZVU0VfQVZTX1ZBTF9NQVNLCQkweEZGCisJI2RlZmluZSBFRlVTRV9BVlNfVkVSU0lPTl9SRUcJCShFRlVTRV9SRUdfQkFTRSArIDB4OCkKKwkjZGVmaW5lIEVGVVNFX0FWU19WRVJTSU9OX09GRlNFVAkyNAorCSNkZWZpbmUgRUZVU0VfQVZTX1ZFUlNJT05fTUFTSwkJMHhGCisJI2RlZmluZSBFRlVTRV9BVlNfQklOX09GRlNFVAkJNAorCSNkZWZpbmUgRUZVU0VfQVZTX0JJTl9NQVNLCQkweDMKKwkjZGVmaW5lIE1WX0FWU19ERUZBVUxUX1ZBTFVFCQkweDI3CS8qIDEuMjVWICovCisJdHlwZWRlZiBzdHJ1Y3QgYm9hcmRBdnNGcm9tRWZ1c2VNYXAgeworCQlNVl8zMiBjcHVfZnJlcV9tb2RlOworCQlNVl8zMiBjcHVfZnJlcTsKKwkJTVZfMzIgYXZzX2Jpbl92YWx1ZTsKKwl9IE1WX0JPQVJEX0FWU19FRlVTRV9NQVA7CisJLyogcHJlZGVmaW5lZCB2YWx1ZXMgZm9yIEZVTkNUSU9OX0VOQUJMRV9DT05UUk9MIHBlciBmbGF2b3VyICovCisJI2RlZmluZSBFRlVTRV9GUkVRX1ZBTF9TSVpFCQkzCisJI2RlZmluZSBFRlVTRV9BVlNfVkFMX09GRlNFVF9BVF9JTkQoaW5kZXgpIChFRlVTRV9BVlNfVkFMX0JBU0UgKyBcCisJCQkJCQkgICAoRUZVU0VfRlJFUV9WQUxfU0laRSAtIChpbmRleCsxKSkqRUZVU0VfQVZTX1ZBTF9PRkZTRVQpCisJI2RlZmluZSBFRlVTRV9GUkVRX1ZBTF9JTkZPIHtcCisJLyoJCUNQVSBmcmVxdWVuY3kgbW9kZSwJQ1BVIEZyZXF1ZWNueSwJQVZTX0JJTl9WQUxVRSAqL1wKKwkvKiAxNjAwTUh6ICovCXsweEMsCQkJMTYwMCwJCTB4M30sXAorCS8qIDE4NjZNSFogKi8JezB4MTAsCQkJMTg2NiwJCTB4Mn0sXAorCS8qIDIwMDBNSFogKi8JezB4MTMsCQkJMjAwMCwJCTB4MX0sXAorCX07CisjZWxzZQorCSNkZWZpbmUgQVZTX0xJTUlUX1ZBTAkJCTB4MjcKKyNlbmRpZgorLyogREZYIFNlcnZlciBnZW5lcmFsIHJlZ2lzdGVycyBtYXBwaW5nIChvbiB0b3Agb2YgaW50ZXJuYWwgcmVnaXN0ZXJzKSAqLworI2RlZmluZSBERlhfUkVHX0JBU0UJCQkJMHhFNDAwMAorI2RlZmluZSBERlhfUElQRV9TRUxFQ1RfUElQRTBfQUNUSVZFX09GRlMJMAorLyogREZYX1BJUEVfU0VMRUNUX1hCQVJfQ0xJRU5UX1NFTF9PRkZTOgorICogU2luY2UgYWRkcmVzcyBjb21wbGV0aW9uIGluIDE0Yml0IGFkZHJlc3MgbW9kZSwgYW5kIGdpdmVuIHRoYXQgWzE0OjhdID0+IFsxOToxM10sCisgKiB0aGUgMiBsb3dlciBiaXRzIFs5OjhdID0+IFsxNDoxM10gYXJlIGRpc21pc3NlZC4gaGVuY2UgZmllbGQgb2Zmc2V0IGlzIGFsc28gc2hpZnRlZCB0byAxMCAqLworI2RlZmluZSBERlhfUElQRV9TRUxFQ1RfWEJBUl9DTElFTlRfU0VMX09GRlMJMTAKKyNkZWZpbmUgREZYX1BJUEVfU0VMRUNUX1ZBTAkgICAgICAgIAkoMHgxIDw8IERGWF9QSVBFX1NFTEVDVF9QSVBFMF9BQ1RJVkVfT0ZGUyBcCisJCQkJCQkJfCAweDEgPDwgREZYX1BJUEVfU0VMRUNUX1hCQVJfQ0xJRU5UX1NFTF9PRkZTKQorCisjZGVmaW5lIFJUQ19NRU1PUllfQ1RSTF9SRUdfQkFTRQkJMHhFNjAwMAorI2RlZmluZSBSVENfTUVNT1JZX1dSQVBQRVJfQ09VTlQJCTgKKyNkZWZpbmUgUlRDX01FTU9SWV9XUkFQUEVSX1JFRyhpKQkJKFJUQ19NRU1PUllfQ1RSTF9SRUdfQkFTRSArIChpICogMHg0MCkpCisjZGVmaW5lIFJUQ19NRU1PUllfQ1RSTF9SVENfRklFTERfT0ZGUwkJMworI2RlZmluZSBSVENfTUVNT1JZX0NUUkxfUERMVk1DX0ZJRUxEX09GRlMJNgorI2RlZmluZSBSVENfTUVNT1JZX1dSQVBQRVJfQ1RSTF9WQUwJICAgICAgICAoMHgxIDw8IFJUQ19NRU1PUllfQ1RSTF9SVENfRklFTERfT0ZGUyBcCisJCQkJCQkJfCAweDEgPDwgUlRDX01FTU9SWV9DVFJMX1BETFZNQ19GSUVMRF9PRkZTKQorCiAjZGVmaW5lIEFWU19FTkFCTEVEX0NPTlRST0wgICAgICAgICAgICAgMHhFNDEzMAogI2RlZmluZSBBVlNfTE9XX1ZERF9MSU1JVF9PRkZTICAgICAgICAgIDQKICNkZWZpbmUgQVZTX0xPV19WRERfTElNSVRfTUFTSyAgICAgICAgICAoMHhmZiA8PCBBVlNfTE9XX1ZERF9MSU1JVF9PRkZTKQotI2RlZmluZSBBVlNfTE9XX1ZERF9MSU1JVF9WQUwgICAgICAgICAgICgweDI3IDw8IEFWU19MT1dfVkREX0xJTUlUX09GRlMpCiAKICNkZWZpbmUgQVZTX0hJR0hfVkREX0xJTUlUX09GRlMgICAgICAgICAxMgogI2RlZmluZSBBVlNfSElHSF9WRERfTElNSVRfTUFTSyAgICAgICAgICgweGZmIDw8IEFWU19ISUdIX1ZERF9MSU1JVF9PRkZTKQotI2RlZmluZSBBVlNfSElHSF9WRERfTElNSVRfVkFMICAgICAgICAgICgweDI3IDw8IEFWU19ISUdIX1ZERF9MSU1JVF9PRkZTKQorCiAKIC8qIEJvYXJkIElEIG51bWJlcnMgKi8KICNkZWZpbmUgTUFSVkVMTF9CT0FSRF9JRF9NQVNLCQkJMHgxMApAQCAtMjI4LDggKzI5Nyw5IEBACiAjZGVmaW5lIEEzOFhfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRQkJMHgwCiAjZGVmaW5lIEEzOFhfQ1VTVE9NRVJfQk9BUkRfSUQwCQkJKEEzOFhfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDApCiAjZGVmaW5lIEEzOFhfQ1VTVE9NRVJfQk9BUkRfSUQxCQkJKEEzOFhfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDEpCi0jZGVmaW5lIEEzOFhfR0ZDSDEwMF9JRAkJCQkoQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMikKLSNkZWZpbmUgQTM4WF9NVl9NQVhfQ1VTVE9NRVJfQk9BUkRfSUQJCShBMzhYX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UgKyAzKQorI2RlZmluZSBBMzhYX0NMRUFSRk9HX0JPQVJEX0lECQkJKEEzOFhfQ1VTVE9NRVJfQk9BUkRfSURfQkFTRSArIDIpCisjZGVmaW5lIEEzOFhfR0ZDSDEwMF9JRAkJCQkoQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFICsgMykKKyNkZWZpbmUgQTM4WF9NVl9NQVhfQ1VTVE9NRVJfQk9BUkRfSUQJCShBMzhYX0NVU1RPTUVSX0JPQVJEX0lEX0JBU0UgKyA0KQogI2RlZmluZSBBMzhYX01WX0NVU1RPTUVSX0JPQVJEX05VTQkJKEEzOFhfTVZfTUFYX0NVU1RPTUVSX0JPQVJEX0lEIC0gQTM4WF9DVVNUT01FUl9CT0FSRF9JRF9CQVNFKQogCiAvKiBNYXJ2ZWxsIGJvYXJkcyBmb3IgQTM4eCovCkBAIC0yOTksNiArMzY5LDcgQEAKICNkZWZpbmUgTVBQX0NPTlRST0xfUkVHKGlkKSAgICAgICAgICAgICAgICAgICAgICgweDE4MDAwICsgKGlkICogNCkpCiAjZGVmaW5lIEdQUF9EQVRBX09VVF9SRUcoZ3JwKQkJCShNVl9HUFBfUkVHU19CQVNFKGdycCkgKyAweDAwKQogI2RlZmluZSBHUFBfREFUQV9PVVRfRU5fUkVHKGdycCkJCShNVl9HUFBfUkVHU19CQVNFKGdycCkgKyAweDA0KQorI2RlZmluZSBHUFBfREFUQV9JTl9QT0xfUkVHKGdycCkJCShNVl9HUFBfUkVHU19CQVNFKGdycCkgKyAweDBDKQogI2RlZmluZSBHUFBfREFUQV9JTl9SRUcoZ3JwKQkJCShNVl9HUFBfUkVHU19CQVNFKGdycCkgKyAweDEwKQogI2RlZmluZSBNVl9HUFBfUkVHU19CQVNFKHVuaXQpIAkJCSgweDE4MTAwICsgKCh1bml0KSAqIDB4NDApKQogCkBAIC0zMTMsMzEgKzM4NCwzOCBAQAogI2RlZmluZSBNVl82ODExX0RFVl9JRAkJMHg2ODExCiAjZGVmaW5lIE1WXzY4MjBfREVWX0lECQkweDY4MjAKICNkZWZpbmUgTVZfNjgyOF9ERVZfSUQJCTB4NjgyOAorI2RlZmluZSBNVl82VzIyX0RFVl9JRAkJMHg2ODIzIC8qIDZXMjIgLSBBMzgzOiB1c2luZyBkZXZpY2UgSUQgdmFsdWUgMGYgMHg2ODIzICovCisjZGVmaW5lIE1WXzZXMjNfREVWX0lECQkweDY4MjQgLyogNlcyMyAtIEEzODQ6IHVzaW5nIGRldmljZSBJRCB2YWx1ZSAwZiAweDY4MjQgKi8KIC8qIEFybWFkYSAzOXggRmFtaWx5ICovCiAjZGVmaW5lIE1WXzY5MjBfREVWX0lECQkweDY5MjAKICNkZWZpbmUgTVZfNjkyOF9ERVZfSUQJCTB4NjkyOAogCiB0eXBlZGVmIGVudW0gX212RGV2aWNlSWQgewotCU1WXzY4MTAsCi0JTVZfNjgyMCwKLQlNVl82ODExLAotCU1WXzY4MjgsCi0JTVZfTk9ORSwKLQlNVl82OTIwLAotCU1WXzY5MjgsCi0JTVZfTUFYX0RFVl9JRCwKKy8qIDAgKi8JTVZfNjgxMCwKKy8qIDEgKi8JTVZfNjgyMCwKKy8qIDIgKi8JTVZfNjgxMSwKKy8qIDMgKi8JTVZfNjgyOCwKKy8qIDQgKi8JTVZfTk9ORSwKKy8qIDUgKi8JTVZfNjkyMCwKKy8qIDYgKi8JTVZfNjkyOCwKKy8qIDcgKi8JTVZfTUFYX0hXX0RFVl9JRCwJLyogRHVtbXkgZW50cnkgdG8gaW5kaWNhdGUgZW5kIG9mIEhXIGRldmljZSBJRCdzICovCisvKiA4ICovCU1WXzZXMjIsCQkvKiBBMzgzOiBWaXJ0dWFsIERldmljZSBJRCAtIG5vdCByZXByZXNlbnRlZCBieSBkZXYgaWQgaW4gU0BSIEAgMHgxODYwMCAqLworLyogOSAqLwlNVl82VzIzLAkJLyogQTM4NDogVmlydHVhbCBEZXZpY2UgSUQgLSBub3QgcmVwcmVzZW50ZWQgYnkgZGV2IGlkIGluIFNAUiBAIDB4MTg2MDAgKi8KKy8qIDEwKi8JTVZfTUFYX0RFVl9JRCwKIH0gTVZfREVWSUNFX0lEOwogCiAjZGVmaW5lIE1WXzY4MjBfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBNVl82ODEwX0lOREVYICAgICAgICAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgTVZfNjgxMV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIE1WXzY4MjhfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNVl82VzIyX0lOREVYCQkJICAgICAgNCAvKiA2VzIyPUEzODMgKi8KKyNkZWZpbmUgTVZfNlcyM19JTkRFWAkJCSAgICAgIDUgLyogNlcyMz1BMzg0ICovCiAKICNkZWZpbmUgTVZfNjkyMF9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIE1WXzY5MjhfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMQogCiAjaWZkZWYgQ09ORklHX0FSTUFEQV8zOFgKLSNkZWZpbmUgTUFYX0RFVl9JRF9OVU0gICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9ERVZfSURfTlVNICAgICAgICAgICAgICAgICAgICAgICAgNgogI2Vsc2UKICNkZWZpbmUgTUFYX0RFVl9JRF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAyCiAjZW5kaWYKQEAgLTM1MCwxMiArNDI4LDEyIEBACiAjZGVmaW5lIE1WXzY5MjhfSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgMQogCiB0eXBlZGVmIGVudW0gX212VW5pdElkIHsKLSAgICAgICAgICAgIFBFWF9VTklUX0lEICwKLSAgICAgICAgICAgIEVUSF9HSUdfVU5JVF9JRCwKKwkJCVBFWF9VTklUX0lEICwKKwkJCVNHTUlJX1VOSVRfSUQsCiAJCQlVU0IzSF9VTklUX0lELAogCQkJVVNCM0RfVU5JVF9JRCwKIAkJCVNBVEFfVU5JVF9JRCwKLSAgICAgICAgICAgIFFTR01JSV9VTklUX0lELAorCQkJUVNHTUlJX1VOSVRfSUQsCiAJCQlYQVVJX1VOSVRfSUQsCiAJCQlSWEFVSV9VTklUX0lELAogCQkJTUFYX1VOSVRTX0lECkBAIC0zNzQsMTEgKzQ1MiwxNCBAQAogLyogCQlkZXYsCWN0cmxNb2RlbCwJCVdPX1ZBTDAsCVdPX1ZBTDEgKi9cCiAvKiBBMzgwICovIHtNVl82ODEwLAlNVl82ODEwX0RFVl9JRCwJCTB4NzFmZDdmMywJMHgwMCB9LFwKIC8qIEEzODEgKi8ge01WXzY4MjAsCU1WXzY4MjBfREVWX0lELAkJMHg3N2ZkZmZmLAkweDAwIH0sXAotLyogQTM4NSAqLyB7TVZfNjgxMSwJTVZfNjgxMV9ERVZfSUQsCQkweDc3ZmZmZmYsCTB4MDAgfSxcCisvKiBBMzg1ICovIHtNVl82ODExLAlNVl82ODExX0RFVl9JRCwJCTB4NzdmZGZmZiwJMHgwMCB9LFwKIC8qIEEzODggKi8ge01WXzY4MjgsCU1WXzY4MjhfREVWX0lELAkJMHg3N2ZmZmZmLAkweDAwIH0sXAogLyogTk9ORSAqLyB7TVZfTk9ORSwJMHgwLAkJCTB4MCwJCTB4MCAgfSxcCi0vKiBBMzk1ICovIHtNVl82OTIwLAlNVl82OTIwX0RFVl9JRCwJCTB4MTdmY2ZmNywJMHgwMCB9LFwKLS8qIEEzOTggKi8ge01WXzY5MjgsCU1WXzY5MjhfREVWX0lELAkJMHg3N2ZmZmYzLAkweDAwIH0sXAorLyogQTM5NSAqLyB7TVZfNjkyMCwJTVZfNjkyMF9ERVZfSUQsCQkweDE3ZmNmZmYsCTB4MDAgfSxcCisvKiBBMzk4ICovIHtNVl82OTI4LAlNVl82OTI4X0RFVl9JRCwJCTB4NzdmZmZmZiwJMHgwMCB9LFwKKy8qTUFYX0hXX0RFVl9JRCovIHtNVl9NQVhfSFdfREVWX0lELAkweDAsCQkJMHgwLAkJMHgwICB9LFwKKy8qIEEzODMgKi8ge01WXzZXMjIsCU1WXzZXMjJfREVWX0lELAkJMHg3N2ZmZmZmLAkweDAwIH0sXAorLyogQTM4NCAqLyB7TVZfNlcyMywJTVZfNlcyM19ERVZfSUQsCQkweDc3ZmZmZmYsCTB4MDAgfSxcCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBib2FyZFdha2V1cEdQSU8gewpAQCAtMzg2LDEyICs0NjcsMjMgQEAKIAlNVl8zMiBncGlvTnVtOwogfSBNVl9CT0FSRF9XQUtFVVBfR1BJTzsKIAorCit0eXBlZGVmIHN0cnVjdCBib2FyZFVzYlZidXNHUElPIHsKKwlNVl9VMzIgYm9hcmRJZDsKKwlNVl8zMiB1c2JWYnVzR3Bpb1syXTsKK30gTVZfQk9BUkRfVVNCX1ZCVVNfR1BJTzsKKwogdHlwZWRlZiBlbnVtIF9tdlN1c3BlbmRXYWtldXBTdGF0dXMgewogCU1WX1NVU1BFTkRfV0FLRVVQX0RJU0FCTEVELAogCU1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRUQsCiAJTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9HUElPX0RFVEVDVEVELAorCU1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfTUVNX0RFVEVDVEVELAogfSBNVl9TVVNQRU5EX1dBS0VVUF9TVEFUVVM7CiAKKyNkZWZpbmUgQk9PVF9JTkZPX0FERFIJCQkJKDB4MzAwMCkKKyNkZWZpbmUgU1VTUEVORF9NQUdJQ19XT1JECQkJKDB4REVBREIwMDIpCisjZGVmaW5lIFJFR0lTVEVSX0xJU1RfRU5ECQkJKDB4RkZGRkZGRkYpCisKIAogLyogR1BJTyBzdGF0dXMgaW5kaWNhdGlvbiBmb3IgU3VzcGVuZCBXYWtldXA6CiAgKiBpZiBzdXNwZW5kIHRvIFJBTSBpcyBzdXBwb3J0ZWQgYW5kIEdQSU8gaW5pZGNhdGlvbiBpcyBpbXBsZW1lbnRlZCwgc2V0IHRoZSBncGlvIG51bWJlcgpAQCAtNDAzLDEzICs0OTUsMjYgQEAKICNkZWZpbmUgTVZfQk9BUkRfV0FLRVVQX0dQSU9fSU5GTyB7XAoge0EzOFhfQ1VTVE9NRVJfQk9BUkRfSUQwLAktMSB9LFwKIHtBMzhYX0NVU1RPTUVSX0JPQVJEX0lEMCwJLTEgfSxcCit7QTM4WF9DTEVBUkZPR19CT0FSRF9JRCwJLTEgfSxcCiB7QTM4WF9HRkNIMTAwX0lELAkJLTEgfSxcCiB9OworCisjZGVmaW5lIE1WX0JPQVJEX1VTQl9WQlVTX0dQSU9fSU5GTyB7XAore0EzOFhfQ1VTVE9NRVJfQk9BUkRfSUQwLCB7LTEsIC0xfSB9LFwKK3tBMzhYX0NVU1RPTUVSX0JPQVJEX0lEMCwgey0xLCAtMX0gfSxcCit7QTM4WF9DTEVBUkZPR19CT0FSRF9JRCwgey0xLCAtMX0gfSxcCit7QTM4WF9HRkNIMTAwX0lELCB7LTEsIC0xfSB9LFwKK307CiAjZWxzZQogI2RlZmluZSBNVl9CT0FSRF9XQUtFVVBfR1BJT19JTkZPIHtcCiB7QTM5WF9DVVNUT01FUl9CT0FSRF9JRDAsCS0xIH0sXAoge0EzOVhfQ1VTVE9NRVJfQk9BUkRfSUQwLAktMSB9LFwKIH07CisKKyNkZWZpbmUgTVZfQk9BUkRfVVNCX1ZCVVNfR1BJT19JTkZPIHtcCit7QTM5WF9DVVNUT01FUl9CT0FSRF9JRDAsIHstMSwgLTF9IH0sXAore0EzOVhfQ1VTVE9NRVJfQk9BUkRfSUQwLCB7LTEsIC0xfSB9LFwKK307CiAjZW5kaWYgLyogTVY4OEY2OFhYICovCiAKICNlbHNlCkBAIC00MjQsMTEgKzUyOSwyNiBAQAoge0RCX0JQXzY4MjFfSUQsCSAtMiB9LFwKIHtEQl9BTUNfNjgyMF9JRCwgLTIgfSxcCiB9OworCisjZGVmaW5lIE1WX0JPQVJEX1VTQl9WQlVTX0dQSU9fSU5GTyB7XAore1JEX05BU182OFhYX0lELCB7LTEsIC0xfSB9LFwKK3tEQl82OFhYX0lELAkgey0xLCAtMX0gfSxcCit7UkRfQVBfNjhYWF9JRCwJIHstMSwgLTF9IH0sXAore0RCX0FQXzY4WFhfSUQsCSB7NDQsIC0xfSB9LFwKK3tEQl9HUF82OFhYX0lELAkgey0xLCAtMX0gfSxcCit7REJfQlBfNjgyMV9JRCwJIHstMSwgLTF9IH0sXAore0RCX0FNQ182ODIwX0lELCB7LTEsIC0xfSB9LFwKK307CiAjZWxzZQogI2RlZmluZSBNVl9CT0FSRF9XQUtFVVBfR1BJT19JTkZPIHtcCiB7QTM5WF9SRF82OVhYX0lELCAtMSB9LFwKIHtBMzlYX0RCXzY5WFhfSUQsIC0xIH0sXAogfTsKKworI2RlZmluZSBNVl9CT0FSRF9VU0JfVkJVU19HUElPX0lORk8ge1wKK3tBMzlYX1JEXzY5WFhfSUQsIHstMSwgLTF9IH0sXAore0EzOVhfREJfNjlYWF9JRCwgey0xLCAtMX0gfSxcCit9OwogI2VuZGlmIC8qIE1WODhGNjhYWCAqLwogI2VuZGlmIC8qIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCiBleHRlcm4gTVZfRFJBTV9ETEJfQ09ORklHIGRkcjNEbGJDb25maWdUYWJsZVtdOwpAQCAtNTUwLDEyICs2NzAsMTkgQEAKICogbXZTeXNFbnZEbGJDb25maWdQdHJHZXQKICogREVTQ1JJUFRJT046IGRlZmluZXMgcG9pbnRlciB0byB0byBETEIgQ09uZmlndXJhdGlvbiB0YWJsZQogKiBJTlBVVDogbm9uZQotKiBPVVRQVVQ6IAorKiBPVVRQVVQ6CiAqIFJFVFVSTjoKICogICAgICAgcmV0dXJucyBwb2ludGVyIHRvIERMQiBDT25maWd1cmF0aW9uIHRhYmxlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfRFJBTV9ETEJfQ09ORklHICAqbXZTeXNFbnZEbGJDb25maWdQdHJHZXQoTVZfVk9JRCk7CiAKKyNkZWZpbmUgTVZfQk9BUkRfQklPUzBfQUREUgkJCQkweDRDCisjZGVmaW5lIE1WX0JPQVJEX0lPX0VYUEFOREVSMV9BRERSCQkJMHgyMQorI2RlZmluZSBUV1NJX0NIQU5ORUxfQTNYWAkJCQkwCisjZGVmaW5lIE1WX0JPQVJEX0NUUkxfSTJDX0FERFJfQkMyCQkweDAKKy8qIFdBIGZvciBiaXRzIDEsMiBpbiAweDRjLiBNdXN0IGJlIGxvd2VyIHRoYW4gMTAwMDAwIC0+IDIwMDAwICovCisjZGVmaW5lIFRXU0lfU1BFRURfQkMyCQkJCQkyMDAwMAorCiAjaWZkZWYgQ09ORklHX0NNRF9CT0FSRENGRwogCiAjZGVmaW5lIE1WX0JPQVJEX0NPTkZJR19NQVhfQllURV9DT1VOVAkJOApAQCAtNjQ4LDYgKzc3NSwyMCBAQAogI2VuZGlmIC8qIENPTkZJR19DTURfQk9BUkRDRkcgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZCb2FyZEZvcmNlUGNpZUdlbjFHZXQgLSByZWFkIEJDMiBTYXRSIGJpb3MwIGJpdFs0XSBmb3IgUENJZSBHRU4xL0dFTjIgbW9kZQorKgorKiBERVNDUklQVElPTjoKKyoKKyogSU5QVVQ6CisqCisqIE9VVFBVVDoKKyogICAgICAgTm9uZS4KKyoKKyogUkVUVVJOOiBUUlVFIGlmIGNvbm5lY3RlZCB0byBCQzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12Qm9hcmRGb3JjZVBjaWVHZW4xR2V0KE1WX1ZPSUQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBtdlN5c0VudkdldFRvcG9sb2d5VXBkYXRlSW5mbwogKgogKiBERVNDUklQVElPTjogUmVhZCBUV1NJIGZpZWxkcyB0byB1cGRhdGUgRERSIHRvcG9sb2d5IHN0cnVjdHVyZQpAQCAtNjc2LDUgKzgxNywzOCBAQAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdlN5c0VudkdldENTRW5hRnJvbVJlZyh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZTeXNFbnZDaGVja1dha2V1cERyYW1FbmFibGUKKyoKKyogREVTQ1JJUFRJT046IENoZWNrIHRoZSBtYWdpYyB3YWtldXAgZW5hYmxlZAorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVEX01FTV9ERVRFQ1RFRCBvciBNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NVU1BFTkRfV0FLRVVQX1NUQVRVUyBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZSh2b2lkKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHogLQorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgICAgICBSb3V0aW5lIHRvIGluZGljYXRlIGlmIDI1TWh6IHJlZiBjbG9jayBmb3IgdGltZXIgaXMgc3VwcG9ydGVkCisgKiBJTlBVVDogICAgICAgICAgICAgICAgTm9uZS4KKyAqIE9VVFBVVDogICAgICAgICAgICAgICBOb25lLgorICogUkVUVVJOUzogICAgICAgICAgICAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KE1WX1ZPSUQpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdkJvYXJkVXNiVmJ1c1Jlc2V0IC0KKyAqCisgKiBERVNDUklQVElPTjogICAgICAgICAgUm91dGluZSB0byByZXNldCBVU0IgVkJVUyAodmlhIEdQSU8gb3IgSTJDIElPIGV4cGFuZGVyKQorICogSU5QVVQ6ICAgICAgICAgICAgICAgIE5vbmUuCisgKiBPVVRQVVQ6ICAgICAgICAgICAgICAgTm9uZS4KKyAqIFJFVFVSTlM6ICAgICAgICAgICAgICBOb25lLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1ZPSUQgbXZTeXNFbnZVc2JWYnVzUmVzZXQoTVZfVk9JRCk7CiAjZW5kaWYgLyogX19JTkNtdlN5c0VudkxpYmggKi8KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hbHAvbXZTeXNFbnZMaWIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYWxwL212U3lzRW52TGliLmMKaW5kZXggNWFiMWM5MC4uNGI2OThlYiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hbHAvbXZTeXNFbnZMaWIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2FscC9tdlN5c0VudkxpYi5jCkBAIC0zNzAsMyArMzcwLDExIEBACiAvKiBNYXJ2ZWxsIEJvYXJkcyB1c2UgMHgxMCBhcyBiYXNlIGZvciBCb2FyZCBJRDogbWFzayBNU0IgdG8gcmVjZWl2ZSBpbmRleCBmb3IgYm9hcmQgSUQqLwogCXJldHVybiBib2FyZElkICYgKE1BUlZFTExfQk9BUkRfSURfQkFTRSAtIDEpOwogfQorCisvKiBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oejoKKyAqIEFMUCBzdXBwb3J0IDI1TWh6IGFzIHJlZi5jbG9jayBmb3IgdGltZXIKKyAqLworTVZfQk9PTCBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oeih2b2lkKQoreworCXJldHVybiBNVl9UUlVFOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hbHAvbXZTeXNFbnZMaWIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYWxwL212U3lzRW52TGliLmgKaW5kZXggMGJkMDBkNy4uZWExZTcwMiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9hbHAvbXZTeXNFbnZMaWIuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2FscC9tdlN5c0VudkxpYi5oCkBAIC0yOTgsNSArMjk4LDcgQEAKIE1WX1UzMiBtdkNwdUwyQ2xrR2V0KE1WX1ZPSUQpOwogTVZfVTMyIG12Qm9hcmRGcmVxTW9kZXNOdW1HZXQoTVZfVk9JRCk7CiBNVl9VMzIgbXZCb2FyZElkSW5kZXhHZXQoTVZfVTMyIGJvYXJkSWQpOworTVZfU1RBVFVTIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KE1WX1ZPSUQpOwogCiAjZW5kaWYgLyogX19JTkNtdkJIYm9hcmRFbnZTcGVjaCAqLworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2F4cC9tdlN5c0VudkxpYi5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9heHAvbXZTeXNFbnZMaWIuYwppbmRleCA4OWQ0Y2RjLi4yOGU3MjQ2IDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L2F4cC9tdlN5c0VudkxpYi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvYXhwL212U3lzRW52TGliLmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3N5c0Vudi9tc3lzL212U3lzRW52TGliLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L21zeXMvbXZTeXNFbnZMaWIuYwppbmRleCAwMGIyODYyLi4wNTM0MjYxIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L21zeXMvbXZTeXNFbnZMaWIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L21zeXMvbXZTeXNFbnZMaWIuYwpAQCAtODcsNDEgKzg3LDQwIEBACiAJaWYgKGdCb2FyZElkICE9IC0xKQogCQlyZXR1cm4gZ0JvYXJkSWQ7CiAKLS8qIEN1c3RvbWVyIGJvYXJkIElEJ3MgKi8KICNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAotCSNpZmRlZiBDT05GSUdfQk9CQ0FUMgotCSNpZmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMAotCQkJZ0JvYXJkSWQgPSBCQzJfQ1VTVE9NRVJfQk9BUkRfSUQwOwotCQkjZWxpZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfMQotCQkJZ0JvYXJkSWQgPSBCQzJfQ1VTVE9NRVJfQk9BUkRfSUQxOwotCQkjZW5kaWYKLQkjZWxpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKKworCSNpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKIAkJI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF8wCiAJCQlnQm9hcmRJZCA9IEFDM19DVVNUT01FUl9CT0FSRF9JRDA7CiAJCSNlbGlmIENPTkZJR19DVVNUT01FUl9CT0FSRF8xCiAJCQlnQm9hcmRJZCA9IEFDM19DVVNUT01FUl9CT0FSRF9JRDE7CiAJCSNlbmRpZgorCSNlbHNlIC8qIEJDMiAqLworCQkjaWZkZWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzAKKwkJCWdCb2FyZElkID0gQkMyX0NVU1RPTUVSX0JPQVJEX0lEMDsKKwkJI2VsaWYgQ09ORklHX0NVU1RPTUVSX0JPQVJEXzEKKwkJCWdCb2FyZElkID0gQkMyX0NVU1RPTUVSX0JPQVJEX0lEMTsKKwkJI2VuZGlmCiAJI2VuZGlmCi0jZWxzZQotLyogQm9iQ2F0MiBCb2FyZCBJRCdzICovCi0JI2lmIGRlZmluZWQoREJfQk9CQ0FUMikKLQkJZ0JvYXJkSWQgPSBEQl9EWF9CQzJfSUQ7Ci0JI2VsaWYgZGVmaW5lZChSRF9CT0JDQVQyKQotCQlnQm9hcmRJZCA9IFJEX0RYX0JDMl9JRDsKLQkjZWxpZiBkZWZpbmVkKFJEX01UTF9CT0JDQVQyKQotCQlnQm9hcmRJZCA9IFJEX01UTF9CQzI7Ci0JI2Vsc2UKLQkJTVZfVTggcmVhZFZhbHVlID0gMDsKLQkJLyogQWxsZXlDYXQzIEJvYXJkIElEJ3MgKi8KLQkJaWYgKG12Qm9hcmRTYXJCb2FyZElkR2V0KCZyZWFkVmFsdWUpICE9IE1WX09LIHx8IHJlYWRWYWx1ZSA+PSBBQzNfTUFSVkVMTF9CT0FSRF9OVU0pIHsKLQkJCW12UHJpbnRmKCIlczogRXJyb3Igb2J0YWluaW5nIEJvYXJkIElEIGZyb20gRUVQUk9NICglZClcbiIsIF9fZnVuY19fLCByZWFkVmFsdWUpOwotCQkJbXZQcmludGYoIiVzOiBTZXR0aW5nIGRlZmF1bHQgYm9hcmQ6IERCLURYQUMzLU1NXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZWFkVmFsdWUgPSBEQl9BQzNfSUQgLSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFOwotCQl9CiAKLQkJZ0JvYXJkSWQgPSBBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFICsgcmVhZFZhbHVlOwotCSNlbmRpZgotI2VuZGlmCisjZWxzZQkvKiAhQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KKworCU1WX1U4IHJlYWRWYWx1ZTsKKworCWlmIChtdkJvYXJkU2FyQm9hcmRJZEdldCgmcmVhZFZhbHVlKSAhPSBNVl9PSykgeworCQltdlByaW50ZigiJXM6IEVycm9yIG9idGFpbmluZyBCb2FyZCBJRCBmcm9tIEVFUFJPTSAoJWQpXG4iLCBfX2Z1bmNfXywgcmVhZFZhbHVlKTsKKwkJbXZQcmludGYoIiVzOiBTZXR0aW5nIGRlZmF1bHQgYm9hcmQgdG86ICVkXG4iLCBfX2Z1bmNfXywgTVZfREVGQVVMVF9CT0FSRF9JRCk7CisJCXJlYWRWYWx1ZSA9IE1WX0RFRkFVTFRfQk9BUkRfSUQ7CisJfQorCXJlYWRWYWx1ZSA9IHJlYWRWYWx1ZSAmIChCT0FSRF9JRF9JTkRFWF9NQVNLIC0gMSk7CisKKwlpZiAocmVhZFZhbHVlID49IE1WX01BUlZFTExfQk9BUkRfTlVNKSB7CisJCW12UHJpbnRmKCIlczogRXJyb3I6IHJlYWQgd3JvbmcgYm9hcmQgSUQgKCVkKVxuIiwgX19mdW5jX18sIHJlYWRWYWx1ZSk7CisJCXJldHVybiBJTlZBTElEX0JPQVJEX0lEOworCX0KKwlnQm9hcmRJZCA9IE1BUlZFTExfQk9BUkRfSURfQkFTRSArIHJlYWRWYWx1ZTsKKworI2VuZGlmIC8qIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUICovCiAKIAlyZXR1cm4gZ0JvYXJkSWQ7CiB9CkBAIC0xNTUsNiArMTU0LDIyIEBACiAJcmV0dXJuIE1WX0JPQVJEX1RDTEtfMjAwTUhaOwogfQogCisvKiBVc2UgZmxhZ1R3c2lJbml0IGdsb2JhbCBmbGFnIHRvIGluaXQgdGhlIFR3c2kgb25jZSAqLworc3RhdGljIGludCBmbGFnVHdzaUluaXQgPSAtMTsKK01WX1NUQVRVUyBtdkh3c1R3c2lJbml0V3JhcHBlcihNVl9WT0lEKQoreworCU1WX1RXU0lfQUREUiBzbGF2ZTsKKworCWlmIChmbGFnVHdzaUluaXQgPT0gLTEpIHsKKwkJc2xhdmUudHlwZSA9IEFERFI3X0JJVDsKKwkJc2xhdmUuYWRkcmVzcyA9IDA7CisJCW12VHdzaUluaXQoMCwgVFdTSV9TUEVFRCwgbXZCb2FyZFRjbGtHZXQoKSwgJnNsYXZlLCAwKTsKKwkJZmxhZ1R3c2lJbml0ID0gMTsKKworCX0KKwlyZXR1cm4gTVZfT0s7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVGhlIEJvYXJkIElkIGlzIHRha2VuIGZyb20gdGhlIGZpcnN0IGFkZHJlc3MtdmFsdWUgcGFpciBvZiB0aGUgRUVQUk9NIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlCiAgKiBJbiBvcmRlciB0byBzdXBwb3J0IG5vcm1hbCBUV1NJIGluaXQgc2VxdWVuY2UgZmxvdywgdGhlIGZpcnN0IHBhaXIgb2YgRFdPUkRTIG9uIEVFUFJPTQpAQCAtMjMxLDYgKzI0NiwyNSBAQAogCS8qIFRCRCAqLwogCXJldHVybiBNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRDsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZTeXNFbnZDaGVja1dha2V1cERyYW1FbmFibGUKKyoKKyogREVTQ1JJUFRJT046IENoZWNrIHRoZSBtYWdpYyB3YWtldXAgZW5hYmxlZAorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVEX01FTV9ERVRFQ1RFRCBvciBNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NVU1BFTkRfV0FLRVVQX1NUQVRVUyBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZSh2b2lkKQoreworCXJldHVybiBNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRDsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogbXZTeXNFbnZEbGJDb25maWdQdHJHZXQKICogREVTQ1JJUFRJT046IGRlZmluZXMgcG9pbnRlciB0byB0byBETEIgQ09uZmlndXJhdGlvbiB0YWJsZQpAQCAtMjYzLDE2ICsyOTcsMjQgQEAKIAlNVl9VOAljb25maWdWYWw7CiAJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CiAKLQkvKkZpeCB0aGUgdG9wb2xvZ3kgZm9yIEEzODAgYnkgU2F0UiB2YWx1ZXMqLworCS8qIG9uIEFDMywgRERSIGNvbmZpZ3VyYXRpb24gKGkuZSBFQ0MpIHN1cHBvcnRlZCBvbmx5IGZvciBEQiBib2FyZCAqLworI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworCWlmIChtdkJvYXJkSWRHZXQoKSAhPSBEQl9BQzNfSUQpCisJCXJldHVybiAwOworI2VuZGlmCisKKwkvKkZpeCB0aGUgdG9wb2xvZ3kgZm9yIG1zeXMgYnkgU2F0UiB2YWx1ZXMqLwogCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IDB4NEQ7CiAJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOwogCXR3c2lTbGF2ZS52YWxpZE9mZnNldCA9IE1WX1RSVUU7CiAJdHdzaVNsYXZlLm9mZnNldCA9IDA7CiAJdHdzaVNsYXZlLm1vcmVUaGVuMjU2ID0gTVZfVFJVRTsKIAotCS8qIFJlYWRpbmcgYm9hcmQgaWQgKi8KKwkvKiBSZWFkaW5nIHVwZGF0ZSBERFIgRUNDIEVuYWJsZSBmcm9tIGRldmljZQorCSAqIGFkZHJlc3M6IDB4NEQsIHJlZ2lzdGVyOiAwIGJpdHNbMDoxXQorCSAqLwogCWlmIChtdlR3c2lSZWFkKDAsICZ0d3NpU2xhdmUsICZjb25maWdWYWwsIDEpICE9IE1WX09LKSB7Ci0JCURFQlVHX0lOSVRfUygibXZId3NCb2FyZElkR2V0OiBUV1NJIFJlYWQgZmFpbGVkXG4iKTsKKwkJbXZQcmludGYoIiVzOiBUd3NpIGZhaWxlZCB0byByZWFkIGVuYWJsZSBERFIgRUNDIHVwZGF0ZVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMxMyw0ICszNTUsMTAgQEAKIAlyZXR1cm4gMTsKICNlbmRpZgogfQotCisvKiBtdlN5c0VudlRpbWVySXNSZWZDbGsyNU1oejoKKyAqIE1TWVMgQm9iY2F0MiBhbmQgQWxsZXlDYXQzIGRvZXNuJ3Qgc3VwcG9ydCAyNU1oeiBhcyByZWYuY2xvY2sgZm9yIHRpbWVyCisgKi8KK01WX0JPT0wgbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHoodm9pZCkKK3sKKwlyZXR1cm4gTVZfRkFMU0U7Cit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vc3lzRW52L21zeXMvbXZTeXNFbnZMaWIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5oCmluZGV4IDdkZjhjMDguLmE3YTE4NjcgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS9zeXNFbnYvbXN5cy9tdlN5c0VudkxpYi5oCkBAIC0xMDQsNiArMTA0LDE4IEBACiAjZGVmaW5lIElOVkFMSURfQk9BUkRfSUQJCQkweEZGRkYKICNkZWZpbmUgQk9BUkRfSURfSU5ERVhfTUFTSwkJCTB4MTAJLyogTWFzayB1c2VkIHRvIHJldHVybiBib2FyZCBpbmRleCB2aWEgYm9hcmQgSWQgKi8KIAorI2lmIGRlZmluZWQgQ09ORklHX0FMTEVZQ0FUMworCSNkZWZpbmUgTUFSVkVMTF9CT0FSRF9JRF9CQVNFCQlBQzNfTUFSVkVMTF9CT0FSRF9JRF9CQVNFCisJI2RlZmluZSBNVl9NQVhfTUFSVkVMTF9CT0FSRF9JRAkJQUMzX01BUlZFTExfTUFYX0JPQVJEX0lECisJI2RlZmluZSBNVl9NQVJWRUxMX0JPQVJEX05VTQkJQUMzX01BUlZFTExfQk9BUkRfTlVNCisJI2RlZmluZSBNVl9ERUZBVUxUX0JPQVJEX0lECQkJREJfQUMzX0lECisjZWxzZQorCSNkZWZpbmUgTUFSVkVMTF9CT0FSRF9JRF9CQVNFCQlCQzJfTUFSVkVMTF9CT0FSRF9JRF9CQVNFCisJI2RlZmluZSBNVl9NQVhfTUFSVkVMTF9CT0FSRF9JRAkJQkMyX01BUlZFTExfTUFYX0JPQVJEX0lECisJI2RlZmluZSBNVl9NQVJWRUxMX0JPQVJEX05VTQkJQkMyX01BUlZFTExfQk9BUkRfTlVNCisJI2RlZmluZSBNVl9ERUZBVUxUX0JPQVJEX0lECQkJREJfRFhfQkMyX0lECisjZW5kaWYKKwogCiAvKiBCb2JjYXQyIGRldmljZSByZXZpc2lvbiAqLwogI2RlZmluZSBCQzJfREVWX1ZFUlNJT05fSURfUkVHCQkgICAgICAgICAgIDB4RjgyNDAJLyogdW5kZXIgc2VydmVyIHNwYWNlICovCkBAIC0xMjEsNiArMTMzLDcgQEAKIAlNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRCwKIAlNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVELAogCU1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfR1BJT19ERVRFQ1RFRCwKKwlNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVEX01FTV9ERVRFQ1RFRCwKIH0gTVZfU1VTUEVORF9XQUtFVVBfU1RBVFVTOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdsb2JhbHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjcwLDUgKzI4MywzOCBAQAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdlN5c0VudkdldENTRW5hRnJvbVJlZyh2b2lkKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZTeXNFbnZDaGVja1dha2V1cERyYW1FbmFibGUKKyoKKyogREVTQ1JJUFRJT046IENoZWNrIHRoZSBtYWdpYyB3YWtldXAgZW5hYmxlZAorKgorKiBJTlBVVDogTm9uZQorKgorKiBPVVRQVVQ6IE5vbmUKKyoKKyogUkVUVVJOOgorKiAgICAgICBNVl9TVVNQRU5EX1dBS0VVUF9FTkFCTEVEX01FTV9ERVRFQ1RFRCBvciBNVl9TVVNQRU5EX1dBS0VVUF9ESVNBQkxFRAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1NVU1BFTkRfV0FLRVVQX1NUQVRVUyBtdlN5c0VudkNoZWNrV2FrZXVwRHJhbUVuYWJsZSh2b2lkKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbXZTeXNFbnZUaW1lcklzUmVmQ2xrMjVNaHogLQorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgICAgICBSb3V0aW5lIHRvIGluZGljYXRlIGlmIDI1TWh6IHJlZiBjbG9jayBmb3IgdGltZXIgaXMgc3VwcG9ydGVkCisgKiBJTlBVVDogICAgICAgICAgICAgICAgTm9uZS4KKyAqIE9VVFBVVDogICAgICAgICAgICAgICBOb25lLgorICogUkVUVVJOUzogICAgICAgICAgICAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12U3lzRW52VGltZXJJc1JlZkNsazI1TWh6KE1WX1ZPSUQpOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtdkh3c1R3c2lJbml0V3JhcHBlciAtCisgKgorICogREVTQ1JJUFRJT046ICAgICAgICAgIFdyYXBwZXIgZm9yIGluaXRpYWxpemluZyB0aGUgVFdTSSB1bml0CisgKiBJTlBVVDogICAgICAgICAgICAgICAgTm9uZS4KKyAqIE9VVFBVVDogICAgICAgICAgICAgICBOb25lLgorICogUkVUVVJOUzogICAgICAgICAgICAgIE5vbmUuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfU1RBVFVTIG12SHdzVHdzaUluaXRXcmFwcGVyKE1WX1ZPSUQpOwogI2VuZGlmIC8qIF9fSU5DbXZCSGJvYXJkRW52U3BlY2ggKi8KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2NvbW1hbmQuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYxM2Y0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9jb21tYW5kLmMKQEAgLTAsMCArMSw0MzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5CitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKwkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW5jbHVkZXMgKi8KKworI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJtdlVhcnQuaCIKKyNpbmNsdWRlICJsaWJfdXRpbHMuaCIKKyNpbmNsdWRlICJwcmludGYuaCIKKworaW50IGRvX2hlbHAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbXcoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbW0oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fY21wKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgZG9fbWVtX2NwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgaXJfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgdHJhaW5pbmdfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgZG9fbWVtX210ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgZG9feG9yTWVtVGVzdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pOworCisvKiBDb21tYW5kcyBUYWJsZQorICogRXZlcnkgbmV3IGNvbW1hbmQgaXMgYWRkZWQgaGVyZSwgVGh1cyBpdCBtdXN0IGJlIGRlY2xhcmVkIGluCisgKiB0aGlzIGZpbGUsIG9yIGluY2x1ZGUgdGhlIGZpbGUgZGVjbGFyaW5nIGl0CisgKiBGb3IgZXhhbXBsZSwgVG8gYWRkIG5ldyBjb21tYW5kIHRoYXQgaXMgaW1wbGVtZW50ZWQgaW4gJ2hlbGxvX3dvcmxkJyBmdW5jdGlvbgorICogdGhpcyBsaW5lIGlzIGFkZGVkIHRvIHRoZSBkZWNsYXJhdGlvbjoKKyAqCXsgImhlbGxvIiwgMiwgaGVsbG9fd29ybGQsICJwcmludHMgaGVsbG8gd29ybGQiLCAiIn0KKyAqLworY21kX3RibF90IGNvbW1hbmRzW10gPSB7CisJeyAiPyIsIDIsIGRvX2hlbHAsICJwcmludHMgaGVscCBtZXNzYWdlIG9mIGNvbW1hbmQiLCAiY29tbWFuZC1uYW1lIn0sCisJeyAibWQiLCAzLCBkb19tZW1fbWQsICJtZW1vcnkgZGlzcGxheSIsICJbLmIsIC53LCAubF0gYWRkcmVzcyBbIyBvZiBvYmplY3RzXSJ9LAorCXsgIm13IiwJNCwgZG9fbWVtX213LCAibWVtb3J5IHdyaXRlIChmaWxsKSIsICJbLmIsIC53LCAubF0gYWRkcmVzcyB2YWx1ZSBbY291bnRdIn0sCisJeyAibW0iLAkyLCBkb19tZW1fbW0sICJtZW1vcnkgbW9kaWZ5IChhdXRvLWluY3JlbWVudGluZyBhZGRyZXNzKSIsICJbLmIsIC53LCAubF0gYWRkcmVzcyJ9LAorCXsgImNtcCIsIDQsIGRvX21lbV9jbXAsICJtZW1vcnkgY29tcGFyZSIsICJbLmIsIC53LCAubF0gYWRkcjEgYWRkcjIgY291bnQifSwKKwl7ICJjcCIsIDQsIGRvX21lbV9jcCwgIm1lbW9yeSBjb3B5IiwgIlsuYiwgLncsIC5sXSBzb3VyY2UgdGFyZ2V0IGNvdW50In0sCisJeyAiaXIiLCAyLCBpcl9jbWQsICJpcgktIHJlYWRpbmcgYW5kIGNoYW5naW5nIE1WIGludGVybmFsIHJlZ2lzdGVyIHZhbHVlcy5cbiIsICJhZGRyZXNzIn0sCisJeyAidHJhaW5pbmciLCAxLCB0cmFpbmluZ19jbWQsICJ0cmFpbmluZwktIHByaW50cyB0aGUgcmVzdWx0cyBvZiB0aGUgRERSMyBUcmFpbmluZy5cbiJ9LAorCXsgIm10ZXN0IiwgNSwgZG9fbWVtX210ZXN0LCAic2ltcGxlIFJBTSByZWFkL3dyaXRlIHRlc3QiLCAiW3N0YXJ0IFtlbmQgW3BhdHRlcm4gW2l0ZXJhdGlvbnNdXV1dIn0sCisJeyAieG9ybXRlc3QiLCA0LCBkb194b3JNZW1UZXN0LCAicnVuIG1lbW9yeSB0ZXN0IGJhc2VkIG9uIFhPUiBlbmdpbmUiLAorCQkiW3NvdXJjZSBbZGVzdGluYXRpb24gW3NpemUoYnl0ZXMpIFtpdGVyYXRpb25zXV1dXSJ9Cit9OworCisvKiBsb2NhbCBmdW5jdGlvbnMgZGVmaW5pdGlvbnMgKi8KK2NtZF90YmxfdCAqZmluZF9jbWQoY29uc3QgY2hhciAqY21kKTsKK3ZvaWQgY21kX3VzYWdlKGNvbnN0IGNtZF90YmxfdCAqY21kdHApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19oZWxwCisqCisqIERFU0NSSVBUSU9OOgorKiBDb21tYW5kIHRoYXQgcHJpbnRzIHRoZSBoZWxwIG1lc3NhZ2Ugb2YgY29tbWFuZHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9faGVscChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJY21kX3RibF90ICpjbWQ7CisKKwlpZiAoYXJnYyA8PSAxKQorCQlyZXR1cm4gMDsKKworCWNtZCA9IGZpbmRfY21kKGFyZ3ZbMV0pOworCWlmIChjbWQgPT0gTlVMTCkgeworCQltdlByaW50ZigiQ29tbWFuZCBub3QgZm91bmQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY21kX3VzYWdlKGNtZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19tZW1fbWQoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbXcoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fbW0oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKTsKK2ludCBkb19tZW1fY21wKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgZG9fbWVtX2NwKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgaXJfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgdHJhaW5pbmdfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CitpbnQgZG9fbWVtX210ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNtZF9nZXRfZGF0YV9zaXplCisqCisqIERFU0NSSVBUSU9OOgorKiBDaGVjayBmb3IgYSBzaXplIHNwZWNpZmljYXRpb24gLmIsIC53IG9yIC5sLgorKgorKiBJTlBVVDoKKyoJYXJnCQktIGNvbW1hbmQgKGUuZy4gIm13LmwiKQorKglkZWZhdWx0X3NpemUJLSBkZWZhdWx0IHNpemUgdG8gcmV0dXJuIGlmIG5vIHNpemUgd2FzIHNwZWNpZmllZAorKgorKiBSRVRVUk46CisqCWlmIHNpemUgd2FzIHNwZWNpZmllZCwgcmV0dXJuIGNvcnJlc3BvbmRpbmcgc2l6ZQorKgkJKC5iID0gMSwgLncgPSAyLCAubCA9IDQpCisqCW90aGVyd2lzZSwgcmV0dXJuIGRlZmF1bHRfc2l6ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBjbWRfZ2V0X2RhdGFfc2l6ZShjaGFyICphcmcsIGludCBkZWZhdWx0X3NpemUpCit7CisJaW50IGxlbiA9IHN0cmxlbihhcmcpOworCWlmIChsZW4gPiAyICYmIGFyZ1tsZW4tMl0gPT0gJy4nKSB7CisJCXN3aXRjaCAoYXJnW2xlbi0xXSkgeworCQljYXNlICdiJzoKKwkJCXJldHVybiAxOworCQljYXNlICd3JzoKKwkJCXJldHVybiAyOworCQljYXNlICdsJzoKKwkJCXJldHVybiA0OworCQljYXNlICdzJzoKKwkJCXJldHVybiAtMjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gZGVmYXVsdF9zaXplOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBmaW5kX2NtZF90YmwKKyoKKyogREVTQ1JJUFRJT046CisqIHNlYXJjaCBmb3IgY29tbWFuZCBpbiBjb21tYW5kIHRhYmxlCisqCisqIElOUFVUOgorKgljbWQJCS0gY29tbWFuZCAoZS5nLiAiaXIiKQorKgl0YWJsZQkJLSBjb21tYW5kcyB0YWJsZQorKgl0YWJsZV9sZW4JLSBjb21tYW5kcyB0YWJsZSBsZW5ndGgKKyoKKyogUkVUVVJOOgorKglpZiBjb21tYW5kIHdhcyBmb3VuZCwgY21kX3RibF90IGVudHJ5IGNvcnJlc3BvbmRpbmcgdGhlIGNvbW1hbmQKKyoJb3RoZXJ3aXNlLCBOVUxMCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY21kX3RibF90ICpmaW5kX2NtZF90YmwoY29uc3QgY2hhciAqY21kLCBjbWRfdGJsX3QgKnRhYmxlLCBpbnQgdGFibGVfbGVuKQoreworCWNtZF90YmxfdCAqY21kdHA7CisJY21kX3RibF90ICpjbWR0cF90ZW1wID0gdGFibGU7CS8qSW5pdCB2YWx1ZSAqLworCWNvbnN0IGNoYXIgKnA7CisJaW50IGxlbjsKKwlpbnQgbl9mb3VuZCA9IDA7CisKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIE5VTEw7CisJLyoKKwkgKiBTb21lIGNvbW1hbmRzIGFsbG93IGxlbmd0aCBtb2RpZmllcnMgKGxpa2UgImNwLmIiKTsKKwkgKiBjb21wYXJlIGNvbW1hbmQgbmFtZSBvbmx5IHVudGlsIGZpcnN0IGRvdC4KKwkgKi8KKwlsZW4gPSAoKHAgPSBzdHJjaHIoY21kLCAnLicpKSA9PSBOVUxMKSA/IHN0cmxlbihjbWQpIDogKHAgLSBjbWQpOworCisJZm9yIChjbWR0cCA9IHRhYmxlOworCSAgICAgY21kdHAgIT0gdGFibGUgKyB0YWJsZV9sZW47CisJICAgICBjbWR0cCsrKSB7CisJCWlmIChzdHJuY21wKGNtZCwgY21kdHAtPm5hbWUsIGxlbikgPT0gMCkgeworCQkJaWYgKGxlbiA9PSBzdHJsZW4oY21kdHAtPm5hbWUpKQorCQkJCXJldHVybiBjbWR0cDsJLyogZnVsbCBtYXRjaCAqLworCisJCQljbWR0cF90ZW1wID0gY21kdHA7CS8qIGFiYnJldmlhdGVkIGNvbW1hbmQgPyAqLworCQkJbl9mb3VuZCsrOworCQl9CisJfQorCWlmIChuX2ZvdW5kID09IDEpIHsJCQkvKiBleGFjdGx5IG9uZSBtYXRjaCAqLworCQlyZXR1cm4gY21kdHBfdGVtcDsKKwl9CisKKwlyZXR1cm4gTlVMTDsJLyogbm90IGZvdW5kIG9yIGFtYmlndW91cyBjb21tYW5kICovCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGZpbmRfY21kCisqCisqIERFU0NSSVBUSU9OOgorKiB3cmFwcGVyIGZ1bmN0aW9uIGZvciAnZmluZF9jbWRfdGJsJworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NtZF90YmxfdCAqZmluZF9jbWQoY29uc3QgY2hhciAqY21kKQoreworCXJldHVybiBmaW5kX2NtZF90YmwoY21kLCBjb21tYW5kcywgc2l6ZW9mKGNvbW1hbmRzKS9zaXplb2Yoc3RydWN0IGNtZF90YmxfcykpOworfQorCitzdGF0aWMgaW50IGNtZF9jYWxsKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gKGNtZHRwLT5jbWQpKGNtZHRwLCBmbGFnLCBhcmdjLCBhcmd2KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBjbWRfdXNhZ2UKKyoKKyogREVTQ1JJUFRJT046CisqIHByaW50cyB0aGUgaGVscCBtZXNzYWdlIG9mIHRoZSBjb21tYW5kCisqCisqIElOUFVUOgorKgljbWR0cAktIGNvbW1hbmQgZW50cnkgcG9pbnRlcgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgY21kX3VzYWdlKGNvbnN0IGNtZF90YmxfdCAqY21kdHApCit7CisJbXZQcmludGYoIiVzIC0gJXNcblxuIiwgY21kdHAtPm5hbWUsIGNtZHRwLT51c2FnZSk7CisJbXZQcmludGYoIlVzYWdlOlxuJXMgIiwgY21kdHAtPm5hbWUpOworCisJaWYgKCFjbWR0cC0+aGVscCkKKwkJcmV0dXJuOworCisJbXZQcmludGYoIiVzXG4iLCBjbWR0cC0+aGVscCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNtZF9wcm9jZXNzCisqCisqIERFU0NSSVBUSU9OOgorKiBzZWFyY2ggZm9yIGNvbW1hbmQgaW4gY29tbWFuZCB0YWJsZSBhbmQgcnVuIGl0CisqCisqIElOUFVUOgorKglmbGFnCS0gY29tbWFuZCBmbGFnCisqCWFyZ2MJLSBudW1iZXIgb2YgYXJndW1lbnRzCisqCWFyZ3YJLSBhcmd1bWVudHMgYXJyYXkKKyoKKyogUkVUVVJOOgorKglDTURfUkVUX1NVQ0NFU1MoMCksIGlmIGNvbW1hbmQgd2FzIHJhbiBzdWNjZXNzZnVsbHkKKyoJQ01EX1JFVF9GQUlMVVJFKDEpLCBvbiBmYWlsdXJlCisqCUNNRF9SRVRfVVNBR0UoLTEpLCBvbiBmYWlsdXJlIGFuZCBuZWVkIHRvIHByaW50IGhlbHAgbWVzc2FnZSAoZnV0dXJlIHVzZSkKKyoKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIGNvbW1hbmRfcmV0X3QgY21kX3Byb2Nlc3MoaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCWVudW0gY29tbWFuZF9yZXRfdCByYyA9IENNRF9SRVRfU1VDQ0VTUzsKKwljbWRfdGJsX3QgKmNtZHRwOworCisJLyogTG9vayB1cCBjb21tYW5kIGluIGNvbW1hbmQgdGFibGUgKi8KKwljbWR0cCA9IGZpbmRfY21kKGFyZ3ZbMF0pOworCWlmIChjbWR0cCA9PSBOVUxMKSB7CisJCXB1dHN0cmluZygiVW5rbm93biBjb21tYW5kXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogZm91bmQgLSBjaGVjayBtYXggYXJncyAqLworCWlmIChhcmdjID4gY21kdHAtPm1heGFyZ3MpCisJCXJjID0gQ01EX1JFVF9VU0FHRTsKKworCisJLyogSWYgT0sgc28gZmFyLCB0aGVuIGRvIHRoZSBjb21tYW5kICovCisJaWYgKCFyYykKKwkJcmMgPSBjbWRfY2FsbChjbWR0cCwgZmxhZywgYXJnYywgYXJndik7CisKKwlpZiAocmMgPT0gQ01EX1JFVF9VU0FHRSkKKwkJY21kX3VzYWdlKGNtZHRwKTsKKworCXJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcGFyc2VfbGluZQorKgorKiBERVNDUklQVElPTjoKKyogcGFyc2UgY29tbWFuZCBhbmQgc3RvcmUgYXJndW1lbnRzIGluIGFyZ3YKKyoKKyogSU5QVVQ6CisqCWxpbmUJLSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbW1hbmQgc3RyaW5nCisqCisqIE9VVFBVVDoKKyoJYXJndgktIG91dHB1dCBhcnJheSBvZiB0aGUgcGFyc2VkIGFyZ3VtZW50cworKgorKiBSRVRVUk46CisqCW51bWJlciBvZiBhcmd1bWVudHMKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgcGFyc2VfbGluZShjaGFyICpsaW5lLCBjaGFyICphcmd2W10pCit7CisJaW50IG5hcmdzID0gMDsKKworCXdoaWxlIChuYXJncyA8IENPTkZJR19TWVNfTUFYQVJHUykgeworCisJCS8qIHNraXAgYW55IHdoaXRlIHNwYWNlICovCisJCXdoaWxlIChpc2JsYW5rMSgqbGluZSkpCisJCQkrK2xpbmU7CisKKwkJaWYgKCpsaW5lID09ICdcMCcpIHsJLyogZW5kIG9mIGxpbmUsIG5vIG1vcmUgYXJncwkqLworCQkJYXJndltuYXJnc10gPSBOVUxMOworCQkJcmV0dXJuIG5hcmdzOworCQl9CisKKwkJYXJndltuYXJncysrXSA9IGxpbmU7CS8qIGJlZ2luIG9mIGFyZ3VtZW50IHN0cmluZwkqLworCisJCS8qIGZpbmQgZW5kIG9mIHN0cmluZyAqLworCQl3aGlsZSAoKmxpbmUgJiYgIWlzYmxhbmsxKCpsaW5lKSkKKwkJCSsrbGluZTsKKworCQlpZiAoKmxpbmUgPT0gJ1wwJykgewkvKiBlbmQgb2YgbGluZSwgbm8gbW9yZSBhcmdzCSovCisJCQlhcmd2W25hcmdzXSA9IE5VTEw7CisJCQlyZXR1cm4gbmFyZ3M7CisJCX0KKworCQkqbGluZSsrID0gJ1wwJzsJCS8qIHRlcm1pbmF0ZSBjdXJyZW50IGFyZwkgKi8KKwl9CisKKwlwdXRzdHJpbmcoIioqIFRvbyBtYW55IGFyZ3MgKipcbiIpOworCisJcmV0dXJuIG5hcmdzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBydW5fY29tbWFuZAorKgorKiBERVNDUklQVElPTjoKKyogcnVucyBpbnB1dCBjb21tYW5kCisqCisqIElOUFVUOgorKgljbWQJLSBpbnB1dCBjb21tYW5kIHN0cmluZyB0byBydW4gKGluY2x1ZGluZyBwYXJhbWV0ZXJzKS4KKyoJZmxhZwktIGNvbW1hbmQgZmxhZworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcnVuX2NvbW1hbmQoY29uc3QgY2hhciAqY21kLCBpbnQgZmxhZykKK3sKKwljaGFyIGNtZGJ1ZltDT05GSUdfU1lTX0NCU0laRV07CS8qIHdvcmtpbmcgY29weSBvZiBjbWQJCSovCisJY2hhciAqdG9rZW47CQkJLyogc3RhcnQgb2YgdG9rZW4gaW4gY21kYnVmCSovCisJY2hhciAqc2VwOwkJCS8qIGVuZCBvZiB0b2tlbiAoc2VwYXJhdG9yKSBpbiBjbWRidWYgKi8KKwljaGFyICpzdHIgPSBjbWRidWY7CisJY2hhciAqYXJndltDT05GSUdfU1lTX01BWEFSR1MgKyAxXTsJLyogTlVMTCB0ZXJtaW5hdGVkCSovCisJaW50IGFyZ2MsIGlucXVvdGVzOworCisJaWYgKCFjbWQgfHwgISpjbWQpCisJCXJldHVybjsJLyogZW1wdHkgY29tbWFuZCAqLworCisJaWYgKHN0cmxlbihjbWQpID49IENPTkZJR19TWVNfQ0JTSVpFKSB7CisJCXB1dHN0cmluZygiIyMgQ29tbWFuZCB0b28gbG9uZyFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3RyY3B5KGNtZGJ1ZiwgY21kKTsKKworCS8qIFByb2Nlc3Mgc2VwYXJhdG9ycyAqLworCisJd2hpbGUgKCpzdHIpIHsKKworCQkvKgorCQkgKiBGaW5kIHNlcGFyYXRvciwgb3Igc3RyaW5nIGVuZAorCQkgKiBBbGxvdyBzaW1wbGUgZXNjYXBlIG9mICc7JyBieSB3cml0aW5nICJcOyIKKwkJICovCisJCWZvciAoaW5xdW90ZXMgPSAwLCBzZXAgPSBzdHI7ICpzZXA7IHNlcCsrKSB7CisJCQlpZiAoKCpzZXAgPT0gJ1wnJykgJiYKKwkJCSAgICAoKihzZXAgLSAxKSAhPSAnXFwnKSkKKwkJCQlpbnF1b3RlcyA9ICFpbnF1b3RlczsKKworCQkJaWYgKCFpbnF1b3RlcyAmJgorCQkJICAgICgqc2VwID09ICc7JykgJiYJLyogc2VwYXJhdG9yCQkqLworCQkJICAgIChzZXAgIT0gc3RyKSAmJgkvKiBwYXN0IHN0cmluZyBzdGFydAkqLworCQkJICAgICgqKHNlcC0xKSAhPSAnXFwnKSkJLyogYW5kIE5PVCBlc2NhcGVkCSovCisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBMaW1pdCB0aGUgdG9rZW4gdG8gZGF0YSBiZXR3ZWVuIHNlcGFyYXRvcnMKKwkJICovCisJCXRva2VuID0gc3RyOworCQlpZiAoKnNlcCkgeworCQkJc3RyID0gc2VwICsgMTsJLyogc3RhcnQgb2YgY29tbWFuZCBmb3IgbmV4dCBwYXNzICovCisJCQkqc2VwID0gJ1wwJzsKKwkJfSBlbHNlCisJCQlzdHIgPSBzZXA7CS8qIG5vIG1vcmUgY29tbWFuZHMgZm9yIG5leHQgcGFzcyAqLworCisJCS8qIEV4dHJhY3QgYXJndW1lbnRzICovCisJCWFyZ2MgPSBwYXJzZV9saW5lKHRva2VuLCBhcmd2KTsKKwkJaWYgKGFyZ2MgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWNtZF9wcm9jZXNzKGZsYWcsIGFyZ2MsIGFyZ3YpOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9jb21tYW5kLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmgKY29weSB0byB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvY29tbWFuZC5oCmluZGV4IGRhODJlMjQuLjE4ZjdiOWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2NvbW1hbmQuaApAQCAtMSw0ICsxLDMgQEAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCiAKQEAgLTQzLDEyICs0MiwxMiBAQAogCSAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogCiAgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0JCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLQkJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKwlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KIAogICAgICogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQotCQl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0JCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKwl1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRApAQCAtNjIsNzkgKzYxLDMyIEBACiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKLSNkZWZpbmUgX01WX0REUjNfVE9QT0xPR1lfREVGX0gKIAorI2luY2x1ZGUgIm12X29zLmgiCisjaW5jbHVkZSAibXZVYXJ0LmgiCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqVE9QT0xPR1kqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIENPTkZJR19ERFIzCi10eXBlZGVmIGVudW0KLXsKLSAgIFNQRUVEX0JJTl9ERFJfODAwRCwKLSAgIFNQRUVEX0JJTl9ERFJfODAwRSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkUsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZGLAotICAgU1BFRURfQklOX0REUl8xMDY2RywKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0YsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNHLAotICAgU1BFRURfQklOX0REUl8xMzMzSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0osCi0gICBTUEVFRF9CSU5fRERSXzE2MDBHLAotICAgU1BFRURfQklOX0REUl8xNjAwSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLLAotICAgU1BFRURfQklOX0REUl8xODY2SiwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZMLAotICAgU1BFRURfQklOX0REUl8xODY2TSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0ssCi0gICBTUEVFRF9CSU5fRERSXzIxMzNMLAotICAgU1BFRURfQklOX0REUl8yMTMzTSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCisjZGVmaW5lIENPTkZJR19TWVNfTUFYQVJHUyA4CisjZGVmaW5lIENNRF9GTEFHX1JFUEVBVCAweDAwMDEKIAotICAgU1BFRURfQklOX0REUl8xMzMzSF9FWFQsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2Nk1fRVhUCi19TVZfSFdTX1NQRUVEX0JJTjsKK3N0cnVjdCBjbWRfdGJsX3MgeworCWNoYXIJCSpuYW1lOwkJLyogQ29tbWFuZCBOYW1lCQkJKi8KKwlpbnQJCW1heGFyZ3M7CS8qIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cwkqLworCQkJCQkvKiBJbXBsZW1lbnRhdGlvbiBmdW5jdGlvbgkqLworCWludAkJKCpjbWQpKHN0cnVjdCBjbWRfdGJsX3MgKiwgaW50LCBpbnQsIGNoYXIgKiBjb25zdCBbXSk7CisJY2hhcgkJKnVzYWdlOwkJLyogVXNhZ2UgbWVzc2FnZQkoc2hvcnQpCSovCisJY2hhcgkJKmhlbHA7CQkvKiBVc2FnZSBtZXNzYWdlCShsb25nKQkqLworfTsKIAotdHlwZWRlZiBlbnVtIAotewotICBERFJfRlJFUV9MT1dfRlJFUSwKLSAgRERSX0ZSRVFfNDAwLAotICBERFJfRlJFUV81MzMsCi0gIEREUl9GUkVRXzY2NywKLSAgRERSX0ZSRVFfODAwLAotICBERFJfRlJFUV85MzMsCi0gIEREUl9GUkVRXzEwNjYsCi0gIEREUl9GUkVRXzMxMSwKLSAgRERSX0ZSRVFfMzMzLAotICBERFJfRlJFUV80NjcsCi0gIEREUl9GUkVRXzg1MCwKLSAgRERSX0ZSRVFfNjAwLAotICBERFJfRlJFUV8zMDAsCi0gIEREUl9GUkVRXzkwMCwKLSAgRERSX0ZSRVFfMzYwLAotICBERFJfRlJFUV8xMDAwLAotICAgRERSX0ZSRVFfTElNSVQKLX1NVl9IV1NfRERSX0ZSRVE7CitlbnVtIGNvbW1hbmRfcmV0X3QgeworCUNNRF9SRVRfU1VDQ0VTUywJLyogMCA9IFN1Y2Nlc3MgKi8KKwlDTURfUkVUX0ZBSUxVUkUsCS8qIDEgPSBGYWlsdXJlICovCisJQ01EX1JFVF9VU0FHRSA9IC0xLAkvKiBGYWlsdXJlLCBwbGVhc2UgcmVwb3J0ICd1c2FnZScgZXJyb3IgKi8KK307CiAKLXR5cGVkZWYgZW51bQotewotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkNELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlAsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQVMsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDFLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMkssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RQRCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzFLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMkssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXVFIsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSVFAsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdE1PRAotfXNwZWVkQmluVGFibGVFbGVtZW50czsKLSNlbmRpZiAvKkNPTkZJR19ERFIzICovCi0jZW5kaWYgLyogX01WX0REUjNfVE9QT0xPR1lfREVGX0ggKi8KK3R5cGVkZWYgc3RydWN0IGNtZF90YmxfcyBjbWRfdGJsX3Q7CisKK2ludCBjbWRfZ2V0X2RhdGFfc2l6ZShjaGFyICphcmcsIGludCBkZWZhdWx0X3NpemUpOworCit2b2lkIHJ1bl9jb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwgaW50IGZsYWcpOwogCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvZGVidWcuYwpzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaApjb3B5IHRvIHRvb2xzL21hcnZlbGwvYmluX2hkci9wbGF0Zm9ybS91dGlscy9kZWJ1Zy9kZWJ1Zy5jCmluZGV4IGRhODJlMjQuLjQ3ODMwY2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2RlYnVnLmMKQEAgLTEsNCArMSwzIEBACi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcwogCkBAIC00MywxMiArNDIsMTIgQEAKIAkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KIAogICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotCQlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0JCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAKICAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKLQkJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotCQlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKQEAgLTYyLDc5ICs2MSwyNiBAQAogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICi0jZGVmaW5lIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICiAKKy8qIGluY2x1ZGVzICovCisjaW5jbHVkZSAibXZfb3MuaCIKKyNpbmNsdWRlICJjb25maWdfbWFydmVsbC5oIiAgCS8qIFJlcXVpcmVkIHRvIGlkZW50aWZ5IFNPQyBhbmQgQm9hcmQgKi8KKyNpbmNsdWRlICJtdlVhcnQuaCIKKyNpbmNsdWRlICJwcmludGYuaCIKKyNpbmNsdWRlICJtdlN5c0VudkxpYi5oIgorI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJsaWJfdXRpbHMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKipUT1BPTE9HWSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0REUjMKLXR5cGVkZWYgZW51bQorTVZfU1RBVFVTIG12QmluSGVhZGVyRGVidWdQcm9tcHQodm9pZCkKIHsKLSAgIFNQRUVEX0JJTl9ERFJfODAwRCwKLSAgIFNQRUVEX0JJTl9ERFJfODAwRSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkUsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZGLAotICAgU1BFRURfQklOX0REUl8xMDY2RywKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0YsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNHLAotICAgU1BFRURfQklOX0REUl8xMzMzSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0osCi0gICBTUEVFRF9CSU5fRERSXzE2MDBHLAotICAgU1BFRURfQklOX0REUl8xNjAwSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLLAotICAgU1BFRURfQklOX0REUl8xODY2SiwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZMLAotICAgU1BFRURfQklOX0REUl8xODY2TSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0ssCi0gICBTUEVFRF9CSU5fRERSXzIxMzNMLAotICAgU1BFRURfQklOX0REUl8yMTMzTSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCisJcHV0c3RyaW5nKCJcblByb21wdCBtb2RlXG4iKTsKKwl3aGlsZSAoMSkgeworCQlyZWFkbGluZSgiTWFydmVsbF9EZWJ1Zz4+ICIpOworCQlpZiAoc3RyY21wKGNvbnNvbGVfYnVmZmVyLCAicSIpID09IDApCisJCQlicmVhazsKIAotICAgU1BFRURfQklOX0REUl8xMzMzSF9FWFQsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2Nk1fRVhUCi19TVZfSFdTX1NQRUVEX0JJTjsKLQotdHlwZWRlZiBlbnVtIAotewotICBERFJfRlJFUV9MT1dfRlJFUSwKLSAgRERSX0ZSRVFfNDAwLAotICBERFJfRlJFUV81MzMsCi0gIEREUl9GUkVRXzY2NywKLSAgRERSX0ZSRVFfODAwLAotICBERFJfRlJFUV85MzMsCi0gIEREUl9GUkVRXzEwNjYsCi0gIEREUl9GUkVRXzMxMSwKLSAgRERSX0ZSRVFfMzMzLAotICBERFJfRlJFUV80NjcsCi0gIEREUl9GUkVRXzg1MCwKLSAgRERSX0ZSRVFfNjAwLAotICBERFJfRlJFUV8zMDAsCi0gIEREUl9GUkVRXzkwMCwKLSAgRERSX0ZSRVFfMzYwLAotICBERFJfRlJFUV8xMDAwLAotICAgRERSX0ZSRVFfTElNSVQKLX1NVl9IV1NfRERSX0ZSRVE7Ci0KLXR5cGVkZWYgZW51bQotewotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkNELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlAsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQVMsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDFLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMkssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RQRCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzFLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMkssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXVFIsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSVFAsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdE1PRAotfXNwZWVkQmluVGFibGVFbGVtZW50czsKLSNlbmRpZiAvKkNPTkZJR19ERFIzICovCi0jZW5kaWYgLyogX01WX0REUjNfVE9QT0xPR1lfREVGX0ggKi8KLQorCQlydW5fY29tbWFuZChjb25zb2xlX2J1ZmZlciwgMCk7CisJfQorCXJldHVybiBNVl9PSzsKK30KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2xpYl91dGlscy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL2xpYl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MGZjZWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbGliX3V0aWxzLmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5CitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKwkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKwlkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKK1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKK0RJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKK0FOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCitBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibGliX3V0aWxzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibXZfb3MuaCIKKyNpbmNsdWRlICJtdlVhcnQuaCIKKyNpbmNsdWRlICJwcmludGYuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGltcGxlbWVudGF0aW9uIG9mIHVzZWQgY3R5cGUgZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogaXNwcmludAorKgorKiBERVNDUklQVElPTjoKKyogQ2hlY2tzIHdoZXRoZXIgYyBpcyBhIHByaW50YWJsZSBjaGFyYWN0ZXIKKyogQSBwcmludGFibGUgY2hhcmFjdGVyIGlzIGEgY2hhcmFjdGVyIHRoYXQgb2NjdXBpZXMgYSBwcmludGluZyBwb3NpdGlvbiBvbiBhIGRpc3BsYXkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXNwcmludChpbnQgYykKK3sKKwlyZXR1cm4gYyA+PSAnICcgJiYgYyA8PSAnfic7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlzYmxhbmsxCisqCisqIERFU0NSSVBUSU9OOgorKiBDaGVja3Mgd2hldGhlciBjIGlzIGEgYmxhbmsgY2hhcmFjdGVyCisqIHRoZSBibGFuayBjaGFyYWN0ZXJzIGFyZSBzcGFjZSBhbmQgaG9yaXpvbnRhbCB0YWIKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXNibGFuazEoY2hhciBjKQoreworCXJldHVybiAoYyA+PSA5ICYmIGMgPD0gMTMpIHx8IGMgPT0gMzI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlzeGRpZ2l0CisqCisqIERFU0NSSVBUSU9OOgorKiBDaGVja3Mgd2hldGhlciBjIGlzIGEgaGV4ZGVjaW1hbCBkaWdpdCBjaGFyYWN0ZXIKKyogSGV4YWRlY2ltYWwgZGlnaXRzIGFyZSBhbnkgb2Y6IDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgQSBCIEMgRCBFIEYKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXN4ZGlnaXQoaW50IGMpCit7CisJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQlyZXR1cm4gMTsKKworCWlmIChjID49ICdBJyAmJiBjIDw9ICdGJykKKwkJcmV0dXJuIDE7CisKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlzZGlnaXQKKyoKKyogREVTQ1JJUFRJT046CisqIENoZWNrcyB3aGV0aGVyIGMgaXMgYSBkZWNpbWFsIGRpZ2l0IGNoYXJhY3RlcgorKiBEZWNpbWFsIGRpZ2l0cyBhcmUgYW55IG9mOiAwIDEgMiAzIDQgNSA2IDcgOCA5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlzZGlnaXQoaW50IGMpCit7CisJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpc2xvd2VyCisqCisqIERFU0NSSVBUSU9OOgorKiBDaGVja3Mgd2hldGhlciBjIGlzIGEgbG93ZXJjYXNlIGxldHRlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBpc2xvd2VyKGludCBjKQoreworCWlmIChjID49ICdhJyAmJiBjIDw9ICd6JykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogdG91cHBlcgorKgorKiBERVNDUklQVElPTjoKKyogUmV0dXJucyB0aGUgdXBwZXJjYXNlIGVxdWl2YWxlbnQgb2YgYworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB0b3VwcGVyKGludCBjKQoreworCWlmIChpc2xvd2VyKGMpKQorCQlyZXR1cm4gJ0EnICsgKGMgLSAnYScpOworCWVsc2UKKwkJcmV0dXJuIGM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbXBsZW1lbnRhdGlvbiBvZiB1c2VkIHN0cmluZyBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBzdHJjaHIgKi8KK2NoYXIgKnN0cmNocihjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKy8qIFNjYW4gcyBmb3IgdGhlIGNoYXJhY3Rlci4gIFdoZW4gdGhpcyBsb29wIGlzIGZpbmlzaGVkLAorIHMgd2lsbCBlaXRoZXIgcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIHRoZQorIGNoYXJhY3RlciB3ZSB3ZXJlIGxvb2tpbmcgZm9yLiAgKi8KKwl3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSAoY2hhciljKQorCQlzKys7CisJcmV0dXJuICgqcyA9PSAoY2hhciljKSA/IChjaGFyICopIHMgOiBOVUxMOworfQorCisvKiBzdHJsZW4gKi8KK2ludCBzdHJsZW4oY29uc3QgY2hhciAqcykKK3sKKwljb25zdCBjaGFyICpwID0gczsKKwkvKiBMb29wIG92ZXIgdGhlIGRhdGEgaW4gcy4gICovCisJd2hpbGUgKCpwICE9ICdcMCcpCisJCXArKzsKKwlyZXR1cm4gKGludCkocCAtIHMpOworfQorCisvKiBzdHJjbXAgKi8KK2ludCBzdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCWludCBfX3JlczsKKwl3aGlsZSAoMSkgeworCQlfX3JlcyA9ICpzMSAtICpzMisrOworCQlpZiAoX19yZXMgIT0gMCB8fCAhKnMxKyspCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gX19yZXM7Cit9CisKKy8qIHN0cm5jbXAgKi8KK2ludCBzdHJuY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IG4pCit7CisJdW5zaWduZWQgY2hhciB1YzEsIHVjMjsKKwkvKiBOb3RoaW5nIHRvIGNvbXBhcmU/ICBSZXR1cm4gemVyby4gICovCisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBMb29wLCBjb21wYXJpbmcgYnl0ZXMuICAqLworCXdoaWxlIChuLS0gPiAwICYmICpzMSA9PSAqczIpIHsKKwkJLyogSWYgd2UndmUgcnVuIG91dCBvZiBieXRlcyBvciBoaXQgYSBudWxsLCByZXR1cm4gemVybworCQlzaW5jZSB3ZSBhbHJlYWR5IGtub3cgKnMxID09ICpzMi4gICovCisJCWlmIChuID09IDAgfHwgKnMxID09ICdcMCcpCisJCQlyZXR1cm4gMDsKKworCQlzMSsrOworCQlzMisrOworCX0KKwl1YzEgPSAoKih1bnNpZ25lZCBjaGFyICopIHMxKTsKKwl1YzIgPSAoKih1bnNpZ25lZCBjaGFyICopIHMyKTsKKwlyZXR1cm4gKCh1YzEgPCB1YzIpID8gLTEgOiAodWMxID4gdWMyKSk7Cit9CisvKiBzdHJjcHkgKi8KK2NoYXIgKnN0cmNweShjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJY2hhciAqZHN0ID0gczE7CisJY29uc3QgY2hhciAqc3JjID0gczI7CisJLyogRG8gdGhlIGNvcHlpbmcgaW4gYSBsb29wLiAgKi8KKwl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJOyAgICAgICAgICAgICAgIC8qIFRoZSBib2R5IG9mIHRoaXMgbG9vcCBpcyBsZWZ0IGVtcHR5LiAqLworCS8qIFJldHVybiB0aGUgZGVzdGluYXRpb24gc3RyaW5nLiAgKi8KKwlyZXR1cm4gczE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbXBsZW1lbnRhdGlvbiBvZiBvdGhlciB1dGlscworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpCit7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwLCB2YWx1ZTsKKworCWlmICgqY3AgPT0gJzAnKSB7CisJCWNwKys7CisJCWlmICgoKmNwID09ICd4JykgJiYgaXN4ZGlnaXQoY3BbMV0pKSB7CisJCQliYXNlID0gMTY7CisJCQljcCsrOworCQl9CisJCWlmICghYmFzZSkKKwkJCWJhc2UgPSA4OworCX0KKwlpZiAoIWJhc2UpCisJCWJhc2UgPSAxMDsKKworCXdoaWxlIChpc3hkaWdpdCgqY3ApICYmICh2YWx1ZSA9IGlzZGlnaXQoKmNwKSA/ICpjcC0nMCcgOiAoaXNsb3dlcigqY3ApCisJICAgID8gdG91cHBlcigqY3ApIDogKmNwKS0nQScrMTApIDwgYmFzZSkgeworCQlyZXN1bHQgPSByZXN1bHQqYmFzZSArIHZhbHVlOworCQljcCsrOworCX0KKwlpZiAoZW5kcCkKKwkJKmVuZHAgPSAoY2hhciAqKWNwOworCXJldHVybiByZXN1bHQ7Cit9CisKK2NoYXIgY29uc29sZV9idWZmZXJbQ09ORklHX1NZU19DQlNJWkUgKyAxXTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHJlYWRsaW5lCisqCisqIERFU0NSSVBUSU9OOgorKiBwcmludHMgJ2Rpc3AnIGFuZCByZWFkcyBjaGFyYWN0ZXJzIGZyb20gVUFSVCB1bnRpbCBuZXdsaW5lIGNoYXJhY3RlcihBQ1NJSSAxMykKKyogcmVjZWl2ZWQgYW5kIHdyaXRlcyB0aGUgY2hhcmFjdGVycyB0byAnY29uc29sZV9idWZmZXInCisqCisqIElOUFVUOgorKglkaXNwCS0gc3RyaW5nIHRvIGRpc3BsYXkuCisqCisqIFJFVFVSTjoKKyoJTnVtYmVyIG9mIHJlYWQgY2hhcmFjdGVycywgbm90IGluY2x1ZGluZyBuZXdsaW5lIGNoYXJhY3RlcgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCByZWFkbGluZShjb25zdCBjaGFyICpkaXNwKQoreworCWNoYXIgYzsKKwlpbnQgY3VyciA9IDA7CisJbXZQcmludGYoZGlzcCk7CisKKwl3aGlsZSAoY3VyciA8PSBDT05GSUdfU1lTX0NCU0laRSkgeworCQljID0gbXZVYXJ0R2V0YygpOworCQlpZiAoYyA9PSAxMykgeworCQkJY29uc29sZV9idWZmZXJbY3Vycl0gPSAwOworCQkJcHV0c3RyaW5nKCJcbiIpOworCQkJcmV0dXJuIGN1cnI7CisJCX0KKwkJbXZVYXJ0UHV0YyhjKTsKKwkJY29uc29sZV9idWZmZXJbY3VycisrXSA9IGM7CisJfQorCWNvbnNvbGVfYnVmZmVyW0NPTkZJR19TWVNfQ0JTSVpFXSA9IDA7CisJcmV0dXJuIGN1cnI7Cit9CisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbGliX3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIHRvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RvcG9sb2d5RGVmLmgKY29weSB0byB0b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbGliX3V0aWxzLmgKaW5kZXggZGE4MmUyNC4uZjQ0NWVlMCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbGliX3V0aWxzLmgKQEAgLTEsNCArMSwzIEBACi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcwogCkBAIC00MywxMiArNDIsMTIgQEAKIAkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KIAogICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotCQlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0JCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAKICAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKLQkJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotCQlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorCXNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KIAogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKQEAgLTYyLDc5ICs2MSwyMSBAQAogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICi0jZGVmaW5lIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICiAKKyNkZWZpbmUgQ09ORklHX1NZU19DQlNJWkUgMTAyNAorZXh0ZXJuIGNoYXIgY29uc29sZV9idWZmZXJbQ09ORklHX1NZU19DQlNJWkUgKyAxXTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKipUT1BPTE9HWSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0REUjMKLXR5cGVkZWYgZW51bQotewotICAgU1BFRURfQklOX0REUl84MDBELAotICAgU1BFRURfQklOX0REUl84MDBFLAotICAgU1BFRURfQklOX0REUl8xMDY2RSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkYsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZHLAotICAgU1BFRURfQklOX0REUl8xMzMzRiwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0csCi0gICBTUEVFRF9CSU5fRERSXzEzMzNILAotICAgU1BFRURfQklOX0REUl8xMzMzSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEcsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBILAotICAgU1BFRURfQklOX0REUl8xNjAwSiwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZKLAotICAgU1BFRURfQklOX0REUl8xODY2SywKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCi0gICBTUEVFRF9CSU5fRERSXzE4NjZNLAotICAgU1BFRURfQklOX0REUl8yMTMzSywKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0wsCi0gICBTUEVFRF9CSU5fRERSXzIxMzNNLAotICAgU1BFRURfQklOX0REUl8yMTMzTiwKKy8qIGN0eXBlICovCitpbnQgaXNibGFuazEoY2hhciBjKTsKK2ludCBpc3ByaW50KGludCBjKTsKIAotICAgU1BFRURfQklOX0REUl8xMzMzSF9FWFQsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2Nk1fRVhUCi19TVZfSFdTX1NQRUVEX0JJTjsKKy8qIHN0cmluZyAqLworY2hhciAqc3RyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKTsKK2ludCBzdHJsZW4oY29uc3QgY2hhciAqcyk7CitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitpbnQgc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBuKTsKK2NoYXIgKnN0cmNweShjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOwogCi10eXBlZGVmIGVudW0gCi17Ci0gIEREUl9GUkVRX0xPV19GUkVRLAotICBERFJfRlJFUV80MDAsCi0gIEREUl9GUkVRXzUzMywKLSAgRERSX0ZSRVFfNjY3LAotICBERFJfRlJFUV84MDAsCi0gIEREUl9GUkVRXzkzMywKLSAgRERSX0ZSRVFfMTA2NiwKLSAgRERSX0ZSRVFfMzExLAotICBERFJfRlJFUV8zMzMsCi0gIEREUl9GUkVRXzQ2NywKLSAgRERSX0ZSRVFfODUwLAotICBERFJfRlJFUV82MDAsCi0gIEREUl9GUkVRXzMwMCwKLSAgRERSX0ZSRVFfOTAwLAotICBERFJfRlJFUV8zNjAsCi0gIEREUl9GUkVRXzEwMDAsCi0gICBERFJfRlJFUV9MSU1JVAotfU1WX0hXU19ERFJfRlJFUTsKLQotdHlwZWRlZiBlbnVtCi17Ci0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQ0QsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJBUywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFBELAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMUssCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcySywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUiwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJUUCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190TU9ECi19c3BlZWRCaW5UYWJsZUVsZW1lbnRzOwotI2VuZGlmIC8qQ09ORklHX0REUjMgKi8KLSNlbmRpZiAvKiBfTVZfRERSM19UT1BPTE9HWV9ERUZfSCAqLwotCi0KKy8qIG90aGVyIHV0aWxzICovCit1bnNpZ25lZCBsb25nIHNpbXBsZV9zdHJ0b3VsKGNvbnN0IGNoYXIgKmNwLCBjaGFyICoqZW5kcCwgdW5zaWduZWQgaW50IGJhc2UpOworaW50IHJlYWRsaW5lKGNvbnN0IGNoYXIgKmRpc3ApOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL21lbS5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjY1MWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcvbWVtLmMKQEAgLTAsMCArMSw3MDMgQEAKKyNpbmNsdWRlICJjb21tYW5kLmgiCisjaW5jbHVkZSAicHJpbnRmLmgiCisjaW5jbHVkZSAibXZVYXJ0LmgiCisjaW5jbHVkZSAibGliX3V0aWxzLmgiCisjaW5jbHVkZSAibXZfb3MuaCIKKyNpbmNsdWRlICJzb2Nfc3BlYy5oIgorI2luY2x1ZGUgImRkcjNfaHdzX2h3X3RyYWluaW5nX2RlZi5oIgorI2luY2x1ZGUgInN0ZGludC5oIgorCisKKyNkZWZpbmUgRElTUF9MSU5FX0xFTiAxNgorI2RlZmluZSBNQVhfTElORV9MRU5HVEhfQllURVMgKDY0KQorI2RlZmluZSBERUZBVUxUX0xJTkVfTEVOR1RIX0JZVEVTICgxNikKKyNkZWZpbmUgUkVHX1BIWV9EQVRBCQkwCisjZGVmaW5lIENPTkZJR19TWVNfTUVNVEVTVF9TVEFSVCAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBDT05GSUdfU1lTX01FTVRFU1RfRU5EICAgICAgICAgIDB4MDA3ZmZmZmYKKworc3RhdGljIHVuc2lnbmVkIGludCBkcF9sYXN0X2FkZHIsIGRwX2xhc3Rfc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHBfbGFzdF9sZW5ndGggPSAweDQwOworc3RhdGljIHVuc2lnbmVkIGludCBtbV9sYXN0X2FkZHIsIG1tX2xhc3Rfc2l6ZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcHJpbnRIZXgKKyoKKyogREVTQ1JJUFRJT046CisqIFByaW50cyB1bnNpZ25lZCB2YWx1ZSBpbiBoZXggd2l0aCBzcGVjaWZpZWQgd2lkdGgKKyoKKyogSU5QVVQ6CisqCXgJCS0gdmFsdWUgdG8gcHJpbnQKKyoJd2lkdGgJCS0gZGF0YSB2YWx1ZSB3aWR0aC4gIE1heSBiZSAyLCA0LCBvciA4LgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHByaW50SGV4KE1WX1UzMiB4LCB1bnNpZ25lZCBpbnQgd2lkdGgpCit7CisJc3dpdGNoICh3aWR0aCkgeworCWNhc2UgODoKKwkJbXZQcmludGYoIiAlMDh4IiwgeCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbXZQcmludGYoIiAlMDR4IiwgeCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW12UHJpbnRmKCIgJTAyeCIsIHgpOworCQlicmVhazsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHByaW50X2J1ZmZlcgorKgorKiBERVNDUklQVElPTjoKKyogUHJpbnQgZGF0YSBidWZmZXIgaW4gaGV4IGFuZCBhc2NpaSBmb3JtIHRvIHRoZSB0ZXJtaW5hbC4KKyogZGF0YSByZWFkcyBhcmUgYnVmZmVyZWQgc28gdGhhdCBlYWNoIG1lbW9yeSBhZGRyZXNzIGlzIG9ubHkgcmVhZCBvbmNlLgorKiBVc2VmdWwgd2hlbiBkaXNwbGF5aW5nIHRoZSBjb250ZW50cyBvZiB2b2xhdGlsZSByZWdpc3RlcnMuCisqCisqIElOUFVUOgorKglhZGRyCQktIFN0YXJ0aW5nIGFkZHJlc3MgdG8gZGlzcGxheSBhdCBzdGFydCBvZiBsaW5lCisqCWRhdGEJCS0gcG9pbnRlciB0byBkYXRhIGJ1ZmZlcgorKgl3aWR0aAkJLSBkYXRhIHZhbHVlIHdpZHRoLiAgTWF5IGJlIDEsIDIsIG9yIDQuCisqCWNvdW50CQktIG51bWJlciBvZiB2YWx1ZXMgdG8gZGlzcGxheQorKglsaW5lbGVuCQktIE51bWJlciBvZiB2YWx1ZXMgdG8gcHJpbnQgcGVyIGxpbmUKKyoJCQkJc3BlY2lmeSAwIGZvciBkZWZhdWx0IGxlbmd0aAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgcHJpbnRfYnVmZmVyKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBsaW5lbGVuKQoreworCS8qIGxpbmVidWYgYXMgYSB1bmlvbiBjYXVzZXMgcHJvcGVyIGFsaWdubWVudCAqLworCXVuaW9uIGxpbmVidWYgeworCQlNVl9VMzIgdWlbTUFYX0xJTkVfTEVOR1RIX0JZVEVTL3NpemVvZihNVl9VMzIpICsgMV07CisJCU1WX1UxNiB1c1tNQVhfTElORV9MRU5HVEhfQllURVMvc2l6ZW9mKE1WX1UxNikgKyAxXTsKKwkJTVZfVTggIHVjW01BWF9MSU5FX0xFTkdUSF9CWVRFUy9zaXplb2YoTVZfVTgpICsgMV07CisJfSBsYjsKKwlpbnQgaTsKKworCWlmIChsaW5lbGVuKndpZHRoID4gTUFYX0xJTkVfTEVOR1RIX0JZVEVTKQorCQlsaW5lbGVuID0gTUFYX0xJTkVfTEVOR1RIX0JZVEVTIC8gd2lkdGg7CisJaWYgKGxpbmVsZW4gPCAxKQorCQlsaW5lbGVuID0gREVGQVVMVF9MSU5FX0xFTkdUSF9CWVRFUyAvIHdpZHRoOworCisJd2hpbGUgKGNvdW50KSB7CisJCW12UHJpbnRmKCIlMDhseDoiLCBhZGRyKTsKKworCQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgY29uZGl0aW9uICovCisJCWlmIChjb3VudCA8IGxpbmVsZW4pCisJCQlsaW5lbGVuID0gY291bnQ7CisKKwkJLyogQ29weSBmcm9tIG1lbW9yeSBpbnRvIGxpbmVidWYgYW5kIHByaW50IGhleCB2YWx1ZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGxpbmVsZW47IGkrKykgeworCQkJTVZfVTMyIHg7CisJCQlpZiAod2lkdGggPT0gNCkKKwkJCQl4ID0gbGIudWlbaV0gPSAqKHZvbGF0aWxlIE1WX1UzMiopZGF0YTsKKwkJCWVsc2UgaWYgKHdpZHRoID09IDIpCisJCQkJeCA9IGxiLnVzW2ldID0gKih2b2xhdGlsZSBNVl9VMTYqKWRhdGE7CisJCQllbHNlCisJCQkJeCA9IGxiLnVjW2ldID0gKih2b2xhdGlsZSBNVl9VOCopZGF0YTsKKwkJCXByaW50SGV4KHgsIHdpZHRoKjIpOworCQkJZGF0YSArPSB3aWR0aDsKKwkJfQorCisJCS8qIFByaW50IGRhdGEgaW4gQVNDSUkgY2hhcmFjdGVycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGluZWxlbiAqIHdpZHRoOyBpKyspIHsKKwkJCWlmICghaXNwcmludChsYi51Y1tpXSkgfHwgbGIudWNbaV0gPj0gMHg4MCkKKwkJCQlsYi51Y1tpXSA9ICcuJzsKKwkJfQorCQlsYi51Y1tpXSA9ICdcMCc7CisJCW12UHJpbnRmKCIgICAgJXNcbiIsIGxiLnVjKTsKKworCQkvKiB1cGRhdGUgcmVmZXJlbmNlcyAqLworCQlhZGRyICs9IGxpbmVsZW4gKiB3aWR0aDsKKwkJY291bnQgLT0gbGluZWxlbjsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGFsaWduX2FkZHJlc3MKKyoKKyogREVTQ1JJUFRJT046CisqIFVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIFdvcmthcm91bmQ6CisqIGlmIHNpemUgPSBsb25nL3dvcmQsICYgYWRkcmVzcyBub3QgYWxpZ25lZCB0byBsb25nL3dvcmQgKHJlc3BlY3RpdmVseSkKKyogYWxpZ24gYWRkcmVzcyB0byBtZWV0IHJlcXVlc3RlZCBzaXplCisqCisqIElOUFVUOgorKglhZGRyCQktIGFkZHJlc3MgaW4gbWVtb3J5IHRvIGFsaWduICgxLzIvNCkKKyoJc2l6ZQkJLSBzaXplIGluIGJ5dGVzCisqCisqIFJFVFVSTjoKKyoJdGhlIGFsaWduZWQgYWRkcmVzcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFsaWduX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgc2l6ZSkKK3sKKworCWlmICgoc2l6ZSA+IDEpICYmIChhZGRyICUgc2l6ZSA+IDApKSB7CisJCW12UHJpbnRmKCJFcnJvcjogUmVxdWVzdGVkIHVuYWxpZ25lZCBtZW1vcnkgYWRkcmVzcyAoMHgleClcbiIsICh1bnNpZ25lZCBpbnQpYWRkcik7CisJCWFkZHIgJj0gfihzaXplIC0gMSk7CisJCW12UHJpbnRmKCJVc2luZyBhbGlnbmVkIGFkZHJlc3MgKDB4JXgpXG4iLCAodW5zaWduZWQgaW50KWFkZHIpOworCX0KKwlyZXR1cm4gYWRkcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZG9fbWVtX21kCisqCisqIERFU0NSSVBUSU9OOgorKiBUaGUgY29tbWFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gZGlzcGxheSBtZW1vcnkgdmFsdWVzCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRvX21lbV9tZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBsZW5ndGg7CisJaW50IHNpemU7CisJaW50IHJjID0gMDsKKwkvKiBXZSB1c2UgdGhlIGxhc3Qgc3BlY2lmaWVkIHBhcmFtZXRlcnMsIHVubGVzcyBuZXcgb25lcyBhcmUKKwkgKiBlbnRlcmVkLgorCSAqLworCWFkZHIgPSBkcF9sYXN0X2FkZHI7CisJc2l6ZSA9IGRwX2xhc3Rfc2l6ZTsKKwlsZW5ndGggPSBkcF9sYXN0X2xlbmd0aDsKKworCWlmIChhcmdjIDwgMikKKwkJcmV0dXJuIENNRF9SRVRfVVNBR0U7CisKKwlpZiAoKGZsYWcgJiBDTURfRkxBR19SRVBFQVQpID09IDApIHsKKwkJLyogTmV3IGNvbW1hbmQgc3BlY2lmaWVkLiAgQ2hlY2sgZm9yIGEgc2l6ZSBzcGVjaWZpY2F0aW9uLgorCQkgKiBEZWZhdWx0cyB0byBsb25nIGlmIG5vIG9yIGluY29ycmVjdCBzcGVjaWZpY2F0aW9uLgorCQkgKi8KKwkJc2l6ZSA9IGNtZF9nZXRfZGF0YV9zaXplKGFyZ3ZbMF0sIDQpOworCQlpZiAoc2l6ZSA8IDApCisJCQlyZXR1cm4gMTsKKworCQkvKiBBZGRyZXNzIGlzIHNwZWNpZmllZCBzaW5jZSBhcmdjID4gMQorCQkqLworCQlhZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCisJCS8qIElmIGFub3RoZXIgcGFyYW1ldGVyLCBpdCBpcyB0aGUgbGVuZ3RoIHRvIGRpc3BsYXkuCisJCSAqIExlbmd0aCBpcyB0aGUgbnVtYmVyIG9mIG9iamVjdHMsIG5vdCBudW1iZXIgb2YgYnl0ZXMuCisJCSAqLworCQlpZiAoYXJnYyA+IDIpCisJCQlsZW5ndGggPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisJfQorCisJYWRkciA9IGFsaWduX2FkZHJlc3MoYWRkciwgc2l6ZSk7CisJLyogUHJpbnQgdGhlIGxpbmVzLiAqLworCXByaW50X2J1ZmZlcihhZGRyLCAodm9pZCAqKWFkZHIsIHNpemUsIGxlbmd0aCwgRElTUF9MSU5FX0xFTi9zaXplKTsKKwlhZGRyICs9IHNpemUqbGVuZ3RoOworCisKKwlkcF9sYXN0X2FkZHIgPSBhZGRyOworCWRwX2xhc3RfbGVuZ3RoID0gbGVuZ3RoOworCWRwX2xhc3Rfc2l6ZSA9IHNpemU7CisJcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19tZW1fbXcKKyoKKyogREVTQ1JJUFRJT046CisqIFRoZSBjb21tYW5kIGFsbG93cyB0aGUgdXNlciB0byB3cml0ZSB0byBtZW1vcnkKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fbWVtX213KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIHdyaXRldmFsLCBjb3VudDsKKwlpbnQgc2l6ZTsKKworCWlmICgoYXJnYyA8IDMpIHx8IChhcmdjID4gNCkpCisJCXJldHVybiBDTURfUkVUX1VTQUdFOworCisJLyogQ2hlY2sgZm9yIHNpemUgc3BlY2lmaWNhdGlvbi4KKwkqLworCXNpemUgPSBjbWRfZ2V0X2RhdGFfc2l6ZShhcmd2WzBdLCA0KTsKKwlpZiAoc2l6ZSA8IDEpCisJCXJldHVybiAxOworCisJLyogQWRkcmVzcyBpcyBzcGVjaWZpZWQgc2luY2UgYXJnYyA+IDEKKwkqLworCWFkZHIgPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisKKwlhZGRyID0gYWxpZ25fYWRkcmVzcyhhZGRyLCBzaXplKTsKKworCS8qIEdldCB0aGUgdmFsdWUgdG8gd3JpdGUuCisJKi8KKwl3cml0ZXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKworCS8qIENvdW50ID8gKi8KKwlpZiAoYXJnYyA9PSA0KQorCQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKwllbHNlCisJCWNvdW50ID0gMTsKKworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQlpZiAoc2l6ZSA9PSA0KQorCQkJKigodW5zaWduZWQgbG9uZyAqKWFkZHIpID0gKHVuc2lnbmVkIGxvbmcpd3JpdGV2YWw7CisJCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJCSooKHVuc2lnbmVkIHNob3J0ICopYWRkcikgPSAodW5zaWduZWQgc2hvcnQpd3JpdGV2YWw7CisJCWVsc2UKKwkJCSooKHVuc2lnbmVkIGNoYXIgKilhZGRyKSA9ICh1bnNpZ25lZCBjaGFyKXdyaXRldmFsOworCQlhZGRyICs9IHNpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vZF9tZW0oY21kX3RibF90ICpjbWR0cCwgaW50IGluY3JmbGFnLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBpOworCWludCBuYnl0ZXMsIHNpemU7CisKKwlpZiAoYXJnYyAhPSAyKQorCQlyZXR1cm4gQ01EX1JFVF9VU0FHRTsKKworCS8qIFdlIHVzZSB0aGUgbGFzdCBzcGVjaWZpZWQgcGFyYW1ldGVycywgdW5sZXNzIG5ldyBvbmVzIGFyZQorCSAqIGVudGVyZWQuCisJICovCisJYWRkciA9IG1tX2xhc3RfYWRkcjsKKwlzaXplID0gbW1fbGFzdF9zaXplOworCisJaWYgKChmbGFnICYgQ01EX0ZMQUdfUkVQRUFUKSA9PSAwKSB7CisJCS8qIE5ldyBjb21tYW5kIHNwZWNpZmllZC4gIENoZWNrIGZvciBhIHNpemUgc3BlY2lmaWNhdGlvbi4KKwkJICogRGVmYXVsdHMgdG8gbG9uZyBpZiBubyBvciBpbmNvcnJlY3Qgc3BlY2lmaWNhdGlvbi4KKwkJICovCisJCXNpemUgPSBjbWRfZ2V0X2RhdGFfc2l6ZShhcmd2WzBdLCA0KTsKKwkJaWYgKHNpemUgPCAwKQorCQkJcmV0dXJuIDE7CisKKwkJLyogQWRkcmVzcyBpcyBzcGVjaWZpZWQgc2luY2UgYXJnYyA+IDEKKwkJKi8KKwkJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKwl9CisKKworCWFkZHIgPSBhbGlnbl9hZGRyZXNzKGFkZHIsIHNpemUpOworCisJLyogUHJpbnQgdGhlIGFkZHJlc3MsIGZvbGxvd2VkIGJ5IHZhbHVlLiAgVGhlbiBhY2NlcHQgaW5wdXQgZm9yCisJICogdGhlIG5leHQgdmFsdWUuICBBIG5vbi1jb252ZXJ0ZWQgdmFsdWUgZXhpdHMuCisJICovCisJZG8geworCQltdlByaW50ZigiJTA4bHg6IiwgYWRkcik7CisJCWlmIChzaXplID09IDQpCisJCQltdlByaW50ZigiICUwOHgiLCAqKCh1bnNpZ25lZCBpbnQgKilhZGRyKSk7CisJCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJCW12UHJpbnRmKCIgJTA0eCIsICooKHVuc2lnbmVkIHNob3J0ICopYWRkcikpOworCQllbHNlCisJCQltdlByaW50ZigiICUwMngiLCAqKCh1bnNpZ25lZCBjaGFyICopYWRkcikpOworCisJCW5ieXRlcyA9IHJlYWRsaW5lKCIgPyAiKTsKKwkJaWYgKG5ieXRlcyA9PSAwIHx8IChuYnl0ZXMgPT0gMSAmJiBjb25zb2xlX2J1ZmZlclswXSA9PSAnLScpKSB7CisJCQkvKiA8Q1I+IHByZXNzZWQgYXMgb25seSBpbnB1dCwgZG9uJ3QgbW9kaWZ5IGN1cnJlbnQKKwkJCSAqIGxvY2F0aW9uIGFuZCBtb3ZlIHRvIG5leHQuICItIiBwcmVzc2VkIHdpbGwgZ28gYmFjay4KKwkJCSAqLworCQkJaWYgKGluY3JmbGFnKQorCQkJCWFkZHIgKz0gbmJ5dGVzID8gLXNpemUgOiBzaXplOworCQkJbmJ5dGVzID0gMTsKKwkJfSBlbHNlIHsKKwkJCWNoYXIgKmVuZHA7CisJCQlpID0gc2ltcGxlX3N0cnRvdWwoY29uc29sZV9idWZmZXIsICZlbmRwLCAxNik7CisJCQluYnl0ZXMgPSBlbmRwIC0gY29uc29sZV9idWZmZXI7CisJCQlpZiAobmJ5dGVzKSB7CisJCQkJaWYgKHNpemUgPT0gNCkKKwkJCQkJKigodW5zaWduZWQgaW50ICopYWRkcikgPSBpOworCQkJCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJCQkJKigodW5zaWduZWQgc2hvcnQgKilhZGRyKSA9IGk7CisJCQkJZWxzZQorCQkJCQkqKCh1bnNpZ25lZCBjaGFyICopYWRkcikgPSBpOworCQkJCWlmIChpbmNyZmxhZykKKwkJCQkJYWRkciArPSBzaXplOworCQkJfQorCQl9CisJfSB3aGlsZSAobmJ5dGVzKTsKKworCW1tX2xhc3RfYWRkciA9IGFkZHI7CisJbW1fbGFzdF9zaXplID0gc2l6ZTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZG9fbWVtX21tCisqCisqIERFU0NSSVBUSU9OOgorKiBUaGUgY29tbWFuZCBhbGxvd3MgdGhlIHVzZXIgdG8gbW9kaWZ5IGJ5dGVzIGluIG1lbW9yeQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBkb19tZW1fbW0oY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCXJldHVybiBtb2RfbWVtKGNtZHRwLCAxLCBmbGFnLCBhcmdjLCBhcmd2KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZG9fbWVtX2NtcAorKgorKiBERVNDUklQVElPTjoKKyogVGhlIGNvbW1hbmQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbXBhcmUgYnl0ZXMgaW4gbWVtb3J5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRvX21lbV9jbXAoY21kX3RibF90ICpjbWR0cCwgaW50IGZsYWcsIGludCBhcmdjLCBjaGFyICogY29uc3QgYXJndltdKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjEsIGFkZHIyLCBjb3VudCwgbmdvb2Q7CisJaW50IHNpemU7CisJaW50IHJjb2RlID0gMDsKKwljb25zdCBjaGFyICp0eXBlOworCisJaWYgKGFyZ2MgIT0gNCkKKwkJcmV0dXJuIENNRF9SRVRfVVNBR0U7CisKKwkvKiBDaGVjayBmb3Igc2l6ZSBzcGVjaWZpY2F0aW9uLgorCSovCisJc2l6ZSA9IGNtZF9nZXRfZGF0YV9zaXplKGFyZ3ZbMF0sIDQpOworCWlmIChzaXplIDwgMCkKKwkJcmV0dXJuIDE7CisKKwl0eXBlID0gc2l6ZSA9PSA0ID8gIndvcmQiIDogc2l6ZSA9PSAyID8gImhhbGZ3b3JkIiA6ICJieXRlIjsKKworCWFkZHIxID0gc2ltcGxlX3N0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTYpOworCisJYWRkcjIgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisKKwlhZGRyMSA9IGFsaWduX2FkZHJlc3MoYWRkcjEsIHNpemUpOworCWFkZHIyID0gYWxpZ25fYWRkcmVzcyhhZGRyMiwgc2l6ZSk7CisKKwljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCWZvciAobmdvb2QgPSAwOyBuZ29vZCA8IGNvdW50OyArK25nb29kKSB7CisJCXVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOworCQlpZiAoc2l6ZSA9PSA0KSB7CisJCQl3b3JkMSA9ICoodW5zaWduZWQgbG9uZyAqKWFkZHIxOworCQkJd29yZDIgPSAqKHVuc2lnbmVkIGxvbmcgKilhZGRyMjsKKwkJfSBlbHNlIGlmIChzaXplID09IDIpIHsKKwkJCXdvcmQxID0gKih1bnNpZ25lZCBzaG9ydCAqKWFkZHIxOworCQkJd29yZDIgPSAqKHVuc2lnbmVkIHNob3J0ICopYWRkcjI7CisJCX0gZWxzZSB7CisJCQl3b3JkMSA9ICoodW5zaWduZWQgY2hhciAqKWFkZHIxOworCQkJd29yZDIgPSAqKHVuc2lnbmVkIGNoYXIgKilhZGRyMjsKKwkJfQorCQlpZiAod29yZDEgIT0gd29yZDIpIHsKKwkJCW12UHJpbnRmKCIlcyBhdCAweCUwOGx4ICglIzAqbHgpICE9ICVzIGF0IDB4JTA4bHggKCUjMCpseClcbiIsCisJCQkJdHlwZSwgYWRkcjEsIHNpemUsIHdvcmQxLAorCQkJCXR5cGUsIGFkZHIyLCBzaXplLCB3b3JkMik7CisJCQlyY29kZSA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWFkZHIxICs9IHNpemU7CisJCWFkZHIyICs9IHNpemU7CisJfQorCisJbXZQcmludGYoIlRvdGFsIG9mICVsZCAlcyhzKSB3ZXJlIHRoZSBzYW1lXG4iLCBuZ29vZCwgdHlwZSk7CisJcmV0dXJuIHJjb2RlOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19tZW1fY3AKKyoKKyogREVTQ1JJUFRJT046CisqIFRoZSBjb21tYW5kIGFsbG93cyB0aGUgdXNlciB0byBjb3B5IGJ5dGVzIGZyb20vdG8gbWVtb3J5CisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGRvX21lbV9jcChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBkZXN0LCBjb3VudDsKKwlpbnQgc2l6ZTsKKworCWlmIChhcmdjICE9IDQpCisJCXJldHVybiBDTURfUkVUX1VTQUdFOworCisJLyogQ2hlY2sgZm9yIHNpemUgc3BlY2lmaWNhdGlvbi4KKwkqLworCXNpemUgPSBjbWRfZ2V0X2RhdGFfc2l6ZShhcmd2WzBdLCA0KTsKKwlpZiAoc2l6ZSA8IDApCisJCXJldHVybiAxOworCisJYWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKworCWRlc3QgPSBzaW1wbGVfc3RydG91bChhcmd2WzJdLCBOVUxMLCAxNik7CisKKwlhZGRyID0gYWxpZ25fYWRkcmVzcyhhZGRyLCBzaXplKTsKKwlkZXN0ID0gYWxpZ25fYWRkcmVzcyhkZXN0LCBzaXplKTsKKworCWNvdW50ID0gc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJbXZQcmludGYoIlplcm8gbGVuZ3RoID8/P1xuIik7CisJCXJldHVybiAxOworCX0KKwl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJaWYgKHNpemUgPT0gNCkKKwkJCSooKHVuc2lnbmVkIGxvbmcgKilkZXN0KSA9ICooKHVuc2lnbmVkIGxvbmcgKilhZGRyKTsKKwkJZWxzZSBpZiAoc2l6ZSA9PSAyKQorCQkJKigodW5zaWduZWQgc2hvcnQgKilkZXN0KSA9ICooKHVuc2lnbmVkIHNob3J0ICopYWRkcik7CisJCWVsc2UKKwkJCSooKHVuc2lnbmVkIGNoYXIgKilkZXN0KSA9ICooKHVuc2lnbmVkIGNoYXIgKilhZGRyKTsKKwkJYWRkciArPSBzaXplOworCQlkZXN0ICs9IHNpemU7CisJfQorCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBpcl9jbWQKKyoKKyogREVTQ1JJUFRJT046CisqIFRoZSBjb21tYW5kIGFsbG93cyB0aGUgdXNlciB0byB2aWV3IHRoZSBjb250ZW50cyBvZiB0aGUgTVYKKyogICAgICAgICAgICAgICAgaW50ZXJuYWwgcmVnaXN0ZXJzIGFuZCBtb2RpZnkgdGhlbS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgaXJfY21kKGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwlNVl9VMzIgcmVnTnVtID0gMHgwLCByZWdWYWwsIHJlZ1ZhbFRtcCwgcmVzOworCU1WXzggcmVnVmFsQmluWzQwXTsKKwlNVl84IGNtZFs0MF07CisJaW50IGk7CisJaW50IGogPSAwLCBmbGFnbSA9IDA7CisKKwlpZiAoYXJnYyA9PSAyKQorCQlyZWdOdW0gPSBzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJZWxzZSB7CisJCW12UHJpbnRmKCJVc2FnZTpcbiVzXG4iLCBjbWR0cC0+dXNhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZWdWYWwgPSBNVl9SRUdfUkVBRChyZWdOdW0gKyBJTlRFUl9SRUdTX0JBU0UpOworCXJlZ1ZhbFRtcCA9IHJlZ1ZhbDsKKwltdlByaW50ZigiSW50ZXJuYWwgcmVnaXN0ZXIgMHgleCB2YWx1ZSA6IDB4JXhcbiAiLCByZWdOdW0sIHJlZ1ZhbCk7CisJbXZQcmludGYoIlxuICAgIDMxICAgICAgMjQgICAgICAgIDE2ICAgICAgICAgOCAgICAgICAgIDAiKTsKKwltdlByaW50ZigiXG4gICAgIHwgICAgICAgfCAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgfFxuT0xEOiAiKTsKKworCWZvciAoaSA9IDMxOyBpID49IDA7IGktLSkgeworCQlpZiAocmVnVmFsVG1wID4gMCkgeworCQkJcmVzID0gcmVnVmFsVG1wICUgMjsKKwkJCXJlZ1ZhbFRtcCA9IChyZWdWYWxUbXAgLSByZXMpIC8gMjsKKwkJCWlmIChyZXMgPT0gMCkKKwkJCQlyZWdWYWxCaW5baV0gPSAnMCc7CisJCQllbHNlCisJCQkJcmVnVmFsQmluW2ldID0gJzEnOworCQl9IGVsc2UKKwkJCXJlZ1ZhbEJpbltpXSA9ICcwJzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQltdlByaW50ZigiJWMiLCByZWdWYWxCaW5baV0pOworCQlpZiAoKCgoaSsxKSAlIDQpID09IDApICYmIChpID4gMSkgJiYgKGkgPCAzMSkpCisJCQltdlByaW50ZigiLSIpOworCX0KKworCXJlYWRsaW5lKCJcbk5FVzogIik7CisJc3RyY3B5KGNtZCwgY29uc29sZV9idWZmZXIpOworCWlmICgoY21kWzBdID09ICcwJykgJiYgKGNtZFsxXSA9PSAneCcpKSB7CisJCXJlZ1ZhbCA9IHNpbXBsZV9zdHJ0b3VsKGNtZCwgTlVMTCwgMTYpOworCQlmbGFnbSA9IDE7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IDQwOyBpKyspIHsKKwkJCWlmIChjbWRbaV0gPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCWlmIChpID09IDQgfHwgaSA9PSA5IHx8IGkgPT0gMTQgfHwgaSA9PSAxOSB8fCBpID09IDI0IHx8IGkgPT0gMjkgfHwgaSA9PSAzNCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChjbWRbaV0gPT0gJzEnKSB7CisJCQkJcmVnVmFsID0gcmVnVmFsIHwgKDB4ODAwMDAwMDAgPj4gaik7CisJCQkJZmxhZ20gPSAxOworCQkJfSBlbHNlIGlmIChjbWRbaV0gPT0gJzAnKSB7CisJCQkJcmVnVmFsID0gcmVnVmFsICYgKH4oMHg4MDAwMDAwMCA+PiBqKSk7CisJCQkJZmxhZ20gPSAxOworCQkJfQorCQkJaisrOworCQl9CisJfQorCisJaWYgKGZsYWdtID09IDEpIHsKKwkJTVZfUkVHX1dSSVRFKHJlZ051bSArIElOVEVSX1JFR1NfQkFTRSwgcmVnVmFsKTsKKwkJbXZQcmludGYoIlxuTmV3IHZhbHVlID0gMHgleFxuXG4iLCBNVl9SRUdfUkVBRChyZWdOdW0gKworCQkJCQlJTlRFUl9SRUdTX0JBU0UpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3Vuc2lnbmVkIGludCB0cmFpbmluZ1JlYWRQaHlSZWcoaW50IHVpUmVnQWRkciwgaW50IHVpUHVwLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgdWlSZWc7CisJdW5zaWduZWQgaW50IGFkZHJMb3cgPSAweDNGICYgdWlSZWdBZGRyOworCXVuc2lnbmVkIGludCBhZGRySGkgPSAoKDB4QzAgJiB1aVJlZ0FkZHIpID4+IDYpOworCisJdWlSZWcgPSAoMSA8PCAzMSkgKyAodWlQdXAgPDwgMjIpICsgKHR5cGUgPDwgMjYpICsgKGFkZHJIaSA8PCAyOCkgKyAoYWRkckxvdyA8PCAxNik7CisJTVZfUkVHX1dSSVRFKFJFR19QSFlfUkVHSVNUUllfRklMRV9BQ0NFU1NfQUREUiwgdWlSZWcgJiAweDdGRkZGRkZGKTsKKwlNVl9SRUdfV1JJVEUoUkVHX1BIWV9SRUdJU1RSWV9GSUxFX0FDQ0VTU19BRERSLCB1aVJlZyk7CisKKwlkbyB7CisJCXVpUmVnID0gKChNVl9SRUdfUkVBRChSRUdfUEhZX1JFR0lTVFJZX0ZJTEVfQUNDRVNTX0FERFIpKSAmICgxIDw8IDMxKSk7CisJfSB3aGlsZSAodWlSZWcpOwkvKiBXYWl0IGZvciAnMCcgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSB0cmFuc2FjdGlvbiAqLworCisJdWlSZWcgPSBNVl9SRUdfUkVBRChSRUdfUEhZX1JFR0lTVFJZX0ZJTEVfQUNDRVNTX0FERFIpOworCXVpUmVnID0gdWlSZWcgJiAweEZGRkY7CisKKwlyZXR1cm4gdWlSZWc7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHRyYWluaW5nX2NtZAorKgorKiBERVNDUklQVElPTjoKKyogVGhlIGNvbW1hbmQgcHJpbnRzIHRoZSByZXN1bHRzIG9mIHRoZSBERFIzIFRyYWluaW5nCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHRyYWluaW5nX2NtZChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJTVZfVTMyIHVpQ3NFbmEsIHVpQ3MsIHVpUmVnLCB1aVB1cCwgdWlQaGFzZSwgdWlEZWxheTsKKwlNVl9VMzIgdWlSZFJkeURseSwgdWlSZFNtcGxEbHksIHVpRHEsIHVpQ2VudHJhbFR4UmVzLCB1aUNlbnRyYWxSeFJlczsKKwlNVl9VMzIgdWlQdXBOdW07CisKKwl1aUNzRW5hID0gTVZfUkVHX1JFQUQoUkVHX0REUjNfUkFOS19DVFJMX0FERFIpICYgMHhGOworCW12UHJpbnRmKCJERFIzIFRyYWluaW5nIHJlc3VsdHM6XG4iKTsKKworCXVpUHVwTnVtID0gNTsKKworCWZvciAodWlDcyA9IDA7IHVpQ3MgPCA0OyB1aUNzKyspIHsKKwkJaWYgKHVpQ3NFbmEgJiAoMSA8PCB1aUNzKSkgeworCQkJbXZQcmludGYoIkNTOiAlZFxuIiwgdWlDcyk7CisJCQlmb3IgKHVpUHVwID0gMDsgdWlQdXAgPCB1aVB1cE51bTsgdWlQdXArKykgeworCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDAgKyB1aUNzKjQsIHVpUHVwLCBSRUdfUEhZX0RBVEEpOworCQkJCXVpUGhhc2UgPSAodWlSZWcgPj4gNikgJiAweDc7CisJCQkJdWlEZWxheSA9IHVpUmVnICYgMHgxRjsKKwkJCQltdlByaW50ZigiV3JpdGUgTGV2ZWxpbmc6IFBVUDogJWQsIFBoYXNlOiAlZCwgRGVsYXk6ICVkXG4iLCB1aVB1cCwgdWlQaGFzZSwgdWlEZWxheSk7CisJCQl9CisKKwkJCWZvciAodWlQdXAgPSAwOyB1aVB1cCA8IHVpUHVwTnVtOyB1aVB1cCsrKSB7CisJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMiArIHVpQ3MqNCwgdWlQdXAsIFJFR19QSFlfREFUQSk7CisJCQkJdWlQaGFzZSA9ICh1aVJlZyA+PiA2KSAmIDB4NzsKKwkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOworCQkJCW12UHJpbnRmKCJSZWFkIExldmVsaW5nOiBQVVA6ICVkLCBQaGFzZTogJWQsIERlbGF5OiAlZFxuIiwgdWlQdXAsIHVpUGhhc2UsIHVpRGVsYXkpOworCQkJfQorCisJCQl1aVJkUmR5RGx5ID0gKChNVl9SRUdfUkVBRChSRUdfUkVBRF9EQVRBX1JFQURZX0RFTEFZU19BRERSKSA+PiAoOCp1aUNzKSkgJiAweDFGKTsKKwkJCXVpUmRTbXBsRGx5ID0gKChNVl9SRUdfUkVBRChSRUdfUkVBRF9EQVRBX1NBTVBMRV9ERUxBWVNfQUREUikgPj4gKDgqdWlDcykpICYgMHgxRik7CisJCQltdlByaW50ZigiUmVhZCBTYW1wbGUgRGVsYXk6XHQlZFxuIiwgdWlSZFNtcGxEbHkpOworCQkJbXZQcmludGYoIlJlYWQgUmVhZHkgRGVsYXk6XHQlZFxuIiwgdWlSZFJkeURseSk7CisKKwkJCS8qIFBCUyAqLworCQkJaWYgKHVpQ3MgPT0gMCkgeworCQkJCWZvciAodWlQdXAgPSAwOyB1aVB1cCA8IHVpUHVwTnVtOyB1aVB1cCsrKSB7CisJCQkJCWZvciAodWlEcSA9IDA7IHVpRHEgPCAxMDsgdWlEcSsrKSB7CisJCQkJCQlpZiAodWlEcSA9PSA5KQorCQkJCQkJCXVpRHErKzsKKworCQkJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHgxMCt1aURxK3VpQ3MqMHgxMiwgdWlQdXAsIFJFR19QSFlfREFUQSk7CisJCQkJCQl1aURlbGF5ID0gdWlSZWcgJiAweDFGOworCisJCQkJCQlpZiAodWlEcSA9PSAwKQorCQkJCQkJCW12UHJpbnRmKCJQQlMgVFg6IFBVUDogJWQ6ICIsIHVpUHVwKTsKKwkJCQkJCW12UHJpbnRmKCIlZCAiLCB1aURlbGF5KTsKKwkJCQkJfQorCQkJCQltdlByaW50ZigiXG4iKTsKKwkJCQl9CisJCQkJZm9yICh1aVB1cCA9IDA7IHVpUHVwIDwgdWlQdXBOdW07IHVpUHVwKyspIHsKKwkJCQkJZm9yICh1aURxID0gMDsgdWlEcSA8IDk7IHVpRHErKykgeworCQkJCQkJdWlSZWcgPSB0cmFpbmluZ1JlYWRQaHlSZWcoMHg1MCArIHVpRHEgKyB1aUNzKjB4MTIsCisJCQkJCQkJCQkgICB1aVB1cCwgUkVHX1BIWV9EQVRBKTsKKwkJCQkJCXVpRGVsYXkgPSB1aVJlZyAmIDB4MUY7CisKKwkJCQkJCWlmICh1aURxID09IDApCisJCQkJCQkJbXZQcmludGYoIlBCUyBSWDogUFVQOiAlZDogIiwgdWlQdXApOworCQkJCQkJbXZQcmludGYoIiVkICIsIHVpRGVsYXkpOworCQkJCQl9CisJCQkJCW12UHJpbnRmKCJcbiIpOworCQkJCX0KKwkJCX0KKworCQkJLypSZWFkIENlbnRyYWxpemF0aW9uIHdpbmRvd3Mgc2l6ZXMgZm9yIFNjcmF0Y2ggUEhZIHJlZ2lzdGVycyovCisJCQlmb3IgKHVpUHVwID0gMDsgdWlQdXAgPCB1aVB1cE51bTsgdWlQdXArKykgeworCQkJCXVpUmVnID0gdHJhaW5pbmdSZWFkUGh5UmVnKDB4QzAgKyB1aUNzLCB1aVB1cCwgUkVHX1BIWV9EQVRBKTsKKwkJCQl1aUNlbnRyYWxSeFJlcyA9IHVpUmVnID4+IDU7CisJCQkJdWlDZW50cmFsVHhSZXMgPSB1aVJlZyAmIDB4MUY7CisJCQkJbXZQcmludGYoIkNlbnRyYWwgd2luZG93IHNpemUgZm9yIFBVUCAlZCBpcyAlZChSWCkgYW5kICVkKFRYKVxuIiwKKwkJCQkJCXVpUHVwLCB1aUNlbnRyYWxSeFJlcywgdWlDZW50cmFsVHhSZXMpOworCQkJfQorCQl9CisJfQorCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBkb19tZW1fbXRlc3QKKyoKKyogREVTQ1JJUFRJT046CisqIFBlcmZvcm0gYSBtZW1vcnkgdGVzdC4gQSBtb3JlIGNvbXBsZXRlIGFsdGVybmF0aXZlIHRlc3QgY2FuIGJlCisqIGNvbmZpZ3VyZWQgdXNpbmcgQ09ORklHX1NZU19BTFRfTUVNVEVTVC4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9fbWVtX210ZXN0KGNtZF90YmxfdCAqY21kdHAsIGludCBmbGFnLCBpbnQgYXJnYywgY2hhciAqIGNvbnN0IGFyZ3ZbXSkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nCSphZGRyLCAqc3RhcnQsICplbmQ7CisJdW5zaWduZWQgbG9uZwl2YWw7CisJdW5zaWduZWQgbG9uZwlyZWFkYmFjazsKKwl1bnNpZ25lZCBsb25nCWVycnMgPSAwOworCWludCBpdGVyYXRpb25zID0gMTsKKwlpbnQgaXRlcmF0aW9uX2xpbWl0OworCXVuc2lnbmVkIGxvbmcJaW5jcjsKKwl1bnNpZ25lZCBsb25nCXBhdHRlcm47CisKKwlpZiAoYXJnYyA+IDEpCisJCXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcgKilzaW1wbGVfc3RydG91bChhcmd2WzFdLCBOVUxMLCAxNik7CisJZWxzZQorCQlzdGFydCA9ICh1bnNpZ25lZCBsb25nICopQ09ORklHX1NZU19NRU1URVNUX1NUQVJUOworCisJaWYgKGFyZ2MgPiAyKQorCQllbmQgPSAodW5zaWduZWQgbG9uZyAqKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMl0sIE5VTEwsIDE2KTsKKwllbHNlCisJCWVuZCA9ICh1bnNpZ25lZCBsb25nICopKENPTkZJR19TWVNfTUVNVEVTVF9FTkQpOworCisJc3RhcnQgPSAodW5zaWduZWQgbG9uZyAqKWFsaWduX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpc3RhcnQsIDQpOworCWVuZCA9ICh1bnNpZ25lZCBsb25nICopYWxpZ25fYWRkcmVzcygodW5zaWduZWQgbG9uZyllbmQsIDQpOworCisJaWYgKGFyZ2MgPiAzKQorCQlwYXR0ZXJuID0gKHVuc2lnbmVkIGxvbmcpc2ltcGxlX3N0cnRvdWwoYXJndlszXSwgTlVMTCwgMTYpOworCWVsc2UKKwkJcGF0dGVybiA9IDA7CisKKwlpZiAoYXJnYyA+IDQpCisJCWl0ZXJhdGlvbl9saW1pdCA9ICh1bnNpZ25lZCBsb25nKXNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKKwllbHNlCisJCWl0ZXJhdGlvbl9saW1pdCA9IDA7CisKKwlpbmNyID0gMTsKKwlmb3IgKDs7KSB7CisJCWlmIChpdGVyYXRpb25fbGltaXQgJiYgaXRlcmF0aW9ucyA+IGl0ZXJhdGlvbl9saW1pdCkgeworCQkJbXZQcmludGYoIlRlc3RlZCAlZCBpdGVyYXRpb24ocykgd2l0aCAlbHUgZXJyb3JzLlxuIiwKKwkJCQlpdGVyYXRpb25zLTEsIGVycnMpOworCQkJcmV0dXJuIGVycnMgIT0gMDsKKwkJfQorCQkrK2l0ZXJhdGlvbnM7CisKKwkJbXZQcmludGYoIlxyUGF0dGVybiAlMDhsWCAgV3JpdGluZy4uLiIsIHBhdHRlcm4pOworCQltdlByaW50ZigiJTEycyIsICIiKTsKKwkJbXZQcmludGYoIlxiXGJcYlxiXGJcYlxiXGJcYlxiIik7CisKKwkJZm9yIChhZGRyID0gc3RhcnQsIHZhbCA9IHBhdHRlcm47IGFkZHIgPCBlbmQ7IGFkZHIrKykgeworCQkJKmFkZHIgPSB2YWw7CisJCQl2YWwgKz0gaW5jcjsKKwkJfQorCisJCW12UHJpbnRmKCJSZWFkaW5nLi4uIik7CisKKwkJZm9yIChhZGRyID0gc3RhcnQsIHZhbCA9IHBhdHRlcm47IGFkZHIgPCBlbmQ7IGFkZHIrKykgeworCQkJcmVhZGJhY2sgPSAqYWRkcjsKKwkJCWlmIChyZWFkYmFjayAhPSB2YWwpIHsKKwkJCQltdlByaW50ZigiXG5NZW0gZXJyb3IgQCIpOworCQkJCW12UHJpbnRmKCIgMHglMDhYOiBmb3VuZCAlMDhsWCwgZXhwZWN0ZWQgJTA4bFhcbiIsCisJCQkJCSh1bnNpZ25lZCBpbnQpKHVpbnRwdHJfdClhZGRyLCByZWFkYmFjaywgdmFsKTsKKwkJCQllcnJzKys7CisJCQl9CisJCQl2YWwgKz0gaW5jcjsKKwkJfQorCisJCS8qCisJCSAqIEZsaXAgdGhlIHBhdHRlcm4gZWFjaCB0aW1lIHRvIG1ha2UgbG90cyBvZiB6ZXJvcyBhbmQKKwkJICogdGhlbiwgdGhlIG5leHQgdGltZSwgbG90cyBvZiBvbmVzLiAgV2UgZGVjcmVtZW50CisJCSAqIHRoZSAibmVnYXRpdmUiIHBhdHRlcm5zIGFuZCBpbmNyZW1lbnQgdGhlICJwb3NpdGl2ZSIKKwkJICogcGF0dGVybnMgdG8gcHJlc2VydmUgdGhpcyBmZWF0dXJlLgorCQkgKi8KKwkJaWYgKHBhdHRlcm4gJiAweDgwMDAwMDAwKQorCQkJcGF0dGVybiA9IC1wYXR0ZXJuOwkvKiBjb21wbGVtZW50ICYgaW5jcmVtZW50ICovCisJCWVsc2UKKwkJCXBhdHRlcm4gPSB+cGF0dGVybjsKKworCQlpbmNyID0gLWluY3I7CisJfQorCXJldHVybiAwOwkvKiBub3QgcmVhY2hlZCAqLworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL3hvcl9tZW10ZXN0LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcveG9yX21lbXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzI4OWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL3hvcl9tZW10ZXN0LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworCitUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsCitJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKK2FsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQorRmlsZSB1bmRlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBsaWNlbnNlIGFsdGVybmF0aXZlcywgcGxlYXNlIChpKSBkZWxldGUgdGhpcworaW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KK2xpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKK01hcnZlbGwgY29weXJpZ2h0IG5vdGljZSBhYm92ZS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQ29tbWVyY2lhbCBMaWNlbnNlIE9wdGlvbgorCitJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAorbGljZW5zZSBhZ3JlZW1lbnQgKGEgIkNvbW1lcmNpYWwgTGljZW5zZSIpIHdpdGggTWFydmVsbCwgdGhlIEZpbGUgaXMgbGljZW5zZWQKK3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKworSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorbW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKK2F2YWlsYWJsZSBhbG9uZyB3aXRoIHRoZSBGaWxlIGluIHRoZSBsaWNlbnNlLnR4dCBmaWxlIG9yIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKK29uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgorCitUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCitESVNDTEFJTUVELiAgVGhlIEdQTCBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGlzIHdhcnJhbnR5CitkaXNjbGFpbWVyLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK01hcnZlbGwgQlNEIExpY2Vuc2UgT3B0aW9uCisKK0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKK21vZGlmeSB0aGlzIEZpbGUgdW5kZXIgdGhlIGZvbGxvd2luZyBsaWNlbnNpbmcgdGVybXMuCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKwkgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgICogICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorCQlub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisJCWRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKKwkJdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorCQlzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCitESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCitBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKK0xPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCitTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgImNvbW1hbmQuaCIKKyNpbmNsdWRlICJwcmludGYuaCIKKyNpbmNsdWRlICJtdlVhcnQuaCIKKyNpbmNsdWRlICJsaWJfdXRpbHMuaCIKKyNpbmNsdWRlICJtdl9vcy5oIgorI2luY2x1ZGUgInNvY19zcGVjLmgiCisjaW5jbHVkZSAiZGRyM19od3NfaHdfdHJhaW5pbmdfZGVmLmgiCisjaW5jbHVkZSAic3RkaW50LmgiCisjaW5jbHVkZSAiZ3RPcy9tdlhvci5oIgorI2luY2x1ZGUgImd0T3MvbXZYb3JSZWdzLmgiCisjaW5jbHVkZSAic3RkbGliLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInhvcl9tZW10ZXN0LmgiCisKK2V4dGVybiBHVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQoR1RfVTMyIGRldk51bSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGZpbGxLaWxsZXJQYXR0ZXJuCisqCisqIERFU0NSSVBUSU9OOgorKiBXcml0ZXMgdGhlIGtpbGxlciBwYXR0ZXJuIGluIHRoZSBzcGVjaWZpZWQgc291cmNlIGFkZHJlc3MgaW4gRFJBTQorKgorKiBJTlBVVDoKKyoJbkJhc2UJCS0gYmFzZSBhZGRyZXNzIHRvIHN0YXJ0IHdyaXRpbmcgdG8KKyoJblNpemUJCS0gc2l6ZSBvZiB0aGUgYmxvY2sgaW4gYnl0ZXMKKyoJbmJ1c1dpZHRoCS0gYnVzIHdpZHRoLCBtdXN0IGJlIG11bHRpcGx5IG9mIDMyCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBmaWxsS2lsbGVyUGF0dGVybihNVl9VMzIgbkJhc2UsIE1WX1UzMiBuU2l6ZSwgTVZfVTMyIG5idXNXaWR0aCkKK3sKKwlNVl9VOCBraWxsZXJQYXR0ZXJuQnVzU3RhdGVbU1RfS1BfTEVOXSA9IEtJTExFUl9QQVRURVJOX0JVU19TVEFURTsKKwlNVl9VOCBraWxsZXJQYXR0ZXJuQml0U3RhdGVbU1RfS1BfTEVOXSA9IEtJTExFUl9QQVRURVJOX0JJVF9TVEFURTsKKwlNVl9VMzIgbk9mZnNldCA9IDA7CisJTVZfVTMyIG5OdW1PZldvcmQgPSBuYnVzV2lkdGggLyAzMjsKKwlNVl9VMzIgblBhdHRlcm47CisJTVZfVTMyIG5JbmRleCAgID0gMDsKKwlNVl9VMzIgblZpY0JpdCAgPSBCSVQwOworCU1WX1UzMiBuVmljV29yZCA9IDA7CisJTVZfVTMyIG5Xb3JkOworCisJd2hpbGUgKG5PZmZzZXQgPCBuU2l6ZSkgeworCQlpZiAobkluZGV4ID09IFNUX0tQX0xFTikgeworCQkJbkluZGV4ID0gMDsKKwkJCW5WaWNCaXQgPDw9IDE7CisJCQlpZiAoblZpY0JpdCA9PSAwKSB7CisJCQkJblZpY0JpdCA9IEJJVDA7CisJCQkJblZpY1dvcmQrKzsKKwkJCQlpZiAoblZpY1dvcmQgPT0gbk51bU9mV29yZCkKKwkJCQkJblZpY1dvcmQgPSAwOworCQkJfQorCQl9CisJCWZvciAobldvcmQgPSAwOyAoKG5Xb3JkIDwgbk51bU9mV29yZCkgJiYgKG5PZmZzZXQgPCBuU2l6ZSkpOyBuV29yZCsrLCBuT2Zmc2V0ICs9IDB4NCkgeworCQkJblBhdHRlcm4gPSBCVVNfU1RBVFVTKGtpbGxlclBhdHRlcm5CdXNTdGF0ZVtuSW5kZXhdKTsKKwkJCWlmIChuV29yZCA9PSBuVmljV29yZCkKKwkJCQluUGF0dGVybiA9ICgoa2lsbGVyUGF0dGVybkJpdFN0YXRlW25JbmRleF0pID8KKwkJCQkJCShuUGF0dGVybiB8IG5WaWNCaXQpIDogKG5QYXR0ZXJuICYgfm5WaWNCaXQpKTsKKworCQkJTVZfTUVNSU9fTEUzMl9XUklURShuQmFzZSArIG5PZmZzZXQsIG5QYXR0ZXJuKTsKKwkJfQorCQluSW5kZXgrKzsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGNvbmZpZ3VyZU1lbW9yeU1hcHBpbmcKKyoKKyogREVTQ1JJUFRJT046CisqIE9wZW5zIG1lbW9yeSB3aW5kb3dzIGluIHRoZSBYT1IgRW5naW5lIHRvIHRoZSBEUkFNIGFuZCBTUkFNCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBjb25maWd1cmVNZW1vcnlNYXBwaW5nKCkKK3sKKwlNVl9VMzIgbWF4X2NzOworCU1WX1UzMiB1aUNzRW5hID0gMCwgY3NfYzsKKyNpZm5kZWYgTVY4OEY2NzJYCisJbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoMCk7CisjZWxzZQorCW1heF9jcyA9IDI7CisjZW5kaWYKKwlmb3IgKGNzX2MgPSAwOyBjc19jIDwgbWF4X2NzOyBjc19jKyspCisJCXVpQ3NFbmEgfD0gMSA8PCBjc19jOworCisJLyogZW5hYmxlIFNSQU0gd2luZG93ICovCisJdWlDc0VuYSB8PSAxIDw8IFNSQU1fV0lOX0lEOworCW1heF9jcysrOworCS8qIGNvbmZpZ3VyZSBYT1IgZW5naW5lIHdpbmRvd3MgKi8KKwltdlN5c1hvckluaXQobWF4X2NzLCB1aUNzRW5hLCAweDgwMDAwMDAwLCAwKTsKKworCS8qIHNocmluayBmaXJzdCBEUkFNKENTMCkgd2luZG93IHRvIDB4NDAwMDAwMDAgKGJ5dGVzKQorCSAqIHRvIGF2b2lkIG1lbW9yeSBtYXBwaW5nIGNvbmZsaWN0OgorCSAqIEZpcnN0IERSQU0oQ1MwKSB3aW5kb3cgc3RhcnRzIGluIDB4MCBhbmQgZW5kcyBpbiAweDgwMDAwMDAwCisJICogU1JBTSB3aW5kb3cgc3RhcnRzIGluIDB4NDAwMDAwMDAKKwkgKiBIZW5jZSwgdGhlcmUgaXMgYSBjb25mbGljdCAqLworCU1WX1JFR19XUklURShYT1JfU0laRV9NQVNLX1JFRygwLCAwKSwgMHgzRkZGMDAwMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFhPUkNhbGN1bGF0ZUNSQworKgorKiBERVNDUklQVElPTjoKKyogQ2FsY3VsYXRlcyBjcmMzMmMgdXNpbmcgdGhlIFhPUiBlbmdpbmUKKyoKKyogSU5QVVQ6CisqCW5DaGFubmVsCS0gY2hhbm5lbCBudW1iZXIgKDAuLjMpCisqCW5TcmNBZGRyCS0gc291cmNlIGFkZHJlc3MKKyoJbkJ5dGVDbnQJLSBzaXplIG9mIHRoZSBibG9jayBpbiBieXRlcworKgorKiBPVVRQVVQ6CisqCXJlcwkJLSBjcmMzMmMgcmVzdWx0CisqCisqIFJFVFVSTjoKKyoJTVZfRVJST1IsIGluIGNhc2Ugb2YgYW55IGVycm9yIGluIGNhbGN1bGF0aW9uCisqCU1WX09LLCBvdGhlcndpc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9TVEFUVVMgWE9SQ2FsY3VsYXRlQ1JDKE1WX1UzMiBuQ2hhbm5lbCwgTVZfVTMyIG5TcmNBZGRyLCBNVl9VMzIgbkJ5dGVDbnQsIE1WX1UzMiAqcmVzKQoreworCisJTVZfVTMyIG5UaW1lb3V0ID0gWE9SX0VOR0lORV9USU1FT1VUOworCU1WX1hPUl9ERVNDIFhvckRlc2M7CisJTVZfWE9SX0RFU0MgKnBYb3JEZXNjID0gJlhvckRlc2M7CisJTVZfVTMyIG5Yb3JDaGFubmVsID0gWE9SX0NIQU4obkNoYW5uZWwpOworCisJLyogYWxpZ24gcG9pbnRlciBhZGRyZXNzIHRvIGJlIG11bHRpcGxlIG9mIDMyICovCisJcFhvckRlc2MgPSAoTVZfWE9SX0RFU0MgKikoKChNVl9VMzIpKCh2b2lkICopcFhvckRlc2MgKyAzMikpICYgfigzMiAtIDEpKTsKKworCW1lbXNldCgodm9pZCAqKXBYb3JEZXNjLCAwLCBzaXplb2YoTVZfQ1JDX0RNQV9ERVNDKSk7CisKKwkvKiBjbGVhbiBwcmV2aW91cyBpbmRpY2F0aW9uIGZyb20gZW5naW5lICovCisJTVZfUkVHX1dSSVRFKFhPUl9DQVVTRV9SRUcoWE9SX1VOSVQobkNoYW5uZWwpKSwgMCk7CisKKwltZW1zZXQoKHZvaWQgKilwWG9yRGVzYywgMCwgc2l6ZW9mKE1WX0NSQ19ETUFfREVTQykpOworCXBYb3JEZXNjLT5zcmNBZGQwCQk9IG5TcmNBZGRyOworCXBYb3JEZXNjLT5ieXRlQ250CQk9IG5CeXRlQ250OworCXBYb3JEZXNjLT5kZXNjQ29tbWFuZAkJPSBCSVQzMDsKKwlwWG9yRGVzYy0+cGh5TmV4dERlc2NQdHIJPSAwOworCXBYb3JEZXNjLT5zdGF0dXMJCT0gQklUMzE7CisJcFhvckRlc2MtPmNyYzMyUmVzdWx0CQk9IDA7CisKKwkvKiB3YWl0IGZvciBwcmV2aW91cyB0cmFuc2ZlciB0byBmaW5uaXNoICovCisJd2hpbGUgKG12WG9yU3RhdGVHZXQobkNoYW5uZWwpICE9IE1WX0lETEUpCisJCTsKKworCS8qIGRpc2FibGUgYWRkcmVzcyBvdmVycmlkZSAqLworCU1WX1JFR19XUklURShYT1JfT1ZFUlJJREVfQ1RSTF9SRUcobkNoYW5uZWwpLCAweDApOworCisJaWYgKG12WG9yVHJhbnNmZXIobkNoYW5uZWwsIE1WX0NSQzMyLCAoTVZfVTMyKXBYb3JEZXNjKSAhPSBNVl9PSykgeworCQltdlByaW50ZigiJXM6IEVycm9yIGR1cmluZyBYT1IgQ1JDLi4uIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTVZfRVJST1I7CisJfQorCisJLyogd2FpdCBmb3IgdGhlIGVuZ2luZSB0byBmaW5pc2ggKi8KKwl3aGlsZSAoKE1WX1JFR19SRUFEKFhPUl9DQVVTRV9SRUcoWE9SX1VOSVQobkNoYW5uZWwpKSkgJiAoKEJJVDF8QklUMCkgPDwgKDE2Km5Yb3JDaGFubmVsKSkpID09IDApIHsKKwkJaWYgKG5UaW1lb3V0LS0gPT0gMCkgeworCQkJbXZQcmludGYoIiVzOiBYT1IgQ1JDIHRpbWVvdXQhIVxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIE1WX0VSUk9SOworCQl9CisJfQorCisJblRpbWVvdXQgPSBYT1JfRU5HSU5FX1RJTUVPVVQ7CisJd2hpbGUgKG12WG9yU3RhdGVHZXQobkNoYW5uZWwpICE9IE1WX0lETEUpIHsKKwkJaWYgKG5UaW1lb3V0LS0gPT0gMCkgeworCQkJbXZQcmludGYoIiVzOiBYT1IgQ1JDIHRpbWVvdXQgMCEhXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gTVZfRVJST1I7CisJCX0KKwl9CisKKwkqcmVzID0gcFhvckRlc2MtPmNyYzMyUmVzdWx0OworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZG9feG9yTWVtVGVzdAorKgorKiBERVNDUklQVElPTjoKKyogVGhlIGNvbW1hbmQgcnVuIG1lbW9yeSB0ZXN0IHRoYXQgaXMgYmFzZWQgb24gdGhlIFhPUiBlbmdpbmUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZG9feG9yTWVtVGVzdChjbWRfdGJsX3QgKmNtZHRwLCBpbnQgZmxhZywgaW50IGFyZ2MsIGNoYXIgKiBjb25zdCBhcmd2W10pCit7CisJTVZfU1RBVFVTIHN0YXR1czsKKwlNVl9VMzIgbkJsb2NrQ1JDLCBuT2Zmc2V0SW5EZXN0LCBuT2Zmc2V0LCBuQ1JDLCBpLCBuU291cmNlQWRkciwgbkRlc3RBZGRyOworCU1WX1UzMiBzb3VyY2VCYXNlID0gU09VUkNFX0FERFJFU1NfQkFTRTsKKwlNVl9VMzIgZGVzdEJhc2UgPSBERVNUQU5USU9OX0FERFJFU1NfQkFTRTsKKwlNVl9VMzIgZGVzdFNpemUgPSBERVNUQU5USU9OX1NJWkU7CisJTVZfVTMyIGl0ZXJhdGlvbnMgPSAxOworCisJaWYgKGFyZ2MgPiAxKQorCQluU291cmNlQWRkciA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDE2KTsKKworCWlmIChhcmdjID4gMikKKwkJbkRlc3RBZGRyID0gc2ltcGxlX3N0cnRvdWwoYXJndlsyXSwgTlVMTCwgMTYpOworCisJaWYgKGFyZ2MgPiAzKQorCQlkZXN0U2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbM10sIE5VTEwsIDE2KTsKKworCWlmIChhcmdjID4gNCkKKwkJaXRlcmF0aW9ucyA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbNF0sIE5VTEwsIDE2KTsKKworCS8qIGNoZWNrIGRlc3RTaXplLCBtdXN0IGJlIG11bHRpcGx5IG9mIDFNQiAqLworCWlmIChkZXN0U2l6ZSAmIChfMU0gLSAxKSkgeworCQltdlByaW50ZigiRXJyb3I6IERlc3RpbmF0aW9uIHNpemUgbXVzdCBiZSBtdWx0aXBseSBvZiAweCVYKDFNQilcbiIsIF8xTSk7CisJCW12U3lzWG9yRmluaXNoKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwljb25maWd1cmVNZW1vcnlNYXBwaW5nKCk7CisKKwkvKiB3cml0ZSB0aGUga2lsbGVyIHBhdHRlcm4gaW4gdGhlIHNvdXJjZSBibG9jayAqLworCWZpbGxLaWxsZXJQYXR0ZXJuKHNvdXJjZUJhc2UsIEJMT0NLX1NJWkUsIDY0KTsKKwlmaWxsS2lsbGVyUGF0dGVybihzb3VyY2VCYXNlICsgQkxPQ0tfU0laRSwgQkxPQ0tfU0laRSwgMTI4KTsKKworCXN0YXR1cyA9IFhPUkNhbGN1bGF0ZUNSQygyLCBzb3VyY2VCYXNlLCBUT1RBTF9CTE9DS19TSVpFLCAmbkJsb2NrQ1JDKTsKKwlDSEVDS19DUkNfU1RBVFVTKHN0YXR1cyk7CisJbXZQcmludGYoIm5CbG9ja0NSQyAleFxuIiwgbkJsb2NrQ1JDKTsKKworCS8qIFN0YXJ0IGNvcHlpbmcgYmxvY2tzICovCisJZm9yIChpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworCQlmb3IgKG5PZmZzZXRJbkRlc3QgPSAwOyBuT2Zmc2V0SW5EZXN0IDwgZGVzdFNpemU7IG5PZmZzZXRJbkRlc3QgKz0gVE9UQUxfQkxPQ0tfU0laRSkgeworCisJCQkvKiBDb3B5IGJsb2NrIHRvIHRoZSBjdXJyZW50IGRlc3RpbmF0aW9uIGFkZHJlc3MqLworCQkJZm9yIChuT2Zmc2V0ID0gMDsgbk9mZnNldCA8IFRPVEFMX0JMT0NLX1NJWkU7IG5PZmZzZXQgKz0gQ1BVX0JVUlNUX1NJWkUpIHsKKwkJCQluU291cmNlQWRkciA9IHNvdXJjZUJhc2UgKyBuT2Zmc2V0OworCQkJCW5EZXN0QWRkciA9IGRlc3RCYXNlICsgbk9mZnNldEluRGVzdCArIG5PZmZzZXQ7CisJCQkJTVZfUExEX1JBTkdFKG5EZXN0QWRkciwgbkRlc3RBZGRyICsgQ1BVX0JVUlNUX1NJWkUpOworCQkJCW1lbWNweSgodm9pZCAqKW5EZXN0QWRkciwgKHZvaWQgKiluU291cmNlQWRkciwgQ1BVX0JVUlNUX1NJWkUpOworCQkJCU1WX0ZMVVNIX0NBQ0hFX0wxKG5EZXN0QWRkciwgbkRlc3RBZGRyICsgQ1BVX0JVUlNUX1NJWkUpOworCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgdGhlIGNvcGllZCBibG9ja3MgaW4gZGVzdGluYXRpb24gKi8KKwkJZm9yIChuT2Zmc2V0SW5EZXN0ID0gMDsgbk9mZnNldEluRGVzdCA8IGRlc3RTaXplOyBuT2Zmc2V0SW5EZXN0ICs9IFRPVEFMX0JMT0NLX1NJWkUpIHsKKwkJCW5EZXN0QWRkciA9IGRlc3RCYXNlICsgbk9mZnNldEluRGVzdDsKKwkJCXN0YXR1cyA9IFhPUkNhbGN1bGF0ZUNSQygyLCBuRGVzdEFkZHIsIFRPVEFMX0JMT0NLX1NJWkUsICZuQ1JDKTsKKwkJCUNIRUNLX0NSQ19TVEFUVVMoc3RhdHVzKTsKKwkJCWlmIChuQ1JDICE9IG5CbG9ja0NSQykgeworCQkJCW12UHJpbnRmKCJFcnJvciBhdCBCbG9jayBzdGFydCBhZGRyZXNzICVYXG4iLCBuRGVzdEFkZHIpOworCQkJCW12UHJpbnRmKCJDUkMgd2FzICVYIGV4cGVjdGVkICVYXG4iLCBuQ1JDLCBuQmxvY2tDUkMpOworCQkJCW12U3lzWG9yRmluaXNoKCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCW12UHJpbnRmKCJcYlxiXGJcYiU0ZCIsIGkpOworCX0KKwltdlByaW50ZigiXGJcYlxiXGIiKTsKKwltdlByaW50ZigiTWVtVGVzdCBlbmQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwltdlN5c1hvckZpbmlzaCgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUb3BvbG9neURlZi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL3hvcl9tZW10ZXN0LmgKc2ltaWxhcml0eSBpbmRleCA2NCUKcmVuYW1lIGZyb20gdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaApyZW5hbWUgdG8gdG9vbHMvbWFydmVsbC9iaW5faGRyL3BsYXRmb3JtL3V0aWxzL2RlYnVnL3hvcl9tZW10ZXN0LmgKaW5kZXggZGE4MmUyNC4uOTFkN2FiNyAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvcGxhdGZvcm0vdXRpbHMvZGVidWcveG9yX21lbXRlc3QuaApAQCAtMSw0ICsxLDMgQEAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIENvcHlyaWdodCAoQykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCiAKQEAgLTYyLDc5ICs2MSw4NSBAQAogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICi0jZGVmaW5lIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9ICiAKKyNkZWZpbmUgU1JBTV9XSU5fSUQJCTB4NAorI2RlZmluZSBTUkFNX1dJTl9CQVNFCQkweDQwMDAwMDAwCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqVE9QT0xPR1kqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIENPTkZJR19ERFIzCi10eXBlZGVmIGVudW0KLXsKLSAgIFNQRUVEX0JJTl9ERFJfODAwRCwKLSAgIFNQRUVEX0JJTl9ERFJfODAwRSwKLSAgIFNQRUVEX0JJTl9ERFJfMTA2NkUsCi0gICBTUEVFRF9CSU5fRERSXzEwNjZGLAotICAgU1BFRURfQklOX0REUl8xMDY2RywKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0YsCi0gICBTUEVFRF9CSU5fRERSXzEzMzNHLAotICAgU1BFRURfQklOX0REUl8xMzMzSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTMzM0osCi0gICBTUEVFRF9CSU5fRERSXzE2MDBHLAotICAgU1BFRURfQklOX0REUl8xNjAwSCwKLSAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLLAotICAgU1BFRURfQklOX0REUl8xODY2SiwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2NkssCi0gICBTUEVFRF9CSU5fRERSXzE4NjZMLAotICAgU1BFRURfQklOX0REUl8xODY2TSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM0ssCi0gICBTUEVFRF9CSU5fRERSXzIxMzNMLAotICAgU1BFRURfQklOX0REUl8yMTMzTSwKLSAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCisjZGVmaW5lIFhPUl9FTkdJTkVfVElNRU9VVAkweDUwMDAwMDAKIAotICAgU1BFRURfQklOX0REUl8xMzMzSF9FWFQsCi0gICBTUEVFRF9CSU5fRERSXzE2MDBLX0VYVCwKLSAgIFNQRUVEX0JJTl9ERFJfMTg2Nk1fRVhUCi19TVZfSFdTX1NQRUVEX0JJTjsKKyNkZWZpbmUgU1RfS1BfTEVOCQk1OQorI2RlZmluZSBPTkUJCQkweGZmZmZmZmZmCisjZGVmaW5lIFpFUk8JCQkwCisjZGVmaW5lIEJVU19TVEFUVVMoblZhbHVlKQkoKG5WYWx1ZSkgPyBPTkUgOiBaRVJPKQorI2RlZmluZSBCSVQoWCkJCQkoMHgxIDw8IFgpCiAKLXR5cGVkZWYgZW51bSAKLXsKLSAgRERSX0ZSRVFfTE9XX0ZSRVEsCi0gIEREUl9GUkVRXzQwMCwKLSAgRERSX0ZSRVFfNTMzLAotICBERFJfRlJFUV82NjcsCi0gIEREUl9GUkVRXzgwMCwKLSAgRERSX0ZSRVFfOTMzLAotICBERFJfRlJFUV8xMDY2LAotICBERFJfRlJFUV8zMTEsCi0gIEREUl9GUkVRXzMzMywKLSAgRERSX0ZSRVFfNDY3LAotICBERFJfRlJFUV84NTAsCi0gIEREUl9GUkVRXzYwMCwKLSAgRERSX0ZSRVFfMzAwLAotICBERFJfRlJFUV85MDAsCi0gIEREUl9GUkVRXzM2MCwKLSAgRERSX0ZSRVFfMTAwMCwKLSAgIEREUl9GUkVRX0xJTUlUCi19TVZfSFdTX0REUl9GUkVROworI2RlZmluZSBOVU1fT0ZfREVTQwkJOAorI2RlZmluZSBERVNDX1NJWkUJCV84TQogCi10eXBlZGVmIGVudW0KLXsKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDRCwKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJQLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkFTLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkMsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQxSywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSRDJLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UEQsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcxSywKLSAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdEZBVzJLLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1RSLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlRQLAotICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190V1IsCi0gICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RNT0QKLX1zcGVlZEJpblRhYmxlRWxlbWVudHM7Ci0jZW5kaWYgLypDT05GSUdfRERSMyAqLwotI2VuZGlmIC8qIF9NVl9ERFIzX1RPUE9MT0dZX0RFRl9IICovCisjZGVmaW5lIFNPVVJDRV9BRERSRVNTX0JBU0UgICAgMHg4MzAwMDAwMAorI2RlZmluZSBCTE9DS19TSVpFICAgICAgICAgICAgIF8xTQorI2RlZmluZSBUT1RBTF9CTE9DS19TSVpFICAgICAgIChCTE9DS19TSVpFKjIpCisjZGVmaW5lIEtJTExFUl82NEJJVF9CQVNFICAgICAgU09VUkNFX0FERFJFU1NfQkFTRQorI2RlZmluZSBLSUxMRVJfMTI4QklUX0JBU0UgICAgIChLSUxMRVJfNjRCSVRfQkFTRSArIEJMT0NLX1NJWkUpCisjZGVmaW5lIENQVV9CVVJTVF9TSVpFICAgICAgICAgXzFLCiAKKyNkZWZpbmUgREVTVEFOVElPTl9BRERSRVNTX0JBU0UgMHg4NDAwMDAwMAorI2RlZmluZSBERVNUQU5USU9OX1NJWkUgICAgICAgICBfMTI4TQogCisjZGVmaW5lIE5VTV9PRl9YT1JfRU5HSU5FICAgICAgICAgICAgICA0CisjZGVmaW5lIFhPUl9CTE9DS19TSVpFICAgICAgICAgICAgICAgICAoXzE2TSAtIDEpCisjZGVmaW5lIFhPUl9TT1VSQ0VfQUREUkVTUyhuWG9yTnVtKSAgICAoMHgxMDAwMDAwMCArIF8xMjhNKm5Yb3JOdW0pCisjZGVmaW5lIFhPUl9ERVNUX0FERFJFU1Moblhvck51bSkgICAgICAoWE9SX1NPVVJDRV9BRERSRVNTKG5Yb3JOdW0pICsgKERFU0NfU0laRSpOVU1fT0ZfREVTQykpCisKKyNkZWZpbmUgTVZfUExEKEFkZHJlc3MpXAore1wKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygicGxkIFslMF0iIDogOiAiciIgKEFkZHJlc3MpKTtcCit9CisKKyNkZWZpbmUgTVZfUExEX1JBTkdFKGZyb20sIHRvKVwKK3tcCisJTVZfVTMyIGFkZHI7XAorCWZvciAoYWRkciA9IGZyb207IGFkZHIgPCB0bzsgYWRkciArPSAzMikge1wKKwkJTVZfUExEKGFkZHIpO1wKKwl9IFwKK30KKworI2RlZmluZSBDSEVDS19DUkNfU1RBVFVTKHN0YXR1cylcCit7XAorCWlmIChzdGF0dXMgIT0gTVZfT0spIHtcCisJCW12UHJpbnRmKCJGYWlsZWQgdG8gY2FsY3VsYXRlIENSQzMyXG4iKTtcCisJCXJldHVybiAxO1wKKwl9IFwKK30KKwordm9pZCBjYWNoZV9pbnYoTVZfVTMyIGRlc3QpOwordm9pZCBmbHVzaF9sMV92NyhNVl9VMzIgZGVzdCk7CisKKyNkZWZpbmUgTVZfRkxVU0hfQ0FDSEVfTDEoZnJvbSwgdG8pXAore1wKKwlNVl9VMzIgYWRkcjtcCisJZm9yIChhZGRyID0gZnJvbTsgYWRkciA8IHRvOyBhZGRyICs9IDMyKSB7XAorCQljYWNoZV9pbnYoYWRkcik7XAorCQlmbHVzaF9sMV92NyhhZGRyKTtcCisJfSBcCit9CisKKyNkZWZpbmUgS0lMTEVSX1BBVFRFUk5fQlVTX1NUQVRFXAorCXtcCisJCTAsIDAsIDAsIDEsIDEsIDEsIDAsIDEsIDAsIDEsXAorCQkwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLFwKKwkJMSwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMCxcCisJCTAsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDEsXAorCQkwLCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAxLCAwLFwKKwkJMSwgMSwgMCwgMSwgMSwgMCwgMFwKKwl9CisKKyNkZWZpbmUgS0lMTEVSX1BBVFRFUk5fQklUX1NUQVRFXAorCXtcCisJCTEsIDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAsXAorCQkxLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAxLCAwLFwKKwkJMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMCxcCisJCTAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDEsXAorCQkwLCAxLCAxLCAwLCAwLCAxLCAwLCAxLCAwLCAwLFwKKwkJMCwgMCwgMCwgMSwgMSwgMSwgMVwKKwl9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzX2luaXRfdGlwdjIuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNfaW5pdF90aXB2Mi5jCmluZGV4IDY2ZDFkYTYuLjAyNTVmNzcgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNfaW5pdF90aXB2Mi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNfaW5pdF90aXB2Mi5jCkBAIC0xMjAsNiArMTIwLDIwIEBACiAgICAgTVZfSFdTX1RPUE9MT0dZX01BUCAgICAgKnRvcG9sb2d5CiApOwogCitleHRlcm4gTVZfU1RBVFVTIGRkcjNUaXBHZXRGaXJzdEFjdGl2ZUlmCisoCisgICAgTVZfVTggICBkZXZOdW0sCisgICAgTVZfVTMyICBpbnRlcmZhY2VNYXNrLAorICAgIE1WX1UzMiAgKmlmSWQKKyk7CisKK2V4dGVybiBNVl9TVEFUVVMgICAgbXZDYWxjQ3NOdW0KKygKKyAgICBNVl9VMzIgICAgICAgICAgZGV2TnVtLAorCU1WX1UzMiAgICAgICAgICBpbnRlcmZhY2VJZCwKKwlNVl9VMzIgICAgICAgICAgKmNzTnVtCispOworCiBleHRlcm4gTVZfVTMyIGRkcjNUaXBHZXRJbml0RnJlcSgpOwogCiBleHRlcm4gTVZfVk9JRCBkZHIzSHdzU2V0TG9nTGV2ZWwoCkBAIC0xMzcsNiArMTUxLDkgQEAKIHN0YXRpYyBNVl9VMzIgZGRyM0dldFN0YXRpY0Rkck1vZGUodm9pZCk7CiAjZW5kaWYKIAorLyogZ2xvYmFsIHBhcmFtZXRlciAoZGVmaW5lZCBpbiBUSVAgbGliIHdoaWNoIGhvbGRzIHRoZSBERFIgdG9wb2xvZ3kgKi8KK2V4dGVybiBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcDsKKwogLypTZXQgMSB0byB1c2UgZHluYW1pYyBEVU5JVCBjb25maWd1cmF0aW9uLAogCXNldCAwKHN1cHBvcnRlZCBmb3IgQTM4MCBhbmQgQUMzKSB0byBjb25maWd1cmUgRFVOSVQgaW4gdmFsdWVzIHNldCBieSBkZHIzVGlwSW5pdFNwZWNpZmljUmVnQ29uZmlnKi8KIE1WX1U4IGdlbmVyaWNJbml0Q29udHJvbGxlciA9IDE7CkBAIC0xNDgsNyArMTY1LDkgQEAKIE1WX1UzMiAJbXZCb2FyZElkSW5kZXhHZXQoTVZfVTMyIGJvYXJkSWQpOwogTVZfVTMyIG12Qm9hcmRJZEdldChNVl9WT0lEKTsKIE1WX1UzMiBkZHIzR2V0QnVzV2lkdGgodm9pZCk7Ci0KKyNpZmRlZiBNVl9SVU5fV0lOX1ZBTElEQVRJT05fVEVTVAorZXh0ZXJuIE1WX1ZPSUQgbXZId3NEZHIzVGlwU3dlZXBUZXN0KE1WX0JPT0wgZW5hYmxlKTsKKyNlbmRpZgogZXh0ZXJuIE1WX1ZPSUQgZGRyM1NldExvZ0xldmVsKE1WX1UzMiBuTG9nTGV2ZWwpOwogc3RhdGljIE1WX1UzMiBnTG9nTGV2ZWwgPSAwOwogc3RhdGljIE1WX1NUQVRVUyBkZHIzSHdzVHVuZVRyYWluaW5nUGFyYW1zKE1WX1U4IGRldk51bSk7CkBAIC00MDksNiArNDI4LDExIEBACiAKIAkvKlNldCBsb2cgbGV2ZWwgZm9yIHRyYWluaW5nIGxpYiovCiAJZGRyM0h3c1NldExvZ0xldmVsKE1WX0RFQlVHX0JMT0NLX0FMTCwgREVCVUdfTEVWRUxfRVJST1IpOworCS8qZGRyM0h3c1NldExvZ0xldmVsKE1WX0RFQlVHX1RSQUlOSU5HX01BSU4sIERFQlVHX0xFVkVMX1RSQUNFKTsqLworCisjaWZkZWYgTVZfUlVOX1dJTl9WQUxJREFUSU9OX1RFU1QgLyogdG8gcnVuIEREUiB2aWV3ZXIgdG9vbCAodG8gZGlzcGxheSBERFIgdHJhaW5pbmcgcmVzdWx0cykgKi8KKwltdkh3c0RkcjNUaXBTd2VlcFRlc3QoTVZfVFJVRSk7CisjZW5kaWYKIAogCS8qU3RhcnQgTmV3IFRyYWluaW5nIElQKi8KIAlzdGF0dXMgPSBkZHIzSHdzSHdUcmFpbmluZygpOwpAQCAtNDMxLDcgKzQ1NSwxMSBAQAogCWRkcjNOZXdUaXBEbGJDb25maWcoKTsKIAogI2lmIGRlZmluZWQoRUNDX1NVUFBPUlQpCi0JaWYoIE1WX1RSVUUgPT0gZGRyM0lmRWNjRW5hYmxlZCgpKXsKKwlpZiggKE1WX1RSVUUgPT0gZGRyM0lmRWNjRW5hYmxlZCgpKS8qICYmCisJCShtdlN5c0VudlN1c3BlbmRXYWtldXBDaGVjaygpICE9IE1WX1NVU1BFTkRfV0FLRVVQX0VOQUJMRURfR1BJT19ERVRFQ1RFRCkgJiYKKwkJKG12U3lzRW52Q2hlY2tXYWtldXBEcmFtRW5hYmxlKCkgIT0gTVZfU1VTUEVORF9XQUtFVVBfRU5BQkxFRF9NRU1fREVURUNURUQpICovKXsKKwkJLypTY3J1YiBhbGwgRFJBTSBhcmVhIGlmIEVDQyBlbmFibGVkIChhbmQgU3VzcGVuZCB3YWtldXAgc3RhdGUgbm90IGRldGVjdGVkIC0gVEJEKSovCisJCS8qIERpc2FibGVkIFN1c3BlbmRXYWtldXAgc3VwcG9ydCB1bnRpbCBkZWJ1ZyovCiAJCWRkcjNOZXdUaXBFY2NTY3J1YigpOwogCX0KICNlbmRpZgpAQCAtNzY5LDYgKzc5NywxMSBAQAogewogCU1WX1RPUE9MT0dZX1VQREFURV9JTkZPIHRvcG9sb2d5VXBkYXRlSW5mbzsKIAorLyogd2hlbiBib290aW5nIGZyb20gVUFSVCAsIHNraXAgcmVhZGluZyBERFIgY29uZmlndXJhdGlvbiBmcm9tIFNXIEVFUFJPTSwgc2luY2UgRUVQUk9NIGlzIG5vdCBjb25maWd1cmVkIGF0IDFzdCBib290ICovCisjaWYgZGVmaW5lZChNVl9OT19QUklOVCkKKwlyZXR1cm4gTVZfT0s7CisjZW5kaWYKKwogCXRvcG9sb2d5VXBkYXRlSW5mby5tdlVwZGF0ZVdpZHRoID0gTVZfRkFMU0U7CiAJdG9wb2xvZ3lVcGRhdGVJbmZvLm12VXBkYXRlRUNDID0gTVZfRkFMU0U7CiAJdG9wb2xvZ3lVcGRhdGVJbmZvLm12VXBkYXRlRUNDUHVwM01vZGUgPSBNVl9GQUxTRTsKQEAgLTgwNywxNSArODQwLDUyIEBACiBzdGF0aWMgTVZfU1RBVFVTIGRkcjNId3NUdW5lVHJhaW5pbmdQYXJhbXMoTVZfVTggZGV2TnVtKQogewogCU1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TIHBhcmFtczsKKwlNVl9VMzIgaW50ZXJmYWNlSWQ7CisJTVZfVTMyIGNzTnVtOwogCU1WX1NUQVRVUyBzdGF0dXM7CiAKKwkvKiBpbml0aWxhaXplIHRoZSBnbG9iYWwgZGRyIHRvcG9sb2d5ICovCisJQ0hFQ0tfU1RBVFVTKGRkcjNHZXRUb3BvbG9neU1hcCgmdG9wb2xvZ3lNYXApKTsKKworCS8qIGdldCBmaXJzdCBhY3RpdmUgaW50ZXJmYWNlICovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBHZXRGaXJzdEFjdGl2ZUlmKGRldk51bSwgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssICZpbnRlcmZhY2VJZCkpOworCisJQ0hFQ0tfU1RBVFVTKG12Q2FsY0NzTnVtKGRldk51bSwgaW50ZXJmYWNlSWQsICZjc051bSkpOworCiAJLypOT1RFOiBkbyBub3QgcmVtb3ZlIGFueSBmaWVsZCBpbml0aWxpemF0aW9uKi8KIAlwYXJhbXMuY2tEZWxheSA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX0NLX0RFTEFZOwotCXBhcmFtcy5ja0RlbGF5XzE2ID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfQ0tfREVMQVlfMTY7Ci0JcGFyYW1zLlBmaW5nZXIgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QRklOR0VSOwotCXBhcmFtcy5OZmluZ2VyID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTkZJTkdFUjsKIAlwYXJhbXMuUGh5UmVnM1ZhbCA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BIWVJFRzNWQUw7CiAKKwlwYXJhbXMuZ1pwcmlEYXRhID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUFJJX0RBVEE7CisJcGFyYW1zLmdabnJpRGF0YSA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05SSV9EQVRBOworCXBhcmFtcy5nWnByaUN0cmwgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QUklfQ1RSTDsKKwlwYXJhbXMuZ1pucmlDdHJsID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfTlJJX0NUUkw7CisKKwlwYXJhbXMuZ1pwb2R0RGF0YSA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1BfT0RUX0RBVEE7CisJcGFyYW1zLmdabm9kdERhdGEgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19OX09EVF9EQVRBOworCXBhcmFtcy5nWnBvZHRDdHJsID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUF9PRFRfQ1RSTDsKKwlwYXJhbXMuZ1pub2R0Q3RybCA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX05fT0RUX0NUUkw7CisKKwlwYXJhbXMuZ0RpYyA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX0RJQzsKKwlwYXJhbXMuZ1J0dE5vbSA9IE1WX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1JUVF9OT007CisKKyNpZmRlZiBDT05GSUdfRERSMworCWlmIChjc051bSA9PSAxKSB7CisJCXBhcmFtcy5nUnR0V1IgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19SVFRfV1JfMUNTOworCQlwYXJhbXMudWlPRFRDb25maWcgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19PRFRfQ09ORklHXzFDUzsKKwl9IGVsc2UgeworCQlwYXJhbXMuZ1J0dFdSID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX1dSXzJDUzsKKwkJcGFyYW1zLnVpT0RUQ29uZmlnID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfT0RUX0NPTkZJR18yQ1M7CisJfQorI2Vsc2UgLyogQ09ORklHX0REUjMgKi8KKwkvKiBERFI0ICovCisJcGFyYW1zLmdacG9kdERhdGEgPSBNVl9UVU5FX1RSQUlOSU5HX1BBUkFNU19QX09EVF9EQVRBX0REUjQ7CisJcGFyYW1zLnVpT0RUQ29uZmlnID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfT0RUX0NPTkZJR19ERFI0OworCXBhcmFtcy5nUnR0Tm9tID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX05PTV9ERFI0OworCXBhcmFtcy5nUnR0V1IgPSAgTVZfVFVORV9UUkFJTklOR19QQVJBTVNfUlRUX1dSOworCXBhcmFtcy5nRGljID0gTVZfVFVORV9UUkFJTklOR19QQVJBTVNfRElDX0REUjQ7CisjZW5kaWYKKwogCXN0YXR1cyA9IGRkcjNUaXBUdW5lVHJhaW5pbmdQYXJhbXMoZGV2TnVtLCAmcGFyYW1zKTsKIAlpZiAoTVZfT0sgIT0gc3RhdHVzKSB7CiAJCW12UHJpbnRmKCIlcyBUcmFpbmluZyBTZXF1ZW5jZSAtIEZBSUxFRFxuIiwgZGRyVHlwZSk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvLmdpdGlnbm9yZSBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi8uZ2l0aWdub3JlCmluZGV4IGE0M2ZhZmMuLjYzZGFiMTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi8uZ2l0aWdub3JlCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi8uZ2l0aWdub3JlCkBAIC0xLDIgKzEsMyBAQAogKi5yZWoKLQorKi5vCitzcmMvRHJpdmVyL2RkcjQvCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvTWFrZWZpbGUgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTQzYzk4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDE1NSBAQAorIzsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIztDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworIzsKKyM7VGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBvd25lZCBhbmQgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbAorIztJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kL29yIGl0cyBhZmZpbGlhdGVzICgiTWFydmVsbCIpIHVuZGVyIHRoZSBmb2xsb3dpbmcKKyM7YWx0ZXJuYXRpdmUgbGljZW5zaW5nIHRlcm1zLiAgT25jZSB5b3UgaGF2ZSBtYWRlIGFuIGVsZWN0aW9uIHRvIGRpc3RyaWJ1dGUgdGhlCisjO0ZpbGUgdW5kZXIgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIHBsZWFzZSAoaSkgZGVsZXRlIHRoaXMKKyM7aW50cm9kdWN0b3J5IHN0YXRlbWVudCByZWdhcmRpbmcgbGljZW5zZSBhbHRlcm5hdGl2ZXMsIChpaSkgZGVsZXRlIHRoZSB0d28KKyM7bGljZW5zZSBhbHRlcm5hdGl2ZXMgdGhhdCB5b3UgaGF2ZSBub3QgZWxlY3RlZCB0byB1c2UgYW5kIChpaWkpIHByZXNlcnZlIHRoZQorIztNYXJ2ZWxsIGNvcHlyaWdodCBub3RpY2UgYWJvdmUuCisjOworIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIztNYXJ2ZWxsIENvbW1lcmNpYWwgTGljZW5zZSBPcHRpb24KKyM7CisjO0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsIGFuZCB5b3UgaGF2ZSBlbnRlcmVkIGludG8gYSBjb21tZXJjaWFsCisjO2xpY2Vuc2UgYWdyZWVtZW50IChhICJDb21tZXJjaWFsIExpY2Vuc2UiKSB3aXRoIE1hcnZlbGwsIHRoZSBGaWxlIGlzIGxpY2Vuc2VkCisjO3RvIHlvdSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGFwcGxpY2FibGUgQ29tbWVyY2lhbCBMaWNlbnNlLgorIzsKKyM7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyM7TWFydmVsbCBHUEwgTGljZW5zZSBPcHRpb24KKyM7CisjO0lmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKKyM7bW9kaWZ5IHRoaXMgRmlsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHZW5lcmFsCisjO1B1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxICh0aGUgIkdQTCBMaWNlbnNlIiksIGEgY29weSBvZiB3aGljaCBpcworIzthdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUgRmlsZSBpbiB0aGUgbGljZW5zZS50eHQgZmlsZSBvciBieSB3cml0aW5nIHRvIHRoZSBGcmVlCisjO1NvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgb3IKKyM7b24gdGhlIHdvcmxkd2lkZSB3ZWIgYXQgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCisjOworIztUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRSBJTVBMSUVECisjO1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBFWFBSRVNTTFkKKyM7RElTQ0xBSU1FRC4gIFRoZSBHUEwgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQgdGhpcyB3YXJyYW50eQorIztkaXNjbGFpbWVyLgorIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIztNYXJ2ZWxsIEJTRCBMaWNlbnNlIE9wdGlvbgorIzsKKyM7SWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vcgorIzttb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLgorIztSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorIzthcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisjOworIzsgICAqICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorIzsJICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjOworIzsgICAgKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjOyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIzsgICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjOworIzsgICAgOyogICBOZWl0aGVyIHRoZSBuYW1lIG9mIE1hcnZlbGwgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQorIzsgICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyM7ICAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjOworIztUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjO0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjO1dBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyM7RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIztBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyM7KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworIztMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyM7QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyM7KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyM7U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjOworIzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIy5TRUNPTkRBUlk6CisKK2luY2x1ZGUgLi4vLi4vYmFzZS5taworCitUSVBfSU5DID0gJChCSF9ST09UX0RJUikvc3JjX2Rkci9kZHIzbGlidjIvaAorCitJTkNMVURFID0gLUkkKFRJUF9JTkMpL09zIC1JJChUSVBfSU5DKS9Pcy9ndE9zIC1JJChUSVBfSU5DKS9Pcy9jb21tb24vc2lsaWNvbklmIFwKKwkgIC1JJChUSVBfSU5DKS9Tb0MgLUkkKFRJUF9JTkMpL1NpbGljb24gLUkkKFRJUF9JTkMpL09zL2NvbW1vbi9jb25maWdFbGVtZW50RGIgXAorCSAgLUkkKFRJUF9JTkMpL0RyaXZlciAtSSQoVElQX0lOQykvRHJpdmVyL2RkcjMgIC1JJChCSF9ST09UX0RJUikvaW5jL2NvbW1vbiAtSSQoQkhfUk9PVF9ESVIpL2luYy9jb21tb24vZ3RPc1wKKwkgIC1JJChCSF9ST09UX0RJUikvaW5jL2RkcjNfc29jLyQoQk9BUkQpIC1JJChCSF9ST09UX0RJUikvaW5jL2RkcjNfc29jLyQoSU5DTkFNRSkgXAorCSAgLUkkKEJIX1JPT1RfRElSKS9zcmNfZGRyICAtSSQoQkhfUk9PVF9ESVIpL3BsYXRmb3JtL3N5c0Vudi8kKEJPQVJEKQorCitpZmVxICgkKEREUlRZUEUpLGRkcjQpCisJSU5DTFVERSArPSAtSSQoQkhfUk9PVF9ESVIpL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyNC9oCitlbmRpZgorCitUR1QgPSBkZHJfJChMSUJOQU1FKS5hCitUR1RfVUFSVCA9IGRkcl8kKExJQk5BTUUpLnVhcnQuYQorCitUTElCID0gLi8kKEREUlRZUEUpX3RyYWluaW5nXyQoTElCTkFNRSkubGliCisKK1RERFI0U1VCTElCID0gLi8kKEREUlRZUEUpX3RyYWluaW5nXyQoTElCTkFNRSlzdWIubGliCisKK1RTUkMgPSAkKHdpbGRjYXJkIC4vc3JjL0RyaXZlci9kZHIzLyouYykKK1RTUkMgKz0gLi9zcmMvU2lsaWNvbi9tdkh3c0RkcjMkKFNJTE5BTUUpLmMKK2lmZXEgIiQoQk9BUkQpIiAgIm1zeXMiCisJVFNSQyArPSAuL3NyYy9TaWxpY29uL212SHdzRGRyM01zeXMuYworZW5kaWYKK1RTUkMgKz0gLi9zcmMvU29jL2RkcjNfJChCT0FSRE5BTUUpX3RyYWluaW5nLmMKK1RTUkMgKz0gLi9zcmMvU29jL2RkcjNfaHdzX2h3X3RyYWluaW5nLmMKK1RTUkMgKz0gLi9zcmMvT3MvZ3RPcy9tdlhvci5jCisKKworVFNSQ0REUjQgPSAkKHdpbGRjYXJkIC4vc3JjL0RyaXZlci9kZHI0L3NyYy8qLmMpCisKK1RPQkogPSAkKFRTUkM6LmM9Lm8pCitUT0JKRERSNCA9ICQoVFNSQ0REUjQ6LmM9Lm8pCisKK2lmZXEgKCQoRERSNFNVQkxJQikseWVzKQorCVRBUkdFVFMgPSAkKFRMSUIpICQoVEREUjRTVUJMSUIpCitlbHNlCisJVEFSR0VUUyA9ICQoVExJQikKK2VuZGlmCisKKworIyMjIyMjIyMjIyMjI2dsb2JhbCBmbGFncyBlbmFibGUvZGlzYWJsZSBmZWF0dXJlcyB0byBzYXZlIGZvb3RwcmludCMjIyMjIyMjIyMjCisjIGV4Y2x1ZGUgZGVidWcgZnVuY3Rpb24gbm90IHJlbGV2ZW50IGZvciBTb0MoIHNldCBieSBkZWZhdWx0KQorQ0ZMQUdTICs9IC1ERVhDTFVERV9TV0lUQ0hfREVCVUcgLURERFJfVklFV0VSX1RPT0wKK2lmZXEgIiQoQ09ORklHX0JPQkNBVDIpIiAgInkiCitDRkxBR1MgKz0gLURNVl9IV1NfRVhDTFVERV9ERUJVR19QUklOVFMKK2VuZGlmCisjcmVtb3ZlIGFsbCBkZWJ1ZyBwcmludHMgZnJvbSB0cmFpbmluZyggdW5zZXQgYnkgZGVmYXVsdCkKKyNDRkxBR1MgKz0gLURTSUxFTlRfTElCCitDRkxBR1MgKz0gLURMSUJfRlVOQ1RJT05BTF9ERUJVR19PTkxZCisKKyNGbGFnIHRvIHN1cHBvcnQgc3RhdGljIHRyYWluaW5nIGFsZ28gZnVuY3Rpb25zKCB1bnNldCBieSBkZWZhdWx0KQoraWZlcSAoJChCT0FSRCksYTM4eCkKKyAjQ0ZMQUdTICs9IC1EU1RBVElDX0FMR09fU1VQUE9SVAorZWxzZQorQ0ZMQUdTICs9IC1EU1RBVElDX0FMR09fU1VQUE9SVAorZW5kaWYKKyNmbGFnIHRvIHN1cHBvcnQgT0RUIHRlc3QgZGVidWcgZnVuY3Rpb24oIHVuc2V0IGJ5IGRlZmF1bHQpCisjQ0ZMQUdTICs9IC1ET0RUX1RFU1RfU1VQUE9SVAorCisjIEZsYWcgdG8gZW5hYmxlIFJYIElPIEJJU1QgVGVzdAorIyBDRkxBR1MgKz0gLURNVl9IV1NfUlhfSU9fQklTVAorIyBGbGFnIGVuYWJsZSBJTyBCSVNUIG9mIENNRC9BRERSIFRlc3QgKGluIGFkZGl0aW9uIHRvIE1WX0hXU19SWF9JT19CSVNUKQorIyBDRkxBR1MgKz0gLURNVl9IV1NfUlhfSU9fQklTVF9FVFAKKworIyMjIyMjIyMjIyMjI2VuZCBvZiBnbG9iYWwgZmxhZ3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworYWxsOiAgICQoVEFSR0VUUykKKworJS5vOiAlLmMKKwkkKENDKSAkKENGTEFHUykgJChDUFBGTEFHUykgLWMgLW8gJEAgJDwKKworJS51YXJ0Lm86ICUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtRE5PVF9VU0VfVUFSVCAtRE1WX05PX0lOUFVUIC1ETVZfTk9fUFJJTlQgICQoQ1BQRkxBR1MpIC1jIC1vICAkQCAkPAorCiskKFRERFI0U1VCTElCKTogJChUT0JKRERSNCkKKwkkKFJNKSAuLyRACisJYXIgcmNzICQoVEREUjRTVUJMSUIpICQoVE9CSkREUjQpCisJJChDUCkgLi8kQCAuLi9saWIKKworJChUTElCKTogJChUT0JKKQorCSQoUk0pIC4vJEAKKwlhciByY3MgJChUTElCKSAkKFRPQkopCisJJChDUCkgLi8kQCAuLi9saWIKKworY2xlYW46CisJJChSTSkgLi8qLm8gIC4vKi5hCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvZ3RCdWlsZCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9ndEJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2NTYyNDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvZ3RCdWlsZApAQCAtMCwwICsxLDMxIEBACisKKyMjIFZJUFMgY29tcGlsYXRpb24gZW52aXJvbm1lbnQgIyMjIyMjIyMjIyMjIyMjIyMKK2lmZXEgKFZJUFMsICQoSE9NRV9FTlYpKQorCisjSU5DTFVERV9QQVRIID0KKyNDX0ZJTEVfTElTVCAgPQorI1NVQkRJUlMgICAgICA9CisjQ19FWENMVURFX0ZJTEVfTElTVCA9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitST09UX0RJUiA9ICQoc3Vic3QgXCwvLCQoU1dfUk9PVCkpCitpbmNsdWRlICQoUk9PVF9ESVIpL21haW5MYWJTZXJ2aWNlcy9ndEJ1aWxkCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Vsc2UKKworIyMgQ1BTUyBjb21waWxhdGlvbiBlbnZpcm9ubWVudCAjIyMjIyMjIyMjIyMjIyMjIworI0lOQ0xVREVfUEFUSCA9CisjQ19GSUxFX0xJU1QgID0KKyNTVUJESVJTICAgICAgPQorI0NfRVhDTFVERV9GSUxFX0xJU1QgPQorCitDRkxBR1MgKz0gLURDT05GSUdfRERSMworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2luY2x1ZGUgJChQUk9KX0JBU0UpL2d0VG9wTWFrZQorZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXAuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXAuaAppbmRleCA0Y2RmY2YyLi5lYmE4OGI3IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcC5oCkBAIC01Miw5ICs1Miw5IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19ERFI0Ci0jZGVmaW5lIEREUjNfVElQX1ZFUlNJT05fU1RSSU5HICJERFI0IFRyYWluaW5nIFNlcXVlbmNlIC0gVmVyIFRJUC0wLjcuIgorI2RlZmluZSBERFIzX1RJUF9WRVJTSU9OX1NUUklORyAiRERSNCBUcmFpbmluZyBTZXF1ZW5jZSAtIFZlciBUSVAtMC4yMi4iCiAjZWxzZQotI2RlZmluZSBERFIzX1RJUF9WRVJTSU9OX1NUUklORyAiRERSMyBUcmFpbmluZyBTZXF1ZW5jZSAtIFZlciBUSVAtMS4yOS4iCisjZGVmaW5lIEREUjNfVElQX1ZFUlNJT05fU1RSSU5HICJERFIzIFRyYWluaW5nIFNlcXVlbmNlIC0gVmVyIFRJUC0xLjQ2LiIKICNlbmRpZgogCiAjZGVmaW5lIE1BWF9DU19OVU0gICAgICAgICAoNCkKQEAgLTMyMCwxOSArMzIwLDMyIEBACiAqLwogCiBHVF9TVEFUVVMgICAgbXZId3NEZHIzVGlwUnVuQWxnCi0oIAorKAogICAgIEdUX1UzMiAgICAgICAgICAgICAgZGV2TnVtLAogICAgIE1WX0hXU19BTEdPX1RZUEUgICAgYWxnb1R5cGUKICk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorR2V0IEREUiB2ZXJzaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBtdkh3c0RkcjNUaXBWZXJzaW9uR2V0CisqIERlc2M6ICAgICBSZXR1cm4gRERSIHZlcnNpb24gc3RyaW5nCisqIEFyZ3M6CisqCisqCisqIE5vdGVzOgorKiBSZXR1cm5zOiAgT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK2NvbnN0IEdUX0NIQVIqIG12SHdzRGRyM1RpcFZlcnNpb25HZXQodm9pZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTmFtZTogICAgIG12SHdzRGRyM1RpcE1vZGVSZWFkLgogKiBEZXNjOiAgICAgcmVhZCBNb2RlIHJlZ2lzdGVycwotKiBBcmdzOiAgICAgZGV2TnVtIC0gY2hhbm5lbCBJRCAKKyogQXJnczogICAgIGRldk51bSAtIERldmljZSBudW1iZXIKICogICAgICAgICAgIG1vZGVJbmZvIC0gcG9pbnRlciB0byBtb2RlIGluZm8gc3RydWN0CiAqCi0qIE5vdGVzOiAgICAKKyogTm90ZXM6CiAqIFJldHVybnM6ICBPSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCiAqLwogR1RfU1RBVFVTICAgIG12SHdzRGRyM1RpcE1vZGVSZWFkCkBAIC0zNDcsNyArMzYwLDcgQEAKICogQXJnczogICAgIGRldk51bQogKiAgICAgICAgICAgcmVzdWx0CiAqCi0qIE5vdGVzOiAgICAKKyogTm90ZXM6CiAqIFJldHVybnM6ICBPSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCiAqLwogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwQmlzdC5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEJpc3QuaAppbmRleCBmM2Q1ZmZhLi5kYjVjOGFjIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwQmlzdC5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBCaXN0LmgKQEAgLTE1OCw2ICsxNTgsMTMgQEAKICAgICBHVF9VMzIgbW9kZQogKTsKIAorR1RfQk9PTCBkZHIzVGlwUnVuTGV2ZWxpbmdTd2VlcFRlc3QKKygKKyAgICBHVF8zMiBkZXZOdW0sCisgICAgR1RfVTMyIFJlcGVhdE51bSwKKyAgICBHVF9VMzIgZGlyZWN0aW9uLAorICAgIEdUX1UzMiBtb2RlCispOwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBOYW1lOiAgICAgZGRyM1RpcFByaW50UmVncy4KICogRGVzYzogICAgIFByaW50IFNwZWNpZmllZCBEdW5pdC9QdXAgUmVnaXN0ZXJzCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRGIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEYi5oCmluZGV4IGNiYTNkMmEuLjEzOTU5N2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEYi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEYi5oCkBAIC0xLDgxICsxLDIgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4gYW5kIGl0cyBhZmZpbGlhdGVzCi0qCi0qIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKLSogSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCi0qIGFsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4KLSogSWYgeW91IHJlY2VpdmVkIHRoaXMgRmlsZSBmcm9tIE1hcnZlbGwsIHlvdSBtYXkgb3B0IHRvIHVzZSwgcmVkaXN0cmlidXRlCi0qIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zaW5nIHRlcm1zLgotKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0qICAtICAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotKiAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAgLSAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0qICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSogIC0gICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKLSogICAgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAotKiAgICAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgotKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0qIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0qIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCi0qIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0qIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOwotKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKLSogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKLSogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgotKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogbXZEZHIzVHJhaW5pbmdJcERiLmgKLSoKLSogREVTQ1JJUFRJT046Ci0qCi0qCi0qIEZJTEUgUkVWSVNJT04gTlVNQkVSOgotKiAgICAgICAkUmV2aXNpb246IDMgJAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfTVZfRERSM19UUkFJTklOR0lQX0RCX0hfCi0jZGVmaW5lIF9NVl9ERFIzX1RSQUlOSU5HSVBfREJfSF8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICBleHRlcm4gIkMiCi0gICB7Ci0jZW5kaWYKLQotdHlwZWRlZiBlbnVtCi17Ci0gICBQQVRURVJOX1BCUzEsCi0gICBQQVRURVJOX1BCUzIsCi0gICBQQVRURVJOX1JMLAotICAgUEFUVEVSTl9TVEFUSUNfUEJTLAotICAgUEFUVEVSTl9LSUxMRVJfRFEwLAotICAgUEFUVEVSTl9LSUxMRVJfRFExLAotICAgUEFUVEVSTl9LSUxMRVJfRFEyLAotICAgUEFUVEVSTl9LSUxMRVJfRFEzLAotICAgUEFUVEVSTl9LSUxMRVJfRFE0LAotICAgUEFUVEVSTl9LSUxMRVJfRFE1LAotICAgUEFUVEVSTl9LSUxMRVJfRFE2LAotICAgUEFUVEVSTl9LSUxMRVJfRFE3LAotICAgUEFUVEVSTl9QQlMzLAotICAgUEFUVEVSTl9STDIsCi0gICBQQVRURVJOX1RFU1QsCi0gICBQQVRURVJOX0ZVTExfU1NPMCwKLSAgIFBBVFRFUk5fRlVMTF9TU08xLAotICAgUEFUVEVSTl9GVUxMX1NTTzIsCi0gICBQQVRURVJOX0ZVTExfU1NPMywKLSAgIFBBVFRFUk5fVlJFRiwKLSAgIFBBVFRFUk5fTElNSVQKLX1NVl9IV1NfUEFUVEVSTjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gICB9Ci0jZW5kaWYKLQotI2VuZGlmIC8qIF9NVl9ERFIzX1RSQUlOSU5HSVBfREJfSF8gKi8KIAogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRGVmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRGVmLmgKaW5kZXggYmU1M2FmOC4uMjc0NmZhZCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcERlZi5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBEZWYuaApAQCAtNDYsNiArNDYsMTAgQEAKICNpbmNsdWRlICJjb21tb24vc2lsaWNvbklmL212U2lsaWNvbklmLmgiCiAKICNpZiBkZWZpbmVkKENIWF9GQU1JTFkpIHx8IGRlZmluZWQoRVhNWFBNX0ZBTUlMWSkKKyNkZWZpbmUgQ1BTU19CVUlMRAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENIWF9GQU1JTFkpIHx8IGRlZmluZWQoRVhNWFBNX0ZBTUlMWSkKICNkZWZpbmUgb3NNZW1DcHkJaHdzT3NNZW1Db3B5RnVuY1B0cgogI2Vsc2UKICNpbmNsdWRlIDxndE9zL2d0T3NNZW0uaD4KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBFbmdpbmUuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBFbmdpbmUuaAppbmRleCA3NjYzNTE3Li40NTgzMjNlIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRW5naW5lLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEVuZ2luZS5oCkBAIC0xMjEsMjEgKzEyMSw2IEBACiApOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIE5hbWU6ICAgICBkZHIzVGlwTG9hZFBhdHRlcm5Ub01lbUJ5Q3B1LgotKiBEZXNjOiAgICAgTG9hZCBleHBlY3RlZCBQYXR0ZXJuIHRvIGV4dGVybmFsIG1lbW9yeQotKiBBcmdzOgotKiBOb3RlczoKLSogUmV0dXJuczogIE9LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KLSovCi1HVF9TVEFUVVMgICAgZGRyM1RpcExvYWRQYXR0ZXJuVG9NZW1CeUNwdQotKAotICAgIEdUX1UzMiAgICAgICAgICBkZXZOdW0sCi0gICAgTVZfSFdTX1BBVFRFUk4gIHBhdHRlcm4sCi0gICAgR1RfVTMyICAgICAgICAgIG9mZnNldAotKTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGxvYWQgcGF0dGVybiB0byBtZW1vcnkgdXNpbmcgT0RQRwogKi8KIEdUX1NUQVRVUyAgICBkZHIzVGlwTG9hZEFsbFBhdHRlcm5Ub01lbQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEZsb3cuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nSXBGbG93LmgKaW5kZXggM2RkZjc2ZS4uY2VjNzcxMiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcEZsb3cuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwRmxvdy5oCkBAIC00Nyw5ICs0Nyw2IEBACiAKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwLmgiCiAjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcFBicy5oIgotI2lmZGVmIENPTkZJR19ERFI0Ci0jaW5jbHVkZSAibXZEZHI0VHJhaW5pbmdJcEZsb3cuaCIKLSNlbmRpZgogCiAjaWZkZWYgX19jcGx1c3BsdXMKICAgIGV4dGVybiAiQyIKQEAgLTg2LDEwICs4Myw5IEBACiAjZGVmaW5lIFBBVFRFUk5fTUFYSU1VTV9MRU5HVEggKDY0KQogI2RlZmluZSBFWFRfQUNDRVNTX0JVUlNUX0xFTkdUSCAoOCkKICNkZWZpbmUgIENISVBfSUQgICAgICAgICAgICAgICAgMAotI2RlZmluZSBJU19JTlRFUkZBQ0VfQUNUSVZFKCBfdWlJbnRlcmZhY2VNYXNrXyAsIF91aUludGVyZmFjZUlkXyApICAgKCBfdWlJbnRlcmZhY2VNYXNrXyAmICggMSA8PCBfdWlJbnRlcmZhY2VJZF8gKSApIAotI2RlZmluZSBJU19CVVNfQUNUSVZFKCBfdWlJbnRlcmZhY2VNYXNrXyAsIF91aUludGVyZmFjZUlkXyApICAgKCBfdWlJbnRlcmZhY2VNYXNrXyAmICggMSA8PCBfdWlJbnRlcmZhY2VJZF8gKSApIAotI2RlZmluZSBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSkgICAoZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSktPm51bU9mQnVzUGVySW50ZXJmYWNlKQotCisjZGVmaW5lIElTX0lOVEVSRkFDRV9BQ1RJVkUoIF91aUludGVyZmFjZU1hc2tfICwgX3VpSW50ZXJmYWNlSWRfICkgICAoIF91aUludGVyZmFjZU1hc2tfICYgKCAxIDw8IF91aUludGVyZmFjZUlkXyApICkKKyNkZWZpbmUgSVNfQlVTX0FDVElWRSggX3VpSW50ZXJmYWNlTWFza18gLCBfdWlJbnRlcmZhY2VJZF8gKSAgICggKF91aUludGVyZmFjZU1hc2tfID4+IF91aUludGVyZmFjZUlkXykgJiAxICkKKyAgICAgICAvKkhhaW0gKCBfdWlJbnRlcmZhY2VNYXNrXyAmICggMSA8PCBfdWlJbnRlcmZhY2VJZF8gKSApKi8gIAogI2RlZmluZSBERFIzX0lTX0VDQ19QVVAzX01PREUoX3VpSW50ZXJmYWNlTWFza18pCSgoX3VpSW50ZXJmYWNlTWFza18gPT0gMHhCKT8oR1RfVFJVRSk6KEdUX0ZBTFNFKSkKICNkZWZpbmUgRERSM19JU19FQ0NfUFVQNF9NT0RFKF91aUludGVyZmFjZU1hc2tfKQkoKCgoX3VpSW50ZXJmYWNlTWFza18gJiAweDEwKSA9PSAwKSk/KEdUX0ZBTFNFKTooR1RfVFJVRSkpCiAjZGVmaW5lIEREUjNfSVNfMTZCSVRfRFJBTV9NT0RFKF9hY3RpdmVCdXNNYXNrXykJKCgoKF9hY3RpdmVCdXNNYXNrXyAmIDB4NCkgPT0gMCkpPyhHVF9UUlVFKTooR1RfRkFMU0UpKQpAQCAtMTM1LDE3ICsxMzEsMTYgQEAKICNkZWZpbmUgIERJU0FCTEVfRERSX1RVTklOR19EQVRBICAgICAgICAgICgweDAyMjk0Mjg1KQogI2RlZmluZSAgRU5BQkxFX0REUl9UVU5JTkdfREFUQSAgICAgICAgICAgKDB4MTIyOTQyODUpCiAKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQorI2lmICFkZWZpbmVkKENQU1NfQlVJTEQpICYmICFkZWZpbmVkKENPTkZJR19CT0JDQVQyKQogI2RlZmluZSBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcgICAgICAgICAgKDB4MTg0ODgpCi0jZGVmaW5lIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcgICAgICAgICAoMHgxMDMwKQotI2RlZmluZSBPRFBHX1NUQVRVU19ET05FX1JFRyAgICAgICAgIAkgICgweDE2RkMpCi0jZGVmaW5lIE9EUEdfRU5BQkxFX1JFRyAgICAgICAgICAgICAgICAgICAoMHgxODZENCkvL0tXMjgKLSNkZWZpbmUgT0RQR19FTkFCTEVfT0ZGUyAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBPRFBHX0RJU0FCTEVfT0ZGUyAgICAgICAgICAgICAgICAgKDgpCiAjZWxzZQogI2RlZmluZSBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcgICAgICAgICAgKDB4MTAzMCkKICNlbmRpZgorI2RlZmluZSBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHICAgICAgICAgKDB4MTAzMCkKKyNkZWZpbmUgT0RQR19TVEFUVVNfRE9ORV9SRUcgICAgICAgICAJICAoMHgxNkZDKQorI2RlZmluZSBPRFBHX0VOQUJMRV9SRUcgICAgICAgICAgICAgICAgICAgKDB4MTg2RDQpCisjZGVmaW5lIE9EUEdfRU5BQkxFX09GRlMgICAgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgT0RQR19ESVNBQkxFX09GRlMgICAgICAgICAgICAgICAgICg4KQogCiAjZGVmaW5lIE9EUEdfVFJBSU5JTkdfQ09OVFJPTF9SRUcgICAgICAgICAoMHgxMDM0KQogI2RlZmluZSBPRFBHX09CSjFfT1BDT0RFX1JFRyAgICAgICAgICAgICAgKDB4MTAzQykKQEAgLTIxMCwyMSArMjA1LDIyIEBACiAjZGVmaW5lIENTX0VOQUJMRV9SRUcgICAgICAgICAgICAgICAgICAgICAoMHgxNkQ4KQogI2RlZmluZSBXUl9MRVZFTElOR19EUVNfUEFUVEVSTl9SRUcgICAgICAgKDB4MTZEQykKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQorI2lmICFkZWZpbmVkKENQU1NfQlVJTEQpICYmICFkZWZpbmVkKENPTkZJR19CT0JDQVQyKQogI2RlZmluZSBPRFBHX0JJU1RfRE9ORSAgICAgICAgICAgICAgICAgICAgKDB4MTg2RDQpCi0jZGVmaW5lIE9EUEdfQklTVF9ET05FX0JJVF9PRkZTICAgICAgICAgICAoMCkKLSNkZWZpbmUgT0RQR19CSVNUX0RPTkVfQklUX1ZBTFVFICAgICAgICAgICgwKQogI2Vsc2UKICNkZWZpbmUgT0RQR19CSVNUX0RPTkUgICAgICAgICAgICAgICAgICAgICgweDE2RkMpCiAjZW5kaWYKKyNkZWZpbmUgT0RQR19CSVNUX0RPTkVfQklUX09GRlMgICAgICAgICAgICgwKQorI2RlZmluZSBPRFBHX0JJU1RfRE9ORV9CSVRfVkFMVUVfUkVWMiAgICAgICAgICAoMSkKKyNkZWZpbmUgT0RQR19CSVNUX0RPTkVfQklUX1ZBTFVFX1JFVjMgICAgICAgICAgKDApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkIChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkIChDT05GSUdfQVJNQURBXzM5WCkKKyNpZiAhZGVmaW5lZChDUFNTX0JVSUxEKSAmJiAhZGVmaW5lZChDT05GSUdfQk9CQ0FUMikKICNkZWZpbmUgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfMF9SRUcgICAgICgweDE4MzApCiAjZGVmaW5lIFJFU1VMVF9DT05UUk9MX0JZVEVfUFVQXzFfUkVHICAgICAoMHgxODM0KQogI2RlZmluZSBSRVNVTFRfQ09OVFJPTF9CWVRFX1BVUF8yX1JFRyAgICAgKDB4MTgzOCkKICNkZWZpbmUgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfM19SRUcgICAgICgweDE4M0MpCiAjZGVmaW5lIFJFU1VMVF9DT05UUk9MX0JZVEVfUFVQXzRfUkVHICAgICAoMHgxOEIwKQotCQkJCQkJCQkJCSAgCisKICNkZWZpbmUgUkVTVUxUX0NPTlRST0xfUFVQXzBfQklUXzBfUkVHICAgICgweDE4QjQpCiAjZGVmaW5lIFJFU1VMVF9DT05UUk9MX1BVUF8wX0JJVF8xX1JFRyAgICAoMHgxOEI4KQogI2RlZmluZSBSRVNVTFRfQ09OVFJPTF9QVVBfMF9CSVRfMl9SRUcgICAgKDB4MThCQykKQEAgLTM3NywxMiArMzczLDI3IEBACiAjZGVmaW5lIFBIQVNFX1JFR19PRkZTRVQgICAoMzIpCiAjZGVmaW5lIE5VTV9CWVRFU19JTl9CVVJTVCAoMzEpCiAjZGVmaW5lIE5VTV9PRl9DUyAgICAgICAgICAoNCkKLSNkZWZpbmUgQ1NfUkVHX1ZBTFVFKGNzTnVtKSAgIChjc01hc2tSZWdbY3NOdW1dKQorI2RlZmluZSBDU19CWVRFX0dBUChjc051bSkgICAoY3NOdW0qMHg0KQorI2RlZmluZSBDU19QQlNfR0FQKGNzTnVtKSAgIChjc051bSoweDEwKQogI2RlZmluZSBBRExMX0xFTkdUSCAoMzIpCiAKKyNpZmRlZiBDT05GSUdfRERSNAorLyogRERSNCBNUlMgKi8KKyNkZWZpbmUgTVJTNF9DTUQgKDB4MTApCisjZGVmaW5lIE1SUzVfQ01EICgwWDExKQorI2RlZmluZSBNUlM2X0NNRCAoMFgxMikKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW51bXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKy8qIEREUjQgUmVnaXN0ZXJzICovCisjZGVmaW5lIEREUjRfTVIwX1JFRyAgICAgICAgICAgICAgICAgICAgICAoMHgxOTAwKQorI2RlZmluZSBERFI0X01SMV9SRUcgICAgICAgICAgICAgICAgICAgICAgKDB4MTkwNCkKKyNkZWZpbmUgRERSNF9NUjJfUkVHICAgICAgICAgICAgICAgICAgICAgICgweDE5MDgpCisjZGVmaW5lIEREUjRfTVIzX1JFRyAgICAgICAgICAgICAgICAgICAgICAoMHgxOTBDKQorI2RlZmluZSBERFI0X01SNF9SRUcgICAgICAgICAgICAgICAgICAgICAgKDB4MTkxMCkKKyNkZWZpbmUgRERSNF9NUjVfUkVHICAgICAgICAgICAgICAgICAgICAgICgweDE5MTQpCisjZGVmaW5lIEREUjRfTVI2X1JFRyAgICAgICAgICAgICAgICAgICAgICAoMHgxOTE4KQorI2RlZmluZSBERFI0X01QUl9XUl9SRUcgICAgICAgICAgICAgICAgICAgKDB4MTlEMCkKKyNkZWZpbmUgRFJBTV9QSU5TX01VWF9SRUcgICAgICAgICAgICAgICAgICgweDE5RDQpCisjZW5kaWYKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBTdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNDAzLDYgKzQxNCw1NiBAQAogICAgICAgLyogTWFzayB1c2VkIGluIHJlZ2lzdGVyICovCiB9UGFnZUVsZW1lbnQ7CiAKKyNpZmRlZiBDT05GSUdfRERSNAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyNFRpcER5bmFtaWNXcml0ZUxldmVsaW5nU3VwcAorKiBEZXNjOiAgICAgV3JpdGUgbGV2ZWxpbmcgcGhhc2UgY29ycmVjdGlvbgorKiBBcmdzOiAgICAgZGV2TnVtIC0gZGV2aWNlIG51bWJlcgorKgorKiBOb3RlczoKKyogUmV0dXJuczogIE9LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgZGRyNFRpcER5bmFtaWNXcml0ZUxldmVsaW5nU3VwcAorKAorCUdUX1UzMiBkZXZOdW0KKyk7CisKK0dUX1NUQVRVUyAgICBkZHI0VGlwQ29uZmlndXJlUGh5CisoCisgICAgR1RfVTMyICAgIGRldk51bQorKTsKKworR1RfU1RBVFVTIGRkcjRUaXBTZXRUaW1pbmcKKygKKyAgICBHVF9VMzIJCQkJICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgICBhY2Nlc3NUeXBlLAorICAgIEdUX1UzMgkJCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRCQkJZnJlcXVlbmN5CispOworCitHVF9TVEFUVVMgZGRyNE1vZGVSZWdzSW5pdAorKAorICAgIEdUX1U4IGRldk51bQorKTsKKworR1RfU1RBVFVTIGRkcjRTZHJhbUNvbmZpZworKAorICAgIEdUX1UzMiBkZXZOdW0KKyk7CisKK0dUX1NUQVRVUyAgICBkZHI0VGlwQ2FsaWJyYXRpb25BZGp1c3QKKygKKyAgICBHVF9VMzIJCWRldk51bSwKKwlHVF9VOAkJVnJlZl9lbiwKKwlHVF9VOAkJUE9EX09ubHkKKyk7CisKK0dUX1NUQVRVUyBkZHIzVGlwRERSNERkcjRUcmFpbmluZ01haW5GbG93CisoCisgICAgR1RfVTMyIGRldk51bQorKTsKKworI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTmFtZTogICAgIGRkcjNUaXBXcml0ZUxldmVsaW5nU3RhdGljQ29uZmlnLgpAQCAtODc5LDExICs5NDAsMTEgQEAKIAogR1RfU1RBVFVTICAgIGRkcjNUaXBSZXNldEZpZm9QdHIoR1RfVTMyIGRldk51bSk7CiAKLUdUX0JPT0wgcmVhZFB1cFZhbHVlKEdUXzMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyLCBHVF9VMzIgbWFzayk7CitHVF9CT09MIG12SHdzRGRyM1RpcFJlYWRQdXBWYWx1ZShHVF9VMzIgZGV2TnVtLCBHVF8zMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkciwgR1RfVTMyIG1hc2spOwogCi1HVF9CT09MIHJlYWRBZGxsVmFsdWUoR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyLCBHVF9VMzIgbWFzayk7CitHVF9CT09MIG12SHdzRGRyM1RpcFJlYWRBZGxsVmFsdWUoR1RfVTMyIGRldk51bSxHVF9VMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIsIEdUX1UzMiBtYXNrKTsKIAotR1RfQk9PTCB3cml0ZUFkbGxWYWx1ZShHVF9VMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIpOworR1RfQk9PTCBtdkh3c0RkcjNUaXBXcml0ZUFkbGxWYWx1ZShHVF9VMzIgZGV2TnVtLEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkcik7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdJcFBydklmLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaAppbmRleCAwZjQ2YzgxLi44NjA3YjQ3IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaApAQCAtMjk1LDYgKzI5NSwxMSBAQAogCUdUX1U4ICAgIGRldk51bQogKTsKIAordHlwZWRlZiBHVF9VOCAoKk1WX0hXU19UUkFJTklOR19JUF9HRVRfUkFUSU8pCisoCisJR1RfVTMyICAgIGZyZXEKKyk7CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZ1bmN0aW9ucyBTdHJ1dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIHN0cnVjdApAQCAtMzA3LDYgKzMxMiwxMCBAQAogICAgIE1WX0hXU19TRVRfRlJFUV9ESVZJREVSX0ZVTkNfUFRSICAgICAgICB0aXBTZXRGcmVxRGl2aWRlckZ1bmM7CiAgICAgTVZfSFdTX0dFVF9DU19DT05GSUdfRlVOQ19QVFIgICAgICAgICAgIHRpcEdldENzQ29uZmlnSW5mbzsKIAlNVl9IV1NfVFJBSU5JTkdfSVBfR0VUX1RFTVAJCQkJdGlwR2V0VGVtcGVyYXR1cmU7CisJTVZfSFdTX1RSQUlOSU5HX0lQX0dFVF9SQVRJTwkJCXRpcEdldENsb2NrUmF0aW87CisgICAgTVZfSFdTX1RSQUlOSU5HX0lQX0VYVEVSTkFMX1JFQURfUFRSCXRpcEV4dGVybmFsUmVhZDsKKyAgICBNVl9IV1NfVFJBSU5JTkdfSVBfRVhURVJOQUxfV1JJVEVfUFRSCXRpcEV4dGVybmFsV3JpdGU7CisKIH0gTVZfSFdTX1RJUF9DT05GSUdfRlVOQ19EQjsKIAogCkBAIC0zMzIsNyArMzQxLDYgQEAKIAogfU1WX0hXU19UUkFJTklOR19JUF9GVU5DX1BUUlM7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGRlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0xldmVsaW5nLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvZGRyMy9tdkRkcjNUcmFpbmluZ0xldmVsaW5nLmgKaW5kZXggYzY2ODJmMi4uOGRlNmU5ZSAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL2RkcjMvbXZEZHIzVHJhaW5pbmdMZXZlbGluZy5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9kZHIzL212RGRyM1RyYWluaW5nTGV2ZWxpbmcuaApAQCAtNjUsNyArNjUsNyBAQAogKTsKIAogCi1HVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQodm9pZCk7CitHVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQoR1RfVTMyIGRldk51bSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL212RGRyVG9wb2xvZ3lEZWYuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL0RyaXZlci9tdkRkclRvcG9sb2d5RGVmLmgKaW5kZXggNjc5ZGFlMy4uNzY3OWFhMyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL212RGRyVG9wb2xvZ3lEZWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUb3BvbG9neURlZi5oCkBAIC0xLDQgKzEsNSBAQAogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBDb3B5cmlnaHQgKEMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcwogCkBAIC02OCwyNiArNjksMTQzIEBACiAjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcERlZi5oIgogCiAjaWZkZWYgQ09ORklHX0REUjMKLSNpbmNsdWRlICJtdkRkcjNUb3BvbG9neURlZi5oIgordHlwZWRlZiBlbnVtCit7CisgICBTUEVFRF9CSU5fRERSXzgwMEQsCisgICBTUEVFRF9CSU5fRERSXzgwMEUsCisgICBTUEVFRF9CSU5fRERSXzEwNjZFLAorICAgU1BFRURfQklOX0REUl8xMDY2RiwKKyAgIFNQRUVEX0JJTl9ERFJfMTA2NkcsCisgICBTUEVFRF9CSU5fRERSXzEzMzNGLAorICAgU1BFRURfQklOX0REUl8xMzMzRywKKyAgIFNQRUVEX0JJTl9ERFJfMTMzM0gsCisgICBTUEVFRF9CSU5fRERSXzEzMzNKLAorICAgU1BFRURfQklOX0REUl8xNjAwRywKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEgsCisgICBTUEVFRF9CSU5fRERSXzE2MDBKLAorICAgU1BFRURfQklOX0REUl8xNjAwSywKKyAgIFNQRUVEX0JJTl9ERFJfMTg2NkosCisgICBTUEVFRF9CSU5fRERSXzE4NjZLLAorICAgU1BFRURfQklOX0REUl8xODY2TCwKKyAgIFNQRUVEX0JJTl9ERFJfMTg2Nk0sCisgICBTUEVFRF9CSU5fRERSXzIxMzNLLAorICAgU1BFRURfQklOX0REUl8yMTMzTCwKKyAgIFNQRUVEX0JJTl9ERFJfMjEzM00sCisgICBTUEVFRF9CSU5fRERSXzIxMzNOLAorCisgICBTUEVFRF9CSU5fRERSXzEzMzNIX0VYVCwKKyAgIFNQRUVEX0JJTl9ERFJfMTYwMEtfRVhULAorICAgU1BFRURfQklOX0REUl8xODY2TV9FWFQKK31NVl9IV1NfU1BFRURfQklOOworCit0eXBlZGVmIGVudW0gCit7CisgIEREUl9GUkVRX0xPV19GUkVRLAorICBERFJfRlJFUV80MDAsCisgIEREUl9GUkVRXzUzMywKKyAgRERSX0ZSRVFfNjY3LAorICBERFJfRlJFUV84MDAsCisgIEREUl9GUkVRXzkzMywKKyAgRERSX0ZSRVFfMTA2NiwKKyAgRERSX0ZSRVFfMzExLAorICBERFJfRlJFUV8zMzMsCisgIEREUl9GUkVRXzQ2NywKKyAgRERSX0ZSRVFfODUwLAorICBERFJfRlJFUV82MDAsCisgIEREUl9GUkVRXzMwMCwKKyAgRERSX0ZSRVFfOTAwLAorICBERFJfRlJFUV8zNjAsCisgIEREUl9GUkVRXzEwMDAsCisgICBERFJfRlJFUV9MSU1JVAorfU1WX0hXU19ERFJfRlJFUTsKKwordHlwZWRlZiBlbnVtCit7CisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSQ0QsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJBUywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQySywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFBELAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcySywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUiwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJUUCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190TU9ECit9c3BlZWRCaW5UYWJsZUVsZW1lbnRzOworCiAjZWxpZiBkZWZpbmVkKENPTkZJR19ERFI0KQotI2luY2x1ZGUgIm12RGRyNFRvcG9sb2d5RGVmLmgiCisKK3R5cGVkZWYgZW51bQoreworICAgIFNQRUVEX0JJTl9ERFJfMTYwMEosCisgICAgU1BFRURfQklOX0REUl8xNjAwSywKKyAgICBTUEVFRF9CSU5fRERSXzE2MDBMLAorICAgIFNQRUVEX0JJTl9ERFJfMTg2NkwsCisgICAgU1BFRURfQklOX0REUl8xODY2TSwKKyAgICBTUEVFRF9CSU5fRERSXzE4NjZOLAorICAgIFNQRUVEX0JJTl9ERFJfMjEzM04sCisgICAgU1BFRURfQklOX0REUl8yMTMzUCwKKyAgICBTUEVFRF9CSU5fRERSXzIxMzNSLAorICAgIFNQRUVEX0JJTl9ERFJfMjQwMFAsCisgICAgU1BFRURfQklOX0REUl8yNDAwUiwKKyAgICBTUEVFRF9CSU5fRERSXzI0MDBVLAorfU1WX0hXU19TUEVFRF9CSU47CisKK3R5cGVkZWYgZW51bSAKK3sKKyAgICBERFJfRlJFUV9MT1dfRlJFUSwKKyAgICBERFJfRlJFUV82NjcsCisgICAgRERSX0ZSRVFfODAwLAorICAgIEREUl9GUkVRXzkzMywKKyAgICBERFJfRlJFUV8xMDY2LAorCUREUl9GUkVRXzkwMCwKKwlERFJfRlJFUV8xMDAwLAorICAgIEREUl9GUkVRX0xJTUlUCit9TVZfSFdTX0REUl9GUkVROworCit0eXBlZGVmIGVudW0KK3sKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJDRCwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJQLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkFTLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UkMsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQwXzVLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJEMUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSUkQySywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFJSREwwXzVLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJETDFLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UlJETDJLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190UEQsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcwXzVLLAorICAgIHNwZWVkQmluVGFibGVFbGVtZW50c190RkFXMUssCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RGQVcySywKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUiwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdUUkwsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RSVFAsCisgICAgc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUiwKKyAgICBzcGVlZEJpblRhYmxlRWxlbWVudHNfdE1PRAorfXNwZWVkQmluVGFibGVFbGVtZW50czsKKwogI2Vsc2UKICMgZXJyb3IgIkNPTkZJR19ERFIzIG9yIENPTkZJR19ERFI0IG11c3QgYmUgZGVmaW5lZCAhISEiCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0jZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTlVNICAJCSgxKQotI2RlZmluZSBNQVhfQlVTX05VTSAgICAgICAgCQkoNSkKKyNpZiBkZWZpbmVkKENPTkZJR19CT0JLKSB8fCBkZWZpbmVkKENPTkZJR19CT0JDQVQyKSB8fCAoZGVmaW5lZChDSFhfRkFNSUxZKSB8fCBkZWZpbmVkKEVYTVhQTV9GQU1JTFkpKQorI2RlZmluZSBNQVhfSU5URVJGQUNFX05VTSAgCQkoNSkKICNlbHNlCi0jZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTlVNICAJCSgxMikKLSNkZWZpbmUgTUFYX0JVU19OVU0gICAgICAgIAkJKDgpCisjZGVmaW5lIE1BWF9JTlRFUkZBQ0VfTlVNICAJCSgxKQogI2VuZGlmCiAKLSNkZWZpbmUgU0RSQU1fQ1NfU0laRQkJCQkJCQkweEZGRkZGRkYKKyNkZWZpbmUgTUFYX0JVU19OVU0gICAgICAgIAkJKDUpCisKKyNkZWZpbmUgU0RSQU1fQ1NfU0laRQkJCQkweEZGRkZGRkYKKyNkZWZpbmUgTVZfUEFSQU1TX1VOREVGSU5FRCAJCTB4RkZGRkZGRkYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqIFRvcG9sb2d5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIFNEUkFNX0NTX1NJWkUJCQkJCQkJMHhGRkZGRkZGCiAKIC8qIGJ1cyB3aWR0aCBpbiBiaXRzICovCiB0eXBlZGVmIGVudW0KQEAgLTE3MSw5ICsyODksNiBAQAogICAgLyogQ29udHJvbGxlciBjb25maWd1cmF0aW9uIHBlciBpbnRlcmZhY2UgKi8KICAgIEludGVyZmFjZVBhcmFtcyAgICAgIGludGVyZmFjZVBhcmFtc1tNQVhfSU5URVJGQUNFX05VTV07CiAKLSAgIC8qIEJVUyBwZXIgaW50ZXJmYWNlIChkZWZhdWx0IGlzIDQpKi8KLSAgIEdUX1U4ICAgICAgICAgICAgICAgbnVtT2ZCdXNQZXJJbnRlcmZhY2U7Ci0KICAgIC8qIEJpdCBtYXNrIGZvciBhY3RpdmUgYnVzZXMqLwogICAgR1RfVTggICAgICAgICAgICAgICBhY3RpdmVCdXNNYXNrOwogCkBAIC0xODQsMTAgKzI5OSwyMCBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKIAlHVF9VMzIJY2tEZWxheTsKLQlHVF9VMzIJY2tEZWxheV8xNjsKLQlHVF9VMzIJUGZpbmdlcjsKLQlHVF9VMzIJTmZpbmdlcjsKIAlHVF9VMzIJUGh5UmVnM1ZhbDsKKworCUdUX1UzMiBnWnByaURhdGE7CisJR1RfVTMyIGdabnJpRGF0YTsKKwlHVF9VMzIgZ1pwcmlDdHJsOworCUdUX1UzMiBnWm5yaUN0cmw7CisJR1RfVTMyIGdacG9kdERhdGE7CisJR1RfVTMyIGdabm9kdERhdGE7CisJR1RfVTMyIGdacG9kdEN0cmw7CisJR1RfVTMyIGdabm9kdEN0cmw7CisJR1RfVTMyIGdEaWM7CisJR1RfVTMyIHVpT0RUQ29uZmlnOworCUdUX1UzMiBnUnR0Tm9tOworCUdUX1UzMiBnUnR0V1I7CiB9IEdUX1RVTkVfVFJBSU5JTkdfUEFSQU1TOwogCiAjZW5kaWYgLyogX0REUl9UT1BPTE9HWV9DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvRHJpdmVyL212RGRyVHJhaW5pbmdJcERiLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUcmFpbmluZ0lwRGIuaAppbmRleCA0Yzk0N2RkLi5kZDc4NjBhIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUcmFpbmluZ0lwRGIuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Ecml2ZXIvbXZEZHJUcmFpbmluZ0lwRGIuaApAQCAtNDcsOSArNDcsMTA3IEBACiAKICNpbmNsdWRlICJtdkRkclRvcG9sb2d5RGVmLmgiCiAjaWZkZWYgQ09ORklHX0REUjMKLSNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwRGIuaCIKK3R5cGVkZWYgZW51bQoreworICAgUEFUVEVSTl9QQlMxLAorICAgUEFUVEVSTl9QQlMyLAorICAgUEFUVEVSTl9QQlMzLAorICAgUEFUVEVSTl9URVNULAorICAgUEFUVEVSTl9STCwKKyAgIFBBVFRFUk5fUkwyLAorICAgUEFUVEVSTl9TVEFUSUNfUEJTLAorICAgUEFUVEVSTl9LSUxMRVJfRFEwLAorICAgUEFUVEVSTl9LSUxMRVJfRFExLAorICAgUEFUVEVSTl9LSUxMRVJfRFEyLAorICAgUEFUVEVSTl9LSUxMRVJfRFEzLAorICAgUEFUVEVSTl9LSUxMRVJfRFE0LAorICAgUEFUVEVSTl9LSUxMRVJfRFE1LAorICAgUEFUVEVSTl9LSUxMRVJfRFE2LAorICAgUEFUVEVSTl9LSUxMRVJfRFE3LAorICAgUEFUVEVSTl9WUkVGLAorICAgUEFUVEVSTl9GVUxMX1NTTzAsCisgICBQQVRURVJOX0ZVTExfU1NPMSwKKyAgIFBBVFRFUk5fRlVMTF9TU08yLAorICAgUEFUVEVSTl9GVUxMX1NTTzMsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMCwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTIsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMywKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0LAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTUsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNiwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3LAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTAsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMSwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEyLAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTMsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNCwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE1LAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTYsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNywKKyAgIFBBVFRFUk5fSVNJX1hUQUxLX0ZSRUUsCisgICBQQVRURVJOX0xJTUlUCit9IE1WX0hXU19QQVRURVJOOwogI2VsaWYgZGVmaW5lZChDT05GSUdfRERSNCkKLSNpbmNsdWRlICJtdkRkcjRUcmFpbmluZ0lwRGIuaCIKK3R5cGVkZWYgZW51bQoreworICAgUEFUVEVSTl9QQlMxLC8qMCovCisgICBQQVRURVJOX1BCUzIsCisgICBQQVRURVJOX1BCUzMsCisgICBQQVRURVJOX1RFU1QsCisgICBQQVRURVJOX1JMLAorICAgUEFUVEVSTl9STDIsCisgICBQQVRURVJOX1NUQVRJQ19QQlMsCisgICBQQVRURVJOX0tJTExFUl9EUTAsCisgICBQQVRURVJOX0tJTExFUl9EUTEsCisgICBQQVRURVJOX0tJTExFUl9EUTIsCisgICBQQVRURVJOX0tJTExFUl9EUTMsLyoxMCovCisgICBQQVRURVJOX0tJTExFUl9EUTQsCisgICBQQVRURVJOX0tJTExFUl9EUTUsCisgICBQQVRURVJOX0tJTExFUl9EUTYsCisgICBQQVRURVJOX0tJTExFUl9EUTcsCisgICBQQVRURVJOX0tJTExFUl9EUTBfSU5WLAorICAgUEFUVEVSTl9LSUxMRVJfRFExX0lOViwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRMl9JTlYsCisgICBQQVRURVJOX0tJTExFUl9EUTNfSU5WLAorICAgUEFUVEVSTl9LSUxMRVJfRFE0X0lOViwKKyAgIFBBVFRFUk5fS0lMTEVSX0RRNV9JTlYsLyoyMCovCisgICBQQVRURVJOX0tJTExFUl9EUTZfSU5WLAorICAgUEFUVEVSTl9LSUxMRVJfRFE3X0lOViwKKyAgIFBBVFRFUk5fVlJFRiwKKyAgIFBBVFRFUk5fVlJFRl9JTlYsCisgICBQQVRURVJOX0ZVTExfU1NPMCwKKyAgIFBBVFRFUk5fRlVMTF9TU08xLAorICAgUEFUVEVSTl9GVUxMX1NTTzIsCisgICBQQVRURVJOX0ZVTExfU1NPMywKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTEsLyozMCovCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMiwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzLAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTQsCisgICBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNSwKKyAgIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2LAorICAgUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTcsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFExLAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTIsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMywvKjQwKi8KKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE0LAorICAgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTUsCisgICBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNiwKKyAgIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE3LAorICAgUEFUVEVSTl9JU0lfWFRBTEtfRlJFRSwKKyAgIFBBVFRFUk5fUkVTT05BTkNFXzFULAorICAgUEFUVEVSTl9SRVNPTkFOQ0VfMlQsCisgICBQQVRURVJOX1JFU09OQU5DRV8zVCwKKyAgIFBBVFRFUk5fUkVTT05BTkNFXzRULAorICAgUEFUVEVSTl9SRVNPTkFOQ0VfNVQsLyo1MCovCisgICBQQVRURVJOX1JFU09OQU5DRV82VCwKKyAgIFBBVFRFUk5fUkVTT05BTkNFXzdULAorICAgUEFUVEVSTl9SRVNPTkFOQ0VfOFQsCisgICBQQVRURVJOX1JFU09OQU5DRV85VCwKKyAgIFBBVFRFUk5fTElNSVQKK31NVl9IV1NfUEFUVEVSTjsKICNlbHNlCiAjZXJyb3IgIkNPTkZJR19ERFIzIG9yIENPTkZJR19ERFI0IG11c3QgYmUgZGVmaW5lZCAhISEiCiAjZW5kaWYKQEAgLTY4LDkgKzE2Niw0OSBAQAogICAgIFdyaXRlTGV2ZWxpbmdTdXBwX0VDQ01vZGVfRUNDUHVwMwogfU1WX0hXU19XTF9TVVBQX01PREU7CiAKK3R5cGVkZWYgZW51bQoreworICAgIE1WX0FUVFJfVElQX1JFViwKKyAgICBNVl9BVFRSX1BIWV9FREdFLAorICAgIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSwKKyAgICBNVl9BVFRSX1BMTF9CRUZPUkVfSU5JVCwKKyAgICBNVl9BVFRSX1RVTkVfTUFTSywKKyAgICBNVl9BVFRSX0lOSVRfRlJFUSwKKyAgICBNVl9BVFRSX01JRF9GUkVRLAorICAgIE1WX0FUVFJfREZTX0xPV19GUkVRLAorICAgIE1WX0FUVFJfREZTX0xPV19QSFksCisgICAgTVZfQVRUUl9ERUxBWV9FTkFCTEUsCisgICAgTVZfQVRUUl9DS19ERUxBWSwKKyAgICBNVl9BVFRSX0NBX0RFTEFZLAorICAgIE1WX0FUVFJfSU5URVJMRUFWRV9XQSwKKyAgICBNVl9BVFRSX0xBU1QKK30gTVZfRERSX0RFVl9BVFRSSUJVVEU7CisKK3R5cGVkZWYgZW51bQoreworICAgIE1WX1RJUF9SRVZfTkEsCisgICAgTVZfVElQX1JFVl8xLCAvKiBOUDUgKi8KKyAgICBNVl9USVBfUkVWXzIsIC8qIEJDMiAqLworICAgIE1WX1RJUF9SRVZfMywgLyogQUMzICovCisgICAgTVZfVElQX1JFVl80LCAvKiBBLTM4MC9BLTM5MCAqLworICAgIE1WX1RJUF9SRVZfTEFTVAorfSBNVl9ERFJfVElQX1JFVklTSU9OOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNVl9ERFJfVFJBSU5JTkdfQ09OVFJPTExFUl9USVAsCisgICAgTVZfRERSX1RSQUlOSU5HX0NPTlRST0xMRVJfQ1BVCit9IE1WX0REUl9UUkFJTklOR19DT05UUk9MTEVSOworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNVl9ERFJfUEhZX0VER0VfUE9TSVRJVkUsCisgICAgTVZfRERSX1BIWV9FREdFX05FR0FUSVZFCit9IE1WX0REUl9QSFlfRURHRTsKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiBEZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIEdUX1UzMiBzcGVlZEJpblRhYmxlCiAoCiAgICAgR1RfVTggaW5kZXgsCkBAIC04NCw2ICsyMjIsNyBAQAogICAgIEdUX1U4IGluZGV4CiApOwogCisvKiBEZXZpY2UgdG9wb2xvZ3kgZnVuY3Rpb25hbGl0eSAqLwogTVZfSFdTX1RPUE9MT0dZX01BUCogZGRyM1RpcEdldFRvcG9sb2d5TWFwCiAoCiAgICAgR1RfVTMyICBkZXZOdW0KQEAgLTk1LDYgKzIzNCw0NSBAQAogICAgIE1WX0hXU19UT1BPTE9HWV9NQVAqIHRvcG9sb2d5CiApOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwRGV2QXR0ckluaXQuCisqIERlc2M6ICAgICBJbml0IGRldmljZSBhdHRyaWJ1dGVzIHN0cnVjdHVyZXMKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBub25lLgorKi8KK3ZvaWQgICAgZGRyM1RpcERldkF0dHJJbml0CisoCisgICAgR1RfVTMyICBkZXZOdW0KKyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBEZXZBdHRyR2V0LgorKiBEZXNjOiAgICAgZ2V0IHNwZWNpZmllZCBkZXZpY2UgYXR0cmlidXRlIHZhbHVlCisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgbm9uZS4KKyovCitHVF9VMzIgICAgZGRyM1RpcERldkF0dHJHZXQKKygKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfRERSX0RFVl9BVFRSSUJVVEUgICAgYXR0cklkCispOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwRGV2QXR0clNldC4KKyogRGVzYzogICAgIHNldCBzcGVjaWZpZWQgZGV2aWNlIGF0dHJpYnV0ZSB2YWx1ZQorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIG5vbmUuCisqLwordm9pZCAgICBkZHIzVGlwRGV2QXR0clNldAorKAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9ERFJfREVWX0FUVFJJQlVURSAgICBhdHRySWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICAgdmFsdWUKKyk7CisKICNlbmRpZiAvKiBfTVZfRERSM19UUkFJTklOR0lQX0RCX0hfICovCiAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvY29tbW9uL3NpbGljb25JZi9tdlNpbGljb25JZi5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvT3MvY29tbW9uL3NpbGljb25JZi9tdlNpbGljb25JZi5oCmluZGV4IGI5ZDE4NzUuLmY2ZTk4NWMgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL09zL2NvbW1vbi9zaWxpY29uSWYvbXZTaWxpY29uSWYuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Pcy9jb21tb24vc2lsaWNvbklmL212U2lsaWNvbklmLmgKQEAgLTg0LDEwICs4NCwxMCBAQAogI2RlZmluZSBBQlModmFsKSAoKHZhbCkgPCAwKSA/IC0odmFsKSA6ICh2YWwpCiAKIC8qIG1heCBudW1iZXIgb2YgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgZHJpdmVyICovCi0jaWZkZWYgQ09fQ1BVX1JVTgotI2RlZmluZSBIV1NfTUFYX0RFVklDRV9OVU0gKDEpCi0jZWxzZQorI2lmIGRlZmluZWQoQ0hYX0ZBTUlMWSkgfHwgZGVmaW5lZChFWE1YUE1fRkFNSUxZKQogI2RlZmluZSBIV1NfTUFYX0RFVklDRV9OVU0gKDE2KQorI2Vsc2UKKyNkZWZpbmUgSFdTX01BWF9ERVZJQ0VfTlVNICgxKQogI2VuZGlmCiAvKiBtYXggbnVtYmVyIG9mIFNFUkRFU2VzIGluIG9uZSBkZXZpY2UgKi8KICNkZWZpbmUgSFdTX01BWF9ERVZfU0VSREVTX05VTSAoOTYpCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9TaWxpY29uL212SHdzRGRyM0EzOHguaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQTM4eC5oCmluZGV4IGJkYzEwNWUuLmM2MGRhMzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQTM4eC5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQTM4eC5oCkBAIC0zOCwxNyArMzgsMjMgQEAKICNkZWZpbmUgX19tdkh3c0RkcjNfQTM4eF9ICiAKIC8qIFRlcm1hbCBTZW5zb3IgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFRTRU5fU1RBVEVfUkVHCQkJCQkJMHhFNDA3MAotI2RlZmluZSBUU0VOX1NUQVRFX09GRlNFVAkJCQkJMzEKLSNkZWZpbmUgVFNFTl9TVEFURV9NQVNLCQkJCQkJKDB4MSA8PCBUU0VOX1NUQVRFX09GRlNFVCkKLSNkZWZpbmUgVFNFTl9DT05GX1JFRwkJCQkJCTB4RTQwNzQKLSNkZWZpbmUgVFNFTl9DT05GX1JTVF9PRkZTRVQJCQkJOAotI2RlZmluZSBUU0VOX0NPTkZfUlNUX01BU0sJCQkJCSgweDEgPDwgVFNFTl9DT05GX1JTVF9PRkZTRVQpCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfUkVHCQkJCQkweEU0MDcwCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQJCQkJMAorI2RlZmluZSBUU0VOX0NPTlRST0xfTFNCX1RDX1RSSU1fTUFTSwkJCQkoMHg3IDw8IFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQpCisjZGVmaW5lIFRTRU5fQ09OVFJPTF9NU0JfUkVHCQkJCQkweEU0MDc0CisjZGVmaW5lIFRTRU5fQ09OVFJPTF9NU0JfUlNUX09GRlNFVAkJCQk4CisjZGVmaW5lIFRTRU5fQ09OVFJPTF9NU0JfUlNUX01BU0sJCQkJKDB4MSA8PCBUU0VOX0NPTlRST0xfTVNCX1JTVF9PRkZTRVQpCiAjZGVmaW5lIFRTRU5fU1RBVFVTX1JFRwkJCQkJCTB4RTQwNzgKICNkZWZpbmUgVFNFTl9TVEFUVVNfUkVBRE9VVF9WQUxJRF9PRkZTRVQJMTAKICNkZWZpbmUgVFNFTl9TVEFUVVNfUkVBRE9VVF9WQUxJRF9NQVNLCQkoMHgxIDw8IFRTRU5fU1RBVFVTX1JFQURPVVRfVkFMSURfT0ZGU0VUKQogI2RlZmluZSBUU0VOX1NUQVRVU19URU1QX09VVF9PRkZTRVQJCQkwCiAjZGVmaW5lIFRTRU5fU1RBVFVTX1RFTVBfT1VUX01BU0sJCQkoMHgzRkYgPDwgVFNFTl9TVEFUVVNfVEVNUF9PVVRfT0ZGU0VUKQogCisvKiBkZXZpY2UgSUQgYW5kIHJldmlzaW9uICovCisjZGVmaW5lIERFVl9JRF9SRUcJCQkJCTB4MTgyMzgKKyNkZWZpbmUgREVWX1ZFUlNJT05fSURfUkVHCQkJMHgxODIzQworI2RlZmluZSBSRVZJU09OX0lEX09GRlMJCQkJOAorI2RlZmluZSBSRVZJU09OX0lEX01BU0sJCQkJMHhGMDAKKwogI2VuZGlmIC8qX19tdkh3c0RkcjNfQTM4eF9IKi8KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNCYzIuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQmMyLmgKaW5kZXggZTdkNDQ3Ni4uNGNmNGNiZiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNCYzIuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9TaWxpY29uL212SHdzRGRyM0JjMi5oCkBAIC01MSwyMSArNTEsMjEgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgQkMyX05VTUJFUl9PRl9JTlRFUkZBQ0VTCQk1Ci0jZGVmaW5lIEJDMl9OVU1CRVJfT0ZfUFVQCQkJCTQKLSNkZWZpbmUgQkMyX05VTUJFUl9PRl9CT0FSRFMJCQkyCisjZGVmaW5lIEJDMl9OVU1CRVJfT0ZfSU5URVJGQUNFUyAgICAgICAgICAgICAgICg1KQorI2RlZmluZSBCQzJfTlVNQkVSX09GX1BVUCAgICAgICAgICAgICAgICAgICAgICAoNCkKKyNkZWZpbmUgQkMyX05VTUJFUl9PRl9CT0FSRFMgICAgICAgICAgICAgICAgICAgKDIpCiAKLSNkZWZpbmUgQkMyX0RFVklDRV9TQVIxX1JFR19BRERSICAgICAgICAgICAgICAgICAgICAgICAgMHhGODIwMAotI2RlZmluZSBCQzJfREVWSUNFX1NBUjJfUkVHX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweEY4MjA0CisjZGVmaW5lIEJDMl9ERVZJQ0VfU0FSMV9SRUdfQUREUiAgICAgICAgICAgICAgIDB4RjgyMDAKKyNkZWZpbmUgQkMyX0RFVklDRV9TQVIyX1JFR19BRERSICAgICAgICAgICAgICAgMHhGODIwNAogCiAjZGVmaW5lIEJDMl9KVEFHX0RFVl9JRF9TVEFUVVNfUkVHX0FERFIgICAgICAgIDB4MDAwRjgyNDQKICNkZWZpbmUgQkMyX0RFVl9HRU5FUkFMX1NUQVRVU19SRUcxX0FERFJfQTAgICAgMHgwMDBGODJCNAogI2RlZmluZSBCQzJfREVWX0dFTkVSQUxfU1RBVFVTX1JFRzFfQUREUl9CMCAgICAweDAwMEY4Qzg0CiAKLSNkZWZpbmUgQkMyX0pUQUdfREVWX0lEX1NUQVRVU19WRVJTSU9OX09GRlNFVCAgICAgMjgKKyNkZWZpbmUgQkMyX0pUQUdfREVWX0lEX1NUQVRVU19WRVJTSU9OX09GRlNFVCAgMjgKIAotI2RlZmluZSBCQzJfREVWSUNFX1NBUjFfTVNZU19UTV9TRFJBTV9TRUxfT0ZGU0VUICAgIAkxMQotI2RlZmluZSBCQzJfREVWSUNFX1NBUjFfTVNZU19UTV9TRFJBTV9TRUxfTUFTSyAgICAgIAkweDEKKyNkZWZpbmUgQkMyX0RFVklDRV9TQVIxX01TWVNfVE1fU0RSQU1fU0VMX09GRlNFVCAgIDExCisjZGVmaW5lIEJDMl9ERVZJQ0VfU0FSMV9NU1lTX1RNX1NEUkFNX1NFTF9NQVNLICAgICAweDEKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW51bXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQm9iSy5oIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU2lsaWNvbi9tdkh3c0RkcjNCb2JLLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTUwODkwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NpbGljb24vbXZId3NEZHIzQm9iSy5oCkBAIC0wLDAgKzEsMTUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuIGFuZCBpdHMgYWZmaWxpYXRlcworKgorKiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIpIGlzIG93bmVkIGFuZCBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsCisqIEludGVybmF0aW9uYWwgTHRkLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMgKCJNYXJ2ZWxsIikgdW5kZXIgdGhlIGZvbGxvd2luZworKiBhbHRlcm5hdGl2ZSBsaWNlbnNpbmcgdGVybXMuCisqIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZQorKiBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKiAgLSAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyogICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogIC0gICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAtICAgIE5laXRoZXIgdGhlIG5hbWUgb2YgTWFydmVsbCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlCisqICAgICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyogICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12SHdzRGRyM0JvYksuaAorKgorKiBERVNDUklQVElPTjoKKyoKKyoKKyogRklMRSBSRVZJU0lPTiBOVU1CRVI6CisqICAgICAgICRSZXZpc2lvbjogOSAkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fbXZId3NEZHIzX0JPQktfSAorI2RlZmluZSBfX212SHdzRGRyM19CT0JLX0gKKworI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBEZWYuaCIKKyNpZiAhZGVmaW5lZChDUFNTX0JVSUxEKQorI2luY2x1ZGUgImNvbmZpZ19tYXJ2ZWxsLmgiICAgICAvKiBSZXF1aXJlZCB0byBpZGVudGlmeSBTT0MgYW5kIEJvYXJkICovCisjaW5jbHVkZSAibXZTeXNFbnZMaWIuaCIKKyNlbmRpZgorI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBTdGF0aWMuaCIKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQk9CS19OVU1CRVJfT0ZfQk9BUkRTICAgICAgICAgICAoMikKKyNkZWZpbmUgTlVNQkVSX09GX1BVUAkJCQkJNQorLyoqKioqKioqKioqKioqKioqKioqKioqKiogRW51bXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bSB7CisJVE1fRU4sCisJTVNZU19FTgorfUREUl9JRl9BU1NJR05NRU5UOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBHbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIERFRklORV9HTE9CQUxTCitleHRlcm4gVHJpcERlbGF5RWxlbWVudCBib2JLQm9hcmRSb3VuZFRyaXBEZWxheUFycmF5W01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNKkJPQktfTlVNQkVSX09GX0JPQVJEU107CisjZWxzZQorLyogdGhpcyBhcnJheSBob2xkIHRoZSBib2FyZCByb3VuZCB0cmlwIGRlbGF5IChEUSBhbmQgQ0spIHBlciA8aW50ZXJmY2FlLGJ1cz4gKi8KK1RyaXBEZWxheUVsZW1lbnQgYm9iS0JvYXJkUm91bmRUcmlwRGVsYXlBcnJheVtNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTSpCT0JLX05VTUJFUl9PRl9CT0FSRFNdID0KK3sKKyAgIC8qIDFzdCBib2FyZCAqLworICAgLyppbnRlcmZhY2UgYnVzIERRUy1kZWxheSBDSy1kZWxheSAqLworICAgeyAzMDEyLCAgIDY3MTUgfSwKKyAgIHsgMjYyNSwgICA2NzE1IH0sCisgICB7IDMwMjMsICAgNjQ1OCB9LAorICAgeyAyNjYzLCAgIDY0NTggfSwKKyAgIHsgMjU5NiwgICA2NjkxIH0sCisKKyAgIC8qIDJuZCBib2FyZCAqLworICAgLyppbnRlcmZhY2UgYnVzIERRUy1kZWxheSBDSy1kZWxheSAqLworICAgeyAzMDEyLCAgIDY3MTUgfSwKKyAgIHsgMjYyNSwgICA2NzE1IH0sCisgICB7IDMwMjMsICAgNjQ1OCB9LAorICAgeyAyNjYzLCAgIDY0NTggfSwKKyAgIHsgMjU5NiwgICA2NjkxIH0sCit9OworI2VuZGlmCisKKworI2lmbmRlZiBERUZJTkVfR0xPQkFMUworZXh0ZXJuIFRyaXBEZWxheUVsZW1lbnQgYm9iS1BhY2thZ2VSb3VuZFRyaXBEZWxheUFycmF5W01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXTsKKyNlbHNlCisvKiBwYWNrYWdlIHRyYWNlICovCitUcmlwRGVsYXlFbGVtZW50IGJvYktQYWNrYWdlUm91bmRUcmlwRGVsYXlBcnJheVtNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0gPQoreworICAgICAvKklGIEJVUyBEUV9ERUxZQSBDS19ERUxBWSAqLworICAgIHsgIDM2MiwgICAgODEzIH0sCisgICAgeyAgNDU4LCAgICA4MTMgfSwKKyAgICB7ICA0MDUsICAgIDc1MCB9LAorICAgIHsgIDQ0NiwgICAgNzUwIH0sCisgICAgeyAgMzkzLCAgICA3MTggfQorfTsKKyNlbmRpZgorCisjaWZuZGVmIERFRklORV9HTE9CQUxTCitleHRlcm4gR1RfMzIgYm9iS1NpbGljb25EZWxheU9mZnNldFtdOworI2Vsc2UKK0dUXzMyIGJvYktTaWxpY29uRGVsYXlPZmZzZXRbXSA9Cit7CisgICAgLyogYm9hcmQgMCAqLworICAgIDAsCisgICAgLyogYm9hcmQgMSAqLworICAgIDAsCisgICAgLyogYm9hcmQgMiAqLworICAgIDAKK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb25zIERlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcEluaXRCb2JLLgorKiBEZXNjOiAgICAgaW5pdCBUcmFpbmluZyBTVyBEQiBhbmQgdXBkYXRlcyBERFIgdG9wb2xvZ3kuCisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyBkZHIzVGlwSW5pdEJvYksKKygKKyAgICBHVF9VMzIgIGRldk51bSwKKyAgICBHVF9VMzIgIGJvYXJkSWQKKykgOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiAgICAgZGRyM0dldFNkcmFtQXNzaWdubWVudAorICogRGVzYzogICAgIHJlYWQgU0BSIGFuZCByZXR1cm4gRERSMyBhc3NpZ25tZW50ICggMCA9IFRNICwgMSA9IE1TWVMgKQorICogQXJnczoKKyAqIE5vdGVzOgorICogUmV0dXJuczogIHJlcXVpcmVkIHZhbHVlCisgKi8KK0REUl9JRl9BU1NJR05NRU5UIGRkcjNHZXRTZHJhbUFzc2lnbm1lbnQoR1RfVTggZGV2TnVtKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fbXZId3NEZHIzX0JPQktfSCAqLworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Tb0MvZGRyM19od3Nfc2lsLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvaC9Tb0MvZGRyM19od3Nfc2lsLmgKaW5kZXggNWVkNDJhNy4uNTdlMTFlOCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL2gvU29DL2RkcjNfaHdzX3NpbC5oCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9oL1NvQy9kZHIzX2h3c19zaWwuaApAQCAtMjcsNiArMjcsOSBAQAogI2lmIGRlZmluZWQoTVZfTVNZU19CQzIpCiAjaW5jbHVkZSAiZGRyM19tc3lzX2JjMi5oIgogI2luY2x1ZGUgImRkcjNfbXN5c19iYzJfY29uZmlnLmgiCisjaWYgZGVmaW5lZChNVl9NU1lTX0JPQkspCisjaW5jbHVkZSAiZGRyM19tc3lzX2JvYmsuaCIKKyNpbmNsdWRlICJkZHIzX21zeXNfYm9ia19jb25maWcuaCIKICNlbGlmIGRlZmluZWQoTVZfTVNZU19BQzMpCiAjaW5jbHVkZSAiZGRyM19tc3lzX2FjMy5oIgogI2luY2x1ZGUgImRkcjNfbXN5c19hYzNfY29uZmlnLmgiCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL2d0QnVpbGQgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL2d0QnVpbGQKaW5kZXggOWU2Yzg3MS4uNzhhNDhiYSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9ndEJ1aWxkCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvZ3RCdWlsZApAQCAtMjIsNiArMjIsMTIgQEAKICNTVUJESVJTICAgICAgPQogQ19FWENMVURFX0ZJTEVfTElTVCA9IG12SHdzRGRyM1RyYWluaW5nU3R1Yi5jCiAKK0NGTEFHUyArPSAtREREUl9WSUVXRVJfVE9PTCAtRE1WX0hXU19FWENMVURFX0RFQlVHX1BSSU5UUworCisjIFRvIGVuYWJsZSBSWCBJTyBCSVNUIFRlc3QgdW4tbWFyayBiZWxvdyBsaW5lCisjIENGTEFHUyArPSAtRE1WX0hXU19SWF9JT19CSVNUCisjIFRvIGVuYWJsZSBDTUQvQUREUiBUZXN0IHVuLW1hcmsgYmVsb3cgbGluZQorIyBDRkxBR1MgKz0gLURNVl9IV1NfUlhfSU9fQklTVF9FVFAKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM0RlYnVnLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM0RlYnVnLmMKaW5kZXggNmY2OWUwYS4uMDlhODkyZiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNEZWJ1Zy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzRGVidWcuYwpAQCAtMzIsMTEgKzMyLDIzIEBACiAjaW5jbHVkZSAibXZEZHJUcmFpbmluZ0lwRGIuaCIKIAogCi0jaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHCisjaWZkZWYgRERSX1ZJRVdFUl9UT09MCiBHVF9TVEFUVVMgcHJpbnRBZGxsKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBhZGxsW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSk7CitHVF9TVEFUVVMgcHJpbnRQaChHVF9VMzIgZGV2TnVtLCBHVF9VMzIgYWRsbFtNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0pOworCitHVF9VOCBzd2VlcFBhdHRlcm5JbmRleFN0YXJ0ID0gUEFUVEVSTl9LSUxMRVJfRFEwLCBzd2VlcFBhdHRlcm5JbmRleEVuZCA9IFBBVFRFUk5fTElNSVQ7CiBzdGF0aWMgY2hhciogQ29udmVydEZyZXEoTVZfSFdTX0REUl9GUkVRIGZyZXEpOworI2lmIGRlZmluZWQoRVhDTFVERV9TV0lUQ0hfREVCVUcpCitleHRlcm4gTVZfSFdTX1BBVFRFUk4gc3dlZXBQYXR0ZXJuOworR1RfVTMyIGN0cmxTd2VlcHJlc1tBRExMX0xFTkdUSF1bTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXTsKK0dUX1UzMiBjdHJsQURMTFtNQVhfQ1NfTlVNKk1BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXTsKK0dUX1UzMiBjdHJsQURMTDFbTUFYX0NTX05VTSpNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV07CitHVF9VMzIgY3RybExldmVsUGhhc2VbTUFYX0NTX05VTSpNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV07CiAjZW5kaWYKLWV4dGVybiBHVF9VMzIgY2tEZWxheSwgY2tEZWxheV8xNjsKKyNlbmRpZgorCitleHRlcm4gR1RfVTMyIGNrRGVsYXk7CitleHRlcm4gR1RfVTMyIGRtaW5QaHlSZWdUYWJsZVtNQVhfQlVTX05VTSpNQVhfQ1NfTlVNXVsyXTsKIAogZXh0ZXJuIEdUX1NUQVRVUyBkZHIzVGlwUmVzdG9yZUR1bml0UmVncwogKApAQCAtMTQ2LDcgKzE1OCw3IEBACiBleHRlcm4gR1RfVTMyIG1hc2tUdW5lRnVuYzsKIGV4dGVybiBHVF9VMzIgZnJlcVZhbFtdOwogTVZfSFdTX1RJUF9DT05GSUdfRlVOQ19EQiBjb25maWdGdW5jSW5mb1tIV1NfTUFYX0RFVklDRV9OVU1dOwotR1RfVTggaXNEZWZhdWx0Q2VudHJhbGl6YXRpb24gPSAwICwgaXNUdW5lUmVzdWx0ID0gMCwgaXNWYWxpZGF0ZVdpbmRvd1BlcklmID0gMCwgaXNWYWxpZGF0ZVdpbmRvd1BlclB1cCA9IDAsIHN3ZWVwQ250ID0gMSwgaXNCaXN0UmVzZXRCaXQgPSAxOworR1RfVTggaXNEZWZhdWx0Q2VudHJhbGl6YXRpb24gPSAwICwgaXNUdW5lUmVzdWx0ID0gMCwgaXNWYWxpZGF0ZVdpbmRvd1BlcklmID0gMCwgaXNWYWxpZGF0ZVdpbmRvd1BlclB1cCA9IDAsIHN3ZWVwQ250ID0gMSwgaXNCaXN0UmVzZXRCaXQgPSAxLCBpc1J1bkxldmVsaW5nU3dlZXBUZXN0cyA9IDA7CiBzdGF0aWMgTVZfSFdTX1hTQl9JTkZPIHhzYkluZm9bSFdTX01BWF9ERVZJQ0VfTlVNXTsKIAogCkBAIC0xNjAsNiArMTcyLDcgQEAKIHsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQsIHJlZ0FkZHIsIGRhdGFWYWx1ZSwgYnVzSWQ7CiAJR1RfVTMyIHJlYWREYXRhW01BWF9JTlRFUkZBQ0VfTlVNXTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogICAgIG12UHJpbnRmKCItLSBkdW5pdCByZWdpc3RlcnMgLS1cbiIpOwogICAgIGZvcihyZWdBZGRyID0gMHgxNDAwOyByZWdBZGRyIDwgMHgxOUYwOyByZWdBZGRyKz00KQogICAgIHsKQEAgLTE4MCwxNSArMTkzLDE1IEBACiAgICAgICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzSWQrKykKKyAgICAgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgICAgICAgICAgewotCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKLQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsICBERFJfUEhZX0RBVEEsICByZWdBZGRyLCAmZGF0YVZhbHVlKSk7CisJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsICBERFJfUEhZX0RBVEEsICByZWdBZGRyLCAmZGF0YVZhbHVlKSk7CiAgICAgICAgICAgICAgICAgbXZQcmludGYoIjB4JXggIiwgIGRhdGFWYWx1ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzSWQrKykKKyAgICAgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgICAgICAgICAgewotCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKKwkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgIEREUl9QSFlfQ09OVFJPTCwgIHJlZ0FkZHIsICZkYXRhVmFsdWUpKTsKICAgICAgICAgICAgICAgICBtdlByaW50ZigiMHgleCAiLCAgZGF0YVZhbHVlKTsKICAgICAgICAgICAgIH0KQEAgLTI2NSw3ICsyNzgsNyBAQAogfQogCiAKLSNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcKKyNpZmRlZiBERFJfVklFV0VSX1RPT0wKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQ29udmVydCBmcmVxIHRvIGNoYXJhY3RlciBzdHJpbmcKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQxMyw5ICs0MjYsMTIgQEAKIEdUX1NUQVRVUyBkZHIzVGlwUHJpbnRMb2coR1RfVTMyIGRldk51bSwgR1RfVTMyIG1lbUFkZHIpCiB7CiAgICAgR1RfVTMyIGludGVyZmFjZUlkID0gMDsKLQltZW1BZGRyID0gbWVtQWRkcjsKIAotI2lmbmRlZiBFWENMVURFX1NXSVRDSF9ERUJVRworICAgIG1lbUFkZHIgPSBtZW1BZGRyOyAvKiBhdm9pZCB3YXJuaW5ncyAqLworCisjaWZuZGVmIEREUl9WSUVXRVJfVE9PTAorICAgIGRldk51bSA9IGRldk51bTsgLyogYXZvaWQgd2FybmluZ3MgKi8KKyNlbHNlCiAgICAgaWYgKCggaXNWYWxpZGF0ZVdpbmRvd1BlcklmICE9IDApIHx8ICggaXNWYWxpZGF0ZVdpbmRvd1BlclB1cCAhPSAwKSkKIAogICAgIHsKQEAgLTQyNSwxNyArNDQxLDIzIEBACiAJCWZyZXEgPSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ZpcnN0QWN0aXZlSWZdLm1lbW9yeUZyZXE7CiAKICAgICAgICAgaXNQdXBMb2cgPSAoaXNWYWxpZGF0ZVdpbmRvd1BlclB1cCAhPSAwKSA/IDE6MDsKLQltdlByaW50ZigiPT09VkFMSURBVEUgV0lORE9XIExPRyBTVEFSVD09PVxuIik7Ci0JbXZQcmludGYoIkREUiBGcmVxdWVuY3k6ICVzICAgPT09PT09XG4iLENvbnZlcnRGcmVxKGZyZXEpKTsKKwkJbXZQcmludGYoIj09PVZBTElEQVRFIFdJTkRPVyBMT0cgU1RBUlQ9PT1cbiIpOworCQltdlByaW50ZigiRERSIEZyZXF1ZW5jeTogJXMgICA9PT09PT1cbiIsQ29udmVydEZyZXEoZnJlcSkpOwogICAgICAgICAvKiBwcmludCBzd2VlcCB3aW5kb3dzICovCiAgICAgICAgIGRkcjNUaXBSdW5Td2VlcFRlc3QoZGV2TnVtLCBzd2VlcENudCwgMSAsIGlzUHVwTG9nKTsKICAgICAgICAgZGRyM1RpcFJ1blN3ZWVwVGVzdChkZXZOdW0sIHN3ZWVwQ250LCAwICwgaXNQdXBMb2cpOwotICAgICAgICBkZHIzVGlwUHJpbnRBbGxQYnNSZXN1bHQoZGV2TnVtKTsKLSAgICAgICAgZGRyM1RpcFByaW50V0xTdXBwUmVzdWx0KGRldk51bSk7Ci0gICAgICAgIG12UHJpbnRmKCI9PT1WQUxJREFURSBXSU5ET1cgTE9HIEVORCA9PT1cbiIpOwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwUmVzdG9yZUR1bml0UmVncyhkZXZOdW0pKTsKLSAgICAgICAgZGRyM1RpcFJlZ0R1bXAoZGV2TnVtKTsKIAorI2lmIGRlZmluZWQoRVhDTFVERV9TV0lUQ0hfREVCVUcpCisJCWlmKCBpc1J1bkxldmVsaW5nU3dlZXBUZXN0cyA9PSAxICl7CisJCQlkZHIzVGlwUnVuTGV2ZWxpbmdTd2VlcFRlc3QoZGV2TnVtLCBzd2VlcENudCwgMCAsIGlzUHVwTG9nKTsKKwkJCWRkcjNUaXBSdW5MZXZlbGluZ1N3ZWVwVGVzdChkZXZOdW0sIHN3ZWVwQ250LCAxICwgaXNQdXBMb2cpOworCQl9CisjZW5kaWYKKwkJZGRyM1RpcFByaW50QWxsUGJzUmVzdWx0KGRldk51bSk7CisJCWRkcjNUaXBQcmludFdMU3VwcFJlc3VsdChkZXZOdW0pOworCQltdlByaW50ZigiPT09VkFMSURBVEUgV0lORE9XIExPRyBFTkQgPT09XG4iKTsKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBSZXN0b3JlRHVuaXRSZWdzKGRldk51bSkpOworCQlkZHIzVGlwUmVnRHVtcChkZXZOdW0pOwogICAgIH0KICNlbmRpZgogCkBAIC01NDAsNyArNTYyLDcgQEAKICAgIH0KICAgICByZXR1cm4gR1RfT0s7CiB9Ci0KKyNpZm5kZWYgTVZfSFdTX0VYQ0xVREVfREVCVUdfUFJJTlRTCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFByaW50IHN0YWJpbGl0eSBsb2cgaW5mbwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTUyLDggKzU3NCwxMSBAQAogCUdUX1UzMiBQaCA9IGFkbGxUYXAqMzI7CiAJR1RfVTMyIENDID0gUGgqMjsqLwogCUdUX1UzMiByZWdEYXRhOworI2lmZGVmIENPTkZJR19ERFI0CisJR1RfVTMyIHJlZ0RhdGExOworI2VuZGlmCiAJR1RfVTMyIHJlYWREYXRhW01BWF9JTlRFUkZBQ0VfTlVNXTsKLQlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKKwlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKIAogCS8qVGl0bGUgcHJpbnQqLwogCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspCkBAIC01OTYsNyArNjIxLDcgQEAKIAl7CiAJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAKLQkJbXZQcmludGYoIkRhdGE6ICVkLCVkLCIsaW50ZXJmYWNlSWQsIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldFRlbXBlcmF0dXJlICE9IE5VTEwpPyhjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldFRlbXBlcmF0dXJlKGRldk51bSkpOigwKSk7CisJCW12UHJpbnRmKCJEYXRhOiAlZCwlZCwiLGludGVyZmFjZUlkLCAoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRUZW1wZXJhdHVyZSAhPSBOVUxMKT8oY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRUZW1wZXJhdHVyZSgoR1RfVTgpZGV2TnVtKSk6KDApKTsKIAogCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTRDOCwgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKIAkJbXZQcmludGYoIiVkLCVkLCIsKChyZWFkRGF0YVtpbnRlcmZhY2VJZF0mMHgzRjApPj40KSwoKHJlYWREYXRhW2ludGVyZmFjZUlkXSYweEZDMDApPj4xMCkpOwpAQCAtNjE2LDE3ICs2NDEsMjEgQEAKIAkJCQltdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFJFU1VMVF9EQl9QSFlfUkVHX0FERFIrY3NpbmRleCwgJnJlZ0RhdGEpOwogCQkJCW12UHJpbnRmKCIlZCwlZCwiLChyZWdEYXRhJjB4MUYpLCgocmVnRGF0YSYweDNFMCk+PjUpKTsKIAkJCQkjZWxzZS8qRERSNCovCisJCQkJLypEbWluVHgsIGFyZWFUWCovCiAJCQkJbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBSRVNVTFRfREJfUEhZX1JFR19BRERSK2NzaW5kZXgsICZyZWdEYXRhKTsKLQkJCQltdlByaW50ZigiJWQsJWQsIiwocmVnRGF0YSYweDFGKSo0LDIqKChyZWdEYXRhJjB4RkZFMCk+PjUpKTsKKwkJCQltdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGRtaW5QaHlSZWdUYWJsZVtjc2luZGV4KjUrYnVzSWRdWzBdLCBERFJfUEhZX0NPTlRST0wsIGRtaW5QaHlSZWdUYWJsZVtjc2luZGV4KjUrYnVzSWRdWzFdLCAmcmVnRGF0YTEpOworCQkJCW12UHJpbnRmKCIlZCwlZCwiLDIqKHJlZ0RhdGExJjB4RkYpLHJlZ0RhdGEpOworCQkJCS8qRG1pblJ4LCBhcmVhUlgqLwogCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgUkVTVUxUX0RCX1BIWV9SRUdfQUREUitjc2luZGV4ICsgNCwgJnJlZ0RhdGEpOwotCQkJCW12UHJpbnRmKCIlZCwlZCwiLChyZWdEYXRhJjB4MUYpKjQsMiooKHJlZ0RhdGEmMHhGRkUwKT4+NSkpOworCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgZG1pblBoeVJlZ1RhYmxlW2NzaW5kZXgqNStidXNJZF1bMF0sIEREUl9QSFlfQ09OVFJPTCwgZG1pblBoeVJlZ1RhYmxlW2NzaW5kZXgqNStidXNJZF1bMV0sICZyZWdEYXRhMSk7CisJCQkJbXZQcmludGYoIiVkLCVkLCIsMioocmVnRGF0YTE+PjgpLHJlZ0RhdGEpOwogCQkJCSNlbmRpZgogCQkJCS8qV0wqLwogCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRytjc2luZGV4KjQsICZyZWdEYXRhKTsKIAkJCQltdlByaW50ZigiJWQsJWQsJWQsIiwocmVnRGF0YSYweDFGKSsoKHJlZ0RhdGEmMHgxQzApPj42KSozMiwocmVnRGF0YSYweDFGKSwocmVnRGF0YSYweDFDMCk+PjYpOwogCQkJCS8qUkwqLwogCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgUkVBRF9EQVRBX1NBTVBMRV9ERUxBWSwgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKLQkJCQlyZWFkRGF0YVtpbnRlcmZhY2VJZF0gPSAocmVhZERhdGFbaW50ZXJmYWNlSWRdJigweEY8PCg0KmNzaW5kZXgpKSkgPj4gKDQqY3NpbmRleCk7CisJCQkJcmVhZERhdGFbaW50ZXJmYWNlSWRdID0gKHJlYWREYXRhW2ludGVyZmFjZUlkXSYoMHgxRjw8KDgqY3NpbmRleCkpKSA+PiAoOCpjc2luZGV4KTsKIAkJCQltdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFJMX1BIWV9SRUcrY3NpbmRleCo0LCAmcmVnRGF0YSk7CiAJCQkJbXZQcmludGYoIiVkLCVkLCVkLCVkLCIsKHJlZ0RhdGEmMHgxRikrKChyZWdEYXRhJjB4MUMwKT4+NikqMzIgKyByZWFkRGF0YVtpbnRlcmZhY2VJZF0qNjQsKHJlZ0RhdGEmMHgxRiksKChyZWdEYXRhJjB4MUMwKT4+NikscmVhZERhdGFbaW50ZXJmYWNlSWRdKTsKIAkJCQkvKkNlbnRyYWxpemF0aW9uKi8KQEAgLTY2OCwxMyArNjk3LDEzIEBACiAJcmV0dXJuIEdUX09LOwogfQogCi0KKyNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBSZWdpc3RlciBYU0IgaW5mb3JtYXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEdUX1NUQVRVUyBkZHIzVGlwUmVnaXN0ZXJYc2JJbmZvCiAoCi0gICAgR1RfVTMyCQkJCQlkZXZOdW0sIAorICAgIEdUX1UzMgkJCQkJZGV2TnVtLAogICAgIE1WX0hXU19YU0JfSU5GTyAgICAgICAgICp4c2JJbmZvVGFibGUKICkKIHsKQEAgLTY4NSwyMCArNzE0LDIxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFJlYWQgQURMTCBWYWx1ZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR1RfQk9PTCByZWFkQWRsbFZhbHVlKEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkciwgR1RfVTMyIG1hc2spCitHVF9CT09MIG12SHdzRGRyM1RpcFJlYWRBZGxsVmFsdWUoR1RfVTMyIGRldk51bSwgR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyLCBHVF9VMzIgbWFzaykKIHsKICAgICBHVF9VMzIgIGRhdGFWYWx1ZTsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwLCBidXNJZCA9IDA7Ci0gICAgR1RfVTMyIGRldk51bSA9IDA7CisgICAgR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKwogICAgIC8qIG11bHRpIENTIHN1cHBvcnQgLSByZWdBZGRyIGlzIGNhbHVjYWxhdGVkIGluIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBDUyBvZmZzZXQgKi8KICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkgICAgZm9yKGJ1c0lkID0gMCA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgYnVzSWQrKykKKwkgICAgZm9yKGJ1c0lkID0gMCA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSWQrKykKIAkgICAgewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgIEREUl9QSFlfREFUQSwgIHJlZ0FkZHIsICZkYXRhVmFsdWUpKTsKLSAgICAgICAgICAgICAgICBQdXBWYWx1ZXNbaW50ZXJmYWNlSWQqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlICsgYnVzSWRdID0gZGF0YVZhbHVlICYgbWFzazsKKyAgICAgICAgICAgICAgICBQdXBWYWx1ZXNbaW50ZXJmYWNlSWQqb2N0ZXRzUGVySW50ZXJmYWNlTnVtICsgYnVzSWRdID0gZGF0YVZhbHVlICYgbWFzazsKICAgICAgICAgfQogCX0KIApAQCAtNzA4LDIwICs3MzgsNzEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogV3JpdGUgQURMTCBWYWx1ZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR1RfQk9PTCB3cml0ZUFkbGxWYWx1ZShHVF9VMzIgUHVwVmFsdWVzW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSwgaW50IHJlZ0FkZHIpCitHVF9CT09MIG12SHdzRGRyM1RpcFdyaXRlQWRsbFZhbHVlKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBpbnQgcmVnQWRkcikKIHsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwLCBidXNJZCA9IDA7Ci0gICAgR1RfVTMyIGRldk51bSA9IDAsIGRhdGE7CisgICAgR1RfVTMyIGRhdGE7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIC8qIG11bHRpIENTIHN1cHBvcnQgLSByZWdBZGRyIGlzIGNhbHVjYWxhdGVkIGluIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBDUyBvZmZzZXQgKi8KIAogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCSAgICBmb3IoYnVzSWQgPSAwIDsgYnVzSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBidXNJZCsrKQorCSAgICBmb3IoYnVzSWQgPSAwIDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJZCsrKQogCSAgICB7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQotCQlkYXRhID0gUHVwVmFsdWVzW2ludGVyZmFjZUlkKnRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZStidXNJZF07CisJCWRhdGEgPSBQdXBWYWx1ZXNbaW50ZXJmYWNlSWQqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK2J1c0lkXTsKKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgcmVnQWRkciwgZGF0YSkpOworCSAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitSZWFkIFBoYXNlIFZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9CT09MIHJlYWRQaGFzZVZhbHVlKEdUX1UzMiBkZXZOdW0sR1RfVTMyIFB1cFZhbHVlc1tNQVhfSU5URVJGQUNFX05VTSpNQVhfQlVTX05VTV0sIGludCByZWdBZGRyLCBHVF9VMzIgbWFzaykKK3sKKyAgICBHVF9VMzIgIGRhdGFWYWx1ZTsKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwLCBidXNJZCA9IDA7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKworICAgIC8qIG11bHRpIENTIHN1cHBvcnQgLSByZWdBZGRyIGlzIGNhbHVjYWxhdGVkIGluIGNhbGxpbmcgZnVuY3Rpb24gd2l0aCBDUyBvZmZzZXQgKi8KKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkgICAgZm9yKGJ1c0lkID0gMCA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSWQrKykKKwkgICAgeworCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKKyAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgIEREUl9QSFlfREFUQSwgIHJlZ0FkZHIsICZkYXRhVmFsdWUpKTsKKyAgICAgICAgICAgICAgICBQdXBWYWx1ZXNbaW50ZXJmYWNlSWQqb2N0ZXRzUGVySW50ZXJmYWNlTnVtICsgYnVzSWRdID0gZGF0YVZhbHVlICYgbWFzazsKKyAgICAgICAgfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dyaXRlIExldmVsaW5nIFZhbHVlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9CT09MIHdyaXRlTGV2ZWxpbmdWYWx1ZShHVF9VMzIgZGV2TnVtLEdUX1UzMiBQdXBWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLCBHVF9VMzIgUHVwUGhWYWx1ZXNbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dLGludCByZWdBZGRyKQoreworICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIGJ1c0lkID0gMDsKKyAgICBHVF9VMzIgZGF0YTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgLyogbXVsdGkgQ1Mgc3VwcG9ydCAtIHJlZ0FkZHIgaXMgY2FsdWNhbGF0ZWQgaW4gY2FsbGluZyBmdW5jdGlvbiB3aXRoIENTIG9mZnNldCAqLworCisgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisJICAgIGZvcihidXNJZCA9IDAgOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IGJ1c0lkKyspCisJICAgIHsKKwkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCisJCWRhdGEgPSBQdXBWYWx1ZXNbaW50ZXJmYWNlSWQqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK2J1c0lkXSArIChQdXBQaFZhbHVlc1tpbnRlcmZhY2VJZCpvY3RldHNQZXJJbnRlcmZhY2VOdW0rYnVzSWRdKTsKIAkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgcmVnQWRkciwgZGF0YSkpOwogCSAgICB9CiAKQEAgLTc0MCw4ICs4MjEsMTMgQEAKIGV4dGVybiBHVF9VOCAgaXNEZnNJbkluaXQ7CiBleHRlcm4gR1RfMzIgd2xEZWJ1Z0RlbGF5OwogZXh0ZXJuIEdUX1UzMiBzaWxpY29uRGVsYXlbSFdTX01BWF9ERVZJQ0VfTlVNXTsKLWV4dGVybiBHVF9VMzIgUGZpbmdlcjsKLWV4dGVybiBHVF9VMzIgTmZpbmdlcjsKK2V4dGVybiAJR1RfVTMyIHZyZWZJbml0aWFsVmFsdWU7CitleHRlcm4gCUdUX1UzMiBnWnByaURhdGE7CitleHRlcm4gCUdUX1UzMiBnWm5yaURhdGE7CitleHRlcm4gCUdUX1UzMiBnWnByaUN0cmw7CitleHRlcm4gCUdUX1UzMiBnWm5yaUN0cmw7CitleHRlcm4gCUdUX1UzMiBnWnBvZHREYXRhOworZXh0ZXJuIAlHVF9VMzIgZ1pub2R0RGF0YTsKIGV4dGVybiBHVF9VMzIgZnJlcVZhbFtERFJfRlJFUV9MSU1JVF07CiBleHRlcm4gR1RfVTMyIHN0YXJ0UGF0dGVybiwgZW5kUGF0dGVybjsKIGV4dGVybiBHVF9VMzIgIFBoeVJlZzBWYWw7CkBAIC03NTAsMTEgKzgzNiw2IEBACiBleHRlcm4gR1RfVTMyICBQaHlSZWczVmFsOwogZXh0ZXJuIE1WX0hXU19QQVRURVJOIHN3ZWVwUGF0dGVybjsKIGV4dGVybiBNVl9IV1NfUEFUVEVSTiBwYnNQYXR0ZXJuOwotZXh0ZXJuIEdUX1U4IGlzUnpxNjsKLWV4dGVybiBHVF9VMzIgem5yaURhdGFQaHlWYWw7Ci1leHRlcm4gR1RfVTMyIHpwcmlEYXRhUGh5VmFsOwotZXh0ZXJuIEdUX1UzMiB6bnJpQ3RybFBoeVZhbDsKLWV4dGVybiBHVF9VMzIgenByaUN0cmxQaHlWYWw7CiBleHRlcm4gR1RfVTggIGRlYnVnVHJhaW5pbmdBY2Nlc3M7CiBleHRlcm4gR1RfVTMyIGZpbmdlclRlc3QsIHBGaW5nZXJTdGFydCwgIHBGaW5nZXJFbmQsICBuRmluZ2VyU3RhcnQsIG5GaW5nZXJFbmQsIHBGaW5nZXJTdGVwLCBuRmluZ2VyU3RlcDsKIGV4dGVybiBHVF9VMzIgbW9kZTJUOwpAQCAtNzcwLDIyICs4NTEsMTYgQEAKIGV4dGVybiBHVF9VMzIgc3RhcnRQYXR0ZXJuLCBlbmRQYXR0ZXJuOwogCiAvKkRlY2xhcmF0aW9ucyovCi1HVF9VMzIgcmxWZXJzaW9uID0gMTsgLyogMCAtIG9sZCBSTCBtYWNoaW5lICovCiBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCIGNvbmZpZ0Z1bmNJbmZvW0hXU19NQVhfREVWSUNFX05VTV07CiBHVF9VMzIgIHN0YXJ0WHNiT2Zmc2V0ID0gMDsKIEdUX1U4IGlzUmxPbGQgPSAwOwogR1RfVTggaXNGcmVxT2xkID0gMDsKIEdUX1U4IGlzRGZzRGlzYWJsZWQgPSAwOwogR1RfVTMyIGRlZmF1bHRDZW50cmxpemF0aW9uVmFsdWUgPSAweDEyOwotR1RfVTMyIHZyZWYgPSAweDQ7CiBHVF9VMzIgYWN0aXZhdGVTZWxlY3RCZWZvcmVSdW5BbGc9IDEsIGFjdGl2YXRlRGVzZWxlY3RBZnRlclJ1bkFsZyA9IDEsIHJsVGVzdCA9IDAsIHJlc2V0UmVhZEZpZm8gPSAwOwogR1RfQk9PTCBkZWJ1Z0FjYyA9IEdUX0ZBTFNFOwogR1RfVTMyIGN0cmxTd2VlcHJlc1tBRExMX0xFTkdUSF1bTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXTsKIEdUX1UzMiBjdHJsQURMTFtNQVhfQ1NfTlVNKk1BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXTsKLUdUX1U4IGNzTWFza1JlZ1tdPQotewotICAgIDAsIDQsIDgsIDEyICwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKIEdUX1UzMiB4c2JUZXN0VGFibGVbXVs4XSA9CiB7CiAgICAgezB4MDAwMDAwMDAsICAgICAgICAgMHgxMTExMTExMSwgICAgICAgICAweDIyMjIyMjIyLCAgICAgICAgIDB4MzMzMzMzMzMsICAgICAgICAgMHg0NDQ0NDQ0NCwgICAgICAgICAweDU1NTU1NTU1LCAgICAgICAgIDB4NjY2NjY2NjYsICAgICAgICAgMHg3Nzc3Nzc3N30sCkBAIC04MTEsMTEgKzg4NiwxMiBAQAogR1RfU1RBVFVTICAgIGRkcjNUaXBQcmludEFkbGwoKQogewogICAgIEdUX1UzMiAgYnVzQ250ID0gMCwgIGludGVyZmFjZUlkLCAgZGF0YVAxLCBkYXRhUDIsIHVpRGF0YTMsIGRldk51bSA9IDA7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKyAgICAgICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgICAgIHsKICAgICAgICAgCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsICBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNDbnQsIEREUl9QSFlfREFUQSwgMHgxLCAmZGF0YVAxKSk7CkBAIC05MDQsMjcgKzk4MCwyMyBAQAogICAgIGNhc2UgMDoKICAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrKTsKICAgICAgICAgYnJlYWs7Ci0JCQkgCisKICAgICBjYXNlIDB4MToKICAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmbWFza1R1bmVGdW5jOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgyOgotCSAgICAqcHRyID0gKEdUX1UzMiopICZsb3dGcmVxOworICAgICAgICBsb3dGcmVxID0gKE1WX0hXU19ERFJfRlJFUSl2YWx1ZTsKIAkgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MzoKLQkgICAgKnB0ciA9IChHVF9VMzIqKSAmbWVkaXVtRnJlcTsKKyAgICAgICAgbWVkaXVtRnJlcSA9IChNVl9IV1NfRERSX0ZSRVEpdmFsdWU7CiAJICAgIGJyZWFrOwotCQkJIAorCiAgICAgY2FzZSAweDQ6CiAgICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmdlbmVyaWNJbml0Q29udHJvbGxlcjsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDB4NToKLSAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmcmxWZXJzaW9uOwotICAgICAgICBicmVhazsKLQogICAgIGNhc2UgMHg4OgogICAgICAgICAqcHRyID0gKEdUX1UzMiopICZzdGFydFhzYk9mZnNldDsKICAgICAgICAgYnJlYWs7CkBAIC05ODAsMTcgKzEwNTIsMTYgQEAKICAgIGNhc2UgMHgzMjoKICAgICAgICAqcHRyID0gKEdUX1UzMiopICZpc0Rmc0luSW5pdDsKICAgICAgICBicmVhazsKLQogICAgY2FzZSAweDMzOgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJlBmaW5nZXI7CisgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmZ1pub2R0RGF0YTsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDM0OgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJk5maW5nZXI7CisgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmZ1pwb2R0RGF0YTsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDM1OgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmluaXRGcmVxOworICAgICAgIGluaXRGcmVxID0gKE1WX0hXU19ERFJfRlJFUSl2YWx1ZTsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDM2OgpAQCAtMTAyMSwyNSArMTA5MiwyMCBAQAogICAgICAgICpwdHIgPSAoR1RfVTMyKikgJlBoeVJlZzNWYWw7CiAgICAgICAgYnJlYWs7CiAKLQogICAgY2FzZSAweDRlOgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnN3ZWVwUGF0dGVybjsKKyAgICAgICBzd2VlcFBhdHRlcm4gPSAoTVZfSFdTX1BBVFRFUk4pdmFsdWU7CiAgICAgICAgYnJlYWs7CiAvKgogICAgY2FzZSAweDRmOgogICAgICAgICpwdHIgPSAoR1RfVTMyKikgJihwaHkxVmFsVGFibGVbRERSX0ZSRVFfTE9XX0ZSRVFdKTsKICAgICAgICBicmVhazsKICovCi0gICBjYXNlIDB4NTA6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmaXNSenE2OwotICAgICAgIGJyZWFrOwotCiAgICBjYXNlIDB4NTE6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmem5yaURhdGFQaHlWYWw7CisgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmZ1pucmlEYXRhOwogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4NTI6Ci0gICAgICAgKnB0ciA9IChHVF9VMzIqKSAmenByaURhdGFQaHlWYWw7CisgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmZ1pwcmlEYXRhOwogICAgICAgIGJyZWFrOwogCiAgICBjYXNlIDB4NTM6CkBAIC0xMDcxLDE5ICsxMTM3LDE4IEBACiAgICAgICAgYnJlYWs7CiAKICAgIGNhc2UgMHg1QToKLSAgICAgICAqcHRyID0gKEdUX1UzMiopICZ6bnJpQ3RybFBoeVZhbDsKKyAgICAgICAqcHRyID0gKEdUX1UzMiopICZnWm5yaUN0cmw7CiAgICAgICAgYnJlYWs7CiAKICAgIGNhc2UgMHg1QjoKLSAgICAgICAqcHRyID0gKEdUX1UzMiopICZ6cHJpQ3RybFBoeVZhbDsKKyAgICAgICAqcHRyID0gKEdUX1UzMiopICZnWnByaUN0cmw7CiAgICAgICAgYnJlYWs7Ci0KICAgIGNhc2UgMHg1QzoKICAgICAgICAqcHRyID0gKEdUX1UzMiopICZpc1JlZ0R1bXA7CiAgICAgICAgYnJlYWs7CiAKICAgIGNhc2UgMHg1RDoKLSAgICAgICAqcHRyID0gKEdUX1UzMiopICZ2cmVmOworICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnZyZWZJbml0aWFsVmFsdWU7CiAgICAgICAgYnJlYWs7CiAKICAgIGNhc2UgMHg1RToKQEAgLTExMTUsMjEgKzExODAsMTcgQEAKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDcxOgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJnBic1BhdHRlcm47CisgICAgICAgcGJzUGF0dGVybiA9IChNVl9IV1NfUEFUVEVSTil2YWx1ZTsKICAgICAgICBicmVhazsKIAogICAgY2FzZSAweDcyOgogICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmRlbGF5RW5hYmxlOwogICAgICAgIGJyZWFrOwotCSAgIAorCiAgICBjYXNlIDB4NzM6CiAgICAgICAgKnB0ciA9IChHVF9VMzIqKSAmY2tEZWxheTsKICAgICAgICBicmVhazsKIAotICAgY2FzZSAweDc0OgotICAgICAgICpwdHIgPSAoR1RfVTMyKikgJmNrRGVsYXlfMTY7Ci0gICAgICAgYnJlYWs7Ci0KICAgIGNhc2UgMHg3NToKICAgICAgICAqcHRyID0gKEdUX1UzMiopICZjYURlbGF5OwogICAgICAgIGJyZWFrOwpAQCAtMTI2OSwyOSArMTMzMCw1MCBAQAogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotCQkJREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiZmxhZ0lkIG91dCBvZiBib3VuZGFyeSAlZCBcbiIsZmxhZ0lkKSk7IAkJCQkKKwkJCURFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoImZsYWdJZCBvdXQgb2YgYm91bmRhcnkgJWQgXG4iLGZsYWdJZCkpOwogICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gR1RfT0s7IAorICAgIHJldHVybiBHVF9PSzsKICB9Ci0KLSNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcKKyNlbmRpZiAvKiAjaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHICovCisjaWZkZWYgRERSX1ZJRVdFUl9UT09MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFByaW50IEFETEwKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEdUX1NUQVRVUyBwcmludEFkbGwoR1RfVTMyIGRldk51bSwgR1RfVTMyIGFkbGxbTUFYX0lOVEVSRkFDRV9OVU0qTUFYX0JVU19OVU1dKQogewogICAgIEdUX1UzMiBpLGo7CisgICAgR1RfVTMyIG9jdGV0c1BlckludGVyZmFjZU51bTsKIAotCWRldk51bSA9IGRldk51bTsKKyAgICBkZXZOdW0gPSBkZXZOdW07CisgICAgb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCi0gICAgZm9yKGo9MDsgajwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBqKyspCisgICAgZm9yKGo9MDsgajwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBqKyspCiAgICAgewotICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBqKQorICAgICAgICBWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBqKQogICAgICAgICBmb3IoaT0wO2k8TUFYX0lOVEVSRkFDRV9OVU07IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgbXZQcmludGYoIiVkICwiLGFkbGxbaSp0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2Ural0pOworICAgICAgICAgICAgbXZQcmludGYoIiVkICwiLGFkbGxbaSpvY3RldHNQZXJJbnRlcmZhY2VOdW0ral0pOworICAgICAgICB9CisgICAgfQorICAgIG12UHJpbnRmKCJcbiIpOworICAgIHJldHVybiBHVF9PSzsKK30KK0dUX1NUQVRVUyBwcmludFBoKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBhZGxsW01BWF9JTlRFUkZBQ0VfTlVNKk1BWF9CVVNfTlVNXSkKK3sKKyAgICBHVF9VMzIgaSxqOworICAgIEdUX1UzMiBvY3RldHNQZXJJbnRlcmZhY2VOdW07CisKKyAgICBkZXZOdW0gPSBkZXZOdW07CisgICAgb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgZm9yKGo9MDsgajwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBqKyspCisgICAgeworICAgICAgICBWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBqKQorICAgICAgICBmb3IoaT0wO2k8TUFYX0lOVEVSRkFDRV9OVU07IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgbXZQcmludGYoIiVkICwiLGFkbGxbaSpvY3RldHNQZXJJbnRlcmZhY2VOdW0ral0+PjYpOwogICAgICAgICB9CiAgICAgfQogICAgIG12UHJpbnRmKCJcbiIpOwpAQCAtMTI5OSw4ICsxMzgxLDkgQEAKIH0KICNlbmRpZgogCisjaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHCiAvKiB1aUJ5dGVJbmRleCAtIG9ubHkgYnl0ZSAwLDEsMiwgb3IgMywgb3hmZiAtIHRlc3QgYWxsIGJ5dGVzICovCi1zdGF0aWMgCitzdGF0aWMKIEdUX1UzMiBkZHIzVGlwQ29tcGFyZShHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiAqcFNyYywgR1RfVTMyICpwRHN0LCBHVF9VMzIgdWlCeXRlSW5kZXgpCiB7CiAgICBHVF9VMzIgYnVyc3RDbnQgPSAwLCBhZGRyT2Zmc2V0LGlJZDsKQEAgLTEzMDksNyArMTM5Miw3IEBACiAgICBhZGRyT2Zmc2V0ID0gKHVpQnl0ZUluZGV4ID09IDB4ZmYpID8gKEdUX1UzMikgMHhmZmZmZmZmZjogKEdUX1UzMikgKDB4ZmYgPDwgKHVpQnl0ZUluZGV4KjgpKTsKICAgIGZvcihidXJzdENudCA9IDA7IGJ1cnN0Q250IDwgRVhUX0FDQ0VTU19CVVJTVF9MRU5HVEg7IGJ1cnN0Q250KyspCiAgICB7Ci0gICAgICBpZiAoKHBTcmNbYnVyc3RDbnRdICYgYWRkck9mZnNldCkgIT0gKHBEc3RbYnVyc3RDbnRdICYgYWRkck9mZnNldCkpIAorICAgICAgaWYgKChwU3JjW2J1cnN0Q250XSAmIGFkZHJPZmZzZXQpICE9IChwRHN0W2ludGVyZmFjZUlkXSAmIGFkZHJPZmZzZXQpKQogICAgICAgewogICAgICAgICAgIGJJc0ZhaWwgPSBHVF9UUlVFOwogICAgICAgfQpAQCAtMTMzMiw4OSArMTQxNSwzMSBAQAogCiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdWlUZXN0VHlwZSA9IDAtdHggLCAxIC0gcnggKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwU3dlZXBUZXN0KEdUX1UzMiAgIGRldk51bSwgR1RfVTMyIHVpVGVzdFR5cGUsIEdUX1UzMiB1aU1lbUFkZHJlc3MsIEdUX1UzMiBpc01vZGlmeUFkbGwsIEdUX1UzMiBzdGFydElmLCBHVF9VMzIgZW5kSWYsIEdUX1UzMiBzdGFydHB1cCwgR1RfVTMyIGVuZHB1cCkKLXsKLSAgICBHVF9VMzIgICAgYnVzQ250ID0gMCwgYWRsbFZhbCA9IDAsIGludGVyZmFjZUlkLCB1aVByZXZBZGxsLCB1aU1hc2tCaXQsIGVuZF9hZGxsLCBzdGFydF9hZGxsOwotICAgIEdUX1UzMiByZWdBZGRyID0gMCwgaXRlciA9IDA7Ci0KLQl1aU1lbUFkZHJlc3MgPSB1aU1lbUFkZHJlc3M7Ci0KLSAgICBpZiAodWlUZXN0VHlwZSA9PSAwKQotICAgIHsKLSAgICAgICAgcmVnQWRkciA9IDE7Ci0gICAgICAgIHVpTWFza0JpdCA9IDB4M2Y7Ci0gICAgICAgIHN0YXJ0X2FkbGwgPSAwOwotICAgICAgICBlbmRfYWRsbCA9IHVpTWFza0JpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmVnQWRkciA9IDM7Ci0gICAgICAgIHVpTWFza0JpdCA9IDB4MWY7Ci0gICAgICAgIHN0YXJ0X2FkbGwgPSAwOwotICAgICAgICBlbmRfYWRsbCA9IHVpTWFza0JpdDsKLSAgICB9Ci0gICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpKTsKLSAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoIlRlc3QgdHlwZSAlZCAoMC10eCwgMS1yeCkgXG4iLHVpVGVzdFR5cGUpKTsKLSAgICAKLSAgICBmb3IoaW50ZXJmYWNlSWQgPSBzdGFydElmOyBpbnRlcmZhY2VJZCA8PSBlbmRJZjsgaW50ZXJmYWNlSWQrKykKLSAgICB7Ci0gICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgIGZvcihidXNDbnQgPSBzdGFydHB1cDsgYnVzQ250IDwgZW5kcHVwOyBidXNDbnQrKykKLSAgICAgICAgewotICAgICAgCi0gICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggICBkZXZOdW0sIGludGVyZmFjZUlkLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzQ250LCBERFJfUEhZX0RBVEEsIHJlZ0FkZHIsICZ1aVByZXZBZGxsKSk7Ci0KLSAgICAgICAgICAgIGZvcihhZGxsVmFsID0gc3RhcnRfYWRsbDsgYWRsbFZhbCA8PSBlbmRfYWRsbDsgYWRsbFZhbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpc01vZGlmeUFkbGwgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICBidXNDbnQsIEREUl9QSFlfREFUQSwgcmVnQWRkciwgYWRsbFZhbCwgdWlNYXNrQml0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcihpdGVyID0gMDsgaXRlciA8PSBkZWJ1Z1N3ZWVwVmFsOyBpdGVyKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKlhzYlJXVGVzdChkZXZOdW0sIGludGVyZmFjZUlkLCB1aU1lbUFkZHJlc3MsIHRlc3RQYXR0ZXJuLCBidXNDbnQsIDApOwotCQkJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEV4dFdyaXRlKGRldk51bSwgaW50ZXJmYWNlSWQsIHVpTWVtQWRkcmVzcywgMSwgeHNiVGVzdFRhYmxlW3NlcV0pKTsKLQkJCQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBFeHRSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgdWlNZW1BZGRyZXNzLCAxLCBkYXRhUmVhZCkpOwotCQkJCQlyZXRUbXAgPSBkZHIzVGlwQ29tcGFyZShpbnRlcmZhY2VJZCwgeHNiVGVzdFRhYmxlW3NlcV0sIGRhdGFSZWFkLCAweGZmKTsqLwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChpc01vZGlmeUFkbGwgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIEFDQ0VTU19UWVBFX1VOSUNBU1QsICBidXNDbnQsIEREUl9QSFlfREFUQSwgcmVnQWRkciwgIHVpUHJldkFkbGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgiXG4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJcbiIpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gR1RfT0s7Ci19Ci0KLSNpZm5kZWYgRVhDTFVERV9TV0lUQ0hfREVCVUcKKyNlbmRpZiAvKiBFWENMVURFX1NXSVRDSF9ERUJVRyovCisjaWYgZGVmaW5lZChERFJfVklFV0VSX1RPT0wpCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFN3ZWVwIHZhbGlkYXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEdUX0JPT0wgZGRyM1RpcFJ1blN3ZWVwVGVzdChHVF8zMiBkZXZOdW0sIEdUX1UzMiBSZXBlYXROdW0sIEdUX1UzMiBkaXJlY3Rpb24sIEdUX1UzMiBtb2RlKQogewogICAgIEdUX1UzMiAgcHVwID0gMCwgc3RhcnRQdXAgPSAwLCBlbmRQdXAgPSAwOwotICAgIEdUX1UzMiBhZGxsID0gMDsKKyAgICBHVF9VMzIgYWRsbCA9IDAscmVwID0gMCxzd2VlcFBhdHRlcm5JbmRleCA9IDA7CiAgICAgR1RfVTMyIHJlc1tNQVhfSU5URVJGQUNFX05VTV0gPSB7MH07CiAgICAgR1RfMzIgIGludGVyZmFjZUlkID0gMDsKICAgICBHVF9VMzIgYWRsbFZhbHVlID0gMDsKICAgICBHVF8zMiByZWcgPSAoZGlyZWN0aW9uID09IDApID8gV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyA6IFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRzsKICAgICBNVl9IV1NfQUNDRVNTX1RZUEUgIHB1cEFjY2VzczsKICAgICBHVF9VMzIgdWlDczsKLSAgICBHVF9VMzIgbWF4Q3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgpOworICAgIEdUX1UzMiBtYXhDcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KGRldk51bSk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgUmVwZWF0TnVtID0gUmVwZWF0TnVtOwotCisJUmVwZWF0TnVtID0gMjsKICAgICBpZiAoIG1vZGUgPT0gMSkKICAgICB7CiAgICAgICAgIC8qIHBlciBwdXAgKi8KICAgICAgICAgc3RhcnRQdXAgPSAwOwotICAgICAgICBlbmRQdXAgPSB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UtMTsKKyAgICAgICAgZW5kUHVwID0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtLTE7CiAgICAgICAgIHB1cEFjY2VzcyA9IEFDQ0VTU19UWVBFX1VOSUNBU1Q7CiAgICAgfQogICAgIGVsc2UKQEAgLTE0MjksNyArMTQ1NCw3IEBACiAJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCXsKIAkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgCQkJZm9yKCBwdXAgPSBzdGFydFB1cCA7cHVwIDw9IGVuZFB1cCA7IHB1cCsrKQorCQkJZm9yKCBwdXAgPSBzdGFydFB1cCA7cHVwIDw9IGVuZFB1cCA7IHB1cCsrKQogCQkJewogCQkJCWN0cmxTd2VlcHJlc1thZGxsXVtpbnRlcmZhY2VJZF1bcHVwXSA9IDA7CiAJCQl9CkBAIC0xNDQxLDI0ICsxNDY2LDMwIEBACiAJCWN0cmxBRExMW2FkbGxdID0gMDsKIAl9CiAJLypTYXZlIERRUyB2YWx1ZShhZnRlciBhbGdvcml0aG0gcnVuKSovCi0JcmVhZEFkbGxWYWx1ZShjdHJsQURMTCwgKHJlZyArICh1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKSAsIE1BU0tfQUxMX0JJVFMgKTsKKwltdkh3c0RkcjNUaXBSZWFkQWRsbFZhbHVlKGRldk51bSxjdHJsQURMTCwgKHJlZyArICh1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKSAsIE1BU0tfQUxMX0JJVFMgKTsKIAogCS8qU3dlZXAgQURMTCAgZnJvbSAwOjMxIG9uIGFsbCBJL0Ygb24gYWxsIFB1cCBhbmQgcGVyZm9ybSBCSVNUIG9uIGVhY2ggc3RhZ2UuKi8KIAlmb3IocHVwPXN0YXJ0UHVwOyBwdXAgPD1lbmRQdXA7IHB1cCsrKQogCXsKIAkJZm9yKGFkbGwgPSAwIDsgYWRsbCA8IEFETExfTEVOR1RIIDsgYWRsbCsrKQogCQl7Ci0JCQlhZGxsVmFsdWUgPSAoZGlyZWN0aW9uID09IDApID8gKGFkbGwqMik6YWRsbDsKLQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBwdXBBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCByZWcgKyBDU19SRUdfVkFMVUUodWlDcyksIGFkbGxWYWx1ZSkpOwotCQkJbXZId3NEZHIzUnVuQmlzdChkZXZOdW0sIHN3ZWVwUGF0dGVybiwgcmVzICx1aUNzKTsKLQkJCS8qZGRyM1RpcFJlc2V0Rmlmb1B0cihkZXZOdW0pOyovCi0JCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCQkJZm9yKHJlcCA9IDA7IHJlcCA8IFJlcGVhdE51bSA7IHJlcCsrKQogCQkJewotCQkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JCQkJY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdID0gcmVzW2ludGVyZmFjZUlkXTsKLQkJCQlpZiAobW9kZSA9PSAxKQorCQkJCWZvcihzd2VlcFBhdHRlcm5JbmRleCA9IHN3ZWVwUGF0dGVybkluZGV4U3RhcnQgOyBzd2VlcFBhdHRlcm5JbmRleCA8IHN3ZWVwUGF0dGVybkluZGV4RW5kIDsgc3dlZXBQYXR0ZXJuSW5kZXgrKykKIAkJCQl7Ci0JCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCByZWcgKyBDU19SRUdfVkFMVUUodWlDcyksICBjdHJsQURMTFtpbnRlcmZhY2VJZCp1aUNzKnRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZStwdXBdKSk7CisJCQkJCWFkbGxWYWx1ZSA9IChkaXJlY3Rpb24gPT0gMCkgPyAoYWRsbCoyKTphZGxsOworCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgcHVwQWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgcmVnICsgQ1NfQllURV9HQVAodWlDcyksIGFkbGxWYWx1ZSkpOworCQkJCQltdkh3c0RkcjNSdW5CaXN0KGRldk51bSwgc3dlZXBQYXR0ZXJuLCByZXMgLHVpQ3MpOworCQkJCQkvKmRkcjNUaXBSZXNldEZpZm9QdHIoZGV2TnVtKTsqLworCQkJCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCQkJCQl7CisJCQkJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJCQkJY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdICs9IHJlc1tpbnRlcmZhY2VJZF07CisJCQkJCQlpZiAobW9kZSA9PSAxKQorCQkJCQkJeworCQkJCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCByZWcgKyBDU19CWVRFX0dBUCh1aUNzKSwgIGN0cmxBRExMW2ludGVyZmFjZUlkKnVpQ3Mqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK3B1cF0pKTsKKwkJCQkJCX0KKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTQ5MCwxNSArMTUyMSwxNSBAQAogCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKIAkJCWZvciggcHVwPXN0YXJ0UHVwOyBwdXAgPD1lbmRQdXA7IHB1cCsrKQogCQkJewotCQkJCW12UHJpbnRmKCIlZCAsICIsY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdKTsKKwkJCQltdlByaW50ZigiJThkICwgIixjdHJsU3dlZXByZXNbYWRsbF1baW50ZXJmYWNlSWRdW3B1cF0pOwogCQkJfQogCQl9CiAJCW12UHJpbnRmKCJcbiIpOwogCX0KIAkvKldyaXRlIGJhY2sgdG8gdGhlIHBoeSB0aGUgUnggRFFTIHZhbHVlLCB3ZSBzdG9yZSBpbiB0aGUgYmVnZ2luZy4gKi8KLQl3cml0ZUFkbGxWYWx1ZShjdHJsQURMTCwgKHJlZyArICB1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKTsKKwltdkh3c0RkcjNUaXBXcml0ZUFkbGxWYWx1ZShkZXZOdW0sY3RybEFETEwsIChyZWcgKyAgdWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSk7CiAJLyogcHJpbnQgYWRsbCByZXN1bHRzICovCi0JcmVhZEFkbGxWYWx1ZShjdHJsQURMTCwgKHJlZyArIHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCksIE1BU0tfQUxMX0JJVFMpOworCW12SHdzRGRyM1RpcFJlYWRBZGxsVmFsdWUoZGV2TnVtLGN0cmxBRExMLCAocmVnICsgdWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSwgTUFTS19BTExfQklUUyk7CiAJbXZQcmludGYoIiVzLERRUyxBRExMLCwsIiwoZGlyZWN0aW9uPT0wKSA/ICJUeCI6IlJ4Iik7CiAJcHJpbnRBZGxsKGRldk51bSwgY3RybEFETEwpOwogICAgIH0KQEAgLTE1MDYsMTMgKzE1MzcsMTg1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZiBkZWZpbmVkKEVYQ0xVREVfU1dJVENIX0RFQlVHKQorR1RfQk9PTCBkZHIzVGlwUnVuTGV2ZWxpbmdTd2VlcFRlc3QoR1RfMzIgZGV2TnVtLCBHVF9VMzIgUmVwZWF0TnVtLCBHVF9VMzIgZGlyZWN0aW9uLCBHVF9VMzIgbW9kZSkKK3sKKyAgICBHVF9VMzIgIHB1cCA9IDAsIHN0YXJ0UHVwID0gMCwgZW5kUHVwID0gMCwgc3RhcnRBZGxsID0gMDsKKyAgICBHVF9VMzIgYWRsbCA9IDAscmVwID0gMCxzd2VlcFBhdHRlcm5JbmRleCA9IDA7CisJR1RfVTMyICByZWFkRGF0YVtNQVhfSU5URVJGQUNFX05VTV07CisgICAgR1RfVTMyIHJlc1tNQVhfSU5URVJGQUNFX05VTV0gPSB7MH07CisgICAgR1RfMzIgIGludGVyZmFjZUlkID0gMCxnYXAgPSAwOworICAgIEdUXzMyIGFkbGxWYWx1ZSA9IDA7CisgICAgR1RfMzIgcmVnID0gKGRpcmVjdGlvbiA9PSAwKSA/IFdMX1BIWV9SRUcgOiBSTF9QSFlfUkVHOworICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgcHVwQWNjZXNzOworICAgIEdUX1UzMiB1aUNzOworICAgIEdUX1UzMiBtYXhDcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KGRldk51bSk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworICAgIFJlcGVhdE51bSA9IFJlcGVhdE51bTsKKwlSZXBlYXROdW0gPSAzOworICAgIGlmICggbW9kZSA9PSAxKQorICAgIHsKKyAgICAgICAgLyogcGVyIHB1cCAqLworICAgICAgICBzdGFydFB1cCA9IDA7CisgICAgICAgIGVuZFB1cCA9IG9jdGV0c1BlckludGVyZmFjZU51bS0xOworICAgICAgICBwdXBBY2Nlc3MgPSBBQ0NFU1NfVFlQRV9VTklDQVNUOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGFydFB1cCA9IDA7CisgICAgICAgIGVuZFB1cCA9IDA7CisgICAgICAgIHB1cEFjY2VzcyA9IEFDQ0VTU19UWVBFX01VTFRJQ0FTVDsKKyAgICB9CisgICAgZm9yKHVpQ3M9MDsgdWlDcyA8IG1heENzOyB1aUNzKyspeworCQlmb3IoYWRsbCA9IDAgOyBhZGxsIDwgQURMTF9MRU5HVEggOyBhZGxsKyspCisJCXsKKwkJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJCQl7CisJCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkJCQlmb3IoIHB1cCA9IHN0YXJ0UHVwIDtwdXAgPD0gZW5kUHVwIDsgcHVwKyspCisJCQkJeworCQkJCQljdHJsU3dlZXByZXNbYWRsbF1baW50ZXJmYWNlSWRdW3B1cF0gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvcihhZGxsID0gMCA7IGFkbGwgPCAoTUFYX0lOVEVSRkFDRV9OVU0gKiBNQVhfQlVTX05VTSkgOyBhZGxsKyspCisJCXsKKwkJCWN0cmxBRExMW2FkbGxdID0gMDsKKwkJCWN0cmxMZXZlbFBoYXNlW2FkbGxdID0gMDsKKwkJCWN0cmxBRExMMVthZGxsXSA9IDA7CisJCX0KKwkJLypTYXZlIExldmVsaW5nIHZhbHVlKGFmdGVyIGFsZ29yaXRobSBydW4pKi8KKwkJbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShkZXZOdW0sY3RybEFETEwsIChyZWcgKyAodWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSkgLCAweDFGICk7CisJCXJlYWRQaGFzZVZhbHVlKGRldk51bSxjdHJsTGV2ZWxQaGFzZSwgKHJlZyArICh1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKSAsIDB4Nzw8NiApOworCQlpZihkaXJlY3Rpb24gPT0gMCkKKwkJeworCQkJbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShkZXZOdW0sY3RybEFETEwxLCAoMHgxICsgKHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpICwgTUFTS19BTExfQklUUyApOworCQl9CisJCS8qU3dlZXAgQURMTCAgZnJvbSAwOjMxIG9uIGFsbCBJL0Ygb24gYWxsIFB1cCBhbmQgcGVyZm9ybSBCSVNUIG9uIGVhY2ggc3RhZ2UuKi8KKwkJZm9yKHB1cD1zdGFydFB1cDsgcHVwIDw9ZW5kUHVwOyBwdXArKykKKwkJeworCQkJZm9yKGFkbGwgPSAwIDsgYWRsbCA8IEFETExfTEVOR1RIIDsgYWRsbCsrKQorCQkJeworCQkJCWZvcihyZXAgPSAwOyByZXAgPCBSZXBlYXROdW0gOyByZXArKykKKwkJCQl7CisJCQkJCWFkbGxWYWx1ZSA9IChkaXJlY3Rpb24gPT0gMCkgPyAoYWRsbCoyKTooYWRsbCozKTsKKwkJCQkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKwkJCQkJeworCQkJCQkJc3RhcnRBZGxsID0gY3RybEFETExbaW50ZXJmYWNlSWQqdWlDcypvY3RldHNQZXJJbnRlcmZhY2VOdW0rcHVwXSArIChjdHJsTGV2ZWxQaGFzZVtpbnRlcmZhY2VJZCp1aUNzKm9jdGV0c1BlckludGVyZmFjZU51bStwdXBdPj42KSozMiA7CisJCQkJCQlpZihkaXJlY3Rpb24gPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlzdGFydEFkbGwgPSAoc3RhcnRBZGxsPjMyKT8oc3RhcnRBZGxsLTMyKTowOworCQkJCQkJfWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlzdGFydEFkbGwgPSAoc3RhcnRBZGxsPjQ4KT8oc3RhcnRBZGxsLTQ4KTowOworCQkJCQkJfQorCQkJCQkJaWYoZGlyZWN0aW9uID09IDApCisJCQkJCQl7CisJCQkJCQkJYWRsbFZhbHVlID0gc3RhcnRBZGxsICsgYWRsbFZhbHVlOworCQkJCQkJfWVsc2UKKwkJCQkJCXsKKwkJCQkJCQlhZGxsVmFsdWUgPSBzdGFydEFkbGwgKyBhZGxsVmFsdWU7CisJCQkJCQl9CisJCQkJCQlnYXAgPSBjdHJsQURMTDFbaW50ZXJmYWNlSWQqdWlDcypvY3RldHNQZXJJbnRlcmZhY2VOdW0rcHVwXSAtIGN0cmxBRExMW2ludGVyZmFjZUlkKnVpQ3Mqb2N0ZXRzUGVySW50ZXJmYWNlTnVtK3B1cF07CisJCQkJCQlnYXAgPSAoKChhZGxsVmFsdWUlMzIpICsgZ2FwKSU2NCk7CisJCQkJCQlhZGxsVmFsdWUgPSAoKGFkbGxWYWx1ZSUzMikgKyAoKChhZGxsVmFsdWUtIChhZGxsVmFsdWUlMzIpKS8zMik8PDYpKTsKKworCQkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgcHVwQWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgcmVnICsgQ1NfQllURV9HQVAodWlDcyksIGFkbGxWYWx1ZSkpOworCQkJCQkJaWYoZGlyZWN0aW9uID09IDApCisJCQkJCQl7CisJCQkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgcHVwQWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgMHgxICsgQ1NfQllURV9HQVAodWlDcyksIGdhcCkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWZvcihzd2VlcFBhdHRlcm5JbmRleCA9IHN3ZWVwUGF0dGVybkluZGV4U3RhcnQgOyBzd2VlcFBhdHRlcm5JbmRleCA8IHN3ZWVwUGF0dGVybkluZGV4RW5kIDsgc3dlZXBQYXR0ZXJuSW5kZXgrKykKKwkJCQkJeworCQkJCQkJbXZId3NEZHIzUnVuQmlzdChkZXZOdW0sIHN3ZWVwUGF0dGVybiwgcmVzICx1aUNzKTsKKwkJCQkJCWRkcjNUaXBSZXNldEZpZm9QdHIoZGV2TnVtKTsKKwkJCQkJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisJCQkJCQl7CisJCQkJCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkJCQkJCQlpZihwdXAgIT0gNCkKKwkJCQkJCQl7CisJCQkJCQkJCWN0cmxTd2VlcHJlc1thZGxsXVtpbnRlcmZhY2VJZF1bcHVwXSArPSByZXNbaW50ZXJmYWNlSWRdOworCQkJCQkJCX1lbHNlCisJCQkJCQkJeworCQkJCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTQ1OCwgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKKwkJCQkJCQkJY3RybFN3ZWVwcmVzW2FkbGxdW2ludGVyZmFjZUlkXVtwdXBdICs9IHJlYWREYXRhW2ludGVyZmFjZUlkXTsKKworCQkJCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE0NTgsIDB4MCAsIDB4RkZGRkZGRkYpKTsKKwkJCQkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgxNDVDLCAweDAgLCAweEZGRkZGRkZGKSk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKwkJCXsKKwkJCQlzdGFydEFkbGwgPSBjdHJsQURMTFtpbnRlcmZhY2VJZCp1aUNzKm9jdGV0c1BlckludGVyZmFjZU51bStwdXBdICsgY3RybExldmVsUGhhc2VbaW50ZXJmYWNlSWQqdWlDcypvY3RldHNQZXJJbnRlcmZhY2VOdW0rcHVwXSA7CisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgcHVwQWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgcmVnICsgQ1NfQllURV9HQVAodWlDcyksIHN0YXJ0QWRsbCkpOworCQkJCWlmKGRpcmVjdGlvbiA9PSAwKQorCQkJCXsKKwkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgcHVwQWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgMHgxICsgQ1NfQllURV9HQVAodWlDcyksIGN0cmxBRExMMVtpbnRlcmZhY2VJZCp1aUNzKm9jdGV0c1BlckludGVyZmFjZU51bStwdXBdKSk7CisJCQkJfQorCQkJfQorCQl9CisJCW12UHJpbnRmKCJGaW5hbCxDUyAlZCwlcyxMZXZlbGluZyxSZXN1bHQsQWRsbCwiLCB1aUNzLCgoZGlyZWN0aW9uPT0wKSA/ICJUWCI6IlJYIikpOworCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCQl7CisJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJaWYgKG1vZGUgPT0gMSkKKwkJCXsKKwkJCQlmb3IocHVwPXN0YXJ0UHVwOyBwdXAgPD1lbmRQdXA7IHB1cCsrKQorCQkJCXsKKwkJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQorCQkJCQltdlByaW50ZigiSS9GJWQtUEhZJWQgLCAiLGludGVyZmFjZUlkLHB1cCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCW12UHJpbnRmKCJJL0YlZCAsICIsaW50ZXJmYWNlSWQpOworCQkJfQorCQl9CisJCW12UHJpbnRmKCJcbiIpOworCQlmb3IoYWRsbCA9IDAgOyBhZGxsIDwgQURMTF9MRU5HVEggOyBhZGxsKyspCisJCXsKKwkJCWFkbGxWYWx1ZSA9IChkaXJlY3Rpb24gPT0gMCkgPyAoKGFkbGwqMiktMzIpOigoYWRsbCozKS00OCk7CisJCQltdlByaW50ZigiRmluYWwsJXMsTGV2ZWxpbmdTd2VlcCxSZXN1bHQsICVkICwiLCgoZGlyZWN0aW9uPT0wKSA/ICJUWCI6IlJYIiksYWRsbFZhbHVlKTsKKworCQkJZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKyl7CisJCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkJCQlmb3IoIHB1cD1zdGFydFB1cDsgcHVwIDw9ZW5kUHVwOyBwdXArKykKKwkJCQl7CisJCQkJCW12UHJpbnRmKCIlOGQgLCAiLGN0cmxTd2VlcHJlc1thZGxsXVtpbnRlcmZhY2VJZF1bcHVwXSk7CisJCQkJfQorCQkJfQorCQkJbXZQcmludGYoIlxuIik7CisJCX0KKwkJLypXcml0ZSBiYWNrIHRvIHRoZSBwaHkgdGhlIFJ4IERRUyB2YWx1ZSwgd2Ugc3RvcmUgaW4gdGhlIGJlZ2dpbmcuICovCisJCXdyaXRlTGV2ZWxpbmdWYWx1ZShkZXZOdW0sY3RybEFETEwsY3RybExldmVsUGhhc2UsIChyZWcgKyAgdWlDcyAqIENTX1JFR0lTVEVSX0FERFJfT0ZGU0VUKSk7CisJCWlmKGRpcmVjdGlvbiA9PSAwKQorCQl7CisJCQltdkh3c0RkcjNUaXBXcml0ZUFkbGxWYWx1ZShkZXZOdW0sY3RybEFETEwxLCAoMHgxICsgKHVpQ3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpKTsKKwkJfQorCQkvKiBwcmludCBhZGxsIHJlc3VsdHMgKi8KKwkJbXZId3NEZHIzVGlwUmVhZEFkbGxWYWx1ZShkZXZOdW0sY3RybEFETEwsIChyZWcgKyB1aUNzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpLCBNQVNLX0FMTF9CSVRTKTsKKwkJbXZQcmludGYoIiVzLERRUyxMZXZlbGluZywsLCIsKGRpcmVjdGlvbj09MCkgPyAiVHgiOiJSeCIpOworCQlwcmludEFkbGwoZGV2TnVtLCBjdHJsQURMTCk7CisJCXByaW50UGgoZGV2TnVtLCBjdHJsTGV2ZWxQaGFzZSk7CisJfS8qRW5kIG9mIENTKi8KKworICAgIGRkcjNUaXBSZXNldEZpZm9QdHIoZGV2TnVtKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCiAKIHZvaWQgcHJpbnRUb3BvbG9neShNVl9IV1NfVE9QT0xPR1lfTUFQICpwVG9wb2xvZ3lEQikKIHsKIAlHVF9VMzIgdWksIHVqOwogCiAJbXZQcmludGYoIlx0aW50ZXJmYWNlTWFzazogMHgleFxuIiwgICBwVG9wb2xvZ3lEQi0+aW50ZXJmYWNlQWN0aXZlTWFzayk7Ci0JbXZQcmludGYoIlx0TnVtIEJ1czogICVkXG4iLCAgIHBUb3BvbG9neURCLT5udW1PZkJ1c1BlckludGVyZmFjZSk7CisJbXZQcmludGYoIlx0TnVtIEJ1czogICVkXG4iLCAgIGRkcjNUaXBEZXZBdHRyR2V0KDAsIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSkpOwogCW12UHJpbnRmKCJcdGFjdGl2ZUJ1c01hc2s6IDB4JXhcbiIsICAgcFRvcG9sb2d5REItPmFjdGl2ZUJ1c01hc2spOwogCiAJZm9yKCB1aSA9IDA7IHVpIDwgTUFYX0lOVEVSRkFDRV9OVU07IHVpKysgKQpAQCAtMTUzOCw3ICsxNzQxLDcgQEAKIAl9CiB9CiAjZW5kaWYKLQorI2lmbmRlZiBFWENMVURFX1NXSVRDSF9ERUJVRwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBFeGVjdXRlIFhTQiBUZXN0IHRyYW5zYWN0aW9uIChyZC93ci9ib3RoKQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTU3OCwxNCArMTc4MSw3IEBACiB9CiAKICNlbHNlIC8qRVhDTFVERV9TV0lUQ0hfREVCVUcqLwotR1RfVTMyIHJsVmVyc2lvbiA9IDE7IC8qIDAgLSBvbGQgUkwgbWFjaGluZSAqLwotR1RfVTMyIHZyZWYgPSAweDQ7CiBHVF9VMzIgIHN0YXJ0WHNiT2Zmc2V0ID0gMDsKLUdUX1U4IGNzTWFza1JlZ1tdPQotewotICAgIDAsIDQsIDgsIDEyICwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLQogR1RfU1RBVFVTIFJ1blhzYlRlc3QoR1RfVTMyIGRldk51bSwgR1RfVTMyIHVpTWVtQWRkcmVzcywgR1RfVTMyIHdyaXRlVHlwZSwgR1RfVTMyIHJlYWRUeXBlLCBHVF9VMzIgYnVyc3RMZW5ndGgpCiB7CiAJcmV0dXJuIEdUX09LOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNEZWJ1Z1J4SW9CaXN0LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM0RlYnVnUnhJb0Jpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZmQ0ZDEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNEZWJ1Z1J4SW9CaXN0LmMKQEAgLTAsMCArMSw0NTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgICAgICAgICAgICAgIENvcHlyaWdodCAyMDAxLCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorKiBUaGlzIGNvZGUgY29udGFpbnMgY29uZmlkZW50aWFsIGluZm9ybWF0aW9uIG9mIE1hcnZlbGwgc2VtaWNvbmR1Y3RvciwgaW5jLgorKiBubyByaWdodHMgYXJlIGdyYW50ZWQgaGVyZWluIHVuZGVyIGFueSBwYXRlbnQsIG1hc2sgd29yayByaWdodCBvciBjb3B5cmlnaHQKKyogb2YgTWFydmVsbCBvciBhbnkgdGhpcmQgcGFydHkuCisqIE1hcnZlbGwgcmVzZXJ2ZXMgdGhlIHJpZ2h0IGF0IGl0cyBzb2xlIGRpc2NyZXRpb24gdG8gcmVxdWVzdCB0aGF0IHRoaXMgY29kZQorKiBiZSBpbW1lZGlhdGVseSByZXR1cm5lZCB0byBNYXJ2ZWxsLiBUaGlzIGNvZGUgaXMgcHJvdmlkZWQgImFzIGlzIi4KKyogTWFydmVsbCBtYWtlcyBubyB3YXJyYW50aWVzLCBleHByZXNzLCBpbXBsaWVkIG9yIG90aGVyd2lzZSwgcmVnYXJkaW5nIGl0cworKiBhY2N1cmFjeSwgY29tcGxldGVuZXNzIG9yIHBlcmZvcm1hbmNlLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZId3NEZHIzRGVidWdSeElvQmlzdC5jLmMKKyoKKyogREVTQ1JJUFRJT046IFJYIElPIEJJU1QgVGVzdAorKgorKgorKiBERVBFTkRFTkNJRVM6CisqCisqIEZJTEUgUkVWSVNJT04gTlVNQkVSOgorKiAgICAgICAkUmV2aXNpb246IDIwNCAkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwRmxvdy5oIgorI2luY2x1ZGUgIm12RGRyM0xvZ2dpbmdEZWYuaCIKKworI2lmIGRlZmluZWQoTVZfSFdTX1JYX0lPX0JJU1QpIHx8IGRlZmluZWQoTVZfSFdTX1JYX0lPX0JJU1RfRVRQKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1WX0lPX0JJU1RfUEFUVEVSTl9TSVpFICAgICA0CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBlbnVtcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgZW51bQoreworICAgIFRFU1RfU1RPUCwKKyAgICBURVNUX1NUQVIsCisgICAgVEVTVF9TVE9QX0FORF9TVEFSVCwKK30gTVZfVEVTVF9FTkFCTEU7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBnbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0dUX1UzMiBpb0Jpc3RDb3VudGVyOworZXh0ZXJuIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJlLURlY2xhcmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG12SHdzSW5pdERhdGFBZ3JyZXNzb3IoR1RfVTggZGV2TnVtKTsKK3ZvaWQgbXZId3NJbml0Q2FBZ3Jlc3NvcihHVF9VOCBkZXZOdW0pOworR1RfQk9PTCBtdkh3c0RhdGFBbmRTeW5jU2VsZWN0KEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgcHVwKTsKK3ZvaWQgbXZId3NTZXRSeFBic0RlbGF5KEdUX1U4IGRldk51bSwgR1RfVTMyIERxVmFsdWUsIEdUX1UzMiBEcXNWYWx1ZSk7Cit2b2lkIG12SHdzVGVzdEVuYWJsZShHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgTVZfSFdTX0FDQ0VTU19UWVBFIHBoeUFjY2VzcywgR1RfVTMyIHB1cCwgTVZfVEVTVF9FTkFCTEUgZW5Nb2RlKTsKK3ZvaWQgbXZId3NQaHlBbmRUZXN0UmVzZXQoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIE1WX0hXU19BQ0NFU1NfVFlQRSBwaHlBY2Nlc3MsIEdUX1UzMiBwdXApOwordm9pZCBudkh3c0lvQmlzdFRlc3QoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQpOwordm9pZCBtdkh3c1NldFZpY3RpbVBhdHRlcm4oR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQpOwordm9pZCBtdkh3c1NldE5vaXNlUGF0dGVybihHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCk7Cit2b2lkIG12SHdzSW9CaXN0VGVzdFJ4KEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgcHVwLEdUX1UzMiB2aWN0Qml0LCBHVF9VMzIgYWdyQml0cywgR1RfVTMyIHJ4QWRsbCk7CitHVF9VMzIgbXZId3NDb25maWd1cmVUeEFkbGxPcHQoR1RfVTggZGV2TnVtLEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfVTMyIHB1cCwgR1RfVTMyIFZpY3RCaXQsIEdUX1UzMiBBZ3JCaXRzLCBHVF9VMzIgZGlycmVjdGlvbik7Cit2b2lkIG12SHdzRmlsbFBhdHRlcm4oR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX0JPT0wgaXNOb2lzZSwgR1RfVTMyIHBhdHRlcm5bTVZfSU9fQklTVF9QQVRURVJOX1NJWkVdKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR1RfU1RBVFVTIG12SHdzSW9CaXN0VGVzdChHVF9VOCBkZXZOdW0pCit7CisgICAgR1RfVTMyIGludGVyZmFjZUlkOworCisgICAgbXZId3NTZXRSeFBic0RlbGF5KGRldk51bSwgMHgxRiwgMHhGKTsKKworI2lmZGVmIE1WX0hXU19SWF9JT19CSVNUX0VUUAorICAgIG12SHdzSW5pdENhQWdyZXNzb3IoZGV2TnVtKTsKKyNlbmRpZiAvKiBNVl9IV1NfUlhfSU9fQklTVF9FVFAgKi8KKworICAgIG12SHdzSW5pdERhdGFBZ3JyZXNzb3IoZGV2TnVtKTsKKworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorICAgICAgICBudkh3c0lvQmlzdFRlc3QoZGV2TnVtLCBpbnRlcmZhY2VJZCk7CisgICAgfQorCisgICAgcmV0dXJuIEdUX09LOworfQorCit2b2lkIG12SHdzU2V0UnhQYnNEZWxheShHVF9VOCBkZXZOdW0sIEdUX1UzMiBEcVZhbHVlLCBHVF9VMzIgRHFzVmFsdWUpCit7CisgICAgR1RfVTMyIGludGVyZmFjZUlkOworICAgIEdUX1UzMiBidXNOdW07CisgICAgR1RfVTMyIG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKworICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorICAgICAgICBmb3IgKGJ1c051bT0wOyBidXNOdW08b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNOdW0rKykKKyAgICAgICAgeworICAgICAgICAgICAgVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzTnVtKQorICAgICAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzTnVtLCBERFJfUEhZX0RBVEEsIDB4NWYsIERxVmFsdWUpOworICAgICAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzTnVtLCBERFJfUEhZX0RBVEEsIDB4NTQsIERxc1ZhbHVlKTsKKyAgICAgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c051bSwgRERSX1BIWV9EQVRBLCAweDU1LCBEcXNWYWx1ZSk7CisgICAgICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgMHgyLCAweERGKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBtdkh3c0luaXRDYUFncmVzc29yKEdUX1U4IGRldk51bSkKK3sKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQ7CisKKyAgICAvKmFnZ3Jlc3NpdmUgcGF0dGVybiBmb3IgYWxsIEMvQSBzaWduYWxzKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwLTE1ICAgMTYtMzEgICAzMi00NyAgIDQ4LTYzICovCisgICAgR1RfVTMyIGFkZHJLaWxsZXJQYXR0ZXJuW01WX0lPX0JJU1RfUEFUVEVSTl9TSVpFXSA9IHsgMHhjZmMwLCAweDMzMGMsIDB4MzMzMywgMHhjMGNjIH07CisKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKworICAgICAgICAvKlR4IEVUUCBtb2RlKi8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCAweEIwLCAweDIpOworCisgICAgICAgIC8qQ29udGludW91cyBtb2RlKi8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCAweEM4LCAweDEpOworCisgICAgICAgIC8qIFBIWSAmIFRlc3QgcmVzZXQvdW4tcmVzZXQqLworICAgICAgICBtdkh3c1BoeUFuZFRlc3RSZXNldChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFKTsKKworICAgICAgICAvKmZpbGwgRklGTyB3aXRoIGFnZ3Jlc3NpdmUgcGF0dGVybiovCisgICAgICAgIG12SHdzRmlsbFBhdHRlcm4oZGV2TnVtLCBpbnRlcmZhY2VJZCwgR1RfRkFMU0UsIGFkZHJLaWxsZXJQYXR0ZXJuKTsKKworICAgICAgICAvKmNsb2NrIE4gaW52ZXJ0Ki8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCAweEI2LCAweEMpOworCisgICAgICAgIC8qU2VsZWN0IE5vaXNlIEZJRk8qLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIDB4QjQsIDB4MCk7CisKKyAgICAgICAgLypTdG9wICYgU3RhcnQgVGVzdCovCisgICAgICAgIG12SHdzVGVzdEVuYWJsZShkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBURVNUX1NUT1BfQU5EX1NUQVJUKTsKKyAgICB9Cit9CisKK3ZvaWQgbXZId3NJbml0RGF0YUFncnJlc3NvcihHVF9VOCBkZXZOdW0pCit7CisgICAgR1RfVTMyIGludGVyZmFjZUlkOworCisgICAgLyphZ2dyZXNzaXZlIHBhdHRlcm4gZm9yIGFsbCBEYXRhIHNpZ25hbHMqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAtMTUgICAxNi0zMSAgIDMyLTQ3ICAgNDgtNjMgKi8KKyAgICBHVF9VMzIgZGF0YUtpbGxlclBhdHRlcm5bNF0gPSB7IDB4NTJiOCwgMHg4YTU1LCAweGE2YjMsIDB4MDY2ZCB9OworCisgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisgICAgICAgIC8qVHggRVRQIG1vZGUqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4QjAsIDB4Mik7CisKKyAgICAgICAgLypDb250aW51b3VzIG1vZGUqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4QzgsIDB4MSk7CisKKyAgICAgICAgLyogUEhZICYgVGVzdCByZXNldC91bi1yZXNldCovCisgICAgICAgIG12SHdzUGh5QW5kVGVzdFJlc2V0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUpOworCisgICAgICAgIC8qZmlsbCBGSUZPIHdpdGggYWdncmVzc2l2ZSBwYXR0ZXJuKi8KKyAgICAgICAgbXZId3NGaWxsUGF0dGVybihkZXZOdW0sIGludGVyZmFjZUlkLCBHVF9GQUxTRSwgZGF0YUtpbGxlclBhdHRlcm4pOworCisgICAgICAgIC8qU2VsZWN0IE5vaXNlIEZJRk8qLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4QjQsIDB4MzApOworCisgICAgICAgIC8qU3RvcCAmIFN0YXJ0IFRlc3QqLworICAgICAgICBtdkh3c1Rlc3RFbmFibGUoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVEVTVF9TVE9QX0FORF9TVEFSVCk7CisgICAgfQorfQorCit2b2lkIG52SHdzSW9CaXN0VGVzdChHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKK3sKKyAgICBHVF9VMzIgZHE7CisgICAgR1RfVTMyIEFnckJpdHM7CisgICAgR1RfVTMyIFZpY3RCaXQ7CisgICAgR1RfVTMyIHB1cDsKKyAgICBHVF9VMzIgdHhBZGxsOworICAgIEdUX1UzMiByeEFkbGw7CisgICAgR1RfVTMyIG1hc2sgPSAweDdmZjsKKyAgICBHVF9VMzIgcmVzdWx0c1tNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dW01BWF9EUV9OVU1dOworCisgICAgR1RfVTMyIG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKworICAgIG12UHJpbnRmKCJvY3RldHNQZXJJbnRlcmZhY2VOdW06ICVkXG4iLG9jdGV0c1BlckludGVyZmFjZU51bSk7CisKKyAgICBtdkh3c1NldFZpY3RpbVBhdHRlcm4oZGV2TnVtLCBpbnRlcmZhY2VJZCk7CisKKyAgICBmb3IoZHEgPSAwOyBkcSA8IG9jdGV0c1BlckludGVyZmFjZU51bSAqIDggOyBkcSsrKQorICAgIHsKKyAgICAgICAgcHVwID0gZHEvODsKKworICAgICAgICBWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCisgICAgICAgIFZpY3RCaXQgPSBkcSU4OworICAgICAgICBBZ3JCaXRzID0gKFZpY3RCaXQgPiAzKSA/ICh+KDE8PChWaWN0Qml0ICsgMikpICYgbWFzaykgOiAofigxPDxWaWN0Qml0KSAmIG1hc2spOyAvKiBlYWNoIHB1cD0xMSBCaXRzICA4IGRxIGJpdHMsIEJpdHMgNCAmIDUgYXJlIERRUywgQml0IDEwPURNICovCisKKyAgICAgICAgbXZId3NTZXROb2lzZVBhdHRlcm4oaW50ZXJmYWNlSWQsIHB1cCk7CisgICAgICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKworICAgICAgICAvKiBQSFkgJiBUZXN0IHJlc2V0L3VuLXJlc2V0Ki8KKyAgICAgICAgbXZId3NQaHlBbmRUZXN0UmVzZXQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwKTsKKworICAgICAgICAvKlN0b3AgVGVzdCovCisgICAgICAgIG12SHdzVGVzdEVuYWJsZShkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIFRFU1RfU1RPUCk7CisKKyAgICAgICAgdHhBZGxsID0gbXZId3NDb25maWd1cmVUeEFkbGxPcHQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgcHVwLCBWaWN0Qml0LCBBZ3JCaXRzLCAxKSArIDE7CisgICAgICAgIGlmICgodHhBZGxsID4gMCkgJiYgKHR4QWRsbCA8IDUpKSB7CisgICAgICAgICAgICB0eEFkbGwgPSBtdkh3c0NvbmZpZ3VyZVR4QWRsbE9wdChkZXZOdW0sIGludGVyZmFjZUlkLCBwdXAsIFZpY3RCaXQsIEFnckJpdHMsIDApIC0gMTsKKyAgICAgICAgfQorICAgICAgICBtdlByaW50ZigidHhBZGxsOiAlZFxuIix0eEFkbGwpOworCisgICAgICAgIC8qU2V0IE9wdGltYWwgRFFTX1dSKi8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4MSwgdHhBZGxsKTsKKworICAgICAgICAvKlNldCBPcHRpbWFsIFJlY2VpdmVyIENhbGlicmF0aW9uKi8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4REIsIDB4M0YpOworCisgICAgICAgIGZvcihyeEFkbGwgPSAwOyByeEFkbGwgPCAzMjsgcnhBZGxsKyspICAgLyogU2VhcmNoIFJYIFdpbmRvdyAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiBQSFkgJiBUZXN0IHJlc2V0L3VuLXJlc2V0Ki8KKyAgICAgICAgICAgIG12SHdzUGh5QW5kVGVzdFJlc2V0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCk7CisKKyAgICAgICAgICAgIC8qU3RvcCBUZXN0Ki8KKyAgICAgICAgICAgIG12SHdzVGVzdEVuYWJsZShkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIFRFU1RfU1RPUCk7CisKKyAgICAgICAgICAgIC8qU2V0IEN1cnJlbnQgUnggQURMTCovCisgICAgICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHgzLCByeEFkbGwpOworICAgICAgICAgICAgbXZId3NJb0Jpc3RUZXN0UngoZGV2TnVtLGludGVyZmFjZUlkLHB1cCxWaWN0Qml0LCBBZ3JCaXRzLCByeEFkbGwpOworICAgICAgICB9CisgICAgICAgIC8qUmVzZXQgRFFTX1dSKi8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4MSwgMHgwKTsKKyAgICAgICAgLypSZXNldCBEUVNfUkQqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHgzLCAweDApOworICAgICAgICBtdlByaW50ZigiXG4gIyMjIyMjIyMjIyBSeCAtIHdpbiBzaXplOiAlZCAjIyMjIyMjIyNcbiIsaW9CaXN0Q291bnRlcik7CisgICAgICAgIHJlc3VsdHNbaW50ZXJmYWNlSWRdW3B1cF1bZHElOF0gPSBpb0Jpc3RDb3VudGVyOworICAgICAgICBpb0Jpc3RDb3VudGVyID0gMDsKKyAgICB9CisgICAgLypwcmludCBmaW5hbCByZXN1bHRzKi8KKyAgICBtdlByaW50ZigiSW50ZXJmYWNlICAgICBQVVAgICAgIEJJVCAgICAgWF9XSU5fU0laRVxuIik7CisgICAgbXZQcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKyAgICAgICAgZm9yIChwdXA9MDsgcHVwPG9jdGV0c1BlckludGVyZmFjZU51bTsgcHVwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKKyAgICAgICAgICAgIGZvcihkcSA9IDA7IGRxIDwgOCA7IGRxKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXZQcmludGYoIiVkICAgICAgICAlZCAgICAgICVkICAgICAgJWRcbiIsaW50ZXJmYWNlSWQscHVwLGRxLHJlc3VsdHNbaW50ZXJmYWNlSWRdW3B1cF1bZHElOF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIG12SHdzVGVzdEVuYWJsZShHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCwgTVZfSFdTX0FDQ0VTU19UWVBFIHBoeUFjY2VzcywgR1RfVTMyIHB1cCwgTVZfVEVTVF9FTkFCTEUgZW5Nb2RlKQoreworICAgIGlmKChlbk1vZGUgPT0gVEVTVF9TVE9QKSB8fCAoZW5Nb2RlID09IFRFU1RfU1RPUF9BTkRfU1RBUlQpKQorICAgIHsKKyAgICAgICAgLypTdG9wIFRlc3QqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwaHlBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweEIxLCAweDApOworICAgICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7CisgICAgfQorCisgICAgaWYoKGVuTW9kZSA9PSBURVNUX1NUQVIpIHx8IChlbk1vZGUgPT0gVEVTVF9TVE9QX0FORF9TVEFSVCkpCisgICAgeworICAgICAgICAvKlN0YXJ0IFRlc3QqLworICAgICAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwaHlBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweEIxLCAweDEpOworICAgICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7CisgICAgfQorfQorCit2b2lkIG12SHdzUGh5QW5kVGVzdFJlc2V0KEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBNVl9IV1NfQUNDRVNTX1RZUEUgcGh5QWNjZXNzLCBHVF9VMzIgcHVwKQoreworICAgIC8qUGh5IFJlc2V0Ki8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwaHlBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweDkwLCAweDIpOworICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKworICAgIC8qUGh5IFVuLVJlc2V0Ki8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBwaHlBY2Nlc3MsIHB1cCwgRERSX1BIWV9EQVRBLCAweDkwLCAweDIwMDIpOworICAgIGh3c09zRXhhY3REZWxheVB0cigoR1RfVTgpZGV2TnVtLCBkZXZOdW0sIDEwKTsKKworICAgIC8qVGVzdCBSZXNldCovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgcGh5QWNjZXNzLCBwdXAsIEREUl9QSFlfREFUQSwgMHhCRCwgMHgxKTsKKyAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7CisKKyAgICAvKlRlc3QgVW4tUmVzZXQqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIHBoeUFjY2VzcywgcHVwLCBERFJfUEhZX0RBVEEsIDB4QkQsIDB4MCk7CisgICAgaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIGRldk51bSwgMTApOworfQorCit2b2lkIG12SHdzRmlsbFBhdHRlcm4oR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX0JPT0wgaXNOb2lzZSwgR1RfVTMyIHBhdHRlcm5bTVZfSU9fQklTVF9QQVRURVJOX1NJWkVdKQoreworICAgIEdUX1UzMiBvZmZzZXQgPSAoaXNOb2lzZSkgPyAweEM0IDogMHhDMDsKKyAgICBHVF9VOCBpOworCisgICAgZm9yKGkgPSAwOyBpIDwgTVZfSU9fQklTVF9QQVRURVJOX1NJWkU7IGkrKykKKyAgICB7CisgICAgICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgb2Zmc2V0ICsgaSwgcGF0dGVybltpXSk7CisgICAgfQorfQorCit2b2lkIG12SHdzU2V0VmljdGltUGF0dGVybihHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMC0xNSAgIDE2LTMxICAgMzItNDcgICA0OC02MyAqLworICAgIEdUX1UzMiBraWxsZXJWaWN0UGF0dGVybltNVl9JT19CSVNUX1BBVFRFUk5fU0laRV0gPSB7IDB4QjlBNiwgMHg0NUE2LCAweDU4MTksIDB4REI5QSB9OworCisgICAgLypmaWxsIEZJRk8gd2l0aCBhZ2dyZXNzaXZlIHBhdHRlcm4qLworICAgIG12SHdzRmlsbFBhdHRlcm4oZGV2TnVtLCBpbnRlcmZhY2VJZCwgR1RfVFJVRSwga2lsbGVyVmljdFBhdHRlcm4pOworCisgICAgLypUQkQgLSBuZWVkIHRvIGV4dGVuZCBmb3IgQkMyKi8KK30KKwordm9pZCBtdkh3c1NldE5vaXNlUGF0dGVybihHVF9VOCBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKK3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMC0xNSAgIDE2LTMxICAgMzItNDcgICA0OC02MyAqLworICAgIEdUX1UzMiBhbGxaZXJvUGF0dGVybltNVl9JT19CSVNUX1BBVFRFUk5fU0laRV0gPSB7IDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCB9OworCisgICAgLypmaWxsIEZJRk8gd2l0aCBhZ2dyZXNzaXZlIHBhdHRlcm4qLworICAgIG12SHdzRmlsbFBhdHRlcm4oZGV2TnVtLCBpbnRlcmZhY2VJZCwgR1RfRkFMU0UsIGFsbFplcm9QYXR0ZXJuKTsKKworICAgIC8qVEJEIC0gbmVlZCB0byBleHRlbmQgZm9yIEJDMiovCit9CisKK3ZvaWQgbXZId3NJb0Jpc3RUZXN0UnVuKEdUX1U4IGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgcHVwLCBHVF9VMzIgdmljdEJpdCwgR1RfVTMyIGFnckJpdHMpCit7CisgICAgR1RfVTMyIHRpbWVvdXQgPSAwOworICAgIEdUX1UzMiBkYXRhVmFsOworCisgICAgLypDb25maWd1cmUgSS9PIGJpc3QgTW9kZSovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjAsIDB4Myk7CisKKyAgICAvKlNldCBSZXBlYXQgdG8gMzEqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweEJFLCAweEYpOworCisgICAgLypDb25maWd1cmUgY29udGludW91cyBtb2RlIHRvIGFjdGl2ZSovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QzgsIDB4MSk7CisKKyAgICAvKkNvbmZpZ3VyZSBTeW5jIFBhdHRlcm4gdG8gMHg3Ki8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCQywgMHg3KTsKKworICAgIC8qIFBIWSAmIFRlc3QgcmVzZXQvdW4tcmVzZXQqLworICAgIG12SHdzUGh5QW5kVGVzdFJlc2V0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCk7CisKKyAgICAvKlNlbGVjdCBSeCBCaXQqLworICAgIG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweEI4LCB2aWN0Qml0KTsKKworICAgIC8qU2VsZWN0IEFnZ3Jlc3NvciovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjQsIGFnckJpdHMpOworCisgICAgLypTdG9wICYgU3RhcnQgVGVzdCovCisgICAgbXZId3NUZXN0RW5hYmxlKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgVEVTVF9TVE9QX0FORF9TVEFSVCk7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCMSwgJmRhdGFWYWwpOworICAgICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7CisgICAgICAgIGlmICh0aW1lb3V0Kys+MTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qU3RvcCBUZXN0Ki8KKyAgICAgICAgICAgIG12SHdzVGVzdEVuYWJsZShkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIFRFU1RfU1RPUCk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChkYXRhVmFsID09IDEpOworfQorCitHVF9CT09MIG12SHdzRGF0YUFuZFN5bmNTZWxlY3QoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiBwdXApCit7CisgICAgR1RfVTMyIGRhdGFSZXN1bHQ7CisgICAgR1RfVTMyIHN5bmNSZXN1bHQ7CisgICAgR1RfVTMyIGRhdGFWYWw7CisKKyAgICAvKkRhdGEgU2VsZWN0Ki8KKyAgICBtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCNywgMHgxKTsKKyAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCk7CisgICAgbXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXAsIEREUl9QSFlfREFUQSwgMHhCMiwgJmRhdGFWYWwpOworICAgIGRhdGFSZXN1bHQgPSBkYXRhVmFsOworCisgICAgLypTeW5jIFNlbGVjdCovCisgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjcsIDB4MCk7CisgICAgaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIGRldk51bSwgMTApOworICAgIG12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4QjIsICZkYXRhVmFsKTsKKyAgICBzeW5jUmVzdWx0ID0gZGF0YVZhbDsKKworICAgIHJldHVybiAoKGRhdGFSZXN1bHQgPT0gMCkgJiYgKHN5bmNSZXN1bHQgPT0gMCkpID8gR1RfVFJVRSA6IEdUX0ZBTFNFOworfQorCitHVF9VMzIgbXZId3NDb25maWd1cmVUeEFkbGxPcHQoR1RfVTggZGV2TnVtLEdUX1UzMiBpbnRlcmZhY2VJZCwgR1RfVTMyIHB1cCwgR1RfVTMyIHZpY3RCaXQsIEdUX1UzMiBhZ3JCaXRzLCBHVF9VMzIgZGlycmVjdGlvbikKK3sKKwlHVF9VMzIgdHhBZGxsOworCUdUX1UzMiBlbmRMb29wOworICAgIEdUX0JPT0wgaXNQYXNzOworCisJbXZQcmludGYoImRpcmVjdGlvbiA9ICVkXG4iLGRpcnJlY3Rpb24pOworCWlmIChkaXJyZWN0aW9uKSB7CisJCWVuZExvb3AgPSA2NDsKKwkJdHhBZGxsID0gNTsKKwl9IGVsc2UgeworCQllbmRMb29wID0gMDsKKwkJdHhBZGxsID0gNjQ7CisJfQorCisJLypTZXQgUnggQWRsbCB0byBtaW4qLworCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCAweDMsIDB4MCk7CisKKwl3aGlsZSh0eEFkbGwgIT0gZW5kTG9vcCkKKwl7CisgICAgICAgIGlmIChkaXJyZWN0aW9uKSB7CisgICAgICAgICAgICB0eEFkbGwgKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0eEFkbGwgLS07CisgICAgICAgIH0KKworICAgICAgICAvKlNldCBUeCBBZGxsKi8KKyAgICAgICAgbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwLCBERFJfUEhZX0RBVEEsIDB4MSwgdHhBZGxsKTsKKworICAgICAgICAvKiBSdW4gSS9PIEJJU1QgdGVzdCAqLworICAgICAgICBtdkh3c0lvQmlzdFRlc3RSdW4oZGV2TnVtLCBpbnRlcmZhY2VJZCwgcHVwLCB2aWN0Qml0LCBhZ3JCaXRzKTsKKworICAgICAgICAvKiBDaGVjayBpZiBTeW5jIGFuZC9vciBEYXRhIHBhc3MgKi8KKyAgICAgICAgaXNQYXNzID0gbXZId3NEYXRhQW5kU3luY1NlbGVjdChkZXZOdW0sIGludGVyZmFjZUlkLCBwdXApOworICAgICAgICBpZihpc1Bhc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGxvb2tpbmcgZm9yIGZhaWx1cmUgc28gY29udGludWUgdGhlIHNlYXJjaCAqLworICAgICAgICAgICAgbXZQcmludGYoIi4iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0eEFkbGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3ZSBzaG91bGRuJ3QgcmVhY2ggdGhpcyBwb2ludC4gaWYgc28sIGl0J3MgZW4gZXJyb3IgKi8KKyAgICBtdlByaW50ZigibXZId3NDb25maWd1cmVUeEFkbGxPcHQ6IEVycm9yOiBjb3VsZG4ndCBmaW5kIGZhaWx1cmUgcG9pbnRcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXZId3NJb0Jpc3RUZXN0UngoR1RfVTggZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQsIEdUX1UzMiBwdXAsR1RfVTMyIHZpY3RCaXQsIEdUX1UzMiBhZ3JCaXRzLCBHVF9VMzIgcnhBZGxsKQoreworICAgIEdUX0JPT0wgaXNQYXNzOworCisgICAgLyogUnVuIEkvTyBCSVNUIHRlc3QgKi8KKyAgICBtdkh3c0lvQmlzdFRlc3RSdW4oZGV2TnVtLCBpbnRlcmZhY2VJZCwgcHVwLCB2aWN0Qml0LCBhZ3JCaXRzKTsKKworICAgIG12UHJpbnRmKCJpbnRlcmZhY2VJZDogJWQgICBQVVA6ICVkICAgVmljdEJpdDogJWQgIEFnckJpdHM6IDB4JXggIHJ4QWRsbDogJWQgLS0+ICIsaW50ZXJmYWNlSWQsIHB1cCwgdmljdEJpdCwgYWdyQml0cywgcnhBZGxsKTsKKworICAgIC8qIENoZWNrIGlmIFN5bmMgYW5kL29yIERhdGEgcGFzcyAqLworICAgIGlzUGFzcyA9IG12SHdzRGF0YUFuZFN5bmNTZWxlY3QoZGV2TnVtLCBpbnRlcmZhY2VJZCwgcHVwKTsKKyAgICBpZihpc1Bhc3MpCisgICAgeworICAgICAgICBtdlByaW50ZigiUEFTU1xuIik7CisgICAgICAgIGlvQmlzdENvdW50ZXIrKzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbXZQcmludGYoIi0tLS0tXG4iKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKE1WX0hXU19SWF9JT19CSVNUKSB8fCBkZWZpbmVkKE1WX0hXU19SWF9JT19CSVNUX0VUUCkgKi8KKworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nLmMKaW5kZXggMzI2OTM5ZC4uN2E1ZjQ4NSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmcuYwpAQCAtMzEsMTAgKzMxLDYgQEAKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwUHJ2SWYuaCIKICNpbmNsdWRlICJtdkRkcjNMb2dnaW5nRGVmLmgiCiAKLSNpZmRlZiBDT05GSUdfRERSNAotI2luY2x1ZGUgIm12SHdzRGRyNFRyYWluaW5nLmgiCi0jaW5jbHVkZSAibXZId3NEZHI0TXByUGRhSWYuaCIKLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBGcmVlUlRPUwogI2RlZmluZSBERlhfQkFSMV9CQVNFICAgICAgICAoMHg4MDAwMDAwMCkKQEAgLTUwLDcgKzQ2LDYgQEAKIC8qI2RlZmluZSBUSU1FXzJfQ0xPQ0tfQ1lDTEVTKHBybSwgY2xrKSAgICgocHJtLTEpL2NsaykqLwogI2RlZmluZSBUSU1FXzJfQ0xPQ0tfQ1lDTEVTICAgICAgICAgICAgIENFSUxfRElWSURFCiAKLQogI2RlZmluZSBHRVRfQ1NfRlJPTV9NQVNLKG1hc2spIChjc01hc2syTnVtW21hc2tdKQogI2RlZmluZSBDU19DQkVfVkFMVUUoY3NOdW0pICAgKGNzQ2JlUmVnW2NzTnVtXSkKIApAQCAtNjIsNyArNTcsNyBAQAogR1RfVTMyICBQaHlSZWcwVmFsID0gMDsKIEdUX1UzMiAgUGh5UmVnMVZhbCA9IDg7CiBHVF9VMzIgIFBoeVJlZzJWYWwgPSAwOwotR1RfVTMyICBQaHlSZWczVmFsID0gMHhBOworR1RfVTMyICBQaHlSZWczVmFsID0gTVZfUEFSQU1TX1VOREVGSU5FRDsKIE1WX0hXU19ERFJfRlJFUSBpbml0RnJlcSA9IEREUl9GUkVRXzY2NzsKIE1WX0hXU19ERFJfRlJFUSBsb3dGcmVxID0gRERSX0ZSRVFfTE9XX0ZSRVE7CiBNVl9IV1NfRERSX0ZSRVEgbWVkaXVtRnJlcTsKQEAgLTcxLDEzICs2Niw5IEBACiBHVF9VMzIqIGRxTWFwVGFibGUgPSBOVUxMOwogR1RfVTMyIG9kdENvbmZpZyA9IDE7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQotR1RfVTggIGlzUGxsQmVmb3JlSW5pdCA9IDAsIGlzQWRsbENhbGliQmVmb3JlSW5pdCA9IDAsIGlzRGZzSW5Jbml0ID0gMDsKLUdUX1UzMiBkZnNMb3dGcmVxID0gMTMwOwotI2Vsc2UKIEdUX1U4ICBpc1BsbEJlZm9yZUluaXQgPSAwLCBpc0FkbGxDYWxpYkJlZm9yZUluaXQgPSAxLCBpc0Rmc0luSW5pdCA9IDA7Ci1HVF9VMzIgZGZzTG93RnJlcSA9IDEwMDsKLSNlbmRpZgorR1RfVTMyIGRmc0xvd0ZyZXE7CisKIEdUX1UzMiBnUnR0Tm9tQ1MwLCBnUnR0Tm9tQ1MxOwogR1RfVTggY2FsaWJyYXRpb25VcGRhdGVDb250cm9sOyAvKjIgZXh0ZXJuYWwgb25seSwgMSBpcyBpbnRlcm5hbCBvbmx5Ki8KIApAQCAtMTA5LDEyICsxMDAsMjUgQEAKIEdUX1UzMiBkZWxheUVuYWJsZSA9IDA7CiBzdGF0aWMgR1RfVTMyIGZyZXFNYXNrW0hXU19NQVhfREVWSUNFX05VTV1bRERSX0ZSRVFfTElNSVRdOwogR1RfQk9PTCBybE1pZEZyZXFXQSA9IEdUX0ZBTFNFOwotZXh0ZXJuIEdUX1UzMiBkZHI0VGlwQ29uZmlndXJlUGh5VnJlZlRhcDsKIAotI2lmIGRlZmluZWQgKENPTkZJR19BTExFWUNBVDMpCi1HVF9VMzIgbXZId3NtZW1TaXplW10gPSB7IEFERFJfU0laRV81MTJNYiwgQUREUl9TSVpFXzFHYiwgQUREUl9TSVpFXzJHYiwgQUREUl9TSVpFXzRHYiAsQUREUl9TSVpFXzhHYiB9OwotI2RlZmluZSAgTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSAgICAgICAgICBBRERSX1NJWkVfMkdiCi0jZW5kaWYKK0dUX1UzMiB2cmVmSW5pdGlhbFZhbHVlID0gMHg0OworR1RfVTMyIGNrRGVsYXkgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOworCisvKkRlc2lnbiBHdWlkZWxpbmVzIHBhcmFtZXRlcnMqLworR1RfVTMyIGdacHJpRGF0YSA9IE1WX1BBUkFNU19VTkRFRklORUQ7IC8qIGNvbnRyb2xsZXIgZGF0YSAtIFAgZHJpdmUgc3RyZW5ndGggKi8KK0dUX1UzMiBnWm5yaURhdGEgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOyAvKiBjb250cm9sbGVyIGRhdGEgLSBOIGRyaXZlIHN0cmVuZ3RoICovCitHVF9VMzIgZ1pwcmlDdHJsID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBDL0EgLSBQIGRyaXZlIHN0cmVuZ3RoICovCitHVF9VMzIgZ1pucmlDdHJsID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBDL0EgLSBOIGRyaXZlIHN0cmVuZ3RoICovCisKK0dUX1UzMiBnWnBvZHREYXRhID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBkYXRhIC0gUCBPRFQgKi8KK0dUX1UzMiBnWm5vZHREYXRhID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBkYXRhIC0gTiBPRFQgKi8KK0dUX1UzMiBnWnBvZHRDdHJsID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBkYXRhIC0gUCBPRFQgKi8KK0dUX1UzMiBnWm5vZHRDdHJsID0gTVZfUEFSQU1TX1VOREVGSU5FRDsgLyogY29udHJvbGxlciBkYXRhIC0gTiBPRFQgKi8KKworR1RfVTMyIHVpT0RUQ29uZmlnID0gTVZfUEFSQU1TX1VOREVGSU5FRDsKK0dUX1UzMiBnUnR0Tm9tID0gTVZfUEFSQU1TX1VOREVGSU5FRDsKK0dUX1UzMiBnUnR0V1IgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOworR1RfVTMyIGdEaWMgPSBNVl9QQVJBTVNfVU5ERUZJTkVEOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEzNCwxMyArMTM4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQgICB8CiAgICAgICAgICAgICAgICAgICAgICAgIENFTlRSQUxJWkFUSU9OX1RYX01BU0tfQklUICAgKTsKIAotdm9pZCBkZHIzUHJpbnRWZXJzaW9uKCkKLXsKLQltdlByaW50ZihERFIzX1RJUF9WRVJTSU9OX1NUUklORyk7Ci19Ci0KLQotCiBleHRlcm4gR1RfVTMyIGlzUGxsT2xkOwogZXh0ZXJuIENsVmFsdWVQZXJGcmVxIGNhc0xhdGVuY3lUYWJsZVtdOwogZXh0ZXJuIFBhdHRlcm5JbmZvIHBhdHRlcm5UYWJsZVtdIDsKQEAgLTE1NiwyMSArMTUzLDcgQEAKIGV4dGVybiBHVF9VMTYgcmZjVGFibGVbXTsKIGV4dGVybiBHVF9VMzIgc3BlZWRCaW5UYWJsZVRSY1tdOwogZXh0ZXJuIEdUX1UzMiBzcGVlZEJpblRhYmxlVFJjZFRScFtdOwotZXh0ZXJuIEdUX1UzMiBja0RlbGF5LCBja0RlbGF5XzE2OwotZXh0ZXJuIEdUX1UzMiBnWnByaURhdGE7Ci1leHRlcm4gR1RfVTMyIGdabnJpRGF0YTsKLWV4dGVybiBHVF9VMzIgZ1pwcmlDdHJsOwotZXh0ZXJuIEdUX1UzMiBnWm5yaUN0cmw7Ci0KLWV4dGVybiBHVF9VMzIgZ1pwb2R0RGF0YTsKLWV4dGVybiBHVF9VMzIgZ1pub2R0RGF0YTsKLWV4dGVybiBHVF9VMzIgZ1pwb2R0Q3RybDsKLWV4dGVybiBHVF9VMzIgZ1pub2R0Q3RybDsKLQotZXh0ZXJuIEdUX1UzMiBnRGljOwotZXh0ZXJuIEdUX1UzMiB1aU9EVENvbmZpZzsKLWV4dGVybiBHVF9VMzIgZ1J0dE5vbTsKLQorZXh0ZXJuIEdUX1UzMiBtdk1lbVNpemVbXTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIHByZS1kZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwRERSM0RkcjNUcmFpbmluZ01haW5GbG93CkBAIC0yMjUsNiArMjA4LDEwIEBACiAgICAgTVZfSFdTX0REUl9GUkVRCQkJZnJlcXVlbmN5CiApOwogCisjaWYgZGVmaW5lZChNVl9IV1NfUlhfSU9fQklTVCkgfHwgZGVmaW5lZChNVl9IV1NfUlhfSU9fQklTVF9FVFApCitHVF9TVEFUVVMgbXZId3NJb0Jpc3RUZXN0KEdUX1U4IGRldk51bSk7CisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGdsb2JhbCBkYXRhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIFBhZ2VFbGVtZW50IHBhZ2VQYXJhbVtdID0KQEAgLTMzMSw2ICszMTgsMjUgQEAKIHN0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFJhbmtDb250cm9sKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorVmVyc2lvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBHVF9DSEFSKiBtdkh3c0RkcjNUaXBWZXJzaW9uR2V0KHZvaWQpCit7CisgICAgcmV0dXJuIEREUjNfVElQX1ZFUlNJT05fU1RSSU5HOworfQorCitleHRlcm4gY29uc3QgR1RfQ0hBUiogbXZId3NEZHI0U3ViTGliVmVyc2lvbkdldCh2b2lkKTsKKwordm9pZCBkZHIzUHJpbnRWZXJzaW9uKCkKK3sKKyAgICBtdlByaW50Zihtdkh3c0RkcjNUaXBWZXJzaW9uR2V0KCkpOworI2lmZGVmIENPTkZJR19ERFI0CisgICAgbXZQcmludGYobXZId3NEZHI0U3ViTGliVmVyc2lvbkdldCgpKTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFJlZ2lzdGVyIGZyZXEgbWFzawogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTIG12SHdzRGRyM1RpcFJlZ2lzdGVyRnJlcU1hc2soR1RfVTMyIGRldk51bSwgR1RfVTMyKiBmcmVxTWFza1VzcikKQEAgLTM1NCwxOCArMzYwLDc4IEBACiB7CiAJZGV2TnVtID0gZGV2TnVtOyAvKiBhdm9pZCB3YXJuaW5ncyAqLwogCi0JaWYocGFyYW1zLT5ja0RlbGF5ICE9IC0xKQotCQlja0RlbGF5ID0gcGFyYW1zLT5ja0RlbGF5OworCWlmKHBhcmFtcy0+Y2tEZWxheSAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSAgICAgY2tEZWxheSA9IHBhcmFtcy0+Y2tEZWxheTsKIAotCWlmKHBhcmFtcy0+Y2tEZWxheV8xNiAhPSAtMSkKLQkJY2tEZWxheV8xNiA9ICBwYXJhbXMtPmNrRGVsYXlfMTY7Ci0JaWYocGFyYW1zLT5QaHlSZWczVmFsICE9IC0xKQotCQlQaHlSZWczVmFsID0gcGFyYW1zLT5QaHlSZWczVmFsOworCWlmKHBhcmFtcy0+UGh5UmVnM1ZhbCAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSAgUGh5UmVnM1ZhbCA9IHBhcmFtcy0+UGh5UmVnM1ZhbDsKKworCWlmKHBhcmFtcy0+Z1J0dE5vbSAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSAgICAgZ1J0dE5vbSA9IHBhcmFtcy0+Z1J0dE5vbTsKKwlpZihwYXJhbXMtPmdSdHRXUiAhPSBNVl9QQVJBTVNfVU5ERUZJTkVEKSAgICAgZ1J0dFdSID0gcGFyYW1zLT5nUnR0V1I7CisJaWYocGFyYW1zLT5nRGljICE9IE1WX1BBUkFNU19VTkRFRklORUQpICAgICAgICBnRGljID0gcGFyYW1zLT5nRGljOworCWlmKHBhcmFtcy0+dWlPRFRDb25maWcgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgdWlPRFRDb25maWcgPSBwYXJhbXMtPnVpT0RUQ29uZmlnOworCisJaWYocGFyYW1zLT5nWnByaURhdGEgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pwcmlEYXRhID0gcGFyYW1zLT5nWnByaURhdGE7CisJaWYocGFyYW1zLT5nWm5yaURhdGEgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pucmlEYXRhID0gcGFyYW1zLT5nWm5yaURhdGE7CisJaWYocGFyYW1zLT5nWnByaUN0cmwgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pwcmlDdHJsID0gcGFyYW1zLT5nWnByaUN0cmw7CisJaWYocGFyYW1zLT5nWm5yaUN0cmwgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pucmlDdHJsID0gcGFyYW1zLT5nWm5yaUN0cmw7CisKKwlpZihwYXJhbXMtPmdacG9kdERhdGEgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pwb2R0RGF0YSA9IHBhcmFtcy0+Z1pwb2R0RGF0YTsKKwlpZihwYXJhbXMtPmdabm9kdERhdGEgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pub2R0RGF0YSA9IHBhcmFtcy0+Z1pub2R0RGF0YTsKKwlpZihwYXJhbXMtPmdacG9kdEN0cmwgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pwb2R0Q3RybCA9IHBhcmFtcy0+Z1pwb2R0Q3RybDsKKwlpZihwYXJhbXMtPmdabm9kdEN0cmwgIT0gTVZfUEFSQU1TX1VOREVGSU5FRCkgZ1pub2R0Q3RybCA9IHBhcmFtcy0+Z1pub2R0Q3RybDsKKworCURFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgiREdMIHBhcmFtcyBhcmUgMHglWCAweCVYIDB4JVggMHglWCAweCVYIDB4JVggMHglWCAweCVYIDB4JVggMHglWCAweCVYIDB4JVhcbiIsCisJCQkJZ1pwcmlEYXRhLCBnWm5yaURhdGEsIGdacHJpQ3RybCwgZ1pucmlDdHJsLAorCQkJCWdacG9kdERhdGEsIGdabm9kdERhdGEsIGdacG9kdEN0cmwsIGdabm9kdEN0cmwsCisJCQkJZ1J0dE5vbSwgZ0RpYywgdWlPRFRDb25maWcsIGdSdHRXUikpOwogCiAJcmV0dXJuIEdUX09LOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvbmZpZ3VyZSBwaHkgKCBjYWxsZWQgYnkgc3RhdGljIGluaXQgY29udHJvbGxlcikgIGZvciBzdGF0aWMgZmxvdworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNUaXBDb25maWd1cmVQaHkKKygKKyAgICBHVF9VMzIgICAgZGV2TnVtCispCit7CisgICAgR1RfVTMyIGludGVyZmFjZUlkLCBwaHlJZDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOworCisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIFBBRF9aUklfQ0FMSUJfUEhZX1JFRywgKCgweDdmICYgZ1pwcmlEYXRhKSA8PCA3IHwgKDB4N2YgJiBnWm5yaURhdGEpKSkpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCBQQURfWlJJX0NBTElCX1BIWV9SRUcsICgoMHg3ZiAmIGdacHJpQ3RybCkgPDwgNyB8ICgweDdmICYgZ1pucmlDdHJsKSkpKTsKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgUEFEX09EVF9DQUxJQl9QSFlfUkVHLCAoKDB4M2YgJiBnWnBvZHREYXRhKSA8PCA2IHwgKDB4M2YgJiBnWm5vZHREYXRhKSkpKTsKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfQ09OVFJPTCwgUEFEX09EVF9DQUxJQl9QSFlfUkVHLCAoKDB4M2YgJiBnWnBvZHRDdHJsKSA8PCA2IHwgKDB4M2YgJiBnWm5vZHRDdHJsKSkpKTsKKworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCBQQURfUFJFX0RJU0FCTEVfUEhZX1JFRywgMCkpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCBDTU9TX0NPTkZJR19QSFlfUkVHLCAwKSk7CisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIENNT1NfQ09ORklHX1BIWV9SRUcsIDApKTsKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCXsKKwkJLyogY2hlY2sgaWYgdGhlIGludGVyZmFjZSBpcyBlbmFibGVkICovCisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisgICAgICAgIGZvcihwaHlJZD0wO3BoeUlkPG9jdGV0c1BlckludGVyZmFjZU51bTsgcGh5SWQrKykKKyAgICAgICAgeworICAgCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcGh5SWQpCisgICAgICAgICAgICAvKiBWcmVmICYgY2xhbXAgKi8KKyAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICBwaHlJZCwgRERSX1BIWV9EQVRBLCBQQURfQ09ORklHX1BIWV9SRUcsICAgKChjbGFtcFRibFtpbnRlcmZhY2VJZF0gPDwgNCkgfCB2cmVmSW5pdGlhbFZhbHVlICksICgoMHg3IDw8IDQpIHwgMHg3KSApKTsKKyAgICAgICAgICAgIC8qIGNsYW1wIG5vdCByZWxldmFudCBmb3IgY29udHJvbCAqLworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIHBoeUlkLCBERFJfUEhZX0NPTlRST0wsIFBBRF9DT05GSUdfUEhZX1JFRywgICAgMHg0ICwgMHg3ICkpOworICAgICAgICB9CisgICAgfQorCisJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1BIWV9FREdFICkgPT0gTVZfRERSX1BIWV9FREdFX1BPU0lUSVZFKXsKKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4OTAsIDB4NjAwMikpOworCX0KKworI2lmZGVmIENPTkZJR19ERFI0CisgICAgZGRyNFRpcENvbmZpZ3VyZVBoeShkZXZOdW0pOworI2VuZGlmCisKKyAgIHJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBDb25maWd1cmUgQ1MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEdUX1NUQVRVUyBkZHIzVGlwQ29uZmlndXJlQ3MoR1RfVTMyIGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgY3NOdW0sIEdUX1UzMiBlbmFibGUpCkBAIC00MTgsNyArNDg0LDkgQEAKIAlHVF9VMzIgY3NDb3VudDsKIAlHVF9VMzIgY3NCaXRtYXNrOwogCUdUX1UzMiBjdXJyQ3NOdW0gPSAwOwotCWZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0NudCsrKQorCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CisKKwlmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKIAkJY3NDb3VudCA9IDA7CkBAIC00NjEsNyArNTI5LDggQEAKICAgICBHVF9VMzIgY2xWYWx1ZSA9IDAsIGN3bFZhbCA9IDA7CiAgICAgR1RfVTMyIHJlZnJlc2hJbnRlcnZhbENudCA9IDAsICBidXNDbnQgPSAwLCBhZGxsVGFwID0gMDsKICAgICBNVl9IV1NfQUNDRVNTX1RZUEUJICBhY2Nlc3NUeXBlID0gQUNDRVNTX1RZUEVfVU5JQ0FTVDsKLSAgICAgR1RfVTMyIGRhdGFSZWFkW01BWF9JTlRFUkZBQ0VfTlVNXTsKKyAgICBHVF9VMzIgZGF0YVJlYWRbTUFYX0lOVEVSRkFDRV9OVU1dOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJJbml0Q29udHJvbGxlciwgZG9NcnNQaHk9JWQsIGlzQ3RybDY0Qml0PSVkXG4iLCBpbml0Q250clBybS0+ZG9NcnNQaHksIGluaXRDbnRyUHJtLT5pc0N0cmw2NEJpdCkpOwogCkBAIC00NzcsNyArNTQ2LDcgQEAKICAgICAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAgICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJhY3RpdmUgSUYgJWRcbiIsIGludGVyZmFjZUlkKSk7CiAgICAgICAgICAgICBtZW1NYXNrID0gMDsKLSAgICAgICAgICAgIGZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKSA7IGJ1c0luZGV4KyspCisgICAgICAgICAgICBmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJbmRleCsrKQogICAgICAgICAgICAgewogICAgICAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0luZGV4KQogICAgICAgICAgICAgICAgIG1lbU1hc2sgfD0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzSW5kZXhdLm1pcnJvckVuYWJsZUJpdG1hc2s7CkBAIC01MDgsNyArNTc3LDcgQEAKICAgICAgICAgICAgIC8qIFNSTW9kZSAqLwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIGRhdGFWYWx1ZSwgMHgxMDBGRkZGKSk7CiAKLQkJCS8qIEludHJsZWF2ZSBmaXJzdCBjb21tYW5kIHByZS1jaGFyZ2UgZW5hYmxlIChUQkQpICovCisgICAgICAgICAgICAvKiBJbnRlcmxlYXZlIGZpcnN0IGNvbW1hbmQgcHJlLWNoYXJnZSBlbmFibGUgKFRCRCkgKi8KICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX09QRU5fUEFHRV9DT05UUk9MX1JFRywgKDEgPDwgMTApLCAoMSA8PCAxMCkpKTsKIAogICAgICAgICAgICAgLyogUEhZIGNvbmZpZ3VyYXRpb24qLwpAQCAtNTMxLDExICs2MDAsMTMgQEAKIAogICAgICAgICAgICAgLypQYWQgY2FsaWJyYXRpb24gY29udHJvbCAtIGVuYWJsZSovCiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBDQUxJQl9NQUNISU5FX0NUUkxfUkVHLCAweDEsIDB4MSkpOwotI2lmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAmJiAhZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSAmJiAhZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgICAgICAgICAvKiBERFIzX1JhbmtfQ29udHJvbCBcOTYgUGFydCBvZiB0aGUgR2VuZXJpYyBjb2RlICovCi0gICAgICAgICAgICAvKjogQ1MxIE1pcnJvcmluZyBlbmFibGUgKyB3L2EgZm9yIEpJUkEgRFVOSVQtMTQ1ODEgKi8gCi0gICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBSQU5LX0NUUkxfUkVHLCAweDI3LCBNQVNLX0FMTF9CSVRTKSk7Ci0jZW5kaWYKKworCQkJaWYgKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA8IE1WX1RJUF9SRVZfMyl7CisJCSAgICAgICAgLyogRERSM19SYW5rX0NvbnRyb2wgXDk2IFBhcnQgb2YgdGhlIEdlbmVyaWMgY29kZSAqLworCQkgICAgICAgIC8qOiBDUzEgTWlycm9yaW5nIGVuYWJsZSArIHcvYSBmb3IgSklSQSBEVU5JVC0xNDU4MSAqLworCQkgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFJBTktfQ1RSTF9SRUcsIDB4MjcsIE1BU0tfQUxMX0JJVFMpKTsKKwkJCX0KKwogICAgICAgICAgICAgY3NNYXNrID0gMDsKICAgICAgICAgICAgIGRhdGFWYWx1ZSA9IDB4NzsKICAgICAgICAgICAgIC8qIEFkZHJlc3MgY3RybCBcOTYgUGFydCBvZiB0aGUgR2VuZXJpYyBjb2RlIApAQCAtNTYxLDcgKzYzMiw3IEBACiAKICAgICAgICAgICAgIGRhdGFWYWx1ZSA9ICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5idXNXaWR0aCA9PSBCVVNfV0lEVEhfOCkgPyAwIDogMTsKICAgICAgICAgICAgIC8qIGNyZWF0ZSBtZXJnZSBjcyBtYXNrIGZvciBhbGwgY3MgYXZhaWxhYmxlIGluIGR1bml0ICovCi0gICAgICAgICAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKyAgICAgICAgICAgIGZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKQogICAgICAgICAgICAgewogICAgICAgIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKICAgICAgICAgICAgICAgICBjc01hc2sgfD0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5jc0JpdG1hc2s7CkBAIC01ODQsOSArNjU1LDExIEBACiAJICAgICAgICAgICAgY3dsVmFsID0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uY2FzV0w7CiAJICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiY2xWYWx1ZSAweCV4IGN3bFZhbCAweCV4IFxuIiwgY2xWYWx1ZSwgY3dsVmFsKSk7CiAKKyAgICAgICAgICAgICAgICB0V1IgPSBUSU1FXzJfQ0xPQ0tfQ1lDTEVTKHNwZWVkQmluVGFibGUoc3BlZWRCaW5JbmRleCxzcGVlZEJpblRhYmxlRWxlbWVudHNfdFdSKSwgdENLQ0xLKTsKKwogCSAgICAgICAgICAgIGRhdGFWYWx1ZSA9ICgoY2xNYXNrVGFibGVbY2xWYWx1ZV0gJiAweDEpIDw8IDIpIHwgKChjbE1hc2tUYWJsZVtjbFZhbHVlXSAmIDB4RSkgIDw8ICAzKTsKLQkgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjBfUkVHLCBkYXRhVmFsdWUsKDB4NyA8PCA0KSB8ICgxIDw8IDIpKSk7Ci0JCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIwX1JFRywgdHdyTWFza1RhYmxlW3RXUiArIDFdLDB4RTAwKSk7CisJICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIwX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDQpIHwgKDEgPDwgMikpKTsKKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjBfUkVHLCAodHdyTWFza1RhYmxlW3RXUiArIDFdIDw8IDkpLCAoMHg3IDw8IDkpKSk7CiAKIAkJCQkvKiBNUjE6IFNldCBSVFQgYW5kIERJQyBEZXNpZ24gR0wgdmFsdWVzIGNvbmZpZ3VyZWQgYnkgdXNlciAqLwogCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBNUjFfUkVHLCBnRGljIHwgZ1J0dE5vbSwgMHgyNjYpKTsKQEAgLTU5NywxOCArNjcwLDIxIEBACiAJICAgICAgICAgICAgMilDQVMgV3JpdGUgIExhdGVuY3kgKi8KIAkgICAgICAgICAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbF0gPDwgMyk7CiAJICAgICAgICAgICAgZGF0YVZhbHVlIHw9ICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uaW50ZXJmYWNlVGVtcCA9PSBNVl9IV1NfVEVNUF9ISUdIKSA/ICgxIDw8IDcpIDogMCk7CisJCQkJZGF0YVZhbHVlIHw9IGdSdHRXUjsKIAkgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE1SMl9SRUcsIGRhdGFWYWx1ZSAsICgweDc8PDMpIHwgKDB4MTw8NykgfCAoMHgzPDw5KSkpOwogICAgICAgICAgICAgfQogCiAJCQlkZHIzVGlwV3JpdGVPZHQoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIGNsVmFsdWUsIGN3bFZhbCk7CiAgICAgICAgICAgICBkZHIzVGlwU2V0VGltaW5nKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIGZyZXEpOwogCi0jaWYgIWRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpICYmICFkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpICYmICFkZWZpbmVkIChDT05GSUdfQVJNQURBXzM5WCkKLQkJCS8qV3JCdWZmLCBSZEJ1ZmYqLwotCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgRFVOSVRfQ09OVFJPTF9ISUdIX1JFRywgMHgxMDAwMTE5LDB4MTAwMDE3RikpOwotI2Vsc2UKLQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERVTklUX0NPTlRST0xfSElHSF9SRUcsIDB4MTc3LDB4MTAwMDE3NykpOwotI2VuZGlmCisJCQlpZiAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpIDwgTVZfVElQX1JFVl8zKXsKKwkJCQkvKldyQnVmZiwgUmRCdWZmKi8KKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBEVU5JVF9DT05UUk9MX0hJR0hfUkVHLCAweDEwMDAxMTksMHgxMDAwMTdGKSk7CisJCQl9CisJCQllbHNleworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERVTklUX0NPTlRST0xfSElHSF9SRUcsIDB4MTc3LDB4MTAwMDE3NykpOworCQkJfQorCiAJCSAgICBpZiAoaW5pdENudHJQcm0tPmlzQ3RybDY0Qml0KQogCSAgICAgIAl7CiAJICAgICAgICAvKiBkaXNhYmxlIDAuMjUgY2MgZGVsYXkgKi8KQEAgLTY0NSwyMCArNzIxLDIwIEBACiAKIAkJCS8qU2V0IEFjdGl2ZSBjb250cm9sIGZvciBPRFQgd3JpdGUgdHJhbnNhY3Rpb25zKi8KIAkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDE0OTQsIHVpT0RUQ29uZmlnLCBNQVNLX0FMTF9CSVRTKSk7Ci0jaWYgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykKLQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIDB4MTRhOCwgMHg5MDAsMHg5MDApKTsKLQkJCS8qV0E6IENvbnRyb2xzIHdoZXRoZXIgdG8gZmxvYXQgVGhlIENvbnRyb2wgcHVwcyBvdXRwdXRzIGR1cmluZyBTZWxmIFJlZnJlc2gqLwotCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgMHgxNmQwLCAwLDB4ODAwMCkpOwotI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPT0gTVZfVElQX1JFVl8zKSAvKiBBQzMvQm9iSyBvbmx5ICovCisgICAgICAgICAgICB7CisJCQkgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgMHgxNGE4LCAweDkwMCwweDkwMCkpOworCQkJICAgIC8qV0E6IENvbnRyb2xzIHdoZXRoZXIgdG8gZmxvYXQgVGhlIENvbnRyb2wgcHVwcyBvdXRwdXRzIGR1cmluZyBTZWxmIFJlZnJlc2gqLworCQkJICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIDB4MTZkMCwgMCwweDgwMDApKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCiAgICAgewogI2lmZGVmIFNUQVRJQ19BTEdPX1NVUFBPUlQKICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBTdGF0aWNJbml0Q29udHJvbGxlcihkZXZOdW0pKTsKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkIChDT05GSUdfQVJNQURBXzM5WCkKIAkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBTdGF0aWNQaHlJbml0Q29udHJvbGxlcihkZXZOdW0pKTsKLSNlbmRpZgogI2VuZGlmLypTVEFUSUNfQUxHT19TVVBQT1JUKi8KICAgICB9CiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKQEAgLTY3MCwxNiArNzQ2LDEzIEBACiAJICAgIHsKIAkgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFBhZEludihkZXZOdW0sIGludGVyZmFjZUlkKSk7CiAJICAgIH0KLSAgICAKIAotICAgIC8qUGFkIGNhbGlicmF0aW9uIGNvbnRyb2wgLSBkaXNhYmxlKi8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBDQUxJQl9NQUNISU5FX0NUUkxfUkVHLCAweDAsIDB4MSkpOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIENBTElCX01BQ0hJTkVfQ1RSTF9SRUcsIGNhbGlicmF0aW9uVXBkYXRlQ29udHJvbDw8MywgMHgzPDwzKSk7CisgICAgICAgIC8qUGFkIGNhbGlicmF0aW9uIGNvbnRyb2wgLSBkaXNhYmxlKi8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgQ0FMSUJfTUFDSElORV9DVFJMX1JFRywgMHgwLCAweDEpKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgQ0FMSUJfTUFDSElORV9DVFJMX1JFRywgY2FsaWJyYXRpb25VcGRhdGVDb250cm9sPDwzLCAweDM8PDMpKTsKICAgICB9CiAjaWZkZWYgQ09ORklHX0REUjQKLQlDSEVDS19TVEFUVVMoZGRyNFRpcENhbGlicmF0aW9uQWRqdXN0KGRldk51bSwgZGRyNFRpcENvbmZpZ3VyZVBoeVZyZWZUYXAsMSwwKSk7LypkZXZOdW0sVnJlZlRhcCxWcmVmX2VuLFBPRF9Pbmx5Ki8KLSAgICBkZHI0TW9kZVJlZ3NJbml0KGRldk51bSk7Ci0gICAgZGRyNFNkcmFtQ29uZmlnKGRldk51bSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjRUaXBDYWxpYnJhdGlvbkFkanVzdChkZXZOdW0sIDEsMCkpOy8qZGV2TnVtLFZyZWZUYXAsVnJlZl9lbixQT0RfT25seSovCiAjZW5kaWYKIAogICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwRW5hYmxlSW5pdFNlcXVlbmNlKGRldk51bSkpOwpAQCAtNzA1LDE1ICs3NzgsMTMgQEAKICAgICBNVl9IV1NfU1BFRURfQklOIHNwZWVkQmluSW5kZXg7CiAgICAgTVZfSFdTX0REUl9GUkVRIGZyZXEgPSBERFJfRlJFUV9MSU1JVDsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLQotICAgIGZyZXFWYWxbRERSX0ZSRVFfTE9XX0ZSRVFdID0gZGZzTG93RnJlcTsKLSAgICAvKm9zTWVtQ3B5KCZ0b3BvbG9neU1hcFtkZXZOdW1dLCAodm9pZCopIHRvcG9sb2d5LHNpemVvZihNVl9IV1NfVE9QT0xPR1lfTUFQKSk7Ki8KICAgICBkZHIzVGlwU2V0VG9wb2xvZ3lNYXAoZGV2TnVtLCB0b3BvbG9neU1hcFB0cik7CiAgICAgdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEdldEZpcnN0QWN0aXZlSWYoKEdUX1U4KWRldk51bSwgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssICZmaXJzdEFjdGl2ZUlmKSk7Ci0gICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiYm9hcmQgSUZfTWFzaz0weCV4IG51bU9mQnVzUGVySW50ZXJmYWNlPTB4JXhcbiIsCi0JCQkJCSAgIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UpKTsKKyAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJib2FyZCBJRl9NYXNrPTB4JXggb2N0ZXRzUGVySW50ZXJmYWNlTnVtPTB4JXhcbiIsCisJCQkJCSAgIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBvY3RldHNQZXJJbnRlcmZhY2VOdW0pKTsKIAogICAgIC8qIGlmIENMLCBDV0wgdmFsdWVzIGFyZSBtaXNzaW5nIGluIHRvcG9sb2d5IG1hcCwgdGhlbiBmaWxsIHRoZW0gYWNjb3JkaW5nIHRvIHNwZWVkYmluIHRhYmxlcyAqLwogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCkBAIC03NDIsNTAgKzgxMyw0OSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBSQU5LIENvbnRyb2wgRmxvdwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAmJiAgIWRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKSAmJiAhZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKQotc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwUmFua0NvbnRyb2woR1RfVTMyIGRldk51bSwgR1RfVTMyIGludGVyZmFjZUlkKQorc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwUmV2MlJhbmtDb250cm9sKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKIHsKICAgICBHVF9VMzIgZGF0YVZhbHVlID0gMCwgIGJ1c0NudD0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCi0gICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzQ250KyspCisgICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgewogICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAgICAgICAgIGRhdGFWYWx1ZSB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLmNzQml0bWFzazsKLSAgICAgIAorCiAgICAgICAgIGlmICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLm1pcnJvckVuYWJsZUJpdG1hc2sgPT0gR1RfVFJVRSkKLSAgICAgICAgeyAKLSAgICAgICAgLyogY2hlY2tpbmcgY3MgbWFzayBpcyBzYW1lIGFzIGNzX2JpdG1hc2sgLSBpZiBDUyBpcyBlbmFibGVkIHRoYW4gIENTKzQgYml0IGluIHdvcmQgc2hhbGwgYmUgJzEnICovCisgICAgICAgIHsKKyAgICAgICAgLyogY2hlY2tpbmcgbWlycm9yRW5hYmxlQml0bWFzayAtIGlmIG1pcnJvckVuYWJsZUJpdG1hc2sgaXMgZW5hYmxlZCAtIENTKzQgYml0IGluIHdvcmQgc2hhbGwgYmUgJzEnICovCiAgICAgICAgICAgICBpZiAoKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0uY3NCaXRtYXNrICYgMHgxKSAhPSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSB8PSAoMSA8PCA0KTsKKyAgICAgICAgICAgICAgICBkYXRhVmFsdWUgfD0gKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0ubWlycm9yRW5hYmxlQml0bWFzayA8PCA0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5jc0JpdG1hc2sgJiAweDIpICE9IDApCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGF0YVZhbHVlIHw9ICgxIDw8IDUpOworICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSB8PSAodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5taXJyb3JFbmFibGVCaXRtYXNrIDw8IDUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLmNzQml0bWFzayAmIDB4NCkgIT0gMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRhVmFsdWUgfD0gKDEgPDwgNik7CisgICAgICAgICAgICAgICAgZGF0YVZhbHVlIHw9ICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLm1pcnJvckVuYWJsZUJpdG1hc2sgPDwgNik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0uY3NCaXRtYXNrICYgMHg4KSAhPSAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSB8PSAoMSA8PCA3KTsKKyAgICAgICAgICAgICAgICBkYXRhVmFsdWUgfD0gKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0ubWlycm9yRW5hYmxlQml0bWFzayA8PCA3KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSNpZiAhZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKQotICAgIC8qIGppcnJhIENTMiBleGlzdCAqLwotICAgIGRhdGFWYWx1ZSB8PSAoMSA8PCBDUzJfRVhJU1RfQklUKTsKLSNlbmRpZgorCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgUkFOS19DVFJMX1JFRywgZGF0YVZhbHVlLCAweEZGKSk7Ci0gICAgIAorCiAgICAgcmV0dXJuIEdUX09LOwogfQotI2Vsc2UKLXN0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFJhbmtDb250cm9sKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKKworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwUmV2M1JhbmtDb250cm9sKEdUX1UzMiBkZXZOdW0sIEdUX1UzMiBpbnRlcmZhY2VJZCkKIHsKICAgICBHVF9VMzIgZGF0YVZhbHVlID0gMCwgIGJ1c0NudDsKLQlmb3IgKGJ1c0NudD0gMTsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykgeworCUdUX1UzMiBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CisKKwlmb3IgKGJ1c0NudD0gMTsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykgewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAJCWlmICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbMF0uY3NCaXRtYXNrICE9dG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzQ250XS5jc0JpdG1hc2spIHx8CiAJCQkodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbMF0ubWlycm9yRW5hYmxlQml0bWFzayAhPXRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0NudF0ubWlycm9yRW5hYmxlQml0bWFzaykpCkBAIC03OTQsMTEgKzg2NCwyNCBAQAogCX0KIAlkYXRhVmFsdWUgfD0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbMF0uY3NCaXRtYXNrOwogCWRhdGFWYWx1ZSB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1swXS5taXJyb3JFbmFibGVCaXRtYXNrIDw8IDQ7Ci0KIAlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBSQU5LX0NUUkxfUkVHLCBkYXRhVmFsdWUsIDB4RkYpKTsKLXJldHVybiBHVF9PSzsKKworICAgIHJldHVybiBHVF9PSzsKIH0KLSNlbmRpZgorCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBSYW5rQ29udHJvbChHVF9VMzIgZGV2TnVtLCBHVF9VMzIgaW50ZXJmYWNlSWQpCit7CisgICAgaWYgKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA9PSBNVl9USVBfUkVWXzIpCisgICAgeworICAgICAgICAvKiBCQzIgKi8KKyAgICAgICAgcmV0dXJuIGRkcjNUaXBSZXYyUmFua0NvbnRyb2woZGV2TnVtLCBpbnRlcmZhY2VJZCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIE90aGVyIGRldmljZXMgKi8KKyAgICAgICAgcmV0dXJuIGRkcjNUaXBSZXYzUmFua0NvbnRyb2woZGV2TnVtLCBpbnRlcmZhY2VJZCk7CisgICAgfQorfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFBBRCBJbnZlcnNlIEZsb3cKQEAgLTgxMCw4ICs4OTMsOSBAQAogKQogewogICAgIEdUX1UzMiBidXNDbnQsIGRhdGFWYWx1ZSwgY2tTd2FwUHVwQ3RybDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCi0gICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzQ250KyspCisgICAgZm9yKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgewogICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAgICAgICAgIGlmICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNDbnRdLmlzRHFzU3dhcCA9PSBHVF9UUlVFKQpAQCAtODM5LDYgKzkyMyw2OCBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FsZ29yaXRobSBwYXJhbWV0ZXJzIHZhbGlkYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX0JPT0wgbXZId3NWYWxpZGF0ZUFsZ29WYXIoR1RfVTMyIHZhbHVlLCBHVF9VMzIgZmFpbFZhbHVlLCBjaGFyKiB2YXJOYW1lKQoreworICAgIGlmKHZhbHVlID09IGZhaWxWYWx1ZSkKKyAgICB7CisgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoIkVycm9yOiAlcyBpcyBub3QgaW5pdGlhbGl6ZWQgKEFsZ28gQ29tcG9uZW50cyBWYWxpZGF0aW9uKVxuIiwgdmFyTmFtZSkpOworICAgICAgICByZXR1cm4gR1RfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEdUX1RSVUU7Cit9CisKK0dUX0JPT0wgbXZId3NWYWxpZGF0ZUFsZ29QdHIoR1RfVk9JRCogcHRyLCBHVF9WT0lEKiBmYWlsVmFsdWUsIGNoYXIqIHB0ck5hbWUpCit7CisgICAgaWYocHRyID09IGZhaWxWYWx1ZSkKKyAgICB7CisgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoIkVycm9yOiAlcyBpcyBub3QgaW5pdGlhbGl6ZWQgKEFsZ28gQ29tcG9uZW50cyBWYWxpZGF0aW9uKVxuIiwgcHRyTmFtZSkpOworICAgICAgICByZXR1cm4gR1RfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIEdUX1RSVUU7Cit9CisKK0dUX1NUQVRVUyBtdkh3c1ZhbGlkYXRlQWxnb0NvbXBvbmVudHMoR1RfVTggZGV2TnVtKQoreworICAgIEdUX0JPT0wgc3RhdHVzID0gR1RfVFJVRTsKKworICAgIC8qIGNoZWNrIERHTCBwYXJhbWV0ZXJzKi8KKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoY2tEZWxheSwgICAgIE1WX1BBUkFNU19VTkRFRklORUQsICJja0RlbGF5Iik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvVmFyKFBoeVJlZzNWYWwsICBNVl9QQVJBTVNfVU5ERUZJTkVELCAiUGh5UmVnM1ZhbCIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnUnR0Tm9tLCAgICAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdSdHROb20iKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ0RpYywgICAgICAgIE1WX1BBUkFNU19VTkRFRklORUQsICJnRGljIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvVmFyKHVpT0RUQ29uZmlnLCBNVl9QQVJBTVNfVU5ERUZJTkVELCAidWlPRFRDb25maWciKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pwcmlEYXRhLCAgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWnByaURhdGEiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pucmlEYXRhLCAgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWm5yaURhdGEiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pwcmlDdHJsLCAgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWnByaUN0cmwiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pucmlDdHJsLCAgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWm5yaUN0cmwiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pwb2R0RGF0YSwgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWnBvZHREYXRhIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvVmFyKGdabm9kdERhdGEsICBNVl9QQVJBTVNfVU5ERUZJTkVELCAiZ1pub2R0RGF0YSIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihnWnBvZHRDdHJsLCAgTVZfUEFSQU1TX1VOREVGSU5FRCwgImdacG9kdEN0cmwiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29WYXIoZ1pub2R0Q3RybCwgIE1WX1BBUkFNU19VTkRFRklORUQsICJnWm5vZHRDdHJsIik7CisKKyAgICAvKiBjaGVjayBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KKyNpZm5kZWYgQVNJQ19TSU1VTEFUSU9OCisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvUHRyKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRNdXhTZWxlY3RGdW5jLCAgICBOVUxMLCAidGlwRHVuaXRNdXhTZWxlY3RGdW5jIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvUHRyKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRXcml0ZUZ1bmMsICAgICAgICBOVUxMLCAidGlwRHVuaXRXcml0ZUZ1bmMiKTsKKyAgICBzdGF0dXMgJj0gbXZId3NWYWxpZGF0ZUFsZ29QdHIoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBEdW5pdFJlYWRGdW5jLCAgICAgICAgIE5VTEwsICJ0aXBEdW5pdFJlYWRGdW5jIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvUHRyKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jLCBOVUxMLCAidGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvUHRyKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwU2V0RnJlcURpdmlkZXJGdW5jLCAgICBOVUxMLCAidGlwU2V0RnJlcURpdmlkZXJGdW5jIik7CisgICAgc3RhdHVzICY9IG12SHdzVmFsaWRhdGVBbGdvUHRyKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0Q2xvY2tSYXRpbywgICAgICAgICBOVUxMLCAidGlwR2V0Q2xvY2tSYXRpbyIpOworI2Vsc2UKKwlkZXZOdW0gPSBkZXZOdW07IC8qIGF2b2lkIHdhcm5pbmdzICovCisjZW5kaWYKKworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1B0cihkcU1hcFRhYmxlLCBOVUxMLCAiZHFNYXBUYWJsZSIpOworICAgIHN0YXR1cyAmPSBtdkh3c1ZhbGlkYXRlQWxnb1ZhcihkZnNMb3dGcmVxLCAwLCAiZGZzTG93RnJlcSIpOworCisgICAgcmV0dXJuIChzdGF0dXMgPT0gR1RfVFJVRSkgPyBHVF9PSyA6IEdUX05PVF9JTklUSUFMSVpFRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBSdW4gVHJhaW5pbmcgRmxvdwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTICAgIG12SHdzRGRyM1RpcFJ1bkFsZwpAQCAtODQ3LDcgKzk5Myw3IEBACiAgICAgTVZfSFdTX0FMR09fVFlQRSAgICBhbGdvVHlwZQogKQogewotICAgIEdUX1NUQVRVUyAgICAgICAgICByZXRWYWwgPSBHVF9PSyAsIHJldFR1bmUgPSBHVF9PSyA7CisgICAgR1RfU1RBVFVTICAgICAgICAgIHJldFZhbCA9IEdUX09LOwogCiAjaWZkZWYgT0RUX1RFU1RfU1VQUE9SVAogICAgaWYgKGZpbmdlclRlc3QgPT0gMSkKQEAgLTg3MCw3ICsxMDE2LDcgQEAKICAgICAgICAgLyogYWRkIHRvIG1hc2sgKi8KICAgICAgICAgaWYgKGlzQWRsbENhbGliQmVmb3JlSW5pdCAhPSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBtdlByaW50Zigid2l0aCBhZGxsIGNhbGliIGJlZm9yZSBpbml0XG4iKTsKKyAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgid2l0aCBhZGxsIGNhbGliIGJlZm9yZSBpbml0XG4iKSk7CiAgICAgICAgICAgICBBZGxsQ2FsaWJyYXRpb24oZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIGZyZXEgKTsKICAgICAgICAgfQogICAgICAgICAvKiBmcmVxdWVuY3kgcGVyIGludGVyZmFjZSBpcyBub3QgcmVsZXZhbnQsIG9ubHkgaW50ZXJmYWNlIDAgKi8KQEAgLTg4MCw3ICsxMDI2LDcgQEAKICAgICB9CiAgICAgaWYgKHJldFZhbCAhPSBHVF9PSykKICAgICB7Ci0gICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoIlJ1bkFsZzogdHVuaW5nIGZhaWxlZCAlZFxuIiwgcmV0VHVuZSkpOworICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCIqKioqKioqKiAgIERSQU0gaW5pdGlhbGl6YXRpb24gRmFpbGVkIChyZXMgMHgleCkgICAqKioqKioqKlxuIiwgcmV0VmFsKSk7CiAgICAgfQogCiAgICByZXR1cm4gcmV0VmFsOwpAQCAtOTM4LDExICsxMDg0LDcgQEAKICAgICBHVF9CT09MICBlbmFibGUKICkKIHsKLSAgICBpZiAoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBEdW5pdE11eFNlbGVjdEZ1bmMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0TXV4U2VsZWN0RnVuYygoR1RfVTgpZGV2TnVtLCBlbmFibGUpOwotICAgIH0KLSAgICByZXR1cm4gR1RfRkFJTDsKKyAgICByZXR1cm4gY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBEdW5pdE11eFNlbGVjdEZ1bmMoKEdUX1U4KWRldk51bSwgZW5hYmxlKTsKIH0KIAogCkBAIC05NTksMTEgKzExMDEsNyBAQAogICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCiApCiB7Ci0gICAgaWYgKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRHVuaXRXcml0ZUZ1bmMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0V3JpdGVGdW5jKChHVF9VOClkZXZOdW0sIGludGVyZmFjZUFjY2VzcywgaW50ZXJmYWNlSWQsIHJlZ0FkZHIsIGRhdGFWYWx1ZSwgbWFzayk7Ci0gICAgfQotICAgIHJldHVybiBHVF9GQUlMOworICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0V3JpdGVGdW5jKChHVF9VOClkZXZOdW0sIGludGVyZmFjZUFjY2VzcywgaW50ZXJmYWNlSWQsIHJlZ0FkZHIsIGRhdGFWYWx1ZSwgbWFzayk7CiB9CiAKIApAQCAtOTgxLDExICsxMTE5LDcgQEAKICAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzawogKQogewotICAgIGlmIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0UmVhZEZ1bmMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0UmVhZEZ1bmMoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlQWNjZXNzLCBpbnRlcmZhY2VJZCwgcmVnQWRkciwgZGF0YSwgbWFzayk7Ci0gICAgfQotICAgIHJldHVybiBHVF9GQUlMOworICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcER1bml0UmVhZEZ1bmMoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlQWNjZXNzLCBpbnRlcmZhY2VJZCwgcmVnQWRkciwgZGF0YSwgbWFzayk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTA3MSwxMCArMTIwNSwxMSBAQAogewogICAgIEdUX1UzMiBidXNJbmRleCA9IDA7CiAgICAgR1RfVTMyIGRhdGFSZWFkW01BWF9JTlRFUkZBQ0VfTlVNXTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAJaWYgKHBoeUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpCiAJewotCQlmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0luZGV4KyspCisJCWZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSW5kZXgrKykKIAkJewogICAgICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCiAJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c0FjY2VzcyhkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJbmRleCwgcGh5VHlwZSAsIHJlZ0FkZHIsIDAsIE9wZXJhdGlvbl9SRUFEKSk7CkBAIC0xMjQyLDM0ICsxMzc3LDI3IEBACiB7CiAgICAgTVZfSFdTX1RJUF9GUkVRX0NPTkZJR19JTkZPCQlmcmVxQ29uZmlnSW5mbzsKICAgICBHVF9VMzIgYnVzQ250ID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgLyogUmVzZXQgRGl2ZXJfYiBhc3NlcnQgLT4gZGUtYXNzZXJ0Ki8KICAgICBDSEVDS19TVEFUVVMgKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9DT05GSUdVUkFUSU9OX1JFRywgMCwgMHgxMDAwMDAwMCkpOwogICAgIENIRUNLX1NUQVRVUyhod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCkpOwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fQ09ORklHVVJBVElPTl9SRUcsIDB4MTAwMDAwMDAsIDB4MTAwMDAwMDApKTsKIAotICAgIGlmIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldEZyZXFDb25maWdJbmZvRnVuYyAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jKChHVF9VOClkZXZOdW0sIGZyZXF1ZW5jeSwgJmZyZXFDb25maWdJbmZvKSk7Ci0gICAgfQotCWVsc2UKLQl7Ci0JCURFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoInRpcEdldEZyZXFDb25maWdJbmZvRnVuYyBpcyBOVUxMIikpOwotCQlyZXR1cm4gR1RfTk9UX0lOSVRJQUxJWkVEOwotCX0KLQlmb3IgKGJ1c0NudCA9IDA7IGJ1c0NudCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzQ250KyspCisgICAgQ0hFQ0tfU1RBVFVTKGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwR2V0RnJlcUNvbmZpZ0luZm9GdW5jKChHVF9VOClkZXZOdW0sIGZyZXF1ZW5jeSwgJmZyZXFDb25maWdJbmZvKSk7CisKKwlmb3IgKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgewogICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBidXNDbnQsIEREUl9QSFlfREFUQSwgQldfUEhZX1JFRywgICBmcmVxQ29uZmlnSW5mby5id1BlckZyZXEgPDwgOCAvKmZyZXFNYXNrW2Rldk51bV1bZnJlcXVlbmN5XSA8PCA4Ki8sIDB4NzAwKSk7CiAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBidXNDbnQsIEREUl9QSFlfREFUQSwgIFJBVEVfUEhZX1JFRywgIGZyZXFDb25maWdJbmZvLnJhdGVQZXJGcmVxICwgMHg3KSk7CiAgICAgfQotI2lmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAmJiAhZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLSAgICBmb3IgKGJ1c0NudCA9IDA7IGJ1c0NudCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsgYnVzQ250KyspCisKKyAgICBmb3IgKGJ1c0NudCA9IDA7IGJ1c0NudCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAgICAgewogICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgYnVzQ250LCBERFJfUEhZX0NPTlRST0wsIEJXX1BIWV9SRUcsICAgZnJlcUNvbmZpZ0luZm8uYndQZXJGcmVxIDw8IDggLypmcmVxTWFza1tkZXZOdW1dW2ZyZXF1ZW5jeV0gPDwgOCovLCAweDcwMCkpOwogICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsICBpbnRlcmZhY2VJZCwgIGJ1c0NudCwgRERSX1BIWV9DT05UUk9MLCAgUkFURV9QSFlfUkVHLCAgZnJlcUNvbmZpZ0luZm8ucmF0ZVBlckZyZXEgLCAweDcpKTsKICAgICB9Ci0jZW5kaWYKIAogICAgIC8qIERVbml0IHRvIFBoeSBkcml2ZSBwb3N0IGVkZ2UsIEFETEwgcmVzZXQgIGFzc2VydCAgZGUtYXNzZXJ0Ki8gCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBEUkFNX1BIWV9DT05GSUdVUkFUSU9OLCAwLCAoMHg4MDAwMDAwMCAgfCAweDQwMDAwMDAwKSkpOwpAQCAtMTMwMiwxMiArMTQzMCwxNCBAQAogKQogewogICAgIEdUX1UzMiBjbFZhbHVlID0gMCwgY3dsVmFsdWUgPSAwLCBtZW1NYXNrID0gMCwgZGF0YVZhbHVlID0gMCwgdEhDTEsgPSAwLCB0V1IgPSAwLCByZWZyZXNoSW50ZXJ2YWxDbnQgPSAwLCBjbnRJZCwgaW50ZXJmYWNlSWR4ID0gMDsKKyAgICBHVF9VMzIgdENLQ0xLID0gMDsKIAlHVF9VMzIgc3RhcnRJZiwgZW5kSWY7CiAgICAgR1RfVTMyIHRSRUZJID0gMDsKICAgICBHVF9CT09MIGlzRGxsT2ZmID0gR1RfRkFMU0U7CiAgICAgR1RfVTMyIGJ1c0luZGV4ID0gMCwgYWRsbFRhcCA9IDA7CiAgICAgTVZfSFdTX1NQRUVEX0JJTiAgICAgIHNwZWVkQmluSW5kZXggPSAwOwogCUdUX1UzMiAgIGNzTWFza1tNQVhfSU5URVJGQUNFX05VTV07CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRldiAlZCBhY2Nlc3MgJWQgSUYgJWQgZnJlcSAlZFxuIixkZXZOdW0gLCBhY2Nlc3NUeXBlICwgaW50ZXJmYWNlSWQgLCBmcmVxdWVuY3kpKTsKIApAQCAtMTM2MSw3ICsxNDkxLDcgQEAKICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJcbiIpKTsKICAgICBtZW1NYXNrID0gMDsKIAkvKm1vdGkgVEJEIC0gbmVlZCB0byBpbnNlcnQgbG9vcCBvbiBpbnRlcmZhY2UqLwotICAgIGZvcihidXNJbmRleD0wOyBidXNJbmRleCA8IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKSA7IGJ1c0luZGV4KyspCisgICAgZm9yKGJ1c0luZGV4PTA7IGJ1c0luZGV4IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSW5kZXgrKykKICAgICB7CiAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0luZGV4KQogICAgICAgICBtZW1NYXNrIHw9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0luZGV4XS5taXJyb3JFbmFibGVCaXRtYXNrOwpAQCAtMTM3NSw4ICsxNTA1LDkgQEAKICAgICAvKkRGUyAgLSBDTC9DV0wgcGFyYW1ldGVycyBhZnRlciBleGl0aW5nIFNSKi8KIAogICAgIC8qREZTICAtIEVudGVyIFNlbGYtUmVmcmVzaCovCi0gICAgdFdSID0gc3BlZWRCaW5UYWJsZShzcGVlZEJpbkluZGV4LHNwZWVkQmluVGFibGVFbGVtZW50c190V1IpOwotICAgIHRXUiA9ICh0V1IgLyAxMDAwKTsKKyAgICB0Q0tDTEsgPSAoTUVHQS9mcmVxVmFsW2ZyZXF1ZW5jeV0pOworICAgIHRXUiA9IFRJTUVfMl9DTE9DS19DWUNMRVMoc3BlZWRCaW5UYWJsZShzcGVlZEJpbkluZGV4LHNwZWVkQmluVGFibGVFbGVtZW50c190V1IpLCB0Q0tDTEspOworCiAgICAgLyogZGF0YVZhbHVlID0gKGNsTWFza1RhYmxlW2NsVmFsdWVdIDw8IDgpIHwgIChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDEyKSB8ICgxIDw8IDEpIHwgKDEgPDwgMikgfCAodHdyTWFza1RhYmxlW3RXUisxXSA8PCAxNik7Ki8KICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBERlNfUkVHLCAoY2xNYXNrVGFibGVbY2xWYWx1ZV0gPDwgOCkgLCAweEYwMCkpOwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERGU19SRUcsIChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDEyKSAsIDB4NzAwMCkpOwpAQCAtMTQxNSwyNCArMTU0NiwyMiBAQAogCS8qbW90aSBUQkQgLSBuZWVkIHRvIGluc2VydCBsb29wIG9uIGludGVyZmFjZSovCiAgICAgdFJFRkkgPSAodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uaW50ZXJmYWNlVGVtcCA9PSBNVl9IV1NfVEVNUF9ISUdIKSA/IFRSRUZJX0hJR0g6VFJFRklfTE9XOwogICAgIHRSRUZJICo9IDEwMDA7IC8qcHNlYyAqLworCiAgICAgLyogSENMSyBpbiBbcHNdICovCi0gICAgdEhDTEsgPSBNRUdBLyhmcmVxVmFsW2ZyZXF1ZW5jeV0vMik7CisgICAgdEhDTEsgPSBNRUdBLyhmcmVxVmFsW2ZyZXF1ZW5jeV0vY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRDbG9ja1JhdGlvKGZyZXF1ZW5jeSkpOwogICAgIHJlZnJlc2hJbnRlcnZhbENudCA9IHRSRUZJL3RIQ0xLOyAvKiBubyB1bml0cyAqLwogCiAgICAgZGF0YVZhbHVlID0gMHg0MDAwICB8IHJlZnJlc2hJbnRlcnZhbENudDsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCBkYXRhVmFsdWUsIDB4N0ZGRikpOwogCiAgICAgLyogUExMIGNvbmZpZ3VyYXRpb24gKi8KLSAgICBpZiAoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMgIT0gTlVMTCkKKyAgICAvKiBPZmVyIGIgNS8xMS0gYXNzZXJ0IEFETEwgKi8KKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCAwLCAweDYwMDAwMDAwKSk7CisgICAgLyogY29uZmlndXJlIHBsbCBkZXZpZGVyKi8KKyAgICBmb3IoaW50ZXJmYWNlSWR4ID0gc3RhcnRJZjsgaW50ZXJmYWNlSWR4IDw9IGVuZElmOyBpbnRlcmZhY2VJZHgrKykKICAgICB7Ci0JCS8qIE9mZXIgYiA1LzExLSBhc3NlcnQgQURMTCAqLwotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCAwLCAweDYwMDAwMDAwKSk7Ci0JCS8qIGNvbmZpZ3VyZSBwbGwgZGV2aWRlciovCi0JCWZvcihpbnRlcmZhY2VJZHggPSBzdGFydElmOyBpbnRlcmZhY2VJZHggPD0gZW5kSWY7IGludGVyZmFjZUlkeCsrKQotCQl7Ci0JCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkeCkKLQkJCWNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwU2V0RnJlcURpdmlkZXJGdW5jKChHVF9VOClkZXZOdW0sIGludGVyZmFjZUlkeCwgZnJlcXVlbmN5KTsKLQkJfQorICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkeCkKKyAgICAgICAgY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMoKEdUX1U4KWRldk51bSwgaW50ZXJmYWNlSWR4LCBmcmVxdWVuY3kpOwogICAgIH0KIAogICAgIC8qIFBMTCBjb25maWd1cmF0aW9uIEVuZCAqLwpAQCAtMTQ1Niw3ICsxNTg1LDcgQEAKIAogCWlmIChkZWxheUVuYWJsZSAhPSAwKQogCXsKLQkJYWRsbFRhcCA9ICBNRUdBLyhmcmVxVmFsW2ZyZXF1ZW5jeV0qNjQpOworCQlhZGxsVGFwID0gIChpc0RsbE9mZiA9PSBHVF9UUlVFKT8oMTAwMCk6KE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XSo2NCkpOwogCQlkZHIzVGlwQ21kQWRkckluaXREZWxheShkZXZOdW0sIGFkbGxUYXApOwogCX0KIApAQCAtMTQ4NSwxMiArMTYxNCw4IEBACiAgICAgZGF0YVZhbHVlID0gKChjbE1hc2tUYWJsZVtjbFZhbHVlXSAmIDB4MSkgPDwgMikgfCAoKGNsTWFza1RhYmxlW2NsVmFsdWVdICYgMHhFKSAgPDwgIDMpOwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIwX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDQpIHwgKDEgPDwgMikpKTsKICAgICAvKk1SMjogIENXTCA9IDEwICwgQXV0byBTZWxmLVJlZnJlc2ggLSBkaXNhYmxlICovCi0gICAgZGF0YVZhbHVlID0gKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMyk7Ci0gICAgLypkYXRhVmFsdWUgfD0gKDEgPDwgOSk7IHJlbW92ZWQgYnkgT2ZlciAzMS8xMAotICAgIGRhdGFWYWx1ZSB8PSAoKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmludGVyZmFjZVRlbXAgPT0gTVZfSFdTX1RFTVBfSElHSCkgPyAoMSA8PCA3KSA6IDApOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIyX1JFRywgZGF0YVZhbHVlICwgKDB4Nzw8MykgfCAoMHgxPDw3KSB8ICgweDM8PDkpKSk7Ki8KLQotCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIyX1JFRywgZGF0YVZhbHVlICwgKDB4Nzw8MykpKTsKKyAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAzKSB8IGdSdHRXUjsKKwlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE1SMl9SRUcsIGRhdGFWYWx1ZSAsICgweDc8PDMpIHwgKDB4MyA8PCA5KSkpOwogCiAgICAgZGRyM1RpcFdyaXRlT2R0KGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIGNsVmFsdWUsIGN3bFZhbHVlKTsKIApAQCAtMTUwMCw5ICsxNjI1LDkgQEAKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIwX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDQpIHwgKDEgPDwgMikpKTsKIAogICAgIC8qIHJlLXdyaXRlIENXTCAqLwotICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDMpOwotICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2ssIE1SUzJfQ01ELCBkYXRhVmFsdWUsICgweDcgPDwgMykgKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIE1SMl9SRUcsIGRhdGFWYWx1ZSwgKDB4NyA8PCAzKSkpOworICAgIGRhdGFWYWx1ZSA9IChjd2xNYXNrVGFibGVbY3dsVmFsdWVdIDw8IDMpICB8IGdSdHRXUjsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrLCBNUlMyX0NNRCwgZGF0YVZhbHVlLCAoMHg3IDw8IDMpICB8ICgweDMgPDwgOSkpKTsKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIyX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDMpIHwgKDB4MyA8PCA5KSkpOwogCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIFNEUkFNX09QRVJBVElPTl9SRUcsIDB4QzAwLCAweEYwMCkpOyAvKiBDUzAgJiBDUzEqLwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBTRFJBTV9PUEVSQVRJT05fUkVHLCAweDMsIDB4MUYpKTsgICAgIC8qIE1SMCBVcGRhdGUgQ29tbWFuZCAqLwpAQCAtMTUyMCw2ICsxNjQ1LDcgQEAKICAgICByZXR1cm4gR1RfT0s7CiB9CiAjZWxzZQorLyogZm9yIEEtMzgwL0EtMzkwICovCiBHVF9TVEFUVVMgICAgZGRyM1RpcEZyZXFTZXQKICgKICAgICBHVF9VMzIJCQkJCWRldk51bSwKQEAgLTE1MjksMjAgKzE2NTUsMjUgQEAKICkKIHsKICAgICBHVF9VMzIgY2xWYWx1ZSA9IDAsIGN3bFZhbHVlID0gMCwgbWVtTWFzayA9IDAsIGRhdGFWYWx1ZSA9IDAsIGJ1c0NudCA9IDAsIHRIQ0xLID0gMCwgdFdSID0gMCwgcmVmcmVzaEludGVydmFsQ250ID0gMCwgY250SWQ7Ci0gICAgR1RfVTMyIHRSRUZJID0gMCwgZW5kSWYsIHN0YXJ0SWY7CisgICAgR1RfVTMyIHRDS0NMSzsKKyAgICBHVF9VMzIgZW5kSWYsIHN0YXJ0SWY7CisgICAgR1RfVTMyIHRSRUZJID0gMDsKICAgICBHVF9VMzIgYnVzSW5kZXggPSAwOwogCUdUX0JPT0wgaXNEbGxPZmYgPSBHVF9GQUxTRTsKICAgICBNVl9IV1NfU1BFRURfQklOICAgICAgc3BlZWRCaW5JbmRleCA9IDA7CiAgICAgTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKICAgICBNVl9IV1NfVElQX0ZSRVFfQ09ORklHX0lORk8JCWZyZXFDb25maWdJbmZvOwogICAgIE1WX0hXU19SRVNVTFQqIGZsb3dSZXN1bHQgPSB0cmFpbmluZ1Jlc3VsdFt0cmFpbmluZ1N0YWdlXTsKLQlHVF9VMzIgYWRsbFRhcCA9IDA7CisJR1RfVTMyIGFkbGxUYXAgPSAwLCB1aVQydCwgY3NOdW07CiAJR1RfVTMyICAgY3NNYXNrW01BWF9JTlRFUkZBQ0VfTlVNXTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJkZXYgJWQgYWNjZXNzICVkIElGICVkIGZyZXEgJWRcbiIsZGV2TnVtICwgYWNjZXNzVHlwZSAsIGludGVyZmFjZUlkICwgZnJlcXVlbmN5KSk7CisKIAlpZiAoZnJlcXVlbmN5ID09IEREUl9GUkVRX0xPV19GUkVRKSB7CiAJCWlzRGxsT2ZmID0gR1RfVFJVRTsKIAl9CisKICAgICBpZiAoYWNjZXNzVHlwZSA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpCiAgICAgewogICAgICAgICBzdGFydElmID0gMDsKQEAgLTE1OTQsNyArMTcyNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiXG4iKSk7CiAgICAgICAgIG1lbU1hc2sgPSAwOwotICAgICAgICBmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSkgOyBidXNJbmRleCsrKQorICAgICAgICBmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBidXNJbmRleCsrKQogICAgICAgICB7CiAgICAgICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJbmRleCkKICAgICAgICAgICAgIG1lbU1hc2sgfD0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzSW5kZXhdLm1pcnJvckVuYWJsZUJpdG1hc2s7CkBAIC0xNjMxLDcgKzE3NjIsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAweDFBNzQsIDAgLCAoMHg3IDw8IDgpKSk7CiAjZW5kaWYKIAkJfQotICAgICAgICAgICAKKwogICAgICAgICAvKkRGUyAgLSBFbnRlciBTZWxmLVJlZnJlc2gqLwogCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERGU19SRUcsIDB4NCAsIDB4NCkpOwogCQkvKiBwb2xsaW5nIG9uIHNlbGYgcmVmcmVzaCBlbnRyeSAqLwpAQCAtMTY0MCwxOCArMTc3MSw0MSBAQAogICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiRnJlcVNldDogRERSMyBwb2xsIGZhaWxlZCBvbiBTUiBlbnRyeVxuIikpOwogICAgICAgICB9CiAKLSAgICAgICAgICAvKiBQTEwgY29uZmlndXJhdGlvbiAqLwotICAgICAgICBpZiAoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMoZGV2TnVtLCBpbnRlcmZhY2VJZCwgZnJlcXVlbmN5KTsKLSAgICAgICAgfQotICAgICAgICAvKiBQTEwgY29uZmlndXJhdGlvbiBFbmQgKi8KKwkJLyotLS0tLS0tLS0tLUNhbGN1bGF0ZSAyVCBtb2RlLS0tLS0tLS0tLS0tLS0tKi8KKwkJaWYgKG1vZGUyVCAhPSAweEZGKQorCQl7CisJCQl1aVQydCA9IG1vZGUyVDsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgQ1MgKHBlciBpbnRlcmZhY2UpKi8KKwkJCUNIRUNLX1NUQVRVUyhtdkNhbGNDc051bShkZXZOdW0sIGludGVyZmFjZUlkLCAmY3NOdW0pKTsKKwkJCXVpVDJ0ID0gKGNzTnVtID09IDEpID8gMCA6IDE7CisJCX0KKworCisJCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9JTlRFUkxFQVZFX1dBICkgPT0gR1RfVFJVRSl7CisJCQkvKklmIGNvbmZpZ3VyZWQgMToxIFJhdGlvLCB1c2UgMVQgbW9kZSovCisJCQlpZihjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldENsb2NrUmF0aW8oZnJlcXVlbmN5KSA9PSAxKXsgLypMb3cgZnJlcSovCisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fT1BFTl9QQUdFX0NPTlRST0xfUkVHLCAweDAsIDB4M0MwKSk7CisJCQkJdWlUMnQgPSAwOworCQkJfQorCQkJZWxzZXsvKm1lZGl1bSBvciB0YXJnZXQgRlJFUSovCisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgU0RSQU1fT1BFTl9QQUdFX0NPTlRST0xfUkVHLCAweDNDMCwgMHgzQzApKTsKKwkJCX0KKwkJfQorCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBERFJfQ09OVFJPTF9MT1dfUkVHLCB1aVQydCA8PCAzLDB4MyA8PCAzKSk7CisKKyAgICAgICAgLyogUExMIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBTZXRGcmVxRGl2aWRlckZ1bmMoZGV2TnVtLCBpbnRlcmZhY2VJZCwgZnJlcXVlbmN5KTsKKwogCiAJCS8qIGFkanVzdCB0UkVGSSB0byBuZXcgZnJlcXVlbmN5Ki8KLQkJdFJFRkkgPSAodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uaW50ZXJmYWNlVGVtcCA9PSBNVl9IV1NfVEVNUF9ISUdIKSA/IFRSRUZJX0xPVzpUUkVGSV9ISUdIOworCQl0UkVGSSA9ICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5pbnRlcmZhY2VUZW1wID09IE1WX0hXU19URU1QX0hJR0gpID8gVFJFRklfSElHSDpUUkVGSV9MT1c7CiAgICAgICAgIHRSRUZJICo9IDEwMDA7IC8qcHNlYyAqLworCiAgICAgICAgIC8qIEhDTEsgaW4gW3BzXSAqLwotICAgICAgICB0SENMSyA9IE1FR0EvKGZyZXFWYWxbZnJlcXVlbmN5XS8yKTsKKyAgICAgICAgdEhDTEsgPSBNRUdBLyhmcmVxVmFsW2ZyZXF1ZW5jeV0vY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRDbG9ja1JhdGlvKGZyZXF1ZW5jeSkpOwogICAgICAgICByZWZyZXNoSW50ZXJ2YWxDbnQgPSB0UkVGSS90SENMSzsgLyogbm8gdW5pdHMgKi8KICAgICAgICAgZGF0YVZhbHVlID0gMHg0MDAwICB8IHJlZnJlc2hJbnRlcnZhbENudDsKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9DT05GSUdVUkFUSU9OX1JFRywgZGF0YVZhbHVlLCAweDdGRkYpKTsKQEAgLTE2NjAsOCArMTgxNCwxMCBAQAogICAgICAgICAvKkRGUyAgLSBDTC9DV0wvV1IgcGFyYW1ldGVycyBhZnRlciBleGl0aW5nIFNSKi8KICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBERlNfUkVHLCAoY2xNYXNrVGFibGVbY2xWYWx1ZV0gPDwgOCkgLCAweEYwMCkpOyAKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBERlNfUkVHLCAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAxMikgLCAweDcwMDApKTsKLSAgICAgICAgdFdSID0gc3BlZWRCaW5UYWJsZShzcGVlZEJpbkluZGV4LHNwZWVkQmluVGFibGVFbGVtZW50c190V1IpOwotICAgICAgICB0V1IgPSAodFdSIC8gMTAwMCk7CisKKyAgICAgICAgdENLQ0xLID0gKE1FR0EvZnJlcVZhbFtmcmVxdWVuY3ldKTsKKyAgICAgICAgdFdSID0gVElNRV8yX0NMT0NLX0NZQ0xFUyhzcGVlZEJpblRhYmxlKHNwZWVkQmluSW5kZXgsc3BlZWRCaW5UYWJsZUVsZW1lbnRzX3RXUiksIHRDS0NMSyk7CisKICAgICAgICAvKiBkYXRhVmFsdWUgPSAoY2xNYXNrVGFibGVbY2xWYWx1ZV0gPDwgOCkgfCAgKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMTIpIHwgKDEgPDwgMSkgfCAoMSA8PCAyKSB8ICh0d3JNYXNrVGFibGVbdFdSKzFdIDw8IDE2KTsqLwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERGU19SRUcsICh0d3JNYXNrVGFibGVbdFdSKzFdIDw8IDE2KSAsIDB4NzAwMDApKTsKIAkKQEAgLTE2NzcsMjQgKzE4MzMsMjIgQEAKIAkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgMHgxQTc0LCBnUnR0Tm9tQ1MxICwgKDB4NyA8PCA4KSkpOwogI2VuZGlmCiAJCX0KLSAgICAgICAgLyogUmVzZXQgRGl2ZXJfYiBhc3NlcnQgLT4gZGUtYXNzZXJ0Ki8gCisgICAgICAgIC8qIFJlc2V0IERpdmVyX2IgYXNzZXJ0IC0+IGRlLWFzc2VydCovCiAgICAgICAgIENIRUNLX1NUQVRVUyAobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCAwLCAweDEwMDAwMDAwKSk7Ci0gICAgICAgIENIRUNLX1NUQVRVUyhod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCkpOyAgCisgICAgICAgIENIRUNLX1NUQVRVUyhod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxMCkpOwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFNEUkFNX0NPTkZJR1VSQVRJT05fUkVHLCAweDEwMDAwMDAwLCAweDEwMDAwMDAwKSk7CiAKICAgICAgICAgLyogQWRsbCBjb25maWd1cmF0aW9uIGZ1bmN0aW9uIG9mIHByb2Nlc3MgYW5kIEZyZXF1ZW5jeSovCi0gICAgICAgIGlmIChjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldEZyZXFDb25maWdJbmZvRnVuYyAhPSBOVUxMKQotICAgICAgICB7Ci0JCQlDSEVDS19TVEFUVVMoY29uZmlnRnVuY0luZm9bZGV2TnVtXS50aXBHZXRGcmVxQ29uZmlnSW5mb0Z1bmMoZGV2TnVtLCBmcmVxdWVuY3ksICZmcmVxQ29uZmlnSW5mbykpOwotICAgICAgICB9CisgICAgICAgIENIRUNLX1NUQVRVUyhjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEdldEZyZXFDb25maWdJbmZvRnVuYyhkZXZOdW0sIGZyZXF1ZW5jeSwgJmZyZXFDb25maWdJbmZvKSk7CisKICAgICAgICAgLyogVEJEIGNoZWNrIG1pbG81IHVzaW5nIGRldmljZSBJRCA/ICovCi0gICAgICAgIGZvciAoYnVzQ250ID0gMDsgYnVzQ250IDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNDbnQrKykKKyAgICAgICAgZm9yIChidXNDbnQgPSAwOyBidXNDbnQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0NudCsrKQogICAgICAgICB7CiAgICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgYnVzQ250LCBERFJfUEhZX0RBVEEsIDB4OTIsICAgZnJlcUNvbmZpZ0luZm8uYndQZXJGcmVxIDw8IDggLypmcmVxTWFza1tkZXZOdW1dW2ZyZXF1ZW5jeV0gPDwgOCovLCAweDcwMCkpOwogICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULCAgaW50ZXJmYWNlSWQsICBidXNDbnQsIEREUl9QSFlfREFUQSwgIDB4OTQsICBmcmVxQ29uZmlnSW5mby5yYXRlUGVyRnJlcSAsIDB4NykpOwogICAgICAgICB9Ci0gICAgICAgIC8qIERVbml0IHRvIFBoeSBkcml2ZSBwb3N0IGVkZ2UsIEFETEwgcmVzZXQgIGFzc2VydCAgZGUtYXNzZXJ0Ki8gCisgICAgICAgIC8qIERVbml0IHRvIFBoeSBkcml2ZSBwb3N0IGVkZ2UsIEFETEwgcmVzZXQgIGFzc2VydCAgZGUtYXNzZXJ0Ki8KICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBEUkFNX1BIWV9DT05GSUdVUkFUSU9OLCAwLCAoMHg4MDAwMDAwMCAgfCAweDQwMDAwMDAwKSkpOwogICAgICAgICBDSEVDS19TVEFUVVMoaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIDAsIDEwMC8oZnJlcVZhbFtmcmVxdWVuY3ldL2ZyZXFWYWxbRERSX0ZSRVFfTE9XX0ZSRVFdKSkpOwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERSQU1fUEhZX0NPTkZJR1VSQVRJT04sICgweDgwMDAwMDAwICB8IDB4NDAwMDAwMDApLCAoMHg4MDAwMDAwMCAgfCAweDQwMDAwMDAwKSkpOwpAQCAtMTcxMiw3ICsxODY2LDcgQEAKIAkJZGRyM1RpcFNldFRpbWluZyhkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBmcmVxdWVuY3kpOwogCQlpZiAoZGVsYXlFbmFibGUgIT0gMCkKIAkJewotCQkJYWRsbFRhcCA9ICBNRUdBLyhmcmVxVmFsW2ZyZXF1ZW5jeV0qNjQpOworCQkJYWRsbFRhcCA9ICAoaXNEbGxPZmYgPT0gR1RfVFJVRSk/KDEwMDApOihNRUdBLyhmcmVxVmFsW2ZyZXF1ZW5jeV0qNjQpKTsKIAkJCWRkcjNUaXBDbWRBZGRySW5pdERlbGF5KGRldk51bSwgYWRsbFRhcCk7CiAJCX0KIApAQCAtMTczNiwxNiArMTg5MCwxNiBAQAogICAgICAgICBkYXRhVmFsdWUgPSAoKGNsTWFza1RhYmxlW2NsVmFsdWVdICYgMHgxKSA8PCAyKSB8ICgoY2xNYXNrVGFibGVbY2xWYWx1ZV0gJiAweEUpICA8PCAgMyk7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIwX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDQpIHwgKDEgPDwgMikpKTsKICAgICAgICAgLypNUjI6ICBDV0wgPSAxMCAsIEF1dG8gU2VsZi1SZWZyZXNoIC0gZGlzYWJsZSAqLwotICAgICAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAzKTsKKyAgICAgICAgZGF0YVZhbHVlID0gKGN3bE1hc2tUYWJsZVtjd2xWYWx1ZV0gPDwgMykgICB8IGdSdHRXUjsKIAkJLyogbmtsZWluIDI0LjEwLjEzIC0gc2hvdWxkIG5vdCBiZSBoZXJlIC0gbGVhdmUgdmFsdWUgYXMgc2V0IGluCiAJCXRoZSBpbml0IGNvbmZpZ3VyYXRpb24gZGF0YVZhbHVlIHw9ICgxIDw8IDkpOyAKICAgICAgICAgZGF0YVZhbHVlIHw9ICgodG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uaW50ZXJmYWNlVGVtcCA9PSBNVl9IV1NfVEVNUF9ISUdIKSA/ICgxIDw8IDcpIDogMCk7CiAgICAgICAgICoqKiovCi0gICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgTVIyX1JFRywgZGF0YVZhbHVlICwgKDB4Nzw8MykpKTsgIC8qIG5rbGVpbiAyNC4xMC4xMyAtIHNlZSBhYm92ZSBjb21tZW50Ki8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBNUjJfUkVHLCBkYXRhVmFsdWUgLCAoMHg3PDwzKSB8ICgweDMgPDwgOSkpKTsgIC8qIG5rbGVpbiAyNC4xMC4xMyAtIHNlZSBhYm92ZSBjb21tZW50Ki8KICAgICAgICAgLypPRFQgVElNSU5HICovCiAgICAgICAgIGRhdGFWYWx1ZSA9ICgoY2xWYWx1ZS1jd2xWYWx1ZSsxKSA8PCA0KSB8ICAoKGNsVmFsdWUtY3dsVmFsdWUrNikgPDwgOCkgfCAgKChjbFZhbHVlLTEpIDw8IDEyKSB8ICAoKGNsVmFsdWUrNikgPDwgMTYpOwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIE9EVF9USU1JTkdfTE9XLCBkYXRhVmFsdWUsIDB4RkZGRjApKTsKLSAgICAgICAgZGF0YVZhbHVlID0gMHg3MSB8ICgoY3dsVmFsdWUgLSAxKSA8PCA4KSB8ICgoY3dsVmFsdWUrNSkgPDwgMTIpOworICAgICAgICBkYXRhVmFsdWUgPSAweDkxIHwgKChjd2xWYWx1ZSAtIDEpIDw8IDgpIHwgKChjd2xWYWx1ZSs1KSA8PCAxMik7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgT0RUX1RJTUlOR19ISV9SRUcsIGRhdGFWYWx1ZSwgMHhGRkZGKSk7CiAgICAgICAgIC8qIE9EVCBBY3RpdmUqLwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIERVTklUX09EVF9DT05UUk9MX1JFRywgMHhGLCAweEYpKTsKQEAgLTE3NTUsOSArMTkwOSw5IEBACiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIE1SMF9SRUcsIGRhdGFWYWx1ZSwgKDB4NyA8PCA0KSB8ICgxIDw8IDIpKSk7CiAKICAgICAvKiByZS13cml0ZSBDV0wgKi8KLSAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAzKTsKLSAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrLCBNUlMyX0NNRCwgZGF0YVZhbHVlLCAoMHg3IDw8IDMpICkpOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBNUjJfUkVHLCBkYXRhVmFsdWUsICgweDcgPDwgMykpKTsKKyAgICBkYXRhVmFsdWUgPSAoY3dsTWFza1RhYmxlW2N3bFZhbHVlXSA8PCAzKSAgfCBnUnR0V1I7CisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzaywgTVJTMl9DTUQsIGRhdGFWYWx1ZSwgKDB4NyA8PCAzKSB8ICgweDMgPDwgOSkpKTsKKyAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgMCwgTVIyX1JFRywgZGF0YVZhbHVlLCAoMHg3IDw8IDMpIHwgKDB4MyA8PCA5KSkpOwogCiAgICAgLyogICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBTRFJBTV9USU1JTkdfSElHSF9SRUcsIDB4M0UwMzFGODAsIDB4M0ZGRkZGRkYpKTsqLwogICAgICAgICBpZiAobWVtTWFzayAhPSAwKQpAQCAtMTc4OSw3ICsxOTQzLDcgQEAKIAlkYXRhVmFsdWUgfD0gKCgoY2xWYWx1ZS0xKT4+NCkgPDwgMjIpIHwgICgoKGNsVmFsdWUrNik+PjQpIDw8IDIzKTsKIAogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgT0RUX1RJTUlOR19MT1csIGRhdGFWYWx1ZSwgMHhGRkZGMCkpOwotICAgIGRhdGFWYWx1ZSA9IDB4NzEgfCAoKGN3bFZhbHVlIC0gMSkgPDwgOCkgfCAoKGN3bFZhbHVlKzUpIDw8IDEyKTsKKyAgICBkYXRhVmFsdWUgPSAweDkxIHwgKChjd2xWYWx1ZSAtIDEpIDw8IDgpIHwgKChjd2xWYWx1ZSs1KSA8PCAxMik7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBPRFRfVElNSU5HX0hJX1JFRywgZGF0YVZhbHVlLCAweEZGRkYpKTsKIAlpZiAob2R0QWRkaXRpb25hbCA9PSAxKSAKIAl7CkBAIC0xOTUwLDE5ICsyMTA0LDIwIEBACiApCiB7CiAgICAgR1RfVTMyIGludGVyZmFjZUlkLGJ1c051bSwgY3NCaXRtYXNrLCBkYXRhVmFsLCBjc051bTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JCWZvciAoYnVzTnVtPTA7IGJ1c051bTx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c051bSsrKQorCQlmb3IgKGJ1c051bT0wOyBidXNOdW08b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNOdW0rKykKIAkJewogICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzTnVtKQogCQkJY3NCaXRtYXNrID0gdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbYnVzTnVtXS5jc0JpdG1hc2s7CiAJCQlpZihjc0JpdG1hc2sgIT0gZWZmZWN0aXZlX2NzKQogCQkJewogICAgICAgICAgICAgICAgIGNzTnVtID0gR0VUX0NTX0ZST01fTUFTSyhjc0JpdG1hc2spOwotCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzTnVtLCBERFJfUEhZX0RBVEEsIG9mZnNldCArIENTX1JFR19WQUxVRShlZmZlY3RpdmVfY3MpLCAmZGF0YVZhbCk7Ci0gICAgCQkJbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzTnVtLCBERFJfUEhZX0RBVEEsIG9mZnNldCArIENTX1JFR19WQUxVRShjc051bSksIGRhdGFWYWwpOworCQkJCW12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzTnVtLCBERFJfUEhZX0RBVEEsIG9mZnNldCArIENTX0JZVEVfR0FQKGVmZmVjdGl2ZV9jcyksICZkYXRhVmFsKTsKKyAgICAJCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgb2Zmc2V0ICsgQ1NfQllURV9HQVAoY3NOdW0pLCBkYXRhVmFsKTsKIAkJCX0JCQkJCQogCQl9CiAJfQpAQCAtMjAwNyw1OSArMjE2Miw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1EeW5hbWljIE9EVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotR1RfU1RBVFVTICAgIGRkcjNUaXBEeW5hbWljT2R0Ci0oCi0gICAgR1RfVTMyICAgIGRldk51bSwKLSAgICBHVF9CT09MICAgYklzU2V0Ci0pICAgICAgICAgICAgICAgICAgICAgICAgICAKLXsKLSAgICBHVF9VMzIgbXIxVmFsdWUsbXIyVmFsdWUsIGludGVyZmFjZUlkOwotCi0gICAgaWYgKGJJc1NldCA9PSBHVF9UUlVFKQotICAgIHsKLSAgICAgICAgbXIxVmFsdWUgPSAweDI0OwotICAgICAgICBtcjJWYWx1ZSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG1yMVZhbHVlID0gMDsKLSAgICAgICAgbXIyVmFsdWUgPSAweDIwMDsKLSAgICB9Ci0gICAgLyogTVIxOiBzZXQgUnR0Tm9tIHRvIFJaUS82ICovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIE1SMV9SRUcsIG1yMVZhbHVlLCAweDIyNCkpOwotICAgIC8qIE1SMjogZGlzYWJsZSBkeW5hbWljIE9EVCovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIDAsIE1SMl9SRUcsIG1yMlZhbHVlLCAweDYwMCkpOwotICAgIC8qT3BlcmF0aW9uIGNvbW1hbmQqLwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBTRFJBTV9PUEVSQVRJT05fUkVHLCAweEMwMCwgMHhGMDApKTsKLSAgICAvKiBNUjEgQ29tbWFuZCAqLwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBTRFJBTV9PUEVSQVRJT05fUkVHLCAweDQsIDB4MUYpKTsKLSAgICAvKiBjaGVjayBjb250cm9sbGVyIGJhY2sgdG8gbm9ybWFsICovCi0gICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKLSAgICB7Ci0gICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgIGlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDAsIDB4MUYsIFNEUkFNX09QRVJBVElPTl9SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJXTDogRERSMyBwb2xsIGZhaWxlZCgxKSIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBNUjIgQ29tbWFuZCAqLwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBTRFJBTV9PUEVSQVRJT05fUkVHLCAweDgsIDB4MUYpKTsKLSAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQotICAgIHsKLSAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMCwgMHgxRiwgU0RSQU1fT1BFUkFUSU9OX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMOiBERFIzIHBvbGwgZmFpbGVkKDIpIikpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHVF9PSzsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogUmVzZXQgWFNCIFJlYWQgRklGTwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfU1RBVFVTICAgIGRkcjNUaXBSZXNldEZpZm9QdHIKQEAgLTIwOTUsMTcgKzIxOTcsMjQgQEAKICkKIHsKICAgICBHVF9VMzIgaW50ZXJmYWNlSWQsIHBoeUlkLGNzOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yIChwaHlJZD0wOyBwaHlJZDx0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IHBoeUlkKyspCisgICAgICAgIGZvciAocGh5SWQ9MDsgcGh5SWQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwaHlJZCsrKQogICAgICAgICB7CiAgICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwaHlJZCkKLQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBDU19SRUdfVkFMVUUoZWZmZWN0aXZlX2NzKSwgUGh5UmVnMFZhbCkpOwotICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgUkxfUEhZX1JFRyArIENTX1JFR19WQUxVRShlZmZlY3RpdmVfY3MpLCBQaHlSZWcyVmFsKSk7Ci0gICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCBSRUFEX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyBDU19SRUdfVkFMVUUoZWZmZWN0aXZlX2NzKSwgUGh5UmVnM1ZhbCkpOwotICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIENTX1JFR19WQUxVRShlZmZlY3RpdmVfY3MpLCBQaHlSZWczVmFsKSk7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBDU19CWVRFX0dBUChlZmZlY3RpdmVfY3MpLCBQaHlSZWcwVmFsKSk7CisgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIFJMX1BIWV9SRUcgKyBDU19CWVRFX0dBUChlZmZlY3RpdmVfY3MpLCBQaHlSZWcyVmFsKSk7CisgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIENTX0JZVEVfR0FQKGVmZmVjdGl2ZV9jcyksIFBoeVJlZzNWYWwpKTsKKyAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIENTX0JZVEVfR0FQKGVmZmVjdGl2ZV9jcyksIFBoeVJlZzFWYWwpKTsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgMHgxRiArIENTX1BCU19HQVAoZWZmZWN0aXZlX2NzKSwgMCkpOworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCAweDVGICsgQ1NfUEJTX0dBUChlZmZlY3RpdmVfY3MpLCAwKSk7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIDB4MTQgKyBDU19QQlNfR0FQKGVmZmVjdGl2ZV9jcyksIDApKTsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcGh5SWQsIEREUl9QSFlfREFUQSwgMHg1NCArIENTX1BCU19HQVAoZWZmZWN0aXZlX2NzKSwgMCkpOworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwaHlJZCwgRERSX1BIWV9EQVRBLCAweDE1ICsgQ1NfUEJTX0dBUChlZmZlY3RpdmVfY3MpLCAwKSk7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHBoeUlkLCBERFJfUEhZX0RBVEEsIDB4NTUgKyBDU19QQlNfR0FQKGVmZmVjdGl2ZV9jcyksIDApKTsKIAkJfQogICAgIH0KIApAQCAtMjE1Nyw5ICsyMjY2LDkgQEAKICAgICBJbml0Q250clBhcmFtICAgaW5pdENudHJQcm07CiAgICAgR1RfU1RBVFVTIHJldFZhbCA9IEdUX09LOwogCUdUX1UzMiBpbnRlcmZhY2VJZDsKLQlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKKwlHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKIAotI2lmbmRlZiBFWENMVURFX1NXSVRDSF9ERUJVRworI2lmZGVmIEREUl9WSUVXRVJfVE9PTAogCWlmKGRlYnVnVHJhaW5pbmcgPT0gREVCVUdfTEVWRUxfVFJBQ0UpCiAJCUNIRUNLX1NUQVRVUyhwcmludERldmljZUluZm8oKEdUX1U4KWRldk51bSkpOwogI2VuZGlmCkBAIC0yMTcwLDYgKzIyNzksOCBAQAogCWVmZmVjdGl2ZV9jcyA9IDA7LypTZXQgdG8gMCBhZnRlciBlYWNoIGxvb3AgdG8gYXZvaWQgaWxsZWdhbCB2YWx1ZSBtYXkgYmUgdXNlZCovCiAKICAgICBmcmVxID0gaW5pdEZyZXE7CisgICAgZnJlcVZhbFtERFJfRlJFUV9MT1dfRlJFUV0gPSBkZnNMb3dGcmVxOworCiAgICAgaWYgKGlzUGxsQmVmb3JlSW5pdCAhPSAwICkKICAgICB7CiAJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspIHsKQEAgLTIyMTIsNiArMjMyMywxNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOyAKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisjaWYgZGVmaW5lZChNVl9IV1NfUlhfSU9fQklTVCkgfHwgZGVmaW5lZChNVl9IV1NfUlhfSU9fQklTVF9FVFApCisgICAgICAgIC8qIFJ1biBSWCBJTyBCSVNUICovCisgICAgICAgIHJldFZhbCA9IG12SHdzSW9CaXN0VGVzdCgoR1RfVTgpZGV2TnVtKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBHVF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgibXZId3NJb0Jpc3RUZXN0IGZhaWx1cmUgXG4iKSk7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisjZW5kaWYKICAgICB9CiAKICNpZmRlZiBTVEFUSUNfQUxHT19TVVBQT1JUCkBAIC0yMjc1LDcgKzIzOTYsNiBAQAogCX0KIAllZmZlY3RpdmVfY3MgPSAwOy8qU2V0IHRvIDAgYWZ0ZXIgZWFjaCBsb29wIHRvIGF2b2lkIGlsbGVnYWwgdmFsdWUgbWF5IGJlIHVzZWQqLwogCi0KICAgICBpZiAobWFza1R1bmVGdW5jICYgU0VUX01FRElVTV9GUkVRX01BU0tfQklUKQogICAgIHsKIAkgICB0cmFpbmluZ1N0YWdlID0gU0VUX01FRElVTV9GUkVROwpAQCAtMjM0MSw3ICsyNDYxLDcgQEAKIAkJfQogCX0KIAllZmZlY3RpdmVfY3MgPSAwOy8qU2V0IHRvIDAgYWZ0ZXIgZWFjaCBsb29wIHRvIGF2b2lkIGlsbGVnYWwgdmFsdWUgbWF5IGJlIHVzZWQqLwotCQorCiAgICAgaWYgKG1hc2tUdW5lRnVuYyAmIFJFQURfTEVWRUxJTkdfTUFTS19CSVQpCiAgICAgewogICAgICAgICB0cmFpbmluZ1N0YWdlID0gUkVBRF9MRVZFTElORzsKQEAgLTI0NDgsNiArMjU2OCw3IEBACiAJCQl9CiAJCX0KICAgICB9CisKICAgICAvKmlmIChtYXNrVHVuZUZ1bmMgJiBBREpVU1RfRFFTX01BU0tfQklUKQogICAgIHsKICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJBREpVU1RfRFFTX01BU0tfQklUXG4iKSk7CkBAIC0yNTA5LDQ2ICsyNjMwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotI2lmZGVmIENPTkZJR19ERFI0X19OT1RfVVNFRAotCWlmIChtYXNrVHVuZUZ1bmMgJiBQRVJfQklUX1JFQURfTEVWRUxJTkdfVEZfTUFTS19CSVQpCi0gICAgewotICAgICAgIHRyYWluaW5nU3RhZ2UgPSBQRVJfQklUX1JFQURfTEVWRUxJTkdfVEY7Ci0gICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJQRVJfQklUX1JFQURfTEVWRUxJTkdfVEZfTUFTS19CSVQgXG4iKSk7Ci0gICAgICAgcmV0VmFsID0gZGRyM1RpcER5bmFtaWNQZXJCaXRSZWFkTGV2ZWxpbmcoZGV2TnVtLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ZpcnN0QWN0aXZlSWZdLm1lbW9yeUZyZXEpOwotICAgICAgIGlmIChpc1JlZ0R1bXAgIT0gMCkKLSAgICAgICB7Ci0gICAgICAgICAgIGRkcjNUaXBSZWdEdW1wKGRldk51bSk7Ci0gICAgICAgfQotICAgICAgIGlmIChyZXRWYWwgIT0gR1RfT0spCi0gICAgICAgewotICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiZGRyM1RpcER5bmFtaWNQZXJCaXRSZWFkTGV2ZWxpbmcgVEYgZmFpbHVyZSBcbiIpKTsgCi0gICAgICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOyAKLSAgICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1hc2tUdW5lRnVuYyAmIFNXX1JFQURfTEVWRUxJTkdfTUFTS19CSVQpCi0gICAgewotICAgICAgICB0cmFpbmluZ1N0YWdlID0gU1dfUkVBRF9MRVZFTElORzsKLSAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJTV19SRUFEX0xFVkVMSU5HX01BU0tfQklUXG4iKSk7Ci0JCXJldFZhbCA9IGRkcjRUaXBTb2Z0d2FyZVJlYWRMZXZlbGluZyhkZXZOdW0sIG1lZGl1bUZyZXEpOwotICAgICAgICBpZiAoaXNSZWdEdW1wICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgZGRyM1RpcFJlZ0R1bXAoZGV2TnVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0VmFsICE9IEdUX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJkZHI0VGlwU29mdHdhcmVSZWFkTGV2ZWxpbmcgZmFpbHVyZSBcbiIpKTsKLSAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgPT0gR1RfRkFMU0UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLyogQ09ORklHX0REUjQgKi8KLQogI2lmZGVmIENPTkZJR19ERFIzCiAgICAgaWYgKG1hc2tUdW5lRnVuYyAmIERNX1BCU19UWF9NQVNLX0JJVCkKICAgICB7CkBAIC0yNTc4LDcgKzI2NTksNiBAQAogCQl9CiAJfQogCWVmZmVjdGl2ZV9jcyA9IDA7LypTZXQgdG8gMCBhZnRlciBlYWNoIGxvb3AgdG8gYXZvaWQgaWxsZWdhbCB2YWx1ZSBtYXkgYmUgdXNlZCovCi0KICAJZm9yKGVmZmVjdGl2ZV9jcyA9IDA7IGVmZmVjdGl2ZV9jcyA8IG1heF9jczsgZWZmZWN0aXZlX2NzKyspewogCSAgICBpZiAobWFza1R1bmVGdW5jICYgQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQpCiAJCSB7CkBAIC0yNjI2LDc5ICsyNzA2LDcgQEAKIAogI2lmZGVmIENPTkZJR19ERFI0CiAJZm9yKGVmZmVjdGl2ZV9jcyA9IDA7IGVmZmVjdGl2ZV9jcyA8IG1heF9jczsgZWZmZWN0aXZlX2NzKyspewotCQlpZiAobWFza1R1bmVGdW5jICYgUkVDRUlWRVJfQ0FMSUJSQVRJT05fTUFTS19CSVQpCi0JCXsKLQkJICAgdHJhaW5pbmdTdGFnZSA9IFJFQ0VJVkVSX0NBTElCUkFUSU9OOwotCQkgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJSRUNFSVZFUl9DQUxJQlJBVElPTl9NQVNLX0JJVFxuIikpOwotCQkgICAgcmV0VmFsID0gZGRyNFRpcFJlY2VpdmVyQ2FsaWJyYXRpb24oZGV2TnVtKTsKLQkJICAgIGlmIChpc1JlZ0R1bXAgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgIGRkcjNUaXBSZWdEdW1wKGRldk51bSk7Ci0JCSAgICB9Ci0JCSAgICBpZiAocmV0VmFsICE9IEdUX09LKQotCQkgICAgewotCQkgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoImRkcjRUaXBSZWNlaXZlckNhbGlicmF0aW9uIGZhaWx1cmUgXG4iKSk7Ci0JCSAgICAgICAgaWYgKGRlYnVnTW9kZSA9PSBHVF9GQUxTRSkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQlpZiAobWFza1R1bmVGdW5jICYgV0xfUEhBU0VfQ09SUkVDVElPTl9NQVNLX0JJVCkKLQkJewotCQkgICB0cmFpbmluZ1N0YWdlID0gV0xfUEhBU0VfQ09SUkVDVElPTjsKLQkJICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgiV0xfUEhBU0VfQ09SUkVDVElPTl9NQVNLX0JJVFxuIikpOwotCQkgICAgcmV0VmFsID0gZGRyNFRpcER5bmFtaWNXcml0ZUxldmVsaW5nU3VwcChkZXZOdW0pOwotCQkgICAgaWYgKGlzUmVnRHVtcCAhPSAwKQotCQkgICAgewotCQkgICAgICAgZGRyM1RpcFJlZ0R1bXAoZGV2TnVtKTsKLQkJICAgIH0KLQkJICAgIGlmIChyZXRWYWwgIT0gR1RfT0spCi0JCSAgICB7Ci0JCSAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgiZGRyNFRpcER5bmFtaWNXcml0ZUxldmVsaW5nU3VwcCBmYWlsdXJlXG4iKSk7Ci0JCSAgICAgICAgaWYgKGRlYnVnTW9kZSA9PSBHVF9GQUxTRSkKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwotCQkgICAgICAgIH0KLQkJICAgIH0KLQkJfQotCQlpZiAobWFza1R1bmVGdW5jICYgRFFfVlJFRl9DQUxJQlJBVElPTl9NQVNLX0JJVCkKLQkJewotCQkgICB0cmFpbmluZ1N0YWdlID0gRFFfVlJFRl9DQUxJQlJBVElPTjsKLQkJICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgiRFFfVlJFRl9DQUxJQlJBVElPTl9NQVNLX0JJVFxuIikpOwotCQkgICAgcmV0VmFsID0gZGRyNFRpcERxVnJlZkNhbGlicmF0aW9uKGRldk51bSk7Ci0JCSAgICBpZiAoaXNSZWdEdW1wICE9IDApCi0JCSAgICB7Ci0JCSAgICAgICBkZHIzVGlwUmVnRHVtcChkZXZOdW0pOwotCQkgICAgfQotCQkgICAgaWYgKHJldFZhbCAhPSBHVF9PSykKLQkJICAgIHsKLQkJICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJkZHI0VGlwRHFWcmVmQ2FsaWJyYXRpb24gZmFpbHVyZVxuIikpOwotCQkgICAgICAgIGlmIChkZWJ1Z01vZGUgPT0gR1RfRkFMU0UpCi0JCSAgICAgICAgewotCQkgICAgICAgICAgICByZXR1cm4gR1RfRkFJTDsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQl9Ci0JZWZmZWN0aXZlX2NzID0gMDsKLSAgICBpZiAobWFza1R1bmVGdW5jICYgRFFfTUFQUElOR19NQVNLX0JJVCkKLSAgICB7Ci0gICAgICAgdHJhaW5pbmdTdGFnZSA9IERRX01BUFBJTkc7Ci0gICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0lORk8sICgiRFFfTUFQUElOR19NQVNLX0JJVFxuIikpOwotICAgICAgICByZXRWYWwgPSBkZHI0RHFQaW5zTWFwcGluZyhkZXZOdW0pOwotICAgICAgICBpZiAoaXNSZWdEdW1wICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgZGRyM1RpcFJlZ0R1bXAoZGV2TnVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0VmFsICE9IEdUX09LKQotICAgICAgICB7Ci0gICAgICAgICAgICBERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgKCJkZHI0RHFQaW5zTWFwcGluZyBmYWlsdXJlXG4iKSk7Ci0gICAgICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgCUNIRUNLX1NUQVRVUyhkZHIzVGlwRERSNERkcjRUcmFpbmluZ01haW5GbG93KGRldk51bSkpOwogICAgIH0KICNlbmRpZgogCkBAIC0yNzczLDEwICsyNzgxLDEwIEBACiAgICAgfQogICAgIC8qIHByaW50IGxvZyAqLwogICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwUHJpbnRMb2coZGV2TnVtLCB3aW5kb3dNZW1BZGRyKSk7Ci0KKyNpZm5kZWYgTVZfSFdTX0VYQ0xVREVfREVCVUdfUFJJTlRTCiAJaWYocmV0VmFsICE9IEdUX09LKQogCQlDSEVDS19TVEFUVVMoZGRyM1RpcFByaW50U3RhYmlsaXR5TG9nKGRldk51bSkpOwotCisjZW5kaWYKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgaXNJZkZhaWwgPSBHVF9GQUxTRTsKQEAgLTI3OTQsNyArMjgwMiwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0JaWYgKChyZXRWYWw9PSBHVF9GQUlMKSB8fCAoaXNBdXRvVHVuZUZhaWwgPT0gR1RfVFJVRSkpCisJaWYgKCgocmV0VmFsICE9IEdUX09LKSAmJiAoaXNBdXRvVHVuZUZhaWwgPT0gR1RfRkFMU0UpKSB8fAorCSAgICAoKHJldFZhbCA9PSBHVF9PSykgJiYgKGlzQXV0b1R1bmVGYWlsID09IEdUX1RSVUUpKSkKKwl7CisJCS8qIGluIGNhc2UgTWFpbkZsb3cgcmVzdWx0IGFuZCB0cmFpbmluZ1Jlc3VsdCBEQiBhcmUgbm90IHN5bmNlZCB3ZSBpc3N1ZSB3YXJuaW5nIG1lc3NhZ2UKKwkJICAgdGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgdHJhaW5pbmdSZXN1bHQgREIgd2FzIG5vdCB1cGRhdGVkIGluIGEgY2FzZSBvZiBhIGZhaWx1cmUgKi8KKwkJREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfSU5GTywgKCJXYXJuaW5nOiBBbGdvcml0aG0gcmV0dXJuIHZhbHVlIGFuZCBSZXN1bHQgREIgYXJlIG5vdCBzeW5jZWQgKHJldFZhbCAweCV4ICByZXN1bHQgREIgJWQpXG4iLCByZXRWYWwsIGlzQXV0b1R1bmVGYWlsKSk7CisJfQorCisJaWYgKChyZXRWYWwgIT0gR1RfT0spIHx8IChpc0F1dG9UdW5lRmFpbCA9PSBHVF9UUlVFKSkKIAkJcmV0dXJuIEdUX0ZBSUw7CiAJZWxzZQogCQlyZXR1cm4gR1RfT0s7CkBAIC0yODA4LDM2ICsyODI0LDM3IEBACiAgICAgR1RfVTMyIGRldk51bQogKQogewotICAgR1RfQk9PTCBpc0ZhaWwgPSBHVF9GQUxTRTsKLSAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIG1lbU1hc2s9IDAgLCBidXNJbmRleCA9IDA7CisgICAgR1RfQk9PTCBpc0ZhaWwgPSBHVF9GQUxTRTsKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwLCBtZW1NYXNrPSAwICwgYnVzSW5kZXggPSAwOworICAgIEdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLSAgIC8qRW5hYmxlIGluaXQgc2VxdWVuY2UgKi8KLSAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBTRFJBTV9JTklUX0NPTlRST0xfUkVHLCAweDEsMHgxKSk7CisgICAgLypFbmFibGUgaW5pdCBzZXF1ZW5jZSAqLworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCAwLCBTRFJBTV9JTklUX0NPTlRST0xfUkVHLCAweDEsMHgxKSk7CiAKLSAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCi0gICB7Ci0gICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCisgICAgeworICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCi0gICAgICBpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAwLCAweDEsIFNEUkFNX0lOSVRfQ09OVFJPTF9SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQotICAgICAgewotICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVAoREVCVUdfTEVWRUxfRVJST1IsICgicG9sbGluZyBmYWlsZWQgSUYgJWQgXG4iLGludGVyZmFjZUlkKSk7IAotICAgICAgICAgaXNGYWlsID0gR1RfVFJVRTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgbWVtTWFzayA9IDA7Ci0gICAgICBmb3IoYnVzSW5kZXg9MDsgYnVzSW5kZXggPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSkgOyBidXNJbmRleCsrKQotICAgICAgewotICAgICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCi0gICAgICAgICAJbWVtTWFzayB8PSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5hc0J1c1BhcmFtc1tidXNJbmRleF0ubWlycm9yRW5hYmxlQml0bWFzazsKLSAgICAgIH0KLSAgICAgIGlmIChtZW1NYXNrICE9IDApCi0gICAgICB7Ci0gICAgICAgICAgLypEaXNhYmxlIE11bHRpQ1MgKi8KLSAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIGludGVyZmFjZUlkLCBDU19FTkFCTEVfUkVHLCAxPDwzLCAxPDwzKSk7Ci0gICAgICB9CisgICAgICAgIGlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDAsIDB4MSwgU0RSQU1fSU5JVF9DT05UUk9MX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAoInBvbGxpbmcgZmFpbGVkIElGICVkIFxuIixpbnRlcmZhY2VJZCkpOyAKKyAgICAgICAgICAgIGlzRmFpbCA9IEdUX1RSVUU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtZW1NYXNrID0gMDsKKyAgICAgICAgZm9yKGJ1c0luZGV4PTA7IGJ1c0luZGV4IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSW5kZXgrKykKKyAgICAgICAgeworICAgICAgICAgICAgVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSW5kZXgpCisgICAgICAgICAgICBtZW1NYXNrIHw9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0luZGV4XS5taXJyb3JFbmFibGVCaXRtYXNrOworICAgICAgICB9CisgICAgICAgIGlmIChtZW1NYXNrICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qRGlzYWJsZSBNdWx0aUNTICovCisgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfTVVMVElDQVNULCBpbnRlcmZhY2VJZCwgQ1NfRU5BQkxFX1JFRywgMTw8MywgMTw8MykpOworICAgICAgICB9CiAKLSAgIH0KLSAgIHJldHVybiAoaXNGYWlsID09IEdUX0ZBTFNFKT8gR1RfT0s6R1RfRkFJTDsKKyAgICB9CisgICAgcmV0dXJuIChpc0ZhaWwgPT0gR1RfRkFMU0UpPyBHVF9PSzpHVF9GQUlMOwogfQogCiAKQEAgLTI5ODUsMzIgKzMwMDIsMzEgQEAKIAogR1RfU1RBVFVTIG12SHdzRGRyM0NzQmFzZUFkckNhbGMoR1RfVTMyIGludGVyZmFjZUlkLCBHVF9VMzIgdWlDcywgR1RfVTMyICpjc0Jhc2VBZGRyKQogewotCi0JR1RfVTMyIHVpQ3NNZW1TaXplID0gMDsKKyAgICAgICBHVF9VMzIgdWlDc01lbVNpemUgPSAwOwogCiAjaWZkZWYgTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRQotCUdUX1UzMiBwaHlzaWNhbE1lbVNpemU7Ci0JR1RfVTMyIG1heE1lbVNpemUgPSBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFOworICAgICAgIEdUX1UzMiBwaHlzaWNhbE1lbVNpemU7CisgICAgICAgR1RfVTMyIG1heE1lbVNpemUgPSBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFOwogI2VuZGlmCiAKLQlpZiAobXZId3NEZHIzQ2FsY01lbUNzU2l6ZShpbnRlcmZhY2VJZCx1aUNzLCAmdWlDc01lbVNpemUpICE9IEdUX09LKQotCQlyZXR1cm4gR1RfRkFJTDsKKyAgICAgICBpZiAobXZId3NEZHIzQ2FsY01lbUNzU2l6ZShpbnRlcmZhY2VJZCx1aUNzLCAmdWlDc01lbVNpemUpICE9IEdUX09LKQorICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAKICNpZmRlZiBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFCi0JLyogaWYgbnVtYmVyIG9mIGFkZHJlc3MgcGlucyBkb2Vzbid0IGFsbG93IHRvIHVzZSBtYXggbWVtIHNpemUgdGhhdCBpcyBkZWZpbmVkIGluIHRvcG9sb2d5Ci0JIG1lbSBzaXplIGlzIGRlZmluZWQgYnkgTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSovCi0JcGh5c2ljYWxNZW1TaXplID0gbXZId3NtZW1TaXplIFt0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zWzBdLm1lbW9yeVNpemVdOworICAgICAgIC8qIGlmIG51bWJlciBvZiBhZGRyZXNzIHBpbnMgZG9lc24ndCBhbGxvdyB0byB1c2UgbWF4IG1lbSBzaXplIHRoYXQgaXMgZGVmaW5lZCBpbiB0b3BvbG9neQorICAgICAgICBtZW0gc2l6ZSBpcyBkZWZpbmVkIGJ5IE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkUqLworICAgICAgIHBoeXNpY2FsTWVtU2l6ZSA9ICBtdk1lbVNpemVbdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1swXS5tZW1vcnlTaXplXTsKIAotCWlmIChtdkh3c0RkcjNHZXREZXZpY2VXaWR0aCh1aUNzKSA9PSAxNikKLQkJbWF4TWVtU2l6ZSA9IE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkUgKiAyOyAvKiAxNmJpdCBtZW0gZGV2aWNlIGNhbiBiZSB0d2ljZSBtb3JlIC0gbm8gbmVlZCBpbiBsZXNzIHNpZ25pZmljYW50IHBpbiovCisgICAgICAgaWYgKG12SHdzRGRyM0dldERldmljZVdpZHRoKHVpQ3MpID09IDE2KQorICAgICAgICAgICAgICAgbWF4TWVtU2l6ZSA9IE1WX0RFVklDRV9NQVhfRFJBTV9BRERSRVNTX1NJWkUgKiAyOyAvKiAxNmJpdCBtZW0gZGV2aWNlIGNhbiBiZSB0d2ljZSBtb3JlIC0gbm8gbmVlZCBpbiBsZXNzIHNpZ25pZmljYW50IHBpbiovCiAKLQlpZiAocGh5c2ljYWxNZW1TaXplID4gbWF4TWVtU2l6ZSApewotCQl1aUNzTWVtU2l6ZSA9IG1heE1lbVNpemUgKiAobXZId3NEZHIzR2V0QnVzV2lkdGgoKSAvIG12SHdzRGRyM0dldERldmljZVdpZHRoKGludGVyZmFjZUlkKSkgOwotCQlERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9FUlJPUiwgICgiVXBkYXRlZCBQaHlzaWNhbCBNZW0gc2l6ZSBpcyBmcm9tIDB4JXggdG8gJXhcbiIsIHBoeXNpY2FsTWVtU2l6ZSwgTVZfREVWSUNFX01BWF9EUkFNX0FERFJFU1NfU0laRSkpOwotCX0KKyAgICAgICBpZiAocGh5c2ljYWxNZW1TaXplID4gbWF4TWVtU2l6ZSApeworICAgICAgICAgICAgICAgdWlDc01lbVNpemUgPSBtYXhNZW1TaXplICogKG12SHdzRGRyM0dldEJ1c1dpZHRoKCkgLyBtdkh3c0RkcjNHZXREZXZpY2VXaWR0aChpbnRlcmZhY2VJZCkpIDsKKyAgICAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQKERFQlVHX0xFVkVMX0VSUk9SLCAgKCJVcGRhdGVkIFBoeXNpY2FsIE1lbSBzaXplIGlzIGZyb20gMHgleCB0byAleFxuIiwgcGh5c2ljYWxNZW1TaXplLCBNVl9ERVZJQ0VfTUFYX0RSQU1fQUREUkVTU19TSVpFKSk7CisgICAgICAgfQogI2VuZGlmCi0JLypjYWxjdWxhdGUgQ1MgYmFzZSBhZGRyICAqLwotCSpjc0Jhc2VBZGRyID0gKCh1aUNzTWVtU2l6ZSkgKiB1aUNzKSAmIDB4RkZGRjAwMDA7Ci0JcmV0dXJuIEdUX09LOworICAgICAgIC8qY2FsY3VsYXRlIENTIGJhc2UgYWRkciAgKi8KKyAgICAgICAqY3NCYXNlQWRkciA9ICgodWlDc01lbVNpemUpICogdWlDcykgJiAweEZGRkYwMDAwOworICAgICAgIHJldHVybiBHVF9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0Jpc3QuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdCaXN0LmMKaW5kZXggMDhlOTlkNS4uZWNmZjUyYSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0Jpc3QuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nQmlzdC5jCkBAIC0xMjMsMTkgKzEyMywyMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaWZOdW0sIE9EUEdfQklTVF9ET05FLCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOwogCQkJCQlkYXRhVmFsdWUgPSByZWFkRGF0YVtpbnRlcmZhY2VOdW1dOwotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQotCQkJCQlpZiAoKGRhdGFWYWx1ZSAmIDB4MSkgPT0gMHgwKS8qaW4gU09DIHR5cGUgZGV2aWNlcyB0aGlzIGJpdCBpcyBzZWxmIGNsZWFyIHNvLCBpZiBpdCB3YXMgY2xlYXJlZCBhbGwgZ29vZCovCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSNlbHNlCi0JCQkJCWlmICgoZGF0YVZhbHVlICYgMHgxKSA9PSAweDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Jpc3RSZXNldEJpdCAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULCBpZk51bSwgT0RQR19CSVNUX0RPTkUsIChkYXRhVmFsdWUgJiAweEZGRkZGRkZFKSwgTUFTS19BTExfQklUUykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgorCQkJCQlpZiAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMyl7CisJCQkJCQlpZiAoKGRhdGFWYWx1ZSAmIDB4MSkgPT0gMHgwKS8qaW4gU09DIHR5cGUgZGV2aWNlcyB0aGlzIGJpdCBpcyBzZWxmIGNsZWFyIHNvLCBpZiBpdCB3YXMgY2xlYXJlZCBhbGwgZ29vZCovCisJCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCQkJCX0KKwkJCQkJZWxzZXsKKwkJCQkJCWlmICgoZGF0YVZhbHVlICYgMHgxKSA9PSAweDEpCisJCSAgICAgICAgICAgICAgICB7CisJCSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQmlzdFJlc2V0Qml0ICE9IDApCisJCSAgICAgICAgICAgICAgICAgICAgeworCQkgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaWZOdW0sIE9EUEdfQklTVF9ET05FLCAoZGF0YVZhbHVlICYgMHhGRkZGRkZGRSksIE1BU0tfQUxMX0JJVFMpKTsKKwkJICAgICAgICAgICAgICAgICAgICB9CisJCSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisJCSAgICAgICAgICAgICAgICB9CisJCQkJCX0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHBvbGxDbnQgPj0gTWF4UG9sbCkKICAgICAgICAgICAgICAgICB7CkBAIC0yNjIsMTkgKzI2MywyMSBAQAogCiAgICBpZiAob3BlclR5cGUgPT0gQklTVF9TVE9QKQogICAgewotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQgKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQgKENPTkZJR19BUk1BREFfMzlYKQotCSAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAgT0RQR19CSVNUX0RPTkUsICAoMSA8PCA4KSwgKDEgPDwgOCkpKTsKLSNlbHNlCi0JICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsICAoMSA8PCAzMCkgICwgKEdUX1UzMikoMHgzIDw8IDMwKSkpOwotI2VuZGlmCisJCWlmIChkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCAgT0RQR19CSVNUX0RPTkUsICAoMSA8PCA4KSwgKDEgPDwgOCkpKTsKKwkJfQorCQllbHNleworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsICAoMSA8PCAzMCkgICwgKEdUX1UzMikoMHgzIDw8IDMwKSkpOworCQl9CiAgICB9CiAgICBlbHNlCiAgICB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZCAoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBPRFBHX0JJU1RfRE9ORSwgIDEsIDEpKTsKLSNlbHNlCi0JICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCAgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsICBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsICAoR1RfVTMyKSgxIDw8IDMxKSwgKEdUX1UzMikoMSA8PCAzMSkpKTsKLSNlbmRpZgorCQlpZiAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMyl7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIE9EUEdfQklTVF9ET05FLCAgMSwgMSkpOworCQl9CisJCWVsc2V7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sICBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VJZCwgIE9EUEdfREFUQV9DT05UUk9MX1JFRywgIChHVF9VMzIpKDEgPDwgMzEpLCAoR1RfVTMyKSgxIDw8IDMxKSkpOworCQl9CiAgICB9CiAgICByZXR1cm4gR1RfT0s7CiB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nQ2VudHJhbGl6YXRpb24uYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdDZW50cmFsaXphdGlvbi5jCmluZGV4IGE2ZTg2OGEuLjAzNTk3ZWQgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdDZW50cmFsaXphdGlvbi5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdDZW50cmFsaXphdGlvbi5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAlHVF9VMzIgcHVwV2luTGVuZ3RoID0gMDsKICAgICBNVl9IV1NfU2VhcmNoRGlyZWN0aW9uIHNlYXJjaERpcklkOwogCUdUX1U4IGNvbnNUYXAgPSAobW9kZSA9PSBDRU5UUkFMX1RYKT8oNjQpOigwKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CkBAIC0xNTAsMTEgKzE1MSwxMiBAQAogICAgICAgICByZWdQaHlPZmZzZXQgPSBSRUFEX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyAoZWZmZWN0aXZlX2NzICogNCk7CiAgICAgICAgIGRpcmVjdGlvbiA9IE9QRVJfUkVBRDsKICAgICB9CisKICAgICAvKiBEQiBpbml0aWFsaXphdGlvbiAqLwogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IGJ1c0lkKyspCisgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSWQrKykKICAgICAgICAgewogICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAgICAgICAgICAgICBjZW50cmFsaXphdGlvblN0YXRlW2ludGVyZmFjZUlkXVtidXNJZF0gPSAwOwpAQCAtMTYzLDYgKzE2NSw3IEBACiAgICAgICAgICAgICBjZW50cmFsaXphdGlvblJlc3VsdFtpbnRlcmZhY2VJZF1bYnVzSWRdID0gMDsKICAgICAgICAgfQogICAgIH0KKwogICAgIC8qIHN0YXJ0IGZsb3cgKi8KICAgICBmb3IocGF0dGVybklkID0gc3RhcnRQYXR0ZXJuOyBwYXR0ZXJuSWQgPD0gZW5kUGF0dGVybiA7IHBhdHRlcm5JZCsrKQogICAgIHsKQEAgLTE3MSwxMCArMTc0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgZGlyZWN0aW9uLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAsIG1heFdpblNpemUtMSwgbWF4V2luU2l6ZS0xLCBwYXR0ZXJuSWQsIEVER0VfRlBGLCBDU19TSU5HTEUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1fTk9UX0NBUkUsIHRyYWluaW5nUmVzdWx0KTsKKwogICAgICAgICBmb3IoaW50ZXJmYWNlSWQgPSBzdGFydElmOyBpbnRlcmZhY2VJZCA8PSBlbmRJZjsgaW50ZXJmYWNlSWQrKykKICAgICAgICAgewogICAgICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDw9IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZS0xIDsgYnVzSWQrKykKKyAgICAgICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgYnVzSWQrKykKICAgICAgICAgICAgIHsKICAgICAgICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKIApAQCAtMjYwLDYgKzI2NCw3IEBACiAJCSAgICAgICAgICAgICAgICBjZW50cmFsaXphdGlvblN0YXRlW2ludGVyZmFjZUlkXVtidXNJZF0gPSAxOwogCQkgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSA9PSBHVF9GQUxTRSkKIAkJICAgICAgICAgICAgICAgIHsKKwkJCQkJCQlmbG93UmVzdWx0W2ludGVyZmFjZUlkXSA9IFRFU1RfRkFJTEVEOwogCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwogCQkgICAgICAgICAgICAgICAgfQogCQkgICAgICAgICAgICB9CkBAIC0yNjksMTMgKzI3NCwxMSBAQAogICAgIH0vKnBhdHRlcm4qLwogICAgIGZvcihpbnRlcmZhY2VJZCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkIDw9IGVuZElmOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKLSAgICAgICAgaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSA9PSAgR1RfRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CisJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisKICAgICAgICAgaXNJZkZhaWwgPSBHVF9GQUxTRTsKICAgICAgICAgZmxvd1Jlc3VsdFtpbnRlcmZhY2VJZF0gPSBURVNUX1NVQ0NFU1M7Ci0gICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDw9ICh0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UtMSkgOyBidXNJZCsrKQorICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IGJ1c0lkKyspCiAgICAgICAgIHsKICAgICAgICAgCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQogCkBAIC0zMDIsNiArMzA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY29uc1RhcCAgID0gNjQ7CiAJCQkJfQogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKiBjaGVjayBzdGF0ZXMgKi8KICAgICAgICAgICAgIGlmIChjZW50cmFsaXphdGlvblN0YXRlW2ludGVyZmFjZUlkXVtidXNJZF0gPT0gMykKICAgICAgICAgICAgIHsKQEAgLTMyMiw2ICszMjYsNyBAQAogICAgICAgICAgICAgICAgIERFQlVHX0NFTlRSQUxJWkFUSU9OX0VOR0lORShERUJVR19MRVZFTF9FUlJPUiwgKCJmYWlsLCBJRiAlZCBwdXAgJWRcbiIsIGludGVyZmFjZUlkLCBidXNJZCkpOwogICAgICAgICAgICAgICAgIGxvY2tTdWNjZXNzID0gR1RfRkFMU0U7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChsb2NrU3VjY2VzcyA9PSBHVF9UUlVFKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNlbnRyYWxpemF0aW9uUmVzdWx0W2ludGVyZmFjZUlkXVtidXNJZF0gPSAoYnVzRW5kV2luZG93W21vZGVdW2ludGVyZmFjZUlkXVtidXNJZF0gKyBidXNTdGFydFdpbmRvd1ttb2RlXVtpbnRlcmZhY2VJZF1bYnVzSWRdKS8yIC0gY29uc1RhcDsKQEAgLTM0MywxNyArMzQ4LDIwIEBACiAgICAgICAgICAgICAgICAgaXNJZkZhaWwgPSBHVF9UUlVFOwogICAgICAgICAgICAgfQogICAgICAgIH0KKwogICAgICAgIGlmIChpc0lmRmFpbCA9PSBHVF9UUlVFKQogICAgICAgIHsKICAgICAgICAgICAgZmxvd1Jlc3VsdFtpbnRlcmZhY2VJZF0gPSBURVNUX0ZBSUxFRDsKICAgICAgICB9CiAgICB9CiAKLSAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorICAgLyogcmVzdG9yZSBjcyBlbmFibGUgdmFsdWUqLworICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgIHsKLSAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkgICAgICAgIC8qIHJlc3RvcmUgY3MgZW5hYmxlIHZhbHVlKi8KKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQ1NfRU5BQkxFX1JFRywgY3NFbmFibGVSZWdWYWxbaW50ZXJmYWNlSWRdLCBNQVNLX0FMTF9CSVRTKSk7CiAgICB9CisKICAgIHJldHVybiBpc0lmRmFpbDsKIH0KIApAQCAtMzc5LDEwICszODcsMTEgQEAKICAgIAlHVF9VMzIgICBjc0VuYWJsZVJlZ1ZhbFtNQVhfSU5URVJGQUNFX05VTV07CiAJR1RfVTMyIHRlbXAgPSAwOwogICAgIGludCBQYWROdW0gPSAwOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLQlpZiggZGRyM1RpcFNwZWNpYWxSeFJ1bk9uY2VGbGFnICE9IDAgKQorCWlmKCAoZGRyM1RpcFNwZWNpYWxSeFJ1bk9uY2VGbGFnJigxPDxlZmZlY3RpdmVfY3MpKSA9PSAxPDxlZmZlY3RpdmVfY3MgKQogCQlyZXR1cm4gR1RfT0s7Ci0JZGRyM1RpcFNwZWNpYWxSeFJ1bk9uY2VGbGFnID0gMTsKKwlkZHIzVGlwU3BlY2lhbFJ4UnVuT25jZUZsYWcgfD0gMTw8ZWZmZWN0aXZlX2NzOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykKICAgICB7CkBAIC0zOTUsMzggKzQwNCwzOCBAQAogCiAgICAgbWF4V2luU2l6ZSA9IE1BWF9XSU5ET1dfU0laRV9SWDsKICAgICBkaXJlY3Rpb24gPSBPUEVSX1JFQUQ7Ci0JcGF0dGVybklkID0gUEFUVEVSTl9WUkVGOworCXBhdHRlcm5JZCA9IFBBVFRFUk5fRlVMTF9TU08xOwogCiAgICAgLyogc3RhcnQgZmxvdyAqLwogICAgIGRkcjNUaXBJcFRyYWluaW5nV3JhcHBlcihkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1fTk9UX0NBUkUsIHJlc3VsdFR5cGUsIE1WX0hXU19Db250cm9sRWxlbWVudF9BRExMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgZGlyZWN0aW9uLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCBtYXhXaW5TaXplLTEsIG1heFdpblNpemUtMSwgcGF0dGVybklkLCBFREdFX0ZQRiwgQ1NfU0lOR0xFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgdHJhaW5pbmdSZXN1bHQpOworCQkJCSAgICAgICAgICAgICAgUEFSQU1fTk9UX0NBUkUsIHJlc3VsdFR5cGUsIE1WX0hXU19Db250cm9sRWxlbWVudF9BRExMLAorCQkJCSAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgZGlyZWN0aW9uLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywKKwkJCQkgICAgICAgICAgICAgMHgwLCBtYXhXaW5TaXplLTEsIG1heFdpblNpemUtMSwgcGF0dGVybklkLCBFREdFX0ZQRiwgQ1NfU0lOR0xFLAorCQkJCSAgICAgICAgICAgICBQQVJBTV9OT1RfQ0FSRSwgdHJhaW5pbmdSZXN1bHQpOwogICAgIGZvcihpbnRlcmZhY2VJZCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkIDw9IGVuZElmOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPD0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwSWQrKykKKyAgICAgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPD0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwdXBJZCsrKQogICAgICAgICB7CiAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXBJZCkKIAogICAgICAgICAgICAgZm9yKHNlYXJjaERpcklkID0gTVZfSFdTX0xvdzJIaWdoIDsgc2VhcmNoRGlySWQgPD0gTVZfSFdTX0hpZ2gyTG93IDsgc2VhcmNoRGlySWQrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFJlYWRUcmFpbmluZ1Jlc3VsdChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cElkLCBBTExfQklUU19QRVJfUFVQLCBzZWFyY2hEaXJJZCwgIGRpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRUeXBlLCBUcmFpbmluZ0xvYWRPcGVyYXRpb25fVU5MT0FELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX1NJTkdMRSwgJnJlc3VsdFtzZWFyY2hEaXJJZF0gLCBHVF9UUlVFLCAwLCBHVF9GQUxTRSkpOwotICAgICAgICAgICAgICAgIERFQlVHX0NFTlRSQUxJWkFUSU9OX0VOR0lORShERUJVR19MRVZFTF9JTkZPLCgiU3BlY2lhbDogcGF0ICVkIElGICVkIHB1cCAlZCBSZWdzOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIscGF0dGVybklkLCBpbnRlcmZhY2VJZCwgcHVwSWQsICByZXN1bHRbc2VhcmNoRGlySWRdWzBdLHJlc3VsdFtzZWFyY2hEaXJJZF1bMV0scmVzdWx0W3NlYXJjaERpcklkXVsyXSxyZXN1bHRbc2VhcmNoRGlySWRdWzNdLHJlc3VsdFtzZWFyY2hEaXJJZF1bNF0scmVzdWx0W3NlYXJjaERpcklkXVs1XSxyZXN1bHRbc2VhcmNoRGlySWRdWzZdLHJlc3VsdFtzZWFyY2hEaXJJZF1bN10pKTsKKwkJCQlDSEVDS19TVEFUVVMoZGRyM1RpcFJlYWRUcmFpbmluZ1Jlc3VsdChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULAorCQkJCSAgICAgICAgICAgICBwdXBJZCwgQUxMX0JJVFNfUEVSX1BVUCwgc2VhcmNoRGlySWQsICBkaXJlY3Rpb24sCisJCQkJICAgICAgICAgICAgcmVzdWx0VHlwZSwgVHJhaW5pbmdMb2FkT3BlcmF0aW9uX1VOTE9BRCwKKwkJCQkgICAgICAgICAgICBDU19TSU5HTEUsICZyZXN1bHRbc2VhcmNoRGlySWRdICwgR1RfVFJVRSwgMCwgR1RfRkFMU0UpKTsKKwkJCQlERUJVR19DRU5UUkFMSVpBVElPTl9FTkdJTkUoREVCVUdfTEVWRUxfSU5GTywoIlNwZWNpYWw6IHBhdCAlZCBJRiAlZCBwdXAgJWQgUmVnczogMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XG4iLHBhdHRlcm5JZCwgaW50ZXJmYWNlSWQsIHB1cElkLCAgcmVzdWx0W3NlYXJjaERpcklkXVswXSxyZXN1bHRbc2VhcmNoRGlySWRdWzFdLHJlc3VsdFtzZWFyY2hEaXJJZF1bMl0scmVzdWx0W3NlYXJjaERpcklkXVszXSxyZXN1bHRbc2VhcmNoRGlySWRdWzRdLHJlc3VsdFtzZWFyY2hEaXJJZF1bNV0scmVzdWx0W3NlYXJjaERpcklkXVs2XSxyZXN1bHRbc2VhcmNoRGlySWRdWzddKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IoYml0SWQgPSAwOyBiaXRJZCA8IEJVU19XSURUSF9JTl9CSVRTICA7IGJpdElkKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhpcyBjb2RlIGlzIHZhbGlkIGZvciAyIGVkZ2UsIHByb2JhYmx5IG5vdCA6KCAqLwotICAgICAgICAgICAgICAgIGN1cnJlbnRTdGFydFdpbmRvd1tiaXRJZF0gPSBHRVRfVEFQX1JFU1VMVChyZXN1bHRbTVZfSFdTX0xvdzJIaWdoXVtiaXRJZF0sIEVER0VfMSk7Ci0gICAgICAgICAgICAgICAgY3VycmVudEVuZFdpbmRvd1tiaXRJZF0gPSBHRVRfVEFQX1JFU1VMVChyZXN1bHRbTVZfSFdTX0hpZ2gyTG93XVtiaXRJZF0sIEVER0VfMSk7CisJCQkJLyogY2hlY2sgaWYgdGhpcyBjb2RlIGlzIHZhbGlkIGZvciAyIGVkZ2UsIHByb2JhYmx5IG5vdCA6KCAqLworCQkJCWN1cnJlbnRTdGFydFdpbmRvd1tiaXRJZF0gPSBHRVRfVEFQX1JFU1VMVChyZXN1bHRbTVZfSFdTX0xvdzJIaWdoXVtiaXRJZF0sIEVER0VfMSk7CisJCQkJY3VycmVudEVuZFdpbmRvd1tiaXRJZF0gPSBHRVRfVEFQX1JFU1VMVChyZXN1bHRbTVZfSFdTX0hpZ2gyTG93XVtiaXRJZF0sIEVER0VfMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiggISgoZGRyM1RpcElzUHVwTG9jayhyZXN1bHRbTVZfSFdTX0xvdzJIaWdoXSwgcmVzdWx0VHlwZSkpICYmIChkZHIzVGlwSXNQdXBMb2NrKHJlc3VsdFtNVl9IV1NfSGlnaDJMb3ddLCByZXN1bHRUeXBlKSkpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERFQlVHX0NFTlRSQUxJWkFUSU9OX0VOR0lORShERUJVR19MRVZFTF9FUlJPUiwoIlNwZWNpYWw6IFB1cCBsb2NrIGZhaWwsIHBhdCAlZCBJRiAlZCBwdXAgJWQgXG4iLHBhdHRlcm5JZCwgaW50ZXJmYWNlSWQsIHB1cElkKSk7CisJCQkJREVCVUdfQ0VOVFJBTElaQVRJT05fRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCgiU3BlY2lhbDogUHVwIGxvY2sgZmFpbCwgcGF0ICVkIElGICVkIHB1cCAlZCBcbiIscGF0dGVybklkLCBpbnRlcmZhY2VJZCwgcHVwSWQpKTsKIAkJCQlyZXR1cm4gR1RfRkFJTDsKICAgICAgICAgICAgIH0KIApAQCAtNDM3LDIyICs0NDYsMjIgQEAKIAkJCXsKIAkJCQlmb3IoIGJpdElkID0gMCA7IGJpdElkIDwgQlVTX1dJRFRIX0lOX0JJVFMgOyBiaXRJZCsrKQogCQkJCXsKLQkJCQkJUGFkTnVtID0gZHFNYXBUYWJsZVtiaXRJZCtwdXBJZCpCVVNfV0lEVEhfSU5fQklUUyArIGludGVyZmFjZUlkKkJVU19XSURUSF9JTl9CSVRTKnRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZV07Ci0gICAgICAgICAgICAgICAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSWQsICBERFJfUEhZX0RBVEEsICBQQlNfUlhfUEhZX1JFRytQYWROdW0sICZ0ZW1wKSk7CisJCQkJCVBhZE51bSA9IGRxTWFwVGFibGVbYml0SWQrcHVwSWQqQlVTX1dJRFRIX0lOX0JJVFMgKyBpbnRlcmZhY2VJZCpCVVNfV0lEVEhfSU5fQklUUypvY3RldHNQZXJJbnRlcmZhY2VOdW1dOworCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cElkLCAgRERSX1BIWV9EQVRBLCAgUEJTX1JYX1BIWV9SRUcrUGFkTnVtICsgIGVmZmVjdGl2ZV9jcyAqIDB4MTAsICZ0ZW1wKSk7CiAJCQkJCXRlbXAgPSAodGVtcCArIDB4QSA+IDMxKT8oMzEpOih0ZW1wICsgMHhBKTsKLSAgICAgICAgICAgICAgIAkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULHB1cElkLCBERFJfUEhZX0RBVEEsIFBCU19SWF9QSFlfUkVHK1BhZE51bSwgdGVtcCkpOworCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QscHVwSWQsIEREUl9QSFlfREFUQSwgUEJTX1JYX1BIWV9SRUcrUGFkTnVtICsgZWZmZWN0aXZlX2NzICogMHgxMCwgdGVtcCkpOwogCQkJCX0KIAkJCQlERUJVR19DRU5UUkFMSVpBVElPTl9FTkdJTkUoREVCVUdfTEVWRUxfSU5GTywoIlNwZWNpYWw6IFBCUzo6IEkvRiMgJWQgLCBCdXMjICVkIGZpeCBhbGlnbiB0byB0aGUgTGVmdCBcbiIsIGludGVyZmFjZUlkLHB1cElkKSk7CiAJCQl9CiAKIAkJCWlmKCBjdXJyZW50RW5kV2luZG93TWluID4gMzAgKS8qQWxpZ24gcmlndGgqLwogCQkJewotICAgICAgICAgICAgICAgCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSWQsICBERFJfUEhZX0RBVEEsICBQQlNfUlhfUEhZX1JFRys0LCAmdGVtcCkpOworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSWQsICBERFJfUEhZX0RBVEEsICBQQlNfUlhfUEhZX1JFRys0ICsgZWZmZWN0aXZlX2NzICogMHgxMCwgJnRlbXApKTsKIAkJCQl0ZW1wICs9IDB4QTsKLSAgICAgICAgICAgCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QscHVwSWQsIEREUl9QSFlfREFUQSwgUEJTX1JYX1BIWV9SRUcrNCwgdGVtcCkpOwotICAgICAgICAgICAgICAgCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSWQsICBERFJfUEhZX0RBVEEsICBQQlNfUlhfUEhZX1JFRys1LCAmdGVtcCkpOworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCxpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCxwdXBJZCwgRERSX1BIWV9EQVRBLCBQQlNfUlhfUEhZX1JFRys0ICsgZWZmZWN0aXZlX2NzICogMHgxMCwgdGVtcCkpOworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgZGV2TnVtLCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgcHVwSWQsICBERFJfUEhZX0RBVEEsICBQQlNfUlhfUEhZX1JFRys1ICsgZWZmZWN0aXZlX2NzICogMHgxMCwgJnRlbXApKTsKIAkJCQl0ZW1wICs9IDB4QTsKLSAgICAgICAgICAgCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLEFDQ0VTU19UWVBFX1VOSUNBU1QsaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QscHVwSWQsIEREUl9QSFlfREFUQSwgUEJTX1JYX1BIWV9SRUcrNSwgdGVtcCkpOworCQkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfVU5JQ0FTVCxpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCxwdXBJZCwgRERSX1BIWV9EQVRBLCBQQlNfUlhfUEhZX1JFRys1ICsgZWZmZWN0aXZlX2NzICogMHgxMCwgdGVtcCkpOwogCQkJCURFQlVHX0NFTlRSQUxJWkFUSU9OX0VOR0lORShERUJVR19MRVZFTF9JTkZPLCgiU3BlY2lhbDogUEJTOjogSS9GIyAlZCAsIEJ1cyMgJWQgZml4IGFsaWduIHRvIHRoZSByaWdodCBcbiIsIGludGVyZmFjZUlkLHB1cElkKSk7CiAJCQl9CiAKQEAgLTQ5Myw2ICs1MDIsNyBAQAogKQogewogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCA9IDAsIGJ1c0lkID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAJZGV2TnVtID0gZGV2TnVtOwogCkBAIC01MDEsNyArNTExLDcgQEAKICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yKGJ1c0lkID0gMDsgYnVzSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBidXNJZCsrKQorICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICAgICAgewogICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAgICAgICAgICAgICBtdlByaW50ZigiJWQgLFxuIixjZW50cmFsaXphdGlvblN0YXRlW2ludGVyZmFjZUlkXVtidXNJZF0pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0RiLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nRGIuYwppbmRleCAwZTI5MWIxLi42YzEwYTRlIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nRGIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nRGIuYwpAQCAtMTgsNyArMTgsNiBAQAogKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKICogICAgICAgJFJldmlzaW9uOiAyMCAkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQ09ORklHX0REUjMKIAogI2luY2x1ZGUgIm12RGRyVHJhaW5pbmdJcERiLmgiCiAjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcC5oIgpAQCAtMjYsNyArMjUsMTIgQEAKICNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwRGVmLmgiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBHbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwRGJbSFdTX01BWF9ERVZJQ0VfTlVNXSA9IHtOVUxMfTsKKy8qRGV2aWNlIGF0dHJpYnV0ZXMgc3RydWN0dXJlcyovCitNVl9ERFJfREVWX0FUVFJJQlVURSBkZHJEZXZBdHRyaWJ1dGVzW0hXU19NQVhfREVWSUNFX05VTV1bTVZfQVRUUl9MQVNUXTsgIC8qIGhvbGRzIGRldmljZSBhdHRyaWJ1dGVzICovCitHVF9CT09MIGRkckRldkF0dHJJbml0RG9uZVtIV1NfTUFYX0RFVklDRV9OVU1dID0gezB9OwkvKiBkZXNjcmliZWQgd2hldGhlciBkZXZpY2UgYXR0cmlidXRlcyB3ZXJlIGluaXRpYWxpemVkICovCisKKyNpZmRlZiBDT05GSUdfRERSMworTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXBEYltIV1NfTUFYX0RFVklDRV9OVU1dID0ge05VTEx9OyAgICAgICAgICAvKiBob2xkcyBkZXZpY2UgRERSIHRvcG9sb2d5ICovCiAKIC8qIGxpc3Qgb2YgYWxsb3dlZCBmcmVxdWVuY3kgbGlzdGVkIGluIG9yZGVyIG9mIE1WX0hXU19ERFJfRlJFUSAqLwogR1RfVTMyIGZyZXFWYWxbRERSX0ZSRVFfTElNSVRdID0KQEAgLTEyNSw3ICsxMjksNyBAQAogICAgIDEsIC8qNSovCiAgICAgMiwgLyo2Ki8KICAgICAzLCAvKjcqLwotICAgIDEwLAorICAgIDQsIC8qOCovCiAgICAgMTAsCiAgICAgNSwgLyoxMCovCiAgICAgMTAsCkBAIC0zMjIsNiArMzI2LDcgQEAKIAkweEZFCiB9OwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLypSZXR1cm4gc3BlZWQgQmluIHZhbHVlIGZvciBzZWxlY3RlZCBpbmRleCBhbmQgdCogZWxlbWVudCovCiBHVF9VMzIgc3BlZWRCaW5UYWJsZQpAQCAtNDM3LDYgKzQ0Miw4NSBAQAogCX0KIH0KIAorSU5MSU5FIHN0YXRpYyBHVF9VMzIgcGF0dGVyblRhYmxlR2V0U3NvRnVsbFh0YWxrV29yZCggR1RfVTggYml0LCBHVF9VOCBpbmRleCkKK3sKKwlHVF9VOCBieXRlID0gKDEgPDwgYml0KTsKKworCWlmKCAxID09IChpbmRleCYxKSApeworCQlieXRlID0gfmJ5dGU7CisJfQorCisJcmV0dXJuIChieXRlIHx8IChieXRlPDw4KSB8fCAoYnl0ZTw8MTYpIHx8IChieXRlPDwyNCkpOworfQorCitJTkxJTkUgc3RhdGljIEdUX1UzMiBwYXR0ZXJuVGFibGVHZXRTc29YdGFsa0ZyZWVXb3JkKCBHVF9VOCBiaXQsIEdUX1U4IGluZGV4KQoreworCUdUX1U4IGJ5dGUgPSAoMSA8PCBiaXQpOworCisJaWYoIDEgPT0gKGluZGV4JjEpICl7CisJCWJ5dGUgPSAwOworCX0KKworCXJldHVybiAoYnl0ZSB8fCAoYnl0ZTw8OCkgfHwgKGJ5dGU8PDE2KSB8fCAoYnl0ZTw8MjQpKTsKK30KKworSU5MSU5FIHN0YXRpYyBHVF9VMzIgcGF0dGVyblRhYmxlR2V0SVNJV29yZCggR1RfVTggaW5kZXgpCit7CisJR1RfVTggSTAgPSAgaW5kZXglMzI7CisJR1RfVTggSTEgPSAgaW5kZXglODsKKwlHVF9VMzIJV29yZDsKKworCWlmKEkwID4gMTUpCisJeworCQlXb3JkID0gICgoSTEgPT01KXwoSTE9PTcpKT8weEZGRkZGRkZGOjB4MDsKKwl9ZWxzZXsKKwkJV29yZCA9ICAoSTEgPT02KT8weEZGRkZGRkZGOjB4MDsKKwl9CisKKwlXb3JkID0gKChJMCUxNik+Nyk/fldvcmQ6V29yZDsKKwlyZXR1cm4gV29yZDsKK30KKworSU5MSU5FIHN0YXRpYyBHVF9VMzIgcGF0dGVyblRhYmxlR2V0U3NvRnVsbFh0YWxrV29yZF8xNiggR1RfVTggYml0LCBHVF9VOCBpbmRleCkKK3sKKwlHVF9VOCBieXRlID0gKDEgPDwgYml0KTsKKworCWlmKCAxID09IChpbmRleCYxKSApeworCQlieXRlID0gfmJ5dGU7CisJfQorCisJcmV0dXJuIChieXRlIHx8IChieXRlPDw4KSB8fCAoKH5ieXRlKTw8MTYpIHx8ICgofmJ5dGUpPDwyNCkpOworfQorCitJTkxJTkUgc3RhdGljIEdUX1UzMiBwYXR0ZXJuVGFibGVHZXRTc29YdGFsa0ZyZWVXb3JkXzE2KCBHVF9VOCBiaXQsIEdUX1U4IGluZGV4KQoreworCUdUX1U4IGJ5dGUgPSAoMSA8PCBiaXQpOworCisJaWYoIDAgPT0gKChpbmRleCkmMSkgKXsKKwkJcmV0dXJuICgoYnl0ZTw8MTYpIHx8IChieXRlPDwyNCkpOworCX0KKwllbHNleworCQlyZXR1cm4gKGJ5dGUgfHwgKGJ5dGU8PDgpKTsKKwl9CisKK30KK0lOTElORSBzdGF0aWMgR1RfVTMyIHBhdHRlcm5UYWJsZUdldElTSVdvcmRfMTYoIEdUX1U4IGluZGV4KQoreworCUdUX1U4IEkwID0gIGluZGV4JTE2OworCUdUX1U4IEkxID0gIGluZGV4JTQ7CisJR1RfVTMyCVdvcmQ7CisKKwlpZihJMCA+IDcpCisJeworIAkJV29yZCA9ICggSTE+MSk/MHgwMDAwRkZGRjoweDA7CisJfWVsc2V7CisJCVdvcmQgPSAgKEkxID09Myk/MHhGRkZGMDAwMDoweDA7CisJfQorCisJV29yZCA9ICgoSTAlOCk+Myk/fldvcmQ6V29yZDsKKwlyZXR1cm4gV29yZDsKK30KKwogSU5MSU5FIHN0YXRpYyBHVF9VMzIgcGF0dGVyblRhYmxlR2V0VnJlZldvcmQoR1RfVTggaW5kZXgpCiB7CiAJaWYoIDAgPT0gKChwYXR0ZXJuVnJlZlBhdHRlcm5UYWJsZU1hcFtpbmRleC84XSA+PiAoaW5kZXglOCkpJjEpICl7CkBAIC01NDYsMTMgKzYzMCwzNiBAQAogCQljYXNlIFBBVFRFUk5fVlJFRjoKIAkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRWcmVmV29yZChpbmRleCk7CiAJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMDoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMToKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMjoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMzoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNDoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNToKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNjoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNzoKKwkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRTc29GdWxsWHRhbGtXb3JkKHR5cGUgLSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMCwgaW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTA6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTE6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTI6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTM6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTQ6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTU6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTY6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTc6CisJCQlwYXR0ZXJuID0gcGF0dGVyblRhYmxlR2V0U3NvWHRhbGtGcmVlV29yZCh0eXBlIC0gUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTAsIGluZGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fSVNJX1hUQUxLX0ZSRUU6CisJCQlwYXR0ZXJuID0gcGF0dGVyblRhYmxlR2V0SVNJV29yZCggaW5kZXgpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwYXR0ZXJuID0gMDsKIAkJCWJyZWFrOwogCQl9CiAJfQogCWVsc2V7Ci0JLyoxNmJpdCBwYXR0ZXJucyovCQorCS8qMTZiaXQgcGF0dGVybnMqLwogCQlzd2l0Y2godHlwZSl7CiAJCWNhc2UgUEFUVEVSTl9QQlMxOgogCQljYXNlIFBBVFRFUk5fUEJTMjoKQEAgLTU4OSw3ICs2OTYsMTMgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIFBBVFRFUk5fVEVTVDoKLQkJCXBhdHRlcm4gPSBQQVRURVJOXzAwODA7CisJCQkvKnBhdHRlcm4gPSBQQVRURVJOXzAwODA7Ki8KKyAgICAgICAgICAgaWYoKGluZGV4ID09IDApIHx8IChpbmRleCA9PSAzKSl7CisJCQkJcGF0dGVybiA9IDB4MDAwMDAwMDA7CisJCQl9CisJCQllbHNleworCQkJCXBhdHRlcm4gPSAweEZGRkZGRkZGOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgUEFUVEVSTl9GVUxMX1NTTzA6CiAJCQlwYXR0ZXJuID0gMHgwMDAwRkZGRjsKQEAgLTYwMiw2ICs3MTUsMjkgQEAKIAkJY2FzZSBQQVRURVJOX1ZSRUY6CiAJCQlwYXR0ZXJuID0gcGF0dGVyblRhYmxlR2V0VnJlZldvcmQxNihpbmRleCk7CiAJCQlicmVhazsKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMDoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMToKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMjoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMzoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNDoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNToKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNjoKKwkJY2FzZSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNzoKKwkJCXBhdHRlcm4gPSBwYXR0ZXJuVGFibGVHZXRTc29GdWxsWHRhbGtXb3JkXzE2KHR5cGUgLSBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMCwgaW5kZXgpOworCQkJYnJlYWs7CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTA6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTE6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTI6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTM6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTQ6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTU6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTY6CisJCWNhc2UgUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTc6CisJCQlwYXR0ZXJuID0gcGF0dGVyblRhYmxlR2V0U3NvWHRhbGtGcmVlV29yZF8xNih0eXBlIC0gUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTAsIGluZGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFBBVFRFUk5fSVNJX1hUQUxLX0ZSRUU6CisJCQlwYXR0ZXJuID0gcGF0dGVyblRhYmxlR2V0SVNJV29yZF8xNiggaW5kZXgpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwYXR0ZXJuID0gMDsKIAkJCWJyZWFrOwpAQCAtNjExLDggKzc0Nyw5IEBACiAJcmV0dXJuIHBhdHRlcm47CiB9CiAKKwogTVZfSFdTX1RPUE9MT0dZX01BUCogICAgZGRyM1RpcEdldFRvcG9sb2d5TWFwCi0oIAorKAogICAgIEdUX1UzMiAgZGV2TnVtCiApCiB7CkBAIC02MjAsNyArNzU3LDcgQEAKIH0KIAogdm9pZCAgICBkZHIzVGlwU2V0VG9wb2xvZ3lNYXAKLSggCisoCiAgICAgR1RfVTMyICBkZXZOdW0sCiAgICAgTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3kKICkKQEAgLTYzMCwzICs3NjcsNTIgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ERFIzICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRGV2aWNlIGF0dHJpYnV0ZXMgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkICAgIGRkcjNUaXBEZXZBdHRySW5pdAorKAorICAgIEdUX1UzMiAgZGV2TnVtCispCit7CisgICAgR1RfVTMyIGF0dHJJZDsKKworICAgIGZvcihhdHRySWQgPSAwOyBhdHRySWQgPCBNVl9BVFRSX0xBU1Q7IGF0dHJJZCsrKQorICAgIHsKKyAgICAgICAgZGRyRGV2QXR0cmlidXRlc1tkZXZOdW1dW2F0dHJJZF0gPSAweEZGOworICAgIH0KKworICAgIGRkckRldkF0dHJJbml0RG9uZVtkZXZOdW1dID0gR1RfVFJVRTsKK30KKworR1RfVTMyICAgIGRkcjNUaXBEZXZBdHRyR2V0CisoCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0REUl9ERVZfQVRUUklCVVRFICAgIGF0dHJJZAorKQoreworICAgIGlmKGRkckRldkF0dHJJbml0RG9uZVtkZXZOdW1dID09IEdUX0ZBTFNFKQorICAgIHsKKyAgICAgICAgZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisgICAgfQorCisgICAgcmV0dXJuIGRkckRldkF0dHJpYnV0ZXNbZGV2TnVtXVthdHRySWRdOworfQorCit2b2lkICAgIGRkcjNUaXBEZXZBdHRyU2V0CisoCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0REUl9ERVZfQVRUUklCVVRFICAgIGF0dHJJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICB2YWx1ZQorKQoreworICAgIGlmKGRkckRldkF0dHJJbml0RG9uZVtkZXZOdW1dID09IEdUX0ZBTFNFKQorICAgIHsKKyAgICAgICAgZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisgICAgfQorCisgICAgZGRyRGV2QXR0cmlidXRlc1tkZXZOdW1dW2F0dHJJZF0gPSB2YWx1ZTsKK30KKworCisKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdId0FsZ29zLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nSHdBbGdvcy5jCmluZGV4IDJkNzhhMTUuLjQ1YjZiZTQgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdId0FsZ29zLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0h3QWxnb3MuYwpAQCAtNDEsNyArNDEsNiBAQAogI2RlZmluZSBHRVRfUkRfU0FNUExFX0RFTEFZKGRhdGEsY3MpICgoZGF0YSA+PiByZFNhbXBsZU1hc2tbY3NdKSAmIDB4ZikKICNkZWZpbmUgR0VUX01BWChhcmcxLGFyZzIpIChhcmcxPGFyZzIpID8gKGFyZzIpIDogKGFyZzEpOwogCi1HVF9VMzIgY2tEZWxheSA9IChHVF9VMzIpLTEsIGNrRGVsYXlfMTYgPSAoR1RfVTMyKS0xOwogR1RfVTMyIGNhRGVsYXk7CiBHVF9CT09MCWRkcjNUaXBDZW50cmFsaXphdGlvblNraXBNaW5XaW5kb3dDaGVjayA9IEdUX0ZBTFNFOwogR1RfVTggY3VycmVudFZyZWZbTUFYX0JVU19OVU1dW01BWF9JTlRFUkZBQ0VfTlVNXSA7CkBAIC01NCw2ICs1Myw3IEBACiBHVF9VOCB2cmVmV2luZG93U2l6ZVtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOwogR1RfVTggdnJlZldpbmRvd1NpemVUaCA9IDEyOwogCitleHRlcm4gR1RfVTMyIGNrRGVsYXk7CiBleHRlcm4gTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXA7CiBleHRlcm4gR1RfVTMyIGNzTWFza1JlZ1tdOwogZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZTsKQEAgLTkxLDcgKzkxLDggQEAKICAgICBHVF9VMzIgZGF0YVZhbHVlOwogICAgIEdUX1UzMiBwdXBJbmRleDsKICAgICBHVF8zMiBtYXhQaGFzZSA9IE1JTl9WQUxVRSwgY3VycmVudFBoYXNlOwotICAgIE1WX0hXU19BQ0NFU1NfVFlQRQkgICAgYWNjZXNzVHlwZSA9IEFDQ0VTU19UWVBFX1VOSUNBU1Q7CisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICBhY2Nlc3NUeXBlID0gQUNDRVNTX1RZUEVfVU5JQ0FTVDsKKyAgICBHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBEVU5JVF9PRFRfQ09OVFJPTF9SRUcsIDAgPDwgOCwgMHgzIDw8IDgpKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIFJFQURfREFUQV9TQU1QTEVfREVMQVksIGRhdGFSZWFkLCBNQVNLX0FMTF9CSVRTKSk7CkBAIC0xMTEsOSArMTEyLDkgQEAKIAkJCXsKIAkJCQltYXhSZWFkU2FtcGxlID0gUmVhZFNhbXBsZVtjc051bV07CiAJCQl9Ci0gICAgICAgICAgICBmb3IocHVwSW5kZXg9MCA7IHB1cEluZGV4IDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBwdXBJbmRleCsrKQorICAgICAgICAgICAgZm9yKHB1cEluZGV4PTAgOyBwdXBJbmRleCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgcHVwSW5kZXgrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBwdXBJbmRleCwgRERSX1BIWV9EQVRBLCBSTF9QSFlfUkVHICsgQ1NfUkVHX1ZBTFVFKGNzTnVtKSwgJmRhdGFWYWx1ZSkpOworICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cEluZGV4LCBERFJfUEhZX0RBVEEsIFJMX1BIWV9SRUcgKyBDU19CWVRFX0dBUChjc051bSksICZkYXRhVmFsdWUpKTsKIAkJCQljdXJyZW50UGhhc2UgPSAoKEdUXzMyKWRhdGFWYWx1ZSYweEUwKT4+NjsKICAgICAgICAgICAgICAgICBpZiAoIGN1cnJlbnRQaGFzZSA+PSBtYXhQaGFzZSApCiAgICAgICAgICAgICAgICAgewpAQCAtMTcxLDE2ICsxNzIsMTggQEAKIAkvKglUaGUgVnJlZiByZWdpc3RlciBoYXZlIG5vbiBsaW5lYXIgb3JkZXIuIG5lZWQgdG8gY2hlY2sgd2hhdCB3aWxsIGJlIGluIGZ1dHVyICBwcm9qZWN0cy4gKi8KIAlHVF9VMzIgdnJlZk1hcFs4XSA9IHsxLDIsMyw0LDUsNiw3LDB9OwogCS8qCXN0YXRlIGFuZCBwYXJhbWV0ZXIgZGVmaW5pdGlvbnMgKi8KLQlHVF9VMzIgaW5pdGlhbFN0ZXAgPSBWUkVGX0lOSVRJQUxfU1RFUDsKLQlHVF9VMzIgc2Vjb25kU3RlcCA9IFZSRUZfU0VDT05EX1NURVA7LyogbmVlZCB0byBiZSBhc3NpZ24gd2l0aCBtaW51cyA/Pz8/PyAqLworCUdUX1U4ICBpbml0aWFsU3RlcCA9IFZSRUZfSU5JVElBTF9TVEVQOworCUdUX1U4ICBzZWNvbmRTdGVwID0gVlJFRl9TRUNPTkRfU1RFUDsvKiBuZWVkIHRvIGJlIGFzc2lnbiB3aXRoIG1pbnVzID8/Pz8/ICovCiAJR1RfVTMyIGFsZ29SdW5GbGFnID0gMCwgY3VycnJlbnRWcmVmID0gMDsKIAlHVF9VMzIgd2hpbGVDb3VudCA9IDA7Ci0JR1RfVTMyIHB1cCA9IDAsIGludGVyZmFjZUlkICA9IDAsIG51bVB1cCA9IDAsIFJlcCA9IDA7CisJR1RfVTMyIHB1cCA9IDAsIGludGVyZmFjZUlkICA9IDAsIG51bVB1cCA9IDA7CisgICAgR1RfVTggIHJlcCA9IDA7CiAJR1RfVTMyIGRhdGFWYWx1ZSA9IDA7CiAJR1RfVTMyIHJlZ0FkZHIgPSAweEE4OwogCUdUX1UzMiBjb3B5U3RhcnRQYXR0ZXJuLCBjb3B5RW5kUGF0dGVybjsKICAgICBNVl9IV1NfUkVTVUxUKiBmbG93UmVzdWx0ID0gZGRyM1RpcEdldFJlc3VsdFB0cih0cmFpbmluZ1N0YWdlKTsKIAlHVF9VOCByZXNbNF07CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogCUNIRUNLX1NUQVRVUyhkZHIzVGlwU3BlY2lhbFJ4KGRldk51bSkpOwogCkBAIC0xOTYsNyArMTk5LDcgQEAKIAlmb3IoaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTSA7IGludGVyZmFjZUlkKyspCiAJewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCQlmb3IocHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCQlmb3IocHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCQl7CiAJCQljdXJyZW50VnJlZltwdXBdW2ludGVyZmFjZUlkXSA9IDA7CiAJCQlsYXN0VnJlZltwdXBdW2ludGVyZmFjZUlkXSA9IDA7CkBAIC0yMTYsMTIgKzIxOSwxMiBAQAogCQlpbnRlcmZhY2VTdGF0ZVtpbnRlcmZhY2VJZF0gPSAwOwogCX0KIAotCW51bVB1cCA9IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSpNQVhfSU5URVJGQUNFX05VTTsvKlRPRE8gc2V0IG51bWJlciBvZiBhY3RpdmUgaW50ZXJmYWNlcyovCisJbnVtUHVwID0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtKk1BWF9JTlRFUkZBQ0VfTlVNOy8qVE9ETyBzZXQgbnVtYmVyIG9mIGFjdGl2ZSBpbnRlcmZhY2VzKi8KIAl3aGlsZSgoYWxnb1J1bkZsYWcgPD0gbnVtUHVwKSYod2hpbGVDb3VudDwxMCkgICkKIAl7CiAJCXdoaWxlQ291bnQrKzsKIAotCQlmb3IoUmVwID0gMSA7ICBSZXAgPCA0IDsgUmVwKyspCisJCWZvcihyZXAgPSAxIDsgIHJlcCA8IDQgOyByZXArKykKIAkJewogCQkJZGRyM1RpcENlbnRyYWxpemF0aW9uU2tpcE1pbldpbmRvd0NoZWNrID0gR1RfVFJVRTsKIAkJCWRkcjNUaXBDZW50cmFsaXphdGlvblJ4KGRldk51bSk7CkBAIC0yMzMsMTQgKzIzNiwxNCBAQAogCQkJCWlmKGludGVyZmFjZVN0YXRlW2ludGVyZmFjZUlkXSAhPSA0KQogCQkJCXsKIAkJCQkJR2V0VmFsaWRXaW5SeChkZXZOdW0sIGludGVyZmFjZUlkLCAgcmVzKTsKLQkJCQkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJCQkJCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCQkJCQl7CiAgICAgICAgCQkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAJCQkJCQlpZihwdXBTdGF0ZVtwdXBdW2ludGVyZmFjZUlkXSA9PSBWUkVGX0NPTlZFUkdFKQogCQkJCQkJewogCQkJCQkJCWNvbnRpbnVlOwogCQkJCQkJfQotCQkJCQkJY3VycmVudFZhbGlkV2luZG93W3B1cF1baW50ZXJmYWNlSWRdID0gKGN1cnJlbnRWYWxpZFdpbmRvd1twdXBdW2ludGVyZmFjZUlkXSooUmVwLTEpICsgMTAwMCpyZXNbcHVwXSkvUmVwOworCQkJCQkJY3VycmVudFZhbGlkV2luZG93W3B1cF1baW50ZXJmYWNlSWRdID0gKGN1cnJlbnRWYWxpZFdpbmRvd1twdXBdW2ludGVyZmFjZUlkXSoocmVwLTEpICsgMTAwMCpyZXNbcHVwXSkvcmVwOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtMjUwLDcgKzI1Myw3IEBACiAJCXsKICAgICAgICAJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAJCQlERUJVR19UUkFJTklOR19IV19BTEcoREVCVUdfTEVWRUxfVFJBQ0UsICgiY3VycmVudFZhbGlkV2luZG93OiBJRlsgJWQgXSAtICIsIGludGVyZmFjZUlkICkpOwotCQkJZm9yKHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJCWZvcihwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCQl7CiAJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgCQkJCURFQlVHX1RSQUlOSU5HX0hXX0FMRyhERUJVR19MRVZFTF9UUkFDRSwgKCIlZCAiLCBjdXJyZW50VmFsaWRXaW5kb3dbcHVwXVtpbnRlcmZhY2VJZF0pKTsKQEAgLTI2MSw3ICsyNjQsNyBAQAogCQlmb3IoaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykKIAkJewogCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkJCWZvcihwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJCQlmb3IocHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCQkJewogCQkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKIAkJCQlERUJVR19UUkFJTklOR19IV19BTEcoREVCVUdfTEVWRUxfVFJBQ0UsICgiSS9GWyAlZCBdLHB1cFsgJWQgXSBTVEFURSAjJWQgKCVkKVxuIiwgaW50ZXJmYWNlSWQsIHB1cCwKQEAgLTM2NSw3ICszNjgsNyBAQAogCWZvcihpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKQogCXsKICAgIAkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkJZm9yKHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJZm9yKHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAkJewogCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgRERSX1BIWV9EQVRBLCByZWdBZGRyLCAmZGF0YVZhbHVlKSk7CkBAIC0zOTgsNyArNDAxLDcgQEAKIAkvKiBDQV9kZWxheSBpcyBkZWxheWluZyB0aGUgb2YgdGhlIGVudGlyZSBjb21tYW5kICYgQWRkcmVzcyBzaWduYWxzIChpbmNsdWRlIENsb2NrIHNpZ25hbCDvv70gdG8gb3ZlcmNvbWUgREdMIGVycm9yIG9uIHRoZSBDbG9jayB2ZXJzdXMgdGhlIERRUykuICovCiAJLypDYWxjIEFETEwgVGFwKi8KIAotCWlmKCAoY2tEZWxheSA9PSAtMSkgfHwgKGNrRGVsYXlfMTYgPT0gLTEpICkKKwlpZihja0RlbGF5ID09IE1WX1BBUkFNU19VTkRFRklORUQpCiAJewogCQlERUJVR19UUkFJTklOR19IV19BTEcoREVCVUdfTEVWRUxfRVJST1IsKCJFUlJPUjogT25lIG9mIGNrRGVsYXkgdmFsdWVzIG5vdCBpbml0aWFsaXplZCEhIVxuIikpOwogCX0KQEAgLTQwNywxNSArNDEwLDkgQEAKIAl7CiAJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAJCS8qQ2FsYyBEZWxheSBwcyBpbiBBRExMIHRhcCovCi0JCWlmICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5idXNXaWR0aCA9PSBCVVNfV0lEVEhfMTYpCi0JCXsKLQkJCWNrTnVtQURMTFRhcCA9IGNrRGVsYXlfMTYvYWRsbFRhcDsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWNrTnVtQURMTFRhcCA9IGNrRGVsYXkvYWRsbFRhcDsKLQkJfQorCQlja051bUFETExUYXAgPSBja0RlbGF5L2FkbGxUYXA7CiAJCWNhTnVtQURMTFRhcCA9IGNhRGVsYXkvYWRsbFRhcDsKKwogCQlkYXRhID0gKGNrTnVtQURMTFRhcCAmIDB4M2YpICsgKChjYU51bUFETExUYXAgJiAweDNmKSA8PCAxMCk7CiAJCS8qIFNldCB0aGUgQURMTCBudW1iZXIgdG8gdGhlIENLIEFETEwgZm9yIEludGVyZmFjZXMgZm9yIGFsbCBQdXAgKi8KIAkJREVCVUdfVFJBSU5JTkdfSFdfQUxHKERFQlVHX0xFVkVMX1RSQUNFLCgiY2tOdW1BRExMVGFwICVkIGNhTnVtQURMTFRhcCAlZCBhZGxsVGFwICVkXG4iLGNrTnVtQURMTFRhcCxjYU51bUFETExUYXAsYWRsbFRhcCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0lwRW5naW5lLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nSXBFbmdpbmUuYwppbmRleCBhNTVhMmVlLi44NWQwNTQwIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nSXBFbmdpbmUuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nSXBFbmdpbmUuYwpAQCAtNjksMTMwICs2OSwyNTMgQEAKICAgICBSRVNVTFRfQ09OVFJPTF9QVVBfMl9CSVRfNF9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF8yX0JJVF81X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzJfQklUXzZfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfMl9CSVRfN19SRUcsCiAgICAgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzBfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfMV9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF8yX1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzNfUkVHLAogICAgIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF80X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzVfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfNl9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF83X1JFRywKLSAgICBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfMF9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF8xX1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzJfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfM19SRUcsCi0gICAgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzRfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfNF9CSVRfNV9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF80X0JJVF82X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzRfQklUXzdfUkVHLAorICAgIFJFU1VMVF9DT05UUk9MX1BVUF8zX0JJVF8wX1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzNfQklUXzFfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfM19CSVRfMl9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF8zX0JJVF8zX1JFRywKKyAgICBSRVNVTFRfQ09OVFJPTF9QVVBfM19CSVRfNF9SRUcsIFJFU1VMVF9DT05UUk9MX1BVUF8zX0JJVF81X1JFRywgUkVTVUxUX0NPTlRST0xfUFVQXzNfQklUXzZfUkVHLCBSRVNVTFRfQ09OVFJPTF9QVVBfM19CSVRfN19SRUcsCiB9OwogCiBHVF9VMTYgICBtYXNrUmVzdWx0c1B1cFJlZ01hcFB1cDNFQ0NbXSA9CiB7CiAgICAgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfMF9SRUcsIFJFU1VMVF9DT05UUk9MX0JZVEVfUFVQXzFfUkVHLCBSRVNVTFRfQ09OVFJPTF9CWVRFX1BVUF8yX1JFRywgUkVTVUxUX0NPTlRST0xfQllURV9QVVBfNF9SRUcsIFJFU1VMVF9DT05UUk9MX0JZVEVfUFVQXzRfUkVHCiB9OwotCSAgIAotUGF0dGVybkluZm8gcGF0dGVyblRhYmxlXzE2W10gPSAKLXsKLS8qIG51bSB0eCBwaGFzZXMgIHR4IGJ1cnN0ICAgZGVsYXkgYmV0d2VlbiAgIHJ4IHBhdHRlcm4gc3RhcnRfYWRkcmVzcyAgIHBhdHRlcm5MZW4qLwotICAgezEsICAgICAgICAgICAxLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIDB4MDA4MCwgICAgICAgICAgICAyICAgICAgfSwgLyogUEFUVEVSTl9QQlMxKi8gICAgICAgICAgICAKLSAgIHsxLCAgICAgICAgICAgMSwgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAweDAwQzAsICAgICAgICAgICAgMiAgICAgIH0sIC8qIFBBVFRFUk5fUEJTMiovICAgICAgICAgICAgCi0gICB7MSwgICAgICAgICAgIDEsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgMHgwMTAwLCAgICAgICAgICAgIDIgICAgICB9LCAvKiBQQVRURVJOX1JMKi8gICAgICAgICAgICAgIAotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwMTQwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9TVEFUSUNfUEJTKi8gICAgICAKLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDE5MCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMCovICAgICAgCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAxRDAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTEqLwotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwMjEwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEyKi8KLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDI1MCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMyovCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAyOTAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTQqLwotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwMkQwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE1Ki8KLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDMxMCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNiovCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDAzNTAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTcqLwotICAgezEsICAgICAgICAgICAxLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIDB4MDM4MCwgICAgICAgICAgICAyICAgICAgfSwgLyogUEFUVEVSTl9QQlMzKi8gICAgICAgICAgICAKLSAgIHsxLCAgICAgICAgICAgMSwgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAweDAwMDAsICAgICAgICAgICAgMiAgICAgIH0sIC8qIFBBVFRFUk5fUkwyKi8gICAgICAgICAgICAgCi0gICB7MSwgICAgICAgICAgIDEsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgMHgwMDQwLCAgICAgICAgICAgIDIgICAgICB9LCAvKiBQQVRURVJOX1RFU1QqLyAgICAgICAgICAgIAotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwM0MwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18xVCovICAgICAKLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDQwMCwgICAgICAgICAgIDE2ICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMlQqLyAgICAgCi0gICB7MHhmLCAgICAgICAweDcsICAgICAgICAgMiwgICAgICAgICAgICAgICAweDcsICAgICAgICAgICAweDA0NDAsICAgICAgICAgICAxNiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzNUKi8gICAgIAotICAgezB4ZiwgICAgICAgMHg3LCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHg3LCAgICAgICAgICAgMHgwNDgwLCAgICAgICAgICAgMTYgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT180VCovICAgICAKLSAgIHsweGYsICAgICAgIDB4NywgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4NywgICAgICAgICAgIDB4MDRDMCwgICAgICAgICAgIDE2ICAgICAgIH0gIC8qIFBBVFRFUk5fVlJFRiovCi0vKk5vdGU6IGFjdHVhbCBzdGFydF9hZGRyZXNzIGlzIDw8MyBvZiBkZWZpbmVkIGFkZGVzcyovCi19OyAgIAogCiAjaWZkZWYgQ09ORklHX0REUjMKLVBhdHRlcm5JbmZvIHBhdHRlcm5UYWJsZV8zMltdID0gCitQYXR0ZXJuSW5mbyBwYXR0ZXJuVGFibGVfMTZbXSA9CiB7CiAvKiBudW0gdHggcGhhc2VzICB0eCBidXJzdCAgIGRlbGF5IGJldHdlZW4gICByeCBwYXR0ZXJuIHN0YXJ0X2FkZHJlc3MgICBwYXR0ZXJuTGVuKi8KLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAwODAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1BCUzEqLyAgICAgICAgICAgIAotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDBDMCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUEJTMiovICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMTAwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9STCovICAgICAgICAgICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAxNDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1NUQVRJQ19QQlMqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDE5MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMCovCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMUQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFExKi8KLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAyMTAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTIqLwotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDI1MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMyovCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMjkwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE0Ki8KLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAyRDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTUqLwotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDMxMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNiovCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMzUwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE3Ki8KLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAzODAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1BCUzMqLyAgICAgICAgICAgIAotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDAwMCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUkwyKi8gICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMDQwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9URVNUKi8gICAgICAgICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAzQzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8gICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDQwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMlQqLyAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwNDQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18zVCovICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDA0ODAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzRUKi8gICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDRDMCwgICAgICAgICAgIDMyICAgICAgIH0gIC8qIFBBVFRFUk5fVlJFRiovICAgICAgICAgICAgCisgICB7MHgxLAkxLAkyLCAgMSwgMHgwMDgwLCAgMiB9LAkvKiBQQVRURVJOX1BCUzEqLworICAgezB4MSwJMSwJMiwgIDEsIDB4MDBDMCwgIDIgfSwJLyogUEFUVEVSTl9QQlMyKi8KKyAgIHsweDEsCTEsCTIsICAxLCAweDAzODAsICAyIH0sCS8qIFBBVFRFUk5fUEJTMyovCisgICB7MHgxLAkxLAkyLCAgMSwgMHgwMDQwLCAgMiB9LAkvKiBQQVRURVJOX1RFU1QqLworICAgezB4MSwJMSwJMiwgIDEsIDB4MDEwMCwgIDIgfSwJLyogUEFUVEVSTl9STCovCisgICB7MHgxLAkxLAkyLCAgMSwgMHgwMDAwLCAgMiB9LAkvKiBQQVRURVJOX1JMMiovCisgICB7MHhmLAk3LCAgMiwJNywgMHgwMTQwLCAxNiAgfSwJLyogUEFUVEVSTl9TVEFUSUNfUEJTKi8KKyAgIHsweGYsCTcsICAyLAk3LCAweDAxOTAsIDE2ICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTAqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwMUQwLCAxNiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFExKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDIxMCwgMTYgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRMiovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDAyNTAsIDE2ICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTMqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwMjkwLCAxNiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFE0Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDJEMCwgMTYgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRNSovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDAzMTAsIDE2ICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTYqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwMzUwLCAxNiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFE3Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDRDMCwgMTYgIH0sCS8qIFBBVFRFUk5fVlJFRiovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDAzQzAsIDE2ICB9LAkvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4MDQwMCwgMTYgIH0sCS8qIFBBVFRFUk5fRlVMTF9TU09fMlQqLworICAgezB4ZiwgIAk3LCAgMiwJNywgMHgwNDQwLCAxNiAgfSwJLyogUEFUVEVSTl9GVUxMX1NTT18zVCovCisgICB7MHhmLCAgCTcsICAyLAk3LCAweDA0ODAsIDE2ICB9LAkvKiBQQVRURVJOX0ZVTExfU1NPXzRUKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4NjI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEwKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4NjY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4NkE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEyKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4NkU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFEzKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4NzI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4NzY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE1Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4N0E4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE2Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4N0U4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4ODI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEwKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4ODY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFExKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4OEE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEyKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4OEU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEzKi8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4OTI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE0Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4OTY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE1Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4OUE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE2Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4OUU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE3Ki8KKyAgIHsweGYsICAJNywgIDIsCTcsIDB4QTI4MCwgMTYgIH0gLyogUEFUVEVSTl9JU0lfWFRBTEtfRlJFRSovCiAvKk5vdGU6IGFjdHVhbCBzdGFydF9hZGRyZXNzIGlzIDw8MyBvZiBkZWZpbmVkIGFkZGVzcyovCi19OyAgIAotI2Vsc2UKK307CisKIFBhdHRlcm5JbmZvIHBhdHRlcm5UYWJsZV8zMltdID0KIHsKIC8qIG51bSB0eCBwaGFzZXMgIHR4IGJ1cnN0ICAgZGVsYXkgYmV0d2VlbiAgIHJ4IHBhdHRlcm4gc3RhcnRfYWRkcmVzcyAgIHBhdHRlcm5MZW4qLwotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDA4MCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUEJTMSovICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMEMwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9QQlMyKi8gICAgICAgICAgICAKLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAxMDAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1JMKi8gICAgICAgICAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDE0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fU1RBVElDX1BCUyovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMTgwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwKi8gICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAxQzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTEqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDIwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMiovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMjQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzKi8gICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAyODAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDJDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNSovICAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwMzAwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2Ki8gICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAzNDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTcqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTE4MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMF9FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTFDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMV9FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTIwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMl9FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTI0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRM19FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTI4MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNF9FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTJDMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNV9FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTMwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNl9FWFQqLyAgICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MTM0MCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRN19FWFQqLyAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwNEMwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9WUkVGKi8gICAgICAgICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE0QzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1ZSRUZfSU5WKi8gICAgICAgICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE1MDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV8xVCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE1NDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV8yVCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE1ODAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV8zVCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE1QzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV80VCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE2MDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV81VCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE2NDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV82VCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE2ODAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV83VCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE2QzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV84VCovICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDE3MDAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV85VCovICAKLSAgIHszLCAgICAgICAgICAgMywgICAgICAgICAgMiwgICAgICAgICAgICAgICAgIDMsICAgICAgICAgICAweDAzODAsICAgICAgICAgICAgNCAgICAgICB9LCAvKiBQQVRURVJOX1BCUzMqLyAgICAgICAgICAgIAotICAgezMsICAgICAgICAgICAzLCAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgMywgICAgICAgICAgIDB4MDAwMCwgICAgICAgICAgICA0ICAgICAgIH0sIC8qIFBBVFRFUk5fUkwyKi8gICAgICAgICAgICAgCi0gICB7MywgICAgICAgICAgIDMsICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgMHgwMDQwLCAgICAgICAgICAgIDQgICAgICAgfSwgLyogUEFUVEVSTl9URVNUKi8gICAgICAgICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDAzQzAsICAgICAgICAgICAzMiAgICAgICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8gICAgIAotICAgezB4MWYsICAgICAgIDB4ZiwgICAgICAgICAyLCAgICAgICAgICAgICAgIDB4ZiwgICAgICAgICAgIDB4MDQwMCwgICAgICAgICAgIDMyICAgICAgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMlQqLyAgICAgCi0gICB7MHgxZiwgICAgICAgMHhmLCAgICAgICAgIDIsICAgICAgICAgICAgICAgMHhmLCAgICAgICAgICAgMHgwNDQwLCAgICAgICAgICAgMzIgICAgICAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18zVCovICAgICAKLSAgIHsweDFmLCAgICAgICAweGYsICAgICAgICAgMiwgICAgICAgICAgICAgICAweGYsICAgICAgICAgICAweDA0ODAsICAgICAgICAgICAzMiAgICAgICB9ICAvKiBQQVRURVJOX0ZVTExfU1NPXzRUKi8gICAgIAorICAgezB4MywJMHgzLCAgMiwgIDB4MywgMHgwMDgwLCAgNCB9LAkvKiBQQVRURVJOX1BCUzEqLworICAgezB4MywJMHgzLCAgMiwgIDB4MywgMHgwMEMwLCAgNCB9LAkvKiBQQVRURVJOX1BCUzIqLworICAgezB4MywJMHgzLCAgMiwgIDB4MywgMHgwMzgwLCAgNCB9LAkvKiBQQVRURVJOX1BCUzMqLworICAgezB4MywJMHgzLCAgMiwgIDB4MywgMHgwMDQwLCAgNCB9LAkvKiBQQVRURVJOX1RFU1QqLworICAgezB4MywJMHgzLCAgMiwgIDB4MywgMHgwMTAwLCAgNCB9LAkvKiBQQVRURVJOX1JMKi8KKyAgIHsweDMsCTB4MywgIDIsICAweDMsIDB4MDAwMCwgIDQgfSwJLyogUEFUVEVSTl9STDIqLworICAgezB4MWYsCTB4RiwgIDIsICAweGYsIDB4MDE0MCwgMzIgIH0sCS8qIFBBVFRFUk5fU1RBVElDX1BCUyovCisgICB7MHgxZiwJMHhGLCAgMiwgIDB4ZiwgMHgwMTkwLCAzMiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFEwKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDFEMCwgMzIgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRMSovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDAyMTAsIDMyICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTIqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwMjUwLCAzMiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFEzKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDI5MCwgMzIgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRNCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDAyRDAsIDMyICB9LAkvKiBQQVRURVJOX0tJTExFUl9EUTUqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwMzEwLCAzMiAgfSwJLyogUEFUVEVSTl9LSUxMRVJfRFE2Ki8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDM1MCwgMzIgIH0sCS8qIFBBVFRFUk5fS0lMTEVSX0RRNyovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDA0QzAsIDMyICB9LAkvKiBQQVRURVJOX1ZSRUYqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwM0MwLCAzMiAgfSwJLyogUEFUVEVSTl9GVUxMX1NTT18xVCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDA0MDAsIDMyICB9LAkvKiBQQVRURVJOX0ZVTExfU1NPXzJUKi8KKyAgIHsweDFmLCAgCTB4RiwgIDIsICAweGYsIDB4MDQ0MCwgMzIgIH0sCS8qIFBBVFRFUk5fRlVMTF9TU09fM1QqLworICAgezB4MWYsICAJMHhGLCAgMiwgIDB4ZiwgMHgwNDgwLCAzMiAgfSwJLyogUEFUVEVSTl9GVUxMX1NTT180VCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDYyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDY2ODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMSovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDZBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMiovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDZFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMyovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDcyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDc2ODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNSovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDdBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNiovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDdFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNyovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDgyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDg2ODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMSovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDhBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMiovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDhFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMyovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDkyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNCovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDk2ODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNSovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDlBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNiovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweDlFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNyovCisgICB7MHgxZiwgIAkweEYsICAyLCAgMHhmLCAweEEyODAsIDMyICB9IC8qIFBBVFRFUk5fSVNJX1hUQUxLX0ZSRUUqLworCisKIC8qTm90ZTogYWN0dWFsIHN0YXJ0X2FkZHJlc3MgaXMgPDwzIG9mIGRlZmluZWQgYWRkZXNzKi8KIH07CisjZWxzZQorUGF0dGVybkluZm8gcGF0dGVyblRhYmxlXzE2W10gPQoreworLyogbnVtIHR4IHBoYXNlcyAgdHggYnVyc3QgICBkZWxheSBiZXR3ZWVuICAgcnggcGF0dGVybiBzdGFydF9hZGRyZXNzICAgcGF0dGVybkxlbiovCisgICB7MHgxLCAJMHgxLAkyLCAgMHgxLCAweDAwMDAsICAyICB9LCAvKiBQQVRURVJOX1BCUzEqLworICAgezB4MSwgCTB4MSwJMiwgIDB4MSwgMHgwMDgwLCAgMiAgfSwgLyogUEFUVEVSTl9QQlMyKi8KKyAgIHsweDEsIAkweDEsCTIsICAweDEsIDB4MDEwMCwgIDIgIH0sIC8qIFBBVFRFUk5fUEJTMyovCisgICB7MHgxLCAJMHgxLAkyLCAgMHgxLCAweDAxODAsICAyICB9LCAvKiBQQVRURVJOX1RFU1QqLworICAgezB4MSwgCTB4MSwJMiwgIDB4MSwgMHgwMjAwLCAgMiAgfSwgLyogUEFUVEVSTl9STCovCisgICB7MHgxLCAJMHgxLAkyLCAgMHgxLCAweDAyODAsICAyICB9LCAvKiBQQVRURVJOX1JMMiovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDA2ODAsIDE2ICB9LCAvKiBQQVRURVJOX1NUQVRJQ19QQlMqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgwQTgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MEU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMSovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDEyODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTIqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgxNjgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MUE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDFFODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTUqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgyMjgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2Ki8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MjY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNyovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDJBODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTBfSU5WKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4MkU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMV9JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgzMjgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEyX0lOViovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDM2ODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTNfSU5WKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4M0E4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNF9JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHgzRTgwLCAxNiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE1X0lOViovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDQyODAsIDE2ICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTZfSU5WKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NDY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRN19JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHg0QTgwLCAxNiAgfSwgLyogUEFUVEVSTl9WUkVGKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NEU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fVlJFRl9JTlYqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHg1MjgwLCAxNiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18wVCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDU2ODAsIDE2ICB9LCAvKiBQQVRURVJOX0ZVTExfU1NPXzFUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4NUE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fRlVMTF9TU09fMlQqLworICAgezB4ZiwgIAkweDcsICAgIDIsCTB4NywgMHg1RTgwLCAxNiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18zVCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDYyODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDY2ODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMSovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDZBODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMiovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDZFODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMyovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDcyODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDc2ODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNSovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDdBODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNiovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDdFODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNyovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDgyODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDg2ODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMSovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDhBODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMiovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDhFODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMyovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDkyODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNCovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDk2ODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNSovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDlBODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNiovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweDlFODAsIDE2ICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNyovCisgICB7MHhmLCAgCTB4NywgICAgMiwJMHg3LCAweEEyODAsIDE2ICB9LCAvKiBQQVRURVJOX0lTSV9YVEFMS19GUkVFKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QTY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzFUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QUE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzJUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QUU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzNUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QjI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzRUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QjY4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzVUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QkE4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzZUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QkU4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzdUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QzI4MCwgMTYgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzhUKi8KKyAgIHsweGYsICAJMHg3LCAgICAyLAkweDcsIDB4QzY4MCwgMTYgIH0gIC8qIFBBVFRFUk5fUkVTT05BTkNFXzlUKi8KKy8qTm90ZTogYWN0dWFsIHN0YXJ0X2FkZHJlc3MgaXMgPDwzIG9mIGRlZmluZWQgYWRkZXNzKi8KK307CisKK1BhdHRlcm5JbmZvIHBhdHRlcm5UYWJsZV8zMltdID0KK3sKKy8qIG51bSB0eCBwaGFzZXMgIHR4IGJ1cnN0ICAgZGVsYXkgYmV0d2VlbiAgIHJ4IHBhdHRlcm4gc3RhcnRfYWRkcmVzcyAgIHBhdHRlcm5MZW4qLworICAgezB4MywgCTB4MywJMiwgIDB4MywgMHgwMDAwLCAgNCAgfSwgLyogUEFUVEVSTl9QQlMxKi8KKyAgIHsweDMsIAkweDMsCTIsICAweDMsIDB4MDA4MCwgIDQgIH0sIC8qIFBBVFRFUk5fUEJTMiovCisgICB7MHgzLCAJMHgzLAkyLCAgMHgzLCAweDAxMDAsICA0ICB9LCAvKiBQQVRURVJOX1BCUzMqLworICAgezB4MywgCTB4MywJMiwgIDB4MywgMHgwMTgwLCAgNCAgfSwgLyogUEFUVEVSTl9URVNUKi8KKyAgIHsweDMsIAkweDMsCTIsICAweDMsIDB4MDIwMCwgIDQgIH0sIC8qIFBBVFRFUk5fUkwqLworICAgezB4MywgCTB4MywJMiwgIDB4MywgMHgwMjgwLCAgNCAgfSwgLyogUEFUVEVSTl9STDIqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MDY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1RBVElDX1BCUyovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgwQTgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEwKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDBFODAsIDMyICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTEqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MTI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMiovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgxNjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFEzKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDFBODAsIDMyICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTQqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MUU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNSovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHgyMjgwLCAzMiAgfSwgLyogUEFUVEVSTl9LSUxMRVJfRFE2Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDI2ODAsIDMyICB9LCAvKiBQQVRURVJOX0tJTExFUl9EUTcqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MkE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMF9JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MkU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMV9JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MzI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRMl9JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4MzY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRM19JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4M0E4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNF9JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4M0U4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNV9JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NDI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRNl9JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NDY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fS0lMTEVSX0RRN19JTlYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NEE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fVlJFRiovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg0RTgwLCAzMiAgfSwgLyogUEFUVEVSTl9WUkVGX0lOViovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg1MjgwLCAzMiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18wVCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg1NjgwLCAzMiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18xVCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg1QTgwLCAzMiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18yVCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg1RTgwLCAzMiAgfSwgLyogUEFUVEVSTl9GVUxMX1NTT18zVCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg2MjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTAqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NjY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFExKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDZBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRMiovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg2RTgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTMqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4NzI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE0Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDc2ODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19GVUxMX1hUQUxLX0RRNSovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg3QTgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fRlVMTF9YVEFMS19EUTYqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4N0U4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX0ZVTExfWFRBTEtfRFE3Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDgyODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg4NjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTEqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4OEE4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFEyKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDhFODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRMyovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg5MjgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTQqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4OTY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fU1NPX1hUQUxLX0ZSRUVfRFE1Ki8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweDlBODAsIDMyICB9LCAvKiBQQVRURVJOX1NTT19YVEFMS19GUkVFX0RRNiovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHg5RTgwLCAzMiAgfSwgLyogUEFUVEVSTl9TU09fWFRBTEtfRlJFRV9EUTcqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QTI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fSVNJX1hUQUxLX0ZSRUUqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QTY4MCwgMzIgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzFUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweEFBODAsIDMyICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV8yVCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhBRTgwLCAzMiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfM1QqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QjI4MCwgMzIgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzRUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweEI2ODAsIDMyICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV81VCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhCQTgwLCAzMiAgfSwgLyogUEFUVEVSTl9SRVNPTkFOQ0VfNlQqLworICAgezB4MWYsICAJMHhmLCAgICAyLAkweGYsIDB4QkU4MCwgMzIgIH0sIC8qIFBBVFRFUk5fUkVTT05BTkNFXzdUKi8KKyAgIHsweDFmLCAgCTB4ZiwgICAgMiwJMHhmLCAweEMyODAsIDMyICB9LCAvKiBQQVRURVJOX1JFU09OQU5DRV84VCovCisgICB7MHgxZiwgIAkweGYsICAgIDIsCTB4ZiwgMHhDNjgwLCAzMiAgfSAgLyogUEFUVEVSTl9SRVNPTkFOQ0VfOVQqLworLypOb3RlOiBhY3R1YWwgc3RhcnRfYWRkcmVzcyBpcyA8PDMgb2YgZGVmaW5lZCBhZGRlc3MqLworfTsKKwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluRGV2TnVtOwogTVZfSFdTX0REUl9DUyAgICAgICAgICAgICAgIHRyYWludHJhaW5Dc1R5cGU7Ci1HVF9VMzIgICAgICAgICAgICAgICAgICAgICAgdHJhaW5QdXBOdW07IAorR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluUHVwTnVtOwogTVZfSFdTX1RSQUlOSU5HX1JFU1VMVCAgICAgIHRyYWluUmVzdWx0VHlwZTsKIE1WX0hXU19Db250cm9sRWxlbWVudCAgICAgICB0cmFpbkNvbnRyb2xFbGVtZW50OwogTVZfSFdTX1NlYXJjaERpcmVjdGlvbiAgICAgIHRyYWluZVNlYXJjaERpcjsKIE1WX0hXU19ESVJFQ1RJT04gICAgICAgICAgICB0cmFpbkRpcmVjdGlvbjsKLUdUX1UzMiAgICAgICAgICAgICAgICAgICAgICB0cmFpbklmU2VsZWN0OyAKK0dUX1UzMiAgICAgICAgICAgICAgICAgICAgICB0cmFpbklmU2VsZWN0OwogR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluSW5pdFZhbHVlOwogR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluTnVtYmVySXRlcmF0aW9uczsKIE1WX0hXU19QQVRURVJOICAgICAgICAgICAgICB0cmFpblBhdHRlcm47CiBNVl9IV1NfRWRnZUNvbXBhcmUgICAgICAgICAgdHJhaW5FZGdlQ29tcGFyZTsKIEdUX1UzMiAgICAgICAgICAgICAgICAgICAgICB0cmFpbkNzTnVtOwogR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIHRyYWluSWZBY2VzcywgdHJhaW5JZklkLCB0cmFpblB1cEFjY2VzczsKKyNpZmRlZiBDT05GSUdfRERSNAorR1RfVTMyICAgICAgICAgICAgICAgICAgICAgIG1heFBvbGxpbmdGb3JEb25lID0gMTAwMDAwMDAwOyAgLyogdGhpcyBjb3VudGVyIHdhcyBpbmNyZWFzZWQgZm9yIEREUjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byBBMzkwIERCLUdQIEREUjQgZmFpbHVyZSAqLworI2Vsc2UgLyogRERSMyAqLworI2lmZGVmIENPTkZJR19CT0JLCitHVF9VMzIgICAgICAgICAgICAgICAgICAgICAgbWF4UG9sbGluZ0ZvckRvbmUgPSAxMDAwOworI2Vsc2UKIEdUX1UzMiAgICAgICAgICAgICAgICAgICAgICBtYXhQb2xsaW5nRm9yRG9uZSA9IDEwMDAwMDA7Ci0KKyNlbmRpZiAvKiBDT05GSUdfQk9CSyAqLworI2VuZGlmIC8qIENPTkZJR19ERFI0ICovCiBleHRlcm4gTVZfSFdTX1JFU1VMVCB0cmFpbmluZ1Jlc3VsdFtNQVhfU1RBR0VfTElNSVRdW01BWF9JTlRFUkZBQ0VfTlVNXTsKIGV4dGVybiBBVVRPX1RVTkVfU1RBR0UgdHJhaW5pbmdTdGFnZTsKIApAQCAtMjQ1LDcgKzM2OCw3IEBACiApCiB7CiAgICAgCi0gICAgR1RfVTMyIG1hc2tEcU51bU9mUmVncywgbWFza1B1cE51bU9mUmVncywgaW5kZXhDbnQscG9sbENudCwgcmVnRGF0YSwgcHVwSWQ7CisgICAgR1RfVTMyIG1hc2tEcU51bU9mUmVncywgbWFza1B1cE51bU9mUmVncywgaW5kZXhDbnQscG9sbENudCwgcmVnRGF0YSwgcHVwSWQsIHRyaWdnZXJSZWdBZGRyOwogICAgIEdUX1UzMiB0eEJ1cnN0U2l6ZTsKICAgICBHVF9VMzIgZGVsYXlCZXR3ZWVuQnVyc3Q7CiAgICAgR1RfVTMyIHJkTW9kZTsKQEAgLTI1Myw4ICszNzYsOSBAQAogCVBhdHRlcm5JbmZvICpwYXR0ZXJuVGFibGUgPSBkZHIzVGlwR2V0UGF0dGVyblRhYmxlKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c1B1cFJlZ01hcCA9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c1B1cFJlZ01hcCgpOwogCUdUX1UxNiAqbWFza1Jlc3VsdHNEcVJlZ01hcCAJPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNEcVJlZygpOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKLSAgICBpZiAocHVwTnVtID49IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkKKyAgICBpZiAocHVwTnVtID49IG9jdGV0c1BlckludGVyZmFjZU51bSkKICAgICB7CiAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQX0VOR0lORShERUJVR19MRVZFTF9FUlJPUiwgKCJwdXBOdW0gJWQgbm90IHZhbGlkXG4iLHB1cE51bSkpOwogICAgIH0KQEAgLTM3Myw4ICs0OTcsOCBAQAogICAgIHJlZ0RhdGEgfD0gKDB4NiA8PCAyOCk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VOdW0sIENBTElCX09CSl9QUkZBX1JFRywgcmVnRGF0YSB8IChpbml0VmFsdWUgPDwgOCkgLCAweGZmIHwgKDB4RkZGRiA8PCA4KXwgKDB4RiA8PCAyNCkgfCAoR1RfVTMyKSgweEYgPDwgMjgpKSk7CiAKLQltYXNrRHFOdW1PZlJlZ3MgPSB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgKiBCVVNfV0lEVEhfSU5fQklUUzsKLQltYXNrUHVwTnVtT2ZSZWdzID0gdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOworCW1hc2tEcU51bU9mUmVncyA9IG9jdGV0c1BlckludGVyZmFjZU51bSAqIEJVU19XSURUSF9JTl9CSVRTOworCW1hc2tQdXBOdW1PZlJlZ3MgPSBvY3RldHNQZXJJbnRlcmZhY2VOdW07CiAKICAgICBpZiAocmVzdWx0VHlwZSA9PSBSRVNVTFRfUEVSX0JJVCkKICAgICB7CkBAIC0zODQsMTEgKzUwOCwxMSBAQAogICAgICAgICB9CiAKIAkJLypNYXNrIGRpc2FibGVkIGJ1c2VzKi8KLSAgICAgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXBJZCsrKQorICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cElkKyspCiAgICAgICAgIHsKIAkJCWlmIChJU19CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXBJZCkgPT0gR1RfVFJVRSkgY29udGludWU7CiAKLQkJICAgIGZvcihpbmRleENudD0obWFza0RxTnVtT2ZSZWdzLXB1cElkKjgpOyBpbmRleENudDwobWFza0RxTnVtT2ZSZWdzLShwdXBJZCsxKSo4KTtpbmRleENudCsrKQorCQkgICAgZm9yKGluZGV4Q250PXB1cElkKjg7IGluZGV4Q250PChwdXBJZCsxKSo4O2luZGV4Q250KyspCiAJCSAgICB7CiAJCSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VOdW0sIG1hc2tSZXN1bHRzRHFSZWdNYXBbaW5kZXhDbnRdLCAoMTw8MjQpLCAxPDwyNCkpOwogCQkgICAgfQpAQCAtNDEzLDQ4ICs1MzcsNTEgQEAKICAgICB9CiAKICAgICAvKlN0YXJ0IFRyYWluaW5nIFRyaWdnZXIgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VOdW0sIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIDEsIDEpKTsKLSNlbHNlCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBhY2Nlc3NUeXBlLCBpbnRlcmZhY2VOdW0sIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMSwgMSkpOwotI2VuZGlmCisJdHJpZ2dlclJlZ0FkZHIgPSAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMyk/KE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcpOihPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcpOworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlTnVtLCB0cmlnZ2VyUmVnQWRkciwgMSwgMSkpOworCiAgICAgLyp3YWl0IGZvciBhbGwgUkZVIHRlc3RzIHRvIGZpbmlzaCAob3IgdGltZW91dCkqLwogCS8qV0EgZm9yIDE2IGJpdCBtb2RlLCBtb3JlIGludmVzdGlnYXRpb24gbmVlZGVkKi8KICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxKTsgLyogMSBtU2VjICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgLyogVHJhaW5pbmcgIkRvbmUgPyIgKi8KLSAgICBmb3IoaW5kZXhDbnQ9MDsgaW5kZXhDbnQgPCBNQVhfSU5URVJGQUNFX05VTTtpbmRleENudCsrKQorICAgIC8qIFRyYWluaW5nICJEb25lID8iICBmb3IgQ1BVIGNvbnRvbGxlZCBUSVAqLworICAgIGlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpCiAgICAgewotICAgICAgICBpZiAoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW5kZXhDbnQpID09ICAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsgICAKLSAgICAgICAgfQotICAgICAgICBpZiAoaW50ZXJmYWNlTWFzayAmICgxPDxpbmRleENudCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qbmVlZCB0byBjaGVjayByZXN1bHRzIGZvciB0aGlzIER1bml0ICovCi0gICAgICAgICAgICBmb3IocG9sbENudD0wO3BvbGxDbnQgPCBtYXhQb2xsaW5nRm9yRG9uZTtwb2xsQ250KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGluZGV4Q250LCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsICZyZWdEYXRhLCBNQVNLX0FMTF9CSVRTKSk7Ci0gICAgICAgICAgICAgICAgIGlmICgocmVnRGF0YSAmIDB4MikgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qZG9uZSAqLwotICAgICAgICAgICAgICAgIAl0cmFpblN0YXR1c1tpbmRleENudF0gPSBNVl9IV1NfVHJhaW5pbmdJcFN0YXR1c19TVUNDRVNTOwotICAgICAgICAgICAgICAgICAgICBicmVhazsgCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9sbENudCA9PSBtYXhQb2xsaW5nRm9yRG9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cmFpblN0YXR1c1tpbmRleENudF0gPSBNVl9IV1NfVHJhaW5pbmdJcFN0YXR1c19USU1FT1VUOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCS8qQmUgc3VyZSB0aGF0IE9EUEcgZG9uZSovCi0gICAgICAgIENIRUNLX1NUQVRVUyhpc09kcGdBY2Nlc3NEb25lKGRldk51bSwgaW5kZXhDbnQpKTsKLSAgICB9Ci0KLQkvKldyaXRlIE9EUEcgZG9uZSBpbiBEdW5pdCovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1NUQVRVU19ET05FX1JFRywgMCwgMHgxKSk7CisJCWZvcihpbmRleENudD0wOyBpbmRleENudCA8IE1BWF9JTlRFUkZBQ0VfTlVNO2luZGV4Q250KyspCisJCXsKKwkJICAgIGlmIChJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbmRleENudCkgPT0gIDApCisJCSAgICB7CisJCSAgICAgICAgY29udGludWU7CisJCSAgICB9CisJCSAgICBpZiAoaW50ZXJmYWNlTWFzayAmICgxPDxpbmRleENudCkpCisJCSAgICB7CisJCSAgICAgICAgLypuZWVkIHRvIGNoZWNrIHJlc3VsdHMgZm9yIHRoaXMgRHVuaXQgKi8KKwkJICAgICAgICBmb3IocG9sbENudD0wO3BvbGxDbnQgPCBtYXhQb2xsaW5nRm9yRG9uZTtwb2xsQ250KyspCisJCSAgICAgICAgeworCQkgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW5kZXhDbnQsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKKwkJICAgICAgICAgICAgaWYgKChyZWFkRGF0YVtpbmRleENudF0gJiAweDIpICE9IDApCisJCSAgICAgICAgICAgIHsKKwkJICAgICAgICAgICAgICAgIC8qZG9uZSAqLworCQkJCQkJdHJhaW5TdGF0dXNbaW5kZXhDbnRdID0gTVZfSFdTX1RyYWluaW5nSXBTdGF0dXNfU1VDQ0VTUzsKKwkJICAgICAgICAgICAgICAgIGJyZWFrOworCQkgICAgICAgICAgICB9CisJCSAgICAgICAgfQorI2lmZGVmIENPTkZJR19CT0JLCisgICAgICAgICAgICAgICAgIC8qIFdBIHRvIGF2b2lkIHRyYWluaW5nIHN0dWNraW5nICovCisgICAgICAgICAgICAgICAgaHdzT3NFeGFjdERlbGF5UHRyKChHVF9VOClkZXZOdW0sIGRldk51bSwgNTApOyAvKiA1MCBtU2VjICovCiAjZW5kaWYKKwkJICAgICAgICBpZiAocG9sbENudCA9PSBtYXhQb2xsaW5nRm9yRG9uZSkKKwkJICAgICAgICB7CisJCSAgICAgICAgICAgIHRyYWluU3RhdHVzW2luZGV4Q250XSA9IE1WX0hXU19UcmFpbmluZ0lwU3RhdHVzX1RJTUVPVVQ7CisJCSAgICAgICAgfQorCQkgICAgfQorCQkJLypCZSBzdXJlIHRoYXQgT0RQRyBkb25lKi8KKwkJICAgIENIRUNLX1NUQVRVUyhpc09kcGdBY2Nlc3NEb25lKGRldk51bSwgaW5kZXhDbnQpKTsKKwkJfQorCisJCS8qV3JpdGUgT0RQRyBkb25lIGluIER1bml0Ki8KKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1NUQVRVU19ET05FX1JFRywgMCwgMHgxKSk7CisJfQogCiAgICAgLyp3YWl0IGZvciBhbGwgRHVuaXQgdGVzdHMgdG8gZmluaXNoIChvciB0aW1lb3V0KSovCiAgICAgLyogVHJhaW5pbmcgIkRvbmUgPyIgKi8KQEAgLTQ2MywxOCArNTkwLDE0IEBACiAgICAgewogICAgICAgICBpZiAoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW5kZXhDbnQpID09ICAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBjb250aW51ZTsgICAKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnRlcmZhY2VNYXNrICYgKDE8PGluZGV4Q250KSkKICAgICAgICAgewogICAgICAgICAgICAgLypuZWVkIHRvIGNoZWNrIHJlc3VsdHMgZm9yIHRoaXMgRHVuaXQgKi8KICAgICAgICAgICAgIGZvcihwb2xsQ250PTA7cG9sbENudCA8IG1heFBvbGxpbmdGb3JEb25lO3BvbGxDbnQrKykKICAgICAgICAgICAgIHsKLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0gICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGluZGV4Q250LCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCByZWFkRGF0YSwgTUFTS19BTExfQklUUykpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW5kZXhDbnQsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgcmVhZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKLSNlbmRpZgorICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbmRleENudCwgdHJpZ2dlclJlZ0FkZHIsIHJlYWREYXRhLCBNQVNLX0FMTF9CSVRTKSk7CiAgICAgICAgICAgICAgICAgcmVnRGF0YSA9IHJlYWREYXRhW2luZGV4Q250XTsKICAgICAgICAgICAgICAgICAgaWYgKChyZWdEYXRhICYgMHgyKSAhPSAwKQogICAgICAgICAgICAgICAgIHsKQEAgLTQ4NSwxMSArNjA4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFpblN0YXR1c1tpbmRleENudF0gPSBNVl9IV1NfVHJhaW5pbmdJcFN0YXR1c19GQUlMOworCQkJCQkJdHJhaW5TdGF0dXNbaW5kZXhDbnRdID0gTVZfSFdTX1RyYWluaW5nSXBTdGF0dXNfRkFJTDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsgCi0gICAgICAgICAgICAgICAgfSAgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyNpZmRlZiBDT05GSUdfQk9CSworICAgICAgICAgICAgLyogV0EgdG8gYXZvaWQgdHJhaW5pbmcgc3R1Y2tpbmcgKi8KKyAgICAgICAgICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCA1MCk7CisjZW5kaWYKICAgICAgICAgICAgIGlmIChwb2xsQ250ID09IG1heFBvbGxpbmdGb3JEb25lKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyYWluU3RhdHVzW2luZGV4Q250XSA9IE1WX0hXU19UcmFpbmluZ0lwU3RhdHVzX1RJTUVPVVQ7CkBAIC02NjEsNiArNzg4LDcgQEAKICAgICBHVF9VMzIgcmVhZERhdGFbTUFYX0lOVEVSRkFDRV9OVU1dOwogCUdUX1UxNiAqbWFza1Jlc3VsdHNQdXBSZWdNYXAgPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNQdXBSZWdNYXAoKTsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzRHFSZWdNYXAgCT0gZGRyM1RpcEdldE1hc2tSZXN1bHRzRHFSZWcoKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgLyogQWdyZWVkIGFzc3VtcHRpb246IGFsbCBDUyBtYXNrIGNvbnRhaW4gc2FtZSBudW1iZXIgb2YgYml0cywgaS5lLiBpbiBtdWx0aSBDUywgdGhlIG51bWJlciBvZiBDUyBwZXIgbWVtb3J5IGlzIHRoZSBzYW1lIGZvciBhbGwgcHVwcyAqLwogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgIGludGVyZmFjZUlkLCBDU19FTkFCTEVfUkVHLCAoY3NOdW1UeXBlID09IDApID8gMTw8MyA6IDAsICgxIDw8IDMpKSk7CkBAIC02NzEsNyArNzk5LDcgQEAKICAgICAgICAgREVCVUdfVFJBSU5JTkdfSVBfRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCAoImRkcjNUaXBSZWFkVHJhaW5pbmdSZXN1bHQgbG9hZFJlcyA9IE5VTEwiKSk7CiAgICAgICAgIHJldHVybiBHVF9GQUlMOwogICAgIH0KLSAgICBpZiAocHVwTnVtID49IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkKKyAgICBpZiAocHVwTnVtID49IG9jdGV0c1BlckludGVyZmFjZU51bSkKICAgICB7CiAgICAgICAgIERFQlVHX1RSQUlOSU5HX0lQX0VOR0lORShERUJVR19MRVZFTF9FUlJPUiwgKCJwdXBOdW0gJWQgbm90IHZhbGlkXG4iLHB1cE51bSkpOwogICAgIH0KQEAgLTY5NSw3ICs4MjMsNyBAQAogICAgIGVsc2UgLypwdXBBY2Nlc3NUeXBlID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkqLwogICAgIHsKICAgICAgICAgc3RhcnRQdXAgPSAwOwotICAgICAgICBlbmRQdXAgPSB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UtMTsKKyAgICAgICAgZW5kUHVwID0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtLTE7CiAgICAgfSAKICAgICBmb3IocHVwQ250ID0gc3RhcnRQdXA7IHB1cENudCA8PSBlbmRQdXAgOyBwdXBDbnQrKykKICAgICB7CkBAIC04MDUsMTggKzkzMywxNiBAQAogICAgIEdUX1UzMiBpbnRlcmZhY2VJZAogKQogewotICAgIEdUX1UzMiBwb2xsQ250ID0gMCwgZGF0YVZhbHVlOworICAgIEdUX1UzMiBwb2xsQ250ID0gMCwgZGF0YVZhbHVlLCBleHBlY3RlZFZhbDsKICAgICBHVF9VMzIgcmVhZERhdGFbTUFYX0lOVEVSRkFDRV9OVU1dOwogCiAgICAgZm9yIChwb2xsQ250ID0gMDsgcG9sbENudCA8IE1BWF9QT0xMSU5HX0lURVJBVElPTlMgOyBwb2xsQ250KyspCiAgICAgewogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSxBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgT0RQR19CSVNUX0RPTkUsIHJlYWREYXRhLCBNQVNLX0FMTF9CSVRTKSk7CiAgCQlkYXRhVmFsdWUgPSByZWFkRGF0YVtpbnRlcmZhY2VJZF07Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSB8fCBkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotICAgICAgICBpZiAoKChkYXRhVmFsdWUgPj4gT0RQR19CSVNUX0RPTkVfQklUX09GRlMgKSYgMHgxKSA9PSBPRFBHX0JJU1RfRE9ORV9CSVRfVkFMVUUpCi0jZWxzZQotICAgICAgICBpZiAoKGRhdGFWYWx1ZSAmIDB4MSkgPT0gMHgxKQotI2VuZGlmCisKKwkJZXhwZWN0ZWRWYWwgPSAgKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA8IE1WX1RJUF9SRVZfMyk/KE9EUEdfQklTVF9ET05FX0JJVF9WQUxVRV9SRVYyKTooT0RQR19CSVNUX0RPTkVfQklUX1ZBTFVFX1JFVjMpOworICAgICAgICBpZiAoKChkYXRhVmFsdWUgPj4gT0RQR19CSVNUX0RPTkVfQklUX09GRlMgKSYgMHgxKSA9PSBleHBlY3RlZFZhbCkKICAgICAgICAgewogICAgICAgICAgICAgZGF0YVZhbHVlID0gZGF0YVZhbHVlICYgMHhmZmZmZmZmZTsKICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIE9EUEdfQklTVF9ET05FLCBkYXRhVmFsdWUsIE1BU0tfQUxMX0JJVFMpKTsKQEAgLTg1NywxOCArOTgzLDIwIEBACiAgICAgLyogbG9hZCBwYXR0ZXJuIHRvIE9EUEcgKi8KICAgICBkZHIzVGlwTG9hZFBhdHRlcm5Ub09kcGcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBwYXR0ZXJuLCBwYXR0ZXJuVGFibGVbcGF0dGVybl0uc3RhcnRBZGRyKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLSAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNIDsgaW50ZXJmYWNlSWQrKykKLSAgICB7Ci0JCWlmIChJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkgPT0gIDApCi0gICAgICAgICAgICAgY29udGludWU7Ci0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MTQ5OCwgMHgzICwgMHhmKSk7Ci0gICAgfQorCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpCisJeworCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNIDsgaW50ZXJmYWNlSWQrKykKKwkJeworCQkJaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSA9PSAgMCkKKwkJICAgICAgICAgY29udGludWU7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBTRFJBTV9PRFRfQ09OVFJPTF9ISUdIX1JFRywgMHgzICwgMHhmKSk7CisJCX0KIAotCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19FTkFCTEVfUkVHLCAweDEgPDwgT0RQR19FTkFCTEVfT0ZGUywgICgweDEgPDwgT0RQR19FTkFCTEVfT0ZGUykpKTsKLSNlbHNlCisJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19FTkFCTEVfUkVHLCAweDEgPDwgT0RQR19FTkFCTEVfT0ZGUywgICgweDEgPDwgT0RQR19FTkFCTEVfT0ZGUykpKTsKKwl9CisJZWxzZSB7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsIChHVF9VMzIpKDB4MSA8PCAzMSksICAoR1RfVTMyKSgweDEgPDwgMzEpKSk7Ci0jZW5kaWYKKwl9CiAKICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxKTsgLyogMSBtU2VjICovCiAKQEAgLTg4MywxMCArMTAxMSwxMCBAQAogICAgIC8qIHJldHVybiB0byBkZWZhdWx0ICovCiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX0RBVEFfQ09OVFJPTF9SRUcsIDAsIE1BU0tfQUxMX0JJVFMpKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLQkvKmRpc2FibGUgb2R0MCBmb3IgQ1MwIHRyYWluaW5nIC0gbmVlZCB0byBhZGp1c3QgZm9yIG11bHR5IENTKi8KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCxQQVJBTV9OT1RfQ0FSRSAsIDB4MTQ5OCwgMHgwICwgMHhmKSk7Ci0jZW5kaWYKKwlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJLypkaXNhYmxlIG9kdDAgZm9yIENTMCB0cmFpbmluZyAtIG5lZWQgdG8gYWRqdXN0IGZvciBtdWx0eSBDUyovCisJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULFBBUkFNX05PVF9DQVJFICwgMHgxNDk4LCAweDAgLCAweGYpKTsKKwl9CiAKICAgICAvKiB0ZW1wb3JhcnkgYWRkZWQgKi8KICAgICBod3NPc0V4YWN0RGVsYXlQdHIoKEdUX1U4KWRldk51bSwgZGV2TnVtLCAxKTsKQEAgLTg5NCwyNiArMTAyMiw2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotTG9hZCBzcGVjaWZpYyBwYXR0ZXJuIHRvIG1lbW9yeSB1c2luZyBDUFUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwTG9hZFBhdHRlcm5Ub01lbUJ5Q3B1Ci0oCi0gICAgR1RfVTMyICAgICAgICAgIGRldk51bSwKLSAgICBNVl9IV1NfUEFUVEVSTiAgcGF0dGVybiwKLSAgICBHVF9VMzIgICAgICAgICAgb2Zmc2V0Ci0pCi17Ci0JLyogYXZvaWQgd2FybmluZ3MgKi8KLQlkZXZOdW0gPSBkZXZOdW07Ci0JcGF0dGVybiA9IHBhdHRlcm47Ci0Jb2Zmc2V0ID0gb2Zmc2V0OwotCi0gICAgLyogZXJhbmJhIC0gVEJEICovCi0gICAgcmV0dXJuIEdUX09LOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogVHJhaW5pbmcgc2VhcmNoIHJvdXRpbmUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEdUX1NUQVRVUyAgICBkZHIzVGlwSXBUcmFpbmluZ1dyYXBwZXJJbnQKQEAgLTk0Myw2ICsxMDUxLDcgQEAKICAgICBNVl9IV1NfU2VhcmNoRGlyZWN0aW9uIHNlYXJjaERpcklkICwgc3RhcnRTZWFyY2gsIGVuZFNlYXJjaDsKICAgICBNVl9IV1NfRWRnZUNvbXBhcmUgICAgIGVkZ2VDb21wVXNlZDsKIAlHVF9VOCBjb25zVGFwID0gKGRpcmVjdGlvbiA9PSBPUEVSX1dSSVRFKT8oNjQpOigwKTsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgaWYgKHRyYWluU3RhdHVzID09IE5VTEwpCiAgICAgewpAQCAtOTU2LDcgKzEwNjUsNyBAQAogICAgICAgICAoc2VhcmNoRGlyID4gTVZfSFdTX0hpZ2gyTG93KSB8fAogICAgICAgICAoY29udHJvbEVsZW1lbnQgPiBNVl9IV1NfQ29udHJvbEVsZW1lbnRfRFFTX1NLRVcpIHx8CiAgICAgICAgIChyZXN1bHRUeXBlID4gUkVTVUxUX1BFUl9CWVRFKSB8fAotICAgICAgICAocHVwTnVtID49IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkgfHwKKyAgICAgICAgKHB1cE51bSA+PSBvY3RldHNQZXJJbnRlcmZhY2VOdW0pIHx8CiAgICAgICAgIChwdXBBY2Nlc3NUeXBlID4gQUNDRVNTX1RZUEVfTVVMVElDQVNUKSB8fAogICAgICAgICAoaW50ZXJmYWNlSWQgPiAxMSl8fAogICAgICAgICAoYWNjZXNzVHlwZSA+IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkpCkBAIC0xMDQ1LDggKzExNTQsOSBAQAogCUdUX1U4IGNvbnNUYXAgPSAoZGlyZWN0aW9uID09IE9QRVJfV1JJVEUpPyg2NCk6KDApOwogCUdUX1U4IGJpdEJpdE1hc2tbTUFYX0JVU19OVU1dID0gezB9LCBiaXRCaXRNYXNrQWN0aXZlID0gMDsKIAlHVF9VOCBwdXBJZDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCi0gICAgaWYgKHB1cE51bSA+PSB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UpCisgICAgaWYgKHB1cE51bSA+PSBvY3RldHNQZXJJbnRlcmZhY2VOdW0pCiAgICAgewogICAgICAgICBERUJVR19UUkFJTklOR19JUF9FTkdJTkUoREVCVUdfTEVWRUxfRVJST1IsICgicHVwTnVtICVkIG5vdCB2YWxpZFxuIixwdXBOdW0pKTsKICAgICB9CkBAIC0xMDcyLDcgKzExODIsNyBAQAogICAgIGZvcihpbnRlcmZhY2VDbnQgPSBzdGFydElmOyBpbnRlcmZhY2VDbnQgPD0gZW5kSWY7IGludGVyZmFjZUNudCsrKSAgICAKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlQ250KQotICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSAodG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlLTEpIDsgcHVwSWQrKykKKyAgICAgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPD0gKG9jdGV0c1BlckludGVyZmFjZU51bS0xKSA7IHB1cElkKyspCiAgICAgICAgIHsKIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cElkKQogICAgICAgICAgICAgaWYgKHJlc3VsdFR5cGUgPT0gUkVTVUxUX1BFUl9CSVQpCkBAIC0xMTIzLDcgKzEyMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9IV1NfTG93MkhpZ2gsIGRpcmVjdGlvbiwgaW50ZXJmYWNlTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtSXRlci8yLCBudW1JdGVyLzIsIHBhdHRlcm4sIEVER0VfRlAsIHRyYWluQ3NUeXBlLCBjc051bSwgIHRyYWluU3RhdHVzKTsKIAotCQkgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPD0gKHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZS0xKSA7IHB1cElkKyspCisJCSAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8PSAob2N0ZXRzUGVySW50ZXJmYWNlTnVtLTEpIDsgcHVwSWQrKykKIAkJICAgIHsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXBJZCkKIApAQCAtMTE0Niw3ICsxMjU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfSFdTX0hpZ2gyTG93LCBkaXJlY3Rpb24sIGludGVyZmFjZU1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZXIvMiwgbnVtSXRlci8yLCBwYXR0ZXJuLCBFREdFX0ZQLCB0cmFpbkNzVHlwZSwgY3NOdW0sICB0cmFpblN0YXR1cyk7CiAKLQkJICAgIGZvcihwdXBJZCA9IDA7IHB1cElkIDw9ICh0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UtMSkgOyBwdXBJZCsrKQorCQkgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPD0gKG9jdGV0c1BlckludGVyZmFjZU51bS0xKSA7IHB1cElkKyspCiAJCSAgICB7CiAJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwSWQpCiAKQEAgLTExNzUsMTEgKzEyODUsMTIgQEAKIEdUX1NUQVRVUyAgICBkZHIzVGlwTG9hZFBoeVZhbHVlcyhHVF9CT09MIGJMb2FkKQogewogICAgIEdUX1UzMiAgYnVzQ250ID0gMCwgIGludGVyZmFjZUlkLCAgZGV2TnVtID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgIGZvcihidXNDbnQgPSAwOyBidXNDbnQgPCBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7IGJ1c0NudCsrKQorICAgICAgICBmb3IoYnVzQ250ID0gMDsgYnVzQ250IDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKICAgICAgICAgewogICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzQ250KQogICAgICAgICAgICAgaWYgKGJMb2FkID09IEdUX1RSVUUpCkBAIC0xMjE3LDYgKzEzMjgsNyBAQAogICAgIE1WX0hXU19UcmFpbmluZ0lwU3RhdHVzIHRyYWluU3RhdHVzW01BWF9JTlRFUkZBQ0VfTlVNXTsKICAgICBHVF9VMzIgKnBSZXMgPSBOVUxMOwogICAgIEdUX1UzMiBzZWFyY2hTdGF0ZSA9IDA7IAorCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBkZHIzVGlwTG9hZFBoeVZhbHVlcyhHVF9UUlVFKTsKIApAQCAtMTIzMSw3ICsxMzQzLDcgQEAKICAgICAgICAgICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgICAgICAgICBmb3IocHVwSWQgPSAwOyBwdXBJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cElkKyspCisgICAgICAgICAgICAgICAgZm9yKHB1cElkID0gMDsgcHVwSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXBJZCsrKQogICAgICAgICAgICAgICAgIHsKIAkJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwSWQpCiAgICAgICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwUmVhZFRyYWluaW5nUmVzdWx0KGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ0xldmVsaW5nLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nTGV2ZWxpbmcuYwppbmRleCAzNWQxYzY4Li5kY2VlNjFiIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nTGV2ZWxpbmcuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nTGV2ZWxpbmcuYwpAQCAtMzMsMTAgKzMzLDE0IEBACiAjaW5jbHVkZSAibXZEZHJUb3BvbG9neURlZi5oIgogCiAjZGVmaW5lIFdMX0lURVJBVElPTl9OVU0gICAgICAgICAgICAoMTApCi0jZGVmaW5lIE9ORV9DTE9DS19FUlJPUl9TSElGVCAgICgyKQotI2RlZmluZSBBTElHTl9FUlJPUl9TSElGVCAgICAgICAoLTIpCiAjZGVmaW5lIE1BVFJJWF9NRU1fQUREUkVTUyAgICAgICgweGZkMDAwKQogCisjZGVmaW5lIE5PX1BIQVNFX1NISUZUCQkJCSgwKQorI2RlZmluZSBPTkVfQ0xPQ0tfRVJST1JfU0hJRlQJCSgyKQorI2RlZmluZSBUV09fQ0xPQ0tfRVJST1JfU0hJRlQJCSg0KQorI2RlZmluZSBUSFJFRV9DTE9DS19FUlJPUl9TSElGVAkJKDYpCisjZGVmaW5lIEFMSUdOX0VSUk9SX1NISUZUCQkJKC0yKQorCiBzdGF0aWMgR1RfVTMyIHB1cE1hc2tUYWJsZVtdPQogewogICAgIDB4MDAwMDAwRkYsCkBAIC01MCw3ICs1NCw2IEBACiAKIGV4dGVybiBNVl9IV1NfUkVTVUxUIHRyYWluaW5nUmVzdWx0W01BWF9TVEFHRV9MSU1JVF1bTUFYX0lOVEVSRkFDRV9OVU1dOwogZXh0ZXJuIEFVVE9fVFVORV9TVEFHRSB0cmFpbmluZ1N0YWdlOwotZXh0ZXJuIEdUX1UzMiBybFZlcnNpb247IAogZXh0ZXJuIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwOwogZXh0ZXJuIENsVmFsdWVQZXJGcmVxIGNhc0xhdGVuY3lUYWJsZVtdOwogZXh0ZXJuIEdUX1UzMiAgc3RhcnRYc2JPZmZzZXQ7CkBAIC03Myw1MyArNzYsNjEgQEAKICgKICAgICBHVF9VMzIgICBkZXZOdW0KICk7Ci1zdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBXbFN1cHBBbGlnbkVyclNoaWZ0Ci0oCi0JR1RfVTMyIGRldk51bSwKLQlHVF9VMzIgaW50ZXJmYWNlSWQsCi0JR1RfVTMyIGJ1c0lkLAotCUdUX1UzMiBidXNJZERlbHRhCi0pOwogCiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQKICgKIAlHVF9VMzIgZGV2TnVtLAotCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyICBvZmZzZXQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyIGJ1c0lkCiApOwogCiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBYc2JDb21wYXJlVGVzdAogKAorICAgIEdUX1UzMiBkZXZOdW0sCisgICAgR1RfVTMyIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiBidXNJZCwKKyAgICBHVF84IG9mZnNldAorKTsKKworI2lmIDAgLyogcmVtb3ZlIHRoaXMgaWYgaXQncyBub3QgaW4gdXNlICovCitzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBXbFN1cHBBbGlnbkVyclNoaWZ0CisoCiAJR1RfVTMyIGRldk51bSwKIAlHVF9VMzIgaW50ZXJmYWNlSWQsCi0JR1RfVTMyIGJ1c0lkLAotCUdUX1UzMiBlZGdlT2Zmc2V0LAotCUdUX1UzMiBidXNJZERlbHRhCisJR1RfVTMyIGJ1c0lkCiApOwogCiBzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBXbFN1cHBPbmVDbGtFcnJTaGlmdAogKAogCUdUX1UzMiBkZXZOdW0sCiAJR1RfVTMyIGludGVyZmFjZUlkLAotCUdUX1UzMiBidXNJZCwKLQlHVF9VMzIgYnVzSWREZWx0YQorCUdUX1UzMiBidXNJZAogKTsKKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIG12SHdzRGRyM1RpcE1heENTR2V0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQodm9pZCkKK0dUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldChHVF9VMzIgZGV2TnVtKQogewotICBHVF9VMzIgY19jczsKKyAgR1RfVTMyIGNfY3MsaW50ZXJmYWNlSWQ9MCxidXNJZD0wOworICBHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogICBzdGF0aWMgR1RfVTMyIG1heF9jcz0wOwogCi0gIGlmICghbWF4X2NzKXsKLQkgZm9yKGNfY3MgPSAwO2NfY3MgPCBOVU1fT0ZfQ1M7IGNfY3MrKyl7Ci0JCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zWzBdLmFzQnVzUGFyYW1zWzBdLmNzQml0bWFzaywgY19jcykKKyAgaWYgKCFtYXhfY3MpCisgIHsKKyAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwR2V0Rmlyc3RBY3RpdmVJZigoR1RfVTgpZGV2TnVtLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgJmludGVyZmFjZUlkKSk7CisgCSAgZm9yKGJ1c0lkPTA7IGJ1c0lkPG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKKyAgICAgIHsKKyAgICAgICAgICBWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZm9yKGNfY3MgPSAwO2NfY3MgPCBOVU1fT0ZfQ1M7IGNfY3MrKykKKyAgICAgIHsKKwkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLmFzQnVzUGFyYW1zW2J1c0lkXS5jc0JpdG1hc2ssIGNfY3MpCiAJCW1heF9jcysrOwotCQl9CisJICB9CiAgIH0KICAgcmV0dXJuIG1heF9jczsKIH0KQEAgLTEzNCw3ICsxNDUsNyBAQAogKQogewogICAgIEdUX1UzMiBkYXRhLCBtYXNrOwotCUdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgpOworCUdUX1UzMiBtYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldChkZXZOdW0pOwogCUdUX1UzMiBidXNOdW0sIGludGVyZmFjZUlkLCBjbFZhbDsKICAgICBNVl9IV1NfU1BFRURfQklOIHNwZWVkQmluSW5kZXg7CiAJR1RfVTMyIGNzRW5hYmxlUmVnVmFsW01BWF9JTlRFUkZBQ0VfTlVNXSA9IHswfTsgLyogc2F2ZSBjdXJyZW50IENTIHZhbHVlICovCkBAIC0xNDMsNTcgKzE1NCw3IEBACiAJR1RfVTggICBSTFZhbHVlc1tOVU1fT0ZfQ1NdW01BWF9CVVNfTlVNXVtNQVhfSU5URVJGQUNFX05VTV0gOwogCVBhdHRlcm5JbmZvICpwYXR0ZXJuVGFibGUgPSBkZHIzVGlwR2V0UGF0dGVyblRhYmxlKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c1B1cFJlZ01hcCA9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c1B1cFJlZ01hcCgpOwotCi0KLQkvKkRFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0lORk8sICgiPT09UkVBRCBMRVZFTElORz09PSIpKTsqLwotICAgIGlmIChybFZlcnNpb24gPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qIE9MRCBSTCBtYWNoaW5lICovCi0gICAgICAgIGRhdGEgPSAweDQwOwotICAgICAgICBkYXRhIHw9ICgxPDwyMCk7Ci0gICAgICAgIC8qIFRCRCBtdWx0aSBDUyAqLwotICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1JFRywgZGF0YSwgMHgxMUZGRkYpKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBUUkFJTklOR19QQVRURVJOX0JBU0VfQUREUkVTU19SRUcsIDAsIDB4RkZGRkZGRjgpKTsKLSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBUUkFJTklOR19SRUcsIChHVF9VMzIpKDEgPDwgMzEpLCAoR1RfVTMyKSgxIDw8IDMxKSkpOwotICAgICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQotICAgICAgICB7Ci0gICAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgICAgIHRyYWluaW5nUmVzdWx0W3RyYWluaW5nU3RhZ2VdW2ludGVyZmFjZUlkXSA9IFRFU1RfU1VDQ0VTUzsKLSAgICAgICAgICAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMCwgKEdUX1UzMikoMSA8PCAzMSksIFRSQUlOSU5HX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiUkw6IEREUjMgcG9sbCBmYWlsZWQoMSkgSUYgJWRcbiIsIGludGVyZmFjZUlkKSk7Ci0gICAgICAgICAgICAgICAgdHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID0gVEVTVF9GQUlMRUQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSA9PSBHVF9GQUxTRSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBHVF9GQUlMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiByZWFkIHJlYWQtbGV2ZWxpbmcgcmVzdWx0ICovCi0gICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBUUkFJTklOR19SRUcsIGRhdGFSZWFkLCAxPDwzMCkpOwotICAgICAgICAvKiBleGl0IHJlYWQgbGV2ZWxpbmcgbW9kZSAqLwotICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1NXXzJfUkVHLCAweDgsIDB4OSkpOwotICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1NXXzFfUkVHLCAxPDwxNiwgMTw8MTYpKTsKLSAgICAgICAgLyogZGlzYWJsZSBSTCBtYWNoaW5lIGFsbCBUcm5fQ1NbMzowXSAsIFsxNjowXSAqLwotCi0gICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfUkVHLCAgMCwgMHhGMUZGRkYpKTsKLQotICAgICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICAgICAgaWYgKChkYXRhUmVhZFtpbnRlcmZhY2VJZF0mKDE8PDMwKSkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJcblJlYWQgTGV2ZWxpbmcgZmFpbGVkIGZvciBJRiAlZFxuIiwgaW50ZXJmYWNlSWQpKTsKLSAgICAgICAgICAgICAgICB0cmFpbmluZ1Jlc3VsdFt0cmFpbmluZ1N0YWdlXVtpbnRlcmZhY2VJZF0gPSBURVNUX0ZBSUxFRDsKLSAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlID09IEdUX0ZBTFNFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7IAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gR1RfT0s7Ci0gICAgfQotICAgIC8qIE5FVyBSTCBtYWNoaW5lICovCisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogCWZvcihlZmZlY3RpdmVfY3MgPSAwOyBlZmZlY3RpdmVfY3MgPCBOVU1fT0ZfQ1M7IGVmZmVjdGl2ZV9jcysrKQogCQlmb3IoYnVzTnVtID0gMDsgYnVzTnVtIDwgTUFYX0JVU19OVU07IGJ1c051bSsrKQpAQCAtMjg2LDUwICsyNDcsNDggQEAKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1JFRywgKDEgPDwgMjQpIHwgKDEgPDwgMjApLCAoMSA8PCAyNCkgfCAoMSA8PCAyMCkpKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1JFRywgKEdUX1UzMikoMSA8PCAzMSksIChHVF9VMzIpKDEgPDwgMzEpKSk7CiAgICAgLyoqKioqKioqKiB0cmlnZ2VyIHRyYWluaW5nICoqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQUxMRVlDQVQzKSAgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkgLyogVHJpZ2dlciwgcG9sbCBvbiBzdGF0dXMgYW5kIGRpc2FibGUgT0RQRyAqLwotLyogICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAweDEsIDB4MSkpOyAqLwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgMHgxLCAweDEpKTsKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMHgxLCAweDEpKTsKKwlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAweDEsIDB4MSkpOwogCi0JICAvKmNoZWNrIGZvciB0cmFpbmluZyBkb25lICsgcmVzdWx0cyBwYXNzKi8KLQkgIGlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgMHgyLCAweDIsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCi0JCSAgewotCQkJICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJUcmFpbmluZyBEb25lIEZhaWxlZFxuIikpOwotCQkJICByZXR1cm4gR1RfRkFJTDsKLQkJICB9Ci0gICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKLSAgICB7Ci0gICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgIGRhdGFSZWFkLCAweDQpKTsKLQlkYXRhID0gZGF0YVJlYWRbaW50ZXJmYWNlSWRdOwotCWlmKGRhdGEgIT0gMHgwKSB7Ci0JICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJUcmFpbmluZyBSZXN1bHQgRmFpbGVkXG4iKSk7Ci0JICB9Ci0gICAgfQotCSAgLypkaXNhYmxlIE9EUEcgLSBCYWNrIHRvIGZ1bmN0aW9uYWwgbW9kZSovCi0JICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfRU5BQkxFX1JFRywgMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTLCAgKDB4MSA8PCBPRFBHX0RJU0FCTEVfT0ZGUykpKTsKLQkgIGlmIChkZHIzVGlwSWZQb2xsaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgMHgwLCAweDEsIE9EUEdfRU5BQkxFX1JFRywgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCisJCSAgLypjaGVjayBmb3IgdHJhaW5pbmcgZG9uZSArIHJlc3VsdHMgcGFzcyovCisJCSAgaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDIsIDB4MiwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKIAkJCSAgewotCQkJCSAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiT0RQRyBkaXNhYmxlIGZhaWxlZCAiKSk7CisJCQkJICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJUcmFpbmluZyBEb25lIEZhaWxlZFxuIikpOwogCQkJCSAgcmV0dXJuIEdUX0ZBSUw7CiAJCQkgIH0KLQkgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19EQVRBX0NPTlRST0xfUkVHLCAwLCBNQVNLX0FMTF9CSVRTKSk7Ci0jZWxzZSAvKiBKdXN0IHRyaWdnZXIgYW5kIGdvIGNoZWNrIGZvciByZXN1bHRzICovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsIDB4MSwgMHgxKSk7Ci0jZW5kaWYKLQorCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQorCQl7CisJCSAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoICBkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAgZGF0YVJlYWQsIDB4NCkpOworCQlkYXRhID0gZGF0YVJlYWRbaW50ZXJmYWNlSWRdOworCQlpZihkYXRhICE9IDB4MCkgeworCQkgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIFJlc3VsdCBGYWlsZWRcbiIpKTsKKwkJICB9CisJCX0KKwkJICAvKmRpc2FibGUgT0RQRyAtIEJhY2sgdG8gZnVuY3Rpb25hbCBtb2RlKi8KKwkJICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfRU5BQkxFX1JFRywgMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTLCAgKDB4MSA8PCBPRFBHX0RJU0FCTEVfT0ZGUykpKTsKKwkJICBpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MCwgMHgxLCBPRFBHX0VOQUJMRV9SRUcsIE1BWF9QT0xMSU5HX0lURVJBVElPTlMpICE9IEdUX09LKQorCQkJCSAgeworCQkJCQkgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIk9EUEcgZGlzYWJsZSBmYWlsZWQgIikpOworCQkJCQkgIHJldHVybiBHVF9GQUlMOworCQkJCSAgfQorCQkgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19EQVRBX0NPTlRST0xfUkVHLCAwLCBNQVNLX0FMTF9CSVRTKSk7CisJfQorCWVsc2UgeworCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMHgxLCAweDEpKTsKKwl9CiAJCS8qKioqKioqKioqKiogZG91YmxlIGxvb3Agb24gYnVzLCBwdXAgKioqKioqKioqLwogCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogCQl7CiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCQkJLyogY2hlY2sgdHJhaW5pbmcgZG9uZSAqLwogCQkJaXNBbnlQdXBGYWlsID0gR1RfRkFMU0U7Ci0JCQlmb3IgKGJ1c051bT0wOyBidXNOdW08dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNOdW0rKykKKwkJCWZvciAoYnVzTnVtPTA7IGJ1c051bTxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c051bSsrKQogCQkJewogICAgICAgIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c051bSkKIAkJCQlpZiAoZGRyM1RpcElmUG9sbGluZyhkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAoMSA8PCAyNSksICgxIDw8IDI1KSwgbWFza1Jlc3VsdHNQdXBSZWdNYXBbYnVzTnVtXSwgTUFYX1BPTExJTkdfSVRFUkFUSU9OUykgIT0gR1RfT0spCiAJCQkJewotCQkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJcblJMOiBERFIzIHBvbGwgZmFpbGVkKDIpIGZvciBidXMgJWQiLCBidXNOdW0pKTsKKwkJCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiXG5STDogRERSMyBwb2xsIGZhaWxlZCgyKSBmb3IgSUYgJWQgQ1MgJWQgYnVzICVkIiwgaW50ZXJmYWNlSWQsIGVmZmVjdGl2ZV9jcywgYnVzTnVtKSk7CiAJCQkJCWlzQW55UHVwRmFpbCA9IEdUX1RSVUU7CiAJCQkJfQogCQkJCWVsc2UKQEAgLTM2OSw3ICszMjgsNyBAQAogCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogCQl7CiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCQkJZm9yIChidXNOdW09MDsgYnVzTnVtPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzTnVtKyspCisJCQlmb3IgKGJ1c051bT0wOyBidXNOdW08b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNOdW0rKykKIAkJCXsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCiAJCQkJLyogcmVhZCByZXN1bHQgcGVyIHB1cCBmcm9tIGFycnkgKi8KQEAgLTQwOSw3ICszNjgsNyBAQAogKQogewogCUdUX1UzMiBjX2NzLCBpbnRlcmZhY2VJZCwgY3NfbWFzayA9IDA7Ci0JR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KCk7CisJR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KGRldk51bSk7CiAKIC8qCWluIFRSQUlOSVVORyByZWcgKDB4MTViMCkgd3JpdGUgMHg4MDAwMDAwOCB8IGNzX21hc2s6CiAJVHJuU3RhcnQKQEAgLTQ0Myw3ICs0MDIsNyBAQAogKQogewogCUdUX1UzMiBjX2NzLCBpbnRlcmZhY2VJZCwgY3NfbWFzayA9IDA7Ci0JR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KCk7CisJR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KGRldk51bSk7CiAKIAkvKiBpbiBUUkFJTklVTkcgcmVnICgweDE1YjApIHdyaXRlIDB4ODAwMDAwNDAgfCBjc19tYXNrOgogCVRyblN0YXJ0CkBAIC00OTQsMTEgKzQ1MywxMiBAQAogICAgIEdUX1UzMiAgZGF0YTJXcml0ZVtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOwogCVBhdHRlcm5JbmZvICpwYXR0ZXJuVGFibGUgPSBkZHIzVGlwR2V0UGF0dGVyblRhYmxlKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c0RxUmVnTWFwIAk9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c0RxUmVnKCk7Ci0gICAgCisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKwogCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU07IGludGVyZmFjZUlkKyspCiAJewogCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICBmb3IoYnVzTnVtID0gMDsgYnVzTnVtIDw9dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNOdW0rKykKKyAgICAgICAgZm9yKGJ1c051bSA9IDA7IGJ1c051bSA8PW9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzTnVtKyspCiAJCXsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCiAJCQkJcGVyQml0UkxQdXBTdGF0dXNbaW50ZXJmYWNlSWRdW2J1c051bV0gPSAwOwkKQEAgLTU4Miw0NCArNTQyLDQzIEBACiAJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgVFJBSU5JTkdfUkVHLCAoMSA8PCAyNCkgfCAoMSA8PCAyMCksICgxIDw8IDI0KSB8ICgxIDw8IDIwKSkpOwogCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIFRSQUlOSU5HX1JFRywgKEdUX1UzMikoMSA8PCAzMSksIChHVF9VMzIpKDEgPDwgMzEpKSk7CiAJCS8qKioqKioqKiogdHJpZ2dlciB0cmFpbmluZyAqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgLyogVHJpZ2dlciwgcG9sbCBvbiBzdGF0dXMgYW5kIGRpc2FibGUgT0RQRyAqLwotLyogICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAweDEsIDB4MSkpOyAqLwotCSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsIDB4MSwgMHgxKSk7Ci0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCAweDEsIDB4MSkpOworCQlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPj0gTVZfVElQX1JFVl8zKXsKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgMHgxLCAweDEpKTsKIAotCQkvKmNoZWNrIGZvciB0cmFpbmluZyBkb25lICsgcmVzdWx0cyBwYXNzKi8KLQkJaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDIsIDB4MiwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKKwkJCS8qY2hlY2sgZm9yIHRyYWluaW5nIGRvbmUgKyByZXN1bHRzIHBhc3MqLworCQkJaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDIsIDB4MiwgT0RQR19UUkFJTklOR19TVEFUVVNfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKKwkJCXsKKwkJCQkgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiVHJhaW5pbmcgRG9uZSBGYWlsZWRcbiIpKTsKKwkJCQkgcmV0dXJuIEdUX0ZBSUw7CisJCQl9CisJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCXsKLQkJCSBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJUcmFpbmluZyBEb25lIEZhaWxlZFxuIikpOwotCQkJIHJldHVybiBHVF9GQUlMOworCQkgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgIGRhdGFSZWFkLCAweDQpKTsKKwkJCWRhdGEgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07CisJCQlpZihkYXRhICE9IDB4MCkgeworCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIlRyYWluaW5nIFJlc3VsdCBGYWlsZWRcbiIpKTsKKwkJCX0KIAkJfQotICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCi0gICAgewotICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIE9EUEdfVFJBSU5JTkdfVFJJR0dFUl9SRUcsICBkYXRhUmVhZCwgMHg0KSk7Ci0JCWRhdGEgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07Ci0JCWlmKGRhdGEgIT0gMHgwKSB7Ci0JCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJUcmFpbmluZyBSZXN1bHQgRmFpbGVkXG4iKSk7CisJCQkvKmRpc2FibGUgT0RQRyAtIEJhY2sgdG8gZnVuY3Rpb25hbCBtb2RlKi8KKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19FTkFCTEVfUkVHLCAweDEgPDwgT0RQR19ESVNBQkxFX09GRlMsICAoMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTKSkpOworCQkJaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDAsIDB4MSwgT0RQR19FTkFCTEVfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKKwkJCXsKKwkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJPRFBHIGRpc2FibGUgZmFpbGVkICIpKTsKKwkJCQlyZXR1cm4gR1RfRkFJTDsKKwkJCX0KKwkJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19EQVRBX0NPTlRST0xfUkVHLCAwLCBNQVNLX0FMTF9CSVRTKSk7CiAJCX0KLQl9Ci0JCS8qZGlzYWJsZSBPRFBHIC0gQmFjayB0byBmdW5jdGlvbmFsIG1vZGUqLwotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfRU5BQkxFX1JFRywgMHgxIDw8IE9EUEdfRElTQUJMRV9PRkZTLCAgKDB4MSA8PCBPRFBHX0RJU0FCTEVfT0ZGUykpKTsKLQkJaWYgKGRkcjNUaXBJZlBvbGxpbmcoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDAsIDB4MSwgT0RQR19FTkFCTEVfUkVHLCBNQVhfUE9MTElOR19JVEVSQVRJT05TKSAhPSBHVF9PSykKLQkJewotCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiT0RQRyBkaXNhYmxlIGZhaWxlZCAiKSk7Ci0JCQlyZXR1cm4gR1RfRkFJTDsKKwkJZWxzZSB7CisJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMHgxLCAweDEpKTsKIAkJfQotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfREFUQV9DT05UUk9MX1JFRywgMCwgTUFTS19BTExfQklUUykpOwotI2Vsc2UgLyogSnVzdCB0cmlnZ2VyIGFuZCBnbyBjaGVjayBmb3IgcmVzdWx0cyAqLwotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMHgxLCAweDEpKTsKLSNlbmRpZgogCiAJCS8qKioqKioqKioqKiogZG91YmxlIGxvb3Agb24gYnVzLCBwdXAgKioqKioqKioqLwogCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogCQl7CiAJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCQkJLyogY2hlY2sgdHJhaW5pbmcgZG9uZSAqLwotCQkJZm9yIChidXNOdW09MDsgYnVzTnVtPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzTnVtKyspCisJCQlmb3IgKGJ1c051bT0wOyBidXNOdW08b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNOdW0rKykKIAkJCXsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCiAJCQkJaWYgKHBlckJpdFJMUHVwU3RhdHVzW2ludGVyZmFjZUlkXVtidXNOdW1dID09IEdUX0ZBTFNFKQpAQCAtNjYyLDcgKzYyMSw3IEBACiAJCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogCQkJewogCQkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0JCQkJZm9yIChidXNOdW09MDsgYnVzTnVtPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzTnVtKyspCisJCQkJZm9yIChidXNOdW09MDsgYnVzTnVtPG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzTnVtKyspCiAJCQkJewogCSAgIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCiAJCQkJCWlmIChwZXJCaXRSTFB1cFN0YXR1c1tpbnRlcmZhY2VJZF1bYnVzTnVtXSAhPSBHVF9UUlVFKQpAQCAtNjg0LDExICs2NDMsMTEgQEAKIAlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKIAkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yIChidXNOdW09MDsgYnVzTnVtPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzTnVtKyspCisgICAgICAgIGZvciAoYnVzTnVtPTA7IGJ1c051bTxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c051bSsrKQogICAgICAgICB7CiAJICAgCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNOdW0pCiAJCQlpZiAocGVyQml0UkxQdXBTdGF0dXNbaW50ZXJmYWNlSWRdW2J1c051bV0gPT0gR1RfVFJVRSkKLQkJCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgUkxfUEhZX1JFRyArIENTX1JFR19WQUxVRShlZmZlY3RpdmVfY3MpLCBkYXRhMldyaXRlW2ludGVyZmFjZUlkXVtidXNOdW1dKTsKKwkJCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNOdW0sIEREUl9QSFlfREFUQSwgUkxfUEhZX1JFRyArIENTX0JZVEVfR0FQKGVmZmVjdGl2ZV9jcyksIGRhdGEyV3JpdGVbaW50ZXJmYWNlSWRdW2J1c051bV0pOwogCQkJZWxzZQogCQkJCWlzQW55UHVwRmFpbCA9IEdUX1RSVUU7CiAJCX0KQEAgLTc0Nyw2ICs3MDYsNyBAQAogewogCUdUX1UzMiBhbGxCdXNDcyA9IDAsIHNhbWVCdXNDczsKIAlHVF9VMzIgYnVzQ250OworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKIAlkZXZOdW0gPSBkZXZOdW07IC8qIGF2b2lkIHdhcm5pbmdzICovCiAKQEAgLTc1OCw3ICs3MTgsNyBAQAogCSAgIGlmIHRoZXkgYXJlIHRoZXkgYXJlIG5vdCB0aGUgc2FtZSB0aGVuIGl0J3MgbWl4ZWQgbW9kZSBzbyBhbGwgQ1Mgc2hvdWxkIGJlIGNvbmZpZ3VyZWQKIAkgICAod2hlbiBjb25maWd1cmluZyB0aGUgTVJTKSovCiAKLQlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNDbnQrKykKKwlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0NudCkKIApAQCAtNzgxLDcgKzc0MSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBHVF9TVEFUVVMgICAgZGRyM1RpcER5bmFtaWNXcml0ZUxldmVsaW5nKEdUX1UzMiAgICBkZXZOdW0pCiB7Ci0gICAgR1RfVTMyICAgcmVnRGF0YSA9IDAsIGl0ZXIsIGludGVyZmFjZUlkLCBidXNDbnQ7CisgICAgR1RfVTMyICAgcmVnRGF0YSA9IDAsIGl0ZXIsIGludGVyZmFjZUlkLCBidXNDbnQsIHRyaWdnZXJSZWdBZGRyOwogCUdUX1UzMiAgIGNzRW5hYmxlUmVnVmFsW01BWF9JTlRFUkZBQ0VfTlVNXSA9IHswfTsKICAgICBHVF9VMzIgICBjc01hc2tbTUFYX0lOVEVSRkFDRV9OVU1dOwogICAgIEdUX1UzMiAgIHJlYWREYXRhU2FtcGxlRGVsYXlWYWxzW01BWF9JTlRFUkZBQ0VfTlVNXSA9IHswfTsKQEAgLTc5MiwxNCArNzUyLDE0IEBACiAJR1RfVTggICBXTFZhbHVlc1tOVU1fT0ZfQ1NdW01BWF9CVVNfTlVNXVtNQVhfSU5URVJGQUNFX05VTV07CiAJR1RfVTE2ICptYXNrUmVzdWx0c1B1cFJlZ01hcCA9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c1B1cFJlZ01hcCgpOwogCUdUX1UzMiBjc01hc2swW01BWF9JTlRFUkZBQ0VfTlVNXT17MH07Ci0JR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KCk7Ci0gICAgLypERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9JTkZPLCAoIj09PVdSSVRFIExFVkVMSU5HPT09IikpOyovCisJR1RfVTMyIG1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KGRldk51bSk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCi0gICAgICAgIHRyYWluaW5nUmVzdWx0W3RyYWluaW5nU3RhZ2VdW2ludGVyZmFjZUlkXSA9IFRFU1RfU1VDQ0VTUzsKKwkJdHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID0gVEVTVF9TVUNDRVNTOwogCiAgICAgICAgIC8qIHNhdmUgUmVhZCBEYXRhIFNhbXBsZSBEZWxheSAqLwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIFJFQURfREFUQV9TQU1QTEVfREVMQVksIHJlYWREYXRhU2FtcGxlRGVsYXlWYWxzLCBNQVNLX0FMTF9CSVRTKSk7CkBAIC04MDgsMTAgKzc2OCwxMSBAQAogICAgICAgICAvKiBzYXZlIGN1cnJlbnQgY3MgcmVnIHZhbCAqLwogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIENTX0VOQUJMRV9SRUcsIGNzRW5hYmxlUmVnVmFsLCBNQVNLX0FMTF9CSVRTKSk7CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgJiYgIWRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgICYmICFkZWZpbmVkKENPTkZJR19BUk1BREFfMzlYKQotICAgICAgICAvKiBlbmFibGUgbXVsdGkgY3MgKi8KLSAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQ1NfRU5BQkxFX1JFRywgMCwgKDEgPDwgMykpKTsKLSNlbmRpZgorCQlpZihkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfVElQX1JFVikgPCBNVl9USVBfUkVWXzMpCisJCXsKKwkJICAgIC8qIGVuYWJsZSBtdWx0aSBjcyAqLworCQkgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQ1NfRU5BQkxFX1JFRywgMCwgKDEgPDwgMykpKTsKKwkJfQogICAgIH0KIAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04NDksMTYgKzgxMCwxNyBAQAogCQkJZGRyM1RpcENhbGNDc01hc2soZGV2TnVtLCBpbnRlcmZhY2VJZCwgZWZmZWN0aXZlX2NzLCAmY3NNYXNrW2ludGVyZmFjZUlkXSk7CiAJCX0KIAotCSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0JCS8qRW5hYmxlIE91dHB1dCBidWZmZXIgdG8gcmVsZXZhbnQgQ1MgLSBRIG9uICwgV0wgb24qLwotCQlDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrLCBNUlMxX0NNRCwgMHg4MCwgMHgxMDgwKSk7CisJCWlmKGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWKSA+PSBNVl9USVBfUkVWXzMpCisJCXsKKwkJCS8qRW5hYmxlIE91dHB1dCBidWZmZXIgdG8gcmVsZXZhbnQgQ1MgLSBRIG9uICwgV0wgb24qLworCQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzaywgTVJTMV9DTUQsIDB4ODAsIDB4MTA4MCkpOwogCi0JCS8qZW5hYmxlIG9kdCBmb3IgcmVsZXZhbnQgQ1MqLwotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIDB4MTQ5OCwgKDB4Mzw8KGVmZmVjdGl2ZV9jcyoyKSkgLCAweGYpKTsKLQotCSNlbHNlCi0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2ssIE1SUzFfQ01ELCAweEMwLCAweDEyQzQpKTsKLQkjZW5kaWYKKwkJCS8qZW5hYmxlIG9kdCBmb3IgcmVsZXZhbnQgQ1MqLworCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDE0OTgsICgweDM8PChlZmZlY3RpdmVfY3MqMikpICwgMHhmKSk7CisJCX0KKwkJZWxzZSB7CisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcFdyaXRlTVJTQ21kKGRldk51bSwgY3NNYXNrLCBNUlMxX0NNRCwgMHhDMCwgMHgxMkM0KSk7IC8qRklYTUUgc2hvdWxkIGJlIHNhbWUgYXMgX0NQVSBjYXNlKi8KKwkJfQogCiAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCS8qICAgICBQaGFzZSAyOiBTZXQgdHJhaW5pbmcgSVAgdG8gd3JpdGUgbGV2ZWxpbmcgbW9kZSAgICAgICAgICAgICAgICAgICovCkBAIC04NjgsMTQgKzgzMCwxMiBAQAogCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiAgICAgUGhhc2UgMzogVHJpZ2dlciB0cmFpbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCi0JCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgT0RQR19UUkFJTklOR19UUklHR0VSX1JFRywgMHgxLCAweDEpKTsKLQkjZWxzZQotCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIE9EUEdfVFJBSU5JTkdfU1RBVFVTX1JFRywgMHgxLCAweDEpKTsKLQkjZW5kaWYKKwkJdHJpZ2dlclJlZ0FkZHIgPSAoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpIDwgTVZfVElQX1JFVl8zKT8oT0RQR19UUkFJTklOR19TVEFUVVNfUkVHKTooT0RQR19UUkFJTklOR19UUklHR0VSX1JFRyk7CisJCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgdHJpZ2dlclJlZ0FkZHIsIDB4MSwgMHgxKSk7CiAKIAotCSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkKENPTkZJR19BTExFWUNBVDMpIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCisJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMykKKwl7CiAJICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW50ZXJmYWNlSWQrKykKIAkJewogCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKQEAgLTg4NSwxOSArODQ1LDIyIEBACiAJCQl7CiAJCQkJREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfRVJST1IsICgiV0w6IEREUjMgcG9sbCAoNCkgZmFpbGVkIChEYXRhOiAweCV4KVxuIiwgcmVnRGF0YSkpOwogCQkJfQotCSNpZiAhZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgLypEaXNhYmxlZC4gSklSQSAjMTQ5OCovCiAJCQllbHNlCiAJCQl7Ci0JCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCAmcmVnRGF0YSwgKDEgPDwgMikpKTsKLQkJCQlpZiAocmVnRGF0YSAhPSAwKQorICAgICAgICAgICAgICAgICNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSAvKiBKSVJBICMxNDk4IGZvciAxNiBiaXQgd2l0aCBFQ0MgKi8KKyAgICAgICAgICAgICAgICBpZih0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzayA9PSAweEIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX1RSQUlOSU5HX1RSSUdHRVJfUkVHLCBkYXRhUmVhZCwgKDEgPDwgMikpKTsKKwkJCQlpZiAoZGF0YVJlYWRbaW50ZXJmYWNlSWRdICE9IDApCiAJCQkJewotCQkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJXTDogV0wgZmFpbGVkIElGICVkIHJlZ0RhdGE9MHgleFxuIixpbnRlcmZhY2VJZCxyZWdEYXRhKSk7CisJCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMIDE6IFdMIGZhaWxlZCBJRiAlZCByZWdEYXRhPTB4JXhcbiIsaW50ZXJmYWNlSWQsZGF0YVJlYWRbaW50ZXJmYWNlSWRdKSk7CiAJCQkJfQogCQkJfQotCSNlbmRpZgogCQl9Ci0JI2VuZGlmCi0KKwl9CiAJCWZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAJCXsKIAkJCVZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCkBAIC05MDgsMjYgKzg3MSwzMSBAQAogCQkJfQogCQkJZWxzZQogCQkJewotCSNpZiAhZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgLypEaXNhYmxlZC4gSklSQSAjMTQ5OCovCiAJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBPRFBHX1RSQUlOSU5HX1NUQVRVU19SRUcsIGRhdGFSZWFkLCAoMSA8PCAyKSkpOwogCQkJCXJlZ0RhdGEgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07CisgICAgICAgICAgICAgICAgI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIC8qIEpJUkEgIzE0OTggZm9yIDE2IGJpdCB3aXRoIEVDQyAqLworICAgICAgICAgICAgICAgIGlmKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrID09IDB4QikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBkYXRhIHRvIDAgaW4gb3JkZXIgdG8gc2tpcCB0aGUgY2hlY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVnRGF0YSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgogCQkJCWlmIChyZWdEYXRhICE9IDApCiAJCQkJewotCQkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJXTDogV0wgZmFpbGVkIElGICVkIHJlZ0RhdGE9MHgleFxuIixpbnRlcmZhY2VJZCxyZWdEYXRhKSk7CisJCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoIldMIDI6ICBXTCBmYWlsZWQgSUYgJWQgcmVnRGF0YT0weCV4XG4iLGludGVyZmFjZUlkLHJlZ0RhdGEpKTsKIAkJCQl9Ci0JI2VuZGlmCiAKIAkJCQkvKiBjaGVjayBmb3IgdHJhaW5pbmcgY29tcGxldGlvbiBwZXIgYnVzICovCi0JCQkJZm9yIChidXNDbnQ9MDsgYnVzQ250PHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzQ250KyspCisJCQkJZm9yIChidXNDbnQ9MDsgYnVzQ250PG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspCiAJCQkJewogICAgICAgIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAJCQkJCS8qIHRyYWluaW5nIHN0YXR1cyAqLwotCQkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIG1hc2tSZXN1bHRzUHVwUmVnTWFwW2J1c0NudF0sIGRhdGFSZWFkLCAoMSA8PCAyNSkpKTsKKwkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBtYXNrUmVzdWx0c1B1cFJlZ01hcFtidXNDbnRdLCBkYXRhUmVhZCwgTUFTS19BTExfQklUUykpOwogICAgIAkJCQlyZWdEYXRhID0gZGF0YVJlYWRbaW50ZXJmYWNlSWRdOwogCQkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiV0w6IElGICVkIEJVUyAlZCByZWcgMHgleFxuIiwgaW50ZXJmYWNlSWQsIGJ1c0NudCxyZWdEYXRhKSk7Ci0JCQkJCWlmIChyZWdEYXRhID09IDApCisJCQkJCWlmKChyZWdEYXRhICYgKDEgPDwgMjUpKSA9PSAwICkKIAkJCQkJewotCQkJCQkJcmVzVmFsdWVzWyhpbnRlcmZhY2VJZCAqIHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkgKyBidXNDbnRdID0gR1RfVFJVRTsKKwkJCQkJCXJlc1ZhbHVlc1soaW50ZXJmYWNlSWQgKiBvY3RldHNQZXJJbnRlcmZhY2VOdW0pICsgYnVzQ250XSA9IEdUX1RSVUU7CiAJCQkJCX0KIAkJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBtYXNrUmVzdWx0c1B1cFJlZ01hcFtidXNDbnRdLCBkYXRhUmVhZCwgMHhmZikpOwogCQkJCQlXTFZhbHVlc1tlZmZlY3RpdmVfY3NdW2J1c0NudF1baW50ZXJmYWNlSWRdID0gKEdUX1U4KWRhdGFSZWFkW2ludGVyZmFjZUlkXTsgLyogc2F2ZSB0aGUgcmVhZCB2YWx1ZSB0aGF0IHNob3VsZCBiZSB3cml0ZSB0byBQSFkgcmVnaXN0ZXIgKi8KQEAgLTkzNiwxNyArOTA0LDQ3IEBACiAJCX0KIAogCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQkvKiAgICAgUGhhc2UgMy41OiBWYWxpZGF0ZSByZXN1bHQgcGhhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQlmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKQorCQl7CisJCQlWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQorCQkJZm9yIChidXNDbnQ9MDsgYnVzQ250PG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzQ250KyspeworCisJCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzQ250KQorCQkJCS8qcmVhZCByZXN1bHQgY29udHJvbCByZWdpc3RlciBhY2NvcmRpbmcgdG8gcHVwICovCisJCQkJcmVnRGF0YSA9IFdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF0gKyAxNiA7LyoxNiBpcyBoYWxmIGEgcGhhc2UqLworCQkJCS8qIHdyaXRlIGludG8gd3JpdGUgbGV2ZWxpbmcgcmVnaXN0ZXIgKFs0OjBdIEFETEwsIFs4OjZdIFBoYXNlLCBbMTU6MTBdIChjZW50cmFsaXphdGlvbikgQURMTCArIDB4MTApICovCisJCQkJcmVnRGF0YSA9IChyZWdEYXRhICYgMHgxZikgfCAoKChyZWdEYXRhICYgMHhFMCkgPj4gNSkgPDwgNikgfCAoKChyZWdEYXRhICYgMHgxZikgKyBQaHlSZWcxVmFsKSA8PCAxMCk7CisJCQkJbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0NudCwgRERSX1BIWV9EQVRBLAorCQkJCQkJCQkJV0xfUEhZX1JFRyArIDAqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsIHJlZ0RhdGEpOy8qd2UgYWx3YXlzIHdvcmsgd2l0aCBDUzAgc28gdGhlIHNlYXJjaCBpcyB3aXRoIFdMLUNTMCByZWdpc3RlciBpbiB0aGUgcGh5Ki8KKworCQkJCS8qQ2hlY2sgaWYgZGF0YSByZWFkIGZyb20gRFJBTSBub3QgY2hhbmdlZCwgaWYgc28gLSBmaXggdGhlIHJlc3VsdCovCisJCQkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBUUkFJTklOR19XUklURV9MRVZFTElOR19SRUcsCisJCQkJCQkJCQlkYXRhUmVhZCwgTUFTS19BTExfQklUUykpOworCQkJCWlmKChkYXRhUmVhZFtpbnRlcmZhY2VJZF0mKDE8PCgyMCtidXNDbnQpKSk+PigyMCtidXNDbnQpID09IDApCisJCQkJeworCQkJCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgKCJXTFZhbHVlcyB3YXMgY2hhbmdlZCBmcm9tIDB4JVgiLCBXTFZhbHVlc1tlZmZlY3RpdmVfY3NdW2J1c0NudF1baW50ZXJmYWNlSWRdKSk7CisJCQkJCVdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF0gPSBXTFZhbHVlc1tlZmZlY3RpdmVfY3NdW2J1c0NudF1baW50ZXJmYWNlSWRdICsgMzI7CisJCQkJCURFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAoInRvIDB4JVhcbiIsIFdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF0pKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiAgICAgUGhhc2UgNDogRXhpdCB3cml0ZSBsZXZlbGluZyBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCQkvKiBkaXNhYmxlIERRcyB0b2dnbGluZyAqLwogCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsICBXUl9MRVZFTElOR19EUVNfUEFUVEVSTl9SRUcsIDB4MCwgMHgxKSk7CiAKIAkJLyogVXBkYXRlIE1SUyAxIChXTCBvZmYpICovCi0JI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzazAsIE1SUzFfQ01EICwgMHgxMDAwLCAweDEwODApKTsgIC8vIG5rbGVpbiAyNC4xMC4xMwotCSNlbHNlCi0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2swLCBNUlMxX0NNRCwgMHgxMDAwLCAweDEyQzQpKTsKLQkjZW5kaWYKKwkJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMykKKwkJeworCQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzazAsIE1SUzFfQ01EICwgMHgxMDAwLCAweDEwODApKTsKKwkJfQorCQllbHNlIHsKKwkJCUNIRUNLX1NUQVRVUyhkZHIzVGlwV3JpdGVNUlNDbWQoZGV2TnVtLCBjc01hc2swLCBNUlMxX0NNRCwgMHgxMDAwLCAweDEyQzQpKTsgLypGSVhNRSBzaG91bGQgYmUgc2FtZSBhcyBfQ1BVIGNhc2UqLworCQl9CiAKIAkJLyogVXBkYXRlIE1SUyAxIChyZXR1cm4gdG8gZnVuY3Rpb25hbCBtb2RlIC0gUSBvbiAsIFdMIG9mZikgKi8KIAkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBXcml0ZU1SU0NtZChkZXZOdW0sIGNzTWFzazAsIE1SUzFfQ01ELCAweDAsIDB4MTA4MCkpOwpAQCAtOTY1LDExICs5NjMsMTEgQEAKIAkJewogCQkJVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKIAkJCXRlc3RSZXMgPSAwOwotCQkJZm9yIChidXNDbnQ9MDsgYnVzQ250PHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzQ250KyspCisJCQlmb3IgKGJ1c0NudD0wOyBidXNDbnQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNDbnQrKykKIAkJCXsKIAkJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNDbnQpCiAJCQkJLyogY2hlY2sgaWYgcmVzdWx0ID09IHBhc3MgKi8KLQkJCQlpZiAocmVzVmFsdWVzWyhpbnRlcmZhY2VJZCAqIHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSkgKyBidXNDbnRdID09IDApCisJCQkJaWYgKHJlc1ZhbHVlc1soaW50ZXJmYWNlSWQgKiBvY3RldHNQZXJJbnRlcmZhY2VOdW0pICsgYnVzQ250XSA9PSAwKQogCQkJCXsKIAkJCQkJLypyZWFkIHJlc3VsdCBjb250cm9sIHJlZ2lzdGVyIGFjY29yZGluZyB0byBwdXAgKi8KIAkJCQkJcmVnRGF0YSA9IFdMVmFsdWVzW2VmZmVjdGl2ZV9jc11bYnVzQ250XVtpbnRlcmZhY2VJZF07CkBAIC0xMDEwLDEwICsxMDA4LDEwIEBACiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIENTX0VOQUJMRV9SRUcsIGNzRW5hYmxlUmVnVmFsW2ludGVyZmFjZUlkXSwgTUFTS19BTExfQklUUykpOwogICAgIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOFgpIHx8IGRlZmluZWQoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKLQkvKmRpc2FibGUgbW9kdDAgZm9yIENTMCB0cmFpbmluZyAtIG5lZWQgdG8gYWRqdXN0IGZvciBtdWx0eSBDUyovCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDE0OTgsIDB4MCAsIDB4ZikpOwotI2VuZGlmCisJaWYoZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYpID49IE1WX1RJUF9SRVZfMyl7CisJCS8qZGlzYWJsZSBtb2R0MCBmb3IgQ1MwIHRyYWluaW5nIC0gbmVlZCB0byBhZGp1c3QgZm9yIG11bHR5IENTKi8KKwkJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAweDE0OTgsIDB4MCAsIDB4ZikpOworCX0KICAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKQEAgLTEwMzUsMjAgKzEwMzMsMTkgQEAKICAgICBHVF8zMiBhZGxsT2Zmc2V0OwogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwgYnVzSWQsIGRhdGEsIGRhdGFUbXA7CiAgICAgR1RfQk9PTCBpc0lmRmFpbCA9IEdUX0ZBTFNFOwotCi0gICAgLypERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9JTkZPLCAoIj09PVdSSVRFIExFVkVMSU5HIFNVUFBMRU1FTlRBUlk9PT0iKSk7Ki8KKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCiAgICAgICAgIGlzSWZGYWlsID0gR1RfRkFMU0U7Ci0gICAgICAgIGZvcihidXNJZCA9IDA7IGJ1c0lkIDwgR0VUX1RPUE9MT0dZX05VTV9PRl9CVVNFUyhkZXZOdW0pOyBidXNJZCsrKQorICAgICAgICBmb3IoYnVzSWQgPSAwOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICAgICAgewogICAgICAgIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAgICAgICAgICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLmlzUHVwRmFpbCA9IEdUX1RSVUU7CiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsICZkYXRhKSk7CiAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiV0wgU3VwcDogYWRsbE9mZnNldD0wIGRhdGEgZGVsYXkgPSAlZCBcbiIsIGRhdGEpKTsKLSAgICAgICAgICAgIGlmIChkZHIzVGlwV2xTdXBwQWxpZ25QaGFzZVNoaWZ0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCAwLCAwKSA9PSBHVF9PSykKKyAgICAgICAgICAgIGlmIChkZHIzVGlwV2xTdXBwQWxpZ25QaGFzZVNoaWZ0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkKSA9PSBHVF9PSykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiV0wgU3VwcDogSUYgJWQgYnVzSWQgJWQgYWRsbE9mZnNldD0wIFN1Y2Nlc3MgIVxuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xMDU5LDcgKzEwNTYsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoICBkZXZOdW0sIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBXUklURV9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgZWZmZWN0aXZlX2NzKkNTX1JFR0lTVEVSX0FERFJfT0ZGU0VULCAmZGF0YVRtcCkpOwogICAgICAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIldMIFN1cHA6IGFkbGxPZmZzZXQ9ICVkIGRhdGEgZGVsYXkgPSAlZCBcbiIsIGFkbGxPZmZzZXQsIGRhdGFUbXApKTsKIAotICAgICAgICAgICAgaWYgKGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIGFkbGxPZmZzZXQsIDApID09IEdUX09LKQorICAgICAgICAgICAgaWYgKGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQpID09IEdUX09LKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTCBTdXBwOiBJRiAlZCBidXNJZCAlZCBhZGxsT2Zmc2V0PSAlZCBTdWNjZXNzICFcbiIsIGludGVyZmFjZUlkLCBidXNJZCwgYWRsbE9mZnNldCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTA2OSw3ICsxMDY2LDcgQEAKICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsIGRhdGEgKyBhZGxsT2Zmc2V0KSk7CiAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTUmVhZCggIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsICZkYXRhVG1wKSk7CiAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiV0wgU3VwcDogYWRsbE9mZnNldD0gJWQgZGF0YSBkZWxheSA9ICVkIFxuIiwgYWRsbE9mZnNldCwgZGF0YVRtcCkpOwotICAgICAgICAgICAgaWYgKGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIGFkbGxPZmZzZXQsIDApID09IEdUX09LKQorICAgICAgICAgICAgaWYgKGRkcjNUaXBXbFN1cHBBbGlnblBoYXNlU2hpZnQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQpID09IEdUX09LKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJXTCBTdXBwOiBJRiAlZCBidXNJZCAlZCBhZGxsT2Zmc2V0PSAlZCBTdWNjZXNzICFcbiIsIGludGVyZmFjZUlkLCBidXNJZCwgYWRsbE9mZnNldCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTA4MCwxMSArMTA3NywxMCBAQAogICAgICAgICAgICAgICAgIGlzSWZGYWlsID0gR1RfVFJVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiV0wgU3VwcDogSUYgJWQgYnVzSWQgJWQgaXNQdXBGYWlsICVkXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQsIGlzSWZGYWlsKSk7CiAKICAgICAgICAgaWYgKGlzSWZGYWlsID09IEdUX1RSVUUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX0VSUk9SLCAgKCJXTCBTdXBwOiBJRiAlZCBmYWlsZWRcbiIsIGludGVyZmFjZUlkKSk7CisgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9FUlJPUiwgICgiV0wgU3VwcCBDUyMgJWQ6IElGICVkIGZhaWxlZFxuIiwgZWZmZWN0aXZlX2NzICxpbnRlcmZhY2VJZCkpOwogICAgICAgICAgICAgdHJhaW5pbmdSZXN1bHRbdHJhaW5pbmdTdGFnZV1baW50ZXJmYWNlSWRdID0gVEVTVF9GQUlMRUQ7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQpAQCAtMTEwOCw0MSArMTEwNCw2MCBAQAogc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwV2xTdXBwQWxpZ25QaGFzZVNoaWZ0CiAoCiAJR1RfVTMyIGRldk51bSwKLQlHVF9VMzIgaW50ZXJmYWNlSWQsCi0JR1RfVTMyIGJ1c0lkLAotCUdUX1UzMiAgb2Zmc2V0LAotCUdUX1UzMiBidXNJZERlbHRhCisgICAgR1RfVTMyIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiBidXNJZAogKQogewotICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLnN0YWdlID0gUEhBU0VfU0hJRlQ7Ci0gICAgIGlmIChkZHIzVGlwWHNiQ29tcGFyZVRlc3QoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIDAsIGJ1c0lkRGVsdGEpID09IEdUX09LKQotICAgIHsKLSAgICAgICAgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5pc1B1cEZhaWwgPSBHVF9GQUxTRTsKLSAgICAgICAgcmV0dXJuIEdUX09LOwotICAgIH0KLSAgICAvKiAxIGNsb2NrIGVycm9yICovCi0gICAgZWxzZSBpZiAoZGRyM1RpcFhzYkNvbXBhcmVUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBPTkVfQ0xPQ0tfRVJST1JfU0hJRlQsYnVzSWREZWx0YSkgPT0gR1RfT0spCi0gICAgewotICAgICAgICB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLnN0YWdlID0gQ0xPQ0tfU0hJRlQ7Ci0gICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJTdXBwOiAxIGVycm9yIGNsb2NrIGZvciBpZiAlZCBwdXAgJWQgd2l0aCBvZnNzZXQgJWQgc3VjY2Vzc1xuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBvZmZzZXQpKTsKLSAgICAgICAgZGRyM1RpcFdsU3VwcE9uZUNsa0VyclNoaWZ0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCAwKTsKLSAgICAgICAgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5pc1B1cEZhaWwgPSBHVF9GQUxTRTsKLSAgICAgICAgcmV0dXJuIEdUX09LOwotICAgIH0KLSAgICAvKiBhbGlnbiBlcnJvciAqLwotICAgIGVsc2UgaWYgKGRkcjNUaXBYc2JDb21wYXJlVGVzdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgQUxJR05fRVJST1JfU0hJRlQsIGJ1c0lkRGVsdGEpID09IEdUX09LKQotICAgIHsKLSAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlN1cHA6IGFsaWduIGVycm9yIGZvciBpZiAlZCBwdXAgJWQgd2l0aCBvZnNzZXQgJWQgc3VjY2Vzc1xuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBvZmZzZXQpKTsKLSAgICAgICAgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5zdGFnZSA9IEFMSUdOX1NISUZUOwotICAgICAgICBkZHIzVGlwV2xTdXBwQWxpZ25FcnJTaGlmdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgMCk7Ci0gICAgICAgIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uaXNQdXBGYWlsID0gR1RfRkFMU0U7Ci0gICAgICAgIHJldHVybiBHVF9PSzsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgd3JpdGVTdXBwUmVzdWx0VGFibGVbaW50ZXJmYWNlSWRdW2J1c0lkXS5pc1B1cEZhaWwgPSBHVF9UUlVFOwotICAgICAgICByZXR1cm4gR1RfRkFJTDsKLSAgICB9CisJR1RfVTMyIG9yaWdpbmFsUGhhc2U7CisgICAgR1RfVTMyIGRhdGEsIHdyaXRlRGF0YTsKKworICAgIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uc3RhZ2UgPSBQSEFTRV9TSElGVDsKKwlpZiggR1RfT0sgPT0gZGRyM1RpcFhzYkNvbXBhcmVUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCAwKSkKKwkJcmV0dXJuIEdUX09LOworCisJLypSZWFkIHRoZSBjdXJyZW50IHBoYXNlICovCisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1JlYWQoZGV2TnVtLCBpbnRlcmZhY2VJZCwgIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsICZkYXRhKSk7CisJb3JpZ2luYWxQaGFzZSA9IGRhdGEgPj4gNiAmIDB4NzsKKworCS8qLS0tIHNldCBwaGFzZSgweDBbNi04XSkgLTIgIC0tLSovCisJaWYoIG9yaWdpbmFsUGhhc2UgPj0gMSl7CisJCWlmKCBvcmlnaW5hbFBoYXNlID09IDEpIHdyaXRlRGF0YSA9IChkYXRhICYgfjB4MURGKTsKKwkJZWxzZSB3cml0ZURhdGEgPSAoZGF0YSAmIH4weDFDMCkgfCAoIChvcmlnaW5hbFBoYXNlIC0gMikgPDwgNik7CisJCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsIHdyaXRlRGF0YSk7CisKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBYc2JDb21wYXJlVGVzdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgLTIgKSkKKwl9CisKKwkvKi0tLSBzZXQgcGhhc2UoMHgwWzYtOF0pICsyICAtLS0qLworCWlmKCBvcmlnaW5hbFBoYXNlIDw9IDUpeworCQl3cml0ZURhdGEgPSAoZGF0YSAmIH4weDFDMCkgfCAoIChvcmlnaW5hbFBoYXNlICsgMikgPDwgNik7CisJCW12SHdzRGRyM1RpcEJVU1dyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGJ1c0lkLCBERFJfUEhZX0RBVEEsIFdMX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MqQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQsIHdyaXRlRGF0YSk7CisKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBYc2JDb21wYXJlVGVzdChkZXZOdW0sIGludGVyZmFjZUlkLCBidXNJZCwgMikpCisJfQorCisJLyotLS0gc2V0IHBoYXNlKDB4MFs2LThdKSArNCAgLS0tKi8KKwlpZiggb3JpZ2luYWxQaGFzZSA8PSAzKXsKKwkJd3JpdGVEYXRhID0gKGRhdGEgJiB+MHgxQzApIHwgKCAob3JpZ2luYWxQaGFzZSArIDQpIDw8IDYpOworCQltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBXTF9QSFlfUkVHICsgZWZmZWN0aXZlX2NzKkNTX1JFR0lTVEVSX0FERFJfT0ZGU0VULCB3cml0ZURhdGEpOworCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwWHNiQ29tcGFyZVRlc3QoZGV2TnVtLCBpbnRlcmZhY2VJZCwgYnVzSWQsIDQpKQorCX0KKworCS8qLS0tIHNldCBwaGFzZSgweDBbNi04XSkgKzYgIC0tLSovCisJaWYoIG9yaWdpbmFsUGhhc2UgPD0gMSl7CisJCXdyaXRlRGF0YSA9IChkYXRhICYgfjB4MUMwKSB8ICggKG9yaWdpbmFsUGhhc2UgKyA2KSA8PCA2KTsKKwkJbXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgYnVzSWQsIEREUl9QSFlfREFUQSwgV0xfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcypDU19SRUdJU1RFUl9BRERSX09GRlNFVCwgd3JpdGVEYXRhKTsKKworCQlDSEVDS19TVEFUVVMoZGRyM1RpcFhzYkNvbXBhcmVUZXN0KGRldk51bSwgaW50ZXJmYWNlSWQsIGJ1c0lkLCA2KSkKKwl9CisKKwkvKk5vdGhpbmcgc3VjZXNzLCBnbyBhaGVhZCovCisKKwkvKldyaXRlIG9yaWdpbmFsIFdMIHJlc3VsdCBiYWNrKi8KKwltdkh3c0RkcjNUaXBCVVNXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBXTF9QSFlfUkVHICsgZWZmZWN0aXZlX2NzKkNTX1JFR0lTVEVSX0FERFJfT0ZGU0VULCBkYXRhKTsKKwl3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLmlzUHVwRmFpbCA9IEdUX1RSVUU7CisJcmV0dXJuIEdUX0ZBSUw7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTE1MCw4MiArMTE2NSw4NyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwWHNiQ29tcGFyZVRlc3QKICgKLQlHVF9VMzIgZGV2TnVtLAotCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyICBlZGdlT2Zmc2V0LAotCUdUX1UzMiBidXNJZERlbHRhCisgICAgR1RfVTMyIGRldk51bSwKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyIGJ1c0lkLAorICAgIEdUXzggZWRnZU9mZnNldAogKQogewotICAgIEdUX1UzMiBudW1PZlN1Y2NCeXRlQ29tcGFyZSwgd29yZEluUGF0dGVybiwgYWJzT2Zmc2V0OwotICAgIEdUX1UzMiB3b3JkT2Zmc2V0LGk7CisgICAgR1RfVTMyIG51bU9mU3VjY0J5dGVDb21wYXJlLCB3b3JkSW5QYXR0ZXJuOworICAgIEdUX1UzMiB3b3JkT2Zmc2V0LGksbnVtT2ZXb3JkTXVsdDsKICAgICBHVF9VMzIgcmVhZFBhdHRlcm5bVEVTVF9QQVRURVJOX0xFTkdUSCoyXTsKIAlQYXR0ZXJuSW5mbyAqcGF0dGVyblRhYmxlID0gZGRyM1RpcEdldFBhdHRlcm5UYWJsZSgpOwogCUdUX1UzMiBwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs4XTsKIAotCWZvcihpID0gMDsgaSA8IDg7IGkrKykgeworICAgIG51bU9mV29yZE11bHQgPSAodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2sgPT0gMyAvKklOVEVSRkFDRV9CVVNfTUFTS18xNkJJVCovKSA/IDE6MjsgCisKKyAgICAJZm9yKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAJCXBhdHRlcm5UZXN0UGF0dGVyblRhYmxlW2ldID0gcGF0dGVyblRhYmxlR2V0V29yZChkZXZOdW0sIFBBVFRFUk5fVEVTVCwgKEdUX1U4KWkpOwogCX0KIAorCiAgICAgLyogZXh0ZXJuIHdyaXRlLCB0aGFuIHJlYWQgYW5kIGNvbXBhcmUgKi8KLSAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEV4dFdyaXRlKGRldk51bSwgaW50ZXJmYWNlSWQsIChwYXR0ZXJuVGFibGVbUEFUVEVSTl9URVNUXS5zdGFydEFkZHIgKyAoKFNEUkFNX0NTX1NJWkUgKyAxKSAgKiBlZmZlY3RpdmVfY3MpKSwgMSwgcGF0dGVyblRlc3RQYXR0ZXJuVGFibGUpKTsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcExvYWRQYXR0ZXJuVG9NZW0oZGV2TnVtLCBQQVRURVJOX1RFU1QpKTsJCiAKICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcFJlc2V0Rmlmb1B0cihkZXZOdW0pKTsKIAotICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwRXh0UmVhZChkZXZOdW0sIGludGVyZmFjZUlkLCAocGF0dGVyblRhYmxlW1BBVFRFUk5fVEVTVF0uc3RhcnRBZGRyICsgKChTRFJBTV9DU19TSVpFICsgMSkgICogZWZmZWN0aXZlX2NzKSksIDEsIHJlYWRQYXR0ZXJuKSk7CisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBFeHRSZWFkKGRldk51bSwgaW50ZXJmYWNlSWQsICgocGF0dGVyblRhYmxlW1BBVFRFUk5fVEVTVF0uc3RhcnRBZGRyPDwzKSArICgoU0RSQU1fQ1NfU0laRSArIDEpICAqIGVmZmVjdGl2ZV9jcykpLCAxLCByZWFkUGF0dGVybikpOwogCi0gICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0OiBJRiAlZCBidXNJZCAlZCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0IENTIyVkOiBJRiAlZCBidXNJZCAlZCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsZWZmZWN0aXZlX2NzLAogCQkJCQkJCQkJCWludGVyZmFjZUlkLCBidXNJZCwgcmVhZFBhdHRlcm5bMF0scmVhZFBhdHRlcm5bMV0scmVhZFBhdHRlcm5bMl0scmVhZFBhdHRlcm5bM10sCiAJCQkJCQkJCQkJcmVhZFBhdHRlcm5bNF0scmVhZFBhdHRlcm5bNV0scmVhZFBhdHRlcm5bNl0scmVhZFBhdHRlcm5bN10pKTsKICAgICAvKiBjb21wYXJlIGJ5dGUgcGVyIHB1cCAqLwogICAgIG51bU9mU3VjY0J5dGVDb21wYXJlID0gMDsKLSAgICBmb3Iod29yZEluUGF0dGVybiA9IHN0YXJ0WHNiT2Zmc2V0OyB3b3JkSW5QYXR0ZXJuIDwgKFRFU1RfUEFUVEVSTl9MRU5HVEgqMikgOyB3b3JkSW5QYXR0ZXJuKyspCisgICAgZm9yKHdvcmRJblBhdHRlcm4gPSBzdGFydFhzYk9mZnNldDsgd29yZEluUGF0dGVybiA8IChURVNUX1BBVFRFUk5fTEVOR1RIKm51bU9mV29yZE11bHQpIDsgd29yZEluUGF0dGVybisrKQogICAgIHsKLSAgICAgICAgd29yZE9mZnNldCA9IHdvcmRJblBhdHRlcm4gKyBlZGdlT2Zmc2V0OwotICAgICAgICBpZiAoKHdvcmRPZmZzZXQgPiAoVEVTVF9QQVRURVJOX0xFTkdUSCoyIC0gMSkpfHwod29yZE9mZnNldCA8IDApKQorICAgICAgICB3b3JkT2Zmc2V0ID0gd29yZEluUGF0dGVybjsKKyAgICAgICAgaWYgKHdvcmRPZmZzZXQgPiAoVEVTVF9QQVRURVJOX0xFTkdUSCoyIC0gMSkpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgaWYgKChyZWFkUGF0dGVyblt3b3JkSW5QYXR0ZXJuXSAmIHB1cE1hc2tUYWJsZVtidXNJZF0pID09IChwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVt3b3JkT2Zmc2V0XSAmIHB1cE1hc2tUYWJsZVtidXNJZF0pKQogICAgICAgICB7Ci0gICAgICAgICAgICAvKkRFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJkZHIzVGlwRHluYW1pY1dyaXRlTGV2ZWxpbmdTdXBwIGVxdWFsIHRvIE9mZnNldCBwYXR0ZXJuICEhIFxuIikpOyovCisgICAgICAgICAgICAvKkRFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJkZHIzVGlwRHluYW1pY1dyaXRlTGV2ZWxpbmdTdXBwIGVxdWFsIHRvIE9mc3NldCBwYXR0ZXJuICEhIFxuIikpOyovCiAgICAgICAgICAgICBudW1PZlN1Y2NCeXRlQ29tcGFyZSsrOwogICAgICAgICB9CiAgICAgfQotICAgIGFic09mZnNldCA9IChlZGdlT2Zmc2V0ID4gMCkgPyBlZGdlT2Zmc2V0IDogLWVkZ2VPZmZzZXQ7Ci0gICAgaWYgKG51bU9mU3VjY0J5dGVDb21wYXJlID09ICgoVEVTVF9QQVRURVJOX0xFTkdUSCoyKSAtIGFic09mZnNldCAtIHN0YXJ0WHNiT2Zmc2V0KSkKKyAgICBpZiAobnVtT2ZTdWNjQnl0ZUNvbXBhcmUgPT0gKChURVNUX1BBVFRFUk5fTEVOR1RIKm51bU9mV29yZE11bHQpIC0gc3RhcnRYc2JPZmZzZXQpKQogICAgIHsKLSAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0OiBJRiAlZCBidXNJZCAlZCBudW1PZlN1Y2NCeXRlQ29tcGFyZSAlZCAtIFN1Y2Nlc3MgXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQsIG51bU9mU3VjY0J5dGVDb21wYXJlKSk7CisJCXdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uc3RhZ2UgPSBlZGdlT2Zmc2V0OworCQlERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwoInN1cHBsZW1lbnRhcnk6IHNoaWZ0IHRvICVkIGZvciBpZiAlZCBwdXAgJWQgc3VjY2Vzc1xuIiwKKwkJCQkJCQkJCQkJZWRnZU9mZnNldCwgaW50ZXJmYWNlSWQsIGJ1c0lkKSk7CisJCXdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uaXNQdXBGYWlsID0gR1RfRkFMU0U7CiAgICAgICAgIHJldHVybiBHVF9PSzsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQotICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQ6IElGICVkIGJ1c0lkICVkIG51bU9mU3VjY0J5dGVDb21wYXJlICVkIC0gRmFpbCAhIFxuIiwgaW50ZXJmYWNlSWQsIGJ1c0lkLCBudW1PZlN1Y2NCeXRlQ29tcGFyZSkpOwotCi0gICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJYc2JDb21wdDogZXhwZWN0ZWQgMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4XG4iLCBwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVswXSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbMl0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbM10scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbNF0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbNV0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbNl0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbN10pKTsKLSAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0OiByZWNpZXZlZCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsIHJlYWRQYXR0ZXJuWzBdLHJlYWRQYXR0ZXJuWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkUGF0dGVyblsyXSxyZWFkUGF0dGVyblszXSxyZWFkUGF0dGVybls0XSxyZWFkUGF0dGVybls1XSxyZWFkUGF0dGVybls2XSxyZWFkUGF0dGVybls3XSkpOwotCi0gICAgICAgIERFQlVHX0xFVkVMSU5HKERFQlVHX0xFVkVMX1RSQUNFLCAgKCJYc2JDb21wdDogSUYgJWQgYnVzSWQgJWQgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUgJWQgLSBGYWlsICEgXG4iLCBpbnRlcmZhY2VJZCwgYnVzSWQsIG51bU9mU3VjY0J5dGVDb21wYXJlKSk7Ci0KLQorICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQgQ1MjICVkOiBJRiAlZCBidXNJZCAlZCBudW1PZlN1Y2NCeXRlQ29tcGFyZSAlZCAtIEZhaWwgISBcbiIsZWZmZWN0aXZlX2NzLCAKKwkJCQkJCQkJCQkJaW50ZXJmYWNlSWQsIGJ1c0lkLCBudW1PZlN1Y2NCeXRlQ29tcGFyZSkpOworICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiWHNiQ29tcHQ6IGV4cGVjdGVkIDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleFxuIiwgCisJCQkJCQkJCQkJCXBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzBdLHBhdHRlcm5UZXN0UGF0dGVyblRhYmxlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVsyXSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVszXSxwYXR0ZXJuVGVzdFBhdHRlcm5UYWJsZVs0XSwKKwkJCQkJCQkJCQkJcGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbNV0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbNl0scGF0dGVyblRlc3RQYXR0ZXJuVGFibGVbN10pKTsKKyAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0OiByZWNlaXZlZCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXhcbiIsIAorCQkJCQkJCQkJCQlyZWFkUGF0dGVyblswXSxyZWFkUGF0dGVyblsxXSxyZWFkUGF0dGVyblsyXSxyZWFkUGF0dGVyblszXSwKKwkJCQkJCQkJCQkJcmVhZFBhdHRlcm5bNF0scmVhZFBhdHRlcm5bNV0scmVhZFBhdHRlcm5bNl0scmVhZFBhdHRlcm5bN10pKTsKKyAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfVFJBQ0UsICAoIlhzYkNvbXB0IENTIyAlZDogSUYgJWQgYnVzSWQgJWQgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUgJWQgLSBGYWlsICEgXG4iLCBlZmZlY3RpdmVfY3MsCisJCQkJCQkJCQkJCWludGVyZmFjZUlkLCBidXNJZCwgbnVtT2ZTdWNjQnl0ZUNvbXBhcmUpKTsKICAgICAgICAgcmV0dXJuIEdUX0ZBSUw7CiAgICAgfQogfQogCisjaWYgMCAvKiByZW1vdmUgdGhpcyBpZiBpdCdzIG5vdCBpbiB1c2UgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQ2xvY2sgZXJyb3Igc2hpZnQgLSBmdW5jdGlvbiBtb3ZlcyB0aGUgd3JpdGUgbGV2ZWxpbmcgZGVsYXkgMWNjIGZvcndhcmQKK0Nsb2NrIGVycm9yIHNoaWZ0IC0gZnVuY3Rpb24gbW92ZXMgdGhlIHdyaXRlIGxldmVsbGluZyBkZWxheSAxY2MgZm9yd2FyZAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwV2xTdXBwT25lQ2xrRXJyU2hpZnQKICgKLQlHVF9VMzIgZGV2TnVtLAotCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKKyAgICBHVF9VMzIgZGV2TnVtLAorICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgYnVzSWQKICkKIHsKICAgICBHVF8zMiBwaGFzZSwgIGFkbGw7CiAgICAgR1RfVTMyIGRhdGE7CisKICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9UUkFDRSwgICgiT25lQ2xrRXJyU2hpZnRcbiIpKTsKIAogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsICBBQ0NFU1NfVFlQRV9VTklDQVNULCBidXNJZCwgRERSX1BIWV9EQVRBLCBXTF9QSFlfUkVHLCAmZGF0YSkpOwpAQCAtMTI0OSw3ICsxMjY5LDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICAvKnBoYXNlIDMqLwotICAgICAgICByZXR1cm4gR1RfRkFJTDsgCisgICAgICAgIHJldHVybiBHVF9GQUlMOwogICAgIH0KICAgICByZXR1cm4gR1RfT0s7CiB9CkBAIC0xMjU5LDEwICsxMjc5LDkgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFdsU3VwcEFsaWduRXJyU2hpZnQKICgKLQlHVF9VMzIgZGV2TnVtLAotCUdUX1UzMiBpbnRlcmZhY2VJZCwKLQlHVF9VMzIgYnVzSWQsCi0JR1RfVTMyIGJ1c0lkRGVsdGEKKyAgICBHVF9VMzIgZGV2TnVtLAorICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgYnVzSWQKICkKIHsKICAgICBHVF8zMiBwaGFzZSwgYWRsbDsKQEAgLTEyODgsNyArMTMwNyw2IEBACiAgICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICBidXNJZCwgRERSX1BIWV9EQVRBLCAgMSwgIGRhdGEgLCAweDFmKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEdUX09LOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xMzEwLDYgKzEzMjgsNyBAQAogICAgIH0KICAgICByZXR1cm4gR1RfT0s7CiB9CisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiBEeW5hbWljIHdyaXRlIGxldmVsaW5nIHNlcXVlbmNlCkBAIC0xMzE5LDYgKzEzMzgsNyBAQAogICAgIEdUX1UzMiBidXNJZCwgZHFJZDsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzUHVwUmVnTWFwID0gZGRyM1RpcEdldE1hc2tSZXN1bHRzUHVwUmVnTWFwKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c0RxUmVnTWFwIAk9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c0RxUmVnKCk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgIFRSQUlOSU5HX1NXXzJfUkVHLCAweDEsICAgICAgMHg1KSk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAgVFJBSU5JTkdfV1JJVEVfTEVWRUxJTkdfUkVHLCAgMHg1MCwgICAgIDB4RkYpKTsKQEAgLTEzMzYsMTMgKzEzNTYsMTMgQEAKICAgICB9CiAKIAkvKk1hc2sgYWxsIHJlc3VsdHMqLwotICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IGJ1c0lkKyspCisgICAgZm9yIChidXNJZD0wOyBidXNJZCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICB7CiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgIG1hc2tSZXN1bHRzUHVwUmVnTWFwW2J1c0lkXSwgMHgxPDwyNCwgMHgxPDwyNCkpOwogICAgIH0KIAogCS8qVW5tYXNrIG9ubHkgd2FudGVkKi8KLSAgICBmb3IgKGJ1c0lkPTA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgewogICAgICAgIAlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBidXNJZCkKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAgbWFza1Jlc3VsdHNQdXBSZWdNYXBbYnVzSWRdLCAwLCAweDE8PDI0KSk7CkBAIC0xMzYyLDYgKzEzODIsNyBAQAogICAgIEdUX1UzMiBidXNJZCwgZHFJZDsKIAlHVF9VMTYgKm1hc2tSZXN1bHRzUHVwUmVnTWFwID0gZGRyM1RpcEdldE1hc2tSZXN1bHRzUHVwUmVnTWFwKCk7CiAJR1RfVTE2ICptYXNrUmVzdWx0c0RxUmVnTWFwIAk9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c0RxUmVnKCk7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gKEdUX1U4KWRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIC8qIG1hc2sgUEJTICovCiAgICAgZm9yIChkcUlkPTA7IGRxSWQ8TUFYX0RRX05VTTsgZHFJZCsrKQpAQCAtMTM3MCwxMyArMTM5MSwxMyBAQAogICAgIH0KIAogCS8qTWFzayBhbGwgcmVzdWx0cyovCi0gICAgZm9yIChidXNJZD0wOyBidXNJZCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzSWQrKykKKyAgICBmb3IgKGJ1c0lkPTA7IGJ1c0lkIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgIHsKICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCAgbWFza1Jlc3VsdHNQdXBSZWdNYXBbYnVzSWRdLCAweDE8PDI0LCAweDE8PDI0KSk7CiAgICAgfQogCiAJLypVbm1hc2sgb25seSB3YW50ZWQqLwotICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQ8b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBidXNJZCsrKQogICAgIHsKICAgICAgICAJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgIG1hc2tSZXN1bHRzUHVwUmVnTWFwW2J1c0lkXSwgMCwgMHgxPDwyNCkpOwpAQCAtMTM5Myw2ICsxNDE0LDcgQEAKICAgICBHVF9VMzIgYnVzSWQsIGRxSWQ7CiAJR1RfVTE2ICptYXNrUmVzdWx0c1B1cFJlZ01hcCA9IGRkcjNUaXBHZXRNYXNrUmVzdWx0c1B1cFJlZ01hcCgpOwogCUdUX1UxNiAqbWFza1Jlc3VsdHNEcVJlZ01hcCAJPSBkZHIzVGlwR2V0TWFza1Jlc3VsdHNEcVJlZygpOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICAvKiBtYXNrIFBCUyAqLwogICAgIGZvciAoZHFJZD0wOyBkcUlkPE1BWF9EUV9OVU07IGRxSWQrKykKQEAgLTE0MDEsNyArMTQyMyw3IEBACiAgICAgfQogCiAJLypNYXNrIGFsbCByZXN1bHRzKi8KLSAgICBmb3IgKGJ1c0lkPTA7IGJ1c0lkIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgIGZvciAoYnVzSWQ9MDsgYnVzSWQgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgewogICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsICBtYXNrUmVzdWx0c1B1cFJlZ01hcFtidXNJZF0sIDB4MTw8MjQsIDB4MTw8MjQpKTsKICAgICB9CkBAIC0xNDIyLDYgKzE0NDQsNyBAQAogR1RfQk9PTCBkZHIzVGlwUHJpbnRXTFN1cHBSZXN1bHQoR1RfVTMyIGRldk51bSkKIHsKICAgICBHVF9VMzIgYnVzSWQgPSAwLGludGVyZmFjZUlkID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfSU5GTywoIkkvRjAgUFVQMCBSZXN1bHRbMCAtIHN1Y2Nlc3MsIDEtZmFpbF0gLi4uXG4iKSk7CiAKQEAgLTE0MzAsNyArMTQ1Myw3IEBACiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CiAgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCi0gICAgICAgICBmb3IoYnVzSWQ9MDsgYnVzSWQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBidXNJZCsrKQorICAgICAgICAgZm9yKGJ1c0lkPTA7IGJ1c0lkPG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSWQrKykKICAgICAgICAgewogCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgYnVzSWQpCiAgICAgICAgICAgICBERUJVR19MRVZFTElORyhERUJVR19MRVZFTF9JTkZPLCgiJWQgLCIsIHdyaXRlU3VwcFJlc3VsdFRhYmxlW2ludGVyZmFjZUlkXVtidXNJZF0uaXNQdXBGYWlsKSk7CkBAIC0xNDQwLDcgKzE0NjMsNyBAQAogICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCiAgICAgewogICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQotICAgICAgICAgZm9yKGJ1c0lkPTA7IGJ1c0lkPHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsgYnVzSWQrKykKKyAgICAgICAgIGZvcihidXNJZD0wOyBidXNJZDxvY3RldHNQZXJJbnRlcmZhY2VOdW07IGJ1c0lkKyspCiAgICAgICAgIHsKIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0lkKQogICAgICAgICAgICAgREVCVUdfTEVWRUxJTkcoREVCVUdfTEVWRUxfSU5GTywoIiVkICwiLCB3cml0ZVN1cHBSZXN1bHRUYWJsZVtpbnRlcmZhY2VJZF1bYnVzSWRdLnN0YWdlKSk7CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nUGJzLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nUGJzLmMKaW5kZXggYzRiNTVkZS4uN2JlNmYwNSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ1Bicy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdQYnMuYwpAQCAtNTIsMTIgKzUyLDEyIEBACiBHVF9VOCBNaW5QQlNQZXJQdXBbTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXTsKIEdUX1U4IE1heEFETExQZXJQdXBbTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXTsKIEdUX1U4IE1pbkFETExQZXJQdXBbTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXTsKLUdUX1UzMiBwYnNkZWxheVBlclB1cFtOVU1fT0ZfUEJTX01PREVTXVtNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dOworR1RfVTggcGJzRGVsYXlQZXJQdXBbTlVNX09GX1BCU19NT0RFU11bTUFYX0lOVEVSRkFDRV9OVU1dW01BWF9CVVNfTlVNXVtNQVhfQ1NfTlVNXTsKIEdUX1U4IEFETExfU0hJRlRfTG9ja1tNQVhfSU5URVJGQUNFX05VTV1bTUFYX0JVU19OVU1dIDsKIEdUX1U4IEFETExfU0hJRlRfdmFsW01BWF9JTlRFUkZBQ0VfTlVNXVtNQVhfQlVTX05VTV0gOwogTVZfSFdTX1BBVFRFUk4gcGJzUGF0dGVybiA9IFBBVFRFUk5fVlJFRjsKIAotZXh0ZXJuIEdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldCh2b2lkKTsKK2V4dGVybiBHVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQoR1RfVTMyIGRldk51bSk7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJlIGRlY2xhcmF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXA7CiBleHRlcm4gR1RfVTMyIG1hc2tSZXN1bHRzRHFSZWdNYXBbXTsKQEAgLTExNSw2ICsxMTUsNyBAQAogICAgIEdUX1UzMiAgIGNzRW5hYmxlUmVnVmFsW01BWF9JTlRFUkZBQ0VfTlVNXTsKICAgICBHVF9VMTYgKm1hc2tSZXN1bHRzRHFSZWdNYXAgCT0gZGRyM1RpcEdldE1hc2tSZXN1bHRzRHFSZWcoKTsKICAgICBHVF9VOCB0ZW1wID0gMDsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSAoR1RfVTgpZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgLyogc2F2ZSBjdXJyZW50IGNzIGVuYWJsZSByZWcgdmFsICovCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKQEAgLTEyNyw3ICsxMjgsNyBAQAogICAgIH0KIAogICAgIHJlZ0FkZHIgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSApID8gKFJFQURfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIChlZmZlY3RpdmVfY3MgKiBDU19SRUdJU1RFUl9BRERSX09GRlNFVCkpIDogKFdSSVRFX0NFTlRSQUxJWkFUSU9OX1BIWV9SRUcgKyAoZWZmZWN0aXZlX2NzICogQ1NfUkVHSVNURVJfQUREUl9PRkZTRVQpKTsKLSAgICByZWFkQWRsbFZhbHVlKG5vbWluYWxBZGxsLCByZWdBZGRyICwgTUFTS19BTExfQklUUyApOworICAgIG12SHdzRGRyM1RpcFJlYWRBZGxsVmFsdWUoZGV2TnVtLG5vbWluYWxBZGxsLCByZWdBZGRyLCBNQVNLX0FMTF9CSVRTICk7CiAgICAgLyogc3RhZ2UgMSBzaGlmdCBBRExMICovCiAgICAgLypkZHIzVGlwSXBUcmFpbmluZ1BlcmJpdE11bHRpQ2FzdCggU2VhcmNoRGlyZWN0aW9uLCBEaXJlY3Rpb24sIEluaXRWYWx1ZSwgTnVtYmVyT2ZJdGVyYXRpb25zLCBwYnNQYXR0ZXJuLCAgU2VhcmNoRURHRV8gLCBNVl9IV1NfQ29udHJvbEVsZW1lbnRfQURMTCk7Ki8KIApAQCAtMTM1LDcgKzEzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoRGlyZWN0aW9uLCBEaXJlY3Rpb24sIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBJbml0VmFsdWUsIE51bWJlck9mSXRlcmF0aW9ucywgcGJzUGF0dGVybiwgU2VhcmNoRURHRV8sIENTX1NJTkdMRSwgY3NOdW0sIHRyYWluU3RhdHVzKTsKIAogICAgIHZhbGlkYXRpb25WYWwgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSkgPyAweDFmIDogMDsKLQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKIAkJZm9yKCBpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xIDsgaW50ZXJmYWNlSWQrKykKQEAgLTE0OSw3ICsxNTAsNyBAQAogICAgIH0KIAogICAgIC8qIEVCQSAqLwotCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogCQlmb3IoIGJpdCA9IDAgOyBiaXQgPCBCVVNfV0lEVEhfSU5fQklUUyA7IGJpdCsrKQpAQCAtMTkwLDcgKzE5MSw3IEBACiAJfQogCiAJLyogRUVCQSAqLwotCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCXsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtMjU1LDcgKzI1Niw3IEBACiAJfQogCiAJLyogUHJpbnQgU3RhZ2UgcmVzdWx0ICovCi0JZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAgICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMSA7IGludGVyZmFjZUlkKyspCkBAIC0yNjYsNyArMjY3LDcgQEAKIAl9CiAKICAgICBERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCJVcGRhdGUgQURMTCBTaGlmdCBvZiBhbGwgcHVwczpcbiIpKTsKLQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgZm9yKCBpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xIDsgaW50ZXJmYWNlSWQrKykKQEAgLTI4MSw3ICsyODIsNyBAQAogCiAgICAgLyogUEJTIEVFQkEmRUJBICovCiAJLyogU3RhcnQgdGhlIFBlciBCaXQgU2tldyBzZWFyY2ggKi8KLQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgZm9yKCBpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xIDsgaW50ZXJmYWNlSWQrKykKQEAgLTMwNSw3ICszMDYsNyBAQAogICAgIGRkcjNUaXBJcFRyYWluaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgUkVTVUxUX1BFUl9CSVQsIE1WX0hXU19Db250cm9sRWxlbWVudF9EUV9TS0VXLAogICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaERpcmVjdGlvbiwgRGlyZWN0aW9uLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgSW5pdFZhbHVlLCBOdW1iZXJPZkl0ZXJhdGlvbnMsIHBic1BhdHRlcm4sIFNlYXJjaEVER0VfLCBDU19TSU5HTEUsIGNzTnVtLCB0cmFpblN0YXR1cyk7CiAJCi0gCWZvciggcHVwID0gMCA7IHB1cCA8IHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorIAlmb3IoIHB1cCA9IDAgOyBwdXAgPCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKIAl7CiAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKICAgICAgICAgZm9yKCBpbnRlcmZhY2VJZCA9IDAgOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xIDsgaW50ZXJmYWNlSWQrKykKQEAgLTM0Miw3ICszNDMsNyBAQAogCiAgICAgLyogQ2hlY2sgYWxsIFB1cCBsb2NrICovCiAJQWxsTG9jayA9IDE7Ci0JZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAgICAgIGZvciggaW50ZXJmYWNlSWQgPSAwIDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMSA7IGludGVyZmFjZUlkKyspCkBAIC0zNTksNyArMzYwLDcgQEAKIAkJLyogQURMTCBzaGlmdCBmb3IgU0JBICovCiAJCVNlYXJjaERpcmVjdGlvbiA9IChwYnNNb2RlID09IFBCU19SWF9NT0RFKSA/IE1WX0hXU19Mb3cySGlnaCA6IE1WX0hXU19IaWdoMkxvdzsgCiAJCUluaXRWYWx1ZSA9IChTZWFyY2hEaXJlY3Rpb24gPT0gTVZfSFdTX0xvdzJIaWdoKT8wOk51bWJlck9mSXRlcmF0aW9uczsKLQkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCQl7CiAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAgICAgICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtNDIyLDcgKzQyMyw3IEBACiAJICAgIGRkcjNUaXBJcFRyYWluaW5nKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgUkVTVUxUX1BFUl9CSVQsIE1WX0hXU19Db250cm9sRWxlbWVudF9EUV9TS0VXLAogICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaERpcmVjdGlvbiwgRGlyZWN0aW9uLCB0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgSW5pdFZhbHVlLCBOdW1iZXJPZkl0ZXJhdGlvbnMsIHBic1BhdHRlcm4sIFNlYXJjaEVER0VfLCBDU19TSU5HTEUsIGNzTnVtLCB0cmFpblN0YXR1cyk7CiAKLQkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJCWZvciggcHVwID0gMCA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bSA7IHB1cCsrKQogCQl7CiAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAgICAgICAgICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQpAQCAtNDU2LDE0ICs0NTcsMTQgQEAKIAkJfQogCQkvKiBDaGVjayBhbGwgUHVwIHN0YXRlICovCiAJCUFsbExvY2sgPSAxOwotCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCB0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2UgOyBwdXArKykKKwkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCXsKICAgICAgICAgICAvKiAgREVCVUdfUEJTX0VOR0lORShERUJVR19MRVZFTF9JTkZPLCgiUHVwU3RhdGVbJWRdWyVkXSA9ICVkXG4iLGludGVyZmFjZUlkLHB1cCxQdXBTdGF0ZVtpbnRlcmZhY2VJZF1bcHVwXSkpOyAqLwogCQl9CiAJfQogCS8qIEVORCBPRiBTQkEgKi8KICAgICAvKiBOb3JtICovCi0JZm9yKCBwdXAgPSAwIDsgcHVwIDwgdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlIDsgcHVwKyspCisJZm9yKCBwdXAgPSAwIDsgcHVwIDwgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJewogCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwdXApCiAJCWZvciggYml0ID0gMCA7IGJpdCA8IEJVU19XSURUSF9JTl9CSVRTIDsgYml0KyspCkBAIC01MDIsNyArNTAzLDcgQEAKICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDwgTUFYX0lOVEVSRkFDRV9OVU0gOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLQkJZm9yKCBwdXAgPSAwIDsgcHVwIDwgIHRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZSA7IHB1cCsrKQorCQlmb3IoIHB1cCA9IDAgOyBwdXAgPCAgb2N0ZXRzUGVySW50ZXJmYWNlTnVtIDsgcHVwKyspCiAJCXsKIAkJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIHB1cCkKIAkJCS8qaWYoQURMTF9TSElGVF9Mb2NrW2ludGVyZmFjZUlkXVtwdXBdICE9IDEpIHsgY29udGludWU7fSovIC8qIGlmIHB1cCBub3QgbG9jayBjb250aW51ZSB0byBuZXh0IHB1cCAqLwpAQCAtNTEyLDE1ICs1MTMsMjAgQEAKIAkJCXsKIAkJCQkgaWYgKGRxTWFwVGFibGUgPT0gTlVMTCkKIAkJCQkgewotICAgICAgICAgICAgICAgICAgICBERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0VSUk9SLCgiZHFNYXBUYWJsZSBub3QgaW5pdGlhbGl6YWVkXG4iKSk7CisJCQkJCURFQlVHX1BCU19FTkdJTkUoREVCVUdfTEVWRUxfRVJST1IsKCJkcU1hcFRhYmxlIG5vdCBpbml0aWFsaXphZWRcbiIpKTsKIAkJCQkJcmV0dXJuIEdUX0ZBSUw7CiAJCQkJIH0KLQkJCQkgUGFkTnVtID0gZHFNYXBUYWJsZVtiaXQrcHVwKkJVU19XSURUSF9JTl9CSVRTICsgaW50ZXJmYWNlSWQqQlVTX1dJRFRIX0lOX0JJVFMqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlXTsKLSAgICAgICAgICAgICAgICAgREVCVUdfUEJTX0VOR0lORShERUJVR19MRVZFTF9JTkZPLCgiUmVzdWx0X01BVDogJWQgIiAsUmVzdWx0X01BVFtpbnRlcmZhY2VJZF1bcHVwXVtiaXRdKSk7Ci0gICAgICAgICAgICAgICAgIHJlZ0FkZHIgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSkgPyAoUEJTX1JYX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MgKiAweDEwKSA6IChQQlNfVFhfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcyAqIDB4MTApOwotICAgICAgICAgICAgICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgICBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgIHB1cCwgRERSX1BIWV9EQVRBLCByZWdBZGRyK1BhZE51bSwgUmVzdWx0X01BVFtpbnRlcmZhY2VJZF1bcHVwXVtiaXRdKSk7CisJCQkJUGFkTnVtID0gZHFNYXBUYWJsZVtiaXQrcHVwKkJVU19XSURUSF9JTl9CSVRTICsgaW50ZXJmYWNlSWQqQlVTX1dJRFRIX0lOX0JJVFMqb2N0ZXRzUGVySW50ZXJmYWNlTnVtXTsKKwkJCQlERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCJSZXN1bHRfTUFUOiAlZCAiICxSZXN1bHRfTUFUW2ludGVyZmFjZUlkXVtwdXBdW2JpdF0pKTsKKwkJCQlyZWdBZGRyID0gKHBic01vZGUgPT0gUEJTX1JYX01PREUpID8gKFBCU19SWF9QSFlfUkVHICsgZWZmZWN0aXZlX2NzICogMHgxMCkgOiAoUEJTX1RYX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MgKiAweDEwKTsKKwkJCQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoZGV2TnVtLCAgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgICBpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgIHB1cCwgRERSX1BIWV9EQVRBLCByZWdBZGRyK1BhZE51bSwgUmVzdWx0X01BVFtpbnRlcmZhY2VJZF1bcHVwXVtiaXRdKSk7CiAJCQl9Ci0JCQlwYnNkZWxheVBlclB1cFtwYnNNb2RlXVtpbnRlcmZhY2VJZF1bcHVwXSA9IChNYXhQQlNQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0gPT0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKT9UWVBJQ0FMX1BCU19WQUxVRSA6KChNYXhBRExMUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluQURMTFBlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSkqQURMTFRhcC8oTWF4UEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKSk7CisKKyAgICAgICAgICAgIHRlbXAgPSAoTWF4UEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdID09IE1pblBCU1BlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSkgP1wKKyAgICAgICAgICAgICAgICBUWVBJQ0FMX1BCU19WQUxVRSA6XAorICAgICAgICAgICAgICAgICgoTWF4QURMTFBlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSAtIE1pbkFETExQZXJQdXBbaW50ZXJmYWNlSWRdW3B1cF0pICogKEdUX1U4KUFETExUYXAgLyAoTWF4UEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKSk7CisKKwkJCXBic0RlbGF5UGVyUHVwW3Bic01vZGVdW2ludGVyZmFjZUlkXVtwdXBdW2VmZmVjdGl2ZV9jc10gPSB0ZW1wOwogCiAJCQlpZiggcGJzTW9kZSA9PSBQQlNfVFhfTU9ERSApeyAvKlJYIHJlc3VsdHMgcmVhZHksIHdyaXRlIFJYIGFsc28qLwogCQkJCS8qV3JpdGUgVFggcmVzdWx0cyovCkBAIC01NDAsMTMgKzU0NiwxMiBAQAogCQkJCVJlc3VsdF9NQVRfUlhfRFFTW2ludGVyZmFjZUlkXVtwdXBdW2VmZmVjdGl2ZV9jc10gPSAoTWF4UEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKS8yOwogCQkJfQogCi0gICAgICAgICAgICBERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCIsIFBCUyB0YXA9JWQgW3BzZWNdID09PiBza2V3IG9ic2VydmVkID0gJWRcbiIsIHBic2RlbGF5UGVyUHVwW3Bic01vZGVdW2ludGVyZmFjZUlkXVtwdXBdLCAoKE1heFBCU1BlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSAtIE1pblBCU1BlclB1cFtpbnRlcmZhY2VJZF1bcHVwXSkqcGJzZGVsYXlQZXJQdXBbcGJzTW9kZV1baW50ZXJmYWNlSWRdW3B1cF0pKSk7CisJCQlERUJVR19QQlNfRU5HSU5FKERFQlVHX0xFVkVMX0lORk8sKCIsIFBCUyB0YXA9JWQgW3BzZWNdID09PiBza2V3IG9ic2VydmVkID0gJWRcbiIsIHRlbXAsICgoTWF4UEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdIC0gTWluUEJTUGVyUHVwW2ludGVyZmFjZUlkXVtwdXBdKSp0ZW1wKSkpOwogCQl9Ci0JfQotCisgICAgfQogICAgIC8qV3JpdGUgYmFjayB0byB0aGUgcGh5IHRoZSBkZWZhdWx0IHZhbHVlcyAqLwogICAgIHJlZ0FkZHIgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSkgPyAoUkVBRF9DRU5UUkFMSVpBVElPTl9QSFlfUkVHICsgZWZmZWN0aXZlX2NzICogNCkgOiAoV1JJVEVfQ0VOVFJBTElaQVRJT05fUEhZX1JFRyArIGVmZmVjdGl2ZV9jcyAqIDQpOwotCXdyaXRlQWRsbFZhbHVlKG5vbWluYWxBZGxsLCByZWdBZGRyKTsKKwltdkh3c0RkcjNUaXBXcml0ZUFkbGxWYWx1ZShkZXZOdW0sbm9taW5hbEFkbGwsIHJlZ0FkZHIpOwogCiAKICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCkBAIC01NjIsMTcgKzU2NywyMSBAQAogCiAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8PSBNQVhfSU5URVJGQUNFX05VTS0xOyBpbnRlcmZhY2VJZCsrKQogICAgewotICAgICAgLyogaWYgKHRyYWluaW5nUmVzdWx0W3RyYWluaW5nU3RhZ2VdW2ludGVyZmFjZUlkXSA9PSBURVNUX0ZBSUxFRCkgKi8KLQkgIGlmICggUHVwU3RhdGVbaW50ZXJmYWNlSWRdW3B1cF0gPT0gMSkgLyogbWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIFZXIGV4aXN0IGF0IGFsbCAoTm8gbG9jayBhdCB0aGUgRUJBIEFETEwgc2hpZnQgYXQgRUJTKSAqLwotCSAgIAkgcmV0dXJuIEdUX0ZBSUw7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisJCWZvciggcHVwID0gMCA7IHB1cCA8ICBvY3RldHNQZXJJbnRlcmZhY2VOdW0gOyBwdXArKykKKwkJeworCQkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQorCQkJLyogaWYgKHRyYWluaW5nUmVzdWx0W3RyYWluaW5nU3RhZ2VdW2ludGVyZmFjZUlkXSA9PSBURVNUX0ZBSUxFRCkgKi8KKwkJCWlmICggUHVwU3RhdGVbaW50ZXJmYWNlSWRdW3B1cF0gPT0gMSkgLyogbWVhbmluZyB0aGF0IHRoZXJlIGlzIG5vIFZXIGV4aXN0IGF0IGFsbCAoTm8gbG9jayBhdCB0aGUgRUJBIEFETEwgc2hpZnQgYXQgRUJTKSAqLworCQkJcmV0dXJuIEdUX0ZBSUw7CisJCX0KICAgIH0KKwogICAgcmV0dXJuIEdUX09LOwogCiAKIH0KIAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogTmFtZTogICAgIGRkcjNUaXBQYnNSeC4KICogRGVzYzogICAgIFBCUyBUWApAQCAtNTk3LDcgKzYwNiw3IEBACiAgICByZXR1cm4gZGRyM1RpcFBicyh1aWRldk51bSwgUEJTX1RYX01PREUpOwogfQogCi0jaWZuZGVmIEVYQ0xVREVfU1dJVENIX0RFQlVHCisjaWZkZWYgRERSX1ZJRVdFUl9UT09MCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFByaW50IFBCUyBSZXN1bHQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTYwNywxMiArNjE2LDEyIEBACiApCiB7CiAgICAgR1RfVTMyIGN1cnJDczsKLSAgICBHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoKTsKKyAgICBHVF9VMzIgbWF4X2NzID0gbXZId3NEZHIzVGlwTWF4Q1NHZXQoZGV2TnVtKTsKIAogICAgZm9yKGN1cnJDcyA9IDA7IGN1cnJDcyA8IG1heF9jczsgY3VyckNzKyspCiAgICB7Ci0JICAgIGRkcjNUaXBQcmludFBic1Jlc3VsdChkZXZOdW0sIGN1cnJDcyxQQlNfUlhfTU9ERSk7Ci0JICAgIGRkcjNUaXBQcmludFBic1Jlc3VsdChkZXZOdW0sIGN1cnJDcyxQQlNfVFhfTU9ERSk7CisJICAgZGRyM1RpcFByaW50UGJzUmVzdWx0KGRldk51bSwgY3VyckNzLFBCU19SWF9NT0RFKTsKKwkgICBkZHIzVGlwUHJpbnRQYnNSZXN1bHQoZGV2TnVtLCBjdXJyQ3MsUEJTX1RYX01PREUpOwogICAgfQogICAgcmV0dXJuIEdUX09LOwogfQpAQCAtNjI5LDcgKzYzOCwxOCBAQAogewogICAgIEdUX1UzMiBkYXRhVmFsdWUgPSAwLCBiaXQgPSAwLCBpbnRlcmZhY2VJZCA9IDAsIHB1cCA9IDA7CiAgICAgR1RfVTMyIHJlZ0FkZHIgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSkgPyAoUEJTX1JYX1BIWV9SRUcgKyBjc051bSAqIDB4MTApIDogKFBCU19UWF9QSFlfUkVHICsgY3NOdW0gKiAweDEwKTsKLSAgICBtdlByaW50ZigiQ1MlZCwgJXMgLFBCUyBcbiIsIGNzTnVtICwocGJzTW9kZT09UEJTX1JYX01PREUpPyAiUngiIDogIlR4Iik7CisgICAgR1RfVTMyIG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKKworICAgIG12UHJpbnRmKCIlcyxDUyVkLFBCUyxBRExMUkFUSU8sLCwiLCAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSk/IlJ4IjoiVHgiLCBjc051bSk7CisgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIFZBTElEQVRFX0lGX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpCisgICAgICAgIGZvciggcHVwPTA7IHB1cCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgcHVwKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtdlByaW50ZigiJWQsIixwYnNEZWxheVBlclB1cFtwYnNNb2RlXVtpbnRlcmZhY2VJZF1bcHVwXVtjc051bV0pOworICAgICAgICB9CisJfQorICAgIG12UHJpbnRmKCJcbkNTJWQsICVzICxQQlMgXG4iLCBjc051bSAsKHBic01vZGU9PVBCU19SWF9NT0RFKT8gIlJ4IiA6ICJUeCIpOwogICAgIGZvciggYml0ID0gMCA7IGJpdCA8IEJVU19XSURUSF9JTl9CSVRTIDsgYml0KyspCiAgICAgewogCW12UHJpbnRmKCIlcywgRFEiLChwYnNNb2RlPT1QQlNfUlhfTU9ERSk/ICJSeCIgOiAiVHgiKTsKQEAgLTYzNyw3ICs2NTcsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBWQUxJREFURV9JRl9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKQogCSAgICBtdlByaW50ZigiJWQgLFBCUywsLCAiLGJpdCk7Ci0gICAgICAgICAgICBmb3IoIHB1cD0wOyBwdXAgPD10b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7IHB1cCsrKQorICAgICAgICAgICAgZm9yKCBwdXA9MDsgcHVwIDw9b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwdXArKykKICAgICAgICAgICAgIHsKIAkJVkFMSURBVEVfQlVTX0FDVElWRSh0b3BvbG9neU1hcC0+YWN0aXZlQnVzTWFzaywgcHVwKQogICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNSZWFkKCAgIGRldk51bSwgaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHB1cCwgIEREUl9QSFlfREFUQSwgIHJlZ0FkZHIrYml0LCAmZGF0YVZhbHVlKSk7CkBAIC02NjQsMTEgKzY4NCwxMiBAQAogewogICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwgcHVwLCBiaXQ7CiAgICAgR1RfVTMyIHJlZ0FkZHIgPSAocGJzTW9kZSA9PSBQQlNfUlhfTU9ERSkgPyAoUEJTX1JYX1BIWV9SRUcgKyBlZmZlY3RpdmVfY3MgKiAweDEwKSA6IChQQlNfVFhfUEhZX1JFRyArIGVmZmVjdGl2ZV9jcyAqIDB4MTApOworCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IChHVF9VOClkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBmb3IoIGludGVyZmFjZUlkID0gMCA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTEgOyBpbnRlcmZhY2VJZCsrKQogICAgIHsKICAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yKCBwdXA9MDsgcHVwIDw9dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBwdXArKykKKyAgICAgICAgZm9yKCBwdXA9MDsgcHVwIDw9b2N0ZXRzUGVySW50ZXJmYWNlTnVtOyBwdXArKykKICAgICAgICAgewogCQkJZm9yKCBiaXQgPSAwIDsgYml0IDw9IEJVU19XSURUSF9JTl9CSVRTKzM7IGJpdCsrKQogCQkJewpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ1N0YXRpYy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Ecml2ZXIvZGRyMy9tdkh3c0RkcjNUcmFpbmluZ1N0YXRpYy5jCmluZGV4IDA3ZTNlZDUuLjg4ZmUyODEgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvRHJpdmVyL2RkcjMvbXZId3NEZHIzVHJhaW5pbmdTdGF0aWMuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL0RyaXZlci9kZHIzL212SHdzRGRyM1RyYWluaW5nU3RhdGljLmMKQEAgLTI5LDEzICsyOSw4IEBACiAjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcFBydklmLmgiCiAjaW5jbHVkZSAibXZEZHIzTG9nZ2luZ0RlZi5oIgogCi0jaWZkZWYgQ09ORklHX0REUjQKLSNpbmNsdWRlICJtdkh3c0RkcjRUcmFpbmluZy5oIgotI2VuZGlmCi0KIGV4dGVybiBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcDsKIGV4dGVybiBHVF9VMzIgY2xhbXBUYmxbTUFYX0lOVEVSRkFDRV9OVU1dOwotZXh0ZXJuIEdUX1UzMiB2cmVmOwogCiAjaWZkZWYgU1RBVElDX0FMR09fU1VQUE9SVAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY1LDcgKzYwLDYgQEAKIAogR1RfVTMyIHJlYWRSZWFkeURlbGF5UGhhc2VPZmZzZXRbXSA9IHsgNCwgNCwgNCwgNCwgNiwgNiwgNiwgNiB9OwogCi1leHRlcm4gR1RfVTMyIHZyZWY7CiBleHRlcm4gQ2xWYWx1ZVBlckZyZXEgY2FzTGF0ZW5jeVRhYmxlW107CiBleHRlcm4gR1RfVTMyIHRhcmdldEZyZXE7CiBleHRlcm4gTVZfSFdTX1RJUF9DT05GSUdfRlVOQ19EQiBjb25maWdGdW5jSW5mb1tIV1NfTUFYX0RFVklDRV9OVU1dOwpAQCAtMTUzLDEwICsxNDcsMTEgQEAKICAgICBHVF9VMzIgdGVtcDsKICAgICBHVF9VMzIgYm9hcmRUcmFjZTsKICAgICBUcmlwRGVsYXlFbGVtZW50KiBwa2dEZWxheVB0cjsKKwlHVF9VOCBvY3RldHNQZXJJbnRlcmZhY2VOdW0gPSBkZHIzVGlwRGV2QXR0ckdldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSk7CiAKICAgICBzaWduID0gKGlzV2wpID8gLTEgOiAxOyAvKiBpbiBXTCB3ZSBjYWxjIHRoZSBkaWZmIGJldHdlZW4gQ2xvY2sgdG8gRFFzIGluIFJMIHdlIHN1bSB0aGUgcm91bmQgdHJpcCBvZiBDbG9jayBhbmQgRFFzICovCiAKLSAgICBidXNQZXJJbnRlcmZhY2UgPSBHRVRfVE9QT0xPR1lfTlVNX09GX0JVU0VTKGRldk51bSk7CisgICAgYnVzUGVySW50ZXJmYWNlID0gb2N0ZXRzUGVySW50ZXJmYWNlTnVtOwogCiAgICAgZm9yKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPD0gTUFYX0lOVEVSRkFDRV9OVU0tMTsgaW50ZXJmYWNlSWQrKykKICAgICB7CkBAIC0xOTcsMTIgKzE5MiwxMyBAQAogICAgIEdUX1UzMiBwaGFzZSA9IDA7CiAgICAgR1RfVTMyIGFkbGwgPSAwLCBhZGxsX2NlbiwgYWRsbF9pbnYsIGFkbGxfZmluYWw7CiAgICAgR1RfVTMyIGFkbGxQZXJpb2QgPSBNRUdBIC8gZnJlcVZhbFtmcmVxdWVuY3ldIC8gNjQ7CisJR1RfVTggb2N0ZXRzUGVySW50ZXJmYWNlTnVtID0gZGRyM1RpcERldkF0dHJHZXQoZGV2TnVtLCBNVl9BVFRSX09DVEVUX1BFUl9JTlRFUkZBQ0UpOwogCiAgICAgREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRkcjNUaXBXcml0ZUxldmVsaW5nU3RhdGljQ29uZmlnXG4iKSk7CiAgICAgREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRldk51bSAweCV4IElGIDB4JXggZnJlcSAlZCAoYWRsbFBlcmlvZCAweCV4KVxuIiwgZGV2TnVtLCBpbnRlcmZhY2VJZCwgZnJlcXVlbmN5LCBhZGxsUGVyaW9kKSk7ICAgCiAKIAotCWJ1c1BlckludGVyZmFjZSA9IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsKKwlidXNQZXJJbnRlcmZhY2UgPSBvY3RldHNQZXJJbnRlcmZhY2VOdW07CiAJYnVzU3RhcnRJbmRleCA9IGludGVyZmFjZUlkICogYnVzUGVySW50ZXJmYWNlOwogCWZvcihidXNJbmRleCA9IGJ1c1N0YXJ0SW5kZXg7IGJ1c0luZGV4IDwgKGJ1c1N0YXJ0SW5kZXggKyBidXNQZXJJbnRlcmZhY2UpOyBidXNJbmRleCsrKQogCXsKQEAgLTI0OCw4ICsyNDQsNyBAQAogCU1WX0hXU19TUEVFRF9CSU4gc3BlZWRCaW5JbmRleDsKIAlHVF9VMzIgcmRTYW1wbGVEbHlbTUFYX0NTX05VTV0gPSB7IDAgfTsKIAlHVF9VMzIgcmRSZWFkeURlbFtNQVhfQ1NfTlVNXSAgPSB7IDAgfTsKLQlHVF9VMzIgIGJ1c1BlckludGVyZmFjZSA9IEdFVF9UT1BPTE9HWV9OVU1fT0ZfQlVTRVMoZGV2TnVtKTsKLQorCUdUX1U4IG9jdGV0c1BlckludGVyZmFjZU51bSA9IGRkcjNUaXBEZXZBdHRyR2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFKTsKIAogICAgIERFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJkZHIzVGlwUmVhZExldmVsaW5nU3RhdGljQ29uZmlnXG4iKSk7CiAgICAgREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRldk51bSAweCV4IGlmYyAweCV4IGZyZXEgJWRcbiIsIGRldk51bSxpbnRlcmZhY2VJZCwgZnJlcXVlbmN5KSk7ICAgCkBAIC0yNjcsOSArMjYyLDkgQEAKICAgICB9CiAgIAogCi0gICAgYnVzU3RhcnRJbmRleCA9IGludGVyZmFjZUlkICogYnVzUGVySW50ZXJmYWNlOworICAgIGJ1c1N0YXJ0SW5kZXggPSBpbnRlcmZhY2VJZCAqIG9jdGV0c1BlckludGVyZmFjZU51bTsKIAotICAgIGZvcihidXNJbmRleD1idXNTdGFydEluZGV4OyBidXNJbmRleCA8IChidXNTdGFydEluZGV4ICsgYnVzUGVySW50ZXJmYWNlKTsgYnVzSW5kZXgrPTIpCisgICAgZm9yKGJ1c0luZGV4PWJ1c1N0YXJ0SW5kZXg7IGJ1c0luZGV4IDwgKGJ1c1N0YXJ0SW5kZXggKyBvY3RldHNQZXJJbnRlcmZhY2VOdW0pOyBidXNJbmRleCs9MikKICAgICB7CiAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0luZGV4KQogICAgICAgICBjcyA9IGNoaXBTZWxlY3RNYXBbdG9wb2xvZ3lNYXAtPmludGVyZmFjZVBhcmFtc1tpbnRlcmZhY2VJZF0uYXNCdXNQYXJhbXNbKGJ1c0luZGV4ICUgNCldLmNzQml0bWFza10uY3NOdW07CkBAIC0yOTcsMzAgKzI5MiwxMSBAQAogCQlkYXRhMCA9ICAoKHBoYXNlMCA8PCA2KSArIChhZGxsMCAmIDB4MUYpKTsKIAkJZGF0YTEgPSAoKHBoYXNlMSA8PCA2KSArIChhZGxsMSAmIDB4MUYpKTsKIAotI2lmIDAKLS8qQ2hlY2sgd2hlbiB0aGlzIHVzZWQgaW4gb3RoZXIgcHJvamVjdHMqLwotCQlpZiAoc2lsaWNvbiA9PSAwKQotCQl7Ci0JCQlzd2l0Y2godG9wb2xvZ3lNYXAtPmJvYXJkSWQpCi0JCQl7Ci0JCQkJY2FzZSBERFJfQk9BUkRfRlVOQ1RJT05BTDoKLQkJCQkJZGF0YTMgPSBmdW5jdGlvblJlZ1ZhbHVlOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgRERSX0JPQVJEX0VUUDoKLQkJCQljYXNlIEREUl9CT0FSRF9DVVNUT01FUjoKLQkJCQlkZWZhdWx0OgotCQkJCQlkYXRhMyA9IHNfdWlNUmVnVmFsdWU7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0jZW5kaWYKLQogCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAoYnVzSW5kZXggJSA0KSwgRERSX1BIWV9EQVRBLCBQSFlfUkVBRF9ERUxBWShjcyksIGRhdGEwLDB4MURGKSk7CiAJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQnVzUmVhZE1vZGlmeVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsICgoYnVzSW5kZXggKyAxKSAlIDQpLCBERFJfUEhZX0RBVEEsIFBIWV9SRUFEX0RFTEFZKGNzKSwgZGF0YTEsIDB4MURGKSk7CiAJfQogCi0gICAgZm9yIChidXNJbmRleCA9IDA7IGJ1c0luZGV4IDwgYnVzUGVySW50ZXJmYWNlOyBidXNJbmRleCsrKQorICAgIGZvciAoYnVzSW5kZXggPSAwOyBidXNJbmRleCA8IG9jdGV0c1BlckludGVyZmFjZU51bTsgYnVzSW5kZXgrKykKICAgICB7CiAgICAJCVZBTElEQVRFX0JVU19BQ1RJVkUodG9wb2xvZ3lNYXAtPmFjdGl2ZUJ1c01hc2ssIGJ1c0luZGV4KQogICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIGJ1c0luZGV4LCBERFJfUEhZX0RBVEEsIDB4MywgZGF0YTMsIDB4MUYpKTsKQEAgLTM4OCw3ICszNjQsNyBAQAogICAgR1RfVTMyIGluZGV4Q250ID0gMDsKIAogICAgREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoImRkcjNUaXBTdGF0aWNJbml0Q29udHJvbGxlclxuIikpOyAKLS8vICAgZm9yKGluZGV4Q250ID0gMDsgaW5kZXhDbnQgPCBzdGF0aWNJbml0Q29udHJvbGxlckNvbmZpZ0xlbltkZXZOdW1dOyBpbmRleENudCsrKQorCiAJd2hpbGUoc3RhdGljSW5pdENvbnRyb2xsZXJDb25maWdbZGV2TnVtXVtpbmRleENudF0ucmVnQWRkciAhPSAwKQogICAgewogICAgICAgIAlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwSUZXcml0ZShkZXZOdW0sQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgCkBAIC00MDgsOTUgKzM4NCwxNSBAQAogICAgIEdUX1UzMiAgICBkZXZOdW0KICkKIHsKLQkvL0RFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJDTEsgdG8gQ1RSTCBza2V3XG4iKSk7Ci0gICAgLy9DSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIDB4MiwgRERSX1BIWV9DT05UUk9MLCAweDkwLCAweDIwZGEpKTsKLQotCS8vREVCVUdfVFJBSU5JTkdfU1RBVElDX0lQKERFQlVHX0xFVkVMX1RSQUNFLCAoIkNUUkwgUmVmIERlbGF5XG4iKSk7IC8qIG1vdGliIGRvZXMgbm90IGVmZWN0Ki8KLSAgICAvL0NIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCAweDEsIDB4ZikpOwotICAgICAKLQlERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiUGh5IEluaXQgQ29udHJvbGxlciAyXG4iKSk7IAogICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCAweEE0LCAweDNkZmUpKTsKLQkKLQlERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiUGh5IEluaXQgQ29udHJvbGxlciAzXG4iKSk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4QTYsIDB4Q0IyKSk7Ci0JIAotCURFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJQaHkgSW5pdCBDb250cm9sbGVyIDRcbiIpKTsKICAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhBOSwgMCkpOwotICAgIAotCURFQlVHX1RSQUlOSU5HX1NUQVRJQ19JUChERUJVR19MRVZFTF9UUkFDRSwgKCJTdGF0aWMgUmVjZWl2ZXIgQ2FsaWJyYXRpb25cbiIpKTsKIAlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHhEMCwgMHgxRikpOwotCSAKLQlERUJVR19UUkFJTklOR19TVEFUSUNfSVAoREVCVUdfTEVWRUxfVFJBQ0UsICgiU3RhdGljIFYtUkVGIENhbGlicmF0aW9uXG4iKSk7CiAgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIDB4QTgsIDB4NDM0KSk7CiAgICAgIAotCiAgICAgcmV0dXJuIEdUX09LOwogfQogCiAjZW5kaWYKIAotLypEZXNpZ24gR3VpZGVsaW5lcyBwYXJhbWV0ZXJzKi8KLUdUX1UzMiBnWnByaURhdGEgPSAxMjM7IC8vY29udHJvbGxlciBkYXRhIC0gUCBkcml2ZSBzdHJlbmd0aAotR1RfVTMyIGdabnJpRGF0YSA9IDEyMzsgLy9jb250cm9sbGVyIGRhdGEg77+9IE4gZHJpdmUgc3RyZW5ndGgKLUdUX1UzMiBnWnByaUN0cmwgPSA3NDsgLy9jb250cm9sbGVyIEMvQSDvv70gUCBkcml2ZSBzdHJlbmd0aAotR1RfVTMyIGdabnJpQ3RybCA9IDc0OyAvL2NvbnRyb2xsZXIgQy9BIO+/vSBOIGRyaXZlIHN0cmVuZ3RoCi0KLUdUX1UzMiBnWnBvZHREYXRhID0gNDU7IC8vY29udHJvbGxlciBkYXRhIC0gUCBPRFQKLUdUX1UzMiBnWm5vZHREYXRhID0gNDU7IC8vY29udHJvbGxlciBkYXRhIC0gTiBPRFQKLUdUX1UzMiBnWnBvZHRDdHJsID0gNDU7IC8vY29udHJvbGxlciBkYXRhIC0gUCBPRFQKLUdUX1UzMiBnWm5vZHRDdHJsID0gNDU7IC8vY29udHJvbGxlciBkYXRhIC0gTiBPRFQKLQotI2lmIDAKLUdUX1UzMiBnRGljID0gR1RfVFVORV9UUkFJTklOR19QQVJBTVNfVU5ERUZJTkVEOyAvL21lbW9yeSBkcml2ZSBzdHJlbmd0aAotR1RfVTMyIHVpT0RUQ29uZmlnID0gR1RfVFVORV9UUkFJTklOR19QQVJBTVNfVU5ERUZJTkVEOwotR1RfVTMyIGdSdHROb20gPSBHVF9UVU5FX1RSQUlOSU5HX1BBUkFNU19VTkRFRklORUQ7Ci0jZW5kaWYKLS8vR1RfVTMyIGdSdHRXciA9IEdUX1RVTkVfVFJBSU5JTkdfUEFSQU1TX1VOREVGSU5FRDsKLQotR1RfVTMyIHVpT0RUQ29uZmlnID0gMHgxMjAwMTI7Ci1HVF9VMzIgZ1J0dE5vbSA9IDB4NDQ7Ci1HVF9VMzIgZ0RpYyA9IDB4MjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1Db25maWd1cmUgcGh5ICggY2FsbGVkIGJ5IHN0YXRpYyBpbml0IGNvbnRyb2xsZXIpICBmb3Igc3RhdGljIGZsb3cKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUdUX1NUQVRVUyAgICBkZHIzVGlwQ29uZmlndXJlUGh5Ci0oCi0gICAgR1RfVTMyICAgIGRldk51bQotKQotewotICAgIEdUX1UzMiBpbnRlcmZhY2VJZCwgcGh5SWQ7Ci0KLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgUEFEX1pSSV9DQUxJQl9QSFlfUkVHLCAoKDB4N2YgJiBnWnByaURhdGEpIDw8IDcgfCAoMHg3ZiAmIGdabnJpRGF0YSkpKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0NPTlRST0wsIFBBRF9aUklfQ0FMSUJfUEhZX1JFRywgKCgweDdmICYgZ1pwcmlDdHJsKSA8PCA3IHwgKDB4N2YgJiBnWm5yaUN0cmwpKSkpOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9EQVRBLCBQQURfT0RUX0NBTElCX1BIWV9SRUcsICgoMHgzZiAmIGdacG9kdERhdGEpIDw8IDYgfCAoMHgzZiAmIGdabm9kdERhdGEpKSkpOwotICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBCVVNXcml0ZSggIGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgRERSX1BIWV9DT05UUk9MLCBQQURfT0RUX0NBTElCX1BIWV9SRUcsICgoMHgzZiAmIGdacG9kdEN0cmwpIDw8IDYgfCAoMHgzZiAmIGdabm9kdEN0cmwpKSkpOwotCi0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIFBBRF9QUkVfRElTQUJMRV9QSFlfUkVHLCAwKSk7Ci0gICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcEJVU1dyaXRlKCAgZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBERFJfUEhZX0RBVEEsIENNT1NfQ09ORklHX1BIWV9SRUcsIDApKTsKLSAgICBDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfQ09OVFJPTCwgQ01PU19DT05GSUdfUEhZX1JFRywgMCkpOwotICAgIGZvcihpbnRlcmZhY2VJZCA9IDA7IGludGVyZmFjZUlkIDw9IE1BWF9JTlRFUkZBQ0VfTlVNLTE7IGludGVyZmFjZUlkKyspCi0JewotCQkvKiBjaGVjayBpZiB0aGUgaW50ZXJmYWNlIGlzIGVuYWJsZWQgKi8KLSAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKLSAgICAgICAgZm9yKHBoeUlkPTA7cGh5SWQ8dG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOyBwaHlJZCsrKQotICAgICAgICB7Ci0gICAJCQlWQUxJREFURV9CVVNfQUNUSVZFKHRvcG9sb2d5TWFwLT5hY3RpdmVCdXNNYXNrLCBwaHlJZCkKLSAgICAgICAgICAgIC8qIFZyZWYgJiBjbGFtcCAqLwotICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCdXNSZWFkTW9kaWZ5V3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgIHBoeUlkLCBERFJfUEhZX0RBVEEsIFBBRF9DT05GSUdfUEhZX1JFRywgICAoKGNsYW1wVGJsW2ludGVyZmFjZUlkXSA8PCA0KSB8IHZyZWYgKSwgKCgweDcgPDwgNCkgfCAweDcpICkpOwotICAgICAgICAgICAgLyogY2xhbXAgbm90IHJlbGV2YW50IGZvciBjb250cm9sICovCi0gICAgICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJ1c1JlYWRNb2RpZnlXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAgcGh5SWQsIEREUl9QSFlfQ09OVFJPTCwgUEFEX0NPTkZJR19QSFlfUkVHLCAgICAweDQgLCAweDcgKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19BUk1BREFfMzhYKSB8fCBkZWZpbmVkIChDT05GSUdfQVJNQURBXzM5WCkKLQlDSEVDS19TVEFUVVMobXZId3NEZHIzVGlwQlVTV3JpdGUoICBkZXZOdW0sIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEFDQ0VTU19UWVBFX01VTFRJQ0FTVCwgUEFSQU1fTk9UX0NBUkUsIEREUl9QSFlfREFUQSwgMHg5MCwgMHg2MDAyKSk7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19ERFI0Ci0gICAgZGRyNFRpcENvbmZpZ3VyZVBoeShkZXZOdW0pOwotI2VuZGlmCi0KLSAgIHJldHVybiBHVF9PSzsKLX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Pcy9ndE9zL212WG9yLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL09zL2d0T3MvbXZYb3IuYwppbmRleCAzNmM1ZDE0Li5mMDJhZTk4IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL09zL2d0T3MvbXZYb3IuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL09zL2d0T3MvbXZYb3IuYwpAQCAtNzEsMzQgKzcxLDUzIEBACiAjZW5kaWYKIAogc3RhdGljIEdUX1UzMiB1aVhvclJlZ3NDdHJsQmFja3VwOwotc3RhdGljIEdUX1UzMiB1aVhvclJlZ3NCYXNlQmFja3VwW01BWF9DU107Ci1zdGF0aWMgR1RfVTMyIHVpWG9yUmVnc01hc2tCYWNrdXBbTUFYX0NTXTsKK3N0YXRpYyBHVF9VMzIgdWlYb3JSZWdzQmFzZUJhY2t1cFtNQVhfQ1MgKyAxXTsKK3N0YXRpYyBHVF9VMzIgdWlYb3JSZWdzTWFza0JhY2t1cFtNQVhfQ1MgKyAxXTsKIAotZXh0ZXJuIEdUX1UzMiBtdkh3c0RkcjNUaXBNYXhDU0dldCh2b2lkKTsKK2V4dGVybiBHVF9VMzIgbXZId3NEZHIzVGlwTWF4Q1NHZXQoR1RfVTMyIGRldk51bSk7CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12U3lzWG9ySW5pdAorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgdGhlIFhPUiB1bml0J3Mgd2luZG93cy4KKyogSU5QVVQ6CisqICAgICAgIHVpTnVtT2ZDUwktIG51bWJlciBvZiBlbmFibGVkIGNoaXAgc2VsZWN0CisqCXVpQ3NFbmEJCS0gYml0bWFwIG9mIGVuYWJsZWQgY2hpcCBzZWxlY3RzOgorKgkJCQliaXRbaV0gPSAxIGlmIGNoaXAgc2VsZWN0IGkgaXMgZW5hYmxlZCAoZm9yIDEgPD0gaSA8PSAzKQorKgkJCQliaXRbNF0gPSBpZiBTUkFNIHdpbmRvdyBpcyBlbmFibGVkCisqCWNzU2l6ZQkJLSBzaXplIG9mIERSQU0gY2hpcCBzZWxlY3QKKyoJYmFzZURlbHRhCS0gYmFzZSBzdGFydCBvZiB0aGUgRFJBTSB3aW5kb3dzCisqCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogR1RfVk9JRCBtdlN5c1hvckluaXQoR1RfVTMyIHVpTnVtT2ZDUywgR1RfVTMyIHVpQ3NFbmEsIEdUX1UzMiBjc1NpemUsIEdUX1UzMiBiYXNlRGVsdGEpCiB7Ci0JR1RfVTMyIHVpUmVnLHVpLHVpQmFzZSx1aUNzQ291bnQ7CisJR1RfVTMyIHVpUmVnLCB1aSwgdWlCYXNlLCB1aUNzQ291bnQsIHNpemVNYXNrOwogCiAJdWlYb3JSZWdzQ3RybEJhY2t1cCA9IE1WX1JFR19SRUFEKFhPUl9XSU5ET1dfQ1RSTF9SRUcoMCwgMCkpOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJdWlYb3JSZWdzQmFzZUJhY2t1cFt1aV0gPSBNVl9SRUdfUkVBRChYT1JfQkFTRV9BRERSX1JFRygwLCB1aSkpOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJdWlYb3JSZWdzTWFza0JhY2t1cFt1aV0gPSBNVl9SRUdfUkVBRChYT1JfU0laRV9NQVNLX1JFRygwLCB1aSkpOwogCiAJdWlSZWcgPSAwOwotCWZvcih1aT0wO3VpPCh1aU51bU9mQ1MpO3VpKyspIHsKLQkJdWlSZWcgfD0gKDB4MSA8PCAodWkpKTsgCQkJCQkvKiAJRW5hYmxlIFdpbmRvdyB4IGZvciBlYWNoIENTICovCi0JCXVpUmVnIHw9ICgweDMgPDwgKCh1aSoyKSsxNikpOyAJCQkJLyogCUVuYWJsZSBXaW5kb3cgeCBmb3IgZWFjaCBDUyAqLworCWZvciAodWlDc0NvdW50ID0gMCwgdWkgPSAwOyB1aUNzQ291bnQgPCB1aU51bU9mQ1MgJiYgdWkgPCA4OyB1aSsrKSB7CisJCWlmKHVpQ3NFbmEgJiAoMSA8PCB1aSkpIHsKKwkJCXVpUmVnIHw9ICgweDEgPDwgKHVpKSk7CQkJLyogRW5hYmxlIFdpbmRvdyB4IGZvciBlYWNoIENTICovCisJCQl1aVJlZyB8PSAoMHgzIDw8ICgodWkqMikrMTYpKTsgCQkvKiBFbmFibGUgV2luZG93IHggZm9yIGVhY2ggQ1MgKi8KKwkJCXVpQ3NDb3VudCsrOworCQl9CiAJfQogCiAJTVZfUkVHX1dSSVRFKFhPUl9XSU5ET1dfQ1RSTF9SRUcoMCwgMCksIHVpUmVnKTsKIAotCXVpQ3NDb3VudCA9IDA7Ci0JZm9yKHVpPTA7dWk8dWlOdW1PZkNTO3VpKyspIHsKKwlmb3IgKHVpQ3NDb3VudCA9IDAsIHVpID0gMDsgdWlDc0NvdW50IDwgdWlOdW1PZkNTICYmIHVpIDwgODsgdWkrKykgewogCQlpZih1aUNzRW5hICYgKDE8PHVpKSkgewogCQkJLyogd2luZG93IHggLSBCYXNlIC0gMHgwMDAwMDAwMCwgQXR0cmlidXRlIDB4MEUgLSBEUkFNICovCiAJCQl1aUJhc2UgPSBjc1NpemUqdWkgKyBiYXNlRGVsdGE7CisJCQkvKiBmaXhlZCBzaXplIDJHQiBmb3IgZWFjaCBDUyAqLworCQkJc2l6ZU1hc2sgPSAweDdGRkYwMDAwOwogCQkJc3dpdGNoKHVpKSB7CiAJCQkJY2FzZSAwOgogCQkJCQl1aUJhc2UgfD0gMHhFMDA7CkBAIC0xMTIsMTIgKzEzMSwxNiBAQAogCQkJCWNhc2UgMzoKIAkJCQkJdWlCYXNlIHw9IDB4NzAwOwogCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6IC8qIFNSQU0gKi8KKwkJCQkJdWlCYXNlID0gMHg0MDAwMDAwMDsKKwkJCQkJdWlCYXNlIHw9IDB4MUYwMDsgLyogY29uZmlndXJlIGFzIHNoYXJlZCB0cmFuc2FjdGlvbiAqLworCQkJCQlzaXplTWFzayA9IDB4RjAwMDA7CiAJCQl9CiAKLQkJCU1WX1JFR19XUklURShYT1JfQkFTRV9BRERSX1JFRygwLCB1aUNzQ291bnQpLCB1aUJhc2UpOworCQkJTVZfUkVHX1dSSVRFKFhPUl9CQVNFX0FERFJfUkVHKDAsIHVpKSwgdWlCYXNlKTsKIAogCQkJLyogd2luZG93IHggLSBTaXplKi8KLQkJCU1WX1JFR19XUklURShYT1JfU0laRV9NQVNLX1JFRygwLCB1aUNzQ291bnQpLCAweDdGRkYwMDAwKTsKKwkJCU1WX1JFR19XUklURShYT1JfU0laRV9NQVNLX1JFRygwLCB1aSksIHNpemVNYXNrKTsKIAkJCXVpQ3NDb3VudCsrOwogCQl9CiAJfQpAQCAtMTMxLDkgKzE1NCw5IEBACiAJR1RfVTMyIHVpOwogCiAJTVZfUkVHX1dSSVRFKFhPUl9XSU5ET1dfQ1RSTF9SRUcoMCwgMCksIHVpWG9yUmVnc0N0cmxCYWNrdXApOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJTVZfUkVHX1dSSVRFKFhPUl9CQVNFX0FERFJfUkVHKDAsIHVpKSwgdWlYb3JSZWdzQmFzZUJhY2t1cFt1aV0pOwotCWZvcih1aT0wO3VpPE1BWF9DUzt1aSsrKQorCWZvcih1aSA9IDA7IHVpIDwgTUFYX0NTICsgMTsgdWkrKykKIAkJTVZfUkVHX1dSSVRFKFhPUl9TSVpFX01BU0tfUkVHKDAsIHVpKSwgdWlYb3JSZWdzTWFza0JhY2t1cFt1aV0pOwogCiAJTVZfUkVHX1dSSVRFKFhPUl9BRERSX09WUkRfUkVHKDAsIDApLCAwKTsKQEAgLTM5Miw5ICs0MTUsOSBAQAogewogCU1WX1UzMiBjc19jLG1heF9jczsKIAlNVl9VMzIgdWlDc0VuYSA9IDA7Ci0gICAgbXZQcmludGYoIkREUjMgVHJhaW5pbmcgU2VxdWVuY2UgLSBTdGFydCBzY3J1YmJpbmcgXG4iKTsKKyAgICBtdlByaW50ZigiRERSIFRyYWluaW5nIFNlcXVlbmNlIC0gU3RhcnQgc2NydWJiaW5nIFxuIik7CiAKLQltYXhfY3MgPSBtdkh3c0RkcjNUaXBNYXhDU0dldCgpOworCW1heF9jcyA9IG12SHdzRGRyM1RpcE1heENTR2V0KDApOwogCWZvciAoY3NfYyA9IDA7IGNzX2MgPCBtYXhfY3M7IGNzX2MrKykKIAkJdWlDc0VuYSB8PSAxIDw8IGNzX2M7CiAKQEAgLTQxMSw3ICs0MzQsMTA2IEBACiAgICAgLyogUmV0dXJuIFhPUiBTdGF0ZSAqLwogICAgIG12U3lzWG9yRmluaXNoKCk7CiAKLSAgICBtdlByaW50ZigiRERSMyBUcmFpbmluZyBTZXF1ZW5jZSAtIEVuZCBzY3J1YmJpbmcgXG4iKTsKKyAgICBtdlByaW50ZigiRERSIFRyYWluaW5nIFNlcXVlbmNlIC0gRW5kIHNjcnViYmluZyBcbiIpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdlhvclRyYW5zZmVyIC0gVHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBvbiBvbmUgb2YKKyogICAgICAgICAgICAgICAgIHRocmVlIG1vZGVzIChYT1IsQ1JDMzIsRE1BKQorKgorKiBERVNDUklQVElPTjoKKyogICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWF0ZXMgWE9SIGNoYW5uZWwsIGFjY29yZGluZyB0byBmdW5jdGlvbiBwYXJhbWV0ZXJzLAorKiAgICAgICBpbiBvcmRlciB0byBwZXJmb3JtIFhPUiBvciBDUkMzMiBvciBETUEgdHJhbnNhY3Rpb24uCisqICAgICAgIFRvIGdhaW4gbWF4aW11bSBwZXJmb3JtYW5jZSB0aGUgdXNlciBpcyBhc2tlZCB0byBrZWVwIHRoZSBmb2xsb3dpbmcKKyogICAgICAgcmVzdHJpY3Rpb25zOgorKiAgICAgICAxKSBTZWxlY3RlZCBlbmdpbmUgaXMgYXZhaWxhYmxlIChub3QgYnVzeSkuCisqICAgICAgIDEpIFRoaXMgbW9kdWxlIGRvZXMgbm90IHRha2UgaW50byBjb25zaWRlcmF0aW9uIENQVSBNTVUgaXNzdWVzLgorKiAgICAgICAgICBJbiBvcmRlciBmb3IgdGhlIFhPUiBlbmdpbmUgdG8gYWNjZXNzIHRoZSBhcHByb3ByZWF0ZSBzb3VyY2UKKyogICAgICAgICAgYW5kIGRlc3RpbmF0aW9uLCBhZGRyZXNzIHBhcmFtZXRlcnMgbXVzdCBiZSBnaXZlbiBpbiBzeXN0ZW0KKyogICAgICAgICAgcGh5c2ljYWwgbW9kZS4KKyogICAgICAgMikgVGhpcyBBUEkgZG9lcyBub3QgdGFrZSBjYXJlIG9mIGNhY2hlIGNvaGVyZW5jeSBpc3N1ZXMuIFRoZSBzb3VyY2UsCisqICAgICAgICAgIGRlc3RpbmF0aW9uIGFuZCBpbiBjYXNlIG9mIGNoYWluIHRoZSBkZXNjcmlwdG9yIGxpc3QgYXJlIGFzc3VtZWQKKyogICAgICAgICAgdG8gYmUgY2FjaGUgY29oZXJlbnQuCisqICAgICAgIDQpIFBhcmFtZXRlcnMgdmFsaWRpdHkuIEZvciBleGFtcGxlLCBkb2VzIHNpemUgcGFyYW1ldGVyIGV4Y2VlZHMKKyogICAgICAgICAgbWF4aW11bSBieXRlIGNvdW50IG9mIGRlc2NyaXB0b3IgbW9kZSAoMTZNIG9yIDY0SykuCisqCisqIElOUFVUOgorKiAgICAgICBjaGFuICAgICAgICAgIC0gWE9SIGNoYW5uZWwgbnVtYmVyLiBTZWUgR1RfWE9SX0NIQU5ORUwgZW51bWVyYXRvci4KKyogICAgICAgeG9yVHlwZSAgICAgICAtIE9uZSBvZiB0aHJlZTogWE9SLCBDUkMzMiBhbmQgRE1BIG9wZXJhdGlvbnMuCisqICAgICAgIHhvckNoYWluUHRyICAgLSBhZGRyZXNzIG9mIGNoYWluIHBvaW50ZXIKKyoKKyogT1VUUFVUOgorKiAgICAgICBOb25lLgorKgorKiBSRVRVUlM6CisqICAgICAgIEdUX0JBRF9QQVJBTSBpZiBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9uIGludmFsaWQsIEdUX09LIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9TVEFUVVMgbXZYb3JUcmFuc2ZlcihHVF9VMzIgY2hhbiwgTVZfWE9SX1RZUEUgeG9yVHlwZSwgR1RfVTMyIHhvckNoYWluUHRyKQoreworCUdUX1UzMiB0ZW1wOwogCisJLyogUGFyYW1ldGVyIGNoZWNraW5nICovCisJaWYgKGNoYW4gPj0gTVZfWE9SX01BWF9DSEFOKSB7CisJCURCKG12UHJpbnRmKCIlczogRVJSLiBJbnZhbGlkIGNoYW4gbnVtICVkXG4iLCBfX2Z1bmNfXywgY2hhbikpOworCQlyZXR1cm4gR1RfQkFEX1BBUkFNOworCX0KKwlpZiAoTVZfQUNUSVZFID09IG12WG9yU3RhdGVHZXQoY2hhbikpIHsKKwkJREIobXZQcmludGYoIiVzOiBFUlIuIENoYW5uZWwgaXMgYWxyZWFkeSBhY3RpdmVcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBHVF9CVVNZOworCX0KKwlpZiAoMHgwID09IHhvckNoYWluUHRyKSB7CisJCURCKG12UHJpbnRmKCIlczogRVJSLiB4b3JDaGFpblB0ciBpcyBOVUxMIHBvaW50ZXJcbiIsIF9fZnVuY19fKSk7CisJCXJldHVybiBHVF9CQURfUEFSQU07CisJfQorCisJLyogcmVhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGFuZCBtYXNrIHRoZSBvcGVyYXRpb24gbW9kZSBmaWVsZCAqLworCXRlbXAgPSBNVl9SRUdfUkVBRChYT1JfQ09ORklHX1JFRyhYT1JfVU5JVChjaGFuKSwgWE9SX0NIQU4oY2hhbikpKTsKKwl0ZW1wICY9IH5YRVhDUl9PUEVSQVRJT05fTU9ERV9NQVNLOworCisJc3dpdGNoICh4b3JUeXBlKSB7CisJY2FzZSBNVl9YT1I6CisJCWlmICgwICE9ICh4b3JDaGFpblB0ciAmIFhFWERQUl9EU1RfUFRSX1hPUl9NQVNLKSkgeworCQkJREIobXZQcmludGYoIiVzOiBFUlIuIEludmFsaWQgY2hhaW4gcG9pbnRlciAoYml0cyBbNTowXSBtdXN0ICIKKwkJCQkgICAgICAiYmUgY2xlYXJlZClcbiIsIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gR1RfQkFEX1BBUkFNOworCQl9CisJCS8qIHNldCB0aGUgb3BlcmF0aW9uIG1vZGUgdG8gWE9SICovCisJCXRlbXAgfD0gWEVYQ1JfT1BFUkFUSU9OX01PREVfWE9SOworCQlicmVhazsKKworCWNhc2UgTVZfRE1BOgorCQlpZiAoMCAhPSAoeG9yQ2hhaW5QdHIgJiBYRVhEUFJfRFNUX1BUUl9ETUFfTUFTSykpIHsKKwkJCURCKG12UHJpbnRmKCIlczogRVJSLiBJbnZhbGlkIGNoYWluIHBvaW50ZXIgKGJpdHMgWzQ6MF0gbXVzdCAiCisJCQkJICAgICAgImJlIGNsZWFyZWQpXG4iLCBfX2Z1bmNfXykpOworCQkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKKwkJfQorCQkvKiBzZXQgdGhlIG9wZXJhdGlvbiBtb2RlIHRvIERNQSAqLworCQl0ZW1wIHw9IFhFWENSX09QRVJBVElPTl9NT0RFX0RNQTsKKwkJYnJlYWs7CisKKwljYXNlIE1WX0NSQzMyOgorCQlpZiAoMCAhPSAoeG9yQ2hhaW5QdHIgJiBYRVhEUFJfRFNUX1BUUl9DUkNfTUFTSykpIHsKKwkJCURCKG12UHJpbnRmKCIlczogRVJSLiBJbnZhbGlkIGNoYWluIHBvaW50ZXIgKGJpdHMgWzQ6MF0gbXVzdCAiCisJCQkJICAgICAgImJlIGNsZWFyZWQpXG4iLCBfX2Z1bmNfXykpOworCQkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKKwkJfQorCQkvKiBzZXQgdGhlIG9wZXJhdGlvbiBtb2RlIHRvIENSQzMyICovCisJCXRlbXAgfD0gWEVYQ1JfT1BFUkFUSU9OX01PREVfQ1JDOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBHVF9CQURfUEFSQU07CisJfQorCisJLyogd3JpdGUgdGhlIG9wZXJhdGlvbiBtb2RlIHRvIHRoZSByZWdpc3RlciAqLworCU1WX1JFR19XUklURShYT1JfQ09ORklHX1JFRyhYT1JfVU5JVChjaGFuKSwgWE9SX0NIQU4oY2hhbikpLCB0ZW1wKTsKKwkvKiB1cGRhdGUgdGhlIE5leHREZXNjUHRyIGZpZWxkIGluIHRoZSBYT1IgRW5naW5lIFswLi4xXSBOZXh0IERlc2NyaXB0b3IKKwkgICBQb2ludGVyIFJlZ2lzdGVyIChYRXhORFBSKSAqLworCU1WX1JFR19XUklURShYT1JfTkVYVF9ERVNDX1BUUl9SRUcoWE9SX1VOSVQoY2hhbiksIFhPUl9DSEFOKGNoYW4pKSwgeG9yQ2hhaW5QdHIpOworCisJLyogc3RhcnQgdHJhbnNmZXIgKi8KKwlNVl9SRUdfQklUX1NFVChYT1JfQUNUSVZBVElPTl9SRUcoWE9SX1VOSVQoY2hhbiksIFhPUl9DSEFOKGNoYW4pKSwgWEVYQUNUUl9YRVNUQVJUX01BU0spOworCisJcmV0dXJuIEdUX09LOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL2d0QnVpbGQgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vZ3RCdWlsZAppbmRleCA2YmZlNzExLi5iZWI5YWYyIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vZ3RCdWlsZAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vZ3RCdWlsZApAQCAtMTksNyArMTksNyBAQAogCiAjIyBDUFNTIGNvbXBpbGF0aW9uIGVudmlyb25tZW50ICMjIyMjIyMjIyMjIyMjIyMjCiAjSU5DTFVERV9QQVRIID0KLUNfRklMRV9MSVNUICAgPSBtdkh3c0RkcjNCYzIuYworQ19GSUxFX0xJU1QgICA9IG12SHdzRGRyM01zeXMuYyBtdkh3c0RkcjNCYzIuYyBtdkh3c0RkcjNCb2JLLmMKICNTVUJESVJTICAgICAgPQogI0NfRVhDTFVERV9GSUxFX0xJU1QgPQogCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQWMzLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQWMzLmMKaW5kZXggZWM4YTJhOC4uZWQ1ZmQ3MyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0FjMy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNBYzMuYwpAQCAtNDcsMzYgKzQ3LDE4IEBACiAKIGV4dGVybiBNVl9CT09MIGRkcjNJZkVjY0VuYWJsZWQodm9pZCk7CiBleHRlcm4gR1RfVTMyIG1hc2tUdW5lRnVuYzsKLWV4dGVybiBHVF9VMzIgcmxWZXJzaW9uOwotZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSwgY2tEZWxheV8xNiwgY2FEZWxheTsKK2V4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksIGNhRGVsYXk7CiBleHRlcm4gR1RfVTMyIGZpcnN0QWN0aXZlSWY7CiBleHRlcm4gTVZfSFdTX0REUl9GUkVRIGluaXRGcmVxOwogZXh0ZXJuIEdUX1U4ICBkZWJ1Z1RyYWluaW5nQWNjZXNzOwogZXh0ZXJuIEdUX1U4ICBkZWJ1Z1RyYWluaW5nQWMzOwogZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBtZWRpdW1GcmVxOwogZXh0ZXJuIEdUX1U4IGNhbGlicmF0aW9uVXBkYXRlQ29udHJvbDsgLyoyIGV4dGVybmFsIG9ubHksIDEgaXMgaW50ZXJuYWwgb25seSovCitleHRlcm4gR1RfVTMyIGRmc0xvd0ZyZXE7CitleHRlcm4gR1RfVTMyIGZyZXFWYWxbXTsKIAogR1RfVTMyICBwaXBlTXVsdGljYXN0TWFzazsKIAotc3RhdGljIEdUX1UxNiBmcmVxVmFsW0REUl9GUkVRX0xJTUlUXSA9Ci17Ci0gICAgMTMwLCAvKkREUl9GUkVRX0xPV19GUkVRKi8KLSAgICA0MDAsIC8qRERSX0ZSRVFfNDAwLCovCi0gICAgNTMzLCAvKkREUl9GUkVRXzUzMywqLwotICAgIDY2NiwgLypERFJfRlJFUV82NjcsKi8KLSAgICA4MDAsIC8qRERSX0ZSRVFfODAwLCovCi0gICAgOTMzLCAvKkREUl9GUkVRXzkzMywqLwotICAgMTA2NiwgLypERFJfRlJFUV8xMDY2LCovCi0gICAgMzExLCAvKkREUl9GUkVRXzMxMSwqLwotICAgIDMzMywgLypERFJfRlJFUV8zMzMsKi8KLSAgICA0NjcsICAvKkREUl9GUkVRXzQ2NywqLwotICAgIDg1MCwgIC8qRERSX0ZSRVFfODUwLCovCi0gICAgNjAwLCAgLypERFJfRlJFUV82MDAsKi8KLSAgICAzMDAsICAvKkREUl9GUkVRXzMwMCwqLwotCTkwMCwgIC8qRERSX0ZSRVFfOTAwKi8KLQkzNjAgIC8qRERSX0ZSRVFfMzYwKi8KLX07Ci0KIHN0YXRpYyBHVF9VOCBBYzNCd1BlckZyZXFbRERSX0ZSRVFfTElNSVRdID0KIHsKICAgICAweDMsIC8qRERSX0ZSRVFfMTAwKi8KQEAgLTE5OSw2ICsxODEsOSBAQAogCUdUX1U4ICAgICAgZGV2TnVtLAogCU1WX0REUjNfREVWSUNFX0lORk8gKiBpbmZvUHRyCiApOworCitHVF9VOCAgICBkZHIzVGlwQ2xvY2tNb2RlKCBHVF9VMzIgZnJlcXVlbmN5ICk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXJ2ZXIgQWNjZXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogR1RfU1RBVFVTIGRkcjNUaXBBYzNTZXJ2ZXJSZWdXcml0ZQpAQCAtMzk2LDggKzM4MSw5IEBACiAJTVZfSFdTX0REUl9GUkVRIHVpRGRyRnJlcTsKIAlNVl9TVEFUVVMgc3RhdHVzOwogCU1WX0hXU19UT1BPTE9HWV9NQVAqIHRvcG9sb2d5TWFwID0gZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSk7CisJR1RfVTggbnVtT2ZCdXNQZXJJbnRlcmZhY2UgPSA1OwogCi0gICAgR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIEFDM19OVU1CRVJfT0ZfSU5URVJGQUNFUyAqdG9wb2xvZ3lNYXAtPm51bU9mQnVzUGVySW50ZXJmYWNlOworICAgIEdUX1UzMiBib2FyZE9mZnNldCA9IGJvYXJkSWQgKiBBQzNfTlVNQkVSX09GX0lOVEVSRkFDRVMgKm51bU9mQnVzUGVySW50ZXJmYWNlOwogCiAgICAgLyogbmV3IHJlYWQgbGV2ZWxpbmcgdmVyc2lvbiAqLwogICAgIHN0YXRpY0NvbmZpZy5zaWxpY29uRGVsYXkgPSBBYzNTaWxpY29uRGVsYXlPZmZzZXRbYm9hcmRJZF07CkBAIC00MTEsMTEgKzM5NywxOSBAQAogCWNvbmZpZ0Z1bmMudGlwU2V0RnJlcURpdmlkZXJGdW5jID0gZGRyM1RpcEFjM1NldERpdmlkZXI7CiAJY29uZmlnRnVuYy50aXBHZXREZXZpY2VJbmZvRnVuYyA9IGRkcjNUaXBBQzNHZXREZXZpY2VJbmZvOwogCWNvbmZpZ0Z1bmMudGlwR2V0VGVtcGVyYXR1cmUgPSBOVUxMOworCWNvbmZpZ0Z1bmMudGlwR2V0Q2xvY2tSYXRpbyA9IGRkcjNUaXBDbG9ja01vZGU7CiAKICAgICBtdkh3c0RkcjNUaXBJbml0Q29uZmlnRnVuYyhkZXZOdW0sICZjb25maWdGdW5jKTsKIAogCWRkcjNUaXBSZWdpc3RlckRxVGFibGUoZGV2TnVtLCBEUWJpdE1hcDJQaHlwaW4pOwogCisJLypTZXQgZGV2aWNlIGF0dHJpYnV0ZXMqLworCWRkcjNUaXBEZXZBdHRySW5pdChkZXZOdW0pOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWLCBNVl9USVBfUkVWXzMpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9QSFlfRURHRSwgTVZfRERSX1BIWV9FREdFX05FR0FUSVZFKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSwgbnVtT2ZCdXNQZXJJbnRlcmZhY2UpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9JTlRFUkxFQVZFX1dBLCBHVF9GQUxTRSk7CisKICNpZmRlZiBTVEFUSUNfQUxHT19TVVBQT1JUCiAgICAgZGRyM1RpcEluaXRTdGF0aWNDb25maWdEYihkZXZOdW0sICZzdGF0aWNDb25maWcpOwogI2VuZGlmCkBAIC00MjUsMTIgKzQxOSwxMSBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAotICAgIHJsVmVyc2lvbiA9IDE7Ci0KLSAgICBtYXNrVHVuZUZ1bmMgPSAgICAgKFNFVF9NRURJVU1fRlJFUV9NQVNLX0JJVCB8CisgICAgbWFza1R1bmVGdW5jID0gICAgIChTRVRfTE9XX0ZSRVFfTUFTS19CSVQgfAorCQkJCQkJTE9BRF9QQVRURVJOX01BU0tfQklUIHwKKwkJCQkJCVNFVF9NRURJVU1fRlJFUV9NQVNLX0JJVCB8CiAJCQkJCQlXUklURV9MRVZFTElOR19NQVNLX0JJVCB8CiAJCQkJCQlXUklURV9MRVZFTElOR19TVVBQX01BU0tfQklUIHwKLQkJCQkJCUxPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKIAkJCQkJCVJFQURfTEVWRUxJTkdfTUFTS19CSVQgfAogCQkJCQkJUEJTX1JYX01BU0tfQklUIHwKIAkJCQkJCVBCU19UWF9NQVNLX0JJVCB8CkBAIC00NDgsMTMgKzQ0MSwxMiBAQAogCQltYXNrVHVuZUZ1bmMgJj0JfldSSVRFX0xFVkVMSU5HX1NVUFBfTUFTS19CSVQ7CiAJfQogCi0JaWYoIGNrRGVsYXkgPT0gLTEgKQotCQlja0RlbGF5XzE2ID0gMjAwOwotCWlmKCBja0RlbGF5ID09IC0xICkKKwlpZiggY2tEZWxheSA9PSBNVl9QQVJBTVNfVU5ERUZJTkVEICkKIAkJY2tEZWxheSA9IDIwMDsKIAlkZWxheUVuYWJsZSA9IDE7CiAJY2FEZWxheSA9IDA7CiAJY2FsaWJyYXRpb25VcGRhdGVDb250cm9sID0gMTsKKwlmcmVxVmFsW0REUl9GUkVRX0xPV19GUkVRXSA9IGRmc0xvd0ZyZXEgPSAxMzA7CiAKIAlpbml0RnJlcSA9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbaW50ZXJmYWNlSWRdLm1lbW9yeUZyZXE7CiAKQEAgLTU3MSwyNSArNTYzLDE4IEBACiAgICAgR1RfVTMyIHNhclZhbDsKIAlHVF9VMzIgZGF0YSA9IDA7CiAJR1RfVTMyIHNlbGVjdCA9IDA7CisJR1RfVTggdmFsdWU7CiAJTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKIAotCS8qIER1bml0IHRyYWluaW5nIGNsb2NrICsgMToxIG1vZGUgKi8KLQlpZihmcmVxdWVuY3kgPT0gRERSX0ZSRVFfTE9XX0ZSRVEpIHsKLQkJZGl2UmF0aW8gPSAoMSA8PCAzMCk7Ci0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4Mjk0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7Ci0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4Mjk0LCAgUl9NT0RfVyhkaXZSYXRpbywgZGF0YSwgKDB4MyA8PCAzMCkpKSk7CisJLyogRHVuaXQgdHJhaW5pbmcgY2xvY2sgKyAxOjEvMjoxIG1vZGUgKi8KKwlkaXZSYXRpbyA9IChkZHIzVGlwQ2xvY2tNb2RlKGZyZXF1ZW5jeSkgPDwgMzApOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4Mjk0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4RjgyOTQsICBSX01PRF9XKGRpdlJhdGlvLCBkYXRhLCAoMHgzIDw8IDMwKSkpKTsKIAotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEFjM1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHgxNTI0LCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7Ci0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweDE1MjQsICBSX01PRF9XKCgwIDw8IDE1KSwgZGF0YSwgKDAgPDwgMTUpICkpKTsKLQl9Ci0JZWxzZSB7Ci0JCWRpdlJhdGlvID0gKDIgPDwgMzApOwotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEFjM1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHhGODI5NCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOwotCQlDSEVDS19TVEFUVVMoZGRyM1RpcEFjM1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI5NCwgIFJfTU9EX1coZGl2UmF0aW8sIGRhdGEsICgweDMgPDwgMzApKSkpOworCS8qIENvbmZpZ3VyZSBEdW5pdCB0byAxOjEgaW4gY2FzZSBvZiBETEwgb2ZmIG1vZGUgZWxzZSAyOjEqLworCXZhbHVlID0gKGRkcjNUaXBDbG9ja01vZGUoZnJlcXVlbmN5KSA9PSAxKT8gMCA6IDE7CisJQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIGludGVyZmFjZUlkLCAweDE1MjQsICh2YWx1ZSA8PCAxNSksICgxIDw8IDE1KSkpOwogCi0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnUmVhZChkZXZOdW0sICAweDE1MjQsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBYzNTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4MTUyNCwgIFJfTU9EX1coKDEgPDwgMTUpLCBkYXRhLCAoMCA8PCAxNSkgKSkpOwotCX0KIAlzZWxlY3QgPSAoZnJlcXVlbmN5ID09IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcSk/KDAgPDwgMjkpIDogKDEgPDwgMjkpOy8vVEYgaXMgdGhlIGZ1bmN0aW9uIG1vZGUgc28gdGhlIHNlbGVjdG9yIGhhdmUgdG8gYmUgMC4KIAlDSEVDS19TVEFUVVMoZGRyM1RpcEFjM1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHhGODI5NCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOwogCUNIRUNLX1NUQVRVUyhkZHIzVGlwQWMzU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4Mjk0LCAgUl9NT0RfVyhzZWxlY3QsIGRhdGEsICgweDEgPDwgMjkpKSkpOwpAQCAtNjQyLDYgKzYyNywxOSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIHJldHVybiAxIG9mIGNvcmUvRFVOSVQgY2xvY2sgcmF0aW9uIGlzIDEgZm9yIGdpdmVuIGZyZXEsIDAgaWYgY2xvY2sgcmF0aW9zIGlzIDI6MQorKi8KK0dUX1U4ICAgIGRkcjNUaXBDbG9ja01vZGUoIEdUX1UzMiBmcmVxdWVuY3kgKQoreworCWlmKGZyZXF1ZW5jeSA9PSBERFJfRlJFUV9MT1dfRlJFUSl7CisJCXJldHVybiAxOworCX0KKwllbHNleworCQlyZXR1cm4gMjsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogZXh0ZXJuYWwgcmVhZCBmcm9tIG1lbW9yeQogKi8KIEdUX1NUQVRVUyAgICBkZHIzVGlwRXh0UmVhZApAQCAtNjU1LDcgKzY1Myw3IEBACiB7CiAgICAgR1RfVTMyIGJ1cnN0TnVtOwogCi0gICAgZm9yKGJ1cnN0TnVtPTAgOyBidXJzdE51bSA8IG51bU9mQnVyc3RzKjg7IGJ1cnN0TnVtKyspCisgICAgZm9yKGJ1cnN0TnVtPTAgOyBidXJzdE51bSA8IG51bU9mQnVyc3RzKjQ7IGJ1cnN0TnVtKyspLy8gNCBwZXIgMTYgYml0IEkvRgogICAgIHsKIAkJZGF0YVtidXJzdE51bV0gPSAqICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKHJlZ0FkZHIgKyA0KiBidXJzdE51bSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0JjMi5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0JjMi5jCmluZGV4IGY5MjdmZjcuLjUyMzY3YWYgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNCYzIuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzQmMyLmMKQEAgLTMyLDcgKzMyLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgQkMyX05VTV9CWVRFUyAgICAgICAgICAgICAgICAgICAoMykKLSNkZWZpbmUgQkMyX05VTUJFUl9PRl9JTlRFUkZBQ0VTCQk1CiAKICNkZWZpbmUgQkMyX0NMSUVOVF9GSUVMRChjbGllbnQpCQkoY2xpZW50IDw8IDE1KQogI2RlZmluZSBCQzJfR0VUX0NMSUVOVF9GSUVMRChpbnRlcmZhY2VBY2Nlc3MsaW50ZXJmYWNlSWQpICgoaW50ZXJmYWNlQWNjZXNzID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkgPyBCQzJfQ0xJRU5UX0ZJRUxEKE1VTFRJQ0FTVF9JRCk6QkMyX0NMSUVOVF9GSUVMRChpbnRlcmZhY2VJZCkpCkBAIC00Nyw2ICs0NiwyMyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJlLWRlY2xhcmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorR1RfU1RBVFVTICAgIGRkcjNUaXBCQzJFeHRSZWFkCisoCisgICAgR1RfVTMyICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgbnVtT2ZCdXJzdHMsCisgICAgR1RfVTMyICAgICAgKmRhdGEKKyk7CisKK0dUX1NUQVRVUyAgICBkZHIzVGlwQkMyRXh0V3JpdGUKKygKKyAgICBHVF9VMzIgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICBudW1PZkJ1cnN0cywKKyAgICBHVF9VMzIgICAgICAqYWRkcgorKTsKIHN0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcEJjMkdldE1lZGl1bUZyZXEKICgKICAgICBHVF9VMzIgICAgICAgICAgZGV2TnVtLApAQCAtODYsNyArMTAyLDcgQEAKICAgICBNVl9IV1NfRERSX0ZSRVEqIGZyZXEKICk7CiAKLUdUX1NUQVRVUyBkZHIzVGlwVG1HZXRJbml0RnJlcQorc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwVG1HZXRJbml0RnJlcQogKAogICAgIEdUX1NUQVRVUyAgICAgICBkZXZOdW0sCiAgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCkBAIC0xMzUsNyArMTUxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBHbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogZXh0ZXJuIEdUX1UzMiBtYXNrVHVuZUZ1bmM7Ci1leHRlcm4gR1RfVTMyIHJsVmVyc2lvbjsKIGV4dGVybiBHVF9VMzIgZnJlcVZhbFtdOwogZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBtZWRpdW1GcmVxOwogZXh0ZXJuIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwOwpAQCAtMTQ3LDkgKzE2MiwxMCBAQAogZXh0ZXJuIEdUX1UzMiBpc1BsbEJlZm9yZUluaXQ7CiBleHRlcm4gR1RfVTMyIHVzZUJyb2FkY2FzdDsKIGV4dGVybiBHVF9VMzIgaXNDYmVSZXF1aXJlZDsKLWV4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksIGNrRGVsYXlfMTYsY2FEZWxheTsKK2V4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksY2FEZWxheTsKIGV4dGVybiBHVF9VOCBkZWJ1Z1RyYWluaW5nQWNjZXNzOwogZXh0ZXJuIEdUX1U4IGNhbGlicmF0aW9uVXBkYXRlQ29udHJvbDsgLyoyIGV4dGVybmFsIG9ubHksIDEgaXMgaW50ZXJuYWwgb25seSovCitleHRlcm4gR1RfVTMyIGRmc0xvd0ZyZXE7CiAKIEdUX1UzMiBkZWJ1Z0JjMiA9IDA7CiBHVF9VMzIgIHBpcGVNdWx0aWNhc3RNYXNrOwpAQCAtMjYxLDI0ICsyNzcsNiBAQAogICAgMHgxICAvKkREUl9GUkVRXzM2MCovCiB9OwogCi1HVF9VMzIgcGh5MVZhbFRhYmxlW0REUl9GUkVRX0xJTUlUXSA9Ci17Ci0gIDAsICAgLyogRERSX0ZSRVFfTE9XX0ZSRVEgKi8KLSAgMHhmLCAvKiBERFJfRlJFUV80MDAgKi8KLSAgMHhmLCAvKiBERFJfRlJFUV81MzMgKi8KLSAgMHhmLCAvKiBERFJfRlJFUV82NjcgKi8KLSAgMHhjLCAvKiBERFJfRlJFUV84MDAgKi8KLSAgMHg4LCAvKiBERFJfRlJFUV85MzMgKi8KLSAgMHg4LCAvKiBERFJfRlJFUV8xMDY2ICovCi0gIDB4ZiwgLyogRERSX0ZSRVFfMzExICovCi0gIDB4ZiwgLyogRERSX0ZSRVFfMzMzICovCi0gIDB4ZiwgLyogRERSX0ZSRVFfNDY3ICovCi0gIDB4YywgLypERFJfRlJFUV84NTAqLwotICAweGYsIC8qRERSX0ZSRVFfNjAwKi8KLSAgMHhmLCAvKkREUl9GUkVRXzMwMCovCi0gIDB4OCwgIC8qRERSX0ZSRVFfOTAwKi8KLSAgMHhmICAvKkREUl9GUkVRXzM2MCovCi19OwogCiAvKiBCaXQgbWFwcGluZyAoZm9yIFBCUykgKi8KIEdUX1UzMiBiYzJEUWJpdE1hcDJQaHlwaW5bXSA9CkBAIC0zMTYsMzEgKzMxNCwzMSBAQAogICAgIC8qIDFzdCBib2FyZCAqLwogICAgIHsKICAgICAweDFmLCAvKiBhY3RpdmUgaW50ZXJmYWNlcyAqLwotICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCi0geyAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCi0gICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSB9LAotICAgIDQsIC8qIE51bSBPZiBCdXMgUGVyIEludGVyZmFjZSovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSB9LAogICAgIDB4RiAgLyogQnVzZXMgbWFzayAqLwogICAgIH0sCiAKLQkvKiAybmQgYm9hcmQgKi8KKyAgICAvKiAybmQgYm9hcmQgKi8KICAgICB7CiAgICAgMHgxZiwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KLSAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICAgICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLwotIHsgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAotICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfSwgezAsMCwwLDB9LCB7MCwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gfSwKLSAgICA0LCAvKiBOdW0gT2YgQnVzIFBlciBJbnRlcmZhY2UqLwotICAgIDEgIC8qIGJvYXJkIG51bWJlciAqLworICAgIC8qY3NfbWFzaywgbWlycm9yLCBkcXNfc3dhcCwgY2tfc3dhcCBYIFBVUHMgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRfYmluICAgICAgICAgICBtZW1vcnlfd2lkdGggIG1lbV9zaXplICBmcmVxdWVuY3kgIGNhc0wgY2FzV0wgICAgICB0ZW1wZXJhdHVyZSAqLworIHsgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gLAorICAgIHt7ezB4MSwwLDAsMH0sIHsweDEsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MiwwLDAsMH0sIHswLDAsMCwwfX0sIFNQRUVEX0JJTl9ERFJfMjEzM04sIEJVU19XSURUSF8xNiAsIE1FTV80RywgRERSX0ZSRVFfNjY3LCAwICwgICAwICwgTVZfSFdTX1RFTVBfSElHSH0gfSwKKyAgICAweEYgIC8qIEJ1c2VzIG1hc2sgKi8KICAgICB9CiB9OwogI2VuZGlmCiAKK3N0YXRpYyBHVF9VOCAgICBkZHIzVGlwQ2xvY2tNb2RlKCBHVF9VMzIgZnJlcXVlbmN5ICk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXJ2ZXIgQWNjZXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogR1RfU1RBVFVTIGRkcjNUaXBCYzJTZXJ2ZXJSZWdXcml0ZQpAQCAtNDQ1LDcgKzQ0Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEVuYWJsZSBQaXBlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9TVEFUVVMgICAgZGRyM1RpcFBpcGVFbmFibGUKK3N0YXRpYyBHVF9TVEFUVVMgICAgZGRyM1RpcFBpcGVFbmFibGUKICgKICAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAogICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCkBAIC00NzgsNyArNDc2LDcgQEAKICAgICByZXR1cm4gR1RfT0s7CiB9CiAKLXZvaWQgZGRyM1RpcElzVW5pY2FzdEFjY2VzcyggR1RfVTggZGV2TnVtLEdUX1UzMiogaW50ZXJmYWNlSWQsIE1WX0hXU19BQ0NFU1NfVFlQRSogaW50ZXJmYWNlQWNjZXNzKQorc3RhdGljIHZvaWQgZGRyM1RpcElzVW5pY2FzdEFjY2VzcyggR1RfVTggZGV2TnVtLEdUX1UzMiogaW50ZXJmYWNlSWQsIE1WX0hXU19BQ0NFU1NfVFlQRSogaW50ZXJmYWNlQWNjZXNzKQogewogCUdUX1UzMiBpbmRleENudCwgdG90YWxDbnQgPSAwICwgaW50ZXJmYWNlVG1wID0gMDsKICAgICBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOwpAQCAtNzM4LDIwICs3MzYsMjEgQEAKICAgICBHVF9VMzIgIGJvYXJkSWQKICkKIHsKLSAgICBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCIGNvbmZpZ0Z1bmM7Ci0JTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKyAgICBNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCICAgY29uZmlnRnVuYzsKKwlNVl9IV1NfVE9QT0xPR1lfTUFQKiAgICAgICAgdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKyAgICBHVF9UVU5FX1RSQUlOSU5HX1BBUkFNUyAgICAgdHVuZVBhcmFtczsKIAogCWlmKHRvcG9sb2d5TWFwID09IE5VTEwpCiAJewogCQlyZXR1cm4gR1RfTk9UX0lOSVRJQUxJWkVEOwogCX0KIAotCWRkcjNUaXBCYzJHZXRJbnRlcmZhY2VNYXAoKEdUX1U4KWRldk51bSk7CisgICAgZGRyM1RpcEJjMkdldEludGVyZmFjZU1hcCgoR1RfVTgpZGV2TnVtKTsKIAogI2lmZGVmIFNUQVRJQ19BTEdPX1NVUFBPUlQKIAlNVl9IV1NfVElQX1NUQVRJQ19DT05GSUdfSU5GTyBzdGF0aWNDb25maWc7CiAKLSAgICBHVF9VMzIgYm9hcmRPZmZzZXQgPSBib2FyZElkICogQkMyX05VTUJFUl9PRl9JTlRFUkZBQ0VTICp0b3BvbG9neU1hcC0+bnVtT2ZCdXNQZXJJbnRlcmZhY2U7CisgICAgR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIEJDMl9OVU1CRVJfT0ZfSU5URVJGQUNFUyAqIEJDMl9OVU1CRVJfT0ZfUFVQOwogCiAgICAgc3RhdGljQ29uZmlnLnNpbGljb25EZWxheSA9IGJjMlNpbGljb25EZWxheU9mZnNldFtib2FyZElkXTsKICAgICBzdGF0aWNDb25maWcucGFja2FnZVRyYWNlQXJyID0gYmMyUGFja2FnZVJvdW5kVHJpcERlbGF5QXJyYXk7CkBAIC03NzEsNTcgKzc3MCw4MCBAQAogICAgIGNvbmZpZ0Z1bmMudGlwU2V0RnJlcURpdmlkZXJGdW5jID0gZGRyM1RpcEJjMlNldERpdmlkZXI7CiAgICAgY29uZmlnRnVuYy50aXBHZXREZXZpY2VJbmZvRnVuYyA9IGRkcjNUaXBCYzJHZXREZXZpY2VJbmZvOwogCWNvbmZpZ0Z1bmMudGlwR2V0VGVtcGVyYXR1cmUgPSBOVUxMOworCWNvbmZpZ0Z1bmMudGlwR2V0Q2xvY2tSYXRpbyA9IGRkcjNUaXBDbG9ja01vZGU7CisKKyAgICBjb25maWdGdW5jLnRpcEV4dGVybmFsUmVhZCAgPSBkZHIzVGlwQkMyRXh0UmVhZDsKKyAgICBjb25maWdGdW5jLnRpcEV4dGVybmFsV3JpdGUgPSBkZHIzVGlwQkMyRXh0V3JpdGU7CiAKICAgICBtdkh3c0RkcjNUaXBJbml0Q29uZmlnRnVuYyhkZXZOdW0sICZjb25maWdGdW5jKTsKIAogCS8qIHJlZ2lzdGVyIGJpdCBtYXBwaW5nIChmb3IgUEJTKSAqLwogCWRkcjNUaXBSZWdpc3RlckRxVGFibGUoZGV2TnVtLCBiYzJEUWJpdE1hcDJQaHlwaW4pOwogCi0jaWYgZGVmaW5lZChDSFhfRkFNSUxZKSB8fCBkZWZpbmVkKEVYTVhQTV9GQU1JTFkpCi0JCS8qIGZvciBUTSBpbnRlcmZhY2UsIHNpbmNlIERGUyBmbG93IGlzIGRpZmZlcmVudCBmcm9tIE1TWVMgREZTICh3aGljaCBpcyBub3QKLQkJICAgZnVuY3Rpb25hbCkgREZTIGlzIGluY2x1ZGVkIGluIHRoZSBmbG93ICovCisJLypTZXQgZGV2aWNlIGF0dHJpYnV0ZXMqLworCWRkcjNUaXBEZXZBdHRySW5pdChkZXZOdW0pOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWLCBNVl9USVBfUkVWXzIpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9QSFlfRURHRSwgTVZfRERSX1BIWV9FREdFX05FR0FUSVZFKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSwgQkMyX05VTUJFUl9PRl9QVVApOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9JTlRFUkxFQVZFX1dBLCBHVF9GQUxTRSk7CiAKLQkJICAgLyogVEJEIC0gbmVlZCB0byBhZGQgUEJTIChQQlNfUlhfTUFTS19CSVQgfCBQQlNfVFhfTUFTS19CSVQpICovCiAJbWFza1R1bmVGdW5jID0gKCBJTklUX0NPTlRST0xMRVJfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgU0VUX01FRElVTV9GUkVRX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIExPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIFJFQURfTEVWRUxJTkdfTUFTS19CSVQgfAotCQkJCQkgUEJTX1JYX01BU0tfQklUIHwKLQkJCQkJIFBCU19UWF9NQVNLX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICBQQlNfUlhfTUFTS19CSVQgfAorICAgICAgICAgICAgICAgICAgICAgUEJTX1RYX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIFNFVF9UQVJHRVRfRlJFUV9NQVNLX0JJVCB8CiAgICAgICAgICAgICAgICAgICAgICBXUklURV9MRVZFTElOR19URl9NQVNLX0JJVCB8CiAgICAgICAgICAgICAgICAgICAgICBSRUFEX0xFVkVMSU5HX1RGX01BU0tfQklUIHwKICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX0xFVkVMSU5HX1NVUFBfVEZfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQgfAogICAgICAgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQpOwotI2Vsc2UKLQltYXNrVHVuZUZ1bmMgPSAoIElOSVRfQ09OVFJPTExFUl9NQVNLX0JJVCB8Ci0gICAgICAgICAgICAgICAgICAgICBXUklURV9MRVZFTElOR19NQVNLX0JJVCB8Ci0gICAgICAgICAgICAgICAgICAgICBMT0FEX1BBVFRFUk5fMl9NQVNLX0JJVCB8Ci0gICAgICAgICAgICAgICAgICAgICBSRUFEX0xFVkVMSU5HX01BU0tfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgIENFTlRSQUxJWkFUSU9OX1JYX01BU0tfQklUIHwKLSAgICAgICAgICAgICAgICAgICAgIENFTlRSQUxJWkFUSU9OX1RYX01BU0tfQklUKTsKLSNlbmRpZgogCisJLypTa2lwIG1pZCBmcmVxIHN0YWdlcyBmb3IgNDAwTWh6IEREUiBzcGVlZCovCisJaWYoICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ZpcnN0QWN0aXZlSWZdLm1lbW9yeUZyZXEgPT0gRERSX0ZSRVFfNDAwKSApeworCQltYXNrVHVuZUZ1bmMgPSAoSU5JVF9DT05UUk9MTEVSX01BU0tfQklUIHwKKwkJICAgICAgICAgICAgICAgIFdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKKwkJICAgICAgICAgICAgICAgIExPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKKwkJICAgICAgICAgICAgICAgIFJFQURfTEVWRUxJTkdfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQpOworCX0KKworICAgIGlmKCBja0RlbGF5ID09IE1WX1BBUkFNU19VTkRFRklORUQgKQorICAgICAgICBja0RlbGF5ID0gMTUwOworICAgIGRlbGF5RW5hYmxlID0gMTsKKyAgICBjYURlbGF5ID0gMDsKKworICAgIC8qIHVwZGF0ZSBER0wgcGFyYW1ldGVycyAqLworICAgIHR1bmVQYXJhbXMuY2tEZWxheSA9IGNrRGVsYXk7CisgICAgdHVuZVBhcmFtcy5QaHlSZWczVmFsID0gMHhBOworICAgIHR1bmVQYXJhbXMuZ1J0dE5vbSA9IDB4NDQ7CisgICAgdHVuZVBhcmFtcy5nRGljID0gMHgyOworICAgIHR1bmVQYXJhbXMudWlPRFRDb25maWcgPSAweDEyMDAxMjsKKyAgICB0dW5lUGFyYW1zLmdacHJpRGF0YSA9IDEyMzsKKyAgICB0dW5lUGFyYW1zLmdabnJpRGF0YSA9IDEyMzsKKyAgICB0dW5lUGFyYW1zLmdacHJpQ3RybCA9IDc0OworICAgIHR1bmVQYXJhbXMuZ1pucmlDdHJsID0gNzQ7CisgICAgdHVuZVBhcmFtcy5nWnBvZHREYXRhID0gNDU7CisgICAgdHVuZVBhcmFtcy5nWm5vZHREYXRhID0gNDU7CisgICAgdHVuZVBhcmFtcy5nWnBvZHRDdHJsID0gNDU7CisgICAgdHVuZVBhcmFtcy5nWm5vZHRDdHJsID0gNDU7CisgICAgdHVuZVBhcmFtcy5nUnR0V1IgPSAweDIwMDsKKworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwVHVuZVRyYWluaW5nUGFyYW1zKGRldk51bSwgJnR1bmVQYXJhbXMpKTsKKworICAgIC8qIGZyZXF1ZW5jeSBhbmQgZ2VuZXJhbCBwYXJhbWV0ZXJzICovCiAgICAgZGRyM1RpcEJjMkdldE1lZGl1bUZyZXEoZGV2TnVtLCBmaXJzdEFjdGl2ZUlmLCAmbWVkaXVtRnJlcSk7CiAgICAgaW5pdEZyZXEgPSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ZpcnN0QWN0aXZlSWZdLm1lbW9yeUZyZXE7Ci0gICAgZGZzTG93RnJlcSA9IDEwMDsKKyAgICBmcmVxVmFsW0REUl9GUkVRX0xPV19GUkVRXSA9IGRmc0xvd0ZyZXEgPSAxMDA7CiAgICAgZGZzTG93UGh5MSA9IFBoeVJlZzFWYWw7CiAgICAgaXNQbGxCZWZvcmVJbml0ID0gMDsKLSAgICBybFZlcnNpb24gPSAxOyAvKiBuZXcgUkwgbWFjaGluZSAqLwogICAgIHVzZUJyb2FkY2FzdCA9IEdUX0ZBTFNFOyAvKiBtdWx0aWNhc3QgKi8KICAgICBpc0NiZVJlcXVpcmVkID0gR1RfVFJVRTsKIAljYWxpYnJhdGlvblVwZGF0ZUNvbnRyb2wgPSAyOwogCi0JLyogRGVsYXkgUGFyYW0gKi8KLQlpZiggY2tEZWxheSA9PSAtMSApCi0JCWNrRGVsYXkgPSAxNTA7Ci0JaWYoIGNrRGVsYXlfMTYgPT0gLTEgKQotCQlja0RlbGF5XzE2ID0gMTUwOwotCWRlbGF5RW5hYmxlID0gMTsKLQljYURlbGF5ID0gMDsKLQogICAgIHJldHVybiBHVF9PSzsKIH0KIApAQCAtOTMwLDcgKzk1Miw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFhTQiBFeHRlcm5hbCByZWFkCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9TVEFUVVMgICAgZGRyM1RpcEV4dFJlYWQKK0dUX1NUQVRVUyAgICBkZHIzVGlwQkMyRXh0UmVhZAogKAogICAgIEdUX1UzMiAgICAgIGRldk51bSwKICAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKQEAgLTk5NSw3ICsxMDE3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogWFNCIEV4dGVybmFsIHdyaXRlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9TVEFUVVMgICAgZGRyM1RpcEV4dFdyaXRlCitHVF9TVEFUVVMgICAgZGRyM1RpcEJDMkV4dFdyaXRlCiAoCiAgICAgR1RfVTMyICAgICAgZGV2TnVtLAogICAgIEdUX1UzMiAgICAgIGludGVyZmFjZUlkLApAQCAtMTEwOCw2ICsxMTMwLDE3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcmV0dXJuIDEgb2YgY29yZS9EVU5JVCBjbG9jayByYXRpb24gaXMgMSBmb3IgZ2l2ZW4gZnJlcSwgMCBpZiBjbG9jayByYXRpb3MgaXMgMjoxCisqLworc3RhdGljIEdUX1U4ICAgIGRkcjNUaXBDbG9ja01vZGUoR1RfVTMyIGZyZXF1ZW5jeSkKK3sKKyAgICBmcmVxdWVuY3kgPSBmcmVxdWVuY3k7IC8qIGF2b2lkIHdhcm5pbmdzICovCisKKyAgICByZXR1cm4gMjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE5hbWU6ICAgICBkZHIzVGlwVG1TZXREaXZpZGVyLgogKiBEZXNjOiAgICAgUGxsIERpdmlkZXIgb2YgVGhlIFRyYWZpYyBNYW5hZ2VyIFVuaXQKICogQXJnczoKQEAgLTEyMzAsMTAgKzEyNjMsMTIgQEAKICAgICBzd2l0Y2ggKGRpdmlkZXIpCiAgICAgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB3cml0ZURhdGEgPSAweDI7CisJCQkvKk5vdCA4MDAgaXMgYSA2Njcgb25seSovCisgICAgICAgICAgICB3cml0ZURhdGEgPSAoc2FyRnJlcT09RERSX0ZSRVFfODAwKT8oMHgyKTooMHgxKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB3cml0ZURhdGEgPSAweDM7CisJCQkvKk5vdCA4MDAgaXMgYSA2Njcgb25seSovCisgICAgICAgICAgICB3cml0ZURhdGEgPSAoc2FyRnJlcT09RERSX0ZSRVFfODAwKT8oMHgzKTooMHgyKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgiRXJyb3I6IFdyb25nIGRpdmlkZXIgJWRcbiIsIGRpdmlkZXIpKTsKQEAgLTEzNzUsNyArMTQxMCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIFRNIGludGVyZmFjZSBmcmVxdWVuY3kgR2V0CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1HVF9TVEFUVVMgZGRyM1RpcFRtR2V0SW5pdEZyZXEKK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFRtR2V0SW5pdEZyZXEKICgKIAlHVF9TVEFUVVMgICAgICAgZGV2TnVtLAogCU1WX0hXU19ERFJfRlJFUSAqZnJlcQpAQCAtMTQ4NCw2ICsxNTE5LDExIEBACiAKICAgICBzd2l0Y2goc2FyRnJlcSkKICAgICB7CisgICAgICAgIGNhc2UgRERSX0ZSRVFfNDAwOgorCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIk5vIG1lZGl1bSBmcmVxIHN1cHBvcnRlZCBmb3IgNDAwTWh6XG4iKSk7CisgICAgICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgRERSX0ZSRVFfNjY3OgogCQkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIk1lZGl1bSBERFJfRlJFUV8zMzNcbiIpKTsKICAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfMzMzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM0JvYksuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNCb2JLLmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWRjMWQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNCb2JLLmMKQEAgLTAsMCArMSwxNjQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwMSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyogVGhpcyBjb2RlIGNvbnRhaW5zIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBvZiBNYXJ2ZWxsIHNlbWljb25kdWN0b3IsIGluYy4KKyogbm8gcmlnaHRzIGFyZSBncmFudGVkIGhlcmVpbiB1bmRlciBhbnkgcGF0ZW50LCBtYXNrIHdvcmsgcmlnaHQgb3IgY29weXJpZ2h0CisqIG9mIE1hcnZlbGwgb3IgYW55IHRoaXJkIHBhcnR5LgorKiBNYXJ2ZWxsIHJlc2VydmVzIHRoZSByaWdodCBhdCBpdHMgc29sZSBkaXNjcmV0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGlzIGNvZGUKKyogYmUgaW1tZWRpYXRlbHkgcmV0dXJuZWQgdG8gTWFydmVsbC4gVGhpcyBjb2RlIGlzIHByb3ZpZGVkICJhcyBpcyIuCisqIE1hcnZlbGwgbWFrZXMgbm8gd2FycmFudGllcywgZXhwcmVzcywgaW1wbGllZCBvciBvdGhlcndpc2UsIHJlZ2FyZGluZyBpdHMKKyogYWNjdXJhY3ksIGNvbXBsZXRlbmVzcyBvciBwZXJmb3JtYW5jZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIG12SHdzRGRyM0JvYksuYworKgorKiBERVNDUklQVElPTjogRERSMyBCb2JLIGNvbmZpZ3VyYXRpb24KKyoKKyogREVQRU5ERU5DSUVTOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERFRklORV9HTE9CQUxTCisKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwU3RhdGljLmgiCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcEZsb3cuaCIKKyNpbmNsdWRlICJtdkRkclRyYWluaW5nSXBEYi5oIgorI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXAuaCIKKyNpbmNsdWRlICJtdkRkcjNUcmFpbmluZ0lwRGVmLmgiCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcFBydklmLmgiCisjaW5jbHVkZSAibXZEZHIzTG9nZ2luZ0RlZi5oIgorI2luY2x1ZGUgIm12SHdzRGRyM0JvYksuaCIKKyNpZiAhZGVmaW5lZChDUFNTX0JVSUxEKQorI2luY2x1ZGUgImRkcjNfbXN5c19ib2JrLmgiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQk9CS19OVU1fQllURVMgICAgICAgICAgICAgICAgICAgKDMpCisKKyNkZWZpbmUgQk9CS19DTElFTlRfRklFTEQoY2xpZW50KQkJKGNsaWVudCA8PCAxNSkKKyNkZWZpbmUgQk9CS19HRVRfQ0xJRU5UX0ZJRUxEKGludGVyZmFjZUFjY2VzcyxpbnRlcmZhY2VJZCkgKChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKSA/IEJPQktfQ0xJRU5UX0ZJRUxEKE1VTFRJQ0FTVF9JRCk6Qk9CS19DTElFTlRfRklFTEQoaW50ZXJmYWNlSWQpKQorI2RlZmluZSBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBpbnRlcmZhY2VBY2Nlc3MsIHJlZ2FkZHIpICAgKHJlZ2FkZHIrIFhTQl9CQVNFX0FERFIgKyBCT0JLX0dFVF9DTElFTlRfRklFTEQoaW50ZXJmYWNlQWNjZXNzLGludGVyZmFjZU1hcFtpbnRlcmZhY2VJZF0uY2xpZW50KSkKKworI2lmIGRlZmluZWQoQ1BTU19CVUlMRCkKKworI2RlZmluZSBSRUdfREVWSUNFX1NBUjBfQUREUiAgICAgICAgICAgICAgICAgICAgICAgIDB4RjgyMDAKKyNkZWZpbmUgUkVHX0RFVklDRV9TQVIxX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAweEY4MjA0CisjZGVmaW5lIFJFR19ERVZJQ0VfU0FSMV9PVkVSUklERV9BRERSICAgICAgICAgICAgICAgMHhGODJEOAorI2RlZmluZSBQTEwwX0NORklHX09GRlNFVCAgICAgICAgIAkJCQkJMjEKKyNkZWZpbmUgUExMMF9DTkZJR19NQVNLICAgICAgICAgICAJCQkJCTB4NworI2RlZmluZSBQTEwxX0NORklHX09GRlNFVCAgICAgICAgIAkJCQkJMTgKKyNkZWZpbmUgUExMMV9DTkZJR19NQVNLICAgICAgICAgICAJCQkJCTB4NworCisjZGVmaW5lIENTX0NCRV9WQUxVRShjc051bSkgICAoY3NDYmVSZWdbY3NOdW1dKQorI2VuZGlmCisKKyNkZWZpbmUgQk9CS19DTElFTlRfTUFQUElORyhpbnRlcmZhY2VJZCwgcmVnYWRkcikgKChyZWdhZGRyIDw8IDIpKyBDTElFTlRfQkFTRV9BRERSICsgQk9CS19DTElFTlRfRklFTEQoaW50ZXJmYWNlTWFwW2ludGVyZmFjZUlkXS5jbGllbnQpKQorCisjZGVmaW5lIFRNX1BMTF9SRUdfREFUQShhLGIsYykgICgoYSA8PCAxMikgKyAoYiA8PCA4KSArIChjIDw8IDIpKQorI2RlZmluZSBSX01PRF9XKHdyaXRlRGF0YSxyZWFkRGF0YSxtYXNrKSAoKHdyaXRlRGF0YSAmIG1hc2spIHwgKHJlYWREYXRhICYgKH5tYXNrKSkpCisKKyNkZWZpbmUgQ0VUVVNfREVWX0lEICAgMHhCRTAwCisjZGVmaW5lIENBRUxVTV9ERVZfSUQgIDB4QkMwMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJlLWRlY2xhcmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQm9iS0dldE1lZGl1bUZyZXEKKygKKyAgICBHVF9VMzIgICAgICAgICAgZGV2TnVtLAorCUdUX1UzMgkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQorKTsKKworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLRXh0UmVhZAorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICpkYXRhCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktFeHRXcml0ZQorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICpkYXRhCispOworCitHVF9TVEFUVVMgZGRyM1RpcEJvYktTZXREaXZpZGVyCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorCUdUX1UzMiAgICAgICAgICAgICAgICAJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEgICAgICAgICAgICAgICAgIGZyZXEKKyk7CisKK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFRtU2V0RGl2aWRlcgorKAorCUdUX1U4CQkJCQkJCWRldk51bSwKKwlHVF9VMzIgICAgICAgICAgICAgICAgCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRICAgICAgICAgICAgICAgICBmcmVxdWVuY3kKKyk7CisKK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcENwdVNldERpdmlkZXIKKygKKwlHVF9VOAkJCQkJCQlkZXZOdW0sCisJR1RfVTMyICAgICAgICAgICAgICAgIAkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcXVlbmN5CispOworCitHVF9TVEFUVVMgZGRyM0JvYktVcGRhdGVUb3BvbG9neU1hcAorKAorICAgIEdUX1UzMiBkZXZOdW0sCisgICAgTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXAKKyk7CisKK0dUX1NUQVRVUyBkZHIzVGlwQm9iS0dldEluaXRGcmVxCisoCisgICAgR1RfVTggICAgICAgCWRldk51bSwKKwlHVF9VMzIJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEqIGZyZXEKKyk7CisKK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFRtR2V0SW5pdEZyZXEKKygKKyAgICBHVF9TVEFUVVMgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQorKTsKKworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQ3B1R2V0SW5pdEZyZXEKKygKKyAgICBHVF9TVEFUVVMgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQorKTsKKworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLUmVhZAorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICpkYXRhLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktXcml0ZQorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKTsKK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0lGUmVhZAorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICpkYXRhLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktJRldyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispOworCitHVF9TVEFUVVMgZGRyM1RpcEJvYktJc2ZBY2Nlc3NEb25lCisoCisgICAgR1RfVTMyIGRldk51bSwKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQKKyk7CisKK0dUX1NUQVRVUyBkZHIzVGlwQm9iS0dldERldmljZUluZm8KKygKKwlHVF9VOCAgICAgIGRldk51bSwKKwlNVl9ERFIzX0RFVklDRV9JTkZPICogaW5mb1B0cgorKTsKKworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLVE1Xcml0ZQorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBHbG9iYWxzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIEdUX1UzMiBtYXNrVHVuZUZ1bmM7CitleHRlcm4gR1RfVTMyIGZyZXFWYWxbXTsKK2V4dGVybiBNVl9IV1NfRERSX0ZSRVEgbWVkaXVtRnJlcTsKK2V4dGVybiBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcDsKK2V4dGVybiBHVF9VMzIgZmlyc3RBY3RpdmVJZjsKK2V4dGVybiBNVl9IV1NfRERSX0ZSRVEgaW5pdEZyZXE7CitleHRlcm4gR1RfVTMyIGRmc0xvd0ZyZXE7CitleHRlcm4gR1RfVTMyIGRmc0xvd1BoeTE7CitleHRlcm4gR1RfVTMyICBQaHlSZWcxVmFsOworZXh0ZXJuIEdUX1UzMiBpc1BsbEJlZm9yZUluaXQ7CitleHRlcm4gR1RfVTMyIHVzZUJyb2FkY2FzdDsKK2V4dGVybiBHVF9VMzIgaXNDYmVSZXF1aXJlZDsKK2V4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksY2FEZWxheTsKK2V4dGVybiBHVF9VOCBkZWJ1Z1RyYWluaW5nQWNjZXNzOworZXh0ZXJuIEdUX1U4IGNhbGlicmF0aW9uVXBkYXRlQ29udHJvbDsgLyoyIGV4dGVybmFsIG9ubHksIDEgaXMgaW50ZXJuYWwgb25seSovCitleHRlcm4gR1RfVTMyIGRmc0xvd0ZyZXE7CisKK0dUX1UzMiBkZWJ1Z0JvYksgPSAwOworR1RfVTMyICBwaXBlTXVsdGljYXN0TWFzazsKKworI2lmIGRlZmluZWQoQ1BTU19CVUlMRCkKK3N0YXRpYyBHVF9VMzIgY3NDYmVSZWdbXT0KK3sKKyAgICAweEUgLCAweEQsIDB4QiwgMHg3LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitHVF9VMzIgZGV2SWQsIGh3RGRySWZNYXNrLCBod01heERkcklmTnVtOworCitzdGF0aWMgTVZfREZYX0FDQ0VTUyBpbnRlcmZhY2VNYXBbXSA9Cit7CisJLyogUGlwZQlDbGllbnQqLworCXsgICAwLAkgMTYgfSwKKwl7ICAgMywJIDE4CX0sCisJeyAgIDEsCSAxMCB9LAorCXsgICAzLAkgMQl9LAorICAgIHsgICAwLAkgMAl9IC8qIGluIEJPQksgaW50ZXJmYWNlIDQgZG9lc24ndCBiZWxvbmcgdG8gVE0qLworfTsKKyNlbmRpZgorc3RhdGljIEdUX1U4IGJvYktCd1BlckZyZXFbRERSX0ZSRVFfTElNSVRdID0KK3sKKyAgICAweDMsIC8qRERSX0ZSRVFfTE9XX0ZSRVEqLworICAgIDB4NCwgLypERFJfRlJFUV80MDAqLworICAgIDB4NCwgLypERFJfRlJFUV81MzMqLworICAgIDB4NSwgLypERFJfRlJFUV82NjcqLworICAgIDB4NSwgLypERFJfRlJFUV84MDAqLworICAgIDB4NSwgLypERFJfRlJFUV85MzMsKi8KKyAgICAweDUsIC8qRERSX0ZSRVFfMTA2NiovCisgICAgMHgzLCAvKkREUl9GUkVRXzMxMSovCisgICAgMHgzLCAvKkREUl9GUkVRXzMzMyovCisgICAgMHg0LCAgLypERFJfRlJFUV80NjcqLworICAgIDB4NSwgLypERFJfRlJFUV84NTAqLworICAgIDB4NSwgIC8qRERSX0ZSRVFfNjAwKi8KKyAgICAweDMsICAvKkREUl9GUkVRXzMwMCovCisJMHg1LCAvKkREUl9GUkVRXzkwMCovCisJMHgzIC8qRERSX0ZSRVFfMzYwKi8KK307CisKK3N0YXRpYyBHVF9VOCBib2JLUmF0ZVBlckZyZXFbRERSX0ZSRVFfTElNSVRdID0KK3sKKyAgIDB4MSwgLypERFJfRlJFUV9MT1dfRlJFUSwqLworICAgMHgyLCAvKkREUl9GUkVRXzQwMCwqLworICAgMHgyLCAvKkREUl9GUkVRXzUzMywqLworICAgMHgyLCAvKkREUl9GUkVRXzY2NywqLworICAgMHgyLCAvKkREUl9GUkVRXzgwMCwqLworICAgMHgzLCAvKkREUl9GUkVRXzkzMywqLworICAgMHgzLCAvKkREUl9GUkVRXzEwNjYsKi8KKyAgIDB4MSwgLypERFJfRlJFUV8zMTEqLworICAgMHgxLCAvKkREUl9GUkVRXzMzMyovCisgICAweDIsIC8qRERSX0ZSRVFfNDY3Ki8KKyAgIDB4MiwgLypERFJfRlJFUV84NTAqLworICAgMHgyLCAvKkREUl9GUkVRXzYwMCovCisgICAweDEsIC8qRERSX0ZSRVFfMzAwKi8KKyAgIDB4MywgIC8qRERSX0ZSRVFfOTAwKi8KKyAgIDB4MSAgLypERFJfRlJFUV8zNjAqLworfTsKKworLyogQml0IG1hcHBpbmcgKGZvciBQQlMpICovCitHVF9VMzIgYm9iS0RRYml0TWFwMlBoeXBpbltdID0KK3sKKy8qI3dhcm5pbmcgIkRRIG1hcHBpbmcgaXMgdXBkYXRlZCBmb3IgSW50ZXJmYWNlIDAgYW5kIDQgb25seSEiICEhISovCisJICAgIC8qIEludGVyZmFjZSAwICovCisgICAgICAgIDIsMCwzLDksNyw4LDYsMSAsIC8qIGRxWzA6N10gICAqLworICAgICAgICAzLDIsMSw2LDAsOSw3LDggLCAvKiBkcVs4OjE1XSAgKi8KKyAgICAgICAgOSw2LDMsMiwxLDcsMCw4ICwgLyogZHFbMTY6MjNdICovCisgICAgICAgIDMsMSw3LDIsMCw4LDksNiAsIC8qIGRxWzI0OjMxXSAqLworICAgICAgICAwLDAsMCwwLDAsMCwwLDAgLCAvKiBkcVtFQ0NdICAgKi8KKworCSAgICAvKiBJbnRlcmZhY2UgMSAqLworCSAgICA5LDAsNywyLDgsNiwzLDEgLCAvKiBkcVswOjddICAgKi8KKwkgICAgOSwwLDEsNiw4LDMsMiw3ICwgLyogZHFbODoxNV0gICovCisJICAgIDAsNywxLDksNiwyLDMsOCAsIC8qIGRxWzE2OjIzXSAqLworCSAgICA5LDAsOCwzLDcsNiwyLDEgLCAvKiBkcVsyNDozMV0gKi8KKyAgICAgICAgMCwwLDAsMCwwLDAsMCwwICwgLyogZHFbRUNDXSAgICovCisKKwkgICAgLyogSW50ZXJmYWNlIDIgKi8KKwkgICAgMCwwLDAsMCwwLDAsMCwwICwgLyogZHFbMDo3XSAgICovCisJICAgIDAsMCwwLDAsMCwwLDAsMCAsIC8qIGRxWzg6MTVdICAqLworCSAgICAwLDAsMCwwLDAsMCwwLDAgLCAvKiBkcVsxNjoyM10gKi8KKwkgICAgMCwwLDAsMCwwLDAsMCwwICwgLyogZHFbMjQ6MzFdICovCisgICAgICAgIDAsMCwwLDAsMCwwLDAsMCAsIC8qIGRxW0VDQ10gICAqLworCisJICAgIC8qIEludGVyZmFjZSAzICovCisJICAgIDYsMiw4LDksMCwxLDcsMyAsIC8qIGRxWzA6N10gICAqLworCSAgICAxLDMsNyw5LDAsMiw4LDYgLCAvKiBkcVs4OjE1XSAgKi8KKwkgICAgMiwwLDcsMSw4LDksNiwzICwgLyogZHFbMTY6MjNdICovCisJICAgIDEsNiw4LDIsMCw3LDMsOSAsIC8qIGRxWzI0OjMxXSAqLworICAgICAgICAwLDAsMCwwLDAsMCwwLDAgLCAvKiBkcVtFQ0NdICAgKi8KKworICAgICAgICAvKiBJbnRlcmZhY2UgNCAqLworCSAgICAxLDksOCwzLDAsNywyLDYgLCAvKiBkcVswOjddICAgKi8KKwkgICAgMywyLDgsMSw5LDYsNywwICwgLyogZHFbODoxNV0gICovCisJICAgIDAsNiwyLDEsOSwzLDgsNyAsIC8qIGRxWzE2OjIzXSAqLworCSAgICAwLDYsMSw4LDMsOSw3LDIgLCAvKiBkcVsyNDozMV0gKi8KKyAgICAgICAgMCwxLDIsMyw2LDcsOCw5ICAgLyogZHFbRUNDXSAgICovCit9OworCisjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorCitNVl9IV1NfVE9QT0xPR1lfTUFQIGJvYktUb3BvbG9neU1hcFtdID0KK3sKKyAgICAvKiAxc3QgYm9hcmQgIC0gQ0VUVVMqLworICAgIHsKKyAgICAweDEsIC8qIGFjdGl2ZSBpbnRlcmZhY2VzICovCisgICAgLypjc19tYXNrLCBtaXJyb3IsIGRxc19zd2FwLCBja19zd2FwIFggUFVQcyAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZF9iaW4gICAgICAgICAgIG1lbW9yeV93aWR0aCAgbWVtX3NpemUgIGZyZXF1ZW5jeSAgY2FzTCBjYXNXTCAgICAgIHRlbXBlcmF0dXJlICovCisgeyAge3t7MHgxLDAsMCwwfSwgezB4MSwwLDAsMH0sIHsweDIsMSwwLDB9LCB7MHgyLDEsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSAsCisgICAge3t7MHgxLDEsMCwwfSwgezB4MSwxLDAsMH0sIHsweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezAsMCwwLDB9fSwgU1BFRURfQklOX0REUl8xODY2TSwgQlVTX1dJRFRIXzE2ICwgTUVNXzRHLCBERFJfRlJFUV82NjcsIDAgLCAgIDAgLCBNVl9IV1NfVEVNUF9ISUdIfSB9LAorICAgIDB4RiAgLyogQnVzZXMgbWFzayAqLworICAgIH0sCisgICAgLyogMm5kIGJvYXJkICAtIENhZWx1bSovCisgICAgeworICAgIDB4QiwgLyogYWN0aXZlIGludGVyZmFjZXMgKi8KKyAgICAvKmNzX21hc2ssIG1pcnJvciwgZHFzX3N3YXAsIGNrX3N3YXAgWCBQVVBzICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVkX2JpbiAgICAgICAgICAgbWVtb3J5X3dpZHRoICBtZW1fc2l6ZSAgZnJlcXVlbmN5ICBjYXNMIGNhc1dMICAgICAgdGVtcGVyYXR1cmUgKi8KKyB7ICB7e3sweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDIsMCwwLDB9LCB7MHgyLDAsMCwwfSwgezB4MSwxLDAsMH0sIHsweDEsMSwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9ICwKKyAgICB7e3sweDEsMSwwLDB9LCB7MHgxLDEsMCwwfSwgezB4MiwwLDAsMH0sIHsweDIsMCwwLDB9LCB7MCwwLDAsMH19LCBTUEVFRF9CSU5fRERSXzE4NjZNLCBCVVNfV0lEVEhfMTYgLCBNRU1fNEcsIEREUl9GUkVRXzY2NywgMCAsICAgMCAsIE1WX0hXU19URU1QX0hJR0h9IH0sCisgICAgMHhGICAvKiBCdXNlcyBtYXNrICovCisgICAgfQorfTsKKyNlbmRpZgorCitzdGF0aWMgR1RfVTggICAgZGRyM1RpcENsb2NrTW9kZSggR1RfVTMyIGZyZXF1ZW5jeSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogU2VydmVyIEFjY2VzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9TVEFUVVMgZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZQorKAorCUdUX1UzMiBkZXZOdW0sCisJR1RfVTMyIHJlZ0FkZHIsCisJR1RfVTMyIGRhdGFWYWx1ZQorKQoreworI2lmZGVmIEFTSUNfU0lNVUxBVElPTgorICAgIC8qIGF2b2lkIHdhcm5pbmdzICovCisgICAgZGV2TnVtID0gZGV2TnVtOworICAgIHJlZ0FkZHIgPSByZWdBZGRyOworICAgIGRhdGFWYWx1ZSA9IGRhdGFWYWx1ZTsKKworCXJldHVybiBHVF9PSzsKKyNlbHNlCisJcmV0dXJuIGh3c1NlcnZlclJlZ1NldEZ1bmNQdHIoZGV2TnVtLCByZWdBZGRyLCBkYXRhVmFsdWUpOworI2VuZGlmCit9CisKK0dUX1NUQVRVUyBkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQKKygKKwlHVF9VMzIgZGV2TnVtLAorCUdUX1UzMiByZWdBZGRyLAorCUdUX1UzMiAqZGF0YVZhbHVlLAorCUdUX1UzMiByZWdNYXNrCispCit7CisjaWZkZWYgQVNJQ19TSU1VTEFUSU9OCisgICAgLyogYXZvaWQgd2FybmluZ3MgKi8KKyAgICBkZXZOdW0gPSBkZXZOdW07CisgICAgcmVnQWRkciA9IHJlZ0FkZHI7CisgICAgcmVnTWFzayA9IHJlZ01hc2s7CisKKwkqZGF0YVZhbHVlID0gMDsKKyNlbHNlCisJaHdzU2VydmVyUmVnR2V0RnVuY1B0cihkZXZOdW0sIHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisKKworCSpkYXRhVmFsdWUgID0gKmRhdGFWYWx1ZSAmIHJlZ01hc2s7CisjZW5kaWYKKwlyZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHVF9TVEFUVVMgZGRyM1RpcEJvYktHZXRGcmVxQ29uZmlnCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcSwKKwlNVl9IV1NfVElQX0ZSRVFfQ09ORklHX0lORk8JCSpmcmVxQ29uZmlnSW5mbworKQoreworICAgIGRldk51bSA9IGRldk51bTsgLyogYXZvaWQgd2FybmluZ3MgKi8KKworICAgIGlmIChib2JLQndQZXJGcmVxW2ZyZXFdID09IDB4ZmYpCisgICAgeworICAgICAgICByZXR1cm4gR1RfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBpZiAoZnJlcUNvbmZpZ0luZm8gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CisgICAgfQorCisgICAgZnJlcUNvbmZpZ0luZm8tPmJ3UGVyRnJlcSA9IGJvYktCd1BlckZyZXFbZnJlcV07CisgICAgZnJlcUNvbmZpZ0luZm8tPnJhdGVQZXJGcmVxID0gYm9iS1JhdGVQZXJGcmVxW2ZyZXFdOworCisgICAgZnJlcUNvbmZpZ0luZm8tPmlzU3VwcG9ydGVkID0gR1RfVFJVRTsKKworICAgIHJldHVybiBHVF9PSzsKK30KKyNpZiBkZWZpbmVkKENQU1NfQlVJTEQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0VuYWJsZSBQaXBlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgR1RfU1RBVFVTICAgIGRkcjNUaXBQaXBlRW5hYmxlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9CT09MICAgICAgICAgICAgICAgZW5hYmxlCispCit7CisgICAgR1RfVTMyIGRhdGFWYWx1ZT0wLCBwaXBlRW5hYmxlTWFzayA9IDA7CisKKworICAgIGlmIChlbmFibGUgPT0gR1RfRkFMU0UpCisgICAgeworICAgICAgICBwaXBlRW5hYmxlTWFzayA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgaWYgKGludGVyZmFjZUFjY2VzcyA9PSBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBpcGVFbmFibGVNYXNrID0gcGlwZU11bHRpY2FzdE1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwaXBlRW5hYmxlTWFzayA9ICgxIDw8IGludGVyZmFjZU1hcFtpbnRlcmZhY2VJZF0ucGlwZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIFBJUEVfRU5BQkxFX0FERFIsICZkYXRhVmFsdWUsIE1BU0tfQUxMX0JJVFMpKTsKKyAgICBkYXRhVmFsdWUgPSAoZGF0YVZhbHVlICYgKH4weEZGKSkgfCBwaXBlRW5hYmxlTWFzazsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIFBJUEVfRU5BQkxFX0FERFIsIGRhdGFWYWx1ZSkpOworICAgIHJldHVybiBHVF9PSzsKK30KKworc3RhdGljIHZvaWQgZGRyM1RpcElzVW5pY2FzdEFjY2VzcyggR1RfVTggZGV2TnVtLEdUX1UzMiogaW50ZXJmYWNlSWQsIE1WX0hXU19BQ0NFU1NfVFlQRSogaW50ZXJmYWNlQWNjZXNzKQoreworCUdUX1UzMiBpbmRleENudCwgdG90YWxDbnQgPSAwICwgaW50ZXJmYWNlVG1wID0gMDsKKyAgICBNVl9IV1NfVE9QT0xPR1lfTUFQICp0b3BvbG9neU1hcCA9IGRkcjNUaXBHZXRUb3BvbG9neU1hcChkZXZOdW0pOworCisJaWYgKCppbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKQorCXsKKwkJZm9yKGluZGV4Q250ID0gMDsgaW5kZXhDbnQgPCBNQVhfSU5URVJGQUNFX05VTTsgaW5kZXhDbnQrKykKKwkJeworCQkJaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGluZGV4Q250KSAhPSAgMCkKKwkJCXsKKwkJCQl0b3RhbENudCsrOworCQkJCWludGVyZmFjZVRtcCA9IGluZGV4Q250OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICh0b3RhbENudCA9PSAxKSB7CisJCQkqaW50ZXJmYWNlQWNjZXNzID0gQUNDRVNTX1RZUEVfVU5JQ0FTVDsKKwkJCSppbnRlcmZhY2VJZCA9IGludGVyZmFjZVRtcDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcEJvYktTZWxlY3RUTURkckNvbnRyb2xsZXIuCisqIERlc2M6ICAgICBFbmFibGUvRGlzYWJsZSBhY2Nlc3MgdG8gTWFydmVsbCdzIHNlcnZlci4KKyogQXJnczogICAgIGRldk51bSAgICAgLSBkZXZpY2UgbnVtYmVyCisqICAgICAgICAgICBlbmFibGUgICAgICAgIC0gd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2VydmVyCisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1NlbGVjdFRNRGRyQ29udHJvbGxlcgorKAorICAgIEdUX1U4ICAgIGRldk51bSwKKyAgICBHVF9CT09MICBlbmFibGUKKykKK3sKKyAgICBHVF9VMzIgaW50ZXJmYWNlSWQgPSAwLCBkYXRhVmFsdWUgPSAwOworI2lmbmRlZiBBU0lDX1NJTVVMQVRJT04KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODI0MCAsICAmZGV2SWQsIE1BU0tfQUxMX0JJVFMpKTsKKyNlbHNlCisgICAgZGV2SWQgPSAweEJDMDA7IC8qIENBRUxVTV9ERVZfSUQgKi8KKyNlbmRpZgorICAgIGlmICgoZGV2SWQgJiAweEZGRkYpID09IENFVFVTX0RFVl9JRCApCisgICAgeworICAgICAgICAvKiBJTiBDZXR1cyBUTSBoYXMgb25seSAxIElGICMwKi8KKyAgICAgICAgaHdNYXhEZHJJZk51bSA9IDE7CisgICAgICAgIGh3RGRySWZNYXNrICAgPSAxOworICAgIH0KKyAgICBlbHNlIGlmICgoZGV2SWQgJjB4RkZGRikgPT0gQ0FFTFVNX0RFVl9JRCApCisgICAgeworICAgICAgICAvKiBpbiBDYWVsdW0gVE0gbWF5IHVzZSAzIElGcyAwLDEsYW5kIDMqLworICAgICAgICBod01heERkcklmTnVtID0gNDsKKyAgICAgICAgaHdEZHJJZk1hc2sgICA9IDB4QjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICAgIG12UHJpbnRmICgiVW5zdXBwb3J0ZWQgZGV2aWNlIElEICV4XG4iLCBkZXZJZCk7CisKKyAgICBmb3IgKGludGVyZmFjZUlkID0gMDsgaW50ZXJmYWNlSWQgPCBod01heERkcklmTnVtOyBpbnRlcmZhY2VJZCsrKQorCXsKKyAgICAgICAgaWYoSVNfSU5URVJGQUNFX0FDVElWRSh0b3BvbG9neU1hcC0+aW50ZXJmYWNlQWN0aXZlTWFzaywgaW50ZXJmYWNlSWQpID09ICAwKS8qIGlmIHRoZSBpbnRlcmZhY2UgZG9lc250IGV4aXhzdCBpbiBIVyA6Ki8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBlbHNlIC8qIGludGVyZmFjZSBleGlzdCBpbiBIVyovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRkcjNUaXBQaXBlRW5hYmxlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEdUX1RSVUUpOworCQkJaWYgKElTX0lOVEVSRkFDRV9BQ1RJVkUodG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssIGludGVyZmFjZUlkKSA9PSAgMCkKKwkJCXsKKwkJCQkgLypkaXNhYmxlIGluLWFjdGl2ZSBpbnRlcmZhY2VzIChzbyB0aGV5IHdvbid0IGJlIGFjY2Vzc2VkIHVwb24gbXVsdGljYXN0KSovCisJCQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIEJPQktfQ0xJRU5UX01BUFBJTkcoaW50ZXJmYWNlSWQsIENMSUVOVF9DVFJMX1JFRyksICZkYXRhVmFsdWUsIE1BU0tfQUxMX0JJVFMpKTsKKwkJCQlkYXRhVmFsdWUgJj0gfjB4NDA7CisJCQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX0NMSUVOVF9NQVBQSU5HKGludGVyZmFjZUlkLCBDTElFTlRfQ1RSTF9SRUcpLCBkYXRhVmFsdWUpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCQkvKiBFbmFibGUgcmVsZXZhbnQgUGlwZSAqLworCQkJcGlwZU11bHRpY2FzdE1hc2sgfD0gKDEgPDwgaW50ZXJmYWNlTWFwW2ludGVyZmFjZUlkXS5waXBlKTsKKwkJCS8qIG11bHRpY2FzdCBNYWNybyBpcyBzdWJzY3JpYmVkIHRvIE11bHRpY2FzdCAweDFEICovCisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgQk9CS19DTElFTlRfTUFQUElORyhpbnRlcmZhY2VJZCwgQ0xJRU5UX0NUUkxfUkVHKSwgJmRhdGFWYWx1ZSwgTUFTS19BTExfQklUUykpOworCQkJZGF0YVZhbHVlIHw9IDB4NDA7CisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfQ0xJRU5UX01BUFBJTkcoaW50ZXJmYWNlSWQsIENMSUVOVF9DVFJMX1JFRyksIGRhdGFWYWx1ZSkpOworCisJCQlkZHIzVGlwUGlwZUVuYWJsZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBHVF9GQUxTRSk7CisKKwkJfQorICAgIH0KKwkJLyogZW5hYmxlIGFjY2VzcyB0byByZWxldmFudCBwaXBlcyAoYWNjb3JkaW5nIHRvIHRoZSBwaXBlIG1hc2spICovCisJZGRyM1RpcFBpcGVFbmFibGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBHVF9UUlVFKTsKKworICAgaWYgKGVuYWJsZSkKKyAgICB7CisgICAgICAgLyogRW5hYmxlIEREUiBUdW5pbmcgKi8KKworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktUTVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgUkVBRF9CVUZGRVJfU0VMRUNUX1JFRywgIDB4ODAwMCwgTUFTS19BTExfQklUUykpOworICAgICAgICAvKiBjb25maWd1cmUgZHVwbGljYXRlIENTICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1RNV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9NVUxUSUNBU1QsIFBBUkFNX05PVF9DQVJFLCBDU19FTkFCTEVfUkVHLCAgMHg0QS8qSGFpbSAweDQyKi8sIE1BU0tfQUxMX0JJVFMpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBERFIgVHVuaW5nIFNlbGVjdCAqLworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktUTVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgQ1NfRU5BQkxFX1JFRywgIDB4MiwgTUFTS19BTExfQklUUykpOworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktUTVdyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfTVVMVElDQVNULCBQQVJBTV9OT1RfQ0FSRSwgUkVBRF9CVUZGRVJfU0VMRUNUX1JFRywgMCxNQVNLX0FMTF9CSVRTKSk7CisgICB9CisgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ2hlY2sgaWYgRHVuaXQgYWNjZXNzIGlzIGRvbmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLSXNBY2Nlc3NEb25lCisoCisgICAgR1RfVTggZGV2TnVtLAorICAgIEdUXzMyIGludGVyZmFjZUlkCispCit7CisgICAgR1RfVTMyIHJkRGF0YSA9IDEsIGNudCA9IDA7CisKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgWFNCX0NNRF9SRUcpLCAmcmREYXRhLCBNQVNLX0FMTF9CSVRTKSk7CisJcmREYXRhICY9IDE7CisKKwl3aGlsZShyZERhdGEgIT0gMCkKKyAgICB7CisJCWlmIChjbnQrKyA+PSBNQVhfUE9MTElOR19JVEVSQVRJT05TKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBYU0JfQ01EX1JFRyksICZyZERhdGEsIE1BU0tfQUxMX0JJVFMpKTsKKyAgICAgICAgcmREYXRhICY9IDE7CisjaWZkZWYgQVNJQ19TSU1VTEFUSU9OCisgICAgICAgIHJkRGF0YSA9IDA7Lyogbm8gbW9yZSBpdGVyYXRpb25zIG5lZWRlZCAqLworI2VuZGlmIC8qQVNJQ19TSU1VTEFUSU9OKi8KKyAgICB9CisgICAgaWYgKGNudCA8IE1BWF9QT0xMSU5HX0lURVJBVElPTlMpCisgICAgeworCQlyZXR1cm4gR1RfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCgiQWNjZXNzRG9uZSBmYWlsOiBpZiA9ICVkXG4iLGludGVyZmFjZUlkKSk7CisgICAgICAgIHJldHVybiBHVF9GQUlMOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1RNUmVhZAorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICpkYXRhLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispCit7CisgICAgR1RfVTMyIGRhdGFWYWx1ZSA9IDAsIHN0YXJ0SWYsIGVuZElmOworICAgIE1WX0hXU19UT1BPTE9HWV9NQVAgKnRvcG9sb2d5TWFwID0gZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSk7CisKKyAgIAlkZHIzVGlwSXNVbmljYXN0QWNjZXNzKGRldk51bSwgJmludGVyZmFjZUlkLCAmaW50ZXJmYWNlQWNjZXNzKTsKKworICAgIGlmIChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfVU5JQ0FTVCkKKyAgICB7CisgICAgICAgIHN0YXJ0SWYgPSBpbnRlcmZhY2VJZDsKKyAgICAgICAgZW5kSWYgPSBpbnRlcmZhY2VJZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhcnRJZiA9IDA7CisgICAgICAgIGVuZElmID0gTUFYX0lOVEVSRkFDRV9OVU0tMTsKKyAgICB9CisKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSBzdGFydElmOyBpbnRlcmZhY2VJZCA8PSBlbmRJZjsgaW50ZXJmYWNlSWQrKykKKyAgICB7CisgICAgICAgIGlmIChJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkgPT0gIDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRkcjNUaXBQaXBlRW5hYmxlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIEdUX1RSVUUpOworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIEFDQ0VTU19UWVBFX1VOSUNBU1QsIFhTQl9DVFJMXzFfUkVHKSAsVFJBSU5JTkdfSUQpKTsKKworICAgICAgICAvKndvcmtpbmcgd2l0aCBYU0IgY2xpZW50IEludGVyZmFjZU51bSAgV3JpdGUgSW50ZXJmYWNlIEFERFIgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyBDKi8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBYU0JfQUREUkVTU19SRUcpLCByZWdBZGRyKSk7CisgICAgICAgIGRhdGFWYWx1ZSA9ICgoR1RfVTMyKShUQVJHRVRfSU5UIDw8IDE5KSkgKyAoQllURV9FTiA8PCAxMSkgKyAoQk9CS19OVU1fQllURVMgPDwgNCkgKyAoQ01EX1JFQUQgPDwgMikgKyhJTlRFUk5BTF9BQ0NFU1NfUE9SVCAgPDwgMSkgKyBFWEVDVVRJTkc7CisgICAgICAgIC8qV3JpdGUgSW50ZXJmYWNlIENPTU1BTkQgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyA4ICovCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgWFNCX0NNRF9SRUcpLCBkYXRhVmFsdWUpKTsKKworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktJc0FjY2Vzc0RvbmUoZGV2TnVtLCBpbnRlcmZhY2VJZCkpOworCisJCS8qIGNvbnNpZGVyIHRoYXQgaW5wdXQgZGF0YSBpcyBhbHdheXMgYSB2ZWN0b3IsIGFuZCBmb3IgdW5pY2FzdCB0aGUgd3JpdGluZyB3aWxsIGJlIGluIHRoZSBpbnRlcmZhY2UgaW5kZXggaW4gdmVjdG9yICovCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBYU0JfREFUQV9SRUcpLCAmZGF0YVtpbnRlcmZhY2VJZF0sIG1hc2spKTsKKyAgICAgICAgaWYgKGRlYnVnQm9iSyA+PSAyKQorICAgICAgICB7CisJCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJEdW5pdFJlYWQgICAweCV4OiAweCV4IChtYXNrIDB4JXgpXG4iLCAgcmVnQWRkciwgICpkYXRhLCBtYXNrKSk7CisgICAgICAgIH0KKyAgICAgICAgLypkZHIzVGlwUGlwZUVuYWJsZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCBHVF9GQUxTRSk7Ki8KKyAgICB9CisgICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLVE1Xcml0ZQorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKQoreworICAgIEdUX1UzMiBkYXRhQ21kID0gMCwgdWlEYXRhUmVhZCA9IDAsIHVpUmVhZEludGVyZmFjZUlkPTA7CisgICAgR1RfVTMyIGRhdGFSZWFkW01BWF9JTlRFUkZBQ0VfTlVNXTsKKwlHVF9VMzIgc3RhcnRJZiwgZW5kSWY7CisgICAgTVZfSFdTX1RPUE9MT0dZX01BUCAqdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKworICAgCWRkcjNUaXBJc1VuaWNhc3RBY2Nlc3MoZGV2TnVtLCAmaW50ZXJmYWNlSWQsICZpbnRlcmZhY2VBY2Nlc3MpOworICAgIGlmIChtYXNrICE9IE1BU0tfQUxMX0JJVFMpCisgICAgeworICAgICAgICAvKiBpZiBhbGwgYml0cyBzaG91bGQgYmUgd3JpdHRlbiB0aGVyZSBpcyBubyBuZWVkIGZvciByZWFkLW1vZGlmeS13cml0ZSAqLworICAgICAgICBpZiAoaW50ZXJmYWNlQWNjZXNzID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBHZXRGaXJzdEFjdGl2ZUlmKGRldk51bSwgdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2ssICZ1aVJlYWRJbnRlcmZhY2VJZCkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdWlSZWFkSW50ZXJmYWNlSWQgPSBpbnRlcmZhY2VJZDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVidWdCb2JLID49IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoImRkcjNUaXBCb2JLVE1Xcml0ZSBhY3RpdmUgaW50ZXJmYWNlID0gJWRcbiIsdWlSZWFkSW50ZXJmYWNlSWQpKTsKKyAgICAgICAgfQorCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1RNUmVhZChkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIHVpUmVhZEludGVyZmFjZUlkLHJlZ0FkZHIsZGF0YVJlYWQsTUFTS19BTExfQklUUykpOworICAgICAgICB1aURhdGFSZWFkID0gZGF0YVJlYWRbdWlSZWFkSW50ZXJmYWNlSWRdOworICAgICAgICBkYXRhVmFsdWUgPSAodWlEYXRhUmVhZCAmICh+bWFzaykpIHwgKGRhdGFWYWx1ZSAmIG1hc2spOworICAgIH0KKyAgICBkZHIzVGlwUGlwZUVuYWJsZShkZXZOdW0sIGludGVyZmFjZUFjY2VzcywgaW50ZXJmYWNlSWQsIEdUX1RSVUUpOworICAgIC8qIHNldCB0aGUgSUQgKi8KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgWFNCX0NUUkxfMV9SRUcpICwgVFJBSU5JTkdfSUQpKTsKKworICAgIC8qd29ya2luZyB3aXRoIFhTQiBtdWx0aWNhc3QgY2xpZW50ICwgV3JpdGUgSW50ZXJmYWNlIEFERFIgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyBDICovCisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBpbnRlcmZhY2VBY2Nlc3MsIFhTQl9BRERSRVNTX1JFRyksIHJlZ0FkZHIpKTsKKyAgICAvKldyaXRlIEludGVyZmFjZSBEQVRBIGFzIGRhdGEgdG8gWFNCIGFkZHJlc3MgMHgxMC4qLworICAgIGlmIChkZWJ1Z0JvYksgPj0gMSkKKyAgICB7CisgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIkR1bml0IFdyaXRlOiBpbnRlcmZhY2UgJWQgIGFjY2VzcyAlZCBBZGRyZXNzIDB4JXggRGF0YSAweCV4XG4iLCBpbnRlcmZhY2VJZCwgaW50ZXJmYWNlQWNjZXNzLCByZWdBZGRyLCBkYXRhVmFsdWUpKTsKKyAgICB9CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBpbnRlcmZhY2VBY2Nlc3MsIFhTQl9EQVRBX1JFRyksICBkYXRhVmFsdWUpKTsKKyAgICBkYXRhQ21kID0gKChHVF9VMzIpKFRBUkdFVF9JTlQgPDwgMTkpKSArIChCWVRFX0VOIDw8IDExKSArIChCT0JLX05VTV9CWVRFUyA8PCA0KSArICAoQ01EX1dSSVRFIDw8IDIpICsgKElOVEVSTkFMX0FDQ0VTU19QT1JUIDw8IDEpOworICAgIC8qV3JpdGUgSW50ZXJmYWNlIENPTU1BTkQgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyA4CisgICAgICBFeGVjdXRlIGFuIGludGVybmFsIHdyaXRlIHRvIHhCYXIgcG9ydDEgKi8KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGludGVyZmFjZUFjY2VzcywgWFNCX0NNRF9SRUcpLCBkYXRhQ21kKSk7CisJZGF0YUNtZCB8PSBFWEVDVVRJTkc7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBpbnRlcmZhY2VBY2Nlc3MsIFhTQl9DTURfUkVHKSwgZGF0YUNtZCkpOworCisJIC8qY2hlY2sgdGhhdCB3cml0ZSBpcyBjb21wbGV0ZWQ7IHRoZSB0ZXN0IHNob3VsZCBiZSBkb25lIHBlciBpbnRlcmZhY2UgKi8KKwlpZiAoaW50ZXJmYWNlQWNjZXNzID09IEFDQ0VTU19UWVBFX01VTFRJQ0FTVCkKKyAgICB7CisgICAgICAgIHN0YXJ0SWYgPSAwOworICAgICAgICBlbmRJZiA9IGh3TWF4RGRySWZOdW0tMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhcnRJZiA9IGludGVyZmFjZUlkOworICAgICAgICBlbmRJZiA9IGludGVyZmFjZUlkOworICAgIH0KKworICAgIGZvcihpbnRlcmZhY2VJZCA9IHN0YXJ0SWY7IGludGVyZmFjZUlkIDw9IGVuZElmOyBpbnRlcmZhY2VJZCsrKQorICAgIHsKKyAgICAgICAgVkFMSURBVEVfSUZfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkKKwkJZGRyM1RpcFBpcGVFbmFibGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgR1RfVFJVRSk7CisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS0lzQWNjZXNzRG9uZShkZXZOdW0sIGludGVyZmFjZUlkKSk7CisJfQorICAgLyogZGRyM1RpcFBpcGVFbmFibGUoZGV2TnVtLCBpbnRlcmZhY2VBY2Nlc3MsIGludGVyZmFjZUlkLCBHVF9GQUxTRSk7Ki8KKyAgICByZXR1cm4gR1RfT0s7Cit9CisjZWxzZSAvKiFkZWZpbmVkKENQU1NfQlVJTEQpKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb2JLV3JpdGUuCisqIERlc2M6CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1dyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrCispCit7CisJR1RfVTMyIHVpRGF0YVJlYWQ7CisjaWZkZWYgV0lOMzIKKyAgICByZXR1cm4gR1RfT0s7CisjZW5kaWYKKyAgICBpZiAobWFzayAhPSBNQVNLX0FMTF9CSVRTKQorICAgIHsKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLUmVhZChkZXZOdW0sIHJlZ0FkZHIsICAmdWlEYXRhUmVhZCwgTUFTS19BTExfQklUUykpOworICAgICAgICBkYXRhVmFsdWUgPSAodWlEYXRhUmVhZCAmICh+bWFzaykpIHwgKGRhdGFWYWx1ZSAmIG1hc2spOworICAgIH0KKworICAgIGlmIChkZWJ1Z0JvYksgPj0gMSkKKyAgICB7CisgICAgICAgbXZQcmludGYoIkR1bml0IFdyaXRlOiBBZGRyZXNzIDB4JXggRGF0YSAweCV4XG4iLCByZWdBZGRyLCBkYXRhVmFsdWUpOworICAgIH0KKworICAgIE1WX1JFR19XUklURShyZWdBZGRyLCBkYXRhVmFsdWUpOworCWlmIChkZWJ1Z0JvYksgPj0gMikKKwkJbXZQcmludGYoIndyaXRlOiAweCV4ID0gMHgleFxuIixyZWdBZGRyLGRhdGFWYWx1ZSk7CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwQm9iS1JlYWQuCisqIERlc2M6CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1JlYWQKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKQoreworI2lmZGVmIFdJTjMyCisgICAgIHJldHVybiBHVF9PSzsKKyNlbmRpZgorCisJKmRhdGEgPSBNVl9SRUdfUkVBRChyZWdBZGRyKSAmIG1hc2s7CisJaWYgKGRlYnVnQm9iSyA+PSAyKQorCXsKKwkJbXZQcmludGYoIkR1bml0UmVhZCAgIDB4JXg6IDB4JXggKG1hc2sgMHgleClcbiIsICByZWdBZGRyLCAgKmRhdGEsIG1hc2spOworCX0KKworICAgIHJldHVybiBHVF9PSzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb2JLSUZXcml0ZS4KKyogRGVzYzoKKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLSUZXcml0ZQorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGRhdGFWYWx1ZSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKQoreworICAgIGlmIChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKQorICAgICAgICBpbnRlcmZhY2VJZCA9IDQ7CisgCisgICAgcmV0dXJuKGRkcjNUaXBCb2JLV3JpdGUoZGV2TnVtLHJlZ0FkZHIsZGF0YVZhbHVlLG1hc2spKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBCb2JLSUZSZWFkLgorKiBEZXNjOgorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIEdUX09LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktJRlJlYWQKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGludGVyZmFjZUlkLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICAqZGF0YSwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgbWFzaworKQoreworICAgIGlmIChpbnRlcmZhY2VBY2Nlc3MgPT0gQUNDRVNTX1RZUEVfTVVMVElDQVNUKQorICAgICAgICBpbnRlcmZhY2VJZCA9IDQ7CisgICAgcmV0dXJuIGRkcjNUaXBCb2JLUmVhZChkZXZOdW0sIHJlZ0FkZHIsICZkYXRhW2ludGVyZmFjZUlkXSwgbWFzayk7Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwQm9iS1NlbGVjdENwdURkckNvbnRyb2xsZXIuCisqIERlc2M6ICAgICBFbmFibGUvRGlzYWJsZSBhY2Nlc3MgdG8gTWFydmVsbCdzIHNlcnZlci4KKyogQXJnczogICAgIGRldk51bSAgICAgLSBkZXZpY2UgbnVtYmVyCisqICAgICAgICAgICBlbmFibGUgICAgICAgIC0gd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgc2VydmVyCisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS1NlbGVjdENQVURkckNvbnRyb2xsZXIKKygKKyAgICBHVF9VOCAgICBkZXZOdW0sCisgICAgR1RfQk9PTCAgZW5hYmxlCispCit7CisgICAgLyogYXZvaWQgd2FybmluZ3MgKi8KKyAgICBkZXZOdW0gPWRldk51bTsKKyAgICBlbmFibGUgPSBlbmFibGU7CisgICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwSW5pdEJvYktTaWxpY29uLgorKiBEZXNjOiAgICAgaW5pdCBUcmFpbmluZyBTVyBEQi4KKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwSW5pdEJvYktTaWxpY29uCisoCisgICAgR1RfVTMyICBkZXZOdW0sCisgICAgR1RfVTMyICBib2FyZElkCispCit7CisgICAgTVZfSFdTX1RJUF9DT05GSUdfRlVOQ19EQiAgIGNvbmZpZ0Z1bmM7CisJTVZfSFdTX1RPUE9MT0dZX01BUCogICAgICAgIHRvcG9sb2d5TWFwID0gZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSk7CisgICAgR1RfVFVORV9UUkFJTklOR19QQVJBTVMgICAgIHR1bmVQYXJhbXM7CisJR1RfVTggbnVtT2ZCdXNQZXJJbnRlcmZhY2U7CisKKwlpZih0b3BvbG9neU1hcCA9PSBOVUxMKQorCXsKKwkJcmV0dXJuIEdUX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKyNpZiAwCisJZGRyM1RpcEJvYktHZXRJbnRlcmZhY2VNYXAoKEdUX1U4KWRldk51bSk7CisjZW5kaWYKKworICAgIGJvYXJkSWQgPSBib2FyZElkOyAvKiBhdm9pZCB3YXJuaW5ncyAqLworCisjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorICAgIG51bU9mQnVzUGVySW50ZXJmYWNlID0gNDsgLyogVE0gaGFzIG9ubHkgNCBidXNlcyovCisgICAgY29uZmlnRnVuYy50aXBEdW5pdFJlYWRGdW5jID0gZGRyM1RpcEJvYktUTVJlYWQ7CisgICAgY29uZmlnRnVuYy50aXBEdW5pdFdyaXRlRnVuYyA9IGRkcjNUaXBCb2JLVE1Xcml0ZTsKKyAgICBjb25maWdGdW5jLnRpcER1bml0TXV4U2VsZWN0RnVuYyA9IGRkcjNUaXBCb2JLU2VsZWN0VE1EZHJDb250cm9sbGVyOworCisjZWxzZQorICAgIG51bU9mQnVzUGVySW50ZXJmYWNlID0gNTsgLypNU1lTIG1heSBoYXZlIDUgYnVzZXMqLworICAgIGNvbmZpZ0Z1bmMudGlwRHVuaXRSZWFkRnVuYyA9IGRkcjNUaXBCb2JLSUZSZWFkOworICAgIGNvbmZpZ0Z1bmMudGlwRHVuaXRXcml0ZUZ1bmMgPSBkZHIzVGlwQm9iS0lGV3JpdGU7CisgICAgY29uZmlnRnVuYy50aXBEdW5pdE11eFNlbGVjdEZ1bmMgPSBkZHIzVGlwQm9iS1NlbGVjdENQVURkckNvbnRyb2xsZXI7CisjZW5kaWYKKworICAgIGNvbmZpZ0Z1bmMudGlwRXh0ZXJuYWxSZWFkICA9IGRkcjNUaXBCb2JLRXh0UmVhZDsKKwljb25maWdGdW5jLnRpcEV4dGVybmFsV3JpdGUgPSBkZHIzVGlwQm9iS0V4dFdyaXRlOworCisgICAgY29uZmlnRnVuYy50aXBHZXRGcmVxQ29uZmlnSW5mb0Z1bmMgPSBkZHIzVGlwQm9iS0dldEZyZXFDb25maWc7CisgICAgY29uZmlnRnVuYy50aXBTZXRGcmVxRGl2aWRlckZ1bmMgPSBkZHIzVGlwQm9iS1NldERpdmlkZXI7CisgICAgY29uZmlnRnVuYy50aXBHZXREZXZpY2VJbmZvRnVuYyA9IGRkcjNUaXBCb2JLR2V0RGV2aWNlSW5mbzsKKwljb25maWdGdW5jLnRpcEdldFRlbXBlcmF0dXJlID0gTlVMTDsKKwljb25maWdGdW5jLnRpcEdldENsb2NrUmF0aW8gPSBkZHIzVGlwQ2xvY2tNb2RlOworCisgICAgbXZId3NEZHIzVGlwSW5pdENvbmZpZ0Z1bmMoZGV2TnVtLCAmY29uZmlnRnVuYyk7CisKKwkvKiByZWdpc3RlciBiaXQgbWFwcGluZyAoZm9yIFBCUykgKi8KKwlkZHIzVGlwUmVnaXN0ZXJEcVRhYmxlKGRldk51bSwgYm9iS0RRYml0TWFwMlBoeXBpbik7CisKKwkvKlNldCBkZXZpY2UgYXR0cmlidXRlcyovCisJZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisjaWYgZGVmaW5lZChDUFNTX0JVSUxEKQorCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWLCBNVl9USVBfUkVWXzIpOyAgIC8qIFRNIEREUiAoTm9uLUVDQykgVElQIHZlcnNpb24gMiovCisjZWxzZQorICAgIGRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9USVBfUkVWLCBNVl9USVBfUkVWXzMpOyAgIC8qIEJPQksgTVNZUyBERFIgVElQIHZlcnNpb24gMyAgKi8KKyNlbmRpZgorCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9QSFlfRURHRSwgTVZfRERSX1BIWV9FREdFX05FR0FUSVZFKTsKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfT0NURVRfUEVSX0lOVEVSRkFDRSwgbnVtT2ZCdXNQZXJJbnRlcmZhY2UpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9JTlRFUkxFQVZFX1dBLCBHVF9GQUxTRSk7CisKKyNpZiBkZWZpbmVkKENQU1NfQlVJTEQpCisJbWFza1R1bmVGdW5jID0gKCBJTklUX0NPTlRST0xMRVJfTUFTS19CSVQgfAorCQkJCQlTRVRfTUVESVVNX0ZSRVFfTUFTS19CSVQgfAorCQkJCQlXUklURV9MRVZFTElOR19NQVNLX0JJVCB8CisJCQkJCUxPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKKwkJCQkJUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8CisJCQkJCVNFVF9UQVJHRVRfRlJFUV9NQVNLX0JJVCB8CisJCQkJCVdSSVRFX0xFVkVMSU5HX1RGX01BU0tfQklUIHwKKwkJCQkJUkVBRF9MRVZFTElOR19URl9NQVNLX0JJVCB8CisJCQkJCVdSSVRFX0xFVkVMSU5HX1NVUFBfVEZfTUFTS19CSVQgfAorCQkJCQlDRU5UUkFMSVpBVElPTl9SWF9NQVNLX0JJVCB8CisJCQkJCUNFTlRSQUxJWkFUSU9OX1RYX01BU0tfQklUKTsKKyNlbHNlCisgICBtYXNrVHVuZUZ1bmMgPSAgICAgKC8qU0VUX0xPV19GUkVRX01BU0tfQklUIHwKKwkJCQkJCUxPQURfUEFUVEVSTl9NQVNLX0JJVCB8Ki8KKwkJCQkJCVNFVF9NRURJVU1fRlJFUV9NQVNLX0JJVCB8CisJCQkJCQlXUklURV9MRVZFTElOR19NQVNLX0JJVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBMT0FEX1BBVFRFUk5fMl9NQVNLX0JJVCB8CisJCQkJCQlXUklURV9MRVZFTElOR19TVVBQX01BU0tfQklUIHwKKwkJCQkJCVJFQURfTEVWRUxJTkdfTUFTS19CSVQgfAorCQkJCQkJUEJTX1JYX01BU0tfQklUIHwKKwkJCQkJCVBCU19UWF9NQVNLX0JJVCB8CisJCQkJCQlTRVRfVEFSR0VUX0ZSRVFfTUFTS19CSVQgfAorCQkJCQkJV1JJVEVfTEVWRUxJTkdfVEZfTUFTS19CSVQgfAorCQkJCQkJV1JJVEVfTEVWRUxJTkdfU1VQUF9URl9NQVNLX0JJVCB8CisJCQkJCQlSRUFEX0xFVkVMSU5HX1RGX01BU0tfQklUIHwKKwkJCQkJCUNFTlRSQUxJWkFUSU9OX1JYX01BU0tfQklUIHwKKwkJCQkJCUNFTlRSQUxJWkFUSU9OX1RYX01BU0tfQklUCisJCQkJCQkpOworI2VuZGlmCisJLypTa2lwIG1pZCBmcmVxIHN0YWdlcyBmb3IgNDAwTWh6IEREUiBzcGVlZCovCisJaWYoICh0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ZpcnN0QWN0aXZlSWZdLm1lbW9yeUZyZXEgPT0gRERSX0ZSRVFfNDAwKSApeworCQltYXNrVHVuZUZ1bmMgPSAoIFdSSVRFX0xFVkVMSU5HX01BU0tfQklUIHwKKwkJICAgICAgICAgICAgICAgIExPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKKwkJICAgICAgICAgICAgICAgIFJFQURfTEVWRUxJTkdfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fUlhfTUFTS19CSVQgfAorCQkgICAgICAgICAgICAgICAgQ0VOVFJBTElaQVRJT05fVFhfTUFTS19CSVQpOworCX0KKworICAgIGlmKCBja0RlbGF5ID09IE1WX1BBUkFNU19VTkRFRklORUQgKQorICAgICAgICBja0RlbGF5ID0gMTUwOworICAgIGRlbGF5RW5hYmxlID0gMTsKKyAgICBjYURlbGF5ID0gMDsKKworICAgIC8qIHVwZGF0ZSBER0wgcGFyYW1ldGVycyAqLworICAgIHR1bmVQYXJhbXMuY2tEZWxheSA9IGNrRGVsYXk7CisgICAgdHVuZVBhcmFtcy5QaHlSZWczVmFsID0gMHhBOworICAgIHR1bmVQYXJhbXMuZ1J0dE5vbSA9IDB4NDQ7CisgICAgdHVuZVBhcmFtcy5nRGljID0gMHgyOworICAgIHR1bmVQYXJhbXMudWlPRFRDb25maWcgPSAweDEyMDAxMjsKKyAgICB0dW5lUGFyYW1zLmdacHJpRGF0YSA9IDEyMzsKKyAgICB0dW5lUGFyYW1zLmdabnJpRGF0YSA9IDEyMzsKKyAgICB0dW5lUGFyYW1zLmdacHJpQ3RybCA9IDc0OworICAgIHR1bmVQYXJhbXMuZ1pucmlDdHJsID0gNzQ7CisgICAgdHVuZVBhcmFtcy5nWnBvZHREYXRhID0gNDU7CisgICAgdHVuZVBhcmFtcy5nWm5vZHREYXRhID0gNDU7CisgICAgdHVuZVBhcmFtcy5nWnBvZHRDdHJsID0gNDU7CisgICAgdHVuZVBhcmFtcy5nWm5vZHRDdHJsID0gNDU7CisgICAgdHVuZVBhcmFtcy5nUnR0V1IgPSAwOyAvKjB4NDAwOzB4MDsqLworCisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBUdW5lVHJhaW5pbmdQYXJhbXMoZGV2TnVtLCAmdHVuZVBhcmFtcykpOworCisgICAgLyogZnJlcXVlbmN5IGFuZCBnZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICBkZHIzVGlwQm9iS0dldE1lZGl1bUZyZXEoZGV2TnVtLCBmaXJzdEFjdGl2ZUlmLCAmbWVkaXVtRnJlcSk7CisgICAgaW5pdEZyZXEgPSB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ZpcnN0QWN0aXZlSWZdLm1lbW9yeUZyZXE7CisJZnJlcVZhbFtERFJfRlJFUV9MT1dfRlJFUV0gPSBkZnNMb3dGcmVxID0gMTMwOworICAgIGRmc0xvd1BoeTEgPSBQaHlSZWcxVmFsOworCWNhbGlicmF0aW9uVXBkYXRlQ29udHJvbCA9IDE7CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNCb2JLVXBkYXRlVG9wb2xvZ3lNYXAuCisqIERlc2M6CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyBkZHIzQm9iS1VwZGF0ZVRvcG9sb2d5TWFwKEdUX1UzMiBkZXZOdW0sIE1WX0hXU19UT1BPTE9HWV9NQVAqIHRvcG9sb2d5TWFwKQoreworICAgIEdUX1UzMiBpbnRlcmZhY2VJZDsKKyAgICBNVl9IV1NfRERSX0ZSRVEgZnJlcTsKKworCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoInRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrIGlzIDB4JXhcbiIsIHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrKSk7CisKKyAgICBmb3IoaW50ZXJmYWNlSWQgPSAwOyBpbnRlcmZhY2VJZCA8IE1BWF9JTlRFUkZBQ0VfTlVNOyBpbnRlcmZhY2VJZCsrKSB7CisgICAgCWlmIChJU19JTlRFUkZBQ0VfQUNUSVZFKHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VBY3RpdmVNYXNrLCBpbnRlcmZhY2VJZCkgPT0gIEdUX0ZBTFNFKQorICAgIAkgICAgY29udGludWU7CisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS0dldEluaXRGcmVxKChHVF9VOClkZXZOdW0sIGludGVyZmFjZUlkLCAmZnJlcSkpOworICAgICAgICB0b3BvbG9neU1hcC0+aW50ZXJmYWNlUGFyYW1zW2ludGVyZmFjZUlkXS5tZW1vcnlGcmVxID0gZnJlcTsKKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIlVwZGF0ZSB0b3BvbG9neSBmcmVxdWVuY3kgZm9yIGludGVyZmFjZSAlZCB0byAlZFxuIixpbnRlcmZhY2VJZCwgZnJlcSkpOworICAgCX0KKworCS8qIHJlLWNhbGMgdG9wb2xvZ3kgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gdG9wb2xvZ3kgdXBkYXRlcyAoaWYgbmVlZGVkKSAqLworCUNIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBMb2FkVG9wb2xvZ3lNYXAoZGV2TnVtLCB0b3BvbG9neU1hcCkpOworCisgICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwSW5pdEJvYksuCisqIERlc2M6ICAgICBpbml0IFRyYWluaW5nIFNXIERCIGFuZCB1cGRhdGVzIEREUiB0b3BvbG9neS4KKyogQXJnczoKKyogTm90ZXM6CisqIFJldHVybnM6ICBHVF9PSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTIGRkcjNUaXBJbml0Qm9iSworKAorICAgIEdUX1UzMiAgZGV2TnVtLAorICAgIEdUX1UzMiAgYm9hcmRJZAorKQoreworCU1WX0hXU19UT1BPTE9HWV9NQVAqIHRvcG9sb2d5TWFwID0gZGRyM1RpcEdldFRvcG9sb2d5TWFwKGRldk51bSk7CisKKwlpZihOVUxMID09IHRvcG9sb2d5TWFwKQorCXsKKwkJI2lmIGRlZmluZWQoQ1BTU19CVUlMRCkKKwkJLyogZm9yIENQU1MsIHNpbmNlIHRvcG9sb2d5IGlzIG5vdCBhbHdheXMgaW5pdGlhbGl6ZWQsIGl0IGlzCisJCSAgIG5lZWRlZCB0byBzZXQgaXQgdG8gZGVmYXVsdCB0b3BvbG9neSAqLworCQl0b3BvbG9neU1hcCA9ICZib2JLVG9wb2xvZ3lNYXBbYm9hcmRJZF07CisgICAgICAgIG12UHJpbnRmICgiYm9hcmQgSUQgJWQsIGFjdGl2ZSBpbnRlcmZhY2UgbWFzayA9ICV4XG4iLGJvYXJkSWQsdG9wb2xvZ3lNYXAtPmludGVyZmFjZUFjdGl2ZU1hc2spOworCQkjZWxzZQorCQlyZXR1cm4gR1RfRkFJTDsKKwkJI2VuZGlmCisJfQorCisJQ0hFQ0tfU1RBVFVTKGRkcjNCb2JLVXBkYXRlVG9wb2xvZ3lNYXAoZGV2TnVtLCB0b3BvbG9neU1hcCkpOworCisgICAgZGRyM1RpcEluaXRCb2JLU2lsaWNvbihkZXZOdW0sIGJvYXJkSWQpOworICAgIHJldHVybiBHVF9PSzsKK30KKworI2lmIGRlZmluZWQoQ1BTU19CVUlMRCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRGF0YSBSZXNldAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEdUX1NUQVRVUyAgICBkZHIzVGlwRGF0YVJlc2V0CisoCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZAorKQoreworICAgIEdUX1NUQVRVUyByZXRWYWw7CisgICAgR1RfVTMyICB1aVdvcmRDbnQ7CisKKyAgICBmb3IodWlXb3JkQ250ID0gMDsgdWlXb3JkQ250IDwgOCA7IHVpV29yZENudCsrKQorICAgIHsKKyAgICAgICAgLypXcml0ZSBJbnRlcmZhY2UgREFUQSBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIDB4MTAuKi8KKyAgICAgICAgcmV0VmFsID0gZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sICAgICBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBpbnRlcmZhY2VBY2Nlc3MsIFhTQl9EQVRBX1JFRysodWlXb3JkQ250ICogNCkpLCAweEFCQ0RFRjEyKTsKKyAgICAgICAgaWYgKHJldFZhbCAhPSBHVF9PSykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorWFNCIEV4dGVybmFsIHJlYWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0V4dFJlYWQKKygKKyAgICBHVF9VMzIgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICBudW1PZkJ1cnN0cywKKyAgICBHVF9VMzIgICAgICAqZGF0YQorKQoreworICAgIEdUX1UzMiBidXJzdE51bSwgd29yZE51bSAsIGRhdGFWYWx1ZTsKKwlHVF9VMzIgY250UG9sbDsKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgYWNjZXNzVHlwZSA9IEFDQ0VTU19UWVBFX1VOSUNBU1Q7CisgICAgLypERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCI9PT0gRVhURVJOQUwgUkVBRCA9PT0iKSk7Ki8KKworICAgIGRkcjNUaXBQaXBlRW5hYmxlKChHVF9VOClkZXZOdW0sIGFjY2Vzc1R5cGUsIGludGVyZmFjZUlkLCBHVF9UUlVFKTsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9DVFJMXzBfUkVHKSAsRVhUX1RSQUlOSU5HX0lEKSk7CisKKyAgICBmb3IoYnVyc3ROdW09MCA7IGJ1cnN0TnVtIDwgbnVtT2ZCdXJzdHM7IGJ1cnN0TnVtKyspCisgICAgeworICAgICAgICBkZHIzVGlwRGF0YVJlc2V0KGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQpOworICAgICAgICAvKndvcmtpbmcgd2l0aCBYU0IgY2xpZW50IEludGVyZmFjZU51bSAgV3JpdGUgSW50ZXJmYWNlIEFERFIgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyBDKi8KKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBhY2Nlc3NUeXBlLCBYU0JfQUREUkVTU19SRUcgKyAoYnVyc3ROdW0gKiAzMikpLCByZWdBZGRyKSk7CisgICAgICAgIGlmIChpc0NiZVJlcXVpcmVkID09ICBHVF9UUlVFKQorICAgICAgICB7CisgICAgICAgICAgICAvKkNTX0NCRV9WQUxVRSgwKSovCisgICAgICAgICAgICBkYXRhVmFsdWUgPSBDU19DQkVfVkFMVUUoMCkgPDwgMTk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhVmFsdWUgPSAoR1RfVTMyKShUQVJHRVRfRVhUIDw8IDE5KTsKKyAgICAgICAgfQorICAgICAgICBkYXRhVmFsdWUgfD0gKEJZVEVfRU4gPDwgMTEpICsgKE5VTV9CWVRFU19JTl9CVVJTVCA8PCA0KSArIChBQ0NFU1NfRVhUIDw8IDMpOworICAgICAgICAvKldyaXRlIEludGVyZmFjZSBDT01NQU5EIGFzIGRhdGEgdG8gWFNCIGFkZHJlc3MgOCAqLworICAgICAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoIGludGVyZmFjZUlkLCBhY2Nlc3NUeXBlLCBYU0JfQ01EX1JFRyksICAgZGF0YVZhbHVlKSk7CisgICAgICAgIGRhdGFWYWx1ZSB8PSBFWEVDVVRJTkc7CisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyggaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9DTURfUkVHKSwgICBkYXRhVmFsdWUpKTsKKworCQlmb3IoY250UG9sbD0wOyBjbnRQb2xsIDwgTUFYX1BPTExJTkdfSVRFUkFUSU9OUzsgY250UG9sbCsrKQorCQl7CisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgQk9CS19YU0JfTUFQUElORyggaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9DTURfUkVHKSwgJmRhdGFWYWx1ZSwgMHgxKSk7CisKKwkJCWlmIChkYXRhVmFsdWUgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjbnRQb2xsID49IE1BWF9QT0xMSU5HX0lURVJBVElPTlMpCisJCXsKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJObyBEb25lIGluZGljYXRpb24gZm9yIEREUiBSZWFkXG4iLCBkYXRhVmFsdWUpKTsKKwkJCXJldHVybiBHVF9OT1RfUkVBRFk7CisJCX0KKworICAgICAgICBmb3Iod29yZE51bSA9IDA7IHdvcmROdW0gPCBFWFRfQUNDRVNTX0JVUlNUX0xFTkdUSCAvKnNfdWlOdW1PZkJ5dGVzSW5CdXJzdC80Ki87IHdvcmROdW0rKykKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIEJPQktfWFNCX01BUFBJTkcoaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9EQVRBX1JFRyArICh3b3JkTnVtICogNCkpLCAmZGF0YVt3b3JkTnVtXSwgTUFTS19BTExfQklUUykpOworICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoImRkcjNUaXBFeHRSZWFkIGRhdGEgMHgleCBcbiIsZGF0YVt3b3JkTnVtXSkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBHVF9PSzsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorWFNCIEV4dGVybmFsIHdyaXRlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktFeHRXcml0ZQorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICphZGRyCispCit7CisgICAgR1RfVTMyICAgICAgICB3b3JkTnVtID0gMCwgIGRhdGFDbWQgPSAwLCBidXJzdE51bT0wLCBjbnRQb2xsID0gMCwgZGF0YVZhbHVlICA9IDA7CisgICAgTVZfSFdTX0FDQ0VTU19UWVBFIGFjY2Vzc1R5cGUgPSBBQ0NFU1NfVFlQRV9VTklDQVNUOworCisgICAgZGRyM1RpcFBpcGVFbmFibGUoKEdUX1U4KWRldk51bSwgYWNjZXNzVHlwZSwgaW50ZXJmYWNlSWQsIEdUX1RSVUUpOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0NUUkxfMF9SRUcpICxFWFRfVFJBSU5JTkdfSUQgICkpOworICAgIGZvcihidXJzdE51bT0wIDsgYnVyc3ROdW0gPCBudW1PZkJ1cnN0czsgYnVyc3ROdW0rKykKKyAgICB7CisgICAgICAgIC8qd29ya2luZyB3aXRoIFhTQiBtdWx0aWNhc3QgY2xpZW50ICwgV3JpdGUgSW50ZXJmYWNlIEFERFIgYXMgZGF0YSB0byBYU0IgYWRkcmVzcyBDICovCisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0FERFJFU1NfUkVHKSwgcmVnQWRkciArIChidXJzdE51bSAqIEVYVF9BQ0NFU1NfQlVSU1RfTEVOR1RIICogNCkpKTsKKyAgICAgICAgZm9yKHdvcmROdW0gPSAwOyB3b3JkTnVtIDwgOCA7IHdvcmROdW0rKykKKyAgICAgICAgeworICAgICAgICAgICAgLypXcml0ZSBJbnRlcmZhY2UgREFUQSBhcyBkYXRhIHRvIFhTQiBhZGRyZXNzIDB4MTAuKi8KKyAgICAgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgQk9CS19YU0JfTUFQUElORyhpbnRlcmZhY2VJZCwgYWNjZXNzVHlwZSwgWFNCX0RBVEFfUkVHICsgKHdvcmROdW0gKiA0KSksIGFkZHJbd29yZE51bV0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNDYmVSZXF1aXJlZCA9PSAgR1RfVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YUNtZCA9ICBDU19DQkVfVkFMVUUoMCkgPDwgMTk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkYXRhQ21kID0gKEdUX1UzMikoVEFSR0VUX0VYVCA8PCAxOSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YUNtZCB8PSAoQllURV9FTiA8PCAxMSkgKyAoTlVNX0JZVEVTX0lOX0JVUlNUIDw8IDQpICsgKEFDQ0VTU19FWFQgPDwgMykgKyBFWFRfTU9ERTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCAgYWNjZXNzVHlwZSwgWFNCX0NNRF9SRUcpLCBkYXRhQ21kKSk7CisgICAgICAgIC8qIGV4ZWN1dGUgeHNiIHdyaXRlICovCisgICAgICAgIGRhdGFDbWQgfD0gMHgxOworICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiZGRyM1RpcEV4dFdyaXRlIGRhdGFDbWQgMHgleCBcbiIsIGRhdGFDbWQpKTsKKyAgICAgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCBCT0JLX1hTQl9NQVBQSU5HKGludGVyZmFjZUlkLCBhY2Nlc3NUeXBlLCBYU0JfQ01EX1JFRyksIGRhdGFDbWQpKTsKKworCQlmb3IoY250UG9sbD0wOyBjbnRQb2xsIDwgTUFYX1BPTExJTkdfSVRFUkFUSU9OUzsgY250UG9sbCsrKQorCQl7CisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgQk9CS19YU0JfTUFQUElORyggaW50ZXJmYWNlSWQsIGFjY2Vzc1R5cGUsIFhTQl9DTURfUkVHKSwgJmRhdGFWYWx1ZSwgMHgxKSk7CisKKwkJCWlmIChkYXRhVmFsdWUgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjbnRQb2xsID49IE1BWF9QT0xMSU5HX0lURVJBVElPTlMpCisJCXsKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJObyBEb25lIGluZGljYXRpb24gZm9yIEREUiBXcml0ZSBFeHRlcm5hbFxuIiwgZGF0YVZhbHVlKSk7CisJCQlyZXR1cm4gR1RfTk9UX1JFQURZOworCQl9CisKKyAgICB9CisgICAgcmV0dXJuIEdUX09LOworfQorI2Vsc2UKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXh0ZXJuYWwgcmVhZCBmcm9tIG1lbW9yeQorKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwQm9iS0V4dFJlYWQKKygKKyAgICBHVF9VMzIgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICBudW1PZkJ1cnN0cywKKyAgICBHVF9VMzIgICAgICAqZGF0YQorKQoreworICAgIEdUX1UzMiBidXJzdE51bTsKKworICAgIGZvcihidXJzdE51bT0wIDsgYnVyc3ROdW0gPCBudW1PZkJ1cnN0cyo4OyBidXJzdE51bSsrKQorICAgIHsKKwkJZGF0YVtidXJzdE51bV0gPSAqICh2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKHJlZ0FkZHIgKyA0KiBidXJzdE51bSk7CisgICAgfQorCisgICAgcmV0dXJuIEdUX09LOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXh0ZXJuYWwgd3JpdGUgdG8gbWVtb3J5CisqLworR1RfU1RBVFVTICAgIGRkcjNUaXBCb2JLRXh0V3JpdGUKKygKKyAgICBHVF9VMzIgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICBudW1PZkJ1cnN0cywKKyAgICBHVF9VMzIgICAgICAqZGF0YQorKQoreworICAgIEdUX1UzMiBidXJzdE51bTsKKworICAgIGZvcihidXJzdE51bT0wIDsgYnVyc3ROdW0gPCBudW1PZkJ1cnN0cyo4OyBidXJzdE51bSsrKQorICAgIHsKKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKikgKHJlZ0FkZHIrNCpidXJzdE51bSkgPSBkYXRhW2J1cnN0TnVtXTsKKyAgICB9CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgUExML0ZyZXF1ZW5jeSBGdW5jdGlvbmFsaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwQm9uS1NldERpdmlkZXIuCisqIERlc2M6ICAgICBQbGwgRGl2aWRlcgorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIEdUX09LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgZGRyM1RpcEJvYktTZXREaXZpZGVyCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorCUdUX1UzMgkJCQkJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEgICAgICAgICAgICAgICAgIGZyZXF1ZW5jeQorKQoreworCWlmKGludGVyZmFjZUlkIDwgNCkKKwl7CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9JTkZPLCAoIlRNIHNldCBkaXZpZGVyIGZvciBpbnRlcmZhY2UgJWRcbiIsaW50ZXJmYWNlSWQpKTsKKwkJcmV0dXJuIGRkcjNUaXBUbVNldERpdmlkZXIoZGV2TnVtLCBpbnRlcmZhY2VJZCwgZnJlcXVlbmN5KTsKKwl9CisKKwllbHNlCisJeworCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJDUFUgc2V0IGRpdmlkZXIgZm9yIGludGVyZmFjZSA0XG4iKSk7CisJCXJldHVybiBkZHIzVGlwQ3B1U2V0RGl2aWRlcihkZXZOdW0sIGludGVyZmFjZUlkLCBmcmVxdWVuY3kpOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiByZXR1cm4gMSBvZiBjb3JlL0RVTklUIGNsb2NrIHJhdGlvbiBpcyAxIGZvciBnaXZlbiBmcmVxLCAwIGlmIGNsb2NrIHJhdGlvcyBpcyAyOjEKKyovCitzdGF0aWMgR1RfVTggZGRyM1RpcENsb2NrTW9kZSggR1RfVTMyIGZyZXF1ZW5jeSApCit7CisJaWYoZnJlcXVlbmN5ID09IEREUl9GUkVRX0xPV19GUkVRKXsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2V7CisJCXJldHVybiAyOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcFRtU2V0RGl2aWRlci4KKyogRGVzYzogICAgIFBsbCBEaXZpZGVyIG9mIFRoZSBUcmFmaWMgTWFuYWdlciBVbml0CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcFRtU2V0RGl2aWRlcgorKAorCUdUX1U4CQkJCQkJCWRldk51bSwKKwlHVF9VMzIJCQkJCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRICAgICAgICAgICAgICAgICBmcmVxdWVuY3kKKykKK3sKKyAgICBHVF9VMzIgZGF0YSA9IDAsIHdyaXRlRGF0YSwgZGl2aWRlciA9IDA7CisgICAgTVZfSFdTX0REUl9GUkVRIHNhckZyZXE7CisKKwlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJUTSBQTEwgQ29uZmlnXG4iKSk7CisKKyAgICAvKiBhdm9pZCB3YXJuaW5ncyAqLworICAgIGludGVyZmFjZUlkID0gaW50ZXJmYWNlSWQ7CisgICAgLyogQ2FsYyBTQVIgKi8KKyAgIC8qQ0hFQ0tfU1RBVFVTKGRkcjNUaXBUbUdldEluaXRGcmVxKGRldk51bSwgJnNhckZyZXEpKTsqLworICAgIC8qIGNhbGMgU0FSICovCisgICAgZGRyM1RpcEJvYktHZXRJbml0RnJlcShkZXZOdW0sIDAsICZzYXJGcmVxKTsKKyAgICBkaXZpZGVyID0gZnJlcVZhbFtzYXJGcmVxXS9mcmVxVmFsW2ZyZXF1ZW5jeV07CisKKyAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJcdFNBUiB2YWx1ZSAlZCBkaXZpZGVyICVkIChmcmVxVmFsWyVkXSAlZCAgZnJlcVZhbFslZF0gJWRcbiIsCisJCQkJCSAgc2FyRnJlcSwgZGl2aWRlciwgc2FyRnJlcSwgZnJlcVZhbFtzYXJGcmVxXSwgZnJlcXVlbmN5LCBmcmVxVmFsW2ZyZXF1ZW5jeV0pKTsKKyAgICBzd2l0Y2ggKGRpdmlkZXIpCisgICAgeworCWNhc2UgMToKKwkJd3JpdGVEYXRhICA9IFRNX1BMTF9SRUdfREFUQSgyLDEsMyk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJd3JpdGVEYXRhICA9IFRNX1BMTF9SRUdfREFUQSg0LDIsMyk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJd3JpdGVEYXRhICA9IFRNX1BMTF9SRUdfREFUQSg2LDMsMyk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJd3JpdGVEYXRhICA9IFRNX1BMTF9SRUdfREFUQSg4LDQsMyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0VSUk9SLCAoIkVycm9yOiBkZHIzVGlwVG1TZXREaXZpZGVyOiAlZCBkaXZpZGVyIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGRpdmlkZXIpKTsKKwkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKKyAgICB9CisKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODI2NCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHgwMDBGODI2NCwgIFJfTU9EX1cod3JpdGVEYXRhLGRhdGEsMHhGRjBDKSkpOworCisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIDB4MDAwRjgyNjQsICAmZGF0YSwgTUFTS19BTExfQklUUykpOworCWRhdGEgfD0gKDE8PDE2KTsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4MDAwRjgyNjQsICBkYXRhKSk7CisKKwkvKmh3c09zRXhhY3REZWxheVB0cihkZXZOdW0sIDAsIDEwKTsgKi8KKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODI2NCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTKSk7CisJZGF0YSAmPSB+KDE8PDE2KTsKKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdXcml0ZShkZXZOdW0sIDB4MDAwRjgyNjQsICBSX01PRF9XKDAsIGRhdGEsICgxPDwxNikpKSk7CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIGRkcjNUaXBDcHVTZXREaXZpZGVyLgorKiBEZXNjOiAgICAgUGxsIERpdmlkZXIgb2YgdGhlIENQVShtc3lzKSBVbml0CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcENwdVNldERpdmlkZXIKKygKKwlHVF9VOAkJCQkJCQlkZXZOdW0sCisJR1RfVTMyCQkJCQkJCWludGVyZmFjZUlkLAorICAgIE1WX0hXU19ERFJfRlJFUSAgICAgICAgICAgICAgICAgZnJlcXVlbmN5CispCit7CisgICAgR1RfVTMyIGRhdGEgPSAwLCBkaXZpZGVyID0gMDsKKyNpZiAwCisgICAgR1RfVTMyIHZhbHVlLCBkaXZSYXRpbzsKKyNlbmRpZgorICAgIE1WX0hXU19ERFJfRlJFUSBzYXJGcmVxOworICAgIEdUX1UzMiB3cml0ZURhdGE7CisKKwlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJDUFUgUExMIENvbmZpZ1xuIikpOworI2lmIDEKKyAgICAvKiBjYWxjIFNBUiAqLworICAgIGRkcjNUaXBCb2JLR2V0SW5pdEZyZXEoZGV2TnVtLCBpbnRlcmZhY2VJZCwgJnNhckZyZXEpOworICAgIGRpdmlkZXIgPSBmcmVxVmFsW3NhckZyZXFdL2ZyZXFWYWxbZnJlcXVlbmN5XTsKKworICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJcblNBUiB2YWx1ZSAlZCBkaXZpZGVyICVkIGZyZXFWYWxbJWRdICVkICBmcmVxVmFsWyVkXSAlZFxuIiwKKwkJCQkJICBzYXJGcmVxLCBkaXZpZGVyLCBzYXJGcmVxLCBmcmVxVmFsW3NhckZyZXFdLCBmcmVxdWVuY3ksIGZyZXFWYWxbZnJlcXVlbmN5XSkpOworCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIDB4MDAwRjgyZWMsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKKwl3cml0ZURhdGEgPSAoMHgxIDw8IDkpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHgwMDBGODJlYywgIFJfTU9EX1cod3JpdGVEYXRhLGRhdGEsICgweDEgPDwgOSkpKSk7CisKKyAgICBzd2l0Y2ggKGRpdmlkZXIpCisgICAgeworICAgICAgICBjYXNlIDE6CisJCQkvKk5vdCA4MDAgaXMgYSA2Njcgb25seSovCisgICAgICAgICAgICB3cml0ZURhdGEgPSAoc2FyRnJlcT09RERSX0ZSRVFfODAwKT8oMHgyKTooMHgxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisJCQkvKk5vdCA4MDAgaXMgYSA2Njcgb25seSovCisgICAgICAgICAgICB3cml0ZURhdGEgPSAoc2FyRnJlcT09RERSX0ZSRVFfODAwKT8oMHgzKTooMHgyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgiRXJyb3I6IFdyb25nIGRpdmlkZXIgJWRcbiIsIGRpdmlkZXIpKTsKKyAgICAgICAgICAgIHJldHVybiBHVF9CQURfUEFSQU07CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgMHgwMDBGODJlOCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHgwMDBGODJlOCwgIFJfTU9EX1cod3JpdGVEYXRhLGRhdGEsICgweDcgPDwgMCkpKSk7CisjZWxzZQorICAgIC8qIGNhbGMgU0FSICovCisgICAgZGRyM1RpcEJvYktHZXRJbml0RnJlcShkZXZOdW0sIGludGVyZmFjZUlkLCAmc2FyRnJlcSk7CisgICAgZGl2aWRlciA9IGZyZXFWYWxbc2FyRnJlcV0vZnJlcVZhbFtmcmVxdWVuY3ldOworCisgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIlxuU0FSIHZhbHVlICVkIGRpdmlkZXIgJWQgZnJlcVZhbFslZF0gJWQgIGZyZXFWYWxbJWRdICVkXG4iLAorCQkJCQkgIHNhckZyZXEsIGRpdmlkZXIsIHNhckZyZXEsIGZyZXFWYWxbc2FyRnJlcV0sIGZyZXF1ZW5jeSwgZnJlcVZhbFtmcmVxdWVuY3ldKSk7CisKKwkvKiBDb25maWd1cmUgRHVuaXQgdG8gMToxIGluIGNhc2Ugb2YgRExMIG9mZiBtb2RlIGVsc2UgMjoxKi8KKwl2YWx1ZSA9IChkZHIzVGlwQ2xvY2tNb2RlKGZyZXF1ZW5jeSkgPT0gMSk/IDAgOiAxOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1dyaXRlKGRldk51bSwgMHgxNTI0LCAodmFsdWUgPDwgMTUpLCAoMSA8PCAxNSkpKTsKKworCS8qIER1bml0IHRyYWluaW5nIGNsb2NrICsgMToxLzI6MSBtb2RlICovCisJZGl2UmF0aW8gPSAoZGRyM1RpcENsb2NrTW9kZShmcmVxdWVuY3kpIDw8IDE2KTsKKwlDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgIDB4RjgyOTgsICAmZGF0YSwgTUFTS19BTExfQklUUyApKTsKKwkvKmRkcl9waHlfY2xrX2RpdmlkZXIqLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI5OCwgIFJfTU9EX1coZGl2UmF0aW8sIGRhdGEsICgweDMgPDwgMTYpKSkpOworCWRpdlJhdGlvID0gKGZyZXF1ZW5jeT09aW5pdEZyZXEpPygwKTooMSk7CisJLypzZWxfcGxsX2Rkcl9jbGtfZGl2MiovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4Mjk4LCAgUl9NT0RfVyggZGl2UmF0aW88PDE1LCBkYXRhLCAoMHgxIDw8IDE1KSkpKTsKKworCS8qY3B1X3BsbF9jbGtkaXZfcmVsb2FkX3Ntb290aCovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4MjcwLCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjcwLCAgUl9NT0RfVygoLyoweDdGPCovMHg2ZjwxMSksIGRhdGEsICgweDdGIDw8IDExKSkpKTsKKworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHhGODI2OCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworCS8qY3B1X3BsbF9jbGtkaXZfcmVsYXhfZW4qLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI2OCwgIFJfTU9EX1coLyoweDdGPCovMHg2ZiwgZGF0YSwgMHg3RikpKTsKKwkvKmNwdV9wbGxfY2xrZGl2X3Jlc2V0X21hc2sqLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI2OCwgIFJfTU9EX1coKC8qMHg3RjwqLzB4NmY8PDcpLCBkYXRhLCAoMHg3RiA8PCA3KSkpKTsKKworCS8qY3B1X3BsbF9kZHJfY2xrZGl2X3JhdGlvX2Z1bGwqLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHhGODI2QywgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI2QywgIFJfTU9EX1coKGRpdmlkZXI8PDEyKSwgZGF0YSwgKDB4M0YgPDwgMTIpKSkpOworCisJLypjcHVfcGxsX2Nsa2Rpdl9yZWxvYWRfZm9yY2UqLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1JlYWQoZGV2TnVtLCAgMHhGODI2OCwgICZkYXRhLCBNQVNLX0FMTF9CSVRTICkpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI2OCwgIFJfTU9EX1coKDB4Mjw8MjEpLCBkYXRhLCAoMHg3RiA8PCAyMSkpKSk7CisKKwkvKmNwdV9wbGxfY2xrZGl2X3JlbG9hZF9yYXRpbyovCisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sICAweEY4MjcwLCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnV3JpdGUoZGV2TnVtLCAweEY4MjcwLCAgUl9NT0RfVygoMHgxPDwxMCksIGRhdGEsICgweDEgPDwgMTApKSkpOworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlcnZlclJlZ1dyaXRlKGRldk51bSwgMHhGODI3MCwgIFJfTU9EX1coMCwgZGF0YSwgKDB4MSA8PCAxMCkpKSk7CisKKyAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJcdENQVSBQTEwgY29uZmlnIERvbmVcbiIpKTsKKyNlbmRpZgorICAgIHJldHVybiBHVF9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgZGRyM1RpcEJvYktHZXRJbml0RnJlcS4KKyogRGVzYzogICAgIGNob29zZSBmcm9tIHdoZXJlIHRvIGV4dHJhY3QgdGhlIGZyZXF1ZW5jeSAoVE0gb3IgQ1BVKQorKiBBcmdzOgorKiBOb3RlczoKKyogUmV0dXJuczogIEdUX09LIGlmIHN1Y2Nlc3MsIG90aGVyIGVycm9yIGNvZGUgaWYgZmFpbC4KKyovCitHVF9TVEFUVVMgZGRyM1RpcEJvYktHZXRJbml0RnJlcQorKAorCUdUX1U4CQkJCWRldk51bSwKKwlHVF9VMzIJCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRKiAJc2FyRnJlcQorKQoreworCUdUX1NUQVRVUyByZXM7CisKKwlpZihpbnRlcmZhY2VJZCA8IDQpCisJeworCQlyZXMgPSBkZHIzVGlwVG1HZXRJbml0RnJlcShkZXZOdW0sIHNhckZyZXEpOworCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiVE0gZnJlcXVlbmN5IGZvciBpbnRlcmZhY2UgJWQgaXMgJWRcbiIsaW50ZXJmYWNlSWQsICpzYXJGcmVxKSk7CisJfQorCWVsc2UKKwl7CisJCXJlcyA9IGRkcjNUaXBDcHVHZXRJbml0RnJlcShkZXZOdW0sIHNhckZyZXEpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1RNIGludGVyZmFjZSBmcmVxdWVuY3kgR2V0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgR1RfU1RBVFVTIGRkcjNUaXBUbUdldEluaXRGcmVxCisoCisJR1RfU1RBVFVTICAgICAgIGRldk51bSwKKwlNVl9IV1NfRERSX0ZSRVEgKmZyZXEKKykKK3sKKyAgICBHVF9VMzIgZGF0YTsKKworICAgIC8qIGNhbGMgU0FSICovCisgICAgQ0hFQ0tfU1RBVFVTKGRkcjNUaXBCb2JLU2VydmVyUmVnUmVhZChkZXZOdW0sIDB4MDAwRjgyMDQgLCAgJmRhdGEsIE1BU0tfQUxMX0JJVFMpKTsKKyAgICBkYXRhID0gKGRhdGEgPj4gMTUpICYgMHg3OworI2lmZGVmIEFTSUNfU0lNVUxBVElPTgorICAgIGRhdGEgPSAyOworI2VuZGlmCisgICAgc3dpdGNoKGRhdGEpCisgICAgeworCWNhc2UgMDoKKwkJLyogVE0gaXMgZGlzYWJsZWQgKi8KKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIlRNIERpc2FibGVkXG4iKSk7CisJCSpmcmVxID0gRERSX0ZSRVFfTElNSVQ7CisJCXJldHVybiBHVF9OT1RfSU5JVElBTElaRUQ7CisKKwljYXNlIDE6CisJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJUTSBERFJfRlJFUV84MDBcbiIpKTsKKwkJKmZyZXEgPSBERFJfRlJFUV84MDA7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiVE0gRERSX0ZSRVFfOTMzXG4iKSk7CisJCSpmcmVxID0gRERSX0ZSRVFfOTMzOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIlRNIEREUl9GUkVRXzY2N1xuIikpOworCQkqZnJlcSA9IEREUl9GUkVRXzY2NzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfRVJST1IsICgiRXJyb3I6IGRkcjNUaXBUbUdldEluaXRGcmVxOiBVbmtub3duIEZyZXEgU0FSIHZhbHVlIDB4JXhcbiIsIGRhdGEpKTsKKwkJKmZyZXEgPSBERFJfRlJFUV9MSU1JVDsKKwkJcmV0dXJuIEdUX0JBRF9QQVJBTTsKKyAgICB9CisgICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NQVSBpbnRlcmZhY2UgZnJlcXVlbmN5IEdldAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEdUX1NUQVRVUyBkZHIzVGlwQ3B1R2V0SW5pdEZyZXEKKygKKyAgICBHVF9TVEFUVVMgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQorKQoreworCUdUX1UzMiBkYXRhOworCisgICAgLyogY2FsYyBTQVIgKi8KKyAgICBDSEVDS19TVEFUVVMoZGRyM1RpcEJvYktTZXJ2ZXJSZWdSZWFkKGRldk51bSwgUkVHX0RFVklDRV9TQVIxX0FERFIsJmRhdGEsIE1BU0tfQUxMX0JJVFMgKSk7CisgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX0lORk8sICgiU0FSMSBpcyAweCVYXG4iLCBkYXRhKSk7CisKKyAgICBkYXRhID0gKGRhdGEgPj4gUExMMV9DTkZJR19PRkZTRVQpICYgUExMMV9DTkZJR19NQVNLOworCisgICAgc3dpdGNoKGRhdGEpCisgICAgeworICAgICAgICBjYXNlIDA6CisJCWNhc2UgNToKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJERFJfRlJFUV80MDBcbiIpKTsKKyAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJERFJfRlJFUV81MzNcbiIpKTsKKyAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfNTMzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJERFJfRlJFUV82NjdcbiIpKTsKKyAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfNjY3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJERFJfRlJFUV84MDBcbiIpKTsKKyAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfODAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfSU5GTywgKCJGcmVxIFNBUiBVbmtub3duXG4iKSk7CisgICAgICAgICAgICAqZnJlcSA9IEREUl9GUkVRX0xJTUlUOworICAgICAgICAgICAgcmV0dXJuIEdUX0JBRF9QQVJBTTsKKyAgICB9CisgICAgcmV0dXJuIEdUX09LOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIE5hbWU6ICAgICBkZHIzVGlwQm9iS0dldE1lZGl1bUZyZXEuCisqIERlc2M6CisqIEFyZ3M6CisqIE5vdGVzOgorKiBSZXR1cm5zOiAgR1RfT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK3N0YXRpYyBHVF9TVEFUVVMgZGRyM1RpcEJvYktHZXRNZWRpdW1GcmVxCisoCisJR1RfVTMyIGRldk51bSwKKwlHVF9VMzIgaW50ZXJmYWNlSWQsCisJTVZfSFdTX0REUl9GUkVRICpmcmVxCispCit7CisgICAgTVZfSFdTX0REUl9GUkVRIHNhckZyZXE7CisKKyAgICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS0dldEluaXRGcmVxKChHVF9VOClkZXZOdW0sIGludGVyZmFjZUlkLCAmc2FyRnJlcSkpOworCisgICAgICBzd2l0Y2goc2FyRnJlcSkKKyAgICAgIHsKKyAgICAgICAgICBjYXNlIEREUl9GUkVRXzQwMDoKKyAgICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIk5vIG1lZGl1bSBmcmVxIHN1cHBvcnRlZCBmb3IgNDAwTWh6XG4iKSk7CisgICAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGNhc2UgRERSX0ZSRVFfNjY3OgorICAgICAgICAgICAgICBERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfVFJBQ0UsICgiTWVkaXVtIEREUl9GUkVRXzMzM1xuIikpOworICAgICAgICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzMzMzsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBjYXNlIEREUl9GUkVRXzgwMDoKKyAgICAgICAgICAgICAgREVCVUdfVFJBSU5JTkdfQUNDRVNTKERFQlVHX0xFVkVMX1RSQUNFLCAoIk1lZGl1bSBERFJfRlJFUV80MDBcbiIpKTsKKyAgICAgICAgICAgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgY2FzZSBERFJfRlJFUV85MzM6CisgICAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9UUkFDRSwgKCJNZWRpdW0gRERSX0ZSRVFfMzExXG4iKSk7CisgICAgICAgICAgICAgICpmcmVxID0gRERSX0ZSRVFfMzExOworICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIERFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJFcnJvcjogZGRyM1RpcEJjMkdldE1lZGl1bUZyZXE6IEZyZXEgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgc2FyRnJlcSkpOworICAgICAgICAgICAgICByZXR1cm4gR1RfRkFJTDsKKyAgICAgIH0KKyAgICByZXR1cm4gR1RfT0s7Cit9CisKKworR1RfU1RBVFVTIGRkcjNUaXBCb2JLR2V0RGV2aWNlSW5mbworKAorICAgIEdUX1U4ICAgICAgZGV2TnVtLAorICAgIE1WX0REUjNfREVWSUNFX0lORk8gKiBpbmZvUHRyCispCit7CisgICAgZGV2TnVtID0gZGV2TnVtOyAvKiBhdm9pZCB3YXJuaW5ncyAqLworCisJaW5mb1B0ci0+ZGV2aWNlSWQgPSAweEZDMDA7CisJaW5mb1B0ci0+Y2tEZWxheSA9IGNrRGVsYXk7CisKKwlyZXR1cm4gR1RfT0s7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM01zeXMuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNNc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1YjM1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNNc3lzLmMKQEAgLTAsMCArMSw3NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICAgICAgQ29weXJpZ2h0IDIwMDEsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuCisqIFRoaXMgY29kZSBjb250YWlucyBjb25maWRlbnRpYWwgaW5mb3JtYXRpb24gb2YgTWFydmVsbCBzZW1pY29uZHVjdG9yLCBpbmMuCisqIG5vIHJpZ2h0cyBhcmUgZ3JhbnRlZCBoZXJlaW4gdW5kZXIgYW55IHBhdGVudCwgbWFzayB3b3JrIHJpZ2h0IG9yIGNvcHlyaWdodAorKiBvZiBNYXJ2ZWxsIG9yIGFueSB0aGlyZCBwYXJ0eS4KKyogTWFydmVsbCByZXNlcnZlcyB0aGUgcmlnaHQgYXQgaXRzIHNvbGUgZGlzY3JldGlvbiB0byByZXF1ZXN0IHRoYXQgdGhpcyBjb2RlCisqIGJlIGltbWVkaWF0ZWx5IHJldHVybmVkIHRvIE1hcnZlbGwuIFRoaXMgY29kZSBpcyBwcm92aWRlZCAiYXMgaXMiLgorKiBNYXJ2ZWxsIG1ha2VzIG5vIHdhcnJhbnRpZXMsIGV4cHJlc3MsIGltcGxpZWQgb3Igb3RoZXJ3aXNlLCByZWdhcmRpbmcgaXRzCisqIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3Mgb3IgcGVyZm9ybWFuY2UuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBtdkh3c0RkcjNNc3lzLmMKKyoKKyogREVTQ1JJUFRJT046IEREUjMgTVNZUyBnZW5lcmFsIGZ1bmN0aW9ucyoKKyogREVQRU5ERU5DSUVTOgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAibXZEZHIzVHJhaW5pbmdJcFBydklmLmgiCisKK0dUX1UzMiBwaHkxVmFsVGFibGVbRERSX0ZSRVFfTElNSVRdID0KK3sKKyAgMCwgICAvKiBERFJfRlJFUV9MT1dfRlJFUSAqLworICAweGYsIC8qIEREUl9GUkVRXzQwMCAqLworICAweGYsIC8qIEREUl9GUkVRXzUzMyAqLworICAweGYsIC8qIEREUl9GUkVRXzY2NyAqLworICAweGMsIC8qIEREUl9GUkVRXzgwMCAqLworICAweDgsIC8qIEREUl9GUkVRXzkzMyAqLworICAweDgsIC8qIEREUl9GUkVRXzEwNjYgKi8KKyAgMHhmLCAvKiBERFJfRlJFUV8zMTEgKi8KKyAgMHhmLCAvKiBERFJfRlJFUV8zMzMgKi8KKyAgMHhmLCAvKiBERFJfRlJFUV80NjcgKi8KKyAgMHhjLCAvKkREUl9GUkVRXzg1MCovCisgIDB4ZiwgLypERFJfRlJFUV82MDAqLworICAweGYsIC8qRERSX0ZSRVFfMzAwKi8KKyAgMHg4LCAgLypERFJfRlJFUV85MDAqLworICAweGYgIC8qRERSX0ZSRVFfMzYwKi8KK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqZXh0ZXJuYWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIE1WX0hXU19USVBfQ09ORklHX0ZVTkNfREIgY29uZmlnRnVuY0luZm9bSFdTX01BWF9ERVZJQ0VfTlVNXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorWFNCIEV4dGVybmFsIHJlYWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwRXh0UmVhZAorKAorICAgIEdUX1UzMiAgICAgIGRldk51bSwKKyAgICBHVF9VMzIgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICByZWdBZGRyLAorICAgIEdUX1UzMiAgICAgIG51bU9mQnVyc3RzLAorICAgIEdUX1UzMiAgICAgICpkYXRhCispCit7CisgICAgcmV0dXJuIGNvbmZpZ0Z1bmNJbmZvW2Rldk51bV0udGlwRXh0ZXJuYWxSZWFkKGRldk51bSxpbnRlcmZhY2VJZCxyZWdBZGRyLG51bU9mQnVyc3RzLGRhdGEpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitYU0IgRXh0ZXJuYWwgd3JpdGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0dUX1NUQVRVUyAgICBkZHIzVGlwRXh0V3JpdGUKKygKKyAgICBHVF9VMzIgICAgICBkZXZOdW0sCisgICAgR1RfVTMyICAgICAgaW50ZXJmYWNlSWQsCisgICAgR1RfVTMyICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICBudW1PZkJ1cnN0cywKKyAgICBHVF9VMzIgICAgICAqYWRkcgorKQoreworICAgIHJldHVybiBjb25maWdGdW5jSW5mb1tkZXZOdW1dLnRpcEV4dGVybmFsV3JpdGUoZGV2TnVtLGludGVyZmFjZUlkLHJlZ0FkZHIsbnVtT2ZCdXJzdHMsYWRkcik7Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM05QNS5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM05QNS5jCmluZGV4IDI2NTdmOGMuLjdkY2VkMDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNOUDUuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzTlA1LmMKQEAgLTY0LDcgKzY0LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiBwcmUtZGVjbGFyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogUmVhZCAxc3QgYWN0aXZlIGludGVyZmFjZSAqLwogZXh0ZXJuIEdUX1UzMiBtYXNrVHVuZUZ1bmM7Ci1leHRlcm4gR1RfVTMyIHJsVmVyc2lvbjsKIGV4dGVybiBNVl9IV1NfRERSX0ZSRVEgbWVkaXVtRnJlcTsKIGV4dGVybiBNVl9IV1NfRERSX0ZSRVEgbG93RnJlcTsKIGV4dGVybiBHVF9VMzIgaXNQbGxCZWZvcmVJbml0OwpAQCAtNzIsOCArNzEsOSBAQAogZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBpbml0RnJlcTsKIGV4dGVybiBHVF9VMzIgb2R0QWRkaXRpb25hbDsKIGV4dGVybiBHVF9VOCAgZGVidWdUcmFpbmluZzsKLWV4dGVybiBHVF9VMzIgZGVsYXlFbmFibGUsIGNrRGVsYXksIGNhRGVsYXksIGNrRGVsYXlfMTY7CitleHRlcm4gR1RfVTMyIGRlbGF5RW5hYmxlLCBja0RlbGF5LCBjYURlbGF5OwogZXh0ZXJuIEdUX1U4IGNhbGlicmF0aW9uVXBkYXRlQ29udHJvbDsgLyoyIGV4dGVybmFsIG9ubHksIDEgaXMgaW50ZXJuYWwgb25seSovCitleHRlcm4gR1RfVTMyIGRmc0xvd0ZyZXE7CiAKIGV4dGVybiBHVF9TVEFUVVMgZGRyM1RpcFJlZ1dyaXRlCiAoCkBAIC04OTksOCArODk5LDkgQEAKICAgICBNVl9IV1NfVElQX1NUQVRJQ19DT05GSUdfSU5GTyBzdGF0aWNDb25maWc7CiAgICAgTVZfSFdTX1RJUF9DT05GSUdfRlVOQ19EQiBjb25maWdGdW5jOwogICAgIE1WX0hXU19YU0JfSU5GTyAgICAgICAgIHhzYkluZm87CisJR1RfVTggbnVtT2ZCdXNQZXJJbnRlcmZhY2UgPSA0OwogCi0gICAgR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIE5QNV9OVU1CRVJfT0ZfSU5URVJGQUNFUyAqbnA1VG9wb2xvZ3lNYXBbYm9hcmRJZF0ubnVtT2ZCdXNQZXJJbnRlcmZhY2U7CisgICAgR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIE5QNV9OVU1CRVJfT0ZfSU5URVJGQUNFUyAqbnVtT2ZCdXNQZXJJbnRlcmZhY2U7CiAKIAlERUJVR19UUkFJTklOR19JUChERUJVR19MRVZFTF9JTkZPLCAoInJlZ2lzdGVyIGZ1bmN0aW9ucyBcbiIpKTsKIApAQCAtOTE3LDYgKzkxOCwxMyBAQAogCiAgICAgbXZId3NEZHIzVGlwSW5pdENvbmZpZ0Z1bmMoZGV2TnVtLCAmY29uZmlnRnVuYyk7CiAKKwkvKlNldCBkZXZpY2UgYXR0cmlidXRlcyovCisJZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYsIE1WX1RJUF9SRVZfMSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1BIWV9FREdFLCBNVl9ERFJfUEhZX0VER0VfTkVHQVRJVkUpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFLCBudW1PZkJ1c1BlckludGVyZmFjZSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX0lOVEVSTEVBVkVfV0EsIEdUX0ZBTFNFKTsKKwogI2lmZGVmIFNUQVRJQ19BTEdPX1NVUFBPUlQKICAgICBkZHIzVGlwSW5pdFN0YXRpY0NvbmZpZ0RiKGRldk51bSwgJnN0YXRpY0NvbmZpZyk7CiAjZW5kaWYKQEAgLTk0Myw3ICs5NTEsNiBAQAogICAgIGxvd0ZyZXEgPSBERFJfRlJFUV9MT1dfRlJFUTsKICAgICBtZWRpdW1GcmVxID0gRERSX0ZSRVFfNjY3OwogICAgIGlzUGxsQmVmb3JlSW5pdCA9IDE7Ci0gICAgcmxWZXJzaW9uID0gMDsKICAgICBpbml0RnJlcSA9IEREUl9GUkVRXzY2NzsKIAlkZWJ1Z1RyYWluaW5nID0gREVCVUdfTEVWRUxfSU5GTzsKIAlvZHRBZGRpdGlvbmFsID0gMDsKQEAgLTk1MSwxMCArOTU4LDkgQEAKIAlkZWxheUVuYWJsZSA9IDA7CiAJaWYoIGNrRGVsYXkgPT0gLTEgKQogCQlja0RlbGF5ID0gMTUwOwotCWlmKCBja0RlbGF5XzE2ID09IC0xICkKLQkJY2tEZWxheV8xNiA9IDA7CiAJY2FEZWxheSA9IDA7CiAJY2FsaWJyYXRpb25VcGRhdGVDb250cm9sID0gMTsKKwlmcmVxVmFsW0REUl9GUkVRX0xPV19GUkVRXSA9IGRmc0xvd0ZyZXEgPSAxMDA7CiAKICAgICByZXR1cm4gR1RfT0s7CiB9CmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzYTM4eC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9TaWxpY29uL212SHdzRGRyM2EzOHguYwppbmRleCAyNGU5Y2IxLi40MTIxMDRhIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NpbGljb24vbXZId3NEZHIzYTM4eC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU2lsaWNvbi9tdkh3c0RkcjNhMzh4LmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJkZHIzX2EzOHhfdGlwX3RyYWluaW5nX3N0YXRpYy5oIgogI2luY2x1ZGUgImRkcjNfaHdzX3NpbF90cmFpbmluZy5oIgogI2luY2x1ZGUgIm12WG9yLmgiCisjaW5jbHVkZSAibXZTeXNFbnZMaWIuaCIKIAogI2luY2x1ZGUgIm12SHdzRGRyM0EzOHguaCIKICNpbmNsdWRlICJtdlNpbGljb25JZi5oIgpAQCAtNDEsOSArNDIsMTMgQEAKIGV4dGVybiBHVF9VOCAgZGVidWdUcmFpbmluZ0EzOHg7CiBleHRlcm4gR1RfVTMyIGZpcnN0QWN0aXZlSWY7CiBleHRlcm4gTVZfSFdTX0REUl9GUkVRIGluaXRGcmVxOwotZXh0ZXJuIEdUX1UzMiBkZWxheUVuYWJsZSwgY2tEZWxheSwgY2tEZWxheV8xNiwgY2FEZWxheTsKLUdUX1UzMiAgcGlwZU11bHRpY2FzdE1hc2s7CitleHRlcm4gR1RfVTMyIGRlbGF5RW5hYmxlLCBja0RlbGF5LCBjYURlbGF5OworZXh0ZXJuIEdUX1UzMiBkZnNMb3dGcmVxOwogCitleHRlcm4gR1RfVTMyIG1vZGUyVDsKKworR1RfVTMyICBwaXBlTXVsdGljYXN0TWFzazsKK0dUX0JPT0wgZGRyM0FzeW5jTW9kZUF0VEYgPSBHVF9GQUxTRTsKICNkZWZpbmUgQTM4WF9OVU1fQllURVMgICAgICAgICAgICAgICAgICAoMykKICNkZWZpbmUgQTM4WF9OVU1CRVJfT0ZfSU5URVJGQUNFUwkJNQogCkBAIC01Niw0MiArNjEsMTQgQEAKIGV4dGVybiBNVl9CT09MIGRkcjNJZkVjY0VuYWJsZWQodm9pZCk7CiAvKioqKioqKioqKioqKioqKioqKioqKioqKiogcHJlLWRlY2xhcmF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGV4dGVybiBHVF9VMzIgbWFza1R1bmVGdW5jOwotZXh0ZXJuIEdUX1UzMiBybFZlcnNpb247CiBleHRlcm4gR1RfQk9PTCBybE1pZEZyZXFXQTsKIGV4dGVybiBHVF9VOCBjYWxpYnJhdGlvblVwZGF0ZUNvbnRyb2w7IC8qMiBleHRlcm5hbCBvbmx5LCAxIGlzIGludGVybmFsIG9ubHkqLworZXh0ZXJuIEdUX1UzMiBmcmVxVmFsW107CiAKLQotI2lmZGVmIENPTkZJR19ERFIzCi1zdGF0aWMgR1RfVTE2IGZyZXFWYWxbRERSX0ZSRVFfTElNSVRdID0KLXsKLSAgICAxMzAsIC8qRERSX0ZSRVFfTE9XX0ZSRVEqLwotICAgIDQwMCwgLypERFJfRlJFUV80MDAsKi8KLSAgICA1MzMsIC8qRERSX0ZSRVFfNTMzLCovCi0gICAgNjY2LCAvKkREUl9GUkVRXzY2NywqLwotICAgIDgwMCwgLypERFJfRlJFUV84MDAsKi8KLSAgICA5MzMsIC8qRERSX0ZSRVFfOTMzLCovCi0gICAxMDY2LCAvKkREUl9GUkVRXzEwNjYsKi8KLSAgICAzMTEsIC8qRERSX0ZSRVFfMzExLCovCi0gICAgMzMzLCAvKkREUl9GUkVRXzMzMywqLwotICAgIDQ2NywgLypERFJfRlJFUV80NjcsKi8KLSAgICA4NTAsIC8qRERSX0ZSRVFfODUwLCovCi0gICAgNjAwLCAvKkREUl9GUkVRXzYwMCwqLwotICAgIDMwMCwgLypERFJfRlJFUV8zMDAsKi8KLQk5MDAsICAvKkREUl9GUkVRXzkwMCovCi0JMzYwLCAgLypERFJfRlJFUV8zNjAqLwotCTEwMDAgIC8qRERSX0ZSRVFfMTAwMCovCi19OwotI2Vsc2UgLyogQ09ORklHX0REUjQgKi8KLXN0YXRpYyBHVF9VMTYgZnJlcVZhbFtERFJfRlJFUV9MSU1JVF0gPQotewotICAgIDEzMCwgICAgLyogRERSX0ZSRVFfTE9XX0ZSRVEgKi8KLSAgICA2NjYsICAgIC8qIEREUl9GUkVRXzY2NyAqLwotICAgIDgwMCwgICAgLyogRERSX0ZSRVFfODAwICovCi0gICAgOTMzLCAgICAvKiBERFJfRlJFUV85MzMgKi8KLSAgICAxMDY2LCAgLyogRERSX0ZSRVFfMTA2NiAqLwotCTkwMCAgCS8qRERSX0ZSRVFfOTAwKi8KLX07CisjaWZkZWYgQ09ORklHX0REUjQKK2V4dGVybiBHVF9VOAl2cmVmQ2FsaWJyYXRpb25XQTsgLyoxIG1lYW5zIFNTVEwgJiBQT0QgZ2V0cyB0aGUgc2FtZSBWcmVmIGFuZCBhIFdBIGlzIG5lZWRlZCovCiAjZW5kaWYKKwogZXh0ZXJuIE1WX0hXU19ERFJfRlJFUSBtZWRpdW1GcmVxOwogCiBleHRlcm4gR1RfU1RBVFVTIGRkcjNUaXBSZWdXcml0ZQpAQCAtMTM0LDYgKzExMSw5IEBACiAgICAgR1RfU1RBVFVTICAgICAgIGRldk51bSwKICAgICBNVl9IV1NfRERSX0ZSRVEgKmZyZXEKICk7CisKK0dUX1U4ICAgIGRkcjNUaXBDbG9ja01vZGUoIEdUX1UzMiBmcmVxdWVuY3kgKTsKKwogI2lmZGVmIENPTkZJR19ERFIzCiBHVF9TVEFUVVMgZGRyM1RpcEEzOHhHZXRNZWRpdW1GcmVxCiAoCkBAIC0xNzcsNiArMTU3LDcgQEAKICAgICAweDUsIC8qRERSX0ZSRVFfMTA2NiovCiAjaWZkZWYgQ09ORklHX0REUjQKIAkweDUsIC8qRERSX0ZSRVFfOTAwKi8KKwkweDUsIC8qRERSX0ZSRVFfMTAwMCovCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRERSMwogICAgIDB4MywgLypERFJfRlJFUV8zMTEqLwpAQCAtMTkzLDcgKzE3NCw2IEBACiAKIHN0YXRpYyBHVF9VOCBBMzh4UmF0ZVBlckZyZXFbRERSX0ZSRVFfTElNSVRdID0KIHsKLS8qVEJEKi8KICAgICAweDEsIC8qRERSX0ZSRVFfMTAwKi8KICNpZmRlZiBDT05GSUdfRERSMwogICAgIDB4MiwgLypERFJfRlJFUV80MDAqLwpAQCAtMjA1LDYgKzE4NSw3IEBACiAgICAgMHgzLCAvKkREUl9GUkVRXzEwNjYqLwogI2lmZGVmIENPTkZJR19ERFI0CiAJMHgyLCAvKkREUl9GUkVRXzkwMCovCisJMHgyLCAvKkREUl9GUkVRXzEwMDAqLwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0REUjMKICAgICAweDEsIC8qRERSX0ZSRVFfMzExKi8KQEAgLTIxOSw3ICsyMDAsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgR1RfVTE2IEEzOHhWY29GcmVxUGVyU2FyW10gPQorc3RhdGljIEdUX1UxNiBBMzh4VmNvRnJlcVBlclNhclJlZkNsazI1TWh6W10gPQogewogCTY2NiwgLyowKi8KIAkxMzMyLApAQCAtMjU0LDE2ICsyMzUsNjUgQEAKIAk4MDAKIH07CiAKLSNpZmRlZiBDT05GSUdfQVJNQURBXzM4WF9aMV9PQlNPTEVURQotR1RfVTMyIERRYml0TWFwMlBoeXBpbltdID0KK3N0YXRpYyBHVF9VMTYgQTM4eFZjb0ZyZXFQZXJTYXJSZWZDbGs0ME1oeltdID0KIHsKLSAgICAxLCAwLCAgMiwgMywgIDYsIDcsIDgsICA5LCAJLy8wCi0gICAgMCwgMSwgMTAsIDMsICA2LCA3LCA4LCAgOSwJLy8xCi0gICAgOCwgMSwgIDIsIDAsIDEwLCA5LCA2LCAgNywJLy8yCi0gICAgMCwgMSwgIDIsIDMsICA3LCA4LCA2LCAxMCwJLy8zCi0gICAgMCwgMSwgIDIsIDMsICA2LCA3LCA4LCAgOSwJLy80CisJNjY2LCAvKjAqLworCTEzMzIsCisJODAwLAorCTgwMCwgLyoweDMqLworCTEwNjYsCisJMTA2NiwgLyoweDUqLworCTEyMDAsCisJMjQwMCwKKwkxMzMyLAorCTEzMzIsCisJMTUwMCwvKjEwKi8KKwkxNjAwLCAvKjB4QiovCisJMTYwMCwKKwkxNjAwLAorCTE3MDAsCisJMTU2MCwgLyoweEYqLworCTE4NjYsCisJMTg2NiwKKwkxODAwLAorCTIwMDAsCisJMjAwMCwvKjIwKi8KKwk0MDAwLAorCTIxMzIsCisJMjEzMiwKKwkyMzAwLAorCTIzMDAsCisJMjQwMCwKKwkyNDAwLAorCTI1MDAsCisJMjUwMCwKKwkxODAwIC8qMzAgLSAweDFFKi8KIH07Ci0jZWxzZQorCitHVF9VMTYgQTM4eE9EVFNsb3BlW10gPQoreworCTIxNDQzLAorCTE0NTIsCisJNDgyLAorCTI0MCwKKwkxNDEsCisJOTAsCisJNjcsCisJNTIKK307CisKK0dUX1UxNiBBMzh4T0RUSW50ZXJjZXB0W10gPQoreworCTE1MTcsCisJMzI4LAorCTE4NiwKKwkxMzEsCisJMTAwLAorCTgwLAorCTY5LAorCTYxCit9OworCiBHVF9VMzIgRFFiaXRNYXAyUGh5cGluW10gPQogewogCTEsIDAsIDIsIDYsIDksIDgsIDMsIDcsCS8vMApAQCAtMjcyLDcgKzMwMiw2IEBACiAJMSwgMCwgNiwgMiwgOCwgMywgNywgOSwJLy8zCiAJMCwgMSwgMiwgOSwgNywgOCwgMywgNiwJLy80CiB9OwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yODUsOCArMzE0LDE0IEBACiAJR1RfMzIgcmVnID0gMDsKIAogCS8qIEluaXRpYXRlcyBUU0VOIGhhcmR3YXJlIHJlc2V0IG9uY2UgKi8KLQlpZiAoKE1WX1JFR19SRUFEKFRTRU5fQ09ORl9SRUcpICYgVFNFTl9DT05GX1JTVF9NQVNLKSA9PSAwKQotCQlNVl9SRUdfQklUX1NFVChUU0VOX0NPTkZfUkVHLCBUU0VOX0NPTkZfUlNUX01BU0spOworCWlmICgoTVZfUkVHX1JFQUQoVFNFTl9DT05UUk9MX01TQl9SRUcpICYgVFNFTl9DT05UUk9MX01TQl9SU1RfTUFTSykgPT0gMCkgeworCQlNVl9SRUdfQklUX1NFVChUU0VOX0NPTlRST0xfTVNCX1JFRywgVFNFTl9DT05UUk9MX01TQl9SU1RfTUFTSyk7CisJCS8qIHNldCBUc2VuIFRjIFRyaW0gdG8gY29ycmVjdCBkZWZhdWx0IHZhbHVlIChlcnJhdGEgIzEzMjY5OCkgKi8KKwkJcmVnID0gTVZfUkVHX1JFQUQoVFNFTl9DT05UUk9MX0xTQl9SRUcpOworCQlyZWcgJj0gflRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9NQVNLOworCQlyZWcgfD0gMHgzIDw8IFRTRU5fQ09OVFJPTF9MU0JfVENfVFJJTV9PRkZTRVQ7CisJCU1WX1JFR19XUklURShUU0VOX0NPTlRST0xfTFNCX1JFRywgcmVnKTsKKwl9CiAJbXZPc0RlbGF5KDEwKTsKIAogCS8qIENoZWNrIGlmIHRoZSByZWFkb3V0IGZpZWxkIGlzIHZhbGlkICovCkBAIC01MDEsNiArNTM2LDcgQEAKIAlNVl9IV1NfRERSX0ZSRVEgdWlEZHJGcmVxOwogCU1WX1NUQVRVUyBzdGF0dXM7CiAJTVZfSFdTX1RPUE9MT0dZX01BUCogdG9wb2xvZ3lNYXAgPSBkZHIzVGlwR2V0VG9wb2xvZ3lNYXAoZGV2TnVtKTsKKwlHVF9VOCBudW1PZkJ1c1BlckludGVyZmFjZSA9IDU7CiAKICAgICAvKiBuZXcgcmVhZCBsZXZlbGluZyB2ZXJzaW9uICovCiAgICAgY29uZmlnRnVuYy50aXBEdW5pdFJlYWRGdW5jID0gZGRyM1RpcEEzOHhJRlJlYWQ7CkBAIC01MTAsMTUgKzU0NiwyNyBAQAogCWNvbmZpZ0Z1bmMudGlwU2V0RnJlcURpdmlkZXJGdW5jID0gZGRyM1RpcEEzOHhTZXREaXZpZGVyOwogCWNvbmZpZ0Z1bmMudGlwR2V0RGV2aWNlSW5mb0Z1bmMgPSBkZHIzVGlwQTM4eEdldERldmljZUluZm87CiAJY29uZmlnRnVuYy50aXBHZXRUZW1wZXJhdHVyZSA9IGRkcjNDdHJsR2V0SnVuY1RlbXA7CisJY29uZmlnRnVuYy50aXBHZXRDbG9ja1JhdGlvID0gZGRyM1RpcENsb2NrTW9kZTsKIAogICAgIG12SHdzRGRyM1RpcEluaXRDb25maWdGdW5jKGRldk51bSwgJmNvbmZpZ0Z1bmMpOwogCiAJZGRyM1RpcFJlZ2lzdGVyRHFUYWJsZShkZXZOdW0sIERRYml0TWFwMlBoeXBpbik7CiAKKwkvKlNldCBkZXZpY2UgYXR0cmlidXRlcyovCisJZGRyM1RpcERldkF0dHJJbml0KGRldk51bSk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1RJUF9SRVYsIE1WX1RJUF9SRVZfNCk7CisJZGRyM1RpcERldkF0dHJTZXQoZGV2TnVtLCBNVl9BVFRSX1BIWV9FREdFLCBNVl9ERFJfUEhZX0VER0VfUE9TSVRJVkUpOworCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9PQ1RFVF9QRVJfSU5URVJGQUNFLCBudW1PZkJ1c1BlckludGVyZmFjZSk7CisjaWZkZWYgQ09ORklHX0FSTUFEQV8zOVgKKwlkZHIzVGlwRGV2QXR0clNldChkZXZOdW0sIE1WX0FUVFJfSU5URVJMRUFWRV9XQSwgR1RfVFJVRSk7CisjZWxzZQorCWRkcjNUaXBEZXZBdHRyU2V0KGRldk51bSwgTVZfQVRUUl9JTlRFUkxFQVZFX1dBLCBHVF9GQUxTRSk7CisjZW5kaWYKKwogI2lmZGVmIFNUQVRJQ19BTEdPX1NVUFBPUlQKIAl7CiAJCU1WX0hXU19USVBfU1RBVElDX0NPTkZJR19JTkZPIHN0YXRpY0NvbmZpZzsKLSAgICAJR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIEEzOFhfTlVNQkVSX09GX0lOVEVSRkFDRVMgKnRvcG9sb2d5TWFwLT5udW1PZkJ1c1BlckludGVyZmFjZTsKKyAgICAJR1RfVTMyIGJvYXJkT2Zmc2V0ID0gYm9hcmRJZCAqIEEzOFhfTlVNQkVSX09GX0lOVEVSRkFDRVMgKm51bU9mQnVzUGVySW50ZXJmYWNlOwogCiAJCXN0YXRpY0NvbmZpZy5zaWxpY29uRGVsYXkgPSBBMzh4U2lsaWNvbkRlbGF5T2Zmc2V0W2JvYXJkSWRdOwogCQlzdGF0aWNDb25maWcucGFja2FnZVRyYWNlQXJyID0gQTM4eFBhY2thZ2VSb3VuZFRyaXBEZWxheUFycmF5OwpAQCAtNTMyLDEzICs1ODAsMTEgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLSAgICBybFZlcnNpb24gPSAxOwogI2lmZGVmIENPTkZJR19ERFIzCiAgICAgbWFza1R1bmVGdW5jID0gICAgIChTRVRfTE9XX0ZSRVFfTUFTS19CSVQgfAogCQkJCQkJTE9BRF9QQVRURVJOX01BU0tfQklUIHwKIAkJCQkJCVNFVF9NRURJVU1fRlJFUV9NQVNLX0JJVCB8CiAJCQkJCQlXUklURV9MRVZFTElOR19NQVNLX0JJVCB8Ci0vLwkJCQkJCUxPQURfUEFUVEVSTl8yX01BU0tfQklUIHwKIAkJCQkJCVdSSVRFX0xFVkVMSU5HX1NVUFBfTUFTS19CSVQgfAogCQkJCQkJUkVBRF9MRVZFTElOR19NQVNLX0JJVCB8CiAJCQkJCQlQQlNfUlhfTUFTS19CSVQgfApAQCAtNTg4LDE4ICs2MzQsMzYgQEAKIAkJKTsKIAogCXJsTWlkRnJlcVdBID0gR1RfRkFMU0U7CisKKwkvKmRldGVjdCBpZiBWcmVmQ2FsaWIgV0EgbmVlZGVkIGJ5IGRldmljZSBJRChhMzgyIGRpZG4ndCBuZWVkIHRoaXMgV0EpKi8KKwlpZiggKChNVl9SRUdfUkVBRChERVZfSURfUkVHKSAmIDB4RkZGRjAwMDApID4+IDE2KSA9PSAweDY4MTEpeworCQltdlByaW50ZigidnJlZkNhbGlicmF0aW9uV0EgZGlzYWJsZWRcbiIpOworCQl2cmVmQ2FsaWJyYXRpb25XQSA9IDA7CisJfQorCisjaWYgMAorCS8qZGV0ZWN0IGlmIFZyZWZDYWxpYiBXQSBuZWVkZWQgYnkgcmV2aXNpb24gSUQoYTM5MCBBMCBkaWRuJ3QgbmVlZCB0aGlzIFdBKSovCisJaWYoICggKChNVl9SRUdfUkVBRChERVZfSURfUkVHKSAmIDB4RkZGRjAwMDApID4+IDE2KSA9PSAweDY5MjApICYmCisJCSgoKE1WX1JFR19SRUFEKERFVl9WRVJTSU9OX0lEX1JFRykgJiBSRVZJU09OX0lEX01BU0spID4+IFJFVklTT05fSURfT0ZGUykgPT0gMHg2KSApeworCQltdlByaW50ZigidnJlZkNhbGlicmF0aW9uV0EgZGlzYWJsZWRcbiIpOworCQl2cmVmQ2FsaWJyYXRpb25XQSA9IDA7CisJfQorI2VuZGlmCiAjZW5kaWYKIAotCWlmKCBja0RlbGF5ID09IC0xICkKKwlpZiggY2tEZWxheSA9PSBNVl9QQVJBTVNfVU5ERUZJTkVEICkKIAkJY2tEZWxheSA9IDE2MDsKLQlpZiggY2tEZWxheV8xNiA9PSAtMSApCi0JCWNrRGVsYXlfMTYgPSAxNjA7CiAJY2FEZWxheSA9IDA7CiAJZGVsYXlFbmFibGUgPSAxOwotCisJZnJlcVZhbFtERFJfRlJFUV9MT1dfRlJFUV0gPSBkZnNMb3dGcmVxID0gMTIwOwogCWNhbGlicmF0aW9uVXBkYXRlQ29udHJvbCA9IDE7CiAKLQlpbml0RnJlcSA9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcTsKKyNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAorICAgIC8qIEZvciBhMzh4IE9ubHksIGNoYW5nZSB0byAyVCBtb2RlIHRvIHJlc29sdmUgbG93IGZyZXEgaW5zdGFiaWxpdHkgKi8KKyAgICBtb2RlMlQgPSAxOworI2VuZGlmCisKKyAgICBpbml0RnJlcSA9IHRvcG9sb2d5TWFwLT5pbnRlcmZhY2VQYXJhbXNbZmlyc3RBY3RpdmVJZl0ubWVtb3J5RnJlcTsKIAogI2lmZGVmIENPTkZJR19ERFIzCiAgICAgZGRyM1RpcEEzOHhHZXRNZWRpdW1GcmVxKGRldk51bSwgJm1lZGl1bUZyZXEpOwpAQCAtNjQ1LDUxICs3MDksODkgQEAKICAgICBNVl9IV1NfRERSX0ZSRVEgKmZyZXEKICkKIHsKLQlHVF9VMzIgdWlSZWc7CisJR1RfVTMyIHVpUmVnLCByZWZDbGtTYXRSOwogCiAgICAgLyogUmVhZCBzYW1wbGUgYXQgcmVzZXQgc2V0dGluZyAqLwogICAgIHVpUmVnID0gKE1WX1JFR19SRUFEKFJFR19ERVZJQ0VfU0FSMV9BRERSKT4+IFJTVDJfQ1BVX0REUl9DTE9DS19TRUxFQ1RfSU5fT0ZGU0VUKSAmIFJTVDJfQ1BVX0REUl9DTE9DS19TRUxFQ1RfSU5fTUFTSzsKLSAgICBzd2l0Y2godWlSZWcpIHsKKworCXJlZkNsa1NhdFIgPSBNVl9SRUdfUkVBRChERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUcpOworCWlmKCgocmVmQ2xrU2F0UiA+PiBERVZJQ0VfU0FNUExFX0FUX1JFU0VUMl9SRUdfUkVGQ0xLX09GRlNFVCkgJiAweDEpID09IERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfMjVNSFopeworCQlzd2l0Y2godWlSZWcpIHsKKwkjaWZkZWYgQ09ORklHX0REUjMKKwkJY2FzZSAweDE6CisJCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfRVJST1IsICgiV2FybmluZzogVW5zdXBwb3J0ZWQgZnJlcSBtb2RlIGZvciAzMzNNaHogY29uZmlndXJlZCglZClcbiIsIHVpUmVnKSk7CisJCWNhc2UgMHgwOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV8zMzM7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDM6CisJCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfRVJST1IsICgiV2FybmluZzogVW5zdXBwb3J0ZWQgZnJlcSBtb2RlIGZvciA0MDBNaHogY29uZmlndXJlZCglZClcbiIsIHVpUmVnKSk7CisJCWNhc2UgMHgyOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisJCSAgICBicmVhazsKKwkJY2FzZSAweGQ6CisJCQlERUJVR19UUkFJTklOR19BQ0NFU1MoREVCVUdfTEVWRUxfRVJST1IsICgiV2FybmluZzogVW5zdXBwb3J0ZWQgZnJlcSBtb2RlIGZvciA1MzNNaHogY29uZmlndXJlZCglZClcbiIsIHVpUmVnKSk7CisJCWNhc2UgMHg0OgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV81MzM7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDY6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzYwMDsKKwkJICAgIGJyZWFrOworCSNlbmRpZgorCQljYXNlIDB4MTE6CisJCWNhc2UgMHgxNDoKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBmcmVxIG1vZGUgZm9yIDY2N01oeiBjb25maWd1cmVkKCVkKVxuIiwgdWlSZWcpKTsKKwkJY2FzZSAweDg6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzY2NzsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MTU6CisJCWNhc2UgMHgxYjoKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBmcmVxIG1vZGUgZm9yIDgwME1oeiBjb25maWd1cmVkKCVkKVxuIiwgdWlSZWcpKTsKKwkJY2FzZSAweEM6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzgwMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MTA6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzkzMzsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MTI6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzkwMDsKKwkJICAgIGJyZWFrOwogI2lmZGVmIENPTkZJR19ERFIzCi0gICAgY2FzZSAweDA6Ci0gICAgY2FzZSAweDE6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfMzMzOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4MjoKLSAgICBjYXNlIDB4MzoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg0OgotICAgIGNhc2UgMHhkOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzUzMzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDY6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfNjAwOwotICAgICAgICBicmVhazsKKwkJY2FzZSAweDEzOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV85MzM7CisJCQlkZHIzQXN5bmNNb2RlQXRURiA9IEdUX1RSVUU7CisJCSAgICBicmVhazsKKyNlbHNlCisJCWNhc2UgMHgxMzoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfMTAwMDsKKwkJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJXYXJuaW5nOiBVbnN1cHBvcnRlZCBmcmVxIG1vZGUgZm9yIDEwMDBNaHogY29uZmlndXJlZCglZClcbiIsIHVpUmVnKSk7CisJCSAgICBicmVhazsKICNlbmRpZgotICAgIGNhc2UgMHg4OgotCWNhc2UgMHgxMToKLQljYXNlIDB4MTQ6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfNjY3OwotICAgICAgICBicmVhazsKLQljYXNlIDB4QzoKLQljYXNlIDB4MTU6Ci0JY2FzZSAweDFiOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzgwMDsKLSAgICAgICAgYnJlYWs7Ci0JY2FzZSAweDEwOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzkzMzsKLSAgICAgICAgYnJlYWs7Ci0JY2FzZSAweDEyOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzkwMDsKLSAgICAgICAgYnJlYWs7Ci0JY2FzZSAweDEzOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzkwMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgKmZyZXEgPSAwOwotCSAgICByZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKLSAgICB9CisJCWRlZmF1bHQ6CisJCSAgICAqZnJlcSA9IDA7CisJCQlyZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKKwkJfQorCX0KKwllbHNleyAvKlJFRkNMSyA0MCBNSFogY2FzZSovCisJCXN3aXRjaCh1aVJlZykgeworCSNpZmRlZiBDT05GSUdfRERSMworCQljYXNlIDB4MzoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOworCQkgICAgYnJlYWs7CisJCWNhc2UgMHg1OgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV81MzM7CisJCSAgICBicmVhazsKKwkjZW5kaWYKKwkJY2FzZSAweEI6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzgwMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MUU6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzkwMDsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgKmZyZXEgPSAwOworCQkJcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7CisgICAgCX0KKwl9CiAgICAgcmV0dXJuIEdUX09LOwogfQogCkBAIC03MDAsNTAgKzgwMiw3NSBAQAogICAgIE1WX0hXU19ERFJfRlJFUSAqZnJlcQogKQogewotCUdUX1UzMiB1aVJlZzsKKwlHVF9VMzIgdWlSZWcsIHJlZkNsa1NhdFI7CiAKICAgICAvKiBSZWFkIHNhbXBsZSBhdCByZXNldCBzZXR0aW5nICovCiAgICAgdWlSZWcgPSAoTVZfUkVHX1JFQUQoUkVHX0RFVklDRV9TQVIxX0FERFIpPj4gUlNUMl9DUFVfRERSX0NMT0NLX1NFTEVDVF9JTl9PRkZTRVQpICYgUlNUMl9DUFVfRERSX0NMT0NLX1NFTEVDVF9JTl9NQVNLOwotICAgIHN3aXRjaCh1aVJlZykgewotICAgIGNhc2UgMHgwOgotICAgIGNhc2UgMHgxOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzMzMzsgLypNZWRpdW0gaXMgc2FtZSBhcyBURiB0byBydW4gUEJTIGluIHRoaXMgZnJlcSovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgyOgotICAgIGNhc2UgMHgzOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsgLypNZWRpdW0gaXMgc2FtZSBhcyBURiB0byBydW4gUEJTIGluIHRoaXMgZnJlcSovCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg0OgotICAgIGNhc2UgMHhkOgotICAgICAgICAqZnJlcSA9IEREUl9GUkVRXzUzMzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDg6Ci0JY2FzZSAweDExOgotCWNhc2UgMHgxNDoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV8zMzM7Ci0gICAgICAgIGJyZWFrOwotCWNhc2UgMHhDOgotCWNhc2UgMHgxNToKLQljYXNlIDB4MWI6Ci0gICAgICAgICpmcmVxID0gRERSX0ZSRVFfNDAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDB4NjoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV8zMDA7Ci0gICAgICAgIGJyZWFrOwotCWNhc2UgMHgxMjoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV8zNjA7Ci0gICAgICAgIGJyZWFrOwotCWNhc2UgMHgxMzoKLSAgICAgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgICpmcmVxID0gMDsKLQkgICAgcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7Ci0gICAgfQorCisJcmVmQ2xrU2F0UiA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFRyk7CisJaWYoKChyZWZDbGtTYXRSID4+IERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfT0ZGU0VUKSAmIDB4MSkgPT0gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS18yNU1IWil7CisJCXN3aXRjaCh1aVJlZykgeworCQljYXNlIDB4MToKKwkJY2FzZSAweDA6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzMzMzsgLypNZWRpdW0gaXMgc2FtZSBhcyBURiB0byBydW4gUEJTIGluIHRoaXMgZnJlcSovCisJCSAgICBicmVhazsKKwkJY2FzZSAweDM6CisJCWNhc2UgMHgyOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7IC8qTWVkaXVtIGlzIHNhbWUgYXMgVEYgdG8gcnVuIFBCUyBpbiB0aGlzIGZyZXEqLworCQkgICAgYnJlYWs7CisJCWNhc2UgMHhkOgorCQljYXNlIDB4NDoKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNTMzOy8qTWVkaXVtIGlzIHNhbWUgYXMgVEYgdG8gcnVuIFBCUyBpbiB0aGlzIGZyZXEqLworCQkgICAgYnJlYWs7CisJCWNhc2UgMHg4OgorCQljYXNlIDB4MTE6CisJCWNhc2UgMHgxNDoKKwkJY2FzZSAweDEwOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV8zMzM7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDE1OgorCQljYXNlIDB4MWI6CisJCWNhc2UgMHhDOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDY6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzMwMDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MTI6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzM2MDsKKwkJICAgIGJyZWFrOworCQljYXNlIDB4MTM6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsKKwkJICAgIGJyZWFrOworCQlkZWZhdWx0OgorCQkgICAgKmZyZXEgPSAwOworCQkJcmV0dXJuIE1WX05PVF9TVVBQT1JURUQ7CisJCX0KKwl9CisJZWxzZXsgLypSRUZDTEsgNDAgTUhaIGNhc2UqLworCQlzd2l0Y2godWlSZWcpIHsKKwkJY2FzZSAweDM6CisJCSAgICAqZnJlcSA9IEREUl9GUkVRXzQwMDsvKk1lZGl1bSBpcyBzYW1lIGFzIFRGIHRvIHJ1biBQQlMgaW4gdGhpcyBmcmVxKi8KKwkJICAgIGJyZWFrOworCQljYXNlIDB4NToKKwkJICAgICpmcmVxID0gRERSX0ZSRVFfNTMzOy8qTWVkaXVtIGlzIHNhbWUgYXMgVEYgdG8gcnVuIFBCUyBpbiB0aGlzIGZyZXEqLworCQkgICAgYnJlYWs7CisJCWNhc2UgMHhCOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV80MDA7CisJCSAgICBicmVhazsKKwkJY2FzZSAweDFFOgorCQkgICAgKmZyZXEgPSBERFJfRlJFUV8zNjA7CisJCSAgICBicmVhazsKKwkJZGVmYXVsdDoKKwkJICAgICpmcmVxID0gMDsKKwkJCXJldHVybiBNVl9OT1RfU1VQUE9SVEVEOworCQl9CisJfQogICAgIHJldHVybiBHVF9PSzsKIH0KICNlbmRpZgogCisKIEdUX1UzMiBkZHIzVGlwR2V0SW5pdEZyZXEoKQogewogICAgIE1WX0hXU19ERFJfRlJFUSBmcmVxOwpAQCAtNzYzLDcgKzg5MCw3IEBACiApCiB7CiAJR1RfVTMyIGRpdmlkZXIgPSAwOwotICAgIEdUX1UzMiBzYXJWYWw7CisgICAgR1RfVTMyIHNhclZhbCwgcmVmQ2xrU2F0UjsKIAogCWlmIChpbnRlcmZhY2VJZCAhPSAwKSB7CiAJCURFQlVHX1RSQUlOSU5HX0FDQ0VTUyhERUJVR19MRVZFTF9FUlJPUiwgKCJBMzh4IGRvZXMgbm90IHN1cHBvcnQgaW50ZXJmYWNlIDB4JXhcbiIsIGludGVyZmFjZUlkKSk7CkBAIC03NzMsNTIgKzkwMCw4MSBAQAogCS8qIGdldCBWQ08gZnJlcSBpbmRleCAqLwogCXNhclZhbCA9IChNVl9SRUdfUkVBRChSRUdfREVWSUNFX1NBUjFfQUREUik+PiBSU1QyX0NQVV9ERFJfQ0xPQ0tfU0VMRUNUX0lOX09GRlNFVCkgJiBSU1QyX0NQVV9ERFJfQ0xPQ0tfU0VMRUNUX0lOX01BU0s7CiAKLSAgICBkaXZpZGVyID0gQTM4eFZjb0ZyZXFQZXJTYXJbc2FyVmFsXS9mcmVxVmFsW2ZyZXF1ZW5jeV07Ci0KLQkvKlNldCBTeW5jIG1vZGUqLwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgyMDIyMCwgMHgwLCAweDEwMDApKTsKLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyRjQsIDB4MCwgMHgyMDApKTsKLQotCS8qIGNwdXBsbF9jbGtkaXZfcmVzZXRfbWFzayAqLyAKLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjQsIDB4MWYsIDB4RkYpKTsKLQotCS8qIGNwdXBsbF9jbGtkaXZfcmVsb2FkX3Ntb290aCAqLyAKLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsICgweDIgPDwgOCksICgweEZGIDw8IDgpKSk7Ci0KLQkvKiBjcHVwbGxfY2xrZGl2X3JlbGF4X2VuICovCi0JQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MjYwLCAoMHgyIDw8IDI0KSwgKDB4RkYgPDwgMjQpKSk7Ci0KLQkvKiB3cml0ZSB0aGUgZGl2aWRlciAqLwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2OCwgKGRpdmlkZXIgPDwgOCksICgweDNGIDw8IDgpKSk7Ci0KLQkvKiBzZXQgY3B1cGxsX2Nsa2Rpdl9yZWxvYWRfcmF0aW8gKi8KLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjQsICgxIDw8IDgpLCAoMSA8PCA4KSkpOwotCi0JLyogdW5kZXQgY3B1cGxsX2Nsa2Rpdl9yZWxvYWRfcmF0aW8gKi8KLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjQsIDAsICgxIDw8IDgpKSk7Ci0KLQkvKiBjbGVhciBjcHVwbGxfY2xrZGl2X3JlbG9hZF9mb3JjZSAqLwotCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2MCwgMCwgKDB4RkYgPDwgOCkpKTsKLQotCS8qIGNsZWFyIGNwdXBsbF9jbGtkaXZfcmVsYXhfZW4gKi8KLQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsIDAsICgweEZGIDw8IDI0KSkpOwotCi0JLyogY2xlYXIgY3B1cGxsX2Nsa2Rpdl9yZXNldF9tYXNrICovCi0JQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MjY0LCAwLCAweEZGKSk7Ci0KLQkvKiBEdW5pdCB0cmFpbmluZyBjbG9jayArIDE6MSBtb2RlICovCi0JaWYoKGZyZXF1ZW5jeSA9PSBERFJfRlJFUV9MT1dfRlJFUSkgfHwgKGZyZXFWYWxbZnJlcXVlbmN5XSA8PSA0MDApKSB7Ci0JCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgxODQ4OCwgKDEgPDwgMTYpLCAoMSA8PCAxNikpKTsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE1MjQsICgwIDw8IDE1KSwgKDEgPDwgMTUpKSk7CisJcmVmQ2xrU2F0UiA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFRyk7CisJaWYoKChyZWZDbGtTYXRSID4+IERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfT0ZGU0VUKSAmIDB4MSkgPT0gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS18yNU1IWil7CisgICAgCWRpdmlkZXIgPSBBMzh4VmNvRnJlcVBlclNhclJlZkNsazI1TWh6W3NhclZhbF0vZnJlcVZhbFtmcmVxdWVuY3ldOwogCX0KLQllbHNlIHsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE4NDg4LCAwLCAoMSA8PCAxNikpKTsKLQkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE1MjQsICgxIDw8IDE1KSwgKDEgPDwgMTUpKSk7CisJZWxzZXsKKyAgICAJZGl2aWRlciA9IEEzOHhWY29GcmVxUGVyU2FyUmVmQ2xrNDBNaHpbc2FyVmFsXS9mcmVxVmFsW2ZyZXF1ZW5jeV07CiAJfQogCisJaWYoIChkZHIzQXN5bmNNb2RlQXRURiA9PSBHVF9UUlVFKSAmJiAoZnJlcVZhbFtmcmVxdWVuY3ldID4gNDAwKSApeworCisJCS8qU2V0IEFzeW5jIE1vZGUqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4MjAyMjAsIDB4MTAwMCwgMHgxMDAwKSk7CisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDJGNCwgMHgyMDAsIDB4MjAwKSk7CisKKwkJLypXYWl0IGZvciBBc3VuYyBtb2RlIHNldHVwKi8KKwkJbXZPc0RlbGF5KDUpOworCisJCS8qU2V0IEtOTCB2YWx1ZXMqLworCQlpZiggZnJlcXVlbmN5ID09IEREUl9GUkVRXzkzMyl7CisJCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyRjAsIDB4ODA0QTAwMiwgMHhGRkZGRkZGRikpOworCQl9CisJfQorCWVsc2V7CisJCS8qU2V0IFN5bmMgbW9kZSovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgyMDIyMCwgMHgwLCAweDEwMDApKTsKKwkJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweEU0MkY0LCAweDAsIDB4MjAwKSk7CisKKwkJLyogY3B1cGxsX2Nsa2Rpdl9yZXNldF9tYXNrICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgMHgxZiwgMHhGRikpOworCisJCS8qIGNwdXBsbF9jbGtkaXZfcmVsb2FkX3Ntb290aCAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsICgweDIgPDwgOCksICgweEZGIDw8IDgpKSk7CisKKwkJLyogY3B1cGxsX2Nsa2Rpdl9yZWxheF9lbiAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsICgweDIgPDwgMjQpLCAoMHhGRiA8PCAyNCkpKTsKKworCQkvKiB3cml0ZSB0aGUgZGl2aWRlciAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjgsIChkaXZpZGVyIDw8IDgpLCAoMHgzRiA8PCA4KSkpOworCisJCS8qIHNldCBjcHVwbGxfY2xrZGl2X3JlbG9hZF9yYXRpbyAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjQsICgxIDw8IDgpLCAoMSA8PCA4KSkpOworCisJCS8qIHVuZGV0IGNwdXBsbF9jbGtkaXZfcmVsb2FkX3JhdGlvICovCisJCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHhFNDI2NCwgMCwgKDEgPDwgOCkpKTsKKworCQkvKiBjbGVhciBjcHVwbGxfY2xrZGl2X3JlbG9hZF9mb3JjZSAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsIDAsICgweEZGIDw8IDgpKSk7CisKKwkJLyogY2xlYXIgY3B1cGxsX2Nsa2Rpdl9yZWxheF9lbiAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjAsIDAsICgweEZGIDw8IDI0KSkpOworCisJCS8qIGNsZWFyIGNwdXBsbF9jbGtkaXZfcmVzZXRfbWFzayAqLworCQlDSEVDS19TVEFUVVMoZGRyM1RpcEEzOHhJRldyaXRlKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgaW50ZXJmYWNlSWQsIDB4RTQyNjQsIDAsIDB4RkYpKTsKKwl9CisKKwkvKiBEdW5pdCB0cmFpbmluZyBjbG9jayArIDE6MS8yOjEgbW9kZSAqLworCUNIRUNLX1NUQVRVUyhkZHIzVGlwQTM4eElGV3JpdGUoZGV2TnVtLCBBQ0NFU1NfVFlQRV9VTklDQVNULCBpbnRlcmZhY2VJZCwgMHgxODQ4OCwgKChkZHIzVGlwQ2xvY2tNb2RlKGZyZXF1ZW5jeSkgJiAweDEpIDw8IDE2KSwgKDEgPDwgMTYpKSk7CisJQ0hFQ0tfU1RBVFVTKGRkcjNUaXBBMzh4SUZXcml0ZShkZXZOdW0sIEFDQ0VTU19UWVBFX1VOSUNBU1QsIGludGVyZmFjZUlkLCAweDE1MjQsICgoZGRyM1RpcENsb2NrTW9kZShmcmVxdWVuY3kpLTEpIDw8IDE1KSwgKDEgPDwgMTUpKSk7CisKIAlyZXR1cm4gR1RfT0s7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogcmV0dXJuIDEgb2YgY29yZS9EVU5JVCBjbG9jayByYXRpb24gaXMgMSBmb3IgZ2l2ZW4gZnJlcSwgMCBpZiBjbG9jayByYXRpb3MgaXMgMjoxCisqLworR1RfVTggICAgZGRyM1RpcENsb2NrTW9kZSggR1RfVTMyIGZyZXF1ZW5jeSApCit7CisJaWYoKGZyZXF1ZW5jeSA9PSBERFJfRlJFUV9MT1dfRlJFUSkgfHwgKGZyZXFWYWxbZnJlcXVlbmN5XSA8PSA0MDApKXsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2V7CisJCXJldHVybiAyOworCX0KK30KKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGV4dGVybmFsIHJlYWQgZnJvbSBtZW1vcnkKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfaHdzX2h3X3RyYWluaW5nLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX2h3c19od190cmFpbmluZy5jCmluZGV4IDgxN2I4NGUuLmJlM2IwZTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfaHdzX2h3X3RyYWluaW5nLmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19od3NfaHdfdHJhaW5pbmcuYwpAQCAtMTExLDExICsxMTEsMTAgQEAKIAogTVZfU1RBVFVTIGRkcjNId3NId1RyYWluaW5nKHZvaWQpCiB7Ci0KIAlNVl9IV1NfQUxHT19UWVBFIGFsZ29Nb2RlID0gQUxHT19UWVBFX0RZTkFNSUM7CiAJTVZfU1RBVFVTIHN0YXR1czsKIAlJbml0Q250clBhcmFtIGluaXRQYXJhbTsKLQkKKwogCXN0YXR1cyA9IGRkcjNTaWxpY29uUHJlSW5pdCgpOwogCWlmIChNVl9PSyAhPSBzdGF0dXMpIHsKIAkJbXZQcmludGYoIkREUjMgUHJlIHNpbGljb24gQ29uZmlnIC0gRkFJTEVEIDB4JXhcbiIsIHN0YXR1cyk7CkBAIC0xMjMsMTIgKzEyMiwxMiBAQAogCX0KIAogCWluaXRQYXJhbS5kb01yc1BoeSA9IEdUX1RSVUU7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgIHx8IGRlZmluZWQoQ09ORklHX0FSTUFEQV8zOVgpCisjaWYgIWRlZmluZWQgKENPTkZJR19CT0JDQVQyKQogCWluaXRQYXJhbS5pc0N0cmw2NEJpdCA9IEdUX0ZBTFNFOwogI2Vsc2UKIAlpbml0UGFyYW0uaXNDdHJsNjRCaXQgPSBHVF9UUlVFOwogI2VuZGlmCi0jaWYgZGVmaW5lZCAoQ09ORklHX0FMTEVZQ0FUMykgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM4WCkgfHwgZGVmaW5lZChDT05GSUdfQVJNQURBXzM5WCkKKyNpZiAhZGVmaW5lZCAoQ09ORklHX0JPQkNBVDIpCiAgICAgaW5pdFBhcmFtLmluaXRQaHkgPSBHVF9UUlVFOwogI2Vsc2UKICAgICBpbml0UGFyYW0uaW5pdFBoeSA9IEdUX0ZBTFNFOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19tc3lzX2JjMl90cmFpbmluZy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvZGRyM2xpYnYyL3NyYy9Tb2MvZGRyM19tc3lzX2JjMl90cmFpbmluZy5jCmluZGV4IDZlM2YxMDcuLmE3NjAzODggMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfbXN5c19iYzJfdHJhaW5pbmcuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX21zeXNfYmMyX3RyYWluaW5nLmMKQEAgLTIyMiw3ICsyMjIsNiBAQAogCU1WX1NUQVRVUyBzdGF0dXM7CiAKIAlnZW5lcmljSW5pdENvbnRyb2xsZXIgPSAxOwotCW12UHJpbnRmKCI+Pj4gc2V0dGluZyBnZW5lcmljSW5pdENvbnRyb2xsZXIgPSAxXG4iKTsKIAogCS8vc3RhdHVzID0gZGRyM1RpcEluaXRCYzJTaWxpY29uKDAsIDEpOwogCXN0YXR1cyA9IGRkcjNUaXBJbml0QmMyKDAsIDApOwpAQCAtMzU0LDggKzM1Myw2IEBACiAKIAlzZXJ2ZXJCYXNlQWRkciA9IE1WX1JFR19SRUFEKFJFR19YQkFSX1dJTl81X0JBU0VfQUREUik7CiAKLQltdlByaW50ZigiY29uZmlndXJlU2VydmVyV2luZG93czogU2VydmVyIGJhc2UgaXMgMHgleFxuIiwgc2VydmVyQmFzZUFkZHIpOwotCiAJLyogaW5pdCBzZXJ2ZXIgYWNjZXNzICovCiAJaHdzU2VydmVyUmVnU2V0RnVuY1B0ciA9IHNlcnZlclJlZ1NldDsgCiAJaHdzU2VydmVyUmVnR2V0RnVuY1B0ciA9IHNlcnZlclJlZ0dldDsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2RkcjNsaWJ2Mi9zcmMvU29jL2RkcjNfbXN5c19ib2JrX3RyYWluaW5nLmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX21zeXNfYm9ia190cmFpbmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM3MzY0ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9kZHIzbGlidjIvc3JjL1NvYy9kZHIzX21zeXNfYm9ia190cmFpbmluZy5jCkBAIC0wLDAgKzEsMzQxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgICAgICAgICAgICAgICBDb3B5cmlnaHQgMjAwMSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4KKyogVGhpcyBjb2RlIGNvbnRhaW5zIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiBvZiBNYXJ2ZWxsIHNlbWljb25kdWN0b3IsIGluYy4KKyogbm8gcmlnaHRzIGFyZSBncmFudGVkIGhlcmVpbiB1bmRlciBhbnkgcGF0ZW50LCBtYXNrIHdvcmsgcmlnaHQgb3IgY29weXJpZ2h0CisqIG9mIE1hcnZlbGwgb3IgYW55IHRoaXJkIHBhcnR5LgorKiBNYXJ2ZWxsIHJlc2VydmVzIHRoZSByaWdodCBhdCBpdHMgc29sZSBkaXNjcmV0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGlzIGNvZGUKKyogYmUgaW1tZWRpYXRlbHkgcmV0dXJuZWQgdG8gTWFydmVsbC4gVGhpcyBjb2RlIGlzIHByb3ZpZGVkICJhcyBpcyIuCisqIE1hcnZlbGwgbWFrZXMgbm8gd2FycmFudGllcywgZXhwcmVzcywgaW1wbGllZCBvciBvdGhlcndpc2UsIHJlZ2FyZGluZyBpdHMKKyogYWNjdXJhY3ksIGNvbXBsZXRlbmVzcyBvciBwZXJmb3JtYW5jZS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGRkcjNfbXN5c190cmFpbmluZy5jCisqCisqIERFU0NSSVBUSU9OOiAKKyoKKyoKKyogREVQRU5ERU5DSUVTOgorKgorKiBGSUxFIFJFVklTSU9OIE5VTUJFUjoKKyogICAgICAgJFJldmlzaW9uOiAxICQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIm12X29zLmgiCisjaW5jbHVkZSAiZGRyM19tc3lzX2JvYmsuaCIKKyNpbmNsdWRlICJkZHIzX21zeXNfYm9ia19jb25maWcuaCIKKyNpbmNsdWRlICJkZHIzX2h3c19zaWxfdHJhaW5pbmcuaCIKKyNpbmNsdWRlICJtdlNpbGljb25JZi5oIgorI2luY2x1ZGUgIm12RGRyM1RyYWluaW5nSXBQcnZJZi5oIgorI2luY2x1ZGUgIm12SHdzRGRyM0JvYksuaCIKKyNpbmNsdWRlICJzb2Nfc3BlYy5oIgorI2luY2x1ZGUgInByaW50Zi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogZ2xvYmFscyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBNVl9TRVJWRVJfUkVHX0FDQ0VTU19TRVQgaHdzU2VydmVyUmVnU2V0RnVuY1B0cjsKK2V4dGVybiBNVl9TRVJWRVJfUkVHX0FDQ0VTU19HRVQgaHdzU2VydmVyUmVnR2V0RnVuY1B0cjsKKworR1RfVTMyIHNlcnZlckJhc2VBZGRyID0gMDsKKy8qIHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgc2V0IGluIGRkcjNUaXBEeW5hbWljUmVhZExldmVsaW5nICovCisKKworZXh0ZXJuIEdUX1UzMiBnZW5lcmljSW5pdENvbnRyb2xsZXI7CitleHRlcm4gR1RfVTMyIGRlYnVnQm9iSzsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIHByZS1kZWNsYXJhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworR1RfU1RBVFVTICAgIGRkcjNEdW5pdEFjY2Vzc1JlYWQKKygKKyAgICBHVF9VOCAgICAgICAgICAgICAgICAgZGV2TnVtLAorICAgIE1WX0hXU19BQ0NFU1NfVFlQRSAgICBpbnRlcmZhY2VBY2Nlc3MsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIGludGVyZmFjZUlkLCAKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwgCisgICAgR1RfVTMyICAgICAgICAgICAgICAgICpkYXRhLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrIAorKTsKKworR1RfU1RBVFVTICAgIGRkcjNEdW5pdEFjY2Vzc1dyaXRlCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwgCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIHJlZ0FkZHIsIAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBkYXRhVmFsdWUsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sgCispOworCitHVF9TVEFUVVMgZGRyM0R1bml0QWNjZXNzSW5pdAorKAorICAgIEdUX1UzMiAgZGV2TnVtLAorICAgIEdUX1UzMiAgYm9hcmRJZAorKTsKKworTVZfVk9JRCBjb25maWd1cmVTZXJ2ZXJXaW5kb3dzKHZvaWQpOworCitleHRlcm4gR1RfU1RBVFVTIGRkcjNUaXBCb2JLR2V0RnJlcUNvbmZpZworKAorCUdUX1U4CQkJCQkJCWRldk51bSwKKyAgICBNVl9IV1NfRERSX0ZSRVEgICAgICAgICAgICAgICAgIGZyZXEsCisJTVZfSFdTX1RJUF9GUkVRX0NPTkZJR19JTkZPCQkqZnJlcUNvbmZpZ0luZm8KKyk7CisKK2V4dGVybiBHVF9TVEFUVVMgZGRyM1RpcEJvYktTZXREaXZpZGVyCisoCisJR1RfVTgJCQkJCQkJZGV2TnVtLAorCUdUX1UzMgkJCQkJCQlpbnRlcmZhY2VJZCwKKyAgICBNVl9IV1NfRERSX0ZSRVEgICAgICAgICAgICAgICAgIGZyZXEKKyk7CisKK2V4dGVybiBHVF9TVEFUVVMgZGRyM1RpcEluaXRCb2JLU2lsaWNvbgorKAorICAgIEdUX1UzMiAgZGV2TnVtLAorICAgIEdUX1UzMiAgYm9hcmRJZAorKTsKK2V4dGVybiBHVF9TVEFUVVMgZGRyM1RpcEJvYktHZXRJbml0RnJlcQorKAorICAgIEdUX1NUQVRVUyAgICAgICBkZXZOdW0sCisJR1RfVTMyCQkJaW50ZXJmYWNlSWQsCisgICAgTVZfSFdTX0REUl9GUkVRICpmcmVxCispOworCitHVF9TVEFUVVMgICAgZGRyM1RpcEJvYktTZWxlY3RDUFVEZHJDb250cm9sbGVyCisoCisgICAgR1RfVTggICAgZGV2TnVtLAorICAgIEdUX0JPT0wgIGVuYWJsZQorKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBOYW1lOiAgICAgc2VydmVyUmVnU2V0LgorKiBEZXNjOiAgICAgZGVmaW5pdGlvbiBvZiBzZXJ2ZXIgd3JpdGUgcHJvdG90eXBlCisqIEFyZ3M6ICAgICBUQkQKKyogTm90ZXM6CisqIFJldHVybnM6ICBPSyBpZiBzdWNjZXNzLCBvdGhlciBlcnJvciBjb2RlIGlmIGZhaWwuCisqLworR1RfU1RBVFVTIHNlcnZlclJlZ1NldAorKAorICAgIEdUX1U4IGRldk51bSwKKyAgICBHVF9VMzIgYWRkciwKKyAgICBHVF9VMzIgZGF0YQorKQoreworCWlmKHNlcnZlckJhc2VBZGRyID09IDApIHsKKwkJbXZQcmludGYoIlNlcnZlciB3aW5kb3dzIHdlcmUgbm90IGluaXRpYWxpemVkXG4iLCAwKTsKKwkJcmV0dXJuIEdUX05PVF9JTklUSUFMSVpFRDsKKwl9CisKKwkqKCh2b2xhdGlsZSB1bnNpZ25lZCBpbnQqKShzZXJ2ZXJCYXNlQWRkcithZGRyKSkgPSBkYXRhOworICAgIC8vbXZQcmludGYoInNlcnZlclJlZ1NldCAweCV4ID0weCV4XG4iLGFkZHIsZGF0YSk7CisKKwlyZXR1cm4gR1RfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTmFtZTogICAgIHNlcnZlclJlZ0dldC4KKyogRGVzYzogICAgIGRlZmluaXRpb24gb2Ygc2VydmVyIHJlYWQgcHJvdG90eXBlCisqIEFyZ3M6ICAgICBUQkQKKyogTm90ZXM6ICAgIAorKiBSZXR1cm5zOiAgT0sgaWYgc3VjY2Vzcywgb3RoZXIgZXJyb3IgY29kZSBpZiBmYWlsLgorKi8KK0dUX1NUQVRVUyBzZXJ2ZXJSZWdHZXQKKygKKyAgICBHVF9VOCBkZXZOdW0sIAorICAgIEdUX1UzMiBhZGRyLCAKKyAgICBHVF9VMzIgKmRhdGEKKykKK3sKKwlpZihzZXJ2ZXJCYXNlQWRkciA9PSAwKSB7CisJCW12UHJpbnRmKCJTZXJ2ZXIgd2luZG93cyB3ZXJlIG5vdCBpbml0aWFsaXplZFxuIiwgMCk7CisJCXJldHVybiBHVF9OT1RfSU5JVElBTElaRUQ7CisJfQorCisJKmRhdGEgPSAoKigodm9sYXRpbGUgdW5zaWduZWQgaW50Kikoc2VydmVyQmFzZUFkZHIrYWRkcikpKTsKKwkvL212UHJpbnRmKCJzZXJ2ZXJSZWdHZXQgMHgleCA9MHgleFxuIixhZGRyLCpkYXRhKTsKKworCXJldHVybiBHVF9PSzsKK30KKworTVZfU1RBVFVTIGRkcjNTaWxpY29uUHJlSW5pdCh2b2lkKQoreworICAgIE1WX1NUQVRVUyBzdGF0dXM7CisJLyogaW5pdGlhbGl6ZSB3aW5kb3cgdG8gc2VydmVyICovCisJY29uZmlndXJlU2VydmVyV2luZG93cygpOworCisjaWYgMAorCU1WX1UzMiB1aVJlZzsKKwkvKiBzZXQgZHVwaWNhdGUgQ1MgY29uZmlndXJhdGlvbiAqLworCXNlcnZlclJlZ0dldCgwLCAweGY4Mjg4LCAmdWlSZWcpOworCXVpUmVnIHw9ICgxIDw8IDE3KTsKKwlzZXJ2ZXJSZWdTZXQoMCwgMHhmODI4OCwgdWlSZWcpOworI2VuZGlmCisKKyAgICBzdGF0dXMgPSBkZHIzU2lsaWNvbkluaXQoKTsKKwlpZiAoTVZfT0sgIT0gc3RhdHVzKSB7CisJCW12UHJpbnRmKCJERFIzIHNpbGljb24gaW5pdCAtIEZBSUxFRCAweCV4XG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiBNVl9PSzsKK30KKworTVZfU1RBVFVTIGRkcjNTaWxpY29uUG9zdEluaXQodm9pZCkKK3sKKwlyZXR1cm4gTVZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6ICAgICBkZHIzVGlwSW5pdFNpbGljb24KKyAqIERlc2M6ICAgICBpbml0aWF0ZSBzaWxpY29uIHBhcmFtZXRlcnMKKyAqIEFyZ3M6CisgKiBOb3RlczoKKyAqIFJldHVybnM6ICByZXF1aXJlZCB2YWx1ZQorICovCitNVl9TVEFUVVMgZGRyM1NpbGljb25Jbml0KHZvaWQpIHsKKworCU1WX1NUQVRVUyBzdGF0dXM7CisKKwlnZW5lcmljSW5pdENvbnRyb2xsZXIgPSAxOworCisJc3RhdHVzID0gZGRyM1RpcEluaXRCb2JLKDAsIDApOworCWlmIChNVl9PSyAhPSBzdGF0dXMpIHsKKwkJbXZQcmludGYoIkREUjMgTXN5cyBzaWxpY29uIGluaXQgLSBGQUlMRUQgMHgleFxuIiwgc3RhdHVzKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlyZXR1cm4gTVZfT0s7Cit9CisKK01WX1NUQVRVUyBkZHIzUG9zdFJ1bkFsZyh2b2lkKQoreworICAgIE1WX1UzMiByZWFkRGVsYXlbNV07CisJR1RfVTMyIGdSZWFkU2FtcGxlRGVsYXkgPSAweDE5MTkxOTE5OworCUdUX1UzMiBnUmVhZFJlYWR5RGVsYXkgPSAweDE5MTkxOTE5OworCisgICAgQ0hFQ0tfU1RBVFVTKG12SHdzRGRyM1RpcElGUmVhZCgwLCBBQ0NFU1NfVFlQRV9VTklDQVNULCA0LCBSRUdfUkVBRF9EQVRBX1NBTVBMRV9ERUxBWVNfQUREUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWREZWxheSwgTUFTS19BTExfQklUUykpOworCisgICAgZ1JlYWRTYW1wbGVEZWxheSA9IHJlYWREZWxheVs0XTsKKworICAgIENIRUNLX1NUQVRVUyhtdkh3c0RkcjNUaXBJRlJlYWQoMCwgQUNDRVNTX1RZUEVfVU5JQ0FTVCwgNCwgUkVHX1JFQURfREFUQV9SRUFEWV9ERUxBWVNfQUREUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRGVsYXksIE1BU0tfQUxMX0JJVFMpKTsKKworICAgIGdSZWFkUmVhZHlEZWxheSA9IHJlYWREZWxheVs0XTsKKworICAgIENIRUNLX1NUQVRVUyhkZHIzVGlwQm9iS1NlbGVjdENQVURkckNvbnRyb2xsZXIoMCwgR1RfRkFMU0UpKTsgLy8gc2V0IG11eCB0byBtc3lzCisKKyAgICBNVl9SRUdfV1JJVEUoUkVHX1JFQURfREFUQV9TQU1QTEVfREVMQVlTX0FERFIsIGdSZWFkU2FtcGxlRGVsYXkpOworICAgIE1WX1JFR19XUklURShSRUdfUkVBRF9EQVRBX1JFQURZX0RFTEFZU19BRERSLCBnUmVhZFJlYWR5RGVsYXkpOworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqIE1zeXMgRC1Vbml0IEFjY2VzcyAgICAqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK0dUX1NUQVRVUyAgICBkZHIzRHVuaXRBY2Nlc3NXcml0ZQorKAorICAgIEdUX1U4ICAgICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfSFdTX0FDQ0VTU19UWVBFICAgIGludGVyZmFjZUFjY2VzcywKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsIAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICByZWdBZGRyLCAKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgZGF0YVZhbHVlLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBtYXNrIAorKQoreworCUdUX1UzMiB1aURhdGFSZWFkOworICAgIEdUX1UzMiBkYXRhUmVhZFtNQVhfSU5URVJGQUNFX05VTV07CisjaWZkZWYgV0lOMzIKKyAgICBtdlByaW50ZihERUJVR19MRVZFTF9UUkFDRSwiZGRyM0R1bml0QWNjZXNzV3JpdGUgICAweCV4OiAweCV4IChtYXNrIDB4JXgpXG4iLCByZWdBZGRyLCBkYXRhVmFsdWUpOworICAgIHJldHVybiBHVF9PSzsKKyNlbmRpZgorICAgIGlmIChtYXNrICE9IE1BU0tfQUxMX0JJVFMpCisgICAgeworICAgICAgICBpZiAoZGVidWdCb2JLID49IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12UHJpbnRmKCJkZHIzRHVuaXRBY2Nlc3NXcml0ZSBhY3RpdmUgaW50ZXJmYWNlID0gJWRcbiIsaW50ZXJmYWNlSWQpOworICAgICAgICB9CisgICAgICAgIENIRUNLX1NUQVRVUyhkZHIzRHVuaXRBY2Nlc3NSZWFkKGRldk51bSwgQUNDRVNTX1RZUEVfVU5JQ0FTVCxpbnRlcmZhY2VJZCwgcmVnQWRkciwgIGRhdGFSZWFkLCBNQVNLX0FMTF9CSVRTKSk7CisgICAgICAgIHVpRGF0YVJlYWQgPSBkYXRhUmVhZFtpbnRlcmZhY2VJZF07CisgICAgICAgIGRhdGFWYWx1ZSA9ICh1aURhdGFSZWFkICYgKH5tYXNrKSkgfCAoZGF0YVZhbHVlICYgbWFzayk7CisgICAgfQorCisgICAgaWYgKGRlYnVnQm9iSyA+PSAxKQorICAgIHsKKyAgICAgICAgbXZQcmludGYoIjB4JXg6IDB4JXhcbiIsIHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisgICAgfQorCisgICAgTVZfUkVHX1dSSVRFKHJlZ0FkZHIsIGRhdGFWYWx1ZSk7CisKKyAgICByZXR1cm4gR1RfT0s7Cit9CisKK0dUX1NUQVRVUyAgICBkZHIzRHVuaXRBY2Nlc3NSZWFkCisoCisgICAgR1RfVTggICAgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9IV1NfQUNDRVNTX1RZUEUgICAgaW50ZXJmYWNlQWNjZXNzLAorICAgIEdUX1UzMiAgICAgICAgICAgICAgICBpbnRlcmZhY2VJZCwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgcmVnQWRkciwKKyAgICBHVF9VMzIgICAgICAgICAgICAgICAgKmRhdGEsCisgICAgR1RfVTMyICAgICAgICAgICAgICAgIG1hc2sKKykKK3sKKyNpZmRlZiBXSU4zMgorICAgICBtdlByaW50ZigiZGRyM0R1bml0QWNjZXNzUmVhZCAgIDB4JXg6IDB4JXggKG1hc2sgMHgleClcbiIsIHJlZ0FkZHIsICpkYXRhKTsKKyAgICAgcmV0dXJuIEdUX09LOworI2VuZGlmCisKKwlkYXRhW2ludGVyZmFjZUlkXSA9IE1WX1JFR19SRUFEKHJlZ0FkZHIpICYgbWFzazsKKworICAgIHJldHVybiBHVF9PSzsKK30KKworR1RfU1RBVFVTIGRkcjNEdW5pdEFjY2Vzc0luaXQKKygKKyAgICBHVF9VMzIgIGRldk51bSwKKyAgICBHVF9VMzIgIGJvYXJkSWQKKykKK3sKKwlNVl9IV1NfVElQX0NPTkZJR19GVU5DX0RCIGNvbmZpZ0Z1bmM7CisKKyAgICBjb25maWdGdW5jLnRpcER1bml0UmVhZEZ1bmMgPSBkZHIzRHVuaXRBY2Nlc3NSZWFkOworICAgIGNvbmZpZ0Z1bmMudGlwRHVuaXRXcml0ZUZ1bmMgPSBkZHIzRHVuaXRBY2Nlc3NXcml0ZTsKKyAgICBjb25maWdGdW5jLnRpcER1bml0TXV4U2VsZWN0RnVuYyA9IGRkcjNUaXBCb2JLU2VsZWN0Q1BVRGRyQ29udHJvbGxlcjsKKyAgICBjb25maWdGdW5jLnRpcFNldEZyZXFEaXZpZGVyRnVuYyA9IGRkcjNUaXBCb2JLU2V0RGl2aWRlcjsKKyAgICBjb25maWdGdW5jLnRpcEdldEZyZXFDb25maWdJbmZvRnVuYyA9IGRkcjNUaXBCb2JLR2V0RnJlcUNvbmZpZzsKKworICAgIG12SHdzRGRyM1RpcEluaXRDb25maWdGdW5jKGRldk51bSwgJmNvbmZpZ0Z1bmMpOworCisJcmV0dXJuIEdUX09LOworfQorCitNVl9WT0lEIGNvbmZpZ3VyZVNlcnZlcldpbmRvd3Modm9pZCkKK3sKKwlzdGF0aWMgTVZfQk9PTCBjb25maWdEb25lID0gTVZfRkFMU0U7CisKKwlpZihjb25maWdEb25lID09IE1WX1RSVUUpCisJCXJldHVybjsKKworICAgIHNlcnZlckJhc2VBZGRyID0gTVZfUkVHX1JFQUQoQUhCX1RPX01CVVNfV0lOX0JBU0VfUkVHKDEpKTsKKworICAgIC8qIGluaXQgc2VydmVyIGFjY2VzcyAqLworCWh3c1NlcnZlclJlZ1NldEZ1bmNQdHIgPSBzZXJ2ZXJSZWdTZXQ7CisJaHdzU2VydmVyUmVnR2V0RnVuY1B0ciA9IHNlcnZlclJlZ0dldDsKKworCWNvbmZpZ0RvbmUgPSBNVl9UUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitHVF9VMzIgZGRyM1RpcEdldEluaXRGcmVxKCkKK3sKKyAgICBNVl9IV1NfRERSX0ZSRVEgZnJlcTsKKworCWNvbmZpZ3VyZVNlcnZlcldpbmRvd3MoKTsKKworCWRkcjNUaXBCb2JLR2V0SW5pdEZyZXEoMCwgMCwgJmZyZXEpOyAvKiBJbiBCb2JLIGludGVyZmFjZSAwIGlzIHRoZSBDUFUgaW50ZXJmYWNlKi8KKworCXJldHVybiBmcmVxOworCit9CisKKworCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19hMzh4LmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX2EzOHgubGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2M3ZTMyLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX2EzOHgubGliCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfYTM5eC5saWIgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19hMzl4LmxpYgppbmRleCBmOTVkYmU2Li5mYjRjNzRkIDEwMDY0NAotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19hMzl4LmxpYgorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19hMzl4LmxpYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19tc3lzX2FjMy5saWIgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19tc3lzX2FjMy5saWIKaW5kZXggMmQ0YjE2NS4uMjNkNDQwNiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfbXN5c19hYzMubGliCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX21zeXNfYWMzLmxpYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19tc3lzX2JjMi5saWIgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyM190cmFpbmluZ19tc3lzX2JjMi5saWIKaW5kZXggYjkzMWRlZS4uNWEwYzhiOCAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjNfdHJhaW5pbmdfbXN5c19iYzIubGliCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHIzX3RyYWluaW5nX21zeXNfYmMyLmxpYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyNF90cmFpbmluZ19hMzh4LmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOHgubGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MGI5NWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyNF90cmFpbmluZ19hMzh4LmxpYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyNF90cmFpbmluZ19hMzh4c3ViLmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOHhzdWIubGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODZhYjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyNF90cmFpbmluZ19hMzh4c3ViLmxpYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2Rkci9saWIvZGRyNF90cmFpbmluZ19hMzl4LmxpYiBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOXgubGliCmluZGV4IDFlNjQ0M2MuLmQ3MDE5ODkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOXgubGliCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOXgubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOXhzdWIubGliIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19kZHIvbGliL2RkcjRfdHJhaW5pbmdfYTM5eHN1Yi5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyZmVmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfZGRyL2xpYi9kZHI0X3RyYWluaW5nX2EzOXhzdWIubGliCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9hMzh4L2dlbmVyYWxJbml0LmMgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvYTM4eC9nZW5lcmFsSW5pdC5jCmluZGV4IGUzN2E4NDguLmYwODg5ZDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9hMzh4L2dlbmVyYWxJbml0LmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L2EzOHgvZ2VuZXJhbEluaXQuYwpAQCAtNzAsNiArNzAsOCBAQAogI2luY2x1ZGUgImdlbmVyYWxJbml0LmgiCiAjaW5jbHVkZSAicHJpbnRmLmgiCiAjaW5jbHVkZSAibXZTeXNFbnZMaWIuaCIKKyNpbmNsdWRlICJzb2Nfc3BlYy5oIgorI2luY2x1ZGUgImJpbl9oZHJfdHdzaS5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIG12RGV2aWNlSWRDb25maWcgLSBzZXQgU29DIFVuaXQgY29uZmlndXJhdGlvbiBhbmQgZGV2aWNlIElEIGFjY29yZGluZyB0byBkZXRlY3RlZCBmbGF2b3VyCkBAIC0xMTYsMjIgKzExOCwxOTYgQEAKICAgICAgICAgTVZfUkVHX1dSSVRFKE1QUF9DT05UUk9MX1JFRygyKSwgcmVnRGF0YSk7CiB9CiAKKy8qIHVwZGF0ZSBSVEMgKFJlYWQgVGltaW5nIENvbnRyb2wpIHZhbHVlcyBvZiBQQ0llIG1lbW9yeSB3cmFwcGVycy4KKyAqIHVzZSBzbG93ZXIgbWVtb3J5IFJlYWQgVGltaW5nLCB0byBhbGxvdyBtb3JlIGVmZmljaWVudCBlbmVyZ3kgY29uc3VtcHRpb24sIGluIG9yZGVyIHRvIGxvd2VyCisgKiB0aGUgbWluaW11bSBWREQgb2YgdGhlIG1lbW9yeS4KKyAqIFRoaXMgd2lsbCBsZWFkIHRvIG1vcmUgcm9idXN0IG1lbW9yeSB3aGVuIHZvbHRhZ2UgZHJvcCBvY2N1cnMgKFZERFNFRykKKyAqLworTVZfVk9JRCBtdlJ0Y0NvbmZpZygpCit7CisJTVZfVTMyIGksIHBpcGVTZWxlY3RWYWw7CisKKwkvKiBBY3RpdmF0ZSBwaXBlMCBmb3IgcmVhZC93cml0ZSB0cmFuc2FjdGlvbiwgYW5kIHNldCBYQkFSIGNsaWVudCBudW1iZXIgIzEgKi8KKwlwaXBlU2VsZWN0VmFsID0gMHgxIDw8IERGWF9QSVBFX1NFTEVDVF9QSVBFMF9BQ1RJVkVfT0ZGUyBcCisJCQl8IDB4MSA8PCBERlhfUElQRV9TRUxFQ1RfWEJBUl9DTElFTlRfU0VMX09GRlM7CisJTVZfUkVHX1dSSVRFKERGWF9SRUdfQkFTRSwgcGlwZVNlbGVjdFZhbCk7CisKKwkvKiBTZXQgbmV3IFJUQyB2YWx1ZSBmb3IgYWxsIG1lbW9yeSB3cmFwcGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSVENfTUVNT1JZX1dSQVBQRVJfQ09VTlQ7IGkrKykKKwkJTVZfUkVHX1dSSVRFKFJUQ19NRU1PUllfV1JBUFBFUl9SRUcoaSksIFJUQ19NRU1PUllfV1JBUFBFUl9DVFJMX1ZBTCk7CisKK30KKworI2lmZGVmIENPTkZJR19BUk1BREFfMzhYCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGlzU2tpcHBpbmdBVlNGcm9tRWZ1c2UKKyoKKyogREVTQ1JJUFRJT046CisqCXJlYWQgJ2F2c3NraXAnIGZpZWxkIGluIEVFUFJPTSB0byBkZXRlY3Qgd2hldGhlciB0byBza2lwIEFWUworKglzZWxlY3Rpb24gZnJvbSBFRlVTRSwgaW4gb3JkZXIgdG8gYWRkIG9wdGlvbiB0byBza2lwIEFWUyBzZWxlY3Rpb24KKyoJd2l0aCBwcm9ibGVtYXRpYyBBVlMgdmFsdWVzIGluIEVFUFJPTQorKiBSRVRVUk46CisqCU1WX1RSVUUsIGlmIGF2c3NraXAgaXMgMQorKglNVl9GQUxTRSwgb3RoZXJ3aXNlLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX0JPT0wgaXNTa2lwcGluZ0FWU0Zyb21FZnVzZSgpCit7CisJTVZfVFdTSV9TTEFWRSB0d3NpU2xhdmU7CisJTVZfVTggZGF0YTsKKworCXR3c2lTbGF2ZS5zbGF2ZUFkZHIuYWRkcmVzcyA9IDB4NTc7IC8vIEVFUFJPTSBBZGRyZXNzCisJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOworCXR3c2lTbGF2ZS52YWxpZE9mZnNldCA9IE1WX1RSVUU7CisJdHdzaVNsYXZlLm1vcmVUaGVuMjU2ID0gTVZfVFJVRTsKKwl0d3NpU2xhdmUub2Zmc2V0ID0gMjsJCS8qIFNXIEVFUFJPTSwgcmVnaXN0ZXIgMiwgYml0IDcgKi8KKworCWlmIChtdlR3c2lSZWFkKDAsICZ0d3NpU2xhdmUsICZkYXRhLCAxKSAhPSBNVl9PSykgeworCQltdlByaW50ZigiJXM6IFRXU0kgUmVhZCBvZiAnYXZzc2tpcCcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBNVl9UUlVFOyAvKiBza2lwIEFWUyBmcm9tIEVGVVNFIGluIGNhc2Ugb2YgZXJyb3IgKi8KKwl9CisJZGF0YSA+Pj0gNzsgLyogQklUIDcgKi8KKwlpZiAoZGF0YSA9PSAxKQorCQlyZXR1cm4gTVZfVFJVRTsKKwllbHNlCisJCXJldHVybiBNVl9GQUxTRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbXZHZXRBdnNWYWxGcm9tRWZ1c2UKKyoKKyogREVTQ1JJUFRJT046CisqCXJlYWQgQVZTIHZhbHVlIHdyaXR0ZW4gdG8gZUZ1c2UgdGhhdCBjb3JyZXNwb25kcyB0byBzYXRyRnJlcQorKgl0aGVyZSBhcmUgMyBBVlMgdmFsdWVzIHdyaXR0ZW4gaW4gZUZ1c2UgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZnJlcXVlbmNpZXMKKyoJdGhhdCBsb3dlciBvciBlcXVhbCB0byAxNjAwTUh6LCAxODY2TUh6IGFuZCAyMDAwTUh6LgorKglCaXQgbWFwcGluZyBvZiBFRlVTRV9BVlNfQU5EX0JJTl9SRUc6CisqCSstLS0tLS0tKy0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworKgl8IEZpZWxkIHwgQmluIHwgQVZTX1ZhbCAyR0h6IHwgQVZTX1ZhbCAxLjg2NkdIeiB8IEFWU19WYWwgMS42R0h6IHwKKyoJKy0tLS0tLS0rLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisqCXwgYml0cyAgfCA0LTUgfCA2LTEzICAgICAgICAgfCAxNC0yMSAgICAgICAgICAgIHwgMjItMjkgICAgICAgICAgfAorKgkrLS0tLS0tLSstLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyoKKyoJQml0IG1hcHBpbmcgb2YgRUZVU0VfQVZTX1ZFUlNJT05fUkVHOgorKgkrLS0tLS0tLSstLS0tLS0tLS0rCisqCXwgRmllbGQgfCBWZXJzaW9uIHwKKyoJKy0tLS0tLS0rLS0tLS0tLS0tKworKgl8IGJpdHMgIHwgMjQtMjcgICB8CisqCSstLS0tLS0tKy0tLS0tLS0tLSsKKyogSU5QVVQ6CisqCXNhdHJGcmVxCS0gY29udHJvbGxlciBDUFUgZnJlcXVlbmN5CisqCisqIE9VVFBVVDoKKyoJYXZzVmFsCQktIEFWUyB2YWx1ZSBpbiBlRnVzZSBjb3JyZXNwb25kaW5nIHRvIHNhdHJGcmVxCisqCisqIFJFVFVSTjoKKyoJTVZfVFJVRSwgaWYgQVZTIHZhbHVlIGV4aXRzIGluIGVGdXNlIChpZiB2ZXJzaW9uIGlzIG5vdCBlcXVhbCAwKS4KKyoJTVZfRkFMU0UsIG90aGVyd2lzZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNVl9CT09MIG12R2V0QXZzVmFsRnJvbUVmdXNlKE1WX1UzMiBzYXRyRnJlcSwgTVZfVTMyICphdnNWYWwpCit7CisJTVZfVTMyIHZlcnNpb25WYWwsIGJpblZhbCwgYXZzUmVnQ29udHJvbFZhbDsKKwlNVl9CT0FSRF9BVlNfRUZVU0VfTUFQIGVmdXNlX2ZyZXFfdmFsW10gPSBFRlVTRV9GUkVRX1ZBTF9JTkZPOworCWludCBpOworCisjaWZuZGVmIENPTkZJR19BVlNfRlJPTV9FRlVTRQorCW12UHJpbnRmKCJBVlMgc2VsZWN0aW9uIGZyb20gRUZVU0UgZGlzYWJsZWQgKFNraXAgcmVhZGluZyBFRlVTRSB2YWx1ZXMpXG4iKTsKKwlyZXR1cm4gTVZfRkFMU0U7CisjZW5kaWYKKworI2lmbmRlZiBDT05GSUdfQ1VTVE9NRVJfQk9BUkRfU1VQUE9SVAorCS8qIEZvciBNYXJ2ZWxsIGJvYXJkcyBvbmx5OgorCSAqIEFWUyBjb25maWd1cmF0aW9uIGZyb20gRUZVU0UgY2FuIGJlIHNraXBwZWQgZm9yIE1hcnZlbGwgYm9hcmRzLCBmb3I6CisJCS0gQWxyZWFkeSBleGlzdGluZyBTb0NzIHdoaWNoIEVGVVNFIHdhcyBub3QgcHJlLWJ1cm50IHdpdGggQVZTIHZhbHVlcworCQktIFNvQ3Mgd2l0aCBpbnZhbGlkIEFWUyBFRlVTRSB2YWx1ZXMgKi8KKwlpZiAoaXNTa2lwcGluZ0FWU0Zyb21FZnVzZSgpID09IE1WX1RSVUUpIHsKKwkJbXZQcmludGYoIlNraXBwaW5nIEFWUyBzZWxlY3Rpb24gZnJvbSBFRlVTRSAoU2F0UiBmaWVsZCAnYXZzc2tpcCcgPSBZZXMpXG4iKTsKKwkJcmV0dXJuIE1WX0ZBTFNFOworCX0KKyNlbmRpZgorCisJLyogU2V0IE1lbW9yeSBJL08gd2luZG93ICovCisJTVZfUkVHX1dSSVRFKEFIQl9UT19NQlVTX1dJTl9DVFJMX1JFRyhFRlVTRV9XSU5fSUQpLCBFRlVTRV9XSU5fQ1RSTF9WQUwpOworCU1WX1JFR19XUklURShBSEJfVE9fTUJVU19XSU5fQkFTRV9SRUcoRUZVU0VfV0lOX0lEKSwgRUZVU0VfV0lOX0JBU0VfVkFMKTsKKwlNVl9SRUdfV1JJVEUoQUhCX1RPX01CVVNfV0lOX1JFTUFQX0xPV19SRUcoRUZVU0VfV0lOX0lEKSwgMCk7CisJTVZfUkVHX1dSSVRFKEFIQl9UT19NQlVTX1dJTl9SRU1BUF9ISUdIX1JFRyhFRlVTRV9XSU5fSUQpLCAwKTsKKworCS8qIGNoZWNrIHZlcnNpb24gdmFsdWUKKwkgKiBpZiBpdCBpcyBlcXVhbCB0byAwIHRoZW4gQVZTIHZhbHVlIGRvZXMgbm90IGV4aXN0ICovCisJdmVyc2lvblZhbCA9IChNVl9FRlVTRV9SRUdfUkVBRChFRlVTRV9BVlNfVkVSU0lPTl9SRUcpICYKKwkJCShFRlVTRV9BVlNfVkVSU0lPTl9NQVNLIDw8IEVGVVNFX0FWU19WRVJTSU9OX09GRlNFVCkpID4+IEVGVVNFX0FWU19WRVJTSU9OX09GRlNFVDsKKwlpZiAodmVyc2lvblZhbCA9PSAwKSB7CisJCW12UHJpbnRmKCJBVlMgZnJvbSBlRnVzZSB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgKCV1KVxuIiwgdmVyc2lvblZhbCk7CisJCXJldHVybiBNVl9GQUxTRTsKKwl9CisKKwkvKiByZWFkIEJpbiB2YWx1ZQorCSAqIGJpbiB2YWx1ZSBpbmRpY2F0ZXMgaGlnaGVzdCBmcmVxdWVuY3kgdGhlIGRldmljZSBtZWV0czoKKwkgKiAtIDB4MzogMTYwME1IegorCSAqIC0gMHgyOiAxODY2TUh6CisJICogLSAweDE6IDIwMDBNSHogKi8KKwliaW5WYWwgPSAoTVZfRUZVU0VfUkVHX1JFQUQoRUZVU0VfQVZTX0FORF9CSU5fUkVHKSAmCisJCQkoRUZVU0VfQVZTX0JJTl9NQVNLIDw8IEVGVVNFX0FWU19CSU5fT0ZGU0VUKSkgPj4gRUZVU0VfQVZTX0JJTl9PRkZTRVQ7CisKKwkvKiBmZXRjaCBBVlNfVmFsIGFjY29yZGluZyB0byBmcmVxdWVuY3kKKwkgKiBjaGVjayBpZiBzZWxlY3RlZCBTQFIgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byBmcmVxdWVuY3kgMTg2NiwyMDAwLAorCSAqIG9yIGJlbG93IDE2MDBNSHogKDFzdCBjZWxsIGlzIDE2MDApICovCisJZm9yIChpID0gMDsgaSA8IEVGVVNFX0ZSRVFfVkFMX1NJWkU7ICsraSkgeworCQkvKiBjaGVjayB0aGF0IFNAUiBmcmVxIG1vZGUgaXMgcGVybWl0dGVkIG9uIGNoaXA6CisJCSAqIGNoZWNrIGlmIEJpbiB2YWwgZnJvbSBlRnVzZSBpcyBsb3dlci9lcXVhbCB0aGFuIHRoZSBiaW4gdmFsdWUKKwkJICogY29ycmVzcG9uZGluZyB3aXRoIHRoaXMgU0BSIGZyZXEgKi8KKwkJaWYgKHNhdHJGcmVxID09IGVmdXNlX2ZyZXFfdmFsW2ldLmNwdV9mcmVxX21vZGUKKwkJCQl8fCAoaSA9PSAwICYmIHNhdHJGcmVxIDwgZWZ1c2VfZnJlcV92YWxbaV0uY3B1X2ZyZXFfbW9kZSkpIHsKKwkJCWlmIChiaW5WYWwgPiBlZnVzZV9mcmVxX3ZhbFtpXS5hdnNfYmluX3ZhbHVlKSB7CisJCQkJLyogZm9yIHNlY3VyaXR5IGNoZWNrLCBTQFIgZnJlcXVlbmN5IGlzIG5vdCBhbGxvd2VkIGJ5IEJpbiBmaWVsZAorCQkJCSAqIHdyaXRlIGRlZmF1bHQgdmFsdWUgb2YgQVZTIDEuMjVWLCBhbmQgaGFsdCB0aGUgQ1BVIChlbXB0eSBpbmZpbml0ZSBsb29wKQorCQkJCSAqLworCQkJCW12UHJpbnRmKCJFUlJPUjogQVZTIGZyb20gRUZVU0UgZG9lcyBub3Qgc3VwcG9ydCBjdXJyZW50IENQVSBmcmVxdW5jeSAoJXUgTUh6KVxuIiwKKwkJCQkJCWVmdXNlX2ZyZXFfdmFsW2ldLmNwdV9mcmVxKTsKKwkJCQltdlByaW50ZigiUGxlYXNlIGNvbmZpZ3VyZSBsb3dlciBmcmVxdWVuY3kgbW9kZSBpbiBTQFJcbiIpOworCQkJCWF2c1JlZ0NvbnRyb2xWYWwgPSBNVl9SRUdfUkVBRChBVlNfRU5BQkxFRF9DT05UUk9MKTsKKwkJCQlhdnNSZWdDb250cm9sVmFsIHw9ICgoTVZfQVZTX0RFRkFVTFRfVkFMVUUgPDwgQVZTX0xPV19WRERfTElNSVRfT0ZGUykKKwkJCQkJCQl8IChNVl9BVlNfREVGQVVMVF9WQUxVRSA8PCBBVlNfSElHSF9WRERfTElNSVRfT0ZGUykpOworCQkJCU1WX1JFR19XUklURShBVlNfRU5BQkxFRF9DT05UUk9MLCBhdnNSZWdDb250cm9sVmFsKTsKKwkJCQkvKiBoYWx0IHRoZSBDUFUgKi8KKwkJCQl3aGlsZSAoMSkKKwkJCQkJOworCQkJfQorCQkJLyogaWYgQmluIHZhbHVlIHBlcm1pdHMgc2VsZWN0ZWQgZnJlcXVlbmN5IG1vZGUsCisJCQkgKiByZWFkIGl0J3MgY29ycmVzcG9uZGluZyBBVlMgdmFsdWUgZnJvbSBFRlVTRSAqLworCQkJKmF2c1ZhbCA9IChNVl9FRlVTRV9SRUdfUkVBRChFRlVTRV9BVlNfQU5EX0JJTl9SRUcpICYKKwkJCQkJKEVGVVNFX0FWU19WQUxfTUFTSyA8PCBFRlVTRV9BVlNfVkFMX09GRlNFVF9BVF9JTkQoaSkpKSA+PgorCQkJCQkJCQlFRlVTRV9BVlNfVkFMX09GRlNFVF9BVF9JTkQoaSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBFRlVTRV9GUkVRX1ZBTF9TSVpFICYmIHNhdHJGcmVxID4gZWZ1c2VfZnJlcV92YWxbMF0uY3B1X2ZyZXFfbW9kZSkgeworCQkvKiBjaGVjayBpZiBjaGlwIGlzIGNvbmZpZ3VyZWQgdG8gQ1BVIGZyZXF1ZW5jeQorCQkgKiB0aGF0IGlzIHVuc3VwcG9ydGVkIGJ5IEFWUyBAIEVGVVNFIG1hcHBpbmcgKi8KKwkJbXZQcmludGYoIkVSUk9SOiBzZWxlY3RlZCBDUFUgZnJlcXVlbmN5IChtb2RlIDB4JVgpIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIHNhdHJGcmVxKTsKKwkJcmV0dXJuIE1WX0ZBTFNFOworCX0KKwltdlByaW50ZigiU2VsZWN0ZWQgQVZTIHZhbHVlIGZyb20gZUZ1c2U6IDB4JVggKGNvcnJlc3BvbmRpbmcgdG8gZnJlcXVlbmN5ICV1TUh6KSAiLAorCQkJKmF2c1ZhbCwgZWZ1c2VfZnJlcV92YWxbaV0uY3B1X2ZyZXEpOworCW12UHJpbnRmKCJFRlVTRSB2ZXJzaW9uICV1XG4iLCB2ZXJzaW9uVmFsKTsKKwlyZXR1cm4gTVZfVFJVRTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQVJNQURBXzM4WCAqLworCiBNVl9TVEFUVVMgbXZHZW5lcmFsSW5pdCh2b2lkKQogewogCU1WX1UzMiByZWdEYXRhOwotCi0JLyogVXBkYXRlIEFWUyBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyICovCi0gICAgICAgIE1WX1JFR19XUklURShBVlNfREVCVUdfQ05UUl9SRUcsIEFWU19ERUJVR19DTlRSX0RFRkFVTFRfVkFMVUUpOwotCi0gICAgICAgIHJlZ0RhdGEgPSBNVl9SRUdfUkVBRChBVlNfRU5BQkxFRF9DT05UUk9MKTsKLSAgICAgICAgcmVnRGF0YSAmPSB+KEFWU19MT1dfVkREX0xJTUlUX01BU0sgfCBBVlNfSElHSF9WRERfTElNSVRfTUFTSyk7Ci0JcmVnRGF0YSB8PSAoQVZTX0xPV19WRERfTElNSVRfVkFMIHwgQVZTX0hJR0hfVkREX0xJTUlUX1ZBTCk7Ci0gICAgICAgIE1WX1JFR19XUklURShBVlNfRU5BQkxFRF9DT05UUk9MLCByZWdEYXRhKTsKLQotCW12TXBwQ29uZmlnKCk7CisjaWZkZWYgQ09ORklHX0FSTUFEQV8zOFgKKwlNVl9VMzIgYXZzVmFsOworI2VuZGlmCisJbXZNcHBDb25maWcoKTsgLyogTVBQIG11c3QgYmUgY29uZmlndXJlZCBwcmlvciB0byBVQVJUL0kyQyBhY2Nlc3MgKi8KIAogCS8qIC0gSW5pdCB0aGUgVFdTSSBiZWZvcmUgYWxsIEkyQyB0cmFuc2FjdGlvbiAqLwogCURFQlVHX0lOSVRfRlVMTF9TKCJtdkdlbmVyYWxJbml0OiBJbml0IFRXU0kgaW50ZXJmYWNlLlxuIik7CisJLyogSTJDL1RXU0kgdW5pdCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBtdlVhcnRJbml0IGlzIGNhbGxlZCwKKwkgKiBzaW5jZSBVQVJUIHBvcnQgaXMgc2VsZWN0ZWQgYWNjb3JkaW5nIHRvIGJvYXJkIElECisJICogKHJlYWQgQm9hcmQgSUQgZnJvbSBFRVBST00gdmlhIEkyQykgKi8KIAltdkh3c1R3c2lJbml0V3JhcHBlcigpOwogCiAjaWYgIWRlZmluZWQoTVZfTk9fUFJJTlQpCkBAIC0xMzksOSArMzE1LDU2IEBACiAJbXZQcmludGYoIlxuXG5HZW5lcmFsIGluaXRpYWxpemF0aW9uIC0gVmVyc2lvbjogIiBHRU5FUkFMX1ZFUklPTiAiXG4iKTsKICNlbmRpZgogCisJLyogVXBkYXRlIEFWUyBkZWJ1ZyBjb250cm9sIHJlZ2lzdGVyICovCisJTVZfUkVHX1dSSVRFKEFWU19ERUJVR19DTlRSX1JFRywgQVZTX0RFQlVHX0NOVFJfREVGQVVMVF9WQUxVRSk7CisJTVZfUkVHX1dSSVRFKEFWU19ERUJVR19DTlRSX1JFRywgQVZTX0RFQlVHX0NOVFJfREVGQVVMVF9WQUxVRSk7CisKKwlyZWdEYXRhID0gTVZfUkVHX1JFQUQoQVZTX0VOQUJMRURfQ09OVFJPTCk7CisJcmVnRGF0YSAmPSB+KEFWU19MT1dfVkREX0xJTUlUX01BU0sgfCBBVlNfSElHSF9WRERfTElNSVRfTUFTSyk7CisKKyNpZmRlZiBDT05GSUdfQVJNQURBXzM4WAorCS8qIDEuIEFybWFkYTM4eCB3YXMgc2lnbmVkIG9mZiBmb3IgMTYwMC84MDAgYXQgMS4xNVYgKEFWUykKKwkgKiAyLiBCYXNlZCBvbiBBVEUvc3lzdGVtIGNvcnJlbGF0aW9uLCBpbiBvcmRlciB0byBhY2hpZXZlIGhpZ2hlciBzcGVlZHMgKDE4NjZNSHosIDIwMDBNSHopLAorCSAqICAgIHdlIG5lZWQgdG8gb3ZlcmRyaXZlIHRoZSBjaGlwIHRvIDEuMjVWIChBVlMpCisJICogIDMuMS4gSWYgQVZTIHZhbHVlcyBhcmUgbm90IHdyaXR0ZW4gb24gZUZ1c2UsIFRoZSB3cml0ZSB0byBBVlMgaXMKKwkgKiAgICAgIGJhc2VkIG9uIFNAUiAoQ1BVIDw9IDE2MDBNSHogLS0+IEFWU0AgMS4xNVYpCisJICogIDMuMi4gSWYgQVZTIHZhbHVlcyBhcmUgd3JpdHRlbiB0byBlRnVzZSAodmVyc2lvbiBmaWVsZCBpcyBkaWZmZXJlbnQgdGhhbiB6ZXJvKQorCSAqICAgICAgVGhpcyBtZWFucyB0aGF0IGV2ZXJ5IGZyZXF1ZW5jeSBoYXZlIGNvcnJlc3BvbmRpbmcgQVZTIHZhbHVlIHdyaXR0ZW4gdG8gZUZ1c2UsCisJICogICAgICAoY29ycmVzcG9uZHMgdG8gZnJlcXVlbmN5IGJlbG93IDE2MDBNSHosIGVxdWFscyAxODY2TUh6IG9yIGVxdWFscyAyMDAwTUh6KQorCSAqICAgICAgVGhlbiB3cml0ZSB0aGUgY29ycmVzcG9uZGluZyBBVlMgdmFsdWUuCisJICogICAgICBGb3Igc2VjdXJpdHkgY2hlY2ssIEJpbiB2YWx1ZSBpcyBidXJudCwgdGhhdCB0ZWxscyB3aGljaCBpcyB0aGUgbWF4aW11bQorCSAqICAgICAgYWxsb3dlZCBmcmVxdWVuY3kuIElmIHRoZSBTQFIgZnJlcXVlbmN5IGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtLCB0aGUgY2hpcCBpcworCSAqICAgICAgaGFsdGVkIChlbXB0eSBpbmZpbml0ZSBsb29wKSwgYW5kIDEuMjVWIGlzIHdyaXR0ZW4gdG8gQVZTCisJICovCisJeworCQlNVl9VMzIgc2F0ckZyZXE7CisJCXNhdHJGcmVxID0gKE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRykgPj4gU0FSX0ZSRVFfT0ZGU0VUKSAmIFNBUl9GUkVRX01BU0s7CisKKwkJaWYgKG12R2V0QXZzVmFsRnJvbUVmdXNlKHNhdHJGcmVxLCAmYXZzVmFsKSA9PSBNVl9UUlVFKSB7CisJCQlyZWdEYXRhIHw9ICgoYXZzVmFsIDw8IEFWU19MT1dfVkREX0xJTUlUX09GRlMpIHwgKGF2c1ZhbCA8PCBBVlNfSElHSF9WRERfTElNSVRfT0ZGUykpOworCQkJTVZfUkVHX1dSSVRFKEFWU19FTkFCTEVEX0NPTlRST0wsIHJlZ0RhdGEpOworCQl9IGVsc2UgeworCQkJLypTZXQgQVZTIHZhbHVlIG9ubHkgZm9yIG5vcm1hdGl2ZSBjb3JlIGZyZXEoMTYwME1oeiBhbmQgbGVzcyksCisJCQkgKiBmb3IgaGlnaCBmcmVxIGxlYXZlIGRlZmF1bHQgdmFsdWUqLworCQkJaWYgKHNhdHJGcmVxIDw9IDB4RCkgeworCQkJCXJlZ0RhdGEgfD0gKChBVlNfTElNSVRfVkFMX1NMT1cgPDwgQVZTX0xPV19WRERfTElNSVRfT0ZGUykgfAorCQkJCQkJKEFWU19MSU1JVF9WQUxfU0xPVyA8PCBBVlNfSElHSF9WRERfTElNSVRfT0ZGUykpOworCQkJCU1WX1JFR19XUklURShBVlNfRU5BQkxFRF9DT05UUk9MLCByZWdEYXRhKTsKKwkJCQltdlByaW50ZigiT3ZlcnJpZGluZyBkZWZhdWx0IEFWUyB2YWx1ZSB0bzogMHglWFxuIiwgQVZTX0xJTUlUX1ZBTF9TTE9XKTsKKwkJCX0KKwkJfQorCX0KKyNlbHNlCisJCXJlZ0RhdGEgfD0gKCAoQVZTX0xJTUlUX1ZBTCA8PCBBVlNfTE9XX1ZERF9MSU1JVF9PRkZTKSB8IChBVlNfTElNSVRfVkFMIDw8IEFWU19ISUdIX1ZERF9MSU1JVF9PRkZTKSk7CisJCU1WX1JFR19XUklURShBVlNfRU5BQkxFRF9DT05UUk9MLCByZWdEYXRhKTsKKyNlbmRpZgorCisJbXZSdGNDb25maWcoKTsgLyogdXBkYXRlIFJUQyAoUmVhZCBUaW1pbmcgQ29udHJvbCkgdmFsdWVzIG9mIFBDSWUgbWVtb3J5IHdyYXBwZXJzKi8KKwogCS8qIERldmljZSBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gd2FzIG5vdCBzdXBwb3J0ZWQgb24gYTM4eCBaMCByZXZpc2lvbiAqLwogCWlmIChtdlN5c0VudkRldmljZVJldkdldCgpICE9IE1WXzg4RjY4WFhfWjFfSUQpCiAJCW12RGV2aWNlSWRDb25maWcoKTsKKwltdlN5c0VudlVzYlZidXNSZXNldCgpOwogCiAJcmV0dXJuIE1WX09LOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L2EzOHgvZ2VuZXJhbEluaXQuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9hMzh4L2dlbmVyYWxJbml0LmgKaW5kZXggNDBkZWRjMi4uMGI1ODAwNiAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L2EzOHgvZ2VuZXJhbEluaXQuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvYTM4eC9nZW5lcmFsSW5pdC5oCkBAIC02NSw2ICs2NSwxMSBAQAogI2lmbmRlZiBfX0lOQ212R2VuZXJhbEluaXRoCiAjZGVmaW5lIF9fSU5DbXZHZW5lcmFsSW5pdGgKIAorI2lmZGVmIENPTkZJR19DVVNUT01FUl9CT0FSRF9TVVBQT1JUCisvKiBWaXJ0dWFsIFJlZHVjZWQgZmxhdm9yIERldmljZSBJRCBpcyBkZWZpbmVkIGJ5IFJFRFVDRURfRkxBVk9SIHZhbHVlICovCisvLyNkZWZpbmUgUkVEVUNFRF9GTEFWT1IgMHgzODMgLyogMHgzODM6IEEzODMgLSA2VzIxICovCisvLyNkZWZpbmUgUkVEVUNFRF9GTEFWT1IgMHgzODQgLyogMHgzODQ6IEEzODQgLSA2VzIzICovCisjZW5kaWYgLyogQ09ORklHX0NVU1RPTUVSX0JPQVJEX1NVUFBPUlQgKi8KICNkZWZpbmUgR0VORVJBTF9WRVJJT04gIjEuMC4wIgogCiAjZW5kaWYgLyogX19JTkNtdkdlbmVyYWxJbml0aCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L21zeXMvZ2VuZXJhbEluaXQuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfaW5pdC9tc3lzL2dlbmVyYWxJbml0LmMKaW5kZXggYTc2MTE3Ny4uMjNkZjQzYyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19pbml0L21zeXMvZ2VuZXJhbEluaXQuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX2luaXQvbXN5cy9nZW5lcmFsSW5pdC5jCkBAIC02OSw2ICs2OSw3IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgIm12U2lsaWNvbklmLmgiCiAjaW5jbHVkZSAiZ2VuZXJhbEluaXQuaCIKKyNpbmNsdWRlICJtdlN5c0VudkxpYi5oIgogCiAjaWYgZGVmaW5lZChNVl9NU1lTX0FDMykKICNpbmNsdWRlICJkZHIzX21zeXNfYWMzLmgiCkBAIC0xNzIsNiArMTczLDcgQEAKIAltdlVhcnRJbml0KCk7CiAJREVCVUdfSU5JVF9TKCJcblxuR2VuZXJhbCBpbml0aWFsaXphdGlvbiAtIFZlcnNpb246ICIgR0VORVJBTF9WRVJJT04gIlxuIik7CiAjZW5kaWYKKwltdkh3c1R3c2lJbml0V3JhcHBlcigpOwogCiAJcmV0dXJuIE1WX09LOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkN0cmxQZXguYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZDdHJsUGV4LmMKaW5kZXggZWMzMjVhMS4uNGZhZWE1ZSAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkN0cmxQZXguYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212Q3RybFBleC5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJaWYgKChzZXJkZXNUeXBlICE9IFBFWDApICYmIChzZXJkZXNUeXBlICE9IFBFWDEpICYmIChzZXJkZXNUeXBlICE9IFBFWDIpICYmIChzZXJkZXNUeXBlICE9IFBFWDMpKQogCQkJY29udGludWU7CiAKLQkJaWYgKChzZXJkZXNUeXBlICE9IFBFWDApICYmCisJCWlmICgoc2VyZGVzSWR4ICE9IDApICYmCiAJCQkJKChzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpIHx8CiAJCQkJIChzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpKSkKIAkJewpAQCAtMTk3LDcgKzE5Nyw3IEBACiAKIAlmb3IgKHNlcmRlc0lkeCA9IDA7IHNlcmRlc0lkeCA8IG1heExhbmVOdW07IHNlcmRlc0lkeCsrKSB7CiAJCXNlcmRlc1R5cGUgPSBzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNUeXBlOwotCQlpZiAoKHNlcmRlc1R5cGUgIT0gUEVYMCkgJiYKKwkJaWYgKChzZXJkZXNJZHggIT0gMCkgJiYKIAkJCQkoKHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkgfHwKIAkJCQkgKHNlcmRlc01hcFtzZXJkZXNJZHhdLnNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkpKQogCQl7CkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkJaWYgKChzZXJkZXNUeXBlICE9IFBFWDApICYmIChzZXJkZXNUeXBlICE9IFBFWDEpICYmIChzZXJkZXNUeXBlICE9IFBFWDIpICYmIChzZXJkZXNUeXBlICE9IFBFWDMpKQogCQkJY29udGludWU7CiAKLQkJaWYgKChzZXJkZXNUeXBlICE9IFBFWDApICYmCisJCWlmICgoc2VyZGVzSWR4ICE9IDApICYmCiAJCQkJKChzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpIHx8CiAJCQkJIChzZXJkZXNNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpKSkKIAkJewpAQCAtMzI0LDcgKzMyNCw3IEBACiAJCWlmICgoc2VyZGVzVHlwZSAhPSBQRVgwKSAmJiAoc2VyZGVzVHlwZSAhPSBQRVgxKSAmJiAoc2VyZGVzVHlwZSAhPSBQRVgyKSAmJiAoc2VyZGVzVHlwZSAhPSBQRVgzKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmICgoc2VyZGVzVHlwZSAhPSBQRVgwKSAmJgorCQlpZiAoKHNlcmRlc0lkeCAhPSAwKSAmJgogCQkJCSgoc2VyZGVzTWFwW3NlcmRlc0lkeF0uc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSB8fAogCQkJCSAoc2VyZGVzTWFwW3NlcmRlc0lkeF0uc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSkpCiAJCXsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZDdHJsUGV4LmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212Q3RybFBleC5oCmluZGV4IDg2MDE1MGUuLjYzNTdjNGMgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZDdHJsUGV4LmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkN0cmxQZXguaApAQCAtODksNiArODksOCBAQAogI2RlZmluZSBNQVhfUEVYX0JVU1NFUyAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2CiAKICNkZWZpbmUgUEVYX0NBUEFCSUxJVElFU19SRUcocGV4SWYpCQkJICAgICgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZikpICsgMHg2MCkKKyNkZWZpbmUgUEVYX0xJTktfQ0FQQUJJTElUSUVTX1JFRyhwZXhJZikJCSgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZikpICsgMHg2QykKKyNkZWZpbmUgUEVYX0xJTktfQ1RSTF9TVEFUVVNfUkVHKHBleElmKSAJCSgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZikpICsgMHg3MCkKICNkZWZpbmUgUEVYX0xJTktfQ1RSTF9TVEFUVVMyX1JFRyhwZXhJZikgICAgICAgICgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZikpICsgMHg5MCkKICNkZWZpbmUgUEVYX0NUUkxfUkVHKHBleElmKSAgICAgICAgICAgICAgICAgICAgICgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZikpICsgMHgxQTAwKQogI2RlZmluZSBQRVhfU1RBVFVTX1JFRyhwZXhJZikgICAgICAgICAgICAgICAgICAgKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElmKSkgKyAweDFBMDQpCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy0zOHguYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLTM4eC5jCmluZGV4IDYzYTZiZDIuLjYzN2FjZWEgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLTM4eC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLTM4eC5jCkBAIC0xMjgsMTkgKzEyOCwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1UzMiBtdkh3c1NlcmRlc0dldE1heExhbmUoTVZfVk9JRCkKIHsKLSAgICBzd2l0Y2ggKG12U3lzRW52RGV2aWNlSWRHZXQoKSkgewotICAgIGNhc2UgTVZfNjgxMTogLyogQTM4MS9BMzI4MjogNjgxMS82ODIxOiBzaW5nbGUvZHVhbCBjcHUgKi8KLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgY2FzZSBNVl82ODEwOgotICAgICAgICByZXR1cm4gNTsKLSAgICBjYXNlIE1WXzY4MjA6Ci0gICAgY2FzZSBNVl82ODI4OgotICAgICAgICByZXR1cm4gNjsKLSAgICBkZWZhdWx0OiAgICAvKiBub3QgdGhlIHJpZ2h0IG1vZHVsZSAqLwotICAgICAgICBtdlByaW50ZigiJXM6IERldmljZSBJRCBFcnJvciwgdXNpbmcgNCBTZXJEZXMgbGFuZXNcbiIsIF9fZnVuY19fKTsKLSAgICAgICAgcmV0dXJuIDQ7Ci0gICAgICAgIH0KLSAgICByZXR1cm4gNjsKKwlzd2l0Y2ggKG12U3lzRW52RGV2aWNlSWRHZXQoKSkgeworCWNhc2UgTVZfNjgxMTogLyogQTM4MS9BMzI4MjogNjgxMS82ODIxOiBzaW5nbGUvZHVhbCBjcHUgKi8KKwljYXNlIE1WXzZXMjI6IC8qIDZXMjI9QTM4MyAqLworCWNhc2UgTVZfNlcyMzogLyogNlcyMz1BMzg0ICovCisJCXJldHVybiA0OworCWNhc2UgTVZfNjgxMDoKKwkJcmV0dXJuIDU7CisJY2FzZSBNVl82ODIwOgorCWNhc2UgTVZfNjgyODoKKwkJcmV0dXJuIDY7CisJZGVmYXVsdDogICAgLyogbm90IHRoZSByaWdodCBtb2R1bGUgKi8KKwkJbXZQcmludGYoIiVzOiBEZXZpY2UgSUQgRXJyb3IsIHVzaW5nIDQgU2VyRGVzIGxhbmVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiA0OworCX0KKwlyZXR1cm4gNjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLTM5eC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzl4LmMKaW5kZXggMWM3YmU5NC4uNzIyYjAxYiAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzl4LmMKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMtMzl4LmMKQEAgLTIzMCw3ICsyMzAsMTAgQEAKIAogCQkvKiBFeGVjdXRpbmcgcG93ZXIgdXAsIHJlZiBjbG9jayBzZXQsIHNwZWVkIGNvbmZpZyBhbmQgVFggY29uZmlnICovCiAJCXN3aXRjaCAoc2VyZGVzVHlwZSkgewotICAgICAgICBjYXNlIFNHTUlJMzoKKyAgICAgICAgY2FzZSBTR01JSXYzXzA6CisJY2FzZSBTR01JSXYzXzE6CisJY2FzZSBTR01JSXYzXzI6CisJY2FzZSBTR01JSXYzXzM6CiAJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgU0dNSUlfUE9XRVJfVVBfU0VRKSk7CiAJCQlDSEVDS19TVEFUVVMobXZId3NSZWZDbG9ja1NldChzZXJkZXNOdW0sIHNlcmRlc1R5cGUsIHJlZkNsb2NrKSk7CiAJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgc3BlZWRTZXFJZCkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMuYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLmMKaW5kZXggMmVjZDNkNC4uMDNlODU3MyAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMuYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy5jCkBAIC0xMTgsOSArMTE4LDExIEBACiAvKiBTZXJkZXNMYW5lSW5Vc2VDb3VudCBjb250YWlucyB0aGUgZXhhY3QgYW1vdW50IG9mIHNlcmRlcyBsYW5lcyBuZWVkZWQgcGVyIHR5cGUgKi8KIE1WX1U4IFNlcmRlc0xhbmVJblVzZUNvdW50W01BWF9VTklUU19JRF1bTUFYX1VOSVRfTlVNQl0gPQogeworCS8qIGlmIFBFWDAgaXMgZGVmaW5lcyBhcyBQRVh4NCBpdCBjYW4gdXNlIDQgbGFuZXM7IGluIFBFWHgxIG9ubHkgMQorCXRoZSB2YWx1ZSBmb3IgUEVYIDAgaXMgdXBkYXRlZCBpbiBtdkh3c1NlcmRlc1RvcG9sb2d5VmVyaWZ5IGZ1bmN0aW9uICovCiAJLyogMCAgMSAgMiAgMyAgICAqLwotCXsgIDEsIDEsIDEsIDEgfSwgIC8qIFBFWCAgICAgKi8KLQl7ICAxLCAxLCAxLCAxIH0sICAvKiBFVEhfR0lHICovCisJeyAgNCwgMSwgMSwgMSB9LCAgLyogUEVYICAgICAqLworCXsgIDEsIDEsIDEsIDEgfSwgIC8qIEVUSF9TR01JSSAqLwogCXsgIDEsIDEsIDAsIDAgfSwgIC8qIFVTQjNIICAgKi8KIAl7ICAxLCAxLCAxLCAwIH0sICAvKiBVU0IzRCAgICovCiAJeyAgMSwgMSwgMSwgMSB9LCAgLyogU0FUQSAgICAqLwpAQCAtMTM2LDU2ICsxMzgsNjEgQEAKIE1WX1U4IGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW0xBU1RfU0VSREVTX1RZUEVdW01BWF9TRVJERVNfTEFORVNdID0KIHsKIAkvKiAwICAgICAgMSAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAqLwotCXsgMHgxLCAgIDB4MSwgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQSAgIH0sICAvKiBQRVgwICovCi0JeyBOQSwgICAgTkEsICAgICAweDEsCSBOQSwJIDB4MSwJIE5BLCAgICAgMHgxICB9LCAgLyogUEVYMSAqLwotCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIDB4NywJIDB4MSwgICAgTkEJICB9LCAgLyogUEVYMiAqLwotCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDEsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogUEVYMyAqLwotCXsgMHgyLCAgIDB4MywgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBTQVRBMCAqLwotCXsgTkEsICAgIE5BLCAgICAgMHgzLAkgTkEsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogU0FUQTEgKi8KLQl7IE5BLCAgICBOQSwgICAgIE5BLAkgTkEsCSAweDYsCSAweDIsICAgIE5BCSAgfSwgIC8qIFNBVEEyICovCi0JeyBOQSwJIE5BLCAgICAgTkEsCSAweDMsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogU0FUQTMgKi8KLQl7IDB4MywgICAweDQsICAgIE5BLCAgICAgTkEsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogU0dNSUkwICovCi0JeyBOQSwgICAgMHg1LCAgICAweDQsICAgIE5BLAkgMHgzLAkgTkEsICAgICBOQQkgIH0sICAvKiBTR01JSTEgKi8KLQl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg0LAkgTkEsCSAweDMsICAgIE5BCSAgfSwgIC8qIFNHTUlJMiAqLwotCXsgTkEsICAgIDB4NywgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBRU0dNSUkgKi8KLQl7IE5BLCAgICAweDYsICAgIE5BLAkgTkEsCSAweDQsCSBOQSwgICAgIE5BCSAgfSwgIC8qIFVTQjNfSE9TVDAgKi8KLQl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg1LAkgTkEsCSAweDQsICAgIE5BCSAgfSwgIC8qIFVTQjNfSE9TVDEgKi8KLQl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg2LAkgMHg1LAkgMHg1LCAgICBOQQkgIH0sICAvKiBVU0IzX0RFVklDRSAqLworCXsgMHgxLCAgIDB4MSwgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogUEVYMCAqLworCXsgTkEsICAgIE5BLCAgICAgMHgxLAkgTkEsCSAweDEsCSBOQSwgICAgIDB4MQl9LCAgLyogUEVYMSAqLworCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIDB4NywJIDB4MSwgICAgTkEJfSwgIC8qIFBFWDIgKi8KKwl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHgxLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBQRVgzICovCisJeyAweDIsICAgMHgzLCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BCX0sICAvKiBTQVRBMCAqLworCXsgTkEsICAgIE5BLCAgICAgMHgzLAkgTkEsCSBOQSwJIE5BLCAgICAgTkEJfSwgIC8qIFNBVEExICovCisJeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgMHg2LAkgMHgyLCAgICBOQQl9LCAgLyogU0FUQTIgKi8KKwl7IE5BLAkgTkEsICAgICBOQSwJIDB4MywJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogU0FUQTMgKi8KKwl7IDB4MywgICAweDQsICAgIE5BLCAgICAgTkEsCSBOQSwJIE5BLCAgICAgTkEJfSwgIC8qIFNHTUlJMCAqLworCXsgTkEsICAgIDB4NSwgICAgMHg0LCAgICBOQSwJIDB4MywJIE5BLCAgICAgTkEJfSwgIC8qIFNHTUlJMSAqLworCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDQsCSBOQSwJIDB4MywgICAgTkEJfSwgIC8qIFNHTUlJMiAqLworCXsgTkEsICAgIDB4NywgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQQl9LCAgLyogUVNHTUlJICovCisJeyBOQSwgICAgMHg2LCAgICBOQSwJIE5BLAkgMHg0LAkgTkEsICAgICBOQQl9LCAgLyogVVNCM19IT1NUMCAqLworCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDUsCSBOQSwJIDB4NCwgICAgTkEJfSwgIC8qIFVTQjNfSE9TVDEgKi8KKwl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg2LAkgMHg1LAkgMHg1LCAgICBOQQl9LCAgLyogVVNCM19ERVZJQ0UgKi8KICNpZmRlZiBNVjg4RjY5WFgKLQl7IE5BLCAgICBOQSwgICAgIDB4NSwJIE5BLAkgMHg4LAkgTkEsICAgICAweDIgIH0sICAvKiBTR01JSTMgKi8KKwl7IDB4NCwJIDB4OCwgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQSAgIH0sICAvKiBTR01JSXYzLTAgKi8KKwl7IE5BLCAgICAweDksICAgIDB4NSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BICAgfSwgIC8qIFNHTUlJdjMtMSAqLworCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDcsCSBOQSwJIDB4NiwgICAgTkEgICB9LCAgLyogU0dNSUl2My0yICovCisJeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgMHg4LAkgTkEsICAgICAweDIgIH0sICAvKiBTR01JSXYzLTMgKi8KIAl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg4LAkgMHg5LAkgMHg4LCAgICAweDQgIH0sICAvKiBYQVVJICovCiAJeyBOQSwgICAgTkEsICAgICBOQSwJIE5BLAkgTkEsCSAweDgsICAgIDB4NCAgfSwgIC8qIFJYQVVJICovCiAjZW5kaWYKLQl7IDB4MCwgICAweDAsICAgIDB4MCwJIDB4MCwJIDB4MCwJIDB4MCwgICAgTkEJICB9ICAgLyogREVGQVVMVF9TRVJERVMgKi8KKwl7IDB4MCwgICAweDAsICAgIDB4MCwJIDB4MCwJIDB4MCwJIDB4MCwgICAgTkEgICB9ICAgLyogREVGQVVMVF9TRVJERVMgKi8KIH07CiAKIC8qIFNlbGVjdG9yIG1hcHBpbmcgZm9yIFBFWCBieSA0IGNvbmZpdXJhdGlvbiAqLwogTVZfVTggY29tbW9uUGh5c1NlbGVjdG9yc1BleEJ5NExhbmVzW10gPSB7IDB4MSwgMHgyLCAweDIsIDB4MiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2VyZGVzVHlwZVRvU3RyaW5nW10gPSB7Ci0JIlBDSWUwIiwKLQkiUENJZTEiLAotCSJQQ0llMiIsCi0JIlBDSWUzIiwKLQkiU0FUQTAiLAotCSJTQVRBMSIsCi0JIlNBVEEyIiwKLQkiU0FUQTMiLAotCSJTR01JSTAiLAotCSJTR01JSTEiLAotCSJTR01JSTIiLAotCSJRU0dNSUkiLAotCSJVU0IzIEhPU1QwIiwKLQkiVVNCMyBIT1NUMSIsCisJIlBDSWUwICAgICAgIiwKKwkiUENJZTEgICAgICAiLAorCSJQQ0llMiAgICAgICIsCisJIlBDSWUzICAgICAgIiwKKwkiU0FUQTAgICAgICAiLAorCSJTQVRBMSAgICAgICIsCisJIlNBVEEyICAgICAgIiwKKwkiU0FUQTMgICAgICAiLAorCSJTR01JSTAgICAgICIsCisJIlNHTUlJMSAgICAgIiwKKwkiU0dNSUkyICAgICAiLAorCSJRU0dNSUkgICAgICIsCisJIlVTQjMgSE9TVDAgIiwKKwkiVVNCMyBIT1NUMSAiLAogCSJVU0IzIERFVklDRSIsCi0gICAgIlNHTUlJMyIsCi0gICAgIlhBVUkiLAotICAgICJSWEFVSSIsCisJIlNHTUlJdjMtMCAgIiwKKwkiU0dNSUl2My0xICAiLAorCSJTR01JSXYzLTIgICIsCisJIlNHTUlJdjMtMyAgIiwKKwkiWEFVSSAgICAgICAiLAorCSJSWEFVSSAgICAgICIsCiAJIkRFRkFVTFQgU0VSREVTIiwKIAkiTEFTVF9TRVJERVNfVFlQRSIKIH07CiAKLQogdHlwZWRlZiBzdHJ1Y3Qgc2VyZGVzVW5pdERhdGEgewogCU1WX1U4IHNlcmRlc1VuaXRJZDsKIAlNVl9VOCBzZXJkZXNVbml0TnVtOwpAQCAtMjAwLDE2ICsyMDcsMTkgQEAKIAl7CVNBVEFfVU5JVF9JRCwJMSwJfSwKIAl7CVNBVEFfVU5JVF9JRCwJMiwJfSwKIAl7CVNBVEFfVU5JVF9JRCwJMywJfSwKLQl7CUVUSF9HSUdfVU5JVF9JRCwwLAl9LAotCXsJRVRIX0dJR19VTklUX0lELDEsCX0sCi0JewlFVEhfR0lHX1VOSVRfSUQsMiwJfSwKKwl7CVNHTUlJX1VOSVRfSUQsMCwJfSwKKwl7CVNHTUlJX1VOSVRfSUQsMSwJfSwKKwl7CVNHTUlJX1VOSVRfSUQsMiwJfSwKIAl7CVFTR01JSV9VTklUX0lELAkwLAl9LAogCXsJVVNCM0hfVU5JVF9JRCwJMCwJfSwKIAl7CVVTQjNIX1VOSVRfSUQsCTEsCX0sCiAJewlVU0IzRF9VTklUX0lELAkwLAl9LAotICAgIHsJRVRIX0dJR19VTklUX0lELDMsCX0sCi0gICAgewlYQVVJX1VOSVRfSUQsCTAsCX0sCi0gICAgewlSWEFVSV9VTklUX0lELAkwLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwwLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwxLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwyLAl9LAorCXsJU0dNSUlfVU5JVF9JRCwzLAl9LAorCXsJWEFVSV9VTklUX0lELAkwLAl9LAorCXsJUlhBVUlfVU5JVF9JRCwJMCwJfSwKIH07CiAKIApAQCAtMjQ4LDcgKzI1OCw3IEBACiAJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwgICAgICAgICAgIDB4OTAwMDYsCXsgMHg4MDAwMiwJCTB4ODAwMDIgfSwgCQkwLCAgICAgICAgICAwICAgICAgIH0sICAvKiBQb3dlciBVcCAqLwogCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCQkgICAgMHg3ODAwLAkJeyAweDYwMDAsCQkweDYwMDAgIH0sIAkJMCwJCSAgICAwICAgICAgIH0sICAvKiBVbnJlc2V0ICovCiAJeyBQT1dFUl9BTkRfUExMX0NUUkxfUkVHLAkgCSAgICAweDgwMCwJCSAgICAweDBFMCwJCXsgMHgwLAkJCTB4ODAgICAgfSwgCQkwLAkJICAgIDAgICAgICAgfSwgIC8qIFBoeSBTZWxlY3RvciAqLwotICAgIHsgTUlTQ19SRUcsCQkJIAkJICAgICAgICAweDgwMCwJCSAgICAweDQ0MCwJCXsgMHg0NDAsCSAgICAweDQwMAl9LCAgICAgIDAsCSAgICAgICAgMAkgICAgfSAgIC8qIFJlZiBjbG9jayBzb3VyY2Ugc2VsZWN0ICovIAorICAgIHsgTUlTQ19SRUcsCQkJIAkJICAgICAgICAweDgwMCwJCSAgICAweDQ0MCwJCXsgMHg0NDAsCSAgICAweDQwMAl9LCAgICAgIDAsCSAgICAgICAgMAkgICAgfSAgIC8qIFJlZiBjbG9jayBzb3VyY2Ugc2VsZWN0ICovCiB9OwogCiAvKiBTQVRBIGFuZCBTR01JSSAtIHNwZWVkIGNvbmZpZyBzZXEgKi8KQEAgLTMzOCw3ICszNDgsNyBAQAogICAgIHsgRzJfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHgzRkYsCXsgMHgzRDIJCX0sCTAsCSAgICAwCX0sICAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICAgeyBHM19TRVRUSU5HU18wX1JFRywJCQkweDgwMCwJICAweEZGRkYsCXsgMHhFNkUJCX0sCTAsCSAgICAwCX0sICAvKiBHM19UWCBTTEVXLCBFTVBIMSBhbmQgQU1QICovCiAgICAgeyBHM19TRVRUSU5HU18xX1JFRywJCQkweDgwMCwJICAweDQ3RkYsCXsgMHg3RDIJCX0sCTAsCSAgICAwCX0sICAvKiBHM19SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICYgREZFX0VuIEdlbjMsIERDIHdhbmRlciBjYWxpYnJhdGlvbiBkaXMgKi8KLSAgICB7IFBDSUVfUkVHMCwgICAgICAgIAkJCTB4ODAwLCAgICAweDEwMDAsCXsgMHgwCQl9LAkwLAkgICAgMCAgIH0sICAvKiBCaXRbMTJdPTB4MCCWIGlkbGVfc3luY19lbiAqLworICAgIHsgUENJRV9SRUcwLCAgICAgICAgCQkJMHg4MDAsICAgIDB4MTAwMCwJeyAweDAJCX0sCTAsCSAgICAwICAgfSwgIC8qIEJpdFsxMl09MHgwICBpZGxlX3N5bmNfZW4gKi8KICAgICB7IFJYX1JFRzIsICAgICAgICAgIAkJCTB4ODAwLCAgICAweEYwLAkJeyAweDcwLAkJfSwJMCwJICAgIDAgICB9LCAgLyogRHRsIENsYW1waW5nIGRpc2FibGUgYW5kIER0bCBjbGFtcGluZyBTZWwoNjAwMHBwbSkgKi8KICAgICB7IFZUSElNUENBTF9DVFJMX1JFRywJCQkweDgwMCwJICAweEZGMDAsCXsgMHgzMDAwCX0sCTAsCSAgICAwCX0sIC8qIHR4aW1wY2FsX3RoIGFuZCByeGltcGNhbF90aCAqLwogICAgIHsgREZFX1JFRzAsICAgICAgICAgCQkJMHg4MDAsICAgIDB4QTAwRiwJeyAweDgwMEEJfSwJMCwJICAgIDAgICB9LCAvKiBERkVfU1RFUF9GSU5FX0ZYWzM6MF0gPTB4QSAqLwpAQCAtMzgxLDIwICszOTEsMjAgQEAKIAl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjRfUkVHLCAgICAweDI4LAkJCTB4MywJCQl7IDB4MSwJCSAgICAweDEgICAgICAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKIAl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkJCTB4NzgwMCwJCQl7IDB4NjAwMCwJICAgIDB4RTAwMCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAogCXsgR0xPQkFMX0NMS19DVFJMLAkJCQkgICAgMHg4MDAsCQkJMHhELAkJCXsgMHg1LAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAotCXsgTUlTQ19SRUcsCSAgIAkJCQkJICAgIDB4ODAwLCAgICAgICAgICAweDRDMCwJICAgICAJeyAweDgwLCAgICAgICAgIDB4NEMwIAkgICAgfSwgCSAgICAwLAkgICAgICAgIDAgICAgICAgfSAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8gCisJeyBNSVNDX1JFRywJICAgCQkJCQkgICAgMHg4MDAsICAgICAgICAgIDB4NEMwLAkgICAgIAl7IDB4ODAsICAgICAgICAgMHg0QzAgCSAgICB9LCAJICAgIDAsCSAgICAgICAgMCAgICAgICB9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLwogfTsKIAogLyogUEVYIGFuZCBVU0IzIC0gcG93ZXIgdXAgc2VxIGZvciBTZXJkZXMgUmV2IDIuMSAqLwogTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MlBhcmFtc1tdID0KIHsKIAkvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgICAgbWFzayAgICAgICAgICAgIFBFWCBkYXRhICAgICAgICBVU0IzIGRhdGEgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwotCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCQkgICAgMHgzRkM3RjgwNiwgICAgIHsgMHg0NDcxODA0LCAgICAweDQ0Nzk4MDQgICB9LCAgICAgIDAsICAgICAgICAgIDAJICAgIH0sCi0JeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04yX1JFRywgICAgMHgyOCwJCQkweDVDLAkJICAgIHsgMHg1OCwJCSAgICAweDU4ICAgICAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKLQl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjRfUkVHLCAgICAweDI4LAkJCTB4MywJCQl7IDB4MSwJCSAgICAweDEgICAgICAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKLQl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkJCTB4NzgwMCwJCQl7IDB4NjAwMCwJICAgIDB4RTAwMCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAotCXsgR0xPQkFMX0NMS19DVFJMLAkJCQkgICAgMHg4MDAsCQkJMHhELAkJCXsgMHg1LAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAotCXsgR0xPQkFMX01JU0NfQ1RSTCwJCQkJICAgIDB4ODAwLAkJCTB4QzAsCQkJeyAweDAsCQkgICAgTk9fREFUQSAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCi0JeyBNSVNDX1JFRywJICAgCQkJCQkgICAgMHg4MDAsCSAgICAJMHg0QzAsCSAgICAgCXsgMHg4MCwgICAgICAgICAweDRDMCAJICAgIH0sIAkgICAgMCwJICAgICAgICAwCQl9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLyAKKwl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkweDNGQzdGODA2LCAgICAgeyAweDQ0NzE4MDQsICAgIDB4NDQ3OTgwNCAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAorCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMl9SRUcsICAgIDB4MjgsCTB4NUMsCQl7IDB4NTgsCQkgICAgMHg1OCAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKKwl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjRfUkVHLCAgICAweDI4LAkweDMsCQl7IDB4MSwJCSAgICAweDEgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAorCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCTB4NzgwMCwJCXsgMHg2MDAwLAkgICAgMHhFMDAwICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKKwl7IEdMT0JBTF9DTEtfQ1RSTCwJCSAgICAweDgwMCwJMHgzRCwJCXsgMHgzNSwJCSAgICAweDIxICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAorCXsgR0xPQkFMX01JU0NfQ1RSTCwJCSAgICAweDgwMCwJMHhDMCwJCXsgMHgwLAkJICAgIE5PX0RBVEEgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCisJeyBNSVNDX1JFRywJICAgCQkgICAgMHg4MDAsICAgCTB4NEMwLAkJeyAweDgwLAkJICAgIDB4NEMwICAgfSwJCTAsCSAgICAwCSAgICB9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLwogfTsKIAogLyogUEVYIGFuZCBVU0IzIC0gc3BlZWQgY29uZmlnIHNlcSAqLwpAQCAtNDE5LDE0ICs0MjksMjQgQEAKIAogTVZfT1BfUEFSQU1TIHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtc1tdID0KIHsKLQl7IExBTkVfQ0ZHNF9SRUcsCQkJMHg4MDAsCQkweDgwLAkJeyAweDgwICAgICAgfSwJCTAsCQkJMAkgCX0sIC8qIFNwcmVhZCBTcGVjdHJ1bSBDbG9jayBFbmFibGUgKi8KLQl7IEcyX1NFVFRJTkdTXzJfUkVHLAkJMHg4MDAsCQkweEZFNDAsCQl7IDB4NDQ0MCAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIEcyX1RYX1NTQ19BTVBbNjowXT00LjVrUFBNIGFuZCBUWCBlbXBoYXNpcyBtb2RlPW1WICovCi0JeyBHMl9TRVRUSU5HU18xX1JFRywJCTB4ODAwLAkJMHgzRkYsCQl7IDB4M0QyICAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIEcyX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KLQl7IFJYX1JFRzIsCQkJCSAJMHg4MDAsCQkweEYwLAkJeyAweDcwICAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiBEdGwgQ2xhbXBpbmcgZGlzYWJsZSBhbmQgRHRsLWNsYW1waW5nLVNlbCg2MDAwcHBtKSAqLwotCXsgUkVGX1JFRzAsCQkgCQkJMHg4MDAsCQkweDM4LAkJeyAweDIwICAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiB2Y29fY2FsX3Z0aF9zZWwgKi8KLSAgICB7IExBTkVfQ0ZHNV9SRUcsCQkJMHg4MDAsCQkweDQsCQl7IDB4NCAgICAgICB9LAkJMCwJCQkwCSAJfSwgLyogU3ByZWFkIFNwZWN0cnVtIENsb2NrIEVuYWJsZSAqLwotfTsKKwl7IExBTkVfQ0ZHNF9SRUcsCQkweDgwMCwJCTB4QzIsCQl7IDB4QzAJCX0sCTAsCTAgCX0sIC8qIEJpdFs3XT0weDEgLSBTcHJlYWQgU3BlY3RydW0gQ2xvY2sgRW5hYmxlLEJpdFs2XS0weDEtIENGR19ERkVfT1ZFUlJJREUsQml0WzFdLTB4MC1QSU5fREZFX1BBVF9ESVMsICovCisJeyBMQU5FX0NGRzVfUkVHLAkJMHg4MDAsCQkweDMsCQl7IDB4MwkJfSwJCTAsCTAgCX0sIC8qIEJpdFsxXT0weDEgLSBDRkdfU1FfREVUX1NFTCxCaXRbMF09MHgxLUNGR19SWF9JTklUX1NFTCwgKi8KKwl7IEcyX1NFVFRJTkdTXzJfUkVHLAkJMHg4MDAsCQkweEZFNDAsCQl7IDB4NDQ0MAl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRzWzE1OjldPSAweDIyIC1HMl9UWF9TU0NfQU1QWzY6MF09NC41a1BQTSxCaXRzWzZdID0gMHgxIC0gVFggZW1waGFzaXMgbW9kZT1tViAqLworCXsgRzJfU0VUVElOR1NfM19SRUcsCQkweDgwMCwJCTB4RkYsCQl7IDB4RUYJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdFs3XSA9MHgxICBGRkUgU2V0dGluZyBGb3JjZTtCaXRzWzY6NF09MHg2ICBGRkVfUkVTO0JpdHNbMzowXSA9IDB4RiAgRkZFX0NBUDsgKi8KKwl7IEcyX1NFVFRJTkdTXzRfUkVHLAkJMHg4MDAsCQkweDMwMCwJCXsgMHgzMDAJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdHNbOTo4XT0weDAgLSAgRzJfREZFX1JFU1sxOjBdKi8KKwl7IFBMTElOVFBfUkVHMSwJICAgICAgICAJMHg4MDAsCQkweDMwMCwJCXsgMHgzMDAJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdHNbOTo4XT0weDMgIEhQRl9Cd1sxOjBdICovCisJeyBWVEhJTVBDQUxfQ1RSTF9SRUcsCQkweDgwMCwJCTB4RkYwMCwJCXsgMHgzMDAwCX0sCQkwLAkwIAl9LCAvKiBCaXRzWzE1OjEyXT0gMHgzIC0gdHhpbXBjYWxfdGg7Qml0c1sxMTo4XSA9IDB4MCAtIFJYSU1QQ0FMX1RIICovCisJeyBMQU5FX0NGRzVfUkVHLAkJMHg4MDAsCQkweDMsCQl7IDB4MwkJfSwJCTAsCTAgCX0sIC8qIEJpdFsxXT0weDEgLSBDRkdfU1FfREVUX1NFTCxCaXRbMF09MHgxLUNGR19SWF9JTklUX1NFTCwgKi8KKwl7IE1JU0NfUkVHLAkgICAgICAgICAgICAJMHg4MDAsCQkweDQyRiwJCXsgMHg0MkEJCX0sCQkwLCAgICAgIDAgCX0sIC8qIEJpdFsxMF09MHgxIC0gUkVGQ0xLX1NFTCg9MjVNaHopO0JpdFs1XT0weDEgIElDUF9GT1JDRV9FbjtCaXRzWzM6MF09MHhBICBJQ1A9MHhBKDIxMHVBKTsgKi8KKwl7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsCTB4ODAwLAkJMHgxRiwJCXsgMHgwMgkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1s0OjBdID0weDIgLSBSRUZfRlJFRl9TRUwoPTI1TWh6KSAqLworCXsgRzJfU0VUVElOR1NfMV9SRUcsCQkweDgwMCwJCTB4M0ZGLAkJeyAweDNEMgkJfSwJCTAsICAgICAgMCAJfSwgLyogQml0c1s5OjhdPTB4My0gRzJfUlhfU0VMTVVGRjtCaXRzWzc6Nl09MHgzLSBHMl9SWF9TRUxNVUZJO0JpdHNbNTozXT0weDIgIEcyX1JYX1NFTE1VUEY7Qml0c1syOjBdPTB4MiAtICBHMl9SWF9TRUxNVVBJKi8KKwl7IFJYX1JFRzIsCQkJMHg4MDAsCQkweEYwLAkJeyAweDcwCQl9LAkJMCwgICAgICAwIAl9LCAvKiBEdGwgQ2xhbXBpbmcgZGlzYWJsZSBhbmQgRHRsLWNsYW1waW5nLVNlbCg2MDAwcHBtKSAqLworCXsgUENJRV9SRUcxLAkJCTB4ODAwLAkJMHhGODAsCQl7IDB4RDAwCQl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRzWzExOjddPTB4MWEgLSAgdHhfYW1wX3BpcGVfdjBbNDowXSAqLworCXsgUkVGX1JFRzAsCQkgCTB4ODAwLAkJMHgzOCwJCXsgMHgyMAkJfSwJCTAsICAgICAgMCAJfSwgLyogdmNvX2NhbF92dGhfc2VsICovCisJeyBMQU5FX0NGRzBfUkVHLAkJMHg4MDAsCQkweDEsCQl7IDB4MQkJfSwJCTAsCTAgCX0sIC8qIEJpdFswXT0weDEtIFBSRF9UWERFRU1QSDAgKi8KKwl7IEdMT0JBTF9URVNUX0NUUkwsCQkweDgwMCwJCTB4NCwJCXsgMHg0CQl9LAkJMCwgICAgICAwIAl9LCAvKiBCaXRbNF09MHgxLU1PREVfTUFSR0lOX09WRVJSSURFICovCiAKK307CiAvKiBQRVggYW5kIFVTQjMgLSBUWCBjb25maWcgc2VxICovCiAKIC8qIEZvciBQRVh4MTogdGhlIHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczEvMi8zIGNvbmZpZ3VyYXRpb25zIHNob3VsZCBydW4KQEAgLTQzOCw5ICs0NTgsNiBAQAogICAgIC8qIHVuaXRCYXNlUmVnICAgIHVuaXRPZmZzZXQgICAgbWFzayAgICAgICAgUEVYIGRhdGEgICAgVVNCMyBkYXRhICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgIHsgR0xPQkFMX0NMS19DVFJMLCAgMHg4MDAsICAgICAgMHgxLCAgICAgICAgeyAweDAsICAgICAgMHgwICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwKICAgICB7IDB4MCwgICAgICAgICAgICAgIDB4MCwgICAgICAgIDB4MCwgICAgICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgICAgICAxMCwgICAgICAgICAwICAgICAgIH0sIC8qIDEwbXMgZGVsYXkgKi8KLSAgICB7IFJYX1JFRzMsICAgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHhEQywgICAgIE5PX0RBVEEgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIG9zX3BoX29mZnNldF9mb3JjZSAoYWxpZ24gOTApICovCi0gICAgeyBSWF9SRUczLCAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICB7IDB4MTAwLCAgICBOT19EQVRBIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBTZXQgb3NfcGhfdmFsaWQgKi8KLSAgICB7IFJYX1JFRzMsICAgICAgICAgIDB4ODAwLCAgICAgIDB4MTAwLCAgICAgIHsgMHgwLCAgICAgIE5PX0RBVEEgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFVuc2V0IG9zX3BoX3ZhbGlkICovCiB9OwogCiBNVl9PUF9QQVJBTVMgcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMltdID0KQEAgLTQ1MiwxOCArNDY5LDIxIEBACiBNVl9PUF9QQVJBTVMgcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zM1tdID0KIHsKIAkvKiB1bml0QmFzZVJlZyAgICB1bml0T2Zmc2V0ICAgCW1hc2sgICAgICAgIFBFWCBkYXRhICAgIFVTQjMgZGF0YSAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KLQl7IFJFU0VUX0RGRV9SRUcsICAgCTB4ODAwLAkJMHg0MDEsICAgICAgeyAweDAsICAgICAgMHgwICAgICB9LCAJICAgIDAsICAgICAgICAgIDAJCX0sIC8qIFNmdCBSZXNldCBwdWxzZSAqLwotCXsgMHgwLAkJICAgCQkweDAsCQkweDAsCSAgICB7IDB4MCwgICAgICAweDAgICAgIH0sIAkgICAgMTAsCSAgICAgICAgMAkJfSAgLyogMTBtcyBkZWxheSAqLworCXsgUkVTRVRfREZFX1JFRywgICAgMHg4MDAsCTB4NDAxLCAgICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwJMCwgICAgICAgICAgMAkJfSwgLyogU2Z0IFJlc2V0IHB1bHNlICovCisJeyAweDAsCQkgICAgMHgwLAkweDAsCSAgICB7IDB4MCwgICAgICAweDAgICAgIH0sIAkxMCwJICAgIDAJCX0sIC8qIDEwbXMgZGVsYXkgKi8KKwl7IFJYX1JFRzMsICAgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHhEQywgICAgIDB4RDggICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgICAgICB9LCAvKiBvc19waF9vZmZzZXRfZm9yY2UgKGFsaWduIDkwKSAqLworCXsgUlhfUkVHMywgICAgICAgICAgMHg4MDAsICAgICAgMHgxMDAsICAgICAgeyAweDEwMCwgICAgMHgxMDAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgICAgIH0sIC8qIFNldCBvc19waF92YWxpZCAqLworCXsgUlhfUkVHMywgICAgICAgICAgMHg4MDAsICAgICAgMHgxMDAsICAgICAgeyAweDAsICAgICAgMHgwICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgICAgIH0sIC8qIFVuc2V0IG9zX3BoX3ZhbGlkICovCiB9OwogCiAvKiBQRVggYnkgNCBjb25maWcgc2VxICovCiBNVl9PUF9QQVJBTVMgcGV4Qnk0Q29uZmlnUGFyYW1zW10gPQogewogCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgICAgICBkYXRhICAgICAgICAgICAgICAgIAkJCXdhaXRUaW1lICAgbnVtT2ZMb29wcyAqLwotCXsgR0xPQkFMX0NMS19TUkNfSEksCTB4ODAwLCAgICAgICAweDcsICAgICAgeyAweDUsIDB4MCwgMHgwLCAweDIgCQkJfSwgICAgIAkwLCAgICAgICAgICAwICAgICAgIH0sCi0gICAgeyBMQU5FX0FMSUdOX1JFRzAsICAgICAgMHg4MDAsICAgICAgIDB4MTAwMCwgICB7IDB4MCwgMHgwLCAweDAsIDB4MCAJCQl9LCAgICAgCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBMYW5lIEFsaWduZW1lbnQgZW5hYmxlICovCi0JeyBDQUxJQlJBVElPTl9DVFJMX1JFRywJMHg4MDAsICAgICAgIDB4MTAwMCwgICB7IDB4MTAwMCwgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCB9LAkJMCwJICAgICAgICAwICAgICAgIH0sIC8qIE1heCBQTEwgcGh5IGNvbmZpZyAqLwotCXsgTEFORV9DRkcxX1JFRywJCTB4ODAwLCAgICAgICAweDYwMCwgICAgeyAweDYwMCwgMHg2MDAsIDB4NjAwLCAweDYwMCAJfSwJCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBNYXggUExMIHBpcGUgY29uZmlnICovCisJeyBHTE9CQUxfQ0xLX1NSQ19ISSwJMHg4MDAsICAgICAgIDB4NywgICAgICB7IDB4NSwgMHgwLCAweDAsIDB4MiAJCQl9LCAgICAgCTAsCQkwICAgICAgIH0sCisJeyBMQU5FX0FMSUdOX1JFRzAsICAgICAgMHg4MDAsICAgICAgIDB4MTAwMCwgICB7IDB4MCwgMHgwLCAweDAsIDB4MCAJCQl9LCAgICAgCTAsCQkwICAgICAgIH0sIC8qIExhbmUgQWxpZ25lbWVudCBlbmFibGUgKi8KKwl7IENBTElCUkFUSU9OX0NUUkxfUkVHLAkweDgwMCwgICAgICAgMHgxMDAwLCAgIHsgMHgxMDAwLCAweDEwMDAsIDB4MTAwMCwgMHgxMDAwCQl9LAkwLAkgICAgICAgIDAgICAgICAgfSwgLyogTWF4IFBMTCBwaHkgY29uZmlnICovCisJeyBMQU5FX0NGRzFfUkVHLAkweDgwMCwgICAgICAgMHg2MDAsICAgIHsgMHg2MDAsIDB4NjAwLCAweDYwMCwgMHg2MDAgCQl9LAkwLAkgICAgICAgIDAgICAgICAgfSwgLyogTWF4IFBMTCBwaXBlIGNvbmZpZyAqLwogfTsKIAogLyogVVNCMyBkZXZpY2UgZG9uZmlnIHNlcSAqLwpAQCAtNTQ4LDkgKzU2OCwyMSBAQAogCXsgMHhDMDAwQyAsICAgICAgICAweDAgLypOQSovLAkweDEwMDAwMDAsICB7MHgxMDAwMDAwfSwgIDAsICAgICAgICAwfSwgLyogUGh5MCByZWdpc3RlciAzICAtIFRYIENoYW5uZWwgY29udHJvbCAwICovCiAJeyAweEMyMDBDICwgICAgICAgIDB4MCAvKk5BKi8sCTB4MTAwMDAwMCwgIHsweDEwMDAwMDB9LCAgMCwgICAgICAgIDB9LCAvKiBQaHkwIHJlZ2lzdGVyIDMgIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgKi8KIAl7IDB4QzQwMEMgLCAgICAgICAgMHgwIC8qTkEqLywJMHgxMDAwMDAwLCAgezB4MTAwMDAwMH0sICAwLCAgICAgICAgMH0sIC8qIFBoeTAgcmVnaXN0ZXIgMyAgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAqLwotCXsgMHhDMDAwOCAsICAgICAgICAweDAgLypOQSovLAkweDgwODAwMDAwLCB7MHg4MDgwMDAwMH0sIDEsICAgICAxMDAwfSwgLyogY2hlY2sgUExMQ0FMX0RPTkUgaXMgc2V0IGFuZCBJTVBDQUxfRE9ORSBpcyBzZXQqLwotCXsgMHhDMDAxOCAsICAgICAgICAweDAgLypOQSovLAkweDgwMDAwMDAwLCB7MHg4MDAwMDAwMH0sIDEsICAgICAxMDAwfSwgLyogY2hlY2sgUkVHX1NRQ0FMX0RPTkUgIGlzIHNldCovCi0JeyAweEMwMDAwICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ODAwMDAwMDAsIHsweDgwMDAwMDAwfSwgMSwgICAgIDEwMDB9ICAvKiBjaGVjayBQTExfUkVBRFkgIGlzIHNldCovCisJeyAweEMwMDBDICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ZjAwMCwgICAgIHsweDEwMDB9LCAgICAgMCwgICAgICAgIDB9LCAvKiBEZWNyZWFzZSB0aGUgYW1wbGl0dWRlIG9mIHRoZSBsb3cgc3BlZWQgZXllIHRvIG1lZXQgdGhlIHNwZWMgKi8KKwl7IDB4QzIwMEMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmMDAwLCAgICAgezB4MTAwMH0sICAgICAwLCAgICAgICAgMH0sIC8qIERlY3JlYXNlIHRoZSBhbXBsaXR1ZGUgb2YgdGhlIGxvdyBzcGVlZCBleWUgdG8gbWVldCB0aGUgc3BlYyAqLworCXsgMHhDNDAwQyAsICAgICAgICAweDAgLypOQSovLAkweGYwMDAsICAgICB7MHgxMDAwfSwgICAgIDAsICAgICAgICAwfSwgLyogRGVjcmVhc2UgdGhlIGFtcGxpdHVkZSBvZiB0aGUgbG93IHNwZWVkIGV5ZSB0byBtZWV0IHRoZSBzcGVjICovCisJeyAweEMwMDA4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4NzAwLCAgICAgIHsweDYwMH0sICAgICAgMCwgICAgICAgIDB9LCAvKiBDaGFuZ2UgdGhlIEhpZ2ggc3BlZWQgaW1wZWRhbmNlIHRocmVzaG9sZCAqLworCXsgMHhDMjAwOCAsICAgICAgICAweDAgLypOQSovLAkweDcwMCwgICAgICB7MHg2MDB9LCAgICAgIDAsICAgICAgICAwfSwgLyogQ2hhbmdlIHRoZSBIaWdoIHNwZWVkIGltcGVkYW5jZSB0aHJlc2hvbGQgKi8KKwl7IDB4QzQwMDggLCAgICAgICAgMHgwIC8qTkEqLywJMHg3MDAsICAgICAgezB4NjAwfSwgICAgICAwLCAgICAgICAgMH0sIC8qIENoYW5nZSB0aGUgSGlnaCBzcGVlZCBpbXBlZGFuY2UgdGhyZXNob2xkICovCisJeyAweEMwMDE0ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ZiwgICAgICAgIHsweDh9LCAgICAgICAgMCwgICAgICAgIDB9LCAvKiBDaGFuZ2UgdGhlIHNxdWVsY2ggbGV2ZWwgb2YgdGhlIHJlY2VpdmVyIHRvIG1lZXQgdGhlIHJlY2VpdmVyIGVsZWN0cmljYWwgbWVhc3VyZW1lbnRzKHNxdWVsY2ggYW5kIHJlY2VpdmVyIHNlbnNpdGl2aXR5IHRlc3RzKSAqLworCXsgMHhDMjAxNCAsICAgICAgICAweDAgLypOQSovLAkweGYsICAgICAgICB7MHg4fSwgICAgICAgIDAsICAgICAgICAwfSwgLyogQ2hhbmdlIHRoZSBzcXVlbGNoIGxldmVsIG9mIHRoZSByZWNlaXZlciB0byBtZWV0IHRoZSByZWNlaXZlciBlbGVjdHJpY2FsIG1lYXN1cmVtZW50cyhzcXVlbGNoIGFuZCByZWNlaXZlciBzZW5zaXRpdml0eSB0ZXN0cykgKi8KKwl7IDB4QzQwMTQgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmLCAgICAgICAgezB4OH0sICAgICAgICAwLCAgICAgICAgMH0sIC8qIENoYW5nZSB0aGUgc3F1ZWxjaCBsZXZlbCBvZiB0aGUgcmVjZWl2ZXIgdG8gbWVldCB0aGUgcmVjZWl2ZXIgZWxlY3RyaWNhbCBtZWFzdXJlbWVudHMoc3F1ZWxjaCBhbmQgcmVjZWl2ZXIgc2Vuc2l0aXZpdHkgdGVzdHMpICovCisJeyAweEMwMDA4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ODA4MDAwMDAsIHsweDgwODAwMDAwfSwgMSwgICAgIDEwMDB9LCAvKiBDaGVjayBQTExDQUxfRE9ORSBpcyBzZXQgYW5kIElNUENBTF9ET05FIGlzIHNldCovCisJeyAweEMwMDE4ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ODAwMDAwMDAsIHsweDgwMDAwMDAwfSwgMSwgICAgIDEwMDB9LCAvKiBDaGVjayBSRUdfU1FDQUxfRE9ORSAgaXMgc2V0Ki8KKwl7IDB4QzAwMDAgLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDAwMDAwMCwgezB4ODAwMDAwMDB9LCAxLCAgICAgMTAwMH0sIC8qIENoZWNrIFBMTF9SRUFEWSAgaXMgc2V0Ki8KKwl7IDB4QzAwMDggLCAgICAgICAgMHgwIC8qTkEqLywJMHgyMDAwLCAgICAgezB4MjAwMH0sICAgICAwLCAgICAgICAgMH0sIC8qIFN0YXJ0IGNhbGlicmF0ZSBvZiBoaWdoIHNlZWQgaW1wZWRhbmNlICovCisJeyAweDAgLCAgICAgICAgICAgIDB4MCAvKk5BKi8sCTB4MCwgICAgICAgIHsweDB9LCAgICAgICAgMTAsICAgICAgIDB9LAorCXsgMHhDMDAwOCAsICAgICAgICAweDAgLypOQSovLAkweDIwMDAsICAgICB7MHgwfSwgICAgICAgIDAsICAgICAgICAwfSwgLyogRGUtYXNzZXJ0ICB0aGUgY2FsaWJyYXRpb24gc2lnbmFsICovCiB9OwogCiAvKioqKioqKioqKioqKioqKiovCkBAIC01NjEsNyArNTkzLDkgQEAKIE1WX09QX1BBUkFNUyBxc2dtaWlQb3J0UG93ZXJVcFBhcmFtc1tdID0KIHsKIAkvKiB1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgICAgdW5pdE9mZnNldCAgIAltYXNrICAgICAgICAgUVNHTUlJIGRhdGEJCXdhaXRUaW1lICAgbnVtT2ZMb29wcyAqLwotCXsgUVNHTUlJX0NPTlRST0xfUkVHMSwJCQkJMHgwLCAgCQkweDQwMDAwMDAwLAl7IDB4NDAwMDAwMDAJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBDb25uZWN0IHRoZSBRU0dNSUkgdG8gR2lnYWJpdCBFdGhlcm5ldCB1bml0cyAqLworCXsgUVNHTUlJX0NPTlRST0xfUkVHMSwJCQkJMHgwLCAgCQkweDQ0MDAwMDAwLAl7IDB4NDQwMDAwMDAJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBDb25uZWN0IFFTR01JSSB0byBHaWdhYml0IEV0aGVybmV0IHVuaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBzYW1wbGluZyBlZGdlIG9mIFR4IFFTR01JSSB0byBiZSBwb3NpdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFjaGl2ZSBwb3J0IHRoZSBzdGFiaWxpdHkgLSBKSVJBLTEyODIgICAgKi8KIAl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLAkweDI4LCAgCQkweEYwMDA2LAl7IDB4ODAwMDIJCX0sIAkgICAwLAkJICAwIH0sCSAgLyogUG93ZXIgVXAgKi8KIAl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLAkweDI4LAkJMHg3ODAwLAkgICAgeyAweDYwMDAJCX0sIAkgICAwLAkJICAwIH0sCSAgLyogVW5yZXNldCAqLwogCXsgUE9XRVJfQU5EX1BMTF9DVFJMX1JFRywJCQkweDgwMCwJCTB4RkYsCSAgICB7IDB4RkM4MQkJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBQaHkgU2VsZWN0b3IgKi8KQEAgLTU5MSw5ICs2MjUsOSBAQAogCXsgR0xVRV9SRUcsCQkJICAgICAgICAgICAgICAweDgwMCwJICAweDE4MDAsICAgICB7IDB4ODAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sCiAJeyBSRVNFVF9ERkVfUkVHLAkJICAgICAgICAgIDB4ODAwLAkgIDB4NDAxLAkgIHsgMHg0MDEJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogU2Z0IFJlc2V0IHB1bHNlICovCiAJeyBSRVNFVF9ERkVfUkVHLAkJICAgICAgICAgIDB4ODAwLAkgIDB4NDAxLAkgIHsgMHgwCQkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9LCAvKiBTZnQgUmVzZXQgcHVsc2UgKi8KLSAgICB7IExBTkVfQUxJR05fUkVHMCwgICAgICAgICAgICAgICAgMHg4MDAsCSAgMHgxMDAwLAkgIHsgMHgxMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIExhbmUgYWxpZ24gKi8KLSAgICB7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg3MDAwMCwgICAgeyAweDcwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFBvd2VyIHVwIFBMTCwgUlggYW5kIFRYICovCi0gICAgeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgIDB4MjgsCQkgIDB4ODAwMDAsICAgIHsgMHg4MDAwMAkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9ICAvKiBUeCBkcml2ZXIgb3V0cHV0IGlkbGUgKi8KKwl7IExBTkVfQUxJR05fUkVHMCwgICAgICAgICAgICAgICAgMHg4MDAsCSAgMHgxMDAwLAkgIHsgMHgxMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIExhbmUgYWxpZ24gKi8KKwl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg3MDAwMCwgICAgeyAweDcwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFBvd2VyIHVwIFBMTCwgUlggYW5kIFRYICovCisJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgIDB4MjgsCQkgIDB4ODAwMDAsICAgIHsgMHg4MDAwMAkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9ICAvKiBUeCBkcml2ZXIgb3V0cHV0IGlkbGUgKi8KIH07CiAKIE1WX09QX1BBUkFNUyBxc2dtaWlQb3J0VHhDb25maWdQYXJhbXMyW10gPQpAQCAtNjQxLDggKzY3NSw3IEBACiAKIE1WX1UzMiBtdkh3c1NlcmRlc1RvcG9sb2d5VmVyaWZ5KFNFUkRFU19UWVBFIHNlcmRlc1R5cGUsIE1WX1UzMiBzZXJkZXNJZCwgU0VSREVTX01PREUgc2VyZGVzTW9kZSkKIHsKLQotCU1WX1UzMiB0ZXN0UmVzdWx0ID0gMDsKKwlNVl9VMzIgdGVzdFJlc3VsdCA9IFRPUE9MT0dZX1RFU1RfT0s7CiAJTVZfVTggc2VyZE1heE51bWIsdW5pdE51bWI7CiAJTVZfVU5JVF9JRCB1bml0SWQ7CiAKQEAgLTY1NCw0MiArNjg3LDQzIEBACiAJdW5pdE51bWIgPXNlcmRlc1R5cGVUb1VuaXRJbmZvW3NlcmRlc1R5cGVdLnNlcmRlc1VuaXROdW07CiAJc2VyZE1heE51bWIgPSBtdlN5c0VudlVuaXRNYXhOdW1HZXQodW5pdElkKTsKIAotCWlmIChTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXSAhPSAwKSB7CQkvKiBpZiBkaWRuJ3QgZXhjZWVkIGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwotCQlTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXS0tOwkJCS8qIHVwZGF0ZSBhbW91bnQgb2YgcmVxdWlyZWQgU2VyZGVzIGxhbmVzIGZvciBjdXJyZW50IHR5cGUgKi8KLQotCQlpZiAoU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPT0gMCl7CS8qIGlmIHJlYWNoZWQgdGhlIGV4YWN0IGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwotCQlpZiAoKChzZXJkZXNUeXBlIDw9IFBFWDMpKSAmJiAoKHNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkgfHwgKHNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkpKQotCQkJc2VyZGVzVW5pdENvdW50W1BFWF9VTklUX0lEXSArPTI7CQkJCS8qIFBDaWV4NCB1c2VzIDIgU2VyRGVzICovCi0JCWVsc2UKLQkJCXNlcmRlc1VuaXRDb3VudFt1bml0SWRdKys7Ci0KLQkJaWYgKHNlcmRlc1VuaXRDb3VudFt1bml0SWRdID4gc2VyZE1heE51bWIpCQkJLyogdGVzdCBTb0MgdW5pdCBjb3VudCBsaW1pdGF0aW9uICovCi0JCQl0ZXN0UmVzdWx0ID0gV1JPTkdfTlVNQkVSX09GX1VOSVRTOwotCQllbHNlIGlmICh1bml0TnVtYiA+PSBzZXJkTWF4TnVtYikJCQkJCS8qIHRlc3QgU29DIHVuaXQgbnVtYmVyIGxpbWl0YXRpb24gKi8KLQkJCXRlc3RSZXN1bHQgPSBVTklUX05VTUJFUl9WSU9MQVRJT047Ci0JCX0KLQl9Ci0JZWxzZQotCXsKKwlpZiAoU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPT0gMCkgewogCQl0ZXN0UmVzdWx0ID0gU0VSREVTX0FMUkVBRFlfSU5fVVNFOwotCQlpZiAodGVzdFJlc3VsdCA9PSBTRVJERVNfQUxSRUFEWV9JTl9VU0UpCi0JCXsKLQkJCW12UHJpbnRmKCIlczogRXJyb3I6IHNlcmRlcyBsYW5lICVkIGlzIGNvbmZpZ3VyZWQgdG8gdHlwZSAlczogdHlwZSBhbHJlYWR5IGluIHVzZVxuIiwgX19mdW5jX18sIHNlcmRlc0lkLCBzZXJkZXNUeXBlVG9TdHJpbmdbc2VyZGVzVHlwZV0pOwotCQkJcmV0dXJuIE1WX0ZBSUw7CisJfSBlbHNlIHsKKwkvKiBpZiBkaWRuJ3QgZXhjZWVkIGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLworCQlpZiAoc2VyZGVzVHlwZSA9PSBQRVgwKXsKKwkJICAgaWYoc2VyZGVzTW9kZSAhPSBQRVhfRU5EX1BPSU5UX3g0KXsKKwkJCSAgIGlmKHNlcmRlc01vZGUgIT0gUEVYX1JPT1RfQ09NUExFWF94NCl7CisJCSAgICAvKiBTZXJkZXNMYW5lSW5Vc2VDb3VudCBmb3IgUEVYMCA9IDQgLCBidXQgaWYgaXQgaXMgUENJZXgxIG9ubHkgMSBsYW5lIG1heSBiZSB1c2VkICAqLworCQkJU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPSAxOworCQkJfQorCQkgICB9CiAJCX0KLQkJZWxzZSBpZiAodGVzdFJlc3VsdCA9PSBXUk9OR19OVU1CRVJfT0ZfVU5JVFMpCi0JCXsKLQkJCW12UHJpbnRmKCIlczogV2FybmluZzogc2VyZGVzIGxhbmUgJWQgaXMgc2V0IHRvIHR5cGUgJXMuXG4iLCBfX2Z1bmNfXywgc2VyZGVzSWQsc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdKTsKLQkJCW12UHJpbnRmKCIlczogTWF4aW11bSBzdXBwb3J0ZWQgbGFuZXMgYXJlIGFscmVhZHkgc2V0IHRvIHRoaXMgdHlwZSAobGltaXQgPSAlZClcbiIsIF9fZnVuY19fLCBzZXJkTWF4TnVtYik7Ci0JCQlyZXR1cm4gTVZfRkFJTDsKLQkJfQorCQlTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXS0tOwkJCS8qIHVwZGF0ZSBhbW91bnQgb2YgcmVxdWlyZWQgU2VyZGVzIGxhbmVzIGZvciBjdXJyZW50IHR5cGUgKi8KKyAgICAgICAgaWYgKFNlcmRlc0xhbmVJblVzZUNvdW50W3VuaXRJZF1bdW5pdE51bWJdID09IDApLyogaWYgcmVhY2hlZCB0aGUgZXhhY3QgYW1vdW50IG9mIHJlcXVpcmVkIFNlcmRlcyBsYW5lcyBmb3IgY3VycmVudCB0eXBlICovCisgICAgICAgIHsKKwkJICAgIGlmKChzZXJkZXNUeXBlIDw9IFBFWDMpICYmICgoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSkpCisJCQkgICAgc2VyZGVzVW5pdENvdW50W1BFWF9VTklUX0lEXSArPTI7CQkJCS8qIFBDaWV4NCB1c2VzIDIgU2VyRGVzICovCisJCSAgICBlbHNlCisgICAgICAgICAgICAgICAgc2VyZGVzVW5pdENvdW50W3VuaXRJZF0rKzsKIAotCQllbHNlIGlmICh0ZXN0UmVzdWx0ID09IFVOSVRfTlVNQkVSX1ZJT0xBVElPTikKLQkJewotCQkJbXZQcmludGYoIiVzOiBXYXJuaW5nOiBzZXJkZXMgbGFuZSAlZCB0eXBlIGlzICVzOiBjdXJyZW50IGRldmljZSBzdXBwb3J0IG9ubHkgJWQgdW5pdHMgb2YgdGhpcyB0eXBlLlxuIiwgX19mdW5jX18sIHNlcmRlc0lkLCBzZXJkZXNUeXBlVG9TdHJpbmdbc2VyZGVzVHlwZV0sc2VyZE1heE51bWIgKTsKLQkJCXJldHVybiBNVl9GQUlMOworICAgICAgICAgICAgaWYgKHNlcmRlc1VuaXRDb3VudFt1bml0SWRdID4gc2VyZE1heE51bWIpCQkJLyogdGVzdCBTb0MgdW5pdCBjb3VudCBsaW1pdGF0aW9uICovCisgICAgICAgICAgICAgICAgdGVzdFJlc3VsdCA9IFdST05HX05VTUJFUl9PRl9VTklUUzsKIAkJfQogCX0KKworCWlmICh0ZXN0UmVzdWx0ID09IFNFUkRFU19BTFJFQURZX0lOX1VTRSkgeworCQltdlByaW50ZigiJXM6IEVycm9yOiBzZXJkZXMgbGFuZSAlZCBpcyBjb25maWd1cmVkICIsIF9fZnVuY19fLCBzZXJkZXNJZCk7CisJCW12UHJpbnRmKCJ0byB0eXBlICVzOiB0eXBlIGFscmVhZHkgaW4gdXNlXG4iLCBzZXJkZXNUeXBlVG9TdHJpbmdbc2VyZGVzVHlwZV0pOworCQlyZXR1cm4gTVZfRkFJTDsKKwl9IGVsc2UgaWYgKHRlc3RSZXN1bHQgPT0gV1JPTkdfTlVNQkVSX09GX1VOSVRTKSB7CisJCW12UHJpbnRmKCIlczogV2FybmluZzogc2VyZGVzIGxhbmUgJWQgaXMgIiwgX19mdW5jX18sIHNlcmRlc0lkKTsKKwkJbXZQcmludGYoInNldCB0byB0eXBlICVzLlxuIiwgc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdKTsKKwkJbXZQcmludGYoIiVzOiBNYXhpbXVtIHN1cHBvcnRlZCBsYW5lcyBhcmUgIiwgX19mdW5jX18pOworCQltdlByaW50ZigiYWxyZWFkeSBzZXQgdG8gdGhpcyB0eXBlIChsaW1pdCA9ICVkKVxuIiwgc2VyZE1heE51bWIpOworCQlyZXR1cm4gTVZfRkFJTDsKKwl9CisKIAlyZXR1cm4gTVZfT0s7CiB9CiAKQEAgLTcwOCw3ICs3NDIsMTMgQEAKICB9CiAKIH0KLQorTVZfVk9JRCBtdkh3c1NlcmRlc1BDSVg0VG9wb2xvZ3lWZXJpZnkoTVZfVk9JRCApCit7CisJaWYgKFNlcmRlc0xhbmVJblVzZUNvdW50W1BFWF9VTklUX0lEXVswXSAhPSAwKSB7CisJCW12UHJpbnRmKCIlczogV2FybmluZzogd3JvbmcgbnVtYmVyIG9mIGxhbmVzIGlzIHNldCB0byBQRVgwIC0gJWRcbiIsIF9fZnVuY19fLCBTZXJkZXNMYW5lSW5Vc2VDb3VudFtQRVhfVU5JVF9JRF1bMF0pOworCQltdlByaW50ZigiJXM6IFBDSWV4NCBoYXMgdG8gYmUgZGVmaW5lZCBvbiA0IGxhbmVzXG4iLCBfX2Z1bmNfXyk7CisJfQorfQogTVZfU1RBVFVTIG12SHdzU2VyZGVzU2VxRGJJbml0KE1WX1ZPSUQpCiB7CiAJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIHNlcmRlc1NlcTM4eEluaXQgIyMjXG4iKTsKQEAgLTkxNyw3ICs5NTcsNyBAQAogCQlzZXJkZXNTZXFEYltVU0IzX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSB1c2IzRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXM7CiAJCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZih1c2IzRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CiAJfQotCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gVVNCMzsKKwlzZXJkZXNTZXFEYltVU0IzX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uZGF0YUFycklkeCA9IEZJUlNUX0NFTEw7CiAKIAkvKiBVU0IzX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwogCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMTsKQEAgLTEwMjMsNyArMTA2MywxMCBAQAogCWNhc2UgU0dNSUkxOgogCWNhc2UgU0dNSUkyOgogI2lmZGVmIE1WODhGNjlYWAotICAgIGNhc2UgU0dNSUkzOgorICAgIGNhc2UgU0dNSUl2M18wOgorICAgIGNhc2UgU0dNSUl2M18xOgorICAgIGNhc2UgU0dNSUl2M18yOgorICAgIGNhc2UgU0dNSUl2M18zOgogI2VuZGlmCiAgICAgICAgIGlmIChiYXVkUmF0ZSA9PSBfXzFfMjVHYnBzKQogCQkJc2VxSWQgPSBTR01JSV9fMV8yNV9TUEVFRF9DT05GSUdfU0VROwpAQCAtMTA2NywzMyArMTExMCwzNCBAQAogCiBNVl9WT0lEIHByaW50VG9wb2xvZ3lEZXRhaWxzKFNFUkRFU19NQVAgICpzZXJkZXNNYXBBcnJheSkKIHsKLQlNVl9VMzIgbGFuZU51bTsKKwlNVl9VMzIgbGFuZU51bSwgcGV4Qnk0TGFuZT0wOwogCi0JREVCVUdfSU5JVF9TKCJib2FyZCBTZXJEZXMgbGFuZXMgdG9wb2xvZ3kgZGV0YWlsczpcbiIpOworCW12UHJpbnRmKCJib2FyZCBTZXJEZXMgbGFuZXMgdG9wb2xvZ3kgZGV0YWlsczpcbiIpOwogCi0JREVCVUdfSU5JVF9TKCIgfCBMYW5lICMgIHwgU3BlZWQgfCAgVHlwZSAgICAgICB8XG4iKTsKLQlERUJVR19JTklUX1MoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJbXZQcmludGYoIiB8IExhbmUgIyB8IFNwZWVkfCAgICBUeXBlICAgICB8XG4iKTsKKwltdlByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXxcbiIpOwogCWZvciAobGFuZU51bSA9IDA7IGxhbmVOdW0gPCBtdkh3c1NlcmRlc0dldE1heExhbmUoKTsgbGFuZU51bSsrKSB7CiAJCWlmIChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IERFRkFVTFRfU0VSREVTKQogCQl7CiAJCQljb250aW51ZTsKIAkJfQotCQlERUJVR19JTklUX1MoIiB8ICAgIik7Ci0JCURFQlVHX0lOSVRfRChtdkh3c0dldFBoeXNpY2FsU2VyZGVzTnVtKGxhbmVOdW0pLCAxKTsKLQkJREVCVUdfSU5JVF9TKCIgICAgfCAgIik7Ci0JCURFQlVHX0lOSVRfRChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNTcGVlZCwgMik7Ci0JCURFQlVHX0lOSVRfUygiICAgfCAgIik7Ci0JCURFQlVHX0lOSVRfUygoY2hhciAqKXNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlXSk7Ci0JCURFQlVHX0lOSVRfUygiXHR8XG4iKTsKKwkJbXZQcmludGYgKCIgfCAgICVkICAgIHwgICVkICAgfCAgIixtdkh3c0dldFBoeXNpY2FsU2VyZGVzTnVtKGxhbmVOdW0pLHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1NwZWVkKTsKKwkJaWYgKChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpIHx8IChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKXsKKwkJCW12UHJpbnRmICgiUENJZTB4NC0lMDFkICAiLHBleEJ5NExhbmUrKyApOworCQl9CisJCWVsc2V7CisJCQltdlByaW50ZiAoIiVzIixzZXJkZXNUeXBlVG9TdHJpbmdbc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZV0pOworCQl9CisJCW12UHJpbnRmKCJ8XG4iKTsKIAl9Ci0JREVCVUdfSU5JVF9TKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCW12UHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIE1WX1NUQVRVUyBtdkh3c1ByZVNlcmRlc0luaXRDb25maWcoTVZfVk9JRCkKIHsKLSAgICBNVl9VMzIgZGF0YTsKKyAgICBNVl9VMzIgZGF0YSwgcmVmQ2xrU2F0UjsKIAogICAgIC8qIGNvbmZpZ3VyZSBDb3JlIFBMTCAqLwogICAgIC8qCkBAIC0xMTAzLDggKzExNDcsMTMgQEAKICAgICBiaXRzWzI0OjIxXT0weDcoQ29yZS1QTEwgVkNPIEJhbmQpCiAgICAgYml0c1syODoyNV09MHgxKENvcmUtUExMIFJsZikKICAgICBiaXRzWzMxOjI5XT0weDIoQ29yZS1QTEwgY2hhcmdlLXB1bXAgYWRqdXN0KQorICAgICh0aGUgY29uZmlndXJhdGlvbiB2YWxpZCBvbmx5IGZvciByZWZjbGsgMjVNaHosIGZvciA0ME1oeiBiZXR0ZXIgZGVmYXVsdCBjb25maWd1cmF0aW9uIGF0IHRoaXMgdGltZSkKICAgICAqLwotICAgIE1WX1JFR19XUklURShDT1JFX1BMTF9QQVJBTUVURVJTX1JFRywgMHg0MkU5RjAwMyk7CisJcmVmQ2xrU2F0UiA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFRyk7CisJaWYoKChyZWZDbGtTYXRSID4+IERFVklDRV9TQU1QTEVfQVRfUkVTRVQyX1JFR19SRUZDTEtfT0ZGU0VUKSAmIDB4MSkgPT0gREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHX1JFRkNMS18yNU1IWil7CisJCS8qU2tpcCB0aGUgY29uZmlndXJhdGlvbiBpbiBSRUZMSyA0ME1oeiBtb2RlKi8KKwkJTVZfUkVHX1dSSVRFKENPUkVfUExMX1BBUkFNRVRFUlNfUkVHLCAweDQyRTlGMDAzKTsKKwl9CiAKICAgICAvKiBFbmFibGUgUExMIENvbmZpZ3VyYXRpb24gKi8KICAgICBkYXRhID0gTVZfUkVHX1JFQUQoQ09SRV9QTExfQ09ORklHX1JFRyk7CkBAIC0xMTcyLDYgKzEyMjEsOTAgQEAKIAlyZXR1cm4gTVZfT0s7CiB9CiAKK01WX1ZPSUQgbXZId3NVcGRhdGVTZXJkZXNQaHlTZWxlY3RvcnNPcHRpb25zICAoIE1WX1ZPSUQpCit7CisJTVZfVTMyIGRldklkLCBjdXJyVHlwZSxjdXJyTGFuZTsKKworICAgIC8qIHVwZGF0ZSBzZWxlY3RvcnMgb3B0aW9ucyBhY2NvcmRpbmcgdG8gRGV2aWNlIGxpbWl0YXRpb24qLworCWlmICggbXZTeXNFbnZEZXZpY2VSZXZHZXQoKSA9PSBNVl84OEY2OVhYX1oxX0lEKSAvKiBmb3IgWjEgU0dNSUkodjMpXzAgIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGxhbmU2ICovCisJICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0dNSUl2M18wXVs2XSA9IE5BOworCisJLyogUmVhZCBIVyBkZXZpY2UgSUQgZnJvbSBTQFIgKi8KKwlkZXZJZCA9IG12U3lzRW52RGV2aWNlSWRHZXQoKTsKKworICAgIHN3aXRjaCAoZGV2SWQpCisgICAgeworCWNhc2UgTVZfNjgxMDoKKyAgICAgICAgLyogbGFuZSA0IGlzIG5vdCBpbiB1c2UgaW4gNjgxMCovCisgICAgICAgIGZvciAoY3VyclR5cGUgPSAwO2N1cnJUeXBlIDwgTEFTVF9TRVJERVNfVFlQRTsgY3VyclR5cGUrKykKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW2N1cnJUeXBlXVs0XSA9IE5BOworICAgICAgICAvKiBTQVRBIDIgYW5kIFNBVEEgMyBhcmUgbm90IGZ1bmN0aW9uYWwgaW4gNjgxMCovCisgICAgICAgIGZvciAoY3VyckxhbmUgPTA7IGN1cnJMYW5lIDwgTUFYX1NFUkRFU19MQU5FUzsgY3VyckxhbmUrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0FUQTNdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbU0FUQTJdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCWNhc2UgTVZfNjgxMToKKyAgICAgICAgLyogbm8gUVNHTUlJIGluIDY4MTEqLworICAgICAgICBmb3IgKGN1cnJMYW5lID0wOyBjdXJyTGFuZSA8IE1BWF9TRVJERVNfTEFORVM7IGN1cnJMYW5lKyspCisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtRU0dNSUldW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAvKiBTQVRBIDIgYW5kIFNBVEEgMyBhbmQgU0dNSUkyIGFyZSBub3QgZnVuY3Rpb25hbCBpbiA2ODExKi8KKyAgICAgICAgZm9yIChjdXJyTGFuZSA9MDsgY3VyckxhbmUgPCBNQVhfU0VSREVTX0xBTkVTOyBjdXJyTGFuZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBM11bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBMl1bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTR01JSTJdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICB9CisKKyAgICAgICAgLyogbm8gbGFuZXMgNCBhbmQgNSBpbiA2ODExICovCisgICAgICAgIGZvciAoY3VyclR5cGUgPSAwO2N1cnJUeXBlIDwgTEFTVF9TRVJERVNfVFlQRTsgY3VyclR5cGUrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbY3VyclR5cGVdWzRdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtjdXJyVHlwZV1bNV0gPSBOQTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKwljYXNlIE1WXzY4MjA6CisgICAgICAgIC8qIFNBVEEgMiBhbmQgU0FUQSAzIGFyZSBub3QgZnVuY3Rpb25hbCBpbiA2ODIwKi8KKyAgICAgICAgZm9yIChjdXJyTGFuZSA9MDsgY3VyckxhbmUgPCBNQVhfU0VSREVTX0xBTkVTOyBjdXJyTGFuZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBM11bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBMl1bY3VyckxhbmVdID0gTkE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisJY2FzZSBNVl82ODI4OgorICAgICAgICAvKiBubyBsaW1pdGF0aW9ucyBpbiA2ODI4ICovCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgLyogNCAqLwlNVl9OT05FOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIC8qIDUgKi9NVl82OTIwOgorICAgICAgICAvKiBubyBTQVRBICxVU0IzX0hPU1QxLCBVU0IzX0RFVklDRSxRU0dNSUkqLworICAgICAgICBmb3IgKGN1cnJMYW5lID0wOyBjdXJyTGFuZSA8IE1BWF9TRVJERVNfTEFORVM7IGN1cnJMYW5lKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEwXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEExXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEyXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1NBVEEzXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgICAgIGNvbW1vblBoeXNTZWxlY3RvcnNTZXJkZXNSZXYyTWFwW1VTQjNfSE9TVDFdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbVVNCM19ERVZJQ0VdW2N1cnJMYW5lXSA9IE5BOworICAgICAgICAgICAgY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbUVNHTUlJXVtjdXJyTGFuZV0gPSBOQTsKKyAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgY2FzZS8qIDYgKi8JTVZfNjkyODoKKyAgICAgICAgLyogbm8gbGltaXRhdGlvbnMgaW4gNjkyOCAqLworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNy8qIE1WXzY5MjUgKi86CisgICAgICAgIC8qIFNBVEEgMiBhbmQgU0FUQSAzIGFyZSBub3QgZnVuY3Rpb25hbCBpbiA2OTI1Ki8KKyAgICAgICAgZm9yIChjdXJyTGFuZSA9MDsgY3VyckxhbmUgPCBNQVhfU0VSREVTX0xBTkVTOyBjdXJyTGFuZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBM11bY3VyckxhbmVdID0gTkE7CisgICAgICAgICAgICBjb21tb25QaHlzU2VsZWN0b3JzU2VyZGVzUmV2Mk1hcFtTQVRBMl1bY3VyckxhbmVdID0gTkE7CisgICAgICAgIH0KKwkgICAgYnJlYWs7CisgICAgfQorCit9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12SHdzUG93ZXJVcFNlcmRlc0xhbmVzKFNFUkRFU19NQVAgICpzZXJkZXNDb25maWdNYXApCiB7CkBAIC0xMTg4LDYgKzEzMjEsOSBAQAogCiAJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12SHdzUG93ZXJVcFNlcmRlc0xhbmVzICMjI1xuIik7CiAKKyAgICAvKiB1cGRhdGUgVGFibGUgb2Ygc2VsZWN0b3JzIG9wdGlvbnMgYWNjb3JkaW5nIHRvIERldmljZSBsaW1pdGF0aW9uKi8KKyAgICBtdkh3c1VwZGF0ZVNlcmRlc1BoeVNlbGVjdG9yc09wdGlvbnMoKTsKKwogCS8qIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdpc3RlciBjb25maWd1cmF0aW9uICovCiAJREVCVUdfSU5JVF9GVUxMX1MoIm12SHdzUG93ZXJVcFNlcmRlc0xhbmVzOiBVcGRhdGluZyBDT01NT04gUEhZUyBTRUxFQ1RPUlMgcmVnXG4iKTsKIAlDSEVDS19TVEFUVVMobXZId3NVcGRhdGVTZXJkZXNQaHlTZWxlY3RvcnMoc2VyZGVzQ29uZmlndXJhdGlvbk1hcCkpOwpAQCAtMTI1OSw2ICsxMzk1LDMyIEBACiAJcmV0dXJuIG12SHdzQ3RybEhpZ2hTcGVlZFNlcmRlc1BoeUNvbmZpZygpOyAvLyBzdHViCiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB1cGRhdGVVc2IzRGV2aWNlQ29uZmlnCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgVVNCMyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlmIFVTQjMgZGV2aWNlIGlzIGVuYWJsZWQKKyogSU5QVVQ6CisqCXRvcG9sb2d5Q29uZmlnUHRyIC0gcG9pbnRlciB0byB0aGUgU2VyZGVzIG1hcHBpbmcKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdXBkYXRlVXNiM0RldmljZUNvbmZpZyhTRVJERVNfTUFQICpzZXJkZXNNYXBBcnJheSkKK3sKKwlNVl9VMzIgbGFuZU51bTsKKwlmb3IgKGxhbmVOdW0gPSAwOyBsYW5lTnVtIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IGxhbmVOdW0rKykgeworCQlpZiAoc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9PSBVU0IzX0RFVklDRSkgeworCQkJLyogd3JpdGUgMHgxIHRvIFVTQjNfQ09ORklHX1JFR1swOjFdCisJCQkgKiBCSVQwIChVU0IzIERldmljZSBVVE1JIEVuKQkwIDogVVNCMyBEZXZpY2UgZGlzYWJsZWQuCisJCQkgKgkJCQkgICAgKFVTQjIgb24gVVRNSTAsIGFuZCBVU0IzIEhvc3QxIG9uIFVUTUkyKQorCQkJICoJCQkgICAgIC0+IDEgOiBVU0IzIERldmljZSBlbmFibGVkCisJCQkgKgorCQkJICogQklUMSAoVVNCMyBEZXZpY2UgVVRNSSBNdXgpCS0+IDAgOiBVVE1JMjogVVNCMyBEZXZpY2UgaXMgb24gVVRNSTIKKwkJCSAqCQkJCSAgIDEgOiBVVE1JMDogVVNCMyBEZXZpY2UgaXMgb24gVVRNSTAgKi8KKwkJCU1WX1JFR19CSVRfUkVTRVQoVVNCM19DT05GSUdfUkVHLCBCSVQxKTsKKwkJCU1WX1JFR19CSVRfU0VUKFVTQjNfQ09ORklHX1JFRywgQklUMCk7CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgTVZfU1RBVFVTIG12U2VyZGVzUGV4VXNiM1BpcGVEZWxheVdBKE1WX1UzMiBzZXJkZXNOdW0sIE1WX1U4IHNlcmRlc1R5cGUpCiB7CkBAIC0xMzg3LDEwICsxNTQ5LDExIEBACiAjaWZkZWYgREJfTElOS19DSEVDSwogCWludCBpOwogI2VuZGlmCi0JTVZfVTMyIHNhdGFJZHgsIHBleElkeCwgc2F0YVBvcnQ7CisJTVZfVTMyIHNhdGFJZHgsIHBleElkeCxzYXRhUG9ydDsKIAlTRVJERVNfU0VRIHNwZWVkU2VxSWQ7CiAJTVZfVTMyIHJlZ0RhdGE7CiAJTVZfQk9PTCBpc1BleEJ5MTsKKwlNVl9VMzIJYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOwogCiAJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12U2VyZGVzUG93ZXJVcEN0cmwgIyMjXG4iKTsKIApAQCAtMTQyMyw1MSArMTU4Niw1NSBAQAogCQkJaXNQZXhCeTEgPSAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3gxKSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3gxKTsKIAkJCXBleElkeCA9IHNlcmRlc1R5cGUgLSBQRVgwOwogCi0JCQlpZiAoKGlzUGV4QnkxID09IE1WX1RSVUUpIHx8IChzZXJkZXNUeXBlID09IFBFWDApKQorCQkJaWYgKChpc1BleEJ5MSA9PSBNVl9UUlVFKSB8fCAoKHNlcmRlc1R5cGUgPT0gUEVYMCkgJiYgKHNlcmRlc051bSA9PSAwKSkpCiAJCQl7Ci0JCQkJLyogRm9yIFBFWCBieSA0LCBpbml0IG9ubHkgdGhlIFBFWCAwICovCisJCQkJLyogdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBmb3IgUEVYeDEgYW5kIGZvciBQRVggYnkgNC1mb3IgdGhlIGZpcnN0IGxhbmUgb25seSAqLwogCQkJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRChTT0NfQ09OVFJPTF9SRUcxKTsKLQkJCQlpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkgeworCQkJCWlmIChpc1BleEJ5MSA9PSBNVl9UUlVFKQogCQkJCQlyZWdEYXRhIHw9IDB4NDAwMDsKLQkJCQl9Ci0JCQkJZWxzZXsKKwkJCQllbHNlCiAJCQkJCXJlZ0RhdGEgJj0gfjB4NDAwMDsKLQkJCQl9CiAJCQkJTVZfUkVHX1dSSVRFKFNPQ19DT05UUk9MX1JFRzEsIHJlZ0RhdGEpOwogCi0JCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NmMpKTsKKwkJCQkvKiBTZXR1cCBsaW5rIHdpZHRoIGJpdFs5OjRdICovCisJCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKFBFWF9MSU5LX0NBUEFCSUxJVElFU19SRUcocGV4SWR4KSk7CiAJCQkJcmVnRGF0YSAmPSB+MHgzRjA7Ci0JCQkJaWYgKGlzUGV4QnkxID09IE1WX1RSVUUpIHsKKwkJCQlpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkKIAkJCQkJcmVnRGF0YSB8PSAweDEwOwotCQkJCX0KLQkJCQllbHNlIHsKKwkJCQllbHNlCiAJCQkJCXJlZ0RhdGEgfD0gMHg0MDsKLQkJCQl9Ci0JCQkJTVZfUkVHX1dSSVRFKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NmMpLCByZWdEYXRhKTsKKwkJCQlNVl9SRUdfV1JJVEUoUEVYX0xJTktfQ0FQQUJJTElUSUVTX1JFRyhwZXhJZHgpLCByZWdEYXRhKTsKIAotCQkJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRCgoKE1WX1BFWF9JRl9SRUdTX0JBU0UocGV4SWR4KSkgKyAweDZjKSk7CisJCQkJLyogU2V0dXAgbWF4aW11bSBsaW5rIHNwZWVkIGJpdFszOjBdICovCisJCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKFBFWF9MSU5LX0NBUEFCSUxJVElFU19SRUcocGV4SWR4KSk7CiAJCQkJcmVnRGF0YSAmPSB+MHhGOwotCQkJCXJlZ0RhdGEgfD0gMHgyOwotCQkJCU1WX1JFR19XUklURSgoKE1WX1BFWF9JRl9SRUdTX0JBU0UocGV4SWR4KSkgKyAweDZjKSwgcmVnRGF0YSk7CisJCQkJaWYgKChib2FyZElkID09IERCX0FNQ182ODIwX0lEKSAmJiAocGV4SWR4ID09IDApICYmCisJCQkJCW12Qm9hcmRGb3JjZVBjaWVHZW4xR2V0KCkpIHsKKwkJCQkJLyogVGhlIFdBIGlzIHJlcXVpcmVkIGZvciBCQzIgQTAsIHNvIFNhdFIgaXMgY29kZWQgYWNjb3JkaW5nbHkgKi8KKwkJCQkJbXZQcmludGYoIkZvcmNpbmcgTGluayB0byBHRU4xIG9uIFBDSWUtJWRcbiIsIHBleElkeCk7CisJCQkJCXJlZ0RhdGEgfD0gMHgxOyAvKiBHRU4xLCAyLjVHICovCisJCQkJfSBlbHNlCisJCQkJCXJlZ0RhdGEgfD0gMHgyOyAvKiBHRU4yLCA1RyAqLworCQkJCU1WX1JFR19XUklURShQRVhfTElOS19DQVBBQklMSVRJRVNfUkVHKHBleElkeCksIHJlZ0RhdGEpOwogCi0JCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NzApKTsKKwkJCQkvKiBTZXR1cCBjb21tb24gY2xvY2sgY29uZmlndXJhdGlvbiBiaXRbNl0gKi8KKwkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoUEVYX0xJTktfQ1RSTF9TVEFUVVNfUkVHKHBleElkeCkpOwogCQkJCXJlZ0RhdGEgJj0gfjB4NDA7CiAJCQkJcmVnRGF0YSB8PSAweDQwOwotCQkJCU1WX1JFR19XUklURSgoKE1WX1BFWF9JRl9SRUdTX0JBU0UocGV4SWR4KSkgKyAweDcwKSwgcmVnRGF0YSk7CisJCQkJTVZfUkVHX1dSSVRFKFBFWF9MSU5LX0NUUkxfU1RBVFVTX1JFRyhwZXhJZHgpLCByZWdEYXRhKTsKIAkJCX0KIAogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9QT1dFUl9VUF9TRVEpKTsKLSAgICAgICAgICAgIGlmIChpc1BleEJ5MSA9PSBNVl9GQUxTRSkgewotICAgICAgICAgICAgICAgIC8qIGZvciBQRVggYnkgNCAtIHVzZSB0aGUgUEVYIGluZGV4IGFzIHRoZSBzZXEgYXJyYXkgaW5kZXggKi8KLSAgICAgICAgICAgICAgICBzZXJkZXNTZXFEYltQRVhfQllfNF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gcGV4SWR4OworICAgICAgICAgICAgIGlmIChpc1BleEJ5MSA9PSBNVl9GQUxTRSkgeworICAgICAgICAgICAgICAgIC8qIGZvciBQRVggYnkgNCAtIHVzZSB0aGUgc2VyZGVzTnVtIGFzIHRoZSBzZXEgYXJyYXkgaW5kZXggKi8KKyAgICAgICAgICAgICAgICBzZXJkZXNTZXFEYltQRVhfQllfNF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gc2VyZGVzTnVtOwogICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfQllfNF9DT05GSUdfU0VRKSk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c1JlZkNsb2NrU2V0KHNlcmRlc051bSwgc2VyZGVzVHlwZSwgcmVmQ2xvY2spKTsKKwkgICAgQ0hFQ0tfU1RBVFVTKG12SHdzUmVmQ2xvY2tTZXQoc2VyZGVzTnVtLCBzZXJkZXNUeXBlLCByZWZDbG9jaykpOwogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIHNwZWVkU2VxSWQpKTsKICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfRUxFQ1RSSUNBTF9DT05GSUdfU0VRKSk7CiAKLQkJCWlmIChpc1BleEJ5MSA9PSBNVl9UUlVFKSB7CisJICAgaWYgKGlzUGV4QnkxID09IE1WX1RSVUUpIHsKIAkJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1RYX0NPTkZJR19TRVEyKSk7CiAJCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9UWF9DT05GSUdfU0VRMykpOwogCQkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfVFhfQ09ORklHX1NFUTEpKTsKQEAgLTE2MjAsNyArMTc4NywxMCBAQAogCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFFTR01JSV9UWF9DT05GSUdfU0VRMSkpOwogCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFFTR01JSV9UWF9DT05GSUdfU0VRMikpOwogICAgICAgICAgICAgYnJlYWs7Ci0JCWNhc2UgU0dNSUkzOgorCQljYXNlIFNHTUlJdjNfMDoKKwkJY2FzZSBTR01JSXYzXzE6CisJCWNhc2UgU0dNSUl2M18yOgorCQljYXNlIFNHTUlJdjNfMzoKIAkJY2FzZSBYQVVJOgogICAgICAgICBjYXNlIFJYQVVJOgogICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VyZGVzUG93ZXJVcEN0cmxFeHQoc2VyZGVzTnVtLCBzZXJkZXNQb3dlclVwLCBzZXJkZXNUeXBlLCBiYXVkUmF0ZSwgc2VyZGVzTW9kZSwgcmVmQ2xvY2spKTsKQEAgLTE2NDQsNyArMTgxNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogTVZfU1RBVFVTIG12SHdzVXBkYXRlU2VyZGVzUGh5U2VsZWN0b3JzKFNFUkRFU19NQVAqIHNlcmRlc0NvbmZpZ01hcCkKIHsKLQlNVl9VMzIgbGFuZURhdGEsIHNlcmRlc0lkeCxzZXJkZXNMYW5lSHdOdW0sIHJlZ0RhdGEgPSAwOworCU1WX1UzMiBsYW5lRGF0YSwgc2VyZGVzSWR4LHNlcmRlc0xhbmVId051bSxkZXZJZCxyZWdEYXRhID0gMDsKIAlTRVJERVNfVFlQRSBzZXJkZXNUeXBlOwogCVNFUkRFU19NT0RFIHNlcmRlc01vZGU7CiAJTVZfVTggICAgICAgc2VsZWN0Qml0T2ZmOwpAQCAtMTY1OSw2ICsxODI5LDggQEAKIAl9IGVsc2UgewogCQlzZWxlY3RCaXRPZmYgPSA0OwogCX0KKyAgICAvKiBSZWFkIEhXIGRldmljZSBJRCBmcm9tIFNAUiAqLworCWRldklkID0gbXZTeXNFbnZEZXZpY2VJZEdldCgpOwogCiAJLyogVXBkYXRpbmcgYml0cyAwLTE3IGluIHRoZSBDT01NT04gUEhZUyBTRUxFQ1RPUlMgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBzZXJkZXMgdHlwZXMgKi8KIAlmb3IgKHNlcmRlc0lkeCA9IDA7IHNlcmRlc0lkeCA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBzZXJkZXNJZHgrKykgewpAQCAtMTY2NiwxMiArMTgzOCwxOSBAQAogCQlzZXJkZXNNb2RlID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkeF0uc2VyZGVzTW9kZTsKIAkJc2VyZGVzTGFuZUh3TnVtID0gbXZId3NHZXRQaHlzaWNhbFNlcmRlc051bShzZXJkZXNJZHgpOwogCi0JCWxhbmVEYXRhID0gbXZId3NTZXJkZXNHZXRQaHlTZWxlY3RvclZhbChzZXJkZXNMYW5lSHdOdW0sIHNlcmRlc1R5cGUpOworICAgICAgICBpZiAoKChkZXZJZCA9PSBNVl82ODEwKSB8fCAoZGV2SWQgPT0gTVZfNjgxMSkpICYmCisgICAgICAgICAgICgoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG12UHJpbnRmKCIlczogV2FybmluZzogUENJZVg0IG1vZGUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGRldmljZSBcbiIsX19mdW5jX18pOworCQkJc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkeF0uc2VyZGVzVHlwZSA9IERFRkFVTFRfU0VSREVTOworICAgICAgICB9CiAKIAkJaWYoc2VyZGVzVHlwZSA9PSBERUZBVUxUX1NFUkRFUykgewogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKG12SHdzU2VyZGVzVG9wb2xvZ3lWZXJpZnkoc2VyZGVzVHlwZSxzZXJkZXNJZHgsc2VyZGVzTW9kZSkgIT0gTVZfT0speworICAgICAgICBsYW5lRGF0YSA9IG12SHdzU2VyZGVzR2V0UGh5U2VsZWN0b3JWYWwoc2VyZGVzTGFuZUh3TnVtLCBzZXJkZXNUeXBlKTsKKworICAgICAgICBpZiAobXZId3NTZXJkZXNUb3BvbG9neVZlcmlmeShzZXJkZXNUeXBlLHNlcmRlc0lkeCxzZXJkZXNNb2RlKSAhPSBNVl9PSyl7CiAJCQlzZXJkZXNDb25maWdNYXBbc2VyZGVzSWR4XS5zZXJkZXNUeXBlID0gREVGQVVMVF9TRVJERVM7CiAJCQltdlByaW50ZigiJXM6IFNlckRlcyBsYW5lICMlZCBpcyAgZGlzYWJsZWRcbiIsX19mdW5jX18sIHNlcmRlc0xhbmVId051bSk7CiAJCQl1cGRhdGVkVG9wb2xvZ3lQcmludCA9IE1WX1RSVUU7CkBAIC0xNjc5LDggKzE4NTgsOCBAQAogCQl9CiAJCS8qIENoZWNraW5nIGlmIHRoZSBib2FyZCB0b3BvbG9neSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIFBFWHg0IC0gZm9yIHRoZSBuZXh0IHN0ZXAgKi8KIAkJaWYgKChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpIHx8IChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpKSB7Ci0gICAgICAgICAgICAvKiB1cGRhdGUgbGFuZSBkYXRhIHRvIHRoZSAzIG5leHQgU0VSREVTIGxhbmVzICovCi0gICAgICAgICAgICBsYW5lRGF0YSA9IGNvbW1vblBoeXNTZWxlY3RvcnNQZXhCeTRMYW5lc1tzZXJkZXNMYW5lSHdOdW1dOworCQkJIC8qIHVwZGF0ZSBsYW5lIGRhdGEgdG8gdGhlIDMgbmV4dCBTRVJERVMgbGFuZXMgKi8KKwkJCWxhbmVEYXRhID0gY29tbW9uUGh5c1NlbGVjdG9yc1BleEJ5NExhbmVzW3NlcmRlc0xhbmVId051bV07CiAJCQlpZiAoc2VyZGVzVHlwZSA9PSBQRVgwKSB7CiAJCQkJaXNQRVh4NCA9IE1WX1RSVUU7CiAJCQl9CkBAIC0xNjk2LDcgKzE4NzUsOSBAQAogCQkvKiBVcGRhdGluZyB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBDT01NT05fUEhZU19TRUxFQ1RPUlNfUkVHICovCiAJCXJlZ0RhdGEgfD0gKGxhbmVEYXRhIDw8IChzZWxlY3RCaXRPZmYgKiBzZXJkZXNMYW5lSHdOdW0pKTsKIAl9Ci0KKwkvKiBjaGVjayB0aGF0IG51bWJlciBvZiB1c2VkIGxhbmVzIGZvciBQRVh4NCBpZiB1c2VkIGlzIHJpZ2h0ICovCisJaWYgKGlzUEVYeDQpCisJCW12SHdzU2VyZGVzUENJWDRUb3BvbG9neVZlcmlmeSgpOwogCS8qIGNoZWNrIHRoYXQgbnVtYmVyIG9mIHVzZWQgbGFuZXMgZm9yIFhBVUkgYW5kIFJYQVVJIChpZiB1c2VkKSBpcyByaWdodCAqLwogCW12SHdzU2VyZGVzWEFVSVRvcG9sb2d5VmVyaWZ5KCk7CiAKQEAgLTE3OTAsNyArMTk3MSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogI2lmZGVmIE1WODhGNjlYWAotCWNhc2UgU0dNSUkzOgorCWNhc2UgU0dNSUl2M18wOgorCWNhc2UgU0dNSUl2M18xOgorICAgICAgICBjYXNlIFNHTUlJdjNfMjoKKwljYXNlIFNHTUlJdjNfMzoKIAljYXNlIFhBVUk6CiAJY2FzZSBSWEFVSToKICAgICAgICAgaWYgKHJlZkNsb2NrID09IFJFRl9DTE9DS19fMjVNSHopIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLmggYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkRW52U3BlYy5oCmluZGV4IDc2OGFkZjcuLjE0MjM4MDcgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRFbnZTcGVjLmgKKysrIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZEVudlNwZWMuaApAQCAtMTE3LDcgKzExNywxMCBAQAogCVVTQjNfSE9TVDAsCiAJVVNCM19IT1NUMSwKIAlVU0IzX0RFVklDRSwKLQlTR01JSTMsCisJU0dNSUl2M18wLAorCVNHTUlJdjNfMSwKKwlTR01JSXYzXzIsCisJU0dNSUl2M18zLAogCVhBVUksCiAJUlhBVUksCiAJREVGQVVMVF9TRVJERVMsCkBAIC02MDEsNCArNjA0LDEzIEBACiAqIFJFVFVSTlM6ICAgICAgICAgICAgICBUcnVlIGlmIGxhbmUgaXMgYWN0aXZlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBNVl9CT09MIG12SHdzSXNTZXJkZXNBY3RpdmUoTVZfVTggbGFuZU51bSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB1cGRhdGVVc2IzRGV2aWNlQ29uZmlnCisqIERFU0NSSVBUSU9OOiBVcGRhdGUgVVNCMyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGlmIFVTQjMgZGV2aWNlIGlzIGVuYWJsZWQKKyogSU5QVVQ6CisqCXRvcG9sb2d5Q29uZmlnUHRyIC0gcG9pbnRlciB0byB0aGUgU2VyZGVzIG1hcHBpbmcKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgdXBkYXRlVXNiM0RldmljZUNvbmZpZyhTRVJERVNfTUFQICpzZXJkZXNNYXBBcnJheSk7CiAjZW5kaWYgLyogX01WX0hJR0hTUEVFRF9FTlZfU1BFQ19IICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkVG9wb2xvZ3lTcGVjLTM4eC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZFRvcG9sb2d5U3BlYy0zOHguYwppbmRleCA4NTk2NmY3Li5jMjY3MjE5IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkVG9wb2xvZ3lTcGVjLTM4eC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRUb3BvbG9neVNwZWMtMzh4LmMKQEAgLTk0LDYgKzk0LDE0IEBACiAJeyBTQVRBMiwJCV9fM0dicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFVTQjNfSE9TVDEsCV9fNUdicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQogfSwKK3sJLyogU29saWRSdW4gQ2xlYXJGb2ctQTEgUkVWMi4wIFRvcG9sb2d5ICovCisJeyBTQVRBMCwJX18zR2JwcywJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgU0dNSUkxLAlfXzFfMjVHYnBzLAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBQRVgxLAkgIAlfXzVHYnBzLAlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBVU0IzX0hPU1QxLAlfXzVHYnBzLAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBQRVgyLAkgIAlfXzVHYnBzLAlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBTR01JSTIsCV9fMV8yNUdicHMsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQorfSwKIHsKIAkvKiBHRkNIMTAwIFRvcG9sb2d5ICovCiAJeyBTR01JSTAsCQlfXzFfMjVHYnBzLAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCkBAIC0xMjYsNiArMTM0LDcgQEAKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc3dhcFR4ICAgICAgPSAgQ3VzdG9tZXJCb2FyZFRvcG9sb2d5Q29uZmlnW2JvYXJkSWRJbmRleF1bbGFuZU51bV0uc3dhcFR4OwogCX0KIAorCXVwZGF0ZVVzYjNEZXZpY2VDb25maWcoc2VyZGVzTWFwQXJyYXkpOwogCXJldHVybiBNVl9PSzsKIH0KIApAQCAtMTM3LDYgKzE0Niw3IEBACiB7CiAJbG9hZFRvcG9sb2d5Q3VzdG9tZXIsICAgCSAgLyogQ3VzdG9tZXIgQm9hcmQgMCAqLwogCWxvYWRUb3BvbG9neUN1c3RvbWVyLCAgIAkgIC8qIEN1c3RvbWVyIEJvYXJkIDEqLworCWxvYWRUb3BvbG9neUN1c3RvbWVyLCAgIAkgIC8qIFNvbGlkUnVuIENsZWFyRm9nIEJvYXJkICovCiAJbG9hZFRvcG9sb2d5Q3VzdG9tZXIsICAgCSAgLyogR0ZDSDEwMCAqLwogfTsKIApAQCAtMjYyLDUyICsyNzIsNTIgQEAKIC8qIENvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwogU0VSREVTX01BUCBEYkNvbmZpZ0RlZmF1bHRbTUFYX1NFUkRFU19MQU5FU10gPQogewotCXsgU0FUQTAsCSBfXzNHYnBzLCAgIAkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBQRVgwLCAJIF9fNUdicHMsICAgCSAgIFBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFBFWDEsIAkgX181R2JwcywgICAJICAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgU0FUQTMsCSBfXzNHYnBzLCAgIAkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBVU0IzX0hPU1QwLCBfXzVHYnBzLCAgCSAgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFVTQjNfSE9TVDEsIF9fNUdicHMsICAJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CisJeyBTQVRBMCwJX18zR2JwcywgICAJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgUEVYMCwgCV9fNUdicHMsICAgCSAgIFBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFBFWDEsIAlfXzVHYnBzLCAgIAkgICBQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBTQVRBMywJX18zR2JwcywgICAJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgVVNCM19IT1NUMCwJX181R2JwcywgIAkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBVU0IzX0hPU1QxLAlfXzVHYnBzLCAgCSAgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQogfTsKIAogU0VSREVTX01BUCBEYkNvbmZpZ1NMTTEzNjNfQ1tNQVhfU0VSREVTX0xBTkVTXSA9CiB7CiAJeyBQRVgwLCAJIAkgX181R2JwcywgIAkJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBERUZBVUxUX1NFUkRFUywgTEFTVF9TRVJERVNfU1BFRUQsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IERFRkFVTFRfU0VSREVTLAlMQVNUX1NFUkRFU19TUEVFRCwJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBQRVgxLCAJICAJX181R2JwcywgIAkJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBQRVgzLCAJICAJX181R2JwcywgIAkJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBTQVRBMiwJICAJX18zR2JwcywgIAkJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBERUZBVUxUX1NFUkRFUywgTEFTVF9TRVJERVNfU1BFRUQsCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IERFRkFVTFRfU0VSREVTLAlMQVNUX1NFUkRFU19TUEVFRCwJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiB9OwogCiBTRVJERVNfTUFQIERiQ29uZmlnU0xNMTM2M19EW01BWF9TRVJERVNfTEFORVNdID0KIHsKIAl7IFBFWDAsIAkgIF9fNUdicHMsICAJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgUEVYMSwgCSAgX181R2JwcywgIAlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBQRVgyLCAJICBfXzVHYnBzLCAgCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFBFWDMsIAkgIF9fNUdicHMsICAJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgVVNCM19IT1NUMCwgX181R2JwcywJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFVTQjNfSE9TVDEsIF9fNUdicHMsCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KKwl7IFBFWDAsIAkgIF9fNUdicHMsICAJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgUEVYMCwgCSAgX181R2JwcywgIAlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisJeyBQRVgwLCAJICBfXzVHYnBzLCAgCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFVTQjNfSE9TVDAsCSAgX181R2JwcywJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgVVNCM19IT1NUMSwJICBfXzVHYnBzLAlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KIH07CiAKIFNFUkRFU19NQVAgRGJDb25maWdTTE0xMzYzX0VbTUFYX1NFUkRFU19MQU5FU10gPQogewogCXsgUEVYMCwgCSAgCQlfXzVHYnBzLCAgCQkJUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgVVNCM19IT1NUMCwgICAJX181R2JwcywgIAkJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKwl7IFVTQjNfSE9TVDAsCQkgIAlfXzVHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAogCXsgU0FUQTEsCSAgCQlfXzNHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgVVNCM19IT1NUMSwgICAgIAlfXzVHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgREVGQVVMVF9TRVJERVMsIAlMQVNUX1NFUkRFU19TUEVFRCwJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgVVNCM19IT1NUMSwJCQlfXzVHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgREVGQVVMVF9TRVJERVMsIAkJTEFTVF9TRVJERVNfU1BFRUQsCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBTQVRBMiwJICAJCV9fM0dicHMsICAJCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KIH07CiAKIFNFUkRFU19NQVAgRGJDb25maWdTTE0xMzYzX0ZbTUFYX1NFUkRFU19MQU5FU10gPQogewogCXsgUEVYMCwgCSAgCQlfXzVHYnBzLCAgCQkJUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgREVGQVVMVF9TRVJERVMsIAlMQVNUX1NFUkRFU19TUEVFRCwJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgREVGQVVMVF9TRVJERVMsIAkJTEFTVF9TRVJERVNfU1BFRUQsCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBQRVgxLCAJICAJCV9fNUdicHMsICAJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBQRVgzLCAJICAJCV9fNUdicHMsICAJCQlQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBTQVRBMiwJICAJIAlfXzNHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotCXsgVVNCM19IT1NUMSwgICAgICAgX181R2JwcywgIAkJCVNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQorCXsgVVNCM19IT1NUMSwJCQlfXzVHYnBzLCAgCQkJU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CiB9OwogCiBTRVJERVNfTUFQIERiQ29uZmlnU0xNMTM2NF9EW01BWF9TRVJERVNfTEFORVNdID0KQEAgLTMyNywxNyArMzM3LDE3IEBACiAJeyBERUZBVUxUX1NFUkRFUywgCUxBU1RfU0VSREVTX1NQRUVELAkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKIAl7IFNHTUlJMiwgICAgIAkJX18zXzEyNUdicHMsICAJICAJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBERUZBVUxUX1NFUkRFUywgCUxBU1RfU0VSREVTX1NQRUVELAkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFBFWDIsIAkgIAkJX181R2JwcywgIAkgIAkJICBQRVhfUk9PVF9DT01QTEVYX3gxLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KKwl7IFBFWDIsIAkgIAlfXzVHYnBzLCAgCQkgIFBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQogfTsKIAogU0VSREVTX01BUCBEYkNvbmZpZ1NMTTEzNjRfRltNQVhfU0VSREVTX0xBTkVTXSA9CiB7Ci0JeyBTR01JSTAsCSAJCSBfXzNfMTI1R2JwcywJCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgU0dNSUkwLAkgCV9fM18xMjVHYnBzLAkJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAJeyBERUZBVUxUX1NFUkRFUywgCUxBU1RfU0VSREVTX1NQRUVELAkgIFNFUkRFU19ERUZBVUxUX01PREUsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLQl7IFNHTUlJMSwJICAJCV9fM18xMjVHYnBzLAkJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBTR01JSTIsCSAgCQlfXzNfMTI1R2JwcywJCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgU0dNSUkxLAkgIAlfXzNfMTI1R2JwcywJCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorCXsgU0dNSUkyLAkgIAlfXzNfMTI1R2JwcywJCSAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAogCXsgREVGQVVMVF9TRVJERVMsIAlMQVNUX1NFUkRFU19TUEVFRCwJICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0JeyBQRVgyLAkJICAJCV9fNUdicHMsCQkgIAkgIFBFWF9ST09UX0NPTVBMRVhfeDEsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfQorCXsgUEVYMiwJCSAgCV9fNUdicHMsCSAgCSAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MDcsOSArNDE3LDkgQEAKIFNFUkRFU19NQVAgRGJBbWNDb25maWdEZWZhdWx0W01BWF9TRVJERVNfTEFORVNdID0KIHsKIC8qIDAgKi8geyBQRVgwLCAJCV9fNUdicHMsCQlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCi0vKiAxICovIHsgUEVYMSwgCQlfXzVHYnBzLAkJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotLyogMiAqLyB7IFBFWDIsIAkJX181R2JwcywJCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKLS8qIDMgKi8geyBQRVgzLCAJCV9fNUdicHMsCQlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCisvKiAxICovIHsgUEVYMCwgCQlfXzVHYnBzLAkJUEVYX1JPT1RfQ09NUExFWF94NCwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAorLyogMiAqLyB7IFBFWDAsIAkJX181R2JwcywJCVBFWF9ST09UX0NPTVBMRVhfeDQsCQlNVl9GQUxTRSwJTVZfRkFMU0UgfSwKKy8qIDMgKi8geyBQRVgwLCAJCV9fNUdicHMsCQlQRVhfUk9PVF9DT01QTEVYX3g0LAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAvKiA0ICovIHsgU0dNSUkxLAkJX18zXzEyNUdicHMsCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiAvKiA1ICovIHsgU0dNSUkyLAkJX18zXzEyNUdicHMsCQlTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0sCiB9OwpAQCAtNzE1LDggKzcyNSw2OCBAQAogCU1WX1UzMiBEZXZJZCA9IG12U3lzRW52RGV2aWNlSWRHZXQoKTsKIAlNVl9VMzIgQm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOwogCisJaWYgKEJvYXJkSWQgPT0gREJfQlBfNjgyMV9JRCkgeworCQlzd2l0Y2ggKHRvcG9sb2d5TW9kZSkgeworCQljYXNlIERCXzM4MV9DT05GSUdfREVGQVVMVDoKKwkJCWlmIChEZXZJZCAhPSBNVl82VzIyKQorCQkJCXJldHVybiBNVl9PSzsKKwkJCS8qIERCLTg4RjY4MjEtQlAgb24gNlcyMjogaWYgbGFuZTEgaXMgU0FUQTAgb3IgU0dNSUktMSBvciBRU0dNSUkgc2V0IHRvIGRlZmF1bHQgKi8KKwkJCS8qIC0tPiBkZXZpY2Ugb25seSBzdXBwb3J0cyAxIFNBVEEsIDEgU0dNSUkgYW5kIG5vIFFTR01JSSBpbnRlcmZhY2UgKi8KKwkJCWlmICh0b3BvbG9neUNvbmZpZ1B0clsxXS5zZXJkZXNUeXBlID09IFNHTUlJMSkgeworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IG9uZSBTR01JSSBpbnRlcmZhY2U6IFNHTUlJLTEgQCBsYW5lMSBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbMV0gPSBEZWZhdWx0TGFuZTsKKwkJCX0gZWxzZSBpZiAgKHRvcG9sb2d5Q29uZmlnUHRyWzFdLnNlcmRlc1R5cGUgPT0gUVNHTUlJKSB7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIGRvZXMgbm90IHN1cHBvcnQgUVNHTUlJIGludGVyZmFjZTogUVNHTUlJIEAgbGFuZTEgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzFdID0gRGVmYXVsdExhbmU7CisJCQl9CisJCQkvKiBEQi04OEY2ODIxLUJQIG9uIDZXMjI6IGlmIGxhbmUxIGlzIFNBVEExIG9yIFNHTUlJLTEgb3IgUVNHTUlJIHNldCB0byBkZWZhdWx0ICovCisJCQkvKiAtLT4gZGV2aWNlIG9ubHkgc3VwcG9ydHMgMSBTQVRBIGFuZCAxIFNHTUlJIGludGVyZmFjZSAqLworCQkJaWYgKHRvcG9sb2d5Q29uZmlnUHRyWzJdLnNlcmRlc1R5cGUgPT0gU0FUQTEpIHsKKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjIgc3VwcG9ydHMgb25seSBvbmUgU0FUQSAiKTsKKwkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBTQVRBIFBvcnQgMSBAIGxhbmUyIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clsyXSA9IERlZmF1bHRMYW5lOworCQkJfSBlbHNlIGlmICh0b3BvbG9neUNvbmZpZ1B0clsyXS5zZXJkZXNUeXBlID09IFNHTUlJMSkgeworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IG9uZSBTR01JSSAiKTsKKwkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBTR01JSS0xIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQl9CisJCQkvKiBEQi04OEY2ODIxLUJQOiBkZWZhdWx0IGZvciBMYW5lMz1VU0IzX0hPU1QxIC0tPiA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFVTQjMgSG9zdCovCisJCQkvKiAtLT4gZGV2aWNlIG9ubHkgc3VwcG9ydHMgMSBTQVRBLCBTR01JSSBhbmQgbm8gUVNHTUlJIGludGVyZmFjZSAqLworCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFVTQjMgSG9zdCBpbnRlcmZhY2U6IFVTQjMgUG9ydCAxIEAgbGFuZTMgZGlzYWJsZWRcbiIpOworCQkJdG9wb2xvZ3lDb25maWdQdHJbM10gPSBEZWZhdWx0TGFuZTsKKwkJCWJyZWFrOworCQljYXNlIERCX0NPTkZJR19TTE0xNDI3OgorCQkJLyogREItODhGNjgyMS1CUCBvbiA2VzIyOiBkZWZhdWx0IGZvciBMYW5lMj1TQVRBMSxMYW5lMz1VU0IzX0hPU1QxICovCisJCQkvKiAtLT4gZGV2aWNlIHN1cHBvcnRzIG9ubHkgMSBTQVRBIGFuZCAxIFVTQjMgaW50ZXJmYWNlICovCisJCQlpZiAoRGV2SWQgPT0gTVZfNlcyMikgeworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IG9uZSBTQVRBICIpOworCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNBVEEgUG9ydCAxIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzJdID0gRGVmYXVsdExhbmU7CisJCQkJbXZQcmludGYoIkRldmljZSA2VzIyIHN1cHBvcnRzIG9ubHkgb25lIFVTQjMgIik7CisJCQkJbXZQcmludGYoImludGVyZmFjZTogVVNCMyBQb3J0IDEgQCBsYW5lMyBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbM10gPSBEZWZhdWx0TGFuZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERCX0NPTkZJR19TTE0xNDI2OgorCQkJLyogREItODhGNjgyMS1CUCBvbiA2VzIyOiBkZWZhdWx0IGZvciBMYW5lMj1TQVRBMSxMYW5lMz1TR01JSS0yICovCisJCQkvKiAtLT4gZGV2aWNlIHN1cHBvcnRzIG9ubHkgMSBTQVRBIGFuZCAxIFNHTUlJIGludGVyZmFjZSAqLworCQkJaWYgKERldklkID09IE1WXzZXMjIpIHsKKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjIgc3VwcG9ydHMgb25seSBvbmUgU0FUQSAiKTsKKwkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBTQVRBIFBvcnQgMSBAIGxhbmUyIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clsyXSA9IERlZmF1bHRMYW5lOworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IG9uZSBTR01JSSAiKTsKKwkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBTR01JSS0yIEAgbGFuZTMgZGlzYWJsZWRcbiIpOworCQkJCXRvcG9sb2d5Q29uZmlnUHRyWzNdID0gRGVmYXVsdExhbmU7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBNVl9PSzsKKwl9CiAJc3dpdGNoKHRvcG9sb2d5TW9kZSkgewogCWNhc2UgREJfQ09ORklHX0RFRkFVTFQ6CisJLyogdXBkYXRlIGZvciBEQi1HUCwgREItQVAsIERCLUFNQywgQW5kIGZvciBEQiB3aXRoIGRlZmF1bHQgdG9wb2xvZ3kgKi8KIAkJc3dpdGNoKERldklkKSB7CiAJCWNhc2UgTVZfNjgxMDoKIAkJCS8qIERCLUFQIDogZGVmYXVsdCBmb3IgTGFuZTM9U0dNSUkyIC0tPiA2ODEwIHN1cHBvcnRzIG9ubHkgMiBTR01JSSBpbnRlcmZhY2VzOiBsYW5lIDMgZGlzYWJsZWQgKi8KQEAgLTc0MSwxMSArODExLDgyIEBACiAJCQkJdG9wb2xvZ3lDb25maWdQdHJbNF0gPSBEZWZhdWx0TGFuZTsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIE1WXzZXMjM6CisJCQlpZiAoQm9hcmRJZCA9PSBEQl9HUF82OFhYX0lEKSB7CisJCQkJLyogREItR1Agb24gNlcyMzogaWYgbGFuZSAyIGNoYW5nZWQgdG8gU0FUQTEgYnkgU2F0UiBjaGFuZ2UgdG8gZGVmYXVsdAorCQkJCSAqIC0tPiA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNBVEEgaW50ZXJmYWNlICovCisJCQkJaWYgKHRvcG9sb2d5Q29uZmlnUHRyWzJdLnNlcmRlc1R5cGUgPT0gU0FUQTEpIHsKKwkJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lICIpOworCQkJCQltdlByaW50ZigiU0FUQSBpbnRlcmZhY2U6IFNBVEEgUG9ydCAxIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCQl0b3BvbG9neUNvbmZpZ1B0clsyXSA9IERlZmF1bHRMYW5lOworCQkJCX0KKwkJCQkvKiBEQi1HUCBvbiA2VzIzOiBkZWZhdWx0IGZvciBMYW5lMz1TQVRBMyxMYW5lND1TQVRBMiAtLT4KKwkJCQkgKiA2VzIzIHN1cHBvcnRzIG9ubHkgMSBTQVRBIGludGVyZmFjZSAqLworCQkJCS8qIGRlZmF1bHQgZm9yIExhbmU1PVVTQjNfSE9TVDEgLS0+IDZXMjMgc3VwcG9ydCBvbmx5IDQgU2VyRGVzIGxhbmVzICovCisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNBVEEgaW50ZXJmYWNlOiBTQVRBICIpOworCQkJCW12UHJpbnRmKCJQb3J0IDMgQCBsYW5lMyBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbM10gPSBEZWZhdWx0TGFuZTsKKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0FUQSBpbnRlcmZhY2U6IFNBVEEgIik7CisJCQkJbXZQcmludGYoIlBvcnQgMiBAIGxhbmU0IGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0cls0XSA9IERlZmF1bHRMYW5lOworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IDQgU2VyRGVzIGxhbmVzOiBVU0IzLUhvc3QgIik7CisJCQkJbXZQcmludGYoIlBvcnQgMSBAIGxhbmU1IGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0cls1XSA9IERlZmF1bHRMYW5lOworCQkJfSBlbHNlIGlmIChCb2FyZElkID09IERCXzY4WFhfSUQpIHsKKwkJCQkvKiBEQi1CUCBvbiA2VzIzOiBpZiBsYW5lIGlzIFNHTUlJLTEgb3IgUVNHTUlJIHNldCB0byBkZWZhdWx0ICovCisJCQkJLyogLS0+IGRldmljZSBvbmx5IHN1cHBvcnRzIDEgU0dNSUkgYW5kIG5vIFFTR01JSSBpbnRlcmZhY2UgKi8KKwkJCQlpZiAodG9wb2xvZ3lDb25maWdQdHJbMV0uc2VyZGVzVHlwZSA9PSBTR01JSTEpIHsKKwkJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJICIpOworCQkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBTR01JSS0xIEAgbGFuZTEgZGlzYWJsZWRcbiIpOworCQkJCQl0b3BvbG9neUNvbmZpZ1B0clsxXSA9IERlZmF1bHRMYW5lOworCQkJCX0gZWxzZSBpZiAgKHRvcG9sb2d5Q29uZmlnUHRyWzFdLnNlcmRlc1R5cGUgPT0gUVNHTUlJKSB7CisJCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBkb2VzIG5vdCBzdXBwb3J0IFFTR01JSSAiKTsKKwkJCQkJbXZQcmludGYoImludGVyZmFjZTogUVNHTUlJIEAgbGFuZTEgZGlzYWJsZWRcbiIpOworCQkJCQl0b3BvbG9neUNvbmZpZ1B0clsxXSA9IERlZmF1bHRMYW5lOworCQkJCX0KKwkJCQkvKiBEQi1CUCBvbiA2VzIzOiBpZiBsYW5lMSBpcyBTQVRBMSBvciBTR01JSS0xIG9yIFFTR01JSSBzZXQgdG8gZGVmYXVsdCAqLworCQkJCS8qIC0tPiBkZXZpY2Ugb25seSBzdXBwb3J0cyAxIFNBVEEgYW5kIDEgU0dNSUkgaW50ZXJmYWNlICovCisJCQkJaWYgKHRvcG9sb2d5Q29uZmlnUHRyWzJdLnNlcmRlc1R5cGUgPT0gU0FUQTEpIHsKKwkJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNBVEEgIik7CisJCQkJCW12UHJpbnRmKCJpbnRlcmZhY2U6IFNBVEEgUG9ydCAxIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCQl0b3BvbG9neUNvbmZpZ1B0clsyXSA9IERlZmF1bHRMYW5lOworCQkJCX0gZWxzZSBpZiAodG9wb2xvZ3lDb25maWdQdHJbMl0uc2VyZGVzVHlwZSA9PSBTR01JSTEpIHsKKwkJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJICIpOworCQkJCQltdlByaW50ZigiaW50ZXJmYWNlOiBTR01JSS0xIEAgbGFuZTIgZGlzYWJsZWRcbiIpOworCQkJCQl0b3BvbG9neUNvbmZpZ1B0clsyXSA9IERlZmF1bHRMYW5lOworCQkJCX0KKwkJCQkvKiBEQi1HUCBvbiA2VzIzOiBkZWZhdWx0IHRvIExhbmUzPVNBVEEzCisJCQkJICogLS0+IDZXMjMgc3VwcG9ydHMgb25seSBvbmUgU0FUQSBpbnRlcmZhY2UgKi8KKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSBvbmUgIik7CisJCQkJbXZQcmludGYoIlNBVEEgaW50ZXJmYWNlOiBTQVRBIFBvcnQgMyBAIGxhbmUzIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clszXSA9IERlZmF1bHRMYW5lOworCQkJCS8qIGRlZmF1bHQgZm9yIExhbmU0PVVTQjNfSE9TVDAsTGFuZTU9VVNCM19IT1NUMQorCQkJCSAqIC0tPiA2VzIzIHN1cHBvcnQgb25seSA0IFNlckRlcyBsYW5lcyAqLworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IDQgU2VyRGVzIGxhbmVzOiBVU0IzLUhvc3QgIik7CisJCQkJbXZQcmludGYoIlBvcnQgMCBAIGxhbmU0IGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0cls0XSA9IERlZmF1bHRMYW5lOworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IDQgU2VyRGVzIGxhbmVzOiBVU0IzLUhvc3QgIik7CisJCQkJbXZQcmludGYoIlBvcnQgMSBAIGxhbmU1IGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0cls1XSA9IERlZmF1bHRMYW5lOworCQkJfSBlbHNlIGlmIChCb2FyZElkID09IERCX0FQXzY4WFhfSUQpIHsKKwkJCQkvKiBEQi1BUCBvbiA2VzIzOiBkZWZhdWx0IGZvciBMYW5lMT1TR01JSS0xLCBMYW5lMz1TR01JSS0yICovCisJCQkJLyogLS0+IGRldmljZSBvbmx5IHN1cHBvcnRzIDEgU0dNSUkgaW50ZXJmYWNlICovCisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgb25lIFNHTUlJIGludGVyZmFjZTogU0dNSUktMSBAIGxhbmUxIGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0clsxXSA9IERlZmF1bHRMYW5lOworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMyBzdXBwb3J0cyBvbmx5IG9uZSBTR01JSSBpbnRlcmZhY2U6IFNHTUlJLTIgQCBsYW5lMyBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbM10gPSBEZWZhdWx0TGFuZTsKKwkJCQkvKiBkZWZhdWx0IGZvciBMYW5lND1VU0IzX0hPU1QwLExhbmU1PVBFWDIKKwkJCQkgKiAtLT4gNlcyMyBzdXBwb3J0IG9ubHkgNCBTZXJEZXMgbGFuZXMgKi8KKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSA0IFNlckRlcyBsYW5lczogIik7CisJCQkJbXZQcmludGYoIlVTQjMtSG9zdCBQb3J0IDAgQCBsYW5lNCBkaXNhYmxlZFxuIik7CisJCQkJdG9wb2xvZ3lDb25maWdQdHJbNF0gPSBEZWZhdWx0TGFuZTsKKwkJCQltdlByaW50ZigiRGV2aWNlIDZXMjMgc3VwcG9ydHMgb25seSA0IFNlckRlcyBsYW5lczogIFBvcnQgMSBAIGxhbmU1IGRpc2FibGVkXG4iKTsKKwkJCQl0b3BvbG9neUNvbmZpZ1B0cls1XSA9IERlZmF1bHRMYW5lOworCQkJfQogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQltdlByaW50ZigibXZTeXNFbnZVcGRhdGVEZXZpY2VUb3Bsb2d5OiBzZWxlY3RlZCB0b3BvbG9neSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgcm91dGluZVxuIik7CiAJCWJyZWFrOwpAQCAtNzY3LDE0ICs5MDgsMTcgQEAKIAkvKiBHZXR0aW5nIHRoZSByZWxldmFudCB0b3BvbG9neSBtb2RlIChpbmRleCkgKi8KIAl0b3BvbG9neU1vZGUgPSB0b3BvbG9neUNvbmZpZ0RCMzgxTW9kZUdldCgpOwogCXRvcG9sb2d5Q29uZmlnUHRyID0gdG9wb2xvZ3lDb25maWdEQjM4MVt0b3BvbG9neU1vZGVdOwotCisJLyogaWYgbm90IGRldGVjdGVkIGFueSBTZXJEZXMgU2l0ZSBtb2R1bGUsIHJlYWQgJ1NhdFInIGxhbmUgc2V0dXAgKi8KKwlpZiAodG9wb2xvZ3lNb2RlID09IERCXzM4MV9DT05GSUdfREVGQVVMVCkKKwkJdXBkYXRlVG9wb2xvZ3lTYXRSKHRvcG9sb2d5Q29uZmlnUHRyKTsKKwkvKiBVcGRhdGUgdGhlIGRlZmF1bHQgYm9hcmQgdG9wb2xvZ3kgZGV2aWNlIGZsYXZvdXJzICovCisJQ0hFQ0tfU1RBVFVTKG12SHdzVXBkYXRlRGV2aWNlVG9wbG9neSh0b3BvbG9neUNvbmZpZ1B0ciwgdG9wb2xvZ3lNb2RlKSk7CiAJLyogUmVhZCBVU0IzLjAgbW9kZTogSE9TVC9ERVZJQ0UgKi8KIAlpZiAobG9hZFRvcG9sb2d5VVNCTW9kZUdldCgmdHdzaURhdGEpID09IE1WX09LKSB7CiAJCXVzYjNIb3N0ME9yRGV2aWNlID0gKHR3c2lEYXRhICYgMHgxKTsKIAkJaWYgKHVzYjNIb3N0ME9yRGV2aWNlID09IDApIC8qIE9ubHkgb25lIFVTQjMgZGV2aWNlIGlzIGVuYWJsZWQgKi8KIAkJCXVzYjNIb3N0MU9yRGV2aWNlID0gKCh0d3NpRGF0YSA+PiAxKSAmIDB4MSk7CiAJfQotCiAJLyogVXBkYXRpbmcgdGhlIHRvcG9sb2d5IG1hcCAqLwogCWZvciAobGFuZU51bSA9IDA7IGxhbmVOdW0gPCBtdkh3c1NlcmRlc0dldE1heExhbmUoKTsgbGFuZU51bSsrKSB7CiAJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc01vZGUgID0gdG9wb2xvZ3lDb25maWdQdHJbbGFuZU51bV0uc2VyZGVzTW9kZTsKQEAgLTc4MiwyMCArOTI2LDI2IEBACiAJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgID0gdG9wb2xvZ3lDb25maWdQdHJbbGFuZU51bV0uc2VyZGVzVHlwZTsKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc3dhcFJ4ICAgICAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zd2FwUng7CiAJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnN3YXBUeCAgICAgID0gdG9wb2xvZ3lDb25maWdQdHJbbGFuZU51bV0uc3dhcFR4OwotCiAJCS8qIFVwZGF0ZSBVU0IzIGRldmljZSBpZiBuZWVkZWQqLwotCQlpZiAodXNiM0hvc3QwT3JEZXZpY2UgPT0gMSAmJiBzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfSE9TVDApCi0JCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID0gVVNCM19ERVZJQ0U7CisJCWlmICh1c2IzSG9zdDBPckRldmljZSA9PSAxICYmIHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPT0gVVNCM19IT1NUMCkgeworCQkJaWYgKG12U3lzRW52RGV2aWNlSWRHZXQoKSAhPSBNVl82VzIyKSB7CisJCQkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9IFVTQjNfREVWSUNFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEZXZpY2UgNlcyMjogRGlzYWJsZSBVU0IzLS0+ZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBkZXZpY2UgbW9kZSAqLworCQkJCW12UHJpbnRmKCJEZXZpY2UgNlcyMiBzdXBwb3J0cyBvbmx5IFVTQjMgSG9zdCAiKTsKKwkJCQltdlByaW50ZigibW9kZTogVVNCMyBQb3J0IDAgQCBsYW5lJXUgZGlzYWJsZWRcbiIsIGxhbmVOdW0pOworCQkJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dID0gRGVmYXVsdExhbmU7CisJCQl9CisJCX0KIAogCQlpZiAodXNiM0hvc3QxT3JEZXZpY2UgPT0gMSAmJiBzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfSE9TVDEpCiAJCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID0gVVNCM19ERVZJQ0U7CiAJfQotCS8qIGlmIG5vdCBkZXRlY3RlZCBhbnkgU2VyRGVzIFNpdGUgbW9kdWxlLCByZWFkICdTYXRSJyBsYW5lIHNldHVwICovCi0JaWYgKHRvcG9sb2d5TW9kZSA9PSBEQl8zODFfQ09ORklHX0RFRkFVTFQpCi0JCXVwZGF0ZVRvcG9sb2d5U2F0UihzZXJkZXNNYXBBcnJheSk7CiAKIAkvKiB1cGRhdGUgJ3NnbWlpc3BlZWQnIHNldHRpbmdzICovCiAJdXBkYXRlVG9wb2xvZ3lTZ21paVNwZWVkKHNlcmRlc01hcEFycmF5KTsKKwkvKiB1cGRhdGUgVVNCMyBjb25maWcgcmVnaXN0ZXIgKi8KKwl1cGRhdGVVc2IzRGV2aWNlQ29uZmlnKHNlcmRlc01hcEFycmF5KTsKIAogCXJldHVybiBNVl9PSzsKIH0KQEAgLTgwOCw3ICs5NTgsNiBAQAogCVNFUkRFU19NQVAqIHRvcG9sb2d5Q29uZmlnUHRyOwogCU1WX1U4IHR3c2lEYXRhOwogCU1WX1U4IHVzYjNIb3N0ME9yRGV2aWNlID0gMCwgdXNiM0hvc3QxT3JEZXZpY2UgPSAwOwotCiAJbXZQcmludGYoIlxuSW5pdGlhbGl6ZSBEQi04OEY2ODIwLUJQIGJvYXJkIHRvcG9sb2d5XG4iKTsKIAogCS8qIEdldHRpbmcgdGhlIHJlbGV2YW50IHRvcG9sb2d5IG1vZGUgKGluZGV4KSAqLwpAQCAtODE4LDcgKzk2Nyw5IEBACiAJCXRvcG9sb2d5TW9kZSA9IERCX0NPTkZJR19ERUZBVUxUOwogCiAJdG9wb2xvZ3lDb25maWdQdHIgPSB0b3BvbG9neUNvbmZpZ0RCW3RvcG9sb2d5TW9kZV07Ci0KKwkvKiBpZiBub3QgZGV0ZWN0ZWQgYW55IFNlckRlcyBTaXRlIG1vZHVsZSwgcmVhZCAnU2F0UicgbGFuZSBzZXR1cCAqLworCWlmICh0b3BvbG9neU1vZGUgPT0gREJfQ09ORklHX0RFRkFVTFQpCisJCXVwZGF0ZVRvcG9sb2d5U2F0Uih0b3BvbG9neUNvbmZpZ1B0cik7CiAJLyogVXBkYXRlIHRoZSBkZWZhdWx0IGJvYXJkIHRvcG9sb2d5IGRldmljZSBmbGF2b3VycyAqLwogCUNIRUNLX1NUQVRVUyhtdkh3c1VwZGF0ZURldmljZVRvcGxvZ3kodG9wb2xvZ3lDb25maWdQdHIsIHRvcG9sb2d5TW9kZSkpOwogCkBAIC04MzcsMjQgKzk4OCwyOCBAQAogCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zd2FwUnggICAgICA9IHRvcG9sb2d5Q29uZmlnUHRyW2xhbmVOdW1dLnN3YXBSeDsKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc3dhcFR4ICAgICAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zd2FwVHg7CiAKLQkJLyogVXBkYXRlIFVTQjMgZGV2aWNlIGlmIG5lZWRlZCAtIHJlbGV2YW50IGZvciBsYW5lIDMsNCw1IG9ubHkgKi8KLQkJaWYgKGxhbmVOdW0gPj0gMykKLQkJewotCQkJaWYgKChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IFVTQjNfSE9TVDApICYmCi0JCQkJKHVzYjNIb3N0ME9yRGV2aWNlID09IDEpKQotCQkJCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID0gVVNCM19ERVZJQ0U7Ci0KLQkJCWlmICgoc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9PSBVU0IzX0hPU1QxKSAmJgotCQkJCSh1c2IzSG9zdDFPckRldmljZSA9PSAxKSkKLQkJCQkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9IFVTQjNfREVWSUNFOworCQkvKiBVcGRhdGUgVVNCMyBkZXZpY2UgaWYgbmVlZGVkICovCisJCWlmICgoc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9PSBVU0IzX0hPU1QwKSAmJgorCQkJKHVzYjNIb3N0ME9yRGV2aWNlID09IDEpKSB7CisJCQlpZiAobXZTeXNFbnZEZXZpY2VJZEdldCgpICE9IE1WXzZXMjMpIHsKKwkJCQlzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID0gVVNCM19ERVZJQ0U7CisJCQl9IGVsc2UgeworCQkJCS8qIERldmljZSA2VzIzOiBEaXNhYmxlIFVTQjMtLT5kZXZpY2UgZG9lc24ndCBzdXBwb3J0IGRldmljZSBtb2RlICovCisJCQkJbXZQcmludGYoIkRldmljZSA2VzIzIHN1cHBvcnRzIG9ubHkgVVNCMyBIb3N0ICIpOworCQkJCW12UHJpbnRmKCJtb2RlOiBVU0IzIFBvcnQgMCBAIGxhbmUldSBkaXNhYmxlZFxuIiwgbGFuZU51bSk7CisJCQkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0gPSBEZWZhdWx0TGFuZTsKKwkJCX0KIAkJfQorCisJCWlmICgoc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc2VyZGVzVHlwZSA9PSBVU0IzX0hPU1QxKSAmJgorCQkJKHVzYjNIb3N0MU9yRGV2aWNlID09IDEpKQorCQkJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1R5cGUgPSBVU0IzX0RFVklDRTsKIAl9Ci0JLyogaWYgbm90IGRldGVjdGVkIGFueSBTZXJEZXMgU2l0ZSBtb2R1bGUsIHJlYWQgJ1NhdFInIGxhbmUgc2V0dXAgKi8KLQlpZiAodG9wb2xvZ3lNb2RlID09IERCX0NPTkZJR19ERUZBVUxUKQotCQl1cGRhdGVUb3BvbG9neVNhdFIoc2VyZGVzTWFwQXJyYXkpOwogCiAJLyogdXBkYXRlICdzZ21paXNwZWVkJyBzZXR0aW5ncyAqLwogCXVwZGF0ZVRvcG9sb2d5U2dtaWlTcGVlZChzZXJkZXNNYXBBcnJheSk7CisJLyogdXBkYXRlIFVTQjMgY29uZmlnIHJlZ2lzdGVyICovCisJdXBkYXRlVXNiM0RldmljZUNvbmZpZyhzZXJkZXNNYXBBcnJheSk7CiAKIAlyZXR1cm4gTVZfT0s7CiB9CkBAIC05MDYsNyArMTA2MSw4IEBACiAJCXRvcG9sb2d5Q29uZmlnUHRyWzVdLnNlcmRlc1NwZWVkID0gIGlzU2dtaWkgPyBfXzNfMTI1R2JwcyA6IF9fNUdicHM7OwogCQl0b3BvbG9neUNvbmZpZ1B0cls1XS5zZXJkZXNNb2RlID0gU0VSREVTX0RFRkFVTFRfTU9ERTsKIAl9Ci0KKwkvKiB1cGRhdGUgJ2dwc2VyZGVzMS8yJyBsYW5lIGNvbmZpZ3VyYXRpb24gKi8KKwl1cGRhdGVUb3BvbG9neVNhdFIodG9wb2xvZ3lDb25maWdQdHIpOwogCS8qIFVwZGF0ZSB0aGUgZGVmYXVsdCBib2FyZCB0b3BvbG9neSBkZXZpY2UgZmxhdm91cnMgKi8KIAlDSEVDS19TVEFUVVMobXZId3NVcGRhdGVEZXZpY2VUb3Bsb2d5KHRvcG9sb2d5Q29uZmlnUHRyLCBEQl9DT05GSUdfREVGQVVMVCkpOwogCkBAIC05MTksOCArMTA3NSw3IEBACiAJCXNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnN3YXBUeCAgICAgID0gdG9wb2xvZ3lDb25maWdQdHJbbGFuZU51bV0uc3dhcFR4OwogCX0KIAotCS8qIHVwZGF0ZSAnZ3BzZXJkZXMxLzIvMycgbGFuZSBjb25maWd1cmF0aW9uICwgYW5kICdzZ21paXNwZWVkJyBmb3IgU0dNSUkgbGFuZXMgKi8KLQl1cGRhdGVUb3BvbG9neVNhdFIoc2VyZGVzTWFwQXJyYXkpOworCS8qIHVwZGF0ZSAnc2dtaWlzcGVlZCcgZm9yIFNHTUlJIGxhbmVzICovCiAJdXBkYXRlVG9wb2xvZ3lTZ21paVNwZWVkKHNlcmRlc01hcEFycmF5KTsKIAogCXJldHVybiBNVl9PSzsKQEAgLTk0OCw4ICsxMTAzLDYgQEAKIAkJc2VyZGVzTWFwQXJyYXlbbGFuZU51bV0uc3dhcFR4ICAgICAgPSB0b3BvbG9neUNvbmZpZ1B0cltsYW5lTnVtXS5zd2FwVHg7CiAJfQogCi0JdXBkYXRlVG9wb2xvZ3lTZ21paVNwZWVkKHNlcmRlc01hcEFycmF5KTsKLQogCXJldHVybiBNVl9PSzsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZFRvcG9sb2d5U3BlYy0zOXguYyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L2EzOHgvbXZIaWdoU3BlZWRUb3BvbG9neVNwZWMtMzl4LmMKaW5kZXggYTA2MDUxMC4uZTQ5ODA4ZCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvYTM4eC9tdkhpZ2hTcGVlZFRvcG9sb2d5U3BlYy0zOXguYworKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9hMzh4L212SGlnaFNwZWVkVG9wb2xvZ3lTcGVjLTM5eC5jCkBAIC0xODgsNyArMTg4LDEwIEBACiAgICAgX181R2JwcywgICAgLyogVVNCM19IT1NUMCAqLwogICAgIF9fNUdicHMsICAgIC8qIFVTQjNfSE9TVDEgKi8KICAgICBfXzVHYnBzLCAgICAvKiBVU0IzX0RFVklDRSAqLwotICAgIF9fMV8yNUdicHMsIC8qIFNHTUlJMyAqLworICAgIF9fMV8yNUdicHMsIC8qIFNHTUlJdjNfMCAqLworICAgIF9fMV8yNUdicHMsIC8qIFNHTUlJdjNfMSAqLworICAgIF9fMV8yNUdicHMsIC8qIFNHTUlJdjNfMiAqLworICAgIF9fMV8yNUdicHMsIC8qIFNHTUlJdjNfMDMgKi8KICAgICBfXzNfMTI1R2JwcywvKiBYQVVJICovCiAgICAgX182XzI1R2JwcywgLyogUlhBVUkgKi8KIH07CkBAIC0xOTYsMTQgKzE5OSwxNCBAQAogLyogU2VsZWN0b3IgdG8gU2VyZGVzIHR5cGUgbWFwcGluZyAqLwogU0VSREVTX1RZUEUgY29tbW9uUGh5c1R5cGVbTUFYX1NFUkRFU19MQU5FU11bTUFYX1NFTEVDVE9SX1ZBTF0gPQogewotLyoJIDBYMCAgIDB4MSAgICAweDIgICAgICAweDMgICAgIDB4NCAgICAgICAgICAgICAgIDB4NSAgICAgICAgIDB4NiAgICAgIDB4NyAgICAgMHg4ICAgICAweDkgKi8KLXsgREVGQVVMVF9TRVJERVMsIFBFWDAsIFNBVEEwLCAgICAgICAgICBTR01JSTAsIFNHTUlJMCwgICAgICBOQSwgICAgICAgICAgTkEsICAgICAgICAgIE5BLCAgICAgTkEsICAgICBOQSAgICAgfSwgIC8qIExhbmUgMCAqLwoteyBERUZBVUxUX1NFUkRFUywgUEVYMCwgUEVYMSwgICAgICAgICAgIFNBVEEwLCAgU0dNSUkwLCAgICAgIFNHTUlJMSwgICAgICBVU0IzX0hPU1QwLCAgUVNHTUlJLCBTR01JSTAsIFNHTUlJMSB9LCAgLyogTGFuZSAxICovCi17IERFRkFVTFRfU0VSREVTLCBQRVgxLCBQRVgyLCAgICAgICAgICAgU0FUQTEsICBTR01JSTEsICAgICAgU0dNSUkxLCAgICAgIE5BLCAgICAgICAgICBOQSwgICAgIE5BLCAgICAgTkEgICAgIH0sICAvKiBMYW5lIDIgKi8KLXsgREVGQVVMVF9TRVJERVMsIFBFWDMsIFBFWDMsICAgICAgICAgICBTQVRBMywgIFNHTUlJMiwgICAgICBVU0IzX0hPU1QxLCAgVVNCM19ERVZJQ0UsIFNHTUlJMiwgWEFVSSwgICBOQSAgICAgfSwgIC8qIExhbmUgMyAqLwoteyBERUZBVUxUX1NFUkRFUywgUEVYMSwgREVGQVVMVF9TRVJERVMsIFNHTUlJMSwgVVNCM19IT1NUMCwgIFVTQjNfREVWSUNFLCBTQVRBMiwgICAgICAgUEVYMiwgICBTR01JSTMsIFhBVUkgICB9LCAgLyogTGFuZSA0ICovCi17IERFRkFVTFRfU0VSREVTLCBQRVgyLCBTQVRBMiwgICAgICAgICAgU0dNSUkyLCBVU0IzX0hPU1QxLCAgVVNCM19ERVZJQ0UsIFNHTUlJMiwgICAgICBOQSwgICAgIFhBVUksICAgTkEgICAgIH0sICAvKiBMYW5lIDUgKi8KLXsgREVGQVVMVF9TRVJERVMsIFBFWDEsIFNHTUlJMywgICAgICAgICBOQSwgICAgIFhBVUksICAgICAgICBOQSwgICAgICAgICAgTkEsICAgICAgICAgIE5BLCAgICAgTkEsICAgICBOQSAgICAgfSwgIC8qIExhbmUgNiAqLworLyoJIDBYMAkgICAweDEgICAweDIJCTB4MyAgICAgMHg0ICAgICAgICAgIDB4NSAgICAgICAgIDB4NgkgICAgICAgMHg3CQkweDgJCTB4OQkJKi8KK3sgREVGQVVMVF9TRVJERVMsIFBFWDAsIFNBVEEwLCAgICAgICAgICBTR01JSTAsIFNHTUlJdjNfMCwgICBOQSwgICAgICAgICAgTkEsICAgICAgICAgIE5BLAkJTkEsCQlOQSwJCX0sICAvKiBMYW5lIDAgKi8KK3sgREVGQVVMVF9TRVJERVMsIFBFWDAsIFBFWDEsICAgICAgICAgICBTQVRBMCwgIFNHTUlJMCwgICAgICBTR01JSTEsICAgICAgVVNCM19IT1NUMCwgIFFTR01JSSwJCVNHTUlJdjNfMCwJU0dNSUl2M18xLAl9LCAgLyogTGFuZSAxICovCit7IERFRkFVTFRfU0VSREVTLCBQRVgxLCBQRVgyLCAgICAgICAgICAgU0FUQTEsICBTR01JSTEsICAgICAgU0dNSUl2M18xLCAgIE5BLCAgICAgICAgICBOQSwJCU5BLAkJTkEgLAkJfSwgIC8qIExhbmUgMiAqLworeyBERUZBVUxUX1NFUkRFUywgUEVYMywgUEVYMywgICAgICAgICAgIFNBVEEzLCAgU0dNSUkyLCAgICAgIFVTQjNfSE9TVDEsICBVU0IzX0RFVklDRSwgU0dNSUl2M18yLAlYQVVJLAkJTkEsCQl9LCAgLyogTGFuZSAzICovCit7IERFRkFVTFRfU0VSREVTLCBQRVgxLCBERUZBVUxUX1NFUkRFUywgU0dNSUkxLCBVU0IzX0hPU1QwLCAgVVNCM19ERVZJQ0UsIFNBVEEyLCAgICAgICBQRVgyLAkJU0dNSUl2M18zLAlYQVVJLAkJfSwgIC8qIExhbmUgNCAqLworeyBERUZBVUxUX1NFUkRFUywgUEVYMiwgU0FUQTIsICAgICAgICAgIFNHTUlJMiwgVVNCM19IT1NUMSwgIFVTQjNfREVWSUNFLCBTR01JSXYzXzIsICAgTkEsCQlYQVVJLAkJTkEsCQl9LCAgLyogTGFuZSA1ICovCit7IERFRkFVTFRfU0VSREVTLCBQRVgxLCBTR01JSXYzXzAsICAgICAgTkEsICAgICBYQVVJLCAgICAgICAgTkEsICAgICAgICAgIE5BLCAgICAgICAgICBOQSwJCU5BLAkJTkEsCQl9LCAgLyogTGFuZSA2ICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxOSw3ICsyMjIsNyBAQAogCXsgU0dNSUkyLCAgICAgICBfXzFfMjVHYnBzLAkJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAogCXsgUEVYMiwgICAgICAgICBfXzVHYnBzLAkJICAgUEVYX1JPT1RfQ09NUExFWF94MSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAogCXsgUlhBVUksICAgICAgICBfXzZfMjVHYnBzLAkJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9LAotICAgIHsgUlhBVUksICAgICAgICBfXzZfMjVHYnBzLAkJICAgU0VSREVTX0RFRkFVTFRfTU9ERSwJCU1WX0ZBTFNFLAlNVl9GQUxTRSB9CisJeyBSWEFVSSwgICAgICAgIF9fNl8yNUdicHMsCQkgICBTRVJERVNfREVGQVVMVF9NT0RFLAkJTVZfRkFMU0UsCU1WX0ZBTFNFIH0KIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMDMsNiArMzA2LDggQEAKICAgICAgICAgc2VsZWN0b3JWYWwgPSBtdlN5c0VudkNvbmZpZ0dldChjb25maWdJZCk7CiAgICAgICAgIHNlcmRlc1R5cGUgPSBjb21tb25QaHlzVHlwZVtzZXJkZXNOdW1dW3NlbGVjdG9yVmFsXTsKIAorCisKICAgICAgICAgaWYgKHNlbGVjdG9yVmFsID4gTUFYX1NFTEVDVE9SX1ZBTCkgewogICAgICAgICAgICAgbXZQcmludGYoIm12U3lzVXBkYXRlTGFuZUNvbmZpZzogRXJyb3I6IFNlbGVjdG9yIHZhbHVlICUweCV4IChTZXJkZXMgJWQpIGlzIGJpZ2dlciB0aGVuIG1heCB2YWx1ZSAoMHgleClcbiIsCiAJCQkJCSBzZWxlY3RvclZhbCwgc2VyZGVzTnVtLCBNQVhfU0VMRUNUT1JfVkFMKTsKQEAgLTMxNyw3ICszMjIsNyBAQAogCiAJCXNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc2VyZGVzVHlwZSAgPSBzZXJkZXNUeXBlOwogCQlzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnNlcmRlc1NwZWVkID0gZGVmYXVsdFNlcmRlc1NwZWVkTWFwW3NlcmRlc1R5cGVdOwotICAgICAgICBzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW1dLnNlcmRlc01vZGUgID0gU0VSREVTX0RFRkFVTFRfTU9ERTsgLyogc2V0IHRvIGRlZmF1bHQgKi8KKwkJc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNNb2RlICA9IFNFUkRFU19ERUZBVUxUX01PREU7IC8qIHNldCB0byBkZWZhdWx0ICovCiAJCXNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc3dhcFJ4ICAgICAgPSBNVl9GQUxTRTsKIAkJc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zd2FwVHggICAgICA9IE1WX0ZBTFNFOwogCkBAIC0zMjcsMTEgKzMzMiwyMCBAQAogCQkgICBpcyBQRVh4NCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgUEVYeDEgKHRoaXMgaXMgZG9uZSBhZnRlciBhbGwKIAkJICAgU2VyZGVzIHR5cGVzIGFyZSB1cGRhdGVkKS4gKi8KICAgICAgICAgaWYoc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNUeXBlIDw9IFBFWDMpIHsKLSAgICAgICAgICAgIHNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc2VyZGVzTW9kZSA9IChzZWxlY3RvclZhbCA9PSAweDIpID8KKyAgICAgICAgICAgIHNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc2VyZGVzTW9kZSA9IChzZWxlY3RvclZhbCA9PSAweDIpID8gLyogZm9yIGxhbmVzIDEsMixhbmQgMyBzZWxlY3RvciB2YWxhdWUgaGFzIHZhbHVlPTEgZm9yIFBFWHgxIGFuZCB2YWx1ZT0yIGZvciBQRVh4NCwKKwkJCQkJCQkJCSAgICAgZm9yIGxhbmUgMCAtIGl0IGlzIGFsd2F5cyAxLCBzbyBzZXJkZXNNb2RlIHdpbGwgYmUgdXBkYXRlZCBsYXRlciAsIHdoZW4gbGFuZSAxIGlzIGhhbmRsZWQgKi8KICAgICAgICAgICAgICAgICBQRVhfUk9PVF9DT01QTEVYX3g0IDogUEVYX1JPT1RfQ09NUExFWF94MTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIFRoZSBTZWxlY3RvciBtYXBwaW5nIGZvciBsYW5lcyA1IGFuZCA2IGNhbiBiZSBlaXRoZXIgWEFVSSBvciBSWEFVSSBtb2RlIHR5cGUKKwlpZiAoKHNlcmRlc051bSA+PSAxICkgJiYgKHNlcmRlc1RvcG9sb2d5W3NlcmRlc051bV0uc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSl7CisKKwkJaWYoc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNUeXBlID09IFBFWDEpCisJCQkvKiBzZXQgcmlnaHQgbW9kZSBmb3IgcHJldmlvdXMgbGFuZSAwIHRvbyAtIHNlZSBjb21tZW50IGFib3ZlICovCisJCQlzZXJkZXNUb3BvbG9neVtzZXJkZXNOdW0tMV0uc2VyZGVzTW9kZSA9IFBFWF9ST09UX0NPTVBMRVhfeDQ7CisJCS8qIHNldCBzZXJkZXMgdHlwZSBmb3IgeDQgbGFuZXMgMSwyLDMgLSBvbmx5IFBFWDAgY2FuIGJlIHNldCBhcyBQRVh4NCAgKi8KKwkJc2VyZGVzVG9wb2xvZ3lbc2VyZGVzTnVtXS5zZXJkZXNUeXBlID0gUEVYMDsKKwl9CisJLyogVGhlIFNlbGVjdG9yIG1hcHBpbmcgZm9yIGxhbmVzIDUgYW5kIDYgY2FuIGJlIGVpdGhlciBYQVVJIG9yIFJYQVVJIG1vZGUgdHlwZQogICAgICAgICAgICBhbmQgaXQgaXMgZGVwZW5kcyBvbiBwcmV2aW91cyBsYW5lcyA0LgogCQkgICBJZiB0aGUgU2VsZWN0b3IgdmFsdWUgZm9yIGxhbmVzIDQgaXMgMHg5LCB0aGVuIHRoZSBTZXJkZXMgdHlwZSBmb3IgbGFuZXMKIAkJICAgNSBhbmQgNiBpcyBYQVVJLCBvdGhlcndpc2UgdGhlIFNlcmRlcyB0eXBlIGZvciBsYW5lcyA1IGFuZCA2IGlzIFJYQVVJICovCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9tc3lzL212SGlnaFNwZWVkRW52U3BlYy5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvbXN5cy9tdkhpZ2hTcGVlZEVudlNwZWMuYwppbmRleCA0MDQwN2U2Li41OGE4NTQ1IDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9tc3lzL212SGlnaFNwZWVkRW52U3BlYy5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L21zeXMvbXZIaWdoU3BlZWRFbnZTcGVjLmMKQEAgLTExMyw2ICsxMTMsOCBAQAogCXsgVVNCX1JFR19VTklULCAgICAweDUwODA0LCAgICAgMHgzLCAgICAgICAgeyAweDIgICAgICAgIH0sIDAsICAgICAgICAwIH0sIC8qIFBoeSBvZmZzZXQgMHgxIC0gUExMX0NPTlRST0wxICAqLwogCXsgVVNCX1JFR19VTklULCAgICAweDUwODBDLCAgICAgMHgzMDAwMDAwLCAgeyAweDIwMDAwMDAgIH0sIDAsICAgICAgICAwIH0sIC8qIFBoeSBvZmZzZXQgMHgzIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgICovCiAJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MDAsICAgICAweDFGRjAwN0YsICB7IDB4NjAwMDA1ICAgfSwgMCwgICAgICAgIDAgfSwgLyogUGh5IG9mZnNldCAweDAgLSBQTExfQ09OVFJPTDAgICovCisJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MEMsICAgICAweDAwMEYwMDAsICB7IDB4MDAwMTAwMCAgfSwgMCwgICAgICAgIDAgfSwgLyogRFJWX0VOX0xTICAweDEgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAgKi8KKwl7IFVTQl9SRUdfVU5JVCwgICAgMHg1MDgxNCwgICAgIDB4MDAwMDAwRiwgIHsgMHgwMDAwMDBEICB9LCAwLCAgICAgICAgMCB9LCAvKiBTUV9USFJFU0ggIDB4RCAtIFRYIENoYW5uZWwgY29udHJvbCAwICAqLwogCXsgVVNCX1JFR19VTklULCAgICAweDUwODBDLCAgICAgMHgzMDAwMDAwLCAgeyAweDMwMDAwMDAgIH0sIDAsICAgICAgICAwIH0sIC8qIFBoeSBvZmZzZXQgMHgzIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgICovCiAJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MDQsICAgICAweDMsICAgICAgICB7IDB4MyAgICAgICAgfSwgMCwgICAgICAgIDAgfSwgLyogUGh5IG9mZnNldCAweDEgLSBQTExfQ09OVFJPTDEgICovCiAJeyBVU0JfUkVHX1VOSVQsICAgIDB4NTA4MDgsICAgICAweDgwODAwMDAwLCB7IDB4ODA4MDAwMDAgfSwgMSwgICAgIDEwMDAgfSwgLyogY2hlY2sgUExMQ0FMX0RPTkUgaXMgc2V0IGFuZCBJTVBDQUxfRE9ORSBpcyBzZXQqLwpAQCAtMjcyLDYgKzI3NCw2NyBAQAogTVZfU1RBVFVTIGJvYXJkVG9wb2xvZ3lMb2FkKFNFUkRFU19NQVAgICpzZXJkZXNNYXBBcnJheSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKiogRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCittdkh3c0luZGlyZWN0UmVnUmVhZAorICoKKyAqIERFU0NSSVBUSU9OOiAgICAgICAgIEluZGlyZWN0IHJlYWRmcm9tIENPTVBIWV9NX1BJUEVfUjJQM18yOEhQTV9SRUdfTUlEQVNfSU5URVJOQUxfUENJRTAwMQorKgkJCXJlZ2lzdGVycyB2aWEgUEVYX1BIWV9JTkRJUkVDVF9BQ0NfUkVHCisqIElOUFVUOiAgIAkJZGV2TnVtICAgIC0gZGV2aWNlIG51bWJlcgorKgkgICAgICAgICAgICAgICAgcmVnQWRkciAgIC0gcmVnaXN0ZXIgYWRkcmVzcworKgkJCWRhdGFWYWx1ZSAtIHBvaW50ZXIgdG8gcmVhZCBkYXRhCisqCisgKiBPVVRQVVQ6ICAgICAgICAgICAgICBOb25lLgorICogUkVUVVJOUzogICAgICAgICAgICAgTVZfT0sgICAgICAgICAgIC0gICBmb3Igc3VjY2VzcworICoJCQlNVl9GQUlMICAgICAgICAgLSAgIGZvciBmYWlsdXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTVZfVTMyIG12SHdzSW5kaXJlY3RSZWdSZWFkCisoCisgICAgTVZfVTMyICAgICAgICAgICAgICBkZXZOdW0sCisgICAgTVZfVTMyICAgICAgICAgICAgICByZWdBZGRyLAorICAgIE1WX1UzMiAgICAgICAgICAgICAgKmRhdGFWYWx1ZQorCispCit7CisJTVZfVTMyIGRhdGE7CisKKwlkYXRhID0gKDEgPDwgUEhZX0FDQ0VTU19NT0RFX09GRlNFVCkgKyAocmVnQWRkciA8PCBQSFlfQUREUkVTU19PRkZTRVQpIDsKKwlNVl9SRUdfV1JJVEUoUEVYX1BIWV9JTkRJUkVDVF9BQ0NfUkVHLGRhdGEpOworCSpkYXRhVmFsdWUgPSBNVl9SRUdfUkVBRCAoUEVYX1BIWV9JTkRJUkVDVF9BQ0NfUkVHKTsKKworCXJldHVybiBNVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorbXZId3NJbmRpcmVjdFJlZ1dyaXRlCisgKgorICogREVTQ1JJUFRJT046CQlJbmRpcmVjdCB3cml0ZSB0byBDT01QSFlfTV9QSVBFX1IyUDNfMjhIUE1fUkVHX01JREFTX0lOVEVSTkFMX1BDSUUwMDEKKyoJCQlyZWdpc3RlcnMgdmlhIFBFWF9QSFlfSU5ESVJFQ1RfQUNDX1JFRworKiBJTlBVVDogICAJCWRldk51bSAgICAtIGRldmljZSBudW1iZXIKKyoJICAgICAgICAgICAgICAgIHJlZ0FkZHIgICAtIHJlZ2lzdGVyIGFkZHJlc3MKKyoJCQlkYXRhVmFsdWUgLSBkYXRhIHRvIHdyaXRlCisqCQkJbWFzawkgIC0gbWFzaworKiBPVVRQVVQ6CQlOb25lLgorKiBSRVRVUk5TOgkJTVZfT0sgICAgICAgICAgIC0gICBmb3Igc3VjY2VzcworKgkJCU1WX0ZBSUwgICAgICAgICAtICAgZm9yIGZhaWx1cmUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01WX1UzMiBtdkh3c0luZGlyZWN0UmVnV3JpdGUKKygKKyAgICBNVl9VMzIgICAgICAgICAgICAgIGRldk51bSwKKyAgICBNVl9VMzIgICAgICAgICAgICAgIHJlZ0FkZHIsCisgICAgTVZfVTMyICAgICAgICAgICAgICBkYXRhVmFsdWUsCisgICAgTVZfVTMyICAgICAgICAgICAgICBtYXNrCisKKykKK3sKKwlNVl9VMzIgcmVhZERhdGEsZGF0YTsKKworCW12SHdzSW5kaXJlY3RSZWdSZWFkIChkZXZOdW0scmVnQWRkciwmcmVhZERhdGEpOworCWRhdGFWYWx1ZSA9ICgocmVhZERhdGEgJiAofm1hc2spKSB8IChkYXRhVmFsdWUgJiBtYXNrKSkgJiAweEZGRkY7CisJZGF0YSA9ICgwIDw8IFBIWV9BQ0NFU1NfTU9ERV9PRkZTRVQpICsgKHJlZ0FkZHIgPDwgUEhZX0FERFJFU1NfT0ZGU0VUKSArICBkYXRhVmFsdWU7CisJTVZfUkVHX1dSSVRFKFBFWF9QSFlfSU5ESVJFQ1RfQUNDX1JFRyxkYXRhKTsKKwlyZXR1cm4gTVZfT0s7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBtdkh3c1NlcmRlc0xhc3RMYW5lR2V0IC0KQEAgLTM3NiwxMCArNDM5LDQ3IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQUMzOiBzZXQgUENJZSBDb21waHkgcmVnaXN0ZXIgb3B0aW1pemF0aW9ucyBhZnRlciBFVFAgKi8KK01WX1ZPSUQgbXZDdHJsUGV4SW1wZWRhbmNlQ2FsaWJyYXRpb24oTVZfVk9JRCkKK3sKKwlNVl9VMzIgdWlSZWcgPSAwOworCisJLyogTUFDIHNvZnQgcmVzZXQgKi8KKwkvKiBSZWcgMHg0MWE2MCwgRGVhc3NlcnQgc29mdF9yZXNldFsyMF0gdG8gMHgwKi8KKwl1aVJlZyA9IE1WX1JFR19SRUFEKFBFWF9EQkdfQ1RSTF9SRUcoMCkpOworCXVpUmVnICY9IH4oMHgxIDw8IDIwKTsKKwlNVl9SRUdfV1JJVEUoUEVYX0RCR19DVFJMX1JFRygwKSwgdWlSZWcpOworCS8qUGlwZSByZXNldCAqLworCW12SHdzSW5kaXJlY3RSZWdXcml0ZSAoMCxHTE9CX0NMS19DVFJMLDB4MSwweDEpOworCisJLypQZXggVHggYW5kIFJYIGltcGVkYW5jZSBhZGp1c3QgYW5kIHJlY2FsaWJyYXRlICovCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLFZUSElNUENBTF9DVFJMX1JFRywoVFhfQU5EX1JYX0lNUEVEQU5DRV9USFJFU0hJT0xEIDw8IElNUEVEQU5DRV9USFJFU0hJT0xEX09GRlNFVCksKDB4RkYgPDxJTVBFREFOQ0VfVEhSRVNISU9MRF9PRkZTRVQpKTsgLyogc2V0IHRocmVzaG9sZCAqLworCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLENBTF9SRUczLCgweDEgPDwgUlhfQ0FMSUJSQVRJT05fT0ZGU0VUKSwoMHgxIDw8UlhfQ0FMSUJSQVRJT05fT0ZGU0VUKSk7ICAvKiBjYWxpYnJhdGUgUnggKi8KKwltdkh3c0luZGlyZWN0UmVnV3JpdGUgKDAsQ0FMX1JFRzMsKDB4MCA8PCBSWF9DQUxJQlJBVElPTl9PRkZTRVQpLCgweDEgPDxSWF9DQUxJQlJBVElPTl9PRkZTRVQpKTsKKwltdk9zRGVsYXkoNSk7CisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLENBTF9SRUczLCgweDEgPDwgVFhfQ0FMSUJSQVRJT05fT0ZGU0VUKSwoMHgxIDw8VFhfQ0FMSUJSQVRJT05fT0ZGU0VUKSk7LyogY2FsaWJyYXRlIFR4ICovCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLENBTF9SRUczLCgweDAgPDwgVFhfQ0FMSUJSQVRJT05fT0ZGU0VUKSwoMHgxIDw8VFhfQ0FMSUJSQVRJT05fT0ZGU0VUKSk7CisKKwkvKlBleCBzbGV3IHJhdGUgY29udHJvbCBkaXNhYmxlICovCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLEcyX1NFVFRJTkdfMCwoMHgwIDw8IFRYX1NMRVdfQ05UUkxfRU5BQkxFX09GRlNFVCksKDB4MSA8PCBUWF9TTEVXX0NOVFJMX0VOQUJMRV9PRkZTRVQpKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogQUMzOiBzZXQgUENJZSBtb2RlIGFzIEVuZCBQb2ludCAqLwogTVZfU1RBVFVTIG12Q3RybFBleEVuZFBvaW50Q29uZmlnKE1WX1ZPSUQpCiB7Ci0JcmV0dXJuIE1WX09LOyAvKm5vIEVQIGNvbmZpZyBmb3IgQUMzKi8KKwlNVl9VMzIgdWlSZWcgPSAwOworCisJLyogUmVnIDB4NDFhMDAsIFNldCBDb25mUm9vdF9Db21wbGV4IHRvIDB4MCB0byBkZWZpbmUgZW5kIHBvaW50IG1vZGUqLworCXVpUmVnID0gTVZfUkVHX1JFQUQoUEVYX0NUUkxfUkVHKDApKTsKKwl1aVJlZyAmPSB+KDB4MSA8PCBDT05GX1JPT1RfQ09NUExFWF9PRkZTRVQpOworCisJTVZfUkVHX1dSSVRFKFBFWF9DVFJMX1JFRygwKSwgdWlSZWcpOworCW12Q3RybFBleEltcGVkYW5jZUNhbGlicmF0aW9uKCk7CisJLyogdW5yZXNldCAtIHNldCBiaXQgMCB0byAwIGluIEdMT0JfQ0xLX0NUUiAqLworCW12SHdzSW5kaXJlY3RSZWdXcml0ZSAoMCxHTE9CX0NMS19DVFJMLDB4MCwweDEpOworCisJcmV0dXJuIE1WX09LOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTM4OCwyMCArNDg4LDMzIEBACiB7CiAJTVZfVTMyIHVpUmVnID0gMDsKIAkvKiBSZWcgMHgxODIwNCwgU2V0IFBDSWUwbkVuWzBdIHRvIDB4MCovCisKIAl1aVJlZyA9IE1WX1JFR19SRUFEKFNPQ19DVFJMX1JFRyk7CiAJdWlSZWcgJj0gfigweDEgPDwgMCk7CiAJdWlSZWcgfD0gKDB4MCA8PCAwKTsKIAlNVl9SRUdfV1JJVEUoU09DX0NUUkxfUkVHLCB1aVJlZyk7CiAKKwkvKiBSZWcgMHg0MWEwMCwgU2V0IENvbmZSb290X0NvbXBsZXggdG8gMHgxIHRvIGRlZmluZSBSb290IENvbXBsZXggbW9kZSovCisJdWlSZWcgPSBNVl9SRUdfUkVBRChQRVhfQ1RSTF9SRUcoMCkpOworCXVpUmVnICY9IH4oMHgxIDw8IENPTkZfUk9PVF9DT01QTEVYX09GRlNFVCk7CisJdWlSZWcgfD0gKDB4MSA8PCBDT05GX1JPT1RfQ09NUExFWF9PRkZTRVQpOworCU1WX1JFR19XUklURShQRVhfQ1RSTF9SRUcoMCksIHVpUmVnKTsKKworCW12Q3RybFBleEltcGVkYW5jZUNhbGlicmF0aW9uKCk7CisKIAkvKiBSZWcgMHg0MDA2MCwgU2V0IERldlR5cGVbMjM6MjBdIHRvIDB4NChSb290IENvbXBsZXgpKi8KIAl1aVJlZyA9IE1WX1JFR19SRUFEKFBFWF9DQVBBQklMSVRJRVNfUkVHKDApKTsKIAl1aVJlZyAmPSB+KDB4RiA8PCAyMCk7CiAJdWlSZWcgfD0gKDB4NCA8PCAyMCk7CiAJTVZfUkVHX1dSSVRFKFBFWF9DQVBBQklMSVRJRVNfUkVHKDApLCB1aVJlZyk7CiAKKwkvKiB1bnJlc2V0IC0gc2V0IGJpdCAwIHRvIDAgaW4gR0xPQl9DTEtfQ1RSICovCisJbXZId3NJbmRpcmVjdFJlZ1dyaXRlICgwLEdMT0JfQ0xLX0NUUkwsMHgwLDB4MSk7CisKIAkvKiBSZWcgMHg0MWE2MCwgQXNzZXJ0IHNvZnRfcmVzZXRbMjBdIHRvIDB4MSwKLQkJCQkJU2V0IERpc0xpbmtSZXN0YXJ0UmVnUnN0WzE5XSB0byAweDEsCi0JCQkJCVNldCBDb25mTXNrTG5rUmVzdGFydFsxNl0gdG8gMHgxKi8KKwkgICBTZXQgRGlzTGlua1Jlc3RhcnRSZWdSc3RbMTldIHRvIDB4MSwKKwkgICBTZXQgQ29uZk1za0xua1Jlc3RhcnRbMTZdIHRvIDB4MSovCisKIAl1aVJlZyA9IE1WX1JFR19SRUFEKFBFWF9EQkdfQ1RSTF9SRUcoMCkpOwogCXVpUmVnICY9IDB4RkZFNkZGRkY7CiAJdWlSZWcgfD0gMTkwMDAwOwpAQCAtNDA5LDggKzUyMiw4IEBACiAKIAkvKiBSZWcgMHg0MWEwMCwgU2V0IENvbmZSb290X0NvbXBsZXggdG8gMHgxKi8KIAl1aVJlZyA9IE1WX1JFR19SRUFEKFBFWF9DVFJMX1JFRygwKSk7Ci0JdWlSZWcgJj0gfigweDEgPDwgMSk7Ci0JdWlSZWcgfD0gKDB4MSA8PCAxKTsKKwl1aVJlZyAmPSB+KDB4MSA8PCBDT05GX1JPT1RfQ09NUExFWF9PRkZTRVQpOworCXVpUmVnIHw9ICgweDEgPDwgQ09ORl9ST09UX0NPTVBMRVhfT0ZGU0VUKTsKIAlNVl9SRUdfV1JJVEUoUEVYX0NUUkxfUkVHKDApLCB1aVJlZyk7CiAKIAkvKiBSZWcgMHg0MWE2MCwgRGVhc3NlcnQgc29mdF9yZXNldFsyMF0gdG8gMHgwKi8KQEAgLTc2OCw2ICs4ODEsMTUgQEAKIHsKIAlNVl9UV1NJX1NMQVZFCXR3c2lTbGF2ZTsKIAorCS8qIFBvbGFyaXR5IGlzIHJlbGV2YW50IG9ubHkgZm9yIERCIGJvYXJkOgorCSAqIFBDSWUgUG9sYXJpdHkgaW52ZXJzaW9uIGlzIHJlbGV2YW50IG9ubHkgZm9yIFBDSWUgc2xvdHMuCisJICogb25seSBBQzMgREIgYm9hcmQgdXNlIFBDSWUgd2l0aCBzbG90LAorCSAqIG90aGVyIGJvYXJkcyB1c2UgUENJZSB0byBjb25uZWN0IGR1YWwgTVNZUyBjcHVzKi8KKyNpZiBkZWZpbmVkIENPTkZJR19BTExFWUNBVDMKKwlpZiAobXZCb2FyZElkR2V0KCkgIT0gREJfQUMzX0lEKQorCQlyZXR1cm4gTVZfT0s7CisjZW5kaWYKKwogCS8qIEluaXRpYWxpemluZyB0d3NpU2xhdmUgaW4gb3JkZXIgdG8gcmVhZCBmcm9tIHRoZSBUV1NJIGFkZHJlc3MgKi8KIAl0d3NpU2xhdmUuc2xhdmVBZGRyLmFkZHJlc3MgPSAweDE4OwkvKiBBZGRyZXNzIG9mIEFDMyBDUExEICovCiAJdHdzaVNsYXZlLnNsYXZlQWRkci50eXBlID0gQUREUjdfQklUOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvbXN5cy9tdkhpZ2hTcGVlZEVudlNwZWMuaCBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcGh5L21zeXMvbXZIaWdoU3BlZWRFbnZTcGVjLmgKaW5kZXggNDZjM2EyMS4uYTdmMTJjMCAxMDA3NTUKLS0tIGEvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19waHkvbXN5cy9tdkhpZ2hTcGVlZEVudlNwZWMuaAorKysgYi90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BoeS9tc3lzL212SGlnaFNwZWVkRW52U3BlYy5oCkBAIC03OCw5ICs3OCwyOCBAQAogI2RlZmluZSBMQVNUX0xBTkVfTlVNCQkJMjEKICNlbmRpZgogCi0jZGVmaW5lIE1WX1NFUkRFU18yOE5NX1JFVl8xCTB4MAotI2RlZmluZSBNVl9TRVJERVNfMjhOTV9SRVZfMwkweDEKKyNkZWZpbmUgTVZfU0VSREVTXzI4Tk1fUkVWXzEJCQkJMHgwCisjZGVmaW5lIE1WX1NFUkRFU18yOE5NX1JFVl8zCQkJCTB4MQogCisKKyNkZWZpbmUgQ09ORl9ST09UX0NPTVBMRVhfT0ZGU0VUCQkJMQorI2RlZmluZSBQRVhfUEhZX0lORElSRUNUX0FDQ19SRUcJCQkweDQxYjAwCisjZGVmaW5lIFBIWV9BQ0NFU1NfTU9ERV9PRkZTRVQJCQkJMzEKKyNkZWZpbmUgUEhZX0FERFJFU1NfT0ZGU0VUCQkJCTE2CisvKiBDT01QSFlfTV9QSVBFX1IyUDNfMjhIUE1fUkVHX01JREFTX0lOVEVSTkFMX1BDSUUwMDEgcmVnaXN0ZXJzIC0KKyAgd2l0aCBpbmRpcmVjdCBhY2Nlc3MgdmlhIFBFWF9QSFlfSU5ESVJFQ1RfQUNDX1JFRyAqLworI2RlZmluZSBHMl9TRVRUSU5HXzAJCQkJCTB4MDBGCisjZGVmaW5lIFBIWVRTVF9SRUcwCQkJCQkweDAxNQorI2RlZmluZSBWVEhJTVBDQUxfQ1RSTF9SRUcJCQkJMHgwNDEKKyNkZWZpbmUgQ0FMX1JFRzMJCQkJCTB4MDU3CisjZGVmaW5lIEdMT0JfQ0xLX0NUUkwJCQkJCTB4MUMxCisKKyNkZWZpbmUgVFhfQU5EX1JYX0lNUEVEQU5DRV9USFJFU0hJT0xECQkJMHgxMQorCisjZGVmaW5lIElNUEVEQU5DRV9USFJFU0hJT0xEX09GRlNFVAkJCTgKKyNkZWZpbmUgUlhfQ0FMSUJSQVRJT05fT0ZGU0VUCQkJCTcKKyNkZWZpbmUgVFhfQ0FMSUJSQVRJT05fT0ZGU0VUCQkJCTE0CisjZGVmaW5lIFRYX1NMRVdfQ05UUkxfRU5BQkxFX09GRlNFVAkJCTE1CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVudW0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB0eXBlZGVmIGVudW0gewogCVBFWDAsCmRpZmYgLS1naXQgYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BtL2EzOHgvc3VzcGVuZFdha2V1cC5jIGIvdG9vbHMvbWFydmVsbC9iaW5faGRyL3NyY19wbS9hMzh4L3N1c3BlbmRXYWtldXAuYwppbmRleCAzZWJlZWI2Li5lMWM1YTBkIDEwMDc1NQotLS0gYS90b29scy9tYXJ2ZWxsL2Jpbl9oZHIvc3JjX3BtL2EzOHgvc3VzcGVuZFdha2V1cC5jCisrKyBiL3Rvb2xzL21hcnZlbGwvYmluX2hkci9zcmNfcG0vYTM4eC9zdXNwZW5kV2FrZXVwLmMKQEAgLTgyLDkgKzgyLDYgQEAKICogTm90ZXM6CiAqIFJldHVybnM6CU5vbmUuCiAqLwotI2RlZmluZSBCT09UX0lORk9fQUREUgkJCQkoMHgzMDAwKQotI2RlZmluZSBTVVNQRU5EX01BR0lDX1dPUkQJCQkoMHhERUFEQjAwMikKLSNkZWZpbmUgUkVHSVNURVJfTElTVF9FTkQJCQkoMHhGRkZGRkZGRikKIE1WX1NUQVRVUyBzdXNwZW5kV2FrZXVwKHZvaWQpCiB7CiAJaW50ICpib290X2luZm8gPSAoaW50KikoQk9PVF9JTkZPX0FERFIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9kb2ltYWdlX212L2RvaW1hZ2UuYyBiL3Rvb2xzL21hcnZlbGwvZG9pbWFnZV9tdi9kb2ltYWdlLmMKaW5kZXggOTk4NjFhOS4uZTM3NjgwNyAxMDA2NDQKLS0tIGEvdG9vbHMvbWFydmVsbC9kb2ltYWdlX212L2RvaW1hZ2UuYworKysgYi90b29scy9tYXJ2ZWxsL2RvaW1hZ2VfbXYvZG9pbWFnZS5jCkBAIC0xNDgxLDcgKzE0ODEsNyBAQAogCWludAkJCWk7CiAJaW50IAkJb3ZlcnJpZGVbMl07CiAJY2hhciAJCSpidWZfaW4gPSBOVUxMOwotCWludCAJCWVyciA9IDE7CisJaW50IAkJZXJyID0gMDsKIAogCS8qIGNoZWNrIGlmIHRoZSBvdXRwdXQgaW1hZ2UgZXhpc3QgKi8KIAlwcmludGYoIiAiKTsKQEAgLTE2NDEsMTAgKzE2NDEsOCBAQAogCQkJZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nICVzIGZpbGUgXG4iLCBvcHQtPmZuYW1lLm91dCk7CiAJCQlnb3RvIGVuZDsKIAkJfQotCi0JCWZwcmludGYoc3Rkb3V0LCAiPT09PT4+Pj4gJXMgd2FzIGNyZWF0ZWRcbiIsIG9wdC0+Zm5hbWVfYXJyW0lNR19GSUxFX0lORFhdKTsKLQogCX0gLyogaWYgKG9wdC0+aGVhZGVyX21vZGUgIT0gSERSX09OTFkpICovCisJZnByaW50ZihzdGRvdXQsICI9PT09Pj4+PiAlcyB3YXMgY3JlYXRlZFxuIiwgb3B0LT5mbmFtZV9hcnJbSU1HX0ZJTEVfSU5EWF0pOwogCiBlbmQ6CiAJLyogY2xvc2UgaGFuZGxlcyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbWFydmVsbC9kb2ltYWdlX212L2hkcnBhcnNlci5jIGIvdG9vbHMvbWFydmVsbC9kb2ltYWdlX212L2hkcnBhcnNlci5jCmluZGV4IGI3YzIzMGYuLjViMzg1MzkgMTAwNzU1Ci0tLSBhL3Rvb2xzL21hcnZlbGwvZG9pbWFnZV9tdi9oZHJwYXJzZXIuYworKysgYi90b29scy9tYXJ2ZWxsL2RvaW1hZ2VfbXYvaGRycGFyc2VyLmMKQEAgLTc5LDcgKzc5LDcgQEAKICNpbmNsdWRlICJwb2xhcnNzbC9yc2EuaCIKIC8vI2luY2x1ZGUgInBvbGFyc3NsL2Flcy5oIgogCi0jZGVmaW5lIFZFUlNJT05fTlVNQkVSCSIyLjAiCisjZGVmaW5lIFZFUlNJT05fTlVNQkVSCSIyLjAxIgogCiAvKiBTZWN1cml0eSBjb250ZXh0ICovCiB0eXBlZGVmIHN0cnVjdCBzZWNDdHhfdCB7CkBAIC00ODEsNyArNDgxLDcgQEAKIAlzZWNDdHgucnNhLmxlbiA9IChtcGlfbXNiKCZzZWNDdHgucnNhLk4pICsgNykgPj4gMzsgLyoga2V5IGxlbmd0aCBpbiBieXRlcyAqLwogCiAJLyogS2V5IGxlbmd0aCBzaG91bGQgaW5jbHVkZSA0IGJ5dGVzIG9mIHRoZSBkYXRhIGJsb2NrIGhlYWRlciAqLwotCXJzYUtleUxlbiA9ICgoKHBTZWNIZHItPmNza0FycmF5W2Nza19pZHhdKS5LZXkpW2Nza19pZHhdIDw8IDgpICsgKChwU2VjSGRyLT5jc2tBcnJheVtjc2tfaWR4XSkuS2V5KVszXSArIDQ7CisJcnNhS2V5TGVuID0gKCgocFNlY0hkci0+Y3NrQXJyYXlbY3NrX2lkeF0pLktleSlbMl0gPDwgOCkgKyAoKHBTZWNIZHItPmNza0FycmF5W2Nza19pZHhdKS5LZXkpWzNdICsgNDsKIAlzaGEyKCh1bnNpZ25lZCBjaGFyICopKChwU2VjSGRyLT5jc2tBcnJheVtjc2tfaWR4XSkuS2V5KSwgcnNhS2V5TGVuLCBidWYzMiwgMCk7CiAJZnByaW50ZihzdGRvdXQsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlmcHJpbnRmKHN0ZG91dCwiUlNBIGtleSBTSEEyNTYgZGlnZXN0IGZvciBlRnVzZSAoQ1NLLSVkKTpcbiAgQkUgRlVMTDogIiwgY3NrX2lkeCk7Cg==