ZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL0lDX21ldGEvbXRrLzI3MzUvbGlibHlucS1zaW0vbGlibHlucS1zaW0uYmIgYi9MWU5RX1BVQkxJQy9JQ19tZXRhL210ay8yNzM1L2xpYmx5bnEtc2ltL2xpYmx5bnEtc2ltLmJiCmluZGV4IGZhZDIxYWUuLjAwNzdiZmEgMTAwNzU1Ci0tLSBhL0xZTlFfUFVCTElDL0lDX21ldGEvbXRrLzI3MzUvbGlibHlucS1zaW0vbGlibHlucS1zaW0uYmIKKysrIGIvTFlOUV9QVUJMSUMvSUNfbWV0YS9tdGsvMjczNS9saWJseW5xLXNpbS9saWJseW5xLXNpbS5iYgpAQCAtMSw5ICsxLDkgQEAKIGluaGVyaXQgZXh0ZXJuYWxzcmMgcGFja2FnZQogCi1ERVNDUklQVElPTiA9ICJsaWJseW5xLXVjaS5zbyBkZW1vIgorREVTQ1JJUFRJT04gPSAibGlibHlucS1zaW0uc28iCiBMSUNFTlNFID0gIkNMT1NFRCIKIExJQ19GSUxFU19DSEtTVU0gPSAiZmlsZTovL0xJQ0VOU0U7bWQ1PWUxNjk2YjE0N2Q0OWQ0OTFiY2I0ZGExYTU3MTczZmZmIgotREVQRU5EUyArPSAicGxhdGZvcm0tbGlicyBwbGF0Zm9ybS1saWJzLWNvbW1vbiBsaWJwYWwgbGlibHlucS1sb2cgbGlidmVuZG9yLXJpbCIKK0RFUEVORFMgKz0gInBsYXRmb3JtLWxpYnMgcGxhdGZvcm0tbGlicy1jb21tb24gbGlicGFsIGxpYmx5bnEtbG9nIGxpYnZlbmRvci1yaWwgbHlucS1yaWwtc2VydmljZSIKIGluaGVyaXQgd29ya29uc3JjCiBXT1JLT05TUkMgPSAiJHtUT1BESVJ9Ly4uL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltLyIKIApkaWZmIC0tZ2l0IGEvTFlOUV9QVUJMSUMvSUNfbWV0YS9tdGsvMjczNS9seW5xLXJpbC1zZXJ2aWNlL2x5bnEtcmlsLXNlcnZpY2UuYmIgYi9MWU5RX1BVQkxJQy9JQ19tZXRhL210ay8yNzM1L2x5bnEtcmlsLXNlcnZpY2UvbHlucS1yaWwtc2VydmljZS5iYgppbmRleCBmYWZjMTUzLi5mNGQwMTMzIDEwMDc1NQotLS0gYS9MWU5RX1BVQkxJQy9JQ19tZXRhL210ay8yNzM1L2x5bnEtcmlsLXNlcnZpY2UvbHlucS1yaWwtc2VydmljZS5iYgorKysgYi9MWU5RX1BVQkxJQy9JQ19tZXRhL210ay8yNzM1L2x5bnEtcmlsLXNlcnZpY2UvbHlucS1yaWwtc2VydmljZS5iYgpAQCAtNDQsNyArNDQsOCBAQAogCQlpbnN0YWxsIC1kICR7RH0ke3N5c3RlbWRfdW5pdGRpcn0vc3lzdGVtLwogCQlpbnN0YWxsIC1tIDA2NDQgJHtCfS9seW5xX3JpbF9zZXJ2aWNlLnNlcnZpY2UgJHtEfSR7c3lzdGVtZF91bml0ZGlyfS9zeXN0ZW0KIAlmaQotIwlpbnN0YWxsIC1kICR7RH0ke2luY2x1ZGVkaXJ9CisJaW5zdGFsbCAtZCAke0R9JHtpbmNsdWRlZGlyfS9seW5xLXJpbAorCWluc3RhbGwgJHtTfS9seW5xX2ludGVyZmFjZS5oICR7RH0ke2luY2x1ZGVkaXJ9L2x5bnEtcmlsCiAjCWluc3RhbGwgJHtTfS9hdGNpL0FUQ0kuaCAke0R9JHtpbmNsdWRlZGlyfQogIwljcCAtUiAke1N9L2RlbW9zY3JpcHQgJHtEfSR7YmluZGlyfS8KIAlpZiB0ZXN0ICIke1RBUkdFVF9QTEFURk9STX0iID0gIm10MjczMSI7IHRoZW4KZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL0lDX3NyYy9tdGsvdGVsZXBob255d2FyZS8zLjAvYXRjaWQvYXRjaS9zcmMvcGxhdGZvcm0vYXRjaWRfbWlwYy5jIGIvTFlOUV9QVUJMSUMvSUNfc3JjL210ay90ZWxlcGhvbnl3YXJlLzMuMC9hdGNpZC9hdGNpL3NyYy9wbGF0Zm9ybS9hdGNpZF9taXBjLmMKaW5kZXggMjRkYjk4Yy4uOWRlNmU1MCAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvSUNfc3JjL210ay90ZWxlcGhvbnl3YXJlLzMuMC9hdGNpZC9hdGNpL3NyYy9wbGF0Zm9ybS9hdGNpZF9taXBjLmMKKysrIGIvTFlOUV9QVUJMSUMvSUNfc3JjL210ay90ZWxlcGhvbnl3YXJlLzMuMC9hdGNpZC9hdGNpL3NyYy9wbGF0Zm9ybS9hdGNpZF9taXBjLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgIGNoYXIgKmF0Y2ljbWRfcmVxX3B0ciwgKmF0Y21kX3Jlc19wdHIsICphdGNpX3JlczsKICAgICB1aW50MTZfdCBhdGNtZF9yZXFfbGVuLCBhdGNtZF9yZXNfbGVuOwogCi0gICAgY2hhciBzaW1JRFByb3BlcnR5W01US19QUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIgc2ltSURQcm9wZXJ0eVtNVEtfUFJPUEVSVFlfVkFMVUVfTUFYXSA9IHswfTsKICAgICBpbnQgc2ltSUQgPSAwOwogCiAgICAgaW50IGNoYXJfc3ViID0gMHgxYTsKZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2NvbW1hbmRzLmggYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9jb21tYW5kcy5oCmluZGV4IDExNWUxNmQuLjQ0Y2Y1Y2UgMTAwNzU1Ci0tLSBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2NvbW1hbmRzLmgKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvY29tbWFuZHMuaApAQCAtMjUxLDE0ICsyNTEsMTQgQEAKICAKICNpZmRlZiBNT0RFX0RTRFMKICAgICB7IlNFVF9ERUZBVUxUX1NJTV9BTEwiLHNldF9kZWZhdWx0X3NpbV9hbGwsICJzZXQgZGVmYXVsdCBzaW1fYWxsIiwgLTF9LAotICAgIHsiR0VUX0RFRkFVTFRfU0lNX0FMTCIsZ2V0X2RlZmF1bHRfc2ltX2FsbCwgImdldCBkZWZhdWx0IHNpbV9hbGwiLCAtMX0sCisgICAgeyJHRVRfREVGQVVMVF9TSU1fQUxMIixnZXRfZGVmYXVsdF9zaW1fYWxsLCAiZ2V0IGRlZmF1bHQgc2ltX2FsbCIsIExZTlFfUkVRVUVTVF9HRVRfREVGQVVMVF9TSU1fQUxMfSwKICAgICB7IlNFVF9ERUZBVUxUX1NJTV9WT0lDRSIsc2V0X2RlZmF1bHRfc2ltX3ZvaWNlLCAic2V0IGRlZmF1bHQgc2ltX3ZvaWNlIiwgLTF9LAogICAgIHsiR0VUX0RFRkFVTFRfU0lNX1ZPSUNFIixnZXRfZGVmYXVsdF9zaW1fdm9pY2UsICJnZXQgZGVmYXVsdCBzaW1fdm9pY2UiLCAtMX0sCiAgICAgeyJTRVRfREVGQVVMVF9TSU1fREFUQSIsc2V0X2RlZmF1bHRfc2ltX2RhdGEsICJzZXQgZGVmYXVsdCBzaW1fZGF0YSIsIC0xfSwKICAgICB7IkdFVF9ERUZBVUxUX1NJTV9EQVRBIixnZXRfZGVmYXVsdF9zaW1fZGF0YSwgImdldCBkZWZhdWx0IHNpbV9kYXRhIiwgLTF9LAogICAgIHsiU0VUX0RFRkFVTFRfU0lNX1NNUyIsc2V0X2RlZmF1bHRfc2ltX3NtcywgInNldCBkZWZhdWx0IHNpbV9zbXMiLCAtMX0sCiAgICAgeyJHRVRfREVGQVVMVF9TSU1fU01TIixnZXRfZGVmYXVsdF9zaW1fc21zLCAiZ2V0IGRlZmF1bHQgc2ltX3NtcyIsIC0xfSwKLSAgICB7IlNFVF9ERUZBVUxUX1NJTV9BTExfRVhDRVBUX0RBVEEiLHNldF9kZWZhdWx0X3NpbV9hbGxfZXhjZXB0X2RhdGEsICJzZXQgZGVmYXVsdCBzaW1fYWxsIiwgLTF9LAorICAgIHsiU0VUX0RFRkFVTFRfU0lNX0FMTF9FWENFUFRfREFUQSIsc2V0X2RlZmF1bHRfc2ltX2FsbF9leGNlcHRfZGF0YSwgInNldCBkZWZhdWx0IHNpbV9hbGwiLCBMWU5RX1JFUVVFU1RfU0VUX0RFRkFVTFRfU0lNX0FMTF9FWENFUFRfREFUQX0sCiAgICAgeyJHRVRfREVGQVVMVF9TSU1fQUxMX0VYQ0VQVF9EQVRBIixnZXRfZGVmYXVsdF9zaW1fYWxsX2V4Y2VwdF9kYXRhLCAiZ2V0IGRlZmF1bHQgc2ltX2FsbCIsIC0xfSwKICNlbmRpZiAvKk1PREVfRFNTUyovCiAgICAgeyJHRVRfTUFJTl9TSU1fQ0FSRCIsZ2V0X21haW5fc2ltX2NhcmQsICJnZXQgbWFpbiBzaW0gY2FyZCIsIC0xfSwKZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2NvbW1vbi5jcHAgYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9jb21tb24uY3BwCmluZGV4IGI4N2IwNTEuLmE3NzUwNWEgMTAwNzU1Ci0tLSBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2NvbW1vbi5jcHAKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvY29tbW9uLmNwcApAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgImNjLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9seW5xX3N5c3RpbWUuaCIKICNpbmNsdWRlIDxpbmNsdWRlL2x5bnFfdWNpLmg+CisjaW5jbHVkZSAibHlucV9pbnRlcmZhY2UuaCIKICNpZmRlZiBMRURfU1VQUE9SVAogI2luY2x1ZGUgImxlZC5oIgogI2VuZGlmCkBAIC00MjIsNiArNDIzLDE5IEBACiAgICAgICAgICAgICBSYWRpb19jYXBhYmlsaXR5X3N3aXRjaF91dGlsOjpzZW5kUmFkaW9DYXBhYmlsaXR5UmVxdWVzdChzbG90KTsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyNpZmRlZiBMWU5RX0RTRFNfTU9ERQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFJMT0dEKCJbJXNdWyVkXUFscmVhZHkgaW4gcmVxdWlyZWQgc2ltJWQiLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyxzbG90KTsKKyAgICAgICAgdXNsZWVwKDUwMCoxMDAwKTsKKyAgICAgICAgYW5kcm9pZDo6UGFyY2VsIGFsbG93X2RhdGFfcDsKKyAgICAgICAgYWxsb3dfZGF0YV9wLndyaXRlSW50MzIgKDEpOworICAgICAgICBhbGxvd19kYXRhX3Aud3JpdGVJbnQzMiAoTFlOUV9VUkNfQUxMT1dfREFUQSk7CisgICAgICAgIGFsbG93X2RhdGFfcC53cml0ZUludDMyIChzbG90KTsKKyAgICAgICAgYWxsb3dfZGF0YV9wLndyaXRlSW50MzIgKDApOworICAgICAgICBhbmRyb2lkOjpMWU5RX1JJTF91cmNCcm9hZGNhc3QoYWxsb3dfZGF0YV9wLExZTlFfVVJDX0FMTE9XX0RBVEEpOworICAgIH0KKyAgICAvLyNlbmRpZgogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzX0RhdGFNdXRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2NvbW1vbi5oIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvY29tbW9uLmgKaW5kZXggYTdmMmE2Yi4uMzg3MmI5MSAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvY29tbW9uLmgKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvY29tbW9uLmgKQEAgLTU0LDggKzU0LDggQEAKIAogCiAjZGVmaW5lIERFQlVHIDAKLSNkZWZpbmUgRlVOQ1RJT05fQ0FMTEVEKHRpbWUsbXNnKSBwcmludGYoIiVzOiAlcyAlcyBjYWxsZWRcbiIsKHRpbWUpLCBfX2Z1bmNfXyAsKG1zZykpOwotI2RlZmluZSBGVU5DVElPTl9SRVRVUk4odGltZSxtc2cpIHByaW50ZigiJXM6ICVzICVzIHJldHVybnNcbiIsKHRpbWUpLCBfX2Z1bmNfXyAsKG1zZykpOworI2RlZmluZSBGVU5DVElPTl9DQUxMRUQodGltZSxtc2cpIFJMT0dEKCIlczogJXMgJXMgY2FsbGVkXG4iLCh0aW1lKSwgX19mdW5jX18gLChtc2cpKTsKKyNkZWZpbmUgRlVOQ1RJT05fUkVUVVJOKHRpbWUsbXNnKSBSTE9HRCgiJXM6ICVzICVzIHJldHVybnNcbiIsKHRpbWUpLCBfX2Z1bmNfXyAsKG1zZykpOwogCiAjZGVmaW5lIEVNX01PREVfU1VQUE9SVCAxCiAjaWZkZWYgQVRDSV9QQVJTRQpAQCAtOTEsMjUgKzkxLDYgQEAKICoqVGhlIHJhbmdlIG9mIGVycm9yIHZhbHVlcyB1bmlxdWUgdG8gTFlOUSBpcyA4MDAwIHRvIDEwMDAwLgogKipUaGUgc2ltIGNhcmQgc3RhdGUgaXMgZXJyb3IuCiAqLwotdHlwZWRlZiBlbnVtewotICAgIExZTlFfRV9DQVJEU1RBVEVfRVJST1I9ODAwMCwKLSAgICAvKiBUaGUgdm9pY2Ugc2VydmljZSBzdGF0ZSBpcyBvdXQgb2Ygc2VydmljZSovCi0gICAgTFlOUV9FX1NUQVRFX09VVF9PRl9TRVJWSUNFPTgwMDEsCi0gICAgLyogVGhlIHZvaWNlIHNlcnZpY2Ugc3RhdGUgaXMgRU1FUkdFTkNZX09OTFkqLwotICAgIExZTlFfRV9TVEFURV9FTUVSR0VOQ1lfT05MWT04MDAyLAotICAgIC8qIFRoZSByYWRpbyBwb3dlciBpcyBwb3dlciBvZmYqLwotICAgIExZTlFfRV9TVEFURV9QT1dFUl9PRkY9ODAwMywKLSAgICBMWU5RX0VfVElNRV9PVVQ9ODAwNCwKLSAgICAvKmNyZWF0ZSBvciBvcGVuIHNtcyBEQiBmYWlsICovCi0gICAgTFlOUV9FX1NNU19EQl9GQUlMPTgwMDUsCi0gICAgLypGYWlsZWQgdG8gZXhlY3V0ZSBzcWwgc3RhdGVtZW50Ki8KLSAgICBMWU5RX0VfU01TX1NRTF9GQUlMID0gODAwNiwKLSAgICBMWU5RX0VfU01TX05PVF9GSU5EID0gODAwNywKLSAgICAvKiBUaGUgbG9naWMgY29uZmxpY3QqLwotICAgIExZTlFfRV9DT05GTElDVD05MDAwLAotICAgIC8qTnVsbCBhbm9tYWx5Ki8KLSAgICBMWU5RX0VfTlVMTF9BTk9OQUxZPTkwMDEKLX1MWU5RX0U7CiAvKldhcnJlbiBhZGQgZm9yIHQ4MDAgUklMIFNlcnZpY2UgMjAyMS8xMi8xMCBzdGFydCovCiAKIHR5cGVkZWYgc3RydWN0ewpAQCAtMjczLDYgKzI1NCw3IEBACiAgICAgdm9pZCByZWdpc3RlckZvck5ldHdvcmtJbmZvKG5ldHdva0luZm9Ob3RpZnkgY2IpOwogICAgIHZvaWQgdW5yZWdpc3RlckFUY21kKCk7CiAgICAgaW50IGVtUmVzdWx0Tm90aWZ5KGNvbnN0IGNoYXIgKnN0cik7CisgICAgaW50IGx5bnFfZW1SZXN1bHROb3RpZnkoUGFyY2VsICZwKTsKICAgICB2b2lkIEFUQ0lSZXF1ZXN0KGludCByZXF1ZXN0LCBjaGFyKiByZXFTdHJpbmcsIHZvaWQqIHQsaW50IGFyZ2MsIGNoYXIqKmFyZ3YpOwogICAgIHZvaWQgc3RhcnRXYWt1cExvb3Aodm9pZCk7CiAgICAgLypXYXJyZW4gYWRkIGZvciBGQVcgcGxhdGZvcm0gMjAyMS85LzI3IHN0YXJ0Ki8KZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2x5bnFfaW50ZXJmYWNlLmggYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9seW5xX2ludGVyZmFjZS5oCmluZGV4IDQwMWI5YmQuLmY4Y2RmNDcgMTAwNzU1Ci0tLSBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL2x5bnFfaW50ZXJmYWNlLmgKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvbHlucV9pbnRlcmZhY2UuaApAQCAtMTMsNiArMTMsNyBAQAogI2RlZmluZSBMWU5RX1VSQ19NT0RJRllfQVBOREIgKExZTlFfVVJDX1ZFTkRPUl9CQVNFKzQpCiAjZGVmaW5lIExZTlFfVVJDX1JFU0VUX0FQTkRCIChMWU5RX1VSQ19WRU5ET1JfQkFTRSs1KQogCisjZGVmaW5lIExZTlFfVVJDX0FMTE9XX0RBVEEgKExZTlFfVVJDX1ZFTkRPUl9CQVNFICsgMTApCiAKICNkZWZpbmUgTFlOUV9SRVFVRVNUX1dSSVRFX1NNU19UT19NRU1PUlkgKExZTlFfUkVRVUVTVF9WRU5ET1JfQkFTRSArNCkKICNkZWZpbmUgTFlOUV9SRVFVRVNUX1JFQURfU01TX0ZST01fTUVNT1JZIChMWU5RX1JFUVVFU1RfVkVORE9SX0JBU0UgKyA1KQpAQCAtMzksNiArNDAsOCBAQAogI2RlZmluZSBMWU5RX1JFUVVFU1RfR0VUX1JUUF9QQVJBTSAoTFlOUV9SRVFVRVNUX1ZFTkRPUl9CQVNFICsgMjUpCiAjZGVmaW5lIExZTlFfUkVRVUVTVF9TRVRfQ0FMTF9SVFBfU1NSQyAoTFlOUV9SRVFVRVNUX1ZFTkRPUl9CQVNFICsgMjYpCiAjZGVmaW5lIExZTlFfUkVRVUVTVF9HRVRfQ0FMTF9SVFBfU1NSQyAoTFlOUV9SRVFVRVNUX1ZFTkRPUl9CQVNFICsgMjcpCisjZGVmaW5lIExZTlFfUkVRVUVTVF9HRVRfREVGQVVMVF9TSU1fQUxMIChMWU5RX1JFUVVFU1RfVkVORE9SX0JBU0UgKyAyOCkKKyNkZWZpbmUgTFlOUV9SRVFVRVNUX1NFVF9ERUZBVUxUX1NJTV9BTExfRVhDRVBUX0RBVEEgKExZTlFfUkVRVUVTVF9WRU5ET1JfQkFTRSArIDI5KQogCiAjaWZkZWYgRUNBTExfU1VQUE9SVAogI2RlZmluZSBSSUxfVU5TT0xfRUNBTExfVDJfVElNRVJfT1VUICA5MDAwCkBAIC00OSw2ICs1Miw0NCBAQAogI2RlZmluZSBSSUxfVU5TT0xfRUNBTExfQVVUT19BTlNfVElNRVJfT1VUIDkwMDUKICNkZWZpbmUgUklMX1VOU09MX0VDQUxMX0FVVE9fQU5TX0lNU19USU1FUl9PVVQgOTAwNgogI2VuZGlmCisvL1dhcnJlbiBhZGQgZm9yIHBsYW50Zm9ybSAyMDI0XzA0XzExIHN0YXJ0CisvKiAKKyoqVGhlIHJhbmdlIG9mIGVycm9yIHZhbHVlcyB1bmlxdWUgdG8gTFlOUSBpcyA3MDAwIHRvIDEwMDAwLgorKipUaGUgc2ltIGNhcmQgc3RhdGUgaXMgZXJyb3IuCisqLwordHlwZWRlZiBlbnVteworICAgIC8qYmFzZSBhYm5vcm1hbCovCisgICAgTFlOUV9FX1BBUkFNRVRFUl9BTk9OQUxZPTcwMDAsCisgICAgTFlOUV9FX1NFTkRfUkVRVUVTVF9GQUlMPTcwMDEsCisgICAgTFlOUV9FX0dFVF9IRUFEX0VSUk9SPTcwMDIsCisgICAgTFlOUV9FX0lOTkVSX0VSUk9SPTcxMDAsCisgICAgTFlOUV9FX01BTExPQ19FUlJPUj03MTAxLAorICAgIC8qKi8KKyAgICBMWU5RX0VfQ0FSRFNUQVRFX0VSUk9SPTgwMDAsCisgICAgLyogVGhlIHZvaWNlIHNlcnZpY2Ugc3RhdGUgaXMgb3V0IG9mIHNlcnZpY2UqLworICAgIExZTlFfRV9TVEFURV9PVVRfT0ZfU0VSVklDRT04MDAxLAorICAgIC8qIFRoZSB2b2ljZSBzZXJ2aWNlIHN0YXRlIGlzIEVNRVJHRU5DWV9PTkxZKi8KKyAgICBMWU5RX0VfU1RBVEVfRU1FUkdFTkNZX09OTFk9ODAwMiwKKyAgICAvKiBUaGUgcmFkaW8gcG93ZXIgaXMgcG93ZXIgb2ZmKi8KKyAgICBMWU5RX0VfU1RBVEVfUE9XRVJfT0ZGPTgwMDMsCisgICAgTFlOUV9FX1RJTUVfT1VUPTgwMDQsCisgICAgLypjcmVhdGUgb3Igb3BlbiBzbXMgREIgZmFpbCAqLworICAgIExZTlFfRV9TTVNfREJfRkFJTD04MDA1LAorICAgIC8qRmFpbGVkIHRvIGV4ZWN1dGUgc3FsIHN0YXRlbWVudCovCisgICAgTFlOUV9FX1NNU19TUUxfRkFJTCA9IDgwMDYsCisgICAgTFlOUV9FX1NNU19OT1RfRklORCA9IDgwMDcsCisgICAgLyogVGhlIGxvZ2ljIGNvbmZsaWN0Ki8KKyAgICBMWU5RX0VfQ09ORkxJQ1Q9OTAwMCwKKyAgICAvKk51bGwgYW5vbWFseSovCisgICAgTFlOUV9FX05VTExfQU5PTkFMWT05MDAxLAorICAgIC8qSW52YWxpZCBpZCBhbm9tYWx5Ki8KKyAgICBMWU5RX0VfSU5WQUxJRF9JRF9BTk9OQUxZPTkwMDIsCisjaWZkZWYgRUNBTExfU1VQUE9SVAorICAgIExZTlFfRV9FQ0FMTF9CRUlOR19SVU5OSU5HID05MDAzLAorICAgIExZTlFfRV9FQ0FMTF9NU0RfTEVOR1RIX0VSUk9SID05MDA0LAorICAgIExZTlFfRV9FQ0FMTF9EQUlMSU5HX05PX0FOU1dFUiA9OTAwNSwKKyNlbmRpZgorfUxZTlFfRTsKIAogdHlwZWRlZiBzdHJ1Y3R7CiAgICAgaW50IHJlcXVlc3Q7CmRpZmYgLS1naXQgYS9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9yaWwuY3BwIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvcmlsLmNwcAppbmRleCA5MGE4NDJhLi5hODFkZDdjIDEwMDc1NQotLS0gYS9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9yaWwuY3BwCisrKyBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL3JpbC5jcHAKQEAgLTEzNyw2ICsxMzcsOCBAQAogaW50IGVuYWJsZV9idF9yZXNwID0gMDsKIGludCB3YWtldXBfdG9rZW4gPSAtMTsKIHN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnRfYWRkcjsKK3N0cnVjdCBzb2NrYWRkcl9pbiBseW5xX2NsaWVudF9hZGRyOworCiAKICNkZWZpbmUgQU5EUk9JRF9XQUtFX0xPQ0tfTkFNRSAicmFkaW8taW50ZXJmYWNlIgogCkBAIC00NTE3LDYgKzQ1MTksMTUgQEAKICAgICAgICAgICAgICAgICBzbGVlcChXQUlUX1RJTUVfRk9SX1NJTV9TV0lUQ0gpOwogICAgICAgICAgICAgICAgIHNldHVwRGF0YUNhbGwoMCwgTlVMTCwgKFJJTF9TT0NLRVRfSUQpMCwgTlVMTCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZih1dGlsczo6aXNfc3VwcG9ydF9kc2RzKCkgJiYgZ2V0X2RlZmF1bHRfc2ltX2RhdGEoKSA9PSBzb2NrZXRfaWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGFyY2VsIGFsbG93X2RhdGFfcDsKKyAgICAgICAgICAgICAgICBhbGxvd19kYXRhX3Aud3JpdGVJbnQzMiAoMSk7CisgICAgICAgICAgICAgICAgYWxsb3dfZGF0YV9wLndyaXRlSW50MzIgKExZTlFfVVJDX0FMTE9XX0RBVEEpOworICAgICAgICAgICAgICAgIGFsbG93X2RhdGFfcC53cml0ZUludDMyIChzb2NrZXRfaWQpOworICAgICAgICAgICAgICAgIGFsbG93X2RhdGFfcC53cml0ZUludDMyIChlKTsKKyAgICAgICAgICAgICAgICBMWU5RX1JJTF91cmNCcm9hZGNhc3QoYWxsb3dfZGF0YV9wLExZTlFfVVJDX0FMTE9XX0RBVEEpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICNpZmRlZiBLRUVQX0FMSVZFCkBAIC01MjkzLDYgKzUzMDQsOCBAQAogICAgICAgICBjYXNlIExZTlFfUkVRVUVTVF9ERUxFVEVfU01TX0ZST01fTUVNT1JZOiByZXR1cm4gIkxZTlFfUkVRVUVTVF9ERUxFVEVfU01TX0ZST01fTUVNT1JZIjsKICAgICAgICAgY2FzZSBMWU5RX1JFUVVFU1RfTElTVF9TTVNfRlJPTV9NRU1PUlk6IHJldHVybiAiTFlOUV9SRVFVRVNUX0xJU1RfU01TX0ZST01fTUVNT1JZIjsKICAgICAgICAgY2FzZSBMWU5RX1JFUVVFU1RfU0VUX0RFRkFVTFRfU0lNX0FMTDpyZXR1cm4gIlNFVF9ERUZBVUxUX1NJTV9BTEwiOworICAgICAgICBjYXNlIExZTlFfUkVRVUVTVF9HRVRfREVGQVVMVF9TSU1fQUxMOnJldHVybiAiR0VUX0RFRkFVTFRfU0lNX0FMTCI7CisgICAgICAgIGNhc2UgTFlOUV9SRVFVRVNUX1NFVF9ERUZBVUxUX1NJTV9BTExfRVhDRVBUX0RBVEE6cmV0dXJuICJTRVRfREVGQVVMVF9TSU1fQUxMX0VYQ0VQVF9EQVRBIjsKICAgICAgICAgY2FzZSBMWU5RX1JFUVVFU1RfQ0hBTkdFX1NDUkVFTl9TVEFURTpyZXR1cm4gIkxZTlFfUkVRVUVTVF9DSEFOR0VfU0NSRUVOX1NUQVRFIjsvKmpiLnFpIGFkZCBmb3IgdHdvIHNpbSBzbGVlcCAyMDIyLzkvMTkqLwogICAgICAgICBjYXNlIExZTlFfUkVRVUVTVF9DSEFOR0VfUkFESU86cmV0dXJuICJMWU5RX1JFUVVFU1RfQ0hBTkdFX1JBRElPIjsvKmxlaSBhZGQgZm9yIGZhY3RvcnkgdGVzdCBvZiBzbGVlcCAyMDIyLzkvMTkqLwogCQljYXNlIExZTlFfUkVRVUVTVF9TRVRfVk9JQ0VfQVVESU9fTU9ERTpyZXR1cm4gIkxZTlFfUkVRVUVTVF9TRVRfVk9JQ0VfQVVESU9fTU9ERSI7CkBAIC01NTc0LDYgKzU1ODcsOCBAQAogICAgICAgICBjYXNlIExZTlFfUkVRVUVTVF9ERUxFVEVfU01TX0ZST01fTUVNT1JZOiByZXR1cm4gIkxZTlFfUkVRVUVTVF9ERUxFVEVfU01TX0ZST01fTUVNT1JZIjsKICAgICAgICAgY2FzZSBMWU5RX1JFUVVFU1RfTElTVF9TTVNfRlJPTV9NRU1PUlk6IHJldHVybiAiTFlOUV9SRVFVRVNUX0xJU1RfU01TX0ZST01fTUVNT1JZIjsKICAgICAgICAgY2FzZSBMWU5RX1JFUVVFU1RfU0VUX0RFRkFVTFRfU0lNX0FMTDpyZXR1cm4gIlNFVF9ERUZBVUxUX1NJTV9BTEwiOworICAgICAgICBjYXNlIExZTlFfUkVRVUVTVF9HRVRfREVGQVVMVF9TSU1fQUxMOnJldHVybiAiR0VUX0RFRkFVTFRfU0lNX0FMTCI7CisgICAgICAgIGNhc2UgTFlOUV9SRVFVRVNUX1NFVF9ERUZBVUxUX1NJTV9BTExfRVhDRVBUX0RBVEE6cmV0dXJuICJTRVRfREVGQVVMVF9TSU1fQUxMX0VYQ0VQVF9EQVRBIjsKICAgICAgICAgY2FzZSBMWU5RX1JFUVVFU1RfQ0hBTkdFX1NDUkVFTl9TVEFURTpyZXR1cm4gIkxZTlFfUkVRVUVTVF9DSEFOR0VfU0NSRUVOX1NUQVRFIjsvKmpiLnFpIGFkZCBmb3IgdHdvIHNpbSBzbGVlcCAyMDIyLzkvMTkqLwogICAgICAgICBjYXNlIExZTlFfUkVRVUVTVF9DSEFOR0VfUkFESU86cmV0dXJuICJMWU5RX1JFUVVFU1RfQ0hBTkdFX1JBRElPIjsvKmxlaSBhZGQgZm9yIGZhY3RvcnkgdGVzdCBvZiBzbGVlcCAyMDIyLzkvMTkqLwogICAgICAgICBjYXNlIFJJTF9VTlNPTF9URUxFUEhPTllfUkVTVEFSVDpyZXR1cm4gIlJJTF9VTlNPTF9URUxFUEhPTllfUkVTVEFSVCI7Lyp4eS5oZSBhZGQgZm9yIHQ4MDAgcmlsIHNlcnZpY2UgMjAyMy8xMC8yMyovCkBAIC02MTExLDYgKzYxMjYsOCBAQAogICAgIFJMT0dEKCJMWU5RX1JJTF9SZWNTb2NrZXQgc3RhcnRcbiIpOwogICAgIGNoYXIgKmFyZ3ZbTUFYX0FSR1NdOwogICAgIGludCBhcmdjID0gMDsKKyAgICBpbnQgcmlsX3Nsb3Rfc3RhdHVzID0gMDsKKyAgICBpbnQgcmlsX3Nsb3QgPSAwOwogICAgIGludCBlcF9mZCA9IDA7CiAgICAgaW50IGVuX2ZkID0gMDsKICAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgbHlucV9ldjsKQEAgLTYxODcsNiArNjIwNCw5IEBACiAgICAgICAgICAgICAgICAgd2hpbGUocmVjdmZyb20oc2VydmVyX3NvY2tldF9mZCwgYnVmZmVyLCBMWU5RX1NPQ0tFVF9CVUZGRVIsMCwoc3RydWN0IHNvY2thZGRyKikmbHlucUNsaWVudF9hZGRyLCAmY2xpZW50X2FkZHJfbGVuZ3RoKSAhPSAtMSkvL2FkZCB3aGlsZSBieSBocSBmb3IgYnVnIDc2MCAyMDIzLzAyLzA5CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBjbGllbnRfdG1wID0gKGx5bnFfY2xpZW50X3QqKWJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgbHlucV9jbGllbnRfYWRkciA9IGx5bnFDbGllbnRfYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgcmlsX3Nsb3Rfc3RhdHVzID0gKGludCkoYnVmZmVyKygxMDI0Kjgrc2l6ZW9mKGludCkqMykpWzBdIC0gJzAnOworICAgICAgICAgICAgICAgICAgICByaWxfc2xvdCA9IChpbnQpKGJ1ZmZlcisoMTAyNCo4K3NpemVvZihpbnQpKjMpKzEpWzBdIC0gJzAnOwogICAgICAgICAgICAgICAgICAgICBSTE9HRCgiW0xZTlEgc29ja2V0SWRdIHV0b2tlbj0lZCxyZXF1ZXN0PSVkLGxlbj0lZCxwYXJhbT0lcyIsY2xpZW50X3RtcC0+dVRva2VuLGNsaWVudF90bXAtPnJlcXVlc3QsY2xpZW50X3RtcC0+cGFyYW1MZW4sY2xpZW50X3RtcC0+cGFyYW0pOwogICAgICAgICAgICAgICAgICAgICAvL2NoYXIgdGVzdFszNl0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgLy9zcHJpbnRmKHRlc3QsInRlc3Qgb2theSBsZW4gPSAlZCIsY2xpZW50X3RtcC0+cGFyYW1MZW4pOwpAQCAtNjIxOCwxMCArNjIzOCwxNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJlcXVlc3Q7CiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBjb21tYW5kLT5yZXF1ZXN0OwogICAgICAgICAgICAgICAgICAgICBSSUxfU09DS0VUX0lEIGlkID0gUklMX1NPQ0tFVF8xOwotICAgICAgICAgICAgICAgICAgICBpZih1dGlsczo6aXNfc3VwcG9ydF9kc2RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gKFJJTF9TT0NLRVRfSUQpZ2V0X2RlZmF1bHRfc2ltX2FsbF9leGNlcHRfZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodXRpbHM6OmlzX3N1cHBwb3J0X2Rzc3MoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAoUklMX1NPQ0tFVF9JRClQaG9uZV91dGlsczo6Z2V0X2VuYWJsZV9zaW1fZm9yX2Rzc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHJpbF9zbG90X3N0YXR1cyA9PSAxKSAmJiAoKHJpbF9zbG90ID09IDApIHwgKHJpbF9zbG90ID09IDEpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSAoUklMX1NPQ0tFVF9JRClyaWxfc2xvdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHV0aWxzOjppc19zdXBwb3J0X2RzZHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gKFJJTF9TT0NLRVRfSUQpZ2V0X2RlZmF1bHRfc2ltX2FsbF9leGNlcHRfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKHV0aWxzOjppc19zdXBwcG9ydF9kc3NzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IChSSUxfU09DS0VUX0lEKVBob25lX3V0aWxzOjpnZXRfZW5hYmxlX3NpbV9mb3JfZHNzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmKHJlcXVlc3QgPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTc1MDIsNiArNzUyOSwxOSBAQAogICAgIHJldHVybiBsZW5fczsKIH0KIAoraW50IGx5bnFfZW1SZXN1bHROb3RpZnkoUGFyY2VsICZwKQoreworCisgICAgUkxPR0QoImVtUmVzdWx0Tm90aWZ5IHBhcmNlbCIpOworICAgIGludCBkYXRhU2l6ZSA9IHAuZGF0YVNpemUoKTsKKyAgICBjb25zdCB1aW50OF90KiBkYXRhID0gcC5kYXRhKCk7CisgICAgaW50IGxlbl9zID0gc2VuZHRvKHNlcnZlcl9zb2NrZXRfZmQsZGF0YSxkYXRhU2l6ZSwwLChzdHJ1Y3Qgc29ja2FkZHIgKikmbHlucV9jbGllbnRfYWRkcixzaXplb2YobHlucV9jbGllbnRfYWRkcikpOworICAgIC8vc2VuZHRvKHNlcnZlcl9zb2NrZXRfZmQsInN0b3BlbWRvbmUiLHN0cmxlbigic3RvcGVtZG9uZSIpLDAsKHN0cnVjdCBzb2NrYWRkciAqKSZjbGllbnRfYWRkcixzaXplb2YoY2xpZW50X2FkZHIpKTsKKyAgICBSTE9HRCgibGVuX3MgPSAlZCxlcnJubyA9ICVkIixsZW5fcyxlcnJubyk7CisgICAgcmV0dXJuIGxlbl9zOworfQorCisKIHZvaWQgcHJvY2Vzc1Vuc29saWNpdGVkIChQYXJjZWwgJnAsIGludCB0eXBlKQogewogICAgIGludDMyX3QgcmVzcG9uc2UgPSAtMTsKZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL3J0cC9jYWxsX3J0cF9pbm5lci5oIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvcnRwL2NhbGxfcnRwX2lubmVyLmgKaW5kZXggMGExZWJkMC4uYTkyYzM1MCAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvcnRwL2NhbGxfcnRwX2lubmVyLmgKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvcnRwL2NhbGxfcnRwX2lubmVyLmgKQEAgLTI0LDcgKzI0LDYgQEAKIA0KICNkZWZpbmUgUkVTVUxUX09LICgwKQ0KICNkZWZpbmUgUkVTVUxUX0VSUk9SICgtMSkNCi0jZGVmaW5lIExZTlFfRV9QQVJBTUVURVJfQU5PTkFMWSA3MDAwDQogDQogdHlwZWRlZiBlbnVtew0KICAgICBSdHBfU3NyY19yYW5kb20gPSAwLCAgICAgDQpkaWZmIC0tZ2l0IGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvc2ltLmNwcCBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL3NpbS5jcHAKaW5kZXggZjFiYmE0MC4uMTBmYjNjNSAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvc2ltLmNwcAorKysgYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9zaW0uY3BwCkBAIC00Miw2ICs0Miw4IEBACiAjaW5jbHVkZSAic2ltLmgiCiAjaW5jbHVkZSAgImNvbW1vbi5oIgogI2luY2x1ZGUgIlJhZGlvX2NhcGFiaWxpdHlfc3dpdGNoX3V0aWwuaCIKKyNpbmNsdWRlICJseW5xX2ludGVyZmFjZS5oIgorCiAKICN1bmRlZiBMT0dfVEFHCiAjZGVmaW5lIExPR19UQUcgIkRFTU9fU0lNIgpAQCAtMjE2LDcgKzIxOCwxOCBAQAogICAgIHN0ciA9ICJkZWZhdWx0IFNJTShleGNlcHQgZGF0YSk6ICIgKyBzdGQ6OnRvX3N0cmluZyhnZXRfZGVmYXVsdF9zaW1fYWxsX2V4Y2VwdF9kYXRhKCkpICsgIlxuIjsKICAgICBzdHIgPSBzdHIgKyAiZGVmYXVsdCBkYXRhOiAiICsgc3RkOjp0b19zdHJpbmcoZ2V0X2RlZmF1bHRfc2ltX2RhdGEoKSkgKyAiXG4iOwogICAgIHN0ciA9IHN0ciArICJtYWluIGNhcGFiaWxpdHkgU0lNOiAiICsgc3RkOjp0b19zdHJpbmcoUmFkaW9fY2FwYWJpbGl0eV9zd2l0Y2hfdXRpbDo6Z2V0X21haW5fY2FwYWJpbGl0eV9waG9uZV9pZCgpKSArICJcbiI7Ci0gICAgYW5kcm9pZDo6ZW1SZXN1bHROb3RpZnkoc3RyLmNfc3RyKCkpOworICAgIFJMT0dEKHN0ci5jX3N0cigpKTsKKyAgICBhbmRyb2lkOjpQYXJjZWwgcDsKKyAgICBwLndyaXRlSW50MzIoMSk7Ly9yZXNwb25zZV90eXBlCisgICAgcC53cml0ZUludDMyKHBSSS0+dVRva2VuKTsvL3Rva2VuIAorICAgIHAud3JpdGVJbnQzMihMWU5RX1JFUVVFU1RfR0VUX0RFRkFVTFRfU0lNX0FMTCk7Ly9yZXF1ZXN0X2lkCisgICAgcC53cml0ZUludDMyKHNsb3RfaWQpOy8vc2xvdF9pZAorICAgIHAud3JpdGVJbnQzMigwKTsvL2Vycm9yX2NvZGUKKyAgICBwLndyaXRlSW50MzIoKGdldF9kZWZhdWx0X3NpbV9kYXRhKCkpICsgKGdldF9kZWZhdWx0X3NpbV9hbGxfZXhjZXB0X2RhdGEoKSoyKSk7Ly9kYXRhCisgICAgcC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgYW5kcm9pZDo6bHlucV9lbVJlc3VsdE5vdGlmeShwKTsKKyAgICAvL2FuZHJvaWQ6OmVtUmVzdWx0Tm90aWZ5KHN0ci5jX3N0cigpKTsvL0xZTlFfREVMX0xJVS5IT05HXzIwMjQxMTI2CisKICAgICBmcmVlKHBSSSk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMjYsMTYgKzMzOSwyNyBAQAogCiAvL1NFVF9ERUZBVUxUX1NJTV9BTExfRVhDRVBUX0RBVEEKIGludCBzZXRfZGVmYXVsdF9zaW1fYWxsX2V4Y2VwdF9kYXRhKGludCBhcmdjLCBjaGFyICoqYXJndiwgUklMX1NPQ0tFVF9JRCBzb2NrZXRfaWQsIFJlcXVlc3RJbmZvICpwUkkpeworICAgIGFuZHJvaWQ6OlBhcmNlbCBwOworICAgIHAud3JpdGVJbnQzMigxKTsvL3Jlc190eXBlCisgICAgcC53cml0ZUludDMyKHBSSS0+dVRva2VuKTsvL3Rva2VuCisgICAgcC53cml0ZUludDMyKExZTlFfUkVRVUVTVF9TRVRfREVGQVVMVF9TSU1fQUxMX0VYQ0VQVF9EQVRBKTsvL3JlcXVlc3RfaWQKKyAgICBwLndyaXRlSW50MzIoZ2V0X2RlZmF1bHRfc2ltX2RhdGEoKSk7CiAgICAgaWYoKGFyZ2MgIT0gMikgfHwgKCFpc192YWxpZChhdG9pKGFyZ3ZbMV0pKSkpCiAgICAgewogICAgICAgICBmcmVlKHBSSSk7CiAgICAgICAgIFJMT0dEKCJ0aGUgcGFyZW1ldGVycyBudW1iZXJzIGlzbid0IHJpZ2h0ICwgc28gcmV0dXJuIik7Ci0gICAgICAgIGFuZHJvaWQ6OmVtUmVzdWx0Tm90aWZ5KCJTZXQgZmFpbGVkLlxuIik7CisgICAgICAgIHAud3JpdGVJbnQzMigxKTsvL2Vycl9jb2RlCisgICAgICAgIHAuc2V0RGF0YVBvc2l0aW9uKDApOworICAgICAgICBhbmRyb2lkOjpseW5xX2VtUmVzdWx0Tm90aWZ5KHApOworICAgICAgICAvL2FuZHJvaWQ6OmVtUmVzdWx0Tm90aWZ5KCJTZXQgZmFpbGVkLlxuIik7IC8vTFlOUV9ERUxfTElVLkhPTkdfMjAyNDExMjYKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIHNldF9kZWZhdWx0X3NpbV9hbGxfZXhjZXB0X2RhdGEoYXRvaShhcmd2WzFdKSk7Ci0gICAgYW5kcm9pZDo6ZW1SZXN1bHROb3RpZnkoIlNldCBzdWNjZXNzZnVsLlxuIik7CisgICAgcC53cml0ZUludDMyKDApOy8vZXJyX2NvZGUgd2hlbiBmYWlsZWQKKyAgICBwLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBhbmRyb2lkOjpseW5xX2VtUmVzdWx0Tm90aWZ5KHApOworICAgIC8vYW5kcm9pZDo6ZW1SZXN1bHROb3RpZnkoIlNldCBzdWNjZXNzZnVsLlxuIik7IC8vTFlOUV9ERUxfTElVLkhPTkdfMjAyNDExMjYKICAgICBmcmVlKHBSSSk7CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9zbXMvbHlucVNtc01hbmFnZXIvbHlucV9zbXNfbWFuYWdlci5jcHAgYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2ZyYW1ld29yay9seW5xLXJpbC1zZXJ2aWNlL3NyYy9zbXMvbHlucVNtc01hbmFnZXIvbHlucV9zbXNfbWFuYWdlci5jcHAKaW5kZXggMGQ5MjZkZi4uMTRiZDk0MSAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9mcmFtZXdvcmsvbHlucS1yaWwtc2VydmljZS9zcmMvc21zL2x5bnFTbXNNYW5hZ2VyL2x5bnFfc21zX21hbmFnZXIuY3BwCisrKyBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvZnJhbWV3b3JrL2x5bnEtcmlsLXNlcnZpY2Uvc3JjL3Ntcy9seW5xU21zTWFuYWdlci9seW5xX3Ntc19tYW5hZ2VyLmNwcApAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4NCiAjaW5jbHVkZSA8c3RyaW5nLmg+DQogI2luY2x1ZGUgImNvbW1vbi5oIg0KKyNpbmNsdWRlICJseW5xX2ludGVyZmFjZS5oIg0KIHNtc19tYW5hZ2VyICogZ19zbXNNYW5hZ2VtZW50Ow0KIGludCBzbXNfaW5kZXhzW0xZTlFfTUFYX1NNU19MSVNUXT17MH07DQogaW50IG5leHRfaW5kZXggPSAwOw0KZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL2luY2x1ZGUvbHlucV9zaW0uaCBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL2luY2x1ZGUvbHlucV9zaW0uaAppbmRleCBjMmQ3NzkzLi5hMzg2MGY1IDEwMDc1NQotLS0gYS9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2xpYi9saWJseW5xLXNpbS9pbmNsdWRlL2x5bnFfc2ltLmgKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vaW5jbHVkZS9seW5xX3NpbS5oCkBAIC04NCw3ICs4NCwzOCBAQAogICogCiAgKi8KIGludCBseW5xX2ZhY3RvcnlfcmFkaW9fc3RhdGUoaW50IG51bSk7CisvKioKKyAqIEBicmllZiBzZXQgZGVmYXVsdCBzaW0gY2FyZAorICogQHBhcmFtIHNsb3Q6IHR5cGUgW0lOXSA8c2xvdD4gc2ltIGNhcmQgc2xvdAorICogQHJldHVybiBpbnQKKyAqIDA6c3VjY2VzcworICogb3RoZXI6ZmFpbAorICovCitpbnQgbHlucV9zZXRfZGVmYXVsdF9zaW0oY29uc3QgaW50IHNsb3QpOwogCisvKioKKyAqIEBicmllZiBnZXQgZGVmYXVsdCBzaW0gY2FyZAorICogQHBhcmFtIGJpdHNsb3Q6IHNpbSBjYXJkIGluZm9tYXRpb24KKyAqIDAwo6gwo6lhbGwgaW4gc2ltMAorICogMDGjqDGjqW90aGVycyBzaW0wo6xkYXRhIGluIHNpbTEKKyAqIDEwo6gyo6lvdGhlcnMgc2ltMaOsZGF0YSBpbiBzaW0wCisgKiAxMaOoM6OpYWxsIGluIHNpbTEKKyAqIEByZXR1cm4gaW50CisgKiAwOnN1Y2Nlc3MKKyAqIG90aGVyOmZhaWwKKyAqLworCitpbnQgbHlucV9nZXRfZGVmYXVsdF9zaW1fYWxsKGludCAqYml0X3Nsb3QpOworCisvKioKKyAqIEBicmllZiBzZXQgc2ltIGNhcmQgZXhjZXB0X2RhdGEKKyAqIEBwYXJhbSBzbG90OiB0eXBlIFtJTl0gPHNsb3Q+IHNpbSBjYXJkIHNsb3QKKyAqIEByZXR1cm4gaW50CisgKiAwOnN1Y2Nlc3MKKyAqIG90aGVyOmZhaWwKKyAqLworCitpbnQgbHlucV9zZXRfZGVmYXVsdF9zaW1fZXhjZXB0X2RhdGEoY29uc3QgaW50IHNsb3QpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL21ha2VmaWxlIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vbWFrZWZpbGUKaW5kZXggZjM0ZTZiMC4uMjU3NThlYyAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vbWFrZWZpbGUKKysrIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vbWFrZWZpbGUKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgLUkkKFJPT1QpJChpbmNsdWRlZGlyKS92ZW5kb3ItcmlsIFwKICAgLUkkKFJPT1QpJChpbmNsdWRlZGlyKS9sb2dnZXIgXAogICAtSSQoUk9PVCkkKGluY2x1ZGVkaXIpL2xpYmxvZyBcCisgIC1JJChST09UKSQoaW5jbHVkZWRpcikvbHlucS1yaWwgXAogCiAKIExPQ0FMX0xJQlMgOj0gXApkaWZmIC0tZ2l0IGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vc3JjL2x5bnFfc2ltLmNwcCBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL3NyYy9seW5xX3NpbS5jcHAKaW5kZXggYzc4MDg1OS4uZjYxZDYxZSAxMDA3NTUKLS0tIGEvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vc3JjL2x5bnFfc2ltLmNwcAorKysgYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2xpYi9saWJseW5xLXNpbS9zcmMvbHlucV9zaW0uY3BwCkBAIC0yNCw2ICsyNCwxMCBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlICJseW5xX3NpbS5oIgorI2luY2x1ZGUgImxpYmxvZy9seW5xX2RlZmxvZy5oIgorI2luY2x1ZGUgImx5bnFfc2ltX3VyYy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OlBhcmNlbDsKICNkZWZpbmUgTUFYX0JVRiAyMAogI2RlZmluZSBNQVhfTlVNIDgwCiAjZGVmaW5lIExZTlFfUkVRVUVTVF9TRVRfREVGQVVMVF9TSU1fQUxMIDgwMDgKQEAgLTMxLDExICszNSwxNyBAQAogI2RlZmluZSBMWU5RX1JFUVVFU1RfQ0hBTkdFX1JBRElPIDgwMTUKICNkZWZpbmUgTUFYX0xFTiAxMDI0KjgKICNkZWZpbmUgTUFYX05VTSAxMAotI2RlZmluZSBMT0dfVEFHICJMWU5RX1NJTSIKKyNkZWZpbmUgVVNFUl9MT0dfVEFHICJMWU5RX1NJTSIKICNkZWZpbmUgRkxBR19URVNTIDAKLXVzaW5nIDo6YW5kcm9pZDo6UGFyY2VsOwogI2RlZmluZSBERVNUX1BPUlQgODA4OAogI2RlZmluZSBEU0VUX0lQX0FERFJFU1MgICIxMjcuMC4wLjEiCisjZGVmaW5lIFNJTV9BTExPV19EQVRBX1RJTUVPVVQgNjAqMTAwMAorI2RlZmluZSBSRVNVTFRfT0sgKDApCisjZGVmaW5lIFJFU1VMVF9FUlJPUiAoLTEpCitzdGF0aWMgcHRocmVhZF9tdXRleF90IHNfc2ltX2FsbG93X2RhdGFfbXV0ZXggPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIHB0aHJlYWRfY29uZF90IHNfc2ltX2FsbG93X2RhdGFfY29uZCA9IFBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKK3N0YXRpYyBpbnQgc19zaW1fYWxsb3dfZGF0YV92YWx1ZSA9IC0xOworCiAKIHR5cGVkZWYgc3RydWN0ewogICAgIGludCB1VG9rZW47CkBAIC00OSw2ICs1OSw3IEBACiBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcl9zZXJ2Owogc3RhdGljIGludCBzb2NrX2ZkID0gMDsKIGludCBHbG9iYWxfdVRva2VuID0gMDsKK3N0YXRpYyBpbnQgZGVmYXVsdF9jbnQgPSAyMDsKIHN0YXRpYyBwdGhyZWFkX211dGV4X3QgZ19seW5xX3NpbV9zZW5kdG9fbXV0ZXg7CiAvKioKICAqIEBicmllZiBtYXJrIGNhbGwgaW5pdGlhbGl6YXRpb24gc3RhdGUKQEAgLTc5LDQyICs5MCwzMiBAQAogICAgIGludCBlcnJvcjsKIH1seW5xX3Jlc3BfdDsKIAotI2RlZmluZSBSRVNVTFRfT0sgKDApCi0jZGVmaW5lIFJFU1VMVF9FUlJPUiAoLTEpCitpbnQgd2FpdEFsbG93RGF0YVNpZ25hbChpbnQgbXRpbWUpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHNlYyA9IDA7CisgICAgaW50IHVzZWMgPSAwOworICAgIHN0cnVjdCB0aW1ldmFsIG5vdzsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZW91dDsKKyAgICBnZXR0aW1lb2ZkYXkoJm5vdyxOVUxMKTsKKyAgICBzZWMgPSBtdGltZS8xMDAwOworICAgIHVzZWMgPSBtdGltZSUxMDAwOworICAgIHRpbWVvdXQudHZfc2VjID0gbm93LnR2X3NlYytzZWM7CisgICAgdGltZW91dC50dl9uc2VjID0gbm93LnR2X3VzZWMqMTAwMCt1c2VjKjEwMDAwMDA7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzX3NpbV9hbGxvd19kYXRhX211dGV4KTsKKyAgICByZXQgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZzX3NpbV9hbGxvd19kYXRhX2NvbmQsJnNfc2ltX2FsbG93X2RhdGFfbXV0ZXgsJnRpbWVvdXQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzX3NpbV9hbGxvd19kYXRhX211dGV4KTsKKyAgICByZXR1cm4gcmV0OworfQogCi10eXBlZGVmIGVudW17Ci0gICAgLypiYXNlIGFibm9ybWFsKi8KLSAgICBMWU5RX0VfUEFSQU1FVEVSX0FOT05BTFk9NzAwMCwKLSAgICBMWU5RX0VfU0VORF9SRVFVRVNUX0ZBSUw9NzAwMSwKLSAgICBMWU5RX0VfR0VUX0hFQURfRVJST1I9NzAwMiwKLSAgICBMWU5RX0VfSU5ORVJfRVJST1I9NzEwMCwKLSAgICBMWU5RX0VfTUFMTE9DX0VSUk9SPTcxMDEsCi0gICAgLyoqLwotICAgIExZTlFfRV9DQVJEU1RBVEVfRVJST1I9ODAwMCwKLSAgICAvKiBUaGUgdm9pY2Ugc2VydmljZSBzdGF0ZSBpcyBvdXQgb2Ygc2VydmljZSovCi0gICAgTFlOUV9FX1NUQVRFX09VVF9PRl9TRVJWSUNFPTgwMDEsCi0gICAgLyogVGhlIHZvaWNlIHNlcnZpY2Ugc3RhdGUgaXMgRU1FUkdFTkNZX09OTFkqLwotICAgIExZTlFfRV9TVEFURV9FTUVSR0VOQ1lfT05MWT04MDAyLAotICAgIC8qIFRoZSByYWRpbyBwb3dlciBpcyBwb3dlciBvZmYqLwotICAgIExZTlFfRV9TVEFURV9QT1dFUl9PRkY9ODAwMywKLSAgICBMWU5RX0VfVElNRV9PVVQ9ODAwNCwKLSAgICAvKmNyZWF0ZSBvciBvcGVuIHNtcyBEQiBmYWlsICovCi0gICAgTFlOUV9FX1NNU19EQl9GQUlMPTgwMDUsCi0gICAgLypGYWlsZWQgdG8gZXhlY3V0ZSBzcWwgc3RhdGVtZW50Ki8KLSAgICBMWU5RX0VfU01TX1NRTF9GQUlMID0gODAwNiwKLSAgICBMWU5RX0VfU01TX05PVF9GSU5EID0gODAwNywKLSAgICAvKiBUaGUgbG9naWMgY29uZmxpY3QqLwotICAgIExZTlFfRV9DT05GTElDVD05MDAwLAotICAgIC8qTnVsbCBhbm9tYWx5Ki8KLSAgICBMWU5RX0VfTlVMTF9BTk9OQUxZPTkwMDEsCi0gICAgIC8qSW52YWxpZCBpZCBhbm9tYWx5Ki8KLSAgICBMWU5RX0VfSU5WQUxJRF9JRF9BTk9OQUxZPTkwMDIsCi0jaWZkZWYgRUNBTExfU1VQUE9SVAotICAgIExZTlFfRV9FQ0FMTF9CRUlOR19SVU5OSU5HID05MDAzLAotICAgIExZTlFfRV9FQ0FMTF9NU0RfTEVOR1RIX0VSUk9SID05MDA0LAotICAgIExZTlFfRV9FQ0FMTF9EQUlMSU5HX05PX0FOU1dFUiA9OTAwNSwKLSNlbmRpZgotfUxZTlFfRTsKK3ZvaWQgc2VuZEFsbG93RGF0YVNpZ25hbChpbnQgdmFsdWUpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzX3NpbV9hbGxvd19kYXRhX211dGV4KTsKKyAgICBzX3NpbV9hbGxvd19kYXRhX3ZhbHVlID0gdmFsdWU7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmc19zaW1fYWxsb3dfZGF0YV9jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19zaW1fYWxsb3dfZGF0YV9tdXRleCk7CisgICAgcmV0dXJuOworfQogCiAvKipAYnJpZWYgcHJpbnQgc29saWNpZWQgcmVzcG9uc2UgbXNnJ3MgaGVhZCBpbmZvcm1hdGlvbgogKiBAcGFyYW0gaGVhZCBbSU5dOiBoZWFkIGluZm9ybWF0aW9uCkBAIC0xNDQsMTUgKzE0NSwxOCBAQAogICAgICAgICByZXR1cm4gUkVTVUxUX0VSUk9SOwogICAgIH0KIH0KLQotaW50IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdChQYXJjZWwqIHAsIGludCByZXF1ZXN0X2lkLCBpbnQgYXJnYywgaW50IGNudCwgY29uc3QgY2hhciogZm9ybWF0LC4uLikKK2ludCBnZXRfdXRva2VuKCkKK3sKKyAgICByZXR1cm4gKEdsb2JhbF91VG9rZW4rKyklMTAwMDA7LyowLTEwMDAwKi8KK30KK2ludCBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoUGFyY2VsKiBwLCBpbnQgcmVxdWVzdF9pZCwgaW50IGFyZ2MsIGludCBjbnQsIGludCBzaW1fY291bnQsIGNvbnN0IGNoYXIqIGZvcm1hdCwuLi4pCiB7CiAgICAgbHlucV9jbGllbnRfdCBjbGllbnQ7CiAgICAgaW50IHJldDsKICAgICBpbnQgc2VuZF9udW07CiAgICAgaW50IHJlY3ZfbnVtOwogICAgIGNoYXIgcmVzX2RhdGFbTUFYX0xFTl0gPSB7MH07Ci0gICAgY2xpZW50LnVUb2tlbiA9IEdsb2JhbF91VG9rZW47CisgICAgY2xpZW50LnVUb2tlbiA9IGdldF91dG9rZW4oKTsKICAgICBpZihyZXF1ZXN0X2lkID09IFJJTF9SRVFVRVNUX1NDUkVFTl9TVEFURSkKICAgICB7CiAgICAgICAgIGNsaWVudC5yZXF1ZXN0ID0gTFlOUV9SRVFVRVNUX0NIQU5HRV9TQ1JFRU5fU1RBVEU7CkBAIC0xODUsMTQgKzE4OSwyOCBAQAogICAgIH0KICAgICBseW5xX3Jlc3BfdCBoZWFkOwogICAgIGhlYWQucmVxdWVzdCA9IC0xOwotICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbnQ7KQorICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbnQ7IGkrKykKICAgICB7CisgICAgICAgIGhlYWQucmVzcF90eXBlID0gLTE7CisgICAgICAgIGhlYWQudG9rZW4gPSAtMTsKKyAgICAgICAgaGVhZC5yZXF1ZXN0ID0gLTE7CisgICAgICAgIGhlYWQuc2xvdF9pZCA9IC0xOworICAgICAgICBoZWFkLmVycm9yID0gLTE7CiAgICAgICAgIHJlY3ZfbnVtID0gcmVjdmZyb20oc29ja19mZCxyZXNfZGF0YSxzaXplb2YoY2hhcikqTUFYX0xFTiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX3NlcnYsKHNvY2tsZW5fdCopJmxlbl9hZGRyX3NlcnYpOwogICAgICAgICBpZihyZWN2X251bSA8PSAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBSTE9HRCgicmVjdiByZXF1ZXN0IGZhaWwsIHJlY3YgbnVtIGlzICVkIiwgcmVjdl9udW0pOwotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbHlucV9zaW1fc2VuZHRvX211dGV4KTsKLSAgICAgICAgICAgIHJldHVybiByZWN2X251bTsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFQUdBSU4gfHwgZXJybm8gPT0gRVdPVUxEQkxPQ0spIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJMT0dEKCJyZWN2IGZyb20gdGltZW91dCIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2x5bnFfc2ltX3NlbmR0b19tdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIExZTlFfRV9USU1FX09VVDsKKyAgICAgICAgICAgIH0gCisgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJMT0dEKCJyZWN2IHJlcXVlc3QgZmFpbCwgcmVjdiBudW0gaXMgJWQiLCByZWN2X251bSk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfbHlucV9zaW1fc2VuZHRvX211dGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjdl9udW07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcC0+c2V0RGF0YSgodWludDhfdCAqKXJlc19kYXRhLHNpemVvZihjaGFyKSpyZWN2X251bSk7CiAgICAgICAgIHAtPnNldERhdGFQb3NpdGlvbigwKTsKQEAgLTIwMCwxMiArMjE4LDMwIEBACiAgICAgICAgIGlmKHJldCE9MCkKICAgICAgICAgewogICAgICAgICAgICAgUkxPR0QoIiVzICVkIGdldCBoZWFkIGVycm9yICVkIixfX0ZVTkNUSU9OX18sY2xpZW50LnVUb2tlbixyZXQpOworCisgICAgICAgICAgICBpZiAoaGVhZC50b2tlbiAhPSBjbGllbnQudVRva2VuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJMT0dEKCJoZWFkLnRva2VuIGlzICVkICE9IGNsaWVudC51VG9rZW4gaXMgJWQiLCBoZWFkLnRva2VuLCBjbGllbnQudVRva2VuKTsKKyAgICAgICAgICAgICAgICByZXQgPSBSRVNVTFRfRVJST1I7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2x5bnFfc2ltX3NlbmR0b19tdXRleCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CisgICAgICAgIGlmIChoZWFkLnRva2VuICE9IGNsaWVudC51VG9rZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMT0dEKCJoZWFkLnRva2VuIGlzICVkICE9IGNsaWVudC51VG9rZW4gaXMgJWQiLCBoZWFkLnRva2VuLCBjbGllbnQudVRva2VuKTsKKyAgICAgICAgICAgIHJldCA9IFJFU1VMVF9FUlJPUjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGlmKHJlcXVlc3RfaWQgPT0gaGVhZC5yZXF1ZXN0KQogICAgICAgICB7Ci0gICAgICAgICAgICBpKys7CisgICAgICAgICAgICBzaW1fY291bnQtLTsKKyAgICAgICAgICAgIGlmKHNpbV9jb3VudCA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2x5bnFfc2ltX3NlbmR0b19tdXRleCk7CkBAIC0yNDksMTcgKzI4NSwyMSBAQAogICAgIHRpbWVPdXQudHZfdXNlYyA9IDA7CiAgICAgaWYgKHNldHNvY2tvcHQoc29ja19mZCwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICZ0aW1lT3V0LCBzaXplb2YodGltZU91dCkpIDwgMCkgCiAgICAgewotICAgICAgICBSTE9HRCgidGltZSBvdXQgc2V0dGluZyBmYWlsZWRcbiIpOyAKKyAgICAgICAgUkxPR0QoInRpbWUgb3V0IHNldHRpbmcgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICAvKiDorr7nva5hZGRyZXNzICovICAKLSAgICBtZW1zZXQoJmFkZHJfc2VydiwgMCwgc2l6ZW9mKGFkZHJfc2VydikpOyAgCi0gICAgYWRkcl9zZXJ2LnNpbl9mYW1pbHkgPSBBRl9JTkVUOyAgCi0gICAgYWRkcl9zZXJ2LnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihEU0VUX0lQX0FERFJFU1MpOyAgCi0gICAgYWRkcl9zZXJ2LnNpbl9wb3J0ID0gaHRvbnMoREVTVF9QT1JUKTsgIAotICAgIGxlbl9hZGRyX3NlcnYgPSBzaXplb2YoYWRkcl9zZXJ2KTsgIAotICAgIC8qdGVzdCovCiAKKyAgICBtZW1zZXQoJmFkZHJfc2VydiwgMCwgc2l6ZW9mKGFkZHJfc2VydikpOworICAgIGFkZHJfc2Vydi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsgIAorICAgIGFkZHJfc2Vydi5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoRFNFVF9JUF9BRERSRVNTKTsKKyAgICBhZGRyX3NlcnYuc2luX3BvcnQgPSBodG9ucyhERVNUX1BPUlQpOworICAgIGxlbl9hZGRyX3NlcnYgPSBzaXplb2YoYWRkcl9zZXJ2KTsKKyAgICByZXQgPSBseW5xX3N0YXJ0X2FsbF91cmNfc29ja2V0X3RocmVhZCgpOworICAgIGlmKHJldCAhPSBSRVNVTFRfT0spCisgICAgeworICAgICAgICBMWUVSUkxPRygiaW5pdCBzb2NrZXQgdXJjIGZhaWwhISEiKTsKKyAgICAgICAgcmV0dXJuIExZTlFfRV9JTk5FUl9FUlJPUjsKKyAgICB9CiAgICAgUkxPR0UoIiVzIGVuZCBzdWMiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yNzMsNiArMzEzLDcgQEAKICAgICAgICAgUkxPR0QoImx5bnFfc2ltX2RlaW5pdCAgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CisgICAgbHlucV9jbG9zZV9hbGxfdXJjX3NvY2tldF90aHJlYWQoKTsKICAgICBnX2x5bnFfc2ltX2luaXRfZmxhZyA9IDA7CiAgICAgY2xvc2Uoc29ja19mZCk7CiAKQEAgLTI5Niw3ICszMzcsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFBhcmNlbCBwOwotICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfR0VUX1NJTV9TVEFUVVMsMCwxLCIiKTsKKyAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX0dFVF9TSU1fU1RBVFVTLDAsZGVmYXVsdF9jbnQsMSwiIik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zMTMsNyArMzU0LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX0dFVF9JTVNJLDAsMSwiIik7CisgICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9HRVRfSU1TSSwwLGRlZmF1bHRfY250LDEsIiIpOwogICAgIGlmKHJlcyAhPSAwKQogICAgIHsKICAgICAgICAgUkxPR0QoImZ1bmN0aW9uICVzIGV4ZWN1dGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzM0LDcgKzM3NSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUGFyY2VsIHA7Ci0gICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9RVUVSWV9JQ0NJRCwwLDEsIiIpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfUVVFUllfSUNDSUQsMCxkZWZhdWx0X2NudCwxLCIiKTsKICAgICBpZihyZXMgIT0gMCkKICAgICB7CiAgICAgICAgIFJMT0dEKCJmdW5jdGlvbiAlcyBleGVjdXRlIGVycm9yIiwgX19GVU5DVElPTl9fKTsKQEAgLTM1Miw3ICszOTMsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFBhcmNlbCBwOwotICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfU0VUX0ZBQ0lMSVRZX0xPQ0ssNCwxLCIlcyAlcyAlcyAlc1xuIiwgIlNDIiwgcGluLCAiMTEiLCAiMSIpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfU0VUX0ZBQ0lMSVRZX0xPQ0ssNCxkZWZhdWx0X2NudCwxLCIlcyAlcyAlcyAlc1xuIiwgIlNDIiwgcGluLCAiMTEiLCAiMSIpOwogICAgIGlmKHJlcyAhPSAwKQogICAgIHsKICAgICAgICAgUkxPR0QoImZ1bmN0aW9uICVzIGV4ZWN1dGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzY4LDcgKzQwOSw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUGFyY2VsIHA7Ci0gICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9PRU1fSE9PS19SQVcsMSwxLCIlcyVkIiwgIkFUK0VTSU1QT1dFUj0iLCBtb2RlKTsKKyAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX09FTV9IT09LX1JBVywxLGRlZmF1bHRfY250LDEsIiVzJWQiLCAiQVQrRVNJTVBPV0VSPSIsIG1vZGUpOwogICAgIGlmKHJlcyAhPSAwKQogICAgIHsKICAgICAgICAgUkxPR0QoImZ1bmN0aW9uICVzIGV4ZWN1dGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzgzLDcgKzQyNCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUGFyY2VsIHA7Ci0gICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9TRVRfRkFDSUxJVFlfTE9DSyw0LDEsIiVzICVzICVzICVzXG4iLCAiU0MiLCBwaW4sICIxMSIsICIwIik7CisgICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9TRVRfRkFDSUxJVFlfTE9DSyw0LGRlZmF1bHRfY250LDEsIiVzICVzICVzICVzXG4iLCAiU0MiLCBwaW4sICIxMSIsICIwIik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zOTgsNyArNDM5LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX1FVRVJZX0ZBQ0lMSVRZX0xPQ0ssMywxLCIlcyAlcyAlc1xuIiwgIlNDIiwgcGluLCAiMTEiKTsKKyAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX1FVRVJZX0ZBQ0lMSVRZX0xPQ0ssMyxkZWZhdWx0X2NudCwxLCIlcyAlcyAlc1xuIiwgIlNDIiwgcGluLCAiMTEiKTsKICAgICBpZihyZXMgIT0gMCkKICAgICB7CiAgICAgICAgIFJMT0dEKCJmdW5jdGlvbiAlcyBleGVjdXRlIGVycm9yIiwgX19GVU5DVElPTl9fKTsKQEAgLTQyNCw3ICs0NjUsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFBhcmNlbCBwOwotICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfRU5URVJfU0lNX1BJTiwxLDEsIiVzXG4iLCBwaW4pOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfRU5URVJfU0lNX1BJTiwxLGRlZmF1bHRfY250LDEsIiVzXG4iLCBwaW4pOwogICAgIGlmKHJlcyAhPSAwKQogICAgIHsKICAgICAgICAgUkxPR0QoImZ1bmN0aW9uICVzIGV4ZWN1dGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDQ2LDcgKzQ4Nyw3IEBACiAgICAgaWYoIXN0cmxlbihvbGRfcGluKSkKICAgICAgICAgcmV0dXJuIHJlczsKICAgICBQYXJjZWwgcDsKLSAgICByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfQ0hBTkdFX1NJTV9QSU4sMiwxLCIlcyAlc1xuIiwgb2xkX3BpbiwgbmV3X3Bpbik7CisgICAgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX0NIQU5HRV9TSU1fUElOLDIsZGVmYXVsdF9jbnQsMSwiJXMgJXNcbiIsIG9sZF9waW4sIG5ld19waW4pOwogICAgIGlmKHJlcyAhPSAwKQogICAgIHsKICAgICAgICAgUkxPR0QoImZ1bmN0aW9uICVzIGV4ZWN1dGUgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDYzLDcgKzUwNCw3IEBACiAgICAgaWYocHVrID09IE5VTEwgfHwgcGluID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX0VOVEVSX1NJTV9QVUssMiwxLCIlcyAlc1xuIiwgcHVrLCBwaW4pOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfRU5URVJfU0lNX1BVSywyLGRlZmF1bHRfY250LDEsIiVzICVzXG4iLCBwdWssIHBpbik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC01NDAsNyArNTgxLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX09FTV9IT09LX1JBVywxLDEsIiVzXG4iLCAiQVQrQ05VTSIpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfT0VNX0hPT0tfUkFXLDEsZGVmYXVsdF9jbnQsMSwiJXNcbiIsICJBVCtDTlVNIik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC01NjYsNyArNjA3LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX0RFVklDRV9JREVOVElUWSwwLDEsIiIpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfREVWSUNFX0lERU5USVRZLDAsZGVmYXVsdF9jbnQsMSwiIik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC01ODcsNyArNjI4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX0RFVklDRV9JREVOVElUWSwwLDEsIiIpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfREVWSUNFX0lERU5USVRZLDAsZGVmYXVsdF9jbnQsMSwiIik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC02MzksNiArNjgwLDEwNSBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgbHlucV9zZXRfZGVmYXVsdF9zaW0oY29uc3QgaW50IHNsb3QpCit7CisgICAgaWYoZ19seW5xX3NpbV9pbml0X2ZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIFJMT0dFKCJjYW5gdCBpbml0IFNJTSBtb2R1bGUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZighanVkZ2Uoc2xvdCkpCisgICAgeworICAgICAgICBSTE9HRCgiaXMgbm90IDAgb3IgMSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBzZW5kX251bSA9IDA7CisgICAgbHlucV9jbGllbnRfdCBjbGllbnRfdDsKKyAgICBjbGllbnRfdC5yZXF1ZXN0ID0gTFlOUV9SRVFVRVNUX1NFVF9ERUZBVUxUX1NJTV9BTEw7CisgICAgY2xpZW50X3QucGFyYW1MZW4gPSAxOworICAgIGNsaWVudF90LnVUb2tlbiA9IEdsb2JhbF91VG9rZW47CisgICAgc3ByaW50ZihjbGllbnRfdC5wYXJhbSwgIiVkXG4iLCBzbG90KTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfbHlucV9zaW1fc2VuZHRvX211dGV4KTsKKyAgICBzZW5kX251bSA9IHNlbmR0byhzb2NrX2ZkLCAmY2xpZW50X3QsIHNpemVvZihjbGllbnRfdCksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkcl9zZXJ2LCBsZW5fYWRkcl9zZXJ2KTsKKyAgICBpZihzZW5kX251bSA8IDApCisgICAgeworICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgc2VuZHRvIGVycm9yOiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2x5bnFfc2ltX3NlbmR0b19tdXRleCk7CisgICAgICAgIHJldHVybiBzZW5kX251bTsKKyAgICB9CisKKyAgICBpZih3YWl0QWxsb3dEYXRhU2lnbmFsKFNJTV9BTExPV19EQVRBX1RJTUVPVVQpID09IEVUSU1FRE9VVCkKKyAgICB7CisgICAgICAgIExZRVJSTE9HKCJ0aW1lb3V0OndhaXQgYWxsb3cgZGF0YSBmYWlsISEhIik7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2x5bnFfc2ltX3NlbmR0b19tdXRleCk7CisgICAgICAgIHJldHVybiBMWU5RX0VfVElNRV9PVVQ7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2x5bnFfc2ltX3NlbmR0b19tdXRleCk7CisgICAgTFlFUlJMT0coInNpbSBhbGxvdyBkYXRhIHZhbHVlICVkIixzX3NpbV9hbGxvd19kYXRhX3ZhbHVlKTsKKyAgICByZXR1cm4gc19zaW1fYWxsb3dfZGF0YV92YWx1ZTsKK30KKworCitpbnQgbHlucV9zZXRfZGVmYXVsdF9zaW1fZXhjZXB0X2RhdGEoY29uc3QgaW50IHNsb3QpCit7CisgICAgUkxPR0QoIkVudGVyICVzIixfX0ZVTkNUSU9OX18pOworCisgICAgaWYoZ19seW5xX3NpbV9pbml0X2ZsYWcgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBSTE9HRCgiU2xvdCBpcyAlZCIsc2xvdCk7CisKKyAgICBpZighanVkZ2Uoc2xvdCkpCisgICAgeworICAgICAgICBSTE9HRCgiaXMgbm90IDAgb3IgMSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IHNlbmRfbnVtID0gMDsKKyAgICBQYXJjZWwgcDsKKyAgICBSTE9HRCgic2VuZCBMWU5RX1JFUVVFU1RfU0VUX0RFRkFVTFRfU0lNX0FMTF9FWENFUFRfREFUQSIpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsTFlOUV9SRVFVRVNUX1NFVF9ERUZBVUxUX1NJTV9BTExfRVhDRVBUX0RBVEEsMSxkZWZhdWx0X2NudCwxLCIlZCIsc2xvdCk7CisgICAgaWYocmVzICE9IDApCisgICAgeworICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIAorICAgIHJldHVybiAwOworfQorCisKKworaW50IGx5bnFfZ2V0X2RlZmF1bHRfc2ltX2FsbChpbnQgKmJpdF9zbG90KQoreworICAgIFJMT0dEKCJFbnRlciAlcyIsX19GVU5DVElPTl9fKTsKKworICAgIGludCBzaW1fZXhjZXB0X2RhdGEgPSAwOworICAgIGludCBzaW1fZGF0YSA9IDA7CisKKyAgICBpZihnX2x5bnFfc2ltX2luaXRfZmxhZyA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludCBzZW5kX251bSA9IDA7CisgICAgUGFyY2VsIHA7CisgICAgCisgICAgUkxPR0QoInNlbmQgTFlOUV9SRVFVRVNUX0dFVF9ERUZBVUxUX1NJTV9BTEwiKTsKKyAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLExZTlFfUkVRVUVTVF9HRVRfREVGQVVMVF9TSU1fQUxMLDAsZGVmYXVsdF9jbnQsMSwiIik7CisgICAgaWYocmVzICE9IDApCisgICAgeworICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcC5yZWFkSW50MzIoYml0X3Nsb3QpOworICAgIHJldHVybiAwOworfQorCisKIGludCBseW5xX3N3aXRjaF9jYXJkKGludCBzbG90KXsKICAgICBpZihnX2x5bnFfc2ltX2luaXRfZmxhZyA9PSAwKQogICAgIHsKQEAgLTY1MCw3ICs3OTAsNyBAQAogICAgIGx5bnFfY2xpZW50X3QgY2xpZW50X3Q7CiAgICAgY2xpZW50X3QucmVxdWVzdCA9IExZTlFfUkVRVUVTVF9TRVRfREVGQVVMVF9TSU1fQUxMOwogICAgIGNsaWVudF90LnBhcmFtTGVuID0gMTsKLSAgICBjbGllbnRfdC51VG9rZW4gPSBHbG9iYWxfdVRva2VuOworICAgIGNsaWVudF90LnVUb2tlbiA9IGdldF91dG9rZW4oKTsKICAgICBzcHJpbnRmKGNsaWVudF90LnBhcmFtLCAiJWRcbiIsIHNsb3QpOwogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19seW5xX3NpbV9zZW5kdG9fbXV0ZXgpOwogICAgIHNlbmRfbnVtID0gc2VuZHRvKHNvY2tfZmQsICZjbGllbnRfdCwgc2l6ZW9mKGNsaWVudF90KSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX3NlcnYsIGxlbl9hZGRyX3NlcnYpOyAvL2JlY2F1c2UgcmlsIG9mIGlkID0gLTEKQEAgLTY3NSw3ICs4MTUsNyBAQAogICAgIGlmKCFqdWRnZShudW0pKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgUGFyY2VsIHA7Ci0gICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9TQ1JFRU5fU1RBVEUsMSwyLCIlZFxuIixudW0pOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfU0NSRUVOX1NUQVRFLDEsZGVmYXVsdF9jbnQsMiwiJWRcbiIsbnVtKTsKICAgICBpZihyZXMgIT0gMCkKICAgICB7CiAgICAgICAgIFJMT0dEKCJmdW5jdGlvbiAlcyBleGVjdXRlIGVycm9yIiwgX19GVU5DVElPTl9fKTsKQEAgLTY5Nyw3ICs4MzcsNyBAQAogICAgIGlmKCFqdWRnZShudW0pKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgUGFyY2VsIHA7Ci0gICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9SQURJT19QT1dFUiwxLDIsIiVkXG4iLG51bSk7CisgICAgaW50IHJlcyA9IGx5bnFfc2VuZF9jb21tb25fcmVxdWVzdCgmcCxSSUxfUkVRVUVTVF9SQURJT19QT1dFUiwxLGRlZmF1bHRfY250LDIsIiVkXG4iLG51bSk7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC03ODAsNyArOTIwLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQYXJjZWwgcDsKLSAgICBpbnQgcmVzID0gbHlucV9zZW5kX2NvbW1vbl9yZXF1ZXN0KCZwLFJJTF9SRVFVRVNUX1NJTV9JTyw5LDEsIiVkICVkICVzICVkICVkICVkICVzICVzICVzXG4iLCBsaXN0WzBdLCBsaXN0WzFdLCBwYXRoLCBsaXN0WzJdLCBsaXN0WzNdLCBsaXN0WzRdLCBkYXRhX2J1ZiwgcGluMl9idWYsIGFpZFB0cl9idWYpOworICAgIGludCByZXMgPSBseW5xX3NlbmRfY29tbW9uX3JlcXVlc3QoJnAsUklMX1JFUVVFU1RfU0lNX0lPLDksZGVmYXVsdF9jbnQsMSwiJWQgJWQgJXMgJWQgJWQgJWQgJXMgJXMgJXNcbiIsIGxpc3RbMF0sIGxpc3RbMV0sIHBhdGgsIGxpc3RbMl0sIGxpc3RbM10sIGxpc3RbNF0sIGRhdGFfYnVmLCBwaW4yX2J1ZiwgYWlkUHRyX2J1Zik7CiAgICAgaWYocmVzICE9IDApCiAgICAgewogICAgICAgICBSTE9HRCgiZnVuY3Rpb24gJXMgZXhlY3V0ZSBlcnJvciIsIF9fRlVOQ1RJT05fXyk7CkBAIC04MjIsNyArOTYyLDcgQEAKICAgICBseW5xX2NsaWVudF90IGNsaWVudF90OwogICAgIGNsaWVudF90LnJlcXVlc3QgPSBSSUxfUkVRVUVTVF9PRU1fSE9PS19SQVc7CiAgICAgY2xpZW50X3QucGFyYW1MZW4gPSAxOwotICAgIGNsaWVudF90LnVUb2tlbiA9IEdsb2JhbF91VG9rZW47CisgICAgY2xpZW50X3QudVRva2VuID0gZ2V0X3V0b2tlbigpOwogICAgIHNwcmludGYoY2xpZW50X3QucGFyYW0sICIlc1xuIiwgIkFUK0xSU1RNRCIpOwogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19seW5xX3NpbV9zZW5kdG9fbXV0ZXgpOwogICAgIHNlbmRfbnVtID0gc2VuZHRvKHNvY2tfZmQsICZjbGllbnRfdCwgc2l6ZW9mKGNsaWVudF90KSwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyX3NlcnYsIGxlbl9hZGRyX3NlcnYpOy8vYmVjYXVzZSByZXNwb25zZSBub3QgYnkgcmlsIGNhbGxiYWNrCkBAIC05MTQsMyArMTA1NCwyOCBAQAogICAgIHJldHVybiAwOwogfQogCit2b2lkIHVyY19tc2dfcHJvY2VzcyhQYXJjZWwgKnApCit7CisgICAgaW50IHJlc3BfdHlwZTsKKyAgICBpbnQgdXJjaWQ7CisgICAgaW50IHNsb3RfaWQ7CisgICAgaW50IGVycm9yX2NvZGU7CisKKyAgICBpbnQgc2l6ZT1wLT5kYXRhU2l6ZSgpOworICAgIHAtPnJlYWRJbnQzMigmcmVzcF90eXBlKTsKKyAgICBwLT5yZWFkSW50MzIoJnVyY2lkKTsKKyAgICBwLT5yZWFkSW50MzIoJnNsb3RfaWQpOworICAgIExZSU5GTE9HKCIlcyB1cmMgaWQgPSAlZCwgc2xvdF9pZCA9ICVkLCBzaXplIGlzICVkIixfX2Z1bmNfXywgdXJjaWQsc2xvdF9pZCxzaXplKTsKKyAgICBzd2l0Y2ggKHVyY2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBMWU5RX1VSQ19BTExPV19EQVRBOi8vbmV3IHNtcyByZWNlaXZlZAorICAgICAgICB7CisgICAgICAgICAgICBMWUlORkxPRygiKioqKioqKioqKioqKio6cmVzcF90eXBlPSVkLHVyY2lkPSVkLHNsb3RfaWQ9JWQiLHJlc3BfdHlwZSx1cmNpZCxzbG90X2lkKTsKKyAgICAgICAgICAgIHAtPnJlYWRJbnQzMigmZXJyb3JfY29kZSk7CisgICAgICAgICAgICBzZW5kQWxsb3dEYXRhU2lnbmFsKGVycm9yX2NvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL3NyYy9seW5xX3NpbV91cmMuY3BwIGIvTFlOUV9QVUJMSUMvY29tbW9uX3NyYy9saWIvbGlibHlucS1zaW0vc3JjL2x5bnFfc2ltX3VyYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGFlZTFkMwotLS0gL2Rldi9udWxsCisrKyBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL3NyYy9seW5xX3NpbV91cmMuY3BwCkBAIC0wLDAgKzEsMTczIEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvanN0cmluZy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlbmRvci1yaWwvdGVsZXBob255L3JpbC5oPgorI2luY2x1ZGUgPHZlbmRvci1yaWwvdGVsZXBob255L210a19yaWxfc3AuaD4KKyNpbmNsdWRlICJsaWJsb2cvbHlucV9kZWZsb2cuaCIKKyNpbmNsdWRlICJseW5xX3NpbV91cmMuaCIKKworaW50IG1vZHVsZV9sZW5fdXJjX2FkZHJfc2VydjsKK3N0cnVjdCBzb2NrYWRkcl9pbiBtb2R1bGVfdXJjX2FkZHJfc2VydjsKK3N0YXRpYyBpbnQgbW9kdWxlX3VyY19zb2NrX2ZkID0gLTE7CitpbnQgbW9kdWxlX3VyY19zdGF0dXMgPSAxOworcHRocmVhZF90IG1vZHVsZV91cmNfdGlkID0gLTE7CisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3Qgc19Qcm9jZXNzVXJjTXNnQmxvY2tNdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjZGVmaW5lIEJMT0NLX1BST0NFU1NfVVJDX01TR19JTklUKCkgcHRocmVhZF9tdXRleF9pbml0KCZzX1Byb2Nlc3NVcmNNc2dCbG9ja011dGV4LE5VTEwpCisjZGVmaW5lIEJMT0NLX1BST0NFU1NfVVJDX01TR19MT0NLKCkgcHRocmVhZF9tdXRleF9sb2NrKCZzX1Byb2Nlc3NVcmNNc2dCbG9ja011dGV4KQorI2RlZmluZSBCTE9DS19QUk9DRVNTX1VSQ19NU0dfVU5MT0NLKCkgcHRocmVhZF9tdXRleF91bmxvY2soJnNfUHJvY2Vzc1VyY01zZ0Jsb2NrTXV0ZXgpCisKK2Jvb2wgaXNfc3VwcG9ydF91cmMoaW50IHVyY19pZCkKK3sKKyAgICBzd2l0Y2godXJjX2lkKQorICAgIHsKKyAgICAgICAgY2FzZSBMWU5RX1VSQ19BTExPV19EQVRBOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkICp0aHJlYWRfdXJjX3JlY3Yodm9pZCAqcCkKK3sKKyAgICBQYXJjZWwgKnVyY19wID1OVUxMOworICAgIGNoYXIgdXJjX2RhdGFbTFlOUV9SRUNfQlVGXTsKKyAgICBpbnQgcmVzID0gMDsKKyAgICBseW5xX2hlYWRfdCogcGhlYWQ7CisgICAgTFlJTkZMT0coInVyYyByZWN2IHRocmVhZCBpcyBydW5uaW5nIik7CisgICAgd2hpbGUobW9kdWxlX3VyY19zdGF0dXMpCisgICAgeworICAgICAgICBiemVybyh1cmNfZGF0YSxMWU5RX1JFQ19CVUYpOworICAgICAgICByZXMgPSByZWN2ZnJvbShtb2R1bGVfdXJjX3NvY2tfZmQsdXJjX2RhdGEsc2l6ZW9mKHVyY19kYXRhKSwwLChzdHJ1Y3Qgc29ja2FkZHIgKikmbW9kdWxlX3VyY19hZGRyX3NlcnYsKHNvY2tsZW5fdCopJm1vZHVsZV9sZW5fdXJjX2FkZHJfc2Vydik7CisgICAgICAgIGlmKHJlczxzaXplb2YoaW50MzJfdCkqMikKKyAgICAgICAgeworICAgICAgICAgICAgTFlFUlJMT0coInRocmVhZF91cmNfcmVjdiBzdGVwMiBmYWlsOiByZXMgaXMgJWQiLHJlcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHBoZWFkPShseW5xX2hlYWRfdCopIHVyY19kYXRhOworICAgICAgICBpZihpc19zdXBwb3J0X3VyYyhwaGVhZC0+dXJjaWQpPT1mYWxzZSkKKyAgICAgICAgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdXJjX3AgPSBuZXcgUGFyY2VsKCk7CisgICAgICAgIGlmKHVyY19wID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIExZRVJSTE9HKCJuZXcgcGFyY2VsIGZhaWx1cmUhISEiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHVyY19wLT5zZXREYXRhKCh1aW50OF90ICopdXJjX2RhdGEscmVzKTsgLy8gcC5zZXREYXRhKCh1aW50OF90ICopIGJ1ZmZlciwgYnVmbGVuKTsKKyAgICAgICAgdXJjX3AtPnNldERhdGFQb3NpdGlvbigwKTsKKyAgICAgICAgaWYodXJjX3AtPmRhdGFBdmFpbCgpPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVyY19tc2dfcHJvY2Vzcyh1cmNfcCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAKKyAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlIHVyY19wOworICAgICAgICAgICAgdXJjX3AgPSBOVUxMOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgTFlJTkZMT0coInVyYyByZWN2IHRocmVhZCBlbmRlZCIpOworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIGx5bnFfY2xvc2VfdXJjX3Jldl90aHJlYWQoKQoreworICAgIGludCByZXQ7CisKKyAgICBCTE9DS19QUk9DRVNTX1VSQ19NU0dfTE9DSygpOyAgLy9qdXN0IGNhbmNlbCB1cmMgcHJvY2VzcyB0aWQgd2hlbiByZWN2IGZyb20KKyAgICBtb2R1bGVfdXJjX3N0YXR1cyA9IDA7CisgICAgaWYobW9kdWxlX3VyY190aWQhPS0xKQorICAgIHsKKyAgICAgICAgcmV0ID0gcHRocmVhZF9jYW5jZWwobW9kdWxlX3VyY190aWQpOworICAgICAgICBMWUlORkxPRygicHRocmVhZCBjYW5jZWwgdXJjIHJldiByZXQgPSAlZCIscmV0KTsKKyAgICB9CisgICAgQkxPQ0tfUFJPQ0VTU19VUkNfTVNHX1VOTE9DSygpOworICAgIGlmKG1vZHVsZV91cmNfdGlkICE9IC0xKQorICAgIHsKKyAgICAgICAgcmV0ID0gcHRocmVhZF9qb2luKG1vZHVsZV91cmNfdGlkLE5VTEwpOworICAgICAgICBMWUlORkxPRygicHRocmVhZCBqb2luIHVyYyB0aWQgcmV0ID0gJWQiLHJldCk7CisgICAgICAgIG1vZHVsZV91cmNfdGlkID0tMTsKKyAgICB9Cit9CisKK3ZvaWQgbHlucV9jbG9zZV91cmNfc29ja2V0KCkKK3sKKyAgICBpZiAobW9kdWxlX3VyY19zb2NrX2ZkID49IDApCisgICAgeworICAgICAgICBjbG9zZShtb2R1bGVfdXJjX3NvY2tfZmQpOworICAgICAgICBtb2R1bGVfdXJjX3NvY2tfZmQgPS0xOworICAgIH0KK30KKworaW50IGx5bnFfc2V0dXBfdXJjX3NvY2tldCgpCit7CisgICAgaW50IG9uID0gMTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBtb2R1bGVfbGVuX3VyY19hZGRyX3NlcnYgPSBzaXplb2Yoc29ja2FkZHJfaW4pOworICAgIG1vZHVsZV91cmNfc29ja19mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKyAgICBpZiAobW9kdWxlX3VyY19zb2NrX2ZkIDwwKXsKKyAgICAgICAgTFlFUlJMT0coInVyYyBzb2NrZXQgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIFJFU1VMVF9FUlJPUjsgIAorICAgIH0KKyAgICBtb2R1bGVfdXJjX2FkZHJfc2Vydi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICBtb2R1bGVfdXJjX2FkZHJfc2Vydi5zaW5fcG9ydCA9IGh0b25zKExZTlFfVVJDX1NFUlZJQ0VfUE9SVCk7CisgICAgbW9kdWxlX3VyY19hZGRyX3NlcnYuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKExZTlFfVVJDX0FERFJFU1MpOworICAgIC8qIFNldCBzb2NrZXQgdG8gYWxsb3cgcmV1c2Ugb2YgYWRkcmVzcyBhbmQgcG9ydCwgU09fUkVVU0VBRERSIHZhbHVlIGlzIDIqLworICAgIHJldCA9IHNldHNvY2tvcHQobW9kdWxlX3VyY19zb2NrX2ZkLFNPTF9TT0NLRVQsU09fUkVVU0VBRERSLCZvbixzaXplb2Ygb24pOworICAgIGlmKHJldCA8MCkKKyAgICB7CisgICAgICAgIExZRVJSTE9HKCJ1cmMgc29ja2V0IHNldCBlcnJvciIpOworICAgICAgICBjbG9zZShtb2R1bGVfdXJjX3NvY2tfZmQpOworICAgICAgICBtb2R1bGVfdXJjX3NvY2tfZmQgPS0xOworICAgICAgICByZXR1cm4gUkVTVUxUX0VSUk9SOyAgCisgICAgfQorICAgIHJldCA9IGJpbmQobW9kdWxlX3VyY19zb2NrX2ZkICwoc3RydWN0IHNvY2thZGRyKikmbW9kdWxlX3VyY19hZGRyX3NlcnYsIHNpemVvZihtb2R1bGVfdXJjX2FkZHJfc2VydikpOworICAgIGlmKHJldCA8MCkKKyAgICB7CisgICAgICAgIExZRVJSTE9HKCJ1cmMgc29ja2V0IGJpbmQgZXJyb3IiKTsKKyAgICAgICAgY2xvc2UobW9kdWxlX3VyY19zb2NrX2ZkKTsKKyAgICAgICAgbW9kdWxlX3VyY19zb2NrX2ZkID0tMTsKKyAgICAgICAgcmV0dXJuIFJFU1VMVF9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIFJFU1VMVF9PSzsKK30KKworaW50IGx5bnFfc3RhcnRfYWxsX3VyY19zb2NrZXRfdGhyZWFkKCkKK3sKKyAgICBpbnQgcmV0PSBseW5xX3NldHVwX3VyY19zb2NrZXQoKTsKKyAgICBpZihyZXQhPVJFU1VMVF9PSykKKyAgICB7CisgICAgICAgIExZRVJSTE9HKCJjYWxsIGx5bnFfc2V0dXBfdXJjX3NvY2tldCBmYWlsIik7CisgICAgICAgIHJldHVybiBSRVNVTFRfRVJST1I7CisgICAgfQorCisgICAgbW9kdWxlX3VyY19zdGF0dXMgPSAxOworICAgIHJldCA9IHB0aHJlYWRfY3JlYXRlKCZtb2R1bGVfdXJjX3RpZCxOVUxMLHRocmVhZF91cmNfcmVjdixOVUxMKTsKKyAgICBpZihyZXQgPDApCisgICAgeworICAgICAgICBMWUVSUkxPRygidXJjIHJlY3YgcHRocmVhZCBjcmVhdGUgZXJyb3IiKTsKKyAgICAgICAgbW9kdWxlX3VyY19zdGF0dXMgPSAwOworICAgICAgICBseW5xX2Nsb3NlX3VyY19zb2NrZXQoKTsKKyAgICAgICAgcmV0dXJuIFJFU1VMVF9FUlJPUjsKKyAgICB9CisgICAgTFlJTkZMT0coInVyYyBzdGFydCBzdWNjZXNzIik7CisgICAgcmV0dXJuIFJFU1VMVF9PSzsgIAorfQorCit2b2lkIGx5bnFfY2xvc2VfYWxsX3VyY19zb2NrZXRfdGhyZWFkKCkKK3sKKyAgICBseW5xX2Nsb3NlX3VyY19yZXZfdGhyZWFkKCk7CisgICAgbHlucV9jbG9zZV91cmNfc29ja2V0KCk7CisgICAgTFlFUlJMT0coImNsb3NlIGFsbCB1cmMgc29ja2V0IHRocmVhZCEhISIpOworfQorCmRpZmYgLS1naXQgYS9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2xpYi9saWJseW5xLXNpbS9zcmMvbHlucV9zaW1fdXJjLmggYi9MWU5RX1BVQkxJQy9jb21tb25fc3JjL2xpYi9saWJseW5xLXNpbS9zcmMvbHlucV9zaW1fdXJjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTE3MzMxMQotLS0gL2Rldi9udWxsCisrKyBiL0xZTlFfUFVCTElDL2NvbW1vbl9zcmMvbGliL2xpYmx5bnEtc2ltL3NyYy9seW5xX3NpbV91cmMuaApAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSAibHlucV9pbnRlcmZhY2UuaCIKK3VzaW5nIDo6YW5kcm9pZDo6UGFyY2VsOworCisjZGVmaW5lIExZTlFfQUREUkVTUyAiMTI3LjAuMC4xIgorI2RlZmluZSBMWU5RX1VSQ19TRVJWSUNFX1BPUlQgODA4NgorI2lmZGVmIEdTV19SSUxfQ0ZHCisjZGVmaW5lIExZTlFfVVJDX0FERFJFU1MgIjEyNy4yNTUuMjU1LjI1NSIgLypob25nLmxpdSBjaGFuZ2UgYnJvYWRjYXN0IGFkZHIgb24gMjAyNC4yLjE4Ki8KKyNlbHNlCisjZGVmaW5lIExZTlFfVVJDX0FERFJFU1MgIjAuMC4wLjAiCisjZW5kaWYKKyNkZWZpbmUgTFlOUV9SRUNfQlVGIDgxOTIKKworI2RlZmluZSBSRVNVTFRfT0sgKDApCisjZGVmaW5lIFJFU1VMVF9FUlJPUiAoLTEpCisKK3R5cGVkZWYgc3RydWN0eworICAgIGludCByZXNwX3R5cGU7CisgICAgaW50IHVyY2lkOyAgIAorfWx5bnFfaGVhZF90OworCit2b2lkIHVyY19tc2dfcHJvY2VzcyhQYXJjZWwgKnApOworaW50IGx5bnFfc3RhcnRfYWxsX3VyY19zb2NrZXRfdGhyZWFkKCk7Cit2b2lkIGx5bnFfY2xvc2VfYWxsX3VyY19zb2NrZXRfdGhyZWFkKCk7CmRpZmYgLS1naXQgYS9tZXRhLXNkay9tZXRhL21ldGEtbHlucVNESy1UODAwL3JlY2lwZXMtY3VzdG9tZXIvc2ltLWRlbW8vZmlsZXMvc2ltLWRlbW8uY3BwIGIvbWV0YS1zZGsvbWV0YS9tZXRhLWx5bnFTREstVDgwMC9yZWNpcGVzLWN1c3RvbWVyL3NpbS1kZW1vL2ZpbGVzL3NpbS1kZW1vLmNwcAppbmRleCA4N2IyMWE2Li43MjlkN2E4IDEwMDc1NQotLS0gYS9tZXRhLXNkay9tZXRhL21ldGEtbHlucVNESy1UODAwL3JlY2lwZXMtY3VzdG9tZXIvc2ltLWRlbW8vZmlsZXMvc2ltLWRlbW8uY3BwCisrKyBiL21ldGEtc2RrL21ldGEvbWV0YS1seW5xU0RLLVQ4MDAvcmVjaXBlcy1jdXN0b21lci9zaW0tZGVtby9maWxlcy9zaW0tZGVtby5jcHAKQEAgLTMwLDYgKzMwLDkgQEAKIGludCAoKmx5bnFfc2ltX3Bvd2VyKShpbnQgbW9kZSk7CiBpbnQgKCpseW5xX3Jlc2V0X21vZGVtKSh2b2lkKTsKIGludCAoKmx5bnFfc2NyZWVuKShpbnQgbnVtKTsKK2ludCAoKmx5bnFfc2V0X2RlZmF1bHRfc2ltKShjb25zdCBpbnQgc2xvdCk7CitpbnQgKCpseW5xX3NldF9kZWZhdWx0X3NpbV9leGNlcHRfZGF0YSkoY29uc3QgaW50IHNsb3QpOworaW50ICgqbHlucV9nZXRfZGVmYXVsdF9zaW1fYWxsKShpbnQgKmJpdF9zbG90KTsKIAogCiBpbnQgZmxhZ19pbml0ID0gMDsKQEAgLTQxLDE1ICs0NCwxNSBAQAogCiBzdF9hcGlfdGVzdF9jYXNlIGFwaV90ZXN0Y2FzZXNbXSA9IAogewotICAgIHswLCAgICAibHlucV9zaW1faW5pdCJ9LAotICAgIHsxLCAgICAibHlucV9lbmFibGVfcGluIn0sCi0gICAgezIsICAgICJseW5xX2Rpc2FibGVfcGluIn0sCi0gICAgezQsICAgICJseW5xX2dldF9pY2NpZCJ9LAotICAgIHs1LCAgICAibHlucV9xdWVyeV9waW5fbG9jayJ9LAotICAgIHs2LCAgICAibHlucV92ZXJpZnlfcGluIn0sCi0gICAgezcsICAgICJseW5xX2NoYW5nZV9waW4ifSwKLSAgICB7OCwgICAgImx5bnFfdW5sb2NrX3BpbiJ9LAotICAgIHs5LCAgICAibHlucV9xdWVyeV9waG9uZV9udW1iZXIifSwKKyAgICB7MCwgICAgICJseW5xX3NpbV9pbml0In0sCisgICAgezEsICAgICAibHlucV9lbmFibGVfcGluIn0sCisgICAgezIsICAgICAibHlucV9kaXNhYmxlX3BpbiJ9LAorICAgIHs0LCAgICAgImx5bnFfZ2V0X2ljY2lkIn0sCisgICAgezUsICAgICAibHlucV9xdWVyeV9waW5fbG9jayJ9LAorICAgIHs2LCAgICAgImx5bnFfdmVyaWZ5X3BpbiJ9LAorICAgIHs3LCAgICAgImx5bnFfY2hhbmdlX3BpbiJ9LAorICAgIHs4LCAgICAgImx5bnFfdW5sb2NrX3BpbiJ9LAorICAgIHs5LCAgICAgImx5bnFfcXVlcnlfcGhvbmVfbnVtYmVyIn0sCiAgICAgezEwLCAgICAibHlucV9nZXRfaW1zaSJ9LAogICAgIHsxMSwgICAgImx5bnFfZ2V0X3NpbV9zdGF0dXMifSwKICAgICB7MTIsICAgICJseW5xX3NpbV9kZWluaXQifSwKQEAgLTYxLDYgKzY0LDkgQEAKICAgICB7MTgsICAgICJseW5xX3NpbV9wb3dlciJ9LAogICAgIHsxOSwgICAgImx5bnFfcmVzZXRfbW9kZW0ifSwKICAgICB7MjAsICAgICJseW5xX3NjcmVlbiJ9LAorICAgIHsyMSwgICAgImx5bnFfc2V0X2RlZmF1bHRfc2ltIn0sCisgICAgezIyLCAgICAibHlucV9zZXRfZGVmYXVsdF9zaW1fZXhjZXB0X2RhdGEifSwKKyAgICB7MjMsICAgICJseW5xX2dldF9kZWZhdWx0X3NpbV9hbGwifSwKICAgICB7LTEsICAgIE5VTEx9CiB9OwogCkBAIC01ODksNiArNTk1LDY2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAyMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBseW5xX3NldF9kZWZhdWx0X3NpbSA9IChpbnQgKCopKGludCkpZGxzeW0oZGxIYW5kbGVfc2ltLCJseW5xX3NldF9kZWZhdWx0X3NpbSIpOworICAgICAgICAgICAgICAgIGlmKE5VTEwgIT0gbHlucV9zZXRfZGVmYXVsdF9zaW0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2xvdDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnB1dCBzbG90XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwgJnNsb3QpOworICAgICAgICAgICAgICAgICAgICByZXMgPSBseW5xX3NldF9kZWZhdWx0X3NpbShzbG90KTsKKyAgICAgICAgICAgICAgICAgICAgaWYocmVzID09IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigibHlucV9zZXRfZGVmYXVsdF9zaW0gc3VjY2Vzc1xuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImx5bnFfc2V0X2RlZmF1bHRfc2ltIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMjI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbHlucV9zZXRfZGVmYXVsdF9zaW1fZXhjZXB0X2RhdGEgPSAoaW50ICgqKShpbnQpKWRsc3ltKGRsSGFuZGxlX3NpbSwibHlucV9zZXRfZGVmYXVsdF9zaW1fZXhjZXB0X2RhdGEiKTsKKyAgICAgICAgICAgICAgICBpZihOVUxMICE9IGx5bnFfc2V0X2RlZmF1bHRfc2ltX2V4Y2VwdF9kYXRhKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNsb3Q7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5wdXQgc2xvdFxuIik7CisgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlZCIsICZzbG90KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gbHlucV9zZXRfZGVmYXVsdF9zaW1fZXhjZXB0X2RhdGEoc2xvdCk7CisgICAgICAgICAgICAgICAgICAgIGlmKHJlcyA9PSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImx5bnFfc2V0X2RlZmF1bHRfc2ltX2V4Y2VwdF9kYXRhIHN1Y2Nlc3NcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJseW5xX3NldF9kZWZhdWx0X3NpbV9leGNlcHRfZGF0YSBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDIzOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGx5bnFfZ2V0X2RlZmF1bHRfc2ltX2FsbCA9IChpbnQgKCopKGludCAqYml0X3Nsb3QpKWRsc3ltKGRsSGFuZGxlX3NpbSwibHlucV9nZXRfZGVmYXVsdF9zaW1fYWxsIik7CisgICAgICAgICAgICAgICAgaWYoTlVMTCAhPSBseW5xX2dldF9kZWZhdWx0X3NpbV9hbGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYml0X3Nsb3Q7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGx5bnFfZ2V0X2RlZmF1bHRfc2ltX2FsbCgmYml0X3Nsb3QpOworICAgICAgICAgICAgICAgICAgICBpZihyZXMgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJCSVQwOm90aGVyIHNlcnZpY2Ugc2xvdDtCSVQxOmRhdGEgY2FsbCBzbG90XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQklUMD0lZFxuIiwoYml0X3Nsb3QmKDE8PDApKT8gMSA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJCSVQxPSVkXG4iLChiaXRfc2xvdCYoMTw8MSkpPyAxIDogMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImx5bnFfZ2V0X2RlZmF1bHRfc2ltX2FsbCBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZsYWcgPSAxOyAgICAgICAgLyogZXhpdCAqLwo=