ZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tdS5jIGIvYXJjaC9hcm0vbW11LmMKaW5kZXggNzRlOWVjZC4uOTRmY2Q0MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW11LmMKKysrIGIvYXJjaC9hcm0vbW11LmMKQEAgLTQ5LDExICs0OSwxMSBAQAogCXVpbnQgQ0I7CiAJdWludCBURVggPSAwOwogCi0jaWYgZGVmaW5lZChQTEFURk9STV9NU003SykKKyNpZiAoZGVmaW5lZChQTEFURk9STV9NU003SykgfHwgZGVmaW5lZChQTEFURk9STV9NU003WDI3QSkpCiAJaWYgKChwYWRkciA+PSAweDg4MDAwMDAwKSAmJiAocGFkZHIgPCAweEQwMDAwMDAwKSkgewotICAgICAgICAgICAgLyogcGVyaXBoZXJhbHMgaW4gdGhlIDB4ODgwMDAwMDAgLSAweEQwMDAwMDAwIHJhbmdlIG11c3QKLSAgICAgICAgICAgICAqIGJlIG1hcHBlZCBhcyBERVZJQ0UgTk9OLVNIQVJFRDogVEVYPTIsIEM9MCwgQj0wCi0gICAgICAgICAgICAgKi8KKwkJLyogcGVyaXBoZXJhbHMgaW4gdGhlIDB4ODgwMDAwMDAgLSAweEQwMDAwMDAwIHJhbmdlIG11c3QKKwkJICogYmUgbWFwcGVkIGFzIERFVklDRSBOT04tU0hBUkVEOiBURVg9MiwgQz0wLCBCPTAKKwkJICovCiAJCVRFWCA9IDI7CiAJCWZsYWdzICY9ICh+KE1NVV9GTEFHX0NBQ0hFRCB8IE1NVV9GTEFHX0JVRkZFUkVEKSk7CiAJfQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vbXNtN3gyN2EvYWNwdWNsb2NrLmMgYi9wbGF0Zm9ybS9tc203eDI3YS9hY3B1Y2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MWI5ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvcGxhdGZvcm0vbXNtN3gyN2EvYWNwdWNsb2NrLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqCXRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqCWRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKKyAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8a2VybmVsL3RocmVhZC5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL2lvbWFwLmg+CisjaW5jbHVkZSA8cmVnLmg+CisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQorCisjZGVmaW5lIEExMVNfQ0xLX0NOVExfQUREUgkoTVNNX0NTUl9CQVNFICsgMHgxMDApCisjZGVmaW5lIEExMVNfQ0xLX1NFTF9BRERSCShNU01fQ1NSX0JBU0UgKyAweDEwNCkKKyNkZWZpbmUgVkREX1NWU19QTEVWRUxfQUREUgkoTVNNX0NTUl9CQVNFICsgMHgxMjQpCisjZGVmaW5lIFBMTDJfTF9WQUxfQUREUgkJKE1TTV9DTEtfQ1RMX0JBU0UgKyAweDMzQykKKworI2RlZmluZSBTUkNfU0VMX1BMTDEJMSAvKiBQTEwxLiAqLworI2RlZmluZSBTUkNfU0VMX1BMTDIJMiAvKiBQTEwyLiAqLworI2RlZmluZSBTUkNfU0VMX1BMTDMJMyAvKiBQTEwzLiBVc2VkIGZvciA3eDI1LiAqLworI2RlZmluZSBESVZfNAkJMworI2RlZmluZSBESVZfMgkJMQorI2RlZmluZSBXQUlUX0NOVAkxMDAKKyNkZWZpbmUgVkREX0xFVkVMCTcKKyNkZWZpbmUgTUlOX0FYSV9IWgkxMjAwMDAwMDAKKyNkZWZpbmUgQUNQVV84MDBNSFoJNDEKKwordm9pZCBwbGxfcmVxdWVzdCh1bnNpZ25lZCBwbGwsIHVuc2lnbmVkIGVuYWJsZSk7Cit2b2lkIGF4aV9jbG9ja19pbml0KHVuc2lnbmVkIHJhdGUpOworCisvKiBUaGUgc3RlcHBpbmcgZnJlcXVlbmNpZXMgaGF2ZSBiZWVuIGNob29zZW4gdG8gbWFrZSBzdXJlIHRoZSBzdGVwCisgKiBpcyA8PSAyNTYgTUh6IGZvciBib3RoIHR1cmJvIG1vZGUgYW5kIG5vcm1hbCBtb2RlIHRhcmdldHMuICBUaGUKKyAqIHRhYmxlIGFsc28gYXNzdW1lcyB0aGUgQUNQVSBpcyBydW5uaW5nIGF0IFRDWE8gZnJlcSBhbmQgQUhCIGRpdiBpcworICogc2V0IHRvIERJVl8xLgorICoKKyAqIFRvIHVzZSB0aGUgdGFibGVzOgorICogLSBTdGFydCBhdCBsb2NhdGlvbiAwLzEgZGVwZW5kaW5nIG9uIGNsb2NrIHNvdXJjZSBzZWwgYml0LgorICogLSBTZXQgdmFsdWVzIHRpbGwgZW5kIG9mIHRhYmxlIHNraXBwaW5nIGV2ZXJ5IG90aGVyIGVudHJ5LgorICogLSBXaGVuIHlvdSByZWFjaCB0aGUgZW5kIG9mIHRoZSB0YWJsZSwgeW91IGFyZSBkb25lIHNjYWxpbmcuCisgKgorICogVE9ETzogTmVlZCB0byBmaXggU1JDX1NFTF9QTEwxIGZvciA3eDI1LgorICovCisKK3VpbnQzMl90IGNvbnN0IGNsa19jbnRsX3JlZ192YWxfNzYyNVtdID0geworCShXQUlUX0NOVCA8PCAxNikgfCAoU1JDX1NFTF9QTEwxIDw8IDQpICB8IERJVl80LAorCShXQUlUX0NOVCA8PCAxNikgfCAoU1JDX1NFTF9QTEwxIDw8IDEyKSB8IChESVZfNCA8PCA4KSwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMSA8PCAxMikgfCAoRElWXzIgPDwgOCksCisJKFdBSVRfQ05UIDw8IDE2KSB8IChTUkNfU0VMX1BMTDEgPDwgNCkgfCBESVZfMiwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMyA8PCA0KSAgfCBESVZfMiwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMyA8PCAxMikgfCAoRElWXzIgPDwgOCksCit9OworCit1aW50MzJfdCBjb25zdCBjbGtfY250bF9yZWdfdmFsXzc2MjdbXSA9IHsKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMSA8PCA0KSAgfCBESVZfNCwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMSA8PCAxMikgfCAoRElWXzQgPDwgOCksCisJKFdBSVRfQ05UIDw8IDE2KSB8IChTUkNfU0VMX1BMTDEgPDwgMTIpIHwgKERJVl8yIDw8IDgpLAorCShXQUlUX0NOVCA8PCAxNikgfCAoU1JDX1NFTF9QTEwxIDw8IDQpIHwgRElWXzIsCisJKFdBSVRfQ05UIDw8IDE2KSB8IChTUkNfU0VMX1BMTDIgPDwgNCkgIHwgRElWXzIsCisJKFdBSVRfQ05UIDw8IDE2KSB8IChTUkNfU0VMX1BMTDIgPDwgMTIpIHwgKERJVl8yIDw8IDgpLAorfTsKKwordWludDMyX3QgY29uc3QgY2xrX2NudGxfcmVnX3ZhbF83NjI3VFtdID0geworCShXQUlUX0NOVCA8PCAxNikgfCAoU1JDX1NFTF9QTEwxIDw8IDQpICB8IERJVl80LAorCShXQUlUX0NOVCA8PCAxNikgfCAoU1JDX1NFTF9QTEwxIDw8IDEyKSB8IChESVZfNCA8PCA4KSwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMSA8PCAxMikgfCAoRElWXzIgPDwgOCksCisJKFdBSVRfQ05UIDw8IDE2KSB8IChTUkNfU0VMX1BMTDEgPDwgNCkgfCBESVZfMiwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMiA8PCA0KSwKKwkoV0FJVF9DTlQgPDwgMTYpIHwgKFNSQ19TRUxfUExMMiA8PCAxMiksCit9OworCisvKiBVc2luZyBESVZfNCBmb3IgYWxsIGNhc2VzIHRvIGF2b2lkIHdvcnJ5aW5nIGFib3V0IHR1cmJvIHZzLiBub3JtYWwKKyAqIG1vZGUuIEFibGUgdG8gdXNlIERJVl80IGZvciBhbGwgc3RlcHMgYmVjYXVzZSBpdCdzIHRoZSBsYXJnZXN0IEFORAorICogdGhlIGZpbmFsIHZhbHVlLiAqLwordWludDMyX3QgY29uc3QgY2xrX3NlbF9yZWdfdmFsW10gPSB7CisJRElWXzQgPDwgMSB8IDEsCisJRElWXzQgPDwgMSB8IDAsCisJRElWXzQgPDwgMSB8IDAsCisJRElWXzQgPDwgMSB8IDEsCisJRElWXzQgPDwgMSB8IDEsCisJRElWXzQgPDwgMSB8IDAsCit9OworCit2b2lkIG1kZWxheSh1bnNpZ25lZCBtc2Vjcyk7CisKKwordm9pZCBhY3B1X2Nsb2NrX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpLGNsazsKKworI2lmICghRU5BQkxFX05BTkRXUklURSkKKwkJaW50ICptb2RlbV9zdGF0X2NoZWNrID0gKE1TTV9TSEFSRURfQkFTRSArIDB4MTQpOworCisJCS8qIFdhaXQgZm9yIG1vZGVtIHRvIGJlIHJlYWR5IGJlZm9yZSBjbG9jayBpbml0ICovCisJCXdoaWxlIChyZWFkbChtb2RlbV9zdGF0X2NoZWNrKSAhPSAxKTsKKyNlbmRpZgorCisJLyogSW5jcmVhc2UgVkREIGxldmVsIHRvIHRoZSBmaW5hbCB2YWx1ZS4gKi8KKwl3cml0ZWwoKDEgPDwgNykgfCAoVkREX0xFVkVMIDw8IDMpLCBWRERfU1ZTX1BMRVZFTF9BRERSKTsKKyNpZiAoIUVOQUJMRV9OQU5EV1JJVEUpCisJdGhyZWFkX3NsZWVwKDEpOworI2Vsc2UKKwkJbWRlbGF5KDEpOworI2VuZGlmCisKKwkvKiBSZWFkIGNsb2NrIHNvdXJjZSBzZWxlY3QgYml0LiAqLworCWkgPSByZWFkbChBMTFTX0NMS19TRUxfQUREUikgJiAxOworCWNsayA9IHJlYWRsKFBMTDJfTF9WQUxfQUREUikgJiAweDNGOworCisJLyogSnVtcCBpbnRvIHRhYmxlIGFuZCBzZXQgZXZlcnkgb3RoZXIgZW50cnkuICovCisJZm9yKDsgaSA8IEFSUkFZX1NJWkUoY2xrX2NudGxfcmVnX3ZhbF83NjI3KTsgaSArPSAyKSB7CisjaWZkZWYgRU5BQkxFX1BMTDMKKwkJd3JpdGVsKGNsa19jbnRsX3JlZ192YWxfNzYyNVtpXSwgQTExU19DTEtfQ05UTF9BRERSKTsKKyNlbHNlCisJCWlmKGNsayA9PSBBQ1BVXzgwME1IWikKKwkJCXdyaXRlbChjbGtfY250bF9yZWdfdmFsXzc2MjdUW2ldLCBBMTFTX0NMS19DTlRMX0FERFIpOworCQllbHNlCisJCQl3cml0ZWwoY2xrX2NudGxfcmVnX3ZhbF83NjI3W2ldLCBBMTFTX0NMS19DTlRMX0FERFIpOworI2VuZGlmCisJCS8qIFdvdWxkIG5lZWQgYSBkbWIoKSBoZXJlIGJ1dCB0aGUgd2hvbGUgYWRkcmVzcyBzcGFjZSBpcworCQkgKiBzdHJvbmdseSBvcmRlcmVkLCBzbyBpdCBzaG91bGQgYmUgZmluZS4KKwkJICovCisJCXdyaXRlbChjbGtfc2VsX3JlZ192YWxbaV0sIEExMVNfQ0xLX1NFTF9BRERSKTsKKyNpZiAoIUVOQUJMRV9OQU5EV1JJVEUpCisJCXRocmVhZF9zbGVlcCgxKTsKKyNlbHNlCisJCW1kZWxheSgxKTsKKyNlbmRpZgorCX0KK30KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL21zbTd4MjdhL2FyY2hfaW5pdC5TIGIvcGxhdGZvcm0vbXNtN3gyN2EvYXJjaF9pbml0LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0YTdjNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL21zbTd4MjdhL2FyY2hfaW5pdC5TCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqCXRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqCWRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICoJbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKglzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKKyAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworLmdsb2JsIFNFVF9TQQorU0VUX1NBOgorCQkvLzsgcm91dGluZSBjb21wbGV0ZQorCQlCCSAgIF9jcHVfZWFybHlfaW5pdF9jb21wbGV0ZQorLmx0b3JnCisKKy5nbG9ibCBfX2NwdV9lYXJseV9pbml0CitfX2NwdV9lYXJseV9pbml0OgorCQkvLzsgWmVybyBvdXQgcjAgZm9yIHVzZSB0aHJvdWdob3V0IHRoaXMgY29kZS4gQWxsIG90aGVyIEdQUnMKKwkJLy87IChyMS1yMykgYXJlIHNldCB0aHJvdWdob3V0IHRoaXMgY29kZSB0byBoZWxwIGVzdGFibGlzaAorCQkvLzsgYSBjb25zaXN0ZW50IHN0YXJ0dXAgc3RhdGUgZm9yIGFueSBjb2RlIHRoYXQgZm9sbG93cy4KKwkJLy87IFVzZXJzIHNob3VsZCBhZGQgY29kZSBhdCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSB0byBlc3RhYmxpc2gKKwkJLy87IHRoZWlyIG93biBzdGFjayBhZGRyZXNzIChyMTMpLCBhZGQgdHJhbnNsYXRpb24gcGFnZSB0YWJsZXMsIGVuYWJsZQorCQkvLzsgdGhlIGNhY2hlcywgZXRjLgorCQlNT1YJcjAsICAjMHgwCisKKworCQkvLzsgUmVtb3ZlIGhhcmRjb2RlZCBjYWNoZSBzZXR0aW5ncy4gYXBwc2JsX2hhbmRsZXIucyBjYWxscyBTZXRfU0EKKwkJLy87ICAgQVBJIHRvIGR5bmFtaWNhbGx5IGNvbmZpZ3VyZSBjYWNoZSBmb3Igc2xvdy9ub21pbmFsL2Zhc3QgcGFydHMKKworCisJCS8vOyBJbml0aWFsaXplIEFTSUQgdG8gemVybworCQlNQ1IJcDE1LCAwLCByMCwgYzEzLCBjMCwgMSAgIC8vOyBXQ1AxNV9DT05URVhUSURSIHIwCisKKwkJLy87IElDSUFMTCB0byBpbnZhbGlkYXRlIGVudGlyZSBJLUNhY2hlCisJCU1DUglwMTUsIDAsIHIwLCBjNywgYzUsIDAJLy87IElDSUFMTFUKKworCQkvLzsgSW5pdGlhbGl6ZSBBREZTUiB0byB6ZXJvCisJCU1DUglwMTUsIDAsIHIwLCBjNSwgYzEsIDAJLy87IEFERlNSICAgcjAKKworCQkvLzsgRW5zdXJlIHRoZSBNQ1IncyBhYm92ZSBoYXZlIGNvbXBsZXRlZCB0aGVpciBvcGVyYXRpb24gYmVmb3JlIGNvbnRpbnVpbmcKKwkJRFNCCisJCUlTQgorCisJCS8vOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJLy87IFRoZXJlIGFyZSBhIG51bWJlciBvZiByZWdpc3RlcnMgdGhhdCBtdXN0IGJlIHNldCBwcmlvciB0byBlbmFibGluZworCQkvLzsgdGhlIE1NVS4gVGhlIERDQVIgaXMgb25lIG9mIHRoZXNlIHJlZ2lzdGVycy4gV2UgYXJlIHNldHRpbmcKKwkJLy87IGl0IHRvIHplcm8gKG5vIGFjY2VzcykgdG8gZWFzaWx5IGRldGVjdCBpbXByb3BlciBzZXR1cCBpbiBzdWJzZXF1ZW50CisJCS8vOyBjb2RlIHNlcXVlbmNlcworCQkvLzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCS8vOyBTZXR1cCBEQUNSIChEb21haW4gQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIpIHRvIHplcm8KKwkJTUNSCXAxNSwgMCwgcjAsIGMzLCBjMCwgMAkvLzsgV0NQMTVfREFDUiAgcjAKKworCQkvLztNYWtlIHN1cmUgVExCTEtDUiBpcyBjb21wbGV0ZSBiZWZvcmUgY29udGludWluZworCQlJU0IKKworCQkvLzsgSW52YWxpZGF0ZSB0aGUgVVRMQgorCQlNQ1IJcDE1LCAwLCByMCwgYzgsIGM3LCAwCSAgLy87IFVUTEJJQUxMCisKKwkJLy87IE1ha2Ugc3VyZSBVVExCIHJlcXVlc3QgaGFzIGJlZW4gcHJlc2VudGVkIHRvIG1hY3JvIGJlZm9yZSBjb250aW51aW5nCisJCUlTQgorCitTWVNJMjoKKwkJLy87IEVuYWJsZSBaIGJpdCB0byBlbmFibGUgYnJhbmNoIHByZWRpY3Rpb24gKGRlZmF1bHQgaXMgb2ZmKQorCQlNUkMJcDE1LCAwLCByMiwgYzEsIGMwLCAwCSAgLy87IFJDUDE1X1NDVExSICByMgorCQlPUlIJcjIsIHIyLCAjMHgwMDAwMDgwMAorCQlNQ1IJcDE1LCAwLCByMiwgYzEsIGMwLCAwCSAgLy87IFdDUDE1X1NDVExSICByMgorCisJCS8vOyBNYWtlIHN1cmUgTGluayBzdGFjayBpcyBpbml0aWFsaXplZCB3aXRoIGJyYW5jaCBhbmQgbGlua3MgdG8gc2VxdWVudGlhbCBhZGRyZXNzZXMKKwkJLy87IFRoaXMgYWlkcyBpbiBjcmVhdGluZyBhIHByZWRpY3RhYmxlIHN0YXJ0dXAgZW52aXJvbm1lbnQKKwkJQkwJICBTRVExCitTRVExOiAgIEJMCSAgU0VRMgorU0VRMjogICBCTAkgIFNFUTMKK1NFUTM6ICAgQkwJICBTRVE0CitTRVE0OiAgIEJMCSAgU0VRNQorU0VRNTogICBCTAkgIFNFUTYKK1NFUTY6ICAgQkwJICBTRVE3CitTRVE3OiAgIEJMCSAgU0VROAorU0VRODoKKworCQlJU0IKKworCQkvLzsgSW5pdGlhbGl6ZSB0aGUgV2F0Y2hwb2ludCBDb250cm9sIFJlZ2lzdGVycyB0byB6ZXJvIChvcHRpb25hbCkKKwkJLy87OzsgTUNSCXAxNCwgMCwgcjAsIGMwLCBjMCwgNwkgICA7IFdDUDE0X0RCR1dDUjAgIHIwCisJCS8vOzs7IE1DUglwMTQsIDAsIHIwLCBjMCwgYzEsIDcJICAgOyBXQ1AxNF9EQkdXQ1IxICByMAorCisKKwkJLy87LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLzsgVGhlIHNhdmVkIFByb2dyYW0gU3RhdHVzIFJlZ2lzdGVycyAoU1BTUnMpIHNob3VsZCBiZSBzZXR1cAorCQkvLzsgcHJpb3IgdG8gYW55IGF1dG9tYXRpYyBtb2RlIHN3aXRjaGVzLiBUaGUgZm9sbG93aW5nCisJCS8vOyBjb2RlIHNldHMgdGhlc2UgcmVnaXN0ZXJzIHVwIHRvIGEga25vd24gc3RhdGUuIFVzZXJzIHdpbGwgbmVlZCB0bworCQkvLzsgY3VzdG9taXplIHRoZXNlIHNldHRpbmdzIHRvIG1lZXQgdGhlaXIgbmVlZHMuCisJCS8vOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJTU9WCXIyLCAgIzB4MWYKKwkJTU9WCXIxLCAgIzB4ZDcJCQkJIC8vO0FCVCBtb2RlCisJCW1zcgljcHNyX2MsIHIxCQkJCSAvLztBQlQgbW9kZQorCQltc3IJc3Bzcl9jeGZzLCByMgkJCSAgLy87Y2xlYXIgdGhlIHNwc3IKKwkJTU9WCXIxLCAgIzB4ZGIJCQkJIC8vO1VORCBtb2RlCisJCW1zcgljcHNyX2MsIHIxCQkJCSAvLztVTkQgbW9kZQorCQltc3IJc3Bzcl9jeGZzLCByMgkJCSAgLy87Y2xlYXIgdGhlIHNwc3IKKwkJTU9WCXIxLCAgIzB4ZDEJCQkJIC8vO0ZJUSBtb2RlCisJCW1zcgljcHNyX2MsIHIxCQkJCSAvLztGSVEgbW9kZQorCQltc3IJc3Bzcl9jeGZzLCByMgkJCSAgLy87Y2xlYXIgdGhlIHNwc3IKKwkJTU9WCXIxLCAgIzB4ZDIJCQkJIC8vO0lSUSBtb2RlCisJCW1zcgljcHNyX2MsIHIxCQkJCSAvLztJUlEgbW9kZQorCQltc3IJc3Bzcl9jeGZzLCByMgkJCSAgLy87Y2xlYXIgdGhlIHNwc3IKKwkJTU9WCXIxLCAgIzB4ZDYJCQkJIC8vO01vbml0b3IgbW9kZQorCQltc3IJY3Bzcl9jLCByMQkJCQkgLy87TW9uaXRvciBtb2RlCisJCW1zcglzcHNyX2N4ZnMsIHIyCQkJICAvLztjbGVhciB0aGUgc3BzcgorCQlNT1YJcjEsICAjMHhkMwkJCQkgLy87U1ZDIG1vZGUKKwkJbXNyCWNwc3JfYywgcjEJCQkJIC8vO1NWQyBtb2RlCisJCW1zcglzcHNyX2N4ZnMsIHIyCQkJICAvLztjbGVhciB0aGUgc3BzcgorCisKKwkJLy87LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkvLzsgRW5hYmxpbmcgRXJyb3IgcmVwb3J0aW5nIGlzIHNvbWV0aGluZyB1c2VycyBtYXkgd2FudCB0byBkbyBhdAorCQkvLzsgc29tZSBvdGhlciBwb2ludCBpbiB0aW1lLiBXZSBoYXZlIGNob3NlbiBzb21lIGRlZmF1bHQgc2V0dGluZ3MKKwkJLy87IHRoYXQgc2hvdWxkIGJlIHJldmlld2VkLiBNb3N0IG9mIHRoZXNlIHJlZ2lzdGVycyBjb21lIHVwIGluIGFuCisJCS8vOyB1bnByZWRpY3RhYmxlIHN0YXRlIGFmdGVyIHJlc2V0LgorCQkvLzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLztTdGFydCBvZiBlcnJvciBhbmQgY29udHJvbCBzZXR0aW5nCisKKworCQkvLzsgU2V0IEFDVExSIChyZXNldCB1bnByZWRpY3RhYmxlKQorCQkvLzsgU2V0IEFWSVZUIGNvbnRyb2wsIGVycm9yIHJlcG9ydGluZywgZXRjLgorCQkvLzsgTU9WICAgcjMsICMweDA3CisJCS8vOyBFbmFibGUgSSBhbmQgRCBjYWNoZSBwYXJpdHkKKwkJLy87QUNUTFJbMjowXSA9IDMnaDcgLSBlbmFibGUgcGFyaXR5IGVycm9yIHJlcG9ydGluZyBmcm9tIEwyL0kkL0QkKQorCQkvLztBQ1RMUls1OjRdID0gMidoMyAtIGVuYWJsZSBwYXJpdHkKKwkJLy87QUNUTFJbMTk6MThdID0yJ2gzIC0gYWx3YXlzIGdlbmVyYXRlIGFuZCBjaGVjayBwYXJpdHkod2hlbiBNTVUgZGlzYWJsZWQpLgorCQkvLztWYWx1ZSB0byBiZSB3cml0dGVuICMweEMwMDM3CisJCS8vIE1PVlcgICByMywgIzB4MDAzNworLy87IC53b3JkIDB4ZTMwMDMwMzcgIC8vIGhhcmRjb2RlZCBNT1ZXIGluc3RydWN0aW9uIGR1ZSB0byBsYWNrIG9mIGNvbXBpbGVyIHN1cHBvcnQKKwkJLy8gTU9WVCAgIHIzLCAjMHgwMDBDCisvLzsgLndvcmQgMHhlMzQwMzAwYyAgLy8gaGFyZGNvZGVkIE1PVlcgaW5zdHJ1Y3Rpb24gZHVlIHRvIGxhY2sgb2YgY29tcGlsZXIgc3VwcG9ydAorCQkvLzsgTUNSICAgcDE1LCAwLCByMywgYzEsIGMwLCAxCSAgLy87IFdDUDE1X0FDVExSICByMworCisvLztFbmQgb2YgZXJyb3IgYW5kIGNvbnRyb2wgc2V0dGluZworCisvKgorI2lmZGVmIEFQUFNCTF9FVE1fRU5BQkxFCisJCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCTsgT3B0aW9uYWxseSBFbmFibGUgdGhlIEVUTSAoRW1iZWRkZWQgVHJhY2UgTWFjcm8pIHdoaWNoIGlzIHVzZWQgZm9yIGRlYnVnCisJCTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKwkJOyBlbmFibGUgRVRNIGNsb2NrIGlmIGRpc2FibGVkCisJCU1SQyAgIHAxNSwgNywgcjEsIGMxNSwgYzAsIDUJICAgOyBSQ1AxNV9DUE1SCQkgICByMQorCQlPUlIgICByMSwgcjEsICMweDAwMDAwMDA4CisJCU1DUiAgIHAxNSwgNywgcjEsIGMxNSwgYzAsIDUJICAgOyBXQ1AxNV9DUE1SCQkgICByMQorCQlJU0IKKworCQk7IHNldCB0cmlnZ2VyIGV2ZW50IHRvIGNvdW50ZXIxIGJlaW5nIHplcm8KKwkJTU9WICAgcjMsICMweDAwMDAwMDQwCisJCU1DUiAgIHAxNCwgMSwgcjMsIGMwLCBjMiwgMAkJOyBXQ1AxNF9FVE1UUklHR0VSCSByMworCisJCTsgY2xlYXIgRVRNU1IKKwkJTU9WICAgcjIsICMweDAwMDAwMDAwCisJCU1DUiAgIHAxNCwgMSwgcjIsIGMwLCBjNCwgMAkJOyBXQ1AxNF9FVE1TUgkJICByMgorCisJCTsgY2xlYXIgdHJhY2UgZW5hYmxlIHNpbmdsZSBhZGRyZXNzIGNvbXBhcmF0b3IgdXNhZ2UKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGM3LCAwCQk7IFdDUDE0X0VUTVRFQ1IyCSAgIHIyCisKKwkJOyBzZXQgdHJhY2UgZW5hYmxlIHRvIGFsd2F5cworCQlNT1YgICByMiwgIzB4MDAwMDAwNkYKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGM4LCAwCQk7IFdDUDE0X0VUTVRFRVZSCSAgIHIyCisKKwkJOyBjbGVhciB0cmFjZSBlbmFibGUgYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yIHVzYWdlIGFuZCBleGNsdWRlIG5vdGhpbmcKKwkJTU9WICAgcjIsICMweDAxMDAwMDAwCisJCU1DUiAgIHAxNCwgMSwgcjIsIGMwLCBjOSwgMAkJOyBXQ1AxNF9FVE1URUNSMQkgICByMgorCisJCTsgc2V0IHZpZXcgZGF0YSB0byBhbHdheXMKKwkJTU9WICAgcjIsICMweDAwMDAwMDZGCisJCU1DUiAgIHAxNCwgMSwgcjIsIGMwLCBjMTIsIDAJICAgOyBXQ1AxNF9FVE1WREVWUgkgICByMgorCisJCTsgY2xlYXIgdmlldyBkYXRhIHNpbmdsZSBhZGRyZXNzIGNvbXBhcmF0b3IgdXNhZ2UKKwkJTU9WICAgcjIsICMweDAwMDAwMDAwCisJCU1DUiAgIHAxNCwgMSwgcjIsIGMwLCBjMTMsIDAJICAgOyAgV0NQMTRfRVRNVkRDUjEJICAgcjIKKworCQk7IGNsZWFyIHZpZXcgZGF0YSBhZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3IgdXNhZ2UgYW5kIGV4Y2x1ZGUgbm90aGluZworCQlNT1YgICByMiwgIzB4MDAwMTAwMDAKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGMxNSwgMAkgICA7ICBXQ1AxNF9FVE1WRENSMwkgICByMgorCisJCTsgc2V0IGNvdW50ZXIxIHRvIDE5NAorCQlNT1YgICByMiwgIzB4MDAwMDAwQzIKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGMwLCA1CQk7ICBXQ1AxNF9FVE1DTlRSTERWUjEgICByMgorCisJCTsgc2V0IGNvdW50ZXIxIHRvIG5ldmVyIHJlbG9hZAorCQlNT1YgICByMiwgIzB4MDAwMDQwNkYKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGM4LCA1CQk7ICBXQ1AxNF9FVE1DTlRSTERFVlIxICByMgorCisJCTsgc2V0IGNvdW50ZXIxIHRvIGRlY3JlbWVudCBldmVyeSBjeWNsZQorCQlNT1YgICByMiwgIzB4MDAwMDAwNkYKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGM0LCA1CQk7IFdDUDE0X0VUTUNOVEVOUjEJIHIyCisKKwkJOyBTZXQgdHJhY2Ugc3luY2hyb25pemF0aW9uIGZyZXF1ZW5jeSAxMDI0IGJ5dGVzCisJCU1PViAgIHIyLCAjMHgwMDAwMDQwMAorCQlNQ1IgICBwMTQsIDEsIHIyLCBjMCwgYzgsIDcJCTsgV0NQMTRfRVRNU1lOQ0ZSCSAgcjIKKworCQk7IFByb2dyYW0gZXRtIGNvbnRyb2wgcmVnaXN0ZXIKKwkJOyAgLSBTZXQgdGhlIENQVSB0byBFVE0gY2xvY2sgcmF0aW8gdG8gMToxCisJCTsgIC0gU2V0IHRoZSBFVE0gdG8gcGVyZm9ybSBkYXRhIGFkZHJlc3MgdHJhY2luZworCQlNT1YgICByMiwgIzB4MDAwMDIwMDgKKwkJTUNSICAgcDE0LCAxLCByMiwgYzAsIGMwLCAwCQk7IFdDUDE0X0VUTUNSCQkgIHIyCisJCUlTQgorI2VuZGlmICovLyogQVBQU0JMX0VUTV9FTkFCTEUgKi8KKworLyoKKyNpZmRlZiBBUFBTQkxfVkZQX0VOQUJMRQorCSAgIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICAgOyBQZXJmb3JtIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBpZiB5b3UgaW50ZW5kIHRvIG1ha2UgdXNlIG9mCisJICAgOyB0aGUgVkZQL05lb24gdW5pdC4gTm90ZSB0aGF0IHRoZSBGTVhSIGluc3RydWN0aW9uIHJlcXVpcmVzIGEgQ1BVIElECisJICAgOyBpbmRpY2F0aW5nIHRoZSBWRlAgdW5pdCBpcyBwcmVzZW50IChpLmUuQ29ydGV4LUE4KS4gLgorCSAgIDsgU29tZSB0b29scyB3aWxsIHJlcXVpcmUgZnVsbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQKKwkgICA7IHdoaWNoIHdpbGwgYmVjb21lIGF2YWlsYWJsZSBpbiBTY29ycGlvbiBwYXNzIDIKKwkgICA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgIDsgYWxsb3cgZnVsbCBhY2Nlc3MgdG8gQ1AgMTAgYW5kIDExIHNwYWNlIGZvciBWRlAvTkVPTiB1c2UKKwkJTVJDICAgcDE1LCAwLCByMSwgYzEsIGMwLCAyCQk7IFJlYWQgQ1AgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIKKwkJT1JSICAgcjEsIHIxLCAjMHgwMEYwMDAwMAkJICA7IGVuYWJsZSBmdWxsIGFjY2VzcyBmb3IgcDEwLDExCisJCU1DUiAgIHAxNSwgMCwgcjEsIGMxLCBjMCwgMgkJOyBXcml0ZSBDUEFDUgorCisJCTttYWtlIHN1cmUgdGhlIENQQUNSIGlzIGNvbXBsZXRlIGJlZm9yZSBjb250aW51aW5nCisJCUlTQgorCisJICAgOyBFbmFibGUgVkZQIGl0c2VsZiAoY2VydGFpbiBPU2VzIG1heSB3YW50IHRvIGR5bmFtaWNhbGx5IHNldC9jbGVhcgorCSAgIDsgdGhlIGVuYWJsZSBiaXQgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uIGJlaW5nIGV4ZWN1dGVkCisJCU1PViAgIHIxLCAjMHg0MDAwMDAwMAorCQlGTVhSICBGUEVYQywgcjEKKyNlbmRpZiAqLy8qIEFQUFNCTF9WRlBfRU5BQkxFICovCisKKwkJLyogd2UgaGF2ZSBubyBzdGFjaywgc28ganVzdCB0YWlsLWNhbGwgaW50byB0aGUgU0VUX1NBIHJvdXRpbmUuLi4gKi8KKworCQlCCSAgIFNFVF9TQQorLmx0b3JnCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9tc203eDI3YS9ncGlvLmMgYi9wbGF0Zm9ybS9tc203eDI3YS9ncGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZWZlYwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL21zbTd4MjdhL2dwaW8uYwpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICoJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICoJdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICoJZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPHJlZy5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL2lvbWFwLmg+CisjaW5jbHVkZSA8ZGV2L2dwaW8uaD4KKworI2RlZmluZSBHUElPMV9SRUcob2ZmKSAoTVNNX0dQSU8xX0JBU0UgKyAweDgwMCArIChvZmYpKQorI2RlZmluZSBHUElPMl9SRUcob2ZmKSAoTVNNX0dQSU8yX0JBU0UgKyAweEMwMCArIChvZmYpKQorCisvKiBvdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUgR1BJT19PVVRfMAkJIEdQSU8xX1JFRygweDAwKSAgLyogZ3BpbyAgMTUtMCAgKi8KKyNkZWZpbmUgR1BJT19PVVRfMQkJIEdQSU8yX1JFRygweDAwKSAgLyogZ3BpbyAgNDItMTYgKi8KKyNkZWZpbmUgR1BJT19PVVRfMgkJIEdQSU8xX1JFRygweDA0KSAgLyogZ3BpbyAgNjctNDMgKi8KKyNkZWZpbmUgR1BJT19PVVRfMwkJIEdQSU8xX1JFRygweDA4KSAgLyogZ3BpbyAgOTQtNjggKi8KKyNkZWZpbmUgR1BJT19PVVRfNAkJIEdQSU8xX1JFRygweDBDKSAgLyogZ3BpbyAxMDYtOTUgKi8KKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCisjZGVmaW5lIEdQSU9fT0VfMAkJICBHUElPMV9SRUcoMHgxMCkKKyNkZWZpbmUgR1BJT19PRV8xCQkgIEdQSU8yX1JFRygweDA4KQorI2RlZmluZSBHUElPX09FXzIJCSAgR1BJTzFfUkVHKDB4MTQpCisjZGVmaW5lIEdQSU9fT0VfMwkJICBHUElPMV9SRUcoMHgxOCkKKyNkZWZpbmUgR1BJT19PRV80CQkgIEdQSU8xX1JFRygweDFDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KKyNkZWZpbmUgR1BJT19JTl8wCQkgIEdQSU8xX1JFRygweDM0KQorI2RlZmluZSBHUElPX0lOXzEJCSAgR1BJTzJfUkVHKDB4MjApCisjZGVmaW5lIEdQSU9fSU5fMgkJICBHUElPMV9SRUcoMHgzOCkKKyNkZWZpbmUgR1BJT19JTl8zCQkgIEdQSU8xX1JFRygweDNDKQorI2RlZmluZSBHUElPX0lOXzQJCSAgR1BJTzFfUkVHKDB4NDApCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1lZGdlIDA9bGV2ZWwgaW50ZXJydXAgKi8KKyNkZWZpbmUgR1BJT19JTlRfRURHRV8wCUdQSU8xX1JFRygweDYwKQorI2RlZmluZSBHUElPX0lOVF9FREdFXzEJR1BJTzJfUkVHKDB4NTApCisjZGVmaW5lIEdQSU9fSU5UX0VER0VfMglHUElPMV9SRUcoMHg2NCkKKyNkZWZpbmUgR1BJT19JTlRfRURHRV8zCUdQSU8xX1JFRygweDY4KQorI2RlZmluZSBHUElPX0lOVF9FREdFXzQJR1BJTzFfUkVHKDB4NkMpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCisjZGVmaW5lIEdQSU9fSU5UX1BPU18wCSBHUElPMV9SRUcoMHg3MCkKKyNkZWZpbmUgR1BJT19JTlRfUE9TXzEJIEdQSU8yX1JFRygweDU4KQorI2RlZmluZSBHUElPX0lOVF9QT1NfMgkgR1BJTzFfUkVHKDB4NzQpCisjZGVmaW5lIEdQSU9fSU5UX1BPU18zCSBHUElPMV9SRUcoMHg3OCkKKyNkZWZpbmUgR1BJT19JTlRfUE9TXzQJIEdQSU8xX1JFRygweDdDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgR1BJT19JTlRfRU5fMAkgIEdQSU8xX1JFRygweDgwKQorI2RlZmluZSBHUElPX0lOVF9FTl8xCSAgR1BJTzJfUkVHKDB4NjApCisjZGVmaW5lIEdQSU9fSU5UX0VOXzIJICBHUElPMV9SRUcoMHg4NCkKKyNkZWZpbmUgR1BJT19JTlRfRU5fMwkgIEdQSU8xX1JFRygweDg4KQorI2RlZmluZSBHUElPX0lOVF9FTl80CSAgR1BJTzFfUkVHKDB4OEMpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgd3JpdGUgMSB0byBjbGVhciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgR1BJT19JTlRfQ0xFQVJfMCAgIEdQSU8xX1JFRygweDkwKQorI2RlZmluZSBHUElPX0lOVF9DTEVBUl8xICAgR1BJTzJfUkVHKDB4NjgpCisjZGVmaW5lIEdQSU9fSU5UX0NMRUFSXzIgICBHUElPMV9SRUcoMHg5NCkKKyNkZWZpbmUgR1BJT19JTlRfQ0xFQVJfMyAgIEdQSU8xX1JFRygweDk4KQorI2RlZmluZSBHUElPX0lOVF9DTEVBUl80ICAgR1BJTzFfUkVHKDB4OUMpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSBHUElPX0lOVF9TVEFUVVNfMCAgR1BJTzFfUkVHKDB4QTApCisjZGVmaW5lIEdQSU9fSU5UX1NUQVRVU18xICBHUElPMl9SRUcoMHg3MCkKKyNkZWZpbmUgR1BJT19JTlRfU1RBVFVTXzIgIEdQSU8xX1JFRygweEE0KQorI2RlZmluZSBHUElPX0lOVF9TVEFUVVNfMyAgR1BJTzFfUkVHKDB4QTgpCisjZGVmaW5lIEdQSU9fSU5UX1NUQVRVU180ICBHUElPMV9SRUcoMHhBQykKKwordHlwZWRlZiBzdHJ1Y3QgZ3Bpb3JlZ3MgZ3Bpb3JlZ3M7CisKK3N0cnVjdCBncGlvcmVncworeworCXVuc2lnbmVkIG91dDsKKwl1bnNpZ25lZCBpbjsKKwl1bnNpZ25lZCBpbnRfc3RhdHVzOworCXVuc2lnbmVkIGludF9jbGVhcjsKKwl1bnNpZ25lZCBpbnRfZW47CisJdW5zaWduZWQgaW50X2VkZ2U7CisJdW5zaWduZWQgaW50X3BvczsKKwl1bnNpZ25lZCBvZTsKK307CisKK3N0YXRpYyBncGlvcmVncyBHUElPX1JFR1NbXSA9IHsKKwl7CisJCS5vdXQgPQkJIEdQSU9fT1VUXzAsCisJCS5pbiA9CQkgIEdQSU9fSU5fMCwKKwkJLmludF9zdGF0dXMgPSAgR1BJT19JTlRfU1RBVFVTXzAsCisJCS5pbnRfY2xlYXIgPSAgIEdQSU9fSU5UX0NMRUFSXzAsCisJCS5pbnRfZW4gPQkgIEdQSU9fSU5UX0VOXzAsCisJCS5pbnRfZWRnZSA9CUdQSU9fSU5UX0VER0VfMCwKKwkJLmludF9wb3MgPQkgR1BJT19JTlRfUE9TXzAsCisJCS5vZSA9CQkgIEdQSU9fT0VfMCwKKwl9LAorCXsKKwkJLm91dCA9CQkgR1BJT19PVVRfMSwKKwkJLmluID0JCSAgR1BJT19JTl8xLAorCQkuaW50X3N0YXR1cyA9ICBHUElPX0lOVF9TVEFUVVNfMSwKKwkJLmludF9jbGVhciA9ICAgR1BJT19JTlRfQ0xFQVJfMSwKKwkJLmludF9lbiA9CSAgR1BJT19JTlRfRU5fMSwKKwkJLmludF9lZGdlID0JR1BJT19JTlRfRURHRV8xLAorCQkuaW50X3BvcyA9CSBHUElPX0lOVF9QT1NfMSwKKwkJLm9lID0JCSAgR1BJT19PRV8xLAorCX0sCisJeworCQkub3V0ID0JCSBHUElPX09VVF8yLAorCQkuaW4gPQkJICBHUElPX0lOXzIsCisJCS5pbnRfc3RhdHVzID0gIEdQSU9fSU5UX1NUQVRVU18yLAorCQkuaW50X2NsZWFyID0gICBHUElPX0lOVF9DTEVBUl8yLAorCQkuaW50X2VuID0JICBHUElPX0lOVF9FTl8yLAorCQkuaW50X2VkZ2UgPQlHUElPX0lOVF9FREdFXzIsCisJCS5pbnRfcG9zID0JIEdQSU9fSU5UX1BPU18yLAorCQkub2UgPQkJICBHUElPX09FXzIsCisJfSwKKwl7CisJCS5vdXQgPQkJIEdQSU9fT1VUXzMsCisJCS5pbiA9CQkgIEdQSU9fSU5fMywKKwkJLmludF9zdGF0dXMgPSAgR1BJT19JTlRfU1RBVFVTXzMsCisJCS5pbnRfY2xlYXIgPSAgIEdQSU9fSU5UX0NMRUFSXzMsCisJCS5pbnRfZW4gPQkgIEdQSU9fSU5UX0VOXzMsCisJCS5pbnRfZWRnZSA9CUdQSU9fSU5UX0VER0VfMywKKwkJLmludF9wb3MgPQkgR1BJT19JTlRfUE9TXzMsCisJCS5vZSA9CQkgIEdQSU9fT0VfMywKKwl9LAorCXsKKwkJLm91dCA9CQkgR1BJT19PVVRfNCwKKwkJLmluID0JCSAgR1BJT19JTl80LAorCQkuaW50X3N0YXR1cyA9ICBHUElPX0lOVF9TVEFUVVNfNCwKKwkJLmludF9jbGVhciA9ICAgR1BJT19JTlRfQ0xFQVJfNCwKKwkJLmludF9lbiA9CSAgR1BJT19JTlRfRU5fNCwKKwkJLmludF9lZGdlID0JR1BJT19JTlRfRURHRV80LAorCQkuaW50X3BvcyA9CSBHUElPX0lOVF9QT1NfNCwKKwkJLm9lID0JCSAgR1BJT19PRV80LAorCX0sCit9OworCitzdGF0aWMgZ3Bpb3JlZ3MgKmZpbmRfZ3Bpbyh1bnNpZ25lZCBuLCB1bnNpZ25lZCAqYml0KQoreworCWlmKG4gPiAxMDYpCisJCXJldHVybiAwOworCWlmKG4gPiA5NCkgeworCQkqYml0ID0gMSA8PCAobiAtIDk1KTsKKwkJcmV0dXJuIEdQSU9fUkVHUyArIDQ7CisJfQorCWlmKG4gPiA2NykgeworCQkqYml0ID0gMSA8PCAobiAtIDY4KTsKKwkJcmV0dXJuIEdQSU9fUkVHUyArIDM7CisJfQorCWlmKG4gPiA0MikgeworCQkqYml0ID0gMSA8PCAobiAtIDQzKTsKKwkJcmV0dXJuIEdQSU9fUkVHUyArIDI7CisJfQorCWlmKG4gPiAxNSkgeworCQkqYml0ID0gMSA8PCAobiAtIDE2KTsKKwkJcmV0dXJuIEdQSU9fUkVHUyArIDE7CisJfQorCSpiaXQgPSAxIDw8IG47CisJcmV0dXJuIEdQSU9fUkVHUyArIDA7Cit9CisKK2ludCBncGlvX2NvbmZpZyh1bnNpZ25lZCBuLCB1bnNpZ25lZCBmbGFncykKK3sKKwlncGlvcmVncyAqcjsKKwl1bnNpZ25lZCBiOworCXVuc2lnbmVkIHY7CisKKwlpZiAoKHIgPSBmaW5kX2dwaW8obiwgJmIpKSA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwl2ID0gcmVhZGwoci0+b2UpOworCWlmIChmbGFncyAmIEdQSU9fT1VUUFVUKSB7CisJCXdyaXRlbCh2IHwgYiwgci0+b2UpOworCX0gZWxzZSB7CisJCXdyaXRlbCh2ICYgKH5iKSwgci0+b2UpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBncGlvX3NldCh1bnNpZ25lZCBuLCB1bnNpZ25lZCBvbikKK3sKKwlncGlvcmVncyAqcjsKKwl1bnNpZ25lZCBiOworCXVuc2lnbmVkIHY7CisKKwlpZigociA9IGZpbmRfZ3BpbyhuLCAmYikpID09IDApCisJCXJldHVybjsKKworCXYgPSByZWFkbChyLT5vdXQpOworCWlmKG9uKSB7CisJCXdyaXRlbCh2IHwgYiwgci0+b3V0KTsKKwl9IGVsc2UgeworCQl3cml0ZWwodiAmICh+YiksIHItPm91dCk7CisJfQorfQorCitpbnQgZ3Bpb19nZXQodW5zaWduZWQgbikKK3sKKwlncGlvcmVncyAqcjsKKwl1bnNpZ25lZCBiOworCisJaWYoKHIgPSBmaW5kX2dwaW8obiwgJmIpKSA9PSAwKSByZXR1cm4gMDsKKworCXJldHVybiAocmVhZGwoci0+aW4pICYgYikgPyAxIDogMDsKK30KKwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vbXNtN3gyN2EvaW5jbHVkZS9wbGF0Zm9ybS9pb21hcC5oIGIvcGxhdGZvcm0vbXNtN3gyN2EvaW5jbHVkZS9wbGF0Zm9ybS9pb21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2Q5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9tc203eDI3YS9pbmNsdWRlL3BsYXRmb3JtL2lvbWFwLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICoJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICoJdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICoJZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKgltYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqCXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgX1BMQVRGT1JNX01TTTdLX0lPTUFQX0hfCisjZGVmaW5lIF9QTEFURk9STV9NU003S19JT01BUF9IXworCisjZGVmaW5lIE1TTV9HUElPMV9CQVNFCTB4QTkyMDAwMDAKKyNkZWZpbmUgTVNNX0dQSU8yX0JBU0UJMHhBOTMwMDAwMAorCisjZGVmaW5lIE1TTV9VQVJUMV9CQVNFCTB4QTlBMDAwMDAKKyNkZWZpbmUgTVNNX1VBUlQyX0JBU0UJMHhBOUIwMDAwMAorI2RlZmluZSBNU01fVUFSVDNfQkFTRQkweEE5QzAwMDAwCisKKyNkZWZpbmUgTVNNX1ZJQ19CQVNFCTB4QzAwMDAwMDAKKyNkZWZpbmUgTVNNX0dQVF9CQVNFCTB4QzAxMDAwMDAKKyNkZWZpbmUgTVNNX0NTUl9CQVNFCTB4QzAxMDAwMDAKKyNkZWZpbmUgTVNNX0NMS19DVExfQkFTRQkweEE4NjAwMDAwCisKKyNkZWZpbmUgTVNNX1NIQVJFRF9CQVNFIDB4MDAxMDAwMDAKKworI2RlZmluZSBNU01fU0RDMV9CQVNFICAgMHhBMDQwMDAwMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL21zbTd4MjdhL2luY2x1ZGUvcGxhdGZvcm0vaXJxcy5oIGIvcGxhdGZvcm0vbXNtN3gyN2EvaW5jbHVkZS9wbGF0Zm9ybS9pcnFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhNDFkNQotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL21zbTd4MjdhL2luY2x1ZGUvcGxhdGZvcm0vaXJxcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqCXRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqCWRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICoJbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKglzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKKyAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9QTEFURk9STV9NU003S19JUlFTX0hfCisjZGVmaW5lIF9QTEFURk9STV9NU003S19JUlFTX0hfCisKKyNkZWZpbmUgSU5UX0E5X00yQV8wCQkgMAorI2RlZmluZSBJTlRfQTlfTTJBXzEJCSAxCisjZGVmaW5lIElOVF9BOV9NMkFfMgkJIDIKKyNkZWZpbmUgSU5UX0E5X00yQV8zCQkgMworI2RlZmluZSBJTlRfQTlfTTJBXzQJCSA0CisjZGVmaW5lIElOVF9BOV9NMkFfNQkJIDUKKyNkZWZpbmUgSU5UX0E5X00yQV82CQkgNgorI2RlZmluZSBJTlRfR1BfVElNRVJfRVhQCSA3CisjZGVmaW5lIElOVF9ERUJVR19USU1FUl9FWFAgIDgKKyNkZWZpbmUgSU5UX1VBUlQxCQkJOQorI2RlZmluZSBJTlRfVUFSVDIJCQkxMAorI2RlZmluZSBJTlRfVUFSVDMJCQkxMQorI2RlZmluZSBJTlRfVUFSVDFfUlgJCSAxMgorI2RlZmluZSBJTlRfVUFSVDJfUlgJCSAxMworI2RlZmluZSBJTlRfVUFSVDNfUlgJCSAxNAorI2RlZmluZSBJTlRfVVNCX09URwkJICAxNQorI2RlZmluZSBJTlRfTURESV9QUkkJCSAxNgorI2RlZmluZSBJTlRfTURESV9FWFQJCSAxNworI2RlZmluZSBJTlRfTURESV9DTElFTlQJICAxOAorI2RlZmluZSBJTlRfTURQCQkJICAxOQorI2RlZmluZSBJTlRfR1JBUEhJQ1MJCSAyMAorI2RlZmluZSBJTlRfQURNX0FBUk0JCSAyMQorI2RlZmluZSBJTlRfQURTUF9BMTEJCSAyMgorI2RlZmluZSBJTlRfQURTUF9BOV9BMTEJICAyMworI2RlZmluZSBJTlRfU0RDMV8wCQkgICAyNAorI2RlZmluZSBJTlRfU0RDMV8xCQkgICAyNQorI2RlZmluZSBJTlRfU0RDMl8wCQkgICAyNgorI2RlZmluZSBJTlRfU0RDMl8xCQkgICAyNworI2RlZmluZSBJTlRfS0VZU0VOU0UJCSAyOAorI2RlZmluZSBJTlRfVENIU0NSTl9TU0JJCSAyOQorI2RlZmluZSBJTlRfVENIU0NSTjEJCSAzMAorI2RlZmluZSBJTlRfVENIU0NSTjIJCSAzMQorCisjZGVmaW5lIElOVF9HUElPX0dST1VQMQkgICgzMiArIDApCisjZGVmaW5lIElOVF9HUElPX0dST1VQMgkgICgzMiArIDEpCisjZGVmaW5lIElOVF9QV0JfSTJDCQkgICgzMiArIDIpCisjZGVmaW5lIElOVF9OQU5EX1dSX0VSX0RPTkUgICgzMiArIDMpCisjZGVmaW5lIElOVF9OQU5EX09QX0RPTkUJICgzMiArIDQpCisjZGVmaW5lIElOVF9TT0ZUUkVTRVQJCSgzMiArIDUpCisjZGVmaW5lIElOVF9QQlVTX0FSTTExCSAgICgzMiArIDYpCisjZGVmaW5lIElOVF9BWElfTVBVX1NNSQkgICgzMiArIDcpCisjZGVmaW5lIElOVF9BWElfTVBVX0VCSTEJICgzMiArIDgpCisjZGVmaW5lIElOVF9BRF9IU1NECQkgICgzMiArIDkpCisjZGVmaW5lIElOVF9BUk0xMV9QTQkJICgzMiArIDEwKQorI2RlZmluZSBJTlRfQVJNMTFfRE1BCQkoMzIgKyAxMSkKKyNkZWZpbmUgSU5UX1RTSUZfSVJRCQkgKDMyICsgMTIpCisjZGVmaW5lIElOVF9VQVJUMURNX0lSUQkgICgzMiArIDEzKQorI2RlZmluZSBJTlRfVUFSVDFETV9SWAkgICAoMzIgKyAxNCkKKyNkZWZpbmUgSU5UX1VTQl9IUwkJICAgKDMyICsgMTUpCisjZGVmaW5lIElOVF9TREMzXzAJCSAgICgzMiArIDE2KQorI2RlZmluZSBJTlRfU0RDM18xCQkgICAoMzIgKyAxNykKKyNkZWZpbmUgSU5UX1NEQzRfMAkJICAgKDMyICsgMTgpCisjZGVmaW5lIElOVF9TREM0XzEJCSAgICgzMiArIDE5KQorI2RlZmluZSBJTlRfVUFSVDJETV9SWAkgICAoMzIgKyAyMCkKKyNkZWZpbmUgSU5UX1VBUlQyRE1fSVJRCSAgKDMyICsgMjEpCisKKyNkZWZpbmUgTVNNX0lSUV9CSVQoaXJxKQkgKDEgPDwgKChpcnEpICYgMzEpKQorCisjZGVmaW5lIE5SX0lSUVMgNTQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9tc203eDI3YS9pbnRlcnJ1cHRzLmMgYi9wbGF0Zm9ybS9tc203eDI3YS9pbnRlcnJ1cHRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNGNkYwotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL21zbTd4MjdhL2ludGVycnVwdHMuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICoJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICoJdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICoJZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKgltYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqCXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxkZWJ1Zy5oPgorI2luY2x1ZGUgPGFyY2gvYXJtLmg+CisjaW5jbHVkZSA8cmVnLmg+CisjaW5jbHVkZSA8a2VybmVsL3RocmVhZC5oPgorI2luY2x1ZGUgPHBsYXRmb3JtL2ludGVycnVwdHMuaD4KKworI2luY2x1ZGUgPHBsYXRmb3JtL2lycXMuaD4KKyNpbmNsdWRlIDxwbGF0Zm9ybS9pb21hcC5oPgorCisjZGVmaW5lIFZJQ19SRUcob2ZmKSAoTVNNX1ZJQ19CQVNFICsgKG9mZikpCisKKyNkZWZpbmUgVklDX0lOVF9TRUxFQ1QwCSBWSUNfUkVHKDB4MDAwMCkgIC8qIDE6IEZJUSwgMDogSVJRICovCisjZGVmaW5lIFZJQ19JTlRfU0VMRUNUMQkgVklDX1JFRygweDAwMDQpICAvKiAxOiBGSVEsIDA6IElSUSAqLworI2RlZmluZSBWSUNfSU5UX0VOMAkJIFZJQ19SRUcoMHgwMDEwKQorI2RlZmluZSBWSUNfSU5UX0VOMQkJIFZJQ19SRUcoMHgwMDE0KQorI2RlZmluZSBWSUNfSU5UX0VOQ0xFQVIwCVZJQ19SRUcoMHgwMDIwKQorI2RlZmluZSBWSUNfSU5UX0VOQ0xFQVIxCVZJQ19SRUcoMHgwMDI0KQorI2RlZmluZSBWSUNfSU5UX0VOU0VUMAkgIFZJQ19SRUcoMHgwMDMwKQorI2RlZmluZSBWSUNfSU5UX0VOU0VUMQkgIFZJQ19SRUcoMHgwMDM0KQorI2RlZmluZSBWSUNfSU5UX1RZUEUwCSAgIFZJQ19SRUcoMHgwMDQwKSAgLyogMTogRURHRSwgMDogTEVWRUwgICovCisjZGVmaW5lIFZJQ19JTlRfVFlQRTEJICAgVklDX1JFRygweDAwNDQpICAvKiAxOiBFREdFLCAwOiBMRVZFTCAgKi8KKyNkZWZpbmUgVklDX0lOVF9QT0xBUklUWTAgICBWSUNfUkVHKDB4MDA1MCkgIC8qIDE6IE5FRywgMDogUE9TICovCisjZGVmaW5lIFZJQ19JTlRfUE9MQVJJVFkxICAgVklDX1JFRygweDAwNTQpICAvKiAxOiBORUcsIDA6IFBPUyAqLworI2RlZmluZSBWSUNfTk9fUEVORF9WQUwJIFZJQ19SRUcoMHgwMDYwKQorI2RlZmluZSBWSUNfSU5UX01BU1RFUkVOCVZJQ19SRUcoMHgwMDY0KSAgLyogMTogSVJRLCAyOiBGSVEJICovCisjZGVmaW5lIFZJQ19QUk9URUNUSU9OCSAgVklDX1JFRygweDAwNkMpICAvKiAxOiBFTkFCTEUJCSAgKi8KKyNkZWZpbmUgVklDX0NPTkZJRwkJICBWSUNfUkVHKDB4MDA2OCkgIC8qIDE6IFVTRSBBUk0xMTM2IFZJQyAqLworI2RlZmluZSBWSUNfSVJRX1NUQVRVUzAJIFZJQ19SRUcoMHgwMDgwKQorI2RlZmluZSBWSUNfSVJRX1NUQVRVUzEJIFZJQ19SRUcoMHgwMDg0KQorI2RlZmluZSBWSUNfRklRX1NUQVRVUzAJIFZJQ19SRUcoMHgwMDkwKQorI2RlZmluZSBWSUNfRklRX1NUQVRVUzEJIFZJQ19SRUcoMHgwMDk0KQorI2RlZmluZSBWSUNfUkFXX1NUQVRVUzAJIFZJQ19SRUcoMHgwMEEwKQorI2RlZmluZSBWSUNfUkFXX1NUQVRVUzEJIFZJQ19SRUcoMHgwMEE0KQorI2RlZmluZSBWSUNfSU5UX0NMRUFSMAkgIFZJQ19SRUcoMHgwMEIwKQorI2RlZmluZSBWSUNfSU5UX0NMRUFSMQkgIFZJQ19SRUcoMHgwMEI0KQorI2RlZmluZSBWSUNfU09GVElOVDAJCVZJQ19SRUcoMHgwMEMwKQorI2RlZmluZSBWSUNfU09GVElOVDEJCVZJQ19SRUcoMHgwMEM0KQorI2RlZmluZSBWSUNfSVJRX1ZFQ19SRAkgIFZJQ19SRUcoMHgwMEQwKSAgLyogcGVuZGluZyBpbnQgIyAqLworI2RlZmluZSBWSUNfSVJRX1ZFQ19QRU5EX1JEIFZJQ19SRUcoMHgwMEQ0KSAgLyogcGVuZGluZyB2ZWN0b3IgYWRkciAqLworI2RlZmluZSBWSUNfSVJRX1ZFQ19XUgkgIFZJQ19SRUcoMHgwMEQ4KQorI2RlZmluZSBWSUNfSVJRX0lOX1NFUlZJQ0UgIFZJQ19SRUcoMHgwMEUwKQorI2RlZmluZSBWSUNfSVJRX0lOX1NUQUNLCVZJQ19SRUcoMHgwMEU0KQorI2RlZmluZSBWSUNfVEVTVF9CVVNfU0VMCVZJQ19SRUcoMHgwMEU4KQorCitzdHJ1Y3QgaWhhbmRsZXIgeworCWludF9oYW5kbGVyIGZ1bmM7CisJdm9pZCAqYXJnOworfTsKKworc3RhdGljIHN0cnVjdCBpaGFuZGxlciBoYW5kbGVyW05SX0lSUVNdOworCit2b2lkIHBsYXRmb3JtX2luaXRfaW50ZXJydXB0cyh2b2lkKQoreworCXdyaXRlbCgweGZmZmZmZmZmLCBWSUNfSU5UX0NMRUFSMCk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIFZJQ19JTlRfQ0xFQVIxKTsKKwl3cml0ZWwoMCwgVklDX0lOVF9TRUxFQ1QwKTsKKwl3cml0ZWwoMCwgVklDX0lOVF9TRUxFQ1QxKTsKKwl3cml0ZWwoMHhmZmZmZmZmZiwgVklDX0lOVF9UWVBFMCk7CisJd3JpdGVsKDB4ZmZmZmZmZmYsIFZJQ19JTlRfVFlQRTEpOworCXdyaXRlbCgwLCBWSUNfQ09ORklHKTsKKwl3cml0ZWwoMSwgVklDX0lOVF9NQVNURVJFTik7Cit9CisKK2VudW0gaGFuZGxlcl9yZXR1cm4gcGxhdGZvcm1faXJxKHN0cnVjdCBhcm1faWZyYW1lICpmcmFtZSkKK3sKKwl1bnNpZ25lZCBudW07CisJZW51bSBoYW5kbGVyX3JldHVybiByZXQ7CisJbnVtID0gcmVhZGwoVklDX0lSUV9WRUNfUkQpOworCW51bSA9IHJlYWRsKFZJQ19JUlFfVkVDX1BFTkRfUkQpOworCWlmIChudW0gPiBOUl9JUlFTKQorCQlyZXR1cm4gMDsKKwl3cml0ZWwoMSA8PCAobnVtICYgMzEpLCAobnVtID4gMzEpID8gVklDX0lOVF9DTEVBUjEgOiBWSUNfSU5UX0NMRUFSMCk7CisJcmV0ID0gaGFuZGxlcltudW1dLmZ1bmMoaGFuZGxlcltudW1dLmFyZyk7CisJd3JpdGVsKDAsIFZJQ19JUlFfVkVDX1dSKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHBsYXRmb3JtX2ZpcShzdHJ1Y3QgYXJtX2lmcmFtZSAqZnJhbWUpCit7CisJUEFOSUNfVU5JTVBMRU1FTlRFRDsKK30KKworc3RhdHVzX3QgbWFza19pbnRlcnJ1cHQodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCByZWcgPSAodmVjdG9yID4gMzEpID8gVklDX0lOVF9FTkNMRUFSMSA6IFZJQ19JTlRfRU5DTEVBUjA7CisJdW5zaWduZWQgYml0ID0gMSA8PCAodmVjdG9yICYgMzEpOworCXdyaXRlbChiaXQsIHJlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IHVubWFza19pbnRlcnJ1cHQodW5zaWduZWQgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCByZWcgPSAodmVjdG9yID4gMzEpID8gVklDX0lOVF9FTlNFVDEgOiBWSUNfSU5UX0VOU0VUMDsKKwl1bnNpZ25lZCBiaXQgPSAxIDw8ICh2ZWN0b3IgJiAzMSk7CisJd3JpdGVsKGJpdCwgcmVnKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWdpc3Rlcl9pbnRfaGFuZGxlcih1bnNpZ25lZCBpbnQgdmVjdG9yLCBpbnRfaGFuZGxlciBmdW5jLCB2b2lkICphcmcpCit7CisJaWYgKHZlY3RvciA+PSBOUl9JUlFTKQorCQlyZXR1cm47CisKKwllbnRlcl9jcml0aWNhbF9zZWN0aW9uKCk7CisJaGFuZGxlclt2ZWN0b3JdLmZ1bmMgPSBmdW5jOworCWhhbmRsZXJbdmVjdG9yXS5hcmcgPSBhcmc7CisJZXhpdF9jcml0aWNhbF9zZWN0aW9uKCk7Cit9CisKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL21zbTd4MjdhL3BhbmVsLmMgYi9wbGF0Zm9ybS9tc203eDI3YS9wYW5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZmNkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9tc203eDI3YS9wYW5lbC5jCkBAIC0wLDAgKzEsNDcxIEBACisvKiBDb3B5cmlnaHQgMjAwNywgR29vZ2xlIEluYy4gKi8KKworI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8ZGV2L2dwaW8uaD4KKyNpbmNsdWRlIDxrZXJuZWwvdGhyZWFkLmg+CisjaW5jbHVkZSA8bWRkaS5oPgorCisjZGVmaW5lIE1ERElfQ0xJRU5UX0NPUkVfQkFTRSAgMHgxMDgwMDAKKyNkZWZpbmUgTENEX0NPTlRST0xfQkxPQ0tfQkFTRSAweDExMDAwMAorI2RlZmluZSBTUElfQkxPQ0tfQkFTRQkJIDB4MTIwMDAwCisjZGVmaW5lIEkyQ19CTE9DS19CQVNFCQkgMHgxMzAwMDAKKyNkZWZpbmUgUFdNX0JMT0NLX0JBU0UJCSAweDE0MDAwMAorI2RlZmluZSBHUElPX0JMT0NLX0JBU0UJCTB4MTUwMDAwCisjZGVmaW5lIFNZU1RFTV9CTE9DSzFfQkFTRQkgMHgxNjAwMDAKKyNkZWZpbmUgU1lTVEVNX0JMT0NLMl9CQVNFCSAweDE3MDAwMAorCisKKyNkZWZpbmUJTURESUNBUDAJKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDAwKQorI2RlZmluZQlNRERJQ0FQMQkoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4MDQpCisjZGVmaW5lCU1ERElDQVAyCShNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHgwOCkKKyNkZWZpbmUJTURESUNBUDMJKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDBDKQorI2RlZmluZQlNRENBUENIRwkoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4MTApCisjZGVmaW5lCU1EQ1JDRVJDCShNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHgxNCkKKyNkZWZpbmUJVFRCVVNTRUwJKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDE4KQorI2RlZmluZQlEUFNFVDAJICAoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4MUMpCisjZGVmaW5lCURQU0VUMQkgIChNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHgyMCkKKyNkZWZpbmUJRFBTVVMJICAgKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDI0KQorI2RlZmluZQlEUFJVTgkgICAoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4MjgpCisjZGVmaW5lCVNZU0NLRU5BCShNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHgyQykKKyNkZWZpbmUJVEVTVE1PREUJKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDMwKQorI2RlZmluZQlGSUZPTU9OSQkoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4MzQpCisjZGVmaW5lCUlOVE1PTkkJIChNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHgzOCkKKyNkZWZpbmUJTURJT0JJU1QJKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDNDKQorI2RlZmluZQlNRElPUFNFVAkoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4NDApCisjZGVmaW5lCUJJVE1BUDAJIChNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHg0NCkKKyNkZWZpbmUJQklUTUFQMQkgKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDQ4KQorI2RlZmluZQlCSVRNQVAyCSAoTURESV9DTElFTlRfQ09SRV9CQVNFfDB4NEMpCisjZGVmaW5lCUJJVE1BUDMJIChNRERJX0NMSUVOVF9DT1JFX0JBU0V8MHg1MCkKKyNkZWZpbmUJQklUTUFQNAkgKE1ERElfQ0xJRU5UX0NPUkVfQkFTRXwweDU0KQorCisKKyNkZWZpbmUJU1JTVAkJKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgwMCkKKyNkZWZpbmUJUE9SVF9FTkIJKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgwNCkKKyNkZWZpbmUJU1RBUlQJICAgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgwOCkKKyNkZWZpbmUJUE9SVAkJKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgwQykKKyNkZWZpbmUJQ01OCQkgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgxMCkKKyNkZWZpbmUJR0FNTUEJICAgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgxNCkKKyNkZWZpbmUJSU5URkxHCSAgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgxOCkKKyNkZWZpbmUJSU5UTVNLCSAgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgxQykKKyNkZWZpbmUJTVBMRkJVRgkgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgyMCkKKyNkZWZpbmUJSERFX0xFRlQJKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgyNCkKKyNkZWZpbmUJVkRFX1RPUAkgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHgyOCkKKworI2RlZmluZQlQWEwJCSAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDMwKQorI2RlZmluZQlIQ1lDTEUJICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDM0KQorI2RlZmluZQlIU1cJCSAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDM4KQorI2RlZmluZQlIREVfU1RBUlQgICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDNDKQorI2RlZmluZQlIREVfU0laRQkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDQwKQorI2RlZmluZQlWQ1lDTEUJICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDQ0KQorI2RlZmluZQlWU1cJCSAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDQ4KQorI2RlZmluZQlWREVfU1RBUlQgICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDRDKQorI2RlZmluZQlWREVfU0laRQkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDUwKQorI2RlZmluZQlXQUtFVVAJICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDU0KQorI2RlZmluZQlXU1lOX0RMWQkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDU4KQorI2RlZmluZQlSRUdFTkIJICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDVDKQorI2RlZmluZQlWU1lOSUYJICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDYwKQorI2RlZmluZQlXUlNUQgkgICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDY0KQorI2RlZmluZQlSRFNUQgkgICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDY4KQorI2RlZmluZQlBU1lfREFUQQkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDZDKQorI2RlZmluZQlBU1lfREFUQgkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDcwKQorI2RlZmluZQlBU1lfREFUQwkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDc0KQorI2RlZmluZQlBU1lfREFURAkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDc4KQorI2RlZmluZQlBU1lfREFURQkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDdDKQorI2RlZmluZQlBU1lfREFURgkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDgwKQorI2RlZmluZQlBU1lfREFURwkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDg0KQorI2RlZmluZQlBU1lfREFUSAkoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDg4KQorI2RlZmluZQlBU1lfQ01EU0VUICAoTENEX0NPTlRST0xfQkxPQ0tfQkFTRXwweDhDKQorCisjZGVmaW5lCU1PTkkJCShMQ0RfQ09OVFJPTF9CTE9DS19CQVNFfDB4QjApCisKKyNkZWZpbmUJQ3VycmVudAkgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHhDMCkKKyNkZWZpbmUJTENECQkgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHhDNCkKKyNkZWZpbmUJQ09NTUFORAkgKExDRF9DT05UUk9MX0JMT0NLX0JBU0V8MHhDOCkKKworCisjZGVmaW5lCVNTSUNUTAkgIChTUElfQkxPQ0tfQkFTRXwweDAwKQorI2RlZmluZQlTU0lUSU1FCSAoU1BJX0JMT0NLX0JBU0V8MHgwNCkKKyNkZWZpbmUJU1NJVFgJICAgKFNQSV9CTE9DS19CQVNFfDB4MDgpCisjZGVmaW5lCVNTSVJYCSAgIChTUElfQkxPQ0tfQkFTRXwweDBDKQorI2RlZmluZQlTU0lJTlRDCSAoU1BJX0JMT0NLX0JBU0V8MHgxMCkKKyNkZWZpbmUJU1NJSU5UUwkgKFNQSV9CTE9DS19CQVNFfDB4MTQpCisjZGVmaW5lCVNTSURCRzEJIChTUElfQkxPQ0tfQkFTRXwweDE4KQorI2RlZmluZQlTU0lEQkcyCSAoU1BJX0JMT0NLX0JBU0V8MHgxQykKKyNkZWZpbmUJU1NJSUQJICAgKFNQSV9CTE9DS19CQVNFfDB4MjApCisKKworI2RlZmluZQlJMkNTRVRVUAkoSTJDX0JMT0NLX0JBU0V8MHgwMCkKKyNkZWZpbmUJSTJDQ1RSTAkJKEkyQ19CTE9DS19CQVNFfDB4MDQpCisKKworI2RlZmluZQlUSU1FUjBMT0FECSAgKFBXTV9CTE9DS19CQVNFfDB4MDApCisjZGVmaW5lCVRJTUVSMFZBTFVFCSAgKFBXTV9CTE9DS19CQVNFfDB4MDQpCisjZGVmaW5lCVRJTUVSMENPTlRST0wgKFBXTV9CTE9DS19CQVNFfDB4MDgpCisjZGVmaW5lCVRJTUVSMElOVENMUiAgKFBXTV9CTE9DS19CQVNFfDB4MEMpCisjZGVmaW5lCVRJTUVSMFJJUwkgIChQV01fQkxPQ0tfQkFTRXwweDEwKQorI2RlZmluZQlUSU1FUjBNSVMJICAoUFdNX0JMT0NLX0JBU0V8MHgxNCkKKyNkZWZpbmUJVElNRVIwQkdMT0FEICAoUFdNX0JMT0NLX0JBU0V8MHgxOCkKKyNkZWZpbmUJUFdNME9GRgkJICAoUFdNX0JMT0NLX0JBU0V8MHgxQykKKyNkZWZpbmUJVElNRVIxTE9BRAkgIChQV01fQkxPQ0tfQkFTRXwweDIwKQorI2RlZmluZQlUSU1FUjFWQUxVRQkgIChQV01fQkxPQ0tfQkFTRXwweDI0KQorI2RlZmluZQlUSU1FUjFDT05UUk9MIChQV01fQkxPQ0tfQkFTRXwweDI4KQorI2RlZmluZQlUSU1FUjFJTlRDTFIgIChQV01fQkxPQ0tfQkFTRXwweDJDKQorI2RlZmluZQlUSU1FUjFSSVMJICAoUFdNX0JMT0NLX0JBU0V8MHgzMCkKKyNkZWZpbmUJVElNRVIxTUlTCSAgKFBXTV9CTE9DS19CQVNFfDB4MzQpCisjZGVmaW5lCVRJTUVSMUJHTE9BRCAgKFBXTV9CTE9DS19CQVNFfDB4MzgpCisjZGVmaW5lCVBXTTFPRkYJCSAgKFBXTV9CTE9DS19CQVNFfDB4M0MpCisjZGVmaW5lCVRJTUVSSVRDUgkgIChQV01fQkxPQ0tfQkFTRXwweDYwKQorI2RlZmluZQlUSU1FUklUT1AJICAoUFdNX0JMT0NLX0JBU0V8MHg2NCkKKyNkZWZpbmUJUFdNQ1IJCSAgKFBXTV9CTE9DS19CQVNFfDB4NjgpCisjZGVmaW5lCVBXTUlECQkgIChQV01fQkxPQ0tfQkFTRXwweDZDKQorI2RlZmluZQlQV01NT04JCSAgKFBXTV9CTE9DS19CQVNFfDB4NzApCisKKworI2RlZmluZQlHUElPREFUQQkoR1BJT19CTE9DS19CQVNFfDB4MDApCisjZGVmaW5lCUdQSU9ESVIJIChHUElPX0JMT0NLX0JBU0V8MHgwNCkKKyNkZWZpbmUJR1BJT0lTCSAgKEdQSU9fQkxPQ0tfQkFTRXwweDA4KQorI2RlZmluZQlHUElPSUJFCSAoR1BJT19CTE9DS19CQVNFfDB4MEMpCisjZGVmaW5lCUdQSU9JRVYJIChHUElPX0JMT0NLX0JBU0V8MHgxMCkKKyNkZWZpbmUJR1BJT0lFCSAgKEdQSU9fQkxPQ0tfQkFTRXwweDE0KQorI2RlZmluZQlHUElPUklTCSAoR1BJT19CTE9DS19CQVNFfDB4MTgpCisjZGVmaW5lCUdQSU9NSVMJIChHUElPX0JMT0NLX0JBU0V8MHgxQykKKyNkZWZpbmUJR1BJT0lDCSAgKEdQSU9fQkxPQ0tfQkFTRXwweDIwKQorI2RlZmluZQlHUElPT01TCSAoR1BJT19CTE9DS19CQVNFfDB4MjQpCisjZGVmaW5lCUdQSU9QQwkgIChHUElPX0JMT0NLX0JBU0V8MHgyOCkKKworI2RlZmluZQlHUElPSUQJICAoR1BJT19CTE9DS19CQVNFfDB4MzApCisKKworI2RlZmluZQlXS1JFUQkgICAoU1lTVEVNX0JMT0NLMV9CQVNFfDB4MDApCisjZGVmaW5lCUNMS0VOQgkgIChTWVNURU1fQkxPQ0sxX0JBU0V8MHgwNCkKKyNkZWZpbmUJRFJBTVBXUgkgKFNZU1RFTV9CTE9DSzFfQkFTRXwweDA4KQorI2RlZmluZQlJTlRNQVNLCSAoU1lTVEVNX0JMT0NLMV9CQVNFfDB4MEMpCisjZGVmaW5lCUdQSU9TRUwJIChTWVNURU1fQkxPQ0syX0JBU0V8MHgwMCkKKworc3RydWN0IGluaXRfdGFibGUgeworCXVuc2lnbmVkIGludCByZWc7CisJdW5zaWduZWQgaW50IHZhbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5pdF90YWJsZSB0b3NoaWJhXzQ4MHg2NDBfaW5pdF90YWJsZVtdID0geworCXsgRFBTRVQwLAkJCSAgIDB4NEJFQzAwNjYgfSwgIC8vICMgTURDLkRQU0VUMCAgIyBTZXR1cCBEUExMIHBhcmFtZXRlcnMKKwl7IERQU0VUMSwJCQkgICAweDAwMDAwMTEzIH0sICAvLyAgICMgTURDLkRQU0VUMQorCXsgRFBTVVMsCQkJCTB4MDAwMDAwMDAgfSwgIC8vICAgIyBNREMuRFBTVVMgICMgU2V0IERQTEwgb3NjaWxsYXRpb24gZW5hYmxlCisJeyBEUFJVTiwJCQkJMHgwMDAwMDAwMSB9LCAgLy8gICAjIE1EQy5EUFJVTiAgIyBSZWxlYXNlIHJlc2V0IHNpZ25hbCBmb3IgRFBMTAorCXsgMCwJCQkJCTE0CQkgfSwgIC8vIHdhaXRfbXMoMTQpOworCXsgU1lTQ0tFTkEsCQkJIDB4MDAwMDAwMDEgfSwgIC8vICAgIyBNREMuU1lTQ0tFTkEgICMgRW5hYmxlIHN5c3RlbSBjbG9jayBvdXRwdXQKKwl7IENMS0VOQiwJCQkgICAweDAwMDAwMEVGIH0sICAvLyAgICMgU1lTLkNMS0VOQiAgIyBFbmFibGUgY2xvY2tzIGZvciBlYWNoIG1vZHVsZSAod2l0aG91dCBEQ0xLICwgaTJjQ0xLKQorCXsgR1BJT19CTE9DS19CQVNFLAkgIDB4MDNGRjAwMDAgfSwgIC8vICAgIyBHUEkgLkdQSU9EQVRBICAjIEdQSU8yKFJFU0VUX0xDRF9OKSBzZXQgdG8gMCAsIEdQSU8zKGVEUkFNX1Bvd2VyKSBzZXQgdG8gMAorCXsgR1BJT0RJUiwJCQkgIDB4MDAwMDAyNEQgfSwgIC8vICAgIyBHUEkgLkdQSU9ESVIgICMgU2VsZWN0IGRpcmVjdGlvbiBvZiBHUElPIHBvcnQgKDAsMiwzLDYsOSBvdXRwdXQpCisJeyBTWVNURU1fQkxPQ0syX0JBU0UsICAgMHgwMDAwMDE3MyB9LCAgLy8gICAjIFNZUy5HUElPU0VMICAjIEdQSU8gcG9ydCBtdWx0aXBsZXhpbmcgY29udHJvbAorCXsgR1BJT1BDLAkJCSAgIDB4MDNDMzAwQzAgfSwgIC8vICAgIyBHUEkgLkdQSU9QQyAgIyBHUElPMiwzIFBEIGN1dAorCXsgU1lTVEVNX0JMT0NLMV9CQVNFLCAgIDB4MDAwMDAwMDAgfSwgIC8vICAgIyBTWVMuV0tSRVEgICMgV2FrZS11cCByZXF1ZXN0IGV2ZW50IGlzIFZTWU5DIGFsaWdubWVudAorCXsgR1BJT0lTLAkJCSAgIDB4MDAwMDAwMDAgfSwgIC8vICAgIyBHUEkgLkdQSU9JUyAgIyBTZXQgaW50ZXJydXB0IHNlbnNlIG9mIEdQSU8KKwl7IEdQSU9JRVYsCQkJICAweDAwMDAwMDAxIH0sICAvLyAgICMgR1BJIC5HUElPSUVWICAjIFNldCBpbnRlcnJ1cHQgZXZlbnQgb2YgR1BJTworCXsgR1BJT0lDLAkJCSAgIDB4MDAwMDAzRkYgfSwgIC8vICAgIyBHUEkgLkdQSU9JQyAgIyBHUElPIGludGVycnVwdCBjbGVhcgorCXsgR1BJT19CTE9DS19CQVNFLAkgIDB4MDAwNjAwMDYgfSwgIC8vICAgIyBHUEkgLkdQSU9EQVRBICAjIFJlbGVhc2UgTENERCByZXNldAorCXsgR1BJT19CTE9DS19CQVNFLAkgIDB4MDAwODAwMDggfSwgIC8vICAgIyBHUEkgLkdQSU9EQVRBICAjIGVEUkFNIFZEIHN1cHBseQorCXsgR1BJT19CTE9DS19CQVNFLAkgIDB4MDIwMDAyMDAgfSwgIC8vICAgIyBHUEkgLkdQSU9EQVRBICAjIFRFU1QgTEVEIE9OCisJeyBEUkFNUFdSLAkJCSAgMHgwMDAwMDAwMSB9LCAgLy8gICAjIFNZUy5EUkFNUFdSICAjIGVEUkFNIHBvd2VyIHVwCisJeyBUSU1FUjBDT05UUk9MLAkJMHgwMDAwMDA2MCB9LCAgLy8gICAjIFBXTS5UaW1lcjBDb250cm9sICAjIFBXTTAgb3V0cHV0IHN0b3AKKwl7IFBXTV9CTE9DS19CQVNFLAkgICAweDAwMDAxMzg4IH0sICAvLyAgICMgUFdNLlRpbWVyMExvYWQgICMgUFdNMCAxMGtIeiAsIER1dHkgOTkgKEJhY2tMaWdodCBPRkYpCisJLy97UFdNME9GRiwJCQkgICAweDAwMDAwMDAxIH0sICAvLyAgICMgUFdNLlBXTTBPRkYKKyNpZiAwCisJeyBQV00wT0ZGLAkJCSAgMHgwMDAwMTM4NyB9LCAvLyBTVVJGIDEwMCUgYmFja2xpZ2h0CisJeyBQV00wT0ZGLAkJCSAgMHgwMDAwMDAwMCB9LCAvLyBGRkEgMTAwJSBiYWNrbGlnaHQKKyNlbmRpZgorCXsgUFdNME9GRiwJCQkgIDB4MDAwMDA5QzMgfSwgLy8gNTAlIEJMCisJeyBUSU1FUjFDT05UUk9MLAkJMHgwMDAwMDA2MCB9LCAgLy8gICAjIFBXTS5UaW1lcjFDb250cm9sICAjIFBXTTEgb3V0cHV0IHN0b3AKKwl7IFRJTUVSMUxPQUQsCQkgICAweDAwMDAxMzg4IH0sICAvLyAgICMgUFdNLlRpbWVyMUxvYWQgICMgUFdNMSAxMGtIeiAsIER1dHkgOTkgKEJhY2tMaWdodCBPRkYpCisJLy97UFdNMU9GRiwJCQkgICAweDAwMDAwMDAxIH0sICAvLyAgICMgUFdNLlBXTTFPRkYKKwl7IFBXTTFPRkYsCQkJICAweDAwMDAxMzg3IH0sCisJeyBUSU1FUjBDT05UUk9MLAkJMHgwMDAwMDBFMCB9LCAgLy8gICAjIFBXTS5UaW1lcjBDb250cm9sICAjIFBXTTAgb3V0cHV0IHN0YXJ0CisJeyBUSU1FUjFDT05UUk9MLAkJMHgwMDAwMDBFMCB9LCAgLy8gICAjIFBXTS5UaW1lcjFDb250cm9sICAjIFBXTTEgb3V0cHV0IHN0YXJ0CisJeyBQV01DUiwJCQkJMHgwMDAwMDAwMyB9LCAgLy8gICAjIFBXTS5QV01DUiAgIyBQV00gb3V0cHV0IGVuYWJsZQorCXsgMCwJCQkJCTEJCSAgfSwgIC8vICB3YWl0X21zKDEpOworCXsgU1BJX0JMT0NLX0JBU0UsCSAgIDB4MDAwMDA3OTkgfSwgIC8vICAgIyBTUEkgLlNTSUNUTCAgIyBTUEkgb3BlcmF0aW9uIG1vZGUgc2V0dGluZworCXsgU1NJVElNRSwJCQkgIDB4MDAwMDAxMDAgfSwgIC8vICAgIyBTUEkgLlNTSVRJTUUgICMgU1BJIHNlcmlhbCBpbnRlcmZhY2UgdGltaW5nIHNldHRpbmcKKwl7IFNQSV9CTE9DS19CQVNFLAkgICAweDAwMDAwNzliIH0sICAvLyAgICMgU1BJIC5TU0lDVEwgICMgU2V0IFNQSSBhY3RpdmUgbW9kZQorCisJeyBTU0lUWCwJCQkJMHgwMDAwMDAwMCB9LCAgLy8gICAjIFNQSS5TU0lUWCAgIyBSZWxlYXNlIGZyb20gRGVlcCBTdGFuYnkgbW9kZQorCXsgMCwJCQkJCTEJCSAgfSwgIC8vICB3YWl0X21zKDEpOworCXsgU1NJVFgsCQkJCTB4MDAwMDAwMDAgfSwgIC8vICAgIyBTUEkuU1NJVFgKKwl7IDAsCQkJCQkxCQkgIH0sICAvLyAgd2FpdF9tcygxKTsKKwl7IFNTSVRYLAkJCQkweDAwMDAwMDAwIH0sICAvLyAgICMgU1BJLlNTSVRYCisJeyAwLAkJCQkJMQkJICB9LCAgLy8gIHdhaXRfbXMoMSk7CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBCQSB9LCAgLy8gICAjIFNQSS5TU0lUWAkJICAqTk9URSAxICAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTExIH0sICAvLwkgIyBEaXNwbGF5IG1vZGUgc2V0dXAoMSkgOiBOb3JtYWx5IEJsYWNrCisJeyBTU0lUWCwJCQkJMHgwMDA4MDAzNiB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMDAgfSwgIC8vCSAjIE1lbW9yeSBhY2Nlc3MgY29udHJvbAorCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkvLwkgICMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEJCIH0sICAvLyAgICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMDAgfSwgIC8vICAgIyBEaXNwbGF5IG1vZGUgc2V0dXAoMikKKwl7IFNTSVRYLAkJCQkweDAwMDgwMDNBIH0sICAvLyAgICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxNjAgfSwgIC8vICAgIyBSR0IgSW50ZXJmYWNlIGRhdGEgZm9ybWF0CisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQkYgfSwgIC8vICAgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwMCB9LCAgLy8gICAjIERyaXZuaWcgbWV0aG9kCisJeyBTU0lUWCwJCQkJMHgwMDA4MDBCMSB9LCAgLy8gICAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTVEIH0sICAvLyAgICMgQm9vc3RlciBvcGVyYXRpb24gc2V0dXAKKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBCMiB9LCAgLy8gICAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTMzIH0sICAvLyAgICMgQm9vc3RlciBtb2RlIHNldHVwCisJeyBTU0lUWCwJCQkJMHgwMDA4MDBCMyB9LCAgLy8gICAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTIyIH0sICAvLwkgIyBCb29zdGVyIGZyZXF1ZW5jaWVzIHNldHVwCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQjQgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTAyIH0sICAvLwkgIyBPUC1hbXAgY2FwYWJpbGl0eS9TeXN0ZW0gY2xvY2sgZnJlcS4gZGl2aXNpb24gc2V0dXAKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEI1IH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDExRiB9LCAgLy8JICMgVkNTIFZvbHRhZ2UgYWRqdXN0bWVudCAgKDFDLT4xRiBmb3IgUmV2IDIpCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQjYgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTI4IH0sICAvLwkgIyBWQ09NIFZvbHRhZ2UgYWRqdXN0bWVudAorCXsgU1NJVFgsCQkJCTB4MDAwODAwQjcgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTAzIH0sICAvLwkgIyBDb25maWd1cmUgYW4gZXh0ZXJuYWwgZGlzcGxheSBzaWduYWwKKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBCOSB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMjAgfSwgIC8vCSAjIERDQ0svRENFViB0aW1pbmcgc2V0dXAKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEJEIH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwMiB9LCAgLy8JICMgQVNXIHNpZ25hbCBjb250cm9sCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQkUgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTAwIH0sICAvLwkgIyBEdW1teSBkaXNwbGF5ICh3aGl0ZS9ibGFjaykgY291bnQgc2V0dXAgZm9yIFFVQUQgRGF0YSBvcGVyYXRpb24KKwl7IFNTSVRYLAkJCQkweDAwMDgwMEMwIH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDExMSB9LCAgLy8JICMgd2FpdF9tcygtb3V0IEZSIGNvdW50IHNldHVwIChBKQorCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEMxIH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDExMSB9LCAgLy8JICMgd2FpdF9tcygtb3V0IEZSIGNvdW50IHNldHVwIChCKQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQzIgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTExIH0sICAvLwkgIyB3YWl0X21zKC1vdXQgRlIgY291bnQgc2V0dXAgKEMpCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQzMgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDgwMTBBIH0sICAvLwkgIyB3YWl0X21zKC1pbiBsaW5lIGNsb2NrIGNvdW50IHNldHVwIChEKQorCXsgU1NJVFgsCQkJCTB4MDAwMDAxMEEgfSwgIC8vCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQzQgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDgwMTYwIH0sICAvLwkgIyBTZWVwLWluIGxpbmUgY2xvY2sgY291bnQgc2V0dXAgKEUpCisJeyBTU0lUWCwJCQkJMHgwMDAwMDE2MCB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBDNSB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxNjAgfSwgIC8vCSAjIHdhaXRfbXMoLWluIGxpbmUgY2xvY2sgY291bnQgc2V0dXAgKEYpCisJeyBTU0lUWCwJCQkJMHgwMDAwMDE2MCB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBDNiB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxNjAgfSwgIC8vCSAjIHdhaXRfbXMoLWluIGxpbmUgY2xvY2sgc2V0dXAgKEcpCisJeyBTU0lUWCwJCQkJMHgwMDAwMDE2MCB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBDNyB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxMzMgfSwgIC8vCSAjIEdhbW1hIDEgZmluZSB0dW5pbmcgKDEpCisJeyBTU0lUWCwJCQkJMHgwMDAwMDE0MyB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBDOCB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxNDQgfSwgIC8vCSAjIEdhbW1hIDEgZmluZSB0dW5pbmcgKDIpCisJeyBTU0lUWCwJCQkJMHgwMDA4MDBDOSB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMzMgfSwgIC8vCSAjIEdhbW1hIDEgaW5jbGluYXRpb24gYWRqdXN0bWVudAorCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMENBIH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwMCB9LCAgLy8JICMgR2FtbWEgMSBibHVlIG9mZnNldCBhZGp1c3RtZW50CisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwRUMgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDgwMTAyIH0sICAvLwkgIyBUb3RhbCBudW1iZXIgb2YgaG9yaXpvbnRhbCBjbG9jayBjeWNsZXMgKDEpIFtQQ0xLIFN5bmMuIFZHQSBzZXR0aW5nXQorCXsgU1NJVFgsCQkJCTB4MDAwMDAxMTggfSwgIC8vCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQ0YgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTAxIH0sICAvLwkgIyBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMSkgW1BDTEsgU3luYy4gVGFibGUxIGZvciBWR0FdCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwRDAgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDgwMTEwIH0sICAvLwkgIyBCbGFua2luZyBwZXJpb2QgY29udHJvbCAoMikgW1BDTEsgU3luYy4gVGFibGUxIGZvciBWR0FdCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwNCB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBEMSB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMDEgfSwgIC8vCSAjIENLViB0aW1pbmcgY29udHJvbCBvbi9vZmYgW1BDTEsgU3luYy4gVGFibGUxIGZvciBWR0FdCisJeyAwLAkJCQkJMgkJICB9LCAgLy8gIHdhaXRfbXMoMik7CSAgLy8JIyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwRDIgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDgwMTAwIH0sICAvLwkgIyBDS1YxLDIgdGltaW5nIGNvbnRyb2wgW1BDTEsgU3luYy4gVGFibGUxIGZvciBWR0FdCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEzQSB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBEMyB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxMDAgfSwgIC8vCSAjIE9FViB0aW1pbmcgY29udHJvbCBbUENMSyBTeW5jLiBUYWJsZTEgZm9yIFZHQV0KKwl7IFNTSVRYLAkJCQkweDAwMDAwMTNBIH0sICAvLworCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEQ0IH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDA4MDEyNCB9LCAgLy8JICMgQVNXIHRpbWluZyBjb250cm9sICgxKSBbUENMSyBTeW5jLiBUYWJsZTEgZm9yIFZHQV0KKwl7IFNTSVRYLAkJCQkweDAwMDAwMTZFIH0sICAvLworCXsgMCwJCQkJCTEJCSAgfSwgIC8vICB3YWl0X21zKDEpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEQ1IH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEyNCB9LCAgLy8JICMgQVNXIHRpbWluZyBjb250cm9sICgyKSBbUENMSyBTeW5jLiBUYWJsZTEgZm9yIFZHQV0KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFRCB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxMDEgfSwgIC8vCSAjIFRvdGFsIG51bWJlciBvZiBob3Jpem9udGFsIGNsb2NrIGN5Y2xlcyAoMikgW1BDTEsgU3luYy4gVGFibGUxIGZvciBRVkdBIF0KKwl7IFNTSVRYLAkJCQkweDAwMDAwMTBBIH0sICAvLworCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEQ2IH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwMSB9LCAgLy8JICMgQmxhbmtpbmcgcGVyaW9kIGNvbnRyb2wgKDEpIFtQQ0xLIFN5bmMuIFRhYmxlMiBmb3IgUVZHQV0KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBENyB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxMTAgfSwgIC8vCSAjIEJsYW5raW5nIHBlcmlvZCBjb250cm9sICgyKSBbUENMSyBTeW5jLiBUYWJsZTIgZm9yIFFWR0FdCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwQSB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBEOCB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMDEgfSwgIC8vCSAjIENLViB0aW1pbmcgY29udHJvbCBvbi9vZmYgW1BDTEsgU3luYy4gVGFibGUyIGZvciBRVkdBXQorCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEQ5IH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDA4MDEwMCB9LCAgLy8JICMgQ0tWMSwyIHRpbWluZyBjb250cm9sIFtQQ0xLIFN5bmMuIFRhYmxlMiBmb3IgUVZHQV0KKwl7IFNTSVRYLAkJCQkweDAwMDAwMTE0IH0sICAvLworCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMERFIH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDA4MDEwMCB9LCAgLy8JICMgT0VWIHRpbWluZyBjb250cm9sIFtQQ0xLIFN5bmMuIFRhYmxlMiBmb3IgUVZHQV0KKwl7IFNTSVRYLAkJCQkweDAwMDAwMTE0IH0sICAvLworCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMERGIH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDA4MDExMiB9LCAgLy8JICMgQVNXIHRpbWluZyBjb250cm9sICgxKSBbUENMSyBTeW5jLiBUYWJsZTIgZm9yIFFWR0FdCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEzRiB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFMCB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMEIgfSwgIC8vCSAjIEFTVyB0aW1pbmcgY29udHJvbCAoMikgW1BDTEsgU3luYy4gVGFibGUyIGZvciBRVkdBXQorCXsgU1NJVFgsCQkJCTB4MDAwODAwRTIgfSwgIC8vCSAjIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTAxIH0sICAvLwkgIyBCdWlsdC1pbiBvc2NpbGxhdG9yIGZyZXF1ZW5jeSBkaXZpc2lvbiBzZXR1cCBbRnJlcXVlbmN5IGRpdmlzaW9uIHJhdGlvIDogMiAoNjBIcSkKKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFMyB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMzYgfSwgIC8vCSAjIEJ1aWx0LWluIG9zY2lsbGF0b3IgY2xvY2sgY291bnQgc2V0dXAKKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFNCB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxMDAgfSwgIC8vCSAjIENLViB0aW1pbmcgY29udHJvbCBmb3IgdXNpbmcgYnVpbGQtaW4gb3NjCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwMyB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFNSB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwODAxMDIgfSwgIC8vCSAjIE9FViB0aW1pbmcgY29udHJvbCBmb3IgdXNpbmcgYnVpbGQtaW4gb3NjCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwNCB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFNiB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMDMgfSwgIC8vCSAjIERDRVYgdGltaW5nIGNvbnRyb2wgZm9yIHVzaW5nIGJ1aWxkLWluIG9zYworCXsgMCwJCQkJCTIJCSAgfSwgIC8vICB3YWl0X21zKDIpOwkgIC8vCSMgIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEU3IH0sICAvLwkgIyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDA4MDEwNCB9LCAgLy8JICMgQVNXIHRpbWluZyBzZXR1cCBmb3IgdXNpbmcgYnVpbGQtaW4gb3NjKDEpCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwQSB9LCAgLy8KKwl7IDAsCQkJCQkyCQkgIH0sICAvLyAgd2FpdF9tcygyKTsJICAvLwkjICBXYWl0IFNQSSBmaWZvIGVtcHR5CisJeyBTU0lUWCwJCQkJMHgwMDA4MDBFOCB9LCAgLy8JICMgQ29tbWFuZCBzZXR0aW5nIG9mIFNQSSBibG9jaworCXsgU1NJVFgsCQkJCTB4MDAwMDAxMDQgfSwgIC8vCSAjIEFTVyB0aW1pbmcgc2V0dXAgZm9yIHVzaW5nIGJ1aWxkLWluIG9zYygyKQorCisKKwl7IENMS0VOQiwJCQkgICAweDAwMDAwMUVGIH0sICAvLyAgICMgU1lTLkNMS0VOQiAgIyBEQ0xLIGVuYWJsZQorCXsgU1RBUlQsCQkJCTB4MDAwMDAwMDAgfSwgIC8vICAgIyBMQ0QuU1RBUlQgICMgTENEQyB3YWl0X21zKCBtb2RlCisJeyBXUlNUQiwJCQkJMHgwMDAwMDAzRiB9LCAgLy8gICAjIExDRC5XUlNUQiAgIyB3cml0ZV9jbGllbnRfcmVnKCBzdHJvYmUKKwl7IFJEU1RCLAkJCQkweDAwMDAwNDMyIH0sICAvLyAgICMgTENELlJEU1RCICAjIFJlYWQgc3Ryb2JlCisJeyBQT1JUX0VOQiwJCQkgMHgwMDAwMDAwMiB9LCAgLy8gICAjIExDRC5QT1JUX0VOQiAgIyBBc3luY2hyb25vdXMgcG9ydCBlbmFibGUKKwl7IFZTWU5JRiwJCQkgICAweDAwMDAwMDAwIH0sICAvLyAgICMgTENELlZTWU5DSUYgICMgVlNZTkMgSS9GIG1vZGUgc2V0CisJeyBBU1lfREFUQSwJCQkgMHg4MDAwMDAwMCB9LCAgLy8gICAjIExDRC5BU1lfREFUeCAgIyBJbmRleCBzZXR0aW5nIG9mIFNVQiBMQ0RECisJeyBBU1lfREFUQiwJCQkgMHgwMDAwMDAwMSB9LCAgLy8JICMgT3NjaWxsYXRvciBzdGFydAorCXsgQVNZX0NNRFNFVCwJCSAgIDB4MDAwMDAwMDUgfSwgIC8vICAgIyBMQ0QuQVNZX0NNRFNFVCAgIyBEaXJlY3QgY29tbWFuZCB0cmFuc2ZlciBlbmFibGUKKwl7IEFTWV9DTURTRVQsCQkgICAweDAwMDAwMDA0IH0sICAvLyAgICMgTENELkFTWV9DTURTRVQgICMgRGlyZWN0IGNvbW1hbmQgdHJhbnNmZXIgZGlzYWJsZQorCXsgMCwJCQkJCTEwCQkgfSwgIC8vICB3YWl0X21zKDEwKTsKKwl7IEFTWV9EQVRBLAkJCSAweDgwMDAwMDAwIH0sICAvLyAgICMgTENELkFTWV9EQVR4ICAjIERVTU1ZIHdyaXRlX2NsaWVudF9yZWcogUAqTk9URTIKKwl7IEFTWV9EQVRCLAkJCSAweDgwMDAwMDAwIH0sICAvLworCXsgQVNZX0RBVEMsCQkJIDB4ODAwMDAwMDAgfSwgIC8vCisJeyBBU1lfREFURCwJCQkgMHg4MDAwMDAwMCB9LCAgLy8KKwl7IEFTWV9DTURTRVQsCQkgICAweDAwMDAwMDA5IH0sICAvLyAgICMgTENELkFTWV9DTURTRVQKKwl7IEFTWV9DTURTRVQsCQkgICAweDAwMDAwMDA4IH0sICAvLyAgICMgTENELkFTWV9DTURTRVQKKwl7IEFTWV9EQVRBLAkJCSAweDgwMDAwMDA3IH0sICAvLyAgICMgTENELkFTWV9EQVR4ICAjIEluZGV4IHNldHRpbmcgb2YgU1VCIExDREQKKwl7IEFTWV9EQVRCLAkJCSAweDAwMDA0MDA1IH0sICAvLwkgIyBMQ0QgZHJpdmVyIGNvbnRyb2wKKwl7IEFTWV9DTURTRVQsCQkgICAweDAwMDAwMDA1IH0sICAvLyAgICMgTENELkFTWV9DTURTRVQgICMgRGlyZWN0IGNvbW1hbmQgdHJhbnNmZXIgZW5hYmxlCisJeyBBU1lfQ01EU0VULAkJICAgMHgwMDAwMDAwNCB9LCAgLy8gICAjIExDRC5BU1lfQ01EU0VUICAjIERpcmVjdCBjb21tYW5kIHRyYW5zZmVyIGRpc2FibGUKKwl7IDAsCQkJCQkyMAkJIH0sICAvLyAgd2FpdF9tcygyMCk7CisJeyBBU1lfREFUQSwJCQkgMHg4MDAwMDA1OSB9LCAgLy8gICAjIExDRC5BU1lfREFUeCAgIyBJbmRleCBzZXR0aW5nIG9mIFNVQiBMQ0RECisJeyBBU1lfREFUQiwJCQkgMHgwMDAwMDAwMCB9LCAgLy8JICMgTFRQUyBJL0YgY29udHJvbAorCXsgQVNZX0NNRFNFVCwJCSAgIDB4MDAwMDAwMDUgfSwgIC8vICAgIyBMQ0QuQVNZX0NNRFNFVCAgIyBEaXJlY3QgY29tbWFuZCB0cmFuc2ZlciBlbmFibGUKKwl7IEFTWV9DTURTRVQsCQkgICAweDAwMDAwMDA0IH0sICAvLyAgICMgTENELkFTWV9DTURTRVQgICMgRGlyZWN0IGNvbW1hbmQgdHJhbnNmZXIgZGlzYWJsZQorCisJeyBWU1lOSUYsCQkJICAgMHgwMDAwMDAwMSB9LCAgLy8gICAjIExDRC5WU1lOQ0lGICAjIFZTWU5DIEkvRiBtb2RlIE9GRgorCXsgUE9SVF9FTkIsCQkJIDB4MDAwMDAwMDEgfSwgIC8vICAgIyBMQ0QuUE9SVF9FTkIgICMgU1lOQyBJL0YgIG91dHB1dCBzZWxlY3QKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwl7IFZTWU5JRiwJCQkgICAweDAwMDAwMDAxIH0sICAvLyBWU1lOQyBJL0YgbW9kZSBPRkYKKwl7IFBPUlRfRU5CLAkJCSAweDAwMDAwMDAxIH0sICAvLyBTWU5DIEkvRiBtb2RlIE9OCisKKwl7IEJJVE1BUDEsCQkJICAweDAxRTAwMEYwIH0sICAvLyBNREMuQklUTUFQMiAgKTsgLy8gU2V0dXAgb2YgUElUQ0ggc2l6ZSB0byBGcmFtZSBidWZmZXIxCisJeyBCSVRNQVAyLAkJCSAgMHgwMUUwMDBGMCB9LCAgLy8gTURDLkJJVE1BUDMgICk7IC8vIFNldHVwIG9mIFBJVENIIHNpemUgdG8gRnJhbWUgYnVmZmVyMgorCXsgQklUTUFQMywJCQkgIDB4MDFFMDAwRjAgfSwgIC8vIE1EQy5CSVRNQVA0ICApOyAvLyBTZXR1cCBvZiBQSVRDSCBzaXplIHRvIEZyYW1lIGJ1ZmZlcjMKKwl7IEJJVE1BUDQsCQkJICAweDAwREMwMEIwIH0sICAvLyBNREMuQklUTUFQNSAgKTsgLy8gU2V0dXAgb2YgUElUQ0ggc2l6ZSB0byBGcmFtZSBidWZmZXI0CisJeyBDTEtFTkIsCQkJICAgMHgwMDAwMDFFRiB9LCAgLy8gU1lTLkNMS0VOQiAgKTsgLy8gRENMSyBzdXBwbHkKKwl7IFBPUlRfRU5CLAkJCSAweDAwMDAwMDAxIH0sICAvLyBMQ0QuUE9SVF9FTkIgICk7IC8vIFN5bmNocm9ub3VzIHBvcnQgZW5hYmxlCisJeyBQT1JULAkJCQkgMHgwMDAwMDAwNCB9LCAgLy8gTENELlBPUlQgICk7IC8vIFBvbGFyaXR5IG9mIERFIGlzIHNldCB0byBoaWdoIGFjdGl2ZQorCXsgUFhMLAkJCQkgIDB4MDAwMDAwMDIgfSwgIC8vIExDRC5QWEwgICk7IC8vIEFDVE1PREUgMiBzZXQgKDFzdCBmcmFtZSBibGFjayBkYXRhIG91dHB1dCkKKwl7IE1QTEZCVUYsCQkJICAweDAwMDAwMDAwIH0sICAvLyBMQ0QuTVBMRkJVRiAgKTsgLy8gU2VsZWN0IHRoZSByZWFkaW5nIGJ1ZmZlcgorCXsgSENZQ0xFLAkJCSAgIDB4MDAwMDAxMGIgfSwgIC8vIExDRC5IQ1lDTEUgICk7IC8vIFNldHVwIHRvIFZHQSBzaXplCisJeyBIU1csCQkJCSAgMHgwMDAwMDAwMyB9LCAgLy8gTENELkhTVworCXsgSERFX1NUQVJULAkJCTB4MDAwMDAwMDcgfSwgIC8vIExDRC5IREVfU1RBUlQKKwl7IEhERV9TSVpFLAkJCSAweDAwMDAwMEVGIH0sICAvLyBMQ0QuSERFX1NJWkUKKwl7IFZDWUNMRSwJCQkgICAweDAwMDAwMjg1IH0sICAvLyBMQ0QuVkNZQ0xFCisJeyBWU1csCQkJCSAgMHgwMDAwMDAwMSB9LCAgLy8gTENELlZTVworCXsgVkRFX1NUQVJULAkJCTB4MDAwMDAwMDMgfSwgIC8vIExDRC5WREVfU1RBUlQKKwl7IFZERV9TSVpFLAkJCSAweDAwMDAwMjdGIH0sICAvLyBMQ0QuVkRFX1NJWkUKKworCXsgU1RBUlQsCQkJCTB4MDAwMDAwMDEgfSwgIC8vIExDRC5TVEFSVCAgKTsgLy8gTENEQyAtIFBpeGVsIGRhdGEgdHJhbnNmZXIgc3RhcnQKKworCXsgMCwJCQkJCTEwCQkgfSwgIC8vICB3YWl0X21zKCAxMCAgKTsKKwl7IFNTSVRYLAkJCQkweDAwMDgwMEJDIH0sICAvLyBTUEkuU1NJVFggICk7IC8vIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTgwIH0sICAvLyBEaXNwbGF5IGRhdGEgc2V0dXAKKwl7IFNTSVRYLAkJCQkweDAwMDgwMDNCIH0sICAvLyBDb21tYW5kIHNldHRpbmcgb2YgU1BJIGJsb2NrCisJeyBTU0lUWCwJCQkJMHgwMDAwMDEwMCB9LCAgLy8gUXVhZCBEYXRhIGNvbmZpZ3VyYXRpb24gLSBWR0EKKwl7IDAsCQkJCQkxCQkgIH0sICAvLyAgd2FpdF9tcyggMQkJICApOyAvLyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQjAgfSwgIC8vIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDAwMTE2IH0sICAvLyBQb3dlciBzdXBwbHkgT04vT0ZGIGNvbnRyb2wKKwl7IDAsCQkJCQkxCQkgIH0sICAvLyAgd2FpdF9tcyggMQkJICApOyAvLyAgV2FpdCBTUEkgZmlmbyBlbXB0eQorCXsgU1NJVFgsCQkJCTB4MDAwODAwQjggfSwgIC8vIENvbW1hbmQgc2V0dGluZyBvZiBTUEkgYmxvY2sKKwl7IFNTSVRYLAkJCQkweDAwMDgwMUZGIH0sICAvLyBPdXRwdXQgY29udHJvbAorCXsgU1NJVFgsCQkJCTB4MDAwMDAxRjUgfSwKKwl7IDAsCQkJCQkxCQkgIH0sICAvLyAgd2FpdF9tcyggMSk7CQkgLy8gIFdhaXQgU1BJIGZpZm8gZW1wdHkKKwl7IFNTSVRYLAkJCQkweDAwMDAwMDExIH0sICAvLyB3YWl0X21zKC1vdXQgKENvbW1hbmQgb25seSkKKwl7IFNTSVRYLAkJCQkweDAwMDAwMDI5IH0sICAvLyBEaXNwbGF5IG9uIChDb21tYW5kIG9ubHkpCisKKwl7IFNZU1RFTV9CTE9DSzFfQkFTRSwgICAweDAwMDAwMDAyIH0sICAvLwkjIHdha2VSRVEgLT4gR1BJTworCisJeyAwLCAwIH0KK307CisKK3N0YXRpYyB2b2lkIF9wYW5lbF9pbml0KHN0cnVjdCBpbml0X3RhYmxlICppbml0X3RhYmxlKQoreworCXVuc2lnbmVkIG47CisKKwlkcHJpbnRmKElORk8sICJwYW5lbF9pbml0KClcbiIpOworCisJbiA9IDA7CisJd2hpbGUgKGluaXRfdGFibGVbbl0ucmVnICE9IDAgfHwgaW5pdF90YWJsZVtuXS52YWwgIT0gMCkgeworCQlpZiAoaW5pdF90YWJsZVtuXS5yZWcgIT0gMCkKKwkJCW1kZGlfcmVtb3RlX3dyaXRlKGluaXRfdGFibGVbbl0udmFsLCBpbml0X3RhYmxlW25dLnJlZyk7CisJCWVsc2UKKwkJCW1kZWxheShpbml0X3RhYmxlW25dLnZhbCk7CisJCW4rKzsKKwl9CisKKwlkcHJpbnRmKElORk8sICJwYW5lbF9pbml0KCkgZG9uZVxuIik7Cit9CisKK3ZvaWQgcGFuZWxfaW5pdChzdHJ1Y3QgbWRkaV9jbGllbnRfY2FwcyAqY2xpZW50X2NhcHMpCit7CisJc3dpdGNoKGNsaWVudF9jYXBzLT5tYW51ZmFjdHVyZXJfbmFtZSkgeworCWNhc2UgMHhkMjYzOiAvLyBUb3NoaWJhCisJCWRwcmludGYoSU5GTywgIkZvdW5kIFRvc2hpYmEgcGFuZWxcbiIpOworCQlfcGFuZWxfaW5pdCh0b3NoaWJhXzQ4MHg2NDBfaW5pdF90YWJsZSk7CisJCWJyZWFrOworCWNhc2UgMHg0NDc0OiAvLz8/CisJCWlmIChjbGllbnRfY2Fwcy0+cHJvZHVjdF9jb2RlID09IDB4YzA2NSkKKwkJCWRwcmludGYoSU5GTywgIkZvdW5kIFdWR0EgcGFuZWxcbiIpOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgcGFuZWxfcG93ZXJvbih2b2lkKQoreworCWdwaW9fc2V0KDg4LCAwKTsKKwlncGlvX2NvbmZpZyg4OCwgR1BJT19PVVRQVVQpOworCXVkZWxheSgxMCk7CisJZ3Bpb19zZXQoODgsIDEpOworCW1kZWxheSgxMCk7CisKKwkvL21kZWxheSgxMDAwKTsgLy8gdW5jb21tZW50IGZvciBzZWNvbmQgc3RhZ2UgYm9vdAorfQorCit2b2lkIHBhbmVsX2JhY2tsaWdodChpbnQgb24pCit7fQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vbXNtN3gyN2EvcGxhdGZvcm0uYyBiL3BsYXRmb3JtL21zbTd4MjdhL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlYTA1YgotLS0gL2Rldi9udWxsCisrKyBiL3BsYXRmb3JtL21zbTd4MjdhL3BsYXRmb3JtLmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqCXRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqCWRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICoJbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKglzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKKyAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxrZXJuZWwvdGhyZWFkLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vZGVidWcuaD4KKyNpbmNsdWRlIDxtZGRpLmg+CisjaW5jbHVkZSA8ZGV2L2ZiY29uLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZmJjb25fY29uZmlnICpmYl9jb25maWc7CisKK3ZvaWQgcGxhdGZvcm1faW5pdF9pbnRlcnJ1cHRzKHZvaWQpOwordm9pZCBwbGF0Zm9ybV9pbml0X3RpbWVyKCk7CisKK3ZvaWQgdWFydDNfY2xvY2tfaW5pdCh2b2lkKTsKK3ZvaWQgdWFydF9pbml0KHZvaWQpOworCit2b2lkIGFjcHVfY2xvY2tfaW5pdCh2b2lkKTsKKwordm9pZCBtZGRpX2Nsb2NrX2luaXQodW5zaWduZWQgbnVtLCB1bnNpZ25lZCByYXRlKTsKKwordm9pZCBwbGF0Zm9ybV9lYXJseV9pbml0KHZvaWQpCit7CisJCS8vdWFydDNfY2xvY2tfaW5pdCgpOworCS8vdWFydF9pbml0KCk7CisKKwlwbGF0Zm9ybV9pbml0X2ludGVycnVwdHMoKTsKKwlwbGF0Zm9ybV9pbml0X3RpbWVyKCk7Cit9CisKK3ZvaWQgcGxhdGZvcm1faW5pdCh2b2lkKQoreworCWRwcmludGYoSU5GTywgInBsYXRmb3JtX2luaXQoKVxuIik7CisjaWYgMAorCWFjcHVfY2xvY2tfaW5pdCgpOworI2VuZGlmCit9CisKK3ZvaWQgZGlzcGxheV9pbml0KHZvaWQpCit7CisjaWYgRElTUExBWV9UWVBFX01EREkKKwlmYl9jb25maWcgPSBtZGRpX2luaXQoKTsKKwlBU1NFUlQoZmJfY29uZmlnKTsKKwlmYmNvbl9zZXR1cChmYl9jb25maWcpOworI2VuZGlmCisjaWYgRElTUExBWV9UWVBFX0xDREMKKwlmYl9jb25maWcgPSBsY2RjX2luaXQoKTsKKwlBU1NFUlQoZmJfY29uZmlnKTsKKwlmYmNvbl9zZXR1cChmYl9jb25maWcpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9tc203eDI3YS9ydWxlcy5tayBiL3BsYXRmb3JtL21zbTd4MjdhL3J1bGVzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZGJjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9wbGF0Zm9ybS9tc203eDI3YS9ydWxlcy5tawpAQCAtMCwwICsxLDI2IEBACitMT0NBTF9ESVIgOj0gJChHRVRfTE9DQUxfRElSKQorCitBUkNIIDo9IGFybQorIyBDYW5uJ3QgdXNlIGNvcnRleC1hNSBhcyBpdHMgbm90IHN1cHBvcnRlZCBieSBnY2MgNC40LjAKK0FSTV9DUFUgOj0gY29ydGV4LWE4CitDUFUgOj0gZ2VuZXJpYworCitNTUNfU0xPVCA6PSAxCitERUZJTkVTICs9IFdJVEhfQ1BVX0VBUkxZX0lOSVQ9MSBNTUNfU0xPVD0kKE1NQ19TTE9UKQorCitJTkNMVURFUyArPSAtSSQoTE9DQUxfRElSKS9pbmNsdWRlCisKK01PRFVMRVMgKz0gZGV2L2ZiY29uCisKK09CSlMgKz0gXAorCSQoTE9DQUxfRElSKS9hcmNoX2luaXQubyBcCisJJChMT0NBTF9ESVIpL3BsYXRmb3JtLm8gXAorCSQoTE9DQUxfRElSKS9pbnRlcnJ1cHRzLm8gXAorCSQoTE9DQUxfRElSKS9ncGlvLm8gXAorCSQoTE9DQUxfRElSKS9wYW5lbC5vIFwKKwkkKExPQ0FMX0RJUikvYWNwdWNsb2NrLm8KKworTElOS0VSX1NDUklQVCArPSAkKEJVSUxERElSKS9zeXN0ZW0tb25lc2VnbWVudC5sZAorCitpbmNsdWRlIHBsYXRmb3JtL21zbV9zaGFyZWQvcnVsZXMubWsKKwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vbXNtX3NoYXJlZC9uYW5kLmMgYi9wbGF0Zm9ybS9tc21fc2hhcmVkL25hbmQuYwppbmRleCA5NzViNjUzLi5lZjNmMWI1IDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9tc21fc2hhcmVkL25hbmQuYworKysgYi9wbGF0Zm9ybS9tc21fc2hhcmVkL25hbmQuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEdvb2dsZSBJbmMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0xMzksNiArMTM5LDcgQEAKIAl7MHgwMDVjMDBlYywgMHhGRkZGRkZGRiwgKDI1Njw8MjApLCAwLCAyMDQ4LCAoMjA0ODw8NiksIDY0LCAxfSwgLypTYW1zKi8KIAl7MHgwMDU4MDBlYywgMHhGRkZGRkZGRiwgKDI1Njw8MjApLCAwLCAyMDQ4LCAoMjA0ODw8NiksIDY0LCAxfSwgLypTYW1zKi8KIAl7MHg2NjAwYmNlYywgMHhGRjAwRkZGRiwgKDUxMjw8MjApLCAxLCA0MDk2LCAoNDA5Njw8NiksIDEyOCwgMH0sIC8qU2FtcyovCisJezB4NTU4MGJhMmMsIDB4RkZGRkZGRkYsICgyNTY8PDIwKSwgMSwgMjA0OCwgKDIwNDg8PDYpLCA2NCwgMH0sIC8qSHlueCovCiAJLyogTm90ZTogV2lkdGggZmxhZyBpcyAwIGZvciA4IGJpdCBGbGFzaCBhbmQgMSBmb3IgMTYgYml0IGZsYXNoCSAgKi8KIAkvKiBOb3RlOiBPbmVuYW5kIGZsYWcgaXMgMCBmb3IgTkFORCBGbGFzaCBhbmQgMSBmb3IgT25lTkFORCBmbGFzaAkqLwogCS8qIE5vdGU6IFRoZSBGaXJzdCByb3cgd2lsbCBiZSBmaWxsZWQgYXQgcnVudGltZSBkdXJpbmcgT05GSSBwcm9iZQkqLwpkaWZmIC0tZ2l0IGEvcHJvamVjdC9tc203NjI3YS5tayBiL3Byb2plY3QvbXNtNzYyN2EubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwNzQwMQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2plY3QvbXNtNzYyN2EubWsKQEAgLTAsMCArMSwxMSBAQAorIyB0b3AgbGV2ZWwgcHJvamVjdCBydWxlcyBmb3IgdGhlIG1zbTc2Mjdfc3VyZiBwcm9qZWN0CisjCitMT0NBTF9ESVIgOj0gJChHRVRfTE9DQUxfRElSKQorCitUQVJHRVQgOj0gbXNtNzYyN2EKKworTU9EVUxFUyArPSBhcHAvYWJvb3QKKworI0RFRklORVMgKz0gV0lUSF9ERUJVR19EQ0M9MQorI0RFRklORVMgKz0gV0lUSF9ERUJVR19VQVJUPTEKKyNERUZJTkVTICs9IFdJVEhfREVCVUdfRkJDT049MQpkaWZmIC0tZ2l0IGEvcHJvamVjdC9tc203NjI3YV9uYW5kd3JpdGUubWsgYi9wcm9qZWN0L21zbTc2MjdhX25hbmR3cml0ZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdhMDYwCi0tLSAvZGV2L251bGwKKysrIGIvcHJvamVjdC9tc203NjI3YV9uYW5kd3JpdGUubWsKQEAgLTAsMCArMSwxNCBAQAorIyB0b3AgbGV2ZWwgcHJvamVjdCBydWxlcyBmb3IgdGhlIG1zbTc2Mjdfc3VyZl9uYW5kd3JpdGUgcHJvamVjdAorIworTE9DQUxfRElSIDo9ICQoR0VUX0xPQ0FMX0RJUikKKworVEFSR0VUIDo9IG1zbTc2MjdhCisKK01PRFVMRVMgKz0gYXBwL25hbmR3cml0ZQorCitERUZJTkVTICs9IFdJVEhfREVCVUdfSlRBRz0xCitERUZJTkVTICs9IEVOQUJMRV9OQU5EV1JJVEU9MQorI0RFRklORVMgKz0gV0lUSF9ERUJVR19EQ0M9MQorI0RFRklORVMgKz0gV0lUSF9ERUJVR19VQVJUPTEKKyNERUZJTkVTICs9IFdJVEhfREVCVUdfRkJDT049MQorCmRpZmYgLS1naXQgYS90YXJnZXQvbXNtNzYyN2EvYXRhZ3MuYyBiL3RhcmdldC9tc203NjI3YS9hdGFncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzdkMGMKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvbXNtNzYyN2EvYXRhZ3MuYwpAQCAtMCwwICsxLDcyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKgkgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgkgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICoJICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICoJICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCSAqIE5laXRoZXIgdGhlIG5hbWUgb2YgQ29kZSBBdXJvcmEgbm9yCisgKgkgICB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqCSAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICoJICAgcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OLUlORlJJTkdFTUVOVCBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CisgKiBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCisgKiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCisgKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHJlZy5oPgorI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8c21lbS5oPgorCisjZGVmaW5lIFNJWkVfMU0JCQkgICAweDAwMTAwMDAwCisKK3Vuc2lnbmVkKiB0YXJnZXRfYXRhZ19tZW0odW5zaWduZWQqIHB0cikKK3sKKwlzdHJ1Y3Qgc21lbV9yYW1fcHRhYmxlIHJhbV9wdGFibGU7CisJdW5zaWduZWQgaSA9IDA7CisKKwlpZiAoc21lbV9yYW1fcHRhYmxlX2luaXQoJnJhbV9wdGFibGUpKQorCXsKKwkJZm9yIChpID0gMDsgaSA8IHJhbV9wdGFibGUubGVuOyBpKyspCisJCXsKKwkJCWlmICgocmFtX3B0YWJsZS5wYXJ0c1tpXS5hdHRyID09IFJFQURXUklURSkKKwkJCQkmJiAocmFtX3B0YWJsZS5wYXJ0c1tpXS5kb21haW4gPT0gQVBQU19ET01BSU4pCisJCQkJJiYgKHJhbV9wdGFibGUucGFydHNbaV0uc3RhcnQgIT0gMHgwKQorCQkJCSYmICghKHJhbV9wdGFibGUucGFydHNbaV0uc2l6ZSA8IFNJWkVfMU0pKSkKKwkJCXsKKwkJCQkvKiBBVEFHX01FTSAqLworCQkJCSpwdHIrKyA9IDQ7CisJCQkJKnB0cisrID0gMHg1NDQxMDAwMjsKKwkJCQkvKiBGSVhNRTogUkFNIHBhcnRpdGlvbiB0YWJsZSBjdXJyZW50bHkgcmVwb3J0cyAyTSBleHRyYQorCQkJCSAgRml4IHRoaXMgYnkgc3VicmFjdGluZyAyTSwgdW50aWwgbW9kZW0gcmFtIHBhcnRpdGlvbiB0YWJsZQorCQkJCSAgc3RhcnRzIHJlcG9ydGluZyB0aGUgcmlnaHQgdmFsdWVzLiAgQWxzbyBuZWVkIGZpeGVzIGZvcgorCQkJCSAgUkFNIHBhcnRpdGlvbiB0YWJsZSB0byBoYXZlIGVtbWMgZW50cmllcyBjb3JyZWN0ICovCisJCQkJaWYgKHRhcmdldF9pc19lbW1jX2Jvb3QoKSkKKwkJCQkJKnB0cisrID0gcmFtX3B0YWJsZS5wYXJ0c1tpXS5zaXplIC0gKDIqU0laRV8xTSkgLSAoNipTSVpFXzFNKTsKKwkJCQllbHNlCisJCQkJCSpwdHIrKyA9IHJhbV9wdGFibGUucGFydHNbaV0uc2l6ZSAtICgyKlNJWkVfMU0pOworCisJCQkJKnB0cisrID0gcmFtX3B0YWJsZS5wYXJ0c1tpXS5zdGFydDsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJeworCQlkcHJpbnRmKENSSVRJQ0FMLCAiRVJST1I6IFVuYWJsZSB0byByZWFkIFJBTSBwYXJ0aXRpb25cbiIpOworCQlBU1NFUlQoMCk7CisJfQorCXJldHVybiBwdHI7Cit9CisKZGlmZiAtLWdpdCBhL3RhcmdldC9tc203NjI3YS9pbmNsdWRlL3RhcmdldC9kaXNwbGF5LmggYi90YXJnZXQvbXNtNzYyN2EvaW5jbHVkZS90YXJnZXQvZGlzcGxheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjYyOGQKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvbXNtNzYyN2EvaW5jbHVkZS90YXJnZXQvZGlzcGxheS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMC0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCSAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKgkgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgkgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKgkgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKgkgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgkgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIENvZGUgQXVyb3JhIEZvcnVtLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKgkgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqCSAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKyNpZm5kZWYgX1RBUkdFVF9NU003NjI3X1NVUkZfRElTUExBWV9ICisjZGVmaW5lIF9UQVJHRVRfTVNNNzYyN19TVVJGX0RJU1BMQVlfSAorCisjZGVmaW5lIFRBUkdFVF9YUkVTIDgwMAorI2RlZmluZSBUQVJHRVRfWVJFUyA0ODAKKworI2RlZmluZSBMQ0RDX0ZCX1dJRFRICSA4MDAKKyNkZWZpbmUgTENEQ19GQl9IRUlHSFQJNDgwCisKKyNkZWZpbmUgTENEQ19IU1lOQ19QVUxTRV9XSURUSF9EQ0xLIDYwCisjZGVmaW5lIExDRENfSFNZTkNfQkFDS19QT1JDSF9EQ0xLICA4MQorI2RlZmluZSBMQ0RDX0hTWU5DX0ZST05UX1BPUkNIX0RDTEsgODEKKyNkZWZpbmUgTENEQ19IU1lOQ19TS0VXX0RDTEsJCTAKKworI2RlZmluZSBMQ0RDX1ZTWU5DX1BVTFNFX1dJRFRIX0xJTkVTIDIKKyNkZWZpbmUgTENEQ19WU1lOQ19CQUNLX1BPUkNIX0xJTkVTICAyMAorI2RlZmluZSBMQ0RDX1ZTWU5DX0ZST05UX1BPUkNIX0xJTkVTIDI3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L21zbTc2MjdhL2luaXQuYyBiL3RhcmdldC9tc203NjI3YS9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkY2Q1MQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9tc203NjI3YS9pbml0LmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIEdvb2dsZSBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA5LTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqCXRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqCWRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICoJbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisgKglzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorICogQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisgKiBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQKKyAqIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8ZGVidWcuaD4KKyNpbmNsdWRlIDxkZXYva2V5cy5oPgorI2luY2x1ZGUgPGRldi9ncGlvX2tleXBhZC5oPgorI2luY2x1ZGUgPGxpYi9wdGFibGUuaD4KKyNpbmNsdWRlIDxkZXYvZmxhc2guaD4KKyNpbmNsdWRlIDxzbWVtLmg+CisjaW5jbHVkZSA8cGxhdGZvcm0vaW9tYXAuaD4KKworI2RlZmluZSBNU003WDI3QV9GRkEJMzM1MQorI2RlZmluZSBNU003WDI3QV9TVVJGCTMzNTIKKyNkZWZpbmUgTVNNN1gyN0FfUlVNSTMJMzM1MworI2RlZmluZSBMSU5VWF9NQUNIVFlQRSAgTVNNN1gyN0FfUlVNSTMKKworI2RlZmluZSBWQVJJQUJMRV9MRU5HVEgJCTB4MTAxMDEwMTAKKyNkZWZpbmUgRElGRl9TVEFSVF9BRERSCQkweEYwRjBGMEYwCisjZGVmaW5lIE5VTV9QQUdFU19QRVJfQkxPQ0sJMHg0MAorCitzdGF0aWMgc3RydWN0IHB0YWJsZSBmbGFzaF9wdGFibGU7CisKKy8qIGZvciB0aGVzZSBwYXJ0aXRpb25zLCBzdGFydCB3aWxsIGJlIG9mZnNldCBieSBlaXRoZXIgd2hhdCB3ZSBnZXQgZnJvbQorICogc21lbSwgb3IgZnJvbSB0aGUgYWJvdmUgb2Zmc2V0IGlmIHNtZW0gaXMgbm90IHVzZWZ1bC4gQWxzbywgd2Ugc2hvdWxkCisgKiBwcm9iYWJseSBoYXZlIHNtZW1fcHRhYmxlIGNvZGUgcG9wdWxhdGUgb3VyIGZsYXNoX3B0YWJsZS4KKyAqCisgKiBXaGVuIHNtZW0gcHJvdmlkZXMgdXMgd2l0aCBhIGZ1bGwgcGFydGl0aW9uIHRhYmxlLCB3ZSBjYW4gZ2V0IHJpZCBvZgorICogdGhpcyBhbHRvZ2V0aGVyLgorICoKKyAqLworc3RhdGljIHN0cnVjdCBwdGVudHJ5IGJvYXJkX3BhcnRfbGlzdFtdID0geworCXsKKwkJLnN0YXJ0ID0gMCwKKwkJLmxlbmd0aCA9IDEwIC8qIEluIE1CICovLAorCQkubmFtZSA9ICJib290IiwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gRElGRl9TVEFSVF9BRERSLAorCQkubGVuZ3RoID0gMTA1IC8qIEluIE1CICovLAorCQkubmFtZSA9ICJzeXN0ZW0iLAorCX0sCisJeworCQkuc3RhcnQgPSBESUZGX1NUQVJUX0FERFIsCisJCS5sZW5ndGggPSAxIC8qIEluIE1CICovLAorCQkubmFtZSA9ICJjYWNoZSIsCisJfSwKKwl7CisJCS5zdGFydCA9IERJRkZfU1RBUlRfQUREUiwKKwkJLmxlbmd0aCA9IDEgLyogSW4gTUIgKi8sCisJCS5uYW1lID0gIm1pc2MiLAorCX0sCisJeworCQkuc3RhcnQgPSBESUZGX1NUQVJUX0FERFIsCisJCS5sZW5ndGggPSBWQVJJQUJMRV9MRU5HVEgsCisJCS5uYW1lID0gInVzZXJkYXRhIiwKKwl9LAorCXsKKwkJLnN0YXJ0ID0gRElGRl9TVEFSVF9BRERSLAorCQkubGVuZ3RoID0gMiAvKiBJbiBNQiAqLywKKwkJLm5hbWUgPSAicGVyc2lzdCIsCisJfSwKKwl7CisJCS5zdGFydCA9IERJRkZfU1RBUlRfQUREUiwKKwkJLmxlbmd0aCA9IDUgLyogSW4gTUIgKi8sCisJCS5uYW1lID0gInJlY292ZXJ5IiwKKwl9LAorfTsKK3N0YXRpYyBpbnQgbnVtX3BhcnRzID0gc2l6ZW9mKGJvYXJkX3BhcnRfbGlzdCkvc2l6ZW9mKHN0cnVjdCBwdGVudHJ5KTsKKwordm9pZCBzbWVtX3B0YWJsZV9pbml0KHZvaWQpOwordW5zaWduZWQgc21lbV9nZXRfYXBwc19mbGFzaF9zdGFydCh2b2lkKTsKKwordm9pZCBrZXlwYWRfaW5pdCh2b2lkKTsKKworaW50IHRhcmdldF9pc19lbW1jX2Jvb3Qodm9pZCk7CisKK3ZvaWQgdGFyZ2V0X2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBvZmZzZXQ7CisJc3RydWN0IGZsYXNoX2luZm8gKmZsYXNoX2luZm87CisJdW5zaWduZWQgdG90YWxfbnVtX29mX2Jsb2NrczsKKwl1bnNpZ25lZCBuZXh0X3B0cl9zdGFydF9hZHIgPSAwOworCXVuc2lnbmVkIGJsb2Nrc19wZXJfMU1CID0gODsgLyogRGVmYXVsdCB2YWx1ZSBvZiAyayBwYWdlIHNpemUgb24gMjU2TUIgZmxhc2ggZHJpdmUqLworCWludCBpOworCisJZHByaW50ZihJTkZPLCAidGFyZ2V0X2luaXQoKVxuIik7CisKKy8qIFRPRE86IEVuYWJsZSBrZXlwYWQgc3VwcG9ydCAqLworI2lmIDAKKyNpZiAoIUVOQUJMRV9OQU5EV1JJVEUpCisJa2V5c19pbml0KCk7CisJa2V5cGFkX2luaXQoKTsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAodGFyZ2V0X2lzX2VtbWNfYm9vdCgpKQorCXsKKwkJaWYobW1jX2Jvb3RfbWFpbihNTUNfU0xPVCwgTVNNX1NEQzFfQkFTRSkpCisJCXsKKwkJCWRwcmludGYoQ1JJVElDQUwsICJtbWMgaW5pdCBmYWlsZWQhIik7CisJCQlBU1NFUlQoMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCXB0YWJsZV9pbml0KCZmbGFzaF9wdGFibGUpOworCXNtZW1fcHRhYmxlX2luaXQoKTsKKworCWZsYXNoX2luaXQoKTsKKwlmbGFzaF9pbmZvID0gZmxhc2hfZ2V0X2luZm8oKTsKKwlBU1NFUlQoZmxhc2hfaW5mbyk7CisKKwlvZmZzZXQgPSBzbWVtX2dldF9hcHBzX2ZsYXNoX3N0YXJ0KCk7CisJaWYgKG9mZnNldCA9PSAweGZmZmZmZmZmKQorCQkJd2hpbGUoMSk7CisKKwl0b3RhbF9udW1fb2ZfYmxvY2tzID0gZmxhc2hfaW5mby0+bnVtX2Jsb2NrczsKKwlibG9ja3NfcGVyXzFNQiA9ICgxIDw8IDIwKSAvIChmbGFzaF9pbmZvLT5ibG9ja19zaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGFydHM7IGkrKykgeworCQlzdHJ1Y3QgcHRlbnRyeSAqcHRuID0gJmJvYXJkX3BhcnRfbGlzdFtpXTsKKwkJdW5zaWduZWQgbGVuID0gKChwdG4tPmxlbmd0aCkgKiBibG9ja3NfcGVyXzFNQik7CisKKwkJaWYocHRuLT5zdGFydCAhPSAwKQorCQkJCUFTU0VSVChwdG4tPnN0YXJ0ID09IERJRkZfU1RBUlRfQUREUik7CisKKwkJcHRuLT5zdGFydCA9IG5leHRfcHRyX3N0YXJ0X2FkcjsKKworCQlpZihwdG4tPmxlbmd0aCA9PSBWQVJJQUJMRV9MRU5HVEgpCisJCXsKKwkJCXVuc2lnbmVkIGxlbmd0aF9mb3JfcHJ0ID0gMDsKKwkJCXVuc2lnbmVkIGo7CisJCQlmb3IgKGogPSBpKzE7IGogPCBudW1fcGFydHM7IGorKykKKwkJCXsKKwkJCQkJc3RydWN0IHB0ZW50cnkgKnRlbXBfcHRuID0gJmJvYXJkX3BhcnRfbGlzdFtqXTsKKwkJCQkJQVNTRVJUKHRlbXBfcHRuLT5sZW5ndGggIT0gVkFSSUFCTEVfTEVOR1RIKTsKKwkJCQkJbGVuZ3RoX2Zvcl9wcnQgKz0gKCh0ZW1wX3B0bi0+bGVuZ3RoKSAqIGJsb2Nrc19wZXJfMU1CKTsKKwkJCX0KKwkJCQlsZW4gPSAodG90YWxfbnVtX29mX2Jsb2NrcyAtIDEpIC0gKG9mZnNldCArIHB0bi0+c3RhcnQgKyBsZW5ndGhfZm9yX3BydCk7CisJCQlBU1NFUlQobGVuID49IDApOworCQl9CisJCW5leHRfcHRyX3N0YXJ0X2FkciA9IHB0bi0+c3RhcnQgKyBsZW47CisJCXB0YWJsZV9hZGQoJmZsYXNoX3B0YWJsZSwgcHRuLT5uYW1lLCBvZmZzZXQgKyBwdG4tPnN0YXJ0LAorCQkJICAgbGVuLCBwdG4tPmZsYWdzLCBUWVBFX0FQUFNfUEFSVElUSU9OLCBQRVJNX1dSSVRFQUJMRSk7CisJfQorCisJc21lbV9hZGRfbW9kZW1fcGFydGl0aW9ucygmZmxhc2hfcHRhYmxlKTsKKworCXB0YWJsZV9kdW1wKCZmbGFzaF9wdGFibGUpOworCWZsYXNoX3NldF9wdGFibGUoJmZsYXNoX3B0YWJsZSk7Cit9CisKK3Vuc2lnbmVkIGJvYXJkX21hY2h0eXBlKHZvaWQpCit7CisJcmV0dXJuIExJTlVYX01BQ0hUWVBFOworfQorCit2b2lkIHJlYm9vdF9kZXZpY2UodW5zaWduZWQgcmVib290X3JlYXNvbikKK3sKKwlyZWJvb3QocmVib290X3JlYXNvbik7Cit9CisKK3Vuc2lnbmVkIGNoZWNrX3JlYm9vdF9tb2RlKHZvaWQpCit7CisJdW5zaWduZWQgbW9kZVsyXSA9IHswLCAwfTsKKwl1bnNpZ25lZCBpbnQgbW9kZV9sZW4gPSBzaXplb2YobW9kZSk7CisJdW5zaWduZWQgc21lbV9zdGF0dXM7CisKKwlzbWVtX3N0YXR1cyA9IHNtZW1fcmVhZF9hbGxvY19lbnRyeShTTUVNX0FQUFNfQk9PVF9NT0RFLAorCQkJCQkmbW9kZSwgbW9kZV9sZW4gKTsKKwlpZihzbWVtX3N0YXR1cykKKwl7CisJICBkcHJpbnRmKENSSVRJQ0FMLCAiRVJST1I6IHVuYWJsZSB0byByZWFkIHNoYXJlZCBtZW1vcnkgZm9yIHJlYm9vdCBtb2RlXG4iKTsKKwkgIHJldHVybiAwOworCX0KKwlyZXR1cm4gbW9kZVswXTsKK30KKworc3RhdGljIHVuc2lnbmVkIHRhcmdldF9jaGVja19wb3dlcl9vbl9yZWFzb24odm9pZCkKK3sKKwl1bnNpZ25lZCBwb3dlcl9vbl9zdGF0dXMgPSAwOworCXVuc2lnbmVkIGludCBzdGF0dXNfbGVuID0gc2l6ZW9mKHBvd2VyX29uX3N0YXR1cyk7CisJdW5zaWduZWQgc21lbV9zdGF0dXM7CisKKwlzbWVtX3N0YXR1cyA9IHNtZW1fcmVhZF9hbGxvY19lbnRyeShTTUVNX1BPV0VSX09OX1NUQVRVU19JTkZPLAorCQkJCQkJCQkJCSZwb3dlcl9vbl9zdGF0dXMsIHN0YXR1c19sZW4pOworCWlmICghc21lbV9zdGF0dXMpCisJeworCQlkcHJpbnRmKENSSVRJQ0FMLCAiRVJST1I6IHVuYWJsZSB0byByZWFkIHNoYXJlZCBtZW1vcnkgZm9yIHBvd2VyIG9uIHJlYXNvblxuIik7CisJfQorCisJcmV0dXJuIHBvd2VyX29uX3N0YXR1czsKK30KKwordW5zaWduZWQgdGFyZ2V0X3BhdXNlX2Zvcl9iYXR0ZXJ5X2NoYXJnZSh2b2lkKQoreworCWlmICh0YXJnZXRfY2hlY2tfcG93ZXJfb25fcmVhc29uKCkgPT0gUFdSX09OX0VWRU5UX1VTQl9DSEcpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCit2b2lkIHRhcmdldF9iYXR0ZXJ5X2NoYXJnaW5nX2VuYWJsZSh1bnNpZ25lZCBlbmFibGUsIHVuc2lnbmVkIGRpc2Nvbm5lY3QpCit7Cit9CmRpZmYgLS1naXQgYS90YXJnZXQvbXNtNzYyN2Eva2V5cGFkLmMgYi90YXJnZXQvbXNtNzYyN2Eva2V5cGFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxYzAxNQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9tc203NjI3YS9rZXlwYWQuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSwgR29vZ2xlIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICoJbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCW5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICoJdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICoJZGlzdHJpYnV0aW9uLgorICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKgltYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKKyAqCXNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUworICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKKyAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsCisgKiBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MKKyAqIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRAorICogQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxkZXYva2V5cy5oPgorI2luY2x1ZGUgPGRldi9ncGlvX2tleXBhZC5oPgorCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKKworLyogZG9uJ3QgdHVybiB0aGlzIG9uIHdpdGhvdXQgdXBkYXRpbmcgdGhlIGZmYSBzdXBwb3J0ICovCisjZGVmaW5lIFNDQU5fRlVOQ1RJT05fS0VZUyAwCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFsaWJ1dF9yb3dfZ3Bpb3NbXSA9IHsKKwkzMSwgMzIsIDMzLCAzNCwgMzUsIDQxCisjaWYgU0NBTl9GVU5DVElPTl9LRVlTCisJLCA0MgorI2VuZGlmCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGhhbGlidXRfY29sX2dwaW9zW10gPSB7IDM2LCAzNywgMzgsIDM5LCA0MCB9OworCisjZGVmaW5lIEtFWU1BUF9JTkRFWChyb3csIGNvbCkgKChyb3cpKkFSUkFZX1NJWkUoaGFsaWJ1dF9jb2xfZ3Bpb3MpICsgKGNvbCkpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBoYWxpYnV0X2tleW1hcFtBUlJBWV9TSVpFKGhhbGlidXRfY29sX2dwaW9zKSAqIEFSUkFZX1NJWkUoaGFsaWJ1dF9yb3dfZ3Bpb3MpXSA9IHsKKwlbS0VZTUFQX0lOREVYKDAsIDApXSA9IEtFWV81LAorCVtLRVlNQVBfSU5ERVgoMCwgMSldID0gS0VZXzksCisJW0tFWU1BUF9JTkRFWCgwLCAyKV0gPSBLRVlfU09GVDEsCisJW0tFWU1BUF9JTkRFWCgwLCAzKV0gPSBLRVlfNiwKKwlbS0VZTUFQX0lOREVYKDAsIDQpXSA9IEtFWV9MRUZULAorCisJW0tFWU1BUF9JTkRFWCgxLCAwKV0gPSBLRVlfMCwKKwlbS0VZTUFQX0lOREVYKDEsIDEpXSA9IEtFWV9SSUdIVCwKKwlbS0VZTUFQX0lOREVYKDEsIDIpXSA9IEtFWV8xLAorCVtLRVlNQVBfSU5ERVgoMSwgMyldID0gS0VZX1NIQVJQLAorCVtLRVlNQVBfSU5ERVgoMSwgNCldID0gS0VZX1NFTkQsCisKKwlbS0VZTUFQX0lOREVYKDIsIDApXSA9IEtFWV9WT0xVTUVVUCwKKwlbS0VZTUFQX0lOREVYKDIsIDEpXSA9IEtFWV9IT01FLAkgIC8qIEZBICAgKi8KKwlbS0VZTUFQX0lOREVYKDIsIDIpXSA9IEtFWV9GOCwJCS8qIFFDSFQgKi8KKwlbS0VZTUFQX0lOREVYKDIsIDMpXSA9IEtFWV9GNiwJCS8qIFIrICAgKi8KKwlbS0VZTUFQX0lOREVYKDIsIDQpXSA9IEtFWV9GNywJCS8qIFItICAgKi8KKworCVtLRVlNQVBfSU5ERVgoMywgMCldID0gS0VZX1VQLAorCVtLRVlNQVBfSU5ERVgoMywgMSldID0gS0VZX0NMRUFSLAorCVtLRVlNQVBfSU5ERVgoMywgMildID0gS0VZXzQsCisJW0tFWU1BUF9JTkRFWCgzLCAzKV0gPSBLRVlfTVVURSwJICAvKiBTUEtSICovCisJW0tFWU1BUF9JTkRFWCgzLCA0KV0gPSBLRVlfMiwKKworCVtLRVlNQVBfSU5ERVgoNCwgMCldID0gS0VZX1NPRlQyLAkJICAgLyogU09GVDIgKi8KKwlbS0VZTUFQX0lOREVYKDQsIDEpXSA9IEtFWV9DRU5URVIsCS8qIEtFWV9DRU5URVIgKi8KKwlbS0VZTUFQX0lOREVYKDQsIDIpXSA9IEtFWV9ET1dOLAorCVtLRVlNQVBfSU5ERVgoNCwgMyldID0gS0VZX0JBQ0ssCSAgLyogRkIgKi8KKwlbS0VZTUFQX0lOREVYKDQsIDQpXSA9IEtFWV84LAorCisJW0tFWU1BUF9JTkRFWCg1LCAwKV0gPSBLRVlfVk9MVU1FRE9XTiwKKwlbS0VZTUFQX0lOREVYKDUsIDEpXSA9IEtFWV9TVEFSLAkgIC8qIEtFWV9TVEFSICovCisJW0tFWU1BUF9JTkRFWCg1LCAyKV0gPSBLRVlfTUFJTCwJICAvKiBNRVNHICovCisJW0tFWU1BUF9JTkRFWCg1LCAzKV0gPSBLRVlfMywKKwlbS0VZTUFQX0lOREVYKDUsIDQpXSA9IEtFWV83LAorCisjaWYgU0NBTl9GVU5DVElPTl9LRVlTCisJW0tFWU1BUF9JTkRFWCg2LCAwKV0gPSBLRVlfRjUsCisJW0tFWU1BUF9JTkRFWCg2LCAxKV0gPSBLRVlfRjQsCisJW0tFWU1BUF9JTkRFWCg2LCAyKV0gPSBLRVlfRjMsCisJW0tFWU1BUF9JTkRFWCg2LCAzKV0gPSBLRVlfRjIsCisJW0tFWU1BUF9JTkRFWCg2LCA0KV0gPSBLRVlfRjEKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBncGlvX2tleXBhZF9pbmZvIGhhbGlidXRfa2V5cGFkX2luZm8gPSB7CisJLmtleW1hcAkJPSBoYWxpYnV0X2tleW1hcCwKKwkub3V0cHV0X2dwaW9zCT0gaGFsaWJ1dF9yb3dfZ3Bpb3MsCisJLmlucHV0X2dwaW9zCT0gaGFsaWJ1dF9jb2xfZ3Bpb3MsCisJLm5vdXRwdXRzCT0gQVJSQVlfU0laRShoYWxpYnV0X3Jvd19ncGlvcyksCisJLm5pbnB1dHMJPSBBUlJBWV9TSVpFKGhhbGlidXRfY29sX2dwaW9zKSwKKwkuc2V0dGxlX3RpbWUJPSA1IC8qIG1zZWMgKi8sCisJLnBvbGxfdGltZQk9IDIwIC8qIG1zZWMgKi8sCisJLmZsYWdzCQk9IEdQSU9LUEZfRFJJVkVfSU5BQ1RJVkUsCit9OworCit2b2lkIGtleXBhZF9pbml0KHZvaWQpCit7CisJZ3Bpb19rZXlwYWRfaW5pdCgmaGFsaWJ1dF9rZXlwYWRfaW5mbyk7Cit9CmRpZmYgLS1naXQgYS90YXJnZXQvbXNtNzYyN2EvcnVsZXMubWsgYi90YXJnZXQvbXNtNzYyN2EvcnVsZXMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlMGM0NgotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9tc203NjI3YS9ydWxlcy5tawpAQCAtMCwwICsxLDQwIEBACitMT0NBTF9ESVIgOj0gJChHRVRfTE9DQUxfRElSKQorCitJTkNMVURFUyArPSAtSSQoTE9DQUxfRElSKS9pbmNsdWRlIC1JJChMS19UT1BfRElSKS9wbGF0Zm9ybS9tc21fc2hhcmVkCisKK1BMQVRGT1JNIDo9IG1zbTd4MjdhCisKK01FTUJBU0UgOj0gMHgwMDAwMDAwMCAjIFNNSQorTUVNU0laRSA6PSAweDAwMTAwMDAwICMgMU1CCisKK0JBU0VfQUREUiAgICAgICAgOj0gMHgwMDIwMDAwMAorCitUQUdTX0FERFIgICAgICAgIDo9IEJBU0VfQUREUisweDAwMDAwMTAwCitLRVJORUxfQUREUiAgICAgIDo9IEJBU0VfQUREUisweDAwMDA4MDAwCitSQU1ESVNLX0FERFIgICAgIDo9IEJBU0VfQUREUisweDAxMDAwMDAwCitTQ1JBVENIX0FERFIgICAgIDo9IEJBU0VfQUREUisweDA0MDAwMDAwCisKK0tFWVNfVVNFX0dQSU9fS0VZUEFEIDo9IDEKKworREVGSU5FUyArPSBESVNQTEFZX1RZUEVfTUREST0wCitERUZJTkVTICs9IERJU1BMQVlfVFlQRV9MQ0RDPTAKK0RFRklORVMgKz0gRElTUExBWV9TUExBU0hfU0NSRUVOPTAKKworTU9EVUxFUyArPSBcCisJZGV2L2tleXMgXAorCWxpYi9wdGFibGUKKworREVGSU5FUyArPSBcCisJU0RSQU1fU0laRT0kKE1FTVNJWkUpIFwKKwlNRU1CQVNFPSQoTUVNQkFTRSkgXAorCUJBU0VfQUREUj0kKEJBU0VfQUREUikgXAorCVRBR1NfQUREUj0kKFRBR1NfQUREUikgXAorCUtFUk5FTF9BRERSPSQoS0VSTkVMX0FERFIpIFwKKwlSQU1ESVNLX0FERFI9JChSQU1ESVNLX0FERFIpIFwKKwlTQ1JBVENIX0FERFI9JChTQ1JBVENIX0FERFIpCisKKworT0JKUyArPSBcCisJJChMT0NBTF9ESVIpL2luaXQubyBcCisJJChMT0NBTF9ESVIpL2tleXBhZC5vIFwKKwkkKExPQ0FMX0RJUikvYXRhZ3MubwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L21zbTc2MjdhL3Rvb2xzL21ha2VmaWxlIGIvdGFyZ2V0L21zbTc2MjdhL3Rvb2xzL21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmMxMzQKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvbXNtNzYyN2EvdG9vbHMvbWFrZWZpbGUKQEAgLTAsMCArMSwzOCBAQAorI01ha2VmaWxlIHRvIGdlbmVyYXRlIGFwcHNib290Lm1ibgorCitpZmVxICgkKEJPT1RMT0FERVJfT1VUKSwuKQorQVBQU0JPT1RIRUFERVJfRElSICA6PSAkKEJVSUxERElSKQorZWxzZQorQVBQU0JPT1RIRUFERVJfRElSICA6PSAkKEJPT1RMT0FERVJfT1VUKS8uLi8uLi8KK2VuZGlmCisKK1NSQ19ESVIgIDo9IHRhcmdldC8kKFRBUkdFVCkvdG9vbHMKK0NPTVBJTEVSIDo9IGdjYworCitpZmVxICgkKEVNTUNfQk9PVCksIDEpCisgIEFQUFNCT09USERSX0ZJTEVTIDo9IEVNTUNCT09ULk1CTiBlbW1jX2FwcHNib290aGQubWJuCitlbHNlCisgIGlmZXEgKCQoQlVJTERfTkFORFdSSVRFKSwgMSkKKyAgICBBUFBTQk9PVEhEUl9GSUxFUyA6PQorICBlbHNlCisgICAgQVBQU0JPT1RIRFJfRklMRVMgOj0gYXBwc2Jvb3QubWJuIGFwcHNib290aGQubWJuCisgIGVuZGlmCitlbmRpZgorCitBUFBTQk9PVEhFQURFUjogJChBUFBTQk9PVEhEUl9GSUxFUykKKworYXBwc2Jvb3QubWJuOiAkKE9VVEJJTikKKwljcCAtZiAkKE9VVEJJTikgJChBUFBTQk9PVEhFQURFUl9ESVIpL2FwcHNib290Lm1ibgorCithcHBzYm9vdGhkLm1ibjogbWtoZWFkZXIgJChPVVRCSU4pCisJJChTUkNfRElSKS9ta2hlYWRlciAkKE9VVEJJTikgJChBUFBTQk9PVEhFQURFUl9ESVIpL2FwcHNib290aGQubWJuCisKK0VNTUNCT09ULk1CTjogJChPVVRCSU4pCisJY3AgLWYgJChPVVRCSU4pICQoQVBQU0JPT1RIRUFERVJfRElSKS9FTU1DQk9PVC5NQk4KKwljcCAtZiAkKE9VVEJJTikgJChBUFBTQk9PVEhFQURFUl9ESVIpL2VtbWNfYXBwc2Jvb3QubWJuCisKK2VtbWNfYXBwc2Jvb3RoZC5tYm46IG1raGVhZGVyICQoT1VUQklOKQorCSQoU1JDX0RJUikvbWtoZWFkZXIgJChPVVRCSU4pICQoQVBQU0JPT1RIRUFERVJfRElSKS9lbW1jX2FwcHNib290aGQubWJuIHVuaWZpZWQtYm9vdAorCitta2hlYWRlcjogJChTUkNfRElSKS9ta2hlYWRlci5jCisJJHtDT01QSUxFUn0gJChTUkNfRElSKS9ta2hlYWRlci5jIC1vICQoU1JDX0RJUikvbWtoZWFkZXIKZGlmZiAtLWdpdCBhL3RhcmdldC9tc203NjI3YS90b29scy9ta2hlYWRlci5jIGIvdGFyZ2V0L21zbTc2MjdhL3Rvb2xzL21raGVhZGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkMzQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9tc203NjI3YS90b29scy9ta2hlYWRlci5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIENvcHlyaWdodCAyMDA3LCBHb29nbGUgSW5jLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXVuc2lnbmVkIHNpemUsIGJhc2U7CisJaW50IHVuaWZpZWRfYm9vdCA9IDA7CisJdW5zaWduZWQgdW5pZmllZF9ib290X21hZ2ljWzIwXTsKKwl1bnNpZ25lZCBub25fdW5pZmllZF9ib290X21hZ2ljWzEwXTsKKwl1bnNpZ25lZCBtYWdpY19sZW4gPSAwOworCXVuc2lnbmVkICptYWdpYzsKKwlpbnQgZmQ7CisKKwlpZihhcmdjIDwgMykgeworCQlmcHJpbnRmKHN0ZGVyciwidXNhZ2U6IG1raGVhZGVyIDxiaW4+IDxoZHI+XG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhcmdjID09IDQpIHsKKwkJaWYoIXN0cmNtcCgidW5pZmllZC1ib290Iixhcmd2WzNdKSkgeworCQkJdW5pZmllZF9ib290ID0gMTsKKwkJfQorCX0KKworCWlmKHN0YXQoYXJndlsxXSwgJnMpKSB7CisJCXBlcnJvcigiY2Fubm90IHN0YXQgYmluYXJ5Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZih1bmlmaWVkX2Jvb3QpIHsKKwkJbWFnaWMgPSB1bmlmaWVkX2Jvb3RfbWFnaWM7CisJCW1hZ2ljX2xlbiA9IHNpemVvZih1bmlmaWVkX2Jvb3RfbWFnaWMpOworCX0gZWxzZSB7CisJCW1hZ2ljID0gbm9uX3VuaWZpZWRfYm9vdF9tYWdpYzsKKwkJbWFnaWNfbGVuID0gc2l6ZW9mKG5vbl91bmlmaWVkX2Jvb3RfbWFnaWMpOworCX0KKworCXNpemUgPSBzLnN0X3NpemU7CisJYmFzZSA9IDA7CisKKwltYWdpY1swXSA9IDB4MDAwMDAwMDU7IC8qIGFwcHNibCAqLworCW1hZ2ljWzFdID0gMHgwMDAwMDAwMjsgLyogbmFuZCAqLworCW1hZ2ljWzJdID0gMHgwMDAwMDAwMDsKKwltYWdpY1szXSA9IGJhc2U7CisJbWFnaWNbNF0gPSBzaXplOworCW1hZ2ljWzVdID0gc2l6ZTsKKwltYWdpY1s2XSA9IHNpemUgKyBiYXNlOworCW1hZ2ljWzddID0gMHgwMDAwMDAwMDsKKwltYWdpY1s4XSA9IHNpemUgKyBiYXNlOworCW1hZ2ljWzldID0gMHgwMDAwMDAwMDsKKworCWlmICh1bmlmaWVkX2Jvb3QgPT0gMSkKKwl7CisJCW1hZ2ljWzEwXSA9IDB4MzM4MzY2ODU7IC8qIGNvb2tpZSBtYWdpYyBudW1iZXIgKi8KKwkJbWFnaWNbMTFdID0gMHgwMDAwMDAwMTsgLyogY29va2llIHZlcnNpb24gKi8KKwkJbWFnaWNbMTJdID0gMHgwMDAwMDAwMjsgLyogZmlsZSBmb3JtYXRzICovCisJCW1hZ2ljWzEzXSA9IDB4MDAwMDAwMDA7CisJCW1hZ2ljWzE0XSA9IDB4MDAwMDAwMDA7IC8qIG5vdCBzZXR0aW5nIHNpemUgZm9yIGJvb3QuaW1nICovCisJCW1hZ2ljWzE1XSA9IDB4MDAwMDAwMDA7CisJCW1hZ2ljWzE2XSA9IDB4MDAwMDAwMDA7CisJCW1hZ2ljWzE3XSA9IDB4MDAwMDAwMDA7CisJCW1hZ2ljWzE4XSA9IDB4MDAwMDAwMDA7CisJCW1hZ2ljWzE5XSA9IDB4MDAwMDAwMDA7CisJfQorCisJZmQgPSBvcGVuKGFyZ3ZbMl0sIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2NDQpOworCWlmKGZkIDwgMCkgeworCQlwZXJyb3IoImNhbm5vdCBvcGVuIGhlYWRlciBmb3Igd3JpdGluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmKHdyaXRlKGZkLCBtYWdpYywgbWFnaWNfbGVuKSAhPSBtYWdpY19sZW4pIHsKKwkJcGVycm9yKCJjYW5ub3Qgd3JpdGUgaGVhZGVyIik7CisJCWNsb3NlKGZkKTsKKwkJdW5saW5rKGFyZ3ZbMl0pOworCQlyZXR1cm4gLTE7CisJfQorCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQo=